graph/DESCRIPTION0000644000175400017540000000210113175724651014414 0ustar00biocbuildbiocbuildPackage: graph Title: graph: A package to handle graph data structures Version: 1.56.0 Author: R. Gentleman, Elizabeth Whalen, W. Huber, S. Falcon Description: A package that implements some simple graph handling capabilities. Maintainer: Bioconductor Package Maintainer License: Artistic-2.0 Depends: R (>= 2.10), methods, BiocGenerics (>= 0.13.11) Imports: stats, stats4, utils Suggests: SparseM (>= 0.36), XML, RBGL, RUnit, cluster Enhances: Rgraphviz Collate: AllClasses.R AllGenerics.R bitarray.R buildDepGraph.R methods-graph.R graphNEL.R clustergraph.R NELhandler.R edgefunctions.R graphfunctions.R GXLformals.R gxlReader.R random.R write.tlp.R mat2graph.R settings.R zzz.R standardLabeling.R TODOT.R toDotWithRI.R methods-graphAM.R attrData.R reverseEdgeDirections.R nodes-methods.R methods-multiGraph.R test_graph_package.R MultiGraph.R methods-graphBAM.R graph-constructors.R LazyLoad: yes Packaged: 2017-10-30 22:37:29 UTC; biocbuild biocViews: GraphAndNetwork NeedsCompilation: yes graph/NAMESPACE0000644000175400017540000000561113175713336014134 0ustar00biocbuildbiocbuilduseDynLib(BioC_graph, graph_attrData_lookup, graph_bitarray_Intersect_Attrs, graph_bitarray_Union_Attrs, graph_bitarray_edgeSetToMatrix, graph_bitarray_getBitCell, graph_bitarray_getEdgeAttrOrder, graph_bitarray_removeEdges, graph_bitarray_rowColPos, graph_bitarray_set, graph_bitarray_subGraph, graph_bitarray_sum, graph_bitarray_transpose, graph_bitarray_undirect, graph_intersection, graph_is_adjacent, graph_listLen, graph_sublist_assign) importClassesFrom(methods, ANY, character, list, logical, matrix, missing, "NULL", numeric, oldClass, vector) importMethodsFrom(methods, coerce, initialize, show) importClassesFrom(BiocGenerics, connection, dist) importFrom(BiocGenerics, union) importFrom(methods, as, callGeneric, is, isVirtualClass, new, slot, "slot<-", slotNames, validObject) importFrom(stats, as.dist, dhyper, phyper, runif) importFrom(stats4, plot) importFrom(utils, CRAN.packages, modifyList) exportClasses(distGraph, clusterGraph, graph, graphNEL, graphAM, attrData, simpleEdge, edgeSet, edgeSetNEL, edgeSetAM, multiGraph, renderInfo, MultiGraph, graphBAM, graphBase) exportMethods(DFS, Dist, acc, addEdge, addNode, adj, adjacencyMatrix, clearNode, clusteringCoefficient, combineNodes, complement, connComp, degree, dumpGXL, edgeL, edgeMatrix, edgeNames, edgeWeights, edgemode, "edgemode<-", edges, "nodes<-", fromGXL, inEdges, initialize, intersection, intersection2, isAdjacent, isConnected, isDirected, join, nodes, numNodes, numEdges, plot, removeEdge, removeNode, show, subGraph, threshold, toGXL, union, validateGXL, coerce, toDotR, attrDefaults, "attrDefaults<-", edgeDataDefaults, "edgeDataDefaults<-", mgEdgeDataDefaults, "mgEdgeDataDefaults<-", nodeDataDefaults, "nodeDataDefaults<-", edgeData, "edgeData<-", nodeData, "nodeData<-", attrDataItem, "attrDataItem<-", "removeAttrDataItem<-", ugraph, leaves, updateGraph, extractFromTo, graphIntersect, graphUnion, removeEdgesByWeight, edgeSets) export(graphNEL, graphAM, boundary, buildRepDepGraph, calcProb, calcSumProb, duplicatedEdges, graph2SparseM, listEdges, randomEGraph, randomGraph, randomNodeGraph, validGraph, eWV, pathWeights, .dropEdges, aveNumEdges, sparseM2Graph, gxlTreeNEL, ftM2adjM, ftM2graphNEL, .ftM2other, int2ftM, ftM2int, aM2bpG, mostEdges, numNoEdges, reverseEdgeDirections, ugraphOld) export(graph.par, graph.par.get, graphRenderInfo, nodeRenderInfo, edgeRenderInfo, parRenderInfo, "nodeRenderInfo<-", "edgeRenderInfo<-", "parRenderInfo<-", "graphRenderInfo<-", toDotWithRI) export(graphBAM) export(MultiGraph, eweights, edgeSetIntersect0, edgeSetUnion0, extractFromTo, subsetEdgeSets, extractGraphAM, extractGraphBAM, mgEdgeData, "mgEdgeData<-") S3method(write,tlp) graph/R/0000755000175400017540000000000013175713336013113 5ustar00biocbuildbiocbuildgraph/R/AllClasses.R0000644000175400017540000000720013175713336015263 0ustar00biocbuildbiocbuild## Classes for representing graphs setClass("attrData", representation(data="list", defaults="list")) ## (FH Oct 4.) The edgemode slot is deprecated, the information will ## go into the egemode item of the graphData list. setClass("graphBase") ## class to hold information regarding rendering of a graph. Doesn't ## make sense except as a slot in a graph (the names have to match) setClass("renderInfo", representation(nodes="list", # information on nodes edges="list", # information on edges graph="list", pars="list")) # list passed on to graph.par before rendering setClass("graph", representation(## edgemode="character", edgeData="attrData", nodeData="attrData", renderInfo="renderInfo", ## nodeInfo="list", ## edgeInfo="list", graphData="list", "VIRTUAL"), contains = "graphBase") ## Node Edge List representation setClass("graphNEL", contains="graph", representation(nodes="vector", edgeL="list"), validity=function(object) validGraph(object)) ## Adjacency Matrix representation setClass("graphAM", contains="graph", representation(adjMat="matrix"), validity=function(object) validGraph(object)) setClass("distGraph", representation(Dist="dist"), prototype=list(graphData=list(edgemode="undirected")), contains="graph") setClass("clusterGraph", representation(clusters="list"), contains="graph", prototype=list(graphData=list(edgemode="undirected"))) ## Misc classes setClass("simpleEdge", representation(edgeType="character", weight="numeric", directed="logical", bNode="character", ##begin - if directed eNode="character"), ##end - if directed prototype=list(edgeType="unknown", directed=FALSE, bNode="", eNode="", weight=1)) ##multigraphs - not clear if we should extend graph here, or have a ##whole new set of classes ##looks like redefining edgeSets is going to help us out here. setClass("edgeSet", contains="VIRTUAL", representation=representation( edgeData="attrData")) setClass("edgeSetNEL", contains="edgeSet", representation(edgemode="character", edgeL="list")) setClass("edgeSetAM", contains="edgeSet", representation(edgemode="character", adjMat="matrix")) setClass("multiGraph", representation(nodes="vector", edgeL="list", nodeData="attrData", graphData="list")) setClass("MGEdgeSet", representation = representation( bit_vector = "raw", weights = "numeric", edge_attrs = "list")) setClass("DiEdgeSet", contains = "MGEdgeSet") setClass("UEdgeSet", contains = "MGEdgeSet") setClass("attrPos", representation = representation( nodePos = "list", edgePos = "list")) setClass("MultiGraph", representation = representation( nodes = "character", nodeData = "attrData", ## items will be MGEdgeSet objects edge_sets = "list", edge_defaults = "list", userAttrPos = "attrPos"), contains = "graphBase") setClass("graphBAM", contains = "graph", representation(edgeSet = "MGEdgeSet", nodes = "character", userAttrPos = "attrPos")) graph/R/AllGenerics.R0000644000175400017540000001751013175713336015432 0ustar00biocbuildbiocbuild## Generic methods that all graph representation classes must support setGeneric("isDirected", function(object) standardGeneric("isDirected")) ## --------------------------------------------------------------------- ## Node and edge access ## --------------------------------------------------------------------- ## setGeneric("getNodes", function(x, which) standardGeneric("getNodes")) setGeneric("edgemode", function(object) standardGeneric("edgemode")) setGeneric("edgemode<-", function(object, value) standardGeneric("edgemode<-")) setGeneric("nodes", function(object, ...) standardGeneric("nodes")) setGeneric("nodes<-", function(object, value) standardGeneric("nodes<-")) ## internal use only so that nodes<- can be a template method setGeneric("renameNodes", function(g, value) standardGeneric("renameNodes")) setGeneric("edges", function(object, which, ...) standardGeneric("edges")) ## The funny arg=1, is to allow default values in the methods. ## We don't want to dispatch on those args, but we want them ## named as part of the interface, hence the trick of putting them ## after the (...). Note that this means partial matching for those ## args will not work, must specify full name. setGeneric("edgeWeights", function(object, index, ..., attr="weight", default=1, type.checker=is.numeric) standardGeneric("edgeWeights")) ## --------------------------------------------------------------------- ## --------------------------------------------------------------------- ## Node and edge operations ## --------------------------------------------------------------------- setGeneric("degree", function(object, Nodes) standardGeneric("degree")) setGeneric("adj", function(object, index) standardGeneric("adj")) setGeneric("acc", function(object, index) standardGeneric("acc")) setGeneric("numNodes", function(object) standardGeneric("numNodes")) setGeneric("numEdges", function(object) standardGeneric("numEdges")) ## default function numNoEdges(objGraph) already exists ##setGeneric("numNoEdges", function(object) standardGeneric("numNoEdges")) setGeneric("addNode", function(node, object, edges) standardGeneric("addNode")) setGeneric("removeNode", function(node, object) standardGeneric("removeNode")) setGeneric("clearNode", function(node, object) standardGeneric("clearNode")) setGeneric("combineNodes", function(nodes, graph, newName, ...) standardGeneric("combineNodes")) setGeneric("addEdge", function(from, to, graph, weights) standardGeneric("addEdge")) setGeneric("removeEdge", function(from, to, graph) standardGeneric("removeEdge")) setGeneric("removeEdges", function(container, from, to, ...) standardGeneric("removeEdges")) setGeneric("removeEdgesByWeight", function(graph, ...) standardGeneric("removeEdgesByWeight")) ## --------------------------------------------------------------------- ## --------------------------------------------------------------------- ## attrData generics ## --------------------------------------------------------------------- setGeneric("attrDefaults", function(self, attr) standardGeneric("attrDefaults")) setGeneric("attrDefaults<-", function(self, attr, value) standardGeneric("attrDefaults<-")) setGeneric("attrDataItem", function(self, x, attr) standardGeneric("attrDataItem")) setGeneric("attrDataItem<-", function(self, x, attr, value) standardGeneric("attrDataItem<-")) setGeneric("removeAttrDataItem<-", function(self, x, value) standardGeneric("removeAttrDataItem<-")) ## --------------------------------------------------------------------- ## graph, node, edge attribute generics ## --------------------------------------------------------------------- setGeneric("graphData", function(self, attr) standardGeneric("graphData")) setGeneric("graphData<-", function(self, attr, value) standardGeneric("graphData<-")) setGeneric("edgeDataDefaults", function(self, attr) standardGeneric("edgeDataDefaults")) setGeneric("edgeDataDefaults<-", function(self, attr, value) standardGeneric("edgeDataDefaults<-")) setGeneric("nodeDataDefaults", function(self, attr) standardGeneric("nodeDataDefaults")) setGeneric("nodeDataDefaults<-", function(self, attr, value) standardGeneric("nodeDataDefaults<-")) setGeneric("nodeData", function(self, n, attr) standardGeneric("nodeData")) setGeneric("nodeData<-", function(self, n, attr, value) standardGeneric("nodeData<-")) setGeneric("edgeData", function(self, from, to, attr) standardGeneric("edgeData")) setGeneric("edgeData<-", function(self, from, to, attr, value) standardGeneric("edgeData<-")) setGeneric("mgEdgeDataDefaults", function(self, edgeSet, attr) standardGeneric("mgEdgeDataDefaults")) setGeneric("mgEdgeDataDefaults<-", function(self, edgeSet, attr, value) standardGeneric("mgEdgeDataDefaults<-")) setGeneric("mgEdgeData", function(self, edgeSet, from, to, attr) standardGeneric("mgEdgeData")) setGeneric("mgEdgeData<-", function(self, edgeSet, from, to, attr, value) standardGeneric("mgEdgeData<-")) ## --------------------------------------------------------------------- ## Basic operations setGeneric("DFS", function(object, node, checkConn=TRUE) standardGeneric("DFS")) setGeneric("subGraph", function(snodes, graph) standardGeneric("subGraph")) setGeneric("intersection2", function(x, y) standardGeneric("intersection2")) setGeneric("intersection", function(x, y) standardGeneric("intersection")) setGeneric("join", function(x, y) standardGeneric("join")) setGeneric("ugraph", function(graph) standardGeneric("ugraph")) setGeneric("complement", function(x) standardGeneric("complement")) setGeneric("connComp", function(object) standardGeneric("connComp")) setGeneric("isConnected", function(object, ...) standardGeneric("isConnected")) setGeneric("inEdges", function(node, object) standardGeneric("inEdges")) setGeneric("leaves", signature="object", # don't dispatch on degree.dir function(object, degree.dir) standardGeneric("leaves")) setGeneric("edgeNames", function(object, ...) standardGeneric("edgeNames")) setGeneric("isAdjacent", function(object, from, to, ...) standardGeneric("isAdjacent")) ## Misc setGeneric("Dist", function(object) standardGeneric("Dist")) setGeneric("threshold", function(object, k, value=0) standardGeneric("threshold")) setGeneric("contents", function(object, all.names) standardGeneric("contents")) setGeneric("edgeMatrix", function(object, duplicates=FALSE) standardGeneric("edgeMatrix")) setGeneric("adjacencyMatrix", function(object) standardGeneric("adjacencyMatrix")) setGeneric("edgeL", function(graph, index) standardGeneric("edgeL")) setGeneric("clusteringCoefficient", function(object, ...) standardGeneric("clusteringCoefficient")) ## Generics for GXL setGeneric("fromGXL", function(con) standardGeneric("fromGXL")) setGeneric("dumpGXL", function(con) standardGeneric("dumpGXL")) setGeneric("validateGXL", function(con) standardGeneric("validateGXL")) setGeneric("toGXL", function(object, ...) standardGeneric("toGXL")) setGeneric("property", function(x, prop) standardGeneric("property")) setGeneric("toDotR", function(G, outDotFile, renderList, optList) standardGeneric("toDotR")) ## Updating a graph object setGeneric("updateGraph", function(object) standardGeneric("updateGraph")) setGeneric("extractFromTo", function(g) standardGeneric("extractFromTo")) setGeneric("graphIntersect", function(x, y, ...) standardGeneric("graphIntersect")) setGeneric("graphUnion", function(x, y, ...) standardGeneric("graphUnion")) setGeneric("edgeSets", function(object, ...) standardGeneric("edgeSets")) graph/R/GXLformals.R0000644000175400017540000001100713175713336015253 0ustar00biocbuildbiocbuild# # GXL support # ## fromGXL returns the graphNEL object only, and it may ## need to return more properties (7 mar 03) setMethod("fromGXL", signature(con="connection"), function(con) { contents <- paste(readLines(con), collapse="") xmlEventParse <- getExportedValue("XML", "xmlEventParse") xmlEventParse(contents, graph_handler(), asText=TRUE, saxVersion=2)$asGraphNEL() }) ## dumpGXL returns an R list with all? properties setMethod("dumpGXL", "connection", function(con) { xmlEventParse <- getExportedValue("XML", "xmlEventParse") xmlEventParse(paste(readLines(con), collapse=""), NELhandler(),asText=TRUE)$dump() }) ## validate against the dtd setMethod("validateGXL", "connection", function(con) { xmlTreeParse <- getExportedValue("XML", "xmlTreeParse") # maybe need a try here, xmlTreeParse dumps the whole stream when it hits an error tmp <- xmlTreeParse(paste(readLines(con), collapse=""), asText=TRUE, validate=TRUE) }) # # exporting # setMethod("toGXL", signature(object="graphNEL"), function(object, graph.name) { if (missing(graph.name)) { graph.name <- class(object)[1] } gxlTreeNEL(object, graph.name) }) gxlTreeNEL <- function(gnel, graph.name) { qrequire("XML") GXL_NAMESPACE <- c(gxl="http://www.gupro.de/GXL/gxl-1.1.dtd") out <- XML::xmlOutputDOM("gxl", nsURI=GXL_NAMESPACE, nameSpace="gxl") ## NOTE: We could specify dtd="http://www.gupro.de/GXL/gxl-1.0.1.dtd", ## but this might mean that net access is required to write ## GXL which seems quite unacceptable. nodeAttrs <- names(nodeDataDefaults(gnel)) edgeAttrs <- names(edgeDataDefaults(gnel)) writeAttr <- function(attrName, val) { ## skip NA and NULL if (is.null(val) || is.na(val)) return(NULL) ## at present, can only handle length 1 if (length(val) > 1) { warning("GXL conversion only handles attributes ", "with length 1. Will try to represent ", "object of length ", length(val), " as a", "string.") val <- paste(val, collapse=", ") } atag <- switch(typeof(val), integer="int", character="string", double="float", { warning("I don't know how to convert ", "a ", typeof(val), " to GXL. ", " Skipping.") NULL }) if (is.null(atag)) return(NULL) out$addTag("attr", attrs=c(name=attrName), close=FALSE) out$addTag(atag, as.character(val)) out$closeTag() } writeNode <- function(n) { ## Helper function to write a graphNEL node to XML out$addTag("node", attrs=c(id=n), close=FALSE) for (nodeAttr in nodeAttrs) { val <- nodeData(gnel, n, attr=nodeAttr)[[1]] writeAttr(nodeAttr, val) } out$closeTag() ## node } edgeCount <- 1 writeEdge <- function(from, to) { ## Helper function to write a graphNEL node to XML edgeId <- edgeCount edgeCount <<- edgeCount + 1 out$addTag("edge", attrs=c(id=edgeId, from=from, to=to), close=FALSE) for (edgeAttr in edgeAttrs) { val <- edgeData(gnel, from, to, attr=edgeAttr)[[1]] writeAttr(edgeAttr, val) } out$closeTag() ## node } nds <- nodes(gnel) if (!isDirected(gnel)) { ## remove recipricol edges eds <- lapply(gnel@edgeL, function(x) x$edges) eds <- mapply(function(x, y) x[x < y], eds, seq(length=length(eds))) names(eds) <- nodes(gnel) eds <- lapply(eds, function(x) { if (length(x) > 0) nds[x] else character(0) }) } else { eds <- edges(gnel) } enms <- names(eds) out$addTag("graph", attrs=c(id=graph.name, edgemode=edgemode(gnel)), close=FALSE) for (n in nds) { writeNode(n) } for (from in enms) { for (to in eds[[from]]) { writeEdge(from=from, to=to) } } out$closeTag() # graph out } graph/R/MultiGraph.R0000644000175400017540000016674113175713336015331 0ustar00biocbuildbiocbuildMultiGraph <- function(edgeSets, nodes = NULL, directed = TRUE, ignore_dup_edges = FALSE) { .mg_validate_edgeSet(edgeSets) nodeNames <- .mg_node_names(edgeSets, nodes) n_nodes <- length(nodeNames) edge_sets <- makeMDEdgeSets(edgeSets, directed, nodeNames, ignore_dup_edges = ignore_dup_edges) mg <- new("MultiGraph", edge_sets = edge_sets, nodes = nodeNames) mg@edge_defaults <- sapply(names(edge_sets), function(x) { list("weight" = 1L) }, simplify = FALSE) mg } makeMDEdgeSets <- function(edgeSets, directed, nodes, ignore_dup_edges = FALSE) { directed <- if (length(directed) == 1L) rep(directed, length(edgeSets)) else if (length(directed) != length(edgeSets)) stop("'directed' must align with 'edgeSets' or have length one", call. = FALSE) else directed ans <- vector(mode = "list", length = length(edgeSets)) nms <- names(edgeSets) names(ans) <- nms for (i in seq_along(edgeSets)) { ans[[i]] <- .makeMDEdgeSet(nms[[i]], edgeSets[[i]], directed[[i]], nodes, ignore_dup_edges = ignore_dup_edges) } ans } .makeMDEdgeSet <- function(es_name, es, is_directed, nodes, ignore_dup_edges = FALSE) { if (!all(c("from", "to", "weight") %in% names(es))) stop("'edgeSets' must have columns 'from', 'to', 'weight'", call. = FALSE) n_nodes <- length(nodes) bitVect <- makebits(n_nodes * n_nodes, bitdim = c(n_nodes, n_nodes)) weights <- numeric(0L) if (nrow(es) > 0L) { from <- as.character(es[["from"]]) to <- as.character(es[["to"]]) weights <- es[["weight"]] if (!is_directed) { tmp <- .mg_undirectEdges(from, to, weights) from <- tmp[["from"]] to <- tmp[["to"]] weights <- tmp[["weight"]] } ## map 'from', 'to' from character to integer indicies from_i <- match(from, nodes) to_i <- match(to, nodes) edge_order <- order(to_i, from_i) weights <- weights[edge_order] if (!is.numeric(weights)) stop("'weight' column must be numeric", call. = FALSE) if (ignore_dup_edges) { ## NB: we only consider nodes for duplication, ignoring ## weight value. ft <- cbind(from_i, to_i)[edge_order, , drop=FALSE] tmp <- paste(ft[,"from_i"],ft[,"to_i"], sep="_") want <- !duplicated(tmp) from_i <- ft[want, 1] to_i <- ft[want, 2] weights <- weights[want] } else { from_i <- from_i[edge_order] to_i <- to_i[edge_order] } ## TODO: should not have to pass vector of 1s for each edge in ## setBitCell. bitVect <- setBitCell(bitVect, from_i, to_i, rep(1L, length(from_i))) edge_count <- nbitset(bitVect) if (length(from_i) != edge_count) .report_duplicate_edges(es_name, from, to, is_directed) } klass <- if (is_directed) "DiEdgeSet" else "UEdgeSet" ## FIXME: need to handle extra edge attributes. These will need to ## come in as a separate argument as a list of attribute lists that ## align with from/to new(klass, bit_vector = bitVect, weights = weights, edge_attrs = list()) } .report_duplicate_edges <- function(name, from, to, directed) { df <- cbind(from, to) sep <- if (directed) "=>" else "=" if (any(dups <- duplicated(df))) { stop("duplicate edges in edge set ", sQuote(name), ": ", pasteq(paste(from[dups], to[dups], sep = sep)), call. = FALSE) } } .mg_undirectEdges <- function(from, to, weight) { fromIsFirst <- from < to toIsFirst <- !fromIsFirst tmpFrom <- c(from[fromIsFirst], to[toIsFirst]) tmpTo <- c(to[fromIsFirst], from[toIsFirst]) tmpW <- c(weight[fromIsFirst], weight[toIsFirst]) list(from = tmpFrom, to = tmpTo, weight = tmpW) } .mg_validate_node_names <- function(nodeNames) { if (!all(valid <- .mg_valid_node_names(nodeNames))) { stop("invalid node names: ", pasteq(head(nodeNames[!valid], 10L)), call. = FALSE) } } .mg_node_names <- function(edgeSets, nodes) { ## XXX: we sort the node names and are thus subject ## to locale variation ftSets <- lapply(edgeSets, function(ft) { cbind(from = as.character(ft[["from"]]), to = as.character(ft[["to"]])) }) nodeNames <- unique(c(unlist(ftSets, use.names = FALSE), nodes)) if (is.null(nodeNames) || length(nodeNames) == 0L) nodeNames <- character(0) else { nodeNames <- sort(nodeNames, na.last = FALSE) .mg_validate_node_names(nodeNames) } nodeNames } .mg_validate_edgeSet <- function(edgeSets) { if (!is.list(edgeSets)) stop("'edgeSets' must be a named list or empty list", call. = FALSE) if (length(edgeSets) > 0L) { nms <- names(edgeSets) if (is.null(nms)) stop("'edgeSets' must be a named list", call. = FALSE) if (!all(nzchar(nms)) || any(is.na(nms)) || any(duplicated(nms))) stop("names(edgeSets) is invalid", call. = FALSE) } } MultiDiGraph <- function(edgeSets, nodes = NULL) { ## Nodes are stored in sorted order. The sparse Edge index vector ## is stored in sorted index order. Since R is column-major, this ## means that when translated to x, y coordinates, the ordering is ## sorted by column and then row. ## edgeSets is a list of from/to matrices ftSets <- lapply(edgeSets, function(ft) { cbind(from = as.character(ft[[1L]]), to = as.character(ft[[2L]])) }) nodeNames <- sort(unique(c(unlist(ftSets, use.names = FALSE), nodes)), na.last = FALSE) if (!all(valid <- .mg_valid_node_names(nodeNames))) { stop("node names invalid: ", pasteq(head(nodeNames[!valid], 10L))) } n_nodes <- length(nodeNames) if (n_nodes > 2^15) n_nodes <- as.double(n_nodes) n_edgeSets <- length(edgeSets) es_names <- names(edgeSets) edgeAttrs <- structure(vector("list", n_edgeSets), names = es_names) ## FIXME: should we enforce having a "weight" column? for (i in seq_len(n_edgeSets)) { ft <- ftSets[[i]] from_i <- match(ft[, 1L], nodeNames) to_i <- match(ft[, 2L], nodeNames) sparseAM <- .coordToIndex(from_i, to_i, n_nodes) edgeIdxOrder <- order(sparseAM) esi <- edgeSets[[i]] edgeAttrs[[i]] <- structure(data.frame(mdg_edge_index = sparseAM[edgeIdxOrder], esi[edgeIdxOrder, c(-1L, -2L)], row.names = NULL), names = c("mdg_edge_index", names(esi)[-(1:2)])) } new("MultiDiGraph", nodes = nodeNames, edgeAttrs = edgeAttrs) } .mg_valid_node_names <- function(names) { !(is.na(names) | (sapply(names, nchar) == 0) | (regexpr("\\||\n|\t", names) > 0)) } setMethod("numNodes", signature = signature(object = "MultiGraph"), function(object) { length(object@nodes) }) setMethod("numEdges", signature = signature(object = "MultiGraph"), function(object) { ## TODO: would it make more sense to just ## return the length of @weights? sapply(object@edge_sets, function(es) { nbitset(es@bit_vector) }) }) setMethod("nodes", signature = signature(object = "MultiGraph"), function(object, ...) { object@nodes }) setMethod("isDirected", signature = signature(object = "MultiGraph"), function(object) sapply(object@edge_sets, isDirected)) setMethod("isDirected", signature = signature(object = "DiEdgeSet"), function(object) TRUE) setMethod("isDirected", signature = signature(object = "UEdgeSet"), function(object) FALSE) setMethod("ugraph", signature = signature(graph = "MultiGraph"), function(graph) { graph@edge_sets <- lapply(graph@edge_sets, ugraph) graph }) ## FIXME: should ugraph on an undirected graph also drop ## attributes to keep things consistent? setMethod("ugraph", "UEdgeSet", function(graph) { new("UEdgeSet", bit_vector = graph@bit_vector, weights = rep(1L, length(graph@weights)), edge_attrs = list()) }) setMethod("ugraph", "DiEdgeSet", function(graph) { ## XXX: edge weights => 1, edge attributes dropped bit_vector <- .Call(graph_bitarray_undirect, graph@bit_vector) new("UEdgeSet", bit_vector = bit_vector, weights = rep(1L, nbitset(bit_vector)), edge_attrs = list()) }) setMethod("show", signature = signature(object = "MultiGraph"), function(object) { cat(class(object), sprintf("with %d nodes and %d edge sets\n", numNodes(object), length(object@edge_sets))) if (length(object@edge_sets)) { edgeCounts <- numEdges(object) df <- data.frame(edge_set = names(edgeCounts), directed = sapply(object@edge_sets, isDirected), edge_count = edgeCounts, stringsAsFactors = FALSE, row.names = NULL) print(head(df, 10L), row.names = FALSE) } invisible(NULL) }) eweights <- function(object, names.sep = NULL) { if (is.null(names.sep)) { lapply(object@edge_sets, function(es) { es@weights }) } else { sep <- names.sep[1] nn <- nodes(object) n_nodes <- length(object@nodes) lapply(object@edge_sets, function(es) { w <- es@weights ft <- .Call(graph_bitarray_rowColPos, es@bit_vector) names(w) <- paste(nn[ft[, "from"]], nn[ft[, "to"]], sep = names.sep) w }) } } # # edgeMatrices <- function(object) # { # n_nodes <- length(object@nodes) # lapply(object@edgeAttrs, function(attrs) { # matrix(t(.indexToCoord(attrs[[1L]], n_nodes)), # nrow = 2L, # dimnames = list(c("from", "to"), NULL)) # }) # } # # fromToList <- function(object) # { # nodeNames <- object@nodes # n_nodes <- length(nodeNames) # lapply(object@edgeAttrs, function(attrs) { # coord <- .indexToCoord(attrs[[1L]], n_nodes) # coord[] <- nodeNames[coord] # ft <- structure(data.frame(from = coord[ , 1L], to = coord[ , 2L], # attrs[-1L], stringsAsFactors = FALSE), # names = c("from", "to", names(attrs)[-1L])) # ft # }) # } # # # extractGraph <- function(object, which) # { # if (length(which) != 1L) # stop("'which' must be length one") # edgeAttr <- object@edgeAttrs[[which]] # nodeNames <- nodes(object) # ftmat <- .indexToCoord(edgeAttr[[1L]], length(nodeNames)) # ftmat[] <- nodeNames[ftmat] # ftM2graphNEL(ftmat, W = edgeAttr[[2L]], V = nodeNames, # edgemode = "directed") # } # ## Generate a random from/to table ## ## Returns a list with two elements: ## $node: character vector of node labels ## $ft: a data.frame with columns 'from', 'to', and 'weight' ## randFromTo <- function(numNodes, numEdges, weightFun = function(N) rep(1L, N), directed = TRUE) { if (numNodes > 2^15) numNodes <- as.double(numNodes) maxEdges <- numNodes * numNodes nodeNames <- sprintf("%010d", seq_len(numNodes)) ## use double to allow for large numNodes numToGen <- max(numEdges * 4, numNodes) idx <- unique(ceiling(runif(numToGen, min = 0, max = maxEdges))) stopifnot(length(idx) >= numEdges) idx <- idx[seq_len(numEdges)] to_i <- ((idx - 1L) %/% numNodes) + 1L from_i <- ((idx - 1L) %% numNodes) + 1L from <- nodeNames[from_i] to <- nodeNames[to_i] w <- weightFun(length(from)) list(nodes = nodeNames, ft = data.frame(from = from, to = to, weight = w, stringsAsFactors = FALSE)) } oneWeights <- function(x) rep(1L, nrow(x)) edgeSetIntersect0 <- function(g, edgeFun = NULL) { edge_sets <- g@edge_sets n_sets <- length(edge_sets) if (n_sets < 2L) return(g) nms <- names(edge_sets) nName <- paste(nms, collapse = "_") funList <- structure(list(edgeFun), names = nName) directed <- isDirected(g) klass <- if (all(directed)) "DiEdgeSet" else "UEdgeSet" if(!( all(directed) || all(!directed))) { stop("all edges must either be directed or undirected") } g1 <- subsetEdgeSets(g,nms[1]) names(g1@edge_sets) <- names(g1@edge_defaults) <- nName if(length(g1@userAttrPos@edgePos)) names(g1@userAttrPos@edgePos) <- nName for ( i in seq.int(2L, n_sets)) { g2 <- subsetEdgeSets(g, nms[i]) names(g2@edge_sets) <- names(g2@edge_defaults) <- nName if(length(g2@userAttrPos@edgePos)) names(g2@userAttrPos@edgePos) <- nName g1 <- graphIntersect(g1, g2, edgeFun = funList) } n_edges <- attr(g1@edge_sets[[1L]], "nbitset") <- .Call(graph_bitarray_sum, g1@edge_sets[[1L]]@bit_vector ) if(n_edges >0) { return(g1) } else { new_edge_sets <- list() return(new("MultiGraph", edge_sets = new_edge_sets, nodes = nodes(g1))) } } edgeSetUnion0 <- function(g, edgeFun = NULL) { edge_sets <- g@edge_sets n_sets <- length(edge_sets) if (n_sets < 2L) return(g) nms <- names(edge_sets) nName <- paste(names(edge_sets), collapse = "_") funList <- structure(list(edgeFun), names = nms[1]) directed <- isDirected(g) klass <- if (all(directed)) "DiEdgeSet" else "UEdgeSet" if(!( all(directed) || all(!directed))) { stop("all edges must either be directed or undirected") } g1 <- subsetEdgeSets(g,nms[1]) names(g1@edge_sets) <- nName for ( i in seq.int(2L, n_sets)) { g2 <- subsetEdgeSets(g, names(g@edge_sets)[i]) names(g2@edge_sets) <- nName g1 <- graphUnion(g1, g2, funList) } n_edges <- attr(g1@edge_sets[[1L]], "nbitset") <- .Call(graph_bitarray_sum, g1@edge_sets[[1L]]@bit_vector ) if(n_edges >0) { return(g1) } else { new_edge_sets <- list() return(new("MultiGraph", edge_sets = new_edge_sets, nodes = nodes(g1))) } } ## TODO: should you be allowed to rename edge sets? ## or at least name unnamed edge sets? subsetEdgeSets <- function(object, edgeSets) { if (!all(nzchar(edgeSets)) || any(is.na(edgeSets)) || !(all(edgeSets %in% names(object@edge_sets)))) stop("'edgeSet' is invalid") if(any(dups <- duplicated(edgeSets))) stop("duplicate edges specified in edge set ", edgeSets[dups]) object@edge_sets<- object@edge_sets[edgeSets] nms <- names(object@edge_defaults) mtch <- edgeSets[edgeSets %in% nms] object@edge_defaults <- if (length(mtch)) object@edge_defaults[mtch] else list() nms <- names( object@userAttrPos@edgePos) mtch <- edgeSets[edgeSets %in% nms] object@userAttrPos@edgePos <- if (length(mtch))object@userAttrPos@edgePos[mtch] else list() object } diEdgeSetToDataFrame <- function(edgeSets,nodes) { bitvec <- edgeSets@bit_vector df <- .Call(graph_bitarray_rowColPos, bitvec) data.frame(from = nodes[df[, "from"]], to = nodes[df[, "to"]], weight = edgeSets@weights) } .extractFromTo_mg <- function(g) { nn <- nodes(g) lapply(g@edge_sets, function(x) diEdgeSetToDataFrame(x, nn)) } setMethod("extractFromTo", "MultiGraph", .extractFromTo_mg) .mgDegree <- function(object) { nn <- nodes(object) len <- length(nn) idx_str <- as.character(seq_len(len)) lapply(object@edge_sets, function(edgeSet) { bitvec <- edgeSet@bit_vector df <- .Call(graph_bitarray_rowColPos, bitvec) tbl <- structure(table(df[, "from"]), class=NULL) indx <- idx_str %in% names(tbl) from <- to <- structure(rep(0, len), names=nn) from[indx] <- tbl tbl <- structure(table(df[, "to"]), class=NULL) indx <- idx_str %in% names(tbl) to[indx] <- tbl if (isDirected(edgeSet)) { list(inDegree = to, outDegree = from) } else { degree = from + to } }) } setMethod("subGraph", signature(snodes="character", graph="MultiGraph"), function(snodes, graph) { origNodes <- nodes(graph) snodes <- sort(snodes) snodesIdx <- match(snodes, origNodes) if (any(is.na(snodesIdx))) { bad <- snodes[which(is.na(snodesIdx))] stop("'snodes' contains nodes not in MultiGraph: ", pasteq(bad)) } nms <- names(graph@nodeData@defaults) len <- length(snodes) tmp <- makebits(len) for(i in nms){ indx <- bitToLogical(graph@userAttrPos@nodePos[[i]])[snodesIdx] graph@nodeData@data[[i]] <- .getNodeAttrVec(graph, i)[snodesIdx][indx] graph@userAttrPos@nodePos[[i]] <- setbitv(tmp, which(indx), rep(1L, length(which(indx)))) } graph@nodes <- snodes edgNms <- names(graph@edge_sets) for(i in edgNms) { res <- .Call(graph_bitarray_subGraph, graph@edge_sets[[i]]@bit_vector, snodesIdx) graph@edge_sets[[i]]@bit_vector <- res$bitVec graph@edge_sets[[i]]@weights <- graph@edge_sets[[i]]@weights[res$setPos] attrNms <- names(graph@edge_sets[[i]]@edge_attrs) for (j in attrNms) { attrBit <- graph@userAttrPos@edgePos[[i]][[j]] res <- .Call(graph_bitarray_subGraph, attrBit, snodesIdx) graph@edge_sets[[i]]@edge_attrs[[j]] <- graph@edge_sets[[i]]@edge_attrs[[j]][res$setPos] graph@userAttrPos@edgePos[[i]][[j]] <- res$bitVec } } graph }) extractGraphAM <- function(g, edgeSets) { if(missing(edgeSets)) edgeSets <- names(g@edge_sets) if (!all(nzchar(edgeSets)) || any(is.na(edgeSets)) || !(all(edgeSets %in% names(g@edge_sets)))) stop("'edgeSet' is invalid") nds <- nodes(g) drct <- isDirected(g) esets <- if (missing(edgeSets)) g@edge_sets else g@edge_sets[edgeSets] nms <- names(esets) names(nms) <- nms lapply(nms, function(x) { mat <- edgeSetToMatrix(nds, esets[[x]], drct[[x]]) bam <- graphAM(adjMat=mat, edgemode = if(drct[[x]]) "directed" else "undirected", values= list(weight = esets[[x]]@weights)) }) } edgeSetToMatrix <- function(nds, edgeSet, directed) { .Call(graph_bitarray_edgeSetToMatrix, nds, edgeSet@bit_vector, as.numeric(edgeSet@weights), as.logical(directed)) } setMethod("graphIntersect", c("MultiGraph", "MultiGraph"), function(x, y, nodeFun, edgeFun, ...){ nn <- intersect(nodes(x), nodes(y)) nnLen <- length(nn) nmsX <- names(x@edge_sets) nmsY <- names(y@edge_sets) eg <- intersect(nmsX, nmsY) dr1 <- isDirected(x)[eg] dr2 <- isDirected(y)[eg] if(!all(dr1 == dr2)) stop("edgeSets 'x' and 'y' must have same edgemode") theMode <- dr1 & dr2 if (nnLen == 0){ ft <- data.frame(from = character(0), to = character(0), weight = numeric(0)) es <- structure(rep(list(ft), length(eg)), names = eg) mg <- MultiGraph(es, directed = theMode) return(mg) } x <- subsetEdgeSets(x, eg) y <- subsetEdgeSets(y, eg) sgx <- if (nnLen == numNodes(x)) x else subGraph(nn, x) sgy <- if (nnLen == numNodes(y)) y else subGraph(nn, y) if(missing(edgeFun)) edgeFun <- structure( rep(list(NULL),length(eg)), names = eg) if(missing(nodeFun)) nodeFun <- NULL new_edge_sets <- structure(lapply(eg, function(k) { .getEdgeIntersect(sgx@edge_sets[[k]], sgy@edge_sets[[k]]) }), names = eg) mg <- .getMGIntersect(sgx, sgy, new_edge_sets, edgeFun) mg@nodeData@defaults <- .retNodeIntersectDefaults(sgx, sgy) mg@userAttrPos@nodePos <- .getIntNodeUserAttrPos(sgx, sgy) mg@nodeData@data <- .nodeIntersect(sgx, sgy, mg, nodeFun) mg }) .getMGIntersect <- function(g1, g2, edge_set, edgeFun) { nn <- intersect(nodes(g1), nodes(g2)) ans <- new("MultiGraph", edge_sets = edge_set, nodes = nn) eg <- intersect(names(g1@edge_sets), names(g2@edge_sets)) for( i in eg) { e1Attr <- names(g1@edge_sets[[i]]@edge_attrs) e2Attr <- names(g2@edge_sets[[i]]@edge_attrs) commonAttr <- intersect(e1Attr, e2Attr) funList <- edgeFun[[i]] if(!is.null(funList)) { fIndx <- names(funList) %in% c(commonAttr, "weight") if(!all(fIndx)) stop("attributes in 'funList' not in edge attributes: ", pasteq(names(funList)[fIndx])) } attrType <- .Call(graph_bitarray_Intersect_Attrs, edge_set[[i]]@bit_vector, g1@edge_sets[[i]]@bit_vector, g2@edge_sets[[i]]@bit_vector) if(length(attrType$from) >0) { ans@edge_sets[[i]]@weights <- .getIntersectAttrs("weight", attrType, g1@edge_sets[[i]]@weights, g2@edge_sets[[i]]@weights, funList) } bt <- (g1@edge_sets[[i]]@bit_vector) & (g2@edge_sets[[i]]@bit_vector) attributes(bt) <- attributes(g1@edge_sets[[i]]@bit_vector) ns <- .Call(graph_bitarray_sum, bt) attr(bt, "nbitset") <- ns for(j in commonAttr) { ans@userAttrPos@edgePos[[i]][[j]] <- bt xAttr <- .retMGAttrVec(g1, i, j) yAttr <- .retMGAttrVec(g2, i, j) if(length(attrType$from) >0) { ans@edge_sets[[i]]@edge_attrs[[j]] <- .getIntersectAttrs(j, attrType, xAttr, yAttr, funList) } } ans@edge_defaults[[i]]<- .retEdgeIntersectDefaults(g1@edge_defaults[[i]], g2@edge_defaults[[i]]) } ans } .scaleMG <- function(g, theNodes) { if (all(nodes(g) %in% theNodes) && length(nodes(g)) == length(theNodes)) return(g) else { es <- names(g@edge_sets) for (i in es) { g@edge_sets[[i]] <- .scaleEdgeSet(g, i, theNodes) nms <- names(g@userAttrPos@edgePos[[i]]) for(j in nms) { g@userAttrPos@edgePos[[i]][[j]] <- .scaleUserAttrPos(g@userAttrPos@edgePos[[i]][[j]], theNodes) } } } nms <- names(g@nodeData@defaults) for(i in nms){ origNds <- nodes(g)[(bitToLogical(g@userAttrPos@nodePos[[i]]))] ndsLen <- length(theNodes) indx <- match(origNds, theNodes) bt <- makebits(ndsLen) bt <- setbitv(bt, indx, rep(1L, length(indx))) g@userAttrPos@nodePos[[i]] <- bt g@nodeData@data[[i]] <- g@nodeData@data[[i]] } g@nodes <- theNodes g } .scaleUserAttrPos <- function(edgePos, nds) { ft <- .Call(graph_bitarray_rowColPos, edgePos) ndsLen <- length(nds) posBit <- .createZeroBitPos(ndsLen) setBitCell(posBit, ft[,"from"], ft[,"to"], rep(1L, nrow(ft))) } .scaleEdgeSet <- function(g, es, nds) { df <- diEdgeSetToDataFrame(g@edge_sets[[es]], nodes(g)) edge_sets <- .makeMDEdgeSet(es_name = 1, es = df, is_directed = isDirected(g@edge_sets[[es]]), nds, ignore_dup_edges = FALSE) edge_sets@edge_attrs <- g@edge_sets[[es]]@edge_attrs edge_sets } .retMGEdgeUnionUserAttrPos <- function(x, y) { nmsX <- names(x@edge_sets) nmsY <- names(y@edge_sets) cmnEdges <- intersect(nmsX, nmsY) allEdges <- union(nmsX, nmsY) snglEdges <- allEdges[! allEdges %in% cmnEdges] ans <- structure(vector(mode = "list", length(allEdges)), names = allEdges) for(i in cmnEdges) { xAttr <- names(x@edge_sets[[i]]@edge_attrs) yAttr <- names(y@edge_sets[[i]]@edge_attrs) unionAttrs <- unique(union(xAttr, yAttr)) commonAttrs <- intersect(xAttr,yAttr) singleAttrs <- unionAttrs[!unionAttrs %in% commonAttrs] ans[[i]] <- structure(vector(mode = "list", length(unionAttrs)), names = unionAttrs) bt <- (x@edge_sets[[i]]@bit_vector) | (y@edge_sets[[i]]@bit_vector) attributes(bt) <- attributes(x@edge_sets[[i]]@bit_vector) ns <- .Call(graph_bitarray_sum, bt) attr(bt, "nbitset") <- ns for (j in commonAttrs) { ans[[i]][[j]] <- bt } for(j in singleAttrs) { if(j %in% names(x@edge_sets[[i]])) ans[[i]][[j]] <- x@userAttrPos@edgePos[[i]][[j]] else ans[[i]][[j]] <- y@userAttrPos@edgePos[[i]][[j]] } } for(i in snglEdges) { if(i %in% names(x@edge_sets)) ans[[i]] <- x@userAttrPos@edgePos[[i]] else ans[[i]] <- y@userAttrPos@edgePos[[i]] } ans } .getUnionEdgeSet <- function(g1, g2, edgeFun) { eg <- intersect(names(g1@edge_sets),names(g2@edge_sets)) theNodes <- unique(c(nodes(g1), nodes(g2))) edge_sets <- structure(lapply(eg, function(i) { e1Attr <- names(g1@edge_sets[[i]]@edge_attrs) e2Attr <- names(g2@edge_sets[[i]]@edge_attrs) unionAttr <- unique(union(e1Attr, e2Attr)) if(!is.null(edgeFun[[i]])) { fIndx <- names(edgeFun[[i]]) %in% c(unionAttr, "weight") if(!all(fIndx)) stop("attributes in 'edgeFun' not in edge attributes: ", pasteq(names(edgeFun[[i]])[fIndx])) } bv <- g1@edge_sets[[i]]@bit_vector | g2@edge_sets[[i]]@bit_vector attributes(bv) <- attributes(g1@edge_sets[[i]]@bit_vector) attr(bv, "nbitset") <- ns <- .Call(graph_bitarray_sum, bv) dr1 <- isDirected(g1@edge_sets[[i]]) dr2 <- isDirected(g2@edge_sets[[i]]) theMode <- if (dr1 && dr2) "directed" else "undirected" c0 <- character(0) df <- data.frame(from = c0, to = c0, weight = numeric(0)) edge_set <- .makeMDEdgeSet(es_name = 1, es =df, is_directed = (theMode == "directed"), nodes = theNodes, ignore_dup_edges = FALSE) edge_set@bit_vector <- bv cmnBit <- g1@edge_sets[[i]]@bit_vector & g2@edge_sets[[i]]@bit_vector attributes(cmnBit) <- attributes(g1@edge_sets[[i]]@bit_vector) attr(cmnBit, "nbitset") <- .Call(graph_bitarray_sum, cmnBit) fromOneBit <- g1@edge_sets[[i]]@bit_vector & (!cmnBit) attributes(fromOneBit) <- attributes(g1@edge_sets[[i]]@bit_vector) attr(fromOneBit, "nbitset") <- .Call(graph_bitarray_sum, fromOneBit) fromTwoBit <- g2@edge_sets[[i]]@bit_vector & (!cmnBit) attributes(fromTwoBit) <- attributes(g2@edge_sets[[i]]@bit_vector) attr(fromTwoBit, "nbitset") <- .Call(graph_bitarray_sum, fromTwoBit) attrType <- .Call(graph_bitarray_Union_Attrs, bv, cmnBit, fromOneBit, fromTwoBit) if(length(attrType$from) >0) { edge_set@weights <- as.numeric(.getMGUnionWeights(attrType, g1, g2, i, edgeFun[[i]])) } if(!is.null(unionAttr)) { for(j in unionAttr) { edge_set@edge_attrs[[j]] <- .getMGUnionAttrs(j, attrType, g1, g2, i, edgeFun[[i]]) } } edge_set }), names = eg) edge_sets } .getMGUnionWeights <- function(attrType, g1, g2, es, funList) { len <- length(attrType$from) attr1 <- vector(len, mode = "numeric") attr1[seq_len(len)] <- NA ## from x k <- (as.numeric(attrType$from) ==1) attr1[k] <- g1@edge_sets[[es]]@weights[attrType$indx1[k]] ## from y k <- (as.numeric(attrType$from) == 2) attr1[k] <- g2@edge_sets[[es]]@weights[attrType$indx2[k]] ## resolve union k <- (as.numeric(attrType$from) ==0) if(any(k)) { val1 <- g1@edge_sets[[es]]@weights[attrType$indx1[k]] val2 <- g2@edge_sets[[es]]@weights[attrType$indx2[k]] if(!is.null(funList) && ("weight" %in% names(funList))) { attr1[k] <- sapply(seq_len(sum(k)), function(p) { return(funList[["weight"]](val1[[p]], val2[[p]])) }) } else if(is.vector(val1) && is.vector(val2)) { eqInd <- sapply(seq_len(length(val1)), function(x){ identical(val1[x], val2[x]) }) pt <- which(eqInd) lp <- length(which(k)) tmp <- vector(lp, mode ="numeric") tmp[seq_len(lp)] <- NA tmp[pt] <- val1[pt] attr1[k] <- tmp } } attr1 } .getMGUnionAttrs <- function(att, attrType, x , y, es, funList ) { len <- length(attrType$from) indx <- as.numeric(attrType$from) if(att %in% names(x@edge_sets[[es]]@edge_attrs)) mds <- mode(x@edge_sets[[es]]@edge_attrs[[att]]) else if(att %in% names(y@edge_sets[[es]]@edge_attrs)) mds <- mode(y@edge_sets[[es]]@edge_attrs[[att]]) attr1 <- vector(len , mode = mds) attr1[seq_len(len)] <- NA ## from x k <- (as.numeric(attrType$from) ==1) if(att %in% names(x@edge_sets[[es]]@edge_attrs)) { xAttr <- .retMGAttrVec(x, es, att) attr1[k] <- xAttr[ attrType$indx1[k]] } ## from y k <- (as.numeric(attrType$from) == 2) if(att %in% names(y@edge_sets[[es]]@edge_attrs)) { yAttr <- .retMGAttrVec(y, es, att) attr1[k] <- yAttr[ attrType$indx2[k]] } ## resolve union k <- (as.numeric(attrType$from) ==0) if(any(k)) { if(att %in% names(x@edge_sets[[es]]@edge_attrs)) val1 <- xAttr[ attrType$indx1[k]] else val1 <- yAttr[ attrType$indx2[k]] if(att %in% names(y@edge_sets[[es]]@edge_attrs)) val2 <- yAttr[ attrType$indx2[k]] else val2 <- xAttr[ attrType$indx1[k]] if(!is.null(funList) && (att %in% names(funList))) { attr1[k] <- sapply(seq_len(sum(k)), function(p) { return(funList[[att]](val1[[p]], val2[[p]])) }) } else if (is.vector(val1) && is.vector(val2)) { eqInd <- sapply(seq_len(length(val1)), function(x){ identical(val1[x], val2[x]) }) pt <- which(eqInd) lp <- sum(k) tmp <- vector(lp, mode = mds) tmp[seq_len(lp)] <- NA tmp[pt] <- val1[pt] attr1[k] <- tmp } } attr1 } setMethod("graphUnion", c("MultiGraph", "MultiGraph"), function(x, y, nodeFun, edgeFun, ...){ dr1 <- isDirected(x) dr2 <- isDirected(y) nmsX <- names(x@edge_sets) nmsY <- names(y@edge_sets) eg <- intersect(nmsX, nmsY) if(missing(edgeFun)) edgeFun <- structure( rep(list(NULL),length(eg)), names = eg) if(missing(nodeFun)) nodeFun <- NULL if(!all(dr1[eg] == dr2[eg])) stop("edgeSets 'x' and 'y' must have same edgemode") theNodes <- unique(c(nodes(x), nodes(y))) nnLen <- length(theNodes) mgx <- .scaleMG(x, theNodes) mgy <- .scaleMG(y, theNodes) xeg <- nmsX[ !nmsX %in% eg] yeg <- nmsY[ !nmsY %in% eg] new_edge_sets <- .getUnionEdgeSet(mgx, mgy, edgeFun) x_edge_sets <- x@edge_sets[xeg] y_edge_sets <- y@edge_sets[yeg] mg <- new("MultiGraph", edge_sets = c(new_edge_sets, x_edge_sets, y_edge_sets), nodes = theNodes) mg@userAttrPos@edgePos <- .retMGEdgeUnionUserAttrPos(mgx, mgy) mg@nodeData@defaults <- .retNodeUnionDefaults(mgx, mgy) mg@nodeData@data <- .nodeUnion(x, y, nodeFun) mg@userAttrPos@nodePos <- .getUnionNodeUserAttrPos(mg, mgx, mgy) mg@edge_defaults <- .retMGEdgeUnionDefaults(mgx, mgy) mg }) .retMGEdgeUnionDefaults <- function(g1, g2) { eg <- intersect(names(g1@edge_sets), names(g2@edge_sets)) structure(lapply(eg, function(i) { cmnAttrs <- intersect(names(g1@edge_defaults[[i]]), names(g2@edge_defaults[[i]])) unqAttrs <- unique(c(names(g1@edge_defaults[[i]]), names(g2@edge_defaults[[i]]))) singleAttrs <- unqAttrs[!( unqAttrs %in% cmnAttrs)] cmn <- structure(lapply(cmnAttrs, function(x) { if(identical(g1@edge_defaults[[i]][[x]], g2@edge_defaults[[i]][[x]])) g1@edge_defaults[[i]][[x]] else NA }), names = cmnAttrs) sng <- structure(lapply(singleAttrs, function(x) { if(x %in% names(g1@edge_defaults[[i]])) g1@edge_defaults[[i]][[x]] else g2@edge_defaults[[i]][[x]] }), names = singleAttrs) c(cmn, sng) }), names = eg) } extractGraphBAM <- function(g, edgeSets) { if(missing(edgeSets)) edgeSets <- names(g@edge_sets) if (!all(nzchar(edgeSets)) || any(is.na(edgeSets)) || !(all(edgeSets %in% names(g@edge_sets)))) stop("edgeSet is invalid") nn <- nodes(g) esets <- g@edge_sets[edgeSets] df_empty <- data.frame(from = character(0), to = character(0), weight = numeric(0)) structure(lapply(names(esets), function(x) { edgeMode <- if(isDirected(esets[[x]])) "directed" else "undirected" bam <- graphBAM(df_empty, nodes = nn, edgemode = edgeMode, ignore_dup_edges = TRUE) bam@edgeSet <- esets[[x]] bam@nodeData@data <- g@nodeData@data bam@nodeData@defaults <- g@nodeData@defaults bam@userAttrPos@nodePos <- g@userAttrPos@nodePos bam@edgeData@defaults <- g@edge_defaults[[x]] if(length(g@userAttrPos@edgePos)) bam@userAttrPos@edgePos <- g@userAttrPos@edgePos[[x]] bam }), names = names(esets)) } ## Degree of a multigraph setMethod("degree", signature(object = "MultiGraph", Nodes = "missing"), function(object){ .mgDegree(object) }) ## Node data accces methods .nodeDataRetrieve <- function(self, n, attr) { if (length(attr) != 1L) stop("'attr' argument must specify a single attribute name") if ( ! (attr %in% names(self@nodeData@defaults))) stop("attribute not present: ", sQuote(attr)) nds <- nodes(self) .verifyNodes(n, nds) idx <- match(n, nds) names(idx) <- seq_along(idx) idx <- sort(idx) n <- n[as.numeric(names(idx))] names(idx) <- NULL bt <- self@userAttrPos@nodePos[[attr]] ord <- .getNodeAttrPos(bt, idx) res <- vector(length(idx), mode = mode(self@nodeData@defaults[[attr]])) res[seq_along(idx)] <- self@nodeData@defaults[[attr]] if (length(ord$leftPos)) res[ord$leftPos] <- self@nodeData@data[[attr]][ord$rightPos] as.list(structure(res, names = n)) } setMethod("nodeData", signature(self = "MultiGraph", n = "character", attr = "character"), function(self, n, attr) { .nodeDataRetrieve(self, n, attr) }) setMethod("nodeData", signature(self = "MultiGraph", n = "missing", attr = "character"), function(self, n, attr) { if(length(attr) != 1L) stop("'attr' must specify a single attribute") if( ! (attr %in% names(self@nodeData@defaults))) stop("attribute not present: ", sQuote(attr)) nds <- nodes(self) nodeData(self, n= nds, attr= attr) }) setMethod("nodeData", signature(self = "MultiGraph", n = "character", attr = "missing"), function(self, n, attr) { nds <- nodes(self) .verifyNodes(n ,nds) nms <- names(self@nodeData@defaults) structure(lapply(nms, function(x) { nodeData(self, n, x) }), names = nms) }) setMethod("nodeData", signature(self = "MultiGraph", n = "missing", attr = "missing"), function(self, n, attr) { nds <- nodes(self) nms <- names(self@nodeData@defaults) structure(lapply(nms, function(x) { nodeData(self, nds, x) }), names = nms) }) ## Node data replacement methods .nodeDataReplaceNodeGiven <- function(self, n, attr, value) { .verifyAttrName(attr, names(self@nodeData@defaults)) if(length(attr) != 1L) stop("attr argument must specify a single attribute") if(is.vector(value)){ len <- length(value) } else { len <- 1 value <- list(value) } if(len!=1L && len != length(n)) { stop("value must be of length one or have the same length as n") } nms <- names(self@nodeData@data) nds <- nodes(self) .verifyNodes(n, nds) if(len==1L && len !=length(n)) value <- rep(value, length(n)) idx <- match(n, nds) names(idx) <- seq_along(idx) idx <- sort(idx) value <- value[as.numeric(names(idx))] names(idx) <- NULL bt <- self@userAttrPos@nodePos[[attr]] bt <- .Call(graph_bitarray_set, bt, as.integer(idx), as.integer(rep(1L, length(idx)))) ns <- attr(bt, "nbitset") self@userAttrPos@nodePos[[attr]] <- bt ord <- .getNodeAttrOrder(bt, idx) newAttr <- vector(ns, mode = mode(value)) newAttr[attr(ord$newVal, "newPos")] <- value[ord$newVal] newAttr[attr(ord$origVal, "origPos")] <- self@nodeData@data[[attr]][ord$origVal] self@nodeData@data[[attr]] <- newAttr self } .nodeDataReplaceNodeMissing <- function (self, attr, value) { .verifyAttrName(attr, names(self@nodeData@defaults)) if(length(attr) != 1L) stop("attr argument must specify a single attribute") lenNode <- length(nodes(self)) if(is.vector(value)){ lenVal <- length(value) } else { lenVal <- 1 value <- list(value) } if(lenVal !=1L && lenVal != lenNode) { stop("value must be of length one or have the same length as number of nodes of self") } idx <- seq_len(lenNode) nodeData(self, n = nodes(self), attr) <- value self } setReplaceMethod("nodeData", signature(self = "MultiGraph", n="character", attr="character", value="ANY"), function(self, n, attr, value) { .nodeDataReplaceNodeGiven(self, n, attr, value) }) setReplaceMethod("nodeData", signature(self = "MultiGraph", n="missing", attr="character", value="ANY"), function(self, n, attr, value) { .nodeDataReplaceNodeMissing(self, attr, value) }) .verifyMgEdgeSetNames <- function(mg, e) { if(!e %in% names(mg@edge_defaults)) stop("edgeSet not found: ", sQuote(e)) if(numEdges(mg)[e] == 0) stop("edgeSet does not have any connected edges: ", sQuote(e)) } .verifyMgEdges <- function(mg, e, from, to) { stopifnot(length(from) == length(to)) if (length(from) == 0L) stop("edges not in edgeSet: ", sQuote(e)) adjList <- .mgIsAdj(mg, e, from, to) if (any(!adjList)) { badFr <- from[!adjList] badTo <- to[!adjList] res <- paste(badFr, badTo, sep = "|", collapse = ", ") stop("edges not found: ", sQuote(res)) } TRUE } .verifyMGAttrs <- function(mg, e, attr) { if( !(attr %in% names(mg@edge_defaults[[e]]))) stop("attr ", sQuote(attr), " not in edgeSet ", sQuote(e)) } setMethod("mgEdgeDataDefaults", signature(self ="MultiGraph", edgeSet="character", attr="character"), function(self, edgeSet, attr) { self@edge_defaults[[edgeSet]][[attr]] }) setMethod("mgEdgeDataDefaults", signature(self ="MultiGraph", edgeSet="character", attr="missing"), function(self, edgeSet, attr) { self@edge_defaults[[edgeSet]] }) setReplaceMethod("mgEdgeDataDefaults", signature(self="MultiGraph", edgeSet = "character", attr="missing", value="list"), function(self, edgeSet, attr, value) { self@edge_defaults[[edgeSet]] <- value wt <- self@edge_defaults[[edgeSet]][["weights"]] if(!is.numeric(wt) && !is.null(wt)) stop("weights attribute has to be of type numeric") ndsLen <- length(nodes(self)) nms <- names(value) posBit <- .createZeroBitPos(ndsLen) for(i in seq_along(value)) { nms <- names(self@userAttrPos@edgePos[[edgeSet]]) if(!(nms[i] %in% nms)) { if(nms[i] != "weight"){ self@userAttrPos@edgePos[[edgeSet]][[nms[i]]] <- posBit } } } self }) setReplaceMethod("mgEdgeDataDefaults", signature(self="MultiGraph", edgeSet = "character", attr="character", value="ANY"), function(self, edgeSet, attr, value) { self@edge_defaults[[edgeSet]][[attr]] <- value if(attr == "weight") { wt <- self@edge_defaults[[edgeSet]][["weights"]] if(!is.numeric(wt) && !is.null(wt)) stop("weights attribute has to be of type numeric") } else{ ndsLen <- length(nodes(self)) posBit <- .createZeroBitPos(ndsLen) if(!(attr %in% names(self@userAttrPos@edgePos[[edgeSet]]))) { self@userAttrPos@edgePos[[edgeSet]][[attr]] <- posBit } } self }) ## MultiGraph edgeData methods setMethod("mgEdgeData", signature(self = "MultiGraph", edgeSet = "character", from = "character", to = "character", attr = "character"), function(self, edgeSet, from , to, attr) { nodeNames <- self@nodes .verifyMgEdgeSetNames(self, edgeSet) req_ft <- .align_from_to(from, to, nodeNames) if(nrow(req_ft) > 0) .verifyMgEdges(self, edgeSet, req_ft[,"from"], req_ft[,"to"]) .verifyMGAttrs(self, edgeSet, attr) numNodes <- length(nodeNames) bv <- self@edge_sets[[edgeSet]]@bit_vector val <- .retMGAttrVec(self, edgeSet, attr) ft <- .Call(graph_bitarray_rowColPos, self@edge_sets[[edgeSet]]@bit_vector) if(!isDirected(self@edge_sets[[edgeSet]])) { df <- cbind(from=ft[,"to"], to = ft[,"from"]) ft <- rbind(ft,df) val <- c(val, val) } ft <- data.frame(ft) ft <- ft[with(ft, order(to,from)),] req_i <- structure(match(req_ft, nodeNames), dim = dim(req_ft)) colnames(req_i) <- c("from", "to") tmp <- rbind(req_i, ft) pst <- paste(tmp[,"from"],tmp[,"to"], sep = "_") idx <- duplicated(pst)[seq(nrow(req_i) +1 , nrow(tmp))] ord <- order(req_i[,2], req_i[,1]) req_i <- req_i[ord,,drop =FALSE] val <- structure(val[idx], names = paste(nodeNames[req_i[,1]],nodeNames[req_i[,2]], sep = "|")) as.list(val) }) setMethod("mgEdgeData", signature(self = "MultiGraph", edgeSet = "character", from = "character", to = "missing", attr = "character"), function(self, edgeSet, from , to, attr) { .verifyMgEdgeSetNames(self,edgeSet) .mgGetAttrs( self, edgeSet, from, attr) }) setMethod("mgEdgeData", signature(self = "MultiGraph", edgeSet = "character", from = "missing", to = "character", attr = "character"), function(self, edgeSet, from , to, attr) { .verifyMgEdgeSetNames(self,edgeSet) nodeNames <- self@nodes numNodes <- length(nodeNames) bv <- self@edge_sets[[edgeSet]]@bit_vector val <- .retMGAttrVec(self, edgeSet, attr) ft <- .Call(graph_bitarray_rowColPos, self@edge_sets[[edgeSet]]@bit_vector) if(!isDirected(self@edge_sets[[edgeSet]])) { df <- cbind(from=ft[,"to"], to = ft[,"from"]) ft <- rbind(ft,df) val <- c(val,val) } tmp <- seq_len(length(val)) ft <- data.frame(ft, tmp, stringsAsFactors = FALSE) ft <- ft[ft[,"to"] %in% which(nodeNames %in% to),] if(nrow(ft) == 0) stop("edges in \"to\" not found in \"self\"") .verifyMgEdges(self, edgeSet, nodeNames[ft[,"from"]], nodeNames[ft[,"to"]]) nodeLbl <- paste( nodeNames[ft[,"from"]], nodeNames[ft[, "to"]], sep ="|") val <- val[ft[,"tmp"]][seq_along(nodeLbl)] names(val) <- nodeLbl as.list(val) }) setMethod("mgEdgeData", signature(self = "MultiGraph", edgeSet = "character", from = "missing", to = "missing", attr = "character"), function(self, edgeSet, from , to, attr) { .verifyMgEdgeSetNames(self,edgeSet) eg <- .edges_mg(self, edgeSet) .mgGetAttrs( self, edgeSet, from = names(eg), attr) }) ## MultiGraph edgeData replacement methods setReplaceMethod("mgEdgeData", signature(self = "MultiGraph", edgeSet = "character", from = "character", to = "character", attr = "character", value = "ANY"), function(self, edgeSet, from, to, attr, value) { .verifyMgEdgeSetNames(self,edgeSet) .verifyAttrName(attr, names(self@edge_defaults[[edgeSet]])) lenFrom <- length(from) lenTo <- length(to) if (lenFrom != lenTo) { if(lenFrom ==1) from <- rep(from, lenTo) else if (lenTo == 1) to <- rep(to , lenFrom) else stop("arguments 'from', 'to' differ in length") } if(length(edgeSet) != 1L) stop("edgeSet has to be of length 1") .mgSetAttrs(self, edgeSet, from, to, attr, value) }) setReplaceMethod("mgEdgeData", signature(self="MultiGraph", edgeSet = "character", from = "character", to = "missing", attr="character", value = "ANY"), function(self, edgeSet, from, to, attr, value) { .verifyAttrName(attr, names(self@edge_defaults[[edgeSet]])) .verifyMgEdgeSetNames(self,edgeSet) eg <- .edges_mg(self, edgeSet)[from] to <- unlist(eg, use.names = FALSE) len <- as.numeric(sapply(eg, length)) from <- rep(names(eg),len) .mgSetAttrs(self, edgeSet, from, to, attr, value) }) setReplaceMethod("mgEdgeData", signature(self="MultiGraph", edgeSet = "character", from="missing", to="character", attr="character", value="ANY"), function(self,edgeSet, from, to, attr, value) { .verifyMgEdgeSetNames(self,edgeSet) eg <- .edges_mg(self, edgeSet, direction = "in") eg <- eg[order(names(eg))][to] from <- unlist(eg, use.names = FALSE) len <- as.numeric(sapply(eg, length)) to <- rep(names(eg), len) .mgSetAttrs(self, edgeSet, from, to, attr, value) }) setReplaceMethod("mgEdgeData", signature(self="MultiGraph", edgeSet = "character", from="missing", to="missing", attr="character", value="ANY"), function(self, edgeSet, from, to, attr, value) { .verifyMgEdgeSetNames(self, edgeSet) nn <- nodes(self) df <- diEdgeSetToDataFrame(self@edge_sets[[edgeSet]], nn) from <- nn[df[,"from"]] to <- nn[df[,"to"]] .mgSetAttrs(self, edgeSet, from, to, attr, value) }) .edges_mg <- function(object, e, direction="out") { nn <- nodes(object) if (numEdges(object)[e] == 0L) { names(nn) <- nn c0 <- character(0L) return(lapply(nn, function(x) c0)) } ft <- .Call(graph_bitarray_rowColPos, object@edge_sets[[e]]@bit_vector) ft[] <- nn[ft] eL <- singles <- NULL if (isDirected(object@edge_sets[[e]])) { if (direction == "in") ft[ , c("from", "to")] <- ft[ , c("to", "from")] eL <- split(ft[ , "to"], ft[ , "from"]) singles <- nn[!(nn %in% ft[ , "from"])] } else { eL <- lapply(split(ft, ft[ , c("to", "from")]), unique) singles <- nn[!(nn %in% ft)] } if (length(singles) > 0) { names(singles) <- singles c0 <- character(0L) empties <- lapply(singles, function(x) c0) eL <- c(eL, empties) } eL[order(names(eL))] } .mgIsAdj <- function(object, e, from, to) { eSpec <- .normalizeEdges(from, to) from <- eSpec$from to <- eSpec$to fromIdx <- match(from, nodes(object), nomatch=0) toIdx <- match(to, nodes(object), nomatch=0) if (any(fromIdx == 0)) stop("unknown nodes in 'from': ", pasteq(from[fromIdx == 0])) if (any(toIdx == 0)) stop("unknown nodes in 'to': ", pasteq(to[toIdx == 0])) fromEdges <- .edges_mg(object, e)[from] .Call(graph_is_adjacent, fromEdges, to) } .mgSetAttrs <- function(mg, e, from, to, attr, value) { nodeNames <- mg@nodes req_ft <- .align_from_to(from, to, nodeNames) ## remove dups indx <- duplicated(paste(req_ft[,"from"], req_ft[,"to"], sep ="_")) req_ft <- req_ft[!indx, ,drop = FALSE] if(nrow(req_ft) > 0) .verifyMgEdges(mg, e, req_ft[,"from"], req_ft[,"to"]) else stop("edges specified could not be found in edgeSet ", sQuote(e)) if(is.vector(value)) { len <- length(value) }else{ len <- 1 value <- list(value) } if(len == 1L) value <- rep(value, nrow(req_ft)) if(length(value) != nrow(req_ft)) stop("number of edges and attribute values must be the same") ft <- .Call(graph_bitarray_rowColPos, mg@edge_sets[[e]]@bit_vector) if (!isDirected(mg@edge_sets[[e]])) { ## normalize from/to valIndx <- seq_len(length(value)) tmp <- .mg_undirectEdges(req_ft[ , 1], req_ft[, 2], valIndx) req_ft <- cbind(tmp[["from"]], tmp[["to"]]) value <- value[tmp[["weight"]]] } ## convert node names to index req_i <- structure(match(req_ft, nodeNames), dim = dim(req_ft)) colnames(req_i) <- c("from", "to") req_i <- data.frame(req_i) idx <- order(req_i[,2], req_i[,1]) req_i <- req_i[idx, ] value <- value[idx] if(attr == "weight") { attrBit <- mg@edge_sets[[e]]@bit_vector if(nrow(req_i)) { ord <- .Call(graph_bitarray_getEdgeAttrOrder, attrBit, as.integer(req_i[,"from"]), as.integer(req_i[,"to"])) mg@edge_sets[[e]]@bit_vector <- setBitCell(attrBit, req_i[,"from"], req_i[,"to"], rep(1L, nrow(req_i))) nt <- attr(mg@edge_set[[e]]@bit_vector, "nbitset") } else { nt <- attr(attrBit, "nbitset") ord <- list(newLeftPos = integer(0), newRightPos = integer(0), origLeftPos = seq_len(nt), origRightPos = seq_len(nt)) } newAttr <- vector(nt, mode = mode(value)) newAttr[ord$origLeftPos] <- mg@edgeSet@weights[ord$origRightPos] newAttr[ord$newLeftPos] <- value[ord$newRightPos] mg@edge_sets[[e]]@weights <- newAttr } else { attrBit <- mg@userAttrPos@edgePos[[e]][[attr]] if(nrow(req_i)) { ord <- .Call(graph_bitarray_getEdgeAttrOrder, attrBit, as.integer(req_i[,"from"]), as.integer(req_i[,"to"])) mg@userAttrPos@edgePos[[e]][[attr]] <- setBitCell(attrBit, req_i[,"from"], req_i[,"to"], rep(1L, nrow(req_i))) nt <- attr(mg@userAttrPos@edgePos[[e]][[attr]], "nbitset") } else { nt <- attr(attrBit, "nbitset") ord <- list(newLeftPos = integer(0), newRightPos = integer(0), origLeftPos = seq_len(nt), origRightPos = seq_len(nt)) } newAttr <- vector(nt, mode = mode(value)) newAttr[ord$origLeftPos] <- mg@edge_sets[[e]]@edge_attrs[[attr]][ord$origRightPos] newAttr[ord$newLeftPos] <- value[ord$newRightPos] mg@edge_sets[[e]]@edge_attrs[[attr]] <- newAttr } mg } .retMGAttrVec <- function(g, e, attr) { if(attr !="weight") { k1 <- g@edge_sets[[e]]@bit_vector k2<- g@userAttrPos@edgePos[[e]][[attr]] tmp <- attributes(k1) res <- k1& (!k2) attributes(res) <- tmp ns <- .Call(graph_bitarray_sum, res) attr(res, "nbitset") <- ns ft <- data.frame(.Call(graph_bitarray_rowColPos,res)) dflt <- g@edge_defaults[[e]][[attr]] attrBit <- g@userAttrPos@edgePos[[e]][[attr]] ft <- ft[with(ft, order(to, from)),] if(nrow(ft)) { ord <- .Call(graph_bitarray_getEdgeAttrOrder, attrBit, as.integer(ft[,"from"]), as.integer(ft[,"to"])) attrBit <- setBitCell(attrBit, ft[,"from"], ft[,"to"], rep(1L, nrow(ft))) nt <- attr(attrBit, "nbitset") } else { nt <- attr(attrBit, "nbitset") ord <- list(newLeftPos = integer(0), newRightPos = integer(0), origLeftPos = seq_len(nt), origRightPos = seq_len(nt)) } newAttr <- vector(nt, mode = mode(dflt)) if(!is.null(g@edge_sets[[e]]@edge_attrs[[attr]])) { newAttr[ord$origLeftPos] <- g@edge_sets[[e]]@edge_attrs[[attr]][ord$origRightPos] newAttr[ord$newLeftPos] <- if(mode(dflt)=="list") { rep(list(dflt), length(ord$newLeftPos)) } else dflt }else{ newAttr[seq_len(nt)] <- if(mode(dflt)=="list") { rep(list(dflt), nt) } else dflt } }else{ newAttr <- g@edge_sets[[e]]@weights } newAttr } .mgGetAttrs <- function(self, edge, from, attr) { nodeNames <- self@nodes indx <- which(nodeNames %in% from) numNodes <- length(nodeNames) bv <- self@edge_sets[[edge]]@bit_vector .verifyMGAttrs(self, edge, attr) val <- .retMGAttrVec(self, edge, attr) ft <- .Call(graph_bitarray_rowColPos, bv) if(!isDirected(self@edge_sets[[edge]])) { df <- cbind(from=ft[,"to"], to = ft[,"from"]) ft <- rbind(ft,df) val <- c(val,val) } tmp <- seq_len(length(val)) ft <- data.frame(ft, tmp, stringsAsFactors = FALSE ) ft <- ft[ ft[,"from"] %in% indx,] if(nrow(ft) == 0) stop("edges specified in \"from\" not found in edgeSet ", sQuote(edge)) nodeLbl <- paste( nodeNames[ft[,"from"]], nodeNames[ft[, "to"]], sep ="|") val <- val[ft[,"tmp"]][seq_along(nodeLbl)] names(val) <- nodeLbl as.list(val) } setMethod("nodeDataDefaults", signature(self="MultiGraph", attr="missing"), function(self, attr){ attrDefaults(self@nodeData) }) setMethod("nodeDataDefaults", signature(self="MultiGraph", attr="character"), function(self, attr){ attrDefaults(self@nodeData, attr) }) setReplaceMethod("nodeDataDefaults", signature(self="MultiGraph", attr="missing", value="list"), function(self, attr, value) { attrDefaults(self@nodeData) <- value nmsNds <- names(self@nodeData@defaults) nmsAttr <- names(self@userAttrPos@nodePos) ndsLbls <- nmsNds[ !(nmsNds %in% nmsAttr)] if(length(ndsLbls)) { ndsLen <- length(nodes(self)) bt <- makebits(ndsLen) } for(i in ndsLbls) { self@userAttrPos@nodePos[[i]] <- bt } self }) setReplaceMethod("nodeDataDefaults", signature(self="MultiGraph", attr="character", value="ANY"), function(self, attr, value) { attrDefaults(self@nodeData, attr) <- value ndsLen <- length(nodes(self)) if(! (attr %in% names(self@userAttrPos@nodePos))){ bt <- makebits(ndsLen) self@userAttrPos@nodePos[[attr]] <- bt } self }) setMethod("edgeSets", signature("MultiGraph"), function(object, ...) { names(object@edge_sets) }) setMethod("edges", signature("MultiGraph", "character"), function(object, which, edgeSet) { if(missing(edgeSet)) edgeSet <- edgeSets(object) if (!all(edgeSet %in% edgeSets(object))) stop("edgeSet specified not found in MultiGraph") if (!all(which %in% nodes(object))) stop("nodes specified not found in MultiGraph") eg <- extractGraphBAM(object, edgeSet) if(length(eg) == 1) edges(eg[[edgeSet]], which) else lapply(eg, edges, which) }) setMethod("edges", signature("MultiGraph", "missing"), function(object, edgeSet) { if (missing(edgeSet)) edgeSet <- edgeSets(object) if (!all(edgeSet %in% edgeSets(object))) stop("edgeSet specified not found in MultiGraph") eg <- extractGraphBAM(object, edgeSet) if(length(eg) == 1) edges(eg[[edgeSet]]) else lapply(eg, edges) }) setMethod("edgeNames", signature("MultiGraph"), function(object, edgeSet) { if(missing(edgeSet)) edgeSet <- edgeSets(object) if (!all(edgeSet %in% edgeSets(object))) stop("edgeSet specified not found in MultiGraph") eg <- extractGraphBAM(object, edgeSet) if(length(eg) == 1) edgeNames(eg[[edgeSet]]) else lapply(eg, edgeNames) }) graph/R/NELhandler.R0000644000175400017540000001022413175713336015211 0ustar00biocbuildbiocbuildNELhandler <- function () { # # this function is to work with omegahat's XML xmlEventParse # current version: given a GXL graph, capture the node names and # edge data to return the graph as graph::graphNEL # graphID <- NULL curNode <- NULL curEdge <- NULL curAttr <- NULL inNode <- FALSE inEdge <- FALSE inAttr <- FALSE nodeL <- list() edgeL <- list() edgemode <- NULL # # handler elements: start elements are cased for # graph, node, attr, or edge # text is limited in the simple example to the attr tag, # which lives under a node or an edge # startElement = function(x, atts, ...) { if (x == "graph") { graphID <<- atts["id"] edgemode <<- atts["edgemode"] } else if (x == "node") { inNode <<- TRUE nodeL[[atts["id"]]] <<- list() curNode <<- atts["id"] } else if (x == "attr") { inAttr <<- TRUE curAttr <<- atts["name"] } else if (x == "edge") { inNode <<- FALSE inEdge <<- TRUE edgeL[[atts["id"]]] <<- list() edgeL[[atts["id"]]][["span"]] <<- c(atts["from"], atts["to"]) curEdge <<- atts["id"] } } text = function(x, atts, ...) { if (inNode & inAttr & nchar(x) > 0) nodeL[[curNode]][[curAttr]] <<- x else if (inEdge & inAttr & nchar(x) > 0) edgeL[[curEdge]][[curAttr]] <<- c(edgeL[[curEdge]][[curAttr]], x) } endElement = function(x, ...) { if (x == "attr") inAttr <<- FALSE else if (x == "node") inNode <<- FALSE else if (x == "edge") inEdge <<- FALSE } dump = function() { list(graphID = graphID, nodeL = nodeL, edgeL = edgeL, edgemode = edgemode) } asGraphNEL = function() { # # revised Jun 16 2004 # when callsed, nodeL is the named list of node data, edgeL is # named list of edge data (unrelated to edgeL of graphNEL!!!) # require(graph) ns <- names(nodeL) if (length(edgeL) == 0) return(graphNEL(nodes = ns, edgemode = edgemode)) # # edgeL has a span element giving source and destination of each # edge # src <- sapply(edgeL, function(x) x$span["from"]) dest <- sapply(edgeL, function(x) x$span["to"]) wts <- sapply(edgeL, function(x) as.numeric(x$weights)) NOWTS <- FALSE if (all(sapply(wts,length)==0)) NOWTS <- TRUE names(wts) <- dest # # graphNEL edgeL structure is a named list with one element # for each node of graph. the edges component for a node N # has node indices of the destinations of each edge starting at N # desti <- match(dest, ns) edl <- split(desti, src) wtl <- split(wts, src) for (i in seq_along(ns)) { if (length(edl[[ns[i]]]) == 0) edl[[ns[i]]] <- list(edges = integer(0)) else if (!NOWTS) edl[[ns[i]]] <- list(edges = edl[[ns[i]]], weights=wtl[[ns[i]]]) else edl[[ns[i]]] <- list(edges = edl[[ns[i]]]) } edl <- edl[ns] if (edgemode %in% c("undirected", "defaultundirected")) edgemode <- "undirected" else edgemode <- "directed" g <- graphNEL(nodes = ns, edgeL = edl, edgemode = edgemode) if (edgemode(g) == "undirected") { edgemode(g) <- "directed" # allow ugraph to do something g <- ugraph(g) edgemode(g) <- "undirected" } if (!validGraph(g)) { msg <- "GXL did not define a valid graph package graphNEL object. Most likely there is a failure of reciprocity for edges in an undirected graph. If there is a node for edge from A to B in an undirected graphNEL, there must also be an edge from B to A." stop(paste0(c("", strwrap(msg)), collapse="\n")) } return(g) } list(startElement = startElement, endElement = endElement, text = text, dump = dump, asGraphNEL = asGraphNEL) } graph/R/TODOT.R0000644000175400017540000000753713175713336014143 0ustar00biocbuildbiocbuild #setClass("compoundGraph", # representation(grList="list", # between="list")) #setMethod("grList","compoundGraph", function(object)object@grList) # #setMethod("between", "compoundGraph", function(object)object@between) setMethod("toDotR", c("graphNEL", "character", "list", "list"), function (G, outDotFile, renderList, optList=.standardToDotOptions) { buildEdge <- function(fromTok, toTok, opts, labField=NULL) { protq <- function(x) paste0("\"",x,"\"") core <- paste(protq(fromTok),"->",protq(toTok),";\n",sep=" ") UDB <- opts$useDirBack ELF <- opts$edgeLabelField if (length(UDB) == 0) UDB <- FALSE if (length(ELF) == 0 || nchar(ELF) == 0 || is.null(labField)) ELF <- FALSE else ELF <- TRUE if (!UDB & !ELF) return(core) if (UDB & !ELF) return(paste("edge [dir=back]", core, sep=" ")) if (!UDB & ELF) return( paste0("edge [label=", labField,"] ", core)) if (UDB & ELF) return(paste0("edge [dir=back label=", labField,"] ", core)) stop("logic error") } ## to get bottom to top orientation (B points up to A), use ## [dir=back] A->B if (is.null(renderList$start)) renderList$start <- "digraph G" out <- paste0(renderList[["start"]], " {\n") ned <- length(E <- edgeL(G)) enms <- names(E) nds <- nodes(G) ac <- as.character if (!is.null(pn <- renderList[["prenodes"]])) out <- paste(out, pn, "\n") ## need quote marks protq <- function(x) paste0("\"", x, "\"") ## this takes care of isolated nodes if present for (j in nds) out <- paste( out, protq(j), ";\n" ) ## deal with an edge statement if (!is.null(pe <- renderList[["preedges"]])) out <- paste(out, pe, "\n") if (ned > 0) for (i in seq_len(ned)) { if ((L <- length(E[[i]]$edges)) > 0) for (j in seq_len(L)) { builtEdge <- buildEdge(from=nds[ E[[i]]$edges[j] ], to=enms[i], optList, E[[i]][[ optList$edgeLabelField ]]) out <- paste(out, builtEdge, sep=" ") } } out <- paste(out, "}\n", sep = "", collapse = "") if (outDotFile != ".AS.STRING") { cat(out, file = outDotFile) paste("dot file written to", sQuote(outDotFile), " use 'dot -Tps [.dot] [.ps] to render.\n") invisible(0) } else out }) setMethod("toDotR", c("graphNEL", "character", "missing", "missing"), function(G, outDotFile, renderList, optList) toDotR(G, outDotFile, list(start="digraph G"), .standardToDotOptions)) # where=where) setMethod("toDotR", c("graphNEL", "missing", "missing", "missing"), function(G, outDotFile, renderList, optList) toDotR(G, , list(start="digraph G"), .standardToDotOptions)) #where=where) setMethod("toDotR", c("graphNEL", "missing", "character", "missing"), function (G, outDotFile, renderList, optList) toDotR(G, ".AS.STRING", list(start=renderList," "), .standardToDotOptions)) # where=where) setMethod("toDotR", c("graphNEL", "missing", "list", "list"), function(G, outDotFile, renderList, optList) toDotR(G, ".AS.STRING" , renderList, optList)) # where=where) setMethod("toDotR", c("graphNEL", "missing", "list", "missing"), function(G, outDotFile, renderList, optList) toDotR(G, ".AS.STRING" , renderList, .standardToDotOptions)) # where=where) setMethod("toDotR", c("graphNEL", "missing", "missing", "list"), function(G, outDotFile, renderList, optList) toDotR(G, ".AS.STRING" , list(start="digraph G"), optList)) # where=where) setMethod("toDotR", c("graphNEL", "character", "missing", "list"), function(G, outDotFile, renderList, optList) toDotR(G, outDotFile , list(start="digraph G"), optList)) # where=where) .standardToDotOptions <- list( useDirBack=TRUE ) graph/R/attrData.R0000644000175400017540000001110713175713336015002 0ustar00biocbuildbiocbuildsetMethod("initialize", signature("attrData"), function(.Object, defaults) { .Object@data <- list() if (missing(defaults)) defaults <- list() else { if (is.null(names(defaults)) || any(is.na(names(defaults)))) stop("defaults must have names for all elements") } .Object@defaults <- defaults .Object }) .addDefaultAttrs <- function(attrData, defaults) { if (is.null(attrData)) return(defaults) defaults[names(attrData)] <- attrData defaults } .verifyAttrListNames <- function(attrData, defaults) { if (any(! names(attrData) %in% names(defaults))) { nms <- names(attrData) badNms <- nms[! nms %in% names(defaults)] stop("attribute names not in attrData: ", pasteq(badNms)) } else { TRUE } } .checkAttrLength <- function(attrName) { if (length(attrName) != 1) stop("'attr' argument must specify a single attribute name") } .verifyAttrName <- function(attrName, knownNames) { .checkAttrLength(attrName) if (! attrName %in% knownNames) stop("unknown attribute name: ", sQuote(attrName)) TRUE } setMethod("attrDefaults", signature(self="attrData", attr="missing"), function(self, attr) { self@defaults }) setMethod("attrDefaults", signature(self="attrData", attr="character"), function(self, attr) { .verifyAttrName(attr, names(self@defaults)) self@defaults[[attr]] }) setReplaceMethod("attrDefaults", signature(self="attrData", attr="character", value="ANY"), function(self, attr, value) { .checkAttrLength(attr) self@defaults[[attr]] <- value self }) setReplaceMethod("attrDefaults", signature(self="attrData", attr="missing", value="list"), function(self, attr, value) { if (is.null(names(value))) stop("attribute list must have names") self@defaults <- value self }) setMethod("attrDataItem", signature(self="attrData", x="character", attr="missing"), function(self, x, attr) { itemData <- self@data[x] ## unknown items will have name NA and value NULL names(itemData) <- x itemData <- lapply(itemData, .addDefaultAttrs, self@defaults) itemData }) setMethod("attrDataItem", signature(self="attrData", x="character", attr="character"), function(self, x, attr) { .verifyAttrName(attr, names(self@defaults)) .Call(graph_attrData_lookup, self, x, attr) }) setReplaceMethod("attrDataItem", signature(self="attrData", x="character", attr="character", value="ANY"), function(self, x, attr, value) { .verifyAttrName(attr, names(self@defaults)) if (length(value) > 1 && length(value) != length(x)) stop("'value' must be length one or ", "have the same length as 'x'") self@data <- .Call(graph_sublist_assign, self@data, x, attr, value) self }) setReplaceMethod("removeAttrDataItem", signature(self="attrData", x="character", value="NULL"), function(self, x, value) { idx <- match(x, names(self@data)) idx <- idx[!is.na(idx)] if (length(idx)) self@data <- self@data[-idx] self }) setMethod("names", "attrData", function(x) { names(x@data) }) setReplaceMethod("names", signature(x="attrData", value="character"), function(x, value) { if (length(x@data) != length(value)) stop("'value' length doesn't match data") if (any(duplicated(value))) stop("'value' must specify unique names") if (any(is.na(value))) stop("'value' cannot contain NAs") names(x@data) <- value x }) graph/R/bitarray.R0000644000175400017540000000561113175713336015056 0ustar00biocbuildbiocbuild .indexToCoord <- function(i, nrow) { ## only for square if (nrow == 1L) return(cbind(1L, 1L)) ans <- matrix(0L, nrow = length(i), ncol = 2L) ans[ , 2L] <- ((i - 1L) %/% nrow) + 1L ans[ , 1L] <- ((i - 1L) %% nrow) + 1L ans } .coordToIndex <- function(x, y, nrow) { if (nrow == 1L) return(1L) (y * nrow) - (nrow - x) } .rowIndex <- function(x, n_row, n_col) .coordToIndex(rep(x, n_col), seq_len(n_col), n_row) .columnIndex <- function(y, n_row) .coordToIndex(seq_len(n_row), rep(y, n_row), n_row) makebits <- function(n, bitdim=NULL) { if (!is.null(bitdim)) bitdim <- as.integer(bitdim) n <- as.integer(n) structure(raw(ceiling(n / 8)), bitlen = n, bitdim = bitdim, nbitset = 0L) } bitdim <- function(x, dims) { attr(x, "bitdim") <- dims x } setBitCell <- function(xx, x, y, val) { dim <- attr(xx, "bitdim") idx <- .coordToIndex(x, y, dim[1L]) setbitv(xx, idx, val) } getBitCell <- function(xx, x, y) { dim <- attr(xx, "bitdim") idx <- .coordToIndex(x, y, dim[1L]) testbit(xx, idx) } getColumn <- function(xx, y) { dim <- attr(xx, "bitdim") idx <- .columnIndex(y, dim[1L]) testbit(xx, idx) ## wonder if there is a nice optimization since we will be reading ## consecutive bits for column oriented storage. } getRow <- function(xx, x) { dim <- attr(xx, "bitdim") n_row <- dim[1L] n_col <- dim[2L] idx <- .rowIndex(x, n_row, n_col) testbit(xx, idx) } bitlen <- function(x) attr(x, "bitlen") nbitset <- function(x) attr(x, "nbitset") bitToLogical <- function(x) { len <- attr(x, "bitlen") if (is.null(len)) len <- length(x) * 8L sapply(seq_len(len), function(i) testbit(x, i)) } setbitv <- function(xx, ii, v) { .Call(graph_bitarray_set, xx, ii, v) } ## can we vectorize these? setbit <- function(xx, ii) { i <- ii - 1L byteIdx <- (i %/% 8L) + 1L bit <- (i %% 8L) byte <- xx[byteIdx] xx[byteIdx] <- byte | rawShift(as.raw(1L), bit) xx } testbit <- function(xx, ii) { i <- ii - 1L byteIdx <- (i %/% 8L) + 1L bit <- (i %% 8L) byte <- xx[byteIdx] ans <- logical(length(byte)) for (i in seq_len(length(ans))) { ans[i] <- as.logical(byte[i] & rawShift(as.raw(1L), bit[i])) } ans } sumbits <- function(xx, ii) { s <- 0L i <- ii - 1L byteIdx <- (i %/% 8L) + 1L bit <- (i %% 8L) byte <- xx[byteIdx] for (i in seq_len(length(byte))) { s <- s + as.logical(byte[i] & rawShift(as.raw(1L), bit[i])) } s } bitToInteger <- function(x) { len <- attr(x, "bitlen") if (is.null(len)) len <- length(x) * 8L sapply(seq_len(len), function(i) if (testbit(x, i)) 1L else 0L) } bitToMat <- function(x) { len <- attr(x, "bitlen") bitdim <- attr(x, "bitdim") matrix(sapply(seq_len(len), function(i) if (testbit(x, i)) 1L else 0L), nrow = bitdim[1L], ncol = bitdim[2L]) } graph/R/buildDepGraph.R0000644000175400017540000000025713175713336015754 0ustar00biocbuildbiocbuildpkgInstOrder <- function() { .Defunct("getInstallOrder", package="pkgDepTools") } buildRepDepGraph <- function() { .Defunct("makeDepGraph", package="pkgDepTools") } graph/R/clustergraph.R0000644000175400017540000002445713175713336015755 0ustar00biocbuildbiocbuild##copyright 2002 R. Gentleman, all rights reserved ## a simple implementation of the notions of cluster graphs ## and clustering using distance measures ## for the adjacency matrix view of undirected graphs the ## storage of the graph in lower triangular form is appealing ## The lower triangle of the distance matrix stored by columns in a ## single vector. The vector has the attributes `"Size"', `"Diag"', ## `"Upper"', `"Labels"' and `"class"' equal to `"dist"'. ## the lower triangle stored by columns ## for i < j <= n the dissimilarity between row i and j is ## x[n*(i-1)-i*(i-1)/2+j-i] ## size is the number of obs ## labels are their labels, Diag and Upper indicate how to print ## ##a function for Martin -- if it ever gets good enough. ##FIXME: should look at other matrix packages; this is just subsetting ##from a lower (or upper) triangular matrix representation -- which ##should be easier...but maybe it needs to be done in C "[.dist" <- function(x, i, j, drop=TRUE) { lend <- attr(x, "Size") if( missing(i) ) if( missing(j) ) return(x) else { ## return columns i <- seq_len(lend) } if( missing(j) ) { j <- seq_len(lend) } ## we have both -- return a matrix leni <- length(i) lenj <- length(j) outl <- leni*lenj iuse <- rep(i, length.out=outl) juse <- rep(j, rep(leni, lenj), length.out=outl) igtj <- iuse > juse newi <- ifelse(!igtj, iuse, juse) newj <- ifelse(igtj, iuse, juse) lend <- attr(x, "Size") subs <- lend*(newi-1)-newi*(newi-1)/2+newj-newi zeros <- newi==newj rval <- rep(0, length(subs)) subs <- subs[!zeros] sdata <- unclass(x)[subs] rval[!zeros]<-sdata labels <- attr(x, "Labels") if( drop && (lenj == 1 || leni==1) ) { out<-rval if( leni == 1 ) names(out) <- labels[j] else names(out) <- labels[i] } else { out <- matrix(rval, ncol=lenj, nrow=leni) dimnames(out) <- list(labels[i], labels[j]) } out } setMethod("initialize", "distGraph", function(.Object, Dist) { if( is.null( attr(Dist, "Labels") ) ) attr(Dist, "Labels") = as.character(seq_len(attr(Dist, "Size"))) else checkValidNodeName(attr(Dist, "Labels")) .Object@Dist = Dist .Object }) setMethod("Dist", "distGraph", function(object) object@Dist) setMethod("show", "distGraph", function(object) { cat("distGraph with ", attr(object@Dist, "Size"), " nodes \n", sep="")}) setMethod("threshold", "distGraph", function(object, k, value=0) { nd <- object@Dist nd[nd > k ] <- value new("distGraph", Dist=nd) }) setMethod("addNode", c("character", "distGraph", "list"), function(node, object, edges) { gN = nodes(object) nNode = length(gN) nAdd = length(node) numE = sapply(edges, length) if( any(numE != nNode+nAdd) ) stop("must supply all internode distances") newN <- c(gN, node) nmE <- names(edges) if( length(nmE) != nAdd || any(!(names(edges) %in% node))) stop("edges must be named") edges <- edges[node] lapply(edges, function(x) if(any( !(names(x) %in% newN) ) ) stop("bad edge specification")) ordE <- lapply(edges, function(x) x[newN]) subM <- sapply(ordE, function(x) x) ##should be a matrix! oldD <- as.matrix(Dist(object)) f1 <- cbind(oldD, subM[seq_len(nNode),]) f2 <- rbind(f1, t(subM)) rv <- new("distGraph", Dist = as.dist(f2)) }) setMethod("numNodes", "distGraph", function(object) attr(Dist(object), "Size")) setMethod("adj", c("distGraph", "ANY"), function(object, index) { nodenames<- nodes(object) if( is.character(index) ) index <- match(index, nodenames) if( !is.numeric(index) ) stop("'index' not recognized") adjM <- object@Dist[index,] if( is.matrix(adjM) ) adjL <- split(adjM, row(adjM)) else adjL <- list(adjM) for(i in seq_along(adjL)) adjL[[i]] <- names(adjL[[i]])[adjL[[i]] > 0 ] return(adjL) }) setMethod("edges", c("distGraph", "missing"), function(object, which) { nN <- nodes(object) eL <- lapply(nN, function(x) adj(object, x)[[1]]) names(eL) <- nN return(eL) }) setMethod("edges", c("distGraph", "character"), function(object, which) { nN <- nodes(object) wh<-match(which, nN) if( any(is.na(wh)) ) stop("'which' nodes not all in graph") eL <- lapply(which, function(x) adj(object, x)[[1]]) names(eL) <- which eL}) ## FIXME: update for new attribute storage setMethod("edgeWeights", "distGraph", function(object, index, attr, default, type.checker) { edg <- edges(object) if( !missing(index) ) edg <- edg[index] NODES <- nodes(object) edLocs <- match(names(edg), NODES) edE <- lapply(edg, function(x) match(x, NODES)) for( i in seq(along=edLocs) ) edE[[i]] <- object@Dist[edLocs[i], edE[[i]]] names(edE) <- names(edg) edE }) setMethod("subGraph", c("character", "distGraph"), function(snodes, graph) { gN <- nodes(graph) whN <- match(snodes, gN) if( any(is.na(whN) ) ) stop("'snodes' not all in graph") nD <- as.matrix(Dist(graph))[whN, whN] new("distGraph", Dist=as.dist(nD)) }) setMethod("edgeL", "distGraph", function(graph, index) { edges <- edges(graph) edgeL <- mapply(function(x, y, nodes) { out <- list(edges=match(x, nodes), weights=y) }, edges, edgeWeights(graph), MoreArgs=list(nodes=nodes(graph)), SIMPLIFY=FALSE) names(edgeL) <- names(edges) if (! missing(index)) edgeL <- edgeL[[index]] edgeL }) #################################### ##clusterGraph code here #################################### # setMethod("initialize", "clusterGraph", function(.Object, clusters) { # if( is.factor(clusters) ) # clusters = split(names(clusters), clusters) # .Object@clusters = clusters # .Object # }) setMethod("edges", c("clusterGraph", "missing"), function(object, which) { edges<-list() for(clust in object@clusters) { cc <- as.character(clust) for(i in seq(along=cc) ) edges[[cc[i]]] <- cc[-i] } edges}) setMethod("edges", c("clusterGraph", "character"), function(object, which) { nN <- nodes(object) wh <- match(which, nN) if( any(is.na(wh)) ) stop("'which' nodes not all in graph") edges<-list() for(clust in object@clusters) { cc <- intersect(as.character(clust), which) for(i in seq(along=cc) ) edges[[cc[i]]] <- cc[-i] } edges[which]}) setMethod("edgeL", "clusterGraph", function(graph, index) { clusters <- connComp(graph) nodes <- nodes(graph) edgeL <- list() cur <- 1 for (i in seq(along=clusters)) { curClust <- clusters[[i]] for (j in seq(along = curClust)) { edgeL[[cur]] <- list(edges=match(curClust[-j], nodes)) cur <- cur + 1 } } names(edgeL) <- nodes if (! missing(index)) edgeL <- edgeL[[index]] edgeL }) ##FIXME: this should be done from distances, but for now...) ##eg, if a distance matrix was supplied we could use that to define ##edge weights -- as that seems appropriate ## FIXME: update for new attr storage setMethod("edgeWeights", "clusterGraph", function(object, index, attr, default, type.checker) { edg <- edges(object) if( !missing(index) ) edg <- edg[index] ans <- lapply(edg, function(x) { ans <- rep(1, length(x)); names(ans) <- x; ans}) ans}) setMethod("subGraph", c("character", "clusterGraph"), function(snodes, graph) { cList <- graph@clusters cL <- lapply(cList, function(x) intersect(x, snodes)) graph@clusters <- cL graph}) setMethod("numNodes", "clusterGraph", function(object) sum(sapply(object@clusters, length))) setMethod("adj", c("clusterGraph", "ANY"), function(object, index) { nIndex <- length(index) if( any(is.na(match(index, nodes(object)))) ) stop("invalid node label") rval <- vector("list", length=nIndex) names(rval) <- index for(i in seq_len(nIndex)) { for(cl in object@clusters) if( index[i] %in% cl ) rval[[i]] <- cl } return(rval)}) ##for cluster graphs, acc and adj are the same setMethod("acc", c("clusterGraph", "character"), function(object, index) { nIndex <- length(index) if( any(is.na(match(index, nodes(object)))) ) stop("invalid node label") rval <- vector("list", length=nIndex) names(rval) <- index for(i in seq_len(nIndex)) { for(cl in object@clusters) if( index[i] %in% cl ) rval[[i]] <- cl } return(rval)}) setMethod("connComp", "clusterGraph", function(object) object@clusters) setMethod("show", "clusterGraph", function(object) { numNull<-numNoEdges(object) numNodes<- numNodes(object) numEdge<-numEdges(object) cat("A graph with ", edgemode(object), " edges\n") cat("Number of Nodes = ",numNodes,"\n",sep="") cat("Number of Edges = ",numEdge,"\n",sep="") }) setAs(from="clusterGraph", to="matrix", function(from, to) { theNodes <- nodes(from) # will be grouped by cluster! numNodes <- length(theNodes) m <- matrix(0, nrow=numNodes, ncol=numNodes, dimnames=list(theNodes, theNodes)) for (clust in from@clusters) { idx <- match(clust, theNodes) m[idx, idx] <- 1 } diag(m) <- 0 # eliminate self-loops m }) graph/R/edgefunctions.R0000644000175400017540000001202413175713336016072 0ustar00biocbuildbiocbuild################################################################ # function: # aveNumEdges takes one parameter: # objgraph is the graph object # aveNumEdges counts the number of edges in the graph and divides # that by the number of nodes in the graph to give the # average number of edges. A double representing the average # number of edges will be returned. # # created by: Elizabeth Whalen # last updated: July 22, 2002 ################################################################ aveNumEdges<-function(objgraph) numEdges(objgraph)/length(nodes(objgraph)) ################################################################ # function: # calcProb takes two parameters: # origgraph is the original graph from which the subgraph was made # subgraph is the subgraph made from the original graph # calcProb calculates the probability of having the number of edges # found in the subgraph given that it was made from origgraph. # The hypergeometric distribution is used to calculate the # probability (using the pdf). # # created by: Elizabeth Whalen # last updated: July 22, 2002 ################################################################ calcProb <- function(subgraph, origgraph) { origNumNodes<-length(nodes(origgraph)) subNumNodes<-length(nodes(subgraph)) origNumEdges<-numEdges(origgraph) subNumEdges<-numEdges(subgraph) dyads <- (origNumNodes * (origNumNodes - 1) / 2) - origNumEdges sampledyads <- subNumNodes * (subNumNodes - 1) / 2 prob<-dhyper(subNumEdges,origNumEdges,dyads,sampledyads) prob } ################################################################ # function: # calcSumProb takes two parameters: # g is the original graph from which the subgraph was made # sg is the subgraph made from the original graph # calcSumProb calculates the probability of having greater than or equal # to the number of edges found in the subgraph given that it was made # from origgraph. # The hypergeometric distribution is used to calculate the summed # probability (using the cdf). # # notes: This calculates the upper tail of the hypergeometric # distribution. # # created by: Elizabeth Whalen # last updated: July 22, 2002 ################################################################ calcSumProb <- function(sg, g) { origNumNodes<-length(nodes(g)) #g subNumNodes<-length(nodes(sg)) #gs origNumEdges<-numEdges(g) #L subNumEdges<-numEdges(sg) #Ls dyads <- (origNumNodes * (origNumNodes - 1) / 2) - origNumEdges sampledyads <- subNumNodes * (subNumNodes - 1) / 2 prob<-phyper(subNumEdges,origNumEdges,dyads,sampledyads,lower.tail=FALSE) prob } ################################################################ # function: # mostEdges takes one parameter: # objGraph is the graph object # mostEdges finds the node that has the most edges in the graph. # The index of the node, the node id (ex. affy id, locus # link id, ...), and the number of edges for that node is returned # in a list. # # created by: Elizabeth Whalen # last updated: August 2, 2002 ################################################################ mostEdges<-function(objGraph) { oEdges<-edges(objGraph) lens <- sapply(oEdges, length) mx <- max(lens) return(names(oEdges)[match(mx, lens)]) } ################################################################ # function: # numNoEdges takes one parameter: # objGraph is the graph object # numNoEdges calculates the number of nodes that have an edge list # of NULL (i.e. no edges) and returns an integer representing # the number of NULL edge lists in the graph. # # created by: Elizabeth Whalen # last updated: July 22, 2002 ################################################################ numNoEdges<-function(objGraph) { els <- sapply(edges(objGraph), length) sum(els==0) } ########################################################## ##RG/2003 ########################################################## ##listEdges: list all edges for every pair of nodes in the graph ##so if there N nodes then there are N choose 2 possible entries ##dropNULL=T/F says whether to drop those pairs with no edges listEdges <- function(object, dropNULL=TRUE) { if( !is(object, "graphNEL") ) stop("'listEdges' only works for graphNEL objects") Nd <- nodes(object) Nn <- length(Nd) EL <- object@edgeL eList <- NULL for(i in seq_len(Nn)) { Node <- Nd[i] ELi <- EL[[i]] for( j in seq(along=ELi$edges) ) { toN <- Nd[ELi$edges[j]] btwn <- paste(sort(c(Node, toN)), collapse=":") newN <-new("simpleEdge", bNode=Node, eNode=toN, weight=if( is.null(ELi$weights[j])) 1 else ELi$weights[j] , directed = edgemode(object)=="directed", edgeType=if(is.null(ELi$type[j])) "" else ELi$type[j]) if( is.null(eList[[btwn]]) ) eList[[btwn]] <- list(newN) else eList[[btwn]] <- list(eList[[btwn]], newN ) } } return(eList) } listLen <- function(list) .Call(graph_listLen, list) graph/R/graph-constructors.R0000644000175400017540000000102313175713336017101 0ustar00biocbuildbiocbuild# constructors for two subclasses of graph: graphNEL, graphAM # graphNEL <- function (nodes=character(), edgeL=list(), edgemode='undirected') { new("graphNEL", nodes=nodes, edgeL=edgeL, edgemode=edgemode) } graphAM <- function (adjMat=matrix(integer(), 0, 0), edgemode='undirected', values=NA) { if (length (values) == 1L && is.na (values)) new("graphAM", adjMat=adjMat, edgemode=edgemode) else new("graphAM", adjMat=adjMat, edgemode=edgemode, values=values) } graph/R/graphNEL.R0000644000175400017540000005105113175713336014700 0ustar00biocbuildbiocbuildvalidGraph<-function(object, quietly=FALSE) { ## FIXME: we are doing if/else branching here on ## specific subclasses of graph. We should make this a generic ## so we can organize checking. Also, graphAM is not ## currently being checked in any way. bad = FALSE if (is(object, "graphNEL")) { objEdges<-edges(object) objNodes<-nodes(object) if (any(is.na(objNodes))) { if (!quietly ) cat("NA element in nodes.\n") bad <- TRUE } if(length(objEdges)>0) if(any(is.na(unlist(objEdges,use.names=FALSE)))) { if(!quietly) cat("NA element in edges.\n") bad <- TRUE } ##don't think we want to force this one ## if (length(objNodes)!=length(objEdges)) { ## if( !quietly ) ## cat("Nodes and edges must have the same length.\n") ## bad <- TRUE ## } if (!all( names(objEdges) %in% objNodes )) { if( !quietly ) cat("Edges don't have the same names as the nodes.\n") bad <- TRUE } if (any(duplicated(objNodes))) { if( !quietly ) cat("Node names may not be duplicated\n") bad <- TRUE } ##check for reciprocity in undirected graphs ##paste to->from and from->to if any are not duplicated then ##the edge is not reciprocal. Note we are not going to handle ##multiedges well. if(edgemode(object) == "undirected" && length(objEdges)>0 ) { fr <- rep(names(objEdges), sapply(objEdges, length)) to <- unlist(objEdges) frto <- paste(fr, to, sep=EDGE_KEY_SEP) tofr <- paste(to, fr, sep=EDGE_KEY_SEP) badEdges <- setdiff(tofr, frto) if (length(badEdges) > 0) { if (!quietly) { cat("the graph is undirected and the following edges", "are not reciprocated:\n", pasteq(badEdges), "\n\n") } bad <- TRUE } } } else if( is(object, "distGraph") ) { if( is(object@Dist, "dist") ) return(TRUE) else return(FALSE) } return(!bad) } setMethod("initialize", "graphNEL", function(.Object, ...) { .Object <- callNextMethod() validObject(.Object) return(.Object) }) graphNEL_init_edges_nested <- function(nodes, edgeL) { if(length(nodes) != length(edgeL) ) stop("'nodes' and 'edgeL' must have same length") nameE <- names(edgeL) if( !is.null(nameE) && !all( nameE %in% nodes) ) stop("'edgeL' names must agree with 'nodes'") if( !is.null(nameE) ) edgeL <- edgeL[nodes] edgeL <- lapply(edgeL, function(x) { if (is.character(x$edges)) x$edges <- match(x$edges, nodes) if (is.null(x) || is.null(x$edges)) x <- list(edges=numeric(0)) x }) edgeL } graphNEL_init_edgeL_weights <- function(gnel) { defaultWeight <- 1 edgeDataDefaults(gnel, attr="weight") <- defaultWeight edgeL <- gnel@edgeL wts <- unlist(lapply(edgeL, function(x) { w <- x$weights if (is.null(w) || length(w) == 0) return(rep(defaultWeight, length(x$edges))) w })) if (!is.numeric(wts)) stop("weights in edgeL must be numeric") eSpec <- .getAllEdges(gnel) from <- eSpec$from to <- eSpec$to edgeData(gnel, from=from, to=to, attr="weight") <- wts ## remove weights, since now stored in the edgeData edgeL <- lapply(edgeL, function(x) x["edges"]) gnel@edgeL <- edgeL gnel } graphNEL_init_edges <- function(nodes, edges) { nameE <- names(edges) if (is.null(nameE) || !all(nameE %in% nodes)) stop("'edges' names must agree with 'nodes'") if (any(unlist(lapply(edges, is.list)))) stop("'edges' must be list of character()") ##merge all edges with same names if(any(duplicated(nameE))){ edges <- split(edges, nameE) edges <- lapply(edges, unlist) nameE <- names(edges) } ##melt list m <- sapply(edges, length) n <- m > 0 els <- edges[n] edgeF <- rep(names(els), m[n]) edgeT <- unlist(els) edgeL <- unname(cbind(edgeF, edgeT)) if(sum(n)>0){ eL <- match(edgeL[, 2], nodes) edgeL <- split(eL, edgeL[, 1]) edgeL <- c(edgeL, lapply(edges[!n], function(x) integer(0))) }else{ edgeL <- lapply(edges, function(x) integer(0)) } edgeL <- edgeL[nameE] edgeL <- lapply(edgeL, function(x) list(edges=x)) edgeL } setMethod("initialize", "graphNEL", function(.Object, nodes=character(0), edgeL, edgemode) ## FIXME: what about edge weights? { if (length(nodes)) checkValidNodeName(nodes) if( missing(edgemode) ) edgemode <- "undirected" doWeights <- FALSE if (missing(edgeL) || (!is.null(edgeL) && length(edgeL) == 0)) { edgeL <- vector(mode="list", length=length(nodes)) names(edgeL) <- nodes } else { ## which list structure was used? edgeParser <- graphNEL_init_edges firstVal <- edgeL[[1]] if (is.null(firstVal)) stop("'edgeL' must be list of character or list of lists, got NULL") if (length(edgeL) > 0 && is.list(edgeL[[1]])) { edgeParser <- graphNEL_init_edges_nested doWeights <- TRUE } edgeL <- edgeParser(nodes, edgeL) } .Object@nodes <- nodes .Object@edgeL <- edgeL .Object@graphData$edgemode <- edgemode validObject(.Object) if (doWeights) .Object <- graphNEL_init_edgeL_weights(.Object) return(.Object) }) ##the graphNEL representation stores edges as indexes into the ##node label vector setMethod("edges", c("graphNEL", "missing"), function(object, which) { gNodes <- object@nodes lapply(object@edgeL, function(x) gNodes[x$edges])}) setMethod("edges", c("graphNEL", "character"), function(object, which) { gNodes <- nodes(object) lapply(object@edgeL[which], function(x) gNodes[x$edges])}) setMethod("adj", c("graphNEL", "ANY"), function(object, index) { initI <- as.character(index) nd <- nodes(object) if( is.character(index) ) index <- match(index, nd) if( is.na(index) || index < 0 || index > length(nd) ) stop("vertex is not in graph: ", sQuote(initI)) edges(object)[index]}) setMethod("edgeL", "graphNEL", function(graph, index) { if( missing(index) ) graph@edgeL else graph@edgeL[index]}) setMethod("subGraph", signature(snodes="character", graph="graphNEL"), function(snodes, graph) { origNodes <- nodes(graph) snodesIdx <- match(snodes, origNodes) if (any(is.na(snodesIdx))) { bad <- snodes[which(is.na(snodesIdx))] stop("'snodes' contains nodes not in graph: ", pasteq(bad)) } killedNodes <- origNodes[-snodesIdx] newEdges <- lapply(edges(graph)[snodes], function(x) { whD <- match(killedNodes, x, nomatch=0) if (any(whD)) x[-whD] else x }) ans <- graphNEL(nodes=snodes, edgeL=newEdges, edgemode=edgemode(graph)) ## FIXME: need to clean the attributes, right now we are passing ## too much. nodeIdx <- match(snodes, names(graph@nodeData), 0) ans@nodeData@defaults <- graph@nodeData@defaults ans@nodeData@data <- graph@nodeData@data[nodeIdx] ee <- .getAllEdges(ans) if (length(ee$from) && length(ee$to)) { kk <- .makeEdgeKeys(ee$from, ee$to) whkk <- match(kk, names(graph@edgeData), 0) ans@edgeData@defaults <- graph@edgeData@defaults ans@edgeData@data <- graph@edgeData@data[whkk] } ans }) setMethod("numNodes", "graphNEL", function(object) length(object@nodes)) setMethod("addNode", signature(node="character", object="graphNEL", edges="missing"), function(node, object, edges) { gN = nodes(object) already <- match(node, gN) if( any(!is.na(already)) ) stop("node(s) already in graph: ", pasteq(gN[already])) checkValidNodeName(node) ## add them on the end so we don't renumber gN = c(gN, node) edgeL <- object@edgeL nEd <- vector("list", length=length(node)) names(nEd) <- node for(i in seq(along=nEd)) nEd[[i]] <- list(edges=numeric(0)) edgeL <- c(edgeL, nEd) object@nodes <- gN object@edgeL <- edgeL object }) ##they need to supply a list of edges, one for each element of node ##it might be better to do this by first adding the nodes then ##calling addEdges on that graph setMethod("addNode", signature(node="character", object="graphNEL", edges="list"), function(node, object, edges) { ## first add the nodes, it does the checking too object <- addNode(node, object) ## now add the edges: if (!all(names(edges) == node)) stop("'edges' must be named and in the same order as nodes") doWeights <- FALSE newEdges <- lapply(edges, function(x) { if (is.character(x)) x else if (is.numeric(x)) { doWeights <<- TRUE ## set flag in function scope if (length(x) == 0) enms <- character(0) else enms <- names(x) if (is.null(enms)) stop("'edges' must be character or have names ", "corresponding to nodes") enms } else { stop("'edges' must be character or numeric list elements") } }) for (i in seq(along=newEdges)) { if (length(newEdges[[i]]) == 0) next if (doWeights) object <- addEdge(from=node[i], to=newEdges[[i]], object, weights=edges[[i]]) else object <- addEdge(from=node[i], to=newEdges[[i]], object) } object }) setMethod("removeNode", c("character", "graphNEL"), function(node, object) { ##first clear the node -- does the checking too object <- clearNode(node, object) nN <- nodes(object) wh <- match(node, nN) gN <- nN[-wh] nE <- object@edgeL[-wh] ## Now renumber the nodes as stored in the edgelist nE2 <- lapply(nE, function(el) { oldN <- nN[el$edges] el$edges <- match(oldN, gN) el }) object@nodes <- gN object@edgeL <- nE2 object }) setMethod("clearNode", c("character", "graphNEL"), function(node, object) { gN <- nodes(object) whN <- match(node, gN) if(any(is.na(whN)) ) stop("'node' not in graph: ", pasteq(gN[is.na(whN)])) ## clear node attributes object <- clearNodeData(object, node) object <- .dropEdges(object, whN) object@edgeL[whN] <- list(list(edges=numeric(0))) object }) edgeKiller <- function(edgeL, from, whichKill) { for (i in seq(along=from)) { toKill <- whichKill[[i]] toKill <- toKill[!is.na(toKill)] if (length(toKill) == 0) stop("no edge 'from' ", sQuote(from[i]), " to remove") edgeL[[from[i]]]$edges <- edgeL[[from[i]]]$edges[-toKill] } edgeL } setMethod("removeEdge", signature(from="character", to="character", graph="graphNEL"), function(from, to, graph) { gN <- nodes(graph) wh <- match(c(from, to), gN) if( any(is.na(wh)) ) stop("'from' or 'to' not in graph: ", pasteq(unique(wh[is.na[wh]]))) if (length(to) == 1) to <- rep(to, length(from)) if (length(from) == 1) from <- rep(from, length(to)) if (!isDirected(graph)) { fromOrig <- from from <- c(fromOrig, to) to <- c(to, fromOrig) remove(fromOrig) } graph <- clearEdgeData(graph, from, to) remEL <- split(to, from) fromU <- names(remEL) nE <- edges(graph, fromU) whD <- mapply(function(x, y) match(x, y), remEL, nE, SIMPLIFY=FALSE) graph@edgeL <- edgeKiller(graph@edgeL, fromU, whD) graph }) setMethod("addEdge", signature=signature(from="character", to="character", graph="graphNEL", weights="numeric"), function(from, to, graph, weights) { graph <- addEdge(from, to, graph) if (!("weight" %in% names(edgeDataDefaults(graph)))) edgeDataDefaults(graph, attr="weight") <- 1L edgeData(graph, from=from, to=to, attr="weight") <- weights graph }) setMethod("addEdge", signature=signature(from="character", to="character", graph="graphNEL", weights="missing"), function(from, to, graph) { preEdges <- isAdjacent(graph, from, to) if (any(preEdges)) { preFr <- from[preEdges] preTo <- to[preEdges] preEdges <- paste(preFr, preTo, sep=EDGE_KEY_SEP) warning("edges replaced: ", pasteq(preEdges)) } gN <- nodes(graph) whF <- match(from, gN) if( any(is.na(whF)) ) stop("not a node: ", pasteq(from[is.na(whF)])) whT <- match(to, gN) if( any(is.na(whT)) ) stop("not a node: ", pasteq(to[is.na(whT)])) ##roll out the shorter one lenT <- length(to) lenF <- length(from) if( lenT > lenF ) { from <- rep(from, lenT) whF <- rep(whF, lenT) } if( lenF > lenT ) { whT <- rep(whT, lenF) to <- rep(to, lenF) } ##now the same lenN <- max(lenT, lenF) eL <- graph@edgeL for(i in seq_len(lenN)) { old <- eL[[from[i]]] ## remove duplicate edges old$edges <- unique(c(old$edges, whT[i])) eL[[from[i]]] <- old } ##if undirected, then we need to go in both directions if( edgemode(graph) == "undirected") for(i in seq_len(lenN)) { old <- eL[[to[i]]] ## remove duplicate edges old$edges <- unique(c(old$edges, whF[i])) eL[[to[i]]] <- old } graph@edgeL <- eL ##FIXME: should we call validObject here? graph }) ## Collapse a set of nodes and the corresponding edges setMethod("combineNodes", c("character", "graphNEL", "character"), function(nodes, graph, newName, collapseFunction=sum) { if( length(newName) > 1 ) stop("'newName' must have length 1") gN <- nodes(graph) whN <- match(nodes, gN) if( anyNA(whN) ) stop("not a node: ", pasteq(nodes[is.na(whN)])) eL <- graph@edgeL outE <- eL[nodes] if( length(nodes) == 1 ) { warning("nothing to collapse") return(graph) } ##function to collapse weights for combined edges collapseFunction <- match.fun(collapseFunction) ##if undirected then we know everything inE <- if( edgemode(graph) == "directed" ) inEdges(nodes, graph) else NULL g2 <- removeNode(nodes, graph) g2 <- addNode(newName, g2) oE <- gN[unlist(lapply(outE[nodes], "[[", "edges"), use.names=FALSE)] oW <- unlist(edgeWeights(graph, nodes), use.names=FALSE) if (is.null(oW)) oW <- rep(1, length(oE)) toW <- tapply(oW, oE, collapseFunction)[setdiff(unique(oE), nodes)] ##there might be no edges to add if(length(toW)) g2 <- addEdge(newName, names(toW), g2, as.numeric(toW)) ##if directed we need to fix up the incoming edges if( !is.null(inE) ) { inE <- lapply(inE, setdiff, nodes) inEl <- unique(unlist(inE), use.names=FALSE) oW <- as.numeric(sapply(edgeWeights(graph, inEl), function(x) collapseFunction(x[intersect(names(x), nodes)]))) if(length(inEl)) g2 <- addEdge(inEl, newName, g2, oW) } g2 }) ##inEdges returns a list of all nodes with edges ##to the nodes in "node" setMethod("inEdges", c("missing", "graphNEL"), function(node, object) inEdges(nodes(object), object)) ##seems more sensible - if there is only one arg setMethod("inEdges", c("graphNEL", "missing"), function(node, object) inEdges(nodes(node), node)) setMethod("inEdges", c("character", "graphNEL"), function(node, object) { gN <- nodes(object) whN <- match(node, gN) if( any(is.na(whN)) ) stop("not a node: ", pasteq(node[is.na(whN)])) nN <- length(node) rval <- vector("list", length=nN) names(rval) <- node eL <- object@edgeL for (i in seq_len(nN)) { whOnes <- sapply(eL, function(x) { if (whN[i] %in% x$edges) return(TRUE) FALSE }) rval[[i]] <- gN[whOnes] } rval }) .dropEdges <- function(self, x) { ## Remove all edges in graphNEL self to node with ## index x. Also remove all edges from node with index x. ## Return the modified graphNEL. ## Removing edges also removes the associated attributes. oldEdgeL <- self@edgeL newEdgeL <- vector(mode="list", length=length(oldEdgeL)) names(newEdgeL) <- names(oldEdgeL) nds <- nodes(self) for (i in seq(along=nds)) { toList <- oldEdgeL[[i]]$edges if (i %in% x) { to <- nds[toList] if (length(to)) self <- clearEdgeData(self, from=nds[i], to=to) toList <- list(edges=numeric(0)) } else { bad <- match(x, toList) bad <- bad[!is.na(bad)] if (length(bad)) { self <- clearEdgeData(self, from=nds[i], to=nds[toList[bad]]) toList <- list(edges=toList[-bad]) } else { toList <- list(edges=toList) } } newEdgeL[[nds[i]]] <- (toList) } self@edgeL <- newEdgeL self } ##a leaf is an element of the graph with in edges and no out ## edges - the edgeL list in a directed graphNEL list the out ##edges inOutCounts <- function(object) { if(!(edgemode(object)) == "directed") stop("only for directed graphs") numOut=sapply(object@edgeL, function(x) length(x$edges)) inEdges = nodes(object)[unlist(sapply(object@edgeL, function(x) x$edges))] numIn = table(inEdges) return(list(numOut = numOut, numIn = numIn)) } ##FIXME: this is a replacement for the inEdges function - ##it needs to be tested and made to handle a list of ##nodes to find in edges - but that can easily be done ##simply by computing all and then subsetting inE <- function(object) { if(!(edgemode(object)) == "directed") stop("only for directed graphs") inEdges = nodes(object)[unlist(sapply(object@edgeL, function(x) x$edges))] numE = sapply(object@edgeL, function(x) length(x$edges)) froms = rep(names(object@edgeL), numE) split(froms, inEdges) } graph/R/graphfunctions.R0000644000175400017540000002156213175713336016276 0ustar00biocbuildbiocbuild################################################################ # function: # boundary takes two parameters: # graph is the original graph from which the subgraph will be created # subgraph either the subgraph or the nodes of the subgraph # boundary returns a list of length equal to the number of nodes in the # subgraph. Each element is a list of the nodes in graph # # created by: Elizabeth Whalen # last updated: Feb 15, 2003, RG ################################################################ boundary<-function(subgraph, graph) { if ( !is(graph, "graph") ) stop("'graph' must be an object of type graph") if( is(subgraph, "graph") ) snodes <- nodes(subgraph) else if( is.character(subgraph) ) snodes <- subgraph else stop("'subgraph' type incorrect") if( any( !(snodes %in% nodes(graph)) ) ) stop("some nodes not in graph") subE <- inEdges(graph)[snodes] lapply(subE, function(x) x[!(x %in% snodes)] ) } ##check to see if any edges are duplicated, as we often don't have ##good ways to deal with that duplicatedEdges <- function(graph) { if( !is(graph, "graphNEL") ) stop("only graphNEL supported") for(e in graph@edgeL) if( any(duplicated(e$edges)) ) return(TRUE) return(FALSE) } ugraphOld <- function() { .Defunct("ugraph") } setMethod("ugraph", "graph", function(graph) { if (!isDirected(graph)) return(graph) eMat <- edgeMatrix(graph) ## add recip edges eMat <- cbind(eMat, eMat[c(2, 1), ]) ## put into graphNEL edgeL format eL <- lapply(split(as.vector(eMat[2, ]), as.vector(eMat[1, ])), function(x) list(edges=unique(x))) theNodes <- nodes(graph) ## some nodes may be missing names(eL) <- theNodes[as.integer(names(eL))] ## add empty edge list for nodes with no edges noEdgeNodes <- theNodes[!(theNodes %in% names(eL))] noEdges <- lapply(noEdgeNodes, function(x) list(edges=numeric(0))) names(noEdges) <- noEdgeNodes ## FIXME: should we skip standard initialize for speed? ## need to copy over at least the nodeData... graphNEL(nodes=theNodes, edgeL=c(eL, noEdges), edgemode="undirected") }) setMethod("edgeMatrix", c("graphNEL", "ANY"), function(object, duplicates=FALSE) { ## Return a 2 row numeric matrix (from, to, weight) ed <- object@edgeL ##reorder to the same order as nodes ed <- ed[nodes(object)] nN <- length(ed) eds<-lapply(ed, function(x) x$edges) elem <- listLen(eds) from <- rep(seq_len(nN), elem) to <- unlist(eds, use.names=FALSE) ans <- rbind(from, to) ##we duplicate edges in undirected graphNEL ##so here we remove them if( edgemode(object) == "undirected" && !duplicates) { swap <- from>to ans[1,swap]<-to[swap] ans[2,swap]<-from[swap] t1 <- paste(ans[1,], ans[2,], sep="+") ans <- ans[ ,!duplicated(t1), drop=FALSE] } ans }) setMethod("edgeMatrix", c("clusterGraph", "ANY"), function(object, duplicates) { cls<-object@clusters nd <- nodes(object) ans <- numeric(0) for(cl in cls) { idx <- match(cl, nd) nn <- length(idx) v1 <- rep(idx[-nn], (nn-1):1) v2 <- numeric(0) for( i in 2:nn) v2 <- c(v2, i:nn) v2 <- idx[v2] ta <- rbind(v1, v2) if( is.matrix(ans) ) ans <- cbind(ans, rbind(v1, v2)) else ans <- rbind(v1, v2) } dimnames(ans) <- list(c("from", "to"), NULL) ans }) setMethod("edgeMatrix", c("distGraph", "ANY"), function(object, duplicates) { ## Return a 2 row numeric matrix (from, to, weight) ed <- edges(object) ##reorder to the same order as nodes NODES <- nodes(object) ed <- ed[NODES] nN <- length(ed) elem <- listLen(ed) from <- rep(seq_len(nN), elem) to <- match(unlist(ed), NODES) ans <- rbind(from, to) ##we duplicate edges in undirected graphNEL ##so here we remove them ##FIXME: see graphNEL for a speedup of this part if( edgemode(object) == "undirected" && !duplicates) { t1 <- apply(ans, 2, function(x) {paste(sort(x), collapse="+")}) ans <- ans[ ,!duplicated(t1), drop=FALSE] } ans }) setMethod("edgeMatrix", "graphAM", function(object, duplicates=FALSE) { to <- apply(object@adjMat, 1, function(x) which(x != 0)) from <- rep(seq_len(numNodes(object)), listLen(to)) to <- unlist(to, use.names=FALSE) ans <- rbind(from=from, to=to) ## we duplicate edges in undirected graphs ## so here we remove them if (!isDirected(object) && !duplicates) { swap <- from > to ans[1, swap] <- to[swap] ans[2, swap] <- from[swap] t1 <- paste(ans[1, ], ans[2, ], sep="+") ans <- ans[ , !duplicated(t1), drop=FALSE] } ans }) ##it seems to me that we might want the edge weights for ##a given edgeMatrix and that that would be much better done ##in the edgeMatrix function ##we are presuming that eM has integer offsets in it ##eWV <- function(g, eM, sep=ifelse(edgemode(g)=="directed", "->", ## "--")) ##{ ## unE <- unique(eM[1,]) ## edL <- g@edgeL ## eE <- lapply(edL, function(x) x$edges) ## eW <- lapply(edL, function(x) { ## ans = x$weights ## ed = length(x$edges) ## if( is.null(ans) && ed > 0 ) ## ans = rep(1, ed) ## ans}) ## ## nr <- listLen(eE) ## ##now we can subset - ## eMn <- paste(rep((1:length(nr))[unE],nr[unE]), unlist(eE[unE]), sep=sep) ## eWv <- unlist(eW[unE]) ## dE <- paste(eM[1,], eM[2,], sep=sep) ## wh<-match(dE, eMn) ## if(any(is.na(wh)) ) ## stop("edges in supplied edgematrix not found") ## ans <-eWv[wh] ## names(ans) <- eMn[wh] ## ans ##} #eWV <- function(g, eM, sep=ifelse(edgemode(g)=="directed", "->", # "--")) #{ # edL <- g@edgeL # ##fix up the edgeweights so we really find them # eW <- lapply(edL, function(x) { # ans = x$weights # ed = length(x$edges) # if( is.null(ans) && ed > 0 ) # ans = rep(1, ed) # if( length(ans) > 0 ) # names(ans) = x$edges # ans}) # # a1 <- apply(eM, 2, # function(x) eW[[x[1]]][as.character(x[2])]) # names(a1) <- paste(eM[1,], eM[2,], sep=sep) # return(a1) #} eWV <- function (g, eM, sep = ifelse(edgemode(g) == "directed", "->", "--"), useNNames = FALSE) { # returns vector of weights. default has names equal to node # indices, but useNNames can be set to put node names as names # of corresponding weights # n <- nodes(g) from <- n[eM["from", ]] to <- n[eM["to", ]] eW <- tryCatch(edgeData(g, from=from, to=to, attr="weight"), error=function(e) { edgeDataDefaults(g, "weight") <- 1L edgeData(g, from=from, to=to, attr="weight") }) eW <- unlist(eW) if (!useNNames) nms <- paste(eM["from", ], eM["to", ], sep=sep) else nms <- paste(from, to, sep=sep) names(eW) <- nms eW } pathWeights <- function (g, p, eM = NULL) { # # a path is a vector of names of adjacent nodes # we form the vector of steps through the path # (pairs of adjacent nodes) and attach the weights # for each step. no checking is done to verify # that the path p exists in g # if (length(p) < 2) stop("'p' has length < 2") if (is.null(eM)) eM <- edgeMatrix(g) wv <- eWV(g, eM, useNNames = TRUE) sep <- ifelse(edgemode(g) == "undirected", "--", "->") pcomps <- cbind(p[-length(p)], p[-1]) if (edgemode(g) == "undirected") pcomps <- rbind(pcomps, pcomps[,c(2,1)]) # don't know node order in wv labels inds <- apply(pcomps, 1, function(x) paste(x[1], x[2], sep = sep)) tmp <- wv[inds] tmp[!is.na(tmp)] } graph/R/gxlReader.R0000644000175400017540000002353113175713336015157 0ustar00biocbuildbiocbuildgraphNELhandler <- function () { ## ## this function is to work with omegahat's XML xmlEventParse ## current version: given a GXL graph, capture the node names and ## edge data to return the graph as graph::graphNEL ## graphID <- NULL curNode <- NULL curEdge <- NULL curAttr <- NULL inNode <- FALSE inEdge <- FALSE inAttr <- FALSE inInt <- FALSE inFloat <- FALSE inBool <- FALSE g <- graphNEL() nodeL <- list() edgeL <- list() edgemode <- NULL ## ## handler elements: start elements are cased for ## graph, node, attr, or edge ## text is limited in the simple example to the attr tag, ## which lives under a node or an edge ## startElement <- function(x, atts, ...) { if (x == "graph") { graphID <<- atts["id"] eMode <- atts["edgemode"] if (!is.na(eMode)) { if (eMode %in% c("undirected", "defaultundirected")) edgemode(g) <<- "undirected" else edgemode(g) <<- "directed" ## not sure we'll need this } else { ## default is directed for GXL edgemode(g) <<- "directed" } edgemode <<- atts["edgemode"] } else if (x == "node") { inNode <<- TRUE theNode <- as.character(atts["id"]) if (! (theNode %in% nodes(g))) g <<- addNode(theNode, g) nodeL[[theNode]] <<- list() curNode <<- theNode } else if (x == "attr") { inAttr <<- TRUE curAttr <<- atts["name"] } else if (x == "edge") { inNode <<- FALSE inEdge <<- TRUE from <- as.character(atts["from"]) to <- as.character(atts["to"]) if (!(from %in% nodes(g))) g <<- addNode(from, g) if (!(to %in% nodes(g))) g <<- addNode(to, g) g <<- addEdge(from=from, to=to, g) edgeL[[atts["id"]]] <<- list() edgeL[[atts["id"]]][["span"]] <<- c(from, to) curEdge <<- list(from=from, to=to) } else if (x == "int") { inInt <<- TRUE } else if (x == "float") { inFloat <<- TRUE } else if (x == "bool") { inBool <<- TRUE } } text <- function(x, atts, ...) { if (inAttr && nchar(x) > 0) { if (inInt) x <- as.integer(x) if (inFloat) x <- as.double(x) if (inBool) { if (identical(x, "true")) x <- TRUE else if (identical(x, "false")) x <- FALSE else stop("bad bool value: ", x) } if (inNode) { if (!(curAttr %in% nodeDataDefaults(g))) nodeDataDefaults(g, curAttr) <<- NA nodeData(g, curNode, curAttr) <<- x } else if (inEdge) { if (!(curAttr %in% edgeDataDefaults(g))) edgeDataDefaults(g, curAttr) <<- NA edgeData(g, from=curEdge$from, to=curEdge$to, curAttr) <<- x } } } endElement <- function(x, ...) { if (x == "attr") inAttr <<- FALSE else if (x == "node") inNode <<- FALSE else if (x == "edge") inEdge <<- FALSE else if (x == "int") inInt <<- FALSE else if (x == "float") inFloat <<- FALSE else if (x == "bool") inBool <<- FALSE } dump <- function() { list(graphID = graphID, nodeL = nodeL, edgeL = edgeL, edgemode = edgemode) } asGraphNEL <- function() { if (!validGraph(g)) { msg <- "GXL did not define a valid graph package graphNEL object. Most likely there is a failure of reciprocity for edges in an undirected graph. If there is a node for edge from A to B in an undirected graphNEL, there must also be an edge from B to A." stop(paste0(c("", strwrap(msg)), collapse="\n")) } return(g) } list(startElement = startElement, endElement = endElement, text = text, dump = dump, asGraphNEL = asGraphNEL) } graph_handler <- function () { ## ## this function is to work with omegahat's XML xmlEventParse ## current version: given a GXL graph, capture the node names and ## edge data to return the graph as graph::graphNEL ## all_nodes_e <- new.env(parent=emptyenv(), hash=TRUE) node_data_e <- new.env(parent=emptyenv(), hash=TRUE) node_defaults_e <- new.env(parent=emptyenv(), hash=TRUE) edge_data_e <- new.env(parent=emptyenv(), hash=TRUE) edge_defaults_e <- new.env(parent=emptyenv(), hash=TRUE) from_e <- new.env(parent=emptyenv(), hash=TRUE) to_e <- new.env(parent=emptyenv(), hash=TRUE) nodeCount <- 0L edgeCount <- 0L graphID <- NULL curNode <- NULL curAttr <- NULL inNode <- FALSE inEdge <- FALSE inAttr <- FALSE inInt <- FALSE inFloat <- FALSE inBool <- FALSE edgemode <- NULL add_node <- function(theNode) { if (!exists(theNode, all_nodes_e)) { nodeCount <<- nodeCount + 1L all_nodes_e[[theNode]] <- nodeCount } } add_edge <- function(from, to) { edgeCount <<- edgeCount + 1L ## FIXME: check for dup edge? k <- as.character(edgeCount) from_e[[k]] <- from to_e[[k]] <- to } ## ## handler elements: start elements are cased for ## graph, node, attr, or edge ## text is limited in the simple example to the attr tag, ## which lives under a node or an edge ## startElement <- function(x, atts, ...) { if (x == "graph") { if (!is.null(graphID)) stop("multiple graphs not supported") graphID <<- atts["id"] eMode <- atts["edgemode"] if (!is.na(eMode)) { if (eMode %in% c("undirected", "defaultundirected")) edgemode <<- "undirected" else edgemode <<- "directed" ## not sure we'll need this } else { ## default is directed for GXL edgemode <<- "directed" } } else if (x == "node") { inNode <<- TRUE theNode <- as.character(atts["id"]) add_node(theNode) curNode <<- theNode } else if (x == "attr") { inAttr <<- TRUE curAttr <<- atts["name"] } else if (x == "edge") { inNode <<- FALSE inEdge <<- TRUE from <- as.character(atts["from"]) to <- as.character(atts["to"]) add_node(from) add_node(to) add_edge(from, to) } else if (x == "int") { inInt <<- TRUE } else if (x == "float") { inFloat <<- TRUE } else if (x == "bool") { inBool <<- TRUE } } text <- function(x, atts, ...) { if (inAttr && nchar(x) > 0) { if (inInt) x <- as.integer(x) if (inFloat) x <- as.double(x) if (inBool) { if (identical(x, "true")) x <- TRUE else if (identical(x, "false")) x <- FALSE else stop("bad bool value: ", x) } if (inNode) { node_defaults_e[[curAttr]] <- as.character(NA) nattrs <- node_data_e[[curNode]] if (!length(nattrs)) nattrs <- list() nattrs[[curAttr]] <- x node_data_e[[curNode]] <- nattrs } else if (inEdge) { edge_defaults_e[[curAttr]] <- as.character(NA) k <- as.character(edgeCount) eattrs <- edge_data_e[[k]] if (!length(eattrs)) eattrs <- list() eattrs[[curAttr]] <- x edge_data_e[[k]] <- eattrs } } } endElement <- function(x, ...) { if (x == "attr") inAttr <<- FALSE else if (x == "node") inNode <<- FALSE else if (x == "edge") inEdge <<- FALSE else if (x == "int") inInt <<- FALSE else if (x == "float") inFloat <<- FALSE else if (x == "bool") inBool <<- FALSE } asGraphNEL <- function() { ftmat <- cbind(from=unlist(as.list(from_e)), to=unlist(as.list(to_e))) ## could call ftM2graphNEL here, but building up the object this ## way may be better... as we add the edges last. Note that ## ftM2graphNEL is much pickier about duplicated edges for ## undirected graphs, so we would need to filter those for the ## undirected case. nn <- unlist(as.list(all_nodes_e)) # retain original node order nn <- names(nn)[order(nn)] g <- graphNEL(nodes=nn, edgemode=edgemode) if (length(node_defaults_e)) { nd <- new("attrData", as.list(node_defaults_e)) nd@data <- as.list(node_data_e) g@nodeData <- nd } if (length(edge_data_e)) { ed <- new("attrData", as.list(edge_defaults_e)) edvals <- as.list(edge_data_e) names(edvals) <- .makeEdgeKeys(ftmat[, 1], ftmat[, 2]) ed@data <- edvals g@edgeData <- ed } g <- addEdge(ftmat[, 1], ftmat[, 2], g) validObject(g) g } list(startElement = startElement, endElement = endElement, text = text, asGraphNEL = asGraphNEL) } graph/R/mat2graph.R0000644000175400017540000001022313175713336015121 0ustar00biocbuildbiocbuildaM2bpG<-function(aM){ if(is.null(rownames(aM))) stop("'aM' must have row names") if(is.null(colnames(aM))) stop("'aM' must have column names") V <- c(rownames(aM),colnames(aM)) tmat<-which(aM>0,arr.ind=TRUE) tmat[,2] <- tmat[,2] + dim(aM)[1] numN<-length(V) numE<-dim(tmat)[1] rval <- vector("list", length = numN) for (i in seq_len(numE)) { rval[[tmat[i, 1]]]$edges <- c(rval[[tmat[i, 1]]]$edges, tmat[i, 2]) ln <- length(rval[[tmat[i, 1]]]$edges) rval[[tmat[i, 1]]]$weights <- c(rval[[tmat[i, 1]]]$weights, aM[tmat[i,1],(tmat[i,2]-dim(aM)[1])]) names(rval[[tmat[i, 1]]]$weights)[ln] <- tmat[i, 2] } names(rval) <- V graphNEL(nodes = V, edgeL = rval, edgemode="directed") } ## WH 23 June 2004, Ladir CH ftM2adjM <- function(ft, W=NULL, V=NULL, edgemode="directed") .ftM2other(ft, W, V, edgemode, "adjM") ftM2graphNEL <- function(ft, W=NULL, V=NULL, edgemode="directed") .ftM2other(ft, W, V, edgemode, "graphNEL") .ftM2other <- function(ft, W, V, edgemode, targetclass) { ## ft: nx2 matrix. if(!(is.matrix(ft) && ncol(ft)==2)) stop("'ft' must be an nx2 matrix") numE <- nrow(ft) ## deal with W if(is.null(W)) W <- rep(1,numE) if(!length(W)==numE) stop("length of 'W' must equal number of edges in 'ft'") ## deal with edgemode if(!edgemode %in% c("undirected", "directed")) stop("'edgemode' must be 'directed' or 'undirected'") if(edgemode == "undirected") { ## reflect each pair -- but *not* the self-edges! differ <- ft[,1] != ft[,2] ft <- rbind(ft, ft[differ, 2:1]) W <- c( W, W[differ]) } ## deal with V cft <- as.character(ft) if(is.null(V)) V <- unique(cft) ift <- array(match(cft, V), dim=dim(ft)) if(any(is.na(ift))) stop("node names in 'ft' must be in 'V'") numN <- length(V) ind <- ift[,1]+(ift[,2]-1)*numN if(any(duplicated(ind))) stop("duplicate edges not allowed") switch(targetclass, adjM = { mat <- matrix(0, ncol=numN, nrow=numN, dimnames=list(V,V)) mat[ind] <- W mat }, graphNEL = { ## ift[,2] are the indices of the to-nodes in V ## ft[,1] are the names of the from-nodes ## toN is a named list, whose names are the levels of ft[,1] and whose elements are the indices of to-nodes in V ## names(toN) is a subset of V, but not identical: the nodes with no outgoing edges are not in names(toN) ## Beware of partial matching! (This lead to a bug in earlier versions of this function, where edges were ## invented if there were nodes with no outgoing edges whose name partially matched the name of other ## nodes with outgoing edges. toN <- split(ift[,2], ft[,1]) eW <- split(W, ft[,1]) edgeL <- lapply(V, function(x) list(edges=NULL, weights=NULL)) names(edgeL) <- V mt = match(names(toN), V) for(k in seq(along=mt)) edgeL[[mt[k]]] <- list(edges=toN[[k]], weights=eW[[k]]) graphNEL(nodes=V, edgeL=edgeL, edgemode=edgemode) }, stop("'targetclass' unknown: ", sQuote(targetclass)) ) ## end switch } setAs("matrix", "graphAM", function(from) { if(!identical(ncol(from), nrow(from))) stop("'ncol(from)' and 'nrow(from)' must be identical") if(is.null(rownames(from))) { rownames(from) = if(is.null(colnames(from))) { paste(seq_len(nrow(from))) } else { colnames(from) } } if(is.null(colnames(from))) { colnames(from) = if(is.null(rownames(from))) { paste(seq_len(ncol(from))) } else { rownames(from) } } if(!identical(rownames(from),colnames(from))) stop("'rownames(from)' and 'colnames(from)' must be identical") if(!is.numeric(from)) storage.mode(from) = "integer" emode <- if (all(from == t(from))) "undirected" else "directed" defaultWeight <- vector(mode = typeof(from), length = 1L) defaultWeight[1L] <- 1L graphAM (from, edgemode=emode, values=list(weight=defaultWeight)) }) setAs("matrix", "graphNEL", function(from) as(as(from, "graphAM"), "graphNEL")) setAs("graphNEL", "matrix", function(from) { as(as(from, "graphAM"), "matrix") }) graph/R/methods-graph.R0000644000175400017540000011122713175713336016004 0ustar00biocbuildbiocbuild## String used as the separator to name edges in a graph. EDGE_KEY_SEP <- "|" EDGEMODE_DEPR_MSG <- "The edgemode slot is deprecated.\nUse 'updateGraph' to update this graph object." EDGEMODE_DEFUNCT_MSG <- "The edgemode slot no longer exists.\nUse 'updateGraph' to update this graph object." checkValidNodeName <- function(node) { if (!is.character(node)) stop("node names must be character, got: ", sQuote(class(node))) ## Node names must have nchar(n) > 0, not be NA, ## and not contain the EDGE_KEY_SEP character. if (any(nchar(node) == 0)) stop("invalid node names: empty string not allowed") if (any(is.na(node))) stop("invalid node names: missing value NA not allowed") bad <- grep(EDGE_KEY_SEP, node, fixed=TRUE) if (length(bad)) stop("node name(s) contain edge separator ", sQuote(EDGE_KEY_SEP), ": ", pasteq(node[bad])) TRUE } setMethod("isDirected", "graph", function(object){ edgemode(object) == "directed" }) ## Look through all serialized object within a folder, check if they are of ## class graph and update if necessary. This is not recursive, so lists of ## graphs or graphs within slots of objects will not be updated. updateFolder <- function(path="."){ files <- dir(path, pattern="\\.rda$") library(graph) for(f in files){ env <- new.env() load(f, envir=env) objects <- ls(env) needSave <- FALSE for(i in objects){ if(is(get(i, env), "graph") && !isUpToDate(get(i, env))){ assign(i, updateGraph(get(i, env)), envir=env) cat("Updated graph object", i, "\n") needSave <- TRUE } } if(needSave) save(list=objects, file=file.path(path,f), envir=env) } } ## Get the "real" slots of an object (slotNames gets the slots from ## the object definition) getObjectSlots <- function(object) { if(!is.object(object) || isVirtualClass(class(object))) return(NULL) value <- attributes(object) value$class <- NULL if(is(object, "vector")) { .Data <- as.vector(object) attr(.Data, "class") <- NULL attrNames <- c('comment', 'dim', 'dimnames', 'names', 'row.names', 'tsp') for (nm in names(value)[names(value) %in% attrNames]) attr(.Data, nm) <- value[[nm]] value <- value[!names(value) %in% attrNames] value$.Data <- .Data } value } ## (FH 11/7/07) If the graph object is not up to data give a ## deprecated warning and try to find something useful, ## else use the edgemode item of the graphData list setMethod("edgemode", "graph", function(object) { if(!isUpToDate(object)){ ## first check in graphData then in edgemode slot if(!"graphData" %in% names(getObjectSlots(object))){ .Defunct(msg=EDGEMODE_DEFUNCT_MSG) }else{ em <- object@graphData$edgemode if (is.null(em) && hasEdgemode(object)) em <- object@edgemode if(is.null(em)) stop("'graph' object is corrupted") } }else em <- object@graphData$edgemode return(em) }) ## (FH 11/7/07) Changed this to update the object in case it is outdated ## (edgemode now lives as a list item in graphData) setReplaceMethod("edgemode", c("graph", "character"), function(object, value) { if(length(value) != 1L) stop("'edgemode' must be length 1") if(!(value %in% c("directed", "undirected")) ) stop("'edgemode' must be 'directed' or 'undirected', was ", sQuote(value)) if(hasEdgemode(object)){ warning("'edgemode' slot is deprecated; ", "this graph object has been updated to ", "a new version", call.=FALSE) object <- updateGraph(object) } object@graphData$edgemode <- value edgeRenderInfo(object) <- list(arrowhead=NULL, arrowtail=NULL) object }) ## Check if graph object is up to date isUpToDate <- function(object, error=FALSE) { if(!is(object, "graph")) stop("'object' must inherit from class 'graph'") availSlots <- getObjectSlots(object) availSlotNames <- names(availSlots) definedSlotNames <- slotNames(object) valid <- setequal(availSlotNames, definedSlotNames) && length(object@graphData$edgemode) if(error && !valid) .Defunct(msg=EDGEMODE_DEFUNCT_MSG) return(valid) } hasEdgemode <- function(object) { if(!is(object, "graph")) stop("'object' must inherit from class 'graph'") sn <- names(getObjectSlots(object)) return("edgemode" %in% sn) } ## Update an old graph instance setMethod("updateGraph", "graph", function(object) { availSlots <- getObjectSlots(object) availSlotNames <- names(availSlots) definedSlotNames <- slotNames(object) if(isUpToDate(object)){ message("This graph object seems to be up to date") newObject <- object }else{ commonSlots <- intersect(definedSlotNames, availSlotNames) missingSlots <- setdiff(definedSlotNames, availSlotNames) if("graphData" %in% missingSlots && !"edgemode" %in% availSlotNames) stop("'object' is corrupted, don't know how to update.") newObject <- new(class(object)) for(s in commonSlots) slot(newObject, s) <- availSlots[[s]] edgemode(newObject) <- suppressWarnings(edgemode(object)) } return(newObject) }) setMethod("numEdges", signature(object="graph"), function(object) { gEdges <- edges(object) if (length(gEdges) == 0) return(0) numEdges <- length(unlist(gEdges, use.names=FALSE)) if (!isDirected(object)) { numSelfLoops <- sum(mapply(function(e, n) sum(n == e), gEdges, names(gEdges))) numEdges <- numSelfLoops + (numEdges - numSelfLoops) / 2 } numEdges }) ## a node-edge-list graph ##the edgeL is a list, with edges, weights etc setMethod("isAdjacent",signature(object="graph", from="character", to="character"), function(object, from, to) { eSpec <- .normalizeEdges(from, to) from <- eSpec$from to <- eSpec$to fromIdx <- match(from, nodes(object), nomatch=0) toIdx <- match(to, nodes(object), nomatch=0) if (any(fromIdx == 0)) stop("unknown nodes in 'from': ", pasteq(from[fromIdx == 0])) if (any(toIdx == 0)) stop("unknown nodes in 'to': ", pasteq(to[toIdx == 0])) fromEdges <- edges(object)[from] .Call(graph_is_adjacent, fromEdges, to) }) ##handle directed graphs by a list inDegree and outDegree setMethod("degree", signature(object="graph", Nodes="missing"), function(object) { degree(object, Nodes=nodes(object)) }) setMethod("degree", "graph", function(object, Nodes) { nl <- edges(object) nls <- nl[Nodes] deg <- listLen(nls) names(deg) <- Nodes if (!isDirected(object)) return(deg) else { b1 <- unlist(nl) b2 <- table(b1) nonZeroNodes <- Nodes[Nodes %in% names(b2)] inDegree <- structure(integer(length(Nodes)), names=Nodes) inDegree[nonZeroNodes] <- as.integer(b2[nonZeroNodes]) return(list(inDegree=inDegree, outDegree=deg)) } }) setMethod("leaves", "graph", function(object, degree.dir) { deg <- degree(object) leaf_degree <- 1L if (isDirected(object)) { if (missing(degree.dir)) stop("'degree.dir' must be specified for a directed graph") degree.dir <- switch(match.arg(degree.dir, c("in", "out")), "in"="inDegree", "out"="outDegree") deg <- deg[[degree.dir]] leaf_degree <- 0L } wh <- deg == leaf_degree names(deg)[wh] }) ## setMethod("acc", "graph", function(object, index) { ## visit <- function(ind) { ## marked[ind] <<- TRUE ## alist <- adj(object, ind)[[1]] ## for( EDGE in alist) { ## if( !marked[EDGE] ) { ## visit(EDGE) ## rval <<- c(EDGE, rval) ## } ## } ## } ## marked <- rep(FALSE, numNodes(object)) ## rval <- vector(length=0) ## names(marked) <- nodes(object) ## visit(index) ## return(rval) ## }, where = where) ##an iterative method ! yuck setMethod("acc", c("graph", "character"), function(object, index) { nN <- numNodes(object) nNames<- nodes(object) nIndex <- length(index) whN <- match(index, nNames) if( any(is.na(whN)) ) stop("unmatched node provided") rval <- vector("list", length=nIndex) names(rval) <- nNames[whN] for( i in seq_len(nIndex)) { marked<-rep(0, nN) distv <- rep(0, nN) names(distv) <- nNames distx <- 1 names(marked) <- nNames nmkd <- 0 marked[index[i]] <- 1 done <- FALSE while( !done ) { minds <- nNames[marked==1] for( node in minds) { avec <- adj(object, node)[[1]] avec <- avec[marked[avec]==0] #don't mark any already marked marked[avec] <- 1 distv[avec] <- distx } marked[minds] <- 2 distx <- distx+1 newmk <- sum(marked==1) if( newmk == 0 ) done <- TRUE } marked[index[i]] <- 0 ##not the node itself rval[[i]] <- distv[marked==2] } return(rval) }) setMethod("edgeWeights", signature(object="graph", index="character"), function(object, index, attr, default, type.checker) { ## Check extra args if (!is.character(attr) || length(attr) != 1) stop("'attr' must be character(1)") if (!is.null(type.checker) && !is.function(type.checker)) stop("'type.checker' be a function or NULL") if (! attr %in% names(edgeDataDefaults(object))) { ## No existing 'weight' edge attr, uses default edgeDataDefaults(object, attr) <- default } ew <- edgeData(object, from=index, attr=attr) if (!length(ew)) return(lapply(edges(object), function(x) vector(mode=mode(default), length=0))[index]) gEdges <- edges(object)[index] edgeCounts <- sapply(gEdges, length) nn <- rep(index, edgeCounts) names(ew) <- unlist(gEdges, use.names=FALSE) ew <- unlist(ew) if (!is.null(type.checker) && !isTRUE(type.checker(ew))) stop("edge weight type.checker(ew) not TRUE\n", "typeof(ew): ", typeof(ew)) ## for (el in ew) { ## ## XXX: if el is an S4 instance, it will match "list" ## if (!isTRUE(type.checker(el))) ## stop("invalid type of edge weight.\n", ## "type.checker(el) not TRUE\n", ## "typeof(el): ", typeof(el)) ## } ## if (!is.null(type.checker)) { ## dMode <- storage.mode(default) ## tryCatch(storage.mode(ew) <- dMode, ## warning=function(w) { ## wMsg <- conditionMessage(w) ## msg <- paste("unable to type.checker edge weight to", ## dMode, "\n", wMsg) ## if (grep("NA", msg)) ## stop(msg) ## else ## warning(wMsg) ## }) ans = split(unlist(ew), nn) ans <- c(ans, lapply(gEdges[edgeCounts == 0], as.numeric)) ans[index] ## split does sorting, we want orig order }) setMethod("edgeWeights", signature(object="graph", index="numeric"), function(object, index, attr, default, type.checker) { index <- nodes(object)[index] edgeWeights(object, index, attr=attr, default=default, type.checker=type.checker) }) setMethod("edgeWeights", signature(object="graph", index="missing"), function(object, index, attr, default, type.checker) { index <- nodes(object) edgeWeights(object, index, attr=attr, default=default, type.checker=type.checker) }) setMethod("DFS", c("graph", "character", "ANY"), function(object, node, checkConn=TRUE) { nNames <- nodes(object) marked <- rep(NA, length(nNames)) names(marked) <- nNames m1 <- match(node, nNames) if( is.na(m1) ) stop("node not in graph: ", sQuote(node)) ##this could be expensive if (checkConn) { c1 <- connComp(object) if(length(c1) != 1) stop("graph is not connected") } marked[m1] <- 0 ##repeat until all are marked - marked has no NA's counter <- 1 while( any(is.na(marked)) ) { fE <- boundary(nNames[!is.na(marked)], object) fE <- fE[sapply(fE, length) > 0] wh <- marked[names(fE)] v1 <- sort(wh) newN <- fE[[names(v1)[v1==max(v1)]]] marked[newN[1]] <- counter counter <- counter+1 } return(marked) }) ### yet another implementation of "intersection", in C setMethod("intersection2", c("graph", "graph"), function(x,y) { if (edgemode(x) != edgemode(y) ) stop("both graphs must have the same edgemode") if (edgemode(x) == "undirected") edgeM <- 0 else edgeM <- 1 .Call(graph_intersection, nodes(x), nodes(y), edges(x), edges(y), edgeM) }) setMethod("intersection", c("graph", "graph"), function(x,y) { if( edgemode(x) != edgemode(y) ) stop("both graphs must have the same edgemode") xN <- nodes(x) yN <- nodes(y) bN <- intersect(xN, yN) if( length(bN) == 0 ) return(graphNEL(nodes=character(0), edgeL=vector("list", 0), edgemode=edgemode(x))) ##lb <- length(bN) ##if(lb != length(xN) || lb != length(yN)) ## stop("graphs must have the same node set") xE <- edges(x, bN) xE = lapply(xE, function(x) { x[x %in% bN]}) yE <- edges(y, bN) yE = lapply(yE, function(x) { x[x %in% bN]}) rval <- vector("list", length=length(xE)) for(i in seq_along(xE) ) { ans <- intersect(xE[[i]], yE[[i]]) rval[[i]] <- list(edges=match(ans, bN), weights=rep(1, length(ans))) } names(rval) <- bN graphNEL(nodes=bN, edgeL=rval, edgemode=edgemode(x)) }) setMethod("join", c("graph", "graph"), function(x, y) { ex <- edgemode(x); ey <- edgemode(y) if(ex == ey) outmode <- ex else stop("cannot handle different edgemodes") nX <- nodes(x) numXnodes <- length(nX) nY <- nodes(y) ## Combine the two sets of nodes, removing any duplications newNodes <- unique(c(nX, nY)) eLX <- edgeL(x) eLY <- edgeL(y) newEdgeL <- eLX ## Can't just cat the edgeL's together like this ## as the node #s have all changed. if (length(eLY) > 0) { eLYnames <- names(eLY) for (i in seq_along(eLY)) { newEntry <- eLY[i] ## !! first need to adjust the targets on the edges newEdges <- newEntry[[1]]$edges if (length(newEdges) > 0) { for (j in seq_along(newEdges)) { curTo <- nY[newEdges[j]] newTo <- match(curTo,newNodes) if (is.na(newTo)) stop("error reassigning duplicated nodes") newEdges[j] <- newTo } } newEntry[[1]]$edges <- newEdges ## now need to attach it to the list. If this ## is a duplicated node, combine it with the ## original, otherwise add it ot the list if (length(newEdgeL) == 0) newEdgeL <- newEntry else if (eLYnames[i] %in% nX) { entry <- which(names(newEdgeL) == eLYnames[i]) if (length(entry) > 1) stop("duplicated node names in original graph") curEntry <- newEdgeL[[entry]] curEntry$edges <- c(curEntry$edges, newEntry[[1]]$edges) curEntry$weights <- c(curEntry$weights, newEntry[[1]]$weights) ##should be user adjustable - ##for now just remove extras dups = duplicated(curEntry$edges) if(any(dups) ) { curEntry$edges = curEntry$edges[!dups] curEntry$weights = curEntry$weights[!dups] } if (!is.null(curEntry)) newEdgeL[[entry]] <- curEntry } else newEdgeL <- c(newEdgeL,newEntry) } } ## Some graphs have edgeL's that are missing the original ## node from the edgeL. When we collated the edgeL above, ## those nodes will be missing - so need to make sure that ## all nodes are present, as the graphNEL() call below ## will check to make sure that length(nodes) == length(edgeL) for (missNode in newNodes[! newNodes %in% names(newEdgeL)]) { newEdgeL[[length(newEdgeL) + 1]] <- list(edges=numeric(), weights=numeric()) names(newEdgeL)[length(newEdgeL)] <- missNode } graphNEL(nodes=newNodes, edgeL=newEdgeL, edgemode=ex) }) setMethod("union", c("graph", "graph"), function(x, y, ...) { ex <- edgemode(x); ey <- edgemode(y); if( ex == ey ) outmode <- ex else stop("cannot handle different edgemodes") xN <- sort(nodes(x)) yN <- sort(nodes(y)) if( any(xN != yN) ) stop("graphs must have the same nodes") xE <- edges(x) yE <- edges(y) rval <- vector("list", length=length(xE)) names(rval) <- xN for(i in names(xE) ) { ans <- unique(c(xE[[i]], yE[[i]])) rval[[i]] <- if( length(ans) > 0 ) list(edges = match(ans, xN), weights= rep(1, length(ans))) else list(edges=numeric(0), weights=numeric(0)) } names(rval) <- xN graphNEL(nodes=xN, edgeL=rval, edgemode=outmode) }) setMethod("complement", c("graph"), function(x) { if( edgemode(x) != "undirected" ) stop("'edgemode' not supported: ", sQuote(edgemode(x))) xN <- nodes(x) xE <- edges(x) rval <- vector("list", length=length(xE)) names(rval) <- xN for( i in xN ) { ans <-xN[ !(xN %in% c(i, xE[[i]])) ] lena <- length(ans) if( lena > 0 ) rval[[i]] <- list(edges=match(ans, xN), weights=rep(1, lena)) else rval[[i]] <- list(edges=numeric(0), weights=numeric(0)) } graphNEL(nodes=xN, edgeL=rval, edgemode=edgemode(x)) }) ##connected components setMethod("connComp", "graph", function(object) { ##if directed we do weak connectivity ##by transforming to the underlying undirected graph if( edgemode(object) == "directed") object = ugraph(object) NL <- nodes(object) marked <- rep(0, length(NL)) names(marked) <- NL done <- FALSE rval <- vector("list", 1) cnode <- 1 index <- 1 nused <- numeric(0) while( !done ) { curracc <- acc(object, NL[cnode])[[1]] rval[[index]] <- curracc nused <- c(nused, cnode) index <- index + 1 if( length(curracc) > 0 ) marked[names(curracc)] <- 1 marked[cnode] <- 1 cnode <- match(0, marked) if( is.na(cnode) ) done <- TRUE } nmR <- NL[nused] nc <- length(rval) rL <- vector("list", length=nc) for(i in seq_len(nc)) rL[[i]]<-c(nmR[[i]], names(rval[[i]])) return(rL) }) setMethod("isConnected", "graph", function(object, ...) (length(connComp(object)) == 1)) setMethod("numNodes", "graph", function(object) length(nodes(object))) setMethod("show", signature("graph"), function(object) { isUpToDate(object, error=TRUE) numNodes<- numNodes(object) numEdge<-numEdges(object) cat("A", class(object), "graph with", edgemode(object), "edges\n") cat("Number of Nodes =", numNodes, "\n") cat("Number of Edges =", numEdge, "\n") }) .edgeWeight <- function(from, to, graph) { gN <- nodes(graph) wF <- match(from, gN) if( is.na(wF) ) stop("not a node: ", sQuote(from)) wT <- match(to, gN) if( is.na(wT) ) stop("not a node: ", sQuote(to)) eL <- graph@edgeL[[from]] mt <- match(wT, eL$edges) if(is.na(mt) ) stop("no edge from ", sQuote(from), " to ", sQuote(to)) eL$weights[mt] } ##take a sparse matrix - csr and put it into a graph sparseM2Graph <- function(sM, nodeNames, edgemode=c("directed", "undirected")) { ## FIXME: this needs to become a method qrequire("SparseM") edgemode <- match.arg(edgemode) nN <- dim(sM)[1] if( nN != dim(sM)[2] ) stop("only square matrices can be transformed") if( length(nodeNames) != nN ) stop("wrong number of node names supplied") if( !is.character(nodeNames) ) stop("wrong type of node names supplied") dd <- diff(sM@ia) e1 <- rep(seq_len(nN), dd) eL <- split(sM@ja, e1) eW <- split(sM@ra, e1) edL <- vector("list", length=nN) names(edL) <- seq_len(nN) for(i in as.character(seq_len(nN)) ){ ##need this because otherwise partial matching is done if( i %in% names(eL) ) edL[[i]] <- list(edges=eL[[i]], weights=eW[[i]]) else edL[[i]] <- list(edges=numeric(0)) } names(edL) <- nodeNames graphNEL(nodes=nodeNames, edgeL=edL, edgemode=edgemode) } ##translate a graph to a SparseMatrix: ##ra - the values; these will be 1's for now ##ja - the column indices ##ia the row offsets ( graph2SparseM <- function(g, useweights=FALSE) { ## FIXME: this needs to become a method qrequire("SparseM") if (! is(g, "graphNEL")) stop("coercion only works for graphNEL class") nr = nc = numNodes(g) e1 = g@edgeL e2 = lapply(e1, function(x) x$edges) eL = listLen(e2) if (useweights && ("weight" %in% names(edgeDataDefaults(g)))) ra <- unlist(edgeData(g, attr="weight")) else ra = rep(1, sum(eL)) ja = as.integer(unlist(e2)) ia = as.integer(cumsum(c(1, eL))) new("matrix.csr", ra=ra, ja=ja, ia=ia, dimension=c(nr, nc)) } ##-------------------------- ## edge names ##-------------------------- setMethod("edgeNames", signature="graph", definition=function(object, recipEdges=c("combined", "distinct")) { recipEdges <- match.arg(recipEdges) ## convert names to integers ("standard node labeling") to <- lapply(edges(object), match, nodes(object)) from <- match(names(to), nodes(object)) if(any(is.na(unlist(to)))||any(is.na(from))) stop("edge names do not match node names") ## from-to matrix ft <- matrix(c(rep(from, listLen(to)), to=unlist(to)), ncol=2) if (recipEdges == "combined") { ## revert those edges for which 'from' > 'to' revert <- ft[, 1] > ft[, 2] ft2 <- ft ft2[revert,] <- ft2[revert, c(2, 1)] ft <- ft[!duplicated.array(ft2, MARGIN=1),, drop=FALSE] } return(paste(nodes(object)[ft[, 1]], nodes(object)[ft[, 2]], sep="~")) }, valueClass="character") ##-------------------------- ## clustering coefficient ##-------------------------- setMethod("clusteringCoefficient", signature=signature(object="graph"), definition=function(object, selfLoops=FALSE) { if(edgemode(object)!="undirected") return(NULL) ## Convert names to integers ("standard node labeling") ## This is here for efficiency - the matching code in the for-loop ## below would also work for the characters (names). to <- lapply(edges(object), match, nodes(object)) from <- match(names(to), nodes(object)) if(any(is.na(unlist(to)))||any(is.na(from))) stop("edge names do not match node names") if(!selfLoops) { ufrom <- rep(from, listLen(to)) uto <- unlist(to) if(any(ufrom==uto)) stop("graph must not contain self-loops") totEdges <- function(i) i*(i-1) } else { totEdges <- function(i) i*i } clustCoef <- rep(as.numeric(NA), numNodes(object)) names(clustCoef) <- nodes(object) for (i in which(listLen(to)>0)) { ## to[[i]] are all the nodes reached from i. ## to[ to[[i]] ] are all second-degree neihbours nb <- sapply(to[ to[[i]] ], function(x) sum(!is.na(match(x, to[[i]])))) clustCoef[from[i]] <- sum(nb) / totEdges(length(nb)) } return(clustCoef) }, valueClass="numeric") ## --------------------------------------------------------------------- ## node data access ## --------------------------------------------------------------------- setMethod("nodeDataDefaults", signature(self="graph", attr="missing"), function(self, attr) attrDefaults(self@nodeData)) setMethod("nodeDataDefaults", signature(self="graph", attr="character"), function(self, attr) attrDefaults(self@nodeData, attr)) setReplaceMethod("nodeDataDefaults", signature(self="graph", attr="missing", value="list"), function(self, attr, value) { attrDefaults(self@nodeData) <- value self }) setReplaceMethod("nodeDataDefaults", signature(self="graph", attr="character", value="ANY"), function(self, attr, value) { attrDefaults(self@nodeData, attr) <- value self }) .verifyNodes <- function(n, nodes) { unknownNodes <- n[! n %in% nodes] if (length(unknownNodes) > 0) stop("unknown nodes: ", pasteq(unknownNodes)) TRUE } setMethod("nodeData", signature(self="graph", n="character", attr="character"), function(self, n, attr) { .verifyNodes(n, nodes(self)) attrDataItem(self@nodeData, x=n, attr=attr) }) setReplaceMethod("nodeData", signature(self="graph", n="character", attr="character", value="ANY"), function(self, n, attr, value) { .verifyNodes(n, nodes(self)) attrDataItem(self@nodeData, x=n, attr=attr) <- value self }) setMethod("nodeData", signature(self="graph", n="character", attr="missing"), function(self, n, attr) { .verifyNodes(n, nodes(self)) attrDataItem(self@nodeData, x=n) }) setMethod("nodeData", signature(self="graph", n="missing", attr="character"), function(self, n, attr) { attrDataItem(self@nodeData, x=nodes(self), attr=attr) }) setReplaceMethod("nodeData", signature(self="graph", n="missing", attr="character", value="ANY"), function(self, n, attr, value) { attrDataItem(self@nodeData, x=nodes(self), attr=attr) <- value self }) setMethod("nodeData", signature(self="graph", n="missing", attr="missing"), function(self, n, attr) { attrDataItem(self@nodeData, x=nodes(self)) }) ## --------------------------------------------------------------------- ## --------------------------------------------------------------------- ## edge data access ## --------------------------------------------------------------------- setMethod("edgeDataDefaults", signature(self="graph", attr="missing"), function(self, attr) attrDefaults(self@edgeData)) setMethod("edgeDataDefaults", signature(self="graph", attr="character"), function(self, attr) attrDefaults(self@edgeData, attr)) setReplaceMethod("edgeDataDefaults", signature(self="graph", attr="missing", value="list"), function(self, attr, value) { attrDefaults(self@edgeData) <- value self }) setReplaceMethod("edgeDataDefaults", signature(self="graph", attr="missing", value="list"), function(self, attr, value) { attrDefaults(self@edgeData) <- value self }) setReplaceMethod("edgeDataDefaults", signature(self="graph", attr="character", value="ANY"), function(self, attr, value) { attrDefaults(self@edgeData, attr) <- value self }) .normalizeEdges <- function(from, to) { lenFr <- length(from) lenTo <- length(to) if (lenFr > lenTo) { if (lenTo != 1) stop("'to' must be length 1 or ", lenFr) to <- rep(to, lenFr) } else if (lenFr < lenTo) { if (lenFr != 1) stop("'from' must be length 1 or ", lenTo) from <- rep(from, lenTo) } list(from=from, to=to) } .verifyEdges <- function(graph, from, to) { stopifnot(length(from) == length(to)) if (length(from) == 0L) return(TRUE) # no edges adjList <- isAdjacent(graph, from, to) if (any(!adjList)) { badFr <- from[!adjList] badTo <- to[!adjList] res <- paste(badFr, badTo, sep=EDGE_KEY_SEP, collapse=", ") stop("edges not found: ", sQuote(res)) } TRUE } .makeEdgeKeys <- function(from, to) { stopifnot(length(from) == length(to)) paste(from, to, sep=EDGE_KEY_SEP) } .getEdgeKeys <- function(graph, from, to) { eSpec <- .normalizeEdges(from, to) from <- eSpec$from to <- eSpec$to .verifyEdges(graph, from, to) edgeKeys <- .makeEdgeKeys(from, to) edgeKeys } setMethod("edgeData", signature(self="graph", from="character", to="character", attr="character"), function(self, from, to, attr) { edgeKeys <- .getEdgeKeys(self, from, to) attrDataItem(self@edgeData, x=edgeKeys, attr=attr) }) setMethod("edgeData", signature(self="graph", from="character", to="missing", attr="character"), function(self, from, to, attr) { .verifyNodes(from, nodes(self)) gEdges <- edges(self)[from] lens <- sapply(gEdges, length) fEdges <- rep(from, lens) if (!length(fEdges)) return(list()) tEdges <- unlist(gEdges) edgeKeys <- .getEdgeKeys(self, fEdges, tEdges) attrDataItem(self@edgeData, x=edgeKeys, attr=attr) }) setMethod("edgeData", signature(self="graph", from="missing", to="character", attr="character"), function(self, from, to, attr) { eDat <- edges(self) inE <- inEdges(to, self) to <- rep(to, sapply(inE, length)) from <- unlist(inE) ## from <- names(eDat)[sapply(eDat, function(x) to %in% x)] edgeKeys <- .getEdgeKeys(self, from, to) attrDataItem(self@edgeData, x=edgeKeys, attr=attr) }) setReplaceMethod("edgeData", signature(self="graph", from="character", to="character", attr="character", value="ANY"), function(self, from, to, attr, value) { edgeKeys <- .getEdgeKeys(self, from, to) attrDataItem(self@edgeData, x=edgeKeys, attr=attr) <- value if (!isDirected(self)) { edgeKeys <- .getEdgeKeys(self, to, from) attrDataItem(self@edgeData, x=edgeKeys, attr=attr) <- value } self }) setReplaceMethod("edgeData", signature(self="graph", from="character", to="missing", attr="character", value="ANY"), function(self, from, to, attr, value) { .verifyNodes(from, nodes(self)) gEdges <- edges(self)[from] lens <- sapply(gEdges, length) if (any(lens == 0)) warning("no edges from nodes: ", pasteq(from[lens == 0])) fEdges <- rep(from, lens) tEdges <- unlist(edges(self)[from]) edgeKeys <- .getEdgeKeys(self, fEdges, tEdges) attrDataItem(self@edgeData, x=edgeKeys, attr=attr) <- value if (!isDirected(self)) { edgeKeys <- .getEdgeKeys(self, tEdges, fEdges) attrDataItem(self@edgeData, x=edgeKeys, attr=attr) <- value } self }) setReplaceMethod("edgeData", signature(self="graph", from="missing", to="character", attr="character", value="ANY"), function(self, from, to, attr, value) { eDat <- edges(self) from <- names(eDat)[sapply(eDat, function(x) to[1] %in% x)] edgeKeys <- .getEdgeKeys(self, from, to) attrDataItem(self@edgeData, x=edgeKeys, attr=attr) <- value if (!isDirected(self)) { edgeKeys <- .getEdgeKeys(self, to, from) attrDataItem(self@edgeData, x=edgeKeys, attr=attr) <- value } self }) .getAllEdges <- function(graph) { e1 <- edges(graph) if (length(e1) == 0L) { list(from=character(0), to=character(0)) } else { n1 <- nodes(graph) n1 <- rep(n1, sapply(e1, length)) list(from=n1, to=unlist(e1)) } } setMethod("edgeData", signature(self="graph", from="missing", to="missing", attr="character"), function(self, from, to, attr) { eSpec <- .getAllEdges(self) from <- eSpec$from to <- eSpec$to edgeKeys <- .getEdgeKeys(self, from, to) attrDataItem(self@edgeData, x=edgeKeys, attr=attr) }) setMethod("edgeData", signature(self="graph", from="character", to="character", attr="missing"), function(self, from, to, attr) { edgeKeys <- .getEdgeKeys(self, from, to) attrDataItem(self@edgeData, x=edgeKeys) }) setMethod("edgeData", signature(self="graph", from="missing", to="missing", attr="missing"), function(self, from, to, attr) { eSpec <- .getAllEdges(self) from <- eSpec$from to <- eSpec$to edgeKeys <- .getEdgeKeys(self, from, to) attrDataItem(self@edgeData, x=edgeKeys) }) ## still needed for Rgraphviz' plot() [well, as long as edgeL() is still there] setMethod("edgeL", "graph", function(graph, index) callGeneric(as(graph, "graphNEL"))) setMethod("plot", c("graph", "ANY"), function(x, y, ...) { qrequire("Rgraphviz") method <- getMethod("plot", c("graph", "ANY"), getNamespace("Rgraphviz")) method(x, y, ...) }) clearEdgeData <- function(self, from, to) { ##FIXME: make me a method edgeKeys <- .getEdgeKeys(self, from, to) removeAttrDataItem(self@edgeData, x=edgeKeys) <- NULL self } clearNodeData <- function(self, n) { ##FIXME: make me a method removeAttrDataItem(self@nodeData, x=n) <- NULL self } graph/R/methods-graphAM.R0000644000175400017540000002743113175713336016225 0ustar00biocbuildbiocbuild## adjacency matrix representation of a graph isValidAdjMat <- function(adjMat, mode="undirected") { ## Determine if adjacency matrix adjMat is valid Element adjMat[i, j] == 1 ## if the graph contains an edge FROM node i TO node j. If mode is ## "undirected", then adjMat should be symmetrix. if (length(adjMat) == 0L) return(character(0L)) if (! nrow(adjMat) == ncol(adjMat)) stop("adjacency matrix must be square") if (mode == "undirected") if (any(adjMat != t(adjMat))) ## XXX: this could be slow stop("adjacency matrix must be symmetric for undirected graphs") if (any(adjMat < 0)) stop("adjacency matrix must not have negative values") if (is.null(dimnames(adjMat))) { nNames <- NULL } else { ## take first non-null dimname nonNullIndices <- which(sapply(dimnames(adjMat), function(x) !is.null(x))) nNames <- dimnames(adjMat)[[nonNullIndices[1]]] if (any(duplicated(nNames))) stop("node names must be distinct") checkValidNodeName(nNames) if (length(nonNullIndices) == 2) { ## verify rownames match colnames if (any(rownames(adjMat) != colnames(adjMat))) stop("row and column names must match") } } return(nNames) } isValidNodeList <- function(nList, nNames) { if (!is.list(nList) || is.null(names(nList))) stop("nodes must be specified as a named list") if (!setequal(names(nList), nNames)) stop("names of node list must match graph node names") return(TRUE) } initEdgeSet <- function(self, values) { ## Put matrix elements into @edgeData using attr name from 'values'. if (!is.list(values) || length(values) != 1 || is.null(names(values))) stop("'values' must be a named list with one element") self@edgeData <- new("attrData", defaults=values) valName <- names(values)[1] eSpec <- .getAllEdges(self) from <- eSpec$from to <- eSpec$to if (length(from) > 0L && length(to) > 0L) { v <- t(self@adjMat) v <- v[v != 0] ## this unrolls the matrix in the right way edgeData(self, from=from, to=to, attr=valName) <- v ## FIXME: consider storing matrix as logical } self } setMethod("initialize", signature("graphAM"), function(.Object, adjMat, edgemode="undirected", values) { nNames <- isValidAdjMat(adjMat, edgemode) if (is.null(nNames)) nNames <- paste0("n", seq_len(ncol(adjMat))) .Object@graphData$edgemode <- edgemode .Object@nodeData <- new("attrData") colnames(adjMat) <- nNames rownames(adjMat) <- NULL .Object@adjMat <- adjMat if (!missing(values)) .Object <- initEdgeSet(.Object, values) else .Object@edgeData <- new("attrData") ## Matrix values have been stored in @edgeData, ## so now we normalize to 0/1 adjMat <- .Object@adjMat adjMat[adjMat != 0L] <- 1L .Object@adjMat <- adjMat .Object }) getEdgeList <- function(adjMat, nodeNames) { numNodes <- length(nodeNames) eList <- vector(mode="list", length=numNodes) for (i in seq(length=numNodes)) { aRow <- adjMat[i, ] result <- names(base::which(aRow != 0)) if (is.null(result)) result <- character(0) eList[[i]] <- result } names(eList) <- nodeNames eList } setMethod("edges", signature("graphAM", "missing"), function(object) { if (length(object@adjMat) == 0L) return(list()) getEdgeList(object@adjMat, nodes(object)) }) setMethod("edges", signature("graphAM", "character"), function(object, which) { if (length(object@adjMat) == 0L) return(list()) idx <- base::which(colnames(object@adjMat) %in% which) getEdgeList(object@adjMat[idx, ], nodes(object)[idx]) }) setMethod("numNodes", signature("graphAM"), function(object) length(nodes(object))) setMethod("numEdges", signature(object="graphAM"), function(object) { nE <- sum(object@adjMat != 0) if (!isDirected(object)) { selfLoops <- sum(diag(object@adjMat) != 0) nE <- selfLoops + (nE - selfLoops)/2 } nE }) setMethod("isAdjacent", signature(object="graphAM", from="character", to="character"), function(object, from, to) { eSpec <- .normalizeEdges(from, to) from <- eSpec$from to <- eSpec$to fromIdx <- match(from, nodes(object), nomatch=0) toIdx <- match(to, nodes(object), nomatch=0) if (any(fromIdx == 0)) stop("'from' unknown node(s): ", pasteq(from[fromIdx == 0])) if (any(toIdx == 0)) stop("'to' unknown nodes: ", pasteq(to[toIdx == 0])) result <- logical(length(fromIdx)) for (i in seq_along(fromIdx)) result[i] <- object@adjMat[fromIdx[i], toIdx[i]] != 0 result }) extendAdjMat <- function(adjMat, nodes) { nms <- c(colnames(adjMat), nodes) curCols <- ncol(adjMat) newCols <- matrix(0, nrow=curCols, ncol=length(nodes)) adjMat <- cbind(adjMat, newCols) newRows <- matrix(0, nrow=length(nodes), ncol=ncol(adjMat)) adjMat <- rbind(adjMat, newRows) colnames(adjMat) <- nms adjMat } getIndices <- function(nodes, from, to) { ## Return indices into the adjMat for nodes from and to. i <- match(from, nodes, nomatch=0) if (any(bad <- (i == 0))) stop("'from' unknown node(s): ", sQuote(from[bad])) j <- match(to, nodes, nomatch=0) if (any(bad <- (j == 0))) stop("'to' unknown node(s): ", sQuote(to[bad])) list(from=i, to=j) } setMethod("addNode", signature(node="character", object="graphAM", edges="missing"), function(node, object) { already <- node %in% nodes(object) if(any(already)) stop("node(s) already exist: ", pasteq(node[already])) checkValidNodeName(node) object@adjMat <- extendAdjMat(object@adjMat, node) object }) setMethod("addEdge", signature(from="character", to="character", graph="graphAM", weights="missing"), function(from, to, graph) { if (any(bad <- isAdjacent(graph, from, to))) stop("edge(s) already exist: ", pasteq(paste(from[bad], to[bad], sep="|"))) idx <- getIndices(nodes(graph), from, to) idx <- cbind(idx$from, idx$to) graph@adjMat[idx] <- 1L if (! isDirected(graph)) graph@adjMat[idx[ , c(2L, 1L)]] <- 1L graph }) setMethod("clearNode", signature(node="character", object="graphAM"), function(node, object) { idx <- getNodeIndex(nodes(object), node) zeroVect <- rep(0, ncol(object@adjMat)) ## clear edges from node to other object@adjMat[idx, ] <- zeroVect ## clear edges from other to node object@adjMat[, idx] <- zeroVect ## TODO: clear edge attributes object }) ## TODO: implement a clearEdgeAttributes method setMethod("removeNode", signature(node="character", object="graphAM"), function(node, object) { idx <- getNodeIndex(nodes(object), node) object@adjMat <- object@adjMat[-idx, -idx] ## TODO: clear edge attributes object }) getNodeIndex <- function(nodeNames, node) { idx <- match(node, nodeNames, nomatch=NA) if (any(is.na(idx))) stop("unknown node(s): ", pasteq(node[is.na(idx)])) idx } coordToIndex <- function(x, y, nrow) (y * nrow) - (nrow - x) setMethod("removeEdge", signature(from="character", to="character", graph="graphAM"), function(from, to, graph) { fromIdx <- getNodeIndex(nodes(graph), from) toIdx <- getNodeIndex(nodes(graph), to) rowCnt <- nrow(graph@adjMat) graph@adjMat[coordToIndex(fromIdx, toIdx, rowCnt)] <- 0 if (!isDirected(graph)) graph@adjMat[coordToIndex(toIdx, fromIdx, rowCnt)] <- 0 graph }) ## This signature looks strange, but to get in edges for all nodes ## it makes sense to be able to write inEdges(g) setMethod("inEdges", signature(node="graphAM", object="missing"), function(node, object) { allNodes <- nodes(node) return(inEdges(allNodes, node)) }) ## But we still want inEdges(object=g) to work setMethod("inEdges", signature(node="missing", object="graphAM"), function(node, object) { allNodes <- nodes(object) return(inEdges(allNodes, object)) }) setMethod("inEdges", signature(node="character", object="graphAM"), function(node, object) { allNodes <- nodes(object) unknownNodes <- !(node %in% allNodes) if (any(unknownNodes)) stop("unknown nodes: ", pasteq(node[unknownNodes])) ## cols of adjMat tells us in edges adjMat <- object@adjMat ans <- list() for (n in node) { ans[[n]] <- allNodes[as.logical(adjMat[, n])] } ans }) setAs(from="graphAM", to="matrix", function(from) { am <- from@adjMat if (length(am) == 0L) return(am) if ("weight" %in% names(edgeDataDefaults(from))) { tm <- t(am) tm[tm != 0] <- unlist(edgeData(from, attr="weight")) m <- t(tm) } else { m <- am } rownames(m) <- colnames(m) m }) ## ^^ the reverse is in ./mat2graph.R setAs(from="graphAM", to="graphNEL", function(from) { gnel <- graphNEL(nodes=nodes(from), edgeL=edges(from), edgemode=edgemode(from)) ## copy edge and node attributes: gnel@edgeData <- from@edgeData gnel@nodeData <- from@nodeData gnel }) ## This is also used in mat2graph.R : NEL2mat <- function(g) { theNodes <- nodes(g) numNodes <- length(theNodes) mat <- matrix(0:0, nrow=numNodes, ncol=numNodes) rownames(mat) <- colnames(mat) <- theNodes theEdges <- edges(g) wts <- edgeWeights(g) use.wts <- any(unlist(wts) != 1) for (n in theNodes) { e <- theEdges[[n]] if (length(e)) mat[n, e] <- if(use.wts) wts[[n]] else 1L } mat } setAs(from="graphNEL", to="graphAM", function(from) { theNodes <- nodes(from) numNodes <- length(theNodes) mat <- matrix(0, nrow=numNodes, ncol=numNodes, dimnames=list(theNodes, theNodes)) theEdges <- edges(from) for (n in theNodes) { e <- theEdges[[n]] if (length(e)) mat[n, e] <- 1 } ## XXX: it would be safer to pass mat here, but since we cannot ## yet pass in the edgeData and nodeData, we benefit greatly ## by avoiding the copying of large matrices. gam <- graphAM(matrix(0), edgemode=edgemode(from)) ## one of the things that initialize will do is remove row ## names, so that only one copy of node names are stored rownames(mat) <- NULL ## copy edge and node attributes gam@edgeData <- from@edgeData gam@nodeData <- from@nodeData gam@adjMat <- mat gam }) graph/R/methods-graphBAM.R0000644000175400017540000017055613175713336016336 0ustar00biocbuildbiocbuild## bit array adjacency matrix representation of a graph setMethod("initialize", signature("graphBAM"), function(.Object, nodes,edgeSet) { .Object@graphData$edgemode <- if (isDirected(edgeSet)) "directed" else "undirected" .Object@renderInfo@edges <- list(arrowhead=NULL, arrowtail=NULL) .Object@nodeData <- new("attrData") .Object@edgeData <- new("attrData") .Object@nodes <- nodes .Object@edgeSet <- edgeSet .Object }) graphBAM <- function(df, nodes = NULL, edgemode = "undirected", ignore_dup_edges = FALSE) { .required <- c("from", "to", "weight") cl <- .required %in% names(df) if (!all(cl)) { stop("required 'names(df)' not present: ", pasteq(.required[!cl])) } if (any(duplicated(nodes))) stop(sQuote(nodes), " must be unique") edge_nodes <- unique(c(as.character(df$from), as.character(df$to))) if (!all(edge_nodes %in% nodes)) nodes <- sort(c(edge_nodes, nodes)) else if (is.null(nodes)) nodes <- edge_nodes is_directed <- edgemode == "directed" edge_sets <- .makeMDEdgeSet(es_name = 1, es = df, is_directed = is_directed, nodes, ignore_dup_edges = ignore_dup_edges) g <- new("graphBAM", nodes = nodes, edgeSet = edge_sets) g@edgeData@defaults[["weight"]] <- 1L g } setMethod("numEdges", signature = signature(object = "graphBAM"), function(object) { numEdges(object@edgeSet) }) .undirectEdges <- function(from, to) { fromIsFirst <- from <= to toIsFirst <- !fromIsFirst tmpFrom <- c(from[fromIsFirst], to[toIsFirst]) tmpTo <- c(to[fromIsFirst], from[toIsFirst]) from <- tmpFrom to <- tmpTo list(from=from, to=to) } .edges_gbam <- function(object, which, direction="out") { nn <- nodes(object) if (numEdges(object) == 0L) { names(nn) <- nn c0 <- character(0L) return(lapply(nn, function(x) c0)) } ft <- .Call(graph_bitarray_rowColPos, object@edgeSet@bit_vector) ft[] <- nn[ft] eL <- singles <- NULL if (isDirected(object)) { if (direction == "in") ft[ , c("from", "to")] <- ft[ , c("to", "from")] eL <- split(ft[ , "to"], ft[ , "from"]) singles <- nn[!(nn %in% ft[ , "from"])] } else { eL <- lapply(split(ft, ft[ , c("to", "from")]), unique) singles <- nn[!(nn %in% ft)] } if (length(singles) > 0) { names(singles) <- singles c0 <- character(0L) empties <- lapply(singles, function(x) c0) eL <- c(eL, empties) } eL[order(names(eL))] } setMethod("inEdges", signature("character", "graphBAM"), function(node, object) { .edges_gbam(object, direction = "in")[node] }) setMethod("edges", signature("graphBAM", "missing"), .edges_gbam) setMethod("edges", signature("graphBAM", "character"), function(object, which) { ## TODO: refactor to optimize .edges_gbam(object)[which] }) setMethod("adj", c("graphBAM", "character"), function(object, index) edges(object, index)) getWeightList2 <- function(g){ nodeNames <- g@nodes numNodes <- length(nodeNames) w <- g@edgeSet@weights ft <- .Call(graph_bitarray_rowColPos, g@edgeSet@bit_vector) if(!isDirected(g)){ ft <- rbind(ft, ft[ , c(2L, 1L)]) w <- c(w,w) } ft[] <- nodeNames[ft] wList <- split(w, ft[ , 1L]) wNameList <- split(ft[ , 2L], ft[ , 1L]) wList <- mapply(function(wVals, wNames) { names(wVals) <- wNames a <- wVals[order(wNames)] if (!isDirected(g)) a[!duplicated(names(a))] else a }, wList, wNameList, SIMPLIFY=FALSE) haveNoEdge <- setdiff(nodeNames, names(wList)) names(haveNoEdge) <- haveNoEdge n0 <- numeric(0) haveNoEdge <- lapply(haveNoEdge, function(x) n0) c(wList, haveNoEdge)[nodeNames] } setMethod("edgeWeights", signature(object="graphBAM", index="character"), function(object, index, attr, default, type.checker) { if (!is.character(attr) || length(attr) != 1) stop("'attr' must be character(1)") if (!is.null(type.checker) && !is.function(type.checker)) stop("'type.checker' must be a function or NULL") getWeightList2(object)[index] }) setMethod("edgeWeights", signature(object="graphBAM", index="numeric"), function(object, index, attr, default, type.checker) { edgeWeights(object, nodes(object)[index], attr=attr, default=default, type.checker=type.checker) }) setMethod("edgeWeights", signature(object="graphBAM", index="missing"), function(object, index, attr, default, type.checker) { edgeWeights(object, nodes(object), attr=attr, default=default, type.checker=type.checker) }) .eAttrsFun <- function(self, from, attr) { nodeNames <- self@nodes indx <- which(nodeNames %in% from) numNodes <- length(nodeNames) bv <- self@edgeSet@bit_vector .verifyBAMAttrs(self, attr) val <- .retAttrVec(self, attr) ft <- .Call(graph_bitarray_rowColPos, bv) if(!isDirected(self)){ df <- cbind(from=ft[,"to"], to = ft[,"from"]) ft <- rbind(ft,df) val <- c(val,val) } tmp <- seq_len(length(val)) # indices into val ft <- data.frame(ft, tmp, stringsAsFactors = FALSE ) ft <- ft[ ft[,"from"] %in% indx,] if(nrow(ft) == 0) stop("edges specified in 'from' not found in 'self'") nodeLbl <- paste( nodeNames[ft[,"from"]], nodeNames[ft[, "to"]], sep ="|") val <- val[ft[,"tmp"]][seq_along(nodeLbl)] names(val) <- nodeLbl val } ## graphBAM edgeData methods setMethod("edgeData", signature(self="graphBAM", from="character", to= "missing", attr="character"), function(self, from, to, attr){ as.list(.eAttrsFun(self, from, attr)) }) setMethod("edgeData", signature(self="graphBAM", from="character", to="character", attr="character"), function(self, from, to, attr) { edgeData.from <- edgeData(self, attr=attr, from=from) unrecognized.nodes <- setdiff(to, nodes(self)) if(length(unrecognized.nodes) > 0) { msg <- sprintf("nodes not in graph: %s", paste(sQuote(unrecognized.nodes), collapse=", ")) stop(msg) } edgeNames <- names(edgeData.from) toStarts <- regexpr("|", edgeNames, fixed=TRUE) + 1L actual.to.nodes <- substring(edgeNames, toStarts, nchar(edgeNames)) edgeData.from[actual.to.nodes %in% to] }) setMethod("edgeData", signature(self="graphBAM", from="missing", to= "character", attr="character"), function(self, from, to, attr){ nodeNames <- self@nodes numNodes <- length(nodeNames) bv <- self@edgeSet@bit_vector .verifyBAMAttrs(self, attr) val <- .retAttrVec(self, attr) ft <- .Call(graph_bitarray_rowColPos, self@edgeSet@bit_vector) if(!isDirected(self)){ df <- cbind(from=ft[,"to"], to = ft[,"from"]) ft <- rbind(ft,df) val <- c(val,val) } tmp <- seq_len(length(val)) ft <- data.frame(ft, tmp, stringsAsFactors = FALSE) ft <- ft[ft[,"to"] %in% which(nodeNames %in% to),] if(nrow(ft) == 0) stop("edges specified in 'to' not found in 'self'") .verifyEdges(self, nodeNames[ft[,"from"]], nodeNames[ft[,"to"]]) nodeLbl <- paste( nodeNames[ft[,"from"]], nodeNames[ft[, "to"]], sep ="|") val <- val[ft[,"tmp"]][seq_along(nodeLbl)] names(val) <- nodeLbl as.list(val) }) setMethod("edgeData", signature(self="graphBAM", from="missing", to="missing", attr="missing"), function(self, from, to, attr) { nodeNames <- self@nodes numNodes <- length(nodeNames) attr <- "weight" bv <- self@edgeSet@bit_vector ft <- .Call(graph_bitarray_rowColPos, bv) w <- .retAttrVec(self, attr) if(!isDirected(self)){ df <- cbind(from=ft[,"to"], to = ft[,"from"]) ft <- rbind(ft,df) w <- c(w,w) } nodeLbl <- paste( nodeNames[ft[,"from"]], nodeNames[ft[, "to"]], sep ="|") names(w) <- nodeLbl lapply(w, function(x) list(weight = as.numeric(x))) }) setMethod("edgeData", signature(self="graphBAM", from="missing", to= "missing", attr="character"), function(self, from, to, attr){ as.list(.eAttrsFun(self, from = names(edges(self)), attr= attr)) }) .retAttrVec <- function(g, attr) { if(attr !="weight") { k1 <- g@edgeSet@bit_vector k2<- g@userAttrPos@edgePos[[attr]] tmp <- attributes(k1) res <- k1& (!k2) attributes(res) <- tmp ns <- .Call(graph_bitarray_sum, res) attr(res, "nbitset") <- ns ft <- data.frame(.Call(graph_bitarray_rowColPos, res)) dflt <- g@edgeData@defaults[[attr]] attrBit <- g@userAttrPos@edgePos[[attr]] ft <- ft[with(ft, order(to, from)),] if(nrow(ft)) { ord <- .Call(graph_bitarray_getEdgeAttrOrder, attrBit, as.integer(ft[,"from"]), as.integer(ft[,"to"])) attrBit <- setBitCell(attrBit, ft[,"from"], ft[,"to"], rep(1L, nrow(ft))) nt <- attr(attrBit, "nbitset") } else { nt <- attr(attrBit, "nbitset") ord <- list(newLeftPos = integer(0), newRightPos = integer(0), origLeftPos = seq_len(nt), origRightPos = seq_len(nt)) } newAttr <- vector(nt, mode = mode(dflt)) if(!is.null(g@edgeSet@edge_attrs[[attr]])) { newAttr[ord$origLeftPos] <- g@edgeSet@edge_attrs[[attr]][ord$origRightPos] newAttr[ord$newLeftPos] <- if(mode(dflt)=="list") rep(list(dflt), length(ord$newLeftPos)) else dflt }else{ newAttr[seq_len(nt)] <- if(mode(dflt)=="list") rep(list(dflt), nt) else dflt } }else{ newAttr <- g@edgeSet@weights } newAttr } .align_from_to <- function(from, to, nodeNames) { from_len <- length(from) to_len <- length(to) req_nn <- unique(c(from, to)) if (!all(okidx <- req_nn %in% nodeNames)) stop("unknown nodes: ", pasteq(req_nn[!okidx])) if (from_len != to_len) { if (from_len == 1L) from <- rep(from, to_len) else if (to_len == 1L) to <- rep(to, from_len) else stop("invalid lengths of 'from' and 'to'") } df <- cbind(from=from, to=to) } .verifyBAMAttrs <- function(bam, attr) { if( !(attr %in% names(bam@edgeData@defaults))) stop("'attr' not found: ", sQuote(attr)) } .set_attrs <- function(g, from, to, attr, value) { nodeNames <- g@nodes req_ft <- .align_from_to(from, to, nodeNames) ## remove dups indx <- duplicated(paste(req_ft[,"from"], req_ft[,"to"], sep ="_")) req_ft <- req_ft[!indx, ,drop = FALSE] if(nrow(req_ft) > 0 ) .verifyEdges(g, req_ft[,1], req_ft[,2]) else stop("edges specified could not be found in \"self\"") if(is.vector(value)) { len <- length(value) }else{ len <- 1 value <- list(value) } if(len == 1L) value <- rep(value, nrow(req_ft)) if(length(value) != nrow(req_ft)) stop("number of edges and attribute values must be the same") ft <- .Call(graph_bitarray_rowColPos, g@edgeSet@bit_vector) if (!isDirected(g)) { ## normalize from/to valIndx <- seq_len(length(value)) tmp <- .mg_undirectEdges(req_ft[ , 1], req_ft[, 2], valIndx) req_ft <- cbind("from"= tmp[["from"]],"to" = tmp[["to"]]) value <- value[tmp[["weight"]]] } req_i <- structure(match(req_ft, nodeNames), dim = dim(req_ft)) colnames(req_i) <- c("from", "to") req_i <- data.frame(req_i) idx <- order(req_i[,2], req_i[,1]) req_i <- req_i[idx, ] value <- value[idx] if(attr == "weight") { attrBit <- g@edgeSet@bit_vector if(nrow(req_i)) { ord <- .Call(graph_bitarray_getEdgeAttrOrder, attrBit, as.integer(req_i[,"from"]), as.integer(req_i[,"to"])) g@edgeSet@bit_vector <- setBitCell(attrBit, req_i[,"from"], req_i[,"to"], rep(1L, nrow(req_i))) nt <- attr(g@edgeSet@bit_vector, "nbitset") } else { nt <- attr(attrBit, "nbitset") ord <- list(newLeftPos = integer(0), newRightPos = integer(0), origLeftPos = seq_len(nt), origRightPos = seq_len(nt)) } newAttr <- vector(nt, mode = mode(value)) newAttr[ord$origLeftPos] <- g@edgeSet@weights[ord$origRightPos] newAttr[ord$newLeftPos] <- value[ord$newRightPos] g@edgeSet@weights <- newAttr }else { attrBit <- g@userAttrPos@edgePos[[attr]] if(nrow(req_i)) { ord <- .Call(graph_bitarray_getEdgeAttrOrder, attrBit, as.integer(req_i[,"from"]), as.integer(req_i[,"to"])) g@userAttrPos@edgePos[[attr]] <- setBitCell(attrBit, req_i[,"from"], req_i[,"to"], rep(1L, nrow(req_i))) nt <- attr(g@userAttrPos@edgePos[[attr]], "nbitset") } else { nt <- attr(attrBit, "nbitset") ord <- list(newLeftPos = integer(0), newRightPos = integer(0), origLeftPos = seq_len(nt), origRightPos = seq_len(nt)) } newAttr <- vector(nt, mode = mode(value)) newAttr[ord$origLeftPos] <- g@edgeSet@edge_attrs[[attr]][ord$origRightPos] newAttr[ord$newLeftPos] <- value[ord$newRightPos] g@edgeSet@edge_attrs[[attr]] <- newAttr } g } ## graphBAM edgeData replacement methods setReplaceMethod("edgeData", signature(self="graphBAM", from="character", to="character", attr="character", value="ANY"), function(self, from, to, attr, value) { .verifyAttrName(attr, names(self@edgeData@defaults)) lenFrom <- length(from) lenTo <- length(to) if(lenFrom != lenTo) { if(lenFrom ==1) from <- rep(from, lenTo) else if (lenTo == 1) to <- rep(to , lenFrom) else stop("'from', 'to' differ in length") } .verifyEdges(self, from, to) .set_attrs(self, from, to, attr, value) }) setReplaceMethod("edgeData", signature(self="graphBAM", from="character", to="missing", attr="character", value="ANY"), function(self, from, to, attr, value) { .verifyAttrName(attr, names(self@edgeData@defaults)) eg <- edges(self,from) to <- unlist(eg, use.names = FALSE) len <- as.numeric(sapply(eg, length)) from <- rep(names(eg),len) .verifyEdges(self, from, to) .set_attrs(self, from, to, attr, value) }) setReplaceMethod("edgeData", signature(self="graphBAM", from="missing", to="character", attr="character", value="ANY"), function(self, from, to, attr, value) { .verifyAttrName(attr, names(self@edgeData@defaults)) eg <- inEdges(to, self) eg <- eg[order(names(eg))] from <- unlist(eg, use.names = FALSE) len <- as.numeric(sapply(eg, length)) to <- rep(names(eg), len) .verifyEdges(self, from, to) .set_attrs(self, from, to, attr, value) }) ## graphBAM edgeDataDefaults replacement methods setReplaceMethod("edgeDataDefaults", signature(self="graphBAM", attr="missing", value="list"), function(self, attr, value) { attrDefaults(self@edgeData) <- value wt <- self@edgeData@defaults[["weights"]] if(!is.numeric(wt) && !is.null(wt)) stop("'weights' attribute must be numeric()") ndsLen <- length(nodes(self)) nms <- names(value) for(i in seq_along(value)) { if(!(nms[i] %in% names(self@userAttrPos@edgePos))) { if(nms[i] != "weight"){ posBit <- .createZeroBitPos(ndsLen) self@userAttrPos@edgePos[[nms[i]]] <- posBit } } } self }) setReplaceMethod("edgeDataDefaults", signature(self="graphBAM", attr="character", value="ANY"), function(self, attr, value) { attrDefaults(self@edgeData, attr) <- value if(attr == "weight") { wt <- self@edgeData@defaults[["weights"]] if(!is.numeric(wt) && !is.null(wt)) stop("'weights' attribute must be numeric()") } else{ ndsLen <- length(nodes(self)) if(!(attr %in% names(self@userAttrPos@edgePos))) { posBit <- .createZeroBitPos(ndsLen) self@userAttrPos@edgePos[[attr]] <- posBit } } self }) .createZeroBitPos <- function(ndsLen) { makebits(ndsLen * ndsLen, bitdim = c(ndsLen, ndsLen)) } setMethod("numNodes", signature("graphBAM"), function(object) length(object@nodes)) setMethod("isAdjacent", signature(object="graphBAM", from="character", to="character"), function(object, from, to) { if(length(from) > 1 & length(to) == 1) to <- rep(to, length(from)) if(length(to) > 1 & length(from) == 1) from <- rep(from, length(to)) stopifnot(length(from) == length(to)) nodeNames <- object@nodes edge.matrix <- edgeMatrix(object) edge.count <- ncol(edge.matrix) reciprocal.edges <- edgemode(object) == "undirected" result <- rep(FALSE, length(from)) pair.count <- length(from) for(pc in seq_len(pair.count)) { for(ec in seq_len(edge.count)){ from.node <- nodeNames[edge.matrix["from", ec]] to.node <- nodeNames[edge.matrix["to", ec]] if(from.node == from[pc] & to.node == to[pc]){ result[pc] <- TRUE break; } if(reciprocal.edges & to.node == from[pc] & from.node == to[pc]){ result[pc] <- TRUE break; } } # for ec } # for pc result }) # isAdjacent setMethod("subGraph", signature(snodes="character", graph="graphBAM"), function(snodes, graph){ origNodes <- nodes(graph) snodes <- sort(snodes) snodesIdx <- match(snodes, origNodes) if (any(is.na(snodesIdx))) { bad <- snodes[which(is.na(snodesIdx))] stop("'snodes' not in MultiGraph: ", pasteq(bad)) } nms <- names(graph@nodeData@defaults) len <- length(snodes) tmp <- makebits(len) for(i in nms){ indx <- bitToLogical(graph@userAttrPos@nodePos[[i]])[snodesIdx] graph@nodeData@data[[i]] <- .getNodeAttrVec(graph, i)[snodesIdx][indx] graph@userAttrPos@nodePos[[i]] <- setbitv(tmp, which(indx), rep(1L, length(which(indx)))) } graph@nodes <- snodes res <- .Call(graph_bitarray_subGraph, graph@edgeSet@bit_vector, snodesIdx) graph@edgeSet@bit_vector <- res$bitVec graph@edgeSet@weights <- graph@edgeSet@weights[res$setPos] nms <- names(graph@edgeSet@edge_attrs) for(i in nms) { attrBit <- graph@userAttrPos@edgePos[[i]] res <- .Call(graph_bitarray_subGraph, attrBit, snodesIdx) graph@edgeSet@edge_attrs[[i]] <- graph@edgeSet@edge_attrs[[i]][res$setPos] graph@userAttrPos@edgePos[[i]] <- res$bitVec } graph }) setMethod("edgeMatrix", "graphBAM", function(object, duplicates=FALSE) { bitvec <- object@edgeSet@bit_vector nds <- nodes(object) df <- .Call(graph_bitarray_rowColPos, bitvec) if (duplicates) df <- rbind(df, cbind(as.vector(df[, "to"]), as.vector(df[, "from"]))) t(df) }) setMethod("adjacencyMatrix", "graphBAM", function(object) { reciprocal.edges <- edgemode(object) == "undirected"; em <- edgeMatrix(object) nodes <- nodes(object) node.count <- length(nodes) mtx.adj <- matrix(0, nrow=node.count, ncol=node.count, dimnames=list(nodes, nodes)) for(col in 1:ncol(em)){ from <- em["from", col] to <- em["to", col] from.node <- nodes[from] to.node <- nodes[to] mtx.adj[from.node, to.node] <- 1; if(reciprocal.edges) mtx.adj[to.node, from.node] <- 1; } mtx.adj }) setMethod("clearNode", signature(node="character", object="graphBAM"), function(node, object) { stop("operation not supported") }) setMethod("removeNode", signature(node="character", object="graphBAM"), function(node, object) { nn <- nodes(object) if(!all(node %in% nn)) stop("'node' not all in 'object'") df <- extractFromTo(object) indx <- ! ( (as.character(df[,"from"]) %in% node) | (as.character(df[,"to"]) %in% node)) nIndx <- !(nn %in% node) bam <- graphBAM(df[indx,], nodes = nn[nIndx] , edgemode = edgemode(object)) bam@edgeSet@weights <- object@edgeSet@weights[indx] bam@edgeData@defaults <- object@edgeData@defaults bam@nodeData@defaults <- object@nodeData@defaults nms <- names(object@edgeSet@edge_attrs) snodesIdx <- which(nIndx) for(i in nms) { attrBit <- object@userAttrPos@edgePos[[i]] res <- .Call(graph_bitarray_subGraph, attrBit, snodesIdx) bam@edgeSet@edge_attrs[[i]] <- object@edgeSet@edge_attrs[[i]][res$setPos] bam@userAttrPos@edgePos[[i]] <- res$bitVec } nms <- names(object@nodeData@defaults) len <- length(snodesIdx) tmp <- makebits(len) for(i in nms){ leftPos <- which(bitToLogical(object@userAttrPos@nodePos[[i]])[snodesIdx]) rightPos <- which(bitToLogical(object@userAttrPos@nodePos[[i]]))[snodesIdx] bt <- setbitv(tmp, leftPos, rep(1L, length(leftPos))) # k <- .getNodeAttrValues(bt, indx) bam@userAttrPos@nodePos[[i]] <- bt bam@nodeData@data[[i]] <- object@nodeData@data[[i]][rightPos] } bam }) setMethod("extractFromTo", "graphBAM", function(g) { diEdgeSetToDataFrame(g@edgeSet, nodes(g)) }) setAs(from="graphBAM", to="matrix", function(from) { edgeSetToMatrix(nodes(from), from@edgeSet, isDirected(from)) }) setAs(from="graphBAM", to="graphAM", function(from) { am <- graphAM(adjMat = as(from, "matrix"), edgemode = edgemode(from), values = list(weight=1)) am }) setAs(from="graphBAM", to="graphNEL", function(from) { am <- as(from, "graphAM") as(am, "graphNEL") }) graphToBAM <- function(object) { ew <- edgeWeights(object) df_empty <- data.frame(from = character(0), to = character(0), weight = numeric(0)) df_list <- lapply(names(ew), function(x){ tmp <- ew[[x]] if ((nw <- length(tmp)) > 0) { data.frame(from = rep(x, nw), to = names(tmp), weight = as.numeric(tmp)) } else df_empty }) df <- do.call(rbind, df_list) nn <- nodes(object) bam <- graphBAM(df, nodes = nn, edgemode = edgemode(object), ignore_dup_edges = TRUE) ## FIXME: graphBAM doesn't really handle edge attributes in the same way ## we can copy data over so it can be copied back, but it won't really ## be accessible in the new graphBAM object. bam } setAs(from="graphNEL", to="graphBAM", function(from) as(as(from, "graphAM"), "graphBAM")) setAs(from="graphAM", to="graphBAM", function(from) graphToBAM(from)) setMethod("ugraph", "graphBAM", function(graph) { graph@graphData$edgemode <- "undirected" graph@renderInfo <- new("renderInfo") graph@edgeSet <- ugraph(graph@edgeSet) graph }) setMethod("addEdge", signature=c("character", "character", "graphBAM", "numeric"), function(from, to, graph, weights) { nn <- nodes(graph) req_ft <- .align_from_to(from, to, nn) req_i <- structure(match(req_ft, nn), dim = dim(req_ft)) if(nrow(req_i)) { ord <- .Call(graph_bitarray_getEdgeAttrOrder, graph@edgeSet@bit_vector, as.integer(req_i[,1]), as.integer(req_i[,2])) graph@edgeSet@bit_vector <- setBitCell(graph@edgeSet@bit_vector, req_i[,1], req_i[,2], rep(1L, nrow(req_i))) nt <- attr(graph@edgeSet@bit_vector, "nbitset") } else { nt <- attr(graph@edgeSet@bit_vector, "nbitset") ord <- list(newLeftPos = integer(0), newRightPos = integer(0), origLeftPos = seq_len(nt), origRightPos = seq_len(nt)) } newAttr <- vector(nt, mode = "numeric") newAttr[ord$origLeftPos] <- graph@edgeSet@weights[ord$origRightPos] newAttr[ord$newLeftPos] <- weights[ord$newRightPos] graph@edgeSet@weights <- newAttr graph@edgeData@defaults <- graph@edgeData@defaults graph@edgeSet@edge_attrs <- graph@edgeSet@edge_attrs graph@userAttrPos@edgePos <- graph@userAttrPos@edgePos graph@nodeData@defaults <- graph@nodeData@defaults graph@nodeData@data <- graph@nodeData@data graph@userAttrPos@nodePos <- graph@userAttrPos@nodePos graph }) setMethod("addEdge", signature=c("character", "character", "graphBAM", "missing"), function(from, to, graph, weights) { w <- rep(1L, max(length(from), length(to))) addEdge(from, to, graph, w) }) setMethod("addNode", signature(node="character", object="graphBAM", edges="missing"), function(node, object) { nds <- sort(unique(c(nodes(object), node))) ndsLen <- length(nds) df <- extractFromTo(object) g <- graphBAM(df, nodes = nds, edgemode = edgemode(object)) nms <- names(object@nodeData@defaults) for(i in nms){ origNds <- nodes(object)[(bitToLogical(object@userAttrPos@nodePos[[i]]))] indx <- match(origNds, nodes(g)) bt <- makebits(ndsLen) bt <- setbitv(bt, indx, rep(1L, length(indx))) g@userAttrPos@nodePos[[i]] <- bt g@nodeData@data[[i]] <- object@nodeData@data[[i]] } g@nodeData@defaults <- object@nodeData@defaults g@edgeSet@edge_attrs <- object@edgeSet@edge_attrs g@edgeData@defaults <- object@edgeData@defaults nms <- names(object@userAttrPos@edgePos) for(i in nms){ ft <- .Call(graph_bitarray_rowColPos,object@userAttrPos@edgePos[[i]]) posBit <- .createZeroBitPos(ndsLen) from.nodes.new <- match(nodes(object)[ft[, 'from']], nodes(g)) to.nodes.new <- match(nodes(object)[ft[, 'to']], nodes(g)) g@userAttrPos@edgePos[[i]] <- setBitCell(posBit, from.nodes.new, to.nodes.new, rep(1L, nrow(ft))) } g }) setReplaceMethod("edgemode", c("graphBAM", "character"), function(object, value) { if (length(value) != 1L) stop("'edgemode' must be length one") if (edgemode(object) == value) return(object) switch(value, "directed" = { ## add reciprocal edges df <- extractFromTo(object) es <- rbind(df, data.frame(from=df$to, to=df$from, weight=df$weight, stringsAsFactors=FALSE)) object <- graphBAM(es, nodes = nodes(object), edgemode = value) }, "undirected" = { object <- ugraph(object) }, stop("'edgemode' must be 'directed' or 'undirected', was ", sQuote(value))) object }) .remEdge <- function(from, to, graph) { lenFrom <- length(from) lenTo <- length(to) if(lenFrom != lenTo) { if(lenFrom ==1) from <- rep(from, lenTo) else if (lenTo == 1) to <- rep(to , lenFrom) else stop("arguments 'from', 'to' differ in length") } .verifyEdges(graph, from, to) nn <- nodes(graph) req_ft <- .align_from_to(from, to, nn) req_from <- match(req_ft[,"from"], nn) req_to <- match(req_ft[,"to"], nn) nms <- names(graph@edgeSet@edge_attrs) if(!is.null(nms)) { for(i in nms){ graph@userAttrPos@edgePos[[i]] <- setBitCell(graph@userAttrPos@edgePos[[i]], req_from, req_to, rep(0L, nrow(req_ft))) if(length(req_from)) { ord <- .Call(graph_bitarray_getEdgeAttrOrder, graph@userAttrPos@edgePos[[i]], as.integer(req_from), as.integer(req_to)) } else { nt <- attr(graph@userAttrPos@edgePos[[i]], "nbitset") ord <- list(newLeftPos = integer(0), newRightPos = integer(0), origLeftPos = seq_len(nt), origRightPos = seq_len(nt)) } graph@edgeSet@edge_attrs[[i]] <- graph@edgeSet@edge_attrs[[i]][ord$origLeftPos] } } obv0 <- graph@edgeSet@bit_vector graph@edgeSet@bit_vector <- setBitCell(graph@edgeSet@bit_vector, match(from, nn), match(to, nn), rep(0L, nrow(req_ft))) nbv0 <- graph@edgeSet@bit_vector ord <- .Call(graph_bitarray_getEdgeAttrOrder, graph@edgeSet@bit_vector , as.integer(req_from), as.integer(req_to)) graph@edgeSet@weights <- graph@edgeSet@weights[ord$origLeftPos] if(edgemode(graph) == "undirected"){ # reverse from/to obv1 <- graph@edgeSet@bit_vector graph@edgeSet@bit_vector <- setBitCell(graph@edgeSet@bit_vector, match(to, nn), match(from, nn), rep(0L, nrow(req_ft))) nbv1 <- graph@edgeSet@bit_vector ord <- .Call(graph_bitarray_getEdgeAttrOrder, graph@edgeSet@bit_vector , as.integer(req_from), as.integer(req_to)) graph@edgeSet@weights <- graph@edgeSet@weights[ord$origLeftPos] } # if undirected graph } setMethod("removeEdge", c("character", "character", "graphBAM"), function(from, to, graph) .remEdge(from, to, graph)) setMethod("removeEdgesByWeight", c("graphBAM"), function(graph, lessThan, greaterThan ){ if(missing(lessThan) && missing(greaterThan)) stop("specify 'lessThan' or 'greaterThan'") if(!missing(lessThan) && !missing(greaterThan)){ indx <- ( graph@edgeSet@weights >= lessThan & graph@edgeSet@weights <= greaterThan) } else if(missing(lessThan)){ indx <- graph@edgeSet@weights <= greaterThan }else if(missing(greaterThan)){ indx <- graph@edgeSet@weights >= lessThan } nn <- nodes(graph) bt <- .Call(graph_bitarray_removeEdges, graph@edgeSet@bit_vector, indx) tempBit <- graph@edgeSet@bit_vector & (bt) attributes(tempBit) <- attributes(graph@edgeSet@bit_vector) attr(tempBit, "nbitset") <- .Call(graph_bitarray_sum, tempBit) ft <- .Call(graph_bitarray_rowColPos, tempBit) tp <- graph@edgeSet@bit_vector & (!bt) attributes(tp) <- attributes(graph@edgeSet@bit_vector) attr(tp, "nbitset") <- .Call(graph_bitarray_sum, tp) ft2 <- .Call(graph_bitarray_rowColPos, tp) graph@edgeSet@weights <- graph@edgeSet@weights[indx] graph@edgeSet@bit_vector <- bt nms <- names(graph@userAttrPos@edgePos) if(!is.null(nms)){ for(i in nms) { graph@userAttrPos@edgePos[[i]] <- setBitCell(graph@userAttrPos@edgePos[[i]], ft2[,"from"], ft2[,"to"], rep(0L, nrow(ft2))) if(nrow(ft2)) { ord <- .Call(graph_bitarray_getEdgeAttrOrder, graph@userAttrPos@edgePos[[i]], as.integer(ft2[,"from"]), as.integer(ft2[, "to"])) } else { nt <- attr(graph@userAttrPos@edgePos[[i]], "nbitset") ord <- list(newLeftPos = integer(0), newRightPos = integer(0), origLeftPos = seq_len(nt), origRightPos = seq_len(nt)) } graph@edgeSet@edge_attrs[[i]] <- graph@edgeSet@edge_attrs[[i]][ord$origLeftPos] } } graph }) setReplaceMethod("nodes", c("graphBAM", "character"), function(object, value) { stop("operation not supported") }) .getUnionWeights <- function(attrType, g1, g2, funList) { len <- length(attrType$from) attr1 <- vector(len, mode = "numeric") attr1[seq_len(len)] <- NA ## from x k <- (as.numeric(attrType$from) ==1) attr1[k] <- g1@edgeSet@weights[attrType$indx1[k]] ## from y k <- (as.numeric(attrType$from) == 2) attr1[k] <- g2@edgeSet@weights[attrType$indx2[k]] ## resolve union k <- (as.numeric(attrType$from) ==0) if(any(k)) { val1 <- g1@edgeSet@weights[attrType$indx1[k]] val2 <- g2@edgeSet@weights[attrType$indx2[k]] if(!is.null(funList) && ("weight" %in% names(funList))) { attr1[k] <- sapply(seq_len(sum(k)), function(p) { return(funList[["weight"]](val1[[p]], val2[[p]])) }) } else if(is.vector(val1) && is.vector(val2)) { eqInd <- sapply(seq_len(length(val1)), function(x){ identical(val1[x], val2[x]) }) pt <- which(eqInd) lp <- length(which(k)) tmp <- vector(lp, mode ="numeric") tmp[seq_len(lp)] <- NA tmp[pt] <- val1[pt] attr1[k] <- tmp } } attr1 } .getNodeAttrVec <- function(g, att) { unlist(nodeData(g, attr = att), use.names = FALSE) } .getUnionAttrs <- function(att, attrType, x , y, funList ) { len <- length(attrType$from) indx <- as.numeric(attrType$from) if(att %in% names(x@edgeSet@edge_attrs)) mds <- mode(x@edgeSet@edge_attrs) else if(att %in% names(y@edgeSet@edge_attrs)) mds <- mode(y@edgeSet@edge_attrs) attr1 <- vector(len , mode = mds) attr1[seq_len(len)] <- NA ## from x k <- (as.numeric(attrType$from) ==1) if(att %in% names(x@edgeSet@edge_attrs)) { xAttr <- .retAttrVec(x, att) attr1[k] <- xAttr[ attrType$indx1[k]] } ## from y k <- (as.numeric(attrType$from) == 2) if(att %in% names(y@edgeSet@edge_attrs)) { yAttr <- .retAttrVec(y, att) attr1[k] <- yAttr[ attrType$indx2[k]] } ## resolve union k <- (as.numeric(attrType$from) ==0) if(any(k)) { if(att %in% names(x@edgeSet@edge_attrs)) val1 <- xAttr[ attrType$indx1[k]] else val1 <- yAttr[ attrType$indx2[k]] if(att %in% names(y@edgeSet@edge_attrs)) val2 <- yAttr[ attrType$indx2[k]] else val2 <- xAttr[ attrType$indx1[k]] if(!is.null(funList) && (att %in% names(funList))) { attr1[k] <- sapply(seq_len(sum(k)), function(p) { return(funList[[att]](val1[[p]], val2[[p]])) }) } else if (is.vector(val1) && is.vector(val2)) { eqInd <- sapply(seq_len(length(val1)), function(x){ identical(val1[x], val2[x]) }) pt <- which(eqInd) lp <- sum(k) tmp <- vector(lp, mode = mds) tmp[seq_len(lp)] <- NA tmp[pt] <- val1[pt] attr1[k] <- tmp } } attr1 } .getEdgeIntersect <- function(e1, e2) { dr1 <- isDirected(e1) dr2 <- isDirected(e1) if(dr1 != dr2) stop("edges should both be directed or undirected") theMode <- if (dr1 && dr2) "directed" else "undirected" e1Attr <- names(e1@edge_attrs) e2Attr <- names(e2@edge_attrs) commonAttr <- intersect(e1Attr, e2Attr) bv <- e1@bit_vector & e2@bit_vector attributes(bv) <- attributes(e1@bit_vector) attr(bv, "nbitset") <- ns <- .Call(graph_bitarray_sum, bv) c0 <- character(0) df <- data.frame(from = c0, to = c0, weight = numeric(0), stringsAsFactors = FALSE) edge_set <- .makeMDEdgeSet(es_name = 1, es = df, is_directed = (theMode == "directed"), nodes = c0, ignore_dup_edges = FALSE) edge_set@bit_vector <- bv edge_set } .getBAMIntersect <- function(g1, g2, edge_set, funList) { nn <- intersect(nodes(g1), nodes(g2)) ans <- new("graphBAM", edgeSet= edge_set, nodes =nn) e1Attr <- names(g1@edgeSet@edge_attrs) e2Attr <- names(g2@edgeSet@edge_attrs) commonAttr <- intersect(e1Attr, e2Attr) attrType <- .Call(graph_bitarray_Intersect_Attrs, edge_set@bit_vector, g1@edgeSet@bit_vector, g2@edgeSet@bit_vector) if(!is.null(funList)) { fIndx <- names(funList) %in% c(commonAttr, "weight") if(!all(fIndx)) stop("attributes in 'funList' not in edge attributes: ", pasteq(names(funList)[fIndx])) } if(length(attrType$from) >0) { edge_set@weights <- .getIntersectAttrs("weight", attrType, g1@edgeSet@weights, g2@edgeSet@weights, funList) } for(i in commonAttr) { ans@userAttrPos@edgePos[[i]] <- edge_set@bit_vector xAttr <- .retAttrVec(g1, i) yAttr <- .retAttrVec(g2, i) if(length(attrType$from) >0) { edge_set@edge_attrs[[i]] <- .getIntersectAttrs(i, attrType, xAttr, yAttr, funList) } } ans@edgeSet <- edge_set ans } .bamIntersect <- function(g1, g2, funList) { e1 <- g1@edgeSet e2 <- g2@edgeSet dr1 <- isDirected(e1) dr2 <- isDirected(e1) if(dr1 != dr2) stop("edges should both be directed or undirected") theMode <- if (dr1 && dr2) "directed" else "undirected" e1Attr <- names(e1@edge_attrs) e2Attr <- names(e2@edge_attrs) commonAttr <- intersect(e1Attr, e2Attr) if(!is.null(funList)) { fIndx <- names(funList) %in% c(commonAttr, "weight") if(!all(fIndx)) stop("attributes in 'funList' not in edge attributes: ", pasteq(names(funList)[fIndx])) } bv <- e1@bit_vector & e2@bit_vector attributes(bv) <- attributes(e1@bit_vector) attr(bv, "nbitset") <- ns <- .Call(graph_bitarray_sum, bv) c0 <- character(0) df <- data.frame(from = c0, to = c0, weight = numeric(0), stringsAsFactors = FALSE) edge_set <- .makeMDEdgeSet(es_name = 1, es = df, is_directed = (theMode == "directed"), nodes = c0, ignore_dup_edges = FALSE) edge_set@bit_vector <- bv nn <- intersect(nodes(g1), nodes(g2)) ans <- new("graphBAM", edgeSet= edge_set, nodes =nn) attrType <- .Call(graph_bitarray_Intersect_Attrs, edge_set@bit_vector, e1@bit_vector, e2@bit_vector) if(length(attrType$from) >0) { edge_set@weights <- .getIntersectAttrs("weight", attrType, e1@weights, e2@weights, funList) } for(i in commonAttr) { ans@userAttrPos@edgePos[[i]] <- edge_set@bit_vector xAttr <- .retAttrVec(g1, i) yAttr <- .retAttrVec(g2, i) if(length(attrType$from) >0) { edge_set@edge_attrs[[i]] <- .getIntersectAttrs(i, attrType, xAttr, yAttr, funList) } } ans@edgeSet <- edge_set ans } .getUnionNodeUserAttrPos <- function(g, sg1, sg2) { cmnAttrs <- intersect(names(sg1@nodeData@defaults), names(sg2@nodeData@defaults)) unqAttrs <- unique(c(names(sg1@nodeData@defaults), names(sg2@nodeData@defaults))) singleAttrs <- unqAttrs[!( unqAttrs %in% cmnAttrs)] n1 <- structure(lapply(cmnAttrs, function(i){ len <- length(g@nodeData@data[[i]]) bt <- makebits(len) bt <- setbitv(bt, seq_len(len), rep(1L, len)) }),names = cmnAttrs) n2 <- structure(lapply(singleAttrs, function(i){ if(i %in% names(sg1@userAttrPos@nodePos)) return(sg1@userAttrPos@nodePos[[i]]) else if(i %in% names(sg2@userAttrPos@nodePos)) return(sg2@userAttrPos@nodePos[[i]]) }), names= singleAttrs) c(n1, n2) } .getIntNodeUserAttrPos <- function(sg1 , sg2) { nattr <- intersect(names(sg1@nodeData@defaults), names(sg2@nodeData@defaults)) structure(lapply(nattr, function(i) { bv <- sg1@userAttrPos@nodePos[[i]] & sg2@userAttrPos@nodePos[[i]] attributes(bv) <- attributes(sg1@userAttrPos@nodePos[[i]]) attr(bv, "nbitset") <- ns <- .Call(graph_bitarray_sum, bv) bv }), names = nattr) } .getIntersectAttrs <- function(att, attrType, xAtt , yAtt, funList ) { len <- length(attrType$from) from1 <- attrType$indx1 from2 <- attrType$indx2 k <- (as.numeric(attrType$from) ==0) attr1 <- vector(sum(k), mode =mode(xAtt)) attr1[seq_len(sum(k))] <- NA val1 <- xAtt[attrType$indx1[k]] val2 <- yAtt[attrType$indx2[k]] if(!is.null(funList) && (att %in% names(funList))) { attr1[k] <- sapply(seq_len(sum(k)), function(p) { return(funList[[att]](val1[[p]], val2[[p]])) }) } else if (is.vector(val1) && is.vector(val2)) { eqInd <- sapply(seq_len(length(val1)), function(x){ identical(val1[x], val2[x]) }) pt <- which(eqInd) attr1[pt] <- val1[pt] } attr1 } setMethod("graphIntersect", c("graphBAM", "graphBAM"), function(x, y, nodeFun, edgeFun, ...){ nn <- intersect(nodes(x), nodes(y)) nnLen <- length(nn) if(nnLen ==0) { dr1 <- isDirected(x) dr2 <- isDirected(y) if(dr1 != dr2) stop("'x' and 'y' should both be directed or undirected") theMode <- if (dr1) "directed" else "undirected" c0 <- character(0) df <- data.frame(from = c0, to = c0, weight = numeric(0), stringsAsFactors = FALSE) ans <- graphBAM(df, edgemode = theMode) return(ans) } sg1 <- if (nnLen == numNodes(x)) x else subGraph(nn, x) sg2 <- if (nnLen == numNodes(y)) y else subGraph(nn, y) if(missing(nodeFun)) nodeFun <- NULL if(missing(edgeFun)) edgeFun <- NULL edge_set <- .getEdgeIntersect(sg1@edgeSet, sg2@edgeSet) ans <- .getBAMIntersect(sg1, sg2, edge_set, edgeFun) ans@edgeData@defaults <- .retEdgeIntersectDefaults(sg1@edgeData@defaults, sg2@edgeData@defaults) ans@nodeData@defaults <- .retNodeIntersectDefaults(sg1, sg2) ans@userAttrPos@nodePos <- .getIntNodeUserAttrPos(sg1, sg2) ans@nodeData@data <- .nodeIntersect(sg1, sg2, ans, nodeFun) ans }) .getIntersectEdgeUserAttrPos <- function(edge_set) { nms <- names(edge_set@edge_attrs) structure(lapply(nms, function(){ edge_set@bit_vector }), names = nms) } .retNodeUnionDefaults <- function(sg1, sg2) { cmnAttrs <- intersect(names(sg1@nodeData@defaults), names(sg2@nodeData@defaults)) unqAttrs <- unique(c(names(sg1@nodeData@defaults), names(sg2@nodeData@defaults))) singleAttrs <- unqAttrs[!( unqAttrs %in% cmnAttrs)] cmn <- structure(lapply(cmnAttrs, function(x) { if(identical(sg1@nodeData@defaults[[x]], sg2@nodeData@defaults[[x]])) sg1@nodeData@defaults[[x]] else NA }), names = cmnAttrs) sng <- structure(lapply(singleAttrs, function(x) { if(x %in% names(sg1@nodeData@defaults)) sg1@nodeData@defaults[[x]] else sg2@nodeData@defaults[[x]] }), names = singleAttrs) c(cmn, sng) } .retNodeIntersectDefaults <- function(sg1, sg2) { cmnAttrs <- intersect(names(sg1@nodeData@defaults), names(sg2@nodeData@defaults)) structure(lapply(cmnAttrs, function(x) { if(identical(sg1@nodeData@defaults[[x]], sg2@nodeData@defaults[[x]])) sg1@nodeData@defaults[[x]] else NA }), names = cmnAttrs) } .retEdgeIntersectDefaults <- function(d1, d2) { cmnAttrs <- intersect(names(d1), names(d2)) structure(lapply(cmnAttrs, function(x) { if(identical(d1[[x]], d2[[x]])) d1[[x]] else NA }), names = cmnAttrs) } .retEdgeUnionDefaults <- function(sg1, sg2) { cmnAttrs <- intersect(names(sg1@edgeData@defaults), names(sg2@edgeData@defaults)) unqAttrs <- unique(c(names(sg1@edgeData@defaults), names(sg2@edgeData@defaults))) singleAttrs <- unqAttrs[!( unqAttrs %in% cmnAttrs)] cmn <- structure(lapply(cmnAttrs, function(x) { if(identical(sg1@edgeData@defaults[[x]], sg2@edgeData@defaults[[x]])) sg1@edgeData@defaults[[x]] else NA }), names = cmnAttrs) sng <- structure(lapply(singleAttrs, function(x) { if(x %in% names(sg1@edgeData@defaults)) sg1@edgeData@defaults[[x]] else sg2@edgeData@defaults[[x]] }), names = singleAttrs) c(cmn, sng) } .nodeIntersect <- function(sg1, sg2, ans, funList){ cmn <- intersect(names(sg1@nodeData@defaults), names(sg2@nodeData@defaults)) nattr <- structure(lapply(cmn, function(x) { attr1 <- .getNodeAttrVec(sg1, x) attr2 <- .getNodeAttrVec(sg2, x) len <- length(attr1) if(!is.null(funList) && (x %in% names(funList))) { res <- sapply(seq_len(len), function(p) { return(funList[[x]](attr1[[p]], attr2[[p]])) }) } else if (is.vector(attr1) && is.vector(attr2)) { indx <- which(sapply(seq_len(len), function(p){ identical(attr1[p], attr2[p]) })) res <- rep(NA, len) res[indx] <- attr1[indx] } res res[bitToLogical(ans@userAttrPos@nodePos[[x]])] }), names = cmn) nattr } .scaleGraphBAM <- function(g, theNodes, edgemode) { if(all(nodes(g) %in% theNodes) && length(nodes(g)) == length(theNodes)) return(g) else { ndsLen <- length(theNodes) df <- extractFromTo(g) bam <- graphBAM(df, nodes = theNodes, edgemode= edgemode, ignore_dup_edges = FALSE) bam@edgeSet@weights <- g@edgeSet@weights bam@edgeSet@edge_attrs <- g@edgeSet@edge_attrs bam@edgeData@defaults <- g@edgeData@defaults nms <- names(g@nodeData@defaults) for(i in nms){ origNds <- nodes(g)[(bitToLogical(g@userAttrPos@nodePos[[i]]))] indx <- match(origNds, theNodes) bt <- makebits(ndsLen) bt <- setbitv(bt, indx, rep(1L, length(indx))) bam@userAttrPos@nodePos[[i]] <- bt bam@nodeData@data[[i]] <- g@nodeData@data[[i]] } bam@nodeData@defaults <- g@nodeData@defaults nms <- names(g@userAttrPos@edgePos) for(i in nms) { ft <- .Call(graph_bitarray_rowColPos, g@userAttrPos@edgePos[[i]]) posBit <- .createZeroBitPos(ndsLen) bam@userAttrPos@edgePos[[i]] <- setBitCell(posBit, ft[,"from"], ft[,"to"], rep(1L, nrow(ft))) } return(bam) } } .bamUnion <- function(g1, g2, theNodes, nodeFun, edgeFun) { dr1 <- isDirected(g1) dr2 <- isDirected(g2) if(dr1 != dr2) stop("edges should both be directed or undirected") theMode <- if (dr1 && dr2) "directed" else "undirected" e1Attr <- names(g1@edgeSet@edge_attrs) e2Attr <- names(g2@edgeSet@edge_attrs) unionAttr <- unique(union(e1Attr, e2Attr)) if(!is.null(edgeFun)) { fIndx <- names(edgeFun) %in% c(unionAttr, "weight") if(!all(fIndx)) stop("attributes in 'edgeFun' not in edge attributes: ", pasteq(names(edgeFun)[fIndx])) } bam1 <- .scaleGraphBAM(g1, theNodes, theMode) bam2 <- .scaleGraphBAM(g2, theNodes, theMode) bv <- bam1@edgeSet@bit_vector | bam2@edgeSet@bit_vector attributes(bv) <- attributes(bam1@edgeSet@bit_vector) attr(bv, "nbitset") <- ns <- .Call(graph_bitarray_sum, bv) c0 <- character(0) df <- data.frame(from = c0, to = c0, weight = numeric(0)) edge_set <- .makeMDEdgeSet(es_name = 1, es =df, is_directed = (theMode == "directed"), nodes = theNodes, ignore_dup_edges = FALSE) edge_set@bit_vector <- bv ans <- new("graphBAM", edgeSet= edge_set, nodes =theNodes) cmnBit <- bam1@edgeSet@bit_vector & bam2@edgeSet@bit_vector attributes(cmnBit) <- attributes(bam1@edgeSet@bit_vector) attr(cmnBit, "nbitset") <- .Call(graph_bitarray_sum, cmnBit) fromOneBit <- bam1@edgeSet@bit_vector & (!cmnBit) attributes(fromOneBit) <- attributes(bam1@edgeSet@bit_vector) attr(fromOneBit, "nbitset") <- .Call(graph_bitarray_sum, fromOneBit) fromTwoBit <- bam2@edgeSet@bit_vector & (!cmnBit) attributes(fromTwoBit) <- attributes(bam2@edgeSet@bit_vector) attr(fromTwoBit, "nbitset") <- .Call(graph_bitarray_sum, fromTwoBit) attrType <- .Call(graph_bitarray_Union_Attrs, bv, cmnBit, fromOneBit, fromTwoBit) if(length(attrType$from) >0) { edge_set@weights <- as.numeric(.getUnionWeights(attrType, bam1, bam2, edgeFun)) } if(!is.null(unionAttr)) { for(i in unionAttr) { ans@userAttrPos@edgePos[[i]] <- edge_set@bit_vector edge_set@edge_attrs[[i]] <- .getUnionAttrs(i, attrType, bam1, bam2, edgeFun) } } ans@edgeSet <- edge_set ans@nodeData@data <- .nodeUnion(g1, g2, nodeFun) ans@userAttrPos@nodePos <- .getUnionNodeUserAttrPos(ans,bam1, bam2) ans } setMethod("graphUnion", c("graphBAM", "graphBAM"), function(x, y, nodeFun, edgeFun, ...) { theNodes <- unique(c(nodes(x), nodes(y))) nnLen <- length(theNodes) if(nnLen ==0) { dr1 <- isDirected(x) dr2 <- isDirected(y) if(dr1 != dr2) stop("'x' and 'y' should both be directed or undirected") theMode <- if (dr1) "directed" else "undirected" c0 <- character(0) df <- data.frame(from = c0, to = c0, weight = numeric(0), stringsAsFactors = FALSE) ans <- graphBAM(df, edgemode = theMode) return(ans) } if(missing(nodeFun)) nodeFun <- NULL if(missing(edgeFun)) edgeFun <- NULL ans <- .bamUnion(x, y, theNodes, nodeFun, edgeFun) ans@nodeData@defaults <- .retNodeUnionDefaults(x, y) ans@edgeData@defaults <- .retEdgeUnionDefaults(x, y) ans }) .nodeUnion <- function(g1, g2, funList) { xAttr <- names(g1@nodeData@defaults) yAttr <- names(g2@nodeData@defaults) if(!is.null(funList)) { fIndx <- names(funList) %in% c(xAttr, yAttr) if(!all(fIndx)) stop("attributes in 'nodeFun' not in node attributes: ", pasteq(names(funList)[fIndx])) } ndX <- nodes(g1) ndY <- nodes(g2) ndAns <- unique(c(ndX, ndY)) unionAttrs <- union(xAttr, yAttr) commonAttrs <- intersect(xAttr,yAttr) singleAttrs <- unionAttrs[!unionAttrs %in% commonAttrs] cmnNds <- intersect(ndX, ndY) fxNds <- ndX[!ndX %in% cmnNds] fyNds <- ndY[!ndY %in% cmnNds] ### deal with single attrs n1 <- sapply(singleAttrs, function(k){ if(k %in% xAttr){ att <- .getNodeAttrVec(g1, k) } else if(k %in% yAttr){ att <- .getNodeAttrVec(g2, k) } list(att) }) n2 <- sapply(commonAttrs, function(k) { att <- rep(NA, length(ndAns)) ##from X indx <- match(fxNds, ndAns) attr1 <- .getNodeAttrVec(g1, k) attr2 <- .getNodeAttrVec(g2, k) att[indx] <- attr1[match(fxNds,ndX)] ##from Y indx <- match(fyNds, ndAns) att[indx] <- attr2[match(fyNds,ndY)] if(!is.null(funList) && (k %in% names(funList))) { tmp <- sapply(cmnNds, function(p){ dX <- match(p, ndX) dY <- match(p, ndY) funList[[k]](attr1[[dX]], attr2[[dY]]) }, USE.NAMES = FALSE) indx <- match(cmnNds, ndAns) att[indx] <- tmp } else if (is.vector(attr1) && is.vector(attr2)){ tmp <- sapply(cmnNds, function(p){ dX <- match(p, ndX) dY <- match(p, ndY) identical(attr1[[dX]], attr2[[dY]]) }, USE.NAMES = FALSE) indx <- match(cmnNds[tmp], ndAns) att[indx] <- attr1[match(cmnNds[tmp], ndX)] } list(att) }) c(n1,n2) } setMethod("nodeDataDefaults", signature(self="graphBAM", attr="missing"), function(self, attr){ attrDefaults(self@nodeData) }) setMethod("nodeDataDefaults", signature(self="graphBAM", attr="character"), function(self, attr){ attrDefaults(self@nodeData, attr) }) setReplaceMethod("nodeDataDefaults", signature(self="graphBAM", attr="missing", value="list"), function(self, attr, value) { attrDefaults(self@nodeData) <- value nmsNds <- names(self@nodeData@defaults) nmsAttr <- names(self@userAttrPos@nodePos) ndsLbls <- nmsNds[ !(nmsNds %in% nmsAttr)] if(length(ndsLbls)) { ndsLen <- length(nodes(self)) bt <- makebits(ndsLen) } for(i in ndsLbls) { self@userAttrPos@nodePos[[i]] <- bt } self }) setReplaceMethod("nodeDataDefaults", signature(self="graphBAM", attr="character", value="ANY"), function(self, attr, value) { attrDefaults(self@nodeData, attr) <- value ndsLen <- length(nodes(self)) if(! (attr %in% names(self@userAttrPos@nodePos))){ bt <- makebits(ndsLen) self@userAttrPos@nodePos[[attr]] <- bt } self }) ## Node data replacement methods .getNodeAttrOrder <- function(x, indx) { len <- attr(x, "bitlen") nset <- attr(x, "nbitset") if (is.null(len)) len <- length(x) * 8L k <- p <- 1 setIndx = 1 attrIndx = 1 k2<- k3 <- k1 <- 1 nval = vector(length(indx), mode ="integer") npos <- nval fpos = vector(max(c(nset, length(indx))), mode ="integer") fval = vector(max(c(nset, length(indx))), mode ="integer") mm <- length(indx) for( i in seq_len(len)) { bt <- testbit(x, i) intIndx <- indx[attrIndx] if(bt) { if(intIndx == i) { nval[k2] = attrIndx npos[k2] = k3 k2 <- k2 + 1 k3 <- k3 + 1 if(attrIndx < mm) attrIndx = attrIndx +1 } if(intIndx != i){ fpos[k1] <- setIndx fval[k1] <- k1 k1 <- k1+1 k3 <- k3+ 1 } setIndx <- setIndx +1 } } length(fpos) <- k1-1 length(fval) <- k1-1 attributes(fval) <- list("origPos" = fpos) attributes(nval) <- list("newPos" = npos) list( origVal = fval, newVal = nval) } setReplaceMethod("nodeData", signature(self = "graphBAM", n="character", attr="character", value="ANY"), function(self, n, attr, value) { .nodeDataReplaceNodeGiven(self, n ,attr, value) }) setReplaceMethod("nodeData", signature(self = "graphBAM", n="missing", attr="character", value="ANY"), function(self, n, attr, value) { .nodeDataReplaceNodeMissing(self, attr, value) }) .getNodeAttrPos <- function(x, indx) { bt <- bitToLogical(x) leftPos <- which(bt[indx]) cs <- cumsum(bt) k <- indx[bt[indx]] rightPos <- cs[k ] list(leftPos= leftPos, rightPos = rightPos) } ## Node data accces methods setMethod("nodeData", signature(self = "graphBAM", n = "character", attr = "character"), function(self, n, attr) { .nodeDataRetrieve(self, n, attr) }) setMethod("nodeData", signature(self = "graphBAM", n = "missing", attr = "character"), function(self, n, attr) { if(length(attr) != 1L) stop("'attr' must specify a single attribute name") nds <- nodes(self) nodeData(self, n= nds, attr= attr) }) setMethod("nodeData", signature(self = "graphBAM", n = "character", attr = "missing"), function(self, n, attr) { nds <- nodes(self) .verifyNodes(n ,nds) nms <- names(self@nodeData@defaults) structure(lapply(nms, function(x) { nodeData(self, n, x) }), names = nms) }) setMethod("nodeData", signature(self = "graphBAM", n = "missing", attr = "missing"), function(self, n, attr) { nds <- nodes(self) nms <- names(self@nodeData@defaults) structure(lapply(nms, function(x) { nodeData(self, nds, x) }), names = nms) }) graph/R/methods-multiGraph.R0000644000175400017540000001031113175713336017007 0ustar00biocbuildbiocbuild##some methods for the multigraph class setMethod("show", signature("multiGraph"), function(object) { numNodes<- numNodes(object) cat("A", class(object), "with \n") cat("Number of nodes =", numNodes, "\n") cat("Number of edge lists =", length(object@edgeL), "\n") }) setMethod("isDirected", "multiGraph", function(object) sapply(object@edgeL, isDirected)) setMethod("nodes", signature(object="multiGraph"), function(object) object@nodes) setMethod("numNodes", signature(object="multiGraph"), function(object) length(nodes(object))) setMethod("edges", signature("multiGraph", "missing"), function(object) { nV = nodes(object) lapply(object@edgeL, function(x) edges(x, nV, nV)) }) setMethod("edges", signature("multiGraph", "character"), function(object, which) { nV = nodes(object) lapply(object@edgeL, function(x) edges(x, which, nV)) }) setMethod("numEdges", signature(object="MGEdgeSet"), function(object) { attr(object@bit_vector, "nbitset") }) setMethod("numEdges", signature(object="multiGraph"), function(object) { sapply(object@edge_sets, numEdges) }) # #numEHelper = function(gEdges, directed) { # if (length(gEdges) == 0) # return(length(gEdges)) # numEdges <- length(unlist(gEdges, use.names=FALSE)) # if (directed) { # numSelfLoops <- sum(mapply(function(e, n) sum(n == e), # gEdges, names(gEdges))) # numEdges <- numSelfLoops + (numEdges - numSelfLoops) / 2 # } # numEdges #} # #setMethod("numEdges", signature(object="multiGraph"), # function(object) { # gEdges <- edges(object) # dir <- isDirected(object) # ans <- rep(NA, length(dir)) # for(i in 1:length(dir)) # ans[i] = numEHelper(gEdges[[i]], dir[i]) # ans # }) # ##we need a validity checking method: ensure that nodes are the same ##in all edgeSets - which is hard as the edgeSets don't always seem to ##know #####edgeSet methods here ##this is a bit dangerous as these are not really the nodes of the ##graph - we don't enforce having all nodes in the adj matrix setMethod("isDirected", "edgeSet", function(object) edgemode(object) == "directed") setMethod("edgemode", "edgeSet", function(object) edgemode(object)) setMethod("show", signature("edgeSet"), function(object) { numEdge<-numEdges(object) cat("A", class(object), "with", edgemode(object), "edges\n") cat("Number of Edges =", numEdge, "\n") }) ###edgeSetAM methods setMethod("nodes", signature(object="edgeSetAM"), function(object) rownames(object@adjMat)) #setMethod("edges", signature("edgeSetAM", "missing"), # function(object) { # getEdgeList(object@adjMat, nodes(object)) # }) setMethod("edges", signature("edgeSetAM", "character"), function(object, which, nodes) { stopifnot( is.character(nodes) ) idx <- base::which(colnames(object@adjMat) %in% which) getEdgeList(object@adjMat[idx, ], nodes[idx]) }) setMethod("numEdges", signature(object="edgeSetAM"), function(object) { nE <- sum(object@adjMat != 0) if (!isDirected(object)) { selfLoops <- sum(diag(object@adjMat) != 0) nE <- selfLoops + (nE - selfLoops)/2 } nE }) ##edgeSetNEL methods here ##and here we are a bit scuppered by the way we represent the edge ##lists - we need to have the node set around #setMethod("edges", c("edgeSetNEL", "missing"), function(object, which) { # gNodes <- object@nodes # lapply(object@edgeL, function(x) gNodes[x$edges])}) setMethod("edges", signature("edgeSetNEL", "character"), function(object, which, nodes) { stopifnot( is.character(nodes) ) lapply(object@edgeL[which], function(x) nodes[x$edges])}) graph/R/nodes-methods.R0000644000175400017540000000607513175713336016017 0ustar00biocbuildbiocbuild### helpers .node_rename_check <- function(g, new_nodes) { checkValidNodeName(new_nodes) if (length(new_nodes) != numNodes(g)) stop("need as many names as there are nodes", call.=FALSE) if (any(duplicated(new_nodes))) stop("node names must be unique", call.=FALSE) } .rename_node_attributes <- function(g, new_nodes) { ## FIXME: should be done in place? ## FIXME: we are doing the verification twice :-( old <- nodes(g) idx <- match(names(g@nodeData), old, 0) names(g@nodeData) <- new_nodes[idx] g } .get_edgeData_indicies <- function(g) { ee <- .getAllEdges(g) if (length(ee$from) && length(ee$to)) { kk <- .makeEdgeKeys(ee$from, ee$to) match(names(g@edgeData), kk) } else { integer(0) } } .rename_edge_attributes <- function(g, whEdges) { ee <- .getAllEdges(g) if (length(ee$from) && length(ee$to)) { kk <- .makeEdgeKeys(ee$from, ee$to) names(g@edgeData) <- kk[whEdges] } g } ### graph ## A template method for node<- on graph objects ## ## Subclasses should define a renameNodes method only. ## This way, validation of node names and handling ## of node and edge attributes can be shared. ## setReplaceMethod("nodes", c("graph", "character"), function(object, value) { .node_rename_check(object, value) whEdges <- .get_edgeData_indicies(object) object <- .rename_node_attributes(object, value) ## the template method for different ## graph representations object <- renameNodes(object, value) ## if (length(whEdges)) .rename_edge_attributes(object, whEdges) else object }) ### graphNEL setMethod("nodes", "graphNEL", function(object) object@nodes) setMethod("renameNodes", "graphNEL", function(g, value) { g@nodes <- value names(g@edgeL) <- value g }) ### graphAM setMethod("nodes", signature("graphAM"), function(object) { if (!is.null(nn <- colnames(object@adjMat))) nn else # empty graph character(0) }) setMethod("renameNodes", "graphAM", function(g, value) { colnames(g@adjMat) <- value g }) ### graphBAM setMethod("nodes", signature("graphBAM"), function(object) { object@nodes }) setMethod("renameNodes", "graphBAM", function(g, value) { colnames(g@nodes) <- value g }) ### clusterGraph setMethod("nodes", "clusterGraph", function(object) as.character(unlist(object@clusters))) setMethod("renameNodes", "clusterGraph", function(g, value) { clens = sapply(g@clusters, length) nc = length(clens) ni = rep(seq_len(nc), clens) newc = split(value, ni) names(newc) = names(g@clusters) g@clusters = newc g }) ### distGraph setMethod("nodes", "distGraph", function(object) attr(object@Dist, "Labels" )) graph/R/random.R0000644000175400017540000000636413175713336014527 0ustar00biocbuildbiocbuild##Copyright R. Gentleman, 2002, all rights reserved ##code for generating random graphs ##two different methods of generating random graphs on a given set of ##nodes ##M1: randomly generate edges from the choose(|V|, 2) possible edges ##M2: given V and a set of shared attributes M, select for each node ## of V a subset of M. Then compute edges according to whether ## nodes share common elements of M ##M2: sample "properties" from M with prob p randomGraph <- function(V, M, p, weights = TRUE) { if( any(duplicated(V)) ) stop("node names must be unique") V = as.character(V) lenM <- length(M) lenV <- length(V) nSel <- lapply(V, function(x) M[sample(c(TRUE,FALSE), lenM, TRUE, prob=c(p, 1-p))]) lens <- sapply(nSel, length) objs <- unlist(nSel) wh <- rep(seq_len(lenV), lens) rval <- rep(list(list(edges=numeric(0))), lenV) names(rval) <- V tmp <- split(wh, objs) for( vec in tmp ) for(i in vec) for(j in vec) if( i != j ) { pos <- match(j, rval[[i]]$edges) if(is.na(pos) ) { rval[[i]]$edges <- c(rval[[i]]$edges, j) if (weights) { ln <-length(rval[[i]]$edges) rval[[i]]$weights <- c(rval[[i]]$weights, 1) names(rval[[i]]$weights)[ln] <- j } } else if (weights) rval[[i]]$weights[[pos]] <- rval[[i]]$weights[[pos]]+1 } graphNEL(nodes = V, edgeL=rval) } ## gg<-randomGraph(letters[1:10], 1:4, .3) ## Random Edge Graph randomEGraph <- function(V, p, edges) { nNodes <- length(V) nEdges <- nNodes*(nNodes-1)/2 if( any(duplicated(V)) ) stop("elements of 'V' must be unique") if( !xor(missing(p), missing(edges)) ) stop("specify either 'edges' or 'p'") if( !missing(p) && (!is.numeric(p) || length(p)!=1 || 0>p || p>1 )) stop("for 'p', specify a number between 0 and 1") if( !missing(edges) && (length(edges) != 1 || edges < 0 || edges > nEdges)) stop("for 'edges', specify a number between 0 and ", nEdges) ## sample the edges if(!missing(p)) { i <- which(runif(nEdges) <= p) } else { i <- sample(nEdges, replace=FALSE, size=edges) } ## convert to from-to matrix ft <- int2ftM(i) ## replace integers by node names ft <- cbind(V[ft[,1]], V[ft[,2]]) return(ftM2graphNEL(ft, V=V, edgemode="undirected")) } randomNodeGraph <- function(nodeDegree) { if( any(nodeDegree < 0 ) ) stop("only positive degrees allowed") numEdge <- sum(nodeDegree) if( numEdge %% 2 != 0 ) stop("sum of degrees must be even") wh <- sample(numEdge) Nodes <- rep(names(nodeDegree), nodeDegree) if( is.null(Nodes) ) stop("nodes must be named") from <- Nodes[wh[seq_len(numEdge/2)]] to <- Nodes[wh[(1+numEdge/2):numEdge]] edL <- split(to, from) eN <- names(nodeDegree) outL <- lapply(edL, function(x) list(edges=match(x, eN), weights=rep(1, length(x)))) oL <- rep(list(list(numeric(0))), length(eN)) names(oL) <- eN oL[names(outL)] <- outL g <- graphNEL(nodes=names(oL), edgeL=oL, edgemode="directed") g } graph/R/reverseEdgeDirections.R0000644000175400017540000000047213175713336017525 0ustar00biocbuildbiocbuildreverseEdgeDirections <- function(g) { ## FIXME: This needs to fix edge attributes, but for now, we punt ## and we are only using node attrs here anyhow... gam <- as(g, "graphAM") nodeNames <- nodes(g) gam@adjMat <- t(gam@adjMat) colnames(gam@adjMat) <- nodeNames as(gam, "graphNEL") } graph/R/settings.R0000644000175400017540000001542213175713336015102 0ustar00biocbuildbiocbuild## change or return the current defaults for a graph's rendering information graph.par <- function(...) { new <- list(...) if (is.null(names(new)) && length(new) == 1 && is.list(new[[1]])) new <- new[[1]] old <- .GraphEnv$par ## if no args supplied, returns full par list if (length(new) == 0) return(old) ## typically getting par nm <- names(new) if (is.null(nm)) return(old[unlist(new)]) ## setting at least one par, but may get some as well (unlikely in practice) isNamed <- nm != "" if (any(!isNamed)) nm[!isNamed] <- unlist(new[!isNamed]) ## so now everything has non-"" names, but only the isNamed ones ## should be set. Everything should be returned though. retVal <- old[nm] names(retVal) <- nm nm <- nm[isNamed] .GraphEnv$par <- modifyList(old, new[nm]) invisible(retVal) } ## get a particular graph rendering parameter set. Valid sets are "nodes", ## "edges" and "graph" graph.par.get <- function(name) .GraphEnv$par[[name]] ## need NULL or empty string for everything that should not be set to ## allow for resetting (like labels and title) .default.graph.pars <- function() list(nodes = list(col = "black", fill = "transparent", textCol = "black", fontsize=14, lty = 1, lwd = 1, label=NULL, fixedsize=FALSE, shape="circle", iwidth=0.75, iheight=0.5), edges = list(col = "black", lty = 1, lwd = 1, textCol = "black", cex = 1, fontsize=14), graph = list(laidout=FALSE, recipEdges="combined", main="", sub="", cex.main=1.2, cex.sub=1, label=NULL, col.main="black", col.sub="black")) ## create a renderInfo object .renderInfoPrototype <- new("renderInfo") ## FIXME: make these generic? ## return node-specific rendering parameters nodeRenderInfo <- function(g, name) { if(missing(name)) g@renderInfo@nodes else{ tmp <- g@renderInfo@nodes[name] if(length(tmp)==1) tmp <- tmp[[1]] tmp } } ## return edge-specific rendering parameters edgeRenderInfo <- function(g, name) { if(missing(name)) g@renderInfo@edges else{ tmp <- g@renderInfo@edges[name] if(length(tmp)==1) tmp <- tmp[[1]] tmp } } ## return graph-specific rendering parameters graphRenderInfo <- function(g, name) { if(missing(name)) g@renderInfo@graph else{ tmp <- g@renderInfo@graph[name] if(length(tmp)==1) tmp <- tmp[[1]] tmp } } ## return content of the pars slot parRenderInfo <- function(g, name) { if(missing(name)) g@renderInfo@pars else g@renderInfo@pars[[name]] } ## changes renderInfo settings of a graph g setRenderInfo <- function(g, what, value, validNames, n = length(validNames)) { ## FIXME: what's supposed to happen if graph is not already laid out? if (!is.list(value) || is.null(names(value)) || any(!nzchar(names(value)))) stop("'value' must be a list of named parameters") for (i in names(value)) { thisVal <- value[[i]] if (is.null(slot(g@renderInfo, what)[[i]])) { ## i doesn't exist. Need to create appropriate placeholder m <- if(is.null(thisVal)) "character" else mode(thisVal) slot(g@renderInfo, what)[[i]] <- vector(mode=m, length = n) ## initialize to NA (seems to work for lists too, but may ## need methods for non-trivial objects) is.na(slot(g@renderInfo, what)[[i]]) <- TRUE names(slot(g@renderInfo, what)[[i]]) <- validNames } ## Now replace relevant parts if (length(thisVal) <= 1 && is.null(names(thisVal))) { ## change everything or revert to default if value is NULL repl <- if(is.null(thisVal)) graph.par()[[what]][[i]] else thisVal if(is.null(repl)){ slot(g@renderInfo, what)[[i]] <- repl }else{ for(j in seq_along(slot(g@renderInfo, what)[[i]])) slot(g@renderInfo, what)[[i]][[j]] <- repl } } else { ## change only named values ## FIXME: check for all(names(thisVal) %in% nms) ? repNames <- intersect(names(thisVal), validNames) null <- sapply(thisVal, is.null) if(any(!null)) slot(g@renderInfo, what)[[i]][repNames][!null] <- thisVal[intersect(repNames, names(which(!null)))] if(any(null)) slot(g@renderInfo, what)[[i]][intersect(repNames, names(which(null)))] <- graph.par()[[what]][[i]] } } g } ## setter for node render parameters "nodeRenderInfo<-" <- function(g, value) { suppressWarnings(setRenderInfo(g, what = "nodes", value = value, validNames = nodes(g))) } ## swap tail and head in edge names swapNames <- function(names){ if(!is.null(names)){ ns <- strsplit(names, "~") sapply(ns, function(x) paste(x[2], x[1], sep="~")) } } ## setter for edge render parameters "edgeRenderInfo<-" <- function(g, value) { ## edge tail and head order doesn't matter for undirected graphs ## so we simply duplicate the settings and swap tails and heads ## in the duplicate's names if(!isDirected(g)){ value <- lapply(value, function(x){ y <- x if(length(x)>1 && !is.null(names(x))){ y <- rep(x,2) names(y) <- c(names(x), swapNames(names(x))) } y }) } suppressWarnings(setRenderInfo(g, what = "edges", value = value, validNames=edgeNames(g, recipEdges=graphRenderInfo(g, "recipEdges")))) } ## setter for graph render parameters "graphRenderInfo<-" <- function(g, value) { ## value may be a arbitrary list if (!is.list(value)) stop("'value' must be a list") g@renderInfo@graph <- suppressWarnings(modifyList(g@renderInfo@graph, value)) g } ## setter for the pars slot "parRenderInfo<-" <- function(g, value) { ## value may be a list with components nodes, edges (like graph.pars()) if (!is.list(value) || !names(value) %in% c("nodes", "edges", "graph")) stop("'value' must be a list, with possible components named ", "'nodes', 'edges' and 'graph'") if (any(unlist(lapply(value, function(x) sapply(x, length))) > 1)) stop("all components of 'value$nodes', 'value$edges' and ", "'value$graph' must have length 1") g@renderInfo@pars <- suppressWarnings(modifyList(g@renderInfo@pars, value)) g } graph/R/standardLabeling.R0000644000175400017540000000133513175713336016476 0ustar00biocbuildbiocbuildint2ftM <- function(i) { if(!is.numeric(i)||any(i<=0)||!is.vector(i)) stop("'i' must be a positive-valued numeric vector") ## Solve the quadratic equation ## a*n1^2 + b*n1 + c = 0 ## with b<0 and a*c<0. It has a positive solution ## n1 = (-b+sqrt(b*b-4*a*c))/(2*a) ## Here: a=1/2, b=-1/2, c=-i+1 n1 <- floor(0.5+sqrt(0.25+2*(i-1))) n2 <- i - n1*(n1-1)/2 ## +1 since we start counting at 1 return(cbind(n1=n1+1, n2)) } ftM2int <-function(ft) { if(!is.numeric(ft)||any(ft<=0)) stop("'ft' must contain positive numbers.") if(!is.matrix(ft) || !any(dim(ft)==2)) stop("'ft' must be a 2xn or nx2 matrix") if(ncol(ft)!=2) ft <- t(ft) return(ft[,2] + (ft[,1]-1)*(ft[,1]-2)/2) } graph/R/test_graph_package.R0000644000175400017540000000030213175713336017044 0ustar00biocbuildbiocbuild.test <- function(dir, pattern = ".*_test\\.R$") { if (missing(dir)) dir <- system.file(package="graph", "unitTests") BiocGenerics:::testPackage("graph", dir, pattern=pattern) } graph/R/toDotWithRI.R0000644000175400017540000001245413175713336015424 0ustar00biocbuildbiocbuild.invertListOfLists <- function(x) { if (length(x) == 0) { return(list()) } numItems <- length(x[[1]]) resList.inverted <- vector(mode="list", length=numItems) for (i in seq_len(numItems)) { resList.inverted[[i]] <- lapply(x, "[[", i=i) } names(resList.inverted) <- names(x[[1L]]) resList.inverted } .wrapID <- function(id) { if (is.null(id) || id == "") { NULL } else { paste0("\"", id, "\"") } } .wrapAttrVal <- function(id) { id_names <- names(id) isHTML <- grepl("^<.*>$", id) ## escape the newlines id[!isHTML] <- paste0("\"", gsub("\n", "\\\n", id[!isHTML], fixed=TRUE), "\"") names(id) <- id_names id } .splitRenderInfo <- function(renderInfo.list) { ## extract the attributes that are global attr_names <- names(renderInfo.list) global <- list() local <- list() for (attr_name in attr_names) { if (length(unique(renderInfo.list[[attr_name]])) == 1) { global[[attr_name]] <- unique(renderInfo.list[[attr_name]]) } else { local[[attr_name]] <- renderInfo.list[[attr_name]] } } list(global=global, local=.invertListOfLists(local)) } .splitNodeRenderInfo <- function(graph) { nri <- nodeRenderInfo(graph) .splitRenderInfo(nri) } .splitEdgeRenderInfo <- function(graph) { eri <- edgeRenderInfo(graph) .splitRenderInfo(eri) } .print_attr_list <- function(attr_list) { ## make the attribute list double-quoted strings; ## with escapted newline characters attr_vec <- unlist(attr_list, use.names=TRUE) if (length(attr_vec) == 0) { return("[]") } attr_vec <- attr_vec[!is.na(attr_vec)] attr_vec <- .wrapAttrVal(attr_vec) if (length(attr_vec) > 0) { foo <- paste(names(attr_vec), attr_vec, sep="=", collapse = ", ") paste0("[", foo, "]") } else { "[]" } } .print_node_stmt <- function(node_id, attr_list) { node_id <- .wrapID(node_id) paste( node_id, .print_attr_list(attr_list)) } .print_edge_stmt <- function(edge_id, attr_list, edgeop) { ## name uses a tilde between nodes as teh edgename nodes <- strsplit(edge_id, "~", fixed=TRUE)[[1L]] nodes <- .wrapID(nodes) edge_id <- paste(nodes[1L], edgeop, nodes[2L]) paste(edge_id, .print_attr_list(attr_list)) } .print_attr_stmt <- function(type, attr_list) { paste(type, .print_attr_list(attr_list)) } .print_stmt_list_fromGraph <- function(graph, edgeop) { ##print the graph, edges and nodes graph_attr_list <- graphRenderInfo(graph) node_RI_split <- .splitNodeRenderInfo(graph) edge_RI_split <- .splitEdgeRenderInfo(graph) ## print global graph attributes graph_printed <- .print_attr_stmt("graph", graph_attr_list) ## print global node attributes nodes_printed <- character(length(nodes(graph)) + 1L) nodes_printed[1L] <- .print_attr_stmt("node", node_RI_split$global) ## then ensure only renderInfo of present nodes is used locally ## and in correct order i <- 2L for (node_id in nodes(graph)) { nodes_printed[i] <- .print_node_stmt(node_id=node_id, attr_list=node_RI_split$local[[node_id]]) i <- i + 1L } ## print the global edge attributes if (edgeop == "->") { ## directed edge_names <- edgeNames(graph, recipEdges="distinct") } else { edge_names <- edgeNames(graph, recipEdges="combined") } edges_printed <- character(length(edge_names) + 1L) edges_printed[1L] <- .print_attr_stmt("edge", edge_RI_split$global) ## then ensure that only renderInfo of present edges is used and ## in correct order i <- 2L for (edge_id in edge_names) { edges_printed[i] <- .print_edge_stmt(edge_id=edge_id, attr_list=edge_RI_split$local[[edge_id]], edgeop=edgeop) i <- i + 1L } paste0(c(graph_printed, nodes_printed, edges_printed), ";") } .print_subgraph <- function(subgraph_id, subgraph, edgeop) { first_line <- paste("subgraph", .wrapID(subgraph_id), "{") last_line <- "}" stmt_list <- .print_stmt_list_fromGraph(subgraph, edgeop) c(first_line, stmt_list, last_line) } ## see ?toDotWithRI toDotWithRI <- function(graph, graph_name=NULL, subGraphList=list(), isStrict=TRUE) { ## check for the correct class if (!inherits(graph, "graph")) { stop("graph has to inherit from class graph") } if (!all(unlist(lapply(subGraphList, inherits, what="graph")))) { stop("all elements in subGraphList must inherit from class graph") } if (isStrict) { strict_item <- "strict" } else { strict_item <- NULL } if (isDirected(graph)) { graph_type <- "digraph" edgeop <- "->" } else { graph_type <- "graph" edgeop <- "--" } printed_graph_stmts <- .print_stmt_list_fromGraph(graph, edgeop) printed_subgraph_list <- vector("list", length(subGraphList)) for (i in seq_along(subGraphList)) { printed_subgraph_list[[i]] <- .print_subgraph(names(subGraphList)[i], subGraphList[[i]], edgeop) } c(paste(strict_item, graph_type, .wrapID(graph_name), "{"), printed_graph_stmts, unlist(printed_subgraph_list), "}") } graph/R/write.tlp.R0000644000175400017540000000160613175713336015171 0ustar00biocbuildbiocbuild## Copyright Laurent Gautier, 2003 write.tlp <- function(graph, filename) { m <- edgeMatrix(graph) n <- numNodes(graph) con <- file(filename, open="w") ## nodes declaration writeLines("(nodes ", con, sep="") writeLines(as.character(seq(1, n, length=n)), con, sep=" ") writeLines(")\n", con, sep="") ## edges declaration for (i in seq(1, ncol(m), length=ncol(m))) { writeLines("(edge ", con, sep="") writeLines(as.character(c(i, m[1, i], m[2, i])), con, sep=" ") writeLines(")\n", con, sep="") } rm(m) ## nodes label declaration allnodes <- nodes(graph) writeLines("(property 0 string \"viewLabel\"\n", con, sep="") writeLines("(default \"\" \"\" )\n", con, sep="") for (i in seq(along=allnodes)) { writeLines(c("(node ", as.character(i), " \"", allnodes[i], "\")\n"), con, sep="") } writeLines(")\n", con, sep="") close(con) } graph/R/zzz.R0000644000175400017540000000121613175713336014073 0ustar00biocbuildbiocbuild## unexported environment for persistent stuff like par settings ## specific to the graph package .GraphEnv <- new.env(parent = emptyenv()) .GraphEnv$par <- list() graph.par(.default.graph.pars()) .onUnload <- function( libpath ) { library.dynam.unload("BioC_graph", libpath ) } ## utilities qrequire <- function(package, quietly=TRUE, character.only=TRUE) { suppressWarnings({ require(package, quietly=quietly, character.only=character.only) }) || stop("package required but not installed: ", sQuote(package), call.=FALSE) } pasteq <- function(..., collapse=", ") paste(sQuote(...), collapse=collapse) graph/TODO0000644000175400017540000000023613175713336013403 0ustar00biocbuildbiocbuildsf 24.01.2006: Need to improve toGXL so that attributes are properly written out. wh 28.01.2005: can we have a "==" function for graphs (e.g. graphNEL)? graph/build/0000755000175400017540000000000013175724651014013 5ustar00biocbuildbiocbuildgraph/build/vignette.rds0000644000175400017540000000054713175724651016360 0ustar00biocbuildbiocbuild‹•S]OÂ0- #j {3&öì?  ‘|-[7jF!m ñÍÿm"våvëÆ$úЮ÷ܯ³sÛ·BÈC~×Cž¯~¨·¾^C½z¨‹ý½™ ²]=æDÊè…ï ç»\±V×0ÎwRQaœd 4ÀX)Á–;E5êͯL<¡’e°{“ö0žcÂ\ñÀqA„J»ui˜Ð„Ie,ˆè¹Æ]ŧiÏËw+yF’m’þ&IåªKRá ‰S£)Iáj“Dlt2 Ë´> @/²š9:™CÁÄ´<¶îXÁLà9Ыƒ`HEJ ÿV«µû¬-Ãý¶Á@Æ3;5‰WŒSœS"xÿ£‘~+ÈÉšÚ?ëزœÚ€W¦JÃ_L¦p씣˜Ð-剽´—Oôc¿Ú®7 ÄfÙfׅПz;_MFæ4¸¢H” ¯­ï äÑý÷graph/data/0000755000175400017540000000000013175713336013623 5ustar00biocbuildbiocbuildgraph/data/MAPKsig.rda0000644000175400017540000000136513175713336015553 0ustar00biocbuildbiocbuild‹íXKoÚ@6¯`H‚HP*õÀ‘ŠHSªŠÁ!‰L"­”«……€e›V•öG÷$ÝÝñú]»j/Éöú›ùffè˜Ê·íòmY„¬É=G†ù,¹e¡Z"Ïâgi¢X ]Èä^†L…ÕZCTÉuâ€ye*Ý8ã½ÉµÒ™žñ·©4º”¹­(M¯./†çœ&)_:îx* ù˜$o<8åãÁÕWÅçú’ÌKH7“ðÒu^ŽšÖÆ0LdY ÕXvëµc¨6g?ìµußj˜èa­¹øaS]Ù‹7Açã¦<–>6 s½\Ì[ }åZš3´\6¬ùbÁ…GšŽFd·j°ðìIŒB…®FO€O¯îò˜`óú±×Ýå›þÌn‚E°ˆ“i°˜† 5FŸOS‹œ˜·á"wKL²¹>³YcÙÛ?ó¥™Ä—.gûîÙ7ezèö6OÀõ¼ÜÅX,Ìó±ßó6˜ïù{<<ãvFþÎeŸïŠy}ìsÑM0‹nòdÝÏóü>'›oôƒÙÎ-¯Ÿñ.¾äÜ%ºÈ“¢Û:¼þFñÚnÃí]èæ%_œ¦nÀ8MBÁæõ1Ü|Cxø$YmC«]¸žÀÅ\ôà‚—»îù~w.xô¼‘ûø"F“«hž dº˜/iN¢´VúÃì’Ò±FîGû+Ült•ßlÉ¿”¬<†V̯w'>Q%>U%>S#êÎóŒæ¼Võ¼«Jl« §ÃBÞccWÍɉÎ>6¾RMéP•øB¨à鑚'e¢á¸¬ªGl¡É÷lff0TW¶²²»Â‚1ŽcT–‘yÖib(×4àB»·…°Ý¢M*à°LÇÁP³˜TänZ±kC͇APÒ¡PO†èC­çOºÀwR|ÂèÝÌ’ëû~[ á3˜¡kbnºAISaIÞÜX¢àM"a=³1¡¿º¡ÆË!“_ÞÈ"Õ ï¡·QX7¿~?«¤Þ~/;Žæaç ‚^p)Lq!xåCîgÕCs‰â±”ŒE!‹>ô„²W+œs3œÆQDaùÅð*=a¼\lêdôöäŽj_¾²ªûfœ%graph/data/biocRepos.rda0000644000175400017540000000354513175713336016247 0ustar00biocbuildbiocbuild‹í\ëoÛ6÷3¶•Äqì¤]€}†}Ú‡aë]lU^ ²Úiê [¿*íÑÃd·)ü!Zÿ¤ýíôà‘GÊèõŠšw¼ãÝñx”Å287ŒÉØ<|± ‡Ö¹}:>{ÙgB1¦N§¶#Ïbë«·,Ú˜xdd;£4 Ïó##‚Ø4ÏNN#ކ1]ö0UÒe¢ñgˈ 0‘XðqÅõ­€Œñ@Ów'L§ç!=•£ ýùáÑ8bF$„€VÍV¤fƒ]ø<Ø=;㳃ÛÚØw¦ç‡aò,”f²d åy¯¼‰Œsœo“7qd<Ãùƒ˜[md˜Ñ í±s¹3ð´éNYZ› Ìõ‹ñôéccö`øç0Iœ/‘y‘RÀ¢fœ3{f80$Y¦‰ãGZ9'Na'›)õ©á’è·˜Wã‰î6LgrÙ• òæÜãëŽí2 áı=fHÕsx”—m˜ h®qILkD¼§$ùâ.S‘Éhêq‡“§±?ÒžÁûnb+‡ôõ½ÈÇcg# $c3ΩØ/bߦ;ff¿¥„‹©kxýþÀ˜LloÌÔ_‘àñOÀÓ‰á²í¯r|ª%ñ1ɘl‡Ž¶¿V_§›X…ž\¤H<(Þ«•^)-Ri[NÒ-I~½”ýèMúA®p†Ë*œ 1!¾—´•õÖRûpSÁ[ ”õã%Í´¢I#ôm¿¦í7´]Á›OPW@ÑmÔ˜… H²ð“Ǩ¢ße3n-iƲþmÑhÿv·å*`ê÷KšéÖµgÑ`@.?¤í£b&Wu*¦]gí³bŠjL]&¨,EÞZ ¢?¡3þXlÆ:sá)m’\)¸=Ë`Ùç—Pæ#XXxÝ¡†ýLÛ_>WŸ?½@Yß]’ó+úž¸~úÞuÖîÓþ>í/kþꬔ<’¢{íõr¢Y.ºnu¹BJê¿f¦ëGÅßZ€W°èT´ä“[PÍ-cÁ .ï!ö3h°§U82 £žgë¨÷i¿Oûƒÿo°*:u½èÑ_Ï}‹‘£r½œèÖsßVÀ°ì¤¨‹ò2ªˆmׇÅßZ Å\£_RôÓkÚ¾ËÚ—”þR§-åÃÃúÙ%âA€?¤ÒJs÷/'aÃb o-P†Ç㻟žpžß|× Ô[ï’zëy©Þz«·Þ¥ñ­7Ô&V´šIÑ:HöJþê®–í¡´8Nåê ¯ÅòÅ0[Ú×Ä_D¥uYI*I%©$•¤’T’JRI*I%©$•¤’T’JRI*I%©$•¤’T’JRI*ÉRþV}JGtù­ú\¼No#¿YïÒAóÜ {—SæâæVvÛ>_tÍÞxø¶}rð¥{hÒÝ{›ÒE4JåÖo &HfJLQ×2p¡#=a€ x³°;ÛCòi›æùûÈg À-Ì1Â`=íÌÅ«ãVFäi3ðÁ¡¶Ð`ž_ô8/‡„à¬0¡ËyD¡ËÇJ±ï!Žt¥ÞA,Œ,è€rIÕ£sß{Œ–Ëé6caåk<1Gh‡¦!ôD:V2"NÌ9¬b5í ØŠ”´Àž„,Ç{æÄm:CTÜadѦ ÞÈë@Æi«‘!<Ö€‚­Ñ1GPŽ6±¬9ÆpdÎ'TqÒVBÂÐŽfB@ð-é L­ÑGwà¨ô0YÊ?Ä’*!âpˆV%¡EÚÐLÒR ¶¦Í)(eè8¹^FY;ÙÌXyðI‘$:˜…̹éyÜÆÎ"6¶e á[äèö0O4g³pÀº#UÔõì"×(§»–ÑP,©¨ieD“Ñ€ÀÀ2t‡Ìt9dFÞKˆƒÂûGÔ,gÑxÎÔå ØÔãâ´ÃY‹ÁNh:ö´Æ¬<£ÁR¦.J:$YÜ&]›’K$â “Q¥ào ‚^m¢GáÌY…rYn&$´¿Ö ji;¡ Y‘ƒpYddÄå:¼ë£5Ó¨ÄJOcDQ"ÅÄÁ‰a^cµ‹ Ñ÷‹LNþ)„ˆ:[IÌëqsR¿ùáãö´rpÜ Ä‹Ÿ½‘ÏM¨HSrU€ì]È„y1kÉFúG°-\Éž„8T¯,­sÓ²ŸJV>80Þ=„+Ï;ää°C Kïÿ4_‚Û7Dgraph/data/defunctGraph.rda0000644000175400017540000000137413175713336016732 0ustar00biocbuildbiocbuild‹íXKoÚ@6¯ðH‚HP*õÀ‘ŠHRªŠÁ!‰L"­”«……€e›V•öG÷$ÝÝÙ5~«öR"¿™of<»èÛ0Rî…»‚$II)™%Ÿ)b¦“ä#!I¥<¹g¿ÈCÕžR"õ:àÊÌ:²‰Q"× ÓêH¾åöÞðFmŽÎÄÓHî_)—•G×W—½ A“Õ¯M×É=a’¼²»§Âî^S¹êÈŠh©+ß?Š‚¤õ†zê)ߺüa_vfÐS;nX§Ûoô]}{ßC‹?Õì¥iZȶ«š¹0ú[î(ÕÆ?…ýP¯Zèq¡»øaM›;Ówþàãš2?UMk1›NêUcîzjc4›Uí¥õbþÁ#Ý@}²Ze<»§T¤ÓhKð×®ð{ŽÁÕÓÝÕóe¦à“'ë!Û„N Kúy"m'Ñ~ã-¿ ±º=‘¶J·0  »zûªµxU“ü^ܾb=Þ€’‚Ø>‹;á÷q‰ÍøC:"×ñ¶·n1Æ;ÇƇ¸Ä‹Lü_¾€0ýUaóv"G‚äG|þR”_Ñ-âD‘Ö) ^ îúÏ¿Öîú½hjÜ;Qß—sÇÜ1wÌs=ÓAÿ{ ûT7±Låbè‰2Ê "0°«¦(P&ª ƒž2耓0è*Ô¤ âÊ€˜ÂÂq@f!3í ­u‹ÉX.$f¨.$¢U1—^@hYòŠ!aA…pÒjÍÖŽPfx_èsMa-Ž•Y 8 ×à‚z8 ÎÔUaiq” ¯ü­hHÜu4Ñ–3ÇþÓm¶:·gšMÓyÃsšãXìŒø1ÂÔÆšÙ3†¥™÷<Ü2ý•ÂÞÈÒöÊ«vsçüóú~ ¡ÃçºòÌ©¬N6‰;§O-4vþÂð¼'ª§—:dE—ý :ôuW°Ð\GÖÍ|²X (Hø”é5¢œiS³ÄÐKx{ÙlÐpýÅIõÆgraph/data/esetsFemale.rda0000644000175400017540000016310413175713336016555 0ustar00biocbuildbiocbuildý7zXZi"Þ6!ÏXÌç=æ])TW"änRÊŸãXa“ÆqÅjnçj-&êa{ÔúŽG²%D·i¿â]´ÿ_mê6¬N½xZ• † ÄŽûæ×ƪ ¹ø°,ù›¨„[¬ÜÌYó^é©ê °kM tUÅo©f5GÑ-æ> ¥VÊø¼k¼¾¡'O¢.æÄI:´‚™4|ó­ìó€ ÒE¨x ¥áw™8ž"úÏæ[§m¡Çì_—YWƒ³m[³¯]ñøûêŸýjhjÃ< Ðl5x݃ÖJMrL»s÷—Pèûú¤ª|“u bšö I'µÓëùº¥èm_ZYXÇçyÉ:©])ä¶…Ö¾LdÅóŒHʾäÈwÑ>û£zùª¼î¬=£Z ›ÊôIŠj¨X›µX-{‹É£íÏEº1[SN :€j²QÆ(£µ_vÝ,—kéùöäbû²evmâáÙ(’Ͱ!Xó{#~9p;Ì{-+(-‚U°ð3瘮=,b0©K}: ±ÖKö¦¢ÆþÂÇŽêvÛª|xý{ŠfñŒeÊÒ-®âæðé»?ž€¸»mÄSS 監>¿L–‹óÑ=æ”_«ŸÚ K¬‰Ek°ÊÙà:§ÍPq?û&ߊ¹ мÛcÙÿÁù’R–D»UëÃÆ;Œµxh;¬«´dœVâ8–¶†0ÌÔÄ ž°¥©û|Ä÷\Žé©¬Õ*ìÖÖÐÜ|Ðj·f²ÝTkÂõÝLœÎ3lªzö»ÓP½Ptˆ›çÛ·žáбS*^ÔVßñ/Àt¶¦«(F €¼IΛ±“_-âµC'Ø\’Ú°áŒ>‹ Û£sÊÊ5;”“òJ°aD]£¤¯ 5›h¼sÅõÈ¥Ò&‹Pfq˜€îɾšH²¢:mÞÄ)^Š+ßpBw´÷)„<6çðþä|aåËôLr÷ÏNÙáøB’µëP,ˆ”@9f¬U™àÖ!M\ÐLÿMø5›®vBAù.n×[Ð#)¢q,Dôó¸w__s\ÿŽ"÷§fÌoû1ßz½‡a…—=逾qÖM©Ý²2riöƒ‰¼²sïh³ÑÚr½ÉqeA¯3 aÌVª›4ddY!ýêQÓ¬ m2™Î,Ím¶HNTötfk-û¢¥ëÕ`Ùr×9öïjnˆIÛ4¼7„#…è¯rN°£ç²]\=F GPÿžÈm¿×xˆy¢©ð àMtè®b_ekõ,S¹j5šI¼ï3b®9.í Èe:‡ÊžÔKf5瑼ƒÙÕ÷ðMÒÖAÄö¢û›äo© JâY‘ë«c¸‘ù;„BIFx¡å°†z¯jXäÌFFø{ÆÖvéûÇÑÍß‘8m¹3ÌqcZ_.騍Š\L^0ßÌ[àùr»ðÓ åÇJWíÒé¼£º›îá£ñioVlû7D=OBy“#¬BÛµYÊö—´¨+Ç;Zj&\Êø9opöZ ìZTuE£)ؾL3´%×þÿ»ÃD©¬gc+ÐJÁH,ñnÆ-|yW¶¤£Ò˜É£‰Ýñ÷¯œ¡á ”ÍsÅš7wè?uH¬¢KmËÛT¢ò½ÇËh8¸1nîÕ#'¥¢9Àwž‘‡ÙR6"IÛ†ÛÞˆá~nAf¡¬y…\/Íég©ÅOã aÅiiñÎí'Ö Á•¸p]ÜìKù¨=Ü£ø¯`zè…×à‘&¿ÝΤ'^mâ´¡•A¥¸!ì#»Êï±!bñ3#ÄÃýã–³çé-Ö/> ké ×¼S\Ì>äÇ÷Κ¯&ôÚ(ØÅ@MMív³éM–Î+ÓÕÒ‰f F¼:¹(аl܈sÕåª%XÏ]ôÂw‚ÊÖ_D¸U¶×é^²ÓlÌ|êUÕ)jÓ„•Å1¶¼Z„ŠX“#ø +*Ñô\»ASBøâDù‡â[uw¼l‘U…*Û‘ÞB•~}`£S޲˜¤rß/ñË*ô»Íf)ª¬Áu \7ÜjóMZÓôÒo£'¸Hc|ºÿ$•qò#2ƒi'g‹wÁza×ò¡5ühw…AT"î w¸Œ?õ[¼(Ø ®m†È¯`^ éòõ › ÎÀn OÄÆ´†Û¼5CKXã\¥K&hS:ÿF’_Nªe\¶ôwjçe¤lÿu˜KEð\¸ñSõ\”¸ž–=†Z hBÙ¬â9œþÇ£÷À8“&¥Ù:²;ÚÏo}¢ä“‰pëÁa6»ÔG|‹:É@€ ¹&MU J§(¢2Ñ\+–ªòj"ë®_í  5vº‚d9:Ó·ÜïR„Ó§Øþ?i¹¦þª þúõš‹Lc‘ ##wò½grÎð‘¹NOHXbý¯“Š&¡ûGîš’Ê[S{kî»IÕ™†K·Ü]•q\Ù–ÛÇuÞÄpà23”4p«/ʈºý9ùìe³7ÿU\{äò¬ËœsBϪ[VG<“û¡Q²³ÎÊW‡Ã’ågÊë{È6—*›ÊºIYó"êì’í7InÛ6›œ&§£N9*Ë©€6­ÿc¯­ÝDMáRÆÈ¹úåƒÿ~³°-(Œ¬óäH„²æa¢”¥œž’ÈåE,ZÂİý¬+«†ã¥ÀÒ]2¬ÉëÓ!vŒ˜pßB ‘)â® ½^5ȼƒ?2É8Rb „ø^(5N·­³òw³“D³¶œ{œ Á~ê„÷Žméðûwfc¬Â_§ÂÓÏð-ý?`4¼ ?©6½„szÒäö@­^Gt 4D¢ó : )“ÑŠI Èóì ‘Ä#)¸hºòuslËá@Uð‰ý—½{ê‹¢>czqH¨Æ†¹Ê¿vÛç>ªIà.t´3 Ô×´57t&×þy»¢µÚÂ>èú–pA¢ÞŽbLˆÎþ¢AçßrE;á¢Ò£Ã߯ò«TaËõ»ýÄoš?àŒ5éö©3œe5ÛÒ ‚4 vðEG:g«Ø9Mc{DF($þôqdQP¸#Ð }Gáñß>ˆ×´{– ]ƒ!­è¤5¤L—g¹mßõ6lfA Ò½ :ÀÔ•ilDÌêܸ(*ÿÊÌ€î!Å|;àÅÏü{AfÆùå$øðœúS˹#Wçè‘hÀVCFnÒ†œ¼%2|\¬ ‡ÎO ’Æ‚‰¢4ö dS²ÕÇ›ûÓ3¥¹gægƒWxnû~Ÿ¿IÿX/#iù˜íCYdÿ]‚iËu€ s`†¿áè…˜(˜é¢¼*o„òƒ¬Ð\]øô=?Üå7e|íÙ½N¥ÇBÈö&]¶ö»Í) ÑèlÜîwXé E,'Þ\ª6•¹¼YÀ_:·¬kljK|m{ZÏ:aß…$Dq•¨òñ³Ó<÷ɽÅ4AMÁž1Þ‹)HyØZ¶÷q´"Ì•?ÒG¦ hzªtêñ™qfSÒXºÎ¾ ¨×»‡Ò9¸ëÔsvsiËI’I?+ î3¸º™Ìáï{q˜¤VUZ²2ÓW‚%ª†^¢hbÚe‹°Ð8(õ mû‡–hËG¡…¼ß†»^:æÚøÊ%¶–ˆÀÇ@mFýÈEKXC§†ä4Ì[fßÁ1ÀƒÿšH½÷d] Ž©ž×Ãúp¯ŽÐ“U‹(±cþGÝ/ ©°à$ÚòÛB’ÐÉ,Yg;.Á(ÉQ@X¸Wà?Ò-4­ûSlz^\•:sƒF$BÁØ‚/TŽã|•)ZG$mÈÖmŽ+DÙûÿ‹<4è™…×—€…ÜVç @1D„õ¤KíÂÎ1“†íöÅþxåávq0&Tƒ0cº¯ °ùÓC¿~vbÁCü›Ž}#r,ÅD“OUL JPõ$ùžŽ|g’Àµ3^|Cæ£c?G ÷‘ œ¢ ³õOá§€èHˆ¼nfu­‡µa°ÄÔÌÝXÆMŸºã?úǨ*5w€)ûr/N7ˆŸÁW]– ä4=ÂcˆR¥¬^Fâ~ êR¼Tyð<¼ X%€RlÄ^¶qå1±xÉq9*i¦B¿ÂF{8„à _<•µðé™ÕúÏ„£*Z²ÆÞašÜŸöJÁÿ·…y9 öwE…ýQ4lá!«õÜZ1ß—)êYð²,éç1á>ž³l±æAઆ5] ¦qÝåŸì%2 äýEÀQž†o(LH [’f¡ÍÖrû‹ƒmÒ§‚*Yä görözsö´œ¯%¡Váãuâ~²æ¥Ôt .Ú¨KÆìž2½£1éøâxÆ¥Rž²>DõE­í•ì~À¤‘ê]L.âèw €• †šÂô%½×Q´C³ùŸùž\Á áŽEöd÷ôëqÉÅj­È ßIÿp696PúêhnR£™ýÈê_Î[ ›'‰¾k°l Ò¡$F~$6K·U°sY^ÃO-bc@Ò&œ*[¹ês(ÿÖa°à,˲LÂ{ä6M‰eŸ¢P‡"9ýÛ‹äÃH€ñ2pÓÿ,‰ûÁ ò‡J’)Æ@ƒcî®Î¢à<ÿ‘“àWkì`s .QêHs6×Íp[ú ‚Æ­—Q黺,]Õà.[¼bq:zÉ>-±—”k]N4pèë¶¼>ˆ@f™Æå޼iȸm$ ‚ãÐ ê¶{d[ºÓýLòE.¿Òk¸7î„»U]cdM^Î*…@UAáÏoÓê[ïÀô“#(}#û8˜DÀ×Ô²ô5? ²[2Ä]ýš–k7kü`þÓnÀ‚ ¼¶Öå@:׊ê ÅÂ<÷»ñLÊFY9³£iúÐ{9B ¹s¹ i 1QjYXÍtNÊ´–¶ÙùE2¥ßˆ’—ØþGªI(ð‰¥ìòÉÉCRÔIòï5ïu\”v™‡~Þâì ÚËÁÁI_y› ïõ›çä,¬Üd` ˜.…YêçµÎ+-½½ÚT2×qt°&eØ¥ŒIlŽ’åt¼½¾†õ~láUäüe åÔƒ62{çÇ—¥Ž|í¨¶Þ…êOÏÆJØÀA6p‘ÍôHlMkóGm|•m'éƒÏî\#Õ1T?»ÃÕðcµ,—7ïxqCï©2RúyžK¿|ÕËž·ƒ;å»;§:YÊC T¦½zCŽ6úÅ„ œ<ÂÛ ~¥`Å^”tPG«ù í&{¿KÐ=dqÖa:õÆO9_gœÞrHÓŠa)â©·þæ«j…²æ©Ê î9 PÆuþe]-È)§?m¨ lÚ¿Ni;Ï; @{¸ØþnoAÊÉÔ£ÜúIÔ*êÿ§Ùщ²r5€õÇDµúí2ŽÑé³C#ú1þïJDb<¹¦‹'‡Ê$û£B³5¬BÐèž^^57£% uF–¯•D…ñ±©€fÖv/†” _гҟŒá†î•Q±ü¼bFãRpÞkêÞÀ|HR. ¢ÄB$¿¨¸¹"PWðâ\\[6)k¸$2ã“@ð|6/ß&Çφ :ýéö^ß¼Ði¾_Ž˜ü >òé½ÕÙgÛóð0ê¼ã²'~dß3ÕÍ\–4¾^-mcF…BGÅj”¼GI/×HútuFîk_9”#¾´)›~¢ )¡X…¤UNÿÚc¯•€3¹æ‘õçá›p‘çè&h訋u>*Ê»ÞfjXä'¬Râ~Cëæ;9†|EäXVÚ7}ËGRH¹ïê×*_Îp šâõÕ*Y¹2Ýܼ%2vf¸íT7©Á'Tn‰“®œ15Ô~ø¡\ïE¥ù€¢çžÖ‚qû"܉™Ø`Nª+‡_<6 ^4ì¾èï²Rx£sp?K­Ù¼ð¸«Ž»jö¬`ü”–1o•sA½j'mµªôÝjn” ƒšY‘I°„‚Â’&{ü<¨亻¹‡€$á?Õyå®L$Hžû·DYsa%?)f-¥™Q²“Ñg•Uƒ ÝFîŒÃ—ÁºÁð²Èü:,Ú `ô¼ü’dÚx‹sÐ˶ ÷‹ÚnXÏð ¿ËˆØÖ*¶uH¬¼EdâIÎG %Ò,…šf–Ë6’+uEÔªôW}Vƒ‚åM„ÆÊÍŒ/»Ê‚×;U£.4Êÿµ}g#=Y6pŸàUAŸ±Çˆ¾™dÈÑ ‘zɦ¬°œ#‘Ũ¯éJÅ7^¿Uìäá˜Þ²KÁF‹©¹ç³Š&ô%m<&Æm¥L¢Ló¡A,ÆÀdŧ¸P+­›zÇ%ŽæáVðóÿGêõÎ{®.áø- ¹ï° M¹ÞW*­q¦ :a7¹}³17†bè‹,cC¿;f¿\Ã`é÷hË­tÚÀ RêDà ËéÛò¡ô?=roÅyعàðRVÏSòV± ˜AúIª6W›Î8C[ˆF!…_0á‹à\åŬØsAý.­¢„åaR#, nŽ>áÙi‰Æ7ž¹xÚ_)²XÞSov嬰wRS§bê]/~{ÓhYâ¬Òüú›B³Ô¨Ÿ´hÑ,MjÝ€TEÈæp㊠óF݃E µô€¿†¹…£3 ÷Ãàé¾}Ç͆‹a|sqÈ@ÂϸÅYdºqÑö12ov°ýòà³JCYÛM©¬Vß F•‡ÇùïGcý89œù$ÆV|YØbYX‚šÁ 8IYäk±ê “£KH32N—ÎàᲘМ½P½uÅ5à'áeAÑe?IcJä< Å`—ÏOvmm8÷x8‹Ñ=†WDÊÔ4ZщBåšwé÷ûåܺķU¡i顟L°ˆØ¦nÊ… hÖ`þ.m4Ñðš¶¾ÿs·ò}}%buT™°HaÓÑÙOÚ[ß÷S|iÃB5ÿ‚JÒ›'ÕÈ n†[÷a9`òÓ…,ɉÄì=k¸1N„ ¨,Rz”vE9ÈŠnÓM¾_ÏKÜlßjò¡v£zÉÛn‡KM°¯ä¨]•@¶t'SCVƒ`CþBºžn½¨¦•—‹X¸'::䥗±"föšû1CWÀÌ‘h$zéÉþÓ`)ÁZ(—lͧ‚q`ƪ­_!†¥0õ}°§ãy‰K¥³*<b2vðï5 -ÄÊ–#b>!6pI‹iµç `ô‹SžÀ.HTæ:fÇ;Rά´‰Î8äžR(´÷¬‚ºÚ(^F¥¡ÓZW£NÂ1v‘ ½ºéŸ$W›R |4ÈçÙÒ€’E–XÊ´g˜Â{IyÒPIü{rDá*cõ~}"6ûؘ™%j÷Ùû\~J냧_Í¿3¿M±ôÍ©³Q$ •Á$ÙÄh!Á6DÁ ¬iBøú-ò©rzwóFÔäöì~ò´Ö8ðMZ¶-]ÿ‹÷ÌÚšPÜÙ}E.öpe¥Î  [-Ìâ¨ô°÷þ ™)-Ï\ÀÞ5C’;7uõo ð³D\}÷ï­œ™áÇ~hîÄëßJÀ𬻇²Ùy(M5<)` Æðå²@‰ eÌô‘¤kuË_¿âD6ÅßùM5¢wìµl-Bl›ƒ µÂÔ%@6\˜ |Ħ$ Ù€2EÕ¸ÃUø¯(=tøF¬­®€¼ÐjÉBáN‰Õ"áB~vNȽ` Ø ¸£¡w´Úk„‡á;ÝÀíönü€Þ§Ëˇÿ;=±ž+»=/®.˜Sc…„ mE?n~¡J—Žþ8ˆ´'ÞÖ»–¡)ñø¿pÊé…€õ°X:jo­­Œ¼å¸0ÔA;Ãù­âJÝË,$N1‡ÄhßÝ Mòœ|ØY4SŸÇóΓq_`ÏŠÇvjñe²À¹ÿQ ßAàÃofSnQÐû 1û`2ú?¿âQ®¼ëˆQf hÑ=\|_fÀG$–"SO}¼ÌÒ›R~p%ƒ`iP)µŸSñ$ï<(-jA ½ ¿Ÿ@BÉÊØä÷¡A¤¢¤™ÔN¥âgò: 70dÕ+‘BЗ–9gqd$@˜‚f¦§Iñ^ø5¨ÈÌ%ù¥sØ üAªå°ÓÁÈUO˜”°ÂçBynafí¯¹Ù‹|ÿ[­JŒ"¾öР㠜îƒ|3·Å3'm'Á6§—öÿWBô z¶ I¥aþX0zBO›ò2Ži?lþƒæà[GQŸV¼A;ëxËBÊHÌQ‚Á¿Q '{ìeh3ùsÙ–ÜÀ r I÷(-0¾Y*‰F 0ek¯>¢]Eõºx[d‡ ¿NìS}áõîœrœþ̵iþ¯iXC3›O Äl ¼«@ª¾ÅpØ4û®V¸J‚x¦#L‹Íë«mü¡äƒ‰ÐažÙè ù¬ú\žÊ„f\*æîÓ¿>ì€%E÷{ìí³obý (ý2èI¤jfϪJµ_#†PKDázªã …ÿÿ3]?Z@‘yYš¿GÎìЇ[¤+ã_ÍÀC Aâ'aXúæˆa.žz†e|DªhŒ{ÞR$ï Ð"„".*ßloè/tžY>åCVع›tE%›ë6|¼|ïéi¸:Ppo×nÖvøŽçÁ_7ÎÕÛ(óô8wn.Ç# 7àÌú B̳èÛ‘¶GËåÑ‘òíæáÀž9u˜daFÇåÄ…J~Í­FÔ©)Rj¦…VáSû.Ÿc`ù…Ú–îÃÌ/r”9š .LJ°6¹íî°ÓÖ¶ô¼sÉ=œ<îl3ð@ìíÓ ¦¦Pç"Lz+PÓûÊSÒ†þtúŸR#i…Æî==|SΆNš~+Ýò¶ÝÝä½Þ>ßÃ.Ji¨Zmñ§ =KúŽ«-­•Ò»+¿´(­ïùÞ¿ˆÁª–ëE!T „7±ÕÍÒ¯„=ÛYPxOÒ'Í.®¹ï+#éð¯¼cå€;(ñ ¢Ï±IBO®š¿’yÿ\lšašûÈž–tê‘Ê‚1q–îË ýñƒÇ¡#Ê:Ê‘픜¶DÔ¾(8¿Ä»¤|‘°ÒzO[cxú?…†áÚÀZ2 dŠ©(.z#"H›+ª¹…0BDbУ¥ê¢ <–t!™öD+æ E9û¾OŽ~=ºIm”Û…Îò¶eéÍž ò¢üG™²qïñ¬{aý„vë$܉Ÿßñ]“í’œÓßÛìûÞÒø‡…§±£m6ÀÆø$² ´F”a ŸoŽÎSÜ’ï2xŽI®¢ Nw –¸ØnQy¹ Úžåag±PDRÙÆÎ¬Ór ´‰’0çF{ö¬Zqk²¼v¾›Ññ5zƒÙ"‹17'e+•/Ò蕊pã¨r…Äù` ýŠäKsþ­E?™•§ßâl1’1^uýí[ž-È·±&¦µe`%²ññ l‚d´×ã2n8=Äé2èèÏA·Ò¯ž@½]ü/2^€åÞP'I´²ìÀ'qWË¡ìo’«œµÚ(Ð>9ŸÓ°8H„8dåëÿrË:¶¸P£ë)sQ@ìŸB°ÑªåYÊpÍR6•¨/¿ëÆ@£03ˆ­OâS‡ÃèžiOÑí’¾¡üy7Ýöl”Ô±iÖ¨¬±¨üÞ«Én÷ÖwØ`,ÕÌ?),#t¥°ºEªp·.iÃèãu&?ð+£18–ñž±RÁº=¿øœÿž}$a¸™!ç=Z)Qb7I:²3ļÕí¦ÔOFlÌ'¤·Õ¬y'À¢O§¼¿ºÂtue2™RXîõŸê~²pðœ°ÛÅ3!­Ÿu/ìêÕàÞÅÃ2œÝ*KÚ¥§%ŸuþÈóÚ˜Q&üP¿ŠUùªú÷’ œ26ß]+1*K¥öžìX@o¨PWó+n4D{3¯ÓõFæIØYhø'‰mé[‹‡G«Ïo,ØIŽ!É ¬óŒmð‚¸œð6e0uÅfQl#§G¾cÈX`wǾ³íŸ¿ºÊV¨oåITrMÁÁ,´ø ðlý˜,Ê©·Úì÷¾™I^eÜÈ@3É$’|~?G€íˆ6€GjªOb xw9fÛä±…t¢S,\«Q4o­IòÀÝîL–Û0êý ù>‘”‡µÏb]<÷’‹øËѺhQé‚ $€†¼wË~Ïöüa·Þ\޵•Üi oøõbô”BOý‰è f.ë0A?ð"øÊpÎë°ýu@v"9qcG=“]zl9îç—JÍÜ}éÛB“W²zŠPÝ=VY=”?f †ç¿¾^(<íDK{ŒVB®4ÙGñ„9™®[rÀLVš\Npä%Û;úÛHû³37-šQHn½oŒ¥£©èùMϳ8sjI8;¦F&׈…募3KF€ÈgªNZ­9©>™Pì>ó[¥š8™_¿qû$ (#vPŠñb¥­?¢p¨ï‚oùŸGàµOhTË{ò8Eþˆ“ øŽuÈ熞ÁLãí!d¡z>óØz¼° ÄÏž’Z^ô`Í oºA<ã?ÂzF d$³0ø'j­>ØÌ‚æ¨?ák«èb“Y»ú VÈiŠ,o£„”\KÑ‘ÆCe~ÏýÝayÔMU`Xó‹wäÓevʪ·ô3ô ª“¤ÛØèµö‰—Œ’ #ì½<šñôM¬ÅšI—ÿkÆ{•Jê(ú|g¥šÅ ­ P†önÝݾk½„Yj«·Zƒ@ñ‰Ú„»ÁNê(p×â3{êSˆ3Ég·í¤RÄ‚ÚV GûÆÌzÆæ£D’‰èUÛµr¡ÆþW÷ÇVòê|õú†˜{öÓpÎ#Su0_[¥i>+¸m?o˜ñ*޼£ùhÀóÁ0=/"iæùeÖ¸ÕRw;ƒ^ô­$GêèùòQÌkO @›©K¾/‹‰]ᵚr\¯îVla2ëDÀÿEpFô¼“ƒ°GcOõ(”QÚÔƒ¢t²,}?GeÓ ëÓÚ™xSàÕ¨—¢(…‰eÀ3[]ÅiÄK”¢pÛt¥åÈ‹œ¿i°¾T @Fÿ¿•ïrrÝ›“×#ûÃEú˜HÍùG6ñˆÁÓÙ± ÉæP éwID?Ï5tÉòsDq£A—ŒûâvÐ÷_.üY‚Õ“ ð§ ‹Òa«Š#á`ñvkvoRS  ¼ŸÉËk¿E”šUôýøx;- 5PΨ•æíkM„ði'£àT+„QíÝätÐNÊÐRŠã§âCõYúšFã/g‡cñ +ì›6ó=:gb²ÿ¤|žÀÚ5rÛèÞ]÷Š8 €rᯠrmhñeöEïy„Í5Ò…>2òuNÆ––ä_S±ôÀ°¢àè¬Dxãí‘S:ÔTÍŠ¨>¤]n­Ÿ»:¶"£¯ä;ôЬ.W(”×°+a ÿkIšÉñˆ D³â]W³ÜKP®d ôÜAiºFM—…‹’z9'å•ö7‘·'PQöÚ™!ü®4ÿCç\ðs±ïpÝA«Õ€WèOaˆ oj{ôx™NÏ+ƒ†z¡Q>¶£49Ä s¿—ìûuK-Þò ‹|ѵØèè/;07æÿ»¦•–_/æòM·PÆV}§Â‰jÂæ?QSlèšSè´ìÿ3QÓJ%×:Ë)°leI›r^ÇKrõUC¾–Ž0À”rh×±qoô3¸H…ô=Ï„¸Ag^* øeÅX-lGV’ÍþÝÛX¥%C;5K?óÓ®»jw!Ø÷`-~e(xÆb±µôê?¸J?ÁÍg*QýN“!U¿ûÄî/¿0Á‡EƒÍ¥YI¶àâùâæA†4˜ñÏ·¾;[eôT?×þÌo%×|yš Ê_OF±Ó±š†ä V5‹2ó¢üeÛ—%|Ò“ê÷sãFþQ¦#8l9t&"ÃÔôbm-7Å÷/’‚H ¿ø1=X%÷¹Ö²XÒ&¡]J ZMo¼š™Fƒ¥$¬xêx—ÜI‚¬íWlaÇ7Þ½]ÆÎ«”BBB΋¢_Düqß»æ‡2é j ">+œj¼ €Âå¾ðŒ÷=SŽBdzoDÜŠzá–ê ¹˜ž[ÜÝ­j¥ËvoaŒøÂ“Ú™• N[£üª¿Í36$Â?õ&rÅ/¤ñÊnÉñäp\úH[Xðç*H•-þ¶/ˆô)A|*¥81=‰5šHm⺔æ0&­f8ë÷1ï\tOŸ$VŠÿ‰¦]bd–hêìc{ëü¶t¯xœ^þ… ð<¯á&ˈ`5%ÿ‰®Xàh¾¦/d- Ï­¡¼udò¥zÆ8"Æú:…ªv»[…^îèÀêØzªxˆfh)Æw¹-T/~=ÆÊ%žÖ+Í'¬þ ³ Ix©ïŸìxr'*ÈM†¿û†}a(i² ¨¨h‰jyn©¨˜âE„YûÊX±Ú)ë¤MÒ4/¾»uETGå?ö‹+ô,MM©ÌÈô»3„šdßß{½£h0©idî~K¯”^]…¶%îÖt³LR¸~ï&X¸o„ ¸P=x)M ½âB  ”-ý7¶pYwýø ‹Ó}¯Ð¥Z˜A†a.F윢™”}†Ð»ebPV£j2•$Àq1ë:-9‚»hˆ*tûÝ›š7~¬äÊÒc&ª%8‘ꇰ~JUÀúna¹!?¾ÙÝÎ%{Í F÷)K/¬­m·šŠ~úLÅÖ¯£)éMY)Ò©àuÒ&¹â’âÖ¯†<Â%rÃ.»,}ËMà±Úd"d¥¡Ÿ3éÑA ~¸åÏN$=ì¡ûád¬È½©Ð$BÍó“öЖH$iIKÜ9Ê5ØÉ …¦(d‘;ÃÀ3ÍY!­þ„¬CíYÀ‹Eiöê…SÛŸZNX#@£ˆNîx'ÙžpËÿcí‚i’> ûµà¿ëE¤ÁdS;SŽEÙ:y+ÞÊ"‘-û€©©$30\èÈÈåÞ6{3˜¹LÊÐù[6‹«×RÞc ?&ÓhIòð‡Q ¼s©wòL|É„WÃÃÕC•=WYU6*ÿ+SÙ{戜²[ÔvÙ©”› ½Qìz%±ë¦:_ºY •¯RµJkß±ÜùÍùÈÀsŽgdη¶Uw@"úé$I€9uigZ%g¨ b²h|VóɃT×÷$dð[-´¸Ý±FJ»¢v$¦Â“£öª`µqP[¬Š“òCªüïrKê´–Y|LLLI‹l?fîÏÈ@—[‚•±eó3Û^›ã´ jøzPqi'œMgRF7iCòÊ!ÊWÌhiÀâ܃™u4÷¨á¯ áËâºïJôÑ`éM‰Èrê`6ÇkäiOe·dnõöíbÙáîÛ Ñ§ªvKk›ß‘„$]i´Wueäœ>XQN5׎ÕëQðÎAÉZÑ…!¸f?wšÇ‚u§ ƒ`Ïx¬¤òù¼Ê߯ ôb´P—õÞ}ò-©˜œ‰axãŠÙb4{;¢ò®í°ãª!ÖÌ¢²æêÛL«GptùÓ"†{¢Gå6ÔŸ.ÝåUÀ©D™H˵ÕúaDaÍ-9ŒÒÍJ;(á¿Zí–ÌénÂ’ñÃvÓ¦óçŸÌÄXäp²Þìs€1­ÜH4,}Í•žÌÕÄ/¨kÓâ²wR3oׂïØfZ$ QBZ­CzäËË•&‚i¿/FцA›Á:63ý­É¯4QUvÿtåí8IWó .D<â7ª³ÎþóþU‘+1&¿0$.x˜Þ~¼"Э€sÅoÆ(lm”dÊHGã7tëC„|‘w\?`9¾‰:wû…‚3è µEb= +ÀÅL æ£H)!§˜™ýpSxN¶‰-7^“º©¾5¿Ð)WN¬þ =ùL¦:´‹ükD‡ž­Kó>°BXH‡*ͪëeÿO`QÏ{ÓzPÝ,>BÈÈÐ5q.òå¨åNÃOÇ~܉n>•D–g@ݾ«˜ìQÎ@å¾R45Å0sˆB¨ñ´ÕŽ¿ª¡N@ b††@Ãmh¶-Œ·(ß™3·ÑËÓa%º,AÕt…Ì!ö~•Ÿë²›GÆÂ°ê” „^îy°ÔÄr²¬¹Ù“‚½Û6i6>wùæÏLG¦bgq‚€Õw`GÐ œ£z7lâÑ%Î*²çùrKýuLb°˜·¬‡¢Å>~äàülaŒ–Š‹y5$‹=”¡\HtxÏ^:ž*TŸÔpR­š‡Ç .ï=’V4º>óÇ>Tõ®ã »¹ 0#ß³P¯Ú4@R™5Z‰op16a°·0<È·h€¹¿ÝR™6p³BFæxÉ% @~àˆ¿ {2tÄC¦¾À±ðªÊEúŒEühàcàãÖø¨u²­Îy9n±4¬f9òâ/†O­dÑ+ž¶~È(â¼À»Ò6ñˆœ±ùÖÇcmö=)Ç™§wòÊÏuåj¼i±"Gü3®ê±j÷fÍ©@ˆ´(à#¦ìÄŽ‚9MŽ«Æƒ­Ô™øI@w¤‚™[Xî-8à”T@$xA¥²óu˜*äW…¼~^QÔ£÷é¼³ð‘ãd˜3Y%‚Z7Xy½¸×5€çw"v¶ð “AÖrßi(¢ö\g„L´ «Ù›9xùç|÷]‹LhðiF‡ö¬ä¥ÅPÚ™O…α߃ñ õ‡®[gÆvêáÀvSÄûŽþ"˜Uµ(Élä`B-g•þB†ÇN}»tødZØ ý£WNaúù‰âJŸ²B7u®yý{å—³V'ÇäW4 ( ª@šÃÑ”ÔÅVÖ£MHÓý74ºdBwDócwWWfF8¼gEhÀ{¨ÌI~4b¦‘Þ—=/;1¢0ÌÓ ßÓØã¼®H\-ññçlÃ`X¬/ê+xµƒeKÐ’]䨿ðØg›D"Â×jK*49J87åš"tµuÌé_­~Æv‹ðà`~d0GZf}ÖKf@šÌþœe—ÛfJŠêU¸!–t>n?åN¥'Jò9ÚO‰w‹·i Ñšð‹›˜L¦ÛàÛW!‚nx¶€XqX" áåïï R( ³-q‚o'@üõœè¯å ÈË‚—_z ü ž·ÛÜØ»èåÓ« Ñd¸ý!]ŒÆ.5'cÁ®v«÷3}ô6R±RT‘G‚Åþ'ý¸ÿƒjƒ–y¯®$Cð£[.Áî‰Ó¬‘CÇâ±3ƒI´–·zTÕ×Én©$Tø¿†ÈÂÝ)7v wn6ø‰³'!Ò]—gÝÖ »Ãé´cžþúÃPñÙèÅ/É4¸•ñ? £öZ~G˃ÒK«å}¬‰ŒÁuÀÜ*y–Ÿéùq%¾‹$2¶‘\!;¹\Vïý¼z3ÿîøHu5†zY}‚F|û‹O]îÐYâç&ÝÙøöËéJ¯òä>À¸wT]æ±ù˜kìCb7tÚþ· ‰ûë‰ËBþèˆFœQF¸”n›ž‹Ô²Å[[x°Š36ϲP¹»!¥…r\K)Ü;‹45°£b&‰÷ò¬Bæ0Uš9dïhcI€îŸ#=y›t¤ ì磡Æ×£Kò?¿*$œWtì€"-xº•y 0ò,"C6;iŠêxc¼¸f£’½;‚¯†ÓÍ›MÁÌJ G‹ÚòE³H"IF œNîœå("èEÍÁ—¬Í`žšo—Ã/þ[@h—>*–5Ü}ô¡LÿÚ¹±¯3öô͹r=mû×–ïLo;' lâáá–J2©“Æbåjñäî»i4ã-Ç@￈x@òVgiä'€\(u»–Ç.rǘýä6]»¦rT)XGÌrÂô÷²ä”ñ}ÊÞÓ·’0¶Ž§E#ð(Î幎 ÁzJ)LzMÈà¶«Ïéܯ&B­–ŽjÛ90&y¬÷‰‰ºdWû§:ÐíYRqdñKA"(”ƒ ‚ˆ‹jb‹Ë¸|?T7ÖÅzßîïØNYèN¡sVMU‡gÍ@ WZAÞƒÉ`gù†óìÖ#Ó˜ë2i?å0GÉ!Õ+/ÿ óªjCgŸJð^tЍ_êŸIš‡ôzÀ(Æ ù‹«ƒ¶6·vžŠÐ‡©hFª]X9x]uDå~-ênæ¿!$vã†=záX\zþ Þf*^”Þµ=麴Ìÿ”é|‘f¬ðó±Á-œ2-(</Ûór"×ÎS·ö+ä¦.~ãqg`TIÓzм¡&ß ‘¸Ü Qÿ¡w3´ñö§àÃPHñtlì–nßå‘r·*½9 É.¡øˆ2€ ñ¬ëdIºõB´ñ(qT ™ôóCÿ—˜)ÿÂ`ô4ÞÛ,1›Q4yýÍ©8lÔ£žAi Ì“õNÅí"£Ÿz¥ª™†f#xzÊœñ÷rhSŠÝ;Œéœ¢ÿî,ƒó úa'Šò¤ÀÖÞV±¡ã\€y%ž ½Ã”®Ýåµ½š“ÉøÐ‘Óôø©üœÅŸ°‘®°®sŸ= ± œ~¤¹)ŠÔU¼9E£ÅiÉi–À? c6a±<þÂ4¥éìÆö‚…S8¼Ù!GjAªâN%N¥ˆøRk3ð…¡Ÿ®=ÀÑmUäÌðÏà6ÚUmûíÖ!ÄZÒm¡¥ lYOU¡{þÓc¶¥(è98»IˆˆÏÓ8{ò;qÜJú†NŸLÚR7½Ð@Q|æ7žRû·‡Ùþh˜Mߘ’±þŒÊÜMzÒtnV†È#PÙ¸ÜTà=bXq-Yh2&Ì?æyu.à1Àöª[¼åêÃ0¶ÅN+í¬ß[lI;Õº§¬³,Y&:"Õ43•™dLªŒx7doðWûщzñ 6ùª !Û(‘RäA¥êÙ›y;,Ýd=ˆíÎ5%±µJÖvÉ[&º4­ÕS[ºuR—a*pû‚þäyÔè!¨°’eY¹âè¸áÏÃ}ÇßT'èϰˆe§*”#ý_Vä®vÔT.H`¯—âP”îEMì¨%GÐyä63Ùøt›Ýmáyƒ”;i.ò“r,o’á}e—Õìa+$¹S`3F¹TÓ¶h IâåjÞaÌ áÞDTÜ~¸”J‰mZÐOüvŶôû®«SíÌŒœ»#1 Cd…Á35o#‘¼Ya-$&š `n®ïÓ~àUz)'Gøw¤©P1*RzÔç†Ùü…k qio>žf‹HÞÒ¥‹ºÃ~Énóü."k$Ú æÑ1[o¿Õe9°xñajÿRÎ>ìQĉ°!?]ØÜ÷„(£Œ~§ð¾|Œacød^X0Üæ^øW¶r`cÄ×%ó?"ÅYØÇÜݘ7§Oc¯Ñáëw]éõ¦F‹9éò\½«OÉÆ”Žkÿ,|¯Š‰»>å…%8Ôj–­kAyº1‡b ã- ä­E•å9†âU`2)ë;)VHšÅ)þeQŽŠx†Ý¹{-œÔnšQ|As±C Ì@;4±G.³9ƒçDÆ€3—¬éç#• ÌõÖˆ,Ï¿³/UTÆo<‰/´÷do˜yG®d*/P9‚ËD­Ÿ‡Øƒ¥çømâÁ¯˜ÊŒË‡yÓçD¼mÕÄ^ý”ãð›þQC¾H246}ŠˆtÏ ïlÍ?È…ú èv¸ŠŸÇ^¤›%éßOIëið‘´ÆFÈîšÒigÑá¨ÄÚÞgCðF¤\Þ°l¶Q^  µzŽìžgó£*Ø=ˆ³lVPe»ötªz¡ÌUÉWqsø5ÐÇC¡;¼(tñ#C‹'åñ aqt¿ÑåÖ&Çl««‹ü£u—8üæÑ­A.Íz »×j zß¶‘‰*4³Ié‘r—s6Ç<¥¨ÜM("x÷ «L¾“ËSJg|ÍÙ’Ç䯤ã4 Õš€¬f›îÁöWzõOr(gÃt…6–êáéðqÕTý?ÚÊcoJy&Þ³­>™t ?7ê5Œ jÊèZ5jß.¼·=æÚª?ãfcˆB VŠ m’AŸés*^ô£Ÿ)@;¶ê–Bøî÷jaÞ‰ÕMêB<ÁƒOºñ‰©[¦%"À­C7ÑØóSeù]Å㿯® 0=Ó4b M™^NØô9¢Yê”-¬§'"Ìa&Øz\¶a¯Úðé ý+î²ÃV”ÿøO¸¥1#Û&|c(,s ÐvÃSÓ¬yrÆ„>5‚÷š ÆmöøH¢Íäëúl~-¦Ñg€²(ð& c"lÃ;¸ÓW^¥0B{cv߃`Ñ…—Ϊê–”fdÈ+¹¢F]þ†¯âædá•ÑD’qŒÝ~)…Ð@[V{òbN–çÙö…¹æÄÜÁœ¤âà—ÙèÁwÜÍgÄ'’¢ùŽQ’ åˆ@6¥‹r(̹‹¾6PžVØŠf 3g}íÅØIu¹WsàÙ‰‰ ‹”hhÚž~½ƒŽe´hŠæœ ñ…byà4 0ìœ{’pÁ1^`48—iH^yÁ7ÝìËLJÃ1ž$ñÑÜû>^Ø»_P?"ÿùBÌÚlÉU–×›ÏÓµà%r'Ø3µ¢EÂ/ó§hÁïbBðKtǯ?+=T×,ŽA4.N´å6zÈ>® À‚ØsöVEgïsQ¨þ1«-.8aZ}DGPBè¿7ƒlà’…Nã* ôI;ÏÏÏ!Š}ÏOe.Èåíù€ughõuÚÌ®F<¹ x/Œ Ø8½}6SG3e«oTRÒ´þ°ALÇýkŸ>‘fÔ®êÃ|wûa÷„aë"kñþ¦C¹ÆOs¯5÷êM@KKzñ±ôK¡uj=Ig=ɦØ`ÜF,èXÈvj¡.†I§¦fQr‡› Qb—Oàöy2~Ш$ £î@S©G†žé÷¯ƒÜ Jy†CÒíãsk@(G®8íœ+•RàÈmáêÀ|o7Y“yáÛ€}Ðx%< JÔ£Qå°¹d5§„bLÒøÝ $•=šÑÿ9=»‰«Ïª¥çå[i§Ocþi^ÅG€õâàÞ˜7l Çó³Å~×ñþp‹Êex'V$¡ÃîÕw3E ¿ÊBìÖ¤u%Ì}í#†ˆG±¥°ôù¥OýÕÁ~Zž‡©v’\ðYª„îÓÞ»Ìõ– ´·f!"ÿŽ­önŽAã&zÎÚ\(Á—´±…f„×â9˜f‹¼P ‘7@"®ÿ`'ŠwÉö°oê`)o/øý†–8oÚq*ŪT™ ‘Ì&ÑäÏ ®Ô*ºÀ5^×+5$Ê2øœ¸5 5Û„ øý^Dí\¹p º‰H°)¥S¦'få±>ÄVÝ‹£F g{àkÑÂ' Ä¹õ—b—”v9ý´a0Êû½Lˆ¥'¦:} …ßïCÖJ,|D éŸ&ÈâhPò±áAÇ{‹ègà”.V›Sòý&Åhû#Û{ÕIŸ`*¿þ@ráMº¬ ~Þf$Y<š²ƒÞ¶±áŠÙºöInÎõkŒ¿«¯P„¬Ð¿ÉöGxVÄ™Ô9î"[ªPÖ‰¹é`_žEk{¯Ò”ÅÎ#”‘$²ŠemìSžíC\N%ò—öuýkUɾG]OCÖ†{hmBÛögÀ¬Ú4N{9Ï"[×¹£Ñ¹lÁÊ¡àÙ¸ Å’gtaðWøçާ/ÉÀ.Îë‰SZ‚û‡GµZ%À‚@a*Ô%X‚›™¹]²HÚמBÈ£|ßÇé±DÚ´LfG ll„¾“¶(r>S\@l< ³G°Qã¸þ²Ä$V'¢Å‡`br ¦Ðo¬Eïs¤°wxzBõé ’Ûµ\×Yàª ÅÆa&•X„J¾£æº{D:Ã’©ùŒ©I¤·ü)53ÿÅ XÃ%B¶w–¿~£vÔ$Y1üriBn¿wHßNU.fÞv·Q‘xÍÑhøøÚ`° ü.íù{5ÍLõTØbøë¬õp¾B͹Ž[ärÈ—rþ²Ï{9 Säç­!Ð%Ékr}ÊŒ"—AýœÊ7•ä¬éd>éËZÌÕnøX üÈÓØŠÝ+v]5Iç"*ð¦¢7¶ôŠV&¤µÀc1\_Ü1¿IZgPú‚å)–¤ôâŸ5«¥–­ýnCv÷qT¹íz%dÉ éÐIzA*^Šm†BÙ±q|‘z¾¡#1/y¨-~»ñº³·PgöÌC©Å—ÇNZÃÎRð÷cJA T¶—¶>>ðÖôy# KsoT:ô²‡©tÛ¯³Ø©w}B¨ævçöVÖBjåÙ÷Jòë½*![>ýMÐRüPà}]+Ui—á¼½; „Êó±·Ð:s>_à-¹(‹vyÕ«»ª¬U€]I’W£1®}6ŽÇ9–Kf³dJròŒ!P"†Õ­±ë@(º¡I-J“1bà©ëÍ£e””§“ÅK¤¶`iàœî{OŸ×ß}eƒI¨ó‰ ´Äî<:ñ -»ðR¸Â$*‰dÏ~Däô5·(º¡ëªZðq“FqúÍ9VZ+69ä,|õó£‘ÅÚ;òËtÀ`2]*Š u'Ã^x s}ȱâl‹ˆ«i+Yü`í8E9ŽÆ.ÎUi¡‡<|Ô:Þ»½ÂóåªÄŒ¹(HËížÛÎyQ‘?NÙº6&áÇûaœ&Íý㨓aKP£ôe¶L¹8h†ä¦m~J0Ùl½«®™5i`Ý?’lé†1ÕPˆ]ÕžÄg½|hïý¨f–8#Í…~f@¢äß@‘^¢}w=A“‹ÊÆÕRÇö=´;r@y–½ƒ›òÍá`ÕD¬Ã®¿òæÐþyÕ3e²2ÒD¬5%i)…_ƒ¡Wàà¬!Ž¥‚22ÈÏbº½!íjý€üÞ1ÑuŠ@ÞmZ½?òéÄ唌/§€:Þ<¢|=Ø}•=ȵÁK%ÍñŒšý>Ÿ¦Ëµñêé“d6Ö ]Ϊ¤¡“¨hM »`M\kgë;Ç×ñ•î’“iãXk 7ÙýG?ô½`!v¯È{iå㽞½$0ÚæÚ)c¿9rºç¢#ÐIÜ¡¼m©¡_¥ç)w#/¾d¤Rñ)Ic¾½w™Æî¬€OÜQìôº`qdô•$¿6¸C15?\`€È±¬Ê ¿6sUÃôµT‚GkýñÖÇÈs äl¾uw¨¦èÎ'гõ`”m=Œ€à® • › Pé¼*KÈ—߸}âL!CK9ÊqÔE8~N~Ôõº_$¿{?´Í+&¢ –âÁh’¸bÕxRq¦ÀÔvİìOœMïíûÓÀ¹f4ÿºbë£*`O%r(Fñ Ÿ“ÛIµ/Ÿ-{8œ)6*2Õ¢‡vÖä*2Âѱ¨mŒÓQÕ=ÖfÀßãÅvv®ÃR1ŸÙJá²üLÜPÖIkÀETÓzÆç"ªkt‘ðÚQ…W·Àü)¢Ê$Ì-žÛ& @ïÚ,¤×Ä5Ä ÀþÅ·ˆ¿qçd`ù/±gõJS‘€¾;ôÝâ36û‰è(L¶ÆŽ6E“z2€ømACšûÔËñs$ìîq„êP[þÿ­ûvðé*+ Ó%ërÿÔyrî‚*µÂ]O°–ÐDýTP«Z)Ñcš]»†Ó7S­am‹®|À£T¯€ŠVò†#ÃaÆ6ríE;*s z‹ƒ¤'+.†%g¯®KsÙ;[_ŠR|9X X¯,‹ñ58Nëúe & Œ ÀN‰Gù§¼2‘?°´¡£‰¹Ü{K,ÇEœ»÷~ù^ëúÙ–„¿Xúù±“ã–ܽŠ$cÛ=†‡»ÈYüì9Ì4'õ »Êãó0“‰¶hÄïa4cXTâ˜OÑ|žàHCÁÓÈrè­Ž´o§µt§ú´ÔŽòœã„”+ü kl¿ŽMÑÌl;íTá-|Ê0|²sžáUT‘UcRú² *!klÍr#ò퇻‘N6ùªQzlÓŸk°g•­ ^\@ÞÆ"×ò¯›øÜ6çbƽJf«‘<™lØyÝ[žl]1búL ÚzÂY$ÜØ¦!ÛÑ\ÍXþœ®°æqÀ€e ¦Mºxd– A.kYQŒ7÷w´¼ÊÎ¯Š¿„ŒYõwE’Ço©èf]¼”qIKåÏ|öë6lP$y7f`y–!®Ø…µrìþͲýÇ Æ¡IÝzÕ¡^d Œ´ èjDÐ&Ž‘k_ŠýäÝ.@gº·ÌSæ=µ€éby=$Ã@.ðÚù.y×x®ÑrÂK[;àÏ©(ÒæµÃõ(ôЖ í[(!Î’! ŸVn—Q>¯QEµû“JˆÊY²Z=(Bä¬NdÈö‡f9ÞËMòi ¯;R"è‰P( ôŇªrz[áxÕë8Ë÷ ×_ucçø#µ`ê1)?4Æ?;Ô‚ˆl¼‡ d «ÉîƒÕY@è>IìkMFŒA^Ư”؇gu;©Ì.1%£åÞ-?´ 'ñt»Dm-soL´ëÉn(Òg¼L¡È¦º]¦(1¤¼ÍüÊ®g^NQGŒ¶ØAÓZS! Œ$²N|ŸÉ/Þ,G*&6ÅíE›`Š® òövñ¿H¦*Ší÷!~l„¨"R¶2Ål¡ß—˜EƆïr”ì~ã†W|éŠÓ'É‹ž9 ¡§™Ÿ&G\ÒË|‚»¿ŠüTáUÇ4*e'Ø XÓ’)íÄw‡ùf|XX‘_§Rf¢«Œ\¬ùóõ+‚=[Úì%Lë8×~¢[Öû‘]m>^„ÆÊÇÆóËAÎ…ZP>¸Î«Œð‘rDÆ v–Ü!ÞÿG…l fž°G¢»,ÐLüró+|ýAd>V@Í®UبQËôÞ2€¸’h"ãó'›zÒÒyLY:q²È4Öò0!³*Û7wªÂd a¸ñH¨ä±®°¿évÊk1ããî­‚"Q<­B…$o¦Š;þzJSÄ`PúÚUBé›ëÛ–êOÜÑA°5óGæ¨þV£™3Æ~ÇM–"ÊØçá:b–FÙ˜8‰øÕ÷Ë@eGÍç÷ðz ·óʉ0(úõRèÝ %”¦×yó“8HÄhr9Jƃ¤ƒ ; ¹ÉSIyų2¨Ÿ{Y ©qÄøL±²¹¤ËÀpŸ’Üí$“ßàEصR±¬í(7Žà‚œ¶9Ã<‹$Ùµ»lqf‰^—°7U)6ˆEŠ©NH'»j+‹šŽ\:¦yÖ*ÀñF|5ÇÝ×ÿ'_hNk^»fªKjiQÚ#‰Ð· OǶÖ,¸ÒêÊÙ“/†È`•vX¬~­¼ÊÇ£8U¼éŸ¨·4Ø­Ó©.þÙÚ«Š °Í<­Å+ù´›w%þÿ(í@ÙY`º_,Un9 ËùL©¬¸‚{ýFu%ËBåxä4½«ðv‡|ktÉyõÓ¸jåFÕÏ6´ø1@ól¿ðM”@?eEÐ; >pÜ—kJŽ$¢®šcNj¤¹ŠA¥šSU@ßúj¡!U½ÈUc‰[CH¬Žnx0ÊG ‚šq"&1—¢!³:=°üJ=1Ì«Haì7Ë•{ðögÝ}~Í>ŠïSÉ5 ñŸI%u65k"úó»æÔw˜nÀyÐ šMøiÉÝ^¥¤ŒÎ˜[¾ššŠo ~4úl¿ÁB°!…˜ˆ×†bÅÍJ(,æ\uJšföÑ÷cYÔ‚ªGþª!ú/îVœG€›Z§¹ê¾3h·­S Í'†<™û'>œOU›}©‚` Ël[‰èç’Éšn„ÏpÃÀܹ¨ÕµKÛ2@4kÑ7Z·þ¬äX·yïçä6îí{!áaôÃû½ ÂÔ»5Ù.[½“>/àWÅ/k¿JÂpYŒ»C÷a;­6hÌs6UheÛR30«ñ ²n/N¯Uþýáù`7ø°½eÇס}^ëû-¤ì%Q¿ÜÃ{6©¤r5ƒíƒ×ŠL,‰Ž‹/!vhóÀ<ðR‡@P¼'Ãk÷7ëOífÂÞ›‚U€Ú=e &£°A È<,ÍLó¶ñZŸ¶†6ØÏÉ5áÿ“Êñ6ŸÏ07Ôô²ÀÕ »6>/qiÞ&®w¤ì·ò7õ“ôÓìüBáÀ’HñxïÝYHQ!(dPÝ6Ús¹R:ùAb?¦2¿Y»Leòä«ð0ó’DQÿD2df@› JN”ø\9ÆXÛ¿¶%‰ÛôǪ'7±+Œñ§–¼É( å„ü=¶×Ì­ ¸:p.çÇc ùö¸P> Û‰’‡ÂûIQf§VZQž<˜|¢B¸>Úüç»ÃBLî«5– o@ÌZœSü‹–ÀÝ΃¢~?8´j-t1,ÙµîT|‘‚J"v!çV¶ tÃ8E;É“ Å–mézäï_Œ)WM³ŽwJd¿@ô;;»]0é\æU½ÁÈbb——üÁVú1x»œA†æ’HžSsv ó±œ~{Ø"cÖ>`Œ«ŸUpQºc'VÀ9a’Ë—Ä>ÔÑ;’[çR ˜RlJ<‹¾sk†/©Suž0›ÑF}‰|ÜÊtã•â µ‚L®9L,4âTÁ)<Ü¿š¹§ÿC¡'•p±K ì﯇gµïk9‚ 3ƒ ×åE¶{#w0fÂÒÖèêÕÕ%ʳû}¸DÊÇ–Ugª àÃqÞ9Ö…õ“㽄a¹TèUî÷"L½7qní²8ßF23e{<õ ›È¬“ßƒÏØ%]Y*'ü%à NPË©¤j‹â=ÌW@ ÝÒþÔ1g÷TëYù=ÍÓ½drÁì™È¼°U>[øÄ7[ÿ½$ÓôرÊÞx¤H϶oìãˆ|ª'žMËÄàÃ"*‹`ž§óbL6?LÄKñÏǺY[®ÊdoãS®×˜ïñ«3>•§—­ãa—§5¡¶Ô޲⠊ 6d†…Èz€ŒÒ*ï”ädX¾âå: ¾ Zh2ˆ~hƒ^¨Ü„:gÓ«S÷[T| Qˆ¸PC™ TS·žœÇð¡aÿ²aˆŠZi†°bÀ®6‹€vcϽk¤d}ï§!ñ^l^ôNëÃ~`¿äË'™<Wy”$§sîÝÑÝ=³·”´î”õÉ5ÔÝ@IíQ Ix¯jcÙ`,]j-¾j¡Tˆà®äl"_ê°‘~ }Á(„†XnFŽ öv1þ Ⅎ!ô|vÃñŠF/Ÿ…€Ôм0­5…'óèò˸K˜,̹-ߥüù”oû… ßÔÎm ÙÚ^?"Wןû45¾qZýU´ât`yùâ+1@…‡¥Ö×Ç}LX4‘-o~Ytk´ÃXc¶ðL÷òÔ’«þ-«ƒ´a,øÍ×4Á£‚iä¥L n †]9E{ž‡q7òS¦¯>³~· à2òöW-P«f :d°BìVÏiÓkÅö`¹ ä´ü"Âp?€€7[)6 >\†ú)c}—  qüÕsfOÇûñ†j¶TµòçáB òœ,Õü ïÿ˘õ÷>[zFá¤ÛÅaz%â#Ö$H³*¸‹¢½#*=¤ð,–ÏÙÞ¤<Ìkl—€·•ïÃ…¹ûªBëté§õÕ'‡„U’fó¨Žd¹‡›ï­æzê-„”’¹7¬×éÉ/€hFµ­›È³£5›'ô«ݹŒç%³ù÷«§ùm§Ù暥LdJ‚yU7Ç\Î{'<‚‡£Æo³ÚŽP0Ú ‡wépÒOø¤¿°ú¥¹o+æhÉù\ŸÁÄ£‚žiØô#¥(ÅIÿ uNìã\º•u±•¡«cIä4~É×À¹,F»Çÿžª3Põ&°KÖ/:ê6M…½,Pù‚±~ŸÌDóz cžXÀgážüî­›Ð(⣚ˆ'H3÷Æü N;Û]@_=馸°ÐÆOÂpYÝÍ);P°Eoü]0«‡¶²‹TW]iç?T3]÷îâJA™…%iÙS–š)\qŽ©™{TœˆÓç|J1sCÖÖ׿°bÀ`< Í…Ï5cguy‡@õ::ÎŽÿ³E*¼0¬PÙ‰>áC±åÒµ3"_’ݘ÷"Á²Ü—†à*UÆ+Zê;yΔu@Èþ×Á5ü¬†xîkêf45E¡žðuÌÁpºÖ‹Œ‡½¨ ·ñ¦ò×A-ãÄáPV+d ÌosìJu:uíÝ|¼ÃÇr˜]¾F¼°—h —™g­*š9„Â-è~Ebžájh×5šsiÎÓs¡ª O›7/øj#¡´1:éV/ÆüDå¼f¼äý@®/–ÙœvJ"CoÆY¹a|ôzlgL÷ÚµQ·u|=Kš]¹=ú<å&ç„ÕÈ„¤­Ï#ˆÏì¶Ì"µ˜(Ü[Õèw‡õªUQ¬ñ/NN·„È+ßcÌÿÉž·¸ó˜áܸá“pŠ •X-êlñ;0p™£ú¶NõþlSë¼ÐÉ3ßýG•†Ufg6Ï}sê©å{ŸÈh’P°sµÒì¡$´ —Ý"j|Ð* ì/´9øh–Œ¶ûå\8,` e‚ÓÍÿÖU»VIàó‘•i›à02R*Í EsÝ,aµËÆG?kw+QMW~kK¹Z{-Ódïg¦« ¼ó†$N˜æK}¼ %—®â¡ÝNÒn§ÉŠfáOô^øS¥ ½„*"µÞë d&7Ge ;½é.9•tõE~$4¶§[œO£Ålúœ±GðÊW²ÿ ­v&uœœ~Cû䈺ëƒqtÊ ?ü.“Ñ;…Žtƒë"7óeÈk f½$4 ÚÄÔÜ5RBK¨öUöAHXÂUZü±v¯ –“"Eõ^„éå©;QÜZP¼gïB¬gä;Ò“— wPat¿A3ÝË›þN“Ë?y3oÐÓ3àþ0Ù¼µ:3ÿv°³¾(Œ†| Š=uü6|=ép é¹"µ y?nõkSW“d Þ¼?R£g^p)¹GyS£$ZIVÈ£îA¯1ᶪ”½Ò°‹6ÜG‚Ñ«CÐýà¤-B]•õ"ã`<©b(Ã}d †á„Ù~¿«Úq{JYSroÅ3"þ‘%0ÆñŽ?kOĺ±÷\vVª%ÜYÕ>kzÞm戣[O^5º½’È]ÖÒ[Þ‚—·iéý§o½xJÚ¬òMû±ÿ”-磼š 0#TÊâc†GkßÙVÔF>ª ŠÇhb\snâžö*ò/#ÉÁPjöIÇÆ+: É_ kQ.Qû¿›ŸÌrs™Ø{ÈBJôÈj,}cƉ(\3Ï$†Ýä­Y³ó¶â=ùœ Ķge8ôŸ¿×Y@ˆñÄ,FQ2³BþÅ„*Hv]ohŠA’6ø«Áñ*ñ7ܪ ¸Âý¦™W{~úDí’¬0W½ä3«vèƒêº[ ÞXæÚ |QX¶ˆQTÆ'Ýé¦þöTÇ Áâäxꨂ,N¢Â»pŽxfþ”¼%1ÛÉk]÷âß 9’HxÓ`¨JÑ·s Ù~dŰëêÂ~{õS¡Üëí²_n¡‹¨©íÁ¯hä+¢ÙŸpßêÓJ#‰¦ C’nèxkCkƒ9Æ®S bf`šx'¡°¸“’nk>¶qQRÇ O¶32b}Š!vj?ŽÉ©‰iŒSgTæ“eð»qùÔZ^ƒtê+…Ÿu„ý<3¨]fnÞndG£(Éß …àq6ì\¾SÒºÜg1ð`ÝøUS…ªÛЇ…è{’š×8ú©^;’a`vå®ÿ;é2ÍŒw–r#¸¤Fξ‘-„\œ˜þÈ DÇãys ïD[lÓ*;c f/Ü˰Àf¼½£joA„@+åÓ—-|c¢0?௴ìÁ h‘$”kƒ0¹õÆàÄ]ÿA˜vaßW¬MQÀ¡µªÌ™ D ~3`:u’ù,ÑHdgØ òx»«þöN6ç…ÌÝUÇ»3pVÓìgˆ}þxÚó×þ=«cmUÇþ¡¼…Zà/óÒÜH}è&}2ë„GŸXŒI£T¼vмÐWÀÝ÷–d2]ÿvÆ‹vl¦ÉËÇêlh›‰,…¤ÈNoñi>$jÊC ¶¯¨HgµÔó`‘?“XJpˆò]޶|õ#o§þ³â»-" ’#¨«‹Ò¹ÏH¤üäØYŠj^àØFàÁïÞ?m]F=¥éÕ¨1’lsN ˜æ¦|ñ:fÀ#zøç š93/ŒaCSÑ4@ZÆ"s­m&³o±y€\·Fáw£»®9&ÇîZ£Ž!{Ë# ì[ððíÿÐÏhT¢eú7±%ã{=Åp’Ìnpó^9á¿õ9á#º¢Z8¯¼'Öà—ÜÜ`ØÜ˜Q‚´¤XAÊ:ò+—Åx§ÐZ!R{ %wmÀ’F@C•ÃyFyÊÁ×ýo ó„¥›{_ImAͱƨŠâç1¨0öÔœš)…ÙT/vvB_ C)ªy‘ÍržäõÆ„Á=PЇu_KU.^„ÓpKj!_þðsrÛ¯r/1Oa<ò0IS´žOoµSaçG'"±ÕmRé œØœ–8 o~è²b·´ØŒØÞ¹Šlb<ÐÌ–¬ˆ£®´ÎÐÄZH©£ÁˆŸ[ '~iþ´ëÀ]̤†Õ2JªCYÒà(ÓÑ^Ô:± "ÙG54öÔ–êxìÁ·¤äè0C¹f{Ъ²‘V_ïØ(³¥â£Ò1!y4|Å•ft­ß±†q¸c<Œ¨(ñ¹@mP¸L9½¨Ìº6}@œ°½0Á?Yñ¯s0`ñoÿLò›ûº³†!ÁD0²Ÿ>\·‘" ™©¶Qê¬r³Ÿî‘†‚/ÓkÌÜݬÚM¦AÞî,’Yˆ¢A_QÅPæôÏí | oÏW©_‘2«@Åb]k*¸}â„ÈßZtšfø(bÊíâ¾ÄgzorÍÉÏ,\zóŸ”x)v=]¥ÊâêkŠCÛ‘R¹Fj難ñÁcVÐo‰+|¼‘]ãõü†áÞ&R2ï7Õ¿¿!÷Å%×o¡û§ÒÚR(û™™ÀqpÎ ÔQ9ƒi¨àk<*H*¶ºæIä}Iô­ûjçE—ãÝrÄ™üñ,7»ˆÁ¾ÑPaÕrNOÕdW¶'Ž`•&ºVIô¼}'P—§ õë/Èa€¶âö˜mªèàã¤É='•] =hÈu  鳿֯e=ÒwÃýÅÝX ½õ;<Ü!¨}1öæ®™ÿ#°tËaâH²“ñGaÒ=ô¤lc@KûøH4’;Öÿœ.”Yvƒè §›à­àÐõ©r^îßsµ’î »ÃÊy Ã9b£¢&üg[‚3jY/ìdÞýì·ª¶ ¤½8“dA£—;^J%Í ÿ" ŠS¦îô*ýç<)³6ßÏ|±‡Ü3;‰ýð=q©×26ýnÕÓO3™d˜4¢–1,]p£™&ÔW÷âl¯-÷‚ôK¸KgO­h*w6çáå6z „JwCgêÿó>Yq»‚ 4.…×C•Kƒ)L^)ÌLYliA|c©_A.ìʉì”Ö e aTu tHñºµ­¤u: le#ÓäÚ¯3§`à^vÞ=ç PY/é/Ù1Sž­ìl‚Å :Ó`ˆ¬Õ±c8¤0ÙÉ» ¯¢kl—r²þxWqÝ«Ew9%õ„¤ÕUUá(s í§ß,Õ³`Ò1‡¯sÓãµ)Cäv¾©3»f†?—ªnh2œ‘ÿR2…a™¡B7‘Ús‡ÍKݵ瘬.»èrÆú]¨!is|SÈû4¸9œ]œ[…Ô9[þï…»e³€GXQFÞâL¤Ñ¬¤r`:6­oÆðzÄè¤5uFL…Å 3 Gâ]Ì'~Š"INðŒL_¦¼*ä“ÍáÑÜÕÝß<<ý›îˆÔVt¼‹wçøD]b•«Iû\Õ¿¨“Õ5«ŠÈ¾ðÖz#Tqd ¢°\:ºúÇ›ù¥$¬ƒã'^¡rŠ!2|ܹ1_Ýi¢”C-<šÜɓឡßPobŠðÔ v(•#2Cã±_¥]yÝ}÷´nõ$[‚u<îÝÉÊY¿‘šlÇËm<ƒïm^.ÒOK’«>Òh‹€Ìæ¨=€‡Ä8^Œt=+C.L˜—#2ñ×WúFÈriñµBÄäñ<ݼjï6z2^T«àÙ˜Ñdg‘\'nï5Î<´¹ºÎD…Ýwîó"pS„ÐV‹¢AR¿2“ìÇyúïuP ¼qS´¸<øÑY:OH¢¢ðcÕu‚¢>¾U6—0rˆHÌ…‡Ì—?#‡4¦SYõ™Óº©Xû¾ŸÅ.S$´‚©9´l.ñ«Vç«RæEeo™¼Ì퇃\–‚a±<:õÄ0ƒ…ê Á-Z-.º¯‰4.§)öaU,OpJÖ+$ˆIFé‡[Èõ—X¥-’9ïgSÍ|ÎÖ–vÛ®ïÝÙ¥zÊæêþsx<ÛizŒ€oHé«g¥±yØ‚/üµ¬¨0¬"¼íB|sN®½è¯àµÌ.öqNìŒûêg¤æ—¾NËh –÷ؾ/ß=ŒÈuùü¡„©¶F2E:̪[¡°0+O0jŸ{ÕP™â®PNò^JæW²§êw¼§îâµó[öA5 <\¨´Õ¢3ËvJ‰M%ÐD·5lûOš™6ª§h·gSÏTÉ„@ -cŒé•ÔÈéûÅóVH+_Zf(yß­`ú¨üÎåp­Ñž·¥„/¢&û–èîR'á$ÇÇH³YN7 ÞÛUÅî(f— ±“GE 2ËŸ¤Æäå è>¤ÿGGÛñ^à'L°g£ÎBæþ^¸¨ºh!eÃÅI&ÍQz .L€b—}rã/ Ê!Kƒïºg‹±o´<ð3r€KåÖ`6ØöîÛ6gQ‡‰ƒÔ>·¾æ5r-€Ò:Öó*M3Œ” /88úµ¥;mÏÆK|w­«s~¹ëšxÜPÉì Ý0_‹¦u.6eȲÀÕ¿Fœ,aÓÞ§ÌñÿÄfi!G:ûqFÄÝ[­‡WÞ<ë¢"EÑŠÞˆâ$ÿ4_û­=ã‹4×ìôÃÿÖrwAëµMÉN¯e§°+ö½˜5’7ƒç)DÚ»"D˜Je(Hjò“ËÛ¶uŽBÚš=Z÷?eœ×M{b4oö„¥à8I‘1ôL‰jžç~ß:&U“$ýž¦mñ®†it8LqH.´ñÂõ…­l¦baÔØ¼„'œ˜HÇ-Àòrf:T3d)2*é–ÆJthz§ö¿klhfåóÈÌ×^sDÖÞ¶0ê“/+¦}™`h;Z§w„Ï*yReÓiÄ:Î$×sö@Ææ¸Ü¸c‹ÖºBº+Ck'Í0ÁˆpœY•‹a=ߟ}ŸE’ªï^s%A¼…W-’ÜŒŠi¦ŠŒö¢äËèãY&!õíõÏ©ª×¶Í KRYÒLmºÕÔ];×êµÎS©ˆoÜF¢ÿŸµ,®oÁ)äs9D’Ñ(\üˆÒ &™žÀÁ>¨=Å.™¯œ¾@3WxcbˆtçÞ.IFž$UB˜¦­‘N¿,à{Œ®%!•IÅ$Ö*·öuªžwbNì€é}ÞüÌ0úB¿Ä¨;%a6Dvàf…ÌŒC­4¾â=3„±FÌotõ´@_È:I{æSÏ|’g éM®Šæ ð~ë´Ù>Æ<#Š)²­2S8WE#ËvÔLÑIý*Ͳ*ï3xËHq·Rú‘nž}÷Ü™³Ô⥴›œð$ Æû,å4.õG· 7cÎ 9ø¸ýÌn9$›ÝyXÑêQ]ç LÎM!±Y S»ú8 (m·½ù'ý÷ DŒY8ÿÊ¢y%pg ¬À`U •]$‰l2S&‹$–l.öj¢0½‰c:èD68‹q Ùó šL¶•;gÐcÄzꬋõé²Öz€+­ÜØ0uñ­p“< ·å¸•`H]LG¢7d¡W+Æ Á)^rÖì*&x ‘º¬ð‚©-h®õ}78yñ¶.ŒŠzö1÷A}äDí!šÒ¹<|ïIÎ,D‹WñÔŽAþíÑ#’5z !2W1ã—‡ä*œIh鑵Jsx—~ÐöXi¸õ™³ÙlsHÒ90¬°Í‘±/15eŒ‚Ö¿±Ðà 7½*ƒŸÛW°œÊ*#…ôWP7¾ºÜd_ËŸÉÉ+œØ÷Óz÷NÏic€ÉU¸9üPdÎà—–ã ×]d"¹wúÍÒ­›ãz’@n® ˆ=5BÓÝœÉäëÚq°öÍ `ö6‡Ô9¦Á¡ïÈ«Šýz4iˆe/¹3IÀØV§ÏÚ|Жa ÂªƒA»=Ï®­|Ø1[Ï½í§˜eú8ZŽ^Ø-ò>a$Zø¸o×›Væu-A:˜—è”í-¼¿ê—EÙá2]„çÛÿj¢ó„ U8 ѨÔÂÐíüJåÿ«B+,(öÁà;ÍDz\,„ãlFl¨™:(UⵡÈL…tb“…Äè …4pZpGˆÒ#6?ÀôÛ´9j­–Üþ †¢ ÊøÜ^³C'ôm)2u/ùµ”Çæs²eX¶¿%èUã×´L1\¼/¹wÓ¼LsÎ{bßwZ¿¾!ñ,3k+ß^$eú^èzC `cÔÄsåC†ÊÍ{~#sÉ ³”ä ÊNÁÙz>¢,çN*wƒUf˜•”% _×AQpU·¾~ˆð$EX1ûéÅzŠ`*E¤ªWq’R£?Â}uùÞ±9Š[8‘TŸŽ3Ù² ð!\&*¬<ÐÙö%%Ã, 4’Œ–WUp#T©mWôÊ%\Mð„xÆù«¶ì!·ý_M÷’Ò¶ª¾‡Ø„Ì^ŸôÚ—Bq½Ó¨Ç¾P¬Õ·3«CÙСSJ»Eˆ4K ÒŒR¹õˆé’+ž"ßµ/ëŸ#ÎÔ&Gc~¡<5ï(McOú™“Z_p»ÊªÜ]©Ú{”øÓI<ÐÝ¢üê/Ö Dš V½r=-À7’Õßû”µ^„é'Òƒ³:u÷ã'¯¶8^iæÌ–»YøÁqabq‡÷ “Q½û74øÕ†Ò¼ÇAy_¶yƒÝ@Â5#kÀ'¿ kxm÷Ѳº§¤uë¯Yô÷©y»Bs;à\K´ôþÔCâË… 3Ë%y›[?ï7¸bÔj±Â£'Z2ÍDæàÂ!Åm?^}Ôpõ…&[":xôuý<ëÓZÉÙ ?–ôA÷Ã7_' `æ@ëÑ b²5ˆ“çiøMÉú¡@üíþ’¥]É|É)¥87ã©§¼ñºªÓYä§j÷òغOÊL@£ *•0S¶×[çç*+Z,…±úYn&`óæì°W—Êa„©×’%†á¾} ÁÞ—VU¢<·ê=\Ôï’ÕGkóù€7š>ÞlYÃ"CSD%ƒÙ:hX¼Rä€(ÉºÒæ(9y‚&0þÖÞ´˜1wŸ÷„ÄWi†Y€¥\÷á<ÐOša[?‰æ¾y^$€úĨ} œSl.ûQ:Õ„ÚG)uQ(– ºÔ¨yˆ·“üÀ“'ñr½òlß„ƒ`k®ƒ8„–¥gÔ~@úÈkÃû®ÐÙlt42.ýœw·P¢Ãÿ·?rÎK¹ìL'yíC5®bZD+7ŸnY»‚û6SPè>Ý&*o¼~øN¹Qø'óèA«3WWd"Ûê¹"^…lú¤ªíB#Z·Ô7 \Ý+­€í6äSqV¹ªã½½Ó8ÞvÚõAM°æ\¥8GŸÐ‚—›Ù{t]%q9Ù>È¥³ËЋÉó´·Jí2ÑÇÜûRòÀX2¢²ª¨«ÙàJ…‚߀mçéVI©²NaBãbmkAÞÆà»—æÂÆS(VW‡±Bp§: ü#l:YÆ…2-‘óìÅá{‚ú€¢ÿ°VNRsÇ Ã ”/$psV÷µðK’{. ¯N_ÒØÈᙑ@q‰‘¦ Ce¸ÃEÆt‚$ ‚¿ì*brÜ?·Ó²šÑígã. 1¼é=#²&óC„ìg Ä伋 ‘y·÷\˜½òú'è”æÁœ—ŽgI²à áùž<þí šr€D-ÁÚPsÔ±—»4p·qÉT±HÆÙݺª{9\£€ùÓ‚Ù@2¬Yøë½Îî âWLvG¬¡N`®Ì£]!«QÔ#PIõ6ª<‚'ðnª6Ø/©KnÎDùÈôÿE§Í­ËfÇ@¢>Q½áNÈ‹uk¨,Á/9ŒÈˆÆJ„¼;ÕªrÕˆ4¤ŽíÖ2¸ÕÍ Â¬1G²å=÷‡g6÷ÉÑ0éÀ¸«>ݸXX2Æ¢+ôÂÎCˆÑx ´æª0:Ý,9‚(±él³ Ë”ßØq”ýÓ?°×ƒï‚vcÿKÿ½¸a Ähä 1þðž™3ǵ9•`ùN†³<Üá @`Üq]̯øÁfëõ _äÔШžðȪèäŸx‘ À<íY"ì®[¬A”k°ñP«}¨çgTjâi.Ä ¡T  å+Ÿ†~y^.ɦ(q@ß(€TûnÖöX ¶W-­xZå}íĪöÔhg¯Ð/K¦Ï›*öï'Œ£¬ÔC3øÔň« ²K;¹»¡âÀ2@ü¾Îø("óEH»)×Ik`%ºjÂo}öˆS°Ã.Ù0¾Cetõˆ“Jì@Á±†ü7íÊßOH”Už/òN¸E†z5k=ëð{ý<ƒøJ`[tj>·¶Sö…HßZ\ÝÍ6b›ž&5F[Åð ·<É£áòmm–N’ð„€v«›Ô8JÞ©Äþ‘7xÀ©v0ÇüÁ{,?zÎÃY[¶)ê’H7E¾:x|J?ƒíˆ"4‹=çè•ÈšoF€;ViÐV M†¬ü?ÿÉÞ«Ôè^é:°œ«±åÃ7Ëb0׉#_’nšÞºØãHÍ_.ª%!»"{œ-%% J’•h%[tž7ëÅØ9 ¡\^…AÃÙ¥ 6o +½Ud®t[7¹e¨¾“¨T²À•E)Yáæ¾©Þ`„ñr³‚Bƒë¡cýc†±KPri˜"¼coH)rx±™Ñ®Tñ¸Êœ:Ù³•ÓÒw/ŸmŽõyE‚é´¯´â3€ >éÁâàq*qTôUÿÌ\m‘ÖÛ˼ºvX P"8¹¬P¦L ûË€J§ÃžYÉéäfÒQ‰¯(Çz0¯¦B¬GµÞìãî«Ô±0š@'°Ô5¥¼ßt^Ô8uG)I«XnÑT7Yß‹€Úp#Xb€Äz¹‰ËaõéRUZÐ,ÑþP5€ 'qèD¢è‹ÍtF)úßÑéŒøG’@˜øðÙ}¸¡û/p –"™}Q<«lL{8C ‹º¿ˆ)ØÙ“ÁK˜¿%ÇZ`‡_ÖF?X:”µ‚£¯ëˆ5¡ }ÓÎ–È ñ e½n7¿çõÖ­&ƒPÓb;Uâj]NÓLhšÏÕI^ú^Ë3߀;¦Ú}ãË ¸Ü“Í~ëÊ”Yò&Ýãúà\’’6ïorMO©·6źœ•©_;ƒ#f…;vҩ䲫ƒ“el‰£_§«G·ª«@všoßvkauTI××,ò²þ06d²Ž¯—€9îcðÈÆ|Ïqõä WQ–Kõ–™.Š_çªØZêºÍM7£ïVÉÒB€ÌÄ`Á…5÷ð½(š2tŒ•š/Ïñ_Òt†éæ@wV$$ZC€$¸š®®%+tE`†üÒ^ÝÝë= Æ(òÿɲ¸wbŸö,®ZW( 85` i(jí(S¬n˜´tNlŸ'hfSŸä(~õd0ÅeYëbÔ¢ O5¼²ì¨¿.Àc'm½¿åGHòðhë›x3Ý#óÀ<ÖzÎeÅè÷µâ•@5YzGû°øj}‹Ûä 9a ¶`_“€CÉ×b;ðmΧëÐ䩲uÀM]ÅUNN¨Ž»œBàŠ,Õ@‘öRÔwþwÂ;p£}¿ÊUPÙzâ° d,ÚºG8ö“þâq!àg¥þ¼=Hš]ê`êcêü^SÂÕÏ;†£ÈóÌóNr-5ÚñûŠl4¼£i^c1˜$,¢\Có<³peÚñ<žÓô&ÁK9eújàßlZ¬Aûþõ£DWåR~ßÑEÅ ÊŽ×5O áÌŠhyPÆ{-éÃ5d n÷L4…RÜh#n­­9lâ:È"¡r\¶ðí]´,ÜQ’I£”À-§|{H!Ò†æ=GoM®–ñ¾‹\ÑP¸úiØ'‰‹¾ÐÿsOè:n¤ªîż»¾ d.Ÿ'šHwD9ŠîX炾K–€L!¥úبð ôuí·¨ûˆµS¢µ‡³KrÃu׫–ƒss(¨éæí(ø±uOñ(ž<¼¤š›¹^ºÒí™hôQº“WÕ±sÞzžqm±eß[Û+áÆg ?˜rØÍ@7X«¡àdµB~¹Pî‡ð&0/¢ó¸îRÝ0 ~øA­ T3“ U%ˆ€3|5[<í\³5÷‹Õ9”<þÕy˜¦ŠÊ c¥ž©#‡V?™¬FM#\Éʈ~ j˵–uià°²Š¦ÔHí°Òù—ýn&+ÄMá[fDŠªP´³ Ê8|-Øsd*9r€[>Âù[ãþ'!#þ © ÏÄôE˜9éà<™H/蓟tjVxT ‡^xðpò¡¢hp|ˆ¤d¨­eøjÂT<1ó€×HúÖ£“úkLù|¬W1ß'\g©¬›½ç¡WV±Ö˜òîÐ:Ux­(|ŒÑ3°jàó]–Ò/H#ü1d «°Ë›ÿ^ 6xk ƒðÒo$VýÿƒŒ¦ùz¼õìô“„¤õ8T"ŸóltÝ4„‘'æVñŠkh÷¤`ÐA<ƒuaus!»VaÅ9*ùãØ¶åt«hìß”ª)ïS!é"{'Š#‰´òD•xJ9ûp¯ÆË´9ö}o3ÄF„1>9?k ó?Ù£ÕD¿–Eâ÷~^ùnŒç®}ÐÜ㎼hü¾ d¯×’ ¹w}[ ì(zQdãõÄ”McµGŒÒØ#õ´ÌN8Ô©›Š!'~0ÿöa}|lX8äcÉ̦€ÂU*]{–R`¶¬!•¼ŸJàªýË$|}WFo»Ö¨›^$_=Fµ_ECîj÷§ÿ·H_ž ýØüh]ãp-f|zýiLQT5“¢ñZ(/úâßAg®*‰Öú·ð*Œ±dr¤úsRf,ÚÖÊ#?a0,{ÚHNm"¥í·ØÑ©ä3𫲯BU¼M¾1 ¨­ÔüÎ' 7š6Ïe†h#€2¥:¾æ, qÃ¥_^‰jM<¤¶˜f+fºŒÙïFĬ|* áJ¡Wq‚^M¢%n¢Eaý@xójVª­këj'Q¨Qݰ[„#/¢âÈ|¢`‡òzR4FÇé‘^œŠÆê à­O£zà ¸Lï9X£ Ž5Žº …|Œ”¥nËsõ{4®'ìcæ¸ð å¯A³{î4<Iýt'Ü3mñaÖÇBóA\8¾»n‘£mKï wÃÝ/weÍÿó™KoEâø Íö`3:éW~B(-ðÔFkW¹¢çªf™ãÖ.>­R„ÏDÂw]»MÐïÎÑmµwþ(Ù vJõ‚³p{åq¦µ¯!T ýÁö5èÓ./æ?Jö©iÝJWõ†&¿HÔö©^Fo»Ñ®êî˜ÅMƒV:‘¶ËÓ±ãÌ»'Ü+[õ™ÁjfVi”˜3GyCÚš…XŸXŒGÛi‰bÝ£?hÌ:%.ˆ}AOÓ„‡êõ¼=Ô€úóe!9¢šûÒU(âŸYjï¶SRÞâY#LÈäiúºg9‰ìÃuÔŸ¶Ø f’¬ Û3ŠÄ^÷7E6¾{2óŠ«J[´ÌpElÒµ-J‰(¼¥mQ³„×´ƒ—áÚ¥˜4´ýmè¤ô1/QÒßû[ 9@óÑåGº¾ÇyYä#?‹a‚ °µ¥ j㹃ß$QÍk•9,s8®|‹¦`Ò©!À ›Ò¿í-IŒL´Ó÷‘†èBP9Ó‚¡TÁšÝ]à졤+¿môÁ@V}íO·8w!¿ù¤{POŽ„‰3àòž7 ®J!x ‡µ“‰3û@bÑê!U#ªÎXuîŠÔi)¥b¼ë ü¡jŠ>ã†Ñ»3†D®×óm˜È—¯ý´à3WÀ¨ÂSúí­ÞVƒ‘ŒáÇho»ïÛ.qð+q<[²²Â“»isöä¾c~]ðÊÎ6°mA'd•5Π¶uæ¥-JÌz~E–ý9îÝÖŸlBOt¡­´S’º6sdZîacëý+Ê—F÷ÍÞO¯IÒ½²)kj£¤´Ë±Úq•ÈZE3foa×…‚CÛž'†R“BOÞÏ‘”¸l,ž_£.žÕ×tpAH¦žˆçPœJç‰Àî_$(ßÄŒ'säî9Ï“&vŒ¾ºžð¦|ÌMñ…´ôÏÚAÿàÇ€¾ØOÆ&ŸÃ9zSe&áÊçXõðX™%ÙȉŠWŸ¾q9`J‹ílPHL~™£…ê^—È÷}´¾c{ ŠíÈCÙ“ÒÁy„E0x½Å\§’å)ö0k3^ «•¯òöüÚ¸öKd)üYh‘} ÿQ”=Õß‘oùÖ¢h‰È©ëо©ä/Æ®4´h+8%ɦ äºX kNl$Ÿ·à·atªs²ÄŽû°Þ l9 Ö{´#FWëì¡–Š æ‹KŸœ2ºhÿyB¾X'ý™ËoyñÝHhïgÖ]ì_zDoTÈ$˜ß¯öº~ñµëcÞÂGädÊàid_]Æî¶*e}n‘ëP+×fø¤¶Ä¹{õĘûûÝžHÓ/[YX§€I, õ»ýbD™õÑyM¢Ú°n‚(TïÈ{ñ G‰kÁw¬µ®m&FÌnÁåµù[ò"jæsKS°–Ê‚ÖyVRO=~I}Ìñ>ÂSŒ Ìáhvˇ n§~= ™²ÍYŒŸÇwEàgOÛ‚B_F1%¿‘Ýâ!åýÕkU5 mÊÊrtÔ—òî‰âŽßøFK7SeGm¾×i0õ÷FçïZt¦|¤wSK„ÚMT+Ý2Ôà!ˆ$LGÕ&ÝTÛ3Å{d3¹¸Íb̹FiñÈîýµ¶æ•´ËÉ,+qWj­´$½M´>y¥þ¼è¤IâÑ1`•p‚ ÷®q·]çĉõ•àØâÀ›öœ¶1í:_+4n½?Í—ÅS ‹ á\)3¥ñè†û+‡˜²Ü2|aT¼ââ±íæÂLBêÈj%xÈë BD:ib ´sD 0:ûd¸Ë¡Ù×›¹m)}ŠÑ7”%8íkÃë1U86а»(Lª,ßàÙ<Ç—‡¬iP`âáùu^ÿª¢¸Ø57$·k‡¸Ñò–ÀÓù|1öfº/÷XÉXѬÉ{Ù¯ž×-*Ô–õ8Ð^š¥ÛéÚ†ÍKá祕ˆ-ñä½–+–R‡¦K¹ô²²Íõ¿˜¤t§ª¥+œ¶C[ˆÄrÚF¸B}]!Šú¡e· (þ ®^¯†zA…ªêÈœLQzZ­Ú}×ÓU¾ÜÎÄ0ÿsæ'n²× LTðñ¿o¤i‚©;²rA•ð…®ž7{7|¤N®J…uü²íå[}ûÎ —†vn4©ºUùØþÄ=M@­(dÚ~c-O™·ÊÕÏWéV>,¥dÈÁâÍ^¡À%>.làîgü0±ŽòÏ›y²Kt6û4 èßÝëKfi~/°ûÎá9TVG3’;¢“RY—³#ñdáÆ4É4ÆÄªd S05q˜ÍÎþ¬VõØáQè­íû²|p3Û$§ 3R"½` ïõ–¹Ó«Î )»^è7iUŨ‹¿`ƒi˹Ø~¢ÎöI~š#Š$aÖ´>F)‘%ïÃÚžƒ\£fÐ*i‡^¨/±¬-ò³!PGª.EG£ß ‚¥ËXÏà9@Ô!³,™pF€ðz²H1Ø•8ì@#¬Ô-¡ˆ R L•!oöƒ6©ÌÚÁ ^W×úÜKaOYÂð¤Ój?¡VôƤa]Ü9S†£7b­;êêl|<ø€Uª;Ù¦æ5Õï ÆO~½RÔ|7ÂfÏÙz]+a¿¡’´de;2~–^ìêOLã½sAw|÷_­ˆî2|V7ºË5/¥N‚­•7½ †T胨îöÙhSåªI 'gÆ m8FFhÉÌ sî0<|FS~ b…;}v*yõyG²÷PzZà}–v„‡)Ít“š±Á –ò; *±¶ØJÒÁ)ï9Z†j n©’"ºéwÔ¸1Ï¥V&ã’´?DLœ_Îö5Ã`¨WÑN!zžUR©IMÃÿ*žO3 ^ï ôoËÊN¤¼q„Ï3VõçÕòFûñæ`®7A&‰Ž ÙÎf½fØF5ôšù•Z¥¼@QŸØÓÉLG¿ð° \¡xfÞ2+)éBãd´Üsмÿ…h­vÆÉý#/…:uZv· ò¯:î!2äÞ ™^V1”4uÓ˜Q¿EÌï'ý¬nv‘}pLô(ò¥¢KçÛܬ¹”©®8¬zÚ–)Çœ©ñ˜“Ä ítu¥ì>{™ó¡¾J2l\V¸Ù4hKÙ68¾a®ŸNfÊ‹F@6þ ïÓ¤>¬õü¦Ÿãëä6k†Çi“Ý_©Œf,5·f E‘c›Fè@ ¶_ÐC²Ò°Øß!Î!ßž4yFBÇŒî=ÊsÀ|ÂgЦü¥hÈNÛož¡ÁÕšÊp«Ô⟤½‘3bƒçŽ(‹µœé¤ƒVn• ‰ îbÊÚÊü‘ú÷% 1X™5òå›Õvhí1w}<3«ˆ—àú¬G `n°dö°< KœD&Wñ‘1쫦¿cÈT>â;Ž8Ž2ÆE#¸R½ Iùi¸¸O6]ëº>v›m&¡j0Mßê½$iù¹øçèdl,ü¡’c| ¯¸|Ø ø,B¬žê|{^11€µZ˜|"! ÕŽn2«6±ßßÍåîp +0€6bѤÛÔ ")m㾯×Ú:@½¤cŠ\O´‚ó¤Y`·Á•>À;»MhùµrŽ÷oÇÒ´ŒßUÜ­‰Žj=àL?'µdRøšÀû «gø~Ž®ùù =€kšá´!Ý0-ù髈£Y?õâ>~W1g”&'´úˆ9º£dú?R¦ÆxßE¢ÈÅ«\Ÿs¢å|P¤¡ãr;(Õw„iü,t¢?_"Áb]*»v’cìÕe±oí*iV&Ä¿¦WÄ®ØÂX§ÍES²©•ù‹Óaù"µAT¶$_°’îFßWxÎT¦Ÿ¯!ã0ì¤Bääø&â†Ïø˜)NÍWw¼K¥’šžüîM$ÌlŽÉuã‘Îl&æý„mè4Oþûñ\§_Tm€²7º`§Î  ÁN)쇼ºúŸÊ©RÚŸaÝïý t4³ù£mŠŠ¶~»%3_[\ H¶ûmܰJhqF£å%)£Ž©>-~s3ðÜa Â;ûS\Qïò«‚yñÜ=LJŽ—ÿ²|*À|œˆúÙ7Ê©Â÷×Ä™Âc…4/¿….³ß•Iä˜ä‹UqX¨×4s £8}*‹„À¹¦ÛûÙ½ÌV’.HoBïffEaŒÙˆW$_j²õIšKí ѹµo¹QBÙþ)p­wdïb\6Z”—"A8ññòvá]¾YÓÙ‹^+_Ÿž³#-úeºèúÕ·‰Cw眣†ÙîcK€¡F‘3fAñØÈgÓŸ«bþëòäðÍÖÌ^ŸfúÈjõ`ÐèlÂJSÌE¦Ù¯;âÝ  ÷Œ$xõ1¬ñ%òÏ4Ûòº[gŽ"à{Ó¼Ç>ž=l"uwÄVsî‡PBµ©rBp)h||u:‚JÜaØm»¦¾ÿ[£í«ÓEøÉù@„s(•Fyr'x?Î|=*y8åGUkׄƒ#\Ú{é=1£øhÄÑ,5·w@ ]=Q`s<eú£„FçÙˆ,?ú CG Äi§·ì“8«ô“2 ­{“‰¦,ÑEXCà•öLÖŠ¥U´û;Í]ë±ýJšjŽÁ¯NG 0‘ïÕ%PE@!óQøUÁ•Ã~Þ´%NóŒÇùœ=óO7áV?Úx §{±¦V~hÑ”øÁŬ÷—Ñ“_58 ݲ/$–†›âíʤ3§dH3 ‚mçEt`ÿ„?|„!ŠU¨—…¸g—êâË-Í·_l0‹Z©¥ÛÎE{5„ÒyN§ª."ž® çG­4oÜ? 7!¦I@~ä41¦jUÏ»ÿ‘ˆQ¤I²2†XÝ8ð,ȪÔz°Wo{‚i R”ýþOÍ«§¾Ï`4Beþýâ« +~ŸÞ͈Ȩ(Üa^ f]" 4fÝ»ðÆ8£°ZbÖvíw¢)‚–Ðñ8€²ÚùO¿1÷€P–fyžbŸ% l>ÊÒ8b¼„j':•ý,Y蜵L?ÀÄ ×îÌH!*NïŸQ÷/½Ûn—ñl’£´£pèå~nŠO¹¿»©u:Þ¢#Î&@xÎÛU€¥é]­´ý‘FoA™tG#G˜Æ;竣 Üy¼Ç”çZ.(}Pê;ˆhœÔÑmÁ˜c&ã"S/})!ÿ˜Íi–+ÄáGãPR¢de´¬±‘æõãÒq´–`ËÃxh¦‡Ô>¤±Tc.¨¦Ë·HÒ»DÚ´Á†]î•×!˜_,idÔp¦Ï½žHP›0,óI ‹ȃf Bò gÂÖ@jLsÁí-ºy.;s2Ð…×*HµÏ¤ùH”y@ÜŬ<9ê½üYª$‚µ2-I«ÖŒLUSBœŒ8 5ãŠÃš¸0*$ür5x“²ù*Äq¬G¤_JzÏ‹tuQ;×¼ƒ€A¶ó‹VÕ:H”›¥aˆÃÚ‡¨æªàRh[ú\FýrÕó-[Ãn+àØ•¨Ö¼ÅX«/‹=™È"µ?]Õ£åZ ÿ~€<Ÿ™7],6ÈÝLLhZQ`lP,'Ì9Öà%qQ¼Ó£\ï^uëiJû¸ä&ÅÊ–¾D;âr“;[zÈÙÜ9{Ü 5à0Ý "L;‡@K©ÆÜ’YQAC§ÓzÑüUWÑÛ?ÍH\ {_Ån`2iE£*ÄdxvÐâí`Ñ“2¼Ù²ìݽkG܆¬æY¾kŒTâÜÞcW?Hä,8[y£6;úIZ´£i |8É=}ý¬-Ùß*T lô:3n‡ðýåñÎ0MÙu†ßçØ)–ÅWHJ°‹iZB?âª"n{ÀôvDÍŽdÄÛ†¾z>¨ÿª]b áažqçIÀÓòöe2¨I lB’b5Øä?\½}Â×m± ëý[¯^7öt\¤Fg%5ór´Mg‰±lïG¸ Ñä­‹›‹‘¦U3'Ñ?ˆhn¦ä7fÏy+KÝ.[•Xæ]fþŸï^I// •Ã_I·r¸P%ÜvŸ@SÇŸ9°eSyñ)/´9Ô?'y?ZCõê*žÆÆOíP\‹Þ†jРNÆSX9Å1&[ŸdÓSØcw˜’›ô1yƒÞ¯ÕM»Q÷·ZK®ÀiÒçÖOÊ^ «u¡Xۜô ;ìö3Ì‹¯îHL !VOYtr­l¶+‘ûÝ|зvè‹° Äáðä_eý¬¬Ùƒ^ž£¥xw?/ 5¦-°ÉÀ{l©ˆÞþ_Ï×À»À·+ê<§ƒÊðAq—g&²`?ûN½)H¢ð *¥„Ú¶¨pH¯gF@cït\ ”…ns$Y¾°wðà¨ÛjJ¾ÈLB$õx¸û3âN/¹ž™ºÆÒ±)4CÔ Ô¥;¹‘Î>TïÝaøŸ pÜ<#o0ë3{#Ý÷ÃÕgûÞ; þ$­1>y]~@¤5ÆíCî>K¹ögu‰°Â̇cÆ¡òÆ–r¬eè*ŸÅâÀi\újÎYý±áKíyàÒB˵5Z áÇ|PˆF E—òþvöñNW±P,Æ©´FL06bÊu·¶ræø…ñU*?¯/ž›kº‚Rä¾Þ‡Y‹Ô‘\ÖÙfO®yš“ÚŒ4›â.„«ä¼æÜÜM£¥»7\¤q^y3S‚ÙÍàÄwÖþ$‘EÄJ3í"WüзÍŒtyC½T NÅL,ùëÎîuæÓ«–q¡SDÐ#ãÉñ„`¥ÜœŒEʉj¨§¬ž‘ì.|0K’ÚRd^$RFÔ£¥þŸë.#nz6è ZÆÄ—àxФ‰"Ùc+¤y!œ–޲K2¿•® í˜éñKI­óO¨¦tšÕùƒŒr—eÓ?’è;t"ï ÿXSîj§«Då³Vvr„≆£@g%Ê|­0_>ã=¾³Lԥдæ!Lò{ ×/~¯u~V|‚tk©Ã\§ò/¢%?åû(þøU z‚öÑ•ÞtS»4”#|Åâ_c9O•'(ùeJ j‹J^&¢³+rçA¨_õ”+Z`£Z%ï¯ïNç)§›5VÜ&: @È45doN+5Ÿv¢CóAd\CàRÚdÌ—LØèܪglÓLHê% `Ú8Å1÷×C¡ @„ß}ø„*}‡ràéR o wîÆK=¶)êûÀy–±÷J7”¼Â ·!Løœ¸†õ{BæhÇØ-7&Æ-Ñ¡¦ëi²ÄÇBx€–9_v¼PUBÌTÆ=T†/2È)oít,Àd,šCãœ8ö˜á48lk~AúQ.St¦Hf“¯ž0fñrÁ„´ò€\ºùK¬JBÔƒD“`éy¿,ŒuCD™yOê£Å4ž-c?à;}>Ìó|(ÓãKA@Û©!Îõ%{4f¬ö;„5Y³µnù8‘æö¹D!Fiî´{7µÃfÓˆäòœÿE@žüF•¼ñuí]›¤yƒýWoÛ›Ë^Åub!vT9¼Ž-‘ÊaÌ·l|86ô›~šµBŠ9£zvŸ¹Î©9ÔÌeÓ2ÑT2 ™sÀ„Áa½KYZýŠœï¼£´È#¸U_ö˜jµòu¦FM« zÈ$ï5cœì<» ùÈÉßu«núƒâ × W<ŒÆhq}Dv_™Ñwkƒ=ã¼mç aùœKk¨˜»Šæ¸RZҧµùàWck÷ôÅF kìÚ”‹Ø)e…I¹ KKñJš¬`e­†ÚµpøÂ•ó õûþ1ÅSYÙÓ<‘Åõ=«:ó¿RÜöO/-IÛÚE"ç‹ôªÎ™pÒ€géÁ‡R V@¡•B ȸðÛ¾ž³;Ä|ÓŸ6Äê ÕÍ# þrYTüØMT+cÇ*‡fÎ`°Û ÈcÏŽ¿øüI+rùÒs[›ÀçRËÜD«•·æ‰­v°_ù`‡û¯  ²é þ š» 0¸± š#Kïù äôcÕækt|úQ[8Ö¹»n(ó"ÖEæˆQñº”“®DÏôhËÚåÉý¿…Š\`EÂoÚOC\ôÏ7–MFÎ5öÞuÓGb ÔÜ¢%ÊÖ+ šD_‰7L† yÞûW“  ³ ä%I•ÎÅ:Ó¸‰Þoê‚Û´Dݽ~)(‰8NÐ÷ …³´² +:á½pa䓈³h@´ƒü•7è6 ¶›quÎ@ANdhÖ5þ¼˜½æh%ÔdNø8Öïå÷ó4¥E¹¬ûKQ2ü;³V*p$ŸI ¹æž7µ'†éøsLé~~’áϘ8¨O¤Ô¶ÿ¢¯[„~ψþê¶EÒO&ç áG‡R®’®g:B{‹¦VÞÉõÝT®×­¶47€’k‘cÚ³N«Ÿþ¹! í¬`çä[þÓàۊð qPajªEÑ”!¶n€¯¨žlt'h•Fd8<…cÐÑösÔmìÝꥌ€ZL.>øQl•O0>©Ÿí ÚeTdJµ!NU+ÉÂÔk€Ðž!Bô€×®fÉva.z<ž1ì½—’JÃÈX±‚AÑd1ÇåËo¸ð^G±9²ˆF%¬d°ë—ñRáø–:àI]ªq¤¤ù×Nf(ç½K˜ï.Ö®‘7Ó,ãæ.%zïüh÷½P%KFv6CõÐ*ÛÜE…çq(»Æ(Ò>R`Áôì“ úá #ûñ/b¯¾fÿ Z>¯Yán¯–4àD£ö“•©E9ÌLPV·hÿ~^fuÓŸ!çœ$‹–mâ锌8vŸT¥œõ5WÚÔ[S„ Ôß;c&“!Æ9KóÓ—U±Á«‚è½$*FÖ†å!¸Ê㹄j÷vxXˆ§A‚äüÙu3î%1üØÉWb¡ÌGÆYåeNA,ËøäÞç`4hÑ÷}ŒÐ°7Ùþ% É)¢zÅȊƽumaC€–;EœâPÈuj<:ßgJ¶àñ‘ £¾9`ú%© Ç8^»“í+8þŒ“ó÷ªqô·ô›­CH½“kwYLý%¹!i9<ª¿B”øƒcó³QÂ!̆^Ý>öï‚AAßszamÁNçÊ1sû-š›`ïË ·k_qôèYN|M±]ÃzhQB>H†Ö¶EÏñÅÔ?&i„:ÎÜàD',4ôTË´ÊÉ–* VèÐj‹'Ýu«:õEÓ{LeO°¯7¤®_ظ¡Xù($ Š!s%·Z°J9™oûêRžAÒîˆ+F‹PÌ~tµíÊ*QÓQž(v¼»âX[´tž8V•iÂ.»*Äç/Ò¹ç Ã{僚aÍ=]#äy„Z$™0½½§Óqž?EÇ “ÓìŸÎËAÈÎô;ô?´ýÝ‚ãæ§[~Dg¬e¨‘±—;Üú8Φ×.5µãc1Vªî…©:Œr§P’ØgB±ÙzàÿxÈ,!\ô#(íáȵµ‡ÐßdÈ%R6 (¢Ýéî„é¾Ì[ 6ÀâoNÀèžœm¸uáAÖŒò6dT,hè¹  |s(SP¥¬`}g£æåhÚ†eI¦ T‹CNuæ[£€1$Üapx\øŠ}aiÆ=ômÕ´Ù ‘Ž‹(“¢ªrúØø2òçOgÇZªc|šãòÐléš±’1÷@«XtöÉ<¸¹ðÛåüI+G·SS_ !ƒÚþ€Ê-&“dò³†öAŒÙu÷]i1 1i>0-½%ÂODÅ'ËØEë Q8 41W™#eÁ•Õã×v2êƒ`N6¾ði4¤¿ýÈPþnϤ¨ÅN7E‘wó£g‹e¶ÖvÐæÆâ…)®ÂÓxžcÙ‰‡pI¼¯kºù3PkFõ;"jÁšœa¢t‘~îqhŸä¼ïG­tˆUõ£>Ìd.˜N¹2o„t¥y["£#È+4°´Íu º!$¤¦Eóbžk¾E[Ô$-ºk"G%ítÒ´Aü3D©4&Ì_¬]Þ£^ånº“‘«ß»É;ßex‰~7å¤!ª‚Ð0±Å‹* PÍkBú~âv› G©ÔÈsÐï19úæ‡+|$Y¾ ².$éº{äB.Ïf~¬§|ýlX•ü¿„£Í€ö`µkó©‡å­ÙÑoYižŒ©¢¾jGBÇQìÑZ ÖM/@tVŽ͒þ´Í(n hš„òÊ×á†%óó`«À•¼£< ÞÛZFV>x/T®ÃѤL‰M{ê0ôl]b¨Yè>Ó…üýÓ´W]=9—û¡©ˆŠ’]^†oP¾BåT?*k~ŠV%²/žÁÃè¾Ð ˜E˜%fËõ©ìêÏ]ÚsP;)®áz¢ 1Êø‰èßûº/ÕozL†[éTèòBQ/:b>Y¡HK¨¨a€#_=ºˆï=úéjQª÷ÊkG•OÕìàÖwE:³÷Uh‹¿L¥ 12‚d>:ìr‘£¼¢;æj`Dõ‹Ðµ¨€=®H¶ËaU%áo˜ÿ#hòß½"š:.|ãî!ÍWßÝtþŽ£Y×1`oÖªDÛ›ž±ð}½V­ÄZ¹ÙMà.™55³QGðé÷B{³ôÖP°ÁVŽ£•Y='æ$Ü’«—ÀöÄ|´bèR²Tcºù©>˜”}Ä^0ÙmÆ–\§ˆ Z ÊIöï-.÷0Í PuìùCûH ;ÿ#2»¡0-²+ŒÕéËÞ¡Á5‰ÃÊÃÒMÖ„Ì0ùRH ‹ên³_×—xXÛ-oˆíf‡¼*J}Ã<ñh¿x¤ò’Ë.ÝÝ ÌëYåÊK@eŸÄ¨YàÛ,ÀQ—7©™æ(W3 =kwÐ%Äjc2§íƒ•¡ºlî˜n›ÚWiFÓ€“˜r¡(/G¢–ÒÓpçÏ©#`ÂÇãLQlÊ·‡ <Üe{D*ÛÎTïB0{+Žo8ÍEzRaÑïÕ°µŽ¶fP³Â·ÿ¢@¯Ê{Ê®ô'0~ÈÁóÒ[ d£Š\ÙÇØ"nU4Pë?ÒåÍBš1i»²B¨Êf¡-5¹á}Ñ´tÔ¯œgæ‰/“l†Ç8œÍçhÞ&¬ʺšŽuÁ6ƒZo5¥³–óš ÏÑX NïTÁE=ùo&ì’ñHÖX¯o—Žd ½»=‚©÷s™Gaâ«t‚Ì"‡$‚»ÑíYáÝF™šY0s—Â}!åZH"8¡ÁT?`K'o¨ ´a®zÕ ÆÈø¤$¸º°¹ôà¨vQ}ua…ËŠ~„VØvxݤ „#2'KÁÇK‹i¬Áõ¸ž(ŸŸ>éƒÞeÿ •'°õm‚S»Ä´Âø4ÌþÈŽPìWn{ÃJz–óS—…`‘‰¼|«÷:…|ªCtJÆOeÈÈ®Gì¹´è ­I!Jõ^´‡êÌòè–e‚ôÅ  ¥Ã™xåÞö¤9¼¥”X€ˆe† <Ïê“ãVÀ‡@PZú°‹]ÿyáЭœ*8· 3L(«á6ö•½ÓÂ1‰G”N§v(³Da%4#<6fHè­àŸ÷^/çMûzÕ\'™Ž&a¬Oß“bE9i/lc-K¸‚Àø"Û|¯ª°µÑÈ æ…}ö—¯­8ß)|.es—:AÊÍ«N§Q‡ZµjN1$Ëk4¤m¸ÂÓr'÷ì5¡ìi+›8èÿPÞ’Þî+]k¸>Ìpc›*ì³ÙG! jö~§¿€½¬àª5’¸oùÛFo,t¢eõæç|üEÿSùÄÌd›?SÀK¸³°]³è ®~9‰n=CÔê6™PÐ0÷¬yþ¹«<w(M•a/ý‹‰Í3ËM*{ÐÖÎ 6å|¸ÊŒ‚$â¶¼EpO™g@Vø)‘dwÉ%7”Œ'Áž>؃¨!^*O?îcñá–b‰fÎUlàN¿!vî+ÍÕIÆç>ë%aIù½¡HIÿÊwÒ%?¼?›‹ OL:3¢nÜk­ÉËxfÑÁ)ùk6èÓ½v×J†G®h›9åÊÂÚ¹Ä'Z~N¬|OZ¶±áptšÃ”–¶øe7É]ðduï@¸¿ÓÈ3ƒVn‰;@G-i×Ò”à5ÖlT“sƒ‰Ý½æÚ»Ó!ì¸ø®cƹø±Ü”ufXPfV“Hš™Ýv ¯`Õi¥çÎé壢sÊ Ilïû¯³ ¾Ke_LÀ]´¬®8ŒÀ:;Y¸Ö2Kž>®Ç_ŽÒ‘t"‚<•†9†™ð…oZß'*¸ˆ¯ÇûŒ¤´AÍ«tëÊMèÎM“ Ñùùš1Q$ÇÒ»ÌìÓÐ)Ã3Ïž—ß?e`bžŽjÒe›æÕàhõ>}½v§MfâÜ¢¿¾ ê—Œ£€ÚѬ%`Lé .Ë•°gŸ\&ƒ­Ov6¿ z/;ªÖ.ºkH*MÔJ@£êÄÅ2m±% z…zI…ùuCD3êý³ß EñÚAdtÞ6…ÆMZ#²æ7|,2,týúÏcUÌïP÷¯9Vâ£î—£EÈa7ÞÉ(³© hAØ-êHÐ%"k³ŭe5<²@¢µèÅð³íì•}œG,æìøÁzæÅV~œ•œZÞ®`v†˜ˆÃîǽO&~ïN.. 2þꈫ0&½j›ŠÝAe#ÏOL:ÿ Ö<0f߯µ™÷ mcÊÌQ¡‘’“åñ—¯²gqEèýºÐ âÆ›.àÒ!ä™o…•ÊQ‘ù)þÕ9÷ágÃ&Mê¸ê2vÐ)㯻­µ³uêûgNo©ÍM´ä¿­=PŠ9ç}[³`"”÷S“"þalòÝô‡î c¥Ûﲎ%IêÛ­ˆ½$í3ቔ¨7_}UZ®6?EúÎNÝÝl^’éÐs?¹˜›ÃZ¿½dј†/ƒÏ‘ãHv}eÚGñ•g&»Ãa4©J_&’–ÝvHcð?,Ú#þÊöÍjp¢0…CÌ'æË£Ïb}ä Ϧ!º•Q×A‰È ÄcœêÔcÚ‹<>¤!kUC÷ך!fEJ3Ø{,v)êr‘Ÿ0JY4Š&¬×ÒÌ‹_R˜»d Ãió¸æhû± 㑆(áZÆ:þÙà/Wú&7Á+Æ?Ó'ò‡?#m{ŒKœ‡ŽÈ3yôî¾ D\µ± hÔ%GÕi{)O}S*»ž“±²âÐP,”‘êÓs0 !¸Åwazaf¡“ð~¬µI”Ôˆ9#»ë(*·þqngYB¯Lj®ˆ§ÓÑ=èoð›ÒþVD¶ìSãuÏøúÍ{ìi?5Û‰˜VœOE‚ÅÓ‚0Õ 2‡Î:/øöDf¦kA¨®×Èg8ÔNv¬;·¿W¬"{p•gˆP°„tÐÂ%~ئ4nb;‰ÉÙç‡ Q_ÊÇ»‚1cí ¨ÅOÝFE;˜NÔýWþ£‡h1ÐD“Ħ`Bq¢.ÞNÇ­ a9· œ..h–w$؈Ÿ*#f2)dr.T xk*Sï²ÑJ IRÂû× šñshµ uKlÉ-¸«mù^I& ø&Ô.ÅV‘´Çü˜ýr¾Ã€âI˜Su-°äÔm€V>ž® nÖM¹ãnÇÒ†ùJ±°®|jŸ$:¤mêx¼”'‚IÝi”üE³oì-ÜÝPü&v¤—Ä(/‘¸uÑWãØGR±#ÁjMõöŽ…Rü@ø•öþs­tˆ^ňLÒ¸ƒh†ˆ½´·í·£þhñc;PÍ n6DЀ]™ÃÔàåNš s‹þèøïÊCHY¸km„ô.Ây4å½-‰0°acÌ”NÄr]!ñÜ/>pÀ›-Èä4)›DAÕxC€å:Sšº¢¡Þ §‹sX¸‹†Ng*ž©9+y Ò³ j@”ÎE³ô„ksaMãn¹¥ÇÛ.]OÑI_I!]¡8EóüÒš9†kûØÀaˆ@$ñüÛwø5m.¶Ÿs§aW ÁÀMÐJY²¹žáÎÂÜôt…û™û½øÑˆÿ!ë»1y™;96ËÏ‘Ùd7-Ú Œ{nkÞ”säãú(X×äÜPlÖ*òŠÑN]"ýÄA‹xì˜× ¨ã”@Ü!ãyæ•Wa6Æ@‰Ôw°dAšŽ£>½&.øß¯ÔšŸb˜k„X¶uö½¨è‡¹Åõm¯ÖÞúÆeÁ_Ö5±!ýþ˜– ¿¯yû5>í¿$,˜ˆ½öûD\jº¾8ä œòß.|À; ZWóÓ2T%ÑF©T©ý½O,¥µÔ±)2ÓkÈ2"nªÒ°±bcÕù Ï¡¯ä?^ñ¹L "õ¤ÛS#¯uÄ[õ8è[ï“=ªÆéŒ2Œ29Ï·³ÀúhTigÅF4FqNÌå±reÜöÒ=ð¡YÝ㓎Õ;šNÓLðWÙ†Œu‚9ŸÙYŸ;x¶-Š/t³´˜ é’õžÐÅˈ-—ÿ;êíGp“šéöÞÕ¥·Ô±ÏÑå¼}žÔ%³q×ÊT{iUÙì—v•S::BlŽs?ÙÅìlIÜ$¤/¡YSþ½q Ôû²Ñý§Mª3‰ÿWeõ xIì‚1½~m°Ì¡sÏœ ‹Eîä œ Éߣ‰ÿ6Ì“—ø_\î4 ÷\GºÂ0n7¿D°ÓsH"×{ˆB‡Ð£š~áÓHÔ/ãOÒ]é6j§,œ;¸0¯5â£Û«5Î)ž#}Õþ{Xµ?'碾£ÂÓD7’& Ip—-µˆ=[d{=w#_Hôû¹Î =XÆ(¹—–gf÷Í„ÛÝKçRš`Óófü¡býeõ*G÷€˜ hDÿ®F÷Ô+\‹Ï¤ÄÕ%Z ©(¼çÌPÑÎtBôò‡(pYÿPŽø»ôñml’ægšìl& Ôkûƒ×ÆÚë|íÁÙR j®|zS°å:£SFw0æùª}øò¶8ñìN”þôäeŽÆ^i¨ñûþhyÒ°ŽôÓUX–ÿh‚ä“ÒâЯœšËþôPXÑçvF›Ic79ë¼¶G”?ΗlºËÖ:¥AÓ¯G‡½ü‡Þƒ°C$)#EèFÄèP¤à,›íÁßJ¢dwúmAHÿ6ÒÊQø5“o$˜V-LT]ö¡§?/仪†ñ=qÕæ³ÊeÞ0iÀº@M‰&úCÖžBkdÙ̵*úçÜ5¹SÓŠªy„f¢©ÒãÑ¡>˯ÉVØ™Á·åc«NÇ5üQʶ+…Ѭ1ŸÜ€‡qLí·,б+UˆïÐ Ÿ¿›#‰™ö`…³ã»Ï -迬6‚wKls©ìPK~WÍÁH¥¹!ì?=y›³{L£A_è‡ÂÍ¡M†èÛØÌÂMlBÍÊ_³÷ïpLål(ÿût§ŒQÂ_KÝ¿ˆu¯$³Ïçeë6ðv÷àãLÔ’ƒ©nV7±ÝßtMØ–¡ê®0j|ÂQÆð˜è¶ €!£À mט¦§1I1iÞäUû²õzG8°`“•àøÒFéóºöÄ]b €®Uwè-TÿüëQ ïKˆàŒ%p'‰B1-o6¿çL´ ƒëºDrÑP#aÖ•-‚,0H»¼\V&-½’L;ûsË„eE6QRI`^Q„».r- ãíñ³üÈGuÉ|Ë Å ÀuÓz,o¤5qcå™èâ]\   T•·ìì‘g7.Á¡‡¸Cà"¡¿Œ¾¥èJÞ0Á–Ù†ÍúŽRª/#½X œ Îvè)ä<|Zùùƒƒ?ÖX”­D+ÌñyýÌ!×Ð_~¸(nÕ¹,á­j§a]ù­OPqGGL×=îìf©‘Cò/ :/¯*FðñÉ–/¢}òª —Öü4´{³ÕS«$# ¥yÜN˜;Þe ·­¥EÀQÿ–8¾e'½ÉMäÚî¼÷Ôbq¼Ü–F&,ç nµh¬$QÒ“ôoF3a_5n]Û–ÛìmI*RãXoãuaòÍi5`c{a•Þ "wt²Ç-ºÆ:'=¿ð7FÓ•Ú>Û4}!’~ûIgx)û‡)Ü\ÁÝÅÉW-º¢í/ÉTÌ÷Ç¥4'Øj•<«hWì-Àÿ¸´Ü¥ÄœýÞclw ^ÖuûÙA„0ÂÉr £ÔRùš_ÐΛzGÌ`%?AR¢‘뇜HŒ…Ðd’BÞ;G‹›eÆO›¶/˘8«¶¶U ZÄT|ÖyÓE°ò8³nÊÕºñÿ´:½ó--Ç (¡(‰h¥ü’E.ÁÁDíxwÖpã½üW÷O:ã-0._Zk¤ÔÑöŠY!á ½xXlwUOŸ7=²Ùr¢+cqŸÕÆÃB¼È0ÄUæÈ«"¹ìKùÉS­š^;Î{ÂáXuÝN™#ÇøZü”ªÐí0Z ãô[ŸM‰žïZ5)]GÈÄP¹PÂPŠJ}ˆA~{bðÂ7I$$-ÜÙ0wƒåO¢e÷ÔСÝœ»ñ§i¹¼Ûñ—]ÝlŸÂf®Æê`† »»HÓ€¢ ôÊûw¤„g{¢´lÙÿsxcH‰ÒgÔÖV!Äß=n Œzÿ#Y:JfŸÀ>ù§ ºÛX~ùÚÌóú¤“÷g푾òе¶¼ÿµ]zA MܨMétJhV# î ÐõîΤ~aÝØ­Ô€#J°Ó:¡«´ê[œaùØÁAnFø™¼&ê þR3ž¥<ܾêók\3QE·’%ˆ+Ó°¿['£ïþöc#fu¶F¸Èå #ã·§KÚØ¯–—ðù:yŽÛHñƒ"0°”NðI²¶A÷m˜Ï¿N4´ Ù­’úÕÒÔ‚ÀÕ½EZ=NÊ-Ê öºRy!ýàÝ‘K?èf&IªT 𕊙´™¿Oß “÷Ó¦ Oo>jãd1‰BHs8ñ‘÷Or­T’®:ÂÅ·@T°¶`¿n%nRS`:†#©ªTkBäG9*«ÏV”^÷€sˆ>©ë3°«Åðkæf7šL„~ÔË7“çÅ´<ˆ]à—c0WpŠæÀ×T±Ÿghxÿ—¹þž™e‘µßT¶ï ¦pƒàG7}tn“ÉæÒ’wœïtÖNxKÉ©r8ƒiœ~èíR¬ÆÊqœW®Ìšœ1_ž­vuò èNâ¥ã\ŸC¼f~&ãºZ5:°4á½Ê¡~ñ˜ v Fä*º’BeêèÚ^%b:a %@ÁRøû¦®Æ‚æyAãv÷Í>3Õ³’´sâËЫ> Õšr{€a¯y›ôO ‚Î.+è@x * ûnÁÛÃ[Æý¬+xް¿Â¨¿2µ½[6Õ˜dVT gÖ0ó2œ´É\ÂËRÐqIyˆ22lÖ!¡S`ƒG–EC$]qÁ *QŸ°"0¸»õÑ5Kؾ â´ÄãmèíÑt F¬K¥QÖÓ+:¾à§2ÞqŸ^4ÇF®æºÚô~ù†4#C¼©Óß Ñò'æg§“ñ?ê^òÚ$ä$Aü¾®c:—W·§¨~7븯е|ÀÎÆVàßs‚'™)êñùÀ›Ê“f~Ü[Ì—‘”¥Oá_é\;æ ýY´ä9åu¸ŠRÚÒò)Ñ(=%/”+‘@ªhJµÇÇA¾û¢ïàÓbÒ¤qÇ#ake àNLý3yŽÿ*%®”â&­_ݾ¹æÕ#_ÿþJ€-—$æ.¥ôféû.i(A-,²!t9´>{øi.¸õJýoY†ÆMú Œ^ÄsÊ R\CºÉîp×ÚªDI,‘ ºÁ*ïØ{n@Rq6›]ïO]g‘Cx\µ¥'„¶sÔÜHÿ ±ÿZÔZ‰]ñ$Aè9Ñö/SÝ’# öÝ©es‡ÏÉLÛ·]3ÛIÎK˜5'v°ñ®w¿II˜·5NQçMoª†*ëQ?ô‚Ê£MÖk¨ XXÂ¥´Õ]ÀÑ“¾X~ÔYÅš÷þÇG´þöh"ƒ\;dtò SIá´]7óî½e"ã¯E;úE ä'TÀ—4ß+]þ1Eˆ-ònˆª°¡å¢á@§ð»VsÞ¨>ÀìþlM†ÆlBáýÒyñ˜‡¿¥x³´X›Qø’™Ýèi€–ßM’߸\Œ%ÕóáXF $¦ä$²'QmÇÆYm`ŽÕîÅMfÏŒó¬øIÆÀ2$Œ9›?_2íÞj›‡%PíëÅ ÁÐ?ïUëlxôKõ!e¼y"& Ó_!Þü‘â^ÔÀ~àTzáß7·/\b’h Þ¼7tûÔ¶ˆD{h9¤…ðÓ_El"Í|䡊ýYûa<Äa'Óë ¥z.Í'ð嫘‡,P&\Uîü8¨~±Û&‹A©ª™]TVÞúÌŠ8ù3ÏI¶Õiócjbsë&ÄÔ?2á©ìàìŸÙ˜zK„(ð³Öì(žAô[‹·RÉ2Œ„æ7dˆci°³;ègÏFÝd èä 4Û?¢»ªÆ£+åÚI?ç±y¥ÄøÊÙÖÄŽö5=Â!·gUHPM w5_Q¯¤–‰?ù@Xg¦?/†ŒüW’^=Îá:|ªöIO©³M;¹Ñ3XÕ;O~Îh•öŒrÔ“´³9äf!ŽM½9:Ø :ƒ°Q˜ú,°Äƒ¬ôÕÕŽ·„Ñ«¾þœ‡Ôryl­Òv€µAm{Yª.õw¥åª‰ýoÒ„ÍiI:EeÜ€±‹§ÙÑ(õnáß®Ÿî•òÁA?ïJ ÃdŽýN3‰@\þÑÌýIy IA}Pdô0==iRö"¯]u…ýf@¨ÕËœýæÏDéC‰§âךҦõ9,wöÙ*²LÉà[­L¯Ú7ÛhyÉëìŠdøô¸z0ç ʓ릆¯ðSh«ü 71ÊNO‡©òl¡Í¤n; D\¥€Û×û/ã 9úÉ[a³TÙèkŽ0NóJ„GðÜT°¸ö˜í/\àǤQ”GìLàã2z%©¹U«£±¾3ê÷¬NÁã–O–Uh'·ì7t6åßɸC2ƒÇ½ØC“j3ÁpÇEbÍFxšC‡%hÀÊg¾zÊʇI@AT¥wäÕAÐ' V76.ƒŒu¦t¤¹0²J\CuÌcìý¾ëlåÔ¾#W\šÛ ¢³¦”µJ@”Eë¿1ëÇ%xB7,¨V\J¼Šx'ýgŠz±ß¦A½xÀÆÙM?ì¹{g@±ŠjQ u’%~»({Ì€Y*Xu„¢©¢´12vF¡L+8«-wëïý…ëÓßµVÌ™;²@Ží³û7ï í·õÞûk¨»äÚRŽu‚$ñÒsžz ¸XÅå(éhñƒ8½Nmøu/ÙñÛþŸ'žJ›ÉðÜÆùö]'¨ÅÁÃÇuþù0§½éaÛÅ…™jRE1¥°hM{Fö¶Íôš:IJu!tްçÔž°ç|—aØO6Ï’Å«#I½&n¿ ÉF–{$"Ó—zä¬0@ó-±«{üÇgum¨0…pŽ@ÚŠë9zê‚zn£ˆ1 Õ nµZ̬ ³'C–>CÐáÿKñµóÙê¥$, #_œL°¯¿ðü“‰ûC£Ã¾8)¹¡BKQS ó¸^ã\¹ÝüFÞ?NǃŽ^«o‡çÎ#’¦ç{±ÇÕÁÜéWWà†2ÀÈ.z¢9À §áÛ?x2 +\8siàmrÛOWVW³ÖcSkªyò%†òlOŸë6ÚNæõ(:@;;²–¥=²r.ÂG—ê"éÞpSm£{ V­†‹”J‚WIõa/E3)/¨yô|Óóá,»K})Á®R•f’äld_@Ïâ¬=Fq2m°¦ƒILà€íŸé%Š’ïšÜòRùéáÕ¨owD_ºÌÇ‹Cõ¸Aÿqš°.B5Ú2ÜjülhÂåàÑu–„?†c?îF¿Ÿ÷bÇ„gÝÇ>m^ü…@8"y0¿qje?£E½_‚_§8\‘.½îÐ +†ß¡¼ÐXcáæ*õ1LmyíøïD38ÇŸá–ÝÀ­Ö`7'Ä„£½ |nw(ØöÒÔ¨À{1º™HŠï¹¯Uh*)6²V”s±ä˜Pd¨Èl ø‡ ’“ÿàl×AËU-/×Â=0܈"(­bçŽJsŽå{špååa}mué,?Ø$9£Ãû£Z¶ëÂt¹ƒz7¯À:ãUyé¨+‹u½ä˜¾Êòï|ñTó?Ö…Š»Ô;&CÁÏ@Ô0+Þ·m‘1Uµf¢ŽçÊ¡‚ÕK€Rs`r»"ÿlZì:ÑÝ3›° úáÐÊ *‰½f¤™+¬ZV Ùp ©­Y hYjL mÁ7ps!w~Wì7?WÈjj¶%ôÏNŽ7}T­XãD©»g>a›ÓYêÛºU°ñï0‡gq7µuMS-v: -_­3¹-¦ÞéŒóµnVžÄÁÆwîã¨ßÚåOÌ2¬¬tôÅ»‹Lm ‹Ð¼Ø— D#PýFWˆ„‘õ å¯Ó•â.'V+µÕðCq©{'žÁ9žá›&maÂöîàŽk-'Œ6’þ#m[.”~ÇW†¨6 J{Ñ ÒÛ“I³œ“k•.KzO ÕUK ])|¢×1ù7qìJD¨˜î¾ ¤N”[{Ž4Q_*¬ÙÒ«þä9jGùڦùÓªµÎà„“_ :Øf¹²]ÙÎ4êöv/ô «¦°CwE|q¤;]ˆXÉ-Ö—’š,é0c&€ £¿žÄäÁPܦ>‰Àˆ,ïP\zÖ‹YD.DóãP àF×߃1\Ž #‹\¥yÁP•k½(•L:í“9ÿÝYä¨þÜÖTúè§çÀÍægý2ßõØ›1çÀ½$&Ƹ»‹F”PX}­¢ñž¢;ÌzðoIû¯é êó§¤`'"3[0•kìçà/\Âìñ 9­™ š ÇUš{f«ì~*ŒyR!š+ÕYd|µImŸN"“Ã5ôñú_Ø«±Tºô„}˜ª„% ÄíÅÝÉó™9@âLâ!¡7°Qäjò¨'ˆýŠÙ>`N&¨8éÍHZ8œÛuæ'àà÷'~!Ýùæ_èõÐ2¢õ;‡«Ùò°=’̤º^†€T^ë¼·c£;°M¼5=´–»‘ :ë£Ã~[Ch÷`J©Àª8Ç#ò‡iÂÙ,šnHóƒbºI“6¡6lÈé—! [þµš‚}†x«<¿càÝ»ülûDð•uÉÎ2ì7ŽQôöik|×a#㑞ðjx„ð{—0ñ„a³Ê@dN^›Ü€R ÝBÕeåÍn™gÇqvÞuÕ¯‡`D£®æÌIÇaÏø$0>Ñ=û¨D ëñ„(QŠ~q¹7þzƒ²~ÜŒ¶í˜Ftt×i±'.(ú"[´a !…y¯¤C´Èž×=hÂ}Ô „¸ä…r# ÿ¿«4¨/]„9 üX9*È…Aavgªîó ³}Þ{m¸öI'ÿÃ[|cd Ïq[´Ê^Hoï÷ñ&"Ò‰qRøkʜ漵lW¼à2Ÿy˜os£)ª ³ÎBm•}9ÜÚíŒ[q&¦Y®Ú8]WòK‹º›Üuô”d$<5^n¥ÍÜÛêÀ!>6®‰#„p(ÂE43hr2²æ1}§Øä4Ì»e꨽c¨Ï +Óxÿ1Çé m¿›X¹EÒªM‹­nÈwSc,sÿúÀ= ?|fdY¯pÅÚ¯sHåDÝ}qg0\á’û¯ðûY”€¨vftWׇF‘õI$©!É=ÀúË#`-œ-`ö,¿€@°…•×z¶u< ðï>9)ˆ—„e`12Ûz%¥•> l,^{ØÀ½Vu±íø7z5Ëç6=X¢˜»QÑ‹m`“iK0 /Ʋé±îb7HûžžµûÕÁéòkŒÖÀP‡TÀ¹#ÒUê{f4þjŸ {ÊZÔá }p)9㣤Âßॗnþ–dM¥¦Ú‚Ö º2ç¯*p½ËãݸW÷~Òé¦U ?é¦ç ÍÜè³CÆ¡0`ÖZ;2<:”ó:”KG29Tè›Nq]ù]ˆlJò¶p›49¾Þ¤Ï_kÙ•ÖsÜ.Âå×ÀÖµÇù«Îœ!â±þ¬Qfê ¬ôîË€š‡ž7"gxúrÌ$ÒÓ‡xÃÿ–z—žð—–Ÿe«öíhVYû%eÿ5’¹ÒXB…QÀò˜~JØ×y’ï$°æ®ß!JÞ¦3F²9$bç>g§:D06¦rP¦ÀBÔ&d]AÒÈ p-BBÂ%2Ì¥ìQY½]ƒ žt Ç€&vU«]ŠU9=­‡è 0zb1ìPFu ¡;ëtÉî­Ä‹kÿµêÌL„û§5²`m¥ÖÐŽ”ðD~ÌÍ‹, ±(—¥-eG°4-”ʊפ‡øšÿiøaêaœÎÐ`r“…TpËÊØ'†VøªÇ‰ÿùÉé~-Ã%+€(þÜÛƒÃÕô3{Eý¥Y¯8˜c„××,Xnƒ¹Í¤­èh‚ hT»ÝT·lªð·Jlù¸§`ló«Ãè±öàN£´ŒÔé’3rJƒ7UñDcãÁ=’š÷Ÿ]Ù^¨D>6ér{Ë®¼+Ùž.†iâ8ø²*%Õª€—8¹Í.î&eEƒk  u©ø¦u|°¬†¢`ñÊ£ð†`à¶"O7ÓŠA]H„¥µÏ\wºfÚ`Î9 qÎZTvÞd„Ô”B’¼,„€ñVN.xr_¬.§Ï=k³t#É5¾ÐuÎÛÈ*>tοX¼[ßóuö²õˆO–n5'ÉÇà ÇA$ö¥[lj Ú‚%™7oÐsæº]¢óæÝÒx‚«æ³o&¼Ãå< µ¹ ÿ"ᦴ‹é¸¢(eN&uµ2'fË׳â“mB½›ŸÑ¨Š’³)ªAƒ?Ãö Œóþ¹âRo­NÞ p¨iS™N¥ì º‘XpíF—VOÎ{¿-\ÏîhÆÄ0"c‹»¦v œo2spòÀcìjÒx&_rêý{B¿S×o¼vC å #Ûœ0xkή;%¥ðz ™úÀrPæœæ€ ¯FWNX°´-üVµ³6Eó.VçC÷—¾k{g§8u‰Ønõ1Õè{bÂjIaé‚M{–؃~Üòn1A›ú?ïϽèI×mYM"?ȱ=€æ é?V—KØWÌÌ[D<ª±Wæ uó‚²_lûÜÚ o„[Ý€‰Ñ¤厇ÑC_rÈrøØŸÛ3Ïo`rô¥aûnÔi¸âÏ7ùÔì‰O- úÚ£(?ý¥Ö±žŽüï—ÌŸ‹Ü1¶ä`–ð?ŠÙEL°äPX»ª˜Ÿ}ÅÈn¥b³F“]ôü4V†ª‹DqÍDœ>|ŲE–IV{eÏPÿbÕ‰eËe{O´;ó׸Ÿo.U ‡™“¨³’8Ù*ÎpÆ{º±Òå·¬ƒ¾!0z”bE†rú™…*wmqÀxÑϽJð¬–uPi ®±ja¡ŒªÄÇÈR«R9Åb‰@ÌÂRƒ’óãsî­Ø²pâ;Ñ¡S›p•eÐDdÕT¿[Ž0¨©TM¸e‚ýèêÆÛ(Wlöa]haJ¿P¬³ƒß=N9‘!Aüò™ÓÁƒÐfþf6mÇ—ž¥õq'ÎN”† 7ŠOÒ(äí]cB™Ðo¬Üœ«iýßÇ8zÕ#á™x]Sb‡Þ°¢V.¦rºŒ¬@*<öÄÔZÆ’]îMÞ£Ý,_MˆYuÚ·7׉0ºK¿Þ-(#¯¯"BqÞ{6)uµÕF±¥xkŽó®¥ú†,“¨í&׋­oì¡RÜ€ðPe®G”T4½o§VN:É7ñeðÄíüÑ?Íü»ëT§—_ÙÁÔ%þ½ áU¹¨XM^•õÍa•§óslOQ ð%3n¸²yßÝôè]Ür=_vÃ:–Q ŽÒêH`sNð’ü=ÝþùÚM+–íìåz45 l7°yµâ}ë…„¤zñª¨uaÊ l0ÕŒR5)H›©tbýªÙ<}õÕÐÞ ï/3óŸâ”Fb*}Œ^ý•ÆP^àªÔZéÕ$èzËû'Êɪe ›mšÛô© “p™¾z1²Ø#´¦¼CöuâïRáñöí1ú|…Ý%bF¹ÿæR2œ™ch ŸjA¹añút…£gªnŠ<*¡ÒL÷ïX?vQߺ/5ÄÊÀÔªß<&²)ŽuâÄÕ1â¬2–®5È‹ ç|üÑ¢s´Z G¿ð Çr Þ|DÉ t¯”JV0#"ŒŒžabåžÔê ¢¶yåI€Ý.^1¯­gHˆŽ3; WíEú”~óÎ!;ž[C˜•Ý;Ì{›“¨ö«² I¾Sýpâ¤äœ§°ò\ÑÒ'\gðGØCˆìv˜›üÙÄïì‚o›¸ÙÁºž—¤ÀɵÜýpõÚÌK`E…| ˆ%ØqìùB ™£ï€'n²Âj$ͤs«æa¸ø×kxÌH;œ †ß¯-"i÷húþƨ. ‹ÈXeÖü³ó‘]©IA}ªðsº”¯ã9ñÌ'«öÈ{ñ¤DÍû×uµ †ÊJÅT¼A_[Léß)ØmÂÌ¡q¦¾ß4º®_œéÅxÈ12>'#ßjYÈÏøÙœ¹uÂ"ˆMú§{õM£a›Š¨ÆU(†/óá¤Ñ ‘c»$fE¸üå‡ë9†žG©*uZgaân_Df¥©…Z4²î’ÀrMÊ=LªŠAÓx“ߢf'ˆ¤½ ÄèbÒ‚=w[XNHv9%}Ó°Cí[œò28‚„†@*dÒ…=¨†5MD­ñ‰ÖÚt4Tÿ§éÀ¼ü(µÚþ–*mû]9îžï0\¿¨ÈK+õœ*þ!õZ[5•U5Û§±Ý;·Ù>ïµ#AÄÑ%šre °6R¼³g>3g¸¸µ„ÎEŒR-å ÆKú&-"*ã*^– ò{&õXï&Ç’Úœgj÷*·DF¶fσåB ã\Rµ6ƒZ÷ÙQ£JØ ãÒÿVk+YÒѤ 5´´öaCôõÑîK·ì"þ× xÃÐN&E*’=U7O›Œ1«q%PáSÀȟ̾ž¾ò6%>0 ‹YZgraph/data/esetsMale.rda0000644000175400017540000016027013175713336016243 0ustar00biocbuildbiocbuildý7zXZi"Þ6!ÏXÌæöÅà|])TW"änRÊŸãXa“ÆqÅjnçj-' ½;ÎÕQˬŽ:„r¶]SŒ2£—]«Ñ:çŒ\.ú†.‹I fòf5ÐÒ=ù6»ÕrVŸø`+–™ö¢”(ª’€)›Udìÿ¿ETEîÞÈFšø 2gÑx+T:òb_Y™á[<ˆWC¶Ý2Ph§ Ÿ‹f•ñäPá=æË‘r7õ´<àìŒÞz¸5o˳(”1Ÿ?énW‹`H‹>}ZÍ>¾"±7Årð1+u^À{IV€°w'0´6r+1Î å^cðªÓÚ_‘Aµéj,b–µ:¸Æ§_ ÷t–³×h’žÔ5nUü vùkªÊ°%ÛÅR !«HŒO9Ú‘}éÉkyp6ì<€ÏèG.þ­¿4ÉDYú„}sЍàö§Ð)×ýã">ÖǛԇ¿Èð. ƒ+:ß5œùÞ²›2ŒUÒ2Ò6`·æš¬:Qÿ¢£wà ñýge3ZïqÑDÌ©r…ËTþý°}° êän‘Àòìx¯é è,¨îõ_3#>×ÓSN™N\¨:é«-&{Qƒžë„G’i(É¡‡ÜÆýr/Ü"Ø…Ö´itŠ{¾Ã¬)Ï4÷x·Ÿö)X«>ãÛâ+A÷ˆ¢Ïû„sþvFè=žEó˜(=2±Ó½ñ"˜—®ÃN&â£&oî܆Fœ’¸w~Üáv—ׄÛDå¥ÞF§WÍ&|Ÿ%’˜eÞÇšg¹²HžR7õÞãBã$º¢™+Œ@ê‚ÉTžd{¶ƒª‰u"×GêA_à—þÃ7 tÕ<ÀÃ4º¾g¹]ÅÊCÖ’^ö¢ X™Ųo *bK¯ÉœbñßŶ¢¡‹ý]Ÿ“_‹%Wcm¼²\× Ù#q>#„:PìÊ'² Z%êiŠóÔ—8âîù””菉óG%‘¡dú}Ûa~çáS·88OJ©Äg‡ýÛFd˜™])}íZŽ>B„½ÇDÌl§Ì—N«þù‰ÐÞ]¸X|Œ¯Û™þ‚úÂÛ:ŽI½×6CqUTjq ýS>éõP™œÉ,ó£œ*ŠRiÒñ­&ŽÏ%mA Å¥G•Ý9¬PMçlÒ±€Ê¥ïÀ+Âö¾b4¥}Y~Íd3½´{¸Q… bn–R:É…¨EºâòG ¡˜êgwÛß“† ý✭‰Å½¿k,X_çÌEš÷â<`¤6Ü¢M~<=gT­@­EÖåÇ´m@ õ–*åÐ ;û ˆè*­•U˜‰“E1…"³JXÛ¡³ä×foõb¬£äC7g®ûb:R3寙/GÙÚÕ†!Eli¸B9M2ÉÖ2]ï9ãKÎú€[ˆZœ0¬ïß׀OÚvÜ(1|ö£ ä’Üå†víͰIäÊ©J0‹KƒÐŒªaj ´¶bŽÞ€ƒÿ[jr<.UÎi¬žô’ifu8œ­¯¡$§îm•œÃ8õå€{®Çþ™]0StŽÀê#f}³ Jj˜:0Ú˜ ?=â–\iþõ&ì”írÅÔ¥ƒüš­þ÷WKÄ4Ðݽp²áâˆóyÜß %ù7Á–±û§k¼HûÁfÿâK9©d„‡úñØè+A÷ÏÝÍ:¶®›!ý%§¯™`®:?tùN98–P0ðÎüŸ‚‰âªw#Ôh§à|¼ v—Äo\k¡þê&"™zbFp|SçÏbŸœ#‹—U¦¤²¬¸§³ÎÙ 2Üs_x•„Y¿¸Åm"#ÃMº®ûN ÛÄ ä¹M”íÙ'‹èÆe[örMœF2¹u… ‚ãã-ùL0ø¢H‰•¼vJùŽw'C* £ÿs^-eØâµGõ#£TçNˆr|FÈö;+=à^8ÆÂ?‹¸6~D•òWüg<þ¥mîLðÅ®ã¤I/J?Ïÿïþ„M•còèAÏFn@àI'Ýæ¾âë6— ÔÈ;Õ¸H\Y "¡–"¢£mD Èlb¬­ž†«ýõ¹ÃDU©þã󅟱r=˵h=’pJiÊ.cé;ÔëΗZSrL€x[ý˜g6wÐ" ü:ÿ‡qÂqf‚2X.óúáqCWNLÝ\qòÓðî^¬jMá¿ù –7ts!¶\¢ÿª+ÈH‰1" W H“=Ä0{͘kw«ÐìãKËô¢i{ü>ôŒí³ÎS Ò’Yâñ+  `ާqûàŠ2ÞfÖcé(OœÚ+ H²­ù=r|‚-m•s:YRÎ’ã¬i$ ´˜0_g}|IWê⯋EŒš\>ýÀš™"ƒ%M^êW*­NvNù¼ŒÖ »ÉjA¡Õ‡ä~BwA‘`ŒW2ΜøšÅ8#Dõ€5ÄfòÄ›Ýï±÷Pÿ¤€Eäáù(F\ª !u[bc«/Wíß¿þm‹°E¡sÞŘ2~ü ‘sg^á¯ùõ7E N¿ß)C¼RÆÙÇrºî"ô©eÆà¢ì…PõÞ êYÍý¬U°rñ@º‰îP…ûÊÍï--LÓ´õlC`o Æé¡úD—Ä ’ÓWæáÖâ¸èÎÙÝò^&.Õ dN˜·ryû,5ZuÄË,,ÿygq™ð*žpÀîXdB1Ê㤧ԞÿG½- \«¢²ÏÉÏIª$®«¥Tbù53ޝ]ndÊ=‚û±„錑£Ì@øÆ_¿ZÑ••£Êk‘oÉ#Ý Os%_ãØ)(i5¡âI¥î—è½ö9æÎeásFwÞþ5jª z~º²óìZT9J¯>³a2,¼ÍôÒ±lâùþó;ŸõÌc±_Âb«eP^f ‚“§Âc{°7îÐÂe¾\Î2hò5p3Päk/¿¯c.«°žȯrÀˆãJá“(Œ»TÚµIˆðFûWÏIËsñxèßÞFî\Íèj(ÅŸ¶ØŒ¸xMM{íj­.g7ÚeùÜÈÉô¡AìÉÁ;΂>Ë{‚P rÚ5ÎB‰Û,ªJ0Í™…²e6´Ð£_Ä‹óörõì‰g¯¦¼ò ÃùS‰*¯hîÊj1y‰pm,²Ër†U‡•/2ìa !B—ÅñTØa[÷µÂÁ±ð &øþÓÉ>3E T3‚ñyw«Éq…þý6½N,¦›L Ðõ 5«ÔÇ0Œ÷óÅ̆ÓCËf5‚,É`ë%ža/ˆVWû¾h¥_¼:š‹bøvÙˆ¤†klÞ¥)~×ôÉÇ à¦J–qì‚Ñ×+ Û1§•ý÷f»N‚Öæód‹1NBöCIÚN+&0»‡øEçIÑþŸ ÑÕÂz¿ pÖ[» M—|ÓϨßñ¬ÊE° u¢`½ƒ~zŒ‰W¼ ƒ ØÚS+`œR°ÊâC‘C·»ü € åj§Pºß²¨ÎÊ·}Îü#•Lp×ݳÈ=j ÏKÝ©øÂ~ÂÎ3¯¢UÖò‘5·µi»¥¾ Ï"BéIÒkk&Õ¶ô$H–Õ#5JˆcPÅ,@A41" bÕ®¥ÞNd;—[Èðâˆë6ÆÕC?p4D~€Ê.ÆI ¢ÁA½û[¶«»jóÏ&#ÕNæ]Ö ‹1€'då ölh9÷ 4²f|œ¢Ð¢¦jcÜM'Ø ü±"3˜žµ¡°#eä!ÏÅ#:Ȉ{TîkeÞq‚é›|ΚD¼˜íZÃV™÷oÒ”8âC´7Ášr‡u•êÄ3D5L=}ü±¢7&žK9ˆÓ»VøoœÄ6,¤ÿ=ϯ–À’M¼¬VìJôeígay>vMlk‰ÙPsoIÓïåð:u5j­´ì­,Þ7^ÜùŒÉQôþðOÁ`ë0Ÿ¥8±íÓ>Y‡:lLDzÇe½mA{^-P¼›ü©èLüb®oÂ-ºîª/~Ø*»W<ºþZ95ªÑuÇB^ÂÜb§FÛ›°(’Ó¶˜Rc~èÝŒðˆ2ç~M)7ÂüɆ•˜qUŒþC‰Åq2é'’‘È­žò¡×̤ý×jJ ʹÖboÄ©å2m÷?’Òû¡m9„vJã=Gù¶ÆáS¹¿´íz Â^ö€NŸ£t{¨ë Û|`zä¯yuv?[‹ 'Œ<|’ùÅx: ¯q¬ÿY>ƒÂé:’6:©H¤„BV¬”PËTËÂ(fÏqÞ´y ëT ¸µÇÕ¡Aj¢"!ð“ŸÂä“Ò!•á–px§zzŒ¶‹º"­úÖÄ=X´Í^ª%LLàU(d â,Ó• p°eD7Âp×£9«`Ÿ*u€Å ®’¯áõ…›$¾ƒÈX¨ŸÌ0v–)*n's-‹ÊΖˆâ°-F˜µ¾öñÍWüŽ^í\WŠ^Wq*öCÞ6ô(€)Â~9T¤MRý·ù°3gl•oM¬‚Ê"Ϥj¯Õ6¥îñgpUÇî¤Þ" IÄ8Q[ï¦g“dEÙHq#‚Ô“ÑP=ì-¥#© žþaÜI¢NÓ¹rV!b ¶øøŠ`A Ú6³Ûøl^†ôûKÖ&,Ÿšå%Ñá^…ÜꎾW“qt, ë®Ì\ÔhÁxi“î=­ ÒÆhí¤¿Ò—ÄëBé»K€(— 7ƒ%¬aä i×ãDS:ôs$®AqKÕ8âÚ²ºPã³¶¥±c&BljiQJ²áÙ9̤¢Þ_û Vç¦ñì Ѻÿ'wI…ígÕp}áª]6på·KeÉS­nãZƒod³¸Ü3÷¥.c¸5Jñ‰Š&ÍûgÑa!nö1FüËŒ·‘¼jäÉ·e¬‚ã÷(£Z¨ÖkÛ8g|!w ¶é1èðâ¤ebnÎèÚøöeMÚ…*BDIÈà”âÅÆ½ªÝD§×f˜|øY¾?Ë *rô)L>¤ü¨{¨BæFܪŒa¦:Ú…¤zl­N4 o”?§kšI£Ó%‘lK˜ºŽ¡þÀž]òwáÜ“=±³"zX[ÓôÑU–µPc3ž ‚}Ï7=‹.ÉD%»4BqöfA{T}¸•æÅ\Ûvç ÷omýË¥qlð2›| (¤Â4lÂêÙ­ŸŽØ_“õ„´3=ÚÐCÒ‚ÐbB@¾Òeœ ܪ :t¿KŠ•êWŒ@vaU(ÁÊn/’›c‹3(0 ’:V§;yލ„ ç$Êü`qE8CRÇG5cÎ :ЗnMg¤_½]†&Ím=³´m‚xï¥kí+ìÑ[ø£l)|4³¤Á"z/H~‚OÒÅÖŽ;ØDÜa]oôÕ,Í¢p…EM3Äé¿1kúQÊÛª}â=ç7™…5l~»¤¥ù¡mˆÝ:³Ý¬úŸu`4|U³HVµ›Úî §(jꬒšŠÿ{7²rêâó°ªu"àÍœ%ø°Ž5}óÁÂ!$™Ý# —#^·ý ÞhŸ¾N¥^XÓWžÁ( JáfC’k«M`j¢v4ô+^ó“Ÿ¡ûÏÛ‚fm¢aºø®ÇÞnhžé7öd¯ã.µ3×~Z[OÜ\>;ØÛ8I…zASƒYÌš.^µm ÏÉðzΞԀ–Vëº]LxVŒˆL¢hµmh#±lÍFÓZ;Ò.Ò¨Äèû_¢o?`×þÏ|K"±ÈT’þmŽn,Eë´` >Šn\ªx•qQ/Ë(îßt°ˆÅ×!Õê^þÆ ºN˜Õz-VÑõPÃè]Îþþä~Ыýé¬\6˜¼-AbÝu#¦ è|Q+mÃÆŽ+1úA…ªôifQەɪ Œ…¬DQôì=çÝ£Ó¨ðƒmà9q‚E#îaSvé¦ô“ýæÊìúý𕹱OüÉi%ÂÕü÷!ÂnÑüú\ËDŒ!ê9•c¹j‹×^»±žfyÝû$P*é¤öDã¬çÒ´6ú,¹£õcý¶z–SŠ™~;Œ#&ul1;’‰¾Pš¸7Æšþ~÷à‹‘< Ʊ=øGz]À²ò¹þäº;ß!ÂN±ae¥IµÙ (M¿FÅP:ìqtž¶b–u¯ -›Y9±Rî€@ú:Æ£c¡£˜vÄÝ%Uqˆç0®\õAô÷&†:28”Û(BtÇùr‚±ÚÐ:µÚ1t.iµšø ü¡žbb¦ÒùÆV쥵2óM\~¾Õ0,å™ º=Ác9Úß«Ùfeà†™kRôŽ?={%öp‚£I+¼ ÃT¿ùöŽ«EàVç>‰§Cœ_g™%ÆÕ|ÊÃ&éP•&|Vˆþ!øÞ¼4pè>Pù š|R_B±$„^à!¸2ïÔÎeÑO•À£ÚuqÆ…ðF5†eŽêV¤t7BŠ=6žGÂ~ÙÖ{§Gö<^¯Z0ÇÏõ±ô²ØNSx;«Q‰”tÐñ—Q1­$ýVœò€} ÚÔf#™^ài¤†¥–³î‘o8hç)‚y‡ßëËm“c9!Âé?]莧ýÿ_†ØåHR%$‚Ù %iªÒN}(¿ [›MqÞd{Z  >\ó×=¥ÊjÏÔ¾ø''Z4ë%f&-| Ѹ÷9h\‰kæD7/7¯€<8þ@Î7ó<Â`&(G³| hÿ y‘&pRO°-Ÿ!!0òm°ŠûÜÓKûï÷›2ñ‹pÓ­R8ÁõÌt浈rD¨è¸zïzZ?U)IÁÀågÞx´¢d³lÌH‚ŠÃR,Ù1£•“b¿“xƒ²×òˆ¦W­-dmºmg®±.Œj·ÝÏG~+NŸ¸)ÎNÚ7O8,‡ úÙdÖý–E2U‹çGïC©”Ž1s‚‰I¥a«¯mâ¨gûsß±léDSI>¿òæKòôvîªYéŠÅMr³sÙP[á¶yß§Ãî<â'–²>t{Z¸ým[“úCE“ì¯â¯ ï%<È‚åûª¢’¬cÿwR†…Lràì$W\ óüš‡º­”}£$M " @¡oÃv8…¡.YÓ4+P×;…¬¯°õ”.xtøê½c;œî·/Þ¦$Æí3¡I£}³è# †ü!ÿÛ£µÌhÀ½¢‡éŽ¢|Î.Tçko•ÈÉQªÕ§çâéþª%zP(ÆVmƒçÄõf ¿å,LËb›½Ú¢w¤•Ý´t “ïM•$÷†îñ"tµŠôñí®­Ö„rî­e>mÁ˜÷œ0# "l.ç ÞãiM¦œ¾%•S²D6˜×'!¦ºA¸A-ín®^Õš–VÛMRY>‹t騄¨Wf”X9£(™ HP'ÂÜ.&hˆcàBr5N“pŒ˜ë“ÏV£'œ«ú$Ê· æ:Èw²çv "Ô¹Ö¾9‡-í|Îé²~NISರµ[nþéÝŽ>G2ë·*Ä0žÜ§k‹QoLPæ–!ðbdˆ×Ó×ÿ%]T0j-…EÈÞ±Ãàƒ®öÆÃ(œúгyPñ{«B¨¢[‹pbj—#;-•6'aIñÓ:NÊJKÎÁECä*4Ï6L[íªõø4Ré)ô—˜ª†û-¼¿›$&6 ýÆ\u¡¤¸*^èaT.éKÇð:Іf˜ÃUÔ0ð•j¡„sZYÔ•á²h·ˆ?,iÅDÒ:1†Ç—£{øì7 »Èó$4½¦ä7vª_†6>¾f-vâ+#ÆMƒÒîBY£»I}ßjs ìL̉1ü‡dÀEÕ†y†ÛPwl[–ãæwŒÈ¸Å*žb|ÿÕ±û?¢6ŠŸÆõX‚cŠ˜B@ZÖ¤¯;àjbåN‘F†–žÅf@Ö>Nèä+ÖÝ×”1ÔˆóTÇizx0VyÓ„èCmHûžÏÛrY2ø‰ê'æD:½ÆfÅ?‹~®ã0}Ieq? ¯|[7~‘Ól—.~·'•Þr&8WuÛ2‰8luCT'nv몃 3¾ÄáiéNy極àKMb_åA „v …éÿmµã&5Õëø5MÐÏíÊGÓÔ§x2~n¥Eàù©·QzÄpÅ«Øî;iH2\šK¡ÛêA•FÑ6 §n#+iKÛ/°¦hÏÖžîÑà5µÄÐjPØr²„Aæ2šc…œª{ÁŒ.·’¡ºl~Ð4ˆ•5wÛˆp"³n˜èD®kܽúSðÚDbS´ÐJû™êAÉäö–L¤Ø§ýKFÿ@²6®<äª'H¤ÛaF2mYÑÞ.ëïyÁQš4`ƒ˜ûÅQÒÛÎb[N~ªÔG[!%ÿõ–Ÿ4޹˜Á,g†‹‡<·]ÓŠÞZßûì,ûlkŠq.(»>Fs›@Úe¢L£i [[i˜pºx©2þÁZÇõ+'jÏV¾Ì5ug¿M Ë{8ø±мØ&ÿº¶;çצ‘ÜÙp¬\þ+‰”qÆôI€o’@! Œ#Œ¸ ‡x4òi+Åã G™;”±’ƒ(8ȺMä ½aÖÁZAâü®]þqŸ•0®OèÇØ¬¢?jp?È¥Xò©ùrÛÊ&ÁÄä9¢?õ42¾ô"2º^Ê—º’ hÀŠªÚôF~­Ž0ªú)C“÷˜¶ÎYÎþ¹Sú©°‚ì $\C¿^N•YÓ¯ð”W]£”„›CÊPò¥‹wÝO‹ éçõçûžŽèÝ$Ün$ÊW˜c ¼z›ûõC˳ 8½“ VñNÜ) 7ʽQÕ1Ž,£tÏ’ElúÇ®ÿSfCÎ/ä1ð˜£w™Wš¶Ž-úÊîçHÉù?wÙXã΀ºÙMµÓ!>J´ΓJ,)>ðê`–b)À…`Ü)#¹WiÃn¶·"Oµ”‹Ú>+?U«ÄUžUËʆvÖ\=)³ØER`Å˺æ@sÜ¿h¶†ó….Å‹²´ÙÄðjaÂÔ÷ª¾ýÛ³"t5D¶l1ÕòpöÔT£nƒÝæ¯B6Q——8K}§JÑx … í¦dòNF-;bÄð„òZ¶Û#¡Í #èC+Ìs'žë/Ú¶‚lJ9;`_†2ÌU8ÑÛ–·üµˆäÏ f&ôn#^•˜ì—æuçÈŸ×wdð"-¿ ¥ÝL‹¿š|RLĤ„áŒÕ"„væ:š ÔB„¾Õ‡vó->Og$ŠÝ¾H”çÑ´žïVH.¼Ø©!àªÏ@½M!Ò‡¹b Løè¿ý × $º‡†¦~Žþ×SëéÊâ?’qüUg–v0¤Sm×”…?¹{>”®Ï|ü¢è× ~tÍðG×À¾õ²*ø8å8ÿ{Ôt þÔtŒH¯©¬ÇÊ«žg—è€Àö»¬°anŠæg‡G‡f3›‰%AKc-”•èzòsÄZ¥ó,ç‰U- N†˜Š7W›r-˜µíìØ<ò˜NR“œõDØì†$V9=“‘ E<¯ã°vY» ;ÜΦ˜¡tÜav`©ªg_» aÌ Òq2Lq  üKúM›ýŽS0‚i²vtî,¡<ßCØ5ß× FÐá cò±‰èmÍß¹ÃU¥¶áz»A§Û7Hü½a€jø¬¸Ç P,Œõb}\™Y;ôeM¶‡xrù¡ öS !¢ÍEÚkí¦‘ĬC™$}á™/¦D„Þvì¶ÝéfCmgÈ¢a›…Ë1+QL¦¨a¼šu¦T3\‘€Y™M\ãW„¡m@¯ÓÓ=¥Û%¡`ŒÙ¦BLèvå1—ô´ÌIÂF¼ó/åh*]7\âß»LQä¦!Å¥ŸSu?ÉÍÔÆâôéÿ"Š:IMFðz®´6º‰Z7šlÛ …¯­oã•Ì|Pça,†pU Ñˤ^Ü„’–ñÝ„Có‘!£ÓŠF*Äb<Ù£2O é¨&n-á} o Éïr[þN$KOKž©®¤ÑÂù£Ê~ÁÛÐ6§g·k`&ƒÎƒvFõÆ6ò5qšï¥zÃÖ¾#ò¾g?•b ÇÚ•;ƒex<„RÚÂÍò§5ÆDê(A€,ÒóLãU%ž )íI›mAD`à!m)4çÅ17ÇY®1¸.ã·°zÙ;‰nË<6害ޑ›ÆÓÒÇ+78ø,œí›"D5…)¡×eë³j>&h}Ezó…¿(‰T²òLi•—è®÷öü • Ìï„ù¥Å Ÿòh…,Í’’Ÿƒ2}ЧˆÎ—MŸBlÀQb™ù#%äšÄzd·ÌWßÔ5ÎÓëÀ5;˜Yýý¢ö:¬0^dªLÃ~íOžû*à‡Ðw2õdh§¥í¤¸<µ[c¥yMöVF#þR´ú컾¶õs$óøê„{‰LòÇd°¿ÔV‘~‹¸=U0¯~Œ7Šä¨×¡–qOŒJkŽdK°ö®4‰ nãV ÷î’MPZn¹}uÐÙ¡#Ó\Æ›&™Î…mq½ô©¼5¤*V'9¦ß––ªšÈòßò±ë 5~iâ9xÊ…°7'ãþ`ÆÙgs0SÏ9×Êw`+¡à`2 D—”¢‰†íV7Pd¯áý}4ÞÐû •…Qû½ŸRm¼ydVíi L­ÿ„7Úzƒ3ýÎìµ?ºŒ:UæøÞ"ŠHì—CXÔ2ªwhgé0]9ÃÉ÷çÑËMôÅ®4¢7˜ë|Àq»D7n\â‹°pŒ®4åØƒ"Ø6ÝMÉæ©«X6¡¤ç€–éøzy{ÐÏ$RnAD}ÿüçÔízÎtË)=ZëhËÏôü`r‘üz™3’bc®7F')·D©UîÛ%ºÙVÙGË^©×½T|PóòíÎ…ܲN*>¾Zì{ÏaºÉÍñD·ôe4Òú¼UB\çù2z4•ѵñ#Ï ï¹Dã—%[Xatz¶\á24/s-ÿ~†€™õ<³úàx`‰€.:±¼s,n›šùo€ƒT§ºžŸíLAV·}¶%”9üò© –—OY1«òì–qFÃn¥ïñf#¨ÛÜ‘¸±[ÓÂùwXô;A£ÃQƒ%n+;7ä„ J ·ƒ¿Š ]P9 ¨xì¿–@4Í%%ö)Ÿwжki¿™—ü#>år0寋IÇð‹x'u“É£Íñ4jGòñÃZíð…¯Ã_Y+uÅtâ¡sï–ƒ æ°ÞààþU¶}+C+ëŠ,ªµš¾öØ»=·Û‹ørLqÄ!¯¦ÈÛyŽÍ~؆ޔœ ·óÄÑ(¾J‘ŽØñ'¤/Ú·gyWwÞq™¤mEÇ„s?A3Ÿ_ƒos(²CÖ ôeš5vf:¼‘"îQ1Âr=• ²®„H<“Îj|(•> -/F3™LGö›ÜYAÕ¥¿ÇùyÚz`@FB ÄnýÄw!j«`E¬ÌTºtÓü]4'¢'Ê>»möùÑÍ·ˆy+UžÎí[uÇ<ÄÂz>\vÓÍmr7˜ Æ|ýß^¾­¢Ui°þáM\³ÆÐ8ØšâúpŽõgœ^#sû”¢¦ðfÈc¸·_Œ÷ S.*Á¤ÚlŠçš”¹vñy ò çéMO‘¥X‹a::•»óÔ´%t ÚÌt)”/sìe<uñ‚f¹ßÕ#¦‘õÒ–µŸtFmþŠ:Ô2*×9€™Èñ<=ûä;»œ*¨ï,“Á©Õu‚4“$Õ7¹=»QË|,ª t—Æu/8žYCˆyZKXžC²Ø¢C}‘¸Th °žPŸ€Ó²KÆTÞ›——BÃÁä ãk1x²õÆ‹˜ZN`y~U´D€WCâê2ð¾®BZE"äëÒpàûÓyçI‘·AD$¿!R•¤{'ƒ,ºúkmTéÜP{ÙÅNÚXwÀx#8 ‘ÐÛ»µ\‘šSÕæŸF¸C¢p²ñgŠÕžÒÛO4üó„þä8Õêexå±Í¥«ÓÚKNsûQN—myñÁ‘¯-M„Hs#¸”X}wÛ’`ç$,èy#³GUÆiüå]WëIÇ0aÂhèrvFÍD›0OøÁ µÐ $g)•àHÞg«hÌXùÖܳèÇìníYóp¥œ¥ ²¼$¯)+QjÞ£C`:yÓ,ôjŒ9LúßtžB¶¥tP| cUå$s*™sìÂyæÜ 9Õž¯k6,‹LóŠ#·ÝCµ´û¿€ù5²tɧ4b9β’­Ãò^,]|h-}}?P\Ê',g:’¬ÆB¡¶^ZNû&ærc‚è]SnàL"E ]¹¥7ž"dåÁä^ËRÞ)tI(?8ƒ mV«4k±êv ð4š¥5i…X}(h©Ñïgm@¹Níuk.;O^ñªÐ¹[óU‰2 2 ZñÞ—ÇkèQhE›µo˱ñÔGáÀ¡›©¹ì*µ°ìEð:Ét/ðJÏÑ&UŽöuŸ¬ýµß®‘~ Ð^þÿó_; ^Åq`ýá„Ú$ rs¿üŸÂ›)ü9Ȥú{¯iÆo¤ÈîÔÙâèÍSWR°£Ggûö ²8vCâbØlucTSL vm“•}•Ô%*Ø t G'Ö˜ÛŽœÜý~Mþ)ÌÓùP¶ºõ¹P6þG½–ÇÑÉôT4ä@^Z 5bj¤¼¡\»)„¦¯Òj$&e‰Õ‘ð i5·i.ûõ%7€Üt*ÏT½S¥Xi[Ñr!mdŒ ÅÛä113O_îp]§µ:ÎÇÓÎï?UKë1ñ´ 0‡ – ÅåÚFWÑ5Ø üpƒ•*mL#|QkóTÏšÔUÉæ_K›5Ücn<ÿ®"aõÚ¹gaïÿô¯‘ÿ«Ö"ú}~³™j7‘.uгû¸ô®k•ÔlrJüü¢ÈPýMhxDó [{vöu@:;ïƒí‡Y´·-ØYyo¼µ!§q.Ló«ùüj`,iÑþÑŒ©œ!Oe?“2ßÃHt]ÔN¡óÐn‘kÀÝ×½Tù;î­´€ÒWÖ?6f0¬°®ü ¸ft=[€Áž Nwƒv—'INãµ»Ç0”´Â‚VNµ_Å"ëñüÿoçt ;É'LqiT<¤=OüðJBc6±‚bŠF0Ø<¾•Hcy´‰™|«(s¯˜ÈËÖGšb»Ž× $:SÁ¥¸›ýMØ{Î_šj×{@³ôŸS<Ì¥EŠ•7¢µDabB ¶@?á”ðÈñI•¶ ¸O“SìÖLÚC©A'JsnÈ¢iL˜z;—ø]‘jh4DÌ´$Ï•áK®eˆËQSîêk£ôßsK &-Êtám‹Y Q¤¿Áy ª*䌰WÞå‚'Mû EšûB‹î˜r£À®C;°^Pjvš²#"A­}Ö*чó„RŽÛ³ >£FÊ¡À¤Íý»ÑŽÛîÔñêïd`§ˆ¢Û›±¿(. ²Çs.‰Bó[Ö‚ ŸmGãœæ%Öê5Ä·S‚Ñ,dçsÁ…Na,õ5â}¹øXpÐázº‘㑎ú6ÁÀÙîÝ¿à<ú0¥·PG¶’'¯PÁVmûóµ}œ­'lcV^¹HÉx{÷-e7Ž>à§{Ã÷LL‚T²vÆ©Ï<¶ h-œ1e”sOlúrOiø’©ŽŒg›t¿˜m?€ Ñ3MJõ¢aâì×gšk4€óÕšâæº9ý›zÔ®ÙãmN:‰€\]ÁÏþ< ÷ïBÁ~žuWP0Ÿ‹ðYÜÂ:uJdæ-™±Œ&SÈ­€Y!­×3œóEm^•Ò:Z"Â(5Wògê$ÝA´k)ㆯ áT¡`„k¯Ù²ÏºrÛs­÷ç¥Ó[,”[>åÙËÌr“²ÞýÙH ƒŽO1¸µwSL†b H3ñtR°5ÚJÞ4žæyª‡!˜˜:‹Æý9cÚþ·UÙ§´îvµðeáJi¼OÅÜÔ‡ÏdÙñæù®Ã=ßîºóì[•ÉqEФ„-YïÄ•-‰Q¨1x±)@¸ü*cdU ‡Pìë“S]W9úBÈù^¼–Vä&°ÌÃÈl½êµw> žƒO-†‹0ïÌBÓý¿h€eà‚Ç]{¢õßw% £øˆ¸IFkzÍé«÷Z±tˆxú|-y",Œ~³-)DÉíòF ŠžºƒÑw”§j7sÌJ—ÀoQò®hïÏßXƒÊþ¨Å•œrˆlŒ4Ћá¶ŠÙý_ö“)‰ÝÙ;)çäœJºlû'è]ÝlAè ï50 –¦"'f‡<)-îÁ>­ä'*î#ª“ Fžoć𫊎uŸ^ÒëˆeŸ6|ÄÝÔ'ÕÁœOSY?ÿþóR_TÁ(âï)Åû£½ÍLyä¸þ¶_=»ŠÃ˜î{zÕ™Æxw-é¯å§Âò^2à‘­ÓU¤¤JUƒ¥v𩚥ԫAûÅ­·gãzDt ê4ié¯Q¤cD€/?˜£!'pâêjt7ìÙ ƒz&T¶: ži£¤9‚t±¦ ™cñ!ÅE§¾)-Í}__áÅ'?™Ä„Òw˜ÕìQÉÖÜíã†á纃¦¨˜(8W®°Ï‹¸’Ï– }qŠg˜Ë‚ŸN ³Â­ÞJ{Ù?SMËêU“²]n;pgø,M¾ŽÔ@?ÀUu ßD7!Z>sŸ/.g¿‰…nñi Öd“P%ƒÒb忊ՔRXȾLá§ G(8ôrOMŠaÒ†ˆ.tâ§™oRÊ&ÑW“¸Î„VcàKôNc©çï`N _¾§ Î¥ÒW²u†GÔIj‹*nígW = EØ>­l'_Ìvˆéø¹ÏHD Ì"?4 šÇ±)Î;ß™Ôxž5†h‰cºÞ¸Ÿ­à™ByµÅÓ‰ÿ­¸L‘Èè ‰k$²¸€ZO«Š ·î ¸o¿½uÿÈת¼©†2¹›…и^¬ï¬#בüÝôø­½èéÀùÈ2®ÞN6¦˜ÈœÿÿŠöŸ{R÷0"9I²²ªQE‰¤gŸš¸Ž7ÈnPíËáif¡ŸÏ¶ c!ÖC¹3C¦`)±ýâðG/¤ëÅ#Ü¥Yè´ÊZ²¸*WRƒòÿk x{Sã«@‡½_Ò†)žU\85dŒ@˜*;šîÂ÷Öö²N Æ¸ÏßQ¥ü~úå1s¿™4 ƒ¥×Æ-C?E”¦‘Æ“\å ˆÓ÷Œô–¬9{Ö8;§w%ûɨvãvî…ùvŒ¼"‡- ˲¶®3åÚ}­:vÅ(.¶íÓÔ…H«Rº æs3U¥žÀéãðÍoΆ¿rÒŸæiYG7Ý?¥²rR žætË ²/!zËî`D3@¶tq3:½®ºã¿:f/ÿòÔÔw§jABþÿ°¬Ô߃pzENk\£u ·h¹”Ö=³ÙTù™Þ–Ÿ¶ ʨ‘CjÔé4ØýZ%šªm_Ë|NI÷ø™Gè>`•isØsðw'qØÍåo; ³ŠÉþÚúGCÿ`s¥R"¸‹¥Ìyx­ø¼óÆc•%vùBü,4Å:¾ÖcEEª#{½§û±-9==Þ-A-ˆ¯O–sæ¬j¯Õ*½ÍÀ®„Ÿ«(JÑæ4¹ñ5vÅ®ýc#€Wm2˜2¤Åƒb±ÙMûu™v£’’Ú—O‰km66¸n7‡“gIî±ÀÿIélº¡p†œÒ< mÞÍ[åe Í:¼=)ìÁûp#@A®mCœ©©p!Ò㶇ćʡøÕš'¯Š‡£z!]Õ÷ƒOþÁv×4®÷R,e¢(Æ -ÐÿY2>b¢rƒ®Û°Ý{®4±ýJœýÎy…„±Uó|rûapÆèm$é*Åå~[°™°‚pçÒí8¼¨4/1]QC*þîŒbŠºfê«Oý ùØöeJkÉáÍ8­-ZiõÓ)+ý‘–íR½ÿˆ)‰q@¤¶ ³Z $4])6ðòä&®v½Œa˜æuöT™Â¡:£éõ4"ò•‹µþ_Wö†„³÷oøýk)}Š*]õëÉlê0¡„/3Êo8¼btk—Óòv#ìâ’H9•Áœ=v‹¯ö¤`ü‘,íxš(¨ÊÂNÓZÆ9£C„ùf0Ó8í„Ù Šô‰Œñd«Ý©&ºzØ÷€†ÂÔTq*ˆ쳥íK‘Y-=×Ùà|Yüøˆ¥"JÖêîÖ~”g‡uö§!èÙRŒ8V\Czô! ÿÜHb^9§2<ÊiBkrüäZJ{§âFXËzªÀ¯ó‰Íðòê.#ÉÌžAêí¯Šsö–¿SÊ?¦°ˆxÙ ˜Jî¨7Ðfš|¸èÝAìÅ X`ô!ÖûèŸK^Ñå/åFLàŸOå´ÏZSw¯Q—¯‚¨ëÑ^!”!QïÉœhyý$“<(Öƒg’gŒw—¸%QC¤ࢳò‰#%f‡í5 Å¡¢L£;VSVô;óHœi;Ýe„Ný÷c ÂS¸)C溘BõÞ§§½.Ê›íê2Ê„¨r–P.1ˆ#w°_·ÆáÓ¤‡Õ…Èð§c†BÜ É èéþ§ˆ°¶à‰c´Ë¹Î}(7 " U&'¨Suc¸¹ùµÊetNþ¶O1eš÷ÓáÍ* ßEÄ¡êyªr\ÏJwTÃýº“1:7pòy`õÂÕð‚ƒBYXŒºÙ©ÄF¨.çIaÆ&ðxcÏÚP7êZùWÃcYNÖ´Í-üÈ'Ì‹ÉRšÑÕdɼQàŸ:ª£Â€Ü‹K~\Ö‹/i¯ÃD¢)ªÇ‰‰?á½Kòe E¢=^šCü(‘€½d¬vê37h(勹öyK°ÓÙi?<ðiªÓ=b–©v]Š#¢RS°éˆéF÷”R˜”¡ÒЈøZEOÌÒ·Ô ²ñ¨¡o¸^'27Gø6­Ó4õMézCw“z/æk’‡7Às®±¤ 3©Ç„æÌ?xÅ›P("´„¦1ߨæëĨúlQ®RKX«7v±B~IÍ †ôR„µPRñÜ(œxÊë:È}…¤VèB|îÔI}À)L.à©Æ_…Ë`—÷Ý©$ã 4Q“+&%‹©þ3CæíºÄªo˜óδ€Y »ÿx#Á¼Ïì(.hѱ1+«Ù€*Daª;ZõùÊwðÕ¸ª)Þ=S`‹ìvU’ûý‚Íos„¶†X(±§Y¼éê`j2³Ýs¡Ü_ò̯ëòó¸ùw•W ÆÓ>¥…*S^,-ý|ÑÚ!HS¿þ‡ê[£ÅÕ.J#Cõ "¬EZxæð$²PÌ—¿ZR Á5¹VÑØ<·?±Â€k… !`d~úV±qÖ=ˆ~¬/…ø¥h\ÝE ,B ™-…5¢3ìòö™( šƒYEmÕH”\“ߊ Q¢dIgóþ4‹r`£ahBܳTÚƒ?ÉZŠ3µ’Ž#-½…§\[ Ô̇€Ä€U‹J†qßÛ\ª–iêóðÿªÄž—$k[)å‘Ão­ögKäÿ¬æ¬B* Ú¡*;¥q<êøÏ´fæ.üZS­vjQÝü8•áM¿»pÏ™ŒÃ¹]‡e68‰¶Ú A(+§xŒ eÙ™XÖÎ30aÉìçb-†Vƒ/i*¼P¢5ó[…èù¡À–ï‹Îvc—R(æKã?r° £ï\Ò°£î¤× ÀדZ^ö{MFNŸ«ˆ¦CÆÌljŠé(á ãD•‡»@t­° ÷íËÈËÖhÔ• [’!Äël¸jûèÛö¹ÖZœ¡­Y¡,^†,¥™dV¦ë3fYHõ(¿îŒ4PD´a½/E;¿Ø†Z¤`€¤ŽtïÊ¢[õéÚч-®nn÷1wºâ0ŒZÇ 4>²“/^©æ¼Yi_ÒVh“ :èÂ4¡Êø/½À¼lñåO'Ïñ¡ÃŽÍh€œ„HYgÏÜ#J‡P—˜2|á·ˆøXGÄSÙÓAzi= s·øÀCÔÒ´ÕþS>”Î÷UÂá hCÝð0~sÖcõW& eæ¸išì=Ú÷n2 øD@‰ÑàñUÂ;‘2Â*`hÔwBzÑ>S'Ìs9R¡=ä×`–.òþŽ ë-”'Ò1lþ6ü™6e‡÷ÃȽ‘TBˆ …Ï4ïÑS÷ôSIÕ.˜ÌhŸÎ7¢!Ç‘c€”¿¬S¤—0ô”¡l§T¾£òÂO¨¤­Ô¬QÀv¢—ÉâbùUÙ!KbîèÌn«ß¦¹+1ÿ5—Qû¶"[V;®˜)þ‚Üã²xï`$)<Wœ1ÖŠ´#€.×IÚ´bÓa8!\M&M:òHHêqÑ%`!âðZMÓ²ññ3vùòËÊÔ”íËÛ®)«lRÎþ<´‘^VðH‘H»dš±†Ãu…àM\M­øu ›êϬžáIó×P2䩱|´z¡ýu‡.ú?J)Qøω(7êÇ;‘Ô–Ow°ŒžÐŽJ*Îò¡ûéb+¢ÙËãm)ÙcbzäÉ´ØR"ú¬óüØ(žžct©ñ¯ò$æÒÅ!§ß'§A&£ß&ò£™BXƒ.¡ƒªG”fçkOm0Bõ&ÿá!e¤ÂþJæûà3Ê8(Š)uÆÑY]Ä"?µ6J!”ò¼*ö©%dÎW\CÝ­ºzE½:÷®Ih ߀-m}ð13$áÓ‚¶û!sGø0ѳ]øI‘ûN3]D,]ø†g–Ì»~lñª—©f³?os–dw3êB!;™ §EQ1v‘|¡gú¾AG Ïx >‰,m¤Õí¸²á­•/Ïõ•ä®;½£G_˜_ë&H““ÞÆ)`xvPËá?ˆðjö¶4àŠóØ[da˜7‹Ù|ƒª”5º\Jqs[KŸ† sR'Å“>ìÄš†%¡°½¾ø#6<áVš¢—Œæñy–}`nù•¯Ý%ÃYUHç.ž! ˆ›þOè gëj—×ó ìÜp#É4>[ÃàØE–¤–¤ªóh‘Š!4D 8fNÀùÈ—Xvo‚NpH*B ìwÈÚíue wèçºT¬ôOp¦=üèR%ŒZРޕJ&ó`Dtª&{v¨3¤¸Ä7"ìÞ㦆aËÐ –âO6ÁÅùN4næOþ¬‚íøï58s²!¸%? 8ôç–ÇâPÝ1v¿ëÛÇ^Ú¯U©Î‚_ÛJU9lí4?:í˜ridn#])VÂá*‡Xäæ«àæó¹¥oöë4±­ã\$Æà bVTA~ê݈Tn~«„R¦^»(ðxØì$ÐJüa«åµ™ý3 Ç…kô³u Êš{Cgß´±Š”jÓ”XMp/<^ÃոϛzGæ‘§zf1ÂÑ§Š‰·ùKî7ˆï®¶Íß}ÝÁê¡Xšvó™^€Aùˆžë0Ñõ…æ”d(JÌò”lüíPY£=„Ü?ƒn«J5q¥•—z6§v7èÀÒY#‰k;Yüâ3ûÞôpMÒ c#·ÛÎwúŸúÆõ.è­Òà‰O5ª$*êj-,ó0_ëÉ ÝÏ­~$–ôb¿b0‰¼î«s8(Ü^¹ÝHHŸgÛrÀjâ&3â}ÊêìÃäØ*‡Üî'®J‚ÅÔtÜ’A«¾é"SC}G®Í§Ä#­«1b­¡5iL†"ãËqž7E>{ jPA²αì\þ³…¿`³¨ï΃nrÅ€?âô™³¼é«jOóέÌ+ã„»Ó¶!¶eÂöh¢ˆf‹.øý•0Ü$³Øïë=òLî§^›W†@äÛòv¼œîç>‹Z°§„Bì€[Lbˆã;FK[¨OŽl6ìKŸ °j–ÇÁ;:™>Ê(¾ˆ‡nåÄήDÊŽƒmè*Î#±xZHeµ²ÞØ÷¥N#CüÑ©-1R{¢N“`ògåH޶c†˜½_â7›ú‚wÄZ~9"=Q€ ›ièf|mäºþC¿Š›—-É)dÁ€¡aOçpvh§C0sFf§¼É mg®¦dQR˜õ¯w‰ßõ½ý1ôŒã«£Æö<‚ b䤹X’}èå-êJ« ùR¯EÉ™p'¶'¬«”­Éó0ÉaÒ¤ðqY<\8E¹íüÿ–Cs5ÃOFʈ¼½“d:=ÇÕ¡mÝLŸéƒ)jøm5e·ÃàÐÚÙúÂH¾¬²Þ]å³2ðÝ­—8µm D ɳ‹rãû°ù±=À¼ã¿Æ€øpêèeæŠé X©!ôû´ò‹ä `QZà10’âBÇ2L€Ò•O¡í,O~ú}jöans)°ÚøùµÓ×KÞæâ2媒ÚÝÆ™÷VßÊ´j†n"TГ­ˆÝ›‡RÆÇØã–Õí@¦à³Ï&r@HrÚè·9 gEî¦å™N„4˜ØkúÕ¿áà×N‹°Šúú²§Ê‘EðšéŽÎ&¾úÍ©b!±T…Ã*¶Ü’ލV÷.˜­zKE³ö¢2µÔ?¶ü©¬‹Õ×G/ªÐáN¬<Ä)ŒØ£î£ØLØë) T 3ÖÆ®Rå¡ò u§OIB·!лoÂ+Œ•ž°‡Yü¯ßçÿ=a™}E¤œûyéŒ6Àäý«ž÷#Ox¢‚ÆY¦ˆ¸á+¼†7ÒÁÐÐ$gOZžÆ•X?Õ„í5ErnÏ{G½Í’¾!©†'‰©^Ï€Îg…UÎ>ÊW·Ç)ÞŸŽ›³¼¸qÇ:¼Ìf3nA ŽÞ²³B"šªí8Wl$À#ŠçŽê͇{ÇÀª‘Uò:K|ùöbìS[dpçX¼r· D`ªä#”ô\³™WŒé-íl 0ñT@- Ïå†GAwÑ¿8ÞNÈ+ëÚÇx«òkk7ì†äþð™îØÐÐÏ;1½ÝÊ}Ÿ5»b¹*¯<‚ã·uÜ!ªÄç™Ag ÷^Zäâj˜—ÉQˆ$á(Ù{ ª€a3Fj’Áoïdчn7ˆ]ŒÉMi«ô“õà ~Z øpéÒDß§Þ \ Ë÷å= %§öm¦¤hbØ|rÇ﻽‰ŒóUôâ·Ýì2ÚÄf{ɬùýÉ mu†˜½ákÐ×Òæ¤½ÍY‡1ù_”F2žÝ üC!ïHÌèi…U[åAe×Ô2ë áy,%2Û™˜'®ô‘\)iW^TûÉX^%½jjZòÕ–:Øo˜†ê"0rªIûDé÷VàWÙhYUxçƒÙ¢Òôî ,b<¯Œï\=çêíw/ä:.Á%”ÐòÍ´¦t¾¾O½?Vo¤5N7 >b¹H©Ž{› ÿwBµ46ÞfÊU ´}ò¶ý|š<’ +ëÇ5'Bž˜1ø–ålP“ôF„mJ¨oމ¸²x2ð4fP•KP'Ã=ë™ÁZàn]ñe³àK Ì)ò4 l¯¡ñ©æq³}v@b­IÁ¤ ¡˜§ÂCžáe@3ÔÓQ °j–öœYˆSoÉr$ra©¶rþ@õ6&㙑û.¤[.T Q’}BÁaK²¼elBöT€j³ú8¥Ã>"Ê™]’oúÈ@4æ3!)¶ÛY'¤ôk‚ØX„˜Álü‰ó• åC.ÞhüÁcW‡JïÊk:ÞÐw¬˜jLæ7韈þdL>Þ³QîPrtºÁvà´#ÅLµEY&/ßšÜ{V‰à€cOÐ~i:\ßÀÕÁá†SéÍäÇÏ–ogf!½ð'y%è‰oeW2 ~øD­eÛ;„álÜ噼3`ÝÞÙ:–« ãÜ,N ñðƒ1ýÜ{%O´Ð Ñ~wuSóÍ8üôß´Ô»dçÊÆŽºðã'¦Ñêªõû t¿íã¯à&àD;ÜISd¨$C6úA¾¼ÏÙý ¼ÕŽ6U®T _(ˆ¨Å«éP¶5³Žæwü­ŒµC4¹¿¾ÿÙªCOJfL®íõ¸o!ß eìK/ÿöõ.¦‘í?=á"P}Êñ\´iæ ê•Ý<Ã'ï´1áÝóÁˆi1À~b<¬4- ÅaglaO¾´ß¦8ŸwA,‚Ë'kÇoʬúæÅÈJ&$¿ý¡yõ' äuÇÎ&Ò\0—?z¢K\å·çÉÖØÁîÙÛñ‘Rßd k¦ +P[VãÂUw¼öW”ºmAëÛØœ^Š[¢41“§ }{käi>+atÄã6Z3!M|Ò¿uÀBEG+™ÆÌH&P28÷sš¢ð¹­‘·^Þ$MÆf¢”¾‚ò~ûjOû ß´¹ÍëÈ0[üEž)¯,È)ʵ;©±sÞýâ­z&‹äÑIoÞ3†’CJž‰Rg=ÀÄ0rí‹2Üc\<ŽŸ³'\»ÊuÂÑs’,„ÆKjóÃÛ—í§ëË^øJ™e“Z;`,m)ôñ °ËNÉ.úbè;0]þüÕþé#" = 0²å%7ˆå"j°†H?'"Cɇns½~Û6‡³Á÷no…P Þ«1ñi¬d¸c¬Ë1„EMÉIf§Úú¡èш ’QQ‡¿hy,@Px€øïó=6ƒHÄ·qÐsœàb‡fð]‹Œ´ÆÄѼžŽÆüCm:èÛËduBùe‚LÅ¿ÜÚ¶²¡í–mç&ÝÌqì®ô•YÜ•}€mtðŒêA¡Û°ƒ®,ÛAÃùÈâAg]NÔU*b‚_·tqñjw>ý~JàbÅžøëq ¦™|Ûjóë$²òŒ¬±v¥’7´¨”„;õ!ˆaÒ(ßÏ*rY ($ Üù8­ëVFáíªIC_>Y¤Ïxñyƒð¿ãí]OL¶Þ¹q£¤Ucz–Ð#]9%—þhs™­!¼ÔÊH—PEõ‚HÕdS¶Ò¤43~‹ï"Åô&]¾µ¬¯þîÞ | ©_Þ4#…»¿®1Æ»37´õŠ£ÄF„kð%>¶xš›¨ÜŠ^ÈBµÔ¸’QLß`u–] ÑCÛžoyÿ÷‰8‡ûϱ#”]²r*å¤T_³[#ðë "ù?|‹‹[¾Ryh³hqßÜý. ÎãYãñýÙl9eÜH©æH‡ÀJËôýXd‰pâ™Vá~+è›ÃÂÀ®äŸÉÍrÏ!R‹o ·ùkÒ„ÀÊs3­õ™ ÕÐBqæv}²o’MŸm8€U(dñí1é|Ùc½ºƒVæ|H‚l|cëZyÝ<3œ9%Q0ûµËR–,` Ö›˜‚ùe•åïÿ¨9½eL5n=N^¦±A'¡yƒ¨J«_L™ški—Gŷ㜩Ò1í;gªî¼ßké:&n죢Gw$–ß² vŒp"y».Y†'ºNèI_ÜV, ®ŒºÎ\B¨¢ö~RLý“D­  gCƒ ,HúLyåØ&ù/Í%³»X{Á¸.È0×iJ%Y])*[¶8¼µ@ÒðÇåQ“Q—QI€t…¸ýîÒAÈœXñ ©Ô†œ5Ú®Œ>ç—Új>ô6ÇΘk]ÚêþZ¨äÖ¼µt31@ä4ß:üÁ³ú¤;zÜ?Ž8LI7…d®“Œ·!hKž…â~í¯Òö`© bæ4tf†úŠ®ú§>¼ú¿,4ҾІ¹Å2…mGÿÌêâsÒš„ãåÕ(Ø~ȤôV(„uér—ÑÀl#r9}ÆûxzýØçoóOЙ æ2í‘;g.ª¾’…]k;vá³:¨\ § Y{ ™|µ®âë“´÷@p¨ld6šR‚4«ÿlíûµ¿\öž¨oµj™*èñz±LÞØ¤Džõ5q1e:ÄÄpÊg!&³M™B]I—A{@éEÍás Xš›DEÅ”dÖáBfI*µ'dÇI¸ì~©P’žqNöE÷³Õ#öãpÐ5hÕ£»²Ÿ©l÷4Ñ)=‹ß\ M@ƒ:NŽ‹CÎí¹P’Æ¢™Z8û¥Šx9øôôµž¹rs<{á:ÓŒ´H'ƒ ÖsVr>þª ¬ùmxÂepecã6›ÓZˆ ‘$ˆw­œÀ·Bü͈ ¼j”–à€‰Û ?šY;1þ:l%ú`½ÜOÐ ;[ -êôå P’tC§ÔBY%•ÎK6È+OӵܺœühMPŽ ÅTšÙ¹’V­LºÝ¼•±Ÿ×/‰ç+iD¤üª €ÉéÕƒ ‰öÕÔyšPÍ1™©·9± Ÿùˆ,"¶u È¥ŸUm•Q"k"|ÄNÊ5Åa£[9–£È#$ÏcsJ©c¶ NB³n6šõ¶MžKÎ?¤l$tÎ`)nlwU{u0[¼Ê«ü…—~ú9ä¦PpñúÀV{K¤µ…®4/ &¡ÇñÃá]¤Ro®wzßÖPÁl؆^ìý‘p[1%ºõX0•O3WÛ9!Âò@pÚÈ\Øó0mÓͶý±ŸÃœeíÈz¾RCñ˜Fß¡Wù‘Q‚(ƒ0x;I³¶§C“ý+.ok$4Ë45„ÁÚ›óÖ)yšýWáÚ¿MÅä +7)®V?ÿfO«Wøå€Âßl^PÀ<ó¯3xÉ õ„0 ›Ì‘×ÍÙðÌXI"9Cw^/Ÿ~™n8F~˜¢ÇÀþ{·ì„®GK_R¾6êÅoqõ—éHŸ-¢7­/^/gcg yVžFVÔÁ ý7oatIëèHF©.²äž‘mUxç ã Óøëj b…ã‡)%ý«G[ÉkæŠgËŸuíx½­ËW“üˆ‘z©ÕMÞ.µ’º<¾TõÑ`Ü-\­Wè¾[‹ý„Šõ3}jõU¿”ã)ëñòx1aµ©ê`MþeɹÀYêûóšâ•oš l=Þ=­‚ÚÄ/ºY®S ¤ªç»v€¹Kߘ-Æ v¥üvtM Ú(Íõûà8ÿfãgŽkQHŠHj° )³Y]OJ«ðŸá±<[Èl¨cc%Á E bÐ#ÅxÇ/;8Tlž_Úè\aÜPH³‘–¯¬;†~}uûĉ¹°m„º"6O{M S¿<2CØÐ9m”IÉÇ> ¬^µG°HôS~KÐFþ¹¾2}£<éëIu‹!4áÚÒ^qËY1h¾Ü«fzˆõ¡¦‰L¹£o¯qNKéIp”Ê€Üq”rà —0sŒjàQTÿ‰…Ðõ.fí|±÷F¬å¨ZyÀò8çзµvU­.ϲCDjéÓ¯ù½zßÔ^à‚;ž8§ez@ߟIc¼\ßH8„Ѭm×; Fëðó1ZF¼%¥wË]'¾ ˜R¨A™t|!4צˆBÿ‰{aá®#©4v±¾’; w"g$º²†Ëž ,×Dfî>)º{k>ÓáÕ4A$n’½’#õ`âÐÌ/²RäùìéH1ì­nƒµüþhØj(y5›³Ì{¤Ñ8nÕéÐ-Ãu³¾%Ä y4\¢_-˜68*áÎ{Â%ŸM¾Çì îD³[ŽeËôž0\Ú¿õ[èÇ<Íï°c2&2¼=‰¸Xm­'ïÒSh>Ê,{6íå»DtÒ¸“ú-dT˜&„$Cº‰þ‰àÔð¨“}|ÓGÛ]1b'à‘VW¤¶ü¤£Vضï¤Ö½+(ÓÉtžÚ8FeXµÙk²%–ârý ¸*²q‡YT|Uá »°)’ÙŠ<ÒíJ¯ð3;Ý,nTkXø´,w]ÍGÆ)`UÂøñ(ø“Œ½Ò¼xë&E/gT&< ÆAÎÖwÃZ xRÃóop‘&Ñ—Óµ‰Sh‘œ::9?9‰eÚ¹ÖÒ0,B¨´ð0fœÔÖ3 7—ÆYge2å¬ ql¸ÉºšIÛÚ31Åùõ~_;Vb>±3*Íû•Â+¤¬Œ-“gÀñY,œ9hŸ>Úâª^Túج¾Uô\¼:âÝó>¼Ùû2ÃGIï9ˆ½|¿‘—}…p‰>THØ=)e Z!Gǣ߀8v|¤%¼)¯ç~гuÚ’ÿ £ÞÒò©lGî„f 88ÌD¯õÞÌ/`LzJ…b³Íª[MÏ.?÷îZìRMGáfmò›Ö©ò£a;`9¾P¥wÆìç†Nn©¸WÈí(é{åL¦¡z0qAORêx;B¹qEI”Œ7+ˆl‡>»(+«´}øžú€c÷¨¨vÊÒ3㪸ÒW¨K¼uÔ0i­½F/æ[à´îñhöîLº,þÛ¯ÆôÎÌðG;Ì×_L¡­”¿>T²d}&7hÉNïb¬¤Ã/¹ðîò)Yb½„,TÄt ?äÂæ}ÀõG˜1d­ÔÍ;I hQLµàŽCAÚ­¢S @ ëlË(W¬  K{1Kp¹”0q]wâç x~…èʘ¯ÿ[À&5îx¶<%G«(|GWÐGÈ‚ ðÒ# €îêÙÿίú¡úÿd×µ%DéʤÎÉNS¦ƒ“»³èøyaÒÇW¨Ù€ L¼ˆŠýTž1·®0zݽ—ÈîÆÜúýí˜{þçkì!-$4™gîÃ1õab˜I ù@$YR(ŒŠj¼w\K}§©›ëjn¼K¥ÃäaÌX=ž¸lŽ¢m…€z†ÀùdþÎQq`„| <Üë0K•÷ …Ëèb?ÖãCO”BD‘ÈèŽ <*ĸ±5*îÛv¸°éè£è­@$e08Àðcv%`oÚKbßl:ÕäÃIÈEYш¥H´árQ+ôiðR—.¤æK #…›foICozg?ªïªI9œ0¤&ube(ôƒ»»8L —s -7HV(Æ}7°ùà¬éÆ D?Üœ>5šßÿÄ+Ö­, J×ÈÐ(|ëõ=ô'lç­‚$ATA°Œ,Ÿë±¾ tØfx YkÚ{6k|Ç@yª ÂL Z=@ôy,šÕ•{š@uäVo †´j’—…ή±à^ÌõwXb@ ¥vX_rÒÂ'ªØYvfSTи°ÜÑd£Jäø®‡åo÷íÅ…X"?÷oçÆHPNÁn3§KÒLÙ ¼ÔeìCêí)^‚LK»ðç6­us}-ˆ|°5œ7ìÝͽéžF¨Å)oÚ®áÄçƒÐM±(Ø«Àö`ˆxïÆ!8 Êh|E‚ŠÒ#X,ÁÍÌjJ¤\ zOX¹šïfçK~pÌÕbmcYIVÔÎ[è$à‘/ ];b…¾á¿èGiÍ õ¨‘Šrôêe)œ¯„½¨·ä“u‚­&07ûÓ€M'¬·ªòîì‹ Û£Gß¿(XìJ$ãmj\ Îr6ä z Ͷo¨ŒÎ 1¯ÏBAÙPµð!ª´nBsɱ•¬i[»TF_7Êî92\ØO%iÝÙß´=j¹°®=e!Ìs¥ <ÚìFŠž¹ óbÏÈÂX¿ôôSU‚Ë:By¤sZ-¨EÖĦSôòBçÞþG=o%á2£Ñâã¾|¢¿ò]¦ƒc;>,#.Î(ÇéŒ3Z‡àvP­r/SµSdkgO&ÉÉ‹ÍUòÎG/Ç]L{ËÐÕÑ£…Â{.E‚›ÅVR‡¢Ò¹¥&ª5-lµ´ZN—d‹=T2Û&MG˜¾ª:p ŽÖVö…!“2IÓ2Ýè‡áï’r?8Q{ô—õר?+–Ó‡q%ðvþú7iˆÅ&4H­;Sú[`a÷õ#‰+É5Nrާ;a1ŽmùnÑú—BÉÞ‘[•ëøå½„z‰ÙKP ç“ÉoÛ˜B¨á(Ð_’®JvçŠp…‚f3oŸÉ`ówÍ ™ªNÓ1­|ªba‹C²’Y—Pï™Ù)‚œn Qr×-áBG':x7}6V/ú DF û|ªU`ì9pÇþBºµá6ο¯ðMUðñßNü‚ó Npº¸êŠ×ä»×py аœ ·‡Ê-½ßQw hCýMëÕw3u×Ó»yðÎ9ß÷Ä|Ôhrm¤zÂ5µë-u˜jv¹[áûò[k ÷½@¦™~}–ùUÝ]ÀIžýUû¦õ€åÉfWqƒœ•nÚjŠ].2 ˜N Q(Îi"àÊtµŠ^«ª?§\Ž?5·¼ 6 DÈëFÍa:¼\0ާkmÊaC SP5š¿ð8: ÉÏÜy+ÓYJy}¢>"·`ª°É¶w›6»7@Ü_ׇ««ñ[³yX}E+SÃh`–›Ìgò!±#¦½­•àFš¨Äü¿;¼?¤Õðÿ FTíTe#]§·àQµëëWtЉõ{kµ÷}”Žòb§ˆmô×”EÖY¿Æ— ¾U÷®cäÿS©>ÑMqÄýïXÎë¦)ÿØ–~³Ö‰mVóU¼Å¶ätëÖøOs\»)œèíT@)§Ùqá(÷K¢ z#žºu‡gåË7Í¿^8ð`C±™.ƒ†doÓìÆë¿6ô«7a)Ô¹œ¸E%žu2FÓߊùQøõÐâ`äªb‹=ß¡X> $„ú²8äÿ¸Èc³‹ßr²…™¤ä`Dœ¶²1…íÉ™cZ…-¿hå½ËZ‘*AœQ ¤{^ÒöGuº-5X½4ìÅ® —)àý¦T§|ªRA£¦¤þ1 [< C±¯dãH§‡œÚdT!PñƒÞìf&sNj•T>ðÏ0l)â8ôáO¸>a º%ž™;Îá¢î<´(ê>Tø&2 Ìf(Êïä®vOPëÙwÐ y·P$9ÑfêÞóÖllYé{Ö`šŽP·ÕýœEåoCih·»‹g}ݘ/=£ÈTþX¿±A~±ÀÇf̓&ËtE4ÃÖ;À6à ÃQŸˆ¥»ïÎcN}ñë9^åF6 ÇÔ(Eðáª#§‘Q}à »/%x/¶‡cg¤ÔU=.UÏæÝ%g—>÷±Új§|êMÆUr1N’®vx’~, –Ò@j«u¾º|‚j hc…õÆí ȉü#BGf°+9Mاÿ/zë‚!Gw–vgBUÞ*yÎN.Žá·2tœC¨JWP?(É£çÃãk„3Ñ™è†Z›ÑsÚ0»ÿ)ÖJvá+Q' âê1m«X†N„¡ZŽ[nö”Ù“xwŽÓ]¹©:j«…‚¶IA[Û7׎:oº»ÐN6ÛT×u5ñ{éÎËKpî=¶BVìœßxQkBq¡bO{á‘ t|؋廹ûR¦Ãý™Æ)å³lªØE¢±:Å ¬bt¯còE'MxàUóNÅ¥ÓC°Åzã쨉áhF-ð‹ 5ic™@›þS'/\Ž©ÔKi ‰Tºàú†§ßª=ŒÐÌåÖ"º¯Óôt…¯¥+xõ§ßlŸ^,Lb íEB¸`›á¤:Žžp5bP]šyxù‚ÀBZ¨Nɽ±Efx'ÒhÑ…KLMÐò­f´Fµ‰#¤CmäðßD=S1hTêU€§Ìÿ“8 çðv_0˜[ Áû%{Wìx«dW—^UfßZ³LÙ,õ&6æ x÷q4H\ÝE¯.ÉÂE­£¨¿dA@Œ§gÜDpß4"¯/bIUVê&ýÊŸ€ŸónWCf…ÆíàÕÄ0®¿sØVüJõîØ]b'i%íòTp)‡»£?– :¶K¸žPã­@()0­tAåí?srÖ˜IJæxBQåéyˆ_H `Ú. B3h ¬ý –cêѰ>© ÅzwªÏî™&?ö\'Ò‚‡ÿxñ}4ùÚÙþkZq¼[icÍ܉éZ‹K÷í…"íÞ8ÍÊÕñ)àÃÐH7tíÞB(àDµ6¬…®=K~‹&ß­ËSÎê€=¦.!¾`}Z²94Y'<ÖÚÕÅf]P„ãßÀ2˰ÿ9_½æž7UDg@ަBÖ° W4òaRNM¡5iÕ•7ÏzÒ7Œs¦3G"Xp~Î66‹]À\ag™•Du #en¶v¬Ñu½Öå ¸»ct˜ÂÐgºËδAˆnP²ÚWãH€®½y[ñ÷`†ø9ֹƻ8 ø9äÌz~çíGÿšõ{ÄÖüzÑ*µÝÀ±ErÇ«hî_¢½-èQ~:F||Ð ¶¼•ÊöÞ ¡õŒ¥‘ùÓ,5Ø)Xí¸o8ó³NO«ø™àyv{c÷›[’µL|¹ñÌâzŸé÷†˜ž.Ìn.éÜ3–‰]¨¹Kó…©³GV„Ÿ…ÑW G˜µ{À!%AjÞ)nîj¸°JCA !8IK»žSú"ü`9ÛØÜ<_n^µY.¦€ùæõÁ~ õ@ŒsÍðw È’®vû†ykÔ,›½pýKQßj«Ç5¹”¡ÝµÓ‚¥=I´`ðßéäÐWÇŠdã ½ù4«šÿ‘‹>÷ dsà:Û¹Mvw‰CÝJHþ†¥ ¢Y%A?$N'ž'•ü”άy§”©¿”dkêÄ8ÿJáQ2e²ÙÍh;þŸ™\œbïÓ™_AÙáÝ‚`pÏŒ9ªOµ%çNbf»oª‚ÅŒöÛyQÆc±Y–ióÊçð¼»îÞW ²ušÛ}Yº£¦ß$<ª¼#æÇ„HÛÍ•¡L̛ܥˆ^]Ÿ—·UjÈ^¤èð˜À6W9áø!¢·ñ¨$Õlô…éâ¿,œ_1rû5YÜ.¬]7¡„¿—s[­éÏô3:LNØi3K fªÄWø$ÀkQ©ƒ´m RðYèI`‡u À鮋3C{o&l+#‚Ò5rÒüˆÄ'„áÐr·Z2vñ³üª‡{4ÙóÕi³Õ~Ëþ¡h7ÍëVçY_äó`Œ”——ý‹Z®¶ÂùÐè ŒHuŽH6‡ÍK$®ØaÑšs£$Ç™€å”;Y·=A $Êô§{°¶ê`}³—qW7$eºÃ…®ÄÏÑ*‘Έtòf En´©ÐB~|º»–‚ðô¸¬ˆC&VÈr¯äº÷d`ù¼ñ[¾4’¦rÆ×UQц )ô¸šä8P9IíjèúíïÊ?ã^W÷tËFµjA›íÌdÖå9Íz¼Ið«87þ¶jôžÆó—Ï9GuŠºVUA­#6Ozd˜Ž|JŸÈ*=êÇË#?"Æ`è%h¥S>Œ„{ÆßVÖF¼ˆÐ׆´†.Òk^Œ%7߃ïažÌ.©>ÓËÒ™éÒⶇ»®›ïs†?t`iåÆƒRqmÁd§ÐÇr{=†ö/á*Ø ãØv+žìx´¬¿šÒg|JÒ¯¼º^ye&PÇ5½µÂ÷f8…!ùà†t_d3{„ßö£î®/¤AU¿Spö¢Þ2}¹¯åë˜NefIê×?Ù9PÍîòkô«¼Of%‚’ÌÌg@Z—ÿ‡v¦<³|½µ  ¤¡ ¯ÀÒOÝõñÃ`ADwâœFßgcÓ’–¼–¤â<+é§;PÐæÙå~µi°²/= 5MF4]=ÆÀqÇ¥Ãõ~ÏÈ&ž ¡ü¨™—–Ÿ¯~}¨€¤é¾s­kã+NÖ^œ]ÏÊ®—J;%×°l Af4`„„|ÀFU°Œ+ŠXl¼ƒ ŒD5?žG†g8L4:ì.—Cñ’Ý^ª©¨yo GwíesçÃ-Ñ™±L«á•Õx¢‰ Ðäª)³Åy/¦¢¸hÞºœÉVÑ_ÊÙàg86q‚JäÔóY ,¸÷´§]S‘S¡eÊ22c¡¾±êŽœÖÄF«Ð¯•IFUš Ïþm²\Ó½ÎÌm’MJrS [VU‚šªÓW¹gª*wÏ·âMrñ$²”­[Oñ´¼ßàWO*`¾¥kA cW^ûž³ Þ}&Í]F»ÀÐb*(V8'…£\£žïêvÊ3_4‡8¬üçªOWhçìÞ-‡\R.ñ×~MƒÀ ÊÑ8‹5(ª×£ÁÀ/ê²™gC ²~j»sq q>!‰ù‰En •,ÿUº%Ò»ñ$ ÖÜ”@<£Æ¬ì9‚¨%G§÷dÍðèÇÉFÃÙ»üƒHß,®m`­ÆÑ!èRSzc~ˆÙ)ô|:÷ð7f|zEŸØ¿0r8­¦ÜMìR(5˜Zø””=xÉ”PÄT3ÖïŠÖé©¢ò=D¼_¶½PÕ㩈FæÛùÃ܇0ºä©‰*ÙnÇ´ÃÅ8‚SEŒ‹ñjÞ󽚚ƒkFcàd|Êjß΃5¦d •_<`øÈ!¯¹P ´½•H$¼ÄÎI³`0x¢âÂ9Ö.4I~™O^ˆ FbP¢;ÇΊ•UcCQξñBÊkëVÌåá0ý…݉B½u·HaMtŒVÕ>mŸêäTŠ©¤“xšq9IÔPa×y¬˜_ìEðõËFC¤O  \MÜžî;šÖœ‘ewq^»Ü)º"Â]­7¾êåŽHQÇTŸ:°ËáÂZ¦Q§{s=«àƒF( jÎÙµQQá~' eÂÀ¿Ù…EGÁßp\×_x ««ÂÿòR\½ùG|`44™è`‚†®Ï=îU›Ü$îV#´¬W›—áÏuXð lpï?æ0N0õ–µÐk]#ñB¸kÆs) ©‰™3ùêš·R’‚5íw„‹ÏüJ%À‚£s)îF¼*Ð çà3 /0NmÂTW •«†™4p@?‰•.K")è‘z‹wMæ7ÞCiŽÛ×>³“ .ŒØt¯шXeƨi9œ˜:c^ÐÁ¿yy–˜AA2,pÍ06f!(ç7£ä~«E±”õr÷%Ÿj ö|×™ÙðÍßÍ|ÔÞýuêwu¹œÉ¥2¢Ò]¼½˜CTò¡ÒÝ¥ ï3H»ö—{"kN¤ý]?HŒ¨Þ›mÌõY5±"01Íü;þû‡rSʾˆßׄ5–tzÊQ²À\U5î¡Á!G,¸G6‹3ÿ‰g Xpe,´jUÇ”µvlö¸…L™‰BçóÔUèÓøsØ—A¾y1r‹eë&çœ ¿mHŽ~V©QDMe"}ÑËÆ—NSª_dµµA“.CÞÜœ¸ ¤-_†%h—í&#Í@"ŸÉõl†tUÕ$ùôoÕ&±“WìÁ¤R㬗À'T{Ë*09f×òŒØ B,˜X¼vŒÌÇ@A´Ëõϯ?]¤¯‡#®åm)\›…rã-VU4„/]#C†ÌÝMâ ,5;ANìÿøòZ¤X)ßʧ*ª£¼JïôOé¬áõëµñ²~â]Òð‡~/³oeÎUgÀ¨gE^W À¬Q¬¸à F¦³ &ò+϶+3Ŷ N S¼€2?P’þ"ίÝ8s9 8€ ¸Äý ÀÔ{îï€=4÷šÊ·ŽG­°­OusC48Úˆa&(ó}ÊþŸZnÛ·½VþòßZ"ÛŸ¦¿ü1•ÙV²‚ý“þ08€ÊSÂ{|°eyãÀÍË®€§{ÖÐÖ«˜:(^!÷þ‰’ùúBÂÑ€…úwY“1©HèìêUÓc…ÃÛwþV@ÝåGò_ª]$Õcga‘ÃÞ~ÍcnGuŸ¸mÏôy±àå†m‰+§ @iñ8“±Ã–î¶ò^2}I­ØÞÏ¢ë嫪ÅÏéÁÄhÔ4ᆦoDËŸ‡†bêÕ°¤ÚBÛ=ó!ô2ä½>Wœç£!•‚ˆh;eZ¨Œ ‘º°Šg¼$­}ýEIóÒiÒßÙIÁ®"äÇÍ›I*À¤³¾&…Wõã”câEþaˆ| µzrzçb7*|Ó{˜úPØhý}ÇÔùTú‰'÷7ðe¹óYtnîñøÛlÆ04I·:ÔÞ¦v@uTmÌX…ÑÞ=!5j•D«m™’HÑ/j¥%w»šqGù±'ƒ ¹ëhC’j¥ºEõF³™tlÔ~>lf(ñ»f¹è ÀdÄÆÔõÚ{[¬Ôº,Ð…+Auµ…õïàŸ×N@àHlrrØ!Û+}fGY€åØÈÇ“K˜» nSÀÎ\ Ý*¤`| *¬Ï;~Sëåg†c÷à9ÞjnÙ7¿×ë(¥8Ô¸¾JÞ`Ëï^9ž…‘F§'«yþ¾?,@l!× …~‘?ÿ‹€/¹h…m“èu^¦«3£ÂÒ+qG\£ƒ-V ó;"ºr³ßÊë(ftÔgŨT–Ag‡^f¶‘¶á¨¾Ë¹G0øäÊ:dëTtHÌ"-ý©ÍGcœž>a"ÒN›— )—ŽN½ê3›Š…M×÷p¨W Áy6ÁIbÓ¼€;n7Ëä2ȵͰ¾‚Ϊ(/Z6 *!Ä â_6Ã+ æ¡[]}eÅíl¸å°Œáih”x‹öNàzÿèìó’IÀæ! ÈdeœxC7‡^ƒ>°'„p‘oÿ™"æ9Œ$BôóN<>wT6¾H\L›W™a¬p̼ƒF¼"RGž*tQžï‡Bæ÷a{±©š«]ȬŠÝ¥áï¡>ÜîÕ_õPâÝ:Qͦ2c–ªâ]=è³-ô0Ÿi*få—kXgWæb" È_9IJŒ¹>ÄŠðK8jQmð³6j–¿°5[‰ —NÉÛ¼ÏHyy§]²/Êãà$ã{s?Ê-ªˆäh~Éî\°y2^+ç<‰|\²ÓFÑ%nžª»¤y(tﺸÂdŒ‘àÀÎ:ŒáÅ¥¾–áüûÕþo-Ï÷ɃüqÿÚ"/7°.¶u8„&©¿ØòƲ oïDgùOÑŠ£dKØþ#¸5’ãec’ê%p5›`ª[XÙÎ B‡xV òê,‘ ØTãùí§W, ‚hþ™CMþÖº‡BBÇèÊlÄuLpð4ýTW½’}û_Ñß³ã§[P…Nä9x¾á¥×'±L$‰òrÕxȃ+ÝbinÐiÿ-EÝ«–, l ÕÅÅ2ùh5²í3+˜y`Í­JwªõµårùÃ;¦¼à5²ÜR Ÿ Í–RÌ"§e³W"ÛŠÊíïMCùêDuy´]žjr3X”–»1!EèTôýÞ1e¯}Š>j¡iRæ”V¥JÃòF^ ž XzÚôsŠ.©2•ϸӠKO«Cg³zÙ¤•+j{¥ Ô‘OGÀþæßºEnÊ\D‹¼Ô?oZPŒDbI—0T6rÖ +Õ*<ÍÅ“Ø`'°šµRèm SbÁ|AsJ®±L¤¤¾¶æÐ7ϳ·¬Ò$!/!µ{‰¸CCÐ>¹eí Î*—ˆMÒhÁhê†aéV£«„Ù–ÙRgñòÁ•à‘÷<ñô Ã¼4í3ƾRøpV¾>\þ}¶\¤¤§ðg6×v/Ò _1Þ@‡ê‚ðpP€¶JEOŸ5—[Vý°¿·öÑ«.s’¨Úôê£Í÷%{ÇÛpÀy˜ÈTT«3‘JÐWí´¬Í׸"‘¶§4âÆ˜<;(,%ôSÁbÌÞSXLbêQÌ7m@}©W)¼î¨ =¦“°V,þêtIo %øñ@ fÝ0^lDÔe±ÎW³IžAã‡ÿÇáx<(¯™Ww\:–X•Q6·`G±Ã€µË&Rmu+ì΂Ëæ˜ÃIòÒIìd4U2 G@J¦·Ìûãá¿RI+íQ±cÕÎØmé,"sj®ßu2gãzø€“é ªO×ìö|åKÇÕpibMôš¥/ ¸px¬·\ñ¬Ê 9¦ó¸‰…[gE®¹eª¤w®Î÷9ÿ„AgXˆº¢Ÿf*{Î>"šz¶Îa:k5;M \[RJ\7ü¶Ø¿ Î¬ª^² —4°›qsD6þuouѨBÖ‡ð‘+´&Bâ8›¶™âv¨PE<ñ~(7inšËHæù _×&´Õ3 `·f/=e÷¡áÚ.}|ñ8Yl\Ù~p¨¾•ùýðmtÍuAÜC©ë_³ ÄôµŸfwŸ"‚ÑÑïì~4Ž–¥?¢(æTzØåéÅ2þZ±CÛ0«»ð}ÿ9‰& »×ƒø·àò”Q! «žœ£ºi`µ{áÀ(M¤ç}ØøÿßKƒõìFùïnÏÝ,ÂIºŸ·W]4‘!þk›€¥8¨ìy™ˆÐáTŠ„eO‘ ’+ШùŒ˜— ûÿ*J Ç›-Pë0Cuº#50u„„¾®ìCóÌÛZõ¹g0D˜¤ÙˆÜò€‡‹Ïû¨L»/ùúÏ2ØÇ„«?R¾NË \×qpMi^®WæfîïcWóÄþÏ]òÑå !;ê…#n®¶(å’xŽUí×/êc¤Ç½›4Y;&lnÈœµu/ñ›*›Ù’Hýo·< ²—;xIÜWÙ×Hp—§Ú¶ÓÀ â'³¡-Â8‚¨Ç>Žóƒ§×vrŸò0jŽ„ñÔ>„ƾDߣùC.>ò–s—*F  º‹UØU}1Çü=è `èYäþ¶U¿À$gFº0šÔ»OJU~^P½ÔâÃîm´qëm:oUÙÃt¼!!úqmŸ~W^ð²^ŽRuV$æ÷ó¼Ò ê8V4ËÚYnÚ¯"æb ]›%š2†½ž‡;™Ò`ñóòPÅ™íèD–åeñVZSÑÐŒi«œJÅFK»¯§Tí»ÅE©Ÿ€Èf›ä‘˜.2¥ÊÏÿžH”qãNãÀ;3'V÷ÜáÝñŸ¿Gx´R{¿¸@Xr†÷ÝX0?™£ÚјNFJºÕ@¥q7Æ{¾êú߇ù‰«þ/ª \°ú“œ,ÛfÄÐ?³q j—ÛlMéó òæãêRÿfg{XœŽ%­p€DAÚ ž%ˆàfqÐhðžìûS¥Hˆ…–èØE¹£ÃUܲêþÑ¥#2bc_$jŽ´KB¤zÊ@†«á] ëØæ†¶òÀÐ_ÔJqÞ®xÑ*žï1ì&ëmõ:Ì·ÂÆâJaàÖ¿·üüL-쬀*á¿~²XÙOYJ8¾C´*Í$rm íÀøÚsr¦`V— å’Ãz¨/s¿/–_Së,)C¼‹ahp7ȦVd¢R2ÚͨúxC|Y±%õ³€ÓT~ýÐê'~ñD7Ðõ÷9vu·ÌtT,`}Å,ð~i~²_gk™¿ùJ¡ÖÞœ_@…J슊µMÝ Ë(3ØF¯",–zø_âÐéá–Ó‚Éøì#ÀÔ ˜Öí—¯ ÓäÑ'F`Ü|”ê6;L¦Ú»t³*ÒÛ+°ËÌ:êâ/cà?×Q´‚K5¹³â'àiQgœìà™}m«lMvßÃÖºk:7Ãh…´‘š÷›×PS„JC]"xßÅK;=üëeŸ› wåD³ÛW_Šé…Ñ &X¦ s+-ŠÁßϤÞD9t"ÒIÁ8YÐ ß ž¹òtŸÌ;®’ÿ*ã}riÂ`CgÝÁù´Ë‘'‡U‰<îL1Ìùa@Á«¼ cVpÄJÑÒ5.öè=RŽ" a™º)fÿ»Â7ÃqÙyÌèyô½ó‚„yeˆóèUÎê­;1–(ÃdLçᆬ +ÿPˆ•#™“ãó¢óϸ—ÅÔ5¤Í1úg-½ w qOÜø„uв’dŸÌöe®Èê•n(\çYHÇÖÈ+WÔÆ"ÿ” ˜®Ðá*‘Z Kg‹©þäËà©·ý ohI9 ã\ ™+(µE¸Dm`\Š©P†±,ÂDg‘Ûp؉·cŸv€_7Ь‘»®Æ,T1æ¤û‚¡´Øì.?6Cu£¨‘Ö±<©YÎÎm¶¾ÌbýMVÖ(ßç$w[\I.ˆ¢ù ©4WSu Jo誱e[ý^Nyfz?†dAŽã®Jåw¹‘Áꋜå©ÌKÊÝöG<äQ”¼q>¸!Æ»îPÛË;Ž ½Eû4O‡nᜠGâµ\bK$ñ>ù!§”sJO+OqsKœ/ú¸=”9óÎôr=(Þè,ä. ÝSÑ»¼²ÀjŽÐ:˜Ê3§¬ üÿŠà´¯¸M ÁrTïãlouIZï<«åü±>8´€ô ½CÐÆ^PYÒŽDŸOÖm¥›Ñ(«¼RœÊ°‰=¼yüZ\9«¤Þ,n³tÚXòÃÀÞ×>->b•Ç$Awœ×šú´F—•«ÖÅYøò…êMJµXg¾J6Âà·3ªRÍ÷áöcÏcÆ_>ŒÔphÑ—N¦1ZiïY%Wn·)G ]ÇÏ¿sj©¾ù¾¡‘7ð‰§v8i¹v­øùÑEÇU¥Vħªu()nòæ£,$M=©IQ&‘z÷£»¹èýQ Ëü*ÕÄ9ª;=R«2êô{½êX·/ÙàiAv¿‡i(oö¯Ú&Öâài£^çŽ0·"ÂP9ÍUŸšžÒ^n¡Œ ö*¿L¦™ô27/gR±ÍMü”Ïc¸Ó8Ÿó~~7C=Hÿe³#‡cÔVž–ìƒkD£y±kØ«V¼.ÔXYáÏ€ÂoúNu ûÝ2&óu¥¬æe|ãÜкJ°†Ï¸jè.˜¬¤@z-_º{‚#aàÓºà‰•?xwBžŠ Š cñÙÑÆPý g?cÅAÃú·o’4Žé­¼ÑŒ"p0*Q“‘*œÇRhÍaæOλ&)u/lHªê?¾V,.ƽ+‘ Ü©J,šZsù‘j1ag¤ò5ªìWÍ:^[2Öanä\bÚ i>±./+¡ŸR%{V”±«(–3¾ÞãæÔSÛïz]b@6!X|`cåŠÃ¶œè.ôPÓx@Ó0òa;2ˆ7‡ª9i\nß<_ ÁÅ‹d<¶Äƒ2'j<¹F_–܉̺«W¨šÌмë;åu‚¥ ̹+()Yã.öÞfí@,À‚ôÛ§ÁÅšö/rd@]ôi+îSŠŒ7/ŸDH5H½n˜0©[?á}êÉôWxeص„¸¾“˜€r+D·‰@»iúwëšÐ86][6‡¤B 1°D¦Å°@B¾¨ÓZ|t1d=â¿6LF,|¢;å¶ ý=$u7húH ЮÚÆü § q»ÔÈÎIX žg°fb—õ•Ø™…¤r  -‰û +'7hÎ F1R.½þ96Ë©!†:[B‡®¹ßÇÊ‚âSÿrO k„Ͻg7µšÎP¸‰V:Îvv·Ûí ¯²¡ÑU+?ï­0ˆçLðsàMp¢1ŸÁæqUAºSò±™q-žÆQ…Kñ£é˜²q©Ðܯæ×ÅÛëC6Žñ0,ˆžåoG©Üƒk•ŽÆœ'E•«{CoÎv\X! [‚ÀãaQ(F¢‹ zTOüC!×-ýC PÓ¿8¬È¿áÐÕpîÜäÕøÁ°RhÙáüoÝà;´4ð}'±'ý³qnx=× 2·~:5ÑÈ]›tŠ_NÔV~#¨$6.赋mUJK‰² è€ f“­`5<팺´Í» kx–ç¿dï´½—Ê¡ÜCAúº=@Ï]Ö’¼]{âc%‹}Y@Vdq‹Ãª P7-ßVÞGá›…óIZ£c•Þ9‘’ÈŒ{(h#r˜³šÊn”öéŠÚ*%*¿ÙG‰>Â(iuöµÕ„!zøÎËoÂr÷¶3ÈxX²ÒpýÛÆ[ÊžÕ6u[Ât6xå &ÚŠpþî TÊq“\*O×9öGôúëÇ08­¬âȉ­÷¦ö¡._\q|È­e1ƒ½Œf´"Z$[OÏKÌö+õgÐäý²Ã¯£~q:èú¤»ü Îè.…—Ef%ý5)S&ÕÍôå–Þi=þá÷ï™ •%^ÄïOŽøaÉͶÈ+·˜µÒ|&ßžb”¥ŸoÊÕ`ó…’( árÜ_|»b0ç½Ü5Ì­Þ KP§¬èܼ”7¸(ŽZ5#€":ÄzxM MÒ'(mÖO–‹ð«_ÓP˜¿hØVB‡o–Ü}´—›ˆoÁ¯J¸aføòç2¯¹-¾1,ƒA¤„ 7_Ç™Š)Ðp ²ü•Ú\ÅÕ7»wÚÜk².O[ê ÚÓ.M­^ ÓÊ †.}%9ù±vdQÂû·¥õ™×”§s\Þ’Œ¹9g:áfÞy¢ ?gÚí¡íux@»‰e&#‘¹jÌ©“À!yòSÎ…œ½5IvæFN’xÏÙû·÷ø/+±†Ë²ÜABÌ{þ‰šª1‰‚4ÎNüÕ9œ,NÝ–š£èÿO@01'L(½e8Mí@®n¼¶Õ\ÕwÒU2–Õ¾zƒÇ‡2@¥#ÿF?7OÜ™ˆ CU?ÐïpmÞô†þ„7uÿvƒ"‘©ž'PÒ20?¹>ÈNñ|±e»aFðÖK\…ÿòÝTCéfDÀÈèsi1“L8+%|xzêmh*¾Ÿh’{z¶NûKÁȇ:¼sBÆ}™îïçc?jy=ª§*&C€ËÓŠ»Î¦òµêFÞˆU €ÈÄ-d;íã½ÇP ˜={NÃ-9Ó†r›]G))7DöRc®DÌüËÚ{¿ƒ±ù™—ÁW¼™:Ô&ÌáŠy¤¯&e(èvLŒ+ÍaÒ¼åC6‡\ 5tg{låÕ¢2Ø%h­× ?[mÎ}WÊç}IæØìØé ,7ÁIt……ó¼BŒ1 X‰s¯@p!»üçeõøÄ;WwеZ_Ø¥EŒžÒ”#7Ssq.jö^Èô2Z!\ßzËL~©r:ï°7žbÆØÑ›Üð`´M%ÌZÐYü•`h}[Þ´Š.4a¢l$V>L5-B§clT†HZ2d²Îz}Ó+gú‹ ½?KTŽ“ŠŠJÔçnzò²$¯Mù˜áªõ|0ߎœVDCêYv;lŒºžÞiÚÆîrÆ’þ”%3¸}™¿5HX„ìŸ&ƒýAŸþo¨ô 3ÞQv¸34(ˆÝØ×ôª¬cå­¤.›åÁÝàj0šWwñ›cû7ù¼gý±ô‡3S2¤5,¸PÂr_hûø!VØ´(™ïÿ‚ÝÞ-ò01þPí>—Æ)6¥ «é„W'5Ö‰C[%bÅ#Pùo=r¾jûcÄJ¢fýVÍÐ*^5(4øô Íþ»Äá%ºpa.A¤ ¬—9ìWiU#—‚ÂØ(u"¿B ž< PMºÌ¼ÂvÌ:­jmf¡g"Lj@íŒåø¹]8È‘bñ¿?u–iôK&Â@k¿´_!Zg‚Ë·‘u~Up¿ÂCcRºÕz» ªþŸö]Oí0êOŸ9á*'AN.:7b)ÿÔ¨SK‡‡‹]júa³þæ@XFw@m隈ڳԟZ|%~V[˜ïG8⎒›¾̳ƜçЬ]Ö·—ɧ÷› Þu­‚šý§#¹Gª·zÈâ_dLg„üæUØ,,€Üý»>&eÌÀPd›g »,uaÊnjþ_Ôî7°©÷°3ùµ¹aJ÷%# ì7ÚáÙä[T£˜8î²êˆÀΤ˜çÓ–EóÚúòc¶6a8®kûz­k%“ŒhË\Ú!?¦(~䦰üñ†`^øÕw"1k)Wôü¯"^è3A³puÐóÖ‹ég!Ïb9—žBÎ’œÆ×†=0RÊf‹ªDsyTÕ<•(@ÃÑð0H°z}Ò/ÝÕM@A/;ò¼LyTégàÄ¢¶GÍ÷ù»‹PöĪ LÛÍ„3€q* 1I\3jéEÄ›¦ÜÑ7Ñï 01d‘æ´E½*>r‹JëxŠz…`&×Ç¡•³Ët\ü–Û#ÈHàЖ© ÃJô³8äDðï:?Í F‡Zò}N0mnÏò ¶ÕèQæEMè媇« !ôg«K3ÆÈ±dóå-XY+Ãø§Ý“¶·˜JfÛËÐW(cYˆH^|?w²xžz­ƒBkÂVÊ0¾KÉ—Þ¥å•v‘‡oÞr¸Ó”X>OÎquŸ*B•&»—tœCÝéïz¬Æ Ÿÿ µg«N\È¿˜E¢m{T ’Òñ&]^ÈôBÞ…RvÒ¹î| ×1S Ár‡˜‡>x;ÔõŸ>|²PzšØZ€®‚»b}ËÁ%6 VGu5i Ê®‘'h9Úú§Tù$&ÊÔß©}H‰yR9™”j&ÇâøL'¤à@= B¾' (b Œ!sð}AÜʲlX¥º T»©7Aòú–\G¶ÓÄšg&že“yxU¯×3q{ÁùEzOàlm(­x¦h8àç_ÇÚo”<˜’$µ¿«¶ø@7>X•䮄ô0?êj7°å•µJ+Xm!4 —i&>€uDP˜£ «¯syRäGJO†øsÍ ŠÜkÊN¹(º¹î†rAÞ+“]¥²È½JB쇻H¦‰Kˆ•†6 œ–S°Çd"Í¥ð'=xþµç¾ÛB婚ɡÔT¹¥pfZT}&"¯ëÖÛ›Û»k¢Ž Æñ»_÷Úû}±A_p#ô™qó !€h“Ѹ?ˆ`BÈΤ¥ù@7õ”à”A{÷î|.«Ô}ûe(Ñæjî‰À¸›êš»†Þ¦V¼e„q&HckVu™aüðo±»ŽÐƒðt `öe€ÿ¥—a]EVœäó¤Î†KŽ‘°p;•áÉÛÝúš§å–Øê±Çpx3“è3©7íã¢ÉÔßÛnBÓ‚OÇ4Ú‚&CÆþÂV·â´âVnH„K¶†´ÕuW< Kt×U±%:0ÎvëE:JoáóD|\öóö˜®Èb‚ªÐóAe¦!"*ÿŒÕÜÑ_Å€–1<6‰´—Öüj;ĺ46aÄCpõeé•Òÿç 0u’˺Ʈ®âKï=Ù ‚Y!/ª‘ÃNìWÇÿÿ½SqÂt ,dò+ Ž ¦ .¼\W1adÕ<ÿå½±"m^ovrì^òW¬Ÿ¯ö3 º\‚j”€Í­Líù°¥C1M ¯ßëþÒ7G¦±¼á/°ÌëÄV|`ËKxšx¸Q+ÓKµ·N§®Ñ1çzƒ§¦yŠÅ†èpÌä{Éøú:èùv£Ä:ËGaóÒÚjxà#ñ¢ë½àšH׸½Ì„+Ý”Á†ô.‚¶¾Ø ÀÅá¬c¹Ô«2©ÂÂ7Èå!ie YДàÔBDÁ(æh ÀáÓj‚=-Æ¢'ŸL…›ÞV„2þ-3ÍyÔ¥Lš†[‚eJ›LœwO»¯‹gTJ˜–ôèx¢ŽÚR<¾2¾«ÓF ó 4c}á\qÙŠØM1UlCy6žF—ŒDñvå;TÉA2/ç`žZƒ*ìí’Ô“orNÄ/¬½fB>çQ$¸v«:nöV1Т:Åwtö¢P~Ë7/ ɽYõØù¼Cá_˜Úñ­ò}11Çh†SAŒÇLQ‰²… G#zöø¢3 E=XJÿâKš°Œ/ \ŸðuäýÀ´š%JÇ­%ˆÔ9Ê ëL¸ÐËÖëcß&Ó#²¾`-I-!ÿdZ€w”J¡Osö÷QŽÆ›Ô[ ¯§H_Ó"ò%“²Un7âúêÔ=^êÎp~‡ÆÍ„Dw:ô‹ì<.JÎÞoË,¤aš^’}ízßz-¯L ìäHó¶.Ûq]³…ÿ__óÇã'®Ñѹ=—3HŒ@¢5N€ì°Ø¯^À]™4.™w†d%¾©•1Ka}§½¦õªôöÆ«¼Œ•vfä¨çR'–j “÷¾Ÿ|Q€ŒM§Ï-ײÆûŸöŒ¥Vý9Ÿôg¹»æ¥5Ü·# ð°æw[t.³5Ól.Íc'¿”“MD·E¬ªºªÛyÞĨGU¢!ÛÓthëK¬†×‰þee å,ü¶Ü4Ú=j·=†Â\TbÙä«3]œ!D61OüŒÔ7-ö:e¡ NæÕœ}€ç”D?æ”é’ÌšÜËø¯ÑÍÐ]ù‘´ˆ‘€*Ú›ªpHÕ®`jJ/åDü.®V³ŒÚ÷òä(½'«,l3z«£ÄÁˆVŹb:]ÇGšÿd!Äy)ÌàÂ;fÈ+0{/&0ëâbyo\ØÖÝbѬIYú‡Qó–;Cçìõ1 <ƒyŸÇ_L,ƒ瘊¿ =p}\sØ{)v·òmNtíýQ"9?§¸ 28 ãû-Çp_ÂÙ)a1a´‰ U@w È®;ÅMƒïÏÃ8פsJsÒ4H0É·¤o ‹æözlt%z˜›æè[…i%ÝÚ^Âf*$¦¿Gß¾d½L^–ËøºöQ CÉ[ãŒ2»&ju‘ry‚ÝB“Á¨3Õ5h"ôg×µ|‘(wT½Î©>åÆý Aº²ø:“oy]‡®`úcTû^z•éÊÕ pÏ\@Åå'?öxî_<ÛÊ£õÂr)÷>ŸrR)aÊãÿf:âXÌ·kK–+GXè> RD`¡éºÎkåÛV9‚‹àõ­hÆò+ø‚ qæÀ]|é¡y`ýþsð2ƤêÊÅž™ÖÕÁ”¤ˆGoß8ÍÌ"…k®@%Ú¾œ#: ‰a¾'}ÎÓ«Šp•8ü´VæU§>»âVúÒ¸ ®°çòû Ú5v®ºŽ¼‡Ž×„¬ÿßv[øy_fäчtÜobMiËr]¤/4uM®|íÊâBcì·G‘ññ8ûŒ=À<œÄò*2 B—·rdÿݼû¸òdàDU‰À™æ¾û_€à_û~®ÃUæF¤¼+~àØ8`êÔÈöºI΢»ó¯bù®ÚWmTù.`áâm]ò»ßO4ÚßµùÞ‚¶WîÝÉ Ÿ'°ÞTc/`²‘ìÌiÜ=l<™, »Etq™Í(YôÐ_$ðTeŽ·ë4È«ÆqwÿÊ$ÑÒ3£¸&‚ -N‘.XFf^Ý.;ß«¼bN^ŸúXô½'ªz<ÂDGªq¼-õÑ7î)ÞËÌSVJ]Y2^‘'ýÍñÀkŽu'·KHV©*ý¾ÈíÄÇlgßáCO¹õ}ljÈÑéznÈÄgí×чìãÕŒ&‘#$ï!öX>®ðÙ9ÕLÙ·_NÖô=äõ Ïr`ÈS*– ­ìíU±qD°½FÜjçÚuæÚ4­iìS>ØhEcs3=G|ô<U·ô]uDÁQå‰D¶ñaŒ˜öð[g}õnŽÞÉ–2TÓÁ$Õט<_ìrê/·Õ] ßX+³}sOÙ‡…®¨Ì¬ý#…™Ý dû0š«×z,©ÉÊïf‚ƒAûÞRoüS¨ˆpÆM{Ö g®ÊÞÓ¦*ûåºíÿ ˆ,ÌDìN-5Ic…huëK—×HA²È°»Ž­öºø£?/·Î-" éðC7­{SOxÈü9gl3o˜q)ÞÒgò>bÖ5`BÁÊAæyê½ÙÅÀ™!/ûW¯C<êM`ζcƘ‰ DîË·¤Íæ¦Ød$–s~¡ÿžðÅHHqø\@h4ÿÕžèë)‘á²ü˜õ\q´Qô;Øhs8:e¯•޹`¢êsXb;ﮤÛãÛÇÜ×OŠ/"ænJ þd}†¬›Äž!“ fÕâZ~J&RéˆzÊV“'y2òýidIòWǧŸfbÁ`™Yk½Ñ âyð¤5Z.ÖèQ‹‡ÝqŠ)ÈN‡çÓÆy­JÿCµrç²TùâÂù‰4ÀÚ#†!öÓ5¯KwrÁF"èQÃu7ŸÍÞžÎ-fB<êG¡l8}@y/ õ>ŒöïGtg‰4K¢”u,±mzˆì€û Épwu+ØIa埽Ëã0bÑå• À³%Ùár¾J´Êz}‚ÕEØÃ6÷ àý!¹(×è$^L]üóË¿o”w ù5#‰¤aøSù{Ÿ“;gáa´+9֥톘G^ŸA_»âMÿ*[”Ë3f·H44F?ÚZÖU×pÜ6¤îí6Ã#›¿Ž’«Ò'02›8ˆ}¸ZBÎgæàÕÍ-ÂÆ‰Uãé‡ ‡j…åÙÞ%³ y|•’‚ƒ¯C (g«ß”§é"qü¸^ïˆt:w˜ÇAw§Óš„¢É·ígÜ{ɰþ¿o ±)‹ Œ]y ®)¹O€Ù¿Em$)¥-q³` ¾µY`êræ9‹Ð ¾reM(±c \ŠÂ•/г¼Ã~Çb¾nT+CÇÍÚÖè‘]ðYB/úc,0djJ<ˆA‹+=8¹ç53Ÿ,f–jâ:ø}î/Z8H‘ÐÅ´Šº Û6¯[Ä’}Û¯¯‹A1ŽC ý¤ž¬¹h×&¾1î fÇe³Ý**"›Ýì°¿5=SÐ!>/vha”º¬thRBÍiÌ ">ã^ Ñý‰\ÿg¯"¥æâ\¾Ô÷{ÅBÞ÷'éÞB)6%l:ÙwõÕ²\i;|v“GÄV–™~ ®¸uÕ—ð˜¹ðê0U‚ÕçÜ¿ßsÃEoÃÊä d =0×J¾APÐURîßÓÇfck±c.£rUùµ˜ïÁn¬dA 4P‹Šm&ù’ÿ¬p.î|4Ñoî4´×Ž+ËÛíz“q ì•1¨JøJ>^ÆÚaté‹N¸¨)úD|3SÂôà°ì;ý¿ú™Ó¢5µÇ§¯À:z}HrPlm2F}+K:‘67ÑoÅÓfÁ”\| q&ë•7GmIt[C†7HŒ|–§ogyïâ)܇às¯%ãoräcF¹ˆbZéÂÙ«ªdYÇ Ö¿Á2àÿÛ‹–Ùo80Ö¨k+¿N+ëéJtú23ŠûlT^EÒ‚nôz°˜Ó&zÐfÒšw»CA ì‰v½Àb…/†!¤éÄÅê‚P„oεr–uæÆ–:,ƒåѨN+Tvd[‹vUk¢“Ìúób!ö6 8ÙUöΠƒj–ê”Õ/A­ÜøÛÇlRPú'aÄI†cð¼.ú dmKZP`•ÃÚÛϵä‘U>áME5âA±¨[îþRµ)À<( Ö™‹€¶Øå^¾‰Ó)ЂÃññî;#O@OŸ@ÚAΞԣܚ7²Œ«Ážüb§…•v [Qú§ÑRÂ+\œ€¤ à:ïÀƒt¤›¶_±|öx£œ¯QIƱrËYiZ!,·¸1[È8_ëâuiò9¶¤> ú‚–Q$éÎÃ;bÛ¿¬,®mÚS×_ “fh_Ÿj‚¦ö±áÙ9±²C¾"ÇÙÄÝ`:'FØ£¶ãÕ´¿8IØ‘Ì~fòb_Å‘rÊùõ¨dÛ¡7³n1- ÷¡«Z¦>€2ëï¡%–D½(alm¾`Š­ÅÇÓWú!èÂÞW²’ĆõÐ)F¼Çkù%ožŠºŽz5b Œ°åÑSIðñ{±g[>‰Ì˜VH®è­gu€×U[Ù7x@`Úlyˆ‘Lt4/;rK8P ¯Q4ñ…J‘y/kÍñÿâ®Iû| -ý›$:à•ÆõdÂò\·vkâ„Q‡Î ×?{—awàÈ—>…—P†¯åÚîXèÁù‚¦}£É¼ ÖD2?iîO™@Ì9Z¸špŒÉ–çßÑ{yx÷ƒûxy5àÕšîV=gø•Íb‹«Ò÷†fù)…ø•o Ó"Å»%¶#Êý”™yâ¸í\j Ž3ÐßÛ7ÏŸ¥ŠØ¢"Šlw)ôu_§ßGï@ lã-ÉÑQ’~qù{/k䌯9æ'ÏÞ¥¡ ?_ºUÁDê ˆUV|ÊXÁ6_é$”'‡÷a‹võNÚ~X87ÆÿIÈT‚3=P£—ç@"‚³]Ð#ªØ¯á.Sv÷ÜÙü8¢&_âOP•û1å2ï£7™a¯µ¸S†5}Ucðªpñoà&@±RÅQK¬Á¯^(m'µEm-eÑ>øô¢âê ×F9ÉԪǡù¥lp¹žrÒ¼=“ƒ»ñƒ—<òðï4Ÿ<9œëÉzQUOÎý–«k¾á¦y°U4Mؤ ‹>ÐáWÜ“,2*rqßí^<·hñ‡ÐŒ0h¹ï›ÝÉ×A"ç;ªÐ²]®é‡É¬×:úRcÞÎÀ{Ô0Õô ±«³Uó/•Ý}t¡H(×d20lyûÂ=9nà,­—œ& ,™­óÒ´b3Í¥OgÕ›fÌTu~hYãñìÏÙW¥ž­OaŠâ1ÏŽ&¹Ñ0ä®~É$ë7;OOx9SP)P›¥Ošù;Žr5Û{†f©{D°R“;èòp¤LDɲæR 怊Ùksc=O óŸŽZ'¯Y{Öztòn„M ÌS±'.=lx…·W6M„B[ÜA6“Ý9«ŠXNèÕ†©[X€É¯Y žÍEC«vúÓܾE9Õ¦[¡ E¡º‘`l<|R-«€áo HEÿ‚1v&M¿o£:KI[¹­!ü%Ev¹[ Ú: ¹¼Dvê äö›:§ ë;ꬿɬà£oÍÚú)`ÑÒH_@yàæôñ:ÓCk®ûQu⤽öÎ:„ýýDåñKêŠéûßùwx¬à ]€¤™¼?•Öàd T‡˜iE§õc|Ä“Óå`h¢¤RüaS`(©Œ‘Û¡¬…sh%¡n´ä/Øh¤–‚LÇ[}J„ÀÒùÃ4¡ œOîγ ²·lá òr§+|†>'Ñ'LàO^Rœ)†K\³üoÄ9ãç›Ô¦9HÊ€F4î%ŒÏŸ¿„|^Õt »oƒlô¯ýä–wÖ Š?ebb«÷L;N-wÈ:”R!fÙ€·héj;rÞBÚ 5Pú‚Õ‰©@çnG/am²8‰ÿåsίÿ÷(­ÍfØ?#HH 4ÎdrÆíú¹ÄDøËU…çßÑã+ªPd$ *ÁŠM ,­h1•ÀÕºæüˆ±êzÛûÜõsŸ{i•möœ6¤;Íò‹$mñžRNŠFisÏ»“q­Æ×÷þ.Mˆm‡¼Ý|0kÐ\«ê–[Ø÷‹v úqèò^¡=ÜFÇ£9h1f²ë-)÷bË#Í>»hëÁ*lz÷Óf°úI4Ù` sÛ¼J°Š¬ÍÔ ¶OXêEc%fú&ª¨§ 'ö#–†¯syª‰PÉÙçÍOBJÁÆ,Ýxt&?“° Q ÍOô–CÒ:¡žIÒŽNsǪ©èá®MšdØÏùGÅ÷ñ‚JÄ[ò5¹6€êƒtíÐΕy̰oÒ¯K/¢/vdV‚¹Æt=º.'EÇ%n:ø½2û¨àrewD’ú²'9w;Ý(z}Eaë8´ˆ)þÞe³îèÏâòüˆ.‘t©jhŽÜ×{í­r!–31á•GZÒo’i„@eë * Ίxž+# IŽ8ãéô9$¾B¤q«pDÓ2fg¾˜Ûîâà;„«øë—¢EæÊqz§S®G¡læu)WU+ÀqêÂÜR-glVéÙ@›èkZBÅð×Rï¨É¹°Î˜¾.Þ!b]D¾b¡Ç—+ÿÑ:$ª­‹¯8Ôì—–#_‘ŒsA¶w›Git_ŽvþÁÚŽùƒŒÉñ8‘˵çΙU2©ƒ`ISêyàj!,<ïçéfŽå Á‹'i¹¸[ä{¶VÙRP‡z;î÷Ј?\¯°«×2î\Ï—õ6Ä®€L í9=Èf^‚1ñbÿï’Ì̤‡l¢B!o‹Ó,ÿùñ W[™—Š_mE` 0Ù—.oaŸçµ!¯†#g"š,MÒMlo[MÕ~¿¸Ö-4É+n´öÛÈòllºyã´WÇþÖªÉaѼ©ÿ‚àùc\¿Õ¥(fÈ^ysŒ)fÝí÷7VÊþù·àâMvŠžÞž1pNS12'P}öÊv§Â·×%ß[2fØMfñ{yz ú0I,µsÙíÙOg0ÜBñ-¨Ì¯iÄÙ×ïÇ^•'!¢õûª2Rôkîâ%ö¹Åþ´¨õäÿèèijÉãÊ Nü/WyWV³xÖ•lŒF(Ô¿í»ðfãź9$/çË{öÙŒŽ`G;qèfìÆ@þVo¢ÙËð¼jT‚ cÌÿv¬°(œ$jZT¼W¦L•²?žéKg´x†[ž3žÌ¸àA9‰C3;¨_r7^k­—5ÙP*s­ÁÎJ.m}»™®sPãW{´í¹¨&K®ªÂÁ¼’f7">hÙ î¡\xWÞ¦°ÀöFÀæÔ\L>éîú¦˜3ZG\X[ $0"¶+ÔÌå]ˆÑ¶¥¿M•Ï»1+Û+Eê){ÐçÈ¿¶æü­o ÍÙÇm/ ™xŸ†Ÿ†\@[6ÞBz¼›Ô²ì¤¥_Ü;4S-¹†1Þ„ý`¿üôÞØ—º=x¨`ô¬_–' ãd{ü‚$õ H9pK—æ2ÆÛÝqÜòÄ!á?_Šý‹0[kf*ÊjŸe3N!2kcÒE<”Ìp!ÉÖ¤'³z”hÔÝ+Ýæk´fáq4]¥$ΛÜ1´%ª @®ë¹¦òàlþ®IŒµç»!—øa¸Í½Z¨-Eæ´jöãÛ«µ ÿ¨<Máè½ø;©ÔJ‘¡\­‚0û'–Ö\Ës;1_Ä3£VéJÅô@%‘Á*_úЬ0žýb¶ k ˜Þ+CTQ£:TU1âHÎÉ’ü00 之—©;¾•ÑÜá\›Å’œl¡Û"žy²kÑΰóh ã3Ü9Üæ*Cõ¯i Ö ù šªÑŠÜ7_^ÉŸFMçj€í-¾SN°ú„ç<«§GÓ“·»ŸJ·pÞY¢ê´¨­ZÐsr€œÙne¹Pj]¬ñqíÖSÔ® ‰³‹dˆL…hÅBég…¼Á[›Íâ<®lÛTn ŒºKµSYòðp|‹°ím>+&"¸@ykl`ŠŠñ²‘ è—°ç{U^YÑ?±jôQA~`aÿáMÚãL~va t¯[`»©84øàNB%®Ùì`~ìÒf×ÑŸŸ¾;Ó?ʆ.¦³k–<ó¬üö9<-<:#ºØ[µK]üOænû' ²2ÕY%šÑ?c“&ŽîI÷¢±ÅlüÍ ™rå[:] Èa iÛ.©:*­†Ãýs]Å6bE!]½Mû¯ØÄJàìŠKº_ÍC¨]kÒoaZO潋ÁùSª†¸ÕU¸º¬€2éA‚,vª´á…â­94Äí;›^)R‡Z½t~X4u>†]xî×v|'ZÑM£AŒ#/ÈZ8Üþê6àl,Ñê¨q³†/ðóÞÉs!så-j¦¹žh§“£Jž£ìg¸CZ7þ~à`Ð 4>~$å;qéáRSæ™áÔ5ðp)ýûG'3L9s“UB'\šÅšrâ6Ä‚x Õ ¦Ú'_šIìIšØ”R³laSnŸFXWe?eI't±»úH_½dJ>¶hí`»ìŸüÀþО¶Ëw‹8úýr»ú´f­ÔG϶™’ž±¿ãƾŽ*„ƒéšì¨ðÝCY<£Ì Wýøú<§é'º5¢!RÅ䯸vÿc 1z’ oÛÀÐaÞúR9‚ÜWI3ÜŸE¤KD32v¯üØ÷§…*´§h{ þì/˜wT FúþYZíØô) ñmm=A¹(P´¸c¶5ß®H¯Iœ^±}Z@„JÏBõçcÿÝ¡íÕÆòñd{ø˜vâ„ù!‡ÙvÚ¡ ¹&ß»¾j@ý•9Õm›=WòX§:D¡¯˜_tjFËÅAÀÆ-ß§vþrª\$Ã%œ,&eêK§vU¶Lˆ›¡aVÉ.6ÝŽ0ymw=jÌ… P]e§ØÐ~p&òÊ ªð>2*Yê”ÀÇr~nfß(ͧ)¿›¨p˜vOfxú}ƒ\ ­ ÂcÎd{JÖ”‚W\ ´ê‰Ðü-ö„§’ÀÞƒÉÁ©fœPl`¶ém³·‡ˆ¦GBÌ̉α6’dž˜–WRÆ£­'†Â’½gA#òÇA#û0—ó oIˆ^íˆ=«“18`®ÊE éYuõÔ h4±Ê†­RC:rÚï=zÌÉû©8c©k3²á¦Ñðç±x½rvwXPxÁª¿ø#,‚u;Vm6ˆŸ£-ZG_j[¸ù)$çæËâ}ܤR€7Jsº¥dÒ7§€P¨FFR{ƒ±öž/6”¹]ãiÙü7s«<Îäµ®TÑ">a ʼnžÅüÊÜ“~=è‘v03ª!mÀâ÷ا¥›M\Í~Ð7ö9OT¼í¹”H<36’/¨–Ál1a$`‰j”Çõ…À"Û>1ŽòÙÏ–)”7ç¹{eãœõfŠà8ó ”þåuêùõu$:ð"‹FççoŒ7ÓI…b:\”z¼3h~ÆvÊZ %®¿;èM§ïUŽûó‡í¶±’ÁÅX±ÞŽE©C—Jß;äg3kÜ£‰³žb¬ Ý`VéŒ7€d‡¢„=Ï¡É7«ÍXZÝ\­ÒO²«/0e±<ûOUº§yÊf«#+½¦ËË‹XU”ÇOÏY«lD×ä¡ȹbµ ötœ)Ö;m tu-èë;/ ç‘›Gbá\yw2ԟÿxe|YÞØqIñ¨$† leChÖGíÀ±WÇlë)¾,æ;¼4%‘)¸Îë™A`t†O‚°ýT†¾FЛ0,óHã·¯ìsw}†Ø¼-X’ð&"1¶? v-ôvDŽõ,W%<9g}¡‘ìI#,ƒÓ!¡ŠæÊ~H‰W:"$Ò Ã<|\“µc.ßfÝM!o· `L#¥ÈØ£G( Nþ¿óâ7埲ôÞGHa¯ÕØUÔ£Aé±¥à@EÀ ÷wM¦ú:áÜqø8÷(žõáGé¢Éüv9|˜Ò2îC’ã[UKµËrq£ª²Îé7ßìš¹vo•ÿßïõ¦ˆv³*CÀeŠð£ƒ"ô·C5ÌI’:Ô@öD;%¹ñ&@ K«‚™×wÝ(CW‡÷üÔ3A -Â*¹Á]癆Ba±W˜ç6iÜò§Þtõ3Wù0àEëÑ9—Jp40Ìë›ûh ÞNñŸ´ç@$$L3&eD=—$ôÄVTåEIf ì™ztç™XœÀ¼Ã¶ÚMò~‡fþÕ•5¦yu­•Õ.rjK¾(°@”š„¬(ó«·_nù/¿ÄZ\²r™$(·‰^^¿-¹tHýÆz=ßç ²˜;⦄3_[_ ª ‹T.Ò¨÷‹q'½Ô¨mÕåÑó_tj¸öEúhÐFf–ǦFL‰ÄúM Í2®ç¾†õ|ÅÆ7šðþÖ½s:'Á†z%XÞŠ‚5)‰ÅQó'ŸÔD tÇšç“$gJDèÌî—~Œi齜 »Ûäy ;ã GÍÇ­VËÔyü› ûŠ|dl®Ø(¦VPœ:jä²D¿–G6Äž3 Õ>;˜wš¢Q>=+1ý%±J‚—úûBë; ÆÆˆ·.ÅNƒùRŽR†Ësé¤i–Oö¢¢nîÒsbü¹FÀè Ž Š å^uÁ)Ñ0*=hç²!f§Àü1—¯òvLòÀ_5‹ ñjRÓâ6´s±L†¢Ð7Prtÿ¯®‡"`+z¼r¯„ tÝ̼?B¨Fý—T»zÒóYÇ—;mcAé·öýÏú¿eJá«Ó˜y)0ÁÕ+"q/{“s»k¨³d}1bãRªôºÛª*w¹ŠMáWlT³tbgî‹-ùÑ U8Ê7P°¾²Z,Å„óʤ±[2˜’u ‘£s4=fª­òä@í)Þ¥„*X‚}È‘”^p4î®X©_4¸‚PÅžuf¥×1 é­"{L@¥ô!ßëmKAÊd»½Œ§®`„£žu§WŠÇÂ’äÂÀM›ŸwŽñýPU%Ýá%Ä÷¡—Ùî ø\$z¦eÈ(™Ó uÄ(éLçðõ±¡ÞA¯´>ÙÀû:÷ØæÙ¨ËQ‚N³fžLÒaÖ×òBÏmßA—V »Ú®¶ü©÷-ͽâŠÎ×ümÔýÀO¶-«Í¦û—KVø"óf‰© ~\w(}Ø–UT̃ ƒ0<>ûàÑ«­—²ßK—<ûÆiHœ0lªúÄu¹VP¡[¯#Z–‰Eq£Æ\§8Çö»7c]{$ü¬$÷1°ø5øäÒf}¨VøÀ:Ëö²žz6„2ü´"q¬òV-mþY!U¨˜UŽP…á¤ÇQä@,0Ùà8ßX¡µëÜë ø§F,?`Z¨ù=Š=ÞuÆ^œ¦Lçb¸>©^öºÎë-6&èÆM‡ Å‘&bÁ––™ ñ}ú˜J°-ïÄâoÉg«ÜÖ%.d.»­¢Ä^vHÙV”o¦R?MÃaÐ;y†°ôRƒ DªiòÂv3”P oÂZ²oØë•u®Òªöye;m>b2¸-Î'GŸ¬h¦^P |,Y F·^OnW_C³ø‹24]›¥²°ŽÏ/å äOŠ0YËá)ÜjðÎR´N$„vÄaÀ/KᚎԂ‘#§Ú„ß{1o¹+$ ,‡¾ù8ÐáÓŠmÞ¦FÂ3‚"fºßè‘ï›}•YÁ¢dªx×ëmäê°Ÿºum—)¹’5Öéýø*›Û\ÙöUÃä&άWÖ>§P9>­¬[þð¡¸Ò2M|âv]®¼8-a»¹½ú)…ªŒÐVÊèð¼b–ßîv ŸqMÞû·àí’#t+ŽâW}6JGª3Öèaò†<{ùÛ†åÄ´ÖL‘­.ú¸éa'Þ#-ñoœne[ÿúž×fñå/V´»XƆârû¸Ìö!d“™3‰º3ÙlÚøiŸÜÙWjI^ã}Bú ñRuÍÜêÂ@Âì¹ëéUfüÀÚ€ÖýHÁ5È2,ûnõ{ýš¬4‰ ÑyÆÚ9~ú„nÛ¤6­B´ð ¿ör<$±‚^þñ¶Úú̈́Ц’-%¸$ZI­‚¢ˆ–P­¥ódO«9¦;pýï#ëà;DÍ›µKÁWi^ˆèב ?¨¿ÑB76åê¦V8ÓûE‚Xö³-CX“º¥±êß‚b;evƒ-yŒ2<¯Þ é•_¹GÓ¾H ó>08åY^M¹ýt"äè1¨¦›ÄÅ'žëœÑ/Ž/:œþ @¡Èg¡n1úT{$;VÚêQËãžæ/“2pêD‹¥ƒ9ùö ¥ûbLšðŠIµ7E·žmÕ<Æ›á]¿D÷¥ü6"ônô»O–>áÔ›He„wŒ"®åx¥ìçB颶ƒiÕ"™–€þ)„7;sUž /a”ˆd.®>ĈƒM'Õƒ!Òi½j@#PÉKÓìôîXKW!-{åÿË5Ãç‡_"€§5‘€¯ö‡·oì¬O‹záE–yÐ ð«ì~`Æ, }À¶Ÿ*ZäF}`áH®‡èÈqò ±hñ p;íÓ¦êáÜæµßŠ /†jÂoº{ÖÜ ‰ˆü¤Ž‰±öùoðÕ¾µexá4·ÞÆÎE²‚ÄÉãðÁè¼kÿ-ÐØ~6!8.&kNù[`rÃæÁ³”åÛž¬„5!Ž5eδUY­2AÃã0-Pn»6é½M¨©ü^ñ@‡ku¡Óê­[9^K\c[ÛÞ<â€øKz$8SR]ÏΡɊQôí’2 ÌXàÂRHõ-[óàa/ƒŠVË'.ƒ­z_–¾zB…nžrs—ÈâǪðOIÙ`MmM (t£2ßà®Oмöý„áЩ§q†¯‚˜‹ERÌr²8ûígȽ@•ÂäêhœÜæ2|}ÞÑ#¼!ÚŽ pÕ¨ ÊÊ8Ò·ÿ¾}óË@ŒìÓþÚþwo9”Ž9Ò´0&¼„ESbF]5óAïnÅP¥“?²Ý:ˆ•:¨àn~C4u~¼ ‘ÿÞØÓa[KGê!êã‡×²Ñl¤8Ð8GÛ –Ǥò¬G-(?ËÁøÔÀÃŽÛA7ö¾K†z=>FÃço»™•q¦+À gŒÿ‰(tÛ˜Èh.w‡Ñæ\<îÂÔ@®ý‘ᛑaFY]+B“ÔlN—”Ufˆ£uCÏ¢zvûFDš$¿)‘¼ZÕôÊš¾Ìñâ{_Ô¤³„bE/,Eµ+‰ù—Ù»©Ž{sÛóQ+öFmHs”vúÔ4Æê5¶­‡öûÎLÔ±%7x("—TL±ÃŽ§Ù«›ɤ­¢Ð­×ö} pñ^ί¿lcÁ@äƒ7$•P'÷úu˜5Hó/nÓ3k S¹o3@ñóHA”øÌùˆî²cµ©uò^„¹Uh;±wÄEd¹VbgTµõd†ð9å²M±ˆåe™ã/ð:TôäRóAÊ!(ÀkåÞ=‚/9]±°M‡Ç8!¨AˆFo‹ÅÿCãusñ³³9±à0†òJìùóð]çºÕ䦱3h¸¬à8BèYXzºïF na]ŸÂîÃÊœ¡·kÅúûDÒ;¿86Ë+Û´rgå>;Qjá–q8„^š?`_¼ÖÊù}Q(pq;–ç<µ¤Ü«¥ïö×ô¢8W¸˜aΠµ+8Ð:Å/ŒgÖÚD†{âSuJÂ;F‚Uç7÷¸ä}•žÀ|¥×Và2üE_QÛãóÒ,ÞL0Èý«&#6±0Á¡s+8‡_'ÌÂðäGžµ˜ó•?+bíöŘøˆ©W[ =Jß%"t™¾J¯pÈÆ§îV ÉI«ª*'~ïñu¸<‹yLØi’§ÿï÷O3âS‰p*“BŸ7ÑPÑ|Ãli+"hü¾;Ÿ{Ïï9"¼xÂXlÙø¯û~]FWO¡½H(Ÿÿ3uàƒ„ëÈ%.-Nh‚f›ê.©ÄºÑpó‡p¡âå–@Êf ±70Áz¡:ó£‰ÿEê«òYëú"FÂÛCp–£™ð_ò7p~ÞÊdzš9(¡ØIÆÇùcâ- j6ò¥Í—hIjªÕ˜íœ T1†ùttvSªa‹,ƒ(OŽOÜh <žÅâ½g,oîk[„xp.kؼècòµ~æ;i£‚“ú­®jì(’ËâíY&Óüºäcä›Ár”üLÕZj°`7xév‹àtQÜÒCxñ{;ÈYèo˜©¢)ñOHmµ·ÙÇùOIHN.Š‚7µ*²`LÐ"‘ž•€b.¢é$Öi«{ô‘ ´ÕË@ãQŒz‹£.3x‚ÂpBòü³¹ô†ÌˆÌ<Ï5?Èhê÷›ñóãz´Å¸Œ€÷Á?ÚIxD#ƒEðŠ%t÷Ú¥¿$I²=xužæJ«›éÙ¸îÒÛP‡—=þÇç…m=yÿ¨´:$¿³í*‰%Êâe>#ÉØªPñêØ *ZœÜˆ ‹÷çµÈ˦·'|Úû¿5Ê—g¼C3z˜xÞh9Øv:ظ®ÅŽíÆÚŬ14$"–•M‰àúHý‘Ô!@ãV÷Ÿ´£ þ(„p̬ò<§Î…ŒÔµ®áyñ9[…Dÿ¤ý*~ãÅPiºû†‘—9u«+1à¦Îø%ê^>µ}:ˆï‘‡)O¤|\¤Ë+ãÍ4¯A°–[ð{ ƒío”RësƒóÞ¯ˆ¤s~È?Í"qÝd>ž.Õ}ç¡ïØÖÜ¥«È±àè¼W·y†‰³½â±¿ud€ÉcRt˜¤ïë^gsvõ´<«Ï¢ìÊe€£ª‰*L="/u”“›J*£¦Ø&# <ÒÜç™9E¾rtL”“Ümj‹! 6ÍB¦(Gj¨eµåã»Ô¯wˆ(6áy£©hÓt_¤a X¼zþÜÒaÞ¦žÐÂG 9¹pϳÁ"Á©£[ĸòBœ–úOQ0UŒscvÇ¿+ñò„1ž¯…µtÙ%”ƒ‹ÔíÆù"çûóóÝÀZË|޹²Ù„XQF¢˜Ñç'5•î¾› TºinàEv¦až2^`BŽï?l»¹W]20gΪ°˜¾•ž5ï¹,A€¸úxHš3ÚfÁÉ­ÞN¿TËÍÆVuÒD>yEuNÈÇiÐ)&6MJ¸­éÄÆ8KðDVŽ;v6¹ÕóAü žFDDgš†;¬eä~HUÎHqèfŸ¼¶û~ÿõh[²%ß©µ'L´¦ÝP*îìK#e©Sòc·ü§©©…ßÿD-²œèªÛÒ¢å#õqS?‚ö Mh˜vÚø¶£G®åË7ˆÑì5%YÐÞ 9Ãn„9ÒÐÖõè0uQ,d3”?ÄÕî‡4M"$|¥ò$¡YHæ­ ºcù&"Àž Ðß]ô{Ïù{ôåÜI¤úm3ÜK[úÝ#ÒÑ sD»‹´kXiBĬ¥Œ"öÁh­a _`c/Ÿs¿‡™´ð4 kî±We©wRÇö*»ß{ï Û@8×ýQCCE~iA,BÁï´H-© Ä!ìïJliM,&ÛPj¶ßÆ£Khôx_éà…TÑÓAT‚ã•_‘E¬ß,a&“Œ}4x8@Þçj19¥:«L)nr–”4 <2îÉÉ·JF)¯î*™ªÚb¸X[¯º *«WlõjNæÔaø‰f©ÐÓ„;^®j6&“N—û<Þêúç`0`ÉZVKBØtrÏŠ cÙ hb–è+Ë㘋2IH‹·;ôÿËH¹YEVØdðiçæ #'ðì½_¼±™…`W÷SÙÇÚöFµÔdŠDTÆë”f{÷ °u3Š€Í´¨ét䢮®ÿYuš[0þŒ\èÆÂÛv|Ÿ%ŸÆaW•ðÀöV Ú—¶%1ÙócwÒð0’JŸ>ž¾à²¢šÖŸž8'rNÀæà~‰¬ù—Z§³ÉžØµ¾&½¹ÇÉÓ%¥±p^ßí±oNê¡wfé}%§ƒ™£Ë\ëìi–í é×ɘÜ0=ä–rZL˜LiÅZ‰Hý)8Çïs[5-}<—Ñ2»xx±n£Ú Œ{DL2RŽe^F–ÎAÃÁ3¿ø“ømÞ7ðGdèÍÖ1È#’ó=÷Lé6ªœo€å–†˜pW/‰«%ö¾bö)GTQVˆàc¸€­ÄGyofjcEHLŠÈVPçn3ÑÑsÿ §ÅSšÏ2qùQ¹s•Ž¥1Kã.9Úÿ ºÛÞ2aîo~Øßœ‘‚RîêØF¥Y¢u„r9Aý ™2 =™‹DcPO_Ò%[_>C*öòœXºÒÀQz‚º÷½e×0âÔìuKq~„ÔÊz‰„LEP¬…²Õ«Ü]¿÷D6Úf-·É@‚i´«Òz³CècK]ØÙ£~ú Ä(8Fì"â’[ˆ³Œ©q‡‹3&C^,ßýÙs4HjE;Îü"? ÄÑR\Á ©w³9wzmŸÝg¬êŠrjam!D eG0/˜í\o,§õ.î.mQMÒÁ𨵒dfµ™ä±sÒUÆ-¤º­Kèuï{ÌeJºÀL 2#î¿*„—±eïz—\Ôfª{ø«·v³‰äkÅ>SÊä ‹Ùs#òÄ3³ÃÒÏ-Ó¥ÅõÞ>¢ý›,"{ÌL$dÜuÍù!-øç 3ÊOAæƒàrxaoi5©eöŒùiRŽ=b‘º/†$«bu˧¸àö§«:Ø: Q~Üì*Hó.¿`Cwf‘CzÝÖösç°TÑÂ÷–X,벎­â–¾Ó¾ŸüUJ‚6#ïÚ¿OÇÑWî 9]?ö.|zîT^ʧ¢ŒÛ„´)øfRŠ#úÞ÷ %k3ëÿB£Ï˜œî"Ë}¨ö:ö”sj¾u¨›yM]»¿Á8’Ðço°…΂|ùYQ×aßåQϪ¿ÞáÍ ¿d€bX€Z}b´sÝ"¡MÈû÷³÷0të4íŒ:j$#¾ôöØ”ÁÆí²@õw>0 ‹YZgraph/data/graphExamples.rda0000644000175400017540000001564513175713336017126 0ustar00biocbuildbiocbuild‹í=ksÜÆ‘X€’(]år•¸|u[.Wʹ$º}rwý„dÊŽbYQ$KÖ%öIKrI®Ä—–Kññ‰ßó'î§ìOº_Ý.Ñ=êÌèÁ‚X–{z€môô4zzzzVžÕŸ-Z–e[öüøÿθ8cÿW²¬› cx}sÐÝߺ{ÜÝÙßîŒ+~1þ÷/VÉùµtãìîÞúù 7Çÿ&'•¥.Vá¶ÒÖ¬c¡‡—6°f [x©5/åÇöÖ7{÷ÇœÿÂ{ì9œÜ°4¹èZÞŸ{à¿üÀ²…KÚÔÝm²ƒO<dî¨×ßÜNîù‡üð¯þ/ÉÃgÞ&|^‰™žÏ? Ñ,ÿÑç¡Ü =ŸCöïó¸è\qç%¾eyIý”3þSÐ ÝoÔÆàÓ„)˜ŸpµÒvßaúfÖ'õži´äß­÷6º‡ÛÃâúìÚv÷`|ѾüQw8œ?,|óÜ~wíUw³4Îm´Çt”ñ‰]3~åm˜™9 ŸûÏùYx‡ÅAow½7¸·»±ç³`K ÛsRXøœw]œÙï¤Fä%ASÎ/z‚8×é’ÿësÕY<Ü]ïzkÃÞº¤­!=Úw‰O>*îóÇ<¸{_ǰP'7Î轓ß8o¡)3Òkj£™A³bq Só¬ôlˆ¡9äâ3=½Ðýš}‚¿›}›ñûº˜õ¯¾¥ÍÁ5 ¿.áK*†’½è7Þæû½þ@S‡’ yç…WXØÆÂv±°‡…},¼ÆÂ Xbá o°p„lcá §’uú@z;çÑ9s?øŸ+«›[;þqX‰¥ˆÓõÀßüÝ’ø¬lHü.lá{&"§ZøyLϹæ1áİ,ÉëcIn”œP.-V>"|"²|>ÜO™ù!&#ý’ùB~xûqNðC½o2Ìz™¤a?Qúƒ|þ ê“Üo¦ô˜¼*ùC}#쟋‚?Š/ùý“í¨»´‘tˆô»¬—(WÔKÃý™Œ'µsÈ/ȕٮÐ|ªì<.Iã)3Ÿs¤½ËÆþ^ò‘ßJïäþ£Æs3òºéWiö&úYæ[¶;È?Á7¿ ‚_äSöŸäñŬݹáCöWtý9ÙNšÖKŠ_YŽhQ/ y²¿ÇÈ/òƒò’ßcäƒÙмòûKõ#¾¼~&Ýe€¨gr¿Éü)ú‘‰ßº‹‘qMæ_w\á—}yãûMÍCdþ)?Ì츳ÑWÊ¿‘õAæw™•¯Ñ…üÈý‹rKݯ¡ûß«HH,b‚dLÐ~—–‡bgvÎòÞÙ‚Bç 'uþú;5Ƽe½V×# [–øcYØ®ÀG¬tKèR°Ñû„•^ÞèðË‹·?mˆ1ç«ø Àæ²KÌ Ó)è„q*FÌbÄ$GLL–r‡¨E3ýÝ!NRfÇÕ«¨pW^õ»=îí¬ö{xãÁv¯‡Zweü«ªçÌÁQ¯Ì¯xè9{ÎnïH=åTMÇõú$¸´¸GSæôyÂÎDwFÐ%|LÏá¶¢N$à\æ•‹jé9¶LŸM>Dà‰o)œœnèþ<b„+F8r„û-°sµ9Ü*ß]ïû{¨¨W—#U ÷v‡½äížßÓŠÜã:yœõêä§ÿõÃãÀ#E•ÿ£¨úÝï âÊørC\^||r0ì픟¾£Ùtî?~†Ô¾ïïöÏyÆ»ÜÛÞÞÛÝÿ'¸=ôÿPÅfÏ>ëù÷Ïûpûð¹¹Ú‰ôฟ:!OèõǨ#;×®<S/ù,?0-DÙ¸UvUMrw~›óIîe¥SÂuŠœñU´/[:¶p/ݦ˜‚ΦSrWάòUÐ)èt :N)}Lèþb–YÌ2s5Ë,bbELL'‘q–\(ô!çID·6Q©ËÔ–Þ)ï\$U¾œéó]Kz>%—lùºJn)Pñ§è?&þ¢[ä•!_¼ò¢ù¡¶ð™•Ïœ’äÃÔ{e)ž/¯à™Ò”ï;?qå2-~¨-–YÛ›¸ïµ´‰¿9¥=$¶ %~èþi æ…‡Yx˜¤‡9S)Cžál΃—ˆNèþ¸VX€Â`…ç —¹H7_‹ÃñPy³y£º?½šV¬°b¤{`ÅÙœëóÆŠ³ÚO:)Ø]lª½ºŠ¥5l¬½Ž­µ{˜ºio`{íMl°½µ…¥>6Ù~‰m¶_a£ímlµ½ƒÍ¶w±Ýö6ÜÞÇ–Û¯±éöÛn`ãí!¶Þ>ÄæÛo°ýöÑ–Ž1ToŸœ`éeàt…œU!gMˆÁYrpzBΆ„³)Dál Y8}! 祆óJˆÃÙòpv„@œ]!gOˆÄÙ2q^ ¡8!ç@ˆÅ ¹8‡B0Î!çHˆÆ9²qN„pœÓSyH~ ™ô/” j‚N¡Aq@@­"ŸIóÀ/~ ð+€.Â3Þü6àw¿ø×€ ø]€ß@ý7€ ø·€ÿð?~ð?!„úïÞ‡úû€ðÔ?ü!àÿ àqŽ<øêAý#¸ÿ\ ×ÃõÇÞu‹ÇøŠÔ“2@ÔE`;¶~gè ½ø`\ýPéÅ à+€ß<©žÜœÔÀeýø3à\è‹ ëGŒè\'õêÍêϧäVJod»"ë‹Ê~gâ$ÖaO¢¾Dô R/¢ýø!ÔSúAÙÔJ?bë\7«ËäYf²^PgÚÉöCqÆ _¿ŽvGªú_Œ€Ëz@õÄ. >ò`Ò~vêyû½Mâ.Dì„âÌ6rüp‚T~5N}(ëé?×Ð'ÛÀyõÀÕ^)Ôõ3Òú£*#µ PÛÏHù±õðØú„øÈƒ”>eëŸ~¡\(æÒ“¸þF\?5®Þ(ÇÀQ(½1¦/.@¬y0¢/p?©7^½Å4ŸQ~‡ò?tõ†²+Üú’tÞ»PWÒÚ6½ëäüî'ìŽÅ£?+±AÊM[qí×¼Y鮚7Gô ê»]y0µŸ ×¹ã.@L[¿¨8®^™ßbÛ'ÀW'ýj¨§\¥GìñÀ³ö‹€¨2T5îee—”ãß™ëà¤$ý%À#ãÀ´þ2^¸i}I™¸GÚSú’6®£\;ŽP5^%µ/ÓYø2u‚yÜq*­¾°ùÓ©ø/êMÜõØþÀHüêµý¨ÏZo’nH Æ¥¤ñÙž$ÕöqpSq1>¹yÉ/¶xôæ3¶ñ‰šw™òk´Ç'€Iã<©çé•ãÒȃB?à¾é®+|{^žT_ÐÞ¨ôCŽ»A¤?дÉ[hj½q:ã =âöoUy ìþ,@îù4êMÜq…mê§ã×ê3*{¡ëÏRߌL:/N›ç’™P¥?BoFÔÕ3q¹è¼ÇtÞœlGŒ­D=I­ÉøB¨7¶N×§›GGÏ—eûR˜V¸×-e=’ç=I×%MÏsØ×›ÏFo:©çËqõ'®ÝÑTq·ÄúŒ§TæSTêÔOg]ˆÎ›‘ç91äˆG‘íÈ´×±ÙæC€SãRÄŽ¸ym]®óêÑçäiçÅrž.•ÇÛŽLê×&&Í“QÍ—ó½ý™ ÄçiªÆ¸y¼ÜöE•ÏMÆÛB½n^§ö:â#æ3Ÿ7þ:s`Z?E7ßÊÔüH¬>m7’îD|äAÒ¯…ûÌæO}®ôWʹìIÜø½<ÅÎÓ<±Ÿxbð¸qÛH>àÓÙç§µ'Y­óÄÍ{ÒÞG}ÿÀÔù)pÝìxõG’¸§k/TûÓÎe¿ƒË>Ïëy0ñ¼®g½Þw¼Áq&óõ`ÀãŽ/Üy’YïKÌ6Ÿû6ûú`RÿDWTqYå|à @Yobïk<³ý#p=Ÿq•¯s£O¦òp]„gÔŽïÌË|I×Ò>—êÍêWtÿRÒ<—´ólU\/¶_¸v\ Ûù€'Ö¨O¼ êÍêþú÷z$×x—xÿ$àqóRç×4½’\ŸœWøü&U>¦JoÒ®c³­/œÖøÅ¾Ÿê³×n“ëQºóûiåG˜>w(é:„2ßê3óË¡>ës‡€hìø¡¬GºëTÔz8› ø àiçoìû#y0_û–¾É,O<©ÿcú\€ÜåžØOr">ò ÒA}^òÿb~h„´K¦æÿIóvVªôjêzxl  ¡ü í|c®ó%tíW^WÚó3ó§GLôp+ëõ0ÕúFÜ|t*톋Ú¯½¯ ©q(óùÔç%K7Î÷\NÔ•?lEé—ý0•_!ûËT~![|wäÁéæêç –æíü`Sq.½Éúû ”½™NÜïÛþ™¸çäMŸŒ­sTž§P[¯yP;¯êÍêÕmˆÅÎ÷25O§ü2?Ç“‡±¸ò´öY°ùÍP?ís’î늫Oìy„€g‡Ê6®!>ò`âÛõ¬äß7ÕÕÝý¢¦ý¶u-À•~@òÜX¨g;ðiÅûtõ'i¼X•Gû{§ž\øÖ—õD7¿"ñ>š‘ó·Ñßg¬ë«ì 5QßMN×h컸“ž“Ã~žàfõ%:›¯•öÜrÓyÆÜ~nâõN€ïÇ~ãO] ¦œsùźãVÚõ)öx@‘7 ¸j;päÁ„ùÖ´÷S%]Š;_Ê:îÇ•Wñ~~Çߌ|OÒý2—.® ¸îþ=ãçÃõéìWï¤>_Pu^©®ÿÄvÎ-ÀȺàÆó¿&ןRž— ÄRŸ3©»OO5ž©üœÌì ÀÄû=B½±s/àútýæŽ ÄØòÞUç¤ûž<à”ÞDâ7¡>³vSûn(<í:‡öyÍP¿xR}Qí¿1~.ÔçÃ>EÏ×Iz.SÚï±— ò{5e}á²';N˜þ{ºû(tíIÚý{SÛõ™Ïוß7òê­¬í µ>Å=OK{n©ñq ¹? {Üî#õ o^Æ—lyY¿­koÒêÛw*ó’¿ùƒÑyyÚxPÚïë©ô&uÞ2સPêsšB½ñ¼ ¨Ïëy\ç¶sûŽ?ŠCg–—xìq ê§ûýµøû%Ê“®‹Rq›¬ó¾V&žw>íýèÓñ‹ãw$é÷˹âÊÆüfÀ#qfÀÓÆ—Óê•r(ÔÇÜ7l%Ö£Ðý®'·”ºXX…•Ö°f =¼´5›XØÂK}¬y‰…WXØÆÂv±°‡…},¼ÆÂ Xbá o°p„lcá §pÝŦګ«XZÃÆÚëØZ»×ÃÒ¶×ÞÄÛ[[Xêc“í—Øfû6ÚÞÆVÛ;Øl{ÛmïaÃí}l¹ý›n°íö6ÞbëíCl¾ýÛoaéøK''X:E8]!gUHÁYbpÖ…œž„³!$ál Q8[BN_Ãy)¤á¼âp¶…<œ!gWHÄÙ"qö…Lœ×B(Î@HÅ9bq†B.ΡŒóFHÆ9¢qŽ…lœ!çô\:ð~̾µJί½ò•É»2±½–‡ÏIøü·'ïR Tm¾;VºÃ®w}ß5¼>»9èîoyÃ.fýÀ«ÚÒ®Iøu _R1´8èí®÷÷v7öb°tã- r%ÿæó¾Y<Ü]ïzkÃÞºd¾„&ængo½çS‹Jéü‘îÞ×c),É7€ÙõîñsTùÙ“½#YÝ;õ‘ÓÀ•¹½½çkB¡g'(*úÜjw¼6AñÚÕíþêøÞI¾±s§ýÍàíT:톯u7C¤Æ÷NªÔ«þövoÜì}¯©öÀ Éݰ,·¥ SÐ)è\j:¡û/·É,¼…Â[ ½…›Vî&B¡!þ¦ôÊϹ^©WØ0R‘‹ÇäÌ+WrÊ™ð± <ùZ~>±eâgåAž@HÉÅ,_Q9Éý¦â‹—Ÿ¼Ñq„\$ýa¢?§4óžä޾“ž…|Sk£fä|ÔÏ´gC›áwÉbäÙe€iÏèÏú=D¹Ëï£n.»tß®%ñKå”Äý2±ÖÏÄ÷u22€|Ë3L*w*{·¨ÔݽƼã×ÍØß”¿Bñ©yvS;®jçºP~ƒ¬MVþ¢v-nN©—”:™oÊÏPåäòêíÛ'ªo‹›¶¿*}Ö=ÃÇŒýõý8Ô ä—òÛÒ~‹…™ÿˆ¼u÷ˆë~ÛL–¿)}Qñ÷ì ‰o&~£óOäåJùk*™W®sJ¿Gæ³Îúü¨ûWeÏTïóxæZ ~©y35_6ã—ùý*÷§ÂMþüÐýïU$ªˆÉ1Y2&ûñ{õ&L †³¡Cqß%»÷¡ë)ß7¥©ø5Nëî¹Kxf—Å3>üRŒ»ª³Ì’ž]–¶Ý¼í½™:îŠí¦ú÷+¢ÐLíà¢ãÏw“¾Ô|å‚ýËÛþ‹ÌÐK:¦ÞoÕ š{d™ÚýäüÛo%lÖvNÈ á™ÍÚ;Z~¨7² ùýó÷޲(ÇËñÞ}¨ÝnÔ‹h÷åö'ÔïW ü^Éï]ñ~y0r¼Xï×ÍÄëâùòË~Y?PùÕ۟梓ÜnÈú ë?0{ÝùbÙçÊ+‰è¯¼n9äµÄ¦or>ŽÙyO|û¢ÊWÈ·}‰ïwéÎS-I>TÞÁÅð»øôBs=uÊzÁfï°Ý‰íÞŰwéýJU¼Gwel:~%»žÈö ±ÞäSOÌÙjœ¹þkörCý)ä–LnòYÍÙÈÍœ?#ûŸÀ´¶£¿(ù˜±CÉãq×kò0¾Î&µ7ç~™*žclü‚eÞ7þe^nÞs.œ+ÏßuýZŸejwíw{C÷Ù2ÌÙ2EnZ‘›Fæ¦ýØ™©·êM¿\«‹òrkËÍj§¨oˆúFÛ¯oUr Ëíjëgë•fMü Ù¬Š7+µ*–Bã224[íT;qa¹%ž0f¢í—Eýlu¹^©úH«å·­]k~º)ðóV£ø…`°]_îøŒ·*~9X¿ìK¯Òl‰ßÖÚâžv¥õcÉÔê¾X«@Ùg»Ù¬û«Ö|é5kþƒ«•Z€hÃç¢VÅòlµY[n‘V஀6Tüö%ãKÌoO£V÷·M×Wõ¢ ¿'n·|&šÍC>¡F¥R÷‰¶‚Ì´*ÀP¥¶ì—}™ŽéøÊSoûbYn·L™\¨¶ƒH ßšMÿ¶VE¼3NÕW€FÇï·z«P€NͯoW÷Ô³Óôù^°Ôj‡$éK R ¼K¾–ŒË¾¢wü7zò뎸Ҩ5[wÚÔ¸[~}ÕWÊJÇ×±f5 õí€âVý7·í¿Uã²O¹hO»x)Û­à•€lšË¾uhvü— 1~S‚­óÍCµìàŠ¸©Ó®û7ù-ÿz¹y£ãwRÇ·!cRþ[Ó¼5­NÀ|úelN=ßlêox3ð€fàµôMȸ\”F7¨u_2õe¡î“r3ðÁܸG«lš¯ãrÓ@gÙŸZ!â—;U_,J¨«Ò®5}6ªE ¥üþÝPHŠ‹N g£wŸ•Þ51u©ƒ<ÀcÕå{þàO®ü9+ŸþÑ8µÁ©–|,û€pÜ9Óó¹è”ܧ.'_%÷E™“ž-äüÍ'Ý¡gxìüS¯Ü¿²>'otÆýó¿—¹}3âsøù’'€¿xq™ÛÍEÇ·krùÓ™þ áȃs9å:#ž!´§/ÎòØ%棸èÌ 9âg<~‚þúÙøsÀŸÃ}ÏGylOÞèØÂùÅŤO¿b¦÷ôŒ“ž?kˆ.ïgóF§äþÌ*7.:Žð‡P¯»/8ùäÖëËJ§Ä~ˆ*ΣžŒxéâÔ÷g¼tq^÷‚U|ýó].ù²Ý§ÐÍ%3bŸûà8ù-áçÍØèñiR£/rÖ?|íãŽ/ãÆEž‡ðµïogœí+á¼6wíü‰¹Üó‰*+=G|îñ,€¬í·E|öG—W˜éqû}˜ZÛò“7:¶ˆO=9»Ìí,a“Mn¨?Œò(·ú‡Lôñ9Ü^{Ý®ËI¿„ŸÑe£WfmÉu™éý†•ž-â½/˜ù|ÄÚ/y£sÙý>[Ì»åËÜN>}àõk¹í_¼ö'ot¸ßë~†=gíäk¯ÿ\ÂÏÔ³ÑãŽ#q·—›¿;9—ïüíòó•w}Ë7=×KÙ׋?b¥ÇÇoœ¨”þh‰Þï™é=å±øÚ÷Œµ}Üò*ažPrz¡û‹Í'þ/ŠÍ'Åæ¡bóI±ù¤Ø|’§Í'8p;h‹´‘´ ðs¿úäb·ÓBνւÎ{C't¿ Å/,mai‘%ëÿ@ÈTÍ<›graph/data/integrinMediatedCellAdhesion.rda0000644000175400017540000000535713175713336022054 0ustar00biocbuildbiocbuild‹í\[l\G>{ή÷ìæR·5¥…ºåÖ¤Ùk;uË¥g½vl7N²Z›(¡/=¬×öÒÍîjw­4ÒyH &/HˆËKß*U!Šhâ4ª’¶€H}‚ q{àªJ‘PÌÌ™Û?çì±½c;Ù…±t<óÏÌ÷ÿÿü3³sùçœÂä©LúTÚ0 Ó0môßBѸ‰þÅ £?…ÂÔì±\vºáÖWŒ˜uW 3Q­-–š(ÒžQ\Ãg¦'@ÎpÓ…‰ /qbžFûfÜC·É2 ⼧ ,?vZˆ’^k•+åÖ9š˜UàTRÞ¯j¤ƒÔHªJþˆ*pö¼0î Q•éb=ËQÓ$£N††c4<¼]ÆCM¤áÃjŒ… >FÃìöš\ÓQ51UãÇXUnÐtÆi]‡U°æ{HÅš‰7ßÇÕ%ØïE¨ç2Æ9Õ*Òª9ŸPmEÛ˜Î'©äGT%+«ì(Ï+gTYUà„Z-&‘Õ•Ík Ø%-g‚JÎÑpJ‘éL˜3©jÄ)e ªÑ;ŠÉÚÛ™U5­«jÇ1iªÁ´ªÑrªÀUk+.iv°«ªIôvÝÐÛu£7¶ë¬óò^mã^=é¶Ü6‡RñEœNFÇc[ßí’8[*/¯´ŒŽöÉ©‘©‘©‘©‘©‘©‘©‘ù¿Œvw£¶©‘ÙMH©Äc´D É{à,Þ& ütœÐâTžÐâhž0çæ¤€81Dz8ù·s‰FÌ!DÌ=qàocúû4,ŽŠ}l\4LsGAE=ÉY&”'|Iõ„ß ‰¢žðØ(êÿÁ˜n{”ì—Æ%=áb؃¢ž|mcëyÂÝ@h`AŸ†ó„ûÁFXØIL ¼O ¿E “ÐIAŠs„7Lí0 •Á4ðmøÅ…#‰t “еaãà˜ðË ¸j)õ.Lo‹ãÀ)¿b@`U i¬©Ý/¶Ÿ"¬å—˜‡5J‘á¦I¢(Ð1…IX'?_¸l’¨(ìN˜­ƒIÐ:˜” „€'&ågmh‚ð %‘h˜r<è*²qp¥üLÀ …3=àD²qÜž¤õ"÷èoM yÙKKîj¥ÕÜî Ç9&Š·‰ÙõC1n«ÕðyrádÝ->á.—wÂcÙ¿î3«Œo¤ËŽÁ>¬ÞíBÝd€¶×7Ö'r©o¤@ºQª.–³Õ¥šPÁ ˆ¬˜w¾m&“Ó.3^w`¨"P…ª¤üÌIáMÚÙ^,7JÅVi1Ü„—ö jÁ{Q¦¯^—éo|^–{¶Ÿðýy=ʹÒóûœË é—ÿHÃ?ÑðÏ4$Íá\Ýq çò¯hþ¯iøþ–„/<-ëõÖ/§ôužvÒË|ÿmÙ&/®^oUd›¬½&ã^ªø¼)Ó¯~S¦_ü+¤÷:_$mç\x†/Ó¶ÙÒVÎkÆyÆ(ýJ¿Dè_üÃñ÷ŸòÃÿ$ò’Ü >ó½‡ez­)Ó×¾-Ó_ûŠLõ ™~:.ÓÏ~Ò¦så6¢ç•¹ÜåßÉô+œ—p?üÁ];ÓÎó×Húó?¢áIøê{Iø÷ŸÊ|.=GÒ/ÆÊ×y}ãR–±œòï ö³$Ñyå)9í_$}íþ[–ñ¥!H'œ' í<éÐ0OÃÇiXêd:×>ç×ǹòs™÷wGaYøÐþøOš­×ÿÇëˆÞ[<€Õ8D÷CÓ§es®H vw“4ÜêhcÊöɘ4ÂÓuÛý%ÜBZí;ãCïÐÂhk=°9ÅuÜGkbF,Cb™tnó€ÏÑ¢,"M[Œ3ë"±U‘µóÚïÇàš¬³öbëòù‘¯g_¯9—z )•è£%BŽ*ßX´gëº8ÜžÞ;r†˜^¿Á‡–{Ö£(÷è}zÿf ©>Þ›š<½Z½ §Fšª`õ5k«b›mŽC&¬beMãlÂJ¸ä< ¦ðDtÀ¸i«5½ë‚ƒœÈšðÅÆÀäjÒÇ /›ÄË—Jsw,jîVáHÏùCërÝÞò%¥ð˜*Ǿ(އU9&£8>¨ÊÑŽâ8®ÚL)ÒßÚ7ÓC4bŽ*u¬]:BcÓ§°4è)Sç:ìÔAy­»'’e§–ê¸ZêvèTZ©‹ãnr znè>æð)õx¼íÁÇR8m <SÖã<Æ»k¦Ó¾ÅÅ%©¸÷Eˆó‡n@Úˆ’4“XÎxW¤õ¸¨Œòè 6MÌØVƒ`Ýî@Ï»£tÎdxLy* „ë¬n†;#Y*Ï?wE²ìtRÏï‰ÔAy‚¹;’¥Ò c-±µ0›ö#8#::ûÁðg¥ .¯€Ú(ÅJâë{Ðs_dÄOÁ0)õ,<ÑsoÔálDy€½?ÒDÊk§ iËNÍ >v¸ëšÄR!¶¢)ƶ/!êÑøÌ6¢<î‰låÓû£XŽ*°›´H” 0ô–\oÉ#>\Òö<9ø©Ñ®?¡ÕHÔHÔHÔHýÒ±Fj¤F†v‚ìâÝ&ïÌöØ;²›½ä~‰s×_Úì‰×2õ«—ê¯^^¯ì·(éØ×7ˆŒ®¿At³ÞV !‚B‘WM™c@ñÖ-æÅï‚XB¡RÛ”uÀµë=OwõÞ¹,o–ñu¸¶ŠìúU9~x‹oH#'xeÛ¤Ï.Ý¢º‘÷·M*ËŒª —Óm—¹·úºÈFgïv¯í04²£=˜MKlöŸÎ¾Ò³ÉWxÀguôºPO–Û[ûÈËÅøó&ôƒ$a®V\mÎùó+ÿf ,`7W?3=Wn¶˜èÿGÑWósgraph/data/pancrCaIni.rda0000644000175400017540000000137213175713336016325 0ustar00biocbuildbiocbuild‹íXKoÚ@6C"AU¨ÔGz(jBšRõP  ²!§•r]á A!ƲM«Jû£û ’îîxmü( ®ÚK‰d<þf¾™ñî¢oˆ¡ÞœTn*’$奼L? Ô,æéGN’ªez¯ØÈ;}4´¦R®ð2æÝ²æ&v©Q¥×‘5C¹öííÑPk§âÉPô UøJŠqyq>84EûÒlC›’”Ðî »ùUóíBOQEK}åzôAü¬ŒN´ã¥ò½QÀ骰·®Z/ëõõ=pÑZä¡ã?4Ý…m;ØuÈžÛ^ëµï¨6Ç?¼¹{ßj8øanø^YÞôM4ø°©^)¶3ŸMo[‰xv›c<›5Ü…óaÑ…ÇæëtÃj°ðüNÒ>[®ݺ—} ¾{è!ؽHf>.eÝã'„ÒYd)>=‡ÈÚÉu_-—_‡ØXŸÈZe§˜^zí¬_µ™­jÞ¿ï¯_±•mò‚Ø=ͺÂo³ÛÙé€^‡ëV\»Å ïô.ëb¼ÏJ<ûÇÄÿ… ØÓ_&±ÞÁFÈl#Tä¡”‰¡h26´?ÕŸ~®<ÕÛßñtrç¥}6Ì sÃÜ07ÌÕÌHûuÀ"v˜.!ˆ*sÄn)FÈ$‡öAµ„@rÑhô’C»>‰€nBMF! ž9ÀÆy…̬C"´4(¦!¨˜C ªˆU%¾´ÂÊFI &„Ó¦ˆPcŽñ¶HŠòÂûBÄ×ìÖñ±oÄô\PÄÄ—¹ê<-IìÐßI÷'ÄÛÄ·h1óÜ?=fá\6ž!—¥[—‘ç9|Fˆ—l4¾G˾5q}É“-³ÿBDçmÖ^-l·{–ŸV÷SN —«¨8Ø2±3´nça ùXÉ䜚êuÒœE91bâE–{Éð*eîTÃ!-cËæÔÁc›¿9|ø£ß&O.6/ru®?³Céñ)‚8‚©graph/inst/0000755000175400017540000000000013175724651013671 5ustar00biocbuildbiocbuildgraph/inst/GXL/0000755000175400017540000000000013175713336014321 5ustar00biocbuildbiocbuildgraph/inst/GXL/attributesExample.gxl0000644000175400017540000000226713175713336020546 0ustar00biocbuildbiocbuild main.c 555 1.234 true false test.c 225 316 127 1 2 true false 4.5 42 graph/inst/GXL/c2.gxl0000644000175400017540000000573313175713336015351 0ustar00biocbuildbiocbuild main carey max min a b 8 19 graph/inst/GXL/complexExample.gxl0000644000175400017540000000565113175713336020027 0ustar00biocbuildbiocbuild main max min a b 8 19 graph/inst/GXL/createGraphExamples.R0000644000175400017540000000035413175713336020372 0ustar00biocbuildbiocbuildgxlFiles <- list.files(pattern="graphExample-[0-9]+\\.gxl\\.gz$") graphExamples <- list() i <- 1 for (gf in gxlFiles) { con <- gzfile(gf, open="rb") graphExamples[[i]] <- graph::fromGXL(con) i <- i + 1 close(con) } graph/inst/GXL/graphExample-01.gxl.gz0000644000175400017540000000046113175713336020310 0ustar00biocbuildbiocbuild‹¢`áCgraphExample-01.gxlÔ»nà à=OØ !·6QœLQ—¨s×ÄàK‹8_ð¥Ã‘+ýƒ% ÿ§Çû㫺±§q÷ÒÖ Wb·Ûç¯Û.<,¬Ö÷8Jxá}³“²m[‘?g…6òóû,Ãâ›Jh¯y ƒu—¦`¥Nx7ú:93:7•Õ&áZ—ΤÞô¢'uXêÄe˜”ãìDæ dR £Œ2ÉLdJ óó&~†.£8Ëœ­b3™·¤ï15a£Ñ¸YsÌj4¯³&©³!Fæ}4^çƒä<[b½©9AABÑ£A ‚#©%AHïÔŠ ¨k‚ FlʦPÿÖÝkñª”Ã]y˜ý s•RMgraph/inst/GXL/graphExample-02.gxl.gz0000644000175400017540000000041713175713336020312 0ustar00biocbuildbiocbuild‹¢`áCgraphExample-02.gxlÓ= àÝ_AØñ[cu2.ÆÙÕ¶M,T ­?_(e!5¹¡ åÞ'À%w8}«7j…6¥’fd†OÇ :äß÷Þ}ÈU¥ñ« ÖÖ{J»®#ySkE¸ —û•ºâ”F¸åØÑÁêG] ’g¸_ÝÎWŒÏE¥¸Èp#y©ÅÓŠ ‘®Ô 9lÒ¸;’Q€L È| È@Æ2 ÓþÏø÷†ÑK«Ê?Y•ô§FÌ<Œ˜EbÀ,£1ðsVÑØ`>³NŒ˜M4 ¼oÛÄ@ÎÙEÓÂ{Àf ½\øë§Î2&ù8ù/('Eëgraph/inst/GXL/graphExample-03.gxl.gz0000644000175400017540000000033113175713336020306 0ustar00biocbuildbiocbuild‹¢`áCgraphExample-03.gxl‘=ƒ †w¹½PÚÍø15]Lç®Ö£j¢`«?¿€ºÛ8÷>.J§¶!¡ûZÉ8=Cš$*§&´‹ØTö®Š¡2¦ Ç‘–C§EÁîÏŒÙðÄ)§h¬º¸:ï*Rc ¾zÜ2 KÑ*1 k- #fcV¤¼‘/M¶vw˜×¦8ÀàoÆ=×3È[«ÖHŒÚÜí¨ç²qòÎuuð3ïü§º9±ePIð~½ÍbÊgraph/inst/GXL/graphExample-04.gxl.gz0000644000175400017540000000173513175713336020320 0ustar00biocbuildbiocbuild‹¢`áCgraphExample-04.gxl•ÚÉnÛ0…á}žÂð¾6©"ƒ «¢› ënÓH±xЇXòÓ׉c8HŸ‹q|?X¹<¤ä‹ÞÜ·‹ùà½Ùlg«åíÐŽÌðþîjp3iç×§ƒÓ»ËíÇO·Ãén·¾‡Ãh²_oV£ºÿúó0>½ùÃŽì¨ÞÕÃý²›Çõt0«o‡Ÿ?ýþù04õ¤Y¬êæv¸_Ö³Mó´kÎâL–§·>Åã×/Ç—ß~SóÔ<šÔ4 æÔL@ÍÔÌ@Í ¨y5sP³5KP³5kPój6 f jv fjÞAÍÔ´ ¦5Çÿ×|lãÏ;DZîsAd»ûBІ >ï¼åÞ Bƒ…J9#¼Dž,}DnÁ"‹¬ ²ÝC&ˆ$"ä‚H"B!hGPŸˆß¹Á "‰• ’ˆà¡U„3ƈ"‡„5VIŸ5™(?krQ$Ö¢ÞÒ\ãÅ ¹yX£ÉØ#¥ÑxGªÏF›0‹ãË–?8Û8¿l†iq€Ùòg'˜mBæã³MÈ|œa¶ ™CÌ6!‡qŠÙ&$*Ž1[~Z«Ù@‰Ê4¤últüܵq”Ù%¤7Î2»„UŽÃÌŽG²qšÙ%œlqœÙñ›¤óÌŽß%mhv 9ŒÍ.!‡q¤Ù%$*Î4 “û8Ô<&¬WœjÖ+Ž5 w¢8×<&¬rlîDq²yLY// q¶ù¥ÚïÔùÕç[8½üzÕÎï®þÓ=,!graph/inst/GXL/graphExample-05.gxl.gz0000644000175400017540000000026313175713336020314 0ustar00biocbuildbiocbuild‹¢`áCgraphExample-05.gxlm1ƒ …w¹½PW#:5]Lç®MïŠ$ ±øó‹H7‡KÞ½÷¾\®í·yb_ò‹¶FBͯÐwkÕ65iXJͲ+ c®"ÆÈÕê¼åHâþD /5¯9„„Ö¿ÜÈ4JÈêq€*š-’„Õ öôtbR” *¦ø»'ÏYçØòÁýQžèªp ùrægraph/inst/GXL/graphExample-06.gxl.gz0000644000175400017540000000040513175713336020313 0ustar00biocbuildbiocbuild‹¢`áCgraphExample-06.gxlÓ»‚0€áݧhºÛŠ·NÆÅ8»[ B/Ö*<¾-……`r’ÒóÓIÇN6èËí»Ò*à Yác¾@Ñ5©ÿŸªw8e¸tΤ”¶mKÄÇXM§çÛ…úá2! aŽaOkï¦DËpºž.q&¸ÔŒgø£XeùÃñ("Q~Ô >\Òñv¦)4% ©ÍÐÔ€¦4Ð(@£4¯ÿMXyß$V˰8äôdÇ¡š1ëÑÈh €ÙLL0ÛѨhÀì&¦˜ýhL4圉ý£ ï1_ü÷륪graph/inst/GXL/graphExample-07.gxl.gz0000644000175400017540000000052013175713336020312 0ustar00biocbuildbiocbuild‹¢`áCgraphExample-07.gxl•”Ínà „ïy Ä=&$ýâäTõõÜkR6ŽUÆuÔ§/Ø8bà` ³óíbψÍîÂ+ôª)¥È1Íx·¡Mq©ÖæA¦*»ÊñYëzMH×uYÑÖJf Èû瞘âœf4cšaƒ:Vê3*YŽûÕÇÛ#`pÉ Ç­`¥‚/ 1 ”zBµÂm“qߣ*…V2ÓìXEè¾A ˆþJ~,!BØTuÜ 9ð˜†Ý!²_¤R@VY·zÅè¤$wi9qÈJ=àrÈ•‡¼÷;€>Œ¨34aêãˆ:‹{tš‹ý4ÒƒïiðóÍÛ0¤Ñ/>z¿üz=· MJ7ƒÿñi C<õò÷é Ñ×|Ù'N^ùØÐàá­¿ÈìÝHÜå¸ý~ßÞH>graph/inst/GXL/graphExample-08.gxl.gz0000644000175400017540000000066413175713336020324 0ustar00biocbuildbiocbuild‹¢`áCgraphExample-08.gxl•–ÉjÃ0†ïyŠA×¹^Ú,Ä ¤ ¡ƒ›å*ÕØr•Æ}ûÊ[{qÚ1Ø`3ßÿ3£±GšÎó$†O®2‘JŸØôÌg=˜Fy<17˜¨ÌŠ'Ÿœµ¾L,ëv»ÑèzQ)eÜZ7– ljS¦1ÒZ«N—3æ“òéuµ!ÀYÄ“”qŸ\%Š¿k^)*‰4¡Rñ¨Ï°bB›Œê°ÕÄ[è§Nô‹Ô\±“>!Øa'çýp‹ F‰ù!b¶DŒ!b,“19S1%³#böDLEÄÔÿÇ -¿Å×ÉÚ¦šât ôoˆzb‡1£ÙF‚až£Àl £Æòk‹À0ωÁÂ$“ñkKÁ0k fqB² šF!çS•“Då¤Q9MãPð£*b@TN *§“SÊ4MDÉ77 19…•“Då¤å Š š&b÷Bõ@ÔvœbfO€˜>Iˆé“ 1}’PÉ i"ö/ü1i@LÉeˆ*y ˆ*yˆª^ ˆ©ž í4MDÅ—\…€¨— ˆ)¹R€˜’+ ˆ)¹Š1‹Š1‹JQÍM1ÍÕ =ƒ¦‰¨ù‰Ð! f"´D½*@̦5 ¦¹:DU/T=CãÙí®?½Ÿ]«åÛuñ:D6graph/inst/GXL/graphExample-10.gxl.gz0000644000175400017540000000027413175713336020312 0ustar00biocbuildbiocbuild‹¢`áCgraphExample-10.gxl1ƒ0 EwNyoRVD`ªº Î])¶B$HP Çotc`°dû¿7Øe½Žû’›µ5r~‡ºÊX©Ö¡ˆÅbjæ­“Ð{?B„¸Z&g9’x¾Ã[ÎsŽ!ª‡ëÚ©g%¤îõh€*-’„Å vÔyÚ]11JF{,Å{Â|.0Ý/0tÆìS:nû—8Ve?¦Í xRgraph/inst/GXL/graphExample-11.gxl.gz0000644000175400017540000000032713175713336020312 0ustar00biocbuildbiocbuild‹¢`áCgraphExample-11.gxl‘±‚0†wŸâr»­] …ɸgWc+@KJ¡èÓÛt0šthr¹ÿû’濼\úfiÆV+ŽŒ°,v×K—ù>Uc˜86Ö¥Î9ROƒÑDHzºTÔ‡{FV W7×\‡ZÁ1Nçc… E-{-$ÇI‰ÖÈ›•«±*ÊGѰے¾·?˜)™—À, Ì#yþgB5‘aw£ûðy°ú«‹@ņé§âp+º«Ø½^»“Îgraph/inst/GXL/graphExample-12.gxl.gz0000644000175400017540000003157513175713336020324 0ustar00biocbuildbiocbuild‹à`áCgraphExample-12.gxl•½ËÎWÒe9¯§Hä¼3ýÜÏ)Ô_5jô¤Ðãž*Sw‰¤’wñé;þ‹|9 Ë ¤¤Ø ±lÛ¶ü"þÇÿúúæ÷¿|þáý‡_Þ½ý·¿¦¿ý_ÿó¿ýåüôõ÷ÿþúß_^ÿõí‡ÿÿöן?~üã¿ÿýï_¾|ùÛOŸþxÿîoßÿð÷ÿçÿûßýÇÿ+ý-ýíûßÿõ%ý/íûïþøù/¿|ÿoýÿ÷ÿþßÿû¯ùáûŸ~xóîûþí¯ŸÞ~ÿËûþùñ‡ÿTü§äíë?ý‡â»ÿú—?ÿíÍcþ!óOñ˜ïÅc~ùQ<æ'ñ˜ŸÅc~ùU<æ7ñ˜ßÅcވǼy'ó‡xÌ¿ÄcÞ‹Ç|ù(óI<æ³xÌñ˜¯â1ŠÇ|ùN ªšT5ªjVÕ°ªiUãªæU ¬šX5²jfÕЪ©Uc«æV ®š\5ºjvÕðªéUã«æW °›`7Ân†Ý»)vcìæØ ²›d7Ên–Ý0»ivãìæÙ ´›h7Òn¦ÝP»©vcíæÚ ¶›l7Úÿ‡Ùþ÷ýJýËïß½ù÷ü—ï.©úßu£É§æ{¯)Í?„¦žšü¯Ó.óëô‹æŸB3NÍþ÷6/ó{[ù½¥ã"úÁˆ6 ?ù?QÊÑ÷FT."õÛ«ÑF´iøùÁŸ©_DæeJã"R¦y©?Ó&â—{\DæÏ”ÓEdØËù"2Där™g/׋È<{¹]D?Ñ&â×ÏÞ¸ˆÔ³7/"õì­‹È<{师̳WÒEdž½’/¢_ŒhñÛƒS/"ó:•v™×©ô‹H=åã"ROù¼ˆ~2¢u™§¼ѯF´‰øÝ¿N5_D* ”‹ÈŒF­‘yÊk»ˆÌS^ûEdF£Ž‹H½Nó"R¯Óºˆ~¢¶‰xó €¥‹È¼¸-_Df[¹ˆÌ¶z"Z»ˆ ­_D†ˆ6."CD›‘zq×Eô»õMÄ[ODO‘yq{¾ˆÌ‹ÛËEd^Ü^/"óâöv™·÷‹È¼¸}\DfÜû¼ˆÔ‹».¢7B46ï<#]DÆ#F¾ˆÌå"2DŒz"F»ˆ £_D†ˆ1."CĘ‘ñˆ±."ƒÑ¼a0šW"ÞÑ&âGx¹ˆ {³^DÆÂf»ˆ °³_DÆ÷済 ås^D†ò¹."Cù:."CùJ‘¡|]‰0”¯+†òu%ÂP¾®D¼3¢MÄ¿<åk\Dªkš‘¡|­‹HU@ÇqQ©êãH•A6ù¢2̦£\TÚtÔ‹ÊP›ŽvQlÓqà ˜Ž+ÆiÓqEÛŽÍÆûý[Ô—ïpÑ_¾Àa˜ïp æûF…ùþQÑa¾@T”˜ï-æ{ï„)jÌ÷ˆJW6QùÊÆJueã_JµÙøð¤/•¢7ÊÌ8Œ6óãÎüðÀ£Ïüð€Þ(4?<à0Í8ŒJóÃ?ŒNóÃzË• Eo¹²¡è-W6½åÊÆ{¥Úl||À|4›0ÕæG7Rt›ø|”›ÌW´›LJÔ›LJô›LJœLJ4œLJ½²¡&¥^ÙP“R¯l¨I©W6Ô¤´+”j³ñéÁ¤DÑùéóÑt~òGaŠªóÓæ£ëüô`§DÙùéÁ¤DÛùéÁ¤DÝùéA"оóÓƒùŠÂóÓƒùêW6Ô|õ+j¾ú• 5_ýʆš¯~eCí”~eã£Rm6>?˜¯(>??ØDÑ|~~0•Q}~~°‰¢ûüü`–£üüü`*£ýüü`¾¢þüü`¾¢ÿüü`¾¢ýü`¾Æ• 5_ãʆš”qeCí”yeCMʼ²¡6Ѽ²¡æk^Ùø¤T›/¦2šÐ/æ+ªÐ/æ+ºÐ/&%ÊÐ/öW´¡_ÌWÔ¡_ÌWô¡_ÌW¢_ÌW4¢_Ì׺²¡æk]ÙPóµ®l(æ×•ÏJµÙøú`§D/úÕ3Ÿ£ýê3[Ž^ô«g>G/úÕ3Ÿ£ýê™ÏÑ‹~õÌçèE¿zæsô¢_=ó9zѯžù|\Ù0™-W6̤äteÃLJNW6Ì&Êéʆ™¯œ®l˜ùÊéÊÆ¥Úlüé7QŽ^ôO?Ë9zÑ?Ìrô¢ú¤—£ýóD/úçˆ^ôÏ½èŸ zÑ?8@ô¢>p€|eC9@¾²¡ _ÙP¯l(ÈW6ÌÕ–Ë• ååʆɢ¹\ÙP¾Q®l˜,šË• åÑ‹~{0ËÑ‹~óY4G/úíD/úíÁ,G/úíÁ,G/úíÁ,G/úíÁ,G/úíÁ,G/úíÁ,G/úíÁ,×+j–ë• 5ËõʆšÊzeCmózeCÍr»²¡f¹]ÙP³Ü®l¨äЮl(hW6¾*Õfã»ïŽ(FO™JÑŒž2eQž2÷Cë*S–åè)s?M‘®2e:Qž2å:Ñž2e;Qž2å;”( é DmöJ”‰tP¢\¤ƒe#”( DÉ%ÊI(QV2@‰ò’JþT2PòMÉ6%ÿøÇ Šºô”©¤}é)SÎ…é)SÎé)SΕé)SÎé)S¥é)S­é)Sµé)Syd‚å%”(/™ DyÉ%ÊK(Q¦°@‰šîJÔt/PòJQ þóÉÏpGƒzÊ”+D…zÊ”+D‡zÊÜO6®«Ìýlãq•©Ÿš‹õ”©ŸoŒõ”©ŸpŒ"õ”3)Ѥž2c&å%æ"*(1ã]PbÆ» ÄŒw9@‰‰ %ã %J%ÆLJ%ÆLJ%&*”Jþ¡~†6jÕïŸ|&Dôªß?øXˆÅê)S?³Íê)3T¢Z=eêçv£[=eʃ¢\=eîg¬ËU¦<(êÕS¦<(úÕS¦<(ƒhJ%ʺ2(1§XÉ ÄħR@‰‰O¥€å¯”(- De%Ê( (QFY@‰2ÊJ”QP⯓*ŠÂõ‡ŸjS¢qýáÁÛ”¨\xðÙ6%:×S¦œ2J×S¦œ2Z×S¦œ2j×S¦œ2z×S¦œ2Š×S¦œ2š×S¦œ²å” ”(§l D9e%Ê)(QNÙ@‰rÊJ”S6P¢’h%Ê`(QÛA‰2ØJ”ÁvP¢ ¶ƒ•D;(Q×péÀÄùy'ÎÏ;@ù^yet°?>ø±ì>D¬DûãƒÏ+ÑÁž2õg‹öÇ@V¢ƒ=ej}D{ÊÔúˆö”©õì)Së#:ØS¦ }€eè”(CŸ Dú%æÍ‹2A‰Ú”(CŸ Dú%Ê™'(Q;A‰²Ø J”ÅNPâ,ogy œü |!jØŸ|4a‰ö”)«Œö”¹'¥]eî9éW™{JÆU¦¬2ZØS¦Oì¸ÊLö­Ñž2c•õ%Æ*ëJŒUÖ”«¬(1VYPb¬² ÄDæz€ã°õ%&ûÖJŒÃÖJLö­ ”c® ”c® ”¨0Z0QÎ\8QÎ\@QÎ\HùQ}À^4±??ø`ÖMìÏ>šµF{ÊÔ“Mì)SÏe4±??øT×Mì)SŸ:Mì)SŸ;Mì)SŽMì)SŸ=Mì)SŽžA‰rôJ”£P¢¬¹€å±”(- Dyl%Êc (QfY@‰2ËJLŠ­…^¢Ì¤ÒL”›Tº‰²“ PœÇVú‰2”JCQŽmì/>`ºFû˃O‹®ÑÆþòàó¢k´±¿<øÄèmì/>3ºF{ÊÔ3mì/>lºF{Ê”ÉF{Ê”ÉF{Ê”É6P¢L¶›(QÞÜ@‰ŠÍ ”(oî Dys%Ê›;(Qù·ƒeé”(Kï DYz%ÎÒ;0q–ÞÁ‰‹Í 8K ÅYú*ÎÒXùÙ}:õ†å×_¬‚(d}ðyù5 Ù_|Ž}Böןd_£=eW™{&×Uæ>éû¸ÊÔ*ˆBö”)OBö”)OŸ D¹ì%*8OPbzÜ:A‰rÙ J”ËNP¢\v‚e— ”8»\ÀÄ%ÙNœ].€âlog{ ¨8Û[`å5­QÊþöàK+j”²¿=øÚŠ¥ìo¾¸¢E){ÊÌk×¢”ýíÁ7^´(e{ð-JÙß|ëE‹Rö”©ÜRö·_—Ñ¢”ýíÁf´”¸¯b%&Þ·”˜UÐ(1»%PbVAK Ä¬‚–@‰Éé-“Ó[%fƒ´JÌi ”˜ÀÝ(1¤%P¢6HËÀDî–Á‰Ú<-µyZ)*¨· TÔÆj¬¨Õ2`Q«eТ6VËÀåWåaÑÌþþàkZ4³¿?øâŸÍì)sß“¯2ÅJ4³§L¡ÍìᄄE3ûûƒ¯jÑÌþþàK€Z4³¿?ù hfO™Ú=”˜{¢UP¢–H%j‰TP¢–H%æ i”¨ÝSA‰Ú=”¨ÝSA‰¹^Z%jeUP¢VV%ne5`âVV'ne5Ú‰ò“RÜêi@Å­žVÜêi€Å­žZÜêiÀå7åaÑξyòefÑξyòufÑξyò5cÑξyôEcõ*S/]´³§L½ÑξyòucQξyð…c-ºÙS¦˜¨fO™Ú=”˜÷'Ú%ê\ DmºJÔ¦ DížJÔî DížJÔ D-‘Jœ©O`âî NÜ2˜´å'“~¢ eÒP”£L°â–Á,nLÐâ–Aô³oß>põègß>ø&ÃýìÛßeØ¢ž}ûàÛ [´³o|Ÿa‹röíƒ/'lÑ;}ðõ„-ªÙSæ¾²²_ejD1{ÊÔ2X D-ƒJÌ2è(1Ë  Ä,ƒ~€s¿ô”˜ÒPb–A?@‰9DúJTÄï0Q.Ûp¢\¶E¹lO E¹lO@E¹lO`E¹lO€å×í»_Ú£ =eê{f£ }÷à{E{´§L}Am´ï|!i‚ö݃oíÑϾ{ðý¢=êÙw¾a´G;ûîÁwŒö(gß=øÂОA‰1õžA‰rç J”;gP¢Ü9ƒ“¹{%Êf (Q6[@‰Éܽ€çΘ¨¬Þ 8QY½€¢²z/ Åm‘TÜ)`Åm‘XÜ© Åm‘ \Ü©àåwõeÖ•¶¢|¥ÒW”±DGûǃ/îÑÑž2Egt´§LÁí)sß¾®2÷éÇU¦ÈŒŠö”)0£¡=eŠË(hO™Â2úÙS¦(i Äܽµµ(Q[«µµ(1o¥ôJÔ)ÒA‰:E:(Q«µƒµZ;(1uVï D­ÖJÔ{"½·Z;8q«µ·ZHq+r·"Xq+r·"hq+r·"xq+r€·"xy§Ü/jÚ=ø ô-í)STGI{ÊÔÑÑž2ÅtT´§L! í)SDGA{ÊÐÑÏž2ÅsÔ³§Láíì)S4OP¢`^ D±¼@‰ByµÈ(Q‹|µÈ(Q‹|µÈ(Q‹|uµ.Pb6ò8@‰Z­ã&jµŽœ¨Õ:€¢Vë8@ŠºZÇTÔJXQ«u€E­Öq€µZÇ\Ôj‰®ble$ÚŠñ•‘è+ÆXFt´ïßûÕ:¢¢=eæØQÑž2uT´§L±í)ShFE{ÊÌjQÑž2tT´§Lqí)SXFE{ÊÌŽ”(˜3(Q,gP¢PΠÄ,»‘A‰Yv#ƒ³ìF%fÙJÌÕ: (1;rP¢vd%æj”¸ÕZ€‰*’G'nE€âVd)nE ¢®ÖQÁŠ[­°¸YA‹[‘¸¨ësTðâVk/nµVðâVk/ÿ2¡}DGûáÕí)SÓí)S+9:ÚS¦f(:ÚS¦F(:ÚS¦&(:ÚS¦(:ÚS¦æ':ÚS¦’it´§LM]%jè(Q³ÓA‰JÔätP¢§ƒ:(Q ƒ:(Q ƒ:(1µõè Då†JTn Då†J\nÀÄå†NÜ)?ŠË¤¸¼1€ŠÛÿ¬¸ý?‹Ûÿ´¸ý?‹Ûÿ¼¸=>Á‹Ûã¼¼W~íÇöt´§LQí)SPGG{ÊÔFŽŽö”©í)SDGG{ÊÔFŽŽö”©9ˆŽö”)œ££=eŠæJÔF^ DÍÀ%j(Q°@‰ÙÈó%f#Ï”˜<Pb6ò<@‰ÙÈó%f#Ï”˜<Pb6ò<@‰Ú¬ó&j³Îœ¨’|&€¢6òL Em䙀Šjf+ª˜ °¨0hQåúLÀE%‡™À‹J3•f/ª˜¼¨03xù Œ,ZÚOŸ|˜ÑÒž25}ÑÒž25|ÑÒž25{ÑÒž25zÑÒž25yÑÒž25xÑÒž25?ÑÒž25>ÑÒž25=”˜Ø= (Q3W@‰¹JLÞ˜”˜à0 (QóV@‰ ”¨àPA‰ ”¨àPA‰J”¨PA‰ºÉg&.9Tpâ’C(.9Tâ’C*.94°â@,n“7Ðâ6y£©(Wite+¶¢|¥·ÉxQ·ülàÅ%€¨i?~¢¦=ejŠ¢¦=ejˆ¢¦=ej†¢¦=ej„¢¦=ej'GM{ÊÔ DM{ÊÏQÓž2…sÔ´§LÑÕA‰‚k€µî(Q h€u¹P¢öÖ%jo PâöÏ&nÿ pâöÏ(nÿ âöÏ*nÿL°â.Ð XÜÞš Åí­ \Tw='xqûn‚·ï&xq—ë/nONðâöä/nO.ðâöä/•—EWûå˃ý]í)S.]í)S&]í)S]í)S£]í)S“]í)3»¢«=ef^Wtµ§ÌŒëŠ®ö”™i](1úPbfu ÄŒê:@‰™Ôu€3¨ë%fN×J̘®JÌ…½(1öJ Äœ•@‰ 8+pV%&à¬JÔa¾0QÁh%p¢‚ÑJE£•AŠ F+ŒV+ªÒ_°¨@µ2hQjeà¢ÕÊàEª•Á‹ T+ƒŒV/*­^T0Z¼¨`´ xQÁhð¢‚Ñ*àE£}íׯ>­èkO™r‰èkO™ÚèkO™šÙèkO™ÙèkO™šØèkO™ØèkO™š×èkO™×èkO™ F”¨a­ DÍj%jT+(QWA‰œJTTi DE•JTTi DE•JTTi DE•J\TiÀÄE•N\TiÅE•R\Té@ÅE•V\Té€ÅE•Z\TéÀÅE•^\TéàÅE•^T÷³:xqg€qxqg€qxqg€qxqg€—Oʪxù¬¼z€—/ʬ£³ýóÏ™**ÛS¦Ü,ÛS¦Ì, ÛS¦<)úÚS¦,)êÚS¦)ÚÚS¦ )ÊÚS¦|%ºÚS¦l%ªÚS¦\e‚e* ”(OY DYÊ%Ê(Qư@‰ò…J”-,P¢\ae ”¨(¶@‰‰bé8€‰ÊT/!íÄøÉKTT:z i)ÆS^BšŠq•—¶b|å%2*鼄€FE—ب¬óvÒ‘@ŽJ;/!-ÆxÌKrTny AŽ ./!Æ8ÍKH«1^óÒlŒÛ¼„´ã7/!ÈùjnÆ—p“óí›o’ÒMî©3ùå¥KW3œhrOó›hrOI>/]½êœME“{êœKE“{êœ×D“{êœÕD“{êœÓdðâü¢€“d^:ðâl¦€g¼˜0óÒç1¼8§(àÅÍ{/&™¼tàÅE“BqSŒÌ4Ĩ¢è%¤Å8©ôg2•&ã\¦ÒeœÍT`#ÃP72 U€#ÃP92 5#ÃP92 5£ºŸ—äÈÕ@ŽLQ äÈÕ@ŽLQ äÈLÓ@ŽÌ4 äüéL.:ßï^.õ Eé»….ÖDë»…Îs¢öÝBç9Ñûn¡³Ž(~·ÐYG4¿[è¬#ªß-tÝï:ˆòw  ’ã`çƒä8$Ç9À 9. ’ã¬cw€ ’ãbÕ 9άÉqf5IŽ3«Ir\$›$Gf²Itd¶šdG†«Ixdºš¤GÆ«I|d¾šäG¬I€dÂZ$HF¬E„dÆZdH†¬E†dXZdH†žE†dêYdHÆžE†d{´n<șк1!åBé¸q!eC)*ä¼4ߥ¨·Pe¦ò*+IQ!o¡r’ò*#IQ!o¡ò‘ò*IQ!o¡r‘ò*+HQ!o¡r‚”HŽ [)‘å )‘e )‘å)‘•™R"9ÊwR"9*ú¤Dr”ë¤Drœéd’ã<'“}R&9.ú¤Lt\•2Ùq¡)eÂãÞžK™ô¸¸•2ñqq+eòãâVÊÈÅ­TH M©!šR!C.4¥B†\hJ… ¹j*2äâV*dÈÅ­TÈ‹[©!õ·Œ^J2ä‚ZªdȵTÉ{Ÿ/U2ä"^ªdHµJ†¾“æuó?_Öå{±uó:ÓŒºy gFݼ…Î2£nÞBç˜Q7o¡3̨›·ÐùeÔÍ[èì2êæ-tžuó:Ëk$ÇùV#9ζÉQ…Zj$ÇÙ]#9Îí:Éq–ÕIŽs¬Nrœít’ã2^'9ήúç8Óé7¦ã\§ß¸Ž³~c;Îwúï8ãÄG®A~dàÈõ[iÜx3Ÿqc>Î}’k!¸’k!÷n`dHFµI†dT›dHFµI†dT›dHƦI†d36É \“ }sgê$Cÿô÷/zÕ¢ÞB÷+Fý¼…Î3£}ÞBg™Q>o¡sÌèž·ÐEµ¨ž·Ð9m4Ï[èŒ6Šç-t>½ó:›]$Çyå"9Ê*óAr”Sæƒä(»ËÉQž•’£,+$GEµ|euù 9ʯòAr\âÊÑqv•²ãWN„Ç%®œHK\9WŽåD~\âʉ¹Ä• r‰+'"äWNdÈ%®œÈK\9‘!—¸r&C.qåL†\nÊùÆ‚œår&”oLȹP&C®âÊ™ ¹¬–3r‰+g2äWÎdH–c¹"Ör!Eÿ”ö-ô/óò9/G ½…ò7[!”¿Õ¡³Ûh ·Ð¹mÐ[¨âZŽþy ×Fý¼…ê}ˆíó:§òy ÑV’ã|¶’g–•丸VIŽ3ÙJrœÇV’ã,¶’ç“•ä8›l$ǹd#9Î$Ûç8Ói7¦ã\§Ý¸Ž³Fxd@l¤GÄF|d@läÇ•y¹ -; rïžæN„d´ìdHFËN†d´ìdHFËN†d´ìdHFËN†\™—;’¡´“!-’Ñr!-’Ñr!WæA†d(dH†ÒA†l(„È&˨¡|y׃€-ôº_1Jè-tFô:· z ÙF½…. F½…Îj£ÞBç—Q?o¡³ËhŸ·Ð¹å$9Î,'Éq^¹H޳ÊErœS.’ãŒr‘ç“‹ä8³[$ÇyÝ"9ÎêÉqN·n<Ǚκ1å:å¸qe;å <.–ƒô¸|Xâãòa9Èˇå @.–ƒ¹|X"äòa9Èˇå C.–D†\>,‰ ¹|Xrù°$2äòaIdÈ•–%‘!—K"C.–D†\V+‰ ÉÄU!’5`ɤH†µ’‰Ñ÷ÒÅ¢ˆþéå$¾A,ÑCo¡üÍVåoµAèü6Jè-tvô:· z ÙF½…*Y–蟷Йt´Ï[è<ºgÑ…ä8‡.$Çt!9Îe Éq†WHŽ ˆ¥g”…ä8Ÿ¬$G%ËRIŽJ–¥ÞxŽ3Jt¤»V²#͵é­•ôÈ„X‰Lˆ•üÈ„X Lˆ¹7§K#B2[62$³e#C2[62$³e#C2[62$b#C2!62$s^#C2çu2$s^'C®, ¹°t2$³e'C®, Ù|Ø ‘͇ý M¬£¥‹Eýó˃¤Ò(¢·Ðí‡è¡·Ð=·QCo¡{f£…ÞB÷¼F ½…îYz Ýjˆ z Ýfˆz Ýbˆúy Ý^$Ç™û$9$Çô$9Ο'Éqü$9Î×'Éq¶>IŽsõIrœ©O’ã<}’gé‹ä8G_$GæàEtd^dG.‘ExäY¤G®E|äYäGæàE€d^$Èåàz!—ƒëA†\®r9¸dÈåàz!—ƒëA†\ÇZ2ät=ÈKÐõ C®c­rÙ»&2äÞ½¯‰ ¹Ô^r©½&2äR{MdÈ¥öšÈKí5‘!—Úk"C²K®‰ÉÀ_)’¿fb$ÍäHþš ÒOίkÑ¿¼ÜÖß 5Šè-T;´F½…îe‰"z å3; ”Ïë„P>« BµkÑ[èv`Ñ[èYÑ[èöX!9n’ãvQ!9n’ã6Q!9n’ãöP!9n U’ã|½’gΕäHo®DÇðZÉŽ4õJx¤§×ßqÆSoŒÇ9O½qg=•ÉÝH ÃÉ0ÜÈ ¦ É`ÚÈ ¦ ÉxÙÈ ‰ ÉØÈ ‰ ÉØÉ ‰ýƆœõ;rFÔïŒÈ9Q¿s"gEÙØÉ‘Mz ýìNó]ô¯¯ÃúAÖ‹&z ÝSMôº'(šè-tŽMôºç5šè-tÏj4Ñ[èŒ:šè-tuG4Ñ[è >šè-tYogÒƒä8ž$ÇE¶Irœ·O’ã"Û$9n'L’ãVÂ$9n#L’ãÌy’i°“èHdGF½Ex¤».Ò#ÍuØù‘½ç"@2ê-$£Þ"B²÷\dHöž‹ Éx¹È‹—í C.^¶ƒ ¹Þ³dÈÓvÜx2¡vܘr¡vܸ²¡v!LÛA†\0mrÁ´dHÓ–‘ ¦-‘"Ù^¶DŒd0m‰Éö²%‚$3mK$IfÚ–ˆÒ/Îw[´Ò¿½\ÓÇáôÊfAè^–裷н(ÑFo¡{I¢‹ÞB÷‚D½…îåˆ&z ÕlÑDo¡Z‚-šè-Tû¨e’ãVC&9Îß3ÉQá´’ãܽg´…äH·,DGše!;Ò+ á‘VYHtÊB|¤Qò#}² i“•¹xÚ*rñ´U2äâi«dÈÅÓVÉ‹§­’!O[%C2ðU2äÞèn• ÉÀWÉ | ÉÀ×nlÈùP#C2ð52d_#D6ð5R$›ÈÖˆ‘ |ÙÀ×’ |$ÙÀ׉’ |,ý*­,Êéß_FôŸH8aÐáÅô:¢–ÞB· £”ÞBÇPTÒ[èŠBz ?QHo¡£' é-tìD!½…ŽœArÜ$Ç­ÀArÜ$Ç­±Ar\É2HŽ Òƒä¸Še·p'Éqûv’·4'Éq;s’·ø&É‘Ëk¹»&Ù‘Ñ}ÞØŽóyã;Îxæñ8çY7Îã¬gÝXóžE‚dŒ^DH†áE†dãºÈl\’ë"C2€/2$ø"C®«írѽ7&¤\¨7.¤l¨dÈE÷~!ÝûA†dtïÇ)'ê)’ù»ÄHæï~#™¿{"H2÷D’dþî‰(ÉüÝYúÍu =zé7oÞ¢‘~÷òŸ¿GôÑ[è^˜è£·P-—}ôÊe@(_’ ¡Ú,#úè-t¯dôÑ[¨öʈ>z ÑGo¡Ú*#“µTF&9j§ŒLrÔJ™ä¨22Éq %“·O2ÉQ1z’ãöP!9n ’ã¶P!9n ’#wP!:r²#7P!<.FBzäþ)ÄG®ŸJ~\Œ•ɽUI‹Ñ£!¹ð*r³zT2äø¨dÈðQÉ+²G%C.ºJ†\t ¹è>’ѽ‘!Ýr e42$C#C2ô72$C#C2ô72dC#D6ôwR$ÿùèÄÈÞ Ù{¡$ùÎÄè$Éž(ÙS£“%ùÎÄè„É^)4Ù+¥“¦7Òµiz+m;ªé?^¦ëßÔQMo¡C?ªé-tàG5½…û¨¦·ÐAÕô:䣚ÞBGmTÓ[è˜jz ±QMo¡ãu’Gë$9ŽÕIr\˜$ÇŒIr\¾˜$ÇÅ‹Ir\º˜$Ç…‹Ir\¶X$ÇE‹Er\²X$Ç‹Er\®X$GnøEtä‚_dGî÷Exäz_¤Gn÷E|܆žùq zÈíçy ·žçA„ÜvžrËydÈ]Fó Cî2šr—Ñ<È»ŒæA†Üe4r—ÑL7&¤\h¦R64Ó )š‰ ¹ûf&2$ï›™‘¼of"Eò¾™‰Éûf&r$ï›™ ’¼of&Iò¾™™(Éûff²$”™ “üëS3“&y¤ÌLšÞ¹†hFEý¯—‹ù#eFE½…Žß¨¨·ÐÑõ:v£¢ÞBGnTÔ[踊z µQQo¡c6ê-t ? ê-t¨’ã@/$Çå„BrÜ|T’ãRB%9.$T’ã2B%9."T’ãB%9. T’£Ž”YIŽ‹•ä¸tPIŽ ä¸lÐHŽŒèÈõÞÈŽÜîðÈåÞHÜíøÈÕÞÈÜìÉ»¨‘  :’‰ “!yQu2$£D'C2It2$/ªN†äEÕɼ¨:’U'Cò¢êdH^Tƒ ¹÷šæ CòdHÞbƒ É[l!y‹ 2dªAˆìA5H‘=¨1²Õ Gö*šÉ^E“$Éw}æ$Jö šdÉT“0É7Œæ$Mö›¤I¾a4'i²gÜ$MH÷’úýË;rQRo¡›š(©·ÐÍL”Ô[è&&Jê-t!%Jê-tƒõºY‰Šz ݤDC½…nN¢ ÞB7%‹ä¨YÉQ²’£æc$GMÇ:HŽŠ ë 9jׯƒä¨U¿’£6ý:HŽZôë 9îÈYÇé(×YéÆu”í¬tc;ÊwV"=nß®D|ÜÎ\‰ü¸•¹rs%ä¶ÞJDÈ-½•ÈÛy+‘!·òV&CîàX™ ¹ƒce2䎕É;8V¾ñ gBùÆ„œ e2äΆ•É;V¾ó!gDùΈœ•;'rVTî¬ÈyQ!GònXå&¹²f•›$-°%yr¬r“…¤ –›4$]°Üä!w7¬r“ˆ¤ƒÖ›L$-´Þ¤"é¡•4ýKZa4Õ^Fæß9ZÑTo¡¸hª·Ð[4Õ[è†-šê-t£Mõ:䣩ÞB—¢©ÞB7)ÑTo¡›“(ª·Ð¡ÞH޽‘‡y#9òFrܺo$ÇíìFrÜâm$ÇÅÿNrÜÂî$ÇíëNrTË·úç8ÓéDG.ÜNvä¾í„G®ÛNzä¶í7Æãœ§ß8³žA€äª$HnÚqc>Î}’gà CrW2$Ãÿ C2ü2$Ãÿ C2Â2$#ü$C®ù_“ Ù? ‘Mð“Ù?‰‘Mð“Ù> ’á“$Ù,=‰’ÍÒ“,Ù,½“ÍÒ‹4Ù,½H“ìà×"M6†/Òô^VÑQ|yʃõº‹Žz ݸEG½…nØ¢£ÞB3jùˆŽz Í ½„ B3f/a†Ðìß—°@h¦ó%¬š{ Iޝ—ä˜áz IŽ­—ä˜Íû’³>ó‘HŽIð/!É1 þ%$9f_¿„$Ç,Ý—ä¨ þRµ­_J²£–õKIxÔ®~)IZÕ/%ñQá?™ü¨EýR µ1_J¤æKI„Ô¾|)ÉZ—/%RÛò¥$CjY¾”dHEø—’ ©ÿRÞXó rãAÎ„Ê 9*dH…ÿ—òƆœ•;rFT‘ ÿ/))ráÿ%%F.ü¿¤äÈÕ÷/)ArwC>ê9;ªDÉý¡—”,¹æÿ%½ICêZyII“»V^RÒ䮕—”4¹kå%%MîZyII“»V^RÒ䮕|4Ò䮕—”4}Mõ§—êCç%,º¬Mõ:k‰¦z ±DS½…ÎV¢©ÞB7£ÑTo¡³hª·Ð Y4Õ[èæ$šê-tSÒI޽“‡y'9òNr\Êè$Ç…ŒNr\Æè$ÇEŒNrÜ¡3HŽ ƒäÈ|1ˆŽäŒ¨Ü‘s¢rçDΊÊ9/*w^ą̈$y\•r“ƒ¤©¢$ß-+…,É»¬Â$ï²RH“|·¬TÒ$OºRI“<éJ%Mò¤+•4É“®TÒ$ÿîc©¤I^ƒ¥’&y –zçLΚ*i’wY©¤é«ë©Jt×ß¾}{pÒ•¨®·ÐYZ4×[è -Šë-tv½õ:3‹Úz ]°ŠÖz Fi½…ÎÆ¢³ÞBgbQYo¡³°Nrœu’ãì«“ç@ä8ÿé$ǹO'9Î{:ÉqÎÓIŽ‹aä¸ÖIŽsºArœÏ ’ã\nw}’#Cß :2ó ²#sÛ <2¶ Ò#oÈA|dÞäGƽI€dÚ›$H†½I„dÖ›dHF½I†dÒ›dH½I†dâšdH®I†dÞšdH^Ÿ‹ Éës‘!™Ó’1m‘!y·.2äÞN,‹ Ù³u"{¶.RdÏÖEŒìٺȑ<[ëAäÙZ’$ÏÖz%y¶ÖãΔ!Õƒ0ɲ¤Iõ Mò€¬Ç')SªÇ))WªÇ+)[ª‰4ɲ¦;_RÆTÓ1)gªéΙn­é?ÿé§÷ßýñóëÿ럾þþ?ÿÛÿòØÉ8!graph/inst/GXL/graphExample-13.gxl.gz0000644000175400017540000000036713175713336020320 0ustar00biocbuildbiocbuild‹à`áCgraphExample-13.gxlR½ Þ} Â.صiu2.³[C) ¡­Ô>½G[7‡HŽ|wÉWœ¦—%oz㺒fì@OÇ)ôdsxЮOSIÛað9ç1F¦G“Š_npŸ±ŒÉARnÚ |KŒ,é2]Ï%JjõrR•tì¤ ê>¨U±J:€…SÝnÿ!xQ¼ÆÍ(ÞŒô{8Wß½G2fCމ‰q´¦ðĘËFæ'&&hGs„‹ <±1=µ š÷wƒõ·3uoe?î¾½Šu:graph/inst/GXL/graphExample-14.gxl.gz0000644000175400017540000000064413175713336020317 0ustar00biocbuildbiocbuild‹à`áCgraphExample-14.gxl•ÖOo‚0𻟂ô>°­â4¢§e³ó®ËèÔ +ˆ~ûñG8:ó]˜NtÄÖK­ø}¼ ú·O2'"“™”ÈX"“™œÈœ‰Œ#2"S™’È\‰LEdnDæþ¦¯6#…÷ã²´¯È`žšÔ£z“ðFƒ9fÖ›´3 aæ`˜³…`˜³-zcù}^Á0û,Á0=S@)ƒ†I8ó§“ µ“d4 ƒã.瀨šB@TË€¨F¼¢1LD9â;Ä4BI@L#”Ä4Bi@L#Ô cÐ0×5…€¨š€¨š†‰¨Fo ˆ9ž&â>âO\bÆH+@LMZ¢jšbZ®ç€˜1Ò! òê¾µwºæš<É=CI graph/inst/GXL/graphExample-15.gxl.gz0000644000175400017540000000214613175713336020317 0ustar00biocbuildbiocbuild‹à`áCgraphExample-15.gxl•šKoA„ïùˆ{`fwvVœœ¢\¢œsM¼kÀæe`_üú`c¦¥RU,¨OÞí®îYJþôeج']s8®vÛû©™é—Ï&ŸÃúîò3¹|º=¾þv?]žNû»ù¼ïûÙ¢Ýv³º™ûù}~ùð£ÙY}ª§ô=üÚ/'«ú~úöۯߧ“¦^4›]ÝÜOÛm½:4§æJ\‘íå£7â×û›óÛ»Ñü&4„¦&4 ¡y$4 B³$4+BóDhž ÍšÐlÍ–Ðì͞мš¡9š¡i MGhzB3š‘Мÿ­yã7N»Íë MN;˜ÛWÕ_˜âÆÔU@LŸª ¦O•ˆéSU´a Ж²#öŠ’G€¨å³Â¼ˆYaÞÄ4×1Íõ%@Ìhx3¾ˆÙ{>;âEqO ư>Ä,Ÿbª @Lõ‚ˆ©^(b†0”íÈ´g ìˆ?¹ÁÄ,Ëbæ)D€ï…ã½hb¼-@̲Œ@/ ”qT|sw1Ë2V1}Š ªz fcˆ˜bú” @Ì& 3„©èÀ@Ù'~r“ˆ s*€˜ã3y€¥3¹)Äx/%€˜Só̭±@1Šq’5è ÆJÖ -Ž•}Ñ*²7ãâ²Á•T™U™c(+ñeË/&+ùe«p”˜­ÂQ’`¶ GI„ÙòÇ•µè ÊQbvüz²’bvŠ8WbÌNáCÉ1;ÅÞ ³ã+If§¨¼D™bH–Ù)ú%aæ;u¢¨ ¨–¢²7zE—%Ïì@Í^±$Ñì@"Í^á É4{…7$Ôì]–TsPìy‰5Å,K®9(¦R‚ÍAq:H²9(º,Ñæ Ø’mü³®•psP8JÒÍA±$Þ³ìÐÔ,;ôFGQÙ#ÿÈJÄ9*|(ç¨ð¡„œ£Â‡’rŽü—\+1ç¨ð¡äœ£ÂQtŽŠç I:GÅf“¨sT¸·BoP›­Bo •½qVœDwžÛFòγ¢_xžOz’xžgŠDžgÅÞÌóüŸ p}õöo\——﯆õçCvÀµ<&graph/inst/GXL/graphExample-16.gxl.gz0000644000175400017540000000443713175713336020325 0ustar00biocbuildbiocbuild‹â`áCgraphExample-16.gxl•œMSÜF†ïþÔÞÒÌH#¹Œ}JåâÊ9WÌ.»‹ùò²ŸùõÛ­&ÝNê郫 ÌS£§ßY^Vúðéxw¶_lž×—³ö¼™}úøîìÃòx÷þåßÙËWž_ÿw9[m·Oï/.‡Ãùr÷´y<Ÿ/.þøëóÅËkÏÛóùv>{A²›«§ÕÙz~9ûþ¿?ÿ<;[Ì—‹ûÇùâr¶{˜¯7‹ëíâñyxùÒwâêç'/䳿Xó¬¹kæ`ͬ¹k–`Í ¬Yƒ5·`ÍW°æ¬¹kÀšG°æ ¬ùÖlÀšg°f ÖìÀš=XskŽ`Í ¬ù¬¹BƒŠ&*šU4¬hZѸ¢yEû?ûœßµ³³›ÍãýkümMR¾®ú“„Yp& sÙb˜`:Ã\¦fÉ¿·jò½ †¹Ìhòó´¾h2aÅw¡M"ÛÐf‘}h‹–ê „v¯7ڽɇu`÷¡Ý Dv/5"»—Z­” D¶ˆ¤QŸ D,ï‹È–÷È–÷½ˆå}5ºNƒÐu DF£6"iT­÷²FyªÖˆMF| üLˆ{µ7q¯V÷ê` â^ D4†Ö@Ĉ!è‰@Ù@$kqo°FɬDØa2bø™¡ c4ê0ËÇÖ@Äò1ˆX>f‘ë4‘Ñ;‘Ñ{ËÇɈgnÄ8ˆX>ŽBÅLÓŠ\ݶi E®TÛ$C‘KÕ6ÙPdÛ¦Š\¬¶é õ Q“Û@çÔTC¡Ò© …:»f4rCëËmÀ í/·|ô[-0·£´ÁÜŒÒ s˧¿Õs0ªµnleÝ`űuMJkÝ@Î'ëÆ3¢&7v‘n; í†v™»€óZfîÎk›¹ Ø«uæ.`¯ö™»ÀUÖBs°WÍ]À ­4w7²uc‹¨É}à/ Újî)ªµæ>`”öšû€QZlî)ªÍæ>`”V›û@j·¹ç¿)´Znîj»¹xX¬(mŠu¥M±n (Ö 4Ëźæ«X7Ð|ëÆQ“‡ÀÎkÍy¼"Òžó˜e-:YÖ¦ó˜e­:YÖ®ó0JËÎC ´í<@ëÎC`–;ëzEÔ[7½½uƒýÝÙº’­·n Œê­{DMn#?Wo(4)Ú{“¢Åç10)Ú|“¢Õç1à¼vŸÇ€óZ~nhûy LŠÖŸÇ€QÕºŒªÖ¢¬(ç«uƒ½±Ãºòp°n v°n v°n Œ¬è„Õ"ôØymBO×*ôHíBOÐ2ô¹Ê£¡Phz ¸¡}è)0ËZˆž³¬è)àáhÝ@ŽÖ äáhÝ@i3Z7ŽˆšÜ¸º H¯Å¨`Äú¤Í¨`èÝFZ †Þo¤Ý¨`Dü¤å¨`Äü¤í¨`Dý¤õ¨`Äý¤ý¨`Dþ¤©`ÄþÔ8Kˆþ©q–ÿSë,!Zg ™€Ô:KN›,¹¾æƒ“´' Ž¥‚±79öCƒ£U©`hp´+ Ž–¥‚¡ÁѶT048Z— †GûRÁÐà$g œä,Aƒ“œ%hp’³ Nr– ÁIÎ’+49Ú›ÎçÓâT0ôVZmNCo¦ÕêT04§Ú †æTËSÁÐ[jµ= ·Ö§‚¡ñÖþT0òKaÒU04ÞÙYBªTœ%hN‹³„üЗгÅY‚‚²8KPâg J¼â,AÑUœ%(ºŠ³EWq– èêœ%,º:§É5ºs@ ÕÅ‚wRIUÁPvi¥*Ê.íTCÙ¥¥ª`(»´U …Öª‚¡Ò^U0RM%-VC٥ͪ`hP{g ÞY‚²«w– ‰Óvõ&p“\ÒzU0””Ú¯ †TÖ‚U0¤²6¬‚¡óT+VÁÊÚ± †N-YCNjË*rRkVÁÐáQ%è®ÎtæTg œê,AP%èÌœ%ìÌœ&ìÌœ'ÿ¾‘ø?¹I”eànΤë2pãhÒÒU04àÚº Æn\«Cg•ö®‚¡×âU0tVió*:«´z å‚v¯‚¡\%häFg :«Fg šÔÑY²@¿3ŽN4©£Óq£Óݧ×8MÈñ‘§ ôÜ8MH çÆiB=7N±¹qš ˆÍóElnœ'(bsãD¹A·›j » Ü*žµ†]îeÏoîµÜÍžßÜm¿âÑœßÜo¿âÑœßÜq¿âÑœßÜs¿âÑœßÜu¿âÑœµ†ŒDsÖV0͹u–hÎÉYB¢9'g ‰æœœ%(šsrš,‘•Éy‚’!9OÐÍÉy‚"=9OP¤'ç Šôäì>߾ݒ¿<}üQ>Ýì¿¿¼<}º¾~}}½ºýùô|º:¯ÿóÛµ<ü¨¯ôÕáå°èûü×Ó÷ÝÝáf?}úã·oûÝñp{|8Ž7ûŸ‡»çãß/Ç1CåÑ„°Ñúóÿ¯—ïšKÌB ÀÌëœØhŽŒæ-j2š˜`–´E£)oÈä¼×ä¼2˜9¶T1#‡ª³Î™ "Ù99-²#.¡Ñt°Šl‰1¢Nm]ŠÔ+[EtŠÍޏM6ó*§^ÁÑÊ}å#Y‚IÄiRŽŒf•Aé*ÄÄÌP,yoÑþjƒrßt Z‘ˆ“q踌&fÚ›@²ºØ‘·¬,)”6’†(©Qh:£ÈÜ 9,AF#!çU ß$´TÑiy´qž-Õ)E–š b/9{V€Ù¡*CÒ!)Ä#²RT1mB9:T!29N£”;ÆÁÞ#¿Q¡&R£rã2â`#+7‘kL¤L‹SÖkdšNv¬UÖb‡G¡þËETäÄ õU™Ý dÍÎxÄRoÐåÀX”¬ÿö*£JíQ¥ö*±ÞE£ž?¡¾UÌоËB3¡ü;”ÕÅ%¢è¾ä3êÔœô‡0†Ñ…I£&GØŸœ˜ä—E^Yp Y'ÆN%¬Í¨†ÉbQ™X3»/3J”Ë+&¨lÊhì²F“ŽŽõߨ–ˆº{ÇĤXÀ,JCPw%f¨AÔˆš„ÓÙþ"ö Õ1#Nuȵ¥‘ÞÑYÖ(³¢%‚ñ’ñè¼ôÿõEl‡Ûïþy>=œ5ÉÝËéRÄ,¶ï Í‚œÃ¨]qBn%ÑÒ­N‹ê5âÓ/ÈIA†9k^3t#ºu qNúÖˆÓ´nQQŸ&äVÁë óê³R#›+á¼i‘Fæ«k Ejj*TšÕ¡ÛK(Ü&íšÅº0æv ¦IõZìM“4C·’{»†Ó$-n¦þK<]HŒ=ln Å¡0kHMÂÌÝÊL=h(¿Ly+÷ 5¢Ì²ÉÛ78=¨mö¸²Z$PW'¬ÆhÍTv*ÊÉÐ7ôTd {¡–õÀ±‚ÇRÀÔ€*zÅ9ó´2T'f¯›·I½ÂQªó>m„TWh#(kjòd?´Vk/¡[ɾumÚ¥±ƒµk@ÍÂÃМÃ{ØÌÑî5 뤑ãÔp£YN÷׋NÚT=[yƨkbªÔ“Ù믯T{ÐJQåR9{ݼßéA+Ed$ \-zE™¡›wT=hCQ:/Îh­kDMšÇE¹–¢Ö܃؆¡bÌWIJÇÁ¨¨EoÒFÈ«:ç"Œ¬×WšÊK‡{¡k÷°µ%/÷þ¡îØÖå-`ö»Õµ{à¶+7C•Úû:e?ØÐ‡Æ«óºÕ$.œYÙ ³­y†¼æ¦xå¡âÚºgÆ ºc‘†n>5 ÂÒ–Àņ¦JcûÖpš¤‰!¨oy­ÔˆC¸„n•ç46daUšÜÐÜóìXkš¶¼È#—ŸXÛò¸\`¶¿­éA›>jér·/zPÓÔ%ž.¤ì¸2Ô¤€ 9®eO/MÉöW tþ6ý,M¾ž¿½Ýùðe~œ 'graph/inst/GXL/graphExample-18.gxl.gz0000644000175400017540000000030713175713336020317 0ustar00biocbuildbiocbuild‹â`áCgraphExample-18.gxl‘»ƒ0 E÷~Eä½IY©ê‚:w¥Ø ‘   ŸßðèÆàÁ’í{ÎbgÅÒµâK~´½ÓÈùEdfiÓX"¦n\; MCªÔ<ÏÒLƒï%’z¼JÃk"‰!ª‡ë«¡5lÝó^‚ 4ÔõH&‡ÖSh7vÅÅh3ªc©þÛæÍ`jƒ †̇ÁÓ0{ÆìÓvìõêx`~ùËXÔšâgraph/inst/GXL/gxl-1.0.1.dtd0000644000175400017540000000664713175713336016260 0ustar00biocbuildbiocbuild graph/inst/GXL/kmstEx.gxl0000644000175400017540000000162013175713336016307 0ustar00biocbuildbiocbuild 1 1 2 7 3 1 1 1 graph/inst/GXL/outOfOrderExample.gxl0000644000175400017540000000144513175713336020445 0ustar00biocbuildbiocbuild 127 27 test.c main.c 225 316 42 graph/inst/GXL/simplExample.gxl.www0000644000175400017540000000312013175713336020314 0ustar00biocbuildbiocbuild main.c test.c 225 316 127 27 42 graph/inst/GXL/simpleExample.gxl0000644000175400017540000000130113175713336017635 0ustar00biocbuildbiocbuild main.c test.c 225 316 127 27 42 graph/inst/Scripts/0000755000175400017540000000000013175713336015316 5ustar00biocbuildbiocbuildgraph/inst/Scripts/Graph.R0000644000175400017540000000577713175713336016522 0ustar00biocbuildbiocbuild##some new things library(methods) library(graph) library(GO) library(hgu95a) xx <- ls(env = hgu95aGO) set.seed(1234) myGenes <- sample(xx, 100) mG <- mget(myGenes, env=hgu95aGO) makeGoGraph <- function(x) { library(GO) newNodes <- get(x, env=hgu95aGO) if( is.na(x) ) return(NULL) oldEdges <- vector("list", length=0) oldNodes <- vector("character", length=0) done <- FALSE while( !done ) { newNodes <- newNodes[!(newNodes %in% oldNodes)] if( length(newNodes) == 0 ) done <- TRUE else { oldNodes <- c(oldNodes, newNodes) numE <- length(newNodes) nedges <- vector("list", length=numE) names(nedges) <- newNodes nedges <- mget(newNodes, env=GOmolecularfunction) nedges <- nedges[!is.na(nedges)] oldEdges <- c(oldEdges, nedges) newNodes <- sort(unique(unlist(nedges))) } } rE <- vector("list", length=length(oldNodes)) names(rE) <- oldNodes rE[names(oldEdges)] <- oldEdges return(list(nodes=oldNodes, edges=rE)) } Gmf1 <- makeGoGraph(myGenes[1]) ##old examples library(graph) data(pmedu95aAffy) pmG <- pmedu95aAffy edgeL <- lapply(pmG@edges, function(x) list(edges=x)) pmG <- graphNEL(nodes=pmG@nodes, edgeL=edgeL) xx1<-acc(pmG, "1025_g_at") xx2<-acc2(pmG, "1025_g_at") set.seed(12345) myNodes <- sample(nodes(pmG), 500) pmS <- makeSubGraph(pmG, myNodes) xx<- acc(pmS, "35990_at") xy <- dfs(pmS) zz <- acc(pmS, "35990_at") zz2 <- acc(pmS, "35990_at") pm2 <- makeSubGraph(pmG, myNodes[1:100]) pm3<-isect(pm2, pmS) ##Sept 27 -- trying to test some graph code #library(methods) #setwd("c:\\cygwin/home/rgentlem\\Software\\graph\\R") #source("graph.R") #.initGraph(globalenv()) x<-1:100 rw <- rep("a", 100) for(i in 1:100) rw[i] <- paste(sample(letters, 10, replace=TRUE), sep="", collapse="") set.seed(121) ##this is a directed graph -- the nodes are one way nodes y<- vector("list", length=100) for(i in 1:100) { nnodes<- floor(runif(1)*20) y[[i]] <- list(edges=sample(x, nnodes), weights=runif(nnodes)) } sapply(y, function(x) length(x$weights)) names(y) <- rw g1 <- graphNEL(nodes=rw, edgeL=y) z<-lapply(y, function(x) {x$weights<-NULL; x}) g2 <- graphNEL(nodes=rw, edgeL=z) #get the adjcency list for node number 10 vv<-adj(g1, 10) #get the accessibility list for node number 10 vw <- acc(g1, 2) ##for an undirected graph we generate a node list for each node set.seed(333) y2<- vector("list", length=100) for(i in 1:100) y2[[i]] <- list(edges=numeric(0), weights=numeric(0)) for(i in 1:100) { nnodes<- floor(runif(1)*3) jj<-sample(x, nnodes) for (j in jj) { wt <- 18*runif(1) y2[[i]]$edges <- c(y2[[i]]$edges, j) y2[[i]]$weights <- c(y2[[i]]$weights, wt) y2[[j]]$edges <- c(y2[[j]]$edges, i) y2[[j]]$weights <- c(y2[[j]]$weights, wt) } } g3 <- graphNEL(nodes=rw, edgeL=y2) b1 <- isect(g1, g3) sN1 <- sample(1:100, 20) g4 <- subGraph(g1, sN1) E1 <- edgeL(g3) E2 <- edgeL(g3, sN1) graph/inst/Scripts/distGraph.R0000644000175400017540000000126313175713336017370 0ustar00biocbuildbiocbuild ##some code for distGraphs ## a concrete example: library(Biobase) library(mva) setwd("c:/cygwin/home/rgentlem/Software/graph/R") source("clustergraph.R") data(eset) d1 <- dist(exprs(eset)) length(d1) ##should be 124750 ##500*499/2 ## 124750 ## we could take deciles and deciles <- quantile(unclass(d1), probs=seq(0.1,0.9,0.1)) dG <- new("distGraph", Dist=d1) dG2 <- threshold(dG, deciles[8]) dG3 <- threshold(dG, deciles[4]) xx<- d1[1:10, c(3,5,11)] ad1 <- adj(dG3, 10) ac1 <- acc(dG3, 10) cc <- connComp(dG3) dG4 <- threshold(dG, deciles[1]/2.1) cc4 <- connComp(dG4) J<- sapply(cc4, function(x) length(x)) table(J) graph/inst/Scripts/multigraph.R0000644000175400017540000000100413175713336017610 0ustar00biocbuildbiocbuild set.seed(123) V <- LETTERS[1:4] edL <- vector("list", length=4) names(edL) <- V for(i in 1:4) edL[[i]] <- list(edges=5-i, weights=runif(1)) e1 = new("edgeSetNEL", edgemode="undirected", edgeL = edL) x = matrix(rnorm(12), nrow=4, dimnames=list(V, NULL)) d1 = as.matrix(dist(x)) e2 = new("edgeSetAM", edgemode="undirected", adjMat = ifelse(d1>1, 1, 0)) mg1 = new("multiGraph", nodes = V, edgeL = list(e1, e2)) mg1 edges(mg1) isDirected(mg1) numEdges(mg1) graph/inst/Scripts/pTreetest.R0000644000175400017540000000046013175713336017420 0ustar00biocbuildbiocbuild library(methods) .initpTreeClass(globalenv()) pT1 <- new("pTree") npT<-pTreeInsert(pT1, "a", 10) objs <- letters[1:12] vals<-c(2, 14, 7, 21, 16, 18, 11, 1, 25, 3, 8, 5) for( i in 1:12) npT <- pTreeInsert(npT, objs[i], vals[i]) unlist(npT@values) xx<-pTreeDelete(npT, "d") graph/inst/Scripts/testintersection.R0000644000175400017540000000303213175713336021045 0ustar00biocbuildbiocbuild## ------------------------------------------------------------ ## (wh) 05 Feb 2005 ## Test and benchmark the three different implementations of ## graph intersection ## Results: for sparse graphs (e.g. nodes=edges=2000), intersection3 ## is fastest; for dense graphs (e.g. nodes=200, edges=10000), ## intersection2 is faster. With the given parameters, I obtained: ## ## Sparse ## t1 27.74 0.23 58.75 0 0 ## t2 27.35 0.11 61.68 0 0 ## t3 5.03 0.02 10.98 0 0 ## ## Dense: ## t1 2.61 0.00 2.77 0 0 ## t2 1.13 0.01 1.57 0 0 ## t3 6.28 0.01 7.15 0 0 library("graph") options(error=recover) nodes = 2000; edges = 2000 ## sparse ## nodes = 200; edges = 10000 ## dense V = paste(formatC(1:nodes, width=5, flag="0")) B = 5 set.seed(123) g1 <-lapply(1:B, function(i) randomEGraph(V=V, edges=edges)) g2 <-lapply(1:B, function(i) randomEGraph(V=V, edges=edges)) t3 <- system.time( i3 <- mapply(intersection3, g1, g2) ) t1 <- system.time( i1 <- mapply(intersection, g1, g2) ) t2 <- system.time( i2 <- mapply(intersection2, g1, g2) ) identical.graphs = function(g1, g2) { if(!identical(nodes(g1), nodes(g2))) stop("Baeh 1") e1 <- edges(g1) e2 <- edges(g2) s = mapply(function(x,y) all(sort(x)==sort(y)), e1, e2) if(!all(s)) stop("Baeh 2") return(TRUE) } cat("system.time:\n") print(rbind(t1,t2,t3)) ## Check whether all are identical cat("Now checking:\n") for(i in seq(along=i1)) { stopifnot(identical.graphs(i1[[i]], i2[[i]])) stopifnot(identical.graphs(i1[[i]], i3[[i]])) } graph/inst/doc/0000755000175400017540000000000013175724651014436 5ustar00biocbuildbiocbuildgraph/inst/doc/GraphClass.R0000644000175400017540000000061613175724631016611 0ustar00biocbuildbiocbuild### R code from vignette source 'GraphClass.Rnw' ################################################### ### code chunk number 1: graphClassDef ################################################### library("graph") getClass("graph") ################################################### ### code chunk number 2: multiGraphDef ################################################### getClass("multiGraph") graph/inst/doc/GraphClass.Rnw0000644000175400017540000002714113175713336017160 0ustar00biocbuildbiocbuild% % NOTE -- ONLY EDIT GraphClass.Rnw!!! % GraphClass.tex file will get overwritten. % %\VignetteIndexEntry{Graph Design} %\VignetteDepends{graph} %\VignetteKeywords{Graph} %\VignettePackage{graph} \documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in %\parskip=.3cm \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\classdef}[1]{% {\em #1} } \begin{document} \section{Introduction} The purpose of this document is to describe the implementation the classes used to represent graphs in the \Rpackage{graph} package and to discuss design issues for future development. There are many different ways to represent a graph and to deal with the edges and nodes within that graph. Below we discuss the graph representations implemented in the \Rpackage{graph} package and define the set of methods that form the \textit{graph interface} as determined empiracally by the methods used by packages like \Rpackage{RBGL} when interacting with \Robject{graph} objects. A graph is a pair of sets, $G=(V,E)$ where $V$ is the set of nodes and $E$ is the set of edges, which are determined by relationships that exist between the nodes. If we let $n = |V|$, be the number of nodes then, excluding self-loops there are at most $n$ choose 2 edges in $G$. A \textit{simple graph} is a graph with at most one edge between any pair of nodes and no self-loops. \section{The \Rclass{graph} class} The \Rclass{graph} class and its subclasses support simple graphs as well as graphs with at most one self-loop on any given node. Not all graph representations can easily support more general graphs. Limiting to simple graphs with self-loops allows for reversible conversions between different graph representations. Furthermore, this limitation simplifies the interface of edge related methods which would otherwise have to support ways of identifying one of many edges between the same pair of nodes. Arbitrary attributes can be associated with a graph, with a node, or with an edge. For both nodes and edges if one edge or node has a particular attribute then all nodes and edges must have that attribute. Nodes and edges can have more than one attribute associated with them. \textit{This raises the question of whether we should use the \Rclass{AnnotatedDataFrame} class from Biobase here as a way to implement general node and edge attributes.} \textit{However, currently AnnotatedDataFrame is based on a data.frame and cannot easily support arbitrary attributes. Even having a vector of length greater than one as the value of an attribute could cause problems.} The \Rclass{graph} class itself is VIRTUAL and has the following definition: <>= library("graph") getClass("graph") @ The \Robject{edgemode} slot indicates whether the graph is \textit{directed} or \textit{undirected}. Since some graph algorithms only make sense in a directed graph, the edgemode is a property of the entire graph, rather than a property of an edge. The \Robject{graphData} slot was recently added to hold arbitrary attributes for the graph. Although edgemode is such an attribute, it isn't clear whether it should move inside the generic container since edgemode is of such high semantic importance. It probably doesn't matter as long as methods such as \Rfunction{isDirected} do the right thing. The \Robject{edgeData} and \Robject{nodeData} slots store the attributes for the edges and nodes of the graph, respectively. There are currently implementations for the \Rclass{graphNEL} class, where nodes are a vector and edges are a list, each element of the list correspondes to one node and the values are nodes corresponding to the out-edges from that node. If the graph is directed then all edges essentially appear twice. The \Rclass{graphAM} class, which stores the edge information in an adjacency matrix. The matrix must be square and the row names must match the column names. If the graph is undirected then the matrix must also be symmetric. There are two specialized classes, \Rclass{distGraph} which takes a distance matrix directly and has special thresholding capabilities. It is not clear whether this should be a specialization of the \Rclass{graphAM} class or not. The second specialized class is a \Rclass{clusterGraph} which can be used to represent the output of a clustering algorithm as a graph. Samples represent nodes and all samples in the same cluster have edges, while samples in distinct clusters do not. Instances of this class must have their edgemode as \texttt{undirected}, if the edgemode is reset then coercion to some other mode of graph is needed. \subsection{Methods of graphs} Here are some of the methods that all graph-like objects should support: \begin{description} \item[nodes(object)] Return a character vector of the node labels. The order is not defined. \item[nodes<-(object)] Return a new graph object with the node labels set as specified by a character vector. This is slightly fragile since here order does matter, but the order can only really be determined by first calling \Rfunction{nodes}. by providing a character vector of the appropriate length. \item[addNode(node, object, edges)] Return a new graph object with additional nodes and (optionally) edges. The methods that have been implemented expect \Robject{node} to be the node labels of the new nodes specified as a character vector. Optional edges can be specified. \item[removeNode(node, object)] Return a new graph object with nodes (and their incident edges) removed. Current methods are implemented for \Robject{node} being a character vector of node labels to remove. \item[edges(object, which)] Return a list with an element for each node in the graph. The names of the list are the node labels. Each element is a character vector giving the node labels of the nodes which the given element shares an edge with. For undirected graphs, reciprocal edges should be included. This representation is very similar to the NEL edgeL structure. \item[edgeWeights(object, index)] \item[addEdge(from, to, graph, weights)] Return a new graph object with additional edges. \item[removeEdge(from, to, graph)] Return a new graph object with the specified edges removed. \item[numNodes(object)] Return a count of the nodes in the graph. \item[numEdges(object)] Return a count of the edges in the graph. \item[isDirected(object)] Return TRUE if the graph is directed and false otherwise. \item[acc(object, index)] See man page. \item[adj(object, index)] See man page. \item[nodeData] Access to node attributes. See man page. \item[edgeData] Access to edge attributes. See man page. \end{description} \subsection{Some Details} Once both nodes and edges are instances of classes they will be quite large. In order to reduce the storage requirements (especially for large graphs) using integer indices may be beneficial. The minimum amount of storage required is $|V|+|E|$. If we use an incidence matrix representation then the storage is $|V|^2$. If we use a node and edge list representation then the storage requirements are $|V|+2|E|$. When either $|V|$ or $|E|$ are large these mechanisms will not be especially efficient. In some cases it may be better to keep the actual node and edge data stored in hash tables and keep other integer vectors available for accessing the necessary components. \subsubsection{Representation of Edges} \label{sec:edgerep} We have taken the approach of allowing the representation of the edge sets to not contain every node. When the graphs are sparse this can be a fairly large savings in space, but it means that one cannot determine the nodes in a graph from the edges in the graph. Also, for the \Rclass{graphNEL} class we do not store the names of the nodes in the NEL, but rather indexes into a the node vector. This is important for allowing us to perform permutations on the nodes of a graph, but causes a number of problems when subsetting graphs, and means that knowledge of the edges does not provide knowledge of the nodes. \section{Multi-graphs} There are no clear and widely used definitions for multi-graphs, so here we will make clear a definition that we believe will be useful for biological computations. We define a multi-graph to consist of two components, one a set of nodes and the second a list of edge sets. Each edge set corresponds to a potentially different set of relationships between the nodes (which are common to all edge sets). We denote this by $G=(V, E_L)$, where $V$ is the set of nodes and $E_L = (E_1, \ldots, E_L)$ is a collection of $L$ edge sets. Each with a potentially distinct set of relationships. The edge sets are essentially identical to the edge sets for a graph, and hence can have arbitrary attributes associated with them, the edges can be either \textit{directed} or \textit{undirected} and self-loops are allowed. It is not clear whether there should be distinct types of multigraphs as there are graphs. It will surely be more flexible to support a list of edge sets, and to allow these to have different structures. Current definition does not extend the \Rclass{graph} class. The definition is: <>= getClass("multiGraph") @ \begin{description} \item[nodes] A vector of node identifiers. %% FIXME: if these are node identifiers, then shouldn't we use %% "character"? Elsewhere, there seems to be an assumption that %% node labels or identifiers are character. \item[edgeL] A possibly named list of instances of the \Rclass{edgeSet} class. \end{description} The \Rclass{edgeSet} class is a virtual class with several different extensions. These include a \Rclass{edgeSetNEL} and an \Rclass{edgeSetAM}, others will be added once the interface stabilizes. Edge attributes are in the edgeData slot in the edgeSet class. This implies that edgeSets in a multiGraph can have completely unrelated edge attributes. Another approach would be to maintain a list conforming to the edgeSet list containing edge attributes that would enforce the same attributes to be defined for all edges in the multiGraph. \subsection{Methods} In some ways it would be most natural to have \Robject{edges} methods for the \Rclass{edgeSet} class the issues raised in Section~\ref{sec:edgerep} seem to preclude this and it only seems to make sense to have \Robject{node} and \Robject{edges} methods for the \Rclass{multiGraph} class. It will probably make sense to be able to name the edgeSets within a multiGraph and to be able to extract graph objects from the multiGraph representing any of the edgeSets. There should be methods to produce graph objects based on intersection, union, and more complex combination algorithms. The edgeSets may represent interaction data with reliability estimates as edge weights. The user may want to produce a graph object combining the available data to obtain most reliable edges. We may want to consider apply type operations to apply an operation across all edgeSets in a multiGraph. \subsection{Use Cases} An important motivator for the \Rclass{multiGraph} class is the representation of data from protein interaction experiments. Our goal is to represent these data in terms of what interactions were tested, and of those which ones are either positive or negative. \section{Bipartite Graphs} A bipartite graph graph is a graph where the nodes can be divided into two sets, say $V_1$ and $V_2$, such that all edges are between members of $V_1$ and members of $V_2$ and there are no edges between any two elements of $V_1$, nor of $V_2$. \end{document} graph/inst/doc/GraphClass.pdf0000644000175400017540000044575513175724631017202 0ustar00biocbuildbiocbuild%PDF-1.5 %ÐÔÅØ 41 0 obj << /Length 3393 /Filter /FlateDecode >> stream xÚ•É’ÛÆõÊÅ`•£Ñh,N%UR,9Jì‰/ŽáMÔDŸ·v7@ÌH:H¯_¿}ëysûÕ7ïr{cŠÔe~s{S5i~S6YZ5ææv{ókbVkcr—¼_™ä´²&ááܯÖ6K¶— ¾í{úöÛí?¾yWß4iSæ%"ËnÖ¹Ië¬fL·ÖáÆ*y¼ ø÷¸ZçUÒú©Nú{A̸cÿ^Úö½•ËwœVy €ô1‚{ïp ÁÏøõv—J¡ïÂÖã#üw@¤Çިɦ…†þt½q#{ÚaèÂñâfÀ{æ ùí…ñn˜3°Ãåöñ! Ú«\Q”Ƥs,J¡$n³Hä¦J-œÀvt–Ë ë•zò*-3‹tµäú•+“v‡,Z›´'ø°ågå·ªRÆ 4ˇnÀO;˜Íl¸0Ï´rߟå7#V5‡.BòeÓ¡x{$î¨Â2IJ2Yç ˜i-’)c#ST °îŸEKjýÈoÊÂ2ce‡×;<ásË;˜?X$Û‚ß3B?.h¾µ|´W(/ž¶‚A¤Äg{ã¶z†{”w¹#ù!OªørbŸØªx'ˆ‚­ÁÉ›¢X0£‰ µ¸”®Öθä â$ù£ ž¬b¡t¼eË>g’Í…tÌ«žnBÊù황“õ'³—DhvÉ 4¹ cî\ƒÅ’OX[¦¹ù|§¨ ÷¢SÀq^(„Žm¨8éù7k[iVšE§% ûb-ð`íØ)¢RѶ®’¢všþLòwû"ïÆe©ËÍ"ïë°sžÆNÜïžù€îZ4%º[®¨Z¡ŽØÕ鎬Ñ|&Õ=î»i2?ò÷;TêÇ)£óud-‰„Ì­S' ,è¤ò,µÆNe­H E$íŠ4 âsm­,ÿ„ñ=üûáZ8Ö¤Îz9?=°ÁúøçÓ IºÝˆÌö(ªǼÈý™W$¿ãá”± ™…3Y½Q7Eäºø&Ù[üq,RV,-£ãï 1¼b²Œ‰ 2NœUʾ¿¦Üd–¼$ÿ‚z¯Á¿\¶„ *—FA&ËäÏP¯”eòv1œ\0fä‰ý’BúõÖ¥yV…3–èmœ'"’“ú{$”‰ NÁ¬%x“t9´\Ò4ilñí"!ui?Eˆž@ˆõÉåV†·“¿ˆþ%rtËmZTå4ñnÕ[â@U¨‡Ò3¥Ã,ìë¡…Ü/Ýÿ´Ü•r#:®d$q¸ÊMâ¼FrîØö׮ʒ÷÷ŒÊ'4=0 Veä("Ü…büÍEVË(ŠX=²·“ßÉÓª¬g–6AQ§Yîfêoª¨ÍÚEE¯J¦c¾)$](Àƒ€ù¥¤щþÁ'Lc³hv iÕ¶A¡^´Ø:a´sâÌ7ëƒ?„ê¼ÆI!çŠPÈáóÈ¿Gj–ô¥ÖV/*Ì!ÅÔ=!ƒ”óOT~¹"”å³3«J¬ê…е…õ6„fMÁ륬] §mÑq‡BÚ+?QÅ8ŒóP@‚ÃW¦® ¸×“¥+UL•ͬfT‘SjëO?ˆ€8“=jW‰ðÂ9Dš2:øW´´i+ßB2PizeAƒöóÖ6ÃÀ•6¹Ä«\úÚÛ¨•Ê«xƒƒ^*e#H» Òžâ.ÊÔïßZ©‹‡kÕ¬ äܼª{ãkS€b¦ šütíZ• jLE÷eŠVxÖZC>!Ô…Õ&Û•>0M½Ûã#}¦Âs »¦† À¾lçÊï“ïçÑÚ2i|4n…Pìr"–„=åXìOM)÷ÓpBv\ÔPQ4S3¦n¾°‘9ÂËå¶S>Ï ø,$¾äÇ~”ÝÊMQÄý/hKù @cIØÊ©]K ´–ɰÂ*óÕ|:ö‘ŠÀ¯×BžÉ'?ì5Yq€. éRãÙƒ8Î0– ´›b§•IP)Šg5$p‰ï ¸Û”UivX «‡ žH´ÜEtlxP ¬F„üGD}GgsEF-B²Æ ž àHÀ§ßÙqQŒ§}®†Ó¥λU]$—³7t­œX¯Æ2 Á°”+s’Ïþ( “Ù~žêF†…Œ¦ò2îéõº5AQ{"T#–Q€ÇųZmÇ䨅ÿCàrì“#|I ð”ú‹»•ó& 80t O=°¨¶’Zta.¦éa)hÙ|a¨c­O=xÜv2þÕûê¡[ó™·r·:ÉmQÍ`ó©ÍiZìd€a'Š!êÛQ^âN+>òº°E‘, z^£îÔÍÉWÏDfÁ*ÏÂáätœiË™¬ólÐ '™Éî½9è¼ÐMÃ8n`„Q¼>E 5ãî¯òäp^µH§ï4V;Ãn¦»˜ü>ÚwÕ„=;,ÓôY”etÊÀ d&ü¨i)†ƒGDào\ß0Øgjznù‡tNfËnj9ðá`­…Á¶×} µ¸à”45?}d§-?“Å·£6˜pqaî€á,©gÞ¸@$.¨r )ý8i.®æÍ1ãB0E;¡¦V¿ É0ò)Ýá €š ‡ŽŒïÂ4›ÄÁ±rb;çX ¾ïŸääše%»o¢›’V'If<g¹#MpŒBeˆ&àm¦ žbºÈe,>ðc,iÚ «W ,I|ݶ¤çôÞ‹E4›«0ЦÂí‰âåÈKÇNÕª<S{ñ©á)žÝiñâé>|Aéã45M%¾® †¼ýà¯n àK™ð!®t}û ’ ,dÇxüUÃ9í$á–]0MäVFå?>´'Á€Õ3è'‰ÆŽµÞ.aAÏÓÝs&G‚ËXäýE¼µ ²‘†‹ A÷‘ˆíï¸%c/ˆzâú¹˜ä>݈¥ý‚›Åj¹µ64Ÿ2 ·„üý—÷?­jKáñ߯д €‡v˜Ä[¹Pœ6³bmrE³¢§I¾V˸E/m À ˜&Ì þºZ»Üúºú.ÁŸ)R›äOtð|BÏë4u^К`×…ôýM‡¤~–ðE'Ì.ø.¾1µN™ m?.‚éÀt\ŸMËÏŸKŸ•¥V*–?äY"èËLò› &·©þõÁÏ^­:¯•Íà~|ó¿…ˆ“5Rz$p .ìŽ]e¤4R]Á Ùáv8€áÚ{Y»ç*ÒdEµÈÞåBS½¤ìo…>ݨÕÊŸ€ùlYVÞÊýtu&î·2Ûg8…ì—4ý&â²#Í_£ÿç*hå‰#;¢üY õNìk.°îó(@[yK·xlw¯^ ÿþu ºˆˆï—¬:Ú¢4_¢mª…ÏØþœ4ÏFøØõ'>ŸŒÌÓ"ܦÍ=ç8ñ’«“Š"Íœ¿¼Z&ä wÎ*® —Ñzzð3É«¹Í&C x ÃjÂ6,V×U|õ±Ý‡‚J“}¨®ïnË4s{¨ 0©ñbèËÎ(lZ—.šýYCMUʦcæ†þ8eZ.`az¸•S{ÐQ/d ꯜ\“¦IŽ­\q¯‹‡¥'ï1° ³ úÖòÏV“CçÛò—ió^“k{&ò·ïôA2¼?…­øÌߣӑó(€dS¡”g>Õz?aÛó•mLÂUxÉM’Û¨½ S°T;ÑŸ¶=êU˜Ìj>N§.íi2ßY¨ûËO8”R®1Ï_æ/ä‹ÙõÔböÊ×xêŠÓ­!OnÂTÒÏ“¡åßê¤kË ÔBÁïC‹íù.*˜Îí9B0éŸ}m®·8¹å±mtéX¸ØzÐꌜ÷¡»e)(ÚÍb«°è©Öf¡ÏÄêå†hƒ'=ðM¥I[·º0þ}Šëa[!H†@yò~dHö>4¥öNbâ¦?úpß×:Èå» èœ|¥ÅVÈ>ðP\:ãן™Q‡±ÉàÁí°\GÇ"T ù.ª§;Iõa^tíÀ.u¹¿à݆©uÜÔÐÔ $,·Øò<øK ;¥KM]A¨R« •ÿ_½½ýêÿÖg endstream endobj 55 0 obj << /Length 3185 /Filter /FlateDecode >> stream xÚ½ZK“ÛÆ¾ûWì¬a3x¥rq’U¢”­TY›Ê!Î bIÚ|…àŠ’}ú9˜ÕÊ©ä°K`=Ó=ýøºxøæÛ·Õ]×EVÜ=<ÝÕ6N­½+ê$.ëôîau÷Ïèa³H£nñ¯‡¿~ûÖdÞà,‰Ó"½KxX£Vð·¦Ñiô'økàïB¿4Û_ÉÚ¸,kÜhöíi'y®ÃpÔQÖùê5úÎÆ¡ýbi’,êñùx&ZÔ€ïyn.B÷¼…ð÷|‘Uiº‰žxö0S –ÅÚ+üÑXfb™•ÑÊq|š ”Eëss–7øZFgšq‚ÙEÔµKdùn™Z—ii\ƒ°ˆ[¤ƒ;ÿ¸€…prÿyQÙ(¦Y©k8ižSø'­©aÛÞsûŒÂÀ?¤v@²GFd´Üþ´)í;SñÑèfއž‰9ÙÁ´‹¯_Ipö<[=¿5­ŸÃÑœ6ïïáåû‰/ã*ÏtF‹{izÈÏ‚ü®›N¸®rØÒó~š³rÏ?‘®uà]{'Z‡ÇM'’i\á8Yš’(ÃÏnKS˜0ž°©ˆVÓ¢t7aïühw²$qR£¿(ÅŸÉR:œÚ~æ¡{šyI~‚?à™Tså÷C³W;·=ö<«½RƒHÀy¥'•—tìG²¸½èÓ%ëžóÔ²*§ ÍHÿ$t·bŽðø|Ⱥ=‹ oVûd“d=©~š2ÖMTmÜ~d…~äˆÆ/=é?œ&±ãbpûÚÀeõLl*–‚k¹ÁO¶5Ñ‚_;9:!êÝ«_z3šlÆYÄÊ9ò?³%±„oí¨ˆuuÝÈêî ­@™_(äô þd|2 1+RµVx¼Qhl¼uO;ô)6nÅöL]°'Žd ì>ð»ª#ý†TQww@]XRÐæÔË”\ =Ö©çj‚Ú ÷L„Ì] ¼­ZY½;Œý©[ŽÌ¾ÎBçïªß¨aˆkŒ°«'ŠRÇá•ö+ÒØ‡ ÑM?‘Â鳨˜ú]²‹ù´og`«YâÂÖA´¾„,‘xHlö~9Øc~ï.Óð·u R„nw•±úã^±|àá¡k$"#Ç=b0ŠÎͰ18êN³ú³42sÇrÌPKÐŽM!,†áéäÙè‡î²Á&Ñ é–ìð—×&‡ÖßJÏ«G.4ÿâЉñÒjØ¥ÇöôìY´Ð6v?Ïø‰†&-K¾¿¨.âRàC󜴃BS¢'Î’t¦¯( ÚY&üŽ™¶ù ×Îà%ïCá©–ü”äÉ‘**`‚ÑÏ]{–ôV~¥á9Mý‘¿V 4¯RýÆ6$Ó¦u¦Ï}b€e5ŠÎHúp£fdé.bî¸`¢øàM$‘¬¼e}-<Êá~JR‹ aÅ\ ß(ÆÒ¦3bäy…ŸÏUq‘IÄõû Êp,I¡–£c E˜9 „ºu9œÄEܬœ„Í©ž?T:¸òs`™Ø@:gáÄÅe[H®.ò?ääAÙ`hœ:îéåFÛ|˜Gê—Z… Ðýˆúñ9`bFiœÖuè‰Çå! ÜU ú¡¸ÉV‘÷Ø+Ô\oF%4ì}¹6ë-ã_žãB4øé¾ ˆ «£¬»wMšˆñ·,¹®)R³U [ Y ðÐßr¨ä5’SX+uIv?ÒâçϣصRF;Ù+ZÒòÉ#ÊEêb/g ®ÐÔŠ—sùÆDÑ8-㺞­OxkÀÜé`>bâþFNr0”ÇÜz‘—2žÿ7âÒ­yRPÙ\†~ÅG‡µNœô'iQÇI’‡…ê'ø÷>ô,èFÎ1Be¢_AíZÏ"¯4í=ÒÜÆU:ï>L‘pJ–°W¼ò³Wsƒ·±ï0yø"²Zy›AF³ã±ã*/×b <#Û*g-=©:K-B™9f·±l1¯- 0<¦Â79¥MàÉHá†nBÌXºTGÁ´pÝ•„ƒê!Ðé>…yÞeêî&7q>w±rkòžJ+h+½\Ìñ#l¿-»FïTÆA)_õáUâç\e§Å(皪'›—|=”DäÁPKÿ¹i×HCħ»¦8„¿¡\½éÈ(÷èm3Å­Q.NÎG©¡ ƒøë¤ M˜¼? rÚ-–’_iÊ™3eórØO À×|€Ù´¦ˆ™VÎn±i¨.bÏ-Τæ ì#QÊ Mb’T«Â÷!{’ kiàhÕy0ÌP›$î¨Es$½6KM §:*S=$Œ¶, %ûã³»ªÖÈÁ¸Us…ƒžÛ©üˆ³WbTmOÇó”u¦ 8íúµÖ™ÇIæ¬S´MC“M¹º?s¡ ûn/¹°•êi>²fìq(l0hlf×À†k`[¦ Å«ZëËøÕ*ïÅšÉDB.Ñ Z]5ko†Ÿft< ØùàT’’ãOp«V†:Œï Ÿ¹®+«áΞ»áŠÞF‰´Pµ£¬BÇXêCy•jœ©üKxcÇZ‡UË»e•.IÀXU ÉiÞ,Vxo4M&±Ñ}ÃúÆ£fÄR 7é)Žõ<ó ªg2q ­ëíGEcri¨›ïxÀ(AËM8ªäB~/›a\è›&Ðìm?÷ÖÆL(¸†?pcw¿©¹ßÈ…’Üʈ^ávgüÂʧj®í-^ì“4r®F\aht‘SúJD÷w…î ¶s×-¨rßrNI6\&ÐK¯Êº )ÑÙ¸â°W”‘dÚ˘gŠ›Ág£4ÛƒÖgì”3¡|·;wqÔ›üÞ÷÷ßã¸4ôzµò¬:G‘ û Në‹ZüòšÌÊHÝe2—X½Õa:B“8ï“øÉ×ßzÄ3^ä]^ךo’:È¢WÜš¿Q[?ïCË2¶¥yM¥FëãKuã¾°ùª×Fr÷ÎŒN`|“ù*:É>_FQ÷þWL(Ä‘3üaB|‹ÃLžÄõÿID¾Z߀֩è<]¥RŽX˜ŠR`Iäjÿþ5e¿YiÕ“‡KÒ—+XªtþóU•=÷…ŠÑ»ŽÙÏ=f ‰ìoT¡SÞê5³|䮋8­ªy4ò8¿9ã/0=Í1ï+àxÛË÷wüµ@{!G÷•üæqa_d÷D}üûý°ý/|¢”_ç¿Ò‘O™²è‰¿DðʹÞýCʱ¶ŸvøÌ@è‹ÛöëúÍG˜ÕPŒú€ƒ½»Í*OT&œÙSð­“?™™;Ÿ¯Û-í¹;¤ðR‰›>ì¼L|Ò™›xøìâ»¶Uÿâ݈çªù\ÕkØá“Î~":ïâ¥9 µ¿9^x?3ž @FYþ*6܇Öï>JU&ôÖz`Âzg’yL4ënøt €ýâ-CVÇX6_{a×7÷ßüˆ)„k endstream endobj 62 0 obj << /Length 3604 /Filter /FlateDecode >> stream xÚ½ZÝsã¶Ï_áÉ“<àçuÚ™krÉ\çréyš‡$4EÛêI¢+ʹ\ÿúî'>(Ê—tš>Ø"p±Ø]ìþv¿Ü|öå7Ö]“µei¯nî®ê6³WU›guk®n6W?¬lvmVözmŒ-WïFxÙÃßp½vu¹úz8ÁKÛü›®ºùë—ß4WmÖV¶B‚ùÕÚ4™k„Úß`Ô¡g…iW·×k[­F¤òÀ-x¡µ^mpØÄ­6oð¹Y Øqï{ŽÚ©#Ä>õ±E½ãß#«Ý4Eäy~xÿÈC> ¥ýÑû-14ðË¿ ý œÂÌDòH|e×ë:7«×=bëÙ8†¹F~$Öq5O‘H‰ÇYÅÚuVçMº…hñîX»&×wzždWGÖ:4]RlSeyõë…zI¯ÕŒB}Uemíš@Àe•“¶KºÕ¯£1 ü²á7$ü†„ßD‡öŽ‘«•ŽZtݪ›åOw"ÙéÄ$ýGÝt‹÷²¸£MMé&£·=[…L0±jM^dy;S­Ä‚…]XgyQþÏ•+¢Ìlmµ-ê+eºÿë^,k»ú^ƒÊ÷ ñëóù,U•••û]E3«ýãÆf•5¿«´&L¸ºšÅ>hðy ƒ(Ìöèàrl±{?±œHìø… Í‰Ÿø•$ s\‹2ª ‚^¥A/ìQîkqw¦.³¢-gˆa¼fÛzÕwŠzðm«}ñÅGßø†žÄåùs2øøž¼ ùåÐ÷æíú“liXµÌ`ž C߃“z߃­r+¿-ÁWràGRÃôÀdÈ!Ýîü’«0ÃûkYÕðÈ cºæÀ+…3ÄÀ™Ÿií½f‚µH ?_—0§‚Iae†±º¾W£b %*!¾¢À†0’,ó#waë¸gû3à‡VBFþ/å¶Ìê¢ÔÀÃèüûE³ú;;xoñ‡kàöÔ¶£zs»ÂÇ;~|E:ãÑŸJ¾¿n ZX‘¯DR§ ›Ô!´¨,àµ{T0v²ù¨À›ƒœ`·#ó‚ž1,EJ™y‹—Æ1¥}ÎJˆ’ðB$oãØ‘ýƇçžiê4bºDJdü|äuÄÑ9[²ÊïãàZ'Û_c´Î-ÁÁñVz¤†iH?߆zBiu;¬šÐüÜûÇØWÕs¿ óˆ‚ÏÏî…ø6pÎÌ}öT¯nŸØ=áäÛSän»Ã9äNºÆCXYOŽø"e&‰¤I»™ô™Ápq׉†°·•oÚæq^Äi,6܉`Æý"ÝÃRFèÍÆE\ÈtÄ ^Rî=¢Üò‚fs7L;Òå1`È×ùî‰ßÒâdo_ÁË›¬YeMëc©¤Ñ,œLq>ùl ¨r¯!q"Ö† º½†%Üi 1äVf~6øí«7_ðÓ­ž¿uo?D‘Œèá_¼ÿB7ºÕÏÄÜÞàÈK—‰ê u­‹³Há»mV7øn9?î%¤Öü…Ô5$]m‚²‰  ìõp³©×ƒ®'¡ç™.W7ŽäÀ‘Èž‡Dí{$õ¤Ó‡(ÄáÏ­[GÞ© |Xdâ ²¢t±Ê Û’Çìž|¹Z:þ9H.okõNXb6ªôÀ_#Þ½Ô‚ çƒ‚a|AÒO·Nò§±GÄŽ”˜´Œ$p²ý@ÞF«0:aþ½¸VËN >è±[9}¶è“:‹ÍèÙ9©÷rTŒîFÇû l œöSÞO– ‹Ì••Ðî…ƒ+!f” ¿C¡îHkr.X%||XÆÖd äéQÝF㸋žÑ¸ð·ß ëŽ2H „øüa«%7 Kh'¤_!ËÁBÒA„D|Ž¢Gî7jX÷Á.2õÌ&pà$ܱo–}nÓº"Q˜#‹ÂŽdQü³Ìm¨sä  ‹­ Å—6.¤í¶">»Z—2'Ã+ý–÷ß)•[¼„h(Š@×=Ré»Oß#.…o抌i]Y  p@>Åä–c,LÔàu€&|ôa·µÞÁÁW=O³|âdé4UŽuI†ýyÞCZ€@P8°ÔÕñøx.ygCÛ9‚ ´žíªxÓy"Ìü&¡×`â©œÝ ,âü)†s“ñË!Îxˆ:zŠ2òGëßL#f¯ÀeÙgêM¬ h‚{Ù ÏI¥(>¶NØÖhµ$³0!âóÞ6™5>‡ßp5¦Ä)aþÞQ—VX“zR[ÏËï yc3JO”%ÿ¶9 `0÷.˃tÈ-ÈìÐÎîÖbp,èñQò޵Î&Õ<­Ún2ÍÑÁÛÏwðkD3ƪ)LH‘°™s‡îÈoœ FR¦Ö¨B óŽ7ÝHtãM’Ô€¡¾#sŠ&òLL&­«Mi­O¾™¡1; NõÞûø¤qÊËlº|%á+¤>=¦—d>³Üø ¢u€ƒ¦üË>œ‰äRñÏÔçÏ$9{V”0…jîlBâé·MFŸü MDÑ÷òÌËóTï/°û“ ë2½¢õÎÛ»ñ‡>/’q2ð­Ü‹(_à…ŠBëø—KN›bßä«Õá’×RqÁ55yf猑…Zà»!¨*YM•å®\tQ|È•àX\ªÏ›K,X¿™2dÉÙÞŸñ5}¹yc¸<«5}=Ç~=‘ïïÄ(¯ÌD§„úERJ9‹.M"Ä ªÑB>B4µÈBƒcÎꈧø‚ЂÀpí³:CßójÁ×®-(¥7y¢8Ö–ft™iªgudV/¿[@¤-äÜþ^‹ ‰èð_¢kR ßn³ÑD?Ö ­ çwg×è¼¥‹>໪·¢*Ìþ;‚몆„{v§3Ò Õïê\’!½õg'ZlÄG*çeøkŒýµ&9Xr¬Ù1î7WíÙ×é§ï´Œ#£¶`^MY±y)¯ù‘*¬êD†)å‹ÎOΨû%E¼t—ì9¬öùñØûk¹ˆÏsØjùz猽?l9RlÈù¹wŽmz/ UºV=U4¯ŠÕKIRÂÙ$Ýexô§X¡í\»ÖÅmx¢P²w!/‡ö½Ü3ÐKz[Yq·TyLüº‘ë%‡;=µÜûK*&@h“77 gø6ñVkñžðì*Dtp¨ð ϊѳ£ÖƒïçBBšæÙ~}U3½n:¬i‘@<:~ºx„éb‹£ê‹N+Çè7÷Ë÷ fþ…¯3'Ð3ä~ìA,D³Ú@äk³¦iôz>{uóÙWA_ endstream endobj 68 0 obj << /Length 1719 /Filter /FlateDecode >> stream xÚ¥XKÛ6¾çWø(µ"’¢Ǧh‚(zˆÛŠd[»vjI†åífÿ}çŇ,¯Ó6—]rÄypæ›ýnýæí{mJ¥µµz±~X”uªE¥e­ëÝâĤK•¨åJ)m“ŸaÝ^öÃre²d7.ÿ\ÿôö}µ¨ÓºÐòg‹•ªRS óÇOæÉ8tÈÉ›ç¥.“ÿ¼qD¢M°¼øïU2<²cÊf¹Ò³Û% £œíaÓ\àÏÓWG¦"aàåžý"[6×èÈ^ÙÔÖ`6™Û’J•<’±hÛ삺N•)C×’Ù*A—€ž»Pž< ç`Ìž²ú,’Vª´ˆÕ[ìœòO,{f±i Áž-º©ƒ#ƒ:ÒŽ~Ç'$ˆaä("·»p¦GE‹•É5ܯ‚(&XÇ'äÞ¢`<9`LmžhœæÝØ¢¹n¬÷?,O°<?ŠvìZæ Cb8ì›~Ç Xß㋨@1mç8&jÚü…¡n=x©Q1=Œî¹ N®s˜žxí Läi®<&šžNÎ…ª:µ¥ýoX+ w±FQË3]KÔ >ÿ€F#¹‹A£SSø«v¥ãÃð¢gÁ]'’03ÑšT©XLÙ°2K­±S4}ÄØª*yFÇ#o&Ãù7(å…ÉÆ´¢ªú*¦@p1…å†|"ôççtÆ£‹èûp¬¥x´÷‹À ÈÏ|w”s…µð¿‘Ä.“ïóÍi/'{©es›‹`óÌ`r¡Ê‰ùÔ…íiÙ¢CNƒNØ3WŸÑg[w€Âƒ° Ý54hn#*ÓÛ€dJg á–‚‚\ïD5Ikz.ólÑÿ¿Dê( £rç±sëÞkâ<;?)* ûÁ™»cbäÖ ²Æ]P²fdºƒJNçðÑ¿ òÅ¥$7½ â6{*¨°£©œ7Àg÷è¹”~‡óä©¿¦p5Ä þ¾Y²º“ƒö—×ñÇPëÆEƒ:ä­ÒµÁ. 7#±ÖšŸ.W9ôõõ¾åƒ7òÉônÚ0P‹‰ÀŸur˜^¿™täß‘m o¨$<‚䣧Œ>¸Ý…Šíè€Ú¹›¶bhCÿs2ôW6õÔ3· à~Ü;K€«BiA8¾ª)#Æ«iUà†§wg¤8h[ -±mù–Ž:»‚œ'xÙä35Liƒ@Þr¾‚”˱8Ñêl’ÅUíº›- ÓûŽá»÷:n"{‡ÍÅM=Sºatcˆ÷4˜«9ñáœ;™üû²Â¸¬òÂwæE܉~$Š˜—ûÀ „É 'ž¤s0Aˆ®1 up;`l"(¶QŽW†"]ª½¡Ÿ ™$~l¶òq”-68\\:ù.ž&ñ¯çóý¢Œ‰Ky:ÊC´t™Ve4Ækã]réÄp•6ù° ÅéëCý÷TÝJ²½;Q±¥bBÐñ‰  ÀŽs1Cñâ&`~ˆÖ÷¦•ÃQêÿ;žhp‡¹=+Ë ÆÈ†–í¦¾v₆| ¡ÆcÔÏ7 ŸO0´L:,|ç"p‘9ï ܇¸mJqD' " µI­¶7š?»Ø( ÁÆ‘ª¸J~O±Z¨÷ø8Òuá.DA;R_¹³?¶—^O‡ã;‘=/Ý5ÏSÃŽB9Ï{æ‹x^mžÙWès¬iG§g‡ý2ÓÜ/ñ³SÆ“òè`5+ün˜Û¢|73õm”šótLñ½’ڜ藔t™BQš ßx™ö±‰ŽÀD¥lžš¼p) Óx­%gsI×wÂyÂ$=_œ-’½Î’¾§ýíÜÕ*­²Jr_@Æ·‘SsŽŒwBáÀ´3Y.ã¶ýìûódP³Ó)¾÷aÜ¢g)¶MÏ‹0¾ák˜=ü œÀgpJ´ôc!ŒarQ Å–É(݆<o—è!T–©ñ™ßøD¹(Òº„WV“´R`”æu·ÔÜáeZWÔp&~Nôá{Ðæ_ѧ&úô\¼=ËX»&O²à½¼ueš•†ž5…G^‡n…Ñɳ °–o·\0ˆ³kyô -rä—7\ĺ0ßîó †’¹ÏÉ\úåI†'_4åZ7*Mš©oŽË]›¢RâÝ»¸PÃrŠ»î\õ$ºT€p}ÕOŽRJã&•ë¦{ §fÆþ;÷ØWCæakl †³,ÞÈPÿøv-ö^Æu¬[ÆT¥·,ð70PSù ßÞü¸~ói endstream endobj 82 0 obj << /Length1 1884 /Length2 13602 /Length3 0 /Length 14773 /Filter /FlateDecode >> stream xÚ÷PÜÛò ãîî Ü%¸»‡à68 î\ƒ»»»;îî\BpÉãȽçÜÿ÷U½WS5ó[Ý«{wï½zÏ %™’*£ˆ)È( ²sfdebáˆ)ˆj±²XXØ™XXØ()Õ,m€ÿ±#Pj,Av¼ÿbˆ9œßmâFÎïD@ÖÅÀÊ`åäeåâea°±°ðü‡r䈹Zš˜² ; ¥ÈÞÃÑÒÜÂù}ÿ<hLh¬<<\ †DlŽ–&Fv#g  íûŠ&F6U‰%ÐÙãRÐð[8;Ûó23»¹¹1Ù:1Íin–ΠÐÑh ø£e€¢‘-ðïÖ˜(j–N9TAfÎnFŽ@À»ÁÆÒhçôâbg t¼¯P•‘|²ÚýE–ÿ‹Àø{s¬L¬ÿM÷wô‰,íþ 621ÙÚÙyXÚ™Ì,m€€O’òLÎîÎ #;Ó?ˆF6N ÷x#W#K#ãwŸ¥$E”FïþÝŸ“‰£¥½³““¥Í=2ÿ‘æ}›%ìLÅ@¶¶@;g'„?ê·tš¼ï»ó߇kmr³óú2³´35û£ S{fu;K ŒøßœwÂ?6s 3à# '7躛X0ÿ±€š‡=ðO'ëæ÷|¼ìAö³÷6€>–fÀ÷/'#W ÀÙÑèãõoÇÿ"VV€©¥‰3Àhni‡ðOöw3Ðì/ü~þŽ–î–wù±Xþxý÷Iï]a¦ ;è1³Šúg 9ú¿[þ¯STäðbüÈ `dûÈ`eåäp½?øüo%#Ë¿ëøW¬ŒÀóW¹ïûôŸ’]ÿÖÍßB øß\Š wå4ÿ]—å#‹Éûëÿg¹ÿòÿOådùúÿ­HÒÅÆæO?Í_„ÿ¿‘­¥Çߌwåº8¿Oè}ìþ/Uø×节lLÿ¯OÆÙè}DìÌmþ»–N’–î@S%Kg‹¿äò—]ýA³±´*œ,ÿ¸ZŒ¬,,ÿÇ÷>]&Öïׇӻ&ÿt߇ç—”°3™þ1elï'läèhäð~Èïè#À‹õ}MîªÀÌdr~¼7ç09"üq¢ï2gÿÃôâ0Küqq˜åÿAïLÅÿ"n¶wÁýƒ¸ÌšÿE<ïÈèôgüz_Á俈ƒã½Ïñ?ì?ö€Ùô_À ü|_Öì_Àlþ/øžÎâŸäß‘‡½ÅûöãÝfù/øÞ¡Õ¿à{q¶ÿÀ÷)bþWìûÜ2ƒþÉþÎ}¿Ùÿå~/Íþ÷{¬ýûåjg4sþÇÊú·õ¯©ø¯ù½ û÷Yý«qÖ÷^ÿß wú|ø'þ]ÌÎn ¹ßOÀå_ðý\ÿßKwû²½G»ÿ ÿGY&.Žï…:ÿ9ûï²ûþó2Ý&+‹ ¾ «ú Î‡ZB7ƃI9ÊÍTZF¯Ç.—'Ø$ÚšÌ/[Žw"I£ýhë{4·Â«¤¯^§m°¡í ÊÏÞ/q*3ËÓ8CS…§" ƒÄðDŒj‡ޯÞÖmà=²”¹.Ü(Jù˜nRî ƒåkã!‹ʇ5œrˆ/峌ÑêQº%ó”yÆY xä0ÎŒÄptWî¨ó·ws9S¿Ieãè|΢ً¼´·Ùb<7*ÕØœzñ?àkãCÞbŒÏPy‰%Ëâ.y•Gm ,es…Y ˆ_ÓÀ'÷UÂs *cÈð—ïÁüЛãf’áh£a2¥ ¢&m€ó ¦,•2K¨¦-5È"²ô{|¥ V×7¥ïê#é=»Pï¡óŽÿŠÇËýcÒ–äNs·;Ë—ó冹ÂhFJ:É l“bUñÎì„jž„ʨStc¡—Îàï<¦â{F+H«Pïbg[ÝMÞDwn\¥Égc¥Æ£„Ëó×¢žX‹Q¦Z¬[ìÀi4ƒnž°½ig¶7ö„f®ë 6\Q”óŠ,îÙÔ-–,['"uÍiå'S­32¢™A!”¹×¬îór¡5å Œ3Žs J¤t4¢Þ\Sš½ŸÁô‘PfÀ>÷E6/蘷EÀ¥PiP×.MþJÙ!†_#^Fd1˜àä‘ǨÖ`“šêDR¼…GŠB££èQØÕ:bÔ¹•I‚ÈÛ³¢G;ß2ƒ/[±é“)3÷>ùÜ Z™´È*W÷¢ yEvA®óYò¨ÝÌA˜ÍGÄDIIdQÍý'Ö`U²·AˆB6º¦3B˜ù CÂ(n^­Øö€Ÿ6ê°­A2ù¿„tÜ* vÇMà©´–àÏ”åtoÖ"9™J%‹S¨qZéœg§ÔLyæE¶ #Ѿ¯êÄŒÅ}H6¯gíx1C…Õ=J‚e9†ç:'1R™ÒG§I‘ǵB§øNfë¶ÉÖAÑa÷Ýqçƒwäï5ŒsyØÄ½i¯ ­ÃßOƒLRIn˜Í•ûkÞJl¢'æën7ÆÖ½’µÙˆˆŠ•%fV|1¦B±6äôœgÄýæ‡_½oÑé7/ÎSðg1T•÷QØŠ;òŸ+©¨Kíªðu ëõ”#ƒyPv7Úú9mðíXŒyBlõ:¯®N™WK‹t?à$СP—ˆ jRÈûtFƒæ«u*š} гáþ±è·§P¼Ý…:]éߓϘweßãß°áž1M({Q}i°ÈVd]—œPP}R‡yݧ·½ör9C0ª'&ЂÒਔ¿ÙùAN‘¦@UÏÕˆÞ†žì¬½õ ¥ëHìçý1I¡¤õ#yúîÔâ³ÕþÚ¨É$ñ˜¨†ù3+úĸ³±î®žïàw§9£Yäî,ý÷[.:«>;G+ä‹£¦2qtð «žC½ÃAW¦>g÷68ì2øËxk‰¾Ï6ù5Å>¦¡LŒ@YÄ ÷b±I°~Ťer{8MâÈVv52äXZ¡„HëâÍÞTyaßn­,³:ûWÎÐÀ°0Ýk£NÛ\ú…‹CfêâG i—mNYž½I/"&È~ÈR$sHùCü&6eC—SÍ$žªbÒ-¦uòÑ¥œPYÉã΃½¤ºëzÓZ¹#6æóc]ÖñzŸi¡Wn¡¹©/Û·¶¹¤sr; Áb`;ý¨šiÑÚw›gcr¤Fk Šò!µ}3Ä~¤ Dª3A!KDŠuì°ç@û,¾Ë&”ìJ`ÆU’=ˆ½è¸O¸WÛõ‹9P4Q¨Y¶3¡ý²|Ð\b¾¶<  ’3\ÍÎ@[y%üíslÎ7ÙWZ™ \Ø%¸(]ã_ÙwúüxY¶fkÇ3ΚöÄzûŒ]¦ƒ^y>ˆü 釳"û Â†Ç®gqÐ!ÃŽöU‹ðá“ –’¨¥àÍþôiÑåÙšk˜†ä‚®ˆ…u(µ¹z-“Š" êò’¦gˆ8\Q†@Ùµ„‡³ãw8ÇÒ½m*ÀŽ›–X<ëdËXox%ö7ÿå„:ùÁíòã&M¡á'¶”ȶ×B¼5Ocvh–=Äï·Œxjµ^5ðÒ—±‘ú¡:Ý@LÑáÝ]ä”âŽ(Åë`À~ïSN› `0§„]9aš1šÅcfë¼ /'†âVNÀ·µFÈ¥ûŒá|õ±zŸ=:Q€4æÛd'þr;n)jÿ¢·ŽJúNàÇ™hÌ ò,Ç–[$w4‹j ²=kïª#Õ\¡2ˆj#Fj ·X ÓÑ€û šj$MS'u™K½§¹44ï9èô8SÙÝÏå*(Rþ¨-¦4h[Š_÷ˆZ½Èqlu#zÖ#ÕÜià—W"—SŽ·}}¿;º[÷[à}%ÑOÝ¡±Z²Ç·Üo¢ÍÙÆÜþÓm3ZÈ‹i eµ]QUË%»–ö1Û©‘´ÃŽ—eH¹¾û¬7éˆýK_ÓaùùüLjôç8‹̲”zí'K½¯ª­;U¸Û¹š~‘Z"†Á„5×ú=A ™YгùDµGY†5:¢’¡Ý› ò”ó¶êD™G˜¢@ÿNºµ¤v ÷v9ÚmÿƇn|¾¨×àT3u>|Ž·Èèúl|e«¶›ø§ †¸óŽPRó”-Ðæ:2%±:Vo§ExQYÇ:Í|€íö¨m)§¡§.0¿„°Ó¸Öõ Og:,~Ò@W(FÓù;ÿH03_[4Rù¡ Q•íFuNmõ]V†DŒ®ãˆ&+RßÜL<(±hÌco1|…Vt<âJ·[xÕ<à8jJVÈ áà°’ô‹›CqflµgF<§™Èè…‡ i¯°µwÚ«j´$£B›¬ÑÀÑqÕfå+Ýe‡ø— ¼ì}¢•öåˆêð@–+ªh4È¢þ¨âboÿŒµ«§<Û™ªÅü<”ä2â¼è—L²†Ë1Ô¹Çï@®é,ªË—'Rú­÷RPMRKh†7êæáá-•çu¢î‹ÃoÓ3nô¦pM ŠÖí~á´¶Ô¶¼j0Ó9ð<¹ (99á¯:j…šó†NÿTʼnM™mâIQ8ìÛ‹˜ñýÓ!42$b6<.”ÚhE•5ýç0pØ/‰è‚ì¤oIŽw|ìÑèËØè /vUﻫ2oØÉ@øjEH¿2R)g¬ü7LF„7ø]—t3Ö ÓMâ÷ÍCeÍÊg{…æR4b¦27<òy?¥» Ua Ââ¯*´ _Q‹]mÉÆü-r6Ý6=†}¿¹:aG M)ŠäºÁˆÏ\/+ѫˆ…ˆuöªB”­–Þß#½ÁtàîqŒù ¹3g¹pF§íš¾L£5Ï”»±ql¢-÷š2_ˆûêÐÖ<šs”ä±½nHQ1Û+öS¢&¯ðUu:'"ƒ§ð‚GáÙ `=öû¸)¤c£3ƒyÁMUú°0—¥ìY‘iïÅóG"¹{óôX´™§ýýJ^X»º•ËÃœÚ ìÝP·ͦ]À­°‚™@¤øÐúgíýðLØæÅçG¯»¿¼] ’|$…Ïõ_ ¢•eïIÉ£zŒ©­rýä—X»Ü}ëu×ôkÌ´ýŒ#ð¸ÇdJù„tÈ"ø»˜o ³çkKˇýkýIˆ\A†Ï™LÄ’Ï뉅àé9”à‰RßpÛ±¬º¨À.pÔ©&U+ËYPOÒ£*RU«&Ì»u÷ZûŸ#ÒN7f è-¸™B±ÈFK…â~sø@ÓŽþÊK½4_Ìã»;%‘è®-ð/Ô¦iŒÇË+k¸œE:H´ ¢Bô¨È—Ãyó—[þà½"®Y•9÷‹YI±F:‰ŽEîv?àxàu}¨…Ög²ZöXÁœ|öÃÇ'îkƒnó 1'6±&.¹¬Ô…l!¸ÉŽÉ)ÚÜä0ŽM¤'”uV ð~P{Er[ .¶ ©–I–Òý²ox + àÎèç—}ý¢AŽWìQNâ¹DZ+âOÅ«FØ€#d}Çk´~nÅ,æVJø-Üá Êü~~·ÝRk¡ÄIȵ7+áJ%o"ë;?ŽÉ·³':­×oËrÅV%i7&öz~¾iÜü½Â{±}©ìÍVmlY¡_(“Ày¸'¯>xúÆê÷÷E@ÚÊ“WÜã¹÷?mèÃ9ƒ-ÑÂL‘ª¿ÐŠ3 M,‚-òtfÕ˜q¨Ü±•_ÆÌhµµ#ùQ ¨xÂi»Ð:ìl{ž0ïPnáØ-öT϶2~(ao£‹ Æ»ÃÐrÃÍ À%P.¦ôÄ*ëñσÆÍ¦#}Í22»Z°d**Åɴ׺äÄ GgMúîOhøóµð†cñ˜²ŽH§¥ÛÙ¥q†Á‚Ëd¿ÞöC*q=Ä'Q|'ùªBßj¢¾SA¬¦¶N“MKÚü"!§oºFÙØKþóM5’In°<‡Ê›Ë!ÔmAê9ã)ûöFøŒb^÷ò›í,§›®LˆßvJTû:ØDÏY!y˜°;íB."¸"ב,W)Ôü+WÙÁ¢\£'ÞÖãØº!ˆÒ‰sTEˆŠ×£7¬\K3EAc¥ÖG¬lâ‘tâ{–yÏQ™ÈîòâåÍ6¿.óÀ™ÿZ£V>v•gÔ¶$À±°È“|ºyL?”bœCÈI X=7íÀWµ¢ øA°^ŒÒTÕ¶)¹± ÞSkŽ‚¬uU¸dŸ>vþ䵓±&þ“€ªº>ÄdäWý/´Æßfä…E"áó¯°NÀõˆîº5é4>}%Q¨r^]dP½27€3ÐkÊe ލ>a”ÓZxðl8¢—òއË33ˆwÔ“Š[Û2rXËŒ1-±…_ÐkR°+øçJS+^ÏÜøkUÞ¸Ýï8rÉt÷rE¥ŠoM*CHÈHö›†êΛ‡þÑZÕïó[ßítÃzm¶¨£é0ïHèi¯}Y“e•‡B$;SšMÔµL´Ÿ-w ñ CµrY±¯Pë7Ò¡ž*F뿆爕^ê_ –Ñ–NÂÇ܇2Å„;Þ¢ì'ùu¾F³L •¾‡ù ´ÕN~}¥.SÑÉ·~0œ*‰þ…8ƒ›hÜC^_g¼xUÛ½µ2O·÷â‡ÿvæx¶rí]ÍËÛ‚¦­+ú©OÝet]ÚøÊHªF\¥æüçgùÎ&´Ycð&„N™ E<±ÅL‡&#&¹4t†¡*$A±x›$8.êl[³DªFÐëàNoð¡åÛlpú q=²mßPqÊ<' B˜• *ú|†}á£M“7K¨„ÉÞ .h¾gXþËÖíÙr¹²~»G/ÁGžÎ´#»t> Hûµr¹Ï±¿¡!&*P&ÿãÙ}‚ÕÉ ¬ŸF—mlO{¿[›inAJè~c—0àHÕèÒÜÌ}ŒŒÊ¾mŸüÂ.îÀ0ÔMõ°ªÃ®€ôkÇ fÀy‘sª¼¯U ‰ïÇEüs3ªv¢ž¸x ËlÒB¡ò‹Ž€§ÿÛX‘Rœ˜ºC¼u.XbàÅ–Ðë¶ZDdZøëóg)"’ÚaMdRr•Ï\W%šoë³`s'‹Cµ§á—i{,ô“ jŠjÃB¿p£ ×.Œ:d+Ü=|Û¸ñG\ì›ò½‘Û…>^Öâÿþ CëôªhÊŸES3½}¬^¡0OÃ=L’f,Ñ£|*qƒæÌÔoÆùƒàl1ï›:Öø&{9¾€Q~»Ÿ/žØžÞëÍ~©?)Û,.¹¸XéžAØž¤,÷Ìë·×ñQ6¯_=Å:&hè¬QØÃðfàZ£ám`Iù;^=UG2«Á’ù#ðc¥,RY™½a;GŸ êy[Úƒ›$ñÙ׳‹³ h¸³yy Ý=4´?æÄ=Ã@mD˜KÎ7ÿXÏørm,­¬S…5]FrMVòßÈ@$£á°½FAÅæ[»9T†Z“ø¬yÄu|;HÏL’mV•íÍÏŸ|÷JLgl»ûýèC:Ö7/µAùŬ*:]²@4VdÆ [ßJn#`@&þ°šý³‰n 5q¸ùFþBÕ]i—Ù4Y{&¡?exߤùú„¢Ó#MH‚£uÝö\Ö· åpêÖ8Ç=¢òáT¹_â•úO]?Ê%KÁv=„=%‰C@y)¹êG¦ÕÏp<ŸE…ZUÕ!¸×Û˜;ÀòCô|wQJòÐ Åd·ìS·Óg £.¨>„ÏÍ\Ÿ2·;¹¼ò.±éÅì’x‰Ç]:Ó%ßF´Á%$oÈhÁÔšÎ!¢E·J„'oJƒ©[B TÅò+`‘ú\UÛ¥2¬?[öΚ—0Î.(ñ©Š…EF=˜£—áUü´ÎÆâA' þÙ¡¼Í¤ÁAÒmø”±©|R±É­2l—–žÔÔZÈxÐè~=D»ˆ‹ßyæ ›/ŠºÍ öpmÉ´ ©Éç}“cÂÁ»Y¶LV¬fg5 cv?h~ùE";yu)mõ—¼äaÓ(ꦃž‘?éNx…§ Kîð(ÙÏ Íë(ðد4„Gœ+Zƒ¼¢W£bd„ 8´*ê¤Eó¹ý$9¦ÝÃtšy.4w’–ec«ktM|.÷/¾­‘>üt2ø¿ÚNÌ,ͬ˜ð•›Oƒ›yªÇ'§×¦--$9Å$L1`ž¢1gq©±*9€8¦Grö—¸ë¢|iZÃ,ÖKe_S”G^FF©èN»gÀHÃ!4&O'$fSí}Ò_ÜåMÌòNy”¬¨¹ŒJSïÒÙU· Öd”¨¹Àæ å\X¡~u¬MÚƒ°Ðbæ6«e7?¤@ÐcFËïÑ}^¹¼a76ù”¢õÅ ?gÚ§Kp£ýQr2Ú£@ä«Ð«4ÃìܽJ÷RpÛró¦_1b“ކZjSU0C×—aÀEÝ9‘«Öj‘M-êGÒ¬#F#"(çÄbíWªmJ§ÍDÁ.«¨‚\ojÞ®è¸A¢ÛÕÂ3ÁÐ žÌíë ñHVïP»@+Cønµ4e™SC•'¬¹_˶´?¿¢Çv ùÄâ6J®ÇË`lȤ¹¨2Nm¤^ MÑN}š‘Pjj½iŽPwºGlI¬`¸_Ü«Ñn—ô &aŒ•Öª?ƒxÛÓÐ$´„ûY‡¯d0R2¸•ÄÅR3i(‹„ ~ ´¿öɧ±ðºsFAÛj*^0Ï.©ôÕ>Xo. wæ}Zlá“]Ežïý«€Õ½Ô璘H ½ª4S±__å Z ï„7T—¿÷šõŒÊ=Ò>J'Ó?£ím<øÌQ}PÆ->&âuÓà#9Æ+Š`5HYèêOê„ó5@’2` <$¨èÕ•›çájè$žb;(òF~hi1Šýæ2Òû‚gÞÿ¹ÂŒ#R ýä¥*²(àYtô O`V5 g°?Eë£dFò?íEcÎ{²‘$kí³þ·eáz!ÍèjÛ¹½ÑTª×ý ÚV½J3ežêÊÄy»ôgÙ¦öû«­¢º1á·/-ÛÅ”mF/xàFEí4Ú&RÎøì^Œ,”ør=KDJP£uA#éõî>¦ ­_š1æ}¨òÈ)?3œè¨W%=áKnÐóhMPeèŒGùm!¹1œz¶5e}™‹—éåëäl--ÑWµbµªq¾@R-ªdÊ[Û.Sf¦Š˜7’Ü-ÝÁ/íÜ¢©gHº]?o®d_WÎÆ6¡%i(•Ñ_|£iÄó3–W»÷ÒÑ^Úf‹gÞ Â~jb—Ÿ_Céµ ¨Rµ& ßôólïGšûrsF‹4ÃÇ8VæÁÌ“RoÕ—Þ |Þq°8¬»j˜äï >ÈËÓM¯ù&3 ”©Ùâ"š½rðö6ÏsÂÆ uÜ¥“u—Q†‘&¸¾f•å%ë}ì]§#Coß³Áf!}m¯Gs› YUþ®år<¨š¢àÐ3¨‹úa ÅW…aÐl;†QfJ`žÔ½Úé-¥J/çïuw!65•¾e¶ø0k‘:ž³êAó˜™÷±9‘%«O}}«Þâ¶k÷$¤Ã°ë «Ã2 ˜hVk£ÍÀÑ’’Zm­ÑݽÑÇa>ϘËЀr‡$|A! ‘ÂÏ(µ#r– v_£Àg!¼~åg¾45Œ™\#ÉjÕÏädŠÅÏP|„äj„SÐèƒÆbIc·D=èïVOÈ>4šð…Ÿ¡<§ÐÍÜÑzAãëóÚ#VlƯ{ߦÊç¹4õvMÚOŠëX$¸µ¦HM­T3[;¦=ß°ÄÎÕMï™~w‘‡ÖyÃ!Û¿­U¸ž D>÷÷|ó¤Ò¾…iÑmý•§ˆ;‘@RO²@´µLv$ch ä÷ˆÊØpKé LŽá*ås%:*É-£KÝ腇ώ‰woZGææ(hJ¶ÒXfÄÒ wœÃw€˜âpÎÙ*•8{‡x³½ä_ؽø4Cs<Ó¥?á~÷j ,øýávŠóÌ-—™ÿM™é³H“â=¬~ _I­|þÆêßœÖ[{äX·-a¸Ã—Ç –ÄTœ Ú5ëÊÓ©mIhÿfzƒÙ¬o­UÆð°l™j½ èSñC8/4ÝêCoú 7AEU׬ÂP­<×K»n£ŒËƒsYÖµ·j³q®0KxI:už[{K~ØÁæõoR ¦lb*Õ¯ÓD±£.CRìzpGnŽ ©âúaD@˜ÏÛ×ÇFµþéøëÒà­+Ú'Ø[ª–ÉÝó‰R¯åGXþoW½ôoXÏóGéìÒCÞ>^Èœj›¢E1‡Å%ÁE_|Ù%R9O·…ˉŇ 2äi™‹bV2húÜ«‰íDü ôÈ¥¸žYÂbû ƒVoYe—L ‹ïš¯Œí;æŽ~ |/:õÖ]7ɯæzºsláP2g¢YâÑÏKx£2ãõá ?ïÏ‹¹×ú3ª?DŒÓÎ „­‡YB v|‡y鼕ûÎáÎ&ÊA T¡Ã6”,=^vGh‘X’9EËÕLÐ\«}J/‹Aª5´ŠÏíú o”y# BÉ•¹xÄ©–Ú§ìç1u÷Aù*Ü"<Ç©±Ð~ùެY,䮈LæÆqF=|ºÔéÉt<ñ%†±ª}ÉõzOßõÇã³±vhÄOý\¯$%-1Up[Y÷¦ð–à^ƒ¢âJoÙ†–Òœ0«~Ë¿s°¹]_7“áQÒº¿n…ÃÚºQûîɉÏ:Š7ŽGæBq)Ç7 Y‘¶á+Ñ}:ÐqÕæÃe®Òõ\àø [Ód°ã¾¢¶‹ø0Ù7 Ó‘w³L—«%eX™5(Oi‰u†Š…'`cÞѱ<n"_ÕÅ“^™î`‹Üo•Ò^­Šª}paÌâ'¹ÁÀŸfS‘ÃCi?_Ÿ.u®–‡„4ÙüÄæÓE§bæØbnnQÙ!Ãr¿ôE¼Û_Rrf í÷ƒu ›ÙĤç¼Îq…¤{„¡ §ï$@xí5”’AçNm¬Tk¨Ðsbë£Èn->QI|x!bÑ5tð=E.êµQÀVóp°õÒÐxîþI*7¯+¹â³F[Ÿ¨%Ú¹˜w£“ÁF©Ãké=z¦Pxu! ÆlaŠªC›êŠP¨9ÍÐ4Ù¬ñð¡böRû®”ïПW-ÆñÍ ¥Ÿ'±€}i|ñ*ä8bñ§†7眓ýY0,CisTwGX?@OîìãCŒ:IÁôh]ÄšÓséìð_¢)Ú­Þîä÷èõá~¿ìŸLk{½óf~ *5IS’J&˱w¸¡H¯·òé| TåØÏ1Ûi®sç†h: \Ò¨˜‰Vhýá¤à‘Dç•GÓïQ凛´ÏQIt? 7à5±q¿±Ó2ç¤Zëcjo½ehìΊ3ë¦úÚ*þA(k,À@£„©[83POÖD§‘½ïLרáþlr£NÈX]Q'£/ô¦í*½bÔE#ËÈèL"ªçÛø]Á±ãpµdº;Ç15"5Ápœ8-!ôÃÛsu{û!ThçƒÏÑF–>¢„<À™/;Fl Ná…`‰‰è|R ¡E=ËâŠ[!4tÙHáj´~PpA³ï–é̳¯Ääm‡tm€ë‡-.‰€>8¼±Éœg5ÚãÞ‹AhÝÑ™Íï°϶•çÑrD¢™ Ÿaø'ÍoU+ˆÌ4clK±Ú=H5¸¨ÌB,’Òö$p¦Ç»LuÖªá mË)5k¨üñ±³‰&_h?s´Hè‚—½!ÔÈÚ“ýx´äuú)ÕrätøÖx¼`º“,üâÉÌ/Wñd$( à{ôƒL€âuÎZÊ!÷÷kûª#©_VÌ£—­§&ý°)¹Ç–õòFõ§‹ ¥â 0fí§aJ³}c@\¾7ç5ö¾E«¯yc†J›.Éå|®õ,º$º2'Y ¹ìGVè}ÚÊ}ͼDʬ6 Š® :Òú¸8‚A!ÐÑc¥$Žêç©ÌÁeQ„: ½ ¥ P¶åeŠ ÁS¶­Ÿ?jñË·Ó£¹86}Ág–ÕKß{ ¹W5¢ookVCñm¨?‡ÚÔ6Ù.é ½’+û¤ ¢»°ò;¹_*‘AÚ® ‘ˆ @ŽU4Cºe‰F˜" rãú>«w¿Þñþœü\m`$ Ø£·!JöU1«‹¤-¢²ê¸Âãæ›Ž‘ÎÇQæ„$†_¹êÒæ¬Ö½„[*o50<ÌÄQ2r/FÆ xÐ~ 6¨j5ås×"ù^¢ˆZ<^±|Ziµ Db2˜¹\0ÞÛ'S¼;3£¦¥o»pRz ˆÚ(Sà¢GoºõÂÖv•xÌu@ ´S Nåp•÷Õ'È(’È3¬Òí£M´IÅ7ë¸ ÏïŸJǾ|×+§\¢s£ÁãKºLH„ê´» ¢ÓÝï©‘š$¬4Ÿ[8úŒ‹C:H¼‚fð²NïI#‹R= ›Ã+c›IÄ¿ËO>Ÿ—?~ZU&‡¯²_kq„&˜¬Ãñj úQq–äéZ'@qH‘¦ó±‘ù2à‡_⑵ɠ;Ý(öèÝyº'ÖlšÇ2Ù–ô¾«ðʦÛ㇊h2É ¿ Ì>°¯²‹n9poÝ@q|ÔNq€ŒÀü¬­¨¦Zî‡2Oa±ÛÉ© }-þ1$+œîN‘vá[‚iì¬#gã4ž&œ²­…D¸£ÇaN¸oçW½õÉ£Þãhi6…;¢0E³Ð[LÊ—Î8mÒß+&áöÃ:íñ²À42 rÆow(¨žFœ,ø¢j Ÿ»4±ÃàS(ÚöypÙÛa鯙Ý@·­¾Ã·ŸßþÆu®¶4ñ*ÚÍ-¾¢9_“š³›OŸübH>®Œ·Ži@I\¡½,1j±Ò‘ÿ ï¢k´J‹m²ÓóQº©DÃ+¹ž¿Ó1è§Pr¢`€KRIÍs7=¢Ó–›o’Îë‡3.ý(1Nˆ¿çÔ~»7L[¡‰è³Ôoô['¿À„{>‹‹æÕpQ!¼W›ÊXåÜ]œ¨lMo‹|ŒåÂ~˜ßŠ &ÀÒ§£¼’hû®M‘u ç›üºa„î…V¼;yL^r?¢Ãâý@÷÷þ}nà k€2ãuíÕõà©ê¤ûÞKѸ7ø vÂR-džÔÒkHÉÇ ?'/`èê‰SÓBSài‘Ý„Ñå E¤‡®QC:Ýç’ÎJ¿7ñ¡KÊNf.25lÕd†Õ΂rß ^­]<ø*%6jr'Çé#·¦4æx¦ÈÊH3Ý{ÑÉ0ó[DÕÏuÎQo÷»IŽ1K´ívbÕPO)Ö‘ö…Äœ„òE鳇º‡€v]‘#¤Äu 1wÿŽ'nçmLöãœQg£K»à^Ó¤—uo|;F}Í^¿Qø§/¤û*ÀÁ´ÙáßZµã2qˆŒx,"d\Ð`ÈC¾ 7µúâ_|ܽóh´çý ¼>Š;¬…mWmVÉ,MELx0Z8žL.«}>O%Äé!ç=~î\•ÞÛ͹,¡¯¿yEaI»B¦µH‘¶;ö'H èÞH­ÎåøAíÖÜù®¸A4ÈXd‹ \H+é.€#e I:ˆyÐùî×_å2TËpþÞÒ a¦Â&âi(+¿f€e·êªH[Þâ·ÍÇ¢ô~ÊíÙÁ²¾ ®7õü Qd s 0©&ý²ÖúS^À@Rò¬Ó©„=ëÂa~b<¡tžS‚ᨠ¦ [UÄÊÔ¦ä·PÞm£%ûuûœQ ,²X ´ÖÇ锢è:K%¹ÎTby,‚õéË¥&)¢…áÀI(ƒ‹áýÄn<"S`µŠ(‰í9åÄ=?üD§7¿«J=TŒÁ¸ÞLåÍ^öç#æ”u{ì+f³?L?gÀ$ì¦ý¡ KmˆÏù‹'æ <³'Jãéð”H<¸Œ„1*C.!É$‹[ŠÍÚu3‚çµÜ~¼- º *¦"u6ðSÎÍj=|5Ù’E5‹ö“¾ÏÚ¬ÿ“í7G~év[æ/qö]Ϙ£Á„`¾'ž¨ƒÜû#<Ö‹y­ÇÂ+MÅ‚F{¹½õGrd¡-¬Ñ_…» ªÖBŠÃ™4½¾6Ö×aJÞ5Y%]Õþ¨_â3˜ñx¢yÒ—rKC zF8¹/ PÅâN¦Èf.uåÜ3§KIûVÍâ辂¬ùÀ¹Ý7Çìâì6™ŸÔR!¹ŽBœS”~_b­:m{ßcŽxU!¾¯ý¹òhKQOP—$¶p½v!íô\³…bõœÝ˜÷'ñD5Ðûþk«`T‰’}̵Þxˆ@ï¨Õ05ËŽf DÓ7ñ!ÈßKò¦!~$IBï>+8é9?"_`/e iÙ_3ÇÉìÆ3ÞVTØŸÈsŽs[?ó‹›×¦/UÕò2‚ãZ|o¥ ]“b[Ãp1û®û÷Û4.”ÑüWù—U×ÌyÂÕŠAZ ÷ü ¡ˆFs/쌭©áH0µ4Mzßå2+ãbµt‰ ÛŠxŠñÛXYŠ~#øñË3¶OF* i7ð$º ›dâ³ÂA:x|ö%ÞÒ ~Ù>YŠ#ií¼_ˆiCZÇ™ô˜,¢‚>ÏsTä*f¿!xF¬Vèô—.c—/5¤ù°Ò]–„‰xáÜéAœ¡­õ‘¬iÿ”¯Rƒ/¨ŸÁ¢J‘H[pÆP^©Eýzx SÞø=¥Ð4Ĭ+4ðX2Ó‹þ­½Ýv¿{ÑdvõŽ™‡sáÉ_G9{Ìöˆº£§@!ÉSX¯ÌraX½ac»ôÊL±Ž YˆaŒ¼—\ò§kebìór£ NŠ%i*‹/¬…/W’C*I—d9è¯uD~&ÖW›‡ìg¬‘T՟”þ àË=áäLÉíô!§§"çæ½{¥ Ê»ˆYÅicÕ™9_Ÿi/IíóuReVc–§f*B‡®B|/»]§ŽXS± Ë'8‰ç#{’ÎJ‹zûr×ÿ¸š°Öåò ²Q·Ž1·Bø²z÷æè †|k˜m~e<ÅëŠ{†c¦A5&‡Ä§ Vñaöú¥62¸ó fÈï°Ž")ÕÞ/ þ3â#©P¦âO5dÒñÙ£WY˜’2`ÄÀl[íKF¬Æ2ekiˆè×»M·Âzu²n;ÙpÖÄ_C»øê®Ój¥+@mÓnT Á¥f±ôo»YÑ\»qÙÅ`¼ÒGÂYÈå-GgE†dÜ‚¢7£ ‹I/i­´Õ¤¾«Ï0„X§«9A\bÆcÁr‡œmD$ËMn4™W»¹Êð ŽÓ¦Ñ¦øå…b®i–žzîT=ð*ªR\S"8òi.s¾éV(v’ƪ'ác³4XPð’(¿ñ“J¬ÖÅË&?ŽkÞØ jÈb®=sUX;ÍyF×ËÄyØv$×¢sS‰óÕæíê„6„†l’ ÎO¶f¹í÷êÚ¹~Yã­ËN’+-®_ÞeÏÖ‘ô1×ÄÞ—-oerððT<á t.s¯ˆç'”O´‰7¡òxЊä¯?Ôƒ†`0ߦôy‚Ïñ—±æ„Ò†-Û‹ïŽv15ñ_G‚iûýÞuöóÅXêšRŽÖˆÎ‹Âìì*<ÜÏZºÿ¤ÊHÕ˜ƒÍ/Ìu<÷eAѧ SzUˆ¯Ö?Ê–´fÁå—lk\_ÙÏÇ'Å5¼%¼òX[¨,u>uDzþ)Áéçóxkž?ïïtR¨‹÷pœ °V 8jº†@b< ìßT3|'›÷]8€ƒlNü€´á endstream endobj 84 0 obj << /Length1 1839 /Length2 11184 /Length3 0 /Length 12337 /Filter /FlateDecode >> stream xÚ¶T›é.ŒCñâNpw÷âîî%H‚»»)/ÅJ¡hqw/NñR\ w»tfÎÌœóÿkÝ»²Vò=Û÷~Ÿý棣ÒÐf“´†Z‚ä 76.vNa€´ª”7€““‡““•ŽNìæú•Näâ †B„ÿe!íº=Ëd€nφªP@ÉÝÀÅàâææäpsr ýÇê" z€­ªì%(äŠJ' uòv¿¶u{ÎóŸG£€KHH€õw€¤#Èl„Tn¶ ÇçŒV@€6Ô róþ¯Œ¢¶nnNžžžì@GWv¨Ëkq&V€'ØÍ r¹x€¬¿[¨AµÆŽJб»þ©Ð†Ú¸y]@€gØ q}vq‡Xƒ\ÏÙÚŠ*u'äOc•? X ÀÅÎõw¸¿¼CþpZYA€o0ä5Àì¨Ë©°»y¹±€ë߆@Wè³?ÐvZ>üQ: '© >wøW®V.`'7WvW°Ãï9~‡y³,ÄZê肸¹¢þ®Oì²zž»7Ç_‡kzB|ÿƒlÀk›ßmX»;qèBÀÎî E™¿lžE¨ÿÈ^ƒÜ|œœœüB3äeeËñ;Ž·è%×oñsþ¾NP'€Ís ° èùÕ×踹¸ƒü}ÿ­øo„ÊŰ[¹,A¯ÁÔ¢?‹A6âçów{Œ9ŸéÇàüýùûÉô™aÖPˆƒ÷?æ1‡‘¦¶š¦Ë_-ÿ­”’‚z|ÙøxlÜ|\..!€'Àÿ¿ãhÁÕÁù¯"Ä ú³Üç9ý§d¿8Àø×‚0þ;–ô™¹ ã?D7áäã´zþâú¦û.ÿ,ÿåÿJôÿ­HÎÝÁá=ãŸÿ=Ðìàý—Å3sÝÝž·@ú¼ ÿ5Õý¹ºRPëÿÕ)ºŸwAòÚáï1‚]åÀ^ k °›•íŸtùS®û{ÑÀÔüûj°qqrþîy»¬ìŸ¯×gNþ¡=/ϧ”…XA­o7?èâôFå|¦7À—ëy­A^°ÀÁº=»ž›óØ@]PŸ(??€Cê·èO$àþ 8dþF\ù€Cñôì§ú7|Öiÿƒx:ÿ >‡îßHèÙøpXý~OƒÃú_ð9?è_Àaó7äû î.ÿÒ?ñú_ð¹ Û¿!ïs¶ÞN¶Ï·Û?Ï2ð¿àsóÿ‚ϵ9þ¹žkû—ïóJs@ÿ‰þlû|éÿKý\Ó?êç‘;=3ú¯æ¸žËûWñ\ϵ¸þ >{¸ýÓës27[Ð? žÉÁáæ ý—Ãó\Ýÿ€ÿE+w—ç+óu~fÒð÷3ä²B]˜…Z‰„ÙU‡µ^‘$õdÛûF·¥ŸÎÄæ»àÒæ~‹‰œÂTù>dÅåR2e¨{iC–ñâÕ"åƒï~S-rds²fËß½ù[­É­Ôù ‚þñû’5}ä/ÈØt^mû=8ûéÛÃ7Áv(Ñå:» bjäã^{öÊ{Õô•|‰˜ÝÒÜ®äWF»/™b‹Ó}c\4M—g™=CDäÆFŽÂŒsì…5}qù 'gü‰Ré- ªÿAO¡¯Ñ*wüÍŒÏ2n×NbZb#"rø œ‘Iz_©ÝT%Â9ßâO J±ŸlÈÍfÄÛ°€Î¼UT ¢%ÃãkÃD{æÁÒ%X“ VšëtRC{Ú9íD8¹5ES\樮ší;>±åÓï]B%úíÝ5¸#3z’(Â.%Úw#wSçøç‰óûû„¦j“ž_½ç¶Ìs3îòza¶Ã \ŸøËCP>ŸëŠëLÀ Ñ¿rÙRåˆ Y~Ðì¯Ày²‡%ý7 §l7Rµ¢ÔáƒùÔ£öaß*TbÑLtûæ:ÜꜳΖ{ؼu‰1h2>ÓNX© ‚0¬|CíÿÅøÝ~_¶”%ŽÄH™*l4¬Z ²ü˜Ï@Òùú¼èJƒ\x¬vòóTÚžu¥”u’ߤbÉįp3Ï(U¬ŠÒqŒÌWv)~rAg4ûÈÄY‡;ÿ\Å4¹hº±êÐux˜ #q™ZÈþ‡TôõPš,ñ#»®KÛü¡:–tÝGÏʧ“ ÔûZÚÄÍž‰u“5}5véBF½)“#µím²Ü¶îFž—˜ˆÓ’§æØ®]ŸU#4®JÐÚã½m´½‹×f;,W_ŽöX¹“;Å÷_j¬&~Qsw™eRs·ý?25(3¶×Ü¥1kVäOÔÐH‰ØÙ9ºÉV<æ£Ë<ú‚§l'àrC¡Ð“0ÔgKSnf¹…svm”ýÝ$¾•Ws AQZ cfލ‘h ÿ|&Ÿò÷éÌØo,>÷/åÛò8a™:] Ë’c„ç*ñ†¬òa ¤0>ç (êÍ? Înåê?5ei™bÔ½êE42Ê"wô³"„†EV%…(š8F¨ÁD@2ÞýÜ:D¿Ì%æ4!~°QAÏrA˜ŸEHi Vï} @Yü1zŸUÞ‰ /Æø•aq›28­Ë¦*㞣ÐJ?-T&}à¸X6ôë­V?£ VqXón>BïÂTGæ=­Ó1n2Õ5ùÒ™PÍ-€˜€Ñ©ÿç÷K‰¦,û> p"=d㌯/HëØÚ™W6:Wy?áÑ.¼Ó“1b«LíªÈ˜Ö_TNuª«Dÿ•ßXŸ ã~Ux<«¾_Ã…ÿ¶Œê&˜,˜E/Àû1tñÍÞÒTG2«X3Ëp‰ž¡Õ6OÏ—aâAû>4ÛsÄC$‡üIJâ 0s«.¤áR­scºCø8¯È8ƒv4ÇZxl…?›a÷ }§Ê½i1ÂçR¡’p&\@´Yóqðvµ¼}4`õÑ*gNÕâEñj4.•¹¸ÆÏJ¹Ÿ/ËÅç·ÓqSêÓ‘·Px“[É}@pº(,JD‡ˆ7Äö/‰ÑEÅY*ÌJauÅ+^â,0!¦Êç°á™‡±ŒOG"¥q_·&:f‚·oƲ¹`\ªR>œ÷‰•þY–\×0‚uÜMD¢qÉhœOfGñ7“¾}w#ôÉCÌV¶ÓÜ€±ß;1Bí:™Qˆ¤h‡ÐšoV4Ù€·±…—*áÝ@: é‹,…Òe|i{¶Éü´©AQs*EmEÖý‚sãô©°!Y›8™ÓÀeJ£Jó]íÀ¼Ñ‡通‡‹›‹²œë ®£ÂÁ·€×T¬x¨mKþqy˜šc,ÇÈBĦÔönÍ’|¬ ²àÌÈ:áø³mdjbulB¯¸—Úáçüe§WøOÙMò*A ê…¶âg9ß qçßös‹³I:a•DŽ•XLQÇ(É”ˆïø‰¾vÛãÆÏ: Q#©¡,d¦ºŒÛŽ»¶üž¾’XV¢bËþY#X0Ò…+(SÌ1~®’si6Êý,çå\TÁåqEÉÚ›}4qæ/™#LÉ?Ô™€©ðo”FÁï¿:§;*”k6m¹QÞÌÚ7°˜þ—Ñ`y=~O`,á­cu„‡(¶‘&©™Ȩ̂ÚO-çÌKªïÌCî*ê­cb–£¿îÍ(½xQ”å;)DDÓA÷q-ª=ôwW±HU*i§ø Üþ þ×ÕNËéfÄAou@¬ïéiâG¿\ &Šnv™22ž¼…íeÚb¼‚Ý­VžÀêÌÔ©®=Ù2„-«ß´ž¢“ »u0êƒF¬ªK¹Þ†Òß{˘¨Ö¾ÔR˜?ÖŒkÉv±9—/2»7áã‹L¡ÙXðÀ77¯eÂß!PÞÔ.4#« €4e”«’ܱ Ò1ú­iÓ~¤ ™¹qèãÏ{wvô¡œ•ñ6j*û2-ˆÂ„ëË´Z‹·@I@?²œRHÀal ¬WI*O– ~e—4NˆÔüÊq˜*”Ã+>–˜ŸrŒ"¬¦®üŸ‚™èUæ•mÔ¹±~T¯¯Õ¦ku+ÙjAOm.9oNÝѵJ›¼ßèØ;ˆ73¬V+~C_š a{ÇtÓqç^…Úé΂çPk}±É[·×èóÙJÅ52™àZG ÉX±ÌcŒä>|û„~´Úu¬*>s3Æ5DðÑ/›3¹iŽ" ´˜‘wPì±sà(UîƺÔO7Ó Ÿ“6Â,IJåwZ.¼÷w÷ To‹S f`²æä<@| ñ¦§µF£Nƒ°ñssõŸ\*%5aCXc*É lð¤}¨ãVø/Kb—®xäý u`‰w2ó 4ƒfâp S¹³ ¹lYAËAKr×힪ê:‰•2®Jéڤ͵·]¡¾È/î‚Ût–Ûι+ôˆßV¨¹®LÅßb¶ÓI….Ú¾9ýNK6Ǻv&ž³IrÝSN[¤VȯĜÆÊ4–rIaëŽ 0(U1ÖµdMž–[qi(þH\»bwÈÕœ†µ’£³Ë)Ö¨EåúÕâcÉ=TQ¥´¬Êâ¨ÜÖÔ?`ÃJ½ÄÁPÐ[)rw™*Ï!ÐU.6 eÛÑ¢ ŠÙ^…¤’)IÕ“½‚lÃ>ñKrîuÛvâiÉ }ÉÑ™E÷MḑO?¦] O >·í ¹zºHP}²ëÜA.ÎAŸ'= K”ƒ#Ô {ZŒ’_ôhA’°Ð^ÝV9iõÔa]® e•¼Éþ!jxe L«/?X†‹ßGÁû¶Ú¾6*ø“ö¶ƒ†„2!†3cOŽF~b³l–—šð&g­çsH-º†'©lPÑÅ8­ZKØ¢hþCñSµb‹+üƒª ÉüOÙÊÚƒì•{ê]ªf"–,*X]Éè·ã_áÐY%xp:7¼ROøiH;ž€Tg1bQ4ƒ¸whC)Cî…„±–ùÉ+ò5K4+“Ï&–k3´—.bíL£‰ŸH®„âE³ ¸RºØ?÷*Øsù>oIÕoh)2j …€ÔDzT¸ôä^/¹^oí—9§Û§ˆ¥F¼aqµFÄU¶þP0>ªÈÜ”Â7k{¼š*ïÕ{îLyÓÁuE`Ó¹~] È2ÝD_3eŒ?ZDÞ:r7”˜Ä]Zò ÏÝÚÏ™ý€òªZ¸?Ï¡ì¶Ï¸-¸»Ð.ß<¥cÓr®ô²5o©}¿pDVÔ¢éW<›Ä¯ S¶³}$ymZ  úÕ}®ÞÞáÈ3 û¡2Í;FîgzزSO-7^Sr¯¿"ór-¡”ô¸¸·D¦ºù,b+oνðzJ•¥ìN®žiWý”Þñ%k(u¤2TŽÓÚ2HÒ|@ü4’³lÃ+o6RfŸÄè»Ó3*¼„Š’Q÷¸lÊRj˜·$I¶ ž‘À¯Ê¹±ºreÁËŒ¹í7¯sÍúЯ]M˜½KÎ t+öÃVLޏ<6ÑÕžÊñß¿Æ.Ì)\Ž¥ÏWõŸÿ^<È“#c?hkg’ãân-¾r"rn’$5oÿ •3ŸÌ°²¿PËšŽ½¦„XäßzÌáÏ0qg¦|ÏHÚ¤¥9Äà¿™ô}·5©õŠÃ×f_SúÄ¿Ôúk'ÊàÜeÀü†KÍU%6ÅÁºåÉzŸn×l]œÐùžyj³Å(%å;7¢²4­½B;Úp„°®Ø©BdmÑÑŠµäÉ+uÊk 1+»3¯Õ ‹ ž²•±c„IM{?JQ•ôªI)áÇí0ÌI²_ÚwúŠj v§IlÑrXæoÐYiÕG¬AZ©˜C7N3ó„ððc(—Ô°ÜÍu²frÕ£SÒÿbF}T3£/rWô»¸ cyšåü\G&Œ›hM¨|\^ÚÍ_¡ëy¡N-;wH>q|º/&—Ð#ÚO™‹5iLîʼnórã-ãÂÈ×7$®ç|™’=ŒýPpx€¡ÞèEmר9îµ5F@K`¢åÆ®²þté¾n®OÄ)ìe~ìWµìˆüKVEÀèøÅœƒxýýNùšÕFAD'" ‡ƒTîd¼OøÛv.Z»â{}|\}«—„ ܽðhÂ7Ýz¬ÖA°&´"ŸÊÜÈt´:éðT»d'Tr\ }£ejixÑ®Ce|ŸMìDh!…ØÖ_sFG•eÑSœ’·Ðß(.—Ì¥_ÂrÍZcbÞ½ÊÊb.ñRw|5þ9Tæ($@7ßœ±dÏÁ­XoÍP^ä o):"•‚sé7 b¸þ­¢Ã¡SÎw¾„ÿòýv¡*.«x¨Ã>Y‘³ó«/ÑDxÒ±_~±bò/úêïVs|ö½nÙÚö=7¯!‹y&·Cv«q'ãEú’lÙFxâ{úZe*vN·=¦²ÂDl›ã‹™é3¤x‡IH¦ªç–è{4¿!ŒŽë¼ÆãeO"nš–¯Â~íüËys¼ 7_ §í]NÃ`dã ϧO2=Ê£+-Y»3½JB‚×± Ã_5¤¯º©6t2ÜRò [J H'°˜o§·kÑÈoJêõº™ÆÈ,[c´×R½˜å Zgv_Aüîsn¹Iø%$ý é~©‹áäá§jµ˜/9õtg“įQ`NIt èmG£øçÕÛwÎnW§õǸ«Ì‰®a1}ä+ï`µÜ©±Ò‡o›6sí'êñ;ö×—$Rüò;¨ƒûR)÷ƒÖ¿ëð.â› dýaªÞ†‡oƒôqZÌws4?ãò? ¡ÅaÁIr¢5‰$<Ó÷Fð?ÖÕè–5‘Ì<Lj~„ÆöøfÑË–¿η`Ed’IW5(ú¦ æÌ,fUÚ(Û{~ùt9Ö5оñÜ.Ô8Ú£j°6l¸´(Tí»¦.F/Þm••°#˜>v™æ‹RÕãÛ2zü²lŒðK–"x¾5^‰ôéÇìã …>µ¤²îZOFšœuðCãÒ+§ç;w›Hd»aägŒ±§p1mj‹¼_ ç¢cÇÂ"ïYãè3ð·(IßÉ_(q¡ÑH“ÇSÕ®ûçbl!¨*× I6 _æ·wa¼} õÇ©ÓÌ[ŽÕ~CÜ a«L0¶½èÑô©[®,%Z<ªå75»zw¬8ÒÓZ–êŽΜ©%Úµrº^O}$Ì¿0–qB_~±P§ó⌠©šP|€ p¬ ˜Çq;ÑÂX‹ú„ÚÿõÛ“‹P‰mãøà6ùz¤mŠM9@tiØ+}ÝݨFs¢iE(8¹¡M56ÿÒ]Þüè­kÜ¥j½s¸¯Ùžñ¸lS3=IÇ’]à]Å‘ie›©Zø ÞìQ}"†¾ÓëSG•\ú‡²ÚC˜ÂÉ Ÿf9º ÙÒÑN‘òÁW7¶<\?‡×¾ÓkùaRËt=mûMRž¹Sö:ã…!•ÓJªMù»Èà'îÓ/<éÁ™.ņäQÒäÒ¥ªÆÚD˜pd%•3×hņ“¹Û4(ÙÆ†™ ɵvÊLœÕÅ1}p„žzö|æpË)Ó3!¨õ3#ph[E³:=6pˆß‹]ÜôcØã{Ïs§PŸÕI7%?dZk(«‚´¤æ~BÏ< We„¸þ4»þÏŽ$x¹´Iï{Û—¹´R/P]‘FÇ¢…M å¹½´&jùÙVìY¯YF‡{NDœáÍ+ÿØ ÃÖݨÂÂîÙ[¸5æ3„XÅ“Ñ"yꓬá½à…Ùo{_»‚Îë%…R’US’ç YðkOÝŸGNYuó¥=&¨ ï¢Ø=${m`èKûíôñ…Õæ™õî!3E=¨’î !_{{€ß;(Ãüœ1¬ò¶¹ÀQ´g1·Z°>‹ß-RDþrp¹^4˜ºtŒCc­ø5_Å$YU°æŒ—ùq¢·3+N-Œ?IJ6 å/þEõ@f\¦œ­Óƒ#ÿdðø]M‚ÙðqºðæÕ»Ÿœ-tÅ»ÓÁw‚SÑìùÕ{yÊiõ/×å`WAa˜”,?·"&óRšsÍìMÒ’Ð ÜX”1?N’ “Çv“é“2m«½±²CÓ—|3¬Ÿó`»v’:Íõ~Î8)às»j³ÐTæ=!{[ò­×-…HqAŠ}ï—ZLjS*Ïq½sªä(©4Ï/Ý妯r§Då#®0#J³ vŧР£jЙïɉ, QW4“AÙØUL¾Z0.ÈKÒ¿@à­p Bæ"7S ûv7¶Q̠× “Î „°ëA´¯dÅ3UŇ3ßW¼Ü<ì9È+èå~”ÄMúÚ³IZއätá„´yÕ@Â:Ê0ºÕRvý ŠÎßzïáZV´g²þ ÝFY¨WmÕ•NÄëæ Dë}ßñALóÄj²‹ÊÁl2ìß@æ¦jEÿ-Km“[¡êécå*WŒÎVJ‰?쀞åéô®_…Ù5‹0 ‹®ÖiUÖNÉŠ}Ü—‚OuA xõbë/á}™=zëËYEúêdX¸uõFÚQ0­×¸.-L)^ fßü£šÖÔ‘/ÄÉv/¡i °{ßÍ÷ݪоPûÜÝf>©Ñìæ~»ñÔÊ&yNïÜü!ãŒíL““¿õUóËI6l7|>/Áݹ陾êVY™aÏÒ¦5>éðW8ÉŠvò²ª°ä8†Èe¨ÓÎ-( Q{ ê+7ŸÊê!÷Ÿ¨5.<„ŠéŽ£g£ºÝõæó–7O¶?}s–lm¨â.ÄžäÄO…ks2}O›þÔ&i×ϹœóödmʼÞÞ/Û$ùcŸçÒn)Á!’(ư½¢JHØx²Ý©!Š´pO3vûúÕ–´ÖÝá÷z!®(¨ryƒedìÅÐÜùËŒþº×ëY«ù‰M¦ùOäGÉäñ¨rIª7ªÑxE!N¢~\Ê›uc’h:ý:b˜;¼q¨ßÞ©â¦ãZ¿~-=ØÐ*Ê!\êpŸ2ùõÍ׸«MêÉuw¥ÉnYYQTEv­ºW©pRTžZQ„¨0äŽ ¢ü®ob°W‡QœÉqаó¢¾Á}C»n‚}u$3fa)|¹°'F®iκ'Ä"†©²oȃºÿ–#él‚Ì¼Ïæ†ä#1ú(±TB§ôQåf’77–>aKÎ[tü΂gÞ]U¯Ýú‚ç0†z؆ؿórX&¡Kã_Êdò]›¯’²{ÖÑñ,\™2æ]‹Õp‘v@˜áùˆ1Øt›»0#¯ñÒŠ€,£`´â²"RöÝ}ÓÁï5q͵¬C89畤ãïl™<>ân<2è%!ÒëðWQ-a{P7ñkŸÕ¶F–") Ø+"¢°úñÅàË04÷UmƒxBc ©#Ö¤®«Âök›}ˆ/¬Âæe)¬ð£‹¢Y1Á©Íp¨DÂÂvœ2AF­Z97I‰#ð5&{íñ(LT½*VGB›ò\•Æ5*%-ÿý¼yæq6\¦G_:iCJÇGm•fÙqXOÆÞVýazš(/yÔÀê2Ó¸`Î-@íìGÄ* êdYƒ¼ÒòcßÍÛË…öãïûjw¬ã³zq“ áÚQë;¯b¸1·}Ðg1äUHÈ9ûJd]ö<–QüËÀ)<•X £X犃ïîñ©\מÓôZ ¯"¹j¯M`ÑgÇ÷S¿zåjƒñýFªÞn­¦WðØhŸÁ-µÁìaÅž"H#o¯8-Žý Š¥›†GÖp?KBzNô­ÐW&õëªM•z…T4ÞÚ%=,¼IÌåy¯k–4´DZZÍzë­[!#¼V`q2È¡É9éÙ'¼-9™Óq”zòù"ƒÒ]¤ìš8ßĸ£DƒèÐõ“î&Rý:™‡raÇ%š”ØùF‡*i,Rê¥ãÔdW¨M;w5Âsxšðl÷:hMÓl<á[m¦²Ú:‘>JtsÎÐЙ«Õt²ñ àT"ñTáƒô@ÑÄñç)\¢—ëC|Ù‚ Ë:¦lo6°I(œÞwOfgýbîÝÜBÄ{«kPªõ„¼Uœät&E.›ÄÀŒ÷.HÒnéE£]RHBBÙ0¹ã¶KUyØã˜‹¯Ûúþ꽡b+«=‚ž´ÏlïeÞK•ù´«4tÿBóÄÂóf¤s·êãÄÃ_¬æ–:¶ Úš&ÀÑöÞáØ¤ÆÞ(úÜÝ.+¥cqB5 û¯Ÿvœ$3òÃÊè—ÍSÐW¥£¯˜´;{ä[“ûd_;’דּkØTƒýùQ‘ Þù&öÛ‰–¡-Êã¿9a,æžbSS|$zY¥_×ýU¢ší…³¶™ôŠšŠs®y޹"Sû¥û§sŒl­‹LÆ8¾’ô,x1j;’mÜ‚XòÞæ_h}yBÒ^ ÁIGÕ¤a-.—زMe‚äÔ+ÑDÇŠQŠÉäS§1’¢óú¥{EV¥[2Ú&É;k0ëœïqe "Óè qퟑYȾÏb8GÔ€îæÞ®xm|ªóØ4Ó®FBKÒ»ž™š~ª¯,§h¶ý-…S—³Õà< úr.FNtY yÕ±yè|ÈÅÚˆÄË\2Jò‹¡Å;y‘Å`­jîëEP\jR/ÁuÔ» =²ÂAï¦*Ä«=Ø‹J§0tóž _*ÌNÉ'ñí¤-¾8ÙÌ—Yö›²‘Žêå“©Ô¦x},~X¦ ¶~fÆŸ™;e²­~ÉfðQŒlSØZôD–§ßé¼ZÇ‹£¤©OBˆŒÛúd¢ÂãaåIµi$ê>.ã ÖzUüZÕz2|ÓÉîØ¹¢ª>¥íW¦OMÙ¾¤°ûtÓTÐÕ+œ¥bÍ"óH)Rà»×\dÅ7q«±#«]†JÇnd¼ˆ¡ÿð†þà ’æ‚#yÅ<· ˜çå‚‚ËhÐÀÊm‹±¹¯oÍ¿=S‡†îdû²RàX ûöÿ ÙêTk¤œDøÑÉÒ”tŠºê´uLžÚv'Y¦n>{UÏfd-*ˆ§d5iîL+˱€¤ZÀaÔJY’<3!w±^™·{B~CIE|E=ìŸ9£ƒ43Áš@ ••šCÁGªuià“éêãþ€CÓÝ^<@oœÌo<7SõnUoõjz~ÃÍuÈ¡(L>]²Úô›öb£;ÚÖs—A¢ aåÀõ£¸ÿº¢Â5Y\mòE(+Õ^ËÌ Ñ:%HG÷ü,•) ƒM-‡Ío𰏯Á¥ZY½K3³ç5o§ÆÒE4ÇÈu¿i¥» ­Ç@¾Õ2`VD šëH>âwgøÃ}üÔfpÊ-<²•©×`ä,UÚ.i¶ùðüZoM}Žà^Aé¤!ªûŠOr*ä&  ÁÏ+cb&9,“‰Á¨¼œêò£çl»sŽã”Ú÷Ž’×ýeËC²N+¤û˜y~ñCt>;’/äÃÙßÎÖáí^Ýú_Ú ³ÌÞú®”qgGª.BËøFŠªæ¬ØY«ý€eû“/J€þÆúyî¬cxÞ8Žôñ·Jå*]–M©ð0½æÎï@O :úM!1ùàþadj„½ë6/¶ø"~Ï´èUŒU@¯Ô, ]×TFkqg9ÁK™(5ê 6±wò۳˛šE–Õ:2C#Èž?c–+)êøäSÌJˆ.ŽŠé„lÒyûÜ.ªQü4ìS¨Þ¤6ÃÏÆthÛPÞ/åÙôæ_ÍcæÄa£¬n¬‘éÐZSæ ^Ên…'$1ZÁëjÅwÖac>¨ÑNrV –ý;av-"j”ßÑvËÚÎònšfÍfݹÁmd5𻽧aꊢǕÎTðlü‘íKw{ï J ½Ú÷‡Ú…Êý®26ÃØV^¿(.ø‰ºŠÊ!B¥·'*(xuäu×÷B7jôÀËhºŽ'[ßóÌ¢©1 t6¦ 'æ(‘’«ðí¶Õ·ÛÚ Çõihâ@ÞôD\`°æ œžñÔŽlœöiVߦ®4•µbj¾4j{ìÝ«H•óN9Ü¡ÖöìãíWÉog4÷)6·Œ“DT¢²‹­ß¹Ì}a^"Z¹Ï¥Örìy¬Xþòm¾v¿‰Ñ)¨H»d>V Œ-2šà)MøÈ‹©*àߪRˆù)Ñ"½§3âãÙôÀà^¹ïÁÄ´£Hw™HðoúŠ{ôK[|ª¼¾5{ICÖn¿tFÆž(Ò[VUk~ÌFïD()œ ¼íz %_ QÚ²gF$âV’-dŒ;6^\1Äרê©ï;. ôÜŒs›ït²ë¾w’â?&„`¡ÐþŠ• ï>ù"¬ú)ÜŠ¥Áv®ŠÀNQ®oî _­üáy‰?<ïåói FV·Þæ{ÐÔé|¼Ncµ»·‘ªÚ ¦„õn™î"¥"iðí»’Ç²Û[ªÇÔÔ'@åW8û [7fÄ2'›$¸[æVe/` H³JîœD¥@Ì¢Þ„Æ3b3ÞÀ­¨ŒÁÔÁ:OÞÒ— ›æˆß÷ˆï[fQík1_] Êɘì›V• —=éõG割´Çû[í+­”IÅýÛ/TV)•ûûòé¸fJ‚D.ž#KkL_Ë߯èë\ÿ\ôï?)¢ùãT1¤52 gêCy§r$®Õ¬ü˧K¶úWacãªL!µnWyéVüÈfQ<Ô¨1¢ª°7c£ÆÉ=ñð”D±B‰çƒY7X”æÇ[1R.fpMÚy°ò5(4hî.h•º€tÅþv¹z«ö˜˜†vîtŽ B)Ð\¸´D›M™³<Ž-3a šW¨7ô˧Þk€å†Ï—u†å6û5³Q€òsVë 0ˆŸá…Ð7Q3×/÷¤~Æ2üà8¾SÓ­y§f;®= š@(»øÆ¸3l€øÑ¾DËÞfñÛ}³[;ƒ.rÌmVÆù“Údx¥Œ©P*ÿÃ×ù^Ó‘Š"nuNHäéèÐ6=ì¢5¢ÞGœç²Á%ÙðDZó¾-[R¡hyïÛ`HìGA„AYW]zkHIQ¢®(ܺìýPðý ¼ —žž“T64Ó~Ål8^×M2rÚˆ,Nl䨠pŒbY|C6ä¯HÒH 0"1LËÏ5Öcøx!²òüw.ØÑé@1E‘B>ù™²’"¶z;MóââƒÛ2ÏÕw„šŠ/¼%¶ã¥ypÁäÝå± Ú\pú´JAjßMmPŠw*Ãdüºý×®Y?Þæ~,}hQ ÅQs'V† D¹{£î/'Õé¼{¿V~Ä£s'˜ S”¿û‚ô¨eεǼ†U¶í J6™ 2×¼R#.Í=ש¤FΫ3Àx×ò»* z8Ïq5hø³ÃKLE¦É. 6ùµ4C¾x„¡I(MßÉΤŽ*â*¯ÈK?ƒ<üôQpÑ‹ô·õ$뢾ê¡°·#„õõ\L0Uz妽uïºÑ²úÒiòY„ü<ï^3Ô|ö.‘ßNe–¤â’«†Z¹’°½Æyɰe¯¨Þß§3êGÃ|³r`?Uvlì›q"ÜäöD_¼¶]ï(¡Êw©*¤<ËÁ×SµùÈ+Q%Ry»alÊòv4’{Æ܇µ”@fžÿ>¯ú­4_—á;>=փС0$½7ž9W,Lßj^?®q‹ÁqYÁ”0ŠùEf·÷21Ú~ÚaáRÚ…_Ø›¼-㈻6)Œ§=[ÁM¤rø€æQ'½…åR­Ê„jèÝdå;T„ÈÌí¯áM}ºëx’lÃ|£$ Â"Ð|-§¢7mØG•oxÔhD·&Q„>ç¬Pôˆ8ƒS7 F¿Ðõ¿Ì^+Í@nñµå̇“Aµ³MȧäÁ§]'ÆHæ~¬‘fEÂÑž)æ*ÊLh9UÍÏç&D/)™Í†—eõW½F›»—|Ñ|Y.Èžõu÷Ã0¾~–Âùà=Ô²Ï ºÞý¥´¢àø1~-k>i¤*èëàô€¿ƒ VÃ;±5'ÿX· 컇á“&$.Ïw‹Æ(j«š¤x^f(Y³!“Š k3õ–®O­êüÿV3ñÞ endstream endobj 86 0 obj << /Length1 1450 /Length2 6988 /Length3 0 /Length 7964 /Filter /FlateDecode >> stream xÚWuT”Ý·¦A¤‡„‘înîîu€†˜º¤A@Té‘Néi¥;%É‹~õû~÷þq×»Ö¼ïÞûÙûì}Î󜵆åž!¼-ܬ‡¡xxù%ŠÚ fFêü@~~!^~~A|# þ'‚ÏbF !p˜ä``êÖ§BÝBµá0 †( •“äç òóKü„#$J wˆ-P›¨‡‘ø,Šp/ÄÞu»Ò_Ÿ@v €„„÷ït ¼3±Á€Ú ”ØùvEh·€Q^ÿ*Á.í€B¹Hòñyxxð‚œ‘¼p„½ 7Ђr€‘`„;Øøkl Èü÷p¼ø,@#ò!ÜåB€·(Ä CÞ&¹ÁlÁàíú@Cu- ® öXë7ðÏí ð ü]îÏì_… °ßÉ ¸³ æÙí P0PWE‹å‰â‚`¶¿€ (~›rA  ë[ÀïæA@y} èvÆ?'DÚ .($/ý5%߯2·­ ³U„;;ƒa($þ¯þ” °ÍíÎ{ñý}ÄN0¸ÌçÛ³µû5Š­› Ÿ1 âêVWúuëÂÿÇgFEøùùÅÄ€`W ØÓÆï×"F^.àßÁßîÛ9ü|\à.@»ÛQÀ~;ðí ß rQ7°ŸÏþmá m!6( 5ØÃÿ§ú­l÷‡}ËÄhÉKB ÿ¯çï/«[žÙÂaP¯à¿šÏXUQ_Ûëï¡ÿ+(À=><‚@A~ € ˜0PLDè÷ïJz ÈŸüG®:Ì”ø£áÛú«i÷?™Àþ§P8€ÿ®¥¿e0Èþáñ‹ðÛÜþü¿iÿ;åÿbû¯*ÿÂÿwO*nPèoû_ÿ…9C ^bn9솺Ճ6üV°ÿ†š‚ÿ±jûß1uèVò0û[fóóò ÿᇠU ž`[=ÊÆáæüá7þ¥;(Öƒ#!¿îšÛ,~þÿŠÝŠÍÆéö>AÞÒów|«¥¯« ³Ûþ ˆ(„@€¼ðoOûÖúܪÓìù›Ð@>^u›¼ÐhGàÿ:Z 1 è—ë·%À/ä³ÿSÈçð) äsùó6Šømþ«%7âV§¿ÙsÛï_öïK öÛàOOÂm¤B«BšÎ*äi=xV‡… »Ÿã™®(Ó¸¯ë)Jÿ<ÊŽš’o_‹ú¹@¶-XpSëdFÉïôxÞ÷u”$åtu¶õ2·ï0ÙÃóm¤–›àšfk«ÅS!˜­=å÷:ƒ^c¹1*n׃ՉôMUiÖº²ÓR‡ï¸l5;¼C1Q¸ÔââB!ÍòéÍe •òcã-êÌÈC¹¡Ý„û*›?_w Š,uÏq£C_Ónmºh§oɤl|½§ùt8ƲòQ™ú"Ž=è¸)$Ý9¨÷ªTs#uê¢Ç‹òpêµÆ ê‡w~OÂPºÖu)„z œL…ziÆ€2• ÑÕ*”ð²’ù¡¬zxó?½ŸVNvnwšÓëԜ踊¸˜ŒÎ6©¹E™_#b¶(büàë&ы޸EÔ}½w¸”Ïch(‰Ld&xk»im…òèc%½èu!æúàw*E•o„§!´HK4QÅÁº9Ÿ9º²[‚„ñ»ü9µþü„’~àÜ=àÄ«RzÌœè€A+#r_lIt4DqQÓüOÅm•ֻ馥³™SX=ø5¸‰¹{ɦFžQw.:Œ-ïUyÇØ’m†)ã‰t¤ºe|¢ùð]îËô÷R1Û A¤|~%pžtžÞ+L4*êVçÒtùü¯c†íJ!˜máLiÞ #^bD圻üë¹|æGõæ¶Rš¯fS³ÀR „à 0êœ]J“<°æ“Ù¤»ò|qÙ¯(5Êñ3¶zefïÐöyØórÕY$Å´}i°§amÂF$_d|ŠZµ¶¼òÑ(è ¶„ŽÌU3K[Ãé¬Å«ê¼ž¥M|!×( äÝÕà)Z½1tDíI¢ÝU£U–saí7¤|ʼš¢?Œÿ–7Ú°QµòAXåBâ+qiiGGü´vÁÁÀ\ø»ñe•Ôûh‡!²Û›©4[•–.4ûïÚ{绥 vãêZ“ÞÕæ»yL|™¼1#j}ʬðZKôâã#¸—›q^n<ÙØ*7¶ª¿Çàû*æáP¿ˆ š†ûϴ˵‹­P=â ÛýÐ*»du. U"øºŒ=@mƒÀ⸼]¬æ ^«MØŽ L ZNgšÜW3ëVz’ÌPÔ¸ûüd…s€|6Y÷.[.ÆÀ™ „Î.Ö“Øšª²Yk{l9ް"íK±xª-C%CÆl2Õ¤’\Æ­\;:ÂÒGfwîÒÍ6Y’–ræs1¿TêÞ¸÷™Y®âjW^Î <Á¨`ôbEŸSWŸCÐ(‰Øi“K›ã_^Íd+Ä N¢±rk\‚òÑ ®ËÆ7Öz9<ƒcîqúÝIóv)döÌ xÜgÌùäý;´|m¡ŒzT½ÈZvpÜT¿QR,‡YQ‹Eêy®jÙRÈÍ£¾báwÌcì7"Ÿò]GÊCeœ–.óO™( ›Q0­ ê9§Î¹ÅOÔké¸grõN5´XÑBéëžaøôë-íÆžßøÓ±Up˜)`uô)ˆ0iA“4àØoý<—~&hjnQ˜z’‘Q ®(~™$ïlIÀçÆKä;¯3>§0ÁÊH”ÿqÇøº=Á¡]“Óxp6éó‘Zkí• -™™íšîÒÌx·%©—™\™\“>`†gpáo;·SÎfYo¢ù¦¤t€*s€Ây.aš—¤'Y.Æ›ª÷£ùæ»ØW²‚if²ûf;Ÿ;C@àÚÀO2Ë©}!{NwjÌ+7Í «î,þgŸÝ6u²@O^w¿Ø}þBW$†_ÏÕÐDût[ ¹FÞ2?Íá'²°7FçP- ae?¤j†ÜðÐÂD„¬Ôyü }wê;Y 8¸ücý]Û:ÂÜé4ÑÝ&‡ ­'Ê¥Æ&´!G•ri0¿÷ŒªUf;ÊÓÕ.=/ìgGDyW«°í®ÞvÅÎÌ3 tZ û Ü7>= W@„%’ê…R»S ULúu•V«/ß¿CÉv)¶V¦ˆcœrãÃÝÕTøºÇÐVŠûª1‹WÉ>uÙÞD½¹—qƒ£ÛvÒ¡C4& ílï|rçASöÔƒÂl¶³{À­µÌ:°\­¾è(SÏ PƒÄ„QK±–ž.b´ÜO•Ww¼ŸJ ó[VÂÞƒ²-kÔbÃÅ&æ¿ ¶ÀTÀôt©3IßΉ‹Æ59´Æm„¿Ëò&žòUë…h=R~€ctĸœœ°D6iç•_²MÂĤ¤bmȲl¿ÂÞÚŸ,›­ ˜¡pYK”È‘JU iú¡2â·"…rák÷ìYkÙ‹z5!ª€Ÿ¤qwŸoÒ­¨–Æ»3s¶WW-`­¹Z6úhìêä¹SÜN4}í4§èó…SâÅH»¥¤r²ì€G:2.#@ÐW\ø]„…€ Pa×ú‹°v$IÇšÒà¸Yè“Âw~Nb*ߨ¶Ã3B‡õªŠzoDCѳj”»¼Ñ8‹Áš‰‘i³ñêI«½ÖÑ/¾ªtH\õ –O¨¶2îÖÄq iO/dêÙ%ð€ÌÍir‰g–Í3ß™a0ÿ!¨sPà‘§ñÕ/´¿k N«*¥ Ýî[k²¥a^§Ï:æYG?ô1nC\œùÝF­>ÛÇÏ»É,Wøg-ÈèCŽ}ò²ã+°t¡¯½ksÂ-bfÙKie“ÃPLèõ|™é)•Y{–³ÍkÜœ?²°; s±ò‰¢šôÙ˜©5˜‚CÞÓHà’ñ$®µAmŽÄEò*~RÂåî`*o³ rµßÐÊŠÃ8(È}03{xIpuÐ>î¹’*l éY ³ Ú£«4Wm‘L?fa|”¥Bª]¼·«¢ZD±läNÏH.ÆÙmBcO!þ&›C¿gÀØðÙƒ/K£¬ΘZ̲ÅþÕZY1„ gJÄÑ…ítaÙïôsøÌ kyÔ¯rô««q"z‘ŠÃZ+FV0uñuLº®ò‹ïeFã£W tŠ;èyM—’…Ú7Ž÷è¦i4JŸÐïî§B’£Eë:Î]L˜GòŽ9ú4Ù–çŠó0øð$K:qtæô°y»ídbÇŸ÷Ÿxíåt\²]0Éøí?Ìå²S3Ü´o«æßá®óØlÅ\oRÙl–óÖ ¬ƒ¶Œ=}<G‹¦eÔr¢hQ\dGW7z?>‡¢]èTªP µh } îÙ¦3S¡.oc\Ž+©Ä)G‘/ì “G ð3DPýž ‰3%˜†¨Š.¨ê#qé ÎP‰DúœÃéÊG‘lü§gñ|¬/X¬Vcn©”N?È·Ç8·mímº*Ö•VÛ)Ìë¾¥õ²>K‹^hø*Lqc¢s*v˜¹crá+j*Q¨~ývjîèîòh£hÅçœú· ߆<¸‹½ õlwÃãï§|ŠMç€~êðÙÐWÄÌuég¶4r˜ý˜äÍzÄAgðµ•}&ÍdÕ½à‘ íN脯½4o¢èbRÃ;,…Á‚cÆkëµÏxõ܉íØ$sq ÆM«W­žÆEõìÚvµ6èõœ;žµ*¥‰Ò½ÌÇ3K|©÷àáS’»’ïRî~Sh44Ÿ™ QT?üº˜ÐÌa·¨BÞDª“·\ !dX²Ä5º+VÜ&•,żÓó¾>ˆKpMË´Xª¸\íÑ?—§ìÝõܺªÚ\¹SÿD{àñKîÜ¢ƒ‹ñD»‡<4’;ÃäǤ ˆÅÆêâ1Ï'GpfõÈ2wÃ,¦Ð3µŒFÁás{vì 3=iË¢šPuÍJàìÚÆïévºÏ]C‰(¸Úsâ3©¢[€Û;uúòþ ÉÛ ÇB–uˆJÊW¯7M3©mBÛð”ýsɨ ±1àå$ƒáû.¹±Ý”¤gíÁÞTVÛ¬³b#Y˜ ¶ò[ÃÕÇ¢¯¤qHMSèŸj=xÞìOMâçlG^TK“@ yËÊ¥)í‚-Z¼le(#Nƒy^ØãíxsÝioÿÜ$½Ü”“Ö*Zs¡‰ò†jÅî•ß[}Õ"…}Œ±8Á§/ÜÑl«´‘§ª¯oÿÇ@`¿^Ãb#"o˜_MÕ˜=ðÅàò[ùaIa’±²¹ðÉ\Wª6ñ¬`v²ßá¶¿;»Î}ÉëY‹Y^SŠÅ[¼¾p_w¬^¨°§p®/Àa ‚ÀÌw@½M‹]:IßWk^:0as1tTðv²¥*¹"º°-•ÉÔaÞèùÖm¯N È?“eêÌy¡èãÀ{,ˆŠ½ŽB¯RMŽÕ¡sODÐF<,‰áÇcÚ“rǽL¸w¬uómeFˆ”Çjêè§'qö‹û*m'½y9áÃUãý1MùÕäÏM”ýCs>^û| äÏ.õðtH–¤ÞøpêƒcÛaÎNÜáày­¼~ZÑȈãâ _L©KŠ~C!·{­½Ù–ë»'Kõ®SäåN»lwºßq@?œ p2¯ÍÒÖ\Qd„{éŽü;&ÚHòóÀËI»þ½}­úîþÑüLü«}c™@\Y6yѹäË4¸~°&{Ðzg“Àº²èÀ@†|á#Ÿ£Yr⦘ë‰9g’µâõ«´Ù%UlŠ§îŒ™F£3ðA3üC­5–ï(Ì P×ÃÒûýݳï/UWÝSÕ‘ÖdrYÜ:¼ŽFèÌ‹/•ÊDª²R¨6^&LH×k=Üé/è3gF+å0 ÷%As >eåªï.ÚV>tOê$Ü# ïf*1˜™äPûlûS%™·½‰M[·@‚0ô$N¿ê~¶þ5Û^óݬëÞ y_¶ßúÆ]FŸÈõôà™.Ï ÒvÔSé÷•5Ò¢=<ÈŽ,"Çô6ÛA1‡BÇsí6RZŠõÆm¥Ó ˆkÎ%¦“µRQ£YäÏæ™x#>vq#5o³qÕK=vCy­UD»Ñåy[ƒôÏ€ê&nò—9ßþäm4vLžœÍIéV_-²oíAö» ϼ¿d@ŽœÊ¦Y3Nf«x¸C%Ü%mfI'^¾­ÁAÐ^êpQ´$´arL/ž^—^þ±2±£ÌóyãUÃ*ÑRRfGM^m*†nÒÉbZc"KLk »i$wª§¹†Í(}ì~œ4ªô˜CÒWÈ«å…ÙZ¢  Õ÷Žq |ƒªöuj#ÆÙ;¾)|F5aØ„…åÍk)†nC-‹ºâŒÛ¼ÙY×/Á$ãOÓ:Í—&R–ã/§1â†. ¡ƒÌCÏT8å£ýSs˜¦yåqý.kŒâcóv H_]ë1v0šÂÎxž§ .{úSNéO|H+yc—Œû«!W °®¥ÈQ¬%çófÀ¶qÃÅ—•Òü³„…ð¤{KQ²ñBü•l˜EŽFÏ<ιˆÞ ?E5éî#ò)>ʲ‡Œœ“½‰ˆê ë8ò5ò6Ü`k³,8 Ur–00·ãÁ6 93ºjÐÕÌm Ÿ.5ù ²ä¥žˆÖÍòoü•^¥¤@îâ¿g «ÂR0둤>3¥Å?3(_Ö«¯¨¯|¤ÜiÉÍ~Ì9Fíb"ƒ³©A^~·ßÿ­7“q>f-]æãÅùº*Â…‡7˜± g®"7š–ÝŽ"‹erñF°‰Ò;[¼˜¤u‰ >=Iõ›#ntnð!‹E·×bî‰xy¥œ`<9^‘mÔ¤3Èš_©¶úªYÖ«BD=¥{Ü-¢yo•Ó—x×ë*EûÆ[¨6rö;EË!Ü­|¶t?:Xn£­°hóFy¿jòrî€ ¼é®™SUéуOUÊŒ×è2 w•°r_îbÁs½›,L±¥ÇžHm˜Û,̔ǟÍóIÜæ\šô­ŸâŽ` <®ä—±ºÝilªpŲº¬L«ü!Š­¢ºÅ×—¾Ä,žë/ÙÛև޿6eßÙƒnùqè<4=1àP!õ4;+¸¡Ê~£Âe©ó±úð@çä¬3q“Rò¹…â“é0Âá ¹EÕù7|Ên„}© è ná)N\Âm§™8úôbúú2¥ÅîœZ!]š9f†«ü0«;°ÆtnƒpÔkó<׳„Õ­ð¶âÕ¢ÅèÌ—×â÷pØtf$gkb‡âQÅò _;²Ì‘Ý"dÝ88XfŠóÆu'1TÍ8-¹A4&o›¾ °eb‘_¹¶syä'^%5ttW¾ þÁR™Ã²¤ /¡Á+f}"Ðï®(†å¾Tkêýг—HþÙò¶øÛ£Ö\¬ë”ŸÍŠ ŸˆE³ü$dO[xü½õÜ×D}ºØ?ÝgË^‡ ²¤¦Ð½¬Ç 5ÛðUlÞ‡/ëÒ†´æ/—÷>?«-„¾w+“6¡yIC‘…¾w“(èßeFkt]±¤,Ñu¿±8ÆðÃ^vݵ5¡=E·ñÀ‰éì™ÙûmŠÁ ¯§€ñ*êè=Œ°Ù*ÅO~¤€:眑ÍPc-ëzÇ$O±fÙr×´=Y»3ªŒu.ò¥¿Í¿ ¤¡W…çÍY’vº°^…óÓNüc«ì-Ö†ÎÆ­ôÔ²TªÃ@Áì½¥Æ÷œ=\Žè¨ž÷gLO¸faÙ"S¯z&YBÐ9UÚ5³Œwó=­"æõ=®–MŠm2½‹ÐE6´$„€¹cdF§ûJ)Äã“Dì›a/ÚÑ„»ÔŒ³Až¡]ËV-î¸Ù~o=Œýô‹„•Àz‰‰¥Šžßc¹&ó¦˜Eó-à@ã¸@~ G饨Úä&ÕöOg*±eǃddc|­þYO´üYš•àóJ¼0¿Úº/™ÕqöL´É\ä cyY~ŠÉžï¹s]‹×¸,ÇIf›2^P½þÄzTA&j=úCn:™Ï'K[/ùühRÀ½áÀ,jHÍ"8›£2;ÕÙÂÆ›ým!“½R¥ÓKôG ÷(pÊÄ$•p× ßI3}ê#êÜ{hùboî2[P¸nÔÈVí*| 0ùP{ûÓ)а~h:௿8Æ“rkCÛÏ…_c5ì=0¿·P€%É(wù9OQ“R"ߦznÏÿÐÐÇ;D^ bçR¯Wèð¼;‘úg’rCÚ×&ÐVxU –Qž+oEÇ.:Òhïp;×Ñ‹¡>ß„ñ1\ÑÈù ^ã,H4±O°µ~ ¾çs..dÊ©xxu5RM¥©„{ÒY§jIôc]`û-ŽÕWÍ-À½„'Áö‹%i%rëä)‡ß?Ev'’L¾WQÙd€¼_E ?I'ï?ÞKZR_A/y“B·k¢³ð¢Ù•âb…֨ĺd1Ë…ÀK'0—Ú*[•8ɉ)ÙéâÀü±â•ÙÝ}×â^ZvHYà*uú$e˕ЕFwßÔEp\T‘1¤q¯'æxõތΔN­çtM\Ùy©5¼Û€ôꘜVZêøqœXL*S„ÖMI¸o~³Žce‹@ã~7ƒÜ¹Á¸“i̇ɠԧ)†RfíIå\7RrD¼Â8CÆ,܉h7Gö…k²Î¾Ú B'ÚºZb—Ýâèa^OØYlÒ£Èämòó,ëÿS~6Â¥8LJ~!OK_^~O@œ]@;à£X$bè÷Pš ž7þÓûµóÉ<¶¸qx½Ë™Œé52 cÇ1Tþ.­-ê´|«O—•u„³3ÜÏ;9IÁl‘üšK‡¢×Ô¹[á"AðŠÀ'ލocéf<§ÄuaØr¼§=l# ó%‡p†&ö'xã;[oŸ)¥ÒmÔ!;Ùˤº™å°ËÊ©b[:ÖÖÈ ¯â:GØé.w7)I†:ò˜L>e†¾ÄNÃÏÙŠöµcUÓé+'VõS LQ1¾sp#Û¹úc[÷‚µù&ÐeL×P¨U¾°·»®„v5Ôê âg­ùá ç£h`¨~éÕËj«|}Sξžuÿ±MpËXŽ ê)ñÇ̳{Úe‘‡›º?žPÉ}Ó›q²WýÒ÷^¸3~3xD$[½JÀÌÈ€õÉ´hÈq#ÐŽ¡Š¯‰Í(4½J Í„…#ðgZÌæ ¬pçCîe©õ·8Q!1×'ûêìÝz.=P@i"-²àMEÿÝ«^%–Ù'–?³‰ù¬ j.T‹mŠÍœSr¼ãﲚ¢¾àDÈúбrµ<éšú€W¥(çE‚Äê§XrÓÀ‹U†$ÒUr—TüY#—½sÒ ä¶1"W¯l‚sÄÿ·åwí endstream endobj 88 0 obj << /Length1 1487 /Length2 7177 /Length3 0 /Length 8183 /Filter /FlateDecode >> stream xÚwT”ýÓ6RRJŠ µ( ½»tw·4’ ,°Ô.»Kw#¡t—´HIƒHH ˆÒФ„„H7»úÔÿùß9ï{ööž™kæ7ó›ëºÏÂʬ£Ç#k ·†*Á]Ñ<`^@^SS €@ü¼ +«> í ýËOÄjE¢`pW±ÿ@È#¡4ƧAc€špW€š»3Ì ‰…Å@ $úŽ(@<`¶M^€ÜŠ"b•‡#¼‘0{4朿ì6°¨¨0÷ït€¬  ³¸4!h¨ æDˆ3@nƒ¢½ÿU‚]ÂFˆžžž¼/i/ÅÁ ð„¡ºPéµü qþ9/+@߆ú# ·C{BPÆá ³º¢0)î®¶P$s:@OU €ºþÖøÀ øór`^ðßåþÌþUæú;bcwA@\½a®ö;˜3 ­¤Á‹öBs ®¶¿€g“ñ€Àœ!ÖÀïÖ!%ÙGfÂ?çCÙ a4Šsþ5#ðWÌ5+ºÚÊÃ]\ ®hѯþ`H¨ æÞ½.×Éîéêû—esµµû5†­;hà ss‡ª*ü‰Á¸ˆþñÙCÑAˆ0¿ˆ ê€zÙ8 ï€þ‚¹13øû"à€f ¨?ÌŠù"òEA< 4ÒêïûŸ[D`0ÀfƒXCía®DÿTǸ¡vؘý#a^S†~`è×çï's Ãlá®ÎÞÿÀ¯¨k¤*¯hÀõçÈåäà^_~>Ÿ  ˆ„1þÿ®£ýÙÇ䪺ÚÁ¿ŠýêsQõìñ' ØÿTàßÅ´àêBìÿ0Ý $²ÁüÿŸùþ;åÿGó_UþW¦ÿwGJîÎοãìþŸ8Äæìý'C]w4FšpŒ\ÿjýC»šP[˜»ËGUÑŒd]í1”æ ð‚þðÃPJ0/¨­ mãðmþðüœ3̪GÁ~½b0Y ÐÅ0*³q¼FPnþ‚ 0’Cÿ^ä/ŠÕ¿ûPtµÛþRŸ ‚DB¼‰0ËÇX‚_0F¦¶P¯ßìy]áhL 3³?ÀŽ$úµh!QPñ—ë·% •ÿ±„@¿-Œeø·%ˆÉÃHßò·ŒáÐõ€ˆÀ¬nûÛõ¯¦mÜ‘HÌT¿Ù†™è/û÷û õ‚Ú}ž‚Ûˆ‡9Ö†µÖÈÒyò¬ŽHàí¤ŸóñŒY {Ç,—õr²gÔË•>÷€•,;´äÜNsç§|Wê˜ê½Žy˜”Ö홬㧮oL$ùžÐߟ"mÆzn”*Ç(VŠìÅÒaˆ!ë$”¶µïÕc%õ{XÛý)É“ªLIX-¼M«½³¦,[ƒš^ÔðûW]t‹õ€þªà!Íü¯.ÏB—cÍž¤ieÞW—h?#Jô¬&[ì˜%ïaèŠ VóYÝe‰@“+ŠÐ+ܬ6œ-¸}™W걕Iák­L)³eÛûr#õ´VkßaeËœ™=¹SØÁ*Ù.üÝçŒ1K%—ŽÌ/\‹¶ý’É„ÓÔ/•t‚2ì΀©¼¯üÊमî=3Ñ=ºx鮞¦jú¡/Œ[3Qòªbå»ë›8»ìÖ‡5©ä+Š\ÔÙ›þv¡},Î9³ÇìáF|¦"émúR%³¢a­AÆäüü·<`éU· ßúo›ûú\´·Ë±Í¸UǸÆQÄú,ÖÍúe=?ßßÕÛd¼Š•÷ñtY:ö«öZ2×èwûWú´¹n/N“?…‹˜r_lvD‡ÅÑð¶>¹_ùe¹'ꈱ;Þ«L+ÿåùa0õû>x?‘GYpìù–ÏÏ-ìL€¢Þ¯\玸áX‡½PA/1¶Ôgîë=©Ö4í 5YÐðO]þÆ©Nªßv®êÖ Qò¥p˜ûêÍämRÊ/ìOo…P=ÝH|Û&»xØ’Ã1þŠnb›¤­L2˜€WôÅ·ì­C~{º{Ù’·™LÛ-™®­¯á–wvåè ‹ÎûB†n6îÝgÚ¦Å^iÌÉz»Ù߀?VBi'p„%±îØòí·xÆj½®W‘:Rð?Ú%ø’“Ðk’r»m»þØñqU¨}Ùmü°u{K¶Z9ÄϪÝ!®Ô:£ËÓ$tÇÆ” 䘼[kŒ%ì}jOD™î@«×^À†èO¸âÛ´›²@.¦,‰zéœ| 7Ö]u;,ã 2ÕuœØ>~© )F0Þ&ÑaާýYrzOPüž=sÊ綈µNÌÜõj!€… XÊá/oRâQÌ^ôœƒw¸FgÈÇo~7j¨åDÀ³.²_>Ái÷’´›V©;7e2×W<îrÌÔˆr]¯¬Po2ÓÉæœEV|Œgµ‡yY9*̆'³Á¶ÌAâ¶…úŤŸŸ—Ï=¨ب?ãœçòùpç¦ql5…Ï-'ÀÝ¢Gã ž½R·>k¡Upœêyˈ:[¸4ôãäI‚dÔ¦]K£Ä®£úåÓq§fçãyVËCs² ÑežžÐüÕ»N¡À{³géútÀ¾ƒ)ïQ¹æ?y:™«4ãk­ÿf¸Í?âëv~¥ï±-¶¨ÎN¢AãÑåÁ’Åó“ RÒÁ”3+õúùŸà?t=3ǗĈ"³ -;DÀ}Â'­ë ô]4ÔÞÛÍ·ýÃò#Ñk3Æ¡­÷…ƒöÝÐa‹vçþk£É5"¸zºãÆ)Þw)$²Qõ|Ž)ÚmK¡­d¬$Ï rZÃ}¥&â€ùÕ/ä]à « Ö ÿçˆ/wm¿ù:P HESDß´ðT(Ù•>:´½Ýƒ³ ÙšŒZ,Êt4H H`üâôµÁr½-² Ћ ÆþÃ#œÑû•ê6k–DD‡R—ï.õᣒEœô”Íï†Î½‹‚>?@Pâ³dŒÐCJ‚jƒrñ=æ£Éi¢0QõŸ^ÛªÒÖà±["5ïŸ>A‡Û…ΕkmEð™ÛÀ KÇ×’; =¼¿T;Xpv©¨~ågvøÉä‰'eÃ=Í­B~nΆžhAÞòbÑ’»5y÷… mõä·¡&™þñ8B/øüÕCA?, k¨G^ÇÞü2 ,ê zÚw’KŒê»rþ!å™8o¼)ñUÅ$®¦×˃⠥ЊKÖý,k*fö'…GºÖhñºþÛŽEÍ=9NÄ+Z´Ç•ãøg‡ u³×޲œYVöc‘Ê_Õ²—| ®ytË€)La½þ^Fü´[KºÁ¦dÊCTp~V"=B‡ÄŠÞNokµ<¬ ¿I>f§M`4ÿ{¹,¯Ìý 4w’çL¬b«<"y7VvÖ0ù‰0øÏ‚†‰áãrëïƹ¦Ã ÷aGj)Å §Ú ZfãÞNøöÆÓçý i5ÇYËÍHçs}ú×±+ﬨA_ßõ%*\w6;ÎÏ4âgΨ6ÏXY£ói žÓªbK¹—¬³Ãv鯂(Ò¦íT9çLíh%±5)¨ùÇ9XÛö^T‘%¹•W5j³ãu˜ñ:Žo`x$x\¨Oc­á”t¢øNs"ùȳ@ûJ˜Zð2êXÊ4w%µ†ŽtBCÿà]-ùª5=ÍãIØÎä­©”Ûä}N¢VIV÷ø9§uç(lŠ¬Ç°ìûíç27)E/ G7_ÝÛ˜ÑH· $²}”ª¦ÊÒØšÚm2Àþ‰†ÚE×mò¤PÍ”&1ÀnŠ G”;õ¥PÝ×»–àóÂñOñë­ôzÜxÒàgÒ¡ÄS²½ ÞÎì!Ë7Z> _ç3áìÄSüø¾NØIûÒEfŒ“ú"^ŸJ4þ‹b v±‘¶=ÏLêTW,iÊbæ6DŸñ>™OÑÏ·dÀ±qÆ0EGC<ßð“ðp¨þ«CŸc‚ÞFê~>AcËi»~3è›EŽr¶ᆒU>Ÿùg:õ§ÔÚÖLkÛ®&ù­~zä_!\‘¡$š†FåYǼß(MxÐëé5•µ|>9“{ aÅX‘DzBhpƒsÏœÕkë̵h¬¼V,Õ-êQKŽœÇ–P2ÅÛzè[Å6‚ßßË/ÉÄ„À{Éú½4ÞwȦG7þìÕ*aø¨KЈÙζëóZãS`O vͯ™Êþ›+ÿ0ú"u«ûs[\è×s^äLÍO³)Ó厀݅@æ(«`¢ÄÿÌÖ$öWÔy ¥ì»rµ?yÈÚ^·äö¥:/^¼Vg¬r‰™“™·,’}¸6Ýù¸u¼“‚€›EJè2¡`ŠSׇڭÚ}BŒo<›$ûSÄEÖçóÑ·l\Ûv-ñû+4ø£‰e툅¶ã´;Í´òÊ%·ƒ’´>æÕ<íYð¨ßü!DÖ)»p2ÑoeµÒî($ƾ‹õ¸îYÐõ•A +ç¹Ù§ƒF¹µ¥¤™‰ÁÍUXŽcePg߆g7:œ V6«*R+ŸÈmºœ¼1(îÚE­›´æ8†û™½E«ÈoÞÜŽùáX½¬D¥?Ûöñ7 d'ôžî—šs”]r}aÑ'3— '0ü×Z AäðÚnP—âf¤õN ·|•ÛA7[ÄOcÊ-Õ¬¾‰t\ä³/oCÞ]½Ð…­<—Z‘¶wÒß?LTUgÛMÊÜÁõbªÅï1qà„_:2 ›ÏDÆþÙ\s…všœ”Œêx6Þ"¸rtR;å•ó܇ޒô‡e>‚бÁ´>,W!C6Ûó !'½hij7²»Ø¥Hqø›(+<µ÷IWN1m-ÃÊŠlëÒwBÃ…”‹UtV)9Ë2¢1Ìép3$ˆ~š¹.šø;©OGõÃ{œ]'â<Š£÷VÓà¯õ­¿Îu®T7u\¾áKn—zù]ÝË¿»xñ%º”¡2k#þ£ß¨Ñ4k¨pXrM1A¦º5™w‡ÏbYW,–ÇΠ"U]ŸÑž«›¯>ùÔ?ý<ÌßÅ({ƒg¯AsIvÄe…²öÏýü³Õ,Ce™„jb§å.+Eu„‘j'*¾}™æü#fÞÁLÙÊúÆ1„Q¤(³‰…}~À€Ÿ²Ú-³~âhgù@ïþËkŽ˜æ#Ç+r¬8éô¼óÙ!Y†ñ¦5AÞ2”X»y?¸ _Uø›ZiçŽúZ*Š•+,â“Cf(Aá—M4øé'à=`‚µDDJÒìO§ àªïþÆh2œåïÅ"ʬäO#mï¶úš4÷ÄÆSÎ]¾e±Ñ Ú¢d.OÌm¥D‘ gNm XQ  "Nø|¿þú…Ëg±Y#i/¿[P<'}¶¾5ísS<ÎÒ<© €ùGR%©ú }IÜ}°.$ÿBXÙþiKúÙ;:1Ò39IQ–£›{ý[4,YœMB GçHÒ#æPB&h…øúÐí 1£^Þ2Û€å+búÒ!VѼ x¥±8Î VmXîF’0Ü\ý2¹’l ñ;H놧·ù”Yö,ŠÏÍåÇ•t.ï§bõÆócqߣ#ý²ˆÎ¼·ÏJµ v&ÈñÛ¶{l½ºT%ûCK£ŠÍÍ‘ýÄNÿ[­?TC.¶³øæh«Ü*ŽÄ͸Úì5%¬I#šL´qÿéÝb ì´ˆùEÒ0ø„îåûàŽˆ0¿6c‰|Ã7½ì>ó£›.¾ožvk¡9ó†÷2mȰ2^ ßK$¶G;MÌódål 0°––6â)•ídÐ’œÎm×Þ»#«Ç^zg÷Š•}ö1¢ðEå>^:"šX}' æ‰õò!?³¤»âÁ£ä4ö- ñ:ÇšžÁ¦ó…Ϫ«g|(*†‚Æ… Ùzûå¤÷ZzýÑ6}|—­ÓH Þˆ¹eáIù§òrùK1ë5T’sÈøQ«Ô}ªlg·Jv>ó¹Ž -(]Žúz2¨Žá»téœz²Gl—¾›ê¹•N€Þ5“¤úܵ´âÙš:]V[×Á“B¤ !‹ét,Ðk ÁߎµõÕÄày…[(^'¶U>ðâD–¸2É@¤¯¿ω@‘ПÝR,>vv*µ–q}Äu0,®›ë𛸄ÏûCD5uØçFÆ×ëêŸÔ õC¼¹·››‚Pk÷ÌÉ¥V´¡ NÊë®è–T=ÚxRªÖoµû.Ù˜C×kg>q#§Ç‹Pp”wÆ¡ìA«‚ ífÞgжMC@W µZ1ÉrDóNp±˜.u߀ƒ·ú\ý•’¸„ÉuÞÇðË€n¿ý—M „䔇ú@dÇϦêÙëͶþÂú‹ç VgŸCP&$õ-IAG^K@ݬqnMZñÁž®ëØIÊýÍ%§sy‡‰2zùç~jÄׇ*f¸tøTþÜÉcÒ AC©;æEY?‹~¤¼ÞM¬ø:¿¡ü±Ÿ¼+ «)SŸe]UóxÉ;+S„Z¨ÉàWÓÔñ OÒJè^6^úåˆˆÓ #¬`_Âú,%;¯åÑrM£¸ä­,\å/>"dÂzH[D-˧£•÷2Ë %é1Í ¨·©w© ÖBý.Ò­«¿2f“ 5"EF_Ò£ü>Œo¶k3r,¸}\%SJA¦jçaJzÕ·öâÅÌÜúTb¹Ö+yDö“+­zL[t5BÖ˜æ¹ñ’·)·¤—el×K¼×Ï:ž iD:ÊÍ,‹H‡K‡}[UÀ{‡•@oúôÐ[!ùsÇM£Ë‰Ö1ëT?OrU«EÒÊnâéC½ááUËÑGÜç•a[ó–y³Mýu<ˆŽÝ™ ?CÞ#ö"N98â¦ænÜQù`yúHâìÒj Õ¿Q÷ÅiR0ÍÖužªòôU¨­“BxÕÍ[wL¢ŸqÉ‹Xò'Û# ÷Rù•IË›Œ‰Ãê<0ì=éö ÌÔe#û˜7®#’ÀW¤l`%}Eó½6þç ¥z¬ôlšÍÞq…&òEÉ„ÖgËÍ%q\„²žwÔ ‰NÞè+² …Vœ‘øW§šƒ–÷Ìõ£2¦{T3\H?ò&r\ ÿ˜[´”ØEœîÇSc£A†vX¯Kž÷Ã'`€œ;ûšNãü^„ðDq¥2×ãΡ<¹ØW Ñ›’ÍœlÃÁúÂ/E#ã¤-öu8§¼aºÓÈTÛû¦ÙAí¢©¤+Ÿ¾€Ý1îÚz•“ZÒKÇm3–¢è97íÔÔ¿GI¶zbUôƒÇ’Ož3q2=S¢ ÝOã)ëþRwFè (ž}Yg[C¦˜t1ÈÖMò ¿¯´è4P£…WT?Ç3¹<£g%O‚"ìÕÏ,¢.•°.&F еMóc5h}#m«ú±]^m/¯D¯oä{OO›ió+†ìEÔ•©,€ê˜ƒ§à‡>%F¡»ÃC0±~|£6®}Ü4õº¶ŽË)}\Ïo/Pn‘úí!BÈ™Í}$61#“èž¶ŒÀ²}yQƒ†­Tì“Hlõ›Y·d.ø'Í~èi‰‰®òɯr8 ý|jÌVÒËÙy½6qéÆ[3xÊÐ1÷±8ònÏHñV¿s²¡ÿ‘~N9É1«†µÏ=|k=Ÿñz ¸Xü¤Þ×€°»0O?^ÍÉ‹˜;ò÷ •Ylïa Ócµ‘7µ|}·XgxLc—syÒ¹òZ(xá2ô£Í¯Î4h4-à.úC¦>÷©²s¯ù N}|3ýµKú@§ntÃ}qœ=)ÎßûY3¡mªž¨“¿]ch¿ÖóÊ^ú‰Ýmч@0l×3ê²èy:G²{L͇X#СΛÜ;»”£Ü,æ×*Œ=ùi{x޲57« .ºâ¾íõçZ÷g÷ï›vˆ5ÕiŒwìfÕ½°¸Èv-ö m÷NéÌ%üž_ó>IDΖxjáíXéƒð7æPØv+î{÷·j¸8¿Íô´ÛHUÞ´•¨õžfœÔx׺§baœ \-fAq£Cè,ÛêÏÎO) ØV¼ÖI–Gûè.ƒä>%èL–|®]G©ÌVÎU=0Þ¼’ÐcPø*×­œ5·AïzÓé F—S‘çgËVj `ŠóŠ^‡_r¸Âžn+Í&ßù¥ðâcÑÃä/kïn«§e5³ÄNlõ¬>Þ ÔR•wÌíɳäœ~œÁÞU-À‘§É¸pd@,r¥+—xŽ.“1WJö¸›óZؤçû“;q!E?d}_ Óõ/䯣%ÃYiÌó0Õd¼g¹òº@ö$o˜©ßhŽ-~0펽ºÎÄÓ„Ò½«6Uð)étUFpAº¯Ïä½V3Ý¢ñ‰ô’E»ÖÌFsMâÊ‚ÔÆƒ?qÀ|VÛà×x‘Võ ˜N bsäÕ!<ùyoà{Š‹Ô­:Ûæ6ª•ÒŠ^­0³Ã^0uiòG’õ6‰%åJ|—„Ngxç?iX!7|Iê·A¹ú>ñíêp'BÞȇ{ò+ȃ>oS^G+ƒ<òŽGÒyãÐÝÂe3¦ ._¶&K7Úú+í-@WŸÖbmízÄ—ä!©³‘‹Ýà&ÝüÈ£¢Hz">‡À˜pNm\ÛÇŠà8”u¹ì õÛwãˆpž 0 ³ç“%“¡ï%¼|è~‹RWõeÛŽ}eö³:}‡tÑÄñ“èŠPûkÑ;Ž«L{ö5‰7ƒœ¯›Ë¹×_GlûKðõ{¾ñs ;&¼­÷ÁâgŽõ.‡ =ÇC9_bÃ’žK¦˜&¥£Òaa?4äîP3ØBÝi¬­„u'Î%Wæ‘j†í<Î.(žIÊuÉçÕí7CÇš’ÂpZáfñR÷çr½Ó –î®)ˆ~Ñ1¼>ØøðŒéf endstream endobj 90 0 obj << /Length1 1384 /Length2 6019 /Length3 0 /Length 6975 /Filter /FlateDecode >> stream xÚxwT“ïÒ-UDz“W ô’Ð{¥÷¦„ ”„:H‘Þ¥ˆ ½W)R¤IA¤+ŠiRt¾XÎ9ßïֽܻ+k%ïÌì™g晽ß?º­gȯh‹²«¡h~ˆX PÖÖVÀ`a0Xˆ2B áÝ$ ¸»…”ú_ew8õ©@ÑXœ6 hx:a"&—ƒ!0Xò_@”» õBØÚ€ ÷ )£\}Ýöhì1ÿz¸`ÜDRRœïw: èwGÀ H@Šv€»`O„AC Gûþ£—Œí*%(èíí-uñ@¹ÛËqóÞ´`÷€»{Ám_:PøŸÉH@€‘Âãße‡ö†ºÃ¬Ãƒ#=°žH[¸;€=0T×t]áÈ?`­?>àïÝÈ¿ËýÍþUü …ÁP.®P¤/iØ!œá€®š–ÚÍ@‘¶¿€Pg6êE8Cm°€ßC5E}Šðïx0w„+ÚCÀáükDÁ_e°·¬Š´UF¹¸À‘h’_ý© Üá0ìµû þÙ¬åôÿkØ!¶v¿†°õt4F"Ü<áê*!XÉ|öp4 ––ànÜæ ø«¼‘¯+üwòË Ðßå Øa‡€"ìàØ¨@»{ÂýÿwàŸ Ø"`hÀn@’ü§:Ö ·ûcc—ïŽð܃à_Ÿ?=ÀÒË…töýü÷~µïhª¨êñþ™øß1%%”àÏø…DÁ"ıÿ¬¢EüíüŸTu¤ €€ÿt‹½¦uìõ—\ÅÁ ü³˜ ËZ8Àõ’[€EÁ0ìäÿ›ê¿Sþo ÿUåÿEòÿnHÍÓÙùw˜ëwüÿC]ξXÒz¢±ÐFae€üo¨)ühµá¶O—ÿŽª£¡X!("í±d懈€Eþøj¸­ søC™?~ã_RsF áz(įw 6 þ¯V_0'ìûÃËË?!¨VlèßküeñrúgªHÊö—î„DŨ»;Ô—»z¬% øC°µ…ûüf6 (€D¡±)væ@ÀåNòkÍâb€ Ö/É?ÊÂ<ÝݱçþföÌÙ¿µ ‡ûÀa$³S(˜t˜cmXëQµ"£7ÿʨ áNú‘™ÿh¾%1ºWuÂêK²avÖœf©ÚlDÍÒ±CGÉíèù§éÿå:–z_ ?‹Ú7{›¤©K îdŠÿO&Ö)ò&œ\ÓT¥[REî½8ẕ7Þ\•·µï5‘pÖvϤxsP«‰k„·ê´¿©.ÎÒ¢a’4ÙZ2@7Ûô­ˆÒqæ,¹$>úg¦óŒUS¦ý˜$Ù»êÆç¾ÁþŠæÎØ ¯Ð•]ö4…ªt?“ŠQ•ÉBÙYN‘׿³›þ6w(•îrߟàN)NZÉì5Ý$ЬtY_õ|)Ýì¸Yz–¥ø1¬žYŒÜ5ËZøíÊ÷ºšƒC–ËA:ü+­‰•» Ïomåïßm3U9÷”‘ÆKL²†'HˆÔᳫÓ,~ÆB ·Ë§«HV†›™ûp ¶(Äv8¶ÍnÛ>¹_ú0¶Û>åcõÄqALšýæ½ #[Zùú@ºh¥3§÷Åý ¹àqå!Xø0”bž¶öLK¾Ä«xªfAII=ÂlƒF–kÎ{v/køm„’]-?_¬P5îe<ï±§}h÷‘%{“çÄñ'UÅñcÒÑ­[¸œ{(|ã"~–d~÷Õ·’†¨vÿõ¹7“3Åù9’uŸ~Ž¥és>uå[Æ]+iˆæ¬¸¹‚ïö܈úê¤Ö¥Ç ðj¢(Äž©3õN›4ßÛ|-™=+€fR–<æVUÄÈñs°$"2 ·ä[§™8‹žA¾çûÊ-j™Å®èdÙÔ25›=²/å"9Ä™:}þê§80Àä>Íàw‹ë"´æq•ê ±¼5T¤‹D)V߀UÞd[^j‘ñ¨aÑ_¥ÉÃÀ}™Gú –wõú»6¼ýV®üЗC’Ä«øgÜ6¦~¬g÷$«úÅ“8~ê½¢fàÀ»Xób::´JÂó?ež .ÙúØA!ÀÙmŒ’ˆ!}´ÝqiÁ-³÷åfL@©ð¾ ”È’Éiu·7û¼[¶^ެ±k}=;²(¤Z\fϤðÝOÈý#³þÔò{¥n؉}ú„ìóäKz…¯7ì-ËQ&U‘œ;’t«BÏæpo+¾ŸÃÔÃÕSqÄq½E˜†x­uNKö’dn¹ùÏ,¿=Þ/JÙLbºIMFõTóô|S¢Çwpc†uî­qîÅUÞ̾§sRmaAy÷©äqÎ(²\¤eµç¦ì¡·vHQY$R¦^Ãõ ¬—åµäÜŽé¹ú­ëñg%“Þ ÏroÛ£c¥ëˆfÔô¨ÄîÖjŻܹgv)©ï…gëv±&®|¿D¤?ë¹éÖ<›HLLç,Fý\Äÿý9Ó"ΩY]s&ÇæUkKÖý‘”S|­¢#üzó‘7·;ȵÚÉT¿À­ò”Ÿ÷»ÃÔYçØD]#ØÉZ—;#ÙLϺi"7ϧ{+óLx(²,ùïÝuxt|¥Ým;ÆQím‡z´Üp¯ÎÊ'ã•n^Ãû£;(“”/ Ä´„Ÿõs*™¾ˆÖJÃÏ´}»þ\Žcšæq?:ΨÙ<#¾?mîúú¤0 i0úaêITü•ÏfLJµœ â°Ü¦,ŒmB:]ך\h.ÿ¥GæBîîj†oªìŠ®ãýÌ›ä"+ª*µ —j dßc¢¥ë¢ ÁW¦v£¡¶|oóФÞÇŠ!”`1ÍÕ¢w®à2>á$üÝ®Xÿ§&ò÷ª5ñ¦_æ6ñŠZ £>[‡ÈcdƾYßKÇh ùj˜Ò|ù—é?ZvðévEt¼èZ¿ˆ£Eø}žèj0tiÜMdˆ 8þ ¿‹ (=ßÍ•s¶ÿÎq1ë]]¸>!ªlÊÈ—Zr²52-–áxHU("¤%G†×[<1|àVÚ{øU¦¢ÂgDÄzPÕ=šë\ÕñÔ`FçÊt6-ý·†î»ç¼4 þ”ˆ´×“ì w²Ø’\S[d :ëCÅ—U:ÇpÈgfü̶M÷ ºùbY$iMEòE‰vK+.ñÓ*ö ÃŒ’$‡¼/gU¤omgûžá¥aúÍ”ù¢Ù)YXvèÚ®Iª‰Žö€WÞ|ýÙ$^Ô2ðy²±Æ•lE!÷KY$úòïdBQBtÙÃŽ²¯–"¤¯ùhÓGYÃØÒ‘·Ú~ ¹©·+³óÔH‰Ÿ»± 534҈х›ä+4jŸ¹€e6™7tMø g¢"0v‡AƒYXO7U÷¹’0Š:û톩Û%¯(™ÏG<_cšY9EªE]<›WMÑJ·mµ©»Û45§ñso×L[äÝàÇHnÒdJ3‡—àöé“{7‡Fi«d¾ØáO¸ øÒ§¥™v•Bõd ï OŠ(‚?QD «ßË0¦Äÿp$¿ugÁ–Ö Žë “ͤ{dpíI½e’Z†[…ñ{1šÒ‰)~cŠ]ÞßÛša{m“{âZãNo/æxK'íg•L‡tªQöÜRO ã£çüãf…èó )µÛqáí8s$òW‡òî ±¼ äå×»Ærúc}Kk^RmõÖ[ü%;“ ?óÛEÞì‹fAIÕÜuïöx‰ìù †fé†fkx¢]¾r%“%]i3ïyll91 GÂû¦@ã–šm ݨ½.¦ŒyxMJ¶ÿ›½ªvì2Nç¥~²«I+‡ø}I·y }”ú÷ó³“T‚Dm¡ОÄc “ ‡¥âìKðy@ݬà’Z¢{é1ñr¯³Ç–‡»•Wq1Ã=%üO\g|îlŸïà—‘ÇgÉs­ÅÚwøÍÐ8×§Dínð½Xa­ck*|Ö¬øJY­"#ÕÜåy¸åµ-…8Ê©–¤9F»Û˜f¦5(^L¼W¾qç¼Ú“®eýƒ>M„¯rbk¥©Ç,ÍWÒîê%ŽèÚu#F µ‘`ívøÐù·xþZ8»É‹1'míÕžšíT/g6 §Ø^æµØ:‰£”XÒ»‹íŠ¡3â™/T#¦£(„áæÄs>CÃË+Q‚¾ôvvI6äŽpÝ,W¬“÷CNj»p(VrÖeâ[_t®ïOr­.CʦæYv­ûM8*zyVB%ØÐ:ƒÕn¹;„ãdE¡ùì7p?=}DõØP7ë.uÞ†Â㊎؆׌˾ÌþmµÞ²a¢ÔîGÜ1–jš!ÁGï˜EüÈç íO¾ª³ã9Ñó…€w ©;3Ô¡S¹eô1ÇULL#\õ>ê»7(w!Ê3úgœ¸)=dá(xDUyþü‰E£ž‘©E g‹(ÙÛ@ßœrŽ_v"\f‡«ù#õB&§¼üo¨=¢zÉÛaG3òT>aãiKª OnTÜïÀí^J~ŽiÒãøÌ­ºw•Îöl:æþÖ``¨JÈŠ‹Šqj«ÃäºfD›Ûéíî 1·†Ä/èL€Þ$lJ¿€µÒ¥|1ºnåðfÑ¡w/Þi?-²£uá1ó«Èå†gàð3AÀáÄ nÛIoHÛºž¸Síe…r’äœÆÔQUŠ Í˜õI¸Ÿ­?[ƒð¨Òâ¥â¿Œ4s »þx¾ÏöŠ5¿‡é×úÇÖ뱜o/Ö‡¶Ûn/©Õϰ«‘Pjš²› ïY(ââÆ©«Ê`Õÿ ²W ëuãM¶ÔkS|·ìÉRÚø™ LOê¡ã£¹»<PVkƒ¹I«œ4Ù@oËœC¦¬BâMíE žZ¾£eÙE%…ÁÔ§© «±<=¿^ýa§•E·+“ÚÜ&h  Ýrfã'i­…³fbN<^E(ZœíÁòf^éM§Š&*zŽèHýÅêD £Y‰IènÔ³QbÒR%:Õ©æð+X%¡AÂL!/›oÕ>e³p6-û¬ªâ¼ÄPÎ 3ž1ט«¡^Xw=põ ‰!~ j=Xñ›W!mÃÌ_>¾õùÉ=¼7þµ-›*ü®º2 ã-áá3Þi2]öës_Ï_îï§¹"x½ùƒ´oþÓ—ç=ãp?5­t_Гõ8­cûJ¹ì×´§HB:j‚Â6M: ÛF{Ùñá”U‡eÙËnÂ%CŠ›ý­ƒ÷ØJê¸k6d*-¦hcéW-^r$Ï¥zµ`.@Œšiú1KœÀêË ¢sÉxö¶ñÔw‰UÀæ¾Ü\ƒkÒ{÷¥S‹Ó›«ÇÏ&)Ö|ùT?ïþ`rÚû®_#(šlägïÑɲ.ÿ/‚Ãù úÈ>S;z~•‘.—f’/*pu¯VæóÉý±ev_澜¹ÞXn®dB7°æåõžó…ñé6tEô tfJRa+ë At˜ vHJÅÔÍ!ï×s?ŽIàÌâ¼¶L¦,ó~Øp‰õEÉϬFóNHÌ·™|påÏ å:³ê³,c‘²ö‘/¼Tê0>%š&âÈmÁ½²²pˆ™¼¸:+y·ÇÍXhÿ˜’+ nµÝUyu-Ÿ^yåÁ‘¨—æªê ÂäÓ퓦µãæúi·§äɷȉWÑIgº qS¿”ƒ´mLJ5];Æöæn­a+Ûk‰ †L©õ‹»¦#T2vÖº­ÃÛrfš Z;B¬½r’UìÑÙÌRw+¤¿]ɬ“œHTEIÕª;q™è”3)TB¦OdJ=ëÛ5çwè·XeÏp%$x„iÏ_·XÎPlмûIkE¿úDÙ/ùáxôÒ†˜É£òyá.|öJã–‡§Åˆ•"l#;}£¯8d\’®ŽÕþœç#\Û—é*.{vS9›Æ2oÉ‘ôtõ³Ú’}í^“¿ùà±s|ÊKÐ{ѵ7ÂÿÇîè¦õØëÀ×™é" ,jµÝÂ\“|°ƒFuÖÑ2ùœ—²Ð]……ˆzÛ·ƒªL™ñzÑú<<ìÓ“°ò³Î¹YRŠ.õÈ™ëüI=™ÁÛzãì„hÖN™éœ§;O×Þ Xj§“[ÏWN*$~âEØä×1¸½ŽµsòEkUnÙx˜Õç‚íòïRïõó&ÜJ¢»žQÜHÞ¢ÖŠýprËÍÙ» 'âRšfß“Ÿ4ò.‡Æ™‘UÅÂWys»¼¼àûKœ¬ù«×Ïï>Kj>Зz9ðœ™êú7ðÔ÷F•O¥%M©^"^Ù3®Ã™¨0³Ÿ7HËêk„¿Îð[ DY «{ ÓqN?í®Lùmâc§^ °‡öÍf¤wììФª¼üQƒ„b&ÏÇðî3ÒÚìBª´'« P¾E®ý’(݃úòƒøÆ‚Örp!Å;©}&2º})²ö€uþúG\᯹¯Ì]öØ<Ùšc´¬uq‹KåáR$Ì#ŠN—:ƒ"´Û¯JtFhvéZœ`ºnGq¬1¡ŒEÜêsÉ Éå/â H\¸d‹ï‹ˆ¸5¹Ý»å9¸Ö³|<[´)?Çê™Ò¼þª-_Z!®¨ý0³š“Íj#Æ¥“phkÂÀ0~añ€D˨^ò ¬¬Å™$£ì0á0éüÎwß›b®1Ac«\AýkAÎÅ/.ç¯òx²Òi;‹¥ó-Ÿ2FS‰õ~*Зs´;4 (úÁ`Ôù]km»·hެžrҟ؃Œ¥¯È1‡«sµ¤,…ö•h}Ü*@ÿØUç¯JÀ¡‡ïzÚS¾úF“˜¢Ä¹D{bs;Œ[&5,ò¶B?$p’?Ë—FBÎ/z"CTåæçþæéš]G¿n°÷„P拽âÂ÷¾Šy‰×V&â)å4ƒpž ¶Ã½Ÿz»®6üwS¬âB|ö‡êÛ/¨$B£vùØ2-öïTÏ@DI"WdÙøÉÖ*C»¹…fïô®7‘Z !*^þ‘±š÷cˆ‚5z,%F>}vÁÍš=^X#-M½‚¡L ¾(Õ p ®_ý ñÿ~¦þ À$¸²1¥ÃäzóºæZ©–®µðÊüò+kJ>õ ¾|"£8l<<­zæBWK—²3*ûƒG1¾Kö3Fre‡GìG÷+Ro𥸫@ÖÑÔ»òš•^ç@ÍÿEÞt˄㧬Œ‹uêHÖ¿ò¦?Þ}o©]3bJú¦Q®6«• žÀ]cµô™”Ƚ±¨žž¨§ ` -^Açæ›_õ‡¶*ÜÚͨ¦Ijw2½ÇG,M7½{ÎvKõUÐev?TxÈõ„õâÞĹq6µhç3MVÜ Q£‹DZº'ƒûíg5>Ç]™ª 3:};寭Oͤ®dÞ;?xí6Ô4{1¾…̽‘B¸ÑÞÔÝ—±íè±Ûrc'¢'oir ¿ß›ž.þ4€ø‡¦)dž÷m6øKÁ¦ïõݳ¾`J¼ÑýP›‰2Èö,þÉÀ—§‘„{A×"„04“eIFŠ”/ ZG¯ßÊ!@úÉk¥éËE\¿÷(ê¡öúRôûѱD/S/«S†½²Öd"Éû™SÖâ±”‰·Æœ©Ø²6òˆ$iR”‚µÛÌBÞmOTÌU÷c6‘ªô-AÖF›Å÷^QŽÌå¼c"®Õ©Züw\Pù6tÓ³ˆôš®~Ø(”>çÐf˜nËV\Œºÿ`›µsw30¹!¤û1¡ÔføÏ6 Uƒ/˜t³#ð{úæö•‹•|ØÌÖ¯ŸÓ,U¥¶µ]Ì Å™úppŒ9*™(W‚‹2ñ·Ä–ºì%E·1(¸ôÖyÂïWw“EC‚̪ìW¢v_¬}+vÒ¿;¡CiÒº¥Ò5´‘À]ÑnªÐtev ê»ñz“——©€±n¸Üaèx¢ 9•añÑžê@|>M#êdGnŠö™#^Ä=ÒÓ!¨JRúÎLMÃd‚‚ß A¦Û¤Ð»™ãš¸ÔŽÉ4I“ŸNBÖü˜Á:×>´iÿ's¨&;ÕÕ¹aqŒ]óZ£U¶+3ÉèÄ]åæ+ã4 ð”ZÙ³ú‹1ú˜‚®ø«]aŸSç4.Ý ‹&U¢ÝjããuÞø4ÇëÔ¤‘2\ws2~–rTBû±óÉø9åÔ÷‚Žl‚XœºÁö‰–Ö‰a˯ñßÓkÈjô´8ø7™6y\z–~$IŸž–`äW„~>¢}Sù©€úÔNЇY²Q„´—ßÚB»rõ`¬Æ0âtËíot>R]¹£ªÏÈ#ºÿÁ1iÏ5Ü N´õâ,­Ïl’¡ëlåé"‘£F8«Ù$³h3R™ñÖóGGëlâ¼æÚAYÍãu¸›}~ ¨šå$zY-š½É#tþT3/¹ZìxÞ¥Q^Ä]m%²vHI\mài}°QYB› c·ü©ksž¿(ÃúÕˆ\)òž)¹—UdRÃê´C e¤r¶7+÷)}Qqª£5­‚¹Ã½Ú ï0½B„pÅÒ@½í®[¢6ŠšãóäúÄN´úƒ?X¦¦E›ý»½xzþgîqQU‰¹¿KŸ,ÛëàKÊ~Œú‘’cBsÙ½N+Ï÷s÷ÿÂ;ƒ) endstream endobj 92 0 obj << /Length1 1346 /Length2 5885 /Length3 0 /Length 6801 /Filter /FlateDecode >> stream xÚwuTTm×>]*% Í¡A‰¤é‡ f`héA )¤QIii %%¤¤A•úFŸzŸ÷÷[ëûÖYëœ{ï}íº÷µÿ8¼œF¦Â*0Œ#\ƒö‹€ä5}}U0ÄE@ 1 ^^3¤ þ·‚׎õDbÐrÿQÃÂ!^8:Ä ‡ÔÇ [Þ(,€¥äÀÒr  ÉþÄ`åuˆè‹·0h¸'¯ÆÝ‹tröÂ%úë@°¬¬´Ðow@Å ŽEB!h@âå wÃe„BP€)Š„{ùÿ+„€¼³——»œ¨¨¯¯¯ÄÍSƒuR|‘^΀ ÜŽõÀ_M7ø_½‰PðfÎHÏ?,¦„—/ p  G{â|¼Ñ08À¥LuôCw8ú°Þ!àÏÛÀ"à¿Ãýéý+ýÛ…bÜÜ!h$Ú @ QpÀPSOÄËÏK€ a¿€”'çñ QGàwí@SÅ€àZü³AO(éîå)â‰DýjRôWÜ=k aj778ÚË“âW}êH,Š»xÑ¿æëŠÆø¢þH4 ñ«˜·»èm4Òî£þ'§¢øGç÷$A2Òâ²bÜ€ûAE¥0ów‡ÿ6‚©q]¸cÜ®xÇ}(pÀ ë  øOÿ% 0€!¡^€#Ü ‰¦ø':N Gü!ã(€Eú6 Áè×ó÷ÉG2òÿþ{Ê¢jÚZ†V·nüÕóßVUUŒ –„Å$AX ,HãAÿdAþYÈøê @æzqõWÍ>Ò@àÏ%þ˃c/ø‡ì¶ I÷ÿŸ)ÿÛåÿÇô_Qþw²ÿwIšÞ(Ôo€ÀŸˆÿqC¢üÿ„àèëí…[} n!Ðÿ µ€ÿ±Àªì¿m:^ÜB¨ p¤Kˆ€$þÐ#=5‘~p˜Ò êümþÐC%ˆ¶Ø`êId?Ua•TXþ$â,}¥÷›eK^…4Ñéå’Vu0‡V ÿ ø„ LÇÌø\}å6‡ßd‘”äÜóãP™¾Ù˜ñï]Ê&)št¶WDøðžÈJ­y¡\Ý©S¥Õú¶Y)¶žŒ6\þy[Y•äžm\»i[–T‡çÀ{Ñôœp!C%y=ï|ÎñÖú0ài“Ê^=Õ죽Rìø:ô…¶CCÁí…Å®˜…Äwžì*A6DzŹ£s×”g¤'õð™Y ‚–úyÝàÒ¥årO'³Î:d¿t¼$÷‹3«Iˆ¥:£Ö”ÿv7“#:Û>J§=€­*“œ^Xv¥ÿKI+YÑýD/ËÃi·‘ü‘ÇŠarŠû·(®é5÷)¹1ëϋ݊à#ziî'ó®hwóŽÀpÎ6á5üiF]õU7ûL«§¼"a†/s?héOiÔnL×â3¦HQmŸí;@g龺ï8M¯CÒ)ušÍ¶Œ¾“—Ÿ./ãëö6‰Ó›‹ g€®í?¶¦ä}ña6£×x,7ÐÃHÚÒIÚºž¼¹jš’8î’@<¯'uCÖ^æÌ&`'ZhªR–ú >ng}&Âg[D³ Zs0'³÷$ÿö¤ÏуÕ3õPó~ý܈¾ŒÕ‚†êéaLûçmÿ†e:Õ½(¹é•=j´S‡TûCbò‰N'eÏÏRõR1YsŒwÄ×ýÏcd‰zûG6±·Bäæ‹ýɯ·ê‰d±Üh­Í$îù>¸èZþF4¡<¦ŒÉÚÞ*7³Á^»ú½™^ŠHmÂZoGo?°´õ³¹¡÷”ÁUìU‡Æ UBW¾¤¬¨N²®5S­ÖŒ|XÚɯ[z*!Ÿýªž5_¨­a¦ÿ€½6<·vÀ´’Æ™„e• ÁŠçŸÑAدƒVæ,T=8çØ»Ô|„”j8?$j¾§ÿÙ²Ÿ·&ë›Æœôò¿Q£zöhßÖ[I‚hf<­‹|#‘ÕÙóµÛK»ÏÂ9E/Ç'ü#âgs[¥ÕàOò’` Æó®ë‡CÜQ]™_nЋnÔ&rßìó&ß Ù=¼TK1‰Ut4çq[a"òÈ„geŠgÔ ³ £ &f|l™P¾°)x/erâ-ô ÏŒ²öX!<úíAYÑ,¸ãGqkÛ Å¨T7TÞɤ Æ§ýávCœv©X|vÌ£™kíkAÄæÐéN<‚:ÃS ²Pb¸_Ü4E»à¼ÝØ›yÍ6Ÿ5o±DÊ9HÜ¿Ém$Ú=ñ‘¹É»™´»˜6eæ<¶”,=õ6Û}Îå­„ŒÜ`ç{¨MZÍû:êÁC€^Ø~!~ñ‰ˆòWüüQÉô‰Î‚[øÞ:ßP¥{­¢ÿÁ@_£ÚÏæpþº†1‹?,M3BšX’éÔÓtÅ®˜«,“¢MiÍd¦VÏrbÏˉ‰(2>ö+a:Œ†gЛåÃ~<í#]†ŽZM*϶ƒÙ΢÷ÀIu‡œx=þr.>Ç>÷¶©ç“5wÁ¤cHt{z ß™ê@fKvà­Ø½ é–]}“·‘“!ç7Ñv?I}­HI4™(¾ÍܽÍTó-±6·v§îûÁ‡ÄG˜ÏxºÆ­Êò>S¥ìß§õñü´>>˜ñZÓ¤5¨6¼*¾ƒèMî–ð»qÚÓH÷õ½7ˆôͦYÌÆj(s áØ5–!X~$\?…œ{7ûµXõ뺪à½`O Ü-«»èm»é…`î¹›ø÷kçí;æÜoƒNÙ *)¥zV[çXæÂ¡k"äç9ö,ÏÉŠ$©Û±:•W©.k±“‡¥<ÙÑuHÔ‰T¬çž ´¦ñˆé¯§”ÌõÜr&æÍêfÝÈÈ Ž¢¦ˆ™b%Îa{ zv®Þä;3 ì²^Pg^^”~£iz®ŽB™3­+|š¦ï’Ôidk2ûfohßy—zKv p_lÓv}w›ûì‡ghn>º*0_† lNða^2àø¨ÜŠñGʶS[ô?xr(2|%ë•öµxO+˜‘ÝòÔæ$b5^i¦Áßf”ÉwÚE®ø”{’§k8„‚â¢e˜ëëG+Æ/k#«à°}lík^° @4fÉ-Vôí·IÚêã•M`†ÓÙ¥™!,8ÿKK_%¤.pöQÙóv‡o.ÈÖ%¸G§óVÃצao‚VárðÔ¹÷êžý#ô[{**./8+žßä~騌4£ËÍÊ“71™âž¸†xbi¨›û^¢Ý’Ž^f¿þË£°—C.õо¯oš \爑¥‰è˜ª ¿½`àÊÐΕ+—@¤S8Ÿéät‚ªýÆu? ¾/ò”½Û þ¸uËæê³K¯ù•ûUN&’›/~íÐ,x]þ ÿÌqŠO4³—+3çÜ¿ë¨vFˆAÁãð*‹jýr¦–¬â9,j3w vdE«ùVÝñ¿ž"ô@” Uy\©Ê›z³úUƒ#!¥}¸ù0“„jo@“qq³ü½ ­UwܫơìÓwì+ÚûhCѨң ®ŽžÐ\¼¨Ò‰û|÷ì'UQºf²¼DLï??£ æ»Jß^{Ú%dMÔ2%¾ ý€núÜõ*Nen ÝyNÜFb©v3ʺ®TÁ§°¯LWÃ9ˆ#†œÿ{!,Ò6)ÿž4º³†;ýl7Ÿ7 a¸_µ=ЕCeªæ¡ÔqªÒYrîè8p2ØHSH7—ðg³”mb±ÿ¤Sm³ñXðÝéÙñï~YÏÄTçöàV`â¡«yœ¯‡ûÉó½> qѼxן _šÌg–¶žxÔûú¨±¿Æ`Òž¤¬âöúˆxߘn¯p‹üOÁµ¢Óù¹/ïJ÷»IЇ€Ç’ëO‰Ÿ3Lv,³u&-]8 Ζ¹é¿î éHº¸g•M9v¼A¹{å‚&IĨ幷OÇ(j³O`š9{·š&ꙟ{¹+km¯KŒç+û}ÑþOãF9w»ˆÑ•Ôºg‘r´Q‘w'"8eÚõ·ý—û/9VuJБ^†qÛ¸<þiܧ+{¡¾ÜZ4žæùW!‡p˜O2Ÿ.ñhõ˜GŽd¡Ý0}ùd£ƒO߸Y5Ñú¨éCºzz•ó”…Pð˜FîHúÞæHæM¦gÙ¤p³£!ïEó¤8ÏŠ%:–M.õ¼Îpw™¦ä»û‘6…ò÷­ã#–H3µ•deiÄnë 7í±ƒ‹ýBÎG¦VµëNñò‰w'/›pK+~H±aâ‚r$wœ6Ìk%G¾Â›”ŒñWºã+VÍæ÷VÛÛÄís¯[Eñû½áDJåWÌx>{ÖU:ýÙzéçÓQt¤·ÔŒ`JcágÛKõ—E=iV*…XÉÂ,&»ÆVÕ¾2%ãqáÖwÃV.JÓÇÕ}e9D!;Ì&zm®k±ý&{E}\S™7tãeõ # ¥ç›$ÞÂË‹Ø5íˆ¾ŽŠ *îwÒwVÞî"e¥vÌ&ïZ›‚nIÇ3ÿÈxG[Yÿ¥2¢é±›.ˆ¬cûxÒʽÀ'ßÉöHÏÈ׆o¸»Ä­V¬×eqÜ€’×½¢Œ­L*é<ÁÖ²Û®7"9Öf Ç(†²á,Yýr¶sïÃx ü%ƒ¨§€§§,à!á2ýSì4l¯ì•ñÒãtM6FëÁ(â-ùBŽ3’îÆy{-¡‹„,Ôþs¶ŸýÐ"µ´{ÙRçòR±.¬V‹ÍDkZ]%›9Wð#%'zíÁ]âö¡.I+®ò?Û²@jngÓÛl¤xXP-, Ñ{o˪í]ÿTø–ësŸ^VÁ]¦¦—’öàÅ‚ó¼W¬5Ÿ«\DS Ê?-¥)ŠDÁ/…[ÀžIk”É'Â&,Ç»:´?ž Æ Wß—$¦Ók$” wuœ6h– K(ǃŸW› úŸ±Ý{Ú1Ìk¢es{ƒÖËÁúy=]Érd°þh•ü¢|~Rqr­j‰•~êàhj(¥éuB˜íAžrEwþVãž™ôÍÞô$Mc­×žúšƒ·æ—Re+)™Å¦1J CfÊèUàËåÂÿ¶z…ëLü9ÀÍ´/ z{ùô(‰Òo}Єà“õO±A˜odÕb•ÅŒåiI6¦Üèwô؉YAÑÎáž=M½‰ôÅ"gÀ[ã!Q›n5ˆo4=á; ® ›¡ûC<þN{eØÜ&:ªÎâõÚÂñŠ”( ”§ž›È…5ʧØêh7¿l wø‰´·>òòeŸÙr–Ý÷ îwâ`T<‡übò/aíßîh'%¾óc«»óº§þ~±Ê…å¹Û×Tw‚Xw„èuúÕªMxdÒ$ŸþÆÂ0Í3ï%Û0 ­ñ«K|ß„sŽ]å™—Ÿ× &ðCçP¬ ÄWÓö¾8…¤deÌh}%Ê'è99¼µ_1ð†¨šå*‹öJ¸­ç„8)Ká’½ý@D@Y÷ûIZoEîÕ¸q󉨜´qÀTT(ÖÍo&0»aZ²V²áФVó~c#x랬¥î½³˜"š÷Åð{t´Êð5|¢âù:˜߈¦¤+.õ']Ç64È·æBÙÓ–¦{Ã’$H äÓºðÔ<É/CŒ•âoUmØôJwr}„e˜¤e<Ìš8¬¾$ öB=Á¤~X Ã#ÙXï"²¤EݯA9 <æ´,ü^Ö¹ß<ã.m»u`#/ÿZñJ§ÏH ¥‡Í§'uwz÷hô™$J®v2–ˆoÁ,«(ÆOfZÈüCx~tD_»[•Âp‘º’¹zƒ,ƒá&»šù±´™²ãzèfã‹‚)‘½kᬯ›Uß”Vä¤ÙóQ‘šÜe§ˆë7¿»Q~c¶ ôÃqOÄ»MŽ•yþ)Àô…DÖåqì áüP'¡mM -Mirpgü†5 Á'ÚǸ( IÍŠm*lZ&©Q fKÛ=fünGÇÐxC±v÷¶x3A endstream endobj 94 0 obj << /Length1 2293 /Length2 19681 /Length3 0 /Length 21029 /Filter /FlateDecode >> stream xÚŒöPÚ²€ ww‚kpwwwÜÜ-$¸»w î4¸kp‚·Gö>÷$÷þÕ{EÌ׺ºW÷(I•T„ÍL€ö Ff€¨¼ 3€™™‘™™ž’RÍ d üžRèìbå`Ïó—¨3Ðô&3½ÙÉ;Ød\m,lN–<ÌÌVffîÿ1tp戻Y™ä2ö@xJQGOg+ KÐ[šÿù 1¥°ps ÿÇ lt¶25¶Èƒ,voMmª¦V@çÿ AÃg 9ò01¹»»3Û¹0:8[ÐÒÜ­@–  ÐÙ hø]0@ÁØøoeŒð”5K+—åªæ wcg àM`ke ´wyópµ7:Þ’T¥åŠŽ@ûåþ5 ü§7F–ÿ†û÷ï@Vöÿ8›š:Ø9Û{ZÙ[Ì­lE 9Fˆ`loöÛÐØÖÅáÍßØÍØÊÖØäÍàŸ“$„•Æoþ§<Sg+G £‹•íï™~‡y벸½™¨ƒÐäÿû|bVÎ@Ó·¶{2ý{³6öîöÞÿs+{3óßE˜¹:2©Û[9¹¥Åþcò&‚ÿ#³‚ÌÌ̸Ù@'ÐÃÔ’éwx5OGà?J–ßâ· |½æoE}­Ìoà½]ŒÝ€³+Ð×ûoÅÿ&x€™•)`´°²‡ÿýM 4ÿ—ß.ßÙÊ Ëü6{,æß?ÿý¤ÿ6^fö¶žÌÿ¹_&m UM1uº+þ¯NDÄÁàÍÀÎ ``å`°ü²o|ÿw%c«ÿã/_i{s÷¿§}kÓÿœØí?@óŸå üïX oS Ðür=ffÓ·_,ÿŸGý—ÿþ;ÊÿÛÿßI¸ÚÚþ£¦ùGÿÿ£6¶³²õüÁÛк‚Þ@Þám ìÿ¯©&ðߥ•šY¹Úý_­4Èøm„í-lÿÛF+ + ™’ÈÔòßiùW®þ{Ël­ìJ.V¿ŸÃÛÕüÝÛj™Ú¼=.o#ù ø¶9ÿ;¥¸½©ƒÙïcåà;;{¿]òq¼YÞvÑ èñϘí@o.€·ò|æÎð¿o”“À$ü[ô/q˜DþГèâ0‰ý!n“øé3€Iⱘ$ÿ+€I걘¤ÿÐ[>¹?ô–Aá½ePü/q½EQùCoQTÿ;€Ií½U¤þ‡Þ2hü¡·Š4ÿKÜodü‡Þ²›ü¡·ì¦ÿ%Ž7©ƒíÛ%ý„ý·ÄÎîÿïÛc2û ߺüÓ¯ßääú6ß ÞJ2ÿƒoæ!ûo´úÿÿ·˜ÿ‰Åñ[ëàêüWð7‹¿ð-œåŸÃ¿µÈÒÓÑhÿ—Å›ì¯øÌo}³þ ßZeó¾õãïJÞše÷W%oø+òïÊþä~³}û6üKývvÇ?ê7_Ç·o${[ 9è”å?Ò_“ÿŠßéøö†8üi;û[ÝŽ¶®.Å“8ýÙÞÒ;¹:¼-øÿŠÄò»ßµå­ÇxKôÇøícY:ÿñ¶L w‡¿Þúåú¾õËí/|;„û_Wûæíñ¾…÷ü ßúãõþ¯Å7uu~ë蟧ùíUøþç‹ôšÂ/Í;˜ò†X×…´ßÕ¸3ü˜àŸ¡ü¡™JËà½äÜáú€ “D[´á|#œ4Ò‹ºº#Ns-´Lòì}üµ&¬5A¹íÑçÉ0NeúGüâöàdá±pý!ƒšÐžÏ³“F  ÄW°.Ê\'W.d¥|Œ;÷~Iú²•±ó?”÷ª9ežÊ¾3D«Gé~™¥Ì3ÉšÃ%ƒ1Á¾G?÷@™½¾™AÏ™|%‘‰£ƒ÷=‰f+òÖÙdý|?çµV¡ÆêÒG§ƒKq>6Må-r,ƒ³à]R´:¸èñ•¯ˆ$‰>e••ñ€5£ÚJ%Ò¾¹¯Öml©“e77 BM0ˆ±›P[ÚŒièL¦ˆUÝf‰ªe³tš‹¬µßhô˜[§.s¯Ì"i[´ôx?68­Œ2Ü~Li½iÝéñÕü"8 HháÎò^ÜR7bu…'ƒ(ª 4Þ­ ”ÆD¥_vKâz‚2åóºyÀgÙ.dfÖá‚ê#üÉ‘ësñÙ·²ñ\¡ssmÁÖ]?ø5˜SáÕ¤+åü¼Ï’MÜ(ó#M^†xϧ¼õjeÞ:`ãlpÓùf%6£X©'‰\ü6ÇâÅE»´dß…ª‘½ Oë{îÆŸ•êm±ʤ»'‘ ãÃ"Á¡ýÜ7fÛ7åå"X‡÷ç•îá"#Ÿ·Ô>„ä}êT ÈévQL“Ž/¾Ý™ëƒ3!?Uq#µkŽAÑTãØï.~r§/“£¤.Z’=ä óYÒ_+êë ÂþtÝÀZסxGó1uí3eæÞ ¹aÇH³ÆÅ ¾ªÚ]>¹×滾…ïã;¤ß¦w(¼m+õ¾°÷·x9¢Ò lã¨HvÒ¯6øi¢"^Ì#ZÖÕÝ…– k3f'Ãc"ä0l̘'R€ÂRêÌu¹":Ì×ù„lëm¯,¡’˜þ*½ºuÌk¾Ðr~½nm0Š 1Ápõ#¸©½'Τœï’yÊöCåéx»VÕ”ó‰Ù¤ Óðr¬ïpju³ÓÑ~íùÓ’F™‡jÁš E¾ÛᛣÆ®‹I¾PÁPbÏ# aà©E£FÛ|™F–A©f„Zꯕ™x'*{GÕçý:–³ž¸sŽÓH:ÿ-Db–ÚwmYÆUYÜ£ÚzÉQYoãpQÉìxb"ÏäYê}¬ŠÌ3)UœÒJ¶‡- 8›ºÝ¸Ç³Àñ‘È»!|X<Ù±*VJ‹D“j¯°[™1¼4zW?ù Ö~\¯u×ø´Ü°YÎ÷émï‹‘z‘ʧ_¹»&J6û d±Miq¿MÞné[ä€*©Kw>Oöÿz´‡V;vïHØk§È5SÐmÉ(œXV¼™Ÿ*Òdõ 9àr"•3û^µCàpì·Ë¢Á5,Â/Tûëá””9¾G;ÏÁëžâô~êv(€²¿²kzË}k}‹Uß¡¬oPeø,(mù Åõ OÄî§4O# 2ìb²lé°'çmP÷ò:€H©$WΞCõÒª”áx¦¦:[Ò뮄û—˜:~—fì¹]úÉRá¡aÞ{W€œÊ!çf:g‡eÕXÜM5L&rd×/Ô¬9÷±·°ÒnÕ„’y)êýƒQú1L^ÂF“ùu_–m¥’8k±†0­ªˆÓ_öOŒ2Ñlá‚Û,[Þ*ïoÝ4ä­‹ZPöÐñd°‘ïRß…py«,:Ä£õô«áÐìjžƒ›¿øËú8È#bÌϤh¢m¼Æu yîʼr”çÖt܃²I`…YŽó˜²ÞI\$6±y“§í˜¢ÈË/LIè<¯éBØU¼¶zMFIøCáۖݗ“õÊT!5Db4E}÷5hc!WU‡W¬ðèóÎ׿œ© c·`u´IDA”u(e1tÈANxÜAãêNhi„£á ]ýRέFRSz½v ν‡ŽÒÇ;¾,ã;û[&<´$¸b_ĆDÑÙzãÃÞ•oçc …Ìq8Ùð¥6”ŒÝ¦½ðÔDZ krÆ1uÊYˆß—íE£WÇÈÓ ™8|äõ^+ƒ ¬TfÃ>ÐÐà]ÌkŸAFB¯RdTÌÞ´¢oçâ*Ÿ'>éûj‘ïǿ)D&±ù +q§–gò˜שøÙ–ÆÖ¢ª'kÙä{eôiËAÙ\òÜ7½­ç{cveœš1?@9÷¶“FQË—±"@¼‹Íi¾‹Ùç {d¯¸X˜Ê‚ýBžyB¹l/<ýÏhçeÎEùeÁn b‘ò’¸)¤å¬^¨„-¶ìm9=ÁÂdàb$/ùdá~+*~Æuû˜à¿þÝ6Ÿj¿ñNûÇBõÒÄ;Íå©ÁTÝù̲€<¬t&+8«¥ï®p&Ùø½¢ð\Cý^ÂREs9l`𞌗º¹_·×@,®•eYˆŽÂ“Œºìª‹¬&î‰t¦PiáO >®%¡ØXÝÂY)±ßn9/ÝG½BwåZNØg!ÖâjSÏ®÷6©õ]Pk9ûÏn¤1ÙÚ'AÈÈåa#ÀÒ$ Á×íç~›J‡¯lT ò–•hÜX97°É0Yïµ?òÃ>5’«.Ї]1.TÏû:àýŽî¶}&·±Úº—Ïžð‹%•ÂÃÙNøõ§KfïàÕ¥½ÎÄû´6þÒÛQ—ës‡ L!ï8ÏyXRQQ’HoSXFM¦“3â=f{„MÇP ¥T3 †i½›ê‰Ù *9>Ç.Hô[ DŸ¯~ \Œ#ýÉMtæC^ž%nÁ$[†u"^U£a9± ºÍ¶ÃBƒ]µ_/„õiráÍÚÁ'¯„áZ¸/‘ÂÀÃÞ}ø!§-䩪ïwšžVyoë 2X‘G’œåFÊ|Ð!‘„¸¶ñð³T|ÃX7<ÈüNɃ=@*4ËçFó©wE’xUƒŒMäÇÒÕÓÞÝ–”ÙL¹.ôKòDÚ©)‡Âw™£ë™6‘ç«F&ˆŸM4¿J=°”é‘AºUÛ\ã ’.-<$*Üúœ˜TávžU´Vxn#‡Ö½7š%‘rý*"D*"ƶ]Çõ†¹ ÚYÊHº°²ÎxŽqI›ðBhÑ«Ü9Õð׉ýj`/,R§âÓHXŠAÉ>92EÊpÛÀ0tÅ3¾Ñ/{0†7Úˆ¸fê´DV$lýœØßÔ³JR×/x`Û¥ì÷¿<߆¶ûcSÖ}cÑ%S4/Œ*5¢Á×kž]¤L­µÐ¦Gy}°8 ³ä(ïD+ÖŠ²øçÒ¡D5ê¯çÙ¨¼Ù|±Nö‹»® [9Q–­~Ç8~ ¼SÜB¿Ó÷¢@ÁÝÈ)/QUºnÂ%–>?bà¸*ë8[¹L²üòhH’-ÍÅL#,q+pDù“£‡ì0Íg`„mßÊâºq„Trå¦Î×™jv×huß®þý¾_%Иê€iÒoÉÚI'GïîIgÁ¤agµ”ÌäàÉR˜‰W·œ?fð‹,Ië¨B³ÜȯfZÑ,‘Çt•?ÊY–i3üòSu~ñ4æÈ+iK–ÎMñsCFêC–Nãh¿ÃŽ âˆ_Û˜¦Á‡¿ËŒ@Èê n“²ËGÝqÁrÆ òXM†ßcìXžš¯®Î›´I©Z¶íç¥J®&çÛ_N¯¹ÆÒšOïJxe55 æïH›¾R•¢Jæ{…jÿ t³Ç…˜%D¨·£Q[Æ6pe\)LêéÙ¾Ãs1C‡™mJZàq•d2)ÿ2ÿi‹ÉÜ—m#9ãø[ñЙdi2Zå>µ¹¼Ë4Ì,‰–¦ú³ïÓMcs‹vc´BÀì¥õø©TçY¤¢Ô+ìÈøgÃû¦HÞƒ°º‰Kÿ¸m™·<äº@ýUrxŠ%˜2”jQKÁ@Ž4¾UÜg¢¶Óo5=B •¸YpéÆ  ˜iÂþ¦m4Áäi.c ß5!_1Z˜²×ö¶^1bó±w#ª2j¥–¶Í}ö߬%ýÑð”w=£Ô;zâ˜-^zÆ?áh|`€¸hy¬ha”Õü3cÇñî±’ËÕs•Âù2yí*ÉÞÜ×Ô©Ž£ÇÓôyM.ëà®ûY¾¬”K»gÅ#u™Û©Ú¿BSeT <$’Ðè|qš‚Æ¨p=Øìgä ߺè÷ ÎÍÒÑ£ŒQ?u[ì~GŒ4åµc€»ùM$Ú“2@Am»¥‰·JëxS°ÝS&þ›a†-ä–ÈjgAJh56Ð|2øÙ¦E…ñ8ãúÙ:`ÈŽz\u§W¬mlÉÖó‰÷Cv>¢öõ¼h}å€Ýa£ASµ¤+‡¡dÌ]ãKñ# ˆ)jáe3zlû~“ýS-K¥}¸á£˜€¯#4Ýžy™·%ÑCɘ¾Ð™ü½Ñ¢Á÷¯’²7¼åÐ…îCÇm»ÒÎNgÂ%læÂAÚhV®½k»}—Óg'ßѵQ‰Ä®oxb¢—͈aTŠ Ö Â 4Äc†²XzLÚíVã²Â‘VËíInÝÙ/®¯°ªû¸Ü²ñx!hýj²¥ÆZ»î# MŠÁºÛà‘NCÁžÒ4ɯíÖ¨r_ʤ»M}},‰»)â¼Ä¶1Ô'{cÝÛ´£é:ž+tx&Îöû' 2Yº.mý—€ÝC`F®wBàø>'$Xó«á éƒËœ?™²=§ŒÏóЋ‡‘"t«'"P¾wމgôºã÷@ æyíY]ʇà ûZÖì=Düðð÷@Ù;Ól‚‚Iûaæò9•Ùþ=²7rµ­ N©×UdÒ(z¤@Ë>×)‰#ƒÜ4ÕpÁ#Ä™¬‘À¨¡„²×(9ÿçZ׈K™`«Û·¶A½§Oïã±æŸ•G·JLÌCéVÚ;×C²Èࢗ¾¨Ãµ{M_YYŒï~ŽumÈNãëÃÐzð\k)«˜xß>lqóÊ.¨ÅªßË^"•>žŸ±p™nÐ3å$t¨ËLU?½òC¼-ŠŸú pB;Xx•&e› ÞZR)üìÐ[ì£ +èY~`è×½Ëâ€Gni­_ñ楙ÓÛ¯“ÏtKÅZâ'_’Q‡¶H»§úÈÞˬ¨~@î^Ö&®†%<€:³^A"¢ú¾$| ƒHW¾Þõµ }ÿ:Y!ï§[*¾š6Ú'òÜ*¹”Wö‰/?÷3ÞMRßœÜöÝûKà˜iHÊÍÓÓíc»`UH¾n0µ”:5ôAŽÜ€YF  TÜßëWx…ˆ•‚„Ùnèé9ò‹BÖ´|š–F»òíᯠù#¯~[ÀÍS 1™9Ÿ”ÖV-ßé/¢ÎÃ8ƒjÃÂÃæ¸Ïà©ñ‰J¾¼Pd3í²73äqj¹ÍÈ·zûøÏ·³ Dø¼ipÝ>G*1½þ $)×YÎWåç©Tê,e¶a^ò–Ï$lW$ªcÊSaà{e?:—^.>¡A¾ýrs ªE<æesví_z…ÙÎbæÏUXûùñâæuëÍšžd2õV뱉+ /±MO–qžîQ| ¿:­Y¦3„÷_"°ªº§«^ðÆdÜzéeI|Àà.B'“4Öcc3áSŸ2”CtW×ùÔ{´x!ƒ–WMén(7káNÚVET9¸?Þ÷ÔƒE—e“õÍ÷gÖ[¨¶¯í˜”jÀB¯ÐÔ½§D¹CWÜÐbED%ì„`*:Wöi{ñ}¤ÂqNá6“%0b ô…g°€qzé}³½D{ŽÈ”eÇ?(Ë€·°¦Y¤úC)r¼J¸L’:¸»õ§~êû˜øëâ””Ò‡œjâSí]͆:‰tqù¸ýôa‘OÛ9èïô/X)ù”¿îmûíAXlïŽÔø ‘/y›;ºO‡½³z°:"q€åvNW÷¶÷úæË©ªůd¸sŠø©Q Ю¬æ¨\¤ ¢û%âVÑ¡ðYS‘³ŒÑlp«_ˆt!å@Ø¿ g_¡jU´™—´:6ÚÆµ§J×¢Ùƒ¤Û‚‘@:F´™!7™a†'ñ“¼Gçý\F<œ©ò]¢«û×®™ÃÝ½å€Ø¢'˜h³›²ýöø±€]ú1dK]lQ*$¸¦œwV9>//WÀÃÐFð'rv†Hòªð-âêðí²y‘hß™2m ¢DÉQ„RÖgùç?çÆ¦oPf–û “ "Õv„¬[ Œl•£”¸4»ˆ …‡Ü¢šSÁuêßut4³¦ÔüĨÜÕrCNdé´½ü¢XÒl¤rG£ jŠŠk_y‡,Ó|íÙ)$›oÏAß••Kµê5 kÍAº½¹.ß]qÂjȈlŽ |YÁ¥¾O<<»³‡CT2ß@nÝDÍ!ïD†Ò½>=~Cà=É3ºíÚ©iâ¬3'`­;y7 Ö÷)¦€2sUÎ(I’Þ¸XpÄÃêõ–p¼Ð9Êî¿ì2ÚK !tõdîMæ ‚¿’ßú"HAÂ9ñ”Ÿ>&ëÚƒm•ÙV<£³7‹`¦e4·Sm쑺÷Ÿ0éW°€º»j­iƒH»Ä8baYŸµØ¹jfý"dQ(Qñ]Tï&íì‰ØG9ëWõÝó}æòmv qUe\¸ÿá! ¯¹²ôÙê!ˈ+InßÇk$úœ¡K•JóŒútãËáÚªøNÒSý,n„à ì™¢g*=Yà(=šü4= ÖîBú&¥—Ø“Àê×rtBA(À:´°²ËîF#‘5,P)]Oùb¿`aÿU£¿ãxf5,Á=Oÿ›ŒwL¸%&µ10j­“ý®à,‰råäE'Mî*§:Äd%u(„#‡æ“Î(…eîRŒî5ß#%Å ®N1‰x!;2+¹¦µ ?›m(yÙXxš× ^3– »YµNÙÚ¾f¶vyŒiÃætÿ¤‡(ÏÉÏ”ò]–’éÝo{™ÈMÉ—$?£‰øC^ Ü#„“Ü,Ìâ’>‰à'¨ðð¥áTÝrœã•|ÈÙ)gßAyßÛ¹Ö:ê’C@wÉä•OŽ] IäºõQÝ0zŒq0 ?CçÛÈö ‹-fóHÛév®¤HQþ‡>ç & ÿµFœ"v¼)sñ(­'_!ËÝRd:qÎf©¢î¬†#‰nÑžÝ,dÖ(/‡«-’þ¾„c…û.±Ÿt .󑸰šu"§¯¥;1œ]©ÏCÜp̨öL?íN=™½­z¬a&¸:G3LïYáÔhÇÌÓ³EÉ€€Ñ …z²|ìË›¶»X¸]Ö”™ØÈOŸäJ•ô|sH+¼ov¿N%zó¬ÖÒc}†ŸL^°fsÐ}¶wB{ÞL^¸îb&*9è¸&€…`~…éK$Ç4DÍ©¡ë{ÚMH‡Èúë|·Ì_/dœ?£Ç@O£ÏFRdíuÆp‰je“swÏéeø‡g¡÷Q×å­± HáðDŠŠ[Îdk’Æñ¬(èÛtó ÷øàpó÷æk\kæÃ®+%€z­Óû[§ò†óKp©TW¦ÁŸtÔ[ Öa&+RIÁ¿ŽeÄm±=ØQ‡}†ß§o*¹ž û\lP]S­“VÛÐÞTÕ¡hð3† Þ|IpÔòæ)²¯µªïÅ2õç'ïÚÏ¿*idÎ;s.“* Ì@|„MS©Ø/Ñw:Ú)/_Ò;3Þ/޾ð|š‰ÙçZÓB~vSÛ”L3f`$¶”.¾üƒk@iS†ü öŸÓŠ c  if믅:ÍŸ’‡ìÁd•ÇIå¡Rßï{P’K¾úî³%M—8ݶIõpø¶KÎkŠà?Flá_ëpÊ2¬Îî‡DPzâu~weÅ:Šã'»7Í| § r×–ÖŠQoú0ï‘™YæÅGJrºXä㫟/‰ãÒ¾6ÙðRo%¥K°Ë¨~³°eÀÒ55 dÃ^¥ÖÛh:„¯*Nž¿ï&ò$€ç½ÔÏFà‚ë(À“4ÔL,Ï lžD¹W'S?éÒ'´yškØèz5”øµrÈ¿ãS<ê‘‚-™éûëì~9KBE|«‰R0¾Ö+-9f»7êŽóÅ›¨§€Ð&S¥„rÝ!%,nø4i=©*5)þ[ʯrCðú¬‹-pùO[r¬á!w]j§{ô©Å–[UeöþöUø/ºqÕòrúõ„WŽ×íÇ}c³~_˸Á«èd[?V‰dx¹01¦2¸ê§–g -ª| '¼RùR¢éÏwS@-XÌYfãõíAÞ·'»YúÙË´ Ä³~ó8I×LƳ”ífÔÖï}ï{5]¾,¡ŸÌ–ë^7ÄYÏîãåõ]æL™Ön Ï0R‚ìåCt1Ãd¦‚ð€­U¹ˆmoÕ@¥è?ØS,ȵ)‰®È•Ôê·M¬É;gùa`pô¢‹ê€ð =yñ7çn°Â±ÁŽùÞ ¡SC¿ÛT‘Z'¤$Ú%ŽúÖ¤«B–ô&œ;•tÉù²ÄŠ7À5/bçÇʼnr+ÎÄœYéý¬vÜ©CÜ­…NŽœ0Ii¥y?]‡‹Gé¬_7OO§„l¬bêt^Eiïìý<œñ*ok:Ê?³þªWERK±pKm¨ÆqµG`œÙyÞ~%fM½Ÿ&:DQÎj·ØñIµRRÑeD°ãs´ÙUZƒb2OLÿÚ×ëà±X2Š–EèIÃ3—„‰6øËö*Q}î·hiý#Öëqkfä(È6EVNI!µ ­@ýÊnÃ_|tyÀý £%Y7x¹‰¡²Ø08C=2Ü^Cþ’¿ÜÅy¸ë 5ž— ¹#ûrÎõÚª›?,Ò$ÆÆluâ£MòÔÎöÔy¡œµBa©­•@¶!åTýÜ•fÍV`t/ç#lfúʉQ¹ts¹ô1âIuͽÔË-YÑÁIs³8W‹¦þrKu‚VШQ:÷hl6f%ž›@âìÓ¹Å{{:U]‡5 ¹¬iŒò[mL¢'·&C"éŸë ìpØm>„ÉÝ÷×­pÆ—äØÈ™i×nq›”5ºC«Ð5ìSg]A¥Z«°¦·½–ýi{àxC&ûÃyÕÒ/ËYâYK^"ÏÀfA΄2AñdP„”ÔÄ0´±Qª×(âfÝÒîIeð\tF¡Am¨õúÁëpW˜—”årºgŒ?45ì·µÖ3ô÷=X5‡©.^š'E¨¤4‘/üÓ›³6ï¢Hplí‹JI=‚åz5íùé>|ª*lçù¦“‘h­:o~d¥*Îî(º4ÍEaY!f81„´[LédOe—¦ÎëiB+8’Xq2ù•©DªÄ©7ì¢nñ™Šèûw‹`,ž¦’¯lHÄ+@ ²Üþ>¿Ni~îkg¢ ñÃ<ÉV3ðä]gÐÕ«Ý— WÄ>d¥Ã}îʼöÊÉe)ß+Ùçë_‡ßëI§gåû²ù(š¤À=²øóŽßø²ƒ1W€Ù¯o0ýPølŒÚJ¥r|ã³n¼˜s!Å:T4€B"P?þ¥(Rvö7ëz ÃG|¯}ù$•Ãñ’½Œ÷’ü#v¾â“œ]¾,×Xk}ª+óöç}Î'— ¤9öÓÚ&ÔÒ™4®6¬É”‰ Šotßøp!¨Å!5¾•ìÃÑÌJ,æØã¡o årÚ h@XƒUF‡ïõâŸXCqRbË:ÌPö™|éy¤M…AŸU;•ë Vq-ÉéW’3%,í]ðñÚkÖì½õK$Õ† âÁ1½'ÏÆ`D‰XΊ5ÓÛ2ãáOçÇïk£«Ëªâ&=Žj0…-5Œ¶Hýùù4¤¸Â®Uð³÷”_ÌŸ?YQÏèNÇËÁ‹¨„nzu„– nÊ04†öW3“ f# 1Iïibν\Ld¬z7qÓ 0”Ìžw†TžÌ3ÔJk¥¢Ý-&•b0åø±Ÿ$)òìc×Eš!83»‹-BzH‚ž+ wt­Æa¹ŽoÝwÃÙ¤>ƒN£t¼ku…Ó©ŒG¥”¹†ñѺbHãBO¢&ykSŽH¥U«s|èµTüË}R¢Ùz,æ:¶õ?Økï“‹áü-ri¢3¸º> Ë›smTÃëÂÊIf47ÊD&¤‰›…ø\‘Ì™ü0øl¬Ó ÞÄ>ÿºGÍä!Bñ‚fwþŽ†Æ‡Šù8}xc½wòc~Üù•B9 "†Ö ÚŒEWÿlŒºtÙ¤W6ŒP=òŠ=iþy%BR;ž,óÚ)êÄÒ½ð}ÉÚ5ÿè#Síþ,ÙZ%ïವö©ï=ùöÅIÐÆÈŽkccÖ÷ýÑ´Ci'˜o· Zî0~ŸYõzäê¿àcÅ«·ÔN¹*È¢\+—·¶"Ü » ŽZ4ùùÅŽ„ qØ{‰’¨1ÄœNF®‰6Ã^«Ç¨žSb«6‰‘+Œç¢j×QP—¿r[’H!V-ÞÊÓ)˜<ÏP£4²Ëæ"4“¬Æo*Ä}TÔ{Z£›*º÷QëAœ»EÈ& ˜WýZŠAô3MýWïÁ÷iÃveÓVÑÄÌ+£Tø¡Ã1™!÷çÍg;ú’p·Ž³¸Ô.ö ­ö™¶š€ð0uÂpIˆìãö¶mÔ .ÖZÓ¸©¡^:QÀÔÁaó˜.ù †>iØ%«¯ÛFï~”{ºä]•L[Rø¯ÇgOˤÎÌèå‹\‡ëUžò=ßUîP‹¡ÛйÌ/¦¢šô‚'Æ£0ªr[ÜͨåNpfRNH&†ß¯ÈXjØM~‘|‘ØÊÔË4OŽf=2na?êÓ•T¡lµTL—£WKX¿çiP‡,¢´õ¦6Lç)ÓÕW­Œ>nÊ*,Ä Qøè0>oôœõI+Ó¢öÌ´-Tˆ‹CÑcgú[KÙ^Aß;ÜÖ ×KNÅ¿åÃó€òI)äçòré³·ŒB™†•íÜœE;úþêjÄjB\ dœœÐ}ÃcÃà\d÷½Ì|P‰XŸ…]rWšJ³žýå"Í>ܸ_Ö8£íœ7žÑi´É=e3 0R! µgû_”5c1¬”ó¸r]µ™×6»8°eå[k̓q “]ÕE—)‡÷‹Ì–JtÃøj#Ò¹ù•#ÎÑÚÓÖºó(‰÷FMà’`F†ÝÚµ3ˆI­3/€uÊîÓQ³«}/)Wˆ&‘¾î“›®¸Õç\¢ðQ«ÑýVžf:NQø˜UtÛ£ œ3&ÿUqhFÄ“ÙãÍN&äkâTFÅ"i^ƒ-æ˜9ó„¡ œéž :45¨t4¸¶-è§ÛadáX¯8Ë$©à àƒŽ_Ї¶tdΕ)Z.æÿ)jœÕÀÕÓgšÅŠ#’qxü"š5†…%;Ôº?wñKr!w阑jÏFß®ú]еG^µ*xc¼âÏÙD Ì.õÙ6"s+ÏC“5>ßJo¡¬ 0=pþÅqfq܉Ó|4}¿íûuÔÇÁ—D¾i®„XÝ iŠéÞc¸©/Zn FÌÓgS*v—£ ¥ˆÜž­õmPœ¶?øLbÞC‘§öiÀ^ŒÛ0ê¸:ÝHÎ-|€¥.œa¾ôÅäkh¡+‘CE¨¾€}ײþõÞH€.IÅz1=ܬʂ¦Ýçhç<êB¢¶‡&š%ܦ¶Þ<˜û‘N+öqÊíc?çÌt,éGe#ûrœbƒXËÞ@†>îØ)ÎË´í“Ä`C‹¹4ɦnûbab„É”U` Æ®®vÎÞ»iìQ¯gy@Ù‡¨j[âzÃFú¬Ÿ|MÃNàÌy„ùa@ã|*?œNóÎD8¤vÛMÃ×è%fÂõ<ÆKPH£ßóƒÉVý´.rR¡¢{Íô¼Ö¬ƒŠ|›âs³…~DãᯟºrÑ)œ°pÖqúôh* ×å2ÏsnÊ]Á˜Õ"»,ÂÎù\î%T”8Ô”S fõ³ ÒO~P]e›“™3RgÙ) ¬ .ÂèÍ¢ðòð‹ÂžÜm¸ùú 6i)•_cU¯éÓsLƒÓhœ6!M~¥ô%ö`£~Z3ìYùÜGq:óüð©“,Vóö‡lQøðÊ™¿×Mêªsû>*ò,Ó+¥¸Ö–K/ÚMãFœJ>ªÑà«ûö—’)ò³ºKŒWUç öÀ4Å+e­^›rÁn¦åE9SÀå{UrSHéYB츠´Ã)¥»_uÑ}z§']ýhÞjlmÑÎÕ&y›HCvMXbÖF»N–ÍÅ—‘S{æ}r@-‘p%Å>ýÒc"KrÌB5+ÕU’á3=@nþ×Cð5¶4Zµ¾hd¨ôÔ£YY¸ÙÙ±Z÷N e?Gg÷ëúÙ< ª™#&äÈ¥açcÜ|ƒî†’Ûá!Œí(ðOM¹+Äõ8¨A‹̨¾ .{Q+ÃÐɤÁï”<8ÛLÂTXǧÈ!µÔ!8“+6n5Ì}Ý¡!㿹Ãp œ‡Î \Å“w°r*=Ò*¬P»º'㓜ʧ¦„6ÿÖkå´S=ÉÜÁ ·¾o‡Í#x¥z9JÆÇ6I€HËu_i’9¬•a+°ÔVt÷:ó aâ‹)5F eÄá©(G;‡äŽk=<ü ;V¯†ŸØMŽ@-e_™Ô[ŸÖ-Œ⫾.÷?‰~Õ8V­JHlÑ"ÚEËb:¼ºC‹ :ËáÙýÙ\Ü¡!RäΙø¹ªèç8èÛÞ‘3.¼Siû»®’ö–ÚÉ÷BPМ°›ñž%HS±C~‚à˶eO·Û¶÷¼zÕª?°¨ÚH64t¡ÅpW3Dv(õs^Oœ<Þ÷„¡Û”û ¦ó!Ž3 èCÏz”ä‹d7 $špß2šP2å)Ïùèžö1Œ~M¢xÉy>E;E[ce›“£fÚÊz’ùÓ¾>¿¢`ÊüUŽGfÍ/Õµ£ÎÆŠø=yyžq0Š oSïâãŒ[…Ù힟ÝÒè@u¼’¥#0Î_®çä&?ûŽ’<¯ç›¸®dÆžïɪ™ë}¤/%¼B¬‰úˆnà äÓfÃÒøžèÈÑ9 ‡~|Cî3«U ´ÀüÌ|‡-û™¯¯:€£L½Ý?ª©rtͱDt×]ŸY!ÐÝÿ}ÔC2üôlkÎk¸E˜jYû ÒÈe4¬MÕÝ-פ}r \%æ™®‡Ÿèëw{çàlÖÂårDËõ”¶óî@ær£j¼¹ÈëO)-H{#Ý¡èˆÝÑr_za6ôÃ&ÝŸfsE}†ÏUaµÐ_dLH*{Q˜SºÑ®ºšLH…ÇðÁ"E+’Qby ãqâ˜w¹’K”ÙÕ)7 ¸9ðäídùè¼OçHpÎɳ&5DLgï-å!°êddó)ÑŒÈ1Yrð•ÇÀrMTîv¾n´uãOimêÈ€OI—Ú(S=Àu.|eô¦ÀéËÎ]ŸÃZÈàå"ûÝ´qG$Š9¡øŸyjäO¯C ‘ákvc‚¡Œ[%ªÓüK6wNkîÒÚMZë#BѹJ²U®´3Ù^9 ÜâFû4›¾(J€‚öb`à¯;ýÒ$O¸„¥¿˜ºQ»Æ=Œ~j2‚œSG¥L‡aܞؕ6Íæ‹®únxFÔ=¶çVS^9}³OeXÓè q$PÅ+mé¬sß7>à N»^ñóR¤Ç øœ¸ó(LíÖ Dfêú)ÛÒØUXFeêsË${/²SRÄû—¢>ÛÂ;Ö²Xy w?±x}0œIúR;¯Ò>ÿ‰¼Ég  Yú=Ī©“ç¶UÃç+Ë¥Ž:e„þÏG>.LýÅ!ÐF#øÎívÞ0@«¾†$Vû… TJ9ö7ª½½YI2éáç ýÝC`û<Ñ­4lþ: ö¤6QÓkÿrXÞÌ™iêŒÓÖ¤ºÛo(xÉN— ®cYmy-añ’ýâ×5Å•¹R/ÅkNѸKûaݲ`ÒþŠwØ”Ï~“‚}Ò-1s› KÙ2û"´ºôÕo\XfVò×Èg#üW”íe%z¹÷TˆU»¦—w“ŒšH3%jÅíàÌ×1©½Ž”·lÆ3òŸ:›ø‹P 4Ý… Þ)Þ/g0ð÷0¹…\;p€:NÌEý¼Ç‡¡+^K¸DX=‚¥â2p>á•>úùàÖ·ó’-¯ÏbÃäüÀq¸ãKÐZÝ"ŠùÕáÛŸN†6Lão^®Õ–¡.óäòiE€kGM¹4`àËúÌ!™Ç` mG…¿qõV`Oµ%¯¢Dz[®´2<¥õ"¡ÜL­Nóa¶µYEL¬Åd]€b¢êXúQR•‘¹2Í>KùOìiWX”‚bõÑEiñzáSŸ¾"ÅÊVn‹¤9ù4õŽ`‚aÖõ—¦ªà|ú˜Hªï¹ì~ÙדÑ-ï6Þ½À}ÝÍËf;qÅ7SŒPÍÖMøEçâ^vL Ý8‡  S…“±¯#û¦¶W×W‚ùÉ3>ìšÙeB:˜•žXr›ãÈ£MÕ}… ‚…cdìÿ»/ûuÝ,µS—ÔÞ#««®ÞÏȽr$rªÄ×ïáäyíšÆ©û‡ªx.¿ª#ˆSԌ瀔Ë)½÷p£õþC‚÷u´ç¡‡ö 'z4¨8è²³99ÈR'K÷,ÃÂSŸõ!¹(?›,ÏórKSlxrúºkýô}fÒÍ~ÍÁ ØKÛ6Óf§W7é%Êô[œ’ØrV†¶ oê…æ|iL±ÓÀ¿#HkÀ]"R+ûœˆA/Pm¿Ü[SON¸O(uŽÎM»$~•­hå*ŸÉ/o¹A°²F½»Šç²ÎM ¾{#}¶#JÝ+ I·û Šß¡Dîž)tü§ ·…f•®ï¦†i¯HpË÷DäN5`æ:ÞIrœÐ³=>fÅB¢Æ=žrö“ÕË^z÷H†´t[R¹£îYû!®÷L\í'\Z“óô¾Ï´cÃ<íäüUEÈ0+¢{A™ýÀõw9…,|Ëßìj£CŸÚ€4ßMÍ`ˆ(´‡]ÉÏðm2s¬;5„7« UÊñÖ§8g:«Ÿ´cUòÝ%•b’ÒÆÐ'8=›Tˆ€ÊC©¢àÀ9‡É¦®‹fIÿ˜t"ª' Î8Ùvwq¬”ËhîÇJ5Ž¡"Î\Y%訰¹æb†VmÏ C °ùÙp!:—Õá/^íNDžq¯¨üA,AýÚÙvd>J¢íûˆžSŽÑ™À1~4S_ÅF5»]ÁŒÒÃVo‚ Éñ˜¸å[¤àÖš^‚Ä$† =ħ4Åguœå-*kÌzm¨f~~ò'§d)‰ ³ˆÃ.áè*e„ýtîH×Ô®T,ÒˆP1¿J9[\C(ÛHUþÒžvÌ:zŒ˜##»Ì­äùMò÷t‚ŠY¬[¢:t'Üæ¯FζýNXê–‰I}NýŸ$7à«å‡gÈ´¼ækl„”“©L IÅMgòJ‰$ã\gÖúóU£~7ò¡ Ré¤m{zë[ofå¶¶kœŽ©êa;Å(Ñä¶ðµÔ͹nÝ@„aˆa—h=Ž €€”KÓ J½¡yœ5Ç—2À„"Üdï_úJ9„PŒS%ñ‹H»Nhlô_–sï*óR÷×#˜µµ‹XÏòp9“#0朳´_úEM¡õ ]$ 9f³~ÉÇôO·Ù.Wp—_oI¬Œò5ïÕò¤yÐù|_ë3Ì0."~ÛѤ.µÞ¤yûȆÞè)EŒhÕ)âzG·Œ‹ xiÖ’ Rgã^~£8ç>6-›×ë˜PniZ²„K†®MÁ€Cò1Hƒ"HÜ>b¼³T¤J@ßp+Eß ?ÕS¸6ÂÉ >S´³ïWg¸zø«bM¹æg탾g­»%z/ú/¾- +NŒGrˆÅ pgÊϤ„MXQZÚök…X'dhâ€`×È­ì.½N¶˜–Í×Ï~Z÷¸nÞsNMúîÿA9çU ¹÷Û¸›ô€RvI ˜"%|½'qÊ6'‡P–JÆÇ¥Ü,@ÎØ7Åÿ­§³O •pB^G]ßå,Ä“nêP8°‘‹é‹É™}Õ“Ö*€ÊÎRAÑ^a\)ÜŽ:0ÈrMo?5[+Ù‡âpó®Uï@9pAk@qµ©3"óÚN@Ðvñ\Ä'Qu'{"7³(YftŸ<>ͬõbŽ¡ŸÇµû«[i÷|aÊRµšÑL»wéçž.‚’7ù£^›ôGF…%;?MyUú\~dKSTƒ_œî ÿø 6¤'À’Ó¶Žnj‡¡gNš zã3øM£:Ýô+ß^a]‡ÐõSžF€‰_êjd:Cã⩟5ŠÈTëó//Ñ‰ï ­ +e§s¸“Žõs Bþç”#Q‡ ¦¿ç #råvèŠÚñíc=1]Ǫ¿g ¦~jî\Áq%¸›Kyh°©VQÏXïúˆØ<09?7X—Y,ë>ÄwÅQœð ݲˆw äfŠ¥iâp²®šèÃêæŠ¾KÆø1Én}eKS?ŽÌí2÷êö¬÷Àl«.{ù¤0ÚŠé@އ´Š®ê°Ø#ÖàŸÇä FyЈ}^H ƒê«€1Šò7+ßödi£ªÂŇí^‰–'ßkRñ^öÊLjôæÅ¢ö>Ñä ºû7mriZd¹åÃjß uoß( P…0·8q{qE=Û[úÉ&Bž¯y,‘„€èžéLjè<ƒY¡bç¥Öc‘MC¿µÜõÚ½/ ’Qß<­í#bâ®ñK­K˜ì'«V’øüÏÜ2CPU]€ß^o“dß¾v†môêe¤© â&lå’F‘t•‰¹aÙ„ªË×½i%ú ~Ú1ùŒçNjÁÛ)‰%ÈB7™§>%ç¸äº:V*¹Ö1]²Ó/c¶P [³þæÄX0Õ• „Û‘à1³µŸ1UcêÈ…ßØµK@Ós>lJ =Dbe3Ý•°È>Ô@±¦³ÝÚ v7wô {¿°Oâô³0[ü<Æv“©Jä§èbé²ÚˆÈýŒ7žI½ RzêZÓg²ÇS²ö\_í¢.ð…Ë–Nê {KE^‡CŠÐDãÆ>µ+¥*}/²ïÓÏ[BãdŠ™×[ nVÅòmˆBbUW+Õ~"Ë¢{‹tgõv ÒØ;ëS­g°”"Zl°>lº7UVêIH:õmé7|96"³Þ¥°Ýœ×à Ã< §ðø_] !ÐŽ£xµáD·ˆøxñªjHmn·` ¶f7â:Ió‰+Ö”‘[4ª·ÖÝxpK©ÿŠÖaë¿'éÅwÜÉO¸žÇ? ;{ðPðp&fFžŒ£Ý“w»Û›YÉ•*R…ÒF‰é&‚ù : ›³:=o¦Q|¿¾(m®)TÂ…Ù1å^S؄Ցr˜cæ–uÖɹç\ÁÅkËhý‚,;3Tÿ£H3øwÇXdw”[Uë¸(»Ô¬id,”ZžXž&qâÈï—Üö9íUø`±[O6„Š€•=©Íz—b5ÆÃ½Ø^¼‰Ç€bÀbV%v™wB­}$=Á™Ûù×Ù¹5›êsÊNþHóª¡ïÔ‚n®‰÷.@Óž0è†,8ÿÄRȟʼnð¥ÛžMµte†ÛïJü¨s'OnaØ7µ €U7\Z-; •ÖßüÕA•¤=ªrÆ©½ˆ(9f ŠÑ<®„áÕqÜæÊåD®+Cž3v¦@§:Ïb§9¶…= 4ï㩃U²ñdívÈçhºû2;œL0¶ íÚðxÎn>›xÜèö*ŒN=2À$WÓÇXpÃ]â Bg‹¡î¬]˜Ê°]ïc¹ó©2Ѽ r-ÝŸAáà†ÙN{^M¤Ò Zðî úà–â"6Ö!Wþg¢½¿˜ }'…†3(§á“…^q߯"ð¨äí&pY¾§ ƒŠójÕKt€ù­ÞRu3<Ñ­oRÅ£HN,=ù%7£W‚± +õåäÓzæ¼Ò€B.ÜŸQb3+âjÕÏžFÌ=?Í—üZ5H4ûÅ”±C‹JërÝš“°Y[Å^B|ÁµX-dò‹kZ&÷A¨ãˆèº›² K\F(F]aV¿–hzÌ%Çó£3ÉÕy1Dù•I»Æp|û:%/×:¾V›p'ýÍ·y×e·eï5ÓÉ•îk¶?|„°ÕÃ޶ #ÖrÔ–îÛü“Š”«?¤.ì@â9ÿ®xðvÜþ1;R»ÈÓ=ÎE ¦ Ï‡a3¸TsùììBŸªŠBÄÏÍjtå…ÍQ½aˆdz¹ë¥özVJõ÷,¾§œYzád‚áy©o¯µ%£g—‘Б­So9ï³IŽ)ú¯&’/øÎ[¶´¨T‘lnmñ<Æã~Ž5©—ÕaØ7*¯&lŸÿî-¨xòªñ3¦õ@^7ÈIU¸òÑÆƒfÓÁÉÞÂÑœür|œ{Åâí cCwëèU®—+®æ¯ áñ¼^çô÷¡Îøarß›½~ëÌÞxA É#>V®V¹ä]‚H–€šÿI׫ӀˆñT‘ãBhÒP38Úâ~1Ñ„ÿ¥&f œ)ýBàFáßýy[½>²YC½ªÐ'+vÊ¥÷½ÛŽ)z”ýÞ0Ó~¤^Ÿ:Ð8?Á&ë''´0Ï?QAžÍe‡\ÐÇŠ©’Z"àM@CëA#÷¨.¯¤Ÿ'öúð/á `›…ú‰V]Íö ?€}C '60÷û¥ªHßðÉ(·O²oÖ¦O4ògÆn^?£ÈÂ`¯0cEBæ95cÆN_îΤ«¨ÓGø”½¸öÛ ’éÞ¨èŠßöÓW–ÑO#Ó½ É"´Î}[ôóç˜l̉¬ò¡µ¶Xd𾨬ûû+õ÷ª`\;tߪïå¢ÒÓ¦jíé8c¾é´î®¾/=š©å`P„k´fw¼Âã&˜A4‘ƒÝšt•mÛoþ–MbÙrmØÛ½L(ÝYÌù)[ªJ‘ó Ç% ŸZê-=·p“wböÎÒ”@ùAŠ©^ƒ”š:Qf+þƒ$§ }ÚL¿¬‘ýëyÍ…sÜo¦‹Wã“÷¸C”¬²ÙpŸ[üsªµÆc@‚ç^5ϯ±qWÙ„,.哾èS@¤Âª¾M2¿q…ÍÈC`5°Åx’’;Þ“çß”úyIUõ`©$øGj ,⢸­‡^±Î¤llÓ†ÄÂq&ÉîÐrDmwÿ)§¬Fª°}M{±@*éÝÇŸbÌõÔ>á¦ýUJÞ2ýê¯'Ye;»Š6 £ÕÉ¿ÄöIˆåî‘rXÄ1ì×#Ô OC)y Í%HÞÝ Aè]f<mÚ*¬N£Êªs?A`+÷ö˜3!åVóN8Q¦üþ*4nÓ±. rúaÄé¹4l¥gߢ¤‰bFJ endstream endobj 96 0 obj << /Length1 1373 /Length2 6090 /Length3 0 /Length 7029 /Filter /FlateDecode >> stream xÚvTlû7%1:¤‘I(½énI ©1 Øcäh”$$¥Q¤¥A@¤$$”.%E@RþÓçyß÷ÿ¼ßwÎ÷³ÝW_×}ý~÷ÿuc3QUg´\ ŠBÄÀò@uCS ,!‹øùÍXOø_Zÿ8ÆFÉÿ/»:ÅâuP,ÞÍêùz!@ˆ´©ÍÐ.X(Ä+<08Êà‹r†c€øÚ@3]àm/8ê/gƒ¿D€_ "ùwº¿£'B þCa04Ò Š D \.O8ð¶–6+„¢œ;B=}Ðøx¨á uÂ;üi ÔR5Bñóý= ƒðÂúˆù <OúÉš(gu4 Ga}¿ûÓ@`à0ü­‚þ¬Õ…öGáþ:» PÎ.¿GpöõY Þ¾p]¿=ð*Àt®p,P ËÈpo <æúÜ<Ð þÇù­Æ÷‚óB{]ð#ÀC.püçõƒ±_xîþ)  3†:Á](À²ãÕp—¿düæ1ˆà]0x ø÷çß';<¶œÑ(ÏÀÿ¸ÿY.HËZ[ÓØBøÏÀÿ6©©¡€8Qq ¨¸ˆ‹eð‡f1†"þîüŸX]” (÷W³ø[úWÃ~o_àobÿ™ËG,(ð€Û‚¥À0üäÿæBþoèþåÿðÿîGË×ÓóUà·ùÿ°B‘ÏÀ¿íx¼úbñØ7Dã€úoWKø_t5„;#|‘ÿmÕÅBñPE¹zþû>Zˆ¸³1 sû *é-~Ì‚£}¿ ( þ/žU0ü£áƒÇãOš–ÔDÁÐοÙ%.% „b0Ð@~ÅxI ˆƒàiè øƒ` H …ÆâC€øñB€.h à÷>%å€ ü³ô[ùGÆ×aýÑä‚ùb0xšý¾‹É8 ‡Àa€éI4ìÖ=÷×÷ÞW«rø‹®)Žñ¯Zf Šâ¦1-¾§4dé‚/s"ç1GªéýtŸ—5Uf¸/p›oÈbšRMšÏ‚ÏRLGW›S#ÌmªÖôpQpŠš«¬_x߉ð n$lÓãÏ÷ö•¥1.d<öï֨驘ý=¹j²öRZŸò¼â£h¢E‚mDé8ÓÓ VR¬(¹Ã^íøáÑCÞð%·^Š0 d+Q¢g³ žt2ôå¹¹¸O;› +ñ!ÇÑ8µ =–O¸²â¹¢q[ß’8‰ÏívÚ¡“K2 ˆÙWÊ}Ä××\nµQ6  D´c«f2ž­]ˆT†UyI­­ŸƒóúÂèvp“\ u¯yÚΟɨ¿y|uI:.\÷:»¢âáÍ4î=̃?n¥ní¶ŒªëÑ jnj-Ã7¡=. ä5¡Ä\žëˆòŽ<€~¸£UOÑ9…sªˆž}eí}6‘½a»HûB@Ð: ûG!ŠýZáX·ò1"÷Ûþ-Ÿ½·ˆ(öÝq;ÑæE}Zèà¡5e†Ð rz-i,˜l%mÕ²ÇÝš²“r1Áþ¾êµSBÖ îsÜZmB‹8½×ß$)¨UrÂè×ðþèI¸1ÕÕ2æ©äv/„GJƒ£ûîÄÞŠc{vm‡f¥… š|ç[­å¥»š‘˃ŽÙö†(ã~ó„)Ò¦’P¾Ý¯t/¨û}5œ™¢§$’LÈ2ÕØlÌ\}%©6rË:JšçGN~å%@¦8>.X-z¤Ë°Œéf7*ñsœo„Œ…¦nήš?¾,½Ê§Ë?té½ðÈX—·FÔ!uxãN€ÇMg@Ï–ÊÜÛñÙF›y=i·ðÝK3Šnª3ÕóCHåéÚx“ÑN“~MsL`x«í÷mÁ6agA8µãÊ!Ìø¥Z®‡½Ð…@qþ¸Îÿí‹ö“›¸.ȧvç!Ð@+LkºFÕm›ä2Í~±áäÏŠ›©üöe- ñ;í ,‚ ­ìO¿}ìé]˜ßÛFî6±¹4±‘]aà4M³:ÎÅÕ› @„G+&ŒIÞsFRéOr!_q¿*ÎÙ;Ÿ¢¶ÿÚ0é§Zó€Öø¥À]áǹµmU¯ JÔÿÃòMÞ3²¾Ó ¥€õΊ¶M©Q’¨´ƒÝëþcö_S©N˜¦º‹§üÒˆF%ED‹"áßߎ5‘+ƒLã–·2•“4j¼áÞôO+9ÉkD òËÈ4·w€|‡Ÿ³™“ …$Ðo«²"­Ç…Á8a#±Ó‹Úð¥áØØ›Šùõ½ºzgœ]»1ê<>^¨Èê|ñHNâTQó|ƽj“HòpÜÆè½8€àå¡~¨D“ò/Âæg;¼oò£Iä*ØoÞ¨^|bHC)òÙ¾éË¡µ“3Õ+~_ö¼: )ÝIªpÇ^ß“˜{(èÎÃÀŸUÏx4‹eiµéŽ ÖzVºë»[ÕbÝ[hÖ߯w™e9&ÛÚÓ²_>9.¶ËåƒöXÝ4VwO›Ñ&S… ä¬ùØœÎ*ê> ¤gíÒÐæ}ÚäÔYsýärNÛ%¬XA¸{]øc—*ñõåc‹ôYJÅ»4Ú_ìŠú¤ä^?© Ax•BÈÎòCyÞ·g{(èìrGáé¸Bót‡ØY—!Nv‡¡½”éíV¢ì»˜å¸WCéÇJ+•´Ü’7ȵ{”1ŶÁÒÙe4û áþ%¬)Ÿ»²Ô„1ãjɰõÙÜ|‰û~€ìÌ…ëožËƒq¾l€k]…#ª×ÈfÝCpÞ–öjå7Ÿ~¸`dµ.&èsC'-»M7š-*ø2œÌtS]meÚôpW×¥Ç>D¤ Þ,O¼Wœni˜ÉïÍÜLÅÕú¼TÜ@ÚFFD¦·ùÒ{Úk»õqO‘ªœm.pf&ûP4ŸJ_Mæ|Eâtjq“AèyÝM⊒éUå•ÕMT›j~#.'·ú1·HócH,.[ó(vKlÒ4i$ÉÖä1¿&ÀDàϘÝè)6<¡« nË›][´Õ$ˆg«Á.7ˆÞÌ“?>ôºØÄn~¡`ŸGoÓ*q¥¿ ™/ëÍŽÚ;*w5WŠeì`Gué³X5ÇZv(ãì"]zN×ï|«šH­œs—¹u€ö·ÿ8äÅñnm³¬•rˆFœ^ɯs:ÝΜ½û]~GçÅ[²qU+¢ÍÍæ´îËÒŸ®y µÞ¥l]5j•k“ï…ÜŸ5Ñ»ÑLê&ܤâ»Òª2#‹ygòWxyÕÂAÔ¶._W}õ`×2[hôóV÷ž¸¥%úØ!‰Ò¤¨¶×…x0;Çõm ·lew¥|CwVïÊs k«‡Ë¼Öæ1¢ŒŒ±‡mÆØd!Ù2U±*fÃÁ[GÃyÈYaÅêŠ;ÝŒ:¤–ùÆ# ûÁgDù^ÈÇ`žæâV g™õºO­l}wïXå•`[^j½o ÁLÔ6Z‡æ½au™©m™à¿ÚuÄ}x_ÛpÁ$t\1Éx`WcØ“`åÀ€ÞÜ«×ú—Þò[¬lÎä©üÎ<{ê×å²yù‰SàPen~ÝÆ€­”¼œ•Å(Ð=žÈ4{Þ•×n—ÈÒ»6gצ¡,e¹9üIÇjl,_øéÆn Onùækw^áÞ¥Þ>ÛÇ“¸ÔÁ´°ÀôõŠt»‘ÚÛÇ%ì³þšðG^äwÎ~œ_ŸëÚÙ8?_Ï×Ö¢[לïèñ©Tï>¸ÖÍ’@)ô­Œ½5;Ðù‚ŽžJ?vøú~á ¸jcSâ˜ØÛ$SL«ÊËJ5£@+ä蔥Z =]H‚¥Òø˜xÐítï5’ÒÒ0ïꨢž\àý_ÝþÐþÏÜ|¥J>kdsÛ‡E¤WÀÕÖ*e'M}eR§åtõ8Ý–¤)"%ÆWÖ#_£GÔß|ÙŠâVWlW;QÞ)zÛÁcK_ èpuè ­;ûé-¦ D¡? gšKßB([Å;}Œúr‚ý ÏmÿEÌJ4>sYo0 ݼ‘jàl3r mù#›^lS²4)Jl§ÙžP¨x„«†y@c:x×F¹fûžÌ½$KÈá *!j ãeÈ€»ÝIÜe^+ãqzþÒo”¸¾3i°ç);\îbGЃ?ôãÓ“ âoÂ*âë¹ç(>sÎÇä?@²2™‘*1uˆ>M˜â NI¢º6´t×B¼:Sø ÝñP«¢‚®B»qî½ï¹3ùEKxÀ_‚ñK^抠©-/WCÉI¡\±Oäw«8ž×¼NK´þĸ\A´V¸Ñ ‚Ewò›ÙïòMâÇS°Gœ'âŸÌgP¡;bÛ•QÀ{méÁ=×÷Xç“~y ¼ÐºDP˲B¹çœÖ'ŠXÜéê®ìVKîƒÝZ&Ó=ß½'ö[vodÄy£_´Åì=È0­Ö›i27KU¥ßÎÙµx/¯Œ~áMUCgiKûëýÕï«ÜyÞñD%,,Æóï± ‡WÝ—k;{MEü^Ê< Õt"ˆìYk²‘bRd?TêÊ>É${¼×3™Ãt\Ä{µÙÍŒÁTµfKI¼{Ž4Šüö„²'-÷œí¨Æ·ÛÑ1‡¾‡Ä’!ܳ½¹¼åTÅŽFm±§`£J²HºfõÕçÓj KŠ•®›ú·i  ShËõíë1㩎z/>±É‰Åôš ”BÈÜÉJ¾{¢2 j~:žºœ 3‡WD²¾˜ ¬ðmŽ×{åî¯1Ì ‘ÛëÓ··”1¸$¨ýØæ¡³!‹é cÙR%0÷’:߯ü:º|‘ªå^4ĵËÕXÿÑéû•:ß Šº³¥;ÎhóF‡JM¾èÒhà(ƒúf„Ó7šº¡‡É¬‚¥¼¾¿àE_È6„ é¤=!¤—×Bâ(„Ù¼©‡Ðé¥ ‚¹nERÕ 9òñ›“êN6 2¹’_q¨|=•Æ9ŸÑÄõÔèÅÁ©kô^LuЉë¶ÛíÜ#n­„ƒ™f&â/WÑÔ¾6³†­$~ê¯ Ì£Ñ#Ì¢–¸{—‹åuŠ=“þGb# >=¦‹¢\±ö‘ê¹/. ‚’~¥ÎeÜÉsmZ¤ Ó™[{w·÷Z§ ~íÇ ·¢p[¬¡<7ã?§as›ƒ¬:®‹YßgA‹Ôh'ß {!‡¤“зYÛ/Ì»|,È6nFd·ÈjêxߨjK«)×q÷ô‚.áö×™n”ŸÇ9”o gÒL«¶vè”t옇Ñî麵j÷#›Ò«¼€3^Œ4×åê±"ÐrØli ÙÔ£Œ‰ç…3îþË€ókbôgÓƒRk”°‹…ÈÁ™-Ïu_‹2–)¾KÔ3 &åCÉ)!’1ôJ6µ6Î~Û…ef‹¾R%à|Ä*\-¼Õ¼JÕ— é#^8ÚUVWÝsª½J`uÿ ½T>&gb°^pÅj¬å¨‘dK’{uÉægÊkÁçe½"KîÆÐøm¨äi¾{£Ò·P¾_ˆø)æ‰ïŽè E¼bVY-F] åã:Áqto/gÐuìxõº¼B3hFÁéõP%”òG`Ðṫ0ÃküœË á§ã³ -ÉÔähÅFéçèWeÏYöOžMÐTq¹Œ:¤&[ov€­tÊù%«… guˆ±þÛ¬À‘„Žä!'žá?ºgÞBCÕŠ.ì`)(œp.ËiøG:¸«ìI4ú¡.#dŽdÙ–™ŽØ­‘ÂbÔ¢X‡p »üaš®A¤Éäyb›àF˜ÑÐPÙ,ór…¾%¸[â°L-äx»”\^ê-eœáVî“å”àãU£f‹ÞŸI›×yç©M>¶ÐªWgäê¶C×Ð?)Á¹$ñK|úFTop€\NSìö„ܳE²}Ô8¹Öé ‹> È…9JÊ*~¨|î"çU†”M•¢³êcu%úF—%¶®í\¸Aó œ›]Uoý*¿$…ÂìHh™çØ$£ƒøÀvše­{E³³áí®6î‚øU³Y$¼œ£“§«ežrX±IX!—ûáÒï|?Fyžj5½`ÍeBªÒEd—}ø†ÍXÜ­ôÉr3RÐê»ßl[ª5 ÿœxZ¸=õJ?g^®Á ¢ƒ1¡Jˆ©Ò±I4B.üЏc?3{—µÊ½gäìÎþK¬mÂÏw#ûÚízQ.žl[«­›ª÷]\” Rêt|åÒKž®É­éuB’» !Æ,Îe>ÃŽÊ’_È%g>²šÔ2>p |mÒS ý|^K-À±ã/kûõ±­Uî²j_[v˜d¶ã»—ÛÁ©~ÑËQ3â6Á‡”¹÷óœ[¤IÄd´š<Ô×@ )=)çì5VxŽv׫¸Sö(ïȪŒÆpîE¿HsŽùöù\£Þá`Û~âwdÑpu‡-¥.F>«CY˜Ú~ÃMUq*ÏäÚk£w Óš‡¨¼’Ó–dÈ™ZõÚ×Ç,#9 Ÿž¬w®‹ÒŽ‘kz¸¯ o~F¢_vzððP³ê¾ÜXÞ­ ¤õlùzh°‘†×‹LsNsiþïg#:0ºó¬{Å~D^ÎŒíU P] ÜÄY,gÊu7û]¡D×höUrz²b;…@îü¥}M墄Ó.¿» _…¡sÝŸ¬À¦Oêã÷–°ëË=yñôQ£ûÞô$ƒŸ%³“ù ew¬ýj:ßéÔ‘6²˜#Ù´1”ÂÊ+Ë¥ûW”–|p{7ê«ÊU¨­‚è©VÎ^ó®0èèkð'øÙ„ZÞNT¾C.Ñ#AlD©u,"Gn„,p—‡Š§¹ƒ|ωÍÜÌÀMÿ’0àf—y¸îšó´·&óí¦)‰£‰¾ì+nÛã½™ôp°Ûaþ+`¸BÕ¥,SÁ}êÀ¨©w¹ØÛ·Æó'[Ñö/z!s÷lïóÐU«·j9íþð44! JãnX*ØÓ}IP-ÛàâGU):=´@Ä?“[|;bLÍüÎ#òYkáv/½3À|ÿk¤W«›DtY¿õý h¡Õ—¼N’Z!3kƒ&5c‡»‘:–$j Ý&®.k@ǽVÎPú²¤­»f‰‚Hˆ½–)~ùÊ¥ì ¶€÷ S½«¾#^öÝ­*y}ýG$—èD® …B*¼^tÞ7JÁ5»äk†Çª¸å/¸Òˆq9:óôÔF1°–=ÇP.­ÒO±û`š$¥ØÌD»,˜úéXž-\:~Ð⥙_mKÆ BôCL1+4:JJù9Êùl7ù"P~g)¢8{ånÈ2¶Éž½˜ñ Nâ‘õŠ4'ÚÈÂøB‚¼‰6R¯M¿ÕîT±.XJ¼Vs09L,ųòƒhnðWý'×qûG.Y›‚í,‘DÍæ¹ÝŸªoà·Š;¸óBËôÂÃ޵=ûôÄ!á &Ãm¨ØeE4†íE³¬¼†„1RTmÐw$u»[3x÷Ÿºtˆ®GBˆ<vMSãŸìß¹R´.ѱ¿ì$CDE%~zßKg·ð?Ç1P endstream endobj 98 0 obj << /Length1 1697 /Length2 9093 /Length3 0 /Length 10188 /Filter /FlateDecode >> stream xÚvUT\Ù-î ¸$‡Â-@p î¤( PHáÁÝàî$A$¸»»<@°Gºûv÷½ï}¼Qcœ:s­¹—ì=ׇŽFEUÌ j –†ÚÂX9Ø€‚ Eu  äb91èè4 0kð? :-°ƒ#j+ø/Ž„Øöd“4=Q¡¶y'k€ƒWƒOpÿ!B’&Î3€"@j vÄ “€Ú¹9@,,aO™þó `18øXþX³;@@&¶E˜%Øæ)#ÈÄ AÀ0·ÿ ÁðÚ³dgwqqa3±qdƒ:Xˆ0²\ 0K€Øìà 6ün dbþ»96 :€†%ÄñO—:Ôæbâ<¬! °­ãÓ"'[3°à)?@]N l¶ý“¬ð'ð×ö8Ø8þ÷×êß ¶,6 6v&¶n[ €9Ä P–V`ƒ¹ÂX&¶f¿‰&֎Чõ&Î&kÓ'ÂÅ›¤ÅT&O=þÕ¡#Èbsds„Xÿî’ýw˜§–²5“€ÚØ€maŽ¿ë“„8€AO;ïÆþ÷¿·…ºØzüƒÍ!¶fæ¿[1s²c×´…Ø;å$ÿb=™0þ±Y€a Èÿt°`{ØdÉþ;‰†›ø'ÇoóS^vP;€ùS+`/ˆ9øéÃÃÑÄ €98½<þíøo„ÁÁ0ƒ€`S°ÄãŸèOf°ùŸøIW€>ðI„àïßßo†O:3ƒÚZ»ýCÿã ÙUÞÊ)jÉ0ÿÝôßnqq¨+Àƒ•`åäâðrðxx^ÿHÅòW!ÿZ*gküYïÓFý§fç¿„Àðל0þ;–ôIÀ`Ã?z7òAOŽÿoÕÿ±äÿ%ößQþ?ôþ¿5I;Y[ÿÁ`øåÿb˜Ø@¬Ýþ≊“‡àÁñ4œf`×?ô `g³…ž–ž:ô˜C0~-/€]â·éÄÇ`—ù <ùLþAüvÓ¿Ç“.ÙÁÿ‚\v‹¿!/çú}3>må?n»å¿ €ò/øÞú_PÀnóäx h÷7ä>¡§{ÌÖlûÇÊñ—õOíýÇÌõ”ÖÞ ›™þ+>Ç“õ_µq<ãø/È `‡ý >m„Ó?ó)‘Ûð¿Žääð”öÇÔ<Óðw!ì aÌMCAB¬j?´\W‹‘»°n suñjþ|t¢æÆˆ´†ß`CøªDò¾„œ;ç’?1SReÀR¤RQ>(†\*’Ïå½€x+*þó@|ÙP²C¶º×J‚X'h £§À.²Ø’ä{nßdiÊ~êÒ‰H á«A }(¯õvví•QÈ©Êò*Еw§ˆ~ùÿP–µöVD™ìk“Zù'cÊ·7ŒÝÐËëa6^=¯hÅ7žšîÇæñ™ ’Á€Õž˜’ë–ð ¶ µsþ²l}û¦ ¾ƒ¥ ,›~眥 ïjN1ÎûÅKa>U¢/a§¯ …’ÒÓGCœŸ/å"• í\DF&™>Nc¥X¡›»øXÊþˆrÏâ+9èóåe8þˆ?Þ4~±…ôQ)ü5QPŽÜË`‰Yí°‹=Ù@±æÆCÒŸÖ±[Ò¼±ïŒêIÑu料ÃVq0z}5äµÊvðŽÀ,˜ÈˆÊ’ÆoMôó(Ž<™GÒvß®MxKIkèó·p4›¸&lÐÏåM ‚ºÇ õN:Ë·+Ý‚êFÇ8˜cKtÜÇê}¨œG¸ ýÅ*H¾¼ŽÃ3…ß!Ì¥úu:!Ï®h§ÁÁ%„ì†|ZïÒà88:Æê™…÷jÖë„{,dpkA©Ä%—c0‹nߌ#™-пÍê™-݇îáê$óuÈKæSx?#Sç\ìWØ^yÒÇ-ÀHW!猕£aã|b#AFÝŽí¶¯áIS]îjü­žº5€•©€æ=ÅBˆgý®n'NŸŠ Ùhw¨Ëe ‚—àù…¸¼¥ ÆH{¼TÂ-ÖvtšÔTT™Â—gEcÿxc[.§v~BÜÅK Ü c} Œ@Ù¦î{cÛâ(²ÖE† ÎM¥œá>T8Ô¡yÉn81ÙËFJG¢Îf6iíø]áeJ[[7ðᘆªl€1ä²0ˆkÕÝâ¹Ïq ­7™Pœf¹C—/ègí¹ÏVr%J‘" zeãá»LO¢ ž½Æ/UC ENœl”Œä$åô >;HNL©ãÃg”÷MbdTŒŠl8†×ujºï&^Y­¸Vâ_&ÝN*I\:o´t‰é‹;uûÏt5ð6Þ9¡Çæ.=2cÀ’ S4|y»ü!çÄ1^w6±€©XÙb³øÈPm’VçZJÒ °„Ñ!H¬Uö3'¯ ½r´+ïUÖÅ"b }6ëÖ9zN…â~WæX(D–oû2Q§ú½- ]„™ªîw¼Ý`uTTòx®ÔÚÜB‘!ÚðPÚɃVáø"ÅA˜=ÞÀ¼ÕfÐ2ÇAhÂliÆöîÙ`ÈóóÚºz `䦣@jry»c_áäù\4G:ó½x߃ŸªÎÆ~Â’AýÛÙNwÞ¯©‘e¡ºGwr¦îsx‰é^lÖ†Õ+©>K`§Á+¿‹:ß5“ãxµaᢇh4§"¦Úlˆ)–*¢ÅeÞº—Zñ=þŵ4_dÑŠ‰ÜKQM 7áàg Hgz 8 í Úw¹E¤(¨?9^ì<Å%ŽS1´Ù-·žÍëô <¬\«_KQ^ü’ZäJššñ’5ož›m`L÷ê€Í]Œ‰lŠ!Á'æÛ¯YgÎnô ¾–fÔ•³†~Çöqi䪜Jîé C^¤Šµèü}ñú’¥¼4÷am½’½ÖA²ê%^¦’x£`úÌ­+ÕÕÃí§-wn”û+Eñ\ûwø"¯ûPV‡Ü%’îט ródºòëÓU}-[þés‹TtÄ:ÿúÃÓÚ®"$ŽÄMÉ!É»3Í/±ÕYçad%MÍÄ>P{³˜Š&}§¯ïOoà·kÿ®!†ŸÎ´ð~ÈH2©f_‚Öù*þeš[¯QáÏÅú~9 ÔXpõôÕ'T5ÙÏòr¼*Ý28­’5ñ‡ýÇ( ]‘Ÿž«•}(W >œGéóã‡5²ì_kf— GÕÝ©h÷ô•¹£$ok5CÏ:Í üD4ö›ϳ’K°¦µ ^BC•Ï 9?¡YÀÓÜ4à½òdw½ñ“:é¬Ãè ¬“/ʽð+æOÍêv8U5ÜÖùä>æž‘?«Î ™Û[älµT¿ŒôQ:7—(¾O*áøÍ©äi¤ ŸÝÇë±ú±`± °;£ÔN×V¹-Ìþø^ßBßXLuâó—T$¾§Íš}Ñþ@¿ìWr‹›r+Ù‡tÌ  Œ½LDþ¸iiOdhì}Ÿ#B&4#Ù@2TÊáÁ Ý_Ü}ͱÎtΕÿòÁÿ{ß8Xn}ObzC(0àZðМ?ûÐù®ý,^ÁòZG§9ËÝc¼y{WT¡Ž”>8¼uó³ñr#3Ý;K~ê}/'ié¶©“TNÊÉS†îõÎàf߸çY㘵5›ä&Ÿ–pöjµ®zýPv›TôqØ•¬‰Ê>ž³>ŸD"‰‚çºÅ´ÚH6¹GÒµŠ=ÚÊˈSek9ùIÏšOW&±‡âš ùô׬±üì´âä’ðãú&ÑÓÑB’B8íE­µ ;UxÕ°´ 9 ‹„ q8ÅZ:oÌ‹;Õý|í™Ù­j$àãJ_i-›â ÓýÑ¿ÇŦ@în ¢*‹£XµÔ/"Dïâä]jZNV˜>EÐÝD°]”±pš­N¬¹¤¬2rc 8Åΰޑê«=4ðºNg×îèŽ=¿ÍZ£pLM/ö‘Èù¸ M°Æ­(E±iù浜$€³_>„D‹€°ipœÇû_k©Õ†åÎîaXxV$Õ¹M9W.­1¢j¯Bæ^x°\«#µÓÌÍ¢!£”gxH6Α§!ïØ™9ýžѺ¥T¦ãUâ†ó”Ä2Rñ~ìë°ÖËÃ+Ø Â>ЉòW]Ãä©Ä+:¿Àrv"Ý–,''“J¢÷½wišLb]ò/•”Š|[/0=ïÉvÔífæëQLJë¦l.ù€dJ¤´(ë-&RomÒdÒBÛ¤»õC®A·Ä¦ù„j\ßã¦zDîÅ­ZŽ2ÖäG`­6’e*%Õ«/ÜámÌ Æä_d+^ç¾÷~àO™š ììþʼ,ßø ¼(øh˜ù~ŽÕL‰è#kë°‡¥˜œpÕ@®¢ì ¾«ˆõ©<¥ó„ì§Õ¢b+ì¤pÛH*ßµ§ô¨žY&ø÷ Õ8üœNˆôa§™±ÚA9ÞsºªfJ"<i˦¡˜sVh!0ïÊ@ åôr¸ßGÇ¡W¶Ä\wë,•Ím< GJÍ9òHã³4M¥ñ+ûd¶Õcã'R[Ó×ð„{µb­äÒ¯À’ѧMIñË‹Žqh‹hU²&­gJºÖÀlp¾×C¹r¤ƒî0²¨‰ÎkÈ×.F„*Éo¹ißú®”!0–§•Ý›ßu‘To¼‡³§…fÚzˆÎ–T‘¾…ÇjŒ…ëŸf ‚ò#!‰~Ä N¡e•Šg¶§‘ûIÆS:ø¦ƒòÛÞp>x¿^`MüŠ˜…E(ÛEìjòÁJýªuÓy --Ú>uʨ§`ÍæzáX»Ï#ÉÀÂ…¯,µÛ}kD*ç']3üŽi$Ž “{cºWky;ô™¦µF¢Ëd4”ˆD¶v«z¯Ó}¹‡?‹#)4 !™*X¡â¡ É€&šÏÁɤØXçþ',jÌ‘*{´é7™ ÚçöC>Ùv‹S(ú@_D½6`ÅýÛÄ~tj¸v^åèÃÀ^n¢ˆîÙü꣟†¹š§5µ²80ÏúÜs#5Û¬•=䆸lö†(³ñjUÉâx¬“k¾¯ýuuO´|d¨ªJá‚`ÿ-eS:ÜÛ(ω˽ûõÃUÆ,?±‚Ë@Œz>fE!®z@Œq› HãÛ¥P,¢– fYT —N—Aœ»_[ghâö|E°€¿t¶×¯žÅè%>:,žw}¡ÎßüÖŒí5³ž¾.ËT·‡„3)\NTá}W*YwÚŸ“„¢¶ÁŒù>y»ò3Þ¿:|ÁËLlFD%ÚLkTFIëB¸*Æ‚Øj\%Ws1¯µI¤z?†H‰*m‘|-¨ª(Ž m»7ß}…^˜x}#-¤`(ãSÁ¡bHýëlzÛʆîì=z Ž~ŽÅÌD‚  B1aÏëó\Eó—*ÌÖqì©¢W<¼núœo:^Nº$b½/C\7 yŠèÓgn<êàzgszôõÔ)˜ÊîÜ0½7×*€|8ìÁ6‡(1.g;ÀÀ*o¹B@¤Z°\øŠ]̓qê‡P'ëYh®õHrÇã݃ Uä¼¶“£œ+iäÛíâÖÖ(ëVB ¾Ï¡}¢ÕÞ¢ÿ~)|âp)DN¡¥bT¸yEæVæÜWhÑ+[q níûŽL~wMöÑ™ZšwyNáè1Ê çÝ<ƒìÒUÔGFT¸²MÓÅŠÙüÈô ¡½B:*¶ä¹¦… 4ª°2ÍëF¹œù’³ø¨±¢LD®]ÜkݘŒ~|ŸQµ©r \婎ã‰meCØ.pà¾03¹$›w!Æ!69ë-œvžLÊ×k½ðD<"íîÇ{UÆ×:Ä„g— ð¡Ë6°–LÉ•´ò?\‹¢ßrô…qÛ£ª~Ž.Õq³ªÑ|`'Hc‹:‘›©¶±ô%ÏLš‰+ÛþÁ-Ïi$7§ºÊu¢ÓMÅÞ|öYw[®q¿Ë6ú’V?<û³Æ;ú·))~ot¥Iäüà Î#z+Õ¯{›‡»Î¨Dƒ×;Z*ûŠÙiê~ÚóÉ…˜,˜üU4Æ‘ZJíËÞMÊoð›ä.î:Ï'pÏ"lµbÊ’r"y3dªi$P3¯v#nwCX9L@(•F{÷³ÞÁ`Ǥ+ù-Jv\쨯´DýiÖĽ}ö3Ç›Uà™Þñ º)5 >ò*åQ„Ü A.of€ïqÄ@ïAú8ÚË àa¥¶økèÜOÉŽY¼9CÑ¡Ã\ƒ(Mäüëg ”ÔLç%êEåSªsü{—÷^üpR‹´WÛøU×^¯÷e°Ò±µëu¨\ÂvÎýšôÚÞÅT?¯Â 'º:9”zí?Fö‰7ú‚ÀoZ]»4šš`·-ùËœx«EU¶ª• mm&¼šó­Ë¸PæÚ™½ÁÌ_µ ò,WÅ Ų¸¥}ƒšZÿ]:Âû]þ€îzKIÓ7êÞ ;d˧ֶ]厴ÚÅ[s>e u†‹Ž':ؾð}¦ãÌé¼|ŸNyXTXnÊÖôÍ“Yw_‚¯wq`€Ø»C¾:ªZäŒftÙoÏÊõ<_™!£ñ ²ÄQ!K!#du³FÿþÙ¸Ö¦P{Ö™Ë(ÑÀ;ÝÂcÎà~”í¼Ä„¦¢+ô¤vÛÅÜ/„dypȶ¼“k©V•ZðÎ0bz²¢rÂVç¶·½¬ozB î™ «ïä<¬©œ„Ü\F¨öé{©¾Sh⛞a!¾/MŽRßXÉAˆ-§ÉxW LëÂpq©È°CIú=Eûš¹×üÓÌø`ìž½å|N ¬.sçÿ9~QP:R§>¢eVŠ{^åüËüG)Ðò€oÐù¯Z«ñ! ÈXWŸótÝkPT(i;9ÅeP¡¤.ZÍ\1x>¢œðPRˆ(™Ö¸K¿ÔòÎ ;ìQÒz鎯ÕXá‹/ürÁÚ §2yà +ô ^ãµo4/fÊHjEšóFÁépÂÚmKqô­­Ž+Ún§¨ŽÕüäW¯÷SÙˆ òEé'=$¢(æ7/Ø‘Û§Ž¥O(¿elðÊ[ß P†öݬ-ÔG…ߺOÆ=ßç›d{ŸŠØ7ÑNmM°ÉϵìÇÂìyY?8Xq¢hea,¶s] ~oã–ÛÛgŸ% ŠÇêéZ*j¥Ô Ï#õ¨DÄùNóerÙîþx ÷¦ÒÆñž«U¼aÜÀ”€c¡´M û¥@üµâO8œÒ!Q”Þl‡xþdQcâŽÌ8j½Ð¡ö$ˆ8õµb„pÍ¿ûÒ…ëSTÒ§a!žÞ„Eô/Z]»7r䲞ÆJŒè᥌®õû&`QÕÃåÜaíŠÅUš¢^)±´…²™Iº×Óï[YD¿2 úõœd`Ëx’ôÈ¿zÓ*ÃoŸ8lä¹õ,—„ôŠÜó{Ø— ׄšnó@úI'ïæI×~-£ò˜Ïs.õJ›³h+$Sôž.&ì­æŸØŽ©ã»!îßQ©]cgÙ|úEÄɰ¬5O¿©å²³ñƒ\r?–|ä¨\øXÂYZ"˜¯÷`ÄWù–+8ö!goõÖÀÅhÔ»¾qx·NŘð•<\_®cG¤›D6ÂòH½ŸÅ!ï‚*q›èó™õ2ížæ!ïá°µ•ôfñVéùí ­.û7MâDíµ3ïŠ[ý58p§Ú—w6xzcàZ|µ›k{cœncD¸ùÃlËÑž}=˜hô^°Q{‘ o#&1-4g@ͰǞãÁ GâFƒ|~<,¨¿R;بmü1Éë*L ,Haù6i3WCf„å:*‘»Qã7ëò_NNH %L¼uâcweè´{ÆZ¿»èqÊÅòâfÀ„@Ôá7C@K`äs ì‹ñ»¯£èb} “Ia޾˜´ vÞpþI–‹¶³ŽVâ!¹‹¥ÜŸsHšÌ£¨Ârg+ïK„¼¸ è¡ ©¸ªƒ’)†é‡<Ú<·g ±²†i~Ì/qá¼5h±:¯°~=¡n;7Z¯w¹ØõT%H|ܵžEǰíW‘²-Ó¤g¹»ºX‚ºK‹µÆÆ1ÏS´íz“/¬š®çi,Š!Ö;½¦p¹îƒG=Ó'Ï•WÓ¦¥á¢ywC]Ø.åLR–ÕÇgæ>Á1cUmx\V²ÈB–.b8ÌCÛ§œý߬«‘ã)¸ö}ß#CBŒ<7âݾöš>mÌ8ª}X12Bå¿S*ç*¬ù`SÇ“ôÙç¼e3þ¹™ù%¯±÷h¥Ðà‰ä¤@h¿Lô&Ø©·1Sìᓃ ö:‹[6·òRã|U|6æÌõËõÖºyãõ5§—iáÞß“sF>¦=¦æyÙÀñ¥±)ÞÎ’ýkÚHy„¹ÚãƸWcŽqX™{3% [ž¿W‰‰2d ‹{ýè}Æš˜„‰èýÙ×ñ©È_¬™õÏÉ…^sηqs0Ùå~½*y9ßìa…ºóÝìk•u~›vûÛ‡6¥-ŒÂKÈirÎ<$ óÐG´¹.˜:¨ÁJ¢Åª !|,ÓíR†rÔ zs¤NÂãKX#‹ÜˉÙÐéwƒ²}ÒFk á+¶é¨Ø!Ÿ'ýÙÃPH:¶!ÿ0Ÿ‰!¸™†;3}ƒÃíÞÖ]›@J™EL‚Ã[NÂ3th):³È¬Šêت}[+DòRàœùÍ¥1F,Ë.%â ;räNt(JöèÙÉʼn¶>Óí¼AÆSÛ_PÊÚC?¢£ÓΡÓNŽLCħ$éÓ?ÈŸ¹g÷&k›ÍÏŠ¶åÕ¼[÷"ä”0v™2ç~ð5p.AëQ ´œ~D,(0ÈCsÐ\Žá(séMâ ÿW¥‰¤Ûî`¬êd’ÞêêôÛ.È i#:¡·p¯Ù²²ãDh»î$¿Q#ÌáÁ”Mv~dÕ÷Ŧ^YÀ_ÕÐNHMH4Yò…ŒowÞ8 !Ež7L;IÛÿpÐBýºhô¼:¹ endstream endobj 100 0 obj << /Length1 1379 /Length2 5903 /Length3 0 /Length 6850 /Filter /FlateDecode >> stream xÚxTSÛº5"½wÒkÒ¥÷Þ›H !@H„R¥IoÒ¤)ÒQª€té Ò¤+"è‹Ͻ÷Üÿ㽑1’½¾o~m­9÷Þ#ÜF¦ÂÊN(G¨ ‰‰eªú¦Ö ň¹¹Íàôo;1·Ô G!eÿ¡ê c°650 ÔG!:^H’”IÉ1 Pæo ÊS ö†;ôE:($MÌ­Šòðó„;»`°uþ¾ðAø )¡ßáew¨'FôÁ¨;¶"Œ˜¢ p(Æï)øî¸`0²¢¢>>>"`w´ÊÓY_àǸL h¨§7Ô ðkd€Øúg4bn€™ ý—ÃÃø€=¡¬‡@‘hlˆÒ ê ÀV˜jë = È¿Àz„6ý+ÝŸè_‰àÈßÁ`åîFúÁ‘Îjè‰`|1B0ÒéŒ@£°ñ`o0vÄ~·h(ÀØ ÿ̇†xÂ=0h4ñkFÑ_i°Û¬ŽtRE¹»C‘4ñ¯þÔàžPvßýDÿ®åƒ ø{ƒ#`¿Æpòò5GÂï{AµÕþ`°&âÛœ¡€PFRR€Þ@}!.¢¿ ˜ùy@;›±3x <0ìÐ 8 Šý!@ƒ½¡Œ§4(à?ÿ\ƒ@'8p„:ÑÄÿÎŽ5Ca­±çï ÷رô€¿>ÿº²Å2Ì …DøýþûˆE­Ôt,5TÿŒü/§Š Ê ,&–‘@ $@JJôÏþ#V Cdþj»O·ìý‡|Âøg.–¹Pß¿‰~(„`¿@ÿgºÿùÿ±üW–ÿ•èÿÝ‘†ñÛÏ÷àÿñƒÝá¿?,s½0X裰Z@þ7Ôú—tõ¡Np/÷ÿöjcÀX5(#±ŒÝÞþËGkÀ}¡NFp Äå/Öüe7ÿ¥7 5B¡á¿î0Ø( ð¿|X‘Aܰw4–š¿]P¬†þYW A9ý›˜„$ìé ö#Æž5v%aUéõýMf€¨…Á†°3`(Oâ_ JDÁž¿¬ÄÿÈ ñòôÄÊì7°eÿ^ÿÖ4ê …/Ì¢ r®Ï#:Îë”™}„7G VV»b’¬û£%0æ{ïUnèr†VG½]åP¸pèÛñ+g(›ŠÉy\êqÌ:åçdcVr|ÞTËÙˇR=â[Ï>_u¡·îÊìÜ¥§̘xåü®=ÜGÖ\«˜aë{ Tž6™^fÚæãW¸à g*qŒßüÖm²†ß¿;ÐÿXü¨H··V²&’š‘Æ_‡#$e‘69Wç‡GEâTµ"=‰“±Ä=’gÏAjùûtÑ@{ò ¸W“³jèMÃoš½P³òù=ËG,ö9fßDIZRb\„ês©p×:áœg~®GôâÓ±º–~êO£ÊÊϬõp›ã„‹Û}œ`8wˆÏN‰Ù¦Ë#¤?³Z˜~+A´õ핲ãÈÊ"ëÄ™7EVFê‡zWbëöb­7kZ+PZéÄ zß)Fš¡]Þî/ÆÀvéùé…¥;«I¶zÚQéAVkâ4îÉwž´õL»ÆOº{Áz”¸&. glùŽ_Jkƃ£¤ªç¶€Ò’¥>¢oØ *\6Ϋ¿wÀÞt†Pd,Gs~ª± 6©þh[é¹Añ^¡[i84•À¡}3îùôóï[ _M(Øc¦-岺ß|ÉôRâ»U‰xSF=}ÓüIn@àúׯÆA`ñMr^z×±´/~53añ&EËR¹¼§fM®cÑbyâ©jÛ0M¸ªáñ’w[þ~ŠbOC»\Zn½üÈ;¡ˆõ²ª®{œUßšÓ³é'M®{›¨¦Ï—à竹3’M+Ù åÒä’wºQÑÅ;Â[ÊÚçFv¸• Y> ÙÔ¥NÚCZþn|3ñpßïIl±C¡û¦ÃæFÚ °Ý±ŠQ4ÓC’O£Öµ…¢ûÞ¯Çm [¿Ï³µèq*íei…G¦RÝY6âMÐy:²ì<#4ÀÕÈéb^¦¯xÒ°§¸šê!0!åM6G/¿dB­k’§*¤HØŠ§Ç˜m6HÃÚ"L~Æ¥Qá­†ü¤Õ@©éSÜdoDh’_¤˜ø?¥>>†íDMØQª¹¼;¹³Q•µ¦’>²;tñr`!-ãU=ö[^«³|6ýLÉÂ&Zd’ºÏÎøñšnôåm7CyúƒUJ³æ€”òw¡÷F(õGËôÝpßf IÝdzYä Ø?»x16¿=}Õf7Çõ‚'nóøÈ–R‘ž¸ñÝÊñJ4imÍŽ?›Ãl³/LzŒ»Zýia¢a•.´Ó”³P.q;ýÒËÇ4†XYâ(KREžr©È¹”e¶NT“•X?ÞÁùpò¬‚ÚV”`T88( zr`H©`:CðK6œìÚU<æZZoœþ0PIjP†óÙ…ý­rç0€Ó:·jPL¶±Ym±¸16Þ ®È¶=ÙVœ"Á=8rÄ"R3]($“F{÷Ø—˜ì¼iI2Øáp{œÝx•Ä|Öê)yÖñJ®¤ánÆv÷À†÷<›Œ‰e]“VŠŸ‡“ÚÐÜ: Õ•ñ”;!{ha[ý>ÇÑ_SU‘“;,ú¾Ä‡c»>cT2~¤ÄÄh›ëã‹VÙŸoù‡:ÔoÍo—8ñV÷nv3 ·6“¼ÃeîpIŠZèfŽ›GOâ>ò°öî%S_‘™ôøË“…xÈÈqÓ8Šf·:6GO«äm›î»“ãæ|þ̯„÷óç– Ö~éý£í%9׈©íõßÄ]9+5©,®˜yOrÇë'N+0¦åCÅäNŠïë­hñ©ù­Ãö¹X6Y¿<И¿³­Ô±ãÖ°ÔK¸brÀ·83n'6ÏMÄU¾¼Úwhlj#ßAº‡£¦_ïWÜf4Þl£­‰(ôË£LM\ôf§ú,ø ©¸€­/M½ ’ðöù^ŠþÀÞœhÍ)+Ýfþ!Þ¥4;rÁHµqÇÛàÓ§¦dIé>é'‚|Û&P¡2}Ò˸4ÁÀ­:¾V‹™/+±šåÕ©0]³%ÿ²gýüwMÎÞÊÛ#‘Vú€R¾n†ÞôúÈÏŒþ¢ïšü§ôzïF¶Æ¨]c¸-Lþm¨~àÑËt×ô¢åXyp5ªš(ºáõ*ã|‹òFZë«N ¢«~LëªÐÇ,Ô=¦_ÄúÐ(F ñ Z‘X +íÂñq[Œb`;×ñK•'Â9ã'z?‡qYç„6VõZ(»©¨bü·¤ú»Kœ~ºú™eLJö6Y¸~|¼Êx¿ì³ê0còqòçù—mÙ×dü¯·ošE«.‹öa´%÷gF^/C± <–‰ðŸÑ~Tˆr­5?Ð=¥öu-l¹!D0z.誛}þ…¤W;¡¦÷Ùø.žxèY³‘0uÒqÔÉ{gºs…*¼='‹+ P—¸õØ)êK1*!#ÀVµRëžÆ gމh§¨6œéë®±o… ¾‡Œ–ŒÖ Ž¤ûu}ŒßÇ{ä €ì¨ÉÂDfc£óÆzöêIô,bœ¼þyyîNJƒ‘ÚrÓì‹p–:$µWØ?3~g fÚðxyÚŸÀ6LHˆNÁ•ð± OÄc™}Æÿå#K‘YáNé©H· È­ªêM¬ëûàª""f$П¾Róë*ûý˜‰{à Kãnÿˆiç­óVÅLE=âm?`_×Süé[1ý6©·ŠYÃÕn©¿ Kñð¨Õ¨*ÿZ¿œéýÙÓpÚi )…¼YL9…“ ¨eÞ·’ýÚµ¥0Ø‘-+0º¬Ç çí•Iá§¸Ê ²ж£nðO,*§8÷Öé ì†Zéöà.Y4óú/Ü=~£ÌºÈùétüfÃŒYGeoVÒ’ÞØ ™ÎÞç£;5xù•Mé¡,úNÞ»±Ž/4ËæQ98·¾IXDìÁ&Ícwï…]NÊÿŒËƾÏôHõl£³e¾”±%ml¦ ³ :{(‡Õ ½’t­“ T “Êù:C’ò9£¶éñ< E°ÈލF93óPë°(c’»Ú‹+ÂÉâ%qabì&3 yݘu÷8ú¤…jTª«_Ëýi¸«<,^¶fL»Ó­Âfqò€ëPF½¨.ÉUžø‘­" j;/Àçz­=¹„øY‰Æ'çéî†Ûy*YÛ9ûÊåUT«÷Ÿ޳¯¼\ž¼ÝDËUœ4ñ ôÌÆðöFõ±Ð¬iäÉzÇu–'žÅe6Éï_y;| éhªÿOÒì{¦Éõ³€9¢dw\$¨°uìæ›´åôïÆ»4F³Ò uõÙÉaò 5¯`ôרF:+ED·|úbL¤Ûø”eû“BZ:•z x´Ý翪`ÅñÚ=úeXi AGfù“sÊBUkûò ]`\Í¢ᢵXÝraÂäžú»q¹¹qÙÞÞ«¥Å?„ÀZ /j)ÚUñ-3”ŽFŽ¿‹ç>ö`G×>I5þ˜ƒï¸ZN+êq|­éø ‹Yêý.Ii|û3Ê”)ÝÈ=jã·„?‹ÜuxüåîÌt焺­ÛÀ¥ÞŒÓ5îå>ýÂ+@wuß*Äìòs‡y&ÎíH”H±BÌ‘?dvÒZ{¾ºVtîw‹o½Ö{1 ’™¢Œ£Ã˜-Wȃ^ñm=m©T VÏx>ú¬¾òÙ3¹èl¨Ëoü”ë‚ë¹< Ó‡°¹\Å]'%q?…­x%SÙî Ë ·€~K/SÖNI¾œªÓÓÕÌëCžŒu ׫ J&ŠîhÈC4+&ý@“÷lMõ^F›?~ ÿ)Á\{ölÊ"þú¾Ö‹œ’¦›úúmÄM ¤÷¼yšk‡ÏTW6Å pšõî¢|ÌŒ¼’éÐmãuçFù…ój* Í=®×øj~nÄÙ®;)XÕ1eÝ•¢VVñ¥ŸÁ˜™³õåœÝe^QñYk 'Å!ž}ý$ç0C»õQy‚HK¶ñÙ“Uk-VGPjÓZ»Ö`@‹Oø ‰õd6#™ñ.ò·Zj GLŠG„~“[iŒ–¹5äÛÃzT¢NN 5uç\4Ú´àkÛïF‡¨šÑù/OÁnlݸ3‘wzÍá6ö©¬šÕáí¸Z}Ïådrƒ€<Œp1ø^y嚘¬|ŒòÒ‘Ï ¦Øm<ò^Ýí> Ö]² ÈÕŸ^WœKŒ¯Ð?²ý&kÉ(GCéÍžô"óºÕšÜõö”1eVÔ‰"F«ÚrŠfÅÑ‘›/Ðtûx§æ¶ÏÂSä'­bܼJ‘h|â¢Qð“¯XuTÅëz`GÚ‰égVö¬/Dð6Ÿ÷—¦__»wr6_0Ģл^h”Ê#…ÁãžziúËé:ß^<žŒg“{áÅÏ¹Ó wñÎ4=£Ç»säðò«êƒÅnðvÑ NIs‘: Âî‰à;]ãé #çðtÕ¤ü^èôÎòA¸/JÇvu®’ãÏ¥¤á{‘ Gù!˜½‘` ÊÃ"‹µ‘ŠÁjÊ’Õ5//Y¥bÌÑaÙÏf+ü¶6‡ûR Í âT%.5=×Ì ú($Þp%F=Žã ¬KlêŽ%zþ^³rc^:ÿñ.ia-¾÷æ Ÿ+=¦,|}@úe¼ùå Çv̶ß÷%ÃCÃùd¦hw2‘¸§ 5‡7Llºè'2Qw\o}$úÁ¶Õת¡ž'{)ÄN~øðž~pd–OvšX¯xú0rúnÖm6Ýhç(üŠþí➊-rj¥¸\³ê4À /ø”“{@7ÐÁX7èCÑëõ#/µÈÜÔ² cž«>i‘«Ù²ö-G&oˆ`°z· "ÉDi4BæÄªÕHaé|rC[cKV±“6ŸD`jn8 sSu·)ùPe(¥êfyáVRTщ;bUËþük)].9mÏó²çsKÒz('×%ô™8E”IÖ-f¦/“^«t'ZAu©úCƒ ¢,§8é€~Û£8÷Ö<Ñ(Æ›_(òÛçhKœ˜¼YãFXgœþ`÷AyPŸìdqd©÷åIi(¢Æû\ÈeÖŽj8s^9§ªÄæÅõ/}J8‘S±3N4¬HÿÖ- rS¼!Ü ÙŽÇõbE{€l÷g½!ô‡Ã[böL®—+aAÂ2´Æ¢}%›ú Ð|ÅùWƒC»SuMר(ö]6ðlcK»o\í´ïVÙïŠÝ™<ÍħØÇ°ôTÖÙŒçÖG3êþ¨0T*æÖOÖ[Þ!Å”6Í{„GÎÜcju\Ÿì=ҷРJütÓÞ³”Q€eU¼PLœ÷5Ÿˆc¢š«~¶ºVF–ör–5~<ù”4K\08dC;­ëR€›`MEÛÀ?’r£]ù‘z‹;˜P+åŽPµïXà ºí{P¢•GC—r}#jþúèKÙÍÖ»’ qÜ…–']L…-ïR%’áé0ð¾¨;–/ßxçc°™×FTÊÆpJ¬mDøôÚOĨc9t—Åc&F8í6'¿9ßÿ!¬‡©ðÉypÊÿ†AæDrÜ4Ñ3ª#{¡ë±7 ¿}Ùs &*óHÉ hY)×–¤WÍнRÅõ©Ës§!¬z7lú–ë™ñw¶IU½“¢ãä:ßLŸºJYj´,ç\ç!}À±¡žª0Ø,ç€OÞOâýûœ}±ÖÌæ2K`û9 ŠË©ùØœÉ5~¥Š Â/öãí;#ëådœLçu×Ïžæ¹™gjåSGÁ­W†‘¶óˆZß¼’>Gë’VÏU)ºÕtÙ _EÁrøœ•|la¥Y#=6»Áöâ@ßvØìȕŽ«o ®æxOÕ²4‹]ó&!ö¿Ø4kY¾.¼§q¼ušsÍ&ÇßowýÕÈnŒ‡g¹›>É %¥(ÏË'â陈ÞáŒéÙÇ>nÖÐþmQ“Áóå…—•œ bM^Ä™êЉsÁ¾…:tÙÝ#^&"šúÖ²¯™¶£Ÿ3Ö™"¨ \ûOIŒLþ„ÞŒ8Ë!k¸E¨uýïÐÆFl]®ŸÑ©ï ­C-Ħ(åõéQÔü4¡:A‹ŲSLæ b“- C è¹×©œäÝÆ–mO ¯¾N&ß0ôÿÞ&i9v…¤UYó\®¼›Ÿ§NÜߕߓ¢J³fÈj<=}¸+¤,Ö^шMÍU¼|›µJj F‹4l=7kkLÊ$ýmV”7c›búÀ¹í¾`«v¾öijòÈÛé½/¦oƒÏEHm9/‡¦Ç¾¼gÛ›xÔï õj¦ƒà΂¥" ßI.¤êK3O>Îë*å<í^7Êúó¤Ÿoã§ðþ‰î¾øÒiá·“j¼:¿¼™$ç¦T×ï~ÛIYD ^äe€~¬£:Ê;—¯Üt“LXíqµÂS»:ý6@ û\¿$÷ÍÉ1´§ð\øÊ{‡`Ôa1Ýz¤ºz©©ˆá NßÂïå§Ä…ãÁ îµ…×Õø€IŸ¾£]w¹ëÞ5B|R¡IãaJq™4TC-âvtàœ4HpX¥ßò„¸.Z" V‡}óKØîÝð¼!¯^PüÃ0Œž$‚6·B6!Í;ÞèÌùE«¿¨ƒD mi ûÅk×ÕòòÿlE® endstream endobj 102 0 obj << /Length1 1908 /Length2 14793 /Length3 0 /Length 15975 /Filter /FlateDecode >> stream xÚ÷PœÛò‡ ãînÁÝ%¸»;„à0¸3¸{pO‚{pw·àîî îzÙrÎÞçÿ}U÷ÖT1ïÓ«»×¯×Û½¦ $UVc1µ7JÚÛY™Xxb ê2¬,v&6JJuK ð?vJM “³¥½ï¿<Äœ€F w›¸èÝQÁÞ ëb`e°rñ²~äea°±°ðüÇÑÞ‰ näji P`ÈÚÛ(Åì<œ,Í-@ïûüç@cB `åáùÈðg8@ÄèdibdP0Ymßw41²¨Ù›XAÿ“‚†ßràefvssc2²uf²w2¤e¸Y‚,ª@g “+ÐðGÉE#[àߥ1!PÔ-,ÿZP³7¹9ïK ó{ˆ‹)Ð ð¾;@MF ä´ûËYþ/À߇`ebýoº¿£ÿHdi÷g°‘‰‰½­ƒ‘‡¥9ÀÌÒP’”g¹ƒFv¦8Ù8ۿǹYÚ¿;ü)Ý )¢0z¯ðïúœMœ,@ÎLΖ6ÔÈüGš÷c–°3³·µÚœþÐ'né4y?wæ¿_®µ½›×ÈÌÒÎÔì2L]˜5ì,]€2âû¼›þ±™ANn6nÐt7±`þcuàŸ‹¬˜ßkðñr°w˜½—ô±4¾!x9¹ ' ×¿þ—XY¦–& €1ÐÜÒáŸìïf Ù_üþþ,ÝŸYÞÛÀòÇç¿OzïfjogãñûŸ¯˜YEGFDC”þï’ÿ»(*jïðbdç0²q²XYÙ8ß|þ7²‘åß:þ+cgfàùKîû9ýG²ëß=@ó÷€Ðþ7—¢ý{ç4ÿ4º. '‹ÉûÖÿÏíþgÈÿ¿.ÿ#Ëÿk£ÿ_E’.66®Óüåðÿ³ndkiãñ·Ç{纀ާ@Áþ}ìþ¯«ð¯ÑUšZºØþßUÑû4ˆØ™¿w4#+ Ç_vKgIKw ©²%ÈÄ⯮ùË®ñǼÙXÚ•í-ÿ¸aÞ£XXþÏÚû™X¿ß"Îï­ùçð}†þw_ ;{Ó?†“ `äädäðþ®ß‰àÅú>•¦@÷?›ÀÌdgz¼×è0³wBøãÅrq˜Eþ0ýE\fшÀ,þñ˜%þKYÌ’ÿ+€Yêb0KÿCï9åÿ¡f…è}Åÿ÷{œê?Ä`Vû‡8Ìêÿ%ž÷,FÿÐ{ãè]§É‰ã=îýF²ýÇûSf6ý¾kþ ßE˜ý ßU˜ÿ ßÓYü ßOÏò_ø.Äæ_ø®Äö|ŸMf»áû¾öÿÂ÷}þ‘ý~hïCbÿ/¡ï?:ÌŽÿÂw)NÿÂw)ÎÿÂ÷ áû¹ü ß…ºþ ß…ºýƒlïÊ<þÄÿi5'§÷{÷Ï;á½ÿÃ^ò@ ;ÐaiÞÞ„/ت&¸í¾J„Ðqoœ¹ÿ2âNkWßõ@%PŒÿáŠ=/rQ¤kv?òaã„­è­ÑZ‡ÅZÃ;%’g©® ÚÌx‡Á{CàñÄYÞ…m_®³SÇÝÎÔç¬IuÐíZx†—Áñbo.ýHŠŸª©â®Üâ –ºáÄxt$,77;Dp»Hz{…hµÈÌl‡ …ó¥ðøïÄ’G)}#lœÛýË% à–[)„ÇÇÈr×éÇ‚ß{¸ä '3”»=xOq4×mÁ4ÆÎ£jBä|2»“—Ò—»Ñ2ªæMÒ›}ß Å6ãÈÎ7áE²Ü©·õùè:Å‹Z"–’Õ <Ù9©KzJK¥0$á.ÂKNý ®aÊB—󖯚JÐWwNΘI)`IÃlPV»òZ`2‰ rбdmÿ°ã§– kµ`c°8ªÖÈoëE•F¤$E¸x">!ÔÌ'òæš8•â±ÌÁþ6úÄÜFÍÜ<ˆ‘À|V}Š?Ðkú˜m?ÏzÕÿSk$Ò@êËÏy„žðÌj#$Wy2#HµÇ¯ŒE…x¹æ a> ËÖ-a/|ªäâÉO37†á2AÞ+¹ÎèS–f3/Í;D#azoÁµü_ð<Ÿ«Y¾¥}µÉ8×úöòA£zÔ,>±Ôg"Ç1Zß„!D¸,ÙëKíWïÙ†P„¬ZgMÉÏZ×ФÚkËZ2Š‹¥(„ÜT’,Í%•x¡°µC86°ËÒ2v®—|ð¢‘qCŒß¼š6°mâò¼¯<7{½Õäc E°fLÆ—3ƒ¥;~­ÈRÄ3H'Å¿vrfÉäHò1–³JRF2)ºŠµt‡ç*Ù+¿é ±ø~JqÀ aaà³èÐPŒÍi»ÐiE9GŸ(C½.ÙUÀ[h¿jð0õ‘|Ô˜æ„ðò…UHñ<îGìTßBM¾±ú‘,äûóéÃV*Œ>œ¼EyÅ'ŽÚàìUǃˆrÃ=ªêÍù/E~€?ÂÖÎäÁ¡˜Z„Š;™ Tâò†¯¢Ey%Ë™ár˜xùÞ&}XŒãéŲ_<óÅ­v}vQºX ’›Ži•%ûYfdÊ>= çŠ7S’êÝiŒá¢ÔçRl÷‰E"gª†xŽ”pt ×”‰/Y¨pž y²ì’"”'ÂqÖÙ1Ó$›WÓ¦Ìþ¥z™æW?ÙFn~ðë>…Sn$ÚMhÑaqºÈàlPM¯›æÉÀç›iUµJõ¾=èAw³³‘Ü@_gBk¢@ÔO©ùú+ÝWÔ#R%¾Ylj;K‰ÕîP Æ÷}#›²8må«Ñüø£Â‚<;™œ0V}b""„%/Nlž1Û¢ªúž»â£`âcØsù5>ÿ% Eª¸R—ÙbÊÎIoÞ½–‡<Ã×Ê'~²â!k÷'"ò@ç­iñ¤æ–^ECqÞ§"ÁsºÂ¨Žñ4ˆ C^sBóÔü#Xâæ×A²fòpqº Š’¶tŒmÝ@X¾š—Y\†ŠˆÛ5óÅÔËl†ùo-©y` \\œ¼1BjþhNäl7`à!ðè1ôWz¿;ú†]qÊBk¢6Nv¿j è!i àrûŽŽïnEcV.ï9ÂÈ ý9ø>\át6óY-îȽÒß/6ÛgF”Òz$0éócÂMg½Íê›+Úhò^K#®>Òäc=’LYQ0Å=ÄcŠ­à Nß›:í¢w}ÊñìaO'Ð'#¡yZ+ñH(*©\yt. uÆUpsÁÊÝßÏ>;šäj|o<ñYø©¼2"Cýª*a±Ú2ùDLÔênGêpšçcÙÚeã(MŸ Áöxƒòµ®fYDiÂ&1˜­P™Ožøƒô¹•p$Õ¹‹Ä> ¬åItùtd´+÷ÁÜï¯ÏZ;³Â’žÙïVí%³Ë<ÆGÉqïE@ï'¢ë%^¨J2j3Û+7@ û(u¯µø˜YÿÛŒ©¦(Üg£!ô|YÏÚ&é$–X—Œ]lÿêIµÆû(æO†°Ôæ´œXÃ%G¼ºU¨YŸ’œ¤ÚI“›=<ÕsN½à&‡uFõæž%öøß)„¿èq#æ–e©4H\+_×]hYÔý[k÷Ô“DÖYÌéô\©=Ü—÷&“¨róÝOïk/8ª`©`§r¸r áPáuûîÖ~Mo'6ëëÚy;²ˬ äýfTË€ìH¢ ‹ÿ û´]à¼WÓ}>1Q‰ã‹k:Ò…ÔßãðCÀnXFœæ)~W@°ËïhÊ6Ü|É3G‘óù <A>ÊôÃ3Ùo0T¬+3¿Â,®JZUÊaã5î%«âì .ØÛ3ì´zG¸ F1ä1ç¯r³oâå—õºeªì¸Cئ‚¤ŸVÆcNxZ¾¨ÔÀŒ'3kΙÖnU€Ã­õпŠ¬B`W>háSÉ\œ®ÉÜ8dˆÜbZÐ5z´ «zÑ /o Pó«Ð5¬‹´Øæ¥¨ö¢AÖ?è-4ù)Š ÔÍ åO\^ ®M1Vþü ¥àG.QòýO–\Îd;’–b×rÁX:RS2 ø³C=ĨïæÙD§Ó-Ÿ,_sêÔ—MY¶úãi=&Ö¸0j`n5ËÁ˜nÑ1†B;ˆ—(6À¼k£¿ÿP’Þ6ðØ)‰}§¦˜ Ò–#tQ…”'ɆžG; )*èå߃ŠU¶EËøi´Ù}íü\nÌ3Ü´þ ¨ZìÜ GÉ"G°y6À´Óó˘û§znŠ˜Wƒ2¶ËoD(J2„Žþ4VŒ±Ÿ‹-è×úrè2+žÍEYK»f[5Î8`ÔÅ)’–nRTlÃÆøâüÚ±¨7“Òãw®³3—ˆ‚Úß8B/ñûf©¶È@z®ì—CŽ9Í=q@ëMcb¶¿óf[i«pVÇ—ÖRe6ï5#î_C¾_FF­k”·n9ì~œ„¡ý"ÚØCÇŽ†¿J)pM›»ŠF»*ÚXã¾×àüÜl0ƒrŒØ=E{t „°Þzä}{ibF3n„@ÿÁó‚ë3"i9ßYÎrgrиk—«ºÔ%sûÅ¡ÎÃRMhÔ“Ó˜X«fêxù¼¶ŒxCVÉÕäŠÙÊO´=sR±]\œäâ´5êhMP¼v*¨ð*O´véžv»ý¸me¾r¶jÛ4O-¸+qëUœn‚ ö‘\5ÕæƒkŽŽ8u‹Ø?§l1R(2éÍö;aÎ=%º06&ö“£ÇNKcs\/53CW Œ Fë6„†"C°;Ä’G]°gŽ¥v‹>@„+Ó§ÓÂÌM2ª)*Hÿnßpñ±õ%9 Õæ” Ÿ¶Ž ˆùˆD¿Xr×aþš—öñå-ø¸ƒ´Æ¼ÙŸÚ¬Wȱ֭5´.—«3÷º»¡‚ž‚Èfà'{¡ÝþôÁóûCŸgädg44ìþJJVÒä|°ì†ªÚP-2—‰g@’íµ‘ªkÑÆŽÓós¦°X ¢~F#2¨aëMUŸåGhä˜ãÌk®Õ\´ö‰ln£ðîLÜìžtsCÀ;2¡Xer‡÷ù"‘¦þsD¯o‘z´³+±•_Êp¢u©2¢9Ñó9^­Ì<êÕmœžqvCw²ç1I"’ú…fñºÕØéŠÎFýuìÚ‡7?LÎíŽÆBPð܈ŠãhÅ凜i)k“ñÛ­S¯ü xïBÕ–ˆyp4ÄCÜ~=,W1‹CŠ~TÎAînnûcTÖ‘û|”ª’Áððµa¥A$W!¡ÈoIÙ­s;ÍñšÖÎ6®ÆëyàÜCÞ5ƒ½ºí”^çÓEµ‚TTžD2°Øé7U(Zšíj–"Ñgšyôk`3 ƒâ> Hm7R7χ@3yoÔ~ýoÚM{´È } ÃÛÆ’Æ£U׌]ÂÓgþfèrmµôέ9âžÙlÎ}ÐE¯ ÇôÝG~á{¼‚"v~êÌóKMTÚo1³Ck9+ê1 ÂêA!|n¥ˆ¯wųøY§U%žƒm3…›8ÇžÀ¹;8È5ëÏó£ÝiÃ9C ܯ·?ÑQ&"71¤—¤ôÓ™©ApZoZ/SÃÏã.DœtÆ}°x<ÏŠÛCÑuT³•>Ëätp«óC˜½ëÅ ´ÙÒýgG´pºHÝD¾ý"´¢VWàV› Ž®h·Væ6Ã/m*=¼*쩃±ùË1×otÊuê" n|ˆ¦ø6»4±°ø»Z^M™³GR`6¼Ÿ”|è=´8–8k^ c X1¯Ñ„y³ÊKS”Qž¸¢«!òÜmÊ/l€;\·Vqް¥̧½>Îé z…P°=ûZoÙÿÚ.ûea±ZïÄÍÒ¶û°W~¤0çvËä‡BãT¶µ`‚´L9²Ð™È ²ÚàéøÓ9s>Öªô9¥ôœYx¢žŸYÈø¾Âž¶=UTä?žœa.µ^ŠVÀrô& Pãæ;î¥{=ù‰PýjâEq˜ w iKnU¹ÚÿJ鵡›Éï>Qµ? 'æ~ˆ®|–A³|`«ëY¾Ø¨ ™ çò•4JP? Í…év”‚ª\Þe°»#ŒiËËù_â}°Û¿}£Õ+ƒ£6óqB÷½üÆ ZõŒzÐðbU¢ÌEº?WúL¾Âô z Þž`ìµo9½tºòk1¤?²×±ïÁƒ“òa÷¤èXެN•P\Wô|ÃKÑ‚þôÅœBpÕ -Pää^4ÄS­Üòxõ[ˆÇM´†¼ÎÏl)¡ [È©2ùÓ·ƒ… eÛÊô˜³•a;¿"Žyœ1çBðaÞ>wÅ´ú Ü£ 9m#6òG¸HMÃó" åcXfMÝÎhÁáÂ6Š`kÿr(æ=ƒäºÝ•‡ž™´Á‹>Ÿ"Ї´F4ó9-ñܨ 挩xÄ¿¸‹t"ÍÒ-Ü=3 ÿƒ—ß1’‡Øõ’˜±wäd^9"Zck _õNòGLëîĤüÝŒ7¹5ÖËöﻲF<õžkZ]Îy#I¦âUÐpÚÒ麦+ V~´ìî«”v/Ô6°l?9¥ÂÇJ[U,Ý5NKl%_NÁIsáO+œ»ÉôS=.V ]å._5Tc•‘«¸r´ÔÜB/ƒSÛŸ :'Õ2Ãwë?m´Qmó—ߺÞi†|Ñ™û4%¿¢tñ#ÿÎC¶L%‘–¨K’ Œ‚_{ Í‚Z ^‰¸ j%ý”ä­GÄî3ÌT(oW|ìGÀY¾u²9¦Ý¾#ñÉ7è/¥¢\gµúVÍGËDîQ3‚ÆB52e J!öHë×ÛJ²Eçwù·µ¯ÑNßfgÄ!ÃyC¸‰­›_Ù„ÂðÔS NU~|:€—i~: ®•8‚–í rjÓ1†Ç®RRëç›õu”ä1$¿ÿQjbò ¿e>¥ÃT~ ߘ¥ÿëH'zdêºEŸÎÂyj–lá@nVªQ2v Ç‹OŒh#c¢m @gH_ ãÊO¡ÚΕ°ýve‡ͤ*µó6& ¬) èË?bKÑúà Ç÷­¶x P,éW÷Dú€3€„Œ¨0&r“2ËWy·8áƒbü¶ÃŽÜ‘Ë̶ûÅ™–V³hêÖò¶øëzd:+¶jßâ €f¯ïkÅQl|Ó!‰9ÉT ‡ swŸ¶*$ý¤·Œ™q°WŽÅ8’DΗ@=ΠÏv iÞÜzÄ•bÙ ¸m¢sàšCdtŠ:³CßÌ“*×é 넞Wâ`3 ”C#ÄÅ‚[3/¯håç$Ä—ÑzV§ÏÔÔÆÁì @JÆáð%º©°êÌKO×Oþ΃S}7}]$‘·  R!±µÊf’¸…·©#ð«LF¿¿Òˆ‘.n€‹wßÀ¦ÁH»,YQþnšúô»¯çLNë%õ2-zýëAó'kpG6ç僯 ‘ÑD ÒÏû5%Ї ¬ÒEà vÔ¤ègo9>9%-¬t÷_ïñ™˜­t ~C=»xkY.amâÊÍô¬¸×Ïåjü<ý)°ÝL?tAé™cÉ“ŸËŠâØbçëó–$GΉSç;Á Éx5_ &*u0¸E¸’’ät,¿ÚJÜI9hgÎfßîdðµìº|ÀePu"¶ÕTèî~ËÎLëÀKK|5+q#4Öô6|{&J’t>ºk_žÍðÚõœÌÆiãwˆ#ä=÷ãIJ7Ñ'pˆj'Y¼Ý®Ç¶RDº14ÞvøðÕotÁ®µß¥Š õ$xý*‘bb†2¤KëeØZ¯n† Þ·æw@c• ’9 Å>ª=íœæÏ)€}¶n}|Œ#ÇRH)$^áw9§ŒoƒØ¢øôš’eXõ¦ }·pPóð!ê*Æ„tÇã(ör8¢šÊ\‡v4 7î㹸ƒR.€2Œ.’ÂòÞØ„•m)ãßóWz2žŠP¸¿…fŸÕÉœ$è½²fc@~G?îrÐjF~?k-³÷Œ°Ñ'¿óz@^ uúM°Ócœ £°ï?Í—Âèç"î1Æõ ŸÖG$õw¶íd]ª*ø&úœømi–¥êeþZê‚ðá¸/4Mf^g„Ššï#c âHŠ^׫ÜÉä­0X¶`¢l/s9i¦•’$ —f‹LXŸÓI¤^Ëß]¥3! ™L/›ÏCi’v&E°àD…Sç6úª$Ûÿ8|Š>ý‚CNë,-ÈʰÜm“mV*“/øé—'Á5ÓQÈM‡Ôú§—ƒBöÎéϵ‰LJ ع µ~d›V®F ™ov£‰Wß–h`êÍ@XRöq EވЧnV/Lå×O #ö¨)›º/ñ‰¯ÜEEhdSØ€Í]Ý-¬)]*Þ<¯œUúlÌÜ5R2Žf§äÎ|ø ¬Ì#¡¶~jº™6Ì­‚ÙZ6 ¶zD‰>äX¾xFüŒDŠ“¥âûAʼn_ˆü/]&ˬÂõJ‘ŽûPF±û‘vúZZÐÑC³¯bMÉŒ‚YПØÃ×’d‰7Î~mXÑøå‡L(5’o“GÔÖVž%TD³“*#oÜÕsâ 4½„€5×J6¦ä”ä#Gr–1«d–«Ý ÈD2›–¸÷~ |€?HÛ NÌ.÷Š™…ZGU¸yËò¿ý"륉Z꣹: ‘5ì¹µ]õ%쇋ÝBªWƒõk¬ÎaXܰöE—Ö¨„‡'5Ÿ8Y_"Q´c€ÜÁë.“-q£©ëô3¾” MŽ´E°‚Ÿü0*h¢Ïtë¹Fï§Ñ¯Š–pgç)C´q÷‡Ë Í^îÁWMÆãmQH;Ù2°Ÿãdü¸È9¿>SX ÄmjÌÿº±õ£ƒ§o#©Ÿ£OiÄv;≫© µÙ/i€[èšoe-¤ã†Œ7 Jó"'ÑK#1Úð®â í»6‚ù(Ø;ÛEU¬gþ£#0»£rã–¿Xÿ®Ñù”Ê»Ææ,œÈ2P“¾Ã.Èt0ä{ˆ¡ŠyÚñmfêqÝóQ0aí~äâ$–J)&bb\ÄÓU™Oþ”½eç©°„ «(2W6R<>= f×ã_›BNÓB§Ú$j;ÝGºˆZÁ|{‘‰ÊÙŸØ\NEÄó¡@Óí-{Æc&ô YþE¬y‡Ùzÿ*Ot°wó—»H‡@ãq7c0êW•‘o T%˸gÓ›•À7 KNÒ½? ÉMð„„ñÕæ=ÜóNϯÓD[GѲe…X÷U|‘s|ݾO¡|Že´A¤›Ù³?‰Ï2î%VT'ñÒ$+‡ÐãÜz³™F»§UÖÏÚVD¢†ñ«S±f´’½üÇ“*8Q¨fë4!³v½HÂ9õØ\ü¸Ü™›",¡‰EQ>ðfúÁ,•ÒäBº% Q‘Eù:“˜º'}–e® ÿÁ§— µÚ—i¾‘¶š]œ$¬­(Â7J¾¹äá‰òsgý=^„ÕQ Ï=kxµµ|©d'§ä'PƒuYÞ^Îxm'€®hIš5É{Ul@3—?îÆ9cË/pA’LŠ¿ÐT1<Š÷pÜG@B–Kïƒ0•wªkVüØ>¥F»¡ïÁ¤Š.ŸËZÒ9kmî:3euq›6Ò€Á¹–é‘•)]ùˆàáç¤èzJH$åÌ^!¡†‹©MS+‘I´Êö·h¸ø-$³³Ì|†SfÓ#XÃr»†%rI~7¥¤ãH±(¿rÉëž¼«^µ>XGª¥:é(ªV¶ƒ×x>~\76&=¹iK’89'ܧxó£jØëwk6oÜ~¦óÌ9´·Šnθ”‚Á„l4âÿ€)ä6þàT+§7ª°,»`Ó¸Êúƒ×þ`åG„ïÒ5s´Õf} nÍVô£/ÇÀ†ºÉÒqcæëÞy—±þÍu§³á%‘ço!sLÙ£¥ü æ *î]Ï;Š®´ÊmµNΑŒžf²%ëðØM€Åé“$1~êÌõ\á[Øi¼CS¯xÊdâ “oJ%y‰?œÊ•ÉÛ½°›dí¾äwåPNô0æ ˆÍB¢£5»{&s- ‰ÔvÕyî@QwkR‰ ¯Œ7ÎõÔ ÛÐé!È¡ô‹±P”K³¬‡m¾Ùó9,Ÿßb3yp/¾\‡7ƒ°ú–ížÑw+P:££=H÷KUAS )Þð´G¤n’WYþWéI½I36’Ž6£kØðµ¬sj¸ÿ™J!æzˆÛñßÊ-¬SlÀ ï åQãc D«×¥–-ú[‡Žv8s èx¯Þ\Ri48ˆ¶ÍïÐAg÷…¸¶¼¼XRùÀx4Ÿ%×ËÈ—W¾L®Ÿ6W8 Ö§÷»éö)òGY½vV½>¯eGmXÛêbq‰Ü)68'Öu,ÌÍL¡½W"WvŸç¡x´ 2†ØQü„¶2¬›ÇgGžZŽ$:s“»¬¶`cÑühb!²Wf2=æg­ß§-š‚»XlnÛÂè]Ü«‰.…i¢Ï\šÎ[”áb2é¬1ýœ¢àŠ­ K•Dݸ—°Á†ƒI©úOU4(mößoCö†ë(D¯q{NéDË© Zq]Ù¢"ˆMj4>ã@U³Î^£²‚˜ïp4ƒ*9Ïâ{PüÎŒaU˜Ö@ÉöˆŠ/{<Þ[iñ%–¸$Åßφµ,МBÞ *ž6xÌ{BrÖB~Öœ.éª(òâu ¹×a„ú¯ìä[#òíJ”iÕVåÉ6l<_®\’Ù/ n‹ÆNÕõ–«‡²à× £,5~ð A‘e®R!{íèÄ„Ÿ·%ö¾V먱[DdÏødƒMßãu“l=¶¢0fa¬ é ì %œMÖ#´]tÞÀA¸8ÃÅNóðÕØ¸JŒdœ .Ìlr\Ü¡ë3ÞÃÓæ»СݧS …ÏoòÚ’Ê}ÜJo6ÖQZ±œ)5³á;‚^W–Nsš,TÝ˯[ˆg`‰Z¸âÉï‹(ã¥yÕ,Öh/…ÈŒ¸¸b¥©°P¥³ùËþ`HƒùÝ5Fó’¨ÎÝ!YÜõûÙáw;8UšØœÒ?5"˜¿ŽÛ0u,¾ ücKÞ÷n-ÒÀÕ“,€š¶×ð©°­©%Ò+M-óW¤æNÚúü ÷ý?þq‰‚$ëÍKQÚyŸ¶t= ã¢Ú~H$u!ü „kdÙãH¾Z©ÆüH†ŠÍü"o Í®(®fÃí“CÞUUoSdúÓåZýÊúÒòDÙ´ÄAl{ñ¤£¢j‹[4¬_ Ïzc+’‡/À2@-ÚG!,èíåsTŸµ·<ÒêQ,îF¦!›ué5‰ÙªI·+4݉`=IWv²ó˜ñ®³s¢Ày&ÓÑ%^@_š»˜µ_&g)%² FuZIˆâºç¥swܪÒÛj³äKj ¾Ó'4žF;¹ÛUÞn¢P«q‚Ÿˆ*ªy<ƒE8TCnÌ!Y_S´£¶[ùØ&gc§zI2tJ;bP]õÁ=ÇнêÎìÐ÷×Ì¿kôa©å‡x]¾.(V"Æ„’eRNž:M[8žìê6\¦ubþæãí—ð÷î´Þë–§8ûñ³úgŸ¿›Q/£ì>ˆé!€ˆ_)Stt9CBÔVCúu¬+€š½‰xÃàÂÍô¢¶³Wx;št˜äQgQQyÈ£w…L…—t‹6 %èÒG›'ÝïÓánú= —Îø)•¤;׎´d‰;Šš‹pæÇ9µš¤*eÕè‘®æÜH½&?ÃnöYºÜÇÞõÝ×Öª›±²T9ÄÞŒk=·éœ‚µ ½¦‹é'Ë›Œm ßÂåsþ>”a‹Î†•!Gœ¥q Z<øháí°Ð ؃°ØÊ¥õo!W(CñašßRG5øÝ•¾™©˜¶ÇÐc¯ªö¿bõì„òœ¢o½BŸØ¢GñÜœß3^_t5¡êK¯`ŠDÉŽëÀ¬óyôÑ|ÄíÅ7J‰zèöWìôjtËT'í?Z!^bÔ’êÈõƒgl¸ˆÆ»;õ]æ¿Yå³™9\1xÝ6Ÿ—Ÿ>Sfëñ“ëÄe~×´¾ãeµ¶÷nš>µ„©ßøü[ÉL…¼ŠÓêÜ›™Ÿµ<ÜÚ§Žù'^^ÛéÛ†è¤MÐ|Oæ¼DcVS?]™•—þ>ÜÅ9`A[óY<'B9“§TŒ8"üfm²¤”¸¨¡£ÐPCÏàRyø,6¥ˆNŒh0™ý}¨°˜¸òâo ÞjDÞüVågù«/Ç„;‡TÜRÓ²åû’« E𿨞¬¸m$ht³Kn/–+I,—šÉ®yÓ`kà|rY5÷ƒ÷J•)õD/Hb E÷¬‹ˆX WŸ^TWÅ|úõ2¾¦3Tc9*n¿í c„ÐCfÍ“§|ÝÃò÷`ÄÂ/ü"=> î[c`ñRYNQ-‡Í+¶Z9J—“3³Ílˆ¨'> Õ6nA.ùCäCSÃ}+QF¿ HÎÞO7å™k±—älîd²Õ`Ë(bÞ½…AËD35ú;ûrÿJpO®ôtµpùqÿ: FP)•Áì­_gž¿B’o9ƒ f›mÚ ¾'ŒÕ&å~UtÖ+ÝÓ#~ªÅJ¾qkP·ÝÛ8„¾ÿFGI,TÝÆÑ‘D1±è$ðZ_öÈgØLu}þ¡eµOoïÌA?ûGÞ¯­¶qä·­—’UºAŸR5çPfaE% IsPÛÝi^Ôc]чì¤ä· fÄÚµ, §%É¥fã»ézR%µ/wÒö›cÑÈÝ;=(GÕmRB ÝqÁ¡OÈ@'é¢Ph× EæZ}ÎV‘é8êï/A+Ò?Ú`€sÒLk。9Üî:LP³³wW³—;$˜¼Þe‹ë¾Éˆ(gª”qM‹D–ÈÁv62^ùpjña/ ÕÍ®ˆÖ}G­¼©æì[0Ã%ë˜5ÅTÏ {!3Tˆ„€ï4ÅÞÞºÌn|Û¥¥HÒœ‘Öá‡G#qáô® ŒÙ7-IEô¼ï˜Ò®ÃæíTA}°5Ó&ÜœZ§ßÂM]?*"»Ókbˆ7Ïp a=$“N{ ­…*QÞJèsÐÅlÓL8eÿQ³Ó^—£ÙÕ¦˜¶ÉÞ0žÝij`ó½£f¿OÖ Ž™Dö˜"¾MH]¡SÁ;³¬RMæÄGÌaÙb©)lø4¡6DöéqŽÐåg H°Ö[Ìc!KÙ¶¡õXÈå›xáØ}Õƒ¦X9#7OôtyÙÿ—[qLÜÛ$´ÚbÛÊëýiœe2%«¿wc%"3‰-ìèúX6Ó qÞ,®†–^S-̷ܸ —øtñûÐK b'wuøŸ—½ Ü.WÓó7#Òô”9ùc„ã#®äQ;îfD÷)ƒŠQJ5ÝŸ[˜¦¾:X{‹3®ßj/d¹ ѯVd~|ÛÒÇK/Ûi?îjƒ8\«oæ°'—eRW¡›  ~ƒ®nVëvpmîÜæXB%?Éš`ë%02 Ä-·oVJµÙÿhgröó±ëp Ú{` r“ÇÛP{ÿŠK{uÌLzsýâ˜H½0¥6€?TU·Gwª|,U˜ «›e½®ÿ²§‘! 1É8\ÐÆNjö®m=bnÒ§£èqáFOÆ33=лrI+5•z\ÄJDoÝþMïËÐ4…á^þHeÒ©‹ª³á\v@k>«Üs3:l`‹&Úlvnµ÷ZòÃtè[—*ú‹ÈddoQêö_UKÔŸ¥º!ÃZ¼‡€Ôwßñ? œJä_¢‹½žxz[ÛÒSìû†^Дœ¾yð¨}¿ÄŸg Ds|]¶½ÛÍ,çA¡Éñî¤x=· ylð>Wc±l•d„iD:”FH ¤/ “Ë£2yÒç§T€–̆¦òñ>hÈ ×»¦âbSà,W}}Éïœ Â• "Kœ ízÞ² k&ŽGXŒŒ-^–b(÷Ü^ü"–™¢‚ÌBšuÅí".þ]ÈvG²­Ei|Rx‚UùðjÒ»÷Q&ÚZìVNçjëïÐîÒöÛþ]IýœÖ4Ú¾ 4ºËiÿ‘ûâH}]¼â0ù+d$ôdT$~“5S¼I.>‘‰xñXdŽÑ~¹ÖŠ`WèÆC;Fþ‡TÉ´¿§Úf(µfªé ýf¨ð[z‚ã#ÆL2Û` yŸŒ€ò,D(¥å« ‚R­ïÚâ¢qƒÿQlHMt>^µ¢Ãã±A¿ulÓ9)âCž»Ñé®?xüX\ZÄ7ULÓ&^BRS×Èœ¼¤áºÊ§±)Næ/ò’I‹Ã{Ùšƒ[¶{*r@Ù -è¾b{-‘TEZŽd,õŸT°¤^kèch„Óbäó3”ôJ@n%Ã$Gvò$ßS„#6ôy‰6¨G³Þ}ŠªßŽÍ”'—¶ˆšÆ!™ßN9hŠìhÎ PYΆƒó¸µî g¼>#*e§—ù‘ccÀ3¥Gó+>™u»>>¥…=Ô€Y*½lìÉRSJ)0pÍ‘éÂôÔ/Èp˜^ÿv²gD,ê³ à+G]¡ŒhÝ ®PR±Ž Ç¡îUš³…æNÂÉ‚±oAs&^·á罟Yi¤ÛwØæ5Æš¾²4Wë‚Ò‰´;@|´øhưvØ:ùESÎi¸h/"ösÇ¥:‰·¥\xûÓIÀÉ”‰ßâ×ÝQEø/¤Î¼ÒAÞ;_˜c×õ·ÚH‰­”×*P¾ÕF×¶[ z¡Mßúñ.DÓ·Ó:ø'<(Ý@h6Í5èmš’§ñ}.§ŸlÝ$½s`,(_L#[[pPþq'´Ér­ëû›Õ>¤Â51ɪ“£[c>®ï^uo#×±8%¤G¸*¬Væ~ÖÙ[i¿¢Àó‡’¦¡5&t§Qœ‚½„s¥™3„(×aÔ§‚[ÖvÿêÚÈQƒhª°¹P¼âéwVdE¶WP„”Ë×Öž (ðâ[û°»ß’*ÍÞ¤0íLÁs÷ÔXÑ Ï•@âb§éZ: ¦É3A_tɃÁ­bÌtôŸÕGá1ãšöŽÂ@²uÙW°Âl§»}î]f¸Évœž¾êÓ, QW”ÿ’u¦¸/öa4](Ó&1K.•îˆKÈÇ}ÑPÖãÂ$52±]J~×È8ÍÐΛ‘‰¡ãc'Ö1„†ß4Lo=cÑkÎ_Q#¥¨Ø” ?ó"×coD”4@ ìÁß˹7p]J±!ó›I×Ð¶Ì åH¼Tà;Œ7 2H Ú[pÊ ŽBFæ~-†æ%£X(ÒV|ÿb0oœ¦Eª6Ð?«È_r ·±ècûÍ0kèÚo)¶œ9^á7ßÁÜ® ~åü!ež;7ÚDÐ 2´†d9“³¤ÄýÀ~.ϨóöãäÍ‹×yÇ+Ú1$|S¹DL»ædnù@7GÏ¡d†'âÌÝ£V˜lÁ›Ç²-Ê‚¾ŽÄ§ôš_pDZ·-ì*EžêÑ ðãA”âBI+ ø‡õŸ·•1=ש•¤OŒÖõ/‡dum v\Å3óâöSÈ h¼*e¿›KˆÑÛ\6×)˜ŽM”YƒýîÈMåžÂg:€¾wŠÆýBñsqOØUÕócaÔ6+MÞ—z=‹1ˆQñOd#{úÙþaÅÁÀʹ=B[<»ÁE¯S‡O}•<êý¦m´)šå£ÁýðÛL|íN"Jâ§“Qö¯¨¼ñ­ª¨/kÌU*.I›#v™|õB&—?Õf“÷¹X¬|—Û‚Ì­ºñmïöÈIœ{‡”™ßzùØTœÑ)šãoý=I­htäÐ/L£üª“?©"YòVÃ2zOêÊYßòÒ~J¥0ô8øMšÌ¤ ióžšé1ƒPkÀ±¹w•nMݹZlŽšéÃZÈmû‚õo>³ª ó9B.4w9iì&‚(°ÁØi± Ã8iÈç|”ÐaŒÁê]ßúwÃÖ•øJ£ôUf½ô^)^ò¼cì¡1±¬!ÛæÙfVáÂ`¿ê^Fëižïª©Ÿeêëç-e:*ß^òéA„ „Š­5&Ÿ†^Ñ'Ãcƒ\€~«×£{»Àì8¦ŒðiNDK|"_¦¹_ip\s-{í–™ó¨Xbß#zù rôj[s•˜[åcˆk™DÜ úÕ(;; + ôc“ÒQ¤ )4ÀkZ·Ø~´fËÊ}5Áجãòƒ‹ Å kץǔ»¬m{™€ûJ|œ—qÉn:¾­z!N³ ”î«Íöû•KL©ŽíÿýSäóûiÒR`g;±ùRå8¹'‰’ì:0k©â Úì8òaæX·Þ¡1ß‹Wh¿l€ C·zß |ƒ»_½Ìp²\ c†^ûäM ½G¯bg¡ƒ›X.•IpÝA‹õ8IHÈíô¸U#[A—Úg—u´ò&ÚM2ñ§š³Ñ)ºh»ËãÈ„…–à¢n% žœ?!¾VìÀ“°æS`ºœ’ñ›T½|«¼lÝ\È \‹C¨O|Jˆ&÷é û&í÷Øß¤ÓîPù"¸™r&¢ª½Ý®a]^SùMrßK)%ñýzP<,ÖŽsoú~)S½$Ö—¢¼ŒP\op9º 4• Öóŧ{mK(WËü¡Ù¯UáHŸbRNÊ6º¶"ÉI~]„z1*vÔé™>¨óÐD^ÊÎ6¥fö}563+51 ™¤ô¡Œ)~£s ÂjÈçl!-T˜L@1Ôw»v%m• œ›$;@ÌöÓ›ëMGƒÒã;±`˜>ÖKØ6šÎþ|øKƯo RH¸()›oK¶ûþW½8¼ÒÍÑ®¾’E‡­(œ¶4<íyI.ÒÝ ŸË÷Fñ¶‡ öd•¨µJE<"ß¾YŸñHQW•Å[ZÍ_GÃ7-’Õ®M„Úh§ :Ò¦Ï{[ËLäžB!·Üó¤lß.k¬»ƒ‚¿8VðTúôÎRWX%—¿ü6-åwÔTlb¸TÕ·\l[- $Q%)ŽsVº4Êq±º¥ˆÐ\âXba˜ ç.ÞH¹¼2&gËa8sü 4Uî8meÆFïßxA¾8°Õ± P«q;š/jž¾ç±0´ô€U•Ïaw.˜³ Û¦(y"tú±õë:} 9¥mñx?ÞtŽ¡q4œ ,‘_û\0ÍE£.y<ð%mlâ¢\aLt-q¬"òDÛK~Kcg” .^ØP ¹÷Ð~Ю†3÷—ÊÄëC\gl·ðBR÷«›øÊ;²ÍêðÑ*ž¹©ÿ†z€éSYäËØ°q®wx…nÜDÌè¢KhÅ×ǰÝÏb)þZi“oô=WêNýÔHk!»SYÖ?.A§†»?¨1BM ¹+g+¶ +^\¶”‚;¢Ñt–ZgÃ+‹ ð¸MU“XâÞ@(ü¾¤Mƒ]‚‘|H_%ÔÃh(”è3¿?bt÷Ú×ÖKžh&žQ *s‡QÛe-y´ãÒ)Î+]Š1ãÔ¸ Uö<]øcùÊ£åÃb¿-&}°BÉÇF1©3Î@§=rBþÚÅ·YVõ›e– ‰<äßéI^ä£9'álÛËÿ3vFÌ endstream endobj 104 0 obj << /Length1 1969 /Length2 13327 /Length3 0 /Length 14529 /Filter /FlateDecode >> stream xÚ÷p%ØöÀ GÛÎI:¶mÛ¶NlÛ¶ÝQ§cÛ¶ÓaÇèØé¨Ã—™;wfîÿûªÞ«T%ç·¼ö^kŸ ±¢ ©½1PÜÞÎ…Ž‰ž‘ "§ªÊÄ`dd¡gdd†%#Sµt±þWK¦tr¶´·ãþ—…ˆÐÈåC&jäòa(govµ0±˜Ø¹™8¸ÌŒŒ\ÿ5´w∹YšäèÒöv@gX2{O'Ks —<ÿý 4¡0qqqÐþé²:YšÙäŒ\,€¶MŒl*ö&–@Ïÿ AÉkáââÀÍÀàîîNodëLoïdÎOE p·t±(Nn@SÀ-älµFKPµ°tþBÅÞÌÅÝÈ øØXšíœ?\\íLN€ì)Y€‚Ðî?Ʋÿ1 üu8&z¦¿ÃýåýG K»?LLìmŒì<-íÌf–6@€‚¸,½‹‡ -ÀÈÎôC#gû#7#K#ãƒ?K7ˆ )Œ>:ü«?g'KgzgK›?zdø#ÌÇ1‹Ù™ŠØÛÚí\œaÿ¨OÔÒ hòqîž ]®µ½»÷ÉÌÒÎÔì6L]Ôì,]R¢Ù|ˆ`ÿ‘™]lŒŒŒœ,Ì #èabÁðGUOàŸJ¦?Ä=øz;Ø;Ì>ÚúZš?þÀz;¹.N®@_ï+þ—`™˜¦–&.c ¹¥ì?Ñ?Ä@³ÿðÇý;Yzt?Æ ÀøÇÏߟô>&ÌÔÞÎÆóó?¯˜AMHU^M毖ÿV Û{¼éXtÌ,,6;;À÷£(YþUÅ¿<¥ìÌì\ÿ)öã”þ[°Û_@ù×zPþ7–¼ýÇÜ”ÿŒ¹.#£ÉÇ/¦ÿÏÃþ§Ëÿ¿ÿ#Êÿë˜ÿߊÄ]mlþÔSþÇàÿGodkiãù—ÅÇܺº|쀜ýÇ&Øý_S àWhjéjûµR.F» dgnó÷AZ:‹[zM-]L,þœÿˆÕþØ3K; ¢½³å/ €Ž‰‘ñÿè>–ËÄúãõpþÉ?UÀÝùߌbv&ö¦,3;ÀÈÉÉÈ–ñc’˜ÙØÞLÛh ôøsˆ ôvö..€î|föN°\);€AèшÀ üqDþ!Nƒè?Ä`û›8˜ ÿ €AêúÈ ó}dý‡>2ÈýCäÿ&Î(*ÿЇŸúßÄõágô}øÿCµ;™X?Þt3—ä,Ëÿ3”+>Z1ù›Ø>‚™ØÛ|ÜÇ%¬¬HlmÿIøÇE1˜þ ?Rÿ…̳áGbóáG8‹áÇñXþ ?:³þ~Tcó/ü(ÕöüØr»áGöÿÂ2þF–´Ž®ö.@Sãdú:ý ?Šqþ~ºË¿ð£6×áGmnÿÂÚÜÿAæÚ<þÄÿ™WW'§GûÏ'åc˜ÿË~C@ØKö&*1œUqµ5zÇëƒ7Öó‚Ií N™g/wwü&O›”™b)6cÔ"+“ÄsmŒJ0ÄÌ(Úd޼¢¥±r™:îÇÏ‚Òk¦Õ‚sâg Srá‡}åϦ(ŸÍiêŸNùZŽøO£ ´¿„ù·¶¤kàGÉß¡GI²i1¬îñjׄ%ƒbâ‰M}Ó™˜&Ï•‚ëg=Z|¸Gˆù ™†„má`mÖ!¯S•C†)ü26~S#Þ/`®œ)SÖ 9•À«2¯ÔÚûŽ_ùï®|Wg ù‡^íg¿ŒIíù>íÏqÑš˜úðº‘@ rQÄùclrÔ¦ýöE.üŽPEß߾݉[=sFwKVô¯Ó±ù«’DMv±ú'Ãîñcór-óÔ¶­‹˜ZÕéè“ügëôNûh• fÞŒ¢½>삇yÇ_xôNjº-|fféK”… 6ÇjeÀmslîõ×É5Ö°¢7F¼ [ ¯^mÅq7.+¾4¦÷à­.fޱ$ˆËøIa†}ãÄTåZ—{VPDŒ¢ç‰ÛHˆ‘§± Ó¬Ëåñ­OzÌE?°ÒÒ¼[v­ êüÊ6Òá°– ,ÕY¼S¥À|)ËçpPêŠee4•Ì\Xd½rÕ9Cp×êHËÊÝÿÂÜ©ã2û}lDp_ú…vq$ÜéwŠÔ„ª0DPï9ñŒÈ£lÑÀçǶœ"E[¡…Qš|õåq¯ñ¯IÙ&˜DáØ†,úªˆ°yŠn°ä¸µµ{}'•‰zÊÊÙå"ßD ôkØ^¹>ß ïÐŒŸ’®P&Õs—PjPЂ‡ƒ¼ I”ÃãÐ9%Mª„¥.bjY@ …ÓZ/=$GöŸ®#Év½îø¡µýTfxÉ2§oHÒH™Z5Oi›ùD'C$³;@ÁŸ‡’#¶­(OË-wä¥Â"Á¬Œ(È®›·-@wµ¨©K°vtç/ŽIïh‘1ðéA /ïæÙ&Ȩ¼Ô}ò‡|µšÃT‰aUÕín–WäOtióïÆîÄ»éð“΃ãªßS@ªD{ÁƒÆ¸5‰õü-‡ Ü;’ ßŠÊ  b(öû ·-ô!ûáUUã¥*ì$#6?› Qº¦’nâò Q7î—ö3î—7¥„[ˆ”|ZLm÷‘ùj=s•¥ g OŸTaÉ ÉÏð½C(±e†¸éEÎ,§d¸ {<$‡èÐÜvÅ^X= Ø#öãó´¿De ÒÞæ–˜îÚ°QOo8Ò¦IÞÓ’k8‡v`äåí´%n>A9ºN¶ŒÔ-É¥€ußö™?/˜2€ƒÑCÙŸûQv¥¡î´w#÷Ñ'š`™.ê}í‘d@Î(Ó.½…pgåö (ð¹M¾8È>¨79¨ ¨¥úßWK(ŸW™zÜòä@5_V„¬ˆÕ!~[³ñ “gkœYþpÿ6áƒUŠý%ÌM¤&Zèµ'Q·{l(¼+ ¥@Ü[ñæ5\02ðUŒžŠó«PŽ‹!Mú´ýÉ“èê*„€`/tÃbŸ7ÿ*#êê)ÓC5¸(*z)| ÇÄå·BjFð|Ç‹€öº€þÃyŒ5˜!–a¢Ñøm¤Á.—fŸØ+6'Fð_mÃ+oÏ+œP[©øŽ¢²C]qÞëç†õèÉ£¦î)x>Ë!Òï^ -9G’ÝÚ¤!‘?@2W䦋8c‹¶ã⇵‘'#â@‹ y9¶¼kd6QÔ©ÈÐPwެÇ×Y‚CÎ2Uí‹^Dì|Yù[´ßFk½;œ°úÔ´ß¹ÄÊó–$ªw\Y¹Vù· íq»§‚ŠvüŽ=vÓâUB}r̸ˆ–+z5¯é]G…=Ì$ŒÅ^èÝ5xžC3íi{a°¾ ËZ[Ë4yCq™A››¿Ð‚ÚûTwâ|ÇF”5¢þº@zIÐãöy½™ÿŒCíÌäØj ª„¢ =Ü®Ui6sš)&ë°Xcs¸â ªôÇ»ú:|Y†¼+$ ×û*+J´§å\ÿÛÖBi BoI•×ø.¢½B¿AŠO¥‰ö¾—pÑA°`‹v€ÑF÷ïmA£¯@´}›%¨’˜áÇ@Òß4KÈ“”»ÅFNáôJ™eNÂAØ!à¯,¨8É'1„Í‚ïÓ’‰±Ú#š®\[äx‡¢Á5A½º˜¶HÙI1Z|Ÿ5x·˜¬ö-w9Ø_I»Y뀠µ €Ã2Ù}Z·éUW¥#û6î¾k_‚&±Æ‰RÊ=•ñ‰)Fúäžš8¦M*8ÓgÌèàϿƥ §x:õ°P»Æš®Û0•A{ÞR_ŽRÛ¥ÀiSHF²¿$Þï çÍL¾,sú¬¯IÌänn\êò´KÂÃÚ ï@š0GlÕxiNC¢ç3 pocì ´¥í#cº|&ØÆ k›{H5‰Réêxeå§@B}ã[TéO¢gðàVtO¡Ð!ƒg !ìnw^®E ‚ÆÁ0ÑC0–&ÆNk¨äN½‡øˆRg'¨ñ8ñ«mü(ÐL*'*¦ŸnA°÷µH/B ©Šú«îæ±—¹?Ea^ô¤¢èÁ=*£êÍŠKU«Z{\e[™çJ&›BÓSrÃöí^VäàÓÇÌ‚¥“98ö”ßòcúWòë{yЮzë'M™è9eï²ÛW·„5µÝŒnVºH&«®‹¼Î,Rxfwõ8“¢{¶¶GØË:!xó™õ6W’Rć|©ï‚É~SG#¢>•?¹˜:bf‹€Ê{™4wd•<±IøMù¯ô·æ'ÌÑ ¦ø¨ Q{zÆÎ^=£Üû3FBå™ü¬Ø4°¯`Ål®[|Ò„ª7OUÉ’ œ¥Z;-˜v­h³3Þ/utHOй.ïß}_ÎR\1 K¤=R9—Gç•ñ×vè±t½Ç ]7Þu0"ðˆšJnÉŽÛXú"â_B9úuì‚Â䥉šNÞ¢gn2_óÅ«¬+ëá>Ýt+Xõ¤wáVo­Ð4BiqgËäÕÓ£©Ê3Ò~õmC•K_k©_Ods6žõ2õ½Bš~––eÂ@“k@#Ê6.™TêCÄ¿ìn33i™Ïsjìªã5·ñ‹½LOdÓª‘™á TÙ¿Ö;5…Œ( 0€b[”tÞz¾[Ç>a¸Ùmž´VÇßp=0ÿéŸòZ½tìKÁj“:›²/ø»¦Ç@Aj«'{†Á;AÂË“ÎÔi ÛÁ ¯ k’è •Czknéú1dy¾÷¡QåKÙE.ž—7NÛ©qÓ·ykEch¿á@XÆ‚ºþÇâ)/¼=©ù*âÕàÖhårÒyÚo„A¥g ùG Eg»äbœ} ™#/r0îj9g¬é+«ƒ´9Û–ÅáZ†[mÔÀ=-šXÇ[¹Ä"ê–/~íx½^ëí¼›žj"³‚aéZ_ÃðòDõÚ'¶l]¿„M³?û*ãˆÑ«7i£,¶ùe¡°D©6^àäC6â±*“Ä`ÕÏ6\í ""”Ù‡I§Çiô‘÷`´ùhhSþ9™•”…<Ÿæ0Uøz0â¨f”xƒS³^…•ËíŒEåFHM"Ç; I˜áy¼¼kÅ%/¥û)c˜-Öbq‰N79ê÷OYBãŒ>Ús; NŒ±—Ñòªjb,\±…0 ‚·P&L@ø^Xθ?Î/#ía€Í!~é|å=Ço’‚iãÕï‚i$Jx)îÓVÙÉ‹šL <w¥³Ÿõ‹‘xg(/ù?õ±IôÂ…9‘ Œ¦õáðˆ `LÓil*TI¼ -Ùk ÜœÔÖ0 àAÌ Óó‚Ê-‚·Ì2=: jåç·çÕ˜nÌE.Е+Ð?;ÀújIAÉèýŠ ížʸTVœ$‚R´¶ä}ÐPÝO.J@Ø>5Œp™VˆHRβ™Œ¿Wõ¦ÖeT…›"$^Ýϗχ¯øÄ˜’î€ó~þ&{Õ˜¢ÙX‡°ºù[4ÅHrŸß(Õ©“u9yQç·iwyz_Ê¡[ zØI{cPÔL™¦Å„OÑìݹbM3‘“à-kaÖÖ6: kG¬ªFödP/GÒ§J%¹¿¶.¼ðùn´ª§äêq‚ ±dÿ°¶·c©Üæñ®ïwæ`ô¡ô&D…ówÔÁ°è¢¯‡˜4ZXKÕ9r²ÎSµ@Õ(c:"("¯bÌ #{Á<¯¸cáíJ³Ø€Æ%…©€™Jh Ñ{«ôñrÏ$x¹6?±¢ÔK‘Zi¢,]eYyß”šèÐFþk%ÞÍj,¼ ̽ËÕ`¨Ÿq ›å›Aí8ÃÑ–¿Òõmƒ«Ùín!ì5…Œ/1]1i-›lʦ ŠÿæbŠÔS¸éçTi® òL©xðÐÏu€™!ó¸­fêaPšÒ*Œuq ;Ó09ße-×LcEð– *·¬Cs9k6mûAû ôŸø¥y ÁßÍòÃÀý°¶Î%úù^VšN§"hóó+3öÌ­ÇôÀÄ8ÑZÀ3òV "ä  K§w™™-ÁKŸ\&`(t÷|xDŠ·@ôŒœØ÷5ïB4ZiÁ:E¢£@@0ï#•Î"µ K ¥ „k¶ -J¯Ñ8á‰yÆèofFðz¨{då*G.³{RŠådpÒ¼íe²¥ìæÔBì[ñÜÍ nX’úc}•» P®*(žÊ@Už–쥖Ôu¡Öô,—TÍG£cu ¶´› άÂð«¿¾¥°Õ”RÈsº#ÉEAшq»ÅÀF“„€·Î—_–ùï${`òÌhÁÇ6ØÂ?ÔMco./ËHŒ·-ùiqµíÆ J³Yúc€³“”ßê̇W쟋1:|¤gÊ¿[ÞóšÞÖ+Ÿ>ÕäQ€ïJs›X•³™1ÃÊ'5q³ˆˆ$ð( »‘ðúcŽ6 pñõ,„%Ícz£?=ÉMtD5ß“ûÊع~)öÇþƺ–§®3¹MC_hj|RJêr_‘ÀtBßì;¶42ßg2÷Rãý³‚—7Ûíìa½u sÒké6œ÷ n ä:mtöëפä&vS IŽqKsæx©çñlùRú@O# »éûÿ×=Fð\”;"Å"ᤠjm‘±áì(…Ü•À˜SƆã€E£x¬ö é¥ÞvÈ}•:¶éÔ:_ŽÈ è…aÌt}ÙÔX­R"ÕñÞL£maBQ[ÚC ?¡ªqœ)% ápí2PÙ÷ˆÐ;ã ¹,÷ضŒQD_åê‰)Üeû@÷iQë­HRA4Ü<å¦Íܲۊ~ã“Ó.†IBU‡#Ï5wJè™…žb'—)öz´6’K¡bge¾ŸÅ[òQ"M¤çyqéø²HOžø— æô ¥lܪ=o¼˜ÆÌ낹 ´{͹ÿ䙳1ùÆ•Vs¬ ¯Ây†êý%qñ‹V¥4«5†sÛ©M¶KÖkøUÕ–-y´¬Æ¤Òž,G2UUƒù}@K`Øò¯Ä©ÄfúˆÞÎw3@²Xö+õ.,R-–Üø}7~Í®mv8|9qE1D:K›ú ¯ŽàâgÄEd>Ω]†~¦sûwž~ºœ÷—XòP ú>Ø$ç܆ðž ïªÆçÓ ç5–$ß~äÀ?½y¡×9âbøs³”+²·ï™ƒ#µîý?ðÎ"N&hWz”–öb5*£ËA'ò>%Tˆ¢V#bá¹Ä"2_€5LÆ›; Bó§£zœi°¡s‘™—ÒÛȰHB:¡~НêÏ@Ãm÷{ ºhWÓʶwçÏŒ_W%ÂîšK¨®0›ï:ƒƒèÒ¹JÇvÄabà…Zy’`/zJ%žÈùîôwߎM4zØ—ƒ3ËóRÐ…œ+ö&ÇñuCK{«©v>ññ–QÔZ¹6žÁ÷ìr¼Ë gê±Pןb{Öß]{"–wß9øg}Y~2üð¦iï–=q ÿºÐˆCh`îzb¤ )âN¾mž&S¨4:€çl4ŽÈÏ(/¶?4¨r¸.^ùÆ:p?8õ;¶•Øq‰g.7Ö¤I«býЊ!Ýóºî9ÿny¡aƒ ºÆö#wï[X¶ŠvŠPšæ­÷#&6ü8Sä¹$jÛÞA¶Ƙ8§{ß:QE<¿á)±é9ú‚VêsežB¹q2ÈW,c¾I ˜½x*áä›t°£ gæT#¾¡c¹*ª`ôÖZˆZ¾i~ݳø½úC%Ý«åöU—6*ÿƒ9Þ»©‘S( {öY°sfíÃêûØà>u+²£~Áúï /?íÞ°^bPl@ð¿¡®‘¥ÛnFýªá·;²†W7†Köp…F^¤Ú¸ ÊqpÀÇ@;À¬x«ýòÖ]ÚóR{ªÌý¾QU-Áûú;cL @1[È #4 o%NE¦™Ó₹¦™~ÖáP5-õ׋f„ß\[ˆ9=õ™'%úG$S·Š ¸I¦Ù<Ó”×läæ ÏYêΠM¡9,n³€Ý%ÒA°Ò.rVL‘#’ݳ”lZã»&ó´—ÌΪœG.»q¶ÏEC¸å¼yÅàȲ8#™¿™®9}¤ç‰g44â'vƒÊD¦É¦áÛ¼4…6¡Tµæàž§ÊoØê«hûŽðG ¼z!uBœ$êsjüc"Ô™Ü]w×l%’ü/³š}”X=¦µŠ€‡z¾(’ÃÈ †=9æ3þÆæÂÒš†—4‰Ÿ ÂQä&K÷T47 Ê÷e/þÔqÑl¢10PÜÎwDoš¾âDÊ-_æEßmì$×{4 Ÿñüšˆlë»p›Röšö¡0ÄÆ±7Ô²c#Ã{ÒY­Qp«¢‚&B»ùÁ7ŸèÒÑc¬UüÙúì!„?Ýrä¾RëÍÿít‚L®ÅYò6éŽÙynÛJꪔõéM]‰WNíhÁÍ_šß¨ [ݤ@Ú}~ •ÝǶó&Ï¿¯d+źƒžAâW²ãÜ’Ó)DW8¤Á£Ö¥ÎÊ5ÜÃöñZêÙ!* CQÅÏ\a8D«×ÈW»€ˆ›iMIäÉ¡è xR³/ÌA ع‚êO©ë{}¼<‡™c¸½ÜàŸU‰Õo*.óÙ¤»ØéCá !Îß,Ä ¿ß!·T{Îþà²OƈuË2~ðoŽӨýÎÏ#«sŒ…wƽ[ýR:&4}B¤úKò茮ò|Õ²EÊÜUîÄ^¨.S]T¬/¡«=)–ç•ÍTG%ÃY©CU;Lžî3Ř”Yur» \á'!­þçÌ\³·;˜Ìä& OÉ€2˜Á¡wý;kGÊkárðOJN’:ªPö~Ê$-û•q¶úE†¡/è” —œ?ó˜Š3¾úÙ» >‰Ï/w¾Ov$J´4E‘ðhQÎ~©F§‚çü)»ót8#­ÐpNǨPA»Bùb·(P2+$íÁ½gá´ñ¥L÷ù2¿Ž¦ÚŒÁõŠCYSSµ/&œ°º=o­1‘ööAOÝ>ñó®ÅaºÂ.©ˆ¥Ô^B¥³ïX7É2¼ÄÐp´Ú¤uöœ;þ¦Ëæ[¶HÙïüï̴Ѽ"磑;¿›³´wàf^P¦}äÈ>Ynýr­Ù¡ñõ‰þb_8ª¥=Z‚c½Êx-…Ûòk\"j/"5yyñ@²àrVÂ+SœL†<^éªLL?kî ͘ÍL)_¡²£b‡H#:@›oøÂ,j¿Pvïʘ¾E¸’û8 à+/R`PÄ-p*•¾ÒÃvËz‡Ö>Í>™j;…{}M8žò…Fælj#)Ò8°0«™úåšÁÕï>áöKú¥†OˆÞ椇‹þ¡X¦Ám'åì ªA0½iËíNEÝ1aV¶¨&Œí@ó(ÑcµísÅgîböŸð+™„+/XÒ yÉ%û!Ã|º_LâɈ´òÇÍÊt7Ép¨é¾·¼’ÏN—˜1ƒÇ²Ÿ*·m:*ud¦Ük£ëÎÎKEÝ ð«}¶ Ô×IÉÉ©“ ZK^ß1x¾ÌàÆ¼!½ª¥ý\2Î[ôÍϲÉï=é^ÔoËYm¸%gÕ¶»3ÝæžZ-/(€Lª6+×E¿o.L­oYèЧn/£â¼èó}¦ìu>QYê‰âH¾Ç8ó½‚a9€Z®É¥\5ߣÝÜÕsÔ’™µ°»6¨BQLùQ¢7‹u¸^÷ì7I•€ñ7Ý¡ù'-Ëî,|»bˆÍÊ.Õ^lÝ·ÆÌrqĥͫK+C´¦¾ž!k…øKê·,º)o{U`ž¸uÖ \nJ8†![Áèø‘Æ:Uˆ•ÕfÔ.ÿE¶o£œ* n· ¸5ñsd½°ìë¶Sº9rp ˆ±MJõOãΑêÎ gª°… îãó­ÑZ/‘ÚS#ÊE4¥»¾ÍZqù’ªÏ¤V Ââ.éðÅÇSÓL2Îueó,µ »mË¿ °Ó®Ê Ñ«®Ä¶kxÅw‹jDOO[Ä R”Ж»«¤¼õ»wðU~•–2ôE€˜'™ðëQïþièwÊJðÛ„ñZ Ô‰ê;®¾•Nm…P°7#Q;*Ç (ÔþA¹ª dÁN'%r ¶$pxå„axÒGÐå Oo¸DDqð]ìÈ$uG>,-ë&fúe'Ê$ópøgö¤Ù>Yöo§Hªá2\£ûÑ.¦0¬¢µBˆ%è2¿ãîÔâÀXI§N?½ì+ŸxÇ{Qo¬=‡Ä»¹Š#äÎOC/Ûˆ«„—]Ó©2•нRdbvEá9cœ‚ds‚\ø¶«ó„ÛÓ RšBCµÊtlÓAá£ÐüÉz0F1´©Û¡æ9fsî°k?ñâ=bšé25".„ÆmH‹ÓëÜÏ­g(ªæÄŸíüåÒ¥¦ÎXÍÅöö„ÇôÕ Ü@6öF®Òl©·ož2søÖÛ"žÈ¨ƒÁ/mI*Ó>W¦;ìùÿª+ù¢e9cüÕø¾óók\ ºß¯AêÅHä.vBùðð(¢øo½Þ+9º¿¯Ð't¯îª Šloë;Lw¯ ~Ž0òÑ*¾ÔLEˆc6‡h£QL=¦Š{˜Kª›Ç–ñÖ®Ü9„œ¾Á+£ @ÔÀEYS\!C ¸S3úl¡°ÅЉ‡tîÍ-¡×ð÷ƒ,;k+µýàň¹‡ú%«õ_*&êQ”F…qI¸ÉУ|ÉšEc²ìtÞë₩ûÌ(÷Î|f¿2kÐΡI¡í‘)•ißi¼ÿœ*Çó}\”›êšf§¾4˜]© •ÑÕ ì=¦“«šù<…ÎçY¤æ÷‘ n nx)öÎàЪ²óŒ„(F®L ~=ÆØQb_»2€¤€,³õæë]1ö4B¢49ÁB`†¶¸¦hc†”³”sÆâ§ ³J9f˜ÝPtm2=™MÙ…@F-'Ì,}¯™×ýã³y4ÑÞxŸÞ^I°Ík×3ï»XJçfM¥ÁdRd9šý) î,ìm9ý&|;©Ö–Ä|&9[®s§· ^[FÖ}P˜7îÐ~¾q“@ ˜ùð¢âxzplqŽð«A¨íLÌ9@¾Ž;˜ÂOÈÉgðÈ_0û›AîÍ R“°U÷Ê]K+EýØnƒzZ ÏïȈßWJJöÖŸËš™“¸É樗-_Fµêò½}‹E,6À¨„¬¡•…¸š“ÃÈ‹¢A Z/²ë§˜›–Ú“ù#!eEIt‚¿Bà É.‡/+ðæ.{ ”ÍßX=V¢‡qNTÑ5»ïóL‹d­”½Dƽ*4ÓÁ{-~Šl 뙃¹G*{Ògv»“ 2ÄqäMµè ø‰w†b@ä­‹ZÞ={Öq°þZ‚–<Ö×êT+ êq3ÛëwiþÁ­™X0f«yk1¤ jh,ötƒŠ)oF¿ûà:Lðù+ E~K|?¶¦eVrÀ·Ä…ÀgÁ,ò°¶j{ÔȼÜZì!üZªyv˜¹ R~Å·þ*øÕœé3ÀQδR*MÊRzË–™y†²FrÿDônqÝ-=4,«Zú„´T~ÒH>W³Ù&ßÌß2˜Nü1ΖïšÔÍØîñ½nšg'8?¯HMMó\¶©_QçÎÉó!ʼn´ù” ÛIÜáÓ'žÃŒÓDü/[qÐwöÛ{Òø|mɨ®ð;Còõâò_od®!¤{X_”w:(è¾Àq~“÷CÛ¨š~o1 ùí¸7È&Ink.ð‰zÃN 4Å€V"Æûþ1ù‘û‰kÙ bª ~wÔüŽ³Ð¯=ZÊKu‰øgwj]U¢ÐtJ¤fí };2³L &&áj<&‘£ÐÖñû\<K‘Ã>iDþ0pöúQÃ¯çžÆu¹$¶¥ô{Ê š‚ÞMü.ìÏiÝÞGÅ ïË•tÖ.a>À7˜Ã±f‰ß€¦a·ÓõSÏ8š+ê\jèîÐâ%ÌáU›¼£¹þgK½«‡¬®ñÝå%BG³i±þ7J” VJOÆ€Xv€‰P[Ó®L%Zç$M\rÂ$AÌA„Ù¹ÿÍü1cЬ«ïTX743"÷Å\uCùK1–0P¯ ¦VwûHG5…Æïú*ùìø¶ÙIÍgjR؉Ô`2årv¦~r¹Â8*KB›Sw“'Xu%ÓïÎ ŽCZ¼Ü‚‹>ú•k‰ºf Bº¹ÔÂJÀ–^üÔ"#ŒÔZ$SLŠÁ)L~j4 œsá±#WD~[(-þ[¡$`d‡ˆ¶ …Æ2QìC¨Ý{5-7þµh¾ Áíä›ôšhvKÙþËáGõ\&.Ïr—ß–¼ÌØSËŒp"Ͳ³G§Ž‘Ù±1þ­‹G2¾¦|À¥Žî³wu`˜êûƒh"¥”¼®·—9l˜œÏs{—@±É3 ‡Ü‰{’ö«ƒâˆõ›>Ù¨v¾Èæ9UÜÕ9o~ç%_ͨn³mt³€ ѽQØ'V,\ôqJÇÀˆ0ª5²ú F«p¡òj°»íŽúÀÓ\I>oQȈnBŽ¥Öó©‘KÁ/Ý*˲Z ºùås[²‹ÔÄD¤îÚK8D‘“©×Óé9¼ØŒ¹æ]N¢V7¤r~ÄjÄ ô[.Ð^æP³Š¹3L…Î%Íý¾Ãƒ‹8¦„›ÞPý¸þŽ~¥pnïâX< ¢¥?#rž€ºHÎiÍÒÆŸH/œ¨÷­× A<‘g§ýÊ|– ØŒŒ5_7•é•Þ•‰Ú—·¶#߯¤9ŸÍ£ƒÿ0C˜®df‘p@éè…±B©fÆtš[Æ•ã:Ía…„M ¤D;´öÙ'AÚŒAŠÎ;ϰwÞœÙÜçÃOÅ´¢ä”ÆþÆïFG‡üIœ#`ÔOîÓb½ÛñEÑràG$ߔ˗°Øk‰›AƒnIy1¯kyK™KáOUí‹ òűtàÃ Š©Í1e_±1nPŤ¹Ælà¬5Ä7v«á’Ç e@·P˜áºRó>….LÅé”qB1­Ù>uÊ“†È²’vÌJœO^¸¼ ÑÕ€_(·¢’è<9WÚÀ°½Ž2~Ûó½]4ÉÄPäôòtU+ú/Šà22³Ç™ë!橱ocy”³VY“µšéõ®³€.ŸÌ°¼ŸšÇ˜ñ]MM måÜ>{ßBí Æèš‡|ß îéVVÚ®à½>Òž16æK¥ ^ýu?Gò¾Vž!pK)4½©7ØÛ™§YúN .zØa 긾í7x­<'ŒÝ™êžs35 fÛ£ï#•7´¬Þø§ 4íµí%ÎzñꀻNÌõñ£8NACU<íiëõ@ÈDÌÐ;3k¯ˆ"ü—%:W\™Yü«1f^ˆ[n#b¨Z6V0Ì›¢´¥ä™DéRâ H=‹]÷=Î4Ø·ÏbK倷 ø}MM*tÕõ|´©U!êöu7¥Eí”%Z5qpƒ¾)x|`®#j—±ñvï{Ã¥î°%ÉíëM\HŸWï2,ø1l»~ÑDYÜ3¯€@2\‡vqÁEµŽšV³*y²c|”]»tÌF_…úÛ^“ʯ˸C¢ì(¼* ý)¼éáZ"‘)3“èê~ui‹×釛øøF¥ó&àH*ªÞ·Â£—¬ÿ©ÒÔþ)»À«¡|¤5÷¢mhÕ”ÅsìÌìHXÏÚÛÙ}¨EøsÞöRò}¸¯Ý2±úwIË÷öèàú£êË­«Ò'&zL¢“¤¸} ŒÛ*G ¤¯ˆ«£¡\xªâ£¢ËªTgÇŠy±ê­"‡tj‹üUðU³]/Îê_K=¶vwEaWÑiN¦n}ýù ƒËLr!†m+€øøm=pžß¨\Mñ2¾ 5LÀEs¬ˆ$ò¥ÚdmÉy;¶±áCJnöf fs€3àÔæCä‰Q|EÝD]ë,5Ñ^šL}r­Õôd‰%¥ô¿¬¥ýÉ‹£@¥ºhvåŽVÈ·žeã! aö«[žAÐâ²+¥”xŽ:¾z¥Ôí]°ªJ­oõé±WPì—ís3.÷Âýó}£æ5i¹œ² TCîqÕ*óþÖ y„jàfdÿ°ÜÓcqy%ƒ%êÁRÝ3—8gÖ•êeæñÆDénÛšR§B'a+…‚«dÃiÀ~!núŒ¾±.±cˆÈ¹–å !Æ¢/ÿyÎÝëÑ.ÒÏ×Ë!9ä~ »ýW*y!:?`™Z(û+ØZ™l4¨ëg¤=ü÷˜µÊ7A®"‘ïß~ø ¯#Åþô3ã/‘ÕÐoÕ¿žw\?¼|ñAûb@ŽM¨O0§ýLªé~þåxú€õ'÷͆bF¡ÑüôWˆ#¢UÿN ŸêÞâÔ_¸eökrÐʲ.ãgºMÀÌ`£@L[Õ­óÅ@„ ã†õ*ìÖ¸HsbÖß‘¿áUÒŠ‹@Ää;VÄvÚBس†ë˘/B^¨Lû\gð Fâ¤Y؃epH‘%÷6nûi`à¿ë}›ÝûJŒ×ÄªÆøÆ‘ÆË'ÀÛý òý])·ˆÈ›³=Z[z<Ô^¤Õ‚Z³GŒH–… 5ýÖ5^_ Á¹f¦PUÛVðsÉu|s/ÈÛÑý¹uukæÄ Wªö6Eä +¤ƒÎÌsœ@tY»µ?+}ÿvƒ|OÄ—ª¯¾ö1ΰ`ê–ÌCg?ÿW™á#úl¦®¶©þ-û¢Ç¦ /Aúc¨­ògMUÑ9¼²æ3¾–‡ÅÊ›Ö\,Ö8}Ú‘6nˆ‚Ï›dyˆ\-ÆÇ9®LÅ‚=&>"‚^p?v»=†¿â$˜œ7©ñSÀå´_žÄa÷H¨æ5Uî ×1ʸ•-yiü­E¨l¦é:# &öãO±‚—‘éw.q7ë§ë ìVFk_tºƒÊ“gšP¼%OIIy“©þ®¸åçiT öR‹MCá!²úßP»’õªFšå™P|±õêÈT›6Á“•Q²å€ÍIn)B£wÑty(cêêÜð¤X)5ò屨–s+hžç'>‘ ‡ŒŽ‡áú0Qºfb1’ ì¢S’CfåøÍ2ÿxµb™C1bZ绡²'Æ»cþr…%£6U-¢Ô¿šõ¹~F囼–ýîÖï69G\+X×ÎWÆúVYÜWM¢§Úa…7½1\ s’Ïû+£sÉ‘í;‚£“gýzU$L—Î oªÜbIjØ"cu*7[lwp“¥ñ^ õÿÇ!X~ endstream endobj 113 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.16)/Keywords() /CreationDate (D:20171030183712-04'00') /ModDate (D:20171030183712-04'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) kpathsea version 6.2.1) >> endobj 2 0 obj << /Type /ObjStm /N 95 /First 742 /Length 3230 /Filter /FlateDecode >> stream xÚíZYs¹~çWè1®[AûV•š*/±“;‹—,“ò±;6à™Éýõ÷;RêãdÞ¦ Ôjéè,ß9:’@’ f™Ì1cYdÞ2)XÔL⣓<<“-¨ÅÀ”dJ‡ŽRL9Ôe*âáÀ&¢Ê´1ÄQ[<4ÓZ˜’iÏŒÆ#@ú#3AuŒbÖ£_3a(­ež¹…óÚ1° ^3ëXtÐNBAa™…6Â8 B“GúZ¼€DE<#LÐÐLÁp'`8XBò,ú]°D– ¦ÈB­h¨” >Ñ*æžQ1t)d¶K‰w°–°¬•„}ž€†Tz‚@x§U†E;Ðð"° ˜‘P*Hf<„]+A•,`É€Åá=BUtÂ$§0®qFŠN„êFFÕ„g¾Sä4àìM 7j(Í%Ðò¬­gº1h \  Üáßà¼èÝàÁ×’TR@ò‹tàt£‚>R¡;ú1‡tV¤ñR #À'p^ÄH7ÄHÀòbBªÀ$%HáH¾@EA3I kH´ÜˆÔ òº§šõ)¨Ï§wŒ:ID-¾,)B¨‘‘›ð&bçÉÆO?Žßc&ÕÅ´?våûí·Î£çÃéxty›Ú¶Ö«L|z]±«qïæš] z“É úÛOó!3 GÕôzt9a£Ïyì†Õ²NF_+¶WM{ýÁšA3iÇÕ͸šTÃizHèÓË«j²Þ4]ky;˜ößCAݲëĵ5g“Šíö&w)b2åNÿ¦7žö§;X­ÌG$ÁŽßïOÏiÈ“'~úý¦büuïªêðÝÑp &˜dDØáÇÕdt;¾¨&”VRËQuÙïíŒþf©ÁÑœŽê¼cŒ¤h&²šw!òý‡ß™]J ¶‹€Þçëèb¢]|õë­1]Ó’¼‹Á´¯ÒÏð¤Yœ«HrS×ÍÚ\Ç|A¨ë†fw®##Z1£w4û©iüõxtqRMÙG ½·Ïøiõ÷”ÍYékÛn€rƒ5÷sCƒ.&BW m¯A­Dª@§D­ÄvF~§Ú踩“÷C§AwWì-b‘ëF{ŽÆo¤üÍ¢´ŒÀ22=-CËЗîÁàìRÀ–î|¨{Â’{Ü&îáÛÃá|>Ò®ƒôh‰KÝ~rûišÞûÃ/¾3_VãÄXžógü9ßýH&‰sÒäH‰Ü 3õ]¥¶]Z×΂n›ÝwÑ(éïBþ¾!Ô&´Úw±ø1¡q0ÈošçÖÌÞ•ÑtwD|ôAwýyç£u±‹¨£o!"ýâiŒ'%Si±¿IíØAF*1R×uê»ï·KÚ¡%žØfue]æ–àˆ"È@-Zt±ƒ ²Kx‹ºW%voÐ, € O#£(]”Ý´¢‘§ix Â\NÁh§Õ‰3ßׂ¥ ©9k‘J/T7Ôš»¢Þ¶Êbd¦VJ«ëÊ£®­¬GäÖIcáæ-Ñ"Âg#çÔ™Âx²ÝØT&ß”½«T'¿âðòï÷û‘|lµJó>•E‹AX•­:Eo.s»ŠŽ”6<Èsb6ºäŠx¦9ª¼ï†Ù“åÒ§ÒBÊ¢f4OІ(ÂÙH¦°Fü¡USÂsižÑTЈ‰ÒèHYú`"Å^ 8Š^Ðtšø8Šygh  >oåè´hBÿ@6e†lQP¤M¼¨¶§yU–8Õˆ\àÐM-Æ ²UJ:qT\(Y¢=¦Æ§ã#(p§>Ì´Lç€h É8:$lõï,ø‡g€ä5m)þr=罟)kžEé]›snñ†¢Í‹”ÜeZ°w>åO«Ò¡L™étH3OQ4§œ©(†XpJ\óøZ‚JYÝÑ\¬%dÊTÆH|ÊšzŽDZ1 TJ›r‹q"}o¹wÑVŽ¡V•òGiÆ'½J\?EËži–Õ¹i6Ú9Òɤ%Ð4CÒœµ9/eîZ§ì@eÎ5Z¤^Ê0­/哿{zS ©y>Ši­”B&ÉKÍI²˜E­¤*SÅ"ÑÕ}…z«[÷UKZd®Æ§¤í¤4*R0d³l99Öá•v D§]vÂÂN‡@‹)©%>¹-­¹çmK½¥Iüm†S 5oiçM¬†¶k‰Yí¢^x/µ6|ªÔ Ÿ!~„×ïoN^¾y–ñRkðÒ„ý«ã¯ÁKĵxíð]`v€ö?á§ü ¨]Ôh}Æ¿ Ù  YëqUeŒè˜MÐ9;Ø}st’Ð9}¾.žT¬ãIyŠ'óP|SÍòkê%nø¸a–ÛĬãwÏwŸžÁ¬£µFáàž&üÀéúžFyUؤeiÓSxü¿­çưödÃÀ°‰G/öž¾NúÕöÉYðò™äZóKK¢ØÄ’Ýg¯>ü7Y²³ÎWÒÎPºŸ™ eJ½6ýÓR´QÂùðöäÝÅÞñ:sŒ˜…žˆ?ã›y¾qq­g¶ë„ó”ï#éw=JÖ¯®sòy[¤íÁhX$ïêÛmo@I‰>}NŸÁŠ õÿÒÎRw$ö›Áí„ãßnGÓ*w,%³œðùwþ¿†6Jkûž¾N>X3;”ŸM¥~‰ üz*°¬aÍFÙìõ‹çGo`ÍÉáééÚ$MA¥éÀ“þÏ. ’²a½Î RJµ¦H¼GPí"”(h*„ÂÕ¸êÁ—‰¼Z­ñòøå§Aíï[þ½ÇFÉïýÞßíïîZ²"ý /)cx»€Î~Xú3b-Ÿzµ ózsÞüþ|ûlæ¬_µ‡«ùEÙÜ…;sÆ"cb£ò²Î«7x‹mÊ|‹òmîgšÍß›èl”N϶O_ž½%tÖ†¾É‘oõOEþfÙ”6p/jlNE ™OãÞÅ—jšB¿®çà_N®3à¾Ð-M‘¥/] Y ]ñw5BçÞ¤J^,HÓMô§Ñ~<™’¡)Î{õ‹Tx{׿œ^OèòÉÆÂÛ»ï–p»$Ü–Â¥Ÿ rsá˛ۖxß}C¼YØn|kÚÛÂmh/€÷› om›²£lËö®M/3ÑbsÑK;º–ð¥ˆseĹÂnµ¹ðÖî«%z)Þ(%Á®ñöÛ»Ž–è¥X3±m «éË;„–ô¥`Ó¦a¸\ˆ@Ši/ÈMátI¬ »(ã-½ÍÄ»ÍÅ·жøå·Öøø€,ÓZ ÚÒí /<¿bD—&t;à²0ðEÿr2¿£Sß:©/Cä?´[ÿö¿ºúCb‘`Ù»I>Óõ½‚óÙÀ>–0º>™oÐ}ÊT«¯Ð…»ü>®þ¤Ëu¥Îy¨ž¡Ê”#ÃòHg#•[9ò%ý[®ÕŠ‘v>RÝ¡n(Ù¸Â33ujdT‰ÌcÕ’%g²dhÊrËŠÉ9޲‰c(Ô’ª¡Š(T™½ÔªÈ÷9ÔR¬âž ]¥ÖhwZ%è3dg '¥» ­¹cäjI‰{#h㇠´7ºx|2í§[ta—BüÑ ¦Ý!1ªxW[t_wñ®·˜+éÍ]¼MïÅ]Lg ?ìíO[â ºó¶VÅ Mßd ¹J7› ZÛº©uSSÊí`*—éÓ HåÛ š´©—µn]‘Ô…ô¥:2.‰j _9n.4')ºCK2èm~Æ;!¿‹#2*H¹bUÞía?ºêäT9¿5K|E %(¤œÇáUu4º¬øÙ¤ZdÉW7Õp;©@7Çkaÿ?˜… endstream endobj 114 0 obj << /Type /XRef /Index [0 115] /Size 115 /W [1 3 1] /Root 112 0 R /Info 113 0 R /ID [<890A5A5551421B6E018C8B9D32544649> <890A5A5551421B6E018C8B9D32544649>] /Length 281 /Filter /FlateDecode >> stream xÚ%ÒÉ.P€ás®y¨ªYÍs‹ª©¦–š«¦ÖPÔ”ˆ…x ñVÂÆ3ØŠÄÂÒÊ#x‰á?6_þäޜܛ‘'âD]ìE¨8µ°9 °y-(„VØ…"(†6Ø(…nØ”AlÊ!iðATBŠxí UP °ë°K°‹° ›Ðõ*ž[›â‡yH@'´C“ŠÿÌ®4C–!*g;í‚^èƒ~Á„a†`F`"*áW›2¦rùe5®rsg5¡ò±šTy¿·šRùÌZEU}ÿï‹©ž[M«^}Xͨ>„¬âªOV³ê\ÂjR…C8‚c8SuÑë¿}I¾É/%æ endstream endobj startxref 149972 %%EOF graph/inst/doc/MultiGraphClass.R0000644000175400017540000002027313175724645017632 0ustar00biocbuildbiocbuild### R code from vignette source 'MultiGraphClass.Rnw' ################################################### ### code chunk number 1: loadGraph ################################################### library(graph) ################################################### ### code chunk number 2: creategraphBAM ################################################### df <- data.frame(from = c("SEA", "SFO", "SEA", "LAX", "SEA"), to = c("SFO", "LAX", "LAX", "SEA", "DEN"), weight = c( 90, 96, 124, 115, 259)) g <- graphBAM(df, edgemode = "directed") g ################################################### ### code chunk number 3: nodeAndWeights ################################################### nodes(g) edgeWeights(g, index = c("SEA", "LAX")) ################################################### ### code chunk number 4: addNodeEdge ################################################### g <- addNode("IAH", g) g <- addEdge(from = "DEN", to = "IAH", graph = g, weight = 120) g ################################################### ### code chunk number 5: removeEdge ################################################### g <- removeEdge(from ="DEN", to = "IAH", g) g <- removeNode(node = "IAH", g) g ################################################### ### code chunk number 6: subGraph ################################################### g <- subGraph(snodes = c("DEN","LAX", "SEA"), g) g ################################################### ### code chunk number 7: fromTo ################################################### extractFromTo(g) ################################################### ### code chunk number 8: loadData1 ################################################### data("esetsFemale") data("esetsMale") ################################################### ### code chunk number 9: dataFrames ################################################### dfMale <- esetsMale[["brain"]] dfFemale <- esetsFemale[["brain"]] head(dfMale) ################################################### ### code chunk number 10: creategraphBAMs ################################################### male <- graphBAM(dfMale, edgemode = "directed") female <- graphBAM(dfFemale, edgemode = "directed") ################################################### ### code chunk number 11: bamIntersect ################################################### intrsct <- graphIntersect(male, female, edgeFun=list(weight = sum)) intrsct ################################################### ### code chunk number 12: removeEdges ################################################### resWt <- removeEdgesByWeight(intrsct, lessThan = 1.5) ################################################### ### code chunk number 13: updateColor ################################################### ftSub <- extractFromTo(resWt) edgeDataDefaults(male, attr = "color") <- "white" edgeDataDefaults(female, attr = "color") <- "white" edgeData(male, from = as.character(ftSub[,"from"]), to = as.character(ftSub[,"to"]), attr = "color") <- "red" edgeData(female, from = as.character(ftSub[,"from"]), to = as.character(ftSub[,"to"]), attr = "color") <- "red" ################################################### ### code chunk number 14: loadRBGL ################################################### library(graph) library(RBGL) ################################################### ### code chunk number 15: createDataFrames ################################################### ft1 <- data.frame( from = c("SEA", "SFO", "SEA", "LAX", "SEA"), to = c("SFO", "LAX", "LAX", "SEA", "DEN"), weight = c( 90, 96, 124, 115, 259)) ft2 <- data.frame( from = c("SEA", "SFO", "SEA", "LAX", "SEA", "DEN", "SEA", "IAH", "DEN"), to = c("SFO", "LAX", "LAX", "SEA", "DEN", "IAH", "IAH", "DEN", "BWI"), weight= c(169, 65, 110, 110, 269, 256, 304, 256, 271)) ft3 <- data.frame( from = c("SEA", "SFO", "SEA", "LAX", "SEA", "DEN", "SEA", "IAH", "DEN", "BWI"), to = c("SFO", "LAX", "LAX", "SEA", "DEN", "IAH", "IAH", "DEN", "BWI", "SFO"), weight = c(237, 65, 156, 139, 281, 161, 282, 265, 298, 244)) ft4 <- data.frame( from = c("SEA", "SFO", "SEA", "SEA", "DEN", "SEA", "BWI"), to = c("SFO", "LAX", "LAX", "DEN", "IAH", "IAH", "SFO"), weight = c(237, 60, 125, 259, 265, 349, 191)) ################################################### ### code chunk number 16: createMG ################################################### esets <- list(Alaska = ft1, United = ft2, Delta = ft3, American = ft4) mg <- MultiGraph(esets, directed = TRUE) mg ################################################### ### code chunk number 17: cities ################################################### nodes(mg) ################################################### ### code chunk number 18: DeltafromSeattle ################################################### mgEdgeData(mg, "Delta", from = "SEA", attr = "weight") ################################################### ### code chunk number 19: nodeData ################################################### nodeDataDefaults(mg, attr="shape") <- "square" nodeData(mg, n = c("SEA", "DEN", "IAH", "LAX", "SFO"), attr = "shape") <- c("triangle", "circle", "circle", "circle", "circle") ################################################### ### code chunk number 20: nodeDataVal ################################################### nodeData(mg, attr = "shape") ################################################### ### code chunk number 21: edgeDataVal ################################################### mgEdgeDataDefaults(mg, "Delta", attr = "color") <- "red" mgEdgeData(mg, "Delta", from = c("SEA", "SEA", "SEA", "SEA"), to = c("DEN", "IAH", "LAX", "SFO"), attr = "color") <- "green" ################################################### ### code chunk number 22: mgEdgeDataVal ################################################### mgEdgeData(mg, "Delta", attr = "color") ################################################### ### code chunk number 23: subsetMG ################################################### g <- subsetEdgeSets(mg, edgeSets = c("Alaska", "United", "Delta")) ################################################### ### code chunk number 24: intersecmg ################################################### edgeFun <- list( weight = min) gInt <- edgeSetIntersect0(g, edgeFun = edgeFun) gInt ################################################### ### code chunk number 25: intersectWeights ################################################### mgEdgeData(gInt, "Alaska_United_Delta", attr= "weight") ################################################### ### code chunk number 26: loadData ################################################### data("esetsFemale") data("esetsMale") names(esetsFemale) head(esetsFemale$brain) ################################################### ### code chunk number 27: createMultiGraphs ################################################### female <- MultiGraph(edgeSets = esetsFemale, directed = TRUE) male <- MultiGraph(edgeSets = esetsMale, directed = TRUE ) male female ################################################### ### code chunk number 28: graphBAMs ################################################### maleBrain <- extractGraphBAM(male, "brain")[["brain"]] maleBrain femaleBrain <- extractGraphBAM(female, "brain")[["brain"]] ################################################### ### code chunk number 29: edgeDistance ################################################### maleWt <- bellman.ford.sp(maleBrain, start = c("10024416717"))$distance maleWt <- maleWt[maleWt != Inf & maleWt != 0] maleWt femaleWt <- bellman.ford.sp(femaleBrain, start = c("10024416717"))$distance femaleWt <- femaleWt[femaleWt != Inf & femaleWt != 0] femaleWt ################################################### ### code chunk number 30: nodeAttr ################################################### nodeDataDefaults(male, attr = "color") <- "gray" nodeData(male , n = c("10024416717", names(maleWt)), attr = "color" ) <- c("red") nodeDataDefaults(female, attr = "color") <- "gray" nodeData(female , n = c("10024416717", names(femaleWt)), attr = "color" ) <- c("red") ################################################### ### code chunk number 31: nodeSub ################################################### resInt <- graphIntersect(male, female) resInt graph/inst/doc/MultiGraphClass.Rnw0000644000175400017540000004412513175713336020174 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{graphBAM and MultiGraph classes} %\VignetteDepends{graph} %\VignetteKeywords{Graph} %\VignettePackage{graph} \documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\classdef}[1]{% {\em #1} } \begin{document} \title{graphBAM and MultiGraph classes.} \author{N. Gopalakrishnan} \maketitle \section{graphBAM class} \subsection{Introduction} The \Rclass{graphBAM} class has been created as a more efficient replacement for the \Rclass{graphAM} class in the \Rpackage{graph} package. The adjacency matrix in the \Rclass{graphBAM} class is represented as a bit array using a \Rcode{raw} vector. This significantly reduces the memory occupied by graphs having a large number of nodes. The bit vector representation also provides advantages in terms of performing operations such as intersection or union of graphs. We first load the \Rpackage{graph} package which provides the class definition and methods for the \Rclass{graphBAM} class. <>= library(graph) @ One of the arguments \Rcode{df} to the \Rclass{graphBAM} constructor is a \Robject{data.frame} containing three columns: "from","to" and "weight", each row in the \Robject{data.frame} representing an edge in the graph. The \Rcode{from} and \Rcode{to} columns can be character vectors or factors, while the \Rcode{weight} column must be a numeric vector. The argument \Rcode{nodes} are calculated from the unique names in the \Rcode{from} and \Rcode{to} columns of the \Robject{data.frame}. The argument \Rcode{edgeMode} should be a character vector, either "directed" or "undirected" indicating whether the graph represented should be directed or undirected respectively. \subsection{ A simple graph represented using graphBAM class} We proceed to represent a simple graph using the \Rclass{graphBAM} class. Our example is a directed graph representing airlines flying between different cities. In this example, cities represent the nodes of the graph and each edge represents a flight from an originating city (\Rcode{from}) to the destination city (\Rcode{to}). The weight represents the fare for flying between the \Rcode{from} and \Rcode{to} cities. <>= df <- data.frame(from = c("SEA", "SFO", "SEA", "LAX", "SEA"), to = c("SFO", "LAX", "LAX", "SEA", "DEN"), weight = c( 90, 96, 124, 115, 259)) g <- graphBAM(df, edgemode = "directed") g @ The cities (nodes) included in our \Rclass{graph} object as well as the stored fares(\Rcode{weight}) can be obtained using the \Rmethod{nodes} and \Rmethod{edgeWeights} methods respectively. <>= nodes(g) edgeWeights(g, index = c("SEA", "LAX")) @ Additional nodes or edges can be added to our graph using the \Rmethod{addNode} and \Rmethod{addEdge} methods. For our example, we first add a new city "IAH" to our graph. We then add a flight connection between "DEN" and "IAH" having a fare of \$120. <>= g <- addNode("IAH", g) g <- addEdge(from = "DEN", to = "IAH", graph = g, weight = 120) g @ Similarly edges and nodes can be removed from the graph using the \Rmethod{removeNode} and \Rmethod{removeEdge} methods respectively. We proceed to remove the flight connection from "DEN" to "IAH" and subsequently the node "IAH". <>= g <- removeEdge(from ="DEN", to = "IAH", g) g <- removeNode(node = "IAH", g) g @ We can create a subgraph with only the cities "DEN", "LAX" and "SEA" using the \Rmethod{subGraph} method. <>= g <- subGraph(snodes = c("DEN","LAX", "SEA"), g) g @ We can extract the \Rcode{from}-\Rcode{to} relationships for our graph using the \Rmethod{extractFromTo} method. <>= extractFromTo(g) @ \subsection{Mice gene interaction data for brain tissue (SAGE data)} The C57BL/6J and C3H/HeJ mouse strains exhibit different cardiovascular and metabolic phenotypes on the hyperlipidemic apolipoprotein E (Apoe) null background. The interaction data for the genes from adipose, brain, liver and muscle tissue samples from male and female mice were studied. This interaction data for the various genes is included in the \Rpackage{graph} package as a list of \Robject{data.frame}s containing information for \Rcode{from-gene}, \Rcode{to-gene} and the strength of interaction \Rcode{weight} for each of the tissues studied. We proceed to load the data for male and female mice. <>= data("esetsFemale") data("esetsMale") @ We are interested in studying the interaction data for the genes in the brain tissue for male and female mice and hence proceed to represent this data as directed graphs using \Rclass{graphBAM} objects for male and female mice. <>= dfMale <- esetsMale[["brain"]] dfFemale <- esetsFemale[["brain"]] head(dfMale) @ <>= male <- graphBAM(dfMale, edgemode = "directed") female <- graphBAM(dfFemale, edgemode = "directed") @ We are interested in pathways that are common to both male and female graphs for the brain tissue and hence proceed to perform a graph intersection operation using the \Rmethod{graphIntersect} method. Since edges can have different values of the weight attribute, we would like the result to have the sum of the weight attribute in the male and female graphs. We pass in \Rcode{sum} as the function for handling weights to the \Rcode{edgeFun} argument. The \Rcode{edgeFun} argument should be passed a list of named functions corresponding to the edge attributes to be handled during the intersection process. <>= intrsct <- graphIntersect(male, female, edgeFun=list(weight = sum)) intrsct @ If node attributes were present in the \Robject{graphBAM} objects, a list of named function could be passed as input to the \Rcode{graphIntersect} method for handling them during the intersection process. We proceed to remove edges from the \Robject{graphBAM} result we just calculated with a weight attribute less than a numeric value of 0.8 using the \Rmethod{removeEdgesByWeight} method. <>= resWt <- removeEdgesByWeight(intrsct, lessThan = 1.5) @ Once we have narrowed down to the edges that we are interested in, we would like to change the color attribute for these edges in our original \Robject{graphBAM} objects for the male and female graphs to "red". Before an attribute can be added, we have to set its default value using the \Rfunction{edgedataDefaults} method. For our example, we set the default value for the color attribute to white. We first obtain the from - to relationship for the \Rcode{resWt} graph using the \Rmethod{extractFromTo} method and then make use of the \Rmethod{edgeData} method to update the "color" edge attribute. <>= ftSub <- extractFromTo(resWt) edgeDataDefaults(male, attr = "color") <- "white" edgeDataDefaults(female, attr = "color") <- "white" edgeData(male, from = as.character(ftSub[,"from"]), to = as.character(ftSub[,"to"]), attr = "color") <- "red" edgeData(female, from = as.character(ftSub[,"from"]), to = as.character(ftSub[,"to"]), attr = "color") <- "red" @ \section{MultiGraphs} \subsection{Introduction} The \Rclass{MultiGraph} class can be used to represent graphs that share a single node set and have have one or more edge sets, each edge set representing a different type of interaction between the nodes. An \Robject{edgeSet} object can be described as representing the relationship between a set of from-nodes and to-nodes which can either be directed or undirected. A numeric value (weight) indicates the strength of interaction between the connected edges. Self loops are permitted in the \Rclass{MultiGraph} class representation (i.e. the from-node is the same as the to-node). The \Rclass{MultiGraph} class supports the handling of arbitrary node and edge attributes. These attributes are stored separately from the edge weights to facilitate efficient edge weight computation. We shall load the \Rpackage{graph} and \Rpackage{RBGL} packages that we will be using. We will then create a \Rclass{MultiGraph} object and then spend some time examining some of the different functions that can be applied to \Rclass{MultiGraph} objects. <>= library(graph) library(RBGL) @ \subsection{ A simple MultiGraph example} We proceed to construct a \Rclass{MultiGraph} object with directed \Robject{edgeSets} to represent the flight connections of airlines Alaska, Delta, United and American that fly between the cities Baltimore, Denver, Houston, Los Angeles, Seattle and San Francisco. For our example, the cities represent the nodes of the \Rclass{MultiGraph} and we have one \Robject{edgeSet} each for the airlines. Each \Robject{edgeSet} represents the flight connections from an originating city(\Rcode{from}) to the destination city(\Rcode{to}). The weight represents the fare for flying between the \Rcode{from} and \Rcode{to} cities. For each airline, we proceed to create a \Rclass{data.frame} containing the originating city, the destination city and the fare. <>= ft1 <- data.frame( from = c("SEA", "SFO", "SEA", "LAX", "SEA"), to = c("SFO", "LAX", "LAX", "SEA", "DEN"), weight = c( 90, 96, 124, 115, 259)) ft2 <- data.frame( from = c("SEA", "SFO", "SEA", "LAX", "SEA", "DEN", "SEA", "IAH", "DEN"), to = c("SFO", "LAX", "LAX", "SEA", "DEN", "IAH", "IAH", "DEN", "BWI"), weight= c(169, 65, 110, 110, 269, 256, 304, 256, 271)) ft3 <- data.frame( from = c("SEA", "SFO", "SEA", "LAX", "SEA", "DEN", "SEA", "IAH", "DEN", "BWI"), to = c("SFO", "LAX", "LAX", "SEA", "DEN", "IAH", "IAH", "DEN", "BWI", "SFO"), weight = c(237, 65, 156, 139, 281, 161, 282, 265, 298, 244)) ft4 <- data.frame( from = c("SEA", "SFO", "SEA", "SEA", "DEN", "SEA", "BWI"), to = c("SFO", "LAX", "LAX", "DEN", "IAH", "IAH", "SFO"), weight = c(237, 60, 125, 259, 265, 349, 191)) @ These data frames are then passed to \Rclass{MultiGraph} class constructor as a named \Robject{list}, each member of the list being a \Robject{data.frame} for an airline. A logical vector passed to the \Rcode{directed} argument of the \Rclass{MultiGraph} constructor indicates whether the \Robject{MultiGraph} to be created should have directed or undirected edge sets. <>= esets <- list(Alaska = ft1, United = ft2, Delta = ft3, American = ft4) mg <- MultiGraph(esets, directed = TRUE) mg @ The nodes (cities) of the \Rclass{MultiGraph} object can be obtained by using the \Rmethod{nodes} method. <>= nodes(mg) @ To find the fares for all the flights that originate from SEA for the Delta airline, we can use the \Rmethod{mgEdgeData} method. <>= mgEdgeData(mg, "Delta", from = "SEA", attr = "weight") @ We proceed to add some node attributes to the \Robject{MultiGraph} using the \Rfunction{nodeData} method. Before node attributes can be added, we have to set a default value for each node attribute using the \Rfunction{nodeDataDefuault} method. For our example, we would like to set a default value of square for the node attribute shape. We would like to set the node attribute "shape" for Seattle to the value \Rcode{"triangle"} and that for the cities that connect with Seattle to the value \Rcode{"circle"}. <>= nodeDataDefaults(mg, attr="shape") <- "square" nodeData(mg, n = c("SEA", "DEN", "IAH", "LAX", "SFO"), attr = "shape") <- c("triangle", "circle", "circle", "circle", "circle") @ The node attribute shape for cities we have not specifically assigned a value (such as BWI) gets assigned the default value of "square". <>= nodeData(mg, attr = "shape") @ We then update the edge attribute \Rcode{color} for the Delta airline flights that connect with Seattle to "green". For the remaining Delta flights that connect to other destination in the MultiGraph, we would like to assign a default color of "red". Before edge attributes can be added to the MultiGraph, their default values must be set using the \Rfunction{mgEdgeDataDefaults} method. Subsequently, the \Rfunction{megEdgeData<-} method can be used to update specific edge attributes. <>= mgEdgeDataDefaults(mg, "Delta", attr = "color") <- "red" mgEdgeData(mg, "Delta", from = c("SEA", "SEA", "SEA", "SEA"), to = c("DEN", "IAH", "LAX", "SFO"), attr = "color") <- "green" @ <>= mgEdgeData(mg, "Delta", attr = "color") @ We are only interested in studying the fares for the airlines Alaska, United and Delta and hence would like to create a smaller \Rclass{MultiGraph} object containing edge sets for only these airlines. This can be achieved using the \Rmethod{subsetEdgeSets} method. <>= g <- subsetEdgeSets(mg, edgeSets = c("Alaska", "United", "Delta")) @ We proceed to find out the lowest fares for Alaska, United and Delta along the routes common to them. To do this, we make use of the \Rmethod{edgeSetIntersect0} method which computes the intersection of all the edgesets in a MultiGraph. While computing the intersection of edge sets, we are interesting in retaining the lowest fares in cases where different airlines flying along a route have different fares. To do this, we pass in a named list containing the \Rmethod{weight} function that calculates the minimum of the fares as the input to the \Rmethod{edgeSetIntersect0} method. (The user has the option of specifying any function for appropriate handling of edge attributes ). <>= edgeFun <- list( weight = min) gInt <- edgeSetIntersect0(g, edgeFun = edgeFun) gInt @ The edge set by the \Rmethod{edgeSetIntersect0} operation is named by concatenating the names of the edgeSets passed as input to the function. <>= mgEdgeData(gInt, "Alaska_United_Delta", attr= "weight") @ \subsection{MultiGraph representation of mice gene interaction data. (SAGE)} The C57BL/6J and C3H/HeJ mouse strains exhibit different cardiovascular and metabolic phenotypes on the hyperlipidemic apolipoprotein E (Apoe) null background. The interaction data for the genes from adipose, brain, liver and muscle tissue samples from male and female mice were studied. This interaction data for the various genes is included in the \Rpackage{graph} package as a list of \Robject{data.frame}s containing information for \Rcode{from-gene}, \Rcode{to-gene} and the strength of interaction \Rcode{weight} for each of the tissues studied. We proceed to load the data for male and female mice. <>= data("esetsFemale") data("esetsMale") names(esetsFemale) head(esetsFemale$brain) @ The \Robject{esetsFemale} and \Robject{esetsMale} objects are a named \Robject{list} of data frames corresponding to the data obtained from adipose, brain, liver and muscle tissues for the male and female mice that were studied. Each data frame has a from, to and a weight column corresponding to the from and to genes that were studied and weight representing the strength of interaction of the corresponding genes. We proceed to create \Rclass{MultiGraph} objects for the male and female data sets by making use of the \Rclass{MultiGraph} constructor, which directly accepts a named list of data frames as the input and returns a MultiGraph with edgeSets corresponding to the names of the data frames. <>= female <- MultiGraph(edgeSets = esetsFemale, directed = TRUE) male <- MultiGraph(edgeSets = esetsMale, directed = TRUE ) male female @ We then select a particular gene of interest in this network and proceed to identify its neighboring genes connected to this gene in terms of the maximum sum of weights along the path that connects the genes for the brain edge set. We are interested in the gene "10024416717" and the sum of the weights along the path that connects this genes to the other genes for the brain tissue. Since the algorithms in the \Rpackage{RBGL} package that we will use to find the edges that are connected to the gene "10024416717" do not work directly with \Rpackage{MultiGraph} objects, we proceed to create \Rcode{graphBAM} objects from the male and female edge sets for the brain tissue. \Rpackage{MultiGraph} objects can be converted to a named list of \Robject{graphBAM} objects using the \Rmethod{graphBAM} method. <>= maleBrain <- extractGraphBAM(male, "brain")[["brain"]] maleBrain femaleBrain <- extractGraphBAM(female, "brain")[["brain"]] @ We then identify the genes connected to gene "10024416717" as well as the sum of the weights along the path that connect the identified genes using the function \Rfunction{bellman.ford.sp} function from the \Rpackage{RBGL} package. <>= maleWt <- bellman.ford.sp(maleBrain, start = c("10024416717"))$distance maleWt <- maleWt[maleWt != Inf & maleWt != 0] maleWt femaleWt <- bellman.ford.sp(femaleBrain, start = c("10024416717"))$distance femaleWt <- femaleWt[femaleWt != Inf & femaleWt != 0] femaleWt @ For the subset of genes we identified, we proceed to add node attributes to our original \Robject{MultiGraph} objects for the male and female data. The node "10024416717" and all its connected nodes are assigned a color attribute "red" while the rest of the nodes are assigned a color color attribute of "gray". <>= nodeDataDefaults(male, attr = "color") <- "gray" nodeData(male , n = c("10024416717", names(maleWt)), attr = "color" ) <- c("red") nodeDataDefaults(female, attr = "color") <- "gray" nodeData(female , n = c("10024416717", names(femaleWt)), attr = "color" ) <- c("red") @ Our \Robject{MultiGraph} objects now contain the required node attributes for the subset of genes that we have narrowed our selection to. For the \Robject{MultiGraph} objects for male and female, we are also interested in the genes that are common to both \Robject{MultiGraph}s. This can be calculated using the \Rfunction{graphIntersect} method. <>= resInt <- graphIntersect(male, female) resInt @ The operations we have dealt with so far only deal with manipulation of \Rclass{MultiGraph} objects. Additional functions will need to be implemented for the visualization of the \Rclass{MultiGraph} objects. \end{document} graph/inst/doc/MultiGraphClass.pdf0000644000175400017540000037661313175724645020216 0ustar00biocbuildbiocbuild%PDF-1.5 %ÐÔÅØ 37 0 obj << /Length 2573 /Filter /FlateDecode >> stream xÚ¥YoÛFú=¿BÈ…µ&œrH.ÚlR´Ø$k  ´ûÀH´¬Ö’¼:âæßïwÍAŠ’­öAæpŽo¾û¢ßݾzóÁ–])£Ëbr{ÃJUÖM\Q«¦¨'·‹É/Ùrª³]ûïá÷î-üù8Ù\gíÆ çÙÇ#ŒàwXý µ9.µðg¿‡?Ý^Mÿ{ûÓ›º™h­š²4xwåTi›ÉÌÔªn _ýISf?lálå’öw¼~+„Šxmduƒ°'…*ý™±ÊVÃú ‹óüÙ~™ÎŒËºö0•ßà¸ÈL/ºbô 3Ñ…²…#ôfºjTiìdVÎVx£§3­ó‘¼=ª2›3áô `#Õ9!YçZà)D@€þHäX`©»Àð#‘±Úzjß|¨'jœqQ×ÊÖñ™Óñ6rÜg´ÒÀ£<ò´4Y+|<…\U4þÀœÄÀtÍŠÜr´4Ör¸‚[áæ ÏÌÿ®=2¤48ÛÊÙ–k¤q×ñZ÷k®ÊlÅ`L | õè5aÞ­‡îgé]×åýc´¥*jw–øÉ‚/D½»pf§ ¨ãŒåzñ鵦RÎ-YÀ| ¬ý}Zº¬]v` èÙ-ß9³¶ÈÚ¼üÖΙ)À¿o<\"þïÙ?xRðÆáA | uíjÐýê*eѪ6z”at±<ƒ,i°ï 0Q"J¶·ø(A¿Øò2»cóƒsD¬ÍŽ{Ù±YúƒL•K©ªª\Ðèx§Sbf…ÍÁ16}Ñ}E•ëч-Fa€}’Å­˜TÓ¸lã%Šb*] HZÑVVáo¼8€Â;’ìät ¼V$ÅnM×ѱÐ=ŸÅE®„mxø‹°÷-‰¾ÇûˆØ=qìkÂ)œmùñ@L]vüFø׸?zOºýN60 Æ¼Ï Ò(òK óH„„¥=#b¶ÆfR´ó»À³ö€øn7¼³}ÿŠ8K<ØmSÊž¸{ñ•L'[ú%±’öáÍkY#2áùè‰'žšPE±¬PÄKFb›l$£cŒÚž… Ü V…€$s˜Çã=>:æ#2ÌZ“7q™¢Œ ©Ü)ðbTkŠúyZ¨cø†Zº¦x y¼mürÉS@×娣uneyÞ·ñeOÞšhíž'C@D1§2îãG¯â{hÑe ä)Rèù” WÛÐHvæ‰n x]žc…©sU×å5NB$€õd“8OÉœÊAÀÇXž‹Büc:ƒ4…$†”}VµòüFä—9éj\òé,éS¼¼ÆÐ=U̧6]ªkÖ[·»%º¤uÏ¥ïGÜpS©¦ ‰È‚Lë ®:l:H2ôLØ2²º¾6jé"D­-*ÉÞ§_ÇAî˜ÄUŒgcñ¥Êa¨SÂÚ)ç-yHö!^ëHD£B§yÇEþj%©ï2á¹L‘Â|û ˜¯‰–¿“À½ ~}={=Ŭ“pÚ"6ü~âû5:{òþBW²é ÜQ »÷Êq 5ùòÖ›0ž æûÄï>ƒÒU?ƒêlðî¯2Ô)ëLô9ÿè¼Ã Êšð¶Ð5R OÇ1Ý¡-“‚3͉ÇŃ¢c/ ïS¤UÙyü¢?’†Ð=HCD§À øŸr`3§†U*7 Õª-å+4Ø/EÆŒÒÊ6aO‡©‘ÚÊòS‚ÕôY¹øúö!¸ohÜ=ê ‰ æ“ä +ñk÷¤'ÔZOÅ(±t%8G¶y˜0¡¡Õ–¿‰\ÛŽc[•ºÓ¹ç³D2#°Ä†ó×å1­cFÜd£ò (Q’…½‰®Šå]»‹·Í)cB„Ž>=é(Ï®ƒñÓË!Añ(¶°úŸ°Læ©ì^wÞ6±¢h.JOC-dcùõŒâ_Mõ³ ¯dý¬ÂC¹­/(ï‰fj‡aœþ³ ô8œ@¡M¬èêz,’ŽÑMPíNtc)úñ±§/cÕ­ g©²¥v΂V@Øà£ñéP¶cë礕¶|JõMü†ëän5 29 Åb!Ö» ÉÑbÈq‡\Í{)Ù]¬|Ùîçd‹º2ª›äF¤œþ¢y;pò/Ÿ±†Öö2JxMU ’>Â÷ü˜ÇMšdÿ†ß{ùôšÓÜå—>ÀïóøÒ™Sÿ’éÿ<JTòf¬Ûú7àyQ5Þž.SpÍ ¸\f²ôOYút‰(¨-T_ã…Þ(AôÖàç½x-¾ºøª)¹ÑYÑŸÂ_§Œ¼6Gß'2Z´ny¢qcͶø©0ˆ`!Ú&7óøu/O©~=Äu©ñbtOx| ñSÃ4ß¾„ 3[hú)|½ S—1eÅ~LK>ùbN:Ÿ’ÃãùmtŸNªç”“Å{^øý Ž)àò™Æªë}±YSd#ÔŸ'U~rá ‰§|ìžûÚváó»°HÃ-'Ž#ßûJvµ¾¢\6~]/‹ì7);aúz— úÑ\ë›ö Õ>ªow Þ1øíÏ…q,cã÷¼—¶„´²fyÐgƒvÃXýÂcû%ö^;è&3ëàðÓ.5’Ò`|©!R@UPÕWöwôµQwhD?òhô>—«ª|Z‡29já>)†¯ª?ûÑ\C¹ãšªÿµAÜÓ)_z_3Æ¿^H.+ ðÈ1Ã?nÀ¶Wïo_ýò"y endstream endobj 50 0 obj << /Length 1404 /Filter /FlateDecode >> stream xÚíXKÛ6¾çWA6°RER¤$ -à »Ýiz¨HrP´^{µZÞlúï;/J¢%?¶M€z D Éá<¿!ùröì»+ëFE\8íF³ÛQVÄzäŠ$Î 5šÝŒÞßMÔXAû0‰¬6ãçÐý Ú%´7О·ä×ЦÐÞ†äßeö´O¾‚ö‘?Ì~IòŽ$É(Ò*.TÎbüÈ+ç0ûÚöÿïЖÐvÐjhï›ù‚W㬵pÀU_˜üªvM_î†G_SZ¥ü‡5q‡5yð†é8AÁkyBk^Ú°ÝŒ~[» ,Õ0`¡<…BR:‰T’f@VãįÓdR­Lí>Œ ¬$D,+ßõ¢Jã"MCLÑü7wâ)ünÖåý$2I2^o&‘ÎØA5’`pËCsò»§VåšÉiÁœ©%±æ !î°Á®o ¿eòb ýò je½h.çÞÔYçY6 eJ §ɇM^=[˜"¶©kr ö7PEœ¤fˆÿeüÃü­_¸š‹—­Iëx¥FCüä튾ŒLž‘+—zc¥I&™öZ¡Áîçœ ©¶ãljÎÑô8ë}¢R\SÓ¶@râ .ùƒJÏy¸â1R ˜¾š^Lè\{çáºV燩ú8gòÔ˱˜¯÷…p^Õ`,qs¶Ú lkÔ®jã’Ç|Œ‰¸ 6üÍ LÒÕ ,~ƒš$¹wvdÀø–0¶,‘Ýgä_˜hPZüÜ–[ò7ýln™É ¥“ølÔ\ðç{àq÷pØøJ0á:ÄÀEìöµ?kËË=—-oÉÉ,Í*Àæ~Ùi„‘(Ù›|Dr h’þ…Rñ8XXº“=¸&çãdU˜’O_Š*¿UáQ„ݵ¤!mE—J†‡êi=¤ü\¢ xâ–×oÈkÔÝ£:°–ýçŒ/{2v»óа;Üçîm‡&Á q®[[à¯ÉVè¯9º@eoã2²$ Çàà(?a€L½¢5”Ԉ‰‚{³âŸ¥xYX`<¬G~ÁP=2‰‰³¤}ïë•xã³üŸ¨MÖÆ¹µçÔ&WèS{¨S‘)ÒX.Œ…Ázð«ÀjdùOlçœÙ¸ìD€,YÑ–¥);¶ÿª¹Ä=²ô¥f±Ë:þjg,¥ÃcÁ'î˜^Q šVÇæÜÀÙŠÿ;…=BU.ëŠ"¥óýZF˵HŒñ€IRÏ S»é䨄â.Kšùú7ºÑûÝSוpgì«.Ù ¨?/0ŽÃ¾úª˜ÿäju^5*¬ò¿Ì]9²ÿpåp_¯r¤ßªrœy]ñˆ¢mÒà¾N‹qEÆ)Ù,D)yR‚} Édf±1Φó¦$(þï–-§ª{;²„DÁì_ $úsóëé[À ¥SÆŒvÝݦ4fÉhuç ‰’®-VÁ•"÷x_‹ÑÑà?÷b©gÌ4µÕÇî#C`—ÄYã„SPs\¦&?ë^ŽîGÃÞí¿¯4UaPíoè)®s‚¾jÒی羶1‡nˆKçÕP'…í<¤ªæÑyj$íûá@Vá1ð>),5„}¦ð*VP(D2˜öìröìoCê endstream endobj 54 0 obj << /Length 2548 /Filter /FlateDecode >> stream xڵɎÛFöî¯høDÍ*²¸“ì=I0Î% øäÀ–¨%ņ{æïçmµpëV'Îb-¯ª^½ý=êýý«·3}§T\£ïî7wE뻼Jâ¢Rw÷ë»_"/T”.–Ji}‚ö~Õ,–ia¢-tš#u²h\¤*ºàЩ†ß6÷üz£—š¡7ÐîNÜ~ ø½‡¼`ûŒÏU6ÿ51ÉÏ祈þý!Ü |ôZüvÿãÛå]W¹Îñ*ÉÝR•qZÊ=îwˆ¬ÖIô/S¼ÿÏÛüGîÕG˜YËLúýÛïèË\Û]YwÆOx*¡{æQÿïNîð°'Ähb-c¿&*E SC—Ô¨*ZÕ¸Ùa:þ²0yTŸWпð˜Óö¡k?,–:ºƒ±ÂI=B“î‰ º îù¿#psF"]ˆáL—¨ž)&æ®áön°±¤“å8¼YÓÊÁ¸¢FÈÂã#ÝG¡WG‚!8L¼q÷€\LÜ¥êx>E¾—4aJ¶²•§ÞQblj!´wdeV2‹\0Äêаç$X« EVÅ‚6ç^Ș eYqi¥×<þÌ{Ø„¸ ˆ“5Õ)Êä={Ö~àüÒ¬Œ5éþÞcøöiÒË(ålSáªÉ¢ß>r²¸‡»e–$`wV§Öp=W¬=Ø­§4<™ÕíÍH•hêä,¨y‹òý"*áCà-Mqü7zžÖÿͬ ¹«9ãó-°ÛÉ^µÄÚb¦IZ¢ž›#·=0E}ï‡UVðàYW2#»…è*^¥*‘GÓÉcûå´**çÁÓ ç Í/U’Órž7S9~»§v¨½•|€J.O1ÅÄôyªØ½õ˨’Ó\¿Õ*Ùó¨Tòä•L˜4‰Š¹mo-{'/C% bo5É üù½3ZkÏx*f€J!sÙͦòic´ ŒŠ­@_ËðŒ±xãMÚ:Ð[1 kæwüz-£{ë%©¡"ïènЏ67YÚ^nÎÿí—|AЗQm“yh‹$M/ès Ð̣ǚƒ;€ÿŠqImkEgµ¡€ N‚,³k[õ hÇM)g]v è2ÜÁ&aù¨P³Îì<.²Ësæ½ÚË|€çcÅ«”*)Ç`ÃÕÖV2ó8Ðá¸\MWEXCÛp–Ìã5CnO‹q¯ƒŸ¬—ïÌ×qmÉUµ.á¤ç¶›]3áS¬jørJÖ(Á%A䱚ÎK‹rƒäŒ §T?£Áµ-¹Z 6’}Ð,Wœ¸1CÆw·`—œÊ–Û]°i€­ì$5¾H™hYlBª†¯¤»¸ãʃc9ï¢^aóƒÌLßÙåÌЦ$§ŠH¨ô iظ%û[î%p¼^ü"kÆÛyíLl!3É%q¢¬]¦zy×!;qF*ASs­Æ§ê&i¢cS徘Ŭh' b>©ÏêÇðjS6§Ov† JÂ/¥\ÅîhëcZÇiRô…Y -mYæŒq<5ãÂcxÅÜÄYê RCÿñÑ"=QÉJâ¤t%02ÃÛkèÑÜ@Æ{?ir X©þŽƒéúç-Ü’ZÀû€†;Â{›·ÂHÍ´ ¥8Lª ï#•¿øÍU,W`<¥Æ¥•‰Ó2í³jEƙݟ/ÞmÑKªƒÊUX¬¢2øÖ¦«ó6â<ÚÅßiº)BþmI’EG© j%f ÎˆQO+œü’ÇКxӗзrzφe*Ïâ4¯ž ˼ Œío—É¥7ŒQ’Šì) yðº@H‘=M†öÈ?ì)/Y±÷ Þž j*½’-øÚšaÅJe_”½äOÝÐÞifLì¿}»@6Kžd¹Éß$ôthÐÇ»åþZ®wšp,֛쇖|Dy¦ç³®•*b]V3ßf*5ûm¦RÎ7URCn»^ÄY)ëìPø«Äe¶‹ç¸¤ gÅŸ–lç.ØsºE•¸0".ð<~Ç9+Ù3™bÓ‰kÖÅaúk`,±_˰‹à$@.ìY3.¾áN5„AƒãàÜm_0jñÌò¥‹ÿ÷ÐZÞÛ?xÀL/}! }…™„ ’Ôî%€Ï)Ž*3H×ÊYƒÊÄé -³ SÿÏ·}¯T­ûï׳‰áðûœ.óؘt29è|ž B¾Ý…\¬0ïÖ]rvÅçÞršó¦ÀG)©Ê™ÙbŽÖ&+H— ÿ–tìÕ‡ûWÿ4§Í endstream endobj 58 0 obj << /Length 3043 /Filter /FlateDecode >> stream xÚíYÛÆùÝ¿b±Oj1œá   `Ãv’Ân€x‹HóÀ•¨£‘DA”âøß÷»f†§6vk Eû°«¹ç»¯áˇg_½ÉHuz÷°¾+L¤Œ¹K‹8Ê u÷°ºûiöý\ÍŽKøWÍInfæ:ãv2Û–Øùu®s7r,ϰÿjœâÅ+ž[ùÑ#u¡ß܆K*h®6ø¿éΗ>+@aft¥Ü¿;"0¸º¢ÑþQO`Ø!6Ï¡]¤xFÞÁª¾Âì¯æAlâ†_Z [0/qu„›ªÉϾ[(@Ò…RQa-“tYãÉõy¾Ð¢t’á]W1ÎêÙÚ¯ÔáèF&;dÂB›„Œl¬éô ÏÂ{„í«76mñ^6ÊR}3Œ©„¿“Üûþ^Àß;ÞÞ–c¢4³nsý8_X3ûB¶¼ðÈTL‚C¹—Ç®q{gjs.,M8¥Æf2»Ÿ+m æ %»sA›82I&lHÊ—xþºéÑYŒ„ߥŒ™p&–ÀßõV-™åÔDuê·ã½+b ˆ˜Î /b8ÛUqÀCå´ºðí;¹¼á):p]:Ù”E¿Î­m®2l6ŽË!îÊcç‰6DaAN;•o— þ¾’ñµôHì@&ò4Jbø¡’•[B™îö¦¯$oæ L(,I’xaNúßðúÃI.¯žó°·Ðn”Øh›•„-PEÐ_…”¸H™ )eÿº>“ÓRâ¶Ö¼íÃvç•Ú!=f~œ“é¶¥³¿Çʈ 6ÈòÜ¢V /œšÃ W#h#fçúÀ…Ì×ü{®„^õ®F i¶btN²ŸtÓ:!3˜«Ü±õ,X¡ÿHð ä@瀪߰!«rÚòMC‰MoÞžB³èìoŽ "”Ké¿ñ~Œü=P{\¢§Ô´”dàW,¬ 8ÉðïpN¸@\AŽã…¥w0@xJ»^÷…kˆ'\’$vJ1_ushŒmç·pêÉçõDVŒÔýÒß­´Ù”záGÛºÐqÎvv#Xm@¡zó@B ‚m*)"£R°Íq”§Ãú5ø ãÎ÷rÊ#ÿš n~:稔eª+±4¥ˆ½q×E|n›¦ÿS†Ñß|é½,Χ»“úÿÜ Vµlªü{rŸ,8ñAĪmsî;ÈÙ/ÜZ–ýw"y›CëŽDµ/…‘ ±•ú2YÉX‹X]W³Ÿè>Æ{ÝaûÙÑ—`ú‡ùÂdÊ:Åþò@^Àp_‚áçVLòo`ôÒúŸÍðôÿ '†“W1c©Ä@ênÖ$‚I!‘žÃð]ï£=E>ßø¬fÛ„è\w‚N¢\ö#bfß‘OóøN€îºäxŠæžAΣ$—\ú¡íîM;DŠ£Ôú°†¡ER¢yû†ˆa9hÜ`MÞ×/)Âk$o¶z¶ÄD>QÁεq)± 4)HÄÀšM%É4Ì)Ÿ{5a—OÈ¡'n}&¥ŒSp·Ù‡‰£Ëz0³ñ{+¹†²?d™m—pp0B¬äÚ™Î÷"3 i*f—çaÇ.FÇîvÀÙ˜xV•’ÙóZɱ©Óp,Em&–&*_y`ŒyQÉw¬v$ê*qçI‹‹.ØþxrÂ!Œq#‡Æí’F¹twê´ö‘ˆÉÁJN„$¥ã·ócH¾*¶‹,6³Ç‘´gnú–õ½üŽDüm«$¨,’4ö94¶üÔñ-}EÄ£·â%%Š`,ÄÉWzZ<|×µ“8ØþT&ÔiŒ¤Ÿì†(ª‡_oɋޤ³JâÞ£àAŠ·˜)ÖÝ‘í&“êÁÚòˆ§%´+mY^`P·œq¼s*¾¼x+K“”Úfœ®PγsòJ.ƒV‚ÈØ4™½À•†…—*ǰ%ŸÑK«aDÜŒdê¼x³ÅžÁ ^zç’ØT5<ådsµ=Âä¸a¬iðbÄaˆ.eÁõ•Î:uÂDF,e‹ñ,Yƒ´hI¢s t”ÌJ¬Ks3×'íÙ“Óa(Ä/"Ÿê““•"”6Óœ’tæŒÂîÒrâ+^¾sš;@‡®F%yd•ýL_£m:îkàv‚õ䦩Úä.;TøDv‘¯Š,,Üëù KÖC5r“ŒªÜÛÑo.¥•9£l¤gçÛѬR|ñ‚}•'B[œM{ï<ŸLPÈ©'È™D&wÝ:ñ¾Š3fÆ“ÿº„éÖØå:ôJLÛΗS¸Ü€¿$KNrÈ•à¿<; 2mẵ½¤‰N²ß)[7}‚5­bx’DYÞÓ„‘2š³5”Ρ甾>;¹—A’C8“’Ä¥á l=šfq7tfc< Œ÷"û¶­ÇÃ=i¡Ý-00k>¥ÿÞÕÖ[£ ˆÔ¸ÞºYÖt({Û«BDQÄýe‘Ø8|üív©‰ódS´ K=uÎl nŸV‰Cl@E&Náá2~p6E %´ƒª9ÿìƒëÂÌ^»F>å“[hó/ÃØ71í„®Â;°488niœ­Ccc£¬HºLõÙFåÀoíLÁ†²›²[jËRc)͹Å1ÒÄ‘²^"ºe÷a„ >%(ð*1î¹­¸ÍBïáê§½= '!Te']‹?€ Ð0¦ ™ób—§Ò}#ù?ÁYX(®]v%¯¹°šì¹Á ·Õ wø:4ÐþÍÜ—v†±\ºú½,3‘*ŠÑ¤¤ûµS”„TcŠÈ­ZVpA Õ"ƒLLO}½’²²ùš2tèÑä4 _±LHIк.}šªñÐ(Ë¢8ñ¡Ñª¼”‘y¸è0¿Ù8²Ê[Tf)°ò7(­/7¼#PÜÒXœok,ëy«ráÚgW©D£äÓ.™¢¬´æOuŽ¡XÐËþY°ý‡9½X?¾ù}ÂðåªÿÉTÔzÛ+åm¯j™§©GÜéÈeˆùïŘ¿–ïòîÃcœ›Âo!¾ŸšØõV†ÿöô®'^£m–&#“#L@y”O€²5õJ¦þòûHRÒHŠÕ":—q„¨W@/×b7 ]Eù–š™îþÙ0¤¥[ŸøBÅI¤þߖȼþ}»¾“áo?Mxz>LFƒMÒÄò”lpݳ×Ïþ Û&wÝ endstream endobj 62 0 obj << /Length 2057 /Filter /FlateDecode >> stream xÚåYë·ÿî¿B8䃄Fô’Kr—@ZÀ†í´A@|A$F»–t§kNÒU;òÇgf8ärŸ§kÏö‡~XhÉçÍßPÏ/Ÿ<}eʉÎ*;¹¼šN¨‰u™(œœ\.'?Oÿ2››ÂæÓãLNwð®òé_ýÏf~ÉL?ð¼†ç<ßñøsO…¯_Ãó žŸô ¾äÏ­O/øÓ·ÝOÿàЧ†Ïáù‘W_x•%Q¼¹üj’MæR gL4––NNßÁ žx®áYÃìZYYx\½)M=”L•N©.Å|l=•ó"=J…SoÁÚÒOª°õ ÿͯ¸býr?ü^çþu ¯Å_Rïy¼aK‘9ú-ª2gâš­¹' ¢f$BGV=z„ެú(ª¬t!e¦‹ÿó| { IÆëOõU”#>»†³½•Ž’µR»ä M¨ls*P©n™0Í)ǔɔæg¨˜Þ ?HÀ€ýtàѳü¬|µQý\êüSäë£'åCÓËòQÒ«urªnü›nzµ²$çtpM^®ÿ˜|ú*UR §5èW `Õ%*²:vó\)Ÿ'>IhsdT0oû@í³ivÙúñ]…¬8³dŠÄèTk„Õ›„øÈO·hQ4ï—´£îÖ]%L.ŠR‡• \å÷ôâ¢vÛ':Jz©ãnß3¤%ºÊK·­(ï—,£MeT…p.ÊxËÎ÷¬;b©L”¥ ÄŸ#÷|ºª3UB¬Ð^›ÕGo¡K{ ¸y^æB™¼w»+€pÊçÛÚÛ‡$…ÆÈÌúÀÜRdÒlÕ£N©E‘EmΫ†]ã[¡UÔ ]iË-ÿÞ0—Û ÓJÌæ…ÔŒQƒÝ5R-ª[œRÓw36Èâ˜p¼#ϼ{ˆŽkV:1KWS•QJ—ª„¢MXm£µ®v$Åúõ‰Ì±Eï±ÝÁ=ÞwN §Êf­ä¤è ûBCA¯"^ “«ñ;4ê!Fwj¶ÜYRut^TAS {(Œ­ÇkƬ) hæLCjvï‘wù2 œ;bÕ8Øfµv^ À$Ç‚|äe^ú)ôÿzväÉu…óýÁ+—ÑÃѽL»ã,Se&t;ËN©±ö1im®ð¼[ä9IB–;P¾xK¥:fÍÊʈdÅ+V,סƒLš•%"ÏXçŠ?ýêkrrâ°“@­¨{~u÷-JÀØ &¼¡oA^/x–à¥}5uÛ»XßÝ6¾~µŒs^¼E£u­…¯©Ð—0ó=ñà:àúÙ2ò\Öim¨à{·³º½%ã••ŸjÚu2BAEoèÕ\'§ÿlõ\cöqY°ø'–—Ò‰„ÌÔ-¢Ÿ xÓ?¸™ˆÔã ldâ¢Eš|z¤‡.¤áû*9@Ž•Í³ážÔ­èÖT' •÷¡9_¯|¨ ÖX†f9OpË›…ÿ(È©ê!ô@Òö©Ð8ÉÀgRÚÿÀ•5¬ÚÁ`ôôß\{I€‚ |©(?á‹mR£ßâ)ð»'Á°:‚ëD‹þƒÍ‰2/ƒ ÝÌêb<è'ÐoB­ÙȧÂ<·¥PÒ€£ !¹¦¥£»i¬dNÊ—Ÿùx3ÔÝ tSíÒ@[6ÐT4Vçõ³2'P— ªÔþ@†! ’€{áž#¾ï8Ô„ὺ¥Üì,~&´lkD |þâ·ÜÕѯÛ퉌‚‡AÍ_Q¯¿ñ‹Híg]RC*I­ o"(Æ-Vþ\ÒÊ@±'ôKTù¸íéP³CgóhÓ¤\…ÐyÙªÀ/ ¿›˜Fõðøæe}ØçFU.‚3_ŸºØ|h}TCŸ¦P]&?”Bõ}ìÇpP]Èÿw}ì ƒüÙYÇijR‡^òÞ%„1«UÝÆÆÒN«%Í™éa·Yù·m]ɘUuL.ŠnÞ22=ò9Óâ8ˆ$àtya£EŽ.«¡Ìõý=ºÖBçvÉÜSöµ…¯ús @ê9~ºÚíƒ €l +¬,šqÛ€@’µŒ ÏÛ†‘­cÀ¤5àÃu¸ù2´x¥V¸xZ"ß›˜ ƒ×7,ÄÌÿMLx¸ê÷73Ö£ˆs §;~¥[¼‚nñ`Ô ¢qýV¾39P|ÞÅë^á›Ý°ÙVu«­n»šÖ)ƒˆÑ:¦Žr6ÚšµÍ7¨@i[î jKƒ™éëUø—ŸÛ¶ËL„áÇt>W2½ß¼hÉXÅvÎ·€ê™éxKYmkó‘M*6+ïnMûî#ZûЛ¤‚S­ÊUÂ)è2–ÚÑм¾õÚ_Ç+ÍcÔ 6¦»FJôl­ÓÐå6k2Zk‘ÜÅ,Æ­¤¥(l<»ÛÌ` ŠC{[–¥ÿD×)O^^>ù”SÆý endstream endobj 67 0 obj << /Length 1268 /Filter /FlateDecode >> stream xÚÝXÝoÛ6Ï_!{°±J©Oë€Iöu{¨h L±Ù˜*¥‘Ýb@ÿøïŽ"ËNâz˰Â"yw¼;Þýîè³ÙÉóË$÷T R™z³k/SôR™Þlá½™|?õMš©˜´00Jç0 kþ=çõkžo`Ô¼ßÁx&!ü¼‡QÁxFR=na¼€qÊK–tÃ’OIŠ Îï`æÓ§aøÀÇ,Œ˜ÞÍ~ñBÏ"PIò(“ÆUnèçýÌ-V㌠?ðü™Õðœ·~ÛÞú™9~ÚÞú•·þØÞÒg]ÂøÝõÍϺ*ßï_Æ;Øõ^JÞûvêËT¨»¦›+\±Ø†ÝV;âíçLzËßON†¦ƒ¹Ï/Ý|q âØó¥DÈá3["›‹ŒcÈ—G.nH¯®8,×– CßßhGš%7í­þN'ó“ëß²£ÅOS8„‰éê`þq*ó*k"îX6ü6±6¸¨Ù俉¨è:>£jJÌÒž~>N ©Yy>ƒï[ómæúì%ó°’g¯u8Séy¥å®; #ßøÒ ¦¢(BãÙËzоEdÙ¦Àªt5,i¥½&z¸O™XL( h1 ;€^8¼ßƒáóæ+4KG4co}”g0ÐËcÈö64¼{2Ê(PBØ,P=ì€ÝIå`å[´;¦|ç‹™ÿŒäGÐqDþýȸûø#رÖXó×Ó<Æ„K9ÿJÔç WsC™C ßrRêÍŠ7Ý‚Ķå"Iæ`"*2çÄ«ù÷v[©‚LJÃ`°³×Ǫ‡mIÝg-¬Å“Â8I¯¯K @™4Zjx¥æe ·XÓ•lyΫŸ4;‘¢G^•Ȳîo£—Õ&ÊPIï–ªÂL-B„.?p»Ô÷„æ†Òº¾‘þ=Z×Ë*½õÝYmÜäÚZcj®AÚ 4vÂ|Þj1ˆÍóµ%iInÛ»›õYPÅâòÕ˜`Y¡·ˆgÅaåVÒÎKÓ7–ù¢Š›%!læ}!Ôð»Å¢°Ë’šýex"«>¸’«OÕÐN±¯ÚÌÛÚ„ÙV¥1˜ºpjŒ7(w¬Ï¶Èí-WÔ4!¶Š'ÃÆA§Mß8tD¡c­hèûªï4ëÕÖ5BœmŒÓÔõ±¦C×N>.n˜ |«Ü2Qª ç¶[ôI\„7½Ž1TDp¶^è˜æ ‘ƒÐ/yccŠSín8ÄG`# ²¸S‡/¸dW=T¶FeA®ì!%S.mÓi ´ˆÖ s¦ù€i0³ú® òVû7TÎ¥Œ˜%e dìÚU>ж¾gÚ xÎí6Áà™Ž*ýÑGU¤bºEÓ—©>®Ìu™‹¢vÏDDq> ûA;ŠÝŽˆç”H¶fDÑ®ÆY+ÐíkÜÒAãvœHØõþ;u8kGÚéCß^ÛåmÇÛ«çèáåžíC ?ذkV¦EîÃÞÁÇÙê»#Þ€jœ‰Äën-ÿSOòýa1ò—GåDFÉ5ß¶’‡§ÅS„ý^>D¢’$RXûsD†&èqϽìÏwßQw$GiÄÑ>ÑP¾¥¢{{òÑÔôù_k—©Ÿï>ßžÀ®£æ¦ü¿gØþ¬:æÅÝ ÈÁ»øÿtq6lðRÍ¢ 訂<ω.Õt'³“/½5¸ endstream endobj 71 0 obj << /Length 1766 /Filter /FlateDecode >> stream xÚÅYmoÛ6þÞ_aû µ*R%ë€IŠë¬.: -:E‘c­±eXvƒûñ»7J”äxh›´Säñx¯ÏåçóGOÎc3ÉüÌh3™/&Iæë‰É?ÉÔd~9yç½›*OÁóa:‹uèÀð ž-<¥õ;‡ç犯Õíòá×)ŠuŽü1ŠÝ—^Ïó[x^:z±¿^/ýpûêDû>zÝ™hOÎS‡Šü,Š@cåGpq{;M#Ø3‹”òræAãy\ßâKàUÄS§Þ®´'5»Ö–DÏ$4l`ˆ«{4óíTÖ®x–Ý1 >³ásõ–DUò8¯äÚòÁ3Þü 'óæÓ46^þæÂÀ{³B’O„Ë× §"7îÝåãuß‹’"df­æúàfª¯Þ ØFQ+â'´TÉs(EÍÂ4ÍÙn4“óÚk•_ ³r+¹ž µdm”½Bë’xÞ òI jl–c§Ç‘©ÝY_@ÔDÞ?hb‡ç‡^Q³oјdâJBè ×cöòUÉÄ ¾í~!á |i]ÜÈâºí{Ðk'Æ›#a%ì ð›<5¾ ±¹D*H® ™.–z`),ËÏdrôC¨=tKãêô;޹qŠeÆOUl̓®ÀíSãRéL@ãJæ^;kÍØæ‰ñ£ Íì•¥\B$€ÔÈÈQÜ]3•„¾Vi?Aá4¿âŸŸa_'«òÞq€'$™[yt‘<埢ãq"HGy(ì?Éø¤ãÃ7â65[î‘õ²Óá*ûóE¸šØÛh±ù‹R!4]~Õû@E‚¸Rïw‰ ’]ÓàC@±,„ ”w+ø„¤8A‹C¬  XÕ·mÊNû¦àuáß‘–{ËTÄ@‡Õ«䨣òÚÄp-Ǧ( Ê|š†d£ÐÇdh骆=ˆsbÇ€h-ÂÛ¾!ª^ð\'û8-•☵yy,:_JdY;n|(d>M†ˆªïÎQñÆ"ŒÀ M5æÎ¦gf«Ž¨+3é„"‰ Ùä  S#tœú&MúEFJÂ,Œæ0.É%q”ôÄéjÍ¿'d¯®w¢Â ± V  Y¬4õ`ËÊ–fúmdóÎ…ÑØôÄ8¦#Y‹<äîNl~iJ G:Fu¡ƒlïKB 8é³d ÉÓ cíè ã`¦=Z›öV—úG ‡'£Œ7o~Û…QÊ1rùÊ‚\[^;~/Xc‰€Ü¤j»“̆äÉ"_Eí•äF\P Œ,é”,„‘Ÿv¥Ͳ_s¯Ä[)ªí±(“#)9¨ ¤ËmÄ6=)i¼²TT†A¹= h‘²¥·!íšdÆ ŽÒœ°>é׃„MÞ&sGR©Çæƒ,ÍÔÃpÄÇ›$èUm6æŽ^ÔâñYôNžpM@tPj6=¿Á*ÙVš ·“(`µ\T0§¦ø–_bµ‹à\BñSOfúÞh ?vªh~ê@jÛ‡Tí%ºÕ¥|šAÏÊu2túo §­øl+éýön¨¹´J‡:Ì@z¤¤×Z}{n•µœ¬ì ö.$ÄÈÃíÀe'Å!.…È¿wí6™Å‰éw]C>¹{|> stream xÚÍYY¹~÷¯Œ}h#ºI6ÙÝ@ÀØ^,v ž v‰Fê)«c ÃŽüøÔE²/5› ‡ñ(ëb±>ηw¯Þ¼w~R«Ú?¹{˜”µ2_窬õän9ù1ûfúóÝ÷@U·¨œ2FOr&ø‡øA~˜êì-|ƒïßð}„ï 9[¯\aŸc=+¼ªk;™i­jç˜ðG`§áûy:sÆR¿×³™±ªÖ¿™BI¤Ð{øþô?S¨ʼy_˜ \Œº•ª*y•Q@g§ÀɸìÚçÍ þ®?àï¾§ÕtfK—ìÐß#þÙM­ÎNHqZßýŽÉöÐ~Àf‘mq|Ñðø#´›tÖq}¶Yt¸,‰¯L)P(ϳŸr—£åÞâÂhOѬaÕ2è§+e+ñÝÝ w¶&ÏþèÊoxã¿çÞ|3K™±ß½ùÕ’¹íþÌŠR¤$ù‘G‘ü_Èï×$1M,eì§\[$:°½LIºÎsd¶$qøÓÔùl~\ùq›ÃPÂmCö¸ŸÎŒÏöÙb“àh’ž¸`Bž_Ð]DÜCL·ÃM]h¶òªáöª·¥¤žd;Ô¬ÙÊÆ¸bŽ”e’GºOb¯=roØÝDÿLðå[ÞgO‹r'Q­ª °ÙðÀ=ª¾@é~Ö#±>ïD ˆ_åÑÑÈŸw&§&xnqYqCKçcÔÀ¹ƒ%ò‚ÝȨãFÄ5‡ý ÁË®ޏìæ¬ÏîSôÈYìÊÈ"2‹Ý.Û¢®‚‹MÅgA…#²>Ë ¶ç[´ø†'>D²í¼Å$QáŠÎl<´ØùLâÒ,„sˆÝ&X¿¶`}¬c$ÏFZ§è׬ì|!Ç;øÃ€A–ÁØ ÎÀö)7wù°h陯áè&èA† ¿8H&$©Vé%(»pª-ZÙÄØB•!?’§œ°_ ñÊCªÚ§VÈ¢À"þ\äEÃÁË’Àû‡‘|_iår8/%/¦ü¨9¥¿Mª´ÅsF™¼LDŠ;@œÃÊ–À'gÎlíœÌnà8 #¨s¸\=ÀøPR+_G‚Ì{‘yF{rˆìÆuÀ{¯Š nƶPÞE‚“p¿†³VÚDçÅ3ªÄ\íxP°=ràÐ ø~לvdv†ÒêÂ*gã]ÿYd\‹¼+òò@VëT›¶)oÁî F\E2ù<ÊÔ:@¡»Æ¬q<§Ä6³`ÛªªºnNç×ÐéQD® U½ä¯Óª ›ÖZŠþçu ±FN±S¨‰Á¿ŸÓ¸‰¶c.@ª  ¶1N桊ף51“álÈdx@Øòm΂4Ðkð.úLn«×â£üž¤ý^ú[!ßHÿ5/ÕcǯÛéöå;ì:IÙÈ./Ñ%•ZøÍ»öë• ¯…Iºù8£ø‘쾕¿BþiíJÖ2¤ÉOá éÍo%NTš´-4t}>êô•¬ÿ #}sA‘ Æ£dÖ‹ÀnNDÁêp`PÈ‹ ‚!AÕ;‘:a›\>_!_.¿¾Š¾‹ä¾Z~qÞÑüLçEItJX8¢ GóuQ¼Œ1ÿ‰â{¢8™Å>/J@‚¥ìã¯Å –BQ´ˆ’ÇoD”âë¢8᛿ÌAž4èZ¥úr¬J»Ââ?Ï]-J=â +´fÌ*þ:Qjáÿ_Šââ7¸hÇv¥Ø>Î@¤Sùw}Þìêµ*ÒÓ‚\r#ûå*·þ¹ýnŸßÇå1Âú=KWdÿl‹ ŽÈ Šrá3PÊ9¥Í·Í˜LµU¥6ˆµíxc U•I€æÞeÐ' Û%‘¨f=¸v‰h+ Á5—®D)™34W §JS•Jû^®ä}qSUø}*‡èÐpU¦÷Ä ë_q­ nøöb÷N@FëbaÚAÕX»ŽTÙ<‘ \#> ÊV™0“g¹ Zá)ö˜JîUo¿ŠAnx‘"½ŸŒ¢aÚnÝ~¥¡au´–”çœk‹ ˆ¢¬YGAœI¨rŠh²ÇütÍ×¥Jo²·á¹ž?0¶×ãØÞʦÄ6–,Q:šA¨`pè&\zã!ê.d‘Îi…Ž)›Sÿ]ò%ðü¥Ub>2A|´,‘FYÆŒ1ÓÞ+Wû®Í{V¹üÜᬪêhÌy9FÖ9X†â†}ŽÕëŠSdËÏpëƒäZ‚›‘°î)˜ÁÚ€ wñbX&8ÞRR4 ÉÃ|+ •`ä±uJ$É®ˆWΧ!Ö$iÙ=„a$âûE,Ó)¯’YEH~` g­³nEz]{l>†ÍŽÃ#&7ÏØù:íGþ®}™^:Å—í5Ž¥ *;€êa´ÚáÚëwô(Cd·bÇŽmZ *> stream xÚÍÙŽÛ6ð=_á.ŠBÖŠHêšY$)Z4yH·ÈCZ[öº±­À’“ìßw83)™>v“ y Äsf8÷оº~ôøE’ŽŠ°He:ºž²"”£´ˆÂ¬£ëÙèmðr,‚´´ÚگжÐJh ÝŽ'‰TÁ'^níTÝšþJšÚ@·†6ƒVAkhZÃÚà4cúT¼q›qªás-ž}wýû( ¥£‰a‘$DuÿœþÁÍæ ™1µ[žž2ÌÊáƒ2eòwLoÛ‘À¤DAÉg—Ì£º£`"SQ×Ð í/hÏÇ•¦pH‚9–#\…q<¸ÛÃý%Rqb†ÐDP ĨlÅ@>ò·G€)è' ,F`çÞ pͼi˜W«3îœu €>~‘; 9Uùh"|Å›qk˜*ÎH×*â‚7ÕÊȳ¥™’>Ê­£ÁS£Ò0‹Ë‹jC„êA=§/qW–Ê(JÓº«– º¡1ÂjÇ2›€ãµ>úžÉa%Gš4Ãk`N†¬ª*»ÔÖɬréÐ3shwv™ s¬ç·ýæ<à_²¶.Hl"‹8î Ž9 áDQ0­õhÃŒ„ùÍ·¨ÊÐe3_2j/*:û–»9·fÀÈ[sšYÃuù™ï¶ÖÝaW§O‡#âªsÍÖRQj©Ö›…‹fxÙÞZÒnË–ï‹§S‡£D峇cJózK§Rd®¥QX¯Ð¥ðjCš"‚ìÝ#£î2•A¹íÌI³˜¯NªÙ6ãõÎ7˜;`¿Ót ïb,dˆ(’àfÒLdã‰PVK‡‡0ôY-ŒnÝ‚ü¤©êd“VêV6zcïȦä¸ÑÁԲђMO³ãí©% 1jÙMÖ]#'}ŽžíƒÚêê­â¾A‡l„ÌëH„–Ê®BO%‚?)N+/¤rµ@wa)Û¬ àÓ)t™IìøLÇa$RPWdÈë+Ùì»W%Â\*³Ícª…ö~œ¤A¹pIDKiíÿU–„¹*úúúiɾu5žÄfÇa/N2Ã{Ýý;±ùfñÖìM44BQiôÀ˜>åX®ë¬ðŒÅÖƒY_¥·ùŒ@êÌßÔŒµ»Þ¾§Q—Ct¨Wä™q«ᾌ®³,L±0¿ÚŽЄ·ûKT˜)iVƒOâà_k—@:DZ2BÝOƒ[º‡Ž2•qå"¡ëSØÊÖQ(7+2‡~b°.öÒ?h{ íå>É …H“LTÌ1®iàÚ ×åʺªi(½Uë\aÐ9W°AÁj,e¦BzÒ,×o·àÙ V¡Gª>÷}¾h“0Ù1>ÅyLáþØ¡Ð^ñlÁà#Š}ë½h̺¥þ¤htåšÖã`µä|­¥MàØ÷u@F`êÅCU “¢8u5tÈð…%üÖ§¹³<{ 1“8ŠÃTeƒ¼ÕÔ·d*3“uÞ7\7ý…*…5£7ÉçÕ~Ž®·ý ݉­->3J³Ód¿½×™D‡ûH/ 2¸3O pNêã-·c[ßaó¤=g_y_næ=%HÇåw`Ë¡Šóe]ã»å+®cÖÌ".Žôù3pì¾ò³OúÕoŽu‹$½’ç{ôºHL›ï€Âf=éÍÖýWDqö54÷öo¤Á}û7NÚ[RF²_RÂx‰Âí’m¬¿îzµnë§‹‘ò•TEÙ™Â3:ŽgyP6´N¹çVXí0®^#šIrÍ${´rG—é¥ézµKÓÖŠ]I$\SqêžØØÙ{’˜JÒ²g]þ—óC¬f`“-¶ô¨*\¬ rŽÏ3S§â¯}þH¦‘ "ÆüVÜŒjn0ÊÖ¬h3žkPË÷,ÂÒ¬î6&Ô1)D$&fëCösŠ, •ÍøŽ%ó“Xä¡ÈÓ¾ÙOêó½ÄÐ>ߨç3'”=œuCٕǤ/íû_ËK[K{é…yἦEøþHN2æù”§à¯ã]øó£ó†ç¢Ý°Ç«|>ý^¬óï"×vÂÐå ÿÆôp¬øé$vçltÏÿƼw뇘a„øŽ!ãË©í&¸%H)T¬ *Ö¹+UÊÀS~[<¯ÜÐâO @OVw(L}338?*ÿæ|+ï&ó8âI3¹ŒSærÚƒÌF9&SðZ|žÙ$ÜW'ÍÆþ@@fcæsÖŠÔjDª¬è_à…N¢°¾Žr'ÝÈQYvÚ<þýEOR^’ó¦Ü$'Ø?• (¡z‡=«3U˜xA9³Ó[ó1 Ìh0Ã]r†¹kmú=Uï(oÇkáãÝÂX)äRû‚Wúg¶¤‹éçýĶ/UÄ¡(Ò¾P}ŵ,ŠîíC÷Ýd †ÝŠt/¿E>x^Ñ«3LìÊês%‚kÌàŠ!ÿôF&;à Ê3WÔw~ÆÐùóWCSå–é(›3Ú í÷˜jIÏîÓzeÞ‚”<,l\¥«àß n!QEùyeßùÏþΓhH­­ŽŸØBÑü »rÂk»†å‚ËhcZw¸ù°K?u1/áxòÒøŠáøÒU2Öê8MÀìò/à+.{Y;¸Û¶{sqÄñpFŸ©A'¾Mò_àÔ¨S©Ø÷£Yýè(¥þçIŠŒEùÿ£ç×þ¾ºÛ¿ endstream endobj 84 0 obj << /Length 980 /Filter /FlateDecode >> stream xÚ¥VYoã6~ϯÐ#¬¸â¥X,Л¢Š…÷©- %–“,,)•äí¯ïÌp(S¶c,vÆÉ9>ÎÉ77ïo«¤–u¡‹d³Kj+•µIQ粬U²Ù&ˆßR%cú׿—÷·®ˆ˜u.+W'¹gûÙ€ö@3ÐÐO@#Pô ôèµÄ“U]%Ã]š9+¾´À|Z¦43e.ú!Õ¥xõ‹û¡OuEFš§Þïͤ]‰Ö/GTðÏa „v»hÊ@ÕöÈÛÌŒxDÞ;¼ÆL§l]‰|cdˆ%§ Lí ;E-†?yh{T1E2Í쯈½EG$Y­d™«$SJÖÎy<’¿â þ %£Eߌ|vmýÙp #ø6¬bÚû†¡÷l¸$ÙUVÖeo¶ðfoÓÊÒ%µ«Â%ÏCnŒtªøÞ[Y^8BØ,*ÛûpiW‹=»e&ÜîøT‰wZÃÞñä· ¹'õèCZ#ÜyC¸)k¦°b˜a‹O‚²*Šp|ˆA>5‹‘ºâ@1W¹‘Ú®c>{PÁ;JÏa>ºn' ÷ÝÐRç6(™dšYkÄæ‘5L ânú#ªÂ'#ìñ÷°÷w^†Çhò¾UâÁï½™P 꿬,gà•ø™U-Qâ(RÆÐþÙËBÚÜ¥]ËÒÇÚ—Œ%–Ê t´Ü•I¦!6ªòÒ!?µñ=„-ÑÑøÌüç·áWâÏÜåð×±h”ШuÇËÓcR”Tù:®B>A¾¾ð×%Yxåãù¸å೪‰h«§ìVÜs)¿p»aH[¿´þ¯eÆ_@¸œå»Þ×I­OÚæZN‰¿#/sœ¶ñ8ˆœßA\ÒrÏð± ÂAòOì£aAµ£j±ïß>}‚’+•|W¾'çÒÚ“;ÝE^÷uY“ª¸O‰È\Jˆ=+xYRðº"GDíêüžûbbßì¯ÜF–Ÿ×iÏ H»UúmÂwП}ßC›Áiæ”+—>o\ã•Gfd)ÛŸÄÄòe*2LƒÿÇêjF6Øó…þ]+¹¨ £QDáõÒ„‚¡©‹ w\p6nâZK8\uqJ¥6¦N‹æùòàT¦~{rB#‡é,~ØRC¢ðxbØ“iCI¥ùJo„åxütX¦•úž®é_$虨럌°eX î9¤ µâÕÌeñ剅/•°ÿfÒ!<põßÚÏÀG/~åxñKn·²°Õn§²pê Ïx¥–×<ïg{‘K0O Yh~@+Êü›O››ÿm¦¿ endstream endobj 86 0 obj << /Length 122 /Filter /FlateDecode >> stream xÚ-ɱA…á“($§ñ ç Ì\v³T’µSH¨¢B© $:óÈ@\#Qþß_‡õTQUE&ªMGã…Ö-nÿu8³M [Yð,ÎVº]ï'†v=WéN;SÜ3uzÀ3üãéxîý:côÁEâ†_Ïìœ endstream endobj 97 0 obj << /Length1 1849 /Length2 11395 /Length3 0 /Length 12549 /Filter /FlateDecode >> stream xÚ´PØ- Aƒ'XãîNw×à 4 »C A‚;ÁÝÝÝ]‚CÐ ÁGfæÎ̽ÿW½W]ÕÝk¯­ç¬}¨È”T™„MÀF °­#3+?@T^D‹ÀÊÊÁÌÊÊŽDE¥fáh ú‰Jq°ÛòÿËC:¾ØÄ€Ž/Žò`[€Œ“5€ÀÆÍÏÆÃÏÊ `geåû#Â:[˜ä™2`[•(ØÎ bafîøRç?´Æt6>>Æ?ÂÂ6 ˆ…1Ð t4Ù¼T4ZTÁÆ G·ÿJA+`îèhÇÏÂâââ ´q`CÌé.Žæâ 2ü ´ý53@ÍÜÂáOBlêè„€/k c­ÃKˆ“­ x©P•–(Úlÿt–ûÓð×áØ˜ÙþN÷WôïD¶Á6v@[7 [3€©…5 (!ÇìèêÈÚšüvZ;€_âÎ@ k Ñ‹Ã­ÂÊàË„Íç` ±°st`v°°þ=#Ëï4/Ç,nk" ¶±Ù:: ýîOÌ2~9w7–¿.×Êìbëñdjakbú{ ';u[ {'´Ø_>/&¤lf G+++7d¹›³ü. æfúƒdûm~™ÁËÃl0}äea zùAòp:ƒŽ'—Ç¿‰ÿFHll cG€ÈÌÂéŸì/féŸøåþ!®Öù±Xþþ§÷¢0°­µÛ?î\1ËGY1-%†¿Fþ›»<˜¸8Lì\l66>+Àë¿ó(-þêƒõŸXi[S0€ïÏv_Îé?-;ÿ¥Ú¿„ðß¹À/Êhÿº.+«ñËÛÿ³ÜÿùÿSùï,ÿW¡ÿoGNÖÖð´:üx …µÛ_/Êur|ÙyðË.Øþ¯«&èÏÕ[›ü/'í|Ùa[3ë¿ÑÂAÂÂd¢dáhlþ§\þ´«ÿ^4k [ØÁâ÷Ó`bceýîe»Œ­^ž‡MþA^–ç¿KŠÛƒM~o;7ÝX_¤ÄÎÅð`{YGë*°0Û‚_B/ÃyLÁ¤ß7ÊÍ`þmúqXDþA|ñ¿€EòÄ`‘þñXäÿF¼/œê߈ï…þƒx,Fÿ — Æ£ßó³˜ü ¾Tý ²XLÿ_ª˜ý rXÌÿ_æ²ø|)ký/øR׿ÈöR×ö_ð¥.øoÈùâûò„ÿ‹~éÃîú%Öîåµµ™:þceûËú§üÿ6¿œ¯Ý‹èÁÿš’í¥qÈ¿àKãÿ‚/ÿĿ싣9ôO7/º`qtÿ+àå¸þì/¼ëð¿dcìyiÎñÅ~ÑÔð/5ä 2FZœ¿ ´¬ l¹©&taú1ö~šê‡f"“Ç"¤Õé !ž®<Õ r%?Ø…±¼%N{ùa‰ôÑã°±!¤)V¹ùÞóÁ FeòG3ÒÂnßxî¡pu/ñk"&µ;žöž~V0Ðí2T™öN¼hJÙX7.=’®Õ½EßG‚ç~(ï”sË"?M1}VÐõËŸ¡Ê2J›Å'‡wd"F¤Çff5OþÔ#›A’ƒrÛî#®{xéL*$@¨ÏÊñH‰=$©û‹5Ià%­|Û^È^Â<÷Av_/Ÿ÷MÍ—gŸ1 ìFYŽ:@WÔ£¶W<7¿¼ÆÇ%mÓu.Ô> ªM@ R‡ØÌÉ2ÞÁ¥kô•a>[ B~ž|%k9R¹&ÓîŽöÜ­~h ´¤/°sûåÕú¼½Ú§À“"Ðdd²%¿L§-ì°ì}»jv…NÜaošˆ¦ÐH‰<´?8°Š§¼ÌMͦyÛbv‘­DÌ?V3Y8õ yߤ\Ää‹ç¤tÑÄq”¾Ë'yô²âq…˜Ø [Z1‡flNG(óÈÄy» 3.÷|Ù ±@¢üàOòZÁ@>-A‰‚?NzÊfEŠ`½¶eç•yö`-C¢ú“Kùó¯-¤‡Êèíî‰MÝ MfÑ%±aüóåØƒÆÙи"¨…Y<Ò³~ps?25ŸSTôPkSùzà´µSˆm<ñÀ!•Ñ~ƒþÒº6Á PÁÞ¶Iq?ŽP®2 Xu MåPR ° s°ñ-~Š=ÏÞˆK+£G‘)¥èÐ0ï i‡h–vHý¾všV >°äk~ Kì$(à…ºSé£ÕE/lÃʆíYœjO~ ´;ÅŠ%› '^>竎P¼çÑ>ó*L]ŽÖc8ták è$ ½~ oSËÔF¿¶Õ±Îù ›r1NCL›©<¡³,iFsI6Á®¶å8»¡.Ë[Íé:ïtNñ°š '¦„ìÖȘBÍÙ° ±¿<ÕÞ‹Àø¾‰a¸HCÏx‡£—£b˜ Ÿ×ªÙü§Ü¼u3ή°-bô0ùG­ý•BG?êL;ÿiV¾Nåh† ÿ„…1Î\’å£è½<û¶á¤L.êœ?»:wàn½´mÔ{ýÉ8s^ÞðuÁz(™)Ÿ ÒA¹¢DnáU© ÜÂN"V|]"ÂDÎØb^wÐ+uDü#¸[«7(‚ŒRÞeúÅÐê‚åÞo0W½é`ùð$3˜° ÆgB࿲ߴDÛ$[ìÜŽ¥±AA*ã ^ô j¬ GŽòn*iCÛìEÃS؀Ĕ.&“ >q7ÆÄÝò}s~o.Þa EÛç¬p“ˆ@Ë÷6Ï„kN {U‹³®™ ‹,êEK4¾BœDæ*²¸­CwaFO+ ¿)¤¦,åaÑš¾af„ÿ#Q-“ ‘Ý ÏU|ƒ\Ó}Mÿ‚vz¿¨wu¿õåíeIf³I[î(?‹ßÀŒŒ»©uÙësšòÃ)‡† -^ù³õÜ¡dYmÝ&*Ù;ÒWÐnö ;Å¿P§djâ}„áà_ï8_[²@&f—R´‰•0è8+Lçí´ >9z¸t¢T´)Ì3EW][IÝs* cŹ˜µûHÝrXˆ{ú×ê çÙüt¿ŽWÁ¹¡$ž~€ÑÏäôÀ ê±sWaѼÝGczÝìW4†Û©µ1-™žÑ´4øîêØ§Ôç#2§Í‰²:©g_ÿl¥.úñQxòµ 9g5åjžàTcnâ{Š2ÐYzÍW-â¡åްƒL2­qýÈFÄc9!9çÚ&Q§…æ! ÑUáQ=‚® G…Ù«v[Q0ßÒ%å|óÌÏ3¦ÁŸ/¦3 ÒÞv@-ɼ;•aеA#%’!¸çÆê²"ÀŠœ³ñã#‡W@ŠMuê´žö̹]<„ÑÞ¯–9{¥Œ +A‰æ­!Nчy:Ïýi*ÛÇpQÊFæWú9?VÕö6·wË›â³Áú`=âôZ]‹S2œ[™Q‹Ô!ûáD€l5À´5ó“½ê-4š×U¨…¤· °oƒÒ¦*ØYÃ][™P_nv—Uá@Å>ùŠì;=Ï “œbËØ{#ŸQïベעþÒB\¿òàÕPÜòk޼œä ä|‹ÚÈyÒeÛ¦‘aޝw›Ï¶ƒWxÝággѹž™Î†t$]ÌbÁDDY‹;ñ²”ñØ9{¯“ZŒ>UÉ S+ÝibxÍëÓ*Ï¡±y]j¨u¾#Æ•Åì?c¨üÜÄtåkÞ¨òI-œ*n™Mƒ˜^Hæë?èrq…ÄSl-:ãè}¯¡ÃÙÅ•ÝVÍÓ'ªñ¶mL*•«uÏÈKÃDí3¡|úº¬ïÈ¢‰é·à6ÞîÓÞƒŸx^ÂÙ ,ëA·ø~*HS¬ÅD°üt°¤b·ÿÖ" „þAé‹Ü³Q”gÉ…9w»ìg49R%­á5w#´oÚÁÆS×^Ï~GtTxr ²¦Šìè+e~›ëZ…™õèr¦Ðs+Ä'#âÌ E¥¸Ñ-BÍÊW°‰f½Jêhe•oÒŸ)Žî¶ýÞ©©Ã‰ÛºÆär›³v¿Á½ÐXÎ!$÷FM^‡®ÄyìíCÐN„f¨ÂM¸<}j…œÅɱœé¹©Ä K¾rÔHclÄ8J–¹Œº)rà¨wéî¯ÛŠ—W²§Â’áÌ=Ü;Ä•¿+HÀ…J™—pñ8qÑDêùÔhw(’Ø @GÎÏ×}ƒ” (EÑÇäbi˜`{‘ÆqÞ…/_sHzå©AìÒ$/eEÙvP è ¾ŠšÊœ£ÉdJi€õ]õ]–¸is‘WT‹.sIV&lª¹ë ð@x}ïת¶ÚVÁ^¦AS¦à°6y†îÓF%°dqö’hžqã\0c'äí9x_öë¹TÚx9Ú z& ¡˜}L£@}”‡F¦’¶î¤™¸?eò¬Ô˜MIz%zãšÙ:SyÚrP‚Ê2£@©‰í¸Ù݈}°¬RÓwUžÁF¶>°±¯ß”‘|™…Ã;§§üÝýUO6 Ogéûa0Ó® •oØÎºm‘ŒHÑÛègnaÖý.ól ¾Š µ9hÚlêÄSʵ hþá óö·×Ï—QòÏ–»( „?©¢%^ái>/}’Üp®÷‡2Tå_?ä—Ù©ôÔ ¢ßølò¥CEd¯|¼Ö±øZWzÑ¿ú*ò{z½mc.€÷€ò®‚„8ñsÖŠ™ø—éªi`VBTDÆ0rf¡ Š’ ¡x-_þå8¥Bsà’@öcÁó'rK-¸f-˜GyÈÛ…ñòšŸi³rä{d?éMñRÈ Õ…CcƇ^¡0 q`vl¹ò$ü⦠l’‡½ÿ´E1€uÿˆ<?蔇n”ÝÀ»&Ù^½LRºÖ-Ô54ÚØš¥¼‚¼o£Šfùööš/R Œ%¢Žqp¸ÈSÆœÉU¸…/R·¥" HªÎã’ãkamQ»¾a3ÛÉ?,±O´ŠŸü3‚  ÍÖü¹¼eEJç¤,y[Ó¤êüa*Çb¿ÎewÊâÑ$ùùU×ðI0•ÃКwŠ. è6ôfZ6òd ‰ÿǽ)WhkyÙ#(óÇ–dÆ\:â‡*þ¾,ë’»^àïÞb›dÓ”F˜ió…Ì›–¬å¶Ã¼ihÃÆãH&¡ãK½wL燸ð’^ª”$@O”ë 0Ê|•͉K ÆcùW7?(‰ƒÄÀU»îvìÆØ/iúÕ<ÑqA7¡dEƒAh¸ί˜ü›ñ•Fâ»™zluS§·FŒä!²` V£hàÛ¦ŸÏ#«¦œ’ú#%V_h=v»Gù—‘“jŸVõ˜@2õ Foã‡ýf…p*3F̯0Dz}Âîú jRÒûT«ðÒöˆŽnЕ¿&G OT5gfyy«áÔÙò^ ß 82ĬÌ ?ëf@œL×~½»¶h&4h;ÅAKL&[]*¤Ì„ßÚfß9ÏãÌÒ±'ÇOú²MIq„Ê};éñt‚øP¼»YV§+á|©þS“¹Ý×ú‰ÊNǬfã(È’Û;Syg™üË}+kѪ7ô¦e*¢'Rº *Û:ÍY‰TE(lyŒ$·RŸAì™]ïsmûÖ£Â%R éì ?Êo¢Ãj)ô®E½z÷E» t¤ÐÐŽœÚ) P3z6?Bý4¦¡b–ïcý|Ë.[èÌ ,ž‘Ψ˜^ɨ÷eê˜V¨iñ̰0¿ 2Á ÷CT‡ýÄxmÎsÂ+ŸÍ9~@ôÚ}k¤zÃòÉâ|™¢tI*ø%ÑÈ×õ¬yËàºùÛ°\wCO²[qpQl@ÅÅ8ú¤ÊÓCeÑ_^Å&CˆóWÞ [ê}²rÎæÇŒÉèËæS¥pý‘o»ü4ƒ> c"Ú1·ËwMó…ÑÁ“A–ÐÉäƒËÝjU¯©§#™wäI‡à°Ùºí°9K¼×«ÕÞî)röºP*Sæ”táüî ª2r+nD–úé=qý_ˆk¡£ûˆHè¦Ô&¼'dµa„qî”Xá¢üáe”p½i½ù6©»óV;7õŸÉàÚèZC´¸v ß›Ã(Lù0ª ©>³ÁmÎ9ó-›9 íúrrWóøI]Åà’=×*\¦‡å*èSç;I{^Þ2<ϱÖ’#ó#CG›à©"œ–wq—©»\*’‹ÏßûOœž¾—ˆêè#ÍDŸÔ!reņz³õˆœt©íááÿ¹ûb•”9åˆw¸Ÿ¦NûuMç¨ÊÌÕ»Ù'ÚhkOVs¦øP=Ó=ø ú*;|H!-8ûŠQ0:¶x½ûÊZ°îa·tÃx+'¸ŽÅZ$sÒÆ=èši'¹M.UKÓ¸5µŠ!äÓ¥Áhâ ­Kùî[‰#‘šJ¶$ÊѶ·ÿPaˆŠ-^q̈ÆM°äy¦N°W¥ÃÞ_èqÓ0òcÇã š(ìEÜÖi-:´—‰Ëâ%[AÑ©Ô5²d̬Žût%yѦ§—³3ç<ñð‘Ö“¶Éò.?´R‘=QÛo²NW]ðÙ)š‡ø=‡'Z¸W³æ9¥n+òf¬ ¿¼¥¡Ä#ól.f~%;—†–1vé$»ùûm `| úPŸ¸!’ë#åæ7ÌæòÖb0ØIlS¡ÜÖèqÔ [5Am«!{=Çê»Iïç´÷ÝýÂh¯Â?±‚ð°òqòè[•BXEFÕù$"ÔÙÀ[u-jóÑOÜÑ Šm»çwë3šcì•úKø7ÑÐhî’åG …Ì©±âÇG7ÓVÕgòEÁ{f3ë·"Ü’»H‡"ñ$&ZÇѵؗ‘Zâ^P•©GAA; MÌfƒ½ kkåB,îGx pA ß êè·3IÚ0O+› T¸«Êðú.cø+áÝ)Ôâ¥üÙVïè¡û„¿’‰D *ë¥=óâ‘2¼g—RÊMe -¬\óQÇî6µ äiŽ»Åjo›#+$•¦<Ÿú-H³Tå¡CÂRèÒƒvþ’"fX½§N=¼l²:sº@·gŠ©ŽN‘õr0Çw¿!µ÷>´^|þIÀÇÇüæÆ=“ÉÝóvnðçÄ£ò™…Ž½Æ·â]¼P’³:SXh¦5ùn|y´t2Q0¡öM05i¸›e„ î%/eXN)½E‰#Éj6½2Q·|aåe«‘…ëµù¯2 Ú:QcbÀ^Ø#eÊY«ü᪸±õJ檸c;KÎÉê9ÕÐ¼ÅøK'5Üzú×q§Ò#Ý-%±NèAôÉ*kg›uä'üÌ0‡ÞcI7ˆÔ¥÷Á‹µj¯ã äøª%½ß3ÇZY,wóÁÍ´5HÏHí0CÓϾ"ó†ñâÍÛÖ)*dYoåa×ÄM'7 Å/ec<Þ Û[ʃoþ]¥MO.Á¡ê:ò&»G‡ÊmIO«¦5¡µ.ü++ÃhÔz{òMïRèë¹c.6õ廦Üî%M/åˆò¹Éª¨HdWíÖc“·lí:qIä¼5Å<†L4%¹ËªÜØŒŠ±´8ád%óª(zŽy&w9f™ ¸1œä¶¨c 2狘„ðñ¤8¡£Ädg¡‡—ÁþÚß&Þ帹ž·â=vi²ØÄw µ÷~_oas<ÁÅÅsÖCâ—Ÿ=eÐç¾^¿6Oïm#«Qõ‘^—Skø†çÇîæÏdŽˆ…P4SÎ\ ûIϨÌò®uƒ+ô¢r³É=*š°i_q;µ¶Ñ£eâ#Þ–A‘˜¹à""0iþ‚î0Eû>Ô5!œ+NÎÈÚ/Y^_ǧÁwôKP7p· –>§Ç‹eç» ˭õ ¹Hh™2m\ª³ãNüY¯¾†°MÑðUÙ‰^y#“žBÐöÜI]4ª&ŸY·ž\&õcIÍTÞ¤ïaŽ~:Mšh¨]ˆ¤Ÿ÷õ­¹ÛÁðÆô)µŠ'9Ì»ÎçÏIÒ_ùN¤=öØÚ¥” ~ùSî1œèCª‹ÅgmWzËáyþY¤”Z™T òá¦Áº,Éø_Jé«U"}‚ˆœL›üp¥ñÍÃ|õø$Z:Ä&Îk?Ó¥Û€Ï\º Y3ÇFJ4tqk<õßXTCížêYÞ_Þvë ZMs=g9Q+Ω%êÑmÔ—TÚ6'd~C¶˜}â%¨Lòw8п9†a†ç½ZÞ&ˆô¸ëM^^«ã©*ûJÅ ‚A游2Áo>h-p©ÃQ.¡ÂºÀ'H vã‰|ô©c¶PߪBCï[:6dÓøGP»hL`\aø™ïzÌ@uÂ|ñ±ò§ñ± y 85ögNÏÑ#Wn¹r5M 5~‰Œ=ÒfI¡Ë3#Ðǰd>Y›è“Iæ®|+“ËNy­¼ QùP#[d}é¸1Á—†í„B–Ç}4˜•1å3Ý¢åÉWr+&- IK=vªSWÝ6­üúS­7¾y„„bÓÖt ækø€p-l¼v#ÿöW‰’ÚEP6i›®0¾yÛ]ÖGJFý9O 0 þT§‰è:ÐýÆÎúäÀƒíÏm½€!EŽAPˆ¨¿1]b„Gñ¼„B Áá(R\Ò­h:J§È†Ã½¸vÔáÛäÓЗG?’Y‘CWéÁ… ˆþÐ(HŽø²LçnˆGT!õ^سÌL'ƒÌ²c;ÉCz½êÃUBËÊd!ûýƒÑ+ÙŒmo(±ÏØXfÍñ=ÅQ^‚M·u>!ã½ã#Þg{Uê±Ù—cÎÈ@„0xšFQ{jbÍ‹ »só: £`<__ý ÎW·™.¹¡éÊ(,Ç o5‘«_“3.Á™ç$PžPsνMy‘yÞOÎ8 ¸§$àaÌ:°´[Vÿd gæpn,RŒWÏ9åm?¸kÒ  §cœRZ6ø‘XAdÒ152Îaœ“¤omr+‘¿j¥{ÔZƒñ¦™˜Ε¢Lq"5Ç&'êü6ºk¬;‚CõAS©UlYÍÒP”Ưžy1['¤ýÜsóŠŸ\ 1ÄD:³Ùh³bGÒãÀ)%›dnlæ-€È&¶ã“˜fkÐ*,ÅC¢7a]Íú–¶I{—Ýnvj ¹¯}ÊÕì£ÏUAª‡¤<ƼxgtyHàÐ5áù2}{^n‹÷•l}ãò,Ï9—û“ãÂcmŒújÅœxFkHCz‡&¡àÌ8•ZÊÙ•T_ zæ-dXU¢É¸NÓ#òrÞ””AsŒø¡;dÔfòõ´I¾‘4<ÓåØºíÀŠÎħîì…nÍݵ¡j{Üa?›¯ ⩃ģ|ôŒÞ›SR"û‘ć.H¹µåUÄ¡Ø}g¼[r=ýµ@³ã¢Ñ{Ÿm8;·Ñ‚?ÓÊf9·n@žŠDl†|œèåènQÀ·pW߆‚–=låü©×§Ï9ºŽS¬Õ„véŸÓfÿÖø-JÜ|Áð‘&ÑÏ̯1œ¸}?ûËí­†w º"™'±ü½:¤ð™ÜèPðIÜ™ 2×ÉyB¥¾xùäs®5F}-Ñ8~µK ™ ”ODØå!²D[\ô©Wá˜ÆuÄ|½ ’Î mzZ+ ž\Lâ(Bu³;蕼TßHâ>wŒq -_BQ,zrQÛ˜¿SzÇþÇ X–±1­Ê` ç—­ŽLwTœ ì/Ž€˜í¬{±±üí–ŠkÎÐüˆxzsë+4Åë3IvÍâù!yN¹3´ƒëŠïÑ,ÖCïïÛÐ~윶fÆ)5‚vž?_=c©òXÆ3{Âe±‡.úê¡ëû‡Éwz}ˆE†æt«ù¼›kÀiL ·¿ÕJe¯2¿ŽºÓ¦‰tÝ¢Ç!¾™p˜B_¢ÙЛQ§n<ÕyNiW+s]×-W}*†)¢ˆ|=_­˯*Æ>^¼S¬ÓäÞæ£R3{{â~×[Håer¬³~oqA)<¬´¡Bò.Ŷ¯³~tŽvU#Kœß¶/œº÷Ûåj̘ÊÓæªE5Ž¢zEAÏŽ2ã“>0á{½£”dâÆ?±¯ÊÒ½HYg{W-‰|Xlä<)Ò¥ùÄÑ÷Äßjè¿Umç¦K½¼áþù@õMÆ7GKA:5õË}0÷ TçWŸ½eNü¤ Faå$[æ­›LZP\û,\1žiKzÁòéÅüy[=“Á*¥í_¾=tA‹4lÔwmzNÅoc¨-ÃúS3Ópâ· s~^HþÐn[ûÝ"´º™îÑôy5!“Æ<‹ÒRŸ,CÕíõ;-œ1§˜jQ”A!^ä*Ž›$º ÞÑfëÆ¿+’óÕ²d‚!bÑÝ(êõôVÓjâˉØ™­5÷‹XÝ'ÙgK³+›Ç‡÷7ÔBaY Fјͬc:"xþñÐó妸kDeaÌÀ”I¤Ø&ºñ9{–úfÔ 8œZ#Šeo±5g™² ·sGBºánf˜qè¥ &Õa¥Ú„›ºyXÁ1Ÿš0zÇ7-ùxåxÛßVXî¿÷W¶”'ý<{Ç™JÍ®Ìßh9E×. Hœ?£Œ\—^‰ ¹SAµLà».ì©vj?Ë<`žÞBÒÏì§kÍ>=·ÚX]ÔL7Ê¡)eHÅuÞÅ0#ñv/+«VW4•ÕÆ^³ßJ=æq}%ùÙw —šËzþMMžP5Iávc.Ži2ÕÁ`°ÿb”õhfÅ&šq…)C‰²|–ÌÊB®bChe 숆éч­vX%šÝ)¦rKkñ7J„n ‡*™Û¯Ò)=³=&ÈIU¯_£Ö0Òz£û•9/ªcjÝ´+f?še†sJéÂFô¦û·Í ÃƒI£Ó|õªÞ1´—Ýž*º”¦Š²89FãeóS~÷/³ûÄHïÔ0¡;¼9¹p`)@³Ö§;u•x´¢{õY„ìë²~tˆÐÒŽu_bãfTQp¡ˆ‹ ;Iˆ]»-O®#´§R…ú˜³ŒFï ¯ö¯´£êÉ©,ET£Ð¨£]ÇùÂWfÿ®oÉ ÖÂ@&Ò?FŒŸH:§£Ÿ©AéQ(.î m¢õ]⼯ûØs3;\qÇþ«yQ1SeK ¯¤÷G–ÝÙdÃ`;öTo)/$,=²4ÖdSÞåúI™ú„S{ÜÈt!üòdSýj¢ŸÀÄEHsA‡³iÞ„ûŒ§–.QàÚ¢~oùûè¨ÓÈ‘ÐAŸ<¬¿çSðù4$ª‚Oã¶üóæNøEÉÑ!,î…4Ùµ¼ÈhÞ«6 i8—æWø^Þæ0écÓdízQ>Ú7a®µ¶ÄïsðÅÊòù™áÐu[žVbƒVfjfïÂe -IëAñ×9#Â@T3'/÷’XÔTR £Š'%ýýû×& FÀ}·“£-;FëÅy†3~¿zÊ"LFsïróçïÂ\í‘àö³í£ZäO<‚L¯p>-Äš3¨‹zöÖñßiKk>Räš^'›’váiUNŒüøâ™ÙÖøØßèõÛP'œV®˜ðšJå~WËdîš—G·Óð(ÓºìmõÂûÀ@|ªTCÕ{ôÈ:gý%š¼!\XÈ îþõ`yº¸g )[—6FÓ>_—¶jT·‡v‡¨^Zm|0æí{‹!é\è0ƒ#ý&MO·®ÅF¢Z´yÖOÑßßÒP71(’wÈ·¬Ëò:ÁOÄrÊÈ“ñ嬈)áh[¯y3vÃP(gWò"˦N¶Ûâæ{}Ì› TÐ)ß!“5ëíá£õø?nRçÞ·{…ñá&¬ovâÛ ð1Há¤ÜDj¯ì`°”êæÜïS Ý/r” G±ê\QÀ—q÷Îñ`F ¾:`‰5• éqï7äÞ·ûlj^á.,z!&zQIïï{/£O³_ä¼$jb_âÔÖ!îÜ{#Ïôä— }u“¼t¶>÷IºM†÷Ó CM6ÝîA„Ÿ´ ßw‡ûõ”Jž K÷Ù¤¿»‰Œ÷Hs¤ñã8Èð+êžRù8vúèÌÏxh¼Ž ¡Ÿª©Œ®÷¥(r«|"‰¾ã|À€-fRÂjq)(©½Dè{ÿµ¶ftUhbçNZ¯ôÑ»ÓFö„»Md|Ô Ê{øö±h¿yú÷Ñ*7k'.Š,MÖLÙl"Gz/{ë§€h¯wöúF“ ÷ JB_ã>|¾gZQèK}=gè ås;¿œí&àÙëÐóöÓó pk)¶ÿÒ°÷‹à•ú…ùZ¼ܪí–3ó¡âÞy‘’óH%.ÏÏwŠëž@ÇÍ \&ÆWÙ“6S«í)¿pBòÔªŽÕlCI­ƒ#6‘ÒLg‡Èx‚\ªbÙ$bpÂO…“²ã{Q ¹*L¬E‚ä‘ü†ûDD#ðo|ô¨ø¿ØS_È;ýºóÉɤ³NUr9(U7©ò8O/O3p|Ó/ÜÈÍ;-ú,yZDÈï÷­—0Ráé[$¹Ú}ì»~³ÒqXÏ5/%8#>2Ñ€ľ$¼Ô­øµ¤ÜÃ[¬¦ª1ópîñ|=¸IKG0a–¢Q³±«IXd…]Jx•»87:Þ"y¢…ìþ´Öºn`•€i¾wtáܳ®b¸¤*qÆÄè|VPFÆŒUÁ»ìa‘~^l&Á ‘_Ú¤°¾qHg£fþ S¨Ù›ÿ´-ÆŠ'nÕÍ-¯ïç„ìë—ûêI0jâ‰c%"ÈÝ&ÉGz¤øó8j¦Ñ+BZ½ùv:M¡ƒ?'¼4Ž„º§n_~S8®f\`…*öÈž«ÛÞRÑa©¥Á¥Lk5JÉð¾qä>U¾ˆ¤72'´NÃ|Íév½ãKN1“ bG$ Ž`òÞ¸ºNø¥$\5ã¶¢Ú9×ò;g>¬öZãIuBñ†É8oK ‰ïs4¸ûNÕûß\Ù¼U„sÇá£MkIŸªŠFE`^Cs¼Äßhö¸ež3Õ'æèßyµ[3ôD±×v›ÊÆgïy&SÏœ¢‚™v×W§ŒZŠñE‹~È¢¦ÄîH¾¹PtÌ:@޵ÝAè9Ì6úÕYÒXþZÌ{•›¼‚wÜNñNÂs«d5c©%áæÎ{lNYæ9à\ì0JPÙÞøéŽñYÙ¥yÄôlŸÛu#öMXê.˜Q*1.ÇPäP¿ü#Ní÷z£yR:¹c@<äó륓FM©=æ´OðÄÖŒ.+HÁÖ|ò„VÉ"W¿…e}î «•jeLʶ6%í/\ˆî6Ñ»JTÝgcqnØCÃÊ}Ê®Š/Å¯à‹†ùý=§AnŸÜÒD‚ ·Š"x©¶tßsä~‹<^ˆè»:Æ{ÏQ&ù½C‹Ù¿zNŠhŒc°Æ>t™29öͨà zÅ?*ÓuM).ÒáÂçÍŒ’J)?ÓþÅä‚«5'cc„²žï;—Õ¯`…T7qÝÚCÆ2):)žn¸ñʰ@A6j$¨¦ðK˜Á¥76rúJ¢ap³¬gpúü÷˜{ã8„W²ybE¤ ½Ubb_ÙåDnˆOÀÇäŒiÊARP.{Ÿ®~ú–1£ÞW&–s›í<Á—ÄÅkhcVǘÐß–¯:>}Â4ÊOùõ9<¨Ê¸óuÆ«ê”lßÇ|ôã7Å£ÙE¬žÂÂý¯¹™CxVáA˜=â3é¸&"(—èN(%æuâíÐ¥&5ñ–ÅâÇÞÛbÕCP| Šß”I­„fç%åxÊ#=L]Kf®Äy“v.O2.OДD6sãÜÍM_y%^µ<Þ×Ý¡—ŠsJò¼}°”Q»·WpN·¦D°ìÆ|…÷úœFÎðáþÑ"[X8}~ EÆYÿ.É8÷°KµÍ…"Y§”¥?Y9·Çé>j¤¤[8%àÛ¨:'°ÔÆ!Ãy…*!¹ÁíO‡¦ý–ô“&Bíl¸ƒDp»ì@ÑΠÈÛ¾dO¬rãýu ¦MUXª¯’²~˜9æ8åzRçEq„³®¦mßR¼Ôè;GîP/6mIÚAv£èŸo¯•ÞtÊáv,±ËÔ8&´¶¢"’0¡žåd³™²~ƒ¿#·þPŸg¢µÎÍÞQl«8³u9TYšz{/qèUü1ö=@‡F˜£樓Òò»)¬Ï“Ã×-f¶ÇÙJtÒFqtë€)L‰ ýDF[öQªˆAdic­'C#ÒîøWòm*ð­RúùÂIè`¬ÎŸaü3í’Û¸¯R2)+2Só%øë« xµuƹÓä‚õ(#>8¹dZœÞ ’á<•tuèœÄŠkù@Þ Âäâ’Ѓªò©lu >f‘àQ¿™I;nÒÎî¢¸è ¤mC&/ORɾ6ãû‘AŸš«ÙÝ` |ÕLe*–]0Ä„ûr±Ç*I-=Ø:(Y¼Í±i´ñù\eíMÍh~žÙ'0g j_üÑÖŠ¤„lžU†[t[¼Ð°a)òè»åSkWÍHÏçü…$äµC:ј¼ž‰aÄe9A-‚‹9½Õé|-qèúŽ~׬êýj^fuQö Ö*’屺ÒBŸÞAC±L&ÀŽcŽc¸Y¿97]Ï*óÄ>ÒnO(E‡UǬëeµ!¹ž‡ä¬<"¸„Ïå8îêcŽ™ô§ïÍ‚wxSE›°0_Ïôy×X£776Õ!¹(_LZÃŽ£>yfœ¥í·qóQT EÆüö/£zü\ë5‘Oû.ð&»¡WϦeWÎ¥¥÷aîÖ¨é oˆ Š<[Œwf;oa³c–ÈÔ µAf`žD5C½ %¾w\bñ•z’Áé†6ø¨›KYyz‘ba,-B.Ì›îL˜cœ‡íüûËŽE_Ýâ>y]r£@LU³É¤Ú]™H*,Ä®L>=JÛ)ãû ¤>/ 3¡I"‰ÝVùï€Ì§¼©§_§5pÔX’F¿º ¨PR…b~ °Î¹7g5䣬Z°A4šn>ÉE,@_‚}%|-ô<_t#PÚÏ,Ð!ÒÕ¯álOã¿lÝàë·ý¼!#ÚÈ5~ßý]höÑÓ Ké»”©æ½¼m>ù‡õÄ@UóVü±èþM>»ÓJ=@xðÆçJ];ùÐü" §Ië—R‡Qо#Å?gAxâpw‘ñ³¿,OŸE©—©¶^ý¼›ïüµMŒ¹PNæø©Ý×b ‰–«éXÏC9Bd_Y¿‹ ÏRrTØö}‹jZ J +ñÉ‚Å5›Ð“wø´x`A?œó> stream xÚŒ¶P\²-Œ;ÁÝî. Ü݃ëÁÝÝÝ-Ü înÁÝÝÝ=Ü™oî$sÿ¿ê½¢ ÎjYݽvï} '–W¢0²1ŠÚX;Ò330q„d™™LL¬ LL,pääÊfŽ–À›áÈUöf6Ö\ÙõßmÂúŽïq26ÖI'K3+€™ƒ‹ù#€…‰‰ómì¹ÂúÎfF€¤5ÐŽ\ÈÆÖÍÞÌÄÔñ½Ìÿ|PR˜99?Òý+ `´73Ô·Èè;š­Þ+ê[”l Í€ŽnÿEAÅcêèhËÅÈèââ oåÀ`coò™šàbæh P:íF€ßdõ­€ÿLÆGP65søÇ®dcìè¢o¼,Í ÖïNÖF@{À{q€’„4@ÎhýO°ô?t€k`f`þÝ¿³™Yÿ+YßÐÐÆÊVßÚÍÌÚ`lf ȉJ38º:Òô­~ê[:ؼçë;ë›Yê¼ü«s}€¨€@ÿ}Àç`hofëèÀà`fù{DÆß4ï*‹X ÙXY­à~÷'lf4|—ÝñŸ“µ°¶q±öø706³62þ=„‘“-£Šµ™PBøß!ï&¸?6 #€‰‰é#'+hºš2þ¦Wv³þËÉüÛü>—‡­-Àø} —™1ðýœ‡ƒ¾3àhïôòøÛñߎ™`dfè0š˜YÃýa7ÿÁï‡ooæ Ðdzß=fÓïŸÿ|Ò~_/#kK·?áÿ:_FAyI9YÚ&þOPÐÆàAÏÆ gag0ÿ^²ï¼þ›F^ßìßmü•+amlàü§Ûw™þ§cç/Õ¿/5࿹dmÞ· ú³äZLìL†ï¿˜ÿŸWý_)ÿþ›åÿ¶äÿ»!Q'K˹©þåÿÿ¸õ­Ì,Ýþð¾´NŽï@ÆæýXÿïP5à?—Vhdædõ¿½ŽúïAÀÚÄò?2š9ˆš¹äÍ MÿÙ–ì*¿o™¥™5PÞÆÁì÷³ ?šÿå{¿Z†ïO‡ÃûJþË|¿9ÿ]RÄÚÐÆè÷caçèÛÛë»Á½ò;bx0¿ßE# ë¿–ÀÈ`mãøžxÏ `lc÷ûD9ØŒ¿Mÿ Ž÷-úƒ>…þ OFá?ˆÀ(òô‘ À(ú1Åþ £øÄ `”øƒØŒ’Ð{ué?轺Ìô^]öz¯.÷ôéSézçTþƒÞçSùƒÞ9Õþ wÎ/ÿAœï>ý?èÝgð½×3üb÷ÚX¾ÙÿXØØ~[¬¬þäÿ>KF£ÿ@Ö÷ÑŒl,-õíÿŠx— ø‡ô=âŸÝúð®œñønüdû ÍþàßÁ ;ëoèü‡Ÿù·Áòÿw¸Óßí¼˜üßùMÿ ø.£©›­)Ðú¯ˆwÛ_õ™Þ0ÿ ¾Ëiñ|×Ìò/ø.¨Õ_£½‹õ‡™ý=Õú}ûÿò¿Ïnó§™÷d›ÿr¿cûÇýNfûþ¥fm 4þ£&ó¿­öÿ%2Û{×¶ïÏÑ_tïJØý9ºw!ìœlF–ÿËüû þRù]‡?SüF@ç¿cwxÕÿSû}NK}Ó¿(ÞÛùSàý¹dt4µþµ%ï³9ºØü•ðÎáô|—Ùù/ø®”Ë_+òžíú|§wû ¾«èþ§¹w&w ý?¥þëÉ1t²—Ññ__ ïïÑÿà}Å®@C¸¥yCî@óšÀ¶û*<ú½qÞò=µoÔôKöíN ¿RW¦ûoØß |êF^Ý¡ºá_&zñ8i®ƒiIPh}ò|ÖSœÚk…[œÄìŸÈ?¨í#€Å§Wæß÷|±óTõ³oý!Ižmçôéƒ|.Ú½K¯˜km_ÉÊhðüžÂ~%‡üsÉ4}”J¤–ß÷YòƒŒ9l(GzÔKW¤Ù›ÛÔ¬‰7"É8Z8¯Ó(ÖM–è‡9÷µ2e‡N2 lðÔÑ) ÁÃ$I¬¢‚ÕþE×fž¢,DºäUzd†C–´J3ÅëÆžjçÑ¥æÝ쯀@J¼~´Ý„êâFt]{9ŒÊVÝ4ÇjV Áa‡±àZÛ­j—±y2þ2çtí`QÝôÄ·©Ëã©Înmh¸Ÿþ.8¹å~¨qx§ËKí;_¾‰ 3ˆ©føê WA2d‰ãX§P™nÙùë§gHý ÿŸ‚¸ÌÛùLLŸ {@GñÏÙ³=F{•×_Êvl΢,Xº j¼pȾüH¾¼ÌÇ1eÑK¦ÊIé ËY¡Tà®ÖÏ”0^n–c2»IÇo³/þ +`“ëÙ[¨ ×òw3àÌc8W-WieÏS Þ= ;¬÷ êå¼5:ܾ--ÔÁ8²Q}¸,w ŠÞRþ˜Ö¡è›Õé —"&Vx·3×k@z¦,èLlÕƒ¤¦Ìû¸3ÖYøìBW"!LNY°$Ó'uÄ⹤½(\ЃSåËvÓèËRÓ.wO‚޼Mž¾¿NªÛ>Ô¨úóWOIù>—Ô}¤gazl‡xdj‡Ìò\ë;[o€›=2Ü2Ž‚xaÇ7õzƒ—*2üÕ8¼i]ÅE n¿:m¶¸q:8 !H ÝÎÊ„þyüT_L™¾.]@‹þ6Ÿi¾ížÁÿHÓÄ[á U³Ž~ÃTʫթJ¶!̪r ;¹ÿÌñ5kÚU,GÁz /5g׬’|>1“xa Nš«Z33å×N5q¤qÐÃC”ž9JôÁš˜¤ŸŠhò¬"9Äô\Õ(”(›¯“$‘* —zk„$ÇA$K@(z<>BÅrTÑú©NöLvžÌÍ‹Ïá%\G0]0q!eOŒqù©JæYùæg£À3~0ž ?¥çÝÀ“AÈÌTì “òÆÓzduQ×ø°˜¾>dz¹ž¸Q~ä S__U•Æ7„£Çwý1é^w4RókÇõ'Wy6æ9‚k^lj{qe$DnŽ”æ&/{)'æ#Ö§T!H³TÌ:qÇòš©¯[7lÂùWoCBr­ » _­––}696gbÍ4Ý;‰–ܪ‹ÚÊgŒþ}Ã\¦ ‚Ò+É™,u¦²ÑgŽ ìÄy­û˜}–ÝP* +ïxb†ò´ºêöñu–ذ”‡~¨† Xf;!Û Õ‡p)Êà9¦Õä  y22˧£Ç²&ú¬MÍNì“YàØPÄý. ŽÔè ¹I¢A¥{Èä(N “·LK/¶ûºS|JvÈ,Mj+M!b_7béÔçñ¢ ¾Þ<©DLCj쑉»-­K“,Çr ¾âè‰Þ_OÖPÊ'.í ûmdÙF²ZBMiùãËr·óüj,®D‡Ÿìˆ¥¦+vðlN¼w™U#yù«=ž3Åw©çظ?=LÞ ø’÷–ÿ˜ÂpÙZßbѶ)éÙTè¾ðI˜Ž 9æZ‹BaqÕ3€YL2‚)tã¸óï\^ˆ"bK[³+]¹PÓŸÌTUfйßqcóRÆïR¾´I<›Ê>ÖÍ{ìÊ¡>|c—v6œ³Â€4«/ì¤$‘9=¶êåoT› .ÇÎ/·Z5 gZúIó¨—zÝ›“°‘Àh|Ó“aÙN./Â’ÃE¨*@­$(͸ÏS‚yÎŽV"”)·q—aÉ]á1Ò OEÚ²øÒZ*ž&äHà'ÅE›x”®^e,ª]]µK0W)Ox]´ù™d5”Wü¸vD·]™Ã7ßÒìjö;}ÇL"~9æ“Æ ÑŸD‰ ¬n„¤);†H22 “b}/kšàVeo-î‘¢>P°¨–%¥$Ý’Ÿ+€‹ª‚1j‚ø^ªÔ±«Jƒ+f8t9~ëß/Q1›0 Ú[E£ÀKÚå3Û¥!¦|]ï! ±u5Ç¿¨†¢` \ÿRÈ®DT–»qÈ~€ÓÅÛ¾.ãØû˜&<6%8aþŒ ŒÔ£µôÀ…¹*ÜÍÇêòcq°âŠoÈë;O¹ã¨ŒaèVe¡÷k”2Ò”ìD¡VÆÈÐØús{¬•ŒÂú•+°bªªr/æ´…Î|@D­cËÜ4£kûô©tž0à´'8È$‹W‹w“ŸDtóQJô^9Çàé[\‡ª_´%•¥IEWƲÁtyÔqÓaÉ\Ò܈ÖÖ˃>›3VÕ¨7 ”sÛNµ éûh ÞAÇâ,×Á(:Íúƒ{\ tyÞA>×<¾t¦;Žv4Êe‰=|xAnI€³¬pG„ŒØGN2 i³WŠE¼-kK7ÐIØQ¹ú+)ؽù±|¹hìaçàŸõiË\Šƒú{õ½…:Ê¥qµåɽŠÎ\&?)À+F*£¬ÙÒ´¬A&n·ܧ^wñ‚¹,VP87†+Íl׿í5Gf§ò’ [ M¶<¥E—DZC€cqþ¹,Û_x´f ¾$…˜Ð{·”›ö£­V¾‹+ªú¶œÎ»HÅØêa*~–îjs’XýÝÖå‘/¡‚e#ÚÔ9³Þê''†k'Úó%’ÇëÏÜ—t>îCuSäp6­•Ù®àƒLßüQæqPÕ˜E]'Îg“7&¯VqQõ®ªn7õË(S$Ú¤îÞØÉßm¯º3‚ãRnûŠì9ÃÈ0¬›Ô…Ê…˜{KŒøIïŠ>LZȆÌFHUfÏpçuÏ&Xú‰>RAÁ/FÊ^‡‚ron½–u?Æ—#?oд…óôæ|ÝéC D+wè,ää©‹AÑ R=Ê5Ýlê%ÇPH-°‘oïÝžB ð!+‰m'™bem»“ç\à<Õˆrà ¥ÔÛ)'D<µ_V{à’M,8t˜¹Hl$â‡2@H×!P[ ¢`asA-¶t‡ß'›eQ»@«qY ê?•ã4xËÛ#‘+ÌBSë¡EÕ^c,Ôs+‰T¨† JÔRøÚ'JS²j¦Œù3êPGpk¤›'£¬D®\+Û"õ1¦†V1eþTÓ¾ íyPý¦íLÝèÕV½ˆPq·¨"ÿø n\TE$÷ôú5òrF* sI<’²¦þ3¨†ÿ8’ÄÒ¦#yÞî[Rz§fõÇ^ŠŽçlÓqë „jœ#uÊÙýî垟”_ì}f7R­u­¿‚KJç`ÂÃP%ñÃÕdL¦Â•×ËxH‰Öo¬\êX¤¬w[{cžéIWæiìèç«ä€6÷y<‡¢:o_Ho¬¶ìç²%übþFæƒfo%ðvîð½»ÿúÊZcœ&¥•·ønØáæÒ& Ý€ß#Îm†XHˆ(ˆAÍG£áô‚pŸ Ë~ÓÀ6ÈÄAþ›ý”Ömåøl…4íÔ&$K4Ïfï´ºO‡ C½I ´ÆãînEÎD[º5‚îÃ!YÁ¿XøœgÛ` ÀޝÛnBz¾€êç™˷‚KZ Á6qY"††ƒ¹ÿ¸' «Î捻íý3( ,¥üÁÒFpþ¨,–()Ù˜éá°1\4Ñamãñ¼XdC_3Ôßø^Þ•ÍW<(ÃóZí¹Ž{EŒpY„UðûÒõóþý–¸ÉL©&Ô=sÒxÊ™!»ì=g‰íg–’­‚/×õŒàçá &T¿Š]1è>8~Ö¬Øþ4– æÐ×äÇE¤HÆ©ÍNúhåVAmVîƒs Kêø?ù­1Jí“uZ¯úuà vÈ=ï8 ÈBÒK#Z'E$óAê®cêè­˜ Ç×{gböÇpGéVMžI †¬_r{ºV‰*ãšà>'ZþP° Æ-Íõ™¡î nÈx¨/¸bŒâ†V¡DÐi¾áÚu„¬6ç?Fw-­ ¡bæoÁXQ°‹.H´P¦l¾ÌDæÎ䉵ó^Üuòs´”bNøÒ `ÃM†³‹[èµ›.ðãÛ˜tgR¢íÄÏ“gîñ&)±ŒÁ³–J&É,~µ¤ú9SOCØRØc´²•e—úªö ÷¤îYY\×O*ßÔhž©dsŠRñúÑ×{Ðó« ]0E<’¤þõôäxTfV}¯h& GŠüа@¤²é”ð)WpiTBÏW Šù@z=Ó‚búaTS!XÚ´D~Ïß[ÉþÕMŸ #¯.V<7ÉMÈ …¯ Q<…¥‚ÄÏî¿¶1E… wŸ÷>£' qHXÜ<$yÇÃÃßu5 nŸ¡ûóòä|ee΄ErŲe/7ER%)ÏÁrjÕ0–ÚxjWÔ=M¯q ‘/wG„_Iœ"‰ç ²-þèl ò Í/CÔ_kGµº„µïZ¿\€ØÍ­m‡ëç -z¦!qžë%d’¿Á„Ìë|Ø£±ëFRÚÉHáÀ‰XqJù¥±ŒÃô,Ñ5•¯çÛúÆ&õÞú(xßÙró±bñŽ‹9ñ7˜¡±h"݇†îÚñ+Ÿ¸mÉ&çœ5~Ú«¤pdKÐ%H+”B¦|~ì)\u0Äÿ”¾çÕç㊴¡Ö ²gâýÉšæƒÇ‡JK>b÷눯蟛>ÙÒKOQ æ=_Hé}èÕ‘wë%垯ýr(ákqií×Ñz£‰Ç˜QÞ*’50¢]iëXÌ´!Zú®Ûæ>umrl2¦¿ëT'š=•ÂÓƒöåÑm­©¤l쑦 lÐäöï ‹vw,[‘xêXnÚÂUªNפ4Ц&ý›ÊÙµ7Â]A|üäÇϧÔýù×)âÖ±™`-EåIŽ<„ƒyY_dú~=8ìú>YpJ|ùoœWœ>¾ý6ñòD‹¶TøEäô{ò Ãñqçd äŠÒÇËê„•0ø‡æ+ˆÓK‡’´¥û¡?š[aP—Qyo’dsöÈ8œk”p•ÕQÂHW°+¤“ßØÆ¿Ÿð¥LPÞžÞõ<øˆb©ŠIÏÓÑ`:`”‰½æoê06ÛÕõ@ Ý‚šFö!•=ˆÕ¯<(0xoŒýö-/>QÞ‹2œd¦Mêv†tj[ÛÕ1(VëƒZ¡ª¡!Dº@•ÝRc„G&ìé ËÛ—÷¨»ðS`Ù's Iáé1†úyÁÑ›@9ܵF,¯F_ÂÓ¥ØpiÆü¤èqÖÔ ”öä#Æ*JÄ(z1{W±j'§GE.X'Åå?vaUž©ïª Ñ׈¡ŠÈÄ-h§ †mg‘¡‚hÿd!çQhÞßöÞ7ÕÙ"Ü9=­òÉ ]ð0*´u™ $1{4;&²á´OSñ°vñâPÒ¾æ•×Ý9Ãô «W´)(Û*È*j~¿“³ÉQ“ã(a0êß*Çå'>XH>ÐÁ­À:‚¯Xjä&w\je„ÜW¢mRëBÔlBË ž XŒ‹ ’Ì0Áy‹=À‹pG—¦@È&O‹¶atþÚ5²¹0í^tjgU°ÞÞƒõÝ¥ý`ª‰)DÛЗb–åùúz <ªsÜ#e£ ­Ý"¬ Ý.™ŒÒ=O—lMð:$HŠ$Ã7¿È½<¯ŸºEšYîJ‹PÞá7oʧ׳Tˆ”ÿ¤öƒJ`À9²ñ˜F-Íh{{}!KrÕ9ZEÿ:bê/C£õõÙ’Z=… •£d\Û ÈÉÆ·~©\kvºÙ«î³©Ñ–,Ļۇ¨â±Ý5AAÛK‡¨Ï'Í:œ¤aˆ_•'2~Œ&Õch9}›_@AŸÒßbéÅSRákõp LšúŽŒ˜§MsìÎÂVlxw; ÍFö“eE´ªôÄ…gQo»hó#õ‡²RÝž%¦lt‰Éë‹E€VKãæo•kì›Z‡gŽçÞª¼ˆÃm«x1y¯èÛ5¬ªioóê`;Î"ûœ†G]7žÞÿ³½8p‹GÞ@¨ûì•ÙÛllï-? ˜_µ¾|¬¶³y´œ=åáªOÍd£CœÜ-~h7Ëã ™Ï1ú¡úfþ‰Y©[¬|H³*{CEðåqa[Ï»ö#ßÇU)¹V@6Àîf †˜9ºFÞ1=ÏU;c¶Ø½ߺ›ŽN½ dœÒÍIg#ÌÑ3Þ¼IF£ò‚]íx•_‹ü$»Í«Ñ(s5‚µNÌ5±Ë:&ü*©õŒÀ‡—[û"ë-œàzu¼íÉjyj£‰Ýuüë½uÕf­jh„ɸ8phøä§!'öÂÝ{TqÖŽKu±[ɧ $pÛ³«ä“ï08&ôV¹à1óg±¾÷ŒYI ÑÞQue”;ày¾J® ¾+ Zk$̹Xè…D°? !=“u"ØNñõÄ:œ†¼ö¶–9,ZzŸ@:I÷˜)ŽÃÒ,nÌöó¨.’ƒ1¢ã$MáñɤãÜÑd¾O~& Ã?±¼Áý²lœF ®’h8nèÞÛâÜm“|lM£RB$OUj¼i@·C½ÿëSh$BÂã±…ýÁÝÍúÌFMßós>œ¹n®ôýa "ýÃÔÆc¢¸2ë[^FµÔó9¸[ͪé8æ#PAvôŒŠL›lë&P’$±C—J€97Îý¤™Þ®kûv=íÆ3ÃBúô‰0h×ùAc\³É‚ï¤BÅ’$_3¬+ðj5}¡Aª™uVŒF.-õ‡þ‰„Exí‹Òß ø{!R½=Z_€H'Ra“ñõ¨hu½’øÖöx$p–’îÉF¶tEZ g¥ÕÿЧ#5™Íû1vz&-?Je}§Â)‚ìãCE¾Æ¥ÁbbqB­ üBdÇ_rU(þйìb)™¸NcŸE¹Íh¤Ô{Ýôù›‡ù_›Yy½RmÌ:o•^ˆ(|4Õ;÷  O}·ˆè–ÞŽ‘¡îga{Íå_6Ç„^‡z¸lû~TÜÂñžïZáz{NÛÀýae//OfcÕ!<˜ÞËäÁ͘öuí†)FK‹ÇÅ£N‰Õ¼<¾2@}30žþäBà„VÆ-Fb‚Ô*¸™6F"–õû` $z+E-µ‡Ó¯°…9Z\´ù—jE Ú/´ÊÊ¢Š]œÙÑ…-Æܖ½ÎíLõ.qÃ?ñË»ÃüÊåÜ¡† Ÿ²C¶8Ò‹^t|æ5;ضïG+‚eÃô‚©|qì4‡áøWäÕF #Á¡ý Ew¦Akð!;` {š$œîsÙÒŵ¹)ªÙÒu=kõ½d¨ð®ëT°þºv*Z_u9©D!`ÇpÐÓÉMròðý¿¸p0MrëÑÞöšD¸}^¥Öœ¯ñü”B¤¶30ƒôÎOæs¶¸ýÎMüm¶ÃÈ\Hl‚èpœÖÆLaù¡ôgýªšY\Ê'%ÒU±m’+ö¢2žïú0…WMËòZà‘†cÁÉ £ óñfÖ“ßrùÇGÃæÔc«lèÌ,ÚóJ¿ V£N r˜i}ñÙ%´X ,¼Úþ•5d÷À}0úÊ„l°âÆ}9ÆGŽÞ¯n#4dÅB2ó† ±)Óq%e#“rön]6BùVŽ|ꌖ”„Û›ò(×éú]«,M%&MÞC8˜tÞG=SÔo-Úçcv+« ¢î%&Pjù0̶›J´sÌJoëXf3ëÜdàáŒû1áC8 7øÖŸO!Q (,QoŽ„ºã\íBÉJ£<[o…¸›¯~0ÉàÅèÈ“ÎÈä¸T¯} ™T¹²à¥Xøé <ÄeÀ_¡£ˆ[ÊЦ⥥^ˑן(Î!ˆæ2×±©>ã¶,\õM(e‘^R£ÇWœ¨¿Ô§ÕŠŠn(› uÁùʳ²Z#Š”`–B´û¤°„EoŽ`(úåg[eBÌ@`g /ͽQúÊu. ÝÍ>Ks÷Én¥„ u0yYà¹ðPmùïqÔ.°¯ŸóÑFU‘”=…©sgH­¦û&sY¿ülaۊƒ*bþÉÖû´gˆÈóñÆøW»¦|S¤ÂŒ²Ÿ¾á¶fVmñ(ÍöpÇäŠlE!sŽ)ù¶âJDMCÏùAµ 0‘¥ÄAå×ܳQ}K ÇUF‡nûš«‚öþl@’=ð¾~ÆWpÑê³õÙ¶¾Z v°š–FX –¯ip–@5øšûyH [ Æý­¯¸º;"SÑ5ªE…lXÓÏi㆔ž« 7ØYÇã­º\jÀ;&ÀdP×ïc2˵­Q.Ë’HïûËY·¢ Æ..€-z¦È§6®ç¥:—Q•Þaõ,üäŽ"oüºöéG‘¨ï“ÔH©-ñý•6Ì ¦ýÑðôÌ ¥¤àf;¸OUЇc€"­œèSWÛXîHËSAÍá«ÌÒ¹¨ÏFƒÒ,‘ˆ”ånœ…к¯±x”zç²°’œÂ,$G1÷GWÇ>5|ÝX{ 2RÄÅG-AÔÂÅ9ÈÝ!éÛÅÜ}EÃp±~§Ò\¦nª+-狸ªsvG2Òè”^)@o ˆÊýVk?-ôC%‹ € 4k„Òöç›ÐWo$^ŸÏI’ÕÆ´SΤ¶¸]N@}ˆå¤f<‹Tl¡(»4T…Œ¦1Ï­ ‡š2û2—d‘teq’)ÁŽÄ)%ÉŒU4ØñÇ5‡ºÕ£†22É“W·²Ç>^ŠAÎâKm÷·>ŒW cRšÚöHZøQýÙu»r{;4˜¸ “–2æ7Lê ûÑ„÷ñasú´ Ò™J•²)«œ$û¾[kÙ5:ù¸m àèB„§{-„+·7+Z=9ò«&ç›±zœsO$Ø.ѳ#—Sô2oˆ}¤;9æäÜkßY“•æN€JÆ®½ÏCc™'õÍ2ÇEIÒ° ¡¢ì'Úºƒh«uI«r å 8Fÿžhc³ˆžÜB°—é8Å{Û}†I,Âù-ïÂiå,y®RÓ)Úê.`÷Cé¬åÌÈ)‚«ô]›šš!fšŠÔò#o»)1à§‚–½” ¸ßmøggÊdÓßååå{ÏÒê|æóñÙW›”Aá2î=]mL ö”m¬A0ÃÓ¦WŒp-¢à¿A"d‘î g X½†„ØåVVØÝxĸn/}잸,Ƶ^P1(ýUª¿#B¬ VŽ9Zj/*ÑÀÇ|½²ìtTf l …šÄOæÓABÔ0š»P““;ÝÞ›ê°êÀŽSK zê\@²Œ>¥SïïDå‚.Ì„qm&âÛëdÏv#)]s’Kê6þÉíUtÙ7œùS´4Xg™ñ3íjØ‹§v‚3(»YX¶ÆÅT²®;¡â"IT_ ¾HÅdàö‰^ôÊ Cà +Ô2 f„KŒ^;¾àfÅ~Túóâñ«èñJÉIÃJ_ª¼¼|V9/ÍÚ{UÓЀ„Dðô~ÌlÐY¼…Óó¹´n-,³@YÛ:;¾‚ðãl +»-P>z;˜L¬Xƒ#à]îU»9çà§3fXNå½c-P³õø–Æn7‡_-.=°˜›Û¤I¦ˆÑÄÇ$^λ0¶ôn¿v`ôPÚ'ÆSó|çó¡ÈWðà×pT„Íc/N,ŠqdéDO‹÷#òتDz>êšrѳbu]ÙšEøË%<ò‚ît¦‡žuí_w–‰IËrˆ€™µ2§(ö/ž ëhõhR­Ï‰Å¼ ‹\=özÍÀ§ÀT³Ž b6ÄòÚ‡ˆÌt`pº=Yf]UÄæO=®|há,nÔ˜b¢¤Dlm®‚MšE­fçªOÏÈ•{™¿}ËŠ–ÖŠ•S>ÛúÑ75¬îÞ¢j42 •îQÚ¤VíÉkòNûžY ¼Y˜¡x[{£8¬Îi8^¤°”´·ñDAøààoËåÚqG¸ K)'î!5ç§Z«÷ù¬šž•5á{©ä/ùZ­4ð‡4į…ÕS_xzvõd“¡‚£¹¯¥JÆŸõãº5ˆ_føV £ú!vx/J»·y¼»Y©@}ËZù8ÜôßJÔ:¨~ÒÇ2]²]–ZéÄ÷`ØRŽ”ã bÕWDOˆšÆŸ{âž8½Ï,ŵh€ŽÎ§ÈkBòg¶Ý•; †z±/9©Å/਋UÓ4×¼F¥ 2®ËáÔf35ÎÞæån¦# ½Ýs’¿Iñ³¡–×7¯ñƒØ$—£QÈ×ÓÞ:±¥Io7E¤l X=ŽàÀÉ$·4b%çe®:ÂÀ E™û,¥ÃûÓj˜?×È–·.€zÙHh’4Ô¤˜`j4cTÔô.‰“W¡…U²]«uèÕ~å¨Ìkl/¡&3.„(…õöaû »ßˆúÀHkÙEíC)ÃN2Á“¿­±}&ÌóEÅŸ€n·æ6$¢ÍŸB}[ƒhDJ>DqÛÜkuuòZD~Ò}¥O’{Á"A—º¢Çù;ïZÏ6nÞNø)«sç§.vîžô²ø¡® o£s)L.־܀á…ÿì˜'U+›ÜksVc†q&e•+¼˜ƒ¢u¬Û“€é ÈOÓu“ÊœSVÐô:«dÖÀ_â}ÜIÛ!¯¯ä™ëÈZŒOÌÒºièÅ_K“µgȘ((å‰3Ýö(×+“Œ‡)°îûák¼/Ë0)0q)á¹­²<ìrÉìpômçÇÁ ”€Ý&axÍ»´\ê (Ÿ¨À›£mšñ)Rû†Ö ¯VM¯]Œ'ÞX_®çJäPñÎAÀ—âÌ+o¿ýªsp|(V9TÓ”PK´|ÒÛØ’ð݇#ú˜Shîã§EiÂ|æçÀ[9h)èú - €Ž,¸L\KYT!!ÅïÛ—kÇÞûR(}˜Xö "šg‡ØJá5+ûÅ”g ÐÏ<™¦×­1ŸH„+ÍwRÆŠY‘yò™—ÿôž½žL³ùmšÿ¨nƬBÅ'ic™'Zñ#*$¡âJïbjŽÙÉñ·!—+æH›ñé“—aMئä >m½‹ŽÕ J´#ßë_Ç­£*Þ¡Ö便ÄÖ]]^¿ÔØ}ûŠ8R¥¼”¯Ä{KP´þRšŸe Pq Ç+Ø«__PvaÃÔØO³}–;±Ïv2Èmì‘ìõÑJõÍIµæœ:ˆ ±YùpîŠ ¦áCš18ãf^0÷ãܽ4Â:?#uÚUË«ZE÷¹ú¹Ýœ¤õÕäªO²=ªç^ù kû@‹%* ˆ˜yH’ xÚnõ2G£ÄaÅ aÓn Ôö)_$ëôwš%ë5ãÏ•'D~—ž™ö1á™¶‡iô ¿Ôí¾9^]”øÖ÷•áÛío[ðN*ï±Wˆ“ÁY‰âÙ{uG„³B# ˆZ›Tª¾Ìˆ‚fПc&T=ÇŒV$œN|†§bÿäèÓ[-gªÝ>Êe!Ú9coVíg·ö &þYܹ«Ø\#tqnöse³U ¯”ÕF ‘.€V«ð+}ãò5°šÄ=ËÌõ†™oŸ–O8K›…¯ŸÑgU˜Ý†¥¾ :›èy¨‚2a9i\})€ `âN… ¾XÑ©LãRÐË$=J»³ˆ,M›i<¹_ËæxŒ+»ÔéÝÄð) ”µÞNæ¯îùKªPèƒ\ʘÇȲ|׆ɪ‰ä¸¾[{¼¤‡yeÀ%W÷;¸C3Œn¢´( 1µÔ‚Üøò0úcŸ¦i¥Å×”k—2Ìpd×ÏXÜ m2YZ(UA¨ 7¬˜È8nP°˜_³^~œïÚ<Çg# ~"IPîH\‚VC§FÐÒt5#ó¥øDéžoxÉ@p.õ|&÷¬†I 0ÚÁ°ŽQ¹Í-ÐO‰‰™Íô<^F’1ÝzáöËVú¢÷q«»ç@½è¾,«àm­Âê•CâÔ  3Íø·-:½àp*ØÏ®ìØ,­'9õk^MÄÔLÔÇ㡾¬í¾уGÒB©hq<ïü¼3ypl­ôຠu \—¥dÕ”úÖÕδË⺾ ¼.f½|©APúÑäU§¢ÝN L\žYÁ®‹®hQĦéâÿ¢,³66ÜZh+6ì•Y94ÅNÔB˜±ªC×8ŠÜ¤›ù±å„z½emaj8@——C;b–3;êÃOn£x€6y{10£z9ha¨“dæ­fj°5ŒüIPʃç³ê4ÝIU^%´ÌaÕ^lW+ë§{^|€[óÆp_TÌo»·´ÓêİåÖ;hZ“ðwä¤;ù†>ÈD¢¡°zÏîíóèq`A²Õµ9Ñ„6éT·Ûìå/¯Š:ºrÌ·WrL¿DŬ°ãEî4Z#Ôuaqa[–ý}¹ø1|.÷‰eÃЬ¯ÀèÎRòã¹ýòÕKÇÈ£tŽÆSQ¨»Ö ém§Xk ŠÌŸ•ŒÇ´Ž¸NüÕq9¨™l”É•83TdLÜ11g¤•?M£Þbém—g“wjVÅö68*ç)ðgÆòr¾L©¢ITâm¤°9_8‘%$Ř‘ì—Ž¡æõÜT…$/Z–vyB#Õ9aª¯—w7;V¹­ûþ`ò¸d\Ä¿ È¿ª3i£ÓÇ ]U¾¥ !{ÝFGcF-)Áú»ù|®ÜÜi•8P›t1BË‹úOóLàÀ™&<–Ь+Uü;í§ÇỵŒ§Õg{ZE®‰„ 0R6jø«bâÙ]1¥¢ ÷éáf+[„Ñ/vP²ø^hô÷Jìàv<*ƒàÚ–0&7k¬°ËµÑ“Ô²({¾Én%Ü›Y°e ‘þ•'©,ÚÝ„,2ŽãBÞE¡Ç"ìQ£äc¿ždèÇ8&¡•µTm]†+²¥ëaN5ö†¨w)ÕŒ|RäBl£Â¥‚)‘‡g½A1*ò¬ f½W³ÛØÍ^W…áT|ãïq~Žt• AÞˆ³yö»û«ŸñŽ5 ªE¶Þ«Ng†R±7VJëLŸ¸wFüúðÖârïîv”¸'SƒP£“#QáÚrËOSñÁl¿(¸Ñ…½D îs1çEZ§v‰Þ¬ÚY®áÒ5œÚ™Xè‚Ê4¶ä'»’¢ÌTñr‡åäµÔ” ­Œ$”bÐÏ&hõšu=–¶¥Fojú?é®™Cˆ÷"aÜ2—§ÓüÚŸãÈI—q5j:RÇ=Œí.óõ»—òA`¡ú |áÅÏm÷8u¡#©‘:¼LgÝÃ6wX'ÖÅx€.*82›1l=¢,V´â± îäËØ(;½Q,ÿšfCØe^±~\b­C©X›Ã[ËyQcAQ»ßm <QãfUá0@p}“©ŒÕSóKA³¨Õ˃ÖÿöƧ[Œ|—¦r0—°d)©³`®â&Ûƒ8Ð×´X6IÇž•Âb¹Àh”±Z_ŽW¦XÚ=~K»ÚõP™”¥¾Wº¥¾Ù#εóEѦ·yƒæ¢ÿöQZMeO:%Ä­²á<ßFîš’üƒ`Äj=YPv–f¥¦öx¿k¨¸6;wßÃ-7qlÚ)J¬ûD±ûܾFný‹¦v úLHÀk;K“G­Â&5|¿„õ PAŒÏÖY÷¦™Ù„›ï±}Z(­å+ùvjÏœ7EÛyf}|Tñ€Ê/¯A ½h¥½)q#&¹ðÒ.šfºÁnÃw7P–‹µý¢ç©¯™éRŽ<>îµûܦ¢‰M›‰D4mξqMÎ}Ê?ÍäRy•T—ùTå|‹Eæ¦q_ñ XÆùm×Â{•Õƒ’®(LÑClŸ3˜EIFT9ÀäH½ñüêb_‰åi²÷kƇü0ÊOGÕÑ åƒI\dòµ¿m=¿hMÕí:ýWïd,ó ûúcû7@ø½Ò²Lëâ‹„Ç)SVê£é¸Ä%\À¹úO,bvŠÈ5 ~˜õ‚&~e$zã~¨zŽO‘ž_˜I8®jÉ‘ºM4ŽÆoå¢I^y°cùŒÎ«§›ÌŽ·¡›Ûpq_×Ù 4*+›º×??»Ù–Ç(‘(0@Wl‘ÌŒÖrþ’ )ø ±(ÏF“5Ü¿ÜôA5KÀ"SÞ–É¢IõÐ9‘†ŒG€’€„Óx‰ôd´Y1ù§·fùÚ59tñM>vWM w–¨B …MÕæ|™,SÞ‚>5€öGßNãSæ<— ~i䬤2LžDñl•Ðw{E›8̈ZÿÅg#d•}QOäŦ ïkátø¯P'TCUfüQ(ìÑDús !QÎÕ™T´‚E" ÚÞ,î·¯¸ÊßYMÈüäÀè'ÅÚ¢}¤‡vhB°$ï.{FOƒé†+›^Vóýk)9”!ýPDG˰z¬Û–ú½Ï¨¿‰÷:‹8HÅïù—Íï“Mà`Þ ç ê³Û’YbH`¼ð¦ƒê^ÕåvA’ŽÛƒÁ]Ë¥! –ñ…If£}‘¢¦)B`@*²š°¤eKb£H|š6ŸŽÑ&¬\x›J¨Ø0@(ÀĪ_¸ ý·ÇÐN3 ä»pÄ’>Ðõ´ L kÖ­¥îÕT¹ô’e¤ø¬Âç…Ú@¨ÅuŸ°¼‚ÏŒûŒ ÒÂjuj<Ô]¶]Mm­Eg@:-TQhdªÏi%â;¬x™P‹?Ìö"ÀÒ0>È xÐúžûˆC±H?X¬jS¹t(ª|w¸Àë"aj=5ý>ª Ô´®ªªû^)÷9R^Tø,K»¨ˆ¶Uò¬ÒÓÚ›¬a—G2¬7ŸÄÏ}.Œüà^A 'Ú–dÊ7VÃ4TyÞ;†:nÈg3ëU»\±\mL´¶ÄFÏz±ê…þB¥q_Ø G„{‘Z]WÍ8¥’½ßòÑ*>FwŽ ^%yyÀˆ¸wèŽtz¤ô ‰îU4Ê<AKL§>UMo„ã!˜$€Þc#@õý8 t„î¶¹+>G]ÿg|”•¬ÿöÁÁ¶DŽTÕ|xå­ -Ä.¿eóƒÊ†¾kóaÐs(jÑÆ/¬¤GÄ9¶&Œ£„ ½Ppå³Bñ¾s¨·þÊ_σãNÀzMƒÐ”€Ã;YáIÝïÊ~F?7%Ô´Û¤ÃÂ臗 l¨ÉÉ;D^Ø¿Ûï/Q²C`"îh`ÄCI§ í,Ç,l«¦Ï­rÛ3Ú N`0°¦@£ãÌÒ­>8zz=â–Í«=1 T8¬/ç.‹±$èk-…ývÙn*!ƒ`H\ý …áLá>`„ã‘mÛY%×%Üü¸\·Tê˜X6«ltŸ$ÿ!äÿ©t8uÃüX¯Bݸ· ¬†…ïPѾÉNÕ³àBYÈ>«+)k‚·ƒÒÓF¼•!KÕÅ3!á(…/ÿDÖ%¥”ëÇdô+kùçpH&,4Ê2Xè/âÌ-êÄσ.‘“&“éí,Þê#¶Apš ©+FÛÎ?kti(n_R”B[i‘ñXW6® Ãð /Zà€còÈÜüUm~d„Ëì\– ‚ÜÉ·¯‹£Beþg„<Ù"ú%’T šCr=Ë÷ójŽÄ‰o”¢¿Vn¥ÂW‡¹­Îsk%’œl‹™Y“ÁÆu^ì€tÛøø€RJžve _Ô¡·(º¾@’¡bq¦ƒðìåí1:¬5„Ü$1ÌÚA®,ùS »Ð?>s+´YM£×YVÞVÊcÉ@ò„Ê(Ùô.þø–«’dfoáQ€ó5Û¢'‘Ëf¼†7ZYO°v6ƒÎbl‚Ô 1ïYfÖÓ{ýúæTÏ<¶‹d¥¸·g¾Ç¾´ÀQ‘+yojX«¢VçkP_¦’«¢tn–VššiíQ–S–ÃêÓ‚·¦±Ýš?LJö ¨œ®ð?êŸUçð¦:70óÐìdÀ·„#7Lo TÅ_‘’+Y~¡TÆÓ”0/¯„sHŠ>Pã³+ìSü9V~ÌGî33¢=ÿ±¥E›ÖƸSl»f¥ j?#,îI$‰µäuÜq¬•ûªOÀpû¡#ºq¢üÈ£6н\ç£pœ…ê-zMï·&q¦ŸäqSo1¡p¬Ê…bpðCª­¨b' Iaß"7Þäè_f“~ìÚÆ+~ô`Í6dýœCX$ì]®<Ž ›Àˆáÿ°q)Z8f¸zï=¨ &)Ddn`Æi[ ‹7IŠ5 „ °#ˆÊá¶=I`Vºn’~Ù9àÔ­ñ&'ÿ™Hÿ›– 8iZË oï‚ï½:ŸNÌé×åp ~Ta}´Î÷'~¥0¦m´/Dq?¦ÇíÍn3˜‡>|Yâ.¾¬Ì §²ŸY+*48×F-µ¯Ñ¼o«íZî×!—µm~‚ƒ™¨2£Sì‹vK52˜ˆ¦x6J„Û~mø¸ŸªO6ð÷r šæ ÑPL•Ùe´dÛhîëìÅ¥/ÑM “:¶Ÿó+J"<ãxrnÿL¯L!TÚ2¾u;ŒQôlÉp3>Ç¥jûõöøŒÖøö€™¨*ê cfݼF¯!}à&X~!þ¸—áç–bSò±\&?p‡Ä½.–OôǦ <78ÉÐsç="Ágs+½¯ÏÝþÁzC¼SQù;$'ç[IÛY š ¬[öü¶Yvj©Ä­1óawöhgo.¸íhBI1c¨}d-ž/™UžñëB‰à¡µçò)ŒH5ÿ' óè6:´ÒÖ£H<3QÛÑ~ ˜þ%Òڰ혤eê× ¶ëâ«¿yxòI¿§¿¥Ë1“%S­N•_}~§EäÏLÀ©[DÉ«àNy# ïëäMYWôBçí¼ïw¢B{§@ðæbÌ`ë ä¢Ãi$<ÐAä`1·¨š:,EŸhÞ¹óès¬Üpw§Tªø Õšãaÿ‘ã—bàyF£>Âkˆ’š,‹t0ÇoEPkŽ­f:<ª²&ùý,uòŠIÎÿy÷Pݫֆ¥Än‰Eî/z|SºEQ¶å@")úÍ^þTBy¤#¨Yß0¶,bV|”Æ:ï³öºêÍ]’{+‡>Ÿƒ ýëñV«]AE»72ßêªÌ—¿Ê6ƒÚ,Kš.9ò2¯áš¨ó×Ñâ³ÐåÓ¡*ŸGˆö—èi;³E@…YÚ(f!¼¢c‚~Ú›#ÀâZ…Üc y¼Õ:HŽø³8À°WäµY)õœ$ŸŽÏža¾…³caCƒÓ†Vkïgj@soûŒ6þ‡uzQuq…¿Â¡9›¸d²*V#ÂÄAÐÉ×”¹ºçÀi‡(ô;(dë#ª?õæy‰›—Ñž¢ ôÖ Þj=VÕ¶p<®7ï·SöŒBš.¯êéÇö¡´ ¾øªR=…‡êÙT'!ö>«F?×7Æíp× IáËLfÎÂêÒ: zò9´µKèëð¬ZÐ;(§ÒÊÃÐŽ ¡™ŽÐ¾(:' ¾ìyÓ–hÌo–ÇìKäå´au"Wä‘Áúä&¢–¥ñœg°cjCL’ècpM^4bõ¥t§|è] ØOÊl•ÊlSwú“°ëcêÿÙÖ µ=¨]±à3Ýø ‰AlìÏ9<,“èঠ窛!ô¸ 'Ì„½ëáÓ¿ÚéFö.}õ¥³Þ5’øDFR5ˆÉgö,ÑÁ¶hJ!µ‘moÍú€‰£§Ý²¨®|¯©¯8è:7=ƒ’±÷T«Öãõeu%©ØçÏmЇØkúëzòÊü·B /Ö„(“Ò¢O¸ä£^}˶»ÙB4ƒ‰Q=O+¤ó—TØ µÎ[£ž#­ä#e×HÖ¥tÒ.õ¦?„kžeè—Ä Q*mlÒó³ÍõÖA´ÐK›˜í+ÒOÙ‰Eä‹@¡ŽÅ¦‘TÈI÷ê—¹ ¤«ÃÚh„íþלw[IöËn{t¦û˜Á#ÊbG;L*{b‡`g£Ûͳ¹]„XRdD/34’“þV·”~Lé<—Èlƒþ¹Ó&4q4°ïñÜT{@pÉUƒÞûƘE ¡·”'å"¼¬ìÜL Îü)…Œ–¨’ðÏäצÃcQä_Ù3›`‰±;œDIü¶3l-(½dðî.¬½¸~d°°ˆÆºO4O 9ºjU^f옙UÄÁ˜§^íÎi‚·]"v«Û#¥žB;ˆœ¨ªÜ'»‹y»Õ” …‚5ï­„÷ .ÅIbäê/b<û¸5ÌyÐÓ+,vPÂ×™h³êMÀO´"G‰Ac[–ÕFb8¿ÿÿZÆugª{Çíuf9›áó6•‡"ª¾ e²èö…vK…»7-èÕj'‘¬ei^ÊÂ[†6¶…ÂÙ„> ¯a N—³¶eky5¿›H— šqë’©&âùœÍÖ¤ŒãŒ+Á2#¿3Â^§òÇL^yÖ‡ž' ˆ£}ÇOu:†¡ÿ«ÿ`$i2Ç:¿·ïtÃy4=+xGg[fGý²á2ž›)±u}k:ˆÎ.Þ‰Z'G´tx¦Ík”Naƒ'mN–¡t˜JrÐRY6ã0njêØKØJEyŒ¦Æ½Ú­v[v+¼^R#á4:âZ¤Ž-‹7ë ý{ÛbÅøÁ¼r4@ùlêwV-QŒ äaxƒ%‡]ÍݳŸ0š€ÅI÷è?c4_Öí–®›‰NS4Yb¹¢œ4ºw}Dr°œâàÚQÅ÷5^¿xWt½—ÿ‚è_XqÿkG¸ímabŠÈc¦]´.˜œ‡£9ÅÄ÷J$ûîÜ&{‰c9‡Ý3ˆ#z­ y«šC“ø¼í©ã‡ã1oö§3bâ…hÙ=‚-píPD¬~e u9ü\¢ÀI¦º³0Åý6lþ,ó¿Ê›å‹x ª%öÇB1‡ ú̧2áa+émüê2¯ç/­õ÷µû&2¶ÃsZVÍ­^°Fj•EéXX¢l‘@-^ŒY õ8l `oFúuÁ¦¨Ðx™ö1hE£x@*SõNXÒºï4k1¹ã\Œ—iÊ.Ú†e µÝ ÅÏ×WÇør6.ÀNzàj>;±ªëùD×EZ\Ñ:ꃤá•ÜSÀ_Æ7U’R†p\F9@ C-γ‹~ ¦¨@ü£ªkÝX·]-§¥@¨ªÅlQ¯Ž™¼4®{ÏceHzáâ³E£ù]Ëïùq`}ËÈF”^¬;lOGÅ‹2ï72Ž”/¦ÙZJ>LçÛû"æË‚,ö?¬ºÕ^™ܰOÄ—1QîŽÍ—9¬LZñ½—¬y‡£"6 1šI6èè=~™.©Ê(ÃL¨¬ ÇéâS¹ÞÖÝ0ÜaÙEô/¾ €\î!Ü"ŠåS±¨è¿y¨»S7¤TI¥Mc^ðÛ~7pÔç§µ´–Æ{¨¿ª¬,qº™@YQþÞ“uƒ+{Û“ ZŒfnÆõ† ûÝ®(ðâ<ýèTMXQ {ဠn£xö¥ú`P*E XËÃý~öp¶R”d ÅGŠ'OD¹iôêšÕ ¯R0k€ìäÇ\‡úPMOʪðo ’“ÁÔ"¿÷¢Ô`¸<ÌäÁ÷šÉ`—›šØE÷WÇ è¦j¹ÐK:™5Ÿ“wÕO(7B½L"b)jo4rÍaÞfËž¯C‹ß®„|œ@Ôypßç Ez”5E˜*PÄ>r¬_ÀÑhX%ü¤¹{r÷Áhd»ÁYäbøï=ÑÂWXÛ‡tÕvf½:Èë¯Ýz5”þÊò2üLV|ýӌᒨ}H/¨ ª-™L rFžº:å­‹#†CAð+Ðu*«3h @ÒÒo‹0XL$”W@.§x|;©F­è¢­¾î¾ÅÒ† &ÄsÈŽü›ó ÿ9馹žÓ4óroò»Nˆ„µ(VÇ&cÒšóÓ{ì-¼üõ†Šçc±"9+¶õ­YX²9°n«IhßÙ¡|:†éú®g}VؾŠOT´¬%V¶ÄÕôî` J,ºb¢DYkäÏMìë˜ÆCÑl;qì„àê$ââÐŒrf[™ +ÿœL£!‹c±9ÜÁ$«,éÊS/Fæà“nX¹Y´ÌÊEöwøöv×µÁŸuÑHÙW¹¢ ‚ÏIUVíSU±‘p•;0ð´œÓ•¶5¾*ÿõ!S·î± kB GL€PÍLû$Phõ:ã’¤ìR—`X[Ø +iô·…=ö›1±Óõ>óÿt±\eDdÃAO‚ ¸QÄ4“KÀêYõ$ú"év †ÍÊezÜUØô2æy¡Ö¾WHMÕp0뢇TŸ®­äv®Chž»s¾É@÷à¯_5äJ_…A‘Xóž;ÚA+ðà±9³’¡ŽZRï9r ×LWeaKvLtáÇKØ[‰âqC!ZMü=mRÒ" çÏË–ÚKµ÷%[—€V8]×=óm ß¡æ+‰¯Y|˜…û¡$WÉe DðH YÇÓ]Ð%,þwàìÁ 4<cxÀÕx¨YÅþ#>ƒ{Öf?êî°‡g5¶­—R¾ÿÕ8æ.²þô€9ÚÒèa¡kØzmß“KV´/-s]$V‹jè{Û5)Ó>°¹ÇÅ@›š—Ì«¥`¡LKuN±ýa2<õSÌï”F‹]‡cª°0Ìt¶PD»:è|??'ßÜ“kV*ü@†uÞõZÀüFa?€JS˜̃*&[MË}æ§ >~§EãéÎoô_Ý¡jªn¬©ñƈý8@/¹§ûÆ“M•h„ÂìÚôÜ‹UN}‚ï¦õVÀåB@ëûc ¥ºCí ¤ö ÷7"`ËйÁuËÓ6«a`I91.c“÷©'Ƙô¤½ºŠa†¯s¼î| É3ñ·£ÇLJs;X€c¸ßáÉ.v²ƒ?Ï)Ûxà ÚlZìãZù2ð+÷c'±9Eu ÝÙè|‘J°*õ°¬Ý3b„ŸûÁxœÈíà.’_[0èåED5¨‘¹–ÛfjFÈnv<­hFևѳóWúNk‚äÅ̹×áO§‡ÝÛ{hâR^Çè]ó%)›Y›z·Ùxì«êóo&¡AìÈS[‘·ÜOû”|âÃTï7¥Žª_!+Êê…ÿ×À"¯¡jŸÅ\ìæt7A´,‰úŽD¯Ý­“1ùæ}¦,Xü+šŸ¡˜¸Ú»*â÷™üùÄÝ,"ôÞ¯cÒèÖÑW·æ†âd¦,Y%¿Á9]îµRFJ]ç°X=Å’zèa:ÈK³Ÿÿ+wÜE‘¬aÊÁç”çjµ[PD‡’bNúõƱÖÄ–ºz‘—;HŽíøA¹2ú\«£Bµ¤±Ï#£GÛµ8¨q;ÃÔœKU¬’ %‰0+À¬üð¼“.ØEŠ™4cŸõ,0~éÕN蘄¸ðê±DÎHôéÈI˜wW ²‹E§ñèÐåè7PÜox£Õ‘¾N¨ G½%¦‘Hëj!¡œùœ5·üÒœ^<ßs‰ô(hÕ#Õ ÚLÆ=Ò9T"‘“£‘†? újüýŒiÅ+önlˆÂ®‰†´44´þ*s2·K“NrVL,:Ÿ ©v6'•NƒXé©D™\µ]> stream xÚ´PØ-  ܵ Á­qw'¸Nã4Ð4î.ÁÝÝÝ]‚C‚×à  ä‘™¹3sïÿUïUWu÷Ú{-g¯}¨)UÔ™ÅÌìM@Òö`(3  ¡¨ÆÆ9X€@vjj +¨-è/3 µâdeæÿA2†>Û$¡Ï_»;럓µÛ»‚=ÿæV`3óßM˜9;°j‚­Ar’QžM(ÿØ,@Päá〠7SKÖßá5Ü@8Ù~›Ÿ;ðöt°w˜?7ò¶2=ÿ x:»€Pˆ3ÈÛóߎÿF(ll3+S(ÀdaFù'ú³dþ'~>ÄÊ  |Öøûó÷?ýgy™ÙƒmÝÿ¡ÿ1_VuE™·r*Œvü·O\ÜÞ àÉÌÁ `fçbðñòx¸€ïÿŽ¢blõWÀŽÊÍí|û|Kÿ)Øå¯ùÓýµô€ÿŽ¥dÿ,Z€î¿rMŸ¿ØþŸ•þÇ‘ÿ?ÿŽòÓøÿ$ílkû‡›îÿÿÇmlgeëþáY³ÎÐgý+Ú?oø©Ú ?wVdfål÷¿^9¨ñóˆ-lÿ¾F+'i+7™ŠÔÔòO±üi×ü½d¶V`н“ÕïWÀÌþïy³Lmž_§gEþá=/Χ”›Ú›ýÞ0v.n€1bìŽ|;À“íyÍ@nhÀʶ‡><·ç 0·‡ üž(€Uæ·éOÄ `UúñX•ÿF|<VãÐ3ÓäôÌ4ýqr>£çÍü‡Íö¬\Vпà3Ãò_ Àjõ/øœÉæ_ð9•í? `ÿ >G¶ÿ'õs!ÏOí¿ÜìV‡ÜÜÏèYtöfÿb<×ù|®ÅéoÈõ\@ÿNøúá9=Ôú'åó¤X¡®ÿ*é¹|äOÃÍÎÔy~½þØ®çÁþÿñT‚@n S”¥y{S ëú Î›Z1WæÝ ¡ê]íTzfÏ%H—ó:R}MfÀ:äZ,i´su[ŠîJt™âÁó¨­)´=Aµã—×½aœÚÔnÊâü¡ÉÂ#±†A2dRf Ñ=¯G/-›m°=òÔ¹ŽÎ¼è*ù87®2n ƒå+c!ó»ª{5ÜoQï˧™£4#ßû—ÌRç™d;F„2“½dÀþá†1{u=ƒ3ùD!Ljâ}ÅQä©»Á};çñµRƒÝé#Ñ"]B²WØcS4žâÉò ž¥Eë±”9ü®ñM»D6Û:]%µÈá¹ õ$?!ë \¹‘ëí²ñv%”ñˆœY?Vå×ÝäÎyÚLœ˜”ã­ž”my¸ÔPùv{ïr<èðêß1„ªYâ%5P€û¹BÉ`shÐà v-†ï£ÖÞ›~ýô·©•ÝHЬ­ËoË"³ÞÕÿð«åèªÛˆÜ왼Çt˜Ëá6ƒ-îKÓ û¡ž½q'3;"Ø$ꦦ¡ƒÚö¤ITF’ø YdÎ×|m$ÄQTI™é¹mM*¨Ã†úõ»G¨ô5ƒ®(7aƒß¶qË5ËŸÄjªry3± ‘e‘b¢o[àB7Çñe¾lòK®a‡nʇE?Ò…ä_hWõ]Œw_œê0YÊ-ÔÅ1Дlqt³•cNgò¢¹H øûqùKÞ¶3 x}—F zòì,‡ú•ÏK1­eÿrì„#¸%׫>Ò¾ë?<ñ= ï´"B r×U¹‚¶ÂoçÃá ?Õ-®:쓳ù«kÕÂzÇ ó\+7¾0Z,xúú Ú!α»žŒå$ß…à[p ù¼H9…A¹ $%á“ °ô‹ô™<¹˜¥äPŸ"|lÖS'ß3O @îÈð᪇š$x[Е–-×ÉÿÂ@IÒ¥ 923“Ef QÜé¦{ú½0ßc&ãK–ú‡ÅK úÁÑ–Èï.*3–~T‚lrTʆ»N_ ;F¤Z8×öoŸà›lX¯0BCnžâó~üz•c§RAïF{·CÃÎíiä`>o‰Nðsò)Ê þÁâŒL±bò}‡RåúyˆVzé4ÛtÆ;ÐwS«âOoÑzÓ0SxVûDTSið38átféS ‰ÃíThqø¸7åxóywi%3á¦^S¼œ}jM¿eü6iöU_ü0wú•Èp¼E‰±{ó©Xqý”ÁNK¹bÌ~:Ë¡Uc`d·<‚[ oÁÞê䩎·Úþ¤Åð.ŸOÍ—Cè¡­æže¹>m(Dä—ƒ9ÅúWìÜõ]¾Ô¥LïP(BØ&ÃÇãt²1X |-Ü¿¶-ŸÙ –CŸ=‘Zª7€ŒØQ‰›N¦Þ/ô€à~EÈu…çø£U-Gógë9Í0°³½'6€6™y#£¬ž'i *÷$æÆ0Vðf“rÕ‚Bí¡¬Ÿ: i…€Z¯̉æ†ß±¥mq”âR廎òÁ n°ÆOá]³ëd‚/½HÛ‹"‰—ë¹ÉZ&¸<[6ÙeWò•¦¯P”>&2\¼ZŠ’!ýX\¸±ä•?ÛO¦Yød:^½ž€>Zj;ë»™À=m™Î ‡Ì¾´Þô%'–œBwÃEó2}˶SÅ‹š^k¸ÝîGûBE6¶M§1Ê~%þ¥|t¿Sj!YÁX}|‚{´ï±—§Z@~÷@cö§ñ”k¹ŸÄHþ¡~#©ì)Ä Ƹá÷%ÔhO©¢<œ¨¢O0xß8éâI;Y„`¿Æ)Œ²§-i*§·Ý’\Æßy‡Ô‹|Ã’™çÀ’$ãO 0hŽiʛɉe iãŒïãØìk‚ª[?5ÌB·P/]JƒAŒnW)ãóºéï£-VvO™Qœœ$¬&ÕJOÇ´Äi×/Þ®ôqìvaÖùW([NÊ‹ §¥7t ”`ó¹äÌĺ3 ÑÊÙA[gªùÍ”¨NS fHöŒÕÜrû)ƒïÍ(»ÔPa3|ÃÒ›Îrý{vøör Ô«%Íplû‰ãMÞÔÞi ‡”@“9½-¹@qk²JaÙ*¹"&å$nÚ"¢ÍI,ÛüŠ ” §%åo„ËTnÆ0ÈŸ”5²_jí2wеPÊ7µèv»¿[Gî*¥Ô¯ñXX]`iö+»ÅCã: ‡™dŽIThä2„,ÉîV9Z”Ô°’CöK0,ÆkT¨>¸*;õ$tË{0=LýÔ>™—¯cö•.ˆ?ûÆ>ÊÌ(,?_LñNÅ$(2„\zX…×§j* ²µ •¦Ta$›p™áL1(K!sžªÓÔ°¼#újëÒÃ×AbH{;K4öÆA"#}èˆ “qŒ®U1y®sYå—Ö‡xe‡¼OÃPS £ö¹Ü-`Fô@½_5/W¥ŽÝ ía|›|:*=q NâŒÐ'°ˆ”Ctô¦±#V~ÄûšÛo´ôŸ 9—Ⱥ½ßêäÕ06™Í ˜®i}àÂJéA™Fpqˆè+­®_€|Ê U39\`¬b+^q®G†½¡ · p—(E¯Ô/8I•'áö\Ð\¹«•cƒVðÒGcTra¼›¼|ªjW‘^‡þÍÆ§ñ„þ‡MhS>ÙÊGJC6@çÌ€¤Þ³èÞ -~›)aZô\Ÿq±9®+BbÃ£í Œå T;Ö¬îy{IÊD3ç¿|HBQûžx¨*vuçK>›‚xmÅ$6•üN=lÓýg­d@¼q.ÌÄ»`yl¬¸·<º ’¯ ’.Í÷äØJIEf­¡ý´£¼ü¬t‘rÙ2y9ËHˆ0Ÿš¸#†á‰BS_ 2æÕ—A®7™nÙ‹ÖþŸ…Â}k:øzv=úåº)዇š!X ¥žwJbáÉœˆšNú&q°äQÌ üû‘?Yñ*—«ÇpŒ“_bðoas»N<Ù1ŠCÔú˜tF#%—ã/ÒlŠIˆ>ƒ‹&±’2œÆÃSÏl4¼ô¾¦JÑeéÙ7|¯†`§È ´jîw”T`³ÉP½W¬ 0]ÙRtŠý¬=ÅÏÃàãD{vômÁ¯åÈpau¤Ã¯z1àÈCÝcåz Pº.«ôÞ˜Ij|ÓǼE›î·hÙH°òRfÙ—âs5Q‡kwGòˆÝœOi¤lJg·øW8Ë]й±2n‚d I¥h;_‰Ó&fC÷{½~—?vÆÖÛÁ ŽóKÖ«,ÁŒ¯$V¶)ÄG`Á%t¢mà6>F‡àæß8ð´œ-åK^Û» å%ÀôVʹœ—‹–ü”ŸÞS‘^DÑCéK8 ·†à÷Zß¶Y·gðcÜ’”ûˆš• rq„Ã8|4HIn¾?|€Ð¡žI£ç©E2S¸bøôª}c ¤‰5%MÛÅÿÕ.[Â"WŽ{o +Zû<¢VûvMÉåRI[ÿ¹@&ƒ´71•š É^t«3âý©O2±]¿õÄÌø—Ò.¤ZCŠð·?Y0‘ÞÓêä_E_êDäàD‘…‡Í{íaóÑ ev ¢¯™Cx06›ýT;}À-Ì®pUìÝV½¸.RB½„?e5gP Á½ð®ÌÀ$j‘Ì]µÊç&kí}ÿD|µåjgžFÇWÇ7Öv¶(!é9”«?ˆø ñAGÄQVȇ˜Fμ”õ\oˆLáKo55Óî•? øx¯”b´bݘ EŒ¿ü„>–|ûŠÂ¢½ ÖVóÞÞ¥è!"‡«áµ*µ‡ÐÀ›RMXgÁ«ƒ¿«Bž0RW{߬^Ç2íª´Að Qg³ëŽSá³æ,KuHÇ‹>©ÄÓpÁXg•# Gµ8H*š{.Æÿ’æ CNˆ Tw•;xKÖOîŽ.ݯvŒÍ ýJ3Å8D¤®£YÔ0sÄÑa×výSL'5½”ÏKÛ4ÉÞ4B¦„–BÃc«IÀ±û\FcIL›¬³? \"Ä|Ÿ`«f*-ÈèZ!V®ÿÌŒ³H qò ™1ÄIÎÊŽ Ó}ntÖîš)òðÊÐkÜÖ’SÜ®1gX/âîÃC3ݯ^6LÉTãwav­fØUÄXŒ »½Hf ÐÊ/F³ ÙÉ7Î%Ê:"S+†C²òÜ‘¥jä´D¥ †Í%±ôéDáífž^øÜ5Ž+zCç}œAx¾‡¯‘‰¨ª˜’¤RU`tê0–gäéùH›‘æ†~ŠÇ˜ò™@ð» t!žO)}©wlÝVN–,÷«SV¿Ð©£vlk žàÚ·M~¢¼Œ!j¡¶§LA/­e ʉÁÔâJtÑÇÎÆÜ¥T‚÷ë§aœ W¯ø4tEc °dž^”åZñ8´T°7'¨*T4ðÔ:||Õ‚o&ºO¯¦ßûd)²¬gì BuìVd‚wݱ÷h8ÏhY})·å¬$.‹A{ Ûð#š`PK»/’ò÷,(ý]Ç«¯·ÓûxVú ÝŠ7[øIðãŽÓRjØâOg„ð½K‚ýZ§á™Wîaï $ÎåaréýiÖ?Ú)†S“ÀoçŽõ ¥¿‡ëéý2vÎã Q™[ P‚]$/Þ¼ºÆºÊPó¹-°{⌮BvQ٢Ǒ©¹ßÞU!¤Æ¨7×§ŽQ†úûÆ´ínÚšwŠÙ måa Îço6Qx7‹†N¶Ôo?!”]hãÒì—Ò#PÝN,øÕ¦GÎÿbÌ#x3˾ge˜V&žåájDª/q8¬oÊxàç?ÙÔˆÀøé¶©zW‘ØÖò3oáýøÈ#¢ýÅÊEô…]»JS‘†^çbÁÒ¼qÐ)í $z¹{©eBˆ1—åjØ4ÍDëWܧB¿|ñ¥$Â0ƒµÉ©ì°ð&•TÓ“Œ9²¹t*@<œäB츜›–bl¤<æå¸n–Š·¶9ÁqHüb¦¿ýÍæ7Ö ¯iEµ»f£H’´2î=Å;¯Áœ~ Ÿs¿Ÿ:çr½:Ûs:ûÎ¥'ÄY â4[)Œcׄ–ÖÞù F¿H_‡K³å†w¶¸1’ïœ)pó³ePÛÈMØá@U¯vÃ@ 7ëVj+ïÜxÛÄR¤ÀêØIïÕðòsÝS¤f61ü3ú^¤õ’XOÞk𱞪$”@jš—.õ5¼¦œiÚŠêûBµ± /.À$°_‰§m2n3¢^‚f£˜¢æn(Ä æ¥³mYMÞ_mÔ»È}ý¹7 ׂú"O{ û" V²nöÛÅ/›§ä|Káæt£à¸ã¨2•Z:kj•êÖ‘Qa ”&mÛ$ÿ)¸´¬Ð¦·Å×ð_ãÊhz#,¯`hºÈÅ`CÞ`FDÍRßEó™¾WA{-C÷z mp«üöáª)dóaôc/nÒ4&ŒG0ý˜€bDx6â–}pÝfÛµ`€=¦V@jY~Tà[»Ü5åZ¸Ç¥B×>Weg¥át7Óˆ¬´'­‚Ù^¾JÙ>GÞZöÑÂI,޳ü‰óóß¹ŒËü@õtDÆQŒ®ˆ¸÷Sú³L´×ó(ó•ÖŠ–ðŒû¿ãÍc:mc¾‚;fP¤$£Ð$ ügµdX»³Çª˜ðB;0q¸[cYÚM$/ðy=Éãì$4[ZT¡$ÛYzÕºëåØXÖCé^:/T9)Fö$ñtA“‹ß ìwvï$ƒ¡j™:¼3G›%O jÛµZd2g$†„áDÀ1ÇíïÄ&ÅW¨.$ÑSû„²òˆø5§\Í÷ü °’[¼Ê {Øè] ñ.!£7©^ë4u“ë-Φ-§Ÿ-aI R‹ ·Ûf"Ó-·¸¹ó [™6W®ñËç³Bi‡G¦ñAv¹µ$G Æ[¥<ýb÷¨ó'ðAFvêb#*c—ÑYü•)©å/QQskÃ-<ˆªŒ-òî•ó¢¤j“h „Âå¼ ˜ÜŸ/ÕÑ2šJBLŸ¸´ð`‚#Slµ&Ö~8nI%k>Ð!@cG…ó¢6ÛP‰hÓ…ò´:›P?éé첓ü8þÜ)¨µ,­Ý?øÊÝÞN9Ön:ïŽóÝŒoäôj¢Kà†z?v=ÂÕ‘LØ4Ê*¬òhÒçjC5´(Ê„dS öÉ ‰`n$©vo!¯ïß.³ŽñeããtmCtZy4"téifØ»_³§µŽ‡­µ·`PoŒ>\€`WèÓÎÁ'Yì³dÃ}âzÈÂî§€#E…€djWAŸ"´/d„v8kš9Ó¤1u¸§ÚÎúJ#—šp†\]‘__å']Ì Ëê†Ä,q¼2ÑŽy„\ý€‡Õó—sdRœosŸËK2G(båOÛ¤(Ÿ>sdœ<öiC½JN(”ÿ¾ƒ1³Èö%îcÔHXþçî€Üt¶¤7œ§ˆGÂÍç…¶ ‰9@ÀÓyȆ|·P͈;Ñláç‰÷v° .͉½‡…Æ}#+S¹å”æK_óóš.´ U9èï“êäQ(FŸÊÚÊì5/wŒKÅ)«”F²dƒ~õh/øòŒU1 ‰h\ó·¼½%ÒO6ÓÈX-%ƒydQê÷¢;áìVeÔtÀOÕ? þ™5ÿæö¶¡~þP|ÑÒæmLhðŒyR~‹ïûÝÍ83ÞÒOÓ‡oΙ‘d)6#¿ÏŽ.|Éykî² ÐØx‡sůDì§X<¯qV]ñ15µfêcÞs ìúOûe³dx_’®®Õ0b”)G¿á±MRX¯G­*lpœ~ót?¬Ë\ÚmÊza ’K×C*/ÌLÏ‚¾¤<ç¦íAž4Z5Ú7•bn-7’X«ÃàÀ~: Y¬$<ùúåí=µÒ¨©ý-4G8úvÓBq~GVn&·/ýР¯[•öpÜ«#Ѝ{Õ]è·I’âqèÍéî© 5öø§µ¼`‚×Ez/¬Ã*‹4&˜aÑÛJ’F{!B¨²Ÿ·¥[MØ|¾æÔ5×0™}üÈà\áì¢Æâ£ž°úeæ[®R÷øçä̈"]ì€Ì‚%ÛîÒš›Nu”nË Åý<»ï3šPoæœ*çîh¿£!ÞñF7ÖBV ¾½6·¥Ÿvrðû65ÎJ¢u{¯«·~ìÁM&•¶·qб7|’ ˆKÏ\Ò$=)AÃiB†^GØ¢-ca4]r¦ü¹¥…¢s=÷ö(—8ͦL<ûe‘ð.ãö×Rqb/þz )˜þm曉ü\¯Ù~Â_c¥šR˜\$Ÿ6雪¢ŒñH !ƒõ{ÞÖc¶ÜGòdÒ–ÂFç Œ“0ãæ~bG9Ší‡Ë‰4œ:îIø¯ª ú4 b…ˆÇbö¿K]¡£”*F ¢Ð¨¿™†#¯¯x"$MlÏQ¶‰ðI¤Aáâ“0º´ØÎÏmÒ¢‘ùn¥¥M¿Ìß%-ÿP4:Áht*áÈún2Ûií&¢€°^LÑõÅdzÊdv}cú ÷oS ǵfФ@ãÂê$nYáÑVTØÙ]rðæŒ÷Èp?{ ty\ŸD jžzù£x^„G–n ¾ó"2þLñìL–}Üֽ¾‹ÕƒÅ4µy|×ax¹#éó0© 'lëHÞp?ÀøbTB,)H2I,¹ænÖUWÂ?Ç(dP¿ÆmË`R|ïø25öV"•²­‘3ª ûeòË4åRkXÑ$5ˆ|ÃñÍ;¶Ž­H ™a0·g5»½’\- }ç¥IE’‡Þ¾r¼[!%/‡AÎ%Æ»î•sÔ7ù‘T¦ë^JQ>hzuß«ÁûÐVr&]åùbÞ=Ÿ)&kÚ¼"×m“Dã"6ŸˆÍßKú+w‹%¤Á ¿×Ø‘¬ÇJ!¿lV¿ÛkZÄJý¢íË%!Õca˜¬ÔÑ5E=¶KÞ—ýàÚ}Wh6ôHŒz½§d?ý#ƶw3ÓQêU>`äÖ¡KSÿ½ššTÀ”—@—¯µ×,F¥¬ÛMÍ Ï³SÆ8$ÖšKÐ=á ßz±¬ k°òWb„~ï…U%q!Ôî@ÑŒ†,z£m…³¾Eü Ç¥s¥0dÝ=õ»/SÃUÅŽ…±æQù¿|Å_—që|0P­neSnªMÕõ÷k?Eùvö’‚Þ¿âåÞ)íðËÑžff{§âš63égúIj¡®wÙWSÝ›júiL>à¼×Yôe³uB–»ö)ðà›˜¦ÉìË*²@ì¤ ¸nÅ_>ƒÝ”ÃÖjZÈ3©èƒ}Gǽ’ˆYæ"Cˆ‹™Ò!àâû~ÆõºÔÚå&,2¼¨Ç’%ržNwŠ—IzOè8ËNÎ? ø›ÈOÜ{ÍÕmÔ%7Â[+oY2ÏYvúU ïŒtHÓ3PâÉ•¨ ‚¶ÉƒÞC‹š)¿Ô<Ð%À+ëÞÒ׊·9ÁK.“ÚœóbL>¿òñKÞ¢YºCæmhwŒ—?BÞyS„ÀÃ/T@P¼ëà2—µp¿üãÜwÏR²i¡(õÄèºåÞ\w`•juR۰ؾ¬— wƒVñ¡©î0ùWû§³’È“ñVßp퀢_gô[ÑE*qº€è>KVP.n½ñ,i·n/´9Jw—Èߥlΰ9E+MýñØF¯],Q(¬÷@¨\}î;ξ—¯¥Áà/kñVÓ(É´1j„GÞrÁ›…ACJŽJïhcÒNß©m-(}3RMDà^y*›âA__¿l`Â1!ŽTcÁ&Ë¡|˜ñY[ùŸ0Ê7¸’À½v“®®„*YÔX„3*oÌÍA˜ÊS)L£(£€¾Ïwȃ‹þfs>a9"é¹îÏ@Œ`†Rïª8;"/¤`åä–Û|{c¿6ï«ý3§à .iÀtï#Ç¡æj&"´ÄìÝTÁÙõ×ùŸ©»¿LœÉé ?†Ïº™­br Iª­Ã#ûà9ñÒèk…ÅÏ'MR?âä švîw*1j½^_ŠnwíŽ~CÔYK…©É˜sv¼§É@”r˜UæBu>\,¬xÄfŠ^ÔmûJ2ìœngtaZÛ‡ºÞNÚÿFÑbžK*Ô$ôH+pÇà@&—¯©ˆîgóÜËky‹’jušobQ¦lX9x’XSÇ…º!3\sçqáa§;âyŽŒºý]:¶òt£‚yÓÖUÛ‹’Ïgäׂü¹îé®ç¬hÙÞ<#‹̺˜Öè%ÇÖEš‚ï?«Mž3ZÞ”…_­5ÅN9ßbÀt¯ÎèÏŠ³Ò¯Ä²iÅÏwÓYhbF줃*±|o+üæQôEΉ";³ïàÎʼn¥:î[D¯Sdžzt¹ïÛ±¶9äk̲f;¥{i>ÍsVílûÀV1dV® Eõ9#‘n•€ôêèúëüo t·‡‹sê TI¤ˆ”ðMꈊ¶\ªET94RÙ6}þ É­–Îø—âþÑV¾×%V™¬ü/Mc'~2€™AÔÊ­ßgÂZos#‡y÷¶j¼ìæc9ž¥#’(Åü;جºÉ`Ù.Áúñ'²QkȈÿ7…A&‹–Â`•a¡ºNüˆðÈÒÇ-U"ú~K« T=ýö½X©¤ã‘ËõÎòDà§°`DeLÎ0­µ–Ž6iºFVâïCŠÎ øN ¯Éy…­ÖîKоLl‘.=<­Ë$ø=Y)µÈêm‹ˆ$>â +VH^ÓsyŠ›éÞ!ú@„vuCH¯b"ÑYžô Ó¤F²GÏsD˜>œtO:ݽ/ÚgMÓíYè¦ÌÞÌ,©zAƒÓõÁžbh"rz 76qŽ7="$Çq௯RQ.QÐÑV-·1%VÙ½2¶Ü½ð_pöŽ|ÁÓŸ?síç¸ Jeätß×é2¼A0VpquõIÐÑ^¶5HnCwmæ-v&M43¦ez­u¬r—æ_ z¯ÏÍé°ì̇hÓcmk+N¦Æxííìo1Þu?Áô­Bu!x ÿgXhÃÚuÿ¶4½"yn<¡½Àá…yZHxæ¯ _)jÙœ/Ö‡ŸéüA‰hj¡„@vüò–BP1¥7ïŒÍV|\ýçËíu&‹ò=qy«J² ×U´徎ˆ¯+=J˜µ‚àjKa1ê™]ª6±SÞÀb„Üý45»ZÜm~ÕLÑŽŸv§{2»Ãìy¤õOÙ£cAM^Å% Сi]…è2ʳ {Õ!Èî»1zˆA#aS5Ÿœ/©Á™ÝÞM(8èÉ7Ðì«Ýœ j“^äc)mÂù­*ËêŠb )©Æ³Ð+¦¨j,…ÊtܼJ££Ev¸¯2š&üãåEBÓÎIÍn[Ú®Œ8­•]`ÛõK)LB"سQ[¬ÜÙhEÕÏçäôXQ’L”žLš‰&ÕÃä‡ä,À-„N™/Û=÷¥ªÒ‹uä\™_QívM9ˆFaµë›®í±öNIÖ+{J²l¼j%ÖŸ½%ß‘(­Tt9ß2ݬä}Û!‡!²pÃÐr*¤é2+;ýD³4¢Dsž¢žFçK¡5kòÃvI«­øÎõµH”áÝf·; ‘$qÿ®7l›6©¯ª06>ÿB3 —T÷Æq0Éìh*œµg¾!Ã8v›_ JÑl†*Éi†•‹ÿv6 endstream endobj 103 0 obj << /Length1 1631 /Length2 9181 /Length3 0 /Length 10243 /Filter /FlateDecode >> stream xÚ·PœÙ-ŒC€àÁ¥q×@àîîÞ@ M7îwÁÝ!8Á!X€à4@pK‚Ü™™;3÷þÕ{ÕUÝßÚ²ÎÞç¬}êkzju-v +˜HueçæàH©hró¸¸^rpqñ ÓÓkƒ]! ¿Ìèôº g0 *ô¯)gÐõÉ& t}ŠSAŠn÷K÷+!n~!..—àaÎBi ;Ø  ÂP„AA.èôR0G/g°­ëÓ2ÿy0Y2¸ùÙþHH8€œÁ–@(@èj rxZÑhÁ,Á W¯ÿ¢`¶uuuâäôððà:¸pÀœmD™Ù`W[€&Èäì²ün  týÙ:=@Ûìò§] fíêtž °%êò”áµ9žh)(ÔAÐ?ƒ•ÿ `üµ7nî¿éþÊþM†þ‘ ´´„98¡^`¨ À Ôd•9\=]Ù@¨Õï@ Äö”t‚!@‹§€?*d%4À§ÿjÏÅÒìèêÂá†ün‘ó7ÍÓ.Ë@­¤` ¨« úïú¤ÁΠ˧m÷âüódí¡0¨Ï_À µ²þÝ„•›#§ìäRþ+äÉ„þÍä àãâââ䀜 OK[ÎßôÚ^Ž ?œÜ¿ÍOøù8ÂÖOM€üÀÖ §t ;àêìòóù·ã¿:77À lé °Ù€¡èÿ°?™AÖâ§Ãw{Œ¸ž´Ç àúýùûÉäI^V0(ÄëŸð?ΗSZ_RWYŸõÏŽÿöIJÂ<>ì/_Øyø¸‚¼|~^A€ß³¨ÁUÁõOªÔü³Ø§]úOÁî?Ó_³Á øo.UØ“hA¦4nÌÅÇeùôÅýÿ¬ô?Rþÿþ›åÿ¦ñÿ-HÖ ùÃÍô‡ÿÿã:€!^!à?HÀiù7úݧտàè_ð%€Óæ_Àiû/øTø_PÀ ùr?1CÿyœŽCÞ§êŸ$û×ÚÜOìÎÿ‚Oì.ÿ‚O®ÿ‚OM¹ýÿk-ÝœŸn™?¦àéþƒÿ¸Ò@ O%úÂÌòuˆ]]HûU™ûö¸È4ý¶^3»Ï‚s‡Û j2󇬠Uç ‰ä¡œ¥M¦sñEª{Ÿ½ ¨á­‰m·¾wfñš“Ûmèó_û'Šö$êû(ž‘³k‹ïøÞ;ùêÚ#~„ÿ¤HŸçä&€¥^€åÑ+çYßWþm4ln[cçÃ+%Œ»ò)öXãÀ’ú|‹ìYbWv 4¼cOì™ó‹i¼Ü‰G*ÅxVt¿ýØ—Å>†k¯HÍdºðÙÇn\©Uzÿb-ŠÁÖ1²sà‡‚vì-Û.Õ€½£j çÙ-Òê AKÂå°DÀ1¼øä{5ëv 8Y’A¶x>ÊÕ¹ò1êí çTt&!]Üòw~lnžZóEÝÇ62}‘Ο% p °vWÕ§Å’å òp¿©§ówb/gv金šG›¡ýjo#Á‹}å$|3'«­²q;¡[\ª"°N»õuÒËP®#Éò$†Z»F=õÒÏÆÞI0[hÿ9aü¹OÕ=§„OÄ•èU˜fèÁ5AJæÞìî9oà Ï Û©öUÞðF Ççà Â9ÒsÇ/u‰~¸g LVß+PrÜ…ÞÁ¾,GèÔ™¨È~nb»[ÝhÕëŒ >aÓ®Ÿ¥²@3_áÖ¶F!{uƒËduC® )'.Ì\>wWøÀBÞ¥“xÐÀšk_Ô<¤I>v Èfö'Ÿ^¯Ç&­ì1“€CÅïóü ¦0æ±Ùÿ5Õpø=s8RÝåûkD›ÚíYý‡‹ž2ZqéIg]~t6ïÄ­?ªBç±27€ï‰Ù z²x`5pôí¦Ýãt ~µƒy:ÕœíW;6ß);Ô÷`.Ñ-oE‰x—™PU!.ÏBNãû1î‹ã}¢ä/‡£®±EÜØE‡ž à Üá½oA¶ÄI73Q$]%yÛÑ òŒ=ïdÞ|ü•RþyÉy¡jw8ð\ÆÊú(<:ªÀ…8{Vz g‚ÝÇË4Y£• iÓ›*Àã–Œÿ¦PÇlt_R¡.Ó¥ç²Þf yÃóÖâ·;kþUwô©qzd;LÂj&ÎúÈ®_áNF»xPO$É㩱ª OÑ Ôæ»KâÇœW÷­‹2[—¤@Mü¬&ã"%ëIÁÐÜ—Isøòv¯“b\ÝÈ%TC´ü^l…ú—›Á·áù¤é'*Í”jÌ^J ‘ ¥_g™lšÆöF‰Ú¼Õ©÷9+ʇ™Å ,»y{Q£Îw`mäåúwî¿3'§ÀåyÿZýNºùe扸¯«|(2éùWûnñœ~ë—ŽÆ*Ò‡hX2TFöAØåµì†ã{RòÜâd²j¢§ÚŒ&µÍ‡S\)#‹‹‚šsø˜f_»£ãgå$:.±°ã ‹‡Ú’K=Jô ´{Vúƒ7]©ùΌ۲¢²°MÞÏ bëÛzñUø[¾¤/ƵÍ8 [á·cSóœo>_JÓv‹hYìTú¬¡‘ìÇxª¯ S çø†¨ôy@Â\rwÙ}ÿT+¬íÂqi‚Le7Ð=éZ¾Ô?»¯nÕîDØ€Ì>S¹H´íæ2Yé?’8ÀFSªPCqø¡GÖþ5æ¥&ßÜ¢|åcßw0¤kÔË]šÏÛ,ýÁzY\J#ÒaÚéõ‹!r_FN—´gƒR·ì¯Pø¿~žaÏÿÐ…øÐ¨f)É\‹¨3)e-#ÀQÿ\AËgec@næýahÒgø’µ—Qc¡’øš$Ž´¶mË(¸X»Ÿ6”ÌVÃÏ?©œ],øêHG­¤WÌF³Œ°ô-wO©{:tæÔ8Sî¾X˜àÔÖ&yÁß¡"ÉéF€éq¥ÏxùFoX7ºÐlzi+ ÞýÕÐý ”E¥ýºÔèG!w'å즄B§R1¾÷IÍ-ÒJE›î9âÈ Xsý¨±ÿáMáÈèbŒà#-#ŠqIsYÖ"†ãøne¼"_E Š7"ÿ»@9ùªˆ )¦À· Ó·‹ ¡ìùòÂk$hc$Ø‘mÒŠ+ †óõþr3žDj m‡ˆA¡C}ý›"k¸ýw_%vŸ{¡¶ƒ¾éšÊ:,EІPÞÜ\¡Ä”dØr\ÝnK¿gâ*%^æ× ˜|iù«íqY n¤aÍž¦çÊFv.¯Í’ßûƒ½å1Ù˜±%~ N—NóÓÆËÛ¼sCÆŸnH±[¸}»aJÄ*õYVè£éÝ‚µð-n‰‘.Úw¶ …kþ”¡&VË=ÂÕ˜¼xøU_ÎËÏã¢E ?^ä¸}ÔфΘ— ~_ɮֽž%-6§Ãçõn²à_ȹg´û®@‚ÂIÞ†ýà½ÜìéäXœå)b׫*dTÕ©Ø ¥=uº˜ÊÊ%"Ã\άžº`Th#i`™ÓZ†;½ðhÏ2H L€hèÍx±Üƒ˜™p<à[îLeÄ7æ'ÊŠ·Æ°7RvJ¶ËoÒ[³¦Þ­99ËΪŸ™«ö¿[¨‘@ª ÄeÝç(ĺÇ|#Ñï ÇÙ7¡’ÚH'61å#ÑèQÛ– Ã’tç…©f-·ö‹¯õ):¸9…¯:<›¶±õ¥2r[TÃõ•7iºDËÒ–ó9eÁ£ƒM¨*|f“ANEIT×–0¢•O¡v­š“mæy©4ã~&Äï¨pB¢<‹º´x¼rŽ¿2D÷By¶]Ûí~i”hÍ4œÐ)ÖJÍ|^þ¥à§Ü©eÔYuc«”±ú#±”—I¹—â0i·*:?—£¤’†ˆŸ+’j§;Ñ:UR¸eóîVå÷ÿüM7Íó'örKһйÀAçeUìZ;˜=’DDSkc:Õ@lhBøZ“ËÏh™?s:ŸÜÿúñÇPIoò©ÇËIí¼uu9|¤iÿ‘A…ïTjNçÁÉ UKæ¡W¯±&3 ¤YéüůÌxTDôˆ”üé|¿|edo[(?…ËÒ¬…¹ à>;SÛ9"³n5â@j®Íé$ÕØCŸçê9‹Ðù¬ð…¯Ü裎Ã>ÏVé¥{ çu¼‘~jTØÏtwÄt<öÓÆï]Ìí‰"Æ6êYE•IÍ'^Ìû8DÏšX0#ÄŒ:m>ÑIüMù °ø3 2þ­Ê[?m\è֥IJãHe;U¤Ï ÝÎðQ„u­zt‹E TaF›#êæ—†$¸$h»^&¨‘†—ót‡ÿDCª5%5˜àgvDÕîY5/(ó}‰«ã~7ŒÝôJ\K‹%®¦G Iÿä@±î"il‡û%8ÉRoäÂPÄëÎñ¶ǦËHˆÝ¿é„«¿Æ :X"J½~ÀðâØîFÀ™±&Õ-œ%EiYã.AG *X _§ÌÕ‹wŒÀóárD·š¥Ï y+ÄÒ§ÇõS´XšØÔÓ­š­Af¿V±¦Ÿ‹i½0ðË^+YèT)¿# qgß\4ý *žb'CE lNkÐÅŒ…TÈÑdI½¦ëòÏ/E)wEÞgjÔ˜*ÆCO˜âk [Ñ®8í²ž¸n9˰•ThC’D›.¸4┊¿´ÃS££Î„á7~èBròa{XÎbxÕJqh ¦kë*°æ™ŠÞ~±hháõšš ÎKa@o [³%»†'ú2Øìbv®sƒ'Ytô>øxïU}væÖy)®ÏhWèy[¶ C=IJ’nÈ›Êñ©.«%Uù¤æ€gîÏÓÜE™&ªtèóñXÉ“º·{Œú>DK¿c߆êpË5å*cœDM –É.Ý«Ší 1ZŠQ˜!6ͺ?¿¶ôÐ~=æm7¦Ñ¶a‘#¤: ~ÑüÝŠnm?N³¯Òi7l¤BÀ'á´ò´&¼ýàØÖÜìØ¸T™>cžO¹Pµ'‚4©´¹Þ"‰wšPETéÞÉ8,¶z6×ûÊtß‚pôC¿¦ÔKðš6 ~ò‡C$ Y]¥ŒȬ®$Oªð9—ýœ?£äÒÊ[\X¶alŠí¿Ë«ÒçBVÄÁÔë~fÙf!dÊÛ”ñ…(Ïšdú´¡>û1ŠïuØ/ÊVñ’J“,‘ª«šPÎÑ$D{gSÑ5_g¼ìˆ “ÒjSéªm=ÿ.²ˆõYQž •`pR˜TNM‡×Ϊª½ÞJ`Hš|ÛX}ÜÝ\ñrC(U½)uP5Ÿ?õǦ¢¼¯J³Ž¯â”BÚJÕ{s"6;óufÁ6µN¹ñ€&ôqÉ!œáÙ|Zè·ÝêçÔŽfb9Ý–îúlÏÆÞØE‚Wò¨Š„ßGÌá³QŒ˜œèø¦Ÿ‰JVãhÉ{¬‰|C¦³{\Ñ9däòzØ’Fþœ‰E±3Ï7¡ ÄÒ÷ÔnBm»„Üu#Á?Š‚/‡™TE˜Æà=²|àb¸§Ï€ï Þ»©ƒ+ßðí&+¿£óí¾~y»‘â%²z6Ø—?{çn˜(£†ˆÒ9d³¯@üÛ:æç©þ$ÏF5§“`“}ÃZÝ>ˆŒÉÊ£–ELÃ2¬Bº%ÈxºÑ©õ<‚ˆëL5«tEJ¬ñãšêÌ@&ŠèF+Yaá~•øõç¾íüÚnÃÖz¥QV–›%}Q%ߢöŸ«·p$ Ï\~X–“Êë%„&ñk|dƒp©è†ß¡GªPáâ0}m¼O»!p9¤^æ„ÇÜè ÖP>E¶ú*ý#Vi¬Ž¼”àù @-¹ñ%¬á­ f*\öàÄWW‚¦éÙžü)íÙl”²æçû’pt»xŽåÆ£›9 ÇÏ™qž«žZ±Øãv¥› þl³8¶°¤^Q¯æÃ+0¢2.ÛNS&ö˜}°„JϳÚùÀ>¤; {ÜPLAåÔ¡»‰·¹Íâ#Šîçl€;é®ú):³YÏoµ¼9û·è<úRebË£ Ö± rpý{Wé©o6lci¢¿'Ô}Ò­V 6šÕÑy}^®þŠûÙæÇÂ(÷ïkÃͼI¨TŽ4nJL¨P[Ÿ@Îy¾…BùQ¾Í h@ÁæU®hv Ùæ˜ÖÅi9c)áøq §*;C7ãå4mÚ¾fìÍÆüÌÎ¥âpÜv‹Œ^YMÃõ‰¦ÆEÚ7hcyvÑš¹ Š:¯±f’ m!ý› ÚŸ}Ñh{jÇA…’eŸ I[ßf˜œua˜¯‚)%ã/`G›üQÁ”Ú”¥ý «qtNƒ2˜ýS(·l9̯ӌç$Ä1uЇh‚èÖf–¡ÇŸ›»´è+$”çK¶ñÈwéŸìµö82·¼à9ERÚLÎÞMEæX)”÷¯ò*^Å“Ï@¥ŽzW»Íz’úYÉëE.5ïQˆÚs×pêN¸£¾‚ª*-ªƒ§ýr“ m²aq .÷;¢n•µxeDèˆÞœºᲪûjvÄÕ ^RˆX>NÜ’ -4ÆUò‹ø•?ÊâyùáŠÞêmì—³W f´ÕðKvxnö£so“°X@Éå>ùqÿ0’26Kf®­ÖÜ>éý‘«g$ùo^¬}Hÿ%Úö”6opÒð°.uLé-ÿÖr]Nˤ+Έè÷¥GäP’’Úüî„ù °Óú1PæðÞ=òÛ.²¡*ôô3§xÚañ°ª ÁìeÈtd Tæ‡q,¯íh1ª~-Z¬ÉægZB1…oÀ{Eòvº±}”ùLu¿n ²áT¬=ºöBwcìü-IÝy¯ ²8%/Ì_×Ed6_™;¬—º‹Ó·.Jd0êÁµ¯UA¤ïZó$éô¢ß½ÙE¦EW±À× ‘8¼Œ–%à¸ZŽaà¶ £Í$¢ŽZ’A©={èßX0!ºÿ.4Œ,'½ivJÚØC¹S)Ä/ŸÑØW´ÀϨ6ÕΜnÄülgýë hŀƒ‘ûP™`WМ I’(¯c¿˜ŽËÉžþNä™K$ßIʆ\ÕCÅ\ÔÄ´›k¤¡¨PúI¡³xË3#àhþc9êrÏûÆl®îzÂ' s¼"yJVkÀ-ø;wöÆÝÛ×סb¥îúfÂÖêL|¥üBðòÂ4ƒ¡-…Ë‘—Z&V"¿×䓾-ÑŽ¢å W¿“`ÂG}ï,ã¾°A{ÃD¾h{’ŸÕ«ÝÑÆQÔojLï PŒ|“zÃ+qâ4XÆšæe_hM2¸Ètð&烵Ƌ#W' õ¶.·ŒsÅe¯±Ý ƒ¶ôý© ޲Ã;0ðsù´DT¤ÈÞÌsÖì Ù|¨€|µ€—:r÷ØÍ 6ã2†mk¿[a"í!øBg†?#!¸¢2³n² ÿŽî#¤ßIºf3 £?G •”¹ÞþÊôÕXa¬4ñµ4U³£RQj5 (²A§¦Qƒ [Š:ª†zpôňáÆÖ~#íî¸Në¹O I[Òúž¹à`“Ä•²8Y-ÇxÈ>p·µ Ë’ºþRþ1WùWúTOxÂì4JÇÓ»šƒ{D-E|'â_Iz5iYâ´“óñ†¡ÞêåhHa¹Ûý&M ÁѰ–“˜ â.Í£OÝÞ!»^+m‹ 6Ê¥ƒÑWÊXSôÙ±ˆ)ú»0aM“kjyñʼnOcR½Ÿ¨:‘x‹¿=$ºå_Ë̸+LRÎÏ-¾ R {@? ;O¨Àk# é)ó=O8Suý6Å©Fø¥Áî1c‡Ç«T‡m `˜éÔÇ-ôÇke25R ¡EàŽ»È]Æù»¬-¨øGoM¥<î¬ô|ÆZŠy­*ÕGÜ£TWÂÒ…aØ3ÑdS¥ggk½Z9Jéx¨ ÔÊÅËà²÷ª_)zTzEõ¢5ÜqÚK¦õnhƒƒ ä c™x#všG3ä¶ C;*²Æp£É3L}ZØ™õGˆô¢Ç]).GQ-üЙ ËAŽH‡.Ä«»éï1Q­]«^»8›·2,„÷òd²©f|@,ŽzSSù·‡ÚŒÎ&ꃖ Þ5”K¼²¯}„©óÒ²H‹èãÌŽ«Þ5€œ™ZAì^‡Ã¢ÄE™ðšö¯drQÏÇuX²Œ!!{¢|õŸÞr¹Ø‡ªKB™³oÝào‚¾„ï\yÙû] übÈU*Ÿ9 tÖŠáí}«…6Ñr>¸,bZ«þrÌéC ,ÙÈbžªÈÕµ=…o‡q•µÐ>çjÃ|š ëyåäœOâ¨ÄÖ3•dl¶"½¤é.Z8µ´ &ª¯ˆ’öbÜáÑÄDl_fÒpŸ¯*εY£A™ËyÛjQñ­Î·‘÷•²ÏiÀŠ"„ùãª?Æžè¦î¤7  —’S5æCÌ(öÖ³ÈKüÄ-WàŠW’ÅÞ¿§ðU‡þ ¤EôìéýÒ¸¼óxN–$8µóÌÊÞ€he‹kÍëÌ6ÒBÍÏQ!{üëö5«g.µJ} нeM"gƒ5b-H­Æg»²œR¿1vÚaÏžM½»xÛ¦Ï?FÎËÑäÝóFÍ“=:pëžp>Ë¦Æ ü±-€c»õ¬½Mà ç]Qµ¸¢OAª/±ì}ÊsàÐû¨Ëñ!3f0eƒmùûÊh¢à!®ˆ|k‰€¥W³.e=½€Èû2+…‘­Ô©ût“bQƒ3³¾éçEÌ›9‡üÍ|ÃÐæ}†Ê‡sïQ:QÌršÖ&©åòƒ,.ÜJô¬è¯Á#ÇÞ[íFߟµdÈS`~G‹aD«4²±ÇŠáov€£†¦S )OJM¾Ã7\&Ç<ɾAO„D*W«Å­ S0Ä„B±™ßˆ ¾FÅÒGuVÜrE ÇVÍuÚpÃi}T9ºïþU…ÇšÊc}qk€°~[£³u¢Õ±í'ÑŽ‹ÂnÐì“°¿ÎEËF_ôs)"Ú(_oà}´AQ,î¨l`¹<®åú´ÁDÞ¸¯’Bñ~z°ùWÝͶâªõNÈ:ùùM¢ÏÉ×8õ$9f‡eiû,:EÜ… Û”eÑQY´AZ‘Dn k š¾®ïu©Ž·G|Ðñ¢¬¸ˆPbk÷¯{(Éä5 Q•>+ úuïon4"V7rÀÆõƒei³oLÎg?y}‹TTŒ/ù¹½Ã~“ȨÏ>&§Î~Nê+ßQîk5Û‡få¢ f'"¿Æè/6†sœÔ%qü^êsã­­ÛŠ%ÇÚi–x±=1›(3ãÜ},ä[PFÏÞ҈ѮO¼a£Å[IÚgc¬Œþ™Çjf˜>„V¶`CϤq­ØÃ©t|aë§>æÓga—©ƒ±?6½þ3aéYÓ ëꔦ½C/.½CM›žàĆzoÍÜ®¨¥Ì_)ºï9ÎØöGýv’mÔˆ5^Œ³m…HQ¡¾–z#„ÕˆôZ~þ cÜz»·²qA²‹ym)éK„¬Øä >Dob÷EQ²«d„¡p6bq\FÝÃùaŒŠp b“ ó\ÆÃç³ÍŸ<•Vi£KôI”J/”E=œ´Üû“¢¦SÉØuÔ²Ð-×@âÙ¸¢ÜîÜzÊrïd±TSU.ZªvUµ—b¤1˜BÎ*äH´²ϰn˜€‹àPFÝ÷ZròÑ#IqsÖ¹,¥ÁÜd`΋üf0r¨féªVaU^ eû+§šœIlXi¹ôü€Ú”Áù>À°l°>dà4ĸ™CTvgñÖNÖ{{(¹&èK}.KÒÈU-ÆGWhù&¾mé4]ÍódFf©eŠÎ[yãûg®‹¶Ͼ¢¾pÌ1zŽuÖ|âHE/¼«¸÷jï|ãPVû8 M,¥÷=õ!¹É4œf‹csC$Z7¥#ÕκãEÓG²WØ^3Ø|IÔ¢€ ¢¢Ò[ãidvGm¯rN‚`r?.H©©ÈÔß# Öøøp´^'ߥÌx´"© Þéä2Äì§&xm>|@@q‰KáÄàÓåé0SèV}(ïGšÝn1Îv®ÚÀÁc*ˆx—W}ÚÁ¾°¹N£­üc»…JÞ²GJ²ìyÚ*{E@`î›d¶[®xo¨Ñì¥mËM–mÔg2©sõl¹O{a¤9± ŠïRÛÀõ_ ßÑîÈö4 0Nó;ÎbúsN*}Þr+X4|› Fï‚ýÆ#ê©â7 ÿwÆn»FFH„Ƹ ûðùÞz=ŠKù$®@÷êIÅi8] ¦ÃûÙ†y*–Iû!-d>A9›õŸw?QQSšÜ½u¡â§¥{/<\£²ÈWZ™MnyÔãøÎ¯ó­Æ¿ß)Ž3dågT ¨Ýô”(ç>̼#ƒzÈÑ™Mµ¡„竾à)—¥oÑ7pwvFTXÍbâËú6e x */y!r‡_%¡H0òãÃPÚ\ŽšÖ¹'8JbÄDÜ ž0‰X_mãWØ‹î2-µxY’°R—!©…8%bJªš 3 ÆXbôå$Ä|-p²– £µ›‹ê¹ä„‡:³áqüp^É“ìJWý@|z¡w§f\ä ÁœKÁœ0â…äY‡’ÿê5Ý‚©þÅmæ¢èŸ1uß·ÛgCb2mÕœô’¨”cðüÏRͯç·*ÅÃÚÅ¿¸wèLñ2%Ö *·bë¢ËÕˆ‡Ùã= ùá : ´`Þ»Ú"o°ç1O¶ê¥@SL틽¨K C:W¨v /6¦ïsˆ{;×ZŽª¼á3iØ ú¹7i)d_4`¿çÔA‹H^l³cïéý"}›ûËßà>s}GÒšR{Û¼Åf(ê®0þÁa˜°èÅ-…=åaT¿©äÏ@·¨î/NÙV;J–â¥Ê×€}›ëhøOÍns¥õñÁ1!fã[;ǪŠÊAê8ö=( wÕMì ÀnßÉ/J¯Dœ÷9ðI¾ÍwŸ©S?ª†ÜFÇÐü¬ùÙµ}VQ cÔÛ7´/vqZÓŒ Au¢Zà“+g—Ãv´v"Œs Γ§ÇcÓ£)Ää¡.bHêÁÔºsÇBØ0;Ê•å6Õ2ÚëÃÍtýÎD£ˆ­}^EÂ_4Ž\€¾Ya7Ùqkÿ,ŽSN5¡n3ß?|µ‹ аe0t4"Í]¶.ç 7§nÑ¥ !غˆA&Ö¬ rvP0®êÑUÏŒ~Qد0äR5"G&¤…¥B¸õX÷Oë4Ù{„iŽT·ö¼üsþ©,¥Y™Gcáßt0XCΘ¢”g8¡²·|Rýd[N_,_øuf)å§ÓK1,x²‹e óøÅ¿àL¸àÛZW ³o”xé›Î9ÃW/¶Xæ0¿âÝÞDa3-·{”iú:áKŸWw£aôB¸ƒ%j^¯Tcd÷[\6ÔÂL6UóóËP$±È8ZØu¼øgzcÕ\á#*ã!‚AJ&ðÊÝ=ù~]÷ÎÃW»#ºÀT¡Y;õ ú G$Ï+ý]Öê9-üg^\€H$Z£P¢Æ ô¢¼íÑVŒX¯4z‹}/H8¯Cº]-]—ÐK±Ñ2èºmnBÅüõo| ßZì)ˆ–Rué,MéT»ÅµÇËŠ‚ ½§ò»QX€ÌXÇgÆkýÛê„ðר‹¾ÊÏEÔTi)»Éž­(oÓ=ëèM&T´×P5z¤›áSY8Õ'Db«+pùµ8š0 õõäî. ðÊ6ù³éb–úÚ¼qe†ƒ˜2;ãëzbíƒxóEO{ª.£UøÙñ2F^‰/ïß4ÇäBû=¿7mR(ŒGhíIï7¦ª†¿¡û8§EÍT¼´ŠOîòáçåž endstream endobj 105 0 obj << /Length1 2480 /Length2 16278 /Length3 0 /Length 17725 /Filter /FlateDecode >> stream xÚŒveTÙ¶%î ¸ÜÝÝÝ݃,¸;ÁÝ]w·àÜÁÝ%¸듪û*u_÷Œ̵æ^¾öþ(H”ÕDÌìM€’öv. ,ŒÌ¼15yuuf33#33+…º•‹ ðBèäleoÇû/Ž˜ÐØ$7vQìí²®66 '/ /33€•™™çˆöN¼qc7+3€#@ÖÞèŒ@!fïàédeaéòô?ÿ¨Mi,<<\ôˆØ¬Lí Æ.–@[GSc€š½©ÐÅó¿LPó[º¸8ð21¹»»3Û:3Ú;YÒÐÜ­\,ª@g “Ð ð;m€¢±-ðŸä(ê–VΫÔìÍ]Ü€ÀÆÊhç :äjgt€üÔdäJ@»¿Éòèÿ)€…‘åsÿ9ýÛ•Ý_‡MMímŒí<­ì,æV6@€’¤<£‹‡ =ÀØÎì7ÑØÆÙtÞØÍØÊÆØDø+xc€¤ˆ À”ã2t6u²rpqft¶²ù%Óo3 BKØ™‰ÙÛÚí\œ~Ç'nå4Uޓ韴³w·óþƒÍ­ìÌ̧bæêÀ¤agåè ”ÿ $Bø#³º8˜™™¹A:€¦–L¿¨{:ÿR²üƒòðõv°w˜ƒRúZ™A¼Ý€'W ¯÷¿ÿXXfV¦. …•Âë 1Ðüo š'+€3hYÌ¿þùÏ4gföv6žè5šIATITC†îŸ¤ÿQ‹ŠÚ{¼X™ ¬llN.''À÷¿ )[ý'•±3·ðü/¨Pÿ³Ûú?{Bøo[Šö ¨ÿÌ»>3³)èËÿ÷Ôÿuäÿ5ì¿­üÌûÿŽIÒÕÆæ/õÿPþ/†±­•ç8 vu­ƒ‚=h)ìþ7U ø÷+ͬ\mÿ·VÆÅ´"v Ñfàadçü[lå,iå4S¶r1µükLþkü^;+; ²½³Õï«ÀÀÂÌü¿t ]3ýºNœAÓù— Z¥ÿö*agjoö{çX98ÆNNƞ̠¡båàx³€–Ó èñ×<˜íì]@G  }æöN¿[ËÉ`ù-úq˜Dÿ n“øÄ`’øq1˜$ÿ “ÔÄ `’þƒØL2ȃüÄà?äOñùSúqƒlªþA ›j;€Iýe¤ñÿ@P“™€ÿå‚ó·ÞÑ´BÿXEj¹±í¿¬€êgþÇ ˆanåö/³¿Õö®ÿv ¢XüqÒ[ü~ê€ÿ¦€Ò±ü“¨î–ž– ÷ã$³úüã¿ ¨¶¢æUÂæ÷¨ÿуŠ÷¯@—ÓÛ [v ù—Tû?á€Ûÿ—”‚Ã5Șè)´û¯>²³üGúß]­2h0¬ìÿtŠT×E ú8`rüÓPm]í]€f&6ÿ․ÿ* ¨<,püF@·ÕDw½€ùèZer±tþ« ¬\ÜíÿuT%×?Óòð×sïljïôïÒ€áö/*ûzA˜þ+È«çŸ:€Žzþvù_7“©«¨.=" këð_Ÿ@ ÐaiÁÞ”/غ>¸ã¡Vßao’­ŸSãîÍ•˜!Æ|‡¢Oçc>{þ-wJޏò˜¥`µ¤$xh<¾D —ûGÑNFXô÷!èÒx§Œ üмHpÔÓ—Ìýx Ñ8iŸÄ<¿IŸ“TÜéPŠM «…Úcú>è:*ÁàU|©‚W:\ áÁúøSIÚÆO…æûH—8³u`X¢lwóÌ#•¬.bóéýûªNt£ù…Qdÿï¡R.õ&ø:e\¼]ݬ¿,;å„»À{è‹"ó¨®é‹Fî—ä!ýÈÈœ¸T°¾F\û’‹Å%Î&XÛoeb” ܧ¾Óó. ¥[Û»œYJÿŒõÊå*;ùÄ9'M}þ}¶Ûjv܈lê³b?Vh¾ y˜Ø¢Vä”Å‘tˆH[Ë)îÝ›Mž$gÂÃF\xçùä!—M„áO겚hg@zDh'H%ñÞ9#9c½/g>tÓÔ™c‡r[ ~’êzÜ,mÆÉ;TK_æyMfÝ t/z+÷«=C¦fXèÊ´½Ngý‰Ü¦Ø Eªp_¿’ $¢ŠL/‚à~/ úu9'K¬ê&AAÅ´: oÚîWg99;Gœ“÷mÓí{+§ö쀬F4M«D Úœ…2[¡¢4]ÔÃÐÇ3[{‰8BÕJã6šœbÖÆ/[fžG»‹ÉXrwÜ8a$Ãò¡J8[/’¬<ϟª„CFibĆݟ}ìy¬îCR[顟ö­‘¸3ˆ¶ˆ¤‰Š`%ܧq•µeD™oz Â}3͉ñþFTVŒÐaÌTk¶\Ì3Ánz×DH‰àdžúúùξL~ýòœ¨»/O”þ(ÂöX$†’mÃPK×ê4´æM¶2ÊcµŒÁ±½@ ªiÆ-“ÁÜ÷aF\ 5F³ï6ÎCòäé]]™ì(̯ç\$Dc4á·Å¡ è{›^ï]Ù8Î;H-Øñø5ñú?™ÞÕ_ûï¥UÔxCràÀW·œ>ƒ1I ¦ðêêR©ÿR1S`EÉó†ÉN+‚RÊÊær°Ê/wƒ£nGùØ*‚GD£ÀˆbðÐÛ ªóaŽÒzãýÞ õ黢Ø=¦ÛNG¿ˆž¨sÉ@àþÚÎWø„‚µ7:—4Ìtõ“O)œýV·”ƒN/F‘ ùéR³:ð˜-œN·zBÜP ˜á©©P³â.ÿKQV£ÕC衬oE?½ ‘ý«¤Ù€öÙ{"¯ç ËJ1´˜hWpøltƒÊPW2£U\ b†ZÀù~³õYIÙÛµbg[A¶Póky/\qx´3Yº“S>¸¾y§í¸eŠ“ÞÄœÙÚ»çwãáï¯ëÕ™c‚yèiÏBˆñe•Î? ¤-Àá@8ShÓØ%}:¹S ¾š¹/Ƴo ìf¼<ø¸¥Š— ë×ËšqÌâw&:¡s³[Ù¨¨ò.™‰­ò9öúÐL†å]ìa´…».¤á’²ˆJ›¢H† &›yçQFÕPÙƒ$WLɆ± ¹†˜§@Ø»Þf¨+ÝdS)y­Ò%¸0°w,dÇúï„P±£DÔ]ë]§WËÚƒ¸<¯ß·Ò•V¿f”xàfd“3|Yf§›Ñ¹?aô¡Å›Ç€È‡ðÿökÑÍTû0îQ]S#vŠ‘ÈM]¯gÿ¼ié@±œãä'õ3Þfvœ°6 Ám||†ôÁra¤ÀÓ·ËP •¤:ÐbçøªlJ…‰sö™è^¶|ÄÄ>æãJŸ7/XÕ’NÉU8ÖpB÷åÊ>WàÐy 93áâk@õó™¢XõœmáÜã8X_f³×UÀyáŒmjäL¯ž¨UÝ3‚z!c}ëW^LÃ"¡Ã÷¬Gé.â# …l®èÖë\ŠÆóùo¢6ûŒi½ót-ì]P”ï/Þ:ÝÚY{æùšVÈLÆžµŒ/>*…·Nµ Ë(bûH¤ù$Žû¤gJ<·©+}`] Í˜>5ÜŸC-ëp À¬5)œ2~ÅùFNÕàæñ¢úȆ\CÍm¨Ú²k'\Çì>ÿìj'DzUï9ã°éÑ+ÃAÊPlb°ìÙ+pD[è`°j»(¹Œæ¥ d¢oûžÅ(¼.hUž‰ÙÅX¬Míû(=ùlM–eXf5C äOÇϱê:‚Sþƒ÷Çöl!z`Þ™¸ïÏ_·ðò~m™ÝRŸÕdÀ½PULãÈÕójD\õšª·†\禕!-h‘Û¯F(]³6ÁY€“<6£QúÐEy<H\MõVE"ô`6È–ÜòTF0Î/7 8]ªìk7yÍxeçƒ/*Mã¤ÒæNteçÄ^ ’&oH‹ T³všðhÐ/Jlõ(UÀ¨^~ àY=L|ßÒ1O3\ìEâÜ.•ç£Ç¼ñL—Êê,P±t,±Õü.U­ôÓQA’ùZDDväÙb®P´gÛ܇Ҙü3… }P”ÝdH  ½Ž)îab9j7Ì” #[#Ä5þ:ÌÖ»saŸ¶s4£Q¾f#¼QÁ¹ ³+&½›©sõ°bDßý¸Ó—.Ð7dûÖ³¢‘,$©Ê[¥¬›VZK„çâ·Íðq.¡†ŒÊm¾ùU&—¶?äÚµS{†¡CÜ•]5z³®ÅøU·±ø,Òa7Y ‹Ñ› ËMß\­ÙÜ#ÂB>µ)¶Çþf}jØ–Of‰a¾s•ú¢»˜Áß/â¼Qì¸w§(Ì<®X}è!‰¤N{i¶Û±¤—=Ê4{Ø›|t9ÈõŒ¬x^ˆ…l17 g½±ßçHÏw§¨¢<"žÑÄœúM3äÜ"ØúÛµï£Ð%J²OTtBÕÓ[.âàyHc½EéY~0Ôw¤2©(ìNm“L¾YÃß™bG“…•"A^v*Û­PÎ0)Se½ ä;É©èmÍ¡ƒg'Î]Êœ_ÓCc e±¾¯P¶{G÷eû×좊¶©‚ bZ¤P‚>+‚[D:³ÅÞèAÉ)òÃU„Ùœ€„aE†({DòÜ$g€î € Ì _Ç,e‰îZaz¯,oP Q¼WëÁÙä#ǺqàW¹#N † Èûé.¦ÔÝn4EÚ/J§²6êïo {^߇P2˜Ž¼šÜ•¸¶E"" ԇȭÓÅó–cIŸ®$‚ïòX+GóëG™dÒ@q6m‡Î$g§höâæzB€;ɱ¥è¢öoß\eaZ'£I[%ÌÖCÁlháLfk FcÆ!êHVk2Ò |¿K‰­& K:Á‹ÂHÙ¡æ+õubÚXõBûã,íF /äOí ãÎdºäm¼N»oÖÁu¹ÉÖ@@†×zc)îCÝó'ó8Àø² 5hR 7¼&‘qïôqyˆÁLš¹J*HîÞ´…u£øÞ·ÖV¿îD¥ôóK…¸Ó˜ðUq*ûéèÐ{s®»ý?v–†ý‹Š‰½ c(›C6=ûŽzå¯Ð†±ö“7ü‘èEHï5 ÂÛj'¹>€Æ°e~ŠŸÇKÒÄÚ¹`’Êhk·@çzywŸN¾”T©AeONœEkZ¼] Â·× ëC è~ë@tEE¼e. ÓÊÕ˜?Õ½}²ƒQ?!ËUô£EóÕ+&h½tXŸx±ÄÖ.¶$s„äã~mU“[× ê´–¡á`YN]ÒÁ" €?¾}ăŠôçlX^L’™ú1p° 6B>—BJ±Oœª|™\‰Ÿ>ñ¢{´(ìõÅŬ«Í|¬ í²ŒuX³sÓ÷§’çbŒ¯¿ÓžiÙf‰ôÛ5FÃûïPøá±àlOè¼Ö;iÆ/P:Ö g{_ ¢FDyš®’‹æ Õ©L¨fþ£u[ôw½¡¬lblßÄ{:pÒ1|‰5W¤çkCî›×vá'x1Vð_.Ñ'Ö®[¾$^S¶Ø·?¸Z-OÖ´`p±emtVÌsFêülßKdc@t†U$lZêM`Â÷³r®µ®'OÊ/\Bè˜>F3ÞT0賚m]Îm—¸§oÒ°#À¸&,1<ãꩾ6saz,ä^×èµ'\?ånaXæVGpdü=øæ7cµN ?}é¸H摟¾†Ç š"“ ¸ÍŽò«¿æao´y+; éa¦í¹Uìdz4Š©ãØfÖTµŒì´öp—]_Þ‰EºÞ‚‘žì//!ðSo–K”š#ýØà«±ÜHÑÅŽ¸nîù©Æ¦¶ ƒ·©œ^žÙsý°½îXˆYp¶Ç¦NÜè† X¥ôúòlu'Ï[ŸVû’Çñ:L™nÓý˜ÌQä¡~ö¢ç¦mÍí©AþI¯&“(4°]ŸÃØ‹VN¼›\— ¬×é­¡!ßÜq^éS"^Ú“S ù+ñtsiÔ[ßñâûd¢“ƒn[.÷!Êe¾Â„›\̃­ÐµˆkFùFbQ]SŒ“#µ‚JØð`W —jÛeö|-ƒL¬¢N)BbÆG¨ÊOFP{dk†WCýmo5´8ó?‚ÒÄg6攤Æ24È '¡ÂÏÐÍxZâøû„]t·r‘#[ºu¢pë÷_¹R À†³ZØ:ÏBf˜ˆE#³¡°Ñ•w{]ø>O÷û);8säN“ö»˜RD=Ž6©–Ô…D,!XøÔê§6x.”¸U¯mÑÀª‡m`Z-ŸyÓ?„©Au“ð,-ÂAÃTæ º{‹a¶,ážgB—ê;N˜¹þÞ¡†µ ÚóMìæëô”x<\õ"ÑQä‡ÈÎÛÓ{2Ì‚¹JÊþIýü l– í_c@A–Kú‹‹ïŠB/Ã,Ï™´"ý²äŠŠ%Ÿ:o}^ðTW~,7—7ÌÛÞr1ã)â’BÀ lu‹IÈÙfJeFtIè&¢fxÇ%nZNÓÔ¶‹B0ÔšðIÓ–ãê6p¶dOEM"r¯2–n³¿ø½r§ÏÏöôѭ˶4Ù‡­†ð¾ä|\b0SÄúÌÐ9ém)"#P3VÀ§ }A¡Çà hs)Kè6'Ýô¹¶HHdƒ lJyHk^Ö'×ý¥¹…›Õ’*ò²¥ˆ''A+4ßoIGÅLQ£—%sçÍ$qÉ.ÜÅ/™0„™pa=*à³sñå›6Ûó6}u[Gó™b[¾,Ôì"IkùIÒÆ1ž]íÌì…ÄÞÂ8æQ½Hç ¾$%P<î²55i}Õ9n®FÚ¸óJQg.x l‹2ÔhÏ–/úŒKŒuýV‡¿uë:ÅWõ†ÿÄN*÷iƒ§‚¦2³²ïhùÐ+\ P»óÌ‘Ôe:ÇÎ[h±¬W©%lt>rž Jè3q:)ƒDµ(‰ÌGù¸pá·£ÉBàq#Ïñ–è=6==_ž;/ÐÃ8ØZMXŦõºƒ”î˜8}Ú“U°eû°r®5‚æªoáÎU‘1àµ7%e/ Y7ùv*‘‘} aaXs}?â†zЉû÷8{,éú½Ú£^¯õAî\–ÔˆTˆ4¢0ùª×~(}’8.'WãR#í—;—Øgn{é³í˜€ïiÌÇìð“ûž‰òå€S{²X~}ÔŸ PLg—[×5ÎþÔLUÀV‚¸ÁÝŸ°Þñz™ˆ›_Tcç7VÇ–Þû îdä™u2…߸ „¬› cå´Üo*ZœÏô#-ÔÂ_Àn UNMÔÙke¸#@8~Kß•Œò3üâÊæ5ÀÿzŸ½ˆˆ­ á>¯VˆXUŒªV¡ÙÇ(Qÿ6EÈ—©éŽX[C¦ݯŸ¨ÍÐÕ‘²¿\ÆãÍ-™çûkp5n‹‰%ãÃH„Û·€my#Gñ\Ð×eEÊþ„@û… ø§j†ƒî÷8°].F\M~Ü4/”§dœ(aØfXDBm¤†„¤î˜›"ôF52u7Ëš»ÌDg a%-Ò¤BTDí»^Ì÷„(á‹S%ùä ¤ü«X” ˆ]-Œ#[ÛR\}„o$R-Ñ›Ë`Ô ($ù¶/UÕIÐ}­AìœEž/ ÷@Cd§Êÿ àd¥HÕÆÖý:ÁƑʶ›4“vÓåY«ç êr¨ÔŠë|¸ÁÌ¡ðq§ë`Á!\ <¤³óváuÇf^µÒ‰ðMÏ”ù¬ÌNEöeqX—JÞs‚nk›:Z`Ö’“ŠÂG¥ž§óë[‘ŸÝËh<+`¨7Wõ- ë„+¼ª0ʱP h’)¸÷2wÆÒz\jv3RÏ+¼K”«‹8IR¤ª ¦`Ìõ⾈do™ÏÎ}S›ùeÍ=ER‚šÁL厕>'îûN3/ÎGqa¨r›=Ü=¤cõÄ› Á-üæ4ë14/óU¯©—ç¤í×_ Xæd±Î V‚WÑþÊþñÖŒ§ú_Õz…¢.Ã2%iö:†æ¨OÝ>ËÉó$ÖÀWä¥ P£Xj³w¼kÁ :¤ ¯èb·x'Ê?‘¼ À^™ÃbppÀ# ‰xõÀ?¿œ_C¾VÛEàNŒ€8§ckPIdŸÀµ0©ó†ˆ«P[¸¤Apþ6ýKé©Lì¾rùjRñqE|ŸwØXcè^r•@q¹úÙáØ–³:9kBã×¹ÁψáÖšŽè¬xöÏäe^Ûi>òX?WðŽÝ ¤BûéúÉ“.,¾RUa«)& ×:ÎS‹¾ài-•Pi«WS£rJ/Wߪ¯ú¯A2ƒ†žr)&ôŸ2¦ŽÌ¬··7¶=ÈSªuÍv~\ð}…æÓ@ô[]N3»µëM ¼jµ^P¥_‰ÈH&.ß6Õ‘ICÑjÏ™½ \ZÕ4äž“øF.á·AnOjОnÐ0_ß$­4”×Êø/Üûц±âòºþg´JÝsžqÎÍ„kŸÖèU¬Å”gS;p õ"×–ÐÓé—)|xù»F¶ù9DÔýD\TžÕaoä°Ù>0B7z×ÜwŽø÷£ÔÑ3w·+Áñ¹ãâÙ·kÌÔ\2hñÜè&°v§ÅæfùQX‡Ç-OäŽÏ‘sÓ)Ypwé&ƒÕĉøC×|z2óÙØL yjf æÚ§ ž5x¢èsÜMóC›úôÓY†¼í¥rƒoø<´fTªBº”íÚ·ÖŽ>ÍÕ$ “½y¼~€ÕɾDª &v…)êÍøH©ë…G<—úíó¸+„à©¢éÊ Jg¨ÙSçk^\½IQq7f–hðŠ¢) 6Ù;s©'ÞAþ‹#ìÎqV1ÕÁ JY£ð÷+Çw—•UÒV¸û„Íb‘¤>f«Š¶[¿T#d§ª¶ÐN£>Ʀ{·òt5uéàÉZ‚늘/Y”¤•ZÝÕë®ñÈÎc玹ß#*¿¡ö‹ó}­xÛåÚTi'p·0ê>@ZbH¢0|1%ÃhÌ¥öÄ–oÑ©Ø9…0Û #;¢%¹S ùf]é±AéuÕ*u÷ЬZ/NØ/%Û²1r/•Õ‚:Q LG’À3ThôC·A¢Ek^=¥$àß’à¨;KÒKöŽ{i Rm>=LH2 Òp"®èñr”qj³?„ó6aKXí~¨ÁîÖ]Z÷›yf@[H«1§“—¢TDWŠ;êË€ó=šÉÞ©CÙŠØ%ÜôòùHÁ› ]Ut¹wx ׊)€ˆÃªY£õÚA`Õ—(H7)Õßš»NÑÍvP2 =ÛÉJ<õœF[6 GÆ^©wž¤­ –dÞ*`Ž×nŠÒi,£ò–NÞK^0ý° E5Å'@±uà÷Îðä7”9À5¹ë>ͤìÜû°£ù_:bVƒOçwò¸¿äåjƒo8Ÿ¾ Íåot;x'«~äݧ_y KÀkUDK‚½q‚¢Ï,éâ;NqÏð3+ʱXÓ`t2¦ï’r"?–9VhT 7;ϳªÌ‚t¹6#ûQFN”ï/ñùºþuŸVÔ/åÊOj é•·ºpñ6 ]HaJ? øhÌäò•²Þ9èñЬË"3¡[Wô€Ð€êiž|IÂýRMPìÅLÞ"—¾¹ÂŒæëÈ—3\Î/…úø2—(ÀÛóí£þ´×œÿ'ucq|²Sw0BÊ[‹Mïñ&–CÞnغ¡ÆZhÓ½ŽÝƒ)Õ†“à  oA>iÝw§Ã`h]:? V'ô*:Eß7í¹©õR‘W'Nß]Ö¦gåq'ãÂ|-ä{ 9Ó~áŠ+éÛñÍ'©š:8Å Ö+¼ñªÛÖD$FÕ~ˆK$æc0Ø`›Á™—’ÄjÒy—SrÁÈ&›D”Ã4cÿôtÑšo[ç/±KÔ77ûÅË¢•“ A*¬ÍÀëp¨êË<Ò¬ñì¹uûÜ{¯°0áë·1%¹fw,°(,@—E#5ïÉ'Ç!Tî¯þ>7äÏã.Â?íÃÈçÓ›:—èT?®ÂµB|¸èÈ4ÝYp¾Zµ¼vÓãÒï:^‘`:} {klQþ6‚x|~ÅBB7-,© \«Ó,®rATw»Åø§¯ŸM×rÃ7˜ZTG7ãjM>ý”X0N±0á‚´Ù¾‹¨ùÁOCÙÍOxÐøðõnUÉEQ®AŸþÁGÈÿ=m·à<Û(céTGؘ ·_\f¦“[ŸÌñ‹‹¬ä<¯aôÑ‘õ¨êéÝg—…H,T˜¥»‡q¬…„ÎÔ%R{€C&­öuy“Ç{äõð!Ù­FÌë¡uû\9a6ǦSt¶óL Éé¹c9Žã]JUß–’Õ€E—äÞÀcç~·¬™ýHŤqùvçhד=åxÖl¤¯¤nŠ™]fHež¯ß¡Ç•v:iø/²œž©é ªX"}N?—Y½$‡Úóä¼ñ¿˜ÊcH^ åè.¿dLNûÑÆLŽÙ<@ÍpõvhI¡ïG!tQ6Àœ‹íäšåÚBJ+²ÁDú‡k8ö¾ŠéR=À^Cú£}V6Ïc2AtMI[~®z$Ž{aªkÑç¶— ùjk¼„ÂÏV™È Lɣͫ٥'Oñê±®³ò»D4©¢ÒF­w—‹xþ:@7plÓ[étÇW$>EôeËk§MÏ£xÖWO}!3À»Nµ¢‘Yî+ºu[¼U£ bLÓ•¶+¯©<ÛÎ:ÅEêšÎÔŨ•,f«õÁ1¼‡ÞÃÁÅ·0³‘ñ5Jˆ„A/•ïd»¤úÍb®†¯^K#Võ¨.±dªvÅ– ¥ŸÓ­&/?çòìé èa”á>¬^£ã-1Hõd¨fÏ„|ZÚèÄ#ÌÕ¨‹á—œ`­–>†ÄÈfmä Έ({I|YžäNõ EÇxèÿô å¼V»!3±ê‰bY ‰î«øxvî¤X8Ù[¥ÍZµõ,I²Ò»”/Fª,\¿Ù's¾+±ÞÐuA|³í|Ö©4MÓác/5á?V…Îâ '1âÎ%Kô[Ä«ð†9£È^ñv‘E¶¸DÍÈ£gA(ŸÜ%'Hö_ÿà»çQÀ].ÂpïÜïÛ\-º|xÛ …¥ ¸yßÿɵÇå°a0ËŽÒ³õ!¦(KýÞ•v=%d~ÊnÇÿ™,î{T¡aÿ½KÛªÓ!ùôì Æ=êÂëaúÒcx‡»a‘¼þ â "ózçÊ%âḬ̂Ñ{!³ò5$šø‹´¯>õòn8ÑFAû–”E¯¶N±ÜçÈE_XÕ°+Ö9[³ì)M­Ëö´IÅŠ¿KdÊÚÎ+•ÇËuÇrT´ž»³¹÷'M:NÌe$ÑS'HxÏ!Ý/{P ¼e¼;µ–"ÑŒ,rýp¢ªó ܹý46¨8ý–ã_b:EçµqQhŸ§ ãÆdò‰Û0aW€<:G=C‚?<#¦?TõwêþãU‚„9¾Ì])Aèa©‘¯óÙßÂó—`¸µŸ§¦¼HïÉêlÂ;SŸ6q@À+!¢¢õ½‰E)Çg»só Nª­N€Ñv{Jm«B顸u8Š"ºiÆÓ12å† ‰à7ZvkIfWªˆð4D!õ‡êù‹7ŠG6=èñj¯çÞz?ÁIïRž€¢Kت–SË^Õ˜`ñ¸^ˆR)[v€,IÐ/ø ì.2{›þ¾8•‹i—E.¬4n2‰¤u¯ia ¶‹,Ô©Œß†ôM£Tœ¸8-¥Rz;ZN5L-cõ$¶.ÎW¾W²ËU›Àt%ËÂñNö¬waïÔ´§s¢‡ÒnY¨#’Õ:Â1Q’‚­FdjÇG_°&,üùÐ*_]Ãdt…<ÝDÞ­ù­+¤¹v 7cm@£ág_dýª‘³1ÖVEÊ|@7IÌJØÞÍô›æ­sÚÖ6.ß9\¬ÂœëŽ# KvûqQPÃŒ @LßÁ{O£R1Iwzi‘ ò!$Ý‘‚‰ºÄÔkOèg”¯#?ñ{Ô>dð14 ‡VÏ©§ƒÊByúAÃ\;-鱺˜¥n°´é4€;™×'$ÉÂñC:»ÙwfŒòXëúÁ->Eçê3WÀVö,9€´ºs®¨[c[2zè ¸9 õËœUíMS /£EeCNŒªûÜgßo·` ÏÇ$èe!Q>µ©åÓ7ÌW¹2NÀOhÜ–…Õ#a°'22ì{숊xhˆ÷gAa޹'Ú3#)Ìšª^%ûT¦š)9%· æeÆêv¼æPKÁòØ•§%¨‹ãín2HL/ku¯á—üä±0:K¥‹šO¼¡ò Ë;éëOÑ<ªÉíØ|½pÝÑÁ=„_`{Mk€-¦c2»„½¶…B‹Ûô©æ/9ˆÞJ,­æÚÕR]¾I¦ì8%ò9Îev6Ôª@ÑÊ0ƒ®÷Í){Š}‚Ñ`P6É‹e¥o•OSã53o¼Þ³iÁu×ÀÕÖ‹`2Ûiçq/¶?)AK¼´öÇùòf²…´±mpq{ê«PiÇ] ,Ïá¡]®èd¿@¼gRDåhü8䀿ÄM^_Ú@§ºŒ‡ëkëͦ”÷ã?aœœÊï¶ÅÊÄ7¡íÀÚbšÑøÅ~bKÅÀüì!vxPpûS6Oäúñšmü¹©ã¦SÂB™˜KŽ{¡Q8)Â#üúæKk×÷ziȨVª¡ã*³][9Ï%pM=NÿÏ·ú™@ÛɦÛi½ñ_šp™mdìà‘$ùÚkh¾¶ÊÀןøDºˆoõÞª]¿:©³DÚžé£À¦¯±?;RVE6õÇ錸-î3õµG ùYŒˆÿP®?ÂuEøõ\sÉ¡÷Ñr„Pú×O~¼œï…e—ŧÄÊ3~Æ,ÎNÃAëcߨžæ©u«f. …4?€;ø|+ç`>BäBßAm¶€à£â$OýDˆÍ‚ˆa±D‡9‰êàšj´/²¬9ù£[¦O û…¢™ÿüIo÷°)ÆS¼øÉùp?M³0UãpŒ·›üÚÐÎ}?êÓ´+…¸î±h6ðZXvÚ5™° h††­æÞÊ„5Á°–‹ûÊ‘MÐ<>_î³dÒÕ#³GÆë¢R£Å£¼éGÇÓ=[‡o³Ó%¾”×ôØ î©]×ïZ…+§Pàãxg–ÆÕ _z÷ÔfÜ©9«÷ó‚ÔO|2¯“vëÛ ô1qŠÊ¦K×VRJÇ宎1i¯xÕòý£å)§3âvOŸ„æ°UÚ¼q‡©Õâ@ikR×Þbï¢%’E||ºodýf"g%ü«ùüO¢()IxX䣟<‚3;| šɳzè‹Õ ÇÚ¸q»zéŠ$Ä87ºÚ‘œü^\ðÍ´’~~ÑeR(n¸kÛˆå \‡F3åz[¦Þ/?ÛØ0ˆX–-Ç@Ëu…f|pêÒ¾QI8¿‹Ú‡Oˆ+„kÖ`—‘‹KÎí³uLT?ßAÔ› ²«âd3ʆ} }?®ŒèÛARD&åz{Shj$±ßaBE¶7Fmé({Õè {^f¼*£•™–“q„ ûyP‘AòHºÉ[h”0‡³OÅ_ø(Q]æ¹_ìëyÅ[€gt])„›¾S5Ö$ŒHu¥(q/3[Œ‰DËþ($ÏŲÉ{ŠÍɘ “ëò‹HóÑ ç¨ë¬š¢@'i6ñÐéÙÀökƒ;R'×ÅA¯‡|«ª²o8Ö$%¨Ê¨£j²è>>9ààÍêÍØ¦r2°ò‡¿uCòz!µ»Æ8ë\ñˆöÓN÷ÑÒç²|\)}¢‘­ÞXøárÈO5ÕfqE—7î–ø}Ìî{ÓÅÀ&•Ìç /l’cè-v­´oÐÓ‡“ë,÷ä÷Za·¤`!øT#èï'fy¡`mùèX¾ÀÆÃuC¿A†Ý5~ØçWã ×iª§k¡œ¼i‡‡³®Æ¢Õعt3¯œ¤ùy{û¸]†s›*a:´_:6.¬˜®®pˆé7Ê5lOÃ.ÅO¿ÏÑáR|È7+aPÒÝ/r ÈÆcíš½?Á, i¡÷ü^“ªœ\ Ÿ“@­·‰ó¶5çÈ©¿‘eͺ(D?LãsEß3Ϙ_ §ù¶÷õ<þ&sÒO;„ðq1,®ûF±šcKª‡ê°Áu.suŒ,¶XíÒ0µÌ-Áä0£kx…IvJ¾kÌqñf!Ë$(Wg‡ÿŸûé ,>?Ñcë—ÅS|hßT€ê´`!»á†¥«£rRØ\¹A‚e ½aÚ¹‰w{ïæÆð[¬Â‘>¢‘É•§¡†ø¡Zlm6¹eIÉñ&ÑIG –õ)Åùv<‹Ä¡f¢ËÌñÓD—¦ºÛòƒ<{Õ#V×äTW:ÒÜúÀÅÅ3ˆò· ˆÂ"15ý¼çûwô"Ö9îhAØb–¶w¨Åæœ(aqì¨÷]47:€eޤº1yÆ—ë!žú‹n_˜ÆS:7ñfP˜MÝY‰¥±vçav‡³žB‡©øÓ¤1ãxci’0!_v/.Éþ´Ï·`éèxÆ?ÊÔˆszÆ™RE þ€0=Žê9`=;ƒðÁHGO™ú;5E çˆö<ÜU2á±Ýe§ŒÐÒÎŒÏgÑòª ¥øXvSRµý¤åº$Á‚¨ïl­›¿dÁFþ {FE Æò0Ñý!%Å9)µ Ö´N“2d×&wÙý½\’ÏëyW@~éÛ±,÷LF®«öï¶Ñò§\2-…185Õ°þ“Ä}É=ïãwà(¦ºÞ’Àd¶bê`­—}XrŽ¥Ï®*dfU~¸ 3­³§¥úÙÛU\1DZ¨ËâTA~ĽCŒ±Ÿ,Ÿ>XÍYdÊ)KGYÊ·ÓjÅA7û¥*Ïj„=·|Õï_3sô£h©Rù!à‰o*†ÐJÆ=[”"¡Sdúë}…Ή±Ãê><#ÿz:ôIâVýƽZÊ·qÔz Ò!(Ÿbœó¦kî`œ9âɬ0Q¨úwë3 Ä<+:\å`ï`äÄ S¨|ü®3åX?Èïªü‘°~ •LùnX8NÍ÷B•ÓfßâñÃÞv”Hâõní2…І­y×xäž9®¾äš›–4H_}ÚâÆ”+;Ï›¢³|¹Ð ˜f>H_ÆË¾pˆíë¢{ys•o ü¾¥”R—‚&ø°nœ°NùèЭ+ðYq Ö®F”4§M[ÛYp¬2(á>Œ^‰SÛ /æ³ÐàE–³U[$Þ ªDZüË;ó<¸h]CÔè‹x,¸Û<Ï"×û:ÖdÔïxÆÝQÔãªG>™ü ¬Î,žCfb‹ûÄhJïm^,üÔ*’«òÛèÚâX«ª7g/sßèÙ,qˆÄšÔ SX•_†Ñi”–g·1Šy®Ì)—<.!³^™3Dn?duÒ,~1šíJ° bÔÝMñöò¬ XÌI @¯EIôX(IÇBž« šc¢Z÷†¾‹rÔÚ>ÉÚŠ½ù²Ó¸AÞ.˜$êO/•©¿Œçž_#M‰¾ƒ:2¥Ï—¦¿b©6íÊNà‰®”DHDJ«Ó–ó«`î®—Ž|™¾mïW"-ß‚#ôçEé FÖ&ö^% °®œ@gw\z¶ùú­P¥Y¢×3€ÞÒod`.¡T— êPÀq‚dSGŠCð-6G©;’âñLØw<"JEå|­Ò•z½ó6ƒJí¤j·)VÆÎãi¦SæŠC-ì;Fx7£ä6Âûí—8¢¿1ƺDçôVêwÐH§O™ötÖ—¬"qäÞ­åâr+mO§V[Ó0“ÉG?š¼“4XÅl$ì_ctõâ£TJüò1VœÉ,ßF‘ÎP„½Xx3¼²ïL{FErcÞÕ.t«‡÷…/r=‹¼+òC óÇ'c„ݦÑ@·ÍUçœVC Cnòl3厘Üô¾NVîëèþ!ô£³©¸Æ'<ãæüÝq’6…èéØù¡ä¿òòï~Š^ï)ßbΖÃL麹EÏèÿømbLç7h\;àƒ°œ²\)›ÑÈ—Ïü(h’HPYVñI¡maè¢4#ë VºsûІ$àõBûøÍ}CKÕz*„™·µ÷llõݸb˜¦a(·Â¦ÐÞêÏí¡òø'b¹d]‹"€ÓA5>qà8Ê'FBHè` €ESÏÉf”’Æ`u2‡ñÆÞÌhÛw´Wœý\ñ¡ò½ò¡œº¬\¹¯J™x¯[Þ>þ´/ë#[Ñ*Ü„>]jFÄXY¥'ü0 øjösEŸ+O¦P7J'YÚëŠ9TÒmV ŽSØuMƒŽþéx”[›m^7÷¯´uqc F l`øÃ'¬žìº¯+Y53CJLw0~1ü …ò(VöjÆÂác†i¸æ"è]’J/¿ÇëM‰W‘/No*v?cëUíã&ÞI|ú3¸Ÿ V%Ìæ?HñÊçnÖ»~Š»6NÊK¹BÐ%qæ~ "ÖXÊù©<§­ËZöPéð‘Y§ýGɶ›`ÖÁêSCYLG•Mt’î:<öÂq•ØCýCôñè C˜ìË klEŸý Øa …Ázg†›Ö„*dPdÉ,âéIÃ+ò~9Æî0¦Ÿ†‰jØB#£¹©C÷~$P΋+«èu¯l噩y07Aj˜Û»£ ¥ê2œ=^–Îæ½Ž…QŽô¼/f©†\šÉ,dØ_á©ÝÕRo‚¸SQ54ÓRŸ#EÁ/(5k†z+ç”jšø`òÒ²yFáÛº€¢ù¦Ÿ?‘fÜyBw¼Ø鲄¬˜Ñ}{å:(kü\‚ð4¦,çÌZU4;j4&¿Ò>Ì©74¼ÁÁ¦•c• ÖªH“µ™¡Y܇ˆübÓÙ€ƒCIاŒGY¬¿ ¡Z<©ÞòöÌô²>§¡Í¬?G&‹¬Šˆh™d;Ä…Ë­6ìÇ`tFÉŠôhØÆÒ{#11ÏÜx@_Øz4ÎK%x³’˜«ï5™=qÇóN¢yŽ©Ìí½ÝVVÅw^}¾åÊE)ÏʶáëïÀí|×Y?8'úe±`õé8~N¼ Í›Iaî<ÈêsNij.|Mhª¸Ÿ1¡•e¸Ýg̾´ó=bGšyRô9 Èä~)NÙ½æÆDTñx£ÚHwøjglˆ‰Qñ¿Ö|½ºPv=IÉPÖbܯTÒ6„1®]d6ï]ô[·D‚{ü~Ž9ncu$k–QT@ƒÅ! Ìæß>+Xþ¼›Q)+wx˺3uÑå¤sâ&zç¹éi=~¼RE{´uÖ#üF&GF¢ñÍ÷šâU™Oþ¦_* qø²¤ B|ßwi š¬å—H¸‰À;Ž÷A轕z¢›HÌ/ºWâØ[øsÔ¹^äMttã¯x2¹áÔ L.î€]¶ÑÒ^†h<,³ƒÜ#îèð<ƒÂÛñØ{¯_¢ÍŽ›EßÏ÷ã5Çms“[ø‘CyйßßÙÞÇ%,eQ"jf[Á 0ÞÿtãhÉ1™úÒÝòµ869La‰´¼7éKµ|xë׃NœÕËÁ©XWÀ³øá¯??IÂd¾Ì.…„ê&Ô¯O›Â½]ênÜÞ=œÏ•kJo³ƒ?¢Æ›³ø” Ò+÷¢Iê¬[Ÿ¼MB ïÑØïEF‰Y<’*ÞoôÝû$™·ß@…Zh»îæ2!Z:—žO úýt‰ì’ *ätøÞ™­ÓH(W+*9$¼þª¸bUük1w·˜ ¾Ïÿ F[¯×Ç_úW„Ê„'÷ ä¯ý3d]irY/^6ô…wKú£„¯Lš!@®{×öÚy.VOauQo L:fX)u²L¾ã 5¿øÞËÿ t×R=—£¹yV‘ëœêÛL¿òE1+Èç(¬èÐHHÉ__æË*·åŒâwPlÞݼ uÞÚ@nÛR™N£É6”`…^Œ"*•üúù[³Jvë „¼Ï­¦Žáöd‰äLr`ŽT<ìϱ¸HÅ }–¯IU “’(:…#$åp40gmzN¹¡÷Êk+øë]®dHa"½µa‚oÅëlŒã8í>FPp¯?ÃyõÙaŽkh¸ W‘Ø‹àL8È­%¾»õ‹>S]Zîm0£­£{f”Ôûä…ÿ´‰8j!¯Þgpìêg?ƒ|·=mò°B]õyÔËLNXý§PeSÖÏÆ) H~Ü|ÈËo‡?…?ŽY_ü Wè™'ÚX’Lퟋh÷ߨÖÅPñÜÍ"7Óö3j»ð’.‚Û¿Î5Ù5ª7¡¹ˆ CúZ™¯hõ¡¹}þfäaïŒ Ƹ&Îq³­ê·ÛbI¸­ÝÎOˆ¤â—#vƒÂŽd²cíxÍL(M†ÄìªR‹”;•“ZÌrZ˜¿±Álç‡È¥3yL{?³‚ªµxCï„*™uìðÊ»ÑÕc½b‡9#Ç Wº‰Ù+˜þˆûÓqÜkžŸÿé‹ê{#ÿP!tàÓH™œÄéž¿y_dÓÇ"ÑüR=½ßìüfþD:®´C\­ÃÏR?·Û; ë_RÚ¡/Ôã ßá p,•ƒlž¡É7‰fGË 0­HÞÊ©”, $kÀýâ…‡'˜¨Í¨Å1ç3x~䚘O6 Ê.¥èÖA)WV‘öþÀ¾ ѰM¾­»¿=Dy+*Í‚×Iê_oÏ!Õ•l¬ pð8{QŒƒüèû£ 1jƒ¼6ÛúY¾q‹n½QÁïË&â¶ÿQÁ×cu×Çh„¹—#;¨Á«9aÂ×Yª$÷±¬dJTmȈW7AÆ òù|Á »÷yµË¦sÇsA·ât£ÆRáíF•„GCueOÇeG´ óÂ\9”á¼’»„5…ã<‚äüQŒDCÍ“ЯTôrÜëtuô›íEp öƒ¥‹Í“KhÂtÖ¡ãnµµŒg=ùÑ@ƒqÛÁ”†·s(Ò_­è~¿¨iIé ¿‘¿{iLf­l²Ë]°ÇBgûÑW\Û–Uì„ûs4­–6ŠÕóût¿/w+‰*Êü{áh”#®þûT·Ê!s_u–ïfè 3tŒd¥(YZ›jÐÏKØ=b𼚱êÔ†ŸçÝΓCÔŸžðËÈiÒÆ:PwÉ'Åa¼qfO€Ž!¸¯Ãç".hñh¯MY,âJº"ºvüqL¿h&P€ÖOQO”Ú+ßSf~”×bÁ›ô¡D`»I² _l¦³â˜¥ê§–žŸªõC;Kr–}ýçÒÑšM¡¿1þñ/+|—sýãXk SÛažy…g§÷N¼q£èÆ1d®¯Ë,k€®k‡lâ- âbMç†å™X–ÞØ¢÷8ëLbD¨ÿ«Ö7ô|†G\èjŒp±¯%Ì‹ÑÚÐÕê6W÷è–8,Å–À¬lkÄŒÈìWRPŸd–Îú{]Û^Tk‡AaCh,OéßÀ›"ÌuƒgB¤«'¦·Hmº\×Vª¤F†2\ó(ÆÝ)=1œâ˜ÇüøaeJzù;6µéÕ9:=®U¹Ë™ÄQfê¹€%‡%PBc^ÍY‚²}¡Áj– (˃N~í "d,¹*G/^sÒžqÿl³¨èȧ†Ñ$óCÒs¨ñò¢<ÞÃr'¹™;Óó¡/L}Šz}AW+MâÆ wFè_§¶äÈT Z3z€³¦(óTŒäó®àmjÿ„}‘l†‘DŸÙ “Þ¿*ˆÈèÈ7bøx93^ó_Ij^¯5‹ÕŽD Í8DQô¡¹ú&ðz÷®š©ñmš(Ìj endstream endobj 107 0 obj << /Length1 1678 /Length2 11195 /Length3 0 /Length 12276 /Filter /FlateDecode >> stream xÚ´Pœ[-Œ{pׯFƒ[pwKph qiÜ=X<¸;ÁÝ]ƒ ®Á‚»?®ÌÌùÿª÷Šªæ[{¯mç¬}h)U5XÅÍLAÒöV6v€„’¦;€‹…–V ±ýËŽB« rv;Ø üƒ!á 2¼Ú$M ¯D%{€¼«-€ƒ ÀñV€ƒW€ÀÉÎÎÿ/¢ƒ³@ÒÄ lPbÈ;؃\Ph%=Á–V×:ÿú0˜18øùyYþ ˆÛœÁf&ö%ˆÈîµ¢™‰-@ÃÁ ‚xþW !+ÄQtwwg3±sasp¶ad¸ƒ!Vu ÈÙ døcd€²‰èïÑØPhšV`—¿wgàÕ` 6Ù»¼†¸Ú›ƒœ¯ÕrŠGý_dÅ¿,€¿ÀÁÆñïtGÿ‘lÿg°‰™™ƒ£‰½'ØÞ`¶T¤Ù €‰½ùD[‡×x7°­‰é+áÏÖMÒâj“× ÿžÏÅÌìqasÛþ1#ð4¯Ç,eo.á`g²‡¸ üÑŸ$ØdözîžÀ¿/ׯÞÁÝÞû_ÈlonñÇ殎@-{°“+HNòoΫ å?6KÀÃÎÎÎÇÉ9@fVÀ? hz:‚þtrüa~Á×ÛÑÁ`ñ:Èlzý‡âíbâ@œ]A¾Þÿtü7Báà˜ƒÍ S%Øå?Ù_Í ‹¿ðëý;ƒ=Ø_åÇ`ÿãïß_¯ 3w°·õüýÏ+Êk+(é)1ÿ=ò¿ïÞ9x¼Y¹x¬œ<ìNnïë‡ïçQ5ÿÝÇ?båì-üµûzNÿjÙío 0ü½ Œ€ÿÎ¥ìðª\€á?B×gça7{ýáø–ûŸ!ÿ*ÿ#ËÿUèÿÛ‘´«­íŸ~†¿ÿ¿‰ØÖóoÆ«r]!¯[ äðº öÿKÕýµºJ s°«Ýÿzå &¯Û noùªhVn6vî¿ì`i°È\ 1³úK5ÙµþØ7[°=HÕÁüÇ óÅÎþ?¾×%3³y}E\^¥ù§ ôºCÿ]WÊÞÌÁüeãäy 0qv6ñDy½ëWÄðæxÝJsÇŸbÙì ¯!€×}Î(\ì[PüÓ_è-øî߈—”ùzõ)þñ€JÿF|œ ú¿ÿ«Ïäßè©€æÿ€¯YAÿ€¯¡ÿ€\ å? 7hõoÈýÚ¬•§£ÕëÛôÆ« üÈÚþò€vÿ¯Åÿ“îu"ÇW%:ü£;Ž×‚Îÿ€¯È?àëd®Âÿº3Wgç×éÏmy½¡á?Ÿ?Èd†òsÎÁL0ĺ&¤í¶JœÄugœ“ûÍÀyä%’ζ‘Û®Z„ÐÝW^Ô‚x×̯¨»uìCÎâ—F]|vÃ5Ÿ”(üŸumð¦[,>“ØÂ÷‡.Š®œ¿:;ßsÙ›[âŸ4©¹_ŠM3°8í̦ïËÑ5UÜ|³:A¤oøÍ†3…HÈÇÇ…Ò.žÞ^ñ®Z|z¦CŽÆå\lü(žLzÿ.¥”“gs`±”¼‘BrpðÆQá2ý@äë^Ï[bãIÀ4íváÆ Ë¶@S—ï¢Ô‚rÛ“ç²çÛ1rê–M²ƒë°ýɰë_¨Nבųz=Vÿ¿¤%Ùfœê$¿„’iU·ˆD-óÈqŠ14c +OôþX;ú¶ÇïdM4R^£³¦´¯ÖíŠ&¡ö\KEsV£’›J‘¥ýS-Vôje‰꼬œëm©k>tñ踱/v«_^MÔ&ù·­¼$þ«ÎÞjê1%ábD 6Sìó顲-bÿÖ72äÓh‡%¿·sf¨(òH°ï³JS&r)úʵL{§jÙKGL°¸‚}2ÜʸØDìïhÆ÷gu݈™t¢]bUážÚW [é>k °õ›PðêþàñöCTJñÚ•@íÔÜÀH¼².L è{ ÛHE0D™U´úVQø Á÷Å$M!náÒu첈«6Üb¨_þVöð+mlMîîIX`FªyP™ EÇ/®ù)[}‹¤e?1^ —ü¶³ÎþÉéølÑM0xv­[Ÿ]œ®Õ…æþÞ¼ ÌuÒ£•ò‹Š™†g݇-Aýæø“ñ‚̇2<‰R%~º†A^B'Z$&áù†KÚø§, $¯¸‰j`:Ss6^AA‡"c}b¾08êèqÃ/«‰^;\èë~Ö6@ÓB'àóû>¾½ƒ X:¿å§‚àÙ$»Àïl´^Ø’~f¾]hvÈ ŒÚ--bôŒc3ÂAš:Èz™1´T¶Õ8;‘E]¾gÈǽ§˜²¦aûr‹#±D0,òãÖÜy«K/Ç«‡+aL’ØŠ‚áa¥Ô3®D´´réÞ¥ *ÌE2„RÁMÎCЍ@z{;óèdV[¤]ðµñÐwu°OuiTŽþY]Êj¹eöœ´5ÚžÒñ8ÏÜÚmë$KŸ' Ãy…žÔ‰T³(®2aÂY¨Ì§Ž¿G@ûÐJ2šêÒE዆ Õò 9Ø7ÙV ÷Oðý‰ÙÎTúi`qÔŠ ûÓÖâ<õ^zÜgЫ@ç8' SHĨr>ó4ðöSwZK€†ÉÓæÚïÐ>˜ cåË{Õ6É&°vÍØÆ ¨žÔh\rˆê#Ò[2òàŽ”î èWYadé%8Ë´S&6{ø«g{­ Í2öêLê-½J+Öˆ&¾Òˆ}4àCÍ-ÏRßmºT½¬;Ó±ªëƒZk÷2ÆÄ“[ÈéôZªÝû¥8îC%!UåîûîWz{Á~{ã…[(·š€ë ÂW÷öKf{‰?·Îë9ˆTfm@²I-ËÏ }D"=B¾ãvE€ËNM÷éÄD%¾ùhNp[lc¡°ýˆ(‚$ÃZì¶°H—ÿþ”]DôO¯ežÇÈØÄùhè?.XFi8TGP¸þEYos(hÕiGLWø~Z—d¿EŒ£°;ÁK«wB•Rc• x3æ’¤Ð8ó"øí¼^¿3QšÞ @?:60sÂ|÷[?™ètf”lNú¸.ÏYðÃÓ€ãi Š”MϾ» ¥_|€­Ô ýhÙµ60°'ÍltàœÀ5‡_S„ è*¸ªÃ*RdÃÏaô¿›á†Þûô]Õ3£Ï*d»ýÜùá›)ÿHÓê²z‰sH+-»ñúÉ ÛVۧߦ|}š¹)Þ‘,ªx®Gü¨p´T(iØc} -X—†A ZXrK^ÍÅY?·-î6j\vñ¡:éKR¤Áî2tœ#¦D’BºŸ1®&eÇo:aÝf¦ƒÎQEt“¹ÃÎ Iúgè6¨ nZ\çÃN9Í=_@6ëïãLÉ9ïüO›íd­#8|žZËŒT9ñ}VLø~ û}ýnS£ºqÍípWht¸Žù›tSXx /ù"¥À-m&6ü"ó¢lxmiŒïV‹çC³Ñ4új÷ãþ%AØndã~$Hà婉c&Ó´æd!ÿ勤q8ì\ç7ö³ÝÆmû\õåà.¹ëŽuž` Ñï^…`vÃÃQ¡Øïá*bÌ;#ÃèÝcvQ‘Ê ™tprLjŠ Ò?F84œ=Dn¡'&`Øs1ÖÑpîñ‚™êBo:,ŸóÒ>¢>½„tPÖXÖ½  ·èuªuo€Ì§+侟}€Ü\ÑÁOÁd³QC=1nê}eñúz×ï5Ùø«°’–ƒ21j0»¡ª6L‡ÊÑuâ`wi¢îÌQ¼¶åüøX…#&΀j˜ÑøÒ°ñ¢nÈ^5¦Á>ñžíİ|Wû@5»Vts"iqK¹¾&ìW¢6»%ðxÏЉü!²×¯X+ÆÅÜÚ?e$Þ¦LÕ’t xJX+Œ0‡qqýÅÈ@ Š<»¡;Ñë€"Mó„…F»dŠËzìxéýZýåçL²žÍ޵Æ"HÈ쨚Ó÷Š£Ÿ)?dlÌÆ¯7޽ó3}ŠÔ[î`ž¡1Q÷ pÝ$Ä­öh0xr<ùEøÅùø08FoóÑ«J‡""r4FT†ÐÄÝDE£’²×Zga¶šcµm\„mÝLW'ò aø†}j†zõÛh½O׊ÐÑy‘Ê!â¥_U¡ëÜk·k܃µÄcN´ó˜W ¦ãh†$}ãÐÚ®d®÷2@Š>æ#Æų C)ãëÆÒÆýe9·8ìm’cÞ“ ,…¶Zf—ÖI¯lN—³~øâç†næî}ÿŽŽˆq{Ç{MàÜÏ&:Ý—O3Ã+9KšŸXÄ4ƒCÝËPŸoJfˆ²Ž«J½†Ú¦‹Öñ'¼@³7H°+6qfÂ^ƒ§W&Ûw²Æ³Æ4I×Ü}X÷(QëØ²?e Óô$§©‘ÇÝqWR&Ó~XDBþGåÍaؘ:º™JßÅFê &¤e”9Þû0áÝp Ï}½D.gzĄ̀~¥»xòo›¡azM%!1© ˜ŠvU> ¢²fѲ½‹o¡ß;šPœ ÀúÝN…Ný7"kd14É3?‡#玪5”ßðôH ¯2F PRÏóAƒ|†Æâg,«Œ”+æÔ`šp®–ˆsŠ3ŠàÓã—ôµÄ;?Á› ‰ŒÔ­Tœ¢lh‡*e¯ŽóxAža”ìN’êÁÏíòçª ÝÁvÝ{½Š£E9×f…JSÙ6"q²rß°E.¤F•ÕFz§PÀ|ÜeÙSZÙ $‹ˆx#l4ªÐ è9ž/ÌüR“?°95û¿7 ý’¨;ý¤Òü!¬v§búöÍù(Ë;áp¡S±õZNEîÃNØŽÙ"{þu\®Ð®Ó²¯›×…Bž‡æ;šá9 O.Îeë¦}óO·ô+fó>ᳺ™óm)c •îù ¤aQé­uÊ´^õç(C¿õûgÄã¶šš"ïá ÎÏÖówÇ%¨ƒÉŒØ¸¹Ž[ÙÞßþâ´û¿›¸!ÑÜfXÝ¢ºRAUn¿Szm™¦³ÇbÕö"Èùîb*å0Áwœu=‹gk5¡Óoý¤Mâ4w)sÄ»ä‡á*·YìoH>µåå•úìnlâ]éôÊáëbNóNhùµ»2ê†W?¡2>‡Y–*w•È•=Q˜0_h¶Ç9€zZŽÏ/ü[Œ™÷Þ;ô"@ÉøryÑôN,ÆFU§JiÞ¯*{½¦Ž ‰Âë}´¤YvFÄ ?¼}ê¥Ñ >XNõ¼ †×RA~ß—-#ša;U®8xü²;†`«jWˆÕ€p²Tê(fÏâéßCÊ=‡?æR="ÐVŸA°¬ kÂI}‚ô ÖâÎÐð¸Há ïÇ©©Ûú^°7¿‰.Ò:°†sË"½jái`!kôd(¨Œî)«\¡¦b$Ÿ}4!œ°•Œ”tQN¤Ý#<2ˆÈ¼ýÐ<%.WÐ$L}¢&;¿¡b6¶¦Vo%òâØtÇ'äog¼(jpœ·Ý–7á¯÷ZÑérÉM˜0—¬‚GÒ•½ÇN×7_ʈ³îðgäòX¦µ¢·@uàù+¨ÝWÚ©ãê¯Èñ8‚ñTüxD&-Åô–x¶™‰§zøŸ6›æãÙ‡ëjáløÄÐ#*‡ÑB¯«XВć{â—a$#š÷¹•ß•º"wmyB0&½ Ë›‡Š¨ >%±‰ö|›ªœ.Û.°]¡KßÅ%ÆŽP÷û¬ãþŽ2ï2îæÁÞ`€YŽÇ]Ï@Ö g¹¦]P‹jð+Åeðz´2a÷2ë`©Ýä‹a„i-³¾­-íÿlna–ïH„œRêX¹7Ú‰+o PܸÜj†}z?«7¥¸¤rV˜ã)_®ÏHÚ¥ Ë E#¤;ØfE/¬B^7I„ž~LñR‹/nÿa*L +ö3/à$ß&ÑÇþ—½ùa2üÇ2«woOj ­›÷I=¢§ELEƒjäÊãTB¹ÐV/7Uä‹Ooò¯kŸwcœ“g¦%a#ÂùÈmšŸ9Eà 5SàŽYîÕ õv‘åšöCjßIíÃËwÐ9·½7EÆ©RÑœñs’æ7¢¾-,33K&j™Ké0WÌ7eHíÄŠJ]µê?Z£Œ+_4aš‘)E•þü“hË[P‚d+g¦kÀbI_›;—B·™+e—|aOæ.³õ2&ª) ìÏßçLÑ!óAQL®F,™T¼õøR÷@y‡—ûií ªÒ˜øUÊŒ`åÍÂ`¤/ºéË×›Ž\ çÒç.ŒŒ†8ÅËp×àë’¤Õ¨t<õþ…+ÃaÒ@Å éçØ¦= KnŠ©n[`w¿®:,󤜅iˆwŽÕ8šTÎÇ žàö,i>|ä•Ù,mïf¡µ‡©˜”ƒ ÞÏ4'[&T®2׉>.}AÌ(P ‹”@•iÍ<¿`Tœ•’\ÄìYþqB¬¡1å@ Q1@.ÕOEÔþ|¸|pšê¿êºn€”‰JÖªZH]§Ž"/³™%1HP.¬AKšv_!‘~OC*ñ þiM{Ô4¥wÔßs¢ óÇqž³š´›Ô³ˆud³ñûóœß¹ õª PYÍ4`ý}žS‚|9Ñ *]µŒ>7+îëýFDMˈ(Û}!X.pp"a'›BÔPÏ%ÙZžKÒcÿ‚>Áð?#éÝ·XMHh8µé%‚.;} ÝaÖ·¨,‰'qº:¦Øw‰Ÿ:Ý iH$¬ù3Qù›OümB‚Â{%+’$;©GÝÌ™ìë­l#ÁVâmW2 Ĉ®µ­¦B+(9;C$ý¥ƒ0-þÙ¢ÔÄÔ@ÄÇøå‘4õû°´Ë®ÌMƒäâL†÷¶×d6~›ãçYS‚)3CbÇèvŠå¨ëÍzÚ´Þß¡ÆUJ)"_rˆº¤ŒoB8£ šå8 ¦Œ†ü6ð1òˆXaê*ÆDõÇ¿ÐìäpÇ 6•» oi“¬Ýƾå[N9ɱºJ‹)úà‘T¶¥ŒÉ7]êÉx(FçKË>©ß— <Œ3xæÈƆýŠuÐå¨ÓŒó(<~ÒZîài7­5N}ã}÷f!Ìùˆx«Ç4AéWÀÁVWIϱ·ÉDŒnøâ©GÙRŒû¤°u©êÐëX³’×ý0”Y`oŒóü•Ôy±½q x†.œ¼ÎH5 ¿{ÖO¨f}ïzThhg³—¢ù‚‰òÌÅ„éVZŠ4† ª÷ jÜP¡œNRÍšÏ<±ÝUï'„¥™å>çóÓš¥(ÀÏ;Óá×¹V‘¸¹ Ãúñ„OÍè"+ÂÁ²Øm›mQ&—·ºj Ÿ¥›À:pɢث±.å·ÂA–]Ž äÓÍ7ÇA/ ën¤·zÖ£z¨ü¤Î<¤ç "‰°^C³ bP²v%ŠáE^o »ÛÀ°·tDè¢ÈÊ¿³Ö–alÙ¸ˆºNdhŽ?ë‰j'Ÿ8Àd‚bDÎã"k\}ØCÕë™ú¸lHSD" §)´šP¿…”¨rÓ°£*¶úGzVj¹è1R㊿˜ÙÙ'?Æfç &~ý¶æ³†ÙÐuT]iõ¤/‡VÀÔQŸX•‚ƒV½Ãj}˜Á§ÜV Ân0V‹V1‘ŒW³ÛÇô²4À€'ªo¼*áY¥“‰€¨ââc¡éE\„Ñïò ‘0rŽL|èRʉàèÃ:ììÐ[>™1{ÇÒF‘º¡zSzô ï'û§{\µ";?Ë)®Ÿc’æ¿J±e{åBî7dÞæ&<-&²Ú‘Âö-í~g„³E…üḇõ2à <ìz´¨+…–—M?‹"äl}-ÿêeà§ÎS8ñM—¥¥‘T 2¤}ù”Ÿn98banHæ0O“«Qs·}c_~lÚ{—1}§‚,o>«À0¿84Ž'–`'¢z´0Ih00ñm'—Rz I¢ù¥&Á©f°([‡ÏÛ§)‹Ô}ýlª£¾+Ñý¾Nçþp¹u*ƦîÖš‘bDè]}z”ÆÈ‡ö©ê¥iƒtm¬–Ò3ú­¥Eú;í+Ì1š˜•3z$жS1Iʺ1‹UPB;V*Ÿ+Ùfœíµ+Êj³Q±Ï3ð#i‘ßGˆ°ß:^7ˆ(¶°d ÁÊ£ÝñÀÛd±•–íŽ|'¬©u3"ÿ€ô[Ô³¾¿ÐD®=ÂïêtMð8¿† , ÅÍŒ€~EÔì´w&P%Jƒ£ÊL®H†•üõ°jƒdKüÒT@¼ ï³­dà×HC,˜2¼± ûk²Ã7ýmÉ”~”¼Ÿ\bŽ*¤§ÎJ;(/ó–':,ú¿åj3­àlë´4² LYÆB¯Ï€y{Ôü»ç#z#Ièîi ÉÎ:ŠåÞ6?i1Æg£ÉËjÇÒ—Úœâ˜ù޽ç2\—O“ï6¸'·uç³HCUŽ7Æá¨ÅKªÎ—¡àòëÑ ¿Üt‘”Ãrˆøì‘ZÀbrá•{ ÿœUg9V‹‡£àÝ£Q‰Â1—9É¿eù]É /sŒ:´”}}ê”@KÇR KÌÀxëMEµÅ§n‹;‚À´‚Þır#w±˜Íõø¼”ÍÒ›Û‰EH Žõ ?}+ªÍ.ô#œsTç|_ë…ÂAkýîqÎéD Ž€nNû̒ј,²}s=š´@¨°1-­ËÂæ”:êZk+ îÀkÊâ£ÓzëØ]w!4¼lGøêà:˜rÉ»«‚Nø~–°q[ºïû­»^8G¬B ¼ÔŸÐk> ŽÒ¼œs8~€“ß?kƒ´|“kèÆcÖRí³}X*ŸU´ütt{ÿM\¾[~–•U2Ú:ºÜ´‹öüÀ‹—0;*ï»›9 .JöŹ÷b£þ*¶³çjÓrkÁ·¡ý3áÀw_#K…ëSÛH\­F¥kZé´÷³»cDôíw•680ËÊnJµ 7ìÆê’¼i0N§l½™0ÎV˜õ †÷ 8ŒŒCÕS8Žáåù¸?eYQû—‘×cxŽu¸ô¥üá´–jÄ÷[ Ô爘ÐI‰„ây.(¹XNÌˈÔë÷D[ ff<ìJ/´MXVÂ=_5$)#µíž]B<ꬵ„{5Æšègé>­dWçqìõ.ÖªŒˆâÏþ˜éýá‡^o¸lÑøCå}%ŽÀ%õý×SÆ€¶s¢dÆG“O•ßM‘°yÔ¢Õ}A;§ à7©¹?•¨stÌlèüçHì‘—àƒG.<8¡ §„=†¼‹Nš]ŠëY!Œ$ŸÙ.r©oDÏšñsch™àäÀ'…-eÛ"EÒgºMÑ! Ltä¢g¼ž!ìk&P¤Y#…A˜¼³àô§00ûä`ØÆÆH8©1G*Tž÷Î-®u0Ý:9ÿ!‹otN”wל(y †â½Çh$•®³ëÂeËà~ê3yÚ‚ÓÉ[3k"È3Ê ?ŽuªÕÌÄóÃÌçßw·›>4¿”-½ ]È¢9êŸV²ÆÛÃçÖDªJýû‘4û DT~*@¿(£Ù‰Ái~^Ÿ2 l\'Ð*ïxŒeÕ{ôÎv©«ïTàHâÝ;µ¦Óž]ª¸S³EµŠ€°IÃA3ŽÁçIH9IÄBí™Vv§{_ñ"Àˆ„x¬¤r…dzÒЊsž­Ã|õ~Þˆä\#j«rjÜEÕ áǑ̷_±n­ªoEy;â'¼YåDå…ÑjôIO™| „Íw¥J J§Ëf-GƒÚŒµvïÈ„&9âÏRÈÖÌ=¾·û¦ÏË9îeE­ªqðë>ªå*Ô(=*óô^¡:ÎwB΀à{vÎpør‡ê±Â6úýl* B»g±L¯3Œ²¸Àsœa`âéï)†3>™pê{ärÖ*‡¬ÎQ7ÆœÌ5Á«à`¢Iy7 ÛÑn&çûHl¾ŒíQ‚RŸ;ÈW\ã%úLYôT!•‘»Kä÷çlõü‡÷*txïp¢v)ªíÏiœÖº—÷ÄÌË ÁŽ®Ù3H ZƒgþšZ{ä£lìk eÇÃ’¢äÇm†z šõPˆÄ®½ò!¦q÷ÛÖPk–ôìþ:Â&o¼’uT‰¸zWâ1CWØ|ÒYÉß¼àt…g~2Î[ŒVžJÐ,·` Žêû-Buü6Áió\,ÇïcÈÍúbDÊË,«u+žù7ö¸N† óý­)Ç0ÑXǃa„•ÚCQÖüs‘JôT#iñ0QôL¦_+s)ëb1d!@^¢ˆÌ5Q1U<æìM6 É¢_lwÙ:×s—bbµ“lû…Ѝ Ké²]44pý:z²Ôšßò‰9_ô0žH-и5º…> ó-_#ò~¬ÜÔc¾J w^iš@¨µäkxÔ•f]Q×/Œ¦ÀB%À÷¥g0Þ6`DátS’›?Ú„Ú" 0±¤nÔêÏ”hp7à8E …ÕÒÚ·{iKzø)›@OØd¹¥0¿ÀIôN:ËEš„ò©µÌöÕ± ÅO3½0YXÛoåÛ³ðàõŸëÆ)Á‡Ýá/¢CAiÐÑ84¿Õ`Zjh<¡ÏŒªîbôJúU¶‘T„$ÅŸñõD:ÓŽÎ&;šYé'®(ÔÅ^ô ÃÂèè&íQìå‘@ÚáÜWì‡jù|Ä:S#¤r—ûÔ8n_‰dšúï?G¶˜£°yJð=çDQ›Z\FÖ']çI v)—ý{Sƒ–¸„Ñ·d̯- ëk£$4^«MûûèÎÂ7­þ®ÄtZj”—2¥ëí•— g‹.åQdxbi«®2Ã6nª;É.&,k·:Y"]«/¾V4ƒùÈ k§þÙ4±¯ºÖ„×j&ˆ~ë»ùÜ—ëð?þû»ÚIä²%1̺[øã«Ÿ¿´ºí¥ˆ]Úå•;½ø_Î{õlU^®bÜo1¡Émä–³Z>ûïÇŠóðéȶ(ÿ¢ŸJ¡ˆOk°A*zÂçÍÈ4žäXò¢Ö1ü¾q†p ½{”•ÈÌ0^XnÊÖCYk¦ïáuO0 y`?ÿz2«¯´ wHŠö[/a3ì/fÖXc$Bt3Èj+Ÿ§n ˜?WÊgŸÂ5˜µÓa+b`QÕ__æ*Lj ,²D\o[– ç… æ4ýóÄ6oÈÞÀ¾7<Íó/ù†uí´ù8Óú^)‡5-B+ƒmžÍÿʉãW,Ú|½ ÓOpÐ ´,¾„ýT÷Ï|,>E’ôͳ}eÜEŒˆ­£5"K\)嘖 IÀç¹–Æ b„Óù´ýëex ‡¡fF;.ªÚ2bBê¢<:âC_ýžwBÃjé½q¿sÜï„áŒý¬æ‡ø¾U~â\Í’sÛãHÜiv,^†~’êü•4N jgA4i0âµÕá̉;”Zÿþõé3àfû1Dõ®’–Ÿ‹gèGmÓÕ·Ôâ/jxM© …{msðÞó|Ìñòjg= ñÓ<ÖB…¬œ‚Óò¿Êí ¤§íºÜØV¸ˆÞ>Ê"w~$èÜ¥ô‰öŠêº‚%ï2󚫸q"DgShе*¬¤åƒ¸@Àc°œÆÀ[„tÔåA6¢óÉ:‹~ŸÔ4 q„³{c¹ÆÍ÷¦i‹/WÞm9Q…ˆé´teò¹Œ¨ë]ذnŒaîP×Э#åõcB=ß¾oRÝŠ"Ê*ÞÄ_zªø‹kbœõPª{÷d=Zœ©wÞi¿Árÿzß$¼é£wýó<–-`⊾ßSr9Tî{i>EþI0›¯ÝÅ>LTƒzˆY˜>-šP%y2⎮Ã{”aò%,ÓŽ~ç0)H\ånåt¾ý¡H3n?(SØZaÄÄ^9;UDB\ŠýÒ©If¾ÊGÑ)âhóåJ#L·å~ÒU- “U´Ïðþ}.á+n´ð•xÆWÂÊÒ’u¾|Mª)ÈâŠQi㜨ªeh€¢`ïÛ53îMr{Â…vúIÒl.…¥ ¤G ÇNq0±q&«°ó.kî©«¥T>÷÷=°²m-„µH¿ €‚ Æ€°œ4n(‘)†rwe Ö“Þ½ÚSWK;»S9óW«r¬Ûu*ð!›¡EâÃt©áÍcú×Ï)ñ$OæÌM²—+‰7 CcM„·jÞ×g@ÔyœglSâ­5Ej/0ƒ‹L·ë‚°8…€¬ƒ)|¸N¦<Œ(Edœ,ׯ-«mUCú[ŸŽprÂÂ}ÛëR–º+~â°pÀ™¨Ç*LôåfH±E/tû¼ ˆ^;ÏžB ¥Ç¶òÅméÕt~á.×%×›Ûá¼`rËHÀÅIKšÉfÐýÀòÁ³ïWŽò!zÒ¯Á©k6`¡>Å^U¾tPR“pKR`Þþeطדs̓«.>DsÝÇ#t'£ÕJ• ðZ kÉJó¿Ç{±hÈk;"´Xñš®&ñ(eS¬m*­KI´XÖáëT„Þ?O>2åmR„>q× w³9Zm=ˆˆg¦&\¸òßËýNK&§²×È¢YÈÕ §·Ô,ì=íS‡ÓAÂõŸ(/: RT¤y1´C¶ÌÈ~¹‰Ýñ°Õâ¼~ø®•fSˆî~>4·¸E93’ž¹éZ‡£=—ÛL–f/\ª££åC]þ®r±“¿ÄßÏ„kFÓ`žÍ‹¸KVr¡™2ˆvt+J Ü˜pöðslq!Pq¾00Î÷ƒUc·ðôOÇÿ 9ðò endstream endobj 109 0 obj << /Length1 2335 /Length2 16691 /Length3 0 /Length 18079 /Filter /FlateDecode >> stream xÚŒ÷tÜk÷ ǶÕdbÛVcÛÎÄÆm£1Û¶Æfc4|s΃žçÿ}k½ïšµfæÚ¾ö½÷ý›!'VT¡6µ3ŠÛÙ:Ó330ñDåTU™™LL¬ LL,pä䪖Î6ÀÿÈáÈÕŽN–v¶<ÿ°u9È>9ÊÙÙ¤]l̬ffN&& ÷ íyŸ\-Mr i;[ ¹¨½‡£¥¹…óGžÿ|P™P˜¹¹9éþv:ZšÙ䌜-€_>2šÙTìL,Îÿ‚ŠÏÂÙÙž‡‘ÑÍÍÁ苃£¹5ÀÍÒÙ  t:ºMQÈ}þ›9@ÕÂÒé_ ;3g7#G àC`ci´uúpq±5:>²T¤d ö@ÛËþË€ðïæ˜˜ÿîßÞ²´ýÛÙÈÄÄ‘­‡¥­9ÀÌÒP—epvw¦Ùšþehdãd÷áoäjdicdüaðwéFqa%€ÑÃós2q´´wvbp²´ù‹#ã_a>Ú,fk*j÷å ÐÖÙ î¯ú>[:M>úîÁøïõ¶µs³õú2³´55û‹†©‹=£š­¥ƒ Pêó¿m>Dpdæ@g;+ 躛X0þ•@ÕÃø·’ù/ñ/{;{€Ù  ¥ðãÎËÉÈpvtúxýSñ¿Ž™`jiâ 0š[ÚÂý‰þ!šý œ¿£¥;@‡écü˜L½þûMïcÂLílm<þ˜ÿ}ÄŒš"ªjŸ•hÿMù¿J;w€=€ž…•ÀÎÊ ààæøüoE#ËWñO)[3;÷¿ŠýèÒ vý÷Pý{=¨ÿKÞîcnª?c®ËÄÎdòñÆüÿyØÿvùÿ7ãEùóÿ[‘¸‹Íßzªüÿè¾XÚxüÛâcn]œ?v@Îîclÿ¯©ð_‹+4µtùòµRÎF» lknóßFZ:‰[ºM-M,þž‰ÕþÚ3K[ ¢“å_7 €ž™‰éÿè>–ËÄúãöpúÉ¿UÀÝùߌb¶&v¦- ;ÀÈÑÑÈŽéc’XØÙ^ÌÛh tÿ{ˆŒ ¶vÎ.€v>3;G¸¿Ž”ƒÀ(ü—è_ˆÀ(òq?ÿAÜF±ÿ"N&£øÄ `”øƒXŒ’+€QêúÈ ûqåþ |òÐG>…ÿ"®˜ÊÐGL•?ˆ À¨ú}0Rûƒ>2hüA4ÿ‹¸?tFÐ‡Îø¿ˆ™å#¨±‘ãõEcG#kàÇ£ÂÌùœõ¿òÍúõ›ü‰÷q¶Œ¦ÿ…¬m0µ³±ùGæõfþ~œ&#ðrü¥wpùØ‘?.]1ûãòQŠ™¥ë?bü¥¶sùgŽóÀ’ÿ…l³ð°·ø¸òÿX|È,ÿ?ZfýøÑ³?åp|P´ùkXÿè?zðåü¸•ÿÄfÿˆeû1äÿÐ0´ûS·³Ýÿ¨?èØÿQ4Èþã±3ý‡Å=‡?Mþ`çàbç 45þGϘ?¤ÿèóÁ?³ÿ…€®ÿèû‡¹ÓÇUüÇá#ïŸCù¸Ò-ÿhúIg7»8|ðtù3þ~Æ:™Ø9þ“ÜG+]ÿ?È»ýc?‚þ£–¬:ñáê tüWÊÿ¹L\?‘_àWÇðßÏc Ðh·²hgÂdUÔþX-ŒïF¿?É?G¾¯‘JMïµâØáò„D]•°éx/œ4Ò‹²¶+Fu'´JôêuÚRÒš Ôöìýb§<³ß·<58Up*\7ð –€^UèÀûÕÁ[Ýß¼´Kš<×Á… I1ýÑ­_½n ìçø·Å}¥ƒ*ø—²Yú(µH]ÿâyò<ã¬(gúO04h—îÈów÷sh9SïDÒq´p>gQ¬…^Ú[,Ñ¿<×+TYœºqÉpµq>ß¡ÏPx‰%Kc/y•Enò/e3Q3€lŽyuŸóèÈJ¡a3Ù8®pKŒ“ù´Õ1úkö!Àfî«ÚÓÔÚŸ"-áК¹¹‰Kä+4õë ‡À>„:ҚʹÆ@Ë{xl¯@ÜiÞÉœž×NéxŽê˜íÀÂí`®5‰¬~ qðÁƒ"¸=àêö.°Ê(%«ñ곚:³Ÿs?pWé,ûå‚]”†Œ‚^ÞÈI>wWƒÎ¦ [ÅÝf «ÛC­3‚»*®ö“ÁáêàííÚÁ‚£‚¼P,|±‰B±IŠÜ()ø^¶£…‡{ÄÈ=¨dd {k³¦PyÊLr,‘—‘Ñë*ñ^Aså4™Ò:½°‰X>•9Å€æîw䘊Bþ»²q‚¾„½jÒ¯©ãÚs=ÚË£îÃU‘µ!5CþŸuâæŽA2(Ðö[xI¸ Ú‚}~ûtÆmvõÍÝ-Z1¼NF宎I5¬ÛDéŸ<ºÅŒÌÉ5ÍѸi^À:Ðú‘‚1.p¶†Èà¸^koæÅô¹Û›C¨ü0ç8‹WªÓÂ{jšá±XYbc¤ZfüK¦Í½þ…ÆšvÄúaSþåëñ~¼õ‹òOYõ)]ø« i#¬±â2_¥°¾r a©r ¯É=+("…3ðF¯ÇFJŽÒZ~Ӭɿõ©ÌÆ8°ÐÒ¼[r)'jÿÎ>Ôfÿ3VDª½h;/\€õRšËi¯ÔÅÆd*™6¿Àvé¢s†è¦ÕÑ—œž½ŸÅÒ®ã<=;2š¼ú=²>SÐâ6-¼Ù8sûf噜é`¡a8@1!8#ŒÇ…$ ÷ª”:ºÔ[mæb°ô4Ò êw9úç†çG”yÓ”Þâ\þŠŒLö‰›v_ZüÆ‚_Vœ=ä§–Bï)X;èèԸ 3¡cªŒ Ó¡xjkÓâÇ5±-̉ÎbS³MëùBˆ3ù~ØÌ¸}ßkÅõ•“é³’²®{‹°‚ õ3‰Ÿ#Áh˜ÍÝYºóØ‹rsšY»„Êwt«9=yžÌ0S‡51l¥]ÞøGˆ¹hQ¶—=œ°‡Š›øòÛZu²ìt,@-š`ź1#D½<ޱúçHé…d†÷x4×òDï!š-æ•®D$ìŸ\=—˜™Ÿ‘wÙç=óY^)RQz•Æ,ÔŽ!¹•¿©¨3(¹>¿_ÍàïÔ±LMvø>ˆWú‰,”ØÍEµÆ£ëCö¤üÒ.Ê‚?]y§LŠ­ü†ªà5#žÖg´¡1ìÿü8Å˾žY øEx~˜6W}iÔs}ô{|† QŽ!«¾*\Ž¢+^uõnÏIEœÞƒ²rF™h¡(„~û+7é­ðù6­àÈ)ÙáÚõ‰P|-O1•åxțȀD.½cü¸jÞ·¤,-K?ä :ë,ð’C ßÉr1’ —«¶­­§Rà Ô}CBzª¤Ê9J¨/iOŸàe(‘evæ)rP3Ŷåéx䎼ÂUX%X”‘„8ts¶é/ô±4£(ý~ÝùŠc18X¤öA>háç\?Û••¸¯ÈÿP³Ÿ(6¬¬¼ÝI—ã®Ú3À6Ÿ5v#ÞIAowê÷UM©üÜ n0£á@¬çk9˜çÖ–`ø~TP I¹ßk¸e¡Õ‹ ª#Un+´ÙkÌG혈¿Ž~èË5D[¿_ÜõOõ»_ZP–Ú‡n"QñC”k1·Ü—‡åªuÍT”0ž)Ovö©Ë•t­QàŒSíÌäØw¢¯º„² #ĶYy:m’92ý°Hcc°ü ºdå]} ¡4UÞŠ–û}™5ÂC™j¦÷ms±Ä±·;œ¤ÒstÉN¡× Ñ»ÂDûÀS¤à P¨IÛO˜h½ó÷–Ñw {ò>¾±`ì¡É$fèû´VwðůÌEì°cÕ"s‘zô•(nµWñé*A4{½^øUÈQûI‹ÈåžÜÉîø’«oj`\~S žy‡²ßëüžÀ°_xe"xÜ=åi¼“k&ÝA-‡ð`pÛï֋뛦‹L.J+SrèЫҜ³gFÍxhRÊ5¼RÃWÂTÊ¡—+ “šÅù©’˜D’@RÞ4‹)â•;ûņNáõJXdýN¾õƒp@ \ ZPsQŒc2Š¡˜Þ''c·2…6\:£4Éñ D€k2zv0o’qa6ù<ûkðm2[í[îpr¾’u²ÕA«ë뇥²ût®“yª.JGv-<ë×üW>ŸÄêÇJ¨vUFÇ&˜ºª¢™7¨áMŸ±"IoF¥ &xÛüõ°Ñ:F®Z°”A»Þ’^Ž’Z¥ÀéI†3²üïwEr¦&‡_–¸¼×~JLeo¬_èò¶J"ÀÙnC™°„nV¹iNBaä2 òlan£¶$ï£`9“öma ’·Ì<$™…«tu<Ós€ Á>€ÑM ê”§ÏgàVôOÁ0Aýg A®wž.±Bư°–îõ&ƒë†Ž?Ñ(» ‘¤ÎN ÐbpcV[ Paü™UNTL!oApöµÈ~RôVÞÍôã,ñ@†cýêJBÕƒTFÓ›—ú¡jí~™aenœ-™` Ã@Å׳sQžIÀ9 –B^`ïÐUv+€å[! ìéN·ê¥?a¢ç˜±Ãa÷£é[CË]ÞðF…³d‚êšèëÔ IwÚaÇ_ë7†Gs“H¨¬#¢Ÿ¿Ywc%@üqÀ‡æ.ü7MÚSÙ“³©S>V†(¨¼§Ic[zñs»Ä× ßåÞæl à„%âÓ¼i9hø®ž±“'e×0Ïþ”‘†p}Yš-Ü+X»Ë&¿4¡êõSe‚d(&(W‰Öv–m3úô”×K ½?rûãL¶óû¬âËY¢s?f~±´{]×Òðœ2ÁÏml]¯QC—õwÌP|¢†â[òã֞И—`Î^ÝGÛ€oòÒD 'oS×i¯¹â•Öµðu× V])x?6Whë¡5€x ÓN¥r ê)Ôe©É7=[ÐeÒWZêWc\õgÝÌ=¯P¦¤Ò²ÌX‚èrõÂè$ÆÅãJ=H-f&MÓs9ŽõUð|æ6_£.RâØµªd¦øýUö¯ôNMá„B ü  Ù$¶žïÖ0O¯wZ#Æ­Õ Ö]Ì÷|_ó"¡øP²Ù$M'î ý®ê2PÚláÄ͘bôŠÕ‡ðô 7uœÀqG4ÃÏë'zBã”ÞœY¼z Zšë~¨WÉ*Ý¥ÌÁÃ÷ôÂm95n(œ3±V4†ù:è² Ç”WÓÛ÷X4ቿ+5WI„¨Ø¡\F6GWHPrƘ{$Rp¶ãO!– ÅÕS—6ô"ë¦öyÆ–²¼ÚO—¹eY¢e¸ÙB\ÖÓ¢r¸•‹+ iÊúÚŠßí¹ÖÊ·áá¯v :-ô-Eëû7üœÏz­c›_\²¾Mr<û(ãŠ1¨7h£.´|MG5` Wϯÿ…› UϦ|Ló « vºáär ±Ôî›tJ´FEf‹·†6Õï “iIYØ¡ƒINS…¾ï£Aߌâ®q«Ö*±³yœ°É¡] iHäøÆ¡S=Ž—v¬¸å¥t!SÙ£,Ö‘éuÂïÉÏcöÐU™+ØRra޼ —Uþ ÆÆ›ÿFÉûé-˜ ²û-sÔ—÷ÆH{`sHP2WqÏù›$oÒØOuV(™D ?ÑÍ~Ò*3aÁB“ù¡Ž—ò®d²^¿È™oŠêâÆ÷©‡]¢>È…bk4©OdkšBkS®JâEhÉQmàꨮð+ÿ h¬TòaN@™Eà¦9cš{[^µüÌùàœ‹àµ¹è/ %ÿr R{8-)h€ß¡ts©ÊŠãDЊ֖|ª û ±ˆ[§†¡Î“ ¡ñŠƒé6ã1÷ª^4ºLªð„äÃ"«û¹ò¹µ‚L‰)ö¸ïço²—õ‰šõ5ˆ«¿?'ÉCí ù£9¶³-%,áþ6í,KéIq†ÖÜŠÆ´du‰TFcSÍp`3ö&üzúÏwÌòÜ͉k,ì쟓†W(«9¯ÀqøÌˆB fÈC45ÕVßUWBØ ŠyÅe)Jv'A—ô>.gèá#qR”‰=*Hm¿¹q“œþι-OÌ%2Úm:°†fwG8…Õ°àê 'Ó¤"8Á¤ÍWö©ýZN?ÛN l{ñ"‘O3ÔÔ(ƒ¨ÿuh«É–©s‹ï‹D‹k”‡9·@q= !óqѹn%p²BªAÅ uDDJµ)raÞõmxÔG«ÜfíjCæ]iùpÆä`Ù§ä2ãh·+ù¤Z—æêyu˜1x ]¹b‹1,–?¤¶ –«SV¹_b"ôÒlO`Áå¶}Û½Íû‘xÇ4K☎ï”1©"ú㌿wÖcáYgþy^Ÿ˜¾ˆ™¬š]6qCUŠ^à k!Qêsˆ)i&š4÷/Š4©ð`ÒÀÔ€yôf£ M›*(mI%暸†­é79Ÿ)e-—4cEð¦€J×ôCAs9kvm»~»uŒ=‚’œºÀY³Üoà_±7Ï%zæ_–N'BérPr+RwÍ­GôÀĸЛÁSs– Bå í¡Š‘'wŽYX,ÁKžœÇ`©uú…v½yE‹6AôŒ9v4ïƒ4šéÀÚE#ÂA@°îÔδ K ¥ Dª¶-Šç®ŽÑ¹ˆyG®§†ð»hú»då*†.3Œ»‹ädpSŒ¼Œíd2¤lgÔ‚ìšñÝÌ?]³Æ÷,DyÇ)w:|D½,§|*E>UyZ´“ZT×í‡þ©g¹¨j>¥c°©Ý`pfõàÇ÷·Dö‚ªJy.7d¹PrhZ1×H¸ðQ’ ðæ¹²‹Rßí£"w,Þ)-„hú/5“ƒÀ¨ë‹‹Rc§-Kº~_¬á:aAnþ®ù£ø9œa/Œ§'¹±¶ðÆ{ Ù[—¬"_œB¶Ÿ9ê:ã[´ ùÁÆ'%dÎ÷å±Ì' >#‹Cs=&3/U^{å||®gkÍ›Xãž‹·!|Oð WÉÃÓß×A¸Ç¡6püI2œÓFSÉ<ާËóÔÏzÉ8½‹³óß×w™À³Qï|‰ Dâ›4h>i‹Ž f„+dŸ¨øûÁž2Õû-Å`·L.v·Bí«Õ°O&=Ðûp†ÀÌb­Ð÷dÐ`7K‰þˆñbnù&žº©=P·ý×Q!ŽJÏ6c—£=&ŸÛr—}Óõó«üC-!¥›l/""è>Z­IÒ1ˆ†k‡Ü¤±™kFKÁo º…o’Ð?¾¢Ì4¶K蘟÷cR$”*v»7×SH¡á¤§½ŸÄXòS!¥äyòèøÒÉNž!fôêó¥l\x(Þ®¼˜FÎé‚8£¶zθíñÎX€˜r'Wk"¨p¡yeÅ!-diUH³Yc:µ\R’9Òf8§¿†pRQo~¡ˆÕWšGÜ•åL ®¬3¿÷kòÿ¶t7×HÂÚÝþnEËx¥ÙC®Æ–½àá$¨º³Âû’‘ ŽPFÜ@YÑ…ÁÚâŽÑϧãøµWñ+,÷Ô6v]?Í©u„'G?EΫ[,a  c†lœkf]d×™oUƒô´NÃé',k¼O/ŠÿÁW½)yá×™¯ÑÃÏâmÝÖï33㬡äsL^À 'Á§kÔ†ý¯Ÿ•Äq›r[²MÔÛ«ˆ?þ(éMŒº=¢$ÑÑ'ÚNv¿ÆÐIkš”¶¡C¡½VI<ÉËÊÓèøR™!ÜKàIÃÂO÷Ъ·¬PŠÅJu§/iS.Ì©o¬vvÈÙCåÜúQÿ´®¸1Új…wãTiÓð=ómb=@RS³´8ÉtÀ€D…îêñefäò¶•¼è3ÅKf¤ëożßôJ¤R CŽÚÅzdørŽYÇ` ¥ FìE®,3™¶™}ö½ºË¿ZÖé–ÔB¨­§î¾ÅéŒòÔz¥ —¦8CËEšêÚåÅGzÍ ˜kuþÕ³H×¹8¶íÐ{du W?QÖ0>O·ˆpL0Ø^_Úd…+’™e™òHÿ·2,««÷-bò¸(d1cR -[nÐÖmØÃ=h ÊÒ*e-ï2ô,©JZnàü¬]5V½¶/ÚrñÎÜ\:Nqß·6ËG˜h*ã#Oõ nâØL0Åxa~])ŸÍ”ŠNæ0 ÒóLD483â 4À¸ÝÙŸÆñþ˜|Š_R°¸IsARøÀ½êßda·*úbÂx°ÛvCžPì«$⯃Óâ%4Y%pÞ°6ÂúùÆúÎwí}C÷„(Mv3rʲuΜÕ"ẺßbnÍ?Y í0­.ù¤)q«PŸ•ÑŸÎ x÷‡.#ÇáÝå÷kÓ!C¸“Ÿ²aB½4îB/ÞÄTTóŸ7V8^ãøá@1c°c >–ù× Ó‡øàqĨơĕJÍÁjø2RbkÇ֦[ kR[¤ !‘Œ°v±–lÚÓc!°)ΞՖ¬¬d×x$j€{d« GØ7` <þNˆÔ a“¢½kc¥µïÕ‘ÎærmOô<͹Ù鞀>ßöD‰×ØRÙª¸•ñfU”!†>¶h·+‹ Ì^8¹ó}Â(¿òK´³”&Æ®þª:5ºø„Ä3”Cò3ìeÄ´ÝöÕ~‹xM_¬W¡‡<ÝwMu˜»ñÒ÷êºÏ9pow~#p©ØòŸC~¦;Ö„!æ6<¾<`Zh])0jee'«(ñöòМÁ±D`Äm!Ì‚Q{M|­Ú¬,ýó)>–øX¬…žGð7·bhØÙK¬WjÊÞøKú±µ×omevÞ÷,WjºTi:&IÁkÞšæ>…´ÎÕ13 nû´þ¦Y–èkå¦Èý*âZúIŒÐ|zže:ŽþDöÖ½ P,n¡»}ÄüÒI{§-Ò²("žŸ›‹¾BNéšï¼A›×¿¢Y+¶ïG„²aHà›Ð;>8A8Š jîNù#¿ê ¾ ?áÝ Š‹]O,¥Å´ßêÏܾ“}6é^%J›à/4¿f¾<ž~%ìë¿ðqGº kæø:¸ ö©uEÓø:Tá=ïe‡Lbö^~!ÜúäeþQÚêègõÐxoýk+w:¸Å‚- Ê­Ää'vM«*u’‘ {LaÈuDpàó¯:ÌBu@g‚C:I×ÝAf¦'ØdjŒÇöwÅ/,8Þ!ŠÃ:«˜9:ËŽowM—6ûf ÆÈ3Þ&ó.ÍN¾ìª;£0*„z>µ›l.£›[Þ•¿ÝZÛ•æEŽ1äÝ_íÀº`@ŸxÎþÊ0%1/ÅlyRŸÙŠbàîB®ƒ`b§‹ '˜‘OCÏÈ &pFœ×âÑóœ1J¸ÄêçG)½¿#?môÛ4õ¶èçÛ”vBCÙdÿÎP߈ždgˆàÇzhoìÂÃÒôíp¸•¦IëÂX rS>¬ÝC˜¨É¥ñ¢ûÄ3=ž¾?øYˆ¢t'wÈá«@]b®& J…ª8Mã2âÁª[(‘°å*e Ûž"#Ì ôW Q„kJJ°zBiL\ÏDù¾SH,œßu«@›ÂQÜr~á «%1å÷ÙŸ2rŸ¹u+9GüIÁ©ÀJ„ÞwüŒ(«9ôcEmº®JÁ„¸hεIrÊs:•9¾ ]I´mC¦z¹I.ËâOŸ1>„šF9W»Ÿì]úöf÷#†þÜ•Á¹F7=Z‡€'³]]rj7ÃN½S ‫^J|wöå[,úI0±dê<"ííoK67Øão1Ü{Úzœ§s½Æ¶í´øµ&Ë¿ÍæÐ®ª_ÍvPIáM8ò€ÆšÉy3Ó®¼øfÙ‘t dÙÔEæ7¾_2P+ÄÎOjÄ ÀÐ9wºIÒMf–6ï¤*.d'u̳œs=¥pÈ` _9Bå¿QD®Äšï6ÿ‚?ć‘iûå‘­Z@pvmö ßDÊxFyݕʜ …ãë”H»/kt‰‚²×Ëúç7z‚ý_E-Y&(6D*¡÷L³;Ê­ÇÔÙö9³ôyG;‚| Q=ìÄ¢ [ØÙ±¨Uö3d\Ú›ô.W[ÎLÏ=~žIƒ)½lÏ×6•ÞˆO‘Iò vMõÒ)¡™8·GJ½×U)Øè`ƒ¦ãFkQr]u#Í"Y8Á¥>ï DV±MBŠ‹?ý—P·õÐõ½µ”áfq…¾Ä;î¹'ô MÃr™\l>b¹zÛ{æÊ¿õ¾µQŒ€²u-›’€6Gé&H†ì¨ 1Ã×·kr* &I„"<;gô7OÒ¾3žúœ?¶Øc¨wj ™ЛæfCß¼n£, šy$CÀ¶Í¶Í+6FìÑGm$ÑíOBš7ÖØC0^ꔇݛQ^wrOcx¯ Þ QÛèd›e|Ûeì2¯4âmÅ óá|?räjweki1ØC(¨ã¡Mè·ŠKþ…¬·»‹ÑÐîL;ú)³åtÓs§ïàY†˜/Ž•Ïox÷´Ùþ®³^ÆÙ#£)Ÿ‘˧ä7ŠøŽ9¬ƒìD?V»’çRQ½ŸQÉÍtv¤“=yZ¦ 8¨ˆß÷]ŽK r4m=:[Qç*(N2 …ÜuNYº\;míop† 6öÂ`•û¯.ÓÄå°B§˜Ìäû¾ÕPû䲺V=¡xf^웺‹qc £a+eßC¡kŸá<=îéW èj!,Ù G\‹úþgW#´ ‹¥÷0›íbkµøä1†PÔò!%«ÙsÎC…ù.˜ ‡Œñlܸê¡ pÂRžÞö¦¸Oe¸ 'û&啲Ÿàîîv½0·_öÇT¦j£íÎ<±ÁaG°h½|mäÇ–›Âp‹^ŸlñCPµ^qœ$Åf)±ðÓòÖ«»cõ~ê?ÅcM3æ [8µO¿I•Kµ÷Ð<4Uö*àDáƒaPÍ|̇tAH}Ç&J%~¿¡–\j`€ŸGa:Ê:´Šv-£ØgPzl.|&€š[8"rXÏÀœ9j‰´3qoÝ`ü!Ðgü2¹µ½2æþJõž´Ó¨Á½_%˜©ÜLp|8îÌ…>ÿi…sbvià¶Ú&¸™0=°¼¶®–eÒþ…ºÐ{X'šRFl©Â¬€ÇWIpá‹ú$¡}ï«å v6@Éf¡zÚä'ÂÆ…®qøŠÀY¸ÂÌUáEÛ}/ÊzeKþìW†·vµÌ³’Ù¶#™áê½Õ0B£ØQ*ðÇdºqdDIÆÍ?C¿ŒYßÖ3 ‡æ„£ë9ûDœ¤;Œúçמ÷X»áèøÇ ë&”5«ÿŽw|`øf¶Y³Ük'¥¥Ÿ“_žÂÇö]¬³ÕjLm××Ýøuÿ¨*&ÍÈYÇ-ÃÜ…õ¹1öë Ì—ïáoý½=ˆá~Q¶‚ÃF W컡t‘º \ÀÞ‹ãGF'#èd\ù’§óíÖM¬Ùö¯Øq\Á¨Øgù¤W¶Ò[RjHc艺 ¹ãœ¸²9¤Ÿ…Ï]–2,…¬Ú™wÒxeCt) Àø‡J45ص!e!> BìÉ@NÎ. Èç#ï ›òòÛ·¶UÁg‰P… ë×Ó;#…‚bun\÷"ø¬¡GMÓÑ5I0áx3îP•r•Þ8ÔðW?@7g%B–t²«@©ÇÚî±[@Âv 0a‰ÆùFܷœ ínzFõê—*<Ö¨Ó»h¸ïÏ ðelEAÛ õ”A´Á8;´ d¡/2AyP©ªqÄnÝqšÁÙ‘¨§g¬ˆäå¬êÃ÷ßl†¿ ¿”Vi –ØDás"¸Uç@}†þ™5°F¢ÖR5‡S#ßn*e„ÈÎ5Wkµ‡pͻŬÇF^cŽ$‰vߌѭ}’ÓÉë'Ç4×Lf‡›Ýú®qw¨f ¦îTä‰GâÌ_ ‹þ¾ &ñÙ;è ³¤âFþ <r;Xzžãº}çŽöº\+nÉê“so¯VÇo, æ…š7¿Š»;„½<.ÊC­Iz‚ÙRÃÚÖô…|`–©û–Ä?³0)A¡ùGº´­ˆiqg8—¼ ÁÜà$~ 󭀞¿¯¤×dÀÙÜÜËwoiD|Ï}ó`O}¿ Q|c’PíúÛ)Œ›B0-i é(òP›æ°\=e~Û&¿n‚+≰)•HDMSßÝ¡è…@Ï åmW‘º­p[ËDéØ0ª»ŠÁÝ“s|Ó îvq¾ÿVY_Š$œ9‡ÒøzÞ…âyJ‡ÊpäÜœ,{úÌ×ÔˆÚo"êæ$ÿ…•#K‡4.KŠt6*%¹_šÚén­Vüù»|_u “«÷WÿKTáíwìCÓGf>Ã"Ò_¯/¹ M†¬ÒlŸYõýÚ’Z +!÷_ŸœÜİ´JÆ“\ iÔ 1ÉÞ/IõàÇil¬}~㨥ŽîÜÑ•b'ÄÞ`ŸéX·¢zȈð㓜<\ñ*jµü'Ë裯F]•<@ÇÜ!Ÿ2*׎½Ü öÎä*m³„.ãÝB½… ©TÛ¤uaè7’?¡Â‹m¦z…Ο¢+êÈÛD8hfÏ èDß7­è;ý97‰›ý’*üܺUå«%S§ß£À>Eò9šgK3ÒñÆ{­tÁô§ˆñXØ?šŽ¢ø‚’,v˜üb”÷‰@_O«‹œÚƒw­R$£•5ãöî€Êfú½Â¼AcZè™F½‰¬ ’’ÕžEmH €Fqx܃Ā’×;Húz¿¹”D7&^Š<>Z™R«“ño\>’.9+PÁnk4I—÷îŒþõ€¤¼d½hæcF.Ø4 ‡«¬è§zc|´`לœ;‘ßë¾%á#oŸ9ÂwßÈ/4˜1p=¿ªÌQº7É#±¼gòäË|I”ªÿºäbñtÕWŽÿI‘Ù©dž—èNàÏ^)fNÖ¨òMrðçb{0÷s g·ñ®}ò:öÈh7;" öSã_7ËÍ!Žb.Œ¡~Ú§‘3g¿ñ‹Åö:ZGKŒ—yÁ?©6KéæçE#¯8£$)>ó®‡Ìåh \t¯Ö2ÓoÞC…}ñoGÀ¤»¡ôH°À, ·Á»=ú0iO›žyl&ªYE7y•Âw*R½g ëT©Á1Ùd¾ä9&çÓX+9t«LJO“Ì¢åíüØ.s.j8bðû8v}î²c$e…7ì3˜ñrvüÐÜ Ô4ÿ‡î×.M‘c¹NÁ8"NCñ³í®p.}§¨ FMÚ ¶QÑk¦Ø3jLÕH¶ò»Ç#´…JˆÄ‡ØªIäï:ëÝàGå2˜ÇVÔiÛ\]%:úDQAÌaÇŸcMŸ½µ™6M˜™ìö:¼ßk’¶ÓQbþ35z”Ø?4¡ˆHJöIŸå&–¿6ó•V©.[ÁœŽsâœÎýýëtf…K\ôùØ.72˪Ñg82í Éô$ªÀ ó2¡Ž¢ôÜ"­˜hF­,”ðÎ9¡Éû•ö)î…VÓ¯§VõC/ÖÚÍÅ$¡shªܶ2ν¢‚C[å*‡–ŧHøw_ŒB‹õvN‹/iØ -µB½pæ7«RÞ`©NB¿™ß &_ž2÷tŸ^qºã|ç„+žhÔŸFZdh¬$Ö ËÕR®"‘2úÒ,~O}Ëê>¸øFŸo ŸˆvØ|ýßœ5°Ü‹ñx«\É.‡1ƒ*ziK•µUoÈf”ÿ“N¡½š‹EÂñzuïïu? £ê5ŠÔ Êxö™o#±Ê˜ÇvPTÔüô{››\:VÀÎŒšÔ)…„5Püz~V“H4¡í¯B™¯Í]—Ÿ!ºI©<(¿¦óIè`·‰ W®\[,l2¾ô­]ëÀízOV±ïÔ)C3±}È`p¥ayÃõeºá^$Æûžþw ?#vÒû!ÒF÷¡g6&6¿£w—3g‘/6¸¶5rÖØpe˜GûínÉ~øztUšŽKg “¾9WZË,ú-`ïÁ'6|@¸Hå áKOSv`_5Û ÂÇÒCöƨþEâÕÑ™óÀ$ëÂÃá¥wéO'Aƒl~äçiâC„œÅŸ¼ÈÈí§°ßËmž'J£„ÕŒš{ÔŠÃy’ƒ_Ê/€n¤»ú«PPøB{òõPÇ«oÏìý£sFpŠT¦~ IL¼)®S5á7j<Šö'ÊP¦CÓjþUkeß6»¨†´QÁ°Ç4×Aˆ}N™f5µâdYÓàÊ:o/p˜‡ÕÉ:á¹N.!­_ãjv \g-ÉLúÌÎHÅÈntsËצòÚÖQóøS6áŽáý`ÆŸoÉJÄëWh.®AÄ=j-†`Œ‘…‚±q ¿êRßqlÁ•E)€R1aÅ…ÞÇy¥)¼’¨ÉVC‰æí’Ó~·‹j™Ys<þhƒ«m0m›pL=®‰NÚ†MFžØy^»!%,ç”9.›íŒÿòMÀŽnOnUø-ÊdéúIÆV5Bw°ÌìY¤—Ó0å<å^ŠW™ì6¾SeDP¶* ÌÃh¤õ{Ú®Ðúw’…a{pqåzâ/vY¯.¢ÎUPÐÜÚš_^Îú¼u`=¬S¯%8l‹:]6ç4à;HÅÄEˆ xŸ©bÔC¢Ø™œZ̓¦—¼Ãd§”"¢~)‘á÷@ÀÛ³€ë‰ÓÏJŠáä\uɾŽAm©\÷¼÷N˜ÑÁÔzFNùOÏ–ˆP‰¡Ñ,R]•¿® ¾ìظü¼u½çêÙKÝÁÀk>ê-½¬¥|,ñ“/ êùj\ñjà‰ÄÅè%B[®©H3Qü;’ަ-x€Þ¹är³Þm©%¢!og½6U„5•„†_5©)màlJÑHÌ9nÖr`€J[2=x«ºäé¶kŒ ¦’®I{íç)/ý>Îû§“0L†­¹ ¸Ix'¯NøÅ…>ê½]˜ x™Ãö¬4å}ç{¹RìWê;L¶×•6ùøÖ’^Tùr½f–2àÑeaÓåjPäjCºâ‡kË9Gq TÅÍ,æ{j9уî­)WÉ»ö: ç°fÍ#Tc»‘çz—ß'÷ ûükøÝè]ÿ%’ŽºNf7P!Ëwò¢asß®§ßlÍbº¤Ÿ¥«ˆËö÷½l;³©º†O õñèrSÐi¾RÞåÉÓÞËAÀBiÆGÅÂeø—¬7JùÏöóéè¹§cŸ¶i bû¦ØKYÁò#ÌÙÏÍU›kŒHÏ~À¹¬üëÚ@šÃ5–"F^ˆ2o’Úr …ì­—7bQlïò‰zïÙ¶ÅX>ëãíºÁtZv¿ïÀAXž‰®[ºiïÝ·æ¤æók4 H úp2ÛõB¶D5½ž˜Fé‹otB§h‘4/Ch3_‹(8Ø¡dšv)Ô/(¼¯RöŠNª&€°ïE²`ÞšeB¬Z½ÉËiBæë˜5èr¡¯©á F§Ã¯È´ƒ=5á̺ùùÜ´þš!4¢‚ÊsTl„ÂÅž`PLEÈZ­ó’áhÜo$`è=iÌhš°ßlñÛîV‰Àl ç½Î‡µè™s_ðœÝÚŒ¤t),WÛ7ðá«òÔ¾‚F·J<0FqC×÷èPìÆý||v}»¹éQUg#‘¨¨Œ=01‹|GøK£ ïzºúÉV±¾MvÎOÂ|¬-^TÃÞ†„¹meu]¶*ÃÃÏFë<ßùsn×OS‡ò`=B0a¿Æ!…`Ī Êdµi&l¥xIKjšò46á /˜0Ë»ˆ6©ãJ2òÍØhÎa. °„÷@ž"E¶a-Ò®Á ©= a®§CckX”ÂÓsj]ž\¬ì›hu[x!ò+ƒÚÃ×þ⸆ i!¾5`u%ÑcÙÒ†b—ÙXW±–ú8«õ ŠþèBÃT†n,‚yu{ÇÙtÖ!Âq(]‚Ýì¨Ód*Õª½àÉ´ù…yµê¾R±:„ÞI“Ö6ëβÎ<ûÕIÖ¡l3†ÇÙ§5¼1Öf'ðÑÅ zÕâpÿØ‘oüèp‚nw[â¬RMÙH¦˜¤mÀv%e}ÑXY ï.ÍEZ€û“Ø»#Š. ø3ßi¬ç¼5ló5Å’ï’)¿e8 ÙJ¯0dg&—a¶ÕE¡žX;׫JÓºÿ«Ö¼ËšØÌŽïF|pâ'¸t L Ÿ´‰ÀF%a‰*Á(A7áòg™~òb4h͘ªîä*ŰÜŽª¾7ËFòŠ[ÿçôK©¬Ù»«u€ç4%žM☪ºÈu»Av¯š+}~r_ @Mσ‡åùgrWT¾3G·+sôˆ*÷Tز°¬:_~5èâf–°j8ýö·;މ%¥+T—ý@#~íLZË ºéOÃÂ3á‡Eé½&ß {­8`?gõ Éöwt·¢:÷ñ‚—) Ïè…ï´³WL³o7:†³,ŽßFœ_À]{·(æ,_¤mìäprž­Iæx"¹Úv¥´OóË#Ñx`;qãÛl]c%³œ@е ¾æø,­ädg†ÙÇnív§µšòD’ßóMZBu ×E_q-øa>«a<똵è„Ô e›THP?û„ ŸÅbZû8žôplœf¸v+ú+£LÙ½BRTx*ÃæÚƒÍ.L€ŒBòmV¶˜q €ˆ¤•’‡TÓW7§šS Œ/)s¢ú; KZ¸²êœX£ëh¹\Ói]êð ¾õÙæŽˆL{Œ( õn^¯–®©¯ÔdK>ºµ×f×Ó\À¥|^1=ÄÍÔðÒŒÞ1wþÛ¢ñ¾u 4£÷±o|Ènñ/åH§÷…ÈÞ17˜áØUëBÛ–Þ£æóȧÝiªFadqNQÊÞðnÃ>=‚™·µž¼Î5ձ݂¾<ì:úb‘51|IaÛÆv¿pØòÂ'#/1e ¬EÙhBÞdz Ï{ _/„Ä•„å"Ê •ÆRǰ«rÆÑvçk×ü¡Ê’À£Ó`ÙŠV­É EËCæ¹iÆÞrØ‚÷…KÅË>íj—õ‡’lç{9;7Þ§Z~tÎuR9a6oEÔmÃRª;Ÿ4Þ)¥Dj§XÇ|ŽqÔ`wÑ:A¦jjŽ*¡´{9îaÈaÏÔ¼‹ó¶ˆd õ‚.Á³àG|"J­[aÊÂk–±ö¬¦»ëÛ9,HÜAœf䙺åPJ#ÀÑm[T ¿žŒ^ð3üúûxƒÐ§ßT¸îÈÝŽžòb›Y-,†8PÎ/ £ ,N'16‘Âe¤ü-£? Îòb#Ö¨]g`ˆ¢q1¾¡hËÍGèbZ3®iñG—'}YÕ†Gœµßo,$؇à–`ÃøQiHÀíðËýÚq•ÅÇ þQ8˜Pm•Ö=…ÓÄâÔ/‰º3©‚ÔV±Ñ"°‚¼kŠä¡ç?~1 (Boy¯¶.ˆÈæyuê-Úø‰‡²Uö"ö‚ØiL„ÑD£Ýå2cª†Ô_FM —áJ…u¬fŒùÊ’¡±¿¤ílwv1'°rö¶øe´7»RõççSra§2ôédŽÃîÅÅ×(q^eHǤŒsaQí'FLR[Œ‰ Ý$G7¼‰JÉÍ-aU]›Ã©Wt¨Ü2´gÊ´¢”¹Üh•j‡ßû/GZÍ–U/dÞß}¸~ú‘Èù`βû”9c±“ý˜é|Þ'‘S²‹Ljõ2$p}™Yk==†>°´jfùèF]@²Ñ%Y‰ŸÅÆ)òí&B§Ï¹“á2*Rðµûy{^”<%(æM1#ÀÝ_Ç!ªAG§Œ$ä\µÒô†Ô–ˆéûy~k¹ˆQülUÉñk\Ég¦ÁÚÝäúžÑoD1ÃV ²@„(Ëõ‰«”»÷hj‡Øÿ=D MÁñ\¿(…êaõÔÍì¼ÏýLº/´x~ߨ¡íP-áÿL £þÎ0÷…ašD1¥õkÿÌEõ¸3´å]¨¿‡Õ¨À‰d…D¯ã}Tc•³€Ãó®uä…>â¶&Å›×€MX>°– ŸX.Ì®š³¢ËHìíùÆíÎ[û)Íô¾—9•&eÅ $ iCB"r&{Âk…Ö ý§;pû“'ÒÑ(1û 0¶ž†ã¨nÏ!‚„ã/_à¨u‡8³åGKŸI„K1|~[ÖƃÜ3¡«yAöThÞEEYùŸ›ð˜ðd^;ã%ÞúÔóâ‹úÔă5aBžCÇøå¦ÜLmr.HiÊ­7z¡¡rSI@Äg;Ücä=õe«èéd}h¶¤ˆ5‚ÀŸ‘Ϩ‰´$C2a×ÛNßXŒ#w}ºP8:£©LO`vIú¢BßÚ}M(ÜŠ1‹2-ßÅtƒ£ >x³¦ã3Pg©ÒöœÒݹ¦´oÅa(Ëgð/wW¤¼\Et+u h5lÌì.&–QÓåV5±s‹s@v¢þÄößpâ”ì/QPj»®´9º˜Î N Çpñ"Uâç„<‰ÙýWZRñÔq~áhE0½®Ø¢16Ʋ¬ÄɤÖ¨äK7ï`˜è”Rñ2ª¨gù§ê¢Ý¤!Å8ä2{¨&"&Ç÷ˆF´Ðh_‡ § ½AUÞs'Š•M~×Ö>`óÖÎMñKã?¸±ø÷†¾gÄ€Ó°r½b~Ç:&>¨ ba¬”MŒ‘ˆZûù…£ ãsw¡ÂQ¾“&âFZÞëŠèO‰é×ëJ:3•õ ¸6Ý&e•~ްs¬q',{h—­eŒH=ŒŽ»‡Ì÷"ëfûî Q’éXrûUßôœS[®EÑ¿rÀÅÝS'6ËϦ^}íl3’Kê\¤m‚_ŠÔVÆGÈïš)çík8DíTÌM¦4,»v†ƒ2å!îPFTfÕ3U° endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 793 /Length 3213 /Filter /FlateDecode >> stream xÚíZ[sÛ6~ׯÀc4;ˆ;0“éŒ7nš8ÉÆNënêF¦míÊ’+J©Û_¿ß(’¢$Û²Ó>ul¸œËw ‚eÌ0•1Ë´cyÉDÆ‚cBá Í„GÕ1)<ªL:üføž”Lá'1ß`Ü2åÐ LgŽ8jå™R`«˜ÒÌhL2ÌPË3k1)0—™žbN[æ˜ó* fYæ-øf ¨ä¡ä H1PGfŠƒk@¥LÏ@[å0>Ú9f†ÀFàßfI̳&ƒ¸ÁŒ…Y0Ñ 2Q1‹ñcl†«5=k™ÌPX2Ø@gƒkðPšI eÉX僩!ÄaÜÈŒ9ÂB+”r× z •>ƒiè÷Ä|°¼*ƒR] ”·ðÂhˆRd08ø UÖ ®‡)*€oLK(€¹ h:0fP‡Qè²BÈ(+2xÝÃ"'ƒí‰Là |ÀÎy`àÉ# ATxj à­XÈ`ÜD §C°D›Ó¸†`çz$Ðe*F—GpÀÿ!+¹5˨F1—2@  %íÀ[F5¡º€×28ã, ­nDj ‘ Ð…ã(œ¨ÏS›‚$ İMPK’P m¡b›ú•ò½/?füpz2eü€=+‹á|4 DŸ}÷]ïÙå,¿¹Úß;bÃq^–ýuòÅ—zÆrÎëÉ|6=_ÄÞ{fÈ4ƒí±rt}3.X”ÇfÅͬ(‹É¼8g‹r4¹d;é¡×£Ñ ‹IÁFà4Ëã0;Ïç9»˜ÎØ—Y>š°ù¨,ûõÙñÞá÷qð×~+*•¾G‹ñ|tH*Ý­ŠÜ¹I#Œ·9uÝÃAu•lðÌ#Ó v½›A…Å>c]dì#ã¯Fó3’ñâEŸüqS0þ!¿,züåÌ&ó’{ücQN³aQR®‹=GÅù(ߟ޲Ï:(¸ Ïz`0ÃLZ>DVñn‰<ýå?XªI¹t€e;YŒÇgÛèB¤Ë9ô^Bã²%öû 5ü‰Dq/¡’j d‡ã+`ÃÐW”]² HZÏ¢ªkJlUÝSâIU$ $™ªŽÛÃÒHÕ:‚JžàfÓáq1gŸá‹ƒWŒŸ·sV ßè$“u„,û('!ËÜ豈ÍV´Œ~¬Aºk‘3Ȩ‡EÝ ÝÖ¨k,ÿÛ]ì×yä:4îªb`õµƒÌùû ¥W‰{ùŒÛ¸n ´¶ì‰±•]Œmö8Œ­ØmmZ:wS|ÔzŠ¡kIÝšGj¿‰¡ßÒ8'ÖŒ 2ΩŽq.{|2¬­Øîѧ¦g»†:ýHCxkvÝû£• ÆæjGD’<ŸŠŽ_»':ÿHtOüËŒ[»?zù8ã¼Úɸ¤äÝÓ0±ïñãÅ—ylR§êñwùuã&É?Êç³™5Ȱ™&økêg‰j?šNoh æi+~Ö†‰Œèªôúàî³øŒâY9y•ϰûìñ·y«ñóè|~UÒî6"ýýd8=§¯âЉwIÞ åÏZ ùg-k—óÿè⢀[H±ÏÁò<ØÔ™·5ƒmþ?¿¿ôwöÊ/ÚØª íÒÙ.çÔã°&òœ<,˜eÎ<yôZ#¡“sŠz#òDAZ;ë1ÃJ7 7J-N‘kš_Ia ñ€.)Ÿ& ‰2–!ŸvQR…„ÆÜ6*m›RÆs)ýšVmúÚs¨WÒ B<éÕÆ%ò“‚h3ÒM©H¡0›V…'íLäJ¯¨'•Ò%/ÆÑ,[û9lNµ&›bKFLâj‡Œð™ˆÎˆÝ²UIÓÔÚTÊGucÙ·ÇZêmRlÛO®i‘¸jGª§2õi.‹nOfY²Âú PTä5…è”Mp7vZ„T¶¯úâÜŠ;àà“à™¬ÅºÉëÆÐn­AdVy£Uoy/ö®øT6<*W˜UêD¡Å ‘_rHk4ꩌ’Ïè醥’"ÓàKï•©¦êZyJYqL¥–Åàn”ˆ‘N%µ½w!µ‘Öc6¬<ìrY\ûp*¢ÀÀOÀN/З‘ûœÐ+hëàDàafˆ©ÃTu¯FÉûÎK0õVG:,ö ©šJë]­5Éi£Ñ¶Èhs“‰~‰×”S_\EO½Kûco 2õ„ˆœWÓ¦qmH¾òR3–Šux’^å+iaÕ´ø<¡$.ËŸÃòA¿%ÀR™zœÒØÞ©Ú7NÇe„,ŒÍ‰JÀ«H¥Œ"Og*ΔqÕÀÇ!ÎRK~ifÅ[Òb4ºæMTŠ^Ðg¶n˜àW ^­5-b£•‰/—5ÒÛ’åxœÒ«‚ATskª4¦bÀ)OêÆ:9@GðŒb™ø´K'Bt¿ŒK•ÊÔCÐÓM“„EÔƒ·›ö…Ì"¹ã¦‹P¥’D£¨8húÐÃ<%±8^q³«:l£`Î(¼£„Jf,$›•ƒ,X‰õz»'qÖ…m».±”ý M57õǼ^aãdÌìqn›g¤Qо#’­©GÏ:ÛŸƒ¢ÎF7óé,ícÒæç—oN?üëåÑþ©ç—%ÓíÎs£ØsIE»¡}Ð^9¤­ž  |™ßüPŒ.¯ÐôØÂ{.hðõ<†{“ËqÁ2lÀæÅõOôÑ©ÇO«IHÒi_Cû¥g|ïóïù!Íø1Ïù>äç¼àü’_ñók>áS>ü†ßЖs\\ÌSmFùM1MÏùŒ—|ÎçW³¢àóß§|ÁoûÉ®W#hVÞ3ÝÓþ§?¾˜>Šl3JØ %ºsf÷¡¤„’mƒ¤D¤—ü@½T?¬ù[öŽ¿h'üÿ™ŸVà §ãéåõu ϧãq>ž‘/P½ ÿÿ_ó˜_`Á¾úãæª˜óÿòÿU¸OF€ý!àÿÆ[LçÅù—qê&g”ÅW°+G·¼çåUÇ9_ùïü–ÿÁÿä³éЧÂ.ž:>:|óúCôÔ–xFJñ¼ÿ6Ž2[u]²t¹ ˆQLx¶¢¸ Ø„Q™.xÝŽƒÓýŸÞžF8Ü8T Ü ‘0ux0f FµáȺq{ˆ8Í«E½\Ò“Uæ|±j±ÚÅâ£ý÷ûŸ^Ãâã·''ÛV«¤ÕJç¶UôN¤6Zˆ£©Y-¥\5úyxàjm¯ÕåJý¸²Vók Pæ“sË—Y>ü_1k«ª§e4ܶ‹ßù˜·Ãq~M«:®å´/gE>/fíMá7.Êr·5}3^”­…ÝYÓ««y19‡5Ãé¬höZ ›]ÜúãOoŽ~9‚[O^osª2U R?ee?ºv«¿Ó­‡Ñ™yÞºGÕ(SÊlÅõZTït:Ý?ùtðo2kLëÒF=)¤³oшcDè±¼%ŠWÃ÷aaÛ½ë<=8·Üt:/‘Ë~^ñíõÚ³ÔŠ3éˆQ|‡Û¼þÕYëõ¯Yýþ7èÝ…wžPVeÓ±¦ŽpŠ‚–pÙW» ïÜt»Âåšåº-\4o¾ƒÙ]xç׮ׄÛá®nw¾~·éÊ·]ùJ­ /ùÙîò»i±+}=èÌ6ëåîÒ»Y©#]¬EZq¼Ôô O5ôEª¤OR Êbõ&: Ù¾—õ‰šêXIuÈ¢:P}$OŸÏîà®·q¯>ÐVŸ%«ïté‹Ö]üÄ }Ï®¾Šu¦¼_ÌÇHce…«B•¢Ã}é“Oä'ë‰#¤R:B÷èLi¬UÚ/g}˜_éãTÓ8S†åLiï˜YiòŽ>¥)¹©ÙÈlâÌ ˆåLáWfÒ‘ÇFƒöª­Õ‰ÀTêTÀ›÷é|1Eã³+7T¾ÝÎútà¶é}úºÙ´UŸ7mݧÅ1®ùÛÑõhÞ‘¶¤:ëjûMŸŽ7ÜlŸŽ7m×§ãÄMÛ÷éqÓ}:6Û­ƒ¨ª«ÏRV‹hMŸÖ‘MQ!Ô=¬ê6t¹ØÐœ„Yë<¥ÚÐ>ÒuõnéÔ¥^׿s¤S‰5nŠnGÍ2e-‘–C<-œ®¦ºÚ»ü½)n  bÃ#ïËŸÓË^ÊŸMú]æÆÖ*ˆÆŠ&m\GÓó‚*‹&‘¾¿)&{逪ªŸ¢þ3·») endstream endobj 120 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.16)/Keywords() /CreationDate (D:20171030183725-04'00') /ModDate (D:20171030183725-04'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) kpathsea version 6.2.1) >> endobj 121 0 obj << /Type /XRef /Index [0 122] /Size 122 /W [1 3 1] /Root 119 0 R /Info 120 0 R /ID [ ] /Length 293 /Filter /FlateDecode >> stream xÚÒ93CQ‡ñ÷%;±!v±!ˆ%ö‹Dìû2£¢ÔßC©õa´Z3_€‚>= library("graph") library("cluster") data(ruspini) pm <- pam(ruspini, 4) cG <- new("clusterGraph", clusters = split(names(pm$clustering), pm$clustering)) nodes(cG) @ We now have a graph that we could perform various operations on. For example, we could try a second clustering algorithm on the same data and see if the two largely agree. <>= library(stats) km = kmeans(ruspini, 4) cG.km = new("clusterGraph", clusters=split(as.character(1:75), km$cluster)) inBoth = intersection(cG.km, cG) @ The graph \Robject{inBoth} is of length \Sexpr{length(inBoth)} indicating that there are that many distinct groups. One could, compute various measures of correspondence between the two clustering algorithms using the graph representation. \section*{distGraph} We use this same data to consider some potential uses for the \Rclass{distGraph} class. Others have considered a similar structure for exploring clustering algorithms. %%FIXME: track down the Butte et al and the Shamir references <<>>= d1 = dist(ruspini) dG = new("distGraph", Dist=d1) rl = NULL j=1 for(i in c(40, 30, 10, 5) ){ nG = threshold(dG, i) rl[[j]] = connComp(nG) j=j+1 } @ We can then examine the components of \Robject{rl} to see how the graph is being reduced. <>= sapply(rl, length) @ <>= dr = range(d1) rl.lens = sapply(rl[[4]], length) @ We see that when we remove all distances that are bigger than 5 units (the range of distances was from \Sexpr{round(dr[1], 3)} to \Sexpr{round(dr[2],3)}) there are still only \Sexpr{length(rl[[4]])} connected components - one of which is of size \Sexpr{max(rl.lens)}. \end{document} graph/inst/doc/clusterGraph.pdf0000644000175400017540000025624013175724646017611 0ustar00biocbuildbiocbuild%PDF-1.5 %ÐÔÅØ 5 0 obj << /Length 1952 /Filter /FlateDecode >> stream xÚ½YKÛ6¾çW‹dt­ˆQRÑH€&M/½,Cšƒbk×Û¬-Ã’³Í¿/çA‰ÒxAÑvE‡Ãùf†Ã!ýæêÅË·Æ.T‘j•ÛÅÕõBi“ZS-œ-ÓÊ–‹«Íâcò[»ÔEr¿\™L%WË¢JZhgÉi©’®!zïÛÛ†èë;ßÁÁ¾ñÿÿ€ƒê½oo¨½ñÍ[äl(§îhÿoùéê÷—oUµP*­ò\£Æ&Oui«\§Ú9ÒøϽÚÏË•vIsôužOÊ.©­¡íÿTAb­Z(›ëPìJUšk³XY–eErß{þýÒx´Gîy'\ ´{U.ª´rÚ l±Ò*-3¶å;°GMÑJ[—¬½=|#O@Û"i¨sà͆XzZš0±¹CK!_ó7´Ð‚V q³þ™)Ó }¿Ô¥—ƒs"ÁБ™÷74¹†á›6{Xrê¤Ë•U6ù°å‘»qA•|Õ¬!p¾ÂºÌ~o{j³k´)R  `0jö¯AóïP²7/X”üO¥ „`r€&ä-úd«>23rÔý8“9GНÿgZ96'„·Ñ:LÆx]ƒ¾_ˆÐ^ÓÜÎ7€÷‘® ëžcctÐjOë–©žàç²&í`ëc„ 7J»g7å~•×ÝÄ`¼9î—cÆ*Œ’f7Ìë1:{Æi³! =4N*ýc » b0€Ÿ”ÀÈøF”a«[…ÞGé'Pƒ,°­A‡Ý¡>ŽB' ŠQ¤x-zÝ(„Ö¬zGÑè è)@›Ä9pÄqü°ëŒ²aª1Éà¶Ž5fZ‹kAp—žË,^°Ñi¥Ù뻩zœ·Of’×,hésƒÎã4  "ï% æiÈÝÚ!ñ<4TÏC×ôÝ“¹6dH$ »:2‰xA³Äá)ˆtLg!X‚ÇHñöÄ™“ÂzCC·AVá·ê®¡Ö5ž>˜ê0ØÑ‹•+ÓRO£ãjRƒ«âPóä`W#á:$ìõkúÐ'Jt²à(å“8éhÊ©‘aó›,yò`ÈÕ]¤_p.Œû˜gþ€áûxs ùU€º€¬ÞqçŒ?x-Úßg6X kþU¯ã“ öÔ}HãwÓ}¶ †iuÔf‹@³±7ˆÅè9=ȧ4ÈA¬çÓmbØÀ•µÓDê½|zIòHþÖ÷f‡,[Á¯¼jkûô`ö#–©»<Î¥SO+|‡!$t²t¤i„›ÐÛqè¿|›gQžX›ø¬T©‚lò œ<QÊÏœtjþ~Ã|žCÝu£áP]‹:wt}ŸôÁ¡hnÆÆ¬gWÉ'«lXrÏ_–|Œ$›|8ª•x ÝÍŸ}s5RkyÖ—4Ë>½Ü³ý|¹=[áþùÆz÷€›.Ï-þ#TÅÖ<*°#U^Ñ' ¼‹’k¶lÓ° :0ù‡'”¶» Lø/$->,K‹å_nüvçûâ6Äš>Ó:³kK| ©ÔølàÛk¼EÝñÍÞ3Â3›â{ÍŽ¿.sç+ÒÛpñꈽøëñŽÓÑ$¾l­œÎ’·Aü´ð>TS¥ÜÐQn3÷¸rýPâxM§È¤¢ç`ÄgÆuž,¼ÜR9@õö¹7j÷Q™ÞP»£K’omjª,Iʰ¦gi˜ãÍ9½ò„n(㹼Ǘ§#ÖëáÉÊ ¨oðÜœ+ß³iÜ<¿´î¢š¸‹›Çê¡/cáû*¦PuTs}Õý70Ä’:£ÂÿQ;WWñ/.a™5?KùÁèù ^’œrøkÊž%GÉõ’óh–¥Y榱naÕÃipùÊú|ïOƒœô¤¡#òŽ^¯O “Ánð]cn¥:7(A7As”^<üÂB¢üiñ™˜JÈŸ@xèrp„<»±cUO]ôÚ‡ËmGÔkÛs•7¢:„÷Ê.zឌô¥u–þâcLZj~oÁØñëÕ‹u/*Ø endstream endobj 20 0 obj << /Length 940 /Filter /FlateDecode >> stream xÚ…VKs›0¾çW0=Á¤$ÄëúHf:öâNiˆíŽØuÓNÿ{wW+¶“Úç·/Þ..®n”p„ "•Hgñè¤y $ƒ4΢rîÜj=xÂÝÁºíáQÀÚ®¼ûÅÇ«›ÌɃ<‘ 2†Ž/E…™æúæeÊ­=?’©»–÷(g „Â9q‡¢á› …ïHÃHÙá6sKܶhÆVUã×DC×À%l=žÝ޾·õX 2­oRêA3<¢Ü~nX­]S¶o2•A˜¤à##‚!(€H,Ýâ* D––rƒ6 Ïx¾RÂý‚ü¤°'idĊ܇ÍOÜf·Ê®E rÝÐ×jtüHdŒÇ"ÈãX+C£Hs4ø åèg$ÝaGè w_rX÷=C<#"@YÿÂP#{×3ŠhÈRS’G{“õHÁ×^/GFò´Aê@C‡'¹“ Î7žˈœz{=}±‡õ=ŒCã ÞZ–®5‰ ¨Â9F–ŽÛ™Ž–³ç0ÉÅÈÛªoYoÁ:WL÷ZKyD~Í"Ä9“’™I=Ì6é3|ù ë­çùÁŠ^r˜̶³{k}£Q£m9]*XáäW4?Šù16ÞщvÂýsΚKÏqªÃ4ÇßÔaÏqøÜqW“mÇáõäÀsá6úz–rÇ !»§eÛP²¾–×;>7lÖß²þÿ)5qÁ÷åI|’‘Uÿ=í$Ðs¥¸DÒ£öik‹VïÇ.ÖZ5\4¦"ê#*ÐiǨ{¶šÚÏŽûPt\µÒ¶+A8µ8 í©õQÆ™!2MÛS=Y  ê–µvaIe-–Nëɨ08qk»ë˜¤©°”´;×o|æ4à|å¼þ«ª·œ.Oóf³™’n3ìŒb„ÖäÄfGîŽ[¤ŸU å5¾My‰©ð’Zgj|x9}ާ³Ê!¼1¦Ã¦óaL$<˜‡#ÊM7U@Ulp̪ŒGäNg&‡b°Ô…™=°À^´\šén[ÄFÄZ?·]3Ø,•£3&|¢¼i—|‚¦÷ØÈ-ãËGÒ4Y lvAcóì¡X(E „šÒ•³ZÄ*À¶™'º"åXnÖ -¬= 3§7š‡êpó¤Q2Uz×R…Ò𦷮š-•D×Î~-ÄçR¶úaW‡j/Ñý•¾YÏj_ÿ8 p¿'f†’~¡”¢Ú$;!%ñêâÃââÁ]_Ò endstream endobj 30 0 obj << /Length1 1591 /Length2 8269 /Length3 0 /Length 9300 /Filter /FlateDecode >> stream xÚ´T\. "HƒtÊÐÍÐ%ÝÝÒ 0Ä Cw H)H‰tIwII#- Ò)ßøÞ÷ûþ­{׬53ÏŽçì½Ï³#­–.§´5̬ƒ"8y¸¸E²ê2†<¼nn>.nn^LFF=Âü·“ñî AEÿ! ƒ69â!P¨¸9xø<‚¢ÈqY>üQ:  ­ =tøW®Vpˆ3•Ëâø»Gàoš‡1ËC­eaNN`(Âów}r8Øêaî^À¿.× ó€úül Pk›ßmX»9õ¡7°²Ü_1&Ìl¶`@€››[HPv€=­ì€¿Ðórÿáäùm~èÁÏÇæ °yhì±?ü`ú¸‚ÜÁÜ ìçóoÇ#L€5Ä °ÛB ˜ÿ°?˜Á6â‡û‡C<ÆÜòãpÿþüçŸéƒÂ¬aPG¯Âÿ¸b ¬¾´œ‘û_-ÿÇ)#óøp ð8yx<<|"!n€ßóh ÕÁýO®2Ôù³Ü‡9ý]²û_`ùkAXÿÍ¥{P.ÀòÐM¸¸­¾xþŸåþGÊÿŸÊ³ü_…þ¿)¸9:þágù3àÿã9A½þŠxP®âa Ôa»ýßPðŸ«+s´þ_Ÿ2ô° ÒP[ÇÿŒâªñ[kAVvÊåO»þïEs„@ÁZ0WÈï§ÀÉÃÍý?¾‡í²rxx>\4ù‡ ü°<ÿ}¤<Ô fý{Ëx 8ä…Éý %^€ÏÃ:Zƒ=ÿP1È…!RÍùl`pÌß7*Ä*þ6ý‰ø@åÿ !ô­þƒ~× ´þ|àÿ ò€vÿ‚ ä_Ptüòtàöü¯¡Y¹ÁáODz~˜èßøw ö[aÎM잇Ú m¹¬”¦ôàÜÿʸaÊÊé3ou»Æ}’ÄZñ.ø;ü\:i  aMžåLjžæÎg¯±æIDÓ[íæß[óñfÌÙ1’ÞÑ{ÒÕ=ÔTœzR›¾w.¾/‚P‘ÛU³]Ü„qµr /=>+zV÷ ŸÞÐÞ¬Tź-žàŒÑmT0ɘc™9EF‡†à¤Fg#8òÄ›<;ÿJ5zO£’ÀŽé÷#†/ßÇh™7öjÊ{±T×µƒœÜˆŒåŒ`hœÉGf;Y…tƧðcœJxôGj³éz‰V< mûœXñàèÊ ÙŽyl1ÞÚxxœ•ö*£ÌÀŽ£nVAvµPÁÄy¦«vÛÖ‰wtÙä;xˆd¯b_‹7"­ûã³Ð3I´¶íˆíäÁYòÜÞÿ æš7÷R ³¼–9ãN'Î~Û#¡ËŸ~££ŠPô÷Ƨz/÷%ôƨèA_xìh³ž£Yì¿7èï-'¸w@¦,Фj?Tõ]¥Ý÷¾[ãýžUˆä¼™Øæ•ö£å½ ·ÐYëbcðxlº½¨J'ôñ êM=¯nn¥qâ^O¦Œ%äP©:r0,ô“PE!ô!92—™¢!Âö´àB‹Zt¤f¼hâÖŽu…Œõßqåⱃ0%3Wêxå%£`z9¹CžÌ>ƒ·y‘\Cc'í*\$‚3å“Ôb©zäê?èj%Bád,ä¥Á}ÄWCè3$êì;ÏírjÙSõyTÜÿ\ü­aˆ_ï[5Y1Ðà’Így1ar¨±¹I•ÝÚÕÀ÷uRZòØÑßµ³H=\«þ¢«-ÖËF׫peºÝrùép·…ˆµslï¹Öj|¥†|šUMÜÍ®(v*x¢_nd.§©Sk2Ú¬À¬¾µ£cs³pÄ[ŸmøÛ3¾Ò-ÿó5¥|Òï mÑGSOšip§W†¹lj­<›ŠIòÜÉRŠ)XÒƒ ČĢgÓT¿M¦W#e÷¾}ªØšÃÌÚYú6Jt¦‚hÀ*™D§(GHùÅTÐêôF¶Á}c†Ž)Ní;‘ϨFFÔN¾V¤°Ðˆªø `e§p ¤phZâîÆ>öy69· ùvüñìô㤖 ÍÏ÷þèó‹Ãû±exÈ(Ï‘CY¾0ÏoÒ¥tÚT…àÜó­ RBäRûîÈ …‘C¾\ëô²˜à†6æ>þ<7Ñž~Ëà|Dø–vŒŽzáD¤úµ@\ÈèØ¯èÝB¼)ûž78ŒìÅã´/hNµœmlß×:–ù?1Ì%¾3â¬Hî,O›4˜WMv®­À>Èm¨Ëñ×s»È?šÖÜ«æ!N(¥½ ¢òe0 ñÙB}½³0ÑÞó„C¼‰}°ø…©Õ&__å yŸ°C–ÝsÔ}4Çfâ-i(züwPúFmpý¹FGÎd»èQNqÃp–µèÄŠx:ÍþNöFwÝbH^®w"šG¶^ý¡ÿz¹¬mØù—U6ÁŒºFár$!­ˆ¹„Ön…ºÂ‡¢ó2 ÔÙÍT¤ºÔ'èüo[¨…½ÁôÑÙUÈöQ¯Èž’c‹Ip(ù—›•ô#ëKTø?%Xòg},Bš¬˜ÅIdÊ>:–Â{Ùï”Ù¼ÉäA‚W%ý8í‘0*9Z’^Õ2BvÚŽG£wËiާ¾l¢LH¼ùè.n'ßanÈÒë®q™ú„E„¢`‹ÔZ`Z,wÉ¿µY€6îÛP6­Rþ™ÊylI[=¾É줩aYSò³šòŒÛ9G¶†É!JÑ—TµœTÎBçI jM75}³Fïûdý«ûÏ®ÎJ£š­Óx> ‹ƒ®¶´D}˜­ ~19¸Ú#ìGODø^øÚ’´c§÷ËkëVq„hŸÓ,Kꑼˆ¼#븣"»ˆäøOÑqŸ%<5ö‹r—œ×â\Q>f6*ªÎiæÛIœd}…Åœ~ÝË.̤è@šWy~¤Ânâ„9BC¥B~#Hö¥Ëœ0vÚ)H„M`!7ÑiÜzضôð‘Æ³_*w÷ËÂÓB’ÍÿŽ>Áåë*=“òÃFµ—ý´Œ‡6¨,¦à­.ôêCÏš?}L€ùS¶pSê÷µ&#Zâ+•aÈ»/.ƒ©N*Õj€Mkö+/6Ý+d\¿óHˆâ AP=2é ƒÓ§pw1|o#mJ3µ©-n]—ôsÚolBnjš-#â–Ãþ·æ‹*w²ÁÊ’b?óQ±ô°½] jöýÜÔ,’Õg‹Ûè„Þ«¶}ÅB9¸Øj>^_öÒDûÇðÍv·`}ÖÅ%NEÅ—3·™¤ÊDN”·‘Öàà ø”ž<±èÚ)GÚ¼üUç>òm~—N]àUÕ“Þ !ŒA·^r&ê5OuE”f´cZ¦2á6§Šf·&IôksîÄÆa/GkX‰·HT×uóͨjü¡ieê†7ÂLyB œ^k†_)‹IXf AЬ×h{@ûg²ô“RþmUÖ9ña¤0¹k‰fxwÞ(Ãy.‰Ê Æ“Òz£voç[zNïŒJ'Ø®ƒ«F£e8øÝÛ÷c–Q¸ÕÄ…ß}Ð>+#©Ú¬ª&/ÞbyÐê2€Ec²F?¾‚³|ß Èz}솭SÒèõZÏÁ‘D¢‰yù“ÒþWì%‘ñ`ÎDÖ«ö·*Ì7v"Çë³uþÚï"+5׈·$—z*hÆ¢¨¥î#·a›¯% "5.£Õ‰Ùšp*5P!‡j6'6 “ÀI¬<¤¡DþÈ9h˜6{gUfazælÒJšZº”¨LƒóØÛÞ#Q¿.L&™BʘQðè? 0ÇšÔuh ?sîGŽ™©û¯ì׊…਽eæD¡ìÁµ"~Z½pÁ§è—¯‡L¾Åœ>Ÿí ï7“x7‘=͙͜Ñð8p)pAá²ÍC]S/¾BÎU%uP›²©æº3Äç ÆMP«ÞR[ý)où ò„r ×ï±7ÇxmŒ2!óv¯¿1PÍp¬œHdmFPœÀvTSæé”2G+p'ñ² %¼#2ø…úÃBÌ*U,u‡ÍÔ}ãÇeVÿ¼ÏÏoΓ…rBeâƒ0Î-ÆÀ¨Íeh2•ŠL•tù^Pš{§Ë®ƒHGA¤2KoÛ'ž%—)õˆá{X|€èà©];ÅÅýYœú½}ÇÖ“Â,ìYÊŒñ H_„ÞÏ¿R\íw¯F“´Ð]ÞU;ëôÕ à]¬Šd” ½Î\{ya íO©+;í[z»‡Nôu¹me:Dx—ẞŒ>&N0å@EýÓfÉ&4'9îuÖ V9AQp ¶–¥|­HÁÙ(ƒFsè¼Xî]áý+:{CÔfCW”;u8Åì®|EÍÌ)µ[ºmÚl6dì´ÈúÒ‘ £_asHòt¬y %ÿ¤§l¿ÑžD‰¿Z£ï'¼¹ÃHpË'¶Ìm¾ý®Ø^½@PÒº0)2±°\Y›b8‡‹·±KÆ?R\ˆÄŠeÀeôñw÷æ„ʹ²ŠÖÈdêÖt”iÕù" :²´„kLÔžOyl7 öJ]R’ēüæñ´„ÇT´,*–§¯+€PštÝ¥&ò ;u[^ôwÖé÷ºÃñ]¿|÷Ï0A_E^~5e‰=œÇÝ8ñ6}'\Xð ËÞXSÌš~.õI´7DZôºÇ´)¼=צØ4ñ"ʦùTåiKÎBÛ^þ2²˜EãA,§äÁ™ésΓ=4E?]†g _ì‹öLƒó¡Gþ]EŠW’Ânjè’sw ï3¢Æ·Ÿý”Ù–jHedG%¼$Ó5ÍQ[øSnEW“ª,å·²_˜†òÔM¼8º²ä¡‹P…)p[[ƃ(š~ße-Ùð+š •:¼añÙê]ÀDO«ýµdÊ V©Ÿµ¤H´ š’$®Êº²¸pe'É ˆºî5¯uÍxß«û‰4s›š„(ô‚ Wý‚ÿjd¬9Và#¿µÅÏÏÊ_ŠfÊU÷›ýVØÏ—%çÐogc’w³–øþóù¤QšÒ¼í ’¦`>žfåp¦‘1}IµÈ½vŸ!žbåMOú–öf~GðjÜç×!úmÉÖjy‰‚û™þj¬ö@ÇLFOTcÛšIüý0{Aÿ|Y¬Iâº7oÌe?zá5-0Rý¢ac„ÖL)¼Ó"©ã§y• MnùŸ¹´îÍÓ@”sÂ>fÉêe°y†÷˜Þo%³žÒ@²‘üFÉ/&M6"ƒ^|EJ˜×¼yX~ÖÂj‹ùÕˆyÌÈùHE¿7ÛØ¦RÏPhÈEfA„®ÿøDžС°z.ÿè.†÷¶ˆèÚPõŠý/'¸ûY†Öi,=ŽÄ›ltË@Ïãæ5ó‹æƒjÝ Ÿ³°¼J‹߆TžŽ àëH}lö´eú•Xé@ïŸ9÷Ÿ]ƒWïÐV ð7ßeÇŸ5¿¶ÑʃÕï¶«e7cæHÅ=4~3ð±›8FާïÙoUëúMüÚW‰ðÆw šª[Z™¶'Å(\ªö÷ÎPóq‘6AÒ™°c`õÖÐUQ[ô¢²7{ÿ9±ï u-r|/Õ3Ö ½1ÿ1U#iâk-nÔ¸`4- ‘U¦îü%÷ÎU³{:ôÔ6ÖÖC-Jq;‰`þì§"ÆÔÕiw4ž[wÉ­@~Áj¡ ¥ó’=Ú_'µ§wö¹«šüÔ…­Dsm–‹÷c9 Ç^Ç›Õg?™}N<´Ù¢TÞäº4`²7®Ha®9A9¾Û«Cåm”±° u©+ô—ռĭîJ¿Ô#-Ì»ÏTÅ¥4ýüA†¶¸‡TC2P…8êp‹yFšëÜ¡ÃGL«¿+Erƒh™»Æh¥S¾m¡}̲vœž#BD$E³ çf®—¹›ÎS‡MÃtÀ† þ aÆTà¦ì{vÊ~?Í]TK‡%Š…oMªû䨬¤K°\ßãL“N~æ&€zìèxO\!®[¬—&oܘ.Ì“›ééÚVÚ™‘OpL÷é W(ö¾ð`sFMç°9ˆÑÖÇ¿9 Þrm[Õ`²dO?Û;üù<7ú‹Ffxî9‡2` |ÁØzä(Qw»U¶bµ–ÞÊt”É÷'Bñ»àÜÌÆjÓ@}g@Lh`Õ #Ü ‹$}-Ðõ‚Ã:Ù„áùÇR•žN#‘ºp§Ü€†1µ,×—>‘r5ôüX—!r> "ûçõ Ð||ë/YÌÃêòØÉÌÎo7°A_Ÿ/˜Ë>%Eæ™¶ÆÅ½ýr ’—Ç]à§kÿ(f¼;Pê‡*(Ä8Û”¶èäU®sˆd.+ð@±’I"8÷í{þr5«¼Ý±CÁg¶˜ƒøüÝf¾&!3‡DˆãUž‘‹‹T¥I$‘ltå® ù¼ï±>ùö'cÞ¾"ŸË†¡MŸSójª¨q;f¶w°œ¥.È—®…Å¿cªQ¥åâFì°–æÇãÛMMž%¡Å:ŽCÓÕ=6 ÅÞaùà´_æ4-yñÒ7õk\Ê™áWºªÌŸt€ÿôWE’Íw:ü™î^YaÉÑeœîY´Òÿ2Lª>uN¥FZßÁ|MÃ7(j‘/-$çoÈn¾™Ú¦C¯¸.ýâ3Â4Jnɧ­†cš;p•-Èí;ê7ïSËuÒÊàÔJʽøËñýŸ4¢*³êOÆÉmÑ‘Žû)ô ™ì†_ ÆÏj¶m\/OŒðV™Í“]Æ#ãz+Vìß Ù#%ww^6­æº÷ts7\¶ç2‚Š[˜wý{2IÏnû­ âk‰Îb åýªÞ퇅m‚ šÍ·³µ‹ïÐ °ÂР7 bÕñ|“i·F(¿W5I–´ÑÌRöý„ê°ú{êó}ïwlV¯È£=R]lñûøÇα§òR"Æú$9s7p·ù¾¯¨6éNp2zŠ•NÌ:“YÔ³ÌN7ÃS²lC$“©»ý£™vð¿ä C×[$Nm¸—&Ãìiz‰§^þh£á )ÎÞ…Az$û¬ªôýìl|þ}faÈ×1©Xeá¼Ó9>œ8dØ)vû+äg²¡zÕ«Š> …ùåÙmó*/•ü§=ynU×8È·7Û[ÍýL g‘NõŒðx…§yÊ òö"Js“óç>9Q’áØÈéá|•Û‹ëÚ:j_ýÚ¨ÄÈ&܉pÁY.á4> +|AYêºÔàŸœÉ(s ^4:Œri0vÃÓdÀŽÈzÇç£â¬Ž_Y€å6ßc’¬Cy?xÚz“˜ËëÞÒ·KMM§ðY4$‚2x#¡¶$GŸ0@ £lsÕÄÔ|7Ko–Vj^Ü×gYr9Å+oæ@ ýNMëÏ·¦žIA×úóqÊ¢×ðsÇÕн.§’)CÅéáÒͧZ(ßYÜž H3DmrQúd ¹5¢‡dæE/ë›·ôÏQ±ÎÛ»]öÚ+gðûŸÚ3„“vKÜ2¿YßHsƒU´qwQØÇ©kháKÎ*^®™™“þ;œO¨rS·þü‹ê ‚@ïMϲ‘g¨G¶.ÕSJ¢œB³}ŒWãÚ6•tÙúRäó©0”Wç¨Dý’*KÈ6§êVºƒhIŠE Ææœ/±bÜï ¡â.¢ „ÁÓ¡ƒoÖ¾<þ<ž –w}¼ý‹0X€ µœBƒAq…šQfÙ>€@Ÿ\i¯wd׌©ÃžI iRò••—jf–w„®/%\$#ó ¦Ç€å¬`윓pþÖ÷êÀô-Öœ僢6*À4Ø~^éã§Ȧ°Ä»åO>âê)‹.¡®“3ÈA äª ‰õÛÝn˜‰j•ªmÖóŸœçÑ`V=Á`WÃP÷mÐmÀ5ðÅ Z¾äLò 6›Ý\PËÎIpei$ÈÀù,>B8–Ôo€cVM³”¨.XŽ“U‘Tç›ýl5û´PàU0¶Î-{Žj‘#NÀ\KèáÖsÝW&„è† ª«ïš•l#$ŠÚ&„xú„ ÌO0hSœƒŸÑFÎxƓݒà ÙË„¤éÖ½2>¢ZUÚóXbA5íÊÛ~§ä„sTÏK¢¬(á[O,|H²ñÌ{L©W—óðrÃP7/%Áê$Ä7SE$¨@?o®ÞTÞ¹í¾–›9+W›E«qx*3ºêà¬H?òQ.yhжÄö3ÛçO–ÞÕKt´Ý«-^R Ù•,ytÏÖ·CpE,ŸÍ*1ÿfEs)d‡½Òqüiûª.03ÊG|-Ž)r¿ÂÖ—Ü+=ë´;ö#Á~U/ ˆž*³yp )htÅЊÿÈ6[Q;z‰6*]µ¼P‡jÖ "ÙÃý¸êAzgß”Øbë´å8'ÂåT<^-ÎåÜ}¾tfýí†ËÈôvIþˆh«ödÖ25®‘Þkª\h•’Ì07HÓýá ªá5[KGÊÜS è–Nk“®»‘ûT‘«êÕ2Ÿ’=n0 %\0òâW"6öœ[b²Þ{–þÇô¥w×RÙ´ÜÈô&ÛFÐȯfhچܓ,nÅûØ6¢sÛ™}zÚÝ[‡n6ôlP픣ÁÏ¡uñ»Úe¤¤Û"N·ž¬hw-b£ êZT?·ì¦?s`Ç$ßéþ >ØsÉ’{°õŒVu”7ÿ)[ü M´œAH#ÛÚ_œÊ)~ÿx{!Þί?¥NÐ/6T“èÌ/) 9âX‘šjÅIrX½¸XD  ‹SŒœ›Š?t/L”XøD±úÒhCg–et ûêâÀ‹í‹ÌѲÏûZ‹f]FDˆÙZëF‰#fLoÓûpòhw°ÓW®w HS†”•ú¼Ôà©Aàñ•OOVÈ&9J0ˆ•üÓg±,rL ݆rÍ ƒ®'Ÿ)ó”*ï+;%)µšÓ+„ïwE·¨kÚMã¥Ó'Á©wiµò/¨ÿGÇf endstream endobj 32 0 obj << /Length1 2067 /Length2 16813 /Length3 0 /Length 18069 /Filter /FlateDecode >> stream xÚŒ¶p¤k×.'“ÌÄž cÛ¶m;LlÛ¶Llcb{bMlŸl|ïÞï÷ÿUçTWu?×Ò½®…»y%cC ¨µ# -='@HF‘@OÏDKOÏKB¢lîh ü[ K¢ ´w0·±æü—=ÐÀñC&làøa'cc t²00X9Ø8ééŒôôÿchcÏ 6p67ÈÐ$m¬°$B6¶nöæ¦fŽÇüÏ#€ÜˆÀÀÁÁFý§;@À hond` 1p4Z}œhd` P²12:ºýWrn3GG[N::Z+Z{S^ j€‹¹£@è´wþ 5°þÅŒ– lfîð—\ÉÆÄÑÅÀøXš­><œ¬ö€ÃJÒ9[ õ_ÆÒPþ® €–á?áþöþ#¹õŸÎFF6V¶ÖnæÖ¦sK @NTšÖÑÕ‘``mü‡¡¥ƒÍ‡¿³¹¥á‡ÁŸ™Dÿ¦ç`donëè@ë`nùEº?Â|TYÄÚXÈÆÊ híèûG~Âæö@£²»ÑýÕY kk¿‰¹µ±É$ŒléT¬Í휀›|ˆ`ÿ‘™,ôôôlL èjdF÷Gxe7[àŸJ†?Ä ¼†ÖÉñcdl>ÖÀú›ªÿZZ ±¹“ÕÿÖJ8|,‚€µ©åÊhî jî 4–7w42ûkZþ’«ü±e–æÖ@yó?®ÍGkþ—îcµŒ,>®‡‘üSüØœÿ>RÄÚÈÆøcdaØÛ¸Á~4ù±<>vÑèúçèh­m?\ô¼&6ö°t”•@'ð‡èOÄF ý1èÄþAL:‰€Nî?ˆ@§übЩýq| ƒ;€ÎðôÅè?ˆù#ÊÇaõõ¡3þüÈø/È 3ù~(MþÿPšÿ²0ýÿñfùCoãdÿ¯p&¦ÿ‚é˜ý“ÜG¡ÌÜlÍ>nÃ,>dæÿ‚¬ºoÿ‚Ä-þ?˜[þ ~P·úWîDÿ‰ÌòájýÑÿé?ÈÙü“̇³Í©?ÈØþ£þfûq­[[Mÿ‘2ü-ýk%ÿ#þÈÚöcmþUg†êÿ* ÃO‡’ûP:|\Nÿ¨?"üïcÇéÍìÿªôG:Ž.6ÿrø çô/øQçÁr.ÿjã‡÷¿cüïö/øAÜýOø_kaädÿAÔñÏ‹ëcgþÿù7º`—lŒ¸¿Õ¶?Ô|u¡ÙŸä™%ÙWK¥ ñX¶ïpz‚‡N¢¨Îôß´¿HéE\Û!¿å_Áõ8im€iKPøñìù¢§8½ÿvi }ðç÷úÜO84Êü¿<_íMê!x˜,‰±èQR¸6¸äÚÊ]ˆŸó…:e‘ö1£Ú\1º¹¯Öy|¹“a/7 Höue/¡¶´UÏžP­ú‡^Šc-“÷°ÓDp½ýNµÇä[ Î ÇLý;`ىoKÇsƒÝúÈè Í}pJÛÃHóèn—Z1ߎ© ¥ˆ™VøÚ*gn d™ãX·P‘zÅ9‰ýÒ ˆÛÃÿRð ›aç;=½&;dè8ÎK®çe´Weã…lçÖÒ¢¥ ²NÀ{«ì»aWÊÅÅw,3&ýÌ`ò¼ ‘ž°¼2®:`ã\@ÝÅV%:­p©¾tüËÒåq!³„XßþbÕH¸¶¿Û·GŽÚ3ÕJ•±, {¿#h&ý†‚ú9îŒwîÊËuÑŽlT/*]BG¢·•ÙóÂ:}sºäÒÄ"ÀŠîwçû>* :X5Ç ¨)ó<íNt½¸P—I“.Ë Hq‡x.ë, öaÕøò£‡Ý6û2ÖuÈ=ƒ|ÎD\&Éüµ N¤×1Ò¬zù†-øUIù!ŸÈ} ¤oqfb—`lz—ØÃ²R»˜¹¿ÀÅ™nGJ°¸ë›~½ÉCþfÞ²¡â"а‚S›17Üü=<!HÝÁDÊ;ù[ð½”,sCº õ}!!ûÛŽ{ÿ~L O•ƒvÝê-wP9v·(ñ¦0_¨Êñ§©_/¬I93®by ÖCå_ÓñöÌ«I³ §a¥A0jµ²Ó‘nv }("M‚ÔýaŒ‘"`@v¹çÉP‡ëb’/Qä™Dòi8k‘ȶަà%ªi!—ûë„$'A$Ë@Hû<Ø bYka‰üT§ú¦ºOæÄç¿&\GЕŽÂ‹.šºв$Ƹ\*…{V¿ûÙ(pOL¦ÀÁMë{7qgá1Зz¤½sÿ8²:oh~\ÊÜ1»ØÈ ܬ<ò…il¬©ÉàÁÒç»fK>A‡ÓÏ…ÔJê¼fw•çff˜Ç½æqüù ²‚ð…‹5­µÅË^ʉáˆé9]EÒ<½Aܱ²nzÖëÎ oáÍÛD{ÓîÜW»­í³³3V†Þ½D[~Íy}õ Úà/£lúMÜò+ÉG™ úŠñgÖMÌÄí‡>˜}ŽÝH:!Ï=xb–òŒ†íšæñE5†Ø¨”‡A¨¦ Xv,®Û*9|¸Yp£ý¬jJ«„<1±åóÑSE MÆ–V7æÉpb$âaKj|‘”‘Ä4ѰÚ=ä^r+ÚÉÆ[¦‚±Ó}Ã)>-7dŽ•2ýeÑ—Þ/åÓï]“%›|ýR‰èF˜c?ï·µ/Ls+IùJw£öß<[C)Ÿ¸t$üj'Î5–ÕjÉø>¹"w·ð“¿PÑÿÝŽ@Úx¦j÷«Í‰÷ƒ*]ä° íÍÓ)}|Fžû#ñéãÔý/Ie×ôšËöÆ6£ŽMYß& Jï•OÂl Áé0OÐêL ƒ³‘f)Ù¦tØõÞ¿{e€+ú¥$SÚšEéÊ…´”æd¶¦:[Ìý¡„ã“g˜,~|üµ]âÅLö©aÁcOŸÊ.íl4o…iÞXÔM:L(óûتŸ¿Ym>¸ó{¥Õš! ýr*$å“~ú t^ÂfÉm_–e‰¼c'žª…’ 4Ý/î2ô3”2¡l‚Íû,K®*±n8r¢¶%uHkQ¨xB˜T@vÅ%›x¤ž~e ò==µ 0C7)O8=”…Ù5¤Í7œ¸Ž/n{2‡ï¬¾å¹µº÷ŽÙø0ür 'ytY ¢—ø‰MLnxDi»F22‹Sbš¯ëZàVïmî?#E} >![–=–öJòV!–TcÔq¼T)b!Ö”†Wͱ¨óÎý6ŠÏ‘Ñ[Ð ;~ˆF —uÈgÑvHCLûº>@aêiMª«†"a ]ß(äVQ–¿uÈ}„ŽRÇÛ¾­`Øû˜%<µ$8¡_ÆFêSYz`ÃÜîbõøM0X™°Å7å œ§Ý±T&Ðôjr&P5Ëð(Ëö†¢«cd¨† m}ƒ¹<ÖËÆ?ùU*0¡ªªr-åµO„ÎÂA®’£•ËÞ2§ngg/_À øÝdšÃ£Í³ÅO(ºõ$%ú œgøœשêmIniZÕ“µb8SµNÐrX6ŸcÐ_cw¢½v¢:Û]&|ºæåº öqi˜&µùQ½™ë >LŸêà´0Œ…¬Æ êúólî0e`úfÕèªêvÛ¸‚4E¨Cäî™Rlë|Õó% 78.íni „Ö^#ŒͺEC¨Rˆá©ß±Ì˜Ÿè¾„dÊB6d.Bª4w–« ûx.ÁÒOô‰ n)Rö:¼”kk»Ðø­¢÷ù4¾ñe“²=œ{°(/iw%¥ Ü¡»ˆƒ»Q,拈~êQ¾ÙVÇH? šB¤h¡|GÿÎ4R€qYlá4Sû½<Ç"ÇoÍ(ŽP2ýÝJ¼/¿íWÔ9e ;ÌÞ%6ãóC™|ÎÔÅU["edvA.µt‡ûE<ǨvŽRç²4ø[ŽÃð½`ŸP®(etB­RYg®Hß­,R¡öSèH¢¶BRïWQʲ5seô˨C]YÀ±^Œ~À÷`%åzÙ6)¶˜j*Å´…ßZö…/÷(§v@¯öÚ%œÏ…÷K!òO7°“¢ *"ù¿¯ß"/f¥ºçÄ#ÉêyA5ø'$–·I öÞ“3»µJ(ØúI;_rÍ&­³>×biÍ­ô6)÷]’©ÛûÌm¦ÑYëY'KJç¡ÃÁ'óÃÖäŽM¥ÃV6ÊâzH‰6n®^èZdnôZ{£ŸêKWèÀ¬|WÉmðx EvÞ9—Þ\kû•ÏœpÃJìƒbo%ð~æ„Ú;x}e­¹ N™öƒ§ô~ÔáöÂ&Õß#Îm†@H?ÂÆVÍG³é÷9Þ/z k¸-CÛ SùTcbšií»êɹ RinÛ.äK”Ïž­Þ ì‡O´#ýÉMT&“Cîn%ÎøÛzu‚îU£!9Á7Œ|Îsí0P`Ç×í·‹!}ê ìXóß­`“WC0M]–  aaØöE?ið»)éx_倥U>ZÚ.U$|ÂOÎr& ³ÝÁMY…WtQ\ÐJXdŸu[o9÷!$k¿ñ£º–׈ӋrM¶¡­*ØE—%Z(“µ^d#resÇÚ}µ^Úsòs´”bHPï°L`§ÀÚÅ-öÛÍúñíEL¹3)QuãÈ3ôyãGÀ”'à˜Ê%“eVF“,É/g‰aðÚ€# ûtV¶²,Rl j¯ÀpOоե ƒpñäÊ-ÍÖÙjf§(¯®þƒ¾›(TÀ4ÁX²FÒïcG‚9P ˜9ý’Ù,)’C£B‘ê–ßxÏ<‚Ëã:_}• îD׳mHfðãZ ÁÒfe4ûþÞJöon,y ±Òù).<ˆ(ˆÒi ôˆ ~ßøõÍirl؇Ì8^¸¬¾€æaño!ùˆ»höhþ®kɰ¿h{yW¦ª«ó~Z¤T­Xös‘&Wq¬¤×\c)L¦÷DÝ3ô›‡šùòw%Œ@ø•ÄI“¹ß!ÛãÏ €ÎÖ ì(~Y¢þ8Ú»ªµeLוnní»œ—³T¨ÙF®Éþ†?eÞ¶éL¼˜6“3NÆŠ†v ÅJ“‘*ÈLd¦¡çðÕÕT^½^î›[4ú£tá|çI¾M ˆwžGȉ¿ÃŒLDãë=6Ep†ÔM^ùÄíH¶8çÁ×ùé¬Á/C—!¬’ ™ñù±¤q*a¾âþ8«é¹äO¨ÄÌú”nPÑàKƒš&àc|di£Ú C~eÒ\L´ª¿8e­áñmUŸÉÓÌ·J¿LÂ2÷Õg«–`¿á%ïvV¾wô·Gb>”Huê9Ϥ­Á¡.œß’Ù‰œ¸~VóYÆ®íÃÓçJv'·5bû«äõë$'X/#»>*–7o‚×uù¬§¯Ý¿áU¨+A;s)~™sŠ_åvÊõ¯’WéåüŽpEU;ß즠Ðy+œ·úiÄ8C·/ûݲƒ2Ä5µIbTN—ºAð¾L¹ïêbn F¹‘øÊ*ï´41ñ`V©Ÿlñµ[¡JÆ? ÓÌ2Þãšï.Šó¯Åú™ü xµhQ¤=ɸ}u&ó²¢E&›PÚíþ1¾léö‚É–€žÿYãvA¨¾rÀê¨Q·©Z̉EO,ú¡q™¡èÁ‘.rîm+j|çv‹9¬–¡Ò:TïY˜×ËŠê—I™)‡1îSɨÿ¹Ì£þ’îL«˜ÔK9Ôw—¡“{övç%L&þ›HæN¾½ë{}WÓç¿g5ìp…oï8c¢VŒñ  Á× ŽHŸOhÊb©Q)vÚ Ê¾´™íüäК+vz‡Q:ÀäŠÇ DêW–*5P'Þs1Ih’ ÐÚsøj7Pà!AžüÞþ ‘Eº¸L¢Û¨ÑËÓ ¯›8Î]xEågo¬Ë(ªŽ× MÎÉóƒþŸß2º®-}–Ý_‡@õøÁ°=!*~ã£-¬…6¤ê®°~=£Ëv›~Ö7¸ÈC.þ®U=ލ?Ó9.’]Ðë‚ÝùÛïëç<÷_æWÒÈ^ßFkFøŸ Â÷½|\~«5AB§í[‡8D§Ò[SÂ{ÀW[òi–º_G$"Gð¶°ŸâÛÒHO“<ƒŸKéóôJHzõ“óÏÖ»FÊøÚœÇ~ êj¿„QÆ£-¼*Œn—ÈšQ­¶wnfÛ~ŠZ.VùÔî>}mzl:a°ëÔ š;ÆÝ‡¢þä¶ÞRV1öDÙ6lz÷Î̧ΨÓË\"ž>‘Ÿ±x•®Û3e' ´©ËLU9½öþ|_?ÅÆû›bðûuš¸ul6X[I¥ᑇp°"7£ã«ÌÀÐÍ£Ã~‘ﳇ„úM¼IAiæ4øÎûÏ×g*”å"u‘ßÅɈôÇÛÝS}„”’«JlðÝ+xÕ08‡çßV¿à’Î, J~¦*ÿÚÕúy™ç6Y6oŸ˜Õ¹N [Y)Œh³J:åy²øì€/ä'ÙÝïû¾GQ cU1éjªt´ ±·ï[ºt-¥v }#w f‘šxîÂ¥ŽüŸ™îÈé9‡2Kü¼ß(¸ÕÌô÷dÚCyßóGÞ½·[§ªÂ’óž)mmê^ÓÅBöáÃÊÃÇp&˜¯`©ñ‰ò^\ᄳíRw³D“qʹÍð¢÷OÚد÷ºs à¸Øàp\iŸº=ÂÚýþ_ÄæXß^§Rɲ˜† ¹\‰Z¢ñ™®ñ•Æ9˾"®’´8JÆAÓñ޿ɽŸeâÚ«nøõb¹êÔ´BµóRìœçô4êøZf=‚³Øt"jäM‰r!RË’–¡˜—†k×Ê*ôH\‰ÏMÜLáwó)sžò/‰žcȾÃA+©÷¬Ó×rWPü0ÛR[€òë`6in6‹Y¥]ªW£ÐU‚œ¦Á ²vñz¥† Õ”mA›½©¾‡Ó€‹R„6º÷ÎÝ]0µÏhÃ6-9ž¾½il³èÇ`ˆzëe¸öD€«d{F©Ç7…Šñ#¨, ²JÀi㧬Ýñ¾pލê=ƒðÎqPJÐ{¡Ï6jz,¡Áœ3©¬¸^Ž8í‰fš€/º•ß,¥‰ eGðQ)Ì|r¡¨º0E C³›ãÜ2þFTØZ½†jm7W˜Ùî`󅦕?V \Œ-f—°ÒSa*ìWÙÓ>@óÊÝÁ3Èß« _z¾A %¼ÓפlÞª½¸W€éj_ßÓ5,U€Z%¯£$Dº@U<R …G&ìé¢ÊØWöi¸r“bاp K}Õ§ õó‚¥ùeu׳¼B Ï”bƦœð“¢ÁZ\W+TÚ—˜¨(# èGï_{¨Ÿš9g\š—gëÁ¨Æ;ÕØS¡©A‘‰[ÔI ÛÉ!Fѹd$áVhýµãý ÜLwo÷hüwOÁÑʇq‘­Ët .ˆù“ù1¾ ‡}Â„Š‡µû˜«’Î5¼Þî)º_X£2 ]AÙV¡PVQ«8ü^Îæû«šk­ñàv%6?ÁÁbÊ¡€.vÆ\ÕšP3‰ãÚøBÐ:È_JT-j=_´ZPò_N>[LŠ ÎÒÃâ{‹=‰pE—á §AȦ̈¶£ußìÛ<<š /¹ 5‹3)XïìÃŽûîQÛi¡ ‘~ùÔ4bžãùöv ï @’þFõXþnÀ‡æa5À”›ý;ÃèÜ›ú¤¦â9ƒ–D]$Ô>䡸ìÅIý6œR¢­ðâÓ­¢çæœe€~üL†r5ÅëðBøŒvz9Çó}ͧ¯¡GŒHëë½CTžÄuì)ÙÊy‹XªéÀ­ÞªŽµÜŽ’~O6%8Ái>Š˜´½îíÃ9Å`lx#âõR vƒgóc`èú†Nÿ—›s#~Þ=ûiy;¢W“i´ÑµzÑê® V3Ía_êš…jkøi_©DáÞÀ=šÔÅ–õÒP>œãôeAnÝ@×g¸Ì2òlg®4C…ÈÔGðt-¸lðEBð sc Ë:ÃÒfå½häœW¦ÎfSÍ?öPæYÏÇbŸð Í >…f¨Æ—Æ Âl?Ý3êªTGqOË8ò5–ÐÈóR-;c¡Z ñþ‡n¦ýäú !£|2©[âñB…® Ï$̵="‰¬¹ †ø‡²ÂÓŽØ ® –ÕÝ3e½ ÔFè¬9Âoǹýk-›èã&µmdèÈrVœ=-±¹ë2ž†µ:ƒç…DÖõ—:¼ AcV)ˆïÚÙ…Š^{бÆ|Ê¡¦Å`cìMjñMCw¿x¢:²-|c~ÜŒZ§ö ²yѸÔ+°-w ¯NS¨õçó¼;³Æ¦Ú~J奇?*ì’÷…èˆí}ÙlZSl £¹É5ìÌÃJ"i. iËÃXµ×¯2¿ 6ŸD ]QÒéÖ»Ô=À¶<ñt÷Rã%9`©ÏñåðOe§¢nÇء࿋í)ñY.ǃc˜šk |{˜¾ÒßÇ*[^3R“Ióíô¾„LC¤¸õXPâú…(vòBÆ!sîœ89Ó&‡ó› µ>‰†ßxøÕ£Øµá`-½^ à'T±12N×;Õ‡_ ·@åÚÁÛÇ:û}UQž„’#æy Zp†ãð[¡ºé‚N0gO*Ýe4ãH}F?¹NÛÒQyPØŠ ·ï§*äB•ë»Å®SFæýÉ)ÁÒ6fN Ø#´å}¢–Ô|ôr¦N¼üåFSR¦LÞ?œm=|‹=ÆŒe˜.æÍ;|À,xŒ$¹8ÅìXTBS­‹Ýñ0É ¤ôÇÅ º2Û2F…á”Á¨a’HêQˆÃºÈ—²É²ÍV "Ú6m‚A1žiHç5YÅß5ðXáOyiyibé?¿ð :Z¤ôñç1•ÂL¸` Œ6‹O»°=z®Í‘ ÄâÐÏàä¡á¨\F…F»0&|Ö¡ C ^-óo7ŽxI4 õ$§ ″‚Ó’&è Aø¡MÖT4šð¶™(2ÜÍc@…>)¯/»TñÔ¡‰6Ûr/…˾rúýy= gJ“!ä›*ƒ•NÛ6ÈŒ¸mŠÊ¢ágjâ”&Þ ò¸²ÅF’”q.HÈáØÇ 8<‡žrÇ .cn‹€ÚAªæôJí 9«™Ì7uéeJ8õ7ƒü›¯qÒï…Æ46öÙP(‡y_³*ÖwB„3R‘M®5q_ŠëüV d Ðe°MÈez/‘ÈTÕ¦ð ã_N®–ÒF °Â†…¿÷4ˆÕnd+ç KíaÂâÑkØ Àhu;uØ VÌ9*q,¥oå\ž€r2™Ùó ›byHj•Ý‹]ñ§ ¸ ÑŽžFÞKƒÌ/¿~ÿ}ê½àßµ‘ˆæÇ‘þü–³ƒrN9z¶ —äXBÿx.¯Äî о(áñ‰¤œm61öyMɯ'ט ýíGÓpųhj=ôÚûLD8‘âD®=.IuÞ66:1Rzž…ª²$\ÍË=»Qˆfåãu¾>àž©K^ƯoQt§¨Waîèè+)ðqèÜx&Ô'k¼$ÁÂT`c˜´8@á­€R%ò»%é%yÞ ?K-p†•õ·5‡9ÒÒ(_„£äyGdLÑÎßWÈtBW–®`ÃlyŽ$±éJp(êk²Ò4 ½n;µØÅ× gC‘Ïð)A©@_]xƒíùÑ Û™ |¯·Ħñ­×¸«bô¼š=]­ªt_k£È²œHL‰‹[hnøHÜðÎî®^$xÛJm`îno©Ã*G„J8eˆäk3J¤*˜¸ÙJý ¶Ø ¾þ·¼ÉýÃ'O|-T©£9-Ç?ìâË™Aþ*@d†ž·õ‹€;'¹{àäç ƒîvBqR¾¨õ!{#Ð’[‰/(f£UJxIFFSË.^tÃ-|½B¬qé³]¯¬šZµWëÑ·8Ê×+‹?Y ÞS­ö¶j|cVÜÃ;Î;çk1|¬ØA´›„s ,' S²!Wžpš% nÚÞÔû¦&… ûÌê ;.7“ñ•ïòTAW@Èú1 ‹1—é*ŠH~‹DVÀ³àuÀ’Ä!´z].Ø^˜}b8)á׉'vˆUP£Ž=\Å%»"0h%°Këge‰ÃðÂ+Íü-ìDá†ÍÆC9.ëÕÿKÜÈŽ}Ì”áÆô‹ˆbw3êÙQ•hvß²œ,E¦€Da•¬5Ž_2Äóë¥=Ñøæ]…„+ÁJÔ"Çî¸?“@»>ÑØžže\©E)ä5ÕGZ“¦l®ôÇX©˜µhX®ªX H}aÞŽÁÐÙͱŸ-ý`Îq’Y«CÉ—Ïꋉt £Xk[×Ș„’¦EÈ̲1ˆËgnßg{¾^ ßQ•±åVÁwLÆÑëÖ(JÐn¹W+ZŸÞ3=Áèl5v72ä¢f˜w¬ý,š·xÒ:òB¿÷vÂÞx W+ pǶð M t‡&_}½tvŸ4aé _¿â'=Å… H¡:%øjVŸró«3Zùfqí>i.·˜Ê܆‰Êp"j<œÎ%7ºñû(R £ÒCN.Ö×dÞʨöú4I }H(JȤ¥ š¥Ý`càÛ»ílHˆÃ7Wœ½’mŒ}»úÅ_ꎳ4ïâ8@Çx¯§›R]ûM€‚J5*ŠéÀƒƒÊáÞ 2:ت «âà‰HïóëV HíÞIè°o¿.[Ѱûp±º6÷´ÍØIµP’‘þ²ŽŽöÎ^àô³0FraGŒc '>}¤&)ˆBˆì̬ýðÊÖ[fm§)¯C‡ŠÊàoyiÃÔøë—ñhí1½X¿¯fÏ¡un¹ž­dQ„…Þ1GxÏ?¿Å—u·4åQ!†óÑÒ€I =ù3ð5g[P»/azÊ½Ž‹f+ò‹“H1:éƒTƒ¹ !§‡ÛÔj7ÂBÓ”G¿‰'´V{˙׌èÈÕÒ‰5_eø™)Î÷)t¡¦²x¿èñÞÛó€å~©VhAÇGõjнˆ&;­W†9oHßx$¼X.Øa“¸¶lÔÇ}ˆf=Ÿ>BRä ø$sÍ«LpÏNaö¦¿ÙTEƒàñ0«/¦cUá;Á€²Dzoà‘³zò½¤óÔ²Í1Fp˜7Ž“&ƒ€x€  ’Uòs¶añ(¥ˆÒ§ÀôD¿‚84…Ùû`ûØâî;‚ǽâ¢T®«²×¢ê><­ê²så‰Ô±¨küÁ¹Ÿó2ò¦ê5…®o¼±ædU[ žˆP"ž½ÍÉ v3š§X'«Ëc¦)mH×·§‚0­VÌqpƒnS´c(¼ß+Õð¢Ù ‡¬„0À2¢ õ5”©àËíâgßY€[‡ðWæ#HnìÖa]näãA/XËe ?ž O`×[´=îƒel‘æÔEØ„ÇU»X‘ŽÎ6í³Èèž÷g Ñð5]@™ùM½ì’ÞÞÉò[.írµšßCžõzXŒG[ Ñžœïb´‘– UÕ8ŠØÇ0œ¶¦:H•ଦ˜M0*à²ïm®¢4(æƒs¨mq—FÀ2ÒRu ã;·ugsëöLøâÀs7q2ïêI£¥öj7^.ÚîQ©b óîœ}¥ýÜ™ÿÂ@št"²¾ůÒà´Ê±\!ébªW¯´lÓz9dŒ<Ùlö7;šH<¡m&X éèÈñ8®}N¾;õ@ÝÑIÝÅJš+Áª¾x|sÇü­˜–Ó /5ž‰ÎǬÛ9ñ.d "_““/œH†k¨—ƒÈ?©6G¦hüâYdÎÚÕ¶_ „V_oYì™ zù™B'û€[ Æÿñ÷ cú{1ì2n¯8Öçv奆R÷سÇKcº[Ÿa`|ã}ì Ý·©)~Öt¨ŸgöÊ÷ 7Ö:ºVpà$ÚT<ª®ì¹ñdÌê\%…Fù—üì7ð Ä»âÇwxi$ÁúòAp” GDnq´*ß"‡¿Âóù ±?8ì[ÍAý,v2“­Æ‰¤õå Ö¡ü]X³0»>Å@tpâ¯Ãé¥cZµ¥?½b-ÁüÙ“æ©mÑTò4¸]”‰çà7Ž“¾Óœª@Ž O`ˆeZÂÀ“þ *¡]ªbü4—-Yf7ób…j,IŽØêÆmË¡wè!$å4й÷ Ç‘‘k,Q­:j+ÁAê 8k…«¹+kžć֌&­ŸSû\:6ÚÊ=?DÖ¯ª¸eÖ ¢¶«ßMŸˆ†V¹ÑîýÙ˜/@ºB‡nOØY§ù;FC$ ƒ#¢‚Tu¸‰Vù» ¢™Íú¶L­(­\jÿ‚õ åŒ¹XÙÂF6¦é“ºõ ëp†¢Æ’cU= áᎵøauh`N‚©˜çðSS#.„P95Àt<^sµkóV®‡„*Õ|¬ÇE±Îq¤ ÍÐÒ娣%wfrM2J3K`(ˆgF)îoâZcø»iÏçWÊT@?I‡øœ‡ûëd€ÑÏ&ðU\cSø‹n]lM2Uqj Іî¬ý×IDôyÖ`áÞ8‘î[5+Ö9qd¤JÛ;dÁc¶¸øðW¡LýíðÏóŸ½IÀLÃäó~ø30´yÒ\ÒسT|1³è¥Ýà‚导G?—ÔŠÈezõåPòñHLWžØÖÚûN:Sëã°¾²½gÚ+Æ÷dæ‡4ÙÈ©d£²ö©ÓÕÂegIH)êJÃTkGáÒ9Ôþº;ƒÖîäyÒ볡QEµøiu¶±{¬3ÉÒûвˆçeLÿE[Z2A<¿h6âñŒM<£Ÿ6¶hjÏÁú¸ öÁ¶Ã”Yž›ˆñ—w ëÄú°F»—ãßÇ<ü¢MÀ"zQxòÞˆ™¹¡"N›}Þ´ˆbü™@»{$þlïý¬Þ’³Fê ì1*q[„,¤82±š=V/vö?ÊSYðPtYÁ8Çî«jWüA~RÖµ.Î ëªM×êÎd0ŠºOïgШûÜÚÄQákp2¦ùS ÎT¢%”cbíàÂÑô.ògüHþúoüyÍ5oP9ω,òôçBr|õPPC;Û©Þ,umÆ ¸Á x½ØÄý#Ò²¸Å†ÚÑïÄ…AŸÖ©3¼´Éù1ª¡kËωƒP+zpn< 51F+ì¸$¼S~ÎëÆ¬É]›· my†—°ÍßfåNÖ”ÎS¶&±ÊØ2ÒkŠsyK7dÝáðÆ’Ë!b»•ñ“åíÕYW}n¨Í7©Ûd @hp›CFk+Ûw•[J€ÕöŸsºÍ¨¡ÙÂ…Ýï®ÓlÁf7K֘˽ýX »[Ý9µ_DXèÃÃÝ9öñí’-Š*ú+®÷=Á­ÈçïÇ·3°IÔÇI?ÚΠÅTN¾ÏÒ:ƒYJ—G?iq%ø³ŸNüŽ­jÂk`Á»Øæ‡°à†¾¹°LܾåÅÍ80ž®hþ9މ±éŽf^0ù©\‹ å÷ÆF.ý65v£}`b4&R(bÄ«LùÙ!6š¿Œ7·l ÃrÌ/]µ¯aç2ç%ÀàK¢°$ûG½ùÉm,‹,=…e¤¶ðgÍGH_CŒðÆC~]9Kø “<{-z¼»_L¯V&Íqñ‰6OP©”nÁìß{2¨üO[Ç߃,o?“šü”‘F­êÞe‰NJÌ®¼^Ô;|kÂÁ´˜Û”ÂLV¸KoM{-[­s{‰liZ¬Ê×ÕÔ%â÷|0YÊéœz8ìOJhzy”MìújÏt但QØl’U¡A¯¬eT–Ýe•Ç´ÛŠ©d8ýñJŸœ”xØØùZá,Ëþ-‹¹9ß·Ô”r‡ßá±…öë)œhPëwŒ£×C ÆûÓÖC7£ï®û-iû xlüZ²Ã)Ë&ü?HŒ«eIýÙ/ýˆî…Ìk~s˜!­aÂ%WˆmÏÜ"{>M5nE¸¯è”D˜œ{%Õ`ižDä¢HðÄ…âÄ ÍÎHQ«ÈÝvxe2½ónJ¶·AŒa¡a´ÅŽ1ºš6  zØ®È"Á§KÍ/I©¿šâú°¦eº”/z¦õû”(¼©Srª])Ž2Tº8ýšI~út²ë‹\|ŠÜÀTZäM}N†{”`†a˜‚Ú]©“‹B…?-Üxäÿú>"îM°…I\¤ël0ÄÜl‚Ú…8ËŸ³r¨hÁ’$Mo½xþN<|B«ÔíÓâ„ùâ¸Áp‘ÂzZVïéò}¼˜üç2µ]ô|À„É‘¿M‡Ày€pÌ;zmÜ—r|‚©;¨!¯ж"é†ë†^¤/J¬-Oî¥1f˶V_ëç—K4%p¨»á«—DHšeJï[H6­CÍt×ç¼åFú–r*ˆ™xÜêq‚î»­{2dà'Á˜OõÌøJJs½Šz6A¡©{Ëæ»ñ¯¡PosXäµàyád¸ÅlõR <™ñ¾EÛ«B*wCÉS¶êm™n=@N˜Ÿ­Ì‘ã•§lÝb=&‹t%óAù¨Åm©àlh¡Ú¢Rha)C]#ÚËíèh¥V1g‰ó_·Y Æt_vJó-[ý-çk€n_$ G"ŠÜï j,¢óÑM±˜æ+å=ÜSnmäBÍßeôg ~ŒØñqùÂÓzË %ža»uUÀ;ʬí,¬™>?¶µ˜P½C㩵ºÇfK×Ä[…äËF{5)¶„#Û0ã‰öôHÖÑ’ü¡ù˜Xx©ê1{ß9Fê)Ã…s“B]Lä†i2bH>yòfž¯ð°K¤Uwm+˜žÆ1dá x©÷q²U˨­&œ¡íàv‰v =ãzrwå¾o~óÈ {xˆÀÖñwFc‚Jó•(ûÉÄgCçËî¦Ý«7RsG:«Ë˜es¦·½,ºðó£t=YÓ; _¶î­3 ]Ü¿~ÇTT¥P$š#!Ç¥ë—vRpb´åª†´Ú{X‹Í4¶à<õÂ!Ç&Å¿C\ÁŽ×$6hÇzzÓ·‰Š4y .‚O“Ö]*iDOx4Ž‚‰²ùÅ̈Ñ*–(ÔP+q04Žƒàïmdq·ÉÉu¨¾ÞŸI#ö˜Uèªyo:¿o»öÖ= ¿!àRéΡP» Äm¥\a‹^öOŒ'ÌŽÊk‘1Ìð]y×¢úXÓOuÛÕƒ¹5ÚãGmŒ_ò5û¿Ê-,7pÖÓ)xߪZYj B“¼ä Ùö¿òF4ÔW⩗쬆fŠ=èõÄ9§‘l¿;wR¼D;Ëj3ú:Ù%Šïoi.ܘsU‹àKh7›Â<ËH;TÊð°‘Ž—³å¡ mÕÔ™¸Xœµ}ÜöTxוӮ½‡½èÙ%[ˆzëQ˜`…ˆ¡ìúàÞz;®Øl©0¸ñöìŽB8²À*­†T[wqfUÞèq7‘Ó¬ü19¤P–œ×ÆÇp¼+¤ñ-1Ð+ö3âµäÑò­œTžAˆN[Á’òâ ÌÛ,W4Ó¼3Y]0´´ì^x«†ãÚ¦…OéäüµT(OUÍdÒ{5µ‚˜pËDo”Ûºjæ<µ^!VWN ,G{u”®dicSã«™ú¾f"1i†UÙw0þö•ÐõS)šÃ õ8µ†yH*Qöƒi<ϺMÖ¯”êJHØ?Z"’“WŒu~.°H!ŒÛ~Ç­áÙ9ÞßEë•£¢f³ç<„É©YuÍóâÏÌÂän3à‹6£´eCŒ¡Î±2HÈ}o4>éñáµ–¿ÍdtI:ÀÁ^(È"OæøñŸÏŽiÌÆTej,ŠˆnþØ›£ææ÷Û›ðY…£*— /ß…Õ)b˜á„™´:0/ß̵d\Ö?%ò‰ÚªÐ#Š\ù¸™~jÌÑ÷Êv?…­[ÎÆ#óðõýú‚1 ~o†ÍÔü«æÈ¢ûÂ,ž«Ø;×ú±º;Nÿ{‘‘ÑiöŽ×7)I[жˆÕr²˜ËV¢¿LŠKàZµ«Ø¨^9/»÷#bjX<5#uX©½‰!IF‘¦êæÎYÆÛg*Q91†;¿&“ HÇ&‡gùF0˜ˆx'~c3Ôb×Diçû-Ò,jäð<ð;~öq¹ðè‰%š¹;sd±½ëì›Fk=AMHôòˆ»({HtýRm|mµ_ªÍ©éIN@„=zËš'e¾Àõ[úB¼ž`* ~áó‚Ž{}–s\,x@[›9Ú‰ò¥\¿;œO+àŶk±ÆêVvš ÑSmY}K ºÉ0¦5êèM²AÑP*:à&GêÓ_÷ÏÈ\/”û–9|¤Å÷ @!\£cÚF}Ý~B[`ÃWcŒR Òoè¤KsB\ý Ùâ'‰Ò3—ßš?ðãeÙyw pÀ ‘ê‚5ïó%x[Iuÿôü›QŸP’û¦Ôì„ «î%ñ[æ(ŽÅÜâ®l©½£¹µ /€X¾PnCܹðyÄv#e怃£eAMR„¶màiíV±ŸŸtÖ{æ:FWÉ´]çî'7[L„‚‘&¯.Èüb;®ÎÓ‡Ò”³üDºÈÐØT´æ¢sg: °˜–dX—glºƒˆš×&ÃöÑQê§_ôr§ ÖxgLpÕBz@K!¯rÊòÌ—Ç«½ÿÊm*kç¶.ð\ôë‘ÐÇ+WÎI}‹}GæÕO¹™kɆM‘5‚ݸòÓwºÎ˜µ¦‚¢œÐ•ò<°ÜZY|^*í¹\mûj¢L»^ùÅ…]¦{»¶#ïÍ ¼%ÈÂ;åÍBäÜpSN«¿õÉ ·ñÞû=“h0Ëûðª;]SªYqÇ—Çwj;…½I‚ •Þg$÷n»¬6?\ÉxMðà9òw†HAK;»ÖhéL<¾_°1uò…G†ðf&È¡>ö¿”oÅ„w¹®øñ{ìLNíÚ0Ädzô"ýârIû0,Þ|'ä8õ'1±Ñ¹äŒÖ ô¤ ¾ò‰!|ݰAŸìóÝLÁñ‚¢o`\ì4˜²l»þ7K–¹t¦yK¡¤u9ÜaY&áaÌUþ,)·Ä=/VsF|am6U$(¹OØE;e–/Q8h5²)bÁáw’?êj"Ñ å¿Ë¤-væ+/åÞàÜGNî"Hê€Q¶˜>¦ÒQ’*9M}†¬?èai@Dò&hôOç‹­}k^¯»¿¹ˆÒ€§2ñn1³yŸì0å#PvsK gæ“›”áዺ‹c#C.¶Ù£’‰ÌÕˆ‹B’½K¯Ý¢R7nx‚t=„+Ý@Á7‚ ÀœþñÂÒÏÏ.)é·$°Ïb+Ïú°ƒaN‚íˆ?é¼Îé_P¶ “ Usù‚*ÆbvÝ{ô×8Æž›êº¶¤ ^¿ûáØiù†Bû᱉Y+ÿ$é“63ÎE@8”R QU¿è]íѶ/ˆ¥‰ü? ßú·y±ÃÐU­ˆI{PP±ãØjă'©¢!åmäÑŒÜ5#ƒT|4~ w>_’Ñ"ºâÕÚ,Î0W‚¯ê,ç©d‰>¦ã«þµïÝ &K !×ʈ «÷¼ÝJå1÷zÞPÏ&ÁV¥©¬3ìäÆ*[Xc’9œ”Óãx¹ìÎPIƒ¢=÷÷6@\c'Áaé²uëJÞå-µß\óg<¿ùœP¥‘ïÆ;Ü‹"Øy[zŽ¡åÜ?.„þ׿¢ïÔejm4¾ÅdÕ•IçÇͽf‹{\7>Ê/JîÀõ$CÓa©¸£“,í4´¬N6ú)è/ePyºÒÐ&•i»‡K*ĤõÀà‰â\õìeLt˜Ì–(æb~Á­ªZžQ|V´º’6ïu÷{Hã(Jаhâ'¸‹¥ÅµOeÚ÷ ¾‡óÜ|€Xer81mŠÁ5F~bSE7²$Þoærc‘'Ól €@y¼u9Îj.r+âIcý _~ò2Ù¨û—›â4Á†îIÿ“twovè,pÖÚ ã³.Áú»Ò  mˆ †µQGh‡Þ*»šüL€í0ä_ $šmaE?FbÁ_’ÿ½'"}é„Ï)øÉ€ ÇÂýh¬Êk}èš·na¨‚¸‚nT’eû÷õKÁÑ…—Ñ]¸ìVØ™Kš€+t»ZÈ*ÇpÂh/Ä ’ÆÃ`‹nþŽæ/§‡Ë9c2·\ð?—À傈ö=zú¸ÛÇnW±#Þmû;¬tO›Åò;¸,‡nJ\“f]óó"ß·LÇn³ü…èÔŠ9¬£ß`g¹ }þЕCŸO€ ƇŽô]êød?¢}¥Ã~­ˆ4Å:ž?s+–êU¥v^—,Y7i9Ù†PÔ½œ…m)ö2‚Ø÷‹!š=®°èVjåL$u‰7@Çÿ­¶«ÂkŒ{ó†øi§ªÇj—Ô5—ÞÏœ&íatÁ?6ÎìÍ<-7o~­¥ðܩȱŠ„3ÐÉ?}‡hœ—9iž LÛ(sŒ<–ŠÌ\Rù6çHË” €t'hê='¡CÁ¨,•ܽÀúVI>ûÆuú™º|+â‚9¶R«—M;‘x NGÜÆ?ãžt¾w&T9~úÒñ‹´ËU‡ÍäµíÄ„u&(µ…•²²$HÐ+,ž¢#ïq.tfpW,° ÷€êïN¼S5“ëÑŸ ,Ÿ“\pùþ©19Å‹‘^z|¿ *4(wÓ ë ñ¬ƒ¸aÊó~ç4o‚s„öôœðQ[íÁÃÙ<c^îcªv#?Ú'Q¡ZãgŒ‘~xîâê Ø»¸è$[ >ü gJ’×û\¼Å’ñ¡&sPìž©1ÖÜ-_ddå1!u{@´Tߥ„ìÀ’åNÂß~jš›Ê„~ÿ14 òn­01þæ:(7ï´Æió¯ÕÐ[È·ÒãveŸ\kdI‡6©ï‡lÊÚ»+ùÓê ¾bSDYe endstream endobj 34 0 obj << /Length1 1553 /Length2 7662 /Length3 0 /Length 8694 /Filter /FlateDecode >> stream xÚ¶T”m7NHwH.JçÒ)ÝÒ-²À Ëîº,°tJIw§"ÒHK§ ’*]"|«>ïó¼ÏûÿŸó}ç>gï{f~3×Ì\¿™³œì†&‚ÊŽp{°†ÊTõŒED@ ˜(JÄÉi AAÁ©‰8ÍÁH&û_U$„ÂèÔ@( NèxB"bIY)Y  ÊüGÊÔ@^G€ž@{qªÂ>Hˆ³ sÌ><¼)ßîew0â‚ô@(°;æD`w€€Q>ÿ Á#ï‚B!d……½½½…@îBp¤³¯À‚rƒ=ÀH/°#àWÁ};øOeBDœSˆÇ½ Ü å B‚â†y`<L2žØh#š{G70þô‹r}? !³ ©Ò¦ÿÏGþæ!n¸-Ø:œ…<¥É ‹©Ï¼û4Ñõý‹£3F›Õ’÷ˆ/+&ãÌb„”MsÙç½g¸d¹ÉGµ‡&Ÿ>>™¢*¿fÓIâ' ø'Vêgµ,þÞ÷c¥©¨G×-Ž[V ,¸ÇT£\~*Ûé:ô³~å¥KÈÑŒ÷tc+î©"Ðmß }ã3äÎ-ç¸,Ï-a\í'±K­ZÉîeìÉøây{t–ÐÚR-öÉk¨T½„1±ÌF÷EA½ï6m%_¤± mZ=¬W"’» ž‹,ªdÃyð2ŽþÓƒA‡#i›eÈìÔYZ:‚Wsë¼Cv>š²@iOïëøNFyí¬ñAiöŽrà›cŽî·l±Ó8Cïn×´¦¨ó3=¡«Ïcñ<‘iaÂcŒ»“–›]Ø"ÖhH<øÐ¦nã 1oNõv[¿7ÑYTÿç5š ³Škåê—…Ò¹”O µâÏ›p"WÆ<é4߭Ȫ}¢Š\Ñ‰Š¿â‰(>´xÙs8öúpצD(/Tál¢BN¢M¥¶Ê7HÔÝ*Š—`²•i襹’-»×ʇçÿ]ƒ(4üÚ¯7°\1£.°t+ÿÇ£vz…W múKzQÿ·eïη ÇÑí[$Ãr·|¬† QÍ7ÖŠqè®kç> ¶XEBLÌk°eŸu}ª:]úfý‚‚äÝñß‹z-H¿ˆ }ì,1ˆš>´‹EtÆÌ$£ê8þípšW^Ìd‚ô±cç ^¬z]ÖG|OŽ;9™¯É{s‹z„Úê«y•¼ŠÍ§ÈÒìk0µ£­v¿?M¦óÊù!”gò$Eïˆ7bQ~¸)ö»×OÃ)—à;ò"Úw nx||ÚÖ7¤qêìYÓ»öÎ~Ùu‘…qv’\´÷ƒ´ÀÝð/šûb-KTÒÏá4ãBM:~IA¹ñÓyŸEïÅøƒ6}‚ÊC²}ÖZEóìòIzôdŽ%ø»òläIwùN†Ô‡E£L.ºqœ>«¾iÞŒ«§üŒÑîF}ÜÔ2’+sÚRøÅ é nµ\œ‰Ûl–À’ý‘æìsþÏãŽmTvÒi&I“Ë@>¯v•ŸÕMØ®7UØá'ËÐeKí@ÒøÃb_ëà¡«Id»K6?ŒïÞ0ÞwÜ ¬~·ƒÚš]Ðú²WØpG"(ò9±-ù'¾?™à)V?ÒìèTÂk#¡„¹åúnƒ¿-Äô—œ(ô~ZÓÉ­W.àÍ›ù"Òº¿­’&›Å,º÷îO<ŸÝ8‰cZDê^³qÙió5× °½µœ:1”;]p9çy4uÚJûZÍ7Z±ÂþÁ™Í—A+Ø‹ù…œq·9Ö7³åொìÐgqzó•¢ÎÔÛ‹B4Mû¤R.^y§ñ*¶à–ªÞ\*L7·§‘²]uËÉ~¬#Wé@J¤ß•ÊwH:§ÉÜõìéò¼Nòt/k”ÙÓk‡±ª¥âm²árètÐJŠä¤K¶$ž5¡èüR㻂DV6«e/³£ìUh»¡?'¯ù`3™û^ëì‹<*ª»\í ¢­Jº#ø^Ìð‡,%£uÉYx>ñAóŒþ~Æ¡Åq’} ù#* R®Ú§Œ!ô‘ÁC™¢Œ?ëA4Ñ—eœ$×™JRâÄJ×X´ŸÅy’™Û…îbŒ±ÙåOºp#*'×øÑi^c–uŠOF)5gÄ(ÕXd3Bm_%4M$òqµˆï#æ«è¸Ë 0.ka‚­ yŽ›Ò¾ÉÃÑø 6U¨­-þhÀÂ+ÁG2J­KàëO„JµmWÏ ›üc¼õb)42K†´<ëùònÒmÕriRƒZÂ)%MâÆ Z m¯_NãÏl˜5ÒÎ h0ûñ}‹ Ç¥®Œ±m ¢ÉÂôMHÞY³s½Ä£NdÞèçòêΉ£`Ú1îV³rséù¸æ¾’,¦Éó­…§"#¹‘4Ë‘·¦˜3Kð•\;±c)~óèœpŒ±Eô'IŠÙÊá±g—äj¦êÌNÆþû¦ÇÜÆG±ƒŒ®“Xð½ X€îU?Ö^ЬÁU£ð¨Ý©RØÖTÁTü-í°xs|à "²p’'£C/îƒÞ×hÑ*'9é´RoÊ’ÃÏøáå/ÿM’`Zs~] ÷È2"Vae8¡Mÿ’³†‡ÕòÈ+mdS*@¤AúB¹úÞBU06›d)åÍôt›”n þì‹åZhÒÑCIÚCîô[_Þ‰}°sã3%yÅSõÜ&¿—\RÂxNк›GýåWev1Y<0Ÿrñç%£$xVWCê ú±î ï*ö…„ÏH"{¢¦rŒ:#¹Z˜ÒÑU_F[|a™dQnªå5N,çÓ~†I>Іðe"ø…Nœ]¡V…HVSÂ[E1YÑRÔüþ¼“F»·üÉ#¶]²o5mBzSd~ ÏW䲕° ûä*E¯>êûúoùu2Öª©û%¹ 9¾æüH”'ö¡ú|A~:^ƒ c ;r­2]O#Æ:ŽdØæzA)½1]à[ÛŸ§ ’é¾mKÿò<ؘâ)5:ÒߊݶŸüµ·:hÖ©vòûpÄý:7N\œIؾJÿú+7cÖ î½Å±ÊýƒÚ.ã:ʃYÙõí ¶eT2^S‰>|LÜÚî¨æ©*YGý;»¡%©ºSL› cta/ûãKGöcbìÔœ ¨ìF¾ýBüÎu™ÍBz“ª~5Gj·¹^Æd{Žš óýÁˆ [Tºx€‹8é“–~²Oë¥v©€A$÷ré­•qJhq=[DQøu„¾Ág†…;háˆiþMó Á6ž&vÆ&«×>–K„åì6Õ¾³”f…^??§%‘ø5.˜¢¦Û ñ9¯µ±óò‘shYµ0+r«,”bÛy¬Ú3å Péø¹3½ ]8­üÓáKæHëxQñå}Ç<á|²ùgð8G»¨âbe½ CûðØAØÓ¤ÈjÔd›;¥ÑPg®á)pyÆKòít{ Gê >uB‰DÒZ3S—‹[¡^2mLy±Ï§or Ts²¾°Pðò4ëžo_0üaþ$ÙQ42ˆrPµk}_¸ Ì‰ï« ®’–¨¼¯ÌÓϽ“%¢“MÌKÂXM:uw¦¨Žˆ_=¢,ŽyP}þ™›÷ÍCñy–×÷îUó7:Î(Ø:|2"9@T·@ ý¤¡¾Å[ 9Á Øê_NHÀ(Ÿ1A¤U$®ø6Â3Ð˰%¶nõ8j†× ­…`íãů¶Í°ù.ñý Ú³¢b·;ËUފ݈ޕ†ë±”ÞŸ+¨Æ<:–Å.ö‡"€ö©>Gd_é¥#Iòš@Ê¤Ò ÿÜ«¤ŽÕErß–c¥ß ñW³ªÎ{û±Ì\ïCv˜Øj0¼Lü°þ®XDW¥æÅ8Õõ:ìÆ½®Ã«Þýf==v @ƒõÖò±eÒ=)+]µÛ ’´#§Mm‘rfÅiWT/÷°´¬0O¬v¾fQÁ>ÖH£dÌà[‘™¤òaüEuÏ‘'€³\tþœkÈ›»Q AÕm2¾½Ú¯Ùo<x…¤kêwZê#”£ÓÅñÍç;0ÇñHëoÊõðO¸ã|||ÎvZöðñ×T¸(ÙšüǶ Bœ¨ZæAÒnrÖH´^¢v§-QÇÑKkG5ÓÏV3ç$“½®}MË¡)¡-uo{œV~ßÄ•™ì¡öÆlQç=œ§3—4’åË‹cöÈL¶–ƒÅ$ F² åÛK0ËâÑ}‘Fì6ñǰ¤{,ݪ‚túÊÏWîÊÐ;KÜýfa‹åÁC‡4ô]/䫱Öt/ ¤é)ô Žf´ãÕFÂS“3£;_d—²u²‡$2 ã| ¾m€ýJƒ¦³¿+i^Ý”ZtÈÝ"Oø¬)¢~égguZMÜÆk‹1Éå² õ3gšÁªÂ_|xMZA¶ÜWÖ(œ‘eá@Bº!’2'Qà“$]Ï$LÒ:ƒoÞºV]v4_ÖÒ{šGÁg«ÀÈvG‘Äi3¾9Xÿr70ѽ7Ðu/57ù¦†³ù€-úÞÞœÁîûÅ'ñGV¡1Ôq,ÑQ3þ›T2\¹ýdŸœRä+¯‚ÚaM‚]‰h#ªoÂÖ18Ì Ö)¡ÁÆžà2úK… ;qâR_¬‹jWÃ7Õ®[!©tÆ UžR H¿¶¹ºC‰"b²Å Ø?ìÝ’A&‡aŒƒîPØyöI³×Ip0Ö;Ü(?73˺4‘ X,'o¦˜ÝdÕ_4>Eã\ÜL"Œ6XLöXÓ51ò”7Ð--{t^[ùIÙ¢±‚*së’žmÀ…M„£®Šg3wæP?སùîôk“8 ?Ͷ*zÞY Ñ ¾§¤¯”û…&óÔ©ºoýãy˜è§š§=d‘Ô^'s15:fbL¼TêÉ7é7M߃k#‡Š%ÜßË^uä©y#n¿sݯQ¾qñ’ð­‰ñƒW÷oÕ Mzë/ÓÿT­MrÛð¡~øÉSëÎ4Ù¸¾T=À‹|IX›ž•ØYn;¨çÄè7—üCCŒ…0%.ÌÄ[ †P«~#¸øräs¼rz\ž«,¦¨~/dLQ B†½„·’ç0næopPÎßbÆÂÑ€œ¸;XÅKüÙ°%a7šV"°¼"<½g‹”“Pd”™Û#W0ÊÕŸÕ´‚„U.æ&9gD îúEL=$ÊNk)ð¼ið´è˜*õõÏ1mX3×Ö[«vâ[* —ì¡%uتZ°•ÏÈ5–óô®âÛÐ#ŸKˆ:?L 5/~F‰T\/ÕQqz\x+ï ‹ñ3ˆßºÖqbžÇØ…LÎýíDÒ¯gâg??î£Q:ã øšÃp½Igš‹oJ¬—‘nø²6Ôn1UdçëwÅ“…&‰Þ¥åÏN&zC/ÿ]5›,£Ÿ=ß=ºÕÖb)üè‘×{w×L^3º:zƒþ$詈ÎÛŠç|q³5Ïu­³šúâ<øœ•æÝÝœ¼ÊU¥?Ž R‡G’ʘ"¬”l)ÃFpË !Rˆ¦¢¯ÒBt_ÔKÕ=Et‘6Ñ9*mñÛt_»(.X»?F(ÞùŠ.É ÜðÞT„ûÖä4}¸©½ê©¯¢EÎý»~/ž¾ßÜ¢‚6–ÝRrœmÙv(àqæ3–—ýg1@F$ú[°kÝc>3ªÿÔ/zóˆ~«Æc°D“Ô'êÁSzÕ¬BÞ®¥.w½hN¦k…£Ùn(wv¿=B¨V–è–Q•ꨴO(sŒÏKܯ%åÂâ_z®òRkV_®m2p’×9Ùp& B‚Z6Ö NíÊn«ET Ã3WÙ^)E=oª[»Æ{~hAõU΋wçüílpMvìÌþ"zŽáDÑMÈìç*y¾^7ví˜mTwmø·ƒC&b[ÃðøÂFΫ6ô˜€-í§E³Ɔ®ðál‹‡ñ‡î­æDÏJM­ÛñKæg@á»ÜýÈø…×óMoïò í 6N p?ë1ä]8|W–䛢\·xŒ˜å($f6ócŒ}U>ªÍt(ˆ`|´P˜UL²3õ´혉Wôiå­Ø#îTo+ÇÊgáCÿI=ã‹&A»X¦åj’çr’›zþý½ÎÁ§÷žÖµÐxûü5þtˆ3cTü«wJSs÷L8plâÈq¡ÞJ“ féÉFSœ¯IÜÂj/ª‡~IºÍž=[‚/Z¢¥[”·3Ôa&TiŒi‹ð }2Ô§VÈCrzp³z˜\Ç/MeDv SÊÕ¯ælLýû&¾Á[Á;e=˜©™f¡9¬Â|U+&+ùxáVcœˆæBÁ©:fõ>yûŽiÝØä‹alDÁ^„I,þ‹nÕúºÂG²D¡¸22h°¾ñ”Ÿ¯j-nd«¢A«ÉŒÐ&ÿ²é»K»Ûs€Â·¤\7Qå… .æ0ÛºÛ·Œ}'î:QFï¤óž9»*LáFGÚ«:ÊW¯•ÚNÆ L±“÷y½ßpŸ#ÖaOªå“¯ª6©ÃêÁ¹«7*`Éb½h,¶r¡,ʯæøåöª–†$¡úq²õ®yÑÛ)+}ýP5&–µž-6ÚØ6ª½{[ “O„$xî­\ÐN)ðD„ñ‹·ù¼W*§ý„—ÿNåýwëûlÍí©Ç„•,‚v—”±iÑ©IûcIì¥e‚þÏÍõ’„Ž”®q§/¼«ÀŒ­/ã¾ñp Ù ¢ºRˆìö‡‚¢ò·O`".r˜ïÄ"Ø8o9øìÜ}æ“A ÎÕ|ƒw·'Ÿþà™Ú!&/ëÚ¼dº[¦R«ç‘tèðÓqJ±ýâ·³AïsŽŠÃ„BL²ñù‡è•¸È;b’ôMØtåÙ[,±ë*EÌÓ‚z¿“Ú¡ amSDêjq$ ‚mU¤ì~Í! åÆôW#ŠwKÖ±’¶iVGó,™pé¤ýX“ÜUÍæšäšŒPWLkyÖU1VKT”®Ù þ÷qÄÙ†6Uåi­Àãsßéáëj±o8ƒR‚(.ÔmŸ[‰&íyuárÓ˜ì±~T²»³´ÞËœq°j7Þè~¡h#Äš_ïš®Bu3p'Š ,>w­`ª7 Ùã ç'O:YúðÙEp@hDWá K«0vÔÁCôö;—@¦rÕžå0æþáTúXý7OG ϨY,ȆMI>y¥á–£bƒæFÃ*týsA¥tÚ[ât+¶Ã=äùçMo‚Xèï ¥¦)š2Ë…OKŒbØs€YZIê€ñ¨¯Y‘·ñq›ïÿ$J»-¬ øÔÙwmòóî"1Á‡ôdaÒ€¶ÁÇ3Dµ™½3+"§ªì8Ô"D²$õÂo­vBä[Z™l³’÷‘^ïÝ#d<šbÌ6Xg÷Þåy{Ö·>C?Øê¼oM½“ïy„Ë9êºþÐñUh`A”³V–cÔ};óxŠ+DVâ~®.¹írÂÝ:t|T¢<| •õ-â4ãÂ^çHUÿ»‘Ï šàZ ±–M*›$Sõp=jöì‰ß;l×¶×< ‹3üLM©uÛ¬š˜|&G¹Æ­µØŒÿz§ã`Hí`PÆó¾¦k÷mÂÕ#6®½5㈇ní_ŒP„Ê’RO¶iÁjñ¦} SN3ÚJý}9ñ–QõZv9ï*Az®ýŸA¤ç*¶<ûpprêÈŽº–¼€Žœ8_ç"deTÿ+^?«‚Âé3¿Ï=¾t³„YËzˆ{ÑNú‰ôÃò0¦Æ²w¤Ä•Õž1þ~¹r¹û aû‰Y”ŽÄÍX ™ìøÄ|ö›ÔüÆ79Ì^š‘•¬Í“´FÀϲz±K†<ä³ ”·Û’_®ã· rÂ%5ÒYªU \†ýûRN%Ro–±†˜Ž›o‘rÍ&¶T‰ÂÖ¨¢Ø9"Jcf`ÏaËiX/mŠÝ=µøjXh8¯kóBdòu€üSœ>Õ®·g“´YãÌn¯mm7ØæGž»n•5ewÒܽïzªÈª:Ò¼d{áÂiHɱð4;÷U‹/#ô&‘nâ°×OÆû†F†å0ó›+H¡Ý&ahC0±€k^ßÎS!ª§ùîP‡çv.A´ô響8è¾^•bñ“'¹…Z[Å÷¥á"~êiQ¨¿,ÿa-ÒÒ*ž;R»6‹êÆz]ÕŽ’¢U¤ iÎÉë²ÃÕ¨>ž"ÄìI2®L}ìû‰•ÝgË»¸¯|¾Î§Ù£+©¾hÐQë:­.7t0~>_üDô>pš5¸!.Ì¿íæ"[FiŠ® ÈNåÑÑÇÏðya‡ÅM7?»âÊ!ÔŠ.tÁ”§J\FÀ_=_]$’Úe1sJ·/-!`¼úÍ$Ï«šLæ“o}l Òä†Þkáp+X½ÒÕâì§ÏXu/óC­pr‰€‘ë#ꇡ(ñÉ×,'CÆ}_×Eró:–äÀ©ù/kL/$î®ÛÜvRê nˆç mº”XR…}5Ú„îËÒ%Úõ¬+ËJ}îc@é§}Sè×qTRsB“£r ¤+—´B?¹‘4ÖëÚ'ˆ=\/ü®+ >Þ§_òü ïÁû~æ»C]Ӆ뾸<}Ú]¤ép0°©¶Ÿss›¡½[õdÌr©ö š¾¢øÉz5‘µKl ?8‚Ë^T,’@vr:žQly]¼þpùÜKÍ!8Q.ae¬Ù‰ ¡›Ý¢>^v—›TŒ(ـŬ¤2ì4±›JD´MF…NÑxTgi}3š¦2rÕGe2º]Œô–•‹¥N”öÛœ”?|F¤Åž­¤jéÅŠäî?PKHâ01[^^ɶ6NïHòdcþâdéûUÿé]qÉ–-X¬º¹êZ¹U9vbc®ô9¸Kî˜ÅGšJÈ»!©VØN ,ÍIp”ËP¹Ör=q,Ö%γÅIpº ƒŽ(?¿Pv;|íù`Ãô¾ïõ¨ñ^ØÍï¦CG›<íŒë¡ïpE Êô¯Ò÷Ò”À\¡¼‘'k97¦V YÅI"ì;ƒ7SõGN$®[î_¥°¨cÕ}–žØ#Ù0÷ dHpPÛ7©ƒ+ž¾¦ÁQ8=‰;.ôìJ‹½øé nÝ÷ðÍ{ê u;à•:MËí`€œü5r0+3TÑ{¥ß‚Œï—a(ªãM]Ÿ4ßzýLXëÂcAd¦ÿ5²îíË×ÒùÕM;_¶·$D5Ê/R°bøhÝc +[ˆ[«?ì4Ããf-Rç'åű= …Ì„ö}¾oõÖhØe¾-5´[ý?®o­' endstream endobj 36 0 obj << /Length1 1613 /Length2 9071 /Length3 0 /Length 10112 /Filter /FlateDecode >> stream xÚ¶PœÙ- Á]ƒKIp'¸»»&8 4Ò4îîÜ5H‚» Ü-¸$w—GfæÎ̽ÿ_õ^uU÷·¶¬³÷9kŸ¯i_©j0‹™CLÒ0”™… ¡¤ÎÎ`cãdacã@¥¥ÕAm™QiµŽN ˜ÿ_Ž@è³MÒú§ämìœö·üì<üll66¾ÿBù’&. s€ @:¡ÒJ@ìÝA–VÐçeþó 3£°óññ0ý‘³:‚ÌLÀ%¨ÐîyE3[€Ä „ºÿ jÏÏÊêêêÊbbçÄq´¦g¸‚ Vu ÐÑhøÝ0@ÙÄøgg,¨´M+ÓŸv ˆÔÕÄx6؂̀`§ç g°9Ðð¼8@CN bÿ¬øg௽°³°ÿM÷Wöo"ød33ˆ½ ضX€liE¨” `6ÿhbëyÎ7q1Ùš˜>üQ¹ @ZL `òÜà_í9™9‚ì¡N,N Ûß-²þ¦yÞe)°¹ÄΆ:¡þ®Oä4{ÞvwÖ?OÖ q{þ,@`s‹ßM˜;Û³jAÎ@9É¿BžM¨ÿØ,P77躙Y±þ¦×t·þádÿm~îÀÛÓb°xnè ²>ÿ z:™¸PGg ·ç¿ÿPÙÙæ 3(Àh £þÃþlZü‰ŸßäxÇö¬=vÛïÏßOÏò2‡€mÝÿ ÿã|YÅ4¤¤t%ÿìøoŸ¸8Ä àÉÌÉ `æàfðqqx¸øÞÿÍ¢jú« ¶RåÀߟÅ>ïÒ vùëüéþš zÀs)CžE Ðý£ñ÷lÜlfÏ_ìÿÏJÿ#åÿOà¿Yþoÿß‚¤mmÿpÓýáÿÿ¸Mì@¶îÎ/)6ƒ˜ÿž0î·GGwT¶g!qps<ÙŸGÑèö‡†¬,`ô9ðÜž7ÀâˆúûDyج2¿M"«ì߈— Àªù7âã°šüƒø¬f£ß•³šÿ >³ÿŸ‰¬þ¹¬ A^«í?ý™ ü/øLù|®Ðþ_ð™Ùñ_ð™Ùé_ð-€ú/øÜó¿às ®ÀÿÚQ3gGÇç;åÍ?o÷ðè4C]˜…˜ Y×µ]W‰‘º2o MÑnë¤Ò3{.8¶;ßb"%ÑWf¬:^Š%}ëÆ^Ú”¢»]¤|ðÜk®C mù Özçuo¯>±ÝŠ:?NÐ7V¸'VÛKŽBƬ)úÃëÁÁKÛß®¶Cž6×Á™S5ïÚµGÆ­¶·ìûpÈì¶ÚÊ· h÷e“ÌÑZQïý‹§ióL³fˆ¨¡ÌäÈ ¸ÇnXÓ—S¸9cO”òñŒ¨ÞûÑœEžúk173ËŸ59œ:‰iˆõ‰Èá.p‡'^{Šï$ËÎy–|ŒÄnbâÈÏ2ØG—Eg¸í÷ÕÓzT¡ Irÿr-âµ0¤}èÇ•Ÿ7"ò±‡t›Drä`=·.¡;52Hâ7³Øú—^×3ÎòÅé S?Œa¶/+Í1/SðQéøµõ³Ëâ¼™œÝ4æ »¾[æKõ†;~å­×ÃÑÃÜ]UI’YÌÏÅFø®šÆók9£ëGаq¤òi[+1n´¦]€àuÔ¬´¦ÒÆÝ˜vQ‰’ì‹uê­¹ w}™öD³“¨WšUºë)WÞ–6|Y²¸„ûñžå¬bža×Â×!êÁ7øÉݯ7ufv/¸üw.Ü6¬&ÛV¹BëÉå\“í1³%ygõ8µ w\Òû'*ä(Xîƒï!ãËaZ5JÒ_˜îWwû[t¾Dž0iÖÎPšö#¯° jZ ’¾½Å¡3¿%“S烤/›½/xd "ëÔˆúpåWǘci2º¨~HõAðØNÆ/‹Þ—lj½‹äs·‘ ^¯[¥ˆü=‹”åþédÝáÏŒÁpU§Ÿpv–Õ•m™}‡‹nR±i‰çÞù4–q¢ÍÊàyÌŒ “D€f&½îLH•? m›a×(܆wõ@®V+~þ‹¶ë–?)ÚU÷_CœÆ"›|üO#„¥ÁIªÕy.âxQ½ëÂôÅÉ`oó‰ØpñÅZÐc;8‡3qOÖZ 1 êL&¦¤áýr+Ø·4ŸÈ°¶ד7Å„v쳑B•ѧ² B¤@¦Á¦atO¡°M~ŒV­—ÐyaÄ(¶ÙÙÃãèÒ|;1æF6Žo{Àð~œ19ÇGÕ{ÉFÎŒQ/¨l0É$Ù8ÔߦKK4;›Ç‚Óþ½’ä!2æ˜å»'›¬²jfýQ»= YvQRia4´3Í7Õ‡“lÉC‹‹õ|ê³xèFs]‘ñ32bí—‡˜XñEßZ“J\‹uô4»Wú7ý¡¯N½¦G­‘˜&æù°t­Ü¹?ùšqÒáX¥®ðX3©¸M…6^,¥j:‡5-~Qøª¦–äýæLWN«&ÖÞ‡°Ã/a6©«ô¡o²Òzi¿4Fª´ëï’x.[ê›Ù× 5os ¨C`žŽú¼H¸åìÔŸñÙwèàEpT‰\ùae·´ú•:9÷ì¢ìç÷^qø¤«]ª¯ý~Û ù}:™l C’!šiŸÐjƒdƇΖ4gR¶l®yæ¾N3ç}|ì„{¬W±È§¯†Óš°âe©ÅÓaó\Ùè—™þxœ¸ƒR'^}1,ާNlOmÕºŒˆƒ¹Û±¡`´zÑ¡t~¹à¥%±’öi&’a䀡wá¸kRÕÍîKv•#ÅîËõHÞ1VÝAMâ—<íêAâ¬Îøè®×ºþW>:ƒÚ‘Õ€–@Ã++IÐîi]W0“RS äÝNûŠ™M1¹/ Exjì'Uwð+¦­ÚpCÓ õõ£ú¾GŸ‚¡á-¸(¾'ê7¤ˆï‹K³1ÑìGw?ÇËssªB´ô€ã‰ó·”‘-“ óY˜º[¬ faΓ\#F!Æ çm•”_YÐ7¯õ•™v#TyÝzü­W¯oSh §ï~Nlé‰ ø]ÛPÚn)\¨à0ˆÒÿöö1ª8Ýf˜åòèn[ò#[ Ñ2—¨®ß§ÙiëÓ2oÍPÝ6² U÷µ¥ôln«>ž«G;sÓSÒû7p ñk0ÚD0êœw¹úo~9ÃG«máôî†<))Õfš£š§µwñUÃ69wÒÔ»·’+Xó¥° 60_î¬@çÂÇÅ+¿(»ˆz,h¾ÌvnÖR‡œM#ý\ɪо™!)2¦Ácöh0åYÈ~xcýSŽ‘)œ´ ÙẛØìþ²85ÌQH/ªS^ðFYëÓf0­À`ÄÙbB0#›}½jÊ»K!Û:†Ye˜³›~×¶L½‚[5iw† = †tÇž¡çc|¢(÷¾â#a­`u°ì“Ö’9·fGh?(=£zn¬Ü·P%ÿÙ‡qŸÝO¬óÝG¬Ï%†µwL)¥ Fd`È ‚§Ò¡,8¶>+F…$j-Î RΘmíÖßè’·³³ ^·»5lcé>I¤ç4)†ê*nRu —¦.çÁ±Jƒ†”\¹ô& Û)oÌ „+ÁÖ¦-ê­cƹ)Ÿ¨F½ ˆâ(q‚"Ü ;5Þ,p¸çáϽŽì/rlCÛ¬üNÕŠ5fêNhGä«%¦¿.ŸÊy+vƆk¼ûR~k¥¾ºó¡„‹N±‡ü0q·<2/‡¥ø3![ŽmеöXXËd PîŽÉm°K™Ç÷ëwíT·_XËM‰qÁ³þŽËÊXÕÖx±°†–ú4ÊI€È·1Áu6ïwË<Syd¾•ëï›ë\Å=Ig®œš¹ëZë2xðS¾Cr?)U.ô“Ê—ŒƒÑ®0'ÒmI2ÓxŠÞq( é¾Vð¥ñŸ{ÃÜ:²Pv( “©^ òâ ƒ^YÛ#0n5v°À·Vg!QÛCgë>Sú*7Î]ö®YËnŸc«äÊ%Šõ&þnJDȯ49µi¸Ìù†õ?Y:éÛ>½·TÍ,üœØxâN¿_MˆÒÀ€&òî‹eíø‡ï‘Tá§€EôÛÑïåŠx©£üwNÅfíGRˆÛ)B½î¨^0úO*ÄŒkÃ[ Àüt#êlagïTx¾%>«õR>µTÜìç;ü2|µ!‰Þ½=’f÷ªq~éˆ'Ž–Ëý VÃ[Q †Øªnq`¤mÚx€ïùº¯m`;Ô;ÁAšüx#€(Zs»õÄ72UJLäò]+TU7à`‰0åæÍe»ëö´‰vÁ bÓ{1*œ@þí:EŽN¼}®'›=ªù h:U ?C¯J,Û/yàbɇƀî.å,5R›µO»!º9È~¶-—zî"Yk%C _”Êîñ‰]˜7 +å€E“̤Hpþ)""uÚèѶŸdÞQeHÐtúæ• –AöéêÕ&‹pQ&¹BV4?uZŒÝ4§› K†òɵ‹#Oå_½c•ˆ¿²ÆU¡y•Á«¯ì„wðdz\ζ-@s¯&w ká}EÓÚ™oÁ1¹ýrQßÔ]àŒ»\¿Î–zS4Vß47väU ÑåÌì— Ž$áá‡ÀãEÜ·µY[%/p<‡Ø‚/Z³ ^×''jù|ìÔ3_"V–MlôCqÁHu¦+×§ÍÃe$KìÚî~×Û1Ä)Ǽ Öb—iÈQD;‰(•^zPÙíÿöÆL„Ü®áÝŒ Æ™«¦Àˆ‡õˆnXÈ’A†€ò0ðeã8²1 ÔÒvœjS®U'ªßèO ß JÄnáhI8ˆ©´oml´¯_úœ6mœO±P¾'?¡°¹Þ$Ž{–PFäSê™ú‘~XdŽ2ÛóÖpß”`¸£[UâÎwC ;±cŽHZóYJhTSœ+ñð5‡¹’Æ÷øÒJ $K?:Ù™z–Çéªðµ€n å¦^ú€žâ.9[t!Û­*(‰6õ[¯«ÍùϬ—¥«¸‰Å¡‰fðå ˆçpÈbuÂ=3)¨ê/óÓ}øÚcC$4Z•:«[.~ò-bî ÈËâ§àL’ȨhqY›—·Õšó~“$Û~¯ºêjüĹÁŸ¢Ú2 œÇ“rõ‚ÃòSYo¹z wµ­C2I eÏEÔQÈÌôÜôú OÈä:ÅÆ#2ó’]èk”ùÔàqçÝ ŒWöF"Ù]f.º~L(#>Öá •\Ê¢~Áa³xL„äC'Z^içÂâåØR®«Bßh¬ŸV´ß°¹?úmI"|ͳF´6Î3 'ÀÔuÓl@n½²½ï‚‡}Ò] Ò) ÑÀºfzÂD±O›|Ôûè¬ úìý›¤GãÕuÃy·‘ì.´z>Л7sï¢ÿAJ±%ü›å:¬Ñ/,‹¨_gº¬| 6uk5û@R:s×j5³O’M~&oÎ6ºÐ50ÂÙΕ3K&%Dê›×”}Ðýé¤È#ëÍ¥û”â×w.¼ÚÐx4-LuJ"ÌÍ6‹Ÿzý#оGìc¨6±$N_U.ËHäöØ$ò¨53Ù²)i‡Þ£†«Qâ`ÓÍÕ?¤Þâ;¾Zf…Eßè TS<F0Ÿ“ld‹|~¯Š°”àöý¾r B='¤.F =&kpâ¥-FU²'{ÆD}>¡¨¾Æú±8Õ:že¹þ(èvÍþkF¬Ûê†Û'h;W¬Q냒Í×¾L3ØVõõÄa÷Æ:ýkœ"ÓvC):ÖˆM ˜R7Jõ¼/ü½š N0º/ŸbÊ·ûb19¢C—ò.L€{ÉÎÚI£·æ Ö¾-×Þ©è²|½uL[˜¾½ëü´Ÿ «hªÈŸ 5Ú ïf´´.ÊTß²£l6D»ü\läJD¢übOå¬@‡¶òôb_¤ã™ÊååIP ûåo^çg%ã’nŽh\ž•q¿)!=Nt×Qf¥k§s.S§lªFN-Ï­>ŽZm‘Ò*ª¨Aã‰ÕõÐ.S¿ƒëëàɲ לÉ,U¹Þ«'*QÐúlPÿêD~±§r|P ^úUŸ¤%&ݰÿ¼óšñ*ˆB|1þr´ÉH¡IQÒ—°Kã0 …Þ7‰xÇ”Mo*`2õ悘(ª†÷ xÈ.?²¥‘áÛÓ¯Í]jT»bŠ‹%«xÓû´=–Œ-9˜'V¡äVCG†BcÌdЇ·¹ŸÞÆ“Mƒ%ŽzV; ŒºûÉj…®ÔëìÛrÖ°kÎØ#æ€åŸM+§¼sÁ­Ò!±rN?„œ?W`á,ÁC:³ªËÊ.«Y…¶PwXq~"eØXQÛpñÀ{ï°Ó¼ù3Æ ·«Ê+0j‹Ç{ïìÍØ|•w[u§Òƒ³3Í:ôÝ\ ‚"~±Ä;˽²£¾!JÄ Z¥Lfôl[aŒ9½’/ûÂWωóÒ}^®U¦ úƒF¾m»I×9¨¹Z”Ø'·K—}oº)£¦“}ç=Þ-t(NñÊøþ„þ à‹Å“¿ +Äî£Kø–ux] ˜ø+»hÊnñ°¼á…gÐT¸¿DFå(¦ûv¤eŸ5æD#ŠŸ†Th¯PÖzL;º—"®æô6ßV:”’±[Û†ÿ~„™'½)±+W@/«ÿ«ø¥±@MXFãµ±Ýz‰‹©‰}ÚÖe±Z-¨Z@H×’+N£{糋@ªdЧ$vx)MÄËr½õšÝL$„:ƒðUÄ’¸bõùc߯‚áÃ\(ÿ ‚ /ø¶NÒ!qcñ^©¯lZm_Þ{4½ÂP3cªý«µÅé8pE梸ý û¡"5À&¿1Ã6Q¬¬†ùr*|$;krð'y€[Þ¡ì&„òn¢úºݜwj:þr%bvu¬µ&wÓ’ öÆO@†£N—ÜïôƪÐn^­ãñ3‚j=v¾¯X93·.¾X^^vŸVjnnǬÌÏEWÊ.ù®.õÓhš8¯ÃrSJù£BŠù‚â÷<Ó6#ÅÚ5ìtj¤øpSE>8J¹,l‡QßÒ‘-ZäeöhvÚjbËë6´ð¥µ“ˇû¤Ür‰‡8 ”2¦ºÛX,2ødW:¼R{yuà Pmít>A»_vÙ­L0¥íO°”ÞƒL¾–M‰E„ íMc0fÌäyÕ`+xÝUºFnO°hì·ЬZúœ >P‚.µ¦yÒó±m•¦WB dãhšmû$«6Ñú²%ðëmo ߎDKÝHR6Ú+¦T0Ãë´Z jU/¤K†UŽÆßñ¼¸µ²„ÝH½?®ÑÀðô7hM\Á5æh;§T%ýDÍ2´l²Û’Ÿiöª¶>lŽ6Å7ž +•Âþì>A‰êàNCÏèÔ.Q§*5S”zb>þQ?ØC_¬ >$g»Ï ¡À×-ÜÒpq„ۥzò¬Ù;dÖÉe¤n’ÂB¼²{7Gmˆ:36I{"¨nPlñJVôÀI~¬cD¢ç²ƒò ¡…´ u‚¸1·¡ß'YUÆëôpažÒp¸—hq!/xõ3zÙùÿø[™ô ¾ŠÀÔÿ‡9«ðª”ãOi+`ÑNOÕgÙ×»Ò’óhkÉÆÕÊ”0,±O©/–.õCP„“ PÎ×z4²Òp‘€HŸ¯K?n(Ï‘w+õëDªÙ¹`·OéÜRäË€G2p‡¬Õ펦ɬ^û¡$ýf8Imš®W+£öŽVí¸³?Ùéè)¢‰Õ€ñâóĬç‡a±-¥$,¦!BbÄ©N*j•!äK:Ò,-\ÈËî@™ˆ #iKž-›úÆ0‘&bƒÏç@ìˆCýJ3qçZ¢&½Ò=Ç®ìçÝù†ÄQ·™Âh³z½Bø¥ŸæGà['r¢1ÎÖËœÝݹ¶Ùaï9f}Äû^/Ømì¤ýabdŽ×(tä Û šd4-÷G… qy©²þ d#~Y[ž ŒŸ”ÅWHi®÷ªÝ ØÂ~pqØÐô8”C[E‚™ Õ“^´VŠ)g~\k{(OÇ(d«Þ’¤ës_¸­—_x­ª[â¤.e%ÍL**ؼÑb¡p©é‰—/â㉔”˜Ä&»Ì¹¬ ”¶OƲCtz¤µ¢ã†›*ÐHéÈm‰Á’‰¿3?§@æwú%‹¾ ™÷nÝqÙ2ò׉IkøHBÎÌÅÝè½nþ¡S«]vu0~Ü+@U:ù¤Äë(Áþ[[xÑÏòÔ^õŽ|æT7dˆwý\Ü[(@عL66-…¥ý7s zoa¬D{ðo hHßeGª8/›bV‰&«ñÂ,¶øæNsb/äF€HE.ÖÙÇ¡µ .l µÜaò‰tÞ}5À®Å­&)˧‹_nfÆLÇ_§êEw*jþˆãœ›A&WæD(WBæ•©uú2ð¥ÓÀD)6Š€uz[«þW•äÙ¨»ÊŽc­{mÔªÞM‡Á“åéZÀymÔ„Z#Ëîb°þ¸ý^šJ7ËZ¡PÇ‹w`ÚE™_ å2j" <64Ø2¼¤ziõÄ òÒ½f`ø nËI°ƒ.*kã*oh‹Dùèt][èCs¤'¡Òâîk³'ö² d”úMÝÏã` –¸H€(I{ñ¢c§¼{{OYÈÄé°î˜Ðo*Š4v¨÷ZèW»ûWŸ…vêÇÞ”îzÈÐã¼6UÉ*+*@¥aUß#å]k%ò7-(Xtt)iw¡ÂWº.Ä”o3ª{ô~Ú b1kÖ³¿Ò¯ ]GÌE™Ý‰Só®t ƒhCôv¦Ê0ÙðUìúοÑ\™=æ@jƒ&ŸVõ/péc¥NRgé×è}÷Hû†eNJKå¦^L´}wû½E¾t˜Dž2g¸(á 2ôéF,OaOÌÚ€X–¹BœB3c£#žlíOhFÊ¥‰™mÊßclÙh ÅXå TDsáÌâéPnŽƒ¬C‰ÊßJF:[ãqëŽÞùaU žKg—yr£â“Õ~†QNâ L0 liÇ¥–Ë¿É =—˜÷v#ÂÖcÒ,·Œ±Y5‰·!t|fÆpyƒi*Ÿ¨G©øõý0àæ&Œù û~¶C’´ úÆêääÉ©Ü.<·´–è· õ~1#¨ËÝ÷ú4cê©|R¤ä4Œý«pâ µˆ6溛©ã=ù`h¶8à¦j…W؉zÒœu=Þz;9s|¤÷^äx†ìWjÕɘ˜ ëO(/²ˆžåÔúfƒÑm°O/pTE\é¹>¬ýv^Nmñù °÷æßIc“õßÔ74ù(ž¤˜<±”Ү裩¬ùÐ÷o¤zŽOÀ´e»H|@NSQ^dÄê‚ÿ=è×V8—FèL ¡BÜFù¥47;ÉØ=L19‹Ã‹%)‡¡¶#&$¸ps;,dºErâ(ªfYpU³2 c`1)y~`®ŽÅnÚ®1L*šÉÉï°¡t°Ïº!IÈA~º5œ$éÑó; É&gÀtöÊn÷6sµ…eûlJnc ¶S;ö&`æGrEÞUR¢l6u€êš3‘szì5^Ÿòn4û .j£—G\;¹°@‘tñ–‘µrÜáÙä˜vü{ýû.ž9ÓÆšy &Ô™Š*‡HæÝR½Sª&P„â'd{YÎÙ…s…ežVý ÁÒòŽ ZÓ¸ê÷_îföçx®< <ýc¯‰ZÖûdÎx¾VªÙe¿`TÿC.–E€l¿Ô·åßÄÐ6å´=¨ŸD°¶Ócߥ¬B(WPÙáøÆDB™Ô/dX՜ѣÁó°\r‰+hâg¨\J¶Ø ‹ÉÞã4þéÆWB)¯}¼”ß{¨óJy -*È‚4 k(,„»ü8Cå„LkïÇ–iÞ”V`Û§Ëçï¹ö þ•+Ø™ç³ËQ›øc½ZË¿ìp,ÇÒÀ3»âT5À9þrS-?2Qzá)h‹“IÕ‚—™;o9·$yjQRqäñå{-ßo¼!©ž‰<Ÿ)íó7OxõÈQ¾÷ ±xô¨¦¡Ë{Fê£Ð¨åã-§6“wL$ДïQ™1Þ9äu‹!}¢E ÊÔ‚,aqkh%x+4tÈÏ«¨ ¸ÒÀ+áÌ ^¥Ë¥ÎåÓW™»ÆÚÔâ[6i0ï‹ ä81çÞ±Š¯e]PD&-4S¦¥qh "” øå”¦ûΰE”­[oU-¥ûT˜êØ×ñ*cF3´DDI‰%Ö Jæ_¨$.çè¢,#NÞÅ•úæšÞ .ŸÏ\B£i¢TKy¯ÃÞüÌ«ÂÚ²S˜iPŸz(nRƒœÑëôÎ¥ÏSÛÙbÈ®Dj äü(È}JǨ°¢¥3M3‘ãñbɤv,yéïS¨Æü@—ŽU|ðò `K‘ü!ÒôºxWËfX¨Z”Ý Œïð}ýØ †Ñze¨¼ šI/¡âô’—ÅŒ?åâp䬈…Î÷ã|I"†¨í¢™®lÃa°¼›³w¼eåÉsÅ™)aL=!â0ïé·ŠŽqë9DCHE¿²>B“Þ®î"æ=ÍDÓÈ®t«v&ªɃxwX 8bØY˜›7Sh…“Øí·îC@)·GWxhü™|•éP\Á"‡7¾¤Hÿ˜Ñ+)ö¤—]²-jŽU·.t¯÷LÖÈ'¡K´ÆÃoã¨=IÞîÊÒ=êîp˜ï0¥mÞ÷ÈÅY¬‡l†X‘]Áªá7tÖ}O*½p¦5‹jPì¹Ð°îÚ½-ÊôX#ã'íàf¡ ¯TøÊ3ø ºÕE?Œ—²¸j¨†·óø¸ü ÆÔ+ù…$ýCûÙ¯MŠÁRm¦Ä‚› ™G¡ÎÇwÂv­ü´´“Ö»/Ýdîpól®½rq¾´ 2¢I7²ö7Ðd -áQPC¹èÝ&1Äí‰ØŽÄ?×õñÅCóœS¹≮¿Ê<¤ƒÐ-G£Ò æ#«‰üÍA‡ÐïaõG¹tVÌ’Œ¶½øZ/ƒÑ²Xљ밉mgè/ÎÇŒI6çÜ$•¤ÁÛäýÎ[ýcÙ8[¯µ¹_h”]yÄ .}ì:eØól_ÊJ/°æòÓ,fŠh?»nœ­(”e÷÷ÓqNT‘‰"Â5gV×¹|¸Â„F¢‚Ú¾æ v‚yé–Þ§`Íöÿ*€σÒCü¸Q‡öEäÛ|qŸú<)Ðqˆ¥é,~áZEUäs°@¸:§ætãí Eèïe¯3mG™Í¢úZzä^6ª}—!|œdv8ÙãÒtq!/Uu´^î ¢am~ÉDQ`ˆoùZ4^‚>SAŸwvV Z:>j<‘ª]´¥tõúò 0 ¦_ñ¢Ƀ£5VÁþ.æ ¶iU¿â=ít¦zΛ9ͱ>À½ÐÛæº:Tõu‰¹mE¹(¥Ä!5pè#2‡„‰5RÈÏÀ‰â: ô,ä+ØÁ8—Ö3† O^^ïO W%cÆ'Ô ê¢’êÊ7}€n°‹“ù¬Ñ9Scù“\JM\xÌË0 >Ü9³*gnœ7ñOaÈSŸNlSÖ¨KœÔ\ç< H<¼¶¾u®2ÎU†ón}rÂú?èP¹] endstream endobj 38 0 obj << /Length1 2230 /Length2 13274 /Length3 0 /Length 14608 /Filter /FlateDecode >> stream xÚ¶eT\ÛÒŠ»NãîîNp×  4»×àÁ îÁ]‚w înä‘sî=9÷{ïÇ=FwϪYºªÖÞTd*êLbf`4ØÞ…‰™• ¡¨® ¡ÁÆ `eå`feeG¢¢Ò°r±ýÑ Qiœœ­ÀöüÿâH8€.¯2I Ë+Ulsµ°qظùÙxøYY쬬|ÿ%‚ø’@7+3€"3@lrF¢’;x:YYXº¼Fúï_­)€‡ñ/s€˜ÈÉÊhPºX‚ì^#šmê`S+‹çÿ¸ ´tqqàgaqwwgÚ93ƒ,„éîV.–53ÈÉ dø]6@ hú§8f$*€†¥•óß*u°¹‹;Ð xØZ™‚ì_\íÍ@N€×øuY€²Èþo²ÂßFÀÚ`cfûÇݬ;²²ÿËhj ¶sÚ{ZÙ[Ì­lAeifFÐÞì7hë ~µº­l&¯„¿’¤ÅTÀ×ÿS¡³©“•ƒ‹3³³•íï*Y~»ym´”½™ØÎdïâŒô;?I+'ékç=Yþ9b{°»½÷lneofþ»3WM{+GW¬äX¯"¤?2 €‹•••÷õ`Aއ©%Ëï ž ¿”l¿Å¯uøz;€毥€|­ÌA¯?HÞÎ@7ÀÅÉäëýoÅÿ"$66€™•© ÀdaeôÇû«dþ7~'+€ëë²Xþùgð:gf`{[Ï?ô¿šEZE[CJ›áŸ¢ÿQ‹‹ƒ=ÞLì¬&v7€›àû¿ŽT€VÿIä_¦²öæ`ßßù¾6ê¿9»ýghÿ³'t€ÿõ¥~`€öϼë³r±š¾~±ýÿžú¿Lþ¿†ý·—ÿóþs’vµµý‹Aû_Êÿ‹´³²õüçu„]]^×Aüºöÿ—ª ú{‹AfV®vÿW+ë|] 1{‹×Ñfâcæäþ[lå,må2S±r1µükLþkþ^;[+{ ØÙê÷U`bceý?º×]3µy½Nœ_§ó/èu•þ7ª”½)Øì÷αsq€NN@O$Öסbçâx³½.§Èã¯y°0Ûƒ]^M¯úÌÁNH¿–›À"þ[ô7â°HüA¼É€åÝôj§ð½2•þA¼\Íß«OàôÊ4ù±±s¼B' )Èdîò/1×ÄÑ?Æl‹m@.ÿÃçãøGþ ø,¦ÿ ®×ئ`Û×VÿWÂÉù[bg÷'¿ßgÀböäx-Ó lk túã5 П&ýFŽ®¯ü‡À`1ÿõ59s+·?\¿Õ`×{|¥Xüñøª·øýXý›òš©åŸ¼_ûcéé` ²ÿãUfõ/øš¹õ¿àë)Øü ¾¶âOÆÜ¯5Ûþž²?úׯÙý¯÷ Ë¿B½Þe,à?ɼr_ŸyÿR¿àðGýjëðúбÿŸ#ãdûôìuiX^Oüç8_›ã`ëú'9Ž×V8º‚]@f&ÿj:Û«ô_ýb{íÆ®ßäöïv±½Fú÷õ†bq±tý»Š×޹þ ¾Véþ¯ }5ðü“ãk;½@N÷äöÓÔÕéµH—¿®Ò×åý/þë y€L‘–æÁ¦ÁÖuÁí÷5b„îL»ã}Üš?^\I9‘bl!·™¡z•ðlJ 9óny“³%UF-…«ô ¡!Cã¥bxÜmøÄ;˜á±Þ„`AÉDœ0× *ñ£\ ÐN^²öÄGã¥~:”ð”9'+ÿ¡K%,1†¥ Æñ'¾¿ਠGHR^P‰¨|0OLJûðáLYÆÖO•nv¸S’ÕúCX*²\×—©Ÿ4rï‘¿œÜ½©ìÀ2ž›ïGåòŸ }‡äRwaB¨[ÊÃß9ÖÅþ`Ù!/Ú ÙÍX™K³ÍX4|·¤àGA)äÄ£ŠÛ píM*–”ž?co½•Q6ppž˜¥æŸGI³F4w<.²”9‹õÊá)=àž‘¡=ÿ„5Ýe5ý͘bæ“R” nhž,e˜Ä¢vä„Å¡LˆXKÓ þÛø]iîxC£|DÝǹ¤¯.hHCrZåû˜§ FdX'heÉžcy ^Ñ©Ã$mÆèüæ<¶Ÿ”´†o;[ Ð#i›f©`Žß´ÚÍàýEOÅ^•ghý„âC|©Ž×ÉTƒ?‰Û‡Á±Jüç6J¡ 1ƒÉEÈ}üÙ|’‡Ë9:PeŽÕAxãVŸÛñé9ÊÀŒ ¤oËûˆ—2±o´ží0ÂUȦ©H "{?§aÌVh¨Mõ°õ ÌÖž"1t‚RyÇ'XuK—Yç0Ĥ/¹;®3SàúÐÄŸ®@IWCŸçMàV  ¢52ãÁÂïM¿Aõ<Òð!«©ðÐOl íb¢/"k¤!Z ÷iØÅàÃèACVáG"˜ìpÀFsc¿¹—“ vG5Õž.“ðŒ·ŸœÇ7Q& àZ×XÂ:ßÞ“Í«[žw÷å‹ÒAÚÄV¶«ÿÚÔ¹: «u“¥‚ö³JÖà,”ŒaÚ­yËb03;ÄŒO…§Îl6këüU2­³3ƒõùœ‡Œ¤|”.ü¶8” kwÃËâ+×y;¹'ƒ@‚f¡S_€éºkÿÝÔ*¸oh.<Φ“G–wÉüïßÓh<¨H(²£åzÃe¥Á(gfñ8XåÅ•9"ж¢ÁÙ4‹Ð)2£Ü÷Ô«éÎP[¯{TaݤüšU’¸ÃqÛnïÓw.éÿ°Ð×ÀÜ6tEŒÏ_{a@rIÅIÓ8Hæîû`pKÞŸâöb š‹—ùlV ¡×áVGŒ ’0:1Ui•ÿÈ+(Êl°º=ó-ïc6?K›õ뜾!óz¬±­ÃJˆw‡OG׫~íLb¶úX‚œ®x¾÷Åú´¤ôåZ©£¥(KäËsYBqx´3Eš“K¤¾y‡Ý7Ë(4'½±³µûGôoáo®ëê4Xc‚ùéOCH åT€çB©ËùxPÎT:Œp應Ç?Tƒ¯¦~@€›>t1_îÛlªäÀ{}ìaO?bó;Ó½Ù©‹lPREOb!ìxŒ½>0“eC=ˆ¶pm´¤"¦Úb€,–.¬ÅaÞq˜^ù5‘â^š'¦d(K)¢)á)†Þóæê}Ÿé;6írÃü|8ølGúè"o£A$´ß;O®–uðùž×ï6Ó”WÛÒK<ðÓ³(™ –9éF§t½Äè æ°¡ò üãÝLu>þTÁÒÒŒ`&qÓÐëÞ;/‹ÙUÉ¿\§-ˆQ± Y~ú¼µf)'ÍyR× ãè‹rœªz‹™­$ÞÄŸ¹ð˃dŠäùWã®'ÜÓŸ¢x¾£!–°à0ÜÆØ¨—DÊÓ&ƒÁN®l^=šÓêÞòï?üÁÔ²:£\÷žùØ:t…'ày*}XIñëÉðÂLîp“D{5µ–&¥g­û¹šŽ ý¨§÷F?ðÀÑðK-•IñÓ˜‘dJ푹›¨*Öm†çQñÕ4šY2V°1ÿü%u#¼¦ª§D…Ì®{ò:9ËÛ¼2 ½CSˆv ³x Óhó±a$Ÿ¼˜ËsòeEea §ê:Ú>»4pÖ¾ë`w&mÜ Rx–@¯àK<:æd>-©<;0-ë¡ä›ú¤ï¿&ÕÑc†0¤‚ÔŽû© ©Ír†[xĸÅê8fm‚ß(üójÀ×AŒ=’Š@ß>]5Tšf_›3Ž«MÅ”ïâÉA–BÄØÎ!óJµŸ7?Då’nÉU8îP R×åJ?!χ¯ç(Y‰Ÿ«O•$"hgì g~~ƒ€èͨeõº 7(n»ÇœÚ3ÇÐÄÙ 3Fýæâ¥Ã­•½{N©‘h…ÂdôQx1o£Þ Q?¥®G'z*#‘ºqêåJòoù+"X ç–û.U öt½¦¼²ò •'ñÒHèsÆ:³²c¯…É“Öe$…ªØ»Lø4¥É6»•ËáÔ. ‰øVÞ4µÏÑ û_‘9·¾ËõÑc]dHa uªX:’Úü‚ž‡¡ƒù9`”$?Ñ|-¢*+òb1G$Z›;“cÆðsLÞ©b?ˆ1¨Æ~<$ÑOÿ ¡ £ nB˜™£êšð;Ü&ú¹¨OË9¦ñúˆÀc‚&qá™t³+½›‰s°bdß'ý'O¯ï4Ò­›NÈÆrÐäª/rnÚ©Mž‹ƒáßxDêÓ+¶æVY\ZêýPkÖNÀL_ðWv Ô]Í:ãVݶ%â2ɇÜä,,FnÖ-7|s´·år‰ Ô'8~ö}ѧ…o 0Kó©ÐßÁ ž½ø¸ïalÏ»3AeæqÈîÃMòn«WfYØ£t_¹›“¹Ñç=¥ž±ß©ˆ-3ò:ì´÷Û7Ù2s]Éjh?‘ÏGébNü&™²o‘ìüí‚ZwŽÐdŒ8ÇÊ; ¿Ö1Z.âŽzHq_¢ô, ôiLÊ »RZ¤“nÖãv†'8ã0åàß‘¡.;•¤›”ª±ß~8Î.ïiÎf@ä$ÍYÊ‹œ[ÓÃd eÁ³¾+W±Gg(Øz˜^TÕ1UtANÍ…‰· dçáàAÒæˆ‡JcµØÙ/9A½¿Š0›’2*OçŒHšç|?`p"Ôµ„H^b¸VœÜ-Íx‡,ù_ûÞÙd™ëû;Òmº3‡ÜtšLëÐw“,)Mï»0•è ”Oäl5ÞÜ Áv?¿ 7 f4~6ùQâB܉ŒÒ_ ‘ÿÎÇ_†+}t²J”¹Ãg(ª-¨e’AÃݸ^:•”•¬ÕC`”ã éD"Ï‘ü£tûâ*+ ×<MÞ,eö=‚È–ÁÔxºÆ`$öþT-ò¡Ùjuzj¾ï¬ÌWɶr’°Äc‚(ìämÆ`Ͼ._YÖW½0ÏbœeÜÈPòhtݹ‚L—¼ßé÷ÌÚy.78ꨈÚ/lŽ;’a~ûØ›Á0“L># ­I¥ß9‚|\îcÄðE¦®ó“º6ìàFܨf{— Zê¾;Ñ(Ÿ=㪒v‰Ÿ•&²~xoÌtµ>¦ÁOÓa¨šH1Ê¢À0‡rø8d1rn‹hT<„Ös¿G/B{¯ißV9É÷4‡,ó’ý<žÇN1Ï…õÐ<åa“ìPÕÒ³2'©<ñ>|påiT‰ÂjI'ÌÀWhõšn@Aáv‰_qy4JïñèÝENâM (ˆGV{äžÃÓîºS{$2˜K-»½º#»žë}B5ðbzt˜ Í›ð,-íÂÿ4ì ‰ ÎʃÕ·+có¦•ùÜ϶ÅÅê–/“ØüáõÈø#æ[Ù­C‰ùm {þ}Páâsa×U¢‚彎NlŽ—÷7ÐίをJu˜Ìoãc§ÑZ/—ˆ­Õ¨ú0BïÛ‘]1o9†ŠÂ´s4çNÞßþ²‡Ó8¦ÈQò£ÇôÕ+&j¾tø>Ù/fùV´Ø”X ÊQø¸ÿ°YEi] )¬Û\Šyˆ‡k9qÉ"ù«ðņV$ÒŸ»~y1Qvb¡-P}˜r&™œj4Eå2©‚0mìéýdТ¨W-šYg‹ùh~êe)ûVdžçbŒ:¿¿Ó®iéF‰ˆÌË5vÓ›YÂðXHŽ_XüÖÛ©À']ëøÓÝ‚B€¸1I®–k ô¢ù|U K†Ù˜ÿHí&ã‹Pv‰@ŽA‰îv¼4œy_R­™¹š»/k;€ðc‚+Ä6§K¬±µë¦‚„kê&p뽫ÕòÄAu6GæzGùw¤îÙÈÝlG(Iyц¥^Ñb;÷Zó÷¤q…ùK(]ÓŸÑÌ7åLúìf›—3[%îitœHp®ñËALøzjFÏ_xp<æs®ëöõZã¯ålàØææW‡ñdý=f˜Ö•b™µ Ú/’@¹”'Ïá…MQÉÐܦG5žsßÎ6Ø>K”H„t³Òw(Ü*GOö²ÝZýEB‹´9¦ÖêÕ´íµwñ—]ŸÐ%"]o!È·I——i7ʤ>›£,¬ T[®'ë‚‹b‡]7výÔbSšE![TO.OÁ< v×í+P1óÎà·´ ë]ЫÔ^ „{Û¹Þúô:—|Ž×a* 8îGŽb ÄúY‹žc8vÕ/ôóäyÇ=Z,â°  VaB. ½¼d=/¥0>6D¾ÓK}}ž¹ãœò>ŽTœ>¬'·2¶sgÂÉÆÒˆ·¾ãÅìx‚“ÓûZ·Þ´ËDBÅPnò1÷v"×b¶®éeë å$µ1NŽ´ŠªC‡€¡~˜-—éÄ0z&ÙX%ÝÏH é60Æ0»kFW_ûZ^ªéñˆæ‚Ò˜$§Ög”ß}Jפ€Y‡ ?Å2ãk®ÿ(Øg,êò~35²©K7ú¿nï™'åg>ÄPfGÇiÈ ©xdLý[,•€àÉ>?g®œI2â>Sª¨Ÿ#Áj%µ!‘ùK'‡H>5ú)õžó%nUk›tðaë8VËÇÞŒ÷aê0]d|K‹°pÙ‡ÂîÞ8MKøç°ŸôÇÌ\oƒHýZ:ýùÆÛ/×iÉqøEâ#¨÷‘·'w.8ÃllD3Ô}ãú7„éoÙÖuFAH²Âlý–ŒÛ³J"OClšôb}r”JJ%7È>Oûj« Ë pÀ²ú9»[V%|r(8¤­¢v „”¼]Æ»ŒˆNéþ÷€1Ð_oƒçÝxj=l0Ò½c6,'éj [Å¡˜jLdèËðß7ïs7eMD#ó®2Þâ|ò{æM››!îéïeø.×Ô[ á1ȶYb2SÂýÄÔ1îm)&+T=š/ (sA¥ÇÇ$l{)Gì6#Óø©¦HDlbFå«öœ+¼OëéK /»+4MäeS_v¼vhžß’®ª™’0W[Æw¾“ä%k„p¿$âVâùïQŸœ‹Ç¨_ìßr"åâ^¿ÔnÞºNT¾þâ$—Xç+‡¢«È¨è=\>ð —ÔlÛ@8’»LfÛ{‹,–VãËC¢4ÅCŒÌ3FŽya`D>!‘¦‘3I%2X‹“Éþ à*û&ÚMìœÁ{Çée o¨Åέ¯Ž.3½ñAÞNÏ5ë` ¿qA ùn&Š›Ýt·¡dq>ÕCв<\ƒx¿q(R11V ÖN'rG‚rLÛ‘Žò3*påðê|¾ËZÄþðVÊ}4N½¹²C½ F·‡]¢18A,­åŽ\[ GơӧŸ ÃØÙ‘¼·\ÆçÍ+ëû0°úq‡ …í—áp„Û`à–‚±£æ·œ×·Ëò Õ½1¡l"÷ UÈ€õ*¦ý®7xð.Æ<~¼tOÔ'\ÜhaoÍpIDZÈʉÉÝq6Ä¡;Œ«eko–µvˆXIl¦ ‰á¥-Rïß…¨*Š#ƒ;ŸÌwE¨‹“ïJ (¼ó¯dS1 }¸šÿ†jmGueƒØ H Yb4*aWc)&ú¶.UÖJ1´U#wL£Î•„{`bpÒä ¨¸Ù©RtÞ¾oãàJáX‰MœJ »éô¬Ñsw9PnÆŒu>XgåR´ÙîÜŸw—€ éè¸óS«p"~Ñ3e=-µW•{ZzO£?ç9F…°¹E-4mÉMCå£ZÇ×ÑöRägÿ4‡ÉøÚ“£öò÷˜'¼²0ʱP(hœ%¸ç:gÊÒúÛ»éHI¯ðNqžNÒ\i±ÊJ¸üQר»"²Ýe{÷ Ö§5÷di(Z&3ÕìŒÙg·óÍXùñl$EaÊlwñwQŽ4n‚„³µ ¿¤Zbz™¯zM<=&n=?0ášSÄ:3Yý¾ŠöWñ7ˆ³f>Ñ/@Uï‰Þ¿ ˦Úmÿ:C{âöI^/¡á´¢ C„ÅV“µí]ãaÐþåã+†XæMþ±²²'$ø+s„Bl..D¤¯b^ÃE݈èÂsk¨×ê;H¼ Pç õª œcø&µÞPËÕç/Åœ'´Q~•JÜU,_MBC+ý\‘Üãj~½“^%RZ®zt8²ã®JÊÓ|878‹j®nÎŒã<öLZæ·› Œõs…lß B)OÖw²á |VµjÇ¢éZË}bÑ<©-«*cõlj\Fíåê[Ù¦ÿ$;`ä)ŸlÂø3 }4°b ÑÒJ‡‚>zˆ>SÚáÓÝP¦h—ÐR%S減!œÓ~n  2C‹ùÀÀbýž8¯v4Z4`<ûMø1ÂÏϬB•QßÏ¿çEÆQ‘Fm¢t#É ÕþÒå¦Ä×è2#=h;éøtÍã‰Çjž&òúš›ÿm«§%óãýÜ%ˆÄáÚ ± #“Ûú#ödÜ›y ZbZÂ~”–IÎr?Wµè{15‹š7ÝÜ™@ÓUÄH†í_ ¡óùÁñª;lA8óÅiÞ4쯽ϱ¶8´¬Xþw8Ž {Ã1Câ¿DøkW¼ë…d´Ðõ¡o5¶:ÆAýè¸5w*6O°HËwìAS  !¹;/ð~£-W':tY ‘2¾ýy¨+3Ò'äENr:µÏIhÕôBK~ÙYƒº‚äôËE|rÓÂ3ºZ~¨÷éÕ’» ŸÄ¿ê~΂@î ©Ò[ý†ÎøTÕ ‘C;ýb$Æ¥\5h×ÅøÔß&æ…`e­I©IêGbÀý¦ ãÛ ©åÄÐôl毚žÄ£—†õ/¬u+ÈyŠAŠª‘¸j/áÅb%׆nøá#0B¢†aêOi ðïDm_ÔúBŸL}µ¥ÍMža>¬¹6itÁLWáÿ’¡®Ö’YÐáüÈ ELÄXð¾`Uƒ:rÏœlC8ãÔ—ŸûÆÁ¹U|Þ×r‹k°r˜Ôa [AÝ ”B5=y 3•Ž:ò¨ÈÌ6Cï˜ïd&0b.²ï¥˜Q8áë·~´VI{ DØzuÔ"AƒŸ›û<]ÆXUxïëx¦Z²ósov\ƒÏzçþØ_© ’èûÔ•ïè©}Ù/Z¢’EDôÌÇ!yx•¦V‚ôcÌÊ„L<½hdSþtè¸?ðA…©ßž0^m€£‹#þnæüqpÜC6xjsû×¾‡:ËåòûüæìEŽýŸhËàaýº;Þ%gOtÇFûÝ„k3˯<'ÕM9ò£&•X«v(ñãØ¹ã8M¢Ö(§ç ™}\êêm~cu‰u'¦QÔ4ÿ3ùÁk„ïzœz" âàvÕN¶¡©½¦B=<»´8iæŸEÜ+ö¥½,ËHÀ×¥ZHCvƒS<­”xO3Géšžìü>Ü)ÎPº%+/›¨Ã—’—öWð§ø› ‚7]Äš^…©Úå¿ Ñ=—êëΧã¢[EfòÉ®N» +9Ñ{%‹V»îóe©Ð‡4BKjƒŒ`kE?Ø’L±^&Ï%>ŒT¿¿®W=Áz’ŽÑÅò‹*KJ$ù²¦y @ YŠAÆ¡d¬þ 8H…¨!ö!ìå†GçnÜi8ZEÚC Á—È&¨©2ÏÖv@çoGÍL¨Õ&SdÃ$`äá§z«‡ ¸V¯ý¡ ú±ý~Ð|ìNpñüàý·“b¥gâ¥Pq rèi n·¤|d6FeíÖ~t6|–gÓ‚°5ã˜8øÍ¡âMÔ/Y{rv·Ñ6liöÖN­¥‰‚‚\­cýº¡j ®ŽòY#æ.ÖÚõ‹<±wàÜÒ†(òe2‹ Ï«U±kRTL,G(m©s¦AN™ŸzŠábóÞ˜à& ²üáÍÙAŽ/Ö¹:<³Wº÷t\b…fÔÈ›pa¹ñËó-ýüÚÐ*1‰–b¥:ÁïÐtZÇŸw[BNÂ@c4 `§GU“ÁQÜ„Â7ò—7u¼…&lºFŽÛÇ2X'lá¨Ö͹ëŒ(Å•ª4”ƒQîøLvJå1¥5£WŠÍ¬T¶±=cõƒ]µ^öŽí«[Ì™”œ¤‚pyÙ/U;æ….#=~ÓQŽV¹,þš‡JG„1mÃHŽA¸oðVñá]„rA ¢C/*54eöwu¥T’e—þëКú°a0<^§1Öï«áï6u¢·› Xˆ•D H´ÆÆÉÀøµz=9vdfµˆuCðÒ˜þ^Òl—zÒ‰Ã$祷ã‰÷CEÉ4œ—{Ñm]ìiåòsˆ”xÍ@šÍ„¨÷‘ûRÄUíÉký4$^€´är4òøÉ%‰ýªÒBë€÷üfu]òd6mš«÷tâ¾ýnÖ%„Dtĵ@U» ¸¨Ž`è:{”ò¶))ËRN2 ˜Üež»¿ºŸ#ŸÒŒïï®±­ÑúJ'u!Ïêl •t0ÚÙ‡($1 ²Š ®ÝÛ{e¼[§>_Q™è©³ÜGxlaaA(ÀÖÙMs…–ÅKC‹Z*.h퇉›…‡^[Ò ¬Ë$¤ß ›úû”ãOµ,=‡ÅOH¢Àü¼~·ÃW•ŸԴ’rƒGF$D•&yÀúÆ‚ñ²¸ÓÛÛY«w鉄ÁA2ÝáW_͈lý< fø%ÙTù.êl¡–‚í¸²º•Óúosèžuˆ¼_žZfe6ú‘Û­ òÂØor®šR§¸å©.÷n<™0žÄQWU~Òù¶Cb¨*„š±b;~´ øò,6ÄꢥÙÌ´¹D°—䎳¤äi¾>‘|»%ÈÉXJD+ÃY –8|›ÃßÑ˄׹ßjè ú…×–V©B?Ùx{Ð0]”¢BÀ¼^¶Î£}OlxA‰$‰×H±vBæ¬Föè¶¹§ƒº2,ôa‚ÀØS5Î ¹oÕòö&GµqÂ…E\èQq]µ«aÚD,´¼4 ]5kZÏùè©ÎÙ庞å¼ìv9ªôÙ—!ð¾‹„Ö Æß‰E'Üí€j?t;¤b©`8}maï;2[×û¼a^uõ¬ Óf’0¶k™Bªë»Ä¾5„ƒ6­ŒkcgÜ> Ð1NÐq/@뽟’ÇR¦åû »v{ñëDµ¾\z$1Äõý ®PeA¨Ù+hIH<_Èæ†Ÿ¡$]íš´êSwŸ­>¡ Ú¤Èçj¼ÝlæJ³“V=2&1Rh¥6Ô­Ô7Wü&µ×éŠÄ8‹ÿ€“\Ø!¸%*O×Àó çÉ~ø9ÍÑQý&mªê¶ršg ó^ºÈ¶´WÔØ9·íùPBØ}hú6ãl‘¤m1 §áÞ õ"É\×pï‹Ç7|§d')+%ŸÔ§YõYs:"Â-Œý_­Š$ÊÒ‡_·ÎqʤM)«ŸÎ3r–qÝä<¿FV¶A+ÓT0B0KaDb2)Ún·]5…ý 4H):ÆT.̆"¥•¨TÖ'ê­ì€¢¤$D>9¾ÏâC'>àQø®íZor¤¡»»=ŽlåÔ™ Ÿ|`­ð\§(´V¾ÖèÎ>¦à¥Xµ|_`³ùz *ƒüùù³mF¦ *­9_ÆŒ•ïÆüà‰Å9&Òrˆ7Þ;ÒÜy(¿ûAœþ@Ï Q¯nÃBÇåA¸¢[V›Ên—a¹ÚÙVȵ†_爩Ùs$ƒ6MÕxk·oêzß_¥Š'?çë‰+Ö/ì©A6]?(¡ã“[Ø…A ÌøZ\1&: xdÊò6¯çµêæÎCØ<'<­±%Ä«oÞéOÂìÇ>àCîÆl3ãˆR<áÝi£Ž"¡ý·û¬c¼Àih/œPWƇZÌœC¦‚Öt÷:é)¸´µÇþ¾%Ñ©Pp××”QŠÓø#xX6 –~w›scVÐÖgÖØŠt•I+=SyÃs1p!nzG«Æ—Ú+b'[=œÞ¶¢‰ T¡wãˆ`}Ä9“—È\VJ+“HµÐ7nm¨D‚…v¸»éHÛTváü}õÜKo?6¦ +ð%Y¡ºƒ!\óÌeʺ8§ÀÑi¹B;žr% kãvà¶ÎGNkF²H°hÜ!¥ï—!n׌ëOHÖ@ˆ¡¯åÅ ‘\2שùR¬Bé÷ê÷寵lºëYP8žówß ?E)!ýäW(• ܦ|UÆ´Æà•¿"›9ª¹¸yK¯ëà†¾v/Å( ©úÁ\ãîçάîû!ûy^I¤¸¨¬¶Åì.")pAT§(Z2¯ 7R¹QÑqxë"#ìm8ÖJm<îQŒ¼:–´Ÿ7ØùH^és᫾kÍ|/$2çãÉÝ:›¾Â4zPÚF3:•_àmD±æ.»H·jÚ{k;1-¯š‚ëX—%›i~Ø> _÷ÿNÄäûþÝ€¤I^ DxH˜þ>Ë —<Û>Óš‘ºÌyµM[oW¾JÏãÔ3¥±탸hyBÒÄïøç包Ûåíæ/}æÑ•OÝQÊ´{J©0)ß‚€ÝH·½öøã`bxY îiÝ}ý™t¶HѶ)‚œê{~¥¤~mœ­ì­I‡ûÅ$Üj£[oòÛÃ7¬vJÁº“Â7L–(¢ ]q>k­á«œÀiIP?U5â€4W;ÌŒÕ6Pèyæyâ:Hnñãk†µtó´k}|ilûØ–|Ò0¯C“4ÀæÝ>f’–‚žÕIRêVÅâÀcb[B¥„Ò˜Lvµ˜5§Ü1#D{ ò |’V6o`Ãã-òoåH—Ü“‡¿bÛ¬n3xâ ÎW(׋rK!6§OþÚbúÄIq f¾Ûƒµr/œ: uྣhsÎW¾"Æ>éò—¡5:ÌA÷£N=D7kkºF[°¤[ÓßÝþ6äŒÃãøéúº±—dcÎ9Ëì³E Še[mœ Ý}ûô'³€ ÷Fžw3lO¹?²wTG'[¾€·aÛÝ´ýHF>_æ¶ŒÀÏH±ñÞüœ'È›œù~Bæ!VéßT@¬88“ d%êkvïí Ãõú•£9¢áÖnÐǸ}½íEm)f»¤Á[ÇË?y•jö¬ýkœ¾4|ò‘—޲SÊ Ña÷ÎVá«ÿŽfF?q=ô÷¤qu'í´£ ¾_རîðzhy£Áâzìb Í«éã 2qOBvDÓ…ŸÌBžõ‰G1·¿îÞY‰ëåÛӶ✉d¹<$·{ËöR ŽIµáÝÂGù`àÁxø\ÅÖ¢ô Ë#*ÁÀš~×SIßEÃÎ^RžíXAÚ5î{–wÇ×o­²5 :üq¶Ï9›FXÊi¹á)U¹+'\ˆ6hY ÞC‘׳~«¥àŸ¬ï¯Öž/Ц ÑÎ+`‚Æ£°öa Þu:Û gH/=Úó›,K œ¹ªWûr|WuÿìŸ4;3“Y{%g]Pxòé뎱nj/Ö¢\眓 )Ïc  KTa.)Ø_½é°£ðg€“"qJÚá×>ˆDçz<ïÍЪŸ<¹æÉñ…-†,Ò¡]J‹×5 c5A;J{l†N'‹çQÅI€å£ë™ë˜Ý¹(“êGÖ};Ùão‘ñK=û±mxóÖÞn¢ù÷›¥UZ™~öïΰv˜·Ôu#ÓÑ"tØÔ“ý@nÇåY}ÓÜàž‰GÓUÁ OKô)¶“ˆöýÅ<¢Š ÕY$íÓΔ!ÇMÎJþ9â&õÝ=ìDíQˆOQ^éÇ›r­pù‡:\}[Èkõã…´ð{í:`{}ÇÍKKq#(z~Ò}ä}bµ$QFJ.ËðR/- @HÂ!¥&Ý(²¨WGk´¬ aõâÂKO# „çÍ?å3½ùà—áÛIDp§N‘¸¡Ûk8ñQÙÄ®ƒ­&DaP«çþ`\$ínƒŠl•¼Ôn ͺž|{mæÓy“ð-¡îv“§ÛÉ”;sº-*‚±.ºŠN×ÿŠFY4@<~CÏG. ‘‡’ÎÞZ4¤ýÃKÃÆ3EóT<Ž£s¾Ãg°Ž2L°u>Îïé£WÖf:­ã@&À°ÀQ?Rú¥îºIe¡öË]Rëméàÿ!1æö N}¦áU]½°0fÙ¦„`QÎH¯j±‰Ë_…a0L”¾Çª-Ø­êË2¾áÖÚIMöùSˆþ$Ùñfp°1€‚[õM·„9cM\Wõµ’ko®ž¢åK.F^Çšç±ýA8Þt8C»åJs›Ý]˜R$¤`b‰—U›öi=k/´ð‰ÖñÈ­¬tãó Y?ðæ™éËÞOjC oØ+,ŽyIj–Ô]Ö2¾ï¼oë÷Ù¢úQÐ —.‹ðò™´öÍÝœku›qy!Ln":cxJñ¸a.FÕj §um:*£Ö…È¥Zó…÷[Lq4•v9¦ˆ©é†Åh ö ’E=ˆ÷3™Z}°_øíÝ¥)B}éÐ¥2S³RçÆR È†Ãk;V§êC;)Ä@TÞ,±J³Š¼]õÚoÑ7 Û64¶æmXõíÜ •Q[µÊ¢Ã¬y†´ÂòÕ¦D•?Ñ¿ ƒS¶ðF8+§íH†Ñê½í[ò|1s ©u|Áéñ¦9^Äé¶ÚèÃ3`ÛhÓª:ÍMI/ABäO¾ÕèâgÓÆd¿luÇn7àw“-åO¿)'ÿ¿©ŸwM‹GõxŽ ãª– ¾,5IuÓÌb³©î) xÖÝèÁiF5—wÂú0æ[ÇÀ˘ LÝ(9ïea-¾«KRˆ“šÿ.nŸ1äùbM0)2$ÈXÌ+ ÿˆ ?º˜åÞ,„¸¬ï¦ÜÒ¯:¡þž£”Qâøs¼âõ®‡½Ô ʯ!B6 ´Ýg‰3Leé)a !¡f!á1§LõvÊÃèF²%À §mÜ:¤RL|C¬JÜG>Äž µ:ZW˜tn»‚ü´Ù/+j©7àoµŒ½èW?øwÈÒ õrpt÷'lœÙŒkn¾¬úæÐ+=² ÓégÖÆYx?Ò ]ŒzÿøL”H•¹°ÊÅ4qó½~4æàPøFL4C2÷ËŒçmAôZ ¿%–zBM)Õv<ómm9Mç.¼Þ‡UŒôG¸ñåÓ¥.^†ì4ˆØ²,qÙ{—¿EÔ'” S>×RØpNæÀÓ/¯úI7:8šöð>æÍzPpkvc5A9ªìSŒ~«Væ”(\eǺè„9¬â=il¹œ ´»~½½WAÙTÃz˜U€šºU,ç÷@¢Í!–3ìX ¤ ÓØ‹PûH¥…<×%’®EÛ†DQd¤¬—§ýå)kÂW…{pÿf‡Kº~äQçâ>ú, XNÑkLDupïÂÊ fÎ×—G‹"ûhNÈŒWÓG¾¶5BïØ ’xQ\PDUÉžÀON°yƒø} ó½$-±óëSu’\ôÙÍ@ž~ãö¶Þíi®93݄әüµ„‚˜Cr©‘:¢a@~‚ðÃ(Àà Öå¬V™àKÛ—ÉïLR¿ÀYùnEðá-3ZcÐ$Ïs¸«E)«î^«xÓÈí=EK%Ó¥Áhê$£TÕÌtIò_²­åϽ?ÀºÂR[f®K­g‹V@Åí}ŽŒþÎŽ•‰iDñ€./±úÐQ‚+P %NÆŸþYuÔ­Þ+Ëpav^í¿ï–”CŸWÏàs„Ñå$ìñˆƒ­Áìz$É„LKˆ¬ê,¨À+ñ¹oå» qƒ5..½o]dðÍ6SiÈj-¾QœßnfÈÕÚÖºõ*%·6'ñæÄ9A@À¨Ÿæ@*©}:·†9kMÏì¿çNçéÈአïï îçŸùyƒýG•1¸îüs¤ët›Ç±c]‚B<¯›-ÜIoÑ úÔ¯§Êaá&޶¹GÏ Òà@#¶.µŒÓ%â*²¤)%p!rƒ~®Ô“*ÓMtæŸÅô©5-ÓG.ˆux >A€™ÆœpRÍ©tce²•¯¤¦RÕà"„"8[öX½§ëõæúø©—žÓ"9taŽIÿü)Oi·±òCý`*=³@ÚÈ{Œ«àTéEÖ•áY±q®Ï´I¿é6Ú|ÑÃx¼Ñ¿³vÈK¶³¡xsÛüöi™]¿‡C‚â몥«M2æãî½;„@û+n¡NzO´š>‡GØy[“ÛS¥Npøc.Ë:ƒH GTûÎïÑV§þäö]òÝæ3&:ˆ×(™Ìà!'ühÕuò5«!Ï÷ M¾µÝ׫Išp}Û"Îñ ÇÇ(†t˜™€*æ40Lá,7£stÛ­ˆ-6+@.ˆñëÄÆ®®AÈÞ˜ ˆd@oK¯Á^#È"Í£èè#På9ŠBCx1XC—Ï‚ ôóýÔS‰~àêÑ©MXXŸ„p(pÀ#ö˜þ<ÚC©å/¥ÓÿE"ÑÓôûEñúî¡AB‡,§B{ûK½O!_å8íÄ[*<¡®ñ´=§¹É’8’½Á$Ä PW‡zo˜=–¹œµíI›(»ÁXYt¦Õ–Ã9áøû‰)Ÿ&cæu®÷:²‰íäþÿÈ lî endstream endobj 40 0 obj << /Length1 1554 /Length2 9374 /Length3 0 /Length 10401 /Filter /FlateDecode >> stream xÚ·T”í6Lww C7CwJw§Ô0 0Ä 1€tH#(%"¢¤4HƒtKwI Š€„tó¡ï{ÎyÏùÿµ¾oÍZÏÜ×®{ï}_û^ÏÃʨgÈ«`·ƒ¨Àa^>~I€¢¶‘º?€Ÿ_ˆŸ_‡•ÕŠp…üKŽÃjñô‚Âa’ÿ°Pô„€2%âÁPhx»„¢’b’üüA~~‰Â=%J ¨=@› ‡A¼pXáî~žPG'ÄÃ>ÿZ8Àœ 1ž?î7ˆ' ‚´A'ˆÛÃŽ`+À†B~ÿ‚CÚ p—}}}ù@n^|pOGYN€/á0€xA<} ö€ß%t@n¿KãÃa9A½þR¾ OàAà C`^.Þ0{ˆ'àaw€¡º@×ûËXë/ÀßÍð ü;ÜßÞ¿AaœA`0ÜÍóƒÂPW@WE‹ñÁÁì‚\½àþ Ôd÷`ð'u@EAz¨ðïú¼ÀžPw„ŸÔõwÀßaÚ¬ ³W„»¹A`/œßù)A=!à‡¾ûÿ>\Üð/ä…Ù;ü.ÃÞÛh ƒzxCÔ•þ¶yáüGæADøùùÅÅä)Ø ø{#?wÈ¥ÀoñC Aîpw€ÃC ¨äá'À ä <½!AÿTü7ÂØCÁ€Ä ÃùOô1Äá/üpþžÐ§€'üôðÿþý{eõÀ0{8ÌÕï?æŽh¨g¦ifÀýwÉÿV>~  àð Šð…b‹ ÿŽ£‚þÇ?|Õap€Ä_é>ôé_)ûüÍŽ¿„ðß±tàÌ…8þCtK~~ðÃCàÿ™î\þÿXþ;Êÿ•èÿ›‘Š·«ë=Ç_ÿ=È êê÷·Ås½S  ˜ØÿššBþ]mˆ=ÔÛíµêÐÃ4(ÀÍ+ ÌÇ/ü—ê¥} ±×ƒ"ÀN±æ/¹ñïys… zp/èïæÁ‹ŸÿtCvy¸E¼¨ùGy˜¡ÿÞW†Ûÿ6AQÈÓä‡ópÖH ð0•ö§È òÁàˆÀCA¸'ÎïƒU‹þ 1ô$‚ÿ~g´ÿ|ð„ü €Nÿ€" ôPtýÝÿ|=ÿ|½þE@Ä?àCŽÞà5ìíéùp+üaìC—þ…ÿ\AÈSga–Šp®Žh¹ø¨@ëËûmTP¿ï(îËtS™ÚgK?\QúòX(/~^¡cú{üåÉ®`Ñ}ƒ‹¿‹õj`F¼$ÅBm ºƒÝOà8‰ÌÕ®—–·àwÍöv [!˜½#ÅA£Ágßù)NJ_ßfÞn«J³5Vœ—;`²×ÿäÃCMˆÇ¤ÂC‰hUxÛZñ¸JajºMÅëH~t/å‘ÊöeFï È×¾/%<ÈÐõ Ú|wÍ“·;²¯t‰ÒhÚŽ¦X7»”©®_r„Ÿ´D„qØy Ê1Ke©oŽ©m&¨86ªõ¯¡ö¦£*®½d:\ÃVxÿÔŽý«µW»Rѧ¸…4£!ö’®ÒRURlÜžyl•‰ŸÕ|ï‰5µª&’­¼Ò²¦2 x†2Iëõ æ&ÀØCñÏ<¡<[m„†¨2Îoé&TÃee$ŒûuM¿Ën’O(:¶?¬*Í!O¾¶°›>“$w‘ªö©û»í¯²á³Ç}=¦Cñ6ª1=³8]±ïª@x>ZLî TëW¼E…T¹Ž[õÑAˆ£æuùj¶´âqó©Ó,ÛXuœg‹¹^ÄP‡©Û¦ º¡h«ûˆi”*ÿ›ªŸÐûÌW®Y‡¦é÷‘Œ«†’âpKƒÆr<¬Á<‘òei15C¢]Á«rq†íÕ%=5>§,©5'Ð&–_ÕºÏqrß0¼7YÐO’ÛEZþ%ˆtTZ&$Zâ\44jDRíœWÝ‚ô•¾|#ï•Äiû·î*æm™"L>;’£©Ï¥4!ÍøªôSx »Å?7Ãr¦™4òhI¾\½/É€Ô3,uj¸Ú~êg/îq¡’Iõ¨ Ó`‘‘Pó[p°ŒnϘùÐp™>÷JØÕC»[€U`;™ÝKÑðõ‚ÄÌú'EP‚1µ3ü·ÔúpÛÖ ÓN?¤É…Rö\?Zƒa3£åT^ñáZADô2¹AÆÖ¶Å£ WAhpzøSÇO*¡½¾1¾õCÑ(Nÿ)XúyÊ—Õ`§ò8VþÛ/ÑJåßÖ¸£=ö}áI%™Õe½ÕFú„„çkaÿ*tÐeŸñ‰›…Cd† /Õà|?Ñv^õI)ùÓ±y:m /¶ú~1*V,.™¹úÖ”Û÷„XþÉyB* ¬»ò/]²'ÖŽ'í¡(¥Vï{‡Îú?H[^Dz®¦ÀÆL9ž‘‰x«S¬²M®Øç©cç;˜~lA”Z¥_Z¡·í 2œ¢Øm¿C7!@©›0 Õ=-®¨ÃÿÁ–j{»í´f楪ÀT³ÁºE˜Ô7’Î4á´ß,}_—h"&FRáÄœÆL›i46—ƒÀCÓRD¦wÌšþd`p+”»¤ ²í:z•”–¡Z\i tš€yZÍ>­‘`F΂R:%÷²\¾ßìÁÅïo?³/7Y·ª¨/Î3/’=ä*|ž,<š‰2äd+éH«ïø& „‰ÐY{õY‚©‰¹Y‰ëKIË[’¯~~–9€" ]¤|e¢?¦—Yú ¾'À_ Ù4<³éŸÞä!Õ‹ŠŠH&ʆy2 6œ"!Gb'r[íµõúP”EU?_Ýïé¼3‘±Â3& Ý\O ,]G3¡‡ŠlI=:¦ho’ržßÐxvÇ}1ßÏbŒß*)äôKæ³–&ÅšØy?mí¨ãj"ùk'B wéŠ#ŸìŠa™…ïåe©â"å€ìä…½ç&q‡yŽ—Pêˆ5Çõr‰_r±\Iåâ•W)R”—R¢B˜^„S“îâbúÆ\[hRðºa7h¥¿GoqHýÎ@ÙiéS?ê5=]s(2ŒÑ}?/ÚÜþÜÕC=?Y6Eðê”àU;VõÝ1×”ÁR@e>sÊÞ“fÚ¡7^ ð\eoòë h€8_ÿ¦Q-•ÿ…wÖ&yhÕ¸aÃ"ü9ÐܓݑS„l°d[Òòc¸á{óTOÕVÆ´&?€DÕŒg·28ëG-¨ÎÑ¿¤bN=öšE>ÆJ7·ì½ÁV½ò‰ÞIí/S§Ú¤ù‘V+"rõùœvÿÅšßµF™•?ú=þþ¶·µ`»‚¿BˆÍýØ'RX_Ò»_óµoë 7Lq:اýlGzW.™ªáÁ÷ g°Ä¤6§ßoÕx}«î<«¤¦´ê }Ö’ÔåþA6(‡¡Äñ /iSF¶#d{Â-6yÁ?GGä&›„&`ò˜gˆEÈ´‡DHvìRø^4‡•Ó€uÐnY|Á¹8û™(f2ƒÛyfÖ²>¯"þˆ×+͆é{¥°ò£:˲p!Êò+{YFóÅÑÄ]‰fíýjŒÑ4 ÉŒ}Íz2Ör÷Ýã­%òÊKSj¶gê¿—èÔOݳN I¸šŠÝ<¦è»ÓÙæ$6v)2œUeû–€pùÀíd"ÍRlcäX¨µ;_ï}‹vö—;°®ò»©â*ˬZÚÛ9æ¿+§ìµ": Ùñ,/dÓO›ãÒ–9¡ mõÎaÆì»\ýS+úxhÓEÆ÷C˜±ìÕAXîë`ã-ÇD‡‘\õ³Œ>2|€_­oý0¹¢V^z·}ά˜Àkë(CC‰Yá°Ì‰c”R­¬rM ÉT÷V&{—S¡uÄÉèô’(IzQKÀz2®jîÙÎ2›ópðþXk³£÷‚¬U<ÅIr×ùû­Ò70]´¸ ßžë^ea k 1q^q °ôbé{‡ ž•4ö:ì|ªjúÇÕ²Gñf>tM2/mýù[ö@Þ)¯p¿HòYdÈÆRa*„øZ9vl¤ZèK:AÁ‡\º´‹þ\‘4çâPŸrÙ\Œö| ä÷znA”áൃ±vÏN) ©¦71k‚u;“~V|—XHìÜçìü[[H–E;$Ú­IºaŽ«}}?T¸ÝÂw±×4&V_ôo*z¿°ép¹^íµEÔÎ^œ¡õUe´+ V’6{Ax:®6zÞŽê3=~„+k–.uDEÛ;Ͷ΄°òi3:ðÈiêz qY³H¶£¼ 9lrSsŽò¸m.µÑ¤\‰ÿ,Žv©Ö[?†_~°ÙÝŠ&úI÷UFæ1yöqFOætRôqÑqéÀêâˆø…±È“&›)‚ÜÎ Î톌ÛàúÕ`¸äým£Àt‘] ¾Ò‰[Ê !ÛhÔÙörþsðVÃ&,×`éY‡úYŒ{­ÔPnØ_Ä’Rchïqt9ÆÝãëgi˜ˆ&®çgÈÂ7"l‚¿~íæR´4X˜Ž±ÜµkëKêµ wXîwŒú~8kûÈ;7ʌޯÙh¥ÉGœ—øvëL6bD©,Ù›Ia5% ÆíûÆ÷?eýÒ.wg‡ìs÷é~ÙÙчhr“gf z¬”:8ë‡'FuÚ¢£1áÀ~iÎÁqQì¾ [¸XeÖ\¦¤¹© ê¢‚·1±ðú_×qëÒR ]÷©9kÙ ¤Wäϸçk#ÏÛïò2cpoï#vÚ«kñCÙºå¹XuCòæW G;ö“¸îà"Uâ/zçŒÁ—R=\Gº à!U Æ,áñÙK+c$úìúÎ4ÿ†<£“â bç‘ýE‹Õº“÷DîCHE¾¶­6""f†ô=†+ö2&U]À£gëûùYØ…Ÿ.Qnµ‰pPöY‘ù(*8ý`é#äÉñ“ßU‡ï ]ä|,ù›c8¨ûOÁGN.>=5{µye£)ÉÄÅKÆÕÇne,E| °ús·e« kÀádQ,›?:&ùÛÓ¦W&­†WPc…„“<îe¤©d–ÏJAÉx-§ª§7?² 2Z„}î=Î58Q|–µ²íYCIÃö’ºO2É&í¾ØA¨±fK ·WsŽ’¶ ×¯^ô¢»úaîÎí¶¶Øo’² °÷+#àìB#›Ù}âô@Ár΢Q"¼Ñ³H)ßRÜ»óâiê÷ûKü?·L®QŒíøCfαP—]’Á2þý‡§ ÍK5Û[ÊWgÂ=ÄW„8cñk$j ªÖoì,Ó{ÓÛ‰Á›­Qo:.»^TL*‰¯¨ µlÓ•A_˜³¸°–pfÅ®¢d¶¢WuŠf‚oC§‡L):}ÒÒº|`7Ò––7œH¨huÑw .m’•+ýq\9 øf„$ª ¬[ßj×l·Ä—]}”À’>½077¿W¥e¨ƒ/Ò¥"³ÂÛÇÈ<'Ž ˜I™v¬Jðѩ˜ÕGi$=]’¤É)Ê*D›²hi¬pÓžˆn/-oC9X»\qˆ³n!¥½2*â¸CÑv;xUí»kÕˆ™›¯²Úõ…ºuþèÖ*Ì9[Ðn˜Èv‘MVS/ zÑÙTVÙ\ï˜"óÉ–ÔYÕÆ°bS¬BlHð˜"בgE^rK(O’õ`7~þ®X{˜¨Ûô$ªf†´bêÿhÉñR&ZúP~­FPK¸Ïºµm¦†b ¾F&ÙqXúúëÙi¿†§»ößnŒ¢s8žÞzytœ·í×/Ø—ÁsÑ3„fïæZ2Fv ºsá¯ÚdäT6Ö3çÅp î ¬ƒ×®î0÷[®!úúZb»¤ ÍGî‹H9Vã„IɳmjÝ?¯CX·6 #ž ƒ‰;åÌ”Ã×?úÀft»rMeö%ìÀÄÒ‹_&TÞ¨A/k»¾üZ­ŽœŠ V%m1æb(tzh  U~ÙäÓ&¶äåìQ—nmö}%?5íV§0#š3n-?µéD78`ÿl{„²¤\æ­Ö—«v Õ7fþ`Ôš ‡tÃ?íy‡|²åÞ†[À»¨0Tƒ„üYºÇ¾$ÅW½Q6ºZÑñ¿§Ê°ù,‡nãÈ"»ä‰I®°{ñ8Òß°º³”éwú ÝXÛ¢'[U.Ë u¢L«ÿ~kž[eq=ÆÁb‰»<ŒÇ/¤‹Nx–bÄ«yP²÷©Nf]åö3M3 óV"ª7—£þf!ÝKZ]»1\ðcî+lsß—(Ò •رŸ•ƒšÍ­µ”Ÿšq2:p™™‰“~æшqÀW<ZÜÁ8– õ}ú.•úQ@ÈžŸâÉ2ž¢]`üxU9.QCs†TÕFš©KgJjþfֽ殡ÀQëëM Dÿ²i‡WÞP꘽ÒGt,3µ+’·–ö‹YÉÎm!œBO—Xa·ì®¤6òMÝ«J72Ëeuw(¹n°ˆì¸£¼ù¢Èf7ÍD—Äíׯ¹†þÚ4qy‚›ØÊ¼È³<¯ºR–P”vc›¶…u—xculø!Çý­ÜËš>¦2$¾â“ëNž¨œ.¹.=q]f{»EFCküÂÔ÷1cÞIòù5̪Oœ[]Ä×ÜJ͇t©ºUʘ©ÿ5Ãɳµç:ÔTKè$M‡ÂG™QcË\Ë=§2Y?E_À¹µXG–en?^Þ±5×ø <#ö*õðúÞQÄ£ÿõ£J¥œA›ªè-zûÅtæÛ;9?<¿›]»gOÇŒ)µ^¾0%Ö?Ï—'Œ2^â­€,n/4}âV§¨éKC2š:Pûöí7¸)è ·„j­Ÿl4¡ÞZ̘Oh-êþúî§Q¦ŸÂIס‡Œ*ˆÄ"mÖßâÄ®ˆ­Kÿmœšàí>Ã} …ì ÆD”dGÒ 1ÀA¾Kš#)ì;̃~7=¦Çé±èAµsÓöº§Ï§díä«ÕË’u#…áx+'_u5ŠÏóÏjî¶<Ó§§”Pc%£úÅé]šî墩Œ2Ðöy®ô?˜oa«7]oGÔZ4w6ƒík®²[ú1Œ-Ï@uã~D! R]Ôß›¿-˜aú(GS*½ ³xP/‹úôeí5ã%ynb?>®öˆÂiÆ´Tåù|\Ýý†~[.PpñEŒ'§5iÑÚô¬øÕJü[rƒÞùSÇU﫾Š~ºI?…&ª…]½f¨Üãêv9N£xÊ91áV"ÏžÀx2Å­è+³y([Ï › 0qé„XL7ô¤;¦V®pÙÖÊÝ,¾ÄÌ*ЋŠSÄUŒh~wtÌ©5£¬ô…¨kiò€ÆÐp NƒÐµ‹Å.±|ƒi$\¸>¹õú<Ñ{ÚÛÁV(•SüP£ç BYxöf{‰´÷ŠC‘q~YÉ®ó‹n8C¹ø)Í‚3ë^ã„ù^oצém²ÀQfÂÊ«­ ¹ B¾-›O"DäèÒWº[€„Ë 6D ¼ËÄCªô6¶y1 .êé.§ffåÄTë<–*“Ü9PtSË ®¯Rj.Ë¥írK¹'ã¸FŸV èùREFe=´ù.„X–@mjG¥ ÜóEG‰\ñpeʰí•2q¸QŸFUƒ2ViA"® ššªi¡íDûÊMù\ÕÝìÝtöÙF¶T3ͦ÷#J †­·¥ºÂr#<=;Köí}UfÊC‰/­•l íý Ý›á¯-Õóz¥/ÓY›þãÙ-Òî/fh%CD('à`k÷ç­ Kñg_ëÈuðNmí¾º?ºGësŽ{öKÈô{‡%ÚµìÉr6]¤Á€%g€ms‘9rïrÈY‡+Ú;ÌÈwc±ˆgÉ÷åjvú·OJç`Þ¸4_]½d&ÓÎ(¤_”öÈyeŒ~E>—²jLS°š°ù¼NA˜GÍ‹R[1"g9ú’å[ŽpBc™ÏÀ† íêE’¨øü³Œ_u^oy­@rÚÊ–ŒÑײùv‹]Y×EâéQÙuÛêa»ÉVwÙ$¨¯‰w:ÜM›ˆndFšËàþqnSÆ£Ìç—øóQž{4]v¹ÚßC'¥2xC¼•üFDÓ©9}(Þìe+snÓ¡Ö¾1@^#žQ:ëEa| <Ê_~3'ÿcÔP£ƒ4¯=Nß0øŠ7÷¡ÊmP‡‹Œì ¾/ŒÐ(+ûöîKêT3+C&%Ç:“¤Š,R:§Î¨ú…HRçG‹1•4nõù¬àÌM4š9O6ŠZßá;]¾«ÁÓ(âÉ[ fN/5Yž/®Ù¥êy++¶èïu’²ByûNx´º ×”ƒ@H±Õ–’ÃÄÍòíI >D‘W50@ŠšýêpŸê.0¿Ûe§‰ˆUt^Ås çÐvö¦NÃ^ThŒº\'„9zJat0¼Ï޾t6Qål¸xÉyeޙ˙¤ÀQÞAdç’㪽ù# ê¸z„\Cé2dc‘§ŒqË#Šõ>³ðAã+6z»–k„Ø ßì&½»„ÃÒo’²smúÓž(ª•¯®ÕwìU šýXçŠ5‰L ÆV”Ñ5‡.‰›¯çd)7õÂÉêmõŸë‚”RôFܶIÑ¥ü­Ñ©ëN‹E¡áoÉB˜’S’Ùeá^2W âÒ´|\¬’¬lˆÊ×r]Ì6í ¬jkû¾'•½«4Ì W‹çvê »ª5«²ð*Œ¼ƒÌѪœW—ò4xªVм04ƒ¥:½»óš©“ĺ—>G̽ÆÈ̼éÔ`è:8à5×÷!Ý“V:‰‘~aœ—˜z"ä&ÿ@ÎE脟nš©[=¥ú$w€#R\Û7¯Ø'GãZ¢¦é©*º€RuØDãeJB×mbòæ+*nò®ðëŽg¬ÍÎNsb¢ûˆÝi¶Ž¥Qý(ÅûÚ½¾ÜDQlìü1ºdbåø9J„•­Ýô)¢dÉ[[ˆBR{«‹<õ³‘‘ÊDiú7®ö½W)"T ƒ LdSsû«Fó ›Q‘O‹ÛdHʾ;V¹CsÖšõãò|"ƒºŒvôan©áøxe›Ø©»ÄBtî½u¸¤}“ЦDO>á½4ÃûÅ¢Xð|9Õ@’Û9ñûÑ…­9N:a‹£„zå ’‹0ê}»Ó!v÷ò¼õ%ØÃŽƒK æÕ¶âž·B*oÀ‚ç.5~83-—*×!ƒ“d ku³YovFzœØÏ§‹sïHÍ¡TCyY4u›öL6,t?{~ôIœ ‹xL Ó^~ï¼a¼¤b8ž<Ëné§Ï*š|O²¤„ß¾1vgÔôˇ>?µµ ŽÞð³Ã`=à'УÁÖ!öã&šñ8ˆ¯Y¦M~²´QçÌ|ñ‡Œ‚ @éÜ£HT‹œã5Y@ÃH|²ð{6(&OOvdië ÝÌj± k麰÷OÕ•Šg OÈ= ýÁäÑ›Z,ŽÆSütú‹4:4ÖŽöÐÚCrë éyë ¸ÎdÛW ó{'+Ï,z>ãgös×>¼®îV¼{¾]õÄŽÔe>UñU±ïW¬$"RS´>-[dKÈÙ«K&íÞnó_6á$Ò wlßxV€r7Ë|‘®Lº‹Hv¢Xê£à׫=Øï(F>ª‰cøöà†›¼cÍÀ¬œN6“þA®VÏK/މ;ñ><¨<¼×àæôüŠäØ•O´ò?wB#À}sÊàj:A8gxbâE9ÛP3湕´OĭlEÑ^¼öŸÖsœ@…D ™ÓÃÜVÁ9¹Ï¯1|âŸFÝí=ZƵyOÛ}ɼL5÷tªš±ªG¥=CÖ—b›è)wWª¢ûâ$óxeWÒ%O Ÿ»Ø!?Ž@|¦úFÊ"Z¹‰‚è,'ï‘Î ¦ïÎ.;}DŠ~ÍÁANLõŽf{ó:ýø~Ü‹—B÷œå¯¦ÙÆM¿•ôáõ”ëÁšø¶^Žg«O£fe:Tr\.®ȾÞzÎY‰ 6æñWÄí ï¢õyþ°`ÜRËÆ^¹m‹Éà ÛCHör¨?.ôMk^ÓÎWX„ñ´I”¢‹„?³€Í¿tþõÖWzéî½õ¼íe¤V5:Ãa»wz´µ¤9ï5£s”‘ )®Ð*©­h{ZØ3"ï ÇTn¨b°@ž¶mÚþkÞ[Ñß $Öm|ôª§ƒ?ÛÙ¯“zâa½ÖMÈÝ-Qðn2»Ñ ø–´ÛäÙºívd¡£ü´ñûæƒt”û¯ÙëŽÝ€èêD£´‰{¹toýòŒ¨XŽW <¯÷Sž¡ÿ,¾VyG²BP¹`t4ºfèlõ·7F”jÑP¥wa37ÞÍ5;­½5PŒþìµm~ßûZS=~@éI¶±}bØ`ÈE+6ŠYø±ˆ˜b)0P_q³`3ÝП·$†ÿùÂQAåPÈn”÷ËÆ}[ÖúÙïám*ì ^ÏMØi_ü Œ’“Qš õ{ÞðT=cy>>!©iæ‚pè¸STcâô[xf1ÙáP”RãÒ|LÊRz°behúØÍt~¯•†Ç¤ª+®XSú‹ÕÚ¦±v­uˆæ¥L9¼™ê±Ô‡’Id{QwÝ6IB.P«4ÿƒßx&Œ¦¯þÒØéL9;³CÏ"‡pmÉ@K*"á&CH¼õ)àB%´5yáOx|ºCx„#ˆ/³ a)4¹½@ó-ìë¥-|JçcW4wçô¶ðõzŒêÏDßõæ‚×Õȧå¨bk­#”%]ÞPÿ©ñm—Ê™¼Ï²:+ Ø£x„Ÿj‰ØS¾²÷û¨}Lu±¡±þ›%Á–ÃEäF¸Ío®qäÓÊ*õò‰À³Œu@O5݃C³åfÍóÚ9¡ã’p¸2e,¥µ,iŒÔ{câï}ÒפdV\?ƒlVù߸ûZóÅö)îÎßµ.dðIJm³­Ìb¡¤i¹4sŠ[ëó`È]¾s³ѦÒÄl´ ÞÉǼüΑ¦‹Lh”«VÏlÛÓj¬£Ë¹Òr-6TÄIN½µüv¾²ú£ï®±S‰Ñ;ws·sHážgxBZLÃ+~Õ_s]VEqMk+wˆ×Z\æòJÚVw"uj ¡íÜD´­š}©ÒU›ÙMÑáÿ²²ŒñyÌz$š2áG6Ã˯_ ö¯DXìÙ!dŠ:xW#‰ÅÐ@æBŒ´/…û37¤#äÍÅæÐ&ô-˜¬ØaÏkc9¤ùȺ?zœåî §ÌÙ$™+Ü(RéjðB>¥¼#µ ó½dðzó. ÐRNœöla=žÄm¾MUÅVç¾ù(É£XçÿðÉpRAÍÆDqØ0y­¥¿Øú1ØKˆ¥Õ@¹^X£˜¿Éë8‘xG<ݺn5BÓ=\ˆ¨ŠþQ6Wly¼èÎü½]óÅt‰l×ÉÕ¡Ö61%•b,§ 7;{©4Þö%]géÞð—èí_›/(çñ fÛ머DŤ#¡ªwwqÊÏG"ßt$;M¥ü­+#g endstream endobj 42 0 obj << /Length1 1713 /Length2 10295 /Length3 0 /Length 11403 /Filter /FlateDecode >> stream xÚ¶Pè-Œ[p'ØàîNHp×àd€œ àîîîÜ î!8Á!H‚xdwïîÞûÿUïÕT1Ó§½ûôW0ÐhhqHZBÌArGWNnQ€´ª¶67€››“››ƒAìjúŽÁ  ‚º€!Ž¢ÿ²†‚€®O˜ ÐõÉPâPr³ððxEy„D¹¹¼ÜÜ"ÿ1„@E2@w°%@• q¹`0HCœ¼ `k×§<ÿù `¶`ðˆˆ±ÿátAÁ@G€*ÐÕäð”ÑhЂX€A®^ÿ‚YÌÆÕÕI”‹ËÃÃèà Z¿bax€]mš Ôd øÝ2@ èú«5N €¶ ØåO…ÄÊÕž{°ÈÑåÉÅÍÑ^Èò´°áú@ÛË ô‡’ç7üÔƒ/Ì â°zjä ¶=}aÀ\€î €+Ô ä û·â¿% €%ØÂ`²;büý Yý)?í öq?ÑÀýûó÷/ã'†YBí½þ1ÿcÅ\ jÒ’RRlµü·RJ â €qð8xùø|BAA€ïGÑ‚ÿªâ_žŠŽV€ÈŸÅ>Mé?»ÿÅæ¿Îƒðß±Ô O¼˜ÿ¡ùnn‹§?<ÿÏdÿÃåÿã¿£ü_iþ¿ɹÙÛÿ¡gþÓàÿ£:€í½þ²xâ­›ëÓ ¨Bž.ÁñMõ@®*Èìæð¿ZEWàÓ-H:ZÛÿ=H°‹Ød©vµ°ùƒÂ:¿ïÌìÒ€¸€¿,nîÿÑ=—…ÝÓëáòDÉ?T §ÛùŽËßGÆ+ B¡@/ î'&ñ `éêñ¯2žzðAÿþk_nPèÓ£õÇI=-ó?ò/$ä ²Àø2±xd[ôéºZ’܃c{üå ö^2 ì ´Ýí5¥*=p z)™0܃»¼%Ë|!±Dý vØRÚ÷ºíÎçÞ4Fsj» cq’x`"ÿP²®Ÿ‚C[bÇç—³n€b |§C¶³›0¶F.ÁµGŸ¼g]é×Ñùí×;U‚ÊÏîK§9"u"ÞÍ2ä˜g̑Ң¸rP¢±âŸzâÌ^\ÎàgMwÒ‹©(â“pÛC¿ˆÈÒû¶Õqè÷b¢§ok™9±Ö:b/²YyxÈÉçª7ö™ì …¢_…AÙ,UÝ£PÕ¼`;_. /”k'Œ¼GŒ¬6Ñ16‰–›¤Vd~…:ûª¢PüÜîòÉ·M+¡¯õÚN9Íxîxjµ”É~wÃÆ@ÍOHÁÁ%ÈOmb޹¨!àƒ^%Òf‡þ¦›Åh˜lINç+§óÙÎÿqΨa²°ò·‡Eƒ—}üD¡¢€9~µ­E̱!Q9vJ8{œPVþüp©rè5„ÒWËJ‰©6¹#ø1ÕÐÝ«nÓÒœ;K<:k¶ÚÛ×M{¯Ñf 3Bo››’ô(ÂÕ.à ¸–¶Ä kò÷òsBûãà‰ÉeÇ Œ>3fG*>ëáß›»ºÄŠø†’ˆCjãdgÕ¦fT‘Î@,u?‚e»Yû/Œ¸ª:l|&&9¯‹4%‘V‡«•gÒí/M–õ–ýI>¬ ¨šrO9Èõ=_9)£Ì¨Oê$_šKæ‹–SöS$)’ Ö’\V½S×Àç|ñq%:Ba„ ¢_“ù·6ö:“pǶß@ÿBvÁ­ŒúSžÀ`›Ó×h)ÅO…9áZâû’l!§×í‘üÜð )³sü§nFGXí½‰©™Û¼ŸŒ\'§‡G—ò"êÓÅm~¦„7›§o<°~¡D ÷ǰ(0 §hc§½ À¥ Ì>+aùXâ£3u2PraE‚rSF Óïz;k™ÔS”ý²<-]`ìǧ·läùßm…ºÁIÄ›Cx,dðSaŸµ¹à&Þë,OÊí×\E·ðÄ»ÊNN7­äJ`Måú“ðõæÕÊ™hŠ'rd$dœ÷:¡š¤ÓÜE °òX{\íòvåðsfg5óuJ”m¾©òþ ô>˜â¡ØgyßĹžrú#àƒ¬g SëPéÕ@˜œÅÛ—Ž¶¼›ís(ó„{Ñ<˜‘÷×£{|þæYŠÆ¡éáÝ^͵¢G¿aYÍç”,|ˆÛ>8+¼+¶²>bètʹŸQ«S13ÁJ¢æj?c{”=híhÒ˜„eÏ>O‘oÖñNŒwíøR]ÉUøKÍCf"[cŽ LÞu'}7,ÌByvøå‘)!º"^6%—ü¾¸‘¦7pw=ñB`%=_ÃArvˆ-[waÄ{e$/6Í‚˜:”ÔŒÏD#KÃñyuõV÷AyŒñ•¦fZ©t4’I•À/ºŸ’ÇlâƒR‡ô»Ëƒ,±µ¢EÌzL;숡pRýò¥˜dÐØQ휄9b°?N»]bñ.#îÛñ2YÚ4·³¶/ë·%f'¯ð¦L̨àê™*f˜PRn)Ÿ)3á(oÎ`1½ÊÂK—]×PcU݃…kñÉójbK¾ÉZç83!ÖdòÿºwñVŽ˜ÓÙ&¹ùÊ€<ëüÎ>XZì1úE­RÇi¬È¬¢âçfªªH Ê7SB%ëisšÍ$ÌÑO.}#ÚÓñp2]ˆæÃ¢zÎ4ÆoÁ9mqf{ù%H¨LÛ=fë6&(=˜ÚÚQŠeŽ ïAößsñÚÇbÏ?^õf›á¯\Îo$û_.¬˜Š©œÂÖ°™_"•ð´ì\–½ÏÖéœ*/æ:R¿EÖÆ`0c<¢€1“*÷‹rJÇ”Er;=ú9Ü7eïgù=M¨Â¶£²¿´Þ‡§ö±ÿÌ,²Ü´`2ÿl¾âÌž¨pÉ P«Þîß@WSs¼2ì“?GFuv£j¬™WGèøÙm}·?kÉ…ˆÀ‰ 9öcíkOÄßhíÀé:]nÀàù^ë ÁñW†;bNŸtQÝ¢4àaf6|ö%ÃõÁ?OLJÃ/6™^*b¾[âétÏR…׿_”´¦ÑEúñÎNàåÁcšAΘê‹ÇÏ>$Ť!îÒU4@Þ[rH5«‘ûfrï6•PÕiºÊ¼r{ód9Y„ó$Ó]ÍØ’Æ!_âÑ*+°üßyšíÐø<¼­²VŽYîê<‹FBeátU¤°qŽYx£båFÌvþîßZã_õj7HhP½Ÿo€z(j]§Ï_DݵшÏ'òTÊø£Åi`ñánQu-A/™ÂYF¥¿ýÓGØò±Y-aÜ¥G<¹ÏB–¼Ò£7WSúžS‡!}Ðû/p)‹ªãù‘ùë£ qGÃ>Â磉 ­ÁªTœVñz¯tYð7öìF–ùÞ¥hCòï¥}ù_5>B‡ªamP’nÃGÙÒ¬ùYùÊ ·~‘¥Wëf2çŽ1®Àü ¿}lÏÍÄ(­`Ÿt+ê…rñ.ý3N·!)O+ysÙ{N½wÁ)ö.t’);;媈šµõ=;¼ý¾Oã'rÿiRlÕ! kÞ,ýå{ÊNwºåÆWGB:GûoÇzQËà˜šC›Õp&SÆy"Rw õVÊP‹¿<ê.c–$«¹¡°‰<.áð á}ð’ÇažêyX[Ã*Àêé §­ðÙƨ÷˜Æû”[>PxKå3h2ô—¤^é¸Y—æ<·ÉÍÅ£w_ÑŽ%À?£tŸ|OŸ'y¿¯]h-UoDð%RDç—ÜR•8-¾‘“qϳ%ä§q›ˆÅîìñ®Øâ³aÿ‰¹8ïœÝÕ•ñ:ÿ[„8’{Q*å/*/nsôFõãƒ.èCEİEœ¶êåL,S¥Æ©æ•4™á8´YùiÒ#§¼ à̘T~1#>«@«:Q%(Ó¤°Šñצµ¢ˆ E]%=è1ÆjvôÉ>3.æUñ?éƒDÂ<·af%â’âZ½»LŒ£!iåk8uÅmRëÿ€¨Ï ïÝγF/HOÔä{ '¶Æc» ÞÜýEßÁ_‚¯®¯ì–¨l³»çh»½Þƒ´ˆ®œ¿<ó¥l­ÿ\̼¥5òyŒ›3®³ê#Ï*Ë3Ë;âïè~Œ(¢Œ½hó×0&Áon8k!Ö„ï|H¸ßKhUDd§Oˈ ¸Ü2—Êšº_öYþ*?‘¹ºròæE«&†ãÀŠoØZ•'µþ8 a6¸è:Ñ^Kâ6.±+Uï:±8CËÔU‚uP¸V'ÈÈ;5 4ì Y³aIº•9ÂD´å¸ F ê;Rt¿ðvË–0‡þ¡ìYo1°býŠÏíÚ¥ÀÂV<:@Á"‹Zj1}…‡€Å£u e‰üŽtÛ€þ{°K~OÅÅTé‚(r8ñ÷Î<ãgךøÆ“rŠ•Úvž§i¶Öæ™ q–hœÌ¢Ý›'e霓I ùNÎ¥?_¿-e²ïíɾ3‰³0†¦m B*›BZ.r†VË]â´—¥M,Ô_L:o ßÐz57I…AT Xþ°—V]åôL¹ë~_Ö‹w 7¬°ñoKo]-]r‰Ó¤áÕ¼-ÛR‹îäýÆÞ.ö4g‚¼(g-Ë(ðá÷ŒÍ]¼™:‡D·'€z’õ¥)¯øIÙ0~! ¸­½T¢Ò>¿­ˆS#‚.6Øh"vl&˜œ€Ý×pà|º¾EËt}œöÕ¸?Šwí#Ê-Rò¬K^šÑ¤øºÁIò6bæ¶òhDFNÝPô“a¿…¯;,ê>X¨çÍÔ10DM‰ºáàáÃÄyʯl¹ »òÚguÈçê¶IíÏ+×–vØêQõ@Ïç&]JTçt“>°”^''þè^G-U:3Ð=ûœ&\ÔÅÓý Å’NI…‡Xœ@µ~Hœ€¶?ͼhôu76ÅIG‹•EÓäL´¾½ê™˜µ½_äIRŒ€A•òÄË­í3ãCK ‰°|ST9—õÀ»‹e¢®óÍÖ£vº+n;ÖßÞÆÿÊù0ÿ×—‰ß>a2~[⦪ÓT]q­Eˆ,m‚ m‚äíÅa #õIJ"Ïi¥¾ÅRZ›š?»Z˜éºª×Ê(ÙbÊzNî #k94o(˜±°Ó0Gó€[ÄàΩéé½.ó&ßRœ©  ÂÒ~×üA³”~†½€*°øˆ+{O .ÿh3€Q6E¸».eð^ÝCç*ýˆ?iq©=}\j`¶Ö Z46`‹tþ©“ÏÚ”á×JÞå½Ü*¶ê ³#=)’dBž%cÜúyÍÁ-#d\ðÎW}ŸL–SÛ¼Áo®Å/Ï”/\7·þ;Y6J=9¿æ>m%q~ídÃÁé66V $D)é£^7c'Q‹ž!óMÐÁ¤‚ ú°ÄN踥zoÞÎH³Þ‡`Ì9YÕrI¦¨ ª;+­ªØ( U²×þ¦­ˆšâääH›¹Ž7qá7ßT¨Ìg‰ºÙ«¬Õ™„‰†ï‡J+*iHžËΆ0½ |æ!„n…¤¼e"û4ØïRÏ”_ ÝÐæŒ›ûkOK$Ò¾&÷p·M#Š›³Ñ繪{ÁtQ<‰\oRèŒ#6Á|òãím·€|׳ 0®i4pÜä9µ)ºe›}™6-Œ ,XmêÕUÿJœ‚m…’¸›XjónÍš+ų-§Zmêx`F‡WüÜZú;áë€2B:' _ETe£À›þ0öŽ™+ÉäMQjT ;°Ø•ž6üv\~4Öú¡Y˜ë¸zX¬Æ@ªýhÔ¥6Œõ ·ö³1*†!©¥ílµlÌZqdîø$'²Çã•Óúxýú¬¥Õ™x Êö+`>ôÿBÜœÙeGiRwü®{•aÂAkºˆ¨OÆJ“­Éâ¥áÑ¥ì«~Œ0åCê줃ÃÿÔ¯/d+ªTúŒÓ|*´âzªkB›tC¨E§×Ÿ)ë‹¶w«»ÚpJíw±/jÉoR¶CWÅçAZ‚ØÄ7á;§ üïÝ4|ðþhRÚÖ¸ÉH(K(5¾ÄÚ9ÚÀäñ°À°¬² +¢´Yë¬Â¶Ù‡SýBS6×xž^ÉylØZñõÉ–Å»…ê옲bo ÖןK’´4·-Y©wíÕŽI£Ì l‡CK<ÚÝLû‹I)¸×Hù L;z_"rí­½}}ö³ÎÍêçf.Æ“"ºRnÛ¦ø0³méY ÆÈÇÃÔ™Z¶ÌÆIüÁ)ÊIhîf[‰ £Âd¼´È¼Ù§WZ‹ÿCþ†A4ô\ úÐ(¶Ê\f-oÒÓW_çW婱b⯼¹:KFÒ½npk,ó9Žöº9žžPܪIˆ*i)uͯ%Vÿó7È^Ø.ß}:Ó&›v0ÈGèÂ/ËóZD®#ve$@è†1z’ÞB³ÃQsÅ#£Œ  ls[츌}Sò÷À°0ôiì&D¦—2š¢‡/€Nß=›¦½‚»«]ïxñœÏG2Æ[nÀÿRuQ‹Ba$Yi£(sŸÅï‘!½ÈܨO]¼÷¬ÿQ–¦GèZË l…@ž8m¦Þ¶ÿ‹¹JEÁï‘ñúLo,Ã÷”o~ºøòFÁ^K²xÀÍ@çô+€W[¦ÑpÛrß¾@G8Žvƒ‹÷N÷飸áßÄ[hIìš–ÕÜ™*F§À±Æ ¸u ª²á§ »àd®ÛùM´˜" ’$YÇ%·;Ì[vý­ùÊõ?Ù´|¿‘¨ÏGÏ×óŠ£7Ú›×w|¤3ÎÊUYØ)¿ëÁ Ž-ê«ûr^è¯/4×ìí'Çf§³^ÚÁ1,;„WWVÖ‚GjWnþðøóÊMéòÑæó­]f°qÚgñ³.´ÆÅÁ1ëWu°x}= Nºj|™9»dõæêц䶾€û±æ+œD¹¾{-zî|°¯ûÈLQñóiì¨1+Þ(Eߵͤòžp·„ó–XR°„ÈóÅnÛëx Ûa,+œsks†\–´žõ ®×Ó4ïç§eeJ¾¤ì)ï >tPW—cÌC‘ÏÇ{mY*,_œ&ùŸckÇ·t¦ÐóÚP.ïþ^L¸‰‡·²âoX|:M`§EmW[{ƒÑ%ëA’é p½ºär}ši^Ø™dÃÂ+AEžÖ¸ ¿Ú¥ê)Ú–_+ÜvФÊ¢Å@wHNúu€—9Öà^к–’^TS)¯šk_èt/k(˜k Å”5^.¡]ZÓ7I¤ó6þ(Sq@^Äl0ÒfÝ?3Ì¿²š¢+ðÃH­„¡|g"¥@ëL”ºÙø%8+")Cú@7:Y^µoïOöI +‚R¹û‡ÌçïîdÝ*Ÿ ½vüì¾è^óv78bªÌQV‰q|Ã9ùñí«ä30D+RO 96ç2µyÂÝ;¿O*”Ê›"ÂK×Ðúq¿ŸÍ¿Ùqº)×Å•¿¿aiDûƒ&Wˆ—_~+Nfp†¹ÀjÍIÆkâ ™Wê—á.í×´!q…Q“$õÛ2ÍGƒó?XFñTw‘Æ8ÊÕtÜ–¾ AÒ>àÕý¨9¡ORTúÈgØ´u¹.÷ fƒÑj\N´é‚‡ñ¸:]´š™’uÏŠ‚òð‘wïÆ*m+Öëªü¾÷\-¥œÑà®ûZ½¼[F‘ýz³u¯RYZrD_'PÔ³ ïQ¬C?J§!êÌÒ‰»AjEOêyé!ö¿â}TÓ‘ÑYß;Q9~i-™¼`Ãò î}ïŸÓ#º©&ÁxTä¯Ó±m©8k :cüi©V0F ¶îÚºäç’3ëi "Ö¸¾,ÏŸÖkS±våà]¬•ב² W½¹Ë§†»Áäƒ6‹˜Î*¶ë©,^ÿòðRa +§J³0}§µ4îA¾9ÐiÜ¢øŒrY)Kìú8¯•%WþÀúP²»^îdûJ³AIákS›­)ѳ½cwÒkzÅîZ)–´â ƒŸºB¥´l#ÏMA,ÕHõ?L%=56ŸjGõ^Êßb²DþiY³"Ù½`AÏ>pqWU5M8ëú*©í:Š×#^˜É­0,Ø/?†éµRÿsây®¡Ëµm~WR=¥ªPÌ í4.xm <Óàõ7:7Eã ßTçÞ/j”‰S¦-´kslµc Ï1‹MŸ99ê}! Iäd¥Çìo½—‹úa5½ü}oTѽŽçØ,ªn«)zcÁó€ÖN`»Hw‡òf)Ö§}Ŷ[{;×ë‡ùŽ*X7¢ rä¨8ó(èÓÝ[Ëüž%v±–a”‹æ•&KšÄ”·-²JÇRÄË›¹?Zø^ZªzbqÉ|}cŒÓ.Y_Ü©Ôb)®‰æQ7ÇìP¶\ašÌsÑt´de“‰h@Ï~-kªæiB¦+ªoPï7e…½í¹?ÂK}ŸqößWŒ’H oqM=<.r˜DÙÀ~Å?ò¨íF«eá_kE¾šam×TÃ4É{ÔIã‘V¬áéÒd–}¡ÆÊæýÉ›ˆËëD{˜Ci3Ù Ñq§r“z3u[Ý]Æî}÷ |Þ¶“2© ̚Ο¹‰±ðÇr¹ÇêÑ,« 3=¤Y‚&îÕ"PNÙîƒS<éÊU â…_hºmöÔ¢ú˜Õ˜2'~±c ^&,ƒ9M45¶ÔË}²«ÝKa­-àÍšt¹¸m‚¶¿yÏ”Y¢Ë °òöþüõƒ…ÛNMà ÙäÔWÆKªƒR´j2Éõ!œ#€•y÷âÏ©SÅ{¾äbˆŸñ ^2<âWSŒêÚH¿ˆØ‹öäè¶Ÿóu@è ³•¾;ŒòH™·9±sÞ†î±?ç9‰™’|”xg¯lÜ:33ܸkš‘¸{U¡Ùšñ²DÕŸàëäúƒïŒ¡æNNÂóüSœüõ€(èǵ˜þÙ\FŠ«ôÚ‰ör_á( =»Þu+J¼ÔÜs­H¬ÅCRˆ«ýæé™´Á ÑSca½¤óCÌí΢¶pXýÈÕ?‚[~í°]ð•õ‹£¸Â°¸Ç%ºyo÷síÓºí¹¼sì‹ü婸A<—e¤âÖLÏ/ߘL‘X¼¥&búÓWêA½¨VH–#>ØMfÒ¾ ÕˆÓÉ`f¿¡ñßµ.#öc ÕõÚ‹H’ø@,¾Ð’2ìüW2¡SCviÄ >³*·èŽ<óê>~C_eÞ©kKŸ¾ÿxÇa챟÷è1úÃýx20½‚ú4€˜*èg«5Wd=~er¹!®£mĦÒ¼6E½3ö¼‰È~QéEà¶\S¦¿ýɬº¥‹ ÿø³9Ó°Ü8á–LіǨ·õ:ÓÎ ¸B~ßPã–æf43š­‘Ì`EçÁq#õ¸œp§nqž¦^‚';b=E!`üùŠÜì”6 îAíë|ö›>€þ(–úƒ·YKtt9E•Ó/ߎIAL•ýp£Â³çñ|Ùíó0X¬_ão1™l¶€³ˆjr\)~ËNSïmäáÄŽóR0ˆÇáºÈnN\Íaðx3!¹(ÞlVfr{׌EdªØe/ÙptðæZÒ-Òo.Gà[ÍÝ3ZžPŸ-¡9TH ô3éÎ eúD9Ô› &æ*}¬ãy#èR\ˆò^÷p"–Q#ßź*¢û¤0*Ï]ÀÜ÷Ç?™N/IbVêOezy:+ê9pº…Ù–.X:–¿­ÁS2ƒëÇ ÒvC/„ßV;#7›;¦hV^[{¨™ŽêpÝ»—YIŠ-2;¬»^ýÎý&ªl¦wŸ—¯ñíddÏò¸=—ëŽ4¼Úæ ¶s û‰çÖ¢ªßs{ 4|ÕÏ­œÆúcœÂ‹bÄ-5ëÔãw #òÕ÷sš'8&†—ÝŒj×Ö¿‘S|NìL~°¿€lè“ÙbŸö§ÅïòFü ¨l¤ç:wìãNÅļp*`b¬K!ûþxqoô5uµ™ÕxxŠG§sÛ¹„J]¯©[±­^ÃàÆT›¶Ï­<]w5fa`÷,驾Ÿcm(. )ñ©‡0§—8ëavO2guOج¿‚q½;¨ ÷Þ)`–$»$kËõ©*m¦§³…ÿBMËÉ>û˜¼¼õì6Ʋt΢ôôï7#àUË3›• JÖñW68p󪵻‹i6N݉ Ÿ’ÉO–bWù£Pãn÷V«hš2”r#º¾êkOÑäe°Õmí¤è¸÷6%]„lUàDcÒ2ô„VKÖÅ `?î›…-Ýb…¦CfpŠfkú«‡0ÒYSiÐð§Á²’ÃQ5ód%H’›.:”Üu 9×&¹ }nå)÷ä¾ñ°Í4­ ˜Ï[}\vø„j,ï”yÿ®@qü†Ðyš“.¤Vž c0Ée\9÷l0°ÿ´w)’¾—]cfÝ*i.DAð¼|ÀUzºèœà|]á¯c¦Ï°þê¹aÉÏ(«h'Vf²Á÷å©âÂkÛvÕY^¦¶ˆ”Å*Ù}ħut ¯k3kކˆ:*ç¥Ò5N³þWg_1 Î1•`ÌëÊ1H…ÀÖ/d‡¾ÏÚ‘ÑZ=Z†d ‹E¬þA{[V¯õŽe…PR^ w׺YQÿm 7ý‰»†ôTÄÆg.ùÓHu{zùc‰8þ]5 ÕqÆ%“#û¦\ÚÚNR!EûÖ‘zݨ¤>Öó¬¬h—ÔKüœ‡Þº†Ðlþ³ÿÕ›\± endstream endobj 47 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.16)/Keywords() /CreationDate (D:20171030183726-04'00') /ModDate (D:20171030183726-04'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) kpathsea version 6.2.1) >> endobj 2 0 obj << /Type /ObjStm /N 36 /First 266 /Length 1934 /Filter /FlateDecode >> stream xÚíY[o·~ׯàcÜ‹÷Pð%NÒ:‰a;›Àм±ÕÊZU»Ê¥¿¾ß+iµ¶j«iÏS‰‡3œ3³\J2Á4Ó’9&•džI'˜L üh¦Œ`†©€NdF€!™‰–)Ŭ¶=˜õŽ)Íœ÷ÆL)™²˜ð ÎâCÊ¢ ‚EaȪ–Ñ1{Ú2í½BS˜T l:¯™Á' É`j"ŒEÀhdÖ˜À°‹Ù˜h]t=i˜ X™tÌF KÏœ -†9‰õËœ ¤š9-dïûï?cüYy^2~ÈÞk sÊøÑ¨¾d?ü€á?ÿ:-?\=~PNêbRWÌ’\ŸU9Ÿ ‹ x%ÆËâj4Ø/¿°÷ ˜d>ªË¦Ï0–Cb敽‹_Þ1ú¶/›ÌÇãË b1‰‰¾·úA9ëeß«‡õ™ û²+wgt¤ pÎÀ`'cCš´)™´/ ´ih+hgZÑ® ýüdVÏŠš½´‡GŒŸ_j¶4}/æJtA—áï¡.ãã`_“˸à©7áô/!òÞ"¹þûþ#ßËÿÐüÿ#î½î;æî£è 𯼠ýˆrì‘X!º¾o$¼#Ú!1´W±Â´K]¹‘ô´9N&K‚æZi0wA£Ì5t›cðø£ïª—GW¼öâ*K«Ò÷C³®,×Ò§$É Z›ÖIBc6Å_ ÕÙ¤!·A'·Ê“N-Ò(žÇݯG1†|J=•0Is¨……²&H[µZÉfVT[J‡´ÜÔ&õí±Öòî[ئ¯º³Š¬ÕxZzn3‡\£ «n9òÂ(œ%Ç|0Ó.ýòÓ!¤¢tÍxÃKsí€_6€7úm†S µ4oéùAªWŽv©IY³-ºµ{‰»¶§j¥£Ù ».%t¤øÑ1éËÒÍd:·É2¢+"ÄWX `§†·Ð"…óp/ LŠ)mC1JXú `:8“ä"$¤tª!së‚G«¥BKvÊ©%·á—2Ý&/ÓoÎPd«oä‰ÛÌÉÜHmæD퉕l7–Öa0,¤€‚¢¥rp€(ßÐ’–Å×#ôÀwOn3Çã˜ä°*ôÕ4oR¢‚)63Ì:Ii«i÷„N3UŠ8DCL³ôB_žÙèVÈ8ñ.t“”¦£·pËŽE!l;¼N­z¤ÆhKKXR*æsàb<ÍH<‹œ ©d3w)•Çt /h¹‰¦’ðu‚ÛŒ`8‹"ªd*åx”jiœx”¿é$–ih¡ 6ŽfgÉÜFkh£[‹J”5iÃl ïÐmNÖlH›VH‘°&ÓÌÍüT}2¯,©þ¤¹mIFc…HK¾fº=š<ºltéyXTÃÙhZ—³|¢|5¸ÅÈÁ›½ÃwGÿ;x¹!ƃk¼kd‰ýtâÝÅkÀ.Þ°cVàÜ»W éÜë"$ÓçÅèúÝàpª-òØ®¤Áõ`<îM®Ç=~V·?#¦b_4“PV ãf0££éþŒ¿à>äW¼à7|ÄÇ|ÂK>å3^ñšÏwòÊŽFЧEûÔý£oO_¾ûŽžJq¿Ÿx)…ŸT­ÅC~êGùéÚnjÙvs%W_ósþ€ËÃòövÿÈ?â3Âç:xá×ãæëô¦˜“_ùoÀåÈLF“ð”h§|J/#ãâc©ÙåÓb6*¯|Õè ¬ofEÁëÏ%ŸóOü3ÿ¿ò?Ö`UÛÀúôÝÇ'/¬Âu#…O áŸAÕnDõu Ç.ð¼øØÚžÿQÌÊ5—Í6.ï=}zq˜\ö\Ö9’¢A=2ñÑ.Û .[ÝvY¬çËs„Ð_d ÿ¼æ©ÛÆÓ£“·çOßÂÓ³ãóóMi£(m4‰Qx¢k9+åš³Ô]:«”Zwv7>"möù?„ÏÇü“ÒæÃl0,RÐ'*=‘¿õ’ :PpŒËÉ2Õ®Êñx0pÅïóÁ˜ò®•q׳bP³»™7.ª*¥ßc2o:žWü÷yYWÆ9×âDØÈ°Í>\ütqŠ}:±i—´mŠ›Tæ[ÒpWšå>…ûô¬‘÷Öo³Uý~þê`oŸ|܉&¢Õ߈âQq¸1Ä’|+Ž)Ù*ÕíhH±Ð­ÌÝh0J2V:ÿP§.1±ÄýAU¤ë¢;ö5`é’4]lfUM~á\Ôãǃ¦#©²½]Õ7ݳnm¼ó°íØÖ]ÛrÍ6mȶÛÞvç‰Ô±m»¶éøÑòÛ­l‡ímw ÛþÌãÊvÜÞöÝbÝ1»æõšëʮ̛íÍwkкq³E¼Ùíw‹CǸþkÏÛ›®ï§[⊮‰ç0…úitU-n¸óîò¦–JÆž–Ãݳz0«wXÚtöd %}¹Ã\««vèÔ¯Ša=*'ß‘ˆä¤îðôý[’lóãÑí¨î˜mK®nœ‹ ræžÝ= –×½ììâB»ñÇ4ICc/Ë«‚¿©Š×ózŒŠ\^O‹É^²ÅäBñŸò/YJ endstream endobj 48 0 obj << /Type /XRef /Index [0 49] /Size 49 /W [1 3 1] /Root 46 0 R /Info 47 0 R /ID [ ] /Length 139 /Filter /FlateDecode >> stream xÚÏ· B EÑ÷>9çœÃT´Ì€(„]†‰(X$Âust]Ø’%é›H‰ìÃL”!k©c)ÃÒ0€!d` ˜ÁгrŸ8•‡”  ¨B êаJ¯ØhZ›[TË:Ý£ÚÖyÕ±®Û¨®õ¾Dõìõ#ª XÂÊÞ?ÿ_Gú9ü endstream endobj startxref 88859 %%EOF graph/inst/doc/graph.R0000644000175400017540000000671213175724647015675 0ustar00biocbuildbiocbuild### R code from vignette source 'graph.Rnw' ################################################### ### code chunk number 1: g1 ################################################### library(graph) set.seed(123) g1 = randomEGraph(LETTERS[1:15], edges=100) g1 ################################################### ### code chunk number 2: simplefuns ################################################### nodes(g1) degree(g1) adj(g1, "A") acc(g1, c("E", "G")) ################################################### ### code chunk number 3: subG ################################################### sg1 = subGraph(c("A", "E", "F","L"), g1) boundary(sg1, g1) edges(sg1) edgeWeights(sg1) ################################################### ### code chunk number 4: example1 ################################################### V <- LETTERS[1:4] edL1 <- vector("list", length=4) names(edL1) <- V for(i in 1:4) edL1[[i]] <- list(edges=c(2,1,4,3)[i], weights=sqrt(i)) gR <- graphNEL(nodes=V, edgeL=edL1) edL2 <- vector("list", length=4) names(edL2) <- V for(i in 1:4) edL2[[i]] <- list(edges=c(2,1,2,1)[i], weights=sqrt(i)) gR2 <- graphNEL(nodes=V, edgeL=edL2, edgemode="directed") ################################################### ### code chunk number 5: addNodes ################################################### gX = addNode(c("E", "F"), gR) gX gX2 = addEdge(c("E", "F", "F"), c("A", "D", "E"), gX, c(1,2,3)) gX2 gR3 = combineNodes(c("A","B"), gR, "W") gR3 clearNode("A", gX) ################################################### ### code chunk number 6: combine ################################################### ##find the underlying graph ugraph(gR2) ################################################### ### code chunk number 7: unions ################################################### set.seed(123) gR3 <- randomGraph(LETTERS[1:4], M<-1:2, p=.5) x1 <- intersection(gR,gR3) x1 x2 <- union(gR,gR3) x2 x3 <- complement(gR) x3 ################################################### ### code chunk number 8: randomEGraph ################################################### set.seed(333) V = letters[1:12] g1 = randomEGraph(V, .1) g1 g2 = randomEGraph(V, edges=20) g2 ################################################### ### code chunk number 9: randomGraph ################################################### set.seed(23) V <- LETTERS[1:20] M <- 1:4 g1 <- randomGraph(V, M, .2) ################################################### ### code chunk number 10: randomNodeGraph ################################################### set.seed(123) c1 <- c(1,1,2,4) names(c1) <- letters[1:4] g1 <- randomNodeGraph(c1) ################################################### ### code chunk number 11: rGraph ################################################### g1 g1cc <- connComp(g1) g1cc g1.sub <- subGraph(g1cc[[2]], g1) g1.sub ################################################### ### code chunk number 12: dfs ################################################### DFS(gX2, "E") ################################################### ### code chunk number 13: clusterGraph ################################################### cG1 <- new("clusterGraph", clusters=list(a=c(1,2,3), b=c(4,5,6))) cG1 acc(cG1, c("1", "2")) ################################################### ### code chunk number 14: distanceGraph ################################################### set.seed(123) x <- rnorm(26) names(x) <- letters library(stats) d1 <- dist(x) g1 <- new("distGraph", Dist=d1) g1 graph/inst/doc/graph.Rnw0000644000175400017540000003444613175713336016240 0ustar00biocbuildbiocbuild% % NOTE -- ONLY EDIT graph.Rnw!!! % graph.tex file will get overwritten. % %\VignetteIndexEntry{Graph} %\VignetteDepends{graph} %\VignetteKeywords{Graph} %\VignettePackage{graph} \documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in %\parskip=.3cm \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\classdef}[1]{% {\em #1} } \begin{document} \title{How To use the graph package} \maketitle \section{Introduction} The \Rpackage{graph} package provides an implementation of graphs (the kind with nodes and edges) in R. Software infrastructure is provided by three different, but related packages, \begin{description} \item[graph] Provides the basic class definitions and functionality. \item[RBGL] Provides an interface to graph algorithms (such as shortest path, connectivity etc). \item[Rgraphviz] Provides rendering functionality. Different layout algorithms are provided and node plotting, line type, color etc parameters can be controlled by the user. \end{description} A short description of the R classes and methods is given at the end of this document. But here, we begin by creating some graphs and performing different operations on those graphs. The reader will benefit greatly from also have the \Rpackage{Rgraphviz} package available and from using it to render the different graphs as they proceed through these notes. \section{Getting Started} We will first create a graph and then spend some time examining some of the different functions that can be applied to the graph. We will create a random graph as the basis for our explorations (but will delay explaining the creation of this graph until Section~\ref{sec:rg}). First we attach the \Rpackage{graph} package and create a random graph (this is based on the Erdos-Renyi model for random graphs). <>= library(graph) set.seed(123) g1 = randomEGraph(LETTERS[1:15], edges=100) g1 @ We can next list the nodes in our graph, or ask for the degree (since this is an undirected graph we do not distinguish between in-degree and out-degree). For any node in \Robject{g1} we can find out which nodes are adjacent to it using the \Rfunction{adj} function. Or we can find out which nodes are accessible from it using the \Rfunction{acc} function. Both functions are \textit{vectorized}, that is, the user can supply a vector of node names, and each returns a named list. The names of the list elements correspond to the names of the nodes that were supplied. For \Rfunction{acc} the elements of the list are named vectors, the names correspond to the nodes that can be reached and the values correspond to their distance from the starting node. <>= nodes(g1) degree(g1) adj(g1, "A") acc(g1, c("E", "G")) @ One can obtain subgraphs of a given graph by specifying the set of nodes that they are interested in. A subgraph is actually a copy of the relevant part of the original graph. A subgraph is the set of specified nodes plus any edges between them. We can also compute the boundary of a subgraph. The boundary is the set of all nodes in the original graph that have an edge to the specified subgraph. The \Rfunction{boundary} returns a named list with one component for each node in the subgraph. The elements of this list are vectors which contain all nodes in the original graph that have an edge to that element of the subgraph. We also demonstrate two edge related functions in the code chunk below. One retrieves all edges from a graph and is called \Rfunction{edges} while the other retrieves the edge weights and is called \Rfunction{edgeWeights}. <>= sg1 = subGraph(c("A", "E", "F","L"), g1) boundary(sg1, g1) edges(sg1) edgeWeights(sg1) @ \subsection{Some Algebraic Manipulations} The examples here originally came from Chris Volinsky at AT\&T, but have been modified in places as the \Rpackage{graph} package has evolved. In the code chunk below we demonstrate how to create a graph \textit{from scratch}. In this code chunk two graphs are created, \Robject{gR} and \Robject{gR2}, the first is undirected while the second is a directed graph. <>= V <- LETTERS[1:4] edL1 <- vector("list", length=4) names(edL1) <- V for(i in 1:4) edL1[[i]] <- list(edges=c(2,1,4,3)[i], weights=sqrt(i)) gR <- graphNEL(nodes=V, edgeL=edL1) edL2 <- vector("list", length=4) names(edL2) <- V for(i in 1:4) edL2[[i]] <- list(edges=c(2,1,2,1)[i], weights=sqrt(i)) gR2 <- graphNEL(nodes=V, edgeL=edL2, edgemode="directed") @ New graphs can be constructed from these graphs in many different ways but in all cases the existing graph itself is not altered, but rather a copy is made and the changes are carried out on that copy. Nodes and or edges can be added to the graphs using the functions \Rfunction{addNode}, \Rfunction{addEdge}, \Rfunction{removeNode} and \Rfunction{removeEdge}. All functions will take a vector of nodes or edges and add or remove all of them at one time. One other function in this family is \Rfunction{combineNodes}, this function takes a vector of nodes and a graph and combines those nodes into a single new node (the name of which must be supplied). The function \Rfunction{clearNode} removes all edges to the specified nodes. <>= gX = addNode(c("E", "F"), gR) gX gX2 = addEdge(c("E", "F", "F"), c("A", "D", "E"), gX, c(1,2,3)) gX2 gR3 = combineNodes(c("A","B"), gR, "W") gR3 clearNode("A", gX) @ When working with directed graphs it is sometimes of interest to find the \textit{underlying} graph. This is the graph with all edge orientation removed. The function \Rfunction{ugraph} provides this functionality. <>= ##find the underlying graph ugraph(gR2) @ Other operations that can be carried out on graphs, that are of some interest, are unions, intersections and complements. We have take a rather specialized definition of these operations and it is not one that is widely used, but it is very useful for the bioinformatics and computational biology projects that we are working on. For two or more graphs all with \textbf{the same nodes} we define: \begin{description} \item[union] to be the graph with the same set of nodes as the inputs and edges between any two nodes that were connected in any one graph. \item[intersection] to be the graph with the same set of nodes as the inputs and with edges between two nodes if there was an edge in all graphs. \item[complement] to be the graph with the same set of nodes as its input and edges in the complement if there were none in the original graph. \end{description} In the code chunk below we generate a random graph and then demonstrate the concepts of union, intersection and complement. <>= set.seed(123) gR3 <- randomGraph(LETTERS[1:4], M<-1:2, p=.5) x1 <- intersection(gR,gR3) x1 x2 <- union(gR,gR3) x2 x3 <- complement(gR) x3 @ Notice that while the graphs \Robject{gR} and \Robject{gR2} have different sets of edge weights these are lost when the \Rmethod{union}, \Rmethod{intersection} and \Rmethod{complement} are taken. It is not clear how they should be treated and in the current implementation they are ignored and replaced by weight 1 in the output. \section{Random Graphs} \label{sec:rg} Three basic strategies for finding random graphs have been implemented: \begin{description} \item[randomEGraph] A random edge graph. In this graph edges are randomly generated according to a specified probability, or the number of edges can be specified and they are randomly assigned. \item[randomGraph] For this graph the number of nodes is specified as well as some latent factor. The user provides both the node labels and a factor with some fixed number of levels. Each node is randomly assigned levels of the factor and then edges are created between nodes that share the same levels of the factor. \item[randomNodeGraph] A random graph with a pre-specified node distribution is generated. \end{description} The function \Rfunction{randomEGraph} will generate graphs using the random edge model. In the code chunk below we generate a graph, \Robject{g1} on 12 nodes (with labels from the first 12 letters of the alphabet) and specify that the probability of each edge existing is $0.1$. The graph \Robject{g2} is on the same set of nodes but we specify that it will contain 20 edges. <>= set.seed(333) V = letters[1:12] g1 = randomEGraph(V, .1) g1 g2 = randomEGraph(V, edges=20) g2 @ The function \Rfunction{randomGraph} generates graphs according to the latent variable model. In the code chunk bel <>= set.seed(23) V <- LETTERS[1:20] M <- 1:4 g1 <- randomGraph(V, M, .2) @ Our last example involves the generating random graphs with a prespecified node degree distribution. In the example below we require a node degree distribution of 1, 1, 2 and 4. We note that self-loops are allowed (and if someone wants to provide the code to eliminate them, we would be glad to have it). <>= set.seed(123) c1 <- c(1,1,2,4) names(c1) <- letters[1:4] g1 <- randomNodeGraph(c1) @ \section{Some Graph Algorithms} In addition to the simple algebraic operations that we have demonstrated in the preceeding sections of this document we also have available implementations of some more sophisticated graph algorithms. If possible though, one should use the algorithms provided in the \Rpackage{RBGL}. The function \Rfunction{connComp} returns a list of the connected components of the given graph. For a \textit{directed graph} or \textit{digraph} the underlying graph is the graph that results from removing all direction from the edges. This can be achieved using the function \Rfunction{ugraph}. A weakly connected component of a digraph is one that is a connected component of the underlying graph and this is the default behavior of \Rfunction{connComp}. <>= g1 g1cc <- connComp(g1) g1cc g1.sub <- subGraph(g1cc[[2]], g1) g1.sub @ Another useful set of graph algorithms are the so-called searching algorithm. For the \Rpackage{graph} package we have implemented the depth first searching algorithm as described in Algorithm 4.2.1 of \cite{GrossYellen}. More efficient and comprehensive algorithms are available through the \Rpackage{RBGL} package. The returned value is a named vector. The names correspond to the nodes of the graph and the values correspond to the distance (often the number of steps) or sum of the edgeweights along the path to that node. <>= DFS(gX2, "E") @ \section{Special Types of Graphs} We have found it useful to define a few special types or classes of graphs for some bioinformatic problems but they likely have broader applicability. All of the functions described above should have methods for these special types of graphs (although we may not yet have implemented all of them, please let the maintainer know if you detect any omissions). First is the \Robject{clusterGraph}. A cluster graph is a graph where the nodes are separated into groups or clusters. Within a cluster all nodes are connected (a complete graph) but between clusters there are no edges. Such graphs are useful representations of the output of clustering algorithms. <>= cG1 <- new("clusterGraph", clusters=list(a=c(1,2,3), b=c(4,5,6))) cG1 acc(cG1, c("1", "2")) @ The other special type of graph that we have implemented is based on distances. This graph is completely connected but the edge weights come from inter-node distances (perhaps computed from an expression experiment). <>= set.seed(123) x <- rnorm(26) names(x) <- letters library(stats) d1 <- dist(x) g1 <- new("distGraph", Dist=d1) g1 @ \section{Coercion} There are very many different ways to represent graphs. The one chosen for our basic implementation is a node and edge-list representation. However, many others use an adjacency matrix representation. We provide a number of different tools that should help users coerce graphs between the different representations. Coercion from an adjacency matrix to a \Rclass{graphNEL} object requires a numeric matrix with both row and column names. These are taken to define the nodes of the graph and the edge weights in the resultant graph are determined by the values in the array (weights zero are taken to indicate the absence of an edge). The function \Rfunction{ftM2adjM} converts a \textit{from-to} matrix into an adjacency matrix. Conversion to a \Rclass{graphNEL} graph can be carried out using the \Rfunction{as} method for that class. An \texttt{aM} is an affiliation matrix which is frequently used in social networks analysis. The rows of \texttt{aM} represent actors, and the columns represent events. A one, \texttt{1}, in the ith row and jth column represents the affiliation of the ith actor with the jth event. The function \Rfunction{aM2bpG} coerces a \texttt{aM} into an instance of the \Rclass{graphNEL} where the nodes are both the actors and the events (there is currently no bipartite graph representation, although one could be added). The two functions \Rfunction{sparseM2Graph} and \Rfunction{graph2SparseM} provide coercion between \Rclass{graphNEL} instances and sparse matrix representations. Currently we rely on the \Rpackage{SparseM} of Koncker and Ng for the sparse matrix implementation. @ \subsection{Classes} We briefly review some of the class structure here and refer the reader to the technical documentation for this package for more details. The basic class, \Rclass{graph}, is a virtual class and all other classes will extend this class. There are three main implementations available. Which is best will depend on the particular data set and what the user wants to do with it. The only slot defined in the virtual class is \Robject{edgemode} which can be either \textit{directed} or \textit{undirected} indicating whether the edges are directed or not. The class \Rclass{graphNEL} is a node and edge-list representation of a graph. That is the graph is comprised of two components a list of nodes and a list of the out edges for each node. The class \Rclass{graphAM} is an adjacency matrix implementation. It will be developed next and will use the \Rpackage{SparseM} package if it is available. The class \Rclass{clusterGraph} is a special form of graph for clustering. In this graph each cluster is a completely connected component (a clique) and there are no between cluster edges. \end{document} graph/inst/doc/graph.pdf0000644000175400017540000043163013175724647016246 0ustar00biocbuildbiocbuild%PDF-1.5 %ÐÔÅØ 38 0 obj << /Length 2518 /Filter /FlateDecode >> stream xÚYKã6¾Ï¯ðÑÆŠH½dìÌì.ÙEO{HrPÛjÛÛjHrw:¿~ëIR²<éƒaŠ*Y_=XUúpÿî‡OI¶0EdM–.î¦Ê£¼ZäiUi¹¸ß.~Yþ³]Ùbù²Z'q¼¼_å²åñee–}ƒc³`¼ox~×ÁCý„3<Ãzƒ\¾­²dYïà¹Yývÿï>™jaLTe™ÅísÅI²Xg6²yÎÛÿˆ7Ⱦ}X­m¾l:`j³eSñ{[ÃÏÌ5µ “FIš×µ)ª(³À7µQYVÌ׬֯ÀÚÁºó*a:m¹½Ðއ–ÞËrQEUnsd/ÖÖDe,Ýï½Ó ×°Ýù£¹ ¾ØÁƒ[f9Ñ]„ÿvùކ¬m ÆüêNaEæQZ‚BÙv4bñH(ƒ$ý £ËFxáõë$áízÚ)¦tê-¿zÀ½_y<ì…_ÓðÄö@˜ñíF ¿×å°éÀcZyTè×zîi9™GfÆ&ÖTÙ<4&3oKI>œª-ý—Í:´Q h:$Úð 7tæ^°"k™Ó³°Ä”M¯h¤~ÄqVøDVu%c[&ËhFܵÈÀB‹‚ï>ÀºÏ_f.¢<®Þ&0: î*ŒTøHÊílƸb×¹X/êã®íœ 0}ò‹ÇôÂxëyÊÝÓjÝ´óxªUb;BëÜhðÃíž=t…še#Ì6äJ昌ÏLoB´3ð"þ^Ûå‘-ÞoZ°ŸuR:ïø-B|9‡2F¡‘‚ë´Ì–ÿr2a $YšSp« ˜l/2M¼DEŠé©—w]Ãqt˧t6 ãI8ãI­í°æp”˜()ì8 NvQ©ZþÙ™ÊûÄ—šª¹ëŽMÆé—)`t5Ú\3(Âb]¸–­ý˜¸ú­³õN·8Ž#3©IHà[¾SÛZ¬Ñ0’q8ú;ùȾa"ËØÈ®‡' rÿà¼4ܦïxÖ…±0˜ªÏ[8ö^ABsÿ» àÜœeõ0»…oá;:ÑÁ3Ýò6(ÍåX#³Î »üpñ’ïU9Í{F ò‘*MÇ&B×Z£XÓïá<½~X‡Ä®BŸ’ ÒžUá-N±çìîÉžÌò‘ttâòÚ›-oƒõA!»´çñuÒö"– ž#ÛÏ÷ÎÞb‘RÂdw§Ç#?ˆeã¹¼‰òDÒNÆ­æ•éÉÞOLBÁ¡oùa¯äYÕäí\΂½§0”(x·ÊÌ(¥Ó@2?1Y)Êïåvt6> N‘¼õƒú¨¼w7kLq´S¡ÈAGºÔk‚%¢F6hË8*!­aï#6é}6-Ø^Eâ‰uì4ñ‰@D“FôáÓ-ò¤&ˆ@DGïPžÝ~rµ§së®Îh.ׇ<)±>0YIò?k¬œë€“~¥Œ¥–¤ìf¦/5Ãÿðv“d¥X%ý๠´¨Ó+=ã8A^Ä/ªùÏÁE”ì¢Yá¥=3ºö“‹ JÕ·'ÏP=ñ$ÏHø2gïÍr &ädýÞ³ÛÞ¾r³ù뻎’¢ÅcÛÐ¥$®[8sF?xÒ;‘¬À+™ðÈã0`z&^ðv¤ x‡Kça`Ø“Ô}ÆÕ*’õüïJZû¼¸÷ÈwtÌ+cÂßå]=Êsd­¤‰»^„ ¢Ü ‚[W<„™ß `­Z>Ñ|âÁ›ñåÑÊCfP¼6 „—0]>(ÐP¤5“lŽfÌFo‡ûOBÞõŒ@jw¦&e$N–¨œõ]Gç†EþÆR»ŒRc¿Žé nñl›‘)áLÍDbJrÃàŒG É&%4¦%8-(#=V£{¥!ÒúÃébÐÛ1[ß±_¾œ_@ÅÐ>©«(ì1H.;Î3Œ¯ëIE‘_…ÅÊHäoÿØÄ%¸ZYÈÿ+WúñÊøº•"oDûÌX½pí%Þs¢eÜs#È g<*¶’¿æ¸#rþÄz$§MŒ¨ðCÔ?Ï÷ü"$÷òÃñü¾Âï9ÓòŸÁï7®ïpG=ýNo3øý$¤±ü®ÄÈgÄ`å3Ê)\n®ÔS1~–3¹EBÓ/aµËS—«ƒ†ZªR|i»½%èŒDx‹`þ õ8¯GU<òðgÑÌÖ± uÈ ÏhýmÌ?^sÊœÕrN4À…á®&›êõ—`´)1w9ˆÞ~Fl$wÑpJšd8twŽMÃLú¡­¼©‘ý7;Ç×­dÚ`ç:[0£m -46þPCxIȉd¨b^F†á®¾áGÝ –¨³BÚJ>`ÙÞZ„ÊT\ªô.Cµ]tŠ8ÇZ'øöa£‰¼ÔUë©ðAšmåb®èÄ39I*¸Î@Û -­—ª ®»nók¿Mâ**2^bfÆÜ’(OŒ¹ ÒÆ¾þ·ñR*#J/îŽÀàEõçÚS09¶4nhX¸M¦ ÖZ¨)$²Ûߥ]iḴr5Ì^ú0;åa™5ÁXå©k^ÖbK¿ÏQEpç)áÎj¨ŠéBÇ;;Ä`ìƒqˆXZªêe‰4hØš¸'bâ³Ùð©ÍŽþ¯ÞàáJâ&*Šâº¯´Ÿ…®ˆ²Ê†Èmè7‡\šä\Všå‡VÂ~R”ÒнÎÿ‹2hÎO¿Ø jNw¬g"˸Ó5¸NêŸ:=Sƒ¥6Š Ç#\)u:7sÃ^_hhƒym]уSvQQœ¸<É5w|øïYƒt’ÕÜ*Gjg^ÔÀ¤,½´zlŒ_Ï&©˜‹+À¤qy->uZ›Ò ­ô@á²üÈ©¤q½§2¦ôCÅN4>|ˆ&kT®×͸¯%Ë7¤& å=wÚ@õø¢7Õàܧœ;D@t|â{'M—±x¯úY)½ö'-¸„AâÃòŒ§€‚Ò²z£«ä.9üJÎŽ UÞ#¼àIZŽ©0=ºïK#ÝèÒ¨¾¶üÄíJͤڮ—U2Ú?žDE43QQé?f¡¼€²-ædœŠWVã‹A…ôð½^³f‚µÄJßàqH_W[éw/îýž(rvRá´ü–rôéüM¿æMÀ«ÊX©î\gÕWÑ¡ur=kmø1ê­Òú-^½ûxÿîÿgh÷ endstream endobj 52 0 obj << /Length 1468 /Filter /FlateDecode >> stream xÚÍËŽâ8ðÞ_FsÒ’!Æyv¥~@¿»/Hs˜CÂc 0¨ÿ~«\e'ÍìC{HÊe—Ëõ®8Wý‹/½0j¤~‰¨Ñ5âÔ(mûq4úÃÆ7ï·f+oÑ ¼ž!<9<+x~o‡mcxBƒæ÷þ°Œk,C_ˆ Ñ/â„x~ã߉÷'^Âó©B¯lôÚFol´k£=½µÑ;½·Ñ}´Ñ'}¶Ñ}U(Ù£nâ–à ldm\´hÉãü§ ßËf+hËÌIðšá Ã.ÃÃ[†w ï>0|døÄð™á ÃWËh~†$ Ê-IË¡¨†笛ÀÍì$Á!Ú}?µ.Ê8þØwË/»Ñ|ÐS;¬?«h9‡á¹rw4îéµ+HåÊË9yvt ˆü(ºnä\hÆæÿÂ^¡©/"³a;áþ8CѨ²)œ]˜/iÑ”%é¹ùòbYëõÐ*€Ùjó©R?©'þ!å£SÊ ÙöErPù¯ §<7a—:Œƾ¡fä»®TRvüHî_ªÔ}e®Qê{øW+ä7¾3•ÜtGá[ÖÎ…ërÿÂ布õÌTP» š;SîþëØmRZþãÍʈ·Ú¿-žø›ò¡;ztðŽ~Ö¬ðÕÿIUmû¾×uÙúïªw\ŸŸT`ÿ®ÚsµÓ²ÿg¾8&ûÓ¿þç¡õ±?:*y÷‹¾3aÏÍÐÓá{üOVíç”ÕD>î ž~RñHvÑí_ü¢ë © endstream endobj 56 0 obj << /Length 1379 /Filter /FlateDecode >> stream xÚÕWKoã6¾ï¯0‚E!£±*ReM·p€n]#=d÷ µåb[®%¯›ßyQ/ËI€Ûö@‹&‡óø8ä|üiúî»Û0êÅnl´éM½(vuÏÄžŪ7÷œ÷}åŒûŸ¦¿ö¼Þ@)7Cžx€ íSjß¹‚îÚUõ÷¶ùwBE“öÝXÕLܾÒĸ©sô’‰ÊÂä bl-p¦Ú½jÈzì”DN âshKhØÿC¾k[A+ åÐ>z¡'Ý¥¸CJŒE—½'¯;¢³ß·üé@ñ\ù¹°=0z›úK›oÎÞ¬}ò²ïãWjiÓI$Ð=V£­Lä#Ñ.í,ØÑ¡ó!ƒ?[ʈ…Îhƒ[éñùH’Ìxê7ü¿[ï(‚ý'³]Î&‡M§ÔÐõ‡‚Àt%ôÐIÿÂÕhqzÒ‡#g…&"“lzâÏ.AAlO,;K¶)÷(˜myÕÏh…VŠÎûþÐw² éÀ¤~¬T$¯¡ÈÆ¿ÁŸkü Ýc!~Q¬ÐùÒGç­àIg(ݱØ6£!Daf‰.RÏxÎ/ˆrgˆ G¢§Ì4÷GEÐŒ“nHN¼üÔ'(IdŽ·mV!›™•©UkmÁ¦­‡´%ŸðgIz,F @ý¡GgGPZ0¢”S¸/ƒ@7ðÃæ¡ÌéLXì‹áq†¿ïÁ0V3Àø¦„Qy%ŒkºoihVeQ*#ˆâ C>J?ÚÕ0q¢Íâå!Ù‹FÑ–êzðÌ)ÙÏ/u®šz‚ý~™ò! KÌ’Õ—.e®ªÄX—rt‡¾Ð5FYA<„*hd ‡êS±ø^\ŽÀ™ ˜ç¬*7g‰“…zSél™Èi]V†ƒ—¦ïzaÜÜ}kÖ÷)¿àÓa­úµÌS¯)ØxËßóçX4°…‡‹þTÚX°üͲ‡ï¡Ä":ʈh¶L` eå‹ 6>É Np%à­…2vÍ«7²z'ÔÁ‚{#~YqÁµÔ”­¨©‘‘¦×¢©íüý3ºçÁ¬yFîf®­†—|ýŠf{ô mMø—L®æ^¸VhËZÔ7²"¢ b¶s-þá×·~6MËnœžáx7òýS )ê°”JÏ00 Lù8·Ã\ÚKË»˜½“„Tfv²!óVØ÷Umd&"Ò™ ¯Ëxý¿ÌxýŸËxý•3¾þÿ_Ïø®4úºY¯/‹o[n$aËÕÊw»þêÙl=¯×A³vÝ¥'äw¦ÅC´‰Èê ¬&ðùÀÎŽ­²ÚJ‚òe½Î¹hãX­Âæ¼d½ãïl=z▙㵙˜¹ÃlÁ³DB‰æ?U~Ûg€6a©Tž"ÔŸ%¹0yüW¬¬S†ß8kËbéÈ-™QXèê—! eHšòQØ,ªÁ»gQÁÃäMQFĬx&ø~dž„R%‹æ7«Ixn–í$,Í zÂBI˜9MØ8iuß¾vË´rÑOìÓæì{.%YÍ= \$iw7)Z® &Oí̼«±e²¬kŽj|DÒ—²©rž ÉŽ;e2ÒRÔ3O«õò¸ n³n%Ž`,ùº,0æ×©%Š,,{ŸÙ„(ŸÍ Êì{Æ+f-Çs.÷Iu´ÏÆ ¿¢Ðçª#×3a—æqãy«æCë*²%öÿ ¨vÏ% Ín'„”ù(øn<}÷7Ä(€Ó endstream endobj 60 0 obj << /Length 1702 /Filter /FlateDecode >> stream xÚíYKoÛF¾çWÍ…"†Üå³@ $¨}(Š$@Û#R²‰4D;†ûë3OrùcÍÍ›»³³³³3ßÎÎŽÞ®_¼¾Ì¹Ÿ'&Y¬·‹4÷Í"É?ÍÃź\üéõ2ôÊåßëß__Æ©Ãæ~.æ:SGøkàï«ô/hrèí¨OBÜåbã› R!þrG¹÷æpX®l’z[˜t‹ËonàßE×-eÞ”Š/K“Â*ÄPðçëÒd^µQähNLm¶ü­IÛÌ*QY‘­\H*wÎ@Q—Ò(i[wêhû ªÀ‹ ëµ.‹ª\¡AŽÂsƒ–Y¬ÒÐÏÃh± áÇl“¦&Ë­¬á-à¦X*²¹÷:5 ^CRQ‰s“õvÏÖcVl×½HTeßòж@îQéûž¹q¿ Bð]€8§=kÁ;+¥ßN?‰bö —¶½râÝÔýN™WõìÐ\[r €Úé¼ô‹•I¬ŸE‰¸%‘S|Õ⾸&=‰ ¡y›æˆë~îLÑ2¶Õ´âW˜4£°ñ4ÃØnD<µ*rw¨˜Bòï¤íÈâiq°ì­sÈ×ÂBöâ|ƒK_1ñˆmÄR{ƒ„<¼’£†ÚàÚàú s+\ áƒPÍCoÍèD‹C„ϺtŠ7›ùy¹p;œ ÂüfÓXø6¬ÁqeÐXÛYkx'»JFÔÖl Ý–LÀFìiÿaĶ IõÀÃhÞcâ¨¸Ê ü¦1`#AÆšþ QFÐOÜü…?…최9bâñMßüI¢1~_±l^ I¼õª_ìƒRg|6Ðiê«`¸ƒ7=÷Iüu-æ{'ZýqŽ…ÈíozÒ­œ€R†ôÒP_ñ9DÖjpIøïèDK_Hq>ÚuËÍi$s’üwÁ]Áf+Á( aÆ9¤ŒWz2R¾ ž‘¨7Óy¿MIgqøiV23áFùkû¹mØõ¸?¸ñ“€ûüèÎZVqÌ=ùûöÁ˜ç€ò£Ëø0¢X÷gD‰ãìBTøhD}?Ex(Li”P×?»õ‡ŠG¹u’Ò…‘ŸGÑí£>ƒð]àK²®÷ IY3Žäls18r ½qLŒƒ»S¡m™²Ç\8Hùé}Œ?ͱêi=+%×Á(¥'3UšTY—]BsǺ_¼O6ÉQîæÅ&ðsk5¯%Ô”•lãp¯As7µ^”û¶K¨å%s%»½µûôsuÁÅÊf±oÂtyR²ÛI£Þƒì3 6›èQcNNOºÁ;x8q'SqîÎ)w‰ZG–µq³/à™—lœùÉ] NOéÄz6‚«ÎAž“(Äê–΃büŽUÕÆXïÀ¦‚Íß/³hþ‘`rx,'9Xˆfx½„é/—üNÞw„†œË8¼tp¡g?sw.f¿ ç­×EZ½*ÍshEÀh 8ùÿB«} ´¦O ­ïÕŠ¢†1‘×à«7ñªÓð¬¶8*˜2uкEÍÓ>ó,îÐ 8Iñ€Ø›[ZŽÛ2Í©·´|W›(®R°3Y¹-ÓÚæØÏáNž+B¡²§óÙ ‡ÈàE{o«q’"¥šÑE‹Öˆ¢ Âѵæ)ÇÊÕŒk«$ÎàJƒPPñ„«Â­0"Å-|!Æ"ÒÙ#W¬ PÀ â+*OZ¬ù·êÕ)+)\ÔΡÁ­Ó|4§®HhE…¦/}ðª]@k™*§Ø`™$m/cTýºAµÞrã“ÐùXïQ¹Zïº`{¸gÊ­z£Ä2bhéàÜ:3ÇBr1çIŠž ½?̵Õò¡ÞÈ·©À×$„lw6¢(ƒL]~+ÖuŒU\èŸf' ]Ÿ89ˆcïŸ.=i]¤†< LwZ‡›¶8IÃɈœ@O÷oMÎbµ—BÚ>Ýh†2«LËa:@ó©Ë9Óèæw²Pá ü’½_oôVϸÔV¥SkΤ…µI Ëßf© r 2{õóŒ+cS?M’áUÛ‡jL3ÖK:ÕUÃØ©šñ €Ýa%ƒ¤iÊßvÅ[ìT ëXrÍhTo$RÑ:¢*¦QB|Í'D÷Ulhqvv(€^—pÓdJ_d)eÌüäâlN „Ìæ³P¦pMîÛЙ©»¸«…VýuáÖ©ô¦'§R„]„yìg…¼Öøa*ëÑ}üâbýâtG7† endstream endobj 64 0 obj << /Length 2234 /Filter /FlateDecode >> stream xÚíËn#7ò>_¡£ X’ý6 dÏ`Ù9ìú–äЖZŒÜ2ÔRÿýÖ‹dõÃŽ“,ö”CKd±ºX¬«ªÿqÿ᛹]ÔI]¸bq¿]”uâEm’²¶‹ûÍâÇå¡»IÝòÒÞØå¹‡Ÿv}9Àß žîæçû~ó±Rïib«taøÝ !®Ò:]>ܬ\¹lqâ¾—ñîÜ<á”Ñžax¸øù³oý¨½ðà´åÿîDä7È_Ï ¦gŠš2ÞánW„zÄnÃg\¾D^Z$·óôüÅUÀ(ÎZ’‚ìã¡'Ëb•V‰+‹ÅÊÚ¤ÎsHÇAV[á M‰­-y{8ÅöŒ”Ámp;Pˆ0 ¼9y°C ÍëVÔ@Ó+—%µ)¿:±yÍü­Q­(¡#îÿزògôœ'™ÍÆzΜÒsf£ìa¬ô 3–õ^¡Éy3Ò³š°Ä ´ °)f¢ðŒ•ìÕ /[tN€ÆÅ×7;EÄK2sc®Ö¸)‹ñQ4 ¡É$µg&ÉI¬Jí¯h•ÍéܲºSW•Fƒa|:ãÂŽWá(GÆ]#bÂ\ ¦R`¢JÀv™‰ÏHöÔç‚éZ S p°=²wÅ}¾"´ ÅËöHè°öÌÈr “ ;:Ss‰;4üGy‹ãìã¾?ÀsϽ‘†+k‚4ngHçIUÕá÷e sEP £wèÒ:ëÑÞ&{åy⪸——¯a)6_Q#mGIÔ*K‹åg¸©ˆýž»“ÀÖ~O C+{Ô#IJ§_»§UþqÃXãÉöÄM£‚.„Ôƾœ1µÊÖ9ù.H'jz}¢CSM¹>Sõ)þp–Ý] Ë&»|‘LÝ×Y‡ÕÄóÆgñ2 ‘oÖjý·xQÕxpƒÀ˜}»n£†Cè§ñ5)Y N<ÞÌï…U½#—ncÅ»‘W×FÎ>´{'6ìb9ÜK¹zXÿÄ*XÇ»!kc)û$Vqzhü¥xð­¯—›*ÃÒ£¾OIw|÷ƒêcëL¬é$Ý®aûKhßÞ aèo0kp§"¹|ähNÀ)5`sòfj\lÞÝ*›ZÛ'ŸL,­„à–ÞÒ>¢üPp™KÇ6ƒ ØÉ\ #¸ò†XqÅŠ¯Œº¡RäÒDQŠ]!Z#8¡9…ÝD½Ð“§ ;Ç`–¾†¨ÛÆ_§3øHiSˆCís“¤éôVï[4Œ¢^>ýMô‹È$tøJ#>ùm¡Ò3Xí†,X=6ªi%4‚±à˜ÿ0Î5ë‹vt‚aNÙ¯ÁÍ›æËdîÈÂ8¹-»Êóœ2`¼³ŸœÄG³<Ì&ï:þå²+ÓY>Ya­b€¡Ä^9ôa˜j= Õn3Âìx>ôcÄ< ‘µ¿€Tø ñ_5Ò±™î®ß’2uˆ¹”’„=†ÅH@±™œζÝ£Ñ(† Ì"öðþ@`ø"!Ù°>_ÖÀåíJ}%ýÖ+I‰6X kÆ)b×-8½Ÿ*»9@6ÝkÅÉÃU§ÃêÒÎ\T"²Åª* ç5£ïCgüÏ'ökµÁLæ^'yÌ€_k^ÞÍ60§©{‘˜‘Ÿ}ÕwdŽæÙÖ A®Þͺâ3N%S ˜<*?Jâ^!Ÿ[B8bHäé¾úf¶Iòbôýa®w_¨Þ}1ß»/ 2$\•4æv¶î…’¶*u­jgKr‹c²  kÿ"^ÏPéÉ Œxš„u@Ýú„å‘çAt€æ~fƒ¦¹ß”¢ÁE—=#p¼~X€is¤´µª?J³ˆÅÕmD )$]U>lˆó˜-Fë,6"ü¼å1߈”·?x+U™áðw±œKºp‘À‚²7^ÅKëÐ+Wf»Íƒ+ÃK†•gu s©MÊ:8ß·3•wRÁ,ÚrY+/Ï1kjD…M²<Õ6äf{'UYêâ½gÚdNJ²%”¿ˤ½he³s*’®ùˆkꤪG)Kð, t`ÝÆr3ÞW©ÿ$IÃA¨ñ—¦FÕÎH’ì‹P3Iij¸}€·JJ½—>ÜÝø/,¥o endstream endobj 69 0 obj << /Length 1794 /Filter /FlateDecode >> stream xÚíXY¯ÓF~çWä1‘ˆñ,Þª¶T€¨€JpE(ÆöM";s¹í¿ïÙfÈ9ïa(ßÉ¿†ñaÄ9q^]È9•0Z‘¶ƒ±ƒñÆs9 ×÷0Öƒ6ï`†è ÏbšºˆÖ§j¢.ÍV6ïÚ¥³Jì±ãà4ʰH¡x&ËmÍäô²Ú–2íÎR1›˜ȈŽ.â©w6Z:UÅ}“­º-áÉÍ(k¨Zœg·jÌìað¯åßÞƒy+‰ptq¶ ;þÓãï{]±·\UH€/ËݧMÔ-¹¼ºóÂòE“žY¹ÞØT‹ÿŽrq¿]ÀÌßvÞ–´Éü¹nÍÑp«Îe‘ãzçx\U^yœ Ê~Y»f”zàdi=*¸§ßˆL>o"#’£ùèì·!‹ÑR7¤ÿ¡¾P虀øSZ‚s}üÁózH@Z»híZ_ 8œkÞµk`;H¸÷myCÁT9ÒªqíúFسð—S$Ö§ƒjYQo¶yFÇRŠ-Õwüf ¡ˆÝD’°·¾9cû:| eÖU\C´ré—_vKçne¿Õ{gƒ*0l<”ýA‰Uw/C„<¨BÖó“fÛS«Ùõ½+x@ÆxouW«µdchN»¶á‡ž×¶RY`æª?ß,¯Nº¡/{^Û B‡¢R;-©ƒÏˆ'GkD“β(¶™»7¼y"©ãåyàé<ÒÊ:JéQtGFeã æîA:×÷½%ydµ£’dÖÊø)Htûsɬ’, /QÍQ.‡ÁŠRòßvèXèa¥såï!8G´TßýÝ·–v€6ˆŽg˜aµáî5G„óÌpC¨·g‹ÜλƒvÂYE%ƒ•jîÚ ‡$,Ø‘žjöU&²™#wåö”ûõ¤•rüA”s”ŽÒ"‰ ,}:?ãjÒH'nKˆpÐ×r ¬Š¾ùÓ5î˜Ï C­ùÍåªÜx‡i¶<åáÜø=µ?Ça?vŒ¼ xª§0§‚”Ü'2¥ÿ8Òœ úœé(òfKŒµ$û£¡t¹ Œ“rô85f¯–²¡eƒ—RîÀ@ÚxhÕ¼F ÅÝä‘…·,r@ŽKÄD@ê8‰Rã±påý|ëW£"£Í#H¡Ç,ĵ»»•ŸØÍ$NÕ¹ oªà)~S¤ÑFªJÑ]E Ÿ¬‚ìD›^Ò@°HNBÁõï:5£;…N5n¤ÿ’—OóH‰Õ´ˆÐór"HGI_o‡> stream xÚ½XYÛ6~ϯ0}µ*Š:¦E’î(Ò}h ´À&@i[>[ZHrûï;uïÆ Š<¢†Ãápf8ó‘o—¯~¼ £YꦑÍ–ÛYœºþ,J=7NÕl¹™Ý;?ÏÊ bg7WŽ‚¶¦¶}íüÝw‘Z@Ë¥½“ÿ´hŸ¼Ðƒ¿jþyùÛÌ›-”rÓ0|i1`5㎚8-ucó´{`»—)Ÿ©ueG-3ÆWÐ5ЮÚßUÿwC¿"É×®µˆ]ÍŸ\-|vµµ•7°ù`3C¸Ð*hgÒphøvD9ï¡•²-4ú~løµ´ñ”sÍÿ«úú}ÕWoÚU†ºÞA»öá9"?B÷­nI!!w&;¬¥¿a–Lºr5µµ;ÙÆI š‘LšÁ¼åîÄö¦Eä×üQS±w™à›‘Ž#Á_ bI:*pÓ ¸OhQ£É3ÐB{)Wáš[ì™H„šûÅ¿¡³#ˆ;pÀwEÙuɉ5Gfá~-NÎDv±@/™ã±õ²a$e4o=÷cš’óHDö‰Ýù"Ðs;O@Õr¸"Y%H;fѱçê8’E8ÔBv¶ÛÐ] =áŽRîË<Œ³#ù³E |7 â~D="n9 IƒÿÿÌýÄ”!­NYŽc»fèÚ ~)èÚðGÚ'O¥œÂšISfÌ)´hxä4ŠM‚ý ïÂÀÙP®-dÚ ; §LOÝ7§4ÒB'Àìà»”*H<ň¿—hV;^ – ¬¡{"te‡?³ÛCå9¿¥õ3úA»: ú~ÈÀFZ´F^è8uL.{‚þº o°=3‚ pJã2œ!Ûí¯’±Ò2±£Ñ :QàûÕQüã4*ðÀíöêT¼úIì&‰¶{ÿã­¤ûciØv>­h³D;K^Š–¥ ×’£ÊÜFŒðŽ2$ÖL’8é[ø ÇrsjâØ·àBä0ÔÄSÎ’Ô• RR,8«—<€…ã°°N¾šùl·Vç¦#‘cOuØüA>C墛³ç[cœ‘°ÚHIgUƒÏ7í*¤—îg¢aÑ¡âUI,™|-ëimk7¨-å Ï›öù€ …2—ØíŠT ¤®e¿Z;V8åŠê: _u– ¼<§cJègT”2Ée -„«d©ŠgQ„6ÁhÝ›þ`l®Ò­·,©™ž3=–Qh\‚“°,þ Ü·Ð>öÁÎ_n®[üuCø«6á”·üyg“BMŸÛ)w*óùò'àÇ}q%|,à:ˆ|áѾ†‚CA¶R~è|„ÀÓ|FÊwÀ êŸ-!K%‡ïû[í«qAÈ«ÜÄKy­?±°‚?ý©:†Ä-¥29;>$øCÍß²@¢DN$wcË9¨‘f˜k‹CL’Ó•áñ8˜F ( ;ÄÁŠÉ×8gmoU œB*î¹ääïÛ‘-'&­ŠSƽf¶â ›-ø…ô¯B8õArT±jJù$ÂDðwÆOâ6+<ñÿQD~±ç 4–L` ®ì¢f#€©”̰…ÍÊ– .Yd4(#/áò}d(8¬n÷Éq¹ÍÜd¼â! ¸¸ g|4ŒŠ¾Ú±Sí)VŽ’g²7CžSf­#IaÒšÖa(kV„0õ8bØ‹˜Ø¢ìà­£4ö>"#’U(ÇÕû^ɆÑáÁÜíã‰ò¢æÎíK~ºŽlæ½ =M0™:VKñ0_#!mg›J¶%ÔûLòd8¾eYCXÑ–‘/â~rä#çîßZ°KÛ“/D-ež(&g“sÅ9LÀ‚t rÁÕHò}{Yé¨vkïvÝÆIƒ5âdò{=ôÝ8lð¢Íç)Û{ØÔÍy”#D÷ ¬Bèðè +±&¹Ð’©}hÑWÛX–îø£ÜÈ$&=ü¿CHƒr:Ü•-ñ¦4Û¯]9G÷ÙòkÕ+ÎÍex¡4\Šæ§ã¥Ù"òÖVÉÊÞ»(ý»Ä!çY¦;¹g´yúƒò»Sû#Ê xÉIGCµ§“gh> stream xÚZKs㸾ϯpå$U¹$@dU²U“Éîd“ì^ÖU9ds )ZöŒ$zEjlç×§ŸHQ±'[$Ð~|ÝàŸoÞ}÷cQ^ÕI]šòêæîÊÕ‰¹*ë4quvu³¹ú×êûõ¿oþöÝUD”åIçW×™KrËT7÷ëlÕ­¯sãVýÏô~Ćr5<®¯á§k¡íþš·kS­^¤SÆÞq×öˆt÷JÈ6#¿?­TFP;¾ÅÙ¤WÙ?¿²±ÇìÆ‰º Oò0ðï-N0hkàß N1ÀiÈz7$ëkgrØ,w §Í#±Ç“RH ¤£RÊ’º(XLm¼<WÄ‹°ø²¾¶©Yá*ýိ,|Ù4[Ýž¨žI?C¶Úv<^äÂRÞÞãÛÈœ"),.ƒîPºÀ BÚ ì¹Fz8·ÚÈËþµNkV¿¥EŠ›âcÄñ÷$‘!ÚÅIw¼áž;xŒ™QpéTdÝ3M¤´æ »Ãs²ÖÒ|ÏÑÚtòo‰wüeð“°O´=èð÷ëëÂX:ôN¤ŸˆtžóL÷‹sø³ºÄï2ã3ÿüEËGb…Ì"؇yqÎòõ9¤ö<².e†g=_uíLÏâèV×)'ëìD¦·BÛÈïKXÏ[‰ü¯s¿!ÎùÛÈZ:á|?—çÛ.Îw=>…¹þ ‡/ó)ÚÚ£x¤{ϳüeFþ'™"{+[¬wî¢Þ½ÎMö$dchb]ñ{í…³NÏôu'ŠÜ ?·yi„Äš$+r¦É³Ì«ìl FÖŠù…k²¤J«8$9.Ø<]5þ9Sg E×gëÕ¾!ô¤$’ßÒÌú)ÄCQ/¹9òù/âg qá‘<Å# æc%°  2ðë¼,}øBŠþ -»ïe jB—Õ…îDçDÏCP0-7pRƒÛ‡èÓŒÁ-(Ž[àñÃOº:ˆ#¡¥9lø<Òÿ_«™#wÑæE‘ºaâcXµ[ýµÇî':>œ#›€-r>LJSC|÷';ðj§!æNØGŽ?ãrmG!CÂì‰òÖÏ»‹‡¦ì ¯ "ûçºÊ)î;Ëã{F0H„†= þäèNä7è–DËn¨~8û?ô{Gûi½o„·pO²ã€‡$¶ÇJ|g±Ã-ÏJM­òžOu–o9à€òA•Ô3F«{ÁítGEÄ4‡ÜÈ%ÍüqLpŽ}lE켨&aßjwç ó‚í¥jËE¢ùÓ qbu O«2)Àƒ¥ÌË–Ö+ ÂÉ_~€—œ»®¼JòÚêˆÄ ZÿÙoG^ˆÄò;¢ÙÎQ sA;!9€Å A¤ñaO‘7ÇwÖFAÏ!M,?; 1ÖëÜ–ìr[€ö nötbÔE a߉£s…G7t<¢9ÊÃØ|Q‡,CUÆð¸éX{òƒ(•-':† ENjà)É””R–‰°21.¦q>ŸGµøP-BÚJ!-v1v]Ðb‘Êà´óx^#t‡Tß|r²Š÷Ú’;°XLöÇ/º êz³“ÜqÐŒ´¹ÈŠà$Ör„“qàsÎejë4ÉKûŠPÑTàpê·‚H€Ïvd }óÁÊŠõ*»(Ž»"²Wã^[¢û<µwðlÛ¹Y}à9ôvï6oÀ7ºÌërv¾ñ"1Þd‚LÉV Vã=?ÇÈ‚÷¼áŽÏ‚Rðy²[v ¹K!Ì” Ø¶º Í¢^÷27E›s‘Gȉ¥8B†‹ÕÁYïlìçi/2ÿU†? :‡,h¥ak9Æ)ÜüdH>7Sµäˆu+ ý§…à‘'EeB¸Š ½ƒja½Ü$¦Ì_w-.Íb×2 CF| êÃa^èÓs ³´e‘¸ª^<Ë$^&ÎßÄ!ðžÑ§¸„`jãÁ>Ï0'65žTS$AÓ4‘rв_¨2± ÃÌjßûýÛP÷hp–Ýð&×ní¼ nê8gz¿`[.‹Í$vK ùež˜ªŠ­Mý.a©†[¾>ÈÙÒ9“t‘ñ È ‘8#wB5¹¸ŽØW_$c _îè¨è†rÔ¼}ÃDgçÆLÌŸ^‘ +Gy áÔÑI®™¥I9ÑûFò±‹ ájy©€Že3*-Sé^š[½¬ÞÊÒ‚’áq#¿´1-Ô¦™¡¤Š$ )IY" ¾#³»~äqqqyTHÌý <‘øj)<Ÿ«2¶’©{ÓÑKXÉè·µ·.½¾ÞêÔäÂð<‚Îwˆ*ܧQQ_ºø–’ã¹ÝCR_'Y9¯›­³uèüø²YH™ (zû¥e2“dµO¨àøk 2i=AAÓ ê¬>õtßM÷>ñÉ]ød¯íÄA73ßë¯Ú1.Œ‰«>ôc(AU€#M½\i…¼{âøÊœ4ä[ó3Ó•) '®7½­¤4Q|¸p[‰]o½­$bŒùÑŠ¾ÒÈI»IyÿL±è³:xõÉQËߪ("Áï‚Øÿ¦6©æW1 ?L\î’Ò&ÎrÍŸM+"|àü3¹´JëÑç7’ÜR¶vEˆG‹ûGÏ´­?©Õ³JgרŸ­Þ½-òçåkz–'颚}X.Üצš—As©”ç*åÐ~Žyóbþ%Ø+á•Yý4òÀ8šá{È}sFk¡0°ë%Êm˜”ÎüYÄŽ +.Àicðïruîu¬6æ­Å—d¶üƼ&v&N;—€!²(šý0†ÔAõPÀCƒM*Ä-Áfå… ¬«ÅAlA] P6¿3U-’Ô¨5±OêÇ› ™}™¶´35µþä›5N›[ÿ]"~åÑó7YôB÷˜@×_¨Aá3µAEt¶xíZºÕO¦T ü]ˆÂ[°C/£“Vãô#…<[EãQ“%¦¶—¿5TÉiîkíÅo ­¹à½¨Kj^â‚Zõ`¿ŸÚàGgì« kÍ·8# ×rí+*+Íà¯]‚Ž3O¦*gLš8Õøù’u5‹ Â®w?ܼû/Ë„.û endstream endobj 81 0 obj << /Length 122 /Filter /FlateDecode >> stream xÚ-ɱA…á“($§ñ ç Ì\v³T’µSH¨¢B© $:óÈ@\#Qþß_‡õTQUE&ªMGã…Ö-nÿu8³M [Yð,ÎVº]ï'†v=WéN;SÜ3uzÀ3üãéxîý:côÁEâ†_Ïìœ endstream endobj 94 0 obj << /Length1 1728 /Length2 12213 /Length3 0 /Length 13307 /Filter /FlateDecode >> stream xÚõPÚÒ #Á]Áwww—à|€ÁÜ‚[€àÁ îîî‚Kpwî#÷žs¿ÿ¯z¯¦jf¯öÞÝk%©²£¨©1HÊìÌÈÊÄÂWÓfe°°°3±°°!RRª[:Û€þ#G¤Ô9:YÚùþe!î:¿É$€Îo†Šv`€œ‹ €•ÀÊÅÇÊÍÇÂ`caáý¡#@èji PdÈÙANˆ”âvöŽ–æÎoyþsИÐXyy¹þtˆÚ‚-M€`€"ÐÙdû–ÑhP³3±9{üO gg{>ff777& ­“£¹-ÀÍÒÙ  r9º‚L´ PÚ‚þn ‘ naéô—BÍÎÌÙ è¼ l,M@`§7°)Èð– &«øhÿe¬ð—àï˰2±þ7ÜßÞ²ÿé 41±³µ‚=,Áæ3Kࣔ“³»36ýÃhãd÷ætZÚß þ,Uß:ü»?'GK{g'&'K›?zdþ#ÌÛ5K‚MÅílmA`g'Ä?ê“°t™¼Ý»óßõÛ¹=ÿƒÌ,Á¦f´aêbϬ¶tpÉJümó&BüGfrp²°°psñ@»‰ó Ô=ìA*Yÿ¿õàíiog0{kämizûAôtº‚ÎŽ. oÏ+þ!²²L-MœÆ sK0â?ÑßÄ ³¿ðÛü-ݺ,oëÇ `ùãóß“þÛ†™Úm<þ1ÿsÄ̪bÚÊʲô·ü_¥˜˜;À“‘“ ÀÈÆÉ`eåâp¿¼ÿ7Ž2Ðòï:þå+ 6³ðþUîÛ=ý§d׿w€æo‚Ðþ7–’ÝÛæ‚4ÿ,º '‹ÉÛëÿçuÿÓåÿß–ÿåÿuÑÿoER.66êiþ2øÿÑm-m<þ¶xÛ\ç7(Ú½qüMµ@QWÌÎÆôÿêdo\›Ûü÷-¤,ÝA¦Ê–Î&­Ë_r?ˆfc )Û9Yþñ´YYXþî]&ÖoχÓÛNþ©½‘çSJ‚MìLÿ`ÛÛ„ŽŽ@Ä·!¿!N€'ëMAîn1€™ lçüæxkÎ`fçˆøÇD¹¸ÌbˆþB¼fÉÿ"nV³ô?èÍRáÄ`Vú/âa{[¿ÿ"^n3ðôÓä¿è™Mÿßr€þÙÌæÿ‚f‹AN³å¿à[ 6ÿ‚o‰lÿo`ÿ ¾%²û|«ØþŸ¾ßÒ¾ñßéÏ9ücó–Ýñ_ð-»Ó¿àÛ}8ÿ ¾5íò/øV›ë?í-Ýç?áÿLÏÄÅÑñí û“_o£ýþóÁÜA&ˆ sv&üAV5AmwU¢nŒ;c‚Ó”;Z)´Œž Ží.¨p‰´•ékŽ7¢‰Ã=èË[’4×"‹$ÏžGÍup!-ñ*­^O†±ª“;­ˆ¿&pÆóŽDkû‰ÕEv½ž¼4ý­¡›!;å(³\xP•s±îÜú¤ÝkûK–F¿Ìí¨ìVrÉ#=•L1FjDèùÎPægÌâ‘Á:3ÁÓaž»£Í\ßLcf¿’ÈÅÒ#zG²ç{ꬳEÝÏ~^)Sgsê§À×Á#‚¾Æ¤òÛO’{?ïYT±&8ŸÉ=´Ô7+¯‰O棌çTÌ(˜æ§Ð‰EÑ•åf’æh£i2® ¢&©…÷ ¦,’6‹¯ .2Ì ´ô½&'R‹Ó†4¥oï&î:>Õè¤óŠ‹Æãcܳ%¾ÄÚìÈðázº‡e.NJ+À$šA¬’/*}Äú©–ã-©:ìY—ç©ÛÿšÃTpËhmâUàl«·ÊׇäÎó^yìÑX¹n?þìä9¿3ÆbX·¾ û'pݰƒ7tk™í…=¾û"ˆA–í½êIiÏ\ÊË,¶­¡”քʃ©ö1)ád¿0êôsFÇI‰ð’Ê)æ1Ç H5\&Iú+Sª½¯áÄOBátÿmžÓL>»¾F.yñ:º¶©ÌCÀúéå]ß9Ždøz›+Ž¡¸YÜg*­oÁen @^sLeøn‹ ¿ocÙ¸]V®“´ÁgúNÕªdÏ•ƒÁäO1 Ó.¢ÆÄûgy_e™óXG©4[I¹ÜšÇoüë“LJ>GÅ~šÓUð rô†“ðVÓu›ˆÎ/Ÿ\årIÚAz.ð© ç*Qšq²¢sÁïymp†«ÔT‡R¼Òäš­ù÷"®Ö_‡›˜$ ½>—vêäZ¦ñg*U#”'aæyÀ';‡ŸD/–]äî˜"+ÍüžñÞù8iØŸnr'Ô†©IJ ELkû5X˜ô¥*®þ˜væ§AŸvL‹ÿoÒpMA²¹Wºn¥P6GM¨töŒ ñ'‹³:V«Le@RÉÔ¸MtN»û(Sþꦼ3bÀõ¼pô€àEݨQ`,E’y k드Þ~"Ë÷ 1Pu܃æÛ“Â{+ ò¤¶n«l­ä­àŽ^ᯓê˜' p ñúž¥Ú…F¯ýLÒ‰nX eÛK^Êwlb‡æËun—ÆÖ]RU™HHþJe…fVüQ¦Âä16dô\Ç¥D=æP»Ñž÷×t÷«§'Éø“HX j*Û¨l­¹eTÔEàr|=£}•ð @¾}ÔÍ•æ.|0‹1ï[ý¶ó †#æÅ¢|½O\téý5$¿’4E(æ|<¦A¯a’xÚP¨Ü,ÁÓ»¦Û¹ûÌN]X@5‘ÈUtΖ¼ ûµ“†ž&ñ꛵ŸQ žÄÚ sÍT¢5 æp\T´u º}%ª³ÑÁXïCÞælµžŒ¿Ïá',Ûâqu/8ðX&”]h>4ؤ‹ˆr®óN¨hÞ)ƒ¼sn»ëž[Ù\_0+ÆœÆâ1ƒRî¨T{íö¨Ã¨¾¦*RÕp×a4c$9ë¬=¾Ós$òõâLT,lâ$«  ë¨Dë$:^<¨ŠK”ˆŠ¨ehU¸4³¢Oˆ=éhïüys”5œAæÎÒskA]ºæ¢+²è½±¿@6ˆ8l*+I‡À°êÜÕßíweêvvo†Ç)F8‹³–ìþd“[YàmÂÄ’CÚ«¼I„ó-$)–ß­—@±WÊ’y`k‡ /K4xÝQµå„ö^[ í[f´õ,£C`c¹WE7»ô|™¬Ž0¤ži6;e|îJ|Ú5AñmE‘&žFÎ0±)8o þ¬&.Óh ]­YÄõ.#iÔ¹¿‹DjYB;{ÈÆ|z¤Ý:NÿíÜ;Ç…k곡µun™¬ìV#Ⱦ(¸6_ê¾Z GĖ͆©¨Ú,éá¹J¨ü\hŸ4ñ½dÄp ¦w(’áâ­ìY0Þs pR_á¦$Vl齿ø“®ûèO÷ p¸y=¹ºe ú•åÖ<ó…å] °¼ÑâpfNúÂ3Á«÷9ÿXgl ZY¼H^{„МL¥_Y÷ÑãýYñ’-˜w”5õ1äv'û§X= ²ì¤¥yÏÙŠ ž½_qÅcósAÐ.ưÎy£Èîƒ*¶²˜¥ÐåöÄQþÙñ’k¨¦Ô¬ž¨…uµ]JCÌ:z:Ï;X¨Ôwggt°DaJ²T\ y9 >·¾†qÌßÚú£À<´D‡kÆúƒ ™p¯g?5hÌw®ݯÒä}dKo~ÎÃ[úlÌò…ôãšO]³Ê³­áÎPæ,&Ü D·„e#6¸¹‰’EôÄ¡t ØîzÅmêe²«ÄO0~£fñ˜\;)ÆËŠ"¿–ƒ×°À¯­„pë=c:ŸsV,ã³G&’Dõ޵áÿjy÷¾­gÎKWõÛFµ§¿l$VPI†cã5²;ºE……閵浡 îY¤;u‹! zü5öŠÝѰÿmPM²–©“†ìà™þÃt*º¢×4Ì·XS¹;½O%ª¨¥Ò~h¦4èkJÑ[„Mžd¸6÷z_úÖC<šˆ©wgç¢g‚‚ãwŽ×Ímߺ[÷kÐmáoA½‘*Òû—ì^±†Lc¿‰æIm”¹TÅâªöºˆrÌ_…›˜–ˆöQë)á´ƒŽgÅÈÙ>Û+¬—ßz棿Á ðûš2TLsåï˜e0(wÙyWX·©ò´p×_ Y"…†6TƒAµéJS¹„"­U˜ûF•ºbR!« ”3¶„émûXub ¿6:Š*°û»<ýºçR“¢C7W·;â98ÅLƒŸã%<²&_Öªù2î!¨6ö+¬yk‰yòšÝê2 )%‘Æì®6‹°üâÖeš™ Ûõ~ó|Vmgu`n!`£n=µý#žîDhܘ¡žp”–ó¡`fþæHäz²]UÂrÛ•žŠ¬4ÚŠ›bì4É(=Ç!-VäîéÉ8»„ü ,­¹°Z±Ñ¯çz"‹æþãr¶I‡…„ +ƒ¹É‘M´ÎI‰¬Bà/7òV^Sׄgùpaf©i¡£ã¢ÍB4ÝY«d@^æ6áB˯¯9ÎÈïÄ!ͧùÀÆr¡ -}Ñ÷¬8 úx¡K”T5kåÐöʹA8ë¿cÀ5”ÇãUXŸ]†œç|“ˆ—Þ…¾çh ßp ÓrÓãÏ-ºƒÑúþ†¸æšÀ oØÍÃÃK;Çóð‹†®€Mç(ðEñ‚&¢ÃãÔii¾ù×:šád[ßãØ¬ÔXx_òW×8•a+´¬ŒPq\8”™&~Ðäyƒ>õ1HÉ_|Ü…AAM…ņPÔX¿ý…v{¤\Pœ ,Éðƒ=êÜbê}ÄÏóã|6UâŒÚž­Èé†Êä­#QT8߇¥È–Xýx’üra¬N{ŠV‰–Mù¥V¨Þí`Åõ±vËâ=Ça<È´“ð¢å]è¸=Dqÿ¦ž#B$/ªhiﺎÀ½+}Él¥‚øvkâ}ÑT4vá½G8“»øÔÂ@U@§FQ¢÷‚žì·PG’Œ‘‡‘÷ræÈ]|»KÂxŠGqp4i¿?`t3%qFj«"1/=´yÂñUð¬ã E‡oö-JaJP)Œzξ0 —eǹ×Õv’ù¹5(G­ù¡·ÅÄŒN­ó¼${vÐêýôBeTQ~’I¥žh£W…x-{ŒŸ¹øì¨`X”ZwºrhÂMçeCâ`ÊkµŒeð\%øö°cEA>bÌ~z2øËx¢´@ãBä4Ït«eYŠÌ› "„t ,&,ýà3š®ÍQ8=­?SBÿ)äοŠ:ŒXèšnœ-³?^JO5J)f{ÐÀÈ=Œ›©öíìù ÝE¿d 1gèlë8ó.FT סn²úÜ)º]S7A£:òïeøâ©°„!Á6ô‹_<ç _)b2³Lw©ÈYH&íîœ]të¦U~Ž>Jj ’âõÿÐ#YqÂr“|½¼+«\8æj)ÕšDú‚¥Âƒ€rR+€LénCåOPˆ8wUŽ~ê#f±)¸.U—»FƦ׬ϰí;]-â¢)Bµ‘Ú£ëÿú‰ûi!rñ—QRµ½š0e“¥×ð{g/]ø[\c{nEÁûô)î÷NÃàúè “%nl«èóÁ]¦ÌƧ>º´•÷pæ…9ìûÏ+ÒTÌöJ=”h‰D üåmÎñ»(É|xöû‡È‡Ø÷=ÞnŠßp0˜!<òÇËü¾³0'oY‘êlE‰„çí¢ܼ|ö˜³™¡}}&«,_Ëç`ov­hØÚM¥žÂ/°åA˜@%{Óúelí}Ž_çÃÀ¨¾=»^ ’º'Aȶë9ïD/ÎÜÞ—V@óQ_äþ- ¹t¶ùÒå¦å#^—{oû ÿRp´ÅdJù€¼Ë"ôZÀ¿†ÕÝØH±}a0•-Äð)‰Hêq9!ò[%d‚tïûl«*ˆS\ ª1µ²´ÃT‚ˆÒµòŸæz[M=_SV&ßÑ[ð0…`“Ö Ç¾rxÃÐ÷_夜™ŠÎåðßK÷uT}÷Ëè×!­‹ÃË)®=›B9H6 ¡Auª*” ¼øÉÿ¡ðZÐ*O Ÿ¾bVVª…5˜Hd§c‘¿Þö?è{^h¤õž†®;P4'›¢à|à¹0ì0/wb¯çfÏÈB›Í†k§ÍÞM åXE~@]f%‡ì±k)Mjn|#K¢m’¡|ûË'¬‘ðýø;`Û ¿Ÿãg˜‹h:ÖŠècÁ"ÐD1°óxŽ4È.¢âÅZK»†ß,¥ÌípÛ,´Nƒ^z±)Sö"´¾Áõåø.õrüÅÉ›Nû¹÷—|Uaꥉ½¾¯O*@—ÈVLw {Ãw«æ¶ŒÊDH^n¥±sŠÏ>1=Ý_¡„lz”¶xo=ÂŽj»ñ¿ÃC€ó´°ã$O´LÂ?ç æxÛ2*Í8ToØJ΢&µ››GQàÝÈ‰Ñ U?À댺Ð:l¬{°nP¯áÙ-¶ÔŽ×Òö”qÖ1$FúãÜaiyà§ûàã)ç’{vbTôfìúFÍ&Â}æÌÒÒÛ±åúJË$Hu–:få%†§Lºoivrµñcð˜2öI&dšQØepC!‚‹å¢¯{ •¹ïâÉG«Ò7™hl”©«o@ÒdÒ’4@!*ìÚåKV6 äúÈÒÖÉ“²k_Œ¹µc"A(¨Üî`zÞv§8˜nLôá E³DSº©!Øц±¼Vj¶V@yÅöWÕN8X<ò¬)tæÌ g}E‹Üe‡jdKl]«¡“¾g-Wù|ü¡¥rwmír(Y»`îp¤¨®›eŒÙ ¤"9“M¾az5âÎÀVX@ò¾=°píÙñ“>UråÒ¦~ºõåIZ™Çñªá‹ÕÝÕù³-ÀïÑæYxGæÆÒî÷iæpÝËD[«òßpbzì°9ÕdPÈå³ÐÞëR!Ï—áí^™ô#gãÃüæH3m&A×[³¶9 º@}@OÈ#âá¡¢vä2‚q–0®ýù%Óö`Ý}þ*ÌRž4²ÜÉ%|"Î4¼vAÐO¼Z[øÒ¦-0qTÓWËÔce‰S-¦vrßzùˆåhòI­¥ÕBmE¾y;’¶ ÆØoþ¡äCXb½M“ñ†Ó9AÕ‹'䟬g@Íþev¹27%¶âÓªy!´oñíÄOú²ãO3Ò@¾ïó8në`T’E~´æDÀˆèƒ<Â7aó¨žwJ±_“ßq@Ôð ÓöE«çÿDè7èÂ\)JQUk—ùÉwdÍñý{Y >É{Ÿ] iép¤^à0 ¦a5mg…^÷jFÆ)"Ž»{aì€}©OxÓ¡5G§ù1šX±ÜyqŽAíÜÜÞP¿>›%økÅ!£ôˆöìÝçÚ}zi¯8ø3Ã8G}I騥5 ÃRz”yL¡-¬~½"øûk2¼+M•D sÝÕ¢‚q)†ïAø¼éæÙ‚j9ÿ’tš°0P®WSmãÅÃ`©üµÑü»­Ïú7£¶ˆý‰P¯p˜ ÏmQ9“dÕ»«—¯§‰”Ÿjž¿Ï' Ï†¸¤‹‹´¾DÄ+Ú èFG²Œ =ƒù¡tÔ¯¢éƒ‹Uus­ïÌûÇ #_±q'ß'a‚;ÉJP ªçΫ:ֆ趞|ñ_Žo.¼*øøÑ5a”bÄ>vk|F^–1>JWJÈ VžPpQp8+´Õ£WÊCÖ#¶Éž*Éâ‰Ï¥;Ô™äS1Ê‘…üÄã<mṩ3mÍ⑨êìFXû7Šù‚w-_¦‚‹1v\ˆjPl»W@Jã~Y©P"¬ü1±ÇcœSošœ™÷ÊXì]BfaÛðF%W¶nпÊjÖ;õã½Xàì6äæO©W gëøÛ+šâbbþÅ {î?Y ‹ËðiôØF¶t¶;t˜¦—¥…oW6 üA2"ê\xPÐØ×퓞x0$â:¨îVÐtÙ‘¯6œ`ûœç˜±ÆKº›Ô‘ù÷NãÐÄùqô%$ª]XV à¾#Ïæ©<é ~ö{ÉWΡ“×pˆ³Î†HÜ"ÇÞ³n®BB¡UD¸8y”&T%®Ô’E!!SýÄ}^¨õÒº<1}87Puv–ºÅB/2V;«¾¢¤>(|õ>"oéÔØ*WêîáÓ̃?äb_Ÿë…Ò"ÌyV…ÿJ¡Këô¬d*AU9±~ Qª8CÃ3Bœj,Ù©r$ƒ¹‹îÌÔcƵ÷áx.§W{t•½_øÝ Å×O|Kÿùr»È„mê=R¼hË0tKJŽgò¹÷yt˜Íóª³@׃50gÁ R{8¬"3wó³|_v1S*wa¤ˆE:#½+tcÿã÷j%$¾&ãÙ– Àz)|öåÌ‚LCžL>>#wM ‚¬ØGØw+_Í¥fö–Ó.ŒeTt˱'Љ/HkìüVÒÈ h8l/PÑpø—.w„TÞ-Ikíó¿;¸î§g&Î4+ÏôHºy&¢³ ¶Ý‚û±Oñ »×S½_a.£œN4…ñ§­O䟎?¨nÿh¢×HMf¾…™;[~JÒn6ÁMÚ’Nà‡KVÌ?f¾üSÉéžæK¼£uõútFï©Ê%$uk¬ã–aÉ`Šü•D™AéCû^‰TaĦ‡ÈgI¢/v9ÉÙû¦ð¼ŸÄ…›Ô4 x–›™[!rê¾èûl¢æ`ä‰Ë*­ïÛ§¬›2ŠØ9%¥}åÑy*i@gaæ( x†˜ô)È7|y†áš’Ö‰£CI(Iäï2«5ÿøÓcúpÚâ›i‘O1AÛM·™N¥jŒ.ó»%óøE€ßT%×í¿“ t¡ßËm Tx"êÇ'ÉY1át?γGéXò4ÙIïDÙû²¶Áy¸Ñ¿)ýeog.Ø]Ëï3Å4'$“#9Š‹Žnt­^Bïàð‡è»oWñé>5k:®&èl¤!ªçcÛÇÓl©¸²_ˆ¸œýVäz¤d†æ|T®müý°¤D¡¾Ì ž–WQp&å°9Ö•vHbv¸Ìš3óÝÏÑF‘Û«è[{ v’¼ØçY¨HZz§Ž¾”&],÷nçE4–DVè//Bö´»ýî×äÉÞ5ëÚÞƒÊ8ßÈoœ5£ð\æL«S+L —ö^%cr¤¦çü¬E{d¨½;Ó»úñõô(±dE4KËûÝDa‘b%+Kl¦îý^Òï:ƒ€T’ËJy˜ëªÂ•gü“Íô‰c–ˆ[Aàëñ©®gÃ{n“žÝ•î‚ÉM›Þå¶î6ýœÔ~ˆ”ÅxX$‘aª#ciÉéÛKçˆ ;×b!Ãà8£Sð÷ÝýGÖnˆ½Í4ÉN\ˆ—9 Â’á)¾YLÔŽ‰çŠÛŸÆóW*c¢½HuP‹ŠÂú_ó+¯¬±•Ðns^?5öáj¸|C?¯X}„•µX¯‡ˆ–Ôwäñ"s3¼qþNõeý='ÂëwO›®rΧç¥Ûº†žKÜ_ð ÝÔáZ\ ¥s¾vîÆö-ØÖ„?7h§ÈöŽùÇn‹8 ôƒŒûyøä„³h¬†u¹i0¿ÊŽiŠèx×Ï4«Ýå'DØUŸ/®î”µ·Š³2‰ù㘅¸QÉ2 WãH ­ÈjùÌ7¤¢‚)?)xÏ:·LÓ(ReREy½ƒ"¶§”M¿³þE´Ë\×ïÓ4Šßâ´ƒïþjf^Œxm|@uѾ¢¶1g+ü‘ù|é—øî>4 µwLïÖ?R;–w©kîGj‡ ( ‰~^¼ÑìXôrʘxˆohÉ` a"{ (BxÔaKìØo¿T™+ós‘ìÆåÕæ]áæ¹Uî:æ¹ Øü–GÁ­sà0¹kê„>y÷š“œ^`ÇîRß;Úܲ“.RÙÄ£$Ç?ëÇY¬§L#N¿–|Ýj°5RÁ$â>šÍ9Çœ‹N‰[{c_5¼ß|¿wí2ñÉþr, ñ!#Z¶™¦Œ9©¿ü§ ß†âåö»¥KdïZPRs‹.%‘&ºé5ŽI›WÛ[”Y\vÕß2 ?Џò‘t)K÷ÈàÍdÞ4¬@+`ïZ›Ú3 ÇF=äéຜ¦äü64E\sbDã$«¸³p–§ÞÅ5â?ÍNôO©@\_W[«ÍÍjW³Ž)°Í.´3öÄ •oÈBqê.'96Ý€Y*’´U?&KÄíãr•ßbæŸè“ÔYÊ~¬ÖÏ*¾Î¤Tôøùko­ÿ’©²ÝúLJÍ5q¤4§Jx=}Á Ìú¦ RʤÑûÕ·w†æ!+|<³aQ(4Uµ­P?»ŽÓ2ËÃe¤M)ÎÕwýÁ¼…ÅDë êI©Ñh›m¯ªÑÓÿóÒÅÍ“3 þ;ׂÀr‡ÚÏ5hÐh–;ÿ2¿·ñ˜~éã%CKÀZ…\}ï~#”ÔEjû©‹1.ïÄL¢…”‘:á¸"øGáÄÓË~è¨ïóÙY'G-Ü*’“2›¸f5﻾K§Àz%\“µÞ2$ó.=T–óZŽÚòä¾*.R D^Âî{ÕEª^^[l'Ž>y¨àÑgFA°‡3v¦ŒúÏy/%Íwú“gE+;–¥^¤š­çç^Ý%Ýk´ ×åý‘Ðy¸¿Å/ê#®•.—†9qù”Ý#X>èÈX±? 2ò{‡àEoi“_­«A‹Üqx7P÷Áe~ÿX)•Ÿ`ëÞÍL†NGlÉhǧ·”T*_ ¿Þ§4[Õnml¦ùgýîп[‡îÉáálmÌд{?¨Þ~á¦ÄPAâ]…3|#v(GÎv©l –Ÿ:»ô.óð׹Ütºí#¿óoÐ?{Z}.Œo”æ>÷OO”‰ÄyUlï¡'(ú 2ûÚà/žp/RRÓÜj.)„‡v\g\ ©@µ•ÆÓÔ6ƒcMØÌ†éÑŽ,ü‘6c&Éèº>h¸çêÔbH¨á {·q¾ñ—éEpQVãýÆpµ½Iœ+]så©¿''&$A­ãjí!_UÇýä%l«"zv„*,Ø`„íÑU×jXO™ÃKÛélsH=Né§»Ы91f+ür gJàB *¨>ö¹ÈíòHŠ3=`„|NCšù«DFÙÃH}x¦¥Ç?mÛáÊÌvkÿY%îŽ&iþË2b"rŸò²ÑUy%q¡œ…HXøÛTçûz­k$[ô“LÂU†Útï"W8˜¾Âá_Ñ7÷›Š-àút-zfí¬2ÌåO:•bù FDÛ$j:… tª¿i‹™Q©y}¥JÅÀz>ðäýÌ :CܯÈűߧV ×Hw°Í&ŒÅÏZ—­èqc¬¶z_£n#] ½‚‹AŒé—vmS6‹ò˜FÙ'Ï! éÎ~ÍC|]'¨«Ä)!?ºÕú6¬~æ'ø;=`…Sœ{‚\zw”ï« ù(Ÿú‰ nàd¬Š®;Ýü¨¼ªõ"ÅNÖ¿èPÙ쪗¿ïÆÒÙØ uNIâ{äÒ'M,Û7‡= ÿÑÌ#ßטÄp³Ó#Ÿëó“̺Ҡ䮚Ì2ÚŒB‚߯|rÇÆɲ%I”)S²•U…5܆¯Ð×–õÂeÐTñ:U_ƒ¿ÂÐÍ]s‡õH)|⵫_™ŸÐá¨ÃÒšW¸HQ0Œ‡*ô6–:À˜×\±™S?‘)~ Jºþ¤Ö(§Nг‘î"ÞmÁ²W0Óª[KÁ'OAteï¤M„kíÆƒn÷…§ðÂç`¡^£›&©Î>TÀ‘¥Á–\dýþ±( H³5ЊèDŠÚ%+Œ12òŸpåöKÃùpßå(/§‘þÒ»Á¹¼€8á½¢>¡r)Ÿ&4ŸÇ ç‘l9åxžc¬P?Q¡Ã¥“ÔCj©« ém,¥W ª'm·ÁiÄç‚9*Ýú;EÐx÷pàØ‰Ås?¶>ZƒŠfщTFc¡ËíJ¨:æx4ð,ÌzK±~Õz° k/âm®¿{yÀ =ŽÔtÉ¡*Uñ±]~™ºè¢VŠªÐD3Q nâwÚwE7ë*O`Ò#è%M4f.˜Æ):µ6$M 7ý{ Ä!¹ïÆ|+1Ê«ãß¿DST Õ2‰>´ñȳ]¨"êýDÚBTRÍî Th(¨™KS$špwFÏ5â‹Ô_ôS=¡¦ Ôç¨W•ˆ%H~¸#•@²én£ûýi2±Ö`µ*,1d‹Ña®@£† »Dl¶QNr#÷€Î×OìˆÙZè­™ Àå QsrÇ`î©GNm ã º1ä9Qˆy;)¸/÷Ò};–y<§n̉7ªûyÝ©3IáÃéà¶ýý}vHôbÃ>4h¶º%U³ÇÓ8€":¤ðà,T-~‘Ô²åòÅQæþ“b5A‡‹pËy¥[Øuò|­|šÁo²ÖÔ~šOfAø¦Šë¹O~Þ×WžI¨¦0u˜Kw`ihDLãhí½|¬m(@Âxéjä®@’^ cÜ(é\õðX©6?ÍЭ›*|k$ (öĪ-"z‡²ÁògâOþõ¡Î¯ãl@Bb:ùj}8Xà1òkN†6“’KW8QêRQ±šz¯ÿûjb^åd|‚–|È¢s•;…_ؼ©¿î±Ù”Í÷€êù^¯HÇg¹ÊttÇëð‘U)~Nx‚ZOs*d ëfŠBFµ®$Ûç4Øsq6rèqo•Z &Û$®w"hkç¸B‹†-F¶D;¥GC.ïzݸ ÔÉLûy1VË`UÕÓÒ™ÍÙÄ8 ³nx£t{kÃÓˆ ¯sKUyô6עݫ›ê“®a[ åÃÝ™:*²ÆwTÛ(؆µ¡/1âgóœ@F…ÃÔ—ß®îòúŸ/|¨Ó¸æ„ ‘)/¥G|ãU¸J~úÕy®ð8zÓ/8ŠÃ˜w6´h:¾9áõgÙ˪„C+ùX—maÜâ2€Aí|“» ¶ÆæÕaÜähE3U— ¼¡*_š{¼þ²ú.¹ûàÓÑe'X zæLQ a(äÂWEÜ9æPžÌUÓW¡w]Ñ›Iý“mm‹´ت‚ù÷D_Ü8nïòVÉ|D±N/{ W§7)ˆ˜os¶¦Ú>Êr ¸ ¥Tšê!„D!ìRUKtœ„ñDõŽ˜”eN~Çø¨°ïœç§*VÊDB©¸*JzAK$½_³pœ.ýüÃ깪,«Ad8DTÚº`>ºÌ$p~S'WÔ¯Û\¡=µb¼*LÎiçÜBnî ¨«>þh5)ÖC|"!¼R™¹\xÊÜH\¤€¦Èƒ bH!ˆ¥_,sFëSp‹ÇÇ&«{}™‡5´¥j¸JÏžðZáCžõéfø)™žÀ›‘vå@¹“­Þ¶¹z£°Gk[ûX8z°îÛU˜qðPb•L¶2XÎÉ’…Q^åP¸%ï»±tPÔ³²;Žâò'½ìÀYF=Ô!½váËx„š]¨’ÀÌ®š¡L16H‡!bÜr¥\ÖóO@Y~…í µ$E;¿‹^>©ªÞ–E¹#B=äçºl²qƒÔˆyEKd£VÓþ]?ÙjzþSß#F/’³ªNQñË«A+ô/k(ÊGËQs{n• B¡•¬ú„Á]¢ö6C2 ±pU2èì"Àj€–ˆ[Áéjœ­(³9„Ò‹ö=ÎQH"ïaïóH€óÕs©°ÇÍBçk æ4>›Hz'üׅ€¸ú±éÙòåÝóÉ¢Ô)l(Õ'‡:¹Æµ .NÐç/*¦Äž2øœ_Ba­te®òM›¡ª,Tñì’+v"3žÚ¹|ü·öí"ÊòL#k[LR>-<&¸S Àl8÷ÅÑô.ˆ+(J¤…Fše”NÀ4ý`‡í/(ü‡5G I<ïtGŒVQ$gõ*%"(>±r#’[ßÂU·4.@W=Æ Ê¯î  €Y$¬¢O ùd"’ W­?Î-%Šq1±ÖœÇjЂ %;m‘^´·‘û2H…üN‚ÒÒ\h¶B•®>˜$ع¼òW¡W5v*1­®h³ÍÀV,[»íxiáË 2í‘ –jíÐuˆlÀ^Ù~¼…fôÝa¼“Ň”õ’yÞˆ}ÜPp³%¨Iéx0«'òËýÁ®Ï¶Œ¶Wü# ™ZvšcKnœgû󌌾¸'rÈo”óCÿÚ“æ³Õ”ìtÿEy$Ô+F‰Û‚àþë:Õ¡ IF¯à)ò‰žÃ¨bR~¦°Þ}üszɔР7Dx¥´b`ɪnÆa¼ã%Ú¤A£Í—q"åÊm)1Üt¥iKØØëç–.é!!}=›2šªJÞ9khµøÇJûk ÿâ©•Là»¶gâ½9½| T¤+rç^áS[¹.æfÏH³Ò×¹Âs¹¢CœO‚úxÔž9Dyî·Ã.±¾NÌàü$Vd*,¸Æ–R0¤ØR _9‘ç õlÞökvàÂ7¦Å«¾¼ÐÆðÉiœYŒXÊ;Ýꨩ­ý ªµo.;B/¯9œ © ]#´HÃ.úz/„ƒv~ˆ·;³–iåÖ}-D.³Š”þ½ÀoÔq*žÄò‰¨6qÝiþ|ç³IÌÌýti"#©ÐÀš‡©´¾ÄâØU3Øluqçncb5‡²6—JƒÖkú’pwáÿmük,¿|PÕvoÐÝ—8ðã‹”ìãCÛÄÖ t{ÌÜùËòJð5Ê Äfu"ÑÏ͹ X\òሖƒoð5l‡æ6ÚTC¬•Ù$Íhb?NC*l§wV‚7æ(`#+DSŠv4Ú;ZsPÔ–ø”•åäȨu²ÕN ÑŠKÔ‰½\‚wça… ¯˜NV_Ïvq™Œí›ð‚ÖE†&?Öß’yèxåa[v\*ìíkºŸKx·™Ëí}î5bT© ð{Ý?‹à5bzW<’³Ž–Š7F#]áц>ª¦˜2‚5ðÖˆu·¯sx¼•¿ÂÔóÙ¡ôôjí‘GæFnÚY>^ëÑã}fxcªä/ìšjþõ Fþ«|åÜâ+5pħ1Œ­ß0Áç*P&ÐPšùõá6˜27¢fú†mçZ³Dß#¼›s Æ~X†‚·„qO\ÓVÂXî%oæè}âr™uŒV¦•nvõ#ßìÊh>®ZŸEf›M–Û¢'΄4K¨þ˜d‰Šbоki.% õN+«¹Mz gMc1¯ó˜×e" ÍGŸQlÄhøÕÖq:ÔWã+&7~×ÝÞzµZ37¿ÝÛåV>Ÿ¿ê£Æß^Atw`¨Âd ¿…,÷¶,µqÔ·Ÿ)þ->q{PS_("á•ÂÆH/’A~îÊVHHO”ÙÔf®þ[ ?Q»gÅ¥( ‰6×ÇOd]Qö¡Æ Ÿ1Šöósb­½+ð…>|VPvãê€ÒÏj•²š'{ ¼F3uU>ÈO¹´ß=Zg47ª|Y0Ø:Åâèå ®YGïc)F”%ÖÔ¬g‹í–e Å™Zë2;B´è°Îù¯pÎgð^ûš4ÃýüqÏÎ{7ͶX&þ5ôS%”}µIð| ¼Ú5Îq¾SW¯4–¿mª€»k=`¯Ý 爔–SåM(ƒàùPìúã™ÍÆjóÝ`y¿ÿ7kV1oLµØp&˜¼LYâ)Ô¹hz]W˜SkÑ•^&]…–¶&Cpúà|yÈéB‡³¦N;‚M+£~w›«jóHšÂ+Ø ˆ‹ÕK2#¯1 Î‘Nd&ç\^¹R(½pÈméD ¤tfÌ;—0•Ù$`€ÄÜ.þYq{𤙨Y@‚µ.ïÊvQY0H¸ÿåŠ!–Äebž¨Õ²6H…\-?•¦®côm†Ð «#|S´¯‚"òu`‘¼ýþŒêI½{^‚Ô"I¿²øõn‡)Ï“¯4Ó1¿_QØj;¹Í=HÍHõÕ¡ªköœyŽ¡³µ ðÉÐéz¯ÚÀn"ú¥r~”õfÑöfeííè€@0î7T¡ŠHtê_žèÎsrºœ±¨}jÞ‡¦íº*›YÌ`gu›Ö¼Âþö«áí-jÙqÆÏb›ù¦+=^'LóÛ±¯<ø•æg­RL𪗬idE?C®I¹NŠñ– Ì@ù#:—‡‘DÕÃw(³-Ûµ=¤à}y»ª.ž]JȯˆÎ^±²t²O¢Ù²!«ÆA¨ÿG· £ endstream endobj 96 0 obj << /Length1 1868 /Length2 11875 /Length3 0 /Length 13045 /Filter /FlateDecode >> stream xÚ¶PœÙ- Aƒ‡ »»;'H x 4Ò@ãîN€àÜ= îA‚»;‚»{dfîÌÜûÿUïUWukÛY{kŸj 5  3;¬ĉ…ƒ•] ¥,©ÃÁ `gçbegçD¡¡Ñ;Ù€þcG¡y‚:‚í ‚ÿŠ‚‚€NÏ6i Ós ² àlààpð rð ²³8ÙÙþhH]ÀfeV€‚äˆB#egï[X:=ŸóŸG½)€C@€ùt€„- 6BÊ@'Kíó‰¦@€†)ääþ_%è…-œìÙØ\]]Y¶Ž¬vP Qf€+ØÉ rA]@f€ß-T€¶ ¿ZcE¡hZ‚ÿthØ™;¹¡ À³Ál ‚8>§8CÌ@PÀóé y%€ª=òg°ÒŸÌ€¿†à`åø»Ü_Ù¿ !$MMílíw0Ä`¶Te•XÜœ˜@ˆÙï@ £Ýs>жš<üA•x >wøWަP°½“#«#Øæwl¿Ë^Èr3µdû}€¦»=è'ÇoósÞžövöóç6@Þ`sÐóЧ#Ðp‚:ƒ¼=ÿíøo„ÂÁ0›:L@`Ê?ÕŸÍ ó?ñóû‡‚ÝzìÏòã°ÿþüýdð¬03;ˆû?á¼b6µ÷ªoßH3ýÕòßNII;7€' €…“‡ÀÁÁ%àãaxÿw5 ø/ìÿäÊCÌíÒ}žÓ(»ü¥ú¿„ðßµTìž• Ðÿ#t}vvÓç/Žÿg¹ÿ‘òÿ§òßUþ¯Bÿ_F²Î66øéÿ øÿø¶`÷¿"ž•ëìô¼ÊvÏ»ùßPmП«+igcö¿>y'àó.H@,lþ#ØQì2S;™Zþ)—?íZ¿Í ©Ù9‚_-vöÿñ=o—©õóõáø¬É?\ çåùï#e ¦vf¿·Œ“‡„Bî(ìÏRâäáxr<¯£ÈíØX!vNÏ)€çæ¼ævP”ßo”—À&ñÛô'â°Iýø8lrÿ .›ü?è9RùoÄÏ `Sÿ=Gjüƒ¸lš#ç<à?ˆÀfò°™þ~OƒÍì_ð™ è_ðùHó¿á³ºÙÌÁ.ÿøy~»íœ¡ÿJx±ø|¦eù/ø<ð¿à31›Ágf¶ÿ@ŽgfÁgfvCîçØç+ÿ_îg*öÿ¸yŸÑ³îíþÕÇ3—1åxæâøO'ÏNÇçËà÷s§Üχ;YBAÿjý™“«Ý¿žgîüä|Îpÿþ—’L¡Ðçûô]–Ùð—7ä2E™Ÿ±3 ²úÔróYâµ+Ë‘IšÚ) ,žóÐVç_H‰ UŸV¡W‰]XK›2ô—â äžûµH¡Mño›ï¼î>ªÿhF™ÃïÍß—¨ùFú’„ES|ÛëÁÁë¿5\#l»M¶ƒ3?†Z.Îkœ[Í·ÒÅ¡™o·«xQïK'X>hEéûMÑä˜dLR":±"3bŸ¸aN]^Mbg>‘+|dBñ>øÀUà©»Æ};í±\®ÉéØADM¤KH w‰=4Në)¹›¤@0ëY\£YhNj8óU´èÀ]MÑ>/\:8º>HøÓÈ_ªss<$ÆôíäÀO¬6Bìì¾¢‰£<Ç·m;ø‘SŸ b½ÖN‡jœ¡©Ýq6dA—ôbˆm»¡»I³¼sD¹½ß|&èjãž|Å?Îqšä8éuzÝÐÛ^ðÝœzŽÊA3õ.4ߊjŽÁ P¿sXRd !fj÷÷Vb?Y‹Â¾.ù0þBÑj¨zU¡Ýã©[%sß4PlÁPxûVíÅÚ¬ƒæç 9³R=Ðxtš• B'~Pñ.‚ŠS#÷³^Âþ· Il±¡reØ» /|UÅ@`~Rx.qC¨ÅEѵ©àHíxÉDêO³*I³8¯qùÒ±£à7†®aʘ•e£ *iécŽŒ2.íø¼ŽpÖ¡±óvV|ÞÙÊ)RáM"åÊ:Ñ (!=Q¹J@^fÚF UºèW]«Î+ËÜ:¦­Gת§ÓM”ûZêØ­î± ýumV©úwúÇ*ÛÛ$Ù­] \¯0¦$ÄÎlŒ°;K”CÔ¾^—¢¶E»›k¸¯Ï´›¬½î6p&µî½RÛèý¬â aPq¶,‰ž˜è—™ÏiêT›Š4,ò&üÚ@ŽÐÑ1…²ÅR<â¡Å8¼HÆU¾ãsµù¦À• ÐãÇ[ÁÓHÍä3ëì ãx¦nM¥øy.„É¥ÄôiØÂºÂ¼si<Š‹Si5°“L÷¯äZsØa:|¡ïËã#g«pLsañ%ÑKrøäßMû? ÌüÈÖ~jLW7@¯û$Ѓ «›NjëeJ`Zë? ¯o¢âIMØûqˆv•MÄ®Oô`®„–…Ÿ›OlñWíyòA^X>ŒN¯èÀ„…‚ ¢ÿN·°MîŸÜi^ˆ~ÏV`ª(Ò÷@TÌøý—z/½>fqPÓN.|ÏüD{Ú=µý N<Å%éÒ¹@M”:@„O÷Ì»äÓR¬Ó¾(˜ð’^ê÷—Ĉ¶u,mŒ«›kÜ…¸Ôó ï¤uYª’:+S§´“ìëªÐŽrês|4¯ NfT÷k8ð>–SÜú“øÓiù¸ów¢~.M´Cbib,}'K`ºÍõëó Q¿õ7TË#„CD›f¼ rì*0íG]À×+•Ž>ô©vÁ“œ"½Têá,3Á1°)ÞLªÕƒÔ2ç–ñ´R)æ\0p«&¿ÿ×ZEÛ°ÏÚ£i6ö¬²ñËâµp s#Qµ½*odÙü’« Q„¹íœÄú¤ÈÜñ-¤ü ZÈL „‡·DÖ¯ˆÐ„E™ßøT–õÃj‰Vù¼Â^ña€ H’ËbÁ5 b ELæ¼i‰µMoߎdpÀ@«K.¾‰ê– ­ˆFóo¨éÂÚîÆ"RÙ‚¤Õ.ÆÓŠÃx›^L¸(t±”é0Ò¡ïu Q¹IA¢ .Ú!0ã™Î]Ñá.EhæÁ¡ˆ9AÓ‘JGü,C¦p]ÖöKnÊ@'—°)‰¬¶2ý~Þ†±ajèµà{’:Qû¾«Ä¥¦»Ú¾9ÝÌ>)Ÿš>›ËÛËòìf³TŽüaA6ÿ_ fÜ>”Ö%ï9oG˜N¸ÞyÚß~°™Ù—«¬«ß@烡"ëîÀ´¾]vŠ>¡P›è+±€ørÛåÚŠ :6½ð)P—T ‹û³ù “ª½ŽQ˜“€'I/F]—ZØ2[jÅ5¥•üôŽ[M'ÁÕÒ¤Ý÷Í-XÆ;( N³ÀöÀã:QtòNO&›Û'¸ÇÞCMûö'ËËfÿb ‘<Âv]¼­e|)ÈüŒ®¥ÁoGÏ!ýk2kÆŒ»3‰Vî5éA+méEf‰ñ—®,”LÜ5Ô+¢ù)"T• qEFí-2áUNðF, ­ }¨&¤#y¡yçºf1'%–¡I±_"czDÝTKrWì7cá 3å”üæU ,Eϳ&í>\LîggwÀ,((0éÛ¢Œ“(Ýñ~ï²&‰ž±õ DTAKOt굞v-y]=%0M…EV*]¼Ó‡0Õ`¤ V‘'#¼%f“Ì{™.*8(ü+>Åk@nó¿múP}ð5zÅb@šY§>¡À»Uúî0˜b«P¬˜·f‡¹3jÜÂbx_…ƒåÞñº¿Â¬SÛ~ qÆòÐ}ûÚPiz‡]eOÝ!íŠb‘‘oÀYIµeDÄÄwØçèÞhYáåƒT€¼˜0Ïiª&š‡cQí¡·³’q’òœ_i%_¦bÛ$*ÜÑõNóÙVÈ2¿»* Òóì,6ß+Ûج‹U:„„„+g~;Q‘:‘7o÷ej €™Ë÷KZÒIJcw†4AóÚ¤úSx|A—&z½ßi5RçÁÇ@ÿ{wi}åÚWoæNÞ~h™Î€š_ÈÞëóð„&Rmλàé¿­eÀÛÁWÜÒ(0$©õ4¦V(ëÜ1óÓæñÑ{ͨ“—Q Ø´±ýçÜGÛ}Û{‹Ï˹Þ*z2Ì‹ ÃkK·˜‰6ÛƒötÓíç‰ÁA, Lqµ8¥'“¯ò+*{JÞvÅJäj:ƒ«&…Yº!¦×ÞOþ‡ 4JsŠæªœ˜Ë•þkz•©Z­Ø*–ZÐS+Ô7+êÌM½¬Ñ=JÓÚ_´‰níË›ÃI´ñ–†Ûö;çj”g&\›Z³Ë- %¦JŽ¡ñø7š ˆz‚å.#Ä÷ÁÛQbÚá*7‘ÊxŒMèŸUÀÇGJæçæ²SlEb¨y0C vX#CFÀaŠì%ô É='ƒKýV‚t„ò•u¶T(wþþî>¾ò¯â$üi˜ôYYWßþc]´Á™o­n‡Ú0™}?lôìl}!´J¬_-4€9¢OÇ÷úʨ)Þ«ÒÈ¥k.9ïMX¢º´…œHU¿¡è‹˜‰ìºl–ôx¿¿%Ù›6WeUÍØ*iG…”Á·¯›juz"½¼óoÕ\iûzÁYùŽèc¥ŠãêDôݦodà‚eÔÙ"5É,óú¹hÖv(ñ¹ÝOÅäÊ7£US˜Ù€†2ÎI¬b­a>:…júúãfÒ¾ôñ³ S5ùåØõkV›ì·S°V²4VYÅjµ(GÍ&œ•ÕÚ~+ÊL¶Š_ƒ{ûÌ™)—ظ|òzª„î®’ørÙø:+DíXvÔiü"¶× I$ ’õ$âmØ'^ öŸ]–¸ê²Ÿ³4gÐyC1Îýå2‹7ÍÀ™–¸˜·EMuˆÎ{;îùxŒ|_¶³QY¯/ër©u MŠÚîgs„BㆠgQ;…ulÅëS€-…:…·Dghm#õ娳i‰†ä‘œaŒR¯=-ûI• W+Õ½ÂwwjÇç\סõ°d,ŸìO]˜%5¨™ÎèXúÍà®t'‰á‚œ ëÄ­›žôfÊÀöG¸ÿ»I˜ ªwñþ~•—- 0àÇF”3– Z½ÙzæŸ5uø¦ØX‰ƒMCñ#ý‘µàد-ùŽù•s¹G÷H^zì nÕ¬[=ÚB].ÓÕ.¢©ÐE㲑MüÜΚ7®› •ºz²PÝËBJã?_Œò`Ž«‹³yšï¿•:õ.3ûÞÜ?{å3· ­ùIQÇÝü5{Ùe®–g÷õЯ]y’ÉŽ9ãˆ×ˆmQÛÓrnxàx€-|Œú„%5C¤ ‡Š†‚Ò²;‰•afOB_ill/ Äæ˜Ï˜¢.œÞ/5v„˜D5|zQ Úî‚—Î Ã'Jä@„6†ÖPž×"–p*@¬¹/%486f\9–,\Ävü¸ykøüß\}Äß§x<¯S¹xè´ÊÝPå&-nÅo3Y~ú‘ßøÖ)GöÌýl»æÇå)í±ç¹ë[=&Ý…¸\‡¦ÆuqÔãM[óª•2DÆ\͵X]Ž´J ¾¢ö=FWÚJ0AqÞS†"V„àkƒž|IŠÒo*b~ xÇ;t³¬WÖžÂjý]Éb?¨ÙLr7iLÕkýCÖ!-ðŒ›gi9¸¸üäK*˜ÎFš{iõhä´GŒ |CÚ"gy¯ËÛ ¦§ö’:JTATØX3 ¤“в.ÞJ-×KUJ™Ù;_Ò±“³}Ù˜ná^òlÌq=Ê`7v\˜W›¨©—ºžžº/VÈYƒÑùûèêu_Övi,ÌÐ}š}cM6wµ§Êöµ²=BÎ`¯r#¿«d„ä^1ËÆ@Gà—;/lDëïw*ÖM7óB:˜Øl$³Ç}pá<‚¯Y¶³QÛT>iãáh›6CcÆp~‡D‰ùv½c6óƒÕ§*,w"ÑTï ÁUæï”>ðmSÊr|ï.]KÅz(í ,Ñ·úJ )À2ûžE7<¬(ƒ–Dgÿ 8Ivµd$õŠ–cÆ ãþû=PFc‰›²½PXoo ÜÏf®)uÇÏšS¾Þ:œ®¢ÈÎDxH2ûÊ«OèýÆGÔÊv›YϹRf¼«OÛ(8tÌ¢6û$yºâŸñà q¥"?1cð-xií~Ñãì+ñ¼iú±íyaTCñ,n›Œ½úË”%™òÍàØO´µŠ¬ìN?Ê b±ÌO.§§Îù£mÆ!iÊ®?t„?¡z  ·ßä4œ¬¸rR5ôká]É™å~sû¹`Êzê##]`{1ušæR^eÂÜ¥—æVà¿Þõ>XükÊ”D‰àkÝ/r®AAã >©&£í”6u*¹-‰w=NÒ+fèmµ/gØý6ýW=.L¶>¤|~½_}?~XøE%âsV=Íù8‘2ÌY?±–­åpoìœjÛÎù¯µ)íÎjÛXX ¹ªÃ{X%{b¤ìáÁݼÕHã‰r^ôŽÕÂøŠX’Wnå¡_2‘ì¾ßLç(¶÷2ºQGƦúÓapð6H»Ùh7ËÆæm ï"Ø®8È?NV¸&–˜k*õ^îqyC…å-¢¡ëár`d·g:­LE”`®µ3üçëÓ4Éâê¯ò^‰(Y>Ó éUæŠ%`k·@Ì‘G§m]u’ë×|í¡5ŠzKï×Mhó›ê}Ǥ…ð…{Ý¢奬ð¹Âõx– C€n¯ts½7x¥6K!\‹þßõVC=z1¾±‹Žß?5'1ꟷóÚ}H9¬ššëØm$–é⇑›ÖÚÀÁ0¯-r÷ãÓÑËFÊ„Eúi†­MÇÛ¬ Q|'w©ÀvŒJí#EMQ»á¾é¯¬Xƒ*ñUWð*›¨­ýãG;oÜ¡JÙ·9+‚‘Qøñ_Õ,5ðG¶\Ò´òÀ5°üe„ ǵ¼†× 'òCÝ-åñΘÁŒiê«gõ”Ç‚¬pû>#©7È´w!óuš/`”^«ÔÈùˆ0GZ9l¿fCšékQžPÚá¾O>AJ-Fû·I7ò ­4¨Š>ÂKƒn)Îî@ªÓ·¦üc[ê$=£Â€®Š¦G×p-½Ne³Ãý·m©+æµáHcu®‚ËËTƒ´»ÊMBéŒ_y?^Þo*wM¸ßÉ™5^*‘ñR|¡!S\±_ûÈœ¶ ±ïÄ'SòÑ–fòrün¦-Ç[ùÅɤ I‡AQ®à UÏßø×4  ë#7%}D"Iá|û5bâ:9ž«lŒ´â4ìà’]€ná˜Pž«‰ÛyË>~ Å}P—6›mb×÷öÞ×É2k-NÇø¸R.(\‘ÊÓ'L†¼×s£×–™ßÚ(j5|å×”4 ~qº°X"ã •NU±ÖÀ‡˜Tº@…Z×yÂ/ª7š][ÀÞ¢ÛÀV)›ö¡¼ö¦`ÜoÏ8Ï0‹O‹.C*Ü>TÎßçúÖÒ—‹cop}ò„VÝ ƒN¨óiÛkœü´È™¼Ç7I·‚ZBÅ¿hƒ*»Os1ÿ¤ûî…ÁRdA@9µN6M’r¤yˆ>[a\cz´o0‰³y“?¾<¡e„oÐûÃãoÍLŠ|ŽzÅY5VôQe\Ûýñ¨| áéFõõmg'ÍɳQ–ý—ix=R,”º<ž<c®}QûÕCà~…Õ™æHß^*íœÁZ;²‚^ÿãçe½]?ñ¾vZ*Y~ðæKCôzáø(Ø ×q$SK‘Í×VɳOé.8Ç¢[’%H±œöëdz”øç„V³ÀÞª”/ £ GëÀGnvDœ ±Ì‹ ãÙY»Ì<ìñJ†Ó ðÔW!¨ªcóÀª>‹ ›HoÏåõl..ÃÜåÂÈ=îGWÜzæÕÊUuñ7UdÞ8ßZà"JÜ#F­9%Lï Ã“¾u9>¡i,/Dj ú¤$á{[EÈ~jÖŠd°ÜâOhù’ˆñú›„H‚æÝÄQöû…|ÅÓ £ÙzŽ‚5tS€Õ{Ö8¹Noø&h£\Óº5¼ŸÀ’ ù>óBÀþSÌ5IÑ÷;&ƒÏ$ªb›ì³S_U÷Î;¯ZÆbI8Ò*RyŒI9Jùþ‡ƒeWÝ«RAm#;µ4 Â&Ö¨Gj\4À±o¢+¸?Còê¼è,›‹²×¯&ƒ” ûBAƒ<¥0³ÎŒoÐ4,PvrÎÒâðâµÂBéÈ@‹Œ¯> 5±¤ z”§±3öù9â*;”‡¨`s”*&#ˆK‰« ßÓ9KyÒ'— ZÍ”§Yù½)LXmÀ@öÍšhyÖO{§“D¸‚øšÕË){MDÉBuI´ÏLUH2 ¯QFì²~¬µŸ'“¥EÔš ÄßÁ~™~@ÿªÏ»îöØ!¸4"JmO iܜܚˆüHØ]døM.â^6î$i`Ôûn6 ^8¤Ï´#-ÞQ|±¡ñÇ tÌ7¿ªÒųaºjÊÉè¬hïú’øs"®®Ôþ›ŸŸu#æµóp³³e–…^5\¡’‰rv{{ÁŒï5<$$ ÁbHôæ ›%r-!BÆj‚V’µ<Ö¥ï-·^./·²á:éif†«ÆTï&ßkE*µ¡Ë2hY¬ªµâQh–‚Y–»jjtê ÔgÈú¼ï‘1Ž™È¶|#Äÿ¨ïê¾ûpºâ¦bm™º»oƒNÕ‚÷ûx©Ð¯¢¿Ð¶Ït9”?cêUüpb¢´:µñÅgKŽË¢1F–kXØ 4Ì®ÀéW´Ìö&gWÊéí¨A‹ÇÁJYø¸”çôñªÃLÜXχÓ+Âaª|ÕH•[%ÈV¯½(0H͹1écŸ6%Ùþž¥ÍëP züÖŠ»$MR,ÈÁu˜••ç½02Â’Ÿú`/¯Ù¦¯ãŒ“Wò\ÝFÔ¤Ö_©¡;±ø²7ÏÀ–è§ëqÉí810~m¶oÏT­¯m#ØðÑ"ŽÜ8û´áø¦Qö%mEï’Ò§4‹EÏ¡»ðÌaïõ¤hEà ÑOËsXl—ôäoj‚9vK%ÞÓ\ù†…´ó˜ ­™‡ ÉI¤û–•ã–±Ú¿x-¿ï]k„š$D8ŠùòUÚL;~‰ªíÔ÷'ŠNa?:ËDpø#úÒë7«¬ú2G¿ê¨2ÛôØ <ï´Ñ/"2#óÙ› 8‘mØð‹[öãÉ Î`éT“ÉÈÉm…‹v7¡Ç}ë –&Q$·³^Ž(š"Û¯B!3ÍFªGßcèSº¡zMù_ø†:¯Ý-ÍãE˜4 œéR¾;¶W´åÌ|Ó«!0¢ç¨¦MŽ=W-ð¨:,ðþ’°äx‰Yf ­ó`~Ê Ñþ>îû-–Žê=zi–‡‹M몴øÑÒªŽ `̹@\cÌT=¬Ša7ãkT®k!aÓzù·#¿4 L¹ IZ´Ö½—j/Ðò£Bœ™/-KWúA±˜NhÎW‚$.x¢9’QˆZã‚Ëæm†Ž„.ÊÈþ‹jܵ ry×[«‘ü:æEš¸GYùPas\„«Æm¤¡ïDbsz\+\Ö'´E=龚\9˜Bñ~ZÞLžåôÄøö(9®ø¾ÊUn¸ '”—Ѐ±’ÔÔÐᙀÚ›ü—ïN— Á=ñ¾O¹&òƒ"ºúy4¥Ê 3­C6¿¬ˆY‘6 ¸õÃ7ôóP°´K)RÚ‘ˆ—‡»ÕXæºú¥o^ ¶%‡‘ë^}æM÷Ç]oòÓØ•Ê1 Áû2BHK4ma^5™IéÕ\+½)ˆ©Œû–3ĸ¬³Ùa˜¼±çÔí2óîE¦|wùE¤˜ÜðEjØL ™ÎÀ—kIEp´ô(z {Ä[Ú*œü˜oîRSúåù6³K™üðÔ ÙPÇA%­sK`Ûóóñëü¥lyÌ‚mÄÙ¿AbˆcÝÝSº@àŒ"el™Æ¢qWÍ2h]d{á?~HÂ)¡›7ENk`›FšCHÅ<¢1V9z‡­Z^šöܘyZnAl¢ûµàiNØ»²õF„q»œ.˰ÆCÉU\‡Â5¨gH¼Ã}Åo(誋—„;ä<6‘·R¯¹ßj¹~z¯ªv1î9R̯ӡϢèrzìþZ‹ÿÈ ‡Þ.Ë4>h[G°¥y¼:ߨCTI!s::‘¹©[«SÉïç…ÿŒ’òÑšÂÕ†%¬P‰›»bõ§«÷½²ëip} q Ž'¢áöÔO«jŸBõÂ\Ñ×ß_“¿®ûY3§êôFúôꛬQ¡ˆàʱûG»'k¿KǪ'`Ü807A¾³Ü9¼‰ŽÑ°W§Ê˜àÇØ™yýr-áJm9ˆY§Zîf¿Õ n¸˜W\–ÒrD@òÔÂÑ÷:ZøhNg¨ÌW)þò{Ψ¢¨BŸþñ¸xlwñVÌÁ"Ö¯ÂnÈ—œXb„EÕYQ€Ì™Är0Í}TH^ÊÝj¦fâûÖauãį™”AðüÈ}¥ËŒî»¬…Añ|¤eVÚÆq…`œãùÜIŸ;)9ºmë劾P~â6Û!1¤êM“ˆ>4 ¨›ü§HŸ+‡Ëü¥ƒŸÖ^Þ3ïå+_#³>xúä¥+•v([è#éÊ 4Âå³ÏÌ rhõÏ;«=¸# mþ4…ßR"Τh(@óöå|ÙôµÁ'ö%ŸzT¾.áÌ÷AxÌꌹæ§é_É{Ž×qykÊ\óðÊçŠ_³‚ÍñX „¶´™*1¸<¸¢‡*…Ë£jƒûj*ߨ ±KhªY|Æ„¢¤á¡ j5†B`“%SnP‰†JÔJ1`­ É Cð—.×R^ÇÇ^èš3¬7¸`ühá±KÛÇëÀÁþíƒ  LƾâBÉ(NÚ»³2eÛn4zõ¦‚}Q»o/j§}ò;ŒÉ‚ÞGS®—I¬6¹zOf¯Ý®¢q][Ãê~hžëíà~kâ÷£7ÎiÄfÓª;3–„]ñvÄÆˆË„þ+÷Å>{}9;1}ìçÌ L3"f‡ûùìqnMÄ{æî_UìÇè!Ø3ÄB¯‚µêZPˆúÏ"¹ŽIðqýjÞ½(ýÑÕ…?{ÁxÓðÃÅbæ£~ªO·¾jÛÊ05Ç™ÙëHdÜ6@ ñBX†`öÓtœE.µJþG8G‘É¥K¯_ÒÙ¯?L¨"Õk8Sé˜Ú3z‡à—w°XI̵‚“ðoÂ3b–§v§ºýH©ŒÝöt¸ÃDYÀ‘=¹Ÿ’×¥£=T†H% Í<¶qÂÛUÍ] åÀ»äW–ë¤ã 8Pˆ(–~¼wxð†naŽÍÔÖàÀ°k6Ä ÍDcßÈëíçÿfQ>n×K7Fûà$p»®lƒgñâ,¼hk}Ü¥Ô¾tÕÈÍù&¤GzÂ+øA³ÔBÔÅÆÈ..«‡˜ Ÿ|¡ó³/£(wüÅ«·_V~Uötõ¡ ­}OE‡ÆÍõ! ßr…»[C“ùCnaç(<ÁaÌê:ܽÚ{±nxT;C]aXW*ØB\!¢ªèê¨5õàãW£_òM‡¨08ö 8<ž¤[¶Lù„‰à±ÞW7tF˜gõ‘ú/Ôi‘H«òó— æ7Yù´'Ø¢÷íW±3bŒ¦¥ÿĦjTUÅ61ý¡¯-©ß:´„¦¹æ_P¯Õƃ“©<¼ÿÍÛžF+ÍzÀ %¦CÃ]™úói9cYœ¢´mËqÏù{­#!/Fgõ|zGn-̳µÍÌÅ‘ì¨Yõ‹Á.šÃ—ª¯Õ>P¶ÇutÒ,ÿh† ?ŽÍØý¹Í.nV8H`VG·OG/­ìÝúê}ZúféUSÔ^CŽçššZW •êÈ~ÆTLEuYÏ/…^íª<ÏÌ Ø™‰ƒ1æJ-ܹHØ È ¼2’µ¢õN¦…Š`;Ç0Ã=Ýia¬x Òé/¥¶ø•”(Œé:¶sJªb³CŠìÐK g–á¡[ú!_5*ž&k”0ñÒ©@7IJÕ›zöðÝ{Œmä÷WÚç)‹àTó-R½´\i Ï„lênUH¼!³Õ»Ë¹î»^7]”'ÃHž áO3G÷èׇóÔ_<“4|¦ìè–Å#ß8¤”!ÆT+ËîmxZ«ï[Övæ,hã£e —²‰‚©u9§X%qÿxØîðÄóA[;‰¾„-ÃR\ÅFŸƒ¾bfMD*÷Á7ät5=–ùúÕkZlìVúnUMþC³°#Ø §¹Q*Þ8/SWΊé1\#õ7®íNqE‹„2,ÇxBÐ÷¢»G¦×FÛí|KœóÛÁšÉyI(­²dΨ"}@IJ(e¿4±‘·-/¤ #à«Ïú¤Ë‹y¾~ûå,RS};]TðQ 7_BS$ˆ`‡ÜÐ{ &#°Ë)´Z:´óZÑW8àOA>ÄOÙ{Ô—àƒ7sÓÉ͸íh”Ç•ÁSÇ< /C!*Ÿºó AÒ¯*}D‚mó†9-êü\Q­èyK曃÷^ÑòDvºëqE}+9eç½·ê¢ñG[·_¯}%ƒ–e9Q˜¬b§Š«‰n0ÙÚj6Ѧ&|Õ#çÐÍšx¾×õæ4#ê _Cæ»Òå‚·]z¼‘…£57 È„vYî옜‰?Þùˆ`“|2Ü®9cXycaÝõêè ¡ºæWÅbêL-9cé›C˜§+,« ïÌÒ_Û.9Ò¥“vÝ3ˆmÍ¡Z‹‹dRi¿–Qc»Ï{A[$HÆ7£ Mhèfû¹kµmhû¡žKµ+M¹#/)ÈîÈ^E¡$©p‘4£n½à „ˆ†ÌX{:8†"acjš‚,Íðë†ÿÝG§ÚèÍÞEËÍ ØL5÷ðdµÍïÙC)ÔóÃìõâííj’[]ïŽügÖä ­õhfÓäq 9³?,H;ÃèÞ®•÷Ö](Î_“M_·¿Ö¸qeáÚ2°™„+ƒäÅ….‹²çV1i¿ÓòÕ`“ÌI—ªˆÁGÁi‘°v×Àcc"lØPÝnz•—p”–òŽIçYþ\´ƒg•*î(Dà‚åw s®¬ßð[¦\ëÖ"¹è‹Ç„_Š…„th]Î[áH’-=sd.H"7Jú•»]21çÕ#4ÛJ… 4#ü­°„ŸB)ת&Í·:=.¿(`±Ýebyw[ì9ŽF^µ%ëîF˜`ê}ØþAÚË ¥~"ËÑ·K)íõ™Ì<мïá½=‚‡¾‡Ï—ØÉc*a‹Ùs~wñŸÌ§”òJg‰9#÷Lk~yÈ Œñv·¶þ·~Gë”) î) –ÀÆ0|ë>>9jYCù‡GÈxžiÔ¾8}&‹ï£WÓ“K+˜XÓcó³cߞτ½¡ý›tÅä\¶7FÀjó\ jRPMèiF:ø@Ë n¯nò9c°¢oº[oƒœx ‹ ú+A2—oÐ÷±‰×¡v—òk‹n?ÄÒè7}_ñ`ÀĽJéš«½úxÙ.›8g:`Jô•ˆ”ëeî·û¡-YÐÇv8+rC´Ñ@Tü÷ç|ÉIî%XÄþúµÊg½Ÿú§ŒüÙºÎFáÅ»*”9”Ë"^ö‰ñ¸WøMY3UÎ < ¿t“Š«ê”Þ BºŽ–QuÓ/öxÜF]s‡ª9|hitF>?¦[ŸsÆm—MA\EÐ+0X¼•¡ÓIŽÔ’‚s' ÎÎÚzš9W\ôCéÀJÄm¶» ÿLÖç6yDµèðyg·]nÕXì´KH¡·Z™pè0Ö©ø¹ m2`?ú€.øÃÎÅ*2P† ­‹YK¿ºCõ!–nRìmw/0 ¯›¦7lÐ%çn寲j/ÅÝ)RP* “‘ žà‚TèÚЀ¦¯°îc×P¬¥ëÖ #"÷¡Qòr Å[aoøÐ ¯Zœbƒé†¨ÄûЄÌÞ¢òíÖXl4-ÝiÎ%Üd¢ã-N ƒh0<µKhš”ólfGþœejòµÕ^$9ŽËë±>b¸½ž²,o •i湨Üx¥ð[ÞŠ»Š´ÍŠÌy¿d¶;r§ô[JŠïs˜›:†²…ÀݶU¬Æ1ðô²ŒÜŠm s\mбrd[½bcF³SZ}¶²|¡pÅ™iÁŸ[Øà’èfnKˆÑKÛC\NEvS¢KÒH˜2ßët˜Ô²ý2w¥.©øª„®J„{ÛVç{òœïMêíh³vêÓçʰÔÑB8lÔ‹Ê£·!}õ>qÂÁ»®DŽžßŸ(ñ­âL‘¤oœ¦b¶Mwd‘æÕ³J2Ðé®ÅÕ²…5'¦<Ùá(Ñ|³vX÷Þ„¿3,úƉ»š¬)Ȫ¹S8óA:X#xÎ?±Ë€ñ”æ¸Ê\̘á.V+SÃ¥@O©ù¬íëÏç‡Å#4_ ži·©õLæe×,[Î%5!™'+n:±ãB¼J½–Š%ÁDÊϱK¥/ìÁw}›ò€Ø+õ(¡¥CmVóTz+Åûq,^¹&ÜÑ©6­àø X›iu¯¶˜ä²hïºÔ£‰²ª…§SQjh¿£Þ#1`ƒùô!”¥Ë0,ìeÕCúµ`ÒÀWT5ØÜ©!®8„Ïl r;#¯rõÍ× £á˜œS¼Wnö æݨÅKNg=X`:Ã/6 pÖÂêC)ƒÌV`zV´oÇéÊ*=IküÔ> stream xÚwT“ë²6‚´ RD¤JD`ÓIh"½÷^U@I€P’„Š ½)½7é*½ƒ(U@”ªt"EEéEàuŸsöùÿµî]Y+ygæ™öÎ3ßúÂ}ÃÐDH †²ƒ«£8!°0H¨¢§§A 1aHÀÍmŠÀ¹ÀÿÖ¸Íá,…”þ„ Átª¨‡BµÝ]€`1 XR|KŠ‚@·ÿ¢0Ò@UˆÔj£p,€[…öÆ q„<¼P> øöí[‚¿ÜJ®p  Aõ 8G¸+!#â4AApœ÷?BðÊ:âphiOOOaˆ+V…qçz"pŽ@c8Žñ€Ã€ç-õ!®ð?­ ¸¦Žìoƒ Êç ÁÀ…  Gb .îH$dšhé Ðpäo°îo€ ðÏåÁÂà…ûã}üå BQ®hÒtÚ#\à@u]aœNAÂÎ,Šàñ€ \ vÀ¯Ò!@u%# „ÐáŸþ°P à c.ç=Šœ‡!\³¦‚ru…#qXÀy}ª J¸wo‘?ÃuF¢<‘>Kö$Ìþ¼ ˜;ZÄ ‰ps‡k©þÁT€ëà8 Hê–˜”î„{AEΘz£á¿Œàs5¡?4 ´'´÷CØÃ ?,ÄÄaÜá~>ÿiø§ƒ0´ƒ; €G'¨áö¿eÂü1/ %ˆ@?0tþù×ÉšÀ0 éâýoø¯‹¨˜ikê« üiù_Fee”ÐGHL($*‚AâRÀ[„ƒß?ãBêø_-¤= xì¼^ÂEý]³ÇðþÙ>à?ƒé£Ô…yÿÍt+JøÿŸùþËåÿGóó(ÿ+Óÿ»"uw—_vÞ߀ÿÇqE¸xÿA¨ëŽ#¬а Èÿ†ZÀﮆpwýo«BX%¤ÒB`qaøo=«Žð‚à 8¨ãoÚüÖ›/œ  7Daç‚ô_6–A ,›¿M,aåp¿y.à KõÏ:ÔPì|ûD%$ â Ÿ I}À„5…Á½~±("ŒDá.@BÏ~@{p>h ) š0ì\øGl¨;CHþ‹„ÄË¿Ö÷‚Cã(¨L°SupËA¥«§Ðò ,éfêÁQ¡Á‚û¸.µa›…x“¬ÌIgê`õûNmúÊnÙ³¶}–j8j½Å÷„8ÔW8ìbÇÏö.Œ&øì³qŽÓ4=±HV¾.]Œé"2d¢m§T€9t™pÓøþUÝñ1Á“‡¡Dý–vH‹~k{eI¦.#Ûmó/ŸŒqMv½¦Ë;Lå|r}´m‘¢ŸÎ©#Ûzˆ÷¬ ïéë¦ëd¨íñpù;W(ŽNM¦—MUœ¼Â|:ïòÏœbtz;+а®çs|ÉÕú[ŽK[Ö7xÛo9Ú&ÚGƒ¿àÙéÐÓ Ê©˜Üü•HØTvIC|Â>Ö¼# ¡ùz¶ì»³vXˆŽ÷ähÇÐüOw-ËwÝÁ¼‚zñr§¥K_üê¸_Æx؇7ÿU™L·¤&À˜É·îg”×Íå’5½Ç2j!j)•êØb*_4};¸9à˜µ"µÜì²HÝçò»{>xñÓ¼íÖVežI·Š(d }4~¾fÚ7½àÉÑ&XäM-4­*Zï麰ç[áµ`­ÛãŠ*ô+÷¸J|ÿ@÷(% äÈ~ºÞÃ$ÜÁY6µØ¾{½”8FT¢Ÿûüh'ñm7ª…H àQ}´?Ù NêеxÒg†WėÛ${òº¨ˆå'Ï~È7§h‹»*NŒÅêÇ›øz}Zò›—èoÓ-„ Ü—ßé%.(Ò8ú ]™â}DýÁ¨7h-þqt‹ÒüNSNßHëè×K-%r·Ÿ~ÎÜØs`eÙΔ»ÌaÙjÃqfw†²¹ú]™Í¼`î¨ûa?yý–'ÇWfâ¥ú¬Œ×ó­5Ô=u¬A_pb÷&Lt«É3ZÿEÙˆ¦ü®ªßîwŠ©¬¸®»I—[¾ÖVî•9”\&kÛµ6ej?ƒøÚ¶:ÆÛ=à{åy7hjÉrJü^}‡è–÷àJª#³ICHé?zô©Ððºýø} äxÜÐÅê"Ž7_Û^EoÏ·±ÛÄÀ+jø‰ñ¾ÉqIá†Û|zÒ2”CMÍaÅÞ=~ìœ+x?Ú.>ý;¾¿‰BÕ"n£L¶¸~…”~ú¸{ð¼)04I7ræ‹E]µh•©zœù<‚¤ÕK¾ÏþƒfÍ‘%‡µ©ÚÞ+§tãÞHcª¥%Æu`z*팋ÔþÎt<ºz''#Kó†ùþt ¬þF}€ Lécgúr Åž,ôÓ×Ü2ŸÝá žðöv@߬ۋ}EóGûßêæä¯L.Õšæ~ìE}3öLY„]Ï€7mD¶(#šWÙÙ^11zm¼ìœ†[™¼“ÔÌy+`Ë 8ƒšk1W’HòÚ`ô8"p!°€€ ™gú¡¢ÖPdaO|ûLn“ý-&í…‡÷T…ã}þWš:U¾V;ïFx^©cÑÛÈä¯ëŒôð~Vx»èZe§$¤¥–î2üîZº_,‰äSQ? Ð7óJÆÁÑäS"Å’íþý -gåøðîS—oòžñ³wÖe?iÞ©ì¾èåAÿòŠ_À’ºWg†à Þ:¼³ª‘±N¦¦çòšSAcg–3Õ’>óžxÙ™øaÚÎ\Íô™“†­Ãp˜Ñ³ªjJÞ¢Ï2ý•FÔfÁ*h»Õ·Š2*D·ák<ê–¼Q€¼Ÿ!‡±‡E ƒL1¢È¯©-Í6;å!ätÃö³ï‰KrJÜA3ûq1Î"ñå<»—Þ —Ö}¤ ¬šÓ½k~ï™Ýñ;Ù– ÷'FyµQçê€êwºÚuc[ëžôÄ™¥Tîe,õÂ\ŽL5Ùz‘çÞp³îØ¥‹Ó™‘¨1ŽA_k`…uÚÒ +¾)pF¿œ'‰%QcÌ ¬X*,r›X¦gHëÂú;u|"WQk€ÙGb—ö’^nó¹ì”Þ€jO¿ª‡šš"5üÜGSvIÎ ?ïVy£¼Þ×;•Kñʯ6y™Jbå]LJ¼¦Ðœm¾úP»žùú!™G/«3$$×’?=`ŸZ@ŸòÁ^‹ÆÒžYŽXžQl„»åÇÓrÚ·gåõ¼¤mVB÷nD3_ÏÞÐîhò±aŒöbëØ$öò˜2Ùéú‰ÈJ8ÓaÚ—3òÌ38½Å(ñ3ü&«tÒÁ<3F]C…¸ºž¾kú*å+&z{cˆÍ1êIù¤ËtÝïö×/-ÿãÿàtÓ¢#Ku]j5ŠkkÄw+ûFƒzä\ß@dã)ËÚ¤n‚ŒÍÌ(Y[‹«¾9¹ãn/ïG&FWc·Õ+ûùÚ–Lñþöã´$·“ŸKÖ|ºf>Êñ÷R½ØxÊf"Hª~¬DAµ=®4Ú5çíÂûpQ÷BÓ;Ü‹\’M³Xúo_V)Û™Ÿ»*ó3Çš2ÜŽRk".´0pšLMS©¹†^aº Ñ$»ÎIa…/8yM+2Z¹@Á¨*•a+s^©­‡ÙmF ª”»mwð„žÜ¹²¡•ŸÑ=šzóÒjªþõÃ7gŸŽá([ø…f ìZáË»ÑòŠLû1•Á«dUOÇ›,H÷С£ÛÎdyAƒ½J¹´¼ÖzKÌèh(iö¦cï– $U¹Ì¼{ï-ǶSr/¡ÈŒç:}Øý: êw6‰D?~©ôرƒ¥ ynKªý6áÔ9ª¥i@CÍq”gUájP0ÿÊ|9«mRÖ¢âí¨©(+E݈iе1Žê ¾­â/þWûf2¡BjC,Ë! ¨¦vŸfÚ$–*Ú~¾Ml•þEÇËM¬£pþ ®˜½,c-ö½ïÅîpPþ€ÜŠZœbEs¢ð¦èýyLM¡t/»¦|)|uÒp`¦fT¦bÿcχ'Á~®™kB?êô”ñX[¬_lvôÄI¶Q‘Á&Û"Bœ’½¨ÞLc¯öúyŠË·¨YG+ [» {ëRé \¼³[½÷ÍÄ®T¸¥×Žîn.n«r>?óh‹jÜu:¥#ŠQHÍ9šîWbiX‘.ÁJ·Z÷°ÊhŠ–‡¼¬Vpi«­†2Ð/îïÜ€SäO­ áÀ>аˆôÄÙɆ&%LŸ8‹,ûÌ‘­ %¢2s¯?~ÛM²ø¥PJƒ›.=Øòf£»Aï‡ôHÒòä5Ô$`ƒUâÆ³øìfPRä§IÅÉõþKª”#7¥d.=x²U{¶½Èžs½RÎAå{^\màŒÂáêÆ<¹LŒuB ÆŸðO3¡"B÷“ªc{URåé- ‡GM©‡oX¥i•ånsí’ÿèÙ`âÊàoŒÛ=êuÄÐìޢ䀗ʬö_¶è.ùïkœ‚ÔR)‰ fÁKõ…1^ˆÊHógn—â+ž'–ÑŽ£?;è_ðô¶ž·ÊœÆŠº¹~;UÈþX¨S´'ã³»kÚ$þ6´=çõãbý¼ÍQÚy²VçùNؼ×+-G5¹ž âðBëxk Ð4¾Ýºù›ÖÃ㯢3Ìå7© Ã.¦®wYRV¦Æâ¡î'ÞMfÆÎó$±„7’º¾ÖçoÛBƒ}[îŽæš¿ìâ]ÃÏ­»úx¼|Ô¡ãÏø‘¥%RM«`‰§²‘Á9Î ed­‹³sדª—n¦1_:˜ùZÍrDÉ ‡·<ûÆ¾Š›wú=¨:¥É)ÊCš*„ޤÒÙô¯Œ°[Ü»!ç®¶m´–˜BÁ»¡*+SãTÙÙ×p47¡µ|(Še`Ï«Ÿ;VªuÕHx«oÒ íýÙüC/:³xkLåÑ}åÜ…¨ÕJ¹LìmòC¦‹[¯¨õL[š>œ5Kg5TÃþE¡x NÞÿAu?&uë2ÃU:[C“39™3µÃÖŒ žíˆ|Œ—(%—å‡h¯q´X+ÑÆ§»fOJÝ‚Hëø‰ms1À§ûJTe fRÝ=]¨X~4öÛ!µZáž‹s±"ÒH`{@Æ8.™!êý.´‚1x¢Þïú‹Uµ:æ¦A7ŸK±,Dg'¡Õ¤[=û²²‡Õ ôT 9¥rZ»kÅÚ=¶ßß$Þá3öÚœ_‹%éô¢”žt,¹IѬªÉ¼ž3ê%†Öù¿jbÔ.¼´Ú¸X(ív‘±»×Ñ[g¦öT]FöîYÎûŸþ¾[Ïæ(Gé®ì˜Š`ÚNŠ8*6•:íÖ[zòk—\J¹]ð; tˆ?ös‚ª¡Š¾¸ŽUýÌÖŠ‚ÚÍÆÈáý$Îõç›39;ñŠ&¹G¾ÚT|g;šVYÉü‡=ÌTeùú“7­ 2N ¾%½ø_úivMã}Ý«R¢†tS®U-½½ï(¢t)Fq=vßʆ¶›9r¶’,ݤĤq8ê+ƒRÎ}×y«d²v‡I™9M‹9Lá×eä¨3.jL=x€—¢½e‚Aó„VsE8ï.½U\¤¨+J‚è„¿N¾Æp³¯î{œºcWñézÕ%œn˜ÔP(¥/Ü÷ÝÈz«Áu¾9·÷Ë´êI8Êdƒâ|9¯êÂæ.Ò¨IêE6+]rg ´')÷—C•ü˜žXQ-xß§”ó²‰~õÜŒôÅãö¹'’aNÊ“‹R ! ÁŸ—UI_ÄűY>ÚñVMœh#wµ(²¹o9Köõä£Ó²§)ë@@ ¾nìK!aí,S4§X¯’"ÏŠ·â˯ŒŸFŠ‘…·'£Döã†X¨¼¨’¶wùoÕoj¾³90’Ýa{` š‚L/ÔL9I¤Àî`’5UÁœ-з–ݼ‡e{®/xQÉíez„_ü©ñŽÁ¯ònÓ7<4mt§â‚ø‡«ùøo©nzò¢…CÔÓ §˜A9‘*š6°º©Ÿšõ±'sÅ&ÜlxE•ê+T Õ¥½¼Skz‘.çÞ¿—ŽŽ8óŒU÷ˆ%ôÖha™†À½öþå誹ȶu¹F ~ž@Ó[Ï¥ü„ÅÞLžïnsIz-Åqµž£ºëe££öqCÑ«\¶<^§˜3»e~F9_\4« t8Dßriج¬}‹•5oö$*í'î?áàçx¬Î´•"TÒ1UsH÷’ê-œ~^+%¡U{pÜÇÓÁðð#YwqÁÁÝ&aPíŒÐØâ¤‰­Ê%¢‡·Üà¦éŒÅ²v…Th4®ºav¸gja`Ê6ü]\ØÀ‹Ë+Þë3ÝGw™sKû¤t4l¾jnŽ£vðEAßúÒ=d-[StjZÚ~Ž›^ôüüëfZÚêøP3¹¾¥›À#mq7²³%-¸èð¬ N&F¬CžA­x,6fõÍD_ZêI>ã_׊æ(Ìfù–Fí¸‡Ž'QÑ ©«ò‘’Ô‹=þ|©”ñ€çO{îxJ¼áì_ðuN+á…3s‰0Íj?oÕ jœO¸Þ³û*› ¤·‹ºéˆ2]ãîÜZ¾ dœË+_È?xD9\ò¥WT"ܱeu³ÙWKXÂý•­‘aþþøC>ÛOSŒŒzê×x’ï‹'H0%ÕÜ/š ~È 7W g§Ðà·Uxk¬®WB=ßp:6à°øhÝn?9GŒ$9%j•èÓÀJ šâ¾êtnÐ[ê¼Ý(k•Ûë¹:ÿbï“\»a±1Œ=R»Zß­Õ´)y x¬eúŠ+,ætÐ;c"ì[ÂÍd4¢iåÌê˜mÍäÂ35÷D½cFºé5­AÁ×ÍÞHŠªÒ%DQtD!Ü|Ää ¦Å =¯„“ÞNÝ”#¶×0zþ#é°qЦ¨õ-/Þ/ÍâhªrC©~6á‹ìÙØ~;ÙÝG5ÖºF¡ Mþƒz¯IåáÂB“¨g#WOU˜Ë™i.&?épé£Ýì²òg6¸ÊåÑJV-L›t£8õ<\Ï]…p„_ú¬ªÄ¬òoì•ãsË‚&,yŠºxÂÚÏVFº —Gõ°·Í¼/ »Ö9X¸Ñã’hî%¶kšõìÒ·®ž…ÌÎ?R+‹’Ž3y‰ô¾†ðô5Ö;ŽºªÂ)Ëày‹¨û0\æA®ïã³Á=)d½˜-”*ÓD/ŒRd›L×}T1è¯Î6‚þŠãSÊIÞ"w¯¯ËÉV$Aí²–v–¬3ô/äQQ‹…§¼‹âº |æ½ • §åšŸ\£û8ÒŠ¢AöÁ+}÷h³¤Å®ôPnÕ¹ç[²|2}u^c(hÅà>¡Hý\ÄI-u¯fïf[`¸9–Ç£x«úãUCαwÅ6z5tz0#KÞÅiÖ²¹–Ñ÷x̯õ0¸×H’“ä3·ú…æÑ8M¤xmL}³ù±Gv endstream endobj 100 0 obj << /Length1 2392 /Length2 20884 /Length3 0 /Length 22271 /Filter /FlateDecode >> stream xÚŒ·P\ݺ-Š»»Ó¸»Kpww‡ÆÝÝ!· w‡àîÁÝÝ!hKö¿ÏNöy¯êÞê*zÏÆül®†‚DI•AØÌÁ(á`ïÊÀÂÈÌ •Waa03³123³ÂQP¨Y¹Úÿ-†£Ð:»X9Øóþe ê 4v}—‰»¾ÛÉ;ØdÜl,lN^.^ff+33Ïÿ:8óČݭÌòŒ{  …¨ƒ£—³•…¥ë;Íÿ<¨Mi,<<\ôÿrÛ­LíòÆ®–@»wFSc[€ªƒ©ÐÕë¿BPó[ºº:ò21yxx0Û¹0:8[ÐÐ<¬\-*@ ³;Ð ð;a€‚±ðŸÌá(j–V.ÿÈUÌ]=Œ€w­•)ÐÞåÝÃÍÞ è x'¨JËöÿËýc@øwm,Œ,ÿ ÷oï߬ìÿålljê`çhlïeeo0·²%ä]=]éÆöf¿ m]ÞýÝ­lMÞ þurc€„°2Àø=Á§çbêlåèêÂèbeû;E¦ßaÞ«,no&ê`g´wuû}>1+g é{Ù½˜þ鬽ƒ‡½Ï¿¹•½™ùï$ÌÜ™Ôí­œÜ€Òbÿ6yÁý‘Y]ÌÌÌ\.Æî@€«³ÐÏçoÅ#8€™•©+Àhae÷'ú»hþ~o¾³•'@—ù}öXÌ¿?ÿyÒ/3{[¯?æÿê/“¢´¶¦ˆ*Ý?ÿG'"âà ða`g0°r0X~×ûƒß‡Q2¶ú÷1þò•¶7wðüsÚ÷2ýωÝÿ=Ôÿ^ÀÇRpxŸZ €úÏë1s0›¾ÿaùõ¹üÿMøï(ÿ·!ÿß’p³µý—šú_úÿÚØÎÊÖëßïCëæú¾òïk`ÿ¿M5ÿ,­<ÐÌÊÍîk¥]ßAØÞÂö?e´r‘°òš)Y¹šZþ3-ÿÈÕo™­•=PÉÁÅê÷µ`xoÍÿÒ½¯–©ÍûÕáò>’ÿRß7ç¿)ÅíMÌ~¯+'ÀØÙÙØ î½ÉïˆàÃò¾‹f@Ï 1€‰ÑÞÁõÝðžžÀÜÁîwG99L¿Eÿ N“ÈÄ`ýƒ¸Lb€Iü?ˆ‹À$ñ±˜¤þ 6“ôôÎ'û½3ÈÿAï Ð;ƒâ÷;ƒÒôΠò½3¨þAì&µ?è=#?èOó?ˆçÿ±½³Û9¾öïëé?6ïR“?ˆå9›Úßßæ®älÿ‘ÿ3ïÿQ¼'aúÄñÌÔÁö½×ÿ#agÿ-±³ûsŒßCÀdö|§þ‰ðžð¿X˜ßkaþ¾››ÿÙC«?ø·ñÈÁöºÿ‰Ïò[`ûGÿÛÜÁÍù/¶w‹¿à{|Ë?Ù¼7×ÒËÑhÿ—Å»ì/~æ÷¬ÿ‚ï-°ù ¾Èö/ø^=»¿R{¯Ì_‘§êð‡ûÝöý-û—úýìŽÔホïo:ûÿê;Ë¿¥ÿÝ5ö÷C¾‚•Ã_}ø]§¿à{â•…å=K—?eû€î•ãÝÜåýBÿãðNñ‡ðý^drµtþÕè÷óºz8üåð^)·¿à{¥Üÿ‚ïÙ{üÕåwï¿ÈXßÃ{ýß+ãý'Ù÷HÞ@ç¨þën1us~/ë¿nÿ÷‹çð¿Þå@ 'ÐniÞÁ”/Ôº6´í¡Z߃aoâà Şf ƒÏ’s»Ûôgšª/ÁÎwŸ‡{PVwÄ©o…–‰_|Nšë¡?¶$)·þò}6LP™Þk…[œÂ˜Ì?®ë'„%`PÚ÷}qòÕ²o픡øæäƤ”‹þàÑ'éY×_º2>¿§¼_Å) ÿ\úƒ!F=Z/¨h–"Ç$k‡Ê•†íÒyööníëä±Lœßi [Î&kìãœ÷Z¹«K.9®!ø-ÚØ4¥ÈaŠ ö‚OqÁêÀ¢g3ñWDúÔUÆCÖÌ*+•(ûÆÞ÷±¥–ÝoŸ¡Tøè»I5%†Î¤Š˜U­†Qè®5l6@ÂÃs‘µ¶;nsëT‚ežuo€YDmË“À¦nŸ_õNkÃ# ÷á©-Ã#;Ý~šE‚ý‚,´â–º‘«+¼™„©¥®ã`]š@i úe÷ÏÜÏÆaü>ÁW"Ox,ÛùÌÌ:ܽ cçß|¯bý*.:6gQl=ÐôCÞB8ÞL:S//óq-Ùľ„SçdŠwÊY£Ræ«6̆”2]nV`1Š•xË%ns,^ ’°KKöî-TGê{Y?òä1žkT¨·Æsä)“ìžF1Œ6 ‰„„õñÜ™nß••‰`9h<^VxDˆ Çn©q…æ|êP üÚ墘.)Vx¿3× kBv¦&âNbׇ¬©öáig¼«ðÙƒ¾TZŒ‚ª`I¾_öˆÿ£ï’þ¢XA/nu Ö§ÛÆ@ÖÚvÅj„/(k±_öWÀÉ Û‡5®^ñDðUÕrɼ7Az~ŒïŒNïûØVè±÷5ø8¢ÓÁm(Iv3n6>PGG¾šG6­«{×/ÔdÎ7N‡Æ DÈ ÛÙ˜1&N¥ù%T_Öå è0Þæ“²­·½³„žˆãš>TºèÕ®cÜò‡•}ÐëÒ%ߌP?†Úæüüõ‡§d޲ý`~F$î®UÅ|r6ÉÂ4œ+vnvêÏ‚’hó0­`ÓCÔ(þ9*Œ¡Ú¸”+t%6ñ’PÞT*ÔÍ×)a$ä*FÈ¥¾ZQ™ ×RÊ^.¨xÎ8² ©Þ©®“¹y©9ü¤›(¦’$‰ R Žä8+Õrߪ· eþ‰ƒ‰Txøi#ÿïüYD,Ì%¾0éoü­Gvõ‹_Ö‡-/׿…nTÂ44TWg ã Þp¥œ`ÁŽ}ƒÔýÜqÃí©ÄÏÎ2GxóÁuòA d‘3½¹ÉÏYÖåˆíW†º(¤UV½”kEíôŒßÑü«¿)…Þ†ÓE ^KË>»"»;‰n¦á½tKnõE]Õ3æÀ¾ióaÙµ¼Ì£üWmæò±8wÎ œäy½‡^˜óW§á R6Ü÷àÉYj?´eWeqއiºé±%Gd}Œ#DuD$³ÛሽV¨‘"e©Â{Y™g4R+9¥•ÈÉm=•71$aoêváœÌLJ£ñ`peÇ(Y),’Mª¼?ÞËŒá¦Ó»9øË—³öáx¯»%¦û8ËI›ÑJ[ˆØßƒX6ýÆÓ9Q¼!Ø—'›ŒeJƒ3:y¿¥wiñÕµ‚R°d'v²ïç/{(µö¤ý6òof z¢M™ùËŠwó“Bš¬žÄ‡ÜN$rf?*wðNüwY4˜¢‡D>Õü|:#aNìÖÎqð~$?{œº ¤è«èœÆôØZßbÕw(íÝT¾J[Ž"»æˆØK@aó6° Á,¦˜Á” yqÞw-¯%‹Cqäì9T¯=(KNfª«²%½ŠyŽq> Q%îR½´I?[*<ÕÏûì*¢ÒXÀåÜMçì0!­ »(‡HåOíú„5çÂ+pò+ìVM(˜—Ò iŸŒ2N ûr’6’˜Ìo{³lÛ)”ÄYsx‰4„iTEä˜öùK±Î9ÐKE³…ó6î³lù*}F»à©ÉZµ í% Ia¢@Ò@B¹}TQ»ûÔ°©w 5/ÁL„_d}äá ÑçgR5Q7^ Ú½våß8˾Õ´ß»fÃ)²œä0eH\'gó""Kß1E–—_˜’ì×yYÓ·+kñžŒ–€‚E³-},#푨B,jˆÄiŠøhÐÄC¬ª­XáÒç\­]¨ a5a´·JÄ ‚—¶+e1¶ËALz>@âêNhiD bÞüTþV…¨¦ôvëòí8BŸèøºŒâ`™ôÔ”ä†umDgëƒsT¾Ÿ72ÇædÓÚP2vŸöÆUÇ4¬þ:Ž1 SÆBD[º;ƒV'O7hâÎç³V:T¡Ì†u¨¡Á·˜Ó61ƒ„ˆV©È¨˜½iE߯Í]6OrÚfñõƒÞ‡M!R‰Í'Y‰µ“_i A±¶Ô¶•ÝYË&?*bÖHšKçRæFõ¶^Ù•Y°«Çüe<ÛNMEc€D›³\³ØL{$ï„n芼ƒ|Þy¹lo\ýXÔËRgøÈ‚ÜÒw±Ž(yI.ri9«WÊ$áE ü-{[N/Ð2°qŠ ×ü²°{'JãùбÂÂ8#îáIë?ls)´÷ê©–&@4—§öB(»r™ƒd¯¸˜LV°VK?Ü`M²ñzDá¸û¼…¥ æ¾²Ây1^ë~ólÞ^sev«(ÍBpždÔeÏS]d5ñH¦3¸–äŸ+ñp, ÄÆj×àûIÓIˆüwËøè¸õò=Ýð]Òx×OSÀ9´Vm|óbNs FÂEÓd‘ðœ<Ÿ=LÝX¼Ú%Ä4xjxÝ6,£Ng‘ê“yûã¤9º_w#f†'¤ß-ö3:‹ð|"Ç´oÒ­eyês-5"»/晲Qø8%[ úm†/¯ëx6É6H≠~1Zá&²”os«Àìµ¼ç×hbÊóm[$ÿ@aÎç~ôPôRp—®BþÉ8DQq£0£\ËÍöá> Lå¤ ‰¥ö¾íiÔòÒøvÒi6¶¶{%žžSž TF;Dˆ§ÎËš¼ ɧC.3·ƒÉÄBPæ!_ 5×Â(YÙ=ÐJl½á÷ÉgY5/Ðk=ÖÂNyLÞòöH ¿¢ŒköÒJ é¯1y•F+×ÀF 'ë)îÁ— -]µRúŠ94PÜ™æÉ…䇫R¨Õ)´ÈrÅUÁЩ¤ÏŸê:d>ißö£Ÿi;ýÚj  ¢îµ?*=ý„›UÏ=½y¾œ‘ éšC–ЦªmÕQš@–^Út¥ÈÛ}KùÒ¥[LÃÕGÙñüÍrÂ> ¡÷H›jvŸç»Zï•–sÀìF:“½¡ýgp¹,xê!¸Úƒo£Sp „>² +—6™&ë=öÇþXgFrUyú0+Æùê9 Íý>ÏhîÛr«-û¹ìI?YÒÈÐí„ßÎ]>cô Ü\Ûël€Ó¦·~(¹q¹½tÈÄ0òI𚇇!%ŽòÁ6…aÔ Ðù~zA´ÏŒm¿iâfᢔfFÎ0­wW51›I)ÇïØ Ö„l‹ŽàÛìŸYÏ}øÄ8Ü—òÎ|bÐÛ«Ø=„x˰VÄ»räã×🬂î³m0P`Ç7m· {µ@óH¸qçòíàRV>âXx,‘@ÃÁBcÛÎÏ:Ão ÚY¼µòEUûç+‘Ðè±­È øÅ¿˜¬óÃ6û—rHüÖ’ÏOÄ(5 ‡Jw畵šÉ¡¤6ŠÇ\¥ó+Ú`†æ—´ ®„í1ËœSP žÚ¯õÀ v(>ï¸ +@2È!Ú§D¥ B®c†­X`$6øgc ÄñÅUOËŠ|\¿äö}ï^%®Jh‚H>´íTvLÇ+Ë ˜¡é ÿžõØPpÍíŠK…`Ð|Ë»ë !Sc-tŒáYV"NÍ,9Â7Ñ‚¹¢ì[2˜l£FÕ|™Â—Íï„o¿¸ëäj+'Ê’¤ÕàÇK…sJXèsúQ$¸5åÍ"ªJ×E§ÄÒëOSe‡g+“I‘_ ýlK}5Ó@CÔVÞc²sTàåÕ|FúÒô®,®GJ¥Tlê4ÏT±»Å¨ûuö÷ôþ,†ÂPL“Œ¦h>=y$™•†™ÕÞ+žùŠ+KqhZ ^ÕtJô+óƒÈÒ˜´>~ *Ë=€ìf¦ÕiLW9\βT›a/Ø_ÕùÕ˘ ¯¤-Y27ÅGÄC Q2­ ‚&ʸ¶1M÷ð%A>«7¤qXLÊúc.ÊŽ ¦3f°çj Ü>cÀòÔ|UUΤMjå²meJÿÁrFõ50žÆ|zWÂ;Ó¨q°Q0wGÚDHUŠ2…ÿ ²-ñèn”%L ·£QSÊÖc\!LâåÕ¶Ã{5C‡‘mJ’çy ™l2)ÿ:ÿi‹ÉÜm#%ód´pp‡T²$µâ€Ê\Þez–XKSýÅïù®¡±I»¯!Æ>pvÂz|Dªã"JQê fx<–Øðñ{ßáÇډ뀄m™&÷¤Ú ýU28ò%èRä*QKÁ ŽtþPUœÂÖ³Ñêî+¡¤ œ,Ø ãòú@ŒtáÓÈð#[MÐzyêë8(gÆ"²£…){më#6_[0wÂJ£*iÛo/›5${õÏ9·3J=#§>ɹPâUi& àƒ-OmÀ²Ï3wž*¸Ý¼VɯSÖn>»Á™û™:õÒqt{ù“¼¬éÏe=á?t"©ÓW€v¸~£Ù·â•ºþÖ¡Ö·B]iT :"”Ðèxuš‚Â(w;ÜìcäØºêóÉË”ÒÑ£ˆS?s_ì!BœòÞ1ÀÙ‰ñ¢TPÛnúÎö§RëdS°ÍC&ñ‹a†-ôžÐjgAJh5>È|2äŦI…ñ$óöÅ*pÐŽj\u§G¬ulÉÖ뙇+ +Aûv^´®¢ßî¨Áà{•¤‡¡d&ôCÃKá/dW¦èYø×͘±íK¸MöO5,ö†¿Äü¡èöÍK-x,É ŸŠûAõ….ä ~4KÊÞñq”Aå{ ž´BìJ;;]³™ oh£Z¹•ö¬íö^·O_œþ@ÓvF9"»½ã‹Y6#‚V)_$ »¢"œ0”ÆÓcÐl·—æ·XnOòèι½Á¨àðÈ&↢ö©É–k‘ïzX '}W ÑÝóŒÂw Éó‚¦Nyk³Fá+*•î2mðóµ$ê"OðÛFWŸì‰÷hÕŽ¡k)×á¸8è›ÌïÿÂÒyÝ`°ìÂ5r{Ãó…(?%Æœ_8¬Ï0XæÄ?gÊöšþed|™ƒV8„©[5‰bô£cL<;¯Ç¯òÔ˜!Ç{ßêZÎ8ÍÏz¤ú`XèW^äž_€'òþ…æwHèô=û.±iÌö´H>HU¶‚:%Þ7QŸGТš¸Ïˆä¦)‡ò~_È Œê‹)zŒRrÏ×:‡]J[ÜG[ ôž?Ñ&bο(l+˜˜‡Ñ­´u¬‡f;ÂÆ,©Ã¶yOßX[ŒïÆÆ»ÕK|›NçïE×zòZk*-Ÿ{¢m²¸{cÔbÕï‰g/–ÊÏÍ\¸Î0èžr’:Ô~IS?»ñG¸/HLœâ8¥È¿I—²Ïk)®æ"=ò Wágbu}‘ïüùè²WøË†GZëg¢y^É—iðí·É—_tèK…Zâ§E)(CŒÇ[$]S½¤´2+ª\H]ËÚDU0‡Ö+ˆ„”?–„eèÊö#:›[aЖÑ>ܦ(äì‘sº×ªâ©i£~"[Á©”K}cŸ(:?Ì™¤º;½ï} À6Ó”›§§;ÀrÁ,—|Íß4`j*qªï…¾µŒîG.|Ô!*÷+qB`»¢ed~=”_°¦á×´4Ú•o‹x[È~óßnžiˆÉÌù¦¶´h!ûM‰:Ga¨ ›㼀¥å%&+ùñAF’δÉÞÍM$¨}kD’¸Ò;À{¹7˜M'ćçK‡íò=Vˆéõ#J¹Ír¾)÷¿L¥Qe)³ ™ðy’5ųݫŽñ–Z› ž­P4¹Ê$@3 Œä(¾!tÖXêÁõÔ¯n†j Ù¾øÚÝ h›õÎáТ{3%Á‡B¯@YL…nU©W£ Ü-}-5;þsЏKP÷LhQâû@á ZU«{¹†¿œ¦ÕrSs*¨Ý¼YB¬Ñ2n…q±N ŒÆ@rš(ÌÞÃï…>BG¡IsJôgÕ=¼6|Œ $°Á»göî’­í‡Ü÷E׳×Wí-£8l ÃLÏî˜põlß(*­Ä†Á¡’BÈêó(œÒðzÄé¡«wϼÆ¿À†æ yh¥™ý°fôH}1a.ØÔ—½®†Ýv%¾˜ƒ-å‡Ý*mЈÇGp#?«|yò ©¼´@ÅtšåÝ4³&+h®ZÅŒ°„v„/øÒæâ€ÈÐ,”' .É·CZá«<õl¿ôi sííâì—×'7W¯ŠYÀh^:g×VÔ#Ìv7© ÏÚ÷7a^·Î¬q1éYæ‹ÞjQÁ5–éé2Nàó#²/Ô¨k‡5Ëô@¦ðók$fe×tå+{½,±/(ìu}Øägõøø/piϙʡõº«ëüêÝZ¼ÁË+‚¦tw›5°g ­«"ª<á!Ýu 1¥Ù¤½ó}_ê,ÕŽÚÖv LJ4ûa V¨kiÉÑPå‡4˜‘ÑI;a $νÚÞüá”ØÎ©|ÂfÒ¢øFLA~p ÖPNo½QÛkä±—È/²ìx´ãA² ¸ kšª{JQã•Â¥’T!}X}«OØuS?ÆÄ/X§¤”¸º±«ˆÎ´w5‡j%†ÑÄåô3†D>m%GÑ¿b¥àWnÞßöß·4Ø"Ú9;­È$[ô1+tô˜%±z²:&v€áqNW÷±÷õãTÕ¿ù d¸s†ô©A Ц¬æ¨\  ¢[y¯èÿ¢©ÈYÊh6°U'Dr°z(l€W‰} _¹*ÚÈGáº:6Öʹ¯Jפ٨ۄž@é—çÆ¯÷_¶^‰(õ~Ù}Àöèö¾ŠÊùUû˧`;»OËÁÙcXžöôÌ7Ôcˆ“ûÅ¢¨ÖMÔ:1òy©€&>¿Ï>|°Yå‡u^âæ¬/xùñGþWíâ1—Á˜õ™QqA¯"+8TÉGö°Jæ°EÜÆO 48ñRt1;;¨žn{…]Ù-rSõÖ©ý=iô.y#áóph , jiú„g4[z-̦IÅ·¸y:ÜÁ$ç‚«·†¶Q$ÂÇêø¨–ßHr{*°¾Þˆ˜k5¥ž€§ð#²›YôP诅É?qSÚàÍèg |¦ îg^üéCyRcøÄQA¤að•F¥iß¡1¾gzvùpöø£¯½Åz ·ŠU:c/å¬8/x›²iù]Ù¡KÆ5õ€Ü)î­ëSÐhælÄô–Þ(v¬>AÁ²×B™M3ž+þ¯¥¼AÀPiº&í0¥ñÒ8̲k25Z ¹Ÿ=Rɱ<1éÁˆ£‹Dà0i@fS£²dˆ–«Ñ+û`áÊOã›xK ÕçÁf0 Ö4O†Ò¡)AÑäbV±³T1Î=nY¢{…›Ž„¿ :Y¾F$?<ç`M¾=±ØöÞ=µCñVçSÈÓŸt“Ý„ò¸‰7—ÍëýZ¼¡'¥Ûà¼EË(fM•:ILÔÆ0Ç)°Pç^æ3cIäªã[Ç6ȰoåßþDõœV×ióFÕijdP†ŽVåBÁ—LyöÄQÚ?5e„™ƒçˆÎ¢Ç£œ 7 ›h¬Ä\fRxZ¥àßÛ¹Š¥Sf“Ä=\^­Eæ:§¤å$kâÝÓMt·¬1l¢=Üu•ý „ƒR5ciClÛQ!L_â†aËÿUYÌ+Ûž¢ŸzH¡Yš»õ5öÖRA/!êús…©•b'spX¸ÊJ-;EëC869ö8OQ"pð¼Ødiƒc¬Ì°ÁüÖg‘³dAa½+sC]y*øôlÎj|+j—íš*Ñ€¯Òx&¦Stã|KÅ.ÓXŸŠ° fûiUÙÕtj©±è)È/-, ü¾®Wraä0‹€ áŒhá@iº¿™9?°· ½XUàräû¯J#µz}öý䨂l÷By$rpì2DÈMŒíº 5ÆwJ¶ž»¬lןøÆoã›—ÞÜ9‡eâo;ìªÊí±¸Æ3ϤÑäC(Ÿˆ‡ ×/sÖă«t¤°Ô¼9akUHLÄò³£]” ®jï®Í£ÜU…?YУV§‹16Ÿ’p›rÆô60inE±ƒW.<ÏO{ä1Ë/ý $]¿8®o‹ÚH&—/’D¢°Cœí“õ‘ãÀOÏœMH@@¥whæÄ>æÄÃ,¡¬ÕùÈÊžWducâkYm9ãƒ}µéÂ]|¬¨¯8.íÒÈÄ:‹WŽ¡õû&°¯Úû@ñ‹¿Ž]eq%·~ò"':9(@Í4£-pꤪßE°yvv÷°Ø·ÅmwW/NüQ¦Vb&}–𑼜¨ÇýÀ‹Nóõ²àÜE%Ý2 ’0q eKÑ}H(âž_/fŸ¨Û‹ëLèBs\~ãù€ÕBöêWÈ\*…RKvGrÙ-rªuC9&S­M¥áÑò>EOó$H•Ë Pò–HEkAÝŒR›‡-ï½m¿Œvì 'ü›3€nùh|ª\Í=ΘïtmÜ쌡ôì¤ìuWÂ}F`(f~ÉÄÿ‡¾Î2àÜÍã<¸J>a‡¥f–Sì êDF˜ñ‹]Šâ½ƒÜ[6¨ߪŒ¡Òòç AäTð þŽYž åJ¬ñcòS”¶3+"åËe¯ £LèŒP†Glåp½\´ê”ŽìèŸõ­ú…ñO"=Ÿ#4Ä«×%§Ÿ5kb²?Ҝ̚yDF6Ÿèëô'S·èNx°ä§OO$qÿK>E*„ôÚêÉ¿)øxN ’ô­VBýGHµqu™Óô‡cíb®¾…&P×–`¿–Ï>È鼋™Ò}ðµ” Q¥M®åN°r¾ ê‡<£ðÒqðó§Ï¬Ÿ—+ŠJçËTlT#ߤ~¸–‡¿ÀJ•…é ”IÕ%‹¨t½u`F±Å… ³ö‹*§çW­{LÔÈ€ì-"áŽHS)ß%*•†ÇŒ¢[@3, Áñ€Çã¬Èž8ÿ‘ïè/ê¤Y(È«Ðzot.†ÙvÞ/ýÊœ”rši¯P„²”DV¥Äëy¥¸ÌrÃþRö8G ó<1K”+P¡EAzÛæÌq‘0½¨¸ÇXb!›à¿…6ªúèEfîžTè—§QÊégC:¬Œo!ו€Ï~Õ”b/Ãúºþ…èW)§ü­»‚nz87ô.ë®Ã‚¿Fc%3ÔN§·¡ bC-§Ã¡‰Ž³ÊcdZ}mçRàX£VCû C{ÞYúEâªþP{Q²ˆ!çdÛ”c‘¼ôú^Â`}KM#NŒ®R²=¶q$n»ÿéCÉS·0ùàeSAÆÑ/ÿqoŽÒˆ'x?cµBæECCYôSúõ—"ãm™…–»Iú<óÏ4zWø ç¯Ã‘»ítÑɩī öv9„hh0=,âsk%÷:cF,¿H,ü%£SA¶w¹V+JRçw·‡ñöÊ ƒò0V!IL‘$©§bÖ|ÎGÉr’ -_­_í¨i[f-‘ØÎ'’Àʲ/…ší0PdÖ¼ìƒöýË›^3qôûÒ "›C‘(¹ ø’Zh0Žö—<¹8ld/¤ÐÐ8*àBÃßT˜©)/ÓXÀ±Ò»²áÝÃðIòuÀyY?÷ÚHÈÕòy*ß%° •™ý8ct×]«²Ø;¾DíÆˆÁ‚‰Í’°$@”r3¯Û.ýR!·8®·q~›ášg8F:]î*ê®Õ:úŽ:kNÕè]@Ò­>‘æ°O [§ [ðôsJȶÞ\ÝûJc)¤´P%¯e±N¢]>yœXÎÚ°÷ô0WQ¯ÉýÔ¼œ‘4Eý#ö¹‘dcÒó%\O‚Òÿ ‰WÖ \u¯­~ÍŒzr@êù2<™Ö’ƒË>½ÚGž»ÛÛEÕŠWaeN¼™8ZТÆÝ±Âì9Ïáu† ýz Ã6 |QüüF¸´ÌKxö¼Pͱ®ë5ä œ­ÏÆ<à1ŒCRòÎòòÊÓ¤H?>ôMq¸‹¢ÉÞFºÿ»œïtyéf½è©½~ð²u‡Ex'SØÇ[dÍk .Š77ò­}S^¼ŠgV;ÙH†¾Qã5fÌ7NOÑÌËnÛà§<°Z•¯ˆù¥ 1Ùx¼whŸûzÆÒ\ßP<»‹ûát|‚?Î…Ñ9<Œ}?+ªI¹ É Oe@579u’ÜãŸ@Hõ¹ÄG>ÊuÏÈÆˆgµRlãºZÖ¶Ÿ/wìcÚ@±oã•!®eáv”@è§ÃßóxØô"*ÿDùôè³)á· rrz^ùgèY6¶E×Ôã §…ëèPfJòVŠõ¦Ñ×å-!¸he<ÊÕwWUM¨Ý[\ƃUܱÜÙ¶8°¬– —Àp——g?†>‡×Ì+ÊbÒóRcôL~4÷!0ß¡~¸øî$~ëÂæÂŒ f$a|5d–‘¤mâ×Po8SÄ$ èøÝ‘‚ÍŠÜCñð24íÓÓ‹u+ d¯ è—®fþÚÍÒ¼Zé¨Lq[½ÙGBwRq$\„(#„;”{9° Ÿâ8þˆùd‰Ç’Ç3R unÔ¸m±aNDï¸è®gæ:<Ï„¿øÒ-råÑcq̆¶Ã'P×úŠÊ“WF¼²Â¿ô¡lû¶Cü ‰µ†$+Ý¿2~.<}¨M•ЪÜݽßêT“¿÷Äl• :à›Uˆsr b€2IßWü˜7ó^+‡j — ¬)CºƒÆ-êo‚ lùµ„¬ŠLb×jýM™Z !VÞ/zú. ן³³\Å}eƒ9”бC½¬GA6¶YÎö‘7916•Gºî6±ßˆ'û™CfH!ÚsÜ¿iw £ZþÖÿŠ (“³ü¡›-§n×]ÿ“—·ØR Àz`Á…õ›~ª$†BóÚå€@¹ ›å¦*uÏÚ÷Œ?À0œX»«LúZJla³|¼vU¨}Rb£¿V¦³,|7— Ò²ž„óÓÞ^!²=SAÀÕ&AÑžö3*¸k—ÎÖÅæ •É"‘¸Ö@¸ÞoÊkì_4 Syv^Ìr¾4×éq'¸¡ W´ Ãï} ·]Á—¸Áo {d¡ÐK±l<–¬TÏa=Ê„øá®¦¾¢„YZÏžû°aÖá$ J¿µÇÛa ÈÒË7<˜âƒífæNÕÓ÷Ìc‡5KÞ‰ß/¹»®†sãgúòpbd¸§õŒYËï@ÕQIÏÛÎâ§”h˰èà4žÌ‡ûÉí(‡ Gúù*_·!¯Çc†¶@ÅÌ9¬ÅÓj¸]ÿÚ9 ¦¾ ßв'œ6n) DÄ“Û_‹VøÉÓzA‡¾€®pøŠv¡¶†»)rø®.qpîjmmúŠûn¡®:ð®dÝõ#Í ¥ëÌWÖy½µêMÅòŸ³ÛâšÑÆa ß²¿àhÇK¥oݳZX}8ïŽWÒc gÉC·TD¬ž‡(3µ¿ hòÌ$;âäÃSô¬ÜHe×Qˆf8ó,â^s"Æ–õm¢Ig1m›°³M‰¡˜4r©#qÉ«[xÙ!È_'‹mÁ°À×—R/B–d1šaŠAh¯°%;ÓÃyFt†Îc·À&À¢•L%×€ ObCœI¹O}Ã\ +¯,D3Ue$ÑÚë†ÊrÆçሥVp²ºÆÌ‘ä3P‰1…шQe_jÛ7Ú‹* KE†³`‘š ¦å Uóÿ‰úYËÝ¿DÕ0Oîx“»#¬íÄÏœe¤Sø×ÒQNL{‹¥ÁýG®·Q@ñѤ’ªžJ®ç,ÆM¿+ Pͨ›g‚LåÔu‚Öá(Zî9ÒíøZnÒh6®¶œæ{äµä[„#}p!°Îê®››Þ8Ø4›4JVOõáP^œÑí³ ë¾/~š }Y$*{áw"\™®†Ý7UÒµ ,4kÝÙA;­°ª²çÄ!Q‚@:7 O77!úÕÔÑ`q˜pu&Õµ¾ÅÎw :)á0ü€ÎScŽIÍU—+dÏ‘ )´â¸oõqÏë™p¡% YÛˆ›åR8̉Լ¥Íðc›´5K>c2bR79Ë•ÐrºšuvÕÍé°:.‰4Ñþ¦ 2öW¢@Õ+`É…V¸H{{ Æd6êF7ÞÉŽBð÷¶Bá]î3{ßý/ç¥&Õ?{¤„eð×C¬`ÿ‚ô£œÉí'ùü&KGÒÆÓmªé‡m›xúÙJŒ (º I²/·q³Ø›Pð²ñ9nàrJá-7¬ |Q·‰Û0eôŠY粓ì*Kë6¾¢x,~«JDðœ>b#–~óº3ê^~³…& YŸ mëƒEћ߲Z²%ÖÉEt(ñÍF¼¢¥—/úµ(úw5‹Ãü¢U³¥ùÙ'iA•Ž@‹*½OW/IÉ݃GVMÈ{,½†¡´áÆö"YÒw×ÒŸcÜR’Ì ©ââ‚ýâW¸l\Р…Øq9ßÿÕ~ìχ@HÉ2¨U|ɉœýEX=MؼFäJ3›Î&ËUÛ¥ï¹äa àèÞéžú¡CÊ”G裿£6„ô•q4h|Ëxv½‰¤Î‘66õèjûw¼¼êWzlrNí6YÖ–_bÂó ™ëI»\ë¤>\J,O§ðò=KÌÞO'Iä¢Ð“{Êâ‚’±–¥#ñ_'r;q]–Ô‘µØSõ­ü¼â¿~¸M±$à'癃¨í‹v±b’'r ³¼µÜÈÃoy`Ë´GS{¼¥M‰œ´"€Ñ^ê›G‡Žþ¾ÊŠOåÖ;Ì^P¢R6 ¡’,°³!åÿ0Ì~¡D¿UìB5+/FR„ÚàW l+—g?œl bùaŠòDp¿¡ä zw—å­ Üüjž „ÀíÛåyÚ´›£Ÿï“¦|iO°NçÜ›",VL‘ø“ÂP‚”_ &ÝÅ­“(Š$(dâî1 ûiLÈp ×(xIÖc’àŒ‰u¾ì‚Ûºh*ˈ‰ùt‡<>ï3$qwóeí@5­¤û¹¨ ºíˆC!65zFšÅN‹h(ÖÙº M÷À\]¹¼Ø›çåpȸu·ì$¨÷Ô7þ[³OrçJÛé(òŠKž_¿^ îXÿÍ»gÎB÷<Ý‚**ûÎÁ©ËWjOLj]—½ŸéCŒéGÚ+? Ïxó{nBcii}œ•Ãv¿E›órî{¡¤ÌOKkò‹÷ iάàPT¸7‘²9Áa¸8.¬Ä¥¿Õ½À/½ a¥É@"™Š^-Ùöd!™ÒÙ·ÖÃ(ú ÂBeÚ°Ù e&™ÔLhE|ž‹b8ñ´ûL_6~}…éàâß”bö ‚``㉽€òˆä¢Ìíu²bHo¬+ ež~sÄìô=)Ë®9 K¿<¬¶ó¾ÿ‡°¸ü€p;½!›ˆ+€+º°ý¥ŸÏ_J/ÈëÚ?ݯ­ž¬Ó†÷+"™“¥K/}$#÷E43lfጠ“áEì[àBà© wëùžUãRב<·gœÍ(|Rͯ0?÷™a¿[œó@e¦cŠ=¼Ò<ß{‚žÏc/eˆà)jó)¶50n7£)o‰ ¿0Gë Oõ›-ú’R·"å¡Ëý#ú¦qƒ6½\§ t-ÿù¹Þ唯.¿OB5ûÑmÄô ºÎê¹g®¥:PC¹<ˆ„KCeäAö»· àþ+½9pÊS€­9r•ýá¾µYRß‚•ìÅcÅ)CÆ™j<EÖÓÒÃd"BvÊE|$3O÷†Íߪ`U¶ÇE7š9y£Ü¦0ììû)æ+TÒ0"· X™ÀÖEj“OuèÆ˜öœúÞêÐå"ôçÄ3F[Fža çÔ,x̯„¹òiœáåÿÞK©Ôí?F'ÜVÓ±ùåaCÉÅ¡VP/v­yt iŸX÷CBÐF퇻×5õF6¤lË}¾’ô­ºçN®3 ^)7Ä~÷‘+é‚ÖN®~ŒÓsÍÞ€ ƒÓuTu…G´…éÚA,_FifwXÇpß~¨gžê’Ço¼©„D åBûãz:èäPú—¾søuDJm º0ª7iÅ­ÞG©§âi“0m„^VÜDhw_‹šéUM¯š¦qªpsÖö¼úÈèÜÉö¬hjà¤ÎtÃ%B¡§–GŽ}'NŒ?üìK®÷µ#D$Þ&#ÀIVÈ΋̘- E‰–¼…?zS5ã43oûÑ35oö¶©/n“ƒã }¼Ð‚ö¥`½±¯ÂŒYO6J#S‘*S½¾ÏÙ»¤ˆ_,º°ãWçNýÂ=ŸL³3Þö$`™ÃœKgg4 Õš§sà·Y@lmVn6ÁÖe¼ðä²H•4 ™Ú¸CSòÓòÛ‡›²Ç"+¤4´ Pàù†¯ÜÌ9 Á ÑJɆcŠ×»¸/‹YÒi•<`†åùhX¾¿dMF5–VC=Ïѱ_ï­“EqÇ_ºXs ²-€§Éûv¡ …mK•èrËÃ)÷Éer­ö̤á¹òµiB?ƒ·ûܳhì'Å”U¶ü€Ù¦ÈçÒReÐìÔ] Ü/îd¢tñê% dø²ß³¹ÉPH¾=h%• L‡ÿ,€€9Nõè4À)²˜½ ²ÅÖ¢PŠ3ߓ람TÇDæÏÍ´ ã;i×…^¤<2IÄüT“òÝì34>OÕn¸u\’˜™ÛÍXôˆ#B¯Ð̺Vè j<ŠçŽTÖܳÝâ"*éÖ :ËàIRŒ“¼bqúH­ý×'Ilƒˆñ)&@þêᇃ?UNÁèå¾5µ@`‹ñ' ÚgÒTóxÜòsiÅìRÂHk1®“Œ{.2üZ“ß>=­êv\øüKä µ¨&D³3s‘½rE5Òá9ˆdV!È!JaUëlVK-+/|]tÙª¯ÓÚÁhaÓŽ]àJ ©ü«ÇdŸl«¼®/F^EjÒñÕS¹W’‘2=Þ©Í%þ÷½8’„Ž J05c…ÒÂÝ%ë7Óíú.’ œƒ¡Aë· ûñŒ$ÀpP:I˜a:ñŸy¼Ë_É˪ÑYÉ•uB®yos ±TQà@÷F7U )½¡¾c¼rök8njûÄõJ­°HÈ`då6J±Æ‰>íc° ±ü8N—-¦,úu§•ÍŸjýÁðÚ÷2ÑL=Æ¢E,”ìó)÷ð™ÍR Ë©5ùË$T÷ÄÛ ”àbž=ê]`Á*g_ü"6WªQ-'ëõ ¨êCcæìqHsÒT©26‚¸®aƲºÝvã±Í÷ˆø¿|¬èõ÷ÂWOg7($þ¡rÁ5ÀyìÎíBËÒÕðÆnñC3Šcâ\@¦®»«ÿ1¦ÍšÑ™èKPZ÷'.ÙD2ôl~*䟎[צ÷?ë‚…I°B3Þ¡ 9}êh;0Íæ‚4%ŸÊ£á|â³3je­µ„Âa7cÆ7›U”ù1¤PÚØ8g§¢7pî`ìíÀ#†‡pólügG¹ªû71Џ½Ð)ØRÎ J΃WÖ'qpºCïC¯’»fý€Jò_H0 ÅÈ'à9ý’ϰL6ºÐgØr¼úá8uQ­àdþ˹ᜬE¨·Ì³i™mzK ÄZÖÈh¥Œ§àKÈÞ2fí"¸s–H"lY³Rlf‘"KTùÍn^vŠ GÑN»vÇD’SBë¾AŒ5¸-ù) 1d…о ÔVlÝ?NZw™«D>»&<¶ßë&´S鸆<§Ž¨³û|/\@¬=qœžK]½ÅCC»™ïX²°EWÑ€vÜ…Büº\! ÉsAu:eF•ÚûL}Q@ä²"õ˜»î‹ÞÝ[35èA:'o"2Y ^u{Íàš(¤Àja[cpˆ¯º…¬u/åŽVâ' ¯Âºñ@¼à*ÿ+uÑúG«øxYR&tsCno)tˆL #+VÔ‹‰P¬®½PÍB+4š¦›y™’² Jkó”G bÌ…œ»‰³Á¸fÔ}é·6>Mtø¾ØìÄÜáµ±‚^®bå¶f÷iÙñ%E7ñq.Vë¬>£QQ\w5$x½Lk‘2q‚Bp£ì~HTÏTn”fãb`C?Ñg[c‚¥ƒÜ!fÁräsLËRáΟøGÚEÀAÔ-„2 ÿ™š)ì( >«ª»aé¨ÄaAòg,`"Ð݇¶2A_ •¥>爢½ÊFnz‚ØOç¿v ž-=Ø ‚ž5ù›º'ŸúC/šâo'¾u¦1åƒk‰³ŒáÝK°n;C?ÆŠvA°nn»LܧsÞÜÿ jm¡s *…wÕöŸéAò`ë¼q^‡hNšõ_œœzº ¿ÄÎc,WC9ŒApHÔ‘O…"ÙÓS+`.[’h&ˆš‘ÿðCÈoë*‚ u묬ng±Ê@˜uj•3‰¼Q2‰ü‰VǾô#­ÑÙa D†¢½K:ð¸3ÃNÜңЫ½ŽïÛaî1$5ÎÜ‹²h4ûDÓÁSÏyÃË­c3&œ^=ÅËõPm\ÉQ•°Z9(• Rf!78.ª§îа“Á¦á$7®´µ¯ÊØû ÕBL¿E ‘ÜãHŸ£"ùh[Ì…æcÅÐHãVª&›Ÿ¾Ý¨ YÍÄDŽ$"I ùì¤íb `-Kà»ôŒ‚“‚í(Iñ‚ü¼ùG~âa"‡§ÔÚ¤AãF…:oï`†íîïyðô_ÈÕÒÞß…‚A…Ó ÕX³ •Ëà­ë|‰Å¾ÊŸC.è–ëoH š/ÁÅ%Ÿw¨öCÞ¼áß½6«±Þ™0å´¶§†vHfIé Öêe¸çqWèÇ‹øX)oz·)¬{€Ë‚‰¼^î¹ûlík¾)ÍÀ)ÖWV |ë£ý¡‹–¡H†’‘žÑiZ/²ˆ ûB7 eXð×-´W3œü¿p}‡÷{;Òa¸¼N Iã*œŠI…'y¦a³[ßÂLÑž¿p~Ž;ô”Æo>`LÓ¢eé^ ìÆ/:ØïcàŠ?‹Å僥ÄÚöÀÉŽfé¡ †vHd¾5 È&)ÚþI œ©=€¹á·#¡`` ’. ¬«ç—;Ù=ßA#׆äd(’YØx#““÷_¿wñï úg=ÑçÓÜšÈÄyxãÖSØ*;Øg9íw’dñ wÌcŽ£_7éàZig‚fÂ’áœmø-£åÒ3}`hQn›&wnM„4åp”—ÄójWß!}ÞMó.•,³i;íȆ’Ù7]F5"O_U¯Üïs‚LÁbã^8ÿËÛ3DëßЈâ¤>VŸ½Éè r¥p‡ +ÿ8hTÎ8FòÚâ¶;‹÷ÚŽqñ7BT‰MWÅ©x—ñ ^nå•ölõ1í3§„à@1B)@Péĺq”íýÈDo8ñ I‡Jr=¬mtBÂ?-ü cCOzÄr+;Ìõ©| …ÀJîе ìþ¼ÈHz˜€À|¬±ÀNÕµ˜ÿ\bþP¬kWŽåQIõ¬AŸ:s&Qá¾4ÂÜ.}M'oYØ}~­ºps„9'ˆ„d¬xùË-ÐX9 £Õ(ûµÿÀrxjmùú(—š&þ«’J5qŒƒõ•%ŒÂ_1eHŠÆÄ#t•’ý»eL \Ì&AaW o ež‰6=\K€MžûØèåW” ÅA†YÅŽõ7* DôPØ…Fjç^i¬Èæmæsv-Ý}P›•µõÐðÞy¤ñºâ]I‹S}»㊟é ü.®øCqD.£¾Ç[ÕfÔ½Ý9(r"¿:’Ž qCU¤à€f Üñ<7üÏ>Þçí|ö#äøÉ»Mc ˜©ûõÇÍ`Çz¿ë¦çN5„××a¯m®ä’ù Ù¡fþêõ´í/Aáe_8Û/LaÂ_­ “`õw€‡XêEžNŸLW/—X!§Tç¡]Ï?%x*qCÅünzÇËpÓå"@.*¢ÖzË7<‡À|¾­ù˜ÚɃBy)¨Õñ|ÏÎT FàLC½ýNöÃf—ŃZ/Eá@ï>ס{ó†ÒçØ¬E<°ûv Äw äŒ%õÇù±$V¥¿¸Zñ£Œ3¾¡¿ v¤Â¾Ò`¾­€ýÁn¢zÄw!sa†…´žÿȼÛ÷Ÿiè×9½¢ŽP¬ºÛA-Iþì{uûÛþSÝÞe-MµH_²ò·0r§L#c Ëd\ð7÷‹ŒL¸²:l\ÁVGž\^„HǨò_"ѽ÷ßË¿GÈß$å˜ ô¤{þ?Âf@å¬?ö^‚ñ_žt-7º »É\襘é«#ÆÑ]쾜é{ä7`Z_-:¿[×QLÈ+ÀçÃv(C åÇõºI(íš^©éxùy éÉÍX>ÙÓæ$qq/±].=ãÊ]‹Ô­XÞÖþÉöYÑ”ýÀÜáõ˜Ø†+_Ú·È*ÃGýsd5äÿã^5pü¾<Ägÿçi)qÿÂeÙ·š¥w-¡ù*”ìGü¡…ÌúÜŠt„;¡Òׄ¨¨dœ`t¬ïO94¸5¯ç3Ùí(BʹÙNÇ[ž¥¨Á€ˆU ƒ†HüŽ®½Ã %›(ŽÒ¾šêí:;Ó™ë‡öíÁÔS\Ü?ín¬=VcÁ•5rWsÄïS”Û¯rÖo<üú/Ù\@U–X4ø™Àâ †Â:”œ±±‰L«ÙT8MEÔYQ”†ÅBA^â*ˆèËëd ¶6ÞÞ\jf-¦çn“ú`là8{Øc.áíé´Eg ù1¯}ºáÛ+ í¼Ø¯S€lÍ%©sþy’ܨÔóÈô”2+*Ð<±Ê:£d!©Ð«ݲ Im«8¼q˜÷Á¤#+žÔx¢\Ç?-4– 97Në–•òÆã¹"–_¥ãc=ôŠ$B"õ¥©ù(3‚ÛTÒÒ²ÿZ®D4lªÒÆÞ®îIYfE·?nûŽÏˆKƒ|þô´ät*}t‰[Ä}jÚŸG´ŽùÐãô¹,Ë:ÎHËÁ P/aã>û”#öÒÒÛΪû½î}Û“Y*‚›ç½Ä³º½%qó‡KM@6ŠÙœ ¼Êÿðd̪]H#ÊœþŸPãÕ±IN~Ûɺ†9çÅXE£Çè€ôW?õtaxûä{* -*j4²†åâȦ´ÆUš˜’Ïyÿƒ3J[®Pù K¨ uêîN¹ôå*€èd7h¨"¾ôh˜É¦²58×®˜QÄ6:NòÏ.Ö(ï*– •Wj&'”ÚžÌJƒ¹è­øý³Ù)º• ZÃú]%¯Ñ»û³ýÞECf¸fѤØeJBöË$ÿ^'›Û€IL>$d}äá Ë,xùg¼ð…ïPÄœ™uK7Ùo²…€J®Kk§—F †Q¥á‚ÎîRãÄ 0lÈú_¬¤³öz¤C‰$3ÄÙ]hÔÝjyqëÀlnaÔû>É€ø»|ÝŸÓÏ\wT E‘ù¯·M“ÿ‰\¸¯Šô¾!¿ŒãDìòžô‹ÂƒnðˆÛ?VÇdDN2ÿ¿¼ÞêÓú¸Åå_>Þ8Np³à>¿×@Ðù?¬:bõY`kk²¯NÂg¬B1î"2Ú:G”ØCckÕ 1_)1* C¼XÞÍÐ0;JÁó%3dOáãV¾6‰3o¨¸a¹\ ØkïHc ÇøÄ.÷†zJñgYê¾;´µšµÇÕhá{ÁY[¡]Gˆg¼™QÀøîŒd|ýÚ½§/„Ë(w¤YÝÑuˆáqñæ,Ã… ¡Ê0lÌÆl‰[e}û‹²þ»ˆS»C#ké¦ÂÜõaœ‚åL Qª¦Ò‰|_«ìnª}ÓÈŸ³jÇ_wîwŒ_}$9.½ÙpÖ¡iŽ>ö§*ŒÏÐ"aŸí¢¶LqöÉl¢’NMjÿkÒ˜:„ Äôïà<¡R€"æKXXÑ«g–Û=,m3N]¥l›W³ üñã–ßà«d'·éª.j#³Í~óPu|NÆ8¼Ü”AS„s¬Ô(‰Å6© ”¹óPqœ0ŸùÉÉŸHte ›­ï­ò»¢t¢ñ/ºeÅ%éql›ž/¤°tý‹ÑÄ¿o²t&hûBä6 Y´ ô§>¸ …un»–µ³Eä¿ô™8®œóÁ Ä”éßúôú®zy°~,‰œÁ9碞"A"rŠò8ú¤`e«Þí¼h›»œPéÇuY6¶1²–RÊ~fƒ8O°Âj#í åùùÄrÁY«Ö4µPír…áyCá¶Ì”ý„q’¹ZVÉc‹ùg`ñ¼+“J À äÛDÚMn‡_È’r>"‘XгOgÃÆéfQʳ Â?4,ÞÌ1Û² éOñÁÍ2<ÆÂwN-&™v ’º¨_Zq‹m ûвóÑï9ù69eÿÊ‹­\qÿÉk|„;]Ø—Áýžƒ-EPu¤Á[ðªfóOãõ& ¦Hëóu¨¨(>k¢•‰K+,B#œ½á%®]5(§™Wð«F>2…Œ°ÿeW ¡k%ísU€}’eúÚp ½s-9—GÍ@‹Û…øöž¼,Œ7²UÌL§—eH<|2ó„þšþÅgϵüm¼DŸÖ{^)ø˜ê]bÒìSÜ,Û*¼ áщ,ECÕWŸ+õTñ€+„a!(0½í (|-|ŸÚTŸ[I–zúC<@jŒ±cØÙæ]3Ï+©îV8´ ®:Úk¿‹jÑ)#ë¼”¶‘õKrú¸æí>h¡ó $Ú`I½ÚY¯Ù±d°bľ½BÄ’ {‚„´‚×2BY /T¤nm—®g?)«€¬ìÕqû´*µO>á¸ÁPÕ…M6¯¹²=(ŠGH?)Y·Î„˜œ£Ï4á@×ÛIáÑþÂ#¡ÿ£fºFɲQñ¡C¸å yÈ\jåXˆ"«6gÇ>6”xÌ,ýG;Ðç÷Èm_¸Eko¨Ô•Ð$•ޝzð'q¿ðe´HþâÂ@+ì¿VÇÅDÈ‚§Áˆ#wkÊF[Ë'\ðÿ/ükEÓ¥b6ò‡ÂÈ­g0#•0h‹ºF9ú/ô¯I@:;  $<¯Y¯P~i-¦züáÛõ¦rNV&Ž‚=›ÓG«ƒYåž®·€]|÷Oµ%*Tbwz gß„$R,ôêF©],¹GËÆŸY1–“äË»ì-o·ìæÃ¼‚”Ôi‘÷Q¬ÄŸ1~.0Ý(Ÿ†^±Ž/QÍŸ!þùÿ¤oºK0@rËcG˜vŒEI?8´ûÜÃ!Hþüieu77ž 3Vãõþ¢Á:$)\\Xg4Ƌ֙ªrÀý;˜<&£:‘ ÙìyoÏ/3È2øòxE^¯0ÞÜ ‘:ÝÑgT²V•MÄfµÁCnWܬøŽ\Íû¥Wp6d!©Ãü`˜¯°VúFºID #Áÿ1P÷_ÚŸ&óÜþáñ‹·ƒ4jWÕ½ñöûذƒ{™ážkïE›*YšÝlð—\Iä<ÿ²¨z¨üEA üV‘®š¼Z¥8x@¤¿è:U¬<—ï>¡­‘HÑá°]²î‰ã½îx¨ªÇ¡n=vüA¬òÊ^¡Û¥Ý$ÅQ©cfQ–o8¿îjßíÆšÂCšözéM ì¬°iÔ”Ž÷YBòÝcsÕÍ;áÕx}’®•"Ò3Œÿø}yæÿT^P*º¡Ý§¬ëàdÇ~•°7|WÿÇË–+ä}kdÌ;~­šfp0ó²Û…PÓ§’á/|âAËgÊoh2–¡ÇO¹)»dþ÷Æ2î|sº/ŽSle !éwžë‹ü{ûUxQ†Îý»BZ»)n<œ3'Þ,KûR]“ÁþÐKØpXv»Õ©XPU —9„Ú6ê9ßÃ_Ñ^ÉK;܈a)œ¯Ò¬÷Î(±7·á$;7üQÚ#´eWðé¾zlÒÏŠU™3ê—¸Q˜1©rD N¸W‡‚—Uã AZêŽ*ü2'üt]iç4&Ëþø0Â?ÿ™Ííeö8þÖå„džÄØÉáÆÎ'~ið=Ú¥ ”z…zïeŒpÍ ¤˜@ ý)ÙùSô,ÿ ò“¸‘´#¸]ùë%¼k@¨üµçëkMŒ­d«!Žß˹Àm¤LüO[õN,ÊמqNJTAyÊÉ{@lf1Û„õ¨•9ñBwX-Eú:ÃÂëV‹ ˆÚ û É’¸­ï)ép 1]{îðKOl€0Î+ôàá猲` endstream endobj 102 0 obj << /Length1 1553 /Length2 7662 /Length3 0 /Length 8694 /Filter /FlateDecode >> stream xÚ¶T”m7NHwH.JçÒ)ÝÒ-²À Ëîº,°tJIw§"ÒHK§ ’*]"|«>ïó¼ÏûÿŸó}ç>gï{f~3×Ì\¿™³œì†&‚ÊŽp{°†ÊTõŒED@ ˜(JÄÉi AAÁ©‰8ÍÁH&û_U$„ÂèÔ@( NèxB"bIY)Y  ÊüGÊÔ@^G€ž@{qªÂ>Hˆ³ sÌ><¼)ßîew0â‚ô@(°;æD`w€€Q>ÿ Á#ï‚B!d……½½½…@îBp¤³¯À‚rƒ=ÀH/°#àWÁ};øOeBDœSˆÇ½ Ü å B‚â†y`<L2žØh#š{G70þô‹r}? !³ ©Ò¦ÿÏGþæ!n¸-Ø:œ…<¥É ‹©Ï¼û4Ñõý‹£3F›Õ’÷ˆ/+&ãÌb„”MsÙç½g¸d¹ÉGµ‡&Ÿ>>™¢*¿fÓIâ' ø'Vêgµ,þÞ÷c¥©¨G×-Ž[V ,¸ÇT£\~*Ûé:ô³~å¥KÈÑŒ÷tc+î©"Ðmß }ã3äÎ-ç¸,Ï-a\í'±K­ZÉîeìÉøây{t–ÐÚR-öÉk¨T½„1±ÌF÷EA½ï6m%_¤± mZ=¬W"’» ž‹,ªdÃyð2ŽþÓƒA‡#i›eÈìÔYZ:‚Wsë¼Cv>š²@iOïëøNFyí¬ñAiöŽrà›cŽî·l±Ó8Cïn×´¦¨ó3=¡«Ïcñ<‘iaÂcŒ»“–›]Ø"ÖhH<øÐ¦nã 1oNõv[¿7ÑYTÿç5š ³Škåê—…Ò¹”O µâÏ›p"WÆ<é4߭Ȫ}¢Š\Ñ‰Š¿â‰(>´xÙs8öúpצD(/Tál¢BN¢M¥¶Ê7HÔÝ*Š—`²•i襹’-»×ʇçÿ]ƒ(4üÚ¯7°\1£.°t+ÿÇ£vz…W múKzQÿ·eïη ÇÑí[$Ãr·|¬† QÍ7ÖŠqè®kç> ¶XEBLÌk°eŸu}ª:]úfý‚‚äÝñß‹z-H¿ˆ }ì,1ˆš>´‹EtÆÌ$£ê8þípšW^Ìd‚ô±cç ^¬z]ÖG|OŽ;9™¯É{s‹z„Úê«y•¼ŠÍ§ÈÒìk0µ£­v¿?M¦óÊù!”gò$Eïˆ7bQ~¸)ö»×OÃ)—à;ò"Úw nx||ÚÖ7¤qêìYÓ»öÎ~Ùu‘…qv’\´÷ƒ´ÀÝð/šûb-KTÒÏá4ãBM:~IA¹ñÓyŸEïÅøƒ6}‚ÊC²}ÖZEóìòIzôdŽ%ø»òläIwùN†Ô‡E£L.ºqœ>«¾iÞŒ«§üŒÑîF}ÜÔ2’+sÚRøÅ é nµ\œ‰Ûl–À’ý‘æìsþÏãŽmTvÒi&I“Ë@>¯v•ŸÕMØ®7UØá'ËÐeKí@ÒøÃb_ëà¡«Id»K6?ŒïÞ0ÞwÜ ¬~·ƒÚš]Ðú²WØpG"(ò9±-ù'¾?™à)V?ÒìèTÂk#¡„¹åúnƒ¿-Äô—œ(ô~ZÓÉ­W.àÍ›ù"Òº¿­’&›Å,º÷îO<ŸÝ8‰cZDê^³qÙió5× °½µœ:1”;]p9çy4uÚJûZÍ7Z±ÂþÁ™Í—A+Ø‹ù…œq·9Ö7³åொìÐgqzó•¢ÎÔÛ‹B4Mû¤R.^y§ñ*¶à–ªÞ\*L7·§‘²]uËÉ~¬#Wé@J¤ß•ÊwH:§ÉÜõìéò¼Nòt/k”ÙÓk‡±ª¥âm²árètÐJŠä¤K¶$ž5¡èüR㻂DV6«e/³£ìUh»¡?'¯ù`3™û^ëì‹<*ª»\í ¢­Jº#ø^Ìð‡,%£uÉYx>ñAóŒþ~Æ¡Åq’} ù#* R®Ú§Œ!ô‘ÁC™¢Œ?ëA4Ñ—eœ$×™JRâÄJ×X´ŸÅy’™Û…îbŒ±ÙåOºp#*'×øÑi^c–uŠOF)5gÄ(ÕXd3Bm_%4M$òqµˆï#æ«è¸Ë 0.ka‚­ yŽ›Ò¾ÉÃÑø 6U¨­-þhÀÂ+ÁG2J­KàëO„JµmWÏ ›üc¼õb)42K†´<ëùònÒmÕriRƒZÂ)%MâÆ Z m¯_NãÏl˜5ÒÎ h0ûñ}‹ Ç¥®Œ±m ¢ÉÂôMHÞY³s½Ä£NdÞèçòêΉ£`Ú1îV³rséù¸æ¾’,¦Éó­…§"#¹‘4Ë‘·¦˜3Kð•\;±c)~óèœpŒ±Eô'IŠÙÊá±g—äj¦êÌNÆþû¦ÇÜÆG±ƒŒ®“Xð½ X€îU?Ö^ЬÁU£ð¨Ý©RØÖTÁTü-í°xs|à "²p’'£C/îƒÞ×hÑ*'9é´RoÊ’ÃÏøáå/ÿM’`Zs~] ÷È2"Vae8¡Mÿ’³†‡ÕòÈ+mdS*@¤AúB¹úÞBU06›d)åÍôt›”n þì‹åZhÒÑCIÚCîô[_Þ‰}°sã3%yÅSõÜ&¿—\RÂxNк›GýåWev1Y<0Ÿrñç%£$xVWCê ú±î ï*ö…„ÏH"{¢¦rŒ:#¹Z˜ÒÑU_F[|a™dQnªå5N,çÓ~†I>Іðe"ø…Nœ]¡V…HVSÂ[E1YÑRÔüþ¼“F»·üÉ#¶]²o5mBzSd~ ÏW䲕° ûä*E¯>êûúoùu2Öª©û%¹ 9¾æüH”'ö¡ú|A~:^ƒ c ;r­2]O#Æ:ŽdØæzA)½1]à[ÛŸ§ ’é¾mKÿò<ؘâ)5:ÒߊݶŸüµ·:hÖ©vòûpÄý:7N\œIؾJÿú+7cÖ î½Å±ÊýƒÚ.ã:ʃYÙõí ¶eT2^S‰>|LÜÚî¨æ©*YGý;»¡%©ºSL› cta/ûãKGöcbìÔœ ¨ìF¾ýBüÎu™ÍBz“ª~5Gj·¹^Æd{Žš óýÁˆ [Tºx€‹8é“–~²Oë¥v©€A$÷ré­•qJhq=[DQøu„¾Ág†…;háˆiþMó Á6ž&vÆ&«×>–K„åì6Õ¾³”f…^??§%‘ø5.˜¢¦Û ñ9¯µ±óò‘shYµ0+r«,”bÛy¬Ú3å Péø¹3½ ]8­üÓáKæHëxQñå}Ç<á|²ùgð8G»¨âbe½ CûðØAØÓ¤ÈjÔd›;¥ÑPg®á)pyÆKòít{ Gê >uB‰DÒZ3S—‹[¡^2mLy±Ï§or Ts²¾°Pðò4ëžo_0üaþ$ÙQ42ˆrPµk}_¸ Ì‰ï« ®’–¨¼¯ÌÓϽ“%¢“MÌKÂXM:uw¦¨Žˆ_=¢,ŽyP}þ™›÷ÍCñy–×÷îUó7:Î(Ø:|2"9@T·@ ý¤¡¾Å[ 9Á Øê_NHÀ(Ÿ1A¤U$®ø6Â3Ð˰%¶nõ8j†× ­…`íãů¶Í°ù.ñý Ú³¢b·;ËUފ݈ޕ†ë±”ÞŸ+¨Æ<:–Å.ö‡"€ö©>Gd_é¥#Iòš@Ê¤Ò ÿÜ«¤ŽÕErß–c¥ß ñW³ªÎ{û±Ì\ïCv˜Øj0¼Lü°þ®XDW¥æÅ8Õõ:ìÆ½®Ã«Þýf==v @ƒõÖò±eÒ=)+]µÛ ’´#§Mm‘rfÅiWT/÷°´¬0O¬v¾fQÁ>ÖH£dÌà[‘™¤òaüEuÏ‘'€³\tþœkÈ›»Q AÕm2¾½Ú¯Ùo<x…¤kêwZê#”£ÓÅñÍç;0ÇñHëoÊõðO¸ã|||ÎvZöðñ×T¸(ÙšüǶ Bœ¨ZæAÒnrÖH´^¢v§-QÇÑKkG5ÓÏV3ç$“½®}MË¡)¡-uo{œV~ßÄ•™ì¡öÆlQç=œ§3—4’åË‹cöÈL¶–ƒÅ$ F² åÛK0ËâÑ}‘Fì6ñǰ¤{,ݪ‚túÊÏWîÊÐ;KÜýfa‹åÁC‡4ô]/䫱Öt/ ¤é)ô Žf´ãÕFÂS“3£;_d—²u²‡$2 ã| ¾m€ýJƒ¦³¿+i^Ý”ZtÈÝ"Oø¬)¢~égguZMÜÆk‹1Éå² õ3gšÁªÂ_|xMZA¶ÜWÖ(œ‘eá@Bº!’2'Qà“$]Ï$LÒ:ƒoÞºV]v4_ÖÒ{šGÁg«ÀÈvG‘Äi3¾9Xÿr70ѽ7Ðu/57ù¦†³ù€-úÞÞœÁîûÅ'ñGV¡1Ôq,ÑQ3þ›T2\¹ýdŸœRä+¯‚ÚaM‚]‰h#ªoÂÖ18Ì Ö)¡ÁÆžà2úK… ;qâR_¬‹jWÃ7Õ®[!©tÆ UžR H¿¶¹ºC‰"b²Å Ø?ìÝ’A&‡aŒƒîPØyöI³×Ip0Ö;Ü(?73˺4‘ X,'o¦˜ÝdÕ_4>Eã\ÜL"Œ6XLöXÓ51ò”7Ð--{t^[ùIÙ¢±‚*së’žmÀ…M„£®Šg3wæP?སùîôk“8 ?Ͷ*zÞY Ñ ¾§¤¯”û…&óÔ©ºoýãy˜è§š§=d‘Ô^'s15:fbL¼TêÉ7é7M߃k#‡Š%ÜßË^uä©y#n¿sݯQ¾qñ’ð­‰ñƒW÷oÕ Mzë/ÓÿT­MrÛð¡~øÉSëÎ4Ù¸¾T=À‹|IX›ž•ØYn;¨çÄè7—üCCŒ…0%.ÌÄ[ †P«~#¸øräs¼rz\ž«,¦¨~/dLQ B†½„·’ç0næopPÎßbÆÂÑ€œ¸;XÅKüÙ°%a7šV"°¼"<½g‹”“Pd”™Û#W0ÊÕŸÕ´‚„U.æ&9gD îúEL=$ÊNk)ð¼ið´è˜*õõÏ1mX3×Ö[«vâ[* —ì¡%uتZ°•ÏÈ5–óô®âÛÐ#ŸKˆ:?L 5/~F‰T\/ÕQqz\x+ï ‹ñ3ˆßºÖqbžÇØ…LÎýíDÒ¯gâg??î£Q:ã øšÃp½Igš‹oJ¬—‘nø²6Ôn1UdçëwÅ“…&‰Þ¥åÏN&zC/ÿ]5›,£Ÿ=ß=ºÕÖb)üè‘×{w×L^3º:zƒþ$詈ÎÛŠç|q³5Ïu­³šúâ<øœ•æÝÝœ¼ÊU¥?Ž R‡G’ʘ"¬”l)ÃFpË !Rˆ¦¢¯ÒBt_ÔKÕ=Et‘6Ñ9*mñÛt_»(.X»?F(ÞùŠ.É ÜðÞT„ûÖä4}¸©½ê©¯¢EÎý»~/ž¾ßÜ¢‚6–ÝRrœmÙv(àqæ3–—ýg1@F$ú[°kÝc>3ªÿÔ/zóˆ~«Æc°D“Ô'êÁSzÕ¬BÞ®¥.w½hN¦k…£Ùn(wv¿=B¨V–è–Q•ꨴO(sŒÏKܯ%åÂâ_z®òRkV_®m2p’×9Ùp& B‚Z6Ö NíÊn«ET Ã3WÙ^)E=oª[»Æ{~hAõU΋wçüílpMvìÌþ"zŽáDÑMÈìç*y¾^7ví˜mTwmø·ƒC&b[ÃðøÂFΫ6ô˜€-í§E³Ɔ®ðál‹‡ñ‡î­æDÏJM­ÛñKæg@á»ÜýÈø…×óMoïò í 6N p?ë1ä]8|W–䛢\·xŒ˜å($f6ócŒ}U>ªÍt(ˆ`|´P˜UL²3õ´혉Wôiå­Ø#îTo+ÇÊgáCÿI=ã‹&A»X¦åj’çr’›zþý½ÎÁ§÷žÖµÐxûü5þtˆ3cTü«wJSs÷L8plâÈq¡ÞJ“ féÉFSœ¯IÜÂj/ª‡~IºÍž=[‚/Z¢¥[”·3Ôa&TiŒi‹ð }2Ô§VÈCrzp³z˜\Ç/MeDv SÊÕ¯ælLýû&¾Á[Á;e=˜©™f¡9¬Â|U+&+ùxáVcœˆæBÁ©:fõ>yûŽiÝØä‹alDÁ^„I,þ‹nÕúºÂG²D¡¸22h°¾ñ”Ÿ¯j-nd«¢A«ÉŒÐ&ÿ²é»K»Ûs€Â·¤\7Qå… .æ0ÛºÛ·Œ}'î:QFï¤óž9»*LáFGÚ«:ÊW¯•ÚNÆ L±“÷y½ßpŸ#ÖaOªå“¯ª6©ÃêÁ¹«7*`Éb½h,¶r¡,ʯæøåöª–†$¡úq²õ®yÑÛ)+}ýP5&–µž-6ÚØ6ª½{[ “O„$xî­\ÐN)ðD„ñ‹·ù¼W*§ý„—ÿNåýwëûlÍí©Ç„•,‚v—”±iÑ©IûcIì¥e‚þÏÍõ’„Ž”®q§/¼«ÀŒ­/ã¾ñp Ù ¢ºRˆìö‡‚¢ò·O`".r˜ïÄ"Ø8o9øìÜ}æ“A ÎÕ|ƒw·'Ÿþà™Ú!&/ëÚ¼dº[¦R«ç‘tèðÓqJ±ýâ·³AïsŽŠÃ„BL²ñù‡è•¸È;b’ôMØtåÙ[,±ë*EÌÓ‚z¿“Ú¡ amSDêjq$ ‚mU¤ì~Í! åÆôW#ŠwKÖ±’¶iVGó,™pé¤ýX“ÜUÍæšäšŒPWLkyÖU1VKT”®Ù þ÷qÄÙ†6Uåi­Àãsßéáëj±o8ƒR‚(.ÔmŸ[‰&íyuárÓ˜ì±~T²»³´ÞËœq°j7Þè~¡h#Äš_ïš®Bu3p'Š ,>w­`ª7 Ùã ç'O:YúðÙEp@hDWá K«0vÔÁCôö;—@¦rÕžå0æþáTúXý7OG ϨY,ȆMI>y¥á–£bƒæFÃ*týsA¥tÚ[ât+¶Ã=äùçMo‚Xèï ¥¦)š2Ë…OKŒbØs€YZIê€ñ¨¯Y‘·ñq›ïÿ$J»-¬ øÔÙwmòóî"1Á‡ôdaÒ€¶ÁÇ3Dµ™½3+"§ªì8Ô"D²$õÂo­vBä[Z™l³’÷‘^ïÝ#d<šbÌ6Xg÷Þåy{Ö·>C?Øê¼oM½“ïy„Ë9êºþÐñUh`A”³V–cÔ};óxŠ+DVâ~®.¹írÂÝ:t|T¢<| •õ-â4ãÂ^çHUÿ»‘Ï šàZ ±–M*›$Sõp=jöì‰ß;l×¶×< ‹3üLM©uÛ¬š˜|&G¹Æ­µØŒÿz§ã`Hí`PÆó¾¦k÷mÂÕ#6®½5㈇ní_ŒP„Ê’RO¶iÁjñ¦} SN3ÚJý}9ñ–QõZv9ï*Az®ýŸA¤ç*¶<ûpprêÈŽº–¼€Žœ8_ç"deTÿ+^?«‚Âé3¿Ï=¾t³„YËzˆ{ÑNú‰ôÃò0¦Æ²w¤Ä•Õž1þ~¹r¹û aû‰Y”ŽÄÍX ™ìøÄ|ö›ÔüÆ79Ì^š‘•¬Í“´FÀϲz±K†<ä³ ”·Û’_®ã· rÂ%5ÒYªU \†ýûRN%Ro–±†˜Ž›o‘rÍ&¶T‰ÂÖ¨¢Ø9"Jcf`ÏaËiX/mŠÝ=µøjXh8¯kóBdòu€üSœ>Õ®·g“´YãÌn¯mm7ØæGž»n•5ewÒܽïzªÈª:Ò¼d{áÂiHɱð4;÷U‹/#ô&‘nâ°×OÆû†F†å0ó›+H¡Ý&ahC0±€k^ßÎS!ª§ùîP‡çv.A´ô響8è¾^•bñ“'¹…Z[Å÷¥á"~êiQ¨¿,ÿa-ÒÒ*ž;R»6‹êÆz]ÕŽ’¢U¤ iÎÉë²ÃÕ¨>ž"ÄìI2®L}ìû‰•ÝgË»¸¯|¾Î§Ù£+©¾hÐQë:­.7t0~>_üDô>pš5¸!.Ì¿íæ"[FiŠ® ÈNåÑÑÇÏðya‡ÅM7?»âÊ!ÔŠ.tÁ”§J\FÀ_=_]$’Úe1sJ·/-!`¼úÍ$Ï«šLæ“o}l Òä†Þkáp+X½ÒÕâì§ÏXu/óC­pr‰€‘ë#ꇡ(ñÉ×,'CÆ}_×Eró:–äÀ©ù/kL/$î®ÛÜvRê nˆç mº”XR…}5Ú„îËÒ%Úõ¬+ËJ}îc@é§}Sè×qTRsB“£r ¤+—´B?¹‘4ÖëÚ'ˆ=\/ü®+ >Þ§_òü ïÁû~æ»C]Ӆ뾸<}Ú]¤ép0°©¶Ÿss›¡½[õdÌr©ö š¾¢øÉz5‘µKl ?8‚Ë^T,’@vr:žQly]¼þpùÜKÍ!8Q.ae¬Ù‰ ¡›Ý¢>^v—›TŒ(ـŬ¤2ì4±›JD´MF…NÑxTgi}3š¦2rÕGe2º]Œô–•‹¥N”öÛœ”?|F¤Åž­¤jéÅŠäî?PKHâ01[^^ɶ6NïHòdcþâdéûUÿé]qÉ–-X¬º¹êZ¹U9vbc®ô9¸Kî˜ÅGšJÈ»!©VØN ,ÍIp”ËP¹Ör=q,Ö%γÅIpº ƒŽ(?¿Pv;|íù`Ãô¾ïõ¨ñ^ØÍï¦CG›<íŒë¡ïpE Êô¯Ò÷Ò”À\¡¼‘'k97¦V YÅI"ì;ƒ7SõGN$®[î_¥°¨cÕ}–žØ#Ù0÷ dHpPÛ7©ƒ+ž¾¦ÁQ8=‰;.ôìJ‹½øé nÝ÷ðÍ{ê u;à•:MËí`€œü5r0+3TÑ{¥ß‚Œï—a(ªãM]Ÿ4ßzýLXëÂcAd¦ÿ5²îíË×ÒùÕM;_¶·$D5Ê/R°bøhÝc +[ˆ[«?ì4Ããf-Rç'åű= …Ì„ö}¾oõÖhØe¾-5´[ý?®o­' endstream endobj 104 0 obj << /Length1 1569 /Length2 8647 /Length3 0 /Length 9678 /Filter /FlateDecode >> stream xÚ¶T”í6Lƒ€’J %!ÝÝÝÝ= 00A‡t·Ò)%Ý)% Ò݈Ò]‚|èûžsÞsþ­ï[³ÖÌsí¸ž½÷}í{ •º‹„Ü$ ‡¹°p°² ¤T49øìì\¬ì윘ttÚ`èo3&.ÈÉ ‡ þ#@Ê dáòh“¶pyŒSÊ®€ƒWƒOÀÉÎ.ð¯@¸“ @Ú lPa(Âa gL:)¸ƒ§ØÆÖåñ5ÿz0|ÌÒPh¨X¸Ø‚ oZ@Zp äâù_ ¶..‚llîîî¬PgV¸“(#3Àìb Ð9ƒœÜ@V€ß T-  ¿:cŤhÛ‚ÿ²kÁ­]Ü-œ@€G Áœ3\aV 'ÀãËZ Ê5ì¯`忘ÏÀÁÊñoº¿³a’-€@8ÔÁæ †Ù¬Á@MV™ÕÅÃ…`³úhq†?æ[¸Y€!–*·ÈJh,ü»=g ØÁÅ™Õ ùÝ"ÛošÇ)ËÀ¬¤àP(æâŒù»>i°ø8vO¶¿NÖw‡yý ¬Á0+ëßMX¹:°éÀÀŽ® é¿CM˜ÿ±Ù€\<ììì|<#ä´eûM¯íéúãäøm~ìÀÇËî°~lä¶=þ`z9[¸.N® ¯:þarp¬À@€%È Ãüû£dý~<|'°ÀˆýQ{öߟ?™<ÊË ƒxþ'üÏù²iêëɨ«¾þ«ãû$%á/.. ';@€›ÀÇ-ðùou ðßU°ÿ'Uf üUìã”þU°ÛßçÏð÷n0þ›Kþ(Z€á?7fça>~qü?+ýOÊÿŸÀ³üß4þ¿ɺB Ü üÿ· ñü;àQ³®.úW?nìCõ@í¬ È ì ý_¯‚‹ÅãHÀl ÿ#ØYì²R»mÿË_vßKÃ@êpgðï[ÀÂÁÎþ?¾ÇÍÚ?ÞΊüã=.οR„[ýÞ0N^€…““…'&û£8yx^«hòø£a+ îò˜xlÏ` wÂü}¢|œ6ùߦ?ˆŸÀ¦ýo$À`³ø°ÿ8µÈúä°Ùü>Ùþ>2Ùÿ>êŸ þøXƒÃ?àc®Ó? €ÍùÀæòøÈìúøX¤ûø_Sº:9=Þtü8Âá?—äb.ÌÂBÁv5Á­×U/ÝY¶GE¦è¶õRY¼œÚ\oŸ¡'2Vf®9]J$~éÂ]Þ’a¸_¤¼÷ÚûT‡Öü^£å§÷YœæÄv æü8QßXþžDm/ù2mñoÞ÷ŽÞºöÈŸ?+Ò}pt妞KpíÞ#çQÛ[²4:»­ñ­’W ë®d’%F'Ú8 pš.Ç2s†„Í……ƒ ÿØgúâr ?{ìR1î5¦Ï~ W—á:çÛ›™7+eڜΤ´¤†$äÈøÃ¯¼$¿')Ïy}ŒÂmbâ̽WÌ4ÙÀœW¤b0Ýöïö²UêD—Þ¿\|å múvåqüF¶Uª#ê›^ˆœG§H3Tƒ žðˆ„kxùÙûzÆõ@q¢0léÿt˜½}õSäÛçNÉ„˜ ‚º†Y%ï|˜]=´æó;Ûmrez#œºùë% ð ží®©O‰%Ê-æ~ÀE]ROåkÇYIïü–,je†qÚÚBŠ#ô (|=+«­²ùsL· HEiƒæëÜ„§¡\[ð$šJ»J#ùÊÇÆÞQ SŸxÿ)QÜ…Wù=›„Wøµèu¨fÈÁ aR׫-½™Ý î€ï—L›¶“­kÜaõä îIOã…³¤ùg ¸t‰¿»¥õOTÜ+P°Þ…ÜÁÇWÂujLTd»˜ïÖvû›õÚ£ƒN˜µkg(-û1ÌWYµ­Ñ^òÞâ1XÝ’)h ˆ 3–ÌÞåýb&ëЊ~å_÷:ÛÆbtQóú½ð1TÎ?“Ñlj£çEY—™:A¯G¥ ˜Ü˜UÆfÿt²îp'}0BÝyGjS]ÙšÑw¸è!£›špÞá“KkóNÜú“*lþYú¦ÅGÀ'fƒ® NxU]«iç(­Â¦OõÀ 6Â\¤Öëo6;mêû¯àÎcQM¾§‘"oŠM(Ë‘Wf gqÆ}X÷ïã¼"å®#opDÜXD¿< Äï¿Ã÷oB⦚Œ˜(¾X#zÛV'ò„óÃɼ;øxŽBþiáE'‘jg˜Å…Œ•õQXTd®3IæŒô*î‹—§i¢F3a” ‡ÒßýÜ3¿ulÁ¶ï™˜Þ/;L—Ÿ_Ⱦ1Spÿ08oí/þóÛº¿_ùpr¬^¥l›I¨BÕØyïË^¼‰¨Qgwª±y|5&•ÁIj¤ê7I‚è‹ŠÞ QFëÂ$˜‰ÕDl„äbí ð¯6X6WÂ,¼PB´‹+™„j°–Ïó¯!~Ź$¦ùˆ-ø^üÉtcefJUf \¨yÒB&[¦1=áÄ¢ö¹ouj½EÎósàf±ý+®oÞQ¡Ï·‘>ÛÌÌök ÞgNFŽÇùQHýNº‘+ýDÜÛE>õÅ$Ù¸‹ ¡}§ŽxVŸ5—ƒ±Šô!Ƴ1J£û@œ’jÃQèž”<‡øKY5Q,¬3mz“êÆÃIö¤¡ÅÅzÍYìM³¹Î¨¸9‰¶ËÃg8qy_Z‹Ü õ ´»Vû‚¶ü]¨N½§Gm^£31OÜÏ àèÛzò”ú¹è ðlÓ^®òÙ1«yL…5^,§h»†7-¶+ukh$úПé+è Ä:ø=õŸMì,¾ï›l†·\:,½TÙ pKø +Yî›Ù× ³ju$ªCe™Ž.[$ÞÄqõ îO/óz?èÏL]¤PE~XÙ%k/„}¥IÎ3»(_öÝØûÝåýj—º»ß›)·/H/ƒ]iH:T;µ«v1Xn|èlY{&è(ù«ý5ß\÷4KÎÇ_È¿êÕ¬Ó%«‘u&¤¬eøYkŸ*è±{­nöËM< Iøþ¤ž@²ú*r$D’@“ÔÆ¶e ïÙîçM%³µ°‹Ï*ç— Þ:Ò‘«©¥3QL#L½ Ç“êÐö¬*'ŠÝçQüclúƒÚ¤ÏùÚ4ƒ%Ù\ ±Ý¯õ9®|õu£ªÍA¦W¶ÒàÝÓºÎÏ  Jm¡"£ïyí3[ íJ'U?QV-[t/‡¦ÁšGõ}¿|󆆿"G <ÐпD3.l,Îz¶ˆå0º[§ÈÃSZ…fó™ï]€œ|yø˜CÀÛ…©Ÿ‹u!¬,9òÂë¤#¤8ü-ÒŠ« †–óµ~rÓÄj¯Z‘C¾ôôm‰¬ãõÝÍIì>õDo"-éšÊB—#Dòƒ)no¯Ñ¢ Óì‡Y/~nKd`/"Yá×ñŸàž¶<¬ð× ÕmcØSw]ÛÈÎ~h¸¿icizH4¦GÎcŠ[GÐ%AÐü¼ÉõóÃ…!ýW”¯x½»¡J$*µV˜–émÕˆM®ï#œµ îlòÖý( !&V+]ÂØÜ„øåã%±Q"¿ò>]f¹~ÒÑ„ŸM›¢ï¬fVèÞ̼(0§%`}Ó`É·uOo·£@ŠÆA Þ†çþ9±ÕÕκ85Ì™Ï(®WžG¯ªSºB'4y¶òš]D†±„‰Q=yÁ(ÏFRÇ4«µ‚pvÓïÞšaOÑЛödº1Ò8Á?9Ò•‘}ÍO”·Á}¥ì”lV|S›3&ß­C‰egÔÏÍUûÞ-TI ”à½Þçð—È{ví+Ñç„ÀÖ;¦’ÜH%11e£PëQæÛbÂtç…)g€_÷óëoôÉÛ8Ø„¯Û<¶qô¤Ò²›TÃô•·¨;D‹SVrÙdÁà è*î&$ï(ñâƒ#=ò;´è8=³ç^EõÀ9·]ZíPýO5 µfêNèF«¥¦»WN|”;b#´ŒÚËom•ÒÖ¾¿/âfPî!?LØ-J&Èf-,£&æcφ$Û鎅7OÖ€~2{ vªòùu/é¦xüÀYiJx20à´¢ŠSm·G‘oh®O¥œˆ}¾Ñd÷1ZáKŸÊ!ó«Ü0þTç*ìIé@÷9¿]¹E³ÝÄé'G†þHUpÓxŸŠÏ’kZ¿ÃÚÁØú^ÄØF=#¿,¡ñÄ“q¿—øIv¸˜Q»Ígºñ÷KQÔ§€E_ìHÈèRùe‚”QÁŸÎ…À¶#´íd‘^OLoÃ5Ò×ëÃ_™¤@¹if4Y¢®>)(˶Å)øYwø ”jÓc|ŒèÚ]kæ¹Å#Þ\x:nwƒ8 ¼âZZL±U]’ (Hêx ßù†3?¤°æï(K~¼™@¯¹Àÿú 02ULJⶤ¦.„x°Lœ|ó Ë“u» wÚú…nÞÌ ´¦uŽBLä€Àܺ Šl½8‡p|/vL«Zñ4ê·‚L½j±ì?A‹Eï»:U35^Ú¯—î†êgcøCš/ <Å2׋†ÚUJîIÝX¶M+@“,/Ñ‘“ÅÄêt±c ¥rFÔ™#RB´~9Eh%.¨û õ“ø˜ñ“< ¡«Ú¥gÖc7MçiÀaé0…IŒ©Ü+#6©¸+;|51Zªt8A}eŠ£ó¯•,H–g5‘ô¸[x3?mKG®5çdÔöóECKO!*vO…~½eͦœ¾iܨ« ³Ë™ÙöMÎDÑáû ãE|ÞÚÌô¯EHx^Ãì!-™&¯jI“tƒ}ËF'; ¬–IUåýŸ¸=Mqe+×!¤ËÁM–йÝeÔûyˆ?JúË6L‡C®![ë$rl Xvù^Ul·ÿ =PŒÜ ¹ÁhÆíé Ð][hä݈~x؆IŽˆò0èyãwXT3Z8¸¹õ8ž\§Nܰ1€¥œ€ÛÌÙð¶Ò¡¥±Ñ¡~¹,uÚ<=Žb¡|OeBik£Iÿ,¾†& Ò3õ-í°ÀêÉl¯é¾%Ñ6è»~U‘§À MâÄwhÚËš2%YMá©2@w6K%‚½äòê[FÙFATŠŸIYâ ‘¸UÁ‰t)_zÝíGÈwjpž¯á'†%Q*ÊÐΑ1$êD{f’15Ÿç¥ù´Å†Jiµ¨tT7_ì/>ûŽŠª(O˜L80!üBNM‡ÛΪ¼µÖŠÿ‹4Ù¶±ú¸³±”kS0Y½!y@5‡/ù ‰Ó¦´¤·\³†§â˜ô¢™²ç"ú(XlfznzÉ >¹A±ù CðÓ24ìÕ“ù”q×ÝŠ§TfbY@7}æ'#¾vàÕ”ýÂÃg ˜‰É‡LNt¼SÏE%˃p´d‚Ü×E–PiíVuéÙ=ù•FíÎÄ Ù™ç˜=Ó÷ÐnÀn¹‚Üu¢ >Š‚/‰TEFÝ3¼¢9¦Î->| rU—ùòì&*¿£õî¼áú¹™ä)²v>Л3sçfø^F ­9â‹Í¢Éëègúœ›lŽ öuë5û — VîÕLbÀÐRé& ú³ÍNl­§áÄìçªEhRbõŸÖU}±dÈ£ê­d……ûTâ6¾_x·bñi»Z[êEZ· z" –"÷Ÿª7±& N_U®ÈI}è!‚ä%ði|b†°«è†ÝaF¨Qãá2ÌÕß§Ü:R­°!bovi(Ÿ £ZÍId‰•«£.Ç{,!ê`¡ÖsÁëÞª `'#dî1N¼u%¨ëQžì) ž1ÓœÏD*k®³}, ô‹c]©? ¾ÅrèNõXÛô(ÕŠºãŒÚm½òcžÁµ­¯‡'ôˆz6Ö™^ƒ‘•ñ˜×qбqFìƒ$TºžTÏô¢ÜiØã…`û ('¹û&ñ6»Q|èRÑí‚p'ÝQ;Ik6ãñé­Ö¶¾¯´î½É21%‘„Ï r}{×¹©É¾›¶1ÔQ;ñ5Ÿu+”‚Œftt„.JÔy9žl}Ê‹$uÛYläN@§lw vUb@‡Ùz€p/Ò,rÍr¤¨Dýs·®³E3“ð_nh]ž•ðЧºê(3ÓtÓ¸–a)SöU#'6æçvÎ¥‡£¶__Ò)«i¸¼Ã Õ4ÀºLY‚Õסe毻’Ù ©sk&¨ÐäÑùnÒüèÂ@ÚS;>Ì“,î6|Ñü6Í´ÿ¼ÃË| L!¹w ?Úâ‹ ¢Ð¦(ê‹_‹¥uÁî›DûÉœÅh)d1EAJ]Ãß‚FF572}yø±µKƒ ]%¥¸X¶Cµ¼Kýl¯µÇšþõ›HR‹©…Ó›†|ógI÷¼JyãȦaRG=kDf] }¯ÉjE®4ëïѡĭÙë¸5gñ‘s ò2ËŠ )ŸìX‹lh¬‚óý7Ñײj¢2² lHoV]ŠhEÕm-3ââ‰()H¢Š+nI†ã)ù„ŸæÌŸ½ö¸ª¼‚a6¿1öÉÚŠÍU3úZw*;8;óI±‹»AXÌ?–ôûJ¯ü¨_¨ i¼N13‘ýkøëì^éç}kç¤9i¾Ï×+SO…À#_¶=¤Íë5Ü­‹’ÚdK–šnJhcÄé‘}Æ»D%)¨ÌïNòÚ­ÔØàÐng8vu50ÁqЬ‚)èâay’WðTD€Tzåè3Ïí(1Ê>-šgOüµ £ó|Á{ùòvcº1½9 5§·¹Ù0Ê×]ºö‚w#,|iM „ 2û‘Ø$/Í…jÂӯ͡En"/-R¿^öÊ`Õ‚«…TA/Þ5¤Õ?ˆz绋Jƒ©bI ,qx%KÂÏz½ýŠ(J“NL¹,)‚V}þ«osÁ„ø~.LpUŽv['혰¹‡v§’GP2­±¯h‰;šVaª>UÝmg}:Z5 ½(l£ç8T¦˜ ä6¦C$JjX.§"F²2'wÈ=r~Ë·¿`F-ï"‰dÌo`ØÍ6ÒÐ P(ú,­c«µøÉ9-ï`þc:êpû°Äh®îrÂïs¼*yFZmÀ!Г=sëæ‡ãí -]­¹¹³µ:_-¹¸º4NciKá½ ÿ\,Z(·×à•º%ÑŠ¦Õ«ý–ìoÂCuï$ã¶°NsË@¶h{’“Ñ£ÝÑÆUÔohHm#WŒðM¾å– ?q(~âiŸgM:°Èxà›UéH¥ñüÈÅ‘?P½¥ÃõëBqÅsd·2~Àœº?ÈZ|x¶è.™’ˆŒÙ›~ú:3p&ƯXÁ祈Ú9r{‚Cëð˶¹Ï5ï=Í!øRgš/->(¢2½f² ÿŽö¤ÏQºj+«/K ”¾ÑÊkÊ;’#Mr#MÙè ”Oœ\ÁЍÓi†kT!É¡«¡ñ!ÝÚÚ n¦Ü×h=õ 0iIØÁ7h8§TYJÃ:¼a±Ûœ›¤*DüŒ’sÌ^2G—ìÁG”™Bápv¯B}p¬¥HàHr MЫJɧ™˜ûeòFP¢%4{»Ï¤¡ Ð%ÚÖrs~†¼KýàU³wÈ¢÷á5M“ ÚÔhŽ"Æsf$|’î.TXӤКJ^üÀYqìóˆTÏågÊvî‚¥_ï]snd¦]/&(ægŸS*…þÂ< =/Å m! îÊóÕaÈÒïù‹òÔ~~Ëf`ÁÎò©¢0„1ó§±+âmàxØ·kO{¿£ëþÓWÙJ%Ó'NZÏ¢¹{ÞjaŒ5] ¬ˆ˜V«s8VȾZŒÅW¹¾±'÷n3Üg[«›O1y}Q61ëõ~Xâë•Dæ!bR½„©jµ!ŒK¶J“¥À`Jþ ûµÂ tŒ×çC|9Å.æ)ëa´o÷T]æ07×+¾Â%ð¦ÐNðÖçÕHÊ‹pœ>‹¤MˆHf¦Š}#µDWÁ‰’ÆBò¢>ވܒÔ\Y†dÆò…‚êGÁTÂÐ~šå«•ââEø¢D'ޝá;Pxب¨U¢tñ“—¦BW†Hå3ÜÄ?î1ñsÇÈkAÀÍÅŽûµJöPu¬gëMkP‹WXôz–LX†Ä¨ŸÔt‰«äÍņÚaOUÅE„#ªšâù§e>8u(Ø[ogm· ü=Nàç‰øÞ'S™ñu=X®Y5åT˜Ì0_±ÿô˜‰˜Ö7n²cÒ3ÉUØÐ%e·ÇÛá±eÄý!ƒÜ*tPq]¯8HDŸ¢çë׿&°I¼ù¡‹õßV»™wæ=«JâöE¹5¥Ðq[ãçZv*_iÏÍQ'óµf”{¢µÆ3Ÿ¬>ÇÄܼ`¸øæØWu8Ÿ*aék£c”ƒ˜ø„Äêm7©Nâ !7|èÀô£$)ȩ̂Ún n¾Ûovn@£àƒþø¶±Øüu”ß(¶ Bf=«:Tt‚y}Q£Ò°Ǻ.Tf¯?±£9Y+mdRÈüÌg¥®Ì298æ?ÕÚ¹y¥‹­\ð´©ëú8kÛ^îTb’}fÐ=V¶/ÐXé“7÷ðZêÙ« ,žÌr’#pzµ—UÜfDß‘¨/ÒyõË÷½gÂ@3p.K奿ý€÷^ñRû%ÃÀ±•tF»gÿ:C~Äúc+×ÂÎÍ@Rֱߘ—Eâ©÷¯ˆ ßêW¥$“Ûg§a/q×UºÆ6ÞhTžìêó“h:”¹`pÖ%òŒßÇuJ©gh¿ §¾ÿ&‚ÄŠY6@ÊÑ+PeD²‹Þ4}wi-€wš»+uš3ªTÿæHÁokM~2ÉšPð1fE±ëk!dl÷¯e„önƒ±ˆu±*Ómס`¼Aƒù¡žØ˜÷ïvä­ŸkîIXÒAˆ£±aA·l©XbUÏè˜<6É:a{iÃÈÓ@fE¦];ÕÓäÖçhÎDƒ÷X$µQLûM#­ú€¿bòS´é×Ï«+ƒŒ[7j³xuöpÝ;ÂŽFŸ:Y"Š6²Q¿XzŠDeµëפV:RñÊËéü‰3‹J7²o›ä/«OË p=èßp¸j¤±\‹”rÚȺíiµ³S6Ì<_ùIU…Žáù­‡`eÉ>íû-[”O/#§‡ù¤ýµw1(„lëvuÁ·¬9áø®³í¶EÃöYñ}¡*nu W>Ë[ (uš>®Éƒ%r‘ˆuÞߌêð:lðÐXÒŽ9È(´ŸtRšGìD£7Çò³U\†aÎŽ˜•K£´|¸y—×T³¯^Ñ£0£œPÿô¦'‰†²O3È¡© µðé@p€æ^ÑÖ b f 6—ÊM£å±ƒï·‹Ir —R¬øô”Á,Cã³S¬ŒÃÚ.œ‘[|³Ôh`Jý×ìaØðaw“  öü47@²å§d¦ì¤«éÁ0Ý@ õàYòAN4x·¨èAgüÚ}‰8Æ–Ç­n¿¦ôaø;㼊i(MÀ”jKÙl;*ÝM€åýÀ ‰ŽþnµR‚Òd—å=2ÉçÇ­Áo jzCý¼k-N¿<ì›K„{]e‰ ½pReŽJÌ#¹!]XEVAÉ|ýžß‘<©.SywÙ‡<Æ7…‘žúˆ-=<¬øT=˜,Y|SGîOÜœõ뉾«5`Xå¾xzœ'pÎÛÎzNT\3è+dì„q©Gv’Rqôž¾ÃN¤²RWÝÀƒ™óÖ ¾ØÄB*üíùÊ(6Æ3ûm?ÂÚgfk·È…9»;…²«vé1—6³Q‹ÙµqA9–QaK­t7Ÿï+Ø2çFä †ƒØö»ý…¤¡¸­?’cªFRHv^¢vŒì`úåû¥]­`vC[Ì=ߪG¿¡d¼Z}‚²¸:õä†nB`!ËÕu²§Uðët’Fpû¹ŒcÑ&¦`¯•_¹²ò¡tË"ÒcšÛú9>â4ãÓì¤tLæo\©"àî†$×ÿÖ.‹e"UñNÇd¬Q^^ýq2aŒœ€•@¾8椇*üEjD>‡#±Ï²Tñ¹#~}!Ûù|€%‡®†Ö™ê¸{QékŒŒ°3?Ø©[»ú–ÍaÍ{5Ž÷Äáž®š®'ÕG#7 ½ºŸêá©åS“©”@'¨Eï ÄîäÈmxÄË$Ôˆ5z[ªM !Ê *|iÝ.âj€† %rz"-KÑyCó}®Óï#¡Š"öü ›‡âo6³ÄŒrü¬K:q̺ã'JÅ~¡6Œz¬Ô›j×½£½ó´õ˜×’ÜùŒ*~sØñ$³[Ò¶Z3ëo‰´ìÙçL‰–Z­â‘60â-¨(Ç…O„ÐËTØtbø8dø±ë÷]cÇ4ÖDy­4ØË…¶îèm£C±¦¶¢r«åȈd$n¼ã?!¶^b)ÓŒ†Ób ætGðo„×ä̼ût‹ðóø©ànÂJߢƒ|•7¿ºûR®ë̾WF‰Ÿ§ž F–^Y ørˆ8öLõ±L¯BJäˆA)'^˜¨9/ ¦¸ù+{ˆÐºWY±ìï(Ob¨¥*&½¯vV/±*É4ÜVÔœ—*¤Ø8Úõxˆxpá.#Ç×Ä aV§‚¸©9Š»"> „A¹ìVEÝ«ã…÷–¤wÒ#ÏØÍéÙD®~Ì[±«¼éÝÐA &þu@#{`Œ&-É¥_\yB šô<¦Šu¶AC|õÈ$ÈŒ:˜ì‡æGîᯣIÏyÓ‘ûùŠºf¥Ë•0[Ñ´ö|7…›oÈq³,^Ú{–‹©·Ï÷ML§í#ZÊ ´rÌ3Víg¾`BX©`g› ÐÈ$Äš¸ L<€ÙÙ½É2ìõ@[#]©^håõq{ÎÕp¢ÂžéKuسƒ–˜„U £ ýnt ¬<^ ¡œÎŸÒÌžU1î[dðÄæÃü"£„K“]4éoèkò=W&_è„ÿî2­jO™ÖËzÄ0dvœ8>1iîùü2úZäºPã`KtSPkbõ¶H¹ÖN÷Jñ›-l-ÇG‘Б±ÑyÂ'jßø¾ï|žÝØó4¨(G,z¹æÞº©ôÛ7åÊM›¥Ô³2ŸÒ^Àwh°Ôª±ÏÞÖ²Mò€—J©ZÕc3?ÃÒEÌ'=0UHwäÔŒé†yí XaÂŒ­â¯¶òô»,z˜F…­²º6 /×ÊíÞÇëù-å@oÖŽš¾³kZ_œÔ¸.´˜Ihˆù–”ƒo=0äE/‹0*äÍÔJŽóe‰Rc§5´‰TòHægæG(nÚ í1ï_)¨;¶Pˆ—ðÕ8z2Šª§ç6<_æÞ·_Û¦As{5dñ’£ƒçL¥yµØ7<’}Ò®ìQ¶•ši–óúmÿË{,Úí¹ÑóÃ;aÔ–ü¡+â’ânÛD1Ç”m|n\öühžµûŽvð+?Ïô>Ö~¨­·«@ ¤Š6ñ “„Íü4*š,ª‘ì¶ŽAxçyJ™trÙ|…ËÖ¯–7ì¯~q­ý2//bf¬ð• ÄNùµ6 †Yß}­æuÉÝ™•Šô’ºÛî‰ “.^9t&_á É{I­ËùOìwº‚t£ð㱦üø‘LqârnçÓÞ‰‹^åõrOK5^3kÙ1meÐ4-IfÞ{Ú»ÓO,…òÿÉúá endstream endobj 106 0 obj << /Length1 2357 /Length2 15138 /Length3 0 /Length 16527 /Filter /FlateDecode >> stream xÚ·eTêúJww3tw·twJ×ÐÝÝ-Ý Ò R‚4ˆtwwK×÷>g»ÏÿÞw±Ìïé~*2u&QsGS ”£ƒ3+?@\Q]ACƒÀÊÊÁÌÊÊŽ@E¥aífüÃA Òº¸Z;:ðÿKFÜhâ¢I˜¸Drîv67??++€••ï¿‚Ž.ü ks€"3@ÎÑèŠ@%îèäíbmiåòôßZ3:ã_êQ{ ‹µ™‰@ÑÄÍ hòhfbPw4³ºyÿ ZA+77'~OOOf{WfGKa:F€§µ›@ è tñš~§ P2±þ“3@ÃÊÚõo–º£…›§‰ "ØY›\AJîæ@È?@]V ìtø[XáoFÀÊ`cfûÇÜ´²vøKÙÄÌÌÑÞÉÄÁÛÚÁ`am(K)0»y¹1LÌ šØ¹:‚ôM‹ä?ˆ‡À"õ±X¤ÿ M…?dSñÙTúñ²XÔþ ‹úÄ `Ñøƒ@6µþ Mí?dSçÄâ™üA žéŠÓÔÅÄÌz,ÜþÐ9þ¡ÿ=Æÿ0@I›ýƒ¸@ÆÌí@û/…“ó7ÅÞþÃß-e1ÿ¹þ)âoäìšþ? XüqŠÄÂÚã×o¶£»Ë¿@"–,‚ø–¿Ÿ$à¿E@aYý Ôq+o'+ Ã¿$@4ëAPymþA‰þ ‘”‘Ýï‘üÕÅþ!–?¶9@¦ÜíMß˹ÝCÇ?AL€ÞͱA‰8ýaƒL:.‡ÿé'Û¨ÿÛ%Ðâ±8NŒãŸºs‚Šädçþ¯˜AO9‹óŸ Arvwtš›þ«l ê¿ÊÈÊä.Ót­ÿ°Anÿ:y,nV.Àµ”ƒ›§ã¿@£éþ/ª²Ç¿ ¨"ž 茳üË;ȼ÷Ÿô@ª>@—¿mÿÏy0swÕÇí¯KºÿŽÏ@ Ð aqÎÑL ̦>¬ã¾V”Гi÷'G/·æí›;)'Bœø63Äw%<Û/„œ7¼i¹*£VÂÕzŠà‰„’q<ž¶|b̰˜á2Ñ'Ì ‚JüHp´—¬½I±xŸŽdÎÉ*nßS ‹a¨G8bßëî8+Ã’TUÁ+ÌÑñá<†œ)ËØ¨òÃÌ wI°Ú„Df Ê}kž| ‘ÓEl>¹Ã¬êÄ0žëCæ œ‰Fp«¿0%|ÿ…‡¿kìû£U§ü».ðnÆ’˜|šýkÆ’á»EÈä J!Uœö€û÷ÔR ©¹Ó1ö¶Ù8e'Oáñú0þ9¤Lx Ïàã+™³xŸ<ž/ÇÃAÜÓ2´çŸ0¦¾YOý0¦Ø…ú¤ôA'¢@–2R|A;fÜòP&\ôkË þí›]Ò®w’¡Q#>üûçÙÔA· „¡ 9­Š}ôS #"´ ¤²DÏ´±¼‰^Ñ©ÃmöèüæV€¤”†oÛW¯ÔmšÅ¢Y~³¾)Ý‹žÊ½jqÅI6†¤/:>'“$ã!¢Uø¯í”BÉh¢ àûø3…$—ÓrtÀªod(hØÖQM[½lǧçHýÓ2àþ_u{ÀÞÊEÐzw@ W#šeT"0ˆì=LA™/ÓP›-èa阯¾D¢é„fðÿgÕ!ü²Ä:‹~—µèé¼~ÌLãG“tº ^"Uy^0ŽS ‡ŒÒÄŒ »7…‰ì}¤áGV[饟1ÐHÚÊD_BÖDC´å׸‹Æ‡Öƒ‚2¬Â@0Ñí9€åÆÂü%&'Nì‰0j¦=U.îä01‡o*¢Lĵ®±ˆq¾½'[P¿4-æéÏ÷Aak4KÙ¾a°¥keZëWŽ ÊCµ¬Á‘£PšY·æ ‹ÁôÌ3>ž:³ùŒë efWW6' ëë9IÅ(]ÔMiÆî†%¦;×y¹%'“@²f2¡KoÙmýuànF5L™/$|uËÉ3‹t¿®.Æ£ª¸";J¾/LNF ”òÇ'ë‚Är×Q8Ú6ÛVQ:Efƒûžµ÷†ÓÔ6ë^ÕwéO3JâwØÛ½¢zb®e}!ó½-ômCwø¤ÂÕ7· ìLã 4îÞk€GÚþ$·³hèl’Ìgó:ð¸hm¼Nzbü ¸Ñ‰™2P«â¶ ¨äc£õ}ÄœE/£°±ã«”yŸÎ)& ŒÏs m¹Z\¬+,j*¶Au°+•Ù:¡ 1K=ø|¯Ùæ´ìËÛµRç×¢‘æ×ò.¸Ò¨XWŠL!–p}‹NûVP\ôƦÍWçžQDa^×74j°Æ…ñ1ÒŸ†“Ê©˜8 e,ÂáA¸Ré0ÂX¦ߪ†]MÞ‚—8¶„|c¾Ü·ÝT#ȃõIèaÏ:b 8{ÿk§>¦QI5•… ½ò9þúÀ\– 5þ ÖÒSÒhQETõ«¢h–°‡EçaVÕ` ŽO\Ùº‰,¥ˆ¦¸·P$jO3Ô•n* Ÿ™´›ö/rÃÂ2|Ø[6Š#}T4ÜX m—ÓZ×ÉÕ’N?>ßëúý@ãf¦òJ{V™~V%SÑ'Üèäû»cfQz‚Y,ˆˆÀÄÇ3ƒ„ -Íøqf ½î½óò¸ Y•ÂËuÚ¢8KR‘¥—Ï[«VrRœ'õZPÎþHǪ7è¹Jb-ü矼H&I^Ÿšv}8a^îøÅ 1„‡a6ÆF}ÄÓ_6 n9¹r½xõhNk¾W¬Ý>AÕ±º"]?ó³sê"ŠJÆóV YNèÉöAOëô@y5³‘"¥g­XÉ‚“zÖÓ ¡Ñ>p6lN¤eà2-}3’H¯;'÷x§Šq“í=dTz»’I3"KÆêhÌ¿{IÝ«†®ê-^)³ë™¶N΂[P®¡whÖfž¤akIòɇ¹"¯Pö,”ád}—Qûg·&Î:éNvWÒŽç­P…WqÔJ¾”£cNæÓ²ª³³bÑJ¾ÉOjI1I«’=æpC*Á¡8ŸŠZ:P¬¦¹‰GL¶XÇlŒÂñ›„ž!úýpœDÙc¨ô²T#¤höµ9¹ÚUÌh°ñ~}"y$ÈQˆÛÃ>d^® ðå«Z|_v…3N‚ðír¹'dð<„’•xá5¸úùTI<švÚ¾xúáØ÷ì:VŸ«àóâIûô˜É=1ëºgbæúÖv~l£‘ƒ8Ï2]¤‡’Š9<±­×yTç³bv{Ì=³ -œ]PcÔ˜omìݳ‚MD˦£ÏÚ&s¶ÊQ­ã‡-È ÃJ¸þ’~©GÅ?ü2³%Ÿ¿j¨Œ²ÏÑgMœíM£Šw8Qaך›¼â PÒ4xx½¨=p ×0bAói¢µì8¼«c Œš}vwD"‹¸ª÷žtÚðê‘å"g*55Xòî:¤/v2X1_‡\B÷QT6Õ·ÇäD1Žª ]Q`au3ÿª>3ÂH9UóÑ*2»š) òÌùS¼Æ{áñÀþ»õ#GŽp=0ßl|Ìó×M‚üÇMóÚÓÚ¾,¸šê <ùz~Íè«‹’`a£Öð뼌/HsZ%”Ž+ÑÊW¥ìMp–àdÍèÔ~ ¼‚%¯GÇ{ªbº±äÊ oø‚+£Y‹g—šú\.U ötš|&}r À”'ð2Iûéóƺrr㯅ÉS×e$„ªÙ¿˜òi2.H“mv+WÀ¨]ñ­$c¶tÌÒ •^‘¹¶Içûé±®?3¤³D¸ ÕE/In6£ é %)L±Xn€È‰9¤XÈ‰ÕæþÈ1mø9®àT±ÈúÊágx £ž:9þAr9Ú7˜qafŽFˆkÂ5˜MÔów~_ÏÑ×Gš ZÄ„§³Ì¯Xô~ŸkD–"ú¿è'œ¼t¾ÓHµm>» ËA’«¾UÊyhg´D{/ lDýàiȪܘ]aqûÚ€\»zâÈ4x€¿¼c îÆhÞµ¸â±-žø‘|ÈCÎÒrä׺Նžö¶\Þ!q±€ú8ÇCo³>-lKyr¤ÿt¥¾ØvØÌE¾/š±ïÎ8•¹×U0»#$‰ôIÝVŽÌ’°×—}MÄnNæ&?].J=ck¾R;flÄuè)_\Ì\™Ùoij(ˆç£tq'L¹7öö¡m;G( É2FœcƒõŒV x„£^’&8oô¬ ôiL+Š¿¥•JýµJ˜¸3<Ιˆ.+M†¼äòe§B%Ëô‹ûMˆÀqnEOk.<'iÞbAÌìª:[ žÍ]…Š*CÑÖãÔ‚ªŽ™¢bF>¤H’%!;‚6GD&«åîÈ~Ù òýU´ù´¤QE–gtêôOî`Ý~ ˜ á{+°´E†kʼnÝ/ùýÒˆÍøÚ÷®¦óÌ\kÒ¤!íï§¹é4™Ö!ï&ºXÒ[t¿¡+Ñ)ŸÈÙi`ÞAw¿bFP3› ¿šÞ–¹ADê«5 —_cHä/Ç‘::Y!Jßá³ ~§+¨ÿÁ4›Š»i½4b25'M«‡À(ÏÜ…Dž#Mí;ðæÍ]V¦õg,y«¤ùZ‘=œ™ñT­ÁHüýˆ:ÄC!²•š¬ŒBÿ™A‰ö ’È”c‚XiÛŒaŸýÝYÖW|ÐÏâ\e<ÈᜠhÞ{r…š-úš¬Ñï™wð\np40ÀáµßØJ¿£íHD€Sxícm†AM„˜~†Z•̺sú¹Ýljâ÷§ˆL^¥¦~Û°‡ñ šù¾öµ~Í…FùìG•´Ó„øUi<çéðÀwcú[Û3a&ìF‘ª©$£,s‡ŸS#綈FåcDÃè0çñápì¤ïª&ñMµ‹üw€æUAZ€×KÊØ)ú¹pŠÊ<·÷ݳmq±zʤ´‡…\ ' ãÊnŠÏm „‡ÞóŸè‹^{ ¿]¥(XÝëè´@çùøþî<•U©C}üñsì4VËòíR¾­YJHw Ñ ñ†c¨$R;OsöD÷æÉFã˜"O)€Ý_¯”¨õÒim¢ï^Ô ÷=p¡%¥˜+¢°ÿ¸YMiS.ü¾õ ú!ŽÕø%,’øSñ›-´HL wÃÒBŠìø|ßþj°ú0åt9ÕiºÊej%aæØ‹îxèÂ;Ÿ";󮯣…—_؇´:7üÏ”½âÔù]v;l”‰È¼]cE2aÎ@FŃs®wVÌrǼ?kßMæàA÷uFT$mX镌aÃ÷²s¯¶®¥þT˜»„xoöËü«‚IŸÝ|órz«Ì3sƒŽÆ=i)”é_OÍèµ™Ûk.ïº~_¯-éú)o Ã6;·2Œ'è%0Í”¼®Ϭ}lTÔq‘ ̧çëH†~lÏ# gÑybýœï1lûš7ú9rƒ‚ã-1h`›0!—‰½¼D/¥0>X#¾Ë[CC…ó¬ò>¶d¢>´7·2–kWòÉÆâˆ¯¾óÅÌÏdq&Ý:<Þ”ËBÅ[ù¸{{‘kQ;÷¬òõä ’º¦8gZEÕ.°¡CÀŽP?Ô–ÛÔ<|$=“l¼ÒûÏÉY¶P•AÆP»«FWƒ½_ßjèñˆfçC3™$&×§•¥eiR@-ü„Š:Å0çkmHì5~离™‡Óòí}ì!~ýÞ+OúC!ØÐÇŽÎÓðIR±˜¨\ •7 °‰Þ'W®¼ 2â^73ª#aýMjeuá1…‹'‡–~µúé ÞseÕ«›t°‘ëØÖKǾŒ÷‘êPßÈøà a*s…=}ű[ñϳ¡?è;™»ÿÞ‘†Õ,úó ÜæëÌ´D|±äû˜Î›“;7 ìa66¢éJêÞŸú¿³pÙÖuG²NÂl}VŒÛ3J"/ClÏÙšô¢½r”JJeA¿ý^öÕVœæ—aLÊfíoxX ”ðÉ!`¶J:LÄ%åí³¥³£»¤útc^O¸as¼Çu^¶hY¾q‡ÉVtuÅmbLµ¦2ôåøº¥ûÜ-9ã~"ò®0Þâ| xåÍœ&îéûΰ&×Òä¹Îÿfk»Èd®„ó‰©ó§¯•¨¬PÍh¡€¢Ì•“°Ý¥±Ç´LÓ§ÚÑu|°=(•AíY=VX¿<Œ—æZ^vwHš˜Ë–¾Ü$툂€Å÷ªæJÂ\=lÙk|o¦Ñˆ‹6pQn©Äá¬Äsk‚?¹–ŽQ¿9àrUúZ 5µ@ÖZ~œ²~DàP;9u!¹;wŽ}X/ÚyL(E ”H¸lMOY[qM†[«‘1é¼Rz?¶ ³Gltä( xFÈ#Ź~«#ܼq¨z#|â$—Zç«€ «Ì®ü~¸tà%¨Ý¶s&w›ÈuðYøRƒ/ŽÔ’62Ç3æÈ %ò 4“œI2…ÁFŒLö–€«üÇ»nâßÅÀ£F¾£M±;\FF|O~ —I˜ú;U»Öërr¸#ÒÌ ov5À¦ýýò¹ö0ºoº¾¥'OEVŸÏ£l°TÝOCúñdfDÎE„¹!­µ½hTM;4q2Ï™G<™úÝÚßµ~Þ<¶ôètˆ ’H…ª×^(}²w“ÏÆ:/·nñ“®¼Ž2§[qÁ3¬cGœÁð?/ö¼“Ê'Žñ‚úLhgI}P,§—›×5®´,UÀV¢„þ3XßD½lÄ"µøÙõ•Ñ%&L?Äí¬|óN–¨_n(ákæïpr[î6”,Ï'{H‘–†ká/`7E*ÇÇêµ³ˆ< œ2w¤>¹søô ¾Þå,`…àê@xŽ&ª#V•¢©—Déö°Ê4Ɖ’ µ<+âk`È8tzõ“uX‚»z¢Óö–ª"ù|y¥òýûWVy¨ØB¸ ‡£=‚·Œ5ä¾]V„ªî åy^¨‚­W3íÃÄ‹†ír3æi ðâ¥{¡>¡àâF‰Ä5Ç!ùJnTAL!ÊÙi\#[÷kIk‡ˆ•Äv’VÊ2ã^:\UQ ѱëÅbW„¾4íþAJ@Á@:°ŠMÅ€ôñjî²=Õ•-|+ ™f‘ÑÜD«H1õпm±ªN’¡½±s y¶,Ê ½Ÿ“¦`@ÅÍN•®ƒ«Û>ÆÁ•αŸ2™ù«Ë»VÏIÌí@¹=Þõ`•KÑv»kÎ)J<¼³ófîu ÏnV­Ò…øMÏŒõô‹ƒªÜËÂ.þ¬÷Üæm¬Ð”7 •Ÿj=_gû[I€ÃËH":;`°'Oí-„ç˜'ªªøƒs±PèO–°žcȼI+›ÒS1>Q]b<]¤ùHR¢UU0…£î¿ îJÈv—<7tX_V=Ó¤ h™ÌUoÙsf¶ ÍYùñl%ÞA•Ûíâï"i$ÿ ÎÕ&lΰE÷±XñyNÙz}d± ˆwe²~¾Š T 4H´a>Ñ/BVï‰Ý¿ŒÌ–¢Ú휦=ñø$¯À—\w \V!BûÀV›³í[ë fÐ!btÅϼÉ?VDö‚{eWŒÅÅ0(ê3\Ò ÿŒ*<»Š|­¾ƒÀ› qÎÀÑ šÌ9†oiZç ‘P¡>wÉ(Šà:0ñ¨ôôEü®réjRéaYbÈDsðNj…Hi©úÙéÈž»:õã˜æã¹ÁYôPkMGìÇDÎcïÔ%~û ÊøwðŽP¤bljúŸÇ]l8ŸÕÞYwH³hº×qŸX~›Ð–U±~53.§öq÷¯j× •í7ò–O3e|Ê?4·ÙÚZÞò¢L«Ö5ßž¿†áh‡x°²”a~ãГrÕj3§:¾•JZ¾eö^6E»9*wö6dqEˈwvTZ ë¹Lй-¥A7v¢AÓbmƒ¼ÒHA;û#ëc[-„7®Z–ìjù Ûúl2'¼«‰.{λÅç´Ú‚˲*jÞ…Í‚<:è†Þ/8¤VϬ1cpXs›ˆO=ØÒSÌä[š”¹H¾ý¡ñ:æ C[ùpH¿ÖG~îª ×' Tðz£DÒ2ô¥¿|È;ÂÇPIºŠ^™±tJCAçq£~ûôH%9a|¼p ¨ÙÍ%€íùP¹Jñ$úÙ5:”½ÝÑOÒbN7Šp¯ï>k·X™4½: W°(#À '}:¤1†¡ÿÞЦæÀ`ñ:…y1žeÀózRqE Œ@t‘%¿#ÚEý§`á<é¤+““·?ûZ·þ‡zsrŠz ‹ä 6ö}T™nkÒ¹wafé{i» ‘3TÑ×µšÝé±—ï¶‘*¹É¦PåÞ…¥÷ŒÊOJ™cÇåÚãvóM`ú!\­H8pDŸÇEëº!%çíãjÅ Sô¦Ug*Cø'½‰K­£‡­£Ç³ÙxÌÙ‡iÆùx?@Ï gz2 ANú#wQïX}#~Î8>*×)íò G.M4™j80«¯ëíL–V ï„Å´ý$ÄW<ƒQ+#ž{ÑßφC&Vš˜/¼bvÄç`w"{r6^[q“ ÜŽ!»ÿˆõªê×¶+à×Ù'Í탂•«ýS”ÅvŠf(;ìÄŽ3ìÐAŽ­#ôéhñm¸xüûòÄ[ΔEÅ]È­¨ä꥾õίþ»ŸÑø-`<=?ˆ-Ûž(\[Ba ·PF-’=&r;‡Œ_š×0Å¿¼É9çVK¯!^éßôÁÌʼx7€Må+M+·þ.>ßNI!ù¼a軚s dˆFŽ —äyvåö17Íâ>M\H–¹K(ÌÔwàu˜µ±€œ]ßUØHa%FÛe¨ÛÚaœyP÷: SFò x—¿WÀ2Ç£Õ eð¬ZÙrŸ|éwGÿϙȂöDeʘÐÞ]6QLy«Ž|›…J”ÕÜõÅú¿$ú²Í—2‹dJtÇÆRÖ¦y‘xY‰¥.Ë÷ò%£ {‡ËØ:¸z.¤yÍs!Åqa`ƒ¬Bûë0CÄk+\$mJb­’3?€Ï0Àž½.X²h°5È# 7ÏsÎ# × æj'² –;Ž,^¶fÓˆ|6“h;€l´ ù4–}îñ6FuŽàäÒA^(§mmT]+ú“¶Ýë5øx:ðXí£±«ÃPª¼B¸pœØÂÄ(@)«š‡—®ø#I‡6…2ÖÞnpÑÐò™^Ñf·B µI0©nÖ…fºÍ‡®ù5¯Mtª}…,–KÚEŒÁéùùFá"ñJEÙ-ƒ¿ÐĘÔËÉ![©G /‘=øKS´ÑòT‡÷Nܶ¬^ £´|Õê 6Ø1ã7nc¦X—Ý9-=îçõ#³üEî¡fëB•¢Â÷Ìչ½EÆdñœoCÂÙîí2ŠeM›¢4|dW±£)Bà=o5ðÎÙl«äïúdÃy'‹*^MøcŠ™ÈÜSÂÉÇ2ÜiõÕ7O‡ ¿ ˜N žÁ'ëéï'¤¦Ð|à#ÐV©³Lì,´·X¢ÝöY²}nÊ‚ÑüÕ¤ûY3£¾kI>Lý‰ñÓ%õ>=‘.iŸBÖ*X8¤SëÔ ÃA¸œq¼(ð&IС½qm–Õ–#'Oèé³YÇZCYH*ÇK ¶êeC¿Ôwj­é¢úy%¼Üc«Íd C¡,Ô`b5›Ùiƒ•ÏÚ†Ÿ ä<>1®fyÕ“:ÒvC/¢ïþBL쾑Þ/ìŒQ3óRZ5¤åÃ'à÷¼ÃR z¢2Ë­@„¯é{j§ýt‰k¹°YÞS#ë@Ú;ý£Ÿóï¬\ã3Rý~»ŒöÌf"vÔkcVtø8wìF©Ì ej@"ªv„^7ïΩOà8¥#e;ÃÆÅ +Í«¼þÄFBáb¿y®¢J7‹÷¾•-Ñ…ØÌ÷’"wœG¥Ñ ©³éK©9õ­°•§îœPQ˸F ’¦Ãz ©(—N_‚á*ÌÐ)Þú z%ƒ÷•ãæ=å"‡mÛ¡Î ÓåˆûYTÀ­Èl¼`9\®Ú(jɸ긫/›£+?vä@H Zj âù=Èq²wOð™vûm$6g¶Û¥òíd—0åá$/Ö¦J†3ÛôÙ–õ1VxÀ>z ¾]2ñÌ}f"YÑb4†z#zH²L2M¶$öÃßMX®=‚y4€úŸ™¤_ 5§YíNç>l¿Ô:n·†í1™=)àéhñ(“šüPýéËø5”¹æl„ð6™Ó;=Ñ|RûsYÈY(²aÌ܃«ÏA_tIWf­¥¾mr8qëZ…lÀ®VLq!­ÍFç)"ÊòüÜ'j¹ÃˆMê{xFäLh¶ß‡ìâ¿»^@•å6P yÅ“q·“9f˜&·¯²¾@¸²ÚI¡fXMš–'¹t˜odü|-˜L¢Ú”Å=ä—5Ý&†0<°#ðÒÚi«šg³ÚÍ2 Ý—Ò*ÁØZ9!)ÈásÖËÿtå$<¼|­„ßô‡=×)\¿Ó˜,ÎJmNÖáê¸ÝJË=ò%"Ó†‚-‡Ëñ3šCwî»ÄND þšp V|Çd,Á}máøB×éÃû½”ë 25Öõ‘#§‚Ôljl„x‘KŽýœ‚3žt¡5µ±Ÿç;zô®ÓÊ=Óõ*ƒ­œÓêO—à<2úõÚ#±—–3×ßFÊa?wdUR]Ï=Cú©—–¾V|¢xùòØûÁŠüT·ŠºBwìº0³oäc×ü‹ˆ™1M*:Ö:r¹m²¼€4|ÅÞ] 4N¦í«×©…]—Y|™û#Á[Ž¢+e3ǵÃÖ9aìo†¬n#ez¿T0g\B6ð´¥Õ' a7×Òß·l'T’è6:§¡³}‘OÛ„ðqH[>özŠ[“ãv#D„¯+š-$ß—ÅÝÀùQAVåt‹!¶äÝÜ$÷Æ^Œ9ߨ ÕZfß"‹©Ã"¬Q·[ÒïÖ6SelK|vl?›ýsèššÇ/¶]Ìr8cO¨ „”lIr¢‰™W~\FËñ›‘ØøäÓ£°ZFF¥ë¯t°ÌñéD¬Úc=6AàÅBݼ¦7^†«`7XLð;»k{'ö⩞ã{Ýøñ§&q‘a›K~ÝÅ•T¯¶L0E7ç”PèfGìL¸FŸÆÀÕf¿§ÚRRlGÍÍ·í°–aäy³ JŽØÝ˜ «§Î'³Aéí; ¶¶CDËw4!~®íÛxWÅÕ'oŠŒÀ*·^MµÅADì„qZhîwÜñ†–gLSÝÔѼÇoÀî¸}M¤kµÙÚš:9ß{v-ܾ¥÷+àKŸ@Œ·bzíáWyg›Àïó¦(îÉš‘Ý>Ú{t6Ç%Óâ y´ÌÈòFkºäµöüö†¸‘Y*¡¸5ç¹n? ]ô°"e*¡*›MÂÁé`É4œÉ·Ðf¡ ;ƒj~åÚÈznøñåO…¤ÆšÊúPkš§ ´ Ë'&•ŠŠµŒ*…H?rå®+ Á1, ÇG¬é¸alG> òÚíôd"¡6¦¶ÁÒŽU"ÈzH$ßF=éßÑ—Þ‡_£.ƒ:¼c©Ô5|„óã IV"Îz¿?¤¼—ožzË Áð#xቑâc X§¸\Oø\“‰Å3Œtö´´Xª?ü.Ò¥þ œf«\œ]§÷&ó\~o#˜6Cê2€Cùz€ÄRiü©q¶-óm>êl–#•ì(h œßc—WßV¾´¯Sv†_g/!%3i0°×F¢Ta$_6O.Tah&)cõ=uâÜŠ´RõXäJÕúÚ× ­bc…p›qº­Ïü®®¿"Ÿn©.}—‚Öù­µ—¿°èñ—±rzÆ9Þ€_oE)Vd16c¡ÁÔQ•ê½g?9¸× kî”ylÓ}ˆTʯ28Ã÷>ªØWlÁÇA ` §¶T_~f"Â('QL]­uÿƪq#†ý §ù]eO1â$­»/·°MôG5¾üî:¤bær<­‰B¹KlPüSÛÊMå"±UÒ2ؽ£>á ©ï¡(Û;­£qü›-HG·“Ô7Æ–iøÕÈ(ÓÃPa,2c$„;×CÛÚ OcÄ~¢Í'-» ˜AÖüœã­‡9<8}~™¢j1>§Q뙾tÜ#ÅäˆþjïÛõÇèRqSC4Š2õï¸PõĽ X±…¥iVŽãÛ‹$ß–AÂySL¡A™¡![¯œYͧD òÓ‘âœH1h%£1Ùȯ'†WëÞýâë×SU/žÛô-eO¿F-4v´µ³~f-¼m –Ë?'nׯ…á¹ÜÏÒŸÖçñ‘¿?–âÁÁ®„ ˆßǹf^ïF;sM'j9+‚RyZÜßy„*a&Z3µrĤË7ú,/áöûŸº_ÑKg ŠŠ®‰éÌslÀbŒYƾ¶¬6B†/WdA¥aH2lbÏ:Úåµ_Õ¼)ÚFÑþÅ£˜ÔtÄU•Ÿb¾ÖÆ¥Cjì4ÇËüô™ö‹%ë4ÊxUãñéºÄDq•L)jᇥÙå¶&qÆìí,2/}tGßÝæÊ/arafƒC}x `ðrWoŒzáÝÖ¼Ù :º!¨¦yר0ØJ×+q%\#WW±5¿º ¼ðlÎd2Ñ8³¬äd Rc[Ã>À°ï*ÇŽXdjCƒ­C£%¨Ö´tY­çàèbç«s­SíʾY —x"÷ë}Y‘”yŽ|Ñœ'¾…9`5úø=ƒª™Íð@» áºØÒ6T¬u œÁTÊ3¤æ>Aâ¨f©ßLoYóáçBˆä2•9&ø×Ô°·oóu»¾$Ük nIº‡MÞ@_Ï\Œ÷c 4‚<ä+GÏAÈÌÍ^׊Uò‘D­Ò$÷=„â îŒYa×0ä×ÐÄ£9Ž”¥ò7LZ·êœ&ƒÈGƒƒ^®À([—ÝB[å§ŽÁ®u®ÙèûÜc{B Æ j³-ª*Ñ.å!9‰ ÜÎËΰ¢=«µ‚oó¤_Ü8 [ >ߟögá·þœ&§žšÆØóyE_ëSå' Õ_æÖ4)‡—1¼J™Ì”››.º ´ëq5‰Tz¼«¥(úfÿ“ßÐÂgR0?|ÎGgòÚû¨¼ÒnŒa7ŸJHˆE@š©5¾;?Ð1×›£æ–÷¶ïüî‡ Â!¥EɈyJŸÈ2ûòRDÕ{«ê\KÂrWxëQºò\Ydý,ã–|9*žJýª ˜'Á»;ä==Ö´ýì/]*C¶C#‚)øýÇÂXÙ*ìDÂa'mBƒó3=¾ßdðÆÅW43„ƇóþÒiµÐCáv*m0=Æ=Ó¡‹ÔD4Šš"¨žLÊvA’«W#‘†Ê¹æq³I;Ï ÇB¢ ò…ÕxÁ²$’7‘ÖUÕs? |T£ËóƆÞäüLúÊfØÕ”N-vwטCÃp™ÊÑI!R®T9¯‡‹‰¾:²)¬Lh¿"Bzv‡aHR ÕhìTð‚-wÑÅæqcÅ~&–úYôçmgåÛ€Y´! ¦-³Uiµ¼?¹ì¥+¦Sý›‡^Œ’™?TÅ—›ýct†ˆÚLWýp3®Ü¯ðÐâ„þ‰t>U­‚e0ÛÇ?mí¶söŸ„¥Ô2ñ « €PÀÒ %ýžåîU_D «Z¾ú\#Pû…ì=¼cÞeÌM9T2&4Ö‰wnаP%ÿª’ ,ÂñŽÖ‘’Ú?;Ås‰èaêÂÚ›±æ½~¹&NœáëV€Ä—0nF;L‘õï6Ÿüé"CÓÉIƒiÑ3¬G sM0¯hå7÷Õ?¿Ê×gMÓÏŒ’ÜïµÚÑ«öGBÍWª¶tKÑK–RJ¬¬ïõTâÐb1$ðÄ$ÏuíRäiÚƒ®â«¬Þº°ûÙ~Óý¸t.XWšÏqcÙhiÊI‚ªKŸfN+Írî>ZÍ^!HFé^s(Ù\*•`BA=MôòžT¨ÖɶT Ý™êqוÌžíµH“0½œ iŸ‡ÒI&à?`ÓUÂ(ªZ:áå7w0qßÙLî’´—*™éWä{Œc>¹cÃHíRÃmVφôuÍyd’1 ž|^‘&àÐ0ÉZ<¶”6µnÖßgõˆEÕ¬vÖ­´ku©£poºÏzˆâ¦®ŸÕ¼Àÿxäq'pZAÁ’[µ.'fBAá8û~ó RÙ˜z2[LÄ’kˆ_<‰§–ÀÇ´¼pô“‘‰ëždD–JøR¿j-ÎIkÃà溳cT†„¢¯ˆÔéT.æn¼ê+*€Òý•›Ëë½4¢Æ9ô|å¨úânô»ÇBÌ ð,¢ðÙw¸gEƇ¦h±XIº\l3«IHÄ£Yĵܭj´^›8(4ú¡ãQ«g’ Ýä)uWIÔT,òŸÂÙß,¶$_˜ úDý‰JÞsÃC„ª}dnJ¥/ˆsE¨Y\µÊÞc– 7úœ6-‹ô…l GS¨Ü¶ÔY{å.ü9¬Z|sÛýçé¼ò9Kaágª,wâБ¯9i@t}[DI “õÝõ¼Á°/Ò9çà:ß3IÑäêÁqN_Yº¾Ãr2}»Þ¦î#¿¶ï›²,Û¥`¨WïXBŒn;"ÉŠ_TÉU‰±Ë¯Sí9•çØ\<ª¿ä(ÞEc‡ÁŸŸÑßj¢NÎl à‰¬˜°á¢¡ïÐÌw[sµ%«‘À]pì[ëU¢a¨Þš0ÄÁÚFÊÝ|Î2ƒ"n†¦6Ò']ž~”Í·}Ü4”™?ÔRS—ˆÌ•ujiYõŠ‹ÀèˆJïímšY “J~*_‰âø.ßDlW¿×½ÅŠÚ=S‚vH¬Ë©J¹íÍÃgbÀðÁ= h±Û²"IÝ@éâ3±*©C%õ¡œé-0½Ìîê´P¾ŽÉÆs¸…_6…'‡§Ô÷‘ívÚ´ö»ª½”‚Œ‹ãÁzêg>ÿ¹Š24Þm¸zÓþïUð;æiŒÀíÝ ·7—zFŒªKf~Û’Í3=¬Bœ´Nÿ4ªÐ]s3$‚ÇÄçúÑ!Ò³âpHOÄ%fhj8ø\A0³©"=yà¾ö‘öj‘\:¨·»ÃÈl¶Ž¤éN»Ô Ð_En¨3¿º&W6­bùÞ|àù¤šüˆeÛý¦·Á^·wüWÅv5ŒB…ÖsƒÞ@ØuF«Âο&ª@¾k‹”°¶Fê„™åu>y•Ñwï}Ç£ð+àøø¥S˜Å²ªI¯¿ò%Fvn¹Œ‚À™Äm£ùjnwòÆ §—VQt&}œ£tʂЌdí^?_µúÞʰ¬hž®ÏR‹ªŽ1ÇÄFˆÃÌE¥>Fø[ÀFR: ‹Áñ]ì«ÇyQùzðv©¹klHá\B}ȸœ¨àl8ùWg1À襑œµ‹ËŒfˆUb­éÇ>uÆ× Á™ÉÈÀ‰˜;³Ñ*Ái4N$G^3²)wÛ^©jKX»ú<\pä|r5á>Çhµ&Áš{¾BÞŽ#`¤‹V©vãW^–$h^ÊÎNFhYëc9rTɾ˜x´7›P¾ä%wLÔY@|9xYm¼<„¤ÐxH}¸©îòÌ»¾Œ×^`*óÄ“ÅÓ¢lÉ^╘.óê­l›­ÔNÄ¿älpuä,´æYsJ“f­­½¢“9GÒZÙ(õLqz¯¯†þ7™/·âÐú¼¼ß³drt¾#Þ3ˆ×÷¸äMV‘ÇßùºõJµœqkªK—“¤¡¼3WÖnbÒ=:£1æ’¿®P±š•&]uÞHz­_ÂH}ñ·Ó ¨Véàx«¨Ã2ÐfeÛ‹æB(cö±§³,WpK×h>Tî~Y^HV¥a®ú¢tÝûsúJ¼‘ö´¼˜ ýi&¶›r·®5Pšï6˜OÔF´Z_Ä W6=·FÀeÊZ­5œâ*3ó#‡TOuj•\2Êtßê,RÑÀ—d ¯Õ@z•Á‹êXMð+/!o‘¢Qn¸àöˆš"Ö++Ù¹Þ€*õ¥%(o|ˆ\6ÃWÚ]þÕ4mˆåþ”­é¿V %;aø‰D]óu]Ó5|ßÝÐç1BOò;Íí’eÿ¾ý‹L1P'ES\Ίá§ZOñ³¯J› ”Á¤øw.˽šÙö¶°wP †ìM¼‰U}Ó™!£eN¨¼Í?Õ ‘÷Uˆ*r°/ès¼àÕÂmðO*L†ŽhTm‰%ÎÙ«È·ØãvYþ¥ZvR©Õ/«0™B Íæ¨bnÇiëp,öåëÉS¿¡·8[ýÅG’—éé&úü8æÍs$\I^˜LT´ÊeÙ |í§UKï]fßç” Èòüà“]DÇ÷µ”ùŒÁé´PÑû¢:n…¸Rm4”W'Ú|Øb”ñƒúj¶]R(o³ù×ÕïÚ"ýC [ˆ2Uýt¯j4‰+Èü“ ‚Rô#„])›þŽÃå˜ó¢ÃõXz|Ë¿'îô ñ­CsZŒ²g Ìß[ßß.¡ ˆÑóüÝÌc»(„,6„ÏJjð•?Æ%`öä¹"{P-žZÙ­a’¶Í®ÄPÖ³k±ÅÅ6zqÏ"ªÆ¼øµˆàECŠF·çt¯ÝÓ'Q쀑;!doÏ'$Ȱ •e51™‚ÉÃõ‘U•ڽ›“]ØÆ¯qh|G½"+A´.)·³+Ø|ú;)®œ‰Pº­œ‚5ϧVÑ^½3‰Õ0qáð7?“€ÆªlðþéÐ3DR8GHé€ê>{éÖ·b4§HT•­—ÚAlKº\L©ŒÙé#¤Ã§Òm ´0R $Êâ/’ÊûØ~QµÙ&Òm€‰p—ô”ß/cÂg¥SÄzìGâý¸Û1ëÿÑU<»8d Ÿ[ôŒãŠÔ‹›dî—E‰ß#ÍáR¢0‘~•_«Ë¡5e+^m¤FPH*­˜‹ë}(1a¯’ÙMÏzœ4âÆgÎ;J2S{hÊÕ4ÓHÊíA5“`¿Ž8/]­j“^r£ß ÝÂæ;;½ñXeèyr ²QT´ù|S…>é²×(/°9Ú®iÌ‘½ƒrDO^îg̰áX`É#ùµ9–*é“ú©ËE‹%¶‘WGÃIT[4”‚`{³pFNÛ³cœ7ðnTt^xÆ¡;Sªl3óAá=Ð4qJ€ïö«2ކo½’GuÕ’D—Ô>Ñœzï!Œ…p>…Æ©a6¸b+`’êÌÒY±u»§[ŸÖêÚ‰”r6*±À¯òˆ£úïÂlÙ¦§O˜^ŸY »Zyy²^²†×Âi¿ö›¤Åj¿s»y¬H×JÝýµú­ƒÏ““¶þœ~¥Þ:~A]‡>8§²å ¯VG­Í‘ÅbM¶Ÿð|ÓÐñmUw›$â -P™øÌ?!5ÀÜòëu·ú#º/*&×x¦£>ª§–ˆtm†ÏrÃÒÎó\iíˆÌ$þ¸®QaåAïõ+›’ 7Õ¼wê'ŒÖ$szAã÷Þ£íWïݔȲh°M¨ø$þbѤ aÑP¶¬dJJש(1‹&ZQ4äò/Î[Ôµ°TnjýÀd,´óòå\õ\ß›Sf¹‡é1½ƒAk¬. &Ì1!Å‘¥Hò¬ÎVJØ!ý›yG`JôÐ/ͤBRȼIÞ#Þ#0¡†DA~øo„ðÊþÓœ™š½&a]ÌÔàa¥F±ï{ ‰„³Æ ä“­Eç¤~jðüJ[$LÐîÔÀŠjÐf¸ý©ETûxÞÅ·´“}„†¦›tU ‡ÏfÊ´u•ò¹Ô#czÞ—rÜŠ@´‚ÿîãaÇë;Íþ£H)fç™.^¡þçQ+üøëŒGT7HúI LG \yù²äe§D|‚[D x+Ñ0Éѯ<‹õJ_Xù™œkE»pxó„w°ºaùf™Íw:—iß4Y«Ï2?EãB•Ä Ô¡5à ín·BŽgI¨†vàΤö°7$kiåuœ©%¡<È{tô~ ø’ò„&ލ¼Á†ñ%Ò×$¦ V,ñP§ë¾`yzúFâa¥A÷ç³ÅgÄž?œÜ˜ŠL™†Osêxÿa}f†,ÍY¾‡¤>°¶#Å÷~b\žO‚»l6mŠØåõ¨…´`í`¢áW ÂA²ÔmáN“=AÜ@Cwû2Î÷›b!qç¸ RM»ÈvKæ¦xE9wfÁ:QMÒ=1,ZDÓž¥û°jêà”'9Qmüei©ðB°ÔÚ²u_PÍŸÜv®rÜ„ÅXfQ“*Zøõzß$6·m>Y§ÔOSA ¥J®C+8sËvî쀾B¹\GHœüÐ>ÁsL’áŸÍmµ¶pw:êý¼—¤Vq^-o Fx7ºh  %]}ÿ)¤Vh_«Ä¬ƒ[ ^m_]A×aÙL­%„N HÑ7ìäÓÜyÃÔÈ(ãË„f*- 2i¾€.®Ùž^‡ÆèlÂW5×l;‰CP×àÛ_Éä4›,a¹Ò ˦TI¡Ê‹P$ªñ¹¶Æ_—”Ä(q¦ø7¹Ùå@9½ä`|·t‡W8Z{žö™€çÙkM«ò ›¦uÐ^Ù«ÆÖìbÌß¼”Aî¾/7Í=3P^Š_q|Å o¸sÿÐ_- D×î^drýîS”ˆCCª†Ï¡º%•ülÔ§ô¨a|®Â–ý§›àm—’ÞîB²´dk†÷|í µÛ.d¼Ûª9»™Iö=Øú‡¤¤MJ’|íŸuxí²Ÿ‚šÞ'›“¢ ˜†cË9[!ØjH:.ê %¼žâ‹æ#¥µÊ˜),¿ƒ|PYèjýðñGW¦«9xô{‡Zq}¦l·‹¿Ÿ$D"c>͸Ú2èËìÖRCý÷µÁeT#‚ý¤1BâÕ’M b†&ZÑyõØ4ŒKkQÎ;újkJWRHœÔÝœd-".dÔªÑ"„Iå ±dˆ”åh"!w· Ì?ºØ¦ÄË r#ÝN~{ÇÛ®­—PàãI¡³ð‹Õ\Ð_ Ãk¹dBÔòéZ¹6µ‘îþ¬¬^íÿc)q endstream endobj 108 0 obj << /Length1 1805 /Length2 13236 /Length3 0 /Length 14371 /Filter /FlateDecode >> stream xÚ÷PœÛÒ€ ãî|p îîîNp`pÜ5BðàwwÁ5¸»C°àî—-çì}¾ÿ¯º·¨‚÷iﵺWÔäªïÅ,Í€ÒŽà÷l̬ü %M96V++3++;5µ&lü‰Zèâ rtàÿ—…„ Ðü&“4¿*9:äÝìl6n~6~VV;++ß ]ø’¦î €3@ÞÑèŠD-áèäå²²¿åùÏ'€ÎœÀÆÇÇÃô§;@Ìè27u(™‚­öoÍMíŽæ ØëBÐ ZƒÁNü,,̦ö®ÌŽ.VÂôLØ tº¸-´ P6µþÝ35@Óäú—BÃÑìaê¼ ì@æ@×77   à-;@CN âtøËXñ/&À߇`cfûo¸¿½ÿrøÓÙÔÜÜÑÞÉÔÁ ä`°Ù*ÒŠÌ`O0ÀÔÁâCS;WÇ7SwS©Ù›ÁŸ¥›¤ÅÔ¦oþÝŸ«¹ È ìÊì ²û£G–?¼³”ƒ…„£½=ÐìŠôG}’  ùÛ¹{±ü}¹¶Ž>ÿ!Kƒ…åmX¸9±h9€œÝ€r’Û¼‰þ‘YÁ.VVV^v^Ðô4·fù#¦—ðO%Ûâ·ü|œ–omý@–À·?H>®¦î@ØÅ èçóoÅÿÀd˜­@HÿD-ÿâ·ûwyôY߯ ÀúÇÏ¿ ß&ÌÂÑÁÎëó?¯˜ENU\WO’ñï–ÿ«wôø¼çà¼gçb°±±sxÞ>üþ7Žª)èï:þå+ç`éàû«Ü·súOÉîÏÝß BøßXÊŽo“ Ðý3è¬\¬æo¿Øþ?ûŸ.ÿÿ¦ü(ÿ¯ƒþ+’v³³ûSO÷—ÁÿÞÔdçõ·ÅÛäºß¶@Éñmþ¯©ð¯ÕUZ€Üìÿ¯Vlú¶ bVoýž“™•ó/9ÈUä ´PÍ­ÿšš¿äZì›È¨êè úã…yóbeý?º·%3·}{E\ßFóOðm‡þ7¯”ƒ¹£ÅËÆÎÅ 0uq1õBz»ë7âø°½m¥ÐóÏa°0;8‚ß\o=ú,]þ¸Xn.‹Ø¢¿ˆÀ"þñX¤þKPnòÈ#K-KË V<ËDÍ Á@ÅC¶ãÛe¯Îp”±Ì§Þ9¤îˆ¬SwE 'Sh‡¯ï‹‹ÞåZí5~ô_´nŠúÐ$•LèM_gšDÈ!…ø.çºbN‚,§Ÿ[¶‰‡?¾†Ö B}zçýTóôšþÕ.óL'ù5ŒD«fÄ2.¹Ìo<Ç9ÚÈœ)L´<ÉçSÝ0w·ÿéºH¤¼FGmioû5UbÝ¨Ž‚ê¼Vå3RnÙ7íEµ8‘#ˆÕ}vˆ‹²rîR·|Èâá1?¬Z7ÿ¼Ú6ˆ-ÒŠí¼¯|×»=5”£JBÅð–ÌfXÓƒeÛ„­¨2¤Ó(MG%¿w‚rf(Èòˆ°–¾•¦LåR ”ëÚ÷ÏÔ²— qze8 á0p°X?ÐQÌêº2è|v>R…yYt¨D´Ö}Ñ ,`î3%ãјâ‚òñ‡WJõÞ“íGîÐÜDOº¶)L Äï}$ÙLƒ3BšU´®¨,|”ãùa'á·qhÚ÷˜ÄTïÐÕ¯Ï~+{ ù”6·'öö%,1"Õ<)Ì?',­û+[WDR³žš,}”¬ØÝ`üøÅùä|ÉE ŽåüF·!»8C â;ŠÇ‹jÇi·vTê/ F*:®Y4_æDõÛ“/& 2úe¸žã ÄJ|®4<„毨ž¿¡#xÇçÉsH‹Q‰ÆÚf™"Û¸œ²` „*3̲ºì f¾(4xŒ ^Opס Áár“Ã[§™Z³È“CÌ·Ô©n—&ß¶r°“]C™]”dÁj£A5Ljøª\—T6 îÓ$š<XoèºÊˆQÔmSï¡Çõ&SLZŸ´ ¾6|ÑæáÁª´¦ÌN¢$J…×Ì£À(J@’ZeÎ|WWæÈ]öS2÷3é¾ø—ÿ”*SReÀb=éàb8çYÇG ™ ·ñ‹›è£ºÿ¶Ó‹Œ:ÐqcQ2¡½iXÙX’§W,|ÆPô9žs,jØÚ„ߊHÍ*-Ϭ¼ñu¢…²R’áœj ´-kËËË P̧‘/…áãE›©&æqÅr>YÊ&dšKþž–ÑÈÍÍÅÿED#Ã…’½é2 ó ã¥áq{ßOw¼òðÚÏëG ½]/ÚB†(Zhø¼þ#c;›Ñ8€å‹;ΰ\{$—x-6 Ûò!/Œw -Ž™äQ{¥Eô^ñÌF‚Ø“‡ß^gŒ¬”í´ùÏCe‘WèòqÈ&m¨˜cïã°%–ñ‡„§î,\v0;õr¼»9G% (ÈèWK½âKDJ«–\Ë Â]%Cß+9I¹ˆáˆïîfžœÍ r‹´ RšŽüÖzU—‡åh_Ô¥¬W¾@?’·B:;äùZ;>Û9ËÒæÇ GB±?\£}í@¨]S·Ke/TåS&<À¡è· §¹v’9æ¢ B|”_<˜î(Ž$óû-büàcQZ4´^…ço1܉Ò×íT(äðSN’î%nGH¸3à`Ò>"rÑ;G™ëé"a> ÚÔ%Ó0; Å1:Î¥e@Ñ7î2jzuêŸf«¼‹6%Ù!Üðñdö§¸é ÎÃRjï%ÈPG]¿*4ͼJU\4” ©sàá>X“ë-}9âkUú¤V 7–Ä¢=kQ·Y ‰°ÚÍø"¾·…[u¯C@"w~¼B,wí”)v]„mÍÐRèaÒ­îÙÇ$º¸1FϯÆÔ²-ÖaŸ“¡ÙÛ2Zk R•kZ)-4º=Ã\™{ó‰œÕO{=ÕÐ ”ç°×¬^¼_¸óç©Àï3ĸ=t©(¢QKšgÕoOŸS2̲œÕý%ÒèiHj¹Kýuæ %üp”»Bý³ù™n²SS$Ž $u”Õ”M†¹Þ£qd¶&[QörpK)ýÞÄJˆ¾Òr•I3¡VJ&<àñ#>0]ÎM 'ÄQDšÈ yš+µË•¯4.¦<ðjBFÏ¥'˜j.çàôÛ¥âNgßÎÞkþ#b†ä®9ñG^[bæ»»ãªnt_;_LÌ8”’:–²»•4ÚT:vUCAÄM‡Ûéš™;$;ƒ^‰§…À þ¼¤ÍÏ´¾ï§]ƒ½Âpç¸ ÛÃ’E‰d@ÌG©ˆñÑZŽ¥d´‚Â\⤻^Ö\®$²ï%îÂ1 äT8È'§FFv¨ÿÓñ—!zy–´ÉOòì ‡S^†Ìl÷Û´ÀÜÏ´¬{{ŇXJ?ÀüÄ1AVëýýûÒŒöÁ‡.‰sxµ% 8`°®‘›:´"Y6ìÆQðpqAŸø 'ä.Ì—U{ŒÌ^ë ÝÎK‡~…ßÏæµ{eõ—ÐVjVÂÓæí¶/¿Íx{5sS%|"™TqÝŽùa¨)ÚûÓÙ°F{¾c^+haÊ-{·[ܱ¼ß¬uÝÃè -I•yÈаÿ4+ ÔA¿ž»í€vŸ™¾@ÖMæ ¿xGÔ7C³I6to×â¸rÎiéŽÚn|ˆ7#e¿8k±—µ‰`ós~n-3VeÇó]5åý]0äÿixĶVuó†Óñ¾Ðøhï#Æoâ-!¡]LÜhÄËÔ÷ô™¸—Ñ—eCëË£¼wZ\ú-ÆÓh‡È]“ôW@8!ûŸ›?ƒù_Ÿ›Ùf¢1Ìš P% ùžñý†¥M>BÏuT°Þšï5í8䪯„tÊÝ|rª÷iˆŒxs9ê4,œ/^W ÈWTµLymî/›ù©ÂŽà'.öóó£\¼¶¦:ãT/Jjüªãm#'c…7­,—î¢6ÍBc¯ÆŠI¢á·¥=ÊSÍp¡~Ò+º-q?#O<¢~ŽQ7U*6ïÉ8bÉ=!>73# P`ÄMOgw^+³´ÄT þŠÑe Cä°£ˆ>ïÈN뽇ŒPnÄ ƒ›hZ[\ñ)±ñü1r“-)Ýî„€¾žˆý€¸PvÛnõ’—þ ùù5ô°¼Öª5Ö²GĹΣ5<Ÿ¡ûaö|{M; •Í$H ñL¿¥—Âärßç5Ñ ÿ«°Šš<)b »±º.\‡ÂÉmü heªîÂV¼¾íòôT-*ñ‘Ù(³ ܸùªnÄZ5ªÆ:õ™í@·¯{¤˜]/º=•´¼#ßXòŠ/Q›G‚Þæ:O ë@Ôìñ/–ÁŒvu'µ Hý™`[¦ŠlE¼Írö®Nnýò&ÖØP ‚4»±+Éû,Eó”‰J»d’ÓfôdùÃzÃUÌ+Ék6×VûzS8tvXÍy¤òx1uJÆÖ|ìfóÄ'?Ñ·Hýû=Ô³"$ò>~¿!Ž»„˜õ>U?:WŽŸ0ï‘/¯ã!:Ûð]>Zué`DDŽÆO•A1w‘¨äÄìõÖY¨í–8m[W!;w³µñgSÅuÂ44ÞÄrð¸×Õh:Ú?4@ZbѧÚyŒ«ÓñTƒ’~ñ(m×2×Oû™@!KE_ô~ã1ý†#FT¦‘”ÉMSiÓÁŠœ{<ÖÑ Ïi %¦B[£kkޤw6»ëylñKã!'c×A@{{Ä.¿°˜C€Óƒ&ËÜb3îë—™¡‚ÕœeÍ/L¢š!aeÈ/·%3ßNªK½Û¦‹6ðÆ½³·Ы¶ñæBÞgצ;÷²&³&Tø_o8{1Бƣ6°deŒ2XhÁ:¯:Ï“?ŸöÆÜˆ¹Ìú áßñ=)o AG×ÓÌTù-5Qf2 ¬ Íñ<„ í}dñ}h(ÐeÏœÖÁë$÷KþMd;8D«©$(ª1]ùÃV•×’ ¬EX¤lÿ²"l°« Á¨ÀÒ°¹×¡Ða€*¼NM•<³89¿p\£¨¡ŒÊÕ--´FÑON9Ï ôZM˜±ªI‚3V®œSƒjƾ^á'Ì)Î,‚ÍHX6Ð{êøk!(jŒÿ³~µò iS;T@){mŒËü¥dúµÔÿòCþÓüBá‘Ⱦk¿Gq¸(çfÓ¼P©i2ÛV8^V®]äJl\Ucüx¨wÁ’³"{F-;Ž`‘``Œ…B¶ 9ÇËÈ'51…Ů٠?Ò<øK¢þì‹J‹~xÝ,våôêńսÐGÁ3Ñ:vEÎ~£èöÙ"(£hÞ Ž°Î³²”­›BA¯&Ï#‹Ý'ͦ9tžÏ®.e›æ‹Í/w´«æpó¾gÑu³æÛRG*]óÁ_Û…D¤·7ÈÓxÔ_ Œü7^àOÚjjŠ¾Ê° ×{-äó!ó·wŒ#£"õèªÐsõ ‹¦µÎ}(ÓͯÌÙµ:¸³˜Im«ZºJD½]ÆÞ4¶ãn´A¸›%â…âõtdâ9a©…¯£ƒ©v›/Š®µòž»¸|°ØòQ¯®? |F®cIàÑÒd/¦<Ò¨¸yµÝýüaVoRqYå¼0ÿÖK¾\-ž¸Sš‚JPw ÍšVQ…´f‚-ã„ìµOÌAn2œ¿3.†pšo›d…íðËÁ™ô(öS’µ8÷i‘MËÁ±ççia3‘àZ¹òx•0NG”µ«-ùâ³Ûü›º—½h—ä™iIèþð^RÛ–v‘ï4SaN˜Ô õöåZBëÄ¥`åÛi\Ú>˜!âý¬VÑè˜ñw–æ3¤¼+,37O&ø>—Ún¡8oÆÚÿu¸3*mͺïÃüY­zŽ|Ñ@˜aF¦Y:f‘`ÛG@‚h'g®kÀdÊXøÈ;—J³•+eŸ|é@ͬ.³ý:*¬- …èË?`OÕ!ñERH®/™T¢ C{ÆÖ?’ßãæ~@AEV»N¨º]ˆôC3{Ýæ@mÏea_ŽùäJOo„]¼sº)ùº•Á†«Þ·p  ×÷µ¿r€8&®yŸÌŠ“l²–ÓŽ¥«OWšqÂWÎÒ,Ô'Çz E*çS°!Wˆ¾Sº/¯!i•D6~›ø,¤öƒrpÁ‡™¦¡d«Äª5“z‘§åXøÌÕðH d‰ÐÖ¬‹KzÅY)É%Œî•©SB 1GB°ŠYb©A¼¦ËâãÕc ëàdßu_'YÔM#¸LD¢°NÕR¿è&mq…Ùôø+ùÂ:¤¤Y×5ñH:œT‰'ᢠõqó¤Þq_÷©‚Îs<ÛEzôÚ×½=[°h{63_׎‡`ù½¹t€ïKj°; D•›–q̈yqoO%5=¼l×¥@9ÿá©„½l*Ac‡dky.Q·}Â+Ú8Ý#쌤OïR AÐ;£Iˆ¬La4ÙéCévóÞ%eI\‰³µ9(ÙkÂäÙvhcÒ»ÚOPãU°xŸ>(Y}µ—º•qÒ͚ɾÙÎ6h%Üq#ÁgÓt ·ÕVl'gg g¼¶¿KOx±,õ 23ö5y}"N’vÝ“¹m”\šÉôÙñžÈÆktŠ™%â? àŸt47"túüƒl%êf«×FåÚÄlˉä¦ß&2äœCçW§:>Ì£ðÕ‹T6šY˜%Ú½Ikƒ¦%.dßjÀML|XÖx8D÷D¤îp@¼cJ0§þɶõá!–G)µˆtYÐ âš:¶fÿ,`Øœ$Çf8i<迉‡žGðª¾rTÄ`,–j7‡3z ¹Ü}h[›hý.Ž›w!$õ(÷ÞMZTÑ—¨ª-u,E8ßl¹;ó±79<û´á@.è(Þð…- :ó°ÓI§3úIhì´µÜÑ;Ò~ZkŒòÖçu!Üå˜p»Û,NéWà”@êû7I¯Qîdzw<±´ãl)úbèú4uÈ ÌYÉ›>(òo ô‹üÕ´yÑý1 ~XºN켎H5 ÿ‡÷_/Á2Œ> È.æ¯E¡òãå»YK‰Ó­Ôdéøt›L€58a‚9Äšµ1\q]ÕÆ…¤“åbòù¨ÍÓO`ç]hðê=F^Täû~^‡cN=ãQÒ»Ê ³1-uÙe[–Éå­­™À~SŽË |ߍأ±!å¿ÄF”]‰âÕÍ·ÀF+ Ç­i"·z5 {ª,RfÑò†FHج£ØÓ)Ù¸Dó .‹5‡ßo¢;X¹Àu’}Ëþxo£-ó°më*â6ž©9ö¢'¢|ꕌ^¸ˆ¬uóe So`èå° $NŽ€œ&ÓjF®-Q-ä¤bEUn÷ýì^­ã EO;Š/Ž5· vH~ŠËÎ5HÒ—­X÷]Çhì<®)·zQÏ—ˆA*`訯IÁ@* ßc¶>Î ã‘ï¨ã5š¨}V1•LPµ?À†ð¶2D‡%hhº.áZg)ââ i…]…Ðy‰èÙû NÆtÉ儱  wñwi­žÍ}Æâ¨£ˆÝ‘}È={„’2<¯[]^ä7.N0HG ß峤H1e{çBì6dÝå&>/%½·'† ê]Þ/¡‡±C`8‡ô2a =í»µ(«WVÌbNDàr6Ib‡Ë§½ ýÕ¹ Ç+t™¾7ó#€µ¯žó3¬æLŒÉ|ÆiR5Jζã˜QÖ•§æ}ñÌéÏ÷*ˆRá ³ tóKƒc¸¢‰ö廂 ï ûÇ+˜Ç°sÉ¥×Á‘Dš±µ‰ÎµEÙ:¼>¾Í߈=6Î'Ûa;“<êuŽVZ'£mëïlèÉ~ Š7¨Giü\Ðÿ1ÙM¹üSÚÓ0Có{é9íöòí½ö5ƨ Uôê9-YÛ™¨ç„0yýwQ"_Ë5`âÌ4^7’{Œ»÷÷Hk-†ÆÅ¾/,Ÿˆ‹ü?…ü·Ñp»€q…%£XpÖžåhN‡>¦K­ÔÌ÷¤»æÍåÈKù‡Ä·›Õ_®+€»™rjë?¦RïuN(¸¢°êÒñ|¿ƒ úÅ ]FÔES@ÁkêX7PÚ>I‰š1iÁ¬¹p÷¥ÙŸ/¦=ïˆÏŸæÊ›hgú'2klµÉ^=›pis L ô"]Yj©®Õ¶fçòö~œoÞ}¤×…IÁ‡ W½Ï8ƒ9̹§îì)ÀO_¸ì¹ åg2:?ØŸœmg%VéT"tPKN]rw¥q³FªÚ—"\(z[˜äD#^/¯ã[±Ï 5¾/ „òbÊAŠFÌúåô[9T8xÀö0š/™r™Oa‘DL÷}ä!>á.ï\’r4êK$’rN®ýj5@8,Ò6^úm""W)¹AfîìF ˜¿#£ì•©ßL´‹³~ÌãI§Gó´§´òƒäD_¡Î ãàÓ""*uŸUa"ý¡iÀÈÙ6¤ô5í€ëÌ“Ó$Õ%Û‹Ë,„­AÝgosÙÂéóIɨ+§ÅüsH}aä “ý]B©¨šu®Nÿõª˜Ö…P×üßÄ/5v÷ù–=1ÅìãæÊj'L G”Çx®ª˜ÎÆxÏ^—ŠŒ(©g‘8åá«E­/DÏcfm(J¯¿×¤cÃÚz 3:š¸ƒ"ì”ø!‰%øƒúãBEKR½qvïqø’&Y†®¦µ…“¿?›D?¸3Ä.ßÇÛÈů!ÇE¬ + Eg~ÂM ª&ãfåÙñyç/¢ U¸ï¿a¡>™£ßhsöx8º[ÿ΋ºšRºäˆŒG²ÝåÞ6y£sq„È«z†ŸÕ–Í"àPíK·,*§Aóë!¯'Ö ¦¨HNÓ=f`ÇÙ2W±é½ol²ÃÊè­mÊ”)—O‰5›¨;dOßHzøBxš.¶„`ÓÇÐðÚ8å}oÌÚ“/<¶:ôkCÝaÆÃsm Éã.á»2Û“DºdëÏûŒé7£y‘lÝ3N.Íì´Ý%´jQó=| 4Ën‡ôŸïу'G‰!ÒŽÛév»â"çyw?·û|£ž¸½àB1³ô±lµ‹oÁ-tÜ·¼CD%älS&¸òrÿ-•ØQÜdó]Ù{°¶×µ¯;²xy—¶PÐÏ-K¶¾œ1Qû1`t1—x9Ìlañ\½Šö7jç÷ù´ñ´¡OˆÎ’oj[²[öTûŸ6YõXý7©~]ÜŒ;lêÐî"Ý>Ï0’ðÅTmsÂdª”…ò(FŒµÆ>F¶ÛÉ„‘Ží|¾¤ UÍwÔ°m—EÓ<Ô´š‰?kî<õt<þb1FRùÀ¦°ÁÍ%=6¹½ÿµšJ¾¹µÙº“‡çtOk®§.1Û O¿zQ9¿ÆT#“ýò"sŠ*ýAo·ÎE{=ÎÎh¹¼EG¡ÛãŒôÙ²ø”˜Ñ£ùò5ÀbžÃ+A^5Ï Bòì]WEg;-¤TâCƒã¥þ‚GÙÏ{Íå}N‰8ãä:©~cø“DEçD¬/ds ½õ£¥‹¨~8èöp¿èùžVP(Bhcƒøú.Â(^_ùM®Pn)?Õ>ìg+-LP4dÍYB¬>6ŠNÝ1\f¤@\È^Ù¶pÐì Ä(¦e¾ÑM·o^})¿ÙÕÄÞaÖŒ±(@c÷„xÇZ;Æ%s™·¬Qäi^qa^ðêX„shÕã‰ÿÎÊœw/·ˆž×~Ÿ¨Ø9ûî@LÑ@ðEFþ®Ó9‚`« ….ªÞâJØR‡W÷ÇÜKìÒ*W—Ø$c·ªFZû±­ÀW+\‘©a^(¥lÙa§Ä­Ø"*°õHÍF•ÍV T¢¯Ž–+ƒÂÝWî~åVi­6íª2eEÐk4]¬Ä.€Ïý ^n‡–4e.}Û9ùÇô;‘h+ ׺s¼Q?)¤Ï¦Á?„ø'}hfª˜Xäˆjˆœ|¦J½uîÚT “Ÿ°B§ÚÊ£jooð‰ùžÒL>N-OŽ‘µÂ^„AÖ”©X?:äu|Õ6’Ò'ö“|–Õ­¨;~§/Ø+ýŽÅ)˜dEo£‹ô¢ »]ùŠfŒyu²áû$^¢üd6SvÏŸöôóÌ׸šwbGÚæwüæ­ê$+Ûí×LFÁ¨kæšÚpMâݬødrÚdI…’ï6EœrfN=«@*H®6À>÷|ë“DyÕdb$$ MÏáÊ I|Z’Ï6eUôÝ}zÛÂl¦8"Å:‚¬¯VvÙ`ÞàšÄÃùVßuëÒØFvæ¦zyçÚ’˜6õC¦Åôeú¦˜" _±ùdç ¢;†tÍB}‚Zì³Û~kSl$ùUa¿Vqß©ÜþÞrªBzͬš'Ïäf+~Œ©åZŸÑ÷ÄS'Z~S_ÿä×ä¡uÞùl‚æÝ!âÆ”|ÂÐbþΜ$&T³ÔÄØ“OCÏj™ºv¤œö©ª5«ßwnBã_ Ǥ&F!P^6•HÝ\8&ð’.ªT%"ý ãkî 3 ¯ÓðàQˆŒd€¶‡=ÁWþ©=³Ó¿è2˜{ýlLõÊ‚:í `óÉIñä±›YºN.[ý>Jµ¡ á2ü.X8׸C(É<³™.ã¿ÑU¬)sªžŠÁäÔ4Û–A(F2øÎ¹U")œiºl½'CS­Ë—ÛŒ‹èù”á"ƒþú`'ƒæ;U£&¦Í|Âîñ¼8nV³ø9óƒÃG/<·tþA† WôM‘ƒh =Sf²¬5¤Ø,-Þq«N^ÆçQEðÛÑH¹’ëøÄ;ôoü Y`ÇoH@¶ìFéöÆí¨šå¿6¦ƒÕˆ„f®"ï¶Ü¶ˆdY²ìV­U7šf1ã zaðI˜è+R`L$ù“äFÔ ‹u«Qv`°Åô#1î@z2ý4ïè‡ÕÍñ40×:nåk3ÉJé†ؕퟕ'w®]t"—º®$Ã÷ƒº Wxs ß+÷.š8ëÜxoÙ¡Ÿ7€L¹ZsV{BÆÌ8xNÙæ=Ðéqñ»‘g3ô6´¤ã;à«ë2^^n¿ø2é ?Q î—šÌËïØÃšeñ¹>34_ß_Šò¾Ö›î„§ôµiAGâúN‹$/O$+û¡ÌËŒPmN{ø ¸Paý´÷kþêÒŠæ8Dô"½)â°³n[]íI~î¹ 3¥Õ Wì{€¢4A§No'L}è7‡{{,ï­üÆÇ»[ xl_Z0æzCAnX"e÷^_‰‰‘Ëê`e-‡ý…Q*³¸›ª3xæa\ËËÑMÙ>µ¹ÄÉ™3ˆ‚MÃDõ¢úÚ'pX-CäŠ2AÔ@;ìg¿.Û± ÍSÎìÇŽüšôµtAjÕ3âªéôÒaôÎiŸG!ËŒº ݺú‡Èm ¦äåT¡e´£´«´$m1›Ê!Õ‚<ºwè‘]œš̽D÷1þLÙê*¹1‹AÜ¢ýGÉB$·Н‘Ѝž©¿ë=‡Ð©Ja´ˆ]ç™:éî)ÐG­Q'{i*F3ð«!6}6&P¹pi1HòD$ÓØÿ¨j­6Þo†`´2y¾Ò[áVå*%¨ Å•h+ÿ˜jF4Âô(æÌ!9g:#Çô«hvòdVÞ» »yâ¼Îí4z«œªE=K\î¿ÇV¼iVÏ[Þõر÷Jqðt¼ÕMí¯ |i -3ª'û­×#}öE²vM+1„ ‚²~–ô¼Ÿž“J7ŒÃ{€$à?DÃA°5p?4(æ‘kÓ-,wùà/Å=jqQwO¬£×Le´4ÊáÉž9Xßh;°óõ@ÌOÐ(O ³cð‘ù·¼v 9¸“|5KÕãG q+üމ2ê|„˜ÄÌh. #˜oX@Õ¹°ôn…³D\¡+ ­è¾¾v›šé¾Ú‹•OT0„°5ËŠ&­¯æà˜ådZ³á"2 jª]³YЏ©%‰³ÀC‰üsȧýù¡p;¢S­ïTDYgDÏþæþø¥Ü›ãCRvòç7[Abn ¶[ßÖ\MIÇΆyÈœä¿vÊfö.ú´u]“†"Åæ2º¼?ÁeÒÙÇóV¸ævC9&Üœ²"¬x Œqw§QQk¨ø=‰fL,Ž+ŸR ™†ÝEUžÊüóÄç DŸö.fÑZ`ƒ”¨ìýtœÙ5QŽÒ,er˜†Mǘ˜ ôà÷ž,ÐÝëoۅͤ¬¾0%ä::Í”PÌ?Zl C>Ì;F‘Õûæ¡·ú‡ç‰@©†P}Ϧù¶i`i},–ýŽœwœ >áú€ìó™­ºiÎE’Û-ú,"cG·£)ÌnLŽ”–r[V˦š"ÒA"Ò)£o"µ‘Š›tmŠÇ3Å,Ëë4Áǘ'ªÛG½?h C„jüh.sýÞ’¬¯ÝGNVKǽ[Éû°fV…|µÆä¦ò¨›¢te| ×@ C+(Cõsr!Uè¬oDvVTº¹9wé% @öëAOUÂm)Uä]2åÿRÛfä£ Z"k_)á=w»@†¶–0 dÓîªït-CŠ‚—¨)ÓŠžüÈá׳ú(%FÐŒÑé ­¸– {ë_G”9KÞ\'ì…V Ô ™ÝªYô]ÇSä8:Hjq<œ·HßQ¦†£dèÞ C1\Ï]ó{å¼"JÅñ3¼zˆyYàn‰5AbÔŽÈbVˆ'¿`„ʇÛçÏÖãldîBVvœ•^| ô|ú‰¿¨¥8Œ­„þ#ççGŸ‘Ú>yAæoí½À•¬ÛK õNCë'e˜Û Ÿru'¶o?¤p^ä§Mø‹|ÞŒ “e¼qñ«;í8m70¤ B ¥¬Þ²øë†åGWÞý´UÞ_ÙUP¨}„5o„?³Z°ÜØçÊæ±ÐYˆéÞ0C 7þÚl'²î¯KúÙ葺ӗ"øëŽŸ2rÅã½>r+ó¬F[´a›U$ôÚ¡•À-Ô+Ä€ˆ`£–¡w?BT/«íOÐgǺ¸Ó#ú:íÊ8ÅøÂc »àB ]hÛ=*à ý—"–‘·ä0fŒñœ$ÏÙåô«/Û¸wŒ4=àAbâÕ‘sÎM1GÙ[DWYÜAxr+Ooÿ÷?@¥°V"§SÉzu÷ØÃ”€­&íððûýp½@»¿õºI¤àÎŽRËY±F`¸Ç^ˆiÕè³FX=Ów²Û¢Pù¦Í.7³Ã1ƒòsâŒt©1G™éQšíì»+²³L¾{!›­i¾ªŒ)†q/öÕ<¶ úL>Wôü&JÆj0àj4<—;îF7KÁ<‘fú³àhøú§rå%¦ü°J¹är¾JŒí&Þ¸­!ÝãEÕbâ"BÁîö\¿6eä¶ÑdºKÚ54E%s¡9_}ýuDŒçœš}‘ê’håðwCÜðÛêß.(–zÉNùŸ­W±&»àäý•‘.ƒ‘™#¤-ŽˆìZI~¯„ÑZ %ˆäx°՛߶eܳnèµ­3Ë×.ÎQÚ|Ã#ÐJþ•ôqHaÑRį¼Î”ޅСA ˜ïX]aÎ5´ú$&ÌÝÒUHh—‰^ µeÙ©æÅÀàňê¥ô§vêPh„Ĩ -¶¦xDýfìê Ï¡<É Û¼±|\O“–‘>Ïc€çä‚m~›•PºrD½ÁI5[©.$¹[!*bÍIž:É  ¥wJx]ÎÛkÿÿ%*ÓRNtCåU˜jwY ÜÈŽ%Û§äM5ÃP€w~   IÇóǘqã^ ~/O!Œ;ºêO{æ–V×€†Ä®U²Ã9dEæq)ÿ…g ƾ…7EÁEáúŒà,Þpª[QÆò^:E:2•«O¢vÎUXUMfþŠ¢Zˆf,‰KKèè+WFGÕVÒQL‡5¡ü KwIA£w`a.w?M$MïÔSÂýXsIú¯b4kNÖ5†}A²ªßç&¥¢ÕB ÄÐV ¦Š¶ËåQÄL >XK•´ÄöNñˆ »'=ßT—5МÏRƒÓº=ÛNX½·.$æy®1ÞGN}Ì]Œ_Ü6ä¨Ít™>UP˜¨ 8d^Sþ}úš·N¿×>¿Ï¹¦Ä„ƒIñˆg­sƒâY¼¿Oã«ôTÓrïšHÌNxr±“ˆü12müÈìÃG«$n½UJ5èÓ˜“š5u+ 5› £®ˆ'“De_uFö;¾p`ª¦K÷»ý>™&>ð)²'AûÁ´K›6…ýñI‡Ýl»¥»»5ÚE«ÅKí»góÝreŠÈö*ê~ý¤×gõ«u&+™-˜B#f莰ÔiÿϧV¾(ÖÏÃÐ]“T¸ ,‡Ÿk’øì)oêÕÚÕð—™ßÛ6j’ušô˜j(wÚcDäáÈá~µ•oòœé•¤÷pê!™£?_9\¬-m réÇð÷^ÕYMh¼æÿÚ"C›à™ÊUËy®\²"wœ¾ät´ÏQæ'’Ú¯$í.þå«6ñ.Ö©P)ú+(+ Ú³­muÌòª1ض6EŽ^­‡—ú‰üÒ©’—Ÿþ 1ëä{èën0C‰ ûÃd™ØæÙ¼xðlkôLé ‚˜o°89¿|«XS4+bMø-»åCº•%. fP? ›ËV£IÑÉd¥{ >™­|éj‰Så/ÔJiþœ} /XÅØz_˜"g¬iÛJ:" ñq¬¼áND}V½ó—E8Üyq2>c†äºE¨* ™,Ÿ?>Ä8³ ¬L W+Hâ²õIǸD¥8fZx¿½\9f7ÿä9’l²Ò:B ßSø·]˜w@)O<”ögt¥‚вÑ!lYÁ¸ù;%“M9 S Bá´Ž¢¥ï¤¢«ÛÝ2Vö®¾y{±ô°êÐAFÌœTòBçÆïD±x¯ýMÞëúÈcA”r È&ä Īv1¸’ ºÆF›®6d5´¨Svø8 ‘Íy3`iôæ|½xÜm‹1®v®iaVå~uTQ°×KÀp÷L´je¸ïÜ.j›*Ùþb Uø+÷X¸Ožù0ðWN’k›“ªK³Öo*Axmíàù¡]™¾³ø"$É€™u¸¬˜íY¬Üš4;òVÇ”4­1dŒó.Üþùѧ×" Wž*v€ÆþêkÊs]þµYˆž˜ÿ4k endstream endobj 110 0 obj << /Length1 2175 /Length2 15605 /Length3 0 /Length 16912 /Filter /FlateDecode >> stream xÚŒõPÙÖŠ"Á݃oîîîîî¶!èÆÝ=¸{p—àîî®A‚;„ÁíÒG:}þ÷ªî-ª€1uŒµæ\9‰’*½°È(²s¦gf`âˆÊ«©13˜˜X˜˜XàÉÉÕ,m€ÿµÃ“k,Av<ÿˆu;¿ÛÄŒßåAv3+€™ƒ‡™“‡‰ ÀÂÄÄýß@#@ÌØÕÒ ÏÙàÉEAöŽ–Ÿßûü÷_•)5€™››“î_éa[ £¥©±@ÞØù3Ðö½£©± @dj töøŸT|ŸíyÝÜÜŒm@ŽÔt7KçÏ ÐÑhøK2@ÁØøi ðäµÏ–Nÿv¨‚ÌÝŒ€wƒ¥)ÐÎé=ÅÅÎ èxïP•–(Úíþ,÷ï:ÀÀÌÀüw¹ÿdÿUÈÒî_ÉÆ¦¦ [{c;K; €¹¥  (!ÇàìîL0¶3û+ÐØÆ ôžoìjliclòð/êÆ ae€ñ»Âÿès2u´´wvbp²´ùK#ã_eÞYÜÎLdk ´sv‚ÿ‹Ÿ˜¥#ÐôýÜ=ÿs¹Öv 7;¯ÿ"sK;3ó¿d˜¹Ø3ªÛY:¸¥Åþón‚ÿc³:Ø™˜˜¸XY@ÐÝô3ã_ Ô<ìÿr2ÿe~×àãe²˜¿ËúXšßÿÀ{9»ÎŽ.@¯:þÁ33Ì,M&@ K;ø?ÕßÍ@óã÷ûw´tè2½3€é¯Ÿ¿ÿÓŸ03ÇŸð]1£¸†˜²š&í$ÿí¹¼èÙô,¬¬vVN7Àç«([þ‡Å?2¥íÌAî“}?¥ÿvýÏPýg=¨ÿ[Kô>·@ÕŸ1×cbg2}ÿÅüÿyØÿ•òÿoÆÿªòÿ:æÿ—‘„‹Í¿üTÿøÿñÛZÚxü'â}n]œßw@ô¾ vÿ7TøïÅ•šYºØþ_¯´³ñû.ÛYØü}–N–î@3%KgÓÏÿš›ÕÿÚ3K; ÈÉò¯—@ÏÌÄô|ïËejýþz8½ä¿\À÷Ýùߎâv¦ ³¿–Œ…`ìèhìÏô>I,ìì/æ÷m4ºÿkˆŒ v ç÷À»:€9Èþ¯+å`0 ÿeú7â0ŠüAœFÑ?ˆ À(öq¿ÏÛ߈“ À(ñ1%ÿ £ÔÄ `”þƒØŒ2Ð;Ù?è‹ÜôÎEþzç¢ð½sQüq½÷SùƒÞû©þAïU4ÿFÜïÈøz¯iò½k0q46µ¾ÌÿØYÿ¶ÿ{´ÿv¼“0ýýu•ŒfCÖw-f cÇD¼wþ9Ï¿ƒËûü xbþ7dolnéú'ƒý/7ÈåŸßC,þß÷ó?àûéZþ¾S²ú|WÿÏÞïjlÿÀ÷ç„Ñîð,èoÈöûþ‰û‡û™ýíï4\@Î@3“4`~·þƒ:ó;9§?ÒþB@WàŸ–ìïáNï⟄wúÿýaatþìüÇé¼3vvý#áý²]þßõºþ¾kpûYÞëyüøë tüw±ÿÙ>SGÇ÷OпÈ÷Õü/þ×÷tšÂ_™ò[ÕwÜ×ã»ÑïOñÏ“ïk¦QÓ{}wìtyD†I¦®Î Üt¼NíC]ß§ºZ%~ñ:mm€ kKTnò~6ŒW™Ýo‡_™Áš.<®$„# W:ð~qðÖ°†lï–!ÏupáBVÊǸwt¯,_›]ÚW>¨æEx.Ÿ£VÒ (Y Ï3ùºø‘Ú™ž–ý—;ÊÂÍííõŒZýˆpYûªFö4uö§ÈËiÍÝÜ$$ó[Š FÂàîÂiÍä]ca<¼¶¿¸Ñ>½‘==¯›ÖõÓ5߃ßÁZoÙ{ sðÁ”‡&ø}ÀÕã]h•YFVëÕo5}f?ï~à®Ú9T!þÓ¦09£0£‰“|4þ¦ƒM®š»Ý N¯—ZwwUB}Ááòà•í{OÏ0Ü—¨ø1Z#»i›esk°N¡¹î¹1ìEÔœÿëÅVbo㢂ðkCj7þêbú(kœ„¬¯4vh§¶§ðºü“¢roÌF\”Ô­e¨Vm6¯O]Â}6æÕ ¶Öø²KqGûp»ýZœˆtGñv^„*û¹,—Ó^¹3šÉ\*}a‘í—‹î’›vgJFöþW–]癹ѱ”Õ‚¨†,ÁÏ¿Ó#ZL²¶_i¾BùÛ E”BC2¿ð ’æ^–QÇ”y«Ï^ •F™ã@?T`ˆ5:ߣ.˜¥ö•äòWff±O^wøÑâ7þ´âì%?µzKÅÞÁA£ÆŸ Wc›qÇS_Ÿ‘8®½‹keNrŸœkÞÈBšÍ÷ÇaÆí/¨“0PL¡ÿšüõª¯Ø;Æ ‹ä) ‚†ÙÂíî¥'±87§…µ[¨bG¯†ÓsÍØód–™à˜úK3ÃVú¯ë€Hq÷@mʶ‘ò»öp S?~;«.–ÎEè%SÌ£87fÄèçû‰#V“iý°¬ˆ^–:ž˜‰=$ó¥¼²õ“ÈÄý“Ëâ§Rs‹3ònû¼'>ËKbE"*J¯²ØÅºqd·ŠWÕU`&%—ØÛåø,þN=ËôTÏÑD•¿Èb)h>º-þÃàCPoêOâh„Óïo”ÉqU¡ÈàŠ^³i_ú·35Gžî§yÙ7² •l…Fhs5–Ç<7Æ 2M±‰Ã>±¨!Ãç(¹ÂSàÕÔìöžTÆëß©¨d–‹‰~0¨fáþô[ø|›VpXä”ìp}˜úD(¡Ž§„J“ò€2 ìUdP²—Þ1aB-/4y[ÛÒÿJ°õWÈÒC T¿© qÒL—ËöïÚ[eFh³FD` TÉUó”ж鄲”(²;óH”9hYâ[J t<òG^ª¬’,*ÈBz9[‚ô¿ °µ¢)ý׎nü$°>§õCÝiãç\=Ù——ºM|Wø¦n?YbTUõ{'Cž»zÏSÆbÎÄd'q¢Ãi `Lm. ¬J¬Ò$p”GÓDßÏr(Ï­=Ñèí¨°ìLå~ŸÑÖgè>D5µXé ;©/@›½¦|´ÎÉ„«˜»þ\#ôۥ݀4ÿÛå e)‘}ø&2ÿ‡ mæÖƒÛŠ/¹êݳ•¥ŒgŠPjðäFg^ÁTeyDÏ,'e¹ó»Ý¥é1\wÄŸØÜ Ù‰Â÷cs¿·=Gd ÐýÎ.1Û±a§47Ùp K‘ºe(&Öq nÃ)(ØÝé H^AÁ8¸L5×.É'Atýîµx:^0c„„`€ûÒ t¦ o·u¡Œu1íïÇá™Öù€PüeÁΨR.¼„ñfœäw hˆÙã>¸¨ÞèWYè`è¥s«%TO«ÌÝ®9òàZÏ+ÂVq$®ƒ¬ÙùO†(2µóÎ,‰¾»]‡Ž{ã”~üê*Z©ôÜ•øPû#úØH"hGF‘¤§âÕs(o¸¿@œš«@8ËÙˆ6u tòý$ ö[’'¦Ñ‰÷«_•1Í·I³Cu„¸0Ô ÎÒŸâ—_Éh˜ s~ú·ÕúW +` «Ã ²Änq¢ øs+:7é²zGÿbwd‚¼nµZy}Zá‚ÙLÖL#p“ììˆñZ?7ªÃL1sKÂ÷^F’”yódlÎ:’¢ìÒ! þò,}E~ª+ºp+&vHu"<¼–sÓ«ZÎþZÿ59úö‘õØ:kPðYº¨ðYÔ·M YçÍq¤Æ«Ý§W]ç[¼`|æV‘8‘©$E×µ×ïCX…³ŸúµÒ›;Õ“PzªÁå?½˜è™wø£K.T°Þÿ"癇H6’÷ÛÍcžæù„VRðͲ•0“QnûÝ ³ ‘)¢%*p]z5šs6’¬èYm0#JùÆ*H„*Øêó1yŒ %áOCæñþj¤æQ¤w©¯Z% *]âçú¥,rþ'¡`/?SsQL`1Š£šݦ$’à´1…7þrFm–猄Ôb÷ìdÞ$ã Ãjöy ÐäÛd¶Ú·Üáä8|!ëb«‚×4ÔËäöé\§òÔ\”@­<Wü—>„â ã¥T»ªcã“L ‰ÝÕ1Ì?¨Ìž°#ƒ>]ICOò¶û+éã wŽ6^¶b«€w¿&?%·ICÒ%‘Žf~M ¸Ý5É™žy^æò^_“œÎþ±q¡ÇÛ&…o7´ mʾYíN¬5™ËL"ȳ…µÖš²Šíü‰¨ [¼uö.Ù"8Bµ¨ë™‘œ ñŒm~¦N};C„´¢ 8S æp½ñt)Œ2 ‚‹„³to0Ú0r\C§pì9$@B–>;FÅ]m5@ƒ @bV=Q5ƒú öq_›ìgˆua_ÕÍìÀÇe¨ìŸÝÉhú÷*èú3ÒßÔ¬ÝeZY˜dK%šÁ2PñÀ÷î\Td0DÍ@¤’Ú;t—ÿÀö«08öt§[õ2H˜4ÕwÌÜá}kml½ÉùQé,•¨¶.ú2½ HVäqØ Ðçz Ãôhi É9"ù{ñ›÷4U’Q$î}hn‚Èh"‘ÑËÍœò±3EÁJÏgIÎXù%2îõÉ\Ë#ó*kÛ 8z^cF.oºXáøÄ%¿É[Y{ÃcŸC8ûôíCdˆO^#§¯Ò_r%ª¬+ëê¡®º­ºS;ñ¾m®Ð6ÀhñgœÊä5R#©ËïÓR®{·`Êe.µ5.Ç3¹Îz˜{_ Í>ÉÈ1c bÈ7Œbfš”L(÷"\tµš›6ÏÌç86tV#ðYØøF_¤Æ³kWËNó¨î_ꟚÁ …ú°/J9m>ݬc 0^í´ENXkl¸Xìù%½äE.ýDõ¡d³IžIÚz¨î6T”ÞlåÄÍœfôŠ3øàéAoæ8ùÑÉ?¯s‚øSfsvéò>xy¾ç®AõkÙ.e¾§në©IcѼ©µ’ ¬ïPØ æM™ø«Í ¥*ã'¹ÙOYeb%.~Öb¾«ç¥¼)j0(v@ᛦº¸ö{ìe—ìAr¡ÆO à™¥ÒÚT¨‘zYrÔº:j(®aç‡Â‚Ç™C§æ–Ú´`LwoÏ«Q˜=šWg¼²ý‰©PùÉÞG[FV7ða0œ®kþN8íBEi‚FÉÚ’ïNS |?±0iëÔ(ÜyJ1ØjyjÆiSáá9ÓæX™ 9Åí ¯¿´Š i“˜óX¨…—½6Kï/vMƒ–krã+J=•h”ÇËRU—UöÍhˆmÎqVbM0¬FÃÊ0!Ü:] K ?0m~d-2ì¶íç‡d<ÚôS¾ü]ïbþ{'þ’RNáC~ûŽà(†ƒUùe:5üXÌiÆ|mvSž0úð,áŒcþN{…ÔL’(÷’­#”w?§cúµä9OØ•Œãkߪ Iƒ¾†zßjw¥chÙ ¸8½[ÚÚ!b㉤÷-Id˜‚æÍœD©«›>h­ Zã{ £ðCÖç,ÊZµ 7çoŽû=·DWÂôX" Ó~â"-Érö3<·‚3.aBw`»‹¥éÓ䞌¿¼©ŽwS/&™èˆî,‘eÄ2ðWÂéØSÝV×/«·p¼§Ä¶6Û­&ÌŠ*ÔXšÌvIö1µï&yV‰‰n7š¢`ÿå /VŽŠ[Øfë°x{ i¶æ¾·?ïâ7iŽŸÑIZ”zfG²¿|X¢p½”…©ÝðdNœa´¶b°,Y]¢TÐY!Ô2ØãM¼‰|OøŽYžz8qM„}BrÒñŠä´9ŸQ)!Œxˆ§.;!ºâK‰ÚÀ±.¹,¢¤ÁÉn$é’ß&ä<|$OгpÆ©MÖ¡~\§d¼qnË"p‰ŒuÆØ€2¬#B€nˆ¦±]Â]áe›ƒU'™tøÊ ;®ä ²AâÛKIH|ZáfÆ@Y$ßá­fZ8ä®->[ÉV×h &n’R"æãâs½*àT¥t¢ªÚ¨ˆ´ZsÔâ‚ëúwàQc1œJ»µ« ™w•åÝ“ƒý¯Nxew°YGЮԣrx}º«çåaæ`Ð/`ø÷K¶X£Òá `™É]Z›`…eµ±û/,"Ä>šíIl¸á<ðvßHù}QÑßù_¾%Ý0Í‘:fà;eN©Š~;€àï›óC|Ò]xZ0à#¡/f&«a—Kú!†&M/ðŠ½˜$ýŒ9ÌìSº ÷OŠtéXÈOµ€éA‹˜Í&Sšv4pÚÒ*¬u M;³PyŸim—t%ÈæÀ*׌CSAC ykvÐhs 4§>hÎ<7Ògó\²O`áy¥ñt2œ.5·2m×ÂzTBœ £Y2-gÅÈ8\ÑȺåpj瘅ŲôÑyŽŠQw@h×›W´xLߨ‘cwQë)X³…¢C42 Lûö‹òÙm£ÒC#C‘ê-¢Ï% —Ç\ˆ$¼£ WÓÃøÝ4Ýròw•Ç™&ÝIÅò²¸©Æ^& ÙLé»Yõ`P ¾Û¢ákBïb´w¼J—¡ Ú¯ ÊÇ2”pÕÇ%ô’†ÞÌš¾å’šÅHd´®á¦N£á™U(Á·‚×$öÂêRJ.7ùprZq×(øˆ1Ò`È–ùò‹2¿íDãbwlÞimÄ£z[Ļک!`ôÕÅE©‰Ó–¥ƒÝžŽÝai&ëA_pf‚ª¨ÖbhôTŒÕà';Syh~Ëi|]¯|„ªÎ¡„Ü‘á1µ*g-4gWHhäaãUDs%åóéäæï^3N˜ÿ8â…ùø(?ÞÑtKá#w`çòµØïcÛZކîÄ-C¾aˆÉI)™ómEó C“ÏèÒð|¯éìsµ×^_¦ëÙÝzË&ö„çÒï0¾G„I°Ë”‘™‚ 0î GèH³L›ÒÇÒÈ<ŽgÊ—ò4Îúš)û–æ 6v™ ³Ñnüˆ• Eš5iuDG‡2#³OTüáN™êýcqÚ§–zÚ ÷UƒkÙ§’ïè}8¿Â. a§ïͤÁi‘ýëÅ<Ò*‘¶©Ó¿t˜Ž›w\Ôª2¾Û5ŒÛ—Øûî8F6Rl©ÉãiLk( û 4+ÎCÐÿÒÒ“Ùn:ÃàÝÞÿP[„®Å9FUç'Í-èÚ¦·“ÖKžYz¯mÜh´"Ùq^È?wVB QÈîC†W&¬0Gã)è žûV»&T©åZ—¿âãýnl¾¤o9vÒœ%VÚgs'µ²‹9Â%ù·d^}¥¯¿œu‚ö¹š$ˆ#^Mò8)ØÛ¡Ñ;ˆœ›m= S'=k7ï©ÚŒ"iÖkä˜Õ@1Û=T€gè…9AQœ†&ÇÜ ‡è  ¶¬>Œ«µ Ù2Y”#v{WëæI|>þ1nýÑ@7—{©=sÏ}Ï5¸`¯¦bþA¿‡tÄÛ¿&#¯"«…<Àä+bÖO]>&}ÉF1M|ƒØÓz‘ôëÕ6ôvAɳK«¥è ±àd•õ_ É¥О]s`„CÒ`û¼}ò¥áã˜ÓXÅ弜°Cåò>žÄÑI:éçSŒŽ¶§2 ¨fÄò“Üd8öe!x†éSÖá}ªsùùi*¯<ìöD ŠÍé¼ !âm#l?«¹C£W>À:dõU|ä`B¼LßÍ«jÄõøcí~Lªl·< x—bAWòþ'/^*Æc¡à¤öêÉ~ãŸç%ªÑÍ:¶.ø7^OúÅ~ùw§ÙpÛËëV³´GZâe)›^öc8)¿S¶êÅdj²^ ’Åœù'ÙÔ/|1U>´ói1Ï_Ãó³È×X$à•§a·¥QÛØthªñ‚3ލ¾=n3ÕDûÄÍø|uÝ0æ{’HEàÒn‰©½>ч¶'Ú3eÍpRÖ‰›QÉ‹@“ Å=Ò/7ÂàÉ­BÚ{ÜšäZÁ—A[ŸµÔNV'1¿Ý~«ªæMš3ƒÐéd!&öw66tHvß~âp)ôrû®J=au럓L­­3§RpÑ¶Š¸øí©¦%4•§IG,ë·¢9ªz‡Åœò5qû•…RV›,Òµçyæ¤Ï~ZáÇì)ú{‹#Cm¾õ /PýYb=;Ô¦dÍ2[YÚwÒ~3aUÕæêC[MøJÐYpî¾þñË–ò”*!ÜÒè.üÀÄõ¯0ï­´*WÙ $Ÿ“f;Ͷ[„KTq/ p»á@¡¦¬;H²,„›J—‚‡<7J“oÇôöe>Ï„—zènõ¯âUçòC?W”÷€m¯C kºrYfç†c-&t(5Õâɼ¢x|·åçúÀŸMÄo[š.‡eÝÍÐÍÚ0kVëÖÑz£ƒºŽ‚Ü’ÍcAŸàMàÿ+ÝŽÛÆÝ.Ü®hiÈœ”dû4s`aG”)1¿Aªö`Y=~“~Ü©”?p¾â§m§§Ÿýú¦øQPh†˜ûëH&W•E‰æ#÷ðöø %™Ö ’ÅÌea@«æ¤\Š=ù(¢ÿ—#Â'ÞcòrÜ•+¾T† "+Aù¼P3g!š+ý=ƒ ±OO¸®AĹ·[MÀñÉ>–n e´µY`T÷ ‡!”ú¶™òHÉH¸GÑYÁ=–Y¤â•§J»c€ Ìd:ÇO àv¯^G¤PÒ\á”r0á›jüÉÇ0rb#n¹x"¦|<]…ü~Çuà›³Žo`#õ*!åo“ífP<„£09[–®|÷‡æft—U°j;n¢¢òOÜÉ&¡:å!¨jàH²–_o²&!ùËZÅX˜îf~ïÕPÆ~k˜‚;úú“ÍŸý’>.ª^eµíRÏE´!áµläHê#‚µwç gF$_Xäò­yÖHÿ#†Áíó¹‰Ì^ç±Ð~‡»Dä‹çþZW¿õ¨È11$V'äi–e5t ìÝT%nô‹VeóÜ‘Y¼Îg„ˆ.â³j]¼Ì"ÞFR‰Ó*Õ€2Öã­‡š¢u†õÍ+‚\Å 9<½´¢›q˜žnxè”3§¶„| Iû+ÿéU»¶~F­lÁ‹‡§¸ÛRßÌÓŽ *1“Ø«™‘²ñíåBr|éLªŠ–vº;AŒÎý‰1ؼ#ò±¦<†ýú£M!tŠÒáÑæîí6†!dòžËÎA.+ vNkÇ|·î¦.—S@aÞ÷ÏsxÏ…ù¦ÛœÔ½ÞÚAßtV5'çpªo¾‚2”§°'?æŠð¯L„ð–˜Ò«jZ Î E•7uQ`¡7Ó=óŽI,P«˜DÓd3ž9…W r2¤ ã'lçF¤É}ð^³.k-òG5–—aúyà '\âVHR|"Š‘Eöݽ³¶…µÎsp´•Þ‡‹S /½l¬•ÖôB!ÖöqÕÊ0!/—‹$ &n¡o^D!k1‡×h¢–S¬î<÷œZûd¢ÈºäyéðçÈK a‹.à9’€ÃûµKŸmÌ×·H«<,°®€J8¾‰7ÌÛ3ÜEòóÆ,È(Rè²þƯÄp&Gª^ÖM³}ŸÖÆ$Üõä-sýÛ¾°B æžTv-D£êç1z—Ì“ØÎdÝ/?®·ÃµòºÝÑ™]¾b2f¥?–ܵz “„ëñé˜àï ¸‹ÚpçÈNY¿A”…°ÆM,Bmæi[ †‘tYpžOVŸ¨[9Ù৬ɤ \`b†ôÉmÐNã&t楶ÛP‡0ƒ_ "m[Ú‡èw®ej²«h’ ËgFP~ˆa@¡ëúvÃÉ,–T°,^©M\–8ãY§1*#mÍk÷¨Çû߬˜;ÌÜßW0L4ŽöZ¯¤´Q5"røâY‰¿#´ÍŽuÑ&Õš}‚ž«9±jçíZŽ{üÈ׬P¬Ì±*>L'»/$ƒ}w„[WÀWgÙ§7ïÆ¸1ö©¥-zZ<­øFJV„çc±¼5–$£Ý›×1øÀsoqóî¹iе` bLZP çñs¼?òËòíl”õ¹yÞ!œ¸2ݡën×ñŽÈïø.ÒÖÌI2:T•Øú⛡A¥<ÏÁ ÙV¤Ë­ôÜÚpyž~Gµ¹M¶B&+UutJÑÒÁ"ÍE’ #®cãs@“&¶Gʇ5Í:¾Z„ö“AvZða†Ú¿¼aÏáØlÜ úD ÐKœÔªmöõÄFUrO‡<° âlð%¾P ÉfiÄyFƒjÓith¶ƒ¾~U௼1lM(y$VË^Rî•2— ƒ[F=Ü^ó ñ“öB@_D5u×tÒ‹°võÁ›ÒÂÝSV]²ŸV™ƒL¾‹G¨ñ-ŽÊ0ƒE©|ÔØ~QeÇ¡6ã¯óþò% c_Z]€JÖ(‡ëB^d‚³öÛã ˜U{Vo<¬º±f,+œQ?ÁT± UAiÙoVs.´Ê7 ÖUÿ»íxì+³ínS <õf_¾š1ôʺ¡ "Ïš³XΣ)ahøLTujW¢´ ø¹"’ ö³áp4 ¡ø$VgÅÒ*Ãu¶öÈ• ºâªÝü™¯qmaÑõ¥ú¸h­ñ9éèéÜ4¹v”,2,ïè«S]#KçUÝ 0íF6à¥ÖŠq=¡êišÜY£Ò¿ð§wyˆZ ÁÙ‰2ZìK²®á ÇÝÈíQtžm¶w?6(5­*­-9àÖ-_6fîtX\'©Ò7=]4b\EAØÁšöŒaVÃL6õ<¤|z|xkóUv¶.äKÆC­„RÚn´æ-éWp€û¯ª´ÎÈŠÝÅ…ViÀ—X¥|:odóQòñh#ᱯĹy…Â4Ðç­ÔGãÓÖ;sõ3âÙýº8ê#.[ÍÛ„Áöúúõâd>/X"} “V.œ&Öu\Ü—…Yö§áAäxÇ€˜ b˜Ña}í~H|³ÁÙx2¸á¡/¡RÖàœüø‹Í l×X”ÄLƒ/ÔŠ×]´ïé·žr¯¥r6QhLKÔ}¥žsjöÍ8µ}ÔPy_b.?sc•žy™ÖDz†/ß³ ñ­ÜEí¢~?šûh7_=¼a1áº;@¢ÒèÖÙW¹ZúžcšÁ9Cèlɹü{Ú½Ñ3Ís[ô`=DºØÉë4'ÇÒ6ÒZèï ¸º¤qR±Œž€‘®O]2jÉá2žÏ¹q™Ó{ä³÷Åš¾î2å‘Í1öÔ»³eð>ƒ:ÝX„`Ÿ ù˜•–­jPеX <™Ye€ûcãÀ-ö“»š³‡åHg ©ÿ‚[”®7UÌìüyÊ:íäL‘‚ão6$ïÎÒ¯BSÊêÿû›õ›Â«¦@I°& Ìh¯¥IW££h%ýRÓq#à»ÀޤQð”g&•Ý~²€ž®²Cä~nT †ïÃëÊ×OŒóŽé"kDµ7¾4¡¥àDÇ¢52<»œ¾î€+×­.€á„ÉD#ÒïìÏhä^ß^cdR„9ì‘“_|&‹-/¥qìÌ›«ÙŸ\:^ІÊjqD ±ÔÆv>ouk¡E·²éÍÔá„d°FŠ&à~›Kx‹RQY”¥l•Ä¢Lž Å—`o¬Ÿ¾î„'0DÂ(WàÌ㩎¦K~×Nfˆ›ƒD'¼NåSÏ?W8ô“Æ•A>*Ì罓-ëRÓsµv±1€oå•åj‘8ùAÑ)›Bém ŸÍeǦMÊ ¶,^ñ2îÔðhí±Öþø%*uYúu,Ƚóö›Q‚uÀéÙ¶GhA¾K·_D±™;KF—ÜÃ%_ÜÇÞHdK\q³&%2ÃVz<{ƒÔfåý#*ÈIµ=”vT—5÷ð‰…S¥ËÜO3VÁ)õðö'"ÿçOW ðl›¼¯r þÑÄv¥¯ì0A(?CÕÒD‹M>LÏc‰Jäp CÅ{S¢@_ÃöM¡”Õyw~°ï®‘'ô::Ž=?$JP§È}º·&.×|x\‡Í0Šþ–%E©I}»Ç瀧ÕÉ(%Œ©  ½û¥-vi‡qÒ^FséK,;ûéëýΔà%pIau¦Ànÿ{ Ò@÷Öz4{XO|½âõöƒÞãg#w&Ua(™É<.ŸÕN\­E¤çjË6¯úp,$ê³F!7]kâo£µ{óàs>²ý¥òÐÁë· dù]-¹Œ†0Õ¾EýSCûÁ}ÄÓŽx<*2X 9ùBÉgºúU]Oéà‹êEÜLÖl7lmÓˆ,6…«Hö³¹8ug„̰/GŸ“&»Ðo‚• ¥ŸCýÆDó‘KRqà~ÅSìA„Jº´”5sDá>»ž¼GÖ¸-ëã“ã¥+Ó$(uá`¬œ*葆— m”`Qgº&¦³º!õW ‚O(ýo> Ç(Ö& œ^sãç¾Ü `Žé:¥ô`™ÞDúDÞã\mBþ(üóa’!¤µ‹JH>nì,™hÞ —t—¡†ù¦³úŸoëÒƒéøÕ›_ã9Àùx>2DZ5pT«þȰ0Ý`/7*IbÈ˃m^ó.Ggõ¤´r$`yпêE¦±Ý-ÀV%¶˜IôÝyÆV®|"³+>\TÝŒ>i¯KÈÃÑ>g²,ç—&Œ[„­>™E„#,‘¦gíxRçQ#÷™&ãiÞ·³wÒ,>®m%‘Åè(EÆ8Ð÷ <<^ë[j1ïEPW{ž (o˜|³¼ésí(ñ¹Þö95G&Ù-eÎæ²®:3ÔYÍc6uº<¾¯³¢|Ø”~ž!Ëg{ì¼Qüº×SÅ·!Ÿ²-Ó¶ì&ÝÃc”¾ì`—fþÀy@{)äüV!à&mã S±5þ •À¡/î ÙžæŒ ÎFç௴íº68 k€áÜMÐÕ[6ÛÃ_ɳʼnµ¡Ã‹ew+ õî1I"îoøU4Ó-¹¯Ü*†°àYøûŒ³suÓ|×l”IP˜l: Ƶ­³ÏÄÔã}ôëZä•îÔ»>úõfO¢—7BS¤Å}«´nòt¨—¨Y„]{žÕÜk€ŒCüL¡ñY›Ä`ÀÛäê$í6Ææ©dB²‰e5€%ÕX?f,uÛï¯&É5J­;v½ƒö.Ém:/Ç”Iâ•Yñä!rÿt<å—áµðiœjfÿ&K$gn\zá’ UeóïÜ–%âšE’rÁ6 Ž^h½æ;õÎ+ a1 ÂŠ ö9?ûõ )øÐ«´ojš‡›¦ŒÖgceö#“oÇÍÏXeg×ér!ö¤ã!“»8RÉÄFø•ÛE:M®»¯ãæûß¹Ð,~1.¯ôà Ƕý,⩤Ô(Ü-Zš²‚=þ‚íÑ쯤Øc©–ä=jÚ+]ú\|2W_3ÒN4nÔ4Õ°dßvUÀÑOñeýð(¾]„6Y]“‡UýMÁŸÛv!n”X:òLd çù{ÞXøÊY‹XÖF"ý,¶Ò÷®ÜÇÒœQmªÊЖù"zÜ1p·ž§& ôù¾íªõÃaUåo^ߢšÁ&³Ê•ìÏd[‡ZúMñD=Ь:–õWÌšüŒ|ßÀ1 Æù7뺠’kÞPë„&³Ú…8ìó0ïåuóa8'Ýðp‹AfÌŸÔás•máã)”¿NSE¯¡÷ÑÌG»Žò´4}bcšð!B—¿dD”ÀÈZE0#4[ÝÜ—ö–éú¤hÁá‘g°«â³å…ö¦gUG——.6pQ×êvÌŠSd‚X:õ¶ }ßÐ0õÍ—úéxY!TèÐ÷ŸkS)g¶ÇÊïYCà†ñéÐâmè›ê#¾÷·[‘‹ñ̉1p ð†+» ÛxµU•"cG{©z!-¸>ÀùŸì´*.à6§È*„Õ­’¡o{p02ÒÔ-®û†h·)8ƒ^A8<9F¤ uÑÇÖ  eÎzu¦«Ctb+ãwƒ‹j‰™­^ó&••E£|½lõÇ$Í‚~£]_3©à}UŸê ÙXè šGÕ°Cìd¸Ôª4%‰A¶5ú‚Z?ëñÒÝa CìC|ýÜÞª)sE'é!y%ÇñKP!¦™ºë A²ý¸Ç»ö×dÉ·j »Z¨e¸fšëö…ÿs¡RH.r¼çîì8êm°ÛìWÎ.¤ëi“Sú¦3B¬À­%B A÷‚D!AFþ#F><ÄWÊ¡`¥&*®ßìmÿÔwŠ =¡6wàN „n“ezäMJ¥–Óö¥ÇU:&ŸÝ­›º„Ñ’¼¯¿#òŽŒê#ÔZÁ„³I. Vt§viH<~EωaãùÅh¿Ê‰z¨ífXâ Û>AiýHÂYCi"ÉhÓ¢sÚü¢³Hâ½ò.Þ»ha…Ï.£Z‡ß.×d~Š?ÎáR1%«Š:ì”öì}½Š¾©;=߃½“ú$TxÄž\š[§µçw;¾!2Á'U‹]÷BÕxZpŒºóâ+³¢ÚrÇ_çÊ!ÃLª­ÿÁHþCíXÇx¤–WR"4·ôp†Ä·ÄÂ-ð‰¹Õ%«è¹^ЖF’;´Ã Wü0f rÍ‚¹{-rXdÓA’¿U*(·o¤UòNªžŒóŸÎƒc¸zã犉é~) ;7°õX±u”ˆ® ->eíœ5‚gÜÏñnÀT.,ˆµ¥*°-´?¿/á)h#*½ñ{áiÀ®ê©øb”E¤}ìh.ðèÙ|ÜÌûµù;3J´v=ðm¨)™„€K6+1«-Mt¬@\­œ‚b]÷@°ü¸ŒÌ;É?«ò6\Å4é°!Ç&›æÜ>ÿ ÑDÒ㈱ÛêçG›R™S/hâû”OƒHÀ06E·(’qÈ"ânŒ¬V—>oÏ aNÄÍVågG+SÙPuFVï® ‹«|pZ)K#p8Æ Atô?¹ at÷ÑènT=Nô„£Z”jVø¾÷¤ž` d?Ì÷êcÁéG‡·ñH¬¢°zW‘ÕSèãÉRh|ÛÌí#þ-•š‡5Pkhèbi(Jˆ}hke#^&Qê;Üýc¾$‰E:¾"\™EZ}¼Ñ‚€6E þQŸzKVŒ\×öáRÖu` °Ë„§'úÐÔ/‚€n/˜­æ–ç¶üí£Ô|ûÂïá×~(ª¼•2"ø \ÀŒ¤uêj¢Á¡d 0²jO&«Š1 /pG2‰Æ&–ýq¢à— k«oB J7|mrŸÇ§­QïX«á}•Ô€Æ;•ºX •Içº5j—7Zd"¯°ƒFfÂé„w†C{9ýÊ…tTŒ©‰M±i?¾èöÂ^Qì0ä§1zͱ3‡®Û>­=zã, †«•ÑrüxAàMX𶑪® c$äþ _ß|ÊÄëñ[ ¨úJâ4a$çùi~¾+à$¹ñóâÝ€¢eãï,êÊ“NÝ÷0M?GÀÿ°¥°aÿCmàTèjÕçÀk1?‰Á„æ—ü•Ú‘ÄX~¿ÐÎÆëIf/¥ô)5|áIÓfA÷„£q»0¦½ÆªêíÛiݪkÒ@ÙF²µDý$§ÚUŸõfnÙ$šäò;Ë”5‰¦@®£ âÞdA“Û" ôÃn ŠÈ4@«ú¬ãYËËëxžJMÃ(ŒÙp}uVYÛ¬a–gÒâ:²‡¨µB2$0†•ÑÓÁT®l [Óá¾ãÇ/C¬ÞËRÊd0ýŠ£lhFYZòq„ŸMxÏ ám'fîYûk@! ²,ÛÜïΤ‰øê ™ñ·†VË8üW¼ì¢¢ÜJò9Gƒœe;37rH »sòþK†ˆ1*Ó¯-vä ÇdwÝ0zí¡Ñê~ˆl˜B“ý¥¨†ŠA±PCÉOË׸‚ôZ<»®þ¦ß”ÖG‡å)Õ™÷¢ò·™_"¥’ŸT‚œ,–w8Etd J…ÁÅø$Züší5°lÒø6Ï(ñÂsà±£äv¾@GìõÆ,~}„¶”ÛxͲ½ÑÒDÕÉå7E_pÌ®­Cj9°›æŽ1¼á•öl/™‡ë#¦ca¹ü2ÈÖr…?HÆq9¿PëâìÞÖʤ…b ”gzikv¬Ê—cÏz„ªgñ¥Äï°ßÁ›åàÜ-&åêI>Ÿ;¨ëZr`×øIfùо6kn^šÙC pþ©yN0Dí›—ÐòñB[Ü”R!4£$¸ªeËbÄ[™“ƒ|­ "\ƒw½œÍZšû1ÞËdœuÏz¯3váR‹7F૨ÈIhx/R40 öЍ±è/{ûI‡ Q•j¬À:é'y¯ý0Q¶Z¦qñJü±°¨bÅPZ ýk€ä©dÀè:ÑDmdoæµüCµúÑŒÏTöÕ›ox~ׯO¹8‚ºgéaÔæ4iiÙ¨_¡tk5ºó`Š"gìüfí©¦:ýö㢹'É=g7ÜÆ½l²‘_–˜&¦ôᘣ¿°=”3ç!Ä"­ûv>¯CܘŽuùƒ> stream xÚí[[S¹~÷¯Ðc¨S±Fw©*µU@n솄vC6Ńc&àcÛd“ýõûukì1`Øsž¶‚eÔêË×­–äQ”(„¦^X'’N¨B$#þtÊ å’PA¨ˆ¯(tá„VB×ÑZhôi4 O{aªIËC‹&)´[àË K-^8kÑ!|ˆ[ˆ¾¢!^Ä#ñe•pJ¤…ƒ&E€š…P Ê9¨¨b:饔U©ã ªñèG“õJàO9 v‘L0ƒOVxŒÑ£ö@k¯ñíƒð KÚ02莂MJi(‰oð 0WCH°°ÞzøŸ4¬ªjç4,°MÚG؉þ ]'à9xOk’5PJ^D ¢€*“Ú$"ÐSÔO€‚¦X#@Š ÖVÓI…°ÄÀÝÀJ(E¦ª"Šä`2ìM0ÍC¯¼“…±ðDPW:!é!jÓÎPß äYhÄ¡Z`pR 0,!ZÂÐd!MÉ+D9 … "Eï;U ZØH‚5t&yì‚' ,y•ÚÏu…¥À¡&‡GŠÁÂÁ‡ÊøƒôÔ¾£ˆAH âè¡2)ŽA¤w¡(4¸FAMÞVšÆ*–ã©7P;IPôñÑP»÷gÏ„<òÕøx,äsñdZögƒñ¨«¶ÄO?užìf“ñÙ5·m­%Ö™øU9› FçâhÖ›Ìʳè¯?-†Ì%/K±=í€Á#)T™l{4ƒÏGÊ\$ò´³$Ž»;òèúÓŒŸß F_:rg<9+'ÌXÊ×rOî~Tx(NI“þ hÛ¥)ƒÙß5’¥ê"y­»Úm‹Û½\iÑÀâäØÉ]ØQ¸.&Ôèz8<]G—˜®è$·; O]{Ž&¸®Cn["| _°1/i P•ãe²ªŽ RK®GÊ*Us¢u)ב²¬Ÿ×=e˜ª(»PÒäÁdÜ?*/âàùK!Ëï³¶ÇZât;@\±I€Ôh8u?Ô`ÜlE€‡äW ²4èžåVÂÀÝ­·¼am…;Ãàˆøb‘ø@DÒF.n±Öæcü¡†Ú¶¡^?ÌPoîçú%:r½Ž®kÀnëÓ¸‰Îš¹ÐŒlFüãÐI+è„¢ï‰Nl£ãC×ýà”°ŒÈ£'F0mD‚º"Á· ú~ˆ,ÑåT¡»Ñ¥Ç ²f•h"…‰‡ÔJì„ð@¤î;¡;N©®.Ò݄ڙ®j÷€tM‚z\‘¨ÆŽˆMG¾í]–쉬Ë~o6h]:øW×O3ÕK§R°W‡O›N ƒÚ*í]Âu;‚·…ØN¦³Ý‹Þ”Ž|Ók<¼œÍ.¦tc?¾õÇg´OÕ¤ Bâ=¥ÃYåÃÖÐ.í´aí||1øü¹„ÓI±ÉË^ò dztÖS 6:„n<í|t8?ÿûùŸ}þEøÿ0æ„1Ù®‘ ôH-¦è"è£êÒ/Kõ  ÊTX$©T`Nô„ã‘©P(}RÝÀçx|Iô††G"Ìõˆƒ~܈T'Šh»¡Œ£<7g-¸ Öœ²¨îu\U«ž1­3Sʳj^סK?]©jDn­Æq«/ü¢%¹Ø5ó‘ êLaÙn—6foÆ*×sÉZ]ã錶Piö˜2ói–Á·9ç–¯ Çð+ö¶ù>°…Žp lQ¦3‘((&‚g«4YSƒsÍã+ šq‡;õ\B¦ä2%âÓlñŠ%UHPÌ4QiÚ”[¬/øS?åÞº­9†Z5GiT„xÖ«‰ óÓ˜¶à(0La棽',©e<˜ŽfH$ÍsÏe4Ô’K^  ÷ÅÊ'àòdÈAƳ›èŒÏ®¨íôš~ÿôUÕÆc+î9½T©‡ù» §*ôB¼£M±® m×0³ÊzÃ{ܺäS]ó¨\á–©3…á¤g8Viôfr=—,™2„¢„èücȨ̈*­¦(EsFq”SIÏÑ&ô‡”Ȧ¥„ "›Q¶åy§!º±¥Ÿ„av>Ž{‚ëÒOÀžÒj&ˆ0#qÚpU=šD XóïÒœÈ-Ó‘`úy¶ªæÒǰКä4ÑhZä,çVZµ€;ç|‚Ü*zjÛÏ­‰ÊÜ’L¨(jÚÜoéa1>©©¸/#”ë\žÒÞ§í»ô’Ó!2J(‰Ëü0IÐî5g"*sK0´¶š…‡‚åÉ‚§¹O'eæüòÈŠ·¦)G/u*ÞDeèûÂ/\ŠK/×ê'bc#5èTS÷óˆ”Dž§BBUcT¹ÏpØ™Hêr àxL": ) çjK€(£tÀýÔF9†h¹Žñ6’§Ñ™2—ÉYr}£ÅyÚiË®ÂÖÀßPo¶dζ ÐhÖ5&M\¢©Æævι% ·ªùØ&O¦1Ð63yóbkJîe‹N[Ǹçå´?\ÍÆ“|ˇ¸Ã“ƒƒ½ÿìîÃÞùTØæ‰í)™O5¿´ã£7ç¶§}:ûÊÝÞÕërp~Lj£‰¡¾§Š:÷f½á ¿=:–ìfååïô6§#OªAH}ù|Fç¾'rG¾¯äùVÊžìË3YÊsy!r(/åHŽå•üz]Né×s9‘S9“×ò›ük+«ürAÉ6Ïéw!pðáݯ¯Ÿgô ! èuSúg(ÒZ¶å.Ø“û@àH…OŸåçÁ7|áÀÜÂd<*ËU9ŒÏ•éà;™]LÊRÎþ£KùMÚýíç×o ¡ý½u1bt#…w dnCè)…FÆ(èDF5!ʆ.71èÝÞ‡÷;G0èp=¶˜ÛS¤Çسð¸Ok­ÙFÐïÊçü—üzé¸þ­|'ªø]¾Gô.aõ´7:C8|šôú_ÊÙ°ü<›×'ÄqÒ11úãËËÇ K¤È¡¿ä?Š¡aF?®.Ê¢é¿òK;¢è‡/õ,¤ ³¯9ÐÊo»nßäŸò»ü!ÿ’•“qÓU€t_½øãç7œ ×ÍN,I<;SŒÿŒ«ÜZW½ã¹˜Ñ-+”&MûWmÖ›Ø|xòþÅÁ[¶9¬±ÙäøL+žM÷¶Ù­±Ù™¦ÍEÓæ×œƒúUþÂxžxÿ\6r£¼ûúý‹w'û0òèÍññºy¨i:0bU£ßàv*µd'=.ìÔZ·ÒJÚpÒ´Ï‹Ð|žp"Þdæ}½î [9û|RöfådyÒ å°œNyÞ®/?a–Îï7¯†×SÌï×ãYyöi¸&ó/¦âJPn´ ììœ| Uàxý*àæ;mÿ¡UÀÇ[ýõbÉS½ÅB¹”×êC½aø±¼e {6›$¥ßŸÿzüž°X¹6®3 Üb㸥äg¬!oªU„pyWìžÉ³ñpØ›¬ Û‹*N›KÃrÐݲ ÜxjÍ ÐzÓ+wzÓ’_w¬lT—|Cw¤ø‡þú7wŠp¿$ˆ› oï[ÂC[¸õKÂÕBxR› oo¿ZÂS[¸‹ áô07Üm.»µSZMÐZ²)šoD==Àå­¥¿-ܬ n›ÂUý^(éÄÛòܾo´]mOµp³¹ðÕµ±-%äŒ]r1l.¿ëÛÒWbκu³-=Àï­ìÚ’®Ôým¿a…£·ÁSz|MÙxñr—./2Û_gÓÅu¨êPu+¦º2R]”È7Noá®×q¯^‡;9Äùˆ|o¡zÝñîz6ŒhC"ª›#„½hÍo@+sçXèVo¾G×|¹V©«—s$ëù%:º!Ü$¦ËžùyR~£ëµwèúg­Ëü!ëòTµø»}ÿJÓ·ô¶úF=ÕœŠ·ðQ¾ÉÇ®òQaÁÇÞÂ'6Ù7°Y`¬–1¾Aõ·lçFd°Ulu+Ø ¬ÕÍ’˜û’†´ñA>y>î?åë¯[ôŸbòÉ"–nyšÔxÖ[tá»~6[tÑ»~¶[t±»~v[t¡›ƒ[¾\f-asªÓ¶BÜî·èºwÍ-lÑõîú9nÑun~nÜÿ5Ë-P9,·@iµ¢Ô\`ƒjE©Æ½\•–yÂPÝ fz.¹uX©•v¾QkT[­†È6õB½œKTh¾K¿ýmÀ¯c†œ Z¥nX_v{ØÃŽÏ;9™ÕÙož©Æ€©zªž—ûã³Rþ6-ë´öîªm³ô?*iõ? endstream endobj 120 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.16)/Keywords() /CreationDate (D:20171030183727-04'00') /ModDate (D:20171030183727-04'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) kpathsea version 6.2.1) >> endobj 121 0 obj << /Type /XRef /Index [0 122] /Size 122 /W [1 3 1] /Root 119 0 R /Info 120 0 R /ID [<8898F841DA841212C06A9B4403962040> <8898F841DA841212C06A9B4403962040>] /Length 291 /Filter /FlateDecode >> stream xÚ%ÒÇN‚Q@á™+°`ņ"6š‚ØTì½+vã>‰âÞø®ugâÒD9ãæËÉÜ›É]\‘_GÄuy¡|p 4@\Pmp ÅP=p¥P}p åà†!8‚ ¨„BTCÀ^¨ZhT½¹êaÖaÖ` –a¶aZ IÅ´-ÍЭ*ÞŒÍüÐ*¾o›uB*þO›uÃ*ôC¯JðÿrÂ0 ÎÙlF`†!¢’ø±Ó¨J6d•€$ŒB Æ`&`¦`f ]Xðe fUn­2*ϯVY•—ÕœjÛ£Õ¼júÃjAõ.j•S}JY-ª¾¿Y-ÁìÃ9\À%\Á5ܨ‹¾Tü^þ¥Ç&’ endstream endobj startxref 143733 %%EOF graph/inst/doc/graphAttributes.R0000644000175400017540000000766013175724651017742 0ustar00biocbuildbiocbuild### R code from vignette source 'graphAttributes.Rnw' ################################################### ### code chunk number 1: exampleGraph1 ################################################### library("graph") mat <- matrix(c(0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0), byrow=TRUE, ncol=4) rownames(mat) <- letters[1:4] colnames(mat) <- letters[1:4] ################################################### ### code chunk number 2: exampleGraph2 ################################################### g1 <- graphAM(adjMat=mat) ################################################### ### code chunk number 3: foo ################################################### if (require("Rgraphviz")) { gn = as(g1, "graphNEL") plot(gn, nodeAttrs=makeNodeAttrs(gn, shape="circle", fillcolor="orange")) } else { plot(1, 1, main="Rgraphviz required for this plot") } ################################################### ### code chunk number 4: edgeDataDefaults1 ################################################### edgeDataDefaults(g1) ################################################### ### code chunk number 5: edgeDataDefaults2 ################################################### edgeDataDefaults(g1, "weight") <- 1 edgeDataDefaults(g1, "code") <- "plain" edgeDataDefaults(g1) ################################################### ### code chunk number 6: edgeDataDefaults3 ################################################### edgeDataDefaults(g1, "weight") ################################################### ### code chunk number 7: edgeData1 ################################################### edgeData(g1, from="a", to="d", attr="weight") edgeData(g1, from="a", attr="weight") edgeData(g1, to="a", attr="weight") allAttrsAllEdges <- edgeData(g1) weightAttrAllEdges <- edgeData(g1, attr="weight") ################################################### ### code chunk number 8: edgeData2 ################################################### edgeData(g1, from="a", to="d", attr="weight") <- 2 edgeData(g1, from="a", attr="code") <- "fancy" edgeData(g1, from="a", attr="weight") edgeData(g1, from="a", attr="code") ################################################### ### code chunk number 9: edgeData3 ################################################### f <- c("a", "b") t <- c("c", "c") edgeData(g1, from=f, to=t, attr="weight") <- 10 edgeData(g1, from=f, to=t, attr="weight") ################################################### ### code chunk number 10: edgeData4 ################################################### edgeData(g1, from=f, to=t, attr="weight") <- c(11, 22) edgeData(g1, from=f, to=t, attr="weight") ################################################### ### code chunk number 11: edgeData5 ################################################### edgeData(g1, from="a", to="d", attr="code") <- list(1:10) edgeData(g1, from=f, to=t, attr="weight") <- mapply(c, f, t, "e", SIMPLIFY=FALSE) edgeData(g1, from="a", to="d", attr="code") edgeData(g1, from=f, to=t, attr="weight") ################################################### ### code chunk number 12: defaultNodeData1 ################################################### nodeDataDefaults(g1) nodeDataDefaults(g1, attr="weight") <- 1 nodeDataDefaults(g1, attr="type") <- "vital" nodeDataDefaults(g1) nodeDataDefaults(g1, "weight") ################################################### ### code chunk number 13: nodeData1 ################################################### nodeData(g1, n="a") nodeData(g1, n="a", attr="weight") <- 100 nodeData(g1, n=c("a", "b"), attr="weight") nodeData(g1, n=c("a", "b"), attr="weight") <- 500 nodeData(g1, n=c("a", "b"), attr="weight") nodeData(g1, n=c("a", "b"), attr="weight") <- c(11, 22) nodeData(g1, n=c("a", "b"), attr="weight") ################################################### ### code chunk number 14: other ################################################### ## We need to reconcile this #g2 <- as(g1, "graphNEL") #edgeWeights(g2) graph/inst/doc/graphAttributes.Rnw0000644000175400017540000001367013175713336020303 0ustar00biocbuildbiocbuild% % NOTE -- ONLY EDIT howtogenefilter.Rnw!!! % Biobase.tex file will get overwritten. % %\VignetteIndexEntry{Attributes for Graph Objects} %\VignetteDepends{graph} %\VignetteKeywords{Graph} %\VignettePackage{graph} \documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\classdef}[1]{% {\em #1} } \newcommand{\myincfig}[3]{\begin{figure}[htbp] \begin{center} \includegraphics[width=#2]{#1} \caption{\label{#1}#3} \end{center} \end{figure}} \begin{document} \title{Attributes for Graph Objects} \author{Seth Falcon} \maketitle \section{Introduction} The \Rpackage{graph} package provides representations of graphs (nodes and edges) as S4 classes. This vignette demonstrates how to add arbitrary node and edge attributes to graph objects. First, we create a graph to use as an example. We will work with a \Rclass{graphAM-class} instance, however, any subclass of \Rclass{graph-class} would work. See Figure~\ref{foo}. <>= library("graph") mat <- matrix(c(0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0), byrow=TRUE, ncol=4) rownames(mat) <- letters[1:4] colnames(mat) <- letters[1:4] @ <>= g1 <- graphAM(adjMat=mat) @ <>= if (require("Rgraphviz")) { gn = as(g1, "graphNEL") plot(gn, nodeAttrs=makeNodeAttrs(gn, shape="circle", fillcolor="orange")) } else { plot(1, 1, main="Rgraphviz required for this plot") } @ \myincfig{foo}{0.33\textwidth}{The graph \Robject{g1}.} \section{Edge Attributes} \subsection{Default edge attributes} All edges in a graph support the same set of attributes. The set of supported attributes can be defined and accessed using the \Rmethod{edgeDataDefaults} method. A new graph instance will not have any edge attributes defined. % <>= edgeDataDefaults(g1) @ When a new edge attribute is defined, a default value must be specified. Here we will define two edge attributes: \Rcode{weight} and \Rcode{code} and specify a default value for each one. <>= edgeDataDefaults(g1, "weight") <- 1 edgeDataDefaults(g1, "code") <- "plain" edgeDataDefaults(g1) @ The default value for a particular attribute can be obtained by specifying the attribute name in the call to \Rmethod{edgeDataDefaults}. <>= edgeDataDefaults(g1, "weight") @ \subsection{Getting edge attributes} Edge attributes are set and accessed using the \Rmethod{edgeData} method. Only attributes defined using \Rmethod{edgeDataDefaults} can be accessed using \Rmethod{edgeData}. If an attribute has not be set using \Rmethod{edgeData} for a given edge, then the default value is used. <>= edgeData(g1, from="a", to="d", attr="weight") edgeData(g1, from="a", attr="weight") edgeData(g1, to="a", attr="weight") allAttrsAllEdges <- edgeData(g1) weightAttrAllEdges <- edgeData(g1, attr="weight") @ \subsection{Setting edge attributes} Attributes are set using the replacement form of \Rmethod{edgeData}. This method allows the user to update the attribute for single edge, set the attributes for a collection of edges to a single value, and to set the attributes for a collection of edges to different values specified by a vector of values. <>= edgeData(g1, from="a", to="d", attr="weight") <- 2 edgeData(g1, from="a", attr="code") <- "fancy" edgeData(g1, from="a", attr="weight") edgeData(g1, from="a", attr="code") @ We can set the attributes for multiple edges to a single value. <>= f <- c("a", "b") t <- c("c", "c") edgeData(g1, from=f, to=t, attr="weight") <- 10 edgeData(g1, from=f, to=t, attr="weight") @ It is also possible to set multiple attributes to different values in a single call to \Rmethod{edgeData}. <>= edgeData(g1, from=f, to=t, attr="weight") <- c(11, 22) edgeData(g1, from=f, to=t, attr="weight") @ Finally, we can set the an attribute to a vector of values by packing it into a list: % <>= edgeData(g1, from="a", to="d", attr="code") <- list(1:10) edgeData(g1, from=f, to=t, attr="weight") <- mapply(c, f, t, "e", SIMPLIFY=FALSE) edgeData(g1, from="a", to="d", attr="code") edgeData(g1, from=f, to=t, attr="weight") @ \section{Node Attributes} \subsection{Default node attributes} Like edge attributes, all nodes in a graph support the same set of attributes. The supported set of attributes and their default values is accessed using the \Rmethod{nodeDataDefaults} method. The interface is similar to \Rmethod{edgeDataDefaults}. <>= nodeDataDefaults(g1) nodeDataDefaults(g1, attr="weight") <- 1 nodeDataDefaults(g1, attr="type") <- "vital" nodeDataDefaults(g1) nodeDataDefaults(g1, "weight") @ As with edge attributes, default values are required for each node attribute. The default value is used as the node attribute for all nodes in the graph that have not had their attribute value explicitly set. Attribute values can be any R object. \subsection{Getting and setting node attributes} Once a node attribute has been defined and given a default value using \Rmethod{nodeDataDefaults}, individual node attributes can be accessed using \Rmethod{nodeData}. <>= nodeData(g1, n="a") nodeData(g1, n="a", attr="weight") <- 100 nodeData(g1, n=c("a", "b"), attr="weight") nodeData(g1, n=c("a", "b"), attr="weight") <- 500 nodeData(g1, n=c("a", "b"), attr="weight") nodeData(g1, n=c("a", "b"), attr="weight") <- c(11, 22) nodeData(g1, n=c("a", "b"), attr="weight") @ <>= ## We need to reconcile this #g2 <- as(g1, "graphNEL") #edgeWeights(g2) @ \end{document} graph/inst/doc/graphAttributes.pdf0000644000175400017540000031362713175724651020315 0ustar00biocbuildbiocbuild%PDF-1.5 %ÐÔÅØ 39 0 obj << /Length 1128 /Filter /FlateDecode >> stream xÚ½V[oÛ6~÷¯ö$a#R¤DË€K†H‡-öÐõA±åKK™/ñòïwn²åX]lJÔ!Ïw¾sáåÍxtq“»H—Êhg£ñ,2™V&¸¨°^ë£ñ4ú_%¦ˆ·Ûu¢ãå=¼vж5¼6Išg:žA·]sÿG诫Gx/PÅ?A÷>IŽ?A¯ž î&ù8~wq£C¤µ Î4]j¥¡—¯|0lùU¶f\|“xWðÿmÒ6ˆ¥:W¥± ™«¼´¬‰f'¨Ù‚q _¯!QöŠûûÐtÉ|¬‰´U¹-ˆOªË œÉ£Ôå}`\¤Zƒî[Ðk’œA‡[ô5žîÈâ²¥1‚ôQP¡0fÀP+ŸITÇ tN,‡Þ<“©àL§isÄO¸ý¸8Ç„`iSvs1ìÕ$1eü9qE\ÍkàåÉ#ÈŸ´i—>żÖ4…„5±‡¹èKµ…¶‘Ùí ¿6ž£r:àüž9ŒfÁí)¢ÊHÕ Iî#ütN–@A3X%ï,±J@(t6*I ¨% Ùòhñ ûó¦+’mPHYP&È!ÕG‡­Zœ¾¡¬uþÍÜÄ Ñrk¹[M…>Ì©Ö÷ *yæ¡¾ã¢Øk”Ï»Žîéš:p91/‘–U,igãOuWãôŠ7X+Nìô°]oÄÀ+\¼ªÀÆ@eM¨8(~ü9䘦 %¦wœcîH§á/²ú³ZÁûWi ¹³ºˆK Ï¿_Ê~$Ó¢±ÏŒ¹ï¼èø ,ï”·CËäê~R •rÝœ/¢TYèÔÑ^Ó…¨jP±¦HùCU×Oô^S©Îr@ñ¥=-4ˆL{æd!èŽ÷  ºÌU-‰œ øUxUæfȯ¯ºä´rxQå¨î$ÔS6ÙµŽ176ïêcÍv3ß­B­Ø˜Ó=k©†ÊxOÛZв­}µir2¹¤­_š|Ÿ¡ÉFñ Zé s…³œ¶ŒpvZA_‰Ê–¿£|¿‘Å…Õx´99v3^ ¨Ôëê—Ýß&©Yù èAµì_#¼£h~¨ô.P¢ž%hx€í¡]BCûگЮ°³•ò©v(qÅIâúè¤jEu¦i¥HnúYäSâEšDç¸í3sÄø€G:´×BéãßRß…ÿÏÀ²™ÓÜ—èC«ä Úí‘aEKœ/Y·=¶—Cìy-çgw“ ËîÆ÷»_&ñ¾w@Šh'áv§‘„hÒ ×”§Ö2m~ÈÂ@5½—s%; ‡›ô1›3î¾—äNP$¾ä*‹|}Ʊìxt=i@Ï"¸¥•p0kØŸs¸­MV£?FpÏäñC‡ÄŽ.Þ®tôC;úžn(íðÒà¼ËŸÜ á TpÃ6AÙ,œÞN7÷×| È…ôìÎq^-Á(Säý#JŸF:Söp<ó£ðv–™rÖv7j ×_D‚Òæ endstream endobj 37 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpEo6CDy/Rbuild5305cb329a1/graph/vignettes/foo.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 51 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 52 0 R>> /ExtGState << >>/ColorSpace << /sRGB 53 0 R >>>> /Length 784 /Filter /FlateDecode >> stream xœ¥•Ën1 †÷óYÂ&Äv®ÛV€T ¤Ò#±@,àU‹TºàõùíLf2‹Vu|Éï/—Ü•#wç—k÷è‚ÁÏÁEaý;Rñ9¸ï_Ü{÷myñôîõ…;?-_@tŽÅr‚{:÷åÍV÷þûæò-NKr?–]p· ¹+üÜ-dw¾YœËɇâ$GŸª{ØJõ"®d/ì¤6õ¶`žnœJA|ÝÜDsæ°za‹^ORðU¶\™KËVz½¸ä91ë^,§_´nd^1(Ÿ¾ºXýê迺+Š *‹;=¸gŸž»ÓÝòòôÐÎ eßd†5NzÏÂÕS<$’ùv^’’Ï»?ró\ۢדÞöÈ•Cíظ{õÓ!—޵ÿ™Þb×_È }þ4j&•¡gÓ 7MÆ @8G-`aêë–6Æ´ñá‡Ü8×¶èõ$°ç4rõ½öjYt¿{=ºzîQ÷ÿ@ã{]ñ1´ó_BËÅGž™UòT†ìÆê]»êÆlõÆ9/NU'ZI|.#/ÎUã^µßÙV5=ï õÿ8‰f6uL·¦|%Œ]ôµnÎö¤{ò~!fKNžÌÆÄ#¬°Úš“@:5°¡œ0ú!’ÚYlœ ¶pS»DOä»&Z½*¾aSÔ4ØM|hÀ‡¦6£0ÁèÓø›¥5û¨Á: 8/¯hlx}„E±°`ñÜ d4Üh"^%)lSÍz¯ ¶’RñµšàêüBú¤*¸ê²£P}Œåú_õ [¥°P5Ábàï ¦T GëÊVDT°¢„`Á·CQmlµ–p5;WMTÂÉìT=wÂI0F #Ìæ×=¶6?:à‰°à1}báh31«4ì¾ ±`ºÐû†˜1¶IvÄCñ@ÌX¿qBlÒÚŽX¥Ñ„˜…Ë„¨8Oˆ·õ|‹<ì:­vaÕµÛ™õ_án'Ò§ÞmŒJ›ãñS™ljX/“—L³?„ÃýŠ¥™àëå'ã ­ endstream endobj 55 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 58 0 obj << /Length 1331 /Filter /FlateDecode >> stream xÚíXÉŽ#E½÷WX#URW’[m1Àpáb‰Ã0Õvy‘ÜvË.ÕOlµÙe»Õ pà`;—È—‘ñ""#ýÃøæëŸ¼¯œOìh<¥¹²£$×*ÍÍh<} lcãàCh‚é¼ #—úà}èLPÁHµ…¯åÝÛå.ü<þ•Êã˜õ(²Neº†S ióG\5ƒ¯>ûUÅàåtŽã؉i¦Bôí¾`£~d£l”«<±‰lc2å2Ùæý ÄVaÚsÐzq€0kž(xd¾-`pÁ½ª‚ý‡0²I°ÙV,\‘ë…bÅ}§ƒM‘ÛÌx¬ ó âh!Ò]JWaä]Œµä•»> àŠ‡ZzõT”¯zਵ€Óô¤CÞÁò4-¦h½?´ñkF3’åˆ.¶\S°‡Oò ˜Lj}w%eÁ~'[®ç,Tñˆ‘Øu(1:UÎ%°—„ LÝ ‘_È¡ éãxãÄ ÏžeÊj[ƒß—"¹ØÐy§lâ,¶à«¤æ%ÜnÇ{lBš`kRòÌ*ž„g_o*n,HGØçKÈÆÅAX GîˆÓ‘…#“Ç*vÙ‘¡iÄöïÈ9G‡(‘-ŢÄÌæÈó¡göû0Š­{¡µÑIb-Ë wÍÅÜp$“ñÞ+q H»¸K dÜû>ÀïìK¡¹¦Í™òÀCe“‡pþ|±ÀrÇ¿=S²ï›à¨Ò¾ÞdÚ$£="rYÇË+± Þ#Ñ{v’jƒ fw’ëèa>ÑžOŸ‰ðYòÈ R+5¨˜  ØPÐ Å\db­’üÈ{ß&ônõ¥¯! ÍQ‘ä·Ð‹¸i†2ü›«Ù§ô‚zïˆD†-êk…ücj?-±}uÖøŠ~èÏG@”Óžxþ ‹Öºž[ÇMõb†bCå:Ãv¤1œŽ +QÔõÈrBµ±T/Û4[ 9á{–ÚwTÝ”¼rsG,.Û$MÃw˜ë¹½ãr¨äˆ‡Ï#n²&N°W§™+7®‹{i5•¡îÔ4ÃÙuRÔ9ÒDE<žúÓÊë7+œŠm>œ£ 8œ³ÿµu>ØÒóñ3ôªHU–v_üRñÁÏ%q^רøŠ8}Rœy»\xR´ ð¿‹7*HÀ.[m8Xß`qT\ã<Õâ Ôzó©Ù¬öpGû§9ØÉé|¬´qWêgïM𪳢Hã3œÖ­•l¹c¥_'G¨ R~rž9KÄ¡è­V6?ª£_HI¢’¸)F0-yÝIK^[, ðMÀLÉë†Û‘¦C ­tö\~ŒJÛb ëÆXg¬«i/g7 ‡ÊŽÛ¨&=`ŽÏW{(N\£É(ë²ç»\š4…_}±Ð9j~cðè¼Ïïµù‚W@¹–BkÛÛ6ý6o¨ûº@¿ ¬ËúÁ2pÙ¾»ö’õŸ~VBN˜3¡Ëü?á;I”…üŠX%"õô´?Ý$4A«Å^Š›º‡E|G$VÖ6úç äMÍ{ýÕyt‘L¬’ä"8©2P3]­¯þ}ŽÞ€„ôµI˜¼ ÉŠÜÿç\侪ÓôÞÉp5B5Å©r&©ÿº±›㛿 ¯þ¡ endstream endobj 63 0 obj << /Length 1036 /Filter /FlateDecode >> stream xÚÝWÝkÛ0ï_aÂl˜UKò'lƒŽµ°½.°‡¶0ÇqÚ@—Äi)ìßtªeç«ë’ÒôA‰,ÝîK?Ý}ퟜ^DÒÉX‹Øéœ$c‰³€%wúCçÒýà]÷UhQELîšà7ÈAf »`äk$ñˆÅñVQ¾ˆçÜñ9gYiÂKÇa\{~$$L„øB²ŒïMñáë(|Üâ3xÆ¥8¾hʘ&4Î`Ô4æ0´föÏa î70Jµ¯D|‚©¯§e‡â›²RKÄÿ« h›ëÏ'ÛÖn$eL,·$©«çAuüØøÉ>ó3ŒŒM:ö,óN/BáhûEB$L&‰¶V0 •x@DîOV£„ñìÆóeºåP« ‘ÖC)'–µ6R’v¢2™RÒžy"iôW¬0–uã%É7ŸÓAAæ.ÊZO–¸3e¢"D¾["T*9&ë@iYS€*òÕr>™¨%Xy JÛ¼%Þ‚rÞlTÚ tËÉjòœqŽúÄÔöE•ŽÚž¯Æ@BDîÜ¥&ß'Z~ĸPêÜ E¡R‡Qçú9egðEç”\ËÅèU“ y¼¨‰¯šém›¢¦ãÍy•&Pb…Jm[ç{/‚ ÙY*ÅáR͆+RcâŽ' HÄ;\¨.¥I<˜ T—ŠÊEÙ2IÐ@¤Q¹wcÉ1Q‡)Ú>¾ ¸ÔI?é©Êt@V.Éɸ´À˜ÄâÞPï õQ &ýîqéÉýFy£YÇ‹ ¶æE J_z#»J]Þôrú'²šHÌö°½ýbèì"·ØòVÔÀMÄ:¤C7jŽ#’;#ÆGÅðÆ,zÞsÖBîN]ñÿåQNåQqluQ|x0ÅÅÛ¸ðÿ|ÞEÖì¼ÄÇ–M[ jXURøo¯?[¶„ôƒ—p9!丣ze5EHçÎZEÈšçsÝëé· m·J£X/š‹´æ–ôÈÊÞîN§Þ%ºX]> stream xÚÕXYoã6~ϯ0‚>H@̈‡®¢-b7E‹íÖ/Åî•%9v×vR[ÎvþøÎp†º,%éîÆ@hRäp.9ŸçÛÙÙåu2IE©h2[LR#¤1“( DœÊɬ˜¼ö®}é­ m³5übûà'Æ»ð§Zkッ¯¤qžmq ¼} T+.KÓºö²Ê®KoǼçž`N8¼eZêî­œœÉnw4{» Æ÷~yV¿ŠÞÓê÷| ñLg¹¯bï³Ú -®XWš†MÇò×+Ë—Äé¿ýpyÊ–ë¦Òˆ|7•0‡Sè»oüi¨´‡:Vœ´ã¨ óÂþM¼,¡]Ю;èÚÚ×ÐÎyÇyCV1‰[.ºËNŽs·#Ëy[Á:“’v}_S®Ù_ÎxVVZ?P¸½à–I." ÃgrÁbØôêq“ß³ì Z2ͨéVlÞU´¥Ï[¾å©ß`ø=´¡ýíã-ûuÅñ¯!ýËSº÷F—G·.¥À(™Q_0‰i‘„B) „–àH:Ôé+û˜“ E=Èjª‘¤]G¿f×½õ§201Œ©WÜkî ÷!÷÷1÷ ÷)9®ÏÀsBövÜòºJ'<ãü#Ï8RÊÑCv÷—îBý™w?)®ù^*-\Òütëæ'±nþ4ë.¯š@‚Ó&R|–Z5ic_ªÐû‰Ófà˜Èãž1ÍdSýü`“ü¾áiÕs<ÁIÀÔÂjKŒ1ÄËŸÆaé:6ÞeI–eZ¨‚ Eåä$Ý(”‰Ð Ky…¤ïÃRìÍâ¬Ñœ}Eúc6„ bŒöy`õ€Q‰–! bFÝ ²Ëî–ô…Iõ@éŽ pME¬jr4Ù¦õQ2¢ŸFÍÚðŽšÂŸÆAâÍ–®, [wN ^Å ÿŒ3 'îJ$Â<|¡ì¸âÇ¡\ÙÄÎõiâN{šI0„á‡<ˆmž“ga¦,hÓaïÐÜMK^9p#”IE¹;³íå¦þú‚çë˜ãì_YuŽ¢*‰…V¡c¾)™rÙœC˜4çàL#´YòëºÈòî²wMG²a÷öH°Y±bÙ®Û·æ#’æÉx,…üWóµU옋At¬ðÖ%ƒ íÓã(á=-ÿŒÀÚÖf9¾ùyÿÜðõ!ÀxZÕ+ÎwýÙÀ…{¶Ñ©²nçØç7å©ðeì@í%^9ú^jó‰Fø¨³F8>A|€8ä´î³ãþq·w]a²HA¾sÊ’¾ë¼®SõPýaOf˜ JS©MS!§)ÎóÈ>Ûñà ãÚý×Yï8¹âÊ•.P!¬F$N½6t`ŽÕ°‚H"™z3WVI;ùtÍ…—T¶ó©ãªÚI¥®W´õPçVxÙžú:…ÓgOU$Ãvµ6)-Y>‘•Ë÷0Ë€©–ËLÔÔÖ(«èÛŽ±¶sïªQVO[ÕI½eVô qX¤£ûP)ÊÔ°äÐÌ”»rÀŠ!󪪋·ïà€ Èxåðz¬Ö;=®h¡0WD›[ÇäÙ¶®u)ïW.ŽEh¼?Q|NòG`w,’¸ »•…ÝÆû®´jÖø =¾Û‚ÆŒ{Ûî?ûœtPù0†èóŸ‘£CC`'–áà€[AÓZƒévÕÇžÆs»5(·4cÙ¼ ¤áŠ  ~äé0,ŒoVö¡ÅÐÚ¶´‰(pYó*ÚÙã‹“T©æxüôi©…‰ôs¡S„g5ô½ O®è Ég.‹È T'Ô™F"í—A:·–Šº#ÞßÓr]v¾§M},söñáH:v‘Œc›§yèÈFЏqï @UA*d ? ç §Áí@E­I}mõ” \@x]„Æ[‰¢ ’½œý £nS endstream endobj 71 0 obj << /Length 326 /Filter /FlateDecode >> stream xÚíUMKÄ0½÷W„â¡;)I7 D=xÎmÝî눊ÅïK“Ò´›¢²¢(;Ë̼ùÈczd’½SY1͵Š™+Vk.˜Ò%¯51³fól'§l™/Ì+YAĵ”¡ƒÚßฮ $)—4‡ƒ€E^HQÁô1¢âÃ‚Ž·^Ç–?ÒĈ/…ùìûh<ÏÚ\ŒJÁ¨¶*˜hæ˜Ã=¢€µŸèسtlç¥,ý¶înŸuÐÖqQiïê’-ž‚°øÊœEÈeïã_Ñ튲²Ed_ÒýEÄš«°ÁíGtRM?ʤø6t4ÚÍHO«jqB#õoÞòXH2*$õ7…TO ).ù)!É÷9¾áèü¸ ‚hØ¢€)‚Gú?[g‹¶8Yn½m;³ !ðý&0*âùÒÒÆ%'&yå¡«” endstream endobj 73 0 obj << /Length 122 /Filter /FlateDecode >> stream xÚ-ɱA…á“($§ñ ç Ì\v³T’µSH¨¢B© $:óÈ@\#Qþß_‡õTQUE&ªMGã…Ö-nÿu8³M [Yð,ÎVº]ï'†v=WéN;SÜ3uzÀ3üãéxîý:côÁEâ†_Ïìœ endstream endobj 84 0 obj << /Length1 1744 /Length2 10140 /Length3 0 /Length 11249 /Filter /FlateDecode >> stream xÚ·T”k6 J·tÊÐ 1tww—¤3ÀPÃÐÝÒ ‚„HHKw‡‚t‡”HH·Ô‡çœ÷œó¾ÿ¿Ö÷­Ykæ¹vï{_û~Ö0ÑiëqÊ€aVE˜3‚“‡‹[ §!kÌÃ àææãâææÅbbÒ‡"!ÿ‘c1BànP˜³è¿,äàâA&B<jÀœªîŽ> ((77€—›[ä?†0¸(@ä4¸ª0gˆ“ÌŵµC<äùÏ#€Õš À#""Äñ‡;@Æ ‡Zƒœ „Äé!£5È ³†BÞÿ‚UÜp===¹@Nn\0¸­$ÀаèBÜ pð»e€&È òWk\XL};¨ÛŸ =˜ ‡ŽPkˆ³Ûƒ‹»3y(býpîÞÀ¿†ëà ótöý²:ƒm~·vw8C]Ý!*òÙ<ˆ°þ‘ÙBnnn!AÄñ²¶þN ïíùCÉó[üЃ¿¯ Ì`óÐÄjyøÁòuy@¸;Äß÷ߊÿFX<<0Ô°‚ØB±þ‰þ †Øü‰æ‡zL¹èÇàþýùûÉüa`˜³£÷?挨§¡¥o ÇþWË+eea^_N>'¯€‡‡O $À ðÿï8Ú è_upÿã«âlˆüYîÃ9ý§d¿8Àúׂ°þ;–&ì¹ë?D7ãà¶~øâù¦û.ÿ,ÿåÿJôÿ­HÑÝÑñ=ëŸÿ=È êèý—ÅsÝ[ {Øçÿ55‚ü¹º²0GðÿêT ‡]q¶uüû¡nŠP/Xа¶û“.Ê ~/š#Ô¢ sƒþ¾Zœ<ÜÜÿ£{Ø.k‡‡ëÃ퓨 Ëóß)œ­aàß[Æ+ Áá o,î*ñ |yÖ ñúƒÅ —3 ñàxhÎ`ƒcýž¨ (ó[ô'åÿA" ÂßHˆTúñ€*ÿ ?Í¿‘ðƒNïo$"‚þA–Vÿ ‡ Ö£ßýÁÿ‚!ÿ‚¼ Í¿àCÛÁ‡F ÿ‚yÿ<‘ÿ"Ãþ†üU<\Òÿ`AÐåš°ÕÂÃÂÿ²¹ý >x þ†,"ìà">Lˆð„ýËááPÜÿ€ÿ5Mkw8üáNûcßFýüÇ xA¬±ægaÖbaö5am—U2Tžœ£SLFilœ¾óðv÷_xè)l•oC¾ÁÏeR>,­+°žI/ÐÞúî6סG¶$ë´^ûÝX&éNl´bÍ“~Ëß•©í¥Á¤æÔ—Þô»uõ3 vx܌ܩʔãê.Œ§GtéÙ£äUÛ[º81»¡³Y)¨†}S:Égk\4Í”k•5CN†à¤ÁxFxè…?}v>E˜=vO«šÄŽåÿ3ޝÀ×d…7þjÆçk™>¯[#… 9Íã3Âá f_Ù©ªd_|‹ T#b mh,f%ÛñA®üÕtóâ¥Cc«CäÛ–Ár¥øë Ö:kL²ÛŽzÙä„9µBE“·<–ï±Üt:¶nI}bʧßÂC¥>; ö´y#Ó?½r|vÆ*…Öñ#òGêÁ9Š¼Ï½"“,u¯î¥“æx­r¦Ý¾ /ܽŽGB—GþccJÎïLOõŸïIê#Q0€yìè²ÅÐ^ì½3êÿ\Axï ‰LU7ñHÍ~¸ú›j§Þý'Íw»Ö¡R â›WÒ8V¾¸êo¸‡ÍKM!ñö¢ªÝÎ(Cj×Ñ ¼zyU¦¯w{³d­¥†Ë4C`a5B•Å P~jT eS¤íiÑ…6èhÝDÉäKìmp¥,ø•ß„Jéø~¸²…çK üŠcyùž¬|FÉﻢ¸†ÇO:U¹H¿TLÓˆ§éSh ü¤¯— ƒ“³R”i†ô‘¼KÅY eÈ”l4±ï>·Ë¨gO3¸ó¬¼?ZǺ©cLüþi|ÍlÕH“K®€ÕpÒì@ss“:§ýcß<Ôi©cGK·îíÆ‹RìŽxo=ïâÕÙN«•'#Ÿ^ˆ¸Ó¸Ä>×^ëO¬Òt‡Ï²©K¸Û•ÄÏ„LöËÎç¶tkOÇXù“76Ñ¢vuMc}ç,õ1x6²ø”¯l+à|]¹À“,ÔgCGôÑÌz+-Þìê×ë k¯–RÒ÷äoJ)Y3BÅMÄ£ç2Ô§3j‘§Ø}nž(µçr#³uŸ—%G‹~©$°ÎC&•Å-ÉR1œ ¾EÝÈ1ºoÎÔ5Ç­+Òƒjb’IãägM ‹¬N Q1sŠÐDŠpN½³±‡sžCÁmFqk£Ž“ G™›EIi Öê¹ÀXø:²ŸYÞ…üX 9Œuea“6øM·Mu(î °ÀÚèM¨|Zß-E±0rèà/ÝϬføÅa-£Dy(=ó“7Œ.‡DÉtãô4K'"µ±º !“cÿ’·K‰æì»>prCtÓôALJ4§zÎŽgßÖ»Vø ‰ç_Ê›pV¦vW¤O-¨¥ºÔWâìç55äè»_ÎjíÖò$•Ñ]S€2™…øóC·Pc·—&;{Ñ9$Z؇J ɬ7ùzùª†(ú„z±í~Z¢î¡9¶’lÉ8c$~elÔ‡4žkvõáNwŠæ™¦3ŽdƒEÇ¡Ö$³éö·r×¼ß_ À+ÔNDß“¯ÍïÿµRÞ1°rgCøEãfñJˆ¥¤öN¥?†b~Éy¹$êÜfQJCúr°ä‘»*ùê…à qIå€ ‹ýÈ’•O—ØPDÈR•²9‰-ÃØÇ¦#ÑÞð^¶%:e@7¯F³xàÕ)%?O{%M>ì/Kůi› ;ýHDcp‚ÈkŸNd¿l¡Jz}%Rè!a§ÐeiÌúÙ;1Bó2 U„²h‹ ,0+ž·lÌ_ŠÚ*@D—pˆc,—‰V¥ðTõ<þCG#ÙÜ´¹q.1yKêÓºŠÌ›yÇgMÓÃT¢Ï©ë9%©]„ÎSšÔ[®ëúæLÞõÉÔö9ž]•E¶‚ÓyòGDÁ¿¶tÄ}XíKþq¹x:£ì‡è"|†¾€Ž8ÇÙ]¥Šú†5\!$:1ÚGÈޮ쫛Žp'UëRevQÑ07=.ìðñ™…·¡&4ÚlüU6³ìZ.Æ–/TÓ]Fq»¹eÏ´vÚ£k~m¢×žvVÊW|Pÿ°zSü§Ÿ>)º$—Œ4S7Mrø}‰Â{\|tFWÛxœ˜­ÁÅ KÔÍúd'»äRˆÍ1K[SЖ©kfcWÖ¬·;µAÞÍÏvæÒE™ LONzvþZÆåÉÉæü4 † ˆ´Ú3£Gm Q•ËNÕö×}ØV4£ï#ߟ˜€Kì"Skbz$½4÷Jò–]ÖÜf5+©ÍkØIždOÁâN§vsг(»TÅUÙÍœ°Fi©U)®É?:PÅÏ:‹Ð£iâ^ÈOv›¶~Ø zúÊà[‹K,Wxøgãk#É|Ø|íç&óåÍOµÏì§å&:Tê3[Üš;º®çt‹Ï„ÜÕµÚF%¬Göo,¿ªbÞÊ…¨H‰  bëãø¸Õíù»«¿HÕ˜ *í z§Ö1…ýxÿb«õø{ÄWao-@Œïñqb¾_ŽÇ ¶§¹ä#¨©ùrç7SÔS(ˆßÿÀLopðÖd¤N~uû”%OÖº2¥{•\ðQ·!hغýïϤP¦àoy3º'z"Ês‡:qm3Yp›S¥"‹3ȆõyÓðçcul$[¤jßõ ,¨ëœ›ÓË5(¯9„™ß p?ƒïÞ|MÁ¶@ƒç¼Ç:;{È‹0NÊø›tÔ|Ùæ%FÂäÛÀ’­0JÈ΂I¦Ë| %4Œ‚/­ýJýÞ*Á¯ìœÁ•^°S-OVÛxè›^a¶I„õä…ÿ}ð™úœš/þ׊൫ætAb%g侘{쎣û¡Ù;VßÁ‘T²…e¥Fyo gYd"„ó5ÛUçµ{5V—;;±cøì;ýv“O‰µº[d2饾*š©(j™Ç(åMøf¬”Q”æeŒɳÜ*MTèÁ¾ºÍ‰â4°H û=ÒðkÁè°%h„.g wMva~æbÖN–‰Z¶üZ˜çÏßý±Kªñ«8•t)ó‹¢g`ÿD€%Þü8°Î¤K{ä©K?rü—/ …ðJ©~íDPØþ¨z2 çcª^¬1k’'¥1K|JþúÈ[, ¹ Î] ý’&sfYr83›P‚–ƒ–/;<þ€%VÊ»©¦ éPµÔýêõEǼn×_îh<å­0¤HªÐtû6}ŒØÁ$º`{¼ÈHý…cõD2{3’ò¶­öf^9k¬o?ÐôwT– Ø`DˆEµšµá •¦/sâ¸ÜšG[åkâê—cŽÎ4²ý€"“}v±vÏ~«ï@EµQв»“ZcXóç>ú% _ÀûžJ±ëóT¡< Pw¹ÄŒsK—)(zsÅ9•ZU¶ZÚyù^P†{û£]±®¢HU¶þ,Žo"ksÚ!ã·ðÄ@Ñ¡S»NÊ‹û³{û®-ôâlœ9ªŸL‰ŠÈ Ãî^*­õ{4† I½Ð]ÙU…¸è~nÀ¿ \Éü€›3ôUüù…©sÿ›†òÓ¾åGñ»ÄS+«³¡Â;Œ¿:è!ã„34Ø4G6Ë6a¹© ±ÙCØ„%!u8ÚžT õ"EgcŒš­a ây·Å÷/éíQ[ÝßjÀ)çv*ë~fͨßÐÿ ûù̆œ=“Ù@&*ilð‡a׺—Pê‘ Uç=ˆî$Zâå:C?Ñõ-ö@Ê€{YŒU^0ù›Rgí@Yû¬Äì…Õêú ã9\¢ƒmD*XHy!/ž #’5 ØÙªàÊ(Y'—mX×U¤×ˆ€èÉ éˆÖ™i¼žðØní–¹¦9¤H¤FüŒå˜ð´EÄU¶}U6=¨Èø®zÜ¢ç!=ùºÝà¹5éÍp θôqè ‚€Émð[@¦ÙcÈUÔå”9küÁ–èÆ1ˆ·%_j‚hiÉ7ùá\¬Âp¾48¸³xfÜV¾ñFRÜI [vùTÇû”¸9¹Ç_åÙr™¬Ü˜¤·T†–å2jÿÂѵ”j+…­Có0ž†IÃÃ++ŽPúH5˜"7Ø*DÙò“â~8{Ù†_Éb¸Ìá«ïÖ§Ñ%,Œôú»esNˆjãœeÊuðŒIuöͰÝÀ…;áh^`ô¯Ï–õn™ï>ëÕeý á!н¡ÈÕGÃð»f¦ºcE>Š[‚‚ì‚åæ< ÿ¹Åâ~¾ly‡~»qfÙpw°ä·#± h³ •eÇ~ LÑr"ÝÚáL3s:æ’ÖùEÞ//$3l¼)‹é¯¾32ìá ^MøÞ`Ü|ØZ«h0Sô83øiDƒÝä¸Åä…jj[7M°n/P@(‡=M²Dÿê•…ƒ£\Í7~Ëõ-Û8“sƒÑŒâ[- ±AºwyàñôVÀ‰‰kû^É-T%/<˜±0[nH?ó™Whi¯ùuéV*Û)-4Áo’™jˆ4mî´l8…”´ uTqÖÆf‹½kÆ:fâ|¤jð9ÇÔ¦JßXhÈEnIŒa€ò’ãÂNè@X#l‡Ó燈èúpíªýÜã,Sû4žWòU†U×qëºåEkáú§¦žllï¥É¡U§cøºÒ@_›]¹#ÿàÁ.Œþ/çsëðÚmºÊÇü­·Ù‰g­±6Úïa{ASì,ixû‚–ÀE#_»¹‘ƒ`ÔDÆÎ°ýV­žÿäÝžj¤ö„[DôLÃ÷èÕY{2ÌâåÚŸLu_W3$ÝI;F¶QM=Uõ¯ÞÔöïz^÷½¢©GNüLý”mR<`\Íä± É/mnÔ„4UmÒVÉ‘5æOËÝk÷ô¡¨lí‘Æ[Tv5'C@šs5%Lq<¨k³hK Z”ʼ'_–®´—LS*H•$ú`‹å‹ ×¹C—¯¸vÿÇ7RŒ@«¼u&kݺàˆUç6:”g¡ëǹ"ÄÄÂÑ´Kšøî–úY;< 8´ÌûÏP!ùšÌEî*~gWaì÷³Ü%õôØ¢ØÈ‰`2=ôÃò+ <Ï´è¾\ÒŒïJ(&|ÿL›ƒ?aJîÅMŒôdý;ýÌÄ×7$îÓé2-W9ΞðPKƒ f]÷ˆ%ˆÉŒÐ˜hµþCÍhúîAŽOÄ1òy^Ì fVDÞ9‡ `²ÅÜzä(Ùp³U¾j½þ>¢ •è(›3@üØ'ü‚s3»Cõ­ ‘‘u+¶–M!<÷ë{¾–„]Ñ騥è;WÊArþv³@‹ˆ…C2Ôq—ú½‰««tÕ Ò(rb¹˜ª}JA‹wœpÎÐðÜ0‹í7€Ûy™Ût¸ìIÎËÐ:(ê74Þ&¸œû…_ùªª`Ú~ †¤_àt:}”áQUiÅñÑ4ë4$xµŸày¸tcÚ œZ¬±‹å-ßè‹!¹„cvËÍ´]¥ï2†=óhùe0nGæ,wÐÚ³`÷o¨‹>§VßɪBÒª¨v?ÀŸOìÖhFWe70LPØb ÷S3Û¼LœÓêØ:ùµ2m4Ê[m±@~™ˆŒç£T¹w€jæLŽ~¸½õ¶i·Ô»§Ÿ—¼æ²}qN)+¨´…uÛ¿+›òô¦l¼ŸXO|ßl¬àTýv/<|bDØjù#ÛÑQ§„Hð + ~¥(^›HÉ7~còøîëš&鲚…ç(ù×ИO¾™Ì å±¢yü¨mª£ jÙâêF¿‚¬ì€™…ÌJµ¨ƒW aß§Û©¾ €=Å÷k¾6ÀiÏK÷=gA`ã:¼U¹z×-u!jáÆ¤h£¬” Åü®Ûœ,Oœ®ÄŽmðÉ/ÓÆT™¤Ôq)‚o1xÐô[¤Ïg¼^ ­è ôùmQk*ÇðD¤ÙI§ ,.m¯rz®ëG3¥ÂGa$¥S‚I"<›º"oé !cÓ‚dôm0¡‹`«ªLñµÒ™*ð›1@Ž&ž®nÍ?w=EC­[¦ÑDô<‡¢£7) æO<\¡¨“»,£KšÜ¨m§‡N:º¹àÑ|›aðZ‹,ü|á NÐÜââõ¡Êð§¶²äPwüðgºâÝߎ×èD¹ïŒ¦_b0—_GÌ×ëc¾FR§Ò©U `¶ƒr¿¾D´²ÖaÝcu>œº‡‹”Ú5õoÒ¬½wnŸdÂV _òJ[s÷i2éX“ ;_1¦šZ†|,o¹óŒˆ20íÖoííêt¤ß-ÛÔE¡×{Š~ýÊ0„ÇlþC£E,óY£`ÒÙÍš…ÆÇIïk%pó™:u‘ ] ÓSµe—•$ŽŒug—nÒ§êFòì~nƒ`#%ÁŠot«ÄèÆü¨jJ5 =ûB[|3œpR‚$~zgÜQ™TÕ“yB*´”UZ1®äyµä¡%XˆIá¸Ø{O+¯“¶]ÒPº›°F@§”ƒŸ©Þ(¬´ñ H‰åÈ<̱øb4fÙ-/æÆ.ìÞõvÐÕ骬¨ë7’…üâõá´Ã B/®äªEyinUák_ˆ:­^kñIH¤jÙÖúþ¶¾Ù‰ m|—/Û••]‹†»ø46,ýË)Ûn¦9ñu”njŒ@ 2>›º•cp††…©#ISÐÈ«ðO ï¤(´hï{ü›‹ÆdèžWŽë@zÙ¨ TlÖ× zˆÍ”ã^ C§Ò  ¦ŠóÊfNNsÍð~âÙƒ†D\#ÛOæNê9Ì·eu{HA;/Þ[d °dÉE¹D*\\Ùòñì ­N2ëúáÑ?ë¾ßô› =*r§íq%C7)g”Ñ .šô¡€Ë“$î2Îß›>2_Š)É¥e4ÎaJÕˆ±‰0f¿*V«NínÓLªBnf.¢ØÖ%?~RÇöÎ vìù©ˆÈ.34#­÷³ õ¬£8\î’7gWŸLq¦îÆrÝ™#´fõÓÌiöØV˪[Ss ±¡3wÂÕé!n;—û¹Ð„Ï—¾SÄûþêÍXúÖ TSñ†‰]—€ Æw.~&oÝi/öl Ñ)c":%§ÈŠðæ—¿ l”炬ׂ‘·^ šòXB¬ã©Ñ<¨!àÇ^E¹~õ÷غANdDR’5S’ç ØIê\Ýï‡Ï½óÕëZRë‚Ó8ž‡ùfÍÐ"Wæ b)ðG‰T_:‚-è”ò¿î–E«çebê¬Áu¥IÔJ‰Ï<ÂVÇE²ˆÝqX¢ ÷R‘²'§ÚŒýDÊ+Ýz(†Ùå#+I¾±Õ,É7D®± Àn¾¶‡ã¦Ð¨_¼db9Üo W’]rckßYò¢ñ¹têxþ£gG-yŠâJÅç UC÷€e<ûá®=‰ëHvžUÀ±&ûäùñèŠ?Óm ö&?#¨»­ô|At§e¶JÜ5c­Z›%žÑ¡­ãQÒ´_4Iy¾ %%,K2¿«z¥áh/6þ¬pì…Ëa(ÞIÍâ.¸ŸÇr¡œN/ÿ‰KhZƒ$ITµq_“S™%žü¬ÂqÙι®#ª…ÄV)sYŠÜùI愽Ž'yö6!¶¯é6õ·¼¹þ‚áJi¢"D³ï£*jJËwóZ›hÌÞÌ´èBéÜ6íÛå°Åøs…ciê^™Z˜ÕNéæ'Ã!¾vß7:/‰=¾†A©)½ÏËÛü­m*Z¬ØXûth¸Fí6HæoíXWhÉ¿ùøYiõ‹˜bI骊Ӗ~äÅæ¤¡˜F”›îŸÿXÆ–îžÒwªÂâ#?jÌÏuÐkY€Þ]×äYb§ÔÎ KcL“O~]ºâ4%e,•ÍFÇ·Õ»Q¸¤ Ñ5\¨,u £$æg: ùšÉsKAäÞPÚͨ >õöZBUñ.ãPðà{ꤜžÃ.ŒgègŸŸoÄåäA®†dH’S ±¿QŸÕ²˜M i7_zP´FǾM)¸i6éT&ucBr{J•P­6ÛBF`/[Ù=öÆjÔbôöÖïegÞ•`€ç©É ³ƒÞ$ñÌŠ˜Æ š{7*ryþ˜z{t­ûŽÊSŽ,'XHA½Õ&˱b&€ Ñò©¯¥)4Õ»9~ŸžÅi½;›¹Ñ14uM¨nóU¡âö+ñk×GñAýtˆ¹½’¾Èv~øðò}’ TÌ»:‚ÖÍr¦–ú3T×[ JÒžõ.Þ¯¹ð…Ý«k—µ…±¢ØìÐ$Žoœvô÷/Yq¿˜èÕT"Á“vŠ™È-91ÕŠD˜¿ËdbÍ -Ûû ¡d0ä(2Ò±¢÷ËÜp¼ï‡[ô~`™À„mÊÖ»luƒûU¢7ÚI˜YxD°ê³°®9Ê$®‰·’(mZ8Õn&e“ªþƒ6¬¦>!»÷æºVI¨~‰æmc¾Pßê0ùƒÂîäŠROèWZƒ—,í:@RB¾1ç'Jû§$fƒ×ƒÍ,öP×V§YzÐárñŠìé¯bqGÊìF3S¯ü§±–ÕܼŸhJÙýÎgæà(ËtŸh©Âyk§ª”W™LvÄ~y²Ãì7¯" …•>áùh߻ޮ0fW‚“¿åØÃWúÓ…· ÃOã{®G–bóVd¢‹¹¿P&BµµDSõQÌöP±*Þn)wõÈ»÷›pVúK±o~$._–óÂRœ¢‰¿L•ý6”Anb“#,,IÜËI‘•²TÜ1º iÊBµÍbð¶_ïÒ[r>Y¿^¤F•k;HÔ„¡JžTÇr¾`\x'OP±5+4ðDŠŸ°¸“ÿàŠ8íÕŸs¹û3#ÁópPäi…]»Þkãá¾:åxÓÏ+Š5ûÞß¿’nD$mɶܖÃOU°äélYK†TUqæymír'¥ ÐûS3ð{ûN‡|ø”l5&nÁ¯‚ê>mgÜg\Êê 'º7öA¶m_›¹*¬ÎäØù½ô’µ­eU¶ ½õSsÃÙ£öìÖúöýÕpbë:/[ n¶»{¹ ÀÈ]7i1ä^ ©²í8Ò(‡6ø—‰4GÙw° ZO—˜”<æÝ³B¢¡z“!ü 8¯±há¶±ÆózÒ±K‡Ö3Ä›´Æ{žb{p"4´§TàB½*â¶ÒVú¤L¡“ûíÌ{¿±í^% ;7@_o™™8f¾Åœž¦w8~”kLÙ L0pºûæó ë¬Æ¡P¬-G!ÐÎ[ð‹7O¾|ûp¨–~Ÿ-—g--Ë8=LÜ^/œü£,Ô·²0É®®hz5ç;C®yrOnÒnn ˜ÄξMŒœ¡µNó9P9&úûÒlÕàD«ŽÆLåú¡\0!µvÿD¸çÅ%tiâ&=jc­]¦¦s_0~Ú%T’:Ù‘s³ÁöªÉÏ”¤Õ>™Ô¢*©&«QàNDÝè¾@v­Ô )w³4&Oç }w,7-ÙÓoƒCà¢9åÁÒ»â~Aýb°ÀÕWi9ñf»†Ç<°vƒëY³êÍÑóàœ‚å¦‰ø³zG>©þ_X̆7%ÍÚ: \ïB¿Þ¬¼ž@wxFJc¹C5Uå2̤’ÿج ÛËG®:ãD©7½Á@˜Ë n¬«Fv$-'…ÐVsPÒ╎‹ÄÀz¥Z³_å?qNónU&4!Vãî/i™¸ƒi5*×z®èd·t–Z¹Þ›È~3É€çköÖ¬üté{÷6bMºé©oq³Á‰ÐWF¨;™(vÛ;43¡ ÑkÖñD Bú`Mýî6i1’03ª{ô‚á FzD¡ïªÜÏWØÙÖ/»%«ÊöŸ¾ÑõßòÅl“_{¡>ž–íM )³ÍÔüeý¹OqÎ –cÌS§Ÿí&4ÝGçÔ^Ûø·À¤ï=ÞóµS\k0ãÿÒͽŠfªJBï-ÞL±jl›oDbä>BX²–¦¾>Ç~÷ëë3˜Ðl‰Üßú…†¿Ù.áìÓ¡ß÷iÛ}ïøG:³ï(Ìx1.¸Œò=&õî"GÏͪˆxÄ$ð;îF%ñŒ.ø Ó6n>¼dª#ŠëW%žu¹2’ÜêT²‹®WÒ‰•`ðËÏ Ëß þDÎánYÄVzÚ¶yâi&®hqn·ºBXæúªänc¾’h`™=d¢a~#³IU8&CÃ<…¯3BH>ÛʪHL[ç4Ђ"'ÔDèìR|³'Rz¡”Ó|›@¸Äû*É)eÇÈb*ÚvQß(I¥ïfŸ–÷ +àöÜèé~ àèu'Êû·¶˜fû¬Å'<^Q=vt \dNQÂcühkXŸÚŸC ¥yÞÑã꺥Y –²¼£¾•ZÇ™•ëO7ðkrhÑ:ÙHýSkŽã¸9#EÚÛ-eÌn2›0ÓÛ'ML£Ðx2hp98¼˜â.Ù°m4l¦ü…wkä^ÿ2óÆuÞl4|¬‘v‡Ù#›³hBMQw9¸wÍ`‰Â”دƠ»]$ùþ ”-R,Seì‚3 ÔBßZ žp$̬nòØzÔuMÓ†*Ég(Z±ðIZçwèd¢›Qm~1È/޼ýÙ„jv>L™ùÇDî*–{Ú–¿Ì]pTB§ê6¾°w[“Híóú¢g&l¹^¼mæ¶ë¦jæï ̾¯Sô^`éøýÞg Å[5®~èý(y«»µ py+ÊPÁLÖqè{rC\$à[Ùßóæ[…R§O[® Á¾`ÌU÷7Y÷ÅÊ[ûFá–ð-×–)!Ô†dáŒwpÑÀD]Pïè4 j—c¯›*Ö(Œ,ì_äZI"ÒÙÅ5@–ð4Uñíµ^,‹¦8ØîЬJöîUøªK¯ÙVF-ïkÁ5‡þÞÒë\Ú–S›*7nF¼ö)^ì›;ŒØ»Kš½7Qb„˜C¥r{½übài¹8ry¹1?ðV*hßqJ£ê­Ž"ÊkùÓCRžéd&¯ª»o!SI’)[§Y$ïq"m"ö)#^~T¸u~¾63Ø7”ùµË:¤|n&xfS8²_!Íýi<‹mŠß–f~×ÞAY|/Ž|å–ÔA/¬‘DÝÛ©w V+lOážåÄœæÙÙ.ýaûá\ ¯V»–\Ù šÒ‘˜ÙÒSÏup¿¾cœ[jªÓ­ªŸ:É1dôå•ÖèèE/QIƒß{bÎ1iG d¨ù áG]¦’+‹ÍéoFme4£ŒÖUì H<ažEÕ–C¼o´«Æåã1Ù "uJAŸõÁ¾& ”Q>ËýÔËpvcÙ=Ù^ÙüäA!“#‰Û„*‚¦Ù`”'yl­?9]< ÍäÁ|yoä µBï;ÅP>”¶„b‹‰K“ŸJ±öèø¹ÌmÒ€U8ðArzÈ®€;g––1£Fæ un=ݪ …V]’ÎûÚ/Kó—âsíÞ.L§½ëEk:àó=Êʼ~‚Úw•Ê^iÐô;¬gìeé­r!x:½”Ã^>öƒ½ ë´‘ÔOeñ¨˜$ï­s˜î«‘®î#u3ÖJÁ¡ÃH‚Hoà1&ˆ‡Ê xb”ç½q²¸H}úˆsÉü> stream xÚŒõP]Û²€ ãÁ5¸-ÜÝÝÝÝ…w îîî x ¸»»»»CððØ{Ÿ{vîýÿª÷ŠªÅüÚfwî1ɈUè„LíŒâv¶ÎtLôŒÜ9e&F## =##3,™ª¥³5ð?bX2u £“¥-÷"Ž@#癨‘ó‡œ-@ÚÅÀÄ`bçfâàfd032rý¡#7@ÔÈÕÒ G¶³:Á’‰ØÙ{8Zš[8¼æ”&T&..Ú¿ÝB6@GK#[€œ‘³Ðæã&FÖ;K ³Çÿ AÉkáìlÏÍÀàææFodãDoçhÎOE p³t¶(€Ž®@SÀ_äl€ÿTFKPµ°túG®bgæìfä|¬-M€¶N.¶¦@GÀÇË*R²{ í?ƲÿÐþÓ=ÓÃýÇû¯@–¶;™˜ØÙØÙzXÚšÌ,­qYzgwgZ€‘­é_†FÖNvþF®F–ÖFÆgnR}øŸòœL-íè,­ÿ*‘á¯0]³5±³±Ú:;Áþ•Ÿ¨¥#Ðä£í ÿœì[;7[¯ÿ€™¥­©Ù_E˜ºØ3¨ÙZ:¸¥Dÿcò!‚ýWft°122rp±€ »‰Ã_áU=ì+™þTàãeog0û(èciüøëådä 8;º}¼þTüo‚eb˜Zš8Œæ–¶°ÿFÿÍþáÃw´tè0~Ì€ñ¯¿ÿ>é}Œ—©­µÇ¿æŸ/ƒ‚šŠŠ¤Í?ÿW',lçð¢ceÐ1³1˜þ2ŽŸÿFÑÈò?iüá+ekfàú'Û6ýOÆ®ÿÊÿ,àÇ’·û˜Z €òß!×edc4ùøaúÿ<ê»üÿ›ð¿¢ü¿ ùÿMHÜÅÚúo5åßúÿµ‘¥µÇ >†ÖÅùcäì>ÖÀöÿšjÿYZ9 ©¥‹ÍÿÕJ9},‚­¹õÛhé$né4U´t6±øgZþ‘«ýµeÖ–¶@E;'Ë¿®ÝÇÑüÝÇj™|ù¸:œ>Fòoðcsþ÷+ÅlMìLÿZ1f6v€‘££‘ìÇ!À‹écMî1€ÞÖÎùÃðQžÀÌÎö¯eg0ý%ú‡¸ bÿ%Fƒø¿Ä `ü—X Rÿ;€Aö_úˆ¢ð_âüðSþ—>üTþ%Vƒê¿Ä`Ðø/q}Ñ¿Ä `0þ—>Þ`ò_bûЙØY´ð$¬¬Illþõÿ«· ¦ €ø~$iö/~(ÍþÀ¿”–ÿ¾Žå/tý×›í/½‹ãá>LÌÿÀt,þÀž[þͳú?êþò~gý~TnóG¢UÙþ‰ÛýÛ…ÛÏêDíÿUøÚ\þ¶Ö@3ç¥Lÿ‘þ³¸ÿ$iÿ±®vôðãÓÇàð~TùG˜>ªtú?üîã"`p¶pþÑÄlœÝìþpøèƒËøÑ×?ð£6·?NèÃÛýüïñ7þ¯e1qqü(Ìùïëìc“þ‡ÿþ8î@Øå;ž «º ¶Ç!\7ºý ¾Y²}4*:¯eÇv—gÄOÉTÕY›Ž¿„’‡{×vÅ(ïWß¼N›ë?…¶$*µ¾x¿Ä+Oï·Â.Ma L ýèLJÁ£S<ð~sðV÷ÿÞ Ú)M–çà‰¨X€öèÖ'áþ£¿|u,da_é š]îµ|†.Z-J×ÿÛY¾qö<1”3>45ê•;ÒÜý¯YÔÜÉwBéxXŸ³h–b/í-昧yÏõ Uf§.lRlm,|ð{Ô±ir/á£iÌE¯Òâµ%÷fÞbÂ\ÚÔ5:dú#æÌjKåHÛÆÞZױ妽¼d@îÚ^bmYãgGbôêVƒH4çZ–/@ü£3áõ¶_êÝfV©x+\3?ÞsZ§~MÝ^/õëÃ#t!©-Ã#»Ý>ßúðÌݘ¨Å,t"ÖV¹3ñS!ËÇÁº4€RŸ‘iW\“9_!‚y½®…Ÿq˜vе9!{AÇð.Øò¼¯c|*®ä;¶æP­ÝPõßÙåß;S¯®Š°-XÄ ³B(ó3źÃó7b)”xê€ så W[•ô¢e„² ;lK׃¤Å¬R½û‹UúVO\…ôê•j­ql…JD{g‘tãG þCÂÁ}\¿Lv~}ÿ.¬~l§þtUé&<³­Ê”Þ¡ì—Ûå¤.! Vò°;ß cLr®*ìJdÓ‹¤¡Ê÷¼;ÞUòêF[.%JFQ¼,×/sÌ꽬·$ZÜ‹]ã'ˆ~ßèÇ\×®ðH Ÿ…¼C–u° NbÐ>ܨ~ýGWEõ±€Äs ¤wqf|—htz—Ô˺R÷k_€‡-*Ü:žœhq×/ãv“2*â·YDÓ†š›Pý ^mæÜpólh B˜äS; ãgþ‰3I@QEÖ†l1Íç÷…Ä«ÏlÁgÂØ&¾*'ݺÏ÷¼Áßùt»´@I7EÂÔN`¦^Ù“sgÜ%ò•l¿ãfD`ïYV“-$å-NÃÊ2ƒ`Öêäd ÜíûRE™k@›¡DBƒìòÎS|ª‹M¹VFSdË' ¢ã®E¡@Ùú=%„(TM¹ÜW'"="í\BÞëÅÇ^ Kâ¯>Õ;Õu:¿ 9›xÉP6‚(¾hîF,Ζëv­Fê]ýîo§Ä;q8‘ 7møõ'o6c™7tú;oë±Íe}ãÓRÖÆ°ÅÕF^Ðfå±tCCMM¦À0¶¡À-GÊ)œÁX¤NrÇ-§»"/+Ó<þ-Ÿóä£$È {zs“£Œ Ó1ËK†š¤eF½¤seÝô¬Ï/,‚…ß_MÈt7.ýt[ZXX]‰t2 ¤Z j.T¿¢˜Dâ0nâ¿‘“~’ËÕb¬‹uõbßÄJZÐ}ì€9æ: g³`ó=€'e«ÎhÉЯÉ` SuÓbJŒÈx…‰h Kä´Ãà{¬R"FÈP„ô2+0Ϊ§V±K)’’Z¿?W4Ñ%bnétaÎLJ#q ±eÆÉ™ÉÌ“Œ«=C¤Ç°Ói]ì¾ÊU0÷ayn¸$¤ç…αSg´R— ô÷ |Ÿ~çêœ(Ýè+”IÂ0¡Â|ØÖ½2Ïu®$(Û™ì»{±…R=ukOC6ˆø5aÒO’ô]$9¹Å)‰~í·up›Š÷ÏÉ(q_(Tëò§ïÄ=ÒüU@ˆ%uáX a<ŸCuª8ˆ5•¡UKlÚüKÿo—ʨMÅí­âуàåíŠÙôGí²Ó~î%X:šêa(˜ƒ·wJyÕªŠï÷®yO°ÀÚûß+8޾‰ÏM‰.×qAQ†4Ö^8Ð@¥‡…8A3LvÉME#×iOlµqtƒšÜñÏÚß™¨Ë÷£Q«cåhíýBx¼ÖËÇ`ü+•X0ŽÔÕy–òÛÆÃfP«èr¶,iÛ89¿/žõ†›çòéòm ‹o=ˈ?ªæ¿¤Åw¨ûÇXSZ›Wug¯ÏTF¯5•ϧÌên¿=±*1aÖŒ}|çÚqP/nú6V HpÒÿr^àd“i‹èß ý©²ð°ˆ{O6Ç[/åªÜ.¢¸ <ÐU^´#RN‚ƒ‹TJÖò7y¢Ð’9î¶­5»h¨4L¬¸Bà ¯ Ìþ©âx‘BŒÖˆkH¢ïÆŒuùaãÖþb=ÅòˆÆÊÔ~ yW£¿ à76zƒ%ŒåòŒ ŒqN,ç`Ÿ§dñ|. (¬ýNž{óκ3“Key6¼½Ð$½k¡Ê³±[ À¹¬èBˆƒe':V·×OœNDðuï; ‡½n‘›;6ªÖެþ:›XÕøÚQ":*^®ÁZsŠDÃÃöÕ±%¼u#Úô“á§ ý­ ÍÅî2ñó-?Ï­¯çpý4¬]kõfž;øcšSÊÂ6ª“¸ûäÅÜQê&Àü·M|tƒ»ºÇ}à Êt6±‰çW¬Ôoö®7ÝÙø!ñé¿–úKé…¹ÂIÑm›´D*E˜žûœËMIJ9A¦¾È‡ÎEÊÔ€æÍòvÌ%Zû‹?SBÁ-EÉßF”€òlm›þ®èy9M¨D~ݤn‹à(ÉOÞíG B+wê*áâmˆE3 V?.°Øjî#CWJœ/¶SlïÛ™F ô%-k'žfai{PäZä:ÓŽvâ ¥0Ü­$@8s\Ñxâ–O*>rš½Lj$„2 „ÏÒÇ×X&gfuC-³ö„; cÖ¸D«s[8Sà2~/Ü'V(ÉE×è¥GÕ[g(1ô(Rª… NÒUJîÁ§._³TŸŽ>Ò—ü25(”3 , Q!Sý!ß"Ã[ M£œ¾p¦ãXœù:¤ußv®åôi«]ƒ/Ž|XÒ U|¾ƒU+8»ýu5+Ø5$EQ×Àª­$8$µ¼åLV¸÷ž’Õ¥SJÅÑGÞñšg1a› _‹}¬E1·jÔóSµ÷šBÓÑwn3ÁÖÀ6\Z6š2E¶î0ot*¶²AßKF¼asõJÿK¦ñFíÉWŒsCÙêB=èU£"µ|Ðæ~¯×0T×KÙ͵–ƒÖÄ;¦4R_4G¡÷ §äÏ=·7¶Ú›àÔé­|e#N÷Wv™Ÿ½â=à ‰DD#½0M é5|µž]0bÚÂmÛ›;)¦™’ÒMëþªž˜Ë$—åµï„@mB²Fƒ÷nþšYÏyôL?Ü—ò“ÆlbÐÓ£Ô5pÛ Nسj$47äŽYÀu®  ìä¶í~1´WÔ¨ˆ{¾È6e5ËÜm™è,ô#Ǿ8Œ– ‡ŠÞ×ëà\°ôÊ'k;á…ãŠD”lW"Ƨ£Æñ¤øõÍç‹2±M#°³GEwV?Éà>ç{ï,UWÈÏ짆â†hžO*ØðúÍ÷Ü{ÎÒµV‚'ŸÝ¿ÿ£d”á™hA_Ur‹)Lú¢JÑ|•ƒÌ“Ãç€k»´çâïl-+”¨Ù`ÇI…uˆ_ìs˜)öØ‹œòdQ¡éÂ+TdêýJSa‡cù."·2”lMy=Û@ MÐVÚg°±—g“áÕxFxSõ®.mEH¦Tni7ÏV³ºD«ùtö÷öÞ•B}VL¦h%Ÿ€<ÍJAÏií—ÎæbË™‹U7¼dò /Iéáú©@1=Hng[P,Çt”Bd-ʵèö¾ª8þö0bÈ)jI”ÍOñpADãéA”Mcj`D ²ù%¬oNSâÀ>fÅóÃe÷6‹JZ… ï:¡;¢¸¯¥ÀÐ÷ð¯L-TWçO~I­Z±îã!O©&á=\ɨ¹ÆQ™Mï‰{f66 ìJ™€ªH’§ð¾C¶%\@]mA8Ñü³ÅðtwÕkËYúo*…ˆ<<Úv¹¯gi>瘺_A¦OÊý^ßf0óaÙLÉ<-Ü%–(KA©<¤0“sšþ4G¨©¡öæóú«¡±I«¯!ZÎon‘Ìj|H²ã2RAòzx<†Ðàég$ÏQhÝÄoüŽt“k>b¿Þ ,éò§r¤U  ¶tÞ ¬7üÖóÑšîkÁÄJ¬l˜ £Šz?ºÏéB¾&!ÇÖv õr”7±PŽ ßHV §lµ¼¬V Y¼­Á\ñ« [(¤¬óÞ|·j‰öë_óïg{Fμ’  ÄªÓ.ù&ìŽôáü—,N¾€f7^dîÚ?>ÃWrºx¬‘:Þ¤¬ß&»Àšù˜8ôÒ°u{|%z[×›Ï~Æ}ì:CT£­ípΣ:°ä–¼ÉëPî[¥¬2*øã‹«wüv˜‚Âà¯p9Ú꣓àÛ¾îó Ì Î”ÔÖ%‹U;w]ê!@˜òÜÕÇÚŽö ó“WÝiúɇU¥yº%ÐfóY:áƒn–%èßrwQRp-Îßl2ðíK“2ýiæý›+…ß  =*ŸÊnhëØ²µÇ+!G"F¼Öý‚ÈÊ~›ãýŸÕ.l™Ÿ–™J^œ¢æà~oEí\Án±†×2UÚ†¼ˆòûØCј•›sYâ?—öƒê ^Ê=.éÏ4KÈüâaûUä6xÚ ±'åèp)TÊb&°©…béRá׳¾×{Ó>}y6ƒªåˆ|Œ/zÿ‹;6zÅ”à“r1ø: QÈþ”®<Žö3ÕN‹QyÑp‹ÅÎ$—ÎÜ7—wh•C,.™ì ”>U™2#MÒ=7óáÄŸ :;`ƒ…R”)ïmVÈl²ßÊ¥ºL|¼-ºHã=EwÐÔ&{âÜZµ¢iÚß*´¹'.û&‹ú³˜:o¬}—]¸ƒ †.‚`8Þg„è kaGõú+ì¸ 9Ó/†FWù¨%C:ÕȆ3cb9…=n8ÝgF¸ðùž–7²FA˜¨>V#5‡Ã‚/…û>ý¾îH—?!?¥ïÛ†:Ť1ÚR#z!V[ h—yÞF& Fò7ržÚÓÉN“¾€_Êò ëKÉz S .Ö;‡ÊZ\G[ôu_éÐÞ”F¶KåÍ‚iVÛ:6‚rìˆa¢—¿©Á´yNßšŸ˜íÅĹԋçM§óö¢i>{¬7•WL=S· ™ÿzgÐdÖë‰c-•Ì/È\¼ÉÐïžrÚÕe¥©ß~…(NH˜âà?£(ºM—´Ëk)­â >ö Qæe`v~“ë¼{rÚ/ñ{ùÂ%¥y—`VX–5 ¾ó>ùöBƒ¶\¢)vö-yˆþd›¨kª—˜ZzU…±kE‹ ïòÒjŸ|fYèHžæûAXgs+4ê *ß}Š|þ>)»k ŽªJ8É*V•lê;ëÄ·‹CLIŠ_g½O¾â˜¦ê² ´4‡Nè¿‹¶ôšÊê{!†ZDõ#U<=iTx‰–9 ³<Q32sä–ù­¨x5, ÷äÚÂøß †ß¿n·ÎÕE¥ç½S[Z4‘|¦¿‰8F a¨ Á™a½¥&$)úð@F϶Éüš%™ˆWÍkDxÖ=Äy{ПKÇLJãI‡éò>Qˆêö HºÌ±¿+õ¿M¥Qd+± ó¸“4ŲܪŒq—[£œ¯’59KÇbàÉWx¿ÈÂwTßðïÁv׫i†jã§Ú¹ÌínÐó³Î~g³ë@Ö9ÌŸçA¦•'/¥@³,‹Ð­•Wê–º‘œ¿›"ìPå>\¿Ä<”‡û¤¢Ù½ÎXË[AÕj±¥±åßÎjÖ,.Úh»J¿ôCŒJ_ršŽ ØÖÍç.L[¾I }Jô®úN .ZØàÙ3÷능mFöç’óùïßZÛl†±˜â_ 2Ý»£ÁÕr¼#)4Cƒ$‘ÔÙ¥àt Óƒ×~ñ¿r«¼€ óÏ—pQK1ú`Ì6è{-¡C_²¨­x\»ì‰g™-ß+n–ŽP‰Å…q"¼ªg=»QU]™£EŒ¢;Ìqo™Z‘7W¯¡‡Y|r„+Îjs²C kL€•—àˆÝ%®ôVš ;(Þhßx:yøöÉÎ׫ Esû™•ÏÛ´}ëb¹Œ]¸RcîãÃŽ_ÐùaÚ¸”ø*¥»öƒ ïÃälËïõ ÉjԹÊiz SèÐñwzU×tÕoì1i×ZBoP˜›úàÉdõ¸¸,Ø´×L¥ zµ ^µnMn<ˆ€•Uš_d[µ0çò­kÂ*l\!Ý?@£Ësˆ{ú²~˜©·­ïé—iôCC­RÖQ“¢Ü *¨Ð#¢wƒõ?Ë9Vöjyó‡c:¦ò™J‰à2„ùûÀÒY@Ù=uG­oÆÞ"²dXq¨Çýeè°×5ŠUö#Ç«„Ê%(û0úÖž1LÍŒ‰]2/MI*rtcVœkíi ÓÕ‰£ŠÉÅ/êe ‡ïä’¢‚è]3“ñ*5ì|=·Ðß&Ø=;«ñ-$Yô2-±w›Â±|¶SèнV¤*CÉ ¤$žþœIãE’?˜ÿ%¸+âž¶Dåv{ÞáD…B×ñS¸É«ºÕt`¤ÊY ŽoQbµiŒàNßQhîù6iZAÒ±ˆûY<ôIw9¥iõ×(Ĥ4ÛäÂ_g œ­¼@Lò2ˆGøgz?‰‡k gµKâ/ƒ›:êó Êcs%h/PZÎä´ˆ™é»5†zhÁ¼vbÅD \Õ½gL¢ûŒÂPRZò‚ãl€= pÏÿ»)Ô«õ×g¯4lÖúü¶$Äjwj¾å¯ÙYœõjI•b'ëhMU›ŒÖ“#}ù<Ò#,9Œ¡áœš¦u£Œ›¶ÆwÝl³˜ê=§3ÜJ¥ðµlÜ YEƒo¢q‹%BRª¥øê‰Û½¢ïî’mˆqòBv3ÅïôJü‚~~=ÇW´æÛ[ß-A¢ƒûàËÁ¯qwN±rÙ$QõYˆÎ…¼ÿÞ`UÏVáOEа;‡œè¼MBÖ‹Qÿþq’j ®¼ùv© §^»ñ)(iD cC¯ánãÒ„MÏqZÑäÍl}dí‡xuç8»…ömÍBµ-â´ŸL’hOÐ]ÚbÓzYH/ÞIÆ£ª0¯~û \V9eŽ«O¿º±RTZ“3x†\ø*%|˜µÑ_ˆm›im·ò^2|eÉÄ/Wg·©w$÷bàë ±O|n˜J7XãGçx¸°ª/;X‹4°¶v‡®ÞÛ¹¿ Ù£æ¼ÆÅîu¥ákÞŠh´$§1¤·Û$‰›Tx]­§R!)«.ÍéÙþàè_ùÈËâW|iá0æ{WºÉ‰ì9 íXŽ/‚Æ8\Q);”2G¢ýå?šÐ _ôm´Žzè†úÓÙ'ì›·®"Ì %!Õ¹{ƒDÑëì„ ,´¬>5§¿¡^ñ+ÊH³SÀýõv£~—o<ÅãkV…èý¥óš’ÂtB›!!]i±šõ[óì«ÅОh¥™oæ¢Æ˜}pÂyiÀé÷dòAì¾FÎ'ÀvM­âŒÎ ÞÚ†Ùb’ýò C'Îx·¾ p,‘‚z¼ÑÖ<„LXB.G«ôÞë ¶ûTLFÂçn$í·Á§[.ÜÓæôt£ÛteŠöÜq½Êi|va!X—<Ö™¤ü/€Å„×/¥žËpUóמǣUžCûõWâzЉƒÞ£¢ÑšìFÊãć.Iª9šÈç2Ô BY=bP«êCúYnäE`‡é\”6YY9%lÈ±ÆØSatËÖÏM@>‘YÙ1l2;ܪ®ùÞ¦ƒõå*±ÁPrÃýp<Öѯ]÷3ÂðÄ$ý{(©'!•Þ °âÃÞFÈ)sÆól×{!’pŸÖÓF ¤ÊMš…ó¾i­Œ>òÈA˦|úäMê=jÊÑawÀ"´˜,E€ß7ÝøV¼ÌªÎ s)µØuGÊoêïTѪo0u•šJ¶]/:·F¼•·¶bÜKÜ-&Ûáÿ¶°;µæ¯QÞúc¨g™@¸ôöØÇSÀð4_½ÆÕÕ¨jÙ7¬JKÓÂÂãµÅõ àþ9ƒl"7F@á-þz¢1}²=¹´¿{YÜÂz“þ“¦hàÁï÷\2œÜƒš˜ûÊAà~¶”Òf0,É=So_'W ¯FIO\ã1‚T$•¡»±ZÑšÏî™[}%ç‰Ù.d)„mQU“zi .×q_Fb]”òæÉ÷ /¶Ý¢”Ö4“fïèt••Ò"ꑎ¶†t¨é|á¹ú½Tˆ½™#¾\d ¦“‹?°mf5C¡¿ÖZy‹qצ¹ƒáÌFEþÁ'4ºÌ¸WÍáðªÃ)« úJ"‰èŒ{8e—}pê9]òI”F£ ‰kÚT«@Rñ‰¹ô«HHžç~n»/ÂÜ"{8VÛp ãîôèOÂEÝ ßäo®…1Ô§Á™$+e:ßÄ¿gVè*i†<[Q‰(vÅçæÈgï¶w–ȯrl-Ï`h™‡Ú,yø|Ü‘´ÇýX¬¿\Ú£*"Ð<Ø…cÆ,¯^: S†±@ŸÙéoe xëE„NfGм‡ònýÂèÛU0§ß€è´¯ïYÝÖ™B]“ܦ€Û²­¢¬¹<¼`¾ç‘*öGޏÎvW¸AY2Ç[>Ü7ÓnB‡;+4¢ C´†¡£ï^s¿EQ=à9Ý‚iAr^Ò¤¹o’(V8öf8Ÿsˆ²±áâ2Uoïïšö+L—r?¼2I6&,‡ÞktV"Y2\IêVÇû ÷ǃf…ý¸!mv&V_^w¨‹O”mZ"M®ÙEß‹òÝ—O¾ yïÃFøÄðxÄšƒz͘uuп¶æí¢ùx{ã8I´§i~‰Ž…åãPÜBãÔÐMeŒºüõÜýiÎï&9ŠJöÌd¨X°{wíò'>õÝ-{~ ±î½I.ÕYýôE:Xˆ]X¥4‘I0((@àÉ!¥[¿³x5h*æºfEÀ!Ìý/Hv­âPzðê¥Æ”àæl Ô€»Âxº²Àˆ%6Û&³«´U}l¿Mx„0*ލ»¥TºÏ"piªAŒýÒ·Ù3š•e¬áV%àîMíª’_ÕðQì¯ó» —Rõȃ ´f^^ƒ3Xl‰L·ºAU%s±ù‹LÅeØðxèŸð îc“UVÐuf¦cÜ’Y§ÙìlÙÕl‚Z„¾j¦¢S<ž ²"ñˆ§ø•uûc_£‘hñBµ%¦(Ý`ËÌ]ö~ù„(û«o=¼^ ǰ³½ö¥yhv§»·¨pgðdpWÁâÛ}ÞQÿK¶u·¤îQÞ‚V¤$c‘Ô ’°’;1ˆ*ÖþÓJ(=)Ñòç驹BsKÔ$8¹D9ž¢œÅøx|)‘ÎX P:¸–Ü3o§¹#±<‚‡ßm±¡n+J=FCTY«7t©Œ—%$ÎØ¬×]%)p¢&u»‹÷¸ Ïòšk-ø”õ?WhjÀ‰ ~FûüDê|Žcô“D,:¸šÛUà7·«ë*£Ý,›ó%I"9úåŒJªë ê*D@Ñ>Ýäåy`‹\4XÆ´/|)1–ØêœUe竈o¬7U´!²`~5}{4+ñ,;6¨’‹”§…ÚM!¨°ò Zò´­U±s¡¥Ã~H­À±mŠž9Ñ£ÌåX·,¹¾)–/jç¾$íaAt˜ Ü‘øóŠxŽEþ£RZª¢~!#)¥´Y5œàÊN6}ÛÈÈb¸MKfíwOc»ü–œ’’z¶Éqm]üòàm]²×ÔöÁ×òþHT%:&Ìw&4oM^̘ù“j°+¾Žy´ïaÒíýUœ7‹¤µf±ÿZè— Sþ vXs}Bî>(½ÕÈ*ù‹êìÛ\4﬑hb¤âD°³@á·»»é×:‚/Ÿ¢YJt©q¿¶_1.LüTâ9°CPí‘c;£Èz½¢ÿü¾äß-¼JiqøÅ|ì{Úiwk•êË|±ƒè>^p+£y‰Àên¶âí­Y¤uï¼Aâ8Ÿzê:JÑI(²1çëÙæ/ óµtßJ§&EÅÂIZXζÕSö¼˜«Ù›z—ø^Q‚7â ƒŸcàÔ6;£‹¬qþ0ná*ÊÖ9.;–é®ïÅåZ[\d8Ï­á_øë¼µóX¼îG§[qꯋå¼å"¶Ǫ=Öa#œc¡Âß<$¬˜m±ÄXjdÛoD,äb. ü±Û U~‰æÝ$ Ön»WËñÄónÓF52«}õŠV ÔCg] ¢Jñ(½È,–é(ì玲ƒ»2œúÚF¢y¶[§ ¶î„qc3$¶i¢œ/2plrÒyÇûjU3y•f”òŽN/$È¡u8ÜÚŸò„ð¦rËú“ïT·¤.Q¨‹Åºc@%5ØhyÛͲêöAÜÉ}®@@êÇk+9ßÓ!LAéV# üHµ`Kˆ·P8Ò{ûÓ‡^*h£x [¹¸J-.™ú¢6îRYÖtÓT>jRìbñÊ׺©§69Ü/Éö»Âq$æq%ÄË´\Ü–¬wbù( LïÂî}á~ëo¬¦}?¿ÀÓÇSEšåÐßüÖët]Uî°+¥{Îø|`ÍÃô…ûkÙ‘CEÚ51h"ü—IË8”‘öó4Ö½. ÉÌŒHÃa3œÿåè•ái¹ÞpéË;¯ƒ¶®¤=z*‹Šb7ÜuíùÄ„¥í8íouØ'Uðþ°­nt¨Iî:ÚÊrÙá"삵ÔôÂ~÷“¾c:wPqV˨²¹ ƒo“KõêWßj »®†˜u7JÇ&‡³h»Ù+(†\¡h¡áÄðåeÞ_´©Ý‘зm ìÇ rð¾&°›!ìÚ]†8ŽP’VµŸ¦éww#¹}#2Ðë<è.åÏÔF““§°OC’røÌÍ» *Š(Cüõmƒµ$Ü»\iɱ§ó•Щ<ŠÅ!¯Œ,z[ð´È×h>m vb3töYx`Üô3ƸÑDK±ƒƒ%í  •¼NïÀWâÌûMÜåîˆhI¾Ý˜-0nZœ‘%Q äºg§p‡Stç¦^nÖÚ†V¡"LoBžvª~˜>¨}·~¡P+Oh€ëP(C¤æ%cà…9 ‚«f'þ¥`“w¬ª"<@7C—ŸdÛ¦_‚âsÞ0ž LXÝê‰ëß.äŒyÁ\MñÞšÓvœOòF­B¢ê†‰]üµ ]ãåòeƒ%â’ë[óU û›Á")Z"Ýó±Pݲ°‹îws%Û Jç³’"…|¢a§¡_.´Lœ¼=8°l9‰‘/Éú3 ûõí¬©ÓêbC¯¤ÿ÷‰Æ\”¥úg~‚Z,¿Ú¬úôOmêºSá|¹!ÊcE´¤ÇqM$¾k¢äÏ¥|Ñl}žhõ VC¹BäË]g+~ÓØÂr!<…£­C²÷_a™ê¬S0ð4£RÚóîÙ­§ÔÌа¥›\mŽóf#có¦ÌÈákü-5g 1·½YEÍÓx–ˆƒSXwy*\ÖνuˆÞfUZ¾ÞlZ5ArsqÈëéÏËvª?… çäÖ<0¦:P§‹ÃN"«ù-2È”ÙEI] äWŒ„ƒÙ (¦3Ô¹úž0I¶Y[ˆýÖ•ÿ”91ê‡H)Ÿ¿/jUeÀëF!»Z+ÝNNÖKôøë%”©üf½ÝíÓfgA=nË·/; ñÙ·w°[©+Õ׎«‹4ô\©º—¨Gð÷ÒT®ba¡WoÙ©-ìëGò uÕ‡„l9ãá)g]*‚.C‚OÖ-Ûm¬•¨µCYG-Ì̘ùMÍÛœsU7r_ÓÑDóàq¹š<3Ÿý"«‚y9YÇÍcÞèGz‘ÜÅ §jF·eδ…´DºÖúýV{œi“犄¹QÚŒ&So’F¸U/¦® $.P®e7½{Õ¯|MbXkf®ï¹§ k–…mŸ–›¯¦ç ;BªD¿•x 7Íì òŒÞ·ÂìVÞ÷:eÅÜä5p.nÓ W®#Ùp[ܨ»ELsf%ÒFÅ^¬“ê ·tÖ­1>„¼Ü%ÿ .0}¯Ó,½e{a9õëY(;'ÊÁ ¿]#Ó{Ò­®6D⊮šÇéšÝ«bÐïP5hf•À.Ï‚y$ØÏÿTñ+7Ãt@VDaˆBahÁÏRbÇqÙÖý™à™G6šû¹W*;eíØWsýºF½V«iæKèvŠJÄíâm¸SqÅ uðÓ¹$:6` TéKÇW/Xú(8üëxÎ,dŒ;d©†ÜÇr7£—¿ç)1Þt÷‰‹¼¶MÏ‘î²ÍªSÏsíÝѨ@KH'˜F"Ëvj£»XuÓ?'æNIòßçI¼|qBßW|Jÿ¹øõÁ‚¾ÌÖ5ÚééªûÄ&éa`pÇor‹õuí½—_é]³µ}„X‹ Âw´÷BÍ;&·æØÌ\{£‹®ˆ(¿£±n«s¾ ±dZ­V—˜C¼Ð(êD§Aª}`‘c=T†aæçVëw‘D÷’%.ö‡[o8w¦Ñ€«/Ñ› ²È¼†{X¶pýu™Ò…uѹL@—¾]-7_àì2v†_µ‰¿ž¿d‘Y’üIG^ƒr‡Sí9Ä"íÇ2("+…·1L ¢üF?Õïa~“Â53Id3ÚÁB}|ê3_3ñm:'qÈXèÚBüöçÝÞ[¥dú!êÓ±!HìaX2N¿ P-,JŽfú‚«´ÐÅëÜŠ§=Q¼ªkýà Šó´ æTè*ùTTXÏ^­“)f,ØÜƒj÷r#rbíi0Tw $¯ ÌÀξ½0Ý 7:š€qŸ¯Ü£&´,êTxð 9Iz î×ÕL$'È©¿ÒeÊapÌqây¾‹’¹ˆoóG8ŒF¬ËñkXoIªó25¬ó#q iF_9Þ¶ev%\SÝ ²p hi!ûâD—"3FÜ-£”òì#Ö¢ìž púñ;ùXI±^lÀC5™(>FyšÆc=sR‚EI]¤t g«épÂ5™—Ä@t­9ˆ´ËYÕçÆHœø¸lS§òç,ÑQ ¶`Ya”7¹`B©ÜNvZÔ§Äç[Àq¬ {¥q¶U%J¹O>@½¯Þ¶X¿|‰D˜«Œ_+Ùnw9‘•‘þ¡iZ#.ø˜;Ê›30|O+<ïRœ­s0ôdNÇÀ²ã…Ÿóû¡28ï÷ÓŒ‡UakõR ÃoÒU¬Gð'þj¼,tàüù ^üÀ¤Y¬]fgzöB|™*^ÕÍ_4¹q\¢TýqÒ 9×ÈÕäÚ+0da‡Uˆqp¿„‰J‡K¢4c /–6øWñ¶±Õ ëåV_Ô^ÁüeØÏMr< ~gEcx*²é‰šãµ½+ÇØäýh†×|ÖèCLèŸYmjÅåÆíûT<”뫳g¨!ÜùÛ@¹ä/]P/&ô’ÁÌwõB„ØÇn®i]ä™Oo͈õÀGqŸï¡Ò û”þ_¤s¿ëàâ.²uµ„µ\÷ 7€X‚ì‡EõTVnŸì±d„‡+ÉÚ]cêfpŠûѺ~ØŒ¶‚•FÑg|‡ÄS®ù¢?"ŸÝúÕÜä2´6¦½ š]w6Œ8¿—þ.Öô†…¼ä¦Ãk/0öÁÈ"ø$bçÁ¶3PËkû¦¡$ÓÂb©e¿£ùwÃ{£ÏàȨ@4㼄¾u9"XÂÃ’-²u`ôw¶«€mgˆ$‰-’bœ‘r¡ÙKVEpDŒgîÆ&0Y²X’©±-²‚úÒ6ÇÑ™ Ò¶!þÕâ¡&mò(÷á>ÔG²ÊTM Ì[oÉÍ^ æªUºõWìN;qúØŽÃ ä×^´€+bóýM˜wþ-Óª ] íÆÕ\…Fd]dz¬ F]8™ÖP-+áa&ÈÒD:ƒÍYFë ¤lú(rä°¹JÿOÉ?ðaRç]0Uïyœ‹¡uÀYóÑ! M‹ñ›¹vžâ†ê„#ïÊv›Ô¦œÍ°­ s_µä~Øò£!±Ô—©½wätʬX–¡ÛË úˆ\°H`}R¹Xlý\šÊIø:ÞUJØ.ÐùRè¼Û³Üæ©X5`˜Qy®ŠõÛ”`=±:FpÜô.@OûÌeØšfgÜgÏR0žO¶œô°V;p‘Ô…o1¤Ù)Ih’ªv"ëkvfòê >ʹ[ ²–'T¯ÇÃÂvÍÕöG‚X°œoã…ÞæA¼æÕÎpé3£Ì8b xd!Æú"Ltîþg#ׂˆd³ÑìFÃS»Hô?€«}'Îa=z;W4¸ä ½öE¥öÈÁ(ˆö<Ž¿p½£¸|¸¬;L[¿°Ê"E"ôsMò´£R÷Rdƒ‹&Fc æùŸ[™´r¤L-Isè×[Fç&ïáTû'ß”e y¸T“ãbV:ún긆NìW4«jäõ&‹â±×ПØ9LßWAAùt1“O—ŠOÛöZP£MÇ:*Un[eñ§¨lþõûldÓiû¼Bj:e®QÕ,AÈäü8á²ÛZ%äÂF Æw ‘ÖJK+çÈÂÆtûÛiïAФžßá:ޙϻ,kå= ÄÜB˜ëÂ÷¾GŽž 9ÚÄB­QÇ`¿Ä§ø7ØMUÖú\;‹†^Qà/‚$¡ÐÓò–ýé†2sé&8Þ0}I”FKDv@"">Ç}“oþfÝ¡C¹OˆÕÁŒK>Õ\öMõUX¶îhc¡émç‘)õWdÖå5UT"T‘æ9_È•¨n›”²ïÀÀf]eû±·5…œF‡ÿTõäHhµï×·!–ýªàõä ^KööLެ‘¯ä}­ ÜʤûŠm "Bd{K)ãÝ0Ã9ÈÏoR<Ð,¹epbƒŽJ”—[ú>ñ"r VU¯Á²:_kBH @¹&$§xßÔ›ä.ÂÍÃkªV™ßý©í†º×‰¹ayþ¡ôz/¸ñfÌú‚ø“Ó,šÑù£MÒ¥aD­^Y³tÙÞÑlT²ÔBz.=•GJôèg˜Œæ~±!Bðñó­%WlÌH…œ•üÙ]U¼¸ «ŽC˜qpƒÝg(&åæõE†‘š&™ü)[P)©Q PÒÐõº7HC—$ƒq8iW‹»Æ{½ÀÕòÏõ·[¡U¤¢-z¤xc D#œÖñw}†µòZg°aGG¡o0KÞC’22";¼N/ôéÝV–gqiÝŸ‘( ;Ïãäû¬éL#S‘|'X³ó`â=Ù^¾ô*Ñ<÷ÓW3_Ì¿CTtY¡à*¤Ö*ˆ¿Òzò¹†<Ê Ôd…ûÀƒÁM"8z|‹ÜŽ÷šŒ‹SƤ€ò.§§‘vq^ÜËãÓæé{˜_s€Ò Œ›ªæ×µ¹#ŽÑoìè{:’£aKj•ÙÕé+‘•-Z$)°3%,©°ižð²NyöFÚec=kÈ`v+ªÝ‡ ÇÉË`ŸÕžúa@B/¦}[rè´ ÛwÂ_e‡<ƒÇt*z¾´û8{‹p#E#ðfõ¸øó‘Z)ˆÏ_¡êIVe?•/¬Výû™øÚ5A:UzB•ê‡"íåbš»qŠnXÀL«¡•¾×–®™Ýcµ„é¸cÚòŠÎÛ5áV‘ÃFüŪ´,µÒ’îWÁ¹S«wíŒ;ò¤.Í—[Ï^yÜ/x)0º^%€QÕ.c_ zûã¾¥ðj‘L¹Æ{‰åÄL4Ú+Ê]cFGxn0¬F¿A•7åÕ›ðˆv$†•­ö§m“'gbvמÄÊëì\zÊïÝ´ìâôº¦¡|¾i쨮(«¥—í_ÄU‡ä¢½ TY:4LÖL}ž¢‘H‘3©c1]¤€ËdâŒÕqÜÇÄpòSÌ×"öŸUu!Lƒ a2Ä+_s§²’Rce´°±;9dmøÊ3K¿áâ³P(oLÙ'¡òr‘õàÒ{¶De•p40d –\¸÷QW¸vÉ“áù©·¯Ù‘ýeÎ=ý›C_Œ/|~u‹Ži¼ÚCÀ]6âÑ=QT.¨%ÇÀ¼Èa¶®aRŸk(бJ8Vmw&²ÇƒÃ-À=Á.Xø™0,3Wê”q°›Dàó‰íìOBg—K,6•Ž©®-«|ÈúBæÙN üCØÂ¾‡ö‰¥Öè¦r¼­\'\YùCñí™RÃ7ȈŒü9ZàùÖ³dâÖ²  p º‹ÝéfÝ!•®eÐΪwdҚВZ.ª$±,êÔËhà2miB.þŽÓ-íÚ—R$Htï,K»G¨WÛOµ*X3ë¦×›³Û&yìi=Qɧ’žä¶á”¢o¾1—Ï×Ð[tßÄeôfa,Æf[ §Ý¡¹6ÌNq“B `k¬Ur¦òq$¾‰¸‰Nq1cÎ9½ìulq#…³<¥EpÎ4ʆ{1c›ž'1Ðf 6Ñ"]hßñ>aÍì ƒA™ˆ §Ê?}¯€-¤³Q¼E9Ñ2YZ}´?ÒCµ]}ÅŠ£W×8zÙYçö ›4æ‰LÏãÅ]>áS²2HIJ؂¯#y›`+ôãL󟳛ÝõÛƒX,a%¨6ç1„ ƒ¡æ`&#OÆL®Tg:RÃñªºùY Q.½ÍÃE¯áU+;«ä¾™Í./Ãmœon/^g7v’Tò©q*ðÍÔ™/­Qý]Þ¦p嬊öžýš‡ö¼¥høOfLµaªjÌâGG²±ÿäO"×(ϪEô‹Ô¨·£ÀtTB„÷C1ïùz6qŸµzÍÉ/Ï•ZbÏ ¤p·ÃZ]~•·¼ãÆ3­°ˆš$þ»^žJ¥û¼Ž]>5ù{wkœ ßëÖ ÂŠº¸Ñ¿-a•Jü6ãÑá*t6o7ŒN‡öí-U†$Ù7·38Óž‚×QÐovU£û+.R3å ú”ì~v÷ªüï‚!r¥%¤¢l[«Ìš©t}õ\ëGÞïëÜxªÜ“-J­´xS©ÏN# a•îô$yɱÕuºTLà°Í/2(`´­ù-ÁþÎy\ktŠGLÜ[ƒ“?eCeúÚØÓRšÅV—¼Öï¸NñT¨÷þÅVîf1»ËúÔè飰¬´pâ[9VÍ‚òúvqà’bD_áë@DÃLÅ b“µßS7¥R#NlMÛäRjµÙ|#U ä.“òLßÿ[¤ø&¨× ]®*éáE °– Ë2Í’cë±A;wEbþòÐíÆB†UÕE¢]Zÿu£0Þˆ¡·®7e=¦e÷:ÜþA-eûQ©È*¢÷¬Ìô*g*A7›~ùõ‚©×ž µ´Àç¸Å t€mòg„Hå±’ýÉþÀ‚2æ@?wܾ4/ñÃH 1—Ýf@ʦóq¥•:f>túr΄Y¶;Q ½;Àkð(ÕqÞܶh '£Äâ(1Ê/jÈcÏ'ùdW£©™gÌA–¤” èæþŒ°)x²pŒÀ“*;¥ðÓè–tùHÂâ-! Ç®È:‹á—¯’üUc ÑyÚì 'œ·Äµ–ìðµçuëÄÅ}…{Ð äê5 Ñq“ÈtA™$—(|z‘ç'9uœÖ¸E#ÿ²ºY¹bاX)؃¥SÒ!zòùø$Ì]g²„ÁOèÝù’,¾Ï™óJHŒÿrlð¬ É–sj¨{î4B´Ð9ºðGþðáêˆöQ‚<ä}•ÃŽÉÕ“úHÊB °6L·©æjÍùÁ²õƾ{w`(ónþà;7?mUq+€ D½KÑy™¦î,ÌÒ /Ë))‡ü”µ«rÔ±|[[-ÊbF+wd{†¶ßCÀ§ÛgÝÒG£VïŠ=ÃHÐþòúà?8™pLàÊîŠ Õõ#'êB>à¼TXû63XÊÝrè-¯õážz×=ìæ'_Æà°x?ÿùiokv ùñŒ®?ëë¸ÕˆÖœàŽÓéߪƒÊlÐo¶ìE = ly+“ý] oâå1„w©òƒàOD ÄY:PsRUe‚–&G:™¸9Gn_øœ7‘ÜsïòÉ i(#ñšBU’ª³œÐÅ€¦/¸ºº¿^Sšƒ0vþ ‘ž'ÇíiWÿ‡Ò{vg{¯ô€ ÅÿÊË[»ÓXLÞCr±v Åî¯!I.ôBE'¼&e eë úWé$©vÛ×;Þ1gý$›ï±‰¾à6†ïÇD—TØíèPº¢  K ÷”ôŒÒ:EÊÞ«;¤K¼}%Ù¶™ÚªùÚÑ]-þ«Ànäyªš‚Ö÷&볌ž¯ç±ªÍ÷0C(N·77H;MÓOv÷¬ÆÉóÑ_xKp§æ™œK°7=NüþCº¬w€"”a“B-›I;üG™v øK1ÖUçäUq<ÏŽ=÷hS,Ã1çbÃ×ÊèW¢¨žl5{‹ÏŠ"ÚA6‘Àž#ôlôÉ˦ڹåQCˆIn6Ë«âC@âåÖ&‡;‹'ÎÙÉ_ÿì’…{<µ™Hó˜F²²EŠ· îh‘iÙœµ–æ{•þÂ'bbßÌMúº7ÃÈqA˜ch9—ÎIª@âh­ê£Ä oÂ&ÄY “ï¢6àù¤«d¡d³u©÷ìEü±ž]˜ç±wêxyßEùbKÀ?M,¶¡¹ðŽÞ§EIÓÉ7u­[ÖUfˆ¹^­¥FõßC(È|1KUÇ28K@g @×rÉPN¼I>+˜x ýÑ£:{Ìîæ’LúêÜo*d+"_—÷vŠ9Fg(‡}ŧРw6½ åo“rî›]&ÎZ2»«æM9Ñþ§;£„Ƨw€dæ.ï~ïJ ï-Û0Fv®±¥á-Î¥%äàîŤlv x®Ð–‘Hn!œÇ‹t¤nžëø†ÆgF{ \>NäÞzJH‡:йßÉJ…¾ü(>r0ùt iæÌ8 ÑoUÿ¸&KÁpGCGXG°$³¦Ÿ5“ÿi"0‰î~ÆßaåÀ¾²äq¡tT1•aƒhcT1¡R[6&¨¤;öPñÊ\ÁùÇ¡¡+M à²ÅeQ3ô[ ]a`$ê8á­[„Y4Jñ¼Ó9Óoõ”¯ Ø4ºsaÎ… HÚé ]àŽÚÝãÄ£~ëLÍ­/Ȁࠊ+Kc`„›9šKWR–ŸaÇ@45¿’„ž«ï ¦Z‘¼ú0U9×Tl¤à¯–úð’x%îä íÏ­‰Ÿb¬0T²È…Jƒˆ$sÈ=;+:~e8'ʦ j-&‡0¬V?™Ö2¢!o5÷r4ÿÆ~üÝ ­Ö|°$Ûiòç Ò°zÃD´Š8žf^KÓ|ô¨é.u ŽÜ¡ÙPïâ˜â;07ä×@3wœ´•îPï 5ý©l@ Åß,è$7.êô¶ì;î€.çû}tIÀŒ5ßµ,€© endstream endobj 88 0 obj << /Length1 1640 /Length2 8769 /Length3 0 /Length 9841 /Filter /FlateDecode >> stream xÚ¶PØ.Œî0¸Ãà܃Â0 0ÈÃàî$¸»Cp·àA‚» ‚ÙÝ»»÷þÕ{5UÌ|Ý_÷éîóõ)˜è´t¸d,Ì!Š0/7P §®ÍËù¹@>,&&](Âò—‹Iw†:ÀÄþEƒC@ˆ›<ñÀSw€T]ì¼ü^!1^a1 ÀŠþ‡èȃ\¡un€ª âŒÅ$çàè‡ZY#ŽùÏO+˜ À+**ÌùG8@Ƈ‚A0€:a ±8 ²è8€¡„Ç¥`•°F ÅxxÜÜܸAöÎÜp+I6N€a І8Cà® Àï† {ÈŸqc1t­¡ÎÚu,n 8ð`°ƒ‚!0燘x8 £¢Ðt„Àþ$«ýIàü5/7ïßéþŠþ û#;Ø;‚`P˜Àjh*ªq#ÜœÌâ7dçìðrAí@æ„?*e^@ þÕž3uD8s;Cí~·Èó;ÍÔ`rööÂëw}òP8ü0vž?oÖæàóú XBa–¿›°pqäуA\ *òQLXÿج € @œw°5ÏïôºŽ?œ¼¿Íøx9:8,š€ø@-!_X^Î WwøxýÛñß‹—`#æ+( ëŸìfˆåŸøáòáPwÀ+àƒöxÀߟ¿™<ÈËÂfçñýûåQÐÒ|©­ÎñgÇûdeÜ^\ü.>A^€¨ˆ@Xðùï,Z è_Uÿ UY:Dÿ,öaJÿ)Øõ¯ûgýk7ØÿKÃáA´ë?7 ÁxÿŸ•þGÈÿŸÀgù¿iü Rt±³ûÃÍú‡ÿÿãÙCí<þ"AA€ïÃ*Z@ÜÿÐ0€‡æ€x<´ç°t€cý¾Qa €Gñ·éO$ àÑü‰ðxtþF¢ÂÐ?HÀcþzˆÿÐÃfþÃæ}P.ä_ðaý/øÌîÈûPì_ð!ÖáŸäG=<¦ÿr?ä‚ÿ Úæq†¸Bþ/àAüCxȆ°†CþÉð0Z„Û¿Nx¨ÆÿÓð_ûÀáÏÍëðpÿÁ¼mˆ;Œµ0ë¶© ‘¡rãÚùølšiÇ •ËkÞér‹‡‘ÄV¸¿”Ié%XÞR`½^¤ýéuØÚ€Ö–ð¢ý‡÷Ýë8íÉv¬ùOdƒ…‡2õÔ˜O¹t¥w½:yëØ¢¶"w©2å:¹ˆàiå_»õ+¹×”/…Îî¼Ø­zŽ}W>Å­eP2Ôgžõ™‚ÁEý˜èÄæârš(gâžV5ŽËçk4‘—Ñ:_ÌÍgÏ•wº|ÎÝOŸQP£^M2{Éî%«’Ïy•­ÁÇR>“uŽoØ'òÚí±zîhh_Ã÷¿›23Mˆ±>¡àA%QyµÖ¦o_B.u²¬ºæ®ò]¸ÕÜ™S3z¯i'\/¨-ºÓs›S﹇ÁJZgȦmMšTO ë £FΩgÆ /رº‹&_5¯Œ®4¶ˆâ™)P·vúoZeÖ¹ì¯èÒ,»«ÌœªzN…»îo±Û‘œœƒ3»vÇ-쟘"'156>Û«iKÊ‘Çæ zCVŸEír)ÚJ…FÍ”™žÛÊߨ…=ôÚ¤nç›-£z¯}À ë:|à`‹¤\¯ü^¦º2W$“°S#6æ¦%lcÜ…LéÓ†˜ü*Q؆jxÌ/ÖÐü3ƒÊÞ³ñ÷gÇ&\@ îr+Y| »Db£lÍ·jÇÓy1‚T¦¢ }$¿ÄJž·±£ySÄ ¾÷ê‹,†ù—Ï*p®=ÉþáÔB.Ùi4Mq?L®{1ð‹Å°oÿÈo?$¢úgDü‰‡ÑˆÖ¢åÑV> ™ä}íü²ãÞýdŸØ!±âîÕrЙкÎËÏOÂý3ŸÛÑXNòm(iˆ•à /j`òð1ÖMÐS*Q¥@kÿ(߉£³6 ~I Ü‹® Õ>¤Yr5'ö7]LT![n,¼¹Îg¦ò®MQÙ™ÜJý :°w£ão…ñdžÓ?¸³tÞ$¨ŸÓ²….IŒ4G}sý©5míÏ Á«Â ùzÇy¥°½XñÊÊ¥¦oëˆÌ|Ýf‰z}ŸŸwò7Ç^«‚Íåv+–™OÈËÌÑrÖ?‚üjâŽ#úè§Õ)µzÅ„q»Æ»3¼SšZ)ýôÒ)r÷© CÈ70•#´xô9NOþ~Šðr¯Ô‹Tf² ”~£þ¶”_…”ö/úYˆE…6æU„ÑóA";,ò™(“ô´†À‚ÓÑ–ôŽƒ ‹Ùýd’)\©¡x«GÓ±Lqݤévs¹zì…(Yº ÷>4‰#(ê½*š{5ŽXOÁîòÄñKí/VC;¢¾ÕŸöûvz·¤žtå&,ap©Rì–´k×Þo?_N²æ+œ+õ vI£µãÂl3|=÷ G‹‘š—’}«[ªÙQõ29lÙS+Â^õc¢·¿#I§Ö‹è{öÍã8šBð‚Ô1ñ¤E;Gïªå;1ó°£­”øm K2×zFYqÒ$Bå^Æ}¬€qƒnÙŠV•BÙ_éi…¸v>Ò‘ÞºÿW):»âhõ…w“|VÄš{KÜ$!ºý ·Mn ~lR­¨Er×r“õÍI„M7m3²Ë.TÅßq±4ºÙÏp¢•žv®/xgÄÏôÑ„ëރǫÖò÷ðFJífü6„¦¬Ó…Ð^aò-¬5~ÊyKCk´îªwž¾iסåÍĦ?Ô‚gÒ6W‘EMDôŒ¹„õåÙ¹jLŸsjðkꂱºø44¿Jo/íÀüh¡þ†ìÑÙ”Xa•+JŒò0ÿáT¾ÊŸõ ’ˆ»&œûTialé{$ÒÖø§ÜÏ¿ÆiͲ§¬YßMmq¸'¹Žú„ÖI½#Tšå'”§K 4mŠmÌ›ÎyËÎÜ*pê8ßt¾Û„ ÒäÆšZãgØJŸê¼‹Ù¡•³35EóYlâr•n›\ƒÜ¯bJ×¶ÿ*ÆÈmöŽtS„'€ID×´HY·³%lEÚ1ªÅ“Ê…‡”y šR´•)ÚßWNû£Ïîè5’Îq*>õg_Š F%~ ¢ÝqŒÀ£ÒÐÁùôŠŽ¹øíÓF?ïÏWöL(’º¶5÷á.!5/¥Õa‘Í. ̘¤(ñ_ˆPŸ»)ñ[QûÿïÀ¶(BoY¶uÀ§låû‰“ ·qváÒ-´™*7û†‰rà¥î‹öyÔ¥ÍRŽÃ,/µz9ÌGíW,ÒI‚˜æ¯Fž1³+é /Ó9Ó1;¤H¤#-1 ªXxÁ²8oƆ+^‚>×(“bÊÄùYÉT^$>9“XGOùáê-q$„1£´°-ˆv2 ’܉uT!¯dªa¥1r¨¦ nU1ç2~ÍøñVÛƒè€Áÿj¢FtnSí»„tF±Ç\A&²3“ãY;¥ä.Ú=6CoJ^yã¯MPHìæmDg:€ÿÞM4gY;õm¤jŸ- @Åc^¥qÿ•…2íõùR/ÿN'áé÷ýÚ€ Më U™¡´ôúIÓ"Qלé·ìT,*öˆ–é*1 †ã”À‚Dµiª]¶{n]È]§66rb†_xz#ûi.z@×¶èn.¹NÕ€¼±í|e¼9cÍ­þéPh¹)"YÀÇZ·ª¬ïW®T)âÔlÆbY/z²1Ah—_Oš|ª¡y@±ÈàBÂÕÔÍ~¬¿ÃÕÎÚL§ÚØlôÞÃp ³³”ΤÚsnYzŽ»É¿ì†Gð(i‚+6A^­Að5|Ayg¿ÒÉ*°¤š‡þ¥$`Ïj¼Z‹)á;àÅAWr·{îŒÌOðá@êhÛD^þÝK‹Ö`v±ìk‡h ³ðü|õ[-óà¨P.Xa\Ø~5âQ¼ CcQÄ óÈ4¤4¥/Ù\Ђx’]SSð-n­ž®õí“;×.Ñvª×lÈ73OÆå2Ò© 8ÆX[Ôc0?w,jýЯé˜7:„Ë™µ}ÎÝfÄô×ùW‰¾{)Ã:À²ΫšŽÍ†CYMœ8ýl&¥à³r"Ì4®¾9`aûðZ`ú½Ïó—yÕ³’¦àUý7BƒD@£AçðOâ'lï —¨?€&m}åtŽ Œ°˜ *"+ø‹}w08Å}Ö)MÛ£ðE^ë^²-ÂH¢r±ôÕ´¶Ð Â~Y.Iz—o˰^å&ÕãØ·Ñp?žÐ÷sјEF½ÔM÷šÐ1Ýo¯ó*º³À‰ßâL˜’þnÂ1ß×)·„ïÙz#ôz´ÔþªWÕõü4ê)'óç€Å}*ÚcÊÁÊ·ËÛŸòyÕdk*&ˆT·ëOºÏ~õ¶P;’“IÇ$H CT‰ãž ©ÉÓƒ ’Î-wUxKŸJÍØ úXFDÄxX£T²•òr1БF…"‡= KÅ•âÈ«+ƒ_®3ݳçm>< oð«níÚñìSyO÷¨x° NQÒè2Ôp”‰H@×s61·ŠC¦‰æRûuÅCún±jÌ‘4Ÿü_lë¯ûÍPâ÷ám³8týî¤Sf”œ©&0Þì5 ŽÜRÊPš°p—ÙÐã£êJu×5Œê2ïúfçþ¨8UB†týV 0‹‰°W n„ÛÁ0Ö`‹…˜‡Ú«’×!_øð¶$VÚË1QÂkŸáöà£Ð„¹«¿Ué2Åê<¯|Åh!¯{`4Kpƒ3ÕgÓß¼˜õÖäþ¢ êf®ƒÒæ< ‹áùvc6}¸®1Ïê¥pöŽD¨”`}iÜ O¥mý¾g@É‹ç'C¿3Ì;åmDnÅ<§îÑ”ã"Ó)Ûx&Jn%øìÈÀÔ}|ŒÍ= ¡ÿ~1[Á¦¦g!BN࣑s>«#?œŸÑU‘^DÛEð–beÍŸÞĹI‘¤k ;nAA—˜oØ^*YÜ ç‘‡èh,7ã‡öÐÚ#u2™ H½ô©f‘ªÐ—^ßã–ã­÷—4ò¤¤€±pwxæs<âDê©xpÚfÑõÛ¶ªKÎJZû¾f°›*úPÒ2HáhQíÆ´øs¡ßû&SÚ÷ùÚœ$fÆ?Vt}ª? x~2ÏM€aÌò2ÿr0æÜ(02‡8š:"|Ö{—H”#³soÕ.Œ¿Ñäÿ¢ÃÖÌPŒxA´sÄó*¥ó)Å«„@MmH ùäŽRÿv‘'ÒmµÖ‡jNƒ/‰dÚ‹U. N¸_Û¯mìí°B#Óùsè–OžˆÂãƒ)£¡˜ûf.ý"tu‚Œ”õàG¥7zziwš£â¾>K¥ø-„×’Á‘ÔGñÆ’opi­ÚÞc !ÛéÝ9¸ýŒÌá ¬§Áäù¬Ÿ±T ÙE¢™TUH[)år´ay,ÌÕ~u»žœé⦯=§~ŠÄäÝ3-9Ÿà»å×|ËC3¶?/Hˆ™Q°÷Å!µJÂsñhE*É×QÀ–=ÄQŠá«{A ó‘Û®”ƒgý÷ŒæåÇ*›.²Êø,_‘ëObÈô ÊI£è …f é†íg<~>Î×ãYéG¬K>¢¼GÀîmç…Ôð~ô+´ˆÝsò/5ÎCJ¸áÆ…ärßU‘r٘׺íÕ#˜¨måŽua¤?’éêù4ö]ØQî]nZ Q‘ªl+ðâ’ð"CÛ÷¦Àþ^H<(¦ÓUk“X©únkG‹‚ ¿ÎÒ„)VàÛº³EagÙ!c‹±™G$92›²ÑHëÓ$þz¢¹në­ìÌ€„ùK)ÃÍÇ9ÿšô¨ÙyäŒ#oùv¡¯ÓÊd³<]›=5‘Û2sìùLFµ7 ±Þ4Ví¨S[;B¯òæŒÇ‡¡; Ò.Ŝٷéc•qé¾ê8C/X˜³ Àcß/4|Ƒ˽xÝ8ÅÉâ_ܫŶxö©$Î>M¸!`â8ǘ‹ýTÏ‹š+ª©t2P6‚ê Jé´˜›–2ÓóvÚŠ°HEË[ÝøÈ¿O‰:Ýׯ¸qÀsæ=¥®}ÛÌeEµ^S&.´«~ë=ÓgåûÝÿê%À¥üU­ÝwV‡Ž…{ô™+Ê4;ü¯n Í-=³ÁþQ~Žç‹õ†v$±ò†.´$ùÙJØ­4æ|ê(JÜvÈÜÜõT{ÉÐ]¤Uf/E¦C”d¬Mš‡žë‘¢0½Ñ‹šÖDe3q§+ÊKq¬•P¯nZ87ÑõîŸt¦y®¨Gê|yVó6õ F…¼B4e›q“ñ«?ú1d&šs/ºÿó5­LÁ¬bÖ¼m¹ñÅÖ^«ÊÊÕîJ36jÞ ¢U¢³,dùÚ™ƒ³¶×ÎÉùÖ’Méf!q9 è2­V_&­ªÐ–áI|¬F%»$µ€I)”´¬°íÆ“›âËG+qeÌ=‘Ö.HÌ42È¡ŒQÑ3L·1¢`c-z%VúUœÍò›Ÿ¡_ÑFº{H’¦†Ô¯–´ù7neø84‚,é7]‘…0.â_sãç}œ6ÒД§¢ÞêýBkMAUàMKtòü‹¤àÔnAÖç·¤Ó’¡AퟥKIWѲb>É~þöê%mKGâæ;j.³;¨¤ˆÄ¸Óñ8º¢.ï² m}u¸¦#¡MôU…[„2§­2úˆ•‰ÛŒûò;.¢;ËŒâtØ/<{ï²!Æ»c À‡yN.A´³Öý`7öÛ$«š5(¿B)ÜzÝ4]Ø5†®ñl‘ÜÁ‘Yi÷ú3=¢ï”{DjøF 'ùOó?~ÿ>ç÷9ãÛ°³ÐÑËK­H=Íî5.Ž¥¹66Æo®È‘÷¿ê$‚ªø£¢£/VÁÐ¥ˆÜ˜xM‰“¨i÷ƒ„³m1Å¡«F$´šmzå30Fa®KB4o+‘Sñ ’{’ŧ#ó÷Y¿ä^Û4Üe#¨ÅmÆð‰Ù¶jtõ.Ÿp¼)RŽ˜È}\<´47Œ}lD¬ƒmžÊ3&…6xÑ丈t1TÕ bÞŒ&ë0Îj‘tÚkHüe^ž•½oÿñ¥?-ã÷2ƒ°͵É«}C*¡$Aßè÷fzJ§…˜—+•ñ߀¡MTöýD·üŸÏâ-Ž,»ŽÏ+güY/&rÏü Ï·P¿^ƒ¿|ÓÙýÞ…öü¤t‹sÉ[BaCWÏ4›$|…ï&¦nc€éèóKþž¶è^°v{p–ýf`jWX´˜8kðŽ.úêÝ^Á¹nÍ+ÎY›ø$ª¬Ãç’êqŠ,2yн®‹æÝjj&õÒIH=i¶Šó•%T¦ëøòžš¶ŽÉì1ÞÕŸ i›¤ ÇêÊ£‡I1ÔÕ«vôÌSøÔ\{›|¨0’v‚ðÞ†x+§1# ‚Ç>½ä^wS„K Žk}sõGµƒóP76Ýg~€,K¼ýZi4½ü^&|Ò*R¦µÔ¿@æg÷)’çf —'„ƾç^)‹ôLŠ¥ÇL.ÿ$m¸Ïf&$¥¤¾yÎÛ5t½ª¨t¼a HÆ…¨0ù'ÓqôyaºaêƒC‰×â<s– Ã;þ\;Ov@‰Ì‘~†n`‡´²Ê™JÈ yºÀaZ©äó·¥ Ûå,TÞ„ðwH…zŒCô·zþËŸRb’U à¾Õ! ÜB1Ј(Õ"°l•$–õÙ•Ôìg;^Ý‹…Þœ;Lå²wÊ‹cm|Í4L;äƒØýW<# ¶,Í­®â‚d ý.](¤¿†°èÃ[>Õÿ,/‰¶!Ÿ¬§Xh"\ãˆÅâ+ë)ÜËV-.S¶½mO½)è¢Ð:Ý£=BÃ•àŸ„"“Ùo’h¿dÃ)ö.ÈŠz¯Ôñæ`[JôQb™‚&8n¾¶w,½žZöÂÑi™â¶ÙVt$»ïò‚Ø_yª/ù}›·oH½ŽB†½x^ü*W‘ˆäãð«b"AZÉ[ŠpÔ…êºè€½ŽNØÓŠä šf€ÃÜ{óMiß¾eTy6•Ž*0{š›'÷'ë`¥¬U½Ù÷ ±$é¥i9áQÒö8.z]„ |ÌÈ:A(¸…´ÙÓX¤LÇ›ÄZJ'¥¶ÅFÞüOQ̆‹Æï|ÊvºK?㘘boE?YézD_¢õRE#Öð[e “Š9ÞPÕ!B²OS’²A•‰ó(«È†öqW—ƒ ZQòçÙoÐ7Eâïvå§b<+QMøù>ÈÚ°gı÷Ø)ZOšç§Æü¶wäŠÊ›š”†?]A7?õštwUëµÍk='p3Ád³þ€üÅsŽ*“„ C·p#'å¶Ûm|˜„¿ŸxÔ{e½nè˜[ñ Q¼7žï˜èV!{ÜRÜZ…õ§ã'+Iƒ†?¯—%Ä¢’T7RY3cÂ[Òrtæ6ÜSòìªêô‚^Ñð3&-®Ü?-ƒóré'H’ìg¥ôºÀnÄÉÂgØuKDÌ[õµ­Oê5?dކлø5vê‹ï¬êM çR±<ÕÛÃLèŸîoÁ0v‘*|­®²íä‹É“LÛCZ]C‘PµÇ¯½3Ù$úiî§ìžhLóù/»Lš6­``Íé,ÏqßuÀ¹íjXaxtÇ‘yžüýL;,HëBû–Ý-ëÝv‡y}¡—\à  ~Ã÷þnMòhÚ¨sÆp7܆³c«)oaܯñ´:pàãÏðÈÅ"ôŽ@¸å…»j!Íþ*5Š]aK÷I"8Š¡õ»Ç6'œ uƒÌy‘}HSÍ=Ç?²ðN9ŸPæÄÔG)3å:Ä=Q6%R®x:=©­Û·¼Aï%ÂIÅUÜÌRɽWko—œlØV"S×é£ 4­Qi"8Ò: ï 1N¼ëæì­{ߥ-{öÕÙðĦ¼Ûˆäõ…¥½òcžá·6DÝÉ¡ãäIŠºÜ@–ÓÛP¿{é¹?×ùȽ<þ,ãqZ-Š@z;\£ìþ×YGe„zQ 7*Œgäð.Nר èë0 cý £^¿¯g Šœä&-çOí¾•nÉÎÉ•úax|Næ†eLì€4ÔwWçZE‡¦\™äbçV!…FJîp廦Á“Ä(Fgc˜pÞ/Ÿôõwüá× Ö¸jÓB«Òç0µY™6ã„…øÌÄö7¹d¯o° žÅÅ*µsŠ¢Åg¼éìBµîw*ßäýžº q ýaHÿ]Œú‹X9÷sËP3Œ,|Œ×G™¯%8ù-vî/å>}üZ·Î®AXøãóèÞ _•áð>½}I"!‡ƒç—@¹w›M-ÆMû¯~1ص>÷m(aÁhÍ7HCo~ßk D j~¸ùqv¾A‹ŸÉ]gýSn6>}€/©MZÑ&ê ¯}gIôaã- ï(ÙGº=¶ž$Gç·–ÐOXµÎ4-Ah—§þ.Q›³ “Žðœ²Ã÷ˆÄý°Õ81ÔDÚÁªOô´Ãäöõè(Ó$1²ÈÅÌы˜àôþçÜÍh²ÙÕ¸ê+¦Ô@—ð÷ô-Š˜”%Æ$FÔ’¼W‘˜t®ïIê=ŠÞj£÷×|娣ñXk,ìšúzógäðÖÿD´ËL«³Õ’Dœå€šä¹+£ìÖœPY­@Ãì C8Ini°³Å9̱@Ž:SËé#Yrî:Á]28ó«N3uϲ̭A°¬}ì5â%“9>8–ÆøIÉxµ#²‡ùðO¶· #f^u$}rÔîÀÚïà!~™G"|$Ú'Þæ[ýöz0gò ‘ºHÜ®ŽïYG¶œ0>Äx‡$ëI-µ°cÊHhBPS u ËZ6Ǹ` Ff›ë¯‰É©¦k;æ—»²-ýŸª÷!•&Q²ô¦å³r³/¶ÛÙi¨¾õÊqb§ ÙIXÃ3\Dëåxæx2 ªâúU˜xÁYÞ`¼Ö}lìÚ+¹‰†Ì •å4wÉó[Ç ‹ÖM˜”§T|6j_Ï+Ì–¤ü~2ÕîîU¶üé”÷c‰Ã•ÌA½|Z¡|^¤u†¿¬ÔöR”&:òžKê§øÔÜhIo}iÀÖ·þ1~ ¼øQ9VBùjìë‰ö@Aù}¶íZ8£õ¼³kŽŸu*œ— {ø—1¤+sln€ÝQ—ñSÍJ/ù‹áúCGIkO…5fáÖŽ&Q¹Â,äft+"Êý=uág Åœ'ºœLñ1óõ%Aöã_#* aÅÞ¹S¾¸­Û#7ÚºHèÆX‘Wwæ™0®Mû¹¶GwáÕ„“á™Rž;.ààGÒÁ-éM¬oÍMg©üÎï'F‰:ÌÔãr"íW€§~ôºùX›É¶üøåëQWž”@Œ §kPìnhx} [Ž”L’} [¶å±üÿAÇø± endstream endobj 90 0 obj << /Length1 1597 /Length2 8599 /Length3 0 /Length 9638 /Filter /FlateDecode >> stream xÚ¶Pœ[Ó-ŒCp—`ƒ»Cpwww†™ÁÝ%¸;'A î\ƒ;Á‚$'8A.É9ß{ÎûýÕ½5U3ÏjYOwïÕ»†ŽJC›MÒj’ƒBÜÙ¸Ø9…ÒªZ\üNNvNNnT::°»#èo3*ÈÕ …ý+@Údéþl“±tŽS…BJŽ.×+!.~!NN7'§àÿB]…2–ž`k€*;@ ¹¡ÒIC}\Á¶vîϯùŸG# À%(ÈÏú' ér-!UKw;Óó–Žm( r÷ù/ F;wwg!///vK'7v¨«­+À ìnй\=AÖ€ß Ô,@uÆŽJб»ýe׆ڸ{Yº‚ÏG0q{Îð€Xƒ\Ï/h+ªÔA¿‚Uþ `ü=;×èþÎþM†üI¶¡NΖ0Ä`vÔåTØÝ½ÝY–ëß–ŽnÐç|KOK°£¥ÕsÀŸÊ-r’šËçÿnÏ è vvwcw;þn‘ã7Íó”e!ÖÒP''ÄÝ õw}2`Wðyì>¬êñûØ€!Ö6¿›°öpæÐ…€]<@Š2‡<›Pÿ±Ù‚Ü|œœœü‚| ä ´ãøM¯ãã úãäúm~î ÀÏê °yn¶=ÿ ú¹Yz‚î® ¿;þ¡rq¬Á@w€È Aý‡ýÙ ²ù ?¾+Ø`Ìù¬=.çïÏžLŸåe …8úüþç|9t¤ô¤uXþêø?>))¨7À‡ÀÆÍÇ äåðó þ›EÃüwœÿ¤*Bl Á¿Š}žÒÿìù÷ù3þ½L€ÿæRƒ>‹`üGã&œ|œÀç/®ÿg¥ÿIùÿøo–ÿ›ÆÿwArŽŽÜŒüÿ·¥ØÑçï€gÍz¸?ë_ú¼ÿªúkgUAÖ`§ÿíUt·|ÞIˆ­ãÆv“{ƒ¬5Àî@»¿Äò—]÷÷’9‚! ¨ø÷­`ãâäü_¾çÍ:<ßnÏŠüã=/οR„ZÿÞ0n¾WKWWKTÎg!qóñü¸žWÑäýGÃvÔý9ðÜ^ÀêŠúûD_ñ8$›þ ~.‡ü?HÀ¡þ$Èà°ü 8¬þAÏ‘Àÿ ®gr€þ¹6ÿ‚¼»Áç Àÿ‚¯öÿÀçUá€þ >S9ÿ >S¹þ >S¹ý >S¹ÿ >7àñþ×®®ÏwÈ?÷ðŸ òQ— @ápûºðŽ›IR/¶Ý ÑYº]ý,&6¿e×N;Lät¦oB7\¯$ÓGz±W·e/%V(üZ#ÛR5Ûùß›'kMï¶£.MN–HÖ¿ cÓ‘øæÿàâ¯âß ûI‰®ÐÅCS£ïÆ«_Þ»~ òËç× »šß>¾RF»¯œa‹×3 )›£+²Ê›'¦Frg#GaÆ=õÆš»¼šÅ-˜|¢TJfA 8Œçyëg´Ép;ï»V¥ÃíÖMBKbDL‰ûyšÞOj/C‰hѯü],v ûwñƒRžéa4ê’£ÙnpŸŸý„r²ÌáÕf ½7èuçØ·ëà$”S_¹é”Øoú†òÞ=¢mNšdдv ¶ÑÕ'ÿ›y#¥é²B°U0ÆgήõÖ˜×L|TF!=£üʤVoí¥Òž®SÛbÙh×>F)CCÌý Yñtù•âBlÄ/Ùü]Xk¹=ß2Å,bÍQ~v´“àÆ c:…ŠÜÄ-Èé¨nýšÔ{[®ª÷•fgqÚÇH¾3 xG¥Scð5ó:ÀÖÁE0O—èƒ0ùÒ¯úCÒ/êFìæµVÄÑ-~F/ý¶þüþ%oÈÞ³÷–ÝLÇod#¹¢W†3ÆhŠH¾ŒÀ©!ÑžgÎÐô‡E öûˆ{èÔZ”n©ª\_ëýÆþP›~W\Ø«Ný<¥ÕŠÅ:û¨Ž é«;Fë;2E-A ¦Ê…û’GÖp²ní¸Ôëà–[ˉ­cêT‘S'ùà<¦ ²Ù¯õX/«zÍ%añ¼?Ê‚ÉMØemÎ4ÏÖpû. ïd[û±ãÍàñŠ·¬vbvÚEw@1­m’„M«d 3wËò1 •Õ°÷ 7´&†®Ã¬g‚Vq+ v¸P÷~1\ÇÍ7Ûï‡ôP·ÉØ–ÀŸ1¢¾¦”ÕðkóŽçÉ&ƒhoS“ýb䇯Gcn±D=—ÙÄF0ñq‡îq%ZcØÙ¦ã¦J/7ˆÇ:D_ð¢ž-yO)0Ê.s¸ Õz"-/e­mN"ccŠÝˆóæeÖQð°'Ùü|ÌÒ5ÛðӶȰ(ƒ½’ä1eƒ6Ñ…:÷òPý_ u›­\Êùš+zŽ.ÙKüú¶T}O'’™¨ÿQ®ÓôµbÍäÅéí+œéØ 7/ªÉ4b\ufAÕÑj¸Ú"O)¼¸Ë_ŘlÊ2 ¦ÖÓ‰ÑR+õ/Áž´<{á´8w2Iµp킈 Šbb³RØv\?LKºÉ*såóeIKÄá7¦ÛfñýQDbÅ ºõþ¢¥EPóÄ¡5_ß*ä¥NÌ­|¡‚ ÎÐχIdä8Üï„5îešyrÏ$üÝ"_ÎM¹›â;ôèJäçóÛð8›¨Ê£`NÊR?9„bUÖ²M8H+pIÊ©‹¡¡ë0˜Ö6ÏpfŒ­¬4 j-à¡o™/öÄ&ÏËKv^cb%—¼iO/÷*Ó7Ôé] Û>v§úé?7a7Ì‚ÌÌ:ý°$ˆe`çÃ÷>ÈC÷Ç.çˆtßžUÝ{6²ùr5KÇ#ªe¥K¹OS3=€áÜ@Q÷-L¢s Q9FpÊBzOÅÃàL´ýÊyu’Tu?Ä3í¤rupþP?2ҺŰ‘m.®j…h ËÃ'|(·*h,u4˜•""®\±†üøc¯œƒ0úµ9ߊBÕž‰ÒáùzŸºo(x—¹x0Lÿ §ò˜Ìkì÷hõ+áòScç«:óa'™;7Hü‹}slEï»áÕmr¥˜jáu§¥mdØë1õ9ýÖ·†äçÞG¤í½hÄ“ª½ŽÂÓ"q¦±k_CÂÁÜÿ´¥l¾yùIõâjÙ_W&f=ûý|,óøóÀòiÏŒ†·SW~+Å>Á×XIƒQþN­p)|t¯îë@ýQ½ØZ@[˜Ùµ xÿgCÏ'ÐJárã½®.ŠùmIÅ.å·xš\g5¿ÖC­Úõ.áÇæÀZ_OKÆ>ïÀÇ >Ñ0"™”5Wäc® 9OìW%+ññ½¯A²õ…çO ±•W¨Žš”f IXžýµÒÁÎV¤ ²I‚2N‚-Ð.£´¾ldµT$?çM¤Nß~ 12`8¸-º‰3x¿(¹áƒÜBú¢g&ç´-ZrNrwwƒW–ãð™ýêä×®Ì;FÎrâ5^ ÑàiàÏö§5º±†]êÞ[¹…Âv >ž—o'[ËSº | sò&Œ1ŒÖ§-ž_…—F ?<â5wpö_?)«Ö¿±FµúœÝÙ#X Ûâ‘í¦cxo§X²Dáaj½Ö+ò¯zê²ò21Vô±¤õ*ߣÕ`BT z>gQ†ü}=ïƒÞíüË·´xb¾MVüËù ößIX£iÁ»Ð=Þ_ÓÛ½]ì+³Ÿ¹K™$ô«KÔtßoGÐ Æœ¯¤D°pŠÊ2U23id.—ØŠ:60/h¯Áœßyu¼1L!LqÔÔŸóa~1ra¸Á¿¸rUà-ÎT”~™tB¥í•íŽÖ³ÛÞÌ$m:9ÊÍk\X¨ &-×H"T…à°rK–`> Jz†Áp Lªf¶²‰MÍ8ÀÔú”%§öçe¨Ð4Ý•%ÊyàÎaiã­y'‡ÈM§wÓ.–Á“tNA‹êq¤Ê6u·XEÖZ<‡øóp²ªŸ¹át¨KiZ'å-J´þ)ÂÞªMkº}Ò¢0ó=õD€)q%NJxŒwi·6Ã2·OÁ þé"}l?d…{×½Ã1ø§f™öÂÑQÃÝĉR­ô\ßÚOÅ•îÄhmã®ê;;圽Ôr^F•~òã´ýêØL¼ö²*j"~ÎÇL{½É¨¶™:â/VïÑ5þ ¾/zYÞ?°ÖZÒ’"B†]×Ô°jí¡’QMmÙ”3ñ‘I‘[-Îã5þÜÙ"² _MZ¼@eýéç^<Ó:…_u¿rËã!Ì +~§Tw¹4 K_®^µˆ@»ÆœÎq|ù&›ÿí+snUQ}"zå Zÿ©E¶öñåÊc1˜7ZµPwœ§`*{gD–æOìm"µù]/5P—8{/¢´Dû§ø*[u¹wʯ=ã8n“ 2c^ÿÈVôÔLÍÆe+6küÎÞÍÔ‘*jb«ñ¦´*­ù̇é°›èE3z”¸q—í'º©Ô/±ÔÑ?+è1Ž_ª}Uð²&„~¹•;Od‘v3E|PýaŒžÔIX6?|Þa–ç˜Óä‹yd!® Ú}­ÔÌÂ;à Ôš½4œägrFÖéݰ(®÷çÁÑõ¼Åjz%¡­ÍœXÓ+ŠuÌž :"ÿê&àØØ Hq‘#?Ý*€ IÔ]âî< ŽÏV{~ÑÔÆ =Z%ʼ}DóaßíÞ³y©W2ÿ©e“« >$´x™î+E~²s®§3ªõ<­Du‚ó€z"ç%ÐJyjshoZž&©Ãæûý×(ÁŽmW†>ây›åcË]ª•÷ø$žlÛ+fAogØH‘áCš3ÅÅôÐãßËSçK Óv•#Uº#26jμÅEM™ákz½®óþ¼Ûfò¶å"øY&RP±A e¶øÚ˜C:ùÚW]œ–*Š×ø±ÁÅõq-ß±ͧ–PfÊ3ªM€Š¶½»Ø†{&v—`ÅÈÊG˜ŠÆGqHK«%kpŽ;ö:Ìüj~¡k‹;]ìóCØé î«ú¼ÜËr8¿Ï¡œ—íy¦ôõ$izáU3݆֫$j iÍÁ/<1²<Å'«uñéŠpYÈÒzv{> ÄÊ$±íBt¹ä› TÐÎb&‡+äVÔÄ÷‡F€âäæðMÆóž·@/áq_ûqƒ¨&°-³p¸694lÖ‚H­½j™Å5¯ßË´[2œoõ kcDq^¨½)ŸF’olÝT Da”%m´–TMþºwé߯¯ã1jc¥_c Ü.{‰);úsˆ¡Ñž6:wýqM^º°ŸÐ±$_³•Õ‘SU/ò5ZcŒ‚›q±ñ!ëßí˜j}«;LSåü3¢õ¢L+ _¼ÊDq5Åû ¾.Jb#´!A=&ï€pæ¯'I݈ðâ@öœ•æb>FEk“ã]Y$ª}2ûZãIøÝšs_n¢÷Æ–÷{íx'/¬ û£òmú Öyl»ÆFhZ¿˜Osƒ©Ñ ^‡u»©kÜ!LRµ÷EíRȽ¦Nz JæÈý7É„‚f‰±+%ÏKVÀ½Lwý ­ù¼wk‚¶/Çà­×@¦l|e ¾áWLGy˜Áƒ›âìÌÀ-»xêØï)uŸô>(‡Ïëê _Vj¼âz±ÝZCâù}s´™7 ™²Ë™ÚC™bç¾ÌÁ³R,¶8)’¦ .Þ¾)ËËÀ%Ý×¾:¯äc('œ8Íô6Pæåèåð¬B²fjÆÏPl-.ìÝÞOØíÒ©¨kº'¡h¢]e}46 å•nzÙ"iðšh¥©Ò”ÐnÑüˆE;P?= -‘ªè3zÙ–c6tÑmŒf±¦ZI¾‚žlóÇ„QèP”¦l$Òº ˢΠýbÍg²¶œe¸$!Ž«肌9ÅâǶ53<ýØÞ§AuZ'¡¸\µKF´ºÏþä }Àž»ã«óÄ!šÑnféêÛTj™Añðªðý«d²9ˆôIÿF7¡yoÚ Y½èµVã²QGÁ&vÝy WÌ"¨ºÊêCØl@A¤]îu¢¢ÛÃ7±#ªZ¬ ¼-dLACšpMÍs#¯ÔÑÝVJˆX 6QÂÁ1R6l‚£õ³héœ%Üûúã5µÍ×$ ;±XÝx§á§ÜèÂ|«>S/o“ˆxp"ÉÞÚ€ÂDÐkU’Ý V çNKÁ€ Á`ôÆIQN ÁæÇìŸ"!àñ‘]o‹M/›rçŒN¹Ê/-·•4ŒJñ ðS½¢ÇRT÷gLG%]6O!êP§wžÑçXöÑ u¡)Ðü·³N+ÇÕMpæ<á³Ñ!Ò¹'0}vcÅ)µi0§›_k Å•‚Jì'õâ(Šë~Þ;ÊER²ôê9ݳñç´¤õ æ ÁqH]Y×Eå6ßX8}-÷%µtÎÞ¹*“E«× «^&µJÑÅ&î#Ò ªZái‡K_ÇÊ °ß¬ÅÑsÅ_ÓäQŬJ‰"Õ^<n-›=,F "Ê @îd\Ò¶îUKð*ç4•¬°'r>˜éäÎ6¢÷ÙÛüœ­Ò^–u2p«ÐLaŠ›sÓ$+ëØ®f£ÇóófF¿“‡zý"RèzÉŠXÝKÃTÚĸ_`¬©¢XþIÒ©£Þò÷œLгÅHœù¤Û³ð “…†ûŸ€îéºÔ9áëZC.Á>¬‚ù;Ï ,§÷ëu·w“vÖë•W‚×WF€Ð94iú¨ÂÌ ¡¸×e‚áÉM~ÙÛ±’HÚNúõß2ƒMù¨c\e=—w£hîÉVìΊÞôët;ê`+4µ fw’+EfÞñJE¹ W°dù8”Ø ¯0‡æt¡Ò$8qwÕhïö8C»TZóßÿ˜2 `Í>œ e¯8¾[öUÎJÆD‹Ìa°ä…ÎA4a?øh öŒßaÑ:ï ¢Ùµ z”¤Òƒ¯tçøsRбUçÖ#M—’h[]dj¶ÓÐó¥‘ñA¹_;^™½/‰—!¾•¡lvV.%ÊüÀ ŠnÐmƒjÖÀÉ•#VG>:™2懻³³…Ýʺ?­ÓÆð 1mOû:Žk!8Ü$yA©"Aúž†}"üÅr¿­ø ª öBÑ)gå"]¦·@2a^…óù}Š*õѼ¶ž ñO§4ýš¬74ÓKÉF¾ø’•(¯ vM›‚½b-`mq7Lø}ê'¿ºƒc6ýBšY,¤k'ãEŠx3Ôùñ¨ºû×"Z¦e6T GnJ“ŸÆ¥û¯>Qv!ð¾ýò˜êQt+;çq©8M±´°B@©üúõäõÑDÊ{´×í„cá½¥`>Œ” •Ïî_f8Ô § qažr¾qû”ëò¢¬Œr]¸„þü­L§B¨!´ ùf Â*5F•uý.gz»×_S¥@¿/'³ƒ¶™aQ«F¹Þø$Ý·zeôú…Xº™ò‹‹Í~í|ål\drÕÊuXÅ»-µEò^Õ~1ýXM'O쎲Yý;š°ÐbyÈx.–ÓÉ™ýÈ7U9˜ÏéšsŒÚX¹õ'ðtbh§ÝCn'O1-ü¹à0{´S7üÍ™ýì÷¸˜¶î Ÿ}ìí_²Ì„ ¤r™øæ|W–˜ìõff ½µ9] ŒTG-Åh¼›H׸‹„ä™K2r+¨OLΞ5€ü¹ZA¬~§ãÒÔÙÈšŽEÒ+ùŒ ]f€CxøA°_ý§CKN¶¸eLy¿L<`ïB§"¿Ýø8Ü ý¤/P®œ; qÕÆŒãíOÐF™l¹^5«Õàwù"G:¶’ˆ«&zsë@îßi2@i#tȱѰ”eÊrY5½à—úYrç…j:ë‰~Úl75 ŒúÊ#iž..” 7L>fÚ\ΖÇ¡±9ÊE¼†Ä´ê„]ui\o%éÞLSÅdR½çÞW¨7XjJÛ“ðž/6–"¬~·>ܹ‘Oò´_ìï/v,|Ö/ Xd3Bºô‡ÝÅžG>üL‚ÂMoó‚‘< cywY‡Œ¶í^û¤”9©(K!d™l<˜;/fÇ/&…#潚Ô:)íÍÊ13ÑA­!gÔ7^nÚ~—j÷vñ6œèÆÎvµLSP뫼øozlRífƒ%«[Õ—j«¤a’3n"ŸœgU+>ÁÅ«5ÞF0ãOÊ4 ›*:e”q€ÑûO†¡’¯âÃQõ&+ë°Æ _ö÷aª˜¡R q‰·Vbú-ñ¸ŽFªS xRçöé•ïÉÅâiÆ ñèÔ:FD¬æ^®WI¦x°G¼Ñ_–¯j°‚XŸø ]ƒu9”‰}9^iËãëÀ¨—(DÜÒ±,z|s‡G~<ØUJª¥—«ûx¤©œú/Ȳ¤Yˆ™iæMïƒ3‚c’ÙÓ€ •kdgê ‰¥ œ =:_ ›Ú÷Mæý/´›Uâgné\¹$OFl 3bÔÿòØ¢ò¬ÝÄf ÿ’'¡·³‹q‡>ÑHE|l#¡ŒãúÆ*|A–ÈžÕ2þKk &‚ýy™Òh³ê›cY:=w÷ˆñ lT#©>†TùáY²ÓÆ%[Æ0 ˺$-._Ê8³»ù$¯¦¡W¸ƒ€µU¾S?_ ³ÄT¬æ}hp¬C%á>,’ 2Wßãè0ÌÝ~Ö0îò–oW* R™ý[wçœ!|Yñö{é/ŒfphZ„ÃHðq/¬vž´1zšÏ +}ûêHìãÕõ îHæâ"ªb•¯ ×.®,_&rº”iÔ³w¿˜l7€Õ=øYߺ »rµ1³rÚýD'y×¼´‘Y+MªbDñ„+ÅÀ'¹~VmsøýDŸ¾H„ë³øÁìÍÒ µpÿÂ鬉¼û ñЛë*Õ¼”øc×˲E¨4šÖ"ŸTŠ ô¢• üx)7Öžíyñ+¶Þ,~§‰~é5rÅ®ZzRÇ6(HJÉÊ¿ÜN¦K\ F6©”N[‡?ÞìA<Ÿ¤ý`ÒC|âIp#áeMä˜Ô¤8 #ûŒæ Ø:¬/ÅúÚØ4*)¦<ÈF>ÊàòÀwÒ¥ö}ûw’ÊhîV(ñ÷+vÆÏ†Xd Ï¼çÝs×µHÄzT$^,>'½™¹3j­.ùÈœS˜O˜é}ôs§n­ÆLá²u†Ñë–8§*Ìv¶‹Ä/|9"œ®›P Á¢ãòÞ8ïV…—F½E7LØ ÷@7{Ae Ø“ï ŠØ8,‡\Ê{¶t²ØçTµëSس'Ó¬d¶Œ¥U‘0)Ÿfd+¬¢\ß.Àk•’wÙ!—x”^dm†¿Aó•Ë•Ÿ?_Ï(|X|±––­C}ßÉ´ün&á]×ò›l¸….3™j#nêZvÂn÷^ìû(¢u ¯ÇЍûþDµ›'á4–ާIšYÞÐùÏŒä6êVµoP¶÷5oƒ–ö5éaÛU´%»7©óxpû°»^èÓêȘ´¶Á­æ¤ißFêó;è„ &EUòŸ«ï)DÚc':/};ûÙ×–*‚~àt—²"{ûŠ pøc~­¡ÍàðOÏJ7…]K.N]ü'¬Çµ<æ“~’í±@mŸó£8VDê¾(iô«‡óóxô÷‹‹Ê‚d´pÞ·$V¦÷áIðî„qœìHÎ2Ý S¦ZGád‰ %þŠ!mPUÊf$þý¡Ú\®È}õfb¸ïËkå‡ãÌ"TÚ-Ïc¹Ó¾µÁ/VuJn·ò€±+±ý7®u¾ÕNgëŒ\?ò"ñ hÖ;£Ð_Ð"RIž#[ÄÍŒ_?š¿ÃJÜJcG>P´.ÈŽ„†t\”˜mµle€™ÅÐXáø½lÔ„9k·pÓb´ÀX‚ôjgÊ;E5K¡4ᆤ¥€ÏÜ2Ô<©;çÇËÜ>zé†u™Ñ?~D“@S¼y›fÓ10IdÌÁZŸéÞuÜ ñ²ˆ´'âqªæ?ˆ -¤;¤ÊٟŠ€>ÈeÒ*dhë O¾ Ùì¤9}kÿxÏàp:j8oùV¾ÕÇY5Gw© Xìñ£ýˆÐ–bBœ‹q©óX…a*f¨–ñ~<+kÃuȬc‚£ ãòŽZÔ’©”9Ð'ØÆßÙ› Ç"eå5†(²}ºá±þš|÷(î§1|»1´ ²êFŒ÷Û•ì({îlý#¼"·è݌ڃÖ0¹R¿4ȼX2º"üƒ mÝsý„ Û©&Û)úß|Tk¡µŠ¼xb›âL ÖPXåíÅ©M9¾+PÛw#ã{~vßÞœçàƒ²?L+L eäÒFrS£é¥“tô¹¦*ÿ{,ÎõC¹¡r/Ë) P(õ[èë˜å$‡w©oÀøS´…»™)æv©Iq^" Ét1ÉQÓ£KŒŸøÚIÛÂ`‰Ò¹ ·¿‹ö‹i3£ÏóIËSš "C<8kÕâ2¬Pµ,峿íÙ» |D)ªÉã£T/A!ýïhšŸ[Á›HÅÇÐAOèŽùæmG0Ýö}E#AéùmÍi/Ç4Ì„èÊyÌmêÍã²Úü7÷²£¸¬„AÈhˆ&Kj?ný÷aâ¼!ŠEÕ¡b眢â=ð²Ã‹ÃF8^ƒ¡#"#ôã 4B 9©ê{·±žQö²¡_{íi´GÑgBèfj†£PÛÏúƒÆ"!ûíw‰=Ð.? Dzæh“2¾»ªZÒ½Qtí<¬Ú(Ïèñ5Äc1Âí,¬.‹7|Àó­L7u(_¼ä7·Ò¸sy²œ¾ -EÓŸvkš³å'€,a³ts L¤¥GA$ãh ¿Ù˜ÒOÿI“I‹í€ù'6"LOOY¾#“:I–šfÐblÒ«Õ¾Õwþ.ôŽûêöƒŽù']o6¥ÐXÝ^5²-à•‡Ô{çÁWÙ™’Ö‡¯‚„4TœRÙý-TçðÝ6W×3¡2’bé Ä´p`×ôS¹/yÐÌBèQOri+ÀacÎÙûp–!‡.¸nŸ’2zò]0aÅC®Iƒîƒ'íQ•Í•- £ñÛ,} ´{;ág•> stream xÚ¶eT›ÛÖŠ»wVÜÝâîR‚»»»[‹÷b-P(Ü¡¸»»ËM÷>gwŸïÞwdŒä}¦Ï¹ž¹ÞÐRªi²HX€Í@²`G7VvA€”²¦’–;€‹•…–VËÆÍôGƒB«rqµ; þËFÊtƒÈ¤nSe°#@ÁÝÀÁààäàdgp²³ ü×ì"zØX”Y `G+ ­ØÉÛÅÆÊÚ ’é¿zs‡€ó_î ‹9Р t³9@2šíš`s›÷ÿ„ ¶vssdcóôôd:¸²‚]¬D˜ž6nÖ +ÈÅdøÝ6@èú§9VZ€–µëß*M°¥›'ЀìmÌAŽ®'wG ’ )¯Pu9þm¬ô·3à?ãp°rüî?Þ¿Ù8þå 47;8½m­–6ö €ª¬«›—3èhñÛhï †ø=€6ö@3ˆÁ_Å²ê ¤ÇÿtèjîbãäæÊêjcÿ»K¶ßa ƒ–q´;8€Ý\Q~×'mã2‡LÞ›íŸ#¶s{:úþÁ–6Ž–¿[±pwbÓv´qvÉKÿÇ "Bù#³¹xØÙÙù! r€¼Ì­Ù~'Ñòvý¥äø-†ôáïëvXBZùÛX‚ ?(¾®@ÀÍÅäïûoÅÿ"€…¹À deãˆò':D ²üCXàbã0d‡ÀþûóÏ“1„g`G{ï?æ4›†¾žª† Ó?Mÿ£–”{|Y8Ù,œ\\^>¯/Àÿ©mþSÈ¿\å-Á¿ë… ê¿5{ü‡ôÿÙÀÿÆRC Ðÿá»;»9ä‹ãÿ7ëÿrùÿ"ûï(ÿ?øþk’u··ÿË‚þ¿&ÿ/  ƒ½÷l vwƒ¬ƒ2²Žÿ×Tô÷+ƒ,lÜþ¯VÞ Y G+µYX¹yÿÛ¸ÊÚx,ÔlÜÌ­ÿ¢ÉßbíßkgoãR»Úü¾j,ììÿGÙ5s;Èuâ aç_*d•þ7«Œ£9Øâ÷Îqòð€..@ov©8yx¾å´yýÅg«#Ø â€tè°» ü>Z^›ÄoÑ߈À&ý ØdþA|ì6Ù?ˆ À&ÿñØ”þ >›ò?ˆâ§öqB(ûA¢hþAÜ6­?R™ö©Eÿ$Éüƒ U›ýAä4·A®yK·?r®ä“ó$´ù?ˆÌl9ÿJ¸¹Kþ$ü}Plÿ‚” ?cûœÝ!œþcéÚòO H%–6V"ZBMV‹){ןJ4Y]]9ÜìÏ'|”äUƒ QW"X°·V}¬pܹxN:¨¬¸‰„R´SH\zƒÌ¯/·2kÊ|ay‘k[¡ØÞ|O40 ÓºW7–RæÄxï‹—Y §š›ÇçdS˜Té:ˆDÿ Á®M‚˜œA™Ãø¶§ICÿíäkÛ¯Zì㌇)©<Ž^ CIײo!¿z[XoÝ‘“‹–^˜PÜ2ñ²´‚Òy{Clé;ã¼>¬¡ÓÉrå ÐñѺ„dD )“CsUNÕuaqiîG›Ûˆ]ÿª^fQSð³¬Å7½#rŸÇ:ÇÂx)É®°¨‰¸&õŸ]i¬6‰e¨ÙšÁ'Û-¶Ge/*í¤yb-Ï•=bEá\46}Ôb`f< § QP:‰dÎ!¸Òê1#Xî¥\«‡_C ·†|a=Û±[Ó .@ôIìáÌÞç8’Ö¿ÜlŒù¨¢Ž™ÆF‰Uý˜p±k!Ï™°gåik2§&¡ÞnŒ*‘-ªÃeÙ¹—]ó3•úV–/¾l(O#¦-å-‰ÙÓwn†!`þF‰C÷’êmQâ5õ¾¦Ø+‚89}—Ór×áù¼Þw"ç•ÛײT?g—yeçѰÏs3 Žëß°úH0OãÂÂ&ý¸Ÿõ0×ÛM¼SÃÖÑNe%÷Ð2ìÞ>©Œ_•W+:[¡/ŽW³¢›*__²Vå>lü¨çìv©~…•¯"Ù*˜ûëÁ‹|œüù¡yˇáéF@Y²Èù-¶¨p?Âêð TÆÓ“ñ57O¾¿!ÝQÝתåëÀ¸vW´‹¯Ç~öN]¤Q)„Þ*! =9>XéÒσ液Œlƒw‹ÙH²††!tFÁ»Îo[’è9°iÍ>< ›Hg4ìKQyˆ«c_åx÷™|¸^Ì¢§d› n#ž½nFÔÀR÷–ª–ÛòL_¡b#(¬Ô2Ü3‡êxe‘¬eg’Iþ·µª H^\îíxc—Éçr·fbî†7œ®ë¡JÏR˜Õ©ûܬGe5Ç»æ%=4ãï4’=b’—d:{,úÔ°ƒC;ðß·v`XOò “ ×Ù‡mM‰šEïa¾ûá;IpÆÐ9f«GÈÒíèr'ñ|V3§Ã#¼„zG~Oœ§=¼·ÇºPà+U3§_v…ßNŽòålá _ÈÏ“v²ÙçàÚÇ#©húI‡’É»!(¨¯9 ì>çÁ'%ã1ã=†’6 (Z%¬mŸñLJÅvã=sïäº(öd”óøâÚ. h?žLÿ´ßfÍì™fjåî‚~súÒéñ‰³{Z¥™tÚlðQx:c§Õ6º×Š®Ô¯Bào,“é—¶_2ä—•#󨮥6ø–s†1{ìÐd{òU‘T‡-^½YÉ(ð™ð ]“‡×“Æz3.<¿‰ö«ÖMGñöÀ¨éGwG4ʈóFïq§U¯y*–fÆóÞ="{Œ%NÆ‹f ³Š°óX>ʪfF8ܦQ ¡‹Jlìn@©vÍ©fš‰º\ëÈœZ–tØcçw Zú¢£ßoVöÁ\á†P¾9D8'ÏkÄïï×,®èê¿e#=ÑÕ*6 jGŸ÷X–‹jí·…_dV Íè”Ò€£UÏ?p6#YASÞµ`½öcŠõº –¹í©‰AéÆkR(+º®Žf/™žoþær¦n¼­×ì3î“W=«:F˜Eñ±`¸+/?áB”*mENZ¤–óË®™€6ó¬L0åZ·j‚ÆÙ[RÅݜ֎i†¾ç”®ŸÞ¼÷3d_ydÊ`‹piˆžÛ—YkÁ,|¥‡U4H^”j¹Ý“³G=[ §Ë›Ë5ù¶<¾ðHùˆ9´Îq$<žƒÙ˜P“Šh7¥òÕ„QQV®t0$Ëk˜'â~í'X¦+B-¦Ä­’¢“Ùçl†—£'Z‘PýŸŒŸº ÿid?­=º š*ÀR©¿T+xèf¶F{ÏþXâkÊ®^š^dsko @¯_:³üÜ%ZØ4Ötc¶èšMZôØJÊ¥êóP°²¸\±^õ/ÐÝP(Ø#+Òåºëm1¢Gl ²H‰ôŸ¬6’ÜÄ ›:MÜñ}eêÈ¿9JkáuÌéÇ Kþæ°‡aý¾Ü¼¨WÅŽ6j77k³Ÿ¡©À…˜=+ê ü„/N¾Üô—t Œ;Ô“A†øÃ€1–ü+‡@‡ÐO›ûL)r&ÜÃU°?™­g I½d€ø/±†ÖoMŒœé̪J¾d´Ë¦].‘$mör'a) ¾¡DŸw©Ø¬RË6«Ð༠:ȯêiËgBæ¦(˜+Œ™^2Äâˆ`#´½©RsÄd*^¿Ÿ˜U×3WvCÍ|+–lEÂÉÇŇ¢Ë• “Ånµ5°Svˆ~{m1)"cR•-É69ÂlðÀåB¢o •>Çt¡<¶UñþûTé"Ý[W³_¬<Ëo(B>ëOîñ2h³¬ÀÞŒu±e´|ÁRa,V=T°×¹ï~Ɖ2~ÍlÞÿlv]æFÖƒŠö­1®¸Ì”$X‰/»¸Hš½)`,®'lk–ÃÇÛ¼ò!b<-/]§‡Ø¤ÀÚ…\‘+ÝàÕWÐÕ‹»¼(BÛHU›ŒÅr©=#’¹éD½ñ@ÂíLêžåb]vf‘ÿ”ÜOéÏUrä‘©ı¸éÌaBåþn?ÙV}°Žã]å<¨•М éô=yBÍç|ËŒÛ|g«\MLÈtdÝŽ__mJG@S{í௅Á…˜•#õ-Édß8ƒüÜnã%ˆ¾§ŠŸ§¥}Yu@ð ú:ÕÞ¸ìB§züŒ¯NÑ ${VÍ{ØÛõ]üòé‘$ q‚»XÝL†Y Ž5‚ËÏ)™{CL«ú>¢i°Ÿûà…¤?nÖwI›ìªÖEñ+@»Ïº0=Àë)uøëD4Õã±·"|šºFvp^î­7aHˆg_³Z,v{6I‘Ò'Ÿ‰hh‚ÏnÉ n&Ù=^ò[¨iü©}A‚’Q5 .B=³áø:Ü7öŃ߿–ßXÜ”_yï{H;É´`~в—ËŸò,+ëÆüÔï ƒ Î+„7’´®äð¥—(ÿv˱ÎÃîQ$—ú9,ä}ß4‹@~}OjfC(<ôVðÐT2ûÜóöËyª’õ­ž^+|ïhóá ¸¬F.whdø(NÇêåLùSºœˆÁT÷W¨W\}¥‘ºÚÓ‡WŽZÔ*ŒXþ†HÛΜ–ǾÝJXèƒf[S?€òÅ”wî×jil EõÛ*°öñ­GϘÑD J^ìˆáÅby›ægSåG}ÛY Öì§™L§¢Ý¦ÈP;K«&É~28‡÷)¶Ç°èj·,Ê<«àìÓé\õ?Võž× tÙ2¯X-“{¹ÀdÁ™‚#‰J€æzÀ´ÝÈ>ÁéÛ&m—$MÉßë¸ËÎZÎÔf°E¿²hXc¾î±Šàä’ æú!õ½»ƒ0 oÆŸBgAnº>ü¦eiu@oƒüÙå {x颵8åâu+øÓ­»Íüèn]+.WîJgÕ4oŒþq ôV ˆþ[gyU 骵aé0r/'ïRÛrÚˆÒÌŒ¾ù]ëe‹§ÅÚÙäz™gÖ*7 ‚{ò|(Ë#‘¡†És ž×LÁEãŽá§ä‹‡‚uÇôÌb?¡| —Ð$KÊŠJ«îIPqÇiè=ÍásT¢¨9:%†ÇÄ€°Öó{‚©öÏ#R»RáÝìŒ]jšÁ#€£|·Î·R‘YúD®ñ¥& ]SGÝ-¢y÷'L©÷+(ªƒ Šù9aúÕJ™rK´_+BuÖ+éú ½Ò„~÷Õ­„Œ6qèvõó#0ß/‡‹Ž˜øW0}ÊÊØàÅ×>Å¿H ¶_m¼÷5bÔ;p¾ˆTcúŽç¹Oí,ñ‹Ì(oÖ{Ï¡î…q†Ê¸ð G‡Mž ôI”„èè(ÝÄO#ŠDć õ‘È奩©ÐÒyZuO&ÉÞ›W×µ+åpunÀ×Èùtj$ÅEŠÅ Á£€ã,•‰DùÆC1þÖAìBÂÞ=»r%¥Š¼¡9ÞÅ™^Y½ ªo°)R ·î6ñ 9’‘E>AE¿%%Û®:Èn‹zÉäügoûK#!éô¯Ð,éÙñ•IÕ7C"ÙÚÔp³#pQGØmM‰Â½¦ânkè1­_ôãöˆ·Ÿù2úr[¹:ÂÇÙ($còàš°Õ6{Ü„‚ÂÆzÔœ\y Æ(ÉzÝÌicï¾7k”5„ÇÍî¡XùÕe4yÏ”yÔ.­1 jE®àÙÌPû2ßFjÂ}¡˜›E‚G¨Îßõô•Âk#:É/ß5r¶pÿ½ bMKÙŒ'«-YéIÄDZ¥’è·1W‡7nÔxý¤“Õ¯{GŒ.I² 8VôîA(òN¢߬™O7N§TÄžú8s´%zhTTÊ‚:/Qýžˆw4~ÍDV6M;\ñ±«QÁ  ¬—v¥drÞäDwÉ~3 {E<„Íxð5xÙ½ÊößKYµch(ù$ ÃRo&$ÇXIdðñÃokÞhì*ÿ"kù:÷SÀ3Öô$YÏ·¯LË ­ÍàÈÅpÁã|»9 üw,#¾Öò"uƒEBÊr§´†,¢ög d“rÍïêKÅ$V؈ ¶áÔ~êN²#ú±ŸZê1ø9ÝaébÎZKò“u# æôÕ-TDyz8r–^Ì¢Qçl‘¢ÜÒÈÂÙÉf–cƒß¹~~ýâHÀõ¸Î\ÛÞÅÓr¤Ò^¨71KÙVyº²OìX?>q*³5s ·×(Ñy@"û$xÖ–‘º¼èš‚´ˆT'ìE\Ý«nëf“z¢À8ÿÈÚ” 0)vçòù&ü|“7‹B ã9˜¤Y‚Zóá•f)@‚a·LëÇ(™P2¬Ž'jUB%—^¯QŠ[pWOtúö|M¤€/¿ì{ÿûK|´h! $aqÂ~öh¼„ÐáðEÕ”Ä:—ˆ„ް…õÀŒ[Û½™X‘&ö‰ê’äë¢x&+QSƒP4è~ sSJ¹5/ä蹪Çþ´ä™.«CÏb¡~ÍÉœŸ8µQdÁ.Hh'-Wi¿E´…¶¯•r*š¯KÒ’i;ˆåc¹è3úô˜ºþ|Ï‚oIàÊbs'z¨hœdËzhTŒ®Ù#·s™#Ë(²Õñs’þÐ㢒@JÒhAIŽôU,G}Þ†o½3”qÇ´“s¦Ö5ÁáÊ Ê'ÄsK¤\d”Ÿ>ý¥ÝȘ¢ÓKèš›(ü)Ñ0'L\Mê)ÜÃDVf ¾0‰Uš3gÌ(®?ÆîuÑ*¤nªçÏÇ`aUû€Ú?odIUæköxkÓr‡µïOŒ£ûÚê:âr“¸¼ÓæÆ„hÜ¡;6CÑJÀc#]øBåâ6oØ´Ýx­¾†éÊ«GÈÙ<››V¾öq÷¯ùlô*ÿÝÄ[1ÝŒù.({tÏÂv}}%xÝ‹&½ÖÀbã××gx!}Ô€ÅùL‹+ÇžÔó6Ûõ&è…èì4ŠÊus}ùL Ý–¨üqÄë¹EþéÁ7ÒP¸èeÂöèŸR› âÆš´-—W©ªM”ts±³s?ÕÃxhdË".UþÄåX™Ná†Lppâ‹Ï=¦×÷ŸMQ–Ò¾æßTZ+,`€oê­À§°~dFÂYC}èÁ{3ÁJµ^¨}G“æû=4AÏb¶/bý=ÚåÊÀÈ–ºhh’P¿7F$C Ó·Œ§Ø‚}"lµäóèÅ)+§t ,>·×/ïîiß$FŽ™Ìî#_ê¶ò‰{GCb ³–¨‚$Ê]£C9?ƒýd,g ràH¶¿ÝFãn•¨RdÔfgçeL†|ŒA ÊV9á8ÎóÞ6mZ_7r?ؽöÉ*¼)Êf%æìånÔ6,lˆi‘¢Û´# E.§¬õÄ\ÔûÕú¦H%ÇxsÈqÔòÓ6|44t‹ß» GM. wÁM&W´‚ÓŽv¿n–i¯¡&Zé¸Ð`®´lühë°Þ·C-rÔ`vù³™‹ŠÕÒÍØÐ™1<9‹/ˆDu‹ê¼?©Š²ÙSÜÜ«x†ÊÆ4³ÍåL>ªå{âw±ƒÈ6 õ¬úÌzš›yÂz0 ÍBVV;x¶ó>Õn(‘ªlùtG&­ª(µ6-ÖVïåÞÜçmx[’T½·rûÈ_‘âE‰ÓÞ£Q‡n+¬ <òµgÅ‘ ÂÌI¦¸F“”]yúÏžˆÛ¼Žéð*l€Ovš3½÷LÓú$ÿ¹«Îcᮬ먶J´gü^ÈÌ;= ­…Ê5³Ì¢§3ª6ÓqäW/ÞE„w¥%LÒ“z²V/Ëëu1ìˆh”hGÁ¥î¿äô+ú—ïô£Òè®vÙ _ØÌKê ý¢§yâ2rù” "Q—D’Ÿ·W¢8Âòs‰ ZVÛé{¶sMü¢¥ì+fY™›;àù^Kʘûž\%›Æ®Sû k·ïfËõƺ)EÂè'¢Ášø¦5®ø¼mdQâ –FUgŠÎV¦éT¯lÊ‹JìÎÜxïaÅÂ6bÒò2ö”ªg}a,ÎÝ,Oé7§°P¶¡üFBy ·)Ë?+meîv·‘0>¿dkÜr¸ï`\Ï;î7{¡Ë)ªöÔ8|’Í„¡~©çuM;( <ÑvÙm0Ëe†SIo#ˆ,af%£Yî…Sïç‰ä˜Lâ>»hU—XÙ:NÆH2Q4K8AœO0ˆ½Òt®ÎÙJç{L+ÛÏQßq¯¬{’ÿX‡ØÔ"Z$úÁ k²âä‹Úþù%CÌf­¾=pûÇy`GÔÔ Th‚#ßt¶•F„Ì‘Jүܥä,Ýv¦òCW+J ÷w´¬± ÄÖlŠýC‹ª\Ô¨‚S³Í‰…Ÿò‹/£?m{oÓ,/yñ’ùÛ¦p-Ë'ˆ¾<Šdá¨l“=$)ËT¿­ìß“çS<ÝÐt3 ?~þ¬^_Ë•¯Hß'µdª™O‹pÏOAÓW×brÆPÇñ„^7“‹ãpieú&Žâºiæõx.v¾&Ôædž*“×ç‚+õ$©È‹œ¨6|•0Ð_Ê'†’<¤®§ª¯3-~BÁI0NÒ4àÇ­û]BçE»ÔuoéOD™³›.×Ô½¦cäK(ÆU—vñ- äREyJËJÁC„ŠSÝöÚ(Ô–eÀš{A…ù~ â9ûjYîV°z72ܪϭÏ}*à„z^˜äþîÇœ9ÎN¦ì1]Ž»úð¼­ì£þê(WzèVÚç¡…H¤€a`(\NdúË‘Ñg_}ksümÝ0þ©ÏMehnY¨VKžjšºL¥8È‹ÜS‘ýåoˆ*y®ÓcV9YX\x†;|ÔMÖ£¤¹O&ã{iN³E„ ÃÀõª§qf¿¼/¼t¬ûíþÜrŸ²•¯î°n!,A_™ec0×ÂÆ(ã>ðÉñu~éX)P U§$[Èž3Ö-~v@hǼaÔ4·)7ã {Õ¹ÃàÛ2[â‹3À'ÂÕÀ|ãßšt®Npµ7Vã5WÌ<’rÀ–¯`«ä5:öEvlöåÍ;›¬Rw„ò}- Iîä÷¨YYIÎ&ÎŽªj}÷ Š(>jÒY*>CåçO!‡éF¹ú¸›E¤Ö&ñÇ>>Æ0óãN*cÔàõµ5£qÕÏVQ^Ú·±SolÔˆ¦£é*¤êÆØNdµ5À˜˜á÷žhÇ?¡‘¢t ÕYèHê6'æ£D–Ôv|Íú +*ÆZè+;/é°y¦ÖaJÞ—’|£$DSv^¥Úœi®öÔÈÅŸñjzSâ¶äÓOâ4óVövÍq]àíÎùñ DΤïuöBßòÞhiÖ…'™V–çÎÜ×ÅS;ÒH‹_ÖëÄ}ò†ò®«xxI„¨è×’eÏeœN¿Ž>â3Ó¿.WqÑ;É”2²™nUŸ5ÑÛBñ+ŸÑ.ý’%†³k–4HZ/‚§]OqïMžšÕ¥û~|[‡§¶ 7S'¼nˆ6úîà:ºšø£3.7z¹oýõø0ñ ƒä ¸É™{ÁUñy‚V ¡‰Ùã“s•Î÷‰ê~CLaþ¾KÿYuË:^ƒ‹¾ F%w¿ÌŒkߪã½|ÑÂ6Ú5÷Þ‘-ïØRËc:î0ƒŠel+žM“¸Öá"k‘£¢²ubÁ‘¿'Àn£E©ó'óz,Óh÷ǽ½,|ã3ÓÅp õ™ƒŸD¾ŠÌ,•H?'Pž’X2<…·g¨P%ئœÙ'±–[ÉÈÓ¡©9®ÊÞQ.a sƒÜÔK§ø³\´ÜÆ*šý´ºTŠíy‡OGiS5g[;”„שn»ò·@¿qgѾ*¯Ë8ƒÊ_Qü×NßÍVÞa¶!}ËôÏãJ£+î°ö‹ˆÄ­ž°š›DÎ휵"jd ŒEÙXâŒÕ¡*0žyÛ•²Èaå.Ì Š€Än‘mc‰½å<¿+¼œDü4B*1¦ج´ŒWìzÃumv7B3wЦóNÎ×Ó»ͺ:T¨N‘ nX‚¬Ðp³Ø'X5š\41›µ aÐ×]}ü”ÿN…üÕ<³V7×ÿ¨Á3tÅGšÏu ¹³Ÿ¬0¬èýrͺOZМ(O¼1¨‘c>\÷ê"äȶã~Ýn®]ŽÕM€S»ú{à“á î“_s8œ$Ÿ01Ne4T¯FÈû¯¶šáæ"EÕøj.$Á`’*-±·ÝòïÊd}Ø×Ëòj„SÛ¤f‡c@ÏôÔnv†3Ä,”9¯`ôÊ\øB\´žÃ§×Í\LP÷q·Þ¸æ\¬‰k(´äöصˆ¥\(~jÞíN»ò¯Ípâ<¤°ÓT[ ±Á ëÆó\Ö26¬šÕ3™RZ·P_ ´o{¼eÅS¼)ì…+îÐ=[ÕÖøÑ”…ÄR¦SýÖ{[xNÓÑM¼ {}‡E¥UÏ•õ˜–© Ø“ÜÐ^ ¯n-k‡Ó6;˜Ât-¿ùJ óGÓ‚iÞé½ ³ŽbÓQïPDøq¡f@BFDth i˜i>ñN#Z°¬¡)Cñ[}¾ŒÔèiÎÃ_U;2È^/¢%” £ñ‰F/Pè`Óº¦ºÿ-ÔY?<"ê‰øÒÓÛSÀ¯wÏšRæaadǰ¹í¾NyhªGÂ"z,;ßrÍšI>…´¿!?d³áêmNÔÍWåéê¶U˜+ŸLamó‚‚›¦çNy3¾ŠãùÐ.æ>ñk6äØéĵÌ×ojÆ#_‡–üm¢°›bš€½² ±ŒdgûUަPÇöüQJD¾ç®vêXJ#1ªX.t_(žœÊW×Üv¨üÊê0·¤<§äIáRÙEŠÌ›_Âæ£AÁAÏËü[™Jg»R¼Ö/± ê’©.LMC>Àâ›BÞ.NÉ`þÎØ¸jòÐzÈqür½šYʨPKFúÏ’ç¯H39Sãð#¢…hµa¥yÒãóÆËÈ͸þþ‡Û4ËOg˜Úk䥩 U;|ì1© ñët?µa«ö‰ÐùBoWæ“Ã÷kg°áÊ¿xGd“ø±EŠW^®aÊ÷YÇ‚RÚÉd%û‰xD=(¨ôãœÝüãÉCen,Í]ŒHâ®–.Xë¾C¥¡è¢ÅL>ºÈ…µjÑÝhÅÅœ”ªãRUgÔšÆë‰ºÂôà3Ù·¥Æ ;Nµ]r;Õík “¸6 Û«GÆjíXC§ä¿' ²´è²4¾_­Zš(åÔU»BǨR±½oQóR‹d6üR¤¸ÜCΪ¾~Çõ È…ÛD[G1„pŸ”3Û# ®Ê_™«¬>Ÿ^Î)ja–_0ÿìØ™¥÷&ÚÅrœ6[™ [-èL_b0FÅ # Ûjú/¶?W€)» Ð2øÄhˆ:©ˆ¹¨0|YŒÝ4î6œ&öª½üäxÐß2Dqø𬺂;µ+ c(‚ãs™Á ^b«ü‰²¦ê¨披«0¤? ˜ÖxÖÒ$ÛGݶ½už;ÜêG«ßÊå1´Ê8ŽíZËEjÑ8øŒÖªKToùnžo´ºuï`m718÷RŽÕ™éžÁÀY5TŸ°4 ü޵o2¿v'ë“;\mUŽLf«…Óůîa$¯Ý,Ž :Þ¢àh„ŠÎvµ!eáXqø”EÀøÙ·×ºã]l×ýG,±|–ØóU´Å/Ù¾€^u½AsmËF4¬ˆ3)t0`™¿(ȼ=æɦ£_=4'¥˜à†¡‰2ýPƒÒ‘¸úŧN2LjmôŽáa§;$õAáép&¬|üõלiKKäf¥üo_µm¸Iùî¿„)DbwWãÕæŒðVŽN³ªáÙ*º¯/ÁScù¯ëå—dí|ˬÿe|¹¡üÞÞ7^ÒOT–š7³ƒ,å›&a¨Eí«!?ÂÈhÄÔ¯]¦É/˜=º»(³¦¨U«^—zàüR‘Xñ@¸"êJc¤^Šçíý„©tÓ—/+ª1@eà{í“ õiœb•îOXK2$ªÅ;>»DAE(¥vKA»(ŽX}ë­]–=‚Fy&ÃÁ…4àæ½ç2⤦­ì³_Æ7Òü£ÜD˜Ùõ—Ãä:´³$›°ÓÍŽ!:;ã´ X¹¬9¾Æ•NÖãÑ7zmÎ÷oÂÈ¿Åi Àø%}·Î W¾goËƒš¡·’Ö™}9ŠÝ—V¿°œ÷GÈÚFýxñ\?!v]ùäa8ýCäÙôúaû Ëû©gÉ ò|"¦ý³p2ÁÍé,Ðn­Ç´6Öæ¶âØà("]ÉkÑ ®H—ÂôhÅÕD(žy¨'„b‘Ïë".^ž0œ× SØôŸù—„þ‰Û~ýëªT¶Š¹¶ ,ðÎßÉ-k÷4•§}^Ú±§~¡´%/xÈÆQ˜KiWh÷BwËõ¶÷ èè‘"Ç5"óÎÕ\4Úe&}ç!®ÑáÒïeÊÈfß«à[.ÈÐGžæV¥Ç¶r~bÆ*/—Ú­›1ýz%pu*QV7Œt;­ôŸ£®Í šßwæã²Í[á1ôÏ$Iyጤì÷J#Ìb„uXî²Á/;¤ŽÊ"ÛÆš‹¯Ñx[óð&*Žkì1~iw̼ô<ítïy`°€Ó²2æäRæX7ØwXï»^ôhHŸTl6¤VM *æäŽ^é§kŠÈ†ÞÈ}`ë½MJXx/0œŒ%om™…#ž ¥øD GH™É´ƒbOâ× ã·ìh¦pž£’¦ŒËpú˜›ÅÄ¿·¨d?:K mo€'ØMwx”f½‘ÉïÁµt榖M?*BÔúVs.1ê+Üè½'ßürêîeÜãGêLj6NŒH¿ J`aÖÏþÒïDÒ]mŽurQD5n\N½`ÝO£*ŒŽ±èn†88%h6è=‡K;?L;Îó|ˆ*Iî.zÑš°ñ€Ë¾ÅíVÏØÔï4 ×uy_éü¤wnï#a íN2¢ëœi¢ýp¤Ú]…e0G¾þlÅÌ¢N,Ïlíe†Í/ Ê: ø¡<ƒÔÝÁ¥¬çéZ²¥?X~$Þj♂ñlQ‘GŒJýŠþÚ,mÂ2*œŠFÌÈYÒ}fíVýeaÇ‚´¹¯Á4°O5À20Ä ÇU22ãd5bæ@8ÂÒb 8¹Ã{«ªxÅŠxL÷ª³åsÞ}¿7g˜D©;ñýˆÏë±ÛüêV4¯¯¸[/É&²„%7²ãM ò°‚”M(í¹¨±Ú[Ãh’ÂŒc0£}¥·£J”WdóYú7Z•íCi¤¯UFâ>ư²’ú0òúžu™½’ŽQ‡„À!-œý{¾qÇÕ~Éhx;ƒ )gŸãè<„¼%ªÐÊ"SÒ¥ <ñ}k¼á®Âi|©Òp¸¨g]¬jgŒü!„,ë4át.*>½Ä.áðÍy®ßÄXè»I!IáB6¿º–ÅüÍÔ',lf¤¾û³‰bº„çToÂ~9¾íV[(ÍŒU• 4Ø¿¦q ~ž¨Fɠ˥J€£¥ùo •#Ë1DÍ–ÆÌ‹ë` ý[m;8³ñy­´L`TŸŒ¯²¯VÚ|<é(p± XS1[‰ŠÄ´sðŒSy…ãäìV¥ŒÖˆ¿3=}z@¸ÖA»³¹x¾ ¿ëËödDs¹íj:í¼W†R:¡[üÎå6Î%2<ü¥˜v”áIÄCtÁªyâׯeT¦õ†¤.ÍÇb š4,êé6y&ôôñÈà+e’'¦ <1‘VÜÆ³PáE ö§"ùt¡°"“¯'^/ˆ 6¾ðcör5j#zNÇ Œ~Îd 9ä ÚéÜpÞ u›É;é!kë~~¬ÅxtîEçâé1(ïI?ȲWšJ»¶l(£&åʽZõˆ!s¼.I0òtg=C“UøÅ|æt•ú8Ù»zûÄy+˜ [|*š3YïzÏ2`=l”¥©8­×…<Æ£¾º#º]B6x­¤Ô€ñì-û¶> Ì>ÃÊÔјa(„z§.ôײ„äJ´nÒ›íëwüáEÎËÔ€]r dâKádž°§ý|Q#ø­ÕzÍ ó‚òÕÙ­xÆ÷e0i0‘ðÑÊ'ák§ÁÁ³rlïãg¡Ùmç›I]Üéy»ýlb£P¿awVƒSÝ4X†·˜ËgßªÄØ\õµC=Õb_+˜N™p‰;]xl’cá œ`Zß.þü…\K+RéÃ)P!LuM£FöܵôíÎÎAgØÛt˜úK‡âW›¨ÑÚÛ×[­ <]¿í“FëOsùê&¾…Ào°ìÞ›“@x|êuî½á9@ýÍz/päÄþ*ö b°Ùjc¤ÞðÈîૉ\Kêøw휄œû¶ü,ŠÖK9˜tádDèYµ`¦Yqë)ï¯VÌ-1Âíâì»{7“h”ocöφ\¸*ü±Ï-Æåɧ‰ŒÔX š ÁÖÍOH d÷C Í$z=F%^øÅWö]|ÞZ¬@‰QJÍ«85åÝ3ƒ×„:ù ~K,òt¸†KIáÏ,B Û—RW´ïï?йÛ*&sm€Å:f+rC¬ê²¼;Ga±Ú¸ÙÄ>1^¤´ôžqU¦4BK˜Ž†ÃˆV&ëó ô¢ç¬¹„#Äø&nÒ” PãB[[HT£Ý1&qõ*[µ’•±fv1‹(´”¿® ðg&ïÆ@%¨‡b& Žñi3>3Úö ´äˆÂHP‹ÿºnaëöA-±üŒž&Cj`d¡,c‘œ¨… _v:öq‡Ýw*ÏAçи¸ëš&äAMs–ˆ|1v¨nDF·úËqsìƒò;X1ÊdY§Ðj³G>J~¼yGFÑÖQ“{l9¼R§ÂˆÙðKæ™ø»Oo°FL„N“½‘¼‰'Ñ0üÀX£‚¿~e3 (Ý*á]„ŽóÌÚ6ã|D6˜º©±Ó”û fÊó=7ɧߴ~¿w²}U×pD/…‰âݺŽ1ÁñìdŸ÷ºzdr\ÖS‡ § ˜0æSžs–˜^êŸRó¿ñ3»a»UOµ(1R»¾s=$âù”(Kª©o7ÙÓà™¥hPòVª½ŠÂȃG‰ž'ýµyù\…¥™ÂÛ w\°…‹\\z /Ï—’C ¡òZ‚25t$9Ø~¶§FýF9CéG†u•-iV·K´û–q÷#òW+ ¹ªïOð©Éû:Ô¼Ýë±¹Œ¶;Ò~ŒQ†%.Ði”%?ÇãNÀ¯´ÈwrO[à½+?¨¢j_{W˜òúíÑJÊ5"µŒ¿øªçþ¯¯)y‡¼ûyżç|þ,ËKïUÊì`Ý´^K‡çF;n5©}žó_^¹Ó¸x¸ûM,÷%]±»ÇÀÄÿ"TdBüKç ¼©×@x Ù+o Ý€k¸áñ;ãz(Aï\‘–\t+C9CצŠI{bãä&\«JtØä|r¾aˆê¾^^嚄ک%¸*p#˜u4/ç†Yîg#oþÏùå×ûú‚:åœËßlœ÷I:_ÕѰð É»ªÖ6}MÔùùvˆKÙ U?3Ÿâîéëfåf±êáRð´ê•WTnGaÎÏŸ8’âæïÕÜ¥ûôµ°…ܯëg^|­eO¢é>ÉäUÝú®?rtÊ'LCÎ.y–Ñë,\1ž“Öç^á¡Ä¤>æÆæÂ’’~ÑzxÀ¨¾yÍðèöí“Í]mUÀ¨`ûhÊFHÓfûao¥L™|á¯6ÔŸ|ß8—Eבã¶ù~Hв‡rf‘k¯-Ó®"+ï`0gùD€^øpx˜J Ó‚}ú¸B^šw=4ÏŽ.ûÃù ˜½ÛÖÈó ¥ w,/]µ‘§l ¬nMè$lìø©35f±”ݨ¢î¬ŠÙ‘®‡–8ÈeÉ–l=K ½óAˆbž‹ÃÁÅš•HBü•‰Ò$†Ó%<€q¹Çl¶î_ƒîß3£|bn˜ux8g³ïÖ,”Ú¬UQ5‘¹ êßa*¥~Œý ›1…+þòî–ö3RJÙ.ì•ÂÌy’"b!bú$z5H¿[]QusjX&V¼³«ƒ…ÁWG )/™„ûü΃çì×4ƒS»·¡Wñ«Äjš™ßIP+3<ŽÛ?‰×ó‡Si–I+5wÖÿ0¦ÅØ(Ò›ÖcZM¬ùÈK'_:æø'aÆÄ?RÝĬ8Òøf»¦½]T‡R&eGÆZêûUÔ¡€é%ûg5¯´…TóF½ÞkÖÔ… …è²Ã ÷—vùd,5nÞê;DÁj«R áÜx†ÚçÔêëZñ‹;¶;ª¥85ïá·ÈuÚàlïö¹á2 E“U¨(føàK„“’„$t ŠGw:¿G$U‚~ÔWCd˜#h)L:r³ž0sïEJ ‘t„7Žÿþ¨æCNî{&w7Ã\î Jð¯­r)ÔzIÐQ}«Áø°”óÿXl) endstream endobj 94 0 obj << /Length1 1527 /Length2 8928 /Length3 0 /Length 9949 /Filter /FlateDecode >> stream xÚ´TœË-Œ;Á ‚Cp×àî$Ø 2ƒ ®Á%¸… ÁÝ5wÜ݃kÐGrνçÞûÿk½·f­ozWíª®êÞÕ4¯T5Þˆ™AM@ÒPì ; ›@BISŽ ÀÆÆÉÂÆÆAC£ †Ù€þeÇ yrpC!ÿÁpaO6I 쉨…älìœvv^66ÿ¿ˆP€$ÐlPbÈC! G  ¨›ØÂö´Ï¿–zS;??/óŸp€˜-Èl „”€0KíÓŽ¦@€Ô ‚¹ýW z!KÌN€•ÕÅÅ…hëÈu°a`¸€a–u#ÈÁdøÝ2@h ú»5 €¦%Øñ/‡Ôætž 6`SÄñ)Ä br<íÐS¨Ø ‘ÿ"0þ>; û¿Óýý;ò'hj µµBÜÀ €9ØP‘Vd¹Â˜@ˆÙo"ÐÆút‚m€&O„?¥ÒbjàS‡÷çh궃9²8‚m~÷Èú;ÍÓ1KAÌ$ ¶¶ Ìãw}’`éÓ¹»±þ}¹Ö¨ Äã_È 13ÿ݆™“«lï’“ü›ódÂøÇf‚¸ÙØØø8ø {ÈÕÔ’õ÷šnv ?Nößæ§¼<ì vó§6@^`sÐÓ†‡#Ѐ98¼<þÓñ߃`6…L@`Æ?ÙŸÌ ó¿ðÓý;€]ïÙžäÇ`ûýû÷ÊàIafPˆÛ?ô?WÌ*¦¥®¤)ÆôwËÿvŠ‹C]o8¹o8¸Ùìì\Þ§…×çQ‚ÿ®ã?bå æPÿ_å>Ó¿Jvþ[ôà¿s)CŸ” Ðÿ#t}6n6Ó§ûÿ³Üÿ„üÿ©üw–ÿ«Ðÿ·"i'›?~ú¿ÿ?Ðlãö7ãI¹N°§)P‚>Íä©Ú ¿FW dv²ý_¯ ø4 b‹'E¿açbaãúËv”»‚ÌTÁ0SË¿Tó—]ë÷¼Ù€! U¨#ø÷ óÅÆö?¾§!3µ~zEŸ¤ùÇzš¡ÿÞW b 5û=lÜ< ƒÐ ã鮟7Àƒýi*Í@®Ä `e@aO!€§½æPŒßËÃý¤Ÿß¦?ˆ—ÀªôoÄÿ„€ÿ ~«é¿;'€Õâ? €Õòßë)«¥›åÓ#òƒÀjódç°Úý|Šwøø”Àñü¯nMžFÿ,ŸŽâ_øÏ;¹‚L1f§ ¦‚VUM×b/\Þlspa÷œ†£ioH‘:o«ùIý:ãÌŸk›Ø ÿµ‚¿ÏQðXo­CÌfm¸ì™.@<[Ó„ln²Îì9Š/|³ï¨èı¥ÐÚªgÌ 1³ >úªÞçrþvœá9³ýÉædꮌíײ«RË#TººŸ,XÃá¨$||œXÍb©Íeâ•bã-rÔŽ§o‡â^JïþJîàà^ë™+b†¯&¿ØÛöS8OÝù´ÓÁC¦`< §Ùè"¹¦÷;o ø@oâ8¨!úZ0MncôTöt#BNÝâ«lï bw¢ÄJ4Õñ ºØWº5CAÆVÉ‚oa³ š¹îœÜtEÅÅ2ÂÒè˜]3èÒc?ªX¾à)x*VöÅj:&¤'ç2¤Ô©jœyL³™¢„û;D‚™Å›_®û¨ûÃ¥G ZMÛ-úÀ*µrš:qd1i^á„ÜRì¿ö{—CîÉ3r8(ÃÎ$J¼em¢cmèÃe݇«<$íí4»É€N±Ÿõti„É„tMat„¦W±œ©ì€ˆ7‰o òI²,¶ë‚½`§«o=Hi GuÇ/ÒŒCå0ü=ç³ñÆÀæã÷ ëäÁÕB!$îw•?Á)‰6iÇÚI/µ*ÍcÂ0‹½F2í# M™ß–$x„Tðtx-‹†Ék´VuU;_PÇWŸƒ«©¨OªT>bd}¦üònV-Ftnqî´¸„“§È)¾``ØØ ¿ÊÉ;»ª n¢t=;‘ÿ¢u³³òõ’pª9‹ þéx_ñ:™O#¶ Å8Vý~áÏ™T ”Ù/ðçn¾%€rÉúÊÕŒ-;Çj󌈄‚]2\d(¸„ø¤lzôÔû“:ÎdŒÚ#öU‘f!eè–:Z‚d¹,Ý@J^ÞÜÞ¨JÉîÛ²=˜­š«8 Vy ¢¾Ï»n_®~F1ĘT´,-Ë»•ƒ{ᾡ®Ò¶l3‹©Ö]ã¨_ÿTvøò+­®nïH˜ã†©¹R™ }Œ›[öV¶, £a;2ž –,Ý\a Ž´?<™ƒ` ưž\êÔf¤*Á}ƒÃrÑ3«su¼ OÞ¢b¢¦çž|æÉ¯~ui<#ó¾˜Èud†\‰ß‘¶®——ÄžQxºîœ&îþ š{l¶<§´ÍþÛhëŒÈ”+g?ÌX}Š Ò-κ>øq \öæ é߆Ò,ÇAF´éý ¹äˆ—i,™eË¡ç˜kW4ÁŠ ’~ ·ìqrP^ ˜œî¦#¿{†P;¦áí«rQXV‹½Co|¿k¹¢ã(#FU½N³Ó3”D5fyØ(ôXùŽ—¿ÌòuFÂëɨš##a™0,$E x ‹´‰oêê÷œYó^J¦^Ƨ‰19÷’e ËõY-Ç S®Õü¯áÓÀÏ­¼bF»©}ÙèÂÄîm½4+}·jPVW˜­[ r̘ÿ1–k8aÀÒXÀâ…šÅçœm *Ly%±Ÿªáu.¼$ã uoQS*þš››~& €_.G ×Ã*:MMÌåœõd,œAÆ<•ôís6\·@¤¨†/®ÃkŽú 8ø@t¼H¦3ƒƒ–îïÎÄ%AU—÷gºÚÞ `i={Îç=8¼±A˜?½æ ¦BöåÞ|yFÜÚ h5³.ïÿÀt=ÓM{¾]”ÏàËb(D€6¶÷åqÂÐBÙæÀÉ^€,æÂ }á å˜5Kô¯‰ùçý"?®Í6ðÚt3Ý;8ã‡$É ©(éo‹Üb E‹Êço‹á‚%H`e\Üä¨ ä××wö¦¹Yùïr?Õï{-õv©ÎÈÑ=¨KY.|ëE¼¥ oô…‡¼²;Ìö7¶~´±—¥Ë‰ Cูx–ØŠV5'¦2bÀQ (Ïywƒ‚õ¾ñÅÀgÇ6Jh:Ü·[IØéí.pCá¥ï°O’€×,n3?«Ò¬ùA#ŠÎ¬ùiö›éaÏ@§.SŒý”$H­'§‚•ã A´ûy³±pÕ0iÜì8Ú{`?^޼{õWÙx¶(§´ "ßÊQúyèGV]cT: nÂïE»ú~–8_tãdš_%4¸ø+':-áMÓvj€µîEeËPÒ‘OÔoC ø0³J¾¨o×I«ž×œh[ÖtÁÍ 5»HãÉÍd¶ºÏWïl){RIHU¸x‰o¥v7çî–±•qÒÚ9r© 8õ*|ri>g‚HLx;·^NÁ péÕ~IÀjfl7?J}TR]¾ÃfE€ãfUûñÈH9±÷s³6ÿ¦˜»…¬ÈsÔîýp3`aÿ…¶GÊúHǶ½ §_°‡¯Ô  ú`ѶÜÓ³#Ídë·çÏ9E\UÈHƒé(¼pRGT¤Ì@žÂÝ÷(ÈíŸà‚ßDŠTµÅMë² Ùl<´¾/5áÿþué—²z¡C@# ›ÙÊQ/ËzSäO¾.ͬd 0fU"§~L$*Œ–žvü¡®™oxç†~ Zxróî _f7Ì­V9nõÒ&Kƒ]dh9¾›ä’J éDá\ŒÊ_µ":OŒûbŠè$q’¼èž ]¥‚8·hqžöÛg6tDƒ¬WôbM(8~ù7ØÊZ…²{Ùß7©r{.ù~æö{‡ ZW©®^rAåíoãþ$_ÞÄ#Š@?KÎuN™ˆ >‹À=+î_žâ»Öâ~ß`4þl³}Œa÷„"lû}õ滟ÀãýWö‰\“zlÉ<þûç^ÒÆÁˆS­¥lW¦Ûõ,õÿ6¹Ë»7°†è ;·=(®ZÃÌþôt{ÄVK“ǹš“,…ÝqÓrœœìg7ÕëiP?´*© ¨Ž4 ¶é¶ »ä]6²ž9¿µú*<ü¸b¤˜ð6(÷ªÈ¥SùÇW”/é3A´†˜ïa‡.á½[GÃ4߀J¦>û¬Y‡ä'&&> LD))öKÅææxj~‘¸íÆÈHTBEœi(kXKÄ6&Z‰!£6AV<°ª 75$Zwr¶úòYB<ŽÍ!)C -ˆà†ÈŸi¦&ðªÅâ!;%óþ1`¯åU•E ¶/y§¨}µKc(l:U!KoòvuA‹<†Á,ôîžaM÷³û§_ÝîᣭȨ[yå4ì¯ràz3ê*ªƒ´©ìœFîñ¶ç@uö‚åu‡»» ‚·Áô˜†iõذºÕGuC¶¼ ð!þ‘Çd+Ž…xõ-ÕärþÕ‘¤ùõ«•eaÏðØBµi Äu»“8úVô÷aÞ2xŽÎV>Éß㬋U1-È×YIª…Q¦pÎ.£ ´à(2êÚÜ÷(ã°4˜©ßŽñãY Îë-מG=â¾|ô!à^kY®Ï‡L¨Ù–Ì&ÿ±6¾\=ôÈIC÷ÌWÿö á^sçy¡³„˜åu=w¦¿ß¾t‡}à:çYEQ_hh¦Æw•>,1gQÑð¤øŒåÆI„õ†˜wÖŽÂ6Î&K#Ùð|ýžU}úÍF4Ç? ªEhiÝÉåP‰R/*žiß¼kÖ¸k‰E½ËfZ„¥î“ôŠÅjº¹¸ÛI ›+zâô˜V ¸ái†RÆ—õEõ» rαø/y|Íñšª™3%Ý38Oº‘ êö¸˜Úw}ZZB7DÄ >v7š¬S³_iu#'ús3ç5#™ßjú ºc>\N~9¬(rïkÏ_!ÙsM^¡!.ZÇš »÷_7~ÉOS?O¼äê»ÁÁ _Á—•1Le¥ƒ¡i?jß}¿Ûv"çf4éFD%á¿S^ëGŒ¨¡(÷š«ƈ¶€1Å{$¼ÌêyS+‘«Ã‘ê;1 MÜöÊE,éç ë¾~:M%¡·c~eÍÖª|æ¤Å "¢Å;g¥ƒ€MM8_ÖÚÕíV…V}l‘å—ÔI³ýaÓ3•ŠÊØÜÒÂK ¡=¯^OóÁƒ<ûg†â&,*PŒ”˦Ô¾\,e¤å#§ÆÍëk‰ÝµF"› ½5zþ½f±ìcõ]€ RÆÒ0·;ìAÉö(±ÜóÐ,2=Si°ï¶mßéTÈϼ\5ÍSª˰‰••+ æ;’•WÝîéñæ.ÈÓÈŽ ™‡ÆøácQ®ÂOqG3ñKþÀçÐìBüÚ·%Qs©Òð>¨z’ lüûôœÅ/á`¡ã·+ÕŠ\=†­ˆ-“ùþBÎÀ¶ãâOk—yBnõ®ûf›wšõÁ™ô®÷Že«¯»f«‘×t‹¦(ÓžÁ“8:éÓMÉC{ •öi¿ÄaQéõ•W)3¼ê¹p†Þ+7¨‡M· 55EÞý#‚ÙÆSq€Ý<\¦Áh.NLìT˵lçÏ[1šÝŸ_¹`¹LñÚEu¤üV+œ¡?“;mÇ3†{"öÕ¡;¡|¿"ÊïäpÁ¿8j:æN–«ÇCy¼¥±šÛ¯²PÄÚíåû‘Êç6˜!W/"›²3H‹<·7zÖˆ.´;åˆupÇyG´¼›K/ŒÚ‘ÕèúŒO¤Jœd{²d{FÌ‘çšÍ±PP'ôÛá©Ã™Ï7c¦]¨´ƒNƋӺsd.&¼ò³”æÍ’²û#I²áPŸ(²nˆµÈ‚*®ŸØþµx »F=üwnWå”Ú´ç»þ :@Ž×7h‘ˆN0úº»@2op7AUÍú`îÎôÚ3‘Æž¹ ‚kfé%È™›¹¬Ñ½¡ ò37Y­XdÖÅ×T “°¯(G,…¾…m¯FRÀ.¡®éñ¤/=|ö°Ü$α$L<ÃG[HJ1që“+×x ¬Ûãâs6Òö5ØO›?mÈùkݵ۳âGÌ$+ÑtdoðSõÍæÓb­Z|8]h ÷t6¸"•ü›r[uBýE9n;0‘Š7·È¨Å[Ýyî&²±þûµ¯Óõqlý5ÕHÖ|oŸÝ…–÷c^V0?³Oëïˆ[@ÜmØåR/rB;m[wƒáŒºØ•4ôåÇSåF&²ˆv ÆŽ•O°.Ø,¼·Y¤MÝ&$ÃU÷ŽÒv•}{u 1èác’ãvÑ5u&X¨jÔ¢êýDyî¿òQ™”¤}¿á˜ë4%hd‘q¥ëBØC/í§O”I‘fhQø¾âNÛXíÜïçäUlïXá×VÀ¬¶V!].ªÞ"c LEn½^¯m¦‹ºa¹Ýí›ø»Žšk=WŒŽÒÆS»Êy‹¤µð†§ 4¿;ÛðIޏº'vüJۜԥç°ÞVLy°ÉWqõ|½ñ^oRwLq^å$/çÊM¾D-޼M‘ŽZH§·É’N]…¢i”ôYê!åc5±ä=ÊX@[L/à(Ç:Á‚²±§ØOB)ưç9ª6´jØ#wý8.b"êW%W«ÈÅZ:_S‘/8¾Ê¹¬~ØŽpHš—D ê声nxà &ÑLF:d¾QËÓÝF—k¸Ý ¨—ÚE–o¡uhÒ3A'þ^¡¢Ñ#8ám/ÍoÚ÷ú:¯ØÔ4‰ôÛTr‹™boŽ [Oâ@+^øç%Ën½éã*uBùü^€ã„L¦tÔ,麇 ÈFÎTǀǜ:Ì“5•L»–%e›t!EŠ`Q—Y UÀõvçìr$k¿ôÄPLªD-”a‹ ºF×ܾúE”Ù‹…©4$v‘*Ä‘Á `é|Y˜¸žÊN¤Þ=s !éNì)ë%ŠùºCiÁE9VÅeÃÚÞ­£ŽÈ4ê)gnà‘i9Œ%•âgÀíÿœâÉg@Q.‘Áü¼I|þ]?£²_®ÞD}o’E|ù£qèÝ|4jZ®jP˜¦D@cúéƒâ¤”änÇÂ#2 a8(LÅ$½Hÿ3ª¦0ëìíù­¯cßX÷Eweøe¬XT"¯ZÕ\úyþåçôàA"½Ä«™exI“ö 4òÁ©BW²Y+šƒ¯cºÝG Ú÷±ì§)K‰Û™¬ºÖ°·-,ü>ܧ¿\„:Õp˜oL5}<’ý¼8°àÊ´Œ¢M º:KI_Ó0 Ê¶Ÿ –ìIØÊ&“ÖÕrJ6–d½è°{|6B‹^AOÉòE¢­Ô•ŒNúDÆåz†‘`#Ù†ÓËç¬0#ÚV̦ª2ýu¿¤Œ4‘ÔÇ’”¸ó"—&"žÆwäŸû¥·e®ê$ç&Ò<6ÜG3ˆ›„ì¢&_ûp?ƒš’Ù}l¦\¿\«%²Rƺ06Y³{ùˆÔc橽զþéVäüA*ã™I ù³~}ãÆZMs"øîEŸËô6Hé¨é#¡0q¢£µfY¶ÇêK$t¨µ9̘öÖfÊiòzæâûŸ—~°Ž€x¿Û³Xš×e#3á›[DF‰\2¶«OEæ‚„å%dêÃ&ißÝž4?CÚ_ó¢†zs§·ÎD¿JÉS=¼îó®0‚ §†§YV%ÚzÔ[L'"W©KÁáá®Ö}ý¨NÃÎ]‹Úžs/Í¡\0¬×¥„26©¬‡ys5Ħ~¤—…é+^-Ò,zy •+8YÅ”Êüæ½{ý¿gˆP8´{æ/ø¿qº¿™!ËÂ-Šöõ—›8®"L¤û¡Z"Šh}á6dH4ð ÉÏÃø+dy77á FóÅ[ô¬iÛø¦Ýµc¨\Þ¥þ#™JxÆûû7£i­Ø¡ª6ctX˜"YÜÍGëk2Õ ¯áôA>…/&w¦Ü:èæ"9PÓ›m¾Â»Ó­ã•™< µlF1q–‚?ˆçÓ‹\Ç8 EÁÁW™æ©þ½§Ë©xs~$qÕËìêι-**“Õˆ†_ÓsÑ(®,ÙõqH—.9M6Ó«3¼³qúá=áCR•Qå´e¥–>BI]ÈWçÞù¼˜ÔzDö»u¢U;V„ë>¸÷H2±<[d”Qt˜÷¾Ð’oÌÂìK†ˆõpP''´»Ú)¹1y? h…Æ~G/„#êy¯ÊË9Ϩ+ã(!bÙ~Æìù4’\%÷Ò+&µ‡ú=óZ#CÁªnçÅ‹Qq† "s%”ôM‰Uß%UÆÌžçK“©T¥Ì…§¼çÛ”%¦ øq(…öÓû ÏÌ K’¬r´Ù‰Èi4Û,Þ½“€ü˜é—Àˆ!ˆÒé¤Ë‡6¹»êiøÂø |"éO Æ ™Ó0h3:1Ü~ymfR ­X]x()Q­þ8;GúXAñrJ¬#Â~Àî‚ÔköLqYÞ°ùÀ¢*]µJf"Ûíã$4áÈûA¬mrK³$@tgœË™]ûh>rÚ™2ê,“ÈS'_§m­/ªÓد/}F;¬ñ‡?Ûuy:®N`ÐÝ¢‘TÀk]‰œ‹Lc­ EgŠ‚¿IÐ^ù°vƉxðŒÜȿßù‰g/ä*IH^™îÌø¥%˜þ%MPÒ²¾8_bùŠùvûÿ‹ÂÆiF&¢Ï&ìÁÅxCL™‰Pålì óZ…9ÿ9;—:²2þð.eÁàq4Ò!Æ0¾Ù‚ЙF-‘µIÛ™) Rµ‘£uÇ7I×ðä´Ú¥ Ù˜-êb²è[³ƒñá/š‚ÌÏt .ZÞÂAôÞZ|€m´~~VñÞ ¨GF¦”«$1W°+Ž9Ь #NÑ|L–¶da6ʺ’'åŽ{Í¡ú²&I«~Fô|ÚŸä _F^ßõUFRHr²Åˆ`7ò%óºæFˆõ·Š :Â5ŠÜ<샊ŽÞ®ÄÞÃÀyM‚ í‰J/„1 ˆ‰“HÒ09&ÑóUÙÕîôLÍ÷5ü`QTeÇÊ ÃàXUßÈüà;.ZÿèÁx§ü®îô%ÛœZé/Ù&88®ÀSi k~Eç†w¤•nd*à^ NÍs -ÙHp¥Vënz Þ´%U£7òÓH˹… Ô-dÑ<÷-ûŒ£ïVËàšf—Ïï¢ÕŒ’Q¶ð¤Å¥‰H½J’'¤Nôÿf’KÀ|‘]*ÿ5–Þ\ooÓ/.á£0ð’ 1ª@Š rØ—CáT­õ"b ç´^0²‰LØûgÖ;¯b’ÌuMwÁJLΠ¢H¯kò3/ËágîŸp)_O -Ȫ|¥-X¶ÕR 4÷ö^}Ʋ½óA,–03BSÂBæ—™(º}½š~ç·Æ#‡f*ðž,ƒ9”V0+ºx¯Íû1ØfÎy©”\‹£C ¥“Çœq@Äm딦]€¿4w«öÎË£ ­qO³`Ó/I-Ôê׿Bž—` ÓBi1õ9=Úp'²g´kð|—r:g‡?]£Bñt†çjÊšKµ1<~òdÎ$1ÝfWrHÚáùl’ ±4¯Žû.Xw¦žˆj : “è.Œ™ê¤CpVV*ØG{Ôƒ¬ª™°y ^ýš«¢ãY"›º9~ÈìÆÍ/«Ùqع•3_"âàB†J¸bS“g%òë; ¯¶ž‚¸° Ö•.Âàò¤±ôp¼ÊÅw|¤C‚‡IÉýQŠ<…ÜÅ—UU> ÿ{û/S ¢£›¥Âí ëÇd57|l 2ŸÞ–Ó‡Ê_o8*\ª½°¿òwàOg2¾Ræ3-°wOVd+¥7rìåcoy³>ZØ ¨E°žÖSôol"£É…V¯ðý S6fõºuíJÌp3ñ[UŸWÔdÐÈØðàT‚Ç‚[¾7nâ\‹ÍÑ hÐtrY>޶FRÍMZ0»8—È>FÝß*—Ƹj8Gm-<|7·2Êy#ß_«ÌÇg ¨4ùë6’ÝŠZJãZœjÅž-“Wq¹Dù°!N•×05å±¼pg[Iàäs²‚báòbš ¢Ã] ×ãY.eš74‹¢‹ê \ÄŸU8¨ÑV¸¢"œ°à ¼M™g­[âÒʹ>ªAŽÉ·ï‘†¿µ¢ÌÜ⺖¨¹Ôà•f•!F5„`,ë­=Œ˜ ø•`ˆm‘í«Üþ77qË]¤Þ™•¦ptµ5ò0¯ _‹*ü¶a«ëHßkècòø¥ê*û‚%Z¾( «©ê|öôBÒM(„õöµ~IÖò˜ÎÏ[’¨âµ¼º<ê“V¬‰ ï²òmªßY&äé¨|¦ BªúæÞƒ,Þí¿ÛÊ«ëʆ¯‚¶›7ï&ôbE ìûÆ+©æNÍ׆brwå—Ž‹9'G|V„GX¼À»¹§±ÊOµv=”Ï»¡*-bäÓbjš5îÛ {—áƒ%éü¶C“–p*»¹ª› ë.ÿ膲*ÍÆß$·õøøˆÅšâÅ’Ù"éAö ø‘ñyÝù7fÎWÍɈ#ñ>D‰4窖tƒ1ªõX™ñv‰\ÂÍ :¤½ ñÄR«Bàá½RMCÕnßl{ŸØ@[Œ±ÌÀ̲¯³‹M~[lN5~‹ÒjW(7R‡¢x&'˰z|¡²Ù®“ KÂ#ñ<ãy ÃâpáR®áDX3:ò’×YÝýÓDk;aè‡Å”‡7a¼£Âfwê¢^¥ 1wv=Î(ñÝ ?Ež…¢Ÿ@¼~ [ÎÃÏËùv´¸ê†rz¶Ñ¤…4O]àÛºæ±z4AO$’qMþ¸®G¡2Ãþ&;•xë“ìÊ[Äx©æ:_øË¿|Æ»¾¶»‘Žb«³JE¦ñ¥Icÿ¸=¼ã´›/”Amdw¿•íxn!?æ9rZÚãÊø£uŠê6Á7†no?œ)aìl.ŒTˆÄ«‚ Y,Œ_Wj4*~ÇžYÖ–©Ëx¾!œ7ÒŠ“jÒ&[˜”æ"k8P0ôæVøÉÀl8ô-F˜0†Zdéèöðω¥÷qW~{¶ÖíjQ)2‘iHÊw¬I´k(Ÿ(Ç‹¢û'lq^d%¿¼ëR—écݺA¥æpB[4û5×¹¤g)ÕÈèdý}/þÞ><¢îæÀL’UŒ<ÕƒžtŽ=Š(dWÛgö:ïh{nT—ø}(÷ë¥JÔÆRò­›.¤gðV  ÁݾýHâc‚´çŽq¸ï(•¨"~¤†â§÷nãT»MÎX›´ ¦Ú„ˆ/ß=š#¯ÚzÖ+t0G0:£äñɆî\inv`E}£ëˆHÊÆ^-ËiÕ4JÁj×#Jܤ*[ÜXÖ-xãŸFÄÎ\›7À4e”á¬sê±$ô 茘“1"ª!‚êe>å•ùáWX‡ñîe«RÞÍšÕG­=[îÁ'lbŸ·1~«—2ltˆÊ•¿Ÿ¥¦øŽ§•<\l)ð¥—þ›œP2sÄù5{¯ÒMôÖŸ–Ôð}²PäyéÊN©ÑÇòõ*%×wå…< ôšâÛe{4ýåhFÊ…ªóÓÕñ wSƒ×êm×ø&‡×Dúž9î¼_QÛuÐ7ÊÈDWD—ÕÞv´X¿Gê`ËÖUkjÀ—ášè!ñÄ%}›¹7]½I8kÉ9×:†Úæ[óÝ‘V: ÇÊŽLçÿª«‚&uüJ7.ºq‘¯7øBEpßþG 뜂™v©oNsóÕX¥ZX{µv¥R¤qÖ>)iß0íY)_-Fb•lïÙ_‘uD$jÄÙ³ç3'róÕž;1t!‹¼ÐlZô¥¥ ’3š0“åé Ù󾻊ÎútMzk5,§qÒ(7ysœ]oÒ®ywÓöÍ؉âÏkäôfz:ôù5§§Ÿž¼Dø[œ[/q«Ê yÿîŸd! endstream endobj 96 0 obj << /Length1 2094 /Length2 14116 /Length3 0 /Length 15388 /Filter /FlateDecode >> stream xÚõPèÒ ã,¸ÜÝ%¸{p÷Ü݃kÐàÜÝÝÝ œ Á \vÏžÝ=ßÿWÝ[SÅÌÓþôÛÝP’*«2Š˜M€’`;gFV&>€˜‚š+ €……‰…… ‘’R älü¯‘RèèÛñýËBÌhìü&7v~3TÛd]l¬ìV.>Vn> ï ÁŽ|qcW@ ¶:!RŠí=A–Îoyþû@cJ `åååføÓ b t™ÛŒ-¶oMmª`SÐÙãBÐX:;Ûó13»¹¹1Û:1-in gK€ Ð èè 4üA hl ü‹"%@Íäô…*ØÜÙÍØxØ€LvNo..vf@GÀ[v€ªŒ<@Éh÷cùÿ0þj€•‰õïpyÿd÷§³±©)ØÖÞØÎdg0ÙJ’òLÎîÎ c;³? mœÀoþÆ®Æ c“7ƒ?K7HŠ|¿1ü‹Ÿ“©#ÈÞÙ‰É dóGæ?¼µYÂÎL lk ´svBü£>q#Ðô­ïÌ=®µØÍÎë¿Èdgfþ 3{fu;ƒ PFü/›7â?2  3€“………‡ tÝM-™ÿH æaüSÉú‡øƒ—=Ø`þFè2¾}!z9»ÎŽ.@¯+þ!²²Ì@¦Î ÈñŸèob ùðÛû;‚ܺ,oãÇ `ùãó÷/ý· 3ÛÙxücþç3+j*©è¨ÒÿEùo¥¨(ØàÅÈ`dcgp²s¸x¹>ÿEÙôWÿò”±3xÿSì[—þ[°ë_@ó×zÐþ7–"ømnšÆ\…“ÅôíëÿçaÿÓåÿߌÿåÿuÌÿoE’.66êiþcðÿ£7¶Ùxüeñ6·.Îo; ~Û»ÿkª üÏâ*Í@.¶ÿW+ãlü¶ "v67ä$ rš)ƒœM-ÿœÿˆÕÿØ3Pìúã²YYXþîm¹L­ß®‡ÓÛHþ©¾íÎÿf”°3›ý±dlœ\cGGcD–·Ibãäx±¾m£ÐýÏ!03Ùß\oì|æ`GÄ?ž”‹À,ò‡è?ˆÀ,þâ0Kü¸¹Ì ÿ 7KÅ¿ï›Îøô¦3ù±²q¼AcÇÔ¬oØÑØÔøvtÍÿ‘³ÿ-ÿÏÔü­x«ÃôŸxo]b6û²s½!°Í¿°¾- 3ðoøÖfàÿäúCïàò6mÿ¸°˜Íÿqy+Åäú¯¨Á.ÿÎñfbñ/øFÒòoÈñÖUK{Ë·ãùÅ› ô/øÖ¤çãhû|Û_æ|9ßÚk÷6ÿÒ¿1ÿ“îÍü?ê·ríÿQ¿³»óvÿÓnÖ¿¤ÿÛlö7".`g ™É¿Êc}“þ‹<ë§Êû]ÿE–óÍÜéí~ýãðöÿäx»ÌΖŽÀõ÷­Dg7ð¿Þ(»ü ¾uËõ_ð°Û¿&ì-žÇ?ÄÞl=Žÿ ö?ËbêâøÆ×ùÏ{ö¶IÿÅþ{ݦˆ+‹`Sþ`«Úàöûj7ƽÉs”{š©´Œ^+Ž.¨ðÉ´U™›Ž·"É#½hßw%hn„WI~{´Ôǵ&~j{ò~6ŒW™ÙkC\žÆœ*8© zGȨ&¼ïýÛÁ[#Àº²K–2ÇÁ…U9óÞ­_ʽn tm§Ñì…^:[l1 žëåjlNÝøø:xDÐ7ã3T^¢‡_dq—¼JŠ¢6?.e±Ð2AlŽxu‘þäÓ•—ÁÀe±q\á•§ði«cÐêC~—¹§jdOWk‚º„Goîæ&)•§Ô\Ôo°?öî.Ü‘ÞLÁ5^ÑÃk{æFûäFîäg픮種ùÎ;ÄìïM¢ëâ¿Ã|°àíót{Xe|£¨ñ곚:µŸsßwWí,“8sAE„/HN{†YÞÈM9SƒÉ¡÷®Š·Íâ^­îþª¤ú“Ãåþ ÇÏÜqT¹'O77›¤©"NŒ&+ÓøŸ:ØåP¨i ‰ÜÙ‹#¥r5|÷ä²kf•Â3m’§ aw=†¥¹Ofèäôµ'›O"`æu¾†û57¥hF(Þ`EHsj3¯î èÔä† $BâHLêŽMRåDË õr.ÜÝ¢Dý€ûòÏÒÞÚ¼)\Q·"“GôydôªJ²WÈB%Mî[þç‰8Õ9åÀæî×÷±å…oJwtÇ ûWô«É}SÇuæzt–=F݇«¢jÃj†4©ÄuãçŽ 2¨0öZøÉx ÛB”}|:ã7»úfŒo­˜ OF笎I“4¬ÛíGߺŎÌ)4ÍѹÛ6/àìkW¦` ž~GarÜÃ,³7÷bïöæ.;È>úʯÌ\Õié=5Ít_¬"³1R-7m›iskðJó»?näúqSÞÅo[ÉþëçeD_ëSºVÒFØã$å|epB ¹…qÔ¸E¾+<))£F0ñǬÇEIÒƒBµj²ø}jî³°ö­´µn$–\ÊHÚó9‡Úì×âDeÚ‹¶s#T8Ïßr¸í?uDs°˜BJ§Í/p\¸èž¢¸iwô}IÏÚûÊÖ®ë<=;2úe5?ª>SÈòWZD³Iæö Ý …?¢Ù`¡Q@99$ã3_Y`Îå7Ú˜oÞê3çƒßN¢ÌqáÊ0Å œïÑæÍRz‹s>–gdrN\·ûÑ4œYq÷Pž€„_Spv0‡Ñiñ!gÂÇÔ˜!¦Â?¨Ÿ–<ª¹‹kaMr–˜ œmZÏF™ÉóÇeÅï˯•4PúÂø5ùëUo‘N0¼A&éS«…ÛÝ[w.sQNv3{—pÙŽ^5·çš±çñ +áíç&¦­´‹ë€H ÷@mêÖáÒ»cÎpIS¿vVl; p‹¦X‡qn¬ÈÑÏ÷ã‡ìþ&Ù2úa™=͵|1ã?PÌs¿}?ŽLÜ;¾,z*1·8¥ì²Ï}]’(ÓP{}‹]¨Cu+{QÝWfPóˆ¿^ŽÍìÔ±MMvïûßIVø‹.”€ç¢[ãbÀõ¤œéeÃ!¬¼R'ÇU„¢B*yÍH¦~î3ÞÎÐxºŸâç\Ï,P¶™¦ÏÑXõ\ÍOÈ0Å! Ã3b7PCEÌVvE¤úP]½Ûs\¯§¢’Q*V(cPÅù›—ü—ÈÏmz¡!ÑŠƒïC´Ç µ|Å4šÔû Ða/¢R¥ÈøŒŽ ãj¹¡É 8Ú ˜÷Á¢ Ö_¡K¨Ðü&Ë$È2\.ÛV´·¿ ¢ÏCÔÓ$WÌQÃÙ¦=!ÉQ¿—Û™C¡ÌFÏ”ØRVdàS8ôŠPe—bSAæÒËÞb¼X0ÀÑŠ¦ö_;¼ñ“Äar°L탽Ó&Ⱦz² 4.-q_Q¬T·Ÿ(6ª¨øµ“®À[÷ÃKÖbÖÄt'y¼Ý©?`Tm6 ¢B¼Ú$p„OÓTß4˜ëÖ–hôzXð >Šz¯×hËÒ®YM-V¦ÌNú3ÐæGczÇDÂUÌ]_ŽÆúíân@ªÿíÒ:€º„Ø>|•æ#L™6kËþmÙçõ®™òæS¥GX5DJ#ªSB¯`<¹>&±SЄo^—»ô#¦ëŽÄó<‡»!'qø^lÎJësDz?ï¬b³Nj“1“u†/Ò·L¥ÄêCžíwŠŠvw:ýRW°ð.ÄMC5‹ IP¿z,žŽæÍ˜¡¡˜àÁ?}éú;¾`l·v¾íbÙß5 ²žÕú€ßûËAœÒ|9÷ù0í¤°Kd$@GÎjóÁGóƸÊÄ€À(1˜]-¦yZeírÍV€Ôz^±Š#Õ€¹²æüx2’ Ú‘…W"í.{ñÌêË—`¢åÉÉt6¢O™¯'!TV øybí“z¿øUÓUN˜¨#ÅÁÀÓ29ËZ:Ä/½„Ó±@ç8œù·ÖøW +b©¿`$ŽÝâ~ßïÏ«äܨËî}ÁéÈ}Ýb?¸üò´Ì¿™¬™Jè .?ÐÑãõý§Q-Vâ°™[÷R0Š”ì«'sSæ¡4u§Eð爴e…Éžè‚­˜ØA´ñðÈîM¯*yû ô¾; ZJLŒíCëÑïìAÁ§ijà‚g1;Á&WÇáj¯6GÜuW^‰ÒìÅy©Êm—xÞUÁ-#0¾Cçs`Á¶ïªûΗXÕïLs^’¥r¡n­K&—aQws)‰g&7Mþ§40C÷;ÜBQykk¹/x^s ‹gH›#ï2ªvÿYb¹HþÊ›Ç\ÍWÊq­¤àŠå0>\“^ûÝzI³tÑIâEYH.]F5ºŸ¤™Ñ3ÚFÔ ¿i ‘*ª~Ž*`–)‹šÇû«‘™F‘ÁïR^´Š©T:û%†NôKØäýCû!¸`/…,iy¨Æ±™EÑ̃n¿$’â¶²„7\8£5) DBk±@zv°nRpQ`7ù<h l²Zív¸¹~StrÔ!«ëëßä÷\'sÕ\>‚[øÖ¯>^ú5HÔ•Ð쪎ŽM°0%vUŰnÐ"™=áD‘_ÊÀMð·ù+ëãbtŒ4\¶à¨@v½$?&·Ê@3$‘ e|M ¸Ý5Ížš~^âñþ¾&5•µ±~®Çß*Œh7¸ gʾYåN¢5 ‡•ÃJ*Ä·…½Þòe Ç™œ¸o Gˆ²eæ.Ù"8Bµ ¨ë™ž œ€ñŒnZÒ¦<ŠŸ"C[1>† ÷Ÿ*s¹ÞxºÄ ›½‹xr¯7\7r\àrì> DA•9=†ÃˆÅ]m1DG@aU=V5ƒý·§MqbD[Ð[q3Ó·ÄsÖ•Œ®t¯‚¡?-)S©fí~‘aea’%h†ÀDÇسs^–IÈ5 •BY`ïÐUúKǯ\ÐàÈÓaÕË aÂTß1c‡ \ÙÚÐr“;¼Qî,¨ö]ì÷Ô Y‰Úa'@ŸçË£¹I4,ïˆâïõѼ»±œ‚ y?àCwDù@‰ŠñXúèl攇“!©èiÚØ–^üÈ)å;á·ÜÛœ³EÍ›•b@Fìê›8yRw óíMkŠÔ—¦ ràÑ#þ†*âtÙü(K¬võX‘(Ž ÉS¢½Ý„c׌9=åõ\Ãð¾ýþ!ËùuÖGùù4ɹ;¯XÖ½.™gixN…pm› WÏkÔÈeýU;œ€¤¡øåQ {Oxìsw¯Þ‚£]`¨¢,IÃñKäÔUÚïÉ ëòZ¤:Ø«N%«®”Ž•›«ûôõðšÀ ÓNß4R"iKïS¿\÷lÁ—Ê^jk\ŽeðÔŸv³öü†3#—•gÅÂT¨Â$È0)ÿÔƒJxÞÙbnÚ4=—íXßQ…$`aã}žÏ©]%7õ1@uïRÿÄ Q8¼ÀßžsAÚi+ðéæ;öà1óÕNk丵áºË¾Å¿¤ß¹‘‹gh>Ô6ÉÓI{ÂU]†J2›-ÜøSÌ^q0žŒfŽxî(æ¹ã$ܲ›3‹—÷ÁKsÝwõª_¿íRg ðôÂo91i(œ3µV6Að €XFdÉ­éí»/šð$Ø•™« FQ jŽT)¥˜c($,9eÎ9…(8Ý  ’H…ãé©KzVxç¦~—yÊ‘²¼ÚϹ* Ó6Úl¡.ëkÓG;üRˆ/ kúêÛJÐíù½U`Ã#@}_lZ84E;?” [\¿ulÓÖåkè$דÒ¾“šIƒúB‹o:º!{„F^ý~\=‡ÊY,NAítÃñÅ6**Ê7p¨lJŒfUv‹·¦ÍCðñ´´ü»áý°In3¥¾üýÑ`ÍÈPãø+üªï¸Y|N¸”ð®Ätd ãpÄ©GK;V¼Š2z°©ƒœÑ– ëïõ#~È›Ìc÷0TY(ÙQó`<—VT’â~˜¥æ'z aÅ„í†fŽúQã_ë lKæÊo¹Èr'MüÕf…¿}"Hr³Ÿ´ÊÀN\°Ôb½«ã§¾)™†­7(rx/0Es~í÷ØÃ)Õ äA3Œ3ž4@" 1|g–BoS¦FæE âª6tuÔPZÃÉ E€Œ3‡ûrXj´iÁœæÞ–[­8óspNMèÊBì ëS@¹=¢¶ ¼œnàÃ@8CçÜH깊ò8 ¼²5HàNS r/± eëÄ(ÜyR)WKŸÕ˜+‚14C4혷Óö‹Jz:IŒwÑÖÖ»Û±ãZê’/ìJÖñ¥Q`ƒ¦ÌBÊ ·¿¾Î·Ê]ùÎÀ_ngc·gKûQ;D|,‘ì¾9‰Kȼ‰›8e5}Ó½%Akìø0ü€ý9“z‡^-èÍ}ã›í~Ï+Ù™°7šHÆrA?OMí"XB ò*:£ã%„ð¶¹€L÷&~Èú»!šêx7ö`ÁRˆ ë΃"–€AH³dwOµ[ƒüؽEâ=%·µ9n5á—U ¥GSe·‹³Žh}_±(3‹Mt»Ð•„ú.ø±³UÜÂ6[†$*8ó…Ȳ4÷¼ýù*e¸Î¢¡’´ ¨õÌ"å~9ù°Eá{}¡uû {ì ¯µƒ bw‰RÁ`‡RËpàŒ7ñ&ö=yL8b{êæÆ7ñ ÈNûP(¯5¯ÄuðÄŒF eÄG25ÙUßU_BÜ ‰}Éc%Iq#Åü:®`äá#u\”‰;*DkšðvãúKú+÷¶)èhGŒ äÓwd(ð ñNÂK¸+¢\S°ªÐ‹Ž@)Qû•‚AXj{ñ< E@+ÜÌ(‡bà;´ÕäOÿ޵sKÀVªÅ5ÚÂ…W°¸žŒ˜õ¨è§^p²\¦YÕ }DTF­)jaÞõ cxØKòN¥ÍÚՆ»twÊâ`ÑøÉbƼ+ýø)¼.ÍÕóò c è¾rÉkT24üfr—Ú*T¦A]eì~MŒÜK·=ón(²Í7RaOLìWÞçʤ–Y2Çt§ŒIU±Ê}¨½³£ÈOºóOó¤ŒE¬ÕœòI èè2Œ‚/8 I2g¬af䙲¼gTi2±Ð!ä5€©‹˜ÍFSº6QtHú’ ìï’švf¡ >S*Ú.i&ÊÐM®é¦B† Öœ:à~ð:Ö’캠YóœPh_ÜÍŸR½‚óÏË 'á Ùh9å©»Ö#úP<˜MBЩÙËFÆáŠÌFöpÅï&wŽØØ@Ð%Îcïh˜uû…w½ùÅŠ6!ô¹v´nP‚5› ÚÅ"# ”pn?:ý¬mTr`$k(ZµElY<ïpy„ɃLÊ?Ât55DÐE×ß%¯pW>t~aÒ•T¤ ‡Ÿbìe–ËÙ·›Q7¸-X]±'ô,D{Ç«t: ¡_”Q?~{¿©ú¸–YÔÐë‡_Ó-ªY GFënê4žZ…Væ¿$qT•P+ò¸½W§„§—àsBŒ% †nž+=ÿæ·h\äŽÃ?¥cTg‹|W39Œ¾:?ÿFfâ´rdèÿ c7JÔW’Á¾ßœ§)¬±\?a·>Rœª<4½f7¼|/„­Ê¦†Þ‘å3µ*e/ 4gCTLhàc‹ãWBu%ðîâýØ5fœ0‡7ì…õø¨0ÖÑxKå#¿oçòµÈ¯c-[Cw|‹ž)Ï0Ä丄Âù¶,Žõ˜©Ñgdqh®Çtæ¹ÊëG™€@†ëéÝ÷æMœqÏÅ_aH—_†§ó×!xÇá6ðÈ2MÓFS)<ަKs5Núš_ðzgçó×wY ³ÐoüH” Dš4éˆtÄF3"”²ŽUüß°Ôù/Çâ¶N.v·Âí©×pN&ß1úpD˜ÄYaìÉ Ãm–«Œõbn ‰HÝÔéÿ|¨êÛÍéçç@8¦íHáèíŽJ>qLÒ¾ C-VÃæ&xŒú ¶/8µ^žænq…ËÊ® œôiÜØ´àÝ4‰ÙZËñPV”CïP0¼¸X/Ùo­w殯"–‘-QzÑOyŒú Î'€ý) ÿ²Šƒ²ð`Àµð—³å¶Ò¬cì6[¹da©Â§“f<6x N±uqvpœ\¯è¶yäí¢Ï¹´öŒ®J‰w¿ Ò9PxjØæ4Ù"¢Ì°¿¿d’Ž"ãNoû¼ÐJ鸌j%®g¿$Vª€ P4nVõQðúä£l±ÁÛ¼Wì iÕèL: H¬^ÇÚŒ½Ÿn ð!—GŒsðËQAˆ½ÀÆ´/sqTáhõ^p¢lÈ—ï{†Œrɸ›…ZR¯;%,åBî8©ÄþŽÈ¯’ìÿ´Ý‡±ˆ­eø¼l9 §'3_&Ûç½zŽ#_…Nšn}¾?¼8ü Ÿ£qNãìVÃy°Ï¦k¼‡ 7Òí%Ãê–~J3=ƒ¬|¬à#r¢¨9]¸®œà­ºËáUݯŠïÏÃ+/›ÜKªøòC«+`Úª0ì FÝý@^ê¾V*¯ «Ð/ˆÄÔ•Ky¢vدPå&-ÿ‚¹CDÊ*Ü«?i³@~ÔfžŠÞ“‹3ô™ –³¶¢là <É— ?¡›­@qPÏÏÎ`Ô°ÿ×hì_Ž{AڙĹ"„ƒñrGŒêÌ·ôZ¹þˆÏæ*yŠ»ÓˆŠ›hÜ#Ì¢³³œÁXwé+¤Á,ÓºïÊÀÔݬU =ñŽù›, ï³¾CR-£]xæøÈŒ©ípåÊø•_WNë /ç…QŠˆ‚Rx`²§/^ ÛPXiESh÷¸I{i¯§‡ ¹OVÒ܃‚½oÿÌkɵKI¦~H¸î6ñø4 Rn$u(ûÛ¨¡<®#ïêb¸ºâc´³\³}pûX‰²Ù·üVÃ#ê‚sÍŸVh]øéÉÔ (~?d—fG/Ý”S:ãtá¬Ðh¾Äª’y¸DCÉ‘pÑþ2²šØD0èá’·jÙE5£ÜiµÑ!tMu²¬jJ<å¶‘7Ú‹:ãu·Sšd«µŠw²žŠnfy°f™^!e;Z3óå§/“&”ó«ïx'™`d?> b*õѵ”ôvUqÜךš Ô|:š/»ìòˆ°$Í ³Ð gX³‚.N h¹×M,7{fÐ+Œ-¯þø³±Üñ ÏŽu+ÒØ¤2V\$ë –ŠMI^í A^;/(#á1öÄŒëªtšÍÍ>ÈQ ˆõ‡Â´’©Å–¼@D«¾X³óTƒ§ì¦Rûå{ã‘vÑ ƒ3¡2ÁeæX¸íí/#”oÛýÒ†§ä‡NçÐìnrš/^L±ú1Û•åEEi†È¼:=i)9FÕ7ƒ XieŽÌƒ|ªYüœÂï8M¢h©¤‰Ï?VΫp® ‰Y"*Õ“N{\;ÐZi],Ôÿð9½ X¯CñúŽþ^Õçà?¨½íPÝòÒKØoŸÏð|Wε‘ê”ÁwT’G7 ’‡ùÞÀc^¼:ŒÄ#L l¨Údì6€º5½”D‚ ‚°§\OF Ý!M ž È+žÛ›“Ábµm{?ÀõÅöíÐÿªT ¤iÉ|…~Ô†¾ýäJ£¯¸÷ä)P÷,QM ÛÑ‚Ýg"¸ Š´Ÿ üµ/É…Iu5øÎå~¼t¹ºÇ@ŠY³À”F“ô µxÁ4Ûýc³ËÇ}.º§¯Á?kˆC‡wˆîÓe˜$1Ú˜œì‹³¨#ìòå˪òùü´ÑܵnEÞ…œž ‡¬P ;·,.Yù¶¶r$-X€0-w¦K]î,~ÙGyÙó‹…ðq%³üe4eÆ÷s2 )ÊZI¹óû‡CIzâ8¶=¥¨QóÜâ’ߨ²ñº°fú†°Â¬ZóÔ‚Yò\y¯kX i_G†5ÀtLyʵ–3ÌY &BC…#<{•d°Îm¨ÜÖpÆBðñ¤ýÄÇñ¼Ãr°ƒ!x‘#F¸gb´OB®è{Ò@á œâS®%ön¬BŒ¸ó‹0Èɦ­ÏcÌJŸá>Õ þV‚k:Ct’3s5k0m¦ä(õk €þœUòé‘«ÔϤ_žUÚ*Ö—€ZWý·5™ÇIÍ`¡Â­¶EñM9žªÆ@Aü†Rz|¹)0ü¢U»pà 0çÞ¢¼õG°…þêqôˆœ>šíÕyw:_JCeÿ6œÝDºjgrÖ×÷%sáÛÚÅgAn»q×?‹§˜7JŽ®z]3/·)µÁ§¹$¯YÉ­:˜½~²œ|—H%ÀZ,QØXÏY>:¢ŸØáÉ€l=9dK>-×)}¾Svò)nû ™|¥·¾³ +6ÓJ Bé^h÷d´uBí->´r–l½§o–xMâuqcœ¨³u±O‡Ó$¶;ßÒ¿P-‰]1÷ÿ@ C……Aþeœ€)Œelù$PÃ5ô“êVú‚5ŒìñÝ¡¼¥ã¨jBF~÷ £çæð wî/I­x±yÁþe£ý'ÚzÝ]xræ„ß+1dV·tbÁ¬Lñ5-+@ ƒç RaïªV><¢œôwCô04?ϾWÀ}¶‚ä»Þ¨dv…<1íK5ªðW¿ÚodåLçÝÊBð-¢Gmz_ÛïEø*/€ìâïùܬ²vTç‹qa¤r|ømÀT²tªBXR!ÑŽØK!!lÒÁ!6^°½M,`\ú£”ŸObyøÈãË-n1~„ꆹ£àÍõ;{ŒÚ!* ƒ–ŒC¿)ê¢)Ô0)ý Èúúü)†–X¾)¿ÕM‰_[16Â¥+t¤n1Ól`gqLD¦˜{Òñt°ýÚùü¼MfXtM(Žõ%¬uR¹¹Á¶¥&¨x?neire×Lì¦Î Å0¦Pé+:H¾  òfåSQú±|®ûÙxþmO¦dl­<ûÔĤÌÄ*ÕÛ©ºí6y]æÖ=?+†Õ„ž«·f¿({î–WÄ ²l„[î<$„¨Áþ÷Á8±·¡Š½³4×Ú”üù¼‡ºêA;+½‰ÈÖü_ÞZ‚¬Ö^IJŠeö^lQbÈ|\~5Ÿ]ÏÀû³00î“C̬ÄYáê½úÌ@ñ±R.æ"Ér¦”fR°š¬=ðÞ"a—‘úÿ®½± í’c8à’çÄâ™gý £{›#a&¯;ÄÑŠ€ÃMtþ°ZaF޵òª'Ìãy8¢զ1ƒ¶]Þ­"?yÑhÚ7+§Y™'yq83OFÝŽµ]šëÙ7ÝFšÊÐü½ÝÿÀÅ4<œØ¹ßN¸! ¿”W\3¢ít„pÊ ¡ìÎÍ+¬oŸój–½JÖ#È«…×Iøˆ`“:Ù6Ýv< Yª4jõs‹»ÇÖÙå·)»¢ce¹:VCŸ8æçDÔËŽ r¥ù÷rà|†j>4œ‘ f`ßZèåàEÂãCÜ[~Xl‹ÅýûB-»Û¦ 1ÇÁæÄhÚ'%­›–ëáÌßûe£?°8ž`šD)i¿)4\ÿ SÔ§¸—ܱ>×qwHŒyX¡àÏ:ýuI·ŸÁ m AU¶F 8šGÁw‡˜6¥ ¸¼ï”Í„9n‰sã“7ÏÖ™ ¢9Ò€ë í ¸wâÍy¬†~—W¨ÊƒÎ¡ø.õʰsvý´ì¥_³‰T#­† ­Ì  U*´3õçåkç7ôé”Ìét ͪf¸–d´ D|^¦\άóXÕÀh¬°>ày–JÙˆå&¦Xýu‘ý0ëR»M® šûÕ ÌÔ0ý¤€Ð±~–¶ÔÛ3³º sñÓðg{ñ¯‚\bn4ÖÞP‰Ü+4áÍS"(EéFÀº‰yaSŸ¾*q¹3õÓuŸHu9QýÚ–€Á„˜ÒÎrÇü*iï6³¶8ë xÝÂÒ?:½n¥Ó ©.i3m’•ú³Éé7 ‘ÿDë±Ü~¤˜¥ùÇ'key§êŽ]ÿ™åʽ~rм»"oÊ€#*tÐlUrªÜ &}äÈŒænó¥ŠmWµR$)/~ù½ù¡Ã¯*säS>ê—ßâû#ëi+9Š˜‚l7 ÎϨ£ówƒW'´ÇiŠ#–¨òOy˜y”T=ö6çc…kÅ>"Lñ~•S¿x+¿ºÖǪñÔMTcXc´Ðä)¶ÚIÖ xàjø0\ÝÐdãÎÏ››bðûf;‰E¯ Ñ)cÙ]°_”µ¡”¯45©É¬u£·]œ퓹ݢ•¿,=û+%¶É‰D½¬3”+ôMêý%‰X0'ºšÕÒM^&3*ú~Ù¼h-Η³úf]÷{þ/Ãw>È5äWšSɘcOZ(åï1QŠñ² z?E}ÉÛ Ä§t¸¼¯‚ÑŸ½?ïÖ {^+wÆ#xW…ókàÀ9“ïíàɇ̨Yz¬÷ö­NŠ*žD̾´8ÄEÚ%2ZZFTNÍÜÑ¿b”åÇîOñÎ2³uÑÆ¾–þžüY³ úq~Ú,ÿˆøÝ÷ë4™u^FNlÌHFÌkÄž2–¹®È35$þ³j®%ÇS´aÜèÙ ž¯O³%¤™)+KBÃPgüñ¤5ç/û ’"M{§@ɲe2ýƒ,­Ë3/-vžY( ‰ìŽ2Üf¬íŽ!oÁ~OÃågkúÕb¸Xë1Û–YˆæWé@Òå4’¸F»Óø¾Œ×©çsJ³Oþ;— ZûìYw¬à‚l)Ó58X àÄÆµÎ kÑ@w¿ö¬ÓÄ¤ä Ž’M¿2ïexØÉÑPÄF.l6pE+»ÏˆÇK¯0`ów;ì)‡â\ƒ0aiÅÆúåµJ6jMF‰àÏd.‹Í¯£sY 0^G«XŽñ‰ «Wût TòF'£†&½Ë œµÐú¯8V³¾ Æ>bÆ«thM1ER× —}‡®Sýñþð)–ÔŽ!fÚṳ̈®Š­Aõ>‰Æ~|Ù »ò=Úë.Œ‹bÑL[}ÒØ ?Y…ô„‡’¹*bøNX9)|8ýwÎ='µ^4qÊ":~<™‹V¿ƒÇÓŒË+Ü7aKl¾‘L¸0t¶ì­;ñöÒB¥]vüé€j;‰”NÙ -ˆ$ÝÐù›;¼ÄØ5cBgM+t¥ÚŸÆEü@TÂ6u·ª¾wKYW’;÷" Är®DŒ²Š=&†Hì +,U‡¤HëUÀßQ†<颋rܧ˜‘ ùx|ÿ-¨£¨³¾qí ?%*ºéö|–š.²|i!ê€VøK¶úÈ]:«¶Ï5Ò·‹â ‡õ@Z(6êǼ¦5’u)KÐèðtA¿ÏÔ÷XYà®k~mImüärøÛ턜q'ò˜žgtGž†?¢`ª‰V ÅUoУ kMõí¾±¥íɼžÄÚßeÁ縤¦|wîS{Éf»=ËçXÿ8U0¸{©êÜ`‘YM%WôqúðãÀÅ4ôæi{.N€¡‡9=<âŽzc$¯ÎRâ½§Ö.ãúe˜§xéeGŸ'•Î \“JÁ®ÅÅM½%ç3~´£­’÷¥|¤;)2®eýݬ11âåHÅú–Ks;A‚Wž»–ËË=e×í—Ÿ°;ŒÛ;XMܽ•¡a¿&“À•K=ƒw(*ë—Æß>GSÀ‡}Å­NÀ,Z˜Ûæž?fCð1ŠÙÔ“”öÊÚ|è´¯.!ØðK¿ãë#»W© ¯­¡ÿ¸ÂÞÁÝÄžeŠö½Fë,\ÿœÕ; qÞ22ª³lI Ä×÷jÜK°#^0n ›úí謿Áwó"ZƒÑ äø‹ò˜ö»}÷{I\¢€DŽûMXÙ¤äL»[cOš|Œ”èÑzpk $lÎÇç¢ ™e‡Æó8eë«#z{_ å?Ö1ÝO•(pËÆïÈ„wKzÉ€@ nžYÅÎëjj€q»Ó±HX¬‘4Ù ®é#„¾ F‰à¬¦é2êE CX7Á»ªå¤¶?Qr *:Ã}©ï™òƃcJ8¼óÕ<ä#C~z x☢§±œ‰×Î Ü©»÷n)BGç,Ô›Q¢_zºŸ9-ã–‘Nd¬ï•ÉU¶»Û×¶9¤›[¼•¸.*æ8ÑD†D¯‘4úfS-EFΘo5 F”TìKUÍm| L*=}H´¢ÔiíYÙ MB5(c Xƒ¶Ð¹¤jßA\{ˆ‰BZR; ŠcVá+ÑÄ-:xÈ(w)`ÆÕĨ[x 4oÖþ>Çz2 OGë }éE(cŸ6àŽ7‹¬+î'N32Æ%ϯpC8ûáˆðêØ»Ì¹&‘S×¾(³¸–¯¯7ãe*kÌ‹ª Õx˳Uÿ™ë33§&›ŠöñÈ—žÅ†µ¦HpÌ«e Æ(K ö²ñ©KLlD¢¿mŠÞ [·\{Ó Ba €Ë{9»ô–_fÈ8{Í**³^w/©ù‘B(ÈleL’`¸D¤sÿd%SJlÏ”¤^ËÌrqdµ7î±ß‰Wg mSŽ,@n™“id"‰ЖĪ/­^áŽç𣤣‹nç¾&Z(\ž‘ʨ›Þßìa³è†ÓE½Ž÷zÙ'X€£º¤.wÊD”>Uö·"ë®f]T€ûÄÒäaÿ™Žÿ»ºCÞú>æ›?X?µ‡èåI-ö¢"·/5Y!…ìÞQúÂö—­F9·!&”;<êE9…IÌò×ZÞ´™ &*4Ãå¼÷&©üÛ.*V¯kDáw÷C‹®bʃã×aP³Îù[Vš'Û9`ß"Ùz20¦Ê›ÿp&§Ƭ,Q~¯çK""ut± ØÆ{kAŸaJgÓžÀ˜±ß¸Œ,çÐ(ãá˜6‚rb²»#ƒ#y=(Ïß¡Ðoý([ü‹0±•|LûF Öí›V22—r‚QO4†Ê ¬¹fwaá™yµz5,ÔO3üÎb 7Q@ynÑÎ}wQ±{€‘ÞHÓÂÚ‹Ã;bdZ.Îèµõ,kòW}+“»Ðâ7°ôͽyüxF1òç  Ïï̺óA@më_ŸF?Ô];cÖ%øÓôÆÿPp«2aìhÕí’DÆŽˆ€k¥ƒ‚¤Iuð˜‘Ða|zÇcEì¹ÍýË@˜zŽN«.šoÄq„Xª­B^?ûÓ&^6€‹´øú)Î%= /HÝÍìÊ–hûs·ç»BJ\Áæ]yrçƒÒ &ßzÿRrâ’xÂF-²©þ.¡ ~Â,ui–—y#s½h¨™_)RûÌÞÂû}ØË–¨mª²-"ˆ:øÃ‹?ß$÷¯?´ò)b÷Ç»¬£gãIžÐ q'WRÇ8ÚjŽHc“JŠ©t.oô´“æ›5Dz®%–y ¡[˜Øâµ»òå”ã5Rä\sÒž\ ? ªÑ®U$ìÎ¥óPÕ‚Ù` &»/š§›*U#:ìÙ“,á‹ ¶&n܉î®vÚ‡ø›Þã¡;2CG1–Ðu.*«º˜KOwÕ=òxJ—kO˜ÛnrQÛ«@ ÅŒÚ~ÿVg¯.ˬ>l©ñjèpúa\ÉÁ«µ–Þ(&cÜì6µ Ñ‘p±UìûA>PèÄxŽ|œ«YþÅlë K¤„=i‘ ÿäªDÍ +ájÇÀÂI¿ë ­êªïµNaùZ5HÆPÜqYo9/¸¤GÂ)ìX3,·Üûs©ŠvhIµa!uos†Ž#Îi“ê29âñ3¢z­¬YDfö|–ÂeÐ;œ2,§åkÖâÜ93í ×–öûL£é*e¹Jžœ§@§é©Ù•>/z<œFRxسXì Áâ¥)LœÑ}¯±7 O\ EDÛåªÙØ(iëùk ^T™Õ |&)éÎýÜaU¥Ëæãæ)rÿ5cðù9}xϦ֖ÒE3²y"­— e}Q×l¦ yûÇñ&½r#žuÙ¡›Ê1åÄdø`‡ýâüŠcíÎï ƒ¤¤¢Ì÷ë_¼ ”'‹ý¼½sÓtÞzÃÑ2SÎðæzZHO®'Gst•l<©RÚÀÉƨ›øá‡w]0Û˸ħΆµ`ODh „^¾c—Ù- Èg¦'TÁ+ˑȄµïÖ» òø<±õ)ú©g¸zW ‚¾–àuÎÁÒ”°O×¢ÞŽÆ4B ^ƒÒçö¯¯­ÅÚ öâZÄD°&öÛ)_z 1Æ5Hª¸ÿª?½pÜ+)¢Af ز/¿b-•ÅÜBž`E%õ$.[QóÍöWb jÒ Ÿk«uÃDÂa;w•©Ž!‡gËÌ”þtóípóÅ Aˆ„MúE~¾rξ§iKˆœ t¹š—nìË‹§/R2êìgúÛ/uŸWÔSí~¡bk;c6í<¨ú¬`s3±%Ž´s÷ÏH:ûf‰£Œæòfɪä^©|ÅìI@ê}vgN6_é y Àœ×ŠÞ­C;Ü6ó]=’bT$Jš˜à®ú|MUÂyšl•æ ‹ÂÔpÝ;€`›Ø¨ý1ç@hB6tœÕè9éÄ@Q‘eÕ3ÞÚ6Ù WÉf¿åÂCD¦&Èeà-&3I¨çE©]7rŸ!£‘‚BWÕuAì7™È)|ŠìÎ7äÕÖ—š«÷+RþzuÍmñS©T[€ö7iõ…ˆýEâX¹È‰©lg™‚À“up;w·K½”y@Íœ>ê;ñ6–+-ˆÒZž!Ú™~Bu^E¨ÎaALìRÛEV º–鞯7¬73;OX±|Žt¼¢ 1,¡÷jZ]õ<#Â_“i5n¤¸àÁ£sûcØ÷½&Q¯>R9—?31 ~§V°É bš{)ñœ ®Øìòò¬VÑ\—{×úWÞØ&1Af%PâÀ <à>N±vÅY¹‚X" ùù° p!ç îuè+J©è( gïÃ\Ø!"(¯u”ƒÅÞwLZ1»ˆUDh|³Ù!YÉ"äÿ¸*§/¯ž®µªi`ªáx÷ÁïÝâ!Ö¢˧ʾÑœ_Ц59=Æ PÖ X)Â%öspUhL½Ÿ™°·­e5dR4Q•Ç»_J{ëÉžá8¡ZG,i8I‰¼ß®eËï)Áml²1|ß%PŒ§¯Leæ]ævo>mv‘Ò‘ï™ÆŒ ¸…ÚŽ»%ùù†É€·¡TÐ8 *7£ýèì8KЊ*/<×jßì.‡Å18bk>c M7ìË›Þ,ÇW¤˜Æ¿ ñ?X®Õ fk=ˆ³b=%íF Eé:Ý—-m‚”Û©¾_aìyîGmˆpxÉþÔ“¬°:mçKˆóJáaå¿EˆVZ'|bc°ÂÓØ¢ÕÐŽïa‘›lªfúªæ7óQK®Dg*ˆsf›üÝ"mõjÇþ4p¸Ðä\ñ%…ümåªîl•dJIÌà¾T!k–€Û¡:ˆtSŠdP< F‡%€ÀŽUè‹Nv˜`XxØLì1„ÐǤ9¤xÉX Zp?@Õgt}hÆ&—o])Î{­Ff»n(àÁÙ+¬ZÊÄ/ip„Ô<æÌé…Yïg¥¢a '¨çq¨6%(­y¥¿mÝÖ´IôhnJ1¤»‰šž¾ð|¾Ø½twêRÒQc¥HǰTŒŽƒë¶™ÎXOàá9ÉÃm['€å8 )g8#ôÁNÉRiëÙ³;ÕœŽä~…*ä·zo)Ô˜§{²ºëêûyÈå·]‰.vÚæ9ÿ0Ïêcì_Eb/vWq÷% &Lp„ÇlÚ¹8!æ,Éž¨£@ൠ'Gc2s°VìòJwOù”ï*;‘GÚ­‡ˆ‹½^37ºƒóúÖëüs-d Å3(#òÂâÀ³–Y¹¸ÚN¸×’¯™KV婬ñÒìBÚ"$.akJNcsB;ö^»úú­°oY+ù2ç ‚†?ÖÎâyã}4¯ûWr~ŒÍÆ*Ð+·H­}B‰tC ›Nl¸©/¦yâŽÝ 3:2Ó¸2… å{ÃsÑ/¤pJÊ1!mèÞwZxœ[ó.òõËñî4„þåg˜ì@‡¥Ù;ó J*ïË=f,â$åZ›É__AŠºóžó[P3–5kŽÒv.~›ø c;ugá릱ì}ªl›;ÕÈÇ%ZØe9ãÏ@Œ,¡'õ ¾—gB#ÿ ÑùzÔêYPq?9yV® X·nØvœ,.è´d7in¤ÖëDhÎ1 ŠbÞîD[§Çr‹ØU]…¥“Q( Ú‘ÐQÐlÝ—²Ø—m¨€­EgmúÂ#Ý,õ‰Ù®žiqº€´ùCðɱÍàÀèÿ m¨ endstream endobj 105 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.16)/Keywords() /CreationDate (D:20171030183729-04'00') /ModDate (D:20171030183729-04'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) kpathsea version 6.2.1) >> endobj 2 0 obj << /Type /ObjStm /N 88 /First 675 /Length 3191 /Filter /FlateDecode >> stream xÚíZ[oÛ8~÷¯àcƒEMñN.ŠÒ¤—`›¦HÒi;E[I4u¬Œ-w:ûë÷;¤lK²Ý$íî> Z+y®ß9<$% –1ÃTÆ,Ó†æ  Š ü—ž Í„ÁÏ1á~L ƒ“&Hɤ³h‚,SR3˜2$*Å´DSCºÇÓú³™`F2'ýÀ(æ¡J<ñZè7 Ë˜Þ1-`†tŒ¬±ì0,,Sà4°Ëd†A£0Á pk.à²4ðƉÀ ¤: '%\°PØ1$œE—Ì`¤…Ë IBë@*üµn2©28:,0PðÄeLê àPð˜ Jº ㄇŒ¨Ê ü€Ð ~áŒÆ!RA©ƒG8ù + @˜vôW,@ÑÆg j< 0Vdn€X­=ƒ ÖeŠâfì†9…ÕÀFk¨f±Ï,bB˜ºP¡)c^+3Ð*Dz‹qÕ^Hpïa™`Ãt"Þ!¸0= ™°Hû`Åž­ ø¯ ‡çÁRd‘ÁS°20X#à†‘g"‹„* ž=cüŒñWÕyÅø!{2/FuYM‡býòËàÉÑ´žUãEìÛÛI,ñ‹ñuÁöëzV^.êb¾…~q¹bYj8,®òŤf1çen4¾*꺜^?’Y%æ³37œ ßÛjü`7UßÍ)1çeî¹™OÇlÞ´ïô™š±SÆ_–õIyölÀÏÿº+—_~PMëbZÏ’„~ZÌ«ÅlT̩Ğãb\æÏ«oìs†‹ÄsA^ `NJàH¶?Vó™ê ©¼4êfENžæuÁžþSf(™BbBú=(¨Æ;ÇÎËz‚‘Söj–ßÝ”£9;YÔw‹CïbN3UC ˜]uí :Þ¾„Ÿ~¶¸¬ã-uŠ›ßÒ˜ðçù¼ Æ_“¯E]Žò1Uc‚•“|„ÄÏüèà€ˆÇ(ÔyÑR²¤OâVÜüC9ÝŸÎËõðayuU=‚ù3J¿-§‹9f,ÿcQÕŤ¸ª±,h>®àý|^òëYþµàùAæ£r6ZÜ^MŠo¼.'ã‚ßæ£Y5å—³4`ÉG#†K¨˜—s>D`ÆÅŸA7!š“I¾ê¼YL¯óÙâv’/j^]WÓâ å$o~—Š‹.Œ1È-ß”Ó/ð¶š‹YLqÁ_ó#~ðYà&» |ÕHÃL=U½€¹€J,ÄÐ#O º3ª}ÖŸWåõbV4§±¡•Ï?ý†Ò>D.ffˆ¥qº˜L.vÑ…H— Ö£{ C}D¬4C‰¡ÅPa¥ëÐÆ4"w^Òb,›ù¯±$¤6:µnÚqÅhºAb›¶‰+FÓV´ZPøÇ“Ëß SÒpt+°ª­†0#F¨gH)þîð%²¼øV³^{ÓÞøþ´7ö1Ó~q‹L‡î{‘Ù Ävc(0ëî%T:x¶#,;à_Ã܃_Ófã'0¶ª±?†±•øC“:ءžr"×WîvaØŠÚ"â61?ˆˆ} "¶èlfî'Ôk½„¸¡övÆíLÛ:¹»Ð¯áþAŒØÀ8üÆ.{Æ;’©å飓fËš­Vk¶ÑIçqŽÍ¹2Ì„Ì1ü[·/Õóè.»ÒÖv]´¡!Ãû&ÝÐç,n›°šÍ냛|†EzÀßä­›帾™ÓA$¢»Zö]“ÒDH²AbWÛ­†84lß)GûÓëIÁ2cêâöWäZð Šn:Щã ßç‡üÅø[~Æs~ÉG|Ì ~ůyÉ'|Ê+^M ~WÌÊjÌg|Îk^ßÌŠ‚×V|±—LYB¡×í3Ü}Hœ¼?;{ýHœŠl;85Zr²û€P¶qP¢‹Ã þ2>E|ÃOø)°8çú­ŸêöóBAŰy`èÅã•÷Vêžn××M^ë–b­;{¼îÞ‚ÖÓ6üÖ¿×J½|¼îÞjÒÕD_7­„Û1W×½Yá{êU_½Ò;`wþñêûU­§|3ߺ¾›µòðxåýjÓSîîñ\¯•»MåôÂbNo,ôÖaÀÿUŽç«÷¬ÍK½æMVó²%½‰è½&8YÔ‰yckžÃ“ôõLzu¨cüª@5Û§O©b«y²äz7+¾ÒÛ‚¶å‘S†%§´[9ßÒë %·pš§ìpßÒé[¸. H52‡žÊžt±”.|Gz[¸°›f ·bÔ»eË9™m‘²TdÛ¤DÆmêWpÚݘ´‘]œZÚ•"žuê…|…¾Øª( ïÄ›]$å“Ãjôô¬Îgõ}/G¹ØúBA‡Ôs‡„Ž÷Yë^îѧsë{µG߯­ïõ} Óš¿)o˺§nIuÑ7)ö›=ú2.Jk}´¥º=0Áu{`„\õ>ÇbK?$Ó7ri@ŸtÃÒþwW"l¨ˆŸHI·¥ª•è«îK쳬LH5%$…ôU\ú+¾ø.Y¨| ¥é6JÙAŽSu=H5mõMÔ²4­,"BŸà5éw]Wã‚¿Ÿë2vrWL÷£~úª³ÑõævL endstream endobj 106 0 obj << /Type /XRef /Index [0 107] /Size 107 /W [1 3 1] /Root 104 0 R /Info 105 0 R /ID [<22BD7E556A5FFF00A8F12505A20CFDED> <22BD7E556A5FFF00A8F12505A20CFDED>] /Length 261 /Filter /FlateDecode >> stream xÚ%Ò¹2ƒQ‡ñÿû‰%¶ ¶ ¶Oˆ}ß—Ø—Ä[¡wZF™•N£rjW¡väy5¿yÎ9s–âHÒo 2{x•€30 N¡"Ð'P eÐ ÇPÐG…JHÃ!TA5 Bj † 1¨ƒzh6E>ü¹í&żZ ¶a 6`vaö  ö¡âÐM¦hÆÏëSüÓ‡I‡ôš9_aúMÉWŸ€11…Ÿ5¥Ò^0 S0 30 s0 °XÜöãÛ–Lù¯eÓó‹×ŠéýÑkÕôýùšYxç•1Ë~y­Ãäá.à®àÚìþ¶øž úN8 t endstream endobj startxref 103826 %%EOF graph/inst/perf/0000755000175400017540000000000013175713336014623 5ustar00biocbuildbiocbuildgraph/inst/perf/Makefile0000644000175400017540000000035413175724651016267 0ustar00biocbuildbiocbuildBASE = graphperf R ?= R-devel all: $(BASE).pdf @echo "building perf report using $(R)" $(BASE).pdf: $(BASE).tex $(R) CMD texi2dvi --pdf -c -q $< $(BASE).tex: $(BASE).Rnw $(R) CMD Sweave $< clean: @rm -fv $(BASE).pdf $(BASE).tex graph/inst/perf/bgt.R0000644000175400017540000000620213175713336015522 0ustar00biocbuildbiocbuild## Basic Graph Tests ## Each test has: ## - an input graph specified as an edge list ## - an operation name (or should it be the function? ## - an expected result. If the result is a graph object, it will ## be expressed as an edge list. ## ## Do we need a way to indicate nodes with no edges? ## makeFT <- function(from, to) { ord <- order(from) from <- from[ord] to <- to[ord] cbind(from, to) } basicDirected <- function() { from <- c("b", "b", "b", "i", "o", "c", "c", "e") to <- c("e", "i", "s", "o", "c", "i", "o", "c") w <- seq_len(length(to)) list(nodes = letters[1:20], edges = makeFT(from, to), weights = w, edgemode = "directed") } basicUndirected <- function() { from <- c("b", "b", "b", "i", "c", "e") to <- c("e", "i", "s", "o", "o", "c") w <- seq_len(length(to)) list(nodes = letters[1:20], edges = makeFT(from, to), weights = w, edgemode = "undirected") } basic_to_ft <- function(g) { from <- match(g$edges[, 1L], g$nodes) to <- match(g$edges[, 2L], g$nodes) ft <- cbind(from, to) ft } create <- list( "graphAM" = function(gDesc) { ft <- basic_to_ft(gDesc) numNodes <- length(gDesc$nodes) mat <- matrix(0L, nrow = numNodes, ncol = numNodes, dimnames = list(NULL, gDesc$nodes)) coord <- graph:::coordToIndex(ft[, 1L], ft[, 2L], numNodes) w <- gDesc$weights if (gDesc$edgemode == "undirected") { coord <- c(coord, graph:::coordToIndex(ft[, 2L], ft[, 1L], numNodes)) w <- c(w, w) } mat[coord] <- w graphAM(adjMat = mat, edgemode = gDesc$edgemode, values = list(weight = 1L)) }, "graphNEL" = function(gDesc) { edgeL <- split(gDesc$edges[ , 2L], gDesc$edges[ , 1L]) if (gDesc$edgemode == "undirected") { f <- gDesc$edges[, 1L] t <- gDesc$edges[, 2L] ft <- c(f, t) tf <- c(t, f) edgeL <- split(tf, ft) } g <- graphNEL(nodes = gDesc$nodes, edgeL = edgeL, edgemode = gDesc$edgemode) edgeDataDefaults(g, attr = "weight") <- 1L edgeData(g, from = gDesc$edges[, 1L], to = gDesc$edges[, 2L], attr = "weight") <- gDesc$weights g }) graph2desc <- function(g) { nms <- nodes(g) ft <- t(edgeMatrix(g)) from <- nms[ft[, 1L]] to <- nms[ft[, 2L]] list(nodes = nms, edges = makeFT(from, to), weights = unlist(edgeWeights(g), use.names = FALSE), edgemode = edgemode(g)) } toGraphDesc <- list("graphAM" = graph2desc, "graphNEL" = graph2desc) gam <- create$graphAM(basicDirected()) gnel <- create$graphNEL(basicDirected()) gam0 <- toGraphDesc$graphAM(gam) gnel0 <- toGraphDesc$graphNEL(gnel) ugam <- create$graphAM(basicUndirected()) ugnel <- create$graphNEL(basicUndirected()) graph/inst/perf/graphperf.Rnw0000644000175400017540000002475513175713336017306 0ustar00biocbuildbiocbuild\documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\classdef}[1]{% {\em #1} } \newcommand{\myincfig}[3]{\begin{figure}[htbp] \begin{center} \includegraphics[width=#2]{#1} \caption{\label{#1}#3} \end{center} \end{figure}} \begin{document} \title{Graph Package Performance Report} \author{Seth Falcon} \maketitle \SweaveOpts{keep.source=TRUE} <>= st <- system.time perfRow <- function(g, t, op="") { data.frame(class = class(g), op = op, nodes = numNodes(g), edges = numEdges(g), directed = ifelse(isDirected(g), "T", "F"), user = t[1], sys = t[2], clock = t[3], stringsAsFactors = FALSE) } timeRow <- function(expr, op) { t <- system.time(g <- expr) list(result=g, row=perfRow(g, t, op)) } randNonDiagIndex <- function(n, count) { diagIdx <- 1L + 0L:(n - 1L) * (n + 1L) idx <- seq_len(n^2)[-diagIdx] sample(idx, count) } randAdjMat <- function(nodeCount, edgeCount) { nodes <- paste("graph_node_", seq_len(nodeCount), sep="") am <- matrix(0L, nrow = nodeCount, ncol = nodeCount, dimnames = list(nodes, nodes)) am[randNonDiagIndex(nodeCount, edgeCount)] <- 1L am } randSymAdjMat <- function(nodeCount, edgeCount) { nodes <- paste("graph_node_", seq_len(nodeCount), sep="") am <- matrix(0L, nrow = nodeCount, ncol = nodeCount, dimnames = list(nodes, nodes)) upt <- as.vector(upper.tri(am)) idx1 <- sample(seq_len(nodeCount^2)[upt], edgeCount) am[idx1] <- 1L am <- am + t(am) am } @ \section{Introduction} <>= library("graph") set.seed(0xab34eL) medEdgeCount <- 5000L bigEdgeCount <- 260000L nodeCount <- 2000L bigSymMat <- randSymAdjMat(nodeCount, bigEdgeCount) medSymMat <- randSymAdjMat(nodeCount, medEdgeCount) bigMat <- randAdjMat(nodeCount, bigEdgeCount) medMat <- randAdjMat(nodeCount, medEdgeCount) dim(bigSymMat) dim(medSymMat) @ This document surveys the runtime performance of graph operations believed to be heavily used for common bioinformatic analyses. We use two \Sexpr{nodeCount} node graphs, one with \Sexpr{medEdgeCount} edges and the other with \Sexpr{bigEdgeCount} edges. Both graphs are generated randomly. <>= matDim <- dim(bigSymMat) cntZero <- sum(bigSymMat == 0) cntNonZero <- sum(bigSymMat != 0) pctNonZero <- sum(bigSymMat != 0) / nrow(bigSymMat)^2 @ \section{Timing of Operations} Here we look at the time to construct \Rclass{graphAM} and \Rclass{graphNEL} instances using two adjacency matrices with the same node count, but different number of edges. \subsection{Creating new graph objects} First, we look at the \Rclass{graphAM} representation. We construct directed and undirected graphs with different numbers of edges for the same node set. <>= ## undirected ans <- timeRow(graphAM(adjMat = bigSymMat, edgemode="undirected"), "new") df <- ans$row ans <- timeRow(graphAM(adjMat = medSymMat, edgemode="undirected"), "new") df <- rbind(df, ans$row) ## directed ans <- timeRow(graphAM(adjMat = bigMat, edgemode="directed"), "new") df <- rbind(df, ans$row) g1 <- ans$result ans <- timeRow(graphAM(adjMat = medMat, edgemode="directed"), "new") df <- rbind(df, ans$row) g2 <- ans$result ## using a from/to matrix ftmat1 <- t(edgeMatrix(g1)) ans <- timeRow(graphAM(adjMat = ftM2adjM(ftmat1), edgemode = "directed"), "new f/t") df <- rbind(df, ans$row) ftmat2 <- t(edgeMatrix(g2)) ans <- timeRow(graphAM(adjMat = ftM2adjM(ftmat2), edgemode = "directed"), "new f/t") df <- rbind(df, ans$row) rownames(df) <- NULL df.AM.new <- df df.AM.new @ For \Rclass{graphNEL} we can use the \Rcode{as(matrix, "graphNEL")} coerce method for the undirected case. For a directed graph, we convert the adjacency matrix into a from-to matrix using \Rcode{t(edgeMatrix(g1))} and then use \Rfunction{ftM2graphNEL}. <>= ans <- timeRow(as(bigSymMat, "graphNEL"), "as(m, NEL)") df.NEL.new <- ans$row ans <- timeRow(as(medSymMat, "graphNEL"), "as(m, NEL)") df.NEL.new <- rbind(df.NEL.new, ans$row) ftMat1 <- t(edgeMatrix(g1)) ftMat2 <- t(edgeMatrix(g2)) ## there's a bit of an inconsistency here ## since we aren't using the node labels ans <- timeRow(ftM2graphNEL(ftMat1), "ft2NEL") df.NEL.new <- rbind(df.NEL.new, ans$row) ans <- timeRow(ftM2graphNEL(ftMat2), "ft2NEL") df.NEL.new <- rbind(df.NEL.new, ans$row) rownames(df.NEL.new) <- NULL df.NEL.new @ Here are some notes on the \textit{experimental} \Rclass{graphAM2} class that uses a bit array (backed by a raw vector) to store an adjacency matrix. First, we make a more standard from/to matrix: <>= ft1 <- matrix("", nrow = nrow(ftmat1), ncol = ncol(ftmat2)) ft1[, 1L] <- nodes(g1)[ftmat1[, 1L]] ft1[, 2L] <- nodes(g1)[ftmat1[, 2L]] ft2 <- matrix("", nrow = nrow(ftmat2), ncol = ncol(ftmat2)) ft2[, 1L] <- nodes(g1)[ftmat2[, 1L]] ft2[, 2L] <- nodes(g1)[ftmat2[, 2L]] @ <>= ans <- timeRow(GraphAM2(from = ft1[, 1L], to = ft1[, 2L], nodes = nodes(g1), edgemode = "directed"), "GraphAM2") df.AM2.new <- ans$row gbit1 <- ans$result ans <- timeRow(GraphAM2(from = ft1[, 1L], to = ft1[, 2L], nodes = nodes(g1), edgemode = "undirected"), "GraphAM2") df.AM2.new <- rbind(df.AM2.new, ans$row) ans <- timeRow(GraphAM2(from = ft2[, 1L], to = ft2[, 2L], nodes = nodes(g2), edgemode = "directed"), "GraphAM2") df.AM2.new <- rbind(df.AM2.new, ans$row) gbit2 <- ans$result ans <- timeRow(GraphAM2(from = ft2[, 1L], to = ft2[, 2L], nodes = nodes(g2), edgemode = "undirected"), "GraphAM2") df.AM2.new <- rbind(df.AM2.new, ans$row) rownames(df.AM2.new) <- NULL df.AM2.new @ \subsection{\Rclass{graphAM} to \Rclass{graphNEL} conversion} Convert from \Rclass{graphAM} to \Rclass{graphAM}. <>= ans <- timeRow(as(g1, "graphNEL"), "as(AM, NEL)") df.AM.to.NEL <- ans$row gnel1 <- ans$result ans <- timeRow(as(g2, "graphNEL"), "as(AM, NEL)") df.AM.to.NEL <- rbind(df.AM.to.NEL, ans$row) gnel2 <- ans$result rownames(df.AM.to.NEL) <- NULL df.AM.to.NEL @ \subsection{Size comparison} <>= objType <- sapply(list(g1, gnel1, gbit1), class) Size <- sapply(list(g1, gnel1, gbit1), object.size) data.frame(class=objType, size=Size) @ \subsection{intersection and union} Currently, intersection and union are implemented for the \Rclass{graph} super class using the \Rmethod{nodes}, \Rmethod{edges} methods and constructing a new \Rclass{graphNEL} for the result. This is suboptimal for \Rclass{graphAM} objects. %% TODO: evaluate intersection/union of two random graphs with same %% edge counts as well as the mixed size case <>= ## interesting to note that intersection and union ## are returning graphNEL, even when input is AM ans <- timeRow(intersection(g1, g2), "intersection AM") df.setOps <- ans$row ans <- timeRow(intersection(gnel1, gnel2), "intersection NEL") df.setOps <- rbind(df.setOps, ans$row) ## intersection2 is giving me ## INTEGER() can only be applied to a 'integer', not a 'double' ## ans <- timeRow(intersection2(g1, g2), "intersection2 AM") ## df.setOps <- ans$row ## ans <- timeRow(intersection2(gnel1, gnel2), "intersection2 NEL") ## df.setOps <- rbind(df.setOps, ans$row) ans <- timeRow(union(g1, g2), "union AM") df.setOps <- rbind(df.setOps, ans$row) ans <- timeRow(union(gnel1, gnel2), "union NEL") df.setOps <- rbind(df.setOps, ans$row) ans <- timeRow(graph:::edge_set_intersect(gbit1, gbit2), "AM2 I") df.setOps <- rbind(df.setOps, ans$row) ans <- timeRow(graph:::edge_set_union(gbit1, gbit2), "AM2 U") df.setOps <- rbind(df.setOps, ans$row) rownames(df.setOps) <- NULL df.setOps @ Next we explore some different approaches to thresholding a graph's edges based on edge weight. Below we add random edge weights to a new graph object \Robject{gw} with the same structure as \Robject{g1}. <>= ## creating with edge weights gw <- g1 edgeDataDefaults(gw, "weight") <- 1L W <- abs(rnorm(numEdges(gw))) ## there should be an easier way to do this. ## sadly, it might be easier to extract the matrix ## and set weights on the matrix and create a new graphAM st(emat <- edgeMatrix(gw)) eFrom <- nodes(gw)[emat[1L, ]] eTo <- nodes(gw)[emat[2L, ]] ## setting edge weights for all edges st(edgeData(gw, from = eFrom, to = eTo, attr = "weight") <- W) ## extracting all edge weights st(ew <- edgeData(gw, attr="weight")) @ First approach is to pull out the raw adjacency matrix with values representing edge weights, perform the thresholding via matrix assignment and convert back to a \Rclass{graphAM}. <>= ## edge thresholding. st({ c1 <- function() { M <- as(gw, "matrix") idx = (M > 0) & (M < 0.3) M[idx] <- 0 graphAM(adjMat = M, values = list(weight = 1L), edgemode = "directed") } ewt1 <- c1() }) ewt1 @ Another approach is to extract the edge attributes, identify the edges to be removed (unfortunately, this requires string parsing) and then calling \Rmethod{removeEdge}. <>= st({ c1 <- function() { ew <- unlist(edgeData(gw, attr = "weight")) toRemove <- names(ew[ew < 0.3]) fromTo <- do.call(rbind, strsplit(toRemove, "|", fixed = TRUE)) removeEdge(fromTo[, 1], fromTo[, 2], gw) } ewt2 <- c1() }) ewt2 @ \subsection{Node permutation} Here's one way to permute the node labels of a \Rclass{graphAM} object. <>= permNodesAM <- function(g) { m <- g@adjMat colnames(m) <- sample(colnames(g@adjMat)) graphAM(adjMat = m, edgemode = edgemode(g)) } @ <>= ans <- timeRow(permNodesAM(g1), "permNodesAM") df.node.perm <- ans$row ans <- timeRow(permNodesAM(g2), "permNodesAM") df.node.perm <- rbind(df.node.perm, ans$row) rownames(df.node.perm) <- NULL df.node.perm @ \end{document} graph/inst/perf/multigraphs.Rnw0000644000175400017540000000450113175713336017652 0ustar00biocbuildbiocbuild\documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\classdef}[1]{% {\em #1} } \newcommand{\myincfig}[3]{\begin{figure}[htbp] \begin{center} \includegraphics[width=#2]{#1} \caption{\label{#1}#3} \end{center} \end{figure}} \begin{document} \title{Experimental Support for Multigraphs} \author{Seth Falcon} \maketitle \SweaveOpts{keep.source=TRUE} <>= st <- system.time @ \section{Introduction} The MultiGraph class represents a single node set and a set of edge sets. Each edge set is either directed or undirected. We can think of an edge in a MultiGraph as a 4-tuple (from-node, to-node, edge-type, weight), where the edge-type field in the tuple identifies the edge set, the weight is a numeric value, and the order of the nodes only matters in the case of a directed edge set. Unlike some of the graph representations, self-loops are allowed (from-node == to-node). There is support for arbitrary edge attributes which is primarily useful for rendering plots of MultiGraphs. These attributes are stored separately from the edge weights to facilitate efficient edge weight computation. <>= library("graph") set.seed(0xab34eL) ft1 <- graph:::randFromTo(10000L, 1e6L) ft2 <- graph:::randFromTo(10000L, 1e6L) ft3 <- graph:::randFromTo(30000L, 1e6L) names(ft1) head(ft1$nodes) head(ft1$ft) esets <- list(e1=ft1$ft, e2=ft2$ft, e3=ft3$ft) ## order(to_i, from_i) is a big factor here st(g <- MultiGraph(esets)) object.size(esets) / 1024^2 object.size(g) / 1024^2 g numNodes(g) ## we should be able to make numEdges faster by ## memoizing and/or just taking length of weight ## vector. st(numEdges(g)) st(lapply(eweights(g), head)) ## this is slow because of string creation, I suspect st(lapply(eweights(g, "=>"), head)) ## a good portion is in new and initialize st(gi <- edgeSetIntersect0(g)) gi st(degree(g)) st(extractFromTo(g)) nds <- nodes(g) subNds <- sample(nds,0.5*length(nds)) st(subGraph(subNds,g)) @ \end{document} graph/inst/unitTests/0000755000175400017540000000000013175713336015671 5ustar00biocbuildbiocbuildgraph/inst/unitTests/MultiGraph_test.R0000644000175400017540000013206613175713336021137 0ustar00biocbuildbiocbuildset.seed(0x12a9b) ## alias subsetEdgeSets; remove once it is exported make_directed_MultiGraph <- function(use.factors = TRUE) { ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to=c("b", "c", "d", "a", "d"), weight=c(1, 3.1, 5.4, 1, 2.2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a", "a", "x", "x", "c"), to=c("b", "c", "x", "y", "c", "a"), weight=c(3.4, 2.6, 1, 1, 1, 7.9), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2) g <- MultiGraph(esets) list(esets=esets, g=g) } make_mixed_MultiGraph <- function(use.factors = TRUE) { ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to=c("b", "c", "d", "a", "d"), weight=c(1, 3.1, 5.4, 1, 2.2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a", "a", "x", "x", "c"), to=c("b", "c", "x", "y", "c", "a"), weight=c(3.4, 2.6, 1, 1, 1, 7.9), stringsAsFactors = use.factors) ft3 <- data.frame(from=c("a", "a", "x", "x", "x"), to =c("b", "c", "a", "y", "c"), weight=c(1:5), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2, e3=ft3, e4=ft2[FALSE, ], e5=ft3[FALSE, ]) g <- MultiGraph(esets, directed = c(TRUE, TRUE, FALSE, TRUE, FALSE)) list(esets=esets, g=g) } randMultiGraph <- function(numNodes, numEdges) { ftlist <- lapply(numEdges, function(ne) { graph:::randFromTo(numNodes, ne) }) nn <- ftlist[[1L]]$nodes edgeSets <- lapply(ftlist, function(x) x[["ft"]]) names(edgeSets) <- paste("e", seq_len(length(edgeSets)), sep="") MultiGraph(edgeSets, nodes = nn) } randFromTo2 <- function(numNodes, numEdges, weightFun = function(N) rep(1L, N), directed = TRUE) { if (numNodes > 2^15) stop("too many nodes: ", numNodes) maxEdges <- numNodes * numNodes nodeNames <- sprintf("%010d", seq_len(numNodes)) x <- c(rep(1L, numEdges), rep(0L, maxEdges - numEdges)) idx <- which(sample(x) == 1L) to_i <- ((idx - 1L) %/% numNodes) + 1L from_i <- ((idx - 1L) %% numNodes) + 1L from <- nodeNames[from_i] to <- nodeNames[to_i] w <- weightFun(length(from)) if (!directed) { tmp <- graph:::.mg_undirectEdges(from, to, w) from <- tmp$from to <- tmp$to w <- tmp$weight df <- data.frame(from = from, to = to, weight = w, stringsAsFactors = FALSE) df <- df[!duplicated(df), ] } else { df <- data.frame(from = from, to = to, weight = w, stringsAsFactors = FALSE) } list(nodes = nodeNames, ft = df) } sort_esets <- function(esets) { ## sorting is based on column major ordering lapply(esets, function(ft) { ft <- ft[order(ft$to, ft$from), ] }) } make_unique_ft <- function(ftdata) { ## ftdata is a list with components $nodes and $ft ## $ft is a data.frame with columns 'from', 'to', and 'weight' ft <- ftdata[["ft"]] el <- paste(ft[["from"]], ft[["to"]], sep = "\t") dups <- duplicated(el) ftdata[["ft"]] <- ft[!dups, ] ftdata } test_basic_accessors <- function() { basic <- make_mixed_MultiGraph() esets <- basic$esets g <- basic$g checkEquals(6L, numNodes(g)) checkEquals(c("a", "b", "c", "d", "x", "y"), nodes(g)) checkEquals(c(e1=5L, e2=6L, e3=5L, e4=0L, e5=0L), numEdges(g)) checkEquals(structure(c(TRUE, TRUE, FALSE, TRUE, FALSE), .Names = paste("e", 1:5, sep="")), isDirected(g)) } test_no_edge_sets <- function() { g1 <- MultiGraph(list(), nodes = letters) g2 <- MultiGraph(list(), nodes = letters, directed = FALSE) for (g in list(g1, g2)) { checkEquals(26L, numNodes(g)) checkEquals(letters, nodes(g)) checkEquals(list(), numEdges(g)) checkEquals(list(), eweights(g)) checkEquals(list(), eweights(g, "=")) checkEquals(list(), isDirected(g)) } tcon = textConnection(NULL, "w") sink(tcon) show(g1) sink() checkEquals("MultiGraph with 26 nodes and 0 edge sets", textConnectionValue(tcon)) close(tcon) } test_create_empty_edgeSets <- function() { df1 <- data.frame(from=c("a", "b"), to=c("b", "c"), weight=c(1, 1)) esets <- list(e1 = df1, empty1 = df1[FALSE, ]) g <- MultiGraph(esets) checkEquals(c(e1=2L, empty1=0L), numEdges(g)) dg <- MultiGraph(esets, directed = FALSE) checkEquals(c(e1=2L, empty1=0L), numEdges(dg)) } test_edgeSets_arg_checking <- function() { ## data.frame's in edgeSets list must have names: ## from, to, weights df0 <- data.frame(fr=c("a", "b"), to=c("b", "c"), weights=c(1, 1)) checkException(MultiGraph(list(e1=df0))) ## edgeSets must be named list or empty list checkException(MultiGraph(NULL)) checkException(MultiGraph(list(data.frame(from=c("a", "b"), to=c("b", "c"), weights=c(1, 1))))) } test_no_nodes <- function() { mg <- MultiGraph(list()) checkEquals(0L, length(nodes(mg))) checkEquals(list(), numEdges(mg)) } test_create_infer_nodes <- function() { basic <- make_directed_MultiGraph() esets <- basic$esets g <- basic$g checkEquals(6L, numNodes(g)) checkEquals(c(e1=5L, e2=6L), numEdges(g)) } ## test constructor with nodes arg given (singleton case) test_bad_nodes_in_create <- function() { basic <- make_directed_MultiGraph() esets <- basic$esets esets[[1]]$to <- as.character(esets[[1]]$to) bad_values <- c(NA, "a\n", "", "z|a", "a\t") for (v in bad_values) { tmp <- esets tmp[[1]]$to[3] <- v checkException(MultiGraph(tmp)) } } test_dup_edges_is_an_error <- function() { ## directed case ft1 <- data.frame(from=c("a", "a", "a"), to=c("b", "c", "b"), weight=c(1, 3.1, 5.4)) checkException(MultiGraph(list(e1=ft1))) ## undirected case ft2 <- data.frame(from=c("a", "a", "b"), to=c("b", "c", "a"), weight=c(1, 3.1, 5.4)) ## ok if directed junk <- MultiGraph(list(e1=ft2)) checkException(MultiGraph(list(e1=ft2), directed = FALSE)) } test_edgeWeights_create <- function() { basic <- make_mixed_MultiGraph() esets <- basic$esets g <- basic$g esets <- sort_esets(esets) got <- eweights(g) checkIdentical(list(e1 = esets[[1L]][, "weight"]), got[1]) checkIdentical(list(e2 = esets[[2L]][, "weight"]), got[2]) ## undirected case normalizes edges by sorting, always putting the ## node that sorts first as from. checkIdentical(list(e3 = c(1L, 2L, 3L, 5L, 4L)), got[3]) } test_edgeWeights_edge_names <- function() { basic <- make_mixed_MultiGraph() esets <- basic$esets g <- basic$g wv <- eweights(g, names.sep = "=>") esets <- sort_esets(esets) want <- paste(esets[[1]]$from, esets[[1]]$to, sep = "=>") checkEquals(want, names(wv[[1]])) want <- c("a|b"=1L, "a|c"=2L, "a|x"=3L, "c|x"=5L, "x|y"=4L) checkIdentical(list(e3 = want), eweights(g, "|")[3]) } test_supports_self_loops <- function() { esets <- list(e1 = data.frame(from = c("a", "a"), to = c("a", "b"), weight = c(1, 2))) g <- MultiGraph(esets) checkEquals(c(e1 = 2), numEdges(g)) } test_isDirected <- function() { g <- make_mixed_MultiGraph()$g checkEquals(c(e1=TRUE, e2=TRUE, e3=FALSE, e4=TRUE, e5=FALSE), isDirected(g)) } test_ugraph_via_isDirected <- function() { g <- make_mixed_MultiGraph()$g ## verify precondition want <- c(TRUE, TRUE, FALSE, TRUE, FALSE) names(want) <- paste("e", 1:5, sep="") checkEquals(want, isDirected(g)) ug <- ugraph(g) want[] <- FALSE checkEquals(want, isDirected(ug)) } test_ugraph_for_undirected_edge_sets <- function() { df1 <- data.frame(from=c("x", "a", "b"), to=c("a", "b", "x"), weight=c(1, 2, 3)) g <- MultiGraph(list(e1=df1), directed=FALSE) ug <- ugraph(g) checkEquals(nodes(g), nodes(ug)) checkEquals(numEdges(g), numEdges(ug)) checkEquals(isDirected(g), isDirected(ug)) ## verify attributes have been dropped checkEquals(rep(1L, 3), eweights(ug)[[1]]) } test_ugraph_for_directed_edge_sets <- function() { df1 <- data.frame(from=c("x", "a", "b", "x", "b", "c"), to=c("a", "x", "x", "b", "a", "x"), weight=1:6) g <- MultiGraph(list(e1=df1), directed=TRUE) checkEquals(6, numEdges(g)[[1]]) ug <- ugraph(g) checkEquals(nodes(g), nodes(ug)) checkTrue(!isDirected(ug)[1]) checkEquals(4, numEdges(ug)[[1]]) checkEquals(rep(1L, 4), eweights(ug)[[1]]) checkEquals(c("a=b", "a=x", "b=x", "c=x"), names(eweights(ug, "=")[[1]])) } mg_equals <- function(g1, g2) { checkEquals(nodes(g1), nodes(g2)) checkEquals(isDirected(g1), isDirected(g2)) checkEquals(numEdges(g1), numEdges(g2)) checkEquals(eweights(g1, "==>"), eweights(g2, "==>")) } test_edgeSetIntersect0_trivial <- function() { ## Verify 0 and 1 edge set cases for directed/undirected df <- data.frame(from="a", to="b", weight=1L) mgs <- list( ## empty edge sets MultiGraph(list(), nodes = letters), MultiGraph(list(), nodes = letters, directed = FALSE), ## single edge set MultiGraph(list(e1=df)), MultiGraph(list(e1=df), directed = FALSE)) for (g in mgs) { mg_equals(g, edgeSetIntersect0(g)) } ## Verify empty intersection for disjoint graphs df1 <- data.frame(from="a", to="b", weight=1L) df2 <- data.frame(from="x", to="y", weight=1L) g <- MultiGraph(list(e1=df1, e2=df2)) gu <- MultiGraph(list(e1=df1, e2=df2), directed = FALSE) want <- MultiGraph(list(), nodes = c("a", "b", "x", "y")) mg_equals(want, edgeSetIntersect0(g)) mg_equals(want, edgeSetIntersect0(gu)) } # test_edgeSetIntersect0_directed_1 <- function() { ## non-trivial directed intersect g <- make_directed_MultiGraph()$g gi <- edgeSetIntersect0(g) ## TODO: do we want the minimal node set or not? ## checkEquals(c("a", "b", "c"), nodes(gi)) checkEquals(nodes(g), nodes(gi)) # original nodes checkEquals(c(e1_e2=2L), numEdges(gi)[1L]) checkEquals("e1_e2", names(numEdges(gi))) w <- c(as.numeric(NA), as.numeric(NA)) names(w) <- c("a=>b", "a=>c") checkEquals(list(e1_e2=w), eweights(gi, "=>")) } test_edgeSetIntersect0_random <- function() { make_data <- function(nsets, nn, ne, ns, type=c("directed", "undirected")) { ## nsets: number of edge sets ## nn: number of nodes ## ne: number of edges ## ns: number of shared edges directed <- switch(match.arg(type), directed=TRUE, undirected=FALSE, mixed=sample(c(TRUE, FALSE), nsets, replace=TRUE)) grouped <- randFromTo2(nn, (ne * nsets) + ns, directed = all(directed))$ft ## for the undirected case, we will end up with fewer edges so ## need to adjust. ne <- (nrow(grouped) - ns) %/% nsets shared <- grouped[1:ns, ] starts <- seq(ns, nrow(grouped) - ne, by = ne) + 1L esets <- vector("list", nsets) names(esets) <- paste("e", 1:nsets, sep = "") for (i in seq_along(esets)) { z <- grouped[seq(starts[[i]], starts[[i]] + ne - 1L), ] z <- rbind(shared, z) esets[[i]] <- z } list(shared=shared, g=MultiGraph(esets, directed = directed), esets = esets) } do_test <- function(d) { gi <- edgeSetIntersect0(d$g) checkEquals(nrow(d$shared), numEdges(gi)[[1]]) all_directed <- all(isDirected(d$g)) checkEquals(all_directed, isDirected(gi)[[1]]) checkEquals(nodes(d$g), nodes(gi)) } for (t in c("directed", "undirected")) { for (i in 1:10) { do_test(make_data(2, 10, 10, 3, type = t)) do_test(make_data(3, 10, 10, 3, type = t)) do_test(make_data(3, 10, 10, 1, type = t)) do_test(make_data(3, 11, 20, 6, type = t)) } } } test_subSetEdgeSets_single <- function(){ g <- make_directed_MultiGraph()$g gi <- subsetEdgeSets(g, "e1") checkEquals(nodes(g), nodes(gi)) checkEquals(c(e1 = 5L), numEdges(gi)[1L]) checkEquals("e1", names(numEdges(gi))) w <- c(1.0, 1.0, 3.1, 5.4, 2.2) names(w) <- c("b=>a", "a=>b", "a=>c", "a=>d", "b=>d") checkEquals(list(e1=w), eweights(gi, "=>")) } test_subSetEdgeSets_multiple <- function() { g <- make_mixed_MultiGraph()$g gi <- subsetEdgeSets(g, c("e1","e3")) checkEquals(nodes(g), nodes(gi)) checkEquals(c(e1 = 5L, e3 = 5L), numEdges(gi)) checkEquals(c("e1", "e3"), names(numEdges(gi))) w1 <- c( 1.0, 1.0, 3.1, 5.4, 2.2) w2 <- c(1, 2, 3, 5, 4) names(w1) <- c("b=>a", "a=>b", "a=>c", "a=>d", "b=>d") names(w2) <- c("a=>b", "a=>c", "a=>x", "c=>x", "x=>y") checkEquals(list(e1 = w1, e3 = w2), eweights(gi, "=>")) } test_subSetEdgeSets_no_duplicate_edgeSets <- function() { g <- make_directed_MultiGraph()$g checkException(subsetEdgeSets(g, c("e1", "e1"))) } test_subSetEdgeSets_no_such_edgeSet <- function() { g <- make_directed_MultiGraph()$g checkException(subsetEdgeSets(g, "notAnEdgeSet")) } test_subSetEdgeSets_empty_edgeSet <- function() { g <- make_directed_MultiGraph()$g gi <- subsetEdgeSets(g, character(0)) checkEquals(nodes(g), nodes(gi)) checkEquals("list", class(numEdges(gi))) checkEquals(0, length(numEdges(gi))) checkEquals(character(0), names(numEdges(gi))) } test_extractFromTo_Directed <- function(use.factors=TRUE){ ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to=c("b", "c", "d", "a", "d"), weight=c(1, 3.1, 5.4, 1, 2.2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a", "a", "x", "x", "c"), to=c("b", "c", "x", "y", "c", "a"), weight=c(3.4, 2.6, 1, 1, 1, 7.9), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2) g <- MultiGraph(esets) res <- extractFromTo(g) ft1 <- ft1[do.call(order ,ft1["to"]),] rownames(ft1) <- 1:5 ft2 <- ft2[do.call(order ,ft2["to"]),] rownames(ft2) <- 1:6 checkEquals(list(e1 = ft1, e2 = ft2), res) } test_extractFromTo_UnDirected <- function(use.factors=TRUE){ ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to=c("b", "c", "d", "c", "d"), weight=c(1, 3.1, 5.4, 1, 2.2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a", "a", "x", "x", "c"), to=c("b", "a", "x", "y", "c", "a"), weight=c(3.4, 2.6, 1, 1, 1, 7.9), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2) g <- MultiGraph(esets,directed=c(FALSE,FALSE)) res <- extractFromTo(g) ft1 <- ft1[do.call(order ,ft1["to"]),] rownames(ft1) <- 1:5 ft2["from"] <- factor(c("a", "a", "a", "a", "c", "x")) ft2["to"] <- factor(c("a", "b", "c", "x", "x", "y")) ft2["weight"] <- c(2.6, 3.4, 7.9, 1, 1, 1) checkEquals(list(e1 = ft1, e2 = ft2), res) } test_degree_Mixed <- function(use.factors=TRUE){ ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to=c("b", "c", "d", "c", "d"), weight=c(1, 3.1, 5.4, 1, 2.2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a", "a", "x", "x", "c"), to=c("b", "a", "x", "y", "c", "a"), weight=c(3.4, 2.6, 1, 1, 1, 7.9), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2) g <- MultiGraph(esets,directed=c(FALSE,TRUE)) deg <- degree(g) e1Degree <- as.numeric(c(3, 3, 2, 2, 0, 0)) attributes(e1Degree) <- list(names=c("a","b","c","d","x","y")) inDegree <- as.numeric(c(2, 1, 1, 0, 1, 1)) attributes(inDegree) <- list(names=c("a","b","c","d","x","y")) outDegree <- as.numeric(c(3, 0, 1, 0, 2, 0)) attributes(outDegree) <- list(names=c("a","b","c","d","x","y")) res <- list(e1 = e1Degree, e2 = list(inDegree = inDegree, outDegree=outDegree)) checkEquals(res, deg) } checkSubGraph <- function(g, subG) { nds <- nodes(g) subNodes <- nodes(subG) origFromTo <- extractFromTo(g) subFromTo <- extractFromTo(subG) sapply(names(origFromTo), function(x){ indx <- (origFromTo[[x]]$from %in% subNodes) & (origFromTo[[x]]$to %in% subNodes) origdf = origFromTo[[x]] want <- origdf[(origdf$from %in% subNodes) & (origdf$to %in% subNodes),] subdf <- subFromTo[[x]] checkEquals(as.character(want$from), as.character(subdf$from)) checkEquals(as.character(want$to), as.character(subdf$to)) checkEquals(g@edge_sets[[x]]@weights[indx], subG@edge_sets[[x]]@weights) }) } test_basic_subGraph <- function() { g <- make_mixed_MultiGraph()$g nds <- nodes(g)[1:3] sg <- subGraph(nds, g) checkSubGraph(g,sg) } test_large_subGraph <- function() { df1 <- graph:::randFromTo(1000L, 10001L, directed = TRUE, weightFun = seq_len) df2 <- graph:::randFromTo(1000L, 10001L, directed = FALSE, weightFun = seq_len) g <- MultiGraph(list(e1= df1$ft, e2 = df2$ft)) nds <- sample( graph:::nodes(g), 100) subG <- subGraph(nds, g) checkSubGraph(g, subG) } test_basic_mgToGraphAM <- function() { g <- make_mixed_MultiGraph()$g res <- extractGraphAM(g) checkGraphAMObj(res, g) } test_large_mgToGraphAM <- function() { df1 <- graph:::randFromTo(800L, 90L, directed = TRUE, weightFun = seq_len) df2 <- graph:::randFromTo(800L, 60L, directed = FALSE, weightFun = seq_len) g <- MultiGraph(list(e1= df1$ft, e2 = df2$ft)) res <- extractGraphAM(g) checkGraphAMObj(res,g) } checkGraphAMObj <- function(am, mg){ nds <- nodes(mg) dr <- isDirected(mg) checkEquals(names(mg@edge_sets),names(am)) sapply(names(am), function(x){ mat <- as(am[[x]], "matrix") checkEquals(colnames(mat),rownames(mat)) checkEquals(colnames(mat), nds) wtMg <- graph:::edgeSetToMatrix(nds, mg@edge_sets[[x]], dr[[x]]) checkEquals(mat, wtMg) }) } test_mixed_MultiGraph_Intersect <- function(use.factors=TRUE) { ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to=c("b", "c", "d", "a", "d"), weight=c(1, 3.1, 5.4, 1, 2.2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a", "a", "x", "x"), to=c("b", "c", "x", "y", "c"), weight=c(3.4, 2.6, 1, 1, 1), stringsAsFactors = use.factors) ft3 <- data.frame(from=c("a", "a", "x", "x", "x"), to =c("b", "c", "a", "y", "c"), weight=c(1:5), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2, e3=ft3, e4=ft2[FALSE, ], e5=ft3[FALSE, ]) g1 <- MultiGraph(esets, directed = c(TRUE, FALSE, TRUE, TRUE, FALSE)) ft1 <- data.frame(from=c("a", "b"), to=c("d", "d"), weight=c(5.4, 2.2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a", "a"), to=c("b", "c", "x"), weight=c(3.4, 2.6, 1), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2) g2 <- MultiGraph(esets, directed = c(TRUE, FALSE)) res <- graphIntersect(g1, g2) checkEquals(nodes(res), c("a", "b", "c", "d", "x")) checkEquals(isDirected(res), structure(c(TRUE, FALSE), names = c("e1", "e2"))) df <- extractFromTo(res) checkEquals(names(df), c("e1", "e2")) df1 <- data.frame(from = c("a", "b"), to = c("d", "d"), weight = c(5.4, 2.2)) checkEquals(df$e1, df1) df2 <- data.frame(from = c("a", "a", "a"), to = c("b", "c", "x"), weight = c(3.4, 2.6, 1)) checkEquals(df$e2, df2) } test_mixed_MultiGraph_Union <- function(use.factors=TRUE) { ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to =c("b", "c", "d", "a", "d"), weight=c(1, 3.1, 5.4, 1, 2.2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a"), to=c("b", "c"), weight=c(3.4, 2.6), stringsAsFactors = use.factors) ft3 <- data.frame(from=c("a", "a"), to =c("d", "b"), weight=c(1,2), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2, e3=ft3, e4=ft2[FALSE, ], e5=ft3[FALSE, ]) g1 <- MultiGraph(esets, directed = c(TRUE, FALSE, TRUE, TRUE, FALSE)) ft1 <- data.frame(from=c("a", "a", "b"), to=c("b", "x", "z"), weight=c(6, 5, 2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a", "a"), to=c("a", "x", "y"), weight=c(1, 2, 3), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2) g2 <- MultiGraph(esets, directed = c(TRUE, FALSE)) res <- graphUnion(g1, g2) checkEquals(nodes(res), c("a", "b", "c", "d", "x", "y", "z")) checkEquals(names(res@edge_sets), c("e1", "e2", "e3", "e4", "e5")) checkEquals(isDirected(res), structure(c(TRUE, FALSE, TRUE, TRUE, FALSE), names = c("e1", "e2", "e3", "e4", "e5"))) df <- extractFromTo(res) checkEquals(names(df), c("e1", "e2", "e3", "e4", "e5")) df1 <- data.frame(from = c("b", "a", "a", "a", "b", "a", "b"), to = c("a", "b", "c", "d", "d", "x", "z"), weight = c(1, NA, 3.1, 5.4, 2.2, 5.0, 2.0)) checkEquals(df$e1, df1) df2 <- data.frame(from = c("a", "a", "a", "a", "a"), to = c("a", "b", "c", "x", "y"), weight = c(1, 3.4, 2.6, 2, 3 )) checkEquals(df$e2, df2) df3 <- data.frame(from = c("a", "a"), to = c("b", "d"), weight = c(2, 1)) checkEquals(df$e3, df3) df4 <- data.frame(from = factor(), to = factor(), weight = numeric()) checkEquals(df$e4, df4) checkEquals(df$e5, df4) } # test_MultiGraph_To_graphBAM <- function(use.factors=TRUE) { ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to=c("b", "c", "d", "a", "d"), weight=c(1, 3.1, 5.4, 1, 2.2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a", "a", "x", "x"), to=c("b", "c", "x", "y", "c"), weight=c(3.4, 2.6, 1, 1, 1), stringsAsFactors = use.factors) esets <- list(e1 = ft1, e2 = ft2, e3 = ft2[FALSE, ]) g1 <- MultiGraph(esets, directed = c(TRUE, FALSE, TRUE)) res <- extractGraphBAM(g1) checkEquals(names(res), c("e1", "e2", "e3")) bam1 <- graphBAM(ft1, nodes=nodes(g1), edgemode = "directed") checkEquals(bam1, res$e1) bam2 <- graphBAM(ft2, nodes=nodes(g1), edgemode = "undirected") checkEquals(bam2, res$e2) bam3 <- graphBAM( ft2[FALSE, ], nodes=nodes(g1), edgemode = "directed") checkEquals(bam3, res$e3) res <- extractGraphBAM(g1, "e1") checkEquals(bam1, res$e1) res <- extractGraphBAM(g1, c("e2", "e3")) target <- structure(list(bam2, bam3), names = c("e2", "e3")) checkEquals(target, res) } test_MultiGraph_nodeAttributes <- function() { mg <- make_directed_MultiGraph()$g nds <- nodes(mg) checkException(nodeData(mg, n = c("a"), attr = "color")) checkException( nodeData(mg, n = "z", attr = "color") <- "red") nodeDataDefaults(mg, attr = "color") <- "violet" nodeDataDefaults(mg, attr = "class") <- "unknown" nodeData(mg, n = c("a", "x") , attr = "color") <- c("red", "green") nodeData(mg, attr = "class") <- "high" current <- nodeData(mg, attr = "color") target <- structure(list("red", "violet", "violet", "violet", "green", "violet") , names = nds) checkEquals(target, current) current <- nodeData(mg, attr = "class") target <- structure( as.list(rep("high",6)), names = nds) checkEquals(target, current) sg <- subGraph(c("a", "x"), mg) current <- nodeData(sg, attr = "color") target <- structure( list("red","green"), names = c("a", "x")) checkEquals(target, current) nodeDataDefaults(mg, attr="st") <- "unknown" nodeData(mg, n = c("b", "d"), attr = "st") <- mg@edge_sets$e1 current <- nodeData(mg, attr = "st") target <- structure(list("unknown", mg@edge_sets$e1, "unknown", mg@edge_sets$e1, "unknown", "unknown"), names = c( "a", "b", "c", "d", "x", "y")) checkEquals(target, current) } test_MultiGraph_edgeAttributes_directed <- function() { ## Check directed edge mg <- make_mixed_MultiGraph()$g mgEdgeDataDefaults(mg, "e1", attr = "color") <- "violet" mgEdgeData(mg, "e1", from = c("a"), to = c("b"), attr = "color") <- "red" current <- mgEdgeData(mg, "e1", attr = "color") nms <- paste( c("b", "a", "a", "a", "b"), c("a","b", "c", "d", "d"),sep ="|") target <- structure( list( "violet", "red", "violet", "violet", "violet"), names = nms) checkEquals(target, current) mgEdgeData(mg, "e1", to = "d", attr = "color") <- "green" current <- mgEdgeData(mg, "e1", attr = "color") target <- structure( list("violet", "red", "violet", "green", "green"), names = nms) checkEquals(target, current) mgEdgeData(mg, "e1", from = "b", attr = "color") <- c("pink") current <- mgEdgeData(mg, "e1", attr = "color") target <- structure( list("pink", "red", "violet", "green" ,"pink"), names = nms) checkEquals(target, current) checkException(mgEdgeData(mg, "e1", attr = "class")) checkException(mgEdgeData(mg, "e9", attr = "color")) } test_MultiGraph_edgeAttributes_directed_S4 <- function() { ## Check directed edge mg <- make_mixed_MultiGraph()$g df <- extractFromTo(mg)$e1 mgEdgeDataDefaults(mg, "e1", attr = "color") <- "unknown" mgEdgeData(mg, "e1", from = c("a"), to = c("b"), attr = "color") <- df current <- mgEdgeData(mg, "e1", attr = "color") nms <- paste( c("b", "a", "a", "a", "b"), c("a","b", "c", "d", "d"),sep ="|") target <- structure( list( "unknown", df, "unknown", "unknown", "unknown"), names = nms) checkEquals(target, current) mgEdgeData(mg, "e1", to = "d", attr = "color") <- matrix(1) current <- mgEdgeData(mg, "e1", attr = "color") target <- structure( list("unknown", df, "unknown", matrix(1), matrix(1)), names = nms) checkEquals(target, current) mgEdgeData(mg, "e1", from = "b", attr = "color") <- matrix(0) current <- mgEdgeData(mg, "e1", attr = "color") target <- structure( list(matrix(0), df, "unknown", matrix(1), matrix(0)), names = nms) checkEquals(target, current) checkException(mgEdgeData(mg, "e1", attr = "class")) checkException(mgEdgeData(mg, "e9", attr = "color")) } test_MultiGraph_edgeAttributes_undirected <- function() { ## Check undirected edge mg <- make_mixed_MultiGraph()$g mgEdgeDataDefaults(mg, "e3", attr = "color") <- "unknown" mgEdgeData(mg, "e3", from = c("a"), to = c("b"), attr = "color") <- "red" current <- mgEdgeData(mg, "e3", to = "a", attr = "color") nms <- paste( c("b", "c", "x"), rep("a", 3), sep = "|") target <- structure(list("red", "unknown", "unknown"), names = nms) checkEquals(target, current) mgEdgeData(mg, "e3", to = "c", attr = "color") <- "green" current <- mgEdgeData(mg, "e3", to = "c", attr = "color") nms <- paste(c("a", "x"), c("c", "c"), sep = "|") target <- structure( list("green", "green"), names = nms) checkEquals(target, current) mgEdgeData(mg, "e3", from = "b", attr = "color") <- c("pink") current <- mgEdgeData(mg, "e3", attr = "color") nms <- paste(c("a", "a", "a", "c", "x", "b", "c", "x", "x", "y"), c("b", "c", "x", "x", "y", "a", "a", "a", "c", "x"), sep ="|") target <- structure( list("pink", "green", "unknown", "green", "unknown", "pink", "green", "unknown", "green", "unknown"), names = nms) checkEquals(target, current) } test_MultiGraph_edgeAttributes_undirected_S4 <- function() { ## Check undirected edge mg <- make_mixed_MultiGraph()$g mgEdgeDataDefaults(mg, "e3", attr = "color") <- "unknown" mgEdgeData(mg, "e3", from = c("a"), to = c("b"), attr = "color") <- matrix(1) current <- mgEdgeData(mg, "e3", to = "a", attr = "color") nms <- paste( c("b", "c", "x"), rep("a", 3), sep = "|") target <- structure(list(matrix(1), "unknown", "unknown"), names = nms) checkEquals(target, current) df <- data.frame(1:2) mgEdgeData(mg, "e3", to = "c", attr = "color") <- df current <- mgEdgeData(mg, "e3", to = "c", attr = "color") nms <- paste(c("a", "x"), c("c", "c"), sep = "|") target <- structure( list(df, df), names = nms) checkEquals(target, current) mgEdgeData(mg, "e3", from = "b", attr = "color") <- matrix(0) current <- mgEdgeData(mg, "e3", attr = "color") nms <- paste(c("a", "a", "a", "c", "x", "b", "c", "x", "x", "y"), c("b", "c", "x", "x", "y", "a", "a", "a", "c", "x"), sep ="|") target <- structure( list(matrix(0), df, "unknown", df, "unknown", matrix(0), df, "unknown", df, "unknown"), names = nms) checkEquals(target, current) } test_MultiGraph_edgeAttributes_empty <- function() { mg <- make_mixed_MultiGraph()$g checkException(mgEdgeData(mg, "e4", from ="a", attr = "color") <- "green") checkException(mgEdgeData(mg, "e4", attr = "color")) } test_MultiGraph_edgeAttributes_subGraph <- function() { mg <- make_mixed_MultiGraph()$g mgEdgeDataDefaults(mg, "e1", attr = "color") <- "violet" mgEdgeData(mg, "e1", attr = "color") <- "red" mgEdgeData(mg, "e1", from = c("a", "a"), to = c("b", "c"), attr = "color") <- c("yellow", "pink") current <- mgEdgeData(mg,"e1", attr ="color") nms <- paste(c("b", "a", "a", "a", "b"), c("a", "b", "c", "d", "d"), sep = "|") target <- structure(list("red", "yellow", "pink", "red", "red"), names = nms) checkEquals(target, current) sg <- subGraph(c("a","c", "d"), mg) current <- mgEdgeData(sg, "e1", attr = "color") nms <- paste(c("a", "a"), c("c", "d"), sep ="|") target <- structure( list("pink", "red"), names = nms) checkEquals(target, current) } test_MultiGraph_Intersection_Attributes <- function(use.factors=TRUE){ setClass("myType", representation = representation(typ ="character")) myType <- function(typ){ new("myType", typ = typ)} colorFun <- function(x,y) { if(x@typ =="low" || y@typ == "med") return("low") else return("high") } typeFun <- function(x,y) { if(is(x, "myType") && is(y, "myType")){ if(x@typ =="low" || y@typ == "med") return("low") else return("high") } else {return (NA)} } edgeFun <- structure(rep(list(structure( list(colorFun), names = "myType")),2), names = c("e1", "e2")) ft1 <- data.frame(from=c("a", "b", "b", "f"), to=c("b", "c", "d", "g"), weight=c(1, 2, 3, 4), stringsAsFactors = use.factors) ft2 <- data.frame(from =c("e", "f", "a", "b", "f"), to =c( "a", "a", "b", "c", "c"), weight =c(2, 3, 4, 5, 9), stringsAsFactors= use.factors) esets <- list(e1=ft1, e2=ft2) g1 <- MultiGraph(esets) mgEdgeDataDefaults(g1, "e1", attr = "color") <- "violet" mgEdgeData(g1, "e1", from = c("b", "b", "f"), to = c("c", "d", "g"), attr = "color") <- c ("red", "green", "green") mgEdgeDataDefaults(g1, "e2", attr = "color") <- "violet" mgEdgeData(g1, "e2", from = c("b", "f"), to = c("c", "c"), attr = "color") <- c("red", "green") mgEdgeDataDefaults(g1, "e1", attr = "myType") <- "missing" mgEdgeData(g1, "e1", from = c("b", "f"), to = c("c", "g"), attr = "myType") <- c(myType("low"), myType("high")) mgEdgeDataDefaults(g1, "e2", attr = "myType") <- "missing" mgEdgeData(g1, "e2", from = c("a", "f"), to = c("b", "c"), attr = "myType") <- c(myType("high"), myType("low")) ft1 <- data.frame(from=c("b", "f"), to=c("c", "g"), weight=c(2, 3), stringsAsFactors = use.factors) ft2 <- data.frame(from =c("a", "f"), to =c( "b", "c"), weight =c(4, 6), stringsAsFactors= use.factors) esets <- list(e1=ft1, e2=ft2) g2 <- MultiGraph(esets) mgEdgeDataDefaults(g2, "e1", attr = "color") <- "violet" mgEdgeData(g2, "e1", from = c("b", "f"), to = c("c", "g"), attr = "color") <- c ("red", "green") mgEdgeDataDefaults(g2, "e2", attr = "color") <- "violet" mgEdgeData(g2, "e2", from = c("a", "f"), to = c("b", "c"), attr = "color") <- c("red", "green") mgEdgeDataDefaults(g2, "e1", attr="myType") <- "unknown" mgEdgeData(g2, "e1", from = c("b", "f"), to = c("c", "g"), attr = "myType") <- c(myType("med"), myType("high")) mgEdgeDataDefaults(g2, "e2", attr="myType") <- "unknown" mgEdgeData(g2, "e2", from = c("a", "f"), to = c("b", "c"), attr = "myType") <- c(myType("high"), myType("med")) nodeDataDefaults(g1, attr = "color") <- "violet" nodeDataDefaults(g2, attr = "color") <- "violet" nodeDataDefaults(g1, attr= "type") <- "unknown" nodeDataDefaults(g2, attr = "type") <- "unknown" nodeData(g1,n = c("a", "b", "c"), attr ="color") <- c("red", "green", "blue") nodeData(g1,n = c("b", "c"), attr ="type") <- c(myType("low"), myType("high")) nodeData(g2,n = c("a", "b", "c"), attr ="color") <- c("red", "green", "red") nodeData(g2,n = c("b", "c"), attr ="type") <- c(myType("med"), myType("low")) res <- graphIntersect(g1, g2, nodeFun = list(type =typeFun), edgeFun = edgeFun) current <- mgEdgeData(res,"e1", attr = "weight") target <- structure(list(2, as.numeric(NA)), names = paste(c("b", "f"), c("c", "g"), sep="|")) checkEquals(target, current) current <- mgEdgeData(res,"e1", attr = "color") target <- structure(list("red", "green"), names = paste(c("b", "f"), c("c", "g"), sep="|")) checkEquals(target, current) current <- mgEdgeData(res,"e2", attr = "weight") target <- structure(list(4, as.numeric(NA)), names = paste(c("a", "f"), c("b", "c"), sep="|")) checkEquals(target, current) current <- mgEdgeData(res,"e2", attr = "color") target <- structure(list(as.character(NA), "green"), names = paste(c("a", "f"), c("b", "c"), sep="|")) checkEquals(target, current) current <- mgEdgeData(res,"e1", attr = "myType") target <- structure(list("low", "high"), names = paste(c("b", "f"), c("c", "g"), sep="|")) checkEquals(target, current) current <- mgEdgeData(res,"e2", attr = "myType") target <- structure(list("high", "low"), names = paste(c("a", "f"), c("b", "c"), sep="|")) checkEquals(target, current) nodeColor <- nodeData(res, attr = "color") target <- as.list(structure(c("red", "green", NA, "violet", "violet"), names = c("a", "b", "c", "f", "g"))) checkEquals(target, nodeColor) nodeType <- nodeData(res, attr = "type") target <- as.list(structure(c("unknown", "low", "high", "unknown", "unknown"), names = c("a", "b", "c", "f", "g"))) checkEquals(target, nodeType) } test_MultiGraph_Union_Attributes <- function(use.factors=TRUE){ setClass("myType", representation = representation(typ ="character")) myType <- function(typ){ new("myType", typ = typ)} typeFun <- function(x,y) { if(is(x, "myType") && is(y, "myType")){ if(x@typ =="low" || y@typ == "med") return("low") else return("high") } else {return (NA)} } funList <- structure(rep(list(structure( list(typeFun), names = "myType")),2), names = c("e1", "e2")) ft1 <- data.frame(from=c("a", "b", "b", "f"), to=c("b", "c", "d", "g"), weight=c(1, 2, 3, 4), stringsAsFactors = use.factors) ft2 <- data.frame(from =c("e", "f", "a", "b", "f"), to =c( "a", "a", "b", "c", "c"), weight =c(2, 3, 4, 5, 9), stringsAsFactors= use.factors) esets <- list(e1=ft1, e2=ft2) g1 <- MultiGraph(esets) mgEdgeDataDefaults(g1, "e1", attr = "color") <- "violet" mgEdgeData(g1, "e1", from = c("b", "b", "f"), to = c("c", "d", "g"), attr = "color") <- c ("red", "green", "green") mgEdgeDataDefaults(g1, "e2", attr = "color") <- "violet" mgEdgeData(g1, "e2", from = c("b", "f"), to = c("c", "c"), attr = "color") <- c("red", "green") mgEdgeDataDefaults(g1, "e1", attr ="myType") <- "unknown" mgEdgeData(g1, "e1", from = c("b", "f"), to = c("c", "g"), attr = "myType") <- c(myType("low"), myType("high")) mgEdgeDataDefaults(g1, "e2", attr ="myType") <- "unknown" mgEdgeData(g1, "e2", from = c("a", "f"), to = c("b", "c"), attr = "myType") <- c(myType("high"), myType("low")) ft1 <- data.frame(from=c("b", "f"), to=c("c", "g"), weight=c(2, 3), stringsAsFactors = use.factors) ft2 <- data.frame(from =c("a", "f"), to =c( "b", "c"), weight =c(4, 6), stringsAsFactors= use.factors) esets <- list(e1=ft1, e2=ft2) g2 <- MultiGraph(esets) mgEdgeDataDefaults(g2, "e1", attr = "color") <- "violet" mgEdgeData(g2, "e1", from = c("b", "f"), to = c("c", "g"), attr = "color") <- c ("red", "green") mgEdgeDataDefaults(g2, "e2", attr = "color") <- "violet" mgEdgeData(g2, "e2", from = c("a", "f"), to = c("b", "c"), attr = "color") <- c("red", "green") mgEdgeDataDefaults(g2, "e1", attr = "myType") <- "unknown" mgEdgeData(g2, "e1", from = c("b", "f"), to = c("c", "g"), attr = "myType") <- c(myType("med"), myType("high")) mgEdgeDataDefaults(g2, "e2", attr = "myType") <- "unknown" mgEdgeData(g2, "e2", from = c("a", "f"), to = c("b", "c"), attr = "myType") <- c(myType("high"), myType("med")) res <- graphUnion(g1, g2, edgeFun = funList) current <- mgEdgeData(res,"e1", attr = "weight") target <- structure(list(1, 2, 3, as.numeric(NA)), names = paste(c("a", "b", "b", "f"), c( "b", "c", "d", "g"), sep="|")) checkEquals(target, current) current <- mgEdgeData(res,"e1", attr = "color") target <- structure(list("violet", "red", "green", "green"), names = paste(c("a", "b", "b", "f"), c("b", "c", "d", "g"), sep="|")) checkEquals(target, current) current <- mgEdgeData(res,"e2", attr = "weight") target <- structure(list(2, 3, 4, 5, as.numeric(NA)), names = paste(c("e", "f", "a", "b", "f"), c("a", "a", "b", "c", "c"), sep="|")) checkEquals(target, current) current <- mgEdgeData(res,"e2", attr = "color") target <- structure(list( "violet", "violet", as.character(NA), "red", "green"), names = paste(c("e", "f", "a", "b", "f"), c("a", "a", "b", "c", "c"), sep="|")) checkEquals(target, current) current <- mgEdgeData(res,"e1", attr = "myType") target <- structure(list("unknown", "low", "unknown", "high"), names = paste(c("a", "b", "b", "f"), c("b", "c", "d", "g"), sep="|")) checkEquals(target, current) current <- mgEdgeData(res,"e2", attr = "myType") target <- structure(list("unknown", "unknown", "high", "unknown","low"), names = paste(c("e", "f", "a", "b", "f"), c("a", "a", "b", "c", "c"), sep="|")) checkEquals(target, current) } test_MultiGraph_nodeUnion_Attributes <- function(use.factors=TRUE){ setClass("myType", representation = representation(typ ="character")) myType <- function(typ){ new("myType", typ = typ)} testFun <- function(x,y) { if(is(x, "myType") && is(y, "myType")){ if(x@typ =="aa" || y@typ == "ac") return("ax") else return("notype") } else return("ab") } funList <- structure(list(testFun), names ="gene") ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to =c("b", "c", "d", "a", "d"), weight=c(1, 3.1, 5.4, 1, 2.2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a"), to=c("b", "c"), weight=c(3.4, 2.6), stringsAsFactors = use.factors) ft3 <- data.frame(from=c("a", "a"), to =c("d", "b"), weight=c(1,2), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2, e3=ft3, e4=ft2[FALSE, ], e5=ft3[FALSE, ]) g1 <- MultiGraph(esets, directed = c(TRUE, FALSE, TRUE, TRUE, FALSE)) nodeDataDefaults(g1, attr = "color") <- "violet" nodeData(g1, n = c("a", "b", "c") , attr = "color") <- c("red", "green", "blue") nodeDataDefaults(g1, attr = "type") <- "unknown" nodeData(g1, n = c("a", "b"), attr = "type") <- c("low", "high") nodeDataDefaults(g1, attr = "kp") <- "kpunknown" nodeData(g1, n = c("a", "b"), attr = "kp") <- c("kplow", "kphigh") nodeDataDefaults(g1, attr = "gene") <- "XX" nodeData(g1, n = c("a", "b"), attr = "gene") <- c(myType("aa"), myType("bt")) ft1 <- data.frame(from=c("a", "a", "b"), to=c("b", "x", "z"), weight=c(6, 5, 2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a", "a"), to=c("a", "x", "y"), weight=c(1, 2, 3), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2) g2 <- MultiGraph(esets, directed = c(TRUE, FALSE)) nodeDataDefaults(g2, attr ="color") <- "violet" nodeData(g2, n = c("a", "b", "x", "y", "z") , attr = "color") <- c("red", "red", "green", "pink", "yellow") nodeDataDefaults(g2, attr ="type") <- "unknown" nodeData(g2, n = c("a", "b"), attr = "type") <- c("low", "high") nodeDataDefaults(g2, attr ="gene") <- "XX" nodeData(g2, n = c("a", "b"), attr = "gene") <- c(myType("at"), myType("kt")) res <- graphUnion(g1, g2, nodeFun = funList ) current <- nodeData(res, attr = "color") target <- as.list( structure(c("red", NA, "blue", "violet", "green", "pink", "yellow"), names = c("a", "b", "c", "d", "x", "y", "z"))) checkEquals(target, current) current <- nodeData(res, attr = "type") target <- as.list( structure(c("low", "high", "unknown", "unknown", "unknown", "unknown", "unknown"), names = c("a", "b", "c", "d", "x", "y", "z"))) checkEquals(target, current) current <- nodeData(res, attr = "kp") cn <- "kpunknown" target <- as.list( structure(c("kplow", "kphigh", cn, cn, cn, cn, cn), names = c("a", "b", "c", "d", "x", "y", "z"))) checkEquals(target, current) current <- nodeData(res, n =c("a", "b"), attr ="gene") target <- as.list( structure(c("ax", "notype"), names = c("a", "b"))) checkEquals(target, current) current <- nodeData(res, n = c("c", "d", "x", "y", "z"), attr ="gene") target <- as.list( structure(c( "XX", "XX", "XX", "XX", "XX"), names = c("c", "d", "x", "y", "z"))) checkEquals(target, current) } graph/inst/unitTests/attrData_test.R0000644000175400017540000001145213175713336020622 0ustar00biocbuildbiocbuildbasicProps <- list(weight=1, color="blue", friends=c("bob", "alice")) testCreation <- function() { aset <- new("attrData", defaults=basicProps) checkEquals(TRUE, is(aset, "attrData")) } testDefaultAttributesGetting <- function() { aset <- new("attrData", defaults=basicProps) ## Get the entire list checkEquals(basicProps, attrDefaults(aset)) ## Get a single attribute checkEquals(basicProps$weight, attrDefaults(aset, attr="weight")) checkEquals(basicProps$friends, attrDefaults(aset, attr="friends")) ## It is an error to ask for an undefined attr checkException(attrDefaults(aset, attr="NOSUCHATTRIBUTE"), silent=TRUE) ## You can only ask for one attr at a time checkException(attrDefaults(aset, attr=c("weight", "friends")), silent=TRUE) } testDefaultAttributesSetting <- function() { aset <- new("attrData", defaults=basicProps) ## Edit default value, type changes are allowed attrDefaults(aset, attr="weight") <- 100 checkEquals(100, attrDefaults(aset, attr="weight")) ## Add a new attribute attrDefaults(aset, attr="size") <- c(1, 2) checkEquals(c(1, 2), attrDefaults(aset, attr="size")) ## This is sort of dangerous, but for now, we'll allow it. ## I would prefer the attributes to be write-once and there ## forever. Or at least a special interface to remove unwanted... newProps <- list(dir="home", size=100) attrDefaults(aset) <- newProps checkEquals(newProps, attrDefaults(aset)) } testItemGettingAndSettingSimple <- function() { aset <- new("attrData", defaults=basicProps) ## access to defaults checkEquals(1, attrDataItem(aset, x="k1", attr="weight")[[1]]) expect <- as.list(rep(1, 3)) names(expect) <- letters[1:3] checkEquals(expect, attrDataItem(aset, x=letters[1:3], attr="weight")) ## mixed custom/defaults attrDataItem(aset, x="k1", attr="weight") <- 900 checkEquals(900, attrDataItem(aset, x="k1", attr="weight")[[1]]) ## Retrieve entire attribute list expect <- basicProps expect[["weight"]] <- 900 checkEquals(expect, attrDataItem(aset, x=c("k1", "newone"))[[1]]) checkEquals(basicProps, attrDataItem(aset, x=c("k1", "newone"))[[2]]) ## error on unknown attrs checkException(attrDataItem(aset, "k1", "UNKNOWN"), silent=TRUE) checkException(attrDataItem(aset, "k1", "UNKNOWN") <- "BAD", silent=TRUE) } testItemGettingAndSettingVectorized <- function() { aset <- new("attrData", defaults=basicProps) keys <- c("k1", "k2", "k3") ## Set multiple with same value 1 attrDataItem(aset, x=keys, attr="weight") <- 222 expectPerElem <- basicProps expectPerElem[["weight"]] <- 222 for(k in keys) checkEquals(expectPerElem, attrDataItem(aset, k)[[1]]) ## Set multiple with same value 2 complexVal <- list(a=as.list(1:3), b="ccc", c=1:5) attrDataItem(aset, x=keys, attr="weight") <- list(complexVal) expectPerElem <- basicProps expectPerElem[["weight"]] <- complexVal checkEquals(expectPerElem, attrDataItem(aset, "k1")[[1]]) checkEquals(expectPerElem, attrDataItem(aset, "k2")[[1]]) checkEquals(expectPerElem, attrDataItem(aset, "k3")[[1]]) ## Set multiple with same value 3 complexVal <- list(a=as.list(1:3), b="ccc", c=1:5, d="extra") attrDataItem(aset, x=keys, attr="weight") <- list(complexVal) expectPerElem <- basicProps expectPerElem[["weight"]] <- complexVal for(k in keys) checkEquals(expectPerElem, attrDataItem(aset, k)[[1]]) ## Set multiple with distinct values 1 wVect <- c(10, 20, 30) attrDataItem(aset, x=keys, attr="weight") <- wVect for (i in 1:length(wVect)) checkEquals(wVect[i], attrDataItem(aset, keys[i], "weight")[[1]]) ## Set multiple with distinct values 2 wVect <- list(list(a=1), list(a=2), list(a=3)) attrDataItem(aset, x=keys, attr="weight") <- wVect for (i in 1:length(wVect)) checkEquals(wVect[[i]], attrDataItem(aset, keys[i], "weight")[[1]]) } testItemRemovalSimple <- function() { aset <- new("attrData", defaults=basicProps) attrDataItem(aset, x="k1", attr="weight") <- 900 checkEquals(900, attrDataItem(aset, x="k1", attr="weight")[[1]]) removeAttrDataItem(aset, x="k1") <- NULL checkEquals(1, attrDataItem(aset, x="k1", attr="weight")[[1]]) } testNames <- function() { aset <- new("attrData", defaults=basicProps) attrDataItem(aset, x=letters, attr="weight") <- 1:26 checkEquals(letters, names(aset)) names(aset) <- LETTERS checkEquals(LETTERS, names(aset)) ## must have right length checkException(names(aset) <- letters[1:4], silent=TRUE) ## can't have NA bad <- letters bad[11] <- NA checkException(names(aset) <- bad, silent=TRUE) ## can't have duplicates bad[11] <- "b" checkException(names(aset) <- bad, silent=TRUE) } graph/inst/unitTests/clusterGraph_test.R0000644000175400017540000000057113175713336021521 0ustar00biocbuildbiocbuildbasicCluserGraph <- function() { new("clusterGraph", clusters=list( a=c(1,2,3), b=c(4,5,6))) } rename_nodes_test <- function() { g <- basicCluserGraph() checkEquals(as.character(1:6), nodes(g)) nodes(g) <- letters[1:6] checkEquals(letters[1:6], nodes(g)) checkEquals(letters[1:6], names(edges(g))) } graph/inst/unitTests/degree_test.R0000644000175400017540000000114713175713336020311 0ustar00biocbuildbiocbuildlibrary("graph") data(graphExamples) data(apopGraph) test_degree_undirected <- function() { g <- graphExamples[[1]] want <- as.integer(c(5, 5, 1, 5, 5, 5, 0, 6, 0, 0)) names(want) <- nodes(g) checkEquals(want, degree(g)) gam <- as(g, "graphAM") checkEquals(want, degree(g)) } test_degree_directed <- function() { want_in <- c(TRF1=1L, "NF-kB"=4L, CASP2=2L, Daxx=0L) want_out <- c(TRF1=1L, "NF-kB"=1L, CASP2=0L, Daxx=1L) got <- degree(apopGraph, c("TRF1", "NF-kB", "CASP2", "Daxx")) checkEquals(want_in, got[["inDegree"]]) checkEquals(want_out, got[["outDegree"]]) } graph/inst/unitTests/edgeWeights_test.R0000644000175400017540000000340513175713336021314 0ustar00biocbuildbiocbuildegGraphAM <- function() { mat <- matrix(c(0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0), byrow=TRUE, ncol=4) rownames(mat) <- colnames(mat) <- letters[1:4] gam <- graphAM(adjMat=mat, edgemode="directed") } testDefaultIsOnes <- function() { gam <- egGraphAM() expect <- list(a=c(c=1, d=1), b=c(c=1), c=numeric(0), d=c(b=1, c=1)) checkEquals(expect, edgeWeights(gam)) checkEquals(expect[c("a", "d")], edgeWeights(gam, c("a", "d"))) checkEquals(expect[c("a", "d")], edgeWeights(gam, c(1, 4))) ## Also test alternate attr name when undefined checkEquals(expect, edgeWeights(gam, attr="foobar")) } testSettingDefaultValue <- function() { gam <- egGraphAM() expect <- list(a=c(c=4, d=4), b=c(c=4), c=numeric(0), d=c(b=4, c=4)) checkEquals(expect, edgeWeights(gam, default=4)) checkEquals(expect[c("a", "d")], edgeWeights(gam, c("a", "d"), default=4)) checkEquals(expect[c("a", "d")], edgeWeights(gam, c(1, 4), default=4)) } testTypeChecker <- function() { gam <- egGraphAM() simple <- list(a=c(c=1, d=1), b=c(c=1), c=numeric(0), d=c(b=1, c=1)) expect <- list(a=c(c=5:5, d=6:6), b=c(c=4:4), c=numeric(0), d=c(b=4:4, c=4:4)) edgeDataDefaults(gam, attr="foo") <- 4:4 edgeData(gam, from="a", attr="foo") <- c(5:5, 6:6) checkException(edgeWeights(gam, attr="foo", type.checker=is.double), silent=TRUE) checkException(edgeWeights(gam, type.checker=is.integer)) checkEquals(expect, edgeWeights(gam, attr="foo")) checkEquals(expect, edgeWeights(gam, attr="foo", type.checker=is.integer)) checkEquals(simple, edgeWeights(gam)) } graph/inst/unitTests/graphAM_test.R0000644000175400017540000004131413175713336020375 0ustar00biocbuildbiocbuildsimpleAdjMat <- function() { ## Here's a simple graph for testing ## a b ## |\ /| ## | \___c___/ | ## | | | ## \ | / ## \____d____/ ## ## mat <- matrix(c(0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0), byrow=TRUE, ncol=4) rownames(mat) <- letters[1:4] colnames(mat) <- letters[1:4] mat } simpleDirectedGraph <- function() { ## Here's a simple graph for testing ## a b ## |\ /^ ## | \__>c<__/ | ## | ^ | ## \ | / ## \___>d____/ ## ## mat <- matrix(c(0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0), byrow=TRUE, ncol=4) rownames(mat) <- letters[1:4] colnames(mat) <- letters[1:4] mat graphAM (adjMat=mat, edgemode="directed") } testConstructorFunction <- function() { ## no-argument constructor adjMat <- matrix(integer(), 0, 0) target <- new("graphAM", adjMat=adjMat) checkIdentical(target, graphAM()) ## adjMat constructor adjMat <- simpleAdjMat() target <- new("graphAM", adjMat=adjMat, edgemode="directed") checkIdentical(target, graphAM(adjMat, "directed")) target <- new("graphAM", adjMat=adjMat, edgemode="undirected") checkIdentical(target, graphAM(adjMat, "undirected")) checkIdentical(target, graphAM(adjMat)) ## values: adjacency matrix non-zero (and necessarily positive) values ## will be used as edge weights, an edge attribute. the -1 is ignored ## in all cases, but retrievable via edgeDataDefaults ## values is to contain exactly one name, and one value ## the name indicates the edge attribute, whose values come from the ## elements of the adjacency matrix: often, but not necessarily, set to 1 values <- list(weight=-1) target <- new("graphAM", adjMat=adjMat, edgemode="directed", values=values) checkEquals (edgeData(target, 'a', 'c', attr='weight')[[1]], 1) checkEquals (edgeDataDefaults(target, 'weight'), -1) checkIdentical(target, graphAM(adjMat, "directed", values)) } testInvalidNonSquare <- function() { mat <- cbind(c(0, 0, 1), c(1, 1, 1)) checkException(graphAM (adjMat=mat), silent=TRUE) } testInvalidNegativeValues <- function() { mat <- matrix(c(0, 1, -4, -1), ncol=2) checkException(graphAM (adjMat=mat), silent=TRUE) } testInvalidNonSymmetric <- function() { mat <- matrix(c(0, 1, 1, 0, 0, 1, 0, 0, 0), ncol=3, byrow=TRUE) colnames(mat) <- letters[1:3] checkException(graphAM (adjMat=mat), silent=TRUE) checkException(graphAM (adjMat=mat, edgemode="undirected"), silent=TRUE) g1 <- graphAM (adjMat=mat, edgemode="directed") } testInvalidBadNodeNames <- function() { mat <- simpleAdjMat() n <- paste(letters[1:4], 1:4, sep=graph:::EDGE_KEY_SEP) colnames(mat) <- rownames(mat) <- n checkException(graphAM (adjMat=mat), silent=TRUE) colnames(mat) <- rownames(mat) <- c("a", "b", NA, "c") checkException(graphAM (adjMat=mat), silent=TRUE) colnames(mat) <- rownames(mat) <- c("a", "f", "", "d") checkException(graphAM (adjMat=mat), silent=TRUE) } test_empty_graph <- function() { mat <- matrix(integer(0), nrow=0, ncol=0) g <- graphAM (adjMat = mat) checkEquals(0L, numNodes(g)) checkEquals(0L, numEdges(g)) checkEquals(character(0), nodes(g)) checkEquals(list(), edges(g)) m <- as(g, "matrix") checkEquals(c(0L, 0L), dim(m)) checkEquals(0L, length(m)) g <- graphAM (adjMat = mat, values = list(weight = 1L)) checkEquals(0L, numNodes(g)) checkEquals(0L, numEdges(g)) checkEquals(character(0), nodes(g)) checkEquals(list(), edges(g)) m <- as(g, "matrix") checkEquals(c(0L, 0L), dim(m)) checkEquals(0L, length(m)) } test_no_edge_graph <- function() { mat <- matrix(0L, nrow=3, ncol=3, dimnames=list(letters[1:3], letters[1:3])) g <- graphAM (adjMat = mat) checkEquals(letters[1:3], nodes(g)) checkEquals(0L, numEdges(g)) want <- list(a = character(0), b = character(0), c = character(0)) checkEquals(want, edges(g)) m <- as(g, "matrix") checkEquals(c(3L, 3L), dim(m)) checkTrue(all(m == 0L)) g <- graphAM (adjMat = mat, values = list(weight = 1L)) checkEquals(letters[1:3], nodes(g)) checkEquals(0L, numEdges(g)) checkEquals(want, edges(g)) m <- as(g, "matrix") checkEquals(c(3L, 3L), dim(m)) checkTrue(all(m == 0L)) } testValuesToAttr <- function() { mat <- matrix(c(0, 0, 1, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 4, 5, 0), byrow=TRUE, ncol=4) rownames(mat) <- letters[1:4] colnames(mat) <- letters[1:4] g1 <- graphAM (adjMat=mat, edgemode="directed", values=list(weight=1)) checkEquals(4, edgeData(g1, "d", "b", attr="weight")[[1]]) checkEquals(3, edgeData(g1, "b", "c", attr="weight")[[1]]) checkEquals(2, edgeData(g1, "a", "d", attr="weight")[[1]]) checkEquals(1, edgeData(g1, "a", "c", attr="weight")[[1]]) checkException(graphAM (adjMat=mat, edgemode="directed", values=list(weight=1, not=2)), silent=TRUE) checkException(graphAM (adjMat=mat, edgemode="directed", values=list("must", "name")), silent=TRUE) checkException(graphAM (adjMat=mat, edgemode="directed", values="weight"), silent=TRUE) g1 <- graphAM (adjMat=mat, edgemode="directed", values=list(type=4)) checkEquals(4, edgeData(g1, "d", "b", attr="type")[[1]]) checkEquals(3, edgeData(g1, "b", "c", attr="type")[[1]]) checkEquals(2, edgeData(g1, "a", "d", attr="type")[[1]]) checkEquals(1, edgeData(g1, "a", "c", attr="type")[[1]]) } testEdges <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) got <- edges(g1) expect <- list(a=c("c", "d"), b=c("c", "d"), c=c("a", "b", "d"), d=c("a", "b", "c")) checkEquals(expect, got) got <- edges(g1, c("a", "d")) expect <- expect[c("a", "d")] checkEquals(expect, got) } testEdgesDirected <- function() { g1 <- simpleDirectedGraph() expect <- list(a=c("c", "d"), b="c", c=character(0), d=c("b", "c")) checkEquals(expect, edges(g1)) } testEdgesSubset <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) got <- edges(g1) expect <- list(a=c("c", "d"), d=c("a", "b", "c")) got <- edges(g1, c("a", "d")) checkEquals(expect, got) } testNodeNames <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) got <- nodes(g1) expect <- letters[1:4] checkEquals(expect, got) } testNodeNamesReplace <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) nodes(g1) <- LETTERS[1:4] expect <- LETTERS[1:4] checkEquals(expect, nodes(g1)) } testNumNodes <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) checkEquals(nrow(mat), numNodes(g1)) } testNumEdges <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) checkEquals(5, numEdges(g1)) edgemode(g1) <- "directed" checkEquals(10, numEdges(g1)) } testNumEdgesWithSelfLoop <- function() { mat <- matrix(c(1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0), ncol=4) g1 <- graphAM (adjMat=mat) checkEquals(4, numEdges(g1)) } testIsAdjacent <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) checkEquals(TRUE, isAdjacent(g1, "a", "c")) checkEquals(TRUE, isAdjacent(g1, "c", "a")) checkEquals(FALSE, isAdjacent(g1, "a", "b")) checkEquals(FALSE, isAdjacent(g1, "b", "a")) checkException(isAdjacent(g1, "z", "a"), silent=TRUE) checkException(isAdjacent(g1, "a", "z"), silent=TRUE) } testIsAdjacentVectorized <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) fr <- c("a", "c", "a", "b") to <- c("c", "a", "b", "a") expect <- c(TRUE, TRUE, FALSE, FALSE) checkEquals(expect, isAdjacent(g1, fr, to)) checkEquals(expect, isAdjacent(g1, to, fr)) } ## testSubgraph <- function() { ## mat <- simpleAdjMat() ## g1 <- graphAM (adjMat=mat) ## g2 <- subgraph(c("a", "b", "c"), ffff) ## } testSimpleEdgeWeights <- function() { mat <- simpleAdjMat() g <- graphAM (mat) checkEquals(nodes(g), names(edgeWeights(g))) expect <- c(c=1:1, d=1:1) checkEquals(expect, edgeWeights(g)$a) } testAddNode <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) newNodes <- c("r", "s", "a", "b") checkException(addNode(newNodes, g1), silent=TRUE) newNodes <- c("r", "s") expect <- c(nodes(g1), newNodes) g1 <- addNode(newNodes, g1) checkEquals(expect, nodes(g1)) badNodeName <- paste("foo", graph:::EDGE_KEY_SEP, "bar", sep="") checkException(addNode(badNodeName, g1), silent=TRUE) } testAddEdge <- function() { ## I would like different order of the args in the generic, but not sure it is ## worth it to change... but would seem more consistent. mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) g1 <- addNode("e", g1) checkEquals(FALSE, isAdjacent(g1, "b", "e")) g1 <- addEdge(graph=g1, from="b", to="e") checkEquals(TRUE, isAdjacent(g1, "b", "e")) } testAddEdgeMultiple <- function() { a <- matrix(0L, nrow=8, ncol=8) dimnames(a) <- list(letters[1:8], letters[1:8]) G <- graphAM (adjMat=a, edgemode = "directed") GU <- graphAM (adjMat=a) ## make sure we don't warn for this call tryCatch({ H <- addEdge(from=c("a", "b", "c"), to=c("d", "e", "f"), G) HU <- addEdge(from=c("a", "b", "c"), to=c("d", "e", "f"), GU) }, warning = function(w) stop("unwanted warning message: ", conditionMessage(w))) expect <- a fr <- c("a", "b", "c") to <- c("d", "e", "f") wh <- cbind(match(fr, letters[1:8]), match(to, letters[1:8])) expect[wh] <- 1L checkEquals(expect, as(H, "matrix")) expectU <- expect expectU[wh[ , c(2L, 1L)]] <- 1L checkEquals(expectU, as(HU, "matrix")) } testClearNode <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) edgeDataDefaults(g1, attr="weight") <- 1 edgeData(g1, "a", "c", attr="weight") <- 400 checkEquals(TRUE, isAdjacent(g1, "a", "c")) checkEquals(TRUE, isAdjacent(g1, "a", "d")) checkEquals(400, edgeData(g1, "a", "c", attr="weight")[[1]]) g1 <- clearNode("a", g1) checkEquals(FALSE, isAdjacent(g1, "a", "c")) checkEquals(FALSE, isAdjacent(g1, "a", "d")) checkException(edgeData(g1, "a", "c", attr="weight"), silent=TRUE) } testRemoveNode <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) origNodes <- nodes(g1) checkEquals(TRUE, "b" %in% origNodes) g1 <- removeNode("b", g1) checkEquals(FALSE, "b" %in% nodes(g1)) } testRemoveEdge <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) checkEquals(TRUE, isAdjacent(g1, "a", "c")) g1 <- removeEdge("a", "c", g1) checkEquals(FALSE, isAdjacent(g1, "a", "c")) } testRemoveEdgeWithWeights <- function() { mat <- simpleAdjMat() mat[mat != 0] <- runif(length(mat[mat != 0])) g <- graphAM (adjMat = mat, edgemode = "directed", values = list(weight = 1.0)) weights <- unlist(edgeData(g, attr = "weight")) toRemove <- names(weights[weights < 0.5]) expect <- numEdges(g) - length(toRemove) fromTo <- do.call(rbind, strsplit(toRemove, "|", fixed = TRUE)) g2 <- removeEdge(fromTo[, 1], fromTo[, 2], g) checkEquals(expect, numEdges(g2)) apply(fromTo, 1, function(row) { checkEquals(FALSE, isAdjacent(g2, row[1], row[2])) }) } testGraphAMCloning <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) origNodes <- nodes(g1) g2 <- g1 ## modify g1 g1 <- addNode("NEW", g1) edgeDataDefaults(g1, "weight") <- 2 edgeDataDefaults(g1, "color") <- "green" ## g2 should not have changed checkEquals(list(), edgeDataDefaults(g2)) checkEquals(origNodes, nodes(g2)) } testUndirectedAsGraphNEL <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) gNel <- as(g1, "graphNEL") checkEquals(edges(g1), edges(gNel)) checkEquals(nodes(g1), nodes(gNel)) checkEquals(edgemode(g1), edgemode(gNel)) checkEquals(edgeDataDefaults(g1), edgeDataDefaults(gNel)) checkEquals(nodeDataDefaults(g1), nodeDataDefaults(gNel)) } testDirectedAsGraphNEL <- function() { g1 <- simpleDirectedGraph() gNel <- as(g1, "graphNEL") checkEquals(edges(g1), edges(gNel)) checkEquals(nodes(g1), nodes(gNel)) checkEquals(edgemode(g1), edgemode(gNel)) checkEquals(edgeDataDefaults(g1), edgeDataDefaults(gNel)) checkEquals(nodeDataDefaults(g1), nodeDataDefaults(gNel)) } testDirectedAsGraphAM <- function() { g1 <- simpleDirectedGraph() gNel <- as(g1, "graphNEL") g2 <- as(gNel, "graphAM") checkEquals(edges(g1), edges(g2)) checkEquals(nodes(g1), nodes(g2)) checkEquals(edgemode(g1), edgemode(g2)) checkEquals(edgeDataDefaults(g1), edgeDataDefaults(g2)) checkEquals(nodeDataDefaults(g1), nodeDataDefaults(g2)) } testInEdges <- function() { g1 <- simpleDirectedGraph() expected <- list(a=character(0), b="d", c=c("a", "b", "d"), d="a") checkEquals(expected, inEdges(g1), msg="gramAM") checkEquals(expected, inEdges(object=g1), msg="gramAM") checkEquals(expected, inEdges(node=g1), msg="gramAM") } testNoEdges <- function() { m <- matrix(0, nrow=3, ncol=3) g <- graphAM (m) checkEquals(0, numEdges(g)) checkEquals(3, length(edges(g))) checkEquals(nodes(g), names(edges(g))) checkEquals(0, sum(sapply(edges(g), length))) } testAsMatrix <- function() { mat <- rbind(c(0, 0, 12, 1), c(0, 0, 1, 1), c(12, 1, 0, 1), c(1, 1, 1, 0)) rownames(mat) <- colnames(mat) <- letters[1:4] ## If no values arg, then matrix just converted to 0/1 g1 <- graphAM (adjMat=mat, edgemode="undirected") mat1 <- mat mat1[mat1 != 0] <- 1:1 checkEquals(mat1, as(g1, "matrix")) ## With values arg, matrix values stored as edge attribute ## which gets restored for as(<.>, "matrix") g2 <- graphAM (adjMat=mat, edgemode="undirected", values=list(weight=1)) checkEquals(mat, as(g2, "matrix")) } test_coerce_matrix_to_graphAM <- function() { mat <- matrix(c(0, 0, 1, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 4, 5, 0), byrow=TRUE, ncol=4, dimnames=list(letters[1:4], letters[1:4])) g <- as(mat, "graphAM") checkEquals(mat, as(g, "matrix")) g2 <- graphAM (adjMat=mat, edgemode="directed", values=list("weight"=1)) checkEquals(as(g, "matrix"), as(g2, "matrix")) } test_edgeMatrix <- function() { ugam <- graphAM (adjMat=simpleAdjMat(), edgemode="undirected") gam <- simpleDirectedGraph() expect <- c("1+3", "1+4", "2+3", "2+4", "3+4") got <- edgeMatrix(ugam) checkTrue(setequal(expect, paste(got[1, ], got[2, ], sep="+"))) checkEquals(list(c("from", "to"), NULL), dimnames(got)) expect <- c("1+3", "1+4", "2+3", "4+2", "4+3") got <- edgeMatrix(gam) checkTrue(setequal(expect, paste(got[1, ], got[2, ], sep="+"))) ## duplicates should have no effect on directed graph got <- edgeMatrix(gam, duplicates=TRUE) checkTrue(setequal(expect, paste(got[1, ], got[2, ], sep="+"))) expect <- c("1+3", "1+4", "2+3", "2+4", "3+4", "3+1", "4+1", "3+2", "4+2", "4+3") got <- edgeMatrix(ugam, duplicates=TRUE) checkTrue(setequal(expect, paste(got[1, ], got[2, ], sep="+"))) } test_rename_nodes_edgeWeights <- function() { mat <- matrix(c(0, 0, 1, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 4, 5, 0), byrow=TRUE, ncol=4) rownames(mat) <- letters[1:4] colnames(mat) <- letters[1:4] g <- graphAM (adjMat=mat, edgemode="directed", values=list(weight=1)) ew <- edgeWeights(g) ew <- lapply(ew, function(x) { if (length(x)) names(x) <- toupper(names(x)) x }) names(ew) <- toupper(names(ew)) nodes(g) <- LETTERS[1:4] checkEquals(LETTERS[1:4], nodes(g)) checkEquals(ew, edgeWeights(g)) } test_rename_nodes_nodeData <- function() { g <- simpleDirectedGraph() nodeDataDefaults(g) <- list(type=NA) nodeData(g, n="a", attr="type") <- "the first one" nodeData(g, n="d", attr="type") <- "the last one" ndDef <- nodeDataDefaults(g) nd <- nodeData(g, attr="type") names(nd) <- toupper(names(nd)) nodes(g) <- toupper(nodes(g)) checkEquals(nd, nodeData(g, attr="type")) } graph/inst/unitTests/graphBAM_test.R0000644000175400017540000016646013175713336020511 0ustar00biocbuildbiocbuild## library("graph") set.seed(0x12a9b) library(graph) library(RUnit) randBAMGraph <- function(numNodes = 10 , numEdges = 10) { df <- graph:::randFromTo(numNodes, numEdges) df$ft$weight = seq_len(numNodes) g <- graphBAM(df$ft, nodes = df$nodes, edgemode = "directed") g } make_smallBAM <- function() { from = c("a", "a", "a", "x", "x", "c") to = c("b", "c", "x", "y", "c", "a") weight=c(3.4, 2.6, 1.7, 5.3, 1.6, 7.9) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "directed") g1 } make_unDirectedBAM <- function() { from = c("a", "a", "a", "x", "x", "c") to = c("b", "c", "x", "y", "c", "d") weight=c(3.4, 2.6, 1.7, 5.3, 1.6, 7.9) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "undirected") g1 } create_bigBAM <- function() { r1 <- randFromTo(100, 100) r1$ft$weight <- seq_len(100) g1 <- graphBAM(r1$ft, r1$nodes, edgemode="directed") g1 } test_create_graphBAMSmall <- function() { from = c("a", "d", "d", "b") to = c("b", "a", "d", "c") weight= c(1.5, 3.1, 5.4, 1) nodes = c("a","b","c","d") df <- data.frame(from, to, weight) g1 <- graphBAM(df, nodes, edgemode = "directed") g2 <- graphBAM(df, nodes, edgemode = "undirected") checkEquals(4L, numEdges(g1)) checkEquals(isDirected(g1), TRUE) checkEquals(isAdjacent(g1, c("a", "d", "b"), c("b", "d", "c") ), c(TRUE,TRUE,TRUE)) checkEquals(names(edges(g1)), c("a", "b", "c", "d")) k <- edges(g1) checkEquals(list(k$a, k$b, k$c, k$d), list("b", "c", character(0), c("a", "d"))) w <- edgeWeights(g1) checkEquals(names(w), c("a", "b", "c", "d")) checkEquals(list(w$a, w$b, w$c, w$d), list(structure(1.5, names="b"), structure(1, names="c"), numeric(0), structure(c(3.1, 5.4), names= c("a", "d")))) checkEquals(4L, numNodes(g2)) checkEquals(4L, numEdges(g2)) checkEquals(isDirected(g2), FALSE) checkEquals(isAdjacent(g1, c("a","d","b"), c("b","d","c") ), c(TRUE,TRUE,TRUE)) } test_BAMNodes <- function() { from = c("a", "a", "a", "x", "x", "c") to = c("b", "c", "x", "y", "c", "a") weight=c(3.4, 2.6, 1.7, 5.3, 1.6, 7.9) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "directed") nds <- nodes(g1) checkIdentical(all(nds %in% unique(c(from,to))),TRUE) checkIdentical(isDirected(g1),TRUE) ## node names from = paste0("X", 8:11) to = paste0("X", 8:11) df <- data.frame(from, to, weight=rep(1, 4)) g2 <- graphBAM(df) ## no 'nodes' checkIdentical(nodes(g2), c("X10", "X11", "X8", "X9")) g2 <- graphBAM(df, nodes="X7") ## degree-zero node checkIdentical(nodes(g2), c("X10", "X11", "X7", "X8", "X9")) g2 <- graphBAM(df, nodes=paste0("X", 8:11)) ## forced ordering checkIdentical(nodes(g2), c("X8", "X9", "X10", "X11")) } checkBAMSubGraph <- function(g, subG) { nds <- nodes(g) subNodes <- nodes(subG) w1 <- g@edgeSet@weights ft1 <- .Call(graph:::graph_bitarray_rowColPos, g@edgeSet@bit_vector) origFromTo <- data.frame(from=nds[ft1[,"from"]], to = nds[ft1[,"to"]], weights = w1) w2 <- subG@edgeSet@weights ft2 <- .Call(graph:::graph_bitarray_rowColPos, subG@edgeSet@bit_vector) subFromTo <- data.frame(from = subNodes[ft2[,"from"]], to = subNodes[ft2[,"to"]], weights = w2) indx <- (origFromTo$from %in% subNodes) & (origFromTo$to %in% subNodes) want <- origFromTo[(origFromTo$from %in% subNodes) & (origFromTo$to %in% subNodes),] checkEquals(as.character(want$from), as.character(subFromTo$from)) checkIdentical(as.character(want$to), as.character(subFromTo$to)) checkEquals(g@edgeSet@weights[indx], subG@edgeSet@weights) } test_BAMSubGraph_Small <- function() { g1 <- make_smallBAM() sg <- subGraph(c("a","x", "y"), g1) checkIdentical(isDirected(sg), TRUE) checkIdentical(nodes(sg), c("a", "x", "y")) checkBAMSubGraph(g1,sg) } test_BAMSubGraph_Large <- function() { g1 <- randBAMGraph(100,100) sn <- sample(nodes(g1), 55) sg <- subGraph( sn, g1) checkIdentical(isDirected(sg), TRUE) checkBAMSubGraph(g1,sg) } test_BAM_edgeWeights <- function() { g1 <- make_smallBAM() ew1 <- edgeWeights(g1) checkEquals(names(ew1), c("a", "b", "c", "x", "y")) checkEquals(list(ew1$a, ew1$b, ew1$c, ew1$x, ew1$y), list(structure( c(3.4, 2.6, 1.7), names = c("b","c","x")), numeric(0), structure(c(7.9), names = "a"), structure(c(1.6, 5.3), names= c("c", "y")), numeric(0))) ew2 <- edgeWeights(g1,c("a","b")) ##index = char checkEquals(names(ew2), c("a","b")) checkEquals(list(ew2$a, ew2$b), list(structure( c(3.4, 2.6, 1.7), names = c("b","c","x")), numeric(0))) ew2 <- edgeWeights(g1, 1:2) ##index = numeric checkEquals(names(ew2), c("a","b")) checkEquals(list(ew2$a, ew2$b), list(structure( c(3.4, 2.6, 1.7), names = c("b","c","x")), numeric(0))) } test_BAM_edgeWeights_undirected <- function() { from = c("a", "d", "d", "b", "a") to = c("b", "a", "d", "c", "c") weight = c(1.5, 2.1, 3.4, 4.1, 5.6) df <- data.frame(from, to, weight) gu <- graphBAM(df, nodes="e", edgemode = "undirected") want <- list(a=c(b=1.5, c=5.6, d=2.1), b=c(a=1.5, c=4.1), c=c(a=5.6, b=4.1), d=c(a=2.1, d=3.4), e=numeric(0)) checkEquals(want, edgeWeights(gu)) checkEquals(want[c("c", "a")], edgeWeights(gu, c("c", "a"))) } test_BAM_edges <- function() { g1 <- make_smallBAM() ew1 <- edges(g1) checkEquals(names(ew1), c("a", "b", "c", "x", "y")) checkEquals(list(ew1$a, ew1$b, ew1$c, ew1$x, ew1$y), list( c("b","c","x"), character(0), "a", c("c", "y"), character(0))) ew2 <- edges(g1, c("c", "b")) checkEquals(names(ew2), c("c","b")) checkEquals(list(ew2$c, ew2$b), list("a", character(0))) } test_BAM_adj <- function() { g1 <- make_smallBAM() ew <- adj(g1, c("c", "b")) checkEquals(names(ew), c("c","b")) checkEquals(list(ew$c, ew$b), list("a", character(0))) } test_BAM_edgeMatrix <- function() { g1 <- make_smallBAM() em <- edgeMatrix(g1) checkEquals(em[1,], c(3, 1, 1, 4, 1, 4)) checkEquals(em[2,], c(1, 2, 3, 3, 4, 5)) } test_BAM_adjacencyMatrix <- function() { g1 <- make_smallBAM() checkEquals(edgemode(g1), "directed") checkEquals(nodes(g1), c("a","b","c","x","y")) am <- adjacencyMatrix(g1) checkEquals(rownames(am), nodes(g1)) checkEquals(colnames(am), nodes(g1)) checkEquals(as.integer(am["a",]), c(0, 1, 1, 1, 0)) checkEquals(as.integer(am["b",]), c(0, 0, 0, 0, 0)) checkEquals(as.integer(am["c",]), c(1, 0, 0, 0, 0)) checkEquals(as.integer(am["x",]), c(0, 0, 1, 0, 1)) checkEquals(as.integer(am["y",]), c(0, 0, 0, 0, 0)) } test_BAM_removeEdge_unknown_nodes <- function() { g1 <- make_smallBAM() checkException(removeEdge("a", "q", g1), silent=TRUE) checkException(removeEdge("q", "a", g1), silent=TRUE) checkException(removeEdge("a", c("q", "aa", "tt"), g1), silent=TRUE) checkException(removeEdge(c("a", "q", "tt", "aa"), c("a", "q", "aa", "tt"), g1), silent=TRUE) } test_BAM_removeEdge <- function() { g1 <- make_smallBAM() ## removing nothing does nothing c0 <- character(0) checkEquals(edges(g1), edges(removeEdge(c0, c0, g1))) ## there is no y => a edge, throw error checkException(removeEdge("y", "a", g1), silent=TRUE) g2 <- removeEdge("c", "a", g1) checkEquals(list(c=character(0)), edges(g2, "c")) em <- edgeMatrix(g2) checkEquals(em[1,], c(1, 1, 4, 1, 4)) checkEquals(em[2,], c(2, 3, 3, 4, 5)) g3 <- removeEdge("a", c("b", "x"), g1) checkEquals(list(a="c"), edges(g3, "a")) checkEquals(edges(g1)[-1], edges(g3)[-1]) g4 <- removeEdge(c("a", "x"), "c", g1) checkEquals(list(a=c("b", "x")), edges(g4, "a")) checkEquals(list(x="y"), edges(g4, "x")) } test_BAMSmall_edgeData <- function(){ g1 <- make_smallBAM() eg <- edgeData(g1) tmp <- paste(c("c", "a", "a", "x", "a", "x"), c("a","b","c","c","x","y"),sep="|") checkEquals(names(eg), tmp) vals <- sapply( names(eg),function(k){ eg[[k]]$weight }) checkEquals(names(vals), tmp) checkEquals( as.numeric(vals),c(7.9, 3.4, 2.6, 1.6, 1.7, 5.3)) eg <- edgeData(g1, "a", attr="weight") tmp <- paste( c("a", "a", "a"), c("b", "c", "x"), sep = "|") checkEquals(names(eg), tmp) vals <- sapply( names(eg),function(k){ eg[[k]] }) checkEquals(names(vals), tmp) checkEquals( as.numeric(vals), c(3.4, 2.6, 1.7)) checkException(eg <- edgeData(g1, "a", attr="weightsss"), silent=TRUE) eg <- edgeData(g1, "a", "b", attr="weight") tmp <- paste("a", "b", sep = "|") checkEquals(names(eg), tmp) vals <- sapply( names(eg),function(k){ eg[[k]] }) checkEquals(names(vals), tmp) checkEquals( as.numeric(vals),3.4) } test_BAM_extractFromToUndirected <- function() { g1 <- make_unDirectedBAM() ft <- extractFromTo(g1) checkEquals(as.character(ft$from), c("a", "a", "c", "a", "c", "x")) checkEquals(as.character(ft$to), c("b", "c", "d", "x", "x", "y")) checkEquals(ft$weight, c(3.4, 2.6, 7.9, 1.7, 1.6, 5.3)) } test_BAM_extractFromToDirected <- function() { g1 <- make_smallBAM() ft <- extractFromTo(g1) checkEquals(as.character(ft$from), c("c", "a", "a", "x", "a", "x")) checkEquals(as.character(ft$to), c("a", "b", "c", "c", "x", "y")) checkEquals(ft$weight, c(7.9, 3.4, 2.6, 1.6, 1.7, 5.3)) } test_BAM_bamToMatrix_UnDirected <- function() { g1 <- make_unDirectedBAM() mat <- as(g1, "matrix") checkEquals(isSymmetric(mat), TRUE) checkEquals(mat[upper.tri(mat)], c(3.4, 2.6, 0.0, 0.0, 0.0, 7.9, 1.7, 0.0, 1.6, 0.0, 0.0, 0.0, 0.0, 0.0, 5.3)) checkEquals(rownames(mat),colnames(mat)) checkEquals(rownames(mat), c("a", "b", "c", "d", "x", "y")) } test_BAM_bamToMatrix_Directed <- function() { g1 <- make_smallBAM() mat <- as(g1, "matrix") checkEquals(as.numeric(mat), c(0.0, 0.0, 7.9, 0.0, 0.0, 3.4, 0.0, 0.0, 0.0, 0.0, 2.6, 0.0, 0.0, 1.6, 0.0, 1.7, 0.0, 0.0, 0.0,0.0, 0.0, 0.0, 0.0, 5.3, 0.0)) checkEquals(rownames(mat),colnames(mat)) checkEquals(rownames(mat), c("a","b", "c", "x","y")) } test_BAM_bamTographAM_unDirected <- function() { g1 <- make_unDirectedBAM() am <- as(g1,"graphAM") checkEquals(nodes(g1), nodes(am)) checkEquals(edgemode(g1), edgemode(am)) checkEquals(edges(g1), edges(am)) w1 <- edgeWeights(g1) w2 <- edgeWeights(am) checkEquals(names(w1), names(w2)) checkEquals( w1$a, w2$a) checkEquals( w1$b, w2$b) checkEquals( sort(w1$c), sort(w2$c)) checkEquals( w1$d, w2$d) checkEquals( sort(w1$x), sort(w2$x)) checkEquals( w1$y, w2$y) } test_BAM_bamTographAM_Directed <- function() { g1 <- make_smallBAM() am <- as(g1,"graphAM") checkEquals(nodes(g1), nodes(am)) checkEquals(edgemode(g1), edgemode(am)) checkEquals(edges(g1), edges(am)) w1 <- edgeWeights(g1) w2 <- edgeWeights(am) checkEquals(names(w1), names(w2)) checkEquals( w1$a, w2$a) checkEquals( w1$b, w2$b) checkEquals( sort(w1$c), sort(w2$c)) checkEquals( w1$d, w2$d) checkEquals( sort(w1$x), sort(w2$x)) checkEquals( w1$y, w2$y) } test_BAM_bamTographNEL_UnDirected <- function() { g1 <- make_unDirectedBAM() nel <- as(g1,"graphNEL") checkEquals(nodes(g1), nodes(nel)) checkEquals(edgemode(g1), edgemode(nel)) checkEquals(edges(g1), edges(nel)) w1 <- edgeWeights(g1) w2 <- edgeWeights(nel) checkEquals(names(w1), names(w2)) checkEquals( w1$a, w2$a) checkEquals( w1$b, w2$b) checkEquals( sort(w1$c), sort(w2$c)) checkEquals( w1$d, w2$d) checkEquals( sort(w1$x), sort(w2$x)) checkEquals( w1$y, w2$y) } test_BAM_bamTographNEL_Directed <- function() { g1 <- make_smallBAM() nel <- as(g1,"graphNEL") checkEquals(nodes(g1), nodes(nel)) checkEquals(edgemode(g1), edgemode(nel)) checkEquals(edges(g1), edges(nel)) w1 <- edgeWeights(g1) w2 <- edgeWeights(nel) checkEquals(names(w1), names(w2)) checkEquals( w1$a, w2$a) checkEquals( w1$b, w2$b) checkEquals( sort(w1$c), sort(w2$c)) checkEquals( w1$d, w2$d) checkEquals( sort(w1$x), sort(w2$x)) checkEquals( w1$y, w2$y) } create_GraphNEL_Directed <- function() { set.seed(123) V <- letters[1:4] edL <- vector("list", length=4) names(edL) <- V edL[["a"]] <- list(edges=c(3, 4), weights=c(.13, .14)) edL[["b"]] <- list(edges=c(3), weights=.23) edL[["c"]] <- list(edges=numeric(0), weights=numeric(0)) edL[["d"]] <- list(edges=c(2, 3), weights=c(.42, .43)) gR <- graphNEL(nodes = V, edgeL = edL, edgemode = "directed" ) gR } create_GraphNEL_UnDirected <- function() { set.seed(123) V <- letters[1:4] edL <- vector("list", length=4) names(edL) <- V edL[["a"]] <- list(edges=c(2, 3), weights=c(.13, .14)) edL[["b"]] <- list(edges=c(1), weights=.13) edL[["c"]] <- list(edges=c(1), weights=0.14) edL[["d"]] <- list(edges= numeric(0), weights=numeric(0)) gR <- graphNEL(nodes = V, edgeL = edL, edgemode = "undirected" ) gR } test_graphNEL_Directed_To_graphBAM <-function() { nel <- create_GraphNEL_Directed() bam <- as(nel, "graphBAM") checkEquals(nodes(nel), nodes(bam)) checkEquals(edgemode(nel), edgemode(bam)) checkEquals(edges(nel), edges(bam)) w1 <- edgeWeights(nel) w2 <- edgeWeights(bam) checkEquals(w1,w2) } test_graphNEL_Directed_To_graphBAM <- function() { nel <- create_GraphNEL_Directed() bam <- as(nel, "graphBAM") checkEquals(nodes(nel), nodes(bam)) checkEquals(edgemode(nel), edgemode(bam)) checkEquals(edges(nel), edges(bam)) w1 <- edgeWeights(nel) w2 <- edgeWeights(bam) checkEquals(w1,w2) } test_graphNEL_UnDirected_To_graphBAM <- function() { nel <- create_GraphNEL_UnDirected() bam <- as(nel, "graphBAM") checkEquals(nodes(nel), nodes(bam)) checkEquals(edgemode(nel), edgemode(bam)) checkEquals(edges(nel), edges(bam)) w1 <- edgeWeights(nel) w2 <- edgeWeights(bam) checkEquals(w1,w2) } test_graphAM_Directed_To_graphBAM <- function() { nel <- create_GraphNEL_Directed() am <- as(nel, "graphAM") bam <- as(am, "graphBAM") checkEquals(nodes(am), nodes(bam)) checkEquals(edgemode(am), edgemode(bam)) checkEquals(edges(am), edges(bam)) w1 <- edgeWeights(am) w2 <- edgeWeights(bam) checkEquals(w1,w2) } test_graphAM_UnDirected_To_graphBAM<- function() { nel <- create_GraphNEL_UnDirected() am <- as(nel, "graphAM") bam <- as(am, "graphBAM") checkEquals(nodes(am), nodes(bam)) checkEquals(edgemode(am), edgemode(bam)) checkEquals(edges(am), edges(bam)) w1 <- edgeWeights(am) w2 <- edgeWeights(bam) checkEquals(w1, w2) } test_BAM_set_edge_weights <- function() { getw <- function(x) unlist(edgeWeights(x)) g <- make_smallBAM() weight0 <- unlist(edgeWeights(g)) edgeData(g, "c", "a", attr="weight") <- 123.0 want <- weight0 want["c.a"] <- 123.0 checkEquals(want, getw(g)) g <- make_smallBAM() edgeData(g, "a", c("b", "c", "x"), attr="weight") <- c(10, 11, 12) want <- weight0 want[c("a.b", "a.c", "a.x")] <- c(10, 11, 12) checkEquals(want, getw(g)) } test_BAM_Intersect_UnDirected <- function() { ## nodes a b c d x y from = c("a", "b", "d", "d") to = c("b", "c", "x", "y") weight=c(1.2, 2.4, 3.2, 5.4) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "undirected") ## nodes a b c d x y z from = c("a", "b", "b", "d", "d") to = c("b", "c", "d", "c", "x") weight=c(3.2, 1.2, 2.1, 3.2, 3.5) df <- data.frame(from, to, weight) g2 <- graphBAM(df, nodes = c("a","b","c", "d", "x", "y", "z"), edgemode = "undirected") g <- graphIntersect(g1,g2) checkEquals(intersect(nodes(g1), nodes(g2)), nodes(g)) checkEquals(FALSE, isDirected(g)) eg <- edgeData(g) vals <- sapply( names(eg),function(k){ eg[[k]]$weight }) tmp <- paste(c("a", "b", "d", "b", "c", "x"), c("b", "c", "x", "a", "b", "d"), sep= "|") checkEquals(tmp, names(vals)) checkEquals(as.numeric(rep(NA, 6)), as.numeric(vals)) } test_BAM_Intersect_Directed <- function() { ## nodes a b c d x y from = c("a", "b", "d", "d") to = c("b", "c", "x", "y") weight=c(1.2, 2.4, 3.2, 5.4) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "directed") ## nodes a b c d x y z from = c("a", "b", "b", "d", "d") to = c("b", "c", "d", "c", "x") weight=c(1.2, 1.2, 2.1, 3.2, 3.5) df <- data.frame(from, to, weight) g2 <- graphBAM(df, nodes = c("a","b","c", "d", "x", "y", "z"), edgemode = "directed") g <- graphIntersect(g1,g2) checkEquals(intersect(nodes(g1), nodes(g2)), nodes(g)) checkEquals(TRUE, isDirected(g)) eg <- edgeData(g) vals <- sapply( names(eg),function(k){ eg[[k]]$weight }) tmp <- paste(c("a", "b", "d"), c("b", "c", "x"), sep= "|") checkEquals(tmp, names(vals)) checkEquals(c(1.2, NA, NA), as.numeric(vals)) } test_BAM_Intersect_UnDirected2 <- function() { ## nodes a b d x y from = c("a", "d", "d") to = c("b", "x", "y") weight=c(1.2, 3.2, 5.4) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "undirected") ## nodes a b c d x y z from = c("a", "b", "b", "d", "d") to = c("b", "c", "d", "c", "x") weight=c(3.2, 1.2, 2.1, 5.2, 3.2) df <- data.frame(from, to, weight) g2 <- graphBAM(df, nodes = c("a","b","c", "d", "x", "y", "z"), edgemode = "undirected") g <- graphIntersect(g1,g2) checkEquals(intersect(nodes(g1), nodes(g2)), nodes(g)) checkEquals(FALSE, isDirected(g)) eg <- edgeData(g) vals <- sapply( names(eg),function(k){ eg[[k]]$weight }) tmp <- paste(c("a", "d", "b", "x"), c("b", "x", "a", "d"), sep= "|") checkEquals(tmp, names(vals)) checkEquals(rep(c(NA,3.2),2), as.numeric(vals)) } test_BAM_Intersect_EmptyEdges <- function() { from = c("a", "d", "d") to = c("b", "x", "y") weight=c(1.2, 3.2, 5.4) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "directed") from = c("h", "i", "j") to = c("b", "x", "y") weight=c(1.2, 3.2, 5.4) df <- data.frame(from, to, weight) g2 <- graphBAM(df, edgemode = "directed") g <- graphIntersect(g1,g2) checkEquals(nodes(g), intersect(nodes(g1), nodes(g2))) checkEquals(isDirected(g), TRUE) eg <- edgeWeights(g) checkEquals(c("b", "x", "y"), names(eg)) checkEquals(list(numeric(0), numeric(0), numeric(0)),list(eg$b, eg$x, eg$y)) } test_BAM_Intersect_EmptyNodes <- function() { from = c("a", "d", "d") to = c("b", "x", "y") weight=c(1.2, 3.2, 5.4) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "unirected") from = c("h", "i", "j") to = c("s", "h", "l") weight=c(1.2, 3.2, 5.4) df <- data.frame(from, to, weight) g2 <- graphBAM(df, edgemode = "undirected") g <- graphIntersect(g1,g2) checkEquals(intersect(nodes(g1), nodes(g2)), nodes(g)) checkEquals(FALSE, isDirected(g)) eg <- edgeWeights(g) checkEquals(list(), eg) } test_BAM_isAdjacent <- function() { from = c("a", "d", "d", "b", "a") to = c("b", "a", "d", "c", "c") weight= c(1.5, 2.1, 3.4, 4.1, 5.6) df <- data.frame(from, to, weight) gd <- graphBAM(df, nodes="e", edgemode = "directed") ## single edges for (i in seq_len(nrow(df))) { checkEquals(TRUE, isAdjacent(gd, from[i], to[i])) } ## vectorized checkEquals(c(FALSE, TRUE, TRUE, FALSE, FALSE), isAdjacent(gd, "a", letters[1:5])) checkEquals(c(FALSE, FALSE, FALSE, TRUE, FALSE), isAdjacent(gd, letters[1:5], "a")) } test_BAM_Union_UnDirected <- function() { ## nodes a b c d x y from = c("a", "b", "d", "d") to = c("b", "c", "x", "y") weight=c(1.2, 2.4, 3.5, 5.4) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "undirected") ## nodes a b c d x y z from = c("a", "b", "b", "d", "d") to = c("b", "c", "d", "c", "x") weight=c(3.2, 1.2, 2.1, 3.2, 3.5) df <- data.frame(from, to, weight) g2 <- graphBAM(df, nodes = c("a","b","c", "d", "x", "y", "z"), edgemode = "undirected") g <- graphUnion(g1,g2) checkEquals(union(nodes(g1), nodes(g2)), nodes(g)) checkEquals(FALSE, isDirected(g)) df <- extractFromTo(g) tmp <- data.frame(from = c("a", "b", "b", "c", "d", "d"), to = c("b", "c", "d", "d", "x", "y"), weight = c( NA, NA, 2.1, 3.2, 3.5, 5.4)) checkEquals(tmp, df) } test_BAM_Union_Directed <- function() { ## nodes a b c d x y from = c("a", "b", "d", "d") to = c("b", "c", "x", "y") weight=c(1.2, 2.4, 3.5, 5.4) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "directed") ## nodes a b c d x y z from = c("a", "b", "b", "d", "d") to = c("b", "c", "d", "c", "x") weight=c(1.2, 1.2, 2.1, 3.2, 3.5) df <- data.frame(from, to, weight) g2 <- graphBAM(df, nodes = c("a","b","c", "d", "x", "y", "z"), edgemode = "directed") g <- graphUnion(g1,g2) checkEquals(union(nodes(g1), nodes(g2)), nodes(g)) checkEquals(TRUE, isDirected(g)) df <- extractFromTo(g) tmp <- data.frame(from = c("a", "b", "d", "b", "d", "d"), to = c("b", "c", "c", "d", "x", "y"), weight = c( 1.2, NA, 3.2, 2.1, 3.5, 5.4)) checkEquals(tmp, df) } test_BAM_Union_Mixed <- function() { ## nodes a b d x y from = c("a", "d", "d") to = c("b", "x", "y") weight=c(1.2, 3.2, 5.4) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "undirected") ## nodes a b c d x y z from = c("a", "b", "b", "d", "d") to = c("b", "c", "d", "c", "x") weight=c(3.2, 1.2, 2.1, 3.2, 3.5) df <- data.frame(from, to, weight) g2 <- graphBAM(df, nodes = c("a","b","c", "d", "x", "y", "z"), edgemode = "directed") checkException(g <- graphUnion(g1,g2), silent=TRUE) } test_BAM_inEdges <- function() { from = c("a", "d", "d", "b", "a") to = c("b", "a", "d", "c", "c") weight = c(1.5, 2.1, 3.4, 4.1, 5.6) df <- data.frame(from, to, weight) ## directed gd <- graphBAM(df, nodes="e", edgemode = "directed") want <- list(a="d", b="a", c=c("a", "b"), d="d", e=character(0)) checkEquals(want, inEdges(nodes(gd), gd)) ## undirected gu <- graphBAM(df, nodes="e", edgemode = "undirected") checkEquals(edges(gu), inEdges(nodes(gu), gu)) } test_BAM_directed_attrs <- function() { from = c("a", "a", "a", "x", "x", "c") to = c("b", "c", "x", "y", "c", "a") weight = c(2, 1, 3, 4, 5, 6) df <- data.frame(from, to, weight) bam <- graphBAM(df, edgemode = "directed") checkException(edgeData(bam,from="a", attr="code"), silent=TRUE) edgeDataDefaults(bam, attr ="weight") <- 1 edgeDataDefaults(bam, attr = "code") <- "plain" res <- unlist(edgeData(bam,from="a", attr="code")) nmres <- paste(c("a","a","a"), c ("b", "c", "x"), sep="|") checkEquals(names(res), nmres) checkEquals(as.character(res), c("plain", "plain", "plain")) edgeData(bam,from = "a", to = "x", attr= "code") <- "red" res <- unlist(edgeData(bam, from = "a", attr = "code")) checkEquals(names(res), nmres) checkEquals(as.character(res), c("plain", "plain", "red")) edgeData(bam,to = "c", attr= "code") <- "yellow" res <- unlist(edgeData(bam, to= "c", attr = "code")) nmres <- paste(c("a", "x"), c("c", "c"), sep = "|") checkEquals(names(res), nmres) checkEquals(as.character(res), c("yellow", "yellow")) } test_BAM_undirected_attrs <- function() { from = c("a", "a", "a", "x", "x") to = c("b", "c", "x", "y", "c") weight = c(2, 1, 3, 4, 5) df <- data.frame(from, to, weight) bam <- graphBAM(df, edgemode = "undirected") checkException(edgeData(bam,from="a", attr="code"), silent=TRUE) edgeDataDefaults(bam, attr = "weight") <- 1 edgeDataDefaults(bam, attr = "code") <- "plain" res <- unlist(edgeData(bam,from="a", attr="code")) nmres <- paste(c("a","a","a"), c ("b", "c", "x"), sep="|") checkEquals(names(res), nmres) checkEquals(as.character(res), c("plain", "plain", "plain")) edgeData(bam,from = "a", to = "x", attr= "code") <- "red" res <- unlist(edgeData(bam, from = "a", attr = "code")) checkEquals(names(res), nmres) checkEquals(as.character(res), c("plain", "plain", "red")) edgeData(bam,to = "c", attr= "code") <- "yellow" res <- unlist(edgeData(bam, to= "c", attr = "code")) nmres <- paste(c("a", "x"), c("c", "c"), sep = "|") checkEquals(names(res), nmres) checkEquals(as.character(res), c("yellow", "yellow")) } test_graphBAM_detailed_Attribute_Intersection <- function() { ## nodes a b c d x y from = c("a", "b", "d", "d") to = c("b", "c", "y", "x") weight=c(1.2, 2.4, 5.4, 3.2) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "directed") edgeData(g1, from = from, to = to ,attr = "weight") <- c(1.2, 2.4, 5.4, 3.2) edgeDataDefaults(g1, attr = "color") <- "unknown" edgeDataDefaults(g1, attr ="type") <- "unknown" edgeData(g1, from = from, to = to ,attr = "color") <- c("red", "blue", NA, "green") edgeData(g1, from = from, to = to , attr = "type") <- c("high", "low", "high", NA) ## nodes a b c d x y z from = c("a", "b", "b", "d", "d") to = c("b", "c", "d", "c", "x") weight=c(1.2, 4.2, 5.6, 2.1, 3.2) df <- data.frame(from, to, weight) g2 <- graphBAM(df, nodes = c("a","b","c", "d", "x", "y", "z"), edgemode = "directed") edgeDataDefaults(g2, attr = "color") <- "unknown" edgeData(g2, from = from, to = to, attr = "color") <- c("red", "blue", NA, "red", "yellow") g <- graphIntersect(g1, g2) df <- extractFromTo(g) tmp <- data.frame( from = c("a", "b", "d"), to = c("b", "c", "x"), weight = c(1.2, NA, 3.2)) checkEquals(tmp, df) attColor <- edgeData(g, attr = "color") nms <- paste(c("a", "b", "d"), c("b", "c", "x"), sep = "|") target <- structure( c("red", "blue", NA), names = nms) checkEquals(target, unlist(attColor)) checkException(edgeData(g, attr = "type"), silent=TRUE) weightFun <- function(x, y) { return(x +y ) } colorFun <- function(x,y) { if(x=="red" && y == "red") return("white") else return("black") } setClass("myType", representation = representation(typ ="character")) myType <- function(typ){ new("myType", typ = typ)} typeFun <- function(x,y) { if(is(x, "myType") && is(y, "myType")){ if(x@typ =="low" || y@typ == "med") return("low") else return("high") } else {return (NA)} } nodeDataDefaults(g1, attr ="color") <- "unknown" nodeDataDefaults(g1, attr ="type") <- "unknown" nodeDataDefaults(g2, attr ="color") <- "unknown" nodeDataDefaults(g2, attr ="type") <- "unknown" nodeData(g1,n = c("a", "b", "c"), attr ="color") <- c("red", "green", "blue") nodeData(g1,n = c("b", "c"), attr ="type") <- c(myType("low"), myType("high")) nodeData(g2,n = c("a", "b", "c"), attr ="color") <- c("red", "green", "red") nodeData(g2,n = c("b", "c"), attr ="type") <- c(myType("med"), myType("low")) g <- graphIntersect(g1, g2, nodeFun = list(type = typeFun), edgeFun = list(weight = weightFun, color = colorFun)) attWeight <- edgeData(g, attr = "weight") nms <- paste(c("a", "b", "d"), c("b", "c", "x"), sep = "|") target <- structure( c( 2.4, 6.6, 6.4), names = nms) checkEquals(target, unlist(attWeight)) attColor <- edgeData(g, attr = "color") nms <- paste(c("a", "b", "d"), c("b", "c", "x"), sep = "|") target <- structure( c( 2.4, 6.6, 6.4), names = nms) checkEquals(target, unlist(attWeight)) nodeColor <- nodeData(g, attr = "color") target <- as.list(structure(c("red", "green", NA, "unknown", "unknown", "unknown"), names = c("a", "b", "c", "d", "x", "y"))) checkEquals(target, nodeColor) nodeType <- nodeData(g, attr = "type") target <- as.list(structure(c("unknown", "low", "high", "unknown", "unknown", "unknown"), names = c("a", "b", "c", "d", "x", "y"))) checkEquals(target, nodeType) } test_graphBAM_detailed_Attribute_Union <- function() { ## nodes a b c d x y from = c("a", "b", "d", "d") to = c("b", "c", "y", "x") weight=c(1.2, 2.4, 5.4, 3.2) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "directed") edgeData(g1, from = from, to = to ,attr = "weight") <- c(1.2, 2.4, 5.4, 3.2) edgeDataDefaults(g1, attr = "color") <- "cyan" edgeDataDefaults(g1, attr = "type") <- "unknown" edgeData(g1, from = from, to = to ,attr = "color") <- c("red", "blue", NA, "green") edgeData(g1, from = from, to = to , attr = "type") <- c("high", "low", "high", NA) ## nodes a b c d x y z from = c("a", "b", "b", "d", "d") to = c("b", "c", "d", "c", "x") weight=c(1.2, 4.2, 5.6, 2.1, 3.2) df <- data.frame(from, to, weight) g2 <- graphBAM(df, nodes = c("a","b","c", "d", "x", "y", "z"), edgemode = "directed") edgeDataDefaults(g2, attr = "color") <- "cyan" edgeData(g2, from = from, to = to, attr = "color") <- c("red", "blue", NA, "red", "yellow") g <- graphUnion(g1, g2) df <- extractFromTo(g) tmp <- data.frame( from = c("a", "b", "d", "b", "d", "d"), to = c("b", "c", "c", "d", "x", "y"), weight = c(1.2, NA, 2.1, 5.6, 3.2, 5.4)) checkEquals(tmp, df) attColor <- edgeData(g, attr = "color") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure( c("red", "blue", "red", NA, NA, NA), names = nms) checkEquals(target, unlist(attColor)) attType <- edgeData(g, attr = "type") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure( c("high", "low", NA, NA, NA, "high"), names = nms) checkEquals(target, unlist(attType)) weightFun <- function(x, y) { return(x + y ) } colorFun <- function(x,y) { if(x=="red" || y == "red") return("white") else return("black") } setClass("myType", representation = representation(typ ="character")) myType <- function(typ){ new("myType", typ = typ)} typeFun <- function(x,y) { if(is(x, "myType") && is(y, "myType")){ if(x@typ =="low" || y@typ == "med") return("low") else return("high") } else {return (NA)} } nodeDataDefaults(g1, attr ="color") <- "cyan" nodeDataDefaults(g1, attr="type") <- "unknown" nodeData(g1,n = c("a", "b", "c"), attr ="color") <- c("red", "green", "blue") nodeData(g1,n = c("b", "c"), attr ="type") <- c(myType("low"), myType("high")) nodeDataDefaults(g2, attr ="color") <- "cyan" nodeDataDefaults(g2, attr="type") <- "unknown" nodeDataDefaults(g2, attr="test") <- "missing" nodeData(g2,n = c("a", "b", "c", "z"), attr ="color") <- c("red", "green", "red","pink") nodeData(g2,n = c("b", "c"), attr ="type") <- c(myType("med"), myType("low")) nodeData(g2,n = c("a", "b", "c"), attr = "test") <- c("pass", "fail", "pass") g <- graphUnion(g1, g2, edgeFun = list(weight = weightFun, color = colorFun)) attWeight <- edgeData(g, attr = "weight") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure( c( 2.4, 6.6, 2.1, 5.6, 6.4, 5.4), names = nms) checkEquals(target, unlist(attWeight)) attColor <- edgeData(g, attr = "color") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure(c( "white", "black", "red", NA, "black", NA), names = nms) checkEquals( target, unlist(attColor)) attType <- edgeData(g, attr = "type") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure( c("high", "low", NA, NA, NA, "high"), names = nms) checkEquals(target, unlist(attType)) attType <- edgeData(g, attr = "type") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure( c("high", "low", NA, NA, NA, "high"), names = nms) checkEquals(target, unlist(attType)) } test_graphBAM_removeEdgesByWeight <- function() { from = c("a", "b", "d", "d") to = c("b", "c", "y", "x") weight=c(2.2, 2.0, 0.4, 0.2) df <- data.frame(from, to, weight) g <- graphBAM(df, edgemode = "directed") edgeDataDefaults(g, attr="color") <- "pink" edgeData(g, from = from, to = to ,attr = "color") <- c("red", "blue", NA, "green") res <- removeEdgesByWeight(g, lessThan = 2.0) checkEquals(attr(res@edgeSet@bit_vector, "nbitset"), 2) checkEquals(res@edgeSet@weights, c(2.2, 2.0)) current <- unlist( edgeData(res, attr = "color")) target <- structure(c("red", "blue"), names = paste(c("a", "b"), c("b", "c"), sep = "|")) checkEquals(target, current) res <- removeEdgesByWeight(g, greaterThan = 1.9) checkEquals(attr(res@edgeSet@bit_vector, "nbitset"), 2) checkEquals(res@edgeSet@weights, c(0.2, 0.4)) current <- unlist( edgeData(res, attr = "color")) target <- structure(c("green", NA), names = paste(c("d", "d"), c("x", "y"), sep = "|")) checkEquals(target, current) res <- removeEdgesByWeight(g, lessThan =1.0, greaterThan = 2) checkEquals(res@edgeSet@weights, c(2.0)) current <- unlist( edgeData(res, attr = "color")) target <- structure(c("blue"), names = paste( "b", "c", sep = "|")) checkEquals(target, current) res <- removeEdgesByWeight(g, greaterThan = 0.1) checkEquals(res@edgeSet@weights, numeric(0)) checkEquals(res@edgeSet@edge_attrs$color, character(0)) } test_graphBAM_nodeAttributes <- function(){ from = c("a", "b", "d", "d") to = c("b", "c", "y", "x") weight=c(2.2, 2.0, 0.4, 0.2) df <- data.frame(from, to, weight) g <- graphBAM(df, edgemode = "directed") nodeDataDefaults(g, attr ="color") <- "blue" sg <- subGraph(c("a", "c"), g) checkIdentical(unname(unlist(nodeData(sg))), c("blue", "blue")) nodeData(g, n = c("d","a"), attr = "color") <- c("red", "green") current <- nodeData(g, attr = "color") target <- as.list(structure( c("green", "blue", "blue", "red", "blue", "blue"), names = c("a", "b", "c", "d", "x", "y"))) checkEquals(target, current) nodeDataDefaults(g, attr="mat") <- NA nodeData(g, n= c("x", "y"), attr = "mat") <- df current <- nodeData(g, n= c("x", "y"), attr = "mat") target <- list(x = df, y = df) checkEquals(target, current) sg <- subGraph(c("d","b"), g) current <- nodeData(sg, attr = "color") target <- as.list(structure(c("blue", "red"), names = c("b", "d"))) checkEquals(target, current) } test_BAM_directed_attrs_s4 <- function() { from = c("a", "a", "a", "x", "x", "c") to = c("b", "c", "x", "y", "c", "a") weight = c(2, 1, 3, 4, 5, 6) df <- data.frame(from, to, weight) bam <- graphBAM(df, edgemode = "directed") edgeDataDefaults(bam, attr = "weight") <- 1.3 edgeDataDefaults (bam, attr = "vals") <- df edgeData(bam, from = "a", attr= "vals") <- "unknown" res <- edgeData(bam, attr="vals") nmres <- c("c|a", "a|b", "a|c", "x|c", "a|x", "x|y") target <- structure(list(df, "unknown", "unknown", df, "unknown",df), names = nmres) checkEquals(res, target) edgeDataDefaults(bam, attr = "mat") <- NA edgeData(bam,from = "a", to = "x", attr= "mat") <- matrix(1) res <- edgeData(bam, from = "a", attr = "mat") nmres <- paste(c("a", "a", "a"), c("b", "c", "x"), sep = "|") target <- structure( list(NA, NA, matrix(1)), names = nmres) checkEquals(res, target) edgeDataDefaults(bam, attr = "mk") <- NA edgeData(bam,to = "c", attr= "mk") <- matrix(1) res <- edgeData(bam, attr = "mk") nmres <- paste(c("c", "a", "a", "x", "a", "x"), c("a", "b", "c", "c", "x", "y"), sep ="|") target <- structure( list(NA, NA, matrix(1), matrix(1), NA ,NA), names = nmres) checkEquals(res, target) } test_BAM_undirected_attrs_s4 <- function() { from = c("a", "a", "a", "x") to = c("b", "c", "x", "y") weight = c(2, 1, 3, 4) df <- data.frame(from, to, weight) bam <- graphBAM(df, edgemode = "undirected") edgeDataDefaults(bam, attr = "weight") <- 1.3 edgeDataDefaults(bam, attr = "vals") <- df # edgeData(bam, attr = "weight") <- 1.3 # edgeData(bam, attr = "vals") <- df edgeData(bam, from = "x", attr = "vals") <- "unknown" res <- edgeData(bam, attr="vals") nmres <- c("a|b", "a|c", "a|x", "x|y", "b|a", "c|a", "x|a", "y|x") target <- structure(list(df, df, "unknown", "unknown", df, df, "unknown", "unknown"), names = nmres) checkEquals(res, target) edgeDataDefaults(bam, attr ="mat") <- NA edgeData(bam,from = "a", to = "x", attr= "mat") <- matrix(1) res <- edgeData(bam, attr = "mat") target <- structure(list(NA, NA, matrix(1), NA, NA, NA, matrix(1), NA), names = nmres) checkEquals(res, target) edgeDataDefaults(bam, attr = "mk") <- NA edgeData(bam,to = "c", attr= "mk") <- matrix(1) res <- edgeData(bam, attr = "mk") target <- structure( list(NA, matrix(1), NA, NA, NA, matrix(1), NA ,NA), names = nmres) checkEquals(res, target) } test_graphBAM_S4_Attribute_Intersection <- function() { setClass("myColor", representation = representation(col ="character")) setClass("myType", representation = representation(typ ="character")) myColor <- function(col){ new("myColor", col = col)} myType <- function(typ){ new("myType", typ = typ)} ## nodes a b c d x y from = c("a", "b", "d", "d") to = c("b", "c", "y", "x") weight=c(1.2, 2.4, 5.4, 3.2) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "directed") edgeData(g1, from = from, to = to ,attr = "weight") <- c(1.2, 2.4, 5.4, 3.2) edgeDataDefaults(g1, attr="color") <- "cyan" edgeDataDefaults(g1, attr="type") <- "unknown" edgeData(g1, from = from, to = to ,attr = "color") <- c(myColor("red"), myColor("blue"), NA, myColor("green")) edgeData(g1, from = from, to = to , attr = "type") <- c(myType("high"), myType("low"), myType("high"), NA) ## nodes a b c d x y z from = c("a", "b", "b", "d", "d") to = c("b", "c", "d", "c", "x") weight=c(1.2, 4.2, 5.6, 2.1, 3.2) df <- data.frame(from, to, weight) g2 <- graphBAM(df, nodes = c("a","b","c", "d", "x", "y", "z"), edgemode = "directed") edgeDataDefaults(g2, attr ="color") <- "cyan" edgeData(g2, from = from, to = to, attr = "color") <- c(myColor("red"), myColor("blue"), NA, myColor("red"), myColor("yellow")) g <- graphIntersect(g1, g2) df <- extractFromTo(g) tmp <- data.frame( from = c("a", "b", "d"), to = c("b", "c", "x"), weight = c(1.2, NA, 3.2)) checkEquals(tmp, df) attColor <- edgeData(g, attr = "color") nms <- paste(c("a", "b", "d"), c("b", "c", "x"), sep = "|") target <- structure( c(myColor("red"), myColor("blue"), NA), names = nms) checkEquals(target, unlist(attColor)) checkException(edgeData(g, attr = "type"), silent=TRUE) weightFun <- function(x, y) { return(x + y ) } colorFun <- function(x,y) { if(x@col=="red" && y@col == "red") return("white") else return("black") } g <- graphIntersect(g1, g2, edgeFun =list(weight = weightFun, color = colorFun)) df <- extractFromTo(g) tmp <- data.frame( from = c("a", "b", "d"), to = c("b", "c", "x"), weight = c(2.4, 6.6 , 6.4)) checkEquals(tmp, df) attColor <- edgeData(g, attr = "color") nms <- paste(c("a", "b", "d"), c("b", "c", "x"), sep = "|") target <- structure( c("white", "black", "black"), names = nms) checkEquals(target, unlist(attColor)) checkException(edgeData(g, attr = "type"), silent=TRUE) } test_graphBAM_S4_Attribute_Union <- function() { setClass("myColor", representation = representation(col ="character")) setClass("myType", representation = representation(typ ="character")) myColor <- function(col){ new("myColor", col = col)} myType <- function(typ){ new("myType", typ = typ)} ## nodes a b c d x y from = c("a", "b", "d", "d") to = c("b", "c", "y", "x") weight=c(1.2, 2.4, 5.4, 3.2) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "directed") edgeData(g1, from = from, to = to ,attr = "weight") <- c(1.2, 2.4, 5.4, 3.2) edgeDataDefaults(g1, attr = "color") <- "cyan" edgeDataDefaults(g1, attr = "type") <- "missing" edgeData(g1, from = from, to = to ,attr = "color") <- c(myColor("red"), myColor("blue"), NA, myColor("green")) edgeData(g1, from = from, to = to , attr = "type") <- c(myType("high"), myType("low"), myType("high"), NA) ## nodes a b c d x y z from = c("a", "b", "b", "d", "d") to = c("b", "c", "d", "c", "x") weight=c(1.2, 4.2, 5.6, 2.1, 3.2) df <- data.frame(from, to, weight) g2 <- graphBAM(df, nodes = c("a","b","c", "d", "x", "y", "z"), edgemode = "directed") edgeDataDefaults(g2, attr = "color") <- "cyan" edgeData(g2, from = from, to = to, attr = "color") <- c(myColor("red"), myColor("blue"), NA, myColor("red"), myColor("yellow")) g <- graphUnion(g1, g2) df <- extractFromTo(g) tmp <- data.frame( from = c("a", "b", "d", "b", "d", "d"), to = c("b", "c", "c", "d", "x", "y"), weight = c(1.2, NA, 2.1, 5.6, 3.2, 5.4)) checkEquals(tmp, df) attColor <- edgeData(g, attr = "color") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure( c(myColor("red"), myColor("blue"), myColor("red"), NA, NA, NA), names = nms) checkEquals(target, unlist(attColor)) attType <- edgeData(g, attr = "type") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure( c(myType("high"), myType("low"), NA, NA, NA, myType("high")), names = nms) checkEquals(target, unlist(attType)) weightFun <- function(x, y) { return(x + y ) } colorFun <- function(x,y) { if(x@col =="red" || y@col == "red") return("white") else return("black") } g <- graphUnion(g1, g2, edgeFun = list(weight = weightFun, color = colorFun)) attWeight <- edgeData(g, attr = "weight") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure( c( 2.4, 6.6, 2.1, 5.6, 6.4, 5.4), names = nms) checkEquals(target, unlist(attWeight)) attColor <- edgeData(g, attr = "color") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure(c( "white", "black", myColor("red"), NA, "black", NA), names = nms) checkEquals( target, unlist(attColor)) attType <- edgeData(g, attr = "type") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure( c(myType("high"), myType("low"), NA, NA, NA, myType("high")), names = nms) checkEquals(target, unlist(attType)) attType <- edgeData(g, attr = "type") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure(c( myType("high"), myType("low"), NA, NA, NA, myType("high")), names = nms) checkEquals(target, unlist(attType)) } test_graphBAM_addNode1 <- function(){ from = c("a", "b", "d", "d") to = c("b", "c", "y", "x") weight=c(2.2, 2.0, 0.4, 0.2) df <- data.frame(from, to, weight) g <- graphBAM(df, edgemode = "directed") nodeDataDefaults(g, attr="color") <- "pink" nodeData(g, n = c("d","a"), attr = "color") <- c("red", "green") nodeDataDefaults(g, attr="type") <- "unknown" nodeData(g, n = c("a", "b", "y", "d"), attr = "type") <- c("high", "med", "high", "low") gr <- addNode(c("q", "ss"), g) current <- nodeData(gr, attr = "color") target <- c("green", "pink", "pink", "red", "pink", "pink", "pink", "pink") names(target) <- c("a", "b", "c", "d", "q", "ss", "x", "y") checkTrue(all(current[sort(names(current))] == target[sort(names(target))])) current <- nodeData(gr, attr = "type") target <- c("high", "med", "unknown", "low", "unknown", "unknown", "unknown", "high") names(target) <- c("a", "b", "c", "d", "q", "ss", "x", "y") checkTrue(all(current[sort(names(current))] == target[sort(names(target))])) } test_graphBAM_addNode1 <- function(){ from = c("a", "b", "d", "d") to = c("b", "c", "y", "x") weight=c(2.2, 2.0, 0.4, 0.2) df <- data.frame(from, to, weight) g <- graphBAM(df, edgemode = "directed") nodeDataDefaults(g, attr="color") <- "pink" nodeData(g, n = c("d","a"), attr = "color") <- c("red", "green") nodeDataDefaults(g, attr="type") <- "unknown" nodeData(g, n = c("a", "b", "y", "d"), attr = "type") <- c("high", "med", "high", "low") gr <- addNode(c("q", "ss"), g) current <- nodeData(gr, attr = "color") target <- c("green", "pink", "pink", "red", "pink", "pink", "pink", "pink") names(target) <- c("a", "b", "c", "d", "q", "ss", "x", "y") checkTrue(all(current[sort(names(current))] == target[sort(names(target))])) current <- nodeData(gr, attr = "type") target <- c("high", "med", "unknown", "low", "unknown", "unknown", "unknown", "high") names(target) <- c("a", "b", "c", "d", "q", "ss", "x", "y") checkTrue(all(current[sort(names(current))] == target[sort(names(target))])) } test_graphBAM_addNode2 <- function(){ from = c("a", "b", "d", "d") to = c("b", "c", "y", "x") weight=c(2.2, 2.0, 0.4, 0.2) df <- data.frame(from, to, weight) g <- graphBAM(df, edgemode = "directed") edgeDataDefaults(g, attr="color") <- "blue" edgeDataDefaults(g, attr="type") <- "unknown" edgeData(g, from = c("d","a"), to = c("y", "b"), attr = "color") <- c("red", "green") edgeData(g, from = c("a", "b"), to = c("b", "c") , attr = "type") <- c("low", "high") g1 <- addEdge(from = c("d", "b"), to = c("c", "x"), g, weights = c(4.0, 10.0)) current <- edgeData(g1, attr ="weight") lbl <- paste(c("a", "b", "d", "b", "d", "d"), c( "b", "c", "c", "x", "x", "y") , sep ="|") target <- as.list( structure(c(2.2, 2, 4, 10, 0.2, 0.4), names = lbl)) checkEquals(target, current) current <- edgeData(g1, attr ="color") lbl <- paste(c("a", "b", "d", "b", "d", "d"), c( "b", "c", "c", "x", "x", "y"), sep ="|") target <- as.list( structure(c("green", "blue", "blue", "blue", "blue", "red"), names = lbl)) checkEquals(target, current) current <- edgeData(g1, attr ="type") lbl <- paste(c("a", "b", "d", "b", "d", "d"), c( "b", "c", "c", "x", "x", "y") , sep ="|") target <- as.list( structure(c("low", "high", "unknown", "unknown", "unknown", "unknown"), names = lbl)) checkEquals(target, current) } # in version prior to 1.41.1, the propagation of existing "user" edge attributes, # that is, anything other than weight, failed if a new node is added which is # lexically less than the any nodes already in an edge. # the fix was simple: see arguments to setBitCell in methods-graphBAM.R, # the addNode method. test that fix here test_graphBAM_addNode_outOfAlphabeticalOrder_copyUserEdgeAttributes <- function(){ from = c("a", "b", "m", "m") to = c("b", "c", "y", "x") weight=c(2.2, 2.0, 0.4, 0.2) df <- data.frame(from, to, weight) g <- graphBAM(df, edgemode = "directed") edgeDataDefaults(g, attr="color") <- "blue" edgeDataDefaults(g, attr="type") <- "unknown" edgeData(g, from = c("m","a"), to = c("y", "b"), attr = "color") <- c("red", "green") edgeData(g, from = c("a", "b"), to = c("b", "c") , attr = "type") <- c("low", "high") expected.edge.names <- c("a|b", "b|c", "m|x", "m|y") checkEquals(sort(names(edgeData(g, attr="color"))), expected.edge.names) checkEquals(unlist(edgeData(g, attr="color")[expected.edge.names], use.names=FALSE), c("green", "blue", "blue", "red")) g2 <- addNode("f", g) # make sure that the addition of node f does not disrupt # edgeData retrieval checkEquals(sort(names(edgeData(g2, attr="color"))), expected.edge.names) checkEquals(unlist(edgeData(g, attr="color")[expected.edge.names], use.names=FALSE), c("green", "blue", "blue", "red")) } test_graphBAM_nodeUnion_Attributes <- function(use.factors=TRUE){ setClass("myType", representation = representation(typ ="character")) myType <- function(typ){ new("myType", typ = typ)} testFun <- function(x,y) { if(is(x, "myType") && is(y, "myType")){ if(x@typ =="aa" || y@typ == "ac") return("ax") else return("ab") } else return(as.character(NA)) } funList <- structure(list(testFun), names ="gene") ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to =c("b", "c", "d", "a", "d"), weight=c(1, 3.1, 5.4, 1, 2.2), stringsAsFactors = use.factors) g1 <- graphBAM(ft1, edgemode="directed") nodeDataDefaults(g1, attr="color") <- "cyan" nodeDataDefaults(g1, attr="type") <- "missing" nodeDataDefaults(g1, attr="kp") <- "missing" nodeDataDefaults(g1, attr="gene") <- "unknown" nodeData(g1, n = c("a", "b", "c") , attr = "color") <- c("red", "green", "blue") nodeData(g1, n = c("a", "b"), attr = "type") <- c("low", "high") nodeData(g1, n = c("a", "b"), attr = "kp") <- c("kplow", "kphigh") nodeData(g1, n = c("a", "b"), attr = "gene") <- c(myType("aa"), myType("bt")) ft1 <- data.frame(from=c("a", "a", "b"), to=c("b", "x", "z"), weight=c(6, 5, 2), stringsAsFactors = use.factors) g2 <- graphBAM(ft1,nodes = c("a","b", "c", "d", "x", "y", "z"), edgemode = "directed") nodeDataDefaults(g2, attr ="color") <- "cyan" nodeDataDefaults(g2, attr="type") <- "missing" nodeDataDefaults(g2, attr="gene") <- "unknown" nodeData(g2, n = c("a", "b", "x", "y", "z") , attr = "color") <- c("red", "red", "green", "pink", "yellow") nodeData(g2, n = c("a", "b"), attr = "type") <- c("low", "high") nodeData(g2, n = c("a", "b"), attr = "gene") <- c(myType("at"), myType("kt")) res <- graphUnion(g1, g2, nodeFun = funList) current <- nodeData(res, attr = "color") cn <- as.character(NA) target <- as.list( structure(c("red", cn, cn, "cyan", "green", "pink", "yellow"), names = c("a", "b", "c", "d", "x", "y", "z"))) checkEquals(target, current) current <- nodeData(res, attr = "type") target <- as.list( structure(c("low", "high", "missing", "missing", "missing", "missing", "missing"), names = c("a", "b", "c", "d", "x", "y", "z"))) checkEquals(target, current) current <- nodeData(res, attr = "kp") target <- as.list( structure(c("kplow", "kphigh", "missing", "missing", "missing", "missing", "missing"), names = c("a", "b", "c", "d", "x", "y", "z"))) checkEquals(target, current) current <- nodeData(res, n = c("a", "b", "c", "d"), attr ="gene") target <- as.list( structure(c("ax", "ab", cn ,cn), names = c("a", "b", "c", "d"))) checkEquals(target, current) current <- nodeData(res, n= c( "x", "y", "z"), attr ="gene") target <- as.list( structure(c("unknown","unknown", "unknown"), names = c("x", "y", "z"))) checkEquals(target, current) } test_graphBAM_removeNode <- function(){ from = c("a", "b", "d", "d") to = c("b", "c", "y", "x") weight=c(2.2, 2.0, 0.4, 0.2) df <- data.frame(from, to, weight) g <- graphBAM(df, edgemode = "directed") nodeDataDefaults(g, attr="name") <- "NN" nodeData(g, n = c("a","b", "c", "d", "x", "y"), attr = "name") <- c("a", "b", "c", "d", "x", "y") edgeDataDefaults(g, attr="name") <- "EE" edgeData(g, from = from, to = to , attr = "name") <- paste(from, to , sep= "") res <- removeNode(c("x","b"), g) current <- nodeData(res, attr = "name") target <- as.list(structure( c("a", "c", "d", "y"), names = c("a", "c", "d", "y"))) checkEquals(target, current) current <- edgeData(res, attr = "name") target <- as.list(structure( "dy", names = paste("d", "y", sep = "|"))) checkEquals(current, target) res <- removeNode(c("x", "a"), g) current <- edgeData(res, attr = "name") target <- as.list(structure( c("bc", "dy"), names = paste(c("b", "d"), c("c","y"), sep = "|"))) checkEquals(target, current) } test_edgeDataUndirectedGraph <- function() { df <- data.frame(from=c("a", "a", "c"), to=c("b", "c", "d"), weight=rep(1, 3), stringsAsFactors=FALSE) g <- graphBAM(df, edgemode="undirected") edgeDataDefaults(g, attr="EDA") <- 0 edgeData(g, from="a", to="b", attr="EDA") <- 1 edgeData(g, from="a", to="c", attr="EDA") <- 2 edgeData(g, attr="EDA", from="a") # for edges where "a" is the source node, and to unspecified checkEquals(edgeData(g, attr="EDA", from="a")[["a|b"]], 1) checkEquals(edgeData(g, attr="EDA", from="a")[["a|c"]], 2) # specify single values for from and to checkEquals(edgeData(g, attr="EDA", from="a", to="b")[[1]], 1) checkEquals(edgeData(g, attr="EDA", from="a", to="c")[[1]], 2) # multiple target nodes x <- edgeData(g, from="a", to=c("b","c"), attr="EDA") checkEquals(length(x), 2) checkEquals(sort(names(x)), c("a|b", "a|c")) checkEquals(as.numeric(edgeData(g, from="a", to=c("b","c"), attr="EDA")), c(1,2)) checkException(edgeData(g, from="a", to="bogus", attr="EDA"), silent=TRUE) checkException(edgeData(g, from=c("a", "c"), to=c("bogus", "bagus"), attr="EDA"), silent=TRUE) } test_edgeMatrix <- function() { g <- graphBAM(data.frame(from="1", to="2", weight=1)) mtx <- edgeMatrix(g, duplicates=FALSE) checkEquals(dim(mtx), c(2,1)) checkEquals(rownames(mtx), c("from", "to")) checkEquals(as.numeric(mtx), c(1, 2)) mtx.dup <- edgeMatrix(g, duplicates=TRUE) checkEquals(dim(mtx.dup), c(2,2)) checkEquals(rownames(mtx.dup), c("from", "to")) checkEquals(as.numeric(mtx.dup), c(1, 2, 2, 1)) } test_removeEdge_from_undirectedGraph <- function() { g <- graphBAM(data.frame(from="A", to="B", weight=1)) g <- removeEdge(from="A", to="B", g=g) checkEquals(numEdges(g), 0) g <- graphBAM(data.frame(from="A", to="B", weight=1)) g <- removeEdge(from="B", to="A", g=g) checkEquals(numEdges(g), 0) } test_AM2BAM <- function(){ # test the fix for a nov 2014 bug, in which MultiGraph::.makeMDEdgeSet # fails to make edge_sets in the graphBAM constructor when only 1 edge # exists. fix is at line 66 in MultiGraph.R: "drop=FALSE" added to the subset operation mtx <- matrix(c(0,1,0,0), ncol=2, byrow=TRUE, dimnames=list(c("A", "B"), c("A", "B"))) # first create and check a simple (non-binary) adjacency matrix graph g.am <- graphAM(mtx, edgemode="directed") checkEquals(nodes(g.am), c("A", "B")) checkEquals(edgemode(g.am), "directed") checkEquals(edgeNames(g.am), "A~B") # now convert to BAM g.bam <- as(g.am, "graphBAM") checkEquals(nodes(g.bam), c("A", "B")) checkEquals(edgemode(g.bam), "directed") checkEquals(edgeNames(g.bam), "A~B") } test_isAdjacent <- function() { am <- adjacencyMatrix # for shorthand g <- graphBAM(data.frame(from="B", to="C", weight=1), edgemode="undirected") checkEquals(rownames(am(g)), c("B", "C")) checkEquals(colnames(am(g)), c("B", "C")) checkEquals(am(g)["B","C"], 1) checkEquals(am(g)["C","B"], 1) checkTrue(isAdjacent(g, "B", "C")) checkTrue(isAdjacent(g, "C", "B")) checkEquals(as.numeric(edgeMatrix(g)), c(1,2)) # reciprocal edges not stored # add a node, then an edge to the undirected graph g g <- addNode("A", g) checkEquals(nodes(g), c("A", "B", "C")) # just one edge checkEquals(sum(am(g)), 2) checkEquals(am(g)["B", "C"], 1) checkEquals(am(g)["C", "B"], 1) checkTrue(isAdjacent(g, "B", "C")) checkTrue(isAdjacent(g, "C", "B")) g <- addEdge(from="C", to="A", graph=g) checkEquals(sum(am(g)), 4) checkEquals(am(g)["B", "C"], 1) checkEquals(am(g)["C", "B"], 1) checkEquals(am(g)["A", "C"], 1) checkEquals(am(g)["C", "A"], 1) # robert's bug: both of these fail though direct inspection # of either edgeMatrix or adjacencyMatrix show correct edges checkTrue(isAdjacent(g, "A", "C")) checkTrue(isAdjacent(g, "C", "A")) # now verify non-reciprocity of B-C edge in a directed graph gd <- graphBAM(data.frame(from="B", to="C", weight=1), edgemode="directed") checkEquals(rownames(am(gd)), c("B", "C")) checkEquals(colnames(am(gd)), c("B", "C")) checkEquals(am(gd)["B","C"], 1) checkTrue(isAdjacent(gd, "B", "C")) checkTrue(!isAdjacent(gd, "C", "B")) # add a node, then an edge to the directed graph gd gd <- addNode("A", gd) checkEquals(nodes(gd), c("A", "B", "C")) # just one edge checkEquals(sum(am(gd)), 1) checkEquals(am(gd)["B", "C"], 1) checkTrue(isAdjacent(gd, "B", "C")) gd <- addEdge(from="C", to="A", graph=gd) checkTrue(isAdjacent(gd, "C", "A")) } # test_isAdjacent # incomplete draft test supplied by Robert Castello (November 2014) test_robertCastelos_addEdge_edgeData_bug <- function() { am <- adjacencyMatrix # for shorthand #Sys.setlocale("LC_ALL", "C") #checkEquals(Sys.getlocale(), "C") g <- graphBAM(data.frame(from="B", to="C", weight=1)) checkEquals(rownames(am(g)), c("B", "C")) checkEquals(colnames(am(g)), c("B", "C")) checkEquals(am(g)["B","C"], 1) edgeDataDefaults(g, "x") <- NA_real_ g <- addNode("A", g) checkEquals(rownames(am(g)), c("A", "B", "C")) checkEquals(colnames(am(g)), c("A", "B", "C")) g <- addEdge(from="C", to="A", graph=g) checkEquals(am(g)["C", "A"], 1) ## this one works fine edgeData(g, from="A", to="C", "x") <- 10 ## however, this one breaks the code: no longer! edgeData(g, from="C", to="A", "x") <- 10 # ensures that no error was found in the above operations checkTrue(TRUE) } # Sys.setlocale("LC_ALL", "C") # checkEquals(Sys.getlocale(), "C") # g <- graphBAM(data.frame(from="B", to="C", weight=1)) # edgeDataDefaults(g, "x") <- NA_real_ # g <- addNode("A", g) # g <- addEdge(from="C", to="A", graph=g) # # ## this one works fine # edgeData(g, from="A", to="C", "x") <- 10 # # ## however, this one breaks the code # edgeData(g, from="C", to="A", "x") <- 10 graph/inst/unitTests/graphNEL_test.R0000644000175400017540000003264113175713336020521 0ustar00biocbuildbiocbuild ##.setUp <- function() RNGkind("default", "default") simpleGraphNEL <- function() { V <- letters[1:4] edL <- vector("list", length=4) names(edL) <- V edL[["a"]] <- list(edges=c(3, 4), weights=c(.13, .14)) edL[["b"]] <- list(edges=c(3, 4), weights=c(.23, .24)) edL[["c"]] <- list(edges=c(1, 2, 4), weights=c(.13, .23, .34)) edL[["d"]] <- list(edges=c(1, 2, 3), weights=c(.14, .24, .34)) gR <- graphNEL(nodes=V, edgeL=edL) gR } simpleDirectedGraphNEL <- function() { set.seed(123) V <- letters[1:4] edL <- vector("list", length=4) names(edL) <- V edL[["a"]] <- list(edges=c(3, 4), weights=c(.13, .14)) edL[["b"]] <- list(edges=c(3), weights=.23) edL[["c"]] <- list(edges=numeric(0), weights=numeric(0)) edL[["d"]] <- list(edges=c(2, 3), weights=c(.42, .43)) gR <- graphNEL(nodes=V, edgeL=edL, edgemode="directed") gR } testConstructorFunction <- function() { nodes <- LETTERS[1:4] edgeL <- list(A=c("B", "C"), B="C", C="D") ## no-argument constructor target <- new("graphNEL") checkIdentical(target, graphNEL()) ## node / edgeList constructor target <- new("graphNEL", nodes=nodes, edgeL=edgeL, edgemode="directed") checkIdentical(target, graphNEL(nodes, edgeL, "directed")) ## edgemode default == "undirected" edgeL2 <- list(A = c("B", "C"), B = c("A", "C"), C = c("A", "B", "D"), D = "C") target <- new("graphNEL", nodes=nodes, edgeL=edgeL2) checkIdentical(target, graphNEL(nodes, edgeL2, "undirected")) } testCreateBadNodeNames <- function() { badNodeName <- paste("foo", graph:::EDGE_KEY_SEP, "bar", sep="") checkException(graphNEL(nodes=badNodeName), silent=TRUE) checkException(graphNEL(nodes=c(NA, "b")), silent=TRUE) checkException(graphNEL(nodes=c("a", "")), silent=TRUE) } testIsAdjacent <- function() { g1 <- simpleGraphNEL() checkEquals(FALSE, isAdjacent(g1, "a", "b")) checkEquals(TRUE, isAdjacent(g1, "a", "c")) expect <- c(FALSE, TRUE, TRUE) got <- isAdjacent(g1, c("a", "a", "a"), c("b", "c", "d")) checkEquals(expect, got) } testNumEdges <- function() { mat <- matrix(c(1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0), ncol=4) rownames(mat) <- letters[1:4] colnames(mat) <- letters[1:4] g <- as(mat, "graphNEL") checkEquals(4, numEdges(g)) } testInEdges <- function() { g <- simpleDirectedGraphNEL() expectedInEdges <- list(a=character(0), b="d", c=c("a", "b", "d"), d="a") checkEquals(expectedInEdges, inEdges(g)) checkEquals(expectedInEdges, inEdges(object=g)) n <- c("a", "d") checkEquals(expectedInEdges[n], inEdges(n, g)) ## verify unknown node behavior ans <- tryCatch(inEdges("not-a-node", g), error = function(e) e) checkEquals("not a node: 'not-a-node'", conditionMessage(ans)) } testEmptyGraph <- function() { g <- graphNEL() checkEquals(0, numEdges(g)) checkEquals(0, numNodes(g)) } testCreateGraphNoEdges <- function() { g <- graphNEL(nodes=c("a", "b")) checkEquals(0, numEdges(g)) checkEquals(2, numNodes(g)) g <- graphNEL(nodes=c("a", "b"), edgeL=list()) checkEquals(0, numEdges(g)) checkEquals(2, numNodes(g)) checkEquals(2, length(edges(g))) checkEquals(nodes(g), names(edges(g))) checkEquals(0, sum(sapply(edges(g), length))) } testConstructor <- function() { g <- simpleGraphNEL() g2 <- graphNEL(nodes=nodes(g), edgeL=edges(g)) checkEquals(nodes(g), nodes(g2)) checkEquals(edges(g), edges(g2)) ## We also support the more complicated list structure for describing graph ## edges. g2 <- graphNEL(nodes=nodes(g), edgeL=g@edgeL) checkEquals(nodes(g), nodes(g2)) checkEquals(edges(g), edges(g2)) } testNullHandlingInEdgeL <- function() { g <- simpleDirectedGraphNEL() eL <- g@edgeL eL <- c(eL[c("a", "b", "c")], list(d=NULL)) g2 <- graphNEL(nodes(g), eL, "directed") checkTrue(all(sapply(g2@edgeL, function(x) !is.null(x)))) } testCaptureWeightsWithEdgeLUndirected <- function() { g <- simpleGraphNEL() expect <- as.list(c(.13, .14)) names(expect) <- c("a|c", "a|d") checkEquals(expect, edgeData(g, from="a", attr="weight")) } testCaptureWeightsWithEdgeLDirected <- function() { g <- simpleDirectedGraphNEL() expect <- as.list(c(.13, .14)) names(expect) <- c("a|c", "a|d") checkEquals(expect, edgeData(g, from="a", attr="weight")) } testAddNode <- function() { g1 <- simpleGraphNEL() newNodes <- c("r", "s", "a", "b") checkException(addNode(newNodes, g1), silent=TRUE) newNodes <- c("r", "s") expect <- c(nodes(g1), newNodes) g1 <- addNode(newNodes, g1) checkEquals(expect, nodes(g1)) } testAddNodeWithEdges <- function() { g1 <- simpleGraphNEL() newNodes <- c("r", "s", "t") newEdges <- list(r=c("a", "s"), s="b", t=character(0)) g2 <- addNode(newNodes, g1, newEdges) checkEquals(c(nodes(g1), newNodes), nodes(g2)) expect <- list(r=c("a", "s")) checkEquals(expect, edges(g2)["r"]) expectEdges <- edges(g1) expectEdges[["a"]] <- c(expectEdges[["a"]], "r") expectEdges[["b"]] <- c(expectEdges[["b"]], "s") expectEdges[["r"]] <- c("a", "s") expectEdges[["s"]] <- c("r", "b") expectEdges[["t"]] <- character(0) checkEquals(expectEdges, edges(g2)) } testAddNodeWithEdgesAndWeights <- function() { g1 <- simpleGraphNEL() newNodes <- c("r", "s", "t") newEdges <- list(r=c(a=11, s=22), s=c(b=33), t=numeric(0)) g2 <- addNode(newNodes, g1, newEdges) checkEquals(c(nodes(g1), newNodes), nodes(g2)) expect <- list(r=c("a", "s")) checkEquals(expect, edges(g2)["r"]) expectEdges <- edges(g1) expectEdges[["a"]] <- c(expectEdges[["a"]], "r") expectEdges[["b"]] <- c(expectEdges[["b"]], "s") expectEdges[["r"]] <- c("a", "s") expectEdges[["s"]] <- c("r", "b") expectEdges[["t"]] <- character(0) checkEquals(expectEdges, edges(g2)) } testAddNodeBadNodeName <- function() { g1 <- simpleGraphNEL() badNodeName <- paste("foo", graph:::EDGE_KEY_SEP, "bar", sep="") checkException(addNode(badNodeName, g1), silent=TRUE) } testSubGraphNoEdges <- function() { g1 <- simpleGraphNEL() g1 <- removeEdge("a", c("c", "d"), g1) g2 <- subGraph("a", g1) ## g2 has no edges checkEquals(0, numEdges(g2)) checkEquals(1, numNodes(g2)) } testSubGraphNoEdgesDirected <- function() { g1 <- simpleDirectedGraphNEL() g1 <- removeEdge("a", c("c", "d"), g1) g2 <- subGraph("a", g1) ## g2 has no edges checkEquals(0, numEdges(g2)) checkEquals(1, numNodes(g2)) } testSubGraphAttributes <- function() { g1 <- simpleDirectedGraphNEL() nodeDataDefaults(g1) <- list(w=NA, n="") nodeData(g1, n=c("a", "b"), attr="w") <- c(1, 2) nodeData(g1, n=c("a", "b"), attr="n") <- c("A", "B") edgeDataDefaults(g1) <- list(x=NA) edgeData(g1, from="a", to="d", attr="x") <- 6 edgeData(g1, from="a", to="c", attr="x") <- 7 g2 <- subGraph(c("a", "d"), g1) checkEquals("a", names(g2@nodeData)) g3 <- subGraph(c("a", "b", "c"), g1) checkEquals(c("a|c", "b|c"), names(g3@edgeData)) } testRemoveEdgeUndirected <- function() { g <- simpleGraphNEL() g1 <- removeEdge("a", c("c", "d"), g) checkEquals(3, numEdges(g1)) eD <- edges(g1) checkEquals(character(0), eD$a) checkEquals(c("c", "d"), eD$b) g2 <- removeEdge(c("c", "d"), "a", g) checkEquals(3, numEdges(g2)) eD <- edges(g2) checkEquals(character(0), eD$a) checkEquals(c("c", "d"), eD$b) } testRemoveEdgeDirected <- function() { g1 <- simpleDirectedGraphNEL() f <- c("a", "a") t <- c("c", "d") g2 <- removeEdge(from=f, to=t, g1) checkEquals(3, numEdges(g2)) checkTrue(!length(edges(g2)[["a"]])) } testRemoveEdgeLarge <- function() { ## This test is from Denise Scholtens set.seed(678) N <- 500 numEdges <- 2500 nodes <- paste("n", 1:500, sep="") g <- randomEGraph(nodes, edges=numEdges) edgemode(g) <- "directed" checkEquals(numEdges*2, numEdges(g)) from <- c("n1","n2","n2","n3","n5","n7","n7","n8","n8","n8","n9","n9", "n9") to <- c("n255","n383","n261","n381","n234","n225","n315","n38","n296", "n78","n310","n19","n422") g1 <- removeEdge(from, to, g) checkEquals(numEdges*2 - length(from), numEdges(g1)) } testRemoveEdgeLarge2 <- function() { ## This test is from a bug discovered by Dan Bebber From <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 5, 5, 8, 8, 8, 8, 8, 11, 11, 12, 12, 12, 14, 14, 16, 16, 20, 20, 23, 23, 24, 24, 25, 25, 29, 29, 32, 32, 32, 32, 38, 38, 41, 41, 41, 43, 43, 54, 54, 59, 59, 60, 68, 68, 69, 72, 82, 83, 88, 88, 88, 88, 89, 89, 90, 90, 96, 97, 98, 98, 98) To <- c(2, 5, 8, 11, 12, 14, 16, 20, 23, 37, 38, 54, 57, 68, 72, 81, 86, 87, 97, 88, 100, 32, 102, 38, 41, 49, 51, 53, 58, 59, 60, 63, 67, 71, 72, 75, 76, 84, 85, 24, 29, 25, 28, 26, 27, 30, 31, 33, 34, 35, 36, 40, 41, 42, 43, 47, 44, 45, 55, 56, 60, 62, 61, 70, 71, 71, 73, 84, 84, 89, 90, 93, 94, 97, 141, 95, 141, 141, 98, 99, 141, 158) FT <- matrix(c(From, To), ncol=2) #create a 'from-to' matrix g <- ftM2graphNEL(FT, edgemode="undirected") gr <- removeEdge(from=as.character(From[1:2]), to=as.character(To[1:2]), g) checkEquals(numEdges(g) - 2, numEdges(gr)) gr <- removeEdge(from=as.character(From[1:20]), to=as.character(To[1:20]), g) checkEquals(numEdges(g) - 20, numEdges(gr)) } test_eWV <- function() { V <- LETTERS[1:4] gR <- graphNEL(nodes=V) gX <- addEdge("A", "C", gR, 0.2) ans <- eWV(gX, edgeMatrix(gX), useNNames = TRUE) checkEquals(c("A--C"=0.2), ans) } testEdgeWeightsNoEdges <- function() { g <- graphNEL(nodes=letters[1:6]) expect <- lapply(edges(g), as.numeric) checkEquals(expect, edgeWeights(g)) } testRemoveNode1 <- function() { ## using the example from the removeNode help page V <- LETTERS[1:4] edL2 <- vector("list", length=4) names(edL2) <- V for(i in 1:4) edL2[[i]] <- list(edges=c(2,1,2,1)[i], weights=sqrt(i)) gR2 <- graphNEL(nodes=V, edgeL=edL2, edgemode="directed") gX <- removeNode("C", gR2) checkEquals(c("A", "B", "D"), nodes(gX)) gY <- removeNode(c("A","D"), gX) checkEquals("B", nodes(gY)) gZ <- removeNode(c("A","C","D"), gR2) checkEquals("B", nodes(gZ)) ## XXX: using direct slot access to verify that edge attributes ## have been completely removed. checkTrue(length(gZ@edgeData@data) == 0) } testRemoveNode2 <- function() { g <- simpleDirectedGraphNEL() nds <- nodes(g) for (n in nds) { g2 <- removeNode(n, g) checkEquals(nds[nds != n], nodes(g2)) } } test_ugraph <- function() { g <- simpleDirectedGraphNEL() ug <- ugraph(g) eg <- simpleGraphNEL() checkTrue(isDirected(g)) checkTrue(!isDirected(ug)) checkEquals(nodes(g), nodes(ug)) checkEquals(nodes(eg), nodes(ug)) ## verify edges eGot <- edges(ug)[nodes(g)] eExp <- edges(eg)[nodes(g)] for (n in nodes(g)) { checkTrue(setequal(eExp[[n]], eGot[[n]])) } } test_rename_nodes_edgeWeights <- function() { g <- simpleGraphNEL() ew <- edgeWeights(g) ew <- lapply(ew, function(x) { names(x) <- toupper(names(x)) x }) names(ew) <- toupper(names(ew)) nodes(g) <- LETTERS[1:4] checkEquals(LETTERS[1:4], nodes(g)) checkEquals(ew, edgeWeights(g)) } test_rename_nodes_nodeData <- function() { g <- simpleGraphNEL() nodeDataDefaults(g) <- list(type=NA) nodeData(g, n="a", attr="type") <- "the first one" nodeData(g, n="d", attr="type") <- "the last one" ndDef <- nodeDataDefaults(g) nd <- nodeData(g, attr="type") names(nd) <- toupper(names(nd)) nodes(g) <- toupper(nodes(g)) checkEquals(nd, nodeData(g, attr="type")) } test_subgraph_attrs <- function() { x <- graphNEL(nodes=c("a", "b"), edgeL=list(a="b", b="b"), edgemode="directed") defs <- list(tag="NONE") nodeDataDefaults(x) <- defs edgeDataDefaults(x) <- defs nodeData(x, n="a", attr="tag") <- "zoo" edgeData(x, "a", "b", attr="tag") <- "yes" gg <- subGraph(c("a", "b"), x) checkEquals(defs, nodeDataDefaults(gg)) checkEquals(defs, edgeDataDefaults(gg)) checkEquals("zoo", nodeData(gg, "a", attr="tag")[[1]]) checkEquals("yes", edgeData(gg, "a", "b", attr="tag")[[1]]) } test_ftM2_with_self_edges <- function() { ft <- cbind(c(1:5,1,5),c(1:5,3,2)) W <- c(1:5,7,9) ## this failed till 2008-06-26: gr <- ftM2graphNEL(ft, W, edgemode="undirected") m <- as(gr, "matrix") g2 <- as(m, "graphNEL") m2 <- as(g2, "matrix") checkEquals(m2, m) checkEquals(which(m2 != 0), c(1,3,7,10,11,13,19,22,25)) } test_coerce_matrix_round_trip <- function() { V <- LETTERS[1:4] g <- graphNEL(nodes=V, edgemode="directed") g <- addEdge(V[1+0],V[1+1],g, 3) g <- addEdge(V[1+0],V[2+1],g, 1.5) g <- addEdge(V[1+0],V[3+1],g, 1.8) g <- addEdge(V[1+1],V[2+1],g, 4.3) g <- addEdge(V[1+2],V[3+1],g, 2.2) mat0 <- matrix(c(0, 0, 0, 0, 3, 0, 0, 0, 1.5, 4.3, 0, 0, 1.8, 0, 2.2, 0), ncol=4, dimnames = list(LETTERS[1:4], LETTERS[1:4])) checkEquals(mat0, as(g, "matrix")) checkEquals(mat0, as(as(mat0, "graphNEL"), "matrix")) } graph/inst/unitTests/gxl_test.R0000644000175400017540000000350413175713336017647 0ustar00biocbuildbiocbuildsimpleWithAttributes <- system.file("GXL/attributesExample.gxl", package="graph") if (nchar(simpleWithAttributes) == 0) stop("bad gxl path") testGxlNodes <- function() { con <- file(simpleWithAttributes) tryCatch({ g <- fromGXL(con) eNodes <- c("p", "q", "v", "w") checkEquals(eNodes, nodes(g)) }, finally=close(con)) } testGxlEdges <- function() { con <- file(simpleWithAttributes) tryCatch({ g <- fromGXL(con) eEdges <- list(p=c("v", "q"), q="w", v=character(0), w=character(0)) checkEquals(eEdges, edges(g)) }, finally=close(con)) } testGxlNodeAttrs <- function() { con <- file(simpleWithAttributes) tryCatch({ g <- fromGXL(con) checkEquals(316, nodeData(g, "w", "line")[[1]]) checkEquals(225, nodeData(g, "v", "line")[[1]]) checkEquals("main.c", nodeData(g, "p", "file")[[1]]) checkEquals(555, nodeData(g, "p", "code")[[1]]) checkEquals(1.234, nodeData(g, "p", "rate")[[1]]) checkEquals(TRUE, nodeData(g, "p", "pass")[[1]]) checkEquals(FALSE, nodeData(g, "p", "fail")[[1]]) checkTrue(is.na(nodeData(g, "p", "line")[[1]])) }, finally=close(con)) } testNodeEdgeOrderDoesNotMatter <- function() { gxlFile <- system.file("GXL/outOfOrderExample.gxl", package="graph") con <- file(gxlFile) tryCatch({ g <- fromGXL(con) checkEquals(c("p", "v", "q", "w"), nodes(g)) }, finally=close(con)) } testUndirectedReading <- function() { gxlFileGz <- system.file("GXL/graphExample-02.gxl.gz", package="graph") con <- gzfile(gxlFileGz, open="rb") tryCatch({ g <- fromGXL(con) checkEquals(10, numEdges(g)) checkEquals(9, numNodes(g)) }, finally=close(con)) } graph/inst/unitTests/leaves_test.R0000644000175400017540000000122413175713336020331 0ustar00biocbuildbiocbuildlibrary("graph") data(apopGraph) data(graphExamples) test_leaves_undirected <- function() { want <- "c" checkEquals(want, leaves(graphExamples[[1]])) } test_leaves_directed_in <- function() { want <- c("trkA", "CASP2", "CASP6", "DNA fragmentation", "Nucleus", "CASP9", "TRF3", "CASP10") checkTrue(setequal(want, leaves(apopGraph, degree.dir="out"))) } test_leaves_directed_in <- function() { want <- c("TNFa", "TNFb", "FasL", "CD40L", "FAP-1", "NGF", "Daxx", "Bax", "CASP4", "Glucocorticoid", "Mtd", "Bad", "CASP11", "Bcl-w") checkTrue(setequal(want, leaves(apopGraph, degree.dir="in"))) } graph/inst/unitTests/nodeAndEdgeData_test.R0000644000175400017540000002267213175713336022013 0ustar00biocbuildbiocbuild# # Test setup # simpleInciMat <- function() { ## Here's a simple graph for testing ## a b ## |\ /| ## | \___c___/ | ## | | | ## \ | / ## \____d____/ ## ## mat <- matrix(c(0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0), byrow=TRUE, ncol=4) rownames(mat) <- letters[1:4] colnames(mat) <- letters[1:4] mat } simpleDirectedGraph <- function() { ## Here's a simple graph for testing ## a b ## |\ /^ ## | \__>c<__/ | ## | ^ | ## \ | / ## \___>d____/ ## ## mat <- matrix(c(0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0), byrow=TRUE, ncol=4) rownames(mat) <- letters[1:4] colnames(mat) <- letters[1:4] mat graphAM(adjMat=mat, edgemode="directed") } testNodeDataDefaults <- function() { mat <- simpleInciMat() g1 <- graphAM(adjMat=mat) ## If no attributes have been defined, empty list. checkEquals(list(), nodeDataDefaults(g1)) ## Can assign a named list myEdgeAttributes <- list(foo=1, bar="blue") nodeDataDefaults(g1) <- myEdgeAttributes checkEquals(myEdgeAttributes, nodeDataDefaults(g1)) checkEquals(myEdgeAttributes$foo, nodeDataDefaults(g1, attr="foo")) nodeDataDefaults(g1, attr="size") <- 400 checkEquals(400, nodeDataDefaults(g1, attr="size")) checkException(nodeDataDefaults(g1, attr="NOSUCHATTRIBUTE"), silent=TRUE) checkException(nodeDataDefaults(g1) <- list(1, 3, 4), silent=TRUE) ## must have names } testEdgeDataDefaults <- function() { mat <- simpleInciMat() g1 <- graphAM(adjMat=mat) ## If no attributes have been defined, empty list. checkEquals(list(), edgeDataDefaults(g1)) ## Can assign a named list myEdgeAttributes <- list(foo=1, bar="blue") edgeDataDefaults(g1) <- myEdgeAttributes checkEquals(myEdgeAttributes, edgeDataDefaults(g1)) checkEquals(myEdgeAttributes$foo, edgeDataDefaults(g1, attr="foo")) edgeDataDefaults(g1, attr="size") <- 400 checkEquals(400, edgeDataDefaults(g1, attr="size")) checkException(edgeDataDefaults(g1, attr="NOSUCHATTRIBUTE"), silent=TRUE) checkException(edgeDataDefaults(g1) <- list(1, 3, 4), silent=TRUE) ## must have names } testNodeDataGetting <- function() { mat <- simpleInciMat() g1 <- graphAM(adjMat=mat) myAttributes <- list(size=1, dim=c(3, 3), name="fred") nodeDataDefaults(g1) <- myAttributes checkEquals("fred", nodeData(g1, "a", attr="name")[[1]]) someNodes <- c("a", "b") expect <- as.list(c(1, 1)) names(expect) <- someNodes checkEquals(expect, nodeData(g1, n=someNodes, attr="size")) expect <- as.list(rep("fred", length(nodes(g1)))) names(expect) <- nodes(g1) checkEquals(expect, nodeData(g1, attr="name")) checkEquals(myAttributes, nodeData(g1, n="a")[[1]]) everything <- nodeData(g1) for (alist in everything) checkEquals(myAttributes, alist) } testNodeDataSetting <- function() { mat <- simpleInciMat() g1 <- graphAM(adjMat=mat) myAttributes <- list(size=1, dim=c(3, 3), name="fred") nodeDataDefaults(g1) <- myAttributes ## unknown node is error checkException(nodeData(g1, n="UNKNOWN_NODE", attr="size") <- 5, silent=TRUE) ## unknown attr is error checkException(nodeData(g1, n="a", attr="UNKNOWN") <- 5, silent=TRUE) nodeData(g1, n="a", attr="size") <- 5 checkEquals(5, nodeData(g1, n="a", attr="size")[[1]]) nodeData(g1, n=c("a", "b", "c"), attr="size") <- 50 expect <- myAttributes expect[["size"]] <- 50 checkEquals(list(a=expect, b=expect, c=expect), nodeData(g1, n=c("a", "b", "c"))) nodeData(g1, n=c("a", "b", "c"), attr="size") <- c(1, 2, 3) checkEquals(c(1, 2, 3), as.numeric(nodeData(g1, n=c("a", "b", "c"), attr="size"))) nodeData(g1, attr="name") <- "unknown" expect <- as.list(rep("unknown", length(nodes(g1)))) names(expect) <- nodes(g1) checkEquals(expect, nodeData(g1, attr="name")) } testEdgeDataGetting <- function() { mat <- simpleInciMat() g1 <- graphAM(adjMat=mat) myAttributes <- list(size=1, dim=c(3, 3), name="fred") edgeDataDefaults(g1) <- myAttributes checkEquals("fred", edgeData(g1, from="a", to="d", attr="name")[[1]]) fr <- c("a", "b") to <- c("c", "c") expect <- as.list(c(1, 1)) names(expect) <- c("a|c", "b|c") checkEquals(expect, edgeData(g1, fr, to, attr="size")) expect <- rep("fred", sum(sapply(edges(g1), length))) checkEquals(expect, as.character(edgeData(g1, attr="name"))) checkEquals(myAttributes, edgeData(g1, from="a", to="c")[[1]]) everything <- edgeData(g1) for (alist in everything) checkEquals(myAttributes, alist) got <- edgeData(g1, from="d", attr="size") checkEquals(3, length(got)) checkEquals(rep(1, 3), as.numeric(got)) got <- edgeData(g1, to="d", attr="size") checkEquals(3, length(got)) checkEquals(rep(1, 3), as.numeric(got)) expect <- c("a|c", "a|d", "d|a", "d|b", "d|c") checkEquals(expect, names(edgeData(g1, from=c("a", "d"), attr="name"))) } testEdgeDataToOnlyUndir <- function() { mat <- simpleInciMat() mat[1, 3] <- mat[3, 1] <- 100 mat[1, 4] <- mat[4, 1] <- 200 g1 <- graphAM(adjMat=mat, values=list(weight=1)) got <- edgeData(g1, to=c("a", "b"), attr="weight") expect <- c("c|a", "d|a", "c|b", "d|b") checkEquals(expect, names(got)) } testEdgeDataToOnlyDir <- function() { g1 <- simpleDirectedGraph() edgeDataDefaults(g1, attr="weight") <- 1 edgeData(g1, from=c("a", "b"), to=c("c", "c"), attr="weight") <- c(10, 20) got <- edgeData(g1, to=c("a", "b"), attr="weight") expect <- c("d|b") checkEquals(expect, names(got)) } testEdgeDataSettingDirected <- function() { g1 <- simpleDirectedGraph() myAttributes <- list(size=1, dim=c(3, 3), name="fred") edgeDataDefaults(g1) <- myAttributes edgeData(g1, from="a", to="d", attr="name") <- "Joe" expect <- myAttributes expect[["name"]] <- "Joe" checkEquals(expect, edgeData(g1, from="a", to="d")[[1]]) fr <- c("a", "b") to <- c("c", "c") expect <- as.list(c(5, 5)) names(expect) <- c("a|c", "b|c") edgeData(g1, fr, to, attr="size") <- 5 checkEquals(expect, edgeData(g1, fr, to, attr="size")) expect <- as.list(c(10, 20)) names(expect) <- c("a|c", "b|c") edgeData(g1, fr, to, attr="size") <- c(10, 20) checkEquals(expect, edgeData(g1, fr, to, attr="size")) edgeData(g1, from="a", attr="size") <- 555 checkEquals(rep(555, 2), as.numeric(edgeData(g1, from="a", attr="size"))) edgeData(g1, to="b", attr="size") <- 111 checkEquals(111, as.numeric(edgeData(g1, to="b", attr="size"))) } testEdgeDataSettingUndirected <- function() { mat <- simpleInciMat() g1 <- graphAM(adjMat=mat) myAttributes <- list(size=1, dim=c(3, 3), name="fred") edgeDataDefaults(g1) <- myAttributes edgeData(g1, from="a", to="d", attr="name") <- "Joe" expect <- myAttributes expect[["name"]] <- "Joe" checkEquals(expect, edgeData(g1, from="a", to="d")[[1]]) ## verify reciprocal edge data was set checkEquals("Joe", edgeData(g1, from="d", to="a", attr="name")[[1]]) fr <- c("a", "b") to <- c("c", "c") expect <- as.list(c(5, 5)) names(expect) <- c("a|c", "b|c") edgeData(g1, fr, to, attr="size") <- 5 checkEquals(expect, edgeData(g1, fr, to, attr="size")) names(expect) <- c("c|a", "c|b") checkEquals(expect, edgeData(g1, to, fr, attr="size")) expect <- as.list(c(10, 20)) names(expect) <- c("a|c", "b|c") edgeData(g1, fr, to, attr="size") <- c(10, 20) checkEquals(expect, edgeData(g1, fr, to, attr="size")) names(expect) <- c("c|a", "c|b") checkEquals(expect, edgeData(g1, to, fr, attr="size")) edgeData(g1, from="a", attr="size") <- 555 checkEquals(rep(555, 2), as.numeric(edgeData(g1, from="a", attr="size"))) checkEquals(555, edgeData(g1, from="c", to="a", attr="size")[[1]]) edgeData(g1, to="b", attr="size") <- 111 checkEquals(rep(111, 2), as.numeric(edgeData(g1, to="b", attr="size"))) checkEquals(111, edgeData(g1, from="c", to="b", attr="size")[[1]]) } testEdgeDataSettingFromOnly <- function() { mat <- simpleInciMat() g1 <- graphAM(adjMat=mat) myAttributes <- list(size=1, dim=c(3, 3), name="fred") edgeDataDefaults(g1) <- myAttributes expect <- rep("fred", 5) got <- unlist(edgeData(g1, from=c("a", "d"), attr="name"), use.names=FALSE) checkEquals(expect, got, "precondition check") edgeData(g1, from=c("a", "d"), attr="name") <- "Sam" expect <- rep("Sam", 5) got <- unlist(edgeData(g1, from=c("a", "d"), attr="name"), use.names=FALSE) checkEquals(expect, got, "use from only in assign") } testNormalizeEdges <- function() { checkException(graph:::.normalizeEdges(c("b", "d"), c("a", "b", "c")), silent=TRUE) checkException(graph:::.normalizeEdges(c("a", "b", "c"), c("a", "e")), silent=TRUE) f <- letters[1:10] t <- letters[11:20] checkEquals(list(from=f, to=t), graph:::.normalizeEdges(f, t)) checkEquals(list(from=c("a", "a", "a"), to=c("a", "b", "c")), graph:::.normalizeEdges("a", c("a", "b", "c"))) checkEquals(list(from=c("a", "b", "c"), to=c("d", "d", "d")), graph:::.normalizeEdges(c("a", "b", "c"), "d")) } graph/inst/unitTests/setbit_test.R0000644000175400017540000000636513175713336020357 0ustar00biocbuildbiocbuild.testbit <- graph:::testbit setbitv <- graph:::setbitv setbit <- graph:::setbit bitToMat <- graph:::bitToMat makebits <- graph:::makebits test_setbitv <- function() { len <- 5L * 8L xx <- makebits(len) for (i in seq_len(len)) { checkEquals(FALSE, .testbit(xx, i)) xx <- setbitv(xx, i, FALSE) checkEquals(FALSE, .testbit(xx, i)) } xx <- makebits(len) for (i in seq_len(len)) { checkEquals(FALSE, .testbit(xx, i)) xx <- setbitv(xx, i, TRUE) checkEquals(TRUE, .testbit(xx, i), msg=paste("iter", i)) } for (i in seq_len(len)) checkEquals(TRUE, .testbit(xx, i)) for (i in seq_len(len)) xx <- setbitv(xx, i, FALSE) for (i in seq_len(len)) checkEquals(FALSE, .testbit(xx, i)) } test_setbitv_vectorized <- function() { len <- 3L * 8L xx <- makebits(len) xxall <- setbitv(xx, 1:10, rep(TRUE, 10)) checkTrue(all(.testbit(xxall, 1:10))) checkTrue(!any(.testbit(xxall, 11:len))) } test_setbit_basics <- function() { xx <- makebits(40L) tf <- function(n) rawToBits(setbit(xx, n)[1]) got <- as.logical(do.call(rbind, lapply(1:8, tf))) dim(got) <- c(8, 8) want <- matrix(FALSE, nrow=8, ncol=8) diag(want) <- TRUE checkEquals(want, got) tf <- function(n) rawToBits(setbit(xx, n)[2]) got <- as.logical(do.call(rbind, lapply(9:16, tf))) dim(got) <- c(8, 8) want <- matrix(FALSE, nrow=8, ncol=8) diag(want) <- TRUE checkEquals(want, got) x2 <- setbit(xx, 38) for (i in 1:4) checkTrue(!as.logical(x2[i])) checkTrue(as.logical(x2[5])) } test_testbit <- function() { xx <- makebits(40) for (i in 1:(5 * 8)) { checkTrue(!.testbit(xx, i)) } checkTrue(!any(.testbit(xx, 1:40))) xx <- as.raw(rep(255L, 5)) for (i in 1:(5 * 8)) { checkTrue(.testbit(xx, i), i) } checkTrue(all(.testbit(xx, 1:40))) xx <- setbit(as.raw(5), 23) checkTrue(.testbit(xx, 23)) checkEquals(c(TRUE, TRUE), .testbit(xx, c(23, 23))) checkEquals(c(FALSE, TRUE), .testbit(xx, c(21, 23))) checkEquals(c(TRUE, FALSE), .testbit(xx, c(23, 24))) } rand_bitarray_matrix <- function(nrow, nset) { bv <- makebits(nrow^2, bitdim=c(nrow, nrow)) idx <- sample(1:(nrow^2), nset) setbitv(bv, idx, rep(1L, length(idx))) } test_bitToMat <- function() { make_mat <- function(nrow) { matrix(sample(c(0L, 1L), nrow^2, replace = TRUE), nrow = nrow) } do_test <- function(nrow) { m <- make_mat(nrow) bv <- makebits(nrow^2, bitdim=c(nrow, nrow)) bv <- setbitv(bv, which(m == 1L), rep(1L, sum(m))) checkEquals(m, bitToMat(bv)) } sizes <- c(1, 2, 5, 13, 26) reps <- c(2, 3, 25, 25, 25) for (i in seq_along(sizes)) { size <- sizes[i] for (j in seq_len(reps[i])) do_test(size) } } test_bitarray_transpose <- function() { nreps <- 25L sizes <- as.integer(c(1, 2, 4, 5, 6, 7, 23, 24)) for (size in sizes) { for (i in seq_len(nreps)) { v0 <- rand_bitarray_matrix(size, ceiling((size^2) %/% 2)) m0 <- bitToMat(v0) want <- t(m0) vt <- .Call(graph:::graph_bitarray_transpose, v0) mt <- bitToMat(vt) checkEquals(want, mt) } } } graph/inst/unitTests/simple_sparse_test.R0000644000175400017540000000141513175713336021722 0ustar00biocbuildbiocbuild.indexToCoord <- graph:::.indexToCoord .coordToIndex <- graph:::.coordToIndex set.seed(0x389d) check_coord_txfm <- function(n) { n <- as.integer(n) seqn <- seq_len(n) seqnn <- seq_len(n * n) coord <- cbind(rep(seqn, n), rep(seqn, each = n)) index <- .coordToIndex(coord[ , 1L], coord[, 2L], n) checkEquals(seqnn, index) got_coord <- .indexToCoord(seqnn, n) checkEquals(coord, got_coord) ## now check order preservation p1 <- sample(seqnn) p1coord <- coord[p1, ] if (n == 1L) { dim(p1coord) <- c(1L, 2L) } checkEquals(p1, .coordToIndex(p1coord[,1L], p1coord[,2L], n)) checkEquals(p1coord, .indexToCoord(p1, n)) } test_coordinate_txfm <- function() { for (i in 1:25) { check_coord_txfm(i) } } graph/man/0000755000175400017540000000000013175713336013465 5ustar00biocbuildbiocbuildgraph/man/DFS.Rd0000644000175400017540000000313313175713336014370 0ustar00biocbuildbiocbuild\name{DFS} \alias{DFS} \alias{DFS,graph,character-method} \title{Depth First Search } \description{ This function implements algorithm 4.2.1 of Gross and Yellen. The input is a \code{graph} and a \code{node} to start from. It returns a standard vertex labeling of \code{graph}. This is a vector with elements corresponding to the nodes of \code{graph} and with values that correspond to point in the depth first search the node is visited. } \usage{ DFS(object, node, checkConn=TRUE) } \arguments{ \item{object}{An instance of the \code{graph} class. } \item{node}{A \code{character} indicating the starting node. } \item{checkConn}{A \code{logical} indicating whether the connectivity of the graph should be checked. } } \details{ This function implements algorithm 4.2.1 of Gross and Yellen. Specific details are given there. It requires that the graph be connected. By default, this is checked, but since the checking can be expensive it is optional. A faster and mostly likely better implementation of depth first searching is given by \code{\link[RBGL:bfs]{dfs}} in the \pkg{RBGL} package. } \value{ A vector with names given by the nodes of \code{graph} whose values are \code{0} to one less than the number of nodes. These indices indicate the point at which the node will be visited. } \references{\emph{Graph Theory and its Applications}, J. Gross and J. Yellen. } \author{R. Gentleman } \seealso{\code{\link{boundary}}} \examples{ RNGkind("Mersenne-Twister") set.seed(123) g1 <- randomGraph(letters[1:10], 1:4, p=.3) RNGkind() DFS(g1, "a") } \keyword{manip} graph/man/IMCA.Rd0000644000175400017540000000404513175713336014470 0ustar00biocbuildbiocbuild\name{integrinMediatedCellAdhesion} \alias{IMCA} \alias{IMCAAttrs} \alias{IMCAGraph} \alias{integrinMediatedCellAdhesion} \docType{data} \title{KEGG Integrin Mediated Cell Adhesion graph} \description{ A graph representing the integrin-mediated cell adhesion pathway from KEGG, as well as a list of attributes for use in plotting the graph with \code{Rgraphviz}. } \usage{ data(integrinMediatedCellAdhesion) } \details{ The \code{integrinMediatedCellAdhesion} data set contains two objects: The first is \code{IMCAGraph}, which is an object of class \code{graph-NEL} and represents the hsa04510 graph from \code{KEGG}. The second is \code{IMCAAttrs}, which is a list of four elements. The first element, \code{defAttrs} corresponds to the \code{attrs} arguments of \code{\link[Rgraphviz]{agopen}} and \code{\link[Rgraphviz:plot-methods]{plot.graph}}. The second element is \code{nodeAttrs} which corresponds to the \code{nodeAttrs} argument in the same two functions from \code{Rgraphviz}. The third element, \code{subGList} corresponds to the \code{subGList} argument in those functions. Lastly, the fourth element, \code{LocusLink} provides a named list where the names are the nodes and the values are vectors of LocusLink ID values which correspond to those nodes. The values from \code{defAttrs}, \code{nodeAttrs} and \code{subGList} in the \code{IMCAAttrs} list are part of an ongoing attempt by Bioconductor to provide the set of options to most accurately recreate the actual visual image of the pathway from the KEGG site using \code{Rgraphviz}. Users may try out their own combination of attributes and settings for their own needs, but these represent our own efforts at as closely recreating the image as possible. } \source{ \url{http://www.genome.ad.jp/kegg/pathway/hsa/hsa04510.html} } \examples{ data(integrinMediatedCellAdhesion) if (require("Rgraphviz") & interactive()) plot(IMCAGraph, attrs=IMCAAttrs$defAttrs, nodeAttrs=IMCAAttrs$nodeAttrs, subGList=IMCAAttrs$subGList) } \keyword{datasets} graph/man/MAPKsig.Rd0000644000175400017540000000151213175713336015206 0ustar00biocbuildbiocbuild\name{MAPKsig} \alias{MAPKsig} \non_function{} \title{ A graph encoding parts of the MAPK signaling pathway } \description{ A graph encoding parts of the MAPK signaling pathway } \usage{data(MAPKsig)} \format{ The format is: Formal class 'graphNEL' [package "graph"] with edgemode "directed". } \source{ The KEGG pancreatic cancer pathway was visually inspected on 17 Sept 2007, and the subgraph associated with MAPK signaling was isolated. The HUGO names for each symbol in the KEGG visualization were obtained and checked for existance on hgu95av2. Some abbreviated terms for processes are also included as nodes. } %\references{ % %} \examples{ data(MAPKsig) if (require(Rgraphviz)) { nat = rep(FALSE, length(nodes(MAPKsig))) names(nat) = nodes(MAPKsig) plot(MAPKsig, nodeAttrs=list(fixedsize=nat)) } } \keyword{models} graph/man/MultiGraph-class.Rd0000644000175400017540000002630713175713336017143 0ustar00biocbuildbiocbuild\name{MultiGraph-class} \Rdversion{1.1} \docType{class} \alias{MultiGraph-class} \alias{nodes,MultiGraph-method} \alias{numEdges,MultiGraph-method} \alias{numEdges,MGEdgeSet-method} \alias{numNodes,MultiGraph-method} \alias{show,MultiGraph-method} \alias{MultiGraph} \alias{eweights} \alias{edgeSetIntersect0} \alias{edgeSetUnion0} \alias{subsetEdgeSets} \alias{extractFromTo} \alias{extractFromTo,MultiGraph-method} \alias{extractGraphAM} \alias{extractGraphBAM} \alias{isDirected,MultiGraph-method} \alias{ugraph,MultiGraph-method} % these are not supposed to be publicly available % but aliased here to quiet R CMD check \alias{isDirected,DiEdgeSet-method} \alias{isDirected,UEdgeSet-method} \alias{ugraph,DiEdgeSet-method} \alias{ugraph,UEdgeSet-method} \alias{graphIntersect,MultiGraph,MultiGraph-method} \alias{graphUnion,MultiGraph,MultiGraph-method} \alias{nodeData,MultiGraph,character,character-method} \alias{nodeData,MultiGraph,character,missing-method} \alias{nodeData,MultiGraph,missing,character-method} \alias{nodeData,MultiGraph,missing,missing-method} \alias{nodeData<-,MultiGraph,character,character-method} \alias{nodeData<-,MultiGraph,missing,character-method} \alias{mgEdgeDataDefaults} \alias{mgEdgeDataDefaults<-} \alias{mgEdgeDataDefaults,MultiGraph,character,character-method} \alias{mgEdgeDataDefaults,MultiGraph,character,missing-method} \alias{mgEdgeDataDefaults<-,MultiGraph,character,character,ANY-method} \alias{mgEdgeDataDefaults<-,MultiGraph,character,missing,list-method} \alias{nodeDataDefaults,MultiGraph,character-method} \alias{nodeDataDefaults,MultiGraph,missing-method} \alias{nodeDataDefaults<-,MultiGraph,character,ANY-method} \alias{nodeDataDefaults<-,MultiGraph,missing,list-method} \alias{mgEdgeData} \alias{mgEdgeData<-} \alias{mgEdgeData,MultiGraph,character,character,character,character-method} \alias{mgEdgeData,MultiGraph,character,character,missing,character-method} \alias{mgEdgeData,MultiGraph,character,missing,character,character-method} \alias{mgEdgeData,MultiGraph,character,missing,missing,character-method} \alias{mgEdgeData<-,MultiGraph,character,character,character,character-method} \alias{mgEdgeData<-,MultiGraph,character,character,missing,character-method} \alias{mgEdgeData<-,MultiGraph,character,missing,character,character-method} \alias{mgEdgeData<-,MultiGraph,character,missing,missing,character-method} \alias{edges,MultiGraph,character-method} \alias{edgeNames,MultiGraph-method} \alias{edges,MultiGraph,missing-method} \alias{edgeSets} \alias{edgeSets,MultiGraph-method} \title{EXPERIMENTAL class "MultiGraph"} \description{ The MultiGraph class represents a single node set and a set of edge sets. Each edge set is either directed or undirected. We can think of an edge in a MultiGraph as a 4-tuple (from-node, to-node, edge-type, weight), where the edge-type field in the tuple identifies the edge set, the weight is a numeric value, and the order of the nodes only matters in the case of a directed edge set. Unlike some of the graph representations, self-loops are allowed (from-node == to-node). There is support for arbitrary edge attributes which is primarily useful for rendering plots of MultiGraphs. These attributes are stored separately from the edge weights to facilitate efficient edge weight computation. } \usage{ MultiGraph(edgeSets, nodes = NULL, directed = TRUE, ignore_dup_edges = FALSE) eweights(object, names.sep = NULL) edgeSetIntersect0(g, edgeFun = NULL) edgeSetIntersect0(g, edgeFun = NULL) extractGraphAM(g, edgeSets) extractGraphBAM(g, edgeSets) } \arguments{ \item{edgeSets}{ A named list of \code{data.frame} objects each representing an edge set of the multigraph. Each \code{data.frame} must have three columns: "from", "to", and "weight". Columns "from" and "to" can be either factors or character vectors. The "weight" column must be numeric. } \item{nodes}{ A character vector of node labels. Nodes with zero degree can be included in a graph by specifying the node labels in \code{nodes}. The node set of the resulting multigraph is the union of the node labels found in \code{edgeSets} and \code{nodes}. } \item{directed}{ A logical vector indicating whether the edge sets specified in \code{edgeSets} represent directed edges. If this argument has length one, the value applies to all edge sets in \code{edgeSets}. Otherwise, this argument must have the same length as \code{edgeSets}, values are aligned by position. } \item{object}{ A \code{MultiGraph} instance } \item{g}{ A \code{MultiGraph} instance } \item{names.sep}{ The string to use as a separator between from and to node labels. If \code{NULL} no names will be attached to the returned vector. } \item{ignore_dup_edges}{ If \code{FALSE} (default), specifying duplicate edges in the input is an error. When set to \code{TRUE} duplicate edges are ignored. Edge weight values are ignored when determining duplicates. This is most useful for graph import and conversion. } \item{edgeFun}{ A user specified named list of functions to resolve edge attributes in a union or intersection operation } } \section{Constructors}{ \code{MultiGraph} } \section{Methods}{ \describe{ \item{nodes}{Return the nodes of the multigraph.} \item{numEdges}{Return an integer vector named by edge set containing edge counts for each edge set.} \item{numNodes}{Return the number of nodes in the multigraph.} \item{eweights}{Return a list named by edge set; each element is a numeric vector of edge weights for the corresponding edge set.} \item{isDirected}{Return a logical vector named by the edge sets in \code{object} with a \code{TRUE} indicating a directed edge set and \code{FALSE} for undirected.} \item{edges}{Returns a list named by edge set; for the edges in the MultiGraph} \item{edgeNames}{Returns a list named by the edge set; for the names of the edges in the MultiGraph} \item{extractFromTo}{Return a list named by the edge sets; each element is a data frame with column names from, to and weight corresponding to the connected nodes in the edge set.} \item{subsetEdgeSets}{Return a new \code{MultiGraph} object representing the subset of edge sets from the original \code{MultiGraph}.} \item{extractGraphAM}{Return a named \code{list} of \code{graphAM} objects corresponding to the edge sets from the original \code{MultiGraph}.} \item{extractGraphBAM}{Return a named \code{list} of \code{graphBAM} objects corresponding to the edge sets from the original \code{MultiGraph}.} \item{ugraph}{Return a new \code{MultiGraph} object in which all edge sets have been converted to undirected edge sets. This operation sets all edge weights to one and drops other edge attributes.} \item{edgeSetIntersect0}{Return a new \code{MultiGraph} object representing the intersection of edges across all edge sets within \code{g}. The return value will have a single edge set if the edge sets in \code{g} are disjoint. Otherwise, there will be a single edge set containing the shared edges. The node set is preserved. Edge weights and edge attributes are transferred over to the output if they have the same value, else user has the option of providing a function to resolve the conflict.} \item{edgeSetUnion0}{Return a new \code{MultiGraph} object representing the union of edges across all edge sets within \code{g}. The node set is preserved. Edge weights and edge attributes are transferred over to the output if they have the same value, else user has the option of providing a function to resolve the conflict.} \item{\code{graphIntersect(x, y, nodeFun, edgeFun)}}{ When given two \code{MultiGraph} objects, \code{graphIntersect} returns a new \code{MultiGraph} containing the nodes and edges in common between the two graphs. The intersection is computed by first finding the intersection of the node sets, obtaining the induced subgraphs, and finding the intersection of the resulting edge sets. The corresponding named edgeSets in \code{x} and \code{y} should both be either directed or undirected.Node/Edge attributes that are equal are carried over to the result. Non equal edge/node attributes will result in the corresponding attribute being set to NA. The user has the option of providing a named list(names of edgeSets) of list (names of edge attributes) of edge functions correspoding to the names of the edge attributes for resolving conflicting edge attributes (\code{edgeFun}). For resolving any of the conflicting node attributes, the user has the option of providing a named \code{list} of functions corresponding to the node attribute names (\code{nodeFun}). } \item{\code{graphUnion(x, y, nodeFun, edgeFun)}}{ When given two \code{MultiGraph} objects, \code{graphUnion} returns a new \code{MultiGraph} containing the union of nodes and edges between the two graphs. The corresponding pairs of named edgeSets in \code{x} and \code{y} should both be either directed or undirected. Non equal edge/node attributes will result in the corresponding attribute being set to NA. The user has the option of providing a named list(names of edgeSets) of list (names of edge attributes) of edge functions correspoding to the names of the edge attributes for resolving conflicting edge attributes (\code{edgeFun}). For resolving any of the conflicting node attributes, the user has the option of providing a named \code{list} of functions corresponding to the node attribute names (\code{nodeFun}). } \item{ \code{edgeSets(object, ...)}}{ Returns the names of the edgeSets in the MultiGraph \code{object} as a character vector. } \item{show}{Prints a short summary of a MultiGraph object} } } \author{S. Falcon, Gopalakrishnan N} \examples{ ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to=c("b", "c", "d", "a", "d"), weight=c(1, 3.1, 5.4, 1, 2.2)) ft2 <- data.frame(from=c("a", "a", "a", "x", "x", "c"), to=c("b", "c", "x", "y", "c", "a"), weight=c(3.4, 2.6, 1, 1, 1, 7.9)) esets <- list(es1=ft1, es2=ft2) g <- MultiGraph(esets) nodes(g) numEdges(g) eweights(g) eweights(g, names.sep = "=>") isDirected(g) edges(g, edgeSet ="es1") edges(g, "a", "es1") edgeNames(g, "es2") edgeSets(g) ug <- ugraph(g) isDirected(ug) numEdges(ug) edgeSetIntersect0(g) subsetEdgeSets(g, "es1") extractFromTo(g) extractGraphAM(g) extractGraphAM(g, "es1") extractGraphBAM(g, "es1") graphIntersect(g, g) graphUnion(g,g) mgEdgeDataDefaults(g, "es1", attr = "color" ) <- "white" mgEdgeData(g, "es1", from = "a", to = c("b", "c"), attr = "color") <- "red" mgEdgeData(g, "es1", from = "a", to = c("b", "c"), attr = "color") nodeDataDefaults(g, attr ="shape") <- "circle" nodeData(g, n = c("a", "b", "c"), attr = "shape") <- "triangle" nodeData(g, n = c("a", "b", "x", "y"), attr = "shape") } \keyword{classes} graph/man/acc-methods.Rd0000644000175400017540000000317113175713336016145 0ustar00biocbuildbiocbuild\name{acc-methods} \docType{methods} \alias{acc-methods} \alias{acc,graph-method} \alias{acc,clusterGraph-method} \alias{acc} \alias{acc,graph,character-method} \alias{acc,clusterGraph,character-method} \title{Methods for Accessibility Lists} \description{ This generic function takes an object that inherits from the \code{graph} class and a node in that graph and returns a vector containing information about all other nodes that are accessible from the given node. The methods are vectorized so that \code{index} can be a vector. } \usage{ \S4method{acc}{graph,character}(object, index) \S4method{acc}{clusterGraph,character}(object, index) } \arguments{ \item{object}{An instance of the appropriate graph class.} \item{index}{A character vector specifying the nodes for which accessibilty information is wanted.} } \value{ The methods should return a named list of integer vectors. The \code{names} of the list correspond to the names of the supplied nodes. For each element of the list the returned vector is named. The names of the vector elements correspond to the nodes that are accessible from the given node. The values in the vector indicate how many edges are between the given node and the node in the return vector. } \section{Methods}{\describe{ \item{object = graph}{An object of class graph.} \item{object = clusterGraph}{An instance of the \code{clusterGraph} class.} \item{index}{A \code{character} vector of indices corresponding to nodes in the graph.} } } \examples{ set.seed(123) gR3 <- randomGraph(LETTERS[1:10], M<-1:2, p=.5) acc(gR3, "A") acc(gR3, c("B", "D")) } \keyword{methods} graph/man/addEdge.Rd0000644000175400017540000000275513175713336015302 0ustar00biocbuildbiocbuild\name{addEdge} \alias{addEdge} \title{ addEdge } \description{ A function to add an edge to a graph. } \usage{ addEdge(from, to, graph, weights) } \arguments{ \item{from}{The node the edge starts at } \item{to}{The node the edge goes to. } \item{graph}{The graph that the edge is being added to. } \item{weights}{A vector of weights, one for each edge. } } \details{ Both \code{from} and \code{to} can be vectors. They need not be the same length (if not the standard rules for replicating the shorter one are used). Edges are added to the graph between the supplied nodes. The \code{weights} are given for each edge. The implementation is a bit too oriented towards the \code{graphNEL} class and will likely change in the next release to accomodate more general graph classes. If the graph is undirected then the edge is bidirectional (and only needs to be added once). For directed graphs the edge is directional. } \value{ A new instance of a graph object with the same class as \code{graph} but with the indicated edges added. } \author{R. Gentleman} \seealso{\code{\link{addNode}},\code{\link{removeEdge}}, \code{\link{removeNode}} } \examples{ V <- LETTERS[1:4] edL2 <- vector("list", length=4) names(edL2) <- V for(i in 1:4) edL2[[i]] <- list(edges=c(2,1,2,1)[i], weights=sqrt(i)) gR2 <- graphNEL(nodes=V, edgeL=edL2, edgemode="directed") gX <- addEdge("A", "C", gR2, 1) gR3 <- randomEGraph(letters[10:14], .4) gY <- addEdge("n", "l", gR3, 1) } \keyword{ manip } graph/man/addNode.Rd0000644000175400017540000000342713175713336015320 0ustar00biocbuildbiocbuild\name{addNode} \alias{addNode} \alias{addNode,character,graphNEL,missing-method} \alias{addNode,character,graphNEL,list-method} \alias{addNode,character,distGraph,list-method} \alias{addNode,character,graphBAM,missing-method} \title{ addNode } \description{ Add one or more nodes to a graph. } \usage{ addNode(node, object, edges) } \arguments{ \item{node}{A character vector of node names. } \item{object}{A \code{graph} } \item{edges}{A named list of edges.} } \details{ The supplied \code{node}s are added to the set of nodes of the \code{object}. If \code{edges} are provided then their must be the same number as there are \code{node}s and the must be in the same order. The elements of the \code{edges} list are vectors. They can be character vectors of node labels for nodes in \code{object} and if so then they are added with unit weights. If the vector is numeric then it must be named (with labels corresponding to nodes in the \code{object}) and the values are taken to be the edge weights. When the \code{object} is a \code{distGraph} then the \code{edges} must be supplied and they must contain appropriate distances for all nodes both those in \code{object} and those supplied. } \value{ A new graph of the same class as \code{object} with the supplied node added to the set of nodes. } \author{R. Gentleman } \seealso{\code{\link{removeNode}}, \code{\link{removeEdge}}, \code{\link{addEdge}}} \examples{ V <- LETTERS[1:4] edL1 <- vector("list", length=4) names(edL1) <- V for(i in 1:4) edL1[[i]] <- list(edges=c(2,1,4,3)[i], weights=sqrt(i)) gR <- graphNEL(nodes=V, edgeL=edL1) gX <- addNode("X", gR) set.seed(123) g1 <- randomGraph(letters[1:10], 1:4, p=.3) g2 <- addNode("z", g1, edges=list(c("a", "h", "g"))) } \keyword{ manip } graph/man/adj-methods.Rd0000644000175400017540000000176413175713336016163 0ustar00biocbuildbiocbuild\name{adj-methods} \docType{methods} \alias{adj} \title{ Methods for finding the adjacency list for selected nodes. } \alias{adj-methods} \description{ This generic function takes an object that inherits from the \code{graph} class and a node in that graph and returns a vector containing information about all other nodes that are adjacent to the given node. This means that they are joined to the given node by an edge. The accessibility list, \code{\link{acc}} is the list of all nodes that can be reached from a specified node. } \value{ The methods return vector of nodes that are adjacent to the specified node. } \section{Methods}{\describe{ \item{object = graph}{An object that inherits from glass \code{graph}} \item{index}{An index (could be multiple) which can be either the integer offset for the node(s) or their labels.} }} \seealso{\code{\link{acc-methods}}} \examples{ set.seed(123) gR3 <- randomGraph(LETTERS[1:4], M<-1:2, p=.5) adj(gR3, "A") adj(gR3, c(2,3)) } \keyword{methods} graph/man/adjacencyMatrix.Rd0000644000175400017540000000210113175713336017054 0ustar00biocbuildbiocbuild\name{adjacencyMatrix} \alias{adjacencyMatrix} \alias{adjacencyMatrix,graphBAM-method} \title{Compute an Adjacency Matrix for a graphBAM object } \description{ Though unwieldy for large matrices, a full adjacency matrix can be useful for debugging and export. If the graph is \dQuote{undirected} then recicprocal edges are explicit in the matrix. } \usage{ adjacencyMatrix(object) } \arguments{ \item{object}{A \code{graphBAM} object. } } \details{ Thus far only implemented for \code{graphBAM} objects. } \value{ \code{adjacencyMatrix} returns an n x n matrix, where n is the number of nodes in the graph, ordered in the same manner as seen in the \code{nodes} method. All cells in the matrix are \code{0} except where edges are found. } \author{P. Shannon} \seealso{ \code{\link{edgeMatrix}} } \examples{ from <- c("a", "a", "a", "x", "x", "c") to <- c("b", "c", "x", "y", "c", "a") weight <- c(3.4, 2.6, 1.7, 5.3, 1.6, 7.9) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "directed") adjacencyMatrix(g1) } \keyword{manip } graph/man/apoptosisGraph.Rd0000644000175400017540000000270313175713336016761 0ustar00biocbuildbiocbuild\name{apoptosisGraph} \alias{apopGraph} \alias{apopAttrs} \alias{apopLocusLink} \docType{data} \title{KEGG apoptosis pathway graph} \description{ A graph representing the apoptosis pathway from KEGG, as well as a data.frame of attributes for use in plotting the graph with \code{Rgraphviz} and a list to compare the nodes with their respective LocusLink IDs. } \usage{ data(apopGraph) } \details{ The \code{apopGraph} data set contains three objects: The first is \code{apopGraph}, which is an object of class \code{graph-NEL} and represents the hsa04210 graph from \code{KEGG}. The second is \code{apopAttrs}, which is a data.frame with two columns, and a row for every node in \code{apopGraph}. The first column lists what color the node is represented with on the \code{KEGG} site. The second column lists the type of the node - either \code{genesym} or \code{text}. Most nodes are of type \code{genesym} as they represent genes, but some of the nodes in the \code{KEGG} graph were not genes and thus those nodes are of type \code{text}. The third, \code{apopLocusLink} is a named list where the names correspond to the node names in \code{apopGraph}. The values of the list are the LocusLink IDs that correspond to that node in the KEGG graph. } \source{ \url{http://www.genome.ad.jp/kegg/pathway/hsa/hsa04210.html} } \examples{ data(apopGraph) if (require("Rgraphviz") & interactive()) plot(apopGraph) } \keyword{datasets} graph/man/attrData-class.Rd0000644000175400017540000000566313175713336016635 0ustar00biocbuildbiocbuild\name{attrData-class} \docType{class} \alias{attrData-class} \alias{attrDataItem<-,attrData,character,character-method} \alias{attrDataItem,attrData,character,missing-method} \alias{attrDataItem,attrData,character,character-method} \alias{attrDefaults<-,attrData,character,ANY-method} \alias{attrDefaults<-,attrData,missing,list-method} \alias{attrDefaults,attrData,missing-method} \alias{attrDefaults,attrData,character-method} \alias{initialize,attrData-method} \alias{names,attrData-method} \alias{names<-,attrData,character-method} \alias{removeAttrDataItem<-} \alias{removeAttrDataItem<-,attrData,character,NULL-method} \title{Class "attrData"} \description{A container class to manage generic attributes. Supports named attributes with default values with methods for vectorized access. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("attrData", defaults)}. The \code{defaults} argument should be a named list containing the initial attribute names and default values. } \section{Slots}{ \describe{ \item{\code{data}:}{Where custom attribute data is stored} \item{\code{defaults}:}{A named list of known attribute names and defualt values.} } } \section{Methods}{ \describe{ \item{attrDataItem<-}{\code{signature(self = "attrData", x = "character", attr = "character")}: ... } \item{attrDataItem}{\code{signature(self = "attrData", x = "character", attr = "missing")}: ... } \item{attrDataItem}{\code{signature(self = "attrData", x = "character", attr = "character")}: ... } \item{attrDefaults<-}{\code{signature(self = "attrData", attr = "character", value = "ANY")}: ... } \item{attrDefaults<-}{\code{signature(self = "attrData", attr = "missing", value = "list")}: ... } \item{attrDefaults}{\code{signature(self = "attrData", attr = "missing")}: ... } \item{attrDefaults}{\code{signature(self = "attrData", attr = "character")}: ... } \item{initialize}{\code{signature(.Object = "attrData")}: ... } \item{names}{return the names of the stored attributes} \item{names<-}{set the names of the stored attributes} \item{removeAttrDataItem}{\code{signature(self="attrData", x="character", value="NULL")}: Remove the data associated with the key specified by \code{x}.} } } \author{Seth Falcon} \examples{ defaultProps <- list(weight=1, color="blue", friends=c("Bob", "Alice")) adat <- new("attrData", defaults=defaultProps) ## Get all defaults attrDefaults(adat) ## Or get only a specific attribute attrDefaults(adat, attr="color") ## Update default weight attrDefaults(adat, attr="weight") <- 500 ## Add new attribute attrDefaults(adat, attr="length") <- 0 ## Asking for the attributes of an element you haven't customized ## returns the defaults attrDataItem(adat, x=c("n1", "n2"), attr="length") ## You can customize values attrDataItem(adat, x=c("n1", "n2"), attr="length") <- 5 ## What keys have been customized? names(adat) } \keyword{classes} graph/man/attrDataItem-methods.Rd0000644000175400017540000000245513175713336020006 0ustar00biocbuildbiocbuild\name{attrDataItem-methods} \docType{methods} \alias{attrDataItem-methods} \alias{attrDataItem<--methods} \alias{attrDataItem} \alias{attrDataItem<-} \title{Get and set attributes values for items in an attrData object} \usage{ attrDataItem(self, x, attr) attrDataItem(self, x, attr) <- value } \arguments{ \item{self}{A \code{\link{attrData-class}} instance} \item{x}{A \code{character} vector of item names} \item{attr}{A \code{character} vector of length 1 giving the attribute name to get/set. Note that the attribute name must have already been defined for the \code{attrData} object via \code{\link{attrDefaults}}. If missing, return a list of all attributes for the specified nodes.} \item{value}{An R object to set as the attribute value for the specified items. If the object has length one or does not have a length method defined, it will be assigned to all items in \code{x}. If the length of \code{value} is the same as \code{x}, the corresponding elements will be assigned. We will add an argument to indicate that the \code{value} is to be taken as-is for those cases where the lengths are the same coincidentally.} } \description{ The \code{attrDataItem} method provides get/set access to items stored in a \code{\link{attrData-class}} object. } \keyword{methods} graph/man/attrDefaults-methods.Rd0000644000175400017540000000172613175713336020065 0ustar00biocbuildbiocbuild\name{attrDefaults-methods} \docType{methods} \alias{attrDefaults-methods} \alias{attrDefaults<--methods} \alias{attrDefaults} \alias{attrDefaults<-} \title{Get and set the default attributes of an attrData object} \usage{ attrDefaults(self, attr) attrDefaults(self, attr) <- value } \arguments{ \item{self}{A \code{\link{attrData-class}} instance} \item{attr}{A \code{character} vector of length 1 giving the name of an attribute. Can be missing.} \item{value}{An R object that will be used as the default value of the specified attribute, or a named list of attribute name/default value pairs if \code{attr} is missing.} } \description{ The \code{attrDefaults} method provides access to a \code{\link{attrData-class}} object's default attribute list. The default attribute list of a \code{attrData-class} object defines what attributes can be customized for individual data elements by defining attribute names and default values. } \keyword{methods} graph/man/aveNumEdges.Rd0000644000175400017540000000116713175713336016164 0ustar00biocbuildbiocbuild\name{aveNumEdges} \alias{aveNumEdges} \title{ Calculate the average number of edges in a graph } \description{ aveNumEdges divides the number of edges in the graph by the number of nodes to give the average number of edges. } \usage{ aveNumEdges(objgraph) } \arguments{ \item{objgraph}{ the graph object } } \value{ A double representing the average number of edges will be returned. } \author{ Elizabeth Whalen } \seealso{ \code{\link{numEdges}}, \code{\link{mostEdges}}, \code{\link{numNoEdges}} } \examples{ set.seed(124) g1 <- randomGraph(1:10, letters[7:12], p=.6) aveNumEdges(g1) } \keyword{ manip } graph/man/biocRepos.Rd0000644000175400017540000000073213175713336015703 0ustar00biocbuildbiocbuild\name{biocRepos} \alias{biocRepos} \docType{data} \title{A graph representing the Bioconductor package repository} \description{ This graph is a rendition of the Bioconductor package repository and represents the dependency graph of that repository. An edge between two package denotes a dependency on the 'to' package by the 'from' package. } \usage{data(biocRepos)} \examples{ data(biocRepos) ## An example of usage will be here soon } \keyword{datasets} graph/man/boundary.Rd0000644000175400017540000000271613175713336015605 0ustar00biocbuildbiocbuild\name{boundary} \alias{boundary} \title{ Returns the Boundary between a Graph and a SubGraph } \description{ The boundary of a subgraph is the set of nodes in the original graph that have edges to nodes in the subgraph. The function \code{boundary} computes the boundary and returns it as a list whose length is the same length as the number of nodes in the subgraph. } \usage{ boundary(subgraph, graph) } \arguments{ \item{graph}{ the original graph from which the boundary will be created } \item{subgraph}{ can either be the vector of the node labels or the subgraph itself.} } \details{ The \emph{boundary} of a \emph{subgraph} is the set of nodes in the graph which have an edge that connects them to the specified subgraph but which are themselves not elements of the subgraph. For convenience users can specify the subgraph as either a graph or a vector of node labels. } \value{ This function returns a named list of length equal to the number of nodes in \code{subgraph}. The elements of the list correspond to the nodes in the \code{subgraph}. The elements are lists of the nodes in \code{graph} which share an edge with the respective node in \code{subgraph}. } \author{ Elizabeth Whalen and R. Gentleman } \seealso{ \code{\link{subGraph}}, \code{\link{graph-class}} } \examples{ set.seed(123) g1 <- randomGraph(letters[1:10], 1:4, p=.3) ##both should be "a" boundary(c("g", "i"), g1) } \keyword{ manip } graph/man/calcProb.Rd0000644000175400017540000000136613175713336015507 0ustar00biocbuildbiocbuild\name{calcProb} \alias{calcProb} \title{ Calculate the hypergeometric probability of the subgraph's number of edges. } \description{ \code{calcProb} calculates the probability of having the number of edges found in the subgraph given that it was made from \code{origgraph}. The hypergeometric distribution is used to calculate the probability (using the pdf). } \usage{ calcProb(subgraph, origgraph) } \arguments{ \item{subgraph}{ subgraph made from the original graph } \item{origgraph}{ original graph object from which the subgraph was made } } \value{ The probability of the subgraph's number of edges is returned. } \author{ Elizabeth Whalen } \seealso{ \code{\link{calcSumProb}} } \examples{ #none right now } \keyword{ manip } graph/man/calcSumProb.Rd0000644000175400017540000000332513175713336016171 0ustar00biocbuildbiocbuild\name{calcSumProb} \alias{calcSumProb} \title{ Calculate the probability that a subgraph has an unusual number of edges.} \description{ For any graph a set of nodes can be used to obtain an induced subgraph (see \code{\link{subGraph}}). An interesting question is whether that subgraph has an unusually large number of edges. This function computes the probability that a \emph{random} subgraph with the same number of nodes has more edges than the number observed in the presented subgraph. The appropriate probability distribution is the hypergeometric. } \usage{ calcSumProb(sg, g) } \arguments{ \item{sg}{ subgraph made from the original graph } \item{g}{ original graph object from which the subgraph was made } } \value{ The probability of having greater than or equal to the subgraph's number of edges is returned. } \details{ The computation is based on the following argument. In the original graph there are \eqn{n} nodes and hence \eqn{N=n*(n-1)/2} edges in the complete graph. If we consider these \eqn{N} nodes to be of two types, corresponding to those that are either in our graph, \code{g}, or not in it. Then we think of the subgraph which has say \eqn{m} nodes and \eqn{M=m*(m-1)/2} possible edges as representing \eqn{M} draws from an urn containing \eqn{N} balls of which some are white (those in \code{g}) and some are black. We count the number of edges in the subgraph and use a Hypergeomtric distribution to ask whether our subgraph is particularly dense. } \author{ Elizabeth Whalen } \seealso{ \code{\link{calcProb}} } \examples{ set.seed(123) V <- letters[14:22] g1 <- randomEGraph(V, .2) sg1 <- subGraph(letters[c(15,17,20,21,22)], g1) calcSumProb(sg1, g1) } \keyword{ manip } graph/man/clearNode.Rd0000644000175400017540000000141113175713336015645 0ustar00biocbuildbiocbuild\name{clearNode} \alias{clearNode} \title{ clearNode } \description{ This function removes all edges to or from the specified node in the graph. } \usage{ clearNode(node, object) } \arguments{ \item{node}{a node } \item{object}{a \code{graph} } } \details{ All edges to and from \code{node} are removed. \code{node} can be a vector. } \value{ A new instance of the graph with all edges to and from the specified node(s) removed. } \author{R. Gentleman} \seealso{\code{\link{removeNode}}, \code{\link{removeEdge}}} \examples{ V <- LETTERS[1:4] edL3 <- vector("list", length=4) for(i in 1:4) edL3[[i]] <- list(edges=(i\%\%4)+1, weights=i) names(edL3) <- V gR3 <- graphNEL(nodes=V, edgeL=edL3, "directed") g4 <- clearNode("A", gR3) } \keyword{manip } graph/man/clusterGraph-class.Rd0000644000175400017540000000472213175713336017527 0ustar00biocbuildbiocbuild\name{clusterGraph-class} \docType{class} \alias{clusterGraph-class} \alias{clusterGraph-class} \alias{adj,clusterGraph,ANY-method} \alias{coerce,clusterGraph,matrix-method} \alias{connComp,clusterGraph-method} \alias{edges,clusterGraph,missing-method} \alias{edges,clusterGraph,character-method} \alias{edgeL,clusterGraph-method} \alias{edgeWeights,clusterGraph-method} \alias{edgeWeights,clusterGraph,ANY-method} \alias{nodes,clusterGraph-method} \alias{nodes<-,clusterGraph,character-method} \alias{numNodes,clusterGraph-method} \alias{show,clusterGraph-method} \title{Class "clusterGraph" } \description{ A cluster graph is a special sort of graph for clustered data. Each cluster forms a completely connected subgraph. Three are no edges between clusters.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("clusterGraph", ...)}. } \section{Slots}{ \describe{ \item{\code{clusters}:}{Object of class \code{"list"} a list of the labels of the elements, one element of the list for each cluster. } } } \section{Extends}{ Class \code{"graph"}, directly. } \section{Methods}{ \describe{ \item{connComp}{\code{signature(object = "clusterGraph")}: find the connected components; simply the clusters in this case. } \item{acc}{\code{signature(object = "clusterGraph")}: find the accessible nodes from the supplied node. } \item{adj}{\code{signature(object = "clusterGraph")}: find the adjacent nodes to the supplied node. } \item{nodes}{\code{signature(object = "clusterGraph")}: return the nodes. } \item{nodes<-}{\code{signature(object="clusterGraph", value="character")}: replace the node names with the new labels given in \code{value}.} \item{numNodes}{\code{signature(object = "clusterGraph")}: return the number of nodes. } \item{edgeWeights}{Return a list of edge weights in a list format similar to the \code{edges} method.} \item{edgeL}{\code{signature(graph = "clusterGraph")}: A method for obtaining the edge list.} \item{coerce}{\code{signature(from = "clusterGraph", to = "matrix")}: Convert the \code{clusterGraph} to an adjacency matrix. Currently, weights are ignored. The conversion assumes no self-loops.} } } \author{R. Gentleman} \seealso{ \code{\link{graph-class}}, \code{\link{distGraph-class}} } \examples{ cG1 <- new("clusterGraph", clusters=list(a=c(1,2,3), b=c(4,5,6))) cG1 acc(cG1, c("1", "2")) } \keyword{classes} graph/man/clusteringCoefficient-methods.Rd0000644000175400017540000000300113175713336021725 0ustar00biocbuildbiocbuild\name{clusteringCoefficient-methods} \docType{methods} \alias{clusteringCoefficient} \alias{clusteringCoefficient,graph-method} \alias{clusteringCoefficient,graph} \title{Clustering coefficient of a graph} \description{ This generic function takes an object that inherits from the \code{graph} class. The graph needs to have \code{edgemode=="undirected"}. If it has \code{edgemode=="directed"}, the function will return NULL. } \usage{ \S4method{clusteringCoefficient}{graph}(object, selfLoops=FALSE) } \details{For a node with n adjacent nodes, if \code{selfLoops} is \code{FALSE}, the clustering coefficent is N/(n*(n-1)), where N is the number of edges between these nodes. The graph may not have self loops. If \code{selfLoops} is \code{TRUE}, the clustering coefficent is N/(n*n), where N is the number of edges between these nodes, including self loops. } \arguments{ \item{object}{An instance of the appropriate graph class.} \item{selfLoops}{Logical. If true, the calculation takes self loops into account.} } \value{A named numeric vector with the clustering coefficients for each node. For nodes with 2 or more edges, the values are between 0 and 1. For nodes that have no edges, the function returns the value NA. For nodes that have exactly one edge, the function returns NaN. } \author{Wolfgang Huber \url{http://www.dkfz.de/mga/whuber}} \examples{ set.seed(123) g1 <- randomGraph(letters[1:10], 1:4, p=.3) clusteringCoefficient(g1) clusteringCoefficient(g1, selfLoops=TRUE) } \keyword{methods} graph/man/combineNodes.Rd0000644000175400017540000000342413175713336016364 0ustar00biocbuildbiocbuild\name{combineNodes} \alias{combineNodes} \alias{combineNodes,character,graphNEL,character-method} \title{ combineNodes } \description{ A function to combine, or collapse, a specified set of nodes in a graph. } \usage{ combineNodes(nodes, graph, newName, \dots) \S4method{combineNodes}{character,graphNEL,character}(nodes, graph, newName, collapseFunction=sum) } \arguments{ \item{nodes}{A set of nodes that are to be collapsed. } \item{graph}{The graph containing the nodes } \item{newName}{The name for the new, collapsed node. } \item{collapseFunction}{Function or character giving the name of a function used to collapse the edge weights after combining nodes. The default is to sum up the weights, but mean would be a useful alternative.} \item{\dots}{Additional arguments for the generic} } \details{ The nodes specified are reduced to a single new node with label given by \code{newName}. The in and out edges of the set of nodes are all made into in and out edges for the new node. } \value{ An new instance of a graph of the same class as \code{graph} is returned. This new graph has the specified nodes reduced to a single node. } \author{R. Gentleman} \seealso{\code{\link{inEdges}}, \code{\link{addNode}}} \examples{ V <- LETTERS[1:4] edL1 <- vector("list", length=4) names(edL1) <- V for(i in 1:4) edL1[[i]] <- list(edges=c(2,1,4,3)[i], weights=sqrt(i)) gR <- graphNEL(nodes=V, edgeL=edL1, edgemode="directed") gR <- addNode("M", gR) gR <- addEdge("M", "A", gR, 1) gR <- addEdge("B", "D", gR, 1) gX <- combineNodes(c("B","D"), gR, "X") gR <- addNode("K", gR) gR <- addEdge(c("K","K"), c("D", "B"), gR, c(5,3)) edgeWeights(combineNodes(c("B","D"), gR, "X"))$K edgeWeights(combineNodes(c("B","D"), gR, "X", mean))$K } \keyword{ manip} graph/man/defunct.Rd0000644000175400017540000000061513175713336015406 0ustar00biocbuildbiocbuild\name{graph-defunct} \alias{graph-defunct} \title{Defunct Functions in Package \pkg{graph}} %------ PLEASE: put \alias{.} here for EACH ! \alias{pkgInstOrder} \alias{buildRepDepGraph} \alias{ugraphOld} % \description{ The functions or variables listed here are no longer part of the graph package. } \usage{ buildRepDepGraph() pkgInstOrder() ugraphOld() } \seealso{ \code{\link{Defunct}} } graph/man/distGraph-class.Rd0000644000175400017540000000452513175713336017012 0ustar00biocbuildbiocbuild\name{distGraph-class} \docType{class} \alias{distGraph-class} \alias{threshold} \alias{Dist} \alias{[.dist} \alias{distGraph-class} \alias{adj,distGraph,ANY-method} \alias{Dist,distGraph-method} \alias{edges,distGraph,missing-method} \alias{edges,distGraph,character-method} \alias{edgeL,distGraph-method} \alias{nodes,distGraph-method} \alias{numNodes,distGraph-method} \alias{show,distGraph-method} \alias{threshold,distGraph-method} \alias{edgeWeights,distGraph-method} \alias{edgeWeights,distGraph,ANY-method} \alias{initialize,distGraph-method} \title{Class "distGraph"} \description{ A class definition for graphs that are based on distances.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("distGraph", ...)}. } \section{Slots}{ \describe{ \item{\code{Dist}:}{Object of class \code{"dist"} that forms the basis for the edge weights used in the \code{distGraph}.} } } \section{Extends}{ Class \code{"graph"}, directly. } \section{Methods}{ \describe{ \item{show}{\code{signature(object = "distGraph")}: a print method} \item{Dist}{\code{signature(object = "distGraph")}: return the dist object. } \item{adj}{\code{signature(object = "distGraph")}: find the nodes adjacent to the supplied node. } \item{nodes}{\code{signature(object = "distGraph")}: return the nodes in the graph. } \item{numNodes}{\code{signature(object = "distGraph")}: return the number of nodes. } \item{threshold}{\code{signature(object = "distGraph", k, value)}: set all distances that are larger than the supplied threshold, \code{k}, to the supplied value. The default is value is zero (and so is appropriate for similarities, rather than distances). } \item{initialize}{\code{signature(object = "distGraph")}: initialize a \code{distGraph} instance. } \item{edgeWeights}{Return a list of edge weights in a list format similar to the \code{edges} method.} \item{edgeL}{\code{signature(graph = "distGraph")}: A method for obtaining the edge list.} } } \references{Shamir's paper and Butte et al} \author{R. Gentleman } \seealso{\code{\link{graph-class}}, \code{\link{clusterGraph-class}}} \examples{ set.seed(123) x <- rnorm(26) names(x) <- letters library(stats) d1 <- dist(x) g1 <- new("distGraph", Dist=d1) } \keyword{classes} graph/man/duplicatedEdges.Rd0000644000175400017540000000153013175713336017041 0ustar00biocbuildbiocbuild\name{duplicatedEdges} \alias{duplicatedEdges} \title{duplicatedEdges } \description{ A multigraph is a graph where edges between nodes can be represented several times. For some algorithms this causes problems. \code{duplicatedEdges} tests an instance of the \code{graphNEL} class to see if it has duplicated edges and returns \code{TRUE} if it does and \code{FALSE} otherwise. } \usage{ duplicatedEdges(graph) } \arguments{ \item{graph}{An instance of the class \code{graphNEL} } } \details{ It would be nice to handle other types of graphs. } \value{ A logical, either \code{TRUE} if the graph has duplicated edges or \code{FALSE} it not. } \author{R. Gentleman } \seealso{ \code{\link{connComp}}, \code{\link{ugraph}} } \examples{ ##---- Should be DIRECTLY executable !! ---- ##-- ==> Define data, use random, } \keyword{manip } graph/man/edgeData-methods.Rd0000644000175400017540000000163413175713336017117 0ustar00biocbuildbiocbuild\name{edgeData-methods} \docType{methods} \alias{edgeData-methods} \alias{edgeData<--methods} \alias{edgeData} \alias{edgeData<-} \title{Get and set attributes for the edges of a graph object} \usage{ edgeData(self, from, to, attr) edgeData(self, from, to, attr) <- value } \arguments{ \item{self}{A \code{graph-class} instance} \item{from}{A \code{character} vector of node names} \item{to}{A \code{character} vector of node names} \item{attr}{A \code{character} vector of length one specifying the name of a node attribute} \item{value}{An R object to store as the attribute value} } \description{ Attributes of the edges of a graph can be accessed using \code{edgeData}. The attributes must be defined using \code{\link{edgeDataDefaults}}. You can ommit the \code{from} or \code{to} argument to retrieve attribute values for all edges to (respectively, from) a given node. } \keyword{methods} graph/man/edgeDataDefaults-methods.Rd0000644000175400017540000000123313175713336020602 0ustar00biocbuildbiocbuild\name{edgeDataDefaults-methods} \docType{methods} \alias{edgeDataDefaults-methods} \alias{edgeDataDefaults<--methods} \alias{edgeDataDefaults} \alias{edgeDataDefaults<-} \title{Get and set default attributes for the edges of a graph} \usage{ edgeDataDefaults(self, attr) edgeDataDefaults(self, attr) <- value } \arguments{ \item{self}{A \code{\link{graph-class}} instance} \item{attr}{A \code{character} vector of length one giving the name of the attribute} \item{value}{An R class to use as the default value for the specified attribute} } \description{ Set default values for attributes associated with the edges of a graph. } \keyword{methods} graph/man/edgeMatrix.Rd0000644000175400017540000000531113175713336016045 0ustar00biocbuildbiocbuild\name{edgeMatrix} \alias{edgeMatrix} \alias{eWV} \alias{pathWeights} \alias{edgeMatrix,graphNEL-method} \alias{edgeMatrix,graphAM-method} \alias{edgeMatrix,clusterGraph-method} \alias{edgeMatrix,distGraph-method} \alias{edgeMatrix,graphBAM-method} \title{Compute an Edge Matrix or weight vector for a Graph } \description{ For our purposes an \emph{edge matrix} is a matrix with two rows and as many columns as there are edges. The entries in the first row are the index of the node the edge is \emph{from}, those in the second row indicate the node the edge is \emph{to}. If the graph is \dQuote{undirected} then the \code{duplicates} option can be used to indicate whether reciprocal edges are wanted. The default is to leave them out. In this case the notions of \emph{from} and \emph{to} are not relevant. } \usage{ edgeMatrix(object, duplicates=FALSE) eWV(g, eM, sep = ifelse(edgemode(g) == "directed", "->", "--"), useNNames=FALSE) pathWeights(g, p, eM=NULL) } \arguments{ \item{object}{An object that inherits from \code{graph}. } \item{g}{An object that inherits from \code{graph}. } \item{duplicates}{Whether or not duplicate edges should be produced for \dQuote{undirected} graphs. } \item{eM}{An edge matrix} \item{sep}{a character string to concatenate node labels in the edge label} \item{useNNames}{a logical; if TRUE, node names are used in the edge label; if FALSE, node indices are used} \item{p}{a vector of node names constituting a path in graph \code{g}} \item{\dots}{arguments passed to \code{edgeMatrix}.} } \details{ Implementations for \code{graphNEL}, \code{clusterGraph} and \code{distGraph} are available. } \value{ \code{edgeMatrix} returns a matrix with two rows, \emph{from} and \emph{to}, and as many columns as there are edges. Entries indicate the index in the node vector that corresponds to the appropriate end of the edge. \code{eWV} uses the edge matrix to create an annotated vector of edge weights. \code{pathWeights} returns an annotated vector of edge weights for a specified path in a graph. } \note{A path through an undirected graph may have several representations as a named vector of edges. Thus in the example, when the weights for path b-a-i are requested, the result is the pair of weights for edges a--b and a--i, as these are the edge labels computed for graph g1.} \author{R. Gentleman } \seealso{ \code{\link{edges}} } \examples{ set.seed(123) g1 <- randomGraph(letters[1:10], 1:4, p=.3) edgeMatrix(g1) g2 <- new("clusterGraph", clusters=list(a=c(1,2,3), b=c(4,5,6))) em2 <- edgeMatrix(g2) eWV(g1, edgeMatrix(g1)) eWV(g1, edgeMatrix(g1), useNNames=TRUE) pathWeights(g1, c("b", "a", "i")) } \keyword{manip } graph/man/edgeSets.Rd0000644000175400017540000000146113175713336015521 0ustar00biocbuildbiocbuild\name{edgeSets} \alias{esetsFemale} \alias{esetsMale} \docType{data} \title{MultiGraph edgeSet data} \description{ C57BL/6J and C3H/HeJ mouse strains exhibit different cardiovascular and metabolic phenotypes on the hyperlipidemic apolipoprotein E (Apoe) null background. The interaction data for the genes from adipose, brain, liver and muscle tissue samples from male and female mice are included as a list of \code{data.frame}s. Each \code{data.frame} contains information for the \code{from-gene}, \code{to-gene} and the strength of interaction (\code{weight}) for each of the tissues studied. } \usage{ data(esetsFemale) data(esetsMale) } \source{ Sage Commons Repository \url{http://sagebase.org/commons/dataset1.php#UCLA1} } \examples{ data(esetsFemale) data(esetsMale) } \keyword{datasets} graph/man/edgeWeights.Rd0000644000175400017540000001034213175713336016213 0ustar00biocbuildbiocbuild\name{edgeWeights} \alias{edgeWeights} \title{Retrieve the edge weights of a graph} \description{ A generic function that returns the edge weights of a graph. If \code{index} is specified, only the weights for the edges from the specified nodes are returned. The user can control which edge attribute is interpreted as the weight, see the Details section. } \usage{ edgeWeights(object, index, ..., attr = "weight", default = 1, type.checker = is.numeric) } \arguments{ \item{object}{A graph, any object that inherits from the \code{graph} class.} \item{index}{If supplied, a character or numeric vector of node names or indices.} \item{...}{Unused.} \item{attr}{The name of the edge attribute to use as a weight. You can view the list of defined edge attributes and their default values using \code{edgeDataDefaults}. The default attribute name is \code{"weight"}, see the Details section.} \item{default}{The value to use if \code{object} has no edge attribute named by the value of \code{attr}. The default is the value 1 (double).} \item{type.checker}{A function that will be used to check that the edge weights are of the correct type. This function should return TRUE if the input vector is of the right type and FALSE otherwise. The default is to check for numeric edge weights using \code{is.numeric}. If no type checking is desired, specify \code{NULL}.} } \details{ If \code{index} is suppled, then edge weights from these nodes to all adjacent nodes are returned. If \code{index} is not supplied, then the edge weights for all nodes are returned. The value for nodes without any outgoing edges will be a zero-length vector of the appropriate mode. The \code{edgeWeights} method is a convenience wrapper around \code{edgeData}, the general-purpose way to access edge attribute information for a \code{graph} instance. In general, edge attributes can be arbitary R objects. However, for \code{edgeWeights} to make sense, the values must be vectors of length not more than one. By default, \code{edgeWeights} looks for an edge attribute with name \code{"weight"} and, if found, uses these values to construct the edge weight list. You can make use of attributes stored under a different name by providing a value for the \code{attr} argument. For example, if \code{object} is a graph instance with an edge attribute named \code{"WTS"}, then the call \code{edgeWeights(object, attr="WTS")} will attempt to use those values. The function specified by \code{type.checker} will be given a vector of edge weights; if the return value is not \code{TRUE}, then an error will be signaled indicating that the edge weights in the graph are not of the expected type. Type checking is skipped if \code{type.checker} is \code{NULL}. If the graph instance does not have an edge attribute with name given by the value of the \code{attr} argument, \code{default} will be used as the weight for all edges. Note that if there is an attribute named by \code{attr}, then its default value will be used for edges not specifically customized. See \code{edgeData} and \code{edgeDataDefaults} for more information. Because of their position after the \code{...}, no partial matching is performed for the arguments \code{attr}, \code{default}, and \code{type.checker}. } \value{ A named list of named edge weight vectors. The names on the list are the names of the nodes specified by \code{index}, or all nodes if \code{index} was not provided. The names on the weight vectors are node names to identify the edge to which the weight belongs. } \author{R. Gentleman and S. Falcon} \seealso{ \code{\link{nodes}} \code{\link{edges}} \code{\link{edgeData}} \code{\link{edgeDataDefaults}} \code{\link{is.numeric}} \code{\link{is.integer}} \code{\link{is.character}} } \examples{ V <- LETTERS[1:4] edL2 <- vector("list", length=4) names(edL2) <- V for(i in 1:4) edL2[[i]] <- list(edges=c(2,1,2,1)[i], weights=sqrt(i)) gR2 <- graphNEL(nodes=V, edgeL=edL2, edgemode="directed") edgeWeights(gR2, "C") edgeWeights(gR2) edgeWeights(gR2, attr="foo", default=5) edgeData(gR2, attr="weight") edgeData(gR2, from="C", attr="weight") } \keyword{manip} graph/man/fromGXL-methods.Rd0000644000175400017540000000636613175713336016746 0ustar00biocbuildbiocbuild\name{fromGXL-methods} \docType{methods} \title{ Methods for GXL manipulations in package graph } \alias{fromGXL-methods} \alias{toGXL-methods} \alias{GXL} \alias{dumpGXL-methods} \alias{dumpGXL} \alias{fromGXL} \alias{gxlTreeNEL} \alias{NELhandler} \alias{toGXL} \alias{validateGXL} \alias{dumpGXL,connection-method} \alias{fromGXL,connection-method} \alias{validateGXL,connection-method} \description{GXL \url{http://www.gupro.de/GXL} is "an XML sublanguage designed to be a standard exchange format for graphs". This document describes tools in the graph package for importing GXL data to R and for writing graph data out as GXL.} \value{ \item{fromGXL}{currently returns a graphNEL when possible. This function is based on \code{\link[XML]{xmlEventParse}} with handlers defined in the function NELhandler. The dump() element of this handler should emit information on all children of nodes and edges; the asGraphNEL() element will return a \code{\linkS4class{graphNEL}} object with weights if child \code{} with name attribute "weights" is present for each edge element.} \item{toGXL}{for an input of class "graphNEL", returns an object of class c("XMLInternalDOM", "XMLOutputStream"); see the example for how to convert this to a text stream encoding XML} \item{dumpGXL}{returns an R list with all the node, edge, and named attribute information specified in the GXL stream} \item{validateGXL}{returns silently (invisibly returns the parsed tree) for a DTD-compliant stream, or is otherwise very noisy} } \section{Methods}{ \describe{ \item{fromGXL}{ con = connection: returns a graphNEL based on a parsing of the GXL stream on the connection } \item{dumpGXL}{ con = connection: returns an R list based on a parsing of the GXL stream on the connection } \item{validateGXL}{ con = connection: checks the GXL stream against its DTD} \item{toGXL}{ object = graphNEL: creates an XMLInternalDOM representing the graph in GXL} } } \author{Vince Carey } \note{At present, toGXL does not return a validating GXL stream because XML package does not properly handle the dtd and namespaces arguments to xmlTree. This is being repaired. To fix the stream, add \code{ } as second record in the output. Some structures in a graphNEL and some tags in GXL may not be handled at this time. } \examples{ sf <- file(system.file("GXL/simpleExample.gxl", package="graph")) show(fromGXL(sf)) print(dumpGXL(sf)) close(sf) #validateGXL(sf) # bad <- file(system.file("GXL/c2.gxl", package="graph")) # here's how you can check if the GXL is well-formed, if # you have a libxml2-based version of R XML package # # try( validateGXL(bad) ) # gR <- graphNEL(nodes=letters[1:4], edgeL=list( a=list(edges=4), b=list(edges=3), c=list(edges=c(2,1)), d=list(edges=1)), edgemode="directed") # # following requires that you are using XML bound with recent libxml2 # #an <- as.numeric #if (an(libxmlVersion()$major)>=2 && an(libxmlVersion()$minor)>=4) ## since toGXL returns an XML object, we need to attach the XML ## package. library("XML") cat(saveXML(toGXL(gR)$value())) wtd <- file(system.file("GXL/kmstEx.gxl", package="graph")) wtdg <- fromGXL(wtd) close(wtd) print(edgeWeights(wtdg)) } \keyword{methods} \keyword{ models } graph/man/graph-class.Rd0000644000175400017540000002315213175713336016163 0ustar00biocbuildbiocbuild\name{graph-class} \docType{class} \alias{graph-class} \alias{graphBase-class} \alias{complement} \alias{complement,graph-method} \alias{connComp} \alias{connComp,graph-method} \alias{degree} \alias{degree,graph,missing-method} \alias{degree,MultiGraph,missing-method} \alias{degree,graph,ANY-method} \alias{dfs,graph-method} \alias{edgeDataDefaults<-,graph,missing,list-method} \alias{edgeDataDefaults<-,graph,character-method} \alias{edgeDataDefaults<-,graph,character,ANY-method} \alias{edgeDataDefaults,graph,missing-method} \alias{edgeDataDefaults,graph,character-method} \alias{edgeData<-,graph,character,character,character-method} \alias{edgeData<-,graph,character,missing,character-method} \alias{edgeData<-,graph,missing,character,character-method} \alias{edgeData<-,graph,character,character,character,ANY-method} \alias{edgeData<-,graph,character,missing,character,ANY-method} \alias{edgeData<-,graph,missing,character,character,ANY-method} \alias{edgeData,graph,character,character,character-method} \alias{edgeData,graph,character,character,missing-method} \alias{edgeData,graph,character,missing,character-method} \alias{edgeData,graph,missing,character,character-method} \alias{edgeData,graph,missing,missing,character-method} \alias{edgeData,graph,missing,missing,missing-method} \alias{edgemode} \alias{edgemode<-} \alias{edgemode,graph-method} \alias{edgemode<-,graph,character-method} \alias{edgeNames} \alias{edgeNames,graph-method} \alias{edgeL,graph-method} \alias{edgeWeights,graph,character-method} \alias{edgeWeights,graph,numeric-method} \alias{edgeWeights,graph,missing-method} \alias{intersection} \alias{intersection,graph,graph-method} \alias{intersection2} \alias{intersection2,graph,graph-method} \alias{isAdjacent,graph,character,character-method} \alias{isConnected} \alias{isConnected,graph-method} \alias{isDirected,graph-method} \alias{join} \alias{join,graph,graph-method} \alias{nodeDataDefaults<-,graph,missing,list-method} \alias{nodeDataDefaults<-,graph,character-method} \alias{nodeDataDefaults<-,graph,character,ANY-method} \alias{nodeDataDefaults,graph,missing-method} \alias{nodeDataDefaults,graph,character-method} \alias{nodeData<-,graph,character,character-method} \alias{nodeData<-,graph,missing,character-method} \alias{nodeData,graph,character,character-method} \alias{nodeData,graph,character,missing-method} \alias{nodeData,graph,missing,character-method} \alias{nodeData,graph,missing,missing-method} \alias{nodes,graph-method} \alias{nodes<-,graph,character-method} \alias{numEdges} \alias{numEdges,graph-method} \alias{numNodes} \alias{numNodes,graph-method} \alias{plot,graph,ANY-method} \alias{show,graph-method} \alias{union,graph,graph-method} \alias{updateGraph} \alias{updateGraph,graph-method} \title{Class "graph" } \description{A virtual class that all graph classes should extend. } \section{Objects from the Class}{ A virtual Class: No objects may be created from it. } \section{Slots}{ \describe{ \item{\code{edgeData}:}{An \code{attrData} instance for edge attributes.} \item{\code{nodeData}:}{An \code{attrData} instance for node attributes.} \item{\code{graphData}:}{A \code{list} for graph-level attributes. Only mandatory list item is \code{edgemode} which indicates whether edges are \code{"directed"} or \code{"undirected"}} \item{\code{renderInfo}:}{A \code{list} of graph rendering information.} } } \section{Methods}{ \describe{ \item{nodes}{return a character vector containing the names of the nodes of the graph} \item{nodes<-}{rename the nodes of the graph} \item{show}{\code{signature(object = "graph")}:A print method for the graph.} \item{acc}{\code{signature(object = "graph")}: find all nodes accessible from the specified node. } \item{complement}{\code{signature(x = "graph")}: compute the complement of the supplied graph. The complement is defined with respect to the complete graph on the nodes in \code{x}. Currently this returns an object of class \code{graphNEL}.} \item{connComp}{\code{signature(object = "graph")}: find the connected components of a graph.} \item{degree}{\code{signature(object = "graph", Nodes = "missing")}: find the \code{degree} of a node (number of coincident edges).} \item{degree}{\code{signature(object = "graph", Nodes = "ANY")}: as above. } \item{degree}{\code{signature(object = "MultiGraph", Nodes = "missing")}: find the \code{degree} of a node (number of coincident edges).} \item{dfs}{\code{signature(object = "graph")}: execute a depth first search on a graph starting with the specified node.} \item{edges}{\code{signature(object="graph", which="character")}: return the edges indicated by \code{which}. \code{which} can be missing in which case all edges are returned or it can be a character vector with the node labels indicating the nodes whose edge lists are wanted.} \item{edgeDataDefaults}{Get and set default attributes for the edges in the graph.} \item{edgeData}{Get and set attributes for edges in the graph} \item{edgemode}{\code{signature(object="graph")}: return the \code{edgemode} for the graph. Currently this can be either \code{directed} or \code{undirected}.} \item{edgemode<-}{\code{signature(object="graph", value="character")}: set the \code{edgemode} for the graph. Currently this can be either \code{directed} or \code{undirected}.} \item{edgeWeights}{Return a list of edge weights in a list format similar to the \code{edges} method.} \item{intersection}{\code{signature(x = "graph", y = "graph")}: compute the intersection of the two supplied graphs. They must have identical nodes. Currently this returns an object of class \code{graphNEL}. With edge weights of 1 for any matching edge.} \item{isAdjacent}{\code{signature(from="character", to="character")}: Determine if edges exists between nodes.} \item{isConnected}{\code{signature(object = "graph")}: A boolean that details if a graph is fully connected or not.} \item{isDirected}{Return \code{TRUE} if the graph object has directed edges and \code{FALSE} otherwise.} \item{join}{\code{signature(x = "graph", y = "graph")}: returns the joining of two graphs. Nodes which are shared by both graphs will have their edges merged. Note that edgeWeights for the resulting graph are all set to 1. Users wishing to preserve weights in a join operation must perform addEdge operations on the resulting graph to restore weights.} \item{nodes<-}{A generic function that allows different implementations of the \code{graph} class to reset the node labels} \item{nodeDataDefaults}{Get/set default attributes for nodes in the graph.} \item{nodeData}{Get/set attributes for nodes in the graph.} \item{numEdges}{\code{signature(object = "graph")}: compute the number of edges in a graph.} \item{numNodes}{\code{signature(object = "graph")}: compute the number of nodes in a graph. } \item{plot}{Please see the help page for the \code{plot,graph-method} method in the \code{Rgraphviz} package} \item{union}{\code{signature(x = "graph", y = "graph")}: compute the union of the two supplied graphs. They must have identical nodes. Currently this returns an object of class \code{graphNEL}.} \item{edgeNames}{\code{signature(object = "graph")}: Returns a vector of the edge names for this graph, using the format \code{tail\~head}, where \code{head} is the name of the tail node and \code{head} is the name of the head node.} \item{updateGraph}{\code{signature(object = "graph")}: Updates old instances of graph objects.} } } \details{ \code{degree} returns either a named vector (names correspond to the nodes in the graph) containing the degree for undirected graphs or a list with two components, \code{inDegree} and \code{outDegree} for directed graphs. \code{connComp} returns a list of the connected components. Each element of this list contains the labels of all nodes in that component. For a \emph{directed graph} or \emph{digraph} the \dfn{underlying graph} is the graph that results from removing all direction from the edges. This can be achieved using the function \code{\link{ugraph}}. A \dfn{weakly connected} component of a \emph{digraph} is one that is a connected component of the underlying graph. This is the default for \code{connComp}. A \emph{digraph} is \dfn{strongly connected} if every two vertices are mutually reachable. A \dfn{strongly connected} component of a \emph{digraph}, \strong{D}, is a maximal \emph{strongly connected} subdigraph of \strong{D}. See the \pkg{RBGL} package for an implementation of Trajan's algorithm to find \emph{strongly connected} components (\code{\link[RBGL]{strongComp}}). In the \pkg{graph} implementation of \code{connComp} \emph{weak connectivity} is used. If the argument to \code{connComp} is a directed graph then \code{\link{ugraph}} is called to create the underlying undirected graph and that is used to compute connected components. Users who want different behavior are encouraged to use \pkg{RBGL}. } \references{ Graph Theory and its Applications, J. Gross and J. Yellen. } \author{R. Gentleman and E. Whalen. } \seealso{\code{\link{graphNEL-class}}, \code{\link{graphAM-class}}, \code{\link{distGraph-class}}. } \examples{ set.seed(123) g1 <- randomGraph(letters[1:10], 1:4, p= 0.3) numEdges(g1) edgeNames(g1) edges(g1) edges(g1, c("a","d")) # those incident to 'a' or 'd' } \keyword{graphs} \keyword{classes} graph/man/graph2SparseM.Rd0000644000175400017540000000350513175713336016435 0ustar00biocbuildbiocbuild\name{graph2SparseM} \alias{graph2SparseM} \alias{sparseM2Graph} \title{Coercion methods between graphs and sparse matrices } \description{ These functions provide coercions between objects that inherit from the \code{graph} class to sparse matrices from the \code{SparseM} package. } \usage{ graph2SparseM(g, useweights=FALSE) sparseM2Graph(sM, nodeNames, edgemode=c("directed", "undirected")) } \arguments{ \item{g}{An instance of the \code{graph} class. } \item{useweights}{A logical value indicating whether to use the edge weights in the graph as values in the sparse matrix.} \item{sM}{A sparse matrix.} \item{nodeNames}{A \code{character} vector of the node names.} \item{edgemode}{Specifies whether the graph to be created should have directed (default) or undirected edges. If undirected, the input matrix \code{sM} must be symmetric.} } \details{ A very simple coercion from one representation to another. Currently it is presumed that the matrix is square. For other graph formats, such as bipartite graphs, some improvements will be needed; patches are welcome. } \value{ \code{graph2SparseM} takes as input an instance of a subclass of the \code{graph} class and returns a sparse matrix. \code{sparseM2Graph} takes a sparse matrix as input and returns an instance of the \code{graphNEL} class. By default, the \code{graphNEL} returned will have directed edges. } \author{R. Gentleman } \seealso{ \code{\link{graph-class}}, \code{\link{graphNEL-class}}, and for other conversions, \code{\link{aM2bpG}} and \code{\link{ftM2adjM}} } \examples{ set.seed(123) g1 <- randomGraph(letters[1:10], 1:4, p=.3) s1 <- graph2SparseM(g1, useweights=TRUE) g2 <- sparseM2Graph(s1, letters[1:10], edgemode="undirected") ## consistency check stopifnot(all.equal(g1, g2)) } \keyword{manip} graph/man/graphAM-class.Rd0000644000175400017540000001250013175713336016374 0ustar00biocbuildbiocbuild\name{graphAM-class} \docType{class} \alias{graphAM-class} \alias{graphAM} \alias{addEdge,character,character,graphAM,missing-method} \alias{addNode,character,graphAM,missing-method} \alias{clearNode,character,graphAM-method} \alias{coerce,graphAM,graphNEL-method} \alias{coerce,graphAM,matrix-method} \alias{coerce,matrix,graphAM-method} \alias{coerce,graphAM,graphBAM-method} \alias{edges,graphAM,missing-method} \alias{edges,graphAM,character-method} \alias{initialize,graphAM-method} \alias{inEdges,missing,graphAM-method} \alias{inEdges,character,graphAM-method} \alias{inEdges,graphAM,missing-method} \alias{isAdjacent,graphAM,character,character-method} \alias{nodes<-,graphAM,character-method} \alias{nodes,graphAM-method} \alias{numEdges,graphAM-method} \alias{numNodes,graphAM-method} \alias{removeEdge,character,character,graphAM-method} \alias{removeNode,character,graphAM-method} \title{Class "graphAM"} \description{ A graph class where node and edge information is represented as an adjacency matrix. The adjacency matrix is square and element \code{adjMat[i, j]} is one if there is an edge from node i to node j and zero otherwise. } \details{ The non-zero matrix values can be used to initialize an edge attribute. If this is desired, use the \code{values} argument in the call to \code{new} and provide a list with a single named element. The name determines the attributes and the value provides the default value for that attribute. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{graphAM(adjMat, edgemode, values)}. } \section{Slots}{ \describe{ \item{\code{adjMat}:}{An adjacency \code{"matrix"} describing the graph structure. The \code{\link{colnames}} of the matrix will be used as node names for the graph if present.} \item{\code{edgeData}:}{Storage for edge attributes.} \item{\code{nodeData}:}{Storage for node attributes.} } } \section{Extends}{ Class \code{"graph"}, directly. } \section{Constructor}{ \code{graphAM(adjMat=matrix(integer(), 0, 0), edgemode='undirected', values=NA)} creates a graphAM instance. \describe{ \item{adjMat}{An \code{integer} matrix specifying which nodes have edges between them.} \item{edgemode}{Either "directed" or "undirected".} \item{values}{A named list of length 1, used (rather obscurely) to specify that non-zero adjMat values initialize an edge attribute. The name of the single element in that list becomes the name of that attribute, with the specified default value. This default value is, however, never used: the specified edge attribute always has the value contained in the adjacency matrix, which is traditionally 1, but can be any positive number.} } } \section{Methods}{ \describe{ \item{addEdge}{\code{signature(from = "character", to = "character", graph = "graphAM", weights = "missing")}: ... } \item{addNode}{\code{signature(object = "graphAM", nodes = "character")}: ... } \item{clearNode}{\code{signature(node = "character", object = "graphAM")}: ... } \item{coerce}{\code{signature(from = "graphAM", to = "graphNEL")}: ... } \item{coerce}{\code{signature(from = "graphAM", to = "graphBAM")}: ... } \item{coerce}{\code{signature(from = "graphAM", to = "matrix")}: In converting to a \code{matrix}, if an edge attribute named \code{"weight"} is defined, the non-zero elements of the matrix will contain the corresponding attribute value. For more flexible matrix conversion, see \code{toMatrix}.} \item{coerce}{\code{signature(from = "matrix", to = "graphAM")}: This coerce method exists for symmetry. In most cases, creating a new \code{graphAM} instance using \code{new} gives one more control over the resulting graph.} \item{edges}{\code{signature(object = "graphAM", which = "missing")}: ... } \item{edges}{\code{signature(object = "graphAM", which = "character")}: ... } \item{initialize}{\code{signature(.Object = "graphAM")}: ... } \item{inEdges}{\code{signature(node = "character", object = "graphNEL")}: Return the incoming edges for the specified nodes. See \code{\link{inEdges}}.} \item{isAdjacent}{\code{signature(object = "graphAM", from = "character", to = "character")}: ... } \item{nodes<-}{\code{signature(object = "graphAM", value = "character")}: ... } \item{nodes}{\code{signature(object = "graphAM")}: ... } \item{numEdges}{\code{signature(graph = "graphAM")}: ... } \item{numNodes}{\code{signature(object = "graphAM")}: ... } \item{removeEdge}{\code{signature(from = "character", to = "character", graph = "graphAM")}: ... } \item{removeNode}{\code{signature(node = "character", object = "graphAM")}: ... } } } \author{Seth Falcon} \seealso{ \code{\link{graph-class}}, \code{\link{graphNEL-class}} } \examples{ mat <- rbind(c(0, 0, 1, 1), c(0, 0, 1, 1), c(1, 1, 0, 1), c(1, 1, 1, 0)) rownames(mat) <- colnames(mat) <- letters[1:4] g1 <- graphAM(adjMat=mat) stopifnot(identical(mat, as(g1, "matrix")), validObject(g1)) ## now with weights: mat[1,3] <- mat[3,1] <- 10 gw <- graphAM(adjMat=mat, values=list(weight=1)) ## consistency check: stopifnot(identical(mat, as(gw, "matrix")), validObject(gw), identical(gw, as(as(gw, "graphNEL"), "graphAM"))) } \keyword{graphs} \keyword{classes} graph/man/graphBAM-class.Rd0000644000175400017540000002654713175713336016516 0ustar00biocbuildbiocbuild\name{graphBAM-class} \Rdversion{1.1} \docType{class} \alias{graphBAM-class} \alias{addEdge,character,character,graphBAM,missing-method} \alias{addEdge,character,character,graphBAM,numeric-method} \alias{edgemode<-,graphBAM,character-method} \alias{clearNode,character,graphBAM-method} \alias{edges,graphBAM,missing-method} \alias{edges,graphBAM,character-method} \alias{inEdges,character,graphBAM-method} \alias{initialize,graphBAM-method} \alias{isAdjacent,graphBAM,character,character-method} \alias{nodes,graphBAM-method} \alias{show,graphBAM-method} \alias{numEdges,graphBAM-method} \alias{numNodes,graphBAM-method} \alias{removeEdge,character,character,graphBAM-method} \alias{removeNode,character,graphBAM-method} \alias{edgeWeights,graphBAM-method} \alias{edgeWeights,graphBAM,character-method} \alias{edgeWeights,graphBAM,numeric-method} \alias{edgeWeights,graphBAM,missing-method} \alias{edgeData,graphBAM,character,character,character-method} \alias{edgeData,graphBAM,character,missing,character-method} \alias{edgeData,graphBAM,missing,character,character-method} \alias{edgeData,graphBAM,missing,missing,missing-method} \alias{edgeData,graphBAM,missing,missing,character-method} \alias{edgeData<-,graphBAM,character,character,character-method} \alias{edgeData<-,graphBAM,missing,character,character-method} \alias{edgeData<-,graphBAM,character,missing,character-method} \alias{edgeData<-,graphBAM,missing,missing,character-method} \alias{edgeData<-,graphBAM,character,character,character,ANY-method} \alias{edgeData<-,graphBAM,missing,character,character,ANY-method} \alias{edgeData<-,graphBAM,character,missing,character,ANY-method} \alias{edgeData<-,graphBAM,missing,missing,character,ANY-method} \alias{edgeDataDefaults<-,graphBAM,character,ANY-method} \alias{edgeDataDefaults<-,graphBAM,missing,list-method} \alias{nodeDataDefaults<-,graphBAM,missing,list-method} \alias{graphBAM} \alias{coerce,graphBAM,graphAM-method} \alias{coerce,graphBAM,graphNEL-method} \alias{coerce,graphBAM,matrix-method} \alias{extractFromTo,graphBAM-method} \alias{ugraph,graphBAM-method} \alias{adj,graphBAM,character-method} \alias{graphIntersect} \alias{graphIntersect,graphBAM,graphBAM-method} \alias{graphUnion} \alias{graphUnion,graphBAM,graphBAM-method} \alias{nodes<-,graphBAM,character-method} \alias{removeEdgesByWeight} \alias{removeEdgesByWeight,graphBAM-method} \alias{nodeDataDefaults,graphBAM,character-method} \alias{nodeDataDefaults,graphBAM,missing-method} \alias{nodeDataDefaults<-,graphBAM,character,ANY-method} \alias{nodeDataDefaults<-,graphBAM,missing,ANY-method} \alias{nodeData,graphBAM,character,character-method} \alias{nodeData,graphBAM,character,missing-method} \alias{nodeData,graphBAM,missing,character-method} \alias{nodeData,graphBAM,missing,missing-method} \alias{nodeData<-,graphBAM,character,character-method} \alias{nodeData<-,graphBAM,missing,character-method} \title{EXPERIMENTAL class "graphBAM"} \description{ The graphBAM class represents a graph as an adjacency matrix. The adjacency matrix is stored as a bit array using a \code{raw} vector to reduce the memory footprint and speed operations like \code{graphIntersection}. This class is EXPERIMENTAL and its API is subject to change. } \usage{ graphBAM(df, nodes=NULL, edgemode="undirected", ignore_dup_edges = FALSE) } \arguments{ \item{df}{ A \code{data.frame} with three columns: "from", "to" and "weight". Columns "from" and "to" can be either factors or character vectors. Each row of \code{df} describes an edge in the resulting graph. The "weight" column must be numeric. } \item{nodes}{ A character vector of node labels. Use this to add degree zero nodes to the graph. If \code{NULL}, the set of nodes found in \code{from} and \code{to} will be used. } \item{edgemode}{ A string, one of "directed" or "undirected". } \item{ignore_dup_edges}{ If \code{FALSE} (default), specifying duplicate edges in the input is an error. When set to \code{TRUE} duplicate edges are ignored. Edge weight values are ignored when determining duplicates. This is most useful for graph import and conversion. } } \section{Constructors}{ The \code{GraphBAM} function is used to create new \code{graphBAM} instances. Edges are specified in a \code{data.frame}. For undirected graphs, reciprical edges should not be includes unless \code{ignoe_dup_edges} is \code{TRUE}. } \section{Extends}{ Class \code{"\linkS4class{graph}"}, directly. } \section{Methods for graphBAM objects}{ \describe{ \item{\code{addEdge(from, to, graph, weights)}}{ Return a new \code{graphBAM} object with the specified edge(s) added. The \code{from} and \code{to} arguments must either be the same length or one of them must be of length one. Each time an edge is added, the entire graph is copied. For the purpose of building a graph it will often be more efficient to build up the list of edges and call \code{GraphBAM}. } \item{\code{addNode(node, object)}}{ Return a new \code{graphBAM} object with the specified node(s) added. } \item{\code{clearNode(node, object)}}{ This operation is not currently supported. } \item{\code{edges(object, which)}}{ Returns an adjacency list representation of the graph. The list will have an entry for each node with a vector of adjacent node labels or \code{character(0)}. For undirected graphs, \code{edges} returns the reciprocal edges. The optional argument \code{which} can be a character vector of node labels. When present, only entries for the specified nodes will be returned. } \item{\code{inEdges(node, object)}}{ (Not yet supported) Similar to the \code{edges} function, but the adjacency list maps nodes that have an edge to the given node instead of from the given node. } \item{\code{isAdjacent(object, from, to)}}{ Returns a logical vector indicating whether there is an edge corresponding to the elements in \code{from} and \code{to}. These vectors must have the same length, unless one has length one. } \item{\code{nodes(object)}}{ Return the node labels for the graph } \item{\code{numEdges(object)}}{ Returns the number of edges in the graph. } \item{\code{numNodes(object)}}{ Returns the number of nodes in the graph } \item{\code{removeEdge(from, to, graph)}}{ Return a new \code{graphBAM} object with the specified edges removed. The \code{from} and \code{to} arguments must be the same length unless one of them has length one. } \item{\code{removeNode(node, object)}}{ Returns a new \code{graphBAM} object with the specified node removed. Node and edge attributes corresponding to that node are also removed. } \item{\code{edgeData(self, from, to, attr)}}{ Access edge attributes. See help for \code{edgeData}. } \item{\code{edgeDataDefaults(self, attr)}}{ Access edge data default attributes . } \item{\code{nodeDataDefaults(self, attr)}}{ Access node data default attributes . } \item{\code{edgeWeights(object, index)}}{ Return the edge weights for the graph in adjacency list format. The optional argument \code{index} specified a character vector of nodes. In this case, only the weights for the specified nodes will be returned. } \item{\code{extractFromTo(g)}}{ Returns a data frame with column names "from", "to", and "weight" corresponding to the connected nodes in the graphBAM object. } \item{\code{graphIntersect(x, y, nodeFun, edgeFun)}}{ When given two \code{graphBAM} objects, \code{graphIntersect} returns a new \code{graphBAM} containing the nodes and edges in common between the two graphs. Both x and y should either be directed or undirected. The intersection is computed by first finding the intersection of the node sets, obtaining the resulting subgraphs, and finding the intersection of the resulting edge sets. Node/Edge attributes that are equal are carried over to the result. Non equal edge/node attributes will result in the corresponding attribute being set to NA. The user has the option of providing a named list of functions correspoding to the names of the edge attributes for resolving conflicting edge attributes. For resolving any of the conflicting node attributes the user has the option of providing a named \code{list} of functions corresponding to the node attribute names. } \item{\code{graphUnion(x, y, nodeFun, edgeFun)}}{ When given two \code{graphBAM} objects, \code{graphUnion} returns a new \code{graphBAM} containing the union of nodes and edges between the two graphs. The union is compted by first finding the union of the nodesets. Both x and y should be either directed or undirected. Node/Edge attributes that are equal are carried over to the result. Non equal edge/node attributes will result in the corresponding attribute being set to NA. The user has the option of providing a named list of functions correspoding to the names of the edge attributes for resolving conflicting edge attributes. For resolving any of the conflicting node attributes the user has the option of providing a named \code{list} of functions corresponding to the node attribute names. } \item{\code{edgemode(object) <- value}}{ Set the edgemode for the graph ("directed" or "undirected"). If the specified edgemode is the same, the object is returned without changes. Otherwise, a directed graph is converted to an undirected graph via \code{ugraph} and an undirected graph is returned such that each edge is interpreted as two edges, one in each direction. } \item{\code{ugraph(graph)}}{ Return an undirected version of the current graph. Conceptually, the arrows of a graph's directed edges are removed. } \item{\code{nodes(object) <- value}}{ Replacement of a \code{graphBAM} object's node labels is currently not supported. An error is raised if this method is called. } } } \section{Coercion}{ \code{graphBAM} objects can be coerced to \code{graphAM}, \code{graphNEL}, and \code{matrix} instances via \code{as(g, CLASS)}. } \author{N. Gopalakrishnan, S. Falcon} \examples{ f <- c("a", "a", "b", "c", "d") t <- c("b", "c", "c", "d", "a") weight <- c(2.3, 2.3, 4.3, 1.0, 3.0) df <- data.frame(from=f, to=t, weight= weight) g <- graphBAM(df) nd <- nodes(g) nodeDataDefaults(g, attr ="color") <- "green" nodeData(g,n=c("b", "c"), attr ="color") <- "red" w1 <- edgeWeights(g) w2 <- edgeWeights(g,"a") w3 <- edgeWeights(g,1) d1 <- edges(g) d2 <- edges(g,c("a", "b")) e1 <- edgeData(g) e2 <- edgeData(g, "a", "c",attr="weight") em <- edgeMatrix(g) id <- isDirected(g) sg <- subGraph(c("a","c","d"), g) ft <- extractFromTo(g) am <- as(g,"graphAM") nl <- as(g,"graphNEL") mt <- as(g,"matrix") k <- graphIntersect(g,g) k <- graphUnion(g,g) e <- removeEdgesByWeight(g,lessThan= 3.0) f <- removeNode("a", g) g } \keyword{classes} graph/man/graphExamples.Rd0000644000175400017540000000064513175713336016561 0ustar00biocbuildbiocbuild\name{graphExamples} \alias{graphExamples} \docType{data} \title{A List Of Example Graphs} \description{ This data set contains a list of example \code{graphNEL} objects, which can then be used for plotting. } \usage{data(graphExamples)} \source{ Various sources, primarily from \code{\link{randomGraph}} and \code{\link{randomEGraph}} } \examples{ data(graphExamples) a <- graphExamples[[1]] a } \keyword{datasets} graph/man/graphNEL-class.Rd0000644000175400017540000001457113175713336016527 0ustar00biocbuildbiocbuild\name{graphNEL-class} \docType{class} \alias{graphNEL-class} \alias{graphNEL} \alias{coerce} \alias{edgeL} \alias{edges} \alias{edges} \alias{initialize} \alias{nodes<-} \alias{nodes} \alias{addEdge,character,character,graphNEL,numeric-method} \alias{addEdge,character,character,graphNEL,missing-method} \alias{addNode,character,graphNEL-method} \alias{adj,graphNEL,ANY-method} \alias{clearNode,character,graphNEL-method} \alias{coerce,graphNEL,generalGraph-method} \alias{coerce,graphNEL,graphAM-method} \alias{coerce,graphNEL,graphBAM-method} \alias{edgeL,graphNEL-method} \alias{edges,graphNEL,missing-method} \alias{edges,graphNEL,character-method} \alias{edgeWeights,graphNEL-method} \alias{inEdges,graphNEL,missing-method} \alias{inEdges,missing,graphNEL-method} \alias{inEdges,character,graphNEL-method} \alias{initialize,graphNEL-method} \alias{nodes<-,graphNEL,character-method} \alias{nodes,graphNEL-method} \alias{numNodes,graphNEL-method} \alias{removeEdge,character,character,graphNEL-method} \alias{removeNode,character,graphNEL-method} \alias{toGXL,graphNEL-method} \title{Class "graphNEL"} \description{ This is a class of graphs that are represented in terms of nodes and an edge list. This is a suitable representation for a graph with a large number of nodes and relatively few edges. } \section{Slots}{ \describe{ \item{\code{nodes}:}{Object of class \code{"vector"}.} \item{\code{edgeL}:}{Object of class \code{"list"}. The \code{edgeL} must be the same length as \code{nodes}. The elements of this vector correspond to the same element in \code{nodes}. The elements are themselves lists. If the node has any edges then this list will have an element named \code{edges}. This will eventually change. Since edge weights are now stored in the edge attributes construct, we do not need the extra level of list. } } } \section{Extends}{ Class \code{"graph"}, directly. } \section{Constructor}{ \code{graphNEL(nodes=character(), edgeL=list(), edgemode='undirected')} creates a graphNEL instance. \describe{ \item{nodes}{A character vector of node labels.} \item{edgeL}{A named list either in the format returned by the \code{edges} method or a list of lists where each inner list has an element named \code{edges} and optionally an element named \code{weights}. If \code{weights} is present, it must be the same length as the \code{edges} element.} \item{edgemode}{Either "directed" or "undirected".} } } \section{Methods}{ \describe{ \item{adj}{\code{signature(object = "graphNEL")}: A method for finding nodes adjacent to the suplied node.} \item{edgeL}{\code{signature(graph = "graphNEL")}: A method for obtaining the edge list.} \item{edgeWeights}{\code{signature(object = "graphNEL")}: A method for obtaining the edge weights. } \item{edges}{\code{signature(object = "graphNEL")}: A method for obtaining the edges.} \item{inEdges}{\code{signature(node = "character", object = "graphNEL")}: Return the incoming edges for the specified nodes. See \code{\link{inEdges}}.} \item{nodes}{\code{signature(object = "graphNEL")}: A method for obtaining the nodes. } \item{numNodes}{\code{signature(object = "graphNEL")}:A method for determining how many nodes are in the graph. } \item{subGraph}{\code{signature(snodes="character", graph = "graphNEL")}:A method for obtaining the induced subgraph based on the set of supplied nodes and the supplied graph.} \item{plot}{Please see the help page for \code{plot.graphNEL} in the \code{Rgraphviz} package} \item{graph2graphviz}{\code{signature(object = "graphNEL")}: A method that will convert a \code{graphNEL} object into a matrix suitable for interaction with \code{Rgraphviz}. Not intended to be called directly. This function will insure that no NA's (or other undesired values) are in the graph, or created by coersion.} \item{nodes<-}{\code{signature(object="graphNEL", value="character")}: A method for replacing the nodes in a graph object. It checks to be sure the values are the right length and unique. } \item{coerce}{\code{signature(from = "graphNEL", to = "graphAM")}: Called via \code{as}, the method converts to an adjacency matrix representation. See \code{\link{graphAM-class}}. } \item{coerce}{\code{signature(from = "graphNEL", to = "graphBAM")}: Called via \code{as}, the method converts to an bit array representation. See \code{\link{graphBAM-class}}. } } } \details{ The \code{graphNEL} class provides a very general structure for representing graphs. It will be reasonably efficient for lists with relatively more nodes than edges. Although this representation can support multi-edges, such support is not implemented and instances of \code{graphNEL} are assumed to be simple graphs with at most one edge between any pair of nodes. The \code{edgeL} is a named \code{list} of the same length as the node vector. The names are the names of the nodes. Each element of \code{edgeL} is itself a list. Each element of this (sub)list is a vector (all must be the same length) and each element represents an edge to another node. The sublist named \code{edges} holds index values into the node vector. And each such entry represents an edge from the node which has the same name as the component of \code{edgeL} to the node with index provided. Another component that is often used is named \code{weights}. It represents edge weights. The user can specify any other edge attributes (such as types etc). They are responsible for any special handling that these might require. For an \code{undirected} instance all edges are reciprocated (there is an edge from A to B and from B to A). Note that the reason for using indices to represent the \code{to} end of a node is so that we can easily support permutation of the node labels as a way to generate randomizations of the graph. } \author{R. Gentleman} \seealso{\code{\link{graphAM-class}}, \code{\link{distGraph-class}}, \code{\link{clusterGraph-class}} } \examples{ set.seed(123) V <- LETTERS[1:4] edL <- vector("list", length=4) names(edL) <- V for(i in 1:4) edL[[i]] <- list(edges=5-i, weights=runif(1)) gR <- graphNEL(nodes=V, edgeL=edL) edges(gR) edgeWeights(gR) } \keyword{classes} graph/man/inEdges.Rd0000644000175400017540000000216313175713336015334 0ustar00biocbuildbiocbuild\name{inEdges} \alias{inEdges} \title{Generic Method inEdges} \description{ Returns a list of all incoming edges for the specified nodes. } \usage{ inEdges(node, object) } \arguments{ \item{node}{character vector of node names} \item{object}{a \code{graph} object} } \details{ If no \code{node} argument is specified, \code{inEdges} returns the incoming edges for all nodes in the graph. For an undirected graph, \code{inEdges} returns all edges for the specified nodes. } \value{ A list with length matching the length of \code{node}. If \code{node} was missing, a list containing an element for each node in the graph. Each list element contains a character vector of node names giving the nodes that have outgoing edges to the node given by the name of the list element. } \author{R. Gentleman} \seealso{\code{\link{removeNode}}, \code{\link{clearNode}}} \examples{ V <- LETTERS[1:4] edL3 <- vector("list", length=4) for(i in 1:4) edL3[[i]] <- list(edges=(i\%\%4)+1, weights=i) names(edL3) <- V gR3 <- graphNEL(nodes=V, edgeL=edL3, "directed") inEdges(c("A", "B"), gR3) } \keyword{ manip} graph/man/internal.Rd0000644000175400017540000000037013175713336015570 0ustar00biocbuildbiocbuild\name{internal} \alias{nullgraphID} \title{Variables used for internal purposes} \description{ The \code{nullgraphID} variable is used to store a default identifier. This should not be used by users. } \author{Saikat DebRoy} \keyword{internal} graph/man/isAdjacent-methods.Rd0000644000175400017540000000153413175713336017465 0ustar00biocbuildbiocbuild\name{isAdjacent-methods} \docType{methods} \alias{isAdjacent-methods} \alias{isAdjacent} \title{Determine if nodes share an edge in a graph} \usage{ isAdjacent(object, from, to, ...) } \arguments{ \item{object}{An instance of a subclass of \code{\link{graph-class}}.} \item{from}{A \code{character} vector of nodes in the graph.} \item{to}{A \code{character} vector of nodes in the graph} \item{...}{May be used by methods called on subclasses of \code{graph}} } \description{ For a given subclass of \code{graph-class}, returns \code{TRUE} if the graph contains an edge from node specified by \code{from} to the node specified by \code{to}. The appropriate logical vector will be returned as long as \code{from} and \code{to} have the same length and contain nodes in the graph object specified by \code{object}. } \keyword{methods} graph/man/isDirected-methods.Rd0000644000175400017540000000071013175713336017472 0ustar00biocbuildbiocbuild\name{isDirected-methods} \docType{methods} \alias{isDirected-methods} \alias{isDirected} \title{Determine if a graph has directed or undirected edges} \usage{ isDirected(object) } \arguments{ \item{object}{A \code{graph-class} instance} } \description{ The edges of a \code{\link{graph-class}} object are either directed or undirected. This function returns \code{TRUE} if the edges are directed and \code{FALSE} otherwise. } \keyword{methods} graph/man/leaves.Rd0000644000175400017540000000174413175713336015241 0ustar00biocbuildbiocbuild\name{leaves} \alias{leaves} \alias{leaves,graph-method} \title{Find the leaves of a graph} \description{ A leaf of an undirected graph is a node with degree equal to one. A leaf of a directed graph is defined with respect to in-degree or out-degree. The leaves of a directed graph with respect to in-degree (out-degree) are those nodes with in-degree (out-degree) equal to zero. } \usage{ leaves(object, degree.dir) } \arguments{ \item{object}{A \code{graph} object} \item{degree.dir}{One of \code{"in"} or \code{"out"}. This argument is ignored when \code{object} is undirected and required otherwise. When \code{degree.dir="in"} (\code{degree.dir="out"}), nodes have no in coming (out going) edges will be returned. } } \value{ A character vector giving the node labels of the leaves. } \author{Seth Falcon} \examples{ data(graphExamples) graphExamples[[1]] leaves(graphExamples[[1]]) data(apopGraph) leaves(apopGraph, "in") leaves(apopGraph, "out") } graph/man/listEdges.Rd0000644000175400017540000000223613175713336015702 0ustar00biocbuildbiocbuild\name{listEdges} \alias{listEdges} \title{List the Edges of a Graph } \description{ A list where each element contains all edges between two nodes, regardless of orientation. The list has names which are node pairs, in lexicographic order, and elements all edges between those nodes. } \usage{ listEdges(object, dropNULL=TRUE) } \arguments{ \item{object}{An instance of the \code{\link{graphNEL-class}} class. } \item{dropNULL}{Should those node pairs with no edges be dropped from the returned list. } } \details{ The function is currently only implemented for graphs of the \code{\link{graphNEL-class}}. The edges in the returned list are instances of the \code{\link{simpleEdge-class}}. } \value{ A named list of \code{\link{simpleEdge-class}} objects. } \author{R. Gentleman} \seealso{\code{\link{simpleEdge-class}}, \code{\link{edges}}} \examples{ set.seed(123) V <- LETTERS[1:4] edL <- vector("list", length=4) names(edL) <- V toE <- LETTERS[4:1] for(i in 1:4) edL[[i]] <- list(edges=5-i, weights=runif(1)) gR <- graphNEL(nodes=V, edgeL=edL) listEdges(gR) } \keyword{manip} graph/man/matrix2Graph.Rd0000644000175400017540000000772013175713336016332 0ustar00biocbuildbiocbuild\name{Coercions between matrix and graph representations} \alias{aM2bpG} \alias{ftM2adjM} \alias{ftM2graphNEL} \alias{coerce,matrix,graphNEL-method} \alias{coerce,graphNEL,matrix-method} \title{Coercions between matrix and graph representations} \description{ A collection of functions and methods to convert various forms of matrices into graph objects. } \usage{ aM2bpG(aM) ftM2adjM(ft, W=NULL, V=NULL, edgemode="directed") ftM2graphNEL(ft, W=NULL, V=NULL, edgemode="directed") \S4method{coerce}{graphNEL,matrix}(from,to="matrix",strict=TRUE) \S4method{coerce}{matrix,graphNEL}(from,to="graphNEL",strict=TRUE) } \arguments{ \item{ft}{An nx2 matrix containing the \code{from/to} representation of graph edges.} \item{W}{An optional vector of edge weights.} \item{V}{An optional vector of node names.} \item{aM}{An affiliation matrix for a bipartite graph.} \item{edgemode}{Character. Specifies if the resulting graph is to be directed or undirected.} \item{from}{Object to coerce from, either of type \code{matrix} or \code{grpahNEL}} \item{to}{Character giving class to coerce to. Either "matrix" or "graphNEL".} \item{strict}{Strict object checking.} } \details{ In the functions \code{ftM2adjM} and \code{ftM2graphNEL}, a \code{from/to} matrix \code{ft} is converted into an \code{adjacency} matrix or a \code{graphNEL} object respectively. In \code{ft}, the first column represents the \code{from} nodes and the second column the \code{to} nodes. To have unconnected nodes, use the \code{V} argument (see below). The \code{edgemode} parameter can be used to specify if the desired output is a directed or undirected graph. The same edge must not occur twice in the \code{from/to} matrix. If \code{edgemode} is \code{undirected}, the edge \code{(u,v)} and \code{(v,u)} must only be specified once. \code{W} is an optional vector of edge weights. The order of the edge weights in the vector should correspond to the order of the edges recorded in \code{ft}. If it is not specified, edge weights of 1 are assigned by default. \code{V} is an optional vector of node names. All elements of \code{ft} must be contained in \code{V}, but not all names in \code{V} need to be contained in \code{ft}. If \code{V} is not specified, it is set to all nodes represented in \code{ft}. Specifying \code{V} is most useful for creating a graph that includes nodes with degree 0. \code{aM} is an affiliation matrix as frequently used in social networks analysis. The rows of \code{aM} represent actors, and the columns represent events. An entry of "1" in the ith row and jth column represents affiliation of the ith actor with the jth event. Weighted entries may also be used. \code{aM2bpG} returns a \code{graphNEL} object with nodes consisting of the set of actors and events, and directed (possibly weighted) edges from the actors to their corresponding events. If plotted using \code{Rgraphviz} and the \code{dot} layout, the bipartite structure of the graph returned by \code{aM2bpG} should be evident. An \code{adjacency} matrix can be coerced into a \code{graphNEL} using the \code{as} method. If the matrix is a symmetric matrix, then the resulting graph will be \code{undirected}, otherwise it will be \code{directed}. } \value{ For \code{ftM2graphNEL} and \code{aM2bpG}, an object of class \code{graphNEL}. For \code{ftM2adjM}, a matrix (the adjacency matrix representation). } \author{Denise Scholtens, Wolfgang Huber} \examples{ ## From-To matrix From <- c("A","A","C","C") To <- c("B","C","B","D") L <- cbind(From,To) W <- 1:4 M1 <- ftM2adjM(L, W, edgemode="directed") M2 <- ftM2adjM(L, W, edgemode="undirected") stopifnot(all(M1+t(M1)==M2)) G1 <- ftM2graphNEL(L, W, edgemode="directed") G2 <- ftM2graphNEL(L, W, edgemode="undirected") ## Adjacency matrix From <- matrix(runif(100), nrow=10, ncol=10) From <- (From+t(From)) > pi/4 rownames(From) <- colnames(From) <- LETTERS[1:10] To <- as(From,"graphNEL") Back <- as(To,"matrix") stopifnot(all(From == Back)) } \keyword{graphs } graph/man/mostEdges.Rd0000644000175400017540000000145013175713336015706 0ustar00biocbuildbiocbuild\name{mostEdges} \alias{mostEdges} \title{ Find the node in a graph with the greatest number of edges } \description{ \code{mostEdges} finds the node that has the most edges in the graph. This is the node with the highest degree. } \usage{ mostEdges(objGraph) } \arguments{ \item{objGraph}{ the graph object } } \value{ \item{index}{the index of the node with the most edges} \item{id}{the node value with the most edges; may be affy id, locus link id, or genename depending on the node type} \item{maxLen}{the number of edges for that node} } \author{ Elizabeth Whalen } \seealso{ \code{\link{numEdges}}, \code{\link{aveNumEdges}}, \code{\link{numNoEdges}} } \examples{ set.seed(123) g1 <- randomGraph(11:30, letters[20:26], p=.4) mostEdges(g1) } \keyword{ manip } graph/man/multigraph.Rd0000644000175400017540000000373513175713336016140 0ustar00biocbuildbiocbuild\name{multiGraph-class} \docType{class} \alias{multiGraph-class} \alias{edgeSet-class} \alias{edgeSetNEL-class} \alias{edgeSetAM-class} \alias{show,multiGraph-method} \alias{show,edgeSet-method} \alias{isDirected,multiGraph-method} \alias{isDirected,edgeSet-method} \alias{edgemode,edgeSet-method} \alias{nodes,multiGraph-method} \alias{nodes,edgeSetAM-method} \alias{numNodes,multiGraph-method} \alias{edges,multiGraph,missing-method} \alias{edges,multiGraph,character-method} \alias{edges,edgeSetAM,character-method} \alias{edges,edgeSetNEL,character-method} \alias{numEdges,edgeSetAM-method} \alias{numEdges,multiGraph-method} \title{Class "multiGraph" } \description{A collection of classes to model multigraphs. These include the multiGraph class as well as classes to contain edge sets. } \section{Objects from the Class}{ Objects can be created from the \code{multiGraph} class, the \code{edgeSet} class is virtual, and particular variants should be used. } \section{Slots}{ These slots are for the multiGraph class. \describe{ \item{nodes}{The names of the nodes.} \item{edgeL}{A list of edge lists.} \item{nodeData}{An instance of the \code{attrData} class.} \item{graphData}{A list.} } These slots are for the \code{edgeSet} class, or one of its sublcasses. \describe{ \item{edgeData}{An instance of the \code{attrData} class.} \item{edgemode}{A character vector, one of directed, or undirected.} \item{edgeL}{A list of the edges (graphNEL)} \item{adjMat}{An adjacency matrix (graphAM)} } } \section{Methods}{ \describe{ \item{show}{Print a multigraph.} \item{isDirected}{A vector indicating which of the edgeSets is directed.} \item{nodes}{Retrieve the node names} \item{numNodes}{Return the number of nodes} \item{edges}{Return either all edges, or a subset of them, depending on the arguments supplied.} \item{numEdges}{Return a vector with the number of edges, for each edge set.} } } \keyword{classes} graph/man/nodeData-methods.Rd0000644000175400017540000000155613175713336017143 0ustar00biocbuildbiocbuild\name{nodeData-methods} \docType{methods} \alias{nodeData-methods} \alias{nodeData<--methods} \alias{nodeData} \alias{nodeData<-} \title{Get and set attributes for the nodes of a graph object} \description{ Attributes of the nodes of a graph can be accessed using \code{nodeData}. The attributes must be defined using \code{\link{nodeDataDefaults}}. You can ommit the \code{n} argument to retrieve attributes for all nodes in the graph. You can ommit the \code{attr} argument to retrieve all attributes. } \usage{ nodeData(self, n, attr) nodeData(self, n, attr) <- value } \arguments{ \item{self}{A \code{graph-class} instance} \item{n}{A \code{character} vector of node names} \item{attr}{A \code{character} vector of length one specifying the name of a node attribute} \item{value}{An R object to store as the attribute value} } \keyword{methods} graph/man/nodeDataDefaults-methods.Rd0000644000175400017540000000155113175713336020626 0ustar00biocbuildbiocbuild\name{nodeDataDefaults-methods} \docType{methods} \alias{nodeDataDefaults-methods} \alias{nodeDataDefaults<--methods} \alias{nodeDataDefaults} \alias{nodeDataDefaults<-} \title{Get and set default attributes for the nodes of a graph} \usage{ nodeDataDefaults(self, attr) nodeDataDefaults(self, attr) <- value } \arguments{ \item{self}{A \code{graph-class} instance} \item{attr}{A \code{character} vector of length one giving the name of an attribute} \item{value}{An R object to set as the default value for the given attribute} } \description{ You can associate arbitrary attributes with the nodes of a graph. Use \code{nodeDataDefaults} to specify the set of attributes that describe nodes. Each attribute must have a default value. You can set the attribute for a particular node or set of nodes using \code{\link{nodeData}}. } \keyword{methods} graph/man/numNoEdges.Rd0000644000175400017540000000114413175713336016020 0ustar00biocbuildbiocbuild\name{numNoEdges} \alias{numNoEdges} \title{ Calculate the number of nodes that have an edge list of NULL } \description{ \code{numNoEdges} calculates the number of nodes that have an edge list of NULL (i.e. no edges). } \usage{ numNoEdges(objGraph) } \arguments{ \item{objGraph}{ the graph object } } \value{ An integer representing the number of NULL edge lists in the graph. } \author{ Elizabeth Whalen } \seealso{ \code{\link{numEdges}}, \code{\link{aveNumEdges}}, \code{\link{mostEdges}} } \examples{ set.seed(999) g1 <- randomEGraph(letters, .01) numNoEdges(g1) } \keyword{ manip } graph/man/pancrCaIni.Rd0000644000175400017540000000153113175713336015763 0ustar00biocbuildbiocbuild\name{pancrCaIni} \alias{pancrCaIni} \non_function{} \title{ A graph encoding parts of the pancreatic cancer initiation pathway } \description{ A graph encoding parts of the pancreatic cancer initiation pathway } \usage{data(pancrCaIni)} \format{ The format is: Formal class 'graphNEL' [package "graph"] with edgemode "directed". } \source{ The KEGG pancreatic cancer pathway was visually inspected on 17 Sept 2007 and a subgraph was isolated. The HUGO names for each symbol in the KEGG visualization were obtained and checked for existance on hgu95av2. Some abbreviated terms for processes are also included as nodes. } %\references{ % %} \examples{ data(pancrCaIni) if (require(Rgraphviz)) { nat = rep(FALSE, length(nodes(pancrCaIni))) names(nat) = nodes(pancrCaIni) plot(pancrCaIni, nodeAttrs=list(fixedsize=nat)) } } \keyword{models} graph/man/randomEGraph.Rd0000644000175400017540000000253113175713336016324 0ustar00biocbuildbiocbuild\name{randomEGraph} \alias{randomEGraph} \title{ Random Edge Graph } \description{ A function to create random graphs according to a random edge model. The user supplies the set of nodes for the graph as \code{V} and either a probability, \code{p}, that is used for each edge or the number of edges, \code{edges} they want to have in the resulting graph. } \usage{ randomEGraph(V, p, edges) } \arguments{ \item{V}{The nodes for the graph. } \item{p}{ The probability of an edge being selected. } \item{edges}{ The number of edges wanted. } } \details{ The user must specify the set of nodes and either a probability for edge selection or the number of edges wanted, but not both. Let \code{nV} denote the number of nodes. There are \code{choose(nV, 2)} edges in the complete graph. If \code{p} is specified then a biased coin (probability of heads being \code{p}) is tossed for each edge and if it is heads that edge is selected. If \code{edges} is specified then that many edges are sampled without replacement from the set of possible edges. } \value{ An object of class \code{\link{graphNEL-class}} that contains the nodes and edges. } \author{R. Gentleman } \seealso{\code{\link{randomGraph}}} \examples{ set.seed(123) V <- letters[14:22] g1 <- randomEGraph(V, .2) g2 <- randomEGraph(V, edges=30) } \keyword{ manip } graph/man/randomGraph.Rd0000644000175400017540000000355213175713336016223 0ustar00biocbuildbiocbuild\name{randomGraph} \alias{randomGraph} \title{ Random Graph } \description{ This function generates a random graph according to a model that involves a latent variable. The construction is to randomly assign members of the set \code{M} to the nodes, \code{V}. An edge is assigned between two elements of \code{V} when they both have the same element of \code{M} assigned to them. An object of class \code{graphNEL} is returned. } \usage{ randomGraph(V, M, p, weights=TRUE) } \arguments{ \item{V}{The nodes of the graph. } \item{M}{A set of values used to generate the graph. } \item{p}{A value between 0 and 1 that indicates the probability of selecting an element of \code{M}} \item{weights}{A logical indicating whether to use the number of shared elements of \code{M} as weights. } } \details{ The model is quite simple. To generate a graph, \code{G}, the user supplies the list of nodes, \code{V} and a set of values \code{M} which will be used to create the graph. For each node in \code{V} a logical vector with length equal to the length of \code{M} is generated. The probability of a \code{TRUE} at any position is determined by \code{p}. Once valus from \code{M} have been assigned to each node in \code{V} the result is processed into a graph. This is done by creating an edge between any two elements of \code{V} that share an element of \code{M} (as chosen by the selection process). The sizes of \code{V} and \code{M} and the values of \code{p} determine how dense the graph will be. } \value{ An object of class \code{\link{graphNEL-class}} is returned. } \author{R. Gentleman } \seealso{\code{\link{randomEGraph}}, \code{\link{randomNodeGraph}} } \examples{ set.seed(123) V <- letters[1:10] M <- 1:4 g1 <- randomGraph(V, M, 0.2) numEdges(g1) # 16, in this case edgeNames(g1)# " ~ " since undirected } \keyword{graphs} graph/man/randomNodeGraph.Rd0000644000175400017540000000216513175713336017030 0ustar00biocbuildbiocbuild\name{randomNodeGraph} \alias{randomNodeGraph} \title{Generate Random Graph with Specified Degree Distribution} \description{ \code{randomNodeGraph} generates a random graph with the specified degree distribution. Self-loops are allowed. The resultant graph is directed (but can always be coerced to be undirected). } \usage{ randomNodeGraph(nodeDegree) } \arguments{ \item{nodeDegree}{A named integer vector specifying the node degrees. } } \details{ The input vector must be named, the names are taken to be the names of the nodes. The sum must be even (there is a theorem that says we require that to construct a graph). Self-loops are allowed, although patches to the code that make this a switchable parameter would be welcome. } \value{ An instance of the \code{graphNEL} class. The graph is directed. } \references{Random Graphs as Models of Networks, M. E. J. Newman. } \author{R. Gentleman} \seealso{\code{\link{randomGraph}}, \code{\link{randomEGraph}} } \examples{ set.seed(123) c1 <- c(a = 1, b = 1, c = 2, d = 4) (g1 <- randomNodeGraph(c1)) stopifnot(validObject(g1)) } \keyword{graphs} \keyword{manip} graph/man/removeEdge.Rd0000644000175400017540000000222713175713336016041 0ustar00biocbuildbiocbuild\name{removeEdge} \alias{removeEdge} \title{ removeEdge } \description{ A function to remove the specified edges from a graph. } \usage{ removeEdge(from, to, graph) } \arguments{ \item{from}{from edge labels } \item{to}{ to edge labels} \item{graph}{a \code{graph} object } } \details{ A new graph instance is returned with the edges specified by corresponding elements of the \code{from} and \code{to} vectors removed. If \code{from} and \code{to} are not the same length, one of them should have length one. All edges to be removed must exist in \code{graph}. } \value{ A new instance of a graph with the same class as \code{graph} is returned with the specified edges removed. } \author{R. Gentleman} \seealso{\code{\link{addNode}},\code{\link{addEdge}},\code{\link{removeNode}}} \examples{ V <- LETTERS[1:4] edL1 <- vector("list", length=4) names(edL1) <- V for(i in 1:4) edL1[[i]] <- list(edges=c(2,1,4,3)[i], weights=sqrt(i)) gR <- graphNEL(nodes=V, edgeL=edL1) gX <- removeEdge("A", "B", gR) set.seed(123) g <- randomEGraph(V=letters[1:5],edges=5) g2 <- removeEdge(from=c("a","b"), to=c("d","c"), g) } \keyword{manip} graph/man/removeNode.Rd0000644000175400017540000000220613175713336016057 0ustar00biocbuildbiocbuild\name{removeNode} \alias{removeNode} \title{ removeNode } \description{ A function to remove a node from a graph. All edges to and from the node are also removed. } \usage{ removeNode(node, object) } \arguments{ \item{node}{The label of the node to be removed. } \item{object}{The graph to remove the node from. } } \details{ The specified node is removed from the graph as are all edges to and from that node. A new instance of the same class as \code{object} with the specified node(s) is returned. Note, node can be a vector of labels, in which case all nodes are removed. This is similar to \code{\link{subGraph}}. } \value{ A new instance of a graph of the same class as \code{object} but with all specified nodes removed. } \author{R. Gentleman} \seealso{\code{\link{removeEdge}}, \code{\link{addEdge}}, \code{\link{addNode}},\code{\link{subGraph}} } \examples{ V <- LETTERS[1:4] edL2 <- vector("list", length=4) names(edL2) <- V for(i in 1:4) edL2[[i]] <- list(edges=c(2,1,2,1)[i], weights=sqrt(i)) gR2 <- graphNEL(nodes=V, edgeL=edL2, edgemode="directed") gX <- removeNode("C", gR2) } \keyword{manip} graph/man/renderInfo-class.Rd0000644000175400017540000001270513175713336017157 0ustar00biocbuildbiocbuild\name{renderInfo-class} \docType{class} \alias{renderInfo-class} \alias{edgeRenderInfo} \alias{edgeRenderInfo<-} \alias{nodeRenderInfo} \alias{nodeRenderInfo<-} \alias{parRenderInfo} \alias{parRenderInfo<-} \alias{graphRenderInfo} \alias{graphRenderInfo<-} \title{Class "renderInfo"} \description{A container class to manage graph rendering attributes. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("renderInfo")} or by using the initializer \code{.renderInfoPrototype}. } \section{Slots}{ \describe{ \item{\code{pars}:}{List of default rendering attributes with two items \code{nodes} and \code{edges}. When not set further down the parameter hierarchy, these defaults will be used for all nodes/edges in the graph. } \item{\code{nodes}:}{Named list of attributes specific to nodes. } \item{\code{edges}:}{Named list of attributes specific to edges. } \item{\code{graph}:}{Named list of graph-wide attributes. } } Each item of \code{nodes} and \code{edges} can take arbitrary vectors, the only restriction is that they have to be of either length 1 or length equal to the number of nodes or edges, respectively. \code{pars} and \code{graph} can take arbitrary skalars, the latter for both edges and nodes. } \section{Methods}{ The following are functions rather than methods and build the API to control the graphical output of a graph when it is plotted using \code{\link[Rgraphviz]{renderGraph}}. \describe{ \item{parRenderInfo, parRenderInfo<-}{getter and setter for items of slot \code{pars}} \item{nodeRenderInfo, nodeRenderInfo<-}{getter and setter for items of slot \code{nodes}} \item{edgeRenderInfo, edgeRenderInfo<-}{getter and setter for items of slot \code{edges}} \item{graphRenderInfo, graphRenderInfo<-}{getter and setter for items of slot \code{graph}} } The getters all take two arguments: \code{g} is a graph object and \code{name} is a character giving the name of one of the item in the respective slot. When \code{name} is missing this will give you the whole list. The setters are a bit more complex: \code{nodeRenderInfo<-} and \code{edgeRenderInfo<-} can take \describe{ \item{named list of named vectors}{where the names have to match the node or edge names. Items in the vector that don't match a valid edge or node name will be silently ignored. For undirected edges the order of head nodes and tail nodes in edge names is ignored, i.e. \code{a~b} is equivalent to code{b~a}} \item{named list of skalars}{which will set all the attribute for all edges or nodes in the graph} \code{parRenderInfo<-}{will only take a list with items \code{nodes}, \code{edges} and \code{graph}. The content of these list items can be arbitrary named vectors.} \code{parRenderInfo<-}{takes an arbitrary list} } Available rendering parameters for nodes are: \describe{ \item{col:}{ the color of the line drawn as node border. Defaults to \code{black}.} \item{lty:}{ the type of the line drawn as node border. Defaults to \code{solid}. Valid values are the same as for the R's base graphic parameter \code{lty}.} \item{lwd:}{ the width of the line drawn as node border. Defaults to \code{1}. Note that the underlying low level plotting functions do not support vectorized \code{lwd} values. Instead, only the first item of the vector will be used. } \item{fill:}{ the color used to fill a node. Defaults to \code{transparent}.} \item{textCol:}{ the font color used for the node labels. Defaults to \code{black}.} \item{fontsize: }{the font size for the node labels in points. Defaults to \code{14}. Note that the fontsize will be automatically adjusted to make sure that all labels fit their respective nodes. You may want to increase the node size by supplying the appropriate layout parameters to \code{Graphviz} in order to allow for larger fontsizes.} \item{cex:}{ Expansion factor to further control the fontsize. As default, this parameter is not set, in which case the fontsize will be clipped to the node size. This mainly exists to for consistency with the base graphic parameters and to override the clipping of fontsize to nodesize.} } Available rendering parameters for edges are: \describe{ \item{col:}{ the color of the edge line. Defaults to \code{black}.} \item{lty:}{ the type of the edge line. Defaults to \code{solid}. Valid values are the same as for the R's base graphic parameter \code{lty}.} \item{lwd:}{ the width of the edge line. Defaults to \code{1}.} \item{textCol:}{ the font color used for the edge labels. Defaults to \code{black}.} \item{fontsize:}{ the font size for the edge labels in points. Defaults to \code{14}.} \item{cex:}{ Expansion factor to further control the fontsize. This mainly exists to be consistent with the base graphic parameters.} } } \author{Deepayan Sarkar, Florian Hahne} \examples{ g <- randomGraph(letters[1:4], 1:3, p=0.8) nodeRenderInfo(g) <- list(fill=c("a"="red", "b"="green")) edgeRenderInfo(g) <- list(lwd=3) edgeRenderInfo(g) <- list(lty=3, col="red") parRenderInfo(g) <- list(edges=list(lwd=2, lty="dashed"), nodes=list(col="gray", fill="gray")) nodeRenderInfo(g) edgeRenderInfo(g, "lwd") edgeRenderInfo(g, c("lwd", "col")) parRenderInfo(g) } \keyword{classes} graph/man/reverseEdgeDirections.Rd0000644000175400017540000000164413175713336020245 0ustar00biocbuildbiocbuild\name{reverseEdgeDirections} \alias{reverseEdgeDirections} \title{Reverse the edges of a directed graph} \description{ Return a new directed graph instance with each edge oriented in the opposite direction relative to the corresponding edge in the input graph. } \usage{ reverseEdgeDirections(g) } \arguments{ \item{g}{A \code{graph} subclass that can be coerced to \code{graphAM}} } \details{ WARNING: this doesn't handle edge attributes properly. It is a preliminary implementation and subject to change. } \value{ A \code{graphNEL} instance } \author{S. Falcon} \examples{ g <- graphNEL(nodes=c("a", "b", "c"), edgeL=list(a=c("b", "c"), b=character(0), c=character(0)), edgemode="directed") stopifnot(isAdjacent(g, "a", "b")) stopifnot(!isAdjacent(g, "b", "a")) grev <- reverseEdgeDirections(g) stopifnot(!isAdjacent(grev, "a", "b")) stopifnot(isAdjacent(grev, "b", "a")) } \keyword{manip} graph/man/settings.Rd0000644000175400017540000000221113175713336015610 0ustar00biocbuildbiocbuild\name{graph.par} \alias{graph.par} \alias{graph.par.get} \title{Graphical parameters and other settings } \description{ Functions providing an interface to persistent graphical parameters and other settings used in the package. } \usage{ graph.par(...) graph.par.get(name) } \arguments{ \item{\dots}{ either character strings naming parameters whose values are to be retrieved, or named arguments giving values that are to be set. } \item{name}{ character string, giving a valid parameter name. } } \details{ \code{graph.par} works sort of like \code{\link{par}}, but the details are yet to be decided. \code{graph.par.get(name)} is equivalent to \code{graph.par(name)[[1]]} } \value{ In query mode, when no parameters are being set, \code{graph.par} returns a list containing the current values of the requested parameters. When called with no arguments, it returns a list with all parameters. When a parameter is set, the return value is a list containing previous values of these parameters. } \seealso{ \code{\link{par}} } \author{ Deepayan Sarkar, \email{deepayan.sarkar@r-project.org} } \keyword{utilities} graph/man/simpleEdge-class.Rd0000644000175400017540000000216713175713336017143 0ustar00biocbuildbiocbuild\name{simpleEdge-class} \docType{class} \alias{simpleEdge-class} \title{Class "simpleEdge".} \description{A simple class for representing edges in graphs.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("simpleEdge", ...)}. } \section{Slots}{ \describe{ \item{\code{edgeType}:}{Object of class \code{"character"}; the type of the edge.} \item{\code{weight}:}{Object of class \code{"numeric"}; the edge weight.} \item{\code{directed}:}{Object of class \code{"logical"}; is the edge directed. } \item{\code{bNode}:}{Object of class \code{"character"}; the beginning node. } \item{\code{eNode}:}{Object of class \code{"character"}; the ending node. } } } \section{Methods}{ No methods defined with class "simpleEdge" in the signature. } \author{R. Gentleman} \note{All slots are length one vectors (this is not currently checked for). If the edge is not directed there is no real meaning to the concepts of beginning node or ending node and these should not be interpreted as such. } \examples{ new("simpleEdge", bNode="A", eNode="D") } \keyword{classes} graph/man/standardLabeling.Rd0000644000175400017540000000251013175713336017210 0ustar00biocbuildbiocbuild\name{Standard labeling of edges with integers} \alias{ftM2int} \alias{int2ftM} \title{Standard labeling of edges with integers} \description{ Functions to convert between from-to representation and standard labeling of the edges for undirected graphs with no self-loops. } \usage{ ftM2int(ft) int2ftM(i) } \arguments{ \item{i}{Numeric vector.} \item{ft}{Numeric nx2 or 2xn matrix.} } \details{A standard 1-based node labeling of a graph G=(V,E) is a one-to-one mapping between the integers from 1 to |V| and the nodes in V. A standard 1-based edge labeling of an undirected graph G=(V,E) with no self-loops is \emph{the} one-to-one mapping between the integers from 1 to |V| choose 2 = |V|*(|V|-1)/2 such that the edge labeled 1 is between nodes 2 and 1, the edge labeled 2 is between nodes 3 and 1, the edge labeled 3 is between nodes 3 and 2, and so on. } \value{ For \code{ftM2int}, a numeric vector of length n. For \code{int2ftM}, a \code{length(i) x 2} matrix. } \author{Wolfgang Huber} \examples{ nNodes <- 200 nEdges <- choose(nNodes, 2) i <- 1:nEdges ft <- int2ftM(i) ft[1:6,] stopifnot(all(ft[,1]>ft[,2])) ## always from higher to lower stopifnot(!any(duplicated(paste(ft[,1], ft[,2])))) stopifnot(ft[nEdges, 1]==nNodes, ft[nEdges, 2]==nNodes-1) j <- ftM2int(ft) stopifnot(all(i==j)) } \keyword{graphs} graph/man/subGraph.Rd0000644000175400017540000000224713175713336015534 0ustar00biocbuildbiocbuild\name{subGraph} \alias{subGraph} \alias{subGraph,character,graphNEL-method} \alias{subGraph,character,clusterGraph-method} \alias{subGraph,character,distGraph-method} \alias{subGraph,character,MultiGraph-method} \alias{subGraph,character,graphBAM-method} \title{Create a Subgraph } \description{ Given a set of nodes and a graph this function creates and returns subgraph with only the supplied nodes and any edges between them. } \usage{ subGraph(snodes, graph) } \arguments{ \item{snodes}{A \code{character} vector of node labels. } \item{graph}{A graph object, it must inherit from the \code{graph} class. } } \details{ The returned subgraph is a copy of the graph. Implementations for Implementations for \code{graphNEL}, \code{distGraph} and \code{clusterGraph}. } \value{ A graph of the same class as the \code{graph} argument but with only the supplied nodes. } \author{R. Gentleman } \seealso{ \code{\link{nodes}},\code{\link{edges}} } \examples{ set.seed(123) x <- rnorm(26) names(x) <- letters library(stats) d1 <- dist(x) g1 <- new("distGraph", Dist=d1) subGraph(letters[1:5], g1) } \keyword{manip} graph/man/toDotR-methods.Rd0000644000175400017540000000620213175713336016630 0ustar00biocbuildbiocbuild\name{toDotR-methods} \docType{methods} \alias{toDotR} \alias{toDotR,graphNEL,character,list,list-method} \alias{toDotR,graphNEL,character,missing,missing-method} \alias{toDotR,graphNEL,character,missing,list-method} \alias{toDotR,graphNEL,missing,missing,missing-method} \alias{toDotR,graphNEL,missing,missing,list-method} \alias{toDotR,graphNEL,missing,character,missing-method} \alias{toDotR,graphNEL,missing,list,list-method} \alias{toDotR,graphNEL,missing,list,missing-method} %\S4method{toDotR,graphNEL,character,list,list-method} %\S4method{toDotR,graphNEL,character,missing,missing-method} %\S4method{toDotR,graphNEL,character,missing,list-method} %\S4method{toDotR,graphNEL,missing,missing,missing-method} %\S4method{toDotR,graphNEL,missing,missing,list-method} %\S4method{toDotR,graphNEL,missing,character,missing-method} %\S4method{toDotR,graphNEL,missing,list,list-method} %\S4method{toDotR,graphNEL,missing,list,missing-method} \title{ Methods for Function toDotR, using R to generate a dot serialization} \description{There are two basic methods of generating dot (\url{http://www.graphviz.org}) language serializations of R \code{\link{graph-class}} structures. First, using the \code{\link[Rgraphviz:toDot-methods]{toDot}} methods of the Rgraphviz package, the native graphviz agraph-associated methods can be employed to create the dot serialization. Second, with the methods described here, R functions can be used to perform the serialization directly from the graph data structure, without Rgraphviz.} \section{Methods}{\describe{ \item{G = "graphNEL", outDotFile = "character", renderList = "list", optList = "list"}{ create dot language descriptionof graph } \item{G = "graphNEL", outDotFile = "character", renderList = "missing", optList = "missing"}{ create dot language descriptionof graph } \item{G = "graphNEL", outDotFile = "character", renderList = "missing", optList = "list"}{ create dot language descriptionof graph } \item{G = "graphNEL", outDotFile = "missing", renderList = "missing", optList = "missing"}{ create dot language descriptionof graph } \item{G = "graphNEL", outDotFile = "missing", renderList = "missing", optList = "list"}{ create dot language descriptionof graph } \item{G = "graphNEL", outDotFile = "missing", renderList = "character", optList = "missing"}{ create dot language descriptionof graph } \item{G = "graphNEL", outDotFile = "missing", renderList = "list", optList = "list"}{ create dot language descriptionof graph } \item{G = "graphNEL", outDotFile = "missing", renderList = "list", optList = "missing"}{ create dot language descriptionof graph } \item{G = "compoundGraph", outDotFile = "character", renderList = "list", optList = "missing"}{ create dot language descriptionof graph } \item{G = "compoundGraph", outDotFile = "character", renderList = "list", optList = "list"}{ create dot language descriptionof graph } \item{G = "compoundGraph", outDotFile = "missing", renderList = "list", optList = "missing"}{ create dot language descriptionof graph } }} \seealso{\code{\link[Rgraphviz]{toDot-methods}}} \examples{ example(randomGraph) tmp <- tempfile() toDotR( g1, tmp ) readLines(tmp) unlink(tmp) } \keyword{methods} graph/man/toDotWithRI.Rd0000644000175400017540000000456313175713336016144 0ustar00biocbuildbiocbuild\name{toDotWithRI} \alias{toDotWithRI} \title{Translate a graph to "dot" including rendering information} \usage{ toDotWithRI(graph, graph_name = NULL, subGraphList = list(), isStrict = TRUE) } \arguments{ \item{graph}{An object of graph \code{graph}} \item{graph_name}{The name of the graph} \item{subGraphList}{A list of objects of class \code{graph}. Each of these is used as a subgraph in the graph. The names in the list are taken as the names of the subgraph. If a graph is to be seen as a cluster (i.e. with a box around it), its name has to start with \code{cluster}.} \item{isStrict}{Should the graph be strict} } \value{ A character vector with the graph in dot format } \description{ The function takes a graph object and translates it into the dot format. All rendering information is written verbatim into the dot graph as well } \details{ Given a graph object, it is translated into the \code{dot} language so that it can be rendered using the \code{graphviz} software. In addition to plotting the graph itself, all the rendering information is being used as well. \code{graphRenderInfo} attributes are written as an attribute list after the \code{graph} statement in dot. \code{nodeRendenInfo} attributes are written as attribute lists after each node. If an attribute is constant across all node, a global node attribute is written instead of many individual ones.##' Newlines ##' in attributes do not lead to newlines in labels. In \code{label}, \code{headlabel} and \code{taillabel}, in order to get a newline, right justification or left justification, the two character sequences \code{\\n}, \code{\\r} and \code{\\l} have to be written (i.e. in order to create this in R, the backslash has to be escaped in a string, that is has to be written as a double-backslash). \code{edgeRenderInfo} attributes as written as attribute lists after each edge, unless an attribute is constant, then it is written as a global edge attribute. In general, all attribute values are being wrapped in double-quotes, unless the attibute value start with a \code{<} and ends with a \code{>}. In this case it is taken as html content and not wrapped in double quotes (nor are contained newlines escaped). The resulting graph in dot format is returned as a character vector. } \author{ Holger Hoefling \email{hhoeflin@gmail.com} }graph/man/ugraph.Rd0000644000175400017540000000233613175713336015246 0ustar00biocbuildbiocbuild\name{ugraph} \alias{ugraph} \alias{ugraph,graph-method} \title{Underlying Graph} \description{ For a \emph{directed} graph the underlying graph is the graph that is constructed where all edge orientation is ignored. This function carries out such a transformation on \code{graphNEL} instances. } \usage{ ugraph(graph) } \arguments{ \item{graph}{a \code{graph} object. } } \details{ If \code{graph} is already \emph{undirected} then it is simply returned. If \code{graph} is a multi-graph (has multiple edges) an error is thrown as it is unclear how to compute the underlying graph in that context. The method will work for any \code{graph} subclass for which an \code{edgeMatrix} method exists. } \value{ An instance of \code{graphNEL} with the same nodes as the input but which is \code{undirected}. } \references{Graph Theory and its Applications, J. Gross and J. Yellen. } \author{R. Gentleman } \seealso{ \code{\link{connComp}} \code{\link{edgeMatrix}} } \examples{ V <- letters[1:4] edL2 <- vector("list", length=4) names(edL2) <- V for(i in 1:4) edL2[[i]] <- list(edges=c(2,1,2,1)[i], weights=sqrt(i)) gR2 <- graphNEL(nodes=V, edgeL=edL2, edgemode="directed") ugraph(gR2) } \keyword{manip} graph/man/validGraph.Rd0000644000175400017540000000142213175713336016034 0ustar00biocbuildbiocbuild\name{validGraph} \alias{validGraph} \title{ Test whether graph object is valid } \description{ validGraph is a validating function for a graph object. } \usage{ validGraph(object, quietly=FALSE) } \arguments{ \item{object}{ a graph object to be tested } \item{quietly}{ \code{TRUE} or \code{FALSE} indicating whether output should be printed.} } \value{ If the graph object is valid, \code{TRUE} is returned otherwise \code{FALSE} is returned. If \code{object} is not a valid graph and \code{quietly} is set to \code{FALSE} then descriptions of the problems are printed. } \author{ Elizabeth Whalen } \seealso{\code{\link{graph-class}} } \examples{ testGraph<-graphNEL() testGraph@nodes<-c("node1","node2","node3") validGraph(testGraph) } \keyword{ manip} graph/man/write.tlp.Rd0000644000175400017540000000101613175713336015702 0ustar00biocbuildbiocbuild\name{write.tlp} \alias{write.tlp} \title{ Write a graph object in a file in the Tulip format} \description{ Write a graph object in a file in the Tulip format. } \usage{ write.tlp(graph, filename) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{graph}{a \code{graph} object} \item{filename}{ Name of the output file} } \details{ The Tulip format is used by the program Tulip. } \references{http://www.tulip-software.org/} \author{Laurent Gautier } \keyword{ manip } graph/src/0000755000175400017540000000000013175724651013503 5ustar00biocbuildbiocbuildgraph/src/Makevars0000644000175400017540000000031713175724651015200 0ustar00biocbuildbiocbuildafter: $(SHLIB) mv $(SHLIB) BioC_graph$(SHLIB_EXT) # By default, 'R CMD build' won't remove that file so it will end up in the # source tarball (observed with R 2.12.0). clean: rm BioC_graph$(SHLIB_EXT) graph/src/graph.c0000644000175400017540000007221113175724651014753 0ustar00biocbuildbiocbuild#include #include #include #include SEXP R_scalarString(const char *); SEXP intersectStrings(SEXP, SEXP); SEXP graph_intersection(SEXP, SEXP, SEXP, SEXP, SEXP); SEXP checkEdgeList(SEXP, SEXP); SEXP graph_listLen(SEXP); SEXP graph_attrData_lookup(SEXP attrObj, SEXP keys, SEXP attr); SEXP graph_sublist_assign(SEXP x, SEXP subs, SEXP sublist, SEXP values); SEXP graph_is_adjacent(SEXP fromEdges, SEXP to); SEXP graph_bitarray_sum(SEXP bits); SEXP graph_bitarray_set(SEXP bits, SEXP idx, SEXP val); SEXP graph_bitarray_transpose(SEXP bits); SEXP graph_bitarray_undirect(SEXP bits); SEXP graph_bitarray_rowColPos(SEXP bits); SEXP graph_bitarray_subGraph(SEXP bits, SEXP _subIndx); SEXP graph_bitarray_edgeSetToMatrix(SEXP nodes, SEXP bits, SEXP _weights, SEXP _directed); SEXP graph_bitarray_getBitCell(SEXP bits, SEXP _from, SEXP _to); SEXP graph_bitarray_Union_Attrs(SEXP inputBits, SEXP cmnBits, SEXP fromOneBits, SEXP fromTwoBits); SEXP graph_bitarray_Interect_Attrs(SEXP cmnBits, SEXP fromOneBits, SEXP fromTwoBits); SEXP graph_bitarray_removeEdges(SEXP bits, SEXP _indx); SEXP graph_bitarray_getEdgeAttrOrder(SEXP , SEXP , SEXP ); //SEXP graph_bitarray_getEdgeAttrPos(SEXP origBits, SEXP newBits) ; # define graph_duplicated(x) Rf_duplicated(x, FALSE) static const R_CallMethodDef R_CallDef[] = { {"intersectStrings", (DL_FUNC)&intersectStrings, 2}, {"graph_intersection", (DL_FUNC)&graph_intersection, 5}, {"graph_listLen", (DL_FUNC)&graph_listLen, 1}, {"graph_attrData_lookup", (DL_FUNC)&graph_attrData_lookup, 3}, {"graph_sublist_assign", (DL_FUNC)&graph_sublist_assign, 4}, {"graph_is_adjacent", (DL_FUNC)&graph_is_adjacent, 2}, {"graph_bitarray_rowColPos", (DL_FUNC)&graph_bitarray_rowColPos, 1}, {"graph_bitarray_getEdgeAttrOrder", (DL_FUNC)&graph_bitarray_getEdgeAttrOrder, 3}, {NULL, NULL, 0}, }; void R_init_BioC_graph(DllInfo *info) { R_registerRoutines(info, NULL, R_CallDef, NULL, NULL); } SEXP R_scalarString(const char *v) { SEXP ans = allocVector(STRSXP, 1); PROTECT(ans); if(v) SET_STRING_ELT(ans, 0, mkChar(v)); UNPROTECT(1); return(ans); } SEXP intersectStrings(SEXP x, SEXP y) { SEXP ans, matchRes, matched, dup; int i, j, k, n, numZero=0, size; int curEntry=0; PROTECT(matchRes = Rf_match(y, x, 0)); for (i = 0; i < length(matchRes); i++) { if (INTEGER(matchRes)[i] == 0) numZero++; } size = length(matchRes) - numZero; PROTECT(matched = allocVector(STRSXP, size)); for (i = 0; i < length(matchRes); i++) { if (INTEGER(matchRes)[i] != 0) { SET_STRING_ELT(matched, curEntry++, STRING_ELT(y, INTEGER(matchRes)[i]-1)); } } PROTECT(dup = graph_duplicated(matched)); n = length(matched); k = 0; for (j = 0; j < n; j++) if (LOGICAL(dup)[j] == 0) k++; PROTECT(ans = allocVector(STRSXP, k)); k = 0; for (j = 0; j < n; j++) { if (LOGICAL(dup)[j] == 0) { SET_STRING_ELT(ans, k++, STRING_ELT(matched, j)); } } UNPROTECT(4); return(ans); } SEXP graph_intersection(SEXP xN, SEXP yN, SEXP xE, SEXP yE, SEXP edgeMode) { /* edgeMode == 0 implies "undirected" */ SEXP bN, newXE, newYE; SEXP klass, outGraph; SEXP rval, ans, curRval, curWeights, curEdges, newNames, matches; int i, j, curEle=0; klass = MAKE_CLASS("graphNEL"); PROTECT(outGraph = NEW_OBJECT(klass)); if (INTEGER(edgeMode)[0]) SET_SLOT(outGraph, Rf_install("edgemode"), R_scalarString("directed")); else SET_SLOT(outGraph, Rf_install("edgemode"), R_scalarString("undirected")); PROTECT(bN = intersectStrings(xN, yN)); if (length(bN) == 0) { SET_SLOT(outGraph, Rf_install("nodes"), allocVector(STRSXP, 0)); SET_SLOT(outGraph, Rf_install("edgeL"), allocVector(VECSXP, 0)); UNPROTECT(1); return(outGraph); } PROTECT(newXE = checkEdgeList(xE, bN)); PROTECT(newYE = checkEdgeList(yE, bN)); PROTECT(newNames = allocVector(STRSXP, 2)); SET_STRING_ELT(newNames, 0, mkChar("edges")); SET_STRING_ELT(newNames, 1, mkChar("weights")); PROTECT(rval = allocVector(VECSXP, length(newXE))); for (i = 0; i < length(newXE); i++) { PROTECT(curRval = allocVector(VECSXP, 2)); setAttrib(curRval, R_NamesSymbol, newNames); PROTECT(ans = intersectStrings(VECTOR_ELT(newXE, i), VECTOR_ELT(newYE, i))); if (length(ans) == 0) { SET_VECTOR_ELT(curRval, 0, allocVector(INTSXP, 0)); SET_VECTOR_ELT(curRval, 1, allocVector(INTSXP, 0)); } else { PROTECT(curEdges = allocVector(INTSXP, length(ans))); PROTECT(matches = Rf_match(bN, ans, 0)); curEle = 0; for (j = 0; j < length(matches); j++) { if (INTEGER(matches)[j] != 0) INTEGER(curEdges)[curEle++] = INTEGER(matches)[j]; } SET_VECTOR_ELT(curRval, 0, curEdges); PROTECT(curWeights = allocVector(INTSXP, length(ans))); for (j = 0; j < length(ans); j++) INTEGER(curWeights)[j] = 1; SET_VECTOR_ELT(curRval, 1, curWeights); UNPROTECT(3); } SET_VECTOR_ELT(rval, i, curRval); UNPROTECT(2); } setAttrib(rval, R_NamesSymbol, bN); SET_SLOT(outGraph, Rf_install("nodes"), bN); SET_SLOT(outGraph, Rf_install("edgeL"), rval); UNPROTECT(6); return(outGraph); } SEXP checkEdgeList(SEXP eL, SEXP bN) { SEXP newEL, curVec, curMatches, newVec, eleNames; int i, j, k, size, curEle; PROTECT(newEL = allocVector(VECSXP, length(bN))); PROTECT(eleNames = getAttrib(eL, R_NamesSymbol)); for (i = 0; i < length(bN); i++) { for (k = 0; k < length(eL); k++) { if (strcmp(CHAR(STRING_ELT(eleNames, k)), CHAR(STRING_ELT(bN, i))) == 0) break; } if (k < length(eL)) { curVec = VECTOR_ELT(eL, k); PROTECT(curMatches = Rf_match(curVec, bN, 0)); size = length(curMatches); for (j = 0; j < length(curMatches); j++) { if (INTEGER(curMatches)[j] == 0) size--; } PROTECT(newVec = allocVector(STRSXP, size)); curEle = 0; for (j = 0; j < length(curMatches); j++) { if (INTEGER(curMatches)[j] != 0) { SET_STRING_ELT(newVec, curEle++, STRING_ELT(curVec, INTEGER(curMatches)[j]-1)); } } SET_VECTOR_ELT(newEL, i, newVec); UNPROTECT(2); } } setAttrib(newEL, R_NamesSymbol, bN); UNPROTECT(2); return(newEL); } /* Taken from Biobase to avoid depending on it */ SEXP graph_listLen(SEXP x) { SEXP ans; int i; if( !Rf_isNewList(x) ) error("require a list"); PROTECT(ans = allocVector(REALSXP, length(x))); for(i=0; i 1 && ns != numVals) error("invalid args: subs and values must be the same length"); names = GET_NAMES(x); PROTECT(idx = match(names, subs, -1)); PROTECT(newsubs = allocVector(STRSXP, ns)); nnew = 0; for (i = 0; i < ns; i++) { if (INTEGER(idx)[i] == -1) SET_STRING_ELT(newsubs, nnew++, STRING_ELT(subs, i)); } PROTECT(ans = allocVector(VECSXP, origlen + nnew)); PROTECT(ansnames = allocVector(STRSXP, length(ans))); for (i = 0; i < origlen; i++) { SET_VECTOR_ELT(ans, i, duplicate(VECTOR_ELT(x, i))); SET_STRING_ELT(ansnames, i, duplicate(STRING_ELT(names, i))); } j = origlen; for (i = 0; i < nnew; i++) SET_STRING_ELT(ansnames, j++, STRING_ELT(newsubs, i)); SET_NAMES(ans, ansnames); UNPROTECT(1); nextempty = origlen; /* index of next unfilled element of ans */ for (i = 0; i < ns; i++) { if (numVals > 1) PROTECT(val = graph_makeItem(values, i)); else if (numVals == 1 && isVectorList(values)) PROTECT(val = duplicate(VECTOR_ELT(values, 0))); else PROTECT(val = duplicate(values)); j = INTEGER(idx)[i]; if (j < 0) { tmpItem = graph_addItemToList(R_NilValue, val, sublist); SET_VECTOR_ELT(ans, nextempty, tmpItem); nextempty++; } else { tmpItem = VECTOR_ELT(ans, j-1); tmpIdx = graph_getListIndex(tmpItem, sublist); if (tmpIdx == -1) { tmpItem = graph_addItemToList(tmpItem, val, sublist); SET_VECTOR_ELT(ans, j-1, tmpItem); } else SET_VECTOR_ELT(tmpItem, tmpIdx, val); } UNPROTECT(1); } UNPROTECT(3); return ans; } SEXP graph_is_adjacent(SEXP fromEdges, SEXP to) { SEXP ans, frEdges, toEdge, idx; int i, j, lenTo; int found = 0; lenTo = length(to); PROTECT(ans = allocVector(LGLSXP, lenTo)); for (i = 0; i < lenTo; i++) { found = 0; PROTECT(toEdge = ScalarString(STRING_ELT(to, i))); frEdges = VECTOR_ELT(fromEdges, i); idx = match(toEdge, frEdges, 0); for (j = 0; j < length(idx); j++) if ((found = (INTEGER(idx)[j] > 0))) break; LOGICAL(ans)[i] = found; UNPROTECT(1); } UNPROTECT(1); return ans; } SEXP graph_bitarray_sum(SEXP bits) { /* This approach from http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan */ unsigned char *bytes = (unsigned char *) RAW(bits); unsigned char v; int c = 0; int len = length(bits); int i; for (i = 0; i < len; i++) { for (v = bytes[i]; v; c++) { v &= v - 1; /* clear the least significant bit set */ } } return ScalarInteger(c); } SEXP graph_bitarray_rowColPos(SEXP bits) { SEXP ans, matDim, dimNames, colNames; int i, j = 0, k, len = length(bits), *indices, dim = asInteger(getAttrib(bits, install("bitdim"))), edgeCount = asInteger(getAttrib(bits, install("nbitset"))); unsigned char v, *bytes = (unsigned char *) RAW(bits); PROTECT(ans = allocVector(INTSXP, 2 * edgeCount)); indices = INTEGER(ans); for (i = 0; i < len; i++) { for (v = bytes[i], k = 0; v; v >>= 1, k++) { if (v & 1) { int idx = (i * 8) + k; indices[j] = (idx % dim) + 1; /* R is 1-based */ indices[j + edgeCount] = (idx / dim) + 1; j++; } } } PROTECT(matDim = allocVector(INTSXP, 2)); INTEGER(matDim)[0] = edgeCount; INTEGER(matDim)[1] = 2; setAttrib(ans, R_DimSymbol, matDim); PROTECT(colNames = allocVector(STRSXP, 2)); SET_STRING_ELT(colNames, 0, mkChar("from")); SET_STRING_ELT(colNames, 1, mkChar("to")); PROTECT(dimNames = allocVector(VECSXP, 2)); SET_VECTOR_ELT(dimNames, 0, R_NilValue); SET_VECTOR_ELT(dimNames, 1, colNames); setAttrib(ans, R_DimNamesSymbol, dimNames); UNPROTECT(4); return ans; } #define COORD_TO_INDEX(x, y, nrow) ((((y)+1) * (nrow)) - ((nrow) - ((x)+1)) - 1) #define NROW(x) (INTEGER(getAttrib((x), install("bitdim")))[0]) #define INDEX_TO_ROW(i, n) ((i) % (n)) #define INDEX_TO_COL(i, n) ((i) / (n)) #define IS_SET(b, i, bit) ((b)[i] != 0 && ((b)[i] & (1 << (bit)))) SEXP graph_bitarray_transpose(SEXP bits) { SEXP ans; int nrow, i, j, len = length(bits); unsigned char *bytes = RAW(bits), *ans_bytes; ans = PROTECT(duplicate(bits)); /* dup to capture attributes */ ans_bytes = RAW(ans); memset(ans_bytes, 0, len); nrow = NROW(bits); /* FIXME: use a single loop, look at R's array.c */ for (i = 0; i < nrow; i++) { for (j = 0; j < nrow; j++) { int idx = COORD_TO_INDEX(i, j, nrow), tidx = COORD_TO_INDEX(j, i, nrow); int byteIndex = idx / 8, bitIndex = idx % 8, tBitIndex = tidx % 8; if (IS_SET(bytes, byteIndex, bitIndex)) ans_bytes[tidx / 8] |= (1 << tBitIndex); } } UNPROTECT(1); return ans; } /* Given a bit vector representing directed edges, return a new bit vector with the underlying undirected edges. */ SEXP graph_bitarray_undirect(SEXP bits) { int i, j, c = 0, len = length(bits), nrow = NROW(bits); SEXP tbits = PROTECT(graph_bitarray_transpose(bits)), ans = PROTECT(duplicate(bits)); unsigned char *bytes = RAW(bits), *tbytes = RAW(tbits), *abytes = RAW(ans); for (i = 0; i < len; i++) { unsigned char v; if (0 != (abytes[i] = bytes[i] | tbytes[i])) { /* keep track of edge count */ for (v = abytes[i]; v; c++) { v &= v - 1; /* clear the least significant bit set */ } } } /* zero out lower tri */ for (i = 0; i < nrow; i++) { for (j = 0; j < nrow; j++) { if (i > j) { unsigned char v; int idx = COORD_TO_INDEX(i, j, nrow); v = abytes[idx / 8]; if (0 != v) { if (IS_SET(abytes, idx / 8, idx % 8)) c--; abytes[idx / 8] &= ~(1 << (idx % 8)); } } } } INTEGER(getAttrib(ans, install("nbitset")))[0] = c; UNPROTECT(2); return ans; } SEXP graph_bitarray_set(SEXP bits, SEXP idx, SEXP val) { SEXP ans = PROTECT(duplicate(bits)); int *which, *values, i, nVal = length(val), *num_set = INTEGER(getAttrib(ans, install("nbitset"))); unsigned char *bytes = RAW(ans); PROTECT(idx = coerceVector(idx, INTSXP)); PROTECT(val = coerceVector(val, INTSXP)); which = INTEGER(idx); values = INTEGER(val); for (i = 0; i < nVal; i++) { int w = which[i] - 1; int offset = w / 8; unsigned char bit = w % 8; if (values[i]) { if (!IS_SET(bytes, offset, bit)) (*num_set)++; bytes[offset] |= (1 << bit); } else { if (IS_SET(bytes, offset, bit)) (*num_set)--; bytes[offset] &= ~(1 << bit); } } UNPROTECT(3); return ans; } SEXP graph_bitarray_subGraph(SEXP bits, SEXP _subIndx) { SEXP _dim = getAttrib(bits,install("bitdim")), sgVec, btlen, btdim, btcnt, _ftSetPos, res, namesres; int dim, subLen, prevSetPos = 0, sgSetIndx = 0, linIndx = 0, col, subgBitLen, subgBytes, *subIndx, *ftSetPos, edgeCount = 0, ftLen = 256; PROTECT_INDEX pidx; unsigned char *bytes = (unsigned char *) RAW(bits), *sgBits; dim = INTEGER(_dim)[0]; subIndx = INTEGER(_subIndx); subLen = length(_subIndx); subgBitLen = subLen * subLen; subgBytes = subgBitLen / 8; if ((subgBitLen % 8) != 0) { subgBytes++; } PROTECT(sgVec = allocVector(RAWSXP, subgBytes)); sgBits = RAW(sgVec); memset(sgBits, 0, subgBytes); /* TODO: in many cases, this will be more than we need, we should also use the number of edges in the input as a starting point. */ _ftSetPos = allocVector(INTSXP, ftLen); /* FIXME: need better guess */ PROTECT_WITH_INDEX(_ftSetPos, &pidx); ftSetPos = INTEGER(_ftSetPos); for (col = 0; col < subLen; col++) { int col_idx_dim = ((subIndx[col] - 1) * dim) - 1; int row = 0; while (row < subLen) { int setPos = col_idx_dim + subIndx[row]; unsigned char v = bytes[setPos / 8]; if (v != 0 && v & (1 << (setPos % 8))) { int curSetPos = setPos, m = prevSetPos; while (m < curSetPos) { unsigned char tempV = bytes[m / 8]; if (tempV == 0) { m += 8; } else { if (tempV & (1 << (m % 8))) edgeCount++; m++; } } prevSetPos = curSetPos + 1; edgeCount++; /* current edge */ if (sgSetIndx == ftLen) { ftLen *= 2; if (ftLen > subgBitLen) ftLen = subgBitLen; REPROTECT(_ftSetPos = lengthgets(_ftSetPos, ftLen), pidx); ftSetPos = INTEGER(_ftSetPos); } ftSetPos[sgSetIndx] = edgeCount; sgSetIndx++; sgBits[linIndx / 8] |= (1 << (linIndx % 8)); } linIndx++; row++; } } REPROTECT(_ftSetPos = lengthgets(_ftSetPos, sgSetIndx), pidx); PROTECT(btlen = ScalarInteger(subgBitLen)); PROTECT(btcnt = ScalarInteger(sgSetIndx)); PROTECT(btdim = allocVector(INTSXP, 2)); INTEGER(btdim)[0] = subLen; INTEGER(btdim)[1] = subLen; setAttrib(sgVec, install("bitlen"), btlen); setAttrib(sgVec, install("bitdim"), btdim); setAttrib(sgVec, install("nbitset"), btcnt); PROTECT(res = allocVector(VECSXP, 2)); SET_VECTOR_ELT(res, 0, _ftSetPos); SET_VECTOR_ELT(res, 1, sgVec); PROTECT(namesres = allocVector(STRSXP, 2)); SET_STRING_ELT(namesres, 0, mkChar("setPos")); SET_STRING_ELT(namesres, 1, mkChar("bitVec")); setAttrib(res, R_NamesSymbol, namesres); UNPROTECT(7); return res; } SEXP graph_bitarray_edgeSetToMatrix(SEXP nodes, SEXP bits, SEXP _weights, SEXP _directed) { SEXP ans, dnms, _dim = getAttrib(bits, install("bitdim")); unsigned char *bytes = (unsigned char *) RAW(bits); int dim = INTEGER(_dim)[0], num_el = dim * dim, directed = asInteger(_directed), linIndx = 0, wtIndx = 0; double *weights = REAL(_weights), *ftMat; PROTECT(ans = allocVector(REALSXP, num_el)); ftMat = REAL(ans); memset(ftMat, 0, sizeof(double) * num_el); while (linIndx < num_el) { unsigned char v = bytes[linIndx / 8]; if (v == 0) { linIndx += 8; } else { if (v & (1 << (linIndx % 8))) { ftMat[linIndx] = weights[wtIndx]; if (!directed) { ftMat[linIndx/dim + (linIndx % dim)*dim] = weights[wtIndx]; } wtIndx++; } linIndx++; } } SET_NAMED(_dim, 2); setAttrib(ans, R_DimSymbol, _dim); PROTECT(dnms = allocVector(VECSXP, 2)); /* Arguments to .Call have NAMED(x) == 2, so we can reuse here. */ SET_VECTOR_ELT(dnms, 0, nodes); SET_VECTOR_ELT(dnms, 1, nodes); setAttrib(ans, R_DimNamesSymbol, dnms); UNPROTECT(2); return ans; } SEXP graph_bitarray_getBitCell(SEXP bits, SEXP _from, SEXP _to) { int len = length(_to); SEXP ans; PROTECT(ans = allocVector(LGLSXP, len)); unsigned char *bytes = (unsigned char *) RAW(bits); int *from = INTEGER(_from); int *to = INTEGER(_to); int dim = NROW(bits); int i = 0, val, byteIndex, bitIndex, indx; for(i =0; i < len; i++) { indx = COORD_TO_INDEX(from[i]-1, to[i]-1, dim) ; byteIndex = indx / 8 ; bitIndex = indx % 8 ; val = bytes[byteIndex] & (1 << bitIndex); LOGICAL(ans)[i] = 0; if (val) { LOGICAL(ans)[i] = 1; } } UNPROTECT(1); return(ans); } SEXP graph_bitarray_Union_Attrs(SEXP inputBits, SEXP cmnBits, SEXP fromOneBits, SEXP fromTwoBits) { unsigned char *ans = (unsigned char*) RAW(inputBits); unsigned char *cmn = (unsigned char*) RAW(cmnBits); unsigned char *fromOne = (unsigned char *) RAW(fromOneBits); unsigned char *fromTwo = (unsigned char *) RAW(fromTwoBits); int len = length(inputBits) * 8; int i, byteIndex, bitIndex , shft, setIndx = 0; int nn = asInteger(getAttrib(inputBits, install("nbitset"))); SEXP from, indx1, indx2, res, namesres ; PROTECT(from = allocVector(INTSXP, nn)); PROTECT(indx1 = allocVector(INTSXP , nn)); PROTECT(indx2 = allocVector(INTSXP , nn)); int from1Indx = 0; int from2Indx = 0; int cmnIndx = 0; for( i =0 ; i < len; i ++) { byteIndex = i / 8; bitIndex = i % 8; shft = 1 << bitIndex; if(ans[byteIndex] & (shft)) { if(cmn [byteIndex] & (shft)) { cmnIndx++; from1Indx++; from2Indx++; INTEGER(from)[setIndx] = 0; } else if(fromOne[byteIndex] & (shft)) { from1Indx++; INTEGER(from)[setIndx] = 1; } else if(fromTwo[byteIndex] & (shft)) { from2Indx++; INTEGER(from)[setIndx] = 2; } INTEGER(indx1)[setIndx] = from1Indx ; INTEGER(indx2)[setIndx] = from2Indx; setIndx++; } } PROTECT(res = allocVector(VECSXP, 3)); SET_VECTOR_ELT(res, 0, from); SET_VECTOR_ELT(res, 1, indx1); SET_VECTOR_ELT(res, 2, indx2); PROTECT(namesres = allocVector(STRSXP, 3)); SET_STRING_ELT(namesres, 0, mkChar("from")); SET_STRING_ELT(namesres, 1, mkChar("indx1")); SET_STRING_ELT(namesres, 2, mkChar("indx2")); setAttrib(res, R_NamesSymbol, namesres); UNPROTECT(5); return(res); } SEXP graph_bitarray_Intersect_Attrs(SEXP cmnBits, SEXP fromOneBits, SEXP fromTwoBits) { unsigned char *cmn = (unsigned char*) RAW(cmnBits); unsigned char *fromOne = (unsigned char *) RAW(fromOneBits); unsigned char *fromTwo = (unsigned char *) RAW(fromTwoBits); int len = length(cmnBits) * 8; int i, byteIndex, bitIndex , shft, setIndx = 0; int nn = asInteger(getAttrib(cmnBits, install("nbitset"))); SEXP from, indx1, indx2, res, namesres; PROTECT(from = allocVector(INTSXP, nn)); PROTECT(indx1 = allocVector(INTSXP , nn)); PROTECT(indx2 = allocVector(INTSXP , nn)); int from1Indx = 0; int from2Indx = 0; for( i =0 ; i < len; i ++) { byteIndex = i / 8; bitIndex = i % 8; shft = 1 << bitIndex; if(fromOne[byteIndex] & (shft) ) { from1Indx++; } if(fromTwo[byteIndex] & (shft)) { from2Indx++; } if(cmn[byteIndex] & (shft)) { INTEGER(from)[setIndx] = 0; INTEGER(indx1)[setIndx] = from1Indx; INTEGER(indx2)[setIndx] = from2Indx; setIndx++; } } PROTECT(res = allocVector(VECSXP, 3)); SET_VECTOR_ELT(res, 0, from); SET_VECTOR_ELT(res, 1, indx1); SET_VECTOR_ELT(res, 2, indx2); PROTECT(namesres = allocVector(STRSXP, 3)); SET_STRING_ELT(namesres, 0, mkChar("from")); SET_STRING_ELT(namesres, 1, mkChar("indx1")); SET_STRING_ELT(namesres, 2, mkChar("indx2")); setAttrib(res, R_NamesSymbol, namesres); UNPROTECT(5); return(res); } SEXP graph_bitarray_removeEdges(SEXP bits, SEXP _indx) { SEXP ans = PROTECT(duplicate(bits)), btcnt; unsigned char *bytes = (unsigned char *) RAW(ans); int *indx = INTEGER(_indx); int len = length(bits) * 8 ; int i, byteIndex, bitIndex, subIndx =0; int nSet = 0; unsigned char mask; for( i =0 ; i < len; i ++) { byteIndex = i / 8; bitIndex = i % 8; if(IS_SET(bytes, byteIndex, bitIndex)) { if(indx[subIndx] == 0){ mask = ~(1 << bitIndex) ; bytes[byteIndex] = bytes[byteIndex] & mask; } else { nSet++; } subIndx++; } } PROTECT(btcnt = ScalarInteger(nSet)); setAttrib(ans, install("nbitset"), btcnt); UNPROTECT(2); return(ans); } SEXP graph_bitarray_getEdgeAttrOrder(SEXP _bits, SEXP _from, SEXP _to) { unsigned char *bits = (unsigned char*) RAW(_bits); int ns = asInteger(getAttrib(_bits, install("nbitset"))); int len = length(_from); int *from = INTEGER(_from); int *to = INTEGER(_to); int dim = NROW(_bits); int byteIndex, bitIndex, shft, indx, intIndx, i, j; int oindx=0, nindx=0, attrIndx=0, setCount=0; SEXP origRightPos, origLeftPos, newRightPos, newLeftPos, res, namesres; PROTECT(origRightPos = allocVector(INTSXP, ns)); //index into orig attr PROTECT(origLeftPos = allocVector(INTSXP, ns)); PROTECT(newRightPos = allocVector(INTSXP, len)); PROTECT(newLeftPos = allocVector(INTSXP, len)); setCount =1; for(j =0; j < dim ; j ++) { for(i =0; i < dim; i++){ indx = COORD_TO_INDEX(i, j , dim); byteIndex = indx / 8; bitIndex = indx % 8; shft = 1 << bitIndex; intIndx = COORD_TO_INDEX(from[attrIndx]-1, to[attrIndx]-1, dim); if(bits[byteIndex] & (shft) ) { INTEGER(origRightPos)[oindx] = oindx + 1 ; INTEGER(origLeftPos)[oindx] = setCount ; oindx++; if(intIndx != indx){ setCount++; } } if(intIndx == indx) { INTEGER(newRightPos)[nindx] = nindx + 1; INTEGER(newLeftPos)[nindx] = setCount ; nindx++; if(attrIndx < len-1){ attrIndx++; } setCount++; } } } SET_LENGTH(newRightPos, nindx); SET_LENGTH(newLeftPos, nindx); PROTECT(res = allocVector(VECSXP, 4)); SET_VECTOR_ELT(res, 0, newLeftPos); SET_VECTOR_ELT(res, 1, newRightPos); SET_VECTOR_ELT(res, 2, origLeftPos); SET_VECTOR_ELT(res, 3, origRightPos); PROTECT(namesres = allocVector(STRSXP, 4)); SET_STRING_ELT(namesres, 0, mkChar("newLeftPos")); SET_STRING_ELT(namesres, 1, mkChar("newRightPos")); SET_STRING_ELT(namesres, 2, mkChar("origLeftPos")); SET_STRING_ELT(namesres, 3, mkChar("origRightPos")); setAttrib(res, R_NamesSymbol, namesres); UNPROTECT(6); return(res); } graph/tests/0000755000175400017540000000000013175713336014054 5ustar00biocbuildbiocbuildgraph/tests/graph_unit_tests.R0000644000175400017540000000006713175713336017564 0ustar00biocbuildbiocbuildBiocGenerics:::testPackage("graph", pattern="_test.R") graph/vignettes/0000755000175400017540000000000013175724651014724 5ustar00biocbuildbiocbuildgraph/vignettes/GraphClass.Rnw0000644000175400017540000002714113175713336017446 0ustar00biocbuildbiocbuild% % NOTE -- ONLY EDIT GraphClass.Rnw!!! % GraphClass.tex file will get overwritten. % %\VignetteIndexEntry{Graph Design} %\VignetteDepends{graph} %\VignetteKeywords{Graph} %\VignettePackage{graph} \documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in %\parskip=.3cm \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\classdef}[1]{% {\em #1} } \begin{document} \section{Introduction} The purpose of this document is to describe the implementation the classes used to represent graphs in the \Rpackage{graph} package and to discuss design issues for future development. There are many different ways to represent a graph and to deal with the edges and nodes within that graph. Below we discuss the graph representations implemented in the \Rpackage{graph} package and define the set of methods that form the \textit{graph interface} as determined empiracally by the methods used by packages like \Rpackage{RBGL} when interacting with \Robject{graph} objects. A graph is a pair of sets, $G=(V,E)$ where $V$ is the set of nodes and $E$ is the set of edges, which are determined by relationships that exist between the nodes. If we let $n = |V|$, be the number of nodes then, excluding self-loops there are at most $n$ choose 2 edges in $G$. A \textit{simple graph} is a graph with at most one edge between any pair of nodes and no self-loops. \section{The \Rclass{graph} class} The \Rclass{graph} class and its subclasses support simple graphs as well as graphs with at most one self-loop on any given node. Not all graph representations can easily support more general graphs. Limiting to simple graphs with self-loops allows for reversible conversions between different graph representations. Furthermore, this limitation simplifies the interface of edge related methods which would otherwise have to support ways of identifying one of many edges between the same pair of nodes. Arbitrary attributes can be associated with a graph, with a node, or with an edge. For both nodes and edges if one edge or node has a particular attribute then all nodes and edges must have that attribute. Nodes and edges can have more than one attribute associated with them. \textit{This raises the question of whether we should use the \Rclass{AnnotatedDataFrame} class from Biobase here as a way to implement general node and edge attributes.} \textit{However, currently AnnotatedDataFrame is based on a data.frame and cannot easily support arbitrary attributes. Even having a vector of length greater than one as the value of an attribute could cause problems.} The \Rclass{graph} class itself is VIRTUAL and has the following definition: <>= library("graph") getClass("graph") @ The \Robject{edgemode} slot indicates whether the graph is \textit{directed} or \textit{undirected}. Since some graph algorithms only make sense in a directed graph, the edgemode is a property of the entire graph, rather than a property of an edge. The \Robject{graphData} slot was recently added to hold arbitrary attributes for the graph. Although edgemode is such an attribute, it isn't clear whether it should move inside the generic container since edgemode is of such high semantic importance. It probably doesn't matter as long as methods such as \Rfunction{isDirected} do the right thing. The \Robject{edgeData} and \Robject{nodeData} slots store the attributes for the edges and nodes of the graph, respectively. There are currently implementations for the \Rclass{graphNEL} class, where nodes are a vector and edges are a list, each element of the list correspondes to one node and the values are nodes corresponding to the out-edges from that node. If the graph is directed then all edges essentially appear twice. The \Rclass{graphAM} class, which stores the edge information in an adjacency matrix. The matrix must be square and the row names must match the column names. If the graph is undirected then the matrix must also be symmetric. There are two specialized classes, \Rclass{distGraph} which takes a distance matrix directly and has special thresholding capabilities. It is not clear whether this should be a specialization of the \Rclass{graphAM} class or not. The second specialized class is a \Rclass{clusterGraph} which can be used to represent the output of a clustering algorithm as a graph. Samples represent nodes and all samples in the same cluster have edges, while samples in distinct clusters do not. Instances of this class must have their edgemode as \texttt{undirected}, if the edgemode is reset then coercion to some other mode of graph is needed. \subsection{Methods of graphs} Here are some of the methods that all graph-like objects should support: \begin{description} \item[nodes(object)] Return a character vector of the node labels. The order is not defined. \item[nodes<-(object)] Return a new graph object with the node labels set as specified by a character vector. This is slightly fragile since here order does matter, but the order can only really be determined by first calling \Rfunction{nodes}. by providing a character vector of the appropriate length. \item[addNode(node, object, edges)] Return a new graph object with additional nodes and (optionally) edges. The methods that have been implemented expect \Robject{node} to be the node labels of the new nodes specified as a character vector. Optional edges can be specified. \item[removeNode(node, object)] Return a new graph object with nodes (and their incident edges) removed. Current methods are implemented for \Robject{node} being a character vector of node labels to remove. \item[edges(object, which)] Return a list with an element for each node in the graph. The names of the list are the node labels. Each element is a character vector giving the node labels of the nodes which the given element shares an edge with. For undirected graphs, reciprocal edges should be included. This representation is very similar to the NEL edgeL structure. \item[edgeWeights(object, index)] \item[addEdge(from, to, graph, weights)] Return a new graph object with additional edges. \item[removeEdge(from, to, graph)] Return a new graph object with the specified edges removed. \item[numNodes(object)] Return a count of the nodes in the graph. \item[numEdges(object)] Return a count of the edges in the graph. \item[isDirected(object)] Return TRUE if the graph is directed and false otherwise. \item[acc(object, index)] See man page. \item[adj(object, index)] See man page. \item[nodeData] Access to node attributes. See man page. \item[edgeData] Access to edge attributes. See man page. \end{description} \subsection{Some Details} Once both nodes and edges are instances of classes they will be quite large. In order to reduce the storage requirements (especially for large graphs) using integer indices may be beneficial. The minimum amount of storage required is $|V|+|E|$. If we use an incidence matrix representation then the storage is $|V|^2$. If we use a node and edge list representation then the storage requirements are $|V|+2|E|$. When either $|V|$ or $|E|$ are large these mechanisms will not be especially efficient. In some cases it may be better to keep the actual node and edge data stored in hash tables and keep other integer vectors available for accessing the necessary components. \subsubsection{Representation of Edges} \label{sec:edgerep} We have taken the approach of allowing the representation of the edge sets to not contain every node. When the graphs are sparse this can be a fairly large savings in space, but it means that one cannot determine the nodes in a graph from the edges in the graph. Also, for the \Rclass{graphNEL} class we do not store the names of the nodes in the NEL, but rather indexes into a the node vector. This is important for allowing us to perform permutations on the nodes of a graph, but causes a number of problems when subsetting graphs, and means that knowledge of the edges does not provide knowledge of the nodes. \section{Multi-graphs} There are no clear and widely used definitions for multi-graphs, so here we will make clear a definition that we believe will be useful for biological computations. We define a multi-graph to consist of two components, one a set of nodes and the second a list of edge sets. Each edge set corresponds to a potentially different set of relationships between the nodes (which are common to all edge sets). We denote this by $G=(V, E_L)$, where $V$ is the set of nodes and $E_L = (E_1, \ldots, E_L)$ is a collection of $L$ edge sets. Each with a potentially distinct set of relationships. The edge sets are essentially identical to the edge sets for a graph, and hence can have arbitrary attributes associated with them, the edges can be either \textit{directed} or \textit{undirected} and self-loops are allowed. It is not clear whether there should be distinct types of multigraphs as there are graphs. It will surely be more flexible to support a list of edge sets, and to allow these to have different structures. Current definition does not extend the \Rclass{graph} class. The definition is: <>= getClass("multiGraph") @ \begin{description} \item[nodes] A vector of node identifiers. %% FIXME: if these are node identifiers, then shouldn't we use %% "character"? Elsewhere, there seems to be an assumption that %% node labels or identifiers are character. \item[edgeL] A possibly named list of instances of the \Rclass{edgeSet} class. \end{description} The \Rclass{edgeSet} class is a virtual class with several different extensions. These include a \Rclass{edgeSetNEL} and an \Rclass{edgeSetAM}, others will be added once the interface stabilizes. Edge attributes are in the edgeData slot in the edgeSet class. This implies that edgeSets in a multiGraph can have completely unrelated edge attributes. Another approach would be to maintain a list conforming to the edgeSet list containing edge attributes that would enforce the same attributes to be defined for all edges in the multiGraph. \subsection{Methods} In some ways it would be most natural to have \Robject{edges} methods for the \Rclass{edgeSet} class the issues raised in Section~\ref{sec:edgerep} seem to preclude this and it only seems to make sense to have \Robject{node} and \Robject{edges} methods for the \Rclass{multiGraph} class. It will probably make sense to be able to name the edgeSets within a multiGraph and to be able to extract graph objects from the multiGraph representing any of the edgeSets. There should be methods to produce graph objects based on intersection, union, and more complex combination algorithms. The edgeSets may represent interaction data with reliability estimates as edge weights. The user may want to produce a graph object combining the available data to obtain most reliable edges. We may want to consider apply type operations to apply an operation across all edgeSets in a multiGraph. \subsection{Use Cases} An important motivator for the \Rclass{multiGraph} class is the representation of data from protein interaction experiments. Our goal is to represent these data in terms of what interactions were tested, and of those which ones are either positive or negative. \section{Bipartite Graphs} A bipartite graph graph is a graph where the nodes can be divided into two sets, say $V_1$ and $V_2$, such that all edges are between members of $V_1$ and members of $V_2$ and there are no edges between any two elements of $V_1$, nor of $V_2$. \end{document} graph/vignettes/MultiGraphClass.Rnw0000644000175400017540000004412513175713336020462 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{graphBAM and MultiGraph classes} %\VignetteDepends{graph} %\VignetteKeywords{Graph} %\VignettePackage{graph} \documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\classdef}[1]{% {\em #1} } \begin{document} \title{graphBAM and MultiGraph classes.} \author{N. Gopalakrishnan} \maketitle \section{graphBAM class} \subsection{Introduction} The \Rclass{graphBAM} class has been created as a more efficient replacement for the \Rclass{graphAM} class in the \Rpackage{graph} package. The adjacency matrix in the \Rclass{graphBAM} class is represented as a bit array using a \Rcode{raw} vector. This significantly reduces the memory occupied by graphs having a large number of nodes. The bit vector representation also provides advantages in terms of performing operations such as intersection or union of graphs. We first load the \Rpackage{graph} package which provides the class definition and methods for the \Rclass{graphBAM} class. <>= library(graph) @ One of the arguments \Rcode{df} to the \Rclass{graphBAM} constructor is a \Robject{data.frame} containing three columns: "from","to" and "weight", each row in the \Robject{data.frame} representing an edge in the graph. The \Rcode{from} and \Rcode{to} columns can be character vectors or factors, while the \Rcode{weight} column must be a numeric vector. The argument \Rcode{nodes} are calculated from the unique names in the \Rcode{from} and \Rcode{to} columns of the \Robject{data.frame}. The argument \Rcode{edgeMode} should be a character vector, either "directed" or "undirected" indicating whether the graph represented should be directed or undirected respectively. \subsection{ A simple graph represented using graphBAM class} We proceed to represent a simple graph using the \Rclass{graphBAM} class. Our example is a directed graph representing airlines flying between different cities. In this example, cities represent the nodes of the graph and each edge represents a flight from an originating city (\Rcode{from}) to the destination city (\Rcode{to}). The weight represents the fare for flying between the \Rcode{from} and \Rcode{to} cities. <>= df <- data.frame(from = c("SEA", "SFO", "SEA", "LAX", "SEA"), to = c("SFO", "LAX", "LAX", "SEA", "DEN"), weight = c( 90, 96, 124, 115, 259)) g <- graphBAM(df, edgemode = "directed") g @ The cities (nodes) included in our \Rclass{graph} object as well as the stored fares(\Rcode{weight}) can be obtained using the \Rmethod{nodes} and \Rmethod{edgeWeights} methods respectively. <>= nodes(g) edgeWeights(g, index = c("SEA", "LAX")) @ Additional nodes or edges can be added to our graph using the \Rmethod{addNode} and \Rmethod{addEdge} methods. For our example, we first add a new city "IAH" to our graph. We then add a flight connection between "DEN" and "IAH" having a fare of \$120. <>= g <- addNode("IAH", g) g <- addEdge(from = "DEN", to = "IAH", graph = g, weight = 120) g @ Similarly edges and nodes can be removed from the graph using the \Rmethod{removeNode} and \Rmethod{removeEdge} methods respectively. We proceed to remove the flight connection from "DEN" to "IAH" and subsequently the node "IAH". <>= g <- removeEdge(from ="DEN", to = "IAH", g) g <- removeNode(node = "IAH", g) g @ We can create a subgraph with only the cities "DEN", "LAX" and "SEA" using the \Rmethod{subGraph} method. <>= g <- subGraph(snodes = c("DEN","LAX", "SEA"), g) g @ We can extract the \Rcode{from}-\Rcode{to} relationships for our graph using the \Rmethod{extractFromTo} method. <>= extractFromTo(g) @ \subsection{Mice gene interaction data for brain tissue (SAGE data)} The C57BL/6J and C3H/HeJ mouse strains exhibit different cardiovascular and metabolic phenotypes on the hyperlipidemic apolipoprotein E (Apoe) null background. The interaction data for the genes from adipose, brain, liver and muscle tissue samples from male and female mice were studied. This interaction data for the various genes is included in the \Rpackage{graph} package as a list of \Robject{data.frame}s containing information for \Rcode{from-gene}, \Rcode{to-gene} and the strength of interaction \Rcode{weight} for each of the tissues studied. We proceed to load the data for male and female mice. <>= data("esetsFemale") data("esetsMale") @ We are interested in studying the interaction data for the genes in the brain tissue for male and female mice and hence proceed to represent this data as directed graphs using \Rclass{graphBAM} objects for male and female mice. <>= dfMale <- esetsMale[["brain"]] dfFemale <- esetsFemale[["brain"]] head(dfMale) @ <>= male <- graphBAM(dfMale, edgemode = "directed") female <- graphBAM(dfFemale, edgemode = "directed") @ We are interested in pathways that are common to both male and female graphs for the brain tissue and hence proceed to perform a graph intersection operation using the \Rmethod{graphIntersect} method. Since edges can have different values of the weight attribute, we would like the result to have the sum of the weight attribute in the male and female graphs. We pass in \Rcode{sum} as the function for handling weights to the \Rcode{edgeFun} argument. The \Rcode{edgeFun} argument should be passed a list of named functions corresponding to the edge attributes to be handled during the intersection process. <>= intrsct <- graphIntersect(male, female, edgeFun=list(weight = sum)) intrsct @ If node attributes were present in the \Robject{graphBAM} objects, a list of named function could be passed as input to the \Rcode{graphIntersect} method for handling them during the intersection process. We proceed to remove edges from the \Robject{graphBAM} result we just calculated with a weight attribute less than a numeric value of 0.8 using the \Rmethod{removeEdgesByWeight} method. <>= resWt <- removeEdgesByWeight(intrsct, lessThan = 1.5) @ Once we have narrowed down to the edges that we are interested in, we would like to change the color attribute for these edges in our original \Robject{graphBAM} objects for the male and female graphs to "red". Before an attribute can be added, we have to set its default value using the \Rfunction{edgedataDefaults} method. For our example, we set the default value for the color attribute to white. We first obtain the from - to relationship for the \Rcode{resWt} graph using the \Rmethod{extractFromTo} method and then make use of the \Rmethod{edgeData} method to update the "color" edge attribute. <>= ftSub <- extractFromTo(resWt) edgeDataDefaults(male, attr = "color") <- "white" edgeDataDefaults(female, attr = "color") <- "white" edgeData(male, from = as.character(ftSub[,"from"]), to = as.character(ftSub[,"to"]), attr = "color") <- "red" edgeData(female, from = as.character(ftSub[,"from"]), to = as.character(ftSub[,"to"]), attr = "color") <- "red" @ \section{MultiGraphs} \subsection{Introduction} The \Rclass{MultiGraph} class can be used to represent graphs that share a single node set and have have one or more edge sets, each edge set representing a different type of interaction between the nodes. An \Robject{edgeSet} object can be described as representing the relationship between a set of from-nodes and to-nodes which can either be directed or undirected. A numeric value (weight) indicates the strength of interaction between the connected edges. Self loops are permitted in the \Rclass{MultiGraph} class representation (i.e. the from-node is the same as the to-node). The \Rclass{MultiGraph} class supports the handling of arbitrary node and edge attributes. These attributes are stored separately from the edge weights to facilitate efficient edge weight computation. We shall load the \Rpackage{graph} and \Rpackage{RBGL} packages that we will be using. We will then create a \Rclass{MultiGraph} object and then spend some time examining some of the different functions that can be applied to \Rclass{MultiGraph} objects. <>= library(graph) library(RBGL) @ \subsection{ A simple MultiGraph example} We proceed to construct a \Rclass{MultiGraph} object with directed \Robject{edgeSets} to represent the flight connections of airlines Alaska, Delta, United and American that fly between the cities Baltimore, Denver, Houston, Los Angeles, Seattle and San Francisco. For our example, the cities represent the nodes of the \Rclass{MultiGraph} and we have one \Robject{edgeSet} each for the airlines. Each \Robject{edgeSet} represents the flight connections from an originating city(\Rcode{from}) to the destination city(\Rcode{to}). The weight represents the fare for flying between the \Rcode{from} and \Rcode{to} cities. For each airline, we proceed to create a \Rclass{data.frame} containing the originating city, the destination city and the fare. <>= ft1 <- data.frame( from = c("SEA", "SFO", "SEA", "LAX", "SEA"), to = c("SFO", "LAX", "LAX", "SEA", "DEN"), weight = c( 90, 96, 124, 115, 259)) ft2 <- data.frame( from = c("SEA", "SFO", "SEA", "LAX", "SEA", "DEN", "SEA", "IAH", "DEN"), to = c("SFO", "LAX", "LAX", "SEA", "DEN", "IAH", "IAH", "DEN", "BWI"), weight= c(169, 65, 110, 110, 269, 256, 304, 256, 271)) ft3 <- data.frame( from = c("SEA", "SFO", "SEA", "LAX", "SEA", "DEN", "SEA", "IAH", "DEN", "BWI"), to = c("SFO", "LAX", "LAX", "SEA", "DEN", "IAH", "IAH", "DEN", "BWI", "SFO"), weight = c(237, 65, 156, 139, 281, 161, 282, 265, 298, 244)) ft4 <- data.frame( from = c("SEA", "SFO", "SEA", "SEA", "DEN", "SEA", "BWI"), to = c("SFO", "LAX", "LAX", "DEN", "IAH", "IAH", "SFO"), weight = c(237, 60, 125, 259, 265, 349, 191)) @ These data frames are then passed to \Rclass{MultiGraph} class constructor as a named \Robject{list}, each member of the list being a \Robject{data.frame} for an airline. A logical vector passed to the \Rcode{directed} argument of the \Rclass{MultiGraph} constructor indicates whether the \Robject{MultiGraph} to be created should have directed or undirected edge sets. <>= esets <- list(Alaska = ft1, United = ft2, Delta = ft3, American = ft4) mg <- MultiGraph(esets, directed = TRUE) mg @ The nodes (cities) of the \Rclass{MultiGraph} object can be obtained by using the \Rmethod{nodes} method. <>= nodes(mg) @ To find the fares for all the flights that originate from SEA for the Delta airline, we can use the \Rmethod{mgEdgeData} method. <>= mgEdgeData(mg, "Delta", from = "SEA", attr = "weight") @ We proceed to add some node attributes to the \Robject{MultiGraph} using the \Rfunction{nodeData} method. Before node attributes can be added, we have to set a default value for each node attribute using the \Rfunction{nodeDataDefuault} method. For our example, we would like to set a default value of square for the node attribute shape. We would like to set the node attribute "shape" for Seattle to the value \Rcode{"triangle"} and that for the cities that connect with Seattle to the value \Rcode{"circle"}. <>= nodeDataDefaults(mg, attr="shape") <- "square" nodeData(mg, n = c("SEA", "DEN", "IAH", "LAX", "SFO"), attr = "shape") <- c("triangle", "circle", "circle", "circle", "circle") @ The node attribute shape for cities we have not specifically assigned a value (such as BWI) gets assigned the default value of "square". <>= nodeData(mg, attr = "shape") @ We then update the edge attribute \Rcode{color} for the Delta airline flights that connect with Seattle to "green". For the remaining Delta flights that connect to other destination in the MultiGraph, we would like to assign a default color of "red". Before edge attributes can be added to the MultiGraph, their default values must be set using the \Rfunction{mgEdgeDataDefaults} method. Subsequently, the \Rfunction{megEdgeData<-} method can be used to update specific edge attributes. <>= mgEdgeDataDefaults(mg, "Delta", attr = "color") <- "red" mgEdgeData(mg, "Delta", from = c("SEA", "SEA", "SEA", "SEA"), to = c("DEN", "IAH", "LAX", "SFO"), attr = "color") <- "green" @ <>= mgEdgeData(mg, "Delta", attr = "color") @ We are only interested in studying the fares for the airlines Alaska, United and Delta and hence would like to create a smaller \Rclass{MultiGraph} object containing edge sets for only these airlines. This can be achieved using the \Rmethod{subsetEdgeSets} method. <>= g <- subsetEdgeSets(mg, edgeSets = c("Alaska", "United", "Delta")) @ We proceed to find out the lowest fares for Alaska, United and Delta along the routes common to them. To do this, we make use of the \Rmethod{edgeSetIntersect0} method which computes the intersection of all the edgesets in a MultiGraph. While computing the intersection of edge sets, we are interesting in retaining the lowest fares in cases where different airlines flying along a route have different fares. To do this, we pass in a named list containing the \Rmethod{weight} function that calculates the minimum of the fares as the input to the \Rmethod{edgeSetIntersect0} method. (The user has the option of specifying any function for appropriate handling of edge attributes ). <>= edgeFun <- list( weight = min) gInt <- edgeSetIntersect0(g, edgeFun = edgeFun) gInt @ The edge set by the \Rmethod{edgeSetIntersect0} operation is named by concatenating the names of the edgeSets passed as input to the function. <>= mgEdgeData(gInt, "Alaska_United_Delta", attr= "weight") @ \subsection{MultiGraph representation of mice gene interaction data. (SAGE)} The C57BL/6J and C3H/HeJ mouse strains exhibit different cardiovascular and metabolic phenotypes on the hyperlipidemic apolipoprotein E (Apoe) null background. The interaction data for the genes from adipose, brain, liver and muscle tissue samples from male and female mice were studied. This interaction data for the various genes is included in the \Rpackage{graph} package as a list of \Robject{data.frame}s containing information for \Rcode{from-gene}, \Rcode{to-gene} and the strength of interaction \Rcode{weight} for each of the tissues studied. We proceed to load the data for male and female mice. <>= data("esetsFemale") data("esetsMale") names(esetsFemale) head(esetsFemale$brain) @ The \Robject{esetsFemale} and \Robject{esetsMale} objects are a named \Robject{list} of data frames corresponding to the data obtained from adipose, brain, liver and muscle tissues for the male and female mice that were studied. Each data frame has a from, to and a weight column corresponding to the from and to genes that were studied and weight representing the strength of interaction of the corresponding genes. We proceed to create \Rclass{MultiGraph} objects for the male and female data sets by making use of the \Rclass{MultiGraph} constructor, which directly accepts a named list of data frames as the input and returns a MultiGraph with edgeSets corresponding to the names of the data frames. <>= female <- MultiGraph(edgeSets = esetsFemale, directed = TRUE) male <- MultiGraph(edgeSets = esetsMale, directed = TRUE ) male female @ We then select a particular gene of interest in this network and proceed to identify its neighboring genes connected to this gene in terms of the maximum sum of weights along the path that connects the genes for the brain edge set. We are interested in the gene "10024416717" and the sum of the weights along the path that connects this genes to the other genes for the brain tissue. Since the algorithms in the \Rpackage{RBGL} package that we will use to find the edges that are connected to the gene "10024416717" do not work directly with \Rpackage{MultiGraph} objects, we proceed to create \Rcode{graphBAM} objects from the male and female edge sets for the brain tissue. \Rpackage{MultiGraph} objects can be converted to a named list of \Robject{graphBAM} objects using the \Rmethod{graphBAM} method. <>= maleBrain <- extractGraphBAM(male, "brain")[["brain"]] maleBrain femaleBrain <- extractGraphBAM(female, "brain")[["brain"]] @ We then identify the genes connected to gene "10024416717" as well as the sum of the weights along the path that connect the identified genes using the function \Rfunction{bellman.ford.sp} function from the \Rpackage{RBGL} package. <>= maleWt <- bellman.ford.sp(maleBrain, start = c("10024416717"))$distance maleWt <- maleWt[maleWt != Inf & maleWt != 0] maleWt femaleWt <- bellman.ford.sp(femaleBrain, start = c("10024416717"))$distance femaleWt <- femaleWt[femaleWt != Inf & femaleWt != 0] femaleWt @ For the subset of genes we identified, we proceed to add node attributes to our original \Robject{MultiGraph} objects for the male and female data. The node "10024416717" and all its connected nodes are assigned a color attribute "red" while the rest of the nodes are assigned a color color attribute of "gray". <>= nodeDataDefaults(male, attr = "color") <- "gray" nodeData(male , n = c("10024416717", names(maleWt)), attr = "color" ) <- c("red") nodeDataDefaults(female, attr = "color") <- "gray" nodeData(female , n = c("10024416717", names(femaleWt)), attr = "color" ) <- c("red") @ Our \Robject{MultiGraph} objects now contain the required node attributes for the subset of genes that we have narrowed our selection to. For the \Robject{MultiGraph} objects for male and female, we are also interested in the genes that are common to both \Robject{MultiGraph}s. This can be calculated using the \Rfunction{graphIntersect} method. <>= resInt <- graphIntersect(male, female) resInt @ The operations we have dealt with so far only deal with manipulation of \Rclass{MultiGraph} objects. Additional functions will need to be implemented for the visualization of the \Rclass{MultiGraph} objects. \end{document} graph/vignettes/clusterGraph.Rnw0000644000175400017540000000610013175713336020052 0ustar00biocbuildbiocbuild% % NOTE -- ONLY EDIT clusterGraph.Rnw!!! % clusterGraph.tex file will get overwritten. % %\VignetteIndexEntry{clusterGraph and distGraph} %\VignetteDepends{graph, stats} %\VignetteKeywords{Graph, clustering, machine learning} %\VignettePackage{graph} \documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in %\parskip=.3cm \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \begin{document} \title{How To use the clusterGraph and distGraph classes} \maketitle \section*{Introduction} Graphs can be used to help explore different clustering algorithms. While they have not been extensively used in this regard that is probably due to the lack of software rather than for any other reasons. As we demonstrate below, one can easily and naturally compare different aspects of clustering algorithms using these tools. \section*{clusterGraph} A \textit{clusterGraph} is a graph defined on a set of nodes that have been clustered or grouped in some fashion. The grouping must form a partition of the nodes. In this graph all nodes within the same cluster are adjacent while there are no edges between clusters. Thus, each cluster is a complete graph but there are no between cluster edges. <>= library("graph") library("cluster") data(ruspini) pm <- pam(ruspini, 4) cG <- new("clusterGraph", clusters = split(names(pm$clustering), pm$clustering)) nodes(cG) @ We now have a graph that we could perform various operations on. For example, we could try a second clustering algorithm on the same data and see if the two largely agree. <>= library(stats) km = kmeans(ruspini, 4) cG.km = new("clusterGraph", clusters=split(as.character(1:75), km$cluster)) inBoth = intersection(cG.km, cG) @ The graph \Robject{inBoth} is of length \Sexpr{length(inBoth)} indicating that there are that many distinct groups. One could, compute various measures of correspondence between the two clustering algorithms using the graph representation. \section*{distGraph} We use this same data to consider some potential uses for the \Rclass{distGraph} class. Others have considered a similar structure for exploring clustering algorithms. %%FIXME: track down the Butte et al and the Shamir references <<>>= d1 = dist(ruspini) dG = new("distGraph", Dist=d1) rl = NULL j=1 for(i in c(40, 30, 10, 5) ){ nG = threshold(dG, i) rl[[j]] = connComp(nG) j=j+1 } @ We can then examine the components of \Robject{rl} to see how the graph is being reduced. <>= sapply(rl, length) @ <>= dr = range(d1) rl.lens = sapply(rl[[4]], length) @ We see that when we remove all distances that are bigger than 5 units (the range of distances was from \Sexpr{round(dr[1], 3)} to \Sexpr{round(dr[2],3)}) there are still only \Sexpr{length(rl[[4]])} connected components - one of which is of size \Sexpr{max(rl.lens)}. \end{document} graph/vignettes/graph.Rnw0000644000175400017540000003444613175713336016526 0ustar00biocbuildbiocbuild% % NOTE -- ONLY EDIT graph.Rnw!!! % graph.tex file will get overwritten. % %\VignetteIndexEntry{Graph} %\VignetteDepends{graph} %\VignetteKeywords{Graph} %\VignettePackage{graph} \documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in %\parskip=.3cm \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\classdef}[1]{% {\em #1} } \begin{document} \title{How To use the graph package} \maketitle \section{Introduction} The \Rpackage{graph} package provides an implementation of graphs (the kind with nodes and edges) in R. Software infrastructure is provided by three different, but related packages, \begin{description} \item[graph] Provides the basic class definitions and functionality. \item[RBGL] Provides an interface to graph algorithms (such as shortest path, connectivity etc). \item[Rgraphviz] Provides rendering functionality. Different layout algorithms are provided and node plotting, line type, color etc parameters can be controlled by the user. \end{description} A short description of the R classes and methods is given at the end of this document. But here, we begin by creating some graphs and performing different operations on those graphs. The reader will benefit greatly from also have the \Rpackage{Rgraphviz} package available and from using it to render the different graphs as they proceed through these notes. \section{Getting Started} We will first create a graph and then spend some time examining some of the different functions that can be applied to the graph. We will create a random graph as the basis for our explorations (but will delay explaining the creation of this graph until Section~\ref{sec:rg}). First we attach the \Rpackage{graph} package and create a random graph (this is based on the Erdos-Renyi model for random graphs). <>= library(graph) set.seed(123) g1 = randomEGraph(LETTERS[1:15], edges=100) g1 @ We can next list the nodes in our graph, or ask for the degree (since this is an undirected graph we do not distinguish between in-degree and out-degree). For any node in \Robject{g1} we can find out which nodes are adjacent to it using the \Rfunction{adj} function. Or we can find out which nodes are accessible from it using the \Rfunction{acc} function. Both functions are \textit{vectorized}, that is, the user can supply a vector of node names, and each returns a named list. The names of the list elements correspond to the names of the nodes that were supplied. For \Rfunction{acc} the elements of the list are named vectors, the names correspond to the nodes that can be reached and the values correspond to their distance from the starting node. <>= nodes(g1) degree(g1) adj(g1, "A") acc(g1, c("E", "G")) @ One can obtain subgraphs of a given graph by specifying the set of nodes that they are interested in. A subgraph is actually a copy of the relevant part of the original graph. A subgraph is the set of specified nodes plus any edges between them. We can also compute the boundary of a subgraph. The boundary is the set of all nodes in the original graph that have an edge to the specified subgraph. The \Rfunction{boundary} returns a named list with one component for each node in the subgraph. The elements of this list are vectors which contain all nodes in the original graph that have an edge to that element of the subgraph. We also demonstrate two edge related functions in the code chunk below. One retrieves all edges from a graph and is called \Rfunction{edges} while the other retrieves the edge weights and is called \Rfunction{edgeWeights}. <>= sg1 = subGraph(c("A", "E", "F","L"), g1) boundary(sg1, g1) edges(sg1) edgeWeights(sg1) @ \subsection{Some Algebraic Manipulations} The examples here originally came from Chris Volinsky at AT\&T, but have been modified in places as the \Rpackage{graph} package has evolved. In the code chunk below we demonstrate how to create a graph \textit{from scratch}. In this code chunk two graphs are created, \Robject{gR} and \Robject{gR2}, the first is undirected while the second is a directed graph. <>= V <- LETTERS[1:4] edL1 <- vector("list", length=4) names(edL1) <- V for(i in 1:4) edL1[[i]] <- list(edges=c(2,1,4,3)[i], weights=sqrt(i)) gR <- graphNEL(nodes=V, edgeL=edL1) edL2 <- vector("list", length=4) names(edL2) <- V for(i in 1:4) edL2[[i]] <- list(edges=c(2,1,2,1)[i], weights=sqrt(i)) gR2 <- graphNEL(nodes=V, edgeL=edL2, edgemode="directed") @ New graphs can be constructed from these graphs in many different ways but in all cases the existing graph itself is not altered, but rather a copy is made and the changes are carried out on that copy. Nodes and or edges can be added to the graphs using the functions \Rfunction{addNode}, \Rfunction{addEdge}, \Rfunction{removeNode} and \Rfunction{removeEdge}. All functions will take a vector of nodes or edges and add or remove all of them at one time. One other function in this family is \Rfunction{combineNodes}, this function takes a vector of nodes and a graph and combines those nodes into a single new node (the name of which must be supplied). The function \Rfunction{clearNode} removes all edges to the specified nodes. <>= gX = addNode(c("E", "F"), gR) gX gX2 = addEdge(c("E", "F", "F"), c("A", "D", "E"), gX, c(1,2,3)) gX2 gR3 = combineNodes(c("A","B"), gR, "W") gR3 clearNode("A", gX) @ When working with directed graphs it is sometimes of interest to find the \textit{underlying} graph. This is the graph with all edge orientation removed. The function \Rfunction{ugraph} provides this functionality. <>= ##find the underlying graph ugraph(gR2) @ Other operations that can be carried out on graphs, that are of some interest, are unions, intersections and complements. We have take a rather specialized definition of these operations and it is not one that is widely used, but it is very useful for the bioinformatics and computational biology projects that we are working on. For two or more graphs all with \textbf{the same nodes} we define: \begin{description} \item[union] to be the graph with the same set of nodes as the inputs and edges between any two nodes that were connected in any one graph. \item[intersection] to be the graph with the same set of nodes as the inputs and with edges between two nodes if there was an edge in all graphs. \item[complement] to be the graph with the same set of nodes as its input and edges in the complement if there were none in the original graph. \end{description} In the code chunk below we generate a random graph and then demonstrate the concepts of union, intersection and complement. <>= set.seed(123) gR3 <- randomGraph(LETTERS[1:4], M<-1:2, p=.5) x1 <- intersection(gR,gR3) x1 x2 <- union(gR,gR3) x2 x3 <- complement(gR) x3 @ Notice that while the graphs \Robject{gR} and \Robject{gR2} have different sets of edge weights these are lost when the \Rmethod{union}, \Rmethod{intersection} and \Rmethod{complement} are taken. It is not clear how they should be treated and in the current implementation they are ignored and replaced by weight 1 in the output. \section{Random Graphs} \label{sec:rg} Three basic strategies for finding random graphs have been implemented: \begin{description} \item[randomEGraph] A random edge graph. In this graph edges are randomly generated according to a specified probability, or the number of edges can be specified and they are randomly assigned. \item[randomGraph] For this graph the number of nodes is specified as well as some latent factor. The user provides both the node labels and a factor with some fixed number of levels. Each node is randomly assigned levels of the factor and then edges are created between nodes that share the same levels of the factor. \item[randomNodeGraph] A random graph with a pre-specified node distribution is generated. \end{description} The function \Rfunction{randomEGraph} will generate graphs using the random edge model. In the code chunk below we generate a graph, \Robject{g1} on 12 nodes (with labels from the first 12 letters of the alphabet) and specify that the probability of each edge existing is $0.1$. The graph \Robject{g2} is on the same set of nodes but we specify that it will contain 20 edges. <>= set.seed(333) V = letters[1:12] g1 = randomEGraph(V, .1) g1 g2 = randomEGraph(V, edges=20) g2 @ The function \Rfunction{randomGraph} generates graphs according to the latent variable model. In the code chunk bel <>= set.seed(23) V <- LETTERS[1:20] M <- 1:4 g1 <- randomGraph(V, M, .2) @ Our last example involves the generating random graphs with a prespecified node degree distribution. In the example below we require a node degree distribution of 1, 1, 2 and 4. We note that self-loops are allowed (and if someone wants to provide the code to eliminate them, we would be glad to have it). <>= set.seed(123) c1 <- c(1,1,2,4) names(c1) <- letters[1:4] g1 <- randomNodeGraph(c1) @ \section{Some Graph Algorithms} In addition to the simple algebraic operations that we have demonstrated in the preceeding sections of this document we also have available implementations of some more sophisticated graph algorithms. If possible though, one should use the algorithms provided in the \Rpackage{RBGL}. The function \Rfunction{connComp} returns a list of the connected components of the given graph. For a \textit{directed graph} or \textit{digraph} the underlying graph is the graph that results from removing all direction from the edges. This can be achieved using the function \Rfunction{ugraph}. A weakly connected component of a digraph is one that is a connected component of the underlying graph and this is the default behavior of \Rfunction{connComp}. <>= g1 g1cc <- connComp(g1) g1cc g1.sub <- subGraph(g1cc[[2]], g1) g1.sub @ Another useful set of graph algorithms are the so-called searching algorithm. For the \Rpackage{graph} package we have implemented the depth first searching algorithm as described in Algorithm 4.2.1 of \cite{GrossYellen}. More efficient and comprehensive algorithms are available through the \Rpackage{RBGL} package. The returned value is a named vector. The names correspond to the nodes of the graph and the values correspond to the distance (often the number of steps) or sum of the edgeweights along the path to that node. <>= DFS(gX2, "E") @ \section{Special Types of Graphs} We have found it useful to define a few special types or classes of graphs for some bioinformatic problems but they likely have broader applicability. All of the functions described above should have methods for these special types of graphs (although we may not yet have implemented all of them, please let the maintainer know if you detect any omissions). First is the \Robject{clusterGraph}. A cluster graph is a graph where the nodes are separated into groups or clusters. Within a cluster all nodes are connected (a complete graph) but between clusters there are no edges. Such graphs are useful representations of the output of clustering algorithms. <>= cG1 <- new("clusterGraph", clusters=list(a=c(1,2,3), b=c(4,5,6))) cG1 acc(cG1, c("1", "2")) @ The other special type of graph that we have implemented is based on distances. This graph is completely connected but the edge weights come from inter-node distances (perhaps computed from an expression experiment). <>= set.seed(123) x <- rnorm(26) names(x) <- letters library(stats) d1 <- dist(x) g1 <- new("distGraph", Dist=d1) g1 @ \section{Coercion} There are very many different ways to represent graphs. The one chosen for our basic implementation is a node and edge-list representation. However, many others use an adjacency matrix representation. We provide a number of different tools that should help users coerce graphs between the different representations. Coercion from an adjacency matrix to a \Rclass{graphNEL} object requires a numeric matrix with both row and column names. These are taken to define the nodes of the graph and the edge weights in the resultant graph are determined by the values in the array (weights zero are taken to indicate the absence of an edge). The function \Rfunction{ftM2adjM} converts a \textit{from-to} matrix into an adjacency matrix. Conversion to a \Rclass{graphNEL} graph can be carried out using the \Rfunction{as} method for that class. An \texttt{aM} is an affiliation matrix which is frequently used in social networks analysis. The rows of \texttt{aM} represent actors, and the columns represent events. A one, \texttt{1}, in the ith row and jth column represents the affiliation of the ith actor with the jth event. The function \Rfunction{aM2bpG} coerces a \texttt{aM} into an instance of the \Rclass{graphNEL} where the nodes are both the actors and the events (there is currently no bipartite graph representation, although one could be added). The two functions \Rfunction{sparseM2Graph} and \Rfunction{graph2SparseM} provide coercion between \Rclass{graphNEL} instances and sparse matrix representations. Currently we rely on the \Rpackage{SparseM} of Koncker and Ng for the sparse matrix implementation. @ \subsection{Classes} We briefly review some of the class structure here and refer the reader to the technical documentation for this package for more details. The basic class, \Rclass{graph}, is a virtual class and all other classes will extend this class. There are three main implementations available. Which is best will depend on the particular data set and what the user wants to do with it. The only slot defined in the virtual class is \Robject{edgemode} which can be either \textit{directed} or \textit{undirected} indicating whether the edges are directed or not. The class \Rclass{graphNEL} is a node and edge-list representation of a graph. That is the graph is comprised of two components a list of nodes and a list of the out edges for each node. The class \Rclass{graphAM} is an adjacency matrix implementation. It will be developed next and will use the \Rpackage{SparseM} package if it is available. The class \Rclass{clusterGraph} is a special form of graph for clustering. In this graph each cluster is a completely connected component (a clique) and there are no between cluster edges. \end{document} graph/vignettes/graphAttributes.Rnw0000644000175400017540000001367013175713336020571 0ustar00biocbuildbiocbuild% % NOTE -- ONLY EDIT howtogenefilter.Rnw!!! % Biobase.tex file will get overwritten. % %\VignetteIndexEntry{Attributes for Graph Objects} %\VignetteDepends{graph} %\VignetteKeywords{Graph} %\VignettePackage{graph} \documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\classdef}[1]{% {\em #1} } \newcommand{\myincfig}[3]{\begin{figure}[htbp] \begin{center} \includegraphics[width=#2]{#1} \caption{\label{#1}#3} \end{center} \end{figure}} \begin{document} \title{Attributes for Graph Objects} \author{Seth Falcon} \maketitle \section{Introduction} The \Rpackage{graph} package provides representations of graphs (nodes and edges) as S4 classes. This vignette demonstrates how to add arbitrary node and edge attributes to graph objects. First, we create a graph to use as an example. We will work with a \Rclass{graphAM-class} instance, however, any subclass of \Rclass{graph-class} would work. See Figure~\ref{foo}. <>= library("graph") mat <- matrix(c(0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0), byrow=TRUE, ncol=4) rownames(mat) <- letters[1:4] colnames(mat) <- letters[1:4] @ <>= g1 <- graphAM(adjMat=mat) @ <>= if (require("Rgraphviz")) { gn = as(g1, "graphNEL") plot(gn, nodeAttrs=makeNodeAttrs(gn, shape="circle", fillcolor="orange")) } else { plot(1, 1, main="Rgraphviz required for this plot") } @ \myincfig{foo}{0.33\textwidth}{The graph \Robject{g1}.} \section{Edge Attributes} \subsection{Default edge attributes} All edges in a graph support the same set of attributes. The set of supported attributes can be defined and accessed using the \Rmethod{edgeDataDefaults} method. A new graph instance will not have any edge attributes defined. % <>= edgeDataDefaults(g1) @ When a new edge attribute is defined, a default value must be specified. Here we will define two edge attributes: \Rcode{weight} and \Rcode{code} and specify a default value for each one. <>= edgeDataDefaults(g1, "weight") <- 1 edgeDataDefaults(g1, "code") <- "plain" edgeDataDefaults(g1) @ The default value for a particular attribute can be obtained by specifying the attribute name in the call to \Rmethod{edgeDataDefaults}. <>= edgeDataDefaults(g1, "weight") @ \subsection{Getting edge attributes} Edge attributes are set and accessed using the \Rmethod{edgeData} method. Only attributes defined using \Rmethod{edgeDataDefaults} can be accessed using \Rmethod{edgeData}. If an attribute has not be set using \Rmethod{edgeData} for a given edge, then the default value is used. <>= edgeData(g1, from="a", to="d", attr="weight") edgeData(g1, from="a", attr="weight") edgeData(g1, to="a", attr="weight") allAttrsAllEdges <- edgeData(g1) weightAttrAllEdges <- edgeData(g1, attr="weight") @ \subsection{Setting edge attributes} Attributes are set using the replacement form of \Rmethod{edgeData}. This method allows the user to update the attribute for single edge, set the attributes for a collection of edges to a single value, and to set the attributes for a collection of edges to different values specified by a vector of values. <>= edgeData(g1, from="a", to="d", attr="weight") <- 2 edgeData(g1, from="a", attr="code") <- "fancy" edgeData(g1, from="a", attr="weight") edgeData(g1, from="a", attr="code") @ We can set the attributes for multiple edges to a single value. <>= f <- c("a", "b") t <- c("c", "c") edgeData(g1, from=f, to=t, attr="weight") <- 10 edgeData(g1, from=f, to=t, attr="weight") @ It is also possible to set multiple attributes to different values in a single call to \Rmethod{edgeData}. <>= edgeData(g1, from=f, to=t, attr="weight") <- c(11, 22) edgeData(g1, from=f, to=t, attr="weight") @ Finally, we can set the an attribute to a vector of values by packing it into a list: % <>= edgeData(g1, from="a", to="d", attr="code") <- list(1:10) edgeData(g1, from=f, to=t, attr="weight") <- mapply(c, f, t, "e", SIMPLIFY=FALSE) edgeData(g1, from="a", to="d", attr="code") edgeData(g1, from=f, to=t, attr="weight") @ \section{Node Attributes} \subsection{Default node attributes} Like edge attributes, all nodes in a graph support the same set of attributes. The supported set of attributes and their default values is accessed using the \Rmethod{nodeDataDefaults} method. The interface is similar to \Rmethod{edgeDataDefaults}. <>= nodeDataDefaults(g1) nodeDataDefaults(g1, attr="weight") <- 1 nodeDataDefaults(g1, attr="type") <- "vital" nodeDataDefaults(g1) nodeDataDefaults(g1, "weight") @ As with edge attributes, default values are required for each node attribute. The default value is used as the node attribute for all nodes in the graph that have not had their attribute value explicitly set. Attribute values can be any R object. \subsection{Getting and setting node attributes} Once a node attribute has been defined and given a default value using \Rmethod{nodeDataDefaults}, individual node attributes can be accessed using \Rmethod{nodeData}. <>= nodeData(g1, n="a") nodeData(g1, n="a", attr="weight") <- 100 nodeData(g1, n=c("a", "b"), attr="weight") nodeData(g1, n=c("a", "b"), attr="weight") <- 500 nodeData(g1, n=c("a", "b"), attr="weight") nodeData(g1, n=c("a", "b"), attr="weight") <- c(11, 22) nodeData(g1, n=c("a", "b"), attr="weight") @ <>= ## We need to reconcile this #g2 <- as(g1, "graphNEL") #edgeWeights(g2) @ \end{document}