rtracklayer/DESCRIPTION0000644000126300012640000000263412227135242016173 0ustar00biocbuildphs_compbioPackage: rtracklayer Title: R interface to genome browsers and their annotation tracks Version: 1.22.0 Author: Michael Lawrence, Vince Carey, Robert Gentleman Depends: R (>= 2.10), methods, GenomicRanges (>= 1.13.3) Imports: XML (>= 1.98-0), BiocGenerics (>= 0.7.7), IRanges (>= 1.19.34), XVector (>= 0.1.3), GenomicRanges (>= 1.13.43), Biostrings (>= 2.29.18), BSgenome (>= 1.23.1), zlibbioc, RCurl (>= 1.4-2), Rsamtools (>= 1.13.1) Suggests: humanStemCell, microRNA (>= 1.1.1), genefilter, limma, org.Hs.eg.db, BSgenome.Hsapiens.UCSC.hg19, TxDb.Hsapiens.UCSC.hg19.knownGene, hgu133plus2.db LinkingTo: IRanges, XVector Description: Extensible framework for interacting with multiple genome browsers (currently UCSC built-in) and manipulating annotation tracks in various formats (currently GFF, BED, bedGraph, BED15, WIG, BigWig and 2bit built-in). The user may export/import tracks to/from the supported browsers, as well as query and modify the browser state, such as the current viewport. Maintainer: Michael Lawrence License: Artistic-2.0 Collate: io.R web.R ranges.R trackDb.R browser.R ucsc.R gff.R bed.R wig.R utils.R bigWig.R chain.R quickload.R twobit.R fasta.R tabix.R bam.R trackTable.R index.R compression.R test_rtracklayer_package.R biocViews: Annotation,Visualization,DataImport Packaged: 2013-10-15 03:46:42 UTC; biocbuild rtracklayer/NAMESPACE0000644000126300012640000001203712227067671015714 0ustar00biocbuildphs_compbiouseDynLib(rtracklayer, .registration = TRUE) import(zlibbioc) importFrom("stats", offset) importFrom(utils, count.fields) importFrom("XML", getNodeSet, xmlValue, xmlAttrs, htmlTreeParse, xmlInternalTreeParse, parseURI, newXMLNode, xmlChildren, addChildren, removeChildren, saveXML) importFrom("RCurl", curlUnescape, fileUpload, getCurlHandle, getForm, getURL, postForm) importFrom("BiocGenerics", rbind, cbind, lapply, sapply, unique) importClassesFrom("IRanges", RangedData, RangedDataList, DataTable, Annotated, Vector, List, DataTableORNULL, characterORNULL, RangedSelection, SimpleList, DataFrame) importFrom("IRanges", DataFrame, IRanges, RangedDataList, RangedData, RangesList, Rle, RangedSelection, RleList, isSingleString, recycleIntegerArg, recycleNumericArg, isSingleStringOrNA, isTRUEorFALSE, isSingleNumberOrNA, PartitioningByWidth, shift) importMethodsFrom("IRanges", elementLengths, window, start, end, width, range, "start<-", "end<-", "width<-", split, lapply, sapply, unlist, unique, as.vector, as.list, as.data.frame, colnames, rownames, "colnames<-","rownames<-", ranges, values, score, "ranges<-", "values<-", "score<-", space, universe, metadata, "universe<-", "metadata<-", isDisjoint, queryHits, findOverlaps, reduce, nrow, summary, resize, mcols, "mcols<-", togroup) importClassesFrom("GenomicRanges", GenomicRanges, GRanges, GRangesList, GIntervalTree) importFrom("GenomicRanges", GRanges, GRangesList, Seqinfo, genome, "genome<-", merge) importMethodsFrom("GenomicRanges", seqnames, seqlengths, strand, "strand<-", seqinfo, "seqinfo<-", seqlevels, "seqlevels<-", coerce) importFrom("Biostrings", get_seqtype_conversion_lookup, masks, writeXStringSet, "masks<-", DNAStringSet) importFrom("BSgenome", installed.genomes, releaseDate, organism, providerVersion, provider, bsapply) importFrom("Rsamtools", path, indexTabix, headerTabix, scanTabix, bgzip, TabixFile, index, asBam) importClassesFrom("Rsamtools", RsamtoolsFile) importFrom("tools", file_path_as_absolute, file_path_sans_ext) exportClasses(BrowserSession, BrowserView, BrowserViewList, UCSCSession, UCSCView, UCSCData, TrackLine, BasicTrackLine, GraphTrackLine, Bed15TrackLine, UCSCTrackModes, BigWigSelection, UCSCSchema, Quickload, QuickloadGenome) ## File classes exportClasses(RTLFile, CompressedFile, GFFFile, UCSCFile, BEDFile, WIGFile, ChainFile, FastaFile, GFF1File, GFF2File, GFF3File, BEDGraphFile, BED15File, GTFFile, GVFFile, BigWigFile, TwoBitFile) exportMethods(activeView, "activeView<-", blocks, browseGenome, browserSession, "browserSession<-", browserView, browserViews, close, export, export.bed, export.bed15, export.bedGraph, export.gff, export.gff1, export.gff2, export.gff3, export.ucsc, export.wig, export.bw, export.2bit, import, import.bed, import.bed15, import.bedGraph, import.gff, import.gff1, import.gff2, import.gff3, import.ucsc, import.wig, import.bw, import.chain, import.2bit, "sequence<-", "track<-", track, trackNames, "trackNames<-", getTable, tableNames, trackName, "trackName<-", tableName, "tableName<-", ucscTrackModes, "ucscTrackModes<-", ucscSchema, coerce, initialize, show, summary, "[", ucscTableQuery, genome, "genome<-", chrom, "chrom<-", range, "range<-", visible, "visible<-", liftOver, offset, reversed, nrow, formatDescription, referenceSequence, "referenceSequence<-", asBED, asGFF, split, ## from IRanges start, end, "start<-", "end<-", score, "score<-", as.data.frame, space, mcols, ## from GenomicRanges strand, seqinfo, "seqinfo<-", ## from BSgenome organism, releaseDate ) export(genomeBrowsers, start, end, strand, "start<-", "end<-", width, "width<-", ranges, values, GenomicData, GenomicSelection, score, "score<-", as.data.frame, space, ucscGenomes, BigWigSelection, GRangesForUCSCGenome, GRangesForBSGenome, summary, seqinfo, genome, "genome<-", uri, Quickload, quickload, QuickloadGenome, organism, releaseDate, mcols, wigToBigWig, SeqinfoForBSGenome, SeqinfoForUCSCGenome, resource, path) export(GFFFile, UCSCFile, BEDFile, WIGFile, ChainFile, FastaFile, GFF1File, GFF2File, GFF3File, BEDGraphFile, BED15File, GTFFile, GVFFile, BigWigFile, TwoBitFile) rtracklayer/NEWS0000644000126300012640000000545612227067671015203 0ustar00biocbuildphs_compbioCHANGES IN VERSION 1.20 ----------------------- NEW FEATURES o Table query interface supports multiple query ranges. o Files (RTLFile objects) can be directly uploaded to UCSC, via track<-. SIGNIFICANT USER-VISIBLE CHANGES o All methods with asRangedData argument now have it default to FALSE, instead of TRUE. A warning is issued if the argument is missing. Eventually, we will drop all support for RangedData import (export will still work via automatic coercion to GRanges). BUG FIXES o Chromosome list for a genome is now downloaded from the table browser, instead of the Genome Browser page. This supports genomes with more than 1000 contigs. o BEDX+Y formats now work when a track line is present, and the extraCols argument is used for the column names. o path.expand() is now called for paths passed off to the Kent library. o Order of metadata columns upon GFF import no longer depends on LC_COLLATE. CHANGES IN VERSION 1.17 ----------------------- NEW FEATURES o Export of GappedAlignments objects as BAM files. There is also a corresponding import method. o Support for BEDX+Y import using the extraCols parameter to import. o Direct export of RleList objects to BigWig files. CHANGES IN VERSION 1.15 ----------------------- NEW FEATURES o Integrated with tabix via Rsamtools. BED and GFF export methods now generate a tabix index, if index=TRUE. Most import() methods gain a 'which' argument that takes advantage of tabix, when available. o Added wigToBigWig() function for efficient conversion of WIG to BigWig. o Added SeqinfoForBSGenome() and SeqinfoForUCSCGenome() for conveniently retrieving Seqinfo objects for a given genome. o Added support for FASTA import/export via Biostrings. o GTF and GVF files are now parsed as GFF. SIGNIFICANT USER-VISIBLE CHANGES o The import/export API is now based on RTLFile objects, which wrap a file path, URL or connection. There is an RTLFile subclass for every file format. This makes it easier to extend rtracklayer (export, import) with new file types. The existing API is still supported (and even encouraged for most uses). o Handle CSV attributes in GFF3 using CharacterList columns. o BED columns thickStart/thickEnd translate to an IRanges column named "thick". The blockStarts/Sizes/Count columns now map to a single RangesList "blocks" column. BUG FIXES o Numerous fixes in the import/export methods, as a result of implementing a full unit test suite. If something was not working for you in the past, please try again. o Compression and connections should now work fairly uniformly across file types. (start date: 29 March, 2012) rtracklayer/R/0000755000126300012640000000000012227067656014676 5ustar00biocbuildphs_compbiortracklayer/R/bam.R0000644000126300012640000000533412227067656015565 0ustar00biocbuildphs_compbio### ========================================================================= ### BAM support (wrappers around Rsamtools) ### ------------------------------------------------------------------------- setMethod("import", "BamFile", function(con, format, text, use.names = FALSE, param = ScanBamParam(...), ...) { if (!missing(format)) checkArgFormat(con, format) readGAlignmentsFromBam(con, use.names = use.names, param = param) }) setMethod("export", c("GAlignments", "BamFile"), function(object, con, format, index = TRUE) { sam_path <- paste(file_path_sans_ext(path(con)), ".sam", sep = "") sam_con <- file(sam_path, "w") on.exit(close(sam_con)) si <- seqinfo(object) has_info <- seqlevels(si)[!is.na(seqlevels(si)) & !is.na(seqlengths(si))] si <- si[has_info] if (length(si)) { header <- paste0("@SQ", "\tSN:", seqlevels(si), "\tLN:", seqlengths(si)) has_genome <- !is.na(genome(si)) header[has_genome] <- paste0(header[has_genome], "\tAS:", genome(si)[has_genome]) writeLines(header, sam_con) } emd <- values(object) aln <- paste(if (!is.null(names(object))) names(object) else "*", if (!is.null(emd[["flag"]])) emd[["flag"]] else ifelse(strand(object) == "-", "16", "0"), seqnames(object), start(object), if (!is.null(emd[["mapq"]])) emd[["mapq"]] else "255", cigar(object), if (!is.null(emd[["mrnm"]])) emd[["mrnm"]] else "*", if (!is.null(emd[["mpos"]])) emd[["mpos"]] else "0", if (!is.null(emd[["isize"]])) emd[["isize"]] else "0", if (is(object, "GappedReads")) object@qseq else if (!is.null(emd[["seq"]])) emd[["seq"]] else "*", if (!is.null(emd[["qual"]])) emd[["qual"]] else "*", sep = "\t") writeLines(aln, sam_con) close(sam_con) on.exit() bam <- asBam(sam_path, file_path_sans_ext(sam_path), overwrite = TRUE, indexDestination = index) unlink(sam_path) invisible(bam) }) setMethod("export", c("ANY", "BamFile"), function(object, con, format, ...) { export(as(object, "GAlignments"), con, ...) }) rtracklayer/R/bed.R0000644000126300012640000005173112227067656015562 0ustar00biocbuildphs_compbio### ========================================================================= ### BED (Browser Extended Display) support (including bedGraph and BED15) ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes ### setClass("BEDFile", contains = "RTLFile") BEDFile <- function(resource) { new("BEDFile", resource = resource) } setClass("BEDGraphFile", contains = "BEDFile") BEDGraphFile <- function(resource) { new("BEDGraphFile", resource = resource) } setClass("BED15File", contains = "BEDFile") BED15File <- function(resource) { new("BED15File", resource = resource) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export.bed", function(object, con, ...) standardGeneric("export.bed")) setMethod("export.bed", "ANY", function(object, con, ...) { export(object, con, "bed", ...) }) setMethod("export", c("ANY", "BEDFile"), function(object, con, format, ...) { if (!missing(format)) checkArgFormat(con, format) cl <- class(object) if (hasMethod("asBED", class(object))) object <- asBED(object) track <- try(as(object, "RangedData"), silent = TRUE) if (class(track) == "try-error") { track <- try(as(object, "RangedDataList"), silent = TRUE) if (is(track, "try-error")) stop("cannot export object of class '", cl, "': ", track) } export(track, con, ...) }) setMethod("export", c("RangedData", "BEDFile"), function(object, con, format, append = FALSE, index = FALSE, ignore.strand = FALSE) { if (!missing(format)) checkArgFormat(con, format) name <- strand <- thickStart <- thickEnd <- color <- NULL blockCount <- blockSizes <- blockStarts <- NULL if (index) object <- sortBySeqnameAndStart(object) df <- data.frame(seqnames(object), start(object) - 1L, end(object)) score <- score(object) if (!is.null(score)) { if (!is.numeric(score) || any(is.na(score))) stop("Scores must be non-NA numeric values") } if (is(con, "BEDGraphFile")) { if (is.null(score)) ## bedGraph requires score score <- 0 df$score <- score } else { toCSV <- function(x) { if (is(x, "IntegerList")) { x <- unlist(lapply(x, paste, collapse = ","), use.names=FALSE) } else if (!is.character(x) && !is.null(x)) stop("Could not convert block coordinates to CSV") x } blockSizes <- blockStarts <- NULL if (!is.null(object$blocks)) { blockSizes <- toCSV(width(object$blocks)) blockStarts <- toCSV(start(object$blocks) - 1L) } if (is(con, "BED15File") && is.null(blockSizes)) blockStarts <- blockSizes <- "" # bed15 must have all 15 cols if (!is.null(blockSizes) || !is.null(blockStarts)) { if (is.null(blockSizes)) stop("'blockStarts' specified without 'blockSizes'") if (is.null(blockStarts)) stop("'blockSizes' specified without 'blockStarts'") lastBlock <- function(x) as.integer(sub(".*,", "", sub(",$", "", x))) lastSize <- lastBlock(blockSizes) lastStart <- lastBlock(blockStarts) if (any(df[[2]] + lastSize + lastStart != df[[3]]) || any(sub(",.*", "", blockStarts) != "0")) stop("blocks must span entire feature") blockCount <- elementLengths(object$blocks) if (!is.null(object$blockCount)) if (!identical(blockCount, as.integer(object$blockCount))) stop("incorrect block counts given block sizes") } if (is.null(color)) color <- object$itemRgb if (is.null(color) && !is.null(blockCount)) color <- "0" ## blocks require color else if (!is.null(color)) { nacol <- is.na(color) if (!is.matrix(color)) colmat <- col2rgb(color) color <- paste(colmat[1,], colmat[2,], colmat[3,], sep = ",") color[nacol] <- "0" } thickStart <- object$thickStart thickEnd <- object$thickEnd if (!is.null(object$thick)) { thickStart <- start(object$thick) thickEnd <- end(object$thick) } ## color requires thick ranges if (is.null(thickStart) && !is.null(color)) { thickStart <- start(object) thickEnd <- end(object) } strand <- if (ignore.strand) NULL else object$strand if (!is.null(thickStart) && is.null(strand)) { strand <- rep(NA, nrow(object)) } if (!is.null(strand) && is.null(score)) score <- 0 name <- object$name if (is.null(name)) name <- rownames(object) if (!is.null(score) && is.null(name)) name <- rep(NA, nrow(object)) df$name <- name df$score <- score df$strand <- strand df$thickStart <- if (!is.null(thickStart)) thickStart - 1L else NULL df$thickEnd <- thickEnd df$itemRgb <- color df$blockCount <- blockCount df$blockSizes <- blockSizes df$blockStarts <- blockStarts if (is(con, "BED15File")) { df$expCount <- object$expCount df$expIds <- object$expIds df$expScores <- object$expScores } } scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) file <- con con <- connection(con, if (append) "a" else "w") on.exit(release(con)) write.table(df, con, sep = "\t", col.names = FALSE, row.names = FALSE, quote = FALSE, na = ".") release(con) if (index) invisible(indexTrack(file)) else invisible(file) }) setMethod("export", c("UCSCData", "BEDFile"), function(object, con, format, trackLine = TRUE, ...) { if (!missing(format)) checkArgFormat(con, format) if (trackLine) { export.ucsc(object, con, ...) } else { callNextMethod() } invisible(con) }) setMethod("export", c("RangedDataList", "BEDFile"), .export_RangedDataList_RTLFile) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.bed", function(con, ...) standardGeneric("import.bed")) setMethod("import.bed", "ANY", function(con, ...) { import(con, format = "bed", ...) }) scanTrackLine <- function(con) { con <- connectionForResource(con, "r") line <- "#" while(length(grep("^ *#", line))) # skip initial comments line <- readLines(con, 1, warn = FALSE) if (length(grep("^track", line)) > 0) line else { pushBack(line, con) NULL } } setMethod("import", "BEDFile", function(con, format, text, trackLine = TRUE, genome = NA, asRangedData = FALSE, colnames = NULL, which = NULL, seqinfo = NULL, extraCols = character()) { if (!missing(format)) checkArgFormat(con, format) asRangedData <- normarg_asRangedData(asRangedData, "import") file <- con con <- queryForConnection(con, which) if (attr(con, "usedWhich")) which <- NULL if (is.null(seqinfo)) seqinfo <- attr(con, "seqinfo") ## check for a track line line <- scanTrackLine(con) if (!is.null(line) && trackLine) { pushBack(line, con) ans <- import.ucsc(initialize(file, resource = con), drop = TRUE, trackLine = FALSE, genome = genome, asRangedData = asRangedData, colnames = colnames, which = which, seqinfo = seqinfo, extraCols = extraCols) return(ans) } if (is(file, "BEDGraphFile")) { bedClasses <- c("character", "integer", "integer", "numeric") bedNames <- c("chrom", "start", "end", "score") } else { bedNames <- c("chrom", "start", "end", "name", "score", "strand", "thickStart", "thickEnd", "itemRgb", "blockCount", "blockSizes", "blockStarts") bedClasses <- c("character", "integer", "integer", "character", "numeric", "character", "integer", "integer", "character", "integer", "character", "character") } if (is(file, "BED15File")) bedNames <- c(bedNames, "expCount", "expIds", "expScores") normArgColnames <- function(validNames) { if (is.null(colnames)) colnames <- validNames else { colnames <- unique(c(head(bedNames, 3), as.character(colnames))) if ("thick" %in% colnames) colnames <- c(setdiff(colnames, "thick"), "thickStart", "thickEnd") if ("blocks" %in% colnames) colnames <- c(setdiff(colnames, "blocks"), "blockStarts", "blockSizes", "blockCount") missingCols <- setdiff(colnames, validNames) if (length(missingCols)) stop("Requested column(s) ", paste("'", missingCols, "'", sep = "", collapse = ", "), " are not valid columns or were not found in the file") } colnames } ## read a single line to get ncols up-front, ## and thus specify all col classes ## FIXME: reading in 'as.is' to save memory, line <- readLines(con, 1, warn=FALSE) ## UCSC seems to use '#' at beginning to indicate comment. while(length(line) && (!nzchar(line) || substring(line, 1, 1) == "#")) { line <- readLines(con, 1, warn=FALSE) } if (length(line)) { `tail<-` <- function(x, n, value) if (n != 0) c(head(x, -n), value) else x pushBack(line, con) colsInFile <- seq_len(length(strsplit(line, "[\t ]")[[1]])) presentNames <- bedNames[colsInFile] tail(presentNames, length(extraCols)) <- names(extraCols) bedNames <- presentNames presentClasses <- bedClasses[colsInFile] tail(presentClasses, length(extraCols)) <- unname(extraCols) colnames <- normArgColnames(presentNames) bedClasses <- ifelse(presentNames %in% colnames, presentClasses, "NULL") bed <- DataFrame(read.table(con, colClasses = bedClasses, as.is = TRUE, na.strings = ".", comment.char = "")) } else { if (is.null(colnames)) colnames <- character() else colnames <- normArgColnames(bedNames) keepCols <- bedNames %in% colnames bed <- DataFrame(as.list(sapply(bedClasses[keepCols], vector))) } colnames(bed) <- bedNames[bedNames %in% colnames] bed <- bed[substring(bed$chrom, 1, 1) != "#",] if (!is.null(bed$thickStart)) { thickEnd <- bed$thickEnd if (is.null(thickEnd)) thickEnd <- bed$end bed$thick <- IRanges(bed$thickStart + 1L, thickEnd) bed$thickStart <- bed$thickEnd <- NULL } color <- bed$itemRgb if (is.character(color)) { # could be NULL spec <- color != "0" cols <- unlist(strsplit(color[spec], ",", fixed=TRUE), use.names=FALSE) cols <- matrix(as.integer(cols), 3) color <- rep(NA, nrow(bed)) color[spec] <- rgb(cols[1,], cols[2,], cols[3,], max = 255) bed$itemRgb <- color } fromCSV <- function(b) { as.integer(unlist(strsplit(b, ",", fixed = TRUE))) } if (!is.null(bed$blockStarts)) { blocks <- split(IRanges(fromCSV(bed$blockStarts) + 1L, width = fromCSV(bed$blockSizes)), PartitioningByWidth(bed$blockCount)) names(blocks) <- NULL bed$blockStarts <- bed$blockSizes <- bed$blockCount <- NULL bed$blocks <- blocks } GenomicData(IRanges(bed$start + 1L, bed$end), bed[-(1:3)], chrom = bed$chrom, genome = genome, seqinfo = seqinfo, asRangedData = asRangedData, which = which) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### BED15 (Microarray) Support ### setMethod("import", "BED15File", function(con, format, text, trackLine = NULL, genome = NA, asRangedData = FALSE, which = NULL) { if (!missing(format)) checkArgFormat(con, format) asRangedData <- normarg_asRangedData(asRangedData, "import") if (is.null(trackLine)) return(import.ucsc(con, TRUE, genome = genome, asRangedData = asRangedData, which = which)) bed <- callNextMethod() if (asRangedData) { if (!nrow(bed)) return(bed) ids <- strsplit(bed$expIds[1], ",", fixed=TRUE)[[1]] expNames <- trackLine@expNames[as.integer(ids) + 1L] scores <- unlist(strsplit(bed$expScores, ",", fixed=TRUE), use.names=FALSE) scores <- as.numeric(scores) scores[scores == -10000] <- NA # stupid UCSC convention scores <- split(scores, gl(length(expNames), 1, length(scores))) names(scores) <- expNames nonExpCols <- setdiff(colnames(bed), c("expCount", "expScores", "expIds")) bed <- bed[,nonExpCols] for (samp in names(scores)) bed[[samp]] <- scores[[samp]] bed } else { if (!length(bed)) return(bed) ids <- strsplit(values(bed)$expIds[1], ",", fixed=TRUE)[[1]] expNames <- trackLine@expNames[as.integer(ids) + 1L] scores <- unlist(strsplit(values(bed)$expScores, ",", fixed=TRUE), use.names=FALSE) scores <- as.numeric(scores) scores[scores == -10000] <- NA # stupid UCSC convention scores <- split(scores, gl(length(expNames), 1, length(scores))) names(scores) <- expNames nonExpCols <- setdiff(colnames(values(bed)), c("expCount", "expScores", "expIds")) values(bed) <- values(bed)[,nonExpCols] values(bed) <- cbind(values(bed), do.call(DataFrame, scores)) bed } }) setGeneric("import.bed15", function(con, ...) standardGeneric("import.bed15"), signature = "con") setMethod("import.bed15", "ANY", function(con, ...) { import(con, "bed15", ...) }) setGeneric("export.bed15", function(object, con, ...) standardGeneric("export.bed15")) setMethod("export.bed15", "ANY", function(object, con, ...) { export(object, con, "bed15", ...) }) ### FIXME: dispatch will break when 'object' is a UCSCData ### Possible solution: just merge this code with the main BEDFile method? setMethod("export", c("RangedData", "BED15File"), function(object, con, format, expNames = NULL, trackLine = NULL, ...) { if (!missing(format)) checkArgFormat(con, format) if (is.null(trackLine)) { ## ensure we do not override existing track line parameter if (is.null(expNames) && is(object, "UCSCData") && is(object@trackLine, "Bed15TrackLine")) expNames <- object@trackLine@expNames return(export.ucsc(object, con, expNames = expNames, ...)) } expNames <- trackLine@expNames object$expCount <- rep(length(expNames), nrow(object)) object$expIds <- rep(paste(seq_along(expNames)-1, collapse=","), nrow(object)) scores <- as.list(unlist(values(object[,expNames]))) scores <- do.call(paste, c(scores, sep = ",")) scores <- gsub("NA", "-10000", scores, fixed=TRUE) object$expScores <- scores callNextMethod(object, con, ...) }) setClass("Bed15TrackLine", representation(expStep = "numeric", expScale = "numeric", expNames = "characterORNULL"), prototype(expStep = 0.5, expScale = 3.0), contains = "BasicTrackLine") # not sure which fields work setAs("Bed15TrackLine", "character", function(from) { str <- as(as(from, "TrackLine"), "character") paste(str, " type=array ", " expScale=", from@expScale, " expStep=", from@expStep, " expNames=\"", paste(from@expNames, collapse=","), "\"", sep = "") }) setAs("character", "Bed15TrackLine", function(from) { line <- new("Bed15TrackLine", as(from, "TrackLine")) vals <- ucscParsePairs(from) line@expScale <- as.numeric(vals[["expScale"]]) line@expStep <- as.numeric(vals[["expStep"]]) line@expNames <- strsplit(vals[["expNames"]], ",", fixed=TRUE)[[1]] line }) setMethod("fileFormat", "Bed15TrackLine", function(x) "bed15") ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### bedGraph (formerly subset of WIG) support ### setGeneric("import.bedGraph", function(con, ...) standardGeneric("import.bedGraph"), signature = "con") setMethod("import.bedGraph", "ANY", function(con, ...) { import(con, "bedGraph", ...) }) setGeneric("export.bedGraph", function(object, con, ...) standardGeneric("export.bedGraph")) setMethod("export.bedGraph", "ANY", function(object, con, ...) { export(object, con, "bedGraph", ...) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion ### setGeneric("asBED", function(x, ...) standardGeneric("asBED")) setMethod("asBED", "GRangesList", function(x) { x_range <- range(x) if (any(elementLengths(x_range) != 1L)) stop("Empty or multi-strand/seqname elements not supported by BED") gr <- unlist(x_range, use.names=FALSE) values(gr) <- values(x) values(gr)$name <- names(x) x_ranges <- ranges(unlist(x, use.names=FALSE)) ord_start <- order(start(x_ranges)) x_ranges <- shift(x_ranges, 1L - rep(start(gr), elementLengths(x)))[ord_start] values(gr)$blocks <- split(x_ranges, togroup(x)[ord_start]) gr }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### setGeneric("blocks", function(x, ...) standardGeneric("blocks")) setMethod("blocks", "RangedData", function(x) { blocks(as(x, "GRanges")) }) setMethod("blocks", "GenomicRanges", function(x) { block_counts <- elementLengths(values(x)$blocks) gr <- GRanges(rep(seqnames(x), block_counts), shift(unlist(values(x)$blocks, use.names = FALSE), rep(start(x), block_counts) - 1L), rep(strand(x), block_counts)) seqinfo(gr) <- seqinfo(x) split(gr, togroup(values(x)$blocks)) }) rtracklayer/R/bigWig.R0000644000126300012640000002514312227067656016236 0ustar00biocbuildphs_compbio### ========================================================================= ### BigWig support ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes ### setClass("BigWigFile", contains = "RTLFile") setClass("BWFile", contains = "BigWigFile") BigWigFile <- function(path) { if (!isSingleString(path)) stop("'filename' must be a single string, specifying a path") new("BigWigFile", resource = path) } BWFile <- BigWigFile setMethod("seqinfo", "BigWigFile", function(x) { seqlengths <- .Call(BWGFile_seqlengths, path(x)) Seqinfo(names(seqlengths), seqlengths) # no circularity information }) .allowedColNames <- list(bigWig = "score") .validateColNames <- function(object, format) { allowedColNames <- .allowedColNames[[format]] invalidColNames <- setdiff(colnames(object), allowedColNames) if (length(invalidColNames)) paste("Column names", paste("'", invalidColNames, "'", sep = "", collapse=", "), "are invalid for the", format, "format.") else NULL } setClass("BigWigSelection", prototype = prototype(colnames = "score"), contains = "RangedSelection") setValidity("BigWigSelection", function(object) { .validateColNames(object, "bigWig") }) BigWigSelection <- function(ranges = RangesList(), colnames = "score") { if (!is.character(colnames) || (length(colnames) && !identical(colnames, "score"))) stop("'score' is the only valid column for BigWig") if (is.character(ranges)) new("BigWigSelection", GenomicSelection(ranges, colnames = colnames)) else { if (is(ranges, "BigWigFile")) ranges <- seqinfo(ranges) new("BigWigSelection", ranges = as(ranges, "RangesList"), colnames = colnames) } } setAs("RangesList", "BigWigSelection", function(from) { new("BigWigSelection", as(from, "RangedSelection"), colnames = "score") }) setAs("GenomicRanges", "BigWigSelection", function(from) { as(as(from, "RangesList"), "BigWigSelection") }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export.bw", function(object, con, ...) standardGeneric("export.bw")) setMethod("export.bw", "ANY", function(object, con, ...) { export(object, con, "BigWig", ...) }) setMethod("export", c("ANY", "BigWigFile"), function(object, con, format, ...) { object <- as(object, "RangedData") callGeneric() }) setMethod("export", c("RangedData", "BigWigFile"), function(object, con, format, dataFormat = c("auto", "variableStep", "fixedStep", "bedGraph"), compress = TRUE) { if (!missing(format)) checkArgFormat(con, format) con <- path.expand(path(con)) object <- sortBySeqnameAndStart(object) score <- score(object) if (!is.numeric(score) || any(is.na(score))) stop("The score must be numeric, without any NA's") if (!isTRUEorFALSE(compress)) stop("'compress' must be TRUE or FALSE") seqlengths <- seqlengths(object) if (any(is.na(seqlengths))) stop("Unable to determine seqlengths; either specify ", "'seqlengths' or specify a genome on 'object' that ", "is known to BSgenome or UCSC") sectionPtr <- NULL # keep adding to the same linked list .bigWigWriter <- function(chromData, con, dataFormat, append) { if (any(tail(start(chromData), -1) <= head(end(chromData), -1))) stop("BigWig ranges cannot overlap") sectionPtr <<- .Call(BWGSectionList_add, sectionPtr, names(chromData)[1], as(ranges(chromData)[[1]], "IRanges"), as.numeric(score(chromData)), dataFormat) } dataFormat <- match.arg(dataFormat) if (dataFormat == "auto") format <- chooseGraphType(object) else format <- dataFormat on.exit(.Call(BWGSectionList_cleanup, sectionPtr)) if (format == "bedGraph") lapply(object, .bigWigWriter, con, dataFormat) else export.wig(object, con, dataFormat = dataFormat, writer = .bigWigWriter, trackLine = FALSE) storage.mode(seqlengths) <- "integer" invisible(BigWigFile(.Call(BWGSectionList_write, sectionPtr, seqlengths, compress, con))) }) setMethod("export", c("RleList", "BigWigFile"), function(object, con, format, compress = TRUE) { if (!missing(format)) checkArgFormat(con, format) con <- path.expand(path(con)) if (!isTRUEorFALSE(compress)) stop("'compress' must be TRUE or FALSE") seqlengths <- elementLengths(object) sectionPtr <- NULL # keep adding to the same linked list .bigWigWriter <- function(chr) { sectionPtr <<- .Call(BWGSectionList_add, sectionPtr, chr, ranges(object[[chr]]), as.numeric(runValue(object[[chr]])), "bedGraph") } on.exit(.Call(BWGSectionList_cleanup, sectionPtr)) lapply(names(object), .bigWigWriter) invisible(BigWigFile(.Call(BWGSectionList_write, sectionPtr, seqlengths, compress, con))) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.bw", function(con, ...) standardGeneric("import.bw")) setMethod("import.bw", "ANY", function(con, ...) { import(con, "BigWig", ...) }) ### FIXME: For chr20, WGS coverage, coercion RangedData->GRanges takes ### 2X as long as reading. The most common use case is reading long ### vectors as Rles. Constructing an RleList is complicated by ### 'which'. As long as 'which' spans chromosomes, we can quickly ### coerce the GRanges (or faster yet, a RangedData) to an ### RleList. Consumes memory, but time cost is minimal, when 'which' ### is trivial (an entire genome or chromosome). ### Consider the use cases: ### - Extract whole genome or whole chromosome coverage as Rle (ChIP-seq) ### - Use rdToRle() fast path ### - Extract single position coverage for millions of variants ### - Slow to query by position, so extract whole genome/chromosome (above), ### then use findRun trick. ### - Extract single position coverage for a hundred hot-spot variants ### - rdToRle() should be fast enough, followed by findRun trick. ### - Extract coverage for one/all genes and summarize (RNA-seq?) ### - probably want summarize,BigWigFile ### FIXME: We also might want an integer/numeric switch? setMethod("import", "BigWigFile", function(con, format, text, selection = BigWigSelection(which, ...), which = con, asRangedData = FALSE, asRle = FALSE, ...) { if (!missing(format)) checkArgFormat(con, format) if (!isTRUEorFALSE(asRle)) stop("'asRle' must be TRUE or FALSE") asRangedData <- normarg_asRangedData(asRangedData, "import") selection <- as(selection, "BigWigSelection") validObject(selection) si <- seqinfo(con) which <- ranges(selection) badSpaces <- setdiff(names(which), seqnames(si)) if (length(badSpaces)) stop("'which' contains sequence names not known to BigWig file: ", paste(badSpaces, collapse = ", ")) flatWhich <- unlist(which, use.names = FALSE) if (is.null(flatWhich)) flatWhich <- IRanges() which <- split(flatWhich, factor(space(which), seqnames(si))) normRanges <- as(which, "NormalIRangesList") rd <- .Call(BWGFile_query, path.expand(path(con)), as.list(normRanges), identical(colnames(selection), "score")) seqinfo(rd) <- si if (asRle) { rdToRle(rd) } else if (!asRangedData) { strand(rd) <- "*" rd <- as(rd, "GRanges") } else rd }) rdToRle <- function(x) { RleList(mapply(function(r, v, sl) { IRanges:::.Ranges.coverage(r, width=sl, weight=v$score) }, ranges(x), values(x), seqlengths(x), SIMPLIFY=FALSE), compress=FALSE) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Summary ### setMethod("summary", "BigWigFile", function(object, which = as(seqinfo(object), "GenomicRanges"), size = 1L, type = c("mean", "min", "max", "coverage", "sd"), defaultValue = NA_real_) { ### FIXME: could do with "GenomicRanges" here, but ### coercions generally only exist for GRanges specifically which <- as(which, "GRanges") if (!is.numeric(size)) stop("'size' must be numeric") size <- recycleIntegerArg(size, "size", length(which)) type <- match.arg(type) if (type == "sd") type <- "std" if (!isSingleNumberOrNA(defaultValue)) stop("'defaultValue' must be a single number or NA") summaryList <- .Call(BWGFile_summary, path.expand(path(object)), as.character(seqnames(which)), ranges(which), size, type, as.numeric(defaultValue)) names(summaryList) <- names(which) RleList(summaryList) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Conversion ### wigToBigWig <- function(x, seqinfo, dest = paste(file_path_sans_ext(x, TRUE), "bw", sep = ".")) { if (!isSingleString(x)) stop("'x' must be a single string, the path to a WIG file") if (!isSingleString(dest)) stop("'dest' must be a single string, the path to the BigWig output") if (!is(seqinfo, "Seqinfo")) stop("'seqinfo' must be NULL or a Seqinfo object") seqlengths <- seqlengths(seqinfo) if (any(is.na(seqlengths))) stop("'seqlengths(seqinfo)' must not contain any 'NA' values") x <- path.expand(x) ans <- .Call(BWGFile_fromWIG, x, seqlengths, dest) invisible(BigWigFile(ans)) } rtracklayer/R/browser.R0000644000126300012640000001652412227067656016514 0ustar00biocbuildphs_compbio## central abstraction, represents a genome browser ## Question: is a browser session a database of tracks? No question ## that a browser has a track database. The question is of ## inheritance. Historically, browser session has had all the behavior ## we expect from a track database. But it is so much more. In ## particular, it has a list of views. We want to separate the data ## from the views. It is tempting to have the model (tracks) and views ## in separate objects, composed together in a session. However, the ## reality is that browser sessions are monolithic: UCSC can view only ## data UCSC knows, IGB can view only data IGB knows. Thus, we use ## simple inheritance here, saving many refactoring headaches. setClass("BrowserSession", contains = c("TrackDb", "VIRTUAL")) ## alias for names() for clarity in the session context setGeneric("trackNames", function(object, ...) standardGeneric("trackNames")) setGeneric("trackNames<-", function(object, ..., value) standardGeneric("trackNames<-")) setMethod("names", "BrowserSession", function(x) trackNames(x)) setMethod("trackNames", "BrowserSession", function(object) names(object)) ## a single genome view in a session setClass("BrowserView", representation(session = "BrowserSession"), contains = "VIRTUAL") # create one or more browser views setGeneric("browserView", function(object, range, track, ...) standardGeneric("browserView")) # get the views from the browser setGeneric("browserViews", function(object, ...) standardGeneric("browserViews")) # get/set active view setGeneric("activeView", function(object) standardGeneric("activeView")) setGeneric("activeView<-", function(object, value) standardGeneric("activeView<-")) setMethod("activeView", "BrowserSession", function(object) { views <- browserViews(object) active <- sapply(views, activeView) if (any(active)) views[[tail(which(active),1)]] else NULL }) setMethod("show", "BrowserSession", function(object) { cat("A genome browser session of class '", class(object), "' with ", length(browserViews(object)), " views and ", length(trackNames(object)), " tracks\n", sep ="") }) # close a session or view setGeneric("close", function(con, ...) standardGeneric("close")) # FIXME: what about isOpen? # get/set visibility of view tracks setGeneric("visible", function(object, ...) standardGeneric("visible")) setMethod("visible", "BrowserView", function(object) { trackNames(browserSession(object)) %in% trackNames(object) }) setGeneric("visible<-", function(object, ..., value) standardGeneric("visible<-")) setReplaceMethod("visible", "BrowserView", function(object, value) { trackNames(object) <- names(value)[value] object }) # get/set the selected features in e.g. a view # this can return a list, with a logical vector for each track setGeneric("selectedFeatures", function(object, ...) standardGeneric("selectedFeatures")) setGeneric("selectedFeatures<-", function(object, value) standardGeneric("selectedFeatures<-")) setMethod("show", "BrowserView", function(object) { range <- range(object) cat(class(object), "of", paste(names(range), ":", unlist(start(range)), "-", unlist(end(range)), sep = ""), "\n") nms <- paste("'", names(trackNames(object)), "'", sep = "") cat(BiocGenerics:::labeledLine("trackNames", nms)) }) setClass("BrowserViewList", contains = "SimpleList", prototype = prototype(elementType = "BrowserView")) BrowserViewList <- function(...) { views <- list(...) if (length(views) == 1 && is.list(views[[1L]])) views <- views[[1L]] if (!all(sapply(views, is, "BrowserView"))) stop("all elements in '...' must be BrowserView objects") IRanges:::newList("BrowserViewList", views) } # get genome range of active view (or default if no views) setMethod("range", "BrowserSession", function(x, ..., na.rm) { if (length(...) > 0) stop("arguments in '...' ignored") view <- activeView(x) if (!is.null(view)) range(view) else NULL }) setGeneric("range<-", function(x, ..., value) standardGeneric("range<-")) ## just the genome, for convenience setMethod("genome", "BrowserSession", function(x) genome(range(x))) setReplaceMethod("genome", "BrowserSession", function(x, value) { if (!isSingleString(value)) stop("'genome' must be a single string") genome(range(x)) <- value x }) # high-level entry point setGeneric("browseGenome", function(object, ...) standardGeneric("browseGenome")) setMethod("browseGenome", "missing", function(object, ...) browseGenome(RangedDataList(), ...)) setMethod("browseGenome", "GRanges", function(object, ...) browseGenome(as(object, "RangedData"), ...)) setMethod("browseGenome", "RangedDataORRangedDataList", function(object, browser = "UCSC", range = base::range(object), view = TRUE, trackParams = list(), viewParams = list(), name = "customTrack", ...) { # initialize session of type identified by 'browser' session <- browserSession(browser, ...) # load 'object' trackParams <- c(list(session), trackParams) if (is(object, "RangedData")) trackParams <- c(trackParams, name = name) session <- do.call(`track<-`, c(trackParams, list(value = object))) # open view of 'range' if (view) { if (!missing(range)) range <- normGenomeRange(range, session) viewParams <- c(list(session, range), viewParams) do.call(browserView, viewParams) } session }) # list names of available genome browsers genomeBrowsers <- function(where = topenv(parent.frame())) { cl <- getClass("BrowserSession", where = where) browsers <- names(cl@subclasses) browsers <- browsers[!sapply(browsers, isVirtualClass, where)] sub("Session$", "", browsers) } # obtain a browser session setGeneric("browserSession", function(object, ...) standardGeneric("browserSession")) # instantiate a browser session by name setMethod("browserSession", "character", function(object, ...) { class <- paste(object, "Session", sep = "") if (!extends(class, "BrowserSession")) stop("Browser named '", object, "' is unsupported.") new(class, ...) }) setMethod("browserSession", "missing", function(object, ...) browserSession("UCSC", ...)) # get one from a view setMethod("browserSession", "BrowserView", function(object) object@session) # load a sequence into the browser (probably should remove this) setGeneric("sequence<-", function(object, name, ..., value) standardGeneric("sequence<-")) setGeneric("login", function(x, username, password, ...) standardGeneric("login"), signature = "x") setGeneric("saveView", function(x, ...) standardGeneric("saveView")) setGeneric("restoreView", function(x, ...) standardGeneric("restoreView")) rtracklayer/R/chain.R0000644000126300012640000001073012227067656016104 0ustar00biocbuildphs_compbio### ========================================================================= ### Chain file parsing and lift over ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes ### setClass("ChainBlock", representation(ranges = "IRanges", # start in A, width offset = "integer", # offset to start in B score = "integer", # rle scores space = "character", # rle spaces reversed = "logical", # rle reversal length = "integer")) # lengths for rle slots ##setMethod("length", "ChainBlock", function(x) length(x@offset)) setClass("Chain", prototype = prototype(elementType = "ChainBlock"), contains = "SimpleList") setClass("ChainFile", contains = "RTLFile") ChainFile <- function(path) { if (!isSingleString(path)) stop("'filename' must be a single string, specifying a path") new("ChainFile", resource = path) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.chain", function(con, ...) standardGeneric("import.chain")) setMethod("import.chain", "ANY", function(con, ...) { import(con, "chain", ...) }) setMethod("import", "ChainFile", function(con, format, text, exclude = "_") { if (!missing(format)) checkArgFormat(con, format) .Call("readChain", path.expand(path(con)), as.character(exclude), PACKAGE="rtracklayer") }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Accessors ### setMethod("ranges", "ChainBlock", function(x) x@ranges) setMethod("offset", "ChainBlock", function(object) object@offset) setMethod("score", "ChainBlock", function(x) Rle(x@score, x@length)) setMethod("space", "ChainBlock", function(x) Rle(x@space, x@length)) setGeneric("reversed", function(x, ...) standardGeneric("reversed")) setMethod("reversed", "ChainBlock", function(x) Rle(x@reversed, x@length)) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Liftover ### flipStrandSimple <- function(strand, flip) { strand <- as.vector(strand) flipped <- ifelse(flip, ifelse(strand == "+", "-", ifelse(strand == "-", "+", strand)), strand) strand(flipped) } flipStrandTricky <- function(strand, flip) { strandCodes <- c("+" = 1L, "-" = -1L, "*" = 0L) strandInt <- strandCodes[as.vector(strand)] flipped <- ifelse(flip, strandInt * -1L, strandInt) + 2L strandRevCodes <- factor(c("-", "*", "+"), levels(strand())) strandRevCodes[as.vector(flipped)] } setGeneric("liftOver", function(x, chain, ...) standardGeneric("liftOver")) setMethod("liftOver", c("GenomicRanges", "Chain"), function(x, chain) { liftOverSpace <- function(gr, chain, subind) { r <- ranges(gr) ol <- findOverlaps(r, ranges(chain)) shits <- subjectHits(ol) r <- ranges(ol, r, ranges(chain)) rev <- as.vector(reversed(chain)[shits]) starts <- ifelse(rev, start(reflect(r, ranges(chain)[shits])), start(r)) strand <- flipStrandTricky(strand(gr)[queryHits(ol)], rev) r <- IRanges(starts, width=width(r)) offsets <- offset(chain)[shits] spaces <- space(chain)[shits] ind[[as.character(seqnames(gr)[1])]] <<- subind[queryHits(ol)] GRanges(spaces, IRanges(start(r) - offsets, end(r) - offsets), strand = strand, values(gr)[queryHits(ol),]) } rl <- split(x, seqnames(x), drop = TRUE) unchainedNames <- setdiff(names(rl), names(chain)) if (length(unchainedNames)) message("Discarding unchained sequences: ", paste(unchainedNames, collapse = ", ")) sharedNames <- intersect(names(rl), names(chain)) ind <- split(seq_len(length(x)), as.vector(seqnames(x)))[sharedNames] lifted <- unlist(mseqapply(liftOverSpace, rl[sharedNames], chain[sharedNames], ind), use.names=FALSE) split(lifted, factor(unlist(ind, use.names=FALSE), seq_len(length(x)))) }) rtracklayer/R/compression.R0000644000126300012640000000564612227067656017375 0ustar00biocbuildphs_compbio### ========================================================================= ### Compression ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### General ### setClass("CompressedFile", contains = c("RTLFile", "VIRTUAL")) setGeneric("decompress", function(con, ...) standardGeneric("decompress")) setMethod("decompress", "ANY", function(con, ...) con) setMethod("decompress", "CompressedFile", function(con, ...) { resource <- resource(con) if (is.character(resource)) manage(gzfile(resource)) # handles gzip, bzip2 and xz else stop("Cannot decompress connection") }) setMethod("decompress", "character", function(con, ...) { file <- try(FileForFormat(con), silent = TRUE) if (!is(file, "try-error")) { decompressed <- decompress(file) if (!identical(file, decompressed)) con <- decompressed } con }) ## should only happen internally (user would not give compression as format) setMethod("import", c("CompressedFile", "missing"), function(con, format, text, ...) { desc <- resourceDescription(con) con <- FileForFormat(resource(con), file_ext(file_path_sans_ext(desc))) import(con, ...) }) ## 'compress' is a simple alias for 'decompress', since connections are two-way compress <- decompress ## should only happen internally (user would not give compression as format) setMethod("export", c("ANY", "CompressedFile", "missing"), function(object, con, format, ...) { desc <- resourceDescription(con) con <- FileForFormat(resource(con), file_ext(file_path_sans_ext(desc))) export(object, con, ...) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### GZip ### setClass("GZFile", contains = "CompressedFile") GZFile <- function(resource) { new("GZFile", resource = resource) } setMethod("decompress", "GZFile", function(con) { ungzip(resource(con)) }) setGeneric("ungzip", function(x, ...) standardGeneric("ungzip")) setMethod("ungzip", "character", function(x) { uri <- .parseURI(x) if (uri$scheme != "" && uri$scheme != "file") con <- gzcon(url(x)) else con <- gzfile(uri$path) manage(con) }) setMethod("ungzip", "connection", function(x) { gzcon(x) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### BZip2 ### setClass("BZ2File", contains = "CompressedFile") BZ2File <- function(resource) { new("BZ2File", resource = resource) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### XZ ### setClass("XZFile", contains = "CompressedFile") XZFile <- function(resource) { new("XZFile", resource = resource) } rtracklayer/R/fasta.R0000644000126300012640000000324012227067656016116 0ustar00biocbuildphs_compbio### ========================================================================= ### FASTA support ### ------------------------------------------------------------------------- ### ### Since we have 2bit, we might as well have FASTA ### setClass("FastaFile", contains = "RTLFile") FastaFile <- function(resource) { new("FastaFile", resource = resource) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setMethod("export", c("ANY", "FastaFile"), function(object, con, ...) { export(as(object, "DNAStringSet"), con, ...) }) setMethod("export", c("BSgenome", "FastaFile"), function(object, con, format, ...) { append <- FALSE for (seqname in seqnames(object)) { dna <- object[[seqname]] masks(dna) <- NULL dna <- DNAStringSet(dna) names(dna) <- seqname writeXStringSet(dna, path(con), append = append, ...) append <- TRUE } }) setMethod("export", c("XStringSet", "FastaFile"), function(object, con, format, ...) { writeXStringSet(object, path(con), format = "fasta", ...) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setMethod("import", "FastaFile", function(con, format, text, type = c("DNA", "RNA", "AA", "B"), ...) { if (!missing(format)) checkArgFormat(con, format) readFun <- get(paste0("read", match.arg(type), "StringSet"), getNamespace("Biostrings")) readFun(path(con), format = "fasta", ...) }) rtracklayer/R/gff.R0000644000126300012640000004432412227067656015572 0ustar00biocbuildphs_compbio### ========================================================================= ### GFF (General Feature Format) support (all three versions, plus GTF) ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes ### setClass("GFFFile", contains = "RTLFile") ## private GFFFile <- function(resource, version = c("", "1", "2", "3")) { version <- match.arg(version) new(gffFileClass(version), resource = resource) } setClass("GFF1File", contains = "GFFFile") GFF1File <- function(resource) { GFFFile(resource, "1") } setClass("GFF2File", contains = "GFFFile") GFF2File <- function(resource) { GFFFile(resource, "2") } setClass("GFF3File", contains = "GFFFile") GFF3File <- function(resource) { GFFFile(resource, "3") } setClass("GTFFile", contains = "GFF2File") GTFFile <- function(resource) { new("GTFFile", GFF2File(resource)) } setClass("GVFFile", contains = "GFF3File") GVFFile <- function(resource) { new("GVFFile", GFF3File(resource)) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export.gff", function(object, con, ...) standardGeneric("export.gff")) setMethod("export.gff", "ANY", function(object, con, ...) { export(object, con, ...) }) setMethod("export", c("ANY", "GFFFile"), function(object, con, format, ...) { if (hasMethod("asGFF", class(object))) object <- asGFF(object) res <- try(as(object, "RangedData"), silent = TRUE) if (is(res, "try-error")) { res <- try(as(object, "RangedDataList"), silent = TRUE) if (is(res, "try-error")) stop("cannot export object of class '", class(object), "': ", res) } object <- res if (!missing(format)) checkArgFormat(con, format) export(object, con, ...) }) setMethod("export", c("RangedData", "GFFFile"), function(object, con, format, version = c("1", "2", "3"), source = "rtracklayer", append = FALSE, index = FALSE) { if (!missing(format)) checkArgFormat(con, format) if (!missing(version) || !length(gffFileVersion(con))) con <- asGFFVersion(con, match.arg(version)) version <- gffFileVersion(con) file <- con con <- resource(con) if (!append) { cat("", file = con) # clear any existing file gffComment(con, "gff-version", version) sourceVersion <- try(package.version(source), TRUE) if (!inherits(sourceVersion, "try-error")) gffComment(con, "source-version", source, sourceVersion) gffComment(con, "date", base::format(Sys.time(), "%Y-%m-%d")) genome <- singleGenome(genome(object)) if (!is.na(genome)) gffComment(con, "genome-build", paste(".", genome, sep = "\t")) } if (index) object <- sortBySeqnameAndStart(object) seqname <- seqnames(object) if (is.null(object$ID)) object$ID <- rownames(object) if (version == "3") seqname <- urlEncode(seqname, "a-zA-Z0-9.:^*$@!+_?|-") if (!is.null(object$source) && missing(source)) source <- object$source if (version == "3") source <- urlEncode(source, "\t\n\r;=%&,", FALSE) feature <- object$type if (is.null(feature)) feature <- "sequence_feature" score <- score(object) if (is.null(score)) { score <- NA } else { if (!("score" %in% colnames(object))) colnames(object)[1] <- "score" ## avoid outputting as attribute } strand <- strand(object) if (is.null(strand)) strand <- NA frame <- object$phase if (is.null(frame)) frame <- NA table <- data.frame(seqname, source, feature, start(object), end(object), score, strand, frame) attrs <- NULL if (version == "1") { attrs <- object$group if (is.null(attrs)) attrs <- seqname } else { builtin <- c("type", "strand", "score", "phase", "source") custom <- setdiff(colnames(object), builtin) if (length(custom)) { if (version == "3") tvsep <- "=" else tvsep <- " " attrs <- unlist(values(object), use.names=FALSE) attrs <- as.data.frame(sapply(custom, function(name) { x <- attrs[[name]] x_flat <- if (is(x, "List")) unlist(x, use.names=FALSE) else x x_char <- as.character(x_flat) x_char <- sub(" *$", "", sub("^ *", "", as.character(x_char))) if (version == "3") x_char <- urlEncode(x_char, "%\t\n\r;=&,", FALSE) if (is(x, "List")) { x_char[is.na(x_char)] <- "." x_char <- pasteCollapse(relist(x_char, x)) x_char[elementLengths(x) == 0] <- NA } ## FIXME: add option so these become "." instead of removing x_char[is.na(x_char)] <- "\r" if (!is.numeric(x_flat)) x_char <- paste0("\"", x_char, "\"") paste(name, x_char, sep = tvsep) }, simplify = FALSE)) attrs <- do.call(paste, c(attrs, sep = "; ")) attrs <- gsub("[^;]*?\r\"?(;|$)", "", attrs) attrs[nchar(attrs) == 0] <- NA } } scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) if (!is.null(attrs)) { # write out the rows with attributes first write.table(cbind(table, attrs)[!is.na(attrs),], con, sep = "\t", na = ".", quote = FALSE, col.names = FALSE, row.names = FALSE, append = TRUE) table <- table[is.na(attrs),] } write.table(table, con, sep = "\t", na = ".", quote = FALSE, col.names = FALSE, row.names = FALSE, append = TRUE) if (index) indexTrack(file) invisible(NULL) }) setMethod("export", c("RangedDataList", "GFFFile"), .export_RangedDataList_RTLFile) setGeneric("export.gff1", function(object, con, ...) standardGeneric("export.gff1")) setMethod("export.gff1", "ANY", function(object, con, ...) export(object, con, "gff1", ...)) setGeneric("export.gff2", function(object, con, ...) standardGeneric("export.gff2")) setMethod("export.gff2", "ANY", function(object, con, ...) export(object, con, "gff2", ...)) setGeneric("export.gff3", function(object, con, ...) standardGeneric("export.gff3")) setMethod("export.gff3", "ANY", function(object, con, ...) export(object, con, "gff3", ...)) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.gff", function(con, ...) standardGeneric("import.gff")) setMethod("import.gff", "ANY", function(con, ...) { import(con, "gff", ...) }) .parse_attrCol <- function(attrCol, file, colnames) { if (is(file, "GFF1File")) { if (is.null(colnames) || "group" %in% colnames) attrList <- list(group = factor(attrCol, levels=unique(attrCol))) else attrList <- list() } else { sentinel <- "\b" con <- file() on.exit(close(con)) writeLines(paste0(sub(";$", "", attrCol), sentinel), con) attrs <- scan(con, what=character(), strip.white = TRUE, quiet = TRUE, sep = ";") lines <- togroup(PartitioningByEnd(grep(sentinel, attrs, fixed = TRUE))) attrs <- sub(sentinel, "", attrs, fixed = TRUE) tag.value.sep <- if (is(file, "GFF3File")) "=" else " " sep.pos <- regexpr(tag.value.sep, attrs, fixed=TRUE) if (any(sep.pos == -1L)) stop("Some attributes do not conform to 'tag", tag.value.sep, "value' format") tags <- substring(attrs, 1L, sep.pos - 1L) vals <- substring(attrs, sep.pos + 1L, nchar(attrs)) if (!is.null(colnames)) { keep <- tags %in% colnames lines <- lines[keep] vals <- vals[keep] tags <- urlDecode(tags[keep]) } tags <- factor(tags, levels=unique(tags)) lineByTag <- split(lines, tags) valByTag <- split(vals, tags) ## FIXME: Parent, Alias, Note, DBxref, ## Ontology_term are allowed to have multiple ## values. We should probably always return them as a ## CharacterList. multiTags <- c("Parent", "Alias", "Note", "DBxref", "Ontology_term") attrList <- sapply(levels(tags), function(tagName) { vals <- valByTag[[tagName]] if (is(file, "GFF3File") && (any(grepl(",", vals, fixed=TRUE)) || tagName %in% multiTags)) { vals <- CharacterList(strsplit(vals, ",", fixed=TRUE)) vals <- relist(urlDecode(unlist(vals)), vals) coerced <- suppressWarnings(as(vals, "NumericList")) if (!any(any(is.na(coerced)))) vals <- coerced vec <- as(rep.int(list(character()), length(attrCol)), class(vals)) } else { coerced <- suppressWarnings(as.numeric(vals)) if (!any(is.na(coerced))) vals <- coerced if (is(file, "GFF3File")) vals <- urlDecode(vals) vec <- rep.int(NA, length(attrCol)) } vec[lineByTag[[tagName]]] <- vals vec }, simplify = FALSE) } attrList } setMethod("import", "GFFFile", function(con, format, text, version = c("", "1", "2", "3"), genome = NA, asRangedData = FALSE, colnames = NULL, which = NULL, feature.type = NULL) { if (!missing(format)) checkArgFormat(con, format) if (!missing(version)) con <- asGFFVersion(con, match.arg(version)) asRangedData <- normarg_asRangedData(asRangedData, "import") sniffed <- sniffGFFVersion(resource(con)) version <- gffFileVersion(con) if (!length(version)) { if (is.null(sniffed)) sniffed <- "1" con <- asGFFVersion(con, sniffed) } if (length(version) && !is.null(sniffed) && !identical(sniffed, version)) warning("gff-version directive indicates version is ", sniffed, ", not ", version) if (is.na(genome)) genome <- genome(con) ### FIXME: a queryForLines() function would be more efficient file <- con con <- queryForResource(con, which) lines <- readLines(con, warn = FALSE) # unfortunately, not a table lines <- lines[nzchar(lines)] ## strip comments notComments <- which(substr(lines, start=1L, stop=1L) != "#") lines <- lines[notComments] ### TODO: handle ontologies (store in RangedData) ## strip FASTA sequence fastaHeaders <- which(substr(lines, start=1L, stop=1L) == ">") if (length(fastaHeaders)) lines <- head(lines, fastaHeaders[1] - 1) ## construct table fields <- c("seqname", "source", "type", "start", "end", "score", "strand", "phase", "attributes") linesSplit <- strsplit(lines, "\t", fixed=TRUE) fieldCounts <- elementLengths(linesSplit) if (any(fieldCounts > length(fields)) || any(fieldCounts < (length(fields) - 1))) stop("GFF files must have ", length(fields), " tab-separated columns") haveAttr <- fieldCounts == length(fields) data <- unlist(linesSplit[haveAttr], use.names=FALSE) if (is.null(data)) data <- character(0) haveAttrMat <- matrix(data, ncol=length(fields), byrow=TRUE) data <- unlist(linesSplit[!haveAttr], use.names=FALSE) if (is.null(data)) data <- character(0) noAttrMat <- matrix(data, ncol=length(fields)-1L, byrow=TRUE) noAttrMat <- cbind(noAttrMat, rep.int("", nrow(noAttrMat))) table <- rbind(noAttrMat, haveAttrMat) colnames(table) <- fields if (!is.null(feature.type)) table <- table[table[,"type"] %in% feature.type,,drop=FALSE] ## handle missings table[table == "."] <- NA_character_ attrCol <- table[,"attributes"] if (is(file, "GFF3File")) { table <- table[,setdiff(colnames(table), "attributes"),drop=FALSE] table[table[,"strand"] == "?","strand"] <- NA_character_ is_not_NA <- !is.na(table) table[is_not_NA] <- urlDecode(table[is_not_NA]) } extraCols <- c("source", "type", "score", "strand", "phase") if (!is.null(colnames)) extraCols <- intersect(extraCols, colnames) xd <- as(table[,extraCols,drop=FALSE], "DataFrame") if (!is.null(xd$phase)) xd$phase <- as.integer(as.character(xd$phase)) if (!is.null(xd$strand)) xd$strand <- strand(xd$strand) if (!is.null(xd$score)) suppressWarnings(xd$score <- as.numeric(as.character(xd$score))) if (is.null(colnames) || length(setdiff(colnames, extraCols))) { attrList <- .parse_attrCol(attrCol, file, colnames) xd <- DataFrame(xd, attrList) } end <- as.integer(table[,"end"]) GenomicData(IRanges(as.integer(table[,"start"]), end), xd, chrom = table[,"seqname"], genome = genome, seqinfo = attr(con, "seqinfo"), asRangedData = asRangedData, which = if (attr(con, "usedWhich")) NULL else which) }) setGeneric("import.gff1", function(con, ...) standardGeneric("import.gff1")) setMethod("import.gff1", "ANY", function(con, ...) import(con, "gff1", ...)) setGeneric("import.gff2", function(con, ...) standardGeneric("import.gff2")) setMethod("import.gff2", "ANY", function(con, ...) import(con, "gff2", ...)) setGeneric("import.gff3", function(con, ...) standardGeneric("import.gff3")) setMethod("import.gff3", "ANY", function(con, ...) import(con, "gff3", ...)) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion ### setGeneric("asGFF", function(x, ...) standardGeneric("asGFF")) setMethod("asGFF", "GRangesList", function(x, parentType = "mRNA", childType = "exon") { parent_range <- range(x) if (!all(elementLengths(parent_range) == 1)) stop("Elements in a group must be on same sequence and strand") parents <- unlist(parent_range, use.names = FALSE) children <- unlist(x, use.names = FALSE) makeId <- function(x, prefix) { paste(prefix, seq_len(length(x)), sep = "") } parentIds <- makeId(parents, parentType) values(parents)$type <- parentType values(parents)$ID <- parentIds values(parents)$Name <- names(x) values(children)$type <- childType values(children)$ID <- makeId(children, childType) values(children)$Name <- names(children) values(children)$Parent <- rep.int(parentIds, elementLengths(x)) allColumns <- union(colnames(values(parents)), colnames(values(children))) rectifyDataFrame <- function(x) { x[setdiff(allColumns, colnames(x))] <- DataFrame(NA) x[allColumns] } values(children) <- rectifyDataFrame(values(children)) values(parents) <- rectifyDataFrame(values(parents)) c(parents, children) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### scanGFFDirectives <- function(con, tag = NULL) { con <- connection(con, "r") directives <- character() lines <- line <- readLines(con, n = 1) while(grepl("^#", line)) { if (grepl("^##", line)) { directives <- c(directives, line) } line <- readLines(con, n = 1) lines <- c(lines, line) } pushBack(lines, con) sub("^[^[:space:]]* ", "", grep(paste0("^##", tag), directives, value = TRUE)) } gffGenomeBuild <- function(x) { genome_build <- scanGFFDirectives(x, "genome-build") unlist(strsplit(genome_build, "\t", fixed = TRUE)) } setMethod("provider", "GFFFile", function(x) { gffGenomeBuild(x)[1] }) setMethod("providerVersion", "GFFFile", function(x) { gffGenomeBuild(x)[2] }) setMethod("genome", "GFFFile", function(x) providerVersion(x)) gffComment <- function(con, ...) cat("##", paste(...), "\n", sep = "", file = con, append = TRUE) sniffGFFVersion <- function(con) { con <- connectionForResource(con, "r") version <- NULL lines <- line <- readLines(con, n = 1) while(grepl("^#", line)) { if (grepl("^##gff-version", line)) { version <- sub("^##gff-version ", "", line) break } line <- readLines(con, n = 1) lines <- c(lines, line) } pushBack(lines, con) version } gffFileClass <- function(version) { paste("GFF", version, "File", sep = "") } gffFileVersion <- function(file) { versions <- c("1", "2", "3") unlist(Filter(function(v) is(file, gffFileClass(v)), versions)) } asGFFVersion <- function(con, version) { if (!is(con, gffFileClass(version))) { if (class(con) != "GFFFile") warning("Treating a '", class(con), "' as GFF version '", version, "'") con <- GFFFile(resource(con), version) } con } rtracklayer/R/index.R0000644000126300012640000000570512227067656016137 0ustar00biocbuildphs_compbio### ========================================================================= ### Separate index support ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### queryForResource ### ## There is some question as to whether the import routines should ## recurse through import.tabix, or perform the query ## internally. Currently, we are taking the latter route, because it ## is consistent with (gzip) decoding and it allows the parsers more ## flexibility. setGeneric("queryForResource", function(x, which = NULL, ...) standardGeneric("queryForResource")) ## Attaches 'usedWhich' attribute, an optimization hint indicating ## that subsetting by 'which' has been performed and is no longer ## necessary. Probably premature. setMethod("queryForResource", "RTLFile", function(x, which = NULL, ...) { r <- resource(x) ans <- structure(r, usedWhich = FALSE) if (!is.null(which) && is.character(r)) { x_tbi <- paste(r, "tbi", sep = ".") if (file.exists(x_tbi)) ans <- queryForResource(TabixFile(r), which = which, ...) } ans }) setMethod("queryForResource", "TabixFile", function(x, which, header = TRUE, ...) { tabixHeader <- headerTabix(x) if (is.null(which)) { buffer <- connectionForResource(path(x), "r") if (!header) readLines(buffer, tabixHeader$skip) } else { buffer <- file() if (header) { skippedLines <- readLines(path(x), tabixHeader$skip) writeLines(skippedLines, buffer) } lines <- unlist(scanTabix(x, param = which), use.names = FALSE) writeLines(lines, buffer) } structure(buffer, usedWhich = TRUE, seqinfo = Seqinfo(tabixHeader$seqnames)) }) queryForConnection <- function(x, which = NULL, ...) { resource <- queryForResource(x, which = which, ...) con <- connectionForResource(resource) structure(con, usedWhich = attr(resource, "usedWhich")) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### indexTrack: attempt to build an index for a track ### ### This is an obscene hack ### indexTrack <- function(con, ...) { indexed <- NULL formats <- eval(formals(indexTabix)$format) format <- Find(function(f) { is(con, paste(toupper(f), "File", sep = "")) }, formats) if (is.null(format)) stop("Cannot determine format from 'con'") uri <- path(con) parsed_uri <- .parseURI(uri) if (!uriIsLocal(parsed_uri)) stop("'con' must be a path to a local file") if (!format %in% formats) stop("'", format, "' is not a supported format; try 'bed' or 'gff'") original_path <- parsed_uri$path path <- bgzip(original_path, overwrite = TRUE) indexTabix(path, format, ...) indexed <- TabixFile(path) unlink(original_path) invisible(indexed) } rtracklayer/R/io.R0000644000126300012640000002125512227067656015435 0ustar00biocbuildphs_compbio### ========================================================================= ### Import/export support ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes files and connections ### ### RTLFile is a base class for high-level file abstractions, where ### subclasses are associated with a particular file format/type. It ### wraps a low-level representation of a file, currently either a ### path/URL or connection. setClass("RTLFile", representation(resource = "characterORconnection"), contains = "VIRTUAL") resource <- function(x) x@resource connection <- function(x, open = "") { connectionForResource(resource(x), open = open) } resourceDescription <- function(x) { r <- resource(x) if (is(r, "connection")) r <- summary(r)$description r } fileFormat <- function(x) { tolower(sub("File$", "", class(x))) } setMethod("path", "RTLFile", function(object) { r <- resource(object) if (!is.character(r)) stop("Connection resource requested as a path") r }) setMethod("show", "RTLFile", function(object) { r <- resource(object) if (!isSingleString(r)) r <- summary(r)$description cat(class(object), "object\nresource:", r, "\n") }) FileForFormat <- function(path, format = file_ext(path)) { fileClassName <- paste0(format, "File") signatureClasses <- function(fun, pos) { matrix(unlist(findMethods(fun)@signatures), 3)[pos,] } fileClassNames <- unique(c(signatureClasses(export, 2), signatureClasses(import, 1))) fileClassNames <- fileClassNames[grepl("File$", fileClassNames)] fileSubClassNames <- unlist(lapply(fileClassNames, function(x) { names(getClassDef(x)@subclasses) }), use.names = FALSE) fileClassNames <- c(fileClassNames, fileSubClassNames) fileClassIndex <- match(tolower(fileClassName), tolower(fileClassNames)) if (is.na(fileClassIndex)) { stop("Format '", format, "' unsupported") } fileClassName <- fileClassNames[fileClassIndex] fileClass <- getClass(fileClassName) pkg <- packageSlot(fileClass) if (is.null(pkg)) ns <- topenv() else ns <- getNamespace(pkg[1]) constructorName <- fileClassName if(!exists(constructorName, ns)) { parentClassNames <- names(getClass(constructorName)@contains) constructorName <- names(which(sapply(parentClassNames, exists, ns)))[1] if (is.na(constructorName)) stop("No constructor found for ", fileClassName) } get(constructorName, ns)(path) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export", function(object, con, format, ...) standardGeneric("export")) setMethod("export", c(con = "connection", format = "character"), function(object, con, format, ...) { export(object, FileForFormat(con, format), ...) }) setMethod("export", c(con = "connection", format = "missing"), function(object, con, format, ...) { format <- file_ext(summary(con)$description) export(object, con, format, ...) }) setMethod("export", c(con = "missing", format = "character"), function(object, con, format, ...) { con <- file() on.exit(close(con)) export(object, con, format, ...) text <- readLines(con, warn = FALSE) text }) setMethod("export", c(con = "character", format = "missing"), function(object, con, format, ...) { export(object, FileForFormat(con), ...) }) setMethod("export", c(con = "character", format = "character"), function(object, con, format, ...) { export(object, FileForFormat(con, format), ...) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import", function(con, format, text, ...) standardGeneric("import")) setMethod("import", c("connection", "character"), function(con, format, text, ...) { import(FileForFormat(con, format), ...) }) setMethod("import", c("connection", "missing"), function(con, format, text, ...) { format <- file_ext(summary(con)$description) import(con, format, ...) }) setMethod("import", c("character", "missing"), function(con, format, text, ...) { import(FileForFormat(con), ...) }) setMethod("import", c("character", "character"), function(con, format, text, ...) { import(FileForFormat(con, format), ...) }) setMethod("import", c(con = "missing", text = "character"), function(con, format, text, ...) { con <- file() on.exit(close(con)) writeLines(text, con) obj <- import(FileForFormat(con, format), ...) obj }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### setGeneric("bestFileFormat", function(x, dest, ...) standardGeneric("bestFileFormat")) setClassUnion("RangedDataORGenomicRanges", c("RangedData", "GenomicRanges")) setMethod("bestFileFormat", c("RangedDataORGenomicRanges", "ANY"), function(x, dest) { ## have numbers on a single strand, use BigWig if (is.numeric(score(x)) && length(unique(strand(x))) == 1L) "bw" else "bed" }) setMethod("bestFileFormat", c("GRangesList", "ANY"), function(x, dest) { "bed" # need hierarchical structure }) setMethod("bestFileFormat", c("RleList", "ANY"), function(x, dest) { "bw" # e.g., coverage }) setMethod("bestFileFormat", c("RangesList", "ANY"), function(x, dest) { "bed" # just ranges... }) file_ext <- function(con) gsub(".*\\.([^.]*)$", "\\1", con) ## Uses XML::parseURI, except first checks for Windows drive letter. ## There are no known URI schemes that are only a single character. .parseURI <- function(uri) { if (.Platform$OS.type == "windows" && grepl("^[A-Za-z]:[/\\]", uri)) { parsed <- parseURI("") parsed$path <- uri } else { parsed <- parseURI(uri) if (parsed$scheme == "file" && .Platform$OS.type == "windows") parsed$path <- substring(parsed$path, 2) # trim '/' from '/C:/foo/bar.txt' } parsed } normURI <- function(x) { if (!isSingleString(x)) stop("URI must be a single, non-NA string") uri <- .parseURI(x) if (uri$scheme == "") # /// (vs. //) needed for Windows x <- paste("file:///", file_path_as_absolute(x), sep = "") x } createResource <- function(x, dir = FALSE, content = "") { uri <- .parseURI(x) if (uri$scheme == "file" || uri$scheme == "") { if (!file.exists(uri$path)) { if (dir) dir.create(uri$path, recursive = TRUE) else writeLines(content, uri$path) } else warning("Path '", uri$path, "' already exists") } else stop("Cannot create a resource that is not a local file") } uriExists <- function(x) { uri <- .parseURI(x) if (uriIsLocal(x)) { exists <- file.exists(uri$path) } else { txt <- getURL(x, header = TRUE) exists <- grepl("^HTTP/\\d+\\.\\d+ 200 OK", txt) } exists } uriIsLocal <- function(x) { x$scheme == "file" || x$scheme == "" } uriIsWritable <- function(x) { uri <- .parseURI(x) if (uriIsLocal(uri)) { !file.access(uri$path, 2) || (!file.exists(uri$path) && uriIsWritable(dirname(uri$path))) } else FALSE } checkArgFormat <- function(con, format) { if (toupper(format) != substring(toupper(sub("File$", "", class(con))), 1, nchar(format))) stop("Cannot treat a '", class(con), "' as format '", format, "'") } connectionForResource <- function(x, open = "") { resource <- decompress(x) if (is.character(resource)) { if (!nzchar(resource)) stop("path cannot be an empty string") uri <- .parseURI(resource) if (uri$scheme != "") con <- url(resource) else con <- file(resource) con <- manage(con) } else con <- resource if (!isOpen(con) && nzchar(open)) { open(con, open) } con } ## Connection management (similar to memory management) manage <- function(con) { if (!is.null(attr(con, "finalizerEnv"))) return(con) env <- new.env() finalizer <- function(obj) { if (exists("con")) { close(con) rm(con, inherits = TRUE) TRUE } else FALSE } env$finalizer <- finalizer reg.finalizer(env, finalizer) attr(con, "finalizerEnv") <- env rm(env) con } unmanage <- function(con) { attr(con, "finalizerEnv") <- NULL con } release <- function(con) { env <- attr(con, "finalizerEnv") if (!is.null(env)) env$finalizer() else FALSE } rtracklayer/R/quickload.R0000644000126300012640000003014112227067656016774 0ustar00biocbuildphs_compbio### ========================================================================= ### Quickload support ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Quickload class ### setClass("Quickload", representation(uri = "character")) uri <- function(x, ...) x@uri Quickload_contents <- function(x) { read.table(contentsFile(x), sep = "\t", col.names = c("dir", "title"), colClasses = "character") } setMethod("genome", "Quickload", function(x) { contents <- Quickload_contents(x) as.character(structure(contents$dir, names = contents$title)) }) setMethod("names", "Quickload", genome) setMethod("length", "Quickload", function(x) length(names(x))) setMethod("[[", "Quickload", function (x, i, j, ...) { if (!missing(j)) warning("argument 'j' ignored") QuickloadGenome(x, i, ...) }) setMethod("$", "Quickload", function (x, name) { QuickloadGenome(x, name) }) Quickload <- function(uri = "quickload", create = FALSE) { if (!isTRUEorFALSE(create)) stop("'create' must be TRUE or FALSE") if (create) { if (uriExists(uri)) { message("NOTE: '", uri, "' already exists") create <- FALSE } ## must create this before calling normURI (requires existence) else createResource(uri, dir = TRUE) } ql <- new("Quickload", uri = normURI(uri)) if (create) createResource(contentsFile(ql)) ql } setAs("character", "Quickload", function(from) Quickload(from)) setMethod("show", "Quickload", function(object) { cat(class(object), "repository\nuri:", uri(object), "\n") cat(BiocGenerics:::labeledLine("genomes", genome(object))) }) contentsFile <- function(x) file.path(uri(x), "contents.txt") ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### QuickloadGenome class ### setClass("QuickloadGenome", representation(quickload = "Quickload", genome = "character"), contains = "TrackDb") setMethod("uri", "QuickloadGenome", function(x) file.path(uri(quickload(x)), genome(x))) quickload <- function(x, ...) x@quickload setMethod("genome", "QuickloadGenome", function(x) x@genome) setMethod("seqinfo", "QuickloadGenome", function(x) { genome_info <- read.table(genomeFile(x), sep = "\t", col.names = c("seqnames", "seqlengths"), colClasses = c("character", "integer")) Seqinfo(genome_info$seqnames, genome_info$seqlengths, genome = rep(genome(x), nrow(genome_info))) }) setReplaceMethod("seqinfo", "QuickloadGenome", function(x, value) { if (uriIsWritable(genomeFile(x))) { df <- as.data.frame(value)[1] write.table(df, genomeFile(x), quote = FALSE, col.names = FALSE, sep = "\t") } else stop("Repository is read only; cannot write seqinfo") x }) setMethod("releaseDate", "QuickloadGenome", function(x) { sub(".*?_(.*?)_([^_]*)$", "\\1 \\2", genome(x)) }) setMethod("organism", "QuickloadGenome", function(x) { gsub("_", " ", sub("(.*?)_.*?_[^_]*$", "\\1", genome(x))) }) setMethod("length", "QuickloadGenome", function(x) { length(names(x)) }) QuickloadGenome_annotFiles <- function(x) { xmlChildren(xmlInternalTreeParse(annotsFile(x)))$files } setMethod("names", "QuickloadGenome", function(x) { x_mcols <- mcols(x) structure(sapply(as.character(x_mcols$name), URLdecode), names = as.character(x_mcols$title)) }) setMethod("mcols", "QuickloadGenome", function(x) { files <- QuickloadGenome_annotFiles(x) if (!length(xmlChildren(files))) new("DataFrame", nrows = length(x)) else Reduce(function(x, y) merge(as.data.frame(as.list(x)), as.data.frame(as.list(y)), all = TRUE), lapply(xmlChildren(files), xmlAttrs)) }) setMethod("toString", "QuickloadGenome", function(x) { Quickload_contents(quickload(x))[genome(x),"title"] }) addGenomeToContents <- function(x, title) { contents <- Quickload_contents(quickload(x)) if (!genome(x) %in% contents$dir) { contents <- rbind(contents, data.frame(genome(x), title)) if (uriIsWritable(contentsFile(quickload(x)))) write.table(contents, contentsFile(quickload(x)), quote = FALSE, row.names = FALSE, col.names = FALSE, sep = "\t") else stop("Repository is read only; cannot add genome to contents") } else warning("Genome '", genome(x), "' already in contents; not replaced") } setMethod("toString", "BSgenome", function(x) { paste(organism(x), provider(x), providerVersion(x)) }) ## Not sure where this method should land. I'm sure it will be useful ## for publishing adhoc genomes through Quickload. setMethod("seqinfo", "DNAStringSet", function(x) { x_names <- names(x) if (is.null(x_names)) x_names <- as.character(seq(length(x))) Seqinfo(x_names, width(x)) }) QuickloadGenome <- function(quickload, genome, create = FALSE, seqinfo = GenomicRanges::seqinfo(genome), title = toString(genome)) { if (!isTRUEorFALSE(create)) stop("'create' must be TRUE or FALSE") quickload <- as(quickload, "Quickload") genome <- normArgGenome(genome) genome_id <- quickloadGenomeId(genome) qlg <- new("QuickloadGenome", quickload = quickload, genome = genome_id) if (create) { if (is.character(genome) && missing(seqinfo)) stop("No seqinfo for genome '", genome, "'") createQuickloadGenome(qlg, seqinfo, title) } qlg } setMethod("show", "QuickloadGenome", function(object) { cat(class(object), "track database\ngenome:", genome(object), "\nquickload:", uri(quickload(object)), "\n") cat(BiocGenerics:::labeledLine("names", names(object))) }) genomeFile <- function(x) file.path(uri(x), "mod_chromInfo.txt") annotsFile <- function(x) file.path(uri(x), "annots.xml") ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import of tracks/sequence from Quickload ### setMethod("track", "QuickloadGenome", function(object, name, ...) { object_mcols <- mcols(object) if (!name %in% object_mcols$title) stop("Track '", name, "' does not exist") md <- as.list(object_mcols[object_mcols$title == name,]) rd <- import(file.path(uri(object), md$name), ...) metadata(rd)$quickload <- md rd }) ## Since a QuickloadGenome can store only a ## single referenece genome, it is best to treat it as a "slot". setGeneric("referenceSequence", function(x, ...) standardGeneric("referenceSequence")) referenceSequenceFile <- function(x) { paste(file.path(uri(x), genome(x)), ".2bit", sep = "") } setMethod("referenceSequence", "QuickloadGenome", function(x, which = as(seqinfo(x), "GenomicRanges"), ...) { import(referenceSequenceFile(x), which = which, ...) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export of tracks/sequence to Quickload ### ### FIXME: check for file URI scheme setGeneric("sortBySeqnameAndStart", function(x) standardGeneric("sortBySeqnameAndStart")) ## Seems not really possible for GRangesList setMethod("sortBySeqnameAndStart", "RangedDataORGenomicRanges", function(x) { x[order(as.factor(seqnames(x)), start(x)),] }) setMethod("sortBySeqnameAndStart", "RangesList", function(x) { x.flat <- unlist(x, use.names=FALSE) relist(x.flat[order(space(x), start(x.flat))], x) }) .exportToQuickload <- function(object, name, format = bestFileFormat(value, object), index = TRUE, metadata = character(), ..., value) { if (is(object, "Annotated")) { value_metadata <- metadata(value)$quickload value_metadata[names(metadata)] <- metadata metadata <- value_metadata } filename <- paste(name, format, sep = ".") path <- paste(uri(object), filename, sep = "/") seqinfo(value) <- seqinfo(object) file <- export(value, path, format = format, index = index, ...) track(object, name, index = FALSE, metadata = metadata) <- file object } setReplaceMethod("track", signature(object = "QuickloadGenome", value = "ANY"), .exportToQuickload) setReplaceMethod("track", signature(object = "QuickloadGenome", value = "RsamtoolsFile"), function(object, name, metadata = character(), ..., value) { if (missing(name)) name <- basename(path(value)) track(object, name, metadata = metadata) <- URLencode(path(value)) copyResourceToQuickload(object, URLencode(index(value))) object }) setReplaceMethod("track", signature(object = "QuickloadGenome", value = "RTLFile"), function(object, name, metadata = character(), ..., value) { if (missing(name)) name <- basename(path(value)) track(object, name, metadata = metadata) <- URLencode(path(value)) object }) copyResourceToQuickload <- function(object, uri) { parsed_uri <- .parseURI(uri) if (parsed_uri$scheme == "") uri <- paste("file://", uri, sep = "") filename <- basename(uri) object_uri <- .parseURI(uri(object)) if (uriIsLocal(object_uri)) { dest_file <- file.path(object_uri$path, filename) if (paste(uri(object), filename, sep = "/") != uri) ### FIXME: URLdecode() here because of R bug download.file(URLdecode(uri), dest_file) } else stop("Quickload is not local; cannot copy track") filename } setReplaceMethod("track", signature(object = "QuickloadGenome", value = "character"), function(object, name = basename(object), metadata = character(), ..., value) { file <- copyResourceToQuickload(object, value) files <- QuickloadGenome_annotFiles(object) ## make sure we have the three required attributes attrs <- c(name = file, title = name) attrs[names(metadata)] <- metadata filenames <- getNodeSet(files, "//@name") if (file %in% filenames) { removeChildren(files, match(file, filenames)) } files <- addChildren(files, newXMLNode("file", attrs = attrs)) saveXML(files, annotsFile(object)) object }) setGeneric("referenceSequence<-", function(x, ..., value) standardGeneric("referenceSequence<-")) setReplaceMethod("referenceSequence", signature(x = "QuickloadGenome", value = "ANY"), function(x, name, ..., value) { export.2bit(value, referenceSequenceFile(x)) x }) ### Not exported yet setGeneric("synonyms", function(x, ...) standardGeneric("synonyms")) synonymFile <- function(x) file.path(uri(x), "synonyms.txt") setMethod("synonyms", "QuickloadGenome", function(x) { CharacterList(strsplit(readLines(synonymFile(x)), "\t")) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### normArgGenome <- function(genome) { if (is.character(genome)) { bs_genome <- BSGenomeForID(genome) if (!is.null(bs_genome)) genome <- bs_genome } genome } quickloadGenomeId <- function(genome) { if (!is.character(genome)) { species <- sub("^(.).*? ", "\\1_", organism(genome)) date <- sub("\\. ", "_", releaseDate(genome)) paste(species, date, sep = "_") } else genome } createQuickloadGenome <- function(x, seqinfo, title) { if (genome(x) %in% genome(quickload(x))) { message("NOTE: Genome '", genome(x), "' already exists") return() } createResource(uri(x), dir = TRUE) createResource(annotsFile(x), content = "") seqinfo(x) <- seqinfo addGenomeToContents(x, title) } rtracklayer/R/ranges.R0000644000126300012640000002632212227067656016305 0ustar00biocbuildphs_compbio### ========================================================================= ### Genome-oriented methods for GRanges/RangedData/RangesList classes ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### RangedData/GRanges convenience constructor ### GenomicData <- function(ranges, ..., strand = NULL, chrom = NULL, genome = NA, seqinfo = NULL, asRangedData = FALSE, which = NULL) { asRangedData <- normarg_asRangedData(asRangedData, "GenomicData") if (is.null(genome)) genome <- NA if (!isSingleStringOrNA(genome)) stop("'genome' must be a single string, or NULL, or NA") if (!is.null(seqinfo)) { if (is.na(genome)) genome <- singleGenome(genome(seqinfo)) else if (!all(genome == genome(seqinfo))) stop("'genome' ", genome, "' does not match that in 'seqinfo'") } if (is.null(seqinfo) && !is.na(genome)) seqinfo <- seqinfoForGenome(genome) if (!is(ranges, "Ranges")) { if (is(ranges, "data.frame") || is(ranges, "DataTable")) { colnames(ranges)[match("chrom", colnames(ranges))] <- "space" } if (is.na(genome)) genome <- NULL # universe expects NULL if unknown gd <- RangedData(ranges, universe = genome) # direct coercion if (!asRangedData) gd <- as(gd, "GRanges") } else { if (length(chrom) > length(ranges)) stop("length of 'chrom' greater than length of 'ranges'") if (length(chrom) > 0 && (length(ranges) %% length(chrom) != 0)) stop("length of 'ranges' not a multiple of 'chrom' length") if (is.null(seqinfo)) seqinfo <- Seqinfo(as.character(unique(chrom)), genome = genome) if (!is.factor(chrom)) chrom <- factor(chrom, seqlevels(seqinfo)) normStrand <- function(strand) { strand[is.na(strand)] <- "*" if (!all(strand %in% levels(strand()))) stop("strand values should be '-', '+' or '*'") factor(strand, levels(strand())) } if (!is.null(strand)) strand <- normStrand(strand) if (asRangedData) { if (is.na(genome)) genome <- NULL # universe expects NULL if unknown if (!is.null(strand)) { gd <- RangedData(ranges, ..., strand = strand, space = chrom, universe = genome) } else { gd <- RangedData(ranges, ..., space = chrom, universe = genome) if (!is.null(gd[["strand"]])) gd[["strand"]] <- normStrand(gd[["strand"]]) } } else { if (is.null(chrom)) chrom <- Rle(factor("1"), length(ranges)) dots <- list(...) if (length(dots) == 1) { dots <- dots[[1L]] if ((is(dots, "data.frame") || is(dots, "DataTable")) && !is.null(dots[["strand"]])) { strand <- dots[["strand"]] dots[["strand"]] <- NULL return(GenomicData(ranges = ranges, dots, strand = strand, chrom = chrom, genome = genome, seqinfo = seqinfo, asRangedData = asRangedData, which = which)) } } if (is.null(strand)) strand <- Rle("*", length(ranges)) if (!is.null(seqinfo)) chrom <- factor(chrom, seqlevels(seqinfo)) df <- DataFrame(...) invalidNames <- names(df) %in% GenomicRanges:::INVALID.GR.COLNAMES names(df)[invalidNames] <- paste0(".", names(df)[invalidNames]) gd <- GRanges(seqnames = chrom, ranges = ranges, strand = strand, df) if (!is.null(genome)) genome(gd) <- genome } } if (!is.null(seqinfo)) seqinfo(gd) <- seqinfo if (!is.null(which)) gd <- subsetByOverlaps(gd, which) gd } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Automatic seqinfo lookup ### seqinfoForGenome <- function(genome, method = c("auto", "BSgenome", "UCSC")) { method <- match.arg(method) if (method == "auto" || method == "BSgenome") sl <- SeqinfoForBSGenome(genome) if (method == "UCSC" || (method == "auto" && is.null(sl))) sl <- SeqinfoForUCSCGenome(genome) sl } BSGenomeForID <- function(genome) { pkgs <- installed.genomes() pkg <- grep(paste(genome, "$", sep = ""), pkgs, value = TRUE) if (length(pkg) == 1) { org <- strsplit(pkg, ".", fixed=TRUE)[[1]][2] get(org, getNamespace(pkg)) } else NULL } SeqinfoForBSGenome <- function(genome) { bsgenome <- BSGenomeForID(genome) if (!is.null(bsgenome)) seqinfo(bsgenome) else NULL } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Convience constructor for GRanges over an entire genome ### GRangesForGenome <- function(genome, chrom = NULL, ranges = NULL, ..., method = c("auto", "BSgenome", "UCSC"), seqinfo = NULL) { if (missing(genome) || !isSingleString(genome)) stop("'genome' must be a single string identifying a genome") if (is.null(seqinfo)) seqinfo <- seqinfoForGenome(genome, match.arg(method)) if (is.null(seqinfo)) stop("Failed to obtain information for genome '", genome, "'") if (!is.null(ranges) && !is(ranges, "Ranges")) stop("'ranges' must be NULL or a Ranges object") if (is.null(chrom)) chrom <- seqnames(seqinfo) else { badChrom <- setdiff(chrom, seqnames(seqinfo)) if (length(badChrom)) stop("Chromosome(s) ", paste(badChrom, collapse = ", "), "are invalid for: ", genome) } if (is.null(ranges)) ranges <- IRanges(1L, seqlengths(seqinfo)[chrom]) gr <- GRanges(chrom, ranges, seqlengths = seqlengths(seqinfo), ...) seqinfo(gr) <- seqinfo gr } GRangesForBSGenome <- function(genome, chrom = NULL, ranges = NULL, ...) { GRangesForGenome(genome, chrom = chrom, ranges = ranges, method = "BSgenome", seqinfo = NULL, ...) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### score: for internal convenience ### setMethod("score", "ANY", function(x) NULL) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### chrom(): Returns chromosome name vector of length 'length(x)'. ### Not to be confused with 'seqnames', which returns a List for ### RangesList and a vector of length 'nrow(x)' for RangedData. ### More or less a pre-GenomicRanges relic. ### setGeneric("chrom", function(x, ...) standardGeneric("chrom")) setMethod("chrom", "RangedData", function(x) chrom(ranges(x))) setMethod("chrom", "GRanges", function(x) seqnames(x)) setMethod("chrom", "RangesList", function(x) { names(x) }) setGeneric("chrom<-", function(x, ..., value) standardGeneric("chrom<-")) setReplaceMethod("chrom", "RangedData", function(x, value) { chrom(ranges(x)) <- value x }) setReplaceMethod("chrom", "GRanges", function(x, value) { seqnames(x) <- value x }) ### ========================================================================= ### Genome-oriented conveniences for RangedSelection classes ### ------------------------------------------------------------------------- ## One could imagine the BSgenome object having a coerce method to ## Ranges and RangesList, and this function could use that. But would ## the coercion consider masks? GenomicSelection <- function(genome, chrom = NULL, colnames = character(0)) { if (missing(genome) || !isSingleString(genome)) stop("'genome' must be a single string identifying a genome") si <- seqinfoForGenome(genome) if (is.null(si)) stop("Failed to obtain information for genome '", genome, "'") lens <- seqlengths(si) if (is.null(chrom)) chrom <- names(lens) else { if (!is.character(chrom)) stop("'chrom' must be NULL or a character vector") invalidChroms <- setdiff(chrom, names(lens)) if (length(invalidChroms)) stop("'chrom' contains invalid chromosomes: ", paste(invalidChroms, collapse = ", ")) lens <- lens[chrom] } RangedSelection(split(IRanges(1, lens), factor(chrom, chrom)), colnames) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### ## Individual sessions/views only support a single genome at a time, ## whereas range data structures can have multiple genomes. We try to ## rectify this here. singleGenome <- function(x) { x1 <- unname(x[1]) if (!all(is.na(x)) && (any(is.na(x)) || any(x != x1))) stop("Multiple genomes encountered; only one supported") x1 } ## normalize 'range', using 'session' for default genome ## if 'single' is 'TRUE', only one interval should come out of this normGenomeRange <- function(range, session, max.length = 1L) { ## the user can specify a portion of the genome in several ways: ## - String identifying a genome ## - RangesList ## - GRanges, the preferred way, possibly from GRangesForUCSCGenome() ## - We do not allow Ranges, since it does not make sense to have one range ## over many chromosomes if (is.character(range)) { range <- singleGenome(range) genome(session) <- range return(GRangesForGenome(range, seqinfo = seqinfo(session))) } if (!is(range, "RangesList") && !is(range, "GenomicRanges")) stop("'range' should be either a genome string, RangesList or GRanges") genome <- genome(session) if (length(seqinfo(range)) == 0L) { ## hack: need to avoid calling seqlengths(session) here, so use 'foo' seqinfo(range) <- Seqinfo("foo", genome = genome) } else { rangeGenome <- singleGenome(genome(range)) if (!is.na(rangeGenome) && rangeGenome != genome) { genome(session) <- rangeGenome on.exit(genome(session) <- genome) } si <- seqinfo(session) seqinfo(range, new2old = match(seqlevels(si), seqlevels(range))) <- merge(si, seqinfo(range)) } if (is(range, "RangesList")) { range <- GRangesForGenome(genome(range), names(range), unlist(range), seqinfo = seqinfo(session)) } else if (is(range, "GenomicRanges")) { strand(range) <- "*" mcols(range) <- NULL } if (length(range) > max.length) { warning("number of ranges (", length(range), ") exceeds limit of ", max.length) } if (max.length == 1L) { if (length(unique(seqnames(range))) > max.length) stop("'range' must contain ranges on a single chromosome") range(range) } else { head(range, max.length) } } spansGenome <- function(x) { strand(x) <- "*" x <- reduce(x) w <- structure(width(x), names = as.character(seqnames(x))) identical(w[names(seqlengths(x))], seqlengths(x)) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Questionable utilities ### # replace fields in 'x' with those in 'y', if given ## mergeRange <- function(x, y) ## { ## if (length(genome(y))) ## genome(x) <- genome(y) ## if (length(y)) ## x[[1]] <- y[[1]] ## if (length(names(y))) ## names(x)[1] <- names(y)[1] ## x ## } ## take 'y', filling in info from 'x' if necessary mergeRange <- function(x, y) { if (!length(genome(y))) { genome(y) <- genome(x) if (!length(names(y)) && length(y) == length(x)) { names(y) <- names(x) if (!length(unlist(y)) && length(x)) y[[1]] <- x[[1]] } } if (!length(genome(y))) stop("Genome must be specified") if (length(unlist(y)) && !length(names(y))) stop("Chromosome must be specified if an interval is specified") y } rtracklayer/R/tabix.R0000644000126300012640000000235712227067656016137 0ustar00biocbuildphs_compbio### ========================================================================= ### Tabix support ### ------------------------------------------------------------------------- ### setMethod("import", c("TabixFile", "character"), function(con, format, text, which = if (is.na(genome)) NULL else as(seqinfoForGenome(genome), "GenomicRanges"), genome = NA, header = TRUE, ...) { buffer <- queryForResource(con, which, header = header) on.exit(release(buffer)) file <- try(FileForFormat(buffer, format), silent = TRUE) if (is(file, "try-error")) { tabixHeader <- headerTabix(con) args <- list(...) if (is.null(args$comment.char)) args$comment.char <- tabixHeader$comment do.call(import.trackTable, c(list(buffer), genome = genome, tabixHeader$indexColumns, args)) } else import(file, genome = genome, ...) }) setMethod("import", c("TabixFile", "missing"), function(con, format, text, ...) { import(con, file_ext(file_path_sans_ext(path(con))), ...) }) rtracklayer/R/test_rtracklayer_package.R0000644000126300012640000000007612227067656022061 0ustar00biocbuildphs_compbio.test <- function() BiocGenerics:::testPackage("rtracklayer") rtracklayer/R/trackDb.R0000644000126300012640000000262012227067656016373 0ustar00biocbuildphs_compbio### ========================================================================= ### TrackDb class ### ------------------------------------------------------------------------- ### ### Represents a database or source of tracks, i.e, interval datasets ### setClass("TrackDb") setGeneric("track<-", function(object, ..., value) standardGeneric("track<-")) ## load a track into a database setReplaceMethod("track", c("TrackDb", "ANY"), function(object, name = deparse(substitute(value)), ..., value) { track(object, name, ...) <- RangedDataList(as(value, "RangedData", strict = FALSE)) object }) setClassUnion("RangedDataORRangedDataList", c("RangedData", "RangedDataList")) setMethod("[[<-", c("TrackDb", value="ANY"), function(x, i, j, ..., value) { if (!missing(j)) warning("argument 'j' ignored") track(x, i, ...) <- value x }) setMethod("$<-", c("TrackDb", value="ANY"), function(x, name, value) { x[[name]] <- value x }) setGeneric("track", function(object, ...) standardGeneric("track")) setMethod("[[", "TrackDb", function (x, i, j, ...) { if (!missing(j)) warning("argument 'j' ignored") track(x, i, ...) }) setMethod("$", "TrackDb", function (x, name) { x[[name]] }) rtracklayer/R/trackTable.R0000644000126300012640000000152312227067656017076 0ustar00biocbuildphs_compbio### ========================================================================= ### Arbitrary track table support ### ------------------------------------------------------------------------- ### ### At this point, this is internal, in support of the tabix stuff ### setGeneric("import.trackTable", function(con, genome = NA, seqnames = 1L, start = 2L, end = 3L, ...) standardGeneric("import.trackTable"), signature = "con") setMethod("import.trackTable", "characterORconnection", function(con, genome = NA, seqnames = 1L, start = 2L, end = 3L, ...) { tab <- read.table(con, sep = "\t", ...) GenomicData(IRanges(tab[[start]], tab[[end]]), tab[-c(seqnames, start, end)], chrom = tab[[seqnames]], genome = genome) }) rtracklayer/R/twobit.R0000644000126300012640000000765112227067656016342 0ustar00biocbuildphs_compbio### ========================================================================= ### UCSC 2bit support ### ------------------------------------------------------------------------- ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### TwoBitFile class ### setClass("TwoBitFile", contains = "RTLFile") setClass("2BitFile", contains = "TwoBitFile") twoBitPath <- function(path) { uri <- .parseURI(path) if (!uriIsLocal(uri)) stop("TwoBit driver handles only local file paths") path.expand(uri$path) } TwoBitFile <- function(path) { if (!isSingleString(path)) stop("'filename' must be a single string, specifying a path") new("TwoBitFile", resource = twoBitPath(path)) } `2BitFile` <- TwoBitFile setMethod("seqinfo", "TwoBitFile", function(x) { seqlengths <- .Call(TwoBitFile_seqlengths, path(x)) Seqinfo(names(seqlengths), seqlengths) # no circularity or genome information }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export.2bit", function(object, con, ...) standardGeneric("export.2bit")) setMethod("export.2bit", "ANY", function(object, con, ...) { export(object, con, "2bit", ...) }) setMethod("export", c("ANY", "TwoBitFile"), function(object, con, format, ...) { object <- as(object, "DNAStringSet") callGeneric() }) setMethod("export", c("BSgenome", "TwoBitFile"), function(object, con, format, ...) { if (!missing(format)) checkArgFormat(con, format) i <- 0L twoBits <- bsapply(new("BSParams", X = object, FUN = function(chr) { i <<- i + 1 .DNAString_to_twoBit(chr, seqnames(object)[i]) }, ...)) invisible(.TwoBits_export(as.list(twoBits), twoBitPath(path(con)))) }) setMethod("export", c("DNAStringSet", "TwoBitFile"), function(object, con, format) { if (!missing(format)) checkArgFormat(con, format) seqnames <- names(object) if (is.null(seqnames)) seqnames <- as.character(seq(length(object))) invisible(.TwoBits_export(mapply(.DNAString_to_twoBit, object, seqnames), twoBitPath(path(con)))) }) ## Hidden export of a list of twoBit pointers .TwoBits_export <- function(object, con) { if (!isSingleString(con)) stop("'con' must be a single, non-NA string") if (!all(sapply(object, function(x) typeof(x) == "externalptr" && is(x, "twoBit")))) stop("'object' must be a list of 'twoBit' pointers") .Call(TwoBits_write, object, con) } .DNAString_to_twoBit <- function(object, seqname) { if (!isSingleString(seqname)) stop("'seqname' must be a single, non-NA string") if (!is(object, "DNAString") && !is(object, "MaskedDNAString")) stop("'object' must be a DNAString") object_masks <- masks(object) if (!is.null(object_masks)) { object_mask <- collapse(object_masks)[[1]] active(masks(object)) <- FALSE # so we get the real sequence } else object_mask <- IRanges() .Call(DNAString_to_twoBit, as.character(object), object_mask, seqname) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.2bit", function(con, ...) standardGeneric("import.2bit")) setMethod("import.2bit", "ANY", function(con, ...) { import(con, "2bit", ...) }) setMethod("import", "TwoBitFile", function(con, format, text, which = as(seqinfo(con), "GenomicRanges"), ...) { lkup <- get_seqtype_conversion_lookup("B", "DNA") ans <- .Call(TwoBitFile_read, twoBitPath(path(con)), as.character(seqnames(which)), as(ranges(which), "IRanges"), lkup) names(ans) <- names(which) ans }) rtracklayer/R/ucsc.R0000644000126300012640000017576712227067656016005 0ustar00biocbuildphs_compbio# UCSC genome browser interface # every UCSC session is identified by a 'hguid' setClass("UCSCSession", representation(url = "character", hguid = "character", views = "environment"), contains = "BrowserSession") # gets an 'hgsid' to initialize the session setMethod("initialize", "UCSCSession", function(.Object, url = "http://genome.ucsc.edu/cgi-bin/", user = NULL, session = NULL, ...) { .Object@url <- url .Object@views <- new.env() handle <- getCurlHandle(followLocation=TRUE, ...) gw <- getURL(ucscURL(.Object, "gateway"), cookiefile = tempfile(), header = TRUE, curl = handle) if (grepl("Location: [^[:space:]]+cgi-bin/", gw)) .Object@url <- sub(".*Location: ([^[:space:]]+cgi-bin/).*", "\\1", gw) cookie <- grep("Set-[Cc]ookie: hguid[^=]*=", gw) if (!length(cookie)) stop("Failed to obtain 'hguid' cookie") hguid <- sub(".*Set-Cookie: (hguid[^=]*=[^;]*);.*", "\\1", gw) .Object@hguid <- hguid if (!is.null(user) && !is.null(session)) { ## bring in other session ucscGet(.Object, "tracks", list(hgS_doOtherUser = "submit", hgS_otherUserName = user, hgS_otherUserSessionName = session)) } .Object }) setMethod("seqlengths", "UCSCSession", function(x) { query <- ucscTableQuery(x, range = GRanges(), table = "chromInfo") chromInfo <- getTable(query) setNames(chromInfo$size, chromInfo$chrom) }) setMethod("seqnames", "UCSCSession", function(x) names(seqlengths(x))) setMethod("seqinfo", "UCSCSession", function(x) { sl <- seqlengths(x) Seqinfo(names(sl), sl, genome = genome(x)) # no circularity information }) normArgTrackData <- function(value, session) { genomes <- sapply(value, function(x) singleGenome(genome(x))) genomes[is.na(genomes)] <- "" tapply(value, unlist(genomes), function(tracks) { genome <- singleGenome(genome(tracks[[1]])) if (!is.na(genome)) genome(session) <- genome spaces <- unlist(lapply(tracks, names)) badSpaces <- setdiff(spaces, seqnames(session)) if (length(badSpaces)) stop("Invalid chromosomes for ", genome(session), ": ", paste(badSpaces, collapse = ", ")) }) value } setReplaceMethod("track", c("UCSCSession", "RangedDataList"), function(object, name = names(value), format = c("auto", "bed", "wig", "gff1", "bed15", "bedGraph"), ..., value) { format <- match.arg(format) if (length(value)) { ## upload values in blocks, one for each genome value <- normArgTrackData(value, object) names(value) <- name genomes <- sapply(value, function(x) singleGenome(genome(x))) genomes[is.na(genomes)] <- "" tapply(value, unlist(genomes), function(tracks) { form <- ucscForm(tracks, format, ...) response <- ucscPost(object, "custom", form) ### FIXME: need to check for error }) } object }) setReplaceMethod("track", c("UCSCSession", "RTLFile"), function(object, name = names(value), ..., value) { form <- ucscForm(value, genome(object), ...) response <- ucscPost(object, "custom", form) object }) setMethod("browserViews", "UCSCSession", function(object) object@views$instances) ## get the list of track names setMethod("trackNames", "UCSCSession", function(object) ucscTracks(object)@ids) ## get the current range setMethod("range", "UCSCSession", function(x, ..., na.rm) range(ucscCart(x))) setReplaceMethod("range", "UCSCSession", function(x, value) { ucscGet(x, "cart", ucscForm(normGenomeRange(value, x))) x }) setMethod("genome", "UCSCSession", function(x) { genome(ucscCart(x)) }) setReplaceMethod("genome", "UCSCSession", function(x, value) { if (!isSingleString(value)) stop("'genome' must be a single non-NA string") ucscGet(x, "gateway", list(db = value)) if (genome(x) != value) stop("Failed to set session genome to '", value, "'") x }) SeqinfoForUCSCGenome <- function(genome) { tryCatch({ session <- browserSession("UCSC") genome(session) <- genome seqinfo(session) }, error = function(cond) NULL) } GRangesForUCSCGenome <- function(genome, chrom = NULL, ranges = NULL, ...) { GRangesForGenome(genome, chrom = chrom, ranges = ranges, method = "UCSC", seqinfo = NULL, ...) } ## context for querying UCSC tables setClass("UCSCTableQuery", representation(session = "UCSCSession", track = "characterORNULL", table = "characterORNULL", range = "GRanges", outputType = "characterORNULL", NAMES = "characterORNULL", intersectTrack = "characterORNULL")) setMethod("show", "UCSCTableQuery", function(object) { cat("Get ") if (!is.null(tableName(object))) cat("table '", tableName(object), "' from ", sep = "") cat("track '", names(trackName(object)), "' within ", sep = "") range <- range(object) if (length(range) > 1) start <- end <- chrom <- "*" else { chrom <- as.character(seqnames(range)) start <- start(range) end <- end(range) } cat(genome(range)[1], ":", chrom, ":", start, "-", end, sep="") for (itrack in names(intersectTrack(object))) cat(" &", itrack) cat("\n") }) setMethod("browserSession", "UCSCTableQuery", function(object) { object@session }) setGeneric("browserSession<-", function(object, ..., value) standardGeneric("browserSession<-")) setReplaceMethod("browserSession", c("UCSCTableQuery", "UCSCSession"), function(object, value) { object@session <- value object }) setMethod("range", "UCSCTableQuery", function(x, ..., na.rm) x@range) setReplaceMethod("range", "UCSCTableQuery", function(x, value) { x@range <- normTableQueryRange(value, browserSession(x)) x }) setGeneric("trackName", function(x, ...) standardGeneric("trackName")) setMethod("trackName", "UCSCTableQuery", function(x) x@track) setGeneric("trackName<-", function(x, ..., value) standardGeneric("trackName<-")) setReplaceMethod("trackName", "UCSCTableQuery", function(x, value) { x@track <- normArgTrack(value, x) x }) setGeneric("tableName", function(x, ...) standardGeneric("tableName")) setMethod("tableName", "UCSCTableQuery", function(x) x@table) normArgTable <- function(name, query) { if (!is.null(name)) { if (!isSingleString(name)) stop("table name must be a single string or NULL") if (!name %in% tableNames(query)) stop("unknown table name '", name, "'") } name } setGeneric("tableName<-", function(x, ..., value) standardGeneric("tableName<-")) setReplaceMethod("tableName", "UCSCTableQuery", function(x, value) { x@table <- normArgTable(value, x) x }) setMethod("names", "UCSCTableQuery", function(x) x@NAMES) setReplaceMethod("names", "UCSCTableQuery", function(x, value) { x@NAMES <- value x }) setGeneric("intersectTrack", function(x, ...) standardGeneric("intersectTrack")) setMethod("intersectTrack", "UCSCTableQuery", function(x) x@intersectTrack) setGeneric("intersectTrack<-", function(x, ..., value) standardGeneric("intersectTrack<-")) setReplaceMethod("intersectTrack", "UCSCTableQuery", function(x, value) { x@intersectTrack <- normArgTrack(value, x, TRUE) x }) ## not exported setGeneric("outputType", function(x, ...) standardGeneric("outputType")) setMethod("outputType", "UCSCTableQuery", function(x) x@outputType) setGeneric("outputType<-", function(x, ..., value) standardGeneric("outputType<-")) setReplaceMethod("outputType", "UCSCTableQuery", function(x, value) { x@outputType <- value x }) normArgTrack <- function(name, trackids) { if (is.null(name)) return(name) if (!isSingleString(name)) stop("'track' must be a single string") if (is(trackids, "UCSCTableQuery")) trackids <- trackNames(trackids) if (!(name %in% trackids)) { mapped_name <- trackids[name] if (is.na(mapped_name)) stop("Unknown track: ", name) name <- mapped_name } else names(name) <- name name } normTableQueryRange <- function(range, x) { normGenomeRange(range, x, max.length = 1000L) } setGeneric("ucscTableQuery", function(x, ...) standardGeneric("ucscTableQuery")) setMethod("ucscTableQuery", "UCSCSession", function(x, track = NULL, range = genome(x), table = NULL, names = NULL, intersectTrack = NULL) { if (!is(names, "characterORNULL")) stop("'names' must be 'NULL' or a character vector") ## only inherit the genome from the session range <- normTableQueryRange(range, x) query <- new("UCSCTableQuery", session = x, range = range, NAMES = names) ## the following line must always happen to initialize the session ## otherwise stuff can go haywire trackids <- trackNames(query) if (!is.null(track) || !is.null(intersectTrack)) { query@track <- normArgTrack(track, trackids) query@intersectTrack <- normArgTrack(intersectTrack, trackids) } tableName(query) <- table query }) ucscTableGet <- function(query, .parse = TRUE, tracks = FALSE, ...) ucscGet(browserSession(query), "tables", c(ucscForm(query, tracks = tracks), ...), .parse = .parse) ucscTablePost <- function(query, .parse = TRUE, tracks = FALSE, ...) ucscPost(browserSession(query), "tables", c(ucscForm(query, tracks = tracks), list(...)), .parse = .parse) ## gets the track names available from the table browser setMethod("trackNames", "UCSCTableQuery", function(object) { doc <- ucscTableGet(object, tracks = TRUE) track_path <- "//select[@name = 'hgta_track']/option/@value" tracks <- unlist(getNodeSet(doc, track_path)) label_path <- "//select[@name = 'hgta_track']/option/text()" labels <- sub("\n.*$", "", sapply(getNodeSet(doc, label_path), xmlValue)) names(tracks) <- labels tracks }) ## returns a character vector of table names for a given track name + range setGeneric("tableNames", function(object, ...) standardGeneric("tableNames")) setMethod("tableNames", "UCSCTableQuery", function(object, trackOnly = FALSE) { doc <- ucscTableGet(object) table_path <- "//select[@name = 'hgta_table']/option/@value" tables <- unlist(getNodeSet(doc, table_path)) outputType <- outputType(object) if (trackOnly) { trackOutputs <- c("wigData", "wigBed", "bed") if (!is.null(outputType)) outputType <- intersect(trackOutputs, outputType) else outputType <- trackOutputs } if (!is.null(outputType)) { checkOutput <- function(table) { object@table <- table # avoid accessor to skip check outputs <- ucscTableOutputs(object) any(outputType %in% outputs) } tables <- tables[sapply(tables, checkOutput)] } unname(tables) }) setGeneric("ucscTableOutputs", function(object, ...) standardGeneric("ucscTableOutputs")) ## returns a character vector of available output types for the table ## not exported setMethod("ucscTableOutputs", "UCSCTableQuery", function(object) { doc <- ucscTableGet(object) output_path <- "//select[@name = 'hgta_outputType']/option/@value" unlist(getNodeSet(doc, output_path)) }) setClass("UCSCSchema", representation(genome = "character", tableName = "character", rowCount = "integer", formatDescription = "character"), contains = "DataFrame") setMethod("genome", "UCSCSchema", function(x) { x@genome }) setMethod("tableName", "UCSCSchema", function(x) { x@tableName }) setMethod("nrow", "UCSCSchema", function(x) { x@rowCount }) setGeneric("formatDescription", function(x, ...) standardGeneric("formatDescription")) setMethod("formatDescription", "UCSCSchema", function(x) { x@formatDescription }) setClass("UCSCLinks", representation(genome = "character", tableName = "character", fieldName = "character", viaName = "character")) setClass("UCSCSchemaDescription", representation(schema = "UCSCSchema", links = "UCSCLinks", sample = "DataFrame")) setGeneric("ucscSchemaDescription", function(object, ...) standardGeneric("ucscSchemaDescription")) ## not currently exported, just ucscSchema() is public setMethod("ucscSchemaDescription", "UCSCTableQuery", function(object) { alphaNum <- function(x) gsub("^ *", "", gsub("[^a-zA-Z0-9()+,. _'-]", "", x)) getBoldLabeledField <- function(name) { expr <- sprintf("//b[text() = '%s:']/following::text()[1]", name) alphaNum(xmlValue(getNodeSet(doc, expr)[[1]])) } getDataFrame <- function(tableNode) { getColumn <- function(ind) { ## FIXME: special treatment required for missing cells ## Is there a way to get child counts for every node in XPath? expr <- sprintf("tr/td[%d]", ind) children <- sapply(getNodeSet(tableNode, expr), xmlChildren) col <- rep(NA, length(children)) col[elementLengths(children) > 0] <- alphaNum(sapply(unlist(children), xmlValue)) col } columnNames <- sapply(getNodeSet(tableNode, "tr[1]/th//text()"), xmlValue) columns <- lapply(seq_along(columnNames), getColumn) names(columns) <- columnNames columns <- columns[elementLengths(columns) > 0] DataFrame(columns) } doc <- ucscTableGet(object, hgta_doSchema = "describe table schema") genome <- getBoldLabeledField("Database") tableName <- getBoldLabeledField("Primary Table") rowCount <- as.integer(gsub(",", "", getBoldLabeledField("Row Count"))) format <- getBoldLabeledField("Format description") schemaNode <- getNodeSet(doc, "//table[tr[1]/th[3]/text() = 'SQL type']")[[1]] schema <- getDataFrame(schemaNode) schema$RType <- sapply(schema$example, function(x) class(type.convert(x))) schema$RType[!nzchar(schema$example)] <- "factor" linkNode <- getNodeSet(doc, "//div[@class = 'subheadingBar' and contains(text(), 'Connected Tables and Joining Fields')]/following::table[1]/tr[2]/td[2]") if (length(linkNode)) { ## this is apparently optional linkNode <- linkNode[[1]] linkTable <- sapply(getNodeSet(linkNode, "a/text()"), xmlValue) linkText <- sapply(getNodeSet(linkNode, "text()"), xmlValue) linkMat <- matrix(linkText, nrow=2) linkGenome <- alphaNum(linkMat[1,]) linkGenome <- substring(linkGenome, 1, nchar(linkGenome)-1L) linkSplit <- matrix(unlist(strsplit(linkMat[2,], " ", fixed=TRUE)), 3) linkField <- substring(linkSplit[1,], 2) linkVia <- sub(".*?\\.(.*?)\\)", "\\1", linkSplit[3,]) links <- new("UCSCLinks", genome = linkGenome, tableName = linkTable, fieldName = linkField, viaName = linkVia) } else links <- new("UCSCLinks") sampNode <- getNodeSet(doc, "//div[@class = 'subheadingBar' and contains(text(), 'Sample')]/following::table[1]//table//table")[[1]] sample <- getDataFrame(sampNode) schema <- new("UCSCSchema", schema, genome = genome, tableName = tableName, rowCount = rowCount, formatDescription = format) new("UCSCSchemaDescription", schema = schema, links = links, sample = sample) }) setGeneric("ucscSchema", function(object, ...) standardGeneric("ucscSchema")) setMethod("ucscSchema", "UCSCSchemaDescription", function(object) { object@schema }) setMethod("ucscSchema", "UCSCTableQuery", function(object) { ucscSchema(ucscSchemaDescription(object)) }) .uploadTableBrowserRanges <- function(query, hgsid) { lines <- export(query@range, format = "bed", ignore.strand = TRUE) text <- paste(paste(lines, collapse = "\n"), "\n", sep = "") upload <- fileUpload("ranges.bed", text, "text/plain") ucscTablePost(query, hgta_enteredUserRegionFile = upload, hgta_enteredUserRegions = "", hgta_doSubmitUserRegions = "submit", hgsid = hgsid) } ## export data from UCSC (internal utility) ucscExport <- function(object) { get_hgsid <- function(node) getNodeSet(node, "//input[@name = 'hgsid']/@value")[[1]] hgsid <- NULL if (!is.null(names(object))) { # filter by names text <- paste(names(object), collapse = "\n") output <- ucscTablePost(object, hgta_doPastedIdentiers = "submit", hgta_pastedIdentifiers = text) error <- getNodeSet(output, "//script[contains(text(), '{showWarnBox')]/text()") if (length(error)) warning(sub(".*'
  • (.*?)'.*", "\\1", xmlValue(error[[1]]))) hgsid <- get_hgsid(output) } if (!is.null(intersectTrack(object))) { itrack <- intersectTrack(object) iquery <- object iquery@track <- itrack itable <- tableNames(iquery, TRUE) if (!length(itable)) stop("No table for intersection track: ", itrack) if (length(itable) > 1) # for now anyway itable <- itable[1] output <- ucscTableGet(object, hgta_nextIntersectGroup = "allTracks", hgta_nextIntersectTrack = itrack, hgta_nextIntersectTable = itable, hgta_nextIntersectOp = "any", hgta_doIntersectSubmit = "submit", boolshad.hgta_nextInvertTable = "0", boolshad.hgta_nextInvertTable2 = "0", hgsid = hgsid) hgsid <- get_hgsid(output) } if (length(object@range) > 1) { output <- .uploadTableBrowserRanges(object, hgsid) hgsid <- get_hgsid(output) } followup <- NULL if (outputType(object) == "bed") { ## some formats have extra pages followup <- list(hgta_doGetBed = "get BED", hgta_printCustomTrackHeaders = "on", boolshad.hgta_printCustomTrackHeaders = "1") } output <- ucscTableGet(object, !is.null(followup), hgta_doTopSubmit = "get output", hgsid = hgsid) if (!is.null(followup)) { hgsid <- get_hgsid(output) form <- c(followup, list(hgsid = hgsid)) output <- ucscGet(browserSession(object), "tables", form, .parse = FALSE) } output } setMethod("track", "UCSCSession", function(object, name, range = base::range(object), table = NULL, asRangedData = FALSE) { asRangedData <- normarg_asRangedData(asRangedData, "track") track(ucscTableQuery(object, name, range, table), asRangedData) }) inconsistentFieldCounts <- function(x) { con <- file() on.exit(close(con)) writeLines(x, con) length(unique(count.fields(con, skip=2L, sep="\t")) > 1L) } outputTruncated <- function(x) { has.msg <- grepl("^-", tail(x, 1)) has.msg #|| inconsistentFieldCounts(x) } ## download a trackSet by name setMethod("track", "UCSCTableQuery", function(object, asRangedData = FALSE) { asRangedData <- normarg_asRangedData(asRangedData, "track") tables <- tableNames(object) table <- tableName(object) if (!is.null(table) && !(table %in% tables)) stop("Unknown table: '", table, "'. Valid table names: ", tables) formats <- c("wigData", "wigBed", "bed") ## attempt to automatically determine the table if (!is.null(table)) tables <- table for (table in tables) { object@table <- table outputs <- ucscTableOutputs(object) if (any(formats %in% outputs)) break } if (!any(formats %in% outputs)) stop("No supported output types") if ("wigData" %in% outputs) { # track stored as wig format <- "wig" output <- "wigData" } else { format <- output <- "bed" if ("wigBed" %in% outputs) output <- "wigBed" } outputType(object) <- output output <- ucscExport(object) if (outputTruncated(output)) stop("Output is incomplete: ", "track may have more than 100,000 elements. ", "Try downloading the data via the UCSC FTP site.") import(text = output, format = format, asRangedData = asRangedData, seqinfo = seqinfo(range(object))) }) ## grab sequences for features in 'track' at 'range' ## setMethod("getSeq", "UCSCSession", ## function(object, range, table = "gold") ## { ## followup <- list(hgta_doGenomicDna = "get sequence", ## hgSeq.casing = "upper", ## hgSeq.repMasking = "lower") ## output <- ucscExport(object, range, "gold", table, "sequence", ## followup) ## con <- file() ## writeLines(output, con) ## set <- read.DNAStringSet(con, "fasta") ## close(con) ## set ## }) ## get a data.frame from a UCSC table ## think about taking specific columns setGeneric("getTable", function(object, ...) standardGeneric("getTable")) setMethod("getTable", "UCSCTableQuery", function(object) { if (!("primaryTable" %in% ucscTableOutputs(object))) stop("tabular output format not available") outputType(object) <- "primaryTable" if (is.null(tableName(object))) # must specify a table name tableName(object) <- tableNames(object)[1] output <- ucscExport(object) ## since '#' is not treated as a comment, we discard the ## error message, leaving only the header if (grepl("\\n# No results", output)) output <- gsub("\\n.*", "", output) f <- file() writeLines(output, f) header <- readChar(f, 1) ## strip off the '#' header prefix tab <- read.table(f, sep = "\t", header=TRUE, comment.char = "", quote = "") close(f) tab }) ## UCSC genome view setClass("UCSCView", representation(hgsid = "numeric"), contains = "BrowserView") ## create a view for the given session, position and track visibility settings ## if 'tracks' is a character vector (but not a UCSCTrackModes instance) it is ## assumed to name the tracks that should be in the view. otherwise, an ## attempt is made to coerce it to a UCSCTrackModes instance. setMethod("browserView", "UCSCSession", function(object, range, track, imagewidth = 800, ...) { form <- list() if (!missing(range)) { if (length(range) > 1) { ranges <- range views <- vector("list", length(ranges)) for (i in seq(length(ranges))) { range <- ranges[i] views[[i]] <- callGeneric() } return(BrowserViewList(views)) } range <- normGenomeRange(range, object) form <- c(form, ucscForm(range)) } view <- new("UCSCView", session = object) ## new hgsid for each browser launch doc <- ucscGet(object, "gateway") node <- getNodeSet(doc, "//input[@name = 'hgsid']/@value")[[1]] hgsid <- node ##xmlValue(node) view@hgsid <- as.numeric(hgsid) ## figure out track modes origModes <- modes <- ucscTrackModes(view) if (!missing(track)) { if (class(track) == "character") trackNames(modes) <- track else { userModes <- as(track, "UCSCTrackModes") modes[names(userModes)] <- userModes } } argModes <- ucscTrackModes(...) modes[names(argModes)] <- argModes modes <- modes[modes != origModes] form <- c(form, ucscForm(modes), ucscForm(view)) if (!missing(imagewidth)) form <- c(form, pix = imagewidth) ## launch a web browser ucscShow(object, "tracks", form) ## save this view object@views$instances <- c(object@views$instances, view) view }) # every view has a "mode" (hide, dense, pack, squish, full) for each track ### FIXME: probably should be merged with ucscTracks ### Or just leave it; ucscTracks might become more complex, while we ### need a simple way to manipulate track modes. setClass("UCSCTrackModes", representation(labels = "character"), contains = "character") # get/set track modes to/from e.g. a view setGeneric("ucscTrackModes", function(object, ...) standardGeneric("ucscTrackModes")) # convenience constructor for track mode object setMethod("ucscTrackModes", "character", function(object, labels, hide = character(), dense = character(), pack = character(), squish = character(), full = character()) { object[hide] <- "hide" object[dense] <- "dense" object[pack] <- "pack" object[squish] <- "squish" object[full] <- "full" if (missing(labels)) labels <- names(object) new("UCSCTrackModes", object, labels = as.character(labels)) }) setMethod("ucscTrackModes", "missing", function(object, ...) ucscTrackModes(character(), ...)) setMethod("ucscTrackModes", "UCSCView", function(object) { ucscTrackModes(ucscTracks(object)) }) setMethod("ucscTrackModes", "UCSCSession", function(object) { ucscTrackModes(ucscTracks(object)) }) setGeneric("ucscTrackModes<-", function(object, value) standardGeneric("ucscTrackModes<-")) setReplaceMethod("ucscTrackModes", c("UCSCView", "UCSCTrackModes"), function(object, value) { # FIXME: needs to be more extensible browserView(object@session, range(object), value) }) setReplaceMethod("ucscTrackModes", c("UCSCView", "character"), function(object, value) { ucscTrackModes(object) <- ucscTrackModes(value) object }) ## subsetting UCSCTrackModes ## if not in ids, try labels resolveTrackIndex <- function(object, i) { if (is.character(i)) { missing <- !(i %in% names(object)) matching <- match(i[missing], object@labels) if (any(is.na(matching))) { unmatched <- i[missing][is.na(matching)] stop("Unknown track(s): ", paste(unmatched, collapse = ", ")) } i[missing] <- names(object)[matching] } i } setMethod("[", "UCSCTrackModes", function(x, i, j, ..., drop=FALSE) { vec <- x@.Data names(vec) <- names(x) names(x@labels) <- names(x) ind <- resolveTrackIndex(x, i) initialize(x, vec[ind], labels = x@labels[ind]) }) setReplaceMethod("[", "UCSCTrackModes", function(x, i, j, ..., value) { vec <- x@.Data names(vec) <- names(x) vec[resolveTrackIndex(x, i)] <- value x@.Data <- as.vector(vec) x }) # handle simple track show/hide setMethod("trackNames", "UCSCTrackModes", function(object) { visible <- object != "hide" tracks <- names(object)[visible] names(tracks) <- object@labels[visible] tracks }) setReplaceMethod("trackNames", "UCSCTrackModes", function(object, value) { value <- resolveTrackIndex(object, value) spec <- names(object) %in% value object[!spec] <- "hide" object[spec & object == "hide"] <- "full" object }) setMethod("trackNames", "UCSCView", function(object) { tracks <- ucscTracks(object) modes <- ucscTrackModes(tracks) tracks@ids[tracks@ids %in% trackNames(modes)] }) setReplaceMethod("trackNames", "UCSCView", function(object, value) { trackNames(ucscTrackModes(object)) <- value object }) setMethod("visible", "UCSCView", function(object) { modes <- ucscTrackModes(object) vis <- modes != "hide" names(vis) <- modes@labels vis }) setReplaceMethod("visible", "UCSCView", function(object, value) { modes <- ucscTrackModes(object) modes[value & modes == "hide"] <- "full" modes[!value] <- "hide" ucscTrackModes(object) <- modes object }) setMethod("range", "UCSCView", function(x, ..., na.rm) range(ucscCart(x))) setReplaceMethod("range", "UCSCView", function(x, value) { browserView(x@session, value, ucscTrackModes(x)) }) # only one view per session; a view is always active setMethod("activeView", "UCSCView", function(object) TRUE) # ucscTrackSet # visual properties are specified by a "track line" for UCSC setClass("TrackLine", representation(name = "character", description = "character", visibility = "character", color = "integer", priority = "numeric"), prototype(name = "R Track")) setMethod("show", "TrackLine", function(object) { cat(as(object, "character"), "\n") }) setClass("BasicTrackLine", representation(itemRgb = "logical", useScore = "logical", group = "character", db = "character", offset = "numeric", url = "character", htmlUrl = "character", colorByStrand = "matrix"), contains = "TrackLine") ucscPair <- function(key, value) paste(key, value, sep = "=") # to a text line setAs("TrackLine", "character", function(from) { checkString <- function(str, len) { ## These are more annoying than useful ## if (nchar(gsub("[a-zA-Z0-9_ ]", "", str))) ## warning("The string '", str, ## "' contains non-standard characters.") ## if (nchar(str) > len) { ## str <- substring(str, 1, len) ## warning("The string '", str, "' must be less than ", len, ## " characters; it has been truncated.") ## } if (regexpr(" ", str)[1] != -1) str <- paste("\"", str, "\"", sep="") str } str <- "track" name <- from@name if (length(name)) str <- paste(str, " name=", checkString(name, 15), sep="") desc <- from@description if (length(desc)) str <- paste(str, " description=", checkString(desc, 60), sep="") vis <- from@visibility if (length(vis)) str <- paste(str, " visibility=", vis, sep="") color <- from@color if (length(color)) str <- paste(str, " color=", paste(color, collapse=","), sep="") priority <- from@priority if (length(priority)) str <- paste(str, " priority=", priority, sep="") str }) setAs("BasicTrackLine", "character", function(from) { str <- as(as(from, "TrackLine"), "character") itemRgb <- from@itemRgb if (length(itemRgb)) str <- paste(str, " itemRgb=", if (itemRgb) "on" else "off", sep = "") useScore <- from@useScore if (length(useScore)) str <- paste(str, " useScore=", if (useScore) "1" else "0", sep = "") group <- from@group if (length(group)) str <- paste(str, " group=", group, sep="") db <- from@db if (length(db)) str <- paste(str, " db=", db, sep="") offset <- from@offset if (length(offset)) str <- paste(str, " offset=", offset, sep="") url <- from@url if (length(url)) str <- paste(str, " url=", "\"", url, "\"", sep="") htmlUrl <- from@htmlUrl if (length(htmlUrl)) str <- paste(str, " htmlUrl=", "\"", htmlUrl, "\"", sep="") colorByStrand <- from@colorByStrand if (length(colorByStrand)) { colors <- paste(colorByStrand[1,], colorByStrand[2,], colorByStrand[3,], sep = ",", collapse = " ") str <- paste(str, " colorByStrand=", colors, sep = "") } str }) ucscParsePairs <- function(str) { str <- sub("^[[:alpha:]]*[[:blank:]]", "", str) split <- as.character(read.table(sep = "=", comment.char = "", as.is = TRUE, strip.white = TRUE, text = str)) vals <- character(0) if (length(split)) { mixed <- tail(head(split, -1), -1) tags <- head(split, 1) vals <- tail(split, 1) if (length(mixed)) { tags <- c(tags, sub(".*[[:space:]]([[:alnum:]]*)$", "\\1", mixed)) vals <- c(sub("(.*)[[:space:]][[:alnum:]]*$", "\\1", mixed), vals) } names(vals) <- tags } vals } # from a text line setAs("character", "TrackLine", function(from) { line <- new("TrackLine") vals <- ucscParsePairs(from) if (!is.na(vals["name"])) line@name <- vals[["name"]] if (!is.na(vals["description"])) line@description <- vals[["description"]] if (!is.na(vals["visibility"])) line@visibility <- vals[["visibility"]] if (!is.na(vals["color"])) line@color <- as.integer(strsplit(vals[["color"]], ",")[[1]]) if (!is.na(vals["priority"])) line@priority <- as.numeric(vals[["priority"]]) line }) setAs("character", "BasicTrackLine", function(from) { line <- new("BasicTrackLine", as(from, "TrackLine")) vals <- ucscParsePairs(from) if (!is.na(vals["itemRgb"])) line@itemRgb <- tolower(vals[["itemRgb"]]) == "on" if (!is.na(vals["useScore"])) line@useScore <- vals[["useScore"]] == "1" if (!is.na(vals["group"])) line@group <- vals[["group"]] if (!is.na(vals["db"])) line@db <- vals[["db"]] if (!is.na(vals["offset"])) line@offset <- as.integer(vals[["offset"]]) if (!is.na(vals["url"])) line@url <- vals[["url"]] if (!is.na(vals["htmlUrl"])) line@htmlUrl <- vals[["htmlUrl"]] if (!is.na(vals["colorByStrand"])) { colorToken <- strsplit(strsplit(vals[["colorByStrand"]], " ")[[1]], ",") line@colorByStrand <- matrix(as.integer(unlist(colorToken)), nrow = 3) } line }) setClass("GraphTrackLine", representation(altColor = "integer", autoScale = "logical", alwaysZero = "logical", gridDefault = "logical", maxHeightPixels = "integer", graphType = "character", viewLimits = "numeric", yLineMark = "numeric", yLineOnOff = "logical", windowingFunction = "character", smoothingWindow = "numeric", type = "character"), contains = "TrackLine") setAs("GraphTrackLine", "character", function(from) { str <- as(as(from, "TrackLine"), "character") type <- if (from@type == "wig") "wiggle_0" else "bedGraph" str <- paste(str, " type=", type, sep = "") color <- from@altColor if (length(color)) str <- paste(str, " altColor=", paste(color, collapse=","), sep="") autoScale <- from@autoScale onoff <- function(x) if (x) "on" else "off" if (length(autoScale)) str <- paste(str, " autoScale=", onoff(autoScale), sep = "") alwaysZero <- from@alwaysZero if (length(alwaysZero)) str <- paste(str, " alwaysZero=", onoff(alwaysZero), sep = "") gridDefault <- from@gridDefault if (length(gridDefault)) str <- paste(str, " gridDefault=", onoff(gridDefault), sep = "") maxHeightPixels <- from@maxHeightPixels if (length(maxHeightPixels)) str <- paste(str, " maxHeightPixels=", paste(maxHeightPixels, collapse=":"), sep = "") graphType <- from@graphType if (length(graphType)) str <- paste(str, " graphType=", graphType, sep = "") viewLimits <- from@viewLimits if (length(viewLimits)) str <- paste(str, " viewLimits=", paste(viewLimits, collapse = ":"), sep = "") yLineMark <- from@yLineMark if (length(yLineMark)) str <- paste(str, " yLineMark=", yLineMark, sep = "") yLineOnOff <- from@yLineOnOff if (length(yLineOnOff)) str <- paste(str, " yLineOnOff=", onoff(yLineOnOff), sep = "") windowingFunction <- from@windowingFunction if (length(windowingFunction)) str <- paste(str, " windowingFunction=", windowingFunction, sep = "") smoothingWindow <- from@smoothingWindow if (length(smoothingWindow)) str <- paste(str, " smoothingWindow=", smoothingWindow, sep = "") str }) setAs("character", "GraphTrackLine", function(from) { line <- new("GraphTrackLine", as(from, "TrackLine")) vals <- ucscParsePairs(from) type <- vals[["type"]] if (!(type %in% c("wiggle_0", "bedGraph"))) stop("Unknown graph track type: ", type) line@type <- if (type == "wiggle_0") "wig" else "bedGraph" if (!is.na(vals["altColor"])) line@altColor <- as.integer(strsplit(vals[["altColor"]], ",")[[1]]) if (!is.na(vals["autoScale"])) line@autoScale <- tolower(vals[["autoScale"]]) == "on" if (!is.na(vals["alwaysZero"])) line@alwaysZero <- tolower(vals[["alwaysZero"]]) == "on" if (!is.na(vals["gridDefault"])) line@gridDefault <- tolower(vals[["gridDefault"]]) == "on" if (!is.na(vals["maxHeightPixels"])) line@maxHeightPixels <- as.integer(strsplit(vals[["maxHeightPixels"]], ":")[[1]]) if (!is.na(vals["graphType"])) line@graphType <- vals[["graphType"]] if (!is.na(vals["viewLimits"])) line@viewLimits <- as.numeric(strsplit(vals[["viewLimits"]], ":")[[1]]) if (!is.na(vals["yLineMark"])) line@yLineMark <- as.numeric(vals[["yLineMark"]]) if (!is.na(vals["yLineOnOff"])) line@yLineOnOff <- tolower(vals[["yLineOnOff"]]) == "on" if (!is.na(vals["windowingFunction"])) line@windowingFunction <- vals[["windowingFunction"]] if (!is.na(vals["smoothingWindow"])) line@smoothingWindow <- as.numeric(vals[["smoothingWindow"]]) line }) setAs("BasicTrackLine", "GraphTrackLine", function(from) new("GraphTrackLine", from)) setAs("GraphTrackLine", "BasicTrackLine", function(from) new("BasicTrackLine", from)) setClass("UCSCData", representation(trackLine = "TrackLine"), prototype(trackLine = new("BasicTrackLine")), "GRanges") setMethod("show", "UCSCData", function(object) { if (!is.null(object@trackLine@name)) cat("UCSC track '", object@trackLine@name, "'\n", sep = "") callNextMethod() }) chooseGraphType <- function(from) { r <- ranges(from)[[1]] # heuristic only needs first chromosome type <- "bedGraph" ## decide whether compression is a good idea steps <- diff(sort(start(r))) if (length(unique(width(r))) == 1L && # all spans must be the same for WIG (length(unique(steps)) == 1L || # fixed-step makes sense ((3L * length(unique(width(r)))) < length(r) && # makes sense wrt size mean(steps) < 100))) # dense enough for UCSC efficiency type <- "wig" type } setAs("GRanges", "UCSCData", function(from) { line <- metadata(from)$trackLine if (is.null(line)) { if (is.numeric(score(from))) { # have numbers, let's plot them type <- chooseGraphType(as(from, "RangedData")) line <- new("GraphTrackLine", type = type) } else { line <- new("BasicTrackLine") db <- unique(genome(from)) if (length(db) == 1 && !is.na(db)) line@db <- db } } else { metadata(from)$trackLine <- NULL } new("UCSCData", as(from, "GRanges"), trackLine = line) }) setAs("UCSCData", "GRanges", function(from) { gr <- new("GRanges") for (what in slotNames(gr)) slot(gr, what) <- slot(from, what) metadata(gr)$trackLine <- from@trackLine gr }) setAs("RangedData", "UCSCData", function(from) { line <- metadata(ranges(from))$trackLine if (is.null(line)) { if (is.numeric(score(from))) { # have numbers, let's plot them type <- chooseGraphType(from) line <- new("GraphTrackLine", type = type) } else { line <- new("BasicTrackLine") db <- unique(genome(from)) if (length(db) == 1 && !is.na(db)) line@db <- db } } new("UCSCData", as(from, "GRanges"), trackLine = line) }) setAs("UCSCData", "RangedData", function(from) { as(as(from, "GRanges"), "RangedData") }) splitUCSCData <- function(x, f, drop=FALSE, ...) { GenomicRangesList( lapply(split(seq_along(x), f, drop=drop, ...), function(i) x[i]) ) } setMethod("split", "UCSCData", splitUCSCData) setMethod("split", c("UCSCData", "Vector"), splitUCSCData) setClass("UCSCFile", contains = "RTLFile") UCSCFile <- function(resource) { new("UCSCFile", resource = resource) } ## the 'ucsc' format is a meta format with a track line followed by ## features formatted as 'wig', 'bed', 'bed15', 'bedGraph', 'gff', or ## really any text track format. setGeneric("export.ucsc", function(object, con, ...) standardGeneric("export.ucsc")) setMethod("export.ucsc", c("ANY", "RTLFile"), function(object, con, subformat = "auto", ...) { if (subformat == "auto" && !is(con, "UCSCFile")) subformat <- fileFormat(con) export(object, UCSCFile(resource(con)), subformat, ...) }) setMethod("export.ucsc", c("ANY", "ANY"), function(object, con, ...) { export(object, con, "ucsc", ...) }) .export_RangedDataList_RTLFile <- function(object, con, format, ...) { export(object, UCSCFile(resource(con)), subformat = fileFormat(con), ...) } setMethod("export", c("RangedDataList", "UCSCFile"), function(object, con, format, append = FALSE, index = FALSE, ...) { if (isTRUE(index) && length(object) > 1) stop("Cannot index multiple tracks in a single file") trackNames <- names(object) if (is.null(trackNames)) trackNames <- paste("R Track", seq_len(length(object))) ucsc <- unlist(lapply(object, is, "UCSCData")) lines <- unlist(lapply(object[ucsc], slot, "trackLine")) trackNames[ucsc] <- as.character(sapply(lines, slot, "name")) for (i in seq_len(length(object))) { export(object[[i]], con, name = trackNames[i], append = append, index = index, ...) append <- TRUE } }) trackLineClass <- function(subformat) { subformat <- tolower(subformat) if (subformat == "wig" || subformat == "bedgraph") "GraphTrackLine" else if (subformat == "bed15") "Bed15TrackLine" else "BasicTrackLine" } setGeneric("fileFormat", function(x) standardGeneric("fileFormat")) setMethod("fileFormat", "TrackLine", function(x) "bed") setMethod("fileFormat", "GraphTrackLine", function(x) x@type) setMethod("bestFileFormat", c("UCSCData", "ANY"), function(x, dest) { fileFormat(x@trackLine) }) setMethod("export", c("ANY", "UCSCFile"), function(object, con, format, ...) { cl <- class(object) track <- try(as(object, "RangedData"), silent = TRUE) if (class(track) == "try-error") { track <- try(as(object, "RangedDataList"), silent = TRUE) if (is(track, "try-error")) stop("cannot export object of class '", cl, "': ", track) } object <- track callGeneric() }) setMethod("export", c("RangedData", "UCSCFile"), function(object, con, format, ...) { object <- as(object, "UCSCData") callGeneric() }) setMethod("export", c("UCSCData", "UCSCFile"), function(object, con, format, subformat = "auto", append = FALSE, index = FALSE, ...) { auto <- FALSE if (subformat == "auto") { auto <- TRUE subformat <- bestFileFormat(object, con) } graphFormat <- tolower(subformat) %in% c("wig", "bedgraph") if (graphFormat) { strand <- as.character(strand(object)) strand[is.na(strand)] <- "NA" isStrandDisjoint <- function(track) { track <- as(track, "RangedData") all(unlist(lapply(ranges(track), function(r) { isDisjoint(r) && all(width(r) > 0) }))) } if (!all(unlist(lapply(split(object, strand), isStrandDisjoint)))) { if (auto) { subformat <- "bed" graphFormat <- FALSE } else stop("Track not compatible with WIG/bedGraph: ", "Overlapping features must be on separate strands", " and every feature width must be positive") } } lineClass <- trackLineClass(subformat) if (!is(object@trackLine, lineClass)) object@trackLine <- as(object@trackLine, lineClass) if (is(object@trackLine, "GraphTrackLine")) object@trackLine@type <- subformat args <- list(...) lineArgs <- names(args) %in% slotNames(lineClass) for (argName in names(args)[lineArgs]) slot(object@trackLine, argName) <- args[[argName]] if (is(object@trackLine, "BasicTrackLine") && length(object@trackLine@offset)) ranges(object) <- shift(ranges(object), -object@trackLine@offset) trackLine <- NULL if (graphFormat) { strand <- as.character(strand(object)) strand[is.na(strand)] <- "NA" if (!all(strand[1] == strand)) { nameMap <- c("+" = "p", "-" = "m", "NA" = "NA") strand <- factor(strand) name <- paste(object@trackLine@name, nameMap[levels(strand)]) tracks <- split(object, strand) export(tracks, con, subformat, append, trackNames = name, ...) return() } } else if (subformat == "bed15") { if (is.null(object@trackLine@expNames)) object@trackLine@expNames <- colnames(object) trackLine <- object@trackLine } file <- con con <- connection(con, if (append) "a" else "w") on.exit(release(con)) cat(as(object@trackLine, "character"), "\n", file=con, sep = "") do.call(export, c(list(as(object, "RangedData"), unmanage(con), subformat), args[!lineArgs], trackLine = trackLine)) release(con) if (index) indexTrack(FileForFormat(resource(file), subformat), skip = 1L) else invisible(file) }) setGeneric("import.ucsc", function(con, ...) standardGeneric("import.ucsc")) setMethod("import.ucsc", "ANY", function(con, ...) { import(con, "ucsc", ...) }) setMethod("import.ucsc", "RTLFile", function(con, subformat = "auto", ...) { if (!is(con, "UCSCFile")) { format <- fileFormat(con) if (subformat != "auto" && format != subformat) stop("Attempt to import '", class(con), "' as ", subformat) subformat <- format } import.ucsc(resource(con), subformat = subformat, ...) }) parseFormatFromTrackLine <- function(x) { if (!grepl("type=", x)) NULL else { type <- sub(".*type=\"(.*?)\".*", "\\1", x) if (type == "array") "bed15" else if (type == "wiggle_0") "wig" else type } } setMethod("import", "UCSCFile", function(con, format, text, subformat = "auto", drop = FALSE, asRangedData = FALSE, genome = NA, ...) { asRangedData <- normarg_asRangedData(asRangedData, "import", if.FALSE="GenomicRangesList", if.TRUE="RangedDataList") lines <- readLines(resource(con), warn = FALSE) tracks <- grep("^track", lines) trackLines <- lines[tracks] starts <- tracks + 1L ends <- c(tail(tracks, -1) - 1L, length(lines)) makeTrackSet <- function(i) { if (subformat == "auto") { subformat <- parseFormatFromTrackLine(trackLines[i]) if (is.null(subformat)) { p <- resourceDescription(con) subformat <- file_ext(p) } } line <- as(trackLines[i], trackLineClass(subformat)) if (starts[i] <= ends[i]) { text <- window(lines, starts[i], ends[i]) } else { text <- character() } if (is.na(genome) && is(line, "BasicTrackLine") && length(line@db)) genome <- line@db if (subformat == "bed15") { # need to pass track line ucsc <- import(format = "bed15", text = text, trackLine = line, asRangedData = asRangedData, genome = genome, ...) } else { ucsc <- import(format = subformat, text = text, asRangedData = asRangedData, genome = genome, ...) } if (is(line, "BasicTrackLine") && length(line@offset)) ranges(ucsc) <- shift(ranges(ucsc), line@offset) if (asRangedData) { metadata(ranges(ucsc))$trackLine <- line } else { ucsc <- as(ucsc, "UCSCData", FALSE) ucsc@trackLine <- line } ucsc } tsets <- lapply(seq_along(trackLines), makeTrackSet) if (asRangedData) { trackNames <- sapply(tsets, function(x) metadata(ranges(x))$trackLine@name) } else { trackNames <- sapply(tsets, function(x) x@trackLine@name) } if (!any(is.na(trackNames))) names(tsets) <- trackNames if (drop && length(tsets) == 1) return(tsets[[1]]) ans <- do.call(RangedDataList, lapply(tsets, as, "RangedData")) if (!asRangedData) { ans <- GenomicRangesList( lapply(ans, function(rd) { line <- metadata(ranges(rd))$trackLine if (is.null(line)) Class <- "GRanges" else Class <- "UCSCData" as(rd, Class) })) } ans }) setMethod("login", "UCSCSession", function(x, username, password) { ucscPost(x, "hgLogin", list(hgLogin.do.displayLogin = "Login", hgLogin_userName = username, hgLogin_password = password)) }) setMethod("saveView", "UCSCView", function(x, name, username, password, share = TRUE) { if (!missing(username)) login(browserSession(x), username, password) ucscPost(x, "hgSession", list(hgS_newSessionName = name, hgS_newSessionShare = if (share) "on" else "off")) }) setMethod("restoreView", "UCSCSession", function(x, name, username, password) { if (!missing(username)) login(x, username, password) ucscPost(x, "hgSession", setNames(list("use"), paste0("hgS_load_", name))) }) ############ INTERNAL API ############ ## every cgi variable is stored in the 'cart' setClass("ucscCart", contains = "character") setGeneric("ucscCart", function(object, ...) standardGeneric("ucscCart")) setMethod("ucscCart", "UCSCSession", function(object, form = ucscForm(activeView(object))) { node <- ucscGet(object, "cart", form) raw <- xmlValue(getNodeSet(node, "//pre/text()")[[1]]) lines <- strsplit(raw, "\n")[[1]] fields <- strsplit(lines, " ") pairs <- fields[sapply(fields, length) == 2] mat <- matrix(unlist(pairs), nrow = 2) vals <- mat[2,] names(vals) <- mat[1,] new("ucscCart", vals) }) setMethod("ucscCart", "UCSCView", function(object) { ucscCart(object@session, ucscForm(object)) }) setMethod("genome", "ucscCart", function(x) x[["db"]]) setMethod("range", "ucscCart", function(x, ..., na.rm) { pos <- x["position"] posSplit <- strsplit(pos, ":")[[1]] range <- as.numeric(gsub(",", "", strsplit(posSplit[2], "-")[[1]])) GRangesForUCSCGenome(x[["db"]], posSplit[1], IRanges(range[1], range[2])) }) ### track information setClass("ucscTracks", representation(ids = "character", modes = "character")) setGeneric("ucscTracks", function(object, ...) standardGeneric("ucscTracks")) setMethod("ucscTracks", "UCSCSession", function(object, form = list()) { tracks <- ucscGet(object, "tracks", form) nodes <- getNodeSet(tracks, "//select/option[@selected]/text()") trackModes <- sapply(nodes, xmlValue) nodes <- getNodeSet(tracks, "//select/@name") trackIds <- unlist(nodes) ##trackIds <- sapply(nodes, xmlValue) nodes <- getNodeSet(tracks, "//select/../a/text()") names(trackIds) <- sub("^ ", "", sapply(nodes, xmlValue)) new("ucscTracks", ids = trackIds, modes = trackModes) }) setMethod("ucscTracks", "UCSCView", function(object) { ucscTracks(object@session, ucscForm(object)) }) setMethod("ucscTrackModes", "ucscTracks", function(object) { modes <- object@modes labels <- names(object@ids) names(modes) <- object@ids ucscTrackModes(modes, labels) }) ## List available UCSC genomes ucscGenomes <- function() { url <- "http://genome.ucsc.edu/FAQ/FAQreleases" doc <- httpGet(url) table <- getNodeSet(doc, "//table[@class='descTbl']")[[1L]] species <- sapply(getNodeSet(table, "tr/td[1]"), xmlValue) dbs <- sapply(getNodeSet(table, "tr/td[2]"), xmlValue) dates <- sapply(getNodeSet(table, "tr/td[3]"), xmlValue) nms <- sapply(getNodeSet(table, "tr/td[4]"), xmlValue) status <- sapply(getNodeSet(table, "tr/td[5]"), xmlValue) .cleanTableCells <- function(x) { x <- sub("^ *", "", x) ## Some empty cells in the table of UCSC genome releases seem to contain ## invisible junk. This junk seems to vary from one platform to the other ## (not clear why, maybe some sort of local issue?). ## There must be a simplest way to get rid of this junk... ## TODO: Test this on Windows! is_empty_cell <- x %in% c("", "\xc2\xa0", "\xc3\x82\xc2\xa0") x[is_empty_cell] <- "" x } df <- data.frame(db=.cleanTableCells(dbs), species=.cleanTableCells(species), date=.cleanTableCells(dates), name=.cleanTableCells(nms), status=.cleanTableCells(status), stringsAsFactors=FALSE) COLS <- c("UCSC VERSION", "SPECIES", "RELEASE DATE", "RELEASE NAME", "STATUS") if (!identical(as.character(df[1L, ]), COLS)) stop("table of UCSC genome releases (found at ", url, "#release1) ", "doesn't have expected columns ", paste(COLS, collapse=", ")) df <- df[-1L, ] df <- df[df$db != "" , ] not_empty <- df$species != "" df$species <- rep.int(df$species[not_empty], diff(which(c(not_empty, TRUE)))) df <- df[df$status == "Available", -5L] rownames(df) <- NULL df } # form creation setGeneric("ucscForm", function(object, ...) standardGeneric("ucscForm")) setMethod("ucscForm", "RangesList", function(object) { form <- list() genome <- singleGenome(genome(object)) if (!is.na(genome)) form <- c(form, db = genome) chrom <- space(object) if (!is.null(chrom)) { if (!length(chrom)) chrom <- levels(chrom)[1] scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) position <- chrom if (length(unlist(start(object)))) position <- paste(chrom, ":", unlist(start(object)), "-", unlist(end(object)), sep = "") form <- c(form, position = position) } form }) setMethod("ucscForm", "GRanges", function(object) { scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) form <- list() genome <- singleGenome(genome(object)) if (!is.na(genome)) form <- c(form, db = genome) if (length(object) > 0L) { object <- object[1] c(form, position = paste(seqnames(object), ":", unlist(start(object)), "-", unlist(end(object)), sep = "")) } else form }) setMethod("ucscForm", "UCSCTrackModes", function(object) { as.list(object) }) setMethod("ucscForm", "UCSCView", function(object) { if (length(object@hgsid)) list(hgsid = as.character(object@hgsid)) else list() }) setOldClass("FileUploadInfo") setMethod("ucscForm", "FileUploadInfo", function(object, genome = NA_character_, ...) { form <- list(Submit = "Submit", hgt.customFile = object) if (!is.na(genome)) form <- c(form, db = genome) form }) setMethod("ucscForm", "RangedDataList", function(object, format, ...) { lines <- export(object, format = "ucsc", subformat = format, ...) text <- paste(paste(lines, collapse = "\n"), "\n", sep = "") filename <- paste("track", format, sep = ".") upload <- fileUpload(filename, text, "text/plain") genome <- singleGenome(genome(object)) ucscForm(upload, genome) }) setMethod("ucscForm", "RTLFile", function(object, genome, ...) { upload <- fileUpload(path(object), "text/plain") ucscForm(upload, genome) }) setMethod("ucscForm", "UCSCTableQuery", function(object, tracks = FALSE) { ## range (ie genome) is required range <- object@range table <- object@table form <- list() if (length(range) == 1) { form <- c(form, ucscForm(range)) } if (is.null(object@track) && !tracks) { form <- c(form, list(hgta_group = "allTables")) if (is.null(table)) table <- "chromInfo" } else form <- c(form, list(hgta_group = "allTracks", hgta_track = object@track)) if (spansGenome(range)) regionType <- "genome" else if (length(range) == 1) regionType <- "range" else regionType <- "userRegions" form <- c(form, hgta_regionType = regionType, hgta_table = table) if (!is.null(object@outputType)) { form <- c(form, hgta_outputType = object@outputType) } form }) setMethod("ucscForm", "NULL", function(object) list()) # Transforming to a cookie string setGeneric("ucscCookie", function(object, ...) standardGeneric("ucscCookie")) setMethod("ucscCookie", "UCSCSession", function(object) { object@hguid }) # HTTP wrappers # URL constants for UCSC ucscURLTable <- c(gateway = "hgGateway", tracks = "hgTracks", custom = "hgCustom", tables = "hgTables", cart = "cartDump") ucscURL <- function(object, key) { path <- ucscURLTable[key] if (is.na(path)) stop("Key '", key, "' does not match a known URL") else paste(object@url, path, sep="") } # convenience wrappers for _initialized_ sessions ucscShow <- function(object, key, .form = list(), ...) httpShow(ucscURL(object, key), .form, ...) ucscPost <- function(object, key, .form = list(), ...) httpPost(ucscURL(object, key), .form, ..., cookie = ucscCookie(object)) ucscGet <- function(object, key, .form = list(), ...) httpGet(ucscURL(object, key), .form, ..., cookie = ucscCookie(object)) rtracklayer/R/utils.R0000644000126300012640000000360112227067656016161 0ustar00biocbuildphs_compbio### ========================================================================= ### Utilities ### ------------------------------------------------------------------------- pasteCollapse <- function(x, collapse = ",") { if (!is(x, "CharacterList")) stop("'x' must be a CharacterList") if (!isSingleString(collapse) || nchar(collapse) != 1L) stop("'collapse' must be a single string, with a single character") x <- as.list(x) .Call(CharacterList_pasteCollapse, x, collapse) } .asRangedData_warning_msg <- function(fname, if.FALSE="GRanges", if.TRUE="RangedData") { msg <- c(" Starting with BioC 2.13, calling %s() with 'asRangedData=TRUE' ", "is\n deprecated. If you wish %s() to return a %s object,", "\n then you can coerce the returned object with '", "as(..., \"%s\")'.\n", " However, we strongly recommend that you start migrating your ", "code to\n operate on %s objects instead of %s objects.\n", " Starting with BioC 2.14, support for %s objects will be ", "limited.\n Please ask on the bioc-devel mailing list if you ", "have questions\n or concerns about this ", "(http://bioconductor.org/help/mailing-list/)") fmt <- paste0(msg, collapse="") sprintf(fmt, fname, fname, if.TRUE, if.TRUE, if.FALSE, if.TRUE, if.TRUE) } normarg_asRangedData <- function(asRangedData, fname, if.FALSE="GRanges", if.TRUE="RangedData") { already_checked <- attr(asRangedData, "already_checked") if (identical(already_checked, TRUE)) return(asRangedData) if (!isTRUEorFALSE(asRangedData)) stop("'asRangedData' must be TRUE or FALSE") if (asRangedData) .Deprecated(msg=.asRangedData_warning_msg(fname, if.FALSE, if.TRUE)) attr(asRangedData, "already_checked") <- TRUE asRangedData } rtracklayer/R/web.R0000644000126300012640000000325112227067656015577 0ustar00biocbuildphs_compbiohtmlErrorHandler <- function(msg, code, domain, line, col, level, filename) { if (!length(level)) stop("Unknown HTML parse error") if (level > 2) stop("Failed to Parse HTML [", line, ":", col, "]: ", msg) } htmlParse <- function(str) suppressWarnings(htmlTreeParse(str, asText = TRUE, useInternalNodes = TRUE, error = htmlErrorHandler)) httpGet <- function(url, .form = list(), .parse = TRUE, ...) { if (length(.form) == 0) out <- getURL(url, useragent = "rtracklayer", ...) else out <- getForm(url, .params = .form, .opts = list(..., useragent = "rtracklayer")) if (.parse) htmlParse(out) else out } httpPost <- function(url, .form = list(), .parse = TRUE, ...) { form <- postForm(url, .params = .form, .opts = list(..., useragent = "rtracklayer")) if (.parse) htmlParse(form) else form } httpShow <- function(url, .form = list(), ...) browseURL(urlForm(url, .form, ...)) urlForm <- function(url, .form = list(), ...) { values <- urlEncode(as.character(c(.form, ...))) query <- paste(names(.form), values, sep = "=", collapse = "&") paste(url, query, sep = "?") } # differs from URLencode (vectorized, only encodes specified chars) urlEncode <- function(str, chars = "-a-zA-Z0-9$_.+!*'(),", keep = TRUE) { bad <- chars if (keep) bad <- gsub(paste("[", chars, "]", sep=""), "", str) bad <- unique(unlist(strsplit(bad, ""))) code <- paste("%", charToRaw(paste(bad, collapse="")), sep="") for (i in seq_along(bad)) str <- gsub(bad[i], code[i], str, fixed = TRUE) str } # differs from URLdecode (vectorized) urlDecode <- function(str) { curlUnescape(str) } rtracklayer/R/wig.R0000644000126300012640000002317612227067656015620 0ustar00biocbuildphs_compbio### ========================================================================= ### WIG (Wiggle) support (fixedStep and variableStep, legacy bedGraph) ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes ### setClass("WIGFile", contains = "RTLFile") WIGFile <- function(resource) { new("WIGFile", resource = resource) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export.wig", function(object, con, ...) standardGeneric("export.wig")) setMethod("export.wig", "ANY", function(object, con, ...) { export(object, con, "wig", ...) }) setMethod("export", c("ANY", "WIGFile"), function(object, con, ...) { cl <- class(object) track <- try(as(object, "RangedData"), silent = TRUE) if (class(track) == "try-error") { track <- try(as(object, "RangedDataList"), silent = TRUE) if (is(track, "try-error")) stop("cannot export object of class '", cl, "': ", track) } export(track, con, ...) }) .wigWriter <- function(chromData, con, dataFormat, append) { con <- connection(con, if (append) "a" else "w") on.exit(release(con)) cat(dataFormat, file = con) cat(" chrom=", as.character(space(chromData))[1], file = con, sep = "") data <- score(chromData) starts <- start(chromData) if (dataFormat == "variableStep") data <- cbind(starts, data) else { cat(" start=", starts[1], file = con, sep = "") step <- if (length(starts) == 1) 0 else starts[2] - starts[1] cat(" step=", step, file = con, sep = "") } cat(" span=", width(chromData)[1], file = con, sep = "") cat("\n", file = con, sep = "") write.table(data, con, sep = "\t", col.names = FALSE, row.names = FALSE, quote = FALSE) } setMethod("export", c("RangedData", "WIGFile"), function(object, con, format, dataFormat = c("auto", "variableStep", "fixedStep"), writer = .wigWriter, append = FALSE, ...) { if (!missing(format)) checkArgFormat(con, format) if (!is.numeric(score(object)) || any(is.na(score(object)))) stop("The score must be numeric, without any NA's") scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) dataFormat <- match.arg(dataFormat) doBlock <- function(chromData) { if (!nrow(chromData)) return() if (is.unsorted(start(chromData))) chromData <- chromData[order(start(chromData)),] starts <- start(chromData) ends <- end(chromData) if (!all(tail(starts, -1) - head(ends, -1) > 0)) stop("Features cannot overlap. ", "Note that WIG does not distinguish between strands - ", "try exporting two tracks, one for each strand.") spans <- ends - starts + 1 if (length(starts) == 1) steps <- 0 else steps <- diff(starts) fixedSpan <- all(spans[1] == spans) if (!fixedSpan) stop("The span must be uniform for Wiggle export. ", "Consider bedGraph or bigWig as alternatives.") fixedStep <- all(steps[1] == steps) if (dataFormat == "auto") { dataFormat <- "variableStep" if (fixedStep) dataFormat <- "fixedStep" } if (dataFormat != "variableStep" && !fixedStep) stop("Step not uniform: consider variableStep") ans <- writer(chromData, con, dataFormat, append) append <<- TRUE ans } dataFormat <- match.arg(dataFormat) lapply(object, doBlock) invisible(con) }) setMethod("export", c("UCSCData", "WIGFile"), function(object, con, format, trackLine = TRUE, ...) { if (!missing(format)) checkArgFormat(con, format) if (trackLine) { export.ucsc(object, con, ...) } else { callNextMethod() } invisible(con) }) setMethod("export", c("RangedDataList", "WIGFile"), .export_RangedDataList_RTLFile) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.wig", function(con, ...) standardGeneric("import.wig")) setMethod("import.wig", "ANY", function(con, ...) { import(con, "wig", ...) }) setMethod("import", "WIGFile", function(con, format, text, genome = NA, asRangedData = FALSE, trackLine = TRUE, which = NULL, seqinfo = NULL, ...) { if (!missing(format)) checkArgFormat(con, format) asRangedData <- normarg_asRangedData(asRangedData, "import") file <- con con <- connection(con, "r") ## check for a track line line <- scanTrackLine(con) if (!is.null(line) && trackLine) { pushBack(line, con) return(import.ucsc(initialize(file, resource = con), drop = TRUE, trackLine = FALSE, genome = genome, asRangedData = asRangedData, which = which, seqinfo = seqinfo, ...)) } lines <- readLines(con, warn = FALSE) formatInds <- grep("chrom=", lines, fixed=TRUE) formatLines <- lines[formatInds] starts <- formatInds + 1L ends <- c(tail(formatInds, -1) - 1L, length(lines)) format <- gsub("^([^ ]*) .*", "\\1", formatLines) parsedFormat <- lapply(formatLines, ucscParsePairs) chrom <- sapply(parsedFormat, `[[`, "chrom") if (is.null(seqinfo) && !is.null(genome) && !is.na(genome)) seqinfo <- seqinfoForGenome(genome) if (!is.null(seqinfo)) seqlevels <- seqlevels(seqinfo) else seqlevels <- unique(chrom) if (length(formatLines)) { parseData <- function(i) { ## parse format line formatVals <- parsedFormat[[i]] # parse the data values block_lines <- window(lines, starts[i], ends[i]) if (!length(block_lines)) { if (asRangedData) { rl <- RangesList(IRanges()) names(rl) <- formatVals[["chrom"]] return(RangedData(rl, score = numeric())) } else { gr <- GRanges(score = numeric()) seqlevels(gr) <- seqlevels return(gr) } } block_lines <- grep("^#", block_lines, invert = TRUE, value = TRUE) if (format[i] == "variableStep") { ## assume the same white space for every row sep <- sub(".*?([[:space:]]+).*", "\\1", block_lines[1]) split_lines <- strsplit(block_lines, sep, fixed=TRUE) mat <- matrix(as.numeric(unlist(split_lines)), nrow = 2) start <- mat[1,] score <- mat[2,] } else { start <- seq(as.integer(formatVals["start"]), by = as.integer(formatVals["step"]), length.out = length(block_lines)) score <- as.numeric(block_lines) } span <- formatVals["span"] if (is.na(span)) span <- 1 end <- start + as.integer(span) - 1 gd <- GenomicData(IRanges(start, end), score = score, chrom = formatVals[["chrom"]], asRangedData = asRangedData, which = which) seqlevels(gd) <- seqlevels gd } parseInds <- seq_along(formatInds) if (!is.null(which)) { message("For efficiency, consider converting this WIG file", " to a BigWig file;\nsee ?wigToBigWig") which <- as(which, "RangesList") parseInds <- parseInds[chrom %in% names(which)] } resultList <- lapply(parseInds, parseData) if (asRangedData) { rl <- do.call(c, lapply(resultList, ranges)) gd <- RangedData(unlist(rl, use.names=FALSE), score = unlist(lapply(resultList, score)), space = factor(names(rl)[togroup(rl)], seqlevels)) universe(gd) <- if (is.na(genome)) NULL else genome } else gd <- do.call(c, resultList) if (!is.null(seqinfo)) seqinfo(gd) <- seqinfo else if (!is.null(genome)) genome(gd) <- genome gd } else { import(text = lines, format = "bedGraph", genome = genome, asRangedData = asRangedData, which = which, seqinfo = seqinfo) } }) rtracklayer/TODO0000644000126300012640000000045312227067671015164 0ustar00biocbuildphs_compbio- List subtracks for a supertrack in the UCSC browser - Up-front column selection - Chunked importing (pass a chunk size and callback to import) - Attach to existing saved sessions - Represent formats with formal class in I/O framework, rather than ".format" - Port to track reading and writing to Crtracklayer/build/0000755000126300012640000000000012227135242015557 5ustar00biocbuildphs_compbiortracklayer/build/vignette.rds0000644000126300012640000000030312227135242020112 0ustar00biocbuildphs_compbio‹‹àb```b`b&f “YH°±32°0piþ¢’¢ÄäìœÄÊÔ"½ ¼r4in$i|: RÒФyQ :D, Q,LHŠYósS‹ÑL`wI-HÍK ÿîŸñ?šïÔÊòü"˜5lP5,n™9©0{C2Kàæ7(“1Ý 棸Ÿ³(¿\æ^P°7‰ÿ@€îÑäœÄbtr¥$–$ê¥õƒÜ !1H¸rtracklayer/configure.ac0000644000126300012640000000173412227067671016765 0ustar00biocbuildphs_compbioAC_PREREQ([2.65]) AC_INIT("rtracklayer") ### NOTE: ideally, we would generate a config.h here and use the ### results of these checks. Way too lazy to attempt anything, but at ### least the configure output can help diagnose build issues. ## Checks for libraries AC_CHECK_LIB([z], [gzeof],,[AC_MSG_ERROR([need libz with gzeof])]) ## Checks for headers AC_CHECK_HEADERS([zlib.h arpa/inet.h fcntl.h netdb.h netinet/in.h stdlib.h string.h strings.h sys/file.h sys/socket.h sys/time.h termios.h unistd.h]) # Checks for typedefs, structures, and compiler characteristics. AC_HEADER_STDBOOL AC_C_INLINE AC_TYPE_OFF_T AC_TYPE_PID_T AC_TYPE_SIZE_T AC_TYPE_SSIZE_T AC_TYPE_UID_T # Checks for library functions. AC_FUNC_FORK AC_FUNC_MALLOC AC_FUNC_MKTIME AC_FUNC_REALLOC AC_FUNC_STRTOD AC_CHECK_FUNCS([bzero dup2 getcwd gethostbyname gettimeofday memmove memset mkdir regcomp select socket sqrt strcasecmp strchr strcspn strdup strerror strrchr strspn strstr uname]) AC_OUTPUT(src/Makevars) rtracklayer/data/0000755000126300012640000000000012227067664015405 5ustar00biocbuildphs_compbiortracklayer/data/cpneTrack.rda0000644000126300012640000223662412227067664020026 0ustar00biocbuildphs_compbioý7zXZi"Þ6!ÏXÌâªïþ])TW"änRÊŸãXg€ÆqÅjnçj-' “ø$ ûÑöv}Öq5ìç)²( Jpá³Ü—Ã**6¶4CïůDzG‘ÃÞéÐÐ2ó¼pLþî!/èLZZkg]”ˆ/ÕX¾Sç{]†Õ#"bøÊ![$µÎŠÆnõ åc*»dù¬P"^çíêD± ¨lTV3ï|ð¢R&€&,ŠD¥¥uà2 pœë¬¼ &+‡Z2ˆwuÎEº |^4gøü\q¹IŒ§Yà8Pn~š‘o1kiš§k”Kçæ£;ÑThiÖw„é¢Iû2½©©5µSÓ9ž'a’i) G/0}ˆ,XJxÛóô~‰*ü0Hf5šálÝg²/ÚÇášn‰%¡Äð“á3©yŸÅí¸< 6¤t/oRˆùÏ­Q‚ÒƒNŽúæ‰BÒþˆx¸¥e:º ø½ß@$G„XÕ8†%lY$g×–¢3ê•üîR¶ÿäÚÄôÒŒ-eÿ©RùÖÂØµuûÎeáËsë« QÓ–ZÄiÊS–D ‰ëO€Ë!Á&r’Kë‘õõ¹¢ø%éèÈ…ê  –‡,„Rž[Z“š›dGç¼ÉSG±ü(¹™ŒÒ l×S ÒödïPb v²´aÚ %^R“&äÐSÊ×T ¢ìF¡AÁñC z ‘ŽiÖÒ£‚.8/“&yÞã¨v¢¾•~QÈæìN¢¢ŒDspi'‡…U¢Ó|Q@,’£‚’=»r ×ÚôÒˆúe^Sxmÿ³ÊkÖÀûæ2(2ÀùŒüïülG «,Æcм¤Ãgá |£YÄïÓMènö,ô°=å@r!Uípš¾)q ½˜ã!œo¿wæöN¤ÖZwŠ=I©¯ÕRæy§`Rz¢·B¬µ¸‘|Ô 87î£X=úhÄ!W²¨žsÑŽ»b.œ0y!É«$æÍlPi‡ü} ]ÓÚõ¥ª™#¾´ë—Óa¹iX½3:+Kp äqäÙãx¢@ê#ì1Öºº +» kâLŸ‚n€$í/Éfl°î„ɧˆïÈ]âŠ|„>6¬zÂ{A`$ô嘓 (dÊ{ĨÆè[ß³ÓÕC"úëêDÄZbÑÒ™O´Åš^í¿– T ÷ñ Oá0-÷ÊgÓ=”$À[NA¶âMSz´z>Æ=®‘ÜŒ#âºC&œo•\ŠÜdTs)?œ¦`‰£pQiÄ ²ÚáªVÐ+A‘Xñ@©D­o©K¬Ý£7]ðy™wéš “<*=à±î @ÛšNee4äGÑÃ~눥ýÖK=ëB{p1…³ŸAöö˜­'J£0Ïï\BAO÷>È\Îÿ |—å_uÛŽ‡Ë5.TMi¢¹tæ@³uyžxLâëL¾A2Œ7vpùžÂÑ¿ÖiWö‘£™r ýð'ÈЪX8àZÿ”ØÁE.z‡Î` A1ŒBòüå²?íñÕÉpÔ÷9¤çHçCE·•Õº³^m‰–ã(Æ/ªBtD×wøï´9Û[¸ùÏñÆ£ö&߆€&îËÊê?¬)à0´²&þ‰ZC•VÆJ‘fX3”|‚L}|VFUrÊ£@ºÿŸ.“ô#€úŠÿ¾Ò›)7‹Í½Ó_Ž_VÈ~^8iTnÕ¶ÙoÃöªÀª°š‘ó§Æ™U?Ó.Ò˜¦ît¸¢á21H‡L ñ†Fý‡ÏÏ=À:´ U²¹›mc7AÁ XOÄ‚ù®Þ©Bš)íR¦6Ӕਭì/ŸÙlœK®´˜•“’LZˆ‹—£H´ã,Lž"ðtICmýGŒKG‚äémª9+§ÿ0€¯³&F"º ÏÓ ±èEGt¡©øjq‘ˆ–ÚÁ:>ÊRl|è7Ÿ€”¤ ÝuÁ Nl;$ygf IÚæJäf±–ÌX¸ñ” B(gÄymè;!̨ó5ã@&Í…ïg£µ—®›ýÌ”Æ6vI˜.ªÛ—¡E(–Îö‚Ú} úá³¶™š—ØýdÅrÍìqÛ?ŒFÎ%sÙÆì7©ï+œ÷KùdåðuÕ ÝíC§ Qki2Ňx€lÝ·»Ð´ÜJ50¨%â ¶ë2ÂL¢w*=årRZ±¸ZzZ›­{j_ÞŠáý W×÷3.åë/å^4–†n§ðÔ’açe H:¢Z1„*Û)Èj׊Ý)‚düÒ…¶W@Ì>¤åÄÈèBw#Aî?îma`#xC&…—d<–jh#ê&yÂÞ ?–]›<97øGÞ Ø$“ýyõ^è£=À¦û‰Þ)\¦“ ú^‹°„ƒ6?.º‹µHô-T½~ÒDhxÃêºÝ_nØšft˜Aþn—™š1áºÇ— ÚuªædN>½Íj¼ˆ›ŠFøè³AýH.æy²‰¿Üdp˜ªçì|<‰yE"»g\C%•íæ#Yê:ãˆV*%rb þr1 ÞÆ¶VèEbEl3@·öMŸtéؼoi,—°Å°s ¿ß´Ó*L‡4ÄãLÁ)r´+tBrPs6¢¡nê›Þ0i±JŸÐòé#e³h§Š ²¼šÑêrBk¡J ÙJ÷uÖベ—Šöì!½¸ãƒ¡¡yóLH#mBÍý;@½ýÙ©Q–YÍô‚Jì1ó‰žÞd3'Ä¥ÓpF½ p%£D…µá«×Oëå¬M0‘~ïLG…q":Ë9ÿâ©Î¥ /úýÇí¿ª ·($Rž7¼Pí¨¹éü/\ò/àÚ«n`»³ÎÅ¥Ãe_c%'y›`è^S÷®†KtDóo áó ÊјL´'ž?Ð D‹Ã&!cŸÚÁ!¢ÐÉðë&ûªS^íü›`–ü¥4t-Ç_ê^,”aáCkÀY÷"” À äxØs7°1¸Cz)ëÙ–ëY0Úè69zj.9±œF&çt‡¶Ã:ÎR± ;µ‚7HÎì6ñS'Kª-|¾£õx&äõ¿cLfì6—7[É®E>Ã2:Ôx… :þ+n (õ“H°:’!¾•FO~S‘ÙS‚LÓÀë¬ãN`Aïü‘ÞÖÛ+÷f i&4…øýŠì‘r0@xXßôúf)Ñ 8Ã`æ3hÊKvÂ1 ʽq}%!‘{r£Û ‰ÔHù]náÎ8µ<üöL𠪇%qÜÏ XäÆû0^Tu}æ­˜YuuC¹¸þL±Æâgi›@– „ª¼M^Õ^F}˜sWõØŒO• Ó}¨Îô!û…e1e»•(ÛÈÁÕ(Pœ)@*çÐhøè/= &3Yß1T“¼u@è¿É»YæÞR‡Ì5…“ÀÚc¾€vw¯¯yæ’Ø‰;T÷û¸´TÈk Óå¿¢ãbB4HåΉ×ત}Ù&÷•û—“9èãÒ{/Gžû®9Ò(Ç¥^LIþðqݶïežÄróQ-òÒF36lC¡£˜Où/»}[MÃì“øƒ’8t"œË½o•ÿeŒ÷žpfyð¼žC‰ÂËÏ4,l"ìë¨Þ ÿ’b¦}ð{?ë–>‚¢êsI°Ött[á¯lù|è[¼Ëã¾`ßíë¾gš-Jlão“8„¨ÿ2Gvü/C4Ã`Çý‡·ò‰Zj‚Ô¿ì=;wŠÂ ÿúó£š1óþ{ލvM“ÏÿÛ$_?¾u´œ÷Ápèþgôïûš¼û!nƒ÷ÞÔóää]Ê€IÅà²&!`ÏíbØÍŸH8Ùðh I}#çíïT•·PT‚Ú.Ä—Mð¡Ö’=ÉX¦fŽ¨Ý‘x£ÎË„¸çó(ötà0W+ÝŸ«³ŠlñÞ¥óRÑvM+W+®4¦ ~¹$m“ðÑ~ÚÙñé I{9tNkþôʰCï5ò£€âžlW¢n–ÝQûFÍý¯oÁ—âùð‰Ü‰;³BÙ;õoÓåH9fýÖª?Ä Ôæ—(^µl ƒw¬t£Ü]@ÞL59.nm!²´Z°]ÏÓZÂæÞ?âûÇ/¶Çraãáö„F†áµ¦A¯“ÏÓz¨Š¡–`%#†´œ$¨Å®>·±:ò š!/ë§\¹$õÜÖñ‘Ç8¸l;GºÐ°ø 2;r8Ê%¥ÈúÐfQ.?}·JR¹©¥Ô]⹈•©ÀPÌÇPÔíîÈuôMBdá41šî¥ñ0Xp*º5•hÔ|¦™<ß@÷ÛSèß‹$ƒROÀŽ’Ír©¿JÇÉ®+Í$zõ¹QòÑ0)ƒYÃO7±“<ÅU&_ŒÎùzJ#ª k«”ca7¹Ý Ƹ×s9UûÔv‹.Œ!¿âÑ—ç>ÃQhEÓi[îÀ}ÆV`O¡7¼}Eú=Ú¦Ùñ§£E;"'·ë«ô–-§²ÆdXÄÓ×)+>DÍp£V7ê }Ùë÷¶.>Ù9-X uÕ—ã\ËaùÍ|LÆT{/¡äZÓ‚·¦EòÜÎB£h=ûThòÉfÒP&©\%ýC{eË*Ÿä©üç¦.ßÌ©fG®ÀŠýíBLwoE%Ò¾ö"HZ¹»ÝÞ­·•w 5­hÔíg×ÕœK±öSŠŒF•OÄÍt2üSt‡X©ƒ~”a¹êKÄt7È/,òd¼vÉß!žØ¬6¤–l®¿AJä℈:h:X'zEñGs²Ö¯ˆ¥Æ&E碜鸓z€¹Û‚.Uwmw•yˆCûÖ¦z|—±p~6pGÍÀ¯ÆªX¿#2  eú2ã:•rYŠL^oÚ¤‘LïÖ3ÓÝo‘GÓÞ÷ðÏêC&N’bÆ,„Ý]Ý}&˲À´ì‚‹[¹gä›°M Ýk1΢ÏËÜ×45$F«¤k^‘ÌhZÿ«/X³š¢Ež‘#u@Þ|ô1pi³3]bRT°ê&É;Þ! Õ#‚‹y§˜aÚ|ÐûžÖˆœŒýϳrp«­52ÇlxúfoðSl).螘H%‹ê¡|ü±^{ÔW{zbNðtm6FÄ0“ò ‹ªLæcU½áD–U‹¯nÞߢ¾ßž¦~`ê·‹¦ÇÝ/ƒò4Ìùƒee¥µ¾Tʆg¨äXÝý½÷ƒ’9ëÙh&NTgåzý¿»™c3¼A?IËåÜÿ³¾÷/eÚâWGc¼ˆ>)Öt²ŠOÐ>×l×\¢Á@¶Àp§2r¿5W ¬2ˆÑ¡š!ohúë³F¡ÖÏ¥Ø0+Ï´JL#k:.¯;GJ¢[ΪS ÕuÛkU·ž@ÈËûm“J_IXK7b…×Òù×ΞD§Ž‚Ê–Ü&±;u·í¾mwqTÝ]ºK¨T ¾¢pË'$Þ0Ú¦ËQCùjâ#;ÚOãýD(Ž“çÓ§M¯žpF8Î*r± 4©¢®t5’%ö‡Š…âÒ³0áhó4C÷•Nœü×Mþü÷;mø{&aðh7ùJÊG_kÇYà2~¼¤/¼èÀr^#”Û îY)<¼óæP ³rT3*ŠÐqbîÞlM¥.¤$ô·äwÞÔêk6ÆpC¬ÃÌ«æzÙ”‘JYÕÎ8·Ð êݧ7Óï„WÛà`}Sr¡K¡Îã ™÷…‰ å?«ÇDDýVŽ3æà†ãÁƒ¦KL}øªOs¾Â¯ö‹Éôˆw*†÷ŸÐtÄÿ¯>”]Ø$ –9»3SEÄKlòC±¨ˆPþª«ÔþæÏ]ö›a„Kfåâ…ÚTXÇl}J7;²‹ÒsüN^<•h<“Ù´>:çã„Èü™*× Õ b-õ±$ÖjàC>^ŒXát##(ôÙà9Š)ÞPDgúGÿÐXÆ$ís¥g±y†±Þ­`“‘óž58üÕ ° 6Ѱ}¤Ót ¡L,ûG°Ã.碮ò|,t¶-˜±œDÅêÏL\g»`ŠRØ¡ÊüS‰æ\Õû(†&úBhô…?g¥ê ×Ù÷ÓH6Ëe:™¸.(1àyß2ÚãÁ}ßK­µëPʆæ tjoE°Ý›#n™Ìûkýþ2ŸË ·ÆÁxþ–¼ôø­Xj-Kn†¼eªP«ê# Ý›þ#ñå¯ÂÀ0ÄF?ó™NU"Ýõ“sCCê°H!ܫɜ+çmi(®§IíEi®©ê\ ;)ÛˆOJÛ/þh–Ô)ïâÂËæ®«\ÌøA|ù² ¦(ú1ÑÝq{ƒ/H2`WñÝÜ©{Ç0µ˜´K\TÊç§Àúé Ÿà=Y¢¥3ß´zUÜ¿;»Ñõöà˜ž^ÌÅ…Fâ/lÔè¤-P_/15Ñ{/;¶üo£ÍQ­Ê¹ZŠaa¯ÀÍna–`M~}Ðë4ÃŽ—z:³ \¡k9ž¥ýgyW•å%Ízéï u5ùÎyÜûrXÔÜÆ %OŸû/:SqîÌ‘^üëGÐì·ù\§Mqâ [Ɇ•E+Ý%f)PÞós:Ù5F<[ºë æ>†ÁÕ¸Kã&¸KMw×m4Üm÷“+1öZpH ŸÎãÕ„ùu{ÂÂLf×EVg½€\*ZH^k¨ò˜A&Îqc¬nàk.k!ü+b0nÉY±N¹Mò"AÆäVµ²;aè{p…©°PFh¸¨Ê› ¶áµék~þs:Zšh¾yë„Õ,`Rï ~-)¬böÔÄ50\1…']ßkJÕe#•wj,ôT^=yV%³p¤êäRí´[EL•äºË¤à(éac‹¿ìÏ àvÊž+OS B=HYÆ|•}Ö‡"îÀm~\HÖöFNc©QN.ÈN¬YZvpüƒPY'H4 ŒØ]b¶b}S¹”¤½`±ÇÆÌ=¢vùôŠ­Ëåûý—Õ-"£5UÞÚ‡¼u}éœOa²ÙmÊN”%¤]ÇXC…h¤È_A³•$CÙÒº “{Èú¾àD¤fHˆ¸ÇòYƒ*ñ‡ŠžµØ&€B“Vù‡èë2æ$¥k§Î›Hšñ¼ÎÁÉKÃêg‚Êú±uh†²&;›§rò!f§W‹Æ‚ÂA\Tv%ºH:@á±u]üj¾÷q’0S›xê]z©× Îðé—¯.ºOé¡*2‘&WË$`U&kÙÔvë~]óþ õ!(ƒ¡£6[=³ÚÌ9׿"þ‡ªÑ yWv6ûv”^µ)™@GˆY„Ž«$Nô5¶bÊj»ªðUØF±?/Чk»nfÌ{0ß–‘;t}`É)†Hݼ¤ŒŒ µÀN ãw{/_!EÍ”õ4µåïýìò°îþñ.Y 7\2ü )‡¶¾ìšàkr8$âÉØœv½Eð›‡D÷Xª7©”ó,sßQéûضãϼT›ç*sìNH GîçñfãsíúÑdX>Ñä}‰o(8ˆ¬‘6.¬'Û­¥q6&ñšW&EÙªŠ§ØÚ‹h}öc TÚÇ,…­´j4ŸŠ1Á:«Ë[íß­<ŒöÐåŸ ù숓q‡‰§£ †€¥lV6~ä< ïdÐjÇ @ÕhëX£ò}\õSrZ/€?îå'Ño†Î•iáBŸ ”äÛÍÔåOE-Åû$e›Î«»`PÆ·ßÜ‹ðÓg:WEäÚfrp{øÚpÜ„…ý9Á±º¼ôA 6C+%yoOžÃ::üÕL€®¨hî+ZA8Ü)Æs¯ ,§†²Ÿ‰æ÷;ú]báçý›>¯9òjŸ~ûÆJ¡ª4J”‹2„ED¼¨º³O|ÿ¬Nø¿Ì¶Ø6½²6¡JxAë¤?ôô'þ¾?÷]ãdÖ$[?!¹:f,?W>Ž1S[~<(KNKØÁkËï<«†„õó݈õØ Çù*³=žúfªo°±ÒƒáÙ/2‚ŒôsÐ ƒ*a”gÈĬ֮ ß@ŒJl«açŸ%Ç–{kž4sïªÀN¸´üýŸæ¿{»Öòž1h–ï­%ÛÖ|&Ké¼sËÔêø¿ŽçÖG§Â±µ[ª©ÄÐH€­ZÁ|!içÑyÁkùP×U…·2¿èЫ. ºL©}…Åë²yº;+ahš÷Ѷ¡SU‚¦\æuÛÈ‚yf×¾3”ÒWyŸ”EÓ;¥[™¬,8jË”öö )Ǥɂ€à©ˆ ´–£}Í›*× ˜å7˜nf '{?Û.!úØ ÑÒ Æ1™YÚŽHÏ+äÛbÕÄÏòJY¦LÒlÒhœwRSGž¢E°SMQæ\ùG·¶Ánãc}Tµó«DfCàsTÎy‰óYÍsD ÛV`b/^Ùòr —ÒÄíbÜ«_¯ÌCÈ×}ÑÁØ‚Ñq$í×X’OR”©T#y€_¬Jð·@Á8óßüËoçË„úmžÅ·ãΧdé¼3ñôéyò×D¹í2‰S×àF¬¦n™þ˜÷z›èI 6—5´0 (þý9¾½Zµ}î|6£¼ô¾OØHÍ_ÛO™ŒyØxžWai|y¦ÃÞÍZbœý´~Èκ‰ ç42åÙo³¶ÅÜîHŒX E 2¼Ø,l@ˆœôÀŒ¼ƒtÀ÷^ðÂóâ@ÃNz;Gí…š°‘óÍ²ÈøŒ×j‡`Iðõ8HôPÿ«Ñ=*îÉßÎ:çõ!‚…EÒʵ›!*†?Kùe#Rg¾æ,ï03æË$i+«\Cÿ¡#lO›ËLHÖãAve±w‹ÕzZ#$çx¬é ³Á=—ž Ûƒa=ÄÊDHÐÅ*鯷$œÍbÝÆly*©a_´±‘2ä™âŸYNUM†œwdj¿ûñjœº“"›ñ,l/T<Õ.äÿ-dä“BCèÝZ5Åå®aôÖÞŠ"ì6¤Fi õxHˆ(ô«5¥#(ó,Q<ö©Ë]NsЇ¤3Èø«î­ÅŸ*ð<›šªÊþ²[ÒÂ: þ<â¹>«Þ¾…tGeZÔJäiÃã%O#³* /e¿Y‘>ƒNŠaE!mjŒî¯.aõê˜8S_m)"3 ²(ëZ꽃€Lþ0ºãŒ™è¬œ´Ë3XL¨Û|ÿ |r]ïNYõ¡.*YaJÒFëÓI‚!Œ‰hÿ=8!Òúâü›9: 3û1’‰Ø–gÂx«ß*Œ»>4Þ•mp mÁ×Ësß#˜†›ì<§šÍúVÕK‘Õc>hÏCqæ#}¡öY^‡9‚°ò@O|`6Æõ v—È=—æ?d½)Àí ¸>9S sÚÛËü MíM¿¡oþ‰ö‘R)x˜‹è~•ǦjÑz4\Ô¯f@Šm— ^xŠ$¥:&8×fÂ,žÿÆJ„´‚öl¬z¹°¼|ÁV ÇøURlëÓîëö…s9(ÉAç3Š ;Æ!pøÁw¿î-ÄM{Ɖ NÝõ13à“ºíC‘r½ê6øJ|݇*4”"9ƒí43¬ÝšÒŸId!fã´¢#–½óÒö ¹ºcGTDé0õ[¡æuCs:}O&”mÃÀ¼c«½Œ9 OI¶+þ¥Mô…Û”1HÞBa ‹ _‚>¯1h…¯¥a"ê #z7Ã,XÒu@P4Ðpc@Ét3—r¬ú߯Ï÷±a«¯>Î ®ótžo—MqI[± Û|7ÊEŸþhò+ƒ¹Ê–(ýp‘Ä f$×è>±M½^ªæë¶¨Øáêž_3’›¤Y‚Œ=8¥_…8wƒ*Ì„Õý…Q¾Zû3ªõ·kÝJQ•ˆÎvòC!ª"å(o :&oÙq{N_¤Ï D<Ó©òSèT…§¬ƒé _ôY|­Hðí4È—>[ŒX=ð]˺a9ä:,`(€q˜Õx7nNø5àb¦"¦ÌdŒ “*žOØ/ÍïÏûŒhÚqáfêO$Ý»°5¬Õ£ÛkÖ„fÛ;r'x‡´»åéEüýt;N>Ðn¾§wƒqßëžÍ/å» gR_6wJ«Ú¢¼À.Š\ÛYê è\¿câ3ãD¯@oKùÏ 2kJ¯ n<QóRßQNÞ3Ÿà#JšÅêßœ°kÑòP™ H®ê—ùÐ ï›I¦Ï¡NØ},›á½×$ÑRx¡æ_^ÝDRu6ö­já/Þ\…T‚ɰM·8:üÕ|l ÌÃ<Þ%{æ‘Ê¢¬ßþöb$P˜ò_}s‹BC}®5KD²§‡J€߃^¢7Í”*õˆÓBxçã|¼p„<–°Ë2ÙЋ$‘êhhfØÆL¹\`bJ©Ì3…ŸîÙ5Ä íÈŽÚˆ5«3Ä»·ä†ÚÒŒ á8 üy:7!õuf\Es©EsúÁöÈHÉ(¼%5ñDþ€r  ùña̼‚#ïMRý-?½˜Áß&þ½´®4G£E.(ç´›ºÍ#L5w‡qFn/(PÜ5˹…ùé¤u#l3YVhÖo¼Ö§×Æùcpr·1îD½d]ˆfšŸ úEde>ªMSw*Mp?*¢Îb~îÈ øóQž›Û‰©×—hyZšn× ‹Á¬$= ˆl8® zÍù…$lw[·zUÕ‡ Š XXCmâ?Óèg¯P[p¯â7ìûã¸1NxRò4ºiÊã¦ýØÉ¡fMÑ‘Š˜ÏnÄQÉeù|Ž> ¢ßi-4RË\yßä… ­ñZcvëºÄ­?÷ óËSÄ.øp¹ c,®ùg`øÔÆj¹O#Ö…vx¿tÑ‚‹mQ•¼vàÑΗ֘ׯÞè7§äËÊïz{-ØÒ.ös 58ZÁÝ÷Í/‰¡ôÍ|@ŸÒ[ø¬´ÌSE‘&võQU/Ä\¯1ð{zÂÕ­Fg>JÒ,—á(h©;íÝ^åYèzX¯ð¸"‚ѲBÛ¨q ÛËÝ)iix|m×µ±[¯æÙ”1 y3ÛØÿ-ðo!ÑMí…˜kôLz ó‹~Po¿;çZCú,mR‰äÅ |PµO6˜¯1ô—l RÁf¾e'2ç-ÀÑ2 ötÌăEw¶ ï•F¡¯Mž¾E–]Êq¹\BD÷òÒMj<^KcзȎ¬[µ©!#P×9áçJx¶Û#Ä‚tª)šDGÄØìUÊÖC·¾Çá!aÙ«¥37l>ßm3ï!ÙaŒ÷³u!ˆvC ‹‹É瓆ô¢Ñ³³2^möˆŠçvBýn¢ÌòÃoŒ,®E(žgîÏuç}ÛOI:fán°ü¿‘zQ£‡ÙåpÂäq”ºBÇXŒz3¹¹7pŸ‰'ð\%90L̵QwL(¾¶£–ì™ Ðµ‘EåHÞœøÁÖ´µ,eé$m P‰0Ë”@ˆ¤J)(vÊ*…:@‘´úÒy¬«ûËš~#zHI$áÛ|ÿ֚ϸǎ«~ç¶`œ v B¹G‡|§:d¿v< ~æÒ2kpŒÞ3[|5”§ŸÃÍ î3«ìhÉ®{ÃPðÁ´>ä ¦Ú¾^õxœ%/Mmµà‚î=ù8ÔÎsYHþŸ´ ¢nªZ|®—ƒË³åH«|2qv£`ER^Ѝ óÊ¡¶3a¸ [dÅ.Wf+ìpÎz<û•ì#¦äl¬i—t‚¸•3¸-Ê;.K)ïÕžxL¦Š‚xYiõÓ‰ÕæîÁCbñúAÏ'ë$ã?I>Ú$€Bzæÿ§Ó üêrE«î}m÷È[{!Gþš‚P÷´õ ÷Z;X)ó!“û‚kܧxG©£çV'¦¯PÔ£×8ï~ó²qÒ‡«Ü5tF_‡‘ö1Ò«¦èü‡Ð²¢ÜÆÏp^Óf°dýŸ£É¨‹¤WÇÆ0‰Æ\:›š‡§ÁÑ)ìfÔ0¦JM[óåÔƒÿ¥‚ ÜYsù…÷Å:‚}O’®–(0´BÒ¤ÐHb‚Wûø­ÝO©k¦§9’ºš2sÓ掓9.Ôâ<†|˜Ó`qû³×!“Å`‰Z\|¬;ºŒ†<¶¬dW÷¯ÜZ?¬Ö‚Úgþ›lQíÄ4{ x-¼&¾,­†»”ÚÓmtSìùŠ'Š÷:öË7*Ó¾3ËKRÞ/¨!ž”æøïhâö’=ûrÖ£$D›² ÿÂd@4¤r7é.’-&À#?ͬ¸®|û6=²§h®¦¤Ù<¯8ôÌQ7¤Zñ±và^“ï*ÓIÁoÐB®×§™¾7ýžøˆ!k[PoŠUB$)Çþ·ÜP[QÓ9y<ƒæÅ1^ðé>yá× 5Ìâ8úSɵé ïÇò¼ip¨…Eª@ð÷¼Zá*ºÅÀãgÁ_§&³/Cè9\±ñgAbĉçÞuO«; ÌdäW;› áÝÛ:K²þIðƒ#“Œ|5šéº»“1}î—€^s 8áDÂyw¢«¬!¶¢ˆ¼á.ùŠœO'Â}ìsºj)t-7âáʰÈ$¯L704¤[¿ô>ϥíAJÀ,dûÙwQZ¸IeDÜ.3Â'ª59¯¬O$ .1EÃωÛË)xÅêßjÚý»)dѺ.¹„(|Äè°ÙðÝ^jæv¶»Ê‘ fðiÐfuêÂStbVq%Ãi(c/R'j®:'ÿΫ'ú@ Œ@§Ð?Ž|I˜x/4€l ˼6äcjîJ¡/9léVm8 †]Äp¼ºôA´`2åð²!#bê7k¦i¥»>]¦õb§úDtÛ¢àGóK1— ºZÔ'l¡¯ˆÌs˜8(´ÑD—3…‹(¼GçRHÞ”¤€pü4HªUÑ pL ^Ьô×oŸZ ýˆ$1ƒpõ’cÖVEJ¬Ž„cv^ÐÏõ›W.á·D‰šJB }â…]\+Õ„SÉó>è¸2I8¼´›UM˜‹XQìè4bnÛgC¨K%@³ÝA‘’D°»-ØçùfCL7Þ5eãiú^kôŒõ¸†m•vC°DÂ:GØAè;k‰QdøÝh@æb1”«æ²Šgýœ÷¼”pƒpåyÎ)ޱ`DšfðX£YÛÕ±ðMŽšp^b~1ò¯§îºýByÞg/I»Yì…%}á©}×1ïÀ7”¥S©D‡˜ÒqI$ÓA:ªuƒI­òRpQ;®\DßR`kú,ŽÅ„~°ÝÒ‹‚ újíñìÉæ¿´cl–æ€ÿ© Ù@m'V‡Uå`OŒ¡-DÞÙÇlö!ŽõèÉywèHßdî_†Ü. |¨ž=Sy¶<‰Àe±²Ëì{Ç­+ËŸ.›Šš÷ÍÜ#Oú”é híãéf&¸«…3ÚµÂ3&ѯdAÜÐômo9Ãúóá)>Dý>~Å}F+Žl¼[™¨PϺØàetåB—ÓZ¦Ø(!îã«ÝªLNa)9¡ÐÁ…›KÝÙ7E ¯õ°Q€A.£bƒâg²r.Ô RÝÚþ*•¶÷úÛâ©â2V/@žþ62ÓºäT @Ï·âÚÊ&ÙžýÈÇHJýcÞœ{Äy©^~ö`ÎϽ5x»¹­Ø5ŒLéúZüÛ„F€÷á°¸$Øm)̧¨6™¦œ~­ß¼:F&@ÜŒò’a§ùé‚u€ƒQf“Ã"»ì y*ìe)æKÙ—;ÛéBòQ¿*§kGx?Àòß$…8»*>†•H:ËB`›»ìc«t²sOwpÕ#çÀeßd¹QŠÏ4p¨ÝĖ–†¨´0†J·Yë—!š=oo2åe. C>{} æåÓàï…_Dfnêÿ9%k#иOFà=®H[‚PŠ LÕ‚äP±÷øò\[®FmmY×£ÄéF±nö¯ë€7Ë·hBhq€·w­ÀÞPëjTÅwß4hgúªŒ‚têÁ”½bžP…Ãu ªXðÕš’&­V»ö@!|ûLË'!¿wÞ\Z[‰gŒ{b!äœ\÷ào¦ÝÙ‡Z\O¬U}/= Åi‚ŠMÔ™¡ï}𭹓A󖵫0I* l‘㑃`©—‡4 óP<ç¯çÇ‹{XÞ‚VÝ)±…f–Mça¹6혱bctâÓ-P|)Ä|1ãæ„ƒþ¤\L:sè/f§4!RçdéjBVÅß7gƒE‘õ¥"+U^뻢㈙3û·hÝõW¾[Ò‚ €ï¦óru¹žNCn«èŸ‘hkÔ"AðBÖYQôùìÕ£¨Óªí†¸ Ãeû±Öòè Ø¤Ö¸'rŽœ¸3FÌOe+5Ú“bÛU>WØŠÌN­4î„?Îß0kÂ6sõìã«Âm.ok=îŠZlÆìÄKâ[ªÒGµ;•cód16t;ï_¿Jž©y |”PxšëÙ ý˽w½P¶×UbÁ(¯øÁeÄŸ~}œ–:0AêHœÖUjFž]T=!øŸ¨hÊs=±Öïá&[ÞnwœõÈÞ*Qa»5Y-ýHŒ•cK»9ÑÎ·s'‰ëÂÚ]TÃè¡°ˆã~ž| ²âwN®i¥Ún÷ÒÇÌiØ ´éd˜–²äÐ>SÃØÖª0vqý9Yµ-÷ÜÏP½Ïó$Úm„ŸéEý¹U  dc’‡V†LX±~ÚCõ^ôÙÌ h¬º›oåøDÎÈ3J ª]עЈ9ÿã#>miÒ~hòÂc,K×Ußõò]tð|\­ ˜•A(fgô:ƒiiÎ"–ºÜU 9m^dݱàߊBKš;i–ÏMè¸ï4øä‰™Ιó{j- "³>¿5fœ–åbüg¾xˆ¹áœH¢Ù;`4ïH`Æ%WEÑê Ä¥•ãTC %mÊè<í]mèë½÷H·°5QהŀÞv±ºsu&Z™Ñ=«7oå†Ý§?º*N¯é³Ó.eõgvü=…‡£ÙP `;'3;¹ æ¸"¨ñøÃ³Í«ŽÈö^pœyØ09¨®¤¥; µ´®d-Ó³àÉõ¬·1×S‰ þɬvM:'‡4.óã‹}¸ðê9@öz?PõPoîΟ „1¦Q"Ǿ,˜ÏèÂÚô¼šÝQp&ì5 XîC¡‰–ÛíiÌ>Š(½ ÛT¥Ú^ÅÇU¯¯YîlP›t”g|ÞE3Ý!m/ÓíªkÊ÷Ôùä¸óQð­ £ûvÞg(»¹Üò2EV£¾Uá)$>ðïFYÛ¤±íÔ½§Œ®ð‚ÓÍľ!È hXÀõ‹²á¨,¯Å¬Ç9€—ç¾ØS #ó‰†Ü£èß8œÄ+Ö1jw2Ö„ÆÒpðÓ$cRã3bNr·”îçk`óJ£Zÿ¾ÅJ}>QˆcvËEãËì;*xéÑŸvÈ›®&õó[pT} ³ôQ;Ëd×ã s~÷V(³4@„jà#?ôN’ƒJïßÜÀ@-}Þ½ÎËi«Gl“ËúÚ!·å0$ƒ¹ V©á\acÑX¯ø§Ud›ÐÔ²V¦½ã6†n‚†óøy7b¹tOE8zÞj¿ß¿ˆ_ÉÃ}t‹(ì½áÒ6Lo¿ç0£Ž¤#™u×ã÷SUC½‡="›ÄÎU$óí™ç½…ëfAeÃ…À…‡ç_ZÍ®•® u¢Ê» ˜Týػ/„ZÅîÔ_·¼™¬$nÆýÍ ¢ëœ1½í Fe‚’:ÇWÑjìD¯ËÓUSªîçKχêŒö ÎZª£7ëÍ6cgîKøÃ‰ÎÞòöe¾Åxt*Pª‹ ªsÑs(³Vã&”¦žK_¥ÇCŠ‘‘¹£Œ–^,ÜŠ#­Zòþ¾ë¹[Sâ¥ìYüÖåKàtÍ}è/bzˆÇ– R /8°öV°£Åˆç eãþÌ­s ÖÉyc?ÁÍ8лÍêÂq>¡*£6¼!¸~ØFûaˆ1 ‹rögo¾ ”ùºNñî¿ÒqÆs xø¾yYþ”åhùI˜M£Æqßâ§ þš¡„Ø,»UyRKOô³ðüc垆]6×Ì÷jKéçþ­K¥Oƒ}Ë©clK÷ó~™çÅ3™ŠJ±0Qþ ©/P¯êŸdÌï-ÏcŽQõ¤-8ü{?œü½„ˆ3;¼óÔ©7âhÄ#‹äÀ©±h©!Å–7Æ5(¼ÇZª½îÛ%2pZk§YŠŒ6F2m¼ðSNiçdž¯Òb€€V^ü“Ó(YÃx>ºbáù‡E°Aç#Ç gȯº‡IýÒ%ŽtRÜ’Ïxû¥†ÿÿDΟ²ûfýgó矀0`¼6ÉL°Ç@•6Vöž8”ðÆ´Á?—Ÿ ’5rã9;"Á[ý+Q\i³t‹¾% ›Âr¯Â‡Eâý¦¬Oü÷üÒBcƒ„£ï>µ}ü/R3gx˦Ÿ$:Ϧ¡9aïžùA:¯p´¡Ç—zùâLù+I¹÷x«ù¹ë³6$D8“6xÌyH—Y€ îÙ}Ç4Tu7~·±ÄÉnÓ9gÝR˜@¨À+@èàæöUi­¿>¬äúoX^ìXX¥qÒ”Ç ©fwdV* ƒðÖnFŽEIà 3£–øŽq?|RÖœ`ÑÌ6œè=–[2ˆË\©(AúͧBbV&Ë5Þ‘×ö’¡Þí6‡nXT b-™Ë87(¡éBëL*9}cbÖHÏl÷½\Ð.ŽvÁw•”ë-Áz¯iíª¾BøºÂž¹d¹ÜxULþwGAÒ)dZ:…Mè©ÏpÙ¯˜­Kðùîu!Y›ÖUB|)õ"žý$¹kN­ÿê”í1ðý= ú†ðÓC‹ÎèU·ˆf0¶Ì_ âïœYýû™~´_úÆI¼K/X¾òÔ…HÐ"Þ¡ä–¢©8™AçÝŒ:#‡Û˯/+C|‡3NùÙY87zµ5×Ê-= 2v3 !vŽ’Ü&°ûçNÉNٔűá‡ÛHè¢mîLФ¬ÁÎ$E]°Ñ QCq¦ëDÕ2³HûŠM¶X«2ÖNÃQC:B8Obå”]´ i&yX%˜åB[¶ü¦£ÛòŒׯ’bÛþv V¢Dn¤é|Á-ç ®^Ñ|hŠ¿K<¢õ”Vè•Esqöñ:Šß›Ìgsa»vá„HššSØ8;­ô`]«.St:LΫîª'21Lf°kUÑØäÅ\ð˜ZPÐØ[In™ÎU¡Ú:Ù¯ †^VÃæP%cQIlºW}í1ÜRa%ò‰änøú>ßxø)ñè9;¨m_6¹b]™sz¹ö3G&6ÑéK–Ihcª¤ª çÇY— 2;þ®d„âr =¼È"?ʘ\`—@ +<ºoáÌ(‡àîéIƒä,n Ý¿e+?ú%²˜aiqý¾!–úªŒà(®±{!?á-Ivÿ­¨LÆ%YæônŒ"&«ÑËL¡uPjá`°ïYÐ öú)t‚@þMmKÉ?ßsœ¯–ÅÈQžÉ\œbáþjªÿ¤ÿ‰ß#Tþ)MÀ[ûo Öç%À´ñùt8ÕÓVr1j8°$ã÷³ú‚Y‰)ý½*"í†v†Íë©ø—hµ{È Ña£…5­d¢=Ä%³"MßôsÿErÍšÚ_¦£Fhxr£½®è>Ô€çO®í6Šp$’ÏD±äÒ<Ö WeoÖªëÿÌWKêàÁ ;ÿ><ŠÐÈvÖfM­aÐS áHßvµëðÏýÝxÍ¥«—=;‰ý+‹UuJå²5¬\*S@å°‹1 ±tŒvyXaö3DÔÇQHi8ªòž"ö¶ëç¦Æ/”Ný’¼ÉÎ>FGÄ"|O·Œ²‚ƒ5Pñžå%9ì1è‰õfìIÙ¤øbŸñ–êkeì»ÜmÄ{„n:5B§‰qNL±Ä¦²qÞ"AIúN}$uìÄ]hi5`Aa¿n®«ÎBÎ÷»A¨ª—çÌútÚìÕ±rõÆ;uñÌbìrlÅŽ¼²ì’†ÝlX‘’ç®Gp*r«ÍYÔA9q¶(ú¥=v5ÍòT/&­l`\KPaèà#ñ@…ØüvCܬi¢ ,‘eT1`Óß–Å5‹=ŽŒ±¬æ_»¨Î„¶;©Œ‡Ôç‹ÝÿÀÚ8©´ËñƒóÞ¬W|wæÈÜ=a0 Æt€5ÅÔlc»?+¢Gþ˜ÓÝàÜÜS ©?÷ùáy¤kBQÃJønþÝ9¥Bª‰V2Ô‡ˆ$P‡Ì‡Í'ýþÓÍ14*ÙEWM°+¿rK„Õ€ãâ½!몓+î?÷†U©£dÓnlô ãÀOù¡ÓR ÕqÀ‚{©I¶| ×Tg—•"Ü-|=ÞÝ5M©î¥)íö®¼mžßÁUiŠÂ †•ÓµÞQ  K÷Y/:(ÿŒ7=VÏ0?!îBr&ßÊý[ÿxu·Ð¢Zà“®ÆH!/¦Á¥_ný^P yãYøf®QI±ñ²',Î×wmFH¸Örµ3½[h]³º—95ž4éUo¥aˆC‹Ç!¯÷¥£Q_Zè.Þ¼ÒŸ–|Bì‡Á"RYwÔ‹ÅsfÞb8A’ D¶ÁáOçÁÏa«òshA-E€W‹žµðAùœtM‹ì!D_vâíZ*1÷Àã3—vÖ¹å3”¡š™N÷¹¢½Ä]ä¾ÝG@ATXBƒƒ˜hOpÓ˜îY«Iéeê“D^¦±yƒ5C€…ï_põ°ÏÍé Lž›@@t}‹&QG ¼OÞÏ&]CR}wjWÛÞRÒ;Û9ß…Î]ÿ]Þ†ŽÛë¤|@cº€bÈ£VñY籆&è>å®içk7"L¨QFÖ+ßNT¥R1-4ÙÙÆyï «²‡¶M5"»’ÊÙhHµS¥œ:W½MZë' vÿÁòôüFŸñ‘@½Š:ó*=pâ€ÇñìÇ,æŠnÞ{…®ýÍ{ž¼š:0àÚêëªf„aU•n«1¦§ Dï›éz5'¸o}*F¯ý"ú¸0÷f×2fêFÍæ_9{CÖ'ÄT$·Ã ®ùܶž®Ã#‚êËátâø CË=\ 8ýäĶ}}h+àDn¶@àË™©ç ƒ uNxÑÏ»÷rŽÑ`ËJì“ýßÙFÁ›Æ0k<· ˆ¸lÙ~á,‘h‰ìu&=¤ä%Ì þÒb­zT2À²A£ä”]Ù¹$d¢æ›¹P¼[MÔªéù›¦Ý!Ù·3û?Á‚’ü ‚:êÞ¼)‹1€çÙ­;F\¥ëóiÈö¡»¸d$¿œ-g3”‘•±AÈ+Tdap &kÙ$yæŠ1¯À ЉTÙÙ¢Šö+;¹¯ÔÝÖœ‰›¬^@\ÊŽŸÍñn¨b#óöF¹ˆûXð1€ìb>6æ 5ÓCeXª›røŠâ¨È¢u¡°Z›á?ªY "Rœ¼Þ0žï+¤â†‡¼_ È(ò^é×$È”…d¹ŒòwaâU\57mͧ޶ô˜| ³–]gA¡ÄUô‹Ô~ÅQt°2‡èÒ‡4PÙm3 ¹Ä±|rãôÐb÷Û ©Üÿ:òqÿ±A„vÍÂ,» ŽeïB'Ì2n7hþe÷¨Ñ½Íäct{#G' ‹Ðoã@ÐùiÒëæÂH6älš…åÌ©šúªz—X½Þ`µÃ¤½žª°Gq£ŠûÞcÓ—(@5޾ÔÕ–oÓúÑ’ŸhG˜2s‰ºCFF¤-'*°nFŸc¡dvY…Ũ6 ;LÉ’¬‘Uöˆ 0×uºÖÖéƒOí¬Ø¿–s22œR:°EéÀ¯_å°ºµ¹¿Î¾ÇaÑŸˇü¬B[:ãEW,dG—çDÂ(œýÈJ²Æ®6Þ¹ÏØæþrý¿ƒÕ9CL‰Wë0 dj<²ŸµW«‚5PJL³ù\#ät¬¾›«ª ¡iŠwØds gÒL(7£o‰X7ê`×WACЮpe“õ'Aöt¤©ué ]­d='ºW“ƒŠÇ”"Neê,Èw¤Y TqMlúËU¼ÐqóÏéG‹³ºÐ¶Q–Ÿð»' úbFq¦ª¹¸¡*eÝþíÉXÁÖEgïé°êñóúÃO93§Ž<™®öÚFƒb²þ逞øÆ%^àœ_zfš¬œÖK‡Mµ ½˜uMæ©Ûïr¿^ƒŠ^î¯>†r`3TQB8ÓXï?†½cÍÄün©ÜKž BÕv¡^óŒo&¬”°4Õ?ï]sÕ¼žê(ölqë +Ú÷£Tâ‡J{ýF¬ë[Ïë슔ä䃺 EV8erŸ»Jíƒmç¶ÖÍ1[5Õ‰úù6.ïí¢@Cew­ Eb0ÄJY¹—jtt‚Aý—ÊéñfDz¬óu  “z©h~|®ò¢!ã" ø8œi³’N‹Ä(<¤ÍÚÀF>Þ|(xF«è Œ ×½)ÖÌwò¨mR0¸p†]_2Ð%¨>³ÃÚsHì*65Q&™jõ— »6«7ð=)JxQÝ6è©'Ph™¸¼,õ"p$“{)-=ÿ ÎGæµv@±—ebÕ}~ÎYGJúUÜv$Å%ÑÍD¨MöŽ˜[FHÁìEöÅ馵5jñ-tšÄ²×üŠ4ŸP«³s|¨$,4§–'·C7Hv»ÌÕÓ¿8*wõ…õ>kÏ+ÄÇ„É!¸îŒwêŒ8‘ć{E€ôãp`@sÖ¤û¶ìSL>Ë¡&<í»©ß6Mþ¶<ÐYĘ´¬R"_€€}zòx¯í§<çݼ&ÇÕj¾˜( àî7¥ú4¿ŸS³Q÷y3sž•÷v0\KìÒö)<ÏdØÜâ!FÙÁ¾²=•M¿z¥% èH[qÜkÔAÎâI†­veÓõ|§Ù‹aè$×'¦z©Àœ„@7¯+|‡JMªÇê'‹×Š`¹¬Ôóy¸Û ˜ò„…I›ê@Wn8nú¯.8µƒ‚–ö?ž®…Å¥£²A®0”y~ŽóoB™òÂ"Ö=ŽÒ$Å85ò1Nq…ALkEïm§%©¥Ü¦Æ^[g^6°X¶šeiÀ™yRõÌôVs5*ÖP†„*Î|˜˜âÐN¿Û¢Áâ¿eþ_¦G†Æi .}L—F…ZõCÊ Ûèöã/³‹›`“T¯›r©¬Æ8®°mmX;ËZøâ¦ô‘¡±ÒÏ•ïNråø„'8–6œ&³hZ Ë'Áã iYØ­ÁM2CàŠÇÊÀ­w¶‡!("y5ÃxÎÌØnyÁáåá~M‹ñFCYïþ’µ9ǧñžuK^á”®Ôàb”<˜i{½bÍêf籘Çz‹*›®·‹ÂÿÄÔ÷¨…‹Ï{Î ‘˜:;‡3@U-ÓDK›º÷?È`c9%_|ðöí[ŽÉxnLyZ?•†²Tš9ÇšZyæ¤íø¿ë½)Û«Lˆã«Ä‹p_š'¢ôäŸÁÉ“¹ÜP˜à-bª<) =þV¬Þ‘Ú¹à† 7 þȳMû›jíYqóÊ è6düÇoÓ¢ ”W„÷÷κ3É]ÉÊRßY¹å:!èSTÊ,ùU@™1ZŒ´ª‚§çwƒog*Ï(šsò#$ ê]X.þhN'`‹Ñ6 PÄ›–Ð ¬8<õ;]s~Vj>$Ík+ÂÅ‘ÆÈ è4ùòØ÷4Þk”0î”`N„ •Ô î+õ+BhŸ`!Sïóˆl¡aéíM9rÀ•Þ–TŸ'5ý<°o È¢=X«wÍç5šYBãÓaªM¦R·óΆnT!7fRDG®Éï°–!’È9ÙKÂFqs{‰YpwíºŸ‚æ£Xb¡ èÏâ‚O(½ºã[WO­_Ðï ‹ „z˜çž´X3KÅ’õ*c€²/®Õ¹—XÌV\ëU½Ø=ö 'n5ÌKŽ¿¡+bkÕU\?8K¾îªÉšQep[ è0z/a†˜ik˜!ôD&d»9ÿ ÞNØ<ÁÜ–NHÔ)-͈V–Ë>¯6Eþ²–±³Ñ‹uËF`V’ÌbœüXX¥…„ŽÌ&›ËeÏaÅ—c¼Þ_ß­³ã×ÝÂgkÊMÃ+“ãXGÚ"]Ý´"äJøêða¸ò¿QzÒzsk¤¤˜#ÂOõdLªÙäµí`Q^Ê#üO^ÔÆ/2Eò&(Ë«$S<‘μî¬ÊõÁjP3ðhB΢Ñ>Üy˜ŸwÔ:4€g/„¤xÝ)«BåjUa¹Iƒ_óG¸µ˜¼åxáG´>ñ“ú•ëѽxƒJ?¿L¥„7"áUådKFÍ4~E-„W©H¯_ã½@ò“mðÌ6þ/ ÜØ1WÖ¬Ê0l5N¸ž„¶¡KDV,³µÏiU&Žßc”Ävu‹ÍFC><ùç@?¥C—™7*Ôê¦7ý=ÿ®îÆì15§2º÷/}OûK–WÐÛÖê[°³{ñœê`Qн½×o+ún-¸ÄÙyE€kÊò-ÀvóèÍŘ´Œ Ca óª _íȤ¾©aá°©\9Èj7kÒ¸Þá"„7£µ"G·SV6+ÆþŸ7u‡4œ0.k?¤Ä‚T—òƒðqÅÎÀ 'gg÷Š4ëÓ*%RÉKPb ë9ç˜Î ¡Ð[g"B‚øú£\Æ’z Z× ›~aÏÃd1³V…À°² -Ioô‚Ñ‘Ò-ßBí(šÎ<ÞÝÎZÅE¡¥£€ 6Ën¤èaQBî]}“qâÑj•|Å•ò‹gg¨Ë …™ÚUVøðËdsÝbõuš¼8lñ¾ë*·¯óM穎ŸêÏþê*?!nz:.œ¤¼¨Í$“/É´R;Ôu {›ºÇ¾¨™O\Ï u^Nz®Ýö^SðäžÅÛc¨ÿÛÆj>6dÕ1¥=ÛÄCɾ^b£êÆ48ýUkÕΛÑau *É2&qÉBv1¾ý¨ÎÍÐ̲fž¹<}wÁ(Z`Åé‡sxd¯*¥º°\,½Óüí¡ã]jô¤aÃã·”ž¡¯Oמk†K­Ì“Ûb«‰ §€Xw±eÔÙÂÓÏ< q½™ÙËZÔ€¼1À¯J˜q`vh½ÝåBQé³£Ur‚S$VÚs>Íf‰1¢Ok~yšø} @ÅÄjªû®•zñènäë Ñ÷Îñ. +e§ôüÐ?DU#¤ÒÇ•á3}•ƒ‡k€€ˆÉ¢Mó Õl–—tJºìÎDßЧ Üñ8BæÅÏ„¶åéŸÆ@ärÖ=ÇÜá$ „Qˆ}ÒXz]Ì|øP(QwÙ2ƒÓ±_K­dÎ ºm k–=4Zì°Rƒµ¼s⿈äíUªh± òóÖ¶¹ NBlh¯QŠrj¸õ á>È-¤ìÕ´À£Xoòc y]x5^¬¶y;0+ ªu¿ü§‘´ê½ëó×q‡i¾>ŠGîÍ_ݱNçë–=“u¼ï À´ëøœè2kð(XKúÿôÝQƒÐ© $f^"üqAããÄ¥H²šBšWgÏqá‹0äZ²,‚Æ 5žÎ–·KĹÅ6·—[ ïî*Š¢ÞÐpUDççàŸõýsp#Ò`¢[̵Õ{y5dîšjh9ó¾Ú*¾X(|“{ØO‰E Îò!fs²á Ø^iÛ}î>m~QÄ®¬›Tså «kœ Ø[Ëݳ­•rBZ§Â?wvÍ;>⯀”÷ª´º•“·w0ºBQyàîökc“êa/hŠ Ü%R£á¨naÔúe§À‹u*Áw¹1cDÁ9ÍY5ü¯ñÉDS†hÄÊ>{ºÕðô94’oжjÝê–ó) ôaÝž'õç.ßc›6’of’®Þ41 'QY <‘•еw/C¥©A£*/Z£•‹¤=v Á)a/ «•·…fK ½8ËB¼Ô)*´V7“·†8ÿ›“‚‰öû’üW½çíš]?¡G4L;³•We†uåvdº±«X©yÔæ£ñû2ú亅Ü-nlISJ¾1‘‹&%6^:íÆ´ÄÙǦ÷ÍøÚd:¸ŸR‹Kº‚´c5/ÉÅ¥T¨YÒ³JÒ¶@Û‚–e¼ °[ e-%6¹w´ ðÿâzCsEKð¤;kJÅ5O‹À‡ƒ6úyúÒ°¹óHÊãi{rxzú‘fã‘­×´.·Gë¸^kOF ˆ96t¡Œ‹¬Oõ»û|'vʤœº&Ê%XEïU̲’5ÿÔj$Ú̧YÔü'-Û&ºŠ?ØþÑܪn2ŽËV†+ +®î¼¡§M(n±ù¯Ã¯v4’´©‘æ$ûI»ªÀ«ÝcZ•0jv®@0ˆÛß`=4MSн©*˸C1°H1Ê•Á¼ ÿÚ‘…3Tz’“½xiÑXšŸ•™UPVꆵpª6¥ŸåXj¤ ½ñ~µW÷ê½^‘^—˜`ndðpø¹EZÎ’¤ãíP‘‹µu6žb÷ÒÏŒÊý$ »MÙA3b`¿ëü¥D!¦äÂt}Äá ‡¯~jxLfeoÒÊ¥«ãPæX»å?-)Öü!ƒÒºsÉkÕ~‘T3¢;<°/c1Ÿ×úí¢÷¨UѧWîÁÄ´sRtIØ|ü±DÈi“·q2nõ"´wOeÔ¤¨œ¼Yºß“»Ï rˆÐsضYœ‚øyY ý.ü³€fyk3rð<·Æ?F=@*¼4ÌÃÿ»[ ­ ÔßÂ;ŒtšµÍFþOUë °¡^Ecû…NB[»©Øêá¶(&,†${Üõô§+êg9M‹]^{å¯åP'fMüî)P(àëÇ>8í«ÿȬð:8$oÚ=” žÁ†àP5uîUN™Å—&gÜ.ò däwéÕZcPÈF¡(M9˜ ïlTMRðQºå„W5Âõ¿d<çG: `íD÷i¥ý1òë~K­ÞžÃÄú|º„¤œÛL`áœ.²À{_Â;‹__9WªrM¬™¹ÿeŽC²6©»Ar7£Š—ySñëj×Õ× q&ÔaÿȯÁÏý€¾!1ðá¢~iåYVŽ`hˆD`Ÿ¢…‹Åó¯¿Â Ô»‘­òÆJ+”:=dTq|¼™XÝ3[¼û¤[.¥ý ]yv]3ÿÛš/`®ª^Ü´úeo"Ù–Á e.qOzéà‰ïL5ù¨A¤]Çûä$› #ªhÈbÈi;/LË9aÒE¢†;¥[ü÷qdTh!aAÞ¨ŠkB‘»O3ã]xj Feto̼ۮ{ò‘¾PßGÿ¦È;žú)¿Ý֤氼ÌðhÊ ÓD¦cùŽ‘iÇ ÖÄë'㛬~G)m9!;éwéÛyüÖå›/dÆ‘ÛÿwV‰ÆðøÓCC'ïÌVÑ‹&¹¥Ê@¯ø¥§TZ7-©(œ]b”‚œÈàVX¨rh†BïÝ6WWZ©,&7?Îñ«êï9Wõ´€×5¤¢ û¹‹9nÇñˆ™Ö¨0(FëÿŒôab{™Âïñf=X³2†&]»Èˆt[Ï13bʵŒSzäû1øQÇéµEÿ!Ã@)ªsƒ{ó_°PìÞİÀN^áõä:4æ ¼h9‚ãÓú½ Þ»äXþ8%ˆI¡ýžDÂI³,þ]3Œš«ïhÆ„]Ë ôήN×™¯w{4¬ñÕô Ÿ7ÛäÍÑsì…lQù“yê60=”c×"‘Ðf’~|=ƒK³N#Ó:ÊÈj”±¦êçÄ¥ˆFZéWåZãð‹#Q;ǯ5œà¾¿èfý¸¶$<Þ& 3ýánÜLªí‹à¸—3™hŽ/Ã…7ÐŒÇ2~å²Î@gÚ÷¼Œfx¼”,:pߺâÅ]=w\÷½1»‚« MgJ·4î·¦º®uA &l:ÔОíåìû¸aé–¦6 ôšªÿd“5z…ØÆÒµIljе9¯&%cÏlÚŸ*ñ3ðloáŠzÚnÑ=¯¬šßHI&Ñ%R »ãŸ@‰É—T«#Ññ–²îõY‘œÎ˜Iû2Ì‘Iä3 8[D2ÚggŽ!¸‘úqýf_kUE õç-å ѰˬȈK`}܉É\–rutó 74à^ýgnœ"(X‡¥)÷²¶Â=ç…\zƒj„$nË7üƒo·¼Úrîú6Ã1'´ïM'®v*/©bßEâÑ’Ö‚cÉ6fM‰Z%jƒñ¿0TòxÑ“€8xWOÁ€Â“ ¼À¼ýXíï@Ãz4q=~·a• è¢ÓIRþP'±ë1ŸÐÈ sÓºŸÙÝíÞo£,ã÷˵IBÌ:Ì €–ÔO¨kí®ÆC¡ñïß=ýTcÑxÎhƒ*lõˆºq*1}?ñb"ÚçÕ ÐRœ·Ó%¶­)6RscòÆ£/ôÔY—ˮ°«ùYT–Ý£ 5ðzàû;$@ »N, N•î΄ab£0/8¾öGÓkØ- rç©u¼šqQúrÓØ‘gFÀ=.šë7µP¤ñ”ÎOµ?ç¢ïþb…4qÝ^“ÈUÅ=«£%ß¹ýüãùгÒáñk¦bw¸&­»X_Wt+\P|>°}že¡ÕSb[¡®È†dÔ; :\KrœËtG5à"Ä;Ðæ…¢XŸ`Ä{m¿œ’–²\ qXM_‘0¢S¸ìèê÷÷ñÆŽÏæEÃu‚‹ I+×îu«=ñàBN ë ÊWø;D@+†T€/29›Ã½˜øq†Ø$yŠΓO* †ußkqËÝá¿óøúd²‘,ÅÀ²—bn÷²oÛ§<µ²¤{3m˜ràa¶€Ê`d3]ûR «ëø; ÊQD„pdÒè/2®õš:ÁFæáhk6›¡bÅS[ñÞ‹!¾¿Ó/¹áL•9ê#¯ÍåÆù=ÕÌð•}ÈeR&çqD`T²4àÂFóÀ*¥•ÛÖ½kæsÚ™…lj]-+aD’tÏ[Üw¾â'¤9ûË}žž5;÷Ó9Sj`õj >ðÄÄi_M2@3%÷†Æß$%ªBu?Ï[t¢kú‹mBF‘Ý1Èó|mÎŒ\Ý€Çsã¤X³Ø’x<á–ØQtkP‰¶1„Üo@Ã+ÑQtð H "tü}"Ô“½.… _)îCÍXæWÀ¥Èrb(ß$5‚#§ÿe&‚y¢ÞÛe˜“û2wÃ#p-MBixn¶æZ¾okVãqÒ sãâ®X¹ÇB9¤ììCW0[÷rT½Â×ï¼÷-a½«d2™öôÓmkêWš- «ð",W/¡þ¢A² ÀOß™þÌ™N`Ý÷X€“–-C$xÁB7ÓìóÂ}Eó|¨\d…pÂJ!îÒx¢}|Yž©'ÊÁ®ÃX=j¥–gBãDN c~æ Ê5ªyš–RP« Xk!{ï‹9Î(”¡›¨ˆiXñâŠ#e›ëÙá_]ñü>4B6ê…r Mê†I} :•ø¬í””é£EºS“øHGvÀ N>«d_ùö'ü,>¿:QŽùÇlÒ:ÙãŽ'uíÁ·&ÃPï*NêõsÁ®“I‘ìÜFqýÓYJô•Ä5³:Öåºip ”,<ohÀ £|A÷Z’3´r’ßÇ((@‡QAÞ ̯\‚.’¤Ê<ñÅÓ5owñ|¾‹ò?M'-ž‚˜ô+ùïöð>‹3ñº'‘nœ°£ú0.³RüÀûHê´$ô`R‰JŸ°üxЋ'¸,ФÍDZÉÐpA áëPëðŸ&ñ¾ƒ‘ønÎîÞJD@?ZgŸã©\°dv± J‚©Gt=ØÂ( êöÄÙÓ-­Ál¬È”¯èí܇©¹ªrÖf²F09!sò̼9:-2) Õ0o>2^Óí±»*0õ¾RíêŽ_,ÆÉaæ¨XßMã ÿ¤ÚÊš ,D$CÜQDsŠÒ3k³•¨RâˆáMù“ÞŠ¾G[BÞ–34W€¶ Ì|œh¨\=¾)Ä­–‰ dHÉ›ªî¸÷[ZÕ«~ž~?ê<< † Cr¬…¾ÖšL´ú}¬àÓu÷šNu#Ek+ ²ÃX r;ʵ¸Ð™5s @è==]”«–yÝ>«¶œÇðçLLY\¯Ýs•nÊ ÉðÆ‚WivskiÒÖ.jN¾Zƒ%ýŽd-Àãc¶OèÒ­Óþ~ö¿ÀÏÕ}w”è\/êB¼B£ËãdF²á?'î‰ „b ?2íð„ bN©Áé:ÿ–ï톯§Ÿ¬ôqÚ”Ye[ÇÉ-al“óôº)»'Õ½$ÛêûQÒ‚é#;¹Î{ApÂ"UoEÁà`:¿×’ |Ö)êFé=*4žpÛØä)R©]…2ŠMÃLœ«ºqáäCüø3Ù… &×ìtòù ÓÂËãÏÓH»B(Ò=P–qɵ—[õñ1Òé+«=}ÑgFÌ+NòÞËVC×@pZâ:LHТTW…4ŸNÑ~“ZAK ¹°.µ…?œ3NÄ%æüˆ2”Èp·ËÄ‹Uëðð0„1¶4‚Rª©šÃÂZ¡„þŠ~D×¥È9ŒÝj,t_¢(5rÍ¿åh$ßõ9b/Ø« R߆.ªÅÐ.Ý”ÜSÄ!–Š|èª?_›+ã·KwzÓCÂ*“‘R*Ñ·d:Iúšxìã¡O·-¶¦Ì¥@6(5c:1Öbr´hEäÏ’I];ñLÎ~ –*@ešU¹ç¹òìR:Êo·åôå#‰Þ4 Tù¢Öü§Ëù‰Ú›}<_5Ðbñò)b-_ˆèÿÚ_f¾©p…£;Ÿ„‚ð8L~ñ꾋Ïx ‘C·‰­·<ÒqºQÁJ7ÏîÜЭ?e›vùã3‚ØãS`/ß  (}<¾ã¾çæËXn¼KY7ÃϪ¶b?Ê4{íTYªwð/kÛÈ¿«m8=asÊ9Yºqñðÿ5å?}ò"Pr$j„)(íþŸ¶IQÃRÍŸÙπѦµŽr,•Ëôrî¿ÄÒ)ÍW Àë²gãYß«¬#ûïˆrBåhÝ!€l¶Û€ìó˜ÛyL&kâkînΠ½Æ.ƒ„Æ—œ„V C ‹kæûøÖ «ÈQÓ©¥Ïî‡ÿtÕ¾ëXÁY8ƘSl5lÀ«J ~,“¹§jdqO_·âL{ ᦧ$ª0ÿ‰:Au>ɉã|ø?=¥€žaýxêeˆ=æL´Ï»ÑÕ]à.†í)å3‡ÿï¿Â,FùÆÂ ÃÃ'Ôõb[áôjO¹~ðºÈšKKà0ž¿¨ÑJ刵øb¿ú!»±ÐÇ|úÏ^ë…‚0ã èZ‘ŠÊ‚ JCC®ö)(âÿÄÜ7Û¬Wð‘2µÆê²úœ?‚Z¬w‡q»;¹µöó2ÈßÒGu‘½moˆkÆ‘»]üÄ\[P-Ì’‹@@¢I Á±Š3ÎÅ?€Ž>×´PÕ€9Ã"¶ž·ío‘ ¾ó\sÑÖè»l ûéˆN+¥Q¨ Dú°ñ÷ÅŸq^áZòì½)fuÃï@?ˆæPb\(zưÙ/8w…8j ‰þÝq“jóitºÞÑ_C*(¡ê…ÐÕЗq /âꊯÁUöž;`²Îú”~ ÁKuR§=Üa 9êÞÒî[e‘Û(iý“Ê•œhåYõæ’œã3…Õ œþ!€0'UŒá°Z‘n®8}Â9êÐE€‡Îñõ‰»€›]=Ó9¥HB8?ævKš3rîû¶#cï>År4´ÕÉ˨îÿb{ÏÉY#êK8ÊXXeš¸GêÓ9Žm6ƒm&Ç×rˆÛ#.ž¹ôõïÑgã"šÔ€ ìb½ßnëãÎÇ‚Kš5…Û¯?ß]Ìvðt˜šô«„•º)3ô Y_Wá5‚êJ½ô¤*å77N;fB »A÷£~×Aû§¬‚‡íõ;>HõZlûBþÔz1ÛÄä[%,O½óWEI°÷èõ§Õü)„Ñ!4cØÇÚ¡öÊ»‡`en„©›<ﲎ1^  Be_+' ôQ':¥ÿ=‚pTk)Ùm·ø•ÌÈ`èð©sÀF$õÆ“wü%ìöË`J¨À„€5VIz[ônƒ£ð£qE»P_ 悇òdr™ «ÕHxóöµÁÅó¿²KVÍ™ØYmªõ8F\cÙv:¸ø– g§%ßjl7‰MÈ®µm WŽ£út%B“y^L«äÀpã,œ¨÷¿ì%«2ë¬ ý-O×IN7d€9lçÚçwQtDrå†jY&¥“¶\±>ík˜ŠÈ¶ë†]œ)#T§Ü•YG•ýg¬Â±Mg¦Ç‹—‡ÏÛÎ.SÀëŠ1ÿ#sæÌgÈ”GîÒØ ÊÒ3sM†*«¿/ŽîÚè&*;‰ˆÜ¬J)ãKz¨?Âýg<€°Rki„J¾ðu0Åê.·ÓÃy­Hë'caF$Oê„á.”2*ѾmmÂc­ z[þ ˱vI„ae˜SuûǪø÷X÷€œ8b€ªøn‘ÉäÙq*ÀQb¾’Û\èËþ/ °õ¢Av‘)^'¯TŒMÿ©Õ¥n>Yc꽨èÿóÕÇcQZÇIí7Þ­ÿ$7ûf—ûiB&vJ×Ïup£¡á®i'ï(ÂôS‘5;àA?,)Ž<…__3¡ø .׺j¬7µkKX€Ó$‚ÞgßGÊEÈ)…ãÛÿC×ù_k#¾'¡>M‘CÆ©§Ñ#Àò,Öòy¢¹çn¨œ$ƒ6®¹«7q¼`¿•V‘ôB÷D,:FŽVb¯Ûi¢ëEúo89D™Þy ›.n“ü5Ű4·´¢“-˜¾ôÎFq”ò©Ð4ìàu´²Æ·y,bȤ«t†*ç¿Zõ~'"‰XÊû/†W…øVÛbú›ÈÜ‹­’;çð°W‡˜©Çª|ˆ©Ý¦ 'Þ qñj¶Nx^Òš‹}"Ö+P2c v/*6Ûö¨¨p|áõ†g™ :-&JuÍ)L¬VÊv;ߟÿºÝ·J±¨âï/Ûîɲ* ™ãKw H@Áú9mð¾ÑÊDovÙÝZá +SøVÓÞ#ܞÁ·ytßAí¿b®«}[h©ßž;³÷C L‚!4…“PŸ°£ÇŽ ¢]Mÿr’í¤ü’jݬ”ù÷á§ÎèþSBcÆ(%óE:ápÂ?ÿÓíö k“Â6ŸhÌ-.’<ÛÛ:Ÿ”ÛørhÈ"ÙEÛè¶å6Hø¨@NžŽv“ƒî’Ü«20çDZ¦Þiîc®ãÇ‹ˆþe´„(¬=?ô16^õ&%öÑ1Hêçdz!<Ÿ9Z‡Õ¬ºù¤…¡r¾aÚ²-áò#’çw_#뙈;Ú¦Òüu þXÝdP*x Š‚Óaó¬LÔµ¦ž¸F»¶IO{š#é’"ÊküÆ‘Ó2‡«§Ýœ¶¶YNßtãýv楹ëzp^g¼êJw°‹n D™‹!dGv%<õ<}ªKƒHwGëL4šþƒÕPÁ6ÇïŽts}Ÿ¡{²ëö Pñ.ÑÌÞ¾3Ñô$À ³Ï07áÅ„D€S%RÑMƒ(ê§8• à}ápà9§z(4JÞ3^ï»÷sS–"AÄ –Pq·ð%kn!_À¦ñ>CŽáXk½+¸â|ÞS@äˆëä¡›o–{‘| ¨ £>Ëqm•©ÉêÃé/ĶíÒóæZe•:ïÉY2=‹¿juF¿½+>k¸+ëyõ.Ä%M ±À“özé;0Çm àçñ_|(eœ ¥Ç»²w\¼c‡¸“øj¥vGÝÁÀ g•³Ÿüy×ÅýØ–yi‚éSºg2|\ÿsÕøT/è¢ÙšiKHkE™ø¨í3ñÁŽ­O‡Qmï-á!$MìAñ$J"”À÷+^M 0j;†a(4P¬¦ÛB™ÌIžýT>Ù˜3–háÀ²iŠÅ5…Ð1]Ÿ×PhÔ†+ynèå™Z šACuÞí¸ø÷¾"heQ¸¬WÓ;±%¨.BqD!îFR¢¸çU–ë® ß.¼úÛ/TãìÖ™µšy‡ç6<õ•€ÒŒrín8ÔþEA¤´=XDTÚ×\~ÉíhÊI‹½óGbÛÌf#–!xqs€òßÝÛ"ÝC`¦ûú¶\Ó/ÿR…©º×‘¨§h ùüCŸ‘ØvÓðd=ªAýµ[!†j‡9½»èÖég…{ä[â‰ö“ÛT^ª€ÙžýœîÒ˜ÃJã[ÑP]9ïvÃåHä °ýdÅÇ¥›(>Ò3˜Ô©Wß3Øv5ñ勎²ÝúkL¡,jä“(¢Éû潕’ïá]±x4_gá.^¿jšº0y-tîŒÃúí 9Jñi†›ÞàÝTAÞdH•PïŠ;:¿òöœXéãq×€Nª-nãœQã\ü2ü¿@€Ÿ?À 5A »“]d;"£9 Šk%]N­'’Óõ|F~ù4hyåûú̳@RÅ<ö«”u–ûK…(@|Òôž hx¿ šæw'¨L×°þSâûƒ9jŠÀþ':¢ ‹Þ+Vš­Ô)Ûo‡CÉA»N¨—ÉŽ/î>Ø–Ä+d„5 “¾öÑÙ¼NÏä·ÈŒ‡p…å›âKè xÂTfo:ñÃÜ^rGîÞR{îv}R3TÛ ™Ÿ)í¥`“Âd>Ø1l1€žwAÂ>VR>9ûù·ŠI³Åç¸í?^Sú­ÓT¨ÿܺ%>ïò1MIn«(0è^§þÀ#Å·JD¼ Ÿnòj“ÜD 9ˆTÎi)Çê÷ !O°ÍÝÐD ~ƒf85ÑÕ`_^1ÙÅ!å “9У³æ3¶äuÓ[Ñ/Á™2 RDwò=¸mÀˆ}íéKɵ}ðE<¿(Æ©ÕΊyŒQÑð!hÈ`Vÿøí¡òÆÓÆý…ë*š¥þ"d©’´>ÓŽ±‘ע¦;3.ZÀÒL¸ç:×°~Î’`^—« (p“SɳÚr ýÿ]¶_7¸å)‰7UØš4ïÇOCõd«$XúÝԪɉéÔ hÔB9 w5{`b`Æ(,&§OY<0%3êý ø¢ÛßQ 0 ¯F¸¼ˆe• óÞܶÇĆ4ÐÆ© ôé/ÆoÑ‹ŽoçY_dØhH+¯ÆlÙŽ‘õþ§”ô4Ê•Wpó‡DÜs¦¾ÍŽG{4ÈqC;Ãê/ðP˜Và!âHG çâ´æDÝåâ >ŧÜ8;¦„ ŠÒ'Èñ–·™—ˆ*wûQȶyz`#”%M¡–ÄñmÌÏ—ù!;2 ,¼ÆÀé¸Ñe‰¥€œ9/ÐÀäLí0:cÌqShìC§LÌO«ÝA†wΉ£&3ü˜0×"ÐÔŵÉÖAnp£ÏD`¨/9Œ’ú·Œ7.CÆ‹¡–Ëf»5=#\ã3Xõ£Ú»-¡{ô4áëocCß)æéÿxupaÍX^³YÓ `©†E“þYˆ-X……+×Õo]G"¬ÚÅ| {;GfÀܪ¹w—íàÖÙØÕþŠ·%yìxJoIéAGñÒJé"r&@ºêi^ñâÅi™ù—0W¢4ÆédÑ5Œ@kázÉ›%¼ð ¹gÿ_‡«{ì_…FB­ã—V82ÁØE€ Ô5=ŽÓ/Ê,ht§'hª“<0¹ þV F)²·›> Ù}#~‰)¥R½ÓÆIYÌ—?5#Ó-dœ—Ëïm­ÏF_×vµÒª¸Ÿ\G,¯^˜#³våøš<=5Æ4p§¬lÃ"»„Ø|CíEjƒóiNÊËúÌ:qQ¼–ï:ƒfgÙ¥þ×qÛþ3ºFÉcÐÒ²SpwøŸÏë¶'R ÛeY~ÝNÍ ûXs2PyšmrI8R­ÄiÒ÷Í9tòÙ]¦÷MžÅzÁ¼Ï�müJƒSsøGS°ˆ¹¥ÚÄ*û«Ov™¿i?´™ Jµi#ò-‰sÐß1IÔÙÝ>ÔYë™i2¬†óJ®%(œ "W.³/þIä42W´=Uv¢b+`Æé%ˆ×A–5‚±E^®nšiØÁ€›+MîIvÇ”9/0ÉMCøì|HS´ðF‘'äÏvøIIš;¨”LÎyЀµ¤ÒŽñô8’ùµr— ðÆdƒø?ØÚEw‡Þ‰‰í¬*ƒc†Ê›fškµC*ħšªÔU#ÛAlÍ&õœä¦pÈY èÓÐóüó²ó*?)(Ðd¥ÎáÄŲ„ñWK.òÿ¼ÙÕg"íºÝ#¤<+f•9͹Û_yA’‡¶Æl]ίʩä$ñ¥n™¢ecØb x§÷’ÿ¦¾\:çƒ>€ÃCÐŒQc¥_ÒŽGh)žŒ¬®I*_t Y-FòÃèʦÁãõQº^·Wœõùä·=õƒFÞ]µ˜žW‡dk‹É¤4ͽe—§‘ ?4móyWñH¾AY!ãL«Ñ¥~.Ö&ýƒÊxXWãü°/ó*Q\Rjõá ‘Q  T?‹$OjBî¾’ò¸†ÞT‘ìö¤–Ó"ލ[¨,¹:ôAÌgÞ[T­æº£wµ1 ƒxcMŽñ.¿Æ?Cœ—HËTïñIéÞš¾¦ÎÓà†Ú!•¸Áßwxtˆh³'R´…NI@5à…¼zÁMœ„Á­ÇâWÄŠJÖ¹‚R=t%ßÂ*(ÓV5¥’Ø3îF. (Yw×YMÁ ¾[Ÿ®"ÝIÙ£aâî±s×¢ñb/Æñ•0¨ÃÈiÎÄò+³2Ç­¹±ÌdÌÆƒ³*di ‡9ÅÑNìï‚Æ·¡«Á+kÕû8þ׸»!¡®&“Š(òÜ}\uNÒ÷þÀd @^ä‘ÂGŽG°½HQ{Á“» TK»ÅØœY{nÊàTò8N¢æª~0r1ŸYè;%rÂæöÛ’1ÝÁ•¿ùÓß8Id%ñŽÿÙZGs—4A`nöãX©¾[÷G”Öì ó+B1$¿¸Í2nÅ•"O˜œ—27!cž¶0r±Äû £}>e½í‚…üºlÖÑs(ã [hñ¹/Z®EA:i³Ìç(³:À¤¹(îy¹ü‰f»·`Êh¥h¢м²J>ú!f.Oze}´`/´+eëV!ÔuÍV#"hCgÀñÇB¶Õã®íŸ|höå{^Üyw%éë® 4(¢á³døáiÉZˆ²xc6L?4챞M3åŸÙ‡^Ô­­3Ê2‘ªsÉVëDvîµæÀ½åïYãûa´:/&mSs»p{Æœšt2‘S‹+ìQ¾–Rô®ë¼Ñ…´YÔÚ?ø4†OŒ´jsϨ†›m–ØxK:[÷1bÂÔ@ Z«7γH%îW@ÛZž'Ü ÕIpeŠ•¢CX ²±žÐ!Ngw}†V ¥4&ލº2^ô_kýß¡†‚n$=±Uúæ úƒþŸŠÁG4; ÏfëË “˜µøtyfž(!Ês­ÉÀÜÂ9·\S}aä9tÞaÑuÎV•ï¼4Í f{-«„-ïfØ1FÐA K¢‘Àd¾M7ùÓ(q¹Hz'jIÀ†3 Ç’ÅÈCÑìL°_ðƒë÷{5‘eP¬ ÎÆãçØ¿Å 3‹d›q6°ÃÖOZÇñûŸ±‘_5ê2.’RØ‘Ž WøR¶[ˆÁÁ§0¢÷7z¿IîÔF÷–g)Ê4]Ì_ðùÜP!è?Z+8_@j^ß6•k «OÕ«;²#¤EŹè«á¬íÖ“{D¤ˆ7aÞO‹¶¤Mµ¯e:E¨P½±¬E¡‘ŠeÒSå91“¬á/I‡Qmx綾\ŠÜ~*[xD(RUÛ\û°6æ‹¿„¸¸óH ü­´\ŸîòV¡ÐñdœélŽš#^bÝ}KDzJíæö jknƒúë Êu‚ê;(*a×'â  Ò6Öo†ÕO…ß ƒ‘ñ”&)‰a+…Ap*9ueÄÚ}OÓ®n á¨z˜¡ªH‚ÔàR=.èÚ b#ÂIï`ÝeØä–Gw¨5w!zò(Û&sÂÑÂObà¯W6ñ=3»ð…ÀŠÅ•ЕòÔCô«0ÉUjÅRœíÆê ·Eªiüß2ÏÇ«<ÚHÖ¹Xñ¸8.—Òaz‘÷Ó;ÇzÅ”×å3òœrt=­˜×¦ ØøÒ˜·¤Aañ¦”%‘V'ÙR¿dc©ËñŸnƒô>çÀåÈ¢*R¾ÉñNÇ7VRÁPqjÝkmM QÔeFiäí¹“ZÊ¢[œÎ÷Í JAÚ 'Y~÷{¯ 1j£‹f¦''ß!o}"ÈŸ «5aµn§‰§•æ=ùÃu[7Û4{öisäA­½¶Fµ ÕênwPµFÔÔÊAöñQm‚dmµ‚<ÇÒbA\bl劂ÌüX]20›wí†#é’¸\…´3²±4&Ç4:™eKzZݬæÍÞd­Z·mÕù¹X™eOö‘º+3D⡯ïz ~½È[]úÐy‘Âë šÀâ~[Àj˜ù8(‰EtŒËζ„?Æø´€ÁØßFâKÝî«ûDÎàGý)Ž´®1õ AOù-ÛÃêÇEn•f$MϨÈMM¡\TýãvÛŒŽôª­æWr!t8H§bQÓHÆSÆ… ¾H«åýåâè jlÝqð¯þÞ¹ßÇo:tMH> dê_­wïÿoÐ|ñõ––#ØP<Êêb‰l+ ³}ÒWN é7Â>Õ—Q|üÛT˜ku÷$¸7¥@Q­-9ÓJ$h O“lêÛ' 8PU.d![0ýçVPV0ÞJO5È¡úúÍq¬Þ¶ußò©°”V¹Y{w ¯²ÙAså¥ÊÕ½6^Ù¥´íÎ$JŒgx3ä`5@R;¾Œx‚‚L :òò•8+6Pü¢HÉb´—zbJ"dðñLË¡àef[ÛS=URÈ»Ã-¦!I˜%I-T„43IjÊóQãìÆËbІ0èâÐ$µMs#û-ŒHpBL¾ÖMóÊMë×ë}ãW{bCm\ˆ–¬Ý_þP2ºÚP”Kî÷ A½ãbô›éyV¾›3‘œÊ.j WlUQé^Œ¡á¬ÂÉGGÔH¼†pog¾¡Yz“áTJ2LåÑ0åÝÑ¥]øó¾þ¸QgØúKë<$›ÐÐæ¿ÐåtØÀJÇ­‹6‘²ùUèe¬«I¤taÚd¸­ø=îv›–#K‹„¯5™$oð+]|ŒH%ïD-à/´„QYy­ ·Ý‹|AÀY>Ø®/-Q–%;Dv3`Ì¡O²>FR7O ØÎîûE‡Æ¿ ü³‡üMjD—:'§?oU!‹e»_è[­øÌháÒ¨_ÊqM,2ÃBódà ùë€1Ä¥{©ìnTH’;-w&¨¾F× Q^yj+ÖÊ^öêÓV÷<(¶åVî/éfG–ÞÏldê’ŸÀ…éGªÀ#·õãyd…íJ"ÚÂD,6ž¯EŠy>?ëÇŠxlÔ¡.ÞâB#k´§’¡JaÉb†ŒN·ƒ³Ø¥é ØŒW¼ë °¼Uœ©FK­8_LnZI7ƒQß”|µz¦¾åå²ø½¨ê•z¹X†©¾œ&e-K~¶„¼†ô¤'%2q–œl¶!ÁŒ·¾Á6*Ç@òÜ>Èó£ï«Ê¶v¥V=Íù.môd/xTXÔÓ¢Ó%mõ†ã«ÂE^ë© ›ý]IŸ¥@êгþ­Ê…lœd áp@²B~éUóºodÑK¡þ–ØÏœ–&g¡àÔípB‚_*Ë~7²J]v_±Köøí ?È.+Vµ®pŽ9f<ÐÓÉ´Ï ^Ö1U+Z‘¥áµ¾– †~[È ÌP¬µÙ/NJˆ?@Û¨¬²‡ˆ9„$è,L¨‹&¤R‚;ŽNm÷Yö* `}Þ©!鹉äÅ !B“@þ]ïc]¨•Å-ÙŽ©<>kEjHeqÄÅÄÜñ¦®-P§JŽmÂ~iu?J¨l]B]È©u;IaœG(NÞ‡S•Ê{1 ƒXCÕ)ŠkžÁ¶ŸE#î¹ø2ų©È‰ÐW ¦.†„^ùºÜsÅl›è`;Ž]®ß㮃µ;ôòÉ‹Æb ò# ãSÿÇåêí/èg­¤ôŒÍå´BVØ@}Ašq™Ñ^tyÆ„PO/ÃFŠk°× ׄ> Þ X ‘4S p¤j 8 ¸)õCFÕ÷…3–„ï™pf–í3‚ÉÓ;À2…ÏY 9DIÆ'SÜ"ÖP$w~ÂobšÒà¿ãŽ;6;V²ôø¼ù¶!Óø©¬Ò–V*A–n4p'?{êyõiZ{~p† Ðý¦¨5)ÎvXbŠ:ÿZ’|[å[Åö¯ ïêbsƒjÜÞ¶¾uÎXÔCIù)°È­œ O=“6º‚:Ó3„†,Î|D èÏÖµOÇ•|Å™¼€­8áDvIæüÇïR¸FÅžq ο˜kÇœ·‡X4À3dK0D¼ÿŸöe¯j“Sˆ©Ï0G÷Ëœ9à¾q‹kqs¨eœ_{´Ÿú¡+ûƒïV+ÕÏ}Ô1ÞÓe¯Tq”±џ×=1ÌÙ0à]sÇ·ïa§^ÒwŒQæ©Såe™N >È0o Ë¢ÜU“•µÇ® ”NOÔÅÍkc ´µ lµÊü,¬UÇ"ca#cmú˜]G±8~Y85FA$6{iMŽ]Ÿ;GùŸ5/_@„ù’_]š’Á“‘Y\ñÛ¨&+rýZ†l'º."Aòö°þ4cèµu9:–3i÷{².XžË’@îŠëŸpê{‰(—,¬Ï8(d‡áwÈ%mÿC:gœ|0H31ý,Sè ðJ#Cs6€©¾’\I¿8àÙ-tV ¿y¬ŒÃ(þpÌGq¶½6(Ðx–¥/[°Ž± ­R …çðOQÐ %GHÁ×ÎËÈ„„ÌB…-È›—ȬPBL¦ª4š9*»-•ùnvêüºFÑ­Y Åx„É`pa­ CÞëûŠh”N!tµ†Ábôz´©Cw'bÐ`ܼXu!…ób6ç €Ñ÷ˆ¬6S”U ÿZQ†^ ïì ë[ó?ƒÇ_UQQî@_’ìr¿<ü \FÎô¸Ì^0éR\-W‰Œh6L“jÀªì¾ÙÒÍèdOy^‚Íàà›%›ÕœO“ªž4äœFÉriƒ‡åËëO°U$>ü†|œ×‘ÿѶ–ï"™eSü2íBc±ž+:]‚ñ:hÕÝ YöiwŠeØøìN°> Aë"è$ Z5ÄÒsñùyðæK$x–„g7 þBú ªÛT ÖªÚOxϲÛáTaê ÅyÑžwAê3ÂA•àÕóÿ0ãÝì>ØÔ²â.qÿº1xYìÈs q1D÷9OeLŸ×œoËBÔãe€£>6‰wGZœù¶VÚ”Ùe¶õ0å (´ð¤¢àf§Ydnï·éì&_ÔnŽ"ÆÇ ¤€D;#š ­#¯ûÊήÞYMú9öE£r/ÈF*»‚>CŸÅ…†S—ô¯ÓTQx„²­+w Cá¶’»>š@WþšÚWuì' 6Þí‚¡¦fmxF5xœAë¬å…>àá®áUÀ¡ïMø]¼· Ýà`ôI¹ŸZ~¢j1–9~‡â³ÃXãk‹y<:»6Ú|7ÆÄk_r¦öuG³ïÕðX ¸¯W£û1±ò­ÑÖžÄôù‡‰¥Ì9ÏCÍ}ƒ¡½ 6à*:Þå Q;$·?ýE±ZCì£sl{¡ùhS47êÙƒ>Ýp¿Ý'g0¡¸LUÚ^.)ëV¨5ü14åd}«]£¡zú;ÛAƒ”§ÚzHlÜù¯&þË ™ðÊ€'誧-}ÝøâR›5I´ˆÖ“ ó[ fŽÞ5%qó)×bnØÚoŸyœ1 P©i”ÿªÂ-mRw»Ô Þ©7 $é~˜ÑòõÑfÃÊÝç›çt›¹©Ôc1 ±é%>±¦Æ|-"n½ ²Æ—ÿê”Î0úW[ð'MÄ÷Ãòâel»'|Ïp áüYLPþ~Z¡8¬Y*hRRr„ÐÉ­üš5CXŠ!¦^(~ù]xñ{¯þp‚BÈ¢Mð¬ÅJS¸}!)/º&—ÃaÈ5«‰¹ÖÆk3Pó”™½fõCÀÃ{÷( ô» U–V§Œ›5¢.Š) îsÁ¶ b¶":Òú°‚r*Ç]Æxˆ'éÚæ»ÂìãÏ•¶¦¸y§½îœSD¾~b+é*[쬧¨ 9Ü„ÁI+ŒÇ!Áå•_|š«ÐP€‰kí:hkŒp¨›'Øì">8}‰~ôÂå ;[^öDó·çjhçÇŸŒüÉe›¯¶ìù&¯çÅWí›Q…AÆØ\CÄ3•òÎ…ØÞòM 7w!,4.êó¨¹í€ÄÖœ!-Ø¥y¯øÌkp$¨òa!¼Ø¹cv³÷>(lÙLß™z1•M\úÿ² Péùi·æE€ª6rx‡xÀë͵Lƒe?e±OΑ Ï;Øó¼¨™hÌ%¨IQ=–(ðR»ċ­}sõør61š×Õ3§U'û«iC¾º‘ó¬½+}L‡¶,š¯ãÝšß./usM1M|®ë*°—`2‡*X¸¯3mR VÆcÏ›—\ÑÔ3òýÖeq¸Å¸.^ˆá`ÝÈ]œ2ÿÓ ¢ì ?c\1—‚†:üt FÄ£¹˜–ÑW²jE`}Jî2íf:ºz"u w’ÆE:bGëðã à¯O³Ïd žÒeÀ:Tï™Âì.7¼Óè<!§ŠeVekPªm4—ävIû.Ç‚tíNãAæÏ’rÁ´àö¾ã{û/ä$síÙÁ|®Âž‹ÝJIä¡ !S>¯¥êô“¹ ¾BJ¨ùwž­“ Z*˹¹ÿe,0²Øf‘QàÉ„P2I· D¨'\õ»ÚÓ¼¨ÛT”ºÔzÄoÄ/ýY_!Øá™÷ ‚°óq«||a¹dÒâ%ï觬AF"ˆÙÁO°T)~¥Á6™ ^‹ç1ÆÓÈ—×Ð?”K †Uà!ÎhÚZ9 ¸x¾äîXQŸþö¾jØ‚98š½E‡Q—ýïï»':Smêúˆ :ÉQˆÏ ˆ¦ZuIdÌbÂLù=ð ªQ³#gT8ï([ó­cª÷£FýŸõ£Yw¯³hSœ‘AErÅ|'~Ë[4YbNÏ\“ AµY¯Þª‰hUÉÏ›\Ôé¢΢Òî œ¼@7­s½À)û‘ Œ®@;Ž!#$ð”‰é(—xØ6_2N#/F‰ôhÍYc€fVŸýSŒð¬=Ü€¥rUÊ1*|ˆR Å<ü·3(ÄTliÁîž^[e誚Q ûç+’®ucgũڀ7¹˜—àPR›‡*nM·üÄ›}á3O.ð…Ùw+΢`V™Un<?ÞŠÔ “ž÷Mùýý­¢ C•bqµ¼‡ !Ëôµc ¼Ø4ÀQ *ä% [6yÕ,È<˜»®í½âìíaÿ’:å5[˜7~ ⯻Š8S¶¡ @ʤ¹é\qKcþ’±­–L&j/ÓLÑÙ‚,Ú;Ïņò«Çeÿ”f2±%QCƣȼ¢n\G–ÆeT ÊqžÑàzÕB";,Â¥¶šê:¬nÒÐÀì©Ò”µ0ù@fRTítˆ‘§@Ë_³AQñÿ},5¿ÔÂøbw°ÅūҮ¶ ³KÆ€øtzò86%oµ-H]°âÍp¶õß罿TÏ‘‡?è Œ\f‰hƒ·—jûW70’Ô¼ø»—m㊥n¨‰K×íQ" ›RÀÿ öm` Æ}HÒ[ròV3×cj$w§¶fÿ8±ÏÄÖУnbÃj·OR @AÀ“ÆèÀ$]QÞ ”¢h9©ßTÃ{˜©9m¢ÔÛhòîÄ9í%#¢ñ°üdO8ìiÕ¢¸ù±HRÀ3¨2ä×TçBÀφ7^‡skÞP®îP‰©ÉÈðà »…¹v¢¨’$ûDzõ=©t ÛÉ]œþ\¸ð÷ô×&-¯=Nò^5düÔ§ˆsýy ÆU9W*ù÷²ƒg^ŠÂLU™0v¨ D´ä¼$kmÑ_KöXà<»¢@¹µ£bð3~Év· bKØåž…ª¹kOëöùqð_¾t"÷äœð·ªRÏU÷>5»¹ò'?{™‚.þíAê5—Æç˜±:/Šã@Ø“—bw%úE`Ðçtõ¾8•ÒºPú-é÷Cî­»ÄÓ!Û¼@Œ>óu3ýFÙZ¸’Ÿ¾ÛC¢>{˜·«.ô¤Ð»î0Nâ†V#E §Üøx –)ˆÂ~½œ§€# 2‘º`@5ݺŸ"3€ý%¾ŒÓÙPçüºÒªB³Ì!(áb_§‚©1¬ Í Å\J<– ?¹cHõÄî½ç ÖVÓ3/~!»ìÓêžÿ‘Âw P¾¦ï·ÑrBVaAÛ™šËº~ø‡âÌk+N¸ÿÎ$&nV@²ªÒüph '1—DÓ•~?Û±¹ïcÆÎ6Ëwù’]ú\Ô«_öáÝä„dŠÔT^“ÇWµw¤¼]0ÄÚ•^"˜«ê|†„ßÌŸÎ;ôY³+Ѐ@“{7ZKiÀö~ –k%7¯j5òï,VÓxmq87Wý¢.Ë£©»¨£VŒµbðˆ&¬Ñ$}¢Ôn9¼R'~D?:Q§Ÿ½—¼DZ(çIþ—Þ ¾XG5~^Í/CÔ3q_*¸P‚òìSÂý7þ…“Æ„QkÑÞÆ(˜ó+åÒ5Y¹ë68¼©çuM—?ä s¢ø—«W¡®W&÷Fr$qÜó Gn³Á%”›¦\(Y©$Ý~ ÈkEÁ:|•ê& :9lÿ!éʪü1pE"ƒä¶:q#ƒ‹ÁBG=ë݇²|8q@Ç1@@%!z±Ã;˜Ï ä„Äw¹µ#|x\êãÌË%žµ4†+³§T3Æ&A~>~Wóÿ|4ZL%„ÂÑ\)élëÐÂðž®90˜Ç:ú32¹Ó,"(í®ì[d¼[7EjJÙôr}2!)9Š7ÐŒƒä>ÉöÉj1¢Ñö®Œhç^®GŽ4ñStîØŸüý6K võ³ÿØšf\ >d”Æwäè˜Y F¸é;LPbØ2žD‘q1€—dÍéÁÓ¶HqA"¯Ÿ7íÚkɼFðæ¯Ç#ÝoœÐAJ†—!Pm’›äš8]²ñªºÄ…dfc¨ZžrÎúÍv´?=êóŠŒ$þ®Ö±µ%þiûPŠ;m‡ Žšì;ÍØÏ7&Â*ÊÊ׳&:άÙ…CØ üL¨;‰€DºlšgòýàÒÀîiMÆ‘’brn)ùËG☇kÈ\}Ô#PGdžP7„kMM(s!Ô'Có“o5ªf‡þPÏwfo›¹(%3ã¯uØZªgÖ¿ºX0”€FÙ*í\*ûžDôu-—÷×@Mà}MÍg‚“DÌ>Þ¡~‹qâšg˜#n»ó\ÂÂ=²'Fà¢GHÍËՎר~Oq~œ_m#±¿.ãµàivü »Õk—£‘kóå˜PG¥ãC^ýáâ»yaY!½ºy¶ïWÉ™À‡~0Ì`êV€½×ªvŽCµñ0îÁŽ÷LËc˳Br¡d“1AƒŒØ¿Xd )N$^MóO1ôjCš³í³‹Ùâ{·Aĉ^0ë°p,þHá7¦ QÎ=>_‡ ½ß»9ÙÏ‘èß‘ItzãR8 ÇŒñéN úñ ÿÆÀr’ͦ…küNì:ÆšAÛ æv‹ª‘(/ãÞgb9x±+‰Ù¦yúQ5ŸPNÖ#Ï­/èp]§ß Æ€×­wFGÑSòõp[Îa¡¶1n;öCb?— a[9xµtêÑÕh«‹Lºý™j<Ù„ApìéJ òRÎÄ#šßÙ³¦©{õ´ ršË&Óy?XæGª ¤)c ‰¦cÇÜšêö¯GMÎýåa\÷½Å,áb ð¹u W{àŸðÌ÷í,tjyh;wÃ4ÓŠ sG8U(e¥'W•I´(ÀïLnë¸Ê¦Çû‘åhèLÉ_j£Ždð_“ä¨8qgG5°E7Ú2ëoö”IcÓ¸©)wg±!i¡¤_ɸæó¢a†Î\†#\§³ìW5 PÙÓ™3jÔD˜ÎlË®q;lD@0u7¡ sœŸ]F5ËœÅã½¢Ÿ ÐõLN¥†Z굚ÿ5dYåô©Ëî+­ 2½…Qv?–”N ð ¬ë·“¤pÅŽýß×`‘jöœX/Í( '—ßpª~“R’,«¤‹kŠå*?#+Y€\Ø©ª`?jn_øi e7çö¿\È$ ıá¯ê ˜ H²`t÷f.®¤‡&¤ílõÕÜ/N"G`w2:®¼y>s»²`àìûñep“žÇšq{Æí(b+· n¡×±æ‰ö"]E·zˆél¯¥Ø©ß¬,v(úÃÀ Û…|r/Âq;C¦Ý°g1‰’Øúî“´õЀï’&è÷à=M7‰7«ÌÓ²V©>J%&*­-°¿Ø i…2ÀMíZ…³Ø7;«Ñí4ǽøän['/²­ŠÒ7aÀ‘%Ë 7úS»ûr±$lÕie°W0¾mi#ÏÔà¦þÓ¡­kÉ+9ð­–„ìk”äs~®\ª8áZó°¦-Lwˆ}#©¶±špÏ©–]ûÌLA¶VOÅÇÕ# „v‚%œŸ ‹Ìä£ÊŒwJŒ¥}2 ºMàçÑò¶ÏÄ-&KvdáBÚ$êþNHÛ¤þ„`^Äá¥ÕÖEC_Vñ¸õ…ñ5!u;ô‘–Æé¸ælÄ^þÛèwõ0²Ž_…a+Î,åÎXe;Ç6¥·4W¿mè꟭eɰ}ëÂ%²ÔЂ}êL»ü³£_ÜÜ­jk}¢Êu€®N0Ü©Wv½ºœÿ`þ2FÚ®³7|4¯à’Ø6lž+®ĸ”†ì¤¨o•ß[S¢…XL­A&@¹W;[ÆCáSª×¼éyÆT÷y³A FDŽjuW}(UŒs>kã‡ÌŠÒ€¥zÛQ{¨bä܆…êX2c‹”݆»²(Pè?ÙÛÎKø9ÃåPÎcÑÁ°Çü|­M)OŸK…;<­ö\V,Ÿ-%ûb´¿ð·Çœp†Är—Û%¶!VóT,ò;Ù1(2ëÀ ÓÌ´.´ËcÞ"j_ó½ìL½SœÄ-\hÃgŽ3^ú?Z)Y’ó×ì~å¬äMŽé‡oâqzËcüq3Köc§6B½Œfñ‹¥#åÝ,ÕýXYžÈ–`r]¬UX8!éR£/,LXPG  ð9Ï Na´¥$q¿Jª熼!|UÚk)OYà·TÀ¯TªŽïÞrùÈî¿4€ÝSºd\ L¸s€é­f`~\àñ®ÐF÷Û!!=ʉRš.ªÆ¦§b×ü§L¥¡[ÿIÙ›C#½Ã'íUðþ&‡°0Ë»‹ï~µjÉ@ðž0ê3¶R.\Ee9´]]˜'±rÂ"g‡NÍ’Å&çÅž"aÒÇþÙÊö°=Gs‹Å!Qs8ðn‹ªÅcE»¹$& ÒÞX o)iHÎ' '£3¯]€àØò¨wùÂémF'7xC”…å“êeмoøe§’ÔéžùÇ‹)³«@ÁY©IMóè,æ³¥,˜–ÓÇû÷šfN‘ IdC}êmßü‡ªéR”åÓH¾:» y«:çIúªÁ¸s,ži§©.Η©!þ è‚£Œq[q÷ÊÒ™¹à¾™ÑŽM9€ è‡=oðtÞà_OLŽpð]šOÂh¼Å”íy÷,:½ cŠÄ1ýýr× ÛxÅs§iìlÃù«óÿƒK¯qä› µmJM!‚w|Bû+M,*„@¤Úél4Ÿ 0‡x™OfL <Äè…,¡U[Ó:s•¾ö¸,ܼB^’À€èĬtXªoϼ5dZ½pñæW•T£3v›‡ø0k~ ¹¥›I¢&ɾ+ÜØU? 9&ÆeíÛqâ¢'ÒŸËäñ»zÝr' Ïvªæ^ž„~: –϶7ݰ8iIö+ºþ yn«U´;¥ ×­à¿åÒ}£MhåP$4~à¶«;Ê ÐPKåžÈÿ”%*)'´ÕBàÌ¥®£hG¶y÷ì@%þbê³Uýb’RRf2õ1¯vÜ +•ÏK@^ÍÜãÄUõÎÏìÆï¿ÂÛŠÌ©ú¿ÿKC0N…“/|³Àp^¼çÌ]*„’îeäì$q[n;hݼ, Œ™ ;}ƈà}4§wXÀ×)cVPÙÏ_˜k6`LªûÁ²«¨çIÏJ ‹Æ¿û"UlË2xèïÚéš)øœ†jä¹ÔígÔüL?7Y¤1§€)|·r‰ò}-½EHݪ”yö=ÆùÅŽœ¾Ó4YVÒɉ¹mZ°G‘^ºƒœtlmó¿`؉ÑÁ¸Q-5-ÓÜàSàAúiV ¸‰ÍCÿ‘æJi{ovP x®ù/×.iìvx^;iPëVJšl@@Úô; ÷£´dm€Ì Éh©¯žšÁ™L¯—ø·!cw䇌úêV¾AV2uÞ<k ¾ºUäu#×Þ8á~“>»U£/åÅ0뱆"xºal—õŠi¥þc×…£‘ݱ³¥c—7›ÇQ3'xZߘµKϪÛiÛú"©ÁÙõxÊl[ xµ}äë ˆ™õç?V³nLÆ•A~ø*p ܺaè×4Ýþ3ôæ*Åí*úåØÐHyжÃÕ½¥Âµ0$J|¾ù\r–JÚ³ùg·)¡OÄ!tÄÇÂ'ðÉ,ÏöCu{|dÆ}žh.@;ÊL¨É)TʶÊ`(KóÓC#¸dÄ6dYè8FçÅq·4(J`|œ hv>µ‹dÄ’ÞmÛ D>”š¼ÛjNPM#ob¿ˆ ·#€ÛÝÚK̆°ã‡É‘/?©ùs§n¨´ŸÒQÿ‡ÎbJ2¦:('D[ý¾(¾@èÿÛ ¬G¾éCrâýsWçtl Vi~9Dz™~ÝÄ%–Jë= n"Î`èþGuÂñXMkÒ_ÿú‡î’W›~™˜}ŒOêº×Ï/5ÛÇ…@Ó}AûfÇkõŒ"»mžB {jf行MRn3ˆ 2… º5öÞ m×Ù7\ôEÁRŸ€ÄDüÛp©&v…¥Ûu±NCÀT¾ß›ÞQeuŽ ÎñÏ€ãl@°yߪM½|_sv@+ØWÆ©FAk²o»•ßË×ÿXxòãçòâ¶×ÆêƒGÆx.ç³}æµØD2‡ì>:çN­°¢›Æ_¥‹HïÍÕ`Ö€`ÑÎ ÓË»ÝêΚ3+}ò,Ñ(Ò¾Ô)é n³”¸µ‘Óìko‘.¯úw”!íM‡ÊjKÊãF¤Æõ7´v”Q¦¸öØtѼíÏ{>“†„]Z;WPèz@²Õùb3Db_‡j,¸n?^ä웂‘33<‰6++•ÍñÛ¸?×ÚZh¸”PÿHrߨ päsO4–¬?MŸDïMƒ¿f¦¼>Z'#86@¬Xa,m0¥WHx[ýýaYšÛ]x¼ Q ç/·úëϹaL¯¤¡YMÕ\U'HÁßm4üÏ¢(}}Ì¡"Â#¼b {4Ørk„ëm8û¬Ötº@—fµ©ä¤Ëž®(ë‚BxÕ…þm9•W“óí‘B—ûÉ ´Æ­ãX<޽Æ]J¾H‚ÖñœËš¤ê´R‚R ,½80Œ¥|#™ÊÔ²Ö·£‰mgb–9<" d®«ì¦Ä»~Ûº¨ì*§›µty»/4ü(J`lÎ~Ù)|=WÝeB¨f¶ðTܳГu¢  ÒÑ.ñ¿>ÛOòtú5é¼1¶,ìž«þ>ŒÙ#°èûù\¾}Vú ¦¥<Ày†as(6¨Ïçm¡Ù?jÞ Ž†­ñ$ƒa®¿ºŽA÷‹ÊP7ÓõY€®ŽŠð±ü²$çR`·+¢lèqJÀº²Ýª“â$‹7 ‰¯8Ïx¤ÕƒnS˜§T¨y I¦v—‘ˆ4=½ÌµÒà*`÷ÒÑÒžÙŸÔÅãr‚þiG£A€è3.SþÂÙtgÃùå°â6„)@ªÍ ™$9õü{¸û_#·@:B5 góó*‰6À¹¬6;ÚcájP²mS¼€\Á'íº˜:—ØÊ&¯d.ýå®ïÒbqˆœQ2›¾ÂWÛ[ª¢´! 6 s ›÷ånó”ÎL»è³©ÚóJq¤e;¢S>'õP*=;6??|è´h>¨E ÊØÏ3ˆíéxÈî6Ô&ã·Sy9\ £C†YÁ÷šòÔÍU×1™Xšõîtç‚Ì ÛpåM}J·ë% ÿÔÑ ¹†)“Yƒö¸Fk¥²éÔˆLRKo!øiž/XŒ±>âäË|f$…šârwvÐ@ÕÑcW݇|üÿ(Fg~.Q_?Á±9/+Ý—K×kŸëµÃ@ãbkõ@}+¨†v»ææ1Q%ÿ e;ZE—ïòn9Ü« mP2JZ¡…"üñÄí¨]~s“ùbÃí™?ÝRIÈ;¤™™ò즪K{º)à%ÛžKœcÖ¨¸7/n"‡ŸÁ¢„ßkêZ×±>i²÷G’ ¨ ÍQ-¸ºÕ¯NØ:*i"àú•lŠFL¦ÑiøÊ@%ƒ°h.üri;x[ûD;N·À†ÀrÖJùTÓNJƒçô™ÇguMl¨½XÍYfë t³¼ Y)ߌ2çÖE†ÖðÉÇäN¾'}›‰¥içf?Š$óÄÿö{†£°ÉW#óY#"r‘‚q•æû@ /Ïj¢(éG[Þ¼EùúÞòïƒóIƒÇ(IIÃj…dci O4–†O0Œ ¡ö…í°()”«jPã¨NòÏ‹<ûžW„#2î¼–ÃÐà “ýûë+ä±·‰Ö/PhQ®Ç‘CþIi eC(²8 \ÂbÌ]l0õÊüÙ-ÍeyÓÂËÀòGæ7ÙšêÔb릧½1Y¸Ãj±v¸!FªÿG­£ÜbˆYŽG´ß´¸ QªÎ§ÝêϽ²Zí;…Ý‚þTƒ“¬´I$Rì°GuÎß1KGËÐô\%Òd+gdž¹™j”—iœC~ϳ9\gˆÔ·b‹:J”Mª´¥v2kþÿ# âÊõ‚KãénŒ¯¯µ ‰Ï”ít¹ëWºò4Ñ ÃFæ 6]ý8‰|Ø@•:€]H°x,äYšK*8h?×tZÓçÕBžòÄCd)¡¦5mëwè†o\&s¶s]€Ÿé‘ØG²žté™d U“Áî´6Z ‘Çcƒ @È Dyíbp&*Ç¢d×Í£½…ÂÃI·–r (‚Ô÷Qª3hQì(ŒsðP7ïÉö½öséðy»½©àâúÿCË RÒ,:Š%i…‚þ4_/dà$¢ØÌÆä±?Í£¼ ÿR0ˆ€‹c°hÜÓ–<%˜Hy ½¥©„úÄIxáE¦¨†÷»mXañ•ˆBlþ8̧ËñŒÀÖáœo€ŠÉϤÊʶ|ÊêNÞ·e5þVËM¿yküë«:¢‘a­á),–æWÿÐëÁ`)ö á¾½}Æœ}v‚=5Z¬¦¹IÒ{ç.1; ³B*EýyLòtNm«¦Ì=½@iÀÏÿ+y ]OJ;Nþa¥ï{j%+þákbd{¤ê‰&Û'í_øŠ .‘Ü21˨¼i¼ˆí ¡Ib;ŸÿhxPŸUßÔ£ù¹E ¹1½10´@h  ¶]´ND/Í' a»Ò’4Qßß ÀŽ(¯ÌçãwHæÒL&ಶBT\QÌóÞr»T¶ÛX‚F#ÂÖ®1»«½]·mHœjþ¯)B'û-ûaùYv—С–Îf\>ØŠÀù··Øé\Øáb‰+LN^ù[ƒ+gõÍíf7q)/†ZÞÊ-«ªÆ¤8hJˆûÆ„ uy¨bAC`[;S YQŽ—sˆŽÓqbú+MRìíù±l¢í‰c3×öœX_<¿Ó{Ëú€mÁªf‘Cë°õ¢ÎMnU× Ù†Qo¢¿RÒ&9ÒÏçMîmmÜCÿ3Çz <ጄÖVnF˜—¿ÿ›é”Kó$PPŒˆ#æÂÁ"Q·;áÐÆúŠLÂ,PŽ×|&N¾ÕúÑ, Oêépæå&Eé˜M¦BZ2Œ-Òë°áŸc,Œ8ƒi5x1¿2‘B8“Ä^ßRã|®¦×ÊƬ®íò{zxFŒp¼ Zë‡À`§B³ØMD¦ÃÞÆŠ”A,Õœì:©6S®æš2$9žç¾)Ä®Ïa)k þhß²§ðò4ù(\˜M0îÑÍ«#ûòÅÜÁ=æ y5¹û†Ê HÓŠ0ð‡¯Åûuã˜z­ã©H¸ñ¶›”íéº|ä^µá8|à³å‡úù sa.·uº†~Ôˆ¦lYºJàÀðÜjõÌé±€ÍÀꄹà8Z¯d;:Ú~ì°!A¯X²Í 0¡½‚}NÿÖ#LÄh#4'°„ådÐ’†Ž1 7GT ‚0H3µ…ÿã϶MC"ܾ›™1™Í¶¥˜$¹ÆÔT®üšÅ‚ü R)Þ¿öŸ^Ï™q±œ…þ¤Â껫ugKœÌ D3›ðüºL7—_‡ùµƒÙßMÆZNY—ÐT ¡@×ÙÞÁQë÷ÖˆgðˆVs!Š+…\°ã宓†à—’¾ÁU3£ÑÑ< .¡ÉLžçØ­ðR¦ü7i©¦ðË€øð–nf¸áᢕˆ›³ßÅi<Ê ¯¿DÐÈJ%æÄúÅ:ª©°g¹ešÇëK—r®¬Ê̲Žn[ʧ–=Mð¶„Zƒ"KêoeÂ<ÿ?§aeðc&Ã;áªU¦öð`û‹†ùÿƒ9R#‚È«÷f€'”5ŽÜï¯eI›•)ïkmŽ™ÇýÌê›AeÏðo‘£ä½õµ›Žáfìÿ6?L3©ÉºEŠ^D·e濌ªY!œU¯ofBu.$Gç)¿ñ…:ØV mù®ÞïÉÖÜ["+‚Q| 0­¤Ïy-ݱ~?¥Šœoj“çm i¤A›µ t’#¡©~À¦”¤O·Këí¨5šû.\Öл8¶3:”u¾-u-´æ#o¦ˆsO‹I¿ @\Ø}ÌÒèÈ=¥âÿò|?ÝûGDý£'šõ="]£–äfÇNà†¬‚óñû˜ Iï/9»îù2+»Ål1"ºb« ÐvÎóâñÍQѯø¹Néæ5TóÍ$wcó)IÅîzŽ2Q¸ymåE NŽ{AžÿVwDâøêÅG÷ù•]Híjé&Ipy)™Zø·O:”›6\O#+ûwñàî² ZÚÜ!þa²wÔbdeÖç ò S¿ø´Ùd·hÍs_ Ù'ÈXG3ඬq8¤÷:.ã,2„œvÅ’=ƒ"5‚ûŽbä/^#–Ÿ¡>KÆR]‰cêìM6R~¼r9s¯2º½TÔø1“d·3*„V-ç™ÂÉ‘öƒêé§ QŒz…­ —œ¤deÆEÆö ýGM]!|áÅ2rûÃ?°y¹D4VäªÛÐ*§ÕZ}ßqCÞ0ÙšI&3£_ßµ&Ú‡(Ï…´$€Û±;IÐĹÜ!Ø¢® nH…%»bòMÓ Ó´ݽ¥©Ãûƒ“÷¹"?É+O°=ióâU„3×Ä¿ß#õQáLëªh6Dc!•d,Eî……’÷UEF‚SϾ‚-ƒs‚ š µþ­Œ.Ø&œgX×®VÈÇÍħp´~R4ñ o¹ž,fÍ…-”]Ò!Õ+É?¾0!Î×§ìõs/˜“(ù §­+¹0ýq€Öç{—SѵÞ3[ YÝ@ ùâ󕿦¾ãƒM·¯)2R4nQýªûîçÏÖ‰s‚EUˆ·P¸žžØ¾òßÀ6ÄYšãó (ز žý{ÛùZ ËË€AÞùæNû¸ ùܯʓ~ŸDÈöϹêŠQÉ!§A‡uq3pË\.ˆ¿EAF¹h6Mtè©{“?” /æàbûÍNÊB(~b>ÎĦÃs%6©ÐTTÈT¢0™û'̘~lŒ¿pT´T˜ê„j.¥„7*˜þ¢u‡kæ)TsÙþD9ÚË1¸Ä‡«ÃÔi¥É\Ùáë—¯z…÷X­?ä:L¯D:Ò#¿˜úVÀd=x昙)TÜäKж´_à1‰¤D l¦Â÷À5 Šñ@TàÊ–—v˜ü 7RÐöGÛmÓ—ÀaW,føQV‡²¿Þ¡‰XN²¼9Íß[›qk=Ï60˜”½xöIúÕ’v.³_æþéà Üs“ò?â~Kk­s<™ Q¢i°°>T&`@JlÁzÙ‰ž)UK5eÔƒ—^ÇäA‡ ÿ ‡7*RÈ¿ÃÂÀ~ææ°ÆÔsc}žÔðÉ!C¤€\¡u1¼5#jà †û²ä”|ºTm6Nq+¡UåÉ…²ñ#Ð4KQ·ç2¸í«kQÐ7ã]î Kuíʵý°¹XçWYŠP ™<{å¡1ñ‚±ò:æQ+)uèFBÞB^VwÓŒ‡#KÙ0L˜ê( œóq—‚ÆÀ‹MíÔ*lˆó?çihAŒSÃ:Ò1ÎTxðsÂïhNT×gï!—" {]ûþ9£X\:\È3àVј[Ì`ÄœO×9®'R—h£EFæbÇÚàb(”²]Æ9p½—»OÍh…·´ÇO~ÀSJ[¤IÉL³¨½ düQ:ši…ãáãXy° ‡öY’ÕyiVæJÂtùÖ,cøÌãh=™­Ÿ"Sƒ«å2?-ꥫã[¬*eˆ]ñÉÀ߀ÿ?Þ‘y Y{„Ñ'9d:È}®/ª*Q&eP*ÎÂÚÜŸ•вßÇÏÞn€p(Vô1Rà +2`ýZThàrÆ…Š4øÆ„)¸QƒêDJx1­öèwYÖq†ã0#˜]”{…®k’çÀÝÈF‡å^ŒëRˆAл¬>aW±b<–h¨™ MŽ¥6~Ü$áRâ,À\æŽï|ºSZLWù‹Sí—Ã_Ó%–µ‘’eß *ãÌÏxÝ"Ý£ÔºÆwo—EžÓÚ•,k-4ÔÛ3Ï„ºÃ'/‘!è㶉bì¡z„•kÈs+üÔušyÓýFú7B©MÝ †´÷1lz8–áŒé‡G#˼ê .½ëꆦPÍo½žÐˆ§·#q(åw~ÞC¦cê‡k”¢@Ãå`Hʆ×±\K]Y-ü+ÆÅzþþ·¤ÎÄh}ªë†ÛEðÊîx s5rÂ~ ­0ÃGj–p ‚LD‡þu‚ó`ÓV)Ù—Õì0iâ|1×Å<ý›g‘óÞ¸ôô,º*¸µýFÅÖA؆ª†¹ ¦6T:``B‚[ÃâG²0<Àç°ä²fµMq«N °ø"ªñQ-£Ññ‹þ@f,öƶ¶ÚØÍ¨ f`;‰~ø-çÑ5É&”xŒýJ:Üü±²¼<Ê\êt”0 Àø`´VX¡§ƒF`ðrÖ1µ ©Ñú[#aö4ç³MôˆVî^Bæ†obe!kƒIŒçkà†%ÚQ‚ìÓ®˜ ${= Ë[§Þ_}|Y`ÑYÀxÌä©ÂÍ]Vr.fDø'(z'ILÍ‘jÀÂÚºqœŒÃáúœÇ²²°0Û>¤j‚ázM™“¨¡ÔAÏ\*îòSÿÖ)+ÏAºœ.Š=gñÑgmIUûDžÄǨÆ3˺^Ûý S;6)20½‹ÃƯn ´-ˆZZ.ÑŠi?BÉ;r]ÆòŸrjƶ±=³HId½kÜ–<Àâ·¥'J; œæÅbÅ'>å* éÛÛÒÿ‰Wz3¦¦Ç@Ízº›uªÕý5ʆF8…Kwb«ÖÇo† /‚¤ ó×R–8˜@˜¸%¿ ·håZÀ%§l¦§Ì‡ˆ@+ißJù_ŒU_)Å{cätºÚ<  (ÁdÑ+Ó{ˆr q@2ËʼON¨Ï¨õ(‘`ÚŠ¬³A°Õ:aoÚÉ £ýC º±úlh#¼°Äl[þ‚á…™p¿6Š(3ŒÄ{Ï{)šÞ—©ááÙg{w“¡1£Ì9MÆ4úAàŽ¨žýÛþÀ÷´jãfqõ6Ôi`‚"Á‚‡<Æ ”Á¸uÐg)Œ@ãÄ“gÊ×뉄JD,tþܧ“p/5Îýe¦uòpìO±¢ñ0ÓJô?xÕyY¤êc‹†‹¦…rÓ54’ÿbÎ"œÜçû™_X«µ§ éªÖƒ³ Ô FmžœÁÁac0LS—£¥“ä"‰á,ºeXÌ&õƒ–žuÅý«zsZ4fñÊ Âê(׵ݠ¶¼Yp–ë…ØŒàR“¦Èä´µ:º¢Ÿ+àGãÄL˜€e·før4òE;…¿9USk°¥çmEIæ•áöœæ*—¾ýëÖ)¼ÿþÅý®ÕK³jïDÝ|6¬>ks±_…× †º=bÑ4¤€Ý¦ ׳Q+šÇÙˆóB–¡.·¬¼öû;È@.B™K¬q9¤Ž1'gƒP„ˆðº³Õ|‰·”—URâën?LA¤ ‚l‚ÝòM_§a€é”ÿӊ̵ dLø`¥Õ9Q¾NÍß³¢G©,Ø5a ÞóO%{²†il»ØJõœ-· ± jz~Æ^£Ùœv&R lhùÑ«¤Œ%.E”å¹øåÜZ‘ÌØüÈxMÈ]¹¦„ízü0õÌ8"Xx„±·ø'ð~ìuSÎîlWV«¶žT ÑùF†üDÍúÞ>ÌdÛÇ—°ãï*ÁÃT.âç‡ A)×uG úÁõˆ~Pì‡Ãv+·sŒx¦÷#Çt„èe;Ûd(ì…öOœG u«r4 -êç¢jÿ@°3Žorøt¥a³ˆï lÖÓú ¼BFG©s«qud—b›”Ÿct~8ñ(¨_n¨?xÖŠz¨þ¶¶¬áM-åžÂ)'>î‘KÀløá‚ÒÌ¡–8·}m57ŸF Þ±£Zœ½ z;\Œ þhxmäô{dÁp¢hÚñYxýa!ùZ®ÀÓ¹\gC¿1ÑÝ 8Øì+m¼t#y_õfv&>×u,T†>íêDAýŠ|u’åh; ¨üP£Œ¯-[W¬†#AI@Á¿Þ'M(õÍoA„—žº®ÏñÐéÌ:íô`Ætû•8û]=^7VO‘[«K)̱.%¹™:]xËZûd6׃ØF`ȧ¹Ë:qi•n¤JÈ^·OŒbÇJº¨1—¡G³®ÆeÎ*#VpÓäð{”¾éÍ踖ú­o‹îá¬m–´Wm¤ ¥;ŸÎ µ£ †˜á_Žø¶´ö–´ QwÌ-ûÃ^Õ?¶/¦(SËW[鎈ë7ÙͲC¾PÅwé(i+¨¨Õšƒí!~×â 4!ÖèÜÅÇóôÚ{<4=º^ š¬sD#,?m0›M<Úê6Ö·Ôшåê&¿LÔ ,4áu/uÜV-íªdÉëg·Ëe€Ù›¿ey²6.:\( ÁQc fÂrdñ²P=±³ø"9Ê1ñý•‰µM8ûþÍkQ·¬^gU,gPßnü–ÀÃh)nt¦F™ç£K¦–-–¸b$7$Ç'¶ƒ÷çžÆÀ`óáQó`ù‹[KVçQß/Rí‹È§· ;PÞA 0¥Œk9B©Öãícãr^˜Q¤B§0³‹Ð°œÂ¯åÚ˜ÿ¾Ç9á:Û(~µ_éݶ S`-…¹a˜ˆ€WìMÖIX+­²z¬Sesu¿0M®ò䔃îò~QÃe?´¹ð$C°j]j¹gé®ÇÌ¢KÉM HCâK¢#p%@“P%®¹ÿV?(Äq‘e9$Õláhú·ŽRÁЪ‘â Ôj‘g$ƼöŒ2‡âÖDen;ÖBòê‚”TÞí9Y++³Žíýƒlv•G†ÌZ(2š67té‡9ÂÿÎFd}}‰ârµû¡ÆEÙ`þÄìŒØs ”íÎÛ—ðBh ûë§üT‹|sYÇ\¿{h?Tßö‡Œ[}顸~J¬ÞéÓ`ŠÈlMÈ%¥¦b}èZ ¤¡Š®YóvZzcÀ%À”TW[™„…Y®@&hVP”Ðî•Ù-Û$ì~$3X`ÿÝ|ï4ýÖi£…8—›•R†â±6£‡ $I!µØ>øÆA‚.*·üRsf»>D ó¦ÚÂGm æ˜Sø´?¸+(µ¦¹i\²†eÇúX×@\ËÚ<Ï#´J@Äh}sp!¬hNä¬ôÅ[e»U5IÀØ€óyë¥yl§¸ôÌøæ+|Õ jºßŒ‰UQe8Óõ?ôf ±¢!j‡jc˜vi˜¦Á¯dR»Ñ<ËšYs'S•~"½ÈMãHÖôŒ´^â7; éb—_ùñƒÏE‘MQB'>ûöeÇíZ\ ÖDúÔ¢­mÁî°ZüFÍ!÷¬[ùÿß–O¡¤ˆ·ˆ™|_ ­š‘:â¶C莯ÿ0V÷c´fêÓ~V+?×ΊÎ{Æy‚G(p˜!Ä\Äyf¶C ™LC­F»›ì{!œ&ªïœû៮'ö¼‡ÞÙü¶Hvó©,ýÎv©8<ä&ÙÖyà i[ûÌM[èDÜCa;®ì Ã!’<+ŸÀퟆš¢@É'æZ0ÈZ¾-Ìs-×ÜëZ׿‰u’bý“jwMÃÈç¼V’ IóM\K¿›X«GH’NVdaŒóJà™FǺcÏyuáe> û2‘†bmÐÅ?œ1̲³˜3¼W¯´„®²6µÖ5ü€¿tð„fër¯1®÷w”9G§þ;uô£Ý"ôˆ¸ø]UÚ…› D\h7 ;‰•W³!6©áåAZ¦S/æ~gîCÒ鯫£({¼m‡˜&÷2—<Öþi럑קá£AÜTþ¾ŒéUk®¥u”.9å>»êm†²•£@ÌÑ›=H"Q¦?D«Cè7²¥èä/5k‡ÃA‡&ÛºbýJl•eB_1p^5!_¡p&R‰W Š*†Üö)¬8þó¢=F†F\Öãà%¨Ü[7¨}`ÎV6»0wŠLXJÇ`™]^´O±Ê²F±xjö­2MPˆ\Ý—ª—ay@0î“?PFR¬9¿{ELµ”õ=ÄrŽ›ÿØÇH½RÒý$«{Vj‘¼àWs~N–П:û¦ Q…©?²sõ7´n™0uía=&2àB깜gIPW_0¥Uõ7ñ_€í%{)6ýKuËÿ´Sp™Ç¶iWUعÑxeC'äbbð%õ”áø*…£ùoªi0Hé–`Y˜,@|H¨ ¼rú§úÍ¿‡ú·\÷A ,ú-4”óoçèÍur‰—Ï“®‡isìuË]°³-XyÏLÄ CYLz)ÍãýX¯`£m—q¬3$Zš'…ŠŽfpo¥;ؼ¶Víµ ƒ"Õ¹’ÿ¶…ÄDÒ_}HVžÉ΢Tæ3}€º†€«"YÊrÇoW²#bÔ¹yŽ;تD=ühtWþž G ä'ÑvŠ%¦3)P›Àam·úÅÙGmÄ.IJ]h;†`üãW8u—£ŠÈ€4鮳ð%GðCÇÏß2O8ùxÂPšóh¸)!#.Šò¨;ÜñsèʤËaÕYUw]•ÔÍñ¹ð\`ÙM<]7EùˆÑ?ÚGboãˆq ‹šY·nªîîà¿B7¦ EÁÕï$ ·åàó0ò¬\õ2¶º‚½‚Œú5Õ·I­‚ïõÑñ¾Àðj¡?ØH›s ]tÜNRšæKÓðVG{Î<•HVh}»„–¸S½Ñäe_l¦è³¾ÍñCmd/³úίØCœD¯9½ï„Äp7âb¾Úõ6Ë©Œ°á0®ñ-Wß©5GøÏ†©€ØvÉ4€êÙé”*|È 嘟d4:‹Åé0¶`Ê÷öd>ÕKÚ,Añ޲'ÖÃÖ0-/s >Ï¾Óæçrè–k5šBÓ«3–p‘ârK b›^¥‚XE$’‹ŽFp=5}¹ÈFÒ7q.£:{þo‘Þð½ZAž«º¼“%ñ÷w÷%hJøW"äZGØC¹ìÇ…Ô¬1Y0~çÅ#¶ÞÄKFU¤L‰CœFâú3Ê ¥¥JÑ“Qiªm Ãƒ¸9³HY_èÄJ0D ¿‚ÿüªÎ“Lª$…t¥5М㌞rÖ'Ù%ÓYcëàYñ¿³#úýÞr ˆë›Âoƒoż€•KæÜ¬ƒzÖÛ¿K8¡2æ/]´nà6hØìkò(ÒKTM¹çÆwÅÈÑ­VÞç sº,ÙŽe2&›x²ñ™´œì¢ºÅ¥²1°[•ÖÐ=²‹Ñ=3­ãpäRu9!íÖ;DªW¶Û¿q¿3C'Øy"k:0ÒÔkåÌé¹)ÀÅV±¨U©=Hµ.‘[ae›ò@3Ìxö¨óxÇÄQ4ÍÝ@ ·¼ú¸ï(×sÊ¿9³Œý7®±ŒƒC¢ùwöytÒ¢còZ˜šZ›3{[QœÀCJÜð)Šm‚hãÛ{§|K ó Ëm/Ó/€âíÚ6ðŸÓÈÑ™OÝwñ%o'>àj‰¥]Ô_Rpgc­¨‚M,›.°9Ò^Ø&è¸èÙg&VNÆø[ ¿ÝH?½kÄkuíg°cV[\ðª;|Ftod¬Ó@µ$XòjáãÕƒÈ8•ïÛ”V}k¨1€[3ÅÝQńϾ!Ì+ »¿}ƶø ? þÌe«ZWÔ`é›B½ˆÑPº%+*§E!*Ò™Qœ‚ª©{-K³ä2‚›ödŸ{wíÊ…4¼ø"]tÉZçËò¯¹Ó1¹ºŸ.‡ " o@^SÍ•X$fÃJô4Lkk¬J¼Ñ5àÒÍ¡ôâdþ_•ÎxRêÍL ldw~N \4•ÎĈ£™ù0Dfp–v‹EíIfGíb7©)ÎëÚå;Fð^CÞ‡Z“ œ²Œpº€5nh…8·ó!ÈÛEIàÆtÔ ?gL\nÓ´œ|WÏŽ\~Q¿c˜Ë­v3lØhŸ~Ž^\rÁ”ü8‡‹þÕÁŽd}Ú[½SªµÏN5þt¢&jõ¾Å>eçVDˆ÷²ÊÝÉ\´¹<˜zÛïhU–eÃñåiîA•jŒìÁs˜èO4xr»>Ž@?ú×ñd‹à‚ˆ2胥‹‡·el#ÄŒªÌA\vòqñ˜D´óS=P™Mœ3¼Kªȉu´J}hÙ.¶‘°”_,ÊŽQŠÈ®·70füßk]Íߢo|Æ·6°×Ó)ʵHŠ`lÂŒš¤„IÇâñäܹßü|‹¼Úá$_ŠA,0ü°þLç݉»ª€ª1ý"sõ–®šï¾Ýñ? Ì¤„îÌNþ¼NRh —Šë¬%Ïø™Þ´ì‡(¬ìÑJ„Fˆ#Ìz¤sï4œ^¿:{žºŒôŠW³”P2[ZJc‡³{IñéƒöÎ#&a€àªPJ]»rŒ´#COBW46Šo—j«N`ˆŒù·“•M÷³Ìøfl»Mš_HçŒiú¸°×a_çN©ÆÜ¼&_œqœŒg$¬Ô8þ¥ÎrÞ™µc£X[Wõ ÒHt¸·soáz-°v…Dñ:›£ùA‘ŠùŸgßJ³ Éá8Y‰­Æ5”ãí@—dæð𦜘/sØÛ¢ú ö÷'W»Ô¥ÏX•È>õ»—€À¼æeªÊzLÚOp“ü•û¬ÁOË8ý„$¤µd[l”wÓì]‡Ã(عx6èì3•먥hvuýúÃoÆþ‹Íufè¨?ÀÕ¾;¡ 8h$ŠØºL{0°J]r;N,à@‰¸,Aò•×ã=áJç‘L@Ö¢x¶JÕ££¿€ò…kC›O¹îiÄ3îdùm4NP7cÍY÷ù{ù%5/-y‘ú]søŸÖ£ÛS‚«¥ð8:™¶è9Xæ$cwÆ8CÚëžÂº>B2Ñ;mÒ^«›V(xɱTZ?£Ûß™”Òb¢ž+?³qšVÌ1[E\¾¾Vwk„KRùá^@ ¾«ð3SKbßrpS%FÀH:/·Ìô"»Ùh’>„[x|¬¸ ÿ‚ÀñÞXãÀè¹ã HÉoùešÍÒÒJ7A¼´(!zTð¶vÆœÀ[!¥Ó|ƒÉ&ÃY¢ë“b°SÄFSB1R†z…½bŠ Ô(jàzµ³c,0Ãuúâ©^^ÍŽ=K˜ØÀbuJ˜˜4U|!–öR)ûºäh`—Ñ•º£™¦ŠŠ™[ÈÂ`oe ó,ê%᪫ÇîtqòA4¤W$F¸.°e|Ñ2È}^`°ˆ›&,ï¦ Â} ܨ<ÛLn¸ÉW[³á-YŸº{:I´'M±–Ru•ˆú»>£&&%ë“ÓÅLÔ¸™¥ òYºÀô#Ñ<3ªyøKœ=qAºZ4™µ5ñˆfkO±:Cs£tñãàóÙoéyíñ¾.¦ué;´Äãà ‹ Sñ¬šÑu¬ç[DûÆXw¡w¼ÊL©qczA\N=ðŽ“ 55\ROìméw0ˆ¼<–L줘·E"Ôå™—ÆÔW¢ºKã´æŠ¨ÚkæSnT2ç†Ä×^¢$®yIÅe‰Ô† -góÁ†ŒÑ€îmuŽfIÅ«fš¢@šò>6V3ôxзú1*k)ù›¸P‚#û˜ÉºWÃÊüp¤®2nå¤26‡]£oS{p=H#+ªbðpj¢[ÍS2¨ËD˜Q40¨K˜éOÊy i¶Íq_|Öa¥:F?OI.Ý9Sã¼4¿%ÁHT‡ý¼µ®„¤$émàiÒ½ýmùFÿ2Ü› %^Ƙÿ’ñÓÕð6N"*Ë;Â/ÐûùS|„4F¤2V+@‹^Xª[¯À¨ï¬èþ úx¾eâ£Æ€ò‰Bywâ‡ÿ©Œî·ß8Ö5Fí€1ïA¾ûRqt:ÅôŽn1ûº=®Û¡ï˜]µËq{X’s^šÃç>wÿÓ—ªxé®—uÂj#r©å-zÝÜ8€U0Þ•ŒvÆ÷¦q¿¿ƒ5¹Sò ªÝ2‰œö{èEo>žÞ´ŠàlºE¬ vÎîÅŒæ¿ÌAÅ¥ K8~^Láô°b¸¿ðãŠÌ=Ýæ°úÀ¾Óö½Ó± ¼JDì<¾O¤¹¶ãˆ¿~Œ2¶Jîl;k8ÙÞ PôŠPÁƒÍu÷C‡G–¸ˆ…xŽÁÒ´¥›Efëin·{#%ßu¡ËV®O©nÜp–²¡ý”õyãeTM<ҮХM+ÉM¸Ñ ËBI}™‘ÑCj'ÚÓÅQ©­¿o÷àÅŸÿK; XÜîÑ]*YhüW«ž•I*ª÷YÄ„yºt˜@¾iä&6þ:¼´çvWÌ Ë¡YÎàþøDnĪ a2xwMþ+ o!AM(xP?•c»ˆµÇÑ¿F¨á·#p4EQB~6“Ýv¬ŸWšëÿè'öa£¾éVeµúzhÓ í æ9ÿëQ÷6‹¥TQ‰zñ¶ý">5Ê p5wß/GxI»MoÕñ|.“XñßÛhuã15ˆ%Šuv,Že;äÏþèÑ95‘]ÕäQVXÂ4Ùo ‰é–kÒÕ_Y €Ä®Èæ,ã¹\È¿MÄ=­“‘QSL‚Gbô‘m½A0@è5éå#9ÇWuàa¤wEªré.’xÝ7èp­ÿh¿vASŸ‰Ì'Ä$:gŽ’ \ÂûlÉMSÑÁ~ŠýÿâÚ_U‰Zø»`„”É6ÏNPÀ¬Cf6ê{¼fØr¸¬k¥£ÄË‹ 8H¶&Ö¸"ü¼>WÁ"ýD0Mh$ëY3Ö3ŸUñ£µÉ¡ùÙv\þHhdâ—V9æhŒ—홢Ɗb|ÿЧ»bÙQy<çÆ²Ä«“tŸžWÂbdU¥ØÄø$@aÁ}[‰Sß™TúÅ#ÃÁÅÙVxmö¬S*­¦æ)‰g߇ûi^;«G„}úß R><Û¯6*|Û€.ª’‚ªáJAœ-’´=lÑäNâ3&–ŸÜɈŸåÍxaЃJ…—µ`×\P@N¢,(í4‚!<†Ç¯s­ˆd‚31ãšÍZ³7Üô{oñèÁvˆ >)å.˜Õúðð²‚hO¢¡ƒùEA딩÷xÉÊœ+Jz­u¤àó A-újà$àÆ/ªkuŽ¢u /ÄÃJÅ&^Zùz±«-ax‚LÎ!Š{ˆÐ½TCù‹ä¬þOv_ço~:åo¸Gë¢%~èè±{§µŸ5 3!ù÷£(4þ[ÒÅœ|ÖVY^-ßó¤c £ Aþ„Épz19-×Ì« þ‡r5Òw…Àk~x^!©gôJ¯µÈCÕtC~¤ê\âšéøŠ{wùçSç¶¹þÍühZo³F@› Ü­N½V²°©ÇÚhüå~qîq¾ñq„®£—dH¦ŠtÎÕל×%GQšŸ¼5ÈoSX:Žšx§]Sm´…$ úpÉÎKzã­x> ˜»¢€ËæÙâÁà*‹„Qy^ò;§Û€Ð§E ‡æJ; Q„/tׯpÌ ?&ؤ\ Q½Fš*ì°¸6%ÿÒ»€6ÔçÓÖŸ ’—"œBz9v‡…žÁ Ÿ·OÂÛKwe\ß(Y¢¦Ã-ÀÝŽ_²ƒÌ5Šÿ}HlDëÍu{¿JQ’>‘•ŸN<¬kÈbêÐ`kpØx7„ØHØ¿ÓIf¸Ä(Ô¼úÖ ŒŠ«ï^-…(ƒÔÉí ?€EEA7ˆcb‰«¡nj;¹^÷¢™“Ñ%¡ íÁE.I®ŸÿÆã’@F1O¥¨(Êú]€ÆÃ[çnÿÃÓ ÛüßMêN áÏÚõwCgzìJÕ®˜“špÛÄx\ˆÔ=®6·Éò,l:f€ïÈušÌÄ¢Í1HPë X‡µP‡y«>Ý„ ihåß ,ºŠH¢Sw…جÛT¯Ü"©ª}†WÏ}²î™ïðFÆk^žæþ$`¸–l¥Ê”®C_…¡ ‡“mÆXõÉd×vIWnu †iÞ¾é§à¦k¶¡1#å¾Òx§waÃkêØúùxËDa14BÙ <ÖY@pVxÀÝ‹:-ÑK“KĽ }J\‘Ó”ÿ˜¯ó^êSÉTÐþ½y¸#*ò(_a3‡HÕí–º­=TmØn–Kâ äÞf){üË­{ᄇGhgCù»¾GŽŽ£ã.uud´©Þ CR²kZˆhG«è—‰PLŸ”åßëpMO!,K÷]z‹WîÑ-örÇúOÀ!q¬Ü˜k ”ªÅÜZ¬Æ›˜—1‹ÃrFh>è[ÑžVGädu^n²ØËg×1áTÈš ÷‘ðPhÿÈ LùSJÖíT âA\ó:õ>ÁHÁ¡i`©9õ%Ú ]P'žÕ.ùÔH8|nÎ7¬¼ã”7ýk·„éú>EpÓ=|ø¼ÁaeT¼Í"—5m¼2eÍ£ýr.e‡\ɸC6š¨;OK·d?‚ !§š¼0~^±`%“ú?—=ÍúôDÀŸÁ*DY¦4wk ¡u8A ûTá»ht„Þ õ‰å*UF]ôBÍ 4|óÜÂ×Bª›@Z…±SÕ8V9²ÁhmàœÞª’óu[gz€hÙò›ÍÔX>k¼ËÏûÆå[ÐY‚ìíRì3î‰1j$3ëª3íÀž6@`žÿ¼×(pâcý[{-¿~ëž¡bÂjf߲͜kðIi¼Á2ôÇHËÁA%Z©@rhŽcƽœñê–Át ¢Ì°?PòUÓùü©ñ|2}¯™Û:Ï›†Ã+u®¥ff¬ÌÖ.ô(0×{ym(ÖÑ ‚L^W~B&žG]Sô£žÄ’‘¨)º² ,3)ôÒZí‚ÏKüs‘6l\6jS(ˆô¶=ô)/çBî’dUŸ$ÜïþF±…”óì\é!ÜÀ–ÚUð6äy­J½¤Nã /|ПmùüzLÎNX úBíôJjéÆ×±£ycP!­ ÀqÞ(U©&¯ºoÛãÜ×Q›7$§ŠòVí²·7B{Š¢¨ϵÎTJ}Â#mAéµ_üƒ3ˆJpUsdûþýÖ¬Fi™†U»Mç[ŽÞ¦˜úS¼¾ £‡&&XŽ©`)cÙÀ»3rÂÙ¶”p|ú ik„lͧAîSìàðãݸ‚Á„cÛÍ-?ÏkµQ±<öå—Öä¸ë,È4ÌæbæôÞ]"H¶n비­³$ÈŸcUÄY[1Ç­‹Pè4ú*†»íù„æSSýæ?Úû±£¸¶¾E¸dþVÊᇶN'Tò¬¾h¸í•oMÔÀ\©ú¢›s"N‡d Þ4»§–Á§ ž”¶Ã Êg@ûJÜwœ©_R¥òRˆ• “ÓÏßñ»ÊJÎü”Å©ŠxLVè™}S_ìnæú¡ é·OÓÂL‚Kø¥»›¼Ô<¼È9¿3ƒ£Â¦§pÕQkhå‡h¨h‚þ¸zìÔr.{—Ó§^#˜§tMØQPoÀ8ÇÏëÄ’¥y#Z®ýwÊK.®Ép•IMNuu¦â¾Kv¶L' c'­y1—Ìq·ôþú–«¸sàþ®DVu”uh¦Iùž oä/ШœiJ¨µ4ž±ŽŽ^ÚŘ™OR¸—j¸@‹¡±fÛÄÃ:£t%Î2Ôè9S5uow¼Ñ ZwQÅyàQ=Ÿwe/<¤Ÿ Aý°{n‹™[GÁék[¼½•žñUÙtd¾Jçª>ÀOV³~ÿâ"#‹b¼{G¹×ì»”KѶîr)à fmˆm†k”²æ:Cb'_1Óð¦6q’˜ý°6^¿¨PµgÅ‹EµÕùÁ„ÐÍ¿ ãÝˬOìøE›ò4T!{qYS?)EIk*! ¶oþÀoÍõÕâÇ4ºÜÙÆ“ä„{‰IŽœí³Úm ”°Ï~e;US(·þY~·NVñº÷°6sö98<Þ ª/ìÍãÚퟕٓµE4}¯²ãJ]zCØçñ ,7ob?‹C¿«£ ˆHjª%[t¢ÃTmÚ×fä›õ¼ Ǽæ‰)oy ]™¡Âa!ñ9b÷„Iþ’^Ä×b¦:ÓìN‚Þ<ÙÌ(Ýjê‹b™\61ÏÅYEeZALÖ &Ô¢{ ÕOv¢I ô¿âþGņ¤…%›ù4æðÓ û¦0…–jšÃ³w¶;`ûCK» X£S…Õ<¬‡JñQ‚êâÞé,àÀóCf¸) wæ†Ôõ*o#JÊñ”›¥xnjÆÈ¾ll ª­ú* ]¬¶{Ëÿ†ÍSu[nJ©rÇàVŠ ¥r Q:)Å­„ù¶µ¯à¼3ùxW’·ë7A.?seKŸÎÈž‰òéê _¹¯°ƒtÞtùì/…†j¢ô~äÜ×­€ÊT)—>”dÔ€7rÚ¾Ëù*%ÞÀÐÙYÒFGûo&×!ï—qX¼Bκµˆ­5öûeà— ÷i=ïnkS´|ËãÍÙá+K?¼夵×Ȥv[‡~ H3Æ#Ršœ*!²¶¬ÍÃ'0ìÌ~ åüÛZCظ,ы✦b˜4„iíqõ㊅¯jœA [@Öí<ü`¢ºíŸÂ4µÈµ0¤Ý “zJgöE/’>|I—=Á}Gêh!݆1l,¶lúªÝðÐw½ð›;j¢ì¥jÜ‹ào[Âù š :(SG††gQ~ýTe6Žß»ae  ~’!&ù‚ýmÁæ§g.ô•…œä„ NÉaºµM)³iXaÓƒŒ$ÜTn<é§÷ßá®Kª¼“Nu}>,²Ð|žØA4Ô »ŸÝ—ßÐïBTW\Œg"ë ía WþÁ×ö3Pì½nõ?}·®·Eˆ¡€§Ô@vIìÖ?ãîc¶¦î­J˜^l¹OºA€ Ï¥9Pˆ¨t혚ýìÞUe?dª·PmàXª :‘.¢£ðD Û—RâïŸ>pÛáFBÿgcÏŸs¶{óÚÉr[¶i(1étjþ@ ‘'m%¶¢ŠAµÏ»j鱡ìtó¥X¸6Ì ±ã1f"¢Ý£³²/è’£ÇfviEÖø–«ë#,×NH›wËúBEg_¦Ù‡5%2aòá¿ú\= <Ñá¡ñöއö»z…†ºk7XÀB/^bQ:–FÌhwÛZ6r⢋zÍ?ÑÃRÞÅ9$Z*_µz*®„]¸». µ0ÅŽóAKÖⲤ¯×ó*[»„µQaÝPâ¾R~Í›*‚•¢FE6|›Ub–5OFt9«ø7JÍ9Ü[„´f’½° •ªbŽc=ÈvF»Ò?YÖÛÓHO[Í2h@¯F¯Œ¬ g~p(Ï/²#•Îc\ÂNM­ï$òmŽŠ‚âÔ2}††î„›ñwîfhÏAqo{ó‰#p E™á(ÀÁöd`¼p¯U°#U²ª?áký’,ÞÓ}o ¸2q8£g¾ ¦ `ƒL˃<_ ¹nÀ‹æSü‹NŒµU¿ÖÐ.gRYßïpIÒzƒkqy£›.`èT )ÿ3†Nʼw õÞÒéM}o¯f„Ì–x‹<VÐ5,m¾~‹€èBuúçò'øRš4:ƒ±¨YÍß‚bWpw9RL&µÓ8fHŸL]d cŸ& 5øUóŽí^ =ÈÎE\äÍ]´Š[™'7](¥ävºH½‹P¾:f(&ÌJÁùç©_*Gôn>„†®*ë'm¸ìÜu_ü~Nê舩îpùÙÈ‹Iý‰Ý.ÏšÏ`E[+@×Èc›Cžzp¼}œæÂŠ· }L–>ÿ1XSE·ôÔØ˜{Ϋ2Å—ZñËJ¸…;dè?v}\†áÉ`Á°È|öá*Û/Èö¶f}ú “ìÍsÙÐâº>¯$mž Æk§»[[ÑûEgFí"c¥Œóú g’ eøD >ŠÃÔO‘÷?lAE—QK@̬ë`~_ôLýu ”ÞJÀ°ëo¿ßÎVÉè žž‹Zž$!éÅöFý£)Z~iAP`—×gÑs#*àsÙͽòõbÝU©8uáNte ˜ûÂF ×¼-(ŸŽi3Ì”-dʳŠio…‹3r…DFà˜év_®šcYߘfºÅ‚ˆÁ»Ì{.Ó¢°ãÔŠòyAÇ|w_äæ ÄÏ·#†1ï1‰ÿ ¿!ªNI7d×ßG¹'˜ÀÁb,ö·{ÃP²¨çVÍúÓDáÅ0޲rÆH ^;ål¤8“ƒY½²x—éó]Úà à+‹_þX:Jå@ÔàL·Â»x8T+‡©¼{|Ø)p/ªùº<¨±³·µhD‹—ê €~hø‡Ô…¶UÍAgÜ8<&à$D‘9DÓ#BÈ •Ž0 m Dm2r”¥r6Eu;ùP¶¼A·99,ÍôòËhnlV'5žÞü$¿Û¼þ»˜ó­CRƒ_9©¯ã:e•@åWgÖÃãíUñ6ƒúÇ-¿5ïü'*”H‘ õiÀk[P?¬D}5¡ Â^Å-ÇÌD¾Ž¢¾rÓ-Í€"Û(0{·Kê /äÇ&àD¾øš0´œcËV·Ïàk0 È…$¬¦h}”Š–q ÏÚ²õX5ÚaZ+ËHK;{è¾)9QÖ1ξ¹KBîUf’Ò5ÿ×Ò1füÔÍõB“;¡HN%Êœl —ìktò=Íûµ8²¢Î Ý­ÏìøÕ!³ú˜  bê%ܵ°Óâ¦h–Ý‘EšH4HI›9Gó¹aÑœÍÂlNEÒRå@F¬Ò»wÓtш,^ž º%˹-n÷‹Úx‚¦ätâÎctRR½Ÿø -yöõ¦FqÔwW¶aJ4ª Џsc)˜b7{ûÀ¡öy£Ä±à5]òQá§ÛþÂþ£À%CX¿TÕ%†C„kñÌŽiþó^£Ó£;sÍ«\w¨÷²$äû‚W€KR—²4Lìš² Æöµ}cQuLk`r»}ÝÿÌZ!ؽ`DÖo5„]@Ì29ÓØ”Ý2‚0k0ëFیݾ×Jaü= îhïºp©KC…!‚O‹—Ë_ùLZ4ðž³p›qà$uqz콿SÒê”L8½‡KOE{ @ÀΣ½n{n>øßJ£Q±f¯D$R—¦Ú¯ô0IyU%ÊQtÂzSô8,· ‚JM†ÞUîW¤!tüÒNt—oˤm†'þêú®UapýÊGáëmï›´ ŠÏY‹Ž¯VÓ e}„Sç¢)ô‹Çˆué±/åïL3‰ó”ªÛàõL›ô{*+Y¨:/ÏÿGĬ*Ò(±kQâ¿è~-¾…Æá§qùå£ÀB±Í(ƒe6-ýZ<_p‡)ÙrW¡ÕÉÜQe'4’ |+ìÁJ$-{ÜÈ0Ïÿ2å9Ÿ"é¦R°HFÊE/Í¥³_MD9ÌN‚ ê+ÕÄò^…/*Š«-FAen|2¾Ñ^Žo¾Ìd~[bÐe÷ÑE Qý¯V³òàñÚŠSŒC·X»{4„Ü þõ ¿òŸ˜Ïß+Àáh’¨£gC½º=þ¾kz{1F<›}+ikQ(ZÜÖšº>$žõ+w ÃÖpÚMH¯V™Ø9 ©ú¹?Ýâ¿Èʨ¾¨ê'äØýþcñjó5yh}}V~ùŒmLbRt¼„ðŽŸi„èÙ=Ic ï§«)8$¿¡Öci ¹-ÆÔ—ŸH>âuÏ÷Òl˜²À¾µ‚Cð ,Ynjæ€ÜÆcØUa]ØY…í„xBÁ«è,0[‘d¤½Åj½¿þ6“hkK¼‰™+È|¦`ÚéX-I˜œ¯MFñª6\zÀÑÄ©æRþçħvbf‹#sš~®Æf¬=Ì©Tö^F‘¥›7eßH¹iÚªŒ–$³À(Ê–°U†y v!$UoÁ`¬EZ®7½Å쀄 "yºÆþ¬«&[8}CfˆAdŒš3nÓr/ẹݠ¡8†g ´Ý|~½Q ·S GŽkG˜­º/@Öoôµ%Ý/>RE›Xar¡–×ëFÉtÂó}kèÔœ­hÒhAG³´6>RÊ׋«ch«„²‘ÀÅ`&㉫pûŒµÖ[€ö¬(wÇÃ'Œ{•Ð~–Wt÷ef:”×ÅxAéׄqOÐmtïT&rÅãækï‡m7”[¬lV ¼%×íœ{—Õ[&¨UpÆ›¿ØN±>ßkß ”Y>fñ‰ûã¨>Y&º4صúFÄTRÄ.T{U“€IBº«-%3_9ÝKÛvµªxH‹²]Ïžˆñµ5¾£‹ žõä|sªIB–û‡²g†û.•2t–C¼^øçiÿ°)ub¹$iëØGX‡9Á`„FckûçRqÉ)­˜ÒCg£7 d”óP,V,ôþOÒ¹”QµO¼<1xÓ`ã4œ” hlæ­œÑP¦m!þˇzFyþÇ uSìB´‚ ÎÜ”c½T»R5µ<*ˆi–®»è(É8´÷rIIh8D”T Ê/!vpŽ·ôœ¤™ùœ¼4•ÏÉŒ©îw¦Aô°ÍO—ŒjãËX2‹=±¢«äØNñÁ<ÉYOPO¶¹@±ß«ƒJÁNY¤pþáER  ™JvQd(¬ ТÔçiÑS5TˆšªàÓW)ݹï&%;1?“ÌWJg"ÄQÏ£³˜ýÆŸ.PlåEª]‚Å/Š~»´üDO©ÑãKÊ }|htÿu+ 9Çrœ9<¯La]þQÇ¬à†¤©¯š\EŠ{ª?Êbm@¯—‹ý<ÿ0!)”,̵?'x ìó‡¢{CõÉüø¿êö Ð98EN¨]†ÕðÑ.í1åî±P:~ó¢ï±qÌawÆ”\SÃ&^céÿ%°ÚŸÛLQŽKÌ•hè®íˆ­¨‡+Š*õþ›ŠŽÑLvÚåãŸÇÞ„ÌçVÈ%„äþ&à½ýÃÔè+8¢Þ2§¶¿ƒÿ+ÎT(Œ1>Í’­8.kc®èXÄ»ñä³0¢€t€9šFªKÍ›ØÙ_ƒÔ÷ì'¯]§Ú“c[¿-‚âÉfã‹®“eí['€.ìÙûamf[’øy´æ[ {ø¾Xáý3å«Ð¹ú¥ |«Eë")& dfBYN€·ÿOy|¢NªŠ:äåIžÜ†¼ÀD‰sèÅ0• °§ 8ÂókÄ×b}˜ =Š ü‹KibolZ]N>3gz—Z1ð/»¿ëÒõ)«“hXÕ[õ<"¾Ä»Lx.{s"5F±$Wµ s|xÄBþV¢m(oÇÐØ{Në;‡°ÈqsUgÑ9v›1²²x>eƒLüës᛽±%†0U¥D¨ È/çê\èâ)Z/‰/üÜavÈ£¥][ÉØ›EdDŒÄMiú|ü-ß5=™ÀJ~:“£hÜÚ^v `Ú=õá)±¾2 ˆ=/&ó®gÍO£1Þ¥7;[Šæ›=½›2<öí¿ÙˆæÐañÃtheû«¥v"WE ÿæOòñz&5’>Í4­ßŽx°ÖñCI‰-Ô’>¥¶µÒB¤ž©‘ü9§š^Ñ;÷ç½Iw·ˆê§$ªˆ¯ SÄ€hÇì¡«qûžH2¡Ëº «Xö”g<?“ÕÑÉÙª"¶˜Èl ÇPF62aá©(ýGqyÁ¤.ÙOhŒrºeË[B¬ºAêÍïæðjÅÖÎ×nÿ×`CàN»“à6â&ÏJºŠ[úÇaý„ Äz.Wxl¨å,¨IËÞæÍ !ôæß1ˆoa‹ûªëÙ éA¬¡^½ž=ÆŸèÆ8YÜ">Cõö"Ìéáú²}@5 V3ßj S OÝ••"H®ÑèÇßr¥I2öæûÙE>ÏŠÓ4ëŸÙâbjCåžù'W¶“×[ëp™ìa3OÅ ü{Ÿàûúºjùª‘ 1èø„  ææÆù„ôœ á'º-n£(4(ñ_ÍOEùÍBauGùNl²×VvøßðãÏ×a©JÄK-Ë^B­ƒ>k™Á&@â ´¿œèÖY[¥òÙÕUžòñôj)ÕâÆë#’lÆ6p;4¾+°™G^Ú^‹í§ÙÏ'M­+äi\ø48{n³Î…2@ë«Ð}í®‰DÕÒøÙ1ð_ Vù[iç°ì,4øê´j°Ô¡óÆ 3¶3Ø’¤“âÖ°a„ÝÆmJö3r(™! O¿ÈäKžSpJÝ÷Fô|ƒEHæ1NE9A+5Q‹¾iO^ÂÓlØFˆ5ÑG—É^‡K½ËC‹ñ†F-YÑ]lûùbeÁþ5ñú ¿ñ!îb KÈØý‹½VLàû¾>>>i§Nvз‚!ܲŽÿû­È“cÁ‰<‚< ßYÿým`cQV…³âûĈ;"ÝAeˆå.W‘g:ê€R™99ϳœMæÕ×jòËŠ‹2ˆ¼<—sáÛg¯“Ò~ÅL¤'PcÚùul(l‰?¬'"èúEI+a\à~7ÂåbÂ}¹ö+fwL>S2`\¿Ê†?~vÄŒËÝ[³ÙÁ9ÁÊ>FŸ#4¨ÊB4ˆ­b’buñ  gÄöç~ -àm'˜«M©ó†ßá¤êЦþ”½u $-j³5’Š„Ènm*Ú¯Ð߸Þëžy´w@ˆ,6ŸÌr¬o¼'7ùÓ­ M‡¹Ž5ýžÂ~þ~«eûÇ„·q°Kuö‡¯µ ´(á0;û•BVƬŒCU±0ï9•»‰0![ï^‘A7¨Æ.ßÔɦ?±“ׄê¶iiú³?ÍÉ÷?o§8ªè¾¿¬}‚'©aÝÆ.×1ÈZ·€Õ:4¨>E>]œNtzº>ó ñ4GP[ˆ6*â¹™Jpèô±Í¹Ë.¯jéš d¢féý“É£ºyò!Ò/*äÒ¨NøÙ,þH\nëqN<˜–“ëÁRñÕ»û{-tEšTØØí5›¹þ³)é6îuu|cÏx7‡Üb4¤—w<ÓSÃ3á2ï‘Zúˆ¾ËÚ`håŸô’­#Œ—ÕÅÚ¤EHº¬Æ%Ç^üN¤²¾À|9‰z<ÊŒ/@LíR €çrQÜ•$µúšªÆ8øKùå;«Î.¶Öœ™Ã¢ ÀaÅE^&Õ ‡2¦YçB¿z*Êä¹û£J8CõþøiÆã+±‰×DÓZørg3€O‰MüÙÈ‚L˜„Ôž×5;úa¡±÷ÃɪEÉ![÷/1Œ%k¥ðßEYñGýäØŸM˜?^Ú«f¡Úݼéý^2Þ ¿û0[%ªð68ІÁó RÐ"³»¤(?•—M©¦cíÚoÿp;x…Àðd‡òæv92…'˜GE¡™‚½ÉJ>0-߆NB RrÜëF§£ïGV6•Zga0[·ÄF•sd&™½»v|<ž) )Ç‹ç+£]!.ôJȨ÷6]t é•÷+‚²:_¼•&@A! ;êQþôˆ_Ø-DáèâjÇ*’2w˜77âí°R÷µÏÝ,È 7[PJCN¬„à-J®T´Å]3Sx¡´„ ÉF•íË!§D5iì†éæõŠ:@:!°äJÙs£Ü2‰xÓÊÛñ$uÆ"f¬¿$¦zV&£¹ZvX´ k[…$8°<²I‡ýLÅ|YHÖ)êB¼·ïG>Ÿ‹kç—m‡ÄÚ< PDÃYyà?:ó¨mDˆÛÓúeˆBø•#Qbí=¦ÍÇvË›º/Tõ¥(†.ÂòúH«¦·ˆM©CRwps©q‘GTtÎyÚ¾æá§ÂiŠ}«grfºÌZ·òD¤_ì«0™xL’Àuh 6·UÕ¤™ 7F´Z<1$¢Ê¡Ì=˜(lý>›ã¼ša”8Ÿ‹—RÕ¨_pòß I&WNÝm·3i ¿¤èDÉlù$Ø+™1iƒ‡ü€-{æùÆËj¨+6àÛYUãÔ)驘¤z­Jè°ä´ÖŸP僧^7:Ú·ª>°B‘Êß”?æªZ²?ÑÏvlú´Î̓¨£ýGA®Òá”úr¬IZãT¬âXf‘ó°¼ñÚÈ®wÄjÂó•û¡È#м-¶c#ŠóÌ@ËØM¹îF‹ž¡ÖÝh}fÛ– OK+'5.W4húç'&üþì*Í&Vf™E¬?g³:8bVy0¾ôU&s'ÅÀ }6t%½øêŒÀy±]âÃ-½:¤ö5T_¶ã$€ðk~vfë]NoU›µapŸPÔ¯ j¶ß.áu.Ó Êr„YÒU©fJÉ+aaÎÃ,bT¿|¤MT²]-K ©Æ SÞ§ƒwMoZ‰TŒ6 åµ oR*«‰3ÎtÝ€ÜK¿+Òí`­L´[Œ?±-º“TÜâ·ckC=§;XêÞÅò2:©Òáä®)?ˆù[íeÁ=€®®ùÑŠ0 ~+Ø¿¨œšÍA‡…ÆÅªáùÁcˆO€Þè°³ùœaM^µ¸DeE®`)ת׬‡è·—3¾ #Å¢93–„`½X¹¼øbâ·£ui¯42ŠÁgûÌ1—”w3sH™²…âv˜–uSøäÏp <”ÊGœé“ÖíZ¸—-AgGŸ‚<·æ”â—È·Àç°Nz¸»SYøÊëȲ´­öSøgÁº <äÈHàLF¹¡ÚôÁMaÍ%kÚÀ œ¶ä?x±HM7Ò(UuøÎËtT¸×š3<+°i±Ø¤÷F«t†$‡Êr:|q¨ÈA÷hü8¡Ô‚HœjËîp`štÊ»ó쉫q“ËXF«bN/0 [¬qQ oè9X´îâ»!âQ‚õ0ºÛ_š_Pëî.ÈÀOÁ+7ç53× •OϾ5Ø»$·rÂêmÖ Sz :½¹k '/kv¬‘W”èR'><¤Sd9\À¹nýîàÆ¯×Õ… çç›x¼oZùxÌ|bw,û”[½Ÿ3] x[˜IrT%teYn°C6¨Ýõðû,SÐo1&… P$aió„Šl,-WÌÈšAxÁ ö8Yç,À5#€ë‚É—©ÍÝŽEÉãXÙ£Ì?¯„\— …÷ÑÉwäàÂ×í¡ðÍ ­>rOç|ÒƒéÕŒ?ºáDVJxÍ„`\*-7¤ ËoÛh™ZYJ]‰&€ïªñ×_äË*<¡~ÄÒ í¿°=†*Mæ¤ ¯E+8Q|oòï‚õb>8a¼-œ29É«šðØ¡‚eKû:(œ™˜ç¦àÿ1¬KNåÊx^íbõ–©OàW†Œ4aИ<"¦#P"Ô{“=q·<ÔÎpÐLòú„À{¢MÊDˆ‡˜^|@‘•R†¶"Õº£Mï„ÈXÇÍâé+fuøË%ó ‡¼¼…Eý}+P\¡ }¸£•¢ZgЉõL·Êñ)û½§›w‰1l>Õ*ÿT›î4ÁòX(p—ØtbÎrTt¦òç­ Ïr+߯Ó-Ê‚3Ù#zÂ0Iª{$’Œ—ÛB¹tg´ãÙŠ³BËqqߛψêªú½«|ŒÞÁ.¨ò øš~h#èrŸŠ’2"àµÛ‚ ™Ö|Þ3M•¿œh˜IB**¢>'Úqðq–ëX¬nSQìäWwÊãP’lËWeܯ7¶lÌv€”ºµsí1¤–øÕƒùUízP¶óÍ5¸P1åQƒ¿ðÍýT3ÞÜz9¹ÒƒBIñÏп×Ê{ƒ€¨d[‘ñ¦ÇøY^–ÝÜZs04 ÕÿW¸â¿g°ÛT¶d4-ã/ ‹ÉÚÍt½†V=S)73@£OT0/ò¼²ë–OþUz]¢ H™ZQA½ÓïçPÓ¼FClÒ£ÔŸ‰ÑY BŸ¼<)C‚üæ$²è#=‘zˆ6§Ûi½µp$X#i^jåÞÐ,/ôì…¬2´ÃÏ`:l¼åŨà_Pç»W»âBé~¥'7qúcO›’†šzê0hœ¬Øž¬96F‹ò0‡â»_M§.Ö5dŒ=9ËOu‹207K ޳ˆ,ãÿ¿O{ÀA°eÐŒ|(tj™“¯z‘ëׄÒöº¢ØÂRÖ¹$üÏ[ÙîþãYQRý€µëÚ*8敞 $¡LPô:¢¹ùåÄòzùÈkªõ[¨|¢œÝ‘¨Ó3™(/×t½¯;K'NF«zyÓ:<ä|¬OJ`–=i¸ÒZjhâ¹âÂ4²•uµP]þJoÙˆ¯x+MÈex°S×é^Ó­‘-q8BÅ+ÄüG99ÿçäŸaK“DQGõ*_â­e­šþõvç±²ÞÄßJªReÕs–Q)ÒÓ<ÚþYi…¬._xŸ—â+‹àSïaToê´žfw­¿óS×›UKÒ¢sí0Ãîr Ž]cöú<‹¾V¹åƒ`wò¥¢Ž¯ñÕ¿Uu„^£JüTÎärpGa®*`ÌbãTê[Ãe`…ÏÔ·åÊ1Ê÷‘G&åÝôïó¬•㢌”$µ~G'|þl}Œ†‡–ŸÙÉæ}]Jí]WSU¶œßh͇Ö/S\q>?]AC¥ë-–ÆDK/˜,—üì&©ÂózßǤŸn×Ò&¸¼ùF,%Í”ýašôòÖÄç®·–Ží,à×ô;ê5úÝ×*9ò`¹\}…Ûò@QÕ °gü’½Ö•Ve²DBÅÂÇÏ<ã¤íßðœ·ÑËOÎñÌò³¡A­ ÈA4„¡H‚½Wõ4˜Ø%›m±Tbuoªzò~ª’›uÌ´¨ˆäyù–}$À#‡"F8xv‡u»­–Ža:aRê½Iá-Ö™Ì]ôeOVœ#%Y‚fòR²7ºÂéÁòö3¦€jWÐoÕusÁwJˆæ²b”Å[¦Ã0Kà ú/‹Ü0Œ²ªLe•oõ³ Î2`Þ×ûZœ)tœÃ)„ÀÙõ Ý3˜ãÞòÂjþ^åkj–ΧT-gD&α¼?¶*Áö %Hm¤ð ½pW *¦u ·ã\ŸÈKNÊÿ-ãëŸ 8bb­PµsD”œÃ6Q»µy[ù6NÖÄ㑠ñf1dèLÜWáðSÐFë»Ý§…zÏ+×ï ¬=ìå2©GéÒܤ©úeᜠ†èf0-~p(!ÉGÆÁÉƒÇÆçÚÎô:¿ëá¤Á×®ÒG; ,ÓãXµ© ;çƒÕ~£h¤dv7ˆ¼°IÕ}âÚK ëyGUq‡ÛÓ ‹nHw0Ãp0G1R–H•ž@1$oÉG²·­ƒË Mòåb"?ÊI¤í‡çÍF\ƒ<5‚×.#¢b7ñ@kDôů"r¤2Úaw¾Š* ¾noóßDqR*ã…«³ð‚‰Já.Šnš®e<¨OXélYÖ郦үøç úШf÷8LkkAü]ƒ¶ˆK¸EvÚÁÏV#•%…Kfñ~âmf”d ×Þ 0k÷ò'Ô¨.Û+î o“ºgpSÔ²×ÚŽÑãrYö•§=îpLruß©2À­{À§Ä^ùðìÅs¶²~0|ƒœ¼üˆB-µrrí¾b4b&4ê–G „6%x—󯿡êÊçÔ¢ˆƒëåÊŠ™œ¿!Ó'£Zîø0i=ü˜ukˆÔÒ½N!u§ÄáÙcð#­[礙Är±Â6cLÖ<üHËg ˆæW’OÀ6aÙb>¾Çé€/¸Î!\"-È– =Æð¶Â©•SÄwfŸšõÅõÎn£d¿ìçÔó3”fI8æþ´ê :ˆóð<{ ìö—>k÷+(ú‹R2°¡)nГN•d¡´Ã§ ÖwÛI°h¿æÉêÔ@›&v,ûÐêTÊ\ö¯jg$+Ÿ}øÌMx Ï~|Á#XË––0_X£{4é•’”XÉG2¶F¸žÃËÊG˜Êö‰=âÞÛ•?»ö.3{\«é¨ìœÞï!´ÛT!BúiÅìX („v«&DïI9}HŠ9 FÌqtª$Õ Vçê8` :'!?߯hÕÕr] sf|6ÌodAޖͳžc·Ä4ÌìêI&¼k P¾éÖ]Õ"·±ŽÆËa†CW=†<$Ž®¡š!΄wôã4@•«?0!!À eÄf†­³ØNÜö„9ORgô%®/#ë¨Ö³£µ°á °Hæ–,V6´¬ÔSSý^+<ã>Êf äB“ FWÚIvèÙ¶"­ºC.2I¼:`߯ɋYÏ»®ÚD„œ Ö.À]æÿàmÀ]4u ,“æ÷³õ"§÷uö±'ž•ŒÔ+ˆLWV4#3ê‰ih+žp¯:\CIèd8UçýÒuÃ~j¸dBqHryV/C‰Ê×ó&ñCKìȇ<ÒˆFí¿Ò<û?,'l…¯’T*ÙXŽçÎØ_ò•ß²Ò-—GÍI–ŽxA4Ç”³ê/.ÌJ¹ÌÝwr˜æiVï¼öC³)ºh¬dXîÚêæEÕ¬‚"êný“ç¢ÝÜ'IÔÕ&Ù)=N÷ÕôfG9MWÛjOŠZÿ_‘£Ý>ù2ÈHÙkþ=ô¶8™³@Ï:ΘËìqˆZ¶e»cfÜÑ—3{Õ}—»û÷»›\¼µv0¦_a½QÍ®CfF:(RPG!ZÞü\tã=“ãELþ!úἇiÜ— è¦?3ò3[ÇÖLÍz>²Ä?ûÁr|e’øóZºá¿ Æ©ƒÚÌÆÄÿ$(7úÜÌt¯ìm÷uxYçEWŒ>,e£&>Ò@‚­'ÞèSåÀ`•Ù,ü->uì`ôy‰¨YBY`«eÊ=ùÌCú€“Ešƒm"]bâþý¿k©ØcN !Ý‹{²=YÚ¹ìÈÞÓ˜ªê!ÛSžõØ"Á#Èr"‡±»GïÅJǵ¿Úg[+ 鎇ö•,´Suý§T 7bÂs†@X±vƒ…£bOâs“—£ŠÈ£`à’kç âÌàê•L×Ô˜&=µ‡ÃÉÝ °÷Ã2U„ ÇýŠøÎÆÌDŒœ-î«eÁ"Èv¸2aÄgÛåw)—²ˆ' KëÒî)Ômú„æn"¨umŠ™þ)K6jKé×ýnÎÕÿÀì‰ÌæÞ{›À(vµïse,Íqü†ÃvWÇÙ"C°Ÿ?Â;x©ˆÂ7 )âæ~Ž^†2òZŸ˜z¼ûp‚#ïÒµ3â €Ä:ÑŸóÖ—Ž'=tlê-äOj€eÿ_ÉÈÁ~¾ŒìôÄê!ß‘ªXP¦)j0 !縎™QƵãJ?<¸þóÔ¼+I =LJÔ¼r³¢Vçã½ØÅ Gû1 T“pižÉí"…ô{{½8ØÒü»–{ ñQbIFN8zFй©Ú«gB£–[˜˜Êq×ÈÞŸr%ï%{alô/w[6,N-:ŒÃ éb;ÁÖ›ÖAtìÎJ¥"®ä Ì¢ª;uö ÛM4`=Ì-¿föÆiE tݱéaC+Ñ„Rš¯Rw G8KçÔâ9®š‘91ÈÎa ¢>1˜MkAA¸Ë ö–ôSÆ—=ãÞà)€¶4pŒÿ!Å–Ä„ñtÓè%!ÕÏâ¦{+:}ØD*Ñp™´Ž\«ÏðÆ9¶7 ×Ir™K€Èˆæmý;iê~€‰¨ó°ÀqûÍuT›„} áS_óVÜ¥æ®úÞO6/]ýóX¯Nu)*où_–x‘k<ðGy°Ú̃CöK ‰ŽSœ9ÔôÚÿ_µóV9Â5ÁZ]¦ â¤â Jf3ÞcîüZõ#luŠÁj. û™] Ó½ 6;ËÝï#fF¨.Ð3ôØlõ¼Aà-*¾'ç÷'¢m €.„ž½p‰õ:¢ðû„K¯ÞØÍ}Þ4|¥» ˜¶QÄÌrb2·L¿ÿ©ªÅÿÄV¦Ñp’€ñÁE­]× Ûœÿÿ:ÛÈJ‚˜5†²xIñâÁôÝÚpƒ9ͯ‰_b^!îFÔá´~Dôe•Ujµ?œæÊ9&-ËôUðL ùlf§âÕ]ý?€ô~K¸sŽöVÂwQ%á£ï‚NÉ€›¥º {, ì͛ܪwÚŠE–91$öà‡Ls6,—–…úyÜÛVpEåI»ç¤ÞhµÖξþ.ÎiC¡ìtA¾1`ŠûÑn“ŒÝ\ñ¿Ì©Ÿˆ”awºÛ‚–0=PyŽ v_lCׇzP·Ì;O :¨´êß;D-UÍQ"ðÒ’$Cˆ‚!Ý 8dªŒæÏóˆ†%MBÇæp$;n¶Á¼1w͆²|…ëKMÒR‘°q’ôÈ þß~gn´ _²_•˜Ç7f®^öo2Ñ„õ¤[á{"~rÕ 3îþû¡4€L£ð¢·a‰øüëÚ×”¶¯J#•L?lŸ¨0_Ž»¢¦{à×¾µÒQ£m}Ïí%p?Ðÿw-wáã`IÓÄ­$,Î ½scáêMX8Zñµï“$¹mÛ1œ‹ټø5éåtš_…ýË„¯‡Èqª"6ßdoBÇ{Ž¡Æ·»)š˜ˆ}¬çffÇÄOM4”pJ¬Ž¥é=‰aNÊ-•QýéäLUMcsŠ;×Pe÷MÚu{c_»/ˆT¤Òpªû>á‡f)rà&Ò«Ÿ †s"0þÂrƒsFžy/¿Ý:4áƱ¡bšâmçĨ¨ñ)Øs‰J“Khڣ̦ ¡ºíº9×&©5XðÁsì’€ý/öÙùïüÃÂæ*í‹È^æ2a(áh4ZŒ ®Žíý3Ý×” fZ×däy< F¦Ú—N©ØšSÖé S½¦U@›P„qkæÈÛˆé@j¹æÀKá5ÁÀœ]æ%'öXãyGq›}Ž2Dþk’áýñí9€ÇÌ™|“iÅ­ Ê&±©Çˆ®#ؤ©aÊ*Šù£§—dt‡ýî_‡èûǵÍ¡­C;Ž"§°r”8œf”,LKµõSœ|«ÐíÑ”%!ØëzóywÉD:yž«a3;šÎ^l¹³Å¼¤OùDª‘£Æfx|Á7¼õoô¶uruqEÁ“L:Ââˆ?X°ãØ%U¹™jx…’GY:Ž,4ƒž¥ 9•gW§ÅùN<Úç"’{⬄R&FAÜõ²×<^^Ëœ2©H:U¬²[$ŸrÞÓØ’Š¥Äž…U¬ègÄ‹‘ÀìÇ#ê­ùsp¦J—ízàý„÷lìáÈði\JsÀë•æµ®ÇÌdXLL|¤ü¢ýMs®7¦»3[Ó!§™U╤ %elËí-ÖààH¤BáC;t 幄4c×ÏÇ©ä‰hÔʈى𯴃“·SN¡iÜh¿éóÊQ²s@9voå9n%wóû_Í…‚ y #ú”PÙ.9“êí.„”øP^»åà K¤ ½m¾Ø±G HlsÚœNÖ €A 9˜6ÏÝW.Þ·~¢ì6¯tP@À7–£pK¿ÿÈ øF]мÍ>V¾n·Ž…§ò5ÓÂÌÍ¡xó…ö囘Ê`‰ØÒ§ÉØ à’…®ÁŽ>ê±t*ûŠ•I0XjNÏéæ(,N´÷h€€Ïk{Ð`,àéí äç ,Ô?š‘}Ù¾±y§âiªXKñ?› ³¦>yv=ú?C†Q÷Øâ`Å™›&+U+AÞ‡™Oºê‘ÃÅãÇ›5䌰íÍ“T¯ÍŒqÞ¿eˤ³Ÿ„­ÿšà£Ñ U§k¦/ÏÖóX¸ö¾ÉÊ`n šƒé€e;¢*ðKçv6ó}¶úwY]… ”É2Àç®ö§»~V,žN?cåÉÜí¾œ¦ Þ&žE¢3ž9"Ç)irõ+b’틇›×à«‘U¯YT}På7ñn•î¢^fÃg2›Áñnƒ­ðÓÄGºnš¡ƒÏ~ìüN.tŠ’-ÂV ÄÁݱ56ë„6ÔꎖKs· qp7…ñ´Q<ËžGûÀŽ¿i~^ìï£ EýQhAÁ˾žÚJ[Ô ÜpBdù8›Ïv¤˜‹‚œäwÎDüÓÀ,Õ^»]Éü÷‘hñüN6Ât†½Ö£»®†¸G ’CA¤¦J\ËBÉ–,>Ê£&ýÀQõ莈¬,ͼ1 €u_rì×%JúšKj"í°š–øŠzO]w!÷7JŒ¡QG³3¶[÷›R`ŽŠ†’ícT )ŸPb뮺Ó-òä­¨tñkþ BñN„#>y…%«¹ÛBoRÿ%}p¤×€È†DD…÷ò¦zz3±T“;Tà1 ò·â„;9$"Zoä ˆWÂã!/w©Ææ}ýá]º¿#dP³\·lNøö§úÄfä3gqgÚl5|{ÅÓ¼ÅÔ¹‡°Tm׎ϤtýqWy+ïF1!¸(KlQsñq(ŸÈOÏçudŸÂp3;Fßí‹g8EÕ.áù—3Ü„ú=ÐøJZÿ®ÛªÐÆ. Á‚jz’,æü·_wáÔöŒA &†ýà{*SLžù­¢„Ÿe ÂpG[J¯ÙÓHv¶âu !µÇ:zïl^|´öÝ…Ê'm‡…pqåüc`U"ºWk’ÄEà–=“D=u Æ>â;j32vþQW™*¯ùƨî_ýEJQ9‹ÝÇÍÎ"ˆx¡IËMh¿s FB"±ø©Ý+Æ8+ÚPÞŒu H‚èO9S‚ú„꼌lÀMT38ËE’ ”’︆”¨ãàyK„àJ þsØ4w}ÀWòíê+ÍŒÀm<“ʼ†´ô9¤Ó™ >¡ðG¾ˆ(^û•¿ÿÁJA®ô¤Di¥7É=ñ<žbzæ¦ÊªPÏ:PzÀ· ,—ÊÜg¼3]$¿›FóìcºR%ªe„@¤É=’§gb=Œd¦š;!> ês1ßb®¤ûe(æX¬C'´ø{Xú]/*#9%Ó#%ÿG—ˆmÆç@GªÍü[„(±_FжüÕÎÎ,³8µ—LéWö•'´ÛᵜӰ*\å…€7ËXìåÙÒ=}ü»Þ³1q*Ÿ»¯© ¼4*+»uý‚à´Á½X¦²/j®•*@CLÐdY0q÷ì¦Ëûñ;·qÈ[Îð¸ÒK¸êNpõÿ2‡ˆðr€ì—¾[ÓOå¦{çðõÄ{ÝAO%Ïþ=¤I  -éNÀ,c£[¾uªà‘0I°tÙt$ôºý5x}ÈÏ·Á† ’pÚÄHzi§züoQîUgNöÿžø–ï9¥%ï¦Y¿(ÈoU- Ÿ?`z(ÎäÆþD‹3-*gÉe²‚”?ÜzQFáɾ_³ÓØ#Êg:«TBÅyöÒ9EÙ ,–²ç3Ræ·ç\þ5i3 È#¤^èÅ* ûy×e‰QÙa7­Si5k«ó'xLe Hõ±Ì¢‡ $úâ ¢Yñ<#¹â`6tÙÉF¦LÏ(ŽÝ¯Ú¢Äñ iZÓ¾öÙ\qAlo'Q⓳$O¬ƒ-r9²<¸0J Ð3lílãwÆ~ä!e10Ù(¿Ç‡”lÒâ+Ñ–úƒ0rê@+‡y«aD¬³´1‘i£ß—lA>†:»ü×qêP¥^UÄ9f k½!Xo þºüw€*œü»HÁU8Íó "Bݘ/â— nPù LYUG–Ù¦YÝ.^÷{žÖ]­Á¾Þ¹¿gÖãŽKJ± » p\.´EŒô>$ó¬é<ÐH{®®~‚ç/ÚÆê¬M…Û#èú4<8¾̹jƒbΣ½üaEhŒnÚ±oß1Ö8°•þ!)®hp·‚A‚è:¯&ºú@´¯ü¸ï¿‹w¯ôË—a;¬D›g Úˆ §8VõC›p°4b·žU‡ Œ¸¥ ÐŒ’fŒ` ¥,nû]¼êjŸƒÜŠPlWc0;AmŒHƒ`æ2=aoöbRiX—Â-¤ës<(ýÑ9%ÿ>Wd¯IÚù1¾v¡Iëp ޼Û\•ÀG= :XÉ/ŸùeÛŠÙ‚¼hå×6q/i¼98¡´çi[9òË4çÖ÷(8H mÞ–‰µuá©·ÌcïÛëÍŽ¢fðpó?«‚ØÑ¶Û ãzfÏ»œ%ox‡#::œ‰Q T$Ó5eP–ßr†ƒC"KXµE¹wcÍ|,v­é}¤¨Ej@¦àV6–X–~ã<˜»`$ˆ_ÅØL•/va®dOþ3±a›¢à 8´83ö«.O×7 vàëyõ#}xhæk/có(‘ü™}=½ç5w§ÈVé?¶l1Øæà9_·64ûS5©¡û]±Î¼?o$qÁÁúñb“QLY=¤`Ø¡,,':ÜjÑrýú7g™üYÈF³ø¡›xŸüPa’"¾I[W¨>£ŒP>«Ò毋šgÕH'¦2uà\Ë}ê±²§ ¯R X'üû4Ào®×äà5¯²î߸÷úˆ¹|SÃRÚ)ßæ®öa²Û>›¢IFõѲEÛ›žDyÁð#}È¢Oÿ}nl½Mæ[üƒ9BЫFÝ ]ÞŒøóŒìëý‹­ì«ÿÖçˆî6¯as’tÊ?Hàè_:<1<ÎAAâí¦¸{›€fÒR]b(_ÂZQg£¶£êYZ­ý.‚RI£î/¡î(2°X;Õb©Ùó±}M·¢7Äb¹òª³öÿéS…ZžXS9÷Zâ¶¹=«\&@U½ÁZfþ³õ“%XènnløeÍK5÷9—–}]ß,O&8UËV]ÁN«×,n jÜž>,íè/tª¾¢%Y"ŒóÌãÿV¤W¸¹ÑÖÙ4'á/o¸0ï›Ä"ut»„Íà‡yg„r…€«¢Æú]oá=4n³Ñz»‹{3ƒÑ•ö÷XJìv\™䬯5¤T†JÁ«¼/®¬ñI0ècX†“W™”n’{}”ÎT ¤CšGv´H6¬Θ(Ÿo€Ð8MRQi{ÉN•›Z½°·&ûü!Vüy?šü ¦uäucs©€+c{AñéÆ ©k`£»Ä©]àSòºx»MŸ+ÉvùåÁ¿)¾ÓäçiQSŒ™ª}Ϧ'˜µì’ƒ»]eõÎËä|T:K| ã?b0*Û2‹fºˆìÓ¾MnhaLˆ;rÝÜáz¥`9µOJ˜DQº„=9ð)†´N(ÞÄø ™‰>s©‹høv°¡ml_ÚZ+6÷¸þ°qÝ ¨@[v[-¾e®ä±Ù0î¹qª©2 QqUÝrZ´þÞÍ«ºV¤ÎíÕ½‘i À¯*7-é4¿‚U™Ú g!ƒphg¿ºVYúM³¥D!²ª»ûÜï¿ÌËT5äRpÜÃqÊ™Á¥å,˜1áÞ6¨@¬IßÚÀ‡õr­ ½ÿxÎÉÆ*3§ÂÄ옼6ø5î³Üp1$Åoj£ÚýM1ômF 9»Aë×u¤p¤~^RÄ:ôÆqòæþÑ!n¦ö#Š "Ãy‹2îfÐ3pk΢JýÚR;g¿.hëjêKmzö¹JŽÒÓìºû²uÿõöŸìop°`(\Íø²Ë•XrÍF¨ÞW0¥‘Ò<¶“³á–Ïe¶Ø¿ÌÏ[b“IäiLÒ?2¤ìê¿¶@Âв ¯ñòVwf¹'ž£˜Õtæ'7¼Ö–]yKˆ{dou•@£–³±â'Ù÷ OzÇs ™[”±®±*Öó÷ûNçÔÒ”/üšÒ|»C ?Œ\’ªÝƒºr'7ú~ XpdŸÑ©f/7<{{«[ÏÈ2ÁÂ᪠vzÎÛÇ v$3T «¢P•hæ©aqµ-•‡i Yý#v0×äJU´óòûh%¼€z=˜?ªŒw‘|Vëµbsmôüð`·T6ôî’/Ò—qB™;dnè8 $}j­ˆÄ²–eL/ž€h*›n2·“l4uŽ¢_¯çCB•µÓ Æ, µ†~ËÿY…YÛì҂‘đÖuÞj¥€ðÆ´` ÄÅ>’„øýEcl“c‘ª‰CÌ ”šö¥ç“ȸ•‡X7d”µñ7¯igp’y¯ÊÂáF*"Øÿx#ȱ¡Â¢'B†D¤W’~<4‡XF{¹.-¡y G/Œò$’<ò¦[<·» —›@. u=»5}ߊé©;<&Vˆj¼7“Fˆm[üö~µ8'³ÚNž«€J¹.†ê-ÿ Z¨q-I„4Æ-ÎxÝ4;S( SÔžkó<ä<Ó (¡S‚Ã^ E¡¿s¢R¬£¹ŽñA°am©gû]c³£ŸcØI‘7¤‚ÉbÇöQN/îÆE—¥Ô2§²øa@n µsèHµ«¹D`.'!@F\Ö 2ø´CËaÝgLÆvŽ3¹+kÞŠÍ*ÅÁòïÈšu­ì²&‡¢O´¸cm Hö¿þu ¼x:é=¾‘c:+ܘ&‚4'†P“š}¯ \ÇneyòŠ@{ˆ³waÿh^RÖa¸”ÊÊP/»½Ã. HÈŠ©¤œÐ¶–¾6^µ*Ó3i†³€ªÐ°žwºòì1V.6:¤ûêL·Ôp’†kn‚òVº“’=P`³‘ì‘`I¨Ðëà1 yxË‹˜Æ¬PÅߨ¼q¤¶!«NÝ™ùñÖøâZDÿÛgFªmŸF9s~kªs[Ë­U˜¹Î#Í„;03Hhï ¢¾m XRëv…yU%ó‘XˆºBÚx"®ƒ 2qܦ¢$…•׈<5¦¢×öÑEVdØZÂ碌À–3ý×îGB9Ýðœ§Å ôÌÅ<×"ðõYÅ¿¡øñ€/Ü5@]Y:e+ùÃï—zšq毳³ŠCc$…ö¢Ö$¿‰Aí²³¸ #$ÂÛEçܺ¼ªÌU4©|dN"_&ÝQÝ8EÄ4qæ!¬0{ zÜiƒïœ‚Qr`?ŒÜ­2ÙdÕ~ yó«#WMÔBœeÜg›ÊP§³­¼uˆFV Q·AšÕyïL t0ö³g[¨~«Žy ¾ Î0¨–Œ iÜ쪻Ò>Ùœßã érŒéL ”ÄÑÕa*×÷¢¿8UËìF#H³îéèôT=¾¶Ì6z(¶f3š<­lå|í.Lœ¸É.]¨eT0%Ë`ZÀ8Å’2›g ³/+ƒ¦^dL ‹ræM㦕âì¤ .ÛÙl) ¡ì*D·ß`sëÕØàýû“½­i£î{,T°×‚fs‹²2¹‰\¦”Æ8ý¦zjÝ«âB‰áEï\×CJÝåHJ’÷µâ?lƒ)ÖΠÆà–îßÒWLY†âŸÕág~˜Î‘¯¡ã zÓ)Ÿ}QõúòR`F´“Bl»Šþ¥$úï²"¡a¯`ôöe~ׇ&"‚¹ÜB¤Ô×[¼Æa+ž}Éú¼'í¥¢oQ¦¿or^»­¨¨ÎîÊo垀LQ[P`ráÁ„F¿ƒo_ùSò¼9]&ý‚œfæ*Š$tÅÛsÞ€˜OT€öZûlì°k(E¢ÍÄÖHø&âF~Ñ'w¾å¿VªQSÃþÏ ö©ø•Âo×"*´\2ö]Iö3ßæ‘ÏšÔÇ“9à~Ä‘•£IPŠ4ÉÜAýæ¤ØGì´?I¹Ù^Lõðެw)ä dÙà J’öz@n<™ —D“nü+|6hD|ç—,1µ—Ý¿+—Õ£ãÙ©‡J|&Ç 4nˆ%.eœ««ÉúAõ=€î²1©}Ñ.:ìz<ÙLÍ—¢Ÿ³GKrÄû°Òc±'›˜ð¡gTä¶j§­X]ç*ä;¢fȦõJ›½2?Ž2úäÃ]Wú9FÖ ²Šã–ib®_P,œ…b%wí›BêMM¿a48ÓɸþYƒªŽ!#’'ƒk¥ÛÝ6÷Ø×£·ÀѪÍAœ¸Ùó¦ÜAƒåÂùþ]¿Áœaè£ÇW‘§·ÌbÒ~²fKJ!Ûe:%sA!ºz¾À^æ $Ô¶®$iß17 ˜áæë#Æ“ª3‰é @ÄeG>s1*hXv¶uIµØfÙBל¥A‡D 5›‘tl¥/†¥—K}ý7h^ˆ®ŽÕÏËæ—n BKËì ÁÈ÷æAï|tÚ“çŒR¾GÙ)Dh§nÀØZ`‡PVÿIÁ(Óé?‹‡VÜΉ‹9ufÚFÃGMH†â§´‡¤ªÇ€ðŠM F”:°“=šåø=ú×n­£L/QQ_Öú]4Äü¥Ù°à¹ÏU"*GÎX»býþ=¼†|w#a»oó…Ç$ü6%«!„lv+]èd°÷"eóØ lø¨í€/RÁ;hUò€â NuæVï[J\iUPµÞþKE¯ŸaN4ŸŸ…‡Â3¥ùÝ2)c ÓÅS.g @⾚N±¢–dO¾Of.¸äÊUW}dÏü<Õ%ˆåh²þÁ‚·;ލO®)ù8øDîTŸßl?¡eñ€¸”Ï =HÑŒãGihê‰I j/®¥5åOm¡©Ö-Æ?xeDÏ~¶´Ë‹Í÷Ãào†táE™·„†µÔ¥6 èÍÖsDÛo¹¤;-ÒV’kòÈ+®«1š4}/Yg”@UƒÆí[Û»\×.š'fÐפ¢)À€\©F „P8Í t.ÏL6%¨r²Å²¥yÄà£ìkU˜a–»TšQ}'Îm|ÏÀ|G$èÙÀ‚vûë–&b/ì÷<&×ÚŸd'×F¾¤šÆøÚSØ3¬é¬ ´Ì§õÈŒÎÜ÷›#Êêý:3Ú^´cgKj5ALl²s—§,PŒþN‚,õñãû«j*õ¾…D+»ñÁVÝI1BiÇ“¨éä’¶ÊØ‚åÔ«(§Óµ•`ݓԩRìaë›IÀï7ð”Ysÿ+ Ih)ÚØCˆ™ë¯7•üh¨-weÿ~Å¢“o»ë%›M~¼e!³yV:Àö(Ù(ŽV=áS!€?wJH­ÎQ ¤-K¸»L•Ýè/ý`'Ê,¶Ã÷ìôó«yÙ°ÊÀ‚­àëè ý4‡IÃaIHÚi ÙZ­¨ØÌ{,-!ö‚µOa{dö®³7%~IN;èàêdKˆ Ϲ˜1ùG1™ø/kq…nN9n´4­‰z·utêÔ=å޴ʥݲ¶©CžÀ¬­“í‘5ƒïB)çIíÐ\jbp‰‰.lû©¸N9ª!«iúþ&ßn6v*æÞõw—iO36K 8jxŽp|È#óB „HÆJb\1 µÚ˘ÉDø"ÖÕßÛÂ!Æ=’¯ó”¼–Èò«Gž®S~iþ0p c’Ã}öjælÐÒZ_0œþ´åú¥6 $l¿7ý¦4qG !èìcþE Ã:”ÆtH¢©ETseú÷™B0~$pÿ “£”ør&AѸý¥i¿´/[½CLÓ·gùnÆòëes”Þù½Rçx2êú”\Ž|hœ›Ã5Ÿ…{÷M¸©*’/V--]’µø›þ%;¯ü¹¢;§‘æ¯bŸ‹ ÄÙU=FtÊòVk¹yƒiAòÍñ‹ÐÄž,8ÒÆ É½IA!;j˜~Au‘!›Í:vwŸŠÖ)X‡%‡–Ûû5ÛSW–ð”N~¿Ñ¡ÒU¾t} ØùnÖŸ·«gÖ÷ŸQ1ÏžäÃÀjòþÂp÷Á:dЗöléï\ð°Øõ&ÿ÷ùžy‚ª$ÚÁ;bÜ­«èè¼)xG`ßP%ü»o íðJF»ÿæÆe„ñ¿Æs`·Ä¬ØNˆL’ ­qÁþ™Ù¨o?#JUùå‚ 8v$¶_*XŸ¥~ˆµ©Ø`ç>Ê-;¶Îçf×;ÿY%\¡Ù ¾$^;ö6º:ÄJ•^].–‡ì!ëú_lKêhÏe—ÐçÞJ°Ú^½·_CYê„Næc×ÂVäé›HöN›<;ø­™,›Žk¥ø{û¡â ÙkJ⊅ðr~´®š4¾P¦‡,D’|°’°UíqÕ5@ÎÒzµ”þB³c *GÜ ÑúBN™p¢XT/q¨HÌp>+ÊÁrˆ}Ù‚›?U8ëߘ;g~ä…¥MNÒðÝ¡Ø}è=£­U_éÙh•ðí?¿“]­×²Æ «¥Ži¸õ\?Ë{†Í§(Wí\y‹ÖeŽOMaä‘y%Žó|ðg_ôÂÕveù«+WžzÖE$T}²0f¤t𷉡ø·-̈waÀÄ£[ºÓbµsËòœ´Yí­öï!Áè|>›9žÕ‹D°G¸í®LÈÐç²&/õjDî"ä£Jã¡Xs|“å¬ÙÀoìw ýK¹ó)’ÏF[œYÏÍÔ^4«ƒ¿T$ºÚ+qGeÞ¡cÕ!BéÚîcŒñ¥µ„é«3¬²§T”xZ ÖGáÖ©|ÌØ¿ýí3\„€Ýœ‹ñ‰³~»Wÿ´¯R²?ûáËyµ¡ÁQHnŸ¿Sá0_‹ú'o¾jKÆÝJÿâì&ù:ˆÛs ˆ}c&'ýRkI¢ÄýWµÄ>'U 6·ab9™s廞ƒûÒrP:Å4û!¿`¥ ž-ÿj=CçÝ“:Ryf~ôcf8öõ¿Æj,#A€?Kã”×°J5ÒªÙî·uÈEYKé¿ Šæ*„*Y!$ fez·+ƒB©C,¶)ÁžÉ¨biüõ5€h¿rß³<Ž`á˜Ú˪ù@=Ð3xÅ ¾ËK¸þF´É=×Å\Y4SÏ@!à–­㙦m Ödt*\JŠÐ4ÍÐ?yÄ9t®þÌ8ë.Z•9G?öДÒdxI•v¢½H€à@J"’‰p€Yd&ÔçµÅr³K, 6ÜâÑ™Pr€}gz<¡âb€» ƒ€ äÃtÈL–ä/V´KÇ ÷Ú›h¼y ×™®ï°þºÔ1/B\ÙP Mnyk/_-»è}ÔnÑ-,7 í„I‰kQ8a}{¸bÇ*°/ç—)/`Ь:¿ÇÚŠ}Wuè­ã#;{ÞÕÀ‚¨HY Ú¡Ëöú&¡L©«ððñ(¬i´dŸ•v/Y\JÖ©‚d¶s>YÉŠ­~B¢7o©J*Ý=§N¡6—ÀžŒiÔ=®%® Ó82X\,á˜íwB³IÁu°°X ž’2ŧëõÝÔ‡ ŸFíåpk£±‰?ó3tg´Ïn\xÆŒ€Æý&š»ÁÌŽ–5ƒÁ„;z9FKH×'o¾éo{Ãì2—kŠ„Rè«„{WÕ©o´ç­»sl”ɿӒ`‘ÃÞ:{Ö8à… ýɉ¢¨`þI©hs”e¤õ1Ÿú*žëÚ'[*é®IÒ•.1ö™Ì–ð u¡ƒˆ:OS­í púi£íÅU?«ÚÕÖž–~ <ñ÷ 9Çp|`j\bˤbúaùŸ•Øþåg›d¶xBr‹·R‚™'4N‹ÿß“ðþ†þWÆÊ±8f´*²ȃêHl5’lÒSÇÀ`vúN¦þ=kkè!q/¡VR[ñŒ~jcntßÃQ×ðº}pËÓc=i­¤j*%ŸJí{:„Ÿün匟◳š)'¨‚Î#›÷å˜zØ Vù7Öë ¨NE&Õ£—°Ì0$¹¶vÓ&”)ÿ¸ÏéŽÿŸTšC^¨>n%’2ZÈnš·u.äeaäR裡:ú Ü®­³ÚðŸ«Ä g#¥‚j,ß·†ÕcDüÑå>ÿ?!|õ6vóÁ%–þ»íºL™‚Âë`ˈyow27E,;áÍ‹|HìÊ·ÙÖÉÍŠyUb×6¥Ñœed˜åúx>Âr‚óFjºí*ÌŸžˆ2úÔ(溌fl¥nP{_«OhW¯êøêž°Ë[알ØÈÉþ¹ —|éh‘¸ê:qѰ Ÿ´Þ)Jˆ­“¤Ýsy¢q_|j7ö\¿—Så”&Æ ê'X’'–ÝñÍd²Ï²s‚só/vjZUÁÙÀbâv–ZL2ñr’’Ðw\°p´óÙ݆rã=ãÅ’«"8arº>Yßà÷v:á4j¬>즜ßF ÑžÆJKÎ;@JÂõPF¶ÿRYç62KG´}ýc‹ÆS•2ŠTå•uÉF¡˜(2A¯¥Ïšõ’‚¸‹ER8¡ÍýÃXF>€½†?„˜^‰úýÇ'—¥nµì%n"ò ¼1߸£÷Õ÷–§D×í¡‰”àéøS B  w.³ÈäžGëµ!ÁF+iãísšLìâξ®¡DæéÍŒg À ÿó¹’‚‡¸ÔÄ£× 8šåán™90{à”2Æðl‡cR‹ïÝõÞÜâiN³¦u>_áœ"ŒÇƨB4ª#äc«3Kçñ,¿… GW8Þë•S{rž§c×IĬv_•ëÎþBGµv&ÒÚ Ÿ±I†­rNóõÿ¢Áç®Ü!l3!‹ßwU´©ø\~^Ýt8YŽZVD•±0Äì·çÚÌÜX²dŠ\‡? ƒÙå^w ßKŸÚçuÛpWulB^‡ÚǬÅ[ ìÊ .méÚFvËfªh’2MͲ±YÍÝ©&ÿ’Nð1M†Èí¾‡ðóо¹åÒS{*>èb‘ ZèûÑ|çȧÓÑvîÇbpÎ=m–çxÎ4‘8Xp°PI„û€¶©òî)¨Nå§SO‚R1eê)§Û©}¼o­Z€¼¼”`6¡ˆMЦr¥JC×v*غ§iºÝ’ѦÆ&í0êPõÏ#‰«IÒ‡Úß23`tíãM‡™[ÃÂP®à‹µ«—”9ªÞv–Æ‚:€WK%f#ŠBïNäÕä+8û'§?J$XÈ…ôäRÔË\DšÄT‰Ý W<è»)}š¶j>=}†"Ö¹¹W‘’«ü«üM>ÈØÞÚúT–líÃ?‰K+ÞÕOAd{ÌkÞSTújÈTû¹íœ©Uð êצŸz˜n¹ÝÈŠÐÍß?w¤¨°‘që+kcr+eÅ |a¼·Õ3íp#ï°™ïÔèŒf¼ŽÌÌ809ÎNbƒÂp.µí·gÁ\˜S.™©8^˜ï›êbÂy!8œw{Çe$"(ݼ»VêY.)£FA™¬{Þʆã0«iz·»èܲc1g“×f“`©³`.é4°óœç̯肵 >êñ-;Ù B><¯>Ê8 ;ñÕxÂü"‚`Ìk!ž]nMßßc6-X¸xÞûØšŒÆ5!-"Åæc{!¨jbJ–"Øj{„{§ŠYš,çÌñÉúLUG7Q ’t™„Ã…my÷ç7‰<­Lþ¯½‚U&1‰¥^ŽKÌâƒ3-~ÁHÚ˜¹OzÓ9a+M53Bš’Š_ðqK[ŒqÓ»¿Ø‘%Ù:õd1ßÕ¥P%<'"PÇ$ªšrÕ± ¡*,ÁW:»\_TÍ/SÞ8ol½>˜æëÊË*ó÷åJðZQrŒÅ̽e13Ñ)×F‹Ð½ŽùS –/jæÏωSáÖýËâÞtÛ„®MtŽUòþã›ÚÈOºBéN*ÿW³ÚÌi)BnyWþ[üþ¢vŽÖn¹F”ªÍHÕ,áJ“&-í³ܶæS³ÚØÃóm¦AQ±ßû̱ü¬^‚0‡í¹Èjà™›@÷¼æžsÜQ“¸.Ò ÏiŠS‡dìuGfÛÚgJ¡€¥>çVŸÁ‰4œM¥‰¡K˜=K›oÔ1?(_F]ÙéxCÞ ž›0P“X7â–ሹð%‹¯Wå1™ÂRôÚI¢ÿ{¯¹9Îá[>¾v»FFmå nÖ%ÈnµÆH Jä´Ñ&Eé,Cf·E‰™ J¡= Ý#r8­U0ÌŽ¶o$ Ç‹~²=@˜HBÄzY„ãiÐ N×X_\Åý¢VºˆxâÚÜ«oØ5Ü£° ŒÖ1}jœà+JA‰ÜRÝÙìožuÈ;ÓÈñ@%ëéŸ /\ } I)âqI~ൟ`/¶pLü` #~;¾KþXÓû€“Vx¦æ¢[óbÌ/¶ó§Zxôá$þŽßIJ¸ñ3 N²ºe2õ2ù+ÕÑ£²ŸŠÊâ¥O2Ó¤ý’~¯T îs^ƒe\ŸpYÿ¸°ÝÜœ=§ ‹Ó¶MŸQ1V¹¿sœÔvwÂ*vàCy¢XWÆ(…†UÓÉÐYBøð}A1‡q |¼pb^ÑD}'—I7;f[SV‹öàLܷIÿæR½]sÖ¦±PAÝÇoBœ”¨ç«³pO!&ñ6ÖS>3ËYŒÑÇŸ‚K­ëE&/;Ñe¡Ã²;ÿX铦ÉÄÒÇ9ŸAø´'ÌNФ¡äAwzùʼnX‘X,†½ÁBq Ö¸Ûh–¶é‘ËfÈO)Ö"á¥$ƒîÅ5Bkù£,MÒ\?ª=xwä͈¨ ßrõ¾BBᮩwÖ¹]ØWø£#»]uS‰­øÙµ Õ ¸| Çéõú>õ2±vI˜…½ßðÖeOïõÔm?eåÄÙ¿Ëùd¤¡.éš¿<óŠ!^L†§„ÍlÌÕv1¹'¬±ß™œÂT˜ œP¡óW+Á3ó®?õÁzô(ÝnÎu¸É«ûWîaÎ"zÊ!=æ”ÅŠ‡~')C}0¿¼Ñ^ÅÍB ;ý“̉zñ›‹/Ý\—Šr6t…CHÛ™·*ê âUp„ÔþðLˆ1Ö˜•<Î#º:‹ÝËôÕ<ânMɾº˜­³‡ŠSV»kt¤†ãÓ‰è?Ïîe¿Ä2Š3¾û¶~2E³¤Yy†ù?’Ò¢[Ø `“®á›ü üü¼^L[5Ý]þWRLW¦sáªÞÎZ’¨Ý~DÿúIK·ó³áU4±ÛU$yí$oaå죳;Ò>°ƒ"c9‰{¨èçjüÉémK5Õ€úÆ‹ì8½ÈŽò0ä=÷ —ëw'æãKƒó?d¬¨ÑpùuÀâ£RH4”–KòMV Qµ¿r €%‹ÆÜ}öux¦üûè%2ö›‹U‹F–p’h?>„8’¥" >SoÿÛ•NMæï~àÔÓï7â(p¾œ\XÑ7NÅ« fË$ãoâCèÄ[O&ÛG Òüs6{ò¬Ÿ9ó‰-ÑZ5 bÐZý_ éÐmæÖÿìÌ[ª>gvÏâ ¶ZÊÞäíeyaú*K¯/Ö<‰-„zìSy:Ì'Ó¯(NCƒ6éþµRj³ö} ÔGèî•)¹ÁB"_}LÃ@tº°–‰Jñ`ÉX~81< ¹ ™ýX'§bôù³"øûAQ "Å#ä½uîŸáZÓÚél N;TWF±¡¾ôMæ{è@Í-Ê£.ZxT„3ÜœiªüÚ„5$¥F ­ÍÿÉ‹ó™Bp7t™™¾úâ#E6(­KÚ¿(‰•ÍY.Fy-¬tŒ 9p€‘4‚°>ú<ûS\pŸ±à.`j˜ÒžAÍ éWfžX;M¬`A&Pÿ€êPòÊ]ÆSÅú&[…¾˜é¶Z§3_iØEQ|öúœÄšÙ6Ñ©Y)À”B€ËƶÏ8©Ñæøa¯4šÐÙVïÖhç°-¼ ,$Å>côÂÖŒ!xŽÀsQ¤Òëep²Ÿ]Éö £aSÍ0q`ó”]ØÖ{Hx/Ø ¿z<ƒŠ@[PhÖR1(Ø•I8’VÜᆌ´4½ª•¡¡`‚³â~d]ãcgKôT*M¢þ£1#ó~,-2û×õ;ŒæÍ]%²¦ÍG»¾,ׯz—P—3†Þí·zqÜ#Ž}Ò™°«ö“HHSnÐà—mx˜ÖÕ|¡¦Ù÷†Ü äòz&ëôÏ5Ý'H½lå1!ÆëM‡Í†¢zèš_ò™„P7gý“Z>ðÐî›ñïã÷ñÒ1R_÷ÅNu!S~™h#Óěͯk wH…>$¶Ù\ìË ù?#q™€áÍgVLS2Þ!j»½6¸—¿çv¸®íK\jâ£NrÚS16y O÷SýǶ ±EÃK»¢2ŒL“7^räWN_ ºWšÑ—ÿ?ê&—ñŒŠ•z­ÑêWN°rÍ‘9üäœ|ÚìCÃ~ðsDü ‚Mf¼·ZŸ9Î9£¤!ª>ü-]#D¢“,W±LÏPáYõp[(ô_¦Þû5¿m66êæ%¡P„ùeõžà6q`,QÔ±©´¡à~¡ýÚ>S-F£’Þò7|e¨*‘\oSâR>ø5g¦àÏ-[£óRòËä¦eZ°käzò–ú®ßp³VÏ$"e¯ß‹(»®ýèûR«RÐíña>`ñïÆÁfíì Pt!ˆ éêÔJööÁÓŪŒ²¥öídðFR1ðƒ?î|ö›Ï4±£¤äM“$U+o_FgáÕ!8šõ22‡É¢£ÐÁ„";ÇŽj¸+‹áîƒ&™æfî…h+AØ' ¬2É^tå‰xÀ6 ÍŠœ èÕ-béõ]PÚ»•ž†£©¥Ìñ•07<‘…”g– ú€¼Fbб°}…é®ÃÑQì»$§ô‚{†!*ÈWõxâ^/ 30™ž6¶'_> ×~|bþñ¤ˆ±&?2ðµr¿=•ÉìÍY5n¨¥Á^]¨ÿ›¼nˆ*Ó7 iDÐ[*×7¥B!ÌÕÙïÅldNk®‰l¶ê¼KM¦ÛVõ0¦,jïŒ)Í¥Du§ƒË%-jžû ÖK’o@` eì“ÇéÀ`aÉYÚl{0¥Q•2¦f @ÀZº=© M’2ºWxoEúÆrv¯á.S¬¸kì…ÿ(@ £ì5¦5RI?VlðûÆ‚¦òÐ!!#5g1Ÿ4³0]@¶qŒç_,’¸/äë’~xQ¿+P£®¼YT\èiÐÄh<¿'ð¤š]Hk Ù  ò%—ëñÞþy™”êtÚ_¿}mt~¸|ñëá6GÈ{ê °¼è#KÛ…Nv½¹2}myR»Å„óx3Üõ²¼q›–. Å*N±LÉÇécàëeV¼1~…S~yS›ù@B²®¤ï‘p^iÇèM$[¿úEnJ ,þGÆxÝSoð}ÒCûCC©}ql™™ü/íÞÙˆ¸{ ÉË#Gü[“mé ºùŸpLòTD¥Y0³ :ÒÓl‰á´Úàm‹Lw¦îÜ0Ó1ó•éMz~á é¶O•:4Q[ÝYNjâуY¸çólËèžiD:L>ƒ™¥Ú§dœð¶þbhóÙû:sÏŠ¥Â]òù¿,¸úíÚÎfÁ¬@fÅk­ËPçæ¨–‘ó"!]V™©{ ï¡Ëì;'‘ˆ®tAðä¦pyT9Âs8D˜¢¨ê:ÝEc’Á\ÅäÄu%g»ÝꞢ¶~ßå¼’QJE/ˆÃN—Q6ÒÏ_:^!e7ÿ¿7ñ¿Žz!ZK½û€ÄÚh³4žQ²ø‚€Œ6€ ¯ß€m3òú[ÒÇä´|Õ ?³Ó‚þ ñáÍJdDúmóÚÿº$a‘•ÐÜÈ ÒÒ^ï+|Áž¹UVHòZÿ0NE-Ï$,ô mÌA h3Úù¿÷P’šÏܤüÆXX€ RËt³3Nrã_¥¶mpPìtP!gÞ¹‹&(émEpÌâÙR•ã·<ô\ëV@¨ŸÑS­¹ \ sj&•cžö?Gà\Q‡wÐU÷.u'šD¤Ë6|¨¨A¾¹›™|΋Ԅ ùŒ˜/>)ë<8@"˜€U«JäΛ`#àzrgÁ’e¤§Å~[%¨ÓŒê²óæ€ÝÛøÔçUù•Ì“77@Â'brô1*-@qð4§ÄÚúó/5Á@½RóbA` qΈhRKsuÈî€î¢\*:‚4xëÌë+¦yâWü3ÑóXŒ>§>|rÆù‚m»®¤•z%ºÇúÚE!ÿÈMkéeM ¾õŸ”î³§1 ^1Ùë ñoì;ξ2‰ë4é FÞ˜èÕÁOÊ?ÿ3y¯\}ÏEöøÂÏSXÇ?$¤åç,R-&g ìíÊš-ÙÒÏ«üÚh)ôÎ y¥m¥ô'g‰wêSYËE¸cÃIIzGFçÜ@Jœ«-Û ÑcEÏ­zúg-•(˜fÅmíò3º+3ˆ%MóÕ-ûôˆUqŒ1µºð,+][9[íÏg0Q(KŠù¢D‡¤Å؈Æyo<™vlØòC¾Á.Cm,¾üYÆ;¤MèWˆN=&ëf†3»C„UðÖe’âž³ïÇÍ673 uãN]iÇ] D¸ŒéÓÖrŠMaN³/ö¼’HZøXëF¯“t‚pM ‹F†u\ìp$-S6#ÒǺdîcn ‹çÒ •GyØ Tz] )ð!ëÎèÅ..ÿ;rò½õ˜5¼Lq÷ =Ey üßKŸ1_=w_NÁß”A™¯! ÕA:³J&&"=šty8¡ÞÅB½‘Ù_ÿ$wZ@];*+”>@ Š-°’µÕµæ×ÐuÙý?RèZãC…ܱóò™Äô“šÊÞìxIþO­öz‡¶9\W‘ÂucZIüÛèÙºŠî~ßÌ û”èZð“#‘"ÓZB=›‹’[kv7À\‰òeóˆaÇô÷6ÂEýCe?QÊ+Älì Sz]ÙC.Ùîu°—@Guûê÷µ*Æ#…>ÌEŒ—Ï‘œ‰ÝD™ë8^âSHŒ×s|LÉZ²¿ú &¿Ø+î}œ„¥Ð—θCóÅÓ'|gÒ\›é_ð`~]N“\˜‡@×¶Ì;d?M4X–g8½¨¦Ì ¶² Véåz¬¹Ü‡RœƒÉ.+ó ÄRvÔ˜ëÚG:S÷©±%ÉZàýYŠrÔÈÌZ±¡ÐaM@ {s½‹ô':S˜Ñ`ÇÎ?·1v0"XÊL‚D‘â¼ ØFTÂE'W¬šÌ0-ën\ßç1ô]¬¤"Ò*´~O?WQÑžòäsý¿»û¤ñWÿ†NeÀ… ÿÆ'!ÝE5–=áõÒ9g]GhÝ¿š€whÎ7âåu6ý:ÁpYÛ¬´>3žiÜuo¨OªÜä%¾Yþ0ûFk<¯ ϰ^WŽ.uLKo"С¬.ó_Õ¬¾Ò)¾0£²—Fùæ,îå=?H’·DµÛpKƒñWlÃiˆ_aê_u³C>â`±ƒ¢b¨„ÍHÃAËåI†i“/bÿ„ó©+>$]‚ÅÉ¢‚ëÿQè‹¶×Ƨÿ»-ÇÂI¡±-#Ñ÷âÿVÞ©Yæe«”,í¥£‹ËY=¯dîlÔï<}amï_ß`m-L×'ÌÀ‰_Á>OY‚8>Aí~ÓÀôGÔ´‹Vdx3šÝ“hË#‡­YE^Ù%éÚv³B5ûáj8×4Ù Œ—„ºwëQ»¤M²ºÍÞ´säúKtÜ͇®ZVþÃBqøEÃî ´‹b*"MÊú-¿Ð‰Ž7`ëRÍÀu³´©uÒ–ñõz8§Ò͵¬ÓÚñ·!Týש­üŠ/jGÙãg/3L³xþx_šÑËòÆÓÜí`éTf tŒÒO)ÖŠÂHã褜´²bïAÇòŠÈ FI,ngô쎬¡ñ æÊ)…YÂLSIç¹ÅÇ{¿bRö*:°a5bÍTjN³EF+¿ùÜ©<îYºû‘Šï6Ô­VpS0yu.„‡ú‡ŸÝ;'.ÄH^l&—&«À©úÅÐ~†?Ž7ÄXßFÿD^h|‹˜í°‰3{_Ÿpr,ïu‡þ`µÏH³Ë“¬Ÿ¤)ŽÏ4ö \`ŸòÓW˜üºÙd’ 7Dñ«‰‘é¬~}‘ßG6 rê™ÖY#Q–&¯g3RôÀ;1´Â‡Í(»îaœµ¡±<‘g•ÀßT‰ó¿à°Á‹yTžÇ6Ñrg?ÁMÌLmBg;ÙIÏ]ù¬ª(¡²Â£¦ó®çNË+mŽoï[Üäs ÒvnìJ/Œ.v§Žµ#z“TÊHôÿ‚Sšë3Æ–>x±~\Ÿ¦l¨>k;ùòt*`‰iä÷3ÀÅÅ\´û Fô §¸³¦7ÓéÆ=è[±TÆk7²3õø1Ÿvßþ±4¶Ì¸ôðæUUH.’ð^ÚÙ@ú˪šËGcø|‚½Ü·Ýä´ñ¸×8zGtSÈT+Î-àß;²OwÎêT<’}«ÌRKOù‡Ó)§’& Ø5Uç_Å-°´Ô#·ïò„íu„œsoÜ>µ²3 ¾`¹pß%»q+£5ÌÚ¥(ü=6¬ðAh£û¼Ÿ›Åç†Þìeá/ªý°1}ÊJ¶7í·Vq‡rÏÑê :%€bÍ€\¾ˆØôtf$Ókb·×5Vh†"£½y«òÙÇu¨nžu+Ot]ÄpœŸšU+I'P¿2ø$pÛ › c D%ÜÛ¯}­ýÇÙûµÄ¢{f<ïR‚©¢KÛB.Þ–_ÁuIèŽð5%#Ùp? LV Fs‘9Ó˜ªîŸ¼»¨ªÜW ã}M¿¢¡¿ˆuÊdjRg⬠£µR•dÖšxp~Vá˜÷ û"(Xêа©käòœÛ¥"[½k=çÑ9N Þ%’ïv´îM¦ße3":Sýë,³fµµ•i÷Ýo±ªi8a˜µ6ÀÔìýp óIžr®ÆÀ9Ñ&!  BìOeM†¾È=ƒ­ˆë\H%\ÙËŒ˜Í8Œÿäö6ÃDíd.¿&²zL‰¿qKÅÏ®\Í0\\¨!ÙÖyäukpWžÝ—¦{'BóU—©£áz¶£t:Ñ6yüuIÇ3GT(‚zÉìüLßù ʆ3ÍÒ¤ƒæ«ñ—Ûñ˜«£¿Þ4ƒšÀ©GÅñ·ÃØó9دsŠŸ¬é¨@ý­´¾¶n–Øeø&]…Ĭ¤(rzÛâwið¨êu‰ˆët¦h_3ájïùI²ò.L¡`ÁjªKؘ6KkåeU}Úß?aŦò‹¤D»µ ƒ¬:âZ¢)ôŒ—Ñÿ÷´ì Ôq瞎åšùf1ŒüîQ[°%J=E=±}°sZ „¾´É/á¸×^Šâök”C`GDýcíåáõî€Ô×ÉwX$Ø Ç”ÄZÃ:â+æ‡WArÈs9Â1@´¶$ÔN„:;aS//:cç)n’,¼!¨l®€DkL˜LĨ“½²ç"ã‰h:ÐêÖ7x7Z ž\5^ R>ô>~?ˆ˜D<:ÖžÈîzP®Æÿˆ,²>éËɵ¶ÊH„{Öå–¾È_¦îé¦&°(RÚ½7:‚0 ŠÇÞ}ÙsìID e:#«³|ä²Rd¹±Æß† ÃÚËy¥ ¨¶ö²ä3-y`)l» ]$’ñû¦cªëÝõÒ7Ô™Gݯ¿Ðø+C_k²}±‰ñHUéD0Áœ0“[ªñž™ÄKÅv.¨ÑTD¼(ªhÀõ?¸iq'++ÑŽ4ý/i¸U„N§Ù7W¨Æc²‘" ñi˜ã­ç§Ùsm6ô–)íVAÐñ‡¸÷R@fúy„P\Ú%†ÄÈ¢Á ¸9˜D‚Œ5ÝÅ_5ßÑî³RùÀ™ooð²ºQï¶1eèÓæ6fJÃs_ÑÕü¸Êª”aÀv ×ìéˆòÆÆïKËòÕ{ü£èO3^f aæD!·stΓð*´ ×i³«=‹`AÊ^FEòíñ ëTÑÐ\¬fþ¦Š;Èñía´×°ˆÑY‹ç¨ã7ñ•‘j·Ç0ÎÆŒNßnìã0.-b›xzµ*X[z*<¸X½Gë8×¥›È)÷@{ZZÁ‚´8ºPådéÉãl¥L1PY?f—“Ÿã²|4¹ÿ¥ý+´ ùáQç¼½"=y/CÒ„r–£©| XÄx ’#Ãc9>î.±¯.a­‡ÙiÌ•­ù\)Òî Ü¡pnLSâçb7v$ 5â{´arÑžÂÁß]ä{üsæ÷rH á¥ñwcN­9¸›énV…#/–…æ[Ø7†¾I¹ú¼”;1Û1¢ê mÀã¼'k[Új½fƒâ±¦¬ç·ô§«Í°&ž|zoò&YðÖb[×eõ(<–i÷ªÀásþdÆ!|»Ü¿­Ìûªë_øV x> öc e È1–ZAQ¨Î'šA^Or: àï>ãª(Pæ©2º¦5þ„ÓšohUºñíOÛ³Íî1Ñ¥Í~™ ’F JÁõ70ÔaÖ¹Ú®Ò#ÎZCçé.”l7œÅî†ÉsÜb¤ˆ©sÒKI[ñ…·×m¥lÁ•~n7‹"t &®KÓÞ@˜Zy\»í¿s| "[°ŽRåÓbi¾Ïž¦ Hø¦œY"Øk¸0W³a\Û=V)‚y·§„^üÙ!¡o[ß/¼ƒ)“Wz("]¹U ÀOÚA¿=EpV¾Â±ëF†À0£5ÇÉàà¸ÅØöÏ,¨LQ›ÜýÔKTY›eŠLà´gD#"Ä1“˜á b$ìãu‘êÏZ§B@kR] Ħäî‹Ì‘ÍDRgS¿ƒ%ÊŠóEîùÍYý¨ k”“ˆÃø·®hGN»¿…Í¥€õ…ü0¬ÖˆºiIåçk¸ßàÿË™íëóPAàÖoZÁÝ©Ûë­eËj4bfü:uön¡ÕÏ4Ñ¢e•_Lz¥H}ZÛ*‘«|ÑHÄ‘—«ý¶R¬ûfË {Þ£$h½¢£Æ+Àp§‚@€Œy_W.ÂkòØl‘)­òz9ÍÊ[­óâQiR_å‡uˆ1¹¢øôšÀܯ4#]xÔ½\u2Ço°®TÑw#£a9R2‡Å³ÿï.—¿‚ùf)X´&ze2)'ãG]„™-<Ûø.׌PʸÝj¡2*c7EI&„@B¬•|5Äù’†êMçó~ÚùŒÖlä êùïbÝ+—H@Ì“G—«u{‰9]dw~Bõó7Ä>ñ4*;©+†|•Ò$¹–ËVw‚v¿|#»Úgu®H ˆÒ6`ö‰¶Gè–g!¿)vF”BIJui6šXÙK3ç ‰»ºçÛÕe¯ˆÊe^Ð[Û"‘]0§ÜvµEôis¨<`Ç›èåÛ…=IP_Ík‹pÅc»L›C©lȉ ½áÇk¡lR€Ñz[ùQLHy*¥«i„ºùPÍúÛå eÝ.bèA­ók´†-ZØmriCçkÞÈC&il§ÁÞ˜^ÖK6¶žÐGì%ØPp)††k¡°É#@Úx©¶AÌóÙw4¢bí§qAäO¦Aá|Ü'Ò~F·³gŽÉTOÃÕè,!®*1]Q½Ú"?]k/±iU–€‹GžK°rë9_Ç$“…¥[QqAP›¬;…ù¬IÛ=ª8ØîÀt§=2k¾J®Ÿ—™uL…Ö:[MáKªT˜¨¿&Ewaàßûïy7¨“éÕs5Aa%ƒ!c:ü;rrTú^)Õl$C&έC+%…m¢¢’ާì0v4ë„…Ü#î÷ ?»ˆeȬWÚp~»¥Lª^ÿ»ÿ~_ï, $?ÇmàÝcÔÔóÞ^//Éwðï¢%Ê£œwŠuÌŒ¶d œÌ±Ì !3õÍú`¢1{p}Ýyc6–lþ†+3­ÞþWð‚Må…;oaùS©§{BâŠÈðjÞЄ™[Ò¦¦-R/3nE[Þ23ݤ'TL~ÕD߫ӓ§…eÙ`ƒu²O±aüéq*õ—\$˜@µ:ÅAs4!‚½3Íæ²Æ ¤k±X©Èl–!+ûú}fÝJg?CªCÄBœÜ3“å#*H6[µL7q=ØÒ-ÌÂlŸV<¨¾në*­„£írÆ®_¨4^tïÑûÕÆÍÛ‹ˆ¾`é¦xÿ²¾4[E-¥œÒáÀ»é¿n;kOˆú?ðqxôÕ‡)®ú|rE¬¤6Ï*t,¶AÖÖu¼®+u-0~jPæj39­Òcf7ÎÓ‡¤'YŒ·h¢«[²¥µúYy6h㬜¹>/[‡N§ ’•w .½UlD˜6™mDz¡À«çs¨­$s„÷#ç›Z›€J¨²`Þ0êT†4a¹ [/KŸÆái!'DÍ R‹Œfl‘ø»®^ý}>í½¬Þ…ÀK¬0¶¥Àõ¿F²¢C&XR‰DÛðži84¶ÐFtYCÔ$Ô1$e=nôí‘J¥ñùȮº‹;ÄRàT8'Ì´äX¢o‹; 0Iå±ê =a¿8XŽîo?hi˰_†©8ú9ƒ5š,슻ßTÕ Mô¸ŒÃ%hïðD•e"H¢ 'b‘?ðüͱwÊÏ@ä,J'ýÉOÔý0kåž•]AÐ_BM/ˆ¡Žx¥†Ï˜˜£ƒÉÛ‘\ÑÅ(N» ´Q`bWºQº_Æ“Ð4wBØg³.Ù8Óðf¯¥*"Ljý…¸Øãž VOV'°c=$•ç—{ì ýò=om"˜IÛ”ˆÉ‘O¹úŠè68Ýç©;ïfÔ\Cbn9tušiWÚâž þvkH\JÁÜbd½Iµ þ<”UÔ|dà8ûøƒŒ`³lcðh,`#JŸÍ8ßYR'A´"ÎDªO1ˆÇ—ŸÁ"Øáã"9IPdÐn·DØvÕÅEŽe¡rÊßS‹3#©"åvýa1WÛãUgw}nzÎÉ Tå7¿Ó”°Êû<¤Z’¾Ô¤¤œ(ìˆõ?¼Ñ†u}«åmTù¢‰á}kQÁpÀ‘Uâ4Õ!ŠXòIÜI¸P|ýt=ÚÛ"ñ*1ـߥ$¢: XôÃ]•þÎß+¥ 'u¼Átœ±à ‚Štpþ·Ȥb³éyüÛéœÓq—4·JØ æ ‰ ‹ðQC* F-F»(SÔFÿkiö§l2ö–:c»´˜ºqKW©™¦Ê†¿x3¡<øj»ƾGФ$…/‰¯uC:é?66¾y°¢#'äRÙ W¿þ¨"µšBö»³Så•*­=Ñž¶ âç”(û¸5o ‡ƒåÜáôcCþç§©3Ä'óL°Žnœq46Ñ:‚4Ј}%½ŒŽ®•£ØLNðÏOß§ËÈÊïÍWÌdBAðì ýðD¡BÇ_÷@Þ¸ñm”ªÎNØ5;™,\Àd™=ì˜ÿËm':Ð ôߢ岽B·  áíšÖR¼YÆ¥s …hО¦¹òÕ»:äR ׫]… ­ƒHöœÕ·|䑟SóÕœDT5ú¯´`UPhZŒp†’ˆÆn¨!üÏþü@ óÍcõq4ÙìpÜRX`­10ÜêҊЫ<Ø ïA3ç-?'YVU¼? ®àE-&­Ý7@üògÛ÷_F-è-Ú#ñ¿,é‘­*¢¹M9œ¡µ?ãiˆØVƒ§ÙO“üæ°ZhE2õ%~Z¦XÇ÷¥ÃÑâ+&Ó Ø¡èÃ|£Íœ—†ì.ç2ø:ÿ‘è"ÊžTF"Äk‰žÎÃ,—ÕæhŽ!y¬#ùæP/D`ŽÍØ:þ 1=¼%­Z\.¬!E`8˜ ­Ïª2 CëL…  ²x¹P÷Þ• ¶kÈŸt‹ßbÐ/ w;‰ð£=(®€sÍ'å^ïEä)@|¹Ö¤â*ÈsC{4ÔíH™~Tœ°ˆ‹Iùâ!E—}ð+E ˜Æ>ËT³’ê `Õ…ã߆‚T¬A$½›Ùò½ , »G`BÄjuîvî´*Ð{GÍ$LðŠZ®Ù>Šwû¨¼‰‹ý” ÕŸ•hÜYø RPÓ¶áãù©zr1Áã`øÚX¦¦18«DÓÜʇ0R|Ÿé5á•s;MmîŽÃM&¥»·×¹–J€_¾–Ó{“Ø! H±~ªèå_ÄË0Ó“Ï‚´q³¸÷hÁºÔÓ_°‡ä€íZ¶½ÙX—´{­;ϾuÝà’ŸPÓ(@Dö-£FÓ-t¾LÙ.6B[íDÚzRqÈþ–ީчûÀ­ "#l„‹Òç 5WÈ$zÛs?ãÁ¼aŠÒ¡Oav¨Û÷‚ÊÆ¼ÓLŠYàY\Óµ‡$G~)å´I¥nDETs›¶Z)Õ|SÜ®P,HFÀ ·`ߘß>&ès‰¦.ò‘ÂÎ"_|q£*OõP·—²û©ô˜ã[¬»;9×6@cJ~håÙ[ˆX„n•Av.À[§ahŸ`ÖFt.hä@þ‰ £nG ‚¹96uáº6“%úäzAÈÀW6×Åçñ"­éï×d|¯ó-+êå2ÂÛa-6é²Ïžâ¶Ï8¶E†ó¥€£YÍéÀ{¸²¢v8,´ð´ ýããà”•qc8 MàÖ'òš–úqÝ?Z´wEÙÉ1þÙqÇéa×—Ç‹<òmÿBfæÇ3ÃØ­±¹¹2Φ ÷#R©U™ÍÐÃÆä)’Rôœ­i@zÔÕ~ÃõñCtNü'=Ž5A‡ÕuFm_Ôn.VXfîb§ÿ1Ý´òf°Z¢à¡RÔþtDvÏÏ×Ç|[¢êÎ` `þ[»!/LV2ÈTsOèš¶pðr-—_eŸâw!é×I“š¨K–ñþïi{)ŸÝyÄX²Ƴ /üoƒê6ñźž>±êLmyN?Až¤š£úÃßåâÁÅ¥èŽ Ù’ùyç3K®9Ó¤¨\CìþÄ4?å¡ ¯t!s¹À‚„<5î½,¬öåj›|/½„A ù{ºoöêØÌÒ- fÿ_¦^î0ôt°áø»4”2^¹@˄íu51ýBÞÿ ;>ÃdŽPVà_Ø •gž½DPÕ-3Tp))1õ•}d?´Gª2ôž°úeaÇ7w/±Ä×J¼>d¢B‘Š"飬ËóY`eFQÂfÍÖ?9W,5ÊiR'™¤-L`tC‹¥"×¾ö 6ì_Uð@ŒÖ8ï]Уp[òbäŒK‚á€9´KG=NqKÚBKt+‚·$–JðWÄðJßמ‰ÈŒ—`•wÄ•ê´gн9~¢h¼³I ~‘~"¹O¶~e>YŸ‘¢V^ÏB³*Œï¢?Õ,`ÈŒ²—n óÁ4÷pþÐ*uXäòÕƒ”¼}³/®bb?[±1êiÚÖDˆu»³|¾˜°®B°÷åºô¾A5õ—bxŽyâl-Óð™ß½!g;ÖÔEÌ©Däù–&÷ rµ rç»Äm4™%dBZʲÒÑI;iOƒád³x}v«vÈ“(ÉñäíÖ’‘NÉõGI7ôh“ÆÑ]ir]6 €7…¯FYEèÚN :jY·Éò3€2I¡j?ÿ!‰Ýx>ŸºÜÓÙÞJ¼a¢%0Š[¦¬Ù‘Ú}ï×^Èçhg'J™Èùî k/xN¾e„YAþr)ê*»-€ äEÇK=Ëß ´¨æ”ÇËõo]ÃDÕï¦kjjü]Ó:Úñ%8KVµ9F^=þKBYBwS¤¶Y©°5ú«‚ÓlØÔ’›uõ/bl”ÛÐÅIçˆ!”Ícϵâ+ïE(èÐæ,åk±™¥c&6­í› @¨Ò ýºm ?*dŸ8œ±5ÀYF)PxÖw|³ZÖ׊/ذoñd¦arÀôÔø±çIÂqp–WtÑ™n…3G¹°C^ŸëôúúMÈÿÆïH­/%óö_)D3ä&¿¯* ré£ NÉ—âo>{ËÖrß“îîEÙÞ6Uȉø+~1ay —ÑÎÞ[‹Eñ(vÞ¤®w ¥Œð©µŸ¾Â_Xñö,߈Z"*&@>ÂÓˆ©yi°B3‚ŨaíŽîqî”%€x(\ï9ìÔxïæ=ª*®T5ª× 2¯sÚ‘±­þ˜‡‹NÑFAÛû+~ä 8½å¥ãPùbÈ-v< Êë…'ëy~Çý0sú~äôøyï8”]® hI ó¦ÈtËÛ/†Í혱”¿XLò Q°LÃe^r7êm=ŠƒþØk˜i«-Ñ×ÿ—»AƒK1œ™‰ÅI+Ÿ0À§íÛºò¶ùšv¿ô d£öïÒ{Ÿm ñŒXaï’|áSHµ ":Ó.>ÃÖÊœÊñ Æ÷NåG¬~,è4À5J†)mø½óv½±í‹ŒáœFèþ3óO‰öDIä¯6È l¢ÕRjÙi’¸£uv›Ñ¤ÿEÜõÞ±©ºþ(€¤^7T6pãG–’ó-&d‰ ïu²×IãÚÿóËÃÄsÑ«øæ-oB¨!Y*Ã1Q ñM«HëeS™·JßO…°R„X«boN¼¡B–úŸ=Ö5¶/'Š[“à¯HÑÐÄJ|þü“~ÚKû[E6Ij·‚Õ Üã窰dÍ]߯rApðø¾b¼4%Üb8Ô^¸ÍKá7Ìk’Áåáwȇûv&«¥ƒq<2¾ý2îýá &|Ö–ß9ü_ŒFïSùIÅ 9ÊŒO”¬"gv0œ+õžÞÂ÷µgþt^Â1¾Lbž´ åºB2º$•ɰý„Òn’€tý "eôÉêÇ¡.¶ %Õâ–(H@Sîô}W®-™ŒÚUEBGä篚gDýïôÁÅÀKÒ 3¹üÁˬ‘ÝΦñ3•‰¾â¸•3ã¬›ÊøûrúgG¦¿µ®u=›Õ¢2‘f½¶‹`_êUºÞWuùÛkäj x´<@LØóTYÅ`,¤bBC Cˆ÷fTm?]^€>(hT–q—Bª˜~ýR¥²Ó['I9\©Q$5‚Úï$`ãT6äõ~?JòmÿÖ^Sª³D¿´Kˆg32#¥â—sÐòÍÄ%Eå´§LØÒïô¦…SîÕv˜,k 0$ü6:1‡ÓÅn&ø%‡ƒ.·<Ì÷©lF­¨‚(«ôÄ™×WáÞä rúræQSÈ)VÖ#üÖ&•­"b°Z6Dìò¨0HG¦¢EQ;™L¶Sê”L²u  Z(zTò*mC„òÔcKÙdX‹9®[1ëÁçRào”žÆFþyí¶©ÄÕœf°fЪT®æƒΜôã8 òݾ~Ày·Jµµ¿·(ÙO^pÛ+( OÏÌ :K_í;TºîÔ|ȵ1¬¸&’üBûnjù²,\pŸ>ͩɄô”B)™Þ Rö~ß ‘À ¥>ûÃçÚ^Ñ '93ú‹Ê’âpwþƒ|Às$ƒ .ÅÜr2ÎÖË@«3†åy¹©LzÞ-¡‡8ÇKd´ôN¦$¦t3~ÿ—Ù;IóP*0Êøñü¼836~•QnL€+®YâÏkKr®k u  à¥ÆBäøšxÄGfð±Vï/ -H¯øvKý8«ç0k5Ÿ)ü²½ÔÔ=àÞ6ê¹äù寅sU#ê1òZz»K½fî7Ýí)ýa Э=P®à`™ÿRøºß¯ýÛ&j!• -Ôæ„S2¨*`w"è£|f‰\Æ›8ôþrùxc…F×ñ­é“?ΡDYü‘•E1$g "ï4KÍÚyUùØkˆá5©mtçAº…ú® “†È}¼¼CÀµ–Ù\±+ˆ!½?'yÇ££þç3àÐ="”wé[^¢áZ‘ äµ|U5óM‡£ªm0Yï›Q´øpÅõ!®¿ãŒQUæÕŽ<­~æà›[›ð[œ]Ïu7ÆÈ©ñ)BSÖ*!Š>Ó0ÍÃnRÈ"©žó"Öd¯(·ª•úHô€ C[Gx‡hHGpV¹Dµ~ÿ×.}"Áµ,ËJ{{j™š)ì„rcP! %ðЉ¶=S¾ÀûƦˆä•}ÄWé³ÒŒ‰òŽøµœ…Ïð }·7ÛHOŠR¹ bÒärZÃü°v’KÊ Þˆš™ ¢ÇX±èO·Èø5:ð¥A—„¿Éȹ÷Ed TЇ’>¼‡Ån3iªÐûx)Àñ’%lžæìQí•[U—B`Ý7¼ôþ22i3/é€ë‰‘Ac€:¥Š<ôÁ|5Y`hñj9z(”ÞðÎÕ‡Öo®ÖÜ ’£¤zŸ‡ç7réZ¨QhTÚ˜F¸mSå.ÇÙY´÷?‰2,V/ix޹¶‚Õ2×k¡ÃÑ>c( l*˜íç#ÑŒ}(ÇÀ‚ÞW”|×ÐFÖ?‚â|ªFkbäR Ô ¨ë ú *¸Æl‡íù•â£í*ô?A‚ 1dæ±JrsmsëÒ*árJÈX¬.B–|±åÈ>Joì%†mêxø½6ØqV£Dà¿ÐMÎM0Ýž:”4Á'ÏÌi$z"¼Üe8ÎÀ…÷@Rü™/1•Úz³ÊŠ;§BÑ ïŠsãEÇfà.êYsK¶MhV¨ãƒ#J’±+.Á¸" áÛ&Â^zvqqOÀq_¸ |®9D—öK¦BžîJ<É`²¨É$¿¨ÞƇÃ`:$ó½Ì>;s÷¸ýpôü.°ŽãTë².™?JšL ¤Çpxã–¢§_Ò}yÁ$žzUÎ GÀIu^ Y•,î¨6d´ù%N@•9\oKBKΚT)Qž#Í +Uª@á^7]VÅ”½C:XÀ9¶ yÒØäp”' ?q øx.¬œ |Á{uøÌ6åù@õƛΎWqzyšÙ€TìªfÔWü¿„ ‡L¦q|6$0n¬ý°€Ðít鈨˂ù£QñÓß û×UcdÎïïº>þ|ã*½ðÇÐd¥à!®™TµÚo˜`AZ©xž7€›¯Ó~±r¤ Ò`»9m”uþ•×›ç2PY½Xþ¶ƒ¬Ï4W³}ò)E;yŸ­.´=Sd?û¦”•'?9®Þ:ˆÝÄñ„!A°PjÅí*ê²€óT\)ŸÝ™"Ô)t[€DÊuF«%Ò°c8xXžTHÛ×dR%Ú\¥©þ›¬œå¿ ÆI³·øÂꤿ¦{„f ·ÇÈì3ÂoQä¼³½ WD7~‹²' Å훬çl7 O ¯JúÑVª)CyŸ¿´ pì}øï®HÊß~ù‡ÅŸ$³ð(KÓ©`0ê-n„l¾ ÌSžŒÑ®ou©¤7…¢dâ&“Ÿüé`bú§™Z×ÔÛ² ›˜§Þ‹Õ1 HwžÆyI¬óÅÎ2¬"'›òŸ·pœ8_ä—ç4pÞ‚é\ 8Uø«O]zckp#°Ä&5•ÍoT¨j(ZãÇÿX×Bšy‰¡'“»Sð&óý0)Í÷™m‘ÏE®~¡_˜±ÚÑòŸN4?ÚsÕV”´¨’̼ǦN,&èE¬•„$sß6˜*†6ŸúبP s^ÝiŠÝQjrSsèÞ¹ ÞíóýF:qåçEµ:$<3ËâÖ]ÿÏ~¦¥HC‘žR8ÆõQ€Ü±Ô–ÁÛ$ŸÖ%aÀÛßXbº³&2Þctzê–.³î'fƒÆÏ^±ôçŽGÍ)£5uS7¬EŠøŽë,⯙@ÊÂÕÞj/H×ö84ÝŠ¼qÖÝmZc¶›#\·„ÕÌ‚‘Ü쮇¨`Ìši5n‰43ªÌgS×@«xŒZÖ’áa§þ¦¥Žâá¦Ë¡á¶½ÏÕÈ ŸÝ'¦ B㢂‡zi¶m©¼Õ>(øá—«¢~‘ „ƒÑ‚ä|/y ¯ñ«Ø"Óútièô7"øW,£ë)æY¿d|sSQª‹ìë¿«!ä„ÀºRPJ÷NCrw¼îdY7ê누¿0¥E ê›™4Í ðwëøÜlÿ›4s‡ìÖ–w*‚‘FU—¹Vn:pãì˜;ù˜’úâa…G<ÛºúIøŠiVèh^L”~«ÙÿgUZŠ S0ñëv- À¼N+e™•íÏy«äÍc>e¡4±üŒ‹ìW¢CçÒòn™öu]®  W–ÈeG~Pž××›€yŸ[€$ê±¶æåmª`S€ÞÓ™EÆÍÚ¡4ö(^I DlìR…:Ž8×*Æ}í]w—Š=öbÛvÐÁØÇ›à%Ç\3ïxMÑïPÒŠÝ~ÛýÿBÖU-Z¥}—I°`dè—_XGL| AïqxE´Ðzò‚É& uW\~©»í¤§¥«£ë­Ëó¥!>Ù~þIC3¹Y@à-7L-$¦7§d/eõ2lÓSy˜™¡óíµ‡Ø2ƒ%1¡gˆ+Ý{à+|R1¸®Šð¿ª_hràÃk“‰{iVÛU'È]KƒW}N܆ü„¬kHš íÒU:+¡˜tu¡…ÃA†Ø‚r­Þ~ú›,„+ùù)uÙÌ%$Û×Ä ]>LLE]›ï¢ÜVû‹šó.†ómÅ·<ˆü…èwuº)ÕéîUt©´¿”Óý.Tâ¨]då‰ÚO÷äzyìY¯ÜfÛ¨ÂÙ4Ö WboþJp›,cñÖ9ØÓ÷C¦â°ÂHfE3¬"#¹7ºõ«Ò–ÈžÆjÃ; j®â¡;ÚÁò`8 š´¶ærsò̶éBè‘ç±ç©“/oÅí¦Ýc8E´ÈÁjZ‚™‡O*û­$úKÜü¸<ñIpÚH¹âx(fxNÀPi£Æ›8¶øsÑ¡ -‘h¹(‡KRþ —†ø$?Dó-tš˜ç!t½â3r"Õg›g#Nðž‚Ó­Pè{¬¿óé•¿Pö:LÁnY•$: çiÜíët3ÊÞ µ/¾ñœÒýÍDGÿ° ò¦Z» ÿ½ZRN!üÿd§&«I—2·ZÊŽ)3ƒtãl½˜¢ç¼]º{í»¬•”…pD@C¥“ˆ:|Tð<’£¯+e·i1M‰RMОcDøº|ÔÏø (æŽÀ‘i: p‰T` %ˆ}nÒ¿Uv·Jæ9Ò©YâÂDê±ÉºUä—DhªqSºuõÙÚ‡BÝÈ~ñÝFxOLMª&¿0»}pJN«_úmLÄ…]Þ $ýèy°°($|ÍOþ“ÐH±É)bÌÐ5Ö‡ 8±ÄÐÁéŠJY‰@gÛ̸j±q°0DZq“¶r[µD²“Ó….H)êjG åM,(M¸üAMQÒÉé¨[çÍu'þGž*yBpÃP¾@#$bh…õöy6’m×›ë«wíðùµ¡@!Ô’º$Æ×vñ†…KÛ,ÝOžžÓr5­pÕR”%w¡Ññ”š <3—0ÈZa›÷|¡9’6‘šìc3š•*‚IÃ-‚;–Òù¾hzfóWR:›D±Ç˜¤ô¿Šd­õ\h&ʶ×É?–*:_–ç¦SΜ”¸E)›x»¨9òí_¾wú{q„ÉåSÃ|Ü\sòi%Zg ×¥ør»p­ß’f²ŸØ³¡ïĹœ œ{QúAT8úi~ñ9F}¹-Ùi‹Lê‘?f2ÕŽ¯„ÏÈù}ʯ×ð1½’TDÎZm˜ôi[õQsªÀºç,@ $g²D«Žž®–A:ã~NƒQÇ!ßÙvTOUd¡ÿN£Œ6t|.z¾Måîù®éïáÕ‚ôØrÛ¬+_n~x›ZbæëµP|¶àMƒ'0Is\CóqƒÒçè¶Øó»0ªWçíu/ÈÐ:¯­g×þða‹'¢Ü´:'F„Ò×pöRîµ*¾Å£²€àxÖ ê="O£ÇX$Z˜ ~­t.àš”~cÑQðüòÑÛi|¡£cŽ› ·8UT¦”ÿá¬LBÆOŠCÌ…·Ó¹6”¶sP¤àßë·™äR,‡# ¸Ú´¸ëeye)*pfL§÷šC²]zvµ€.2å€bC½8ÒÙFÃqó€x<¯` ½Äö¼“Êt7I— ]pÊþßÑÓÝCûتùÜMÉGø|BäbFÇUPÚ©í‹ÿÚw~%¦~ÜzŽˆ‡œ IÔ—[¥xÎëú…jûºÓRýôVX³ÍÑŽú¢ñEãòØš%;”R«Wéä95³*TÑA±Ð³öü’í¾¦PÆsr*¶£^ÃF6q,Y§ t; Ãâ±æ}¨tkÿNÚg ¿7YàÏ"ž7oIó“ØåE¯HχíýÓN­ÞUÜQF:¼ÑjAzSÕ…å “®l{•Ý;S"8ú@^'ãâh #£Ð!CÇ%Yí5BÝ~8¤|Qn“d<Ø{Ì5¾ ÌŽ!ròc÷Øœ –8\@¹¬ƒq€ã†ÃåXõ1Ë/EÚÛè¥nXàjPO´e™ñx„½Ð!‚ŽzžÁ®Ù(Y?,ÚÙÅsvµÜ‚`ÔꪕéÀü¨`謙aÒð|¥S'ä’WÛ—Nàê.™m¶|ZxGŠPVãÙœ uÏ«ˆn›5çhä@õ*ܵ×Má>1YBÓZ=¦—•“ÕÖècRwj]-ÐÊ®ê2´x{bç‚“x¿‰ÌÑU ߫毊ýÛêe½\0–¬ÜuqÁº—wùFïÒqø™Ycþá ÕP¹Ÿ(8¥Oˆâ²‡‘³zÖ\:[’%] t³ú”Ù©vþB<ÿ‰A« îóvdý~ ˜¢| 1{qϨ²ÐïöP6$¿Ácƒ©ãkž³Øh)²Ë ¤&ÿ©8 „0eœi6¶Ô§„#ÜIYÚ1 ã-`'·Šß |æLâV³úvï¡V}@­5Ê:\ )(Ÿ“9ÝørNò™ü‚šêü庥«8ëjÚ~ºÓž4åñØþ¥Ðº)æ?‹/}z»O ±š£˜ÝrR·‰ƒq?¾™ß‚`¼æ=Ô/zœÜªy ¨Q¢Þst¶‘ªHŸÞÌÐì!½[üƪ8}{È^½6àC†”.Ëe-VwT®„i¦ÀRÇî瘜¹gŠ—M?>aÙu3yçÎ$ÅUê»;œlpl(6ˆŒÙÞ%8:ÿXÃ*2‹¼a+Â¥Œ÷;Ø£H®»Ìé§vøOmŸÙf‹’|ÿä+²côt N¢è+êÄ&'‚CÍ*WZB“‚ ?ß,öJ¤<ßM¸ðO³¢¾òFxöµØZgt1¼R~LÇÕFø> å·N_€ÇŸÌ!J\xo6Û‚˜p/º.©<è¨s1Ñ‚Þ~®RœÀ‘ÖNhÚq¥<È8&CSÔXjt«IÚY9Gæ ïvk…ã-Žâ#7iö2`_»iÎt_.mÖ@@³¢ ¹BÑCÉP¦b³«*PÔI¶º ÍÃóˬNÛ(„ü-¶{LÄ’ÔÁCJÖ ÆÌQh7F³7÷¬1 ’³3…EZ8¥ùÀ4!f€½kX—/$Õ¦€%«ûÙ³à'gáìÝø‘«•”lÞ‡uÃpÅ4÷\Ê¿ï$ 07,=Á°—i5m6²ãŒ¤-nƒ´sf‹Æ^S2"«ÓK®tºÀAFÞ¨œÓPܰéöŒTGVKµ'OyžìŠãï²¼ºòTäI¼r|™×Rx™£bËô¸C‡Xž¹á-Ï¡-cèàµEÒÒïk%[ìbÌ™ÄZ ›«¬ß!]çø¼ŠXÖTí™çÑŒ4ÓeDŸ¥Z2úì[†?mš{pÝ›gÍáL1ÌN´©ïXÿP-’›Ôè™xÜf¦øt!,-ýKéú1kzšü­= ô.zªÃ^ÍY­ˆ‘“Œ XãÒ±tv}ƒYj¡éþcßÙ9*GÕ©z5—^üs‡U•òL㔂®†ÉfˆQX*WÑc÷“T6-ÁöDã'Ãĉ9´ÒbÑ”§V-:'»Õ…ýÒV+X¢‡Gò¥ÉÛ`A›>6 'Üóõ.ŠéT ZB‹(渵À2€OÖ¥PÍv‚žër®Bs°Ÿ'yà{3¾ÄŠ…Ÿw Ñsè{0áÉŠeÞ®CÈû}ŒÂ‚R<=Ø¢£czPæª&à3i”ÔòG‡Î}x[ü/ªàõ'"OPiq¸>v®Ñ}nj( MµrTaÌ ùkJ¡÷7ñ²òé“~ÿHÃØw÷ä_÷펮׺à0äCT`vA v|Ãi«‡<õ}//;Û¶—W¸GÜ»zâå ,‚Äž^và̬ŒaÎÿSôaûì•§»òà<ë8Wí³;~66±Ï9R²¿ÃŸC¥B­Úöl쵫½ˆj[\¶å•” Ô²$΂döúm`öÊrµR‘2€8œðë WYMµ+í¨ÇÍ9ÜߪŠèZ‹>-Êùú lâ·•qoZ“± å/C™›p‹{ ˆ†2*#2Û¢V ™¾™C,‡Ï} +ïãUÖ-¡=‹S¹{H]kÙ‘æÙÔoÊãÙÜÎÎ-qu° 'œfQÑ9K Îä™Ã”Ú4Xû!³ºÍìÿ"GK»¬šÕ@ä¥jG#[¥Ò@«}6®“+O@W ¶WA:ù€›ÚL/lÚìs>pñíQMn”ub5®ì¢rÃ× ÐÜòí@˜Å¤‡¸FÃÿ÷‹¦†Ã Š]·£ð–·`&o{çy‘hù‰éýF‘$‚>3Xd‹Ï£YðÙ‹•ÁqA¡="üJKÏ€u08µ‰þúÐ,œ 5âaëg¼ –‚„œÀEÔ>Ïlœ@FˆCüۂuz{[eüõ"®<´²&º„èÐí2>JêZÒa¼““‚ºà㢵7M@tïvÀs4• ³õ¨ n’GXT:µG:>)Qç-¿iL{>…Æ`Ì ?ENvóÔ±;ðµ³nY¶¶‚ðŠö;Ò†”ǺŒ®{6½4È$$œ§†îÃ_«;ÔÎßÚxÆlH~@&PšãJ¯‹|qc¤ŽXD¤ðïñœK¤¢øxN˜¤˜Áy”/’ ’ñÉP®µxv¼zÃÃ*W•61z#H†G¨†‚ÌÌO˜¬7ªJó©ÙV”èà;ýºŸB†o¾}ãUìÓ®& /åÙ_qú‡y8 =RT¢žƒËj;™µ ¢hé*´Ê…m¯¸çÞœ&ê3{Ö?Ùo3`B™©†ž-ó½DŠðú~›,Sù(¨Sþe膌™†&êÖ'Ì9D"ß Ô ‹Ù®SDŸÚƒ•{-!ÌÝSéúõšv]clŒr ùr.l#õ¼~±µëÛ*zÝd $ó¶êhÑ>·’Sž/g:ÄÜø ¬ÑÀ&´á°‰¥ã<ÓUês„DA §P¼un Ž)¶¹ƒÝ´5]Á’­çg6&àÀˆ>B°4]‚.vCϬ§Ú¾¶s]Çy¹ôYjŽxw¥Ïky 1wI¥Ó*ÈB2@íÁ¿Õ)Ö8ÕØÏ³dûß*‰KŒÈzbZJ Àú¤Tu[£&6ÿ9ó³hÞVh4Nᾜ|QâÙÖÞ´ M==  µ°ß„¶jÀÞ3ºµ^öîüÌ\þ¼dF£¹OƒQø!h÷s1÷…–6Èféx©ƒ«NŠHo{#°ŠåµN§oãÊO¨؇¿÷¢…õe¼‚`…Ú'?Ô2r†8 0ÂúóXˆ0Ê­ì>IAD³€Å^>ñc¥ëÖsöÕ²âÖAØ0Eí,æÁ UðÂêIvHy^H¡™V ž}³Úc?ˆ9ìrL–ê¼òûXiâ˜[kêFÑV›?y,RÛB0™áó’×{j¦ÿŠÈ4¨\2ÓúÃ6~$i{*áJ¢\¹Ç8E…VœàòtݦØq˜ç¬ôÀy%{,¾Ë‰¬z¼Š¸Ô¸ÿˆMPfê£)ô^DaÔ^‡†ÈëßßÉd سÑÙ‹.ŽJ‚èS’s@92h å*÷Y:%¹˜ª¢]ˆóÌ˱Ïðš£â4Ì­s‘í9FâW¡Ùº*KöãGN–ûc$¢`…6ôÁŽˆËûùÄŽ0)Y©(”ºÅ%þ=Éè¨É”Õ%nëæsÐÔu·×H¶æH\+LçƒïÄ2uÉ-v`ûin„0Ì<Ó6–®Ãƒº?ö K"Usóç/ë^Ƭ-­÷ÔÉ•©]:/ÍQÎ R'°ºÀ5c†´ny˜ȇßÕ7S×oЛϙ¶0>â¦nëh“,i…«ó[ìàÙ÷ÍÙO2*rZí£% øûˆQ$M½aÿª=®~é<@E¹Ûb·_Ÿ;Òj$K(…HËMaaþ£69iI½v…Áëþ™ÝLá>Ù‹aÒÀÆ"q6y<Í>Æo֞ر¸h¼óT_„±¥”O½«Êc’ŽŽåéïÚÜrr|xòÛ½ôZ‡+Ù6Ó05ue·Å½Ö!¹&dü ³Z?|Ž5ú}c“Óà[~wlN¶õ-xudý£vRMY>´ê»C "ôå({3º‹@ŽMfž­zô¢˜ërp꾺ÅÈó*¥ ð$–iO¶êK¤ö¨Ö7²nduf…úßÙd1-J¨ÜbÆo »jlKï»f‘ßw¶äÀÌ™‡åû…J5R‡þ= •œ$¾ß•ù¡æzê’9®ñZ)x2þpÂv¾ ¹5ù¿é²J»×lÖSu±4…%‘Ä ¤íàKÀ¦3XŸq’&¦`(xÇ „ŒëXÁT{ÑC§HuH_™  …†–ejcÏ¢À:a×\·B­y q¯Ñáµ' ~y5…Î\©@qQ–(ÎÄùWð>Ø%ý vê¢ç¼Umi~ë§­þü4Oßu£|x=[4" M{(<@Wï&À1 1+:U1Æ· éEã øŸ`ü%Ä?!D½fÉöç< c~T­M\áÃ.Ìqì*߉ô‘Ïà{ìÖý»ÐaaEš }N<’Yïka°_¡€Ú`±XÔy&,´SðJ–›]ûdxG¶½@¸ºqKõÞÙMBx…9þŠ$~ˆ­î7º™ÕÈ»ÜæûÞù:ÖÈö>\}œ³ÒÖsfΟqÅÅÌø‰¥Ñ(/CbäyµUs Láx‹Y»ÞÇÁ©÷/ï-yê?oVD:Jyïso2¼£ O‰‰IœP1×¼^4ŠcØFpÍL±(³ÔléÕ58x¨vò8½ò÷ÆWÐë6%}<•^Hè0w ¸KþŠj‰4ó.k>^ÃÇ¿,¶Î(*ñ¶òw(–ø¼È»?ë‚7÷!™piñ2;r É:þ‘œ§ ¹÷¿ƒ‹ûM|'O:]-Úºý„ö„$\—ºv°Í ÛÎwRÚ^ÒA`¿µ¬¥N€T´Ô¡õÚñ±g:xqP¢ðZ¼nÜ~f\Èñ[ÿ,$WáK'ÒÎ=gá`bzLTQJ_ñOîjv º8$FÄØHÆa-]¬ªº-°-Œ_:r7+Hž]‘˜$8¯‹¥§?‹I²ï¦‹ !ê˜*ú5†¿Â‹q@KQÏni»øÅ°ËÃw¹õ‹7d¿7ËCæõÉvlkã=n@˜Ò<·›2i¾üźD¨Ÿô_hÀbh%×›àuƒ%u¬ç_ã{îd.Zâ[ cÀ„ˆ PY9Ü+Oo@š·1önj@3agg¯ú5\ÜôÝ=Y˜-ðã'ÄVÃÉS ï³x¬žÿøg*HØáÜ–³Ê’ikl’¨Gµ8¹€´”[ì^S›‡;]|o…4˜Z´£kŠÿ býy)Ë:B¿'vO´q°ëá—)/§^­£l}~;{‘_Ô¼ùz£Îs¡~kYZ©^¸I|‘Ñ8/¶ùc`£ 4 hgL†_ sÑ7¶ÅÄcûHïóxýÎ+žœ/e¯Í`a`×XF,ÝtÀ¼^9Ð27£ÉEø±‹îÂ:p…š¤¨CûjA ã/ë{äs®™² é¨ö´OÅfTºœžß! ëÎz zæà‘úÑš«u’ývÉã‘ﯽádã>OÏ(€k™ð­vÛÓhvØé3Š(ùÕeÃ=’‹I½3q\!˜ i‚Ï—ã§4Ëçý(¢Îe‘å|Õ¡¹çkÓáß)5ŸQÚ±:pEom^tZVQ¬ä™{ãªR–Ö„•c«ˆùš þE¢p½8•s± Tɺ°¹15=»’utÆ„[ÏÁ ÄÌGO7$¿5Œ’ͼ–új–þ±»'o“*§4EÜâ© ¡Ö›q‰´äŒ§ïõd”Q¹Cõ¶Þ·k™zl4í\ö!éH%!מ(µ_Ó—úÚ]þº1çkÀ_Î5¨ÿ@<‡†ŽÑ+Ïûùâ3Lé£ÀaˆëNgË”ø¦z'©ÄÖÆ ƒ¤Ú©Ð‘åä—Xms¨GÓX2¹…«ÞÒñýƒ©{N¸|L -ß¿l)|RØ;§0<#çKÅÿá6™5/‘öðºó`ƒ¡aËà¡âpu;ø²%ô7¿¥B:LÎ%ë<ŃfuÏ}gkáø-…ÑKƒá+N«Azç‹)§šIÌ ÿµô¿ûœB¾ˆÍí`ùöÆ¢³!hê@D(ƒ ¶ÅEƒ5¬2ÇiÙ\ÃEM ÖÁ€žWˆö=O¨ÕØ7È!‚Õ h. 34ƒ{©ÕIÇ¥DÈ«ó׈Ä5ªÅMu‹Á0ÝP–[1ÉziÎöÂÇ&/È{³è™¦æíûJ¢JæÙßIäuò&N„pw®¥­ƒé§ )Z4 Tid%õëFc–;$Hñêí3±1Qäó%óÜ!Oc5ö*RîD'_›4ä<‚7:\‹Õ›¦œý³ÊÚS€(Ï€cÚò•€|mÈm›tlfêÂÄKuF-]ÏÜ8,rF|¯ ÷ü‰Õ8c·Ç•Æ€9iˆ3ÿՔ—6ªnܧS)iÚ5ùÔõùI˜wq–žË`|„}lÌ}u²b¡ù7~OÀ¬q¬†× –Ƽq{¢9|”Â^¡ÔEžžâ‹W¤ôAâTìÖ,Ä aÔnÒ ŽXãÊLʵí'È<7&ù¹-&Ò>Eo‰AŸ2¥º˜JÞDŸÅê"ŽÉ³j ¢ ¶MƒæîvKÁþ]¾<. uhu‚ý:™Ö.¹ŽOWfmèa‡øœÔwjÒ…ü­„Nz¹Hr½ª±´®"qˆØÊPg.w̲@±ŠN~5õ$fà@ÌwüÀLeC/³¢÷ùéÊŸüªœNóK6WdŽg“Ŭ¦Ñ×xyi„|‰»VøD€¹{è˜ñlŸ½íÄ1cÖ8BU¶¡kÈç .úÉ0cŠhŽCíŒ+n´K ÒuÑ“¡5¦‡ ÐfÎD _Þ|&û SP{WADé¾Ó5HŒé•¶‡QÞL @ÿªq]](žìj<5tkˆ…ñ]C^ ý÷K9—Ìû½2&~Ý{'ÉÊÆ+óNJÈ-Ãöºd|G mÌ‚[•û›zjD ¸Â_«'^ ¸ñ…åv÷Æô­Ñ”RU”B?;kÒÅRSĦQt½™®mq“¦OÒ¡ábp'–ùâžn($â< ÝuÝíÞŸí-U=R‡¥‹ž5ÔïaæL)²ÀZ €ÍÔŒ\díÉ ÔÞ=%Ù»!Ã=úã&‡ú_ {ž5ômw¸, |:X%Ô=Ò& ªàióñ<ƒõº­TxŸ¥i£¡Øá‰¥H043#ê=£C–ƒÏ?–λ[X€(W4‡‹‘‡ ïZ¦¹Ÿ1QnýóËm%“B¤wô]­öte’eŠR˜ú+{DX©¸|UÛïl‹`¬èöv.€VuÁrXø¿×æ×<9ÖNóF:5;‹yÓ›‰ûÆýM[”_çÜÀR;¬ª°œËõ£UÖ\Æã`Ñ›‰Ç=6â:$©„äZ!è”X3‰œÓUŠZœ’\?‡Õ·Ô†²‹ë°¸iém"÷ êôÏôqAI+&c¥×}ÿÛ”®€‘=ÏEÈ,ŸÐgTþD…od§ÆþLý±ÈýL‘GŸ9B„Ì ‘€Òì½q¡àÛ¢ÑÁ?Ç·l„ôYíîË > ÂH!`Ùä5Æ·F?¤š)ƒµc¶¥z“|8N¿Ó¹s`nÐ,žDuí lߨ &§š­Óò)î\ÀÝoó8ëŒù=£ ¥æÐ“¸°9uPs'ÂßJësÆþÿ•Œ‘bz”pÄ,íêõ.!qŒ]¿7Ã’d‡\UÚ̺’\œÎÿ -oËß›^ÍáEHåñåÉY$xFžH¯¦€ìI0Úåeþ.råü!óH<Îëå6*ܸ×é\o¢³\;WÞmAÃnÊZmFiS¯ænʇã]©¡ýv‹Kù±Duÿ![ßíñ­•“€‚]èµfàÚfuh*¼‘M­Né½K¨i;n5¿ÍPSVíå…NöК)]|]ËMº-zóó8ý¤VE*——Ú‹{Thôò$ Ôò¨%*Wñ„v2ÛÕ?86ç§ÿ%Gÿþ­aÍ?X0 æË;UXÇì1<¹NM|ßš|SpÙÏv}°(KƒeÍQcÂrx¿‰³qH½!/³€´?BVAÌM‘2€ÇV[Ìôú–¨£Tà0³c8†®Ÿt%fjVõê9]ï6ú^ᇀ„¾EtÇ-K7ýÅY}r­<ÚR®û¦Õ£+PN¢Äã«rdŒZˆ²;'ü ÄÃ>:R°/½Ý®ü¡ƒæp5Ä}ÿÉþF…ƒIý!7•º§ÛrrÀØ‹;£ƒ£'ÓÖ³]’µÞâ\vLF +ˆ˜Hï>r]C#|y–Ûë'Û´ÔO±|è°ß,È|¸}ÎiÊ´E‹YÅqb´ìÊ|Þûš0.VÀ…óƒÀeÄ%Søõ‘61¥°îoÁpMG Ñ‘ª­`ºÎ±'\Y†éfRX¾év¬Yäå[ùÇÚ­üûR+tÍ[ BùÝS=ø)d ;€Ë*lßµ;ðĽ._ª>KfBÿ“øqtlÐ}blX„ŽJRb…çÿè§GP BùÝS=ø)d ;€Ë*lßµ;ðĽ._ª>KfBÿ“øqxYø Íÿ•(F©ü|Þûš0.VÀ…óƒÀeÄ%Søõ‘61¥°îoÁpMG Ñ‘ª­`ºÎ±'X1â>H-i‚4-‚lÚ»=aÂÔár…3ô‚GrÕîšæ†¼àhÒ+Úa(‘âL|Û0Ôæ*QÔ¸5œ¹„d¸Ô¢ó>p“—ì³Oá9ŒŠhû7\’sg) iÖàhI\6ó»HÄÚ'2¹ÓÝ_5ý&4¤b-®Cµ‹‡¶Ñ¿4Ùõv5FÄ¡)~¾I¶)ô>ž$Q_ÕM3\“žhoFßõ9ào5¾–LÞY÷rgØRl"€Z-W¶ihVΔ%ßÂ+?ppd.Õ4¥̤DŒîÃäA ‘7qèéZiÏ—žÒJÛ´½ïlirí‰_ñ'ˆz›€ŒÛ{9áýy„^ ôŒÖñlÚ©é±€zŽY Õ«>ž×Â) Ðþ“X3 œZwbQsÓP>„Äê\5RjØTÇ|±Õ&'NêI–ç(Umë›û¬F©ý!RúW ³=YË Ëìy×Áú0(±mß5eCp@f$²SJÿ”t…PÓ²Ž_5èëÓ̶xî6D­êPD;¥Ópó€W† ÀmbÊnm:ÂÄj«Šdå¢-Ö +7H'ÿ©hÚËÅ#zø¶L%ò×Vú©S4l8¬3uÏØoXµÓºÕ ?åŠ踟°Äâ{Ť©êAÒ‚†Œ A“g•=:¨öA6Ýî¿´eê¯xTÑKÎPª4ÞéØþ϶Z }![lpE”* ™ )üã@„žÏ+£’€ø*¿¬NÂ,S¬½×ËÌ;T@`ÇPÞ*Ôªa£I) ÷qsò÷­ÉÄpö£³bÅû«•“íeHdÆÔõócqÜ3ö*ù{±´—ƒ*l!ø¨è°{5žŽ=@šSÌ A‰¨ƒ`§Øé>»wnÀ².2ŸÀw0bÅS&V€áb·ÌÖ’ßê¶<äž2”J Da³Ÿè¼ Fû™˜Ÿ6zèªĪ|”úãÐNÿAÛÐóOBß1‹¡«¹Œâ~ÒVEâf<ª?Ôã˜~¨ò,·(U‰N•,`èY¹¿IžîÜã£LŒê¸ôԚϩ ¼•ê³ó¸î²á²ëF¢‹¸¶tGc¦±]?¤bËøÛ•ò ÁgÍ`„7c=,kºþØŽ+X¹Gä¡,¹½# ¯ñÈ?ÄUeÈÀÅØÛÖAµvÎZÍ¿ DVzS]Ú1:€:»œG“ÔP¿\AQœ®²4WC¤£+õ]UåE¼zøC¼io®O«&¯ð²…;¨ì]·êIˆrv¡Ê±ˆ÷¼DõÊ€9 äµèû "‰kãZ¥ÑçiËÌ#’Š$­— g?RFÀÊVOJ¶¸°è~Šo? l…³bòÖBiw†þpá\g S¢"›º:~XD™`í.<‘˜¯eÄùVb¦Â/¾Ò]ià†Û5:Ø®š'RÅãºÌÏïÞÓ±?»æ°Vù'ÄŸ9}"I›J¢¤½O䯝­Î¬†Gã§;¯oá´õ¦u(zÊ*<ëCÒ; ÿITh™5D²rÝÀdAä4wZæjè‘%à›(e8ê¡k,YÌ †UŸãØ–½hzù¸“*¯'15ŸÞ$èJ3Ç=aK6iËï˜D¶-næ³Ô?ÔCTòËEÔ+#Å8ÉX¥¿Â¦n@p%¬xQ™`úêyÙÕKH¡7úLžÖ˜Î{ŘS@ÜvýŽÎõA=¡®ìUÃh€~ápº:­àNœi&€»¬‰F’ÖÚÕ3‚ÿ°ÈI aNήªrmà~v½8FŸÆr«=7·É %o {6v¦ãKå¤cHzp«¬ãÄVË_vN5³Xå¤wk^Hyûǰ „ZS”“uƒ‰¥@‰Å¢·ÃxoŽLF å¶×B‚€‚¿ D:˜éõ&SÖ "wßåÐ]SR)*FÙ!J&SáTqgަìì^Þ”mF¬1Yß{pèúL ;¢5ü®§Ì‡`(LÍàÃõF¹{[ÎoõØI}¹Œ·‰Qph *ÉAy&˜ÙTöºÛ E› Æj_ÝvcSã£0$ô:ZX­v¦íbP ï‘àïÀ@ï$1ˆËÃp'Y4—ÖQFYÁ•u1¼ÙËñ¤z býîo'S¥<(æ–9›a3 ±zÊž™„hÁ”zÞºb}+V'Œàñ•¥C8@„ô” Ÿ+”4H]*Štœgöô&¿,6dé‹”©3h[u*–Ìa¶Gc™z!BêçèŽÐ{·3ÑÙmy–¤ˆ`³=yáö´vç¾Y"Åéö¬«[„`–™ëg}sýǨ¯ú®s–½o$ô¬§”Ã}÷Q"\7Õ‡r÷©º j Rì&Éú[Œû¶ LòÕu—‘jü³ˆ,¡îæ¹bôiQ…â'NdW4ŸcœH®|"@PòºÝô…SÎQåêÍ.*1|•TÇóV» @öìFU"é™à=‚îš"WáÎ~à¨8"¼2¢Wo Tn{Ž=¯¦ ¦mùPÿŒù¦„ÇV XKf>†îkmƒyÕ×øÔŒ´Q7¹­HJg]ŽÅ•™V>‹ká<¿¹Í±ÂF¿øa:±ðËÀÅŸ2ZQœZ€¡ßúkº1úqyO§1¹X „fTïÞ qŒj‚XªL’B"SÜÄø ߨeý,dõ A¿2¬£¨,½AÌç¿Úe7•ms{_fwÌ´¦òWB‡éÄw|˜ :›ãßÇOçL„Å×çNЏ´ÍTf;ÓŸ8ÿ$R·†2˜€„³FþqÇüÀv¯¼áðÇpÓ?iß Q 2-î>Ô!ì_<ªÖöV²¡gNÛÚ›ÓõÅpØÎžãEÆGðÒ±Uq¬*Ú”Gͯ‰ªô”¤iòášÐ=On¥$ŽÒ}¼*” `»š ¦¬"Ì+ÞçM«V®ÅªPp|"¹\ChJèÝ>òÇ®zr›Àg*œ5.1«Ê¿ò_B¿NUlÓÀÛˆåüô’¨ñK‘3™>®þÔáBOOQ wo}Ë|{[áTä{?÷»¥ï-Ìz0q¿¦&µëlê•—curBPg1ïù ˆ¬<íT[¬ê£fä× ŽÕ1ýÜâ|k.£'GDº“2ñÆC³ ï2¹‹¿©É¡Yµµã™\_å(3¹7KÞŸ%ËGfˆr‚(\[DßrëßÿlU´vV"`¿ÞÛbiáý‰!.»Ä)ŠÝ2\\z`—=Ä¡ @÷ý}lü§å! ¤¸™_@­âÙë‘YÒ‘¸ã²éPû¹iú[~%­¬_w< Mq¶û7½›3ªm7ÜÑzÕ«3cÓॎKo}!VÇáÁpk¼û]ÏðMâY‰ˆ;"ŠIÕ€A;T€£¥M:,í£¼Sén‡E­i4À„l©‰€­¹2”Ë’šüÒ2[ÁM¡+”-»-[‹œËÁã•O)vvÊ.쌢jH]ÇõDLØ Y…Jäò­ woN çëd{K§ùŸã1‘¾d.Cµa­Nt aÔðz” ªØM'ÏAã¡Õ¶¥Ú”QݪÐŪܠ€¾ÍO•x´×ìšVF×a—Lƾ~f¢Ô®¨|õ yž‘g1§Ü1;~έô[F¤Ç$ÈòQOŸÝx¹+<­ª"òxî\I3Xn®^}y¦]P¸¸†¡*8hw4HR»/Iù¬‚åz®M³Ad÷Œ4Ô3,ˆ ˹AŒ;ùnwq(’cÁGÑ@ rZEZ /µô·ï$>‘ ¼õ÷5o¨("à»yø-?ƒ#ÛžSfL6oß÷¹j¼»HöÃà+¶öw•´”0I¦ÃQƒüåqê¯uæAþzÚ®¹ü •#WU:Ž[)ïÙ“Äwô¾#éà‰Äí7÷£„Vâ|&1WLŽFãþèÈžÿç[ûCçu^Gx´¿à3<‚VDy¿àT| gJïIÙ^ô•›éÍ#Sr7¤0»}äq“ øXÉÐNNaøß-¶®ƒÚñþ×sr]ÑLÎÅ\´áʼnBö£ yÜŒ¨fä/ÏÔZqÎÐ?€þIíG-nU=„Ó½6«ÂÍÊ)6DIîS&L¿9± …€‰pdÊq Ž/¨<60U°y<#có»PM“pÀÊD}A^¥S±]Ó;<0ÂVD˜Ð_ÈrŸ‹¤ê<œ|M³þ(8Âòê‰ß29ܹM‡Y/Ržïç¥X\ÚªG¤mª0yØcÉ6PW’ù%î¼Q‡¿î/IûºýI”ù©»Œ)+ºWÝF GŽÅzýø€¢_¾pµ#šì%¼ø8Yz[°Ðˆòß}Ê<8s¿´ëCä1á\•]Îڒܾøœ@«¥ñ¬£œ|^é…üØÊ{j /Jô£˜\@êQ ½KDþ±-ÑÃT~‰qs¯ä–šÊ”’6PöŽé‘sªž£ÏÛ?WÄPÀü!¦uŸæ3cttâF6°þÏ´DªõÔ‡GTõع66¡¨á;úªmÌyS|üRÓ´ð,¥#é”î‹ú~„ýçXR ×Tb†÷}îëá÷ÂñiâžD­÷Fœ©îówûû˳•e@2‰øšJÙÔŒÊðO©kχÃ|Òù>çúi½èçX–¢ö¦Ï~Š–2ÓÄRéž#¥øÉêk(tq›áU†NKHìå-ç3¾½×ÊÄG² x3Ç'80ïÙöª02²Á©Û EÔ{¢7©ˆ«sŒ!" qÀN#o¬Òƒ~°ëF¨u¬(Ñ¼Ôæ‹­•K¸Ü‹MG_†Iðæ>Gµ²p§ËáÊž½Ã, ówŒÌâ&Û×vû³XçhÞAõ'M»!¥ ÉÂCx¨rq@HnVêíIüù½r …í¤ÆSát»`4áP!G ‘½ˆSŒÜ2’`\€žŨYÕYJq{Äb|2Eüa¬?ÂfµPvýÀ1ÎLÔê§JMâÂßA™1æãIÿF#€ªæ? #a‰tÈz†è|ú"1/X°.ГáQñ3Ó¿hæðBÚV‡?ü'¤¸[x|Ç7 ˆ`'·¯úqMÌk$ ñh×g~A¾WBë‚_Ÿi*³™ôæ¢:“ äц Ø £ls²6ö+„ÌÊè7=@¹àr`}á7kž©ýÿEÁ7³3ÑnÿÃæF"2*@J¼buL“‡„¾JæFQu# Lc!´?µŒxs$\ÂAúdZ¦`ðCÔ–eF€/Zk·¨oˆ³¬Khé2npj$«)"Ô´#Ôù²¡åÈËi²q¾é$¥bÈwu9 DG˜ÔÁp¼Êçqè"àý庉@ßúZÝ$#÷dÈNÌÔ–?DšEå]\Æe&…œ.pýÈ@ÈÑÛ^>ƒÓë7ñðrG1èUØF±ÞyZYdø¸¼{eסœô3_ËN(Æ7Z# Ñ EÇuŸ0sÿ’%e!KÈÊÛà[Oè ÄChÅFwÓ5ì#\ýû8sá×·.pŒ–ÌÇFeÉ;ß»`QìðÓ!}c €CQˆÈ Ï€•Íw³-ie¿Ô©^8ØmþS‚KéQ“””U¯.!ßß ž³%V;“ÔBÐÆ-óÉ×¥žºµïoÜl¦¹k2Š4¤4ÁCgûü©ý\â·‚m¢ûÖ|2F`«‰«JÖ/‘ÒŽd=}¦‚¬QI.§ŸB¢ÈúÑ*jh¥Ë:$ÄlTÚ¼”3êîEF;Ç*?Ò²_ptwvÖ×ôJÿ­ùtEj˜ßäû%¸©óÒRë mïZ‘ˤPó"t—¹èŒIô^»—q{%àRû¡Œ†2éú…\~?Úu Õx,?(] eúV=BNl±†T¶šV+*EOñrih³h™Ù¬ŸÔƒŠßÑ~}¿Š÷”°·›$dËz+&¥(øö•\C¨ªú2Íù³ê0D'‰òíÐì}þ!B y ®e­RQ÷²qúIÊÁö¸³d^)ˆâyöñ6 œÙî(ûH szø/$A%2}ü~Š_œXGƒ Þ4pô÷žX‡Ê;Ô®èºIØ<=3©ÇV¹޹uBc¸«UknöòhÍW¹Ú¦¾íFE£¦c[*‰iÃ`(¨Âûò ÕP’ëÉOé´\´"ØÜûköêãiÉÄìbÙ½þJoÇ»U½^˰Õ)µ7 ò‹Ø›Ï͈”Êè:d7`Äsæ^z0¥¹V¦hѤÈ$†ßQ¹4Ö¹õ÷_¾Jº8r5¤Þ°YX/î¿ÑúCÙ«ºÇÒW¸=œwÓ3˜aÚ|1ŽéU‡jѵŽixvÒ“x5£!LàÚ¶<ˆ·‘<CŽ…Ùî@èé„5;i}Å—+/ÔÒÖ)ªÒ_àæ9”Ÿ‘/ÝŽ&`]ükx‘+ÅmÊN(†vBu‘ù#¥ õ  >Mcƒß+Ýv.vÿØÔÓ¶yîH-F£™1…ÝVc ‹ †X|ûñÝø>c'òf]Àb:á –y:ħ»Ò>_ƒS„tÆÀmnD7·¿·Òq®!&Ûqü©8÷§J×°¡õ2KŒ˜¼´çV|o/Æ-"ýÔ°äÔTÜ•ªK›ü Võ÷,($ ïáŸÌ›¡û²$|WšBÂwlaÔR6¡®dn/|TQ1žXâå£]Ô:ð¶VšVŒg«.÷ßøë’ ”¥b¸‰>ÌóÒbÅ3²ˆãž}ôËÈÑfÔaÜ+šÁ1u–\¸H–0Œ`ÊFÓ~¿`Aþ¾nÿ­U72½l™#Œ³ $&Gé}}©ød²[ø;ç]WZDH‡‡äeù}夜žýõÞÅÅ5w΋ÜÒž€a9&® ëXeŽžÙ«­2Ð\½¬i.Ø;»›¢AòZÈà÷Z¡ðÉ™éGò‰¢róiû ‰*Û)¶³ynïá+ÿ#¨‘ÌĹq©¾#uÝV˜ Úó81_]¾Ýq‰µ³ˆO_§cø¯F4Êú¹ìâ´~paç!)½%?lPB^^s›!Ïk•pñÔ6Ô˜GxH6S>{ÝKÂYT¹ºÝ#5Hµõ1(„? ‚S{ŸRžÚ ƒÅ¨ÙY´,º™©—ƒ¼ž†ÄOh7µ>ßx±å/ß8€üK­gEñ“2eÀã¦.DxÂ70w*œŒhþƧjfNÝ+ÈX+„ç“Õ=tˆžbè·ï•œ¢9µébô(¨`¡Mm‹qý¾']½xŸ·´HM¾‚BÊŠn Õ¢*C…eú‡X5bˆÄJ[š ÍøTéÊÑyâ­¯ìÙãÐe6Å£“‰¤Á©kû¿EÎÏô.¨™™pöhik 㥮¡ÄÛœÏà.ÖKša憫¾#E=ä[\*XØ¢0AÃæA/Ó*5Uñ7ü?yyOJ@r¥k& ^-¾Ì?‡üo°YHg]ß9ÒÄ¥z<ö¤L˜}Üëֺʨ‚¿ÖªsBÎVædHë-R~Ö{ùDK>–p´êZp6•%ªg/ŸGh#E1WÕa÷ÛŸŽo—½Y5A.FQòs“v %Yp ³FdÕ¥=ÞÜm·‘¢à¾*t£)ˆ¹ZSuKÒ “ÇdÇׄ×û +h ËÓô㉺¢S/@ÒNýÑ0Ö*¤º /Níã-3Ès˜ND¾¾þ>w k éàjäA¡2Û^][qlduŠeÇ‹PÿB@mO”óÑ&ª¿Ë:Œ0M°  LÀH››òúÏî˜“ÖŠÛ iasP¶¥û ú^l.W÷êTÛ˜ë—ÍÝ ·¡óa ŸÉÌ@¦©EKÿä Œ뉘ØyKÒà2¡­ÁAT$BØÙ†X @¼NQ²‘"Y{|–ô+´³¿œñ Úísínt ŒAL†IÒb\³MC}¬ ‡­ØZv cÀjØ …Gªÿà{¢[Š©=ŽßÜÖ»de5^2%ÆZ:Æ/ «÷ˆ„ÄžtâÌèDÜ&‡–£V‚%)’T¥¦µ¦?¾²Œ<9ÇÙ ~ä#áBÊQ óåÑ_ø‘ZÄ&ªî C.É4ȃ±¥„o=eýŸ¦€d¥Ìû*¯_`Ö0R?!PëÎ`õ—Æ'pk'å«­îºï®ÙP ±*“µP#C³ÝöÍPˆÈÒ+ŠTÆ#.ж‡Ç_ÞµÂ@D:Å×üWÞ7ÊÊ®¤rv²3,ºw'»• Rkòÿ£zõ&Qdø×ÝÄÝåˆ Y= cQǨ®É²Øò£ûqUóaÝåXS)ú>y·{w&hniiçÄ ¿:±îðö°ÍNBC¢S«‚ë¥õiȤÎÇ‹¾Fì Æ€C44‰·¬nß*éf:pS𣸯áWiA–8ZZmszÍžËU«¹º.uý05#yè¢r²*i(üž·­êtIÕË„ Ü/e°Yס‘ùéH€üÕ‰ˆ÷.-Om€ðé:·:a•Ëâf¢‰ç™ëŠ?‡wåÁÐZE Éâ”_•‚kšvN¿Ìþ‘½TÕ"C°¡F±"BC °ÌZC4ÇU>.Å4cNŽæ¶'Cê ì •ÇŠcäÝÆRX«1 ÇØ"¹o~dç6‘Ä)f­¿»˜XwÀ èÜðo±©â‡o‚iÇì+nD8ž0úË’8»¬; ¾3,Ž+ܬ¢™µVŽ´¸Fáxç¤i§öÅäÿùCÝwS¸ïÈa'òªÈ`áÊÚQ舋&`2âÿÃê’=»j&$¡ïwY:Ciz±G‰ÙáÓÜ«äÞÂ%ç9é,0Çœ†Ñ/FhrçIiDÍTú-—Ü—ºáõ«A*¬#M6¤Ç®a¨Q‡ö9ålF¼ ©éˆ¶q—»Ñº±sÖrRùdݦ¥vj×â³±#]KÆ0”©…gugôZHøóË Ørf‰Ifî\¢ Vk(iR³þn/¡óm­%!ã-Ê[u·Š–&³µ]ˆpÆdy}dZ¥kžòMâÀ'ô ôH޼׫;ÆA²÷f¨Ô]ü1ÙêeLùG}^ù¶Ï÷ObL¦|¢7ík [5Ñ‹’~ž%"˜zîFÙ‘jDb¡Ns›.ËÝe v-éwP7J|7-Q§€ x÷AË!ôeµi9ƒÁiǵeËùmW^­–ýù×dƒœ>é«£Ò EaHžû/ræ~êU ül­? â\÷Ðÿ~¬è^«à!w'Š4ùOpuæaCj ¤J~™_oK²¶?"§M5OK0,±ë )g”Í?²<åz‚¤ÿPq–$9K…N¬+ª²xd ¡*(Î,Š$7zmIŒýÓMÚ’›…>¿´²{F…ô-¦ßi—è²óÀ…Y5I±~PÖí˪B‹:àîM‹Vƒþ§ç³ × %’=ÊÏt%qñêKNBûÚ/½[Ãß÷6¿zRÔËØ‚ˆœHULRÜR& !÷e‹‡ë“Pp´ïA¹æ}–þ°©å­íéç;œ3a($4“þ–—õ¯#ê…)?Sø¾ÕT·+,惧ê˜GiÈ>¢ÝW`7L…T¼(æÐ¹‹#ÇÇÚ•aø§4›½¤¤¶‹·9`95ld•³Çy·ä÷i³7ÿÔ©U—Q5¾ÅV#6ã¹,h.æõ‡WzŸŽXrç>@x°±™“Î)i–xh³.‹!¥ÿ†þ•‚m-Q|èᓤ×ó?Æ­W¡7ã®Í›}€l̉À‡zzŽóÞ<`HiÊdÜÅÍó¨o:d… ¨AÜ»OoF-\DÀt³“f;éÚ§Ƥ~n`†µÝéíú¬9]¶# <ŒP“Âó¨Ê๖ù„u5NH‚fÛ-ú¹îFçëÑò¼j4¡ú#Ò°‡ Ä]ÆÙí@þ9€kÄã+ûØ vdr‚@ŸÙg.FY‚¯`òèϵI[Õþ2F)´ù¯øJ”6Ÿ€ZY“\­Ÿë—&gOÎölŠvã—w…1ßü{jIêÞ8 ¼í ƒ°%σ›<=-?1,~Ò5bÜ”+”tÇtk£—“c¥“t \ˆÅ"Z´Ù\(HcH%-Á‚—ÜõàƒÂ?€¯‰oÝZŽí…¡÷Òw|SH8¥ÏCYêº.%–„•Íø&ìóÌ¥²~­•¢Hí£ É;¹,ìµ ÅL=½Bñ™PÇ[M‚_@œUÝcåÐ(‘x½¾9c:ÒÈÈa¿¥OÖ›ÙüÀ‰óN]coÁs^9ÁªãÍï,aõö]oƒ "a~y<\ðÜ ðŒ§¡[Á9§¿UŸ‘ΫiÈ>ÄÃù—èJLòÈ­À~“J?‰¢L—v.GpèPÇ÷(Âý­\òg-hÜÔ…]~!uf—m¡¸'Ó*C…ÉÁ¯C—I^=ÀWX ÒÃõ¡Úö71êYÄã©÷`n©BSšéP†˜²2%tJ+9‚ pÇôÜE™óïG‡h`œ6ä×èç7'ȼ“oçr|Ž~ß­ªð×®…qð7ȱ™èöGÐmJDno‡Áù`>¼U{j¨!HïþOI,Á»í]¤! 7bþ(d_Õh^ za†ÂIÞ,iꂽ¹/ «îH¿ðCþs°/*rt‘YœvØõ)fæJ ΡíiEÚx0F±ßŸ˜K¥ÓS›¯<ÉB¢u8miŽÆÑÉ„Œ)x¿Ä¿ÍÖjf ãÍÖL!‚ùz#¹1PZÍõx·,˜“A‘](å†ó<è=pTz#™Ñô¾¥7^˜9 :¯Ø€l¨}Lyà ¦.$÷̬â2x/½'|4ìß…°sî¼ý ;$ž`Êö….à2Åø§ýÚF ´ë‰;áï×#´R¸dПjb½ÈUfvîí~Ì"ãßN#>l|±DÄ·ÉÍûc³m!ð;„ÎéÿW‚ ›Zó°Jí)VÌh¥ ó­è­Œù EO¶óµ½ayÜ ü/w%qÊDuÇ_{ ÜùÎzsÁq ”š¯ïþïcÚ‡ŒÈ84ÊÍàX[W'ÂŒ€»|AKÄÀ43¦ûÎa>­Å ÆÓaß&¯ƒ×öN×é ¨h]1ôƒ¡És·ÁãÔw®¤þ¯­Dû‘:ò.þj¹¬9ó[˜V^ÉöÁFg‡_FúžŽ]Q¶ÈÃÓ©Ó) ßóž/=ˆÃÂl,ËR ©±3Åsòìq{ ««Òúâl¾ *o€—o¶µçx#—Î…åïèÔ{¯É :cÄ=­µwßíúgAæÖ™¶ç¦ìfzõ°åQÞ]—v,àܸYhé2?ãö“00Ø-nv¢À÷ˆÎÍßÏBÛž-’Zÿb”±Ž2«øÇäϺÈ.K6{ L'^{óm*+‹,Ò˜Ÿ’xCD ’…7˜ààgœÊúó×––9·ô?ÊàîÒŸ¥îž«ŠæüÊ’¡ yç w­ÁD,Ðê/$S™oà}IÁ°ÓFH§ÓÊeQàü³JÓïúU0WЧ«Öf^AÉgùPbfQ9VW¬åa÷Ì^ÛBgUštuÑNXò_Gf·kEøte†Ypn˜h ×4*ˆÀÔ7ê_®tD¸Q (‡˜ gl„ãÒ´ý©z[8É%çºa!šÎ¡ß“ Í"r¥i¶ Ùˆvö«ømt¡æzåXHÔ/c–,©†›Ôài”Ÿ<‰qíïZø^sÕß ‰P:õàŒ£G±s S€‡q… þ‰}Ïçδy/6˜Ë)–¾Âû³‘õ,Áµýg$¾‰h%ϪHí͵´§ö ¦ ¹´šFš:¥>0wÞõ5%mªÊãì¯ÌÀ’è§ž Ø]ʈЩ)‹Ú1’&mQ¯1Îâ’ŸùÞÕÑò–êäÆ.á n©ºç h¨â¢*Þµ£ ëÚ^80¤qR1Ä@jªÌN1žièßÐ`—ƒ}:üû³ ADl.i¨uÅxÛlÖ&íðlЀÝi˜Ë¿½?KÝ BßôhSæ¦ Ÿ¬f4Nç K•c°ô!mS}¸+±Î kX ÚH žK©˜?šð”-ž¤Ñµéh£uæcBÿ|E¹ÖeF¾¾h»s´…Øk,©A‰´Îw§’¨µG¦à?XOçg…üu_Œ˜òäAì¾vìÑZA‰¾±;]ñ1м*9O_ªGÍ´Ì_jó¶a‹¬nÒHD±y4¿) [CçÊ®¦PŸØp8M*ÎHüüAµ©²1ïíK–DãËVŸšqBöL3Û\Õ9 ìØ÷õ!.ŽóÝ$Ø×4–ìJÈ~U/ÀàF$LåÕ«ÛxmØ4þJzM"š@Ìá¹5á)0Òwð$Gf•XOMÙ¬iŸŸõ‚82=÷¯gñý“­ÀdnëóQ8š`d—®åÒbªÛ«Þ™ÏDŸX ,NƒHT3ç‰`Qd•&“©Àà(j÷¤¿#Ãßwe¯EgØ,ãƒ$ž¡Ð~ìaÓO‘O¥­vb‡|#F}›·™ï‘ZeMßÄiˆRÂL´y~å³<Œ±´¹Tª*V·Ý¿‚³Z€4øGž¹N%©Í÷…°ûDxC¬ü3GמTXÖ’Ìí0Hvg°þ¤Ü·µŽ@é½zŪ€3•mÅ:Èd,kó{ÐËwz3¬AäBw¾“°{¼FšÆïGVu20‡¢C»ÏÔüÉEr3Rú=N¨¯Cã  ÜOcc‚úà©3=óäUʺUes¬ü{Ÿå1*:JÌ-®Ÿb84rÔcŒÀMãŽÖFÈ!¿Í¾DÐÉ43Á û´£ 3òbÏæ¤ÏÑs÷á® U‹]éRÒx³y xëP?›§Úµælñü¹ ‡§|­`Øå9¯Z˜‚žÊ\Ë`‚±=Ü)èúX¶¡¨tXéLk_)¾ xVB¬MgwCÐýFÊ/3‘¾Ý&(ãòÓØžàù÷¯%Ιä*눞ˆEfÊ "êÅâ•Å„8ÀFÏÊšÓÎIù ·fA G„±M V.ƒðì¦Ð3V¾²Â(O-'”—ÁXˊƆráÓQ⊣^ÏÜ´s9¢L„Äb<2•gP˼É8a?q+Æñ€ô,Ä^´|bÔû|‘N-âð–½ø¼Ö>¡BÁ˜,ä©Õ€ÕÔ¡ôW_ÞOp“@“ÿ—.ú.ÄË»8¦]|î2·¹ ƒ´¡ÕÇà¢É5­‹cp›„‹»ÿ¢¦Örb›2Í<*â4ÖÙ}ižÕ! ²ŸøçlQþʬ W^G²îÇ*›a݈„®Et œ`î‘ ÔÖe£=¸mb™°;ú˜!|`OûžìÊÿE\L*òœÑŸ"Õ"x.óàÅÏÅMÀ†U† g Ç cºðÚEBÆzí kéhv¯vÅþʰƒìÙ¾@~ã„ffþj‡¨# … ¨^zEj>Ÿ¹ÂÎ Šø|ÐÑÖGt»âp…PV%à:á@„ØÚ„9b‹Jusç!ÒÅ7Ër‹8åõÆ?ÕÈ®ýûͬ2<êéÃå Ddš†ƒ‰@ê°a(¦ˆ”*Ê“··'‚=(‘A¨#›¿=7Ë´ÝÉàë} @}îÈŸäðuùý(J¶4Õñ†þ–eí^pE^ Œ¦Kf_vs „‹ n$áÁÞÁ©úu—-<xØ5–µÔ~24¡ƒˆÇ’s‹Üʬ¹GWù!¬ØQ_å8–@ÚN$5,.˜õn¯«>KíÂUWøÂ®Y"b ‰BÀµ®³¤LŽâÖRƒ‚À˜Bˆ_ig¼|´;z0hI¿G9§[iɳnüWÿQv‘ú Œ¨P–Å HC«BDï ©! ¢œv¢ÖEŽÃ9_´Ò{Â×ÑÑ=2AEáR7Ë[È-¤¬áº‡]¬b„ù±¤ŒŸžµ¶Û03‚½Q¬n[àÊÒCPHP±…çH¿¶ú~ýD0Æêß©N\èvoNhûcg„i©~‹ ¤—œF~L ·«u»„þrK=ܤ%{º^õ­>ùðQÚïeݪ ŸÛ0 hÆê7èMÈ(?Mø û=@îùÜ*y¾ñü_‚ÐŒñ×Ù´ ^Bx¦?¾4t,>oDÔàÀïã.Ñj†”³k[&]-GU§Ìú&rQ±f3ß<¦ùÕ~h­&R„L±NOšÍ?1p§ˆöǸÕß™ƒò¶ ½1ó mÉO)gÊnö ¡æ-Ò»¨? Lßû"~¸P ”^1-P·Ê*z(]JÅŽùDªÍ[Ý@¶Å™‰Ç«ìÝÓÌQ§{åuäXsX"£ ¾r!ttrµøí#”w [6,Œb4Ý÷Ìa(éžAi#¨&N6ÈÊOÈ07sÏ‘ Ñf ‡k™ VùôûÒÿÖh¬kæÍ¢[…°Ô•z¶¬|¼S³YŠr7[ Þ ^`ZUî˜Ûþ q›Üòɱæ[©i6 šQ½£c „¹ˆn¯é9fŠœ| pQ €#™Â_ÏÅÞF|¤¾.‘ͨjÈkŸeÔÅc›Ù~ƒ+‰c ræm–t(è[ûîhóW§Næ*“ñÆšŒVêËð–Þî|xŒrÀëãéÑŒtšºRÕšGîz[<<úˆ,Reõ,ŒTæó«ø›6:ð^Ò-¿™ 1p…„©¶x ¦ü·jXª‘^žL~EŠñÉ:eRTß,!F’¡hh¬êS¹‘²Þ¸`Ob+ .ÜGÎ. 7ü¸3ü °ú | á{¡ýæŽßŒ0Õ ëæW"K‹n¦§ßÚÔ÷tœÎO†ÁS|¯Ä_¤??ž×FfdT•ú=òn8¯5A‚ƶé—îÖ¦L(, ÂbôjƲ´D èf¤ã¹ˆ?rY%Á„c¡y2e|R¿S8»rÃÌ5?¥Ò¦Ï^îï:Êþ¥E¾¢6JæÏŸi­—©þ“ßße-hkw°NäÀE禮yJ˜ŠEN³ªQ¢ƒG}ÊDLAQïÝ{©Èè;¾6œòö¹ðNaU+q¿õ™’\Î’2 #“¯¦w,ǵ»lƒú²HM•³TÞ&Éf‘ÿ5DŒÏÖhž èB>øàÞ—ï_Zù ãoÌ*á_«}|•ˆ$’—øsk~ˆg é{%Ô¢³-,©~PÛïŸvnÕÞéþ^ååÖH­T)Ò ­Q#&ò#e°þ.ûÄ’‚Ëì€õ7H¬ 1ˆºyºÛ 3`Ü}Ã~é#þÛhÉõÈó'À/"`EK"[€‰µÚ#ЉüBÑ÷õê:ç™ xYœiøgqÎ2¹ÉÔ8¤À;<‘ Ëû袨øA ¶­ýâ[Y”]˜-/Nاçê½ä˜«"`‰­ý]psZ÷¿qNËíz-èÕËáDèŸdö'hœ{üÉöìšgd˜\HoKKkXf˜¿Ã$ž0QRRVðÖœ ¦;–¡ûð§#ø8¥ P»íH-Àë°Yc)Qº|CZæèJöW°Ÿ‡Ì¹èïÄ~$£«:ìV1¬ý®ó÷•»±b)¦Ù²öüº­\¤‚°‹nqÔ?¥žgÜÏ8ô:JÚ% kmœœI\ößÕŸ&2À#âc’pÉ\üšuÆDN8k~`c™0j‹teWcAæÅy£a'yä“cÚ»ë0‰ïB*Ä éÆÖ³ 9~x¡ZÕ)ãR^"]ë¯ÝüLú_…@ª«çAâÍ‹BD£/);·¥6¶¨P¥¯`ÅB™Á‹ö§­þšÏ­Uù¶hPù÷Јjð\öã™YÏâ.s?ˆÜ¯”€½Ùève¢ ¤¯£¸ ™”7¸œ~È':‰(Õ°~Xp§òcªF4F§êÈt1LÕ¼os>þÔæ§F ©0ú#çX-T`…yµêR–Dn=:©²{Ò¬¾3·<(^>ñÕfœÙÂó?nvÞJÐGRèYÛt8X÷A+_úÛßçÿ1Wž8 C@[ SÒÕåÎ2@¬ É#ðß‚ž-B^ÏlƒD ·Í«m„%eËŽo9$™åT.Úäù!ŸMÆI«[¾vFžY}ømù#ðé…á¤NBß”­¼¬Ju& RJÅ£n¡u ôúÌÙüüˆÔ8§[©ÚÃExäi…³gœ$«PóÝÊÉ}Ô:=B¡5Øó”hgž¡zÜU-6ýµLày£35ñJiJ¾`Ÿ?õã[ªn.ñêªÑ6=ŒTådÄROóRúµË‰ÂCÚð‚lè)ðCÁ%ôD³oµìl‰a Q:Tï;»$Ú›lT²¾ ²Å f§oQ~q_ÿÈ#6Ö`e¹ãh,Ù[†×DC…”e»cÆî®J´º'¦vƒŽnâÜEñžŠÀèj¾eU¼Ojbùaíh›û…ëÒ¾}…ŽW–BQ  Cˆ…PÌx(dŸõ„{\IQ §\ˆªHù³Ð|8Œ(ŽÙò<;#ÇK$½°5L&­Þf^[}!Ñ*NmjÄ*cG¾¿Au"Ld'@VG³¢”ÊÀ>kË>’'h²?EF¼´»àqÿÒ'ù“ò`Y.Ëô×<ª³‘VuÓXI”»æ(ò’LFj~§S·¢@šïi}²(ð• çcí ÝZs ^r½¼DD™òhòM’¿h „DÒ4ƒíIÇoƒ+æ¬~ô^ﬔ6oB$&W‘$w¦ïGC ÛúŒuàÆÈ™²QþïÕðÊfHy8s5nëóþá´HÚz£GáÉ)ݪݸ_Ë)DQ¥AÀ†¨’zÑÍ[WUdËOIƒ“û»K' zl°¡Kåëõü@àû¼bÖй8=*ûËðv Õ†ó—Ø\ëÔz|µSžkzä2ᣑr²înç¨YàJD–~Æ‹Xïü=*B'LYe’]«auIO¢¦¦Çß4UîÀPñÇtu½…¾±Š_0Tv}©kÆxé\Ûf 2 T³‹ c’¢/Ô‘uÔýz`¥&ødMƒÛ% ÃÏŽû´Eüšæ@ÏÃõ‹ý”äéúñðb‚Fª¶ªMˆðÕphNøâýŒ „:"ãð)dš«S?϶¢Ôu¹›š¿êHþ`÷Ì|ºé’ž qB‡ |Î&!k•P^Ïjyß"^èD¨M([„ vpÇàžLz‡‡F¼º­#Ù‰ËîD×¥*íÉ t6‡Mñ#£z‚®Øœ3±Û•6ÍÚÉTaiRD‚¿ P‹%ÇO+5r%W½Þd3"¥‰kb‹é‡`ô톬<]úÖSQ·Ãœß¹Ý±­ÿöãGŽ FYëUiUm5Eµ7 ¾ì=@ÌéÒ¾o†Å\ÅTµ]ž‚ÈM#Q5G”@xâ¡×BYÖvÚûM½òI²%iœœ˜Åey5ÎÉ#¡¤&œ}ßüšÔ´ýÃÁü‘¨+öŒÛÇ¿’£Ø“Kñ¾—Sþ”´õt¶‰N€ªCå~îB¬óµÆb :‹…Í™L)&ŽŸQÆ©">3óÄ|¡Ø8»±c:¨gêq„¶š1k Yð¶þ5X°¿¢=®·çܧIÕç—kV ›hÞÅŒ³,¨ èEQ̾Ô_¤Ræct½SʼBúÔ ød@ðS]ƒÅ`úZÁ ƒäe£v£˜µ Š?Ïm½\´· ¢¨=¿<—ØÖµK£!žÏys…w<õ?£Wfµ•àT¬HĀΠ¾Ô¸XóѸ"QË´-\Á‰é÷7N]Šìº~¡½¤.nu¢ƒ’qïPjNüW•ߥŸ\BÁ.´Á\í/S‡ÒÐ$nÄ}VãR0“×æÒžþ…‰_T8Å·çì‘Åì;n(µ‰Î¬]¨ ©O3 ¦ªmì»ìÛn½ :ΚiCí¼«rm³LÀ®[õñAê½°«ÑÖUkhscó4 ƒ ¶&šåO9žk‘&X½s)ŽˆA¤JV´²£9{6V²òÏÁü kÂpzBô{2´^ý¤ì^qé‘âvÙ+•&µ//õóIÙ>²Éè¹#Åý’âB²:¹-ûD¡ÒÕÇya^àc0¶ˆÑ¤|bßœKøË‹X¯IkÉp+³ù²ÜÎñ/á&ýÅ­^MûQÂìY YA¸ õÚ×:mùÿd°p!«ÓŠ v¢‚v¦Õ¹­ßé5wVIHîÈ’÷5¶Z¼<7êª=ÛñêlSèMF¬}þÕ’ƒvë>uþvšÉ#ÌïºGzìnI%ðÐŽ˜úàsø •ßÞ„„œ30¼³1%r_Jãñ´TZ`_üX [åoéÀšö pimMÚ#×q‹3Öéìüt"Ô*BÞ~¦Ø]½[{ÝÚ¥0®Ñ騲Fõ¶96iâ(MÁk¹çDk„YL!lÔI„6 ˆÇŒnŠ”D¦×†‘›!% Ì=Àß^ê~máä›Ùå;t#KaUv%ëzu(ß—§œâö’–MÓd×wødºkÿ5AеR…Ïò¨ÏBbYbK“  >Ÿ¥*Èrx §`²ån*„ùl¶ʎyÆý}Ÿðø¯b,¸œV#ý|ú2(¿J€hhÏçÜÈPâHsquÇ¢¶EN•¤x:©ä»ÍJ‚Y“eVh‹ îü•šl{WpJ,£üSy)õñ-iÐÕëB'ÝÒ¸„íùŽsed@÷FgãXit¢åÇ×"®FØÙV[\–Fn§àcDŸñƒAóºKûL1>±úq§Õ‰¦n:ÚŒaŠÓ'¤ïR§›þL«ú‹F‹ªVOäo÷Á± Ö´ríVYíãSÛ\¢&4«ª²B"8w¬d²¿ûy¿“”9‚±z²:)ÜBRQ`vXné™àðr/°û(U¿p—òýtw*‚CN§zÚìi>Wc L ©<âW‰MW¯ ÑH¿dŽ-7Ù<Ý… íýð²>êK Q¥ ½v2Ü‹û÷¶ÏÞªIñ`¦€ŲS¹ï8Ä ËѹéŒþzûV‹A˜4ÓÙ ¯Õ4Ú‚ÛK!ê2aW†ES:¸Û,m ¯ÒÇv²@ç'Î! ¥›:·4¾C²?$’7ŽH¦çý: t’7­–·¡ù@Khžh<®°‡O›¬kV‰£”•¦UÙ‡ßy÷Òr¸·§n0T- kÊ6lÅ¿Æ7i-ïvÐÿå cnå‡ ½OŸxÈíµâ±ö|‹×Yí¶|«Aïêã»ÆÃL9bN—-È, D¤ ‚€%–=~':f†žXÿôZy)£Ö„l[J‚à~{ª«æ®c«ûîg»uLÞûáÓLܸ$ºÁ,s³ŠFëé1™º1Ž#S.}ÃévFÓw¼“'ÊX7SzéŽ69¸o+Ú@Â%cód­®¶AY‹•ÉåÒC“™?ƒz‡.˜(o‹@JÀÌfþÃ.Á!“ö{¡ýë3`0u¿m;Ó ™­ÖAùuôàbF4ˆV~ŠÐ#ˆ·¯È¸RÒë½:¹RhµÚ߉ þÿQ‚DSÊuB—>Ÿ)$Eß3ËÂve$|n 8T‚%Ly5„VÄdʸñFÎÎJ)Qñ‘”²VÇÚt‰¶ÔB/Ïð>™K×Z¤Óæ¯Õá¼8Ùÿ5<Ðà/c€âJÕH8H9–7Íçµ(ûþß¿t¥Z¼ÈWìÎPe{¦ ̰Áãt©…ìÄáI8h¥-Žrç¢3kçä¢Ä6wêÛýÖQ}šÕ«‹ý"į̂°ÐÔ„âýݙܹ`¯ÈÅ[„Ê€?éøDw'œ”°¢¬“\­û<¸áöðQÅ"M"ºù¤s}7ªÆÖÁÒµå+m.ž|Y^; `7Te–#ìv0F8õ晉äîŒëôùݾÌó H»ÈÚ­å|N~±P`½h¢ò‚å­:‡n«¶;NÈ¿Q(¶+¦LfÞÅžSƒ[¨ ÖÂ×ësÚ²$Ë’ÅÃ6±Ü?k'FÌ”dºÄ…?ï³çU¨¾è¨}¨dYÆžzz¼Øg"¨ÍJc"b‹Ä]lï¯ãŒÕ©µeIϤVWDèXµX˜%–kØ4[`„а¥_žÃÎ "Yu›4` «9x`‚Fµ§ÚÕüªkßš÷¾!ŽNÐrÒú×pu"n/Áfú» üäþÛ]$Õúú¿¸¡‚k¸èí9?¤Fé¸>ÁQ3©™G0Ö[òŠ$'“ÍgPát?(M C ±•¤e¼tÐö:P!É5ƒù"û;o¿çQabC¢¥É©ckàÌîúÒ)˜Ñ6Bo³ìVÐL]âÐÜ7hú(W.—=ñýtµÄ„1kŠÐƒOnpºùÁHÙ<’bȸ¢}޶Ú3dòiUN½¥æÖâéœBÒŒ9öæ¥!ˆVdŒó±rcÚ¹õíSrêýZ¢¨]@±ñµš Š ´§—Þ^üšÊïÏEžž©Rc”òJUIÏ¥7OÀ.`O2>=¨iÌâ„Úr—ÙÖ†¹mV¢øPZ:úïx[´i«17¿¢Ë'·“=I‹á¯âcß“ 7=ØÜ·N2õ¯ÝJ÷ä…BÌD††Çh{ùFôÓꤗ6nZù¸ÑÂ@S²ù™æÖ„f+G&ÇàÊè2>}ÔßR¤3ó^€ÊÀ†OOyŽzM¹ŠË`jve=ùÈ¥2 Ú—š>è hw\ë^`o6͇V»ÆDÑ8㡹jÔw7ñd†Ç¹bAà –#j:±±âæ{ Ù·2î*›Ã›üøŸ8éeù\Ïh¬ ñç€ÞܘlQŸq‹(2†áÐRÂ:Emë¼+u̽B°Tè•-ƒ²#ˆÜžå•Ú‹jK| +þº#•©°Ê vëfyÚ%ÏB ZT«:M^›œ„éÏgÿãì¹Ø5©Pd-Òî¸AF¿xªâ3ºm…²,[ÇC„ÜÕÅUßïû^%¿zu•zÉ×À !¸™VÀÈæ”©$Xƒ^ÿsUUj< P¡¾üë`ëlÄnU¢©P©ÎO¸ã,VÁ.½S úP MæPr=Ç$µÎb±QŽ b•¢t—͎·yÎè^Ýø8ãšn ±‘fÞb˜¤Tñà´ÀÉæÝy€X_¨{áŽÍn-*ΠƦœvÔõö(ù@) jßÀtv sÑP@øïr-?µ²ëo2»ß&³B~;2á$(¸NíUë˜/"ÃFSÑŒÓ1”àÆ‘äͽÑ׊Êdœ ZRÐaª,³yKƒ”¶³Ù\Ô? ï´ yðÓ™jB8.ŸXZ}Û #»î_4ÐæIï°ù.8ƒçdzZíꨥ‡€*wÎIh†m-zøis îé„+^{´;dHØ¢^ÃV=~"¾?bÃîÎÑfJ¨a†nJ#4ë'4êZ¾¹'c»‡mV‹(©â’gù¼ak4‚Û[Ú )Çêy¨â‹ú~‡¾Cöv%wÙ@"=92;ð œ9¤(OÝq‰z|vMÇ—ââŠÊ .IeÜôC¸Îš‹€eÀ0@ÔáÈæÜáðÿ ¦›w/ŒÅµ ‹^ŸTã났],ki6ìÊwvÅÁ6¹‘¨uaH _õýcKðœ][ÁEMŸN¸±ù=ÉšÏcC8þÐ4G§aÌZǃ ?\ò÷É¢W.p2¯•~Ów?Q9›âßSä/ —ÄÝ Þ¼ÆÁÖ¦Â-ö^"t'²fOó¤ÓX঵´æXÊ8ÞJ:Z·TųMG„ký†Ï®À®IïM”ãàÕNg=#Çp:/{Ö¶lÙñ"%8É€WÊ!Rê´ŠíF yµiÈ?BùûñÀzbÍÐ!=>]ÞÑü‚89 ¹Å{?$åm´1X6mäû+Ý ¶0®†IQÞá8Ïî`LBŽf9s•/gdoå ´Gö~HY™þC*™üÍÂ=b’±£¡ ʃ»OÏ ¾LYeq'¹"Ý’‰<Ë#s°´öŠXkIÝF+\ù]ÊÞŒÏÃ'èÍÕ¹®3Ä\Ýe^ZlÁ5èNLŽÇ]bè1 ^çÀ^ì(™¹j.¹±Þˆs›gÛü*{®bƒŸ±à•»õÍä;“ì.w±7Ù³Ì:樶 ×‘ÿ†0Ø‘£x·9¥1у”*ËG®pr B*°ŠsxvkP±iã?RCöü}~6&¡ÒžxoùEgcÒp.ô“À@Wîf„=kJɸIµ¨šC0¯ 0®bØ = xAAQXýu)÷’8ÓƒbÜÆ ?uñ,ƒ†=ø¥Äö<0«ïãûo¬#¡•ËÀr$]¾=£ÚêT“ÏžÙB’¿ó0³ã¡“Df­ßjyÓ¶QÃBÑfyżƒèR'æ2B!™Ý Ñ- õ´ B¹ýÈÛm]×;ž4¬RPÂR Ájá¡CHH?Pá3™‘Ï3{Sü?t;˜ ‡üC4kæäÿÙZKÉ•hçn>QN2Ìm@i 1`O0Á:õåxr…i>-‡,olâTQPˆÁ 1Þž?“—DÛMê8ʳ‚rñàºE|%K&²±ƒP6ÛÏס¨"‘èø$@ƒrÀ%°ÁáŠs_,Þ@þŠj~¨ôÍåÂæDi×·òËb‚ó[öt{ßÊœC ì ÚSÞíªmáZ>'ÈÏLsA‰ ­Aøm“-ðÒŽQF`ýøfµHDX(*Ðx{Öz‹M%üÅz$\PŒg,x‡dTƒãÄˤÚÒ¸ŽOR*&™ºôÞ!Í Äš’º®%ÿš.(·Œ§€VÿùQÁ°ØÕ ¼Û ¶„š¥Ú‰Äˆ‚;,(͈²¾øÙfªŽ¾}³´bI Àü4ÀР䙡õýoNç ¤Ñùàýd§òVÊŽß´w»zBê£ÀQ‚ýõº÷ÎÉcò\ f×–ev‚xÕ‹zé†.‘rAóàGT2½]ÉÛA};óˆcq®»‚¿O˜Èκ÷õl¡%§¨XuÊ\"ß[ÅŠÛ`Fnð6S!MZþʃUîµ!ìNÊ!/ø˜•‡ëÐR‚BWr4ˆ .úöÙ}:ĵ@h/ëkóÝü[Ó$Èx‚æ4è²>6¬j²>ì6ùÄãû¸™ô’jXcð#…}Øg÷hœa=õç˜WF‡âO\²tn·òÜ=^CÄŽgÓ‹¯è%N ›óµÓ§ÐwÔ h4ª@bDÓdãÂikGñ„`ÙuóÕıç’DnÐEÚ¤+ ôXÌY³õïäR%-A$J¼Ã"¡D©KÒ~uI{áç»Ð€ôôP+A‰kB^ÄãbÔc€ùYäs‘™)®CÜ*«äzyûcl@öåÿÞ¿¨xKSÍ–q[ÔÔëvï¸Ä×à]?UîþPxÅ%=VÌßÅl_£°EHÀ‡Ïü¥TÆq5”øž×áÁ™éáWì†/Ëx«hA»€P©ƒîõaG¤'øèóãXAËyŠÏ;ÞÐŒ÷Øôüº´ÇÀAþɧô\gðkx6/Ö;ÞB["z ÀAVBwô'n`5S xV9ÀÔr¼ÇlKI¶®¿*BŠœÜAˆ1ž¥V˜¨u92§ª+Öw¨MCO³g ”¨òÕ$å…Ô¿Ú^`d4~’Y¼Àë‰NË%ÇÍ&mèàt(½˜Ñay'¹9±Ÿ¥¶M pºÐ—ï}ÔÝB>rYÂÀc/ ƒ& ÞÎä4!ÆD3æ‘¿¬!´èÕ6TT"1-‚HSݤ¯ðq0éŠÑŠäÄ9°Ä”ÏO´ }F˜j°X’ðËTé+8î qW€«Ð6¼g¢!O5—­µÝ»Ã/ézR;Ôuó–»Lc`YæÍøº˜YO¾kdR­)úÌFä½x8ª¼\“\^¿Ý ”?;MŒŠ HÛ† k`8®÷àÒ­ZFµAƒy£íÅö8¤qo–G5­+«zÿ­`SÁöq€– svÁȽ^£®dì:Éã(èÛƒNÓEÚ{ò ¦Þ¼hj‹¶Í­np’1j+…ÒCÖ¢3áª8Âjläú¦¹¬Lg¹Å§9Z­~™nÀ0è¸_ß#?ñD®~±AÓ½ç!@^t^ŒKžmùyÑ¢!ôX¼8+JFꟲZÄñ?†™-GætµÔç¹.¾öìCb«€ALi—(Qj¼“ÑbDsåuNWN«ƒVâ#ˆú–À! íU;Ø*C[ |úÉQ9j«Ñn o Çj ËÆÉ¥^ãxÛXÉôS|¹òp" D™ªh³< Š¥oDG°BUD)çgz´HUÞò¹i§ƒ²:¾äTå dX}ýl«€iz8ôÈ¿ &V<û]étstTîög×öFö3>š@ä×n¡‹PžÎ£Å^$+‚w4 Äôú²Œkt‰kØg‰ãLK~$(l±ª3âppùüDY¦8oÀ¥ùÛ勾¸ÙØ•›3å\!£S‹ž´Z—YR¥O­Ž@Fz!ìp¨Zõ@?Æÿaö|-ï(²Kڋ㤴q%¯«§¿?Ôê«1cs–…§ ó(=¨CÍçX˜ƒÚŠèçD¡’=:AȳŒNt·²X™°ðò–r µ×ï±—ú#æ|!èÔ æO’Cä‰\ ~|1†Gaëþßy´jß|évmñÓCÌï~xÙDô‰¶¨2š8ºÃ\œ–·¤É":«ѼCsò0]bi›Ô0çfø&°Ao¬“äƒÈu‡úšîïÁY¦¦Q§éFÍöò査…B£µ¼Ž!m3ÁˆšŒ$šr¹9U{Ç>iß„4úÄ= ›íô^=TšwbX»d¶ªrdbà;u§­¸%(–bŽ(åœ[’äDÌj•Ÿóž(/Ûüð±mJ-uPßO´«Q{“›ÂfB·ÒćÝÑ¥³ñò^¦¡áç3«:N‚p ÑʱA¨¿þM÷½íóŠ@àjÑQW$€ŒY»¶Ó0èÑ?…AÞ´±±Ï_¥a»mÜÓûÖ'’œ2E4,#…]Ö[uõ5g±‹L£v\Öÿÿæ¥Ô Z)šY¾c„r32w»¸aΔŽÝï“=î9n¼6á^ŨÿÆIba›!BØi¡j „Ƥ•ÐÉp¦st*’"‘©>©Óñ«Ã£”Ô–³¼üœ°‰zA·QÚX‚~ŠnxiKC#7b`·EÄ>Hç·ûm=¾X…ð•Ÿ{Ù³É_(&c±ºZ™$ÂÇ ioRùäÊ@O¤$ôéÓ·(%Ð~‰>{’[-µ¼C}¼U’9õU8lUUmQ,+‰nSõ†ð›ª ÛSëh¿)0¡HŸA@b3ýDîÅ¡°Õ‹Çô²4X]C¿õ€TÓFŒþkŒÿxQœûÇ¤Õ \iíVVÿtçD=@Fß¾½ß A_O;?àÎhÖŸäùƒÇ¿×ª¾ùÚûy²¶¡ûNÞ,‹þ*Ä!œ+ÔRÁݬ}éäûqíëPÞçccü8à•³"„#y©ABûVsê®ý?8mïöw¤íà»X3¡´KÄט‰ëØáÛ¶¹ »^ìÄ£$2™~*ÐÙ\æ=Á¤ú´Pb+ÓR/-¯ 3,° 7:FoŒ9Â(µ Å´ÁÆuȈÒgyÉOõ ;º¨² À˜Ju³}‚hݪ𱜼%ùC4¨UêD}‘<ÍÑ»KÕÆ5W„- ’FDMˆ5x•» ¿:œTLâ0õ™´XKx›8Õ+Fmž®’n#!ãâFIp•ï’K:”#ÂúÚ¸²«lUñ7$×$iúÒ2¼‡¾=Ñ…ÜT‰By¤e¹œa0ÔÌnc¾ SÖµøÜf²ÉîT¼ŒäqºÕ ÂéÐìØoÚÉ“6S]ö@ëèÇÛÙ»hb9Ù™ð_¬½¡›@xèMsi6ŽºÒa¥‚íX§–9Dj}^Mé’—ø5vvÏHc¬ƒÜ/}žLTR)«ëíwaë°]ñäÊ4ºU`u‘gð¦ÖñÍ£ËhD’ aT{FÔ×ÉÕ‡Ý{$A øå^£`”Š‹HQ—žÜÁWÐåIã~ôD•£øÓ¨WD¶vF‚z7=ÙUtDðš1b-ŽpäÏŒS4©ç#©ew,^J_í0)×§µ¥mBîsɰãÁÖöZïwšOég"dõ¥ñêß`}†E4ø Äýç–T:f£Ë^¯³{ŸégÏ‚]ÆÁ¹1¾öÞ°ÓX¿ª°‚c?ñ¼^¶n1ì–™f“©x×n•PÆíUenA/1g!]F·@îæ-ó¶kÜgÎcksBàR}‘½‹=W$>_`¾ ñ&'¦ÅomM€âû Níâ» “ÕÒO}Œ(ÛﳸÁ${V‘ýÈÞAc|‰ÀõFêö=m"8е®ds«àvM“œa‘±$_g9½¢6Ü€ÙM°yŠíÁËѸäºèí·Ê”Mb¶ó4š… O9/ !y’ÐçFuø{°Ôµ§=çÑÝ@Ømd?¿¬ã%'Ðæ¢¨Ëj{äåŽþÄ0wM:ëÞ¾®tÒ˜í‘JðBG©XÙ>/¨ùÉ/‚•qè6Zöœì#ÒI.†ÿ„gÑ©+‘Òú¢QÊ‹Û("5ȉ¸´(°âa!µüwϘ`•ºÑÜ2¿AŸ†k‘:1<«“xgÒȸmü±w äÕú©…'§=GWÓŽÁw<úÖî4»T—ØZö\l°)Û±¿b¡ÞiªÇÖ±¼ïV ×ü;¾¹i¿MVóêfº‡²“æ¹#¡uvEiºË;Ø\2Úhö ½}0s?£Ùµ ųþZQ1kb žLÕnœ¥ Ac¢ªuÆ2œ)š"'§W[š¬Å—¨çóyuä HB!+@õs}Š SŽ:Ð:WqÝpð›;r8Øîú¬€ytoÐõ†EY¶[šä—?ÃmåCšxÀÿµãâ]}e³«È#êV,w¡Rç&e3v– –‹ùÑî÷îª7>Ù¸gÍ[âÝügGà6ïÅÿkDâræ”ê«’¼‡¢IKÔáÁ]® °JéáÝX´-‰\΀se*½÷º—ò“ôuÈe [ùÿ+uA@sk¿©¥!#)Û7NÆi®[ÙÖ’ž%Ò4Òê‡v£™]åNb¿æå†g'¿>~VÜAa@×d '6‘`Œ^!»ÈÅ[¡þoMŠC†°›ÔN6ÙÍ*îMàb#ùù ê¿î C#TE§ß¡bÕ„Jèøî½ª[+bd´çú>šŠF§àÚ »™ÎM¶ûø:ó`Xµ> åqžÚ30ûn`øUXµ(…WìÞqo“›ê%79±Ìp8UÞ[L±ËnÐÌã;™¦EÈWYÕ}´“Ð;"Œo˜¡íÑóÖ·µ ¦Þ~ ?±jüÓ¼t!cÖÃê~a/¹?Éë¶©ÌQ i€@Q?L¦Ñ7¾®sdó“+錵g\s¤Ò( J89©§-ö9¶TòóPvxÍýÒ7½,î`–#ÂþWÏÀ[zûÛ§ÓÌ^Ö«ïÃMØpq˜]ää­ù!vèþO’9YãÚxìÔS:åGéxpoÇy CŸjø.~®ÊQ’½M÷á#ŸïSŽ>ñÏùì0ø‡ñÿ8;3Ãèa÷ó¼Ö‚a‡¡‘©4  «¢Ì;ÝÀþ€hzœ!ÙÚ ¦ùsÃѶ91µv pƒ!ñ$›¬õd“,4={ ÷x(X"·øãšrH/*Ý1¾è!ü›ugJê¼ÎxúçMr†£ê èò»¢7Ìhõƒg*øb•=2ÞnÏ ŒBSWŽ1a²CÀBhÞGÀ`œÆ]ðzŠº@¬Þ,«Žœ úÍ¿«íU)pÛk‰ŸMŠ;çDñ:ÝXóvâá‹¿ÁW‡š Ê U¢ÌG‘ð¤_š ±¹¹ïV…Mq(Æâ…ÒOK¼"v !Ö=Ú¡ ûô*ïÌHGä·…(ð]}çDB7¬¬Ò~ÙW‘=\ÜP9ö+a9 ‹qáTƒŒ>Íç_ɬ™pF´to›:Fî cm´uÐ¥r=óŽ‘E¾"ª–D°cYÈ^ÝÞ)Lþìý±@™¹,qï4ÅVgUêÊw.ˆùÓ…{Á×þÞP§Â894P¼dåQ<«azybiú±AÛÜ Žõ ðâÍ*€ÚÆíS­X·ºš®ª¦FÚªÕƒËzÌ`㔹 §µØ0K(È2÷KJDè:x]±gø._ªy4½a²‚ᅴܺ!€›=ÁЭ1ÇYæÑüŽÓ(æÒ¦h©]ZKé1FK3t–ìÍ6¸ ¢÷g),žÓêY[çœÓ#†ZSp¦7Å<ÓnY7šÒ"4CŸœiG/eë×jÒá®ê²á~U sµ§ZlIÞ7tÿVéOÂË)Bmu×A3V†ùã]XÆ&õ>º$·°¨Ä×”¥N²¬ ¦{²§ñžÉ“lgÀX”$û^Ó¹Y˜`‡+ಋ¹y=Ñïc×ÕiΟµÍvž×?û™÷Î9ãðŸ ÄS!âÔV -ƒ÷í Ý_‘EaŽwÕ²¤ˆa„„@a¤ãI’§ŠbŸe·é6}¸ƒŽ6¼³9§í¯éž¶H¤2ïd€J m±d<¸‘ü7»úº¬Ž;-ˆª”h]¸ ¾ úä>Òåè¶°Û/mÉ€×*~àø I>6h‘d‹9¾/ŸDI üo*`ÍY²Ë˜‡=Wç=m=¶Ü§ôú ” HÌ0!ÿ ­) ëfßÑëàñ“b ¦µ8n ˜=öÔwLjT0Ù²€µr¾ñtˆDDÇk¶€Ólé63¯®·‡Ó{(âH‰«`³çfû Eêø +MJ´Î±šžËæÇÇÂ÷¶#Ñ+dêµ`½–òRZºÃ€ë’½cmùLj¨I õi%a7ý¶Irû“ý‚Jm -65þùšéáWG„©MàêñåŒ<æEŒbt"m›„;³EjàûÕü™‡–Í~Nÿ¬ÐåÓ”ù™HEUV¸2ƒ!1rO5œæV€‡ÚÇÓŠ†ñ‰ßÿ¬óò½@òm÷ô¸¬bjºŒæjCÇS¶»X xòîYx;7Ñ4\3WdÈ•´‰ž¼ìh^’|ñånä+ge·¶¨¶%â%¢[¶5n›ÿK„Š̷&‚,‘y­¡tƒØZ]ÀXࡸ Csr‰u·‘+2û‚ ´¹F öû6%ÇÝßìå,àzô ¿l_4‹y,Ào ¸´µ”,ënÝ2‘ÒÀdjÀKAÜÚ#Ib\íåö¶h„@‹VÆQ£! ºŠ³áF‡‹h æAìY¼` rÛç‹|: Ôñ2ÎÕ”C2èürz’!Ô=œ~:<àcšm†ŠU–‡ïCz¡ÁDƒÐ©¬È‚¸jrü {ÿ1碖±y\™15@ ÊüÁu–äjöwšñä Ï¿¡Ä{=ò/×:D¨ê ]¶ëQ³È]58ÂZµb3tr6Xm%1òv‚„ü5™ùî¼|1'Iâ&§NލÚí$hßZµÞä1‡·ÿ )‰æ¹°ÿ@ döC¯"ÉøÿHjй=XŠ!­÷Ž8=ŒšxZÞÚ9á´Al{lcg÷Ë­(PbJ2§pކñfQùd7šŽ—$›eR_M7ëK焆²GQ-Þà΃ÖgGftiøž—–(GÊNÌ“øÜe 1ÿÌ´Êó,Œõ+RéÒ!h²ˆÑJLƹ#$¤óÌ¢±,æ4âå7ÜVžS“6D3FKVÕ«t æàéjÕîvðmC©R´½ æ^×;çêO!“êÔŸØŠ;#VðõJö¸S¹êöò–ûØ Š%³_tRQŒQ3›|Ëlç“|òÚöLRI°“ê³0…²í˯ë­òΓò`œ/Ð-¬*¨ÍîËHÄÜüÝAU1>½¤àÆÏá"v8ºxH ÀWXŽßdV4n/­~0gã=ÉG_Zøã1Rzƒœô^´;éíÕ2k˜“BS5ÂQ§¥ªCÉCÛ›wû%ù¦!J¶7W®ì2´,“Ö Š‘kl³¡f}Þ‰½¾Æ¢T®Ùs†쨦*¯‰Yr‘ºÔUµF穹ETLóè„1{~=Ø=XïøvO⟪kÞXœ§À®ØKÕ†ÞJ„c&o©›{ØE-ï gW—Û8«zÄi‘Íì4©ZË`—?°\‡iÂo°¬ ¦¦Ú×¢¶hžóΫ’hîŸÀô?XgvSÕŸÀsë|Wdogš›ð.B–Tòolhfý ‰¥ÈdèU °ÉÏ ×ý–årp™ø6ç_Ôù'ú–ÝE«[¸tüJæ¢á ®y˜Þ ‰ªèšj ÃZƒyŠÖ¢ çó•tª3é.%eÏÿzD[†OønÁÎA©òáQµ¾š5¨@M×]$/—¿€”  H«;œÏõüO³yë•&í i“7Š „çýÙhK1ñ¾ëe .¹)Ô$Qí$¬ “ž½|b+GÀ\Cî l¥Ïj .gÉxü’‹n”N@|šœÀ.Yʆ•xâ£B—ÛçG/¸s6É莎”„Ÿ@ ß“›%8Á7VÓUÇN‚ÅC‘ʵ¢Â¦±5È¢IÄYˆWÑç*Íãå&Å sI…Nëk*òq]£±Ûã6Ü(ƒ­]Õ†ü74‰„QðTYyÏd„€‹œ_2©%öàÓ4F"êѲmȃæÑŸiY¡0 ±¨s¨ Ž6Žu“ÅIýÜS_©f+%9é ñÜ8ÒÓPÛ¼þÝõ» à[`\äP¶oí–vW¢mûÐÛÿ¼ïèäDÁ(¼ûÞ„}”ýÉX†áë~Çó¶&”ÅôÐ é|t–¿¶ò½½æ/A£œDHÓzöXÍØt„MH«¢’‚ë¼$X Ê'<×nµKá^ïb×wž"Ó.­:G½3ô,ÉÙ~lÖ œ‹ó;° Þ‚(KagÓŽ$QÊp±ÀIû»=ùsQL™ca¶äFP¯è-3@´¸³.ˆ>÷ƒ&½_O¼ï8Ô;n´éùü2Œgc™¢ÛSíÈY${Öø^Jwáë3*”èÀcÉ/NòA¶}ƒ;!2W¼ÈMueÛÀ‰.c67ÚBÐ$Úâ|•æiÊC®ð^ ?÷'}“ÀÍ„}6Ö´[ H׉¦hsè¿|K†7,WäF°í¸9®\œ§£ Ý-ÿ1=üXìî.t_|›‚6C„ª üö_Fìè4žO€Ÿ.Ô=ç‹ÞÉŽ)<ÞMsbûûá÷Šó"¤smd-¤yïQHJ§þÝš<ƒ2Œi6Âúí—_à[üur0[ŒIFq(Ã!‰©[ª è´TP'2“ÖŶ ÿ¼–®Ì5ÿïš%¾ÎàPN.Ö-¥í‹E’²»a¼‡ö‚uêò¿ Nò‡ÛÌm%oM»’©´±•ŸÊ4rz¥¼ºŠkÄ“ßñ›\ü€­5ÇÄ~îQùæõ1w•Ôæ Ï÷î‘]r_[ŒüMÆ ¾™œçÔo1ÉtìAÜ*ìѨíŠKÚ’¡_”!}ÏœBÇ„»+ÉâÕÑÍ$õÿ«¿‰ÄȃÔQÅ:‰Ïå+ǹ– lðþ8ê„!d7´€«•·Vp:e϶v«Õf_8š¿?GVrLáŠÎômJ¥w’¼ëfV<=†kÞûÄ“#dòøÀˆFÔÔö®Ï 6&µE‘`I8ZþöJ*¾%*±XÓ*¨Rt}1=cak/=}Ví«Õ4Ëæ„÷|‡Ý4>[B»ay°ºÜÿm¾³‡Ù4§;a§ˆ¼î‘ æÛpo+ oÒd’…ÔY;Ø( ¤3Þ°_ئšÈC2º’¾Àmü¯ºYضôGÎ9«Bbmvdûgüq\á_PØ…»:S4¼Ù®ž˜…°l|÷€J=ãz«­sý_å¦ s?(§¥œ)ˆ¨2A½§WŸ4ge¼R1ïï–ºj®ä¦ír¾‰?&\çE¸2L!CpD@*¬{s¿C¿Í<§ç¤o…ìEX­C.6¥#ef×qxƒêxž*kãç¨üN¡úKZŒA^PëÙ D„ÉUƒ]&hÐÜ¢±n Þ`ÔRÿ­1DvÀ-fÐÉ5„e~ÿ0 êâ¶‹…N t4úpðàŒdÉ t’Ô=öx^ñGÛù6M!Še…5¦Õ¦ùÓl‰•S.ï§øî×ß…¿y{‰üU<¥yg„ÒËä«@”Ú[ÙX Üçv~°Ï¤j,Wò¡ÛöÑô"`ˆásÊ*_´‡° €oŒ"ÐvC!ÌëË6 ¯¼‡E¬¹%ÿT¿aLÞ©~iØç„‚ÞHÑK‡ƒ¹ëJZïáÆï*HûtXO—ùR{«(K4¡CR¯#»º²¡kp<“.2‘Å»Q±ß,ã³C Ü©3Ƶ#5³G ´œ·<ÃIâðõ·_ÎS¢Âb{ÌÎü-áËæ}foÙðÖ š¥Lé×q&+ÝŠ?ÏT {´ª­öJsíÌ\»ÇŠRêX-ÅVvÏ1 C×®¶2¹– –’+Km2`Ù4’ˆÜ_}© J¹‚%#L¾˜%4s{ä½xº¶7¿©B$¼5ÐÖ ýÅ»‡E˜÷¿ïJ{¸ÏÃÄ$Ìcb`E‹@½ «’Vcä°Mr‡X_vƒ¦¦½—"Ê]§éçÈ~³]ŠqZþ½Vãå®1Ì9™"ßû`ÚQ¥T@/ˆ8çÐrÖpÞ›I¹l½ª—òÄJ–P¥ó´T¼ÕÌH `±±]²m›Ù®~+å—Ý®Ô~nl©²¾³OÖªnJ+ýÂ5bö jâ§K‰÷IiÙ ¬·nAàöÖ =‹Xdüµ5'Úèäe cH]©’K­om¥îNË*’NÛCãDÇ?„ŽBYsÜõßóZfùØzßDFއ¨Ü¥$0tË*Ø€àn)QÚ ÈÃk.-yn<0>Ù⥤÷àMñØ`5R±›ƒÊËÒ¤úG(L̲ìî—7,Q>7­¶DXä([mF¢ -Ê(¤‚€É²›“ÑTvÐ(V1[Úžÿéôç7˜>;oJó•™ðú)7Á%ë°œÉx<ÀYhw¥¢×ßå™yB€6ùîˆ/ŽÀ=èû6Zt¨„:Õ;„ÏÈnž~ˆí)÷pð¶BYµdfi¼ñ.v|maE }.š;f{ñ '}àzk¨åˆÝŠ$˜õèÉóîO¸éXfN°‡ŸiÆ; ø½ë2ŒøÅs“ßÁ툃ºä˜ˆˆ*åÌ zg²‹*_6:¢½u4^œ¥}`p! Ÿ: CD$ LSÚ¯ˆwón1$Ý Ô1…¤,ÔµþÎ6:¿°lQI”ÑN3+ËhϦyH»Ö8ÓÕ,¹c¶„¢( §øT•õŠÞ·Ç•7b¥å!­íŸ«¼Ê‚˜Kléz«‡çÁ6'ª•ÇœF6F+˜Om5äðÞ›æ>¸"øn:·œbbÖŠe‰—Ž·#›0vÊ+ ëóOèñ Ê1æ«®$Êl(“Aúc#KÃR·pä ì ;I{ïÈÚäSø÷S…UÙ ò­ã†bGaÅxâr¤Ã~¯ÎÊçw§Ã"Oy„£è;L9‚»EDJ6›¬Í|v9¼yáÂ…‘ÜI„QR’É~`äÚ(4gqï(:WR“uR`Úœ½ÊÄ¦Ç òEI9ïm(„xÜÓÉ‚ý¶*§Ó„+¾$ÔðÝÃŒ9ôäì#ˆQ"Ç× VÑ!ÈGdS’ø /€Y¸ ôÁö¯¦ý+ \›x·Bñ["è´} FYöXn“ù¦‘A^ßþ ß¡i/û†^¹)–÷¢Ë•glÝ̵–]î™Ü|*-5f‘ÎúG¹yKÝV.ªÞиê•6ÀO€¼0YÈìø³—¬ðEâ"÷²ÇæFŠ aèA£0û£ß„%’0½rï@ÜüÝ|tv²áùqú—!ùËž:?d*û#ÒsÃ9ˆîÔçš'ªö>A6¦ìû\<üÖþ³1ænv•«ö‰ÇO4–¿V¯Ê¦N‚9ö{²ÚV‰ºÍÊœö›–¡TÐ~ÛZZXw{ãÉká{šI=•+ðJÛ¶bwzEvl9ÆueÑp¨'™‡ûv—ûÓ¾hAÚœÜãGñŒŸÉ} •y´!%”“îæ%ýb¾¥ßÜ®OíÄé‹÷œèÛ·)tºÝ£Z½Ž4Ù5«•…0d_-68PBõŽ·Ô×ãCxÑE‹~Œ.÷Ì]ä5Sâ*Ù H€!øÔ&xLI\ºâº} ÷Ü©Ýb ãž ý„tü/i/_ëÈ¡ßh7ÂæCÍtçFOÜåxäž®^IYÑVÓüí¶nG¾RØñ°B.}›3°N7·™Øûòz–ó_å$²ô§¦ µŒ¼ø”àà3¬Ÿµj8çä¹9à\uëÙ 1Ï便Œ)nkǃâ¯ñ^m¹C¾ ÿºßÍêýŸk ç8MNµ¬“:Æ+2Š`:~AA'¨fèAó)óó‡ì×7ö¸k\I _·`4ßF$h’™?o[–ÑjÅa²k }G>v‹+°< ôUÈKÛü{ö ÉÜkh5I_`Ø/*®&ÓÖ¸ ÒMô˜¸SWÜ{êØ×C¶Þ½Â.•è¬Õg”ìîJ&s‘±–Ó°íöfᵨu@Þ£Ây¡Ó>B MAM–Z²±{·NÔn„H)8üI¶YP¯0üt@„öRS@8Ñ‹»s¶bå5=µ†Ul(„Ûž¹ý&2¸!é–,R²”ú!AÒ¸ÙÁ¸‹0ýúYz¤iVù¤ñ§„ f±Ú a¸@þQQ™Xš’\úL•kÒ¹ÜÆŠÙóý½¶~däÀ„ÛdQÿ Z?´+”éWÕÑ·Æw΀¢Ý½õ8fv%neˆÕoŸ¬ï²O›3]v6O«XãèÆy?Õc‘ n–ynÿÈMc·t¨—›g/"åD‰ê£bÚ|2ùb‘s€Xío¤þ<>:I…>#ì¸ÚÅ›Ê`{0=·Gb1Wj\n“¸ÞÔÓ×2³“v—þ*»Ð|,”ÐqîZ¿74IþLr?^úŠò»º¾‚;£·°Yè¯$>6OJx¯5Þâ—¥[‹’ÍiBÊ×tµ”WC{:6 jæƒrÅI‰&!‰æýcuõ*‡Y‹U`ƒBÅ¢öÝ”¥W:ªüFËW ,ôµÄêÑK%ò€ÄK´Ì˰„’3þ=m»Å¬¶¿ŽCñèQLZëdõv‚s›îv½›)ôÇá3§[3䨭0SfÝVŸiqWAeTÄuò³±@à®hb)³Á$QÊMYòœµ0æsëÜ“µQ&k¹=/!¬jë+ÿ§Mía5NT¡‚úïz¢D>â«8Á‚”æûÕ¨I¼Á(Üúð-aI–ƒ½+íRÿñ¬ ovcIÌêQ9áBá@t(~KCA¿¤ò€×U––æ«Ç[r§ê«¯T¹Þ+>ƒ;s:¾ ÂÉîÜY³k¹‹ÛŸ÷;­«$f°´”,ƒ· ²ƒ4ÁAÙ«4z2n3˜òâ Õ%±2lKí?öé§ ¶+ÆJë­;V…V®µÀ¡ùq+¿Ù‰ô 'š´Ž›lAA3œÃáeÕ¼µ6òMó…·ú)oÿ‰û똬ê<³m½‡t€eë°…ÔßCd#ˆ 7‹ëHx¤fÐ;2&å‹ê¼Kä‡ÐF½úW¥`Áú€MŸœ{ø*õ¨(Øâ2Û~Gq…o³}'oö°Ìo¹Q‘¬ënÄ9"ø/ÕZÙ)SÁò.EG™ü9†÷qÛì$×~Pf‰ßknK¿¨ú¶£žÿ9†D„6Xá ÚmS«@ZcH/º¦FYü´õD'NuhÀùMOÃR$É£ÓRq¨#è Jê8²²ÒKfŽ‡Ì¿>”bHT­lq–€°TO«£ƒæç’Þg÷Þ‡õ5Ä–jG]ÄÁí‰'E‰aãbbvR+ûiá+GòBKöU±½tAã"»¨¸ ,nè–è£ü¼7žˆ–q*E\IÈÐ ½ÖÛÞÙbD£k9͆r‚ì\Q-=%§*0AŠ£a!°Hœ*‚ˆI?ß:˜l“üz®¨?ž¿‡fHŽ&ˆîñŠÝžYA’[X–œöu>ìžX[“½WŽTF·Þ!ƒ£]–ܵu ´±Ç C\å§@v¾<¼p€ _È'èµõlÀ±ñFA:Z3Â0Ճ満Ht…-2Û¸½ãõÌÿ¯á3¨ðâÖ-z;•C´v†Ìð÷ñËÌø> ‰´±ý¶o5÷v«ÚBŠŠÙÓìÓºHé[+wªO½yÊ] ¦95™úE“¥àlSz¼òYŸÑXC#“sº$Þ? û–Kð™t¾ïŠ ²8:úø÷ÚÅKcJ KXï<è½ËûÒMÆ6Š ”ºÊÿˆÁ”M’&£åZUÙÚf7R-¨?wuÖÔŠA+÷°Ãâ\±fèµ½·1?_•0uœ‘㌤E¾·4Æm²| ÷vLbîmU“àû¹þ#÷.-.ñ1 ór";¸†n÷Üÿ£a¶PT¿G!GU€¢èý²Ÿ('Í;‹òwðVÃ\¸=g$¢rõ™À2CĬ„ØÌ€&¶¬Æ*ºðï<Öü28Y¹B#†¿ƒº¾ËÜ4zâQ#k3„Áèv)Óªê¦ÞWQÂGÃ?¸°¥Ù_ï“]ä6¨Ñœ«Ž¡ÿ@®ë€RP—±SÎw!ÌçûE>+X/¢´Nê¿hÉgk¯×÷µÕç¸ãV㿤‚‡gÍMÇŠe”›¼ €Éégêx@¤/…wy‡•A#c†>ÜOƇ2½pš(=©Ðwt{ªÔkŸþÄâ“`±is¥rΔe¾Å~V)Hú”ì"‘’¿9³uŸªtdýÊäó0a;Ç»MÙ˜Àá…ÈnN»½gtpr©ó'´ÿ @¤¡+r¼vü•e©…aQ·>¤ÌÎb‹gnN%Óg6üóEJf`Q)b¿!¸ïý¨· ƒðË\HcÅtÞ—¦Å1ñêÑe󇫈ø iO¯ÀN>hpýL‰µõú§Áw5­"ty¯|‡±šÄðÈ”Yå_pv…"û?ârñÆ dVÈ ­²íÞšj×õªÒŠ–Œr“ê‘««•Þ[W$µ,ä_…÷— išþ¥ç#ùH÷ØÞ7Š¥k ÕÞÿŸ„~pëÇ”>ÖexªŸR‹#÷rñºtu:M?¯ïªÏÒ˜…Ãy¯ðAý~tüÓl·7Ç3X|x|ØžŒjg,§$AOïd|–F6§?®^4 ±âàġϋ£ [Œâ>±ìIãRR²óyí‚^Žvqk[!pÑolµü•dMdÅŒâÓžçè@I`¥&_4ÖÊtÃ{ó I·†/ŒÙ0\ÿB pIõ77o)s @¦Ròv*Áš—^‚ˆõ8ènü±Ò黑Òý*ò}ËpdW“yaÈq8ó=ª…<¬h•ËhH³Ck¾û&‰k•‚€CéÊÞ.6¸û¸Ú£¹›ã%±ê§q œCU‘ÙE$' ²U†Éÿrã>- |èózR¾lõ9ºTÛx¾³2¾j/ÄÆ».UàO×ù õ6â»7ª§2zç¦3ïCRøõ—~:«è§¡§¯„d‰ª$§ ¨ßG»#0cFó¶ªC³“U¼V+†Ôdƒ°üaâcÝü.ßÑ7ËjÎ…ßÄXwV´ìWn) gêaôZÙKuB~-KØ^K,¹ÈˆÂG%ÔÔßy0zÑN 4¶2Ï)t~*jj¢Îòˆw¸émÍjãºF²ËJ~½Æwó‚e½üÔ0«tlªØ».­øÖ‡øáu[|mp¦wUàã3}ŠÎÜë+!.à’¤Ý›'¸Dè–æ›Í—ûmãfAÐ6åÒÚ»/¶X=™—ñœéßã®´•J ‹(-kÑíLóC'Þ—ý +=ÚIÖyüÉU}+n4g˜¦OæBËol³¡UvÐFþ'ƒºœM~ä!®=óÁj #_ tvŒ´¸­&!Ÿ$BîÜlÚ’Xé³LQÇSXá,ª=:±( ŸämuÇvVwC&IºñœÜÔâbëˆàSKW´P^#VÍ‚ÿö¹¼º¬S³@¼y±N­ãiØÏ©ÃÜDF…®BƒLï/ÆMÒ’Í¥{¥ê!SqäÍÿàÐr§})2èÝTÑZCfc,Á®4ú)—OåÔ nA€[kPòi}Lí-™áÈcG&ÐÌÛÐë6ãs?¥vúýÅ"…wd5À#ôY|q~ŒN3'î“™â>½ÊÙ&fèû$Ô 7SrJþÎbp'BÓªú~‘\>‘tݲ^³¿vÕpT¾\¨wŒv¢ï&ø‘Ìpé`/ÿ´h¿ó¹þý!oAÙNºˆºM]ú„C¡4=ãé7DA@ñrAÅÉøôÞPø/é°>7pGˆsSøäæExß;¬…K£`÷ˆ‰»³l¾˜„8¾D\JQuˆ*”úΖlžg áÕ¾h·xK1PmA½¤)õŒæÞžLæ¶eêa/¦ë$Ø–GšTO'L¿¢PÜ©Št8 õGÍégÒ'«/0«Ö·%Ëçô,Ž“‡ ¤”ÐΗ¯¯ùB»Ø5]H¸9E|² v|€+ÆJùú¤^, ؤ_+Ó :©èg:ê H^”ôK}Ï«@Ï7Y¦¿•)=Ú“¦Ø^¯Ù´&Zjâÿß»`dl»°ÀŽ¥íƒµ‘W˜(Ù¡P &…´Ëx]†úSþf…ä‰{[ B{3.»U‰S€²ï&nú“¸‘!.5‘P„Lí—–ÉÜ{¡ÆH2Ǭyvå$ »ÂÝQ¯ ¦ÜÔ'<¨ïúÀëw<3F=£tó"º––¬fˆ«½Ëš@b ô˜ MЖà÷Y‰`''7Q-¬[˜ŠØMd»|¢>ú±\µÄ9ˆ€ñ ñ>½lÝr¢hÁ÷ ü‚a%¾¡£„tåÅj·d;¿ª ?„•¸¯hBR{ŽßÝ=À@ àóôhgMŒë6‚‰‹œ–€qw¶!lCôÕrXVpåú‡]š­À2±+Ä?ð—=ê׋2Bc³ Ý*^PXú)b+¶,Xd(CÉP\õ³‹.4,冡œ<.¡šhÎßžÏùoáù’¸ãoÆ8 5¨Ø9«4æj,‘ž–ÜR‘B`åçaVvx')G«Ÿ–’ÓsN#«Òª]v!Tòš®Êl»æÀàòÀ€nŒAØ«ê û ½Ï‰zu®ö_¿ nÞR÷D4¦«(¶)²i—&D~ôaøêæ±a—9B ±jqè÷בÛ*LÙÁ¼Î¡dSŠ`0®U,qJeb3õÉ_[L¢“_’ÎïKÐÿ“þŸÀ·"óƒwk¡8iL¥ûh«¿ë`HãLjäKÞè»r{e¤×-éÙúPùh;êž7&›‘ÁDô@yB¬˜¦%·”†F"↷¶2G†•?OÆÐàYÓÖÙõ@¬íz¢=¦Æ 6 ]Ö×]#j„BÞÑÚW96‚*îÀ …,~¾ŒÃE¦3Yå0Ý/Ú(Gƒ4‡Ip¾¡ç|ó„ר¢Ãš>è ëÏX+6véNa&zHév+8Ê€cæ{(x‹­BÎÏ)m¼ÓªpL91³×³©‘šk¾¹-+gw—KÇdö?v3'dßñ(±5‰Sêgè0P˜ä¨Ïtš8¸/fMi°Ò†n×± _ꨤ¹ÿ^¶žû)dKÿpßa ÍÛr#<6³oà²s©H¥9B ‚²Rw¥$®·i§ò´â …Ó“™"ºœ#;ÆÉ¢=`~™±…P%úos Óõ{p7„¡œ.ÔŸþSzÖ0™+‹ßÎè[‚9ÚË`"íÔÝ­F^eZÞO=s­¿//ëíŠÈ£‡p»Ë£ÐO’’2átC.ú £å#» , Sõ«“ ߣ0”Å…4ôVYÚhÇ‚¸B1—þ›÷üÇéÓEü7ÙŸçÜ$CüÝ?ŽçhYð‡€™*¯Oró|4¢e,%‘íG–j_àlG¿öÏÞ%³EÀv}Ù|Ú­ n b=¾#kCíèŠV¡tc· ƒ’^lj­¼!È©…w°@Êîø{s¾kŽÅBôþÑ‘¬{Z|ÔAúÁá [h ÇcÄÑîÄCú7¯‡º?x* gRσ¥Ú95cÙŒ„À-®/2>d´Ç$Ò“œ"VF@º¡î á\NÕ|~?ççI{!»YðPtQht5tefÅÄÔñâ[mJ,ê­ep±“ä 1oGæÔ 0f’ÍéÑÛÁ,¾¼öZBŸËPv¡Ø—LÕ‰HQ·[$ C™u¼½ÝóQ3#©ÑµÜ„]eÌNΦ6üÏÄ‹L’Åö$µ²†ôa&þç.­¡r:U³-Wªx×jý–‘,-è¤l‘¤ƒFÏQŒâ´`äXÉžéq}!’ºø|‡+Ä*½ @·óM]IÃÚu}bN#H°6¾sŒ—fYFù™XAÒ!½¢´x+M| 7¶|{#äSöóî)ù¬"øÓîµ…1À»c?ÛÍì~ µÂk3ÕÙü/IÅ úžGC>¸!§¸U¨†œé93Òœ«_ø Ææ“K7Óìºä¶ê°6wùÄl[=o‘õüp…ïw”pµðG¡î>xÕˆ¢F´ý¤§îú·¤ã;¢sx3du xhÛ¶¸ ’šËè±W¬ž[¾Oʹ§iãU4ù”£Çú!âÆøB£8B¿2(žÁ„yÂE÷šá3oW€,Ša2wQ¶ÝÞZjôšlöíÞDVΈ0y'6–zøeÐ.—êH`¨Ï-[ݽ2U„äc^›‘}¶¿NòûY ë‹TŸ=ñùDWG,IahE:—³(g…-žÇ6꜌󸃓ۑ+ET}È´  ƒE&óêÈN¥QqC"ÐëtÓ"éTPËL ¤ Yk°£át ùàü0 ÙÊ+’uöÅùíÀü^‘z&;·y±ÝÎBmŠ¢'q2àuÆ}É8¤´ æ–ùÏ7)¿Òd[¸ …¯ãÍC*»òø³+:´B°¼O‹KjÙ Dž:¯ééUHäiGûŽ÷¿€µ0›˜–¬ð3ß¼”è°y, ¤ìƒª ~feXáÏSjžÉd{¿ºÍã×:ûå«8Wq9“©A Ij7Ÿß£N‹‡Æ¶}ʘzžmRp"Y7TP+EZµA_D³!‹ê  Ùc¬û ð. ÉºhF¿@Ëœÿ2È1?Nœh¦$>o ï™=ý–°:‹_ŠÆQ¢·;É×ù ‘>ǺŠ!šX´@ã|\Jü#r›w” ×]º€†{ Å8z À÷ºTò9/7géxŽf´ÛÅ‚æŒîú¿b¦‡äº›uSd{gìûƒ»aýüô“hø12~í mb4d!HGsʼ¥œ!ûëTï0ILúBŽÂÕæ.óÎkCu%–ö¢óQYQqÏ Ìö~ºûœdÞapï³Òò—ð™OÃguø ŠÈ3øÙÆÑUž‰J@ÈàiJÞ™¯ý€áöy+Ыq9¯r;$îH*æLµ»`˲1ÅO²/óղЉ1}x/:-[†Ø9Ô–7R5GNA3gŒ@ßXžRÚ ôf4lSÈ·Y…¤{°ËøRkº^ ³ýú»“–»v=™ÝzìnË%ÀXXWáw.—nÿ¾eÑ%o$û292AgM¥Ñ£ð¼ÒŽ¿F.[›B¼´6‹Û¨Ê*ƒümw8`øžA)œÿaåJ@ ‹Ø Ò<Ïî€{iæ÷Ö¿^•ì¢øÍ3Ï3Ž€£>DÛ·FÓQ Nzè'±Sî@nÙŶÈj $ÞéâK›ÒŸe ñžTv_Yê̼¬UáÞ5P+Õ=ÌûYÐÀ W£nŽü+ùê‘XÍ™×ò‰9r;h!äØŸu±&È.;:² yô›sIÈ(òoÕ~…¸:f?'šµošߨ¨Ïh~øq=3Ç/‘îYÒólÚEõ¾ñ‘™k/*ãùFhÜìÜS!ú‚û¾:ô!”"äÑ{-3¶_å˜ n¶t½!¦Ef=Œ“Î%Ï%í5ãCÑde8 +nå²üÎ'¯Öàÿy’§/äÖi§›…èÕÏcúý TJDùXpÍëÀÛ¬[¾føvK¥þGIBÖ|§Tmç?Mí"?¨WLn"Ë *¿˜ óÎ7 ý,¨»wµ@…gÃÒGg=¥Ã>ü\øŠBÄhƦ†LsjH1*Rš@[©,YNLÔSH^—£Â¨É^‰‘Lyvj<Ñ º'{×-Ä* å,'4M‰ðÜ…Ã1'dЏž%Ù½­¶(’™Ä•œùôðãiÐÒĵt¾¡åÎS_OîXÇì¬ÐûiÜäÑ9T¸Ç°ú/èq͘B*Ƭ݌ˆNöŒ mŸwöäÁóŸdàVdrsÛYÃqÓ{{ï £RóÍÊÍd²cÔ”¹pÀÈ禵ˆËˆÎµÇ:ÂázèîºÝéøÂ†@«9,V\íB¡rQ³p ]+ø·ÒªpÄ€¥¨YFD8x¨x]÷øäðÌÈnŽ]î2ˆ—|_}\A|ÇÕm%XšÙü!sGÄLÏØÉLaKED§|<¶©íõßïPLÕ°ÒyW·xû~¡E1R¨P³`x³j¿k¾ÆÈCO‡ý0»¹Ò¬ÎÃÅÃq·ØÀg'z&XŒ·>U€=œŒ¸ Ü~èB¢#êNÂR-wd;e×yJ7*»ƒž(áÿìIàM´¢Ð¤6Ü–CkëF)>«Ó¿DÎí Ú¼>dnGRÿrÐ̃‹&{?Û;OÙÒ¦’jþ}2y,ùÀ\Mƒ¡]€G[s|ÌtæÚÞ{fO$e]øÞàÅØÖˆ0ã="ƯЈcpl±ógºîÛc‹²%_j¢óz“q“ñ¹À[fŸÄáOhì‘ Ei4 §}T7p“¸yÎÒ5Pú`Dɺ~°‹ÓhÜ&ãx‘j`¢ÒRi³cftT#xÌŽÖâ­ŽºÆBºäϹAv ó2¹ŒÂDŠÍ‹'<îÌâû6:Å@A~ÈПc”ô%;ÖÆ‘ÇHÝaŽ=h·ƒÂ„‘ÊúAØ¥tùäã—±cU‰[QU¹5¹öKðö•Ûî7y‘W4êa/«kÕ7¥þY®›Ë@ùiÕ·`$dZÐP§s³¸þQ ê<£AúàƒŽ6î:o3c”žóA©s΃¾ï¸?3:9Ã+–-L§…Âqšãÿ8,ˆP%Z \£&:dŠkÜVéë."¤3r³å ³°²w›ìÉ—âП%v7t“#â|¦ò‹8IþÂzò0<'n–›")†dÎ3SO\´fêå}~ùiÞÇ'¢Æ^ØW(¼¤a Pó¥>\_ˆê‹Ãz”¿~Z:4~‡%Î4}¾Æ“5‘>´£Ç³NXƒá¾p½)Ùß%RâæMâ=‹=xþ0Ïh ãTnŸ»] ŒhÇEáN(™m+Jo·¼Ír?åzÂRÂ˵½OÎSHÐÊŒ9¢Ðê,»~NçÒy»ìñošÛ1·¾kõ«ÉÂs¯Wæ¸ÚÎÜs¿×eñ*Ú% gΘÊM 2KA´°üٕׄW?šÞDçê^e*£5Áû«i|ˆÅã¬İéµ6 `dá/¶IP»¢bu¼ÃÚ”´HX%M´Ex) ʱ¥Ùú÷wk UÚÎÍËÂkÓÞ”üÌÞ{òÀaßÔ;0“/ðìãt,eãúçÑH€\ ÏN¯L ±ú¼ÑÞiàzÁ·ÿ2»&èA|Y žŸâ{˜– zbÔʘ;Yްúðw@\.N e«_6Õ[].tP”êq~Çy¨•îLí"ÕW&-™ãuÚ±EÕh~ëÔ_ù2íEX"—W£æ;[³jøøÏ\¸Iâ˯dÛ Í›þèMo)öt±¤˜HòŽ‚Ö AöÊu­õ„ˆ™¨»j^ ¹À„.z>¹mA}8û’c½”ŠÛ¼xÚQE¢²Y,;nj‹ _¤ä¬Uû¨«ÛÓ„²?òwû¬+íNüVçÀ!­¥²ê ÿ|å£:`¡ý=,f¼¹,ªÑI&J…YMã/#IKl!å•HW%rjŸƒ“|±Ú iÙ,Ø\R4š*é5NB6\eƒŸdçuú«E @»HÒ8' Ò~øvqÚ}™,Y›¿C5Qô>#!>“4ìЭXÉm8b‚¨XnûôÎ¥Œj(èˆGËN-Dðm_ÖPh™‰ñ ä>s$~xx¶“N÷Qÿ'*ñVGì<¾ª©Ñì¹–Eu!Éò$¥´>¯c§S5˜ñ¦Ù«ö‘ì—Èßw—½ÔîõS‰¡bÿ¦I¹ýjùV;ÂÍ)ztäLU¤aÍ"å"µ[:Ç ˆ\=N)BQ µG%@"u5²MáÕ©üD"‡ñ éµçŒôéù d8¿"ÕººfÔÁØ]h«[Ý*øùt51ºz'-ˆŒ·M·CKµà¹%° ÛÆ.>ƒë" ñþ¥DÖßÑ«YV T‰Cl®uÿø´Ñ+¿—ÎpEÔáR-ýyžñ9È 7»=ù•8þ•äXÜе :£ÄE,<¹Öò¢'ò£q±k¥)È­ Á¿áªM¿v±œ9`È/Ã{6ªÉD,™€joJ±µ‹îN¡aô«Ípúp;‹¬íoC\Ê›_îB¿÷­Ü›²l‚h~˜dLW¯’ÉgÞ=H”\y1YÖkóqÞa÷¤ÛW.PæømGlõÏ[O졇®ÁT55ù°·ù«“]úÒÛUÃvoÖ?Bm y°|Üö]d;]Çmˆçz½ :ÖC·ÕŒ6C`ÛSo Û±.Ì]³D ‘P[À íR-”b”-E5ü:÷Ž0:a?ªŠœ4„…þ5ù½,ÔÁí¦)ŒV7À ûuG´-#eÂìÄÌE‚FÙo%ÎQéaúyÉ/ñ|èèŪôîX/dû¬Q£HPÿèDUÒòÚ¨¦Éôí (ÿQ®þà–£YÀÜn……R$P-ªâ†8˜©Õb½ž4"*ÕøËK9ÿèŽG¿a€|HÆyd¸3ŸÔk¶§0Óó=›£=¤b²Ræ뜬=þ  QH9¨‚Vÿ ,Ë ,ÊE± Ĉgï•ïÂÅÆÌ/ßâ‘Ëãô¾XáúE'H jRêd&è\}{½Jš‘$(Kîþtš»ûÑÉqÆ®}hK=1šw†{Þ<·á}”ºI¬j2)ÊMoõÉM âñ8®5û).…¸ž‹¶ð¯g1mµÉ­ï¿5â7ôIÛý:)¥—Áîp”f<þG¡¹ËY]^7´bXp•L¹0tDîÜ€þ„Þ½ÌL Qä1÷¦/RøXMÒl­ð¬t¶®ÜO»ÜÈ]!ãjwJŠ.…"eç-Ù> vž *ôÒu+÷P d|“õÊ$70o3• ƒE(ìCu“¬™àyÊ*´h”tî-AŸqŽ!Õ ’\¨¼ÜìH”–=î7{ç¶9x®6Ÿ|¶ô‚`Z=D¤hÐ~GûÒP-'R ¼óåÂv¨ä4™ž“ë‰ÞoMiq¦(sD8¥1ƒ칀 £JDTÖf?‡¤&5¸nôuáð5Dd‰úì‘®»!?»ä°ÄÚ—ð4ý@á)ßå“Òïu°Uª¯#Š’Ïñþ>ƒ¼k¬âŽjMŸWÐëÄû™FóCíˆü+» ÙÅÚUAWíþp=…÷å¡LJ"¤_—Åv\\¡Óî ñT‹hŽ¢bÆêWäžšÈD|ÿ‡ÎeøyyZ§pSl»¼WÁö¹M ‚ĤÉ lž‡6ê…ØZj^ñíu¶è/÷Hí¤¦IŸ½q–Ÿ‰Ê oÓ ÃÀä†SG[c®ÿ­q˜vļŸ$¹äPkè·?Ê5‡’ Iz¸j h¸ý×y´61}‰® lØOÊÎ:]¥fëf­è•ÓšrÙÝžE2yÏ#”¬'ù +–ãŒyJB a·à¨,=Wtx84ý»òKN’’šw³L†NÛb6;oÆð"] å³ 4å²HK…PR¾V¤U*5L -o¬˜ï1àßÞUx`:‰Sf¼ð#Þ…Ç¢9AÄ“ØWᘭ×ÿ¼PË(~ÈöeÁËûBªjwüóÎæÒVä%¨h}¨×Yeè@XÆÝÏ Ž¹jbÆ€[÷¶ _쟕9‘2çÊþåñk¼ rø,Y*zÄì•7Ð}…³‚´Añô-B),nøÛ´%d·ƒ"дD!·Ý:“ŒØÒœ#«ël©Rp?«=’J·úÄŸKõÉòwê9ˆIqÕ°…Ìf™òÔÝJ¤¼­ººzCÃð6—½9æ¢l² vTÖ7A§‚ã4 Ôè¹æÆåa ³æY|MqÃ=²hìôXæ#ͬ»‚pQ!/«]aÏO 5içm®â~®•‡—ßàÒéŠöÙ·å£Ä(œ 8ó";¾Op8‚:sŽÂfÛŸ9è@”ă•YkØd÷tù”Ý|„Ç8ïvþ}ñc\Í]gu:ŒÜùÝ:©Á¡¥}Åß·ü6&Y¢ÕªBH èfÀß¼ž×Á”)p‰µ”Ûñú|òã=w¶yÑK$Ë­Þ®Ìîõ4öKV$Òì yèþâÁ:;׬›"¶,¹o§ !xŸhKþt†t½ãÂÜ 0rŒ­pÊMœi^‹f[á÷`ÝSÔå®yÌܳŽ3ïÌŸ0ÝÅÆZr-¦Vr¨|9Ƈ!â€r5ž\YÊ¿`+ÔçÒª”~¸µ3O”è1ÏEô ÆTärÐtþŠ/ÀÚ‰Ãøü5‹¬ z² ÄË@ž5Ùáó—ûωJwy¥ê/C²"ž-ÙŒ€X>£ðÙ%;»€m•˜_>@P¤|Œ(Q$K΄J+Ò]%{–}¿L9Æx1? ÊÇ-`¹Ô±hæF„§cTý ;Í÷wÉûFYjÙ'½ªGö»Ù#Y™„þ½b2õITƒBŽ5ò1ÛÕ²ŸÒ×®dœ»Éð°øcÚ°ç÷ç#o¤(™[Œ4~³ ÷ø™H†f‹Èó­©àT+SFͳ3íÅíÔþó×]¾‹´ê»€f²¥ÅŒQ(Ò ÌcÚÑ"<«Uƒ($ôÊŒÜ2ÝÌ¿ÝkãµZ†³. Æ#ô#1äìÆó¯¯1hö§mŸ^”yŸ%І¹x%ô¿ŒFšAè²hªŒSØý¯¦o¶Ï*Vƒ+ú7C/pÍݪíÜY$Æ•›FRÑÌ €Í­;ëùüú”/ÏM'­Y¾æÈ+Ù3iöMªMt‡-Jþ̣̜Ç(ËD)Ô…ÇCcøÇñR` ~HDz0””¨aÄ“”2ãö]’y¯‘×$:7¾ h[aXòF-ú ±É%­¥k~‹d &9‚rætMùwÕ§z9ˆ´Õxã:ýÀPa»f»Ãt¨8Ärvh;À´Iª°HIIâƒ+ÂËJš#áZ›6s‰^+¥ªzî·m¿ò‹G ÝêUŠl°XÅ–Úì/;µísÞõ*ˆý¡Ä]ØŒœ†‚6’ëøùE(Pc(¢X\IÅ8%ÚùÔyþl¥Å™5)_LeM‰øÄ„„Y¯¹­õxÀy·"–OÜZíºÃ„o?zRãɹ¶ñFÒ‡Y¥Lg°¼àAÿÌ}}À°‡nD…=—@É¿>T$Ùí‘ï?-8Mპ¦Î—tǪ¯ËÜD\ÏØ ßyµã|YjÝÉ#ß8’Шr9`(¹âù»R?Šúž™ƒÕpy׸w&š¼¾åÏøŒyJ, Wv×ˬŽéºŠmúêÈtÄ_<»t+ßWmÚMë’dlÔ¶|¿Ú¸ù4ÓC5JL1'¹³nìNPEºV1T¸Î ÷•ÉÁÅ©ª¶ÊzD Ö§‹o¿Ð9 ÑnKU‹ï UTËÝw,+§g>Óú'Rìm€²(ô¸{n…j°}”Ö†ÄGMT58T…ছzH/Z 5íh³Ï ÕV f9ÓOÎÉ`L„P'ÂÜV´¾@roàGQý`¨ôŸäO.JÙÅbƒõ¸2È4P&·á÷Zèθƒ´ï^-þvcûâ.aR(—¬HáZN7Z·Y·8?€Îo%‚½‚;¼ã‚µ[Qg×¹ŸÐ¬G’ƒ#—Ù*¾Ë8zk”pÉ(𲖴ú2ÐLDšu‘¹ß¬ºMˆÍV=a0ÿL>óÈ桎ßõlM¶©7)ÁÐí4¬•æsl¨?M¡|xø$·™f'þë±ßᯠ´1|ñ¬½3S†.æMìæ~"[’æùv ñ  ¹·.ÅA7ІŸ¸hC“}ümšÐÏßákHW¡§á.WtÖö°,§På—§ÿâŠGœm3á㞆€ó™ü7‡±DïÓ²;_gg¹$íªtªåÒ?SûHøòXÁB›ÕÚ•%Œ›+ä4N‰SùÜ;Þ¶6¢YE"dw:ÄC¾Íï×8#Ó Càv¶‘þt-N¤ÉÅæ]Ó¨ŠÁíž –Š_jß“}ËšGi OÊi4oÈ Š$—Zî†1æÕr«¢nœc¥³ ÜÞŽã¤{ÛŸ“!XÒ°õ=ÞƒbÓÿÔ':G3$zÍ©èÐã{¤àÁ´:†å/ø-©|e ȹÞ)¤m83wóØõRõµ—r5úÉì’Ž–þî?Õ܃>¹iz‘!nS^×î±Ó!qªæiÿÅßIObI<û+Æ¢g…MçÆÛö…’…CKŽ8Ç—ÎAkì‡4ý閭Hâ~x ‰u-‡óc?‰2ÝP‡2[*­šS‘Ý„‘ÛˆM¢~+-ÄC$ˆ?q”vŒçn•bÃãKxü“þìÊ–MÜÁÀcÕY¿´ SK«#UHï2bÁÿ|±™•· çsÎhùr*Á†²Øñ¯sÓi öBÒ¢ºCÇ@ZspÏ‹Ä ,?öà0•¦zÚ]ÁM¯¦‰øÔ Dº³™Ö®Ÿú4šÆÃ_7é÷À¸¢7_K¾´ò𣙚²iŠÝŸ9Ȭ:#l·˜OÙLy°lÒ/3‘¯ùÂÛY_cÍu´8œŠ5ðØ¥Ùê#uJ€Ñ.îj³|0rmEÛb¢·Ø¦×”H‚ãÄq˜L ‘„XSå¸*‚oÜ£”]û+Ï\{î›K5ßè¨Eª£øÒ50 ŸA£á(+Åb= XEœ™à ŠÒ’r ̧áxÅ(A½;†ôo.?l‘;÷ÿ£x~ÙpæÒßš°RíÉl~SD¼,@èýËêkhÅwçP9•rk|Ñz9oÒ(fGlŒÊ ^CMÐ÷=?¹‘–Ó ´’Üñ.ºÙgÎÁLÒx XËÛ7Œ’ºô€ÙÜ Ä< ›Žc}¹|ËåðOZå4r Åä.%,±—ó=‚7 £ß¹¡,¡¦%ÌŸôÌ– ¦Ï¾†äDÏ++ ÓMóòSÏûoo·õ·ÞY€Px~Ì?Ò1ÀŒ"NçC«f¤?Ž„d:Ti/´¬„rE™Âƒ0 îßÒ­ÊŠ•½ÊšGö ÆL¤)åÏú¦Ðç Wù¢p„÷©°çK´(™W<{ŽþfÍBêwr2ï!ý”é`o F_Íù§ª®±ÒöÐÕm=ZVÐ̰µú¸Õ÷ǯ…Z,ÚœIl®Är½àPja~;ׇMB->Ð矺 eó @&ЧQ±æK5}¬Œ PëFàA¼q÷¹-Pó|Ì<&Ø‚o„8±B`— åÔÑüÞ)D±Øþ‹B­Æç²¨‘˜dþC—–NøEpB(˜¬šë®Þ©¤¦ä7=3‹</5¾Xóú‹)Á¶OµBÄHt €ç¬‹šûBZêòÎünÁJdW/sô­ÇO®ÞYnbZ²ÎOgœý61qi~Mû`èKdi˜PºÞVÀv4K)a½âØ2 ©ã–QÇ—ÄÀ¾ÊÔEíú0ß&sµÍ4»•B·ðÞ”lÑ«`ñS Ñk›b= d½×gµêZËžÍ9 K¾Èü0שRøô ù‰:ûh§Q@Çë¦2î˱D€:ZAùfPl¢“ô™µœ.Y‘Ní0(‚ãl„HÃëGÂì¤ÌCfÌ…[Î=A7EJzXL¸‚BíôÊt¯¢Îz&¿ÍbµZཬ ›|úórpãËHí8ÙšÐ=©idŽßPŒõ%iÀêÓº˜»1­~# 7.R<·ÑµéÖŽ;ßöó&ë×’±£qs\¹ ü]‘>œ)ÌÛ ¿‹¯S ,“*æ5B‚\*–ìÍ÷êY¼>¸å¦§T<öª¬]좄†· Ã=Ÿ î¿(ŠÒGN]÷|æ9oÆßüKHºÄÿï&>C4CwXèP¸ß—ÅÇA¯g´!\Õ“Þ>0G­Ñó}N>‹¼Ú«»E5Ê”7ÚÕÂp|$AxEš+èîèY%%gÀ’M95÷“áUXñút8ôÞቷï¯ÆµTë¹Zþ‹õ‚¹ ØÉ ¡8\ ꈟ>›<•øÆùR¢='½ÖLùÚhÓK‹ëÀU£0À½4ò¸L—ã$Ì/USàê÷Cóµ39<’ø25_c,‚ x.¢²=ÂE,ò¤4`g• TäShèpï‘w¼l»dÅQÎp—íC@(P5,B°qDÄòZÔ^…ZžŽ€WïRúˆaíÙHøý,oJ¯cµÞìòkµ(t¡ŽŠËÄ5@Q(vUÝágG{ÕœjQPs渦 Em•Eµº­ü·NƒõåÉä¦nÀ¯ågæÝÛñMhY N¥ü“jXPí€^XåP¼¦à–y?þ4°LG6É夒\Ir¾óçLù ©fKÎ`2N™S:¼Yµ*,pè&L9t,Ìtߌ ³¼Î0:_>|§Z‰¶öVás^²;ÝÍ ©ªN->®F¬UmÚ>Dˆ_ÝÄá£ô`AvNž—°ù^3¼x/HË'fs‡Ùñ'ª”gŽØ…ùJ›úÜÿ¶=Õ­¡÷´ëÀh³ÖóðÛ>‰Ãrê;c×ë0†¿peÛ6æb ¼I&™^ŒB™ áõ&qh›²R¾û=›ÔBÃ>ƒÈ·Éñm”è¡â‘Î FMµ{£b_Äø>‰š9ŽƒwÍ3w÷˜†A½;|A—¢SO_¢  ËK1åÇÄ5FIØŠ€G2+ôUWÑðAÅ^òA<é>|Ï]þ警؞øuA¿j­cŽj­‡U}FöÚou3$ìÏ’9Ü …§ ?ŽÇ{“2T#†ImÇ1B±¶»üµKsýÐ×5á24UÁËI—“ÏF ,Q‹ÐŸR>ªØ/ÆéÐ|»ªòUÆA:Бû Þå]K”9ËF‚Êquس= ‹øO˜»WM°Op[ìò¬”ŒÈLµdÂaK‚*RÊ ;¾=2v?ÿØ[½/(~,}ˆ¡`܆׼ÓDnAÆ¥/ó£÷|ë;'® 2èÉŽ8Åç+‰;¨¯tT¨STØ)$Û ÔÇ-»z«e”|S8õâ²ÞW•¥õÂ[‘ºhíŽýåÙ›¿ËȃòŸ=ÚÀ.îÞÖ8Ý¿ßmMb`I¸ž¨Örå w0¦ˆè¡$ bù”;¹Ñ§1­Ëœnâ„âàÿpn¸ø¸÷´«¸ ´/lk'˜~OõôÕXöžpçþl0ÕËþ~æÁX”D•JøY´Ðw¦Þ·ï§Lž²ÐÜÍöfÃÛ~Èúw—hb˜5\Æš¼[0ÉeîP^ ²¿óI'sC¬› ·ì¹å}ŽsÁ)÷­½s}Ò Ûf½ƒ 5õiãälÝy‹fè˜Y0ɯz"±ì“6¨A°öÈÂä :}]]@̲[t(àFíä×PàDÝE”p(›<¦Bµ·åã†oT›èÛ¹S¯wyl~Š‘×S÷u’kLD…˜“%Eøå§GÊ>Ì•jùî—ÿB¬9%¯.­ö÷²C}v¢Ù¿¾ôL;xÕV{ê è IE†—røv`Õ¼´ÄUÓ†úÁOÄŽwátÅŒºƒƒ-5¶9®Wæ)wƈm"[ pY ¼48.“´wŽÖÞd’ñBl5öi%úµl—õ®5ÑÒH¦„¬ô.‰' *"~··îüµ£h\{f|ûŸ+EžŠ':ÓHášžVýÉì+h{œèÁ7Ï¡óIÞ£ˆ…dK„“-TRy¬tužÐàŸßœ$pi-zRß ²º¼“KƹôÏUÒ‡X¸×Ëù¥JçHM,0µ‡—A=Õ#OXÏÐÇ”TŸqW¼J^Ø^RDª'Ìã07á‰P78åàèîYõ7h;³Lit“¡säø»—æBH’dÞ¤b ”ÁbìCp#Õ B=5N+á]¸:’tZl.YÑêóøKÁ2˜Ž\ç0©¡ñä\ÞUâÜW9β¥.WôÎ+Å“ö¨µ6ÏsËÍ•Aa$Òh§„è—ùÀ•<ƒ¡í,ÈÕÁ·²ˆA©LµEö4;N['S¡¶OÛWÔbü1êëyaç¢B#±b¢"ÛMûqîP §šŠN‚cˆg üŠ…ÀrÅ}îûL’ãGTžèr Bˆ·,ײüP>ùÆiü#ËvŸi³Ñw¤óMÜ·XÖ…G–²šŠZ"÷!ØóÀŒÝ. ‚ƒò„†tǬ÷Š91rb¯B>¼öÙ%K_èL±P&a©%ðš~ }m{zÇÙ‹"Õ@Þ%2>´z B¥Ws^Qø ­øß›±Eë˜x’ŽÝz\œR>p ajõ°áHN;‹ù ×Á¨æÔU|‹y2ƒ08¾Y7cJ ~ìS;v­û<2{°ACÕ1Óâ|Ãb°Z›@é]©öÜØL@RÈà›=:V‹º*¶úÛZ sàøìT‡Èe%íÀ\Ì»š%"i±NæŠÏŠ@pÆ_ÙL…rœÐÇ€¨ð‡]E¯L±5VÛ ’<xás¶CÂæ®@ÛÆ úã#ŠÑXk{œ*· ~Ãä‡|1¶ ¶[xEÃ)þêª ò‡1N¢Ñ~€‰Éo›5hÈ“KËÙ½G”~X!` ­ý4ìóØT]0a¡ =t”ýMrጡþ™•ZÆ›èržy„aIµqÅ"²q0Cü¯ÞŽýûW22"Ä+$ÕÇ †€[åv…º % AÝ‚ eN›z†3k›(΃«P®ówŸ6¼ÿæ2$¥Xû2'v:BßÓœÑT¤´<ÞZ¶s›’Ö¬\°AÍÂpø.匰ÊdáE˜#·Wš$=O™»)årÐ “¾éuE»¡Ax8l¨¦óäBîzkó7q,9vtð¹O5Íéi¤Œ¢;Ýgág>p †?5]Ø<%®† SšŒ±pÑÊÚÓˆï)IÌMÙ¬S¼J2pö iXËÎGàœJÒoI´‡Qº o§C¡•–Ym… æì½\}ÆäíÇD A@.Yà/H›êãØiaÚ~8¶·Sk¶òä™Ý¦Ö‚¾Â¸aZpƒcÖêV½ˆÃö<ó–Öa¬ ¯o"š¸yçœóMy ˆDؘ»M;eü•x+;’g¨"²RV«Xƒå˜+u $ï¤]úIßœïÁ¿v Ÿ4_òˆ*CMy¥Íh4ȱ(5Xæ8lñí[ŸõØŸKXò±‘m=Ã;C†ïæžn˜×:Y²ª²në}½“;ô[訅ì¦×Wc/hö­º‰ùb ª^68[Û`:èkØpžö°Í¯éSB³MÌþ/lx«±ÙT$Vh¾pjµ£€«¿k}óH¿€a$äd4h&‰é ر1þûÏö0ox(LëyI“.èõ£ã]â¦æÖçv| ³X*Å åDPdÁŒ°*yÛ˪6ØýNßÖá)˜~÷’âðƒË6V3j&½¬<&™mh·¥ÙCNüËg¿gÔ{oAëBЦBZð.f+çR@öõÌ„yAwtùX ‹y q¡`lî5}ÂTÀ|1EiÖî¶‘O¤BÖšvÚjb¤Ì×`[·²hþ™½Tù8’n0ïç° H)~n@„áf‡øabAšš®0díA rÝΛm^œWܪóÒüYÒYöŸá ¥‹ÕyÒÊj¥«­Û\`ÚPæ¥~ÛI¨ ÍèCu†…¹EOÝqÂßUìLNêoÇp½µz~Ëó´HïIq6¶æ.èøª-–Õ£_78¬¤>ú¦dÿH3‘~26s¸‹ûϯ ¹äyYnAÂÑ/’¨¶¡:¤±›Ak£ûŒT:"­ Ý•]•Vá2j A”Í\òOH3©@—Ýþ7‰a®1êT(J<£@‰hD7ê% I~h=ŠÜ¿wªŽ^Âñ¸„…WU¸ åó8k™ImˆL‡±gŽ#x—™u/c õ"(©Žs?’7ð Š ~Îè´¿óX¬@™A5áV Ú™”#i!%z8¨W¡b§ÁKI•·òf1-¾¦*!j”`xÿ‡Z…ïv//âgÛêàIÎtñÆ-­C1åázñ5Ÿ—ľ_Ò4f„ß`\.[R†p’—ñÀûíŒsS±í²³{ê~?×£´“%ÚÚ³(ÜT•êúÏÅÓg#‚×§¥üaܱýŒá½±ÜqÝŠ3Dx6Ü'Ø€9Û7;úò„µEHÉX‘ÀËÝ¿ÃPc*õ ·w*7Lø§M¬Ù ,ùw©sùTgÖ®Xô}¾±öG8;­gÔ:úTJ|è R[ï§Î§àìÖöXôÁÊ÷ÀX',ní¦ªHg®Ñˆ‡Ù¼,È'Hr²úG(pºç…P¡0ˆR¬XÄé! .]cb^>x3TR9׺ ø¨Š£ƒüÎÕX F_¨’î (”£Éa{ß³¯„ÜýöøUÍsù´[g›6Îø„ÙýÏÿn¢Užå™îÿÓ+^öÝ.²(Äyš‚mîÕ‚Â2¸*÷¼\-’½ª]¯Á"C²ÂÎéÌ‚}ü>ÿº¦¬¯]>oÒÎ&¸°ŸÒÇÀ&ŽéM´e9Á€:@užwÀcIÕ¦ëüýÞ’u`±¹U‚?ŒAü“'ß<xdñ/©>§^¯¤:fdkÞ«°y‡<7‚Û;td.€iqˆ­Ä‚CÄ̆(ÿ{oˆ‚øúä Ë–»…5kàukaìa,’Q#‘·NøèÝ[ñ<àGþævZ=1òÛÆW¯|.¾æU~ðf´ß»)Ç…ÞâZýÛaÆðº²["ÀàÝØš©¢CM‘­´4…yL.…,’äáu?S8ÑORZ®1„¿SF¼”ãä•.âh'~耩AÔ(Kn?¨P«ZüãPúhŽÒÌLÂ5iG¢…Èc?”d‚(Ê*ûª¤º!§™Œæî‡ã;DøÕìÎ8 tm—®ÿ¹‘9»ÿÝó{XBUš¹²!¢ "c:ji_ýC¡äb@MМî{15D¦4“e ÝÒ—Z#—‘*.22ž¿©óÄ~«Ê!°ã[a1.D}óUYEõU¿°>Œñ]w4>ÁveÉ7£#~n&ÏçLðO¤éž»¨²S˜S,—ê´Ø~ãcâ£ä yrœÄñŠc—lÀñy@ªt«ù‚@û[,=oâ–¨!;§±›wÅêI…vw/ _·ŠEÚp°¨mGª½ e0Ò/å {QGº³è&œÂz¸0ß39¿ YQ4dÆQ¤UÍK"T¯)èb‹¨µæùz4•DÌÒÇI×&h1rQ¦à.ÐZŽª~Ñ×yðÃ嵑æ®I3ÿ–¥ì­Ñ½,A Vs[éßò"h7ìóâxà…ºü.…+=JDT­ÒeÒÇ·Øäʤśw oÎHï#?oqÅd¿õ,>Ç‘w[££.½5?@4æ¦Ù\mŠrVÔñ˜Ý:CÁ9älÀ¾ ñ´]–vi‘hûL¨(AVò NXuŒX×ÞCê“„}1˜2¢¨Õ¤¡Rz˜DÙÁíQ—´…¸œV“ö 5—nÍb RF©‘Çð¸HË(¨•T‘HùN”¤âU”Þ¢c·=Þ5™]ŒC½žž( ÄEW ]a%,€;Ø3~êC¾ ЈD yæžä]ŽÊÍvUåÜ—qŽ@¸ã:Ë /Q‡r|\ߦHçTZ”´l•ÍÕûA§ !I´‚5±)ûªŽ<¸(¶úÙ]B·ü^ÌUCé.v1¿8-Ÿ3Tdê=)ûÄFœ}ø©+æ+T‚’÷y¿Õ:å,W³—ÇÿBÉùÔc*EÝ ¤£0ØJï„~eo{ä’½MèÍ´úÉ…rP Â‚+jIDm¿{ÓÛxTl«_ @ü iv vˆîlI¬ -·iQ ÄMqL’€QR ˜ cÀõèÖ6r"ܤšNwøþe:X½á#Íd’È­*9,ÄP€èÌJ÷¤ó‰ÒÄnIÏ{)\ÓÄ®´nÅÖ·Á6ŒU£9)Gíçê¨Á"xo,IY¼XA.’L¬ºyù¬ý€Í³Ðm…¬0šV ûw[êcˆ£¨YšsGSTQ£Ü2‡!¼Ó Ó*yĤr½Á/£ÝŸ@+¹4É<·A©wñ.ŽvêcUÿì \¯±õ×·7L!þ8es5™Z6Æ Ÿ½Âc®ìkÏK¯gÂl®_ÐNmJ‡|r{l 6rt0’i1E}oh Tþ_ÍÙþî q2£A 5|iñò·¤¬L@G¼KšB-Á¾÷F;ú-”wªep¯ž:<©VõRÝädñÀ~ïzCõÞjßA54‹ÞÕD 0\å]‹ž·Ô'*+ºËó j>×1-X¼1.@ Ó˜"ö¿>&gxx}ò©Ë›£?Ôß,õgöÖ@ N0éºõ]\šßry¾Ä!ëP×BxªÚbãñ½dØrñ,[€½Vhæâ‡°³÷¦Áîz©FuØ,Ô…‘…×±¡»óBÆrŸàÐQf$½8e½£ØÜƒ)hòµý ‚Æ—‡2ì§-ÞeBå£*´è¦n â:Pì\”ž5û/ÎòµZªž©ïC¯Ë6İ©Z{Žz ®ÛíZQÅÅ/¹Ì¸?Z˜< d··WfP®8Ûf‡Iò¹4sæE;Ú8(·,„áÚ;IµZÙ¡µâŽî+úµ–6.m$3ÆZÄH†·[‡Y2gk•Œ*‰MˆnܾLz¼àø ÃÏ4ÇÝ¥Ô@@¼¶/Ǧ3´Á¸ S¬‹HùÀé…t¦ÀÉ.1íà©iPh‚AøWþvKºulbɾ_jŠ5ËæI©@^²T܈n"ŠŒ(Œ \±@ßø"‡-¬éûRÒètgÉb«[]+îåw}×9:³ÃwâÉ÷¥0wq?k‹k/mbŽöÒx`£‰•ÚÆÈóe±§uSBü›æC@œé¸¡œGë~kz–8÷¡_Ñ] bÀš€b)ì ¬¹‚Rþ®ã3÷óµð„›ájÉÖŠ³zÇ…û 2TŒ­MLFN¾õÁê;cÛ <ׯ}ò­4w »qƒ´åNý”µe…•(/q××Î;l@Ó£Üí÷aŽfTÅjÇÕ)ì,nÁpz»²e<­î““ÑŒ'ø"I÷÷ŠÕ"ù8òíSÜøŸTÁ#ã÷öi%˜+´:Šã:•&Yû\¼žçÄrr<ÏQ¥jæöødD® ¨GíON(øsJ¤»Nü§–ɸ~Ù»R£ -ôúèDµKPÅOw9¸ -@`@ì¬OgöJ±Pä¡¿¤Ì¾`L ÁÊÝLƒTò}éˆâÒBDÅ”míDçÛƒÙýòà{.÷•d6ÈÆ×¥bz·ÙöO€Ž=bvLQB#~ÃèKÄîÝpæ0>’Ñ<é×µG6–³WŒÏ!ÀJ ûµ<ŒýB€Ï÷µù¬…QÊ|ƒœã^‘#ßâ®<Ó ÊÕ %»G­²Gú]èðbÄÆ.èï-î)¤FQ°¡ÊÆL v½¤I9vá&B0ßU6¾Ê`E,²”ôÖò³Ô ü=Þÿ°ÚR5P#b©<›Èžb)j^©øÇ„?{ÈèZL›Qêòîf,.·áöhÂøÆ‘ÅcˆÀ+p¼²ãÖB“Zã¿Õ}G; ÐÂbŒc¯XpkUwíf8)ÊGµñ±Ÿùµ“ÒìÚW~U÷Ϋ±û®…Õ$+áPrf„ûýÈ—Ð<”PƒE•ï»›#£¢ ÚYßAs¸FxT&»Ú;tfÕiû)]TGŸ–41YŽ· x[Úø|*„|ãÓi‰¥ [­ -Ö’UÌè ÿÃ19~I"ÔUÖ#g&i§‡2"{BQMsY¡/š€É{õI¡`ðì9¤¬õ™„^éÒ$KºBŸ^Á&ÓU†±4g£˜¯/Ò$•ªieØœÎp¥eÚ9½úëý­­ÍuaeA*[eE D¹te)ˆ‹±dgÒOÙ%ø:Ú3vߨ¹A÷õ¤;$<#·oÏZlŒ©]½ ~2áy¶gû; £®*Bš?Ýú8KåñÂGK[­[ýøk2røÜäEŽü$²·¡v2#ùK…± ®Ö"U?!½ªèÙÑ·òË/Æ^õçr,DBEê2àE(.£1t’yR˜e‹l*ÃûK±V „$šÕ#ý°_¯ÞèÆŽßƒK¼ã‰øXdÒ«ƒÌe[ÒÆ]¬(Û ¶—.Cáú“?­füDL}ËP‘YR`U°©ÂE~‡)šºäîrÜÉ7߉w1ÍΪڑ2 2`¸¹²­søJ¹`&íx"ÄýˆƒþÞbmÑ(°*"m÷¨Wl}I í9ç /^Ä_~ÀxjŸõÉg‹)–L&îü€†ÿ¿3©;UKé¡ahÂ2TRf™E 3ŽÑžBUtdГçã„åͽˆãÏ÷¯Þ(‹œ}Á ÌuKZ„ ¥W€aÝY0BÚ §Hûb÷¢>@KG6?²Ju,nžCÇÌ'6\2ÏŽn“¢‡³<­Ãz –3ª„êàñ’Ü—_H—å-·Obg_4Ðëë¨@]NJ÷k÷Vgžß¢5òºãâî\xPÃV9BVVs—„Ñaæc7Ì’è³oGxôÊÆšêÞLÜöä.Ñf>òeµR‚ˆ9jI:ÝÉñ¿?ð!ÍøÊòº–F`sw–+d“ù=3œ ¯Gž:3ìiôÛ¢~w­Âi52õ¡.HK–Ìõ#à Ôû–cC´:Âd€ ]ËëØñ‡ .†‰r]˜Ø£SÊÑŸ}]uØÑÃÒBªî†ºa®Ú=9€ñ„Fˆڿ̌L¢‚˜Q³zÐ|ªìn“ù'×ʆ¦ð„çµùZ´\”¡ÌœÅ1µD4Ü$|)ÖzK¬ÓêÕâî–{ƒC0¾µÈ>@arÔ¦ìë±æ/îdwù(ÕZo•ÕI—RmÃN{dU2ëp=5OˆZ²`î€;úk.°Î‡Ê;ÞÈíiÇ„_ã$æÃG–J?ãÇ4¾r_ì?‘Nù/삾>èô~„šoÁ´ð«29K"æ Û}Îl$Ɉ-ì×µi¾t+–bÛÏ õ»¯Rþ j– §ˆ„tÑTd',ª5š—IÀ %|×äg„9fªgÉfpA©KÅ?0CŒ ÂL·•äf9íã’ë„Úi• ø97¯šmÔÉùñ…þ–RFµc) ¼rÀéiJÞ%1Jž4•'Ô\ÃÜwì ì .  „ü ϲã™]âcäÌ~xÖñt6±ní¾>=Þ>¬H‡œ¨˜ˆ8ˆ“\…BN¬:LM—üætßjç43°Ò0=zöûÆK@a(¤Ïó½c ²ìge7¸ë6 y›¿Í'¡jŸ˜¿!#_KÕ•E46õ¸ýk¿e·›]¼d¬`¦°Ø:ºc)Õoz{JêÇ<  *ŽÂu½Š$¸ ãš=–³+!_æ0ܾζw¤FÞ°˜nQйMÐÊëÛB)H³æ|ènÐl~Z’7¯ôæb©i"¹B”ªXqɱ˜pÊDI3{M þC‘$¹ h¿@ymeÍïË—÷›Ò ÒCKí“Ö£Ñï[h¤ ÞiüÒ HO©Òpï!}ÓYËÂÌë‰ò®!HÝ Ä=?‰Àbˆðÿ@O™ÙÑàZ·‡­@ñõã‘á¡ÞnvHŠ9¯„Td6w–uÕÊ$³òÃü•Béäã‰7딥As°Âu,ìÔTŒ´­&jU¸nž,4e0Uá"¡A¼-#Ÿ¸HîPýôd~æõ$6Wxu’s5^bȹS¹ ‹qM…$ôÓf‚Ð/½j®Bá¸ð cvž2”8–Ky´p¯è‘¯ÃTÑdJ×Ìõ¨&Õ—Ò¯å9t‰(CDä¾;ÿ‰à†¡;€ÙÊÍy‚€ŠU3™‚RŒ{bBðe,©´rQMðôˆß:VR°M~íÐlÙÁŒˆÖ¸Šëý5é%¨:'ÆÓÊ£Ò"ØsºT4bªVüìà øp…³ÓZö9Ó=`8Ý«î—ø,~nsàÇlT!²ýc¡~Ê õ\pMfêRšŸE¬OòŸ½k3˜v Ç5D'xzç„ÅhÚ>šÎdŽ1±Ê-ÎOî*ZÓ›áÍ :vÝ·â`+¾> œ}ÙåÝô_S ‘et”|Õ{&%ór>ÁF/…aoQ°Mzú×ð ê(/òÖº2¨Ø´oæéN<ŽãRµ‰ùƒDùhPLÿµBÕÉz’¬àJûTäžqí'¼E“‘ÞsµÖr÷ƺѫP­¾÷ü0RâCS4åÅj’^¢&ëÃ4˜¨5èCB sàV6§bÞÜ+K‰ œO¨0y„ä'JMžò—x –Ľlôò˜{C%ï†ÊD«_¦Š&2y« $r!ã\´_v¾ŠÜ¦Ê”/*ý†Ò¢Ï N’$µAÎZÎü¶µÎWƒ'ömYGŽk­d-ä X“Gý‚g@µ¼ €¿! ¿KªˆEJ=zš ¿™aðrÙ‰Å[ë8Mÿ€»S?‰M¨œÚnjÙeÌ#Â?ÁoÙÓs£l–¦µ=3‚Gj) iw¹2®=ßíˆïL®øîKÀoü8qO˪ÐÇûùad(â¤ÜÇ\ω< ÉÉø1¶l1ÿ7Ɖ\ˆR¸úR»äöáu˵HZ6¡KÒ`E`äÕšNz™¾¿¤âm#ÕìÙš,™^Ðù• WÞMNºg®°EZÖZX–Ô1Ó"2—óö)fŸO a¨éBÐ ~F ¾]e‘”Ì/÷¡‡¿£íL’ú1Ûm[P~!R@gß/'Íg¡ŠÔ&­£³V¹ñÜý3˜HÈúXc/M—öj¶l¨’,˜ÂS†œï3½‡™GÎ-…/F2E|¬½š@‡ŒóóiAÁ2â²Ô­&ÛÂÀlÉ×ÛþCòøŒÇJ´Ro*ß%ø2¶€·‚TMöÈO@®ê]ðz-Qâ¬ú©ý‚}j,f l®zba¶óo«€Ù¹—8®‚'@XF[e\ÝN«-h9_‰½tÏÝ0Àë)4lp}°´BÝn"¢ ÑC÷Æù&tdeÞ+ÕgÀ¥ÇüÒ•œFÏ#è#žcÎÝùhÑ?”m¤Ã Sôwæ>ò›O™hÉV·†®î,cY2INÑáY{7o‚¡ØðñW0>g}ràû¸Õ©rÖm²s‡Š2XRjˆgÅÉ*s0 ªÂdzÒñË—•Æ$Õ½{uÊ-©2…ìtRoÆÁj9K¿±Á3ÞE}+7B®VWp¤ß_/̓…‰y³âd©÷k~y–p9Xbh¶é¼ zŠÉn¨ jôaê÷»(|BŠp[Í3<£»>—©£YëY&‡Ë›Óƒ™µs‚ë§ßËêbs)2Û¬NŠ_h6 Ͷ;Ѩ §ˆt ‡RíÒRWPK_Ý ËÈ/’ØËÇ_L¥Rg‚‡ÿˆª#û°¢úSV°ØJ³\uIå»ùï–¦ˆáîÓ˜o©ÜõúÜgø6¡Ë\}Z3B1) ÅùŸ[RÒ):Oøà+á3Ål.×ÊØa¤ùé+Ü¿µñùÃ*ëÀ])Àj×2–Ÿ›Ð|%ó`9TÿŸg¶·4þôK:—Ð*ÁPº‰1Q3ȤœVîº!"!äBIT{“¤z5;g¸‚&ú ©ô˜£,Ηgìâß«ÊÿæJ1åŠ÷êîä së ö:žµ<¾¿‘Ñ"—å(HNÌ­³Æ8ªN|éÁÖ†¡¿%¶Ô~ÝKRÙY1bSÐy[u`ÊòtkbüšðšØÇûd)»¨»[rþxÎRXÆ€Ûü.¤¨š[±]E'w:¿ÿÐÁøž¦ t4 Œâ¯¢ÜH€6®`YHlAQÅX×$Eèu@PöÏ;®WB—9k"Ïx´,°5)–"‹ zDÂÑÍZÓ‡õ®{:š×|¼Þ~ÿþ.‡±W²Œ7³H™áýŽƒŽ8Ñ„iÓ¢ø@d­¿$#²oâáÙe¸z Ô‰EBªÞ¶I¦ Ñ•ßο“MTfHci;Lz·ÊfÆÒ”) ‘[•Š…¸¦wJ2==.Øba¤*ä’(|JÓH â‚å¥8E@\ò°tBH¯Q0q ð’QxÙ • i¾¼Ù‹ñcóSÞÕØ¡á½TpMÓ /€NPö㨉þÕºzlÐ{ÏKŽ`TI>÷i†k`•c„ !ð”¯cÛ­¡Réx1Bhì{¤ú¤IÓ¸IO¤‹õ&™ÈEKF,·"9 %çH͸|¶+Ÿ*‚O@E^hTŸ–·WgЬË7úzS™Žî”+м­·Í’Zÿ.Ù,Óö‡ÖëÛåâѯ•4=‚ÃZ.:ÄòR †ÐFQÙÃf¤‹¬! íM $3”ê¿läø‡3sGȪÚñlr"wµ\ øàÈá¦äQ諾A®„T’–ã,—g¡èx;#¬óO7êfru©…ŠÒêÎÿ˜»çs”Fµ8AÿêüÝW邞,÷)^°$4Y®|üFxÅVtR&Ç…-ÙÞXÖân ûû L{Á „Uå?¥㮠¤ž?"Cö´•ž6÷ÛÂýä.mÀ2jðö Ùçzd‘f"½"í5t0wHÊç èŒf ÃÚ¥‹Õ6Ž5O‚±F™w5ß=¥®AäIQ'W¬ÉˆË­;¤¢Ëê‡uã„À’Ãj@‰¼Ž)9;l7]ç‰ypÕŠöIÐô³P¡–¿qÈ@ñÀcäšX7öBÇ5 ƒó&·1vMÙ,+ëÏžün—#Ù£Ûmi@Ö’Ð'¦¿fÝ=óÙLB‡õ¿3µ‘ºÏ¹Âr7Ü@D ¶É«QŠ«Ñ´¥A·”i$nQw€µ˜ß mÙ(ˆm7æ%¦«¿%cßFîþðí/y’¨KMFæœÅTÀÂY®Y³À ûÒ˜cò3é(Ü´¾…ζ€è•+3½Æ6PŒ™þôEÒ0¿\,.¤Zêòr›uÖÿQ³¦Ã˜£%É…MÖêe†ïŒÅè—¾xß;®BäÓP ©–ãf)Óuè¯~ÓDû¥ZX`›¿låmç‹dû\çŽÉûbqìçÍ|¿â¼ˆÃ{Œ¥øz \rU9Ö„©£¾Â³âG欮\ʇY9pLÒÁÆG Í'Ÿº‹°’Üdåˆ1“Aƒz §gÌqÜ÷Þ³FÈÒŽ1žL«8Â;­ä°ÌKù”‹ËgâŒ÷bªz=#Ö[¼‚‡}ft«Ÿè©›?#%ýOˆÂß?Ö&l²žè"8Ö{×]ØaÛ?àE'C«÷•­ÍXß”¼ã.vy»Å¿a,ÜfÛöŒCì(ú2§8Ý™÷:ÿsóúÛB®¬‚õëeÙVˆº|…@¨N‘:’)r«úä’é4þûšùzÚÔ@’T>ÆA¿¦øá÷ Å¹ &LQ@Î_î7Í FÎÌTàõ{Þäû5€<¸˜Ç m½]¡({Ú3BÍó¯Æ@è•z±q5Í0¼}S¾‚ŸKÁ˜%wø¥‚à6NgêÕGeí#H!»¯!6òz0a™ÓThzts~âìißZµãĉ Û6&Éäý5î J` ¤³Ž™SR®œ–ÜO}ìCïdæ.ô…4KÞZÉÆPÛ‰MÛs¨É(]"LDBí:äZä!V(ç‡h©z½Ë7’ê,rÕ\¢:pï¹ ûÖð‡£é‚l[I‹}PúøàÄaÍ-_k‚gžj#iÌ» HÓzíß–ŠOÄ÷&Ö‹¢ÝÎ[Á‡rRlù³uún¹€Îq|öñâ–ÿz ï¶v(ÿ-1Ö,ñÔb½"[ÅÜF˜üÑþk)]`Œç¿=ú„¼Å íjV½,t[Ó©¬Và8é³ùQ$\‚ÑX&WÚv-ع³„H3 µ8ä:¨í8jCžåu¿ia SVáò‡. ™;^™Æ\Fµ¾¯ÛÍŠfÏ^ñÀß—„Έ€µVóYMêëÆ/ €àwx'N•>šßÕ‚ŸÌ^a1:#—gàr|õ´A©—Â:Û€w­·½$êÔ …0è`a! %@Èd˜4M™ÚŠÐ¯¸‡¥böƘ{!s;u§]ŠÖÙÀÓFøPÜ\A_ÇD¥º¶ñÛpþ“]]À–Þ;“ü„º.lìŸH r‡Èl܈»=`Q»¡ž¶ ¶ïU˜{ä¼VvåÁ¢P­Þ]ê·”4=ù;„»>Ó}GàÑÐ)Þ?Ü% c0uÁ¯ÜÅúÿ9ž`%jQÃߊ¸÷ãý ì .pjâäjnÁ‚èÏš4¿ÆœÔš¥”[¤¨ÍÍð1Š8. Ñ(u)VsûuúôYgÄl€X0»`b¿ü­ÝžOr’ã>UÕzõ~ò5RýÁíPÔ ;¸ò¯~û{ÇÇæƒ r~&)ž…¯l…¦Ê«\Ü‚‚”ïædô_õŒä⇮SÔ9I Ö‘rÖ8›õïéÈ Ç㯯ó»XA´Ê1ž® Í`­lûS‰‚ …ÈÃê•™_—.ɳÉ^Âç`ëÒÇ[2LgÝæÃ¦ß R˜Û¤f-};¿Ô’rF"zãö ]]íªà‰ökžƒÞô—T{³GYÿcc¿A" U8 ȉüÅ÷‹3TÜØId¾³½ lžÌºl+Ý­RŸU3}ÆvuñÜ¥W«âC4ÐŒ ,~/ \ ­×»q½éç69ºg¦,¨¯ÍÔÜà,Ù&ŒÈçZúö«ÛœÝrI7t·¼_iw×AŽªŒIÒãâNFÒ¨?£+ƒýc·*Ï""&Å:ÜØ29­%£nÛò)%Ž Ž 5A¬ kØÞã<‚î%Òä£/²Ÿ´"Ã#žÑqÉp“á®ãB)…V"̌ҟíHOŒ™./­6{àWÿÝŒrnaiÖ¬sݨ'ÑhW‚‰qîÏõ¾ƒ gŸH7aòKmµ–eÀìQêëãåNÄ ‚æ¸ywO°‡ñ䀂_Á÷áÛ¡¿‚e'¿®R‘„(üüÔ6F΃òu6ð¿óN-ÚeÇ^«ý Œ yö‚wÏ¡okdãÞ=\Q…óW«zô ÉÕ= Ø”Cqš‹_‡sÙ`†h§Äö½Š5¦Zo›bH}ô!ðh¦ ¢ x¿ÙM)ïÙ”³èM ®Y?„«&àL/iY‹º‰Úú³ñ»7¢g >Í,¡÷ÓŽtiU ¤snéÈ%"óÁW´Ue—6F|?–š8J&a3gý°àùî »†£2˜AD©é5ìØúݳÏCã÷­^»&ïëÃÎaFlæ±G}X ¾½ˆëcù"ô´„;]­íïΜ”=x…CqB}dû/‡âàâ/C~‡wh!?ß«enðp¤ó©ðó>u$‘›‘H¢½°rJËNFœ^Q_EàXç !¡ÂÜEp”!ÝÀ½Œ?LŒHÎQ¶ߤ4A~kÝu)Èi‡,¿ßÇÖ_ˆ¤G+NÜh=Ûâ†M7èÌtû”_h¯¦|’C9ò=¸!³•@Ÿ©•ûÃÿ•$’Ë·\wüõGh¡Ã`k±ÿ—]ìôëÈ¯Šš"‘·nŽB?r¸ý ð÷¥&}$†EÄ7rvE³ w*ÄOÓ¤2Ò¶¸d+å¡âßÐsiß&\}¨¿H2ûX•úXÆjÔ¹%%¤„M}ñ[*zL·n‹´Š¶=¸_zHÞ¯~ ‡Ëíc¥YâÅ$ÌTõ• £Ô'ž:Á&hâmç¡ÞSÍÜOI„ÞžpxD>}|ä:5éì)«-™3̉¶µ˜H‚E´átavÕ¯WGCzGIéˆL¹¡$%(à¹\ÙŽ×â“nä´iã¹0¥Õ«'Áµþ0 õÄ;Þ—6o*”‡!p;„ý,>pN;ÖÝAA€üíÝÙU˜d:›eÍ‹ÇAAÆØÚŽpÝ›ÂÅ)ƱêAß‹B¥0ºÍ»Ì¨ò+Tõׇ& ‰Éf7gž¨ c• ¶vXn[A…+±\¼_*þþm|kŽF€P~Cm‘â`ê­Ÿ]sÎK’ŒæËößÅtoVê ¶@`Z~nò1ôªU˜ª'GNlʃŽ#6Õw§äÃÎ4 ýôêªè‡AÓOÆ»‰¾î˜Á¡‘©57ŸFÃÙuâBø\Q~GªiQ´Ù³ßŸ"ÃW .Êý’<¦#BÁ6í>î,þŒÈœVñMq“½â{ùXtÃ$y‰³~¶SZ‹‰M›Û? 8 +èiZô¸X­U+õ¨Ù;è…+Ë;tíÓÄ74÷ëj˜b3èwiR ß³$ûGÍÇäYÛé'±4qtŠûsXÓEû°—&eØ×ÏõÈ÷*M·–E&^ .°ù핸wø wUßÍE©áAãŸzäÔ&±Ü#£ŸŽA^Ùv@ñ²Œ:¥Žžîýzb\¶°/7ÂWBðzëš8º:…, >ê÷Œ ?‡>¶ôi}îqÝüMê•P<gΑä£ÿ*[6 f7}aB~Urÿ£š›l“ȱ¨Œ Á÷ð>H·B‘Y IÄûâ(ÿßRûùµZ¤+§0K³‡O.5ËA¼£ß F‹O˜M4­šH‰7RÌÉÑð.ò¥‚¨}–½5hNÆ-¬rwO(a°ÿ6_-}ãĩè{: h0Sf2݆2é»ÜFÝ¥‡,ê0Æ1¥ðH!"xXžŠÝ³1ñw ˆ¸Y§ñÀJþ¢%¿J͘°dÑ:}‹æ²«ödSÌ›(‚TçÞûf5±{ú'÷¤÷˜$X2®YäEõ+·J`«   ÚèÕµ øh<)w¡—_®c¡”*ÕfF‰:¬'J|J #ŠÃ›™W:?Âx\©çSP{—š¡+fïm÷–êcšIšAĵœïµ®\&Ÿˆ{!ñ“;íS!ÛáH–gõ#˜üàF$§8ã$¨Lñë( Ž*»Æêœy*VBò.I”¥ï ŸÜ÷Je}¾I> ôÿ4{ /)©OCœMÉûý‡ Ç9iJOB¾rËOÇôÙÆ*Ã^6œÕ©Ã¥¤¢¢›21ÔÇD‹¼Ñvfç¨!ÎXE$WËr¥ä±µøe–‰Eúªò] 9–s€wÊÅì· ÅÂîZN£qÈd ¢hs?Ø_==܇kAU†S’¥øÊýÕ~ð³™nŽÈg›mðéb°‚Ô7›Þ² ÆwVQÙ ×½c g’7™ÙÃ÷iœÂ]]›‚ûÀAOT]òPŸø é&ƒ½02.U_þãù’jIˆzN+y¢RþW%„וU)hÖ.Ó/E{ø½šášgÝÑØÿ.¶¼DöÄ¿¢+Z “ÉröZ8áæùòr~”ðÕRû$µãJÆëh½šÌЧáÙÊÆ¤å&m¹ÝVêßl$Tç†ùöHß¹e- ³‚O!ÖVûÒvæ°†‚È—ý´~ð„"|w§FDbŒƒœ /¤hþäkùv°ó®¤rÖª “t¢Õ‚VMe£ é;¥G=b´ƒ)9К²ê$9š€úæ¶ÔÑnjպ¬/¬A\'3]o¾œíÐPÜ_ä¤[´F¹Ê<Õ;å¢êîÏ’4PŽfoŸêϸ}R©`ìa Cx¡à'½`ç1¬Kn+1Σ¸BÈrš±mÝ¢Ö§+$E9@Vr³¦Ž0ÉÄ!†’‘z#¯W¥Q£žÄq6ñMpxŠõ§Ž[„3,{þE :H66ù˜ñ }µ¬}¥à-®Q©G¹åbÈ™"ák4¢j Xýï¹7k’õ`–‰*~4¡Msâ)U6>0æG’í½Ï] ]ˆIѵ§è–OÚlž³ëXbr–ètÌ:}-»ÏÅ@Æðüµ[šN+½¶éûozÍdBY±VW²½™ðÏj]ž0rU·•û·I¿m¬xõÎ\×ýyÓ·àó¯L °UüÑC^irþZßîæþOÞ'çRMCªeöy¿Ò_†9_ü^ETƒE[Õ¸çÎGêñŸ0 —ù°@:Æ©žO½ž„HUFë)g™s ‚‡Mð,ÆÄ(¤ô0 Çÿ;Š f•î` n¾£x4éÛ·‚AæƒÂÙ+áÏÑEEM*~` ;–Fåø'–Zã‘oý¦Ìb²ŒMØÀ¼÷imÝ‚EÔù‹ƪ¸J‰%Hx>^JòN$(m<(blXš€,APQò¼Ûݨy¿‘xúß/b™4ª”-}¯¿ØQσò'ó•%ÞE|ŒZwÕkyÜ*¢»x½ŽZƒ,QkÿóåŹõDò ˆ>Ê)€ì.úT¹´„'0<2ž1 ?¼,¡›, ¤D'ï*ý¡ÕV…mÐ’Hˆ=¸±` *ôU"z$Ã#þ(ø^'PSî`¢[vÇáÕÆ$‹„Î=Ñ mÈX9m­íS!ÃÙg£á@ñ£³ßuÈE¾ÑÙÔ¸Ïl¼VPófb~-Û*¿®Dd(þoû@UÿønËJíMÛØ+ĺ-M8›éÍš¿­›bŒ#£Ü§Õ"v—øêOæm/à„àË´ùT‘½ø«ÊQ`{"#Oâ€ö††ÈÓ/<ÝÐÖ4!ÇÇ Wlý±Fxx  ^SXû;ˆmkƒóûkûRTÔäs¥›÷£ìÏœgDƒ• Üßçþ%( W¼ËRA¥T W¸E›tÈZ²ß¯Ëã— ØnâêÓ‹ý-–ÛXäÕD ·;SHSaÝXÁ>ñq|)Þ@ˆ6Nâ'ö95cÚçÏ£~ÆÒÀþv9 MÔf×BÂ÷ùïÓ /ÞMðWIïäJ¿WNI²çH€ÌŒƒ>À,±úì ”š{¯˜lñÌž¼UìþÆ1¡RŒ$gc€õð'Îà(”a[§ÙÛhÓ0ÄTÿ.©pqS¸ŒÛÞ@…ߺ•nG9( «î5‚$ÊnšçˆÝ1M NÎ:ÓÄÈEˆ;~0eòXmBã_×„Þ AMF'›ÔÔ‹*¹NÝ k޶ãÅa)Ó<ÝÔÔ€‚h•š§©›^ФÈ| ¹ëщæ2ÛVŸEQë?ŒCn—€«Ü•&q I¾¶¸1ï+>±„¦¾]s:àk‘ý2¡æÖ äç<|„<>7ØqÂï ŒOÈ^G&¢HÇ{êŠ#´-Òã,ÌÃRD1—X„í_#ލ.ˆe\ê™@\†Œ Àý¯ÝÔ -ºaÞ ”‡ï¡äÌ“Wµ=“Yî´"¢&Âeòä&GIc6#Ú…³+QcüA"§É@‚ŒUë¥=4d¦Ø% ‚ÄCUÇûõ 9s¼sZ·©ãžÌ“¤ºÿwÃ@oXeÎCB~ë« ß³ŒÆ)u.Öm$ý÷U)·9lûúÿšë«ZðÚÒ~÷*‰!‚ú_…ĵƒÝ…æ׎nþ L~x‚!ïÎ#EÃöX§‡ )éÆ+³Ø3©H¤Bž¨B‡ÕÔ5øPõ^%®b¸R„Ü4¥@ûN k®ÑWÓ.«•_ÛËðp©GlôyI•µ[îg' î(:z‚ü÷»w$Ð¥bŠç8ôQ¡5.RM Bo¹’ó‹<¾-_ñ@ýÄ—Ó.¬ „‰99ÕÁ¥Kd´ÀZœÿá7‘Èð—1Iàóq˜–]³#ñ Šö•‰AíùÔÃì¤uÀ“?a¾õŽÖâ‡þ¹kKPwQêϱ„Z÷ Fm}ÕÊFO’`•&‘I±Ø›Ã0 fŸP 0£A·Û.ùù;%{‡A,‰bsܱŸ/lh|`z©Qä­Õ)NÚ’“†nôÂBL‰Qï’þ!Q¨;7ÉVÆì³—œØ#wÝʬ¶ø´˜b8T‡Í&CÖ»ãso†ªP ?î I…ޕĆ÷†±“Ç#ÑŠëõE4‹nTÍ9©‹.ÅAP¯)*àØ§î*V î1QÎçæîùÄG’3¶±„fuq˜á9”áÁ“YŽ~Ïf‘ÿ!ê¦ì#v°R38SÛç(ý=ìì{O Uç…*eª ¶ÕBE{fY8¨ÔZ°†ûZ»ÐçY‹ÆYÝ&6(bö®-ù¡W6Ї¦õÑÿ‘Ô„ÊÀЙFíÀãoåÉÚÕ›[ÈR?Hƒ´^ŸŸ;2Ù+ë{H.ªdtož]§Î­{#»7.û„xK‹æaŸhá…YájØH‹}؈¢1Ý;Œð˜G´m[7D-1pé%;ôf5(‘¡vFÂë£ }^ò2Û §±Î'L(x#¸`Àou–ØÝîÊf@ÝüörÉeÑ™¨gËäꘕHQj.M¥.T G*³94ÇÊp\õ3àI¹ +‹kÙ¹Fïjs¤‘[Mdñ¤±æ40C§™#è@¼WØ8ô¼y‚w ›ç‹¸ˆÜ-á9€g±ˆÞ.k,Yý"¥€,ÞDtt÷'–ª†€¹Œ³,e5…nå,zd‰ÿˆv²-˜Îù2*Œ°(±V åev“lÕwÓ†­Ø{Vb×1IWZ4{ü›Í–öF)äÀÅÏ›aRMz{âkIˆì¼Ád)à a|¯ˆÎ)²›,JܤÁZœ(eB¥>u>ÀèˆkÁv÷¬) ¦läÍê´k"ßÉØêÃ!&I–¯Üq(ë2ýHyË{·¸ï·Ã³¼¥Í‚õ"u:uÛõ©Qù‹zÞ±ÛS$”~$KsgJ­²9pwY¨WÇ¡*°”}+‰ðP!;†WyÁ¤<>±Ù…Òª<—ßa§pŸÔ‡s˜–Ì‘Õfôíà´š§¥ñ;“I}É™­qÖËr{Ø!Xe?O*é$Ò‹xñ¡‘œ‰UÍ˲nçXÙ®‚|ökCˆÕåu[ä{ 3›¥âPx+ÓZIÃñK›]*Ú\G¨wúG {݈”o6ÕëÁÓ`ú/[9O‘édÖ–òM솰¡à{ot¼ÓìÄq|‚Ä G34 &÷àØð[(~ Ñ#T ÀñZg|ëMdD A3òqª·m5$„p÷ŽÐ“w÷'Ï»!g[~á§>'I©|t™ÏØ‹¥v‚&bçÄ_ŽÀÕ"È奇<ò°êùÛo[ã3éÚmÊöÛh(b“¦“)v½²H9t¬+ ƒÇHÀ•ïílózIPƒlVk€ö6¼7‰oòÞøNôŽõÚó%+³ŽYiرP¬W—í¶­˜ë Srß»ï~Ú¶n¡M(Vs÷4aÆÍªÖ ŠáË+·U—€n¦dŠ:T&±Ù{ŠçéHämØÝF:°û?—ËM ênŸâ|awë{ã¥9Ä£J°WT+ð´úúç0Æc])tÿkÉ$º/ÖÛ‘ìךŸÆ$ÌSLlwV¶qpÒ@ÅVÑ ‡Puàダ…È¡ïnÓÈÞ¡Y¸Z+ŽÏ³Iër,¬Âi9¹ûÅP3•mdM˜xF#rdN$FÚôàVšíað§35¼IFwå>ÝT»SHåÊÙWýADJMqd’\=œ°æSÌf‘Ýù´­y<—ݼ´/#礷—hÃî£Ï©¤z÷îþkË©¼r-)eùˆÂ CxÖÈîÊö†A'¢5¯dt²Îc¯g¾ÉÕaÞ(Yܲ:;½èMr5/›,ð87”ºý©ï…ø7~«±YÖa`eý•)¢8—Y¡²¤bÖõõë›ïˆBnP°‰Nø; °º¨„öi $ý3šCø—ì)Ö¼#[(«^¬¾]^èíxJ/‰‘OrfZ0©“AÊ•cl-lpÀW™RªW:­„ònC¶äQò6U+÷“ç Ž*}#WéÃ\D\à³æ$"iâ7/”ÇÿÑkKÞñÕF òQæV£“„øÄvͺ(ªÃ6Ž+É×ÿÖ +D@磖$¿ÐmW㛊M-eäø^‡‘PDµÕô˜í,Àg±o×ýÙi®GcU¢š@†5Z$´œ6R¢"äí²WÕ0²Èã·²a*†ÌÂHkî¢7pÉA4ÂÈʸ~ ¹lÊh|Ïs­C]Ïˆßæ2çAD⡜óT¼cƒ*ÎdÔ×;€–‚9åãB>îò­éLÄv‡Hõ’Îëáö‚ÄFî=m$X ¿{#jÄš½(_ ñbÁMò´ÿz¾!ê ´R¾úa‚Ýó/·r'[ƒÿ/¯–ø¦TòüÅ(¤-Ág>‘ঢJÁ¥aΩ‘Á|òaíæHK¼¾_—žö€ZÁ’ÑLÙе.ÑãHi¼”MÔØVõ~=åe §‹Å ú¬ÆïСf†A¯ÜAJÄuxñqÞOµv˜!žŸÎ¹ËÁ½ãºu¢Ü|ý_ÿþóR™¶¥9ê[02ÃÓ”Ÿ~7 ú­4ðÐmU©æTôq±SH¹¾éð›ün»L´HIò¬¼†þóØBÞ´+~(ût  ¸š]Ü ÚO@ÍSÜŠnµËWšul zü³/Þ¹Ž@êP%]9E¿ægÆ4E³/ º¢"»>ê;zËIÁ@r…bCîÕEû`*»ÔÁk.ñø<ó¤'ÂhaŒ‹n'Ub˜I徆¥uv˜ˆsu¸ò%ƒ2„늪[á4– Õ‹éE2ýàëÀþ¶‘_<_Çq% Q•—[¡ßÕ%îºÿìã=ƒ cþÿíÕ-©DÑ1²·Õ<ÞäØd’W¨ £“Hí9ÈnN5éQ£ì ÑÿI•§Rªw:9£}¹Ðø¨TêËçàÂÓ èþuyUÓ>êæþ%R‹emÞåÜXHñ{0bÔI˜  uX ¹›mŽLßÕg}k‰Ž5vNõ»r\4q$VÛôŒveœÜ“´ƒèÜ—Ÿ ï§S±#çÄÅ” ]#×ç6;ʼn§ Ë–wl@87ç; Ôw JðSpTmÔûI./ú—+ q¡hÓOä,x‡ªIjiD§…‚¥aûWø‹U,ûÚé'p´Ö ÒF(²ïwô+Žf(³]ß$€ß¾î†•-ÿût¿†{m²Ö&þÿø>4A†;rý@8¥Q ÜÅ鸈ýC†íƒpKªl†S̵r[›!šˆX!%3á9 ˆŠúe­eЙâÏßùc˜4!]p-ïKÏù ñ‡éµ%C7äiÄâÄR~C…ÓŠ‡$Ìü¿Œ¢›j-Šo²fJBβá ]Ȼà â‹j€âûpBð²ŸÇYI—þâp Ú.ŽÖ„ij*ŒGØè­HöwÈ·òúòœ¤i=È,ÅÍ:ÊÛ3 Ø­@ޏÈZŠâqÍ8œk­|´ÎtSfõS«í‘ÕYƒ(65_O.Í?¾>Oú²P_ƒËBé˜z7,ž@ØzfjOfåéÂÅ»± ©H¿ØÁN ùåy÷ÑÚ|§n–þ¹s39>“’ª»@ë]ïØ`ïBîb?›äDI-7Õ{®~‹ïþILû(ÔÎÍ£ñqÙµë¶8Å×A›ÔH"¤Û —Ýcèæ«5•Š× aœÁ§Ë†¡Ob. /XoP±C6xÀ7µ‹r$ªÌ ³Y Ix.ÁÅhMÜíô]#ˆ)8-{ª„½…Í·ÁiM¨tÿNÈZzÑ+ž:ÿåthËÅÉ%€£Â þ)ÅB†™ïè59~™ã4Õ;WW’«4쇟M}€õû°æ"´i]Å:3ÐøÝü= Þ fÔˆµ$ô3ûmÄeP›tžÀPJiêqºn7ÚhÁüZ€‘â¶«qç<ëËû¬êgÀ4>}bè0²ßËr€W$ØT:•ý˜Ì]cà¦úÿBcbÄËØ­0÷£UÓm/¼ëÖ…ØvìÎäX"È\²^ÆGc¦¥K#Ô±î5 þÑôßdë w×㎆ÙôÎH±y`EÓµ¢²ô[i.šÓàíx'h÷®h` ©¦þ•-a½´‹‹ÿcñŒl3 ›¯}Ç;Ïž6-?5 ¶ÿ=¥­(Ày-InïýEù}8_¦_úJk#ÍGX³lôµ™ï7GºÀ?º®é`ÝjÍjôôÃKÍãwoÌL#[»¬4÷ùê4í¡Âœ¨žu.ò£LÅò/lñ³ž*ÍÎUé†7™ÞÝúnZ†âGF˨?.¹/§7nÞÍŒÂ/5k/cçtŸŒvpÆnö0G ªÆÔN¹kR.³“œÚaX`{Õß_£ß Åné¤JòžŠÛ=[(Еۜˆ¯®9o BeÌÎÑK`õdäŠýø5Ÿ%^¥÷¯Ôö è2\0›ËnŠwÂ÷†Ù»Š#'›v—ŽÄçø7ŽA8 ì Õ­_г-.¼ŸDú4W-†#Å)ï`NY9ŸZ"$ù-¶Uµ¾W}Ùtg(k]ËH’Éû˜orHhÍ5YwOpv´*ò¸¹ùC*®õ­ hŽ;Xë@là ÷ofu,k×.t複6«úù(2e+³”Øïî*ÙH´’{ ÿ–0 ¼Áq܆+û©´â<î8Œ1)c Ôü®ï* –BY‘Xÿá–4œÝ²Õ<¯8éB€z«ÿä“GU­?üOÿÚO•–zFxÓøø]úk2Öi¹¤[âJÜ;Ç„ZÖ=¯¨ð´š¾`´Ô9÷ˆ“3®:P¤E„ƒ&ÌAXt”ë”FE&ÂaŸ•§¥jVðñ£êóÝL:ˆìiVÿ¬¿]±¬šÎPéì6ÇˆŽ­Ó¥•s;]PóœÓn’{I3¯wskr¶ÿF”2‰ @%àÉwrJpÏõZ8Ì<æ¯=­¾6XÞåŒþ–ÙiœòïR›&ÔÌÕ7.Cűð—Ö¶Q‚Ý”‡kAºâ(­¹@E]W÷]­Tù©áY–YÀsèn1@P/ëÐðI”À£ó«ö?¨ˆWä*¨o€V.'dC¾Ëö»¿›Ôh)IŸ5­‚Ð7d785áþs®¼£õñ/'惢íõ—ïcR³rÝy»k3@cù@Ó[¸ŽÃg›ÅùMÆÅx×[+š®¦ê ™„ÚŠ’]ÜŒ¦-úˆ]?åà ìѲT{€eòd?;:)לü7žæ?$iQfê—šŽ]F[Ù?}9DF¸ËÌp¹Žôel9Ù"á"¶?2í(ižØ{Xºf"äÅS†œ»YQ _gíTÆE‰óýi'ÂÂÜhøèÓxÄ—œ–!Ÿ38v²™|AL}(ký¾íÛ´nô³ˆŸ¿¯¢-½PŽ ï¥ÐV¹Éx¦Ýõ!zú åU!ëSù;—Ä(DN_Þ;¡ñO¥,‚‡?æ¼öŠD9‡DœÁ£ÂÞ˜òkÑ´ L*…Ë„P×|e¿'¸ÎDÂ8©\ÀwkGg™G/¯ò–Ù -\•ÿì‹i–®pÕQÐÑ£âQ×Å?Ô"‡ûeM‚s/fÈtò$K·ßUã™âÚ)²y‘‚ÈR ?LvöZ ì0Àw¾ÌE<#´¤°<ŽûÌöÿ׌°j|I so‡8­«o‚ËLåþ®N´[´Ü‹E¬ÉZ>ø¹9 ˆ/xÙ?jÜ4°”Kò;ͬ*Ä=«æúZÈ÷Kzw}á2 !«QÅ}Hé„ö‰Ö£¯×á_7Džß› ŸÑ$m ¥án‚š~ÃðþsÏMÞWÊw€0‰®hÉ‹«R›åˆwÙ%JfqHi‚ì­ßOü¶SC»8ÁwÎŒÇP}Çq^Þ"Ì缺jܾþ»˜õ§…&:QŒ g“²Å}oÕù˜.p(¥ô\ˆ’¼XÐHZ)@ŠG·°ŠêHnJ×Zލø\Vý·9¤>&ù›[E·^`%¦—ÌuÔBýÇÍæBÄz?gÚÓEx -œðÛFä_ÌxªÿêÀiá"¾í. ‹ÉAoµ¥Åz¸O›8šÆ}èŠj«;â$!)Ð*uê L,F¶½ÃŸn ías8á}PECb4ãI³õWòyYB†V5¯ØÜj›ñ‰vt]H©md ]¯0@ª•p䃄±UÞJJ&ùlRµÑ5“*õoÒ6‰žŒÍ¦ã÷dFd ÍQf­#ú#ûž.©Ë“Êecò‡y¨5êu/〳 èn±Ãy'ˆ7ípß=¼‚Nþ|×û²åÞÌŸ³¡3Ó²Q'Œîg+±À¯ ‰†œ¦ hau¯ÚWæÛ¸5¢5¸ÊÉÞ{AU­çÛ»B%c­M’€Uïß|ÝrCÏšî¼W·›:±^ó)6‹iëÌXj¬i Œòg‘ÚsÀr4 Ú¼Áš/ß½$ðÇî,õtY|Lð2Åë}—Öl­¡u PS"YÖ‘_…6’~Š¡žœ™ÊWaq*Z6ùœ{#cNê¥Ì.ƒ›@ Ÿtð×¹v`~(S¥ZH¶ ¾ÙK´Å¥õàÓ^è'}[ÃØ/Î-¹^U*J2Öé³2iÚ!.>ê>›› 8MGÝnWŽïÞÉ‘`¸Èwd°ˆÄ-#Râ0¾ÊP·BáwŒRšWôb‘.†ív1 5k G¯æÙ» l ¤Œ-ÇÓ;4 `ÂfàË êÊP½¹pQøÞÓI*ý¹Da€cÜøãeëž5¿ô‹=ö¬`±H¢7YC*·-]ꓪvµ¹¼ß!×ø¾WË_Y…bêZbµ¡ñ÷/“Žäö¾­ãÏœpX˜ ô*Æ-Úä¯ÎLZ}%A8ŽˆÀ¤™£Øá¯Uï“ñA ?Ó2‚º¾*ÎÙ%ÿƒe#,ÀÞ¬ÀŒˆÜ­(Y.úY»·y¿‹Ø{®ºÈÛ¤(êèíubï©á‰_vè‰F8A;Ó¤ =²Ž±ˆúíæ¼%ª–àkq0?öÀÊjâ_—€›~nx«“æ‚ZÕZî]yR98B^Ïo]Ë ä)6™å/ÈY£+íôƒ’|Ÿ"âYe×\Q:F@ä¡â‚¾njǽì;Ë@D@Öҵ2§Ùsü7€óô<á×z ÝeŒ—DRéx® WAÓÎsFq zË©DRV›¹ûx"<[Q…„Ûìòž$ÍwÁ§ 8š@—ÝB° Wuú~¾±‚Wø1n]ú»ˆi*ÇÊʽnÄ‚$L L8¬0‚†zEºC ZœBgÝS'!àü¥˜ '1©ZÍÜ3éI‹µ îV7/M cf2ÄØöï›áLìÎðÙª:©†è€ÅíB ß÷w–&R¬‹§}CPÀ÷i¬ÆrÝ’Üs¦| iÐÏuÑøNCl´M¥:ôK÷õSŽ NÏ·ØáS®héAòiÆ´í-3oî-,Ü\Çô~žÐ‡W!¸Ðšù=­œý@ö«e7gÀÑÁ×AdÚºÎ:=å)í÷¯§„u~H¿ç¬°–·–HeaÂÅ””5ÚT5 ‚õä¨F÷¬È²2¥Ëˆ©9\=)ÛŽñåä^Z{½…ŠÒ:Ø`­"4ËFŒmRäüÏTËÈç%ÖÇKdt|žêc9üä@×?ƒÍ8>£)Eó¿YþmOÑÒG}1ø¢É$*Î׉¹¸(D—‰¾t±úbDMþ²Ú”­ˆ¼r+©Kµæ½åM_ Á bˆ°)í_TŸÂ˜ñM1 –™>†À’–vVÂGmfp66×N=‰„&•iâ XKWIr/>uIgëY2n×; QÓ¸DDù§a|f8 ^I”~Jù˜ò†f³ÒykëÌYY3ðJq&vFÅ/°?˜@ƒaëìÆ\úA˜û*’©3ÿº .w_ºdèèY.m‡Cžr<äÅ£[C™  /×¢•/²À«e€Â‰þ[â„»ñ!F<ïCN 6£Õ[:?ÛŸp+›qW*ÀBN >ÊW†¸µ}(r¸ê[±héqñÛÑ“#-1ÆîŠþƒµ˜25j¹Çmʱ ³é60üjòrû¹‰& WiÀ[ ߸ë&FéQ¶;”ãéŒX2®¼­ß]§~Dhbsê?FV–¹®·;â&\jìp\ѬšH¾^¦ÌÍëa{¾RÿØäcú\˜ÃITRP.2ó*ªs¦Ð÷wFgTvP,?}Óßjžòœ”“ºû»¼'ª*å‚¿—ÙÎI£[OeÔ:½0ÐyHåO8yÉ©$»Ú(P»*±ªc°úEòàL vv²Ó †ßÙ¾jtdj8I-iVè>·Úü¾…ÀUdXOTÂkÏ< øœo3xrq,QF zQ y¶a^àJ£Õ¿’_©/ù•qt,1ÖS×À f¤ -;›ß·«ñ}r¢2t¨l ”!ÀÁhÇhu›'£¬Þž#çþ¬€–ç-C8€>Ä´v²y çÈS,ß©kž‡òâuàc‹–`§9ýÓ’XÐÎz\;ÜÈ›]*ÆŠäVq­_¿9âZÔ„/C͸O3´Ölª"pÕÈy„?ùRJÖêœ7ëð~ó¼s€°†ÃÇR‘(8 (úMñz ÞcOŒhÃ6"IÛ ÒÕ/Æ•)}FZ˜q$†DʼnÈ^ü… ωšÿ)¡8½Öoà¿nÜzIB‡µÕLþyà™äHEHѶd–G& QvŸt;&OR¿¥ßÙ@Õ ]" T ý>Íõ˜òÉÜP1CÚ%ˆ­=šNÚI–~®°«q‡õ4´í5ÄRÜ[Ñåà˜tC‘í–•x^ï;&[na}ìüz¸³œÅI,ûd˜YA/)zS¼ž8µ®ÏøÆóøíå-(¯Œ®¸^ï„Uù10¦lr†§èÛÛ¸‹Tœøa+Õ:Ë”8ÞºsHr…D"Òàë,ضBÿ®xßÝ%Ú½&-¯ ñ¥¿x³‹ˆùéþð|{‘O¨Ÿ’2EÏñ0GP 0Q¥câ ¶‹ðšNÜŠÑõ~lÌKÅ{0 çßÔ@û¦\§ÇUÖίÏÝâË= =uŒÆ„L„êÙ{1ä=L›El±ð¿ d‘»}6|U ÎfÃŽ´Ë·­¼l!Ì63xõ%#ÿ.@–˘„ Ù)= ‹•RI»G… …Že~ÄÝ÷ƒê¿Ò.nîöòÉPØÓ2/üuƒ cð°}±*„Ÿömt¶b$“éÜMy ëð~\¶þ»b—§%Áˆ6r‹Ca­;­€ÕRJQ0k&2MÊÒïFhs EˆñVÖßêÕŒ'žôEèÖ×Gv÷â OÉܳ «°‡0RTM·&×–«5ú5dÈ5 ŸRÈ­}Ñ n-¤q„Ø'e0üVOùÖ£1{›&„¹((9ý{ïÌnhŠWxG·â¹»Di+À}oÁÌÕ6‚ûFÞSh” wÐ3¦t©°ý›õÿÍùUÝI£›Ö{²&Ä"¾©Ï‰Õ‹“”\½Ö¼­¹ª÷!f•Õór®o³ûêbÍ ÎõD¾œ/6o2"Ýú–Ѻ©i·˜›¬Íé’tÅ+ûÛŸ9åÐ(°i¯~;ƒbÚX5ù5ÿ¬ÜIju¨–X{âgüéΊDàkìï” N¼Pzð¥Å>¸ ɽÞaó’Ø!P![Ü\Ì@ÝVÀ£†Ê[¢ÕÜ„TÕßÅnæiífTñÍãTÎC§â$•jšŸÉõ$´=죺3wsUüãKy–}†uH溩¯H¬ü²K?6ñï>)'u<R+þ)7ß1÷Õ,!å ÏòüúÓ‹ŠàQ}(ïA‰CøvrŽ=Oo™¤pšN ÿåD‹kå+$y¨¨ø±WžYOÔ<„Óà‚Ê^£ï@j JX¨íËc=JýÕfã5jUÔæ_èúø×ô{ Í Õk˜1ñ W1æø»ÒÝðOÄš½òìkOIñ’ù, [ï>h¼Ü7*¡a€„ "ü¹±Ÿì ´f£p,ÉžÇÔ§fº²$ÝTa >÷ ÎsA‘Êïñ<2Ôéòp¨ÿ¡Ã‘÷0ˆÎ|<*²”ôSFóŽn¥A/‹ãdÂw·_7õ ´\K5“ f‡uº¾>EA¨~(~@ÂAÛ‰6¿™åQHZô_{R⡃ÉFH/°¦¯çí²²H¹ ®îfSvì×Â`SøM¤l~ÝS(‚ß{&><Ú"s •<Ú4H ú™q•ãœqˆnë:ÔÍg«D uÛFɈE¹îËY~5¢vµfzï©–€RZ^†¸_Õó¥ZÓ³ Wãö6Jò$èîÅ­V|jòÉò#ÙþöEKž9þ.œ!:Gcæ®8Òž\H!^YéÓ—ƒûæÁ/Ø–«Ó¦ºÿó`êFùb¿8û A»§e¶l0M~›Þ¿kÀ!ŸÍ>"Æâá|LA±oO"ýr>g„ñ+ÐMÒH(œÒ‹]•À0¬ç#ûœrF'Ò¸<«»Òe'‚-ýõw|?¾?êùâ‚«l9?éă$°N„±ouÝòçÎ`ò£`8h!™§Àlc Tº ­?…úfýÛ¹}úCÛDãHƒÙR1˜¹ó *¾s@ á;;‘b4aŠH‹›#‹,²Sq“Oê=ÃÍö -æåÍü÷ÝÄêž²§r‰ÂYÍ›f$ô¬ØÇ,¤¼¾ŸmÑrã×h`Y#:€Ñ%n|î$K;ȃ®m3Ý]Ò,¯¨7qÏýßÔkuÀzA¹ð3H4?Øä'Ò>é¨ÝLjV| ÙQ­ºN»É.B`Œ¢[ʧ븮ֹmÁaö*sL®üÜl\:²»|û[nšÈ™”åÍ,Q¾BÜOƬ+7S1J"z?x¡(ƒ ²Òk¼ÔØ [å«´î2=޳R£äè3€?ýü­Òæ2ÉÑÃöƒ3Õ* J5ѼO4Ú­ÁÜÙ¡dúŽïŸÚ6/1HMnÁå–Ý(·ŽòƒúÛoÈ:qžãÜ`è:5  èx‹-µ~VÅ ]ÑtkVLÞí×ß!7·í( XÝ_ð#­­b–Ë$“c%¼ó™¥Â¶;ñ4Égƒçr™ný’B£˜¼v=Â×DÄ”oäUભQS“JÝ’±†(n_V¾]Ñ©V›œŠü^¦¼‰È0«_:h|tM·?ø¦Bn ›k¾„ÇŸY ÚãöáRó0&t&q–_ÿáT) y;Ó¹9C_LRî¦ïÆ=ðì‡'ôîßr":ô\Ÿ~qcŠ4Ú5~@à C]3;é£à C¼–ü+ÕÓÎ#³ˆ³pˆgܦ®Ã;ÔO?-)c6 6Æ1(Ì`¿¿_ÞÏívG!=’¬FîätE;·i=†»ƒsµWÖ•œe'ØöMŸF|C4-hVQq€Ÿ~¸eÈ—½m~8M" -.Œ‹hìi%lE×xx³/˜Êˆ‹“4[¡×õK…‰œ„a< Ý>ô’‹ ‡R¾Ê¤p“Õö:½'ôŠØ%'.ÚˆÉÔŸ¦T8›ßî:›î[ÝÉØrc7õìêvd\=¸œj¤’Á,t£ŒR|§nò ¯ý)“q½§ŒU%·Èp//醇Xy‰dˆ.u$¯/†jU¬ÙO£ã«‰/úôÂü±´4åÏó,Ãý. Lù)[ƒ¤…{Â!æ-[ v½bÅiD_Aâ”ÅR%xÑí·Ù²ë“^‚žÎoRÛþ¬ý‘Žè‹Zæ¤vo£ÎÝ_Ù탺Ùlˆ̇tv…%çÓßLO]ò;,ZóÇéó¢ûåú`¯ò:Õ¯€ØV¯=ø°¥öSщŶٳgÁÎ3@‘ÂLUWµÒnJµ.ü¸‚[§u Éö(ëòßh÷G+ÿnPgýL›ÇÚý\°}(NòyÇ;÷Cñ“œq×EŒt)3kûÛ{¶à•ÕmDOãoCG#±÷ÿý†=Û¢V¬Cb[™\ùÇèK6sV2¦´{æÈg%²›ª/¡Áª’àuÍò¼O•Õ¾ó¯,k‚%=j×iAìËÉGö+(e€†W8  k©ùaQ²úYš^  1îÉ%õÎný&ÈÝUOÆFÌ2Àí¤¹XìvìfRvy¨¸Pìøs1óv(•ÚZqwÜóŒù†z±–ù“ÀÆPa†¡ÿï@1áIpU.=p}÷MÁÁüyô%MZ†;åõ3aR½¾c ¢2y¹ÕÉËɼSÜúI5„·8¥®BO|Õ#óq] qºMJðeQ¬e¹q8г@½Ð¬[Lâ¼Ög™®ÚìðÙ@#­@Æ9õróÿÿi2J%MYŸõ”¿ŠA"i …´6äW·“3P‰•QÓ6/­Ož·ò…” m êZ—þÓ–¼È>Ä#ý=§© ä£×÷œË¶Íù·Ü„fÍj)Йm?ëÍ2:l˜‰e„£‘­•%ü+4ô8À«=tlñÔ’ òL¤À“?4qÉ_०W|ÚHœ’«çÜÉsê<ÚX&P:Ž‚aï9ëê¶ †o?ÜÐ)` ÈØ(¨½A”’ýœÚì"Äž¨â!0–nÂl_£¡ò_4b߬ÔCô³š §F¿d…„õÒçˆo[Ymz û/Ddm~w(c!̬;¡™"UÇÿ¤G<}äé·©/²%Î|—V°íÝ'˜EÅR$ÕÄ1ËÚFÆÝð6¹¾IgAy@:ÌyàH?>$ò¢‚͵ËoøÞ•ÛКÁ‰“CŸ4*í¯.ê…ƒ"¹ÂoµàP+<€+oÑ›R¥f먎û†<œõ*~þ³9~cˆ W‡jÅ_¹mÌè N]!ò¡k»…kí·@.±É8ÌÏ©ÓjÞ•?WÃØ'›;fºZ ’—°ʧ&œzëFÔî\”Í$šbF^¶»õz#ºH hÁ7òr??Ú¥—VÊWIÏ”:MB0Øù´sœÛ~òô }ˆ0>ذ5ÛËü^ªp8Ñß¼*Æù4ÚŠçú²ÄߤÊüQÉ#Õmº¢­òíÕs“cÑ4´~âÜ{¿œ¨ËQ¿x-DçÓº * ½þ[’¾³òµÆ! 9_'ŠRÀ8¨‘ŒÆ ‘o°ŸHs¡-}ò\qT L"L|;s]ÉÎe…ܶ;ä÷ºY¢½ûû,ióÞ¼G¿ú1Qý$¹ë<£GH’ÀT'ˆùl2=¸âã5 <$ñsú¯½”Iéy¢o>h›Ò«­‹× ÒU<ûV©UF‡"A­³ýb^Ø£ @ ü¿¦’y:N¶2sËŸúpP‡à Ð6s…ÏË‚ÈÉî!”@ìÚåSþ$áš!ƒ±í±¶Z+WÅÊ9±0Ü­ Ÿˆn}o¶-;í_nà÷+Iÿ®ÀZNú¹vçç|È•N´›J2L Ö{Oˆvœ2óýˆ@Qôœ¡÷šµ2ýöˆGwQ6-ì-""»Â–ò….’|x6ÍÚˆ¬™8Ã[׸úœÌÍU+Ào•ä ô6A¬×äP¡Úþ6؉Eá·ºšS„3Î{eÆÊ•Ù¿Ù$€@ï+‡Iü¼#;ǶËÓ<޳J‘<‡½ä¨·±c©cÔ-ÛÒ'¯|SµíýòìòÓf£B ·ÏX VN*N?¡6Ön}œMn2·‘ìØZ~‘Ç5E^ªP?]5ÜeŸZGåÖ§äÄÍ uvxëkø8fd…ûìs̳)>êu~“—¾CÏ€ÑEM1ùH=q™¢“0 F°ÑxÕŸÚz´U…çòâIÐ’«ºÝ Ì¡ÁÅô`ê’£aAƒ0¢åIæ"n&Ñê_Ó[1´ŠMšBwix„ý´Æ&ÏJµòë×±— 3ꩾK¢#´¦W" ¬0¦Ííå<<–Có¦ß5ÔPô QÛgÆV“”ÈúZzhÔV¿[Fœ‡¬Œmvƒ:Î#‹¯FÓù9ÉLSQßQ†#°±6ÜHìsú(±µJyLžWÏbŒ¨Pˆ¡/“:Š2j­+åÍâK\ÄÇÿe×£Lur…ÓBiWmÅ»çÀuÚså»ÂéIÀÆ™à¹Ð§S*Tçìš ŽÅ»‚‰JSE3¥›%ØaÖ¤ªyÓÔ7.ü~[UÚ…,d0ϦýâÁtŠø†½åã0©Ÿ¡¼ jðt ðÒÒÖdœ¦åƒjýcü º°  ŒétìËt3¤¿ê¸¢-¡U¸ÚC¡Ðíàæ¡EßU:Êþ·m€+†ï SüdX–ìãìÌ–h:v…;î@kXb°Š}1‘ûS¶¨ò[¦T|" ÌJÄ;Îtv3çÇ5Äß*ÊØçÈÖÀå½hÉ,˜?o;eó•©±y|¦{žC(Þ‹x.‚y+d @Æ'L)Fý sÚ±ùS½í<ºe ðt‘ºQ)Êm\ŠÀçDö>ÿ/­¢!±ÿnpLÛ’™X­g%©š§úÉð>"B·ÒKµWôêÛƒzOs‹ ‡þ?³ÌoùIÊ o¦ZðŽx!ƒ*ÜÓu­âÇçó<³½¤vTS¢‚%ÒÔãÓÈ A+säõs¶y¾Ið^r¸¦!žÔˆ—èP}˜xfÁ‡ˆןÊ œÜŠ것4^"1!ðCnRÌ‚ú‹RU$LľnN©”¾ CÞÇSHkþ…\{Ô?ÆozhÀ¸]r´8šË"5jd4!nÓ©ÞÉ×fÊ]mCŒ!ó6 ßfs&¤ÂÍâÔúÜ–Nw¨óÆ…ã/­#‡ªùus„. }ÈJþuúâ<£´7xÆú'†Pœ~äÌ»ëÍ)€ 4жä.²YqÓ9à ðÑÊTÙÊõ² ¹ç¢Ü» cߥö\´…Pgb’š÷ÔÎ:œÃ‘"Þa–Coνò ^Û¬ X}bEF’”áøòîdÔ­²IuìÍ0Æ| ý°öýÂçìØÀvµ‹Š?QZ3¯{ì:C I­Ò!R§¢˜vóþX–>£ô}Tˆœ=–”}ß­‹Ô(?–z£QËYéÛÿÂÔa÷û„yRyfßGj‹ÏE¶¥EÈÚ § ÖiîZSãÚç‚1èÅÞZ»¡È+ç¤Ï¬oA-›£úƒ:2,—ä&Y²•6ç·+—÷P\Ú‚¹iâiŒßÆL%ëê>$æ¶~DJüd1x†—ìŸp9±eÕÔ†#F_ö›m)KàÒ±3W_D”mÉeç=ƒ*ê} ¬wKbt\áÌþ¢äÛešÊzßGÿ¼$´ßIZ$§[€Š¡ó ŽÍ§ÃŒHYÒΈYÉþ²žÔ£n.s7(nÇþù2ŠIK"Ñ—ˆMž>¶JX¦Ï„œÛ¬5`‚ˆ«D\Ð];½>z3.ïÖ ÓFùvÖ«ážÆ ´²þú­¦ÿÁÚD…ïUðIˆü˪~IÞ{Ä aáôŸ]èAÝÝ¢à׆}I–tÏÁ&F¥zć3fk=[Ûil˜ÄíFL-äw&·8Ez8s“PKÃá[xÉ>ʾ ‰·éÁÿi èô­þ.#¡ iŽŒh³¸ô~M”´Ó's‹H[Ï=n%}ý‘j4xÇ$aÛQ VÉb×Jøv¹°t,ÁG6çdµ]§ƒ4÷¸2£`‚åsþƒxbÁy¸n×ìØ]Ñ㇇“mw@t2ù"ÆÉH¬è‹.¨Áã^ÊŽS¼ÔàéÐ ?rl›`YAŸjVCÔñï¢wyƒ¤™ •'<˜ãLäçA=:5ÒâŒà ¾`þ¬Hà´¡v¥’ƒºÑáI&ù±&6Á­„vm·ŸA„Õ ÒýG2έªk¹±Ê-º¬†G¶JøõçBùš°Éé¿¿×kÓó¡ã¥†\"'-ÅöêxtóT'<¹`Œƒx~¼Ôˆ@œþ¡°ñNG‡Üö #Ùkýºñ.2¨BõñÿÖéãÓ îþYòø›ÓëíSýÁ›J7‡.T[–Ãk!4ÆíÖ['¹·¿]ݧ•[üw$Þ_û¥æùé]Ôúo||BßqOuÚæ ð·æ|ÒF6œZ‘,Œùs?FÜô×R,p÷‹ŒZ/nC´•‹“h Öâ¤bSY‚f?;4N1ØûÁÎXÿGWb×Ãí„Û]0y,_È> uÅ‘¢øñ h»tpw•pü›;Eú––P`Ñ:°”ùÓm  Ÿ¡ýÈ}ů©|äÙçðî8×S×`™SCQßCþé‡AØh,šm·B2rèpÐTlm³³–ÝîUIzLõý`0ÍØL‰’ói¸ÆT:-ì0¿ëÐ|e»UŒ{Ô]¾ ©YC-¡Ñ¯ ‰â­÷K+°­UãKˆÚs¥ƒb–7‰býÝ]Íæ;«ÄÅ»\³>׎KvçÃ*wLƒ×ç;ÿ®ŒGZ¥Bî®Û¢ûMzjø¾Ãàœå4µ'S‚0H!öŽRÕÌïîÀÉÎ\}D Ïýø4pq»¿„pÀó;'.JWÿ¤N­ æ½–½%aùëhÄ‘òöMó8ØÙ¸Îè—®½éÖ¿%,‹g4½ÐÆ1Ð&üW£œMèëy܇:ˆ^G±›õT½tïj©.ô}YÞ†·:i#®Ø\°'›>v}³ëÝ:.Œ/îBNÿÏ_ÒwSYt@˜»)üå]Šœ´U‘U`wJòDÚ4'§d‡;•—Aª 1U.q¥û®+ŸŠ{mz_.f³7ìRLR’cíÊ»v>]Ï”ÑðãƒàÐTê§[rhÿÓ$LΕWr…̆!Å)jûç,2ÁìH2*O¨hC&ýÑÇíý¯¤À߀Q3<Š7¨œ”Ëàᾜòo/†µš‚+vènä._#ÃÅ;c„=_¢°‹AÓ>ÖËë ï+|ÍŸ'6êuÃz$µ$‹˜Þ‹íËï\àÜ(ìæ¿…ˆôß`j«cÆPÞ!TªŠPî”÷›ôÃ,õ+“ôšÊý1Ç`g¬ @ÔéâeÙ¶¢Ï}íå k@5[ÕõðsËž3Ê)W”ÄZàµ]]:Ñ–Æãÿ‰”t²Llq‘›”d,ëb›£É=¼`Œî »_^•o#S`ôWÁ¤©íJ^€AÜsŸÁLК–¨''<;˜3ñêV‰#Åh‰ÿ‘$¶*Áõ l$Q?mIg³/ Nóù¨–[D~œè Ëñ'îö[Gþ6õ?í(:Z”ö ùÊ™YTH/^óy ¾`¸ÙÏ´nKõ0ò;×F`å’Ñ#’Ÿ†ÆÙªdGýCNHe×X7‹™A÷†qPn‡N³VZ¸°ˆ=AÉ8ó“áHPwç¡T€²Ñ‹‰vŠG³úMŽú²Ö©¦ITâ¹0Å D§Á[/™®•ÔÛ(¤áe‡0ÜäFG³(e\ËDùoUê++]3͸90ßÇd֘¤rOŸàX,èDòŵS+ÐŽ3¢ 't¿}öÛäŠw•cgÆ ­È‹J§»9Å tx Ö–:÷…„ó9úžiœþQñ×ÎUêbNkÙ8(¯1†/ûeZîqVº‰ˆ@lC–6ct I],a6·4µ}É6ý¹«ÚrˆösãÍfge-S=©Ð~<$²¶¦ŽŠbÓ™u—ØÞR£Æ©F÷rA”æ‚ _5!=,ÁÌ™C×]œÍjÁ9L[(õÐõ ½ùÀïT~Á Ä ÀÇ>ÑÄ š®^÷ï•æçoË\N"’Ò>8 Â{ÖÆq 4xÔ[ÇúuùÝGÔ½îFVÝ3mR-¼Áˆu@%7Û2(·šmÍ õT·IØ‹Àn€°Ñ€“’ÇÕryk›ÕàZÏP*U7Å‹ö9–PãîáÔ‰?úCjb¿£Io•ð=O·È½â|Èd2*dšw“µÌnî¾ÚBº+É,Om»¥"ËåÅ«°±eã1§¾ôŸñbÿnôçˆGúŸ!ïS^'¥G“æð”PRàš~Zùi+ϘÄÝ3Èc^Ww„)ÉLÎݰÒÊ߉“¹[/ƒE=ÂìCž:¥ªA(vii°ì¡ßÆUÛ¼ˆü@О”AÃ#ÃG)Q§õ‰£¿ŒW¢¯«_+öŸ± lú{ÛgDg‰ûC7óýfC‡ClïÒ|3 4f]Ì9´@mkçü† ñµ`&©JÿbP¹çmh.tYœ'éöΜ^a"K*$'5ÎäWÊ-:EÉ6Êî•¢ìU¦:º×ÿ`x…9*¼ÛÑÈ–°ëHp©ú= fäIßÊŸ;w1ÀdÞåDtHÅÏ:$}BoÂCà¥Pø¥èÇ–¾E?Z· ªúæï–¬úñ4N´2Êe/k.ÿAÇñ¨E±lâ¸;Á*&NžÐ»Žp]òd²Qa¨{êqj€,­†0GÒŠìu,sÝzÜž¦ìFÏJ–¡ >ý~ 0C‘œÁïh ©sQ“ЩëfG*7$!Vf«‡®µçb~Æ éélÛÝ‹@µ5›ùÔÛ¡§[“nUÒ%ËH¾¢>Qm î=íôäÅP¹/X·D›¼ÆÊí¼` · ¼vñï;ØØOï¯atIÎdãп4ã½zÖ††ÿÎa=!ÅÖĬòÁú@„Ó¢¶#1Ï q—ˆ®Ìð |A¿O›yKÇÐ~HÝœøQ³G¢Öœ†ª¿Dûr ÛŠˆïšÐ‘ž{Öÿ¢Ùø5w±·cxrÅ–¡ñ>ÈìØ„4kŒe[ ŒÁØ\ü™B—OÛœï)lÄÂ1EKdÇÌj¥Ùø.uâïɧ¿Ì}|¨èiÀL­ƒ—ÂDƒp½{¯uw“Jv) ½å_.¹ž{t±¯ó€—èéZBJ"hb{tØED¹?E#{ÐóëO÷WîWSr.üð¢C«È\d6>^’‚B%K¸¼1Z*ÞØHF,yݲ‘=5V|åüÐX¨fa${ÔN{¾Wn„+°èÈ:n p9iiA ×Nk6ö6×È7¶Ás©óç¾@pYÕ´—QÍF1ú Qc:ŒpU„)ýx{£%¿\«Ö¥æäÅëäÀà+è’Šö|FÍw¾¾azg¾ªÎ”ìrœÞݾ$—¥{9Goí»›¸¯^–}‹] × Ü´µÌåÔWÏ'ÊìέK>19ëfxKÓ7SFÚF±D ¤=u3=¿q™Ù)ô 4oƒs>ÒÚÒ®476àg·º¿J„Ñ[ëJâQ¤Æ-Ëy²·Oɯª »ÍW”æ]ñ¶!óxÞIH8[ªKte]¹+ÂðlñâÛͯgÇE•0–šÈIUįø[«Y¸Cv¾Œ½qYqú Z¹ËænaCÐ::‡)!Mñͨ¹I 3P“Œj¹rÐlƒM ÁÕ‡þ/ì3íÇ£å[…!sóÉb ¡º=Á©Ö³”D‹ÐR‡s]@ ÕµËi5t¯¯í'ÑŒ´äÒÇS;ÎÍêY¶íÚ*œV=ù°ä\U édo¦n¨ÕjÓêø'.3š]Ù²+ñΘG’}-·ÇúÚ•ë¦6ûFªaÝÔO,Pêû ¶™a?éSíº r?²¿L$“{qÂѧE‰Ðz @½S$®"°Èlæ ^wŠ¡K¢H@ðÒ>¡è”~– .ÕòYþÂa&)‹+^Étô[”aMƒé%Ì(F†ÑÂ'Õ'äw©¹Xán.'{±;þA3¶xê‘ͱ|ÚdeNèñØ)˜s©æ® ¹-¹ðªâd%%º€gÁ:ð-Àš[‚õ‚ =”߀Ĉ^„Šk$XT-çë:>·=ER¼F|\íËGcŽ‘zàIÊ£ŸT­t¶$#áî‘êØ‘Ä¯ôhyšÆä‹æ7ŠÐÖZÿòÖÑ—bÐn!I+4Á¤¯¦‘ÔÆ0?&Xq¥·'ùî>È ;yû‚£ÊcçÓ¤®€£ÿœ~ŠmTãN›3¦é®ç©ãªp\ÿÝ„ðâT.„A¢x ëËÂM_~`–Ø£Ï ZáuùŸYГ@¬­×1ÛsŒ²ŸÛ0í† b4ÛÚëï`´• ï„Ötšðyæ*'kl8£2hQåuΫ'¥0»U¾®ã!ìe߉>‡’_àIä³ÄF–ß.íæ5i=¤û?š^} Aƒzem;7ÞW^Ò¢œp§Kè+©áƒršÈ’Y¹d„ ö÷úè­rZß=¢¤(ÙÓ'aÞc~'†hTÏ]|¦[’b76=‹ S)ù$Mè”Ò• % !ÉM_¤Mª¦M“E ž=gSÌF,ø»€T,n9ß(?}Cõv{ýö‹¥3*"+œ\‰jL Y¹5ÒÐ7@}8ýÅÅÓx(é1Ñ™³^  ' >b/eµ>¶Ã^ƒŽG r])Ö2XfCBÇ»×Gxçu¤-¥§ÂÞî¶"d8ÆNœ¿dD¢B5g¬Ç¸ÜK&8ÃÆË–§9&< Wç+•wK<Ñ¡’_òØfZTÞLꦃªS‹ßþ¼Å¬ˆ¦â487 C Ú#‰LÛYwbÍÞGNˆì <ê YX-ieéEÃ×…bSh#rסmøqŸtƒ-!KÄ‹ñ‰l8p‰á1ÖÑÔ1X åO3•pðÊ8…ñ<™Ak.ãŽõw§@ù Ý­˜"d’uJªtO Ÿ‰Ž3)+Výo±ÁÕ­’Ô€&æÙ¥ ·H éG .åß73'ŽçÚ¹¢æL'^:Wä\Yû'2ÿ¿Hìa*Ý68¹7ZË?¨¡÷㎭«öÖ" ò±`J È£(6¯,#w Tsª‰ÒŠZiÜ¢pAkçs{ÂõÌ„Z$ØT‘¥ À4`K… ïnk#AðŒB )¸!zÝ#9¯R_]Ú#îóP ü©ë3®©VÎ>Ìòµzxm YÔxý‰ýÐÙ®ÃBW_/^ˆ¯EäÃG†"®Üùû"%*ý±Ã6„EÐg„ƒ®§ç&«ß†æþÛ8…+m‚º;S’ºÐsëå* h`ð¨‡h?9ˆ„ó8oÞÅc5¶8TB«?!ˆmÏfjZÀ£'㎒¾ù‹ƒrÇ耹 Ðnú^MDˆbà‚OéØ{hxÖ"f&ýp¥ 2;ö!f85>@…ð0\ÇWâàO¼D»ÑƒÓÒLÝhöwsÁÐaœRÌ™ÿ=GÉ9C„C¶J›O: ©¤úü÷ö. é£YyN¢}µnå™SÃdŽy ÇÞ Â„Lôã?¡¯‰þ…2¹’0bÕÝçØ• Ë+PàË“òÃ~VáhoC““Žc‚B“ "4™`œ2ìG$ CvìF.®%0¤@ +5õŒäéhµ™UóM¡Q·SÔD9¤K}åb!ƒšB‡çzÀ»@­aŽç”oЪ¾ª#ºù7Òò}/±Þ­ZPþÝ…¯G„Gè$T†’O(⇇jQÕ`· Þ~Ͳ59‡û¼Jœû‚l‡ªØýÛЛýàkµ’ë¼¢‡o¶]$äíbûœß¬NYFïø^Û©ò«\+„Ô<ñÄüˆPJ@B7œ `ús…iCy)“+±…@»¨µ N¿”H_×Î4d·gW»¥ ÁQGéD{­s׃€><0‰0¬bcpdþ®š˜>âîZ¤çÉØãﹱͦZ–2cBO´–aÏ`fög§8ë/$Œ+ô+׬Xy/Yºó˜#»åò]¤zxÔá€.:¤Ûäáõ½N Cd¢F·%`—Àñ²ÛÚì! žx~ÏzÖ£löìà‡€î‹úÇ‚ ÅNm+`av ‚jÛ„/1lz×{/µ:ò¦eO¿D¬Ÿçwi»˜û÷ÎrÿDÑg+ÊbrÞ›Îþºt÷7Š›#Ü_Pë‚8¥;éËa#{TÌèÑ*k͉4Ú(ßÉ@Ùniçh9Ô)ÞûP¬ íøZúåjúW­3fm¨ì‘ªŸ”& Û’“` ÿOÿæKæA¦k´ô }$´>. =¿æR6—÷†nx`}ZÌä‹»‘Tìèâb*° ¨§E)bGîÿßÚXÞšÇ;3Lˆfïš{lÔãrà³èõáë#ØË‰¼¿›tßVF6®6¢ Ÿ¤”ø;È­]7!ñZ”°Ñ95ôWGUô÷`r—¾“â«è¾Šhf8"”õË ”#ŠãÝš+™šI93O'¬b°úB,<ÑØÌu j>+NšÄ›{)ó¼ÌUV']5*ß™.£ŒOÑCvhå7Яò]í‡Ôå‘–“?ߪ`.ÕMªP¦ ÁæØ­á¬a,o,\(w=ó qâi-,Še¬ªÔqâq‘þð4~—€.'ÝÞuÄMQw/•E0H,üà4q¶Õ}ZôT&–Ëg`Ù´ÀÀúŠÖÀ¾m4D@ QK½+Ì”*Šz<ƒ´bŠxzÕ\-¨Çhйñª=ãrR"Ý é8øí B…öu÷« Œ±¹!OÕítXŽ[gí§U‡3<:ŽTŽs4Aƒikt¡Ê¿éÔ¥ˆ×ú½Æ†G,í‘TH_‚½ŸÌH’ÖÙÓ:*~Zà'ëæk‡Èv“å+§;“‚?2Ôãc ‰¦ä¬þÊ„çý€iÆ )d@©¢fyA44ܨëe:,;ÄÍê‹j)U¯ 5Ìßÿ\ ¨A>F'Àñ¦ÆÞ`¢_Müº©K d}nÛ¯Íø(@›‚kÌ û¤m‰†‚ i„¬ƒq’bo&ÜFv.ÇÅ÷?Ûˆ„×&0¢Yµ¶OÿSy±ˆêá`Žƒ<ɺ9…|3Ä7Ÿ;5¤ ovÞV`€qWÊxóÅÙ…"i^š_yQ¶50N”&Ÿä[V"µE /_ÖocºáøVÍhj`}¦K6C­NXpk‘ûVìCNÐyŸtUhœ^PÔð.Ѻ`߀J€’šô:à÷(²»Dg¡Á[ÙRJ‘[¨¾¸½68ižlAóF3>+ó‹ÙçÚ¨ñ*:W_Âêîý5u‡ƒïna7³»R×Iîxpxž0Œhsµ•˜xh—Òø•^Êç¤a• :[,¯IÞb‚¿‹Bߎ >MM½áÈE½UöUQ™Vð¦8©ÅC!¬D¢¸o!G§go&Y>M=¿«ì¸Äs¼ÛpjªëÚ*S‰K­%3o‚ýY¬ CMØÍÊ­?èýÿ9×ãµÝ–¢TÊìë§3;Ã@¾ò¹pz•¥´ªHyÈe¼ÉOætè7Õ&¾!N!5pǺ6.RÍkFìç ˆÔ¯Ö[ÓþÔ7¬ rxiúvª}aúÆOýBó°Ú©JŸÛÍNûM¾‚h-¶®aýƒ-Tý+@^ÌOuõºßà«Nz휤Üýz8”EÁÄi°™ÇÎ0Keðjc‚š>¡ÜŽñ¤ë¥·ÐøÎ¬šZâð3u['8k P `3ƒú YÛŽôDu4xœaþU‘-Z_#àH-d{ÜYKN*w£:ÓJâßÊ]³yRe_å¤"WÂyå1äv³ŽU}ª\ÏDù\ïŠBTKœô|7“âµD©z<öì¯ÇK¤óÏq¬Üõñã‚%@iïñÝ$)`–ÇÞ‘8Zó¨”_ÃË‘ÅDÇ3³Ý[ØT,ªj¦ü{!Wñ…ºÕùìÐÊB´ß… {¥ÔCï_ÑÁøÛGÅÛ„ê=pDñ JãDºžÑ#3ˆ?£Vëdk‹ºXĪòV¢ôßF‰¶´óûIÙó˜`Ô»6î2¶Üˆj¹´^ 7 ø­Þ‡Ž…º Îêü ý‘w´Ã¬ uªOV¢$¤Õ?ïé‚ÏÅ«zY2 Ø*œÖ˜ƒôµÉü+2á¼¢–øï¦R·¼#úrõ‡ßŽàGÆa ™í£Ò|а‡¶n¶f)Î @ŒÖ±¬õWZwò›†"Qyk‡ªwÏ2“úÛÍ€·˜Dv c³´ÖM;ÓWIÌÍŒ¿°"_;Ðtj3>—G±µúÝÈI.Ö<ׯW=òª—,ù Xì=Ì_}ÏŸô8:ç.BñšÓûɉ’­¶ãg ÆÉ"ïþäÛÏ^çx‹ÎIîÕ[1sý÷¯ƒ! ø,÷é°ÆPœéÐ †Mº•’$k2FÙf€<_åAZI–‰\>b$îb|ŒöŠÉo?¼ƒPT¾hßJ@\m&ú¨-‹ƒà²Bc½„`Àõßì[ÐÊ Z!!Ή[σ?ê¡´#¤½ägº ñbÕaƒÚ¹W›¡Žk %n„žâ&òuQãvîŽä¢àEÑi½1«’)ëªu*Ï&xgZ7G¶«¨'¦Áü-hs‡AÿÃ7FŠejMÇät0Òï˜ÕTÏ+ãIˆ´NÅ&ÌêP™\²Ôº¯ÂèÜgw B\Úƒº…Ê‚Ý{þÍzZ€»º¡$>øª€H„hõRî”…Ã}ŽÜºLrΫe«È)°%rέðöÄg õIDZ!t¥ÓiŒR nÇBcE‹íRŸóJŒ~!Œ¬ÊÒޜ渣AýHfDŠ»p;änúG6±©m²Žcп¼ŠËáÌ L—Ôt¬9.ÜkÙbçÁN;û“jVÿ2Ô“D+~uxów¦«FD +3üÀNIg_l\Í-@þu̵¨ÈOê-õq\÷#-¥2õ¶¼?dà”ò*¥—:ûÝØ U¥L:ìô±7$DâM2ðuÈ (ù'c)y•»À(ƒ®`(c¸¯•¯¶‡1›Ë2ïýáOét‚òŽú0b€_ºÞ¥ñ´Éµ¡É_`›^À·Ý¯¼.4ÍjsFý“@<öŸ¾\<¢dãKõjš2A\sÐbJÇê³ó±vsËb¡¹8[¤,çÅÒM/ÅŠz0ý´Ö¨ŠI¬´ü°OÇýò¬²REñD„%ÍUtÅÿîÍþÓÃ8E•V«9 —PúùbžBÔvH´½ÛôýT)˜`æ8Oã¦Æ§ïØ¡Vdú}lš ‰ŽŽ|ÁúªQkXÃ6¤"ÀPš}%åxÔ™i¬@/„tÇóo`<›a%Qœ‚2:aÐÇhmÿq9IZ˜>d'qõi€‘ùhò!ß”ÿIp2׿“(†¯ÀZª¯*IõÑ“»N¡™•DrÇ$tÙ\YeïŽWÏøÏa{÷~}š8ysbÕÒ!¿ÍÜÁ[ Qxà¤åz¦då[¸š¥©˜½qiÙ†‚Û ˆ4>¯ªQ]$ßÐ㈵;*ÕÂc¥-–“¼¤ç7?9àÍ’à‰H¢ d†Ñò“ô7£-ƒ‹›Ìb’û²}~pTX\Ü@ v=5pÎ,¦ þÐAú¼¬^¡-1c%ƒõ΂ v2½Ð(1¥¨ô˜Û!ôúYU/Ñ-o|—žÌ½Îªœ÷rÇz²ðS2𑔎µjN…›'Dœet]Z sW² 0˜”O/xML´‚Dw ô?lí5˜ß¡‹îÐʃƒ:ÛZzáG*ìbC:K—Óø-ÀMóèA›Œ{Éœþ’Él„ÛO›îý6Õé0AÛÐ×û‰©Ý†¤IAû—ê¬]‚’‚™ggO¾Pç,r9‹Žøã`1&s±!g«¤g—ùG'Á]óÍÐOñ¤dÀzé“P¯ÛÀå~žöýÓ——ú| ºÖ.‡Ýú›ùÀ¦~s_rM GÍçësGØ|L¦l1âHÚh2ƒ$Èn_uÒsÅL»z«ü°hËõ#]±‹Їڔ¸ewÆ+)Vj>ª8Ü6òl€ŸšÈyÞå,‹ïqt83ГéfƘo²µ»â´´Âé· >¶öÒR¹OH\lØ Œ-C|ÝY2L ƒ¶·{Ëygaý@ˆõ©œJ,Àaåy–¶Z@0£½:n€™kÐÍwy’XkHRRô\m¸íp] VÓ<:}P<: 2+óóÐà¢Õ~íC犣™´‰J±©+}xCÚ‚%xWq¸ý¨MÞ_þŒ óRq¢>¡Áï¾·1bâ¼o.RMXRÅ7½‘d¸õïÔ›2Êc5KÞøkË­ÔöRAîÚ¢ú¶[$Jj:ÇŽš"ú ˆÉ$Ùâ-[Cz<¥?Î׬L‘³ä·ª­¯½q ¯x÷•‹fîŒ**ÌÞõàæè–î†Üý ½—µÈB8þØÆ\…ȳÖOøÇY ´T<¯úê¶JmRÚÌ×'T, TÎ3¶ë.³o傯y º>¬xèß:hx[ˆ¨ÑyÜ" [_„Ï!Ë8|\98Ÿch(P¶ª(Òÿñ- ß^o`GÐM2U·Re‹2:4ü¬Ë`øª%0P{÷¥ˆmŒGbá’&EÌB’CÉSÓ ¾¿åzIBê81Æ 5L<³@H§vðT‰#«®F»:ÊÜį¨@¿®^v9²™ÕÕèt·ŠÁ"óPà¸uû{!Œxw'¬kxþR~±ïÉß ÑyURßT¨nìý•ÁcÆQép©Ìyý*nŒgbÚùäÄþQצÑôAçY×°Iå¤Êí`â–Ø¾l®æ§„0 g{ Ö<´¿,#XQ¸×¶·WŸ¸÷Pß¼33î…&J¹P«é|ÌXJ`’;èß?ƒLù¬ÆÈÇ?‰º‡[ëSo&yZ-ê]U'€Ïø¤œ«ËúA¢'6Ñ‚"œ8–Ô À<„ «“ªŠ¿"%T7P9³·šÂîªK¢»JŒÕã(ñè¸?¯ Xí†/¤1ÉT,fuG.ž ”<)É(F]â4Cá–n>F/·J‡9lúÅë§žƒ¶ü'ƒ“> Ú¦µp¦“ň 0g,­‘úlETáðäDíÜa™|,7ì قо’»~ºÂíü?š‰é)+Ÿ§ÇLdºò5Aa; ,FãYõ€áN5ªÆîNÞ Ç_.nép-],UÂú$Àº´”ð™yˆâXXµ¼¢nÙ`Û§ OQNRØa1†jî}µx`§{¯{üP Ó”üÃÆjˆ‹¤4ÖñMôfi/¸úx+¨ºWh jrD~–ÓÍMi²0mð- ÖC,.|Ø"¹ ÜÛà÷ªÏ”‰A‹7‘jgîþ”0R¾îˆ1:†N²ƒ‚(¢ïÍ1/ î&(2£(yÖŒk<ï(œTΩW2û?06äéóÅ Ú½ÓŠpÍs‹‹(T”s÷k=³ÌA‹š›âX4å3QöiNµp\µH¦™Fñÿ2ň¡SFžÄŒËU;VÁYé´Æ‰=õ˜È3ùlÃÛü?:“™x߀Õk¬zƒÚ4ªr˜hTÛšãjb,8/îñ¨YT>âB92ÂOä’‚C:q¨‘ü€ÂrÖ&Ô9éV¹NëRaâ}÷ÕŽÌ@®UB3yòÑ+Иò7©ói@Uùå¿Û¿0ðô¯{EÚa~Ýnß\î––}°*}[\¹ô„bÕ{€eUÛù#è(˜Ì.°Qž-^BÍÙÒ˜®ÕR©[@8 R)ðUÿY¹›6¢ÔÒŸKÙÑቬ™wlD³ Ël«]é™;>ÏÔx~|±|Rwu0ZEŸkÉÊÞ,ïbÊ£l “^²Ùð;nö,Ômþæ @J8IcNüjñl,’†RhU>±•^J&®ÒeŠ· š†wLT¦Ïmhb±ŽŠ6·éŽjù‡g—#Ж +Û·,å¦È­¶) eœvo±Yˆ`=eGÿ >õ{jÂ2†cG¸n]§<ÎáÓgÍyk႔ⓣ-f[ {Ö%GÉ4UòcPW3æGÎÂðx‘ʇá|i=ÿ3pÛ”yf Þ–Øwˆv —œõ$kê¿qGŒbUFÛ;Ä”ïþøåð†9ß››0³-(é>²œù+ܽ/Åu!?¤°.ª“ÙÔ°³ÇœïÒ5’P3‘ºÈP3‚|YÞ—%g=ÊQKL†Æè¯ÅœCî…°³ÌPt÷–V#{î¦aì,„dûPÁJuÔêQg×R¸¬äQçûñsឃÅë¤æÆ3/†–ç4³ ‰”¥éL—5ÒhdÙÔ]§ÃP&üþª†M´DÃU¥‡BHTTh¹.7Jÿp“u¥H1êºX‘Í |‡^÷ö¤©­ÓV¥‰ùz„¬?¥Zqø®CŠñ‰ 3¿t½×nG å/:áØ÷nïÁAö\NרîI/1tþ.z¿–ø%ðæ‰›P–\÷Å€np5þ!ÙCÏÒƒñS)0TkZ_™%Hæ+; ÇCñNª©ºã,¶ÖEÀ 2sÎåå³ Êi ÞjL¾ÕnæÜ ʃ-«º£õ>ÄÇRÞ¹/»Cû¢Y9Ôo4­WȦìÄiAª µ]¿ðôÐj+Ñ.?³³¬Y/lÑOÊ ·ÉZ§Y±Ÿè…¥I„ù®äŽWu”˜Ø¯§ é$í½Bšæ¿+œY>ÄQÒÚÄ ex‚PIœÂÇÞ9MI¹âdqË•åBT8µ}p^´«ô"5n‰3yAè¨#õ“á:wÎÝÉ»Á`órÀ»äÓœúº0pëâcCBŒŽ¨~‘ÝÒâQ^ølhóˆÎ¬Ìt¡3ZbMÙÊÏ·|ëXa»-H"n_‡ÉÑ—µÑ†‹`ÈXÂå$ÈÙOsÛ…Š91ÐqòÜ–Ÿ%¨˜oá02Ø×2§m‰E}GxÄßÀ)N²¢¬*wÄIñþ AZQ)}fØòR÷ˆÃ©õ»ëˆ;ð‹Ö•,^Úzå3¿ü×&ÊäW!‡ç>95«Dƒiå³ãójv¥ã=ÌBÕX9>IS±ÿÑ“X_}i6žKf¨2?IŸSáØTZöa9§@ä¬~vTÃjãÞ3íÍEÒ:_«o¹ôØÃáØ¶þ‡§¾+äÖȉÁ#z–ò×îoE¢ù8…Ôæ†ü¬ñ•Z°¯g`„wV0†̱Ø{ºÍ ½›¦û‹ËÃ|=ÀŠð>àÿ­àöëv[>þ…也AhÎ8*ªòB2Ê ,Šïpú#æäÛ<‘ν@TíàV6†Ä'F êsN þúÖƒ}=ÓÅP3]× ¹†a¦Io’ù…¤ɧ¯ î¡Þ»©ñP‰:–êŸíEØÅ%ª©EƒQ Il”± òm#6?|dÉŠ)¹œ{1ºeóŸ)›½«†o Ù‹ó`raÕ0LÆ=’TÆlTiÍÚùM`ó€]~(PãáÁH€DkkÅ™W¯./|$ ¿ªØ¹0.Tª7ººyÎ+ݪxöÑàÂbgQŬi4“ ð½è4æ¹”^í§‘ß5œ|ðÚ¶y(G;1¾@LÙ©ŸÐ:hµß„¹,œÑ5¡yédàãè©IÉß' ß óSæç7†mnXm£¤=©öý?!nì‡M±T¥Žâ;ÂG¥ÈÂÐ\6´_ÚÍWPú,uì¶6©t°¢Ž7’j¹e>˜Ó½~BÙê“ñ劖”O܈=’~ƒ€C¡(ˆ×\¨[§žô]>ß°éÈ€û¡i«¾E®â2mè—ÅÇ[é7W~Ÿ±h…b™æúCd²Oª½P£MD@éD5qZ1ç/ñb9"ˆ[Ö*îËt‹´úF|G¹A»Y|é¦V>tÛ0W”ùΨÍZþ4 ºv»ÄRb§÷ø5DÃZ W8ÈeÂC«ÿf>ž¨È÷‹Ì–ùþâjEãV¨¶Ãzƒ½…²ÞŒ`tÉ;Ø^IЬ¢ !Ù!@ƒj)ãâÌ_÷°Kò‹…v,xà˜[ç88@íÊ„£Qk¿´ð;Š9£UHùS‰þ=ßia‘7ecíXw4݇`}»¶¢Z;5§{h†ÃpFÐ%vÒô“ºBÔï' 9ðúi8iI±tÙc? ·ëô÷LçaÔù³Öñ#>ÚW4Å"!bÔ"%‘<³ ”P9˜…âB3‰Å𬻠Á™]óg..ú^Tâ™GrÞ ÷"L@mcΑÏX4yà­Xˆv”Ëw‰9¦\r8»cúÒãJ_¯$‰Œ?N­Ð¶^ög0¤vUå%6š4 D>â3Ñðç” ¤L ÉWƒ)q|3‡ùÑ^(N`ÅDQIÈÝZõi}®øð°PáÐŽx˜R긑vÿ­èñ«¢¡x`϶èt9r‘Ù8Z," †#tËÀ¨›C…Gv(J,ÊX*fpæÈ»d˜Àbmµˆžc7Љx¹Fµ§ºüT®–Ñt+õPè9 12OŠZ¸z@9qÏ„ž¡£—˜×©à@ª(_Œ¯Uô”ÕÆ)Z3AÀuÔ[oqežÉ¬7¿6‘€ªM½> ÖÇ3XCþ¯… ŒÅ{“·ùætO‹º6„9e#ƒÀ\áu™Ä¶ fùdÏ–Ò´Ø(HrØ”£°a²[€t.ÝòH¤u+ªèmuoS#0øf݃Ө?SßzÿËQ\]œ•S¥ŠFHîáq[¢6‚IÒ&¶ôwó ß›­7²£°>øº³4‰Œ¢Ø§6u1 –6¢ ÛØÑáì j¤¶#g…õË,/ÏqG¥'¹ÞòߦÛª!œ!;­Cíò.@û½<•Éo™{µøÃÑDæ#âìOÞü¬ñ¥/:¾~Ûz2–Oðâxǡԫü•]ùlt†ŽËr´ŸÍ+ŠÂý!Äʧ Åãè³ ,G¥p0æ—¹BŒg ®phý<©ë‘ƒèò /f¤¢óå÷Á¨äÙ[Q‚-$XœLÛ¦¼Í=«äb§ÏCRˆJ ó’¼Ñ]Uý ÛyY†§¨¿pš @Hî'Ú;nà¾8 t ÐB_Ý·åÞ$¤ä·‚fVS9¿· •Žüè×Ί_-ég}°qœ}~8$¡3%{†5Md}ß3·nvA+÷Ç‚ŒBÀ~¡}FZnLàñû_ï–ÇLX`n6zÔ„ÙE3dB{ÍGü2ÙŠSVŸIõ¶ršëôÓÀš%„êN®À‡^×oðøâ÷¶ü¾M†kѨóTÛI…›Û±ÍTüÓáî–ž:tÅ'ÁþTÑŸÎÄDÉÞÕT%{ôŠ•*L<¼&†ÄƒœãWQ•©äQ]H.¿çºiý+¿ÈϘK”$‰ _Û={d²`…)J`g¼¢ a„bùf¨!@DQ–âR/‹ÈXe~•!Û ü@tbò ØK«yߺZO}—êÖ,¨~Èz)X}jï”YîÈ;@´Å?U”apS „……ø8¯©ˆí€;åãª5èâFbé‡gœ³Ò`óˆ©B)ÖËw­¯æÁž”üÌ.›¼ |‘H( ì“dèéÀcÐ2ªlO¥ŽÜï6úÜ8yÅzK‹ã„’ÖÑþÍ Ø‹ AXë—Vt~DáU X‰m—v´þA`)¹C0í+Ïÿd’Êz/º{b+þ©ëÜTCYÐ’=RVm· ª\G¯¶Úô€ ig*7ŒpöªÏKÜ÷¿ `ƒ¸uIΜf·¨ˆ‰DÉO’¤Ø­éB/=†" HšbôÆ6­ïpñ®³ ÀQ"ö¼9K¾ó= vŸ£“u†dâ¦0ÛÒ% t}þOé¯} ¸‰1Z†¸M$\¥â&ùø-0$Р’£n¯¢ií¢¡Ÿ›žßP­êÝ34 åÚ³¾‚»(CâIç&ŠO³9>®6T»´ÎE+>¡/Cý½í·¶ü…Þ÷ $…Oéö(„&GĔخ±°ÁaY²ßxî«è7Ñl€Ø)ç€Þ(MpÏR× E›n9(Mܤ!2à®å]Ê,ób¶è¯^oT±Ç¢Š¸9©ìë7æózÇ-H9®X O£¼ƒ ®^¦Lú%pH®W·›œà·:‡&]<š´#8KÍž1õO?(^)·/:u¬[  .(§yYì^;WCÄeôo 2ÐS‹ÙgEŽkHF0Õ¼ßα³hE-ÆeåM—ðc‚®°šÛûÈÙ-¶‘¼xm^nšçÃ^ˆ!{pÿCùÚÖŸÏÙ>$Ìã3ú=Æ~¼Ù 4Ý÷ ¤ ¶ît$4j6˜¬Áƒ%€©*õ³Ò¯o+°ç ï¼âívÌÁQi>Áï誻n4x7ù‚cN@~æ $´…:K[ôQW©aø®´í½JDG8Á#ùÞ´iÚÿiĪgÌÿTÇf> sô9×Μyq)¸ÍvZoî ,À°“KiK}Ñy±~lŠHÏH¦Q]ÉE—©™ñÌÆbž™þZ­ã8{œH#“¶yÛËï2‹%®vk5ãl@ü‰\sgÒ ,MÍo@XhÐÈlM¥ˆz‹Žý†¯»B/'ÈÛè¾`»züqñhRÁÓK3ûä5[I„º0—vÙÄ i$·F’@RX°•'«¶”­mÜÙ-{÷HmV°xÕà>vÕÿ}Nô€êEp{y%;'‚Bø›ƒ-¯”<+‡Ášõ.¾Iäü´ †Ý0/„8åeG&ÿ_8 Mïý¤…¸UÜÆÐ«–+QzÕ{œæ)b˜öèúö‘õ8>úÝGl³rqÌpKÉìƒÅèáG¢Õ »5+•ôf‘Nš/×Qæn2Y¢™ª7õÓà ³Â>ó£|³ÎQiƒ`Åp2Íp–\jžŸ%w q䢪i¤±ë,°ú~ñäØ/: tÊóg–h`ø¶+¹SíÆÎ2,ç|UˆâÜP.ú–¦Km Lhïh¿‚Gâ"ôÌ ´÷5wø¹0¡»KM¾ Çþ8mH×I£ ÊnôPI¼âîšAÅf¶VN­®ãzjµX[e)Éooªñom£¿@-s5Ä]iÐ3êÀóýYð±àê"äŒÒ‹âsá Ç:¯Q‡Î=nškRÜq‹ê5üWŒA»§›¹ñ[ÖÊu/|—JÖ{CßÕi|pþB©ë‰ X•·µk”°Oøo—Êù¤éE»RÆ*öyЉ„èTQ,H±ÐÛˆÌUÿ¶\Phmñýoµ/ …VÕH3Ø`4NÈ6¡ dXãÜ]qï,!tÀWÝû7v‘’[S[ çו‰i9¼º/`ðÚpJ‡9j¥ $<ööµ§-$hÛ}ótW0q¬V[ 󧳯ü.!lKQRTîD‹ÌÜCžO»‚†IŽÞÀŠF•6¡½*D*L´ÌÎ A¨VÜÁ•~‰Eáå©Öý9“цvO6Æ—lm®|c6¾+´eúÖ‰>ïR™eâŽàv¥£bGÛ£‹4±½ (¶s¢x(tëm¨ï .èÂÔ‡Š'ìŸM«M×ÚLOÓYŽÐá]@š$9g.8O½ùÓ0‚äÐÞJNh_klŸ©%–&<Gõ±ˆl_HÐFªŽšñW‡¹_Pæ-“‡àiÞ+β:õq*ð¢“é¨(ûEÃQSéRÛSwlÈX0‚m$M$æxîÏ|çÜAA¦oz |Œƒu«tø‚'†¯vC=IC$ûeùCGÿ—aÊ"Ö‹/ƪµÿ~7•“Âfã¢Õâ;Ù÷Ìñ—Æ|¬”YFßkfç¬L +stÔÌ(žÇ”•¡oÀvkaxøÐÇ3ÿ€ÛHÄ@/ÍU8:¤\òçgÛfL}¡@ÚL¿f¡†¡>h òCõu„ÊþÁàä,°Ù·’ô¹´ "mû=8 (QÊÁ×ÈR[ê)ÇàõŠä˜D° ýæ¥Yy‹–ºkct“Zê©:8V×bfqç­’¸¹›Xmú‡;[qi&èa`cpߦiUxÑ~ýÀËéJš¶+&bïes¾ÉëØž/î·×ÇœžŸ?؉ÃÁÿü1%)þËŠ ¿UVÏ–%ÈðÏ4‚E;ãF ¯k¨ª¤!‚°TäÛÓyg²éi<{ &aVxóUIGê],94QüåW …dC—Éꦵ˜ÜlU&*Ø™GD5¶#/ }ÿ²“RÕ†*8†ÞD1ÏG{æ2ò”ÃÅ;qð:'²fé]6;°ö‹J¹ø×&Ãί­\à²hüt¾¨g °:šÒ 5ãõg,x¹pt“ó=™ô³­6d5’–‚‚µ¦Î_‰ýb]h¢“¸ýQÕf“Iº‡î§¤½óŸÎ1Ç“¯Ít‘/h7iUw×´ìùšRèZ$töï#;„+˜v>ÂQ”þ¢µ}‹î˜>@Kbòo1gÓG̺Ö,×\yÛž™òrª»ozäúÂÈ„I?ƒý”uKŸCMÕ\!ÑËîêÎ÷Ãù†Î+“ç6êÔ{±J‘±øÕ‰£ e§ÝaGÚS9rÑP¡X+Þ«þ–ãÿ$Èúì% ÇAºÂ‡ŸÜ— >‚ª'bÉÄz*±ë©ÛT¶îÌ9ô:ìÓFyEáz¶)qÓš~Q ý”ã¯E£%¢“ XÔù€ÐB$Ý¡Wøh â°n4bÀ™”}Ñ=ÒÃ3ávhÃÙúÐï…Ušƒ ci™{£™‘äÒ™†Åw§Ÿ{ùHg÷R²e­ÜôsàÞanJ4 µÒ8£¾£, .2`í¹NøƒV&ñ#ëYCvÍëhÜåœTë¡“á €*»;(ʵ±¬]*÷%»±7ã—i3ñ5þ%Œá™ŽëXÌØ0œ” ÔlÕÙg¿¼vß‚?_dhÊÁAK^iĺ°åèGº*–]SÆæÈc¯BŸžf0(‚¨§¦3G‡¿ÉBAͤŠc<Èýg¨ä˜Äf7swéó.{^-ömÕù@‹Ðƒ»‘ ¤y[ò¦Wkk± ØÔÐ ò(ÿtÓÀèÜЊ´™†8øûñíqv:•ëõóDгjû¨ >µë€óNÓ0Q#Êo;Î'Ì9:…±÷ç¹ÒyôdAÄÀ9êœaê/ñÆs ɲ_1wäÕž}rbcÌh>ÿ¸tŒŒmÚ_ú#* ÅùÒjå!0Ø 2eä Ÿ,ÉjóÛª*·çP¹Ú.[Éÿ/¢2{šÂ»2Æ‚:¦€íµ^‚ ^ÁížûªdâÚ÷)WIi«Á"λy„¯Çh8¥èôÝÜ.“%…Ї Io6Âd,}ÓP­åŸ^M Œ†(­ ?˜}m¹"çíûü¿êîC·Ž5¬/³”FÒÂ÷Je©Wlyÿ¢XÛ¾œ ì’•› 2n§"Ͳlmñ`øaÓ¬'_š‹wŠ.±ÖTÐ{übó\XXÚ\Êîç)ÛkÍÔ¤À^W½!¼†·`((¿ý‘³)·èñÞ±°Ÿ‚½*=§`!çSrf(úW’á~×éàôdu©é}6ÇP‘””ç¯ÚÙÑ£éö××2/çÈ~ßåçþ›¹óP—GÓÅ"ê•¡Á'ÒÊ&Ô›‚ü¨d–¡043_ãÍÿ¾­‘Ô‘$¥õ;ßz‹¹v¡‡8xFˆÜ"³³wûŠã”èÖÜCs'/~}å¸=’î‰ ÈZ ƒzó.+'/-;~ÌÌòk“®NXL¯“'­VR“¶Èà-•’0}îWòÂn7bŽýŽ-ýÞö{ÜQT{úkäx¼6A$E9¾›Æÿ¸1A… ’‹`±EØ$¬œŒòs¡‡ÚhÌ6çÄnäÜá0Ð6Ê2'æPøÉã,ƒVX±‚Ö'áqš‹‚Ó#'-áΑ³ÔÜn%vb Q;0žbàÐëÿþŸËèÍü¸~1Œ©yk*jþ°öŒÒŒFT\µøOyÜ=ÝûÙ`^øk§ÇÔÂ…´² ¤žR¢4+-;E•Z®¦¯žn6™Ç ©³OGŒõBÄb&U<âOÕœ>¥bV «»ß¡˜Bµ7v²5˜“±°ðªâŒ@;3u_^‰¦‡çp¬‡…·ý³}1µîc³÷bÏÐB6Ù"¾"hKñS)2Ÿ„"o;ò‚E_®¤æÄ»¾Ž¿1¸ãû5—rÏ †?Þ j3EÄÍà¹?²^ô‹ý* æË«¹9×jm½éuMÞì.¥y0;»ùÐtKmóT_wœèRØ7²?;4-ؼWòfh…h,Å£‰ÓZßâ€z©=ªü­:ø›?Ö‡¯p±mÏ8³Ÿóâ¹42ˆ·ÈÚf1QÆö‰Ròk¸÷þ];5œ )oÜç­°å@¾Ïëê >Ôçsëº2…Bô mÀž'פ½G ÕÆwš¯£ªØ„D7fŒÂ ¼ þ«…œ‘nœ/Ų²$•CzyY,ßg!Ê|Èøì[ Ȫ'¤a\¿"&;IŽ•j7Ùñuu h(GJèÎkÆ¡›µ·ú™GN ìãZJ3Tkfìñ‰(9 Z›¢SÎDò]«»NçKƸÊQŸ’U¥°jˆû&}1‰Dƒˆ²Åþ%p¨¶é¯Ò})±‘œvY˜” ¥íÿÚ)(ö6 7gÖ"ýØG’#­Çê(ÜõÈ”'3ÃZYÐ*aÍT*4HEÏV"Gzˆf»" ÷êÿö9ƒr îç_°§´ÃÇ»\Ò²Ô:a÷Ý‘qÀÜžŒ†•Ÿmpg0!Èf`1‚¶¡”°\Ý_R½™ówµ¯¯s –œAa«ëÕó1ÈšH!œjûÐó0°áÿjˆuÎWBNÓ-ý ·#_‡§ØÀŵÛR]5^Ú‹æÉ~«‡S1U™ü³öºªB.]”Îm>a„?FsWè]«Ok©ÔFV¦£SÁ Gì8®zÑ8“FÓHMβ'çØÑ|ru2pš‘÷ÃÚ3?hb¦ˆY©uÚþ‰"ÓÖóˆ ýŽN…ýƒ×1gŽpC‚W´jì˜pxâñU \U ÂE¾¯?–ßG< ôFS/¬ðÛz¸õÞ!ì”i'hSPËX¿œþ;±Ã”L¢äzèèʃâÓÒ ;ºXm§­ÜJÏð’7öÈŽÖ&C4ó@ÃAÏ«lñ? Q Êx÷¡»©ZÊÕË¡]ê7ð2¤Ýl«®ô_ä‹ç|j¾6°Fû¯ýÙg)»[ϸ§|4×30Ó<þêüÁLz“{\%ÿU†ž¦²¥¾)½ç6ÒÕµ±mHï• —™ù|‰S‹¥ÝÚ°gSô‰w¢m‘òËÆìמõNƒ 1“‘É"üÛf^*X<Çcñ.ÊÜu¿Í_ê¯hÔwèS«Ósr6Ppë!d\ÊâaP"ôÌÆ7 K JïHMH¾n¶/T£ÕL½izvÛå†Ðµ*0Ïît.C4¹IJö!t-#4œýnú’Ø…¥•£ uÔâ•ÝpËîÈý *èGø§Ê% ÝY©QÈÝè³²•žÿß:΢û•Kæ›ÚoÇ-ÍâU$bK®}92Ç ˜ƒäý$ãMô³Ây›]­@íêc3}HÓr¹‰%œžâûêk-Ì]ãÈShL½ †NæBj¹`­­DòßÂYj™Šgör¬-M`ˆPP9IVf§œ½úÊ«¾ý}sûóÊ„8¬Š€Úý–ãÝ ÜÛWÖC×Â<´®+ÿ#„kµòÁ$¨´Õ´ÆÍ–¾0±ýZ©S'ÿûv¨rÈg Pýc³}["2Ê,ÂJd ¥sA~È7ù%K óxd5MQuƒ”a3QÞÚàJXø.1 Ô(ÆëíFyƒ¸¿tbïšÓ.n¦µ d*‰?Ä"*ï©ûÔáë|kÛ©f¥‡}_·¶üŸ®ÔùË"™ Î'ÃKd[O¸/¨eÙu€òþzF]~’Y‰úÏ(0æºb¦ ¨$÷Še Û69Ç?u#úÀ¡±Þ…X°,#¹Öò ´ ËÇŸ:3ÄíîÞ`å]±˜o·nÝ-y–î„÷ËöŸÌIšþkí ý1¾O˜ÏyÚ}Û9.bGÞŽtŽe`©rÙéMÄzÿM½eV\ð\«Ð©õ ¶]ð½ê’0Ô×I!“ãjÈ••p9¢óöL³,軵GË`”:ð# j!RÊí7´xŠÓŸ1Í·žõ¿gtãOˆTå"š*¥K´XXGH™A;­¯fL·/¾ìôb0¸¾?Ú·Ëñ?+þ޹ēêc뼦ùÄòña­KéÃÝBkò;mµi£s›‹T?Ù`™²[ï½R^Fpk „ÆŠrütÑG¥‡ÈÆtó»ÉjH¨ÆêR crÑÏ}U©4=Fê&ÑÿçzaéÍ:MÈÆ½H«ôBùcÙHž g0×aÅ!jø]ºÆÁ!: X¨Õ0Ö“x§%÷µïäJ‰×°e€¨]V…(FmorRó¦Øƒ½—qZ;Æ’…*·¾Î,Ò¦­¿éIn\¹·œ‘á¾=cÏÇe+Ó‹gÑûhýüÏöÚ<4̾Švc&O”X¼IP&ñázi+“dkxäpÑ8„‹AE§›P§Ódbúøqe…fµõJ޲yŒˆ©k~;RÁ‚í÷Øs… æ]4ç®äþ! ñù šˆ«féwžRhöcÙü–öÓÃù4ä›/ký@,aê,xËÖæúAnó˜ß'æ<æ’âv ß”ƒ’ EÞ>Rÿà%ïY·¿*ÑKl¯D$HK ÊÅz5eM¤a«ÄÝ~✑~Õ¢U1÷ 8¹© Ÿò·kõ§&Æ"±Óù;–k$tzû{„çÕ¼ÈAßÖÌFz$‰]ùõºwµýÂtCŒÎ.,¹†ÖSœpÁPØ¥hc¶Ãf^å£!–XÞ×<}qcIzÇæ†%D,ÓúމB ¯E¾p‰ÕŠ]å}%D†ØJ’Iö6L4±¿Åæ ¢;¬é‹9܆û­À^µ5Ã:X9 ú•Ћ©‰†³#Œ±1æDâĸˆn­74Pcæúb ˆ önÛ'Ò"Ðæ¢>04:9½Ÿ¼=W¥vP@œa¿ö,hÌŸ~†ÊgØ5*€!^þ¥¹¥ãìÃŒ u¶@1gÆL’‡HšE:8½:_›È-…AÍ‚„1k8eüdæÌ};á¿Î‰º’’’£ÜE{wá:u²~£·§¼ /e¯À@dwœfö f¢è'¢º¤”‰Qå»ÄÅYÌCÄI½æ÷ßòeõ-<cøeßý`TDáô›·k‘·xáY¤5iP [ZvŽ$ƒ†ÜL#8J{ÛäB» ~ð„(ÔËKó¦¢ÊT8^.Š[¿×‘ÔÔDW¸Oéksl–Ô¹SÈ;Ü+Cù»|>àÅE,€5¾¼(gÇ1ØEå*ëÎ8¯— ¥†|6Æsá>z®œ`¹nûB¿8#.su7"R®ÂÿK„gô\…ÝSoxR]SpUÎfcŒÝж€1<;•ï­%í!ik·?€Q`õ3røEÏzE|yý•ú4%£šôö)eHCWЃÔú`×¢¼òV¾sãZó,Ýú—{ƒJ 4¡NIÉï\‡«Œ*s” î `MHíý$÷†—K,ºëàK$×Û–„y ÅÖûTºð0ß#QjÑöñÛøÌ ¸Oû{Ï{ÿÞ¯ l"¤ƒ’œüI.ú÷c¦JíóXÕŸöÉ“W½h¯ ˜7CCü­óŸ±°i¼HHzµäur¥ö^ÀÐxŒžU»Ucñ¡Ðª6ä};òÚ¨é’C—ÿ°"fìî¾0Üa±u¯ñç”&²<:³8½Ü4—1Ö¨_D‡óöˆ¨€ž>ª€ áee˜¯ %ãŸ?I ?P+ö ‚`9O ]VñšÞìWØúöã­îÜãôøzy”³NÑ}öùž¼:¼Ê¿ Àm¼qéГ)Hð£ûñk00 ÎÌ~‡–¯^ã+ÍzÐi…•κa9é©ÊýÀh˼›C©£ó/<žLKî)ªôÝD:pZ([·8p¤Ì¼T´E}ä5£a!¯É˜®kdJSêµ£ÞG%ýv?!žÑfËÿÄ XÿCK£]\e{Bß§6ã”=¹`¥}Ñ·˜& B? ë]°'´äJe×!æê¸`w :Ü©àÑúmXžðÙ Èå‘€é¸+‡à=µ›òmÅ!×}ªd»WsŽ^ƒ1ˆ”à‰EÎÊMËEe)?ßX•SüDé Iœ éhé‹è¹é'Ÿ›{V…ÓŒSÙ:2'á $â‘ËVE ÌZ¿6JCоë£ÊÓ7º€.,N¡í¼X¨¥æëa˜âŒ´ îâãLâÃ|kt³Wòb™ºRWË}Ð6 “A]ü)/w¦åi}_üÜ!™C»‰}™ã|?gP‹*>©•_0Ru‹h5ün™ÔÏ ö‚cÚr;j|ŽF»K|˜Ö¢WFí—ª&LpÐMOtñ¶¾Á®MDÚ”4 ÆlÊFÝl„üÌë Š,H‰Qd‹ˆjqÒf=4Ä~DÇ­–úÍEJdF» ;ø“)ÊÜp©W¢,7hLÊ8ÌŠ» EúÝéˆa(‡º·FPÑéP 7*@Ö©!uæáÚà§%ü¹.N|² tÔó.–P¹SÌ$zUçz^M‡w£“–8>[íÐt×O½^æeþÌ©+L Òà³½5j¡ûµ% ü,±È®w`5w¯9ü _Vê*õŠ ì/Ý+Ç¢\8înlS te`X–˜ßb‡Ö޶®Î8"CØZõ _¾‚…ÒŒS¡€×jøU[}KÕ4Mz†(vpýž•°Åø–ÎiàW)ÀóxØW£u©â8‡Lj]Лë·aëOlai“žÿ¾ƒZztèBd]%¿èåVÜ9ÉøX¢ÊI¨õã%­Uÿ•nJÖ¾ýSé¿*"~‡mdصÁ¶”¤(²U óK ¼ uÉ& ýZÇIù c_Ð"e}ÓTÿæ26Ùr¶éõÔ@‹wR}Lß(¿‰ï^ÒÁ›“ïÑ|˜ípÕƒé°ã–\vd ÏÖ©˜Sÿû#ƒÚ®~×åsÉš&iO)†"L¼Í«Ï;­bbÃr Rš!eÚýl‚ˆÍ‚+ï{€©c¾9µÏ”"4>þ8³ŒÚe2ÅØûn.ÇàäæRÞã¥Êj„< ®FOö¼n#¬†$:fšq›æÚU{A¼Û‹§ótÚ#^E—ÒR(è¯ÔʽÍå —Ð?||†ÕTÀ¨—Ep×ꊠ ¾dR¯Ö6Ë‹ÉÔ›Dl6 9 3ºÍîsº«n©Ã$0Ñê\ àCB~¬–ÔÓš´jéÞÔ©³&6ç s½œ¬Ñv5 ¼~Tä>Ýãl.ŒÎ>ê™Ey[Þ^$‰‘ BO•Øß“·A¸¿]Mÿ×éÃÛù.Ú'°ƒÈO&øŸ¶ú#¯|‹MZvb¾jà“WÃñ¯dPÒP¨rØ]f"ŒujEÕº°æªhA/ò~ø¹ªI»á‹EÀ (“r,YÙoF*"áWmBS*\Ç Ò‹ýuC8Ä<¢ÌTà {„7°y?gÈ>1}t¨ no\ÁXJôc[ï*Òh`5Ç` éod øH0g[Ù_º}U—“»\K.nZe/M¿Äé燹…X/øô¨Ø+ž<1Iñ’{cýq"e<|VD-2”¦¯‘HµÏ«6¶þŒTþØè$XTK±•¨ˆ!P÷Öò.•Œöˇ*!&A;Ñ"MÁòc[šÛßÀü¸Þùóç 5mÒF‹ò¯lJ’pP®FÝáAj{©~cú¢ù­íȧÚúŠÒ¥¾É|bÚ1 +š 3Nª×¼M2Ñb &ú(âc°Q9NÊÊÙø¿ê>¸¹TGʦ^¹4$4 È«»ƒËQlêÿ]waG¦S4 0Ýnö<›Å±½îÐTðˆkúáð×mšwãKЧú°1UsùWóêà_UcÕX¼ŽÛ$~ÄâqÞã8~$êúi«Á³®!¹öíÄyS·Û#AÓø;ªã’Y‘PÄê|–Etêñ”G{@íP%ÿÈ‹1vHÌÕ¥ÏÃO·D*ªRS#cø[¨L:á·,ßr5¼Z™E9nŸpeé²1_Á… ç˜*ë1úXý¨¨š9,)¶Æö‰òûB1üÑzS‡!¦±ýÚ€ÀÍêà#%mázÙ G‰ß4žHËXY=–B­Ccu(—Uì§ÊdFvÛ½°™oÛPö`áId—Ö…¸YžÚxë™ú¦L˜`LzÇ‹ëk¼˜ÍšÆ­öZ¯kXû±Ü<‹³gàüÃÁì½æ×œ·™e)ÇÌ.èO2O »(¯ÙÑl‚uÔ%a+ßçm§ÁŒ‡È¢–ó^Y/”_¦ÍUÛþ$y‚pÎ ¤£è&­÷*ûíP%í—"¡WvmÓVÓ„M µ½E©&/Úè”zë+(â|IÖã…䈸Ûöv@âiýÏá86åèÒU‚ ¼(Tº$þ£¥(!v\  ÇжM1¤òŸv®”7¢§›‡ pEb¸f*oeéMöÌõfØÚã¿ÄŸ€iªÎ gçHjÄ‚…?%ï&͈<•XdXÉHñQ 3L3ì»Âúõ›©by0ú&aE¼^%7ý?›Øga»{ƒé¶:¨Fn¸ÜTÛ{uí]™"•N˜ÿ78e ’ÄwÖqÈÍ{¹·oaø¯ðýMÝí¹Ï¤Ž,&ä,E|k˜öfW/ÊrºŽu,4¼Uf&“gÛ誚«àC¿xøÞ“ÚºØîÉu.•ØË8»³Ë}J…úÆË.-žü*×’ÿ§},BÝ$-¡]w´’ýFÅ8àØ*INõÎUÄpr0%þhÉÌ!U®±ýf›s±»x¢b¼”ZÃõ¶ä1ZÌR¨)ÔÌ:¶éöÎa™œÍî…S0ã¯ú{Øiã1Í}Á dÓ(<4Þ„Z`òd':ÐS)$AÓoÿ]û¢Â·yÌC­Í—Šì¯6äù~ˆÆÀ…Wï:þ±,;n#ÿÊ@'3Z–·SÞ+¨9k`ǯÒùjŸ#ô_”!-Ü•ûç‹/×_³ï×[†Ï8«5—%· ÞìPùѪ"÷º×ìSÖÒdîˆ?Éú»Ïvˈ\@± ¦¼- Þö­l7gŠì·Ÿ'gǾW¤µ.Ú]Å*àu§«”_ÎÃ"ücͲl9N9´ ÇkIðkè¤àšDª[k+ûnÃ&€¬0h›@‹›)H4Ùòáð´ä] bÑ{åwºBŽˆMÊh…jÑöu7Éð|˜ô¹u*b·xk†kFgAñkßÑ+YA•/vžm\-YÓ‚—Òtj•yŽj@ùY9nQÂòè÷¸ ÖJ%Vï1bü•ÐÙïji=íïïˤы*™TÕ$„¿­§dÛÜ¢eÐEÞ%êpóš3›;pEîU‹[,x]á*vfÁ_ÕÊàŽðß-Õ¥Í&0ûxûtZa‹»Çƒ ¢î&ú>ÆŒ·D@[±‡ïñÓá„0?ü‚NA»M)´ºNòïqÖÛ£‘èîdÔ.gΑ9ŒaÎÙ½h=ÌuZ$÷@ÛøJAÿõ¨j%^MpÂ*V©äÔXaµ.}ñ¦ÜÒ܉lóÖK¡HÊhÑBµsæI^žçb…îö²rƒ [ÉM…ÐôÙ79øŽöƒ‚Äuj(›ÓôÜÎáË"¦3úBø<Eé|h)ÈPò/÷5~ ¾š!œÛwcL’yÄCRtÌ=£ÞE¢Tˆ¾ èÃÚQQ[÷+œ­?wÝ„p_&RI¾fEÕAÙWcèÏc¢UÃwôdcXÍ ØÐÄõÏ7í¿Fð±Ç’W;Á½ƒªÀ E­Â–S>V2”ŽÅ!]’ýŽFK­2Ê€•}6ŠÇzÍú#EWÒ‰\šb–½®‚Ùøóí'3fÏ'®IÚè‹ÊAdo ³´×žk~sŠÍžUÙÆ¸BkÐÀµ(Ï ð¥òùëÇÿ­$gL>Iéºï•Æ1•}yÝQkÌ܉¥Ÿª¿É5ßò›^•f ‚ƒ, 9lŒpª§€»Px%ÏÀµW¸YGó[$±xçWÙ ù~‚ú_O?]äMÕIl3©/»Pø)ûNûÌÍ‚ÜðrHiyzóY¨sˆÖöæóúQóußž»M¸…z3i~Êќϕ{í½šô¥·EêÁ#þ9¶5ö+þµlÁSsÑi ÈäªÕ ³¢âÒYönó_]ˆU?kù¨F!L"áu’-y*™qüu˜&JŠrxc`‡þ̓-ØÕþ_ßvÞ°¤„Ðwjò3Žô¯+0LáBà·>ólÒì«àRÂx¸—±b.ë<¶•]ˆå’îà1/ÀaѱNïºÛ¹X:ÎF <Ê"%êDúygˆvŽyM ¯|vnLÇŽjÁŠ\|»—ÂÕŸDû,6Í—thMõ&ì!Lº [Јhgpa/ô–Æ ¤øš|ÿz¨º5ü_ô •¯Á…vM”ÅФŒË¥Á‹=ñ°¶¯$Q»âËB·nXöæµØä¥DÖúßEÒ¦—€>šól¡¯šeóz‘qÑé««U©ô¼4Ë ÿÙ%pbOÁ´çW9m ×Ðö~cÐQPË-±KÈPÚá6+Üöûî1ÖâØãõ{ȆC>'_íÜ}œÔ0«É‘Ø×S‰Ã/È ƒêÇÛ7Ø–”Íב½tžÆÍ£™Vƒ ®ã‚áìü¯É¿ßU¦²Í–»‚½‰è7g«&ÑTOعD9É Óâýƒž‹j7T¬œj“AÞD·mýSò™xYþ뀷B=ôþѧ ¶Ê–¦sî}óCH'¨L¶$ªC˜ùl»:‡™áñ|Ô\Rê#Ìz2@¼µ#ì,0‘Œ¦…ž<Ðnµ“¹N¦bCÉhÊì €NŽ»†Šÿƒñúó›TÀ pÖÛØrqn‘éÃðj<°õ¼ä¦ãûXÛÌ+êôf¤‹øœ2N=Ý,8•TJr9‡:'!ùéÇÀ×­í¡ÅµÖµ£Ç Y ”8ÚcÄ›‘Fº>#·Á\«3¼Ï±Ç&}”èØA—¶ŠMìç7[÷=wî¸%ï>­Çâu±ínö9:gàÆÃRËÇ/ËßÏ‚Èʯ¦ÖöÂë‚L%¹ý‰Y ¿ZÕ˜^ÑT×tǵ¶ä—@×ù¦»ÇCtÒ©W2Ìþ%•¶1OÊ© 'R¤«ÙØPwœpPY‹ä‡¸Är¹èºTé*sgJJ"¹"NÓxn}²¥Žÿx”• XŸ³.œ*¥‚‘’),ôéÿ³i˜Æ>j.â;Ñà ¡3îø°ñL‹ØK•I™#¼2Ž^u󉟷¬ÓèÛˆ»Þ$}½;øÕ|Ýþ>BížGu¸/bQLèû2\ëlg„é s¯-[˜Þ¼ìƒðÿ±OX*²Cl'l}b&EådÛnƒÏÝ…ÏóZn[NYEtK1™«1b—Ú:¯iDMK‚ÌK»îfjÚî0›9s'?DöIškv`êð˜‰NÙ0†_%ƒN}G•År³‰Z¹ª‰³ýÕìGªfëC7\,ͤª]Ù±f„>n¶s®·¬b{¿K9ã/FAP€öäTy-b‘è‘w–@Îî!‰L#/õª.“ÚÏs…M `¾ '>n*ÙÖ’¬ µÙDBx¹\¦xÓCǯ(_$Éòå8™½B:G›°vƒ£bý>ÀnML—NÉ+äø%cï=ÉEåjH1%Z§N&x Žþ ›u9C¦åÜ©žàº-X%Á4×å(L©-ÝAXnr÷ €ïd­ø=ÔE"öå`X’p:Žy«úy£ÅèS¤Õ~ìêBéùvÒÖ+Ü¥dµÛK¾U…4©Ori´/ÐbBÊeö]­Ôíšhýì*‰Ïý™Ê%ÊQ©üñfæ-3g7ÔÑR«Jùâ •Òš¸!“ðŒ8‹ÑÝ^Jµ€3F²…jºfTx[–;µ›x1€yÚ–—ÿ…D)Œòd{¸i9ƒÔÖ8¨ÿ³*Hª»œ-ßׂu(«7ý1gr¶€ñ+¾ódtá…•6¥<0Þn,€iÑ4ÔÆ„êxÛÑovO~Ƭj¤€pêÕ®óÕRó½#%^+ÇIFAh÷ù4 v/aÇ¡Ò É´W= «O!°‰eîή?ÅÕÞ½ÚÈæÿ÷­böw'<~hxÐZòÊÿOvgV`†Oaf“¸Ç{y©;«C ³2ÛE¹ ÊÂàmì!©ŸíÎ*ã›JÎ9¡Ã8¿V3Q-·Þ²o±É–çïÀÙ;ëg- z½^¸W¶f7‹WÃàè0ŠM1»³åè-çd¹S(¦i%”¸ é4Z½SVoûJóF‚Kn0Ï<$­frÿ? &Äk¢ý»²91›†ýÍI˜tBš¢8ÂM™kmùq çˆÓu^6o–AÊ3OEô;™9šš1þ–f˜eŸ'™P—Ÿ ñ7ð#(.šÄ~ 0ùAoÞÍÝî°Ÿ°(Ä~|Ö“»M¦õíÚt±U&„Ô”¦¸ú×ë®ß:ÀPÙˆ°~çsn.¨ŽøiiŽBùýó$(]<™ö²tþ#EY;úò (ßsozΧéM±|I‰?,•Œ5&ª4…ÌoRìD]Ø5TyÙò© Ñ\zìÝ.¢5gÅê™f-ɯ~5¨`û1Y´Ým·_¥ØÎ×1}g‡qxîªÐœžµp¡|DÃܳé.3ŒR`KB{á ˜™ÿ[7W?ÐÀE!:Ì_v/ ´#ö\¼ú}éíhE1>ýÞƒFŒÄ Õ®E|+¾È|•碵5B6]íDrÆ í˜@ÏÔ\Þ©H•Üh¸%–:8wÔ.ÓJyÖ•“el&¬ñ€.ç ¡¼2vÈp³;6e< oøô­áª€ë»1A²ñiü1U9—±’Ÿ÷ß¡`Räw++ Ùü´’•ioØ2sc0 [ó>¬¯ìg&ézÃMɉ÷H@5FhøĢܾgiO—ï¶–¹àm9m/ÑÁÈ—”؈¤ˆ§€’] Ô44èX(‡ë¹kO‹Gc)\->':vAÏWÝ÷ëQÑÕ…ÙDþi­[œ4nÜ3½>'±´¿¶Âá?oÁAé£fîAÙ…×þLå*ØáQf,ã`>Ô‚†+ÚCøÍ¨ÙdrÂóXÆv¸_oº ä7ÃY¢×c ïI÷þ:B@f àA·f*íˆS”eI= ÒŽ°>V!2†6öä,%x±1¥ß » jÚáøóT ÌgXšç(SŽuà±ä¡ ´O_€•î 4£õia«ßû§š “OSL¡ñÞ§èѯü¿uËšîð¾ÆB©ÖO6`wVóJ6Ÿh¯ø ä÷A¶=µÁ“œÀm€J8 áÀ&§t%FåàLÓIF§!j/3ûœ¯|U7Ëÿ“+™Á÷!ª•3©'Œ.¹1èEÓ"½1Ì#É5‚ s6ùÝß뻿À^.!\<¶Ó¶yR±i—u.–HŠÌ¡¡}Úp!Q\ÿ¼èˆbTi~qT´h­êºÄøêY Þö¼¶ù\Æþ8 ¿Û¿ü0õff…³”™óhXµl@øK`b@y." 1öoxÌ®d±[å/E`ˆBûóÑ Vk…ó®–âèº$¥¯W}øÙav‹á)´,ù§.̼Xiªkr·ûRØsú+l8HÓ†£7éuá¡ZQ¤Ä>lª¸†2·AÊï '7Y’ õ¢=WÏ$=+¬Eè*OÀûã}¡óáÐ\f’ê¬áÄÿáR‡¯0ÙsUû¨rõо¹Š $TòØ´To"k('“]† ˜Sà Ú@-Ý0ï°âû?—°øÀSêM´@Óƒ #U݉ Qû ˆ-èÕ:U$`—A˜ø¿Ïàs­â‹ncmmn"pïÍ®3ñtAŽÛ7Èʦ†€^Íw2`Þó0LýúD-çc€V€Ÿ ë;nhaÌ;ÿ d©>9¶ü'î¿—lÖXc¨Üî{Kõö»}e½c;½ú&RYiM’×ß9Át‘~͔Ҧœ™É IÔ¥T‡ãþb"t³ÓñFí—ÉqüY]©z¦Yª¢¦.*WÏ&Ù82xæ×ȸјÌK†e¦¡C?{üç ’ûÏîXfÚt˜ÕóQBo¶ËÎ=:M äù oô§4Oœ q[WÀéõµ†*Õ[÷ÊÚõ»¢¿aÀÑpð,"<>UÀ>À¬hÚš´þ²VŰs´/ÚE÷99°ÏjnìvwªköÂtƒ'³8¯ÿ/;Ð×€¼7ÍÌ;‰Þ‹`FdŒdñ+–\þ&EÁ÷Þ{6Y1ã!T…6ЇÐôÍÅEá ‡ZÀk4±ZtH·ÿF¡+ù>ÄQNb-•ßR1"åÃF¤U‡—-yF¦Ž•ürÌnšå˜<ª‰¶ÁDÏî ôJ¯ÀdXSñ‚™£×F )ò¶†¤ÞÑ7‡•Jئ ñ„F°»©•VÁ¸d¯êuæEâæ'ed(º Ù=6EW*ÈçU,¦ú‘KeÍ Å[¤vìÉ|’úˆÜ µe>ôëÐÔg\ˆ_ç÷Šx]²{îPš)çڧ¿y_L¸´0<$¿›bBUn5©àï[€ƒ%¨ÿž^Tˆx’ÚˆPR Ôऀû%(&ÜŸ;þ»)Úñ‰Ï¯õy„÷W¼1KÕÕ’6 jÄŒfipÀYJ°µš¬¿µËŸú–ô*¿ÑK-)þóëÂÇ;é.MJÙo¶÷ØÑw`d¹ÓãAL¶\yˆ•ÏàÐW©S5‡¶¸¦ôê <*ŸäÞ‡8ŠÚ—iiþSÌdQhßÓ¬–@VCÖ>]ñ3Ó¿À?›—jî¨þ®TñìïÖ_1sj7“oJBíÎEgsS´'ƒ¹ø)p$V7pcŸ[.Ù"m¶K:–v[M–_â>ü†À嘷³?`TÒæý£†æßBíÈõ5\%ýªÁô¼[z8¨ÔQ„ûy«íæôC:²ß «+4yô¥ Ži`þ#ƲØÝü·3ĸjž;5€Ö¸4˜V:ÆTÔ8fúk«ó$ÇS©BGá°ÓR8´]ÿ_Q[S:'£fµ®®„Ï éûrŸ{ðNßÁµºdÇt˜ýw¼-÷òåFúžåÓ^eÚåÒS£­ÿ8Ç‘p¼ч|/*? NwIo°P#÷…¥Ö÷iûŸw JªD+-õûz%Þÿ+‹ÿÒꇯ™Ëpt°_bS½–e’Nü«_ ›/-;ÓÿiòoÏ®:w—Ïý¢ù¥¤Ž™³ƒâ MUØ‹öý4¾l #²a¯K/á~×KP—õFg@ e¶Øµ¿xè+™ÔˆOlï63{PåS½‘Œô«ÞÁ¿ÁË=4±gòüÉ>`%Víûýy°¾»˜lJ¤^³\í¸7o!`‚ÿb$âp‘Â>Íå &’°ŽßïZŠVŸ‘˜ X_8Ý8ðÜ R)8y挞準)ˆ¥"ÉÜVÝý/wC©â Wù1øÜ=C…@¿…¾,T´#µ®ÕÂX›FRc’Îç>ì‰ãe]a+õP°¶Aùo? W¤VÓÆÞÕ",à–%q’a¬–ºÁ ª)_•±ˆ«˜š£Šˆõz[ö–àGÙ,skˆ÷ËóV×ø÷ùÆNñåé.Pvb2·,õCbÈ,¥OcÒv¦*Ë_î±UÖ€J'%m8ÀpW¹E”vêãÞe¶„Ю»í>[ÖlŠˆâ¦æilrðPØ@†ÑŒKP:¾4_mšx«ê•Òåô|g—¤†…R©'Œ#zÆÏVKkI,Ý¡úZv¦RÂXÑ­°çÈv iy™sŠzÍÏÓì`/ëÉœÑP6RécÜêd—A+<"̃ù¶vöB—¿ìÉïÆ‡§sé¶ÿ« wÛ·öTþ+ô+ÞèX û&¦B) þœa^h(³Ü£Êã¤~inÍ¡6õéÿ>#]'¨G~ƘŽ>Å·Ä\(µ½Y¯*o¼ìhä@½$þ¦pÿnSñ"+§XhÿmnD¡äØ|ü¡‚íS{]”¿íûE37Ò2~ æéK-9ÜœúhnÆŽlˆ]Ò´áùèŠ{û³ 7©H<µµÎ ƒ+û·=)ÚÛãń˹€-Õñ ø+ã“Ü%XÆ»åsy†5IÇ“@’’2Á`úèš#ð0%+Ui€7X˜ÖâýNn])-Íì¹vtSѾ©žkªl\ä µÇ=¶îÀA#£µºÈ ™_· g DzpÜw–]“¹6¯ ú\ìŒQæpwÌiáÇS³²`náh„vqÑÏÊ[Ö8'§4¶`(Ù%/J•ꔫ=VnƒÃñxñ3k ×0 \£Sš ,OöêL–8»¢;<:krGXóOÝbxd)_•ücÐ…&áïÞ 6 éNJˆqî0Õð]!+ïL‚û¯‚ÂÚgQ7Ãý22N%ã¤Ø®¿qA{nd÷Nþ_HCºÉf»¿ÿ£]}\„çNm ajåÞÄ ž\ÐÆŒáõ0Þ%%.³T÷ÇnÐõî }˜/zÍÀ^æšíCËúÞø2|èçKÑ»ôAËAÞ»Ûè‡]*C`ÇFŒ8‡8ìAX ¼ ¡0†ocä µÛ›CƦçƒÕM)í]º_'~kŸQb¶uu0Ë’¡Ú½……€°¸ÝªXó-Ï íh•_‰Y’CüÏ í<®ÿiñª¢ú*#n;–ª3v´øàî”ÞbMÛ|³V Õ³¿6—fU|:Ê"ñŠ´Àä` ®1Ð'R6 ¢ëÓáî™à d#œ÷ì@I¨œ(Øý䨆ð]˜kÕj UE¹ïãí(þVµ¤#öu[TÌdQ,ŸG›$ådžÿ¯ÿž„ÙÊP’xˆr\HÅcP&•—ºŸ;Æ)åÕ{»p®qpÍ—õ3ì"¯&;S;ŠÜr skmÉ5ɱònè['s5Ùçüâ<`¶~2ŸHÅ[Ý·Òwܨ*ÔjJbËœ5—ìûw(= Ã"Í ¢]‘aÌ'9  §m5¿« Cö—I#¥…VÌÈÛî^NÓ°Ã6ïÞqRD.ÚÏÁŒbÀLZ t•&MˆH Òéä¶[O-ªÖÓÇkÅï®ô%ÂŒØÚf]7€Uÿ£€åâ3Ù+ã  ·QoN©"]Ž­"™Õ³¯Òó(òjùøxaÇÇ©LAÀHó–«àQÕ9Œõ3 Œù7Ò÷ËŸ¤Øúf©\ໟßÀ² ÀKð¨tâ@~‘Eˆ1Ò&†éû‚i Ãà6'~ƒÝ:|0ffù9Å•…rŒ¨lñU¥Æ ^n´'w9ÕP¬j2z½Çû?rÈý‚ôa£¶[å%ÔjQKyVŠêß”uU¾:?Þ?ûíÁáÒ(`+š0öƒwõ†FD¯0©êS;hkö2T‰íM²g.Gúq"R¿è—‹ÈÆl W&ïYõFŽ´ ½PØm±;uòò‡WÓ#ç·ï}ºv¿)¼²°šUGŽCý¶‡ Z3ð&“HUxž¤§ônb—êSF+ëž©a¶om] v”}A Eן_b=y2Ei&ŸjÔéೊ>2½ô鱕Zs2 …ïÉ­xˆ”biUc2ÑÙ&äÇnú1 æÑlPjVØ:¥´'ÎÔ1ß]ÕiÌêà½EòØÞ´Gþc쓬TÆzw7µwìW+ÞSc°°ëpØMÿ˜ý£Õj‚l­øb¥”§XÑDØÕUžä}µƒ†û‘ôI/pýWÖÁ sesÒ’¡³É<‰i¡&b3ÄG¹²œXnQÔ¸Y[ÙåœÝމDdhËϹÂ@vDÍ;®E±i,ónš⊓¥#jý1ƒÜã4ïTPÝî Bë gç6¾SÇ\d[¤r‚1šÞÚÑÈ"?¹€ž( -1oOÓà Wõó±­¢B1dGUº:9E}ÄÓ¼R~Îm/%BšT:6]Õï¦Fj£yôúF€©ÕŒZ7ø¾·9ªÉeŒ Ç+:Kbƒf‰ ÑÓðzp­¦ùˆŽÔEvº\¬'#Ðeñ0{À‚÷$îì©~÷pc™½æXÍtZ¸P]ùLi±¯"Y$†ìzh~1iT<¡¨<°Ô§a"* ÒÉÄü=™Fä%Oò©¨­ Í…žWOÛÔxÓ·™ä¸¶Ërüó£q7ËÔošâo©Ðþ Sÿ]øž–`¨hP좔±ÓûY RO‰:¦–\à\1-]»’53:%61£’Ç«Wâ÷ uiåw…á©N„M>KMùH‚-­!y™fãkDu iÈ©9(Šl¦  ‚ú%`[þ. .¨% XS ¦½ÛXòMIz°nÃZæ)‰¬w”=I‘’ pÒœîu8ïV-yæŽXæC­×mW½ø¢Ó©ouÂ?'0° aú¥ÇXäÝâˆúT=¦=–­ºÕÿ]rK‡¸úÀ»ãS^>J¦ëo šá¹x(Ч„z5♸wþËò³z·‘«÷ž7Øû é0;T&Êš¬"j`@74õ°«ÓÖY”‡ÝEEgJ@ŽÔ2è”P3íÌjÎMÿ4˜‚~r¸DV¿þ÷Ìb}èÉL'@iÌðD^º4”W¹llB ^®ð"Î ÓVŠ¦á„ ÈjBïÇnëÇ|Œ­R¦só‹Ì]ÕS$:œòõ=ä;‘D|7.D¶RhÔ¾¹Žú¡îãÚ$tÑdìAåµù‘ ¶´¹ð~4óQøLte~—7kBµ?]ð×'?ÝV.Õ,˜lã÷…³€\žg^ÅWR?Ë̸/E }±)\“õWK|m|{(I/ fµ#~U[eæÏ5FEYP/†>ÜS º›Õ¦™ÜP¡þŸØ2Q:9‰ÑÆó¬°QôôÊ“LÌ–@ P†¹ìw»Y\¶ èh—ÖJ8öò2±ÓëÜ&#þ8Hê·”âb´ýfäœ:K>”Ø y¥ªõ¯4¢„PP¥omô/iš†L‹‡Q²cT½x¼šÌÉ›Ôó½k‡}¼$®;>#¬+žMÁd*øXoë¶7¢´v/ªp­-vÞ‰QÅ5ÁÕ™ G’c@þÅv0 Œ¿iÏï»=_§~ÍQ»ò-{¯T%9¿‹ƒéD sqI!’OJOtŠýº0y$ÿ]Ðt”QG½ç±n¸¬ñl›*ö™ à¹XÝýÒDÀˆÃßÃùÙ¦Ïì”ÝÍv‘ÉD%RErÑ—J;zI›—D)ù‹O[ÄØÞÚ>‚Í €fVMàÑ‚6“I峂n6 oÛa¢wš„ÁÚˆïÞ½âv!=:þÛ^UPZ¤„äX.úd0¼Ç©Ðº°6v¦nIêòNš‡ xœµ&0{駨TXZ´äŸDó3÷Ÿø&a>]ãOH2ZAô1§Ñ•åè\šàñ?$jrœn³¤æ¨…lnJ£û×Z‡ þk´ QýoBÖXPõÆâä< ’M÷}t–ö!½ˆûð%%Štź8r¼£–ËÐíûû£Ûÿ£”å§#j¯©¼2H}zçC®E™NÇÄMá%÷§}e/¦‹‚¾þ+U}݉·v)x˜ó½|à-X›.yËZ ¤æ/eæ²–>õ«šýÌÔ’¤’1¹VÄê:V×»æœ[ä>÷þèW¾ÓU—Ì6Æ[9*je(´æné.h—G*ù­yh<Š[Ç"\°DŠ¢(;µ©á^|?ž ŸyèA€:­;§Vr›Õrį@ç˜õ)«ýp®Püß ÈêðÝà%—©ÉqgüþËÞÐÖ2§*ß¾›g€kW£Ý2¯\[T?´®e„)³¬[ÏÛz.ø7«8²ë-HHlv Ñ„‘ü8&C 1om#ÞF„†)õ>‡±Z/矞us¬}оROØGØJÔÄ÷ë3­%¡hN{)¹EŒƒn>÷Ûv 1>”|™Þý¡þçã¬ï´qVx`8>0ÿ7¤®qÎ×[înÂF†\@’¾rtœ÷È ÆJŸ•¨,ÃbÔè ÒP‘ÐÀïôg9yïDAAhü Σ“PFØ&!ý{‡Ð Ö‰ø¸/)¼4¤‘‘r ´Ìæ˜Â ªw‚hTè(^Lì¼kU`å{§KÔŠoÄk»„Ê7“øxÍ6ná$JõÆ¢T’–1 ʉ…ì—M¬Dðm-òÈmðâ‡x ÷«gZŒDÇ2æ?„Z'˜‡•öäy0Çy‡X¶üº7 J¢åïžâÕ7ÔG¦>µQf8Ü×Ô vEÁ ž£ÞM:ªeÒ¿ÖNaÄo/ž£“̨[÷@’ÃR˜ÅCoYæŽÑ3;´KÍ&ë×÷jÃw·#°ìÐä›VÌ«ÜUd·2Ã4ãð†2 õ]KL®ö=nKŸWש»Èu‰>Ìf­íZP VÙÒh¹ßÑ•úÌÔ„>* “ã8j>Þ gMTÚ´¤„-{¶”KÉÍ…z¾¡¢ö1Sœ©ô+mZZG.Âi !z»”àÿêVu¸â¤ï½’zà?^дeu_ÓõXF‹ ‹AÆeêòåå—ŸCõ{*êwâ.±zªõ&¼"@mѱe©¬-¢¥ˆô:›1[¹ÜÖ(T"·?‚$ïú¢V¼y5¤þeIN†R8æ{ ÏM–¬4ëÒ0<\¶+žêŒ±Qì±¶‹é9£aœ!‚X•à\ŒÕð&T¨%UÉÒ*÷ò[ßÑÞ4DÛÊ6ñ^+Á£gÚÔê½Ð”Š©Éà˜¯ñ\ôZ–MÃJä'z«@Ëê3·œçµ`Âû™'u¬çËö³WõÕFHi{8ªáµ?".¸Oy)LÍ„W½‰eF…l\‡}1 ëÒ­e,]›˜Ä4 ùDìÇ*Ò`à7,•gÙzIÔilRêàú(åÈ$òz«h£”åÖÆ­O¯¡ÈüOÊúИOý#¢¤Ñ7~õÏ™äõó++·û„!'mýå´ÅkªßSÖëû!ª‚B®h²eYA‡3©qèe¼A¬ß©ÇÜ„i¡=üõ£Á鼎òæÉSl¶óŒË<ðdX%¸èFFCõ ã÷ÜlmvPá=ÉB½ˆËüû£hÍóÜÛ»­[÷½ùf¿cá¦ùÔîAÚ Õä\K]Xiè “ÕŠâï[nƒƒM®Îð"'HEAÔVÿ9Î*Ø(Dîµ(è\SUºh~ӌȃSe‹ŸÎÇg†Of<Â’¹Ñçžè‹ªÄeÖ6¶ÄXœ4€èb ¾íŒS 4©yáú Ëœ„ þ\]B,-$ÏmµÉ< {J%Ôœz?Še¥Ï˜ùÀ ø©`¦ªÎPc†kx¿°íÇJÐ΢˘ZL«àËÞe9 ò)ãÊW ¸Xž8 6‡ïQ¤‰B•B×çãTÊ`K•÷ƒÏÀDߣsHFd½Õ~ñ‹Ú¡‰²p#LKDHÛ0øŸ¢—¬¡)¤Ä QyüŸâûûÈ'ò»ú{˜ œ¾Ï¼p†u+­Óäß9Œ\õê³òDŸM¡—ã/拳ÑXS¨…TlïJ_]+…vvÌïƒ9³BnšxE1Ÿ]+×§±%íϸ+šûøÕÎC1l^®ìq©Ž]È¥9°¨¶‹dÕ&»¸.µÈ½xrk6‰G‡¸S˜–õן=~ø†’6^oG£xî†á6¬ée®ÌÁ›}‰)Ѓ^jmž ævY¦Û;˜h›Xs8qÞ'`obë­15‚¬ëî’ÅѾFmät%GÎþømÏÞ‚§ á¤Úâˆjê¨W fѶQëÎß9'h SÉ«møÁüŠ«â+É`Gq8=¹‚™6ˆt_Xj)M‰° K_å46µ9±PÕs¸äú«X~¡|³é؈“e1T‚÷ºIvm‘ç7 N`ºT(|²õðÞÊ4 6Ôñ: mT½u%!Šø-Ûa²,_Ú‘Pñóm¹e,Žœ)ß\mæ/±¡vw;âYð¯à(Œ*;¡UN8YE«ÁyƒF=jxÓãRÝpnR›/müZWùlqõÚìf¬ƒ˜é¸ë¤-S/¤ág÷ÁndU_–²á à/ vLu»­òE•ŸÜ6÷9'Ž÷¢t©ÚeéZ«Ûj¨šŒ+5+×ñƒ©W>q¸¾hæ:O'‡\£‚ä•ÂŽ0¥²Õ{À˜`Sa½ÕÄ©yEé}êÆ")?y¢yu`BúFf ˆéˆ\º¾%þø¡6Þ7Ä:oŠ%6¤®>ÏG HUè„6œt×(»Ÿv;0JšqBB¡ád=Áµ¥3»$,EeË£à,—øþ ©V ÜíJ¯?ëc©À€#š ùþçË–VˆÚ@MñÚu%³½æÏ eŒ‰Ì¿Æ ýÉíúZGƒP?†¸1Û"í¬+øo¬‰\Ìþ)ÌӪˌZ~O¹È§b–@÷épllh·óúíÕõIxÌûcý5‰²®»ÛX@¢ÒÐ̉Õ×ÊkÄA¼¨lœ¸ùý·ã,êâ©£ˆn¥·çß»¯L/„Í_–y^µÐ¬v¸‡ÙêG±O2¾Qö‚ŽBñŠbxþ‰Þìð[Y¯;‹å¨ý‡L˜¨o~©,n¬OZ‹‚†›õc­]s¶äõÿªx¢â<\ BÁíâϨ>ýÍ%5X¯_(&´®Ú‘¡Ñ!2f¼ZD«2_ýt.„B¸7ž—Þù¦ )ƒÕ‡æ=­°­\ûĬ)W4DZ‰;_xƒ0_|ý@¸À—#«9¤Yr¬"Ì¥É^ÿÀ¼æA^­ j½xÄôýi%'½—Žãà"È£qÝZ@‹éGdzŽ05jŽ-KûÆ6¤,j‡—‡‘q›×.ú¢Õ…:°íG«H¯ íËM7vs¿µà²凢Î×Ožñÿ÷(Å^qÆ¡ÝÌ'ï<ÛÎ)ÊtE=O‰ ŽÔ¦÷|Ÿ6Î_´RV†_¨±ö¾z€Üs@OJÞÒ]ضzÓ^jü™²%6|ªìøyÜ|ΆpB(ʽî¨waQ”²Ï•eÔÀºŒ²§†µ‹µPÌWÿ}•Òȳ®‚@‡©‘­ÃPa–”F|«b'ïuåVÈ9†oD­Pq`â}Eº?sÃvGÛ )µG1©H0è~š|^zÁ·Üؘj,C· ÄOÏ&¡[V¢ÚÎ7Ï­W'Õ> _‡O¦u­‚¶;¨¡:’žè¤¾3",ÀôÜ2ø3®Jwâˆ*{Ð.p´TóïµïGaòõq6|¡ô+-eFcxÚž¼Ç½øæ¯µ6SBì}›Š£æÛšQ8M• Tq±Š]:üœ2™iQ ÿÕ¶‚‰ŸÐïÉ·#c%¤/ò†€äÜ@c’¼¬cïŒC# ö<²#mkÞ=Û8É©Éêñ¦U2¬5Zl<Å 0p1œSŒ¹>oXQ§ìQ‡â£»êf°äÝ]Z›5Ô?±qÚ5‰º¯¥^ Óß:ûf}ÞæÎ $ÎcãM³4gÙ 42¾ò#ñVkñÝ>dÕ*‡ÃHŠnyñù‘†M3ûOÁ]±õ–4ÿÏ/`‘-Ñî]8CC>úÿ˜ÍÏ«àË…–&aMÓë”/ü$@‘¢ èL1ÔîCù1œ¥üþrn丰'UZ-d†)&»œ}Ks:Nù2$iìfÿ‰à5·tØMNzXjRǪ¿ñ?5à)þEÊT°F-˜çòtQKrÁ6nð¿ŸG§R$×7°0üàÔó‚Øö±.dê»âÃ|‹–¼u¨c»ˆ07´¨5oz}HâU·H>YÎÃ(¦-ÑHë-ï+†í‘¼a«ïdTRþTˆX‘3jÜãQèѽΛZuBÂz3!<ñóaIÔ@X»º-ÿ;PÀ>S¯íŒqœu8³¦‚àŽMòχŒ=Ö‰#ÏÊ{cpš&´K(ßbß×V#htJlXgî€Î%â븡SGq«Xâ&vÜ ò¬ž³¨Ø‘Sf¾A©V8Q?½‘;nyiÓAî¥ç¤¶ÖŸ»2±Qg¶‡ÐŸb· ®aA­Ñ_À²àSçå¶´k}Ø p·ê .º7¡»Ó‹q3¢Í&4òä›þ§”ÜÎ*üø`„™CtÚÄ jg¿ÜÎ|˜-¾kµu—ž/žëìOD%kÖäì<ëÁ8¾P`ti7,JòA)9V# 1Ù¶åÙÕ•·‘Dé—Û­î}¦€`Yò\³‹Ћžño, PŸC§_8®°ÃÜÒyV$ÄX›€zcYFŸüÓEŸq*s¾ð5àŸ+Oüø2crcKèd‚Ó¹döV@¹KY”øìöÑcSÅþ´‚’|—h†Ý±KÊ TÔL52ôò¥tcÜ*.fј8«ü1ÉŽ"'¿›îDgråyr/R§[(3LÞ`ö¦WàQªpúfkß<ÞÄYPð§ ç:xŽèÈ8ƒ[ÜÊ“|º¼Ç“vDmgÓÂfq‹Ìbö“6J`!ÿñé9ž;~C~¢æp„;RÁ){éz·yËXÅ«U»½‹¿¨8Ðg†BL3Ô*$Fÿ,½t¨n"±Õ±àð– #ù¤àÑ(é·ž4\T3‘\_;nX͸L @•¬RÌ ŸºøJ‹£†ÒPäyã¨ÇÂŽÒÚ—C…0]ô‹¨çm<üé}ß…ÖêwÅߊ­*˜z_lÑM¹ä |®y'5’à™ ïÍ«cobüé¤%¹U´Ïn†NVÏ[ƒ~×…”[uMè,õù«,Ñ–7W[[ «µ“®€¹ z¢›¾D°6èJpmŠÿù0ÏÈÙ’+“Gôð;æcmé× øÿ‡×„nbš5—tÝú€C\9VÌó9a[fÄ'Ú#Ðdî7†’$W”^×ÅÚ©™2¨è°²¸W³­ø#pʯÄ*jášå¯×Ò±÷)«Ž (ï»<ö§Ýí=‘Íf^©Mƒí})hÙgyôç ‰rOØ96óóAî4§y¯;c“¤9Lrª'$ø5ö¢¸ÚQû‹c༟Çy¾ë÷½nÏCAÆx#s]ßÙ`GW;Žö*”‰úÌÆ;6düT^—˜5Òv*uX"nG„¹1ß (ÑÆ¾KHâØŽÅ”_E¼[#¥wKB°™Ôxï¿|â™ÙÄðÙL˜@ä«°«`£H¯°·G²ç)¼=¡‘|2ùNxq@\·ÙngLØTË€puj ¤§OÒ=¿l·qMé7ÆZZ{=…sQw¹k’4Œ% «l¶1X+N:¶“ñG§x¶Soµ°ùí–ÁÅÏMT¾åu@Z­(±w§xÁÀgŸXúGvC±v3@ŒQåáÍfª@¬ë^•*‚ú–VSäí—/ àuÿÐF 6LÞtßDˆt¥}ÀFŒI¥R@°«nÅ€uQƒä¸Ø¥j¯‚ê½gļâyn‹åŸ<–¦à#vÔáŸ÷$þ`ìôᥠ.Üê€LR`}{ê~µñ(s#öØk9k‡yp"·e Égc0½fëy ’¶€‰nÇÌó zÌb\+‹Â0&ùªnÌ €]0OäÜÝßv*VÖÚéš´±ù$…ÿ.Ÿ)üõʼnM%m#ëdVà0A0WÄdKäŽÊÂÄF°7ÿtMÃþh"‡…v„ש ícêú¨“yMƒ^ȳeç³Ù#Ö–MOf¸4jÉhÁJaL“˜a(t–Ç+Þ#ãÉ3Ì`9¯ï.}$*Éf ÁeŠå‹@|ïÂäÝö ˆ$k³°j ÂAiJ輇Hö*Nñªm—Q”B=­y "Qj8Ïì-z[t@Ž=)ëšÌ¡$Kó(†õ¾b{M„$µíiF»¿^x{….­^Ñt9ñòþe4b°Aéõ±^ðHrµÓŒ]Î3 zp‘Ø>‡±égONP3ùôµ‰T5¤Àc«;Ÿe®K´éêô¼[q ‹(/UìdlJÊ-¿oy…HÙî&(H|>­Úxø­^ØIsÍž{Lþãèd a.ß¿¶uÒ0ÂÊÎ }Ú`@VPHÜ9*ÅÞÔbãçªÛÓEݰ"o›§¾FròÌÇYšç¯\I˜oò*øF¹L¼žnhã‘ôì8ÊŽÝ*2LU°cà G0Ï“cÝú]˜^µ¦õÈÇJ¤j¨©å^ͱæÛzeý×€Z jÍ®•@œ¢Ôê)£~`¾lÃ<ô2æ0w?É^ò>Ë~dÒD,»à±s™ KÆNê'\WÂbBï 0I„%:ÄÆÜçgÔH&rˆ´ÅÀXC¢¯ª™0˜×‰îO¡Lã¶À3Ô¶ú¨Ì®ùf®Î“™ú92v#¸© A ;&7 7u¡LðJZÙ1¢$P·ªòED"×Ù ‘DÞfÊ^®Vrî•Â/Bâ\_²ŒŠTØ\”¹ÂÛ/]•Xð?¸|¥-=[®€õÕ6ˆÔKÉUûz9˜›¸ò¢Ë9B¼U© $.«–êw“ÜD“óÙ6rR»wJ¤¼ÚzÑcgøn*òà¥$—–p„TG"Ùã¡ Á2¦T>^¨xÒîoìø=¨sT©äœ2X®;™0c¹îô€ˆÛAs¯#G¨~2DðwíÕêͶ_· ¥ ÉfÑ)eyÁr[¥ƒå¡íÉô’ž¬vÂ\“jdi±Üë5 £Èub­1Bž“”’"ÿDˆf»©½„@1Âr NWFx›P²‡ûV‰#ç¨>ºÙ²…˜dÄi§ÊŸv0‹ûÇŸ+àJ'võ*ßÃm=Í H¿F/öúîW1ûD¥õ³â¬Adªå+T@øô¬ˆ™ê{ÿ<]›#1åE/¾¨ø»Ü`Ô’t3ST Ä.Ù—ŸGð|cxA©‘’IAøÐ-LÎ>˜=;ÂÈ̪Ñ@°`e¥l•ÃæÇ)¤hµŸ‡[ÔIo‰¾l†;xÐ&’[BüzŒ-iLUgÆl«€Æ$X®×ÍdÜ‘@µrÍ;~ÇæâöOÙûÚ¾›ªÍÔRÇYî$› “ˆþcÚ“00²Á=Òζ_"†®Æ²¼¸M‹ãâʘFj ;2ƒF´:ÆÍñ€ÞpwçתØöL†g^‹•áÛL8Út[D™ YŸþ²^ìR¡hdO‰Úó0¼Ï :£1 ãP¨4عc³&ì ¤ïý+=.ãX0þ-*3ÁÎÄãH¸ßÖ;ÊÓ>k®$xðF·¨ØŠÊ¸î¾Ô¡ô<*Á ÞûÂ:QjUsN©¹NYÉÃóE(d|õWÑüáÀÇ}òDXÓz í߯ü›áòS,z:þ%@$,N9}ÍÿÃÁ2vxã›÷)uŸZ£@>†õð ûäKh…g·MlxÓj Ç[Âó‚ß[KB—m\õð6àúþØ?¸k$Rž”½‡¹h]ixËÿ‹DqYø¸wƒŠš÷ýů!AŽÌ€ýÛx°ÅñPYDK{‹,¸ÀŠ$ÛŸ´Õ°Ló}6Œdl¥s‘Ñ,E ŒÄ®°]Ô˜‚aqÃŽ¬üª2r]Êù¶ íÛ0ôýzäòZ€²Þ Ax`ÁÜ|Zk°¥*ó¹?¤DG¨Šs¢Pƒ»ß‰övq‚~¿eÊùúXØ(é3ë»Z{;Ýÿ//{¯Û5P OÖì~Ur{Çð´§™’Y‰ŒŒ.#Ãì až4‹ªïçòi^8†x›tT'mYÄ&ûì’WM-ÒnZØÒþ0:/ñÅÇõ’Cžõ¨G¨3’/ßD45ßVÅ>í¶¯öPáÙ­ é:}:tG_ÑR³¬fö&ì—^ó Ø¤®ek1Xsa”eÇý%ͺgÏ3ÚyY PIAÆ»x&ìŠFG°’Ý!ÌH¿ § ~Íìý†Ú@y.l—“ÜÃÔx¶PÁ_š¶næ¹Ü7æÞå”êçæ>!éKdÅ_ù6µQ)¼ež7ï2{Wæ%³VMÁp\ úQàŽÿ\ÝAƒô’Vìñ˜|˜hÉš€1‹Þ#§2D§V¯(Ácø”¨½É9fn /$}€Ê¾¥^õå2½Å¨Î1s"µ“¡m낌|€õä7Ý‘•@ý虂¼þ6¸›(:’ÏÅ>-n*“‰9ÎqÀxî_©¾…)§º y–Î Š $¤›L˸‡#¯/†³ëÑê\áÌm6x<-Õ5¿pÂöb±qõ¨š;œº¡§IÓ:}à0ͤÜ \m3M<8QlRž“Ùã‰'¸+³0ƒ„+´åhÂ)þö³Ê°¾1ýãôz)ÎÙÓŽcÁ—Å ´œÑ“ ^gÓlÑJTòfÔ|{*±¿Œ sŽð> K_=y•´(ú)ƒvIXº âY:’b_†þeáå×vÛ(C­E¶žuRòÓl¾®ìø™ÛJˆ<Ø7ôÛð׈OÂ7Ÿ|]å4ÅøqŽVÐVç±»—¿ Ô²A¯Ñ‰PŒ`ú(k­®CD¦ƒÒ4ÇÝ$pjì¶RA7µ@mÏDÈ’æËa´¾uúk0/ØIYgÂÍ©BNþ;°Ñ_^~èä¹7JÙ¿mŽà-çngJòp,_Ÿ±Ñ™…LHÉ€b…1¿…š”@ž×¨@¾B¤ÂhyÆîÚóÏ:“œñ¶X@xΧ}¹7ƒ¹팧"¯Ö/[ö\òч„Q(„µn¼¢¤%óÍ¢fl1ÅLˆ•þް9&¶À“µ*\]Øà‹xT%euIÈ;—””s?ßvåZÁ§Wïß…ÊÞY¡ƒÏAÞæ¶¶ÌŒà2nÕÈ®•ΛU±ÛÉꂟÛdàžQÍÂ{Ñ4õ9)ÿôQÉŒeíóV¨bÔˆ½ƒøCÏîÍðÞìr@›_„„‡›o–6;£Å$4ìvºÍÃËfÃlV$?j¶¯aÇ'I¶ÌRûßÞ¥rk±©Àñß„ª©¨Ÿ¢tÊÕÙ’9­¾>׳«‚ä±È\ÐÅÁyç¬À]C‘Žºßzfì¨eŒmë–ŒN@µcJ4%[ôz,ã‡å}‘uT€/YÂê±BBTšdFÁECÕ¡O-Œ&dï+FÓ{*,G‘VœÇ£Ùº/Ê´â¹AÕ3ÆÑÄfÀ20ÊÎ:Emòó%è!@³rVš`BF Ã&$Õ·ÉÆÆÒ”£ÑûÁ²€ëE7çÖÃb²Ùõ»M+õ8À´¨Žn™y w%†3ëÒÆ}ÝÔ–o-¹œ÷Ò\¸ z­CK8”cl'à‚‚w4£A†„ø$~àûÈiúàzY Ÿa)Ú˜½çÅS¨¤p"L¡îÝÅ—EÁ€\Ó4rÿ"¼!,n‡•ÁþÄØ0úÝÄ æï”I8W0fxû¦¡®8× /BfhD À'œ˜º¢ÚÌ_ßb´QÚ*/h)ú`aíÿ]µÊ¡e>ôT7ÄAu}g¶Jô2%ôÊ*±Ú);a(>}0Q‚ 2O’7Ž»®Iùlø;¦ˆ|Žç]¶ÿ(üÀö(zòÃÌßN&½'/ƒOþenÀE¤Eš l"¾Â=ö[PúCZ60½ùl\ÇRL ˜$GQUàÖ![èÀX¸¾gäq8ïÈs’p{}$Ëyž7jx¥BÍBˆ|ðw´VTVèôb«õwuˆ¼µ½^AgV¤{I‡þLl')™³T“Ǿª&¿àþíK1¨½9FoY«¿PØMKżҖåEÖ,O Ýh6‹_-­†p–J5Ÿ£ñà}Ù†c(^4v@)tª6¢ÃjŠqªf!w§6­ÿ@­©§¢êµÕŠü—Pétøî!'ÑC²™à»7¨T~kx]΃mùeÛ÷Èï&59Æ'÷ý4•zŒ·)ãï`F§¹w£qvî"U–†ö–ª@¬š)Eœô#>Êî~I#ÖveÌÑÌS’gÔÕ‚h/ä>Áƒ|DQ“‚PÖèêBÏÆ“=J}ûÙW«U®ûcÏ‘þݽÿE!˜ü3ÕCQeêšôÒ§ Éé$túK*†’…ç¦B÷œØ†WÕ»mhOѦsrK= ”6v7~pUÀ.¬ÖÜ«8éÚŒ²F”{o©Få“%Þ\*¼špD"ˆ´€64„ÜAz7ð2ÃÚ½ÀëO ‡îÄE m’“y–¯]åÔ6sqù‚4@aŠmƒõPJÿgigwób S·­ ÿåú_ îsŠÅåL2–ËëÖe¹žÜE ­¶Ï¢’2¶ÛÏÓ=B*Çà4õOó${‰-¿/¥¶žÄ%šðmNÝ㢤¶÷’ˆ¯Hì_ *í&™£%><³Ì¡±ëú8Xm·³b˜Z³š½|éQdhcSyb¨xmüH?=+¥4Úsq~üÂSŒSù‰ÿ¹µ’£‹`‰d࣑|}wËÅì/ÀÐß–®WF_å³eVðÇ=˜?Ûƒ$å%o8¤ 3´“¨ â§Ãa§¬[¢ƒaïƒq˲:¿ñ„_7iÀ·†$rÐO&E£çÒs#?¼¹+ùH1Óp~dU*×p²™79¨äÂH´£º8YcRü5ñQb?„vÔo«mföÓånNw cÈ5zŠ:vβ–áYŽŒ»3@ÉT`¾`h_Z2þTþ4DàÄ4XO†4’Yücdi×€tjò—Öô8§Za” ÉîlyJ¤Á8Î×F—&ç–…©Äëbx™„ö¦:©Þõ…4o }I^$vòkP´–ÖØ9çAeÃ>>Ùá ®8á•,¥Žd»éQ-ˆúðJ¦´'y­¶§Ð¯9•£túõ¤H ´¿õ‘CýZBÂiAáÆO«ÉäðNFÏ\Bp†0 q¡ °tÞÄe%éÈRÊvyñ.YŸýjYɱ9FAuÿ7¶ÒÙL ,~¨‚ª+LÛÞš_˜<áŸýwO¥i2Aˆ•ÉM\AÚÀÞ$Íú`RÛ5NÎîî™}ðœñfíÉó²kÑ?“üÏ¿dJÈNy ‡Ç dÿ¿Iü°ú¡t]"•õåãIœR–qT©Íg’¾ù(¬Çï½m4òT=Ùl$…$ â•ÒQ[|¸æ6äíè–y~eU‡ c{‰´;ªÑäͤÇc>­äM“Tª2ö1"ˆ‚ØóŠ"ï¨9UÂçšîﱃÏ72¢2úÅqz°¤ýd.Ÿ*HbŠmmqÜê®<¶Ï‘7¢9K€H¾·ôªÌÆ_º4/ˆ† E«Eb× MÜßÌu븈â f;/\¿¨TÚa„}Wµè²‡¼ƒy(ºÆCˆ/Ð3Ìbw/Ít Ìôžsû^%Åö¬ýIô2ǛĪ_îµ`‡DC¼~ÄLh$æàå^o³î ¬/Ì޳EP ÈèxÀGjÌ=‰Î<¾</‰0ïÍÂ_O‹N@N4¼?‘¨ùdiŽ‘C×6 >*ëµ»d&®z¾ÂÔˆá?“ÓbÛ3ÉEvýpôj-‰Åá'!'AÇ­B†¾ó’rmýe²3y¸ÐÈ6}W¥¯ð·ÝWû2‚æE hלQ¹¸å ú–;Õã"$0+‚ )ñý}IP&<7,ñg}^;–¾MæžÂËî…T®hJ~).W^wò8dõe¸{Ë 1‘)©=v G仉 "ãßÐyò¹`ס;Œ¶CQ0F¹5:’Y,¡}®è:ˆ¾ê6›ä?ãh°)ð`ï «3+ŽCZ´èí—¤"Á*¶K¹¯}j³d¬ÇŒÉBCD?+] )‘ɦm€âÎÿ㬪iž¡ÈL¶ <öð¬a©…™m­]5ùW~‹&•8­™mBD„WIíE§†Ïˆý~¢bBÚÑ)ä†`IÓí{Hξü(¥Àl’¦Z}«¶"§Èó½,£B®8s J[òÊê²h´ÎfÈBô~2:k4ñXØ Â ÒŠÒÏ%æÿö©qŒœÚ@ÌûŽ#J^ ”œƒòY8ÌØOªªA<Ù~šáÍÅõ§‰Ì§?áVaà „èˆÿØm‹¶[ýÿ¦ ¸ûšáHROx½™dÛDPù’iw+¾"„—pÄüÛ¨…ƒTÍóŽþ-õdäï[û™Ù>^RèIÍÐ ù0w‡Tj85p ˆH‚ü㆓놓]wëPÙüëiéŒ~ªáÊU4˜$®© OI…ìKZkÔgdì_8?Nz>˜è<£Ê£#® -Ǿé»t'øö™ÄÇ‘ÙÙ¸: ­X¤¬mrg%j¯h+n¶\ºSìJ+”ð˽#äx,Emàõ=±z€DG\òÜ¥jŠs‰ C\"8jè¯É˜‹Ñ¹3œ^NÍz±é…¾L aõìAw>ϳž½Ûª@<¿ôK Íl˜ÓôƒÒ|e*"ÇKB53nl¾¿‚z‰ŒÛ­±1åÔ‡‹‹5 ïzÚÓIÅÞTÚÿä™w?Áóc¼lÓc_œ˜ôÈå”»?ÖØ{ZÊÛ-Ú]‰-l]…ül(¡‘ºséÏïÞ4seȱÿUûM‘{L§¢Vå^Lº<Þ D”Ñv! õ•/ªÚBKÊ~®™Ðõþyº¨ûX‰I/Þðú´0WŸGƒ„I›XøXîŒúýé?a|#Rù*q=±š(Ú9q©K·— ÁOR÷i•ÝúLbeS_³3v~—ìs4A7Uµ Œ”¶îfÄarúË—wü¤øû¤O9ÔÊ·xÞ&‰Àö G4ÓT ƒµ8éE7?Ô@X–1›è {kEÀ(çepñ#\H{/÷¤ßÏ œ[!|ÄŠWv¼d‹­(¬´f‚ÇÕ¯»µ[B3aÉøu¯”´u’%Ù”ó`ت÷¯pÁ6Š ÉŒjº­(Î@éýh™«¯:E-àm‚¦´G<8Ž”ž§¿YÙ¾YŽM«SRøså({¸L­@lD–QÙÌ @]b÷(Dm]w “P?‡Oaòìvý¥—¦e>… õ6ìá‚=ÛÓΡf¡‚²{Ø´ ~9u˜ýbxã­»ó©2 ÷šëƒò“wÑ5&¸ÅÀKÄJ™º–!ÔuîNLÏú“:ìæ¡.ÝåÃx,ÔÛ«#°HÃèFÂ4€%n±„èæŽ»X;Ây [ÒÈúÿ”ýh{1Á5Û¥= d?ãhVCG¬ÂŽ`[hO{­òqùp›Hè›h’Ò°ºR¾a…vŒ§hʆºáRÒ› g¾£•Ç·ç§|Hõ˜Mu岇{”©„ËXæ¤fv,AXw•Ýpù+ë#îRvî4¨1;ea{»‘)“i{Ä?1Jt9°jj€gzªAIYYÎÖà¬õûR_*áòÍ{…?Õ»aªH™ÉôP2 ~Þ;J Ú G`æ‡}ºa éöv´ç”`S ¬j‚ÈèÛ Vì ˜M*é’É«oóZ\QÀ»‘‰Ñ¨ÙÈI¯f«ÂʃѻŒÌ6qx”*jºÃÃ@Æí½±«É ¤ùŸÜbu´í z°Š¤è Ë®Ù”Ž§þÒGð&ãÙ*ZæFq}"»ìèšÀ3tÎÀêøphXÎ$¤ºZ´œH(;AŠ3ó"ëkÓ=Þ yW~ƒVzf*ºTÔU•æ×º’ê*×Û÷¼9¢IŸÔô\G’#¡rl–8<­6!þs ÷)_z“ºZ}Ûš½–¡Â¬˜4ðßœ•>äFP_µ讂ÜrÐ 7õÃ:…3}À@ºŒžËßækïjæWà­˜äã•[°ýë Þ¾S¯Î!“Òx«Øxtˆ=ÉNÛVŠ£FØ^ó®^¦CãyŒ‚§M²öïþ#2ûÑ©ÍöTá¥'–>Î÷‘ÊCÁè©@¡³Ü€ýqSå3R‘ã8X™¨§¥½ÚVÙTâ”ßg.Ù'2¬¸3’#Åhj¤ç²áÙ4åJÛ<í<Å3¡UG3©;ÔŽ—{ílˆF¦š’äÍF ýûå} w-ëVˆ©¶ö{¥B“c“炜´«›æ ‘ìoÉx$d+*/oHêŽáœ|jŠ"ïT„›6h$ˆŠ—IŽa+yœðpMÇÈï`IÚ ¹ðK~q"tq9Ìe% hQG€/”Oú!Ô%ˆ…O-BFÙ“`a /Bû'g ÌS3‰Æpü#ú{=ËDò|7á3’³Ï÷LÔô½|R!;P‰ÅÍ!îm‘x8ù ’VN‰fà yëÉ"üáÅèÒKŒêÙgÆ–/)Û¿óU&èv!yÔbl¨RýFSŸÙAüu³‰ZËŠ ©±T²lÖ0«Ò5z7 |þýáàƒŽs`âþºnøQÕA[ p †y;½g­¢ÕrBz94ð€4@Âhí_QÊuÍ„Î_spç~àVPpóÒo] øbîk&²fì~óÕÐö=‡tZá]ˆÃ)Rïö†OâÅ|1v¡a—A/ÿ-`†£* ™ë}òØòKV칇‘+àLöÍ”ÓK®`vTW‰½Í™öÑMkp¦M@Å·~„ÊyŒ†åUî°d‰›ükÝ8,Ü—h§ÆAž{¼‚…­{&™x¼ 4×¶Èf’ Ý°Í)À´yZX`o¬&Ùa>‡­êÀÉT\7»Ê«E£Ê×›vç€'¹“1y¨E+üQ4•NX™3ÓóÖ,B™Ï1‰î|‘cX.iÇÝ1e•^Šmþ# )|JÇÛ=­w“ÈÒ²‘‡ê§Îû%‰½ÕýÐq3ÿñ »=#œG±9JÍ@Â^7Â%Çé{¦è=X<ü.f±èK=È ÀlODiÞd nj=0¬tq¥;´M&ɲnT2@ij·]@ û…âw©8lì¹VýÍfìäE7+ÌöÒŠ´Ôr'»+ƒß#­³™’Eãâ ëœÝšòÓƒSЃ>ˆJŪþ+ŒÚ#P» ¹Ì!¬¾Uåc'¶.î6¾Ô\O-]{ŸÆ"wO¾ÿ/gÎ)0W_[{SÐ #`ÐÜVºŸý4ú7zQ,I4ˆyJ̭̌RaèøjŸ¯ë·Ûº…:Zò3j$Gå–©I"Q=ùä’ouÁSªîKj­Ññ²åÓJþZl¹NëÅ QŸH£u) §UxÁ§ž%ß_vˆþ§F2塃³½Dp°œŠÞÈõ_óó¶ùÙ(p«fÆçÜÚòÔdz&³bæb‚ž}¸@¾J\ã ³~ºE½WÓûœÓÍ"¬o”ho rÛhbªÑš¥âI¥5hu戎8|1?õfr&K Gsõç **zP”Ûûò[ìcå"Ó OšKà³qe«ÉMÓä6cLBþ×q¶Üjþa¸*‘Ž0ZÍ OøÂ)îÝv‹?Ž2›¹«þµøfkeŸ"i·ÿŸ²Bf2Cò»Æ@˜„;9+þôú섪IÕ/›H †rIò:œE‚“i?OÎÿÇ``Ìú²Å!‘å ÊW’iÊ+þGC*«+ñ`b?Àæ¼Ô—\z¬Òn P„6ËÈ50t¤cQñ©ðµ@ÅÓOoŠö:ŠLͳZ§“n9¯Ä2Tñpaš7|+ªØü§ÏÚTõ?þתJeF3YÔ°ÇGu¨ë†´{sUÿ£©ç§–¬¨A-wÑÛaÀ”ôXÜxòô9ϳvÃrEÀÞÒMÿ1Œ“Õªt·Vžz~ɳ̕侞àêß®k’{~€ñhŸíR„*.͇”çÏÛã¬Yø±¢úU1`ça¡ÿÃÕé q.£qójòÎÊÁûþõ‹t™` 8_ÃbÝì_ßCO0ÁE[OUDfÁ’jWóº¶öË?‘÷ ôZýȘ+B}Ÿ‹IiÏI´.7×äŸ(ËE³â“¥%±ªV{Í e4hQÐq#žQM¨+“ÕöF ó§ÓïMäÖÙo³R g¦.™yó AÒááš·à¸n9)röÃÇÞæ`zï0u{)9Ì<ÏðçñpAxQzYŠ€Su)Ô…¾'×ÚË: (ŸsÙMMgÇ|Λ'Ù¾r±ÖtbÐêmSÐÚßM»õ›Æ:uí›Ç¦G82Ì1ç¤O‹ÂYLûïUN,Iê¾?©y}ïÒ2¢÷бŸ»ã[Ø9"«5_‚è"jÓ… ñç †Ž5Mô/bPÚ–ÅwGÐÍiïõk ýÙ\&EjMLpÒf>ÂùÇ{ŠEíñ2eã~Ì1ÎÎnx世FæÙjô¤µÌîôb]‘[Ñ–Ñ1¬Zu‡Ä—¿O2œ6îo¤_?g” °ªe]@ãlÁFgÀ [̪õŸYϼ¹!/Î ð|Qe ©žôÔÔ E9}ÝHá¹ù'ÓJzºÙt|ò¶…ŠàF’A¤ hÚXœÔ‘Ãõ¿ª4ÏT¬«CÏ´È4Â~r¢ŒÄ%h³yÂ‰Í iæ‰ôòVªF«º®'ž† ]á݈­÷0šGÅ_®^pȨ<æ©éÿ. eƒŽÑ×|øØ” ©Öe‘C)zMÈ“ =Ö.]Ò5Ž·@teô>`œóˆˆ³ˆóŠœ¹*¾–wžÓA¤ë¾8ÈÀ.bÁl9|Ì ­Ç- þxƒqÏ`ÿ{¶w¯àbœÅ&Ú½ˆË, ’#Pø¼¥ýš¸ÞA¶ ðÛ7šÂË5Vù4Ÿ')Â`¡o»Qd"æÛ ØÇùZ»ÓºI3üE¼”}óœ¼P< K:†Kg*!—ÒZ–ÚÒ¥’øaëÙEX#Ùª #Ðù>Q Ùéñ)&<¯{çs‹ûÿßc#p¶º²“%%ÄßrÕó»€p¨{X’]èjé¯ã²¤àŒX¸žŠžeúexºMÅ¥©/ ʱ&˜0ê×…è†3ª^²ï-b1 ÉUÕñ›P4|‹dM{SJOMx蜻vrª™5–;»¢ñ"ÎÿQSQÝ‚Je¡%É{a?Jáæù•¶„H:¡ÖycŸ@‰úµ…h(¸¼gŽbRšÊtýçîç"¬Dß¶ãÝî_ÿ5å¥t‚gb'tÊ…€RsDÑÅæþ>Ÿkšé­ª­ŽBxdÚÖÙÁXø –%©G³Ü¡:æoa±ZÍ)$î<…jÑ ç9'â¯T¡;X¶¨çJ¤°šzx‹¾o sÖ`™rvS+è¤ lj«àü:ìJø$°O&xÁt#„3 }ߣ]ý6 ñ’™ñÄÌa­•àþRòˆÓ<B^N¥Dj§æÙvˆ)8‚¬=p@#F—ÎKÙ0Œ; ê)b¥Éï=ä¶æ¯ojÈÛÑNrDÆt˜¢úš& ‹EEÓ'|^„¶ÎTîñ^.Ý0ýÛ¯aÍ–S‹ò¯KPµÃó¿TEMÏWJvDd˜Àò(i~[éHÑuh]kñŽÛ‹Òâɪm˜èÍ®zÒ¤×?ºe'ÏCzœˆQo¨eýdUN´ï >Ù$6ïxÚFçs¬¢cWÏ0k)=ft£_²=÷o2¤ç7œ÷ÊŒÁMê | b#Œ|Èlã«÷¢ÊFG‘ƒÌm±8ãx¢Ü壕=b VCp£Çù½½ì6á}×Öù(/ZOKjÖ\ÙŽðé”Ð&š™.)m îjÍŠå&—ãö€€æT Z‚} ª ,žƒP\ óZY:úÒ¢^Ã+)9ƒ¾Åö{Þ`­VÀö-VˆpZu‹Ý{u®"g±k¿«0šÿ?ƒè»i!´År+£Ý¶ond̈õ~{À7/: Õl}¡,šÉè+$‚°›3Î&ʰ»y“dI?ðÃ,i¦‰HI _þÚ®b®ø]ŽeP>5–7_îòÆŠ=/6剀»vå_I`¿ìÔvÐÁ.'·ÐÜš*+Ã~ äCÀX,Âí‡Õ{l2ôíe^1 ®Ùemœ“ÝÐÂ?ߢ”Cå[X¼í9£Ý®ñæõQÂ5‡bo{´Ðç”úƒDMÏcHß¡­‡æc|>'RuMØ’™s.Yíd”;esædͦB286újCPý–?#ìjÅ|“jÔGëåÇ!™:l.=Èå¦ÓæÓ9ÊÐ¥ÇØÏæÀ{×D¨Ñ¨E|ÞL ÓA)ĺN‰¯øó§©ñjÇÎ'ZS©†ÍPx­ ÕIoK¶x zÕæ±Hõ­w/KIjȻݡ=¦Æ m%SëÜ5•è,D¶ã­´ ÀççáÏâDY7!±Ù>lo®, p<8§Vž³2áŽÝ#”pê´g™çodPCôz]îžË9sZäk¡xB‚ÎYݧ¶Ó·©f5Åò Nf œMŠãEôüÌõ ýÌ-hw5àb4•ã gwŠúRûSÔ ,4ê·+©˜~Rè € 7(Ê]þ»'Ï Öðèé›bü/ ù î}Ð’>®H#ŸZ°)øw*–5ÜHÚÞˆV5a=ÝB@%̵®Ø¼ tÄqÚ´€ã§t3cÐqYÑ…“s*ó™®ç‘XëÉxÝãj8Šžâãìž#‰ö»ŽK¨¬°°", á˦O«Lºô>°›Ëâ³+ƒAÐ ·Mzl·ù§Bo’sM–Ф©ç[ˆ‚ c -Iýõ&»®Jêÿ|~äêÒµÏH¯<_¸šåµA-mß»)ÊÑ?\x ¹z™oGcY|LÖ7J­šæ1Ny­£æÖ¯„„Ô§f"³VE‘öÔ7>u?4üvÕúö1ŠŠ-û¥ÙÇŸB-Ù:AÙûQlXÏf¬ndÈÿ¨îÐÆ6Úé/R“‚+CxUiÞ'Gò‹³äKlÍa“Ì(a´PRª&ÔJ¼1W©&Úa¿GVqºž„“·‰ºøîì}ÉüÐ ýsf:™*Þj£ÍuØ?ü9 CÇ›s"…Ý3þûG@ë»%Ñ©rÈ÷[­Ö#@VlÐzŒ¬OBEhð^Ò”ÔàœôÄ™ÜÂeý–€þ¼ Þ}†pZMf\{¤¢öíT/})hp « ïÁª!7rÂÓƒO’•è¬mO).`I€É°Mi‹ÉHdÒçñ=÷LjÔ_ùÌTLo+Iõ̲’'–vòæàþƒ>ݬÇ•m©"»F ĿǛO-î«Ï¿ªïóæ™BÝ ÜdL‘à¶]»ïQt ÐÀÊðë•Nˆ,«ùtóºelÛõ l/Û®sÓ0•·æ)[ft¯é¨Õ!Å3…sݬûE‹ºðQ ÎϦÎPQôŠ¿ž€;ßÛ´(sÉG³ÿµ[ª×aÒ]6ˆðm–¥JMæG›)7yá\.¤˜$:­cWu"Z¯åvcÉgÐÕmC‰}íaèâÆ¿å(<ÁPŒ$¢¾«ýöPÊãŒ%Ïê|h®Õå~¯ýHó6âlÍäA°Cx/‰ì$¦Ü«7Š ¿µúw¥ÑX­![„ÅÄülhF;’ þ;19Ú°=Yßw ”WòÌ·R‡;Óyµö¸QªÃõ|âìëV®oàšqÔäŒÄoå3Ë¿ cŸS­×ƒk., âÌ,´}êv1\&!ðÏ´B¹fg'6€… @Œ®ÒC’n²ºaâfðiE.¥„p «ä¦»˜'Q9>{BGù¸a ¼•gŒOA•…Çjr1¦æªÇ},N³‰ià§õÕr°q>«T0›0Àõ¶›)ÊòÁýZ>ÉèYƒ‰LÑÕ>…>ÿJ®@ ÆÕT1P(ìƒ`ÿ NþøÆ XÎS¶¿ù2¾«@4ØaGKšÓÒ âñôÅ}ëïÉ´¥†—ÁN@Ð×ÀäÜ:2u$ãò”šqnçxnáîúüq’Ê\= fBêñ­¯Ðò8qUК½gÕÊáX/w ”Qc‡¤Deåg¬µÛ¬a÷# 1Øéþ™/¥È/pRÊ{¹>Ì+^ïoZk`…^6ֻ솫ëvqxÛlÍý?°åç/p"ÂdÇX-•/x`kaNÞ›dç_v ÆÂuZm  h*¡ÌXñ¥»p¤–F°AØ­°-ž5B†~ÿS Ëgá<×zcZG´pJÉáÎMruÏÀ•ðEÃSÅ)¶qáG?Fk¬¥ºex|¹–T¤kÍ¥Õ+;½ÏòΕeì±YvéõáàÁÕ0ü¢®vâ2Ã{ù*TØ_þ!Ö¡9\¾þlsZT9¬Q臛$÷›/¦ñ&)]Ô2m| Y>eÞ©š–”´]SÀ¤ ‚8>j^„<‡ßÞJò?ÓqM×ð \¹€]Y9ã0 ‰_ºg‰kÜFlq¸©17RÙ|û·²“Iª»•Ðö_,ÊŒ¨²d@f0‰æÅÿoÝ)ó‡§&)îþOïΫå ­g/¹Üý“ª`P{ía„dÇñhØánùÖQe•6èF6:ƼöWûAj®Èô}4·=æÊZ'Žôˆ§B¿ÙÜ®HŽ I rb}DE€fÖݸÀDéÄ]Ò6p'=ë0ÕÜN1Ü<ùd¾¬JÓÌ]!ºjLoɆÊ(OÕWqò:ŽátM ¼\øóª8Ô{ĈNÍï§ñýè.:ÚÏ4~IÌk3#¾°“.j’ÚY¤…Íç&t±¦žÞ”ʈ;ßz.âyB¼°—°2o)«‚4=^7²†4´tÙsΦ£Q¤“þ0¢våê(iÈDùzv ‚<0xMYpF—Ê· „n-Úø'˜N³´9Ä”w—6Ðô‰m›%?u·.FΫ.odøk÷ab'y^mJ¿]ùu[ÐÿR¨uHG$òÃú?“}vº«Öh öAQê‘F9i1ömö¬ëJvŒGø_z‘’•W–/Ò";½‘%p,•p>Úƒ5Ú“ŸžR$tÎZ®ÝS+ éC’`0A{¹Ž{å|'Ž”a±R¿X {û.[Žjƒõ“X¢ 0óEél³È )«–5‘|ìÝê‰ÙíØ»ªËó§ÒK´5RʉøkÄúDNE\ÿGï×)wÒP§­zß"Mq˜{Ä#Ñfcʲ!2ký½ Q’x¶Fñ‚ŒÙæ7œ±¶GöÒ#(³þÍ-©Ôb ™ãöÿ~lFŸœn•¹>Ë»ÀiW}nø¤ƒR¼I(ÿ6°I µ_ .îEý­gl‹ú”k#gSP¼LJg?ÚîUƒˆ¢Ì«Úõþ}À*çÆ)x/A"úÃiéï³!äÒ· ²EN–³Ê?A¿rGRÔ›foï1Mó°þM]n‚¯“ÛmVðcŸ[‚LŒn³O:ÙøžBp&ŸÄÌâÊиIÇqÙ5S‡òi‚<:°ø²—’ßЪš~ûÆÄBùÜæ–Jd„QDT _•G¾ë“Þ6´öU²o‰jï¸?µÉw¯ÕGäsŒ ‡Oä5Ó¬êYšˆËõãæ]Ü'­xgbx!˜N•]ž|ž)ó„wÂ!+Î3µ¿Õ€ Ü\¼y Aäê©.&å30ó¬Â¢ú‚ä=·k=' ç'«ÜÎv{¹É…ës¶ÍË u¶ÈR·Š³)¨ޱ‰>åö!:Õ?6c} ø’4“yhèy„šPÇàA+Ääùº™ÆU‰{AÀl\ªp?F2ÚÚ-jÁ='áƒÖUÍ„[ÑŒ1¼7ø*“GoÛ®ä¹rʵ~kÈJóA Xy¹Âží:áâU3¼š…”¶¦³òmš`Ú h¸ßÁCˆ«–’ ;!ÓLÎâÔöÑŸÜ8¨J+ôÅ‚uqgÐ]ØÜqú¬{¢öËs|“A_ |$üáÏÉÞ©î¤è™G 4È%yƵÆÍ<cMPÈÕ·Õ«§»TÉÔ8ÄTÕSsU-ÑÆjóEÈôTÂܪW í«­},› î·C7„Ž¿Œ(vJ>íø»ù颳Øs»k¸¡ÈªÇPó ‘ÌþóX1IƧ‹ô¿QONÈå,ÖQbVÃf˜`²=nº!*Ŧµl£ÞsïfÌÙt6B$¨ôcÀ׸‚,,6ékÝh‡~”;gkFþA»~©¦ãp˜º¶ùzpï¨À†$äi,*0U0Y¤áÿÍfÈé Œ®ÐûMƒ¹¾…ÇC®vÅ¥†|¬« Ôâ.ºa4™Õoσì¼þÖ¾ÊQuWÓTÝ¿už˜œZvBP¤³aBßž7ÕM†ºCAÿ,ðQ0îü¸Ÿ¥AûvòÞ‚¼¥¶4wjÙQš ØÀ´]i e Mú| ²¶;®ÑAó<äÚ¿ŸoP!¿P°çqiBºçBØwÄ{‡ŠÈPžïɽkQ•ZÄeÌoÐcD­4ÒG!ž«6"p#{ 1HV ܈£f±ÅÂ=?wÄ#dw|°Þ¬!¼U…\ü$ˆÇBç ,J~’¢/¢+C[|¹zcb`h‘\À;º~÷ÙH}sNVÈãλñÇ@-€(;&õ´õþ!rGÈ•ú“¢T]+½©§@Ç“p•N#»¿€ xWÄyÕ=*)ËoWš ý¢Wf¶ûš¸px¯ãú‡CPÅ‹-Œò;IÒÞUp:ÇæöJ¬9Çߋゾê±Å+ zt¤M½¾š%‰c&ÝúÛ-äÅhăPrÃÁ ¹¸X-a·é»Ð¢·/OC<À÷6ÔÕׯL3©ü(;`Ì‚‡ÂDÛÚÄÒC>ãšÆ„bÔM¾òâ Lƒ ƒË—…Ú=´'ÓÝ€ãN×^`nr° ¥]ëò*°ÎGßž%EîG=¤Öò£â·ºtÆ${ôI2CiŽÇéIÅmêÐA$‡E¯a*ÄÃêÆˆKDð.êÉùvD‘†•ثв^ízÙ Yt¶Û2é_fÃÅ]‹ò–¿-¢Ò‚«ÉHš§fi›ç?ÍJ\즨6æ^¶$vÙÂ×ùbËÏÎØpGâ¿=Èðö¿/4ìy'#5ªôb3›/¼ßfÆWŒEþøÉoÉ-.¦ͬ×ÚeÛÿ×ý¹µè'Þ¯@ÁØs;£´8§WíÖº†žŸTûür@üáuâ7Á pÅ EvËØéèo4mî{3;W0þ¼¨Çïk1ÞhÎ=9‡þÿšUm×cÔ¾\Wìÿ”ó†é2VÄ¿Éhð‹þë^õðcO8­§é„ÀË™ g]veóeb‚‹lŠÑŠ•&n²˜L Í!¤¹Ž^¶x;ÛÎCwù‚õŒ]覙 wÆùjªüT”dhzßÙ ô_7à@›ÁF\.ƒ¼÷ß­L·W‡X7ö¾a(pK[°è ~²‚î­†ó€ ™^O´/2yýCÔ6ó5n¢¹=<ëE¡’,éCÓ) E& ¤Jº Ùî,C©å{«®1cR^ÃßöI»{8"„:5NdȳjQ¶ã/ãeŒ}ñL!/é`€{^}IN xâÌ LðgA*‹ i‡‹ïúч,™‡Éø“ ÚŸ¿Ä·ÝÇ%õÆ»¥0Œ¨ÌÍÑØ:¤¬4Þ˜²þ{ƒp58çöôÁo%§};Ñ”Ç7ËÞX$.R9¸|¸Þ ªŽÌÖo4íÂm™œÇctk Gí5ž¾!«1qÆ7f¤£fs?¶‘ §˜4‘XŽîÞ4‰×ynmzE™]°(¸Ybøá#& x|•ÊNQ¬š„UpH¹)IhÖë…«þñ,Ú)d!x˜'1–­P_Û¼_è¢ õNÞgöÉÌÞ@\SCÚÃjª¡”âG¹¾\V¡*¡8ÁHd ne@m„Çv?7jbL+­^èðú±x8%kûÙÍìñ>­V2ñ˜=!ˆúˆì& …n“õưýÍ¡ôIZ Q†ÖÜİ ±Œ«U¬7Óß’Æ \L­Èá6»‰p¤V…ÿkí$3IFÛ>JjõÔýÉìEÞ!˜¿3Úúð‹;‡ h~ÀÉy³QrlÍ”—\4M”8f›VÀö9òKò®wûÊÁb„ÏX¹TyÌàk.»¿ù&`ó]V³]>‰öjÊ> •Î¥ º”ˆrÇ)Ïdl/éa›}Xñ(“iЯjÎE ¨Èb%õ]Tˆi§Õ¶˜"‰L³‘IVk?¸q=déK2C+¼ŒFGvge´¾UÊôKZ>@°•ûF¡:–\ÑbaPiÉüÏt×°ïñN?yúù·T¥‹aKE“r÷³¢[ 2ðŸd-à†?oÍ1éÚÁ¶—ÆêS£ÉÿÙúŒ%sœÀÙç'ùT$£#@³ÃìÊü¬_¤Z;œÃ E¡¦#!ÃÀ΋ÂöK×§ƒ?õ*ú`>‡8"¸RGb3í|·¤ß¦,šÒÕ÷TÃFdÿñ..iÔmHQ> }ˆÜ ß³ôŒŽ<¥“´ýñª€ ³ËnÄóåp}öާvN¾`œOL!™ÖðÞ­/k°k@D ƒÎgéñö{¨Ÿ’…}@÷«e0¦–­ü€ÿ‡wb´\‡Ãi·üQ‹öÃBãx§T‰DºEá4ÐØÒÃCEs˜»þÊ«ÌHW-Š‘)Ԯ’,îÒk«ç%ýJq+Ñë~,Jj GŸJÖ’µŽ¡Uú±à§ô(1Ó`)i†`Sçæð8Vßôe#óÃi-ל¿÷Ë/¤º.-6B6¾õl±0r‰ÆçÞܘ®dh&‹ÂíF«¦¼[#e]ºŸ qå×Ä©O}¦Upî¡% 6çÕYT]NA$ÀW]õ'àñv–n_‹¥Ý[1À6±Cy¡Ý–°Ê[p˲Ð1Ù›ø^Öž‘؉RÉ/»BgÞÂaK±°d‚1m /Uüø­o-—±e¿ì”„Ù%s8;’F•ÏkƒQH{qñ2 h[)?—KQQq#J¦‘pŽ¡~Ïþwúôxo.g¡aœ>Uó`Ìþ~¡×S¤ªga9BŒÚ¡t†ù€[".ãÓ°!MHEÍ÷¦Y%.j•»ýçšC3.îhÍ©Ê5’ß¹ ÞMXb ½C¯&¾/)ú’YàêmNtÓ¤÷§©S^÷SèMÿÙØ cè7;k°ó[Ü%ˆ‘\€0˜ž ®µª¾Ü‘Ó‰®z}ÜÍÑ…j!Ëi¸-‡ØŸ¸> %wÕœËvY¡jšÉò!” «ͬ_¸z™1v±GÁg*)øAE¬:Ê,Õ¹§$ƒ¦øy ù궬 ]“Y½Á@>xAßtä¦}ÉìvD‰œ©° AdP¨lˆ­=ú˜•-í#óé2ÙˆlŒ0Ïü"Ó&G¹…S ­.h#>XâCĶršî8(Ø6l6!â{Ÿ±ü_œµÉimŽÚ4jzᙈrðx›*£®)\Yàÿ6fh*‘Í„ó[µÞèIöUŸÌ¸¾£ƒCeú3²B•%#ðè7¾t\—YZ÷…f%‰Ù!O*dÎ~ƒ~<{°SC`‰Hïì ”É6};*Àl¤MÔáðèuÂ\‚ þ›yÍERà¾7•'çøøuÑ[;ö@?gPsÏ6˜M%18ž>dò4íµ:ß ÏmÖ=‡*†ð´s»–_UÀÔÎ4 )ÃÆØQ¢k?.#–HùB3Þ‡¥¢ \©è.©cbUô OØÑ²¹þDh?Mj{¡ôíþi&&€È»·ø›ØÒ£_ee\CÁ†d+—öŸB€Îÿs[_€ÙUfñã)qõ~Å#9ªö䪬õ…]NzÓ‹œ38†1ƒ¿t| Ç~uë橆oGöeRÙ¯wycZ%1èÖÆ¤çÖh¶‘+Ý”²w‚›‰¿¾lâF]% Ð.^òlWÞ9¡µ´?4?yX ZŠd\gVÓâP^ïNŠ·æˆï³·üeùâùnмk±ò¤ *mP»vÐÔ÷òY“nO{'­õÕ“’X­ô~=j1§ª›à^QfišÄ`pÝ…64ÅA‚ÐóÖ‚Ÿ4Î_ÍF'²:Ý…Ù¦9*¸7þÃØRÍEyG´"Þ Ï c£$ÊËs–ìÈ®Ñʦ`M!Yº쨇æ˜÷µèÍt,:ýœþþËL‹Ç¤–fHÃÉK×i”E.gµÁ³ºlr`Bæ,5t8é¦ʪ»dµ?¨°¾\q1»#ð[øà]¿ù>šÆÏEòÊv$åoFö‚îë?êò—Å ñ“{é†GäÞ“âšÒJFNv¨VÐÖ¬SR)Yk‹, Ì9õyIvLùºF3 Ie„›lÃvúðu÷ÚLÓ»øéÒB¬ DŸÜg¥,P=NtbÒÇ…¥ÑËdåÈ[ó3/|Î07ÿÈŸ0¢¨;gPÉÓÎ_ã%W‡=A¢¼p ÒþîÕ¹˜7Ý(ê‹–NÍá¥÷íp]ߘŸ|yXžNDf?æR ž"1˽yKUoœ,€Œ,ª'P¦Ž!eŽ›·¤¾´ ¶‰ýü3Ox$Ó¥}1-®3d4Š—œDKz&?UeÜòÚ!µë=v>Oœe*­/á¤&e®4'ßTöè,S©Ó¾×}°Ì9€gÁ¸ ±lÖ‚‚ í{1@Z\y œÍcÇ›*üA#0mÖÊ92 [_&†L£[‚;v1¢×®oÀy6uRE»hà.¥¸nޖ䰼ЭuL·Q˜Ö‰dJÆxÇ„ãªùIõƒ8– füÒO†·j ÁJēћ^(DVOÇí¯¼s'ýù/1¨ ÍWÆ[·©UéO¸/ÃnúÐæúùp{ýÛ*Ï›œîè ÷¹¸fK3+Ýd}’cr{bèæn§ä´›»°x>Blþ-³Ž ñ­WhÄK¸ ¿‚bÎŽF¡…AÔ2Ÿðf,(ö–EŸŠA×1ª S…VDRâ6ŸJQ*5/n űl_ò4œa;¤V[åÍ ¤vͳûB̶(+áûH ¬Ó?ùê}Kî T«|ûëVôcà WLשR öÅþx'ãâË”ÛT”AõÃÂÎï{ݾLóÊ—ÔÅ a ~±ÙqŠ(:ÀSÌcz œ&8˘ÌüãäËeãÊt+! /Ä<ÿ*[¤çÜÝ~ÜO|ȇx«3Ç ºQ«"ºç2·wöž*L¦Zvn^Éúüôes¯|`r^Ý áV¢1h1)^±ª–†K=@áSÞ“þ=S‘SƒÙxÁÿøn8ã>qàÖx XˆÅ q>’lÉî@ÎbnоFZs…#㺶"ZŒ…Y¥2$ÔÄ—ãr§†dh( ÷žW¹Üì bgqׂ¿œB›ˆm²ß—ÑÄm ý—Z²<ƒ@S8‘|êpJÌalNÞìnðרj†7îÃäa‹Î¹ŠÜr{žÅÁoÜAÑâÞV"ó3]3!Ñ, .;Ïž9}w²Ü̫ϘËì]hÐ8·òÑb¸|f®ŒŠÏõE…zL™åd˜v Þé™òˆŒ\^äèàÉW@PŽí÷å92Δ‡mÀiLoG&à°-ñmæ²E°ã:fQލNwhGw9Uó·ð©'{¡ªØãûV%è&2{/ÍDNôU^¾]ÙFzy‚Sw‘xܲ„£~KÛV£eØkDq¬VxKújœBÆ]šéâü.~ÃáxÍ`~EXÒ°úÿV(,§C¦Æ·uPjú§Sü(áx¡‚ê}ðÊQ¥öEÈ—™Ð%@®² Imç5MÑ[%އÕAˆì”›ýÌÆ“´{wqLš ˜KB„¬~ó¼u;°^Š ÇGÏL!íÓ3 ¿ÜÙ¨è7¯G÷ó®ŒrÄŸ•\Àº¹Å· Ü*ð¦µ+µ`½#¥5|¦qœQcC"ŠM¤^AJ ׄM„hP_ÛgÊ^0ÂÀ'ËÒΨ¬`ðWàKdl_Z =c¯P› *èÐU%;ot.»#œ¹ŒêäSž ¹k_QÞãœüçùî&ü?þÂ¥%ŽrbÓÉï ž>Æ©u, û”`mós-4ópa„>Â`¤9yµ`¦ÿWþŽ ùÀáZ›".—É}ž‚À^¶„#?ÁDOZ]žu%â)Ä!:äËuX’kÕeò8ò˵ä?Z\´âw›à#VÙX½XóWD0‹È"ˆHíFÐlØÿèñ©×﨧–ÛK^’˜Ir­¯Û˜÷Ííuçq|‰kÛ¾ßܨ‹vçœ^ª-/Î~=¾={nº»€Fh¹é~Túëš-Ã8ôt#%˜b²<ƒûߨɶÉ}%)ïH?~××&P ˆ¶ÙÚ.¦¥á[ƒÜ†’⸉€LÃ2?Á~€kÑ7Œ¬Ñžˆs¢z“Ö =R<ÉòK†Uêü!õÎäBñ°t&ª_ÊQTØÕYûTØ@ÉZno²À³_{ŸÂrÀ5¤g}iE²µã¸Òéiéo<¶2•Å¥àR—þÒªÜzÇ„Îi¹bW˜]Êr\5Œý»òN.»9Ô¦â}¾§U_ ÒHpÌ!#û—$w¤eÖƒBex"Zbo~M$··ldÛÄÿój6efÛÜÚb,¿–¥\M[•s„ûŠ×*û­Îi>á,6–7¦Î-¥†H–èD…¯ÖÄ8ñZñ55›)Òè±ÀŠ@ëˆ0^À7k©Es‘L(wJX‚³!P7ˆŸ‰GnkÛ~aè´ç0~?ÂÙùNÜäOŠpúIxç …ÅÛ^ªP™ ¼ZˆœnëÁ6×t•Õ¹Ó[úS>`W¿òpš`Öm¯z&¦ú ¬‹ 8ïWÂäÕÏ(ž’’IÕ¿7‹Ö³H'glÀœyéf¶}J]áz¾O¥Ü©ZZ{M‰Æ˜ÍÍ&‰I1!”b²a?"©úpl±øh4[¯j) wJ»VÝ g@­Ù{ãhÓ[»èe;˜H¥Žù]§Ïc>€6ÆÑɨ+L³K6>ê‘EBÎÑŽ\àÃ0Ô 0ÓÃÖls­¾@oGXðs/Üp,ׯC*}Þu°êÈdåÝäåÒ¼â}£Ú–‰×RŠSìÜø0MÞä© øè·ÜÉéͯö軪i4îp ð>ïYžů8‘êj3œŽ‘Í>pù0T.ýo›‡·nÏzYµËpšN+ÒÒ/ŠšÇÁ쯥»G-¤@ë¡ÙÏÊgƒh¬¤W?«åÔ[|’#dA\ÞÙ@Ü«þK¼Õº±ö4/•˜Ìbtø7³¬µêîgoJÆŠK£î7Ws$ahØ<¯(DŒ(dô¢ÖÉŒåf,xbOÓ9° ’n•ÃùÁÕʼ/ g~©Ú×…×ø>Ý‚Ò^®ÖQ¼StªöîØ„Åá#ömÓõôB-‚öæ·) 5•‰O õÿœ©ÞTÏSåVêÝ”WE˜ûT·ËKCiÛ#*Úa¹ SŽÚæñ¦ÐxÄUøfJ­/Ìåè"ò5Û ðéIM`ï¼Ü3"ð—«T°°)ÞcZRM½Š%’O j‰aå Î>h ŒñU¿ÌùÁLã\›H…mø5uM³1–NSm¬¤Ÿ²<Æ +§¦ïÄõ_Ÿ’•áç‘£ÙÓ)„ ª¯—ö]Œ¾öxl ÆêîRXJØ£ƒ$…Ї(§XMävÿ²µ†?©6Ù¤âŽòöAЍ{’êv³¥ì0Ú4wP¤ÙhÅfC›âøãCß[nÃøŽ™»à5 —¨tNâïD©ÅæƒÕ:H4¼F›M­VM!Ö-D°{a”¶Þuzµ(ªÝç“Ⱥ?µ‹U;ïøoÂ.†sfàº×Ò¬©Âš®Ñ Tµç1ųþôgc‘ă_+I;”½§R;ðJ}zjë©yÊ„¥]WÄ} ÂlJ¡§ÅjU”³fúKˆ€[ú-Ü]ÆÁ¶ö?ëá6 ›d9oJ\7KK$@F‹ÊÔn.iËQ}Jd޽° ”î•;~àÙÒ=EV¯†õ=7†ípê/mú¤¨¤^4ÙòçŠø¶H¡H@÷™ê†Î"Ôq‡¥®©šªžÉ0jã‘h„ûkio¹EkQŸ_æ|2HL¡Ý©Ý>›,£öÕV3(™22È‘Eüí´‹ïÊVÈ(hK(¶ôòï¾¢lÊ~ñ»ú²3ãùz$`ö—Ù• â€fÁÂç¼BÝ+ú6N‹Ú‡S=ù§”\ÊãNÂn Ÿ;ì¬nN¡j^ZÛ‡¬mòpžúÓÿ#À/F‚uq”°á9ܸ©óe‡Çî*E½Šae6êûKà ïž#¬Ú5ª¼˜ÛûãÒV‚ê½&s Ðôòi0ZÂUw·Õàº^þ©]/üÊÆä5SoÚþ5 Ü+ä]LÒr*˰dÖ‰9$ 怴Ç?—•|,†Tvwƒ¼Ñ_]3éù¹X¬ÔeRÔD÷ÁG õž‡ø85œçòߤYýb7=Ó}A䑊bö¤5ò˜\ákFÔ(ú}Ð"¹ÆõÝûе‘Û™ŸÇvÜ—»£–ΞX²^p•mpðìÐm†N™l×]w‚»µ—cøî§ƒ/Ú Ì”ÞÕ#Û8UW£oêÚ~ZÃÍ_’"%Ÿcâ‘”>D¨Óå?†Ýy€Åæ©!PÉæ=(=pÜÔP½ÙŒ £°à tj„`Ü­#ó71eÉ5`>a1t’„.XG™9`+øOø +ä}’F‡æ¢„ÀñqøòÙ\²¶®•àœ`²çuta Êfc¸šDcVõiÃTáÊO¨£Å¸*=Uïƒ#¡§ÿÜUl ð ¥Öt(hÑyO—VÑr›8/ýPDãHaÆ>‰ßW€ù"KbÕ2b}7Íy0ngçT\áö‡Xò:ûÙ±õ–‘¢3šë4-+J¹«÷®ïÅDlŸ4Ž˜ ÈMU„¨ð^¨í¼MˆõÍp¶øhÐB’iE)À |J¨o¬nd$ÝE²ŸÛÈ*{s5o;®Ï<ÛØkŒZ§¬4ƒqʘ_3¿¿’åaõQz¦óø39 eCG Ç±[´"·á× Vq>ˆƒ§SÌ·WªAôP~™ãcUçŠûsJ¾×cQ+Îm^ JºÇÀ æ™£í¿‡¯/\"Z*_)|+eRb•öa4SÚ;÷ó“ý\Ìc"’NŽ!æÏ›H蘿$²ExàMá×n¿6¸§-þÓ‘§t $̤Wýˆ+aØKk–Ó+•eöÙ8àƒ^š$1šßªã©Í±ÚÈ—ÉôÑûÁ]/>ä@ñÜÖ_»§on&‚Ýðº¹ÎD—zXTE%Î$Mº±âSEïi/㇞rP ¶ ÉAÿíÛ©áŒÂ~†i)ð Á¦ŠîSœ,Ù¦õÊ£³”€e{¢‰Ë3pBZ·IŽ{IÜhðÚ » ¥ý×§Jš »ààöÚ‰öi"¸Ù÷ÔÀ÷÷¨€Ôs4¼{³‡’{þú§Åü,W •Q7˜§8:ŸÊܳ µ~Ä”<(À2 ‘H–·é„yÛ‚ø”l ÄÖƒmFÞëÛ…õ_Â+ráZ=šðsbx\ð^]!6ÎÇ<„„&Jvü7ëÉöóþÚB^eë¥åâ@á¶yULÄùÓMú ªù1÷C³4l«¦÷9§æ‡^¥Í½&²D§Mœèüòq¯û;ü:n5ÒŸM±Þü£Ý7|íòá.Œˆ SÝ›/ÌØ.ýOF ˆFƒ`W!±iÙ†*ƒâáîsá´Ç©åt5«R9UåqŽ×oÿM@q»‰Xm:A:K'Ä®ŠðÍ„§Êÿ4î’æÆ'ÆØÃ,fñ dÉcÕ^½ 1Xižš1Ò»†ŸX`5Á€¾`ØLM^‘‰¼L+F@u±O!:‰´HÁ9À'M‘m¥¸Hö—ˆ‹v¤†ß)­-µõÒÙ Âxnžë„¯’b0uMuÙTEåÁ?Ußp§TRÌM¸ Ïe8”øùÛ!„ÄÐèùzúÑ|éâ_ÎÅÅ^»SqK¶×¦È‰á‡á¼/0?*µ’µ¡\+ÇJ"´@ÆG?’®bŸ_„\®Ën¤ô$ŠÝ¦ŸcÒ­¶±9ÆÑ6Žkò©6Q+«œ§Ë?×ÚGR%ÞõyåÝÈDJÙ ?=ú¡À”T»Õ x_dR’6]´µ ÜÚR3:㔠®*ve‘ QÑ9<ÿãÁWÒÂfs}Ú6}‹|Å™µY¤˜[„Ü“Ð% —njû{Ûl×tç’3øÉV'°¤ZAàeêì˜{x̲T9-óà+G¸ßT‘Õ] PM•n›ÒÎ^PCnÑP/Ç4O–ßxíd¾¨ü$ƒh3÷…pÇåú\xUÜ ‰š@ è'¹èßg;”js™‘±ùð—,K9`§œ× HòÃXùËÚ`ü÷ß#§ì÷@‚Âò&†ˆ/¤xà<’…·Ïœe¬Rï•xx¥]Ë ;3•+ËsØx¨ÑkË<ôëçöK‡d À.ö|ïöWÖ$›îL.f¬þð§ïa§§K®|ÙüÊÓôì)|ðaX¿`É›—Ô°Ð<ÂdC°U·u\ruXîÉ^7PÙÒ”j{úk™”¼•xÙ¨ï!ÏÙУ7‰%nŸ¤;ë…•¿b-Øs8¾µ†þ}Ä÷ ±mk8sŠG õ+õNYWl ¢*ƒ£`ãu½ÜjæRpFöó¿Ú3Ç6Ä:¦¯%$û%®SÁ¹×ÊÈÏ.YX c‡gé­Àežvî‚Ý b¡¹Ø€Š„wS¶jÎLö#³•m\ÎI‘Æ82ß¡'gŒŽP“ì‡Lùu(øjHø±î”½‘j¼à¯» x¨™Ó‹À(ÃÓÒÑÈÉ# Çcw»Œ"¼rDz;gÆŸKn…ä>µ¶;D‰-I‘¤“z¦áÀH, 'Ó› Ùäv½ÝFåè–aMmð~í¦áÂÞ4!íàÚþ(½:¿b¢YÃïᤥŽ•aªB®¶ûŒû„àgïåKÛê+е(ºŒÉi߯ú)>¼ùø™œÁÞÑìøF*‘à ¼BK+úr€;ç‹£Œ­þa`"ó×tŠqEgìWÌòR­/ZˆÏ™ò,]VŸi70G_Ò¿JaµÆ)7tª|êx€„™R~.Qf|y"ê_\K‹©±5ݘ~±P^ä|Âïd4DäN-+¦…ÖÛ{¾UÑ¿5w—å-§Ê°Q…ù¬;„?~614ѨýVC)ÐÔ“œÑGèÈO!b%¼›ò1Ì#Ø/±;D7&º*‰¾è¢¿ªVÊ‘S®ìÓaNÀÞ)6ÑnTûtû&ê¥õÔdÞçKE¤8 Ãæ$»ÀÍHO¼@ÌÍÎ5¨ç:Ú&Þ¸žÂ‰´Hížþñoa~ñ¤E¾÷ÇýÈgû *-§OÇØÍ}Ô™GGGa{5W ¥šŽ´yJ$¬ô¦—W#Vn$¥óan2ƒ…£²S<±[3$m–•ïÒÆb®›áèRÒ‰ò`ß@Àe× 6­J<쯬òáÖN¦T¶BÓ—û‚A²Ö㫦ͪ‘rUšœvW€åqj%¯ sDªWMü±G|!AǺ£Ô=G>Nô\Ï$¼Œ4÷½¤ÿƒF¾ Ç– ó5ú8zÑŽ­BjH⥭)b¾‹.©Áëò‘k-šžÛïû0ýý^—¼!°ŽãÕ“®ÃÕ$w9¤œj‚æ£å´˜…JM³VE#q¡~{Ê'·‚+Qw‘Æ9ÎÈ}½¤¹Êce–î?JÓ.²þ«IѾ9JËr6YâÀU­”8ÀÌP•W7kcúà C¸îÜWï9Gðï^´Æ'v?:u‡WãwèÓS‡‰¦(%EZ@.ïH·£ï€²}fT.r†Â¢Ÿ—7»CœS{–`Õßı܄ºÎu²Ès8ÀEºÐ©÷šOl!-XWI!žsM3ÄÐÉ'åǬٚ2Eäo3„ahX4jê( ˜·Ñ7!¡­"Q T¹3*Ð6¿Ö‡@vÆ—€˜(®±\„¦!ÌúC1O™a¬®×ñU2r÷açËW˜Î, ÒGì¯`‹w1"m¨3ÖßÀìw™Ã#  ÍÁR8ÆÁÙ)`å”ÄÒ·Ÿƒ;Þ8xPXÛ›aÁÉ´)q…ÜôŠÖŒ &q§_ÅÚP⡳²ÞÒŽciŸP•kÍx4 Ø<|RÀïäC™l´3É]û›ìSfî‚xÖA±f.ïåt`’‰^Ý7>Ƥ_r¸ÕcTó'Ÿ œ$ÊžEšàG°þ̸ã ²µBŸ~I6[ß'"¾•KA±ïâ¹6ÞýD/‹.¿ÙÆׇi—ñ¾œT…”ËrÒÂUy2ˆBÈ}¢ôÓ¾ZEÜN vPô™Râ6•äsQ´¿€s‹Ub:p±&(œHÈ|ˆÎ…½`µž$N‡Q¿{fE7¤@ë1^µà!Pëƒo ¨MÊÃÝ\`ÛÁÛ'aÆêÒ9ôR”\ØS.µ—…œ¯ÅBa¡Ï¤Ä–d~îíO}š»½OƪwOŒy–LHª„ˆüÆ!¼Æb`ˆ8iàÊu? ™#ÈoÆ¢#ê¼ãš¤¸n½Þ,æò—Æ|ÌMÙ¡ÃKÚ%Þùwò9˜ÃæöåÏ×|H=v`00AVÕ ¬ãž"¿Ee\ÄÞ JÞÉWŠ ±ðï€2nô ‡EI‰Ñà ëFI—³9A• ã5i!ÿ˜·j¸Ò,»%\µ$ƒ ¤SÖ+Åì'"¥…ÅÊZnÊù´5NÒZç5”§LRók/tùÛAòg=ßÄš‹zXžöj«:°»ÖÕ–±6€—kLžˇUÖðP–” ­ãŠ–xîÁŒ=†®±ïëªxJyË=´e Ç|îûÿÊPÁDY½„-7aÈFzó¦,sl8§Aÿ~Fÿ9ù± É8KV1¤æë=A×m–Ö˜`ê½¾•2HS…½dÄy—ªUKÊŠ¡d¤Ê mÚ2·0éYnægÄeÜ9€Iˆ¶äÌ~SÏ\¾SŸ›r’½ªŒ]«†.¾Ñ³eÕ.!§j†?[g庽|žêY• WwÚÞ£ÑwÁ°µÁ†ú?{¨³Ô(+¦ÆaUì_Û+¸Ö Ô!CÓsm*É…´fàUƒýß\M°~ñ)o$¤±ÒûS=«"#†ÌWJ¤eœ‰é@Ì[NFÁPµNô!“ßà=ª3—ɘB ¦æeë(Þˆñüì,«îÓĺ˜^m˜ ã½— WηŠÉT ñ…fÉò$ΤA§EÜå…¯Š!ŵ‹>Ç…Ž¹ü[.æíw$IêÚ”Ù[%D©ÑûŽ#ÆÆ57Èq­#äÕ‰p}ŽÌ\1MÀŽ(ØzÁbÍ÷þ°{{phþØÐðsñb©oÕŸóýnFOXx/;2ÓéÜ‹86ðˆy•@’ÎW%M¢qªO>?ÖQ}·Fsÿã'Æ2-Ú¹‰ëž·7%SÚôOµŠ½ØE©žcX°ZÆä’™Ê›ñЮ‡q°*_. væžUsóìÍÀ|2Kz=ã`Ú+íÞ¦¥<†msÿ½¯oÓrªéƒGÀÔ†1ȦêxÜ;Ý&á%FNó–UTÎÁvQŽïðÒ2·Õ$3k"°F÷xÆGDciU—T¢lÕC9MàÃßAÇu¥—´g¹zuQtxKMà õD™‚P1¡³çÂ/+&ÉF…B¬hÊkÇQiÓÖÁ^<Ÿ*\qJ?ÈŸ¼éàQ˜?»©¡ žP*Ø•tM¯Ä™ã<Š•ž¿œg8pätD¼ .o%‰MMQb½b¼µkçÊÏw“¯4Oj&æPø€ˆºˆŽmáöseéŸ^y”}µŽŒ¨ø(œ3è+¶ ãÖ]fbèExí§Tù´yGJá¡ø»“çQ1,måá2Pé2uu”Xs#Ì&F³bÕÔ#,)žaŽÔi°¶ YÔ pû8 ïò»[*g¤-úü/Ö™ ÚE?`7äÛ9§ß—xY+ nãY…Þ¦~”Eð€\e3“R’­†ù84µsOX5µs!µb‹ ‡·ÊŠk2óçþÌ©±º]GE^<¼eV}Ó=mK*³˜lï”/}ý]tp¸‡¨|£µî·JÍöÖL¿œ=lÝ*0ÇZœ§¹:C§aûóŸ¿™òÝQ|}¬ã–sÀù­Æ¯ê'åPqw샭ÐN'\̰DªæÑ¼àp‰M²ð‚Ž @¢7éÀö.™“ QjY µs9ù¯÷'‹­žÝºÆù¶¿(öý°êá¿¿ªÊåá­šÐÛÎí÷CµÈÀƒ—n6!óP½¤Uù$¿V0àä*ü#7jŒ¥¶ÜÙ¹’ÚVCk8¡j'ðŽ^·MÌa(EŒPQxäBo¶aˆí+ù[…MWÔ;8UÞà ÝÎb¿'dæäÌ÷1&'ÂŒÕT)nY ‘|­¡:ÿ´•LÁ8Z õ-g˜¡Ô¸¥Ó¶ñâ¤OÀÿ›MIßKGѦ…Ú¥õK ‹âÇòŽ')ï øŽ·LãIo9…-ÒUÂãáÕâðó¦/Åk-]ÛßÄ8çõ“¬˜šTü§ÆB˜Õ^<@öÂüiÞÌ]Í‘ˆ‘°ƒƒ תEJuÌIQÍøFÜu7¨ç¹Toèö³ÂFe˜lÑO‚<ž[l"úã&~¡©ÕA«6 uãÁñÔfùé=Mˆð¿@µR:1K7®½ß]'ÁK’Læ;²Œ«·«YÞ]vl%NųzÏé0|Ûj„³sÛ徑œðíB÷®”°ý¨Ý’µ‘늤G"û¶9^=& $ñ/’½aèéód—®#†”ßNq«¥à>ïíß"ÿV®‰ò T,LÌfÛí1/…ßg:ÖGé¡/bõî䧺¡§æ©§€ùjÎØÄ|ŠA˰áFOy5óHÊ];2œº$ª1{Wúyž[ÿhSƒ½cè¨ÑcSúñlÿ7o¸<® $¸ãÎÒfyØýŸ ¸•†F*Ç`d·…oµÇ¿L}áùçù`{Ä瓌áð =ldz^ì(%ÊϯÌi€q4ÍqwSof4ÂÊœŽF|")!øp-㦡¥=޳;Âs¯3ë›ÁïKØOÛ ´»Ê Xk8?š% V×Ú-w­òK^Ð…/ËétF9)ûodŽ5!Ó3ã¡ãv‘É àø¶®ã‚Ÿ4äô{×3-{ʪ/ò|¢/d裆3-û«’)½¹ÞhDº`F²¸Í¨Ö¥øGÀQ!9.ï:çª*–œ[Åd­ûip)†yý€#ò˜:¦}ànY¸íú øo¹^ÑOò‹&`£çNÒ‹Ì©8GØA¢¬—ò¥÷^€èï5’€b¨ 7N•ÏB½¯ó±5¤OÌl. ‹=NBpÅàèX#ïb¦ŒSŽl.xnu‚`‚†$ý"…v!,”šj¼=¬|éçËÆ/¼®Øèg6©…`ìTM(É,Ë6,‰S‡œÂi4¢–xŒ€%ë–­ãƧýJql蛦lÑÕlPeL—qIyšÕžB¸§* +¡™z 4åh+4<õ¥«M‚G,#ð«Ð ÔB$¬hyʸõZCŠÀ*m2ªUÚ?;ç;´c[·Æ%ÄÉ(8©ê¤>"w|%hd&†BÆÖ0ܸ}ø’Ö󿯳ÉìNç;›!·…¼òËú–ê Þêðº%ng‡yÛ~ Aº†ñŽgûn³:X,t½¤pÖŒfpTt2zâŠ@_”±[¼û Æ}/¼8T)s×M}’*ì ì"tô˜|Ý4ñà×ó’U7À©a؃1ñ•w¹]¶ µMcNéwHQïêòžICÊCî¡ñjbŸÁ¦Ë-ŸŸý_¶Ý_—t2: ü•1SÀ&w˜BC[µ€­Ê"žf>èÓÃSŽ¢¾J…Qgª&äÂàY¹d:•b«ÁöÃÛ0D  S4ü·ZèÌó8?ô:Ђ‰ºµ /zïÂå ›‹çbj'‹TST§0šlcÛ¿Q^¹§k꣈­.ð½“@™^Ǹ½(·^^GVÍÓŒ{çîrèÚô™ö5ËÒZnô ÉÇ0Tñö£uâKåHgLl®X‚ö4¶7åJs)ṓBPIa…ŒŒÊH–Ñð ìd¨ÀFÓꣵâ&6U÷(¾8J…·0S²ÚîFÂ:Tubö:„b‰špqOß{‹V(p¿GW…ì}õPò4Ê%G¶³ëÞŒòþÂ8UŽ™ösãðþ¦BvY¶Á¤ ŽïF÷QÂf)Ê´´Q2èÍ <ÚYßm]¾m¿#ÍûÐ×¥,q>Ä9Y†·*Eí(n]‡"ÃŽ‚A¿àÈO-n½ŸÚ5~­ÃµášÅxáñëlP¯[w 3t s;?KJÞV‡™ÈÊGÒ“¢ÀU=¾úôëÂ0[D›Í¨‚s+·óK“þžáð´§4¸¼5Ú_4E'’âçí&Áe9‘ÆÌúw2<’D¹># ㈅rJ‡Ž…"#WYâs؞˗øËaj´…ˆñ'‡$_TM4û’Öà¾+j8a)½-À=žµÃÚu°GZ:Û¼AžYàÔÔ\® ,ZCȽ¨ª]ï"´f€­²–å±€ÿ‰§5ÐѠΙxœèzG,óõšTù€ÁáÁ³ìG':Ѩ±ÜzØê&0#îf×zŸÞåÄÂï>ŸTŸRCHã*þœñŸ( 8–&±ù³G™±¤ó=eù'´èu|VïºîV°Ð‹ÂYÍ~Á¥uKÏP´ªnÇo s'E:·L‘øp9ø-ž²¬´€U3¼yA‹’»f0U½03TlW{w+w5ê{cbA žÞorpÞAÏ^ææFV'l\´-ÝC)´Å9@×”^X “BôªE°[9€Aà&ýœŽ|æNíT¢ I]i =¹6ªjœlÊË9ˆ“Xèf»z”žÌg‘—sëå0‡éÞ­…I²¯yÆjW4`€‚U4{uåfhN}%øS°t‰ÿ½{7t© äZc•Ñà; í|æ—_Gè>£xÔ”<2ÏÄÝØííÕ@Ã:zV"¸oÇ5veúóú%…P¥ÒÕ]”l½ ^OÂD‘ ìã«n9+Cð1õôš}3úÀ©êl1ý…ºXÐT¹‘þælëÜh¦±&e¦v‡øåpP¢2¹ÃMS4ãлߙm¹Cc‡ O¯ ¼A>#l8ŸGTü  Žú86”ñ  mº¸tùB5k¹¢•íéCbîÆ)¸çÉiQv‚±¿:´Õ9‹™}†ã¨u¤ÁI訸áh·Wcš“ï9zJrÕZ}ê͘ãêÒµ.s nµý`­¤@‰¯Ë *Æû3뛾C¶3BW׿#Á¯–*Vån¨‡€[yS6­Øf(®‘LfÅŒohÆn½ƒ-î†Î¿Í}Gk¶J”j3“„Z¿fó‰ØyÑ‚4òÀEÐ×&•YÇÙçàõ ä&µLc¾ºß;P¸ˆœaí!‹&…ਫ:Ó—NE±w3Û&Ck¤bd½· åŠG®XäK±¤ ÃN£ã˜Û5ó˳_ï JŠ6|x¤£ 9Ëyr£ÅºO=ú KL_ç“0»²•=–-ÖUÜ…Í­À?¸: ”Ñ—ô'-2ëÅg¿IüwürÉ…†ÕÌà(±‰ÅÕ¦ ­ØšŒ‰¡ÂÞƒŽ‚HÈ@–ˆÛ*gœ\“ÐN^_ÿãtÁ¿½ºq¢6ºm*8i&zK95S–§‚uè|,XZÈ›‡VˆwÖš…WUÐ/pn¤¼’à¦?–ˆnêȿӪɈ.PZ~¸z*„Oe"sÝÔw6[øKÉy‘ #E×~D¤16€´í±]¿«RÄþrÅmpv¥Ì¥LwòWàcPF ÃvG¿~³ÖZBo¡¼^}8³¢Æc™~”™™V7Ô 8ºKë_Œ(Qjâ¸@Ý+á¥Ö÷…ÞF ±=¼B¥DæÖ(–y‰=UgãÝ1xÎÿ#+4ÚøÃ S‚Ï¿ÎüÑóAq÷ÜØˆÓÛÎ/Zä¡‘b‘½Ñ¬w%«ÈÅŠøœF˜ô™gÉn²ÿfFn²‚ ±©viß)¿R‹UÃ%¶‚Þog `—¶„Ù·à~ò«·îVú¡.ƒUBÞÒd{tq…¯Ûy¡€w)/ºW–zŠ@LC3X‘Úó\¨Ú†4×-hß´Õyh²ÊÿñC_$@a@ŒÃÚ1„*k<š7MJ1^)yh ?.Ʊ¥:Ýk ø´bÍÌòòšåÛÑøCϪ íxñMŠj—œ¤…#íx–-‰¿àCÃþO&]ëêþ÷ [Ks.–cD_ºPDEÎËujìÍÔ ¸H|…#û+öðÞpo+e"½îöƒ«FÙñ™ÆÂr±ÿuîtR1^•}Ó ùiàÃÔÓÃi'2ì0ýŽÌ¤.†âÐg窡Úá^¹k‰2™ê&ã ßÕÙÒʵªÎÓÖ}ðï/*²¸0ú°xyà¥r¶Æ»R·àgÛ•&ê‚øëu>VøÐ þVæ ]ŽÚ²–NHjNK¸R^)˜lµJ¡å‡â__Ý¿!e·^:Ý.™ñòÖ»‹mõmh7¯žg)¥X’}»vÔ œ'ÆxYRÂ;ÿ—{ëãŠö‹Èö€ÉgÈgU|?È %=Ñb¾uÀjgJÏWnf,ÏÁCÞ_êW a!R‰ÛJiôë—nåÿÈÇ~êŽúcºudºYTÎQåœNé¬ã>áBûßœòô¾4|ðJ5Üa* )Ï{±™‡©»øÈ³=¯êp=Þå"k„–ïm¯,UúJŒ>­ Ý]’¿¶¦[Ž.%|zß9‚òŸÃëvš*÷cuéÌb¾$=8á;´ú4hÏ×óœsºOÕø)|ú]†ª"Þ†Ñï5Y`ò‡ù $.óãa¾£:—i ¸ãË^õ3œO6k­çk7î@À¬æP¸è’fr¼žŸàᤷõ-‘©×“h ~Æ`C—£åñçð5{„4® ÒbšJʬàßÍ'˜gD™«Š•‘ðAdÄre~îÀOƒ"í–Uk"“Oâ‡ÍÞ£ã]¾*ÈÛaPI6šBÃCÜ„UõŸ*’oS²õûEáŸ~É@¼ÿ«ü–ÖŸ¨v-9w>þ¢Í?jääÄÏ—±RÉÙýŸÀ¥ÜÚ3éÀhå@kf8Lã:'Ä6NHÕSi·˜¨-쥦¾¯tcé†IØì<ç¿°Þ]dñÒãLgóÏÿÓŠÅÍnE ¬zì…œfå~î5LŬjÙ²Äp´FÀ_ÓQÚ9Q¼ÂAr%Xþ½ðSwsShòðJÝQ¼è㌴ž>Põy[X×mRžŒbBM%h™×9’ûcMoìâóÍ’àALAÛ«h©€õ,µ~‹Ï\,T•­rE÷²ô:‘¯gvõž&Ðê@>oÂמãÑ’­)ÑnWŠÀ¯Qì‹XÂbÎ"p¥>5ËS–ù¥:ãÅ'¡ïc–KdlTV¹.¸ñ»BÈ[ÿA¿‡*Ÿ<ÈÙYVJ»º0øsvjÜ÷Âcóæ„A¢"H:Ù4º§%Bûn^ØdZLáÍ-–:j!õŠ©ˆPy.ÐÛ# hÎDol³¤LQHáqÿ– }·ÔTXb­ö¾Nŵ”×c:k‹m³Ý,^‘”3hÞ'ž„Ù&æ¡÷ÃÃuãGÊ ›B æË÷Á‚wi‹¡±zè¾xÎŒ9Zdfÿ÷ÖÕå]=^!r—ÖE*ÎL®Ý‰·.Mà0¼J‰Y#ô©Ÿ iÖÑ¥¾œû勽šã#Q¼¿öN'#cQK£›¸U–<‚ï Ó#$˜•S3š^3>óß,Xrqs«ÔÅ"#À^—æ"÷.ΙËY-N°‹Xv%zyú?;`K¹Àß“½ÿ©ö>=ÂK—Q"¯/$ÜëÙíkz¬2ŒÚN¤'À ïO“*$ëÛK;w}˜§}%ˆF]lÅx§ dxŸ¯‹²¤Ýv£õ2dW£ž6Z‘Êkœ!J¬/8·>QÖ ÜÔ,œptó ̃Þ-ãäáïºßûÖ!aã Fîcñh˜)P8mæ3;Íâ ð*Ò¯ì%ÛøXƒ[\©ѹò¦êLL &rãLÎÕwÏ”ÿZ°Æ9¼[€¯@sï_xŒTê`øs·Ø•±ÒË+ðý÷‚ú§‹'ÕýØC&3ÿÔôäPå ¤î’íõ¼o'´º¥Ä”„OØžÆø©I} ‹Ä£¯œj4W(“‘©ó°ÄÁå9£³%à0Ÿ^Ÿy²sS<of³Íë[°HŽ6’uÂØµVJ‚„ÿîî`êòG¬H¿8̸ÐÝk®#4 °Ë×DÒuú×Cd˜’Ant¯.u͹DÝÕËtÍýih€N³`8uGÞúeög‚g­‚6²pøùUe|h%øY𢠖CººB4–3èNêJÂzè¬ÈéˆatßhçÐK›riÒÄmÂR“ýÈ2Bøe¤uJÕž‹Ç;ãVköæ†Ûõ„SU ªß¿ú«E>!?“Û_Ùœø\â^d†¿ÚG3½>I2›=Ãä'A2ÐxâjY¬FJÝQ-¬ÓÓ;ò)P©î²ÒêxïP‚fD{Æ'‡å @aÓ1.Kª¿Ç‹5CÚD¬œÁ¼£ZÍ\47óhDf ówLì¨pèm#…­ˆ‚¢úþ¬eþSpæ[¢µ úö™r\f,°V¦«±åƒn$.Ž*Ö}€·¶šÖÅÈhöD:â禡‚" Ûù±Hãf#ièDšqçjHÐ8énÂû{„NÕ90N…¡ k‘‡…Û7n2ü|L!†­ÈË-€&âÃhxѽ?GO)ýƒ(^ƒ÷Ëèч¶”ü‹9KE8I·QqœóM(â;Vƒy\lã«¶>ª˜¥ÒÁè|ƒŽ‰Ç&t¢/ůÀΫTèK§”áÁªÏÙÁ¥ú~*ÜNYo5u{"½DP@L GpPCž¥g<%ãLÿ¬ËºPÔi¥,´ß¼DLsÆ=Onþ€¨œ¥.Ö”X×£žÜH’™Ç»fXçÎŒx‚¢ŸVP©íšÜè9±Æ´CbJMÅ×Z hÃÑÓGk(­0Se¾”å{¶†3W»±P‚_æNå_Vx§£´®¥5¯NöðÔ<t&®ø}Û]°¤LaÁ© Ò#zEP>¬º¶¯¢ðÿšÐÙÞ¢$oçõ1Èö>Ef‹=Œïdóühµ² tG‰ˆ5_I‡HÍ4‘ÀK‚Åîæ97š*ðqº—S¹.Žha‹¬¼)Ížé€{Ù3Ÿ¯ô.FîÃTþ<LtE¥°[.×n»—&\se¦½-ÏxÈ'Èø~M¨•½"c+JøÍ.oç›ûZÕÀŠÙ QÛ” "Þ‘õßøBŒKb÷Çþz\ô¯Øó ¿ì–ÜH¹«OὬ=²¶_‘OÕ³)ã²îYæÞX¦~ó#I+͚ߤ7×IY“?"˜ÿ–œ·Þ¯ÊZ2j$§lªÂp  ãÅù¨Aÿkr+»‹ÁÌcŽêÁ R=|Zx÷›´_zªl7Šig–51UÖbßḨël?l!uGûï.GÚñG¿D@ÿÙötaR÷® µçÝÌ“²…ÒzÞ[úÇ&~kHÿ\,T@߃i «sæB‹ÓÛªÑWݪ­·ªTsMÛ ÷#ôú1¹«Ý²­ƒ«›Õíãô©m}/nRiÁ¼ ™â<-ɘ^v§™9cß„–,3åÚ•¯¾?G¦¿IùÓ£ÊWðÕ&r\rP˜òƆЭ7Iœúü~÷'ä]øÉl£ÊvG!›H/¨ m‚Z7 DwERï"ŒÎ±€qmŠ0¦K0宊i8«GþlÒ·ÉÜÄiÉ¡6X=gg'Õ;]&Ê$M»ƒ¨{, ƒjñÕÚÚós°éâ*äi Ù³ý¼÷!››Ûû[ ·V=ᛸKáìŠaA®’ø=JiM}HGp½5&5žÕ7Ø.ÜåS)PÄ#ñBØr1¤ š‡L C磉–ïÒ7¹Ðì„(’ÚšYÔ LþíGl£t°޳ú•=?WZQ§‰Êv¨OΧ…#ÿÀ…õN{´O&™góù‘H9š¤vdÏjŠ™!­2î섇'*§¨Ÿ´m`Ú–¿_Ý&`.™©iC?‚˜K{ü“P/‚¾C÷WASèO„Á +<sÝ0[÷øÁÎãÉ|n…(äLW8@<|§=žè­¢ÿCݱ+Ę*1õUª¾îð˜áKçÀ.}Ô_3¤@:Š2Ð^!® ´d÷µzbåcmìRŒa²L÷²­(þ6$nâ԰›¡ÿþ&c£&ͺ-èâ(ýÞ[t¿Ôï šu‚5²Ûyƒ(,¼ÆÑ…g•{‰Wt€˜zº ƒÝÕ€Æq×xj^&“æ2JkBçK;dwêM˜£ü*ë™ÔclmÂÉæ.^pzŸviÆ1ôòU ¢ïD÷ÿï]qž™ÓÊÁ¿ò`2 ÕPç‘ܦ“=T½£skz‚©ô⮄#nû#Q“MVYí8X7x¨•a,Ó¥=ÖÔÕE×$áûÑWÄÞüné§×³–êR6~óÿÒ£Qwa:}l#@ä¥w,²Yçµ$ÿÆä­Ç¬oU[zi5d°XgÒ3F»¾&ÌØÏ¬I <î (Ô¼]µ~iÃó-ëmp7ÙÆèa*µäР±Ûu‡¸_,ÊÖs2Nfߨó—²4é°Ögoj/ÖWPÜm-«êø² ¡¢šqbîœ"h1ÉÐ}f›º³úà£ù>cP:î{8ÐfÝü¢¥ð²å ‘AÈ;Vºñ w­uP½TsÝãMH™'2‰3¤µ ×nŒnß%(Ù¶Ò/ΖX,kµJ>Ó‹1+35Qè"ˆ¨c[;¬¶o6Vˆ$SëçC 0jC`ºgmI#,b ¼£è½[¨ä;‚ÐÆ“¯ÄgŽC#Êœï¶@d*5íý°ÔK†«!ÑÙˆ5œAá%2¤ JÓžfªfU«Æ}Èy@î€j<²á‡-Z¥IPÙßÌ[;âнÝHÄÅ"”Eãýû È•KH‰\öò̤3¼Ï×÷ðyÆÝ ?Šô2É.j Z£Ÿ‡ýÑ·M‚€{ ¾ -_YYÿpí¢¤Äm6ÿÖ‡ç(ß N,x _ûLDÎ’>£ã}K"wðÄYzuQì¥Eí †cˆë‰þ-XcÔn˜ý9‡èLÀVÊòÂçÕÿÐF[Û˜…„ÂkÏ{!´h­ V<Âv"‹ÝaÚ@V2'ëufŽ–´EUµ}‰ËSTó •ø±Þhæ#¸$h•À»ÓÉŠð+3F²øÕäîô ŸCxËÚ›·ýAó$g'ü†ïݪšï j¨–±OŠôiÒÒÔ<¢¯ar`ÐÑŒw°ÿt[”OfüŽFf£P³Øžbó ´ðï–wZI ž-,LçeÛ¼žÓÝfÐØõ^™À!»$>šN;†œÊÛ¬,Ä>¿Ùò FË'{Q2ÅŽú¬ Œ°éW¾—à\××^Œ®§ç8¼Õ.~PnæŸI¡ªkUbã@¹ÒÅ)’=[X0© <¤Ìå7 C²Ug1Šñô‘é‚[ö…¼‚Å‘óÐŽ­@çžÌÚêa!;q¡¢QVz*šÒ;¡{…áî¼›ÓRðî…g ½ã§âp ÂK[ß°M¤1Ì®«<æù³ ð%üwªqj~8,#€óê1ÀO)¢ækä/Ê•¥ T£jbѦôk¸O¿ ù4Sçû/,vHË÷DÝÓ,ì ’ù»F vz¬$¿‰Œ #|^pšˆSp"ä9ò/ÈB •ϹgÌÚ¸$S^6ˆ‘O¶[ÜÔ"ðЄo¶LØ=‰¹ÐäO…Ãàa•×7^ ³<)ÄÓ,n:£?&J`6Î$ä†q¦ÑªDo×›óUÍvió0¼Ý§†ËP:-|± ÌM(_]3B’+Ó,Q[©ÓuËà1È•.ºÔlÉŮԶ~ß½CM³á*wZ®+ ¡K<ñ‘.|_7çÞj&”GYqíµ:¦+³þjz¹gÑÊîy‰F±½ÓEó¥Dßœ ‡îuEÞXlŒkzJ=EÆ€z¿_”~û2†T;®iÝæ’î½w“UQ#E±ùü49•²:ÓžÀ“ËsZôSŠÂ¸þû?NxêC>å)$ž¼RE¡Œr€F©/3ƒ®ÀèÒ­ä ¤)’ø?î™kS°ÄµÕqG‚È.¤{ûH½@‘P SÊ`dÐXÆ{È=2ä¯3TêÃÎÆBN¢,CÎÜ¥@¹¹Ã&oºúy<ßÚZc˜GG‡¼¥ÿe® ÊMLyR嵿.š~î`ã~D?üoºQº Y>I£?Cq4éæÁÁ6¿ˆ?8N­N9æï<"FC óº =³2ú+œÇÎóuoA¼Äq5ê“úÜlsDC` ±¨!œvq*?4ʯç8¨¹•K¼°À6ƒ‚Éf±I<3·Ño€îìùnÓо·HL¦$ýÙðßK@`0oÜ¡–"˜WSnöª©/ÁzE›#:œ),Sdï~’7P·æF¤]"<@mË© h´{)ó iÌøJ;ê·ŸàÕ‘Þ³Ì ¥¯c×°ª b˜Bÿf*ñŸ¨aMõ®áŒó¾çƒÎ Ý£œí7Ù×™"uŽ^݆q©º*Å ôO/Ü&=|A‚,ËœGºC©öÀž&%%§z5ø,“¬5šQðú€LÙTÝg¸%Ë&ØéC‚a×A‰šŸÌêL³ï(9Ú°Žü'4í:”j++L‰‘DnR÷Á¹­ûÄ›$Īð Ñß"  jû´Þ­û´3 øšd¢1JZn=|ù!Ãarý!¡ñu "^öîQPÔL•=o7û}¹aEzùï”q VÈôQp¦q´F¯kÂçÛ½†k@\oþŸïY•¦e²èT»™Ü8_’E\9x€PC”Àú¦Ô"ýæ"µf&ŠUÛÉ^^EK—&ïh/Ï»_.Í+ ñÂs€`')¹£Ó8âÔÆÞdzöüŽmæPeìkebá ÅdÖªYIŠôçü§ñè2Ò$?ðØº°ROW¨­ç°ý³(”@K¯Ä<@±ÄH—º“ÆîUé™f”哛Š(c€…Úž§Š™«ó¦hÑQBÜæc†•8˜Y‹ƒøS‘³…N–§=¶ ´ÍšÐ¶|Z§KÄ6¹nv#qXc3h„+XÌ‘Ó{YÕœ9ë±t3‘¹"ŵ_ÊPˆ1JÕ’w›d¹Úesi!“èÆ õÝn~ñ¢ý:Ü lK‚å0O¡7ÕCݽdêGª›Ž0 ÛéÄÐë)&…>J@6#Ö¼;,+ÊTËaüÿû²ŒøÝ/¾‡AÞ¨ó°\¼žè°Ò=B: ¬\žä%#¦¹— &ŸÍ’þýaÕ×mn¿qѺ$ä©h+œâ£›q(Ò&#öˆv¹“d=AMÅ’œÕ•ÓÌ*-üMäiªË\K¨C;ðÒdãtðCŽ c®tôÿ¹‡a–˜ôqqštË0Ûyœ·<­²íL»©X½»QŽx%?¨ÊÜ-]‰o$áÛ;Šçªã¬#Â|X´Ç$TFŸÎxæÄü‡+nM—pIܹ*î?=—C0=UI˜£†iÔÉ:-•ÄÅôÍ8œ†¸Ûø,2½¥U‘p¾Œa“ôáݶH$JzíÓûY^&?•.ƒŽï€å27ž Y ²j¾Åü!BG ÐÞeùÀ­ÚÆ€$ºeã5‡ä ††Þ¡Û3Ôíšw<ÄO7ËÓŽßW|:c{~$ÞVè¶ 9‹çDÚF¨n²sþœ±Æ\E/âgYÿX©–ÙÁ¤!‹˜œõNäøãül0Q°Ž††nßb¦Ñ=‡ÌÃ÷.€?]!^Y ”V{O?©qx|0Qu¥È¯27€Jþ ×L¼-¢öš\!àvÖ¯lR‚6«j xŽè»«æŠò›VÃp”ÂãÔ}M ÅpOa8d,MOí·Þýßë¸'!$ЈªzÉæ}ñœ¶·F=¨®Nˆ€o”mæ ¡ÒQÚË»z¿-+{.ŠÓX9ÁÐ,”%“›Hêü°¼õ¿ù?9Z˜;LD{Ë*Û#}]V¶÷‰-˜ ß*b±”ûô#1 ñ,‘U•³Rܶœä~‹ò(6Ê'䆑eVÅ[OÄ•‚®ÆÑ3úŽj=¦_õõ|ïzlÀÍ+j‹ À‡“ÿ²a´n;–*°=½%ÎQÔìq©Tc-÷4!$;·P5FNZ$ɵû€OE½ùZä\×b£²##”Ìáò7&eéå>|òîÞqªsÁ¢ àgž¤óü¢ì[qe¶J2‹Ø2¹ÀîOÀx#êçl¯Cgšd|¸}jß϶lôñI¤3,s^ZÅ+9Ôw«~¾_^· Î(ãVkcÍ»z##^‹Ø ÛVó™-ö¿Ä‡8„”›;–ê—Ùœè0ÞºöëpT3ʬ Šî™õíNÈØÈÉ_z§§õë‘E»âpxÓvôxú*ë÷ž#ÃðB0 t‡-¨¨#ŸNÉ{Jpky¡ýÁûRtÿSâ9 ‚„ÑtÃW<€¶B¶©~øƒö¾“}A,Ÿv%À6ôØ“;[èòI­ÆúÎhÊOX›¦è€zºÓôâ$=|7ÆVR5Šœ^9ÿo ¬‘ÀV“O,û·¤J}š¼…þ®?KÖêq1ë’¸a#Ðøv —¬ ÕV[wþäûL^ê\5á—®>( ˆÂ B‹\ i7ü±®çÄ…˜2ð¾Zw¶éL-vÅÙ¹trÚvF/^FSÆüÚ›`îõº¢(Ë©”EôQ¶Ý‚;­qbvÕk¦~›2BnX@$r›*«G71c*%äÌ¥+œ=q¬þ”r ¯ÙXxüò­YÄì¦0r¢“PÙ/÷)«¨“y%~-ùGš'MŒ‹/«âî<úcº•锺üãA”5{'þÙÊo,cžën€˜ây¦S–kõš·ˆØ^á‹~õ¸Ç¨¿BÞÅWð,ÿ•±“{Ô¢Z„÷®™.K}UY£›†þ–¿ÄêY‡¤Nr$üftXHâ\—¿»9½\Óž¹»¹Ô\ìúlÎ4;ÚÿNk|=’-öŒ–7ë!L•…óAŽwa‘··¯þ¨åج!½[NÞ%a‡4G¡™ïG Ì{å•_¸VÓ„Qú€I¸ç',‘í‘ {@eMž8D’8Wô?¡©kiô,‹©„ä*†ƒO“y,ì(o…,›}Ÿ9 Â^0Hõ$oÄ )b)%p“nÛÀ-°Ù>ðCÚᦸ›«è>€ùn°ŸÖVä‚òК'AO’AÕP×·s’œsHÖ´Z@‚Ç-*4·ð¥(z¤š®¥>r¼†D” šÏv¹s®ŽÞ‚½Üx#ôž8†òÇL. ÃGé!£Rûô-~¸¯û7RÔu³2X4߬­z3èaEâøë×C¥àët:öÝæ‚^êA›5šrí =‚>ؼ 7¸xä¶ ³KZ±ãPœ3^wàƒçg…߃?PÈÐ#^.Þf…59ç‘,‹E9Ü‚UKw¬aiÄÎóšxcä%ÏÇÁ›¦_LLÄ2uœ²ƒÐ¿]“ü8 ‚?{®£¸Gg ZKÏMùÌ¡¥a×Ò´6¨ ¦×JÚM¶ï¾rt&iM©ÈùÐÑ&_1æ'Aœ”Cë{°²ª?vNÙ®óE.5›Cdí¹ öîˆXg¸™ Û¨'Æ©¥ÛÜ(ÿ*\ úu±'[ªw1òLk~›P_ š—F¬žš÷RÍ•÷:MéKÈó¤8Ù_o`ù³4v¾RcÒ?U†ØºÑ–›aæcüv ì&ˆf¶À/Ä5tKÀ(€=®3>zÙ°q,¾ã]XQEØJ^®€ï4£U¢ÊEcYpÊâѶ†ùüÌ'[k]À}÷½. —’«÷iTu„}ÍHV¦=h¬j ºÚvŸ#\tšàÕ݃´SCO–žej«ÆQ¬º½ˆF$ÉÞJÛ bs*ë%þõâ~¡ñÇT®x3Ü@ác©z┩ðÔ¥‹TFÌ;Odó)ôFü¿¦±¥IÊ|«,ŸJSãÃ[^ ´>Þ½U1‚—Æ„‡ÛÖµ˜]+ŠEç*%vøjõÃ@Wܤ>ŠvñòΜœ´p¨kæœÉÛøBén_Έñ4²¨Z‡žYž oÅ…ŸœÌ±©-w!¡Ëäy†škiZ …Ì*ËRæ¹ï1®rÐÚ­ü)g.êdls7l áæŒ7>©¼‡ó»þt pÊÞ´ý"ÿúöàHI ƒIuNá'x©\üï*¨;²îÕÁ坿‹ºÂ nh¶Ï8RµS±Ê»Ö7ÃÉ„’i·öò½¯Çw[ÙO¼™†³"ŽŠBO Î¢Z£åÚô*íÈñ®©Íé1ÿÛ n ¹o€×Ïà'’ 8Å{½6—äêΘ[¼áròÊ÷µGH!t+.L*§u”H§'­,œÛ÷MKû¬Ô©æC$ô•¾ÐÔ|úD¤—åÍ?rü·‚-ag-H9°­ƒÓÒñ€Q£&lKÖ1Œ­öC€ ¯6Ò”GñB³¬t;´ãœÍ /]¾AoCå¯Ð‚W¯%¸/×#”ºò×ÀÛ°óQVíéEìÚÓV—‰ƒà‹ÑxŸËrÓ2ïüQà•žo,|®œlíJ,ÅIÜýݺÏÅ¥ux‘*|‚z]¦) [·Œhq< 9<ÜEÆØ™ìRÇéùm"A£Ÿâò²ù£œuyT¥)ŠžQóOt7ÀĽ¬á¼T sÎjy&ä½/ë°S6¢64,]&aô±éáþmÛBàÄ0£d­&í¯ »`ãµö¥¹(Fj6ñ¼kjmÏ…s8VT/¦‘I$°=£”¿¯R%rŽâã×ÑdÇÔ?Ènk͉ª7žä¾AYóyôAZSOó§V)ª_†“ÿÆU!1fÄ%²J-—æÓ°ènîƒÛ›€ß’_­k: ÜÑó&I£¸n%¢Ìø%Sø ¥d À/º­fj)KR‚Ïÿ‹Ì#9TOÒ.büLœ–V>:e%IVÅJ ÔæñH¬á¢íƃÑà½üøsªðÌ›õ• òO“-T½ü%ÈèÊÊ2ÎÏs¡~KQúTJ_™4ôèjþ´—Žã¤J>Íª‘9rî¬Ê-?DÍ'öXäfÂm% ›{ %ô=páDZ¹¼œ›ü{StË2b‹]¶irøêM¿Å ƒ¸(H<ïûã{4É7d`ÜDoßsБ1CÊ"ÿR–Ѳ•Pþ‘ý§.8NÕ¦£> þèC•òÊëêmáŠa'šE_$‰„y€áQºyøãÄC³€íNüúrâ°¤¤Ž6hwá“ñ4ÕÙÑÕ]lekHæ=JU¬“ëêܺ&…ñ]ï8Æ-N¡W‘Ôé '(›6‘UKåK˲¤s'h<\G½Í-%>[|5éýr¾ý![ç„[¹ãͲû5,§>éÖ“¶92O“(@¶€õ99°ÐküÞ>8-;gÝï¦Î‹´ÕÉ£ñÊ0‘½‹`ÕBS³}ŠmfXlH=øgJÝWÓ‚åmÚ¦éß$å{S ÿdÀÖ?—çjL„¶!ún>2ì•Ý9â÷%—œ‡ÅÍ~ènššS®O2?\õ (Ð[uc“w g6§5P‘Æ‹âÊK _(«¨a9lÖ1Ùe]mKSÓ¸©«§4˜ñ±FÃÌ-˜tÊ*;S«{Z8éBœ¬…B—!ÓR/‹ý›"n½–áÓ®ì»#´á˜¼çf°MDz ¾×ð,—¼O†° +6C9„ŠK„8ÂHë}ûRÅÝ+ªoº!q ˜? ÈYß¶îG¥:–¹¨ãùÔ~˜Ï¼].‰0Ùë;(.©Ç –(Â.|8¾w²K¿"È~U¸'‡Øû}ÀAí‚¡¹OßÝgEàNIsŽo°Qqs2 k®if8A+I&¾×ø?8"oÔë,ô⛌;7­vG)«CÀù¹_ì >7°Ø?6X l¥å{ãY~8&i븳;n'çÝ!¼í*U¯än‰e¢¼Ámà­Û–Í*]¥H«À*%ðÜSWdwÈYýä}îñí`æSfþ¥€Id*,ê²iFæZµ4¦îcžÙ·ä„'£î"Úbr¦pÖצ)¤Žs­ªf×ÍJÙhP¼Ÿ Ê?.Ôñ§*8{ ˜øŠª>k|;xA<;šÊwÆÙ(â‘y× ðãL1wΟe› 1ñæu ^lg¦2¥RŽÄU{¹Ý§/9QϘ¿‚Óˆq¢F–6ߎœ¾lyC_½‹ÐÌtaÒëÅè5dYóŒ'ÆÞúXx·žK(ƒKO •êùͪ'Gf‡šq‹viŸKyI£~„§[H“þ Òš­óX$g •tgÜ¿xÙN|„ Œ~Z—.¤}¥Óg”ÒÓè¸p7,¼Ú%x½îhTίìå0 ྎ`` úÌ~¨“\mD. P_´î„ðl; Íà1aËúc¾:÷¢e€Î§8>–o>:fù÷÷#RÙÔË$‹¬Þ!¸‘Yx0iÌ{´¾ ŸÆTV>º€fíØ¶Ïä˜Si •Â!˜wÎÔ_¥mõFšqšPEâëÅ‚ùÔŽsë)ªåAÄÜ™¬ªÎY=k²%¿°B*Üý—ESð£Û‘”M­ŠÊö’$iOÏÊk—•¿“Üó$֛й²G÷Õ©÷ߟŒë}) õÓW¢ü6‚MRìòhönE­û•ãèæÈœc³£„Jf\¶R?"H ¢Î†¨×ÿ8ækhÏG¾)øa6áøö¾´ Ì˜íN²Þš4'©»™2«b÷+¬}lÅô£ä¡»•囼ûš|SB¸W;ÛŒì<‘Æ”s¨ž3KÖÄì÷Õˆím:°¿ gLð ­GšÐ “^@U=ýð¿q´£‹èÞ1è8¬ŒæÛaä¶È²&sþ¤óWŸÇÁ¢>\Ø‚e¼ý‡ÙÌÀg.˯…à\T¹Ä§q‚³g¡i ç‡ëq–kè±äwìo uÞ_ò¢F¹†8¤<¶ ›Š–øyë­f6ZT9dŽ.O?å$¶¬]ÔMúˆ ïúùôÃò«© qÝ<Éš–¶ ³ §È@€ï{ cÿDV}º÷·³Yë‰DnC£>Î[ Nä ™3Òp{Ée)›ÏÂ%œµû,“5d á¨õMy¡¿ 9Eö˜« ðýë˿Ѓóâ-EQ‚jw¢¼y»¯>ñOnÚà…$Í€m7UÙÔb]Ÿo‰º{#‹°ç÷âñçÖû¯ @½·å\PäƒuJ¦?LâÌ…d5Mjédp`.Á‰Ë˜—îÁ¤e&ë²Þ·%J^GåÜdFfsöE­g­Ì¹îýáx@)¨'¹Ù¸Lì·Ý‘ ½>wíQGä7g, JmkzQ¡‚î7M™»!àÓ±JkÕ¸Õ…@ö˜aÛÇ.Þ$ 7’¯}~–,Ä™ûéP÷a €œ4nI &|J´ žQ5™h¹Ä`ï¼³n¶ Ê¨ñ ³¾¶18XM¬=9¾\OOþ¸ïQ['²`¦íÈÇÐ.‡Ô2š¾nDKŸŠ†›ÓΚª5.Z!´”½ NMOf躟#ëô•öEÝU¸ðê3®jñ,+/rW9.œ #n·ëvÛ&€šüF©û:~ÁU“½ !ÈñêØ”Ñe›·H–î +¼ Cç½!šD¹`OlЩ ÓñŸ'êQÀ¥XY7íóc •×¹?1&›tÔ~ó Þž±ÆMÌ(Ð P_¹Íý'óRp©ñš']yò–øÇBp£GöWŠ;Hdç*•@ó±K®–ݦ,þù1cý õÓ†¨h¤3Q"èÒZY @ÝÊ™iøû£¹Æ-õ¡l&›R¤—ýìõMà_£€2 㕵քOh–D(ì’UP%‚<ËßfBýˬÞnãoiçz'-:GÁª (Äau_4Ù¸Áqíj!o»t/Òƒw£þ›UwjâXaª ¢6ÑÕÕkùœ«4Ìú.ëöI/¬¾G…û,+1/õ1C»§J·˜àÈyÅ\Û%óeþßå@øÖ^Šuõ½K“ûx¬£zT2M³.#ÉBŠöLPâLgcÃ*›ä.[¤Ã°Q›K-EízóÛªû"r#­Šbk‚–uº–SŸ77Uþ¥Ò:Pw .Ü’#ô²p L¿ðNG==9:á´…)”npå‘-¬FB3û4DW ˜?ióŠÏš*öÍì}_ yw©cP2å+9Í oÒ~¨ƒ¦Ÿbg`\e=qƒGîÜǤÒ{ÊœÒï;Ú¿%¬Ã0¬,e[$Ï™væ×1oä' ‰KGÿcMl –Ïm:ΈJ£ôrqTÏC¦5¹?•Oñ&ˆYHA„딂ªÇQ¢ªF/¡©lànüûNY­ÒÀ&·ØM%/ëFËb~$öþrj‹wWØ·Š}BW)–ó]п¹×b!‰gq:ƒ–‚"Ü€¨Zàhþ«ªõ¯ÕÚ–®suqPøàÒk™`€äYÍ¢{Yý*Å$sÑÿ¥$¾`0˜ÔR Sƒ¸×¯)‹ðIO¦Åª-í郄~}b—›Ä(SÚ4W¾9öm|/+fLÓÁ ÷p= h/m»ì2Ê œÙkB8LÅ•4,fÄ**RÀ~.V©ô~p=Ë›|Jvž%¿í½×q{Za¤ÈÚf¤t«†!Û‚GvÍ(^yÐŒ÷jìŠh¾ 5(±{Üœ¾šÀ©‰&6ÅYØe2»- ß7¹'%d‡\É] ÒW(”5kñEÌÕ˘ßà©ä7‚¤ª_"¬ ,Ì:* O#æðíâ·ùºél«ËX}]P_?j@Zá£Ýp#¶{Ædƒ“ü+œ vS±0ˆÒ±üùàÑÆ$`‹u¼“^½×;žoƒñîiá2!ï^Zõ®[msHË\¬²ÿòqß+ñvtûq_x[Ï©™¯£6ÍË`Ûh âKŠ}çcÖO†tluc‰XÏŒÁžÐ[vXáÎ ÂV[r~óúǺ\n]˜æ39PI®Ôìd gn8R둞,ZHí­1S®ÝºýKéotf\F £{ÜTÅÉ3VÈ_eºÌc³ÅìèŠX[R*wý>ˆ>PÖXÖÂÿú•²{÷pãAˆJ~z§Ç‡kÚtÝ<ŸË&L´©ÆÙƒÓuóÎ=ZÚ’Òô`“JÝØÑÏUŸˆ 73¢´œí¥^·¶‘øaC1óÕØ›8 Ù¾)eÄøo¥a•óûþ6p’€r’¸ù'ÅôO»¢åì’ô•$¹6™$y†áº=ˆâå¢~£s¸`øÿÿ$Ò´÷%SÖjIZ=+éã@{õÏ&0ž”úä|<§*É';0ñ¦¡QÂJÎ9Éõ2 à [Ϥ:8%‰„"pºº©ú"ëÚ5yr¥¾´†8oüž£år†Šæk2Ä‹™r1e©´ŠÜ °-ºïú÷£6™)@›E÷;é+"Ôþd3ð0ÃßN9û¢-½™$7‡¿öï°ûÐ[Ø«¢ºÊ~f·tÝuó«Rv-\ºµ_&VËÁk“o°–d Ê‚ _¨»ÜñA5OÕEg Ž=—JUý%ùþ@½OwE¿a¦µÜ_ ~9 Ü#Á‘Ó9ÜÐÜ•®oú¹B8gé¸Î|ÈäÅCõ49™B€N›åNè"Np0{øŸÀ=$k‚ níý5Òa…öø ß½pÒO0äo׸Ïoh¤H¹±Ï? :…‰¾†J³Ë’ŒÌ~Võ¤è-Ù°ˆ)xqGù‚ ¼O•åϘٮÕ Nû@—H!MVßÐ=SžÅƱ»²¶F_Höê;ð¶ºÅc—9˜r¡ñ*ÄD¾#—v]wÁÁÆ‚ëÉCÖ+QzÜ>‚;"+7÷M6Ü3âÃìŠmå(6àtçÍB´Oz<ªo!ðÉn³õÓQTVBL€þÅÈ:‚…÷©7éG Þêƒ]ouËiÓ½€¤Ý7ÀÝ)=3—¼ ¯¤5Žm²"e½FvÁ·XN¬.`e4ù2B—ºÍU6éöá,Ó:TV Iz¨¾i*(AÚñëã „‚ÛA³4PÚ‡òÁŽ+7—Vç\‚trÂÎwR=VmFË?û­ðBï6L Ãz[g,Av±U”z1úeŽÑeiÚux~’° Ûø:ŠÇ'H1*:D¨ «ûnå2“{¡ûKEÇ‚Y9åÈtÕÜœºìU=2zÇY”øž5AÄÙÜDjJ¥Ô¬…æÚ7‹ì湺mT:ù† ,@_C²ó áËë„âüÇè•”6þ}Ót¸>¾Ý\õŸíŸû÷ö¸<ÛN©QV²ýVì«ü¬— ³ù¾Âñᔕhd¤Ú!Ë9oeá«%èl |£yÈzmìmÈ /hX‹?( úù ѦÖû…ì³™z]Š)hÉ Ƚ¶ ¼±÷h¶¨6hÊ£+sØQ [´IÊÅ-ztýôOuf©ÛœBú…¿G­]7Š¥&èH¿ï²ÁHûîˆ(Ú1`ŠÊ·?!ßž’;Øì /®WåŸ%O6šU¢w"»ô®BLù:JÂ.(ý«f¨ö×±rlòÐS>­KH$×ÁîëÒ•¸0*<6ðjë]ºrtËq aøä¥†ÀŠkÖç†UŠ“{M!ÞGæg£^üIö€r Êq˜,êÛ<)S üš£ìqwK}f @{` qÚíòX¬B¾ª(ú޶YœÞ Äñê(1AG—¯SUR¢ì’¾Z £™ñ!nLxsS&DÇöüÐþƽH—?ÂõŸ€Ä H;lv¶=m·ÝR1?±2—zÒÆs&føoÀ3mØîPBUiU¼‰á½ ÃSCÒéOø‰ÐòFùY 5딚껷Áƒ@An… ©ŒŸùOLVHéÕqµ§üB «6ö¥~£ vÛÂä†u®»J½Ù "ŒHž) ed‰‚Øî­µa§¾à— –MÿÍOT˶¿ZHCM‚*†' è†ð lJß“ÁŸ¬GÑ^ÞiU±@T‘KW¼Òæ,ü¾ä7ôýaRü· ;¤ Q¦œ’‘ +Ï2YYšÚðEq¤”‡‘®5“6{KækC¹õw,Ü~JÖ*潉ý,Ê«äÞ§KùÛ»«ØØè˜‡|ky&WÒ"ƒ‹ç¤ó87}Ñ }éx·pHþ|›îÁŽÅlxÀ­X}[”ŠE]|¾ðhއ±Ñ6ÄUP#N—tÇà6Bq?5J\H—†È¥=õÏ ˆ6Q6ˆåj¬w¯pnuÛ9%g@œ~n¨æÈ÷†j½‡áEË´Ôõ!Ý0¼Ä¶áR<¨Ï?¯¤ïë‘KtÃ%ë±öé½pj«6iQ ã&AÇü³v%U?N“Î÷Ë\)¶oŸFzNQKµ=°/÷-ð¤“:MQ -NÐÀ u­¯AÔFž‹Ò70kõÖ}) á3ÂPÎ!e²Å2 É›…?„$„䯻hì6vé5•¶µ&s»1;ðás&Â[%¸`œÍ¬n}•|}bqK2?€\µç[¬~wÑdÿ2DôÝC”¸Öm_~å  é‚w^]¨Ò±ã´À‡`ù,/Äf2âg­¥Â9løqŠh\>¦Ø2hX=`ÃC}[˜“'žæRXM©¼].:0°4Nºá\p„] Ð¥çõ?ߊƽO°—¸;!ÌÏn?88UÖ3a2L–á\¯1BT`,ÿS¹¦C)û¸>]wIv¦6&?y–ƒ9 лîÜ¥ôÃ̃V]‹¯™*aé>NŒ÷\2Î`fá+¾§À@ŸŸóà€¤Ñ÷Ɉ%qox4é—KNZË›¹tŒãλúoˇûÁøÛ†ž&òå„Ïc@cŽ÷dΟ‰[Ù66Š»R÷´–á:á²'à À,.~éü =3þ“n¾TóX„1ÖDÓÐݘüŽ6²Þ‹±Ð¶qØÚB÷‰àÍ5€‡ÏãôØÕ¤Ø~ÕgØH±âdz3PŠˆ ®ü…¦‘¢€eýEYd^íÎÛ†·Úójávv’”ú7‹LbÜf3ê»^àëÈæwNò$ÔJV’"ä:_Æ"W‘ìÙ°âÓ==Ø yë/“ýaæFæÒ@Ú¶%Њ€ÁTÏdJ¬2R§¡ä÷ÃñGqCª;´<ª®¨¹+˜6ŽÉAsÛ#ò\©ƒáö™ØåÂ^Øo!Y´¾Sk[:gOoæ·ø¯û@¸@±­ö3¤ÁÏ2ß1G“}˜wŠ8_›”£ó²!é"Ë}Ø#ã)TèJK„"&¡—´¿ÝæOÁû ¤ ~•¯„D¢9Qj>ßÃÎTžÞ—ìdæ¾Ô·¨šÝK³µ#Á™[<[+MˆÚ(·‰¼•Ë”ëÃì‡ÙéÚpNš—o¬uf¨4ͬ,ñu…tôÝÝLÚÖÚrð„‚ãž ~01'sÇߣ\þö@£n†=ÍZߨŽW̓ñD'M¶±; «¡õ‡(ÑVÀÿtjsµ eI ¥é׋ß,i“èUïÈoÕ>[Ù”ðSd°LÉ…éºÓÅÓß¿"|Ö´yz~ˤiIÓ 1H€ÇVÝ×cɈ[˜ïÉÜïgÅBàܪ?e½ºå‘™[©a쉎jǪY+xÁÂT3Yó ›…¯É X„ùÞÞU3 º<” /aÕ†’£9ð—HäË/JoßÕ SÙ^dÌ«ÎX#&§ÞÁÎTtØSNÀ?®Le‰ÿå¾}¼¿úÄ´Zˆw¿Â´ûCnŒØÁ$‚qeA±ºI€)\ÛÔ™Â%ûø¤µ¹žBØ/¦€ËF;º ŠY¹=}¤F£uœá²±È÷»-³¥lr¶ãʲ=…«6EšÉnŠz°„?Kñë6éžðÏ©”_³„œüg[Ž@øÉ~½Í8ÈÑ«¯\=PôwëK× Ýˆ£•œïÜ2=ŒY»W¤¡_^5Xȯ“ÛEV—Î讃ÖL@.Mhu‹à’œ0inûÛô r;Áîÿ(ªpIPE‡‰ó±û„âÂãZòTÿ–ÔKЬո?ae˜zÏzîÎ;Ñ, ù‘ê¨m“šÂÞóíÚ˜SwFýàÄ3ÆzßgH%:µ£C›Å“ú—“4Ú«§j¶Ï/ð>ôÝIÉS ø™!7­!žß¢I¹Ž3X!,{=Ü‚Mk%"ÆŒÇþWë Fµ¹‡2{ï+ÆþÂ>ww˜Á®tF"o]²].Z”)–šTô€Û?ºåÂc}Äc 8ËLeâ£;¡mgð“ÀC)ôMÌêÄE±';c™?‚àj2ÝŠK§Óò4Ù/p Š>^–XM!×Û ¸†ç9hÒŸbècú)ûEš/ü Dÿ8dW™î{ÄÁåö jLëƒ êäœÔ÷ìÁ÷ero¡Þ$‚9óaÞÖÄÓëèE"‚ È¯¸C®>'µL‹’`lÞ&¬mñÒ‚]Ë9eÃ1åèý0º&†CsJJ©*ôèðGo'IÇɰ½Ü½ SU:™â´¬=nu¬|üX™b«˜uÒË^«ífŠe…YÆ °–¯Æ±,º„ÙNÖË*¦y2è:g•5¹ãÅLíkÉò‹U«^¥OËX>Z¼Ž×·ËcœÞs¸ÏU–XI+l;ËŸv“õÏúëóòË`½Ìr†6,"Ù_À|-º~ú,UÙϸÖëƒÆRõC,$ Ò'+Ïîƒ Ü<~˜6Ю܂ÿcˆO\ëUvd+‰%c¸D³Ä8koÿNOÖYŽñÖã4ó0„7 W€xd7.aÏÛíG®©Iü=è=|sü1£(笹âjù}ßÂTó#²sº<¹ÎªOufÁî `5èäeY®ûÑ•Iê'ư^JÚüqÜtÌÈÝÖ§áT ÇOxž3€³bâ¸}|fhðVI…*>øc2Ô¨âÅ|rdÝ ezÍy³a?+’13—Q˜äµ•ðÕš`ô4Q/H  ´Õ"óº@´Ô‘ØÀ³³OïAÉ, pZ½YU³¸¨ûªíÞ´^xxÍ=ƒ"ÎpMêÄ.îMÛ™çoåHèXź}f%¨ò ò—ýd" ²™ýõ{[Š‚¬!¸9ÍÖÂrÆ Õ.)ÅÔ PeH„g%hlOÇ ª)dÓÒbðæª†ï°éÉ8×ði¸3{}þÖß8jzŒ+àíàÍTÕyHÎmróüëÆ1H«õMûãüêìv bEÖ:c@-^ƒc“†¾\ÿ\ê¥ÐÝnlŽ«e•Ð?’LSú‰®»1Î¥ãÃ6wë}vóƒê=þÁÑ[Ë8ùšeâ¦Y5ŠLƒ¶®‡åÆ–„òÚ’ôv>¯: ÏÂÀ©iZWø¥7µ}ðYaÙ|ÔãξM\<óÖþzKĹQ›Y‹<Ÿ*R8¯à8!ƒ®÷5LJÆo¶2S²ÎL²Xþ+ãÆÅêiµõ9IöjDN.Ù¤—[ûr N‹mMWùŸÁšlÊç5Nýù›võ§ÿŸ’Ua)º>”zFã°$³Ã‘|¾1´ÕÃjÅH:û¬´´é¾é$‰¹c®´ÄµÛáÌŽßÒ(VY¡' Îìï9`)ë® •VŒâŠ!âÊåN§*é—=¢c·,äÌVM“Û¦£.,ªGlÉ€< Éÿ}'î¡ð©Ø(,K³=cñÂ7Ó¬’/ÚçZˆIh ¹™³ßd×w®»¹£Îâ}ºï¯ÚÀR31{8€ó÷]y(:±4l"ÑŒÆ0{ •w W,aÍZ´(NÕ’Í2 iG+Ûr¤Ì«®î-¢Y|wsÖ*H{lEËŸ¹%Ï@Ù³ ÆÕ¡rÙy¢…(E­†«rx ‰ÞHàØôx8;rò­Vú‡4blÔÕ)ד–Õm¯:‹å Øòà}Ð&â$”'Ûæÿ—?(øm¦ƒ°cÏEwJÞkW¬yY²PÀ[5ÏöZ9$?ž3?[þ+ Ðb[ð‰Æ,) > šÁää[³ +(¯n)oú;N!òüÜ>v›\v&0G¼x>›:\í2jû›oä >Þ`z ¬‹Çòu ƒ;Š_p’~r‡Ñ/uÊßjSäê·fû$Ó~Çd”ï¼°Nш|²Y—"$~ib¡óµZQ/øÚo×m‡ÑÇw'ÇŽó¥ƒ_\F%ü>,îWótŸ‡‰Ñã@W9p›vâ>kã.=^óú’â=ñبÍãù>ÿ‘biM ,ÏG¯KéœQ2ÂO@®¸µømèö¢ŒöÍ%m¸@šñ¢#t msKíhð'¯Ì]­U?rÈ}ÆUÇElñ|®œQ®”›£æBèC²üà ‘`:J-QŒ=„‘''åK_gö–µd´¡À﫽+5ónd]¡óëè¯á=YÑ.³¹2r­Ý/š¿hɸˆõ~*~ÒïNÀ§¡‘ÿ•¿–P>[†~&†CÕÄK¸Åxݡɢ@JÉž˜L>gh ´¾Æ:üÏû Ó_¯'Cõ£ø`ö–6e±µ±—N÷Åš~{Ymœå_w¦òe‘¥ëJÙ®OElê6·³œZ‡±ž‡iQö;Yà·ó‰KŸ7Él.i¡Ü”¾_CXÓ$ÄG¦ÁTÐY‰ca·éXòiNQ$¯bXÿNÑÈ´¾ ZCÔ]}PËÀäô£Á¬«auËEÆX'µ"v”„ô8 FQ£2.›sñZ ŒD7‡ÀÓKÑɶ=æšóŠ O[­ £o»¬á·ˆ;p2Ýœo9Læ{D7a–iÚ’gF*¼IC˜Ýq‰;ÐÀ1vã8¤=¡LÓmÎúj³mÜûš2©¹“¦û²G9õ,ÖŒ V’ziéðÂZb í)\‹.*Ÿc±©ÜRS³¶KâÊ%ØU®#½²í‰:õr=~>O/ 0y_*£"ÓÅÞPñMKÄÅ„´­ Tª¹2ÙviØ>v¯ÿ‡VèhÙëw÷'·„/—ÄFež\Ô8ë$÷÷€Sk\ÓLHßͧ>Á0³CŠô¼MÁL>C0]å­LÀžf1ëMVüÃMÓ¬[P/6Š—»ŸVyJ¢ŠÆ‡]?ð͆™M°'áJD†Lc'ôKþA‹‚ÝȰ)²âº¨ìö/)^QÍøIϼ`/7-Ñ‘ý0hRÁyp6Q-¦XŽuÎÀÿ´Ò §/\i a™ £ 'äÅ:ÄSÙª»‚…ÍJLuðpLì`éÚOwì¬ŽÔØ6>º9l!â‰D!E.H¡:'x%‡7U‰¿øýO¶mµ TZæ,jã?„é KDiÍå˜þbÆnzÊꌜW´tél'–°bÚdàˆ…õ§ –„äÙu¼äŒL÷­øN7%–1T^Ú«ÒØ1º„¥Yu²î!i‰^3øÓþ8il•.“%I¥»ßwµC',3ú,œºŠÔi]+…q$-èòž<ØP]7ý])æsó+gCh^rÓx“ãJ¢u`Qº“öàŸ«²À <»5}T–%hØýkïiøá–e6[ô/ÿ~úEÒS¹±ÍvBÍ„ŸwϾ,h›FÅöšÆâ L0¬‹þ2gSm§–Éç’­%2Bø9 cXî¹31–r޽B<¸8ÿw2Ç$V¯•8Po¡¢™eèÍå¿è"Ô혈ÿýñ*;á.–¯«=Ö'mÚBVÚ¡ô4Ó2Sô‚§â¾ÁåRÁKÖ«·XË aX'*ކÀ%²7 ÿia˜¤:2JâFø’96Vfçpû£’6~ Ȧ7¤YÞ¿ ði?0Œ5’ÂÚ&êú–C\9Æ ,QûŽMë N¡>úÝ÷¤s¢ö®I³©B„ˆÐ Ùµ. îüšô´h c=Nj `·±àÐe}ô15Ú9ò˜JòHxÏ4Å–@Ã÷qo<8A wÚs ¶1b)VÊrs+¯÷ ú¤ Ù¨´—ƒ‡¥ê½óyJ’jº´O\ÃÈ简óöàF>>lxµ¶@þz6]>ºjD<(Vtþ@òOȉ>t]þkõê©÷'$¯yFXW½u3¢Þ˜š¨»'PÒ«+ÂÖ«É,öéZj LГg@yÕŸµø~ÆHÔˆ;ó¨ÃWžátúðÕ]öØ‚»µÌ „—Œ»š”Êî':`Á\VZé f…)  ŒúÛôn­èfâvßS·^¿8ØÉ^¥¤°½TóÒF…<DÉ6BiW@ÆŽ¢:Ø£ÇXZ•IÉ HjZxIg‰^¨Ð©ŒtGÜ83Èö 4ég†;üíc~b1Q;n’ÇW‰¤WÖÒƒ Èà¼âŒý±övÕOnù‰ÒÊ-ûþuiL³”Qz‰Y9¯_æäçÍ¿$6ND2¼Õ#Ä;*[Ÿ<¿A•Þ¸`%§î1_R€%9 Q9ÜF³­7­ï¡ÉuV+@°ËØ€lÝLL«nUžZÅä¶@ôÆ2”ÆõÔÿ-"Yv>â9í§^­ŸwS_o 77ßcòSô=ëÛõ2ZJ‡v†ÛnûÚ–RôŦnB+22‚„¢Va²ˆ$i(ëŒËd ¾x‹ºvcPMyò÷b“–È¡WG7NŒ¾t1ÖÕðåüÝXŸÂÙ–VÀ\+ú–Ÿ–Õø´ÂÕiCK¤¹.‡&„×|'öŤðêY® r£/r{~j\óo@½šqÛÕšSæd›â[®£)™> ºšÏ‡~˜:ì™Â “»rFPšTïCæÁ~=hpcꜲˆ†1^[.묳J@bNî2ì“tjvƒ­ Èjºi††,Ÿk‡ô/+·J°ÕqOƒök©¼€ƒê§n/&ú]»œN(f¢FèAïFëT]x»cœ*¨üìÙŒÖ cßXÌÞk¦ÅbN#Ÿ«>³ Ê_jÀzþã`Ñ ·[ÙlÇÕè µ¹y›QÌqVa̧T¬°£[Z³Q—ØÕÎ(u£+’ÞxÂ5†ŠEÓ…O&ÂÄH9Ñ$†3õ²Äã…/@~ŽhÔˆüâ.ä}Ü ý4çUü¸ÓpåÄÆZðâ¨p?Ë¥ÆFØW›¼ÂKÆ!pTåwµjç­Å²¹}°ó;7•wÇà³`˜’9Ÿ{áV ŸùÎpw¦›ürY¡cÁh’qy}Q[ñb+7TÍN)m2¯5xëô’ä©×!ëݧ¾A£»zä´>ŸæzÊûMG¼S"ZÛhu@aI›\k³–._³mÕ%þÉ?•ÕT¸»ÚªdwY¿ùhg¸‚,Ôþ>´´¢#ÐÖûªjr†oýÅΩâÐ;»¯Y°ÉñzgŽørá ï Óò­q¸¢ÚVô²ç¾¡ö*-YgfEÂÉ£ï³:úÄo>’þé¯-øåŸ•¾FÔ5&\Ù°¨¡u=P#Íùs(ÒµYÍ} ¡r´ðÓ "y¤Z|&Hž?HkÓFËM.Ì0GÛ ¢87iÕFTHmT,B¥4Íä¿Ç·Œ•‹Æç‰-™‚›é šo:3ÖÁ²š½ùQzËIlbYû¨†ýHR:¦æ¤›gøùš eÿ?WǤäQ:N[ØA<Íó]s/Y¡¬\èa¨}4›±%ìGBô´‘(QYRÓI¨ÞŸù«Hì$•­Ÿ÷ÿ&,­Á€!I:`/º:¯‚î¶å&óÊ™ÑaÎÉ]2î BrK½\uäEñ÷A˜+þÍB°ûouýu¢‰yÛ• „Eþ¬v‚°@ê8îæF3ökökݪ}G¯zp;V ¬?ZóùL¤gY^+@ KQÝDñ­KˆÍSO@¡\ù¯â•îÄ*ÿsõ:è%1Å+vd8W p‹4‡«“?AQ{Ëçf…ãý”Xb²Ùóºò!Ú¸ªoü)yS6G¯&sıoê£Þªpì®f[N6XŸ1ªWÈÄPtóµ÷wóÒț˦Y& [)#©šR¨ *m^7ñBàâTóX¬ /Ü™:ùCFm!¥i›|cŠ ‹£¿õÜm™„k'B‘³O¬¥ÖÒdkpŸe¬IKg¦<~z€CHà’R¾¬š)êö-7']XUꡞ!ÞX§PJ¾GýJEÒ÷Ϫ¢º©ASÃSø8¿63mŠÙ`“ÌŒŠ'Ê¿-NšIÆ©(AøÆ¹+‹Š,òÚy{£BöãüœW¦Îü¤Ø µ8< „r0íqéã VñB Á¯®n>C†xá°'ì­‚éŸÈXrú{X=Ì—) ¿¸¶mÐêX7&ÉG”às_×8í 0X"j#Ê–™´Tˆn#|T'BõK êÌÞ¢ežg”LŸ·½×~¨ ºzAÒ2¯™q ËŸXì<¾‰.R*"É| «« [ždÞ Òy°Ä.w:¶ð¡WØE>[WôÓ%*qÔÝÁ¢è£ätäÔÛã2ŸBž9]7<æñ;^7³Á(ˆžõB1ÜjJÖMäÐjV.z±Žøs¨ŸðØ•^ °wÅd ­€–è÷ê³ÜéJ7rú¤ˆ‡OkABh.~ªˆô½‡HN8Åy-qï‡ÝSŒá£Ó¨ö(¨áëÑFÍ " ÿ_¾º&_·/H{OJÓÝ„i3Ñ‹ O’\bÙã`±ï¿ 83È\*ÕÊKçsQ§ls3CCk GŸQEqéŸ#ÂÚu uzb1ߪ^jZÈÈ`(õ µb|C‰1sq°ñ!¡5:‰Ù0ý,ƒœœ7•v:(XsÓ|ä#ì´•”‡BäÏ\[)¼T¤>¤1~,fœÙ’ŠÔ3žb:Uç;Õ÷à²qÖ|ª¨Ÿpš”fjHt”ÎC›¯‘-k²¸Öü.úBÒRº²¾Ð<›É ,õˆÁN.…|utªd_3eûÿ&—öÆ<!EÆÆã‹~ÈtiÅU†l„dC.ª=ñ’òÿC w™ø;jZtþ _TØüÒ¸†èšÏê´ ºM¯Êk¯ºáócme1¦dÿx$OJáèYIñ'fÔxé%}èÈdæ¡ìÛby ÓrŽiA*øá¶L*‡2Ó‰dF«·NÐý)Mv35_Ãk‘ö@®®Pç«Í#罡”9Íh~¡0f.«!Š؈ƅ½¯·ã“ÈKåÔžêïéИy!m<{ÓO©}¡å] Æ!·è'!é²4£qÀ1ÁPÒEý˜Ë*™S ¹žò¿m³ò¿P4ê]Ö†ý†$)fßâÕoI“¯ƒèmè·`Pû–´ ßuy<ö_,ÅØ«Ó¢’ÁP\õœ&̪ÂõÍF*Ä@ žÂú£Íø[z"ÃTÍ~ôàÀío*^‡î\Ù•‡Õä_êáñŽ`‘JcYí*ÈaNOƒ3áÚü¯®7T;Á[«€ Ø¢±AC™‹¾p¯‚æÙ+w^su4#½“kFû5܇U–åþÔö¨y³„RôËj»8û.ê0t¾øú*%,wè X€D£“p›ã($oŸSÇB †r¦MS¨«/f3h£‚ò+ØWûݸPºã—Øø2¡ì#ªX]¡ëÝÿ!,Ê &ƒhfšGÿ'¸bµ‚!ÌÔ" “rÖlˆ‚š›N¢Ã#èÞ ÌYL!çì†Ú ]tUcÌŽBN½ÕVžLã+,@xL'{žÙŽß®n¨(d•«Eküáò:¤Ü@—ª–¶žß˜`ô™I¬I=ukmt½ÞÆÀO醨}‡Ë/N³Û‘úõ|÷*…üÉÛ±•Қܹ I‚=CøilË‘ÓñG Ïšú"Ùªz$ç÷Kìå#í¬ã |Ïæ9ùT™á-`â{’YozÐáA—Æ9ONÌ¥#05>1 {4+šgôM·4Îä0ùmñ¤Cn·=Õéì(ÒôÕF ÊÍvE²›3F[}ÛWÂ÷—hóyØ-ö“ÕF§™ÉN Uy-Øf“üàÃ^L«mÖÃÖbÇkyoZ°d¡ð»(×j¼þyÖš*A(\„S^ˆ2¤§OìöÃé ñHO”µ"ÆÌBk¬y«ðœ[1!Mdñ—;ªxw½¦0ZˆôU=j£Â«J•°Tê ÊÿÊY¬ááRÒ•¹lT5ø•±¦µ«I@%<|™”9SG,ÇþÖO~êï˜CZ³kšéÑB”mº—`fhMå…gò8è“sÓ×ÏtÇF"÷5{ˆÞDìÕ_W7;Þ@ÛŽþ†MÊÖÆU"#ÅÖ'H𢗵öZõÛA# òBE–¦x* :Æ ÚɵNdj†þ4o8áFI–ò3Äb—.iÁû&û¿JÞ‚ë“§eh²!¾‚?Ò?5SÚ-S“ëß$Ÿ‹VíO@„™™ê¨ölÆ’ÅØË=4é ½ö!P£9[¥EÎúcÒâórš¸×tH œ %û鉢b’ÖÆIÐI5f:À…*‘Žä©(ì*þOÉh:ÜCð‰;¢¸˜L&¥)ñ—Æ®+<ù]¤z¹¶0Êzû\Qèµþ¤«pKˆž“j«†Efl!EæRË£]EGò9f×ÌëàJùCAÖ4¤8·„GSq»›>Ãiî*Üø[^‚:|¿iyÐuʯÆ^wvš¯4B>šC8ÌùЇàê3uåõcé0Áº@ëè€ cd wLlòm+f „4Z fuÝ0`\ÂcBCºÍ!ñ™ù˜~‹@$«oÚµ%Mé§®p'~™¦wÕ²T€TBÿfˆ“|e¤*Öàªöò˜/¥ÊDÜLæxõ>lQS3{Ñwá6V²%!‹ SyGàp8Q\!°6"7’ j([ç Ï&HÔF9o+!lßÂ5€ÚÝàG#?Ü×\1ýfÏÂÓd‡P—†7,Xš8›®Ž> ­fFQ&këhµ¥Ò¹uŽSé¦Ú­&½ç‹ß(4¬RÈd³…îœ1|ÁÒHuÅÓV’Ý|í:0uJ2%­Iëºbb_싹l¬„¢µsÖíeiÂñã^þÓäâTÆÅÂ&‰U•:XÕÙT°éL[ÐzB–1oðO`jâ Üãx#|¹Â m²¿•ë™v,ÿñú›—ò„0.p}¯\薟Рe€ˆ"¢6šŒa€šþ²síŠgúÿÆíe=U{¿,ÔÿOí7„¸¼ã:z«nI*àëªðñzãR€Û5ÒRütâmñ()9–zu=3~äã'Y'WÔIü¿ûä{ÑÈ+—°œÞ.˜åYÃJ[«¤`>›0}¤ÑãÚë®ö˜ëQe Ü÷ÉN ÿ|¸%ÈÛÒc%õžÛXÎõVôg j­l¯=^CUþâÉ©#M2¦k ’yµ Êﱕ³nÆ ågd ®GØ#ßWÖsHNa»oƒÞ;!â{Ÿ©§ÀžMm)åkI)ÌB}þnÞTP/Öaaÿ”Ü~ÑÅc<Ä7JGª•Í[iŒæÇ°*”N螣°å`2Ï»ª_ v›’< ±s¡(>\Gè,·§Ø¢PÅ•z'~¦®šs91ä8Šá©Q&Œ UÄ™IÀÉ:% Ïç²x®Õúu©”ÔÜòËÏløž€ÙtàtÎðÖ†o8$=Ÿ”ø¼¡#AnÎÁ²xá Aý®ý:\0l ’ƈݼ¨NÅ‘¤Ê,÷M1ݔܸn•Í Ze9Aõ.Ï“œ‰ÖT­•ð:·DÇÀ!iÓr9%“'°MíÀk`Ã0:ˆ¢dˆØê4Y÷]ò§û%±9½¹Ì¿S‹±bì/=íÎÃ1Áuä=ÊÑÓƒçMH'o3ðB#©`ÞR¥k§C”¦-@°ÈT+ÿƒ»i*Äá UÊÖJÇ˹¦~yå›s£xX€Š¼Ú6`,1n3ï’Ìs´âáQÈN÷Ù‰]'% Z‘3k¯c€¥%àO•À°G`>„E«>Ó&ª²˜w}± Æ fG“6»8''W¶žö}J¾§ôyéDîmòðJúµf•ß¶õÛ£Pm)»c~1¨K¹÷—fº¥¶ºŠÞÒ>ÎãÏm,y ®éõÔQïY¶úúÅß„±JíaôŠ'Jš-žûžþÏÙv_yëй]Î`@zñïGõ'À}®4\í‘×èpïì ЗǟÃiÇWy{üw­M©¸ 9ž^ƒÄ캭H!xIM•˜éM–ã tª®Iï' G”:}góEí.oɆ `nÆ çH+f"¸9¥õ7òy§È~„Ÿ+ïê‡r—αcZBì¥K`zUAˆÇ8<•œ|])Y¾ßÄǹ@ DŽ”hV¸EÕg×ÆÂ¶þÙ›‰‡:æð ‰8xJš½ÙïH·EPv[B…rÃíKX´æ0sª#r’Ý!G½4¡lb' · !2 ´"K ¹¯H§—éE â÷ESfùâÝôeÈõBëb!§!#‡Œß¤êÇÍÇÄZJ]üv²¤>-.Hýþ³ñd®ÞФI”DCá/%²Ó‘—_ª†¹ÐÁ.æÊxTÆn­]ÿÜ^Øúk%ªñ¡»ÓÜÖ®øLeå)®¢ïÁt1²Uï5gˆ.Oâ¬^¦Û@¬çAÕÑ,d$¬‚[”¦‡' ÝBo×è„:ŸP*hì¼ê€4œ’GIgñbf›‚Á]cHå®›]Øú9¢ ½ C‡ðÐ0ñšò2Ωrx %yP0µe¿/8Þ­4¿ÞÑÓ J2Çäõ¿)ºêËv,ïŠqbӧ犮9GMÌ ¬Ù¿odj\±@æ„NEbþDª%²sþâQ켌²OúçÈj|ô¨ÞÌo¼ [z:|LB´»Óèå!Ñkjž¨5á®Ë)ä¬+©m×;GÃÿ3ßXå:Yó—UyWºÖØï¾U+i¶Ìãör©È,£9ÑÏ,°Þª€ß¾ ž9Hÿ&¦¦7¶m,ËÞ tVbTŨ2ȈºüH”y<ƒÙ‚Þ\e\y5qsÊçK£ÜÙ:êT™ÅFñRJEör4âòsu«;e#¿€6íc\¬`*´×æ>ä;v¾bÀÙœÇÈsŒ'‹OXI¨D”ã D%“¹€ÞŒ‡¢šÝmíaìFÉÿI=ÁK†¢oOÀkœ!ü_S x+¡‡¾Å?§l=ï*f/“âÈ|ãÝxu>f·0|´ºC/ˆå]>2„W¯oñáÚ=¤øãhN¶:½ï»P"â;©w—xˆ¯åào¬ÔÌîâª-ÉBÎøGÛ¹‹kŸFŠÍC_cº’ñâÿ£óh?‡nLZòïëX¨ˆ-t?vû>&±ø€eøJÒWF¥6Éð‹ÃŽUËÒòVdCÇ7%xׯÚqpfšVÛÎl¯P8 ÷síÉL Æí yϺUôöΕ¿AÙœÕ-£jêžts–à7«a‡/®]Åðl{Øñ w?#Ï‚f¢no[èM_ÎíU7CµŽnÜ“¹ ^–@×ÅÖØÝ ¯3B8Ü-¹&¦h¢³M:ª·Ä¶HÉH–±q ][Û¢I¬ç;/ò¾²Ìí.|²alb¼‘á_iÛ GØßßÓ#˜ô0¯CÃÙðy"{ŠË¿1Kþ¹Ì¥°Húm‚YÌ.W‰âë_<ˆiV¹7ëÍ_éCøZ9C” 4cK¹cú*@&ÎÐP”aVH–p ®-ãënh~Ýù6ªHÜÑ0Ê*WÀâ5î|ºÌUõ0@]¨Ú4¬÷t9ƒÛXŸ¼< —59 ¾I»æ• ­ÊaiÚ»V}3|}!};tè¼5âê-¬cöò‹ ˆÉñƒ‘SƺN¨´è¶Q«Ã‚2 *1?¬ÇQ2=Š/F#˜3å»rÉ,žÌp0¸¤³jÛ°ÇRþ¹Ÿ¥WÂ)huÁ‹ö‹—„V»Yí…p6‰þÓ‡EÔ„RC w¤(FÓd{…Iû­‹³P=¬J¬¾ÉgƒNSx/Ÿ™É™C Ñ„À xzÈ\œí‰¥óG±¨™±ôù35¿Uk›`Ü_8«—<¾…<%ôÁþ?êçR~nò[ð_éþè2°H†^ì·üŽ}Vysr¡ÝFV¸Õ—ñÞÒª'ªñêÃÂîêfyñˆå1‡~äb¡ÇJ£98ÃËŸÓÉÛà]síÙU5Gaì`-yÏÿ‚þmÉG¯N<,éˆe ASÜ’àjz[&„”8^Û,ÕÆIMÚ à ¹l3CÝeÏóX·ÇV•Èn4hƒ¯ñ÷(z0¦Ëa·ä 5ÔZ dä˜ÙH›ÿŒkÅ0îþQ¥W†üë¦Ä\ž Àˆe'·†¸)„´Yó—9jIÎCà™‹îÕ¸ê÷¯&E‘’ÈAÑ_øÉä‹ÎîSI%•ýwÔÔ$t‘Œ~zDiØÅõ³Ÿ_ýDI’ÿ&4予GrôdáÜTâ‰$à™ò{œ`lr/baŸÚýi›êe/,Zg“|{‘0$æ¤Ø[O–Œz¹õj÷Ö‹±]g#±q××ËÇšãKÝEì\=Ø, ‘óÔ0ãùÙßÎÀø·ýûÒ¢]êmòeÒŸ ¯ ³~t¶`º¯®3+.CLÀð)ú\S'BË”<>µŸàDú¯vß™#â ¯ Ûô§³Ï¡^……ë‚ VGVϳ҆™Ty‚É‹›®Ì’ß±h1€ƒÜ¨TŽz_u|° héIÀƒÈÏX¸à‚õ/bÈ¿|wÁáêMà 8D ® ®…¤—½BQ¶if>í0_ñKa¸X`¢Áa•ä2Ê&È‘¥_²ÂÓ˜†}ž¡&ËV¼[+©JEòþQCõ§”£=døýÿè(wé?²ÜGS\}ëaœ€*©…´aù/Ì*?`²Ÿ¹y „cÂãHÃ%ñyçÁG¿Ž-$ŽÊã?"!M³é;Ä'‡{ŽAÇÀÃóŸ;¬AÌN˜PLäÝ®f_½Ã–ÅH®~hå=ð¡¸ËÐYpŠwFi©Ä÷ ïLûrîSü¶ÞßÇ"iH¶þs|?…³ö´ž`ƒ>¤ ºÖÕÅÞ4Nõ…vªÅÐZé†KÖìê<*èøº;&·™(e࿧Ɉ¤xø…=žè#*E8þâ9 WŸ£‹ÇHË’àQ'(TŸb1â-ã3ÞìX3¢ÃVÇ@d }ó»Y¢ vr:yI.Ô¦óî†T-¸n38T™žÓr^Œ÷ÓŽC¢ˆt„v.ßà.ßÐßs;ejµpê@ƒOÔ¶-fz_»`Œ0F˜b‘¨!WÁ:oˆªÇ÷8p ŠÏ©¡ùLt¼]¡Ü{ÖɈ³£Üvâw>³‰‘åï;g2’§ÿ Úôx˜UVØ$Åf`­Nl'péš>®Eo,2AØ Å–åÕ#½÷wDÊ×K9“ûÈzÓÚ' 5Ï 8[Îý aÍÌ?ì‡Ð}ý¨úŒkdMÉ%¼YÀ€8àªô`Ü®!­gÄøèfÙë½ ´±ó5cÔõ`U^4MUЪ4­u:4’ß­cš\¥y›¿÷c¤kFCöå; lìÔ$KÖ=2,¼¯ ëÌͦթ»îãÑ}Vmé=5=†ÿ7ÑŠs§Õ$£ñÂÖÏúˆ+ÌÛŽf(kSü†¸ƒ‘D’@kÈ_ÕÞmªØAeðÅü¤ÚõšU‹»%XLVÝ€,Ó“hþ» m½áêi^?óàß SMe^!£@·ñÇkZ§ ´¼ö’!’NôäÜK=~"woϤÎçžuûT•±YøFF3³Ë°ª`øPMC 1ñ_ô 7­N­1épš‘Œf!sg·¯çYrü!Úóïȹ™è gƒ¶¢‚ѽo_Emõ_cw½?ÛÓ3¼x`Ü[>¢%H› ÏæBXƒX%[KÕ “CËÑJ\†ÓÏû×ZÓêóÆ_J=,kÈ >l05ÿó±”ÿ–³€s`4Hg«œ$šÞ5þ’ƒ•Ov¼bË.HÓ8˜–u:“ A¥ p%]ðIC­­üT…%ÃHÄ ò™0Sãé_Ò“û—i@…e8̆“âƒhÓ»³óÏÅl¡<{Sþ>Òˆw¥“Å+Wmßä—ÀÑžcî¼?Œ½FÜ2Z©}n×¼§ ²ó=}5C³ý}yè\ÇŽ¥ö„ºñntG´ÈNôKw™OÝ?Ik]ò´:C:VÈJgêÇxœ1¸t*Ûö0|áî.Äï¹S†)t3‡§æ fTÿÐFœ©ôYãã ¥ªëE¿%imc³¤Y ‚‘ë?)þPl‘”@/¤ò0™è¿T¢ÁŽÄ‰pwÏÀ¤×•?ŽÝ瞣m`†>!¯¹5’f`x¼˜?s¢™)Ñz#=v'}åïÓÜs @\L±3æòР±g¬ëRÖe‡)SýLqÔƒ3³—ZzU]6» Wj+ Ôq E~›@;Ž'Þ àK€?N6Ù¯ŒZ’]ßv¡I¢¿¸I¬?Dµl0bØC·x¥gy_¶VvÏb¥EÆšÀÓ·ç8t~Ù³ WrUë¦"º·¢¾Ï‘âXìX<Žâ,E:\‚4™B¤.ñf™ß5ÁN¡\„JdQ¢zŠï3…)ËFþ›ÇÕVâPÖ›³®üŸ~àO·Îw-h(òa÷7+‚ q,ÒÞÄy£  œúîªTˆ8± •X[ü:A­¥–E‚üMì°¥›Ýø·ß ;ÎbLÄWíº ¼}¤«¸µ‡• Z@­Gž Je8ùtR]]¶ .ò– Uå%?ÁK åKÓÄ‘ž9ï‰+šGì2þZµ÷SíJDèŸÑùîÖ#€ú™º{ýa/:3K-¥‘3´CŠ2jde÷³aBä*®0y•;–Ö[·/E¿]pϲJö T«‰;ËïdC+ÿyF™6áÅQÉSo”u“x¦@•@Àc­iÆ:ºì¶~ýøUÀ·’–‘Õl€°Nšµ6<ˆo=î•æf&i]â7AjñÃjÐV{¬˜ézvâî¬H£î¿A*(;Þæ1!-©FîÞíÞlHÊûý,ùôYŒ&›rWB™‹­Ãl,³»Ù‘]‹Ë»tæÔ;²Z騷!ªêwAN?ÙóÜcÑбÝQÉî«aÔéàöï¤dE° ¨ø'hP9µ}U6YÛ2ñ‹m O†Ì*Á8Ɉ€/^dTº6¦Ïžv¡—Ôj¡!ï!¶J:²v3ö½•nýyÄÇ\¥©6Φå‚;^XÑ7s? 1 ýÔàwæažt¶!éªïFì·v—Gù‰K­k°?31!¿Cö¬m¿`ý«á˜0Ï©“z®-²~N¦œ|$.'A‡<€B”§(õC­@:‰@ñçïüsüE2) C,›‚ )fçTy‡â‰˜Eûs¿´ ìÕ†wnMÉä¸È7#=ߊ:&7ue/Í+ÕRMEü*ÙUéò°CÇþqÁt1ƒ¬±A' lï<Ç„né$­^t<;q‚ë8%emãÈÍ¿tãéìµ:<¹@klÔÇ ¦|=hü¥Û»6<Œ²(0š¾ÔÅɃ1;(:‰€ž/•3œA6òCdß®·¹µ-H5žjöhz´×§ŒÏ´Nõ£#¢VœÓA{×G¥¦k‡×éî‘ûÙ¢´0šxÒ“òø+ÎS~EŠt™Mu »NI£§†¨§líÐ}ç!]`Žç$|Õ°´­ñâkÈØÁ'+õüJ§jJôÛ;0ÍO±?‘ÈŽ¶î±H'ileáTçXa½ã¡ÓIlÌúÆIå py~È/î¡oñF)ËAÞ&æ¨RÒ3‘7ˆŠ±!åÿ /»)ºL™?+Z0µÁ_žxàš[w€üÅuÙzÜÍñæuBÈ –’šÂG‡÷nx/XR QHʼCÑa¸fÒ›—XF«So>®Mc}:DÑ1‘Þ÷E_ه¥dm+Ëci]a6~¿öû\¢>ËNðh”¿•ÉÐ…œ·}\ï?^?êþ,£Ð±B³aObÔøÏýቌ™°øAÊjEÔWÿÏHb€j³ÕT½gP ‹òÄ]%mÂw­ìF*áÉCÑYo‹x†û*ˤê4o*Bèw0 a»j]ª²ér.ûa÷í›Ae£ÁÍ)0eRô*³è9´Ž(=¨õ¨ùTˆ‘³)Ú2ùÜu Ñ ÞÙF7Y˜,³×ŽfÝ n11U‡AÁÔ>ðÎåÇÞ"|ò¤Ðå²w!€|ÛLK21ÓÚqDõ ¡lz=|—ßV®^H¥vŠxn“ß/FåµG(w7TGæŸc¨g12?òE ZK$P‹ï‚²øW—ÿñ<Зú <0‰.¯˜r{¾Nï·‹zˆ2‡‡~6×bA¢FQÚ3/Q_,{ÿ–´‡_Ñ@Muý ÖißÑ@zQú£²£ò€’ú/?‰cßü­Õœ…s‚˜q¹p£Öí¦éJÛÔÞA^­ý4ûº¢èæ¦ÍÅÇ,‡ve0ný`nFc‹{8ÜÝ÷ÑžûöEQóõ•‘²&ë;ýœx·Ò“ƒNCÒJ¹Òfn>-H ôST† J˜^`¢óö/è ±‘£ûž¦¹ÿ¡À[dõe„Iâc=^ô`DKBO?;¤'Û(‡{Î;N’tº ¬k. kØñ½ 5o¤h´3Чû#¶!áT `„L¡C{ýjLê%ó’œÄåÍ'×E9ZÝ-ØÀm´â‹á¯±úÚ¥ ±Ðèºh¦œ‘eǘXïÈÚ;å 7-Ésda$–#—¿ðÓœ°DÝbé¹Ö;&”óÞðäÄFßèÙ¬÷%'ïÄ<ÊzmFULc†éMj›à|G-JBz‹ÆÌ’e÷3€2;V5eÀ¬–›Œ|ù}(²¹¹‚×è”3¬!Ñ´•-dÅK÷i×Ñ„OUÎ3v”ì»)ðüÝö~êšÑ.Í d“TìûZÁfÂÏ«z½-Íž¾èa=ÿÜ6™“Œñ %4r«ÂÿÚ(ˆçì~cQ·u[Á¨šj>Ð ðɇ\ÈWÖdpÀ(¿Z0ŠLíÉ;ŸßÙp´'9kgwá 2xŽuþ»œº~úÎDÁ¯Ã7–Ü Ú‘EÛ¨ŽÆN: Yˆº‚ñvÄ}*»g„¶¼Äb6`ó± y"³ÂN%BåuzjoÍÁXè\‚"GÌ5¯ml¼\çË#¸ÎïœÍWr˜Ä=0”¶üËù—ïC ?¼ž’qÒsÈxtæéã1ÌhœÅ,úz>­¶P¼Ìkf `Ÿ¦XØVÖ·F½ §.0£å3 °@·f*ÆÕê’­çú"œé×`^k ¼ù¼r%WÒ´I3=<ýÆÀìõõŒˆ3þU@¢ÿÓüÌ´€?C ÏIÙ—Ò]E7ÞøOã‘4ÔŸ,ýëTæoí¥ ý·Z90ò¹tV¢G»j|§X­ƒ(<·.)Û›ØêðþÁ2TÐÿÈŒŸm->y úývhê ›÷2àŒíóñwÜh4Æ’IÚ;xë »'}” «RhDPU—˜îß+µc!<#Pìa2|MÙHÀb;í㢿õó15*W¯ÿ^á1Ãý”ï´—“]|ëí; ª¢Ž4š±¡Ì2§ÖûD7"Œ Âô‚ý/Ã9DÈûD»ö­O2ÿE]o«q;„nàY€®ÙP/‚@ÊÜÀÆ|aB‹ˆà-'Û˜Äu]J>úŸÝù¶ï¯b6NOÇÆuæ"Û™9˜´­èB rOX¥H( QédïBrºÊØ…„_Îÿ$ÛLHO^lÅŸöaJ9s2qnãûn¾WÍsmSœãºu9ô)d„tà¢î²6Mƒ/d—È;I ÖM L¹H§ƒœ†å=˜æpÐÀ©Òµ“¬eƒ/†ÅV×ÛˆãÈ,P%Êî#¸ØÏ¨ÐZ^Š=u’ˆGæQWô¹L46ÕȬNü§rÈÅ„,gïÈÍýŠâÙ;z³"¿Ö©uz…:K1ï!Â(¼JÙ`­Á ‚HPmê6Ã7ž&ÒCðB€¡ò4.‘IaƒïsŠJá Î[[î¹ä;c·+mÆ7ù€¶'»†ËÕ¯¶‚'GŠ´H€ïmfp |SUHBg”Œmš>iŠ¥ª}EÛêÝS©pRjøúP?æ"“»CÉ¢¡TĦ#öÇù¿¥å@’¿ä*N0b6£i÷"ŽGŒsä.9p¸TF ( Ù OÅbõ ú ‰¨‘9cÆïgÛ³ç½1I Øú)ȉFÕdiC(”mrw\â÷[”R ¹§mb­Él¿¸†6Ýxüœµ·ÎUBlò¥Õ94¯‰¿½€Jè”U9>ÛE:pÙï“D©MKÌTuÉ,äå^ÆkAw@ÿ«Š3CãhÀý¿CX‘# ¦ bþÔPf}±?˜|Rëy98áX:‰š±ìPg‚•°U:#¾±§ .É®ÚE+3ÕYô²Ð=º[¾¦3yçXÖ­K}ßÜÑÕ€ýA)Êr8'0ª¹ö»ä _ÎPrw<•÷á.ß]A0Œ4bü:+dâ`ÌÃ3Õ—…’$<áƒ_}teŪˆ¹< ‘ ÿ’e¾¨Ð.³¨‹ÅœßÓ‘m$€+B#ÛøowÑùó~ö¢Ž3«Ð“aÝcÛ{©-;Ûó`ßFÈ9nLxó¢v§®mœˆfJPQ1E ÏÓºhÏšbÅ;NÏñm°õ©ÍL%dØÁÀ æR7ÏŒ§1±–¥¯0Γ†ÊÅ®€šÍòŽ0öçäÞê·à¢xµ-0!K ö5D¤Í]n~6Ša–^uÝýlfnZÆP#ʲu¾‹<];Ü_Aødþ'—R'×\*Fh–˜êíca׿¤à-®Âqµ~€» ·›rÀùj ‘`†Ž±AÇ ÂBòÝ`*.flµ—ÞrØÄ\±Ñ œ!97ò-Ì”i„ °ž(ÇHW¹À]mjð½¬ÿGHŽè›™ \U€y_[ð‘kT9íh…¼Ë)¹í‚¸]ƒí鑆†½Ð!nl6Ûí@çÜôÕ²ÓLˆQaöz•ì јt¼}pnî/ÊwýßõÇ…GÝ+˜]a bô¼¼?k%øòÁ‰öizë™(ìȵQ‚ÿ 2ë“Búï,|š²½ç@[´‹¤Æî&4Rל¥ ©B‰¤sq°1@º9OÄú_|Ç5ùS#hSñšÅåD/•.?-‘JK›µ4wr§ÊFv±Šˆ³¨eF€þbvÈZi•ÄÛW ÞÔs¶Z÷&ùcuO™JÜœ¨ r8F ü±L$¯s¦‰&ZîÞ wîl(´i 4(Õ.ëÎG-öª£˜Èˆ4gjQyŠš æô4Ë'Z-²³Ò°Ã*¹Ãî„N,6”ö 4‚l\šæý¯µ'^ÌM UÏk! ¥QF‹•ÝÍ•T#*÷î€A¨„¬ `¢šrN¿]u£ä¾¼é W߈;ýÁgºÎ ÷:Ϩï×ê-O!ä<.H¦F3‰³g’òÙh[=³,?†$n^:³4¾Å ž t â„:FÔ`Ú ˜­ÓŸú# ýçÐeRUb„_A‚®Â‡Ô£îE<ë\†¾‡ne-v¬áãòŒßnµX˜­¯Æ¯h{¶ïþ+æE€ŽÊëͬÞBd-½’Êœî؆~)ÏÜ4Fè Ö|®z”n´Ã.¦g¶œ úÍõú?¼ž UÂñÄI!t©$q´Óê ŒááqÅ Ø ³¶kè«Ûª\~ýÚÈ®ðžVØÍÕˆp~C“ØKB)œqÌFúšífB\ëµ½å4 QêÏ 5rNdŽ×tÃ&•U6›‚9ŠKn³¿™þ÷„_©Ó_ô&È`ãj;g"yÛV¬.zÙ]‰Ñ€•;¨Æ„-·Ú]_Ǧå½ç=Õ7zYšõt€Å9aõ‹È„¤æ-û¿Ü ŽV]‹¨¾Æˆw’Ç+™äÊõD UsÚ"õó"p¶$Õª^[m,+—^w¨]0“9ˆßz€¤Ë\fþ.܉#DzÐgx|®W¥ÎÁÞœIÙxh.é_êøìlp­ô.‹ÎÛ‡sµ¢…*$ok:æý¢•G¾}Yý>º¸íBéªc•×J×låA> ä3û¯ŸuÛ÷\h;ÉþDZJåP†åõ?/¼T4¾14ÿ±ÂKÉ“s¥²â¿Éâ;z¸¬ Åž Æ8GïüEmµÝsQÞ„9â”Þä‡ÿ’Ûò+*Ü­ƒxŠVû¡Y£OvÉg8ò<5V5œŠE~\/ç8XRÙÁcmÃZ+Œ‰»ˆ tçéÙÞ*¾šQD»€º>ì&¤u#Š\ªú3ú6jZt=§-lÛ‘Ã.ͺô0½ŸÖÌo%Éàòá(.ß4×­3¿ƒin_Ø~ZôÑ‚¬Ú¡ÐK‡ü,{ú/qØü|Ík-½ÊËX=€è{÷‘–*ƒÅF×Åqç|a=Œ¾ˆ–>ZŽ}¨ËàÝ ‹œú:€´•/pr¢¾äÎ6§X¥ôb°BÌ" 8^]Ò°Íó™«0®v×òjöH†áÛ¢³|””TšÍ÷6çP'¤Èv.Í-šn¢îÊÁÁÜxÏ[4ÇH UUV0Bžb î\gL5-ñ] /›s Xf£Ü‚üh®U {s2ñÄ †úÈëz *ëü Yà¤ý^\™F÷é:.“¢Æx·o‡\ׯÜ<*ºy wC8ˆ¯ŒQÞÊߟ4ïîÓ~žˆzbýÅ+K©÷6”)ÐPû&ûž#ã#:_Ä®×°šzŠf¼Ç‘´ËD뙪ú†»6þ³ZøˆøÌ‚ê…Ô>&å~‡@ªié&>¬sõ‘3{EÆbû]É v‘eâ¶p^q]€e¤´é#ï”lnkœrH÷çA¾BŸéV§êÂÿ¡A £GÊ¢Nè‡å3xzOd;bÒ©_Õ-—`YŒšækŸMÂúÙM¡zýÙ‚@ct„ÞŒÂP”‚P’…µì³-ôvp‰õ󿄬qC¨ÚYÉE9ðÍõDÂÝ…Ýn'øÓ"ôÊ|Z"¼âãÐðDµ ù<«Ûíz²}ìbƒYª˜‚ïìÆ¹Pè¾²*ó!N¨ÂÓŽ…ÿ™àÔ%_”Q–lm®ýzåÐìZåÐ×ó|.Ø ‚¥(™ÙGŒš9,h~óSâ÷ÍûC±ö庰‚´Í­ÄÏŒªh8ÈD¬üãa_ÁX’±èujÆÇiêfovÜQl¡#繯ùÜk£ÅS¨ϰÏʰ¹É«wÏ¿=Jˆ xÅîr팑 ö Sñ5庀UÍù]ãDyIzËÇÓÃéè\io­Ë®O›ADZ€]c°`Y¥hòÇ“Ä" @¬FÔý›Ч[\û§~Ú, úÀD[‹#…zths£p{âZ×:¬ù*¹qðéÈdÑ0„niäºØ' ù3¦é­r²=Îfª›5èbÔK^WHO–]HûLl¢ŽÍ+ “ÃA”Ë¢$]}ÎAÅCœp¡¤p”ºœèÖV›.sò7„ª‘ñÁ1øŠ°‡œ¹f1-úMaÐAÎIÞAqL“ e\ЀiâÙÝ„c®E?dªÚƒ- >üˆò—Y[ÔÎÒºož['}~5ñ.ç‹uÅÛ>)›¥¡[áíðŪ·Ù’B`]¸ àįjô$ß´RVÆW‡JßÀ~Œÿ{·Y™Mþ<8!id ±G•9¿ó” Ƕ†æºÇ>‚B"^Pb¨)çw©0RxL¯Ìn£AGîrû[|íj‹ÒìlŸ7/Å¿Ÿ]]ÖÿnNU¶5Õô%2àh|ƒvB $Çd®fY‡œ¤pâw‚ÂRfi¾Qų+Í+l³GÒʬc·ì¨&øÖð‚'¹-?£\´ ôûCŒ= @<}DB\fò¤feÄ5sáAÞ—?€ô8Z¤f'`‚g\üô ”…=Ôµúœ7 ‹Ò´èGcäo/ûä2T80ÛDåe˜œÑ‹j 6!ï;LÕ‘G â­£8ä+µ‰ŒÎ—39ÒÐT‘ÕÂF)ÚËj¸Á̦«¨°œÎ0Û¤`…š.‡ò`§xáÀ;f>Wù€ê ¹ÿÍçêÀü:~Šh:QûX'–|eÐÞŒ?«æ^w:”`¢]/¬Õ-òYç±y*8P±#M˜ ·¦ûɶ)q6G(RgÉ9æ‚/¦3ÿÕ®ÎH8Å4OàZ‰EÐYŸ ƒòÓ)ü±·¼ùH³#$<‹*¶KúíÛ¦ÖÑáWlQw©ž“êä„~G±!æxãnµ³….\ ö!T6ØŽ,‹mñq_ ^{‰øŸûtU\OQ:`¼ßõ’)›kP‚nމEâ_n ’ô>H;32±ÅwÉ=QF-ÔBšáØñ7j¦ÜL¥äÐ>%šå<ÁºÇ š¼T0p/w„ÚÝB’’8ü½t¯d°ökHWO¹˜j’1Þ‘ŒÕ½ rܰ5¬eã¬*&$ƒÀõ ÁLJÎÇåÈSæ[ ¦À–¶Ø¯j5S[‘±Ådœ(VŸ×Š8¨ÿ¤Y èÀ܇*±.rßK[zîdÀüo*ÚÇŽ¨â¯‘ žÚe}…h’š˜ÆibþbŽwf‰E‚ß\¾/9ã!Ä–Þ?5 §{@nªíiXCRmU‘´þ–(qjŠ&³‰:eOÚwAñšnœ©ìN²¼³®hi ªE±hÀJ-¸…`°±0JÖörá×}•#øLúÝ¿»ŒFE+÷åÞžåÑ£˜¾ÿÇš18¬¦úZ3žÝ(¿‹†v‰˜­ÿsôtÉ]~)”ó…™Eô,YÍÔpfåžÜ€óqü²~ºßÓ V¦”(BAÙÕÔîÆÀ(y [¡â­Ü†HöëGØ¥Äòð~ÜgÎ&­nsÙ&+ªëo |£þ[ʤöõUŒÃO‰²,M$×ð;¿ýn§p2>ÚxÔÕ¡¬%ÚB+5rÜÈò¨€T" —\ó_ë¨t@y[ è.HSè ¦ÐjmÈÕÍÉÀIhŠbB‡gÁ|Ɔ–·ª/©Qß\Ô}f\륋|1Ž{ˆ$,míI-QN†(vÝxš&”Ôƒ¢Î@®d™jÒØ`Û=ÿò›_J) ¦ª‹@²ÕŸÍpQ‚Õ⛜àÖÇûß­Í‚)®â-K>êÊziWBS>[qúÍ|í‹- ·õØAìÂl =Nܦ[;9-¨("ÝŸYû¹Ô±ê…Ó0Xݵyºe‹Å!(ªg»f² ñ¶ <ÐE›Œq¬nué¹ãÈç™Û¦¡Z¾—ŠËδRúãW™\‰W]ó‹¯UkÓ[_…Y$ƒ@Wc8ñ$ µ¾a­$ÁÍ>¸”É h¹yR,ÃÓBÅ…aŸßßý=ì>v4ãòs‘ÕXOŠç¢¯ÞfÂØ± ¢öÈŸ» ²Å£è\p~!i‡á^rÞ7VE|„° C”Ìi[žÅO LS(CÀì O¸ÖÌ…·ÃPÝì‹òƒ>((¦Ä©0Ù†®+é„ùjxËõ–DHxòæ7lA]¼ƬlP Ùûk$SŸ´†»å½&Z/¿öŸ/ôÔ1Q³ ësä¨âyɃG‘U0*ÙçFýÿÂvÛ,)CŠ%’¢}?šYL†=ˆ_þ3$`û^Èk°î…ìÙ•1hÖÏp°€LK°âU4…Þ•®Ô‘“ûŠ´{ÝØ®°¤€Á‹öo‚óö>H6)ÑUg'~€dƲ°æ]UìË}¢¬Õ 欧æÑš-=/¿8‘öé;Qbpöñ'á2ÄðBú¤‹q-@a™•ƹ6¡§ŒXì"k« û´ùЉË@ëAÈÆ¹°pô$·wÑ¿sÔó!Eë ¶ÂôΓ90jᙾãSÎ×uT¾ûâ <Ãïåb©ÊéÖÅgá±r¯ÐCZ×Õ£[Èíšá‡û¡ðõŠd瓉ib«·QQêñþ’·Ï?^ôýRµ ¼ëªE7T®Ž"h(ƒ írâ]oñõäê›»9£""HÚ•Žï‹Q¡8øó†,¢M÷y@´žx~&fe—aÆN˜âÜŒŽQ~vÑ%Z Ýéb©pïA"I3jP†™î‰™N¼ú'§Â^zùÚÙBc¬'J¯jÀvºè.~yH²¶C÷X—ºŸ¥øÎ”f´tI>_Ÿ®eZÒB&–í¤ºŒà9ÓÇŠÉÏ$–—ËÿQ5ÛàìvTÞ`­þ’ì‰ÍÚ¯œå7tuQ7õî•Ð34‡ÖÎYµghJ4·v ‰¢[I3#¼Mš4ô]`¬/dFþ®U|¹êæAv¢>6K5£Ï8¬å8” .‘UZSKöjyiˆqƤœÑMž‰Ï»ª2gj®¦#ó›µ”ÑR´"n/ä¹yh‚•áTD%æÆ"-¡Ü»3'–¸9Jd…5ÃÙĬ!ÙJ¿¡1^˨œa=çNÿôv”QᢛÚâ Y$ÁßÉVFimˆDÛ×–_~sú6£ <Ÿ>aMÆ„ò5‚ïJᨚv¹b§¹1òÛ ^µØK‰*bI/VÍ/'W¹Z;J€8ä8d-P±úa4î\l;E ³Ï_Ê\3ΠE‹Öv‹ú•d^åœòn~”f&r6¡3ÕÚÙæ—f!RL¨ÝNpv½€îldÇ9çóws„¸“ˆq}Ü­ÉWs×0QùÕn|"ûFd,Íð}D›S%Q)lw#AΠ¾ÉPE¿ô{ß©/Ô Bô'±?óܱBî ý„&±ãÚ×>¤â°t¿Œ0¨»™h»yw‡._\r†òƉu|6¥<îLºû‹€2}íÎëžÌ -Â@g&y8¾ó.`p¥/k²Y ,ƒöTa²0rc_YTÕð-Ó¾^ýÝÞöÀ® ™çNví»‹Çõ]ŽýfÓÔ¬½Ðž¼¦ý9ÇfdX¨¸îm¾öog5ôýçH%D8EÌmü ’µ·jpîïl!–;æ¨:Áñ\!ùµ·ŒÔe.84+°ÊfVÃó‘v@£¥M\<ò±ÁHj„%z9Aõ[êëÌÙð¼o:â³AÏ#ÅFÆPÉìP ã@*ä{îÁûê( ³\¥©ü%™­mLAÓøÈܯ;­|xY†–Å)A¢®c}tž•Î5N$zshÓƒçWˆ¹oÛ_o®š«¨#†‘tª9þÔ^$ŒÖúnU޼ÒÚ­F«-ܽ€ß‡ƒ$cÈ¡EÑãÃè+iå÷—iëǪo¾ËOæ5²a p[ËÚ‚}騀}Ÿý-‚ž,_ýt¨±-9j}ïl$oça„µ;¬ÜSw±KµÆ£èuäÛè'`9œ¤7œu±¬j·Ó~´]÷p‡Þt"†›“¿–wr+.=ï3ûqpŸ3Ϻ#Á’€ ¶ÐˆëTÎg7O†scžýŒê+\éìàýiFú &—hçÑkþ¼ wÕƒÕvž÷gêÙþ½UÆÜï¡Y‡:‚Õ¹´ã%s3åc©h•g”[rŒQóø$bÙ;%¸xC¢á^HñÐ’r´äâ*£ ç@èàçLT,ÿE‘. ¬EǤ®ÈhûzCYIkó.Ôªö¦*úŸõñp¯1&ãz°øiùôàj¾Ñ¾IQg'ü;‰G]«OolmC¢Uc̳yM1…”¡4h-bÃ×ÒfŸ´ û¬Ôè°‘¼Æ’¼Gcî¦B”1ÎÝ.á I ò²<ùoɽOZ­$2@Â-M~ôJÔÊÐqü nþLÓеÜg~ñù‡3­od,¸-xsDM~ÉË‘¬5—tŠÜÄN‚]°¢d¹ ÐqÉko_­ûÇ’g´Ê·TÖuÃ<š††r|´.áêÑò†¥Ðçî& ¬ño†ìY<ïé @ž¬lP=×zÔŒíÝ£wUO Ì Ý. "Sxàü+$ªÙ†õ£vW.E ܧáš×¤[4^yÀ¶Þ66³m´GdgVª¬L@±XhƒZhyB~ú’¦ˆX€© ÿõñýÂØ€ÐÙ zí0Z(s9³šübµxïbÿ¬!oöœÕC ¸¸2‘YM„ñ’Q·IÞMüãm›•Ò­ö*çîàÕ-HP¦±?K¸Öë7 }¸‡~jUýÕ?p:hrÖbp §­øÆ×Á°ËhC¤@­UTJßõh¥! +d ËÉ7(ÇT¼Š6ç°k év‡¿Cþª|I ÷&V—ª¶RXùµIyŠì¢Å +j‚˜æÔ§÷Qk“yb¯ð-ʼn#uÅ)Ôó‚á³\>Êl%“Û‘?a0)sPå‹2­´9…D7û nãn“,.¿ƒÝp+‘BäéÄ>Ëöh®Ò‹¿Ý &³¯ÅòqÝäô}Æwį­’Áð§0øI_ÊË¿r¥gq`Œ¹—‡ŽUAiy¾ÇðpÅ+€ÇyZÏöµ LöQÝHï¢ÌjëN><œ‰ëÐà)×|OÒ‚ÂŽßDAf(‹è.ÏÞõ°ºgª@d5ýÚÏë(×¥¥~nL™Äãê–zT$ê¹o/ °¹ƒ«ËwÇȯ2&&iBO̹’S‘E›}Õ.bV¼fÛ‡b!ºrA—c¨»È^¾X IÆÒg—óœvÃå»AXPPŸÅû…㞈ê¢ËÍØx¸S³û͇}£d{AÓŽj@·T;l€Ø¼ –‹»W/ ]åX{µˆæ5n%„©„œ•­†¿VW ñùfðû(x&ò:m6³Ên³uhÒ+%„ž4ŠÌ²^Më› s«Q‹í€Áð/”!7JaJÿA~lPA\#5Ê}‡š]Ó¤À ¿ µ|¯9½«ÔÛÙ-.ØÓêPãx=òû Æ]lq—b±€YîÜ&ipÀ;/ÓŽV}^·­EAð»0˜áÊöÍËoA =s„”-5a0Ta&£>r@ém;DB#6B.„‘Xczî €Ž‹1)÷RÄ'­ü åjÔï<^ÙâáŽIÕ×Å)µ¹G– EÏÀí¶üýQ²â{  ‰!D[Ë>{³þR/°âVxÑŸýÀx!bT n·]|kª5üªK¢`eí³ÚNòmË:Q‚F#ÉÖÆc[÷°^ìe2Ÿ)ÉOJµù BÏ2Wgäø_Æ›™Ú¬ëC>ZÂ‚Æ 9ˆ6ËQ§¯ñ±ÍÓÖùŽFT÷†èp‚LƆìsÇâIÛ¡m•“xÁq´ç|q8¤úâ‰ðôß­Ì,ßeá÷!T¥Ýl/w‹}w³žëKætfGálk^S?>²¡ágF<˜ß4c8Ø«ô鬃FA ˜j'«ê/È›<€3»ÏÆú†ÏÃa2â€ü£=ŒVLønHÿt–“3›&`”†Ú]ù˜Rüç¬HßîÐ|¨}hþ+âëK°!%’! ¥¼ô‡vÞMI%l™k‹º¾%üJææ¶‰óŸõ›t´²Žq Í&žc2®êúüݬÒ*'ð ó¦Ë‹ôœK$‡ÇaóóYü„-¨=öÓ¤ÿ™i¨!]¨•CŠ™ åô6p³V„7×€™ÚÉçe)°´Z ?bÒÉ”#Ø2ðûhÇuõÕ{FJZ=%®saiê®Õº£R-†^ŽÀæãf†>Í+AƒIÏÐaʦïyãS3¶<İõ<3¯¸ºw_!$;j帿„ޏ›1‚ìѤÉz]šò¼ÅAÞ! /Î,eør}à;ôߊ’Rut<Ù:÷È7J¸{«Ö©„îe S9ùÂÞOKájÅ–~^j57`ˆS'=²E§CÏ3žш=.Þ`˵ÕÛô”è1õiæß|[ŒÄL:¥ÀèäsH×5‹•1ƒ£ü¤´ÐtðŒ-à1SºfðÀN´¹Üó׎¨Â2º±Wð½n`¾>„Å.Š–bÙ:/ž3ŠÛ>ùoÈ!f>+YÐË!yW#ªô©?÷Qó">uËè¡+²Éˆ×ŽÞC’Áy<[ÄÿrÉÛdÝ®©ˆ`’®3(¶i€é~#ÕD’”æAm ¦»[cšþ É#MD®<[::o2’þfáÔ‡³ì;X$ˆ~E3‘êÂÿÁjà wÅ5…b”»wÅ)Ñy‚®&3)»â·x)ÕfÀ»îøÞ”g€Ç AûÓ„~ÌŒµM,Q ޳{Ícò®©Ó‚†Ûă ób:’#"ô³ôÂÅ_ñsÈf¬¥¾¹ 8Ÿ46,|ÏZŒ4,â6f’žÍ̘‹wÖÞr2ûD mÁ#MWÇÎc-•ì4›óãH³4RçÁÂÊ£ï ã:¼¥¤…ºÄ…‚,º¶¯±”hú>Gß]B‚Ÿ aÒvqv +Ò2>Az­Ð¢eÒ;é¨j!Ú4¼æyU>xDOæ{ñ¾8lµ»Mÿ±£‡Â¦ yûV>Êsîeuï²Çøz¹;<õÎød&ïµOS¦xšùòAûEUþxfCÿv{…LûÅWè^ÅÑ<€ÿþ 0ék÷Vrº¾ƒK6ynÿEáªmO¶3¤"ñµuø¥tE9ðï¬ÐÊvOÐý¦¥ˆê‡Z{Îñ)S­÷Æ÷°®é)ˆ€£Ëº|OŽ‘PÆ÷J§Äï´Q/þ0Q"·–äÈÖÖ ÿ½hZ+]r<÷öp›J …8ÈTOw×S>an(ÏäÉÇø¾·n‡1ŸH( %sáL£ä©áºsš¢W)Wâãf¸U6TÁ>Õ­øXþÔu;] ÍÞÆ'\Œ  jzÓô[—Áùѧ.3›ÔåÇch^²¶9Nóøre^¨Ó@¡ #>j(°@­0Æ Mk8ÜÍ<ûkïì^?8”•Κúú&2Å–=$Š ˜‚Ö\PÃG#åX@ñÙ –„:óÃíö üp%&ý$cØ`¶«6ˆš>ÜìÅuîpKB‰ºwš]bjõÉüsüxÂÎ#¥g=ˆ»L¯ä ‘îˆeÁaYVÏqÀô(z ?ȘÍIµÜõp@ì‘éj² iâÜL;=‰3óBpA¡@6a5ÿ mÙKÒ+m¬–@+Qéïh¹Î=R~Úó7©yí ãˆðô8ÈÌbñÃ-4û°ÝÊ^ó§sìǯJ(Í€™)!¦8v´¦"ä)D}E‡WÊÙÄ-’F~ôý3[ˆÖž…Ãÿ³—«Ž 8½£ù6&b¿(!˜bxæÃïÔLß*mù•ÞÄ÷@@±Õ:Múß½ ®€ùMcÔj£";[¼™=¯Í),ÝBÐ_¿‰@ÖŠ(«¯ÔOÂ7ùþhK5fÙ(Xß tœHµÎoþ€fSª»‰¯Ê2ßœ {J“Dw“õpl\m©\vE}Àˆ ‹’òm™æ4“­ Õá_.‹î3”‘”©÷ìÄ⣲H5Y«¶’ e°gF©Yi¢­¶U€Íü¯UXK/µ-kQ¤üd™¿Ýæ1$‡1ÇŽboZO/ÑEä ÍKÑlô nI™‘9S˜ËÀC˜±·]¶‹ÓïÁãˇºÖƒUF¥s ™ê.}õ\r'W5à|œ]ÝL<76“ ‰ Ìãa|Ïë¾½1œ›/|q}q¯ß,Õ$xþ´"› C7^Ð].¥eé´nVènHiukZõº5gsöüPÄù/V GE=Ä¢SÜI‰G˜*œ6¤jÖ”ÿ9ùÖ ,›ä¦ÇsóNBÜZŽ¥ãáL)‘²˜àŒ>Z ­x˜Qï²Ê›c®ñš xËŸ‹†gëÝã¹¥ÆÝ”‘õéiHÅ2Éä³gõþôÿ9M ùÁ~sù»À 5»r¬"‚Ákm³ûŠÈÃ^Æ—c‡xÅûBlßÔÿm²h³¿3"©>*ƒ ´¦*°5#HÝ'•ÜZO±£n»Ú»ÛCð«Ó0¼…4¿Ž‚´W±aÛ½ %ÝðŒäòýòy0à}š½}šÆRõ{¼p}ò#j·Z£ž•uÈ(v°U¾s”ïèá:ùÏW1l[Ó$ê’#AÙ¥·“ý€ ý*‡>Xþ´Ë¡#kàsG†ìiÜSµO; a|ù‰Ô:§L Äv õ¿—yFvIˆÑ+Go@î_¡,ñ&a¦½fÎ8BÌF.·CQŽÈ¼þE1yÔ`â‘ó¯Ö5+’¥W.Â<ÆÝy̡ͶŽQ¶ ro´’Ùzª²°-?¡ÏàÞǺÝ÷9„…Pys{SØqð*€C« tߨew¶Þ`²—T†!öb8ç8³éö¢ƒï < Ç<ŽÃ7ÈÜ}{dNM㾇D¡ ãðgAžó<=¨¨BÆjLõW.½$Y^ɇZž©ª5ŠÚEÜÂ_ðCš“¹ÎÖs¶nï‚X#J€æIM`Ò0¯ÓH†“¨Ê±Ô°c”{J‡¼‡Þî>αàþCr¥„Êb7eðËa ¿vÉvédœÒ<íû”t…pØz1zÑ¥«S îš ž€Y¥G §º: x±n¤v,Â}Ⱦ–@ï[•vÅБ¯¼íнB"®C\¤Üª Eö”`»ÞzÓòEÊ\(édˆj »‘6~€tüwk”«T~^Ô·H;H ³–°zý¶Â²¯ ›/äãèkwZÓ3°ß¢³ºî"Ö¿ÈÒRÑ—xÄO½ ÿÂÒ_Ú¥:·ðÓ }¯i/E90L4èáUM@ÚL*KÀ؇,ß›®RÅ›\c“Éb¯$ÔÞ4Ì=“zLe«‘Dž“ÔÆ ntoAP݉B»3Rs'K7Jü“ä-…[Ť ÞÀ—ÿ¸èI2ª¨3Pk»«hb ÉL¸/pq¹Ò‰ÖH% ùš~ný/Ñ,7ûX%â­;Øf ¡ÆZ[#^v°hW\Äš”‰†69*{W²­î?,…‘m^üK•r48Vâ®°†(ò¹•Á ï×_óp·&¨ Ëæñ¡‹¿×Å}ª£Ý{œ íÓ)[‰Â}áú»-mU+×fˆ2<ò¡ÇZ¸’”ÕL˜këÚÝ¿oRSƬê>BôÞ†ÚR‰Œè ØšNÔ¾éaÉ€ÀeçúgÑep”ùöëM1:¤V˜Jõ^ºÆf$i[;'èÏ«¼<…áj–@ p”HòМøìwU¾KSq6Ò¤Ãø E9ƒêLó ˜‡Göó1-v*[æbÒÆ(yaãÿ Òó(ŽësöÀ5‹!}RÔ‡ØõozÕ8ŠæÉKˆ(¸ýúË+P@2…J`‘N¼ÂC¶ŽBÄ’ê•ÕÅšûY¾ îËøÎ­Ý°À½½ã3’ua(錒þ`À"†h‡¬V+ƒNJ†ŸgûW¾º;ÙûzÙyÜ"³ðêüÏIŽÎ|¼2úé9þvêSæ ú<~¨‚CpÇ‹rLvgJyà 9¼ñ@2ýæäé< þ o†?”cƸ–’v\4‰+Y./Š@!£;dç\‚‰\×~þÖ1C¯øÌþEQ®O¸g·,!̶JÐ P÷A#­1%ªó;9/ï4ð$ä"½ê1Íè ö‰¹GÊ. ëc9ZvÀùœ¬UÑã|š0Ë%}E&mÜpïå”èôI ;`øHw‘È~•]Üè4U ’Û•ê<"ã¡ñªvòZRØ59ÅgÕ¤ ÉŒiñ_öÿD_‚Å«K#  ¹km%¶ãýÁÞ(ÂËY=G>½2à|î"PŠvf¯áûGãʶ]ïžð:`gB—ÿk÷á=lÿÕ³GAþåßn|-‚îà0ó«Mðº}za9ÐN`¹ßÿ)ú¤) —þVŽÄ·ýW=©Þ=ŠìõÍ»»9 qžVïëId¼òF±£ýqíi³:ÛrÌw^oäâ–ªŽÏ~@Ô›öƒÏÇ£àKI"¬çw´OÍVa]ƒ”³h,A1芄£ &†Z•´8þµ­A•i@¿fÝpã)Íd,a¸N {Dï}øÛ–ŠÐS‚r0îä=-mÀ< à×p•vAÚòóÓJÓe¤í]gDŒã 2£·p/ÔÍŒé.q„lÜ1&|4‡µþÜö |=_¯y$.±6NHWïat“ýNk ,ܾ)6šEÏoÅíB,Ñù¿Ò0Œ¸úèîBAmmQÛ?%€R6U!Œ„ú´ÎQ…u¢PþÍèvx Ê`܈ð™ÍHÍâ2hö5ò»ä¯X¾å+|aŒY]NV-tÏ&3Šv.@°Þ]¿•n`SẳÀÕ|É,ìm¼Ù Ü>4ú¼:©Å8JäTÇ$n1ŒÜý ú– èkc\[ ÿþð·`G}ø%šB¡ÌÝÞÈ(‡ªUšµN%þ˳*»u"Yvüà ;n =B7çiö;Út<">§øÈæX±úõpMÇ“r&R‹Åuø¤"·(ß° *„/€Mñ3žŠ^ ~±í)`ïpÕÂ8ÇûHmÇ /Ãmç¦.û.ÍfZR'àÊ õ–îq¾"GÅ‚g!IÑtóõÒrb¸2in¸êÈ¡!š#¯YÕI7.DË'ªÄÐüñ¸T"óÈ׫n¿AB,AHÂÛ0Ç2!ÓÍ6bïÝ]y¹öðX_;Ò¥»ÒS’ãÁéR"†<¦ûuðyuBðÙÛ#a9l‹žíE# —©)a¦ ‡ê ¨ïm¤–3¼ Sc#{8f‚ùºÕ„yÈBIËóomÇX]á pY `ñÒ¶--A—ÿÕP+ §‰q¡˜ó¡†’d8wÿ¤5@ˆÎ-ò' !ÖWsŽáJ¡úŽ þ`¬ø®P­[Žæ'=&n<)¥#Ä<ÆÄÓÞÛ ®Bþ“Aõµ¥µˆîk£ô©N•ÉAâ¯)´ ÆVUê•ÛNåðªÄ¢(±h$²ŒjóÙiÝ—Hz«k»uHÛ±%Ú×™¹›¡ãr+w8 _6eBÉ!v¿Fá?6:‰Q ¨›šBe ¤oið㾄oð0µ5ш¢|XS÷O×BÚï Â9Ø¢ò*å×j¤Ñ24è.߸z8wì½Ò‚ õ K¡°¾½PE;:졯üž ?µÓwÂoêž"&ô0'Ü{‘×XզǾdÈù¼²•œó›Ûn=P^ñ}¯ðP¢G™iû×ê› šn.ŠJÇäJŒn\J±|GZ1:TÎ…’ˆwjÍ|íÀ&fßÊbæÛôlŒbåVLWFçCò·¢ëLQŠzÎþ¼˜žcûaÅÖÄ'0œç/SÅcyJeþZŸTÍHü5(]ƒŸû—A$‡þkW̯Ö}7»újWk˜„Ë×1Ð7(sOF%¼r1mÚm0íDœÁ¤½”\.#;½®d¦ŠãË¥ýX-¹þ`5Óš¥¡Bã<"|%IØÖXØ‚ªÀ]¦ƒ±%rXÒVÉeVÂ;¹¾¾àXq±'=²`Ó!wƒÖFŽE,ÀÞ8çrÕͼ…W{0‹jcŽ¡a2Ç«ˆÃ±;¤e`úTê‚°#k79Lj^–D:µ³mÇ`* #¢.Œ«b·Za@ýî?Ð7Z‰Ä¸x2AN”à”ãQ²QæÄjèÿ>oÊÀ€ à8µ¤¨3Ìr²}Í?=-µMcÕ"»à×Cû–nA€u0`«¤Ó›’·¨÷ä±7^¿\kt²,[.sߎv‘ršþÕdÏ,…DâëǃŒÙ¸Ìy“™€ÑÞ«Îïý9œ¶èËÝ|F‰O\G²*¤ž¢f™ÒºY©5˜Nܾs›:²º¯y7ƒp&È/c¼K›ö[áU£­A?1AE¡ä*¨†§„?Q|úæÂ:LÚ¨¼BÇ.¬ðÍÒ*œõù]eyA² Ë™ªZh,hì¯Ñcä»-¡Ë¶5£J9¼rÙŠbA “ƒÝ쩲½uнÜç½-Q—òüPjéOÿ#rH D®J`HL-Ƚ[´DAØ¡ùA%¶S'½<© 0¼yMò‡'6é ¡R«Ø[€)ŒPd–ú¹Ü[Ú ~ƒ¥8y¨?†½7a0žFÁF5ÿüF³÷989üÌ„²Ó‘á¢ß¢•`“eA÷˜+32j[âáYþâeÊ{ÑÑó^ÄI{åSzGtWE5Ú×ojhu«C¿ø?­g¹X¦m}áj&ºÅÑå ;)ª‹-ä.Á7þCúr… ¡úÁz¤sË’`½¿¬Öñêh:³Y¥Q§ïréàùš­s”!ýI›]ñ¬ø.ƯÔÛFUNÇIй>{­‘:7e1¥“PÈpK¾®áøÏ¾w€Û©Ô„ÌCqrÍ\¸þÅϵï\ö'kÙ(ˆ®‹¯JifÑS-YÎ5a‡òÞ`%ïMfÈŒ¦—>`t¹²0°„½>ZG >ºÑŠ#Ô¯ÍñÇ+sI"L@RÒéÞ…ú5¡M®q­(Ækk‚í»Zq0ª‚êE¶©b¬Q~qé‡fXÁÈuf™–†¼öRXF»óÜÞà ¦ ÔÆx+ÊðtDQüã[*Rs¶!ÞÕCjÔÆìáüä'ðW0µæ§´†ÄÝ÷r¤¡‚ÀVC~¹ñ|6Úˆ•8 *jxYóvBrsÁajO“àý¸Jy ]7"Œ8pœ/í;3>CÈÕÛÐð‡cRñc9 GÝ:0tv÷gœòÓ‹„æe¤°©´»H–“ÂÍ9Èöôû)´ôe@pøYóÖh}þ7úøÜbíôíN¯ÎÂ;ò™ÃÁ_úЀô¯Ä q0;)ÁHÜO¶V {ôãÕðßÚvgQÓÎÖl ”Û–³”¹qí¢›ncóyÔþ½ÎiíÍGÒj€½@göÝÉúV)cžD’C9U ødr3YÑŸ<7'ü$¿;εŽQýn0v½KVE‚Õ{Ë“­ï ×¾£‹Ð$Ë?Ë|¶•­£,Àã S×w{Ö7¾*D*JF\AB'!‹òqŒËg, Úß8åxåÂfVœ\o»&~yn2]æHYS¡´9¡¥Tdè-ð£Y8(a£~¤é)–ÔœÝÛ“ÎÃ÷c¯Z$›øþvwÔN¤Ã}äh&þ#9Ð\ª^" È&m¹+¢c fÚ³ˆ:bÍ}ºÒÂG'÷cW»ùNö†DQ¬ÀJ•wí)rÕzcÓìL>3pTgi$jÀ&cfßaäU–…‹ðœOºÉàd}Ô½eï__»(åÓµ{¤yõd«Â{$ûýóÄØ¿kÔeMHŠÌg‹Û«¤š¸9dÑg²øi>g¿+‡$|áK–M;¼„& Þ}r+H"×Ù4T”Jí…ÃH^h¾d5«Ós¦{ñËÖj»±ÝÏYi&[Ö£‡…ÖÍaŽ8Þh9çud‰ E0 ONl€öó’3RÊ•‡ømxw‰E±µLx=Jæf g6._éÿ íßѤ’!ucœQƒ·Ø²,á¿ ·Í×0l±Ñ×$Žì’Ùà°Z¡~¨phÞΆ „]"?Œú /Xh*-õÕÉ%z—èUªòåÕÉærq´³Bíã$~“ÉÌàÝs›DòV…Å("`R ˆå/FGäµ—ôÕÒŠIÔŠp«œž qºÓE[A»&ÅNßgû ±s ï)íÀª]”av«žæòÈ[nªÛº›“Þ³3ø OÁ¨n;aœžYï[t|ë¼ñb% ÒS¾z) X»>\p‹Ò¯£+ëðT1}~¾ÚT¦+û× hâµ%åÝ­t„ËfˆT8cY¡{¤ÙMävÌðd3êH#í¾€©´Úmƒk\â2ûm#?ŸOZ‘sر—#,¤Mé¯o‰8“¦È2K¾n êMX‹AãÏæš‹J,ß××An7*¿Ìç$j3ú­Ï˜édtï(Ï9FRsf##H*µ;±I¬PbT"ý_ã®>äă#k…tËçkèÓ‡ž”ÒNè åeôžm»œÀLD9Ž%[“ iÚŽW‘à…úrV4ßבZBLÑåã,µ<8WÆ­ †E ÏãçÀ©kk…Qxˆ=€Áé”sŒåXH÷Ét¹3ÉH µŸR •CN0)-ùβ²~æcdñ*k}„¢ÛƒÞ+pÛ­»9pEŽ—Vßәј£. 2ß–ZMe€ù˜z×u G *‚¿Ö¼K4ê÷?ÌVœÑyßLS—º}=…Ñ X Å^]ý…Íê^öÓƒQµW¦ŽØ4fÌÖ`.†–7Ú$küqÆn$þSúû‘ Ѳ[¿¿"ÚÜîépF(Æq\ó\)ÔžG"£¨Oi*¬é m’ ãt…Þ}˜…¶‹I Y-[QK‡~hõx®ÃŒÁF6HÍBg»F§‘»c¿»ÎÅÓpÓA+Ç’¡š…%\‘&.uêò^t§e r”‹œfþvî\ÿrìØª¼‘Û/ã4ªìõaª€æ™00XúK]Ö)4+®°_æŠÐœÝH@ÏÌ«^./%±†öVÒÒÁÌG ©Xý(bîÅæ¬ÿ›ÖnópF«’?œ¬’c/©è»‰ŸÅ¼>©ù«`¬è>ìë'Îʆ»”X³äbž\öÙáVe6¼ÿÖƒBdÿ«èšËL‡__VR>MÒµpã¤ÚtT‰ØíN2\µa2ã—]¦ð:0…äîáêe¨àêäFW^ydˆƒiIt {*+cQZ@fmjpÕ‹BLgæjE¢Öò"ˆqXÛ£Ò‰šû\&¿’®Qrs˜÷ÃlÂ@¨ÜlÜý®Æufª9ôß2 2-£ú—Kä‰2 +/¸€ó oÎob¨úÎp†Ø‘p³X®{ùmóòY˜£b7ˆ}œåÈ2iBàÕjo¶Ð‚ʲ¢ÙÂRÇKQpÁ@ð› ©snÚ÷ gÇ®A8Õù¦îýý …êúŒxš›qki-hèYmá±oާ÷6ðŸþˆÕŒieVÑðlÜÃEýõoW‘(ýìi…”bDh6CUš2F7Öˆ9¶8P÷ó®‹ 3n¿˜æºBDš|ü<p Ó6¿‰Q!ÅsÅp¾—»!»õpÚ¸Ô9‚—4 =?ÙZ.1Ø­%&øû¸‘O# yn´õq¹MÝÇš»Àæ×³à;£ä Jø$òä=Xõí`©®Ø›9d%R¯UFE\ ¸Ùô5SoöÑóÎæö’šªä 5þÉí®ú—Ò§<» ö5A«Ý’é[§êœù ¾/lrh\|ªLD?²Ò*¨ü½e`Pëxéýð·Íu¶¤0 ±§å¼Ê@6…À‘¨é)ʼ7ï¦ P塎wá8Q'†_%±³^êÛDWgb†)Þ½5N5òšìÝ|Y÷õA`˜/X wnWM¯íãü•·† ¹—7„ø˪Ì Ê—äo]ä‘nÊš;uÛk7.A•««5|P´8€%æS±Å!ûÕš¶õíŒ9} <ò¥Ñ[ÆŸ£&”ƒ`ìHŠ51 N¿|u–ìè ;ñ ƒ¾‡ìE•¼€ÆÛ“)%ûîrnÔ¤NáÃr††¤4ñbGe QíîŸÔÏ>c_ÿz:ð8ãߢÞ&‡ßÀ{Ø`TCÛë° *g¿^žè‡éJ åžÛüňÎRæ²D`¯áãã«t8"ý®(Š:™=eKw³¥U‘òðX vŠiz¿èµ!Ÿ<Ä:!CÎÆ}ÕŽ‹~«ˆ¬ KaÔ”E|@Õª÷$¿?t³þTe(Ü–¶±”­Èlb]õK;Â9xÌÓ|Þv‹\PF¶g <©àÉ„XÕ©6­ë—ÎP‘à‡; õ÷Ø@@ŠØzhß ô¹ðÊQ|.žÐ-°ò‘Õ±(ƒ¿aB×Ô‹@`ÌÐOÁ¼0+Ä Œê잊Ô/ÿ8yC:–iàÒæíW€í€z½S¥2üïÑÚv{Ò\iŠx›ð¾ÞÉWEƒœØäYMi Ö…WÕ‰|^ºã‚ê_T (о¢ïæÆ~4…ƒß뎮EiFnH0^¨Ãér¦¸X.ØS£4vêá¹=‚) s«´K[^ÅÆ³/ å­Ö¾5H0ú¯'Ÿˆ'̈BÈÁ…$Óå-Eý³$« ߪAjÍþœÏqHGºó"¨}ï‰]P}”')U°hÆÏ=#=Üýã ÒB±XÜçî@d[—xþ¿/åç6Ó`©”è¿innFcHAš¼ôåŠU¤påœ MvÇ7>݈ÝÝžÁ‹l—"‹³ïö]ySàËF1”Sr ÿ‡oƒdøÿ.f–B+ÉŽì—²‡Ð’*2E)4šaßP‰½!1íÐmw”¾w§ÐÎk7C¢Q·9¢{FÏ~ÆiÛ-ÉÆò@,ÍÉåçáü»÷m\*œöqÝ5Ü5ÃrÚbÐÅÄx!v·y„ú0U· §3)Ë29êV*|+€âBܸõÖ·ÿbêLHß%;Õ79 s|˜‡çôpÊSÙ™´I9êÞE´+ÚÿM$àWOÜJq$þOÄ:p\A"xÔ|g_SAY¥„F¤jçt' ÄBó@5%EºT¼!¶ÂßVŸ7RK,÷¤Ìd¼+ìMGPz¾ÓðøH(HNúy:fØÿ^¢àã¬Ãúd¦µ)ÓÒN~AÑKÌ„v 6-6ë›f6žáJ±wõœFá>ê]x6˳¯è¼Ãú`£ò‚'ácª_½²p‚Y®Iѳ‰Øç%î.bûu6¸à®Z™H˜]åY<.²Íä/l’öÏQÑ ê¼mCâ4:J s︂€”DyI3™¤šËÆË„Õéü‹KŸ—36©m¯'YŸ@{½ sA€jHš$ÃÄ=åÇÆˆµyÁ;YŒ¯|+ R‰òRv…SqŒ·”ÆÓ¹{‘`bƒ0†#Ÿ¸ÜDtšÆ‰R¡À,C">æÂ×ÈÑMf4WÛõ´çžå¿à*8£ÌIÆNz¡xG:„J€ªmÏÊ÷ª9]ªÚuGËþZÄÞ½É e t0Wkà–šc‹ÅjA{¶Ïóâœ/3 ÿyßè’C#z´êܶîµwŠvÆÛcª[kYv£«>¬mòÐìª+ËBÊT¦½N¢œÅ»¸§¸6«<-mqäþt á•qÄ!&HWS¼žƒ?kØD5:Óò4̆P¼þºìËXèt¹fà¤QÂÑû'î2‡ALÆ'R%ÒòBLJ ÜkÚË¿­r•Ò¦ºAI b¯£«„ÅÒOmªÖ':Æúyq“¬NJí Öùº•/þOø¾ ×ævExvÞäÊŽšáÈ¡ÉÞoVnš ͼ(8Õ.µ™¨ai’ Šï@{5£žé(Û7÷å§Ó74c?XÐÐV%Uíýd3ÁeT3m?eÖ¸<'äò^Áºusñ†á鿣[”<߆³¡QSþ³vc©\ñ|›ÖÉ !áö„žO‘zôYÆy]/p6—,–FåÀôkXByÂÊEºá´y{2š8“8…a,=Pà xœÿ¤V!þÚº}¡¾¸ŸB#Txä‹>ãþó¬Œ/ÃÅÀsç3´xBòùïmí íæõðÂMB1 †|ëÜëÄi±¢a“Îwjr*úØô­âXìýj…NÀh³j´bAúØw¯¶u'*Õ$ì“ܰ‡+Wn–Y– Eãz5¹,2±€Öi`ÌRÑh“cÑ¿k5³PAnc¹½ã|PwX±È6q×ÌÊSˆ¹)Þ-bP1„¼*â¢ø¿×­&õ$®Ñ¾1ÃwVpމ´’>‚PRÿïvá ¸{Ñð«ù¼L\ª<¦o%6k&Á+H †O0+æÐ<Q@™¡/°°kðâd¿{&v=QÄÀ£#§žƒrÖBÄÛ/4OÎí¥eLÉñx8a,¦§ôÂ~Fq!#Vu‚Â!ûàâäŽ!Ô xÚÿ¯cÀߎ¯àpJÉü'ôì#1é®@…™ÏiBþ‘3çA¶xªO+(ü"QAˈ§C-£3# ÷¡ïŽYù9ýÊU¹%gQÂô[±÷Õ•'¡ÃhWPo—âÍ«ih(½.Ê,¥›ATáýö?„˜• –^yn&ÍûoëÎÄürU®Z±»$¡ìú½bQâæO aÛ0 n…á­^Ù¬Ê xñÇk¸¼@ŠóÉ›Rà›ÁBV‹ \€°å `>)[t•Iø“p±V³|ÞÐv§Õ裛†3RNÁªQûÙP°™ †15¼öˆça»Áo·¾Œ÷¤wг…íg(¡Û\slæõËnÓTÄxÃJGøzœÝ¼Bè.6Ã5ÌTî:ý}Ï[tÙÔúËÁ7v¯×³ºlN­‰ïx_ÚN<èÏYûh&ÛñwB–Ä˪ÑsdA"‡÷O»ÿ¥ÂîPÆAö*QÍ&-É ô›0ŒÈßû—ŸŒ²bžCYVk÷ ‡¦ÔìZò2¼í[¤™u[™€y3pJÏéôAÊ–{æö£ö÷õYV*ç—2£;  bßñµ¤A(:ø=¬Ø•rPúW,Ð6‚ó¬w½{ì¤F)iÚ":[Vo¬; L*X€âäC,H‚·÷î‹Ü— vÌï‘0dp«ú¨·ÞDèƒa§?;B Òç—XéUµÖÊHƒ<0ï• »Ç-Íyƒ’Q¦þtB¢È‰‘–‘á‰Ù«` N•tÅ,&`":qÄñm9hÉŸ©Ë÷N\Éxæ¹Ä40y³ãPуݷÉkšåQCeÛE­Awšä¦ 'Õ2Uúç&í»×)‚”L-‹peúÑ,CK¶Ý“T¡×x—Ö·»õÆË_H-ÕÐqUQˆ>Tv“#Œ…FôÔÒtß±—òÐÉó¯ÅáÄȵ§“×ß9£ª´ˆ×¯wûH"º×úT6¶0ÉŽ”Ü6"øæüëøE0»¾œ}ªÝŠÏ;ãŽw[K¹ÏÐQzÑkS\ûä}…c湔ӛ߹¾:î>©·a2µ“ÊÞ¼aFŸ@J.­Ž(e«M!7û¨÷±z1иûù¤ÄU. “ ä;XÜ‚Óoð?Ý•Œ^ºŠ¨Èý07^,Q“' ,·Ö‡°Ÿg bkÙ‡ T¤ÝläyÛ³ž‘ê>¾0! G£Äc'°â»Cúm»šÊAU3ý’Àe2)_<À•‡ëß++ÞÑðMM}ÃHĄ믜ºÎÄ{-/\ªÌˆq3¬)£è¸t]õ¾Å)>2ŸT<6ÍÉ:rKઑ%‹ µ‘áñË(K¨!œðuœRï­•/³Qª°kâ¹+Íh°X‚G zÑ̘d³gÚ @ÁÃICk(1:ob{±K¨>œ8\p0åa TÁ›ÓOUé'Fm©_qܹüέ%T£š[ó€¿[-£wfB47î¦Éü¶…VvŠ‘b®Æ•ß!iŠÿˆ>%?ä?ÕsvMàxNîo4d¾n!c à/®G-á`.b“cåÏàâ¡ZÌÒ>µRÐæÖÕBÎïÊÇBYkFWH¹3%N‚»ƒ$²…|,:*äI#FÛç1ÈmŒrðJé²À4æy)Oa£¯¦;ðµu©1eP€ñÍd‡6„v4ŸS§ˆLÕj‚˜j”Õ1¶zæÁÎ× \?A†¨€H?%QÞ7=É D¶ËÃá˜.(o“•ßYh>©ˆQ:,/´ç)6$þŒ‘|Ò C«UÌÑðr\Nr–1:ƒ«+òÄõÜm6Ó³Õz5î߯\³êtŒ­„FÚ8’z"°N¡:² »2Ûsp*fÑ:UG:…܂Ĭ­±óVïô(éæA¿xw”ÜŽ)^ÊM™pØÁ®S³ÑeÕ£$ðwR”mÀÀSÖÛqϳÁ²÷1tšë±¡PE4œÑÇ›æYõØxÅ,ÞÏDCq”û0+‡¬ ”iˆ:"Ä{o‡ƒs5ŠÙŒzÈÙ9ºîþ«áJ½L '7ýÑ/,‘v'œÍV•ܽÀJ£ðÜ⬩KìšÆ0›û³‹í¼z¹Nà=ÁòmrFå'Ú J)úUg(Í–—Í0*éå cŽîèõð°¥.‚¯+{¶¢²Å`Ɇ€Ô’áǘI±0tñ£m*^8«(Ô¾ã{^JÙ“k|ZXÅ‘9od…áÖrz „MTè´<¾¬î”@'Ï#K*º¨MÔtk·%e/ñfé쓨Œ(ïÑ…¨òf!ù3rÔ¡¦æõÏÕ7õ)î…Hå€.¯ jÿðn’ÊÍãïxw”äöíÛçߣna Äf&êÿæв©ÉÙ*ÐûaÞÛÊ":þ4]ð9ÍTÒ«áeðfúö’‹K¨Þ-ö› §Vùöõ“|=öhþ™Í9†‹ì ¶1”èä{±Eâ+/h&¢cÒ†â-™€w EÄf„Ã6†š¬"³¥ ÍZŠ>e&²U_…¬xƒÌâC]uJqú¶î~[ûSÏp”Ý _!K- s{lï«óvÒdŒâ„þ¸ýw$T߯ ¦+¿gãÝø ‰6¤eŠü®IªÉžT÷/ý×$nµ:ÑQ­ôÁ]"ʲåZ™·vG£\¡'d&L\£×–óÞs´{ØG¥ÕM@Ö¹ÊFzex7K'ÄYœ­“^ÎþÎBj üžó_¾àØ5jX5iRdóî–h~±Ÿ€Ò˜ŒÛØuó4O’5ÅÞg1¬ ,âCèyi“XÜU¿íÎ lFð #±–*+Y¡_±è›B¯&\Þ]âìªéñbŽMI×÷Jm Tàr‰&ÐUd{á¨2ˆ»!Dô«=1¼Õ,"}ÍH©ÉxáÈþ–UË›ºo1È•E:k ûd%¾\ÎÀFúÖЫµèÙ¾?ÓåÒÙbZ|bžc@;>z¸žx MgêØë†kߌ™JÕ—q5×ÿèo3¡LiŒÿ‰Çùüô鵡vDjõ€&r™W¾ÓGÛ‰ÙuáÂ0º{6X¯‰h+v‹ÑE_ê°˜fÀ(2+øœŒÎ­ÏÌE¶ì¥9° Çóý¹éõÆë?Â~UØJgÓ§S·Z÷—Èîž‚Ïjð“Þ{¾ÖÄ[^ClÐsƒ”·MÌ¢í¨<²ÎpѧÃ{ѸMHß<å(ªë[_ódÿ#Ð\“¦û–{T½Z`Ÿ@]œŽ¥so’ÍÃ^Ø5<Í%+×Wýd1ð8>GzdÍR‚lx}ÙÑ]Ê{ÆME-€ §Ç ô¬kwîÛã>ÀzIy Š¾' %ß®J‰T¹,ég%Ögd„³ÈÈÎk¢ûލD© ‡I¯“×E=¡ÜáJ&ƒéXâDIoójífõ®þ¥ª>¼Q^ˆ.vËGÿ]^$Z±­wKÜ„,üp2áÇï7+Š8J7€ ÉŠ `é8êqÅ9@E2û(‘ÉÄT©Œµœ©7˜]}°ôlÇvº1$ÅÒ 5ÌñŒ­³ â w®!m…‡Ì+Ê#·“›§‡Ótœo†ß ȵ=03 ß¹dseÚA.²úÆç‘ØÙvã9{óLS­Ç€‹¾„Ý`—åagI|÷¾B^I.âÃUF Ú¹ácâzÍbà}rHl= >n»Ó¥W{Ëø)+L¢»,kŒ"]j[‹Û+a †"ëmÒ¾ÿTÛF’ýG\C`ü=ΧsþBy@3ágÝCÎMÞÕ¼^@~à >'Ðç‰ÄÞ8Þöˆóñ/Å=9¡¼`Aù›ßû†ù´Vö2©þX,Yâ?}/¢|´dÖ°û{@E«lŠ "048©&ž:SÕ{ ᜶«ï ¹ØÔ1EPeó×$0Ðv+¬S&!Õ|ÿÅDºqo™+çÝ| L 8¿í½"ón¨4ÝCê›ã3u¶’›ÊXPÞÍä|ýš˜Æ—‚*&åÜL~/šiHn¤yÈ—ã?+ð„,èETŒ /€6úo~a¾Ú<Ó·ÙR¡Ÿ—ܸEÂ,y“ ‚ìYÔ%âŠ.Ù?r¾eË0ïÐa¹“ºôƒï6Å?ºƒ®Ð[ÒžHÝO)ÕÑ*fæ US¶RžÓE6˜~B$úÛÊ÷›+¥C»Ÿ!*¹wœÜÈZW«_½4»ý0B#"ÖÀÇ~Ò»shJw‹u/ÄÂdyFìcüewÕ7 ŒGñV±o$Qí¹¸Î "´—¯%°SV¾"bª+ øêëïáp‘†ÒFÒfÀ"‘"™#‹zú‘ö|Ê E ·ì¨Šž/øŸ±Vúcbu‡Õª+ì[Ò,è¯Ape-DÔ©@Ü`‹ül…®Íùëi»ŽÛ&J˜—%:áÙ§Tüß„$fËìnŠ:ž¸À¿.¾lMÐ-ödÑ\±,ÿ=f«y+ilSÇôj»Î­¥w0Û“%Þt)ÎMvXó¼nžYH8i¶¾ƒaGøïR”½¬ŠM™õ*ð@òÙüß3j÷I ô¦€Ç¢¾â,hl¤o÷ß}ýøí™plNy¢i«{ûÄfž'«¡w€Cp“?8Of®¤P¿0܃÷É8¹–ÆÃCg…®ÃGÕJ h_/ÔéD§ˆÈw– 1—&/Ž6ÒþtÔ²ƒk“à1Ž'èÖšëËQÀø†•‘?a¢©†é^_ÒÃë„”7{ ß.²SÚºÏÁÊ¿›x,âÔ°LÛd[ñíc·±Ç ü< 5MÄÍWG¨?eݲàÞ9ýÑ·dG${{ÛYÁðw\_‰‡¢Ÿ´àõÏGùVN#™²ë×ope¢ï_¤Eýó;pyè ,àü1‹ùå̤¡Ñmuö=»Ý§„e¼=Iµ§ìÕK¤%ýmoæ^,üϱªd‹üéZ翪@pjçIwÛN«¡ ™ŒEs—êGÉ¥ŒK]ø]LˆO6f$ȵDÅܽ;Ÿé÷ÊÜt°·g5µŒÀAN&k*^_âÆ0î¬Sœð2•à¥nñL1h)Aq\s ´†˜ÓÜôÌ–+žK¢_»X~êÐ>É>;«.CƒUôy€z­õÿ{l<˜NBn¼œ9Ê;øi`@vØ?ä­5zx½$0Ç(€oÍy ÑjʘT{˜F´7þ•‚äócî̽»i[}aÛŽ…Ý“›‡`8PkbÉíUHö•°b—W>[oÖ{BãU/´Ü!¾ÝHÈé…¸C|©ÇMÁÍ“Md“°9|±ôvðÏ"W£Üsˆ¦©ât}ÃSìÛÄâž-–ààq¤9@,úúh³œeÍŠ-°Q]ØbžŸ}V»ïð_ q‚0M¥a$ (£çOiŠ'¥7Ü׿Wxm‘4Éq½bŒï)œþT0ºUz…UJŽå8Ÿì™-½ëÕ~bŠO—¨`(˜ë¦jÑ9¯x’pDÏó&e*bl>e É<î`4™Ñ‰®Ú½„Á8S¯wDÕg«ãY(ö‡E¦žî>°C/œx‚sæ‚ÊštKž­ûÝIÖã1R¨zÌ Å]HÓ ØØ—{h®‹~ wݽ'âxe6äñþR64Š<%·ÂÉT&5©õ­„ztt#$@Džå;ʯªŽ÷¼Æ‡£h£ ÒÁÿÆ1§ƒ+}©Ƙӭrt‰ô5yØé+µT'°ïkšB°81Ì\<ÿÐaÕsÈ€Ÿ¦[i³Ø¹óÉü†oޱI¢—ì(ŸÜA;e}9g\‡ÆÃoZtèõ›°LéA8h6Óš >9[rò‰›2BÝ’>’a‘Ðìî÷X_ §:²5ÐA¥†X€»úKÜ™oÔû¸Bò_¦òÖ¯z¸ÌÊ‚ýŽL…sFn½B,‰™Ë,PÊMs³EÇ-ý0V~EµP StLeßO"àï ´9ŸzLCC“ÆZ°Ç?Òó-^´ „Mð‰ù]R(.˜pý'„Qä!»]m>ªVÁVl\e­=¹Œjªç1¤Vi´S½Ÿ_¯ì–ÄîŒàø)ѪßΣïÕ!2¸€)àÜ2þ¥XzwIkDªÎ@Qÿå]¥USÉcä«íœµÆœ£hõœ¼MÈÎ7BU“Ä­)y³£dIÀ䞃¾Ÿ?L/˜Ün‘€0Õ&¿WÛ£4eR»ûc´¬ç›È­[릋û’Èô/Þ~% *CäÃŽ[êŽþ”s £ïõ¬I-ÖeðŠLŽZ?ô ?ÁHd)Gl³LØ"ð(êÒ+œ\Ñ88¿îêŸGpòUxœ…,–ÇÇž‚í:Íô!‹QÚ²5HÅœ¶ADNn˜D¨sÓÞ¬’êÜ…-ˆ¤zb`,)“h×Z„€¨(l¥ñtƒ_ì8¹ºÀ°õÇp€çc>ñ Ì´,0Û£­Wÿæõà„Wö¸’Ƴr¤Ûq讦·»Ö×±Æ'þ*½ |W ’†ív÷­ _±“ra3ÑÚÔ´N¥dX}þ} Q3t)Ú)ñ0²Ï[ qëu0 ËX;.\¿EfX%Wîƒég×YÊZš;khñC]ôŒ-ZTÔ¿l…Ùe^ñ´ »èe’6ˆñ—šZ¾.—=r2A%ü7“;qØàe ß%ÁË)õtk9ªÐ×èxÂäãó⇖oJ=âÎ è4ÌØ!ÎZQ–C:&|hö`©8õ<'b•†Nˆ7ÊPÕ6¯D‰‘†L‡^ªpÏ ‹j¯íGéISñ0P;—-.]¥Þ—üÓðÿ`’~<5 õË'üݯŽR¶˜(K¦œ8Kåë8oFw;õÁI[³FŒâ„vmÓ„™%º‘DÓ] 7¯cå'ÑwC´â*ðêçgþ/Ü 5=é¤9yÇÆ…>ú64 Ûò%š«D÷ Ü¹¨Ã]ðuŽÐDîæka¦ÒRVúöfô†Y)ÆFÊ/+·%Ý¼Ž¤¯r­Èážϳš`·¸±mÖ>×v¾íÆ+AeŒ6à¹.™õ—Ë/›SÍn/ íËO’ndiYùd‹Å8 D4ªNˤ–âç_‹H‘°'Ip`éä9G58þ›¿ã©£øíÎ6‘—Ü÷} ’lecI,8¤µž4|Æ\ -0|Ezá Žé¾­Þ¿ø-$7Ø?>)|\ÍUñð؇W¡Ÿà™0S_àH@H2'—ÓŠK!ðj`Ý ×ñ:6IҌߘÕ©K¢fËÌ”dÅJN÷„K5óH4…à9öDÈB+!CÊsݵr™§µ:£N‚ÑL&LíÆÝ䟠°¤A¹­?‡%w®¤JG;>œ”JúÅg^.xvÞHÐÝ$ó¾pR³È÷ˆ~óúKéÔ•É=Ú,$ƒÌ5ULð¥ ÕÝH˃M«?MÎ9Rbͧiî.Q ÕË”}'ï L.ðpMWY¹éI÷|qÈâÒ¬› ê¬Èt"ÈcÄwËYd•R»mš.8z3$uzÒ9Z7!ZrÃ&·kªÅE"X®§BÉóbìÍ«‹-±<cÖäPÞdÔ®¼Ÿãã¿D³ÎP” 1QI—)ȱt5ÈÆ=bÒ¨ `÷Oµ\ŸLthY-ôf`—íA;.J_({ÃÄiSÛŽ ª`^•ñø¼ $?RèO_+ô3_ÇAkuÖxqoØbI¤,ÈåBþ{6È©»`VÿäšóðU8&ìàNr–l&Wš7ImzªG"Í ØJ5õ` Ë"›øðëvÀ?õÅh³Ê‘„‚\‚|¹ TJ¢Ú´bë‚ Ò?–ÂPt¾®•¿è% qÄÖr\_š4Yìwå«Çê•qYxOßáfè@t3/^ɹ”{/^nÿƒ^mj“±Vþ‰1{fS¶­Âî£0ÁiJ$ú'' ûÚiù]k×Nnµu°wšÛ÷äÑÖ¤‰W¶Bøê¨ÊÍF®Ô„Ø>íh_}±Ë ™†iÑZ.î¼~Û1«b÷:Ê%×X’¢X#@.™ï„N3žµ$˜“2æs2ö“YåH6ŸÁ…÷îGO.à%´á ®¿(OW/Ëz*”1ˆE Ëêb€È™h‹ˆÄU¨ƒ[䜠À*êÊá+ôÌùkÙoþ·­ä…ìÔß$ªÚûºÎN~AX<ˆ‘ aˆQÃo3k~=+êý¹ßM«n¸"NŠ32‚DpµãxjB¿·<‹°ãvbˆÁU„ÑÅùÇ´÷V±w%0ÛåÔKN¢j[ÜÇÇç×ÐIMÍ_øÐd¯a;ÂÜZ-÷€ ÅN~Ò³HnÔDBãiˆY—ûf—¼DHvHƒ:‰3v",xLOÈ =rŒ§—®á$ZÜ ênåwÏ5„ýùçòqž›¸óƒH–5q›…ýÕ–S# ö¥¿›pô?V×K‡“¨žzvÿbh³ÝçÚBÑDB¬Å™Rë]Í/Œ'ó  ×\Z±qÀÜ»úÌ…—ûs²Jú ·æý¢U?Šêöãº~cŠéhüÒ¥ å³`8´ìTÌCÍ¿ËmÂEr ñW̧ˆ|"ýìRçöøNò%Ï_žnÃ@ºÄ",LDŽÉb¯Ïª“¥ƒÖaç,Ž+ÌêŒÿ…lé@ÓwÖçuËÑਅs^;”ä¥?Ñ“Cºß—Q !e`Çè• aá³ðÖj8&Ð øëZ9ën­ª´ѯ0^ÕSv£"QüB'ëŠË-¹e/Ø›Üâ“Å­‹ýõ¸¸¦:Þº, øŸ3žÀqVOåñaØ®M+1/A*H_À¨Ëg‹ÊÒ-)U…” `È¡… d*g­“A„, ° ðÓ.[Öa9»n×ßõ>¥žòtÞõïöFX]ñ]"ji»;+<1ï˜e_ýÿÙÐ’(ëýjµd9R™]• –8Ô¿íS}Ö§ýä§&/Dü‰?9jK/²"¼ïç—`à<ê?š‰=œI÷ÂàiI“Þ¶µïèŒ}ã`”ǃ÷ï¥ò^fû ܆çÔÍ^÷ª(~X•í%ê%ô‹‰ö!Õ{ÎÝß´mÞD¨¦ ìÏVwWtS- ¬ÈÞr¿¦»ðWŠ×Qßu*RѦ—VSô—wË Õr|n½î)ïWÆ4ø öÍ£¢¦Fäb(Hõ!dÞ)pdŒ®aÇÔÒ'Fèw$¼©öÒZÓ®-uÁ#+À`£&d’pTícçz¶Ù‹T_>¹m·Ð4?©Su@’o°Á/ë ;\¡‹\âü42KsÜŸÖÎf·NºÂ!ŒfW]Áø&£î¿uùY¸•1Š¢WC›×HL$û_–~¡u‚tÑXÆØ¡“º¯ûï3iÜxÛ_áÓgŒníÓ©E´IN¯CðHàv-!áLÝOò\6ŠÝðuÓDl!\P2yWŽQ\ö½ªiŒˆIm.ÔÎ[3²ù«Û_iš(ÚP’ÍG˯£V¸ ×5ÝÇS¬Ñ$"o¶üïÁêCÓ„AÁ˾Ê(0‹%}s ÿ¦~Oá~A7W}ðP[Pîg1j1 ŸgÐ@KÿŠjæÖ\sË_«ûpi³hô=|äWÎæ”öNb:8 TÔ#+bõÎñ¸rnªÚ&ª\éâlÐ3ŽÑR=ž$‚Ÿþ— +=ˆµ©Á¥fhµÅJ£«µk°ILäS46o8J»¤jë᳞Ãþõˆs 3rû#†µÔZ¤°·~ë,E3r©F¯I·$AÔÿtn 7ªe©ï°+U”ÜQ7">r•-¥ëDqd¾ý˘ v@]A ÞúØXiõ/Æ9ØL¸É,ô9¡Òv¾~TÙF7¥È\&7ÁÁÿPsU‡àòæè›º›a —RmíB‡$a1!ËbøifS%»…ÌV)WÑk`_wI©1z‹û{„™h‹A€_óXi=çñI·ÿð”*¿h¹ák¿O¶]j€-¯¯¢-ÀëálQÏ÷ÙÌ}ôí7ÒµjH°NĘ̀֙#âê&;oW^š­UÈÇ#]sÚ²¯ªñokR€¶Û’ £1G,^ʦH–Eè˜ ¿âKÒrs èh°yûá;]9^ªY JÉÜ?ØʬFRr©!¹R_“È'mÜÆ3`¤¬A;RfL›ªJL7²©eÇ ùËÛø`/ÄéÛ5ÂE”éäïKµØ2÷©£+OI!ËΧ=ß—äÙn†¸äßòÐFµQ¶¾-%·›üvûOŽYyÏÁ{´Í…Îü­±^zÛcTQÛ¤px›dè@< ªIngÚW¢ÀR$a/ãvbTF¯A{ƒÊÃÜ[,®~ß›Ÿ…Vô€1qØÇ¡¹hSLVæÈ>wi½›G,øóþÿèwL’; $ Ñ6zœ×ê’?<öý2>²Ãô˜<'¸öÑz/6ºÂżÎuK"hNÙ¯ŽJ –ôšðòÇ«fýVLg;œäíŽFæ: ==¨¥ ÎÐðc%á {|Ûܰýˆ&a• ùŒ¹YøA0FÙñ„磘݌d {Cˇãšr6Ù™–DQ=–P BÓ"´ú~ñ͹í¼la1ôJREù× ƒA/YÉ UÎÃ1«bsgš¦ŠûÇzÌS&59?7në"I¤ªjwXÙbý`yñ2•4 wLØŸu–FgN5ÒDÝK/²atMåû,„qàiwVºv³CLºÄô j>YªA‹N¦ Âó E uG_ƒÃ'm¤{͘FC­r_%±2íR5'Ä»Y¯|Ã^uaOKOnŽR•#Á×ì7üÍU‚á…J¨VnÂ>€3_}Eδ‘­^Š*¾Ñëð‚ÏWˆÇ9Ï÷ôªþ"˜"A6ÉÓ¦ØgÞri:Uý¢t° ÚWÅÙË”úŽ*dÐ`äÞRÌJxGïÀvwR™»§Öay2µû3I™}DxŒ!i—fhS™Ã¾ ŒÕ›Šßðßž⾂NR ·'ƒÕ>­ër_]y ÔXºd"!EÚA[—áèÇùª°›Å,ÌKºº~ÝîêM0¶ü±¤|8éü ž\`ù“mCé{–Õ"L°A¹Üs,úu8®m¦.aúë3l’‘‹ëÜ}Aÿ¢t`”&{cW]ÎòOóõä šÄv<ØŠÑÅkøI—“¯ÄøÄ~¤¼ýÓ8tèÉ‚V™åKŒ2­l’[w<ìŸÙtXk¶%¿éåÊÊ'ÂéÃå+¡-˜®i€#÷|¬ü_¾+܇¸ x*wCð¹:»ÐXŠAÀ¬ø€„çK)g´i窸"®ÿ¼kË|»—ÌÞäžê¤ÔÝj~Çž«d>{ gàóe«^…ì#µÑ&¸wdØÞz1W²PçjýH¾¥’ÚYø·¦¯ÊéMÕÛ’eZ½Ç¿Ûã‹ Œ›{G󊵈ÙsÞ:¶edbÒ<èå‚j‹Dë%£«í;D¯Ál*d¯íLãÔ_GNdv;s¡§ñ~Óû=t»89£€ëìÝ+´$×¾pãW'ê±W^žeaU«ü MíàjjêËþ` 0)éÿÒANá-,4g6m¾ÁypÚÍ÷ù^L”‡‘~¹ZBQ~SCR¡Àõ$Rþ†÷>n£€6Â!¨Ð¾\f#?s8³ã‰è:Öþý†?ÒÃ_·æŽÙ½ÿ8ºûUmÜ'xe•­Ø9dŠÎÿ1ÿ‡ßS3ŒËöSÙÉ_á}/p.&¥PlñHÿð,¥_œ#´îôœt»3“©«¦úðf——+ø¢¯\ÖÇOjCæÍ¯!LqLÐ*¤Ú‘,V.;‘6Kx/ÛÙÑ—jþß…<ãFW­èÍ‘J‹]É5û¦Lâ=d€‰Ë S‚…Êj³Ë¨è—jgí /­ÇŽ˜Í>ÇoÛÃ5ƒo´N (–£nCF¤»yehÔœXa¼Úà™ßa†B ¡ M èD G¢Nª¿¬ÈVÉrUÍy õ[რ~›Zü6úe»´5±æµ³Âôä½Í Lb„ibvvB¸sŽ;ÖÐ¡Û m¢¿×ËÍn\=flCÓ‡1µ ë”æî8&…Tú$f»G·» C'Á§;Daà¹H§OäÉê•3Ûj<}g°`ëUŠ¡Á@8¸¤Zžõ‰‘~êÿ©èË&Ûá ÒÚO’wQ$Æ, æM¶KQ´ø®Ë% ˆYÅ-H¸®Y±Ãã¹ÕÌÏÕ2ªÈ‹mï‚ Q?Hê"`07¾5™d„î,eò ]` ‚ëŒêŒ(ïâÄ"ճæ»oŶ'_æÔ|ws¬Þâ’ŽN nžLÕò³„ö†1†/¨tøƒßænƒ&±¾Æþm÷<]q+ñï¢þã^Ññ‚Ø¿ÆéÐlËýöOØÝ°Œå|èôKŒmñÓYÔ@Q% ŰN 5¹Uá®`ñš«lkûÕ°Õi#:«1 Ÿ›Uÿêe>;ø~þÄÚô%@t×¶Ñ©k4š¤Óê“`¬ÔÏ®b´¦Â-·¶7UÌE0wy¨î2WŸöò;%1ÊÀuêÒý¥›0 ÌÆ¿×‰?Ã;:~™ñ‰!ÅŠ{1‰]hYj=§ëÿ9oaÞ[2uùªŠ‡üßq6e¼$TÏ´Ý7pä„zìbÝïC›LÜòYáõô¼ ­Ýb°Xà»@^Øm‡_wësR©Ì~êÍà¨ÿuçg 1zQÇ (d2k1¸XtöŸŸÌÇö88ОWÄ;íŒ2Ép%­ón0¹´éÃwæòZp ³à›=®è/†´)úޏeBáþ—!z:ÓÉ yC3s¡‚ãan3²šà)ΚßÃÁßWTð>N™+¢Ažu|¡Ô %½®‹APTq\å4ÍNÔÖÛÌ'ì~·Cc¦ÝÞÅ)C’ ž8¡vDx4?à¿Vºöe€\‘KA0{šû;w²ùÃWmk”ò €=âð÷rëx£ïJ—ô¶‘SÏÇo‘©†"e,ëw¸§ÑŽŽqý3ÿ…•ß"Vh28Q¼û½<€Rˆaæ?,žæ™XÙH‡P;q©9ÐÁ®ìŧ.Ç|¶M@õ…€(ŽÛ15 ~‹aöÎ3£1MAíiŽ| æ6%LåøÅ î06Í–øÚ\'SÖQ®ÖÄTÁ³<帊óvoâÁ}O!ë„ÔÄ”¿Å…ï>‡“Z3ù°W®U˜p1ñŒ¨‚[r'ìi‚k¯Ç»»sùü7U$4™«ŒuË´Ê×tF°eÁ_mQ‘~ÐNöÿ, ޵˜m€XRÊŸSˆ£jëþ›Ãn Ì¿œŒn¨)cß?&ŸÓ7ι#Ê[¼ª¿‰£·›lÁ¦y?Á J¶k>o£‚‰~@†4]nðæŠg^AD틾z´»´7†Îc˚ɖm#`>7sЍÖovOÒ5³%ÿ —s¶”߯;ñméwÃs=KŽýÑ“°Ã[ß¹BZêhÈé°"4j'{Kwº‘%Í)Ùj©=›šxítqxÈ-Ô“a>ÓÃɲj³Éšdqôhzp²*Ã×}æ-šÑë9/X>¾MÍL» &uLU¦Ø÷§ÿ‰Q gúžÁÃÉÂæ†$ù°ÑHcªÓÁñÀÎö‡iŽ \ž¤»Ègu†~¥Ëè%oý+©‡S…Œ@=g­.7Å¢ul“±ª%SM5S®ÈÊ8û‰ÝÒñM·7èyŽ U[$Ðe4ÑK°r9Å#ã#`ÜlÏÑT¨—FΫ¤‰¡ÈÖÏò3Á¸â\”N /0AÄí6›Öú7.€<Äs#šÙå•ãS0lnq`=‹­#ª¤ þ¡]¡#.ÂÃÉ·Àø²Âwþ¨Ä‰2eYoüZ‡2÷ LÖþ08˜µ fMð¦˜çx‹®.Ú'`&!ŠÎké]uIpÁPú×K (ãy2?©ìðê¸×…ðy­0GÕ­!¶‡Ú·°lX|iŸR¸AhJÉy™¥”ÚvlÎîâ£8fŽ>ØhgöY¼Ÿ µ_ ^?b™8¼‡b¬!J‡Јn®é?ž¢ ðáNhFèGðê«63ª"Ó—NÏh¸¦ö\ë8¥6¢êVvŸñ™$Ì!‚ÀæÀôtüÆEüP#k7(èSŒKŒ«wʇÞÙc¯ëEÞî̃!$}†KQHƒ¡Æ+¯2—¸Ýnú"®jM¨îœlŸtʆh\EFÎf½õ‹Ä8»àß)Ü»E2´>›­ö0ŽçéÀù;}"º£i+ìõýkTÖ’¾ÄÆŠù‘ èõæíÔ»Bv‰ǼºTu׉ÉþsR‚ˆÑG¨w¹ÊöŠ+ø¡3 ö ?0ОµŸ¦Õ’þw: 5ÿ½ÑËFZWŠÖëV(À þ1M+½«ä‡‚+sØUTŸ(<²~óœxH²NMƒ[Ñv¹ÆbK•þñÓÉÖ„YÛ¯Ý(xùÓé¿gßu7-=WaJä—Qp¦ö1"‚ÌÓðBÙAÜw?é@ód÷æUùŽ÷¶(æiàò\§DÚËêúœÿ!˜¡Ã]H΢zä‘‘¹P‰‚1Pt^7ÅL[Âvc«C&éä›vfŸ-¿AE?Ò-1GÅ­£´UÖw¾Üg%Q7zAß# aÝ¢?YaýÛSm:ÉÚ ‚ê½|b]ºZ4F™‘ÏÜüš‚‘Š–ÛDlÁ>PAé Òhßž>Á?zX¿Ur·W•ö„€·çmÜïCÀ0Q¼N6è]<¿IVP/¹{Ï­¨Ñ7#§ÈE˜cYaBYõÞS{g8â;>±ZJoÉÅë¶,­ˆŒšÄq +‰ëj«r_Èz¹ž,Ä8ü':šiáxžóó¬WË`Eù>ÀZï£6©½„¤ÿ0ÐL+Pƒpd¶éÃìG×­ç?,†I£«àÐ ªr5´[”ƒß`°ñûé%{¤A½Ð¨ì\yÔ*GÜ‘·l=¦Ã÷eíX\ê/š5í àÝž«‹i8[‚¥ FÏW¥‘VÕÂ3á¬PÚ¾Ó†ðKˆÅ­¡®:¨;Ž@„ýQ`z‚øNFhÐðK)@&¼­ÛH÷ôUU¬3~DZ¯ú¹è±í/„$ DíÑŒ°‡†¹"‘ÄKé6qÊ–Ãiƒ C“ØSYþQ€ô¢·aµ©÷¥@Ìp»BÅ;¢Ùs©,& àѽÅ üQúÛs/3PWk eæZ![Yþ2?0m1ÑŒWvª\u@»Ï5 ˆL¶Ñ«»Îfz5ˆ]á•(|”IKlŽJÑЬD.ƒû/(žN}©$Þiž¹åÌN™E ge+÷Õ!F¿¡@˜³Ì<œºWö¬ú2W¯­ãÖ¨¥]5ÒÉ*@–:òSúBCPðã”0ó¬ò­š8‡ùÅÅšÜȃ”Ýj/Y”<ç†LÄc|óÕ;„w³3u%ë>J7Q° ìÇw|À”ÝÌɽ3íÀ1  3¶¢{îL.@QålŸÊÛÌ@ÜO‹$]û Ÿ=0á»m/x¨³¢SÏñÏóê¸ð£Ã ïôÃô¤ýQû©[@¹_C–¢ á;Yðlœ/ŠÃÆvôà©Õêºõw'ñóªnðUÌ—•¦VÏ)Tûnvù¿6é1âÞpö‚<À‹¢C5£¨ÈO:gG¯õ€Uaä¦kë°š>ïåÖ}Éày×!×ðR{À+S–±m|_¸Œa&Dñ2ýŠûLŠÖ(±hޤ² ádçáˆúI¡Íè,( ) »üM}úpÊs) çlÏžž=N*©™ÚÑþë¤ä‹Èü P-O§ ©æÓRëpe«VDuêë¿WöÔL”°½(ƒŠ ‡§ÑšÚ‡vZðÚà4bUô¯Ø{rx²!x4á¡ÔØŸ¯h&÷Äú¼ÿSŒÑ~4nmð}:ßmÅÔZ¥;°®èMGŒ˜Ñ™s©ß1æ­ì„g¥„Rwç›*º ^3ãëFv¾.Iߢ<YR`!wø}ð;dÔû3Šzùóè[B²%ÄMJè* Ê}Jõï¦s°¿gÞ0ñ?>bG`×7ú¼950ÿa¼­cÆOÔẢƒ¹¬ e„Ä0?,t– d]ã9%¬y›Dœ÷êòÎHc5IXÁÕïÚÁ¿+aÅM¦ú{›ìo«AóÖrrç‹ö‘R¢”ÙEW2gþ“\ýÁýÔ`åR²**[êS€¡7¤…3¾‡½ÎE¤™Æÿ) rž Ãs :¼¸ß=>o »ïè0¿Aþ䊢º²ÿéQ)¨N2‘„¸Øà=,Û#œ:""t²b­¤…qèøTuÀ#E…¸§êû:æRžÈÊ3t¥ë†îç{-)ƒØï÷µ¶×ÚXþé£qyãÈê­ðþwí²QÆ-|Ï”šòžØ(IÜýŸß»f‹“ø5Úã™äsè –Hã‹8¹RL°7ÒÁê†iI|¶2Æíè¬KÜ&ç©4Çw›>^A®ÒsxRÐßJn <¸QnáGƒ:e;ïK¹÷¹”{ÂཬӧÆ,øcØŸ¿¹¡C‚â/®ÇE7nq0epdw$Åĺé4ÓhäTš¾ƃ©º/ò;n(*Ê×Vb2„DâØ^-1!5””*½Ùuòïk4.ýY>¨ó™¿ø»Ýëuž/Bð^šR«|¿+d›¼µ‚Ôs;¦û-§3w´fÎ;#4çbÓIÎTµx˜´cgûÚxë!!KÁeÐWÿŸ?EMäC M?H}¢hå—ÔG¿|ŠdxaàÎîý}wýÂàAÕ¶iƒ™Ã˜,÷E5™ür4È­ô½8\JCŸ$ޏâB%›ô¢Ê,¹Â´ µß-Ôïr–¡Æ1›oÅѶ4›l]¹zȃ ˆA/T‡ç-]oX¨m“×À}çþE6¾¿°}eǵNÀ;ù_ç>êçæšƒ^‘¼ö¸­ÅH¨œLÇé§K}.Ô.´ª`"?ü¿Pýÿü‚Òc&çe0¼*™"›ïÒ©­пåé.™X&P¡R·(æÁÚu\Rmu˘ó€É¡¢Â§ÖQÕ›9ôÊ6*¢M- †ÍLƒY¦ÍÝ)º:àÁÆý1Hw óý aUˆFñÉþ&°‚"‰÷­~ ,\œ×’³—G}c Ò@€QúÔ1W¶¨Š/¨)Á ;(ú$Baó÷7ªD¹+ƒÉ€„d9çn¨“–°r½ì}íÎsÖzS8Ö=“r ’Ž1§Æ¾ýSž4kDH‘OóK+NÑ5>Îy­öã$ÌÁ¡£Pšnh ¯=ëg¶„]Oµ RI„“ý»GcgÂÉ\«^‹½eQY¿D¡³½ªWcãLLñÚ$sµ`hÕ$q—@)ðxXÚê'$ÕÌ‘ÊÇZ¶x¹Y3ñØÏï±· Yã+|ïºÒI,`@èѳµ”y4ÔöÍ:Rªœb®ãËæ‘eXôøÎ‹&øé„¥*'ߣ磧fõ@σVª1t•Òâãøn­rou‘xO9¹RÊÏ1ªzCÝi‚‚®pkŠaÖ!ôµ*΋R½xÃâŸ@@ŪpA(6[šv&ÃU Ú¶¢³i&¬PWaÉ\6§ÄG šˆÍëÙOÂËß“tš ð @“¨ªË*Mo cQleªÁq âM—9úNÑ$I—8=¹ëIF›?à1sJɆWSÕÒg.ÿX+Ó§¸&‘‡œ^ÐêN0žŠ!«Yµ»x—@_öµžª4VÞͺ1‹(¶îÙ$ñ,~mï Gæ>!Õ_"ƒ`pcÈFñ¨x¬ú  ¾~W†ÐÀfà-Ken‰OoDÐpWX~ z:†‰Vð»;!Vû‹IÔtl(ij€^zCëïp ´º·d¹òwP„Qôd®î({¬ÃÁæA&¦Ã±}ÑŽïÍ­gL\q4݃{7M~<O¶§CÓ˜ƒÖцu:fÕëíÈœƒ;§MˆQj"ë€@ó‰ªÛÚÀ¤…ëæ²£ âES4ù49æ­pŽÒø¿\§šy½]‹òÿ³šÆ­å½ÉðRU9%îÃÔ˜±>ºúuá©Ü|-%|°©#Þwý©MÊ穲ÐçÌ»m9\ý8fú–cY²-++ÕÁ^»™}­yÿ¯)>E¤Æ­7Áà²ý‚ÐÁgë³<ìœnšžK˽ ¥„†Ç¿{uPSÌ}m<Ø7^/¼÷†§ ·Õãæ±‹“0q›ôI›ð5¾ÿ­ HȈý>¤¡ãìФªÄ¶?‚ʸۊÚ[“/eû“1Ýópm䦓Ü\ÒQ‹•Y†õ ¿ ÇË"‡×³•øbyÞÏpäˆpê˜ Óg6:ë—. ¤kÊàÞ_Ñ9®bœõ;R(M«¸'t8,'ˆB §P[èeöÛ¦Ý:ñ!O*OòZÊF›£Hõj'¢|ì¾¹@3Îó®r69ÏOÐ{?ð8šb®àœ°'  ™2( úL££@÷6£-r'ÚíâÍ%ìÉy›ìÓŸÒJœVÕm"GH~^é Ö… Tî:ƽ;8@ ,D€éþ±Æiì¯XËF¿éš49ó‡òÔiÙéäaE½NžÖÆN‹äÒô¬³æû—"æc•ÞUq;ÔBǧèžÇáÒ'|Dñá-Õå~•ÜÀþtÔ‰²ó¼$Œ¶Vlí½Å­œ’ƒÚL¹ø¼ƒ„úÆ9ž>ß]_¥»÷÷Òtاõ‰ÿÇÑZ“ãé@€àr¦£¨\‚©LŒŠ¼?d…deޱ%8Çìt¡I&B…ú¸Þ£fmÊs©¬‘"ð¾\Õuž9ŸpÝ4 {ßF¿î'¾cv=(l5áó+ ,@Ì>,-¥AT˵ðÇI±ÐÄÈ÷vMsp&ääCÓëAƒ=#ˆzJ{«ÍÙ/‘æèµ™zïW#èwÏÁª°P‚NùáEÖàÀî¹CöUäiÛ— 7&'&2.?Y1’ŠŽiÌ;KöÄfœ¨.âM2djÁ"1X[´ú"SOG¿i NT¿’x-^_ºIªåž…4¿Frm ^¨¯sgUDÍl¥>€ÚÎjÅ¢›ˆï¯i¬E´Óûº½bG’é­ìû¤«¾cñcH-î§µz ŸÏJ\}¥äW&޳=«gÒy÷VKŽÆå¡{ª;ã=P=6€©§Ï¾»›¡¥Unhxœ ‰Â|/1|"Ö0H<ûî,li3®÷NYœ !¸dJœ•Edš\p3T’˜œþšºgD4O’=*J„Iüy*±ÍaZo;á Yt‡Wô¬¹¡¹TÔÝHIšÀ}w›æÔðÔö€ œÝ¥­¤¤¿;co ±_Ï7÷îºd<#*i;‰¦± 0Ë̘=X³@r’æ4!5OHÚ­…šw‹ÆJ°€XdÅäÛ=ï?æKC±>KZfE“dÉËÉÒD¢#*=ÝÐ"*¾:{A¤ÓŽëÒ,½MV”ë±^ÍDðÚ8n‚Χ—;£³d¹•SØðÁ+$ÖâÀ»Ö@ |l6|'uL…|†·+zKD×¾j5£ü±©˜Ø8tTdË :3z3(‡Ò!fRÔdîmtž •$×E@>Õ²xy[<…׿¢}¡±ý(½á<õÑ8ÓSg³ {BÔ7Dmu4´Õû´@©²òÝ“’IÜ.§À¨ =‚5Ë€/ýïRƒÁíqÚ³âû:‚U„Ç ¦mP JÞÔ±Y¤!Å…“¤Ô:“Ú©!åÀcôà4ï?|éÃU!‰’ž ›šÃpd«T™.‘_kvÀû«w½T ¾ôã öSÀ%é›1æ^é{f¯8Ù+Owêk®hÍïpODÙÀiÊ›f`.$çðõ†:”%¹aŰãÏo ÑûYåÉÙp9Ç ÇîŽ3¨&¨k­‹Éžð3*­xó\çG%ÐÁÔr—À Á°Sîžóß ¹ ɰMfþ’έ6K§pêŸË¬ýPÄ&&'xök9â“þi*W\àÖ}[ÖËå[ŠvR`YX…@ÒȼhÔ¶ hM8¥7‚X>Kf ~²¾k”lænžzbj¨YäžØk‡®Y+ëRƒŸzžbðc%qrÿ·ýËÊOžpßàVëRRŠ>xT/1õw…R}@‡ƒ;I»F§»© ?îÞÈAsnÚHUã# ‘°¶ býÄ©véçZÂü” å$›ÿFî]ø¨Â¹0ÄÛ@”ú}ýÀÜ®H-騼+v$ŒÿÖ¢•nPH37zHî‰t¹&M~’d$΂,`Šm…%_|ààX9ìí¢Q‹—F§»MÔ”åLõõ6:w€¾m\4×Pû #_æ2’wñV”øe—‡ŸKZ^T”:~-PØ¢ŸX6±[ÿ½dr+®Dzíÿ,ÄøF¶;÷3S`?i¶,Üh@¢(ý½Ì<Ê$ˆÆ\³Ý.º(VJÊÈEþ÷‡ÿ|q«½+%;L÷GqF… ;žA³<=ÝKMS¯×§J3¥ù $ÍiæóÍß1 ’΂–'Ì6v”³¬-írg¼Ò~Cž—I.=àÐÝLÍÛ©`ÈE¬çƒpÕ9ôÄû•aþ'· Î8žsX±7ÌŽ“r˜mëõÕDÄ€^$M¥«’üœ3e‡û5ÂÈý^Ë$lÛ«ë¢ÔjQÏí?'ÿô)QÜéþ¹ûo]E,L±qô¿Œ)CY é¿¨ƒ±÷²eœgßnÀ¦ë)Z¾–6÷ž8u¾aŸø8hŒöDj˜„¾ÙÃEžØ¯†êÃ#ôŸëªàhÍýÚ„üh—A‹fnêËÆ(3w}y®×K"KôáÔƒ$3=Њß_dW7?ÆÀÓ]>á¤Ð¿!6µúdñ±FUÅüÑH˜8¶"ÆÁåðïí?ÇÖøó¥â¢¾#t¡ÿ+Y³·†Æ¢Š$ÞÔ^ÒÁ¨šSŠà+‡4‹°€Äáó{ÁmhæñöKyTÕ­š@i8O¥3ßnø€Û¬2Á°œ^JK•ÿE úËš}TÃhã€oÆ?ÙáÈÈKVzgHÅ›)û"#h¨E7Þìvê†mÚ{û'ùFE?q¹Í'—8-bZ'åÐéd]INQÃÃJ ‘ xߣ8 ©e¾Á“=ªz,™Ï™²©ÕUÉ›J%yðá1õÜy[”‰Û2·ZÁ / 0@€½WP‚üfðΓ߹‡ê»ÃÐW­a|ûÜ)x¬W MPÐ*P åòQõ þuî¨x'.|‹Ò5+§ëJŒ…™|G*½’¡°ÁB˜Œß]Zñ^?»wâ3‚¢˜Ʀ“½Àbl󓘦ÇFA4ù"0;½tó"Õ ±4:¿s•¼‚JNÃíwqçW|;´ÄOAâûu¼QIF¢ß°£¶0 ŠíÇ«œ‘à¦Â˜ò’;˜ß< 7!ì¹ùsf.‰ØÎúIîÖ~¸¿s À,¨E:Nu5{êT ìËGkAuTB• P¥ôNÿâÖkªÖ¡¦ÂçÖ¹¥GƒWù3¼æ°7ÿ üfm­_vÕ§f¹2gøÙÎðC •­]Œå0‚i1õºÍ-6ê1ÈŸ3ás‹±®¬³úp¶ÝÍþ–[\fÐçc5ÞTq¡gh ˜èUb[¡W¤»>æC:öÁP|›C/tå_¼&<Àæ¸Ç‚Þä¤=(g?µVrO¤vÕj¼å¬{éȉԩóÑ%$¯y–®þU!Ò\yÒãù9e¦umÇš+É–E†Ï”чõh$Þ°œ1øøñ ƒbÌ]ñ«mÊe‹¹â]°—fMÜ6½y ‹%€Ìâ\¼ÖS_¨)£ò3)ŠXs6h—&Ï_¬Ö®wê®¶¤VB—×€Tv€ º“„wAÍ|-ö·•L¹P«\”ï^—¯{a2eȈõˆgî †@ªÔ ^0‹" KœXdóΰZ¡7†a$ðï}WÈ3£à7ôíÑÒhÝM_aR¤#gµhįžËù”?ôY$_öé,Ÿm°™e¨ßÇ ‡ö›µ»ó!øá¾Kn\¿:€éCî^aÛ5(ò¹pÏ [UD æ—\sªj‡/Öü càeä>ù×m=œoN2™6rêh‹àKßdbf•$k4|¹ÕàUP”½ÿÈ~„¨­O R¸ËÔtž‰kd¨¬ƒ½gYmeò‰ò•!:bì’I4&†Õ$«— ìŒdê«®Òm×ö# U ïáÃ÷§íG íÐÀ¼Ý{R¦«ˆOâÅ¥€6,!Ášü1iž^3NúW¼FØ'IYÙ½gè&² Êè8y#Ló)P·»ÆøjÝ$ާn–‚iòÿ nâ¡Î÷ƒj‚šÝüðß³†hD‡RjiiXm– !@Ú}n³¯J÷ÚÎ3+|ôþ7¨ü €šB£'Ǭ,u¼@g{›üY¿&%ÎûŸj1%5TN惋p='_LÝ„J7x¨©‡äµûÚé@r†cÆÍ4¿AGV)_4Ö¬R¾~Œ„Y'Q}Á›瘃ìUüÕü™˜ÍÚò¸¹•ÎÝÕ`–7Ûê®.Žb‚þÊ–lH2Ñð`øMFgÝÇìý©=îUr%­í\  W±“È6N•ÔÜB\¦“êm¨­®ú#7áݹ‹)‹“š¥‹'®ÂGÿéýGK!–µ8aB)òÓU ›ÒÕD@X/Ê?±Ï LÈ&QQMªZÒ~ëµ›ãsãdäα×–ïn{‰¤`÷™³×¸cÿÞi·¸ãÇÊÊ…ž‰ÐQrä³­—žñdø0ÅåVô¸¡¾/óòÄù¼´u<¢  Ðr©”oΗ(lPm–V«{㤠¼¢DaÐTy»Ñâ5JÈ­b\xQJ¦$õô´îÌÂaÈà‰}³©‚@S G+qÊþÈŸè;³ý¡ýt/K W)e[ùÒc–mñÍ'm7c;HyÊnK&ŒC*(žè‘Šö§ ιz<áA9VüXl 0¾ ÿlæÂw.2©ù¹´‚êÃë~ér]j¡Ì…çâ<A¬ ó¡º>ùMä”d,„68~oƒiv2âsG/"BÅ5þ´²f²#fÏA2¼ånë|p%1RNhÿ{°`W)´„‡Ó6ºÞ‹Â3”N§)Ù%>ÿid‰ž9Ý=áZe¥4‹|«ö °2$ÞŽíbR3¢„£«¹•#d>œWòS1öF’+´3üŽ®©ÑÀÉÅ_5Àb|¬ŒXMéåáMC »¯†fef2&ÐÁ‹Û©NX{\3 ¤±µ–®Šò™-Ž´þÞ÷MúH›ÃÃî*ã6¤®%7;æJÕØW§Ä¿¢ ïÖµmÆ)¥' 7©õü¢ Ô]· e¤U(b§žÿÜoa­¿5†‹¶ß w¿ïØ=âµ¾™‰ÌÖmˆˆaE`#œZæç)¾/ÿG -C[`ÄÌ Ý‹·zV°_p>€#ûÝÅWë’¿BD#d|6á"N-ÑÀz…O¹—å*ùæ¤s¬ç‘}‚“þæá‚R®ß©&x¸KL/½)ZdY¾ôt0NuÙ…P‚yµ pߌrމ&¬cæ$dˆúnwuªR¨¸UR*/Ú°$>é¯]+#kÑõrÁ0 "Iáå³RõOe{’0¬%Øá”þ®sÄP µy™8†?œ²vñçM'8#½V©c5EfÏc!Ჩ82Ömÿ»èu#ûÓŸ}ùv?cI’b"A"-&SÊjŽÏ§¡®iE(Ú£}Z§@Àr ´2À­Œ°œdfòØ;€ˆK|R°ç w–‹Ë„<‘ ºéôl‹©æØ'¡€ C×Ë‚UDÍÏ#ìO@A‚ÐÎÌßZwß‹0¬©!vtþæ^ÖE:ÓÖ9è ò?[”ßB¼OÓÏù‰$×rß ¢°{hk8;¢ Uóú€ú3ã2 ÖÌòµ@O~r#µvZõ—ç±?Ówló¢õ{NØ!b.¥~Ø¥"”ž­.£ºS?ýJ‘2uNÃ/šoõ›¥RŠH| ÓKX«?ùÁyÿœÄlfÚ$©l v(/GS¯ w éZTÂ[¿ø~Ë/™l‡úÊŽb^¢tÂû‹‘¤Åzç¦m¦49f{Š»Á?›Ûæ6|ê3D‹F¥Ì(£ U<³GƒqÉÙÿxSlÁ$ûQ¤ 5á xܵŵiµ£Rﶨ&ጉϸnt¯Z-ÿ¥lö{¦¯qx  ŒUÜ_>¾ø«ÅÄÈÑÐjÊ=·×ENX;¸®:¯ØÇј¤c¢© 7øž®G4— l¦QûMÀУl²t G¿][MÝí’{vÙÓG§0ÚœÀõãQ pœ˜3$ xˆfêµÏ;»bcO–”ƒbtœhƒœK’2'¦×då}ìæq¬½- ¤^ÇÐ*¸üý/¸µúPÃOHó©.ï>?¸:"0æÌ…u³ ÔÓ)¤E}WüÊ[GmÚD“ajœ±Ò”ÆVF MšÙ|Bê©™šÕæã4MŠ;ä8}¢Ôæ±ÎU8ÉøÊ®póD­Hº"'J\ΊGH[ËÄM:$Ãl[Y³æÚ…]7dü–¼d@+Ùц=u”N`w3õÒJ|횣†z§å$`Šb*†µ¦Ó±pàMÚîIä·äZ"6ŸkÔAùeâ‚:ÔÎæg,.<ð3ø«)KÔPI÷¿¿küñj zzh>±`§Á†üÜ*±zuëv1üSÃðt%}ûƒ'+ëM_Úù›„UwDÛ´£œ€þ1R²¥«ÜJK{¨F]±ÞüênÈE¯‡Êÿ![¢õL÷ïãœwc(a.[""„ gƳ»4åEªSebXÖ×4`E±áµ!³«B–ßC JÒðYt¬‹dƒ  ¶øéä ?rnr®Eˆ\Fš|=ía ÀIUI¯TØ«*>ÀXÝÔ$°Ós±^áVÄgËÔLE?¡RÝ·ØQ›%íOç¬ÃjÀ±TéÙæEcæY­ œž¸Å„‚³½¨»¡RE é Uåhž¯[‡wpOc|ÊÑí#GñHóIY©ELø‘n¿³ÙiŸÞ÷uóãa öÝTŠ5äâ‹kÖ(:+¤J®ê%K}¹ì»-¥á(’ÿAnI¢ØñÕ8{gÈÑ Úš¿±o·:T:ì¹ê#x‡Í>Ú¿?¬K^Ã>½ÑK¥'†¶U‡ò{bðz/Pö|&½Bågw]Ò jDÍÝ£%¯äBD€k’WÉf|ÀÀò;ÖWEŒ¥Ûž%ôçÿøOHáòÍú2ÈOæ6’õ;aøü#ø >á§¼;iÊ/na”Vä Æ&9ÛyêÝØ$qœIþL“j–ÀÄeÀIá n«F¯ áëõÒ­‹>)¹$<—àû¢ŠHU-†;ÚJß$ö)k/-œèÄ‹¥–Ã`Ç"ÕŒn]}BÙ‘#d_»uYp„ƒPëdhG„0@^xTȼƒµù³¿^ºø‹¾’Å`ˆüÍÔnÙ™»f÷&È>u{X!ïCÝÖH"T{f¼ÅÔ²;Ÿº_ÕÑÌ î‘.M™ê—œZ²¶Ã4›?Öt1Ð]¶&›<µ+Q*h¢wpsñÆ_·'raµªí{7Œzûð/$*Å|~±ŽÁF¿ !Xf0cü æš8fŽç\Æg\$²e;CÃO3À¯Íçj0­çOþgcÜDù0œêÇB…Æ[mc²PàVéCN……ãs؃ éä²op*öªÃ‡oO ÄÐ×çY`o*‡ƒøD®o&ˆøÿ5¥ömØíñ^=êøÿÒ×l¨AàÓ Âš’zj‰?³%zI¯æó$2Flqú‰®4·a4ŒNƤKÇ_~¤øúÊÞ[í³Hò4}§n¢ÑS…—,é§kM ·n¼ïÛ¸-«ÎؼRë¡èÃy&ñŽO ¤†ìµœÝ÷ ó ]DWÄE]'D¡ªR–ûd3µ*2¤œ¼!³£}%+>WÌÊW$`ãßINóǺ¢sç,¶ƒób­-A ‹C‚Y] hî'©#B €Uî@uxGE{à°0é%CÕÿ”fÍS%jŒú=¡¶”:¿™®pv·3é¯rBKí“wÀ/ɬ°ï!NTŸÊõ/Å#oqŽñs›f®¼þÞœxÝ/c'°ãýêÒBw_U7˜ì1:üWßT[8Á¤è7 OÇ>NiÀÏwo Õ:¶²ÊCòeܽùôQqÿ‹¯P"¬7«„jÃ(ýý¶&ùR(ì“1ÿ{ñä#|[4æNìiÔœ¤ßbS4(„‘E~ÿ"PkVK¼Ê«%N±®„²0À0¤à÷ ÈÖBµa»ú [ÂŽîèlî/~N`îGOÒ6CáÐ7U/»å|Ð&8´>‘éŸÁK­²åÈ¡ðÒs‹£ap÷2y¢e—5cã­ºÅæ&öçä^g›®È¹C¹C­ÎDGB­ý-ê‚Z'g0°¨-‚e¿WG×›õgQ¤scÛ ý&³:½Íøâ®¼h’ ÛBáº[kÁK ˆò²ÓÜ/—zÞG1#VÒk¡(!‰lƒÏiÅ“ZÀ¤¥c${ørÒbRF¿îþÁž¦|B•cÛÙs“ùq^§ºžÊ0µàL/¿o“IÔüƒu?`Ä[¹®Ï‹æOã›ñnÝ3^Tøåà˜‡ Ò -®ëçç 6û±ÏáÙ£0ïF|ýÈÖR½L¥IYGžI#i4ß2jŠ´Ïùþ¹˜_ñ§tÌk–á𓞘­\@‘¢qÛL¦æLÉc=²76Z¬õ5°Û)Y>`zÓA{ÌøTÿÊàÂÆwÔHÇ ²_dÆ‚/½mZÜeì¢ç;Ö ¦_‚.{Ò¾¶7ûœv‚7ÄÁòÀ¡P†^øoªäŽ,‘Å 2á=Õ%ãvc <çúˆiKä¶§–>Ñ^å!f‹ÍΪX‰fžx)ݵ´º«xVã@zÇÛèŸL€H›Ù¯UÐ`Œ¡¶ý° éI¹ÛŸîŽØK>Kp&†3B÷’=t1ðʹHÈ,Ò»›0£4GFŒW¥H÷L¾-«Ã(«ЀZ6ã-E7z›§­«åÿÐ9–Uk+eƒŸ“5”•`5è2”3€‚¥-ɾò\àjõu7ÄÂ. ·`6™B®Õå9­+‘dÎ÷#©AócÆuv´ŒÏF¦¡ Êw1ÖÕþèÐruGÈ…©r§4¢lùqÌ"Šø$öšËÄH=®wy #3]êÜl"ó”á]5û …]‡Ýö§ëèž:‰-o]&÷Ôø q³|!⊛ÌuƒFˤ½öä1Þµ ºü¥F}»ê}_*ÆÄ°ÍÚau“mòI¤ ùBd•ý@è‚=/NÈ+ÉÊ#%)í{oê¤îŒÌÿ[~æ '—ƒ~Øþ\e»´@ðÉÜÛ#ØKàΗA‚OMˆ”`K7¸‰v¯á?BfÓ¹Ÿ-Ѩê%mÃÂyq]zÇžkíMäË倳Ú!ñ])X Ùž¤å¥*ו7ÊÓ|ÊLDhÀÀìЋ!Ø1Éh®âñ–Åq©­tGaó}( ®/O_­âÎ$„q`OѾHÁ"Ðì˜ìœ8á«™p ÝT.†;9vSœ8L2$½xãî¶›ŽYÚˆ>L;0ÂI/öó‡:rÐçÁž§jíDì¾lÂí î%ƒ±o•ÐV|_lÌm3­rÆ}Á€£mÆ›ñ[r—)Û3¦i‰ -^Ú†awn€•è‰ õ`è\2#SÍ*ý ø+¯´”¡MZ‘V©Óù|Žy̪(iÿIÀíÝðäÍ©|αíÞ^púз“M!v1(³†L»‹™½Rùd¹ê|Ç´VB«Üeu^Ö\,ºŒ4Ͱ^ßlˆ2׋›ï¯„Q4Ôpõàćî¸ý¹µ¡Ö|*T ÙÂÌ@æ¼øÖùï’;Qs ‘.ýíR‡RºäBÄQrúëì2IÝæ_)EäëùCÕ?QmÇ[¿œM¤€7\ÿ'¢T¾¢xœâ¯¨;p¶èéíL^2SGk{=\ý„ óߤÉ7N‰¿e$.°VæwF?b2ÿ5߬šñË—ìýðªŸÜj8%òØwÉß3}–¢Y^Ó5S¼ƒÃ "ÌS¦+¸p,Ô>òÓ¬v=„·ì.!çð$+¨§ûÛÊÏÏð›RÐFO½J€¦]˜ñ‹•eNoTOk·£o’-®’p§ô Äúdy®ãN ƒb%ÎC¨ $üà+ÿÖ«+ÐB ²W×DK³Òª†ðT--¡ŽôDè~ÅLv)?ÎöÔ7ˆ(l<ŽA8PóãADW›6IÓì:¡ÜŠtENKT«#` ER§öqx#5öm½Ì*¡75¹f®#88ÈÃÒ=‚ý…[’N\QÚxXš?> rñ–Ô0^; ý†(¥³3Þº<áSx´“6Ìö$ ‡°Ë gE±ƒcºeKôPýÀ¨…Ë4OQ'ЈùÑ.íΡֳ¸Ã—˜S¾"ø§®V¼é’ŠQ›ìµa­ºxáælå¶PV6uoº0d°×¼—êgÑ©["(ë4é¡$l~ˆL‹i´-ÁÍ´„‘7ZBL1Âz”ðe>ѵÍY°¸¤äfyµxòÜìõõëd‚¹ð_Yj­tŒäø÷?ý,8”"?Ðþ$IêÝ ÓM†øX $eAêw òBñîdyÆa,;&¶Œ+ÊУÕà„Eñù!aNä›W,ãO߆|ºl°X¨eáÖU¢BªvûÑeWd}<¯¯”Ä%ït‡½EÜ–¹.U˜sôàÕËí‡RÆÖ¾–9¢Y49y†õ+nõ†Áü(Cò%.O¹Œ Í3MÙ¸šaq2žÈóÚèYSiŒì™¡Ì‹ ¹²&OÓQ\H~ àn C¦ÃÝ^ñqÌõõºØÅwë~ú쑟*[ZŽ_ö¶‘OÎM[„žŒ¹®'h %Š„çnA-¨?¢…å@È5¾“YuP³¸ bsbÅ@”Že ®¼Ü˜Œ¦œ»QZÕ"wPKâoU‡0BÇ»JÄÞLÝÈP#ÂŽe úAüî QþÕ‡™’Ìêß7+ëîž<Ž:FI6 š8~a§¿†°FV„$j¸A«™V^õ!s§ëò—‚RßQj{”w/êەΨ_u9 X‹­¦þÊ=5âÇZ#%ÏzL5ÛpGuÓð^”Þ˜ ƶŠ_»¾‚›bèëQy­÷F²Ã÷ÀåÜB,–S¤¾Z2;$¬·Ú£[U ëÚ>µê\üÿôW™½v8gÅÝ^¼>avDÖm@Û;ä ¢ø¨•%Æ®©´¡!£Ì. Õ?'U¢ ès •$‚IùAÝ0…ØùÄÚ€Ga ü|l\/èÞ™óáqiO‘‘Ò¼Eݵ¤ÿVc;[°@þ~Ì©›éøbÙŠO(⤖ò4ì¥|¬_ðDØÅTIð¢É`,ó7Ê>—Â&°…oêZçNÚÍ |½*8ŸF=ú Eñà™ÇÓÍÝÒ¢Îè©¶6ôG4?jM«ƒæÏQ©Ø‡‚ÔÓ¤ çHr ê§|ßEøÂËFÒÓ'Ðy“´’B-‚³f`¡AÇœax}qg÷Ȳyù%}wÁ¾u ‡‚{ÁÚ¯x››p"™ˆ'Š~Ϧ®Bb¼ Û~ˆš;dãa‹£—¼–*ß{ñR¾ƒóID·°9wUD?µ¶ßÛâ~~Jª·›c^¹Qþ¤á\ÃW gLŽ$ìam]À^5óã–ÖÂêu‚i¯á¸Qδö&ƒdÁåè–"1§u`&`6ó©ÿØæO• û‰$mt ì™»&…iÌgV:"ÝÞòæ¬ Ï¡¸{mšu¦ÞY22¿ÍíQUŸ6ôãBŽÖ%àh 9!Ìóc¼@Z{Š˜-h%FêY,yÍð—W‰DrgfQÓÊN°3ÒE~¶$)jk‘!úèû9bmÜ ¤xÝÎk3½ˆm#[~úô±á¹.µ9â ¯^NÇŠøÕQ×!ϴ댵·ÌD²Ãf¸óåZóúÔñ¶Œb‡/Z.Åî3JÑü <•cçœ}ãß§Þ—‘ŽÂÔ$ e¡Éðè>B¢Ç6Š´éÁµÓö’ÂF|l™L_ lgŸ³ŸØlId^†(ß„m]k™Voj{HÚwÙ#¤†æ¦…çØjÚ¼Ýë–¸GÃþ¤Â ìðE¯7œÉîÌP§ývë=¨ Þ±&¶%MœÚ^.2‰fÞôN:ܦYFÑÓèÔ‘ŒÍ`·'¨ÚÉ :OëqrcÏ*6»S&t•¿ÐUÈâ=}å£4NÖdáš´‰6«²ð²¾·1y_½l‰Š\ÆÚŠDð'¡-Õ,|&ßA˜ ic Š*}ŸÎi!ÄUfܸ¢H¹? ‚„Ÿ5©¼÷ÈÙS •upÞÆ¯Úø™½#޼mI\¨(N˃¸?Ëð‚©i«h]N1çD¡Ã}‹¿Y Z G¹»fýTJ‘¤ƒ­IÑg[‹Œ¡`é 2ô‹RœDmÍëÝ:²…‡\Þì'ràvŽú°ô¥È¹¼$‘߯8‹À0ºSö°uÜ›1cÀP;TŽ/7à énGd_y»g‡Ôcà·C¸N 26Ä$K༥\δ'¶Îøï'z>y3NͶ0—¹#Ë­fÂi¾ñö룙˜ÚHå¦QZg¸­‘dv—%”4¶•" ~töÐOýhäÛ.Ñ~©µ§ÝgeÇO'!gn_Ib^oj‘ÖÏW8]—éøº^‚'˜˜É²¡jƒ…^¡¬½PȰñò~)Ë)ðïð“ªj­Üqý±©›Wh4Š$ ò=3Ý%€ßAì9#©”ÀKY €Ù§$ÇS¨.þ™Ï=¤ä™5”Y1Âey¾r)cëÖ! PG*2G<ä9˜ØþívÙ>€BE¡.Þ>—X¾õ#O~î S•¼ù”¿¸(þp¢8]Ë Út`üNuªxÆ#õç講“`‚¸+BmøG}‹éVÛ0ºÒ¥¼?+UïÜC¡zÝ9æÔjzŠKE‘ùH¤®ÝŠò¼`Í݉»XÁRå8òñjœy[]ºí‹'>‰’Á]WÒÎé–¯X ƒÒ»‡a÷R0üaPúÉzI¤*ŒÅ70GÈ2.^Fˆí&”ËHbÓi£Ø±ÃLÃÿþŸùÇ”)ÞÌŒ¾‹D;%óB–üÛkú9Z:{G$·Æ$¹ C)?º×XÌ„a°µÓÕisœŒFÄ;)–FTwýÁð-—°Œ± ÝÄ4!1D†”öI+;µ¦žá3g\ì ÃÁ–ígKí×B˜G]à”Í€[¢¼ QÀçü£ò´ÅŸáC†=º|CPú8Ê…;ñvûÝ<ÌóQÇσ~÷:ŸÆM’ºçñdCqçC8&òÓÇ6Í`…$Úáœ9v»ót¿zØÃR B`ñÒ¸ªr%׌Q;\Ûow›ðÃ%—­ÈmAý|”¤‹îÈñÚt‡‡¢©nžªÙQþ*°7é?ç€Ù ì1˜P–¥Ê±œ/"<{¯ôšV¾ÛX^/¸­2šéÔ­B5`ªÌ|Hžó:AïÀ4¼7Κ"ü@˜Šö»Ý{—Ѽ«¿lŸ­Ý¾‹PèÆê͸¿f¿¦¦üã%ûÉá§úŸIªÞë*Å–£Œ2Âñ•¨0ÎßÈ«4;_5•LW{¡F“°| µñú[êI+#G d1í÷îcè&÷XŸJ"hçÀ'¦œCÄ`ñaÆvXG™eà£SõýýëèÓÿ±}½B†úÛ—mÃiM Q\ÐzÈ4ÖE£GC4æÏûͦýK°+V›çÎD~êê²fm’ ¦ö„¯ÉG6z>e¯;¡ðÀ»mLåï¸+©U+b‡îôáFÇw]Ã1¹Ð04‘XM,Ÿ/ò'D hŽ€ñµ¤Ð#¬Jwƒ+A–E@+—½‰fxÑuB8¤Ÿ’4Ö¾9- ûøóýÁŽraLG tòÄ ‡©âN–Õ<Æ sVÏ´f76P¯9àa1¾ò6ÈÇò¯!x·ÜFaWý€ñýƒXd>ÐRáf<ÎmÔ²¹7Ÿ@œïº †3ˆ`ÏÎ`XR Å_3^Å9Qgxtí<-/³RXdÚW6àÉ©À¿#rÆÙq‡VŠãü^Ðl8¨ÜHzïÉ^èa$Ô>_ °¡~þtÃc¡ˆ9û)îQÛÈHø†öHr"¦ŽsxSÜëòÓ?@#¶Ð-µ¯*N’æÊúV…ëº m0C¸€åš”@¨¹‡7½\ â)’K'®sÌóöópÌ\L‰SèµÀ”Ðy]ÅŸ–SJ›ÈïÈ`í]>øW£róv¾¡×`ßû‡¬j‚—Ï¥ŸƒNô´2¼öM‰¹Í|]©4½„0 / VðŒ¹û‚Ÿ|ˆŽ‚&ØÛ'¿%|ûÏÝ;Œ}{—5þojS„µðx;hã‰+ó‚Ь“,3]¨HÒ)ª¤dÄ÷ïßîÕF^óJÐNø#]“&:¥~¹˜5­ªÃ¨Z†xê±è®ß綉ö.ÉWCÖffˆÃøÈ1+α¯Ù’®œå·¾Î:4_{å¦éÇÉ‹ºœË…ûa‡ \Û \,óE(ã»d¯âIÀžEYODÊõrAãäÑF”%ÚÚ±z(RãµDlE/8\ùr¤c,§À‹3¥I¯œÌZ­îÜQ ±{æ"kĉ0®Äîßm¼¸>äóÆèïÚi2ª;›îÐSijŠŸÃms>r»³›í™ÐÛÖ<#5wì>A­º«¶[Œ“CîÅKè•÷˜|XØš ó]DõIU x²å(Œ´jIåLñOTîì(Q¤ÙzÀuï»{‚ðõA¨‡‰^Œ`ŒA›Ky ;‰[¹yó–Ò“;O>|þ²²ò’‡Y¤`¼z¿‚t¦ô(Y*<™i¬»º†‚n{p6ߨ[ZÏ{ß³ …ê¾v‰l!Àe¼ U£Ž!:Ó?Ø•t·?gU¢Ì«]ÌO›ê®wàÌÅžŒ4e]£Áºk¤áoà˜6^ ´!ËÉòŒì»~O!òVqèp”Å"åt¥Bþöª¨‘O„a<=¿ÆáØ—5?å©§sLúx>„”kŸç-1¤R™RíY€G ÃÌ¿XNF;?ÐÁ3•tojÝ3«û~¬¼NÈ1}@ÄÜ¿-Ñë'+wœ¦v¤g%d¯ó_¼©H jÚáb¶~ùýzD•´/ÈñjJYï~ïZj±…¥5Î0 (‡d× hžTëD±õ,Œš\[õ{´•:†–JLv‹6–žJiÚYYè*«Ïµ¥¼#ª™äĵ”D™S0ÅCŒ}Û ­…¶þµ;=7÷05 â:zòÿ"¾Ÿs²»»/ü=¤ýSÇT¥³e²¥EWº¾í2.—g%¬Ý} Z:bxÁõÈþÓ=÷y Ïž={ä=÷( ¯Tú}­‰¡7gAs©…˜|5DÆIx>w{}lºžAúo ‰w@ýüäõ ¼ÑL")fWÔÇà ›UbuA½jÉ—ˆOå8ß‘c…ÆL ª§¼‡Þ"øw^”öYõz«’(LnùšÔ€î=ÀÁhd³*WÛc\®Í>:‹¨^·ZK,†%ìÄ,wx4P)— Õœ0u¢óñ!Çš©Âš. y9¾¦éwÝ…pœìÉ*,ñ,¸‹›„DˆmÙ½¹ª˜ñ ªµŽн'‰¿æ’ZÅ×åÎû¨?1”¨7FÕÝHð»WÏúüNýç^@S€@þ/™Š ¾2jµA±–nJØüÙAårMz€Žü1VÄö”9á¨ÎFP/,^ÊÐ?æD¶/(ú¢‘‘Æî !®æŒ,1° ·þÄq¶ž Ý‹9bœƒ3ô¨ìâ¿0â*àJAÀ¯\ê.ˆLØh°D”.ˆ³¸§Ò‹š?ž™ð¼*ÀÞ Žfö±@qè“”{›Ë¦HdßùJ+sZÙZ†æ ÖHZñº˜Ðµ÷¸. Ô DÈTxŽ×˜ÆñÝ Ðç>KFÔ°…& ¹:Ó¦/ô¡hõ˜Ö­Œ¢9UyÉü)ÒÜZåÿ—©8j“à¯ÿ™«=w6Ðù³ƒ&oZš÷§iÑÍ×Ï5o6êVY?ì¾U§ ¤\°·ÙºPÔr#8WX½¨ò/ÀŸzA7¯·–Ô0J—9×3ª#‡ 餙Hzq[êµ²?èyúG7i  FïËIfŠÙÆÿZ͸<ÐÐ|,]öÀÇ7 "ØŒ6¢ŠœCxÅ™ ÃÍ6Ï—‚wÃ=̬ŽÖ#ÈïÆÑ ë‡÷»?gá߯<Ý?èá&•½y¯_|ÜríS›Â }@FÛCÄ TûÐû¦²ö$<°40WÊbr»09ôÍŒkUP6`íXê³{ OÎÛO”E‡ƒ~,GNÌÒ.¤x”¬æ2¬­=­Ü}(X´Fªr"Pf裺ý¦!ÞKº!üfÒ YE~í¶Gó # }j%‰ih}ÍI„^ásTî¨Nú³MÉ“²Ùmå –mŽ ukT5ª‡lîÏs¿g«;GKÆr6Ó'§6¤‹*eÔ­Ä» ^–$?Z}â!›„ B²§¼ËQlRìk ?v“×Û$âQ6íMÁ¥\¿,5§¹ä";A u&e4BC6¾E ҅ܬÎ3×,ÃßÃnâÉù•ÇKÅö7õDgw%i:qb{Çÿ}åqò;û4iEþ‡ AKñA#2f3Ƹ‡Ò)_“¤ö±Ëû~ùN˜Æþ>E‰¸KŸ}&²"è;>oäJdaiÎßa6ÏAÇåêøÍlŒ~D],:ŠYù†¯ˆ2ƒ8<ý¨9øÛÿpb]”Ú&ÜÄïà…©îŠ#ž©¶®C,bÙOJba»¼:ýª+sëAB’àN€|—E(ô§¯§Mw­O®Ÿ%<~Çn¢J /©b2ûƒ6e£˜¡UñÝ2é_ ;h4ÅÚ³§,Ú¿¸?0üá¨yeãNáÁtÒ-a°9E?•ÿý‡5Gêy¨ul‹9`½!-ü+ИJèø¯ÏÑ"ù¬Nìéà¦ÜiF^^úÈI;•Øöçíyoÿ¾ý4-^ªIê8t„xÊ/kzŒècrœ—y忞²Œ+U žTt¶é±¨&Äün &Á •ûòMJXÈ(öµœªËÄÛËõ‚N)që~Ч»°æÎìo˜×PþØ o"_7+\Dr"ahÙKKÙݸ»è]®¿Ú7Q˜ð²®/²Ç÷‚Å,ÙŒ®²pÒGŠF§±0ÿý<ÚÕ5føüäí)̤ÿX×aî ”¸+å 'õHc2ý÷í=ª³cÆ]ú­Ä'5ô©`YùN2f[ n|¦ZžŒ†Ú&!dÐ >·Çnµ»±èŠãfá³cÁÞvºW’¦Žu¡Õrdx8)ýz˜Pû¥çaÕG²?“¥) §úxàÏe*"ü³•ÙìM|l!1í<è[vÜ.¯Qò¨¨_|Ùù5Góš¦f Úêþ™Åà‚Œ"”¼ô±êœ*ûn%;›%ü2¬ÄŸ·PUråÞò¤ËJ ¶P4cL'Р3a!ë}š7iRãk‡x†c j õ ±øÐÒÆ J³vÒò^nŽåY݆e‰šg³|wc?™Æ!…ŽÌJíö­SÉ»HÑþÄ–¡,u µÂwi'Ä»62ìÀx;ÖAÔwiø¬ƒUý¯˜†ûIþùoKy7{ß)@ò¬²ÕsZŸvÞxYÄ7ÃáæjW5è—×áÕïñÙCj`Õ–bvÀ%ÆüŠô=-ϯ=5Øéökœ¤®"¾ #¨ƒq¼2}3ì*u«âí+V*¡ÑnA¾tcÖ¥Ó/L‚ x§þrÁ;Jhþ”~ëák\³"ª ËÑšéÀîs€ŸÁÕ°j5wî~Rî ÿ¾Èóõþ—1)>n¾‚;uŸ­ êÎ)ˆ!»t.¨­hÅ›æy‘âÖÓD4¹^_ÿð—Ôp·~è|e(q_N‘ §;N€tVt(okÝ»5‘³•>!ÉÝûeTlÖbp"NrmA1q ¨7ÝPNþ®; ‚KƒÔ`OךË;ó¼(SÚ©_D²ß£¯B #ÅɤÆGW±éÈ:©êƒ×5»ÒVÚ²˜ ö€À<àîúÊ~²ƒ §&—iˆ5yߘT’‚gÔŸ ãj 뉣ªŠAcÉþÿ? •ñÓ-´ö÷»g}¯Ê¹ŒÐèõìÏʰ7Œ—‘öx“ϸy™¥kn=%0ü½Ti.{[Ô-$ÞÃÏ£(Z§°„@»µWʶlM‰4.ˆËé&¦êÖ2Û¨±´ä¿é¢ð]î¾#ñE§ m:‡È[Û‘¢GY¢²0‰ªy™Ó *ÂmcŠ2‡L\ ScmÛ1[árïž;g3 5. êªßV?yzµ¨·ÁX0iéCØÑgÈÈùÁÓüè&~È­&kû#¾©“Ñj¨ ÍUám{F¾$ƒ_íÕœC¹rÅž@uÁçºL±ö~èú´æö–«™æý<ÿKT^û÷Dóú¾AAÏŽ*9÷Ÿ‘ÆÊª-² ÇÁ(«0YQ»Q¥J2†R™ý•Ñ‹`Eƒ ¨‹µö>5ÛŲáùYzK :L$À%èñTÉ(µïðÌ]¡RG*!Š4Jšî¬ä)XWÁôÖÚúïR• ½¥-g3¨zƒ¾ÛŒÏl‘î“Ñ/ÑLO}vp«(Þ±?¥7ŒÚ9ö(ñ½œÀµ¼Öª<|58ÖÛï·ÛážÎ6Kzz>"u-V‡ ¨ƒª§¼³L¾cóAݧÜ' j»ÿdlxÐ||š¯w…Šr3i$Q/¨?‘îÅö{%%ö¹æ£Lèb®ƒ·£âÕ¾ycÓ¼çY8t-ÿ…<í ž&·$ Þ „:ðÀ ©—ö4ëœÜYTI¨¬*˜ Û=6JÆz¤kï²æßÖVq-µ5¹z:ùo›eG«ô<¸¡Ô´{äΫ¶¼e–óƒ‰ÛiþhÈÁô†&K]ØçF¬Ã¿++-q¿á}|Æa<ÔRÏ…í÷Ká¨Q7~ûLŸuŸg<À:?ˆÓ™ÕÂÙ²·Ëw ’]‘òáÔLw÷ÌWØ—×b`$!Ã]¦Ây£‘x\*³ë¬3U¶aؤ€ãNqüZÜûjËîGT­ZFGÏ:<Üžñikz‰•z·c¯‚ŽŸËínS¯vh‘ø|èÁJ2þ‰C§NÆá¾o§›õBÜÐ@»Ïv}ë-TÚa!±î7Eê_ x ™‘þD§Y¾ Mÿ~GĬáÔøù-¢‘xFF­s—ƒ5ò÷Å9;ÍÃG<—c³òwHU ó£ÐµÃíI) ÜÌú.oVjÔœkµqÀ Bâ.ó:ô•\@Cá_àaŒ³®B ±Qcoóª‹[0±Á&©K4Izûø²’Çbqãܯ`³[ӞƫŒ;0ûÃÊ:²ÙoÊD ©ÏÙåèÝ÷{`&á%ÉõÞN‰' Çœmã«ê &àY“ ƒk¨KÕE¯Ôÿž¹ bÏù£ÒPŒóÉ[µò£É„P2*¬„:)Öb)âѼ×[+Ý•.-‚‰Ï[¾–±jÈ0˜L…!ö±éUîÒaÔN*ÛpijÛj_Tœ)'Ä‹Fq,É×éáá™= þJónæsn„D,Cí¢•‰ìÊ’Yk~$±O–²þ¶LY.½”‹óuœüa–î ea+l)ÚÜô—¾,Èé0 Ù=æ —K†ŽZææ&ª¨[@’,º×£ù–t.—Ì`šÆ yöøf<‡ «qÇüH©‰·QvÞ‚~òãßÞAQì t†ˆ˜Yײºô<,7Á®à3ˆ3òòLD¥=fU»\}Z3%¥¾ª·oM?€[kç¸5ÍHžÉ_»¿î·Ý—ú= F迌W‘dó~a*¬(Õ}Õ#¹ñÆœß:F¶,c„}ñ™×åk*aïÈj•x‰¤Š7ÅÅ :'Öò*µY×qùºƒ>ðfJ§5¦¨wŒ+ì¹âuéŸË‘°Ná91¶Oö˜Š”ŸõùÍ¥ž“2b‹èi|'™gu¶˜°BÞF¸*¤h¬\,"´ÝÎOz¼ ãî7> -@UÅ­´ø| \sá6}±äH»Øb J,ý©Ÿ¢Â>,KûºYÅÊOiÔŽ•9R ¤6JCµ†*;äá/-v Ì»›'ÔdQ gM%ªø´‚ Z -dáÆ4)Aâ|wÐiü:›EP`Ûìñ#^>L‘X Jpš²×ŒúqŠÖ'ÈÂqÊ÷G.b#Ù èâ“G£‹¯ŠèMm¹Ñ™™ÂåôÁζ4í]®x$®} ‘ÏÁ=ÞÉÖI’Pqyuæ>dÌ”çŒÖ‹î¿i—¥ñÝ{7iCCs_vª|m˜ôjPÿ'Gº –(ø@Þ»‚c³ßJú(Ó7øR}šùNfZµW†òI ’){é†Cô9¤9Ò11_ˆl¸ÐTO9bäßž0 h}‡^t?Z–’Ôb‚Aze]i G?¬k\þÓGËÓ{ {Î>_“„fÿyk˜KHÙ%Û$}?FìµÙ¼Üœ…Ñ©¦Ï´j,ä9ê¼µ–X‡¦ý- NKUõn ð>í]ý6E?‚«ÔÆm^»_»3:¯#ŒÒ¥)¦IAfRÿÖrÃsU›í]GÌí. t‚VšÃÈŸ?.©™·# MAò‹j|Ì}™Y¦ò¶³ª;ìYúÇz=Þ£ÊHзzâ¨ÔiæB[>´ÝÇÂKçHSPò„pöÚÖÁÛ»_%ÆwC©Õ.DY„qÉs<ŒÐÄ0ÑgU~2iXeŠóÈSwé ¦« KòÞš8_*Mn±•É€–ThN3KÛh#x³Îb6gå¯Ëuj6dÌhŠràÍ?ÊjIÇ׊Sk%m&´‹ÄcHҸfp•Ÿ) Œ€Ô îø0ƒ\þ—t]Ö2æ9×/dêxÏÛŠé.O†Üž– ãµ³Ôÿî‚åk"JKë¼;Ø€Hôíåô’t¡%½`¬7`ìêÈòõÞ¼ˆ817Û¡Í£8‡Sža oåŘӮÞá“Ø-5¯¢&õÒ&nÌÛ¦fƒv*V8A6Q7gvø+6ÀUav¼mm< s—,Ãw‹Ë¦CMÜ‹O¯<ú%|¤œ½cÆjÅ&Šu $š›¶ØŽ;þ¿ï+kÜ2ˆºcÐöÖ `º­Ð„>Ì~ )?¯¾«TÀ›«²2y œ(¼r(Ķ–Ýäû7 (môyr?d2+¨»¶7Öéƒ[lXùÌCáç»+v(x]õ 9 ÀÒÓºÁ­{°Üfkß‚EDïb¸8M$ýH„-¾ËÆç¡‚ÆÜ>–4í¼$°ü¦?äð¨Û”Ç~Q™I±¸D¯:öÏzâE1 &>'ö%UÍ0$Á÷$ØxÌ ˆýƒú^äi: ê”χ'ÀËÑe>ÆiŒ⨪¡í‘1†7û­êÚV@¥!¸5•Bêµ4¨ÌÀ”V%¼Œ¡aârP‚Ð%Phéô:‚í©9v)†é5Ó:è6XC™7¶DµÛöa èù# ’ú™ ̇FÒ[[{ßÔwù½0¬eÐû½Jßß’‰7ÝÃî˜**ÌE:°Î$ÒZ†)‡#*‹Isêq‹Ch*‡Â‹³™ýŒ¬Ù 4¼aÞ€b"ŸTè·%¹:+©”èŸ gYÛGúI“ ÆÓ—DèCãÉ©Øj² u¹ui¾LTrlrx™ÆI´XŽ9PìX2ïçrȲˆÜDûšQ'—Xg—·¨—&HÇ?™ˆ>ÇÕýKz•¦öù’³z¢Må„â¾Ýûb=]›=p}§æ`õ—‡Š<ÊN«ÿ ÷=i±¬ÂÇœœ´M…Ïâ—æ=3Œhj…ú¨m3º›~Ò_i®šb¤=’^›¿8ãH®w—¨WN6ó9†ÿ}"×Z°#¹ÄY”¯m-paŒžã̆¿õ¶‚&Ô§’·ÑÈ=瀧Ž5FØæg@WA*¼tŸoÀ9®yì(òÒÞXôwµI¦}t«;¿Ž¼ õ«Ñ"ÊÄF±|sp´ÙÁ>tµZ 5j79W©©DdŸ¯vÒb:†ƒuŽ §×¨Þ;fR[3(CÕË ¨›5sèyŒ;~m¼{KvëcæmÕ‹+WŠá',È+ÛLçví~^ DO!½±HxV®Év ߤ„·Æ{è¿ÜfΦysÛuƒ…Š›•‡Óå_'$«`à!ƒc-w¡Â]”³Q¾}`ƒ'—(²¸:ÛíWŒqJ•0xë@ NôƉ–¬à—Öx»(IÓÌÅõÑž`R˜8L).Ý·Åq‰•Q rͯ<\غ;íYK‡C,“A-*₪î±Ë œ¯éô;…+˜í͹ÓD¸a<@ÑÇ`Ì;èƒ×¤‚èl¬½UÄUž¡)ê|ín¿<«yo­ÑŒ‡äú• {úç+焹è—uKíÿµ~AíYzüe¦TÉûkîµrÒä™e:”‘Vü Ÿ%†€4~Ê ¶€±'Â;Ë—á’G.vÐ{¾µD\:,äô‚ÉZè‹xôž0‡€¸”xèò‹ÀmxäçÜ•0P QÝÏÃp{CùÝš™£þÎZ¢Pp{VÀ’jS¹8½›£Žj”•ö#ã­rI¸('q÷iï¡÷MåvlI‹ß²DÃ>d~Ë}(»š'èÜcîð µÀ $jL¦¿£”µ†|#[Zêh95¸mI¬¤g…PÔ01 (e>ÙÛ¼ç©1 àHLŠE<Íþ >5’„Qµúä‹ùÝH6NÎ…r3Oþù§` ý¦§‘,W#kùÿ•õc˜Ú#jsa°½r &ª•Ÿ|l׸ Q›Áä!HÞý…Sé“ê9ª™r.¬% ÷¶vÈ"3#ÈWD%'qU:Ðüx!]Ma0ÏpÎ}›ÀcÊ7Cl:3›F!qjÎr³Æ€÷*–"–ÐùõМfÉvà±38‘ë•°™ŽÏhA¿E?”L€‹¥À9TÎV7ʦÊA`tn=ŸRäBJ\ ™ô9c“^Í?Úž¸ð~ßœaŽHâuÛíÞ¬_Xl¿ÅØ:™ÐY«Ð*Rtû §ŽQ±ÊáXó _rz9Ë˳ ðŠ­9ùà/MÂKs5B?Ôá/˜å°¬ÉuêY bîÔ” 6•¾ú*üpxЭÅêÒ§YâWüªÑ¨+êÆ–O6bM_—ê®[N®+ˆå ‚ÌÅõ¨–;þ‘·ð™q­Ýö†34²µ,XSÜ=8B»Îj48ëýdAßsG[;8À«™ &LmƒË4u áÏ•Ìê4¢Öó´–¡B”Kb`>Ö?x €æçÿÎÀõ¦Ð…R Yg[‰€µ¼ÝÓ`=UËñI4øå9ÈG¶|\ŽŠê$»7Ïí(p›Hx¾sVIrÖê¢ÌþÖ-E—-âì_)}ÀªìÂD6•ˆch[Åß㋟ÇÐhuX¸-å×ø‚A¯ÔP}á9A‘X´$ô#¬} =–òåVSxãbET¥£Ék<9#߸ý,Þç†Ò˜°³;±*»`J aèåç™Ý¡a8_OÍ#ì=‹mÙ§ïvëå®E•yóÇ|¢Ë‘§¼£Ïµ…«Ï}S»õcÎZÌ­Dñ-)ŒøK|Gê0lØS1kGAXгL¾©&‰Óè,b*…2% %4ÚÒ{ÙYs‹OF®óã嵪µØß¹SnF-«H“¿ Ïìû!J¦ŠF}f?­2T-¥I?ÛgC3°5DjŠƒš~u‰uf³ƒõ#²:`gž[î|ªõX¥$­ «åZmPôPJ)þà1žó¼VBµEö•¤{’GcÔŽÆP#âq• gV—È7‡Í¢£ã^9É!…e§~rLQ—œ¬«þ3TÝ8eˆU[aNþÕ¾ñ»ÿŸd´Þ&/kySp4„¡J¶ã Ò¤¼ FÕÙºqæºÉñ–Èè+q™aDUöåT9’Ö“E_ᡲ¡ŠÐjmv;Ÿ1p ÿ´¹yœ? °sz)ð/Q`µ3Ï>Aµ«'¿V Çžv'_X)±ÌØPóÌfß9‰MK‚7bRlθVr«·qÈh¼Ó‹ðjŽPpÅeØ+:“¾×–U†8Ûm-ÿ÷¹‹44ORìá+Å2ŒìŒ†y&œ1ú[Xíü»k©g¹%k»Ù3VRÂdõÁ:²Ö¡rTdu5ÏÅ©ÓшÒ]¦l.p’©Ê¬XÔù²¿ßQv8ѹJ»¤v.çÛž0šå­%+f>j\”“çÅ©a²7Éhˆ»ÉÅèùÕ Ó¨o2S”ø¢” `œ-‰§õ¬˜ViÍó‡Ôƒmàþ®ƒÓ{rÜ›Ux¾… ±GZ׺!0MªIæŽÏWfïÏ!ÓC›È^ÕgûWû´©YÙ2Æý‘*BfOäHv"îfÀnNFâmSI¨µ÷ùq©€#7b[ƒ+lªÐJ²2ʺr½’˜`ˆð¼`NàÒ¯Ö,0ì\þÖ¿}(zÅ­y«MgÀ6£ü–ûrKONfR!Ïçÿ$ÆÂ³zs0 Íѳr||)Ë"Šv•2{—©ûÍ :š¨¥3ÍÎKà}ÔñÝyJ > ¹]Äy¼ù³Ëääêï3žâP9k|ëf¥HC š48(Clí„){š·ªjß³`.ü^¶ßïß«í€ Ø`_Z8v¬Ò¢-Wò©Ÿ\B±Ñ6…5-˜B:•ßÑØˆê÷ƒ¥Cì]Ì·)¿ò–3Ó{`^9ýø+J°¡|.óùf>Ø÷ÜïϺ¤£kLèo+ò7½†`2÷¤”¦[µëÞ(˜éðžÔŽú±ân³3¾º­]¡ßbš(åntöÜ0µ¹"âØ,žNÀï]⎞ƒ/ä!µ`HP8ê­,¢|€ÝIi¹7È<¬±CÅ_Î^o((Å×ãZæ/,{÷¿–Š'ÑÌ{a‚ØÜf[ª^eÝ´‡kGkx½µð„Ñ;ôê:_`L)Þ ”žÒ—í˜tÀ{‹§“¯—Â9ÞÚ%zÒ0€óĤ¹·PU»H€ 桬¬¬¥$&¿ñNþ=ø Ç4Tª“&“Q©D,Ü ìQÃi$ ê1}Ü  Â2ñ(÷…,=IMàâ›a”3ö»=Éni;éXsr85ÆÀÄá«Ê6›3²úëe“%z™(¨­?D‹AVyäD#߉Òöȶ¿H`¹aùjÂMÇ}l£Ù¸h—cÏ vļÂ&IB‚SM2œÀ!i¢/ÐuÈ«1½˜—Š·)ËÙ¡™i£”‘¤Ö£)†ÜöîõRJ×Ë ±õbº÷,—]d&hTP¡œòxÁ0JwBñŽQ¥Ù5çHP ÄF½´—;ä…“H™zø{´ÓèX ¹ÃÓ[pf¥ð)áþÉ›ÂõÙz …¢Ô:Y3à±âÇ1‘£zv´ºÛN5~¸»p,ô;¸þ#ž¤uƒfÑØÜȸÀiß©rðœœ2¢Â/ï¡ÓTu,½ü2¢Õa½æCÚplÛ¸àÎ+xªÉÕ&>iÆpR"A¬ÚG,*m(ØÊBË…â,9gL¨Þ:Ûzù3ä©8³/"Z½`-S–*6˜Ð$í÷Š %n¯ºÓþØo®/XÁÔÄ#{KU‡÷öÓ"]¯í±ë@m”²_~à"òÊJ8¹â|çûqaàÊõ¿ž›UûëCŸXë“TPi>}—t­¹ž`—,O›¬Ú §ƒ vf9¹Ê´<çÒ°kAuˆ?j äL(ˆ ¿ýiW{MeZJ]¥pTÑûø<ü±óMYmÌWGY¼£­úœYÎys¯ó‚FF“ ÙÁ9Uê¬qÈùÏ›PË8ð^Ëæõ@¡,Š~ú¼µ¾XîÞp‚D&±"ÿxʼ_EBÓa: í+^|ã+\ÙÀ°]ixËwk$´úY&H-*¼í§ø¼ç‘$Bñ\}A)›Zk1+ RH[ÇÐØ«¥n/ûŽÉBšÁFa‡ÄÁôõ ”k†JàÆ³{¤$‰<¤Ä5o þš}ÛÄé4úÏ«÷ßù=£±…t—g"ä}N×ç¼\Ü‹߉Oî>{f†íÏHÖ*áÇåt˃Oüþl˜[û}T Oò/¢JùÓ£ßô‘A)w?B7Üë£O#Àe¶ž­©®·ü½ù#\Ëzb˜ÂÕÓ7©uX>šÏ 3Nöª+Ó5(3T»´PJŽ‹$_F…r»¤ø‹¿-Û6òþ˪KŒ5ZÀ®ä©ÆÒþç_v°ÌÌ ,ªüç;a>׬h/)Ÿ´î|¿MVÚð© ¼@Ñ„‡ºzjÝÍ>GOBÍÿ™+ ¡ÖÐrRòƒsÅQ>1Î,ÅÛǬtßÿJ…–A.aäè ÅȬ¶ "ÕŒ¬ž´Ð—„Y í;n’/âŒkؘµJhÈ÷Ô(@‰„‘3çø¬@0+2âv’›$¨.8ÖG†ÙS,»…ûVްǤ×dbe³7͉2|U܆€x„ãÖ×2OýŠòƒNgƒõ|á/úíÈÞÏÇ!¶‰=+cuJÔ‹ ²¨C*¬œ'ø–-ØtOÅÞDÓÎÉ1véü¹;yÏ+ã»ÜâÏÌá1„(3-FX³"tǤ]”„yj¯¹q”Q&>ÔÓÄÄ·ÒuH„lg°.õ ôOÂ8$-Ïÿ!­¬„ŠA¥<+ZÔãLQÝï¼;ƒ-B9åï_*4Ïõä°Ï\â‚ yÞ|€Äþð7Ñ^•„X3­(+Íz'™ÔR7·B•Ê)üi8xú°ËsÛD-ˆðXxTrÕioc=ð­µW%å,û$脽bNœ h¸Ú:aH5¸þá ãƒ×0ÖÉc[ÄŠã¿JÖ Ê´}JZ˜­Ö—ÃÈ.í±¸ TÜîìš$þ;¿º÷Ds¶èw¦õMEp•Ö*…Ûþ&¾÷ú>º„ËÝfŸm9mÌ®`µz¼Å<¾9¼@Ëñ¦êYµÁìòéâ¹öÈÚùPt‰òMO»'’ÃÓN/ˆœiKvé-úbÒ¤06½+†5§Saª‚ oó~IM¤n&Ã4 ¾ú'S:ç¥PÓN¶0¨mVýzÛe±4¨¯Lkòh{ÐP¤|Tì1µ ôÛ¼  ãOY³—Eo›¾%0†† æ÷3—­„´Ût}Ý!M¤à0œœÎ2°õÉ}Ø llZ+]‰Bƒ°l¯A\ëiÔ$xRFàNªCdë‹á¶[wž‚C¯b¾Ð”àWí9"ª%S£‰&!ÀÓ\>„– þcv¹`®ICž_÷»Žb!>i=ÿ8¸ªÊ øTæõ< ·?5½5²)$Óƒ˜þyœý×áš?¦Wá^ê­Ryï¡AW‡ròm à9ÌÍñ?€ˆ ˜öä ãû㦊ÿ@3•¼Ÿ¸Ã•MùŽ ŠõdçΆÊXp’Eê9»U8ý n†ltÞ…½rZRÿºîn$÷uú [–j¾bÑ æ †„6©}üÕ*í÷ì² æ;–‘sE!ê©6n¿úyeÍqŽeüvïP¸•Vš7wyW¯¢JŒ»¤ý$¤¡Iþo ^Lcb ÆýŠŠh˜¯3×?Ó¸T©Àih©Ø7uΉƒ1ýwç}Mª«é¾úHU?øtIýIз qFš”š=sßO´CÐÔ°+7, ¦«TícvöPz¼’µƒ‘»â¢‡ô~Ê$᢬bi…¡0È»òk=Ò[ƒ‡\, Dyî{w›Gû» „HÂøQ¬ø,—ù°mz“¹^Û³ˆ<˜q‰)7ÎM¯÷½@ˆ¿-›¹-Ù³ä3ù IW²{5À‘Îî‚Ô 6QB.,Sƒ7þЦ@LÍÈ|Ä—¼ª“iÈk,eI„d“/A™TIÞKoN0Ô“ ‘“ÑA +ît~.yÖpD>˜å¢pˆk[n~d°sé2ç¬k80ÛR¬ÐÞ´˜áâàsͪÁ #¾áÙŽÒ?y+5ðÝoµè_F§Þ½sÉ÷ÊIýÿÎåøÎ¡’ ì¨jx Ík2·¦\ª©súå]V¯ÔTgt¦B%"ïY8jkgÈ,ƒ¦p¼t¥ÆéŽÉÉñ·¸}½Î½Úmtñ@ŒMÄÞÚ€)åJk"ZH:³7á ¢†uŸéßëáé¢n>xZ‹« 8( ¾ƒsºI½á D‹©µvî*YÐþcs(ê;i¸ïþÎ %‘ܽ7M󪡛\GðŒ¼ëQZÉë3;)À#6CØ[Ø8ÔÂ%‡’ÏHîøWÔŽžGc.käÌÌWö±®Û 9-xì3‰–‘ãcÐm°ƒ ß8"yÅL˜djÍ1î¿S·èçi÷ý*ù‚%l ƒË ªoKWjtuhÊòÙýt’ù-œ {æëºR '"c‘ÜöÌþ<惪N­Är~h×XeVO”bj†‰-òò$ À°žÿL´¼ýe½Oà”|]—d¸Ê<“§À*u%¤¹¤ˆvm7øeê—¾ËßãÛ¿EíØtjƃÓc߇ú­áŒWJ3ÆÑ}?°lh‹#¬6™ð&öhU}‰ñ(<–„ËWÂHw¬’ü+à,×¼wbx ƒò—1¶uÝ<€MªÉ':›y#ô¸˜Ü÷3¹9 ¢ÈCâ¨v-¿Fòi"7,¢J8’ °¦äªB+»£dÖ ‚|•éØåtVþZ߆‹w!'“‡àñ½oC*rF}r|¬ÇGv!Dÿ駉4'œ9’ÊVÏ=Ƨs~µ©²PzÅ;&y>Âé$×ï0L‰ËÂ-äÿMŽÂM545`±­Þá—îcyœ.0©¼ Èç Jl’·E”œÓ‚\gûE~q+•$3 Í0{ý͇M6VóóÕoðà}N\HÉ%K¨î¶™;¯±éÌuDAâ9( îåÂú' $æJجcÝ«œV‘é%¨Ý9ñ%+U÷O;jÁõ§Åð…EçbÁJé2¬à1‰•&¾A¦)H°Ü÷bÚ%õ‹ÉÞ/#û@¡v3ÊüŠÝÜ(ÈŠ°ßŒó ¹e„ÕÅŠôÛkâ!&ç¿ÇîK‹×?vúïf{•>gX6m¥šÀçÙ: ÂÍFfGÊrn¹qœ0 >!†?Ö¶L÷O`·”››ŽÉv ƒg-F Sç·_ˆüqåc`„ l|MÿÇ:xes¿T ·2ÏF÷ë&ܹ›ótÞ$E OÙÖ‘‚íýç­Î0; „ìÈ,4e“ßç}Peóت㹭6HµÜ£='†™²«Ž€v?7XPˆáõî+‚)—±Y…]ç˱ªˆÔôíÿ^NÈFfŠ<à ò vºû>ïÛ\§vogÙ¸õ¡ñ¶ÂLuUmzнˆ‡¢cYd®ó§j)•æ×cÜ­kq=o_Ã_ÆDÛè皪wÅ›±.Ij( ‚ŸWZßcF5ülw¯&j1*Ck™×j0SiE×"»aØ£'’†NÄšz1íü'Z"žKt@±Ãì*Ì‘®7GDð/€²i|kD”å3Aß`l±bÈðVt”eÀ›c°Oï~PD73D¸1£¬ñÅ…¹ƒÞÿÅš„¤c:KùšáòÏsž*æ]‰¹Wzéûi\†œ ƒëQ&SŒ(°8œGq2þÞO"Tsü1É]À&{£…[k!h²cïíyò¸á¸"+sÄÍ9U†üÃq•*ÏeøæŒ~òª?^Ÿ½Ù~¹¾2»Ô0îB§Ng+é̘ðL¥8tX 2Ѐūņ¼¬YÖJÚIèR³|ÂsÒ«-0; .îØ”^‘ÃëPiüŠ'uµÇƒ”ÿÖ$(ÖNu׸÷N|—V“–¿ÅÍÿ›(‚k‹í÷ЄȀüÊŸûŽÐ]ìÿJ¦»ßMfŒSØzë͹ìÆ:èH¢¤õ3Qád÷žjN¦æ» ðu¼>ÆSAcþ× BƒçF‰ûCz’)7< šÛb‡eÈ880š66roLUJ[™ÐÃ@ƒ”HÉÅÂt#á:¿P™ÏO‹í–±ÚM¿ìgÏ uFJÏ›·õO«Á)WlôŒÖÑë›°Îl㸡ù~]E@ÐZYm3àüý&\ˆ!B_rˆ6A0-¿5j”Óü›Út5ö¤ù˜qÁ<‹tÔ×,E‘õy¼[‡’Ùûø=ÄÑÝØš¹Á;€gõ!8èØ²z‰Ÿ€½0¡€KDâÈZ–$ì<‘J_X\Àº ~,=€³æ4ŽÊÔÅå$Lžw+ÙB±cž#¥”™ä)'”ƒ@ˆÂ‹èÁógg,È`ã3îÖQ6ëà+0ÂcDˆÓCíÇ2Íø{ g ‚c—×ÔÔ³ì\°]x„}ië*N﯋ï(éî²T‚±¡³°°–rˆúöyã YOöÜÖ2J"`T[3Ó¯à¦ä,ùIq=Ö%1üz9¼ßB{d°H H1òfœ`€0-KªÁ×^î‰ËVÿÚiÇ[ÊPãîÉúÀN¶j‰ØB›Ë4”÷±ª6ÍÍÒèÎ^·âйL„wͤ’ÖDüŽÃa*ãX4]`ž¿ÊÞàã «¥€D‚MbQ=5‚²J£¶ÙK9—\‡£"ZBÒåªxCtS‹Q7tV„º9›¦Vÿ#,æÂÙ7•Í °ûþ­ÈH“»\j×À³}Áê­×ªe®½«½—iµÉ3ÏL–ØÌ拈`û⸊P×Òëž&?9Sï>Éèq^šîˆ C ½é=ÿî2'ñoÄoE®¿q¸„bÞ¡\˜Ý)]ÜþšÃëáíz›\-Ý„®Ú¡T™ág;.ßÚ«È¿^ÄS_üM,Ï5‹DÃvè@# ]vD®¦a‚‰~±ñ—ýKGª:þx&NÜ8i–éˆPXÚœæ.5þ~¨]ÂÙäóc½öðêãy°Ê˜±et¦¥uï»ÎÝ:Y_†›å)¾ÑUŸFò¨k²ÿ(SM9u˜.÷P¾£h4¢caT[æàÓ+ÙbòŸ¦Ñ«3÷¼:bÒ¼ j†±ðÐÙviõhh(ÞÞŒQx^ z„ž¥p5ê‹ñGòÁ_þߺSË%KEÞÝJ«íÔE DJÏO1¶ntCô~m]^D]á—+ªŸJF·¡ó¤újž#+˜G{Yô=]añƒmYˆ³[ d èö¯Ú›È›äKâÜ`¹,Z,6„Å@÷ãSŽœDÄ]&â°© »QÆŽ “k ”ßfËÏÌ—Úüøä¨Ä¹› 4µ‰úí9w g6%l¾'ªýÞ£¢Mv‹ý˜ÎA<ü>mõ-;s—!ºÉº”êü’ŒäzrOvI˜¿šfÚF7kEª Ðcž:ûÞìË0ˆÓic™TxíMïsCäžGy…­L7ùÍJ4EGCl{‚{›|VÃ' huì«~Ém@ZZ¨ýÓ>ÖÎH*Ë€ÒŽ&§¦Òp3½÷þQ¯óŠƒ;އ€îL§ þñj»ö-‚œ÷hK*º$Þv†°ú ¦¥À@ÚËᤞVœ{Èzò¥‰%3ðžjs´Lžî`¯+7úq=I¾Ltoí>¦£é‘y.6mÚ“ÊÒïð:µU¶½òêümÜqn~A»è”s-ªö‘Ð4ä~Ɖê"]¸E™!U§sa5ٞʬÒRÝ\17s \õ·hÏmDGµkœdodT—5Sg‰Ü£†¥@åz;‰š<Áü€…Jr²±pXñ´¨kÌ–Y蛲·ÿ½¢a+quH`²M¾IhPíH¢z«CÕ=y„Cº°à@On6ÜéóÁg{ù]žPBL*‹_þ]hµ†£)ƒÓ2¸ -Nù^)ìAÑsÂ’%x•)%ù¢¥ÚÚøUüÈד7ˆš‹r,H&ë¾¼¶éØ*#û=­³‘F5Ÿ²:ÂðZÐSiIo÷›ÝùùlJ¦"ž“²õSNXí—±Äm;A»·æÅ·@.l›×$Žü3«a›¹D« ƒñcònÖ›´PÌW]F±”?`RžÏà8šÙ*^焺tØÄ‰Kã`ƒ¨¤Vc§úgIç?j_:KÛ€+¬qÕÄkù‹¤ ò­0™±*/¦)‹wKŠæõkûeÉsjKl¶/)“Ç}# +Ø4ú੘7$ÁæxoC†Lá\_öÚa扣DIrs8{©<àbwÐÓ"j…lD Œ‘lBxð‚ 㨪½^SÔÜf‰+„¬ŽR´„AJZöUJ^Ð3\¬Zt“`%Æ^8ÞSÏø£•Yºæ_ÜDô_Ôƒ[T@}4ˆˆ«ß»;ùßw~¬ÅÎq8NcR[\^þÑ'=rÕŒ³—{r}gNü‘¯39¿¨cÈN˜—ÞÈ톨rlð–ȹcócßÔ"#ì 6­:¥uîVYû–´Š€p-“L°ØZäV,§UREƒEêßx‡¤y%ÿhÑmÝë\O~>£ºv[9ß™)³Ähý(å«:k«Ç»P)¸<ˆKbvPã÷ûs ý’ÐÖ•[|]fŠ,YºÕ5Ý*RM§Â³ 5„@»§ÊÇ6oQ›Ïma–¼LKßüƒõ§ûêEêˆ?»#ÑîšO½&‰³±T†8¯ÀAfbµ¸{wn×G‘“ÇÏñ-µÃ6:#TˆP/5'(ÙœQ`Ô\o1>Ö5èæî<6ËÞ©R*:U,ÝI-<Ôu0לFÎeQ¤hÿ`SIýeÂ{\SwLÿÎÉJF¯ij`Sìvoî8Œ&ÃÅ|-4‰×`Ûü”´C*°C»Ô}²aGJÆt=ùåOë–AK£e(‹òÑk½uÆ„BÝ”|ú¾Z3»ÚG=ÏVKÖHØÛž`M5ÁMœÇ=S8êž.L4£ ÑØ‡Ï ì:*zUÊã"5ãzR¾[¡Õ¦ÔEˆC¢!8`ÞX™ÒÌ$ZÖ×;!Õ¿º]ŸpH¤\è ßE|ìr,è« Z-”#+2íàý»ÙÞ£pWR’þΓ ŽÔäÝÄÔ£÷Þt$Óo"á|ÝHvµ<UßÈž†’ÓËÕÆ:"„§ ƃã÷%ÊHfÕr€î'Äê„\ÑqñÅ4½m\uÿ¯•÷›-<Ñ;,•†û”ãW@NùÛzÀ¦Ù÷µ^{\ç8²é¤EÚø]‚Õ£l•=²s5Zc}>›ð«ªø4Q“Õæ|c?ŒSôfbï¿ ÿ ŸnæY\Ô\qFguXQ£úA=¦eÝ& Y)Ñ<ÇW’µå¶j£*«Ø*ÈeýýµÎOíÿÏFŽ9ÉØ˜=Ç͘7_.ì"v/#åÊk Ó_½‚­É—ŒMÖòÕ¹àoîð^äzû‹ÓIÃ?γ”(‘¿ >ÔšïË[Tç½G„éG·£gu®ñ=èj¦6pÛQÕ;å·Â H”ˆ¼„¶¼ri[EýîÞ 5³Óhßד~½ØX‰oFÊ&‰ŸÎ}@²–µܷämƒ Ú¯ÀÄ.„ÿIôóU¿àk³NôoÛb¾Ù›%O’$9DŒ—Êá¿Ú~†vçŸÿö¬6•ÃïtJI/ì?‡ù],„ų¶½Ä[yUò™×xð½]±y3ß}eâ¬AvÜ¿Ô e ÇË…#û×ZCo÷ˆ…jv¥ÇRøøòFEZ3Ô§dM2ìñ|®ÿaÇø³ù„úL ¥“îÀ'ž˜áª;õTü#´¬S·ò—Ü'1¬o^(p|U®w"cì1™Ÿ1Hw]‡>Ô»ýÚþíÓê5î1Tr7CÇí|tnœw‘ð´Ã±môß;QÝ(åKa9ÒÖ¼ÙgŸŠ?dN,´•·iª«£2¢› Ý€‰9;¥Ø)EÕ®á¤ðžè¦± œ[-º6¨Tîàþ[ßÕõ™”™¶ù‹ðæ½ÐÅ$Nö¢páë@EsJy˜†ÄñŸu^´¬\¯&ïdm)ØùL¢* ’‰âÿVð¦Ø|/ÝüoºB@ŒB»Ù){g!ª4ƒ6Iü½„öjdqûPщkïšúÌxh6®CIÁ>Ã)IË}é¦2©›Lƒö%éé2v3róౘn»[q 7¼aC‚EO${އtö™¿£ýÞ˜œz‹11ÎXT•’T]Uìoé{òÞ·=JÏÖÅœ3vùÈ/µ*hã'éý§Â_&‚$Tü}FuòʤœCÕdxO IôS$·háñÀqŠd7&ù*\9`Fnú„iÒïdÌ÷¡­]¤Kb˜Šý³²ÍC¿¼p:ŸñCXƒkÂ㈖>/qãÎ÷1æNÛ=ð®.^ÔÝ;õ·Ço+ qqÏ jœdÂWÝA‹ç_‘Ê;BnÆNE¬ШIT·‹Ætí÷î7ÛHkŽ.Cå-®.Ÿp±D:7©ÆÊ[sc¯‘Ò˜hušæ‡þÆs}H·¤/íð‰VL}Œ‘ËÐõZ£1äÔ¥¦Ò!ö¦ã!RnadhJä{ÉóääS‹öyÀüah˜ÇøÍ:©¶/9L¸ò~f° â_B¤\Ew"—0Éš®"9^¬›Ýó=Œýmwð­(¶éÊóKËadMΖ̗ò3kó°TT• Ú$ú²gÀ‘xDš)ñàY„“†2hþñ4)É HQÿ‚ZÏÝûìŒVlÁ˜†Ô{¹^PR܈ê3D;éáÐOä¾õÐø©f#™‹äÙ¦½AÉܧ˜Wíæ¿9µMQgѸG+¯;f,ì6ÈWšk‘;¸+Ÿ¦¹mÓ¦žë+=8?'ÅDZîn."÷`š… dNOqî0œì§—=ÉÜ=²h…mô†6Îåd<&òÞÙ #ÖÃl3Óøk‘lºæ€¯ƒMQûÒŠT&|>Ñ<øøC)G±cáÝü …Ìg©ø]ÏïPg8¥ÃY;V6ц"9c»Ó/÷,$&þ“,²í$¡ÈšpIØä£B8ð4š‹ñ_ŒÞ cþ®!àê…|î_V”ä&‘€ÿà4âdéòkŒê‚Ü×ýÊÀrIE­ÀËCÚõ”È’€ËÌ(ˆµà@K’EŒœº'%Àü™öÎg¹ƒNkô‰Ul*@!GGfÝ)!?PÆqvi rtܘèt‘ÀâÌÖÝt°õ£DæÊÇ´.íJ{|§¦ˆuÿ`^?5ó•OY¿¥…ĩѷK·uþPõq]ÍÅÖ»ˆô_Y̶áÌØ¶ô“+€üV¤±vxe=° =zq_ƒœ¨¦êÚp¬FÎ=êÅ0}»ýÇLÅ«X€ê€&‚a»C§6t!k@µVuÒ™B·ÖlJkÛDô¶”›µ&ä†>HÖˆnŒH宓£ùsjt à¿·U¯siÐPîô‚c¾+‹f¥‹6Šd™ØÈÕˆà3¡š©6”B…!Ë" \ÔN¡bÎŽãOn]f^Ûp£W à¼@™­ïvžÃvº¼¯ž§Âg‡ÌÕ¡’–¯õœó ô®Áê ¼1| «’¿&ЍGË ríÍ_“¾5•/ǶIzX'ÇwØšW}û|¸”ÒÊxû Åw-d§Œ€¥fiÖ¹O¤áÙ­·Íé;³•q@&½K»Ÿ_‰ßÅûœ·p]Ì3szÓîèZþ‹NíH‚ÿê dÍüà3pþEÚ/ÌWK#Æù­Ö–$Õ=°Ê \œ)?ô³AÔÿ„Áû ú¨·èÚŸ^ ¬³60&@ °3-ïßñ.£H]•šS`Þ~R˜y]G…X,ŒŽ¹Ï£“ïsÎÞg€÷”Tø‹î`óÅ/É ,?ÉäYc§B*füÉÀj Ï€’™áu(Ð/å˜Ñý­,K÷ÄÕpÝŽ$¨=°ÇPš5_uã|f5è°óÐÃÇ!ö•Ú¨:ìèÚMùÐˆÞÆ£¿¬Ôûì‰lóik•H›úÒ& £}#ú‰-×€ ˜e§œPw»µ~ê>’kv›!ºïÚ²þüG6iã»A}¨ï$àfƒä3ÙÝ179:Ä[Ýd³9Œm jÀA‡¸jòØÜ÷Ô›í[Ý㥫;8Æâø‚£PC ôþÒeÌ|Ÿ­0’ü¾ž#Ža÷g‡p*0òfÀ¨”¡Aí:•Ay"ÿ·TE¬šƒ´6ß[ca’'­‘Ýæ.Óõh^#µ›\À#¸WE*4¦¹ »¬ܦc„rÛáäçRiᲜ•`ñD3üó>k-|Mr€ÙÂKÎ&18+,Êe wÂ.ED³²hG²H‹fÀh›˜£÷Δš$9ßRS9¦þ摶'vÌðÀ.ä `uψ)߈^‰ý}Ãx^¢}DSVI¼d²h`ˆþÌ$pbË®Ùgñ]gÝò[«¡ô³¾£ësù´¦òÛ]õÐY…áÝ‚}ã†;ÃTY¡¨l™c-zdWÔü%©Âv%YCÏÇÌxÌ웲ÍÛ:ÉP¸ˆÅÏñ2Ö=J弈,Þ#mFœA-ïmL•a®ó¨éºû×Öêt︢Q1m+ƒ§õ£ç/óáÆ_)A]T%o„Þ^¡ôllÐ f`RI©ægÙ!·hkpƒ¡ø‘å É+úÐÐh¯ sGÚÕÄàÚª‰nQ±”NF|iñûÄ’òR¤|wÏPïI°×z@ȹÔåPr*SgrìÂü˹$kêˆï7a™` Jª”y÷á@|œÙè£ùõ`“Ùp*bº\â¤ÌbõªÔ.÷NÑ˜áæœWƒ¨äÁP¯NÔÿö›m{ëÓÜ_Êo±É6þcÁàößzÒlkÑ÷¥Ì¦ÊóÓÝߥ=b_¼.èCãzŽÏ;†¸Ù«Ë6Áx¡_­ž˜wƒ@k³Ÿ^®Bå] öØÌæÀë\ó¢d£;™_îþ¹ _t|1ËóÎËiG(Ê樓™¯J9n>ª,1èïï.<ïGÕUƒ¯Q½¼/2¾7ÀÔ‚çô¾ÿ¥§Ò²‘Š-¼$ʈ›nØóï<ú¿ŠÝ„6Yý׎öêóWýš“UýKвECC @Äê‚ù4Ii´²³Ç¾ 4YäæìzëRϼ¼Ì!8ýß-À‹›JN‚Ë!`#ãZ_´E­|‹6úW¹Æ1R|«{öYÇ!’uéYêÏók7Té¼5+ó; Æjö\ü…”šáe V%5žÍ‘ÍÒÌÂÉN£ü¶HÕ»Óå*€³Ío~€ËFÚ¯õ>/ö•Â…£z¶}ÕùÜÀVNÈ’O¿oö4Vê…’à.K1>>7n¦xÙ¾«íªo?[åê6‚Ö:)Œ¿²+ÙýŒ(È•#{–¶Žø’`¤ q{þþ걜S–œÌ!›YX­w“ÁVÌmÂïÏ?ê`pb“¡z¦[¡ ­¥Ì™ðÒ:hï¡àym ïîÖ9Íbü†8Bìr¾G‚óMº†Á6fÇΑÊo¼ èlOCe-yÑ=ù8S>? {e}´L…=ˆY4›m Ç<øèÕÒ^¨Ÿæ¸ƒ>\<)Á|OlQåGªÑÌn±½7KÌ Ò¯¦g~‹Ë®kZª¸TÞÈç :I‰¹ËtSeIýH#9Ľüù]¹{r¥…©Âˆ’0Ó™²5 ‘ø÷íÑà´ëÀFdì ‚Òx1š‰óª5¬˜Ë-3ÚigeåKgïvCÉ ÅêûR.ú~þK†^ ç›D<¨@L*®àz·Ã+$Ê,Œwj7S]çtÆ£Jz7G|Å©ÍI/ös|>/vÕɤ¯A‡ˆ™“zá¼Xplm¦‹:UXÅ´„!}¼p5Où{7=¶}dL¤ÿ”cñ@êUiÁŽÐŒõý¸ÅþŸvÇj’Cvç¬"ñ_'Ëmfû«{YZ’~ÙêxÚŠˆ[ YÓ† ¥š­ˆj‹ÿû !Énל²ßI(ÑguUNe¿c[Ï`8·Xî&ÝÀí·œçr ¶é÷zèÚÐVÉè&Âd)í•RŽ¡¼õ?IïotædžÞ}™Ú…/%=ïá¿ê~¸| å@ß'J3&dkã\à¼KÅ¡Ç!¬û·¿C‹²8OÁîzWˆ?äóèkîž‘ñâþÿƒ5«²ùHš qÄ·$œ Ç9ýRìYÕܬ#h×<ž Bâþ$©€Þu!!º3Uñ Ž—ÇôÒV5s· –¿oÈ>–ç˜ó™§;Ÿõ²ûÌ¢K`Vô§Llñ3âõ©Û`oïêèám³МyÉs€ó÷E ™ ;s`Ü:Eêæ5°¯¸–îst×Q2lÁI8€ez k6ÔÇ+GFzÓ* îä|Ú_öVôØJD²yKlþW¢bôq'b§7Œ³|«Â[­Xmêœ[ï® ^b•Õ …—ßy®ÜE 2¿DID대o Ë¥F^q}½ ûpžæ;veYñ^|hø{SÀT×Ü–"/¢¨cW•Ñ}×´òðW8‹Kå×hýtvÏ ûx0å)µ 'lÂPÌ`8 }Õˆ'ÆBþ2D휉™P/Ž+sêvl*Äæµìµ–‡¿+ïdü•÷g‡8FŠ¿)ŠøüÙÃÛPÚ·¬³C‰4¢Â%êdˆ-`n= ¹líÛûQžŠ3¹ÔWR‰_pôa¹LËûI¶ t(ßFJ±âÆù\¨çLk—BKωމ&¡¯gåÖñçä1¼À´~êÔØR!]DÚQ %½É¬äUê¹ÛkÕùP¾³A÷[”¼1”Ç*)Îß°±ý‰Ö?Ú’q¶™³¹€¨AäGFDÅ+|G¶É5½pÃIÑóI  (Ø7/Éå½3 Å*ÂÃ< ²(*é0X³öü™ÃäyqÚÉú èúüÆ®‰zM ¦BŒ¨Ð‡oÝv=µ´ºa“R@“ÒŠAD„˘õui: \\´}£ÇúØGA KQ¬{ˆdGû¿iLu‡¤túù×½ú‰t,„žä‘!rqÞ˜»™wjH[Û®*%ï ìs H_þŠxT¬¾ºu›µt?3F3Ð xÍTŒwöÝEžQ×¶-ª=ý¼ˆb÷æü{?’Îù{Bîþ×Ì_ÄÓžÑ?âɨ(#˜—Gé RGuT דš€¨ý‹kóì&8!%éâDMsúUä9{-¥nã×Ý™ùõËž OÑ;¸^ eNK Fÿ<9Z§…©©x´zléU"±J´!Ú}ü\ù„rÍÙþwí|í²}8g÷Kè@ZÕ+Çõø—Çíí^ÆàSî'sóñ\¶3ÑèùhZ«n`c ¼ùcxw¡¤ÇÉ¡à’sè#øM¹fÚZ»ƒ†3(u›k”õ®BÞªv¿¸dz ®&±«ÂZ4ôHž²ÓþÓ˜ÁžW{{æ§àÔŸem±6â½ß—.œ@¶K±ÓäÁAüCSñD¯æoîÇn¿vèZm Â¶í­ã¯Ä8†Ñ&4¿=ÅÓò•ꢥ2y4¿:âÃ:€å²t¬£Î„°ÇßšCØIžP) B,Üiye:WÔNœ¿ UÈxNO2ü)×}ÅúdEÑxB)%Ê¥PŠÿMýBÆSö¾i(ÍÛ²YóöÊö²çD]0›ÒÓ/D °è<c–†¨ÚÍ„h“£-²kÓ’Ï$´ƒÏâñÔ„‘i80s!6©cvÀk%Ž÷'Æü÷é$7ýÑ}öÈéõöopÂ$ÐåQH&޶Üxy{¼SÁ0&KÈ^ÚJyé?ã·‰X4Ê|?nüw†[ý±YRé v‹ø€jù åÀüsy§pî‹ã±€i,ûrtP¦@Ú\ŸLÃtg7½ÅrŠm$×÷íé¿1 "‰nÇ~'ʺ0TDz-7Æt«ÁÚk•1¾¨dÖŠa¥ àUÜ7ûËÍe~甩½¨³=uDÌJ¿CÈûž‰Aì9x…õ¿9=?.ŒY¼Cêä,údÌ»í3ÙKøò›©ŸÅ³ÅŒÛ–§[ѯ4X„åù!ôœÌñE¤‘šB­cæãÖ”[ºJ‘›•Çò)ÛDé“`ˆ³¡©Ÿwšîq[œ v1&ˆí jŒqq}⻸¨ˆabv2^Ïð¶,ô#q9ÉfbZÁ·à˜˜ÄµÚ4“kÌÈÚ#ÈïÍ_^뽯c±€¿¤M×%Ô7¦»þ/¨Æg”sOÍo¨·. xNÇ™Ö?¼{©"o¼µÇg®†ê§uÃ6ƒ÷­»ßj" ÞžœHÙêÚ«?„Ç /|T;¾fZ}¤ml îö2”.žôœÞåýÕË?(g7ñ&ÎSÃ2n³µš¾;,¿‡aô†‹ÿì8 [Q"UÂc •w`í|‡¯×Bòê ÊVÚbã…} ”½#îþHûr¢©ƒ±f&gh')–ñn´Jo—Ûv§RUVö5]œï) gžùM—פm±Àx~™Øx&åNp[èž,4P’¢­xºH¹²ùrÇ™“Ûn„JJÀK:À@–ß·ÒX®›Bäæº X—µÕ(ÕÄö ÄŸq®@µàwÜ>7_Yò¿jkEwL¬Ù-ýiÏ}D)¿ŽøÕûвuÿ%‡)¯ã´õjZçª9$#T;iG”¨:ª,»˜ú–‡L¥R*¬º@íjb8Iëè:I·6™%»n©a\­FŠÂ0Áü+©'M/Žá4å¬7ÊøEPʲe 5 ¤ë§L'U«[ìkqiû\z´œñèUyç‡fD>!`ÉšoâaR:<ðÓÚÕ&óUdÈ–²X˜™óå¬oúåÙ±h'ǘÁóä«d-š0_ Æ­™ǃ%ÐC ¸¹P5=L6×ýZ aj?0€á/;°dPâ) ã°`‹1Q?=ð‘2¨UæÑ}—–í¿C?ýæ-”ÍÖ¡þ?W€aHT# “Ð%nhüŸÚî|ÁÇ„qâÔç¿îâE¶ÿ¥ç½Îƒª'/ ÆdË/Ü ¤¨“<,Þ:b§gû»©K”/ÝnÂÈÖD~½Ä_©ï2Teu¬~RúŸ<>±Ìöz«±—ØU#ž¯ªASÌïÎŒ¯%À_Œ4#qr'ñ8¾_B¯qÉf||®wk’DìOjpkG0gì­­ŸÏ¢ÇÖi8`ã6$Û8hZXÊãÓÀf¤¹þÆ Ð¦< ^Væ ^AýéZ$½Ù½¿êרÇ=g/„Èql³¯LŸ[29w|†?és+Fme-dÖ³©?¢hE6"ÙiÄ[óOq—ž˜šÒúÛÏ¥óW2q(_ð¶zÝPÌö ¶èxià/É{`±Ý´bAe¤td½€É¶€5£b0Ru[ñ$c÷9ØŽºØÒøÇ¿N Õ¿rf·‚¬o!ÓäãÙ¢§Ýt‹ ½­²&Í^”;Ö·ÞÀU”(Q¶vR1ý7î¬sp€¶~‰O±‹f6ÁÊF¶P¸&\‘×㊪>žΣe?§ÈkÎEmÔ¨tÍù6 ³$_–“·Œ|ƒ’%‘‚7dzc¢¯ õ0Rñè!Ù’lCÔçÔzy] íVdMÍd¿GÁä^ m!1¾ï³£&Œx@° 5rc!ú1Õp²s1L9Õý¹_K8ˆ²*ÊROŠßóò›Yk¨d…—Tž`Ù”˜¤&¦i6kª¸„ç=]æ‹sƯùòí+c`O¸Õj~|D)0l*é´‚#¾GXÒB¿«ŸÅ;p¡f@€ò'à»×8·{x ˜Ï¿/o)|âÊÕæV)Ϻ©ü´ÂDª]Kês›/>оåAȸÞÊJý½­÷K©Þl*K|pUW±"#Q¨¹’=ÍþÕ ó“¤óPü`ù<¯ Ùt¥WÄ#hD{èÿ E¯7‹i„Í<ãPInI!/èÏ¸Ž¾!¶1OE¼¥9;Ôª¦AhÉ‘áB1ê?éf¦nÓ³{ÊÒ²æBãB÷œ{Ÿé’`2ŽW©eK°ýÙ?3§S+8D’ka„°¡rÿ¨"æ~Sñ?t Š8dìS/ÇË÷rGÜ—ƒ#HÅOÉ“ÿ5Á¬†F»ˆó(*潟Ƙ¶xb{Ðï@1Ÿbeå¿*…õ>Ÿº5x3dH+ù/²ß²îðW§P:ùÞÆ·„“`|ÇÓôHó•8qBªK[žÒË`^¢y Û BI×§“‡ºÅ±þà4/Œå#>ÝúÊç• y@pÙâ#?„yס¬„Ë·óeÓÏ@8‡Ü“jx º>XÒjýGHµžrA2Uoy"ª¡¤vѸxŠŸqV×g‚zfˆ5ÍüÍ¢.«Ã6TjšÿŽ \§–<%h‚m²«ç¤Õsɶ絫 ¨bRçÕþ f“µ«Ë§¬x×Å/ç<þN6c[íD-{M¥e Líc9yÒhŤô«ò¥:›ñ…ÆÏÔ$„ÕÂù:(3¢5J9ûR¼Ú¸ËNœ „㙿MšÔ1ãå\w ÃàRowŽ@l9’CKþ´ø…qÂÁh³—^]9¸üï@•+¬É2q·á¹´ª0ªÜ.õUl„â”=š¤²J<þ—‡ÐFU/ÿúÇÁÎOu`ÉÒ[Œ˜´÷¸ŒÆ3j ­Žï@ãS!D"ç̶ôßcÅɧþ¢eÇ£\øëAᯓxU½å’Ú£:3)ª)sû)Zi ÊœF•Êë¿õûr¦Ö {øØÃ<ÌóŒz;rúãáÚ! Y0¥~HÑ$›´~€ÛÛ]«îZ|Õ‰×EË˱=q¾«!¥{NÄ ®Z0Ø6?P6Ñ4@†=•ùß×ÇXdn¡ÿE>Êê…Ú˜¢¤ù)Ÿà‘$|z´Þ°¬øîP ›nF ÏúÕÙr,Ée‚*ê‹! ©Ö“ä‡Q™î·}wJÂŽ) XÏ0|B–+"þ#gè]†:¼ÒËe$€à €©08ášov¾޹´[×H=çµj8/öI,³?^œC{«¥¾ÄkñlmëšоöaÌ.–az^®ÒH#'œÁ«+»ÃWWPKôÝ©\JfŽÀÁzÔ¹ò#´Kù'5ä9(Tù´÷^1#ôÓ‡mŠMߎ¦ôº‹{¹É\\´).w›À.àÿl6ÎZM(<þZnI&–½îé7þ&Èõéã5ö‹ê¡Å{µ(ûéðð¯/‹hžÖåÈÌÕWj(±Ö-¦]Øã´ÇáSÛs¼Òâ iõ³² =”Û£Ï*öwwæ\nk}l§l¹Ü¸"™,](±+¶Ö7uì6­.'6õ‡(²S0kÁÓžln%¼¾Ûƒù¶ZMå;*MÖ]½ð[0’ÕÑ´J²\|+nKɨåÅVÆŸQÁìd–ð“?Wëg„NŒOò¸g‡Ùžày U'¡ôIÂü­ÃÞ†Z‰W=ñ{‚©:´J²DsMãò…õY ¢¾5ÃqLmŒàÐÆ…{®Ö$%b¤ÂEÌÉÃ’È­ZÑâQŸO¹50Wμ¾üarðAÖ_©té1Ãe¡ô‘¶¾£û&rÎ~âŬ_øŠ -Õ|û߆m,ÊS¡º¯Pb?Ø+Åó~sýŽz·+‚¹!ËçTÔ—ìt‚$«3\áÈWÊrBÙBk óæÖÏJ#Hˆþyb]]ýso¨žëЉ…r˜¹2…æúî¶žd= ÿq,ötŠa}ÜàC­óÛú1TÊ»·Z·Ë´ÐSeˆŒ¡'ô>«žw'ÜQÔŽû[¾wˆ»Wè¬í]aÙ\sQ£àþÖ‘L"Sã9›ârWË¡cïbÿ r!ÑK ? í¤½N‘+·WÞû‚Ä©èJ fg©q«¿Ð¬Ù4U(§pí¸è&–ðj\ÓÝöMGù•Ï}:eh®RÆ“lûäR´i$Íy´z]Ö˜Ôú5{¥E'%$â0a™ììnÖsh›±ì¨8ïí}‚Zè’>µ¹_/ÏìZÌâã1Ž®/œ= Œ‰B§ý"ibÄÈÞD YZ¤ªH¹.B€Æ(\ôáR4ùÓWÀ”N$Lqç³Q¾·´L Ñ…Ÿ_ü×™ÙßÎÍÿäÇHGkѧ]•hëSCDKŒ[%#${ºÔT•²¼±kÀ\ò—˜¤² ¥z“3~%gð»ÿ­ãé<¶S’¿ÎÓŸx‚ò‰¦¾Ÿ~³)2ËÏšvUã@É¢Ø=Dþ`…µ&k·~r¼ÃQ5ÎŒr|"Ý\*à¶-T‚6ÇÙè:þ… ‡©aÀÃy IMÞÌ€‰ªÛ Ø¹Š¾´Q4()ê*JNwÊC¢©á­EKü Â܇kH¡ZÆh¾RÑéˆ÷¾ì’е;ȹnO]—›®†r(}¾ÝÁl3´îÀ~ï #é°-µŒ¦=zù)¿G¹G^ù¾Q”,ÃÚóƒÙ½^_£} HmªŸ³NÓy­2´}fR*ãŠå˜Í¾äîÊçèr¶¢`eÚÑ£uþ¥ÏžŒ™òüñRjŠÒ0ÄÁã´SnIY3Môu°]Hñ±À—ßeãt÷ht·' *Ó¹‘.`ƒ ¸ŸüÕ‚F¬nx¼=‡ˆÍ2BEýöÆNd˜ÎeS‡”Œwâà3É¿žxrèB‚š‚ù°wd¼ª{U–åU\Ä{2 SKËÛì·GwŽÛ[ퟠóòÂ¥×h8œ%‘Ó—{à¿-K}R }ÛgYLÏŒúd`[³‚=–$þè”Eñ­Ñ#v¹hwü'ºbpì¦'v§òLµ’2*ù°ž–A»„ãšôêD}íXæQBÓY°¢=à|  J€¨â·!’k®%ó ÞJ«îbËuþ‘ËÑpß—‘P\{@ÏúõŠw’ÌÑÈfw_×§@k=©£¼xü™@ÏK3¼Ðù™êFw“3××/¿&`±ÿ¦›û™^Öly8$ ZB·¥ÖÿcÛ¨+¤¤|TBo­$B Øi’e‹=)J½ÞÖÁŸq– VI½r˜¹ïVÂX$¥¾~w“Ê ˆÏÙõÑKùŒ&ÌGµ²W¯üÉýx A¼¼z¼q0Ù€Á«¯wCnƒïvžü±TՃ쨞äb€ÅMó×-4EØ@.H"v±RÓ稘ǭðåÚVy^ïùo¹H-&{%èŠ&#ÐÙ¢e]ºü„Ú‚P&ÅÆS™Úž¢º ºpÎ Nù3úד§> 뉕â&\üÿœSii­XèY÷+]0ÎXÎJÖ£[æîu쌮ŠïS™›Ö3y yìès3¾ÆÜ\ÚÑ@J7aÉiÄj×õ%ÆD õER*nœ[¹–PT/½zÀ©­Éµ«þ€EU,›û¼ ‘ ³º[—¿è°!èZ¡˜hõìLðíÞ…˜Ú‘ðÕx8Ö7+èÀ§,ðo¦e¹°GÉCòŠ,Ï˸p]r˜˜EüaKJßݹÁæÍ¦ÌQÏŽöšŒ1Ò›“ xN=Ð~rYW`€^î©₞^.,–Êg4U´6¾@H¹UNæW ðŸŽlÖï–ÆP)_-öYé—HVé†w·w wšî¼bì#iñLu”aœ` ’çôN+I²O²ƒv)R/êEÒËwXJ g¥õ`kø Øl¶òš4Xwèx³žèÖoM,t*ÚÔɶ>Á½ l¡ŠÉe:󒹟¡•i~f˜rà`µiˆÊµ3+‘ãÊ *Ýøßz*ÒLQþ7IP™áJ¨ñÍʦ*gUB3ÆO}bW Sd=Ó:úEˆûºÓ1§X=›J$¯$2TCÔ!bLÊÆ½C"“Zd©Þœ½¬R hUŠh‚eÉõy&»Ú3ÿŒšQ0‡žG> þ4Á Ÿ§$TÖ&+åÞÚ_^˜Hh)4J†~M¼Îÿ|[ÐUUÉ:‡Á©kK!Ð2ÿ¹L`?ˆßUò±Ø±a#‚å ’È~=Û¦ÂL–KÝã@‹®jë«çôZß&?ÚÏ”Q×C~M„éÙÈÌ]JF,tô­±@A\Ë9SÊ>\êx×ÍTŸ°8˜±@|ï@’¢‘QÙå<œé&§v°ŠÜÜb£ÔJšÏFøœ¨ºŠ4 «?s-°þ4XÍ€[(ÜdŽt0w×ðz¦˜å’$aä ‡õClGmÉ ¨¤¦©f½oÞŒ'%Q—Ä™+ïõ2NiF”rV둜J ÄR;‡aå½nõ=²&DsN´ƒ@~±-·.  5˽ÊNÈm«•‹,x7~}såoÙÅüÞ ;ÀIŽ~i¥”®Î¼ ŒÉÿ?laÍËf0y¸r$ðLP3¶Û0Âëè7¯ ¢ˆÂRpÍžñ‡le»ýb“ÑÝíOq•6™3[á—d:1ÌþN¹ø-ñDa?2äQ–ŠË-+kŠ¢þX¢•:$s_…"îUø ˆ¾L¯èL!ωÈ_Õ{1 U82uk7h˜pvo±ƒäÑ`ÖQRNSˆ¥=´M©Œ8{î¶\Ä´zCš:Çäш '*~1zWiç•Yïm²*hú±¼âfâ(ª\mØ:hë<Ãê‚äIÄo™¢¿øèŸ9[xRÖ’O«›Ü}tÌÍ‚^@Â((Aïë˾aÛ8ÚËÝÉ¿ö~o§_BŸ h†Å®Wãþ›ý3##¬×w">Å`Úz^f¥È•‘&ÒªÒ[œk†=W¿X±skøß*ï\´î«=.ŽnØ.ší)jÅålÛëÍt• <+ù8%Í3Üi¾ÃˆìWÝÐc°@ujI…üáƒë†"ÓH»OâÎuÌs]£H™‹DŽ˜Ñ³ÒW ïÍúùÚ£¥^íµ£^¼vÊÌàܺ(–;Ó““´N„ ™¢:*SÛiŠÈÛ,>ãr¨å5 3ÆFÑ"\w„óêAî4nQvtBpùÓ„‘÷’²& %úy. Ž>Mç‹ÕØŠÜÁŠk²üXfŽœXÓ“òº)’áñÑr6o~Oú¤²7"%« Sâ­Ao ‹?bŠ.®*Lf’ŒR£?½K¹$Ø~à¶ÝÛÏJ>R7’†žç±‰ ªÇð)²Õ_ÊPxÏÿÇç’ËŒ‡ mÆk#R c: '=ñhcHÉ<…?ÆÐè!ˆªeÕÈÀå9¼©Xb@º!ÞÈçVÄóQ>HKë¸ê½¥<UêŒyȨ]Ã;“óý@Ô.ôë¢ÜÛIÄ­†v51…U¢6I ©Lí,à²T•^xsrÏüšä•²IïcÂÖ™’µ‹ÇéQíÀךïÍ¡â­s™BLXÞ™±6ÕPJ¶ jjÒ†…¬©Öñ1•Ð67%fͬ pƒž#÷3”­3Þi]N£¡à4F çAGÈÆ½=US;‚ÔöPcDV\¾Æ› åõÆNŸÄK úâl§ÊÖjÊIkÓ’ø~u÷ý%±½»wƒl½é攵;׺;·FfЮSù~Ï-pK~æïrUt5YÀ-û†4 ½ô1Íÿ dFÒÓîáHÄJdiñUµ®NrÑ–w·ëè/˜#?a¸ZÉö!R¿×ª:LM%£á~N·þHÚ gÙBš¨¢¸ƒ%—¬õ'?÷ðU¢ô7¨²9›2 § Bn$w:=Òÿ^&j œ-Pr×wÕå¨SdñÜqO35%Í) ‰í¡º¤ìj<¤Ùô]ž‚ñº–`c‘t£9föð`f%}i‹ßÍ;€\Äc¿jé¢?áàÝÁ1Ü%$´…¥v£ÉþMÓ^z³?«ƒ?I¯+%1/}3”/‘Ê0™Ðû*5ôS"+A^Ò?Ä’”åMb¦ß©“ó®«Çª’±IÚÆeÞn ?¦‰¬jP`è‚”æGÀjšØwÄ÷{X„–2=•‘„¢Š§¯‚ˆ)@¨ zpˆÿ¤XåÅ|°¯¯»°»£øSNÅŠêpÐz£„.ú¬M‚èš‚oõ…&\U58®ÅÄ–1®fôj† ÷øP‚2ÜK«ìù&d+ç%¸nHöðÉ÷^èœ0÷ŠnwL CÞîe¶h†$Õ ÿ+•‹É(ãFfA%ÊÐ wMóݯk „_sÎQ¹Ï—†ˆº·RH¡ÃRCQ{þ)xÕ ò;“p´* ÷<« ,k‹`–ÍbþSz'ZŠÊ)&‰]ƒSg?º,…úbžê"“a`¹rô«Ž½´ýL$~89Þ"J½ D‚à¥5PÈŽ…M¼É±>ºõ‰¼¦³÷ƒúò?ÀïlCÓî篃ag-ɱÀpaà™Xän5ܼ[v2o.6ÎsƒZ‰@´ÅP¹'‘ôz.>²Üî×awôìÎ÷Ø0|; àÁ¤a—sÑQËJíD{²‘Õ„<5áË–}ÒÏŠ*i°m¼Þ•4õº/#•nG¢»…ÚG7ý×lÁhÑ—$\ÔP5*X¤XNëø5)aò™#Vó¿Û°¹Ätrܹ'ØðŠ.ždT?®‰«^8.NÓâLyj£¢÷’LæšI<ÂÈó5´Ù–¢èÒ~#ÜWðÙ' :÷8c |þ‘˜©%\zÿz¬€£ÙT k£í|ô¨|½öŸá_âO•À¿ÃœòˆdîùF‡ÙÕn—öÉ<«Ú}{t.ÑY”ÍõÇ^Œð­ò>“€Î,CŒBü`fÂ9Cöñ†Ò=XªÙ¬Þ–ÿ•œh×]kÊåɼ)%1® \qP,®BgP¸~YU –ô¡—Q,'r.#÷XÚ˜p°gq‹¥‡ûÛNÑ@U•—¤sþw@Û*ÝÝà”ucÔ?+h¹ñ#ÛYôÁ÷ÿ¨êj¦ ßCœÅîÐÿºàxôÿ²¨ªf_,{A´gÚœˆ˜T©ƒœ‘ëü*ª.®¹¨JÛu;Å èôŒëþs~@i/Øp‚Ï&•§úEþšU6×°_B¹$'Êy$&z$– ‘¼SÇfRØ)— ²W×A#ÈÁ"‚¤Pï‡ôÜ{‹^Ú‚œ™ “ì|ðw½ÑÞ²€ Hð·Àúþž5n‡Åƒ…2œÆMT¯yØ}N· -ƒ\Ãhíç´ ï%ñoË!SA€iŽÂ ϯ}æ±8rÚ4"°¿*%/ÂYu¢41 IJ‹K²tÆšž)ð¡Î‹M‚±»üÿPMÌšÞ‚B×^¸Àþ( ÉçWŽB ÙCb°p¯öxœÒÇ}®ešŽ_'ÐFPGT¨×Lëb ƒýÀSEÒî¼3#çÊ÷lÑÚeξݫü†ò†‚·µ`æ0Ï÷¯Z èÕ! óågv©bJÐ |‹bù˜NÉICã‹úÏûVªmƒËß%Q ¾±¡5~Cu‰Wú'‰ÐtGLK#k£9K˜ýEFöÕVTÿ/uÈ/E-F4Ê<㢇×ÿÛ,4–òÊçÊää”n8¿VöÌnAS¿ÿWCMuÛ¯‘²’b”oQÂQ"Àý3n®+HÉ©F †«ÖÑéÅŒŸÑDò•<Èú3¯2YI îS¶TQñ 0»ÄÅYƒ¢V ž ™ ‡Ä4q9ñó{Ê~Mïýô!R9Œá#g£`_”=û‡TM'©(+³:€ð‰?)òU¨c`RrÖ¨dF…2¾@]ZI#Ä1¤zEu¶;ö¬5-¢à¦iáRÕ“¥ˆôlH(Ëä§UНY“5:¬öµaR™{´Q74ÅÖROíus,t1 ›@þº\Õ›`ËúkDEé̓³ÉóÈEñ™”·ËCZ„gÖcÔn ’1}›oÓ·Þ|bC˜‘S¦„gMN¯Æºzûñ¿–ØIŒcòò0iÞu¤€ÞóN¼MÉ8v3âN+ H p— ˜ {º>¿d Y½’ €r5ä ó B'ó;âL]:âDX3™´wš‰"R¶›gæ‡ÑQ•\•‘?<Ÿ¢¹¯›v~ÇûZÉxLÑ·f2×È«³s„Í©“Ä!“ðdÀ¬Ò]àYäÕ¦®;©/-_«ªÄ5¡9†u?¥ë\œlƒVÜ›QᓊQ‡ØmÚ«#óÛ™W(Wq¤}{E|K Toóµº]›Uʰdd'Od8+ÏŠôwM£}«™‰R9 }“´ÍœˆJvè«êªÿoT*ùMXÄswžQš cÈýå"Ükk¡±¾ePé—Ôzn÷mÌ·Y»AÒ™X“|sYÅ´â='H>4Î2d6¸ZDꋜ:V“-³qÍennJ¿å›RñÑýCEÎGËhx™ æm•#¯0ùסµ½Þ%nm3^šiwL³Ñ«·‚fg<2iR  Œåær¥bólb«Eï¿Ãø&QX½ë^Bß¾7Ó-î…×ú\ý¿;÷i[Y¨„âÍ×»o‚°€gZ4( +lbRÆo±L¹Å}I»T_Ê…Þi=•> ýxvìX1‹¡\:ãûÒuÖoG2…”›¢×ðgñtÀ.+gÚwä2™s ~Ñ(Nî£Õœ?iíÞÐPq.¿š4›ßŠÐtL>{VÂw•­ÐpOçµ°µR;È&¥m7`²t÷ž›¸UÞP˜iäR~EÙµ —Áè¨eŒ°/¯žÜjÿäç\݈΃ŽK`10í¬¾ì‚§»_§Çä’çU3¶ŽàxtŸGõ euÆZã'2µeóŽ•R½ØúȽl´Œnv}Ïkšc~f–’ìe3°*°Ùæ,ÉÏ›lJÑ’!hÄúëB©Äs )”R€cÃ;­Æ“ÇûK†È“W¿J—T?6Àp;úaªÕ6{ŠK+ ´àô÷wf‹˜aÈ®ç ´­<⌕ÍeÑa‹ø}üô‡°![s …Ú¢•=ÒOšè~ì­?E‡/îEMŸŠÀŠ£ƒ´ŽË.3f:ÖµfêS#XÁnþLe ¿5ßRxH>ÈR„-ÌŽxöÈÎLêBÒöËw¸š‘ïÎ6Þ@åkföãÊyõí!5öèD¾3"‚·»mQrꙉ^Ž7—h ®O(7U8v¸$è FºdV‘+‰ÇªëÉ9"¯¯¿Çc×ê±мMÜ®…5{$øù æÁÜû[Wù[ÂDŸÔU‹Ø#¯1ÍêTןg|mÏT†nÐ’èCJÛÓúbTs½TÏÐÖm9Ÿ±ªüCÔçKˆDÜwÜÄ´ç}¬ñoˆx’2ªÝ'o1ú CÏá´S›?KúÖÖ¤.ȃ´fžÉš5 ´˜#e­³#ðÜíÈØr}.jHmüRb"}¦öÉ=*#ìõ:ïA›.Pö w¨6Êë“sp¼©®ÂJK𑙜'¾àT‚¬\:;‹º *g–Ø,…¾÷ŽõPÉ6í0V® s‡‰¦IÅYh2†rðË7ºê}àí(~ÆôC§L1ôÀÉm¥oú83K‹{^-ñ–=«Ê¼×–èE€26·pÊ\vêóQ¹ “XQÔH—³ºE ¤I²àÿË¢ýhÊ[ôjiM´þÆIô´èÁ»9O«ÂEbêíiZv–% ªÕéâç—6Ðf4}kfû‰ËYýŸ>ÈÿµÂ¦µ,La8pÒyìH(!WQ—‹P^»†b.8®bs¥%t~ ö¤ã¸ÿ– / /DZ]BåÚMí]ô§UÏLâ0?Wì’‘až@D_0¿ìïíh  òž-,˜PÛIæœ #åð\Ó½yXT=®®Zµ; {ù?zBB 4"¢íâ­ÙÒs]¡‘(›f+…§ÈÞ4 R?óQË •4ŸL@$ýϵ^K_Êxy …’!h0)ßT~ªÞÅ®UϵG2‡%çw‹Šgò\-§–2ÉR÷ØîÍOÅÒ'ØåÍây¸¢S÷Æ”‡ˆ•O ¢¹ÌÚ‡D¦¨Qƒ/%ëÙØ«¯ý›èù[îôÌ¡ò=ÿñRiSˆLÐ6_ËØ/V7¶Ä¶úN4® (_˜’5‹dÙ„·W“4G»0Âk=‘¥uì0¦ÈögüT[@ŸÊV y EWK°:´ùv@-NÌÓ:]ëÒ›ÃBì\ Ŷ0Ù «o=‹ž±åq2ž;I"æZªéÿ†Z•ôÉF¥ÉoÅ;‹*.šÕÛЯ¯Mi áø¦'̸•Î~Yû¦”†_æò ŠXPŸÇ¦I ŒÖ÷,Ѻ=,ù ×9ð+ŽŒäMÓÑ(¾i×ãªÄY'3$;Àr¸(Š›¼«¦2ºú[LØ3Lbü3£>ÑÜÿžãƒ´ƒý> ¹b‰?>³²®6ÏÔÑçɨ%"Ôž–]™u¨PíÙ‰ÁôvœÇÁ7µ{âœR— [¬'— &·œ^Ñ©KÏ®CP5"Í£Ám;´ä¤…‚vöËÉ”Kº|pܺj †p³Šþ'£€ ðûœf-©)Æ› ø™¦w)ÀÕ|Þ.8xÌt„…Ñg¤¶=ª £,•@‡¿ö€3ÉuQ«-ÙtJ¦Íõ’" -•rZ Q»BŽŒ~(Ãqøh<ë‘ Š´å9)¬%îHÊ &!@6»VÚþ¦~0zç½RŠ„Äê’€Î4p(Œ„tãMÏ0“OÖv'% û¡×ší0ð€÷<7O&¦v&À“ÑÜ4v Í+w1zÖ#.gÊñOã‹Ç,W6`„E8®G£šDËîŸÀ þW®þÓ᪉%4!ªé÷Y̓wÑíål·­{ö‹É9®ˆ«å¥ðÎç¯í¿Sw›ß±øp™#»oñ‚탯$í#‚›{q?öðIÛ繇}¨Í­ 4å‰\÷€ÊÈì_‹Æ$ð©5„¬C¯Íh@Lc Länøe™©1€=–à ×°Žñe»z jî•2êÞ&<3:ÿ1ܼĿ1CP}sãi›Øà¼"¯ëÁS.Íä¯F‚rË´ŒÀ‘ QøÈÀ²0J rx-)@{S(õ25^E]nŠì›ÝÞB§ó*5,¸pxáÁyp*d—Ìô+ýá›ðÖž÷‚-mgm4Õª“×%ºïXósÊíÃÕe÷Ø®®8ÙônŠ#¢õ'³¥7ê4$OÈæ6â€i'’˜¤¨¤ $A°#^,o–ü‰Ð,j²y0•›íØø|”Ïr'R¦ËhÔKÞ—þ®uÔ†«p® ž§kã Ê£—ûίX€CÔãÚÍ5i¸ÄÚãã^ñÉŽÎXR©¼ò:}–ÃÑ€}½Ôõ캫îDjGÒ"Æ)v @ QX£.±­8×`†4°™ðñPLip²7€Ô¶RÌôB6¿.oÆ/v!|ºµl"xt6‘í°uüÎ_êzÕf‹-ßÜÌbFùõ–& ܽdºéA?“ Ã|öUFHÄÁ<\)FÚn Ì"ïP`~ñ@7–“ZBZ$%ñS¶ˆ~Ð §ªXfÉ© ?É´ušâ˜f ¼©#O£‚?ðX¿DÝšîðh.(듃ÜqöL”}ÑP±)~„ð ­'t›N’*nàTîe#ú.ÅMûíãÃVÛ|“*0fÛ&5õkh"ò³Òç“\$Uø¡û…ì$»iy]ìËýäüÊáKÚ܆·Rƒ£ºZHwıä?£/T Å´,»­ºŠêÍFΞ9ehMEAý›ÔŸ©á@Äi¸°®g¾.éPUÀKp©îÒBäD;¶~ÃG_Õ´~×Z¨Çõˆ¢_QÖîõu¹U>÷¸íÓ# ×?ùlœXܽơÐNptüè`ü¼¨—ºšuÁëZüW¡õZ)›ñýœ’L¬^}äH|§ÔŒ 9¹(Ièªz:8.µ•0ŽŸ¶bÑH4ú ðd°š^á~DÛ·©+Ú¾k3'¨ÒÒuœ›¿×‘I`Ú²’׿;ímïÿÊi—9,´úøÑ¨~°Ò%W"âý¨à)ÍÉ‹ü| [qz†¤©ì1%Þo…ýb¥IHµ¤QÓ]ú¢ë¹õDXÛÂW~8R¼ù ذD§ûåD¿¹v£}¶¨zd-EžxñØþ£H£øÔ{äèd±mBL“Ò—VôJ}Íòcùɱ’¥ fµ1Ã. ðéaG—4&`*Nץ˻֡Z›–ÞSa´_ qYX‘6Î2Éš \?8fŠ «ÒÇGÔ?¾ù"KÒ…Ozœ·d2ÜÞp¦àì¶0&D ú zEiè××ãˆË¨ZS·%—ÌN}¤j3êýÞ` o>7‰@1‹ø³ŒümLü•6×uÐ^ j—`hVßS­$kG÷åMÈ+Èá—ú ÅëâãËfó‘Wz8E¸ _asª±MâÿšÊg;Š)—N‡Â)&÷«LÌqö›¤×ã!¿ª)Ø„V µ€Aí£&Ûq ˜øP‚°^}ÿO?¾6ªeB[2"AÚ2£Øú½Ò‘ Èc@Jüöè êË™Œ†Z⨞U$O¦c=‚É´?ú51m=Ô-¾4ðK¶²ªÝÍ0ßpϱ¼O+M GöxWÿ)>U%…];i†I´¡½q„ü¨‰Vw‹"*—ç¥ÑKµ(ì¿™ÂØâËÔ?ÛØM{t…½â{Dk>1gSu°Š¬'A XÕÆç®ÁöM}Zä¶N/ˆ£ ˆ9(§²%è ¯C¤@×8ây­cÝ?¬HRËeÞ™£r/_"6Ï£e¢Ä7ŠÛà£ú^=Za3D繇zLçª[ÏAl}@s¼"€“ƒ®}ã‚[ cxAIÀƒ·œ«Xˆpœµ¿T¢ìy@i¦MAh GºX*ع·Ûí¹P¹f£à¡BɽN žL_¬fÀåR§ÝˆÑeÑC`WOóç•~ ¯m,Òxü?¢ x0õ®îîýlXx®ÿš8¡(€ûp6k-½sø”†´¨œ^™OCÚoõ¶2†nW3íDŽU _"1ø¦Š| {óu³Å»ŒßúT+e;š¼Ï0H9ƒ7@¯Œ`×”F“XÂû²h-·dÝLýœXä°—s¨»òÅØœH‹*¿é„`8YºÑùîÀÂî.ŽÅŽ%¯rò•Ç6¦ã´ùaÉ4£‚6=z‰á÷·1‹A«akÛ<%¶ FyãÓuHž6ª¢Câ£Ý ˜$ŦG ¶ L£,…‹4ú׿Éß ¼ÎÚÁ’ãeYoFó§DR§CZâÜC¥›Kìf¡¨úŽê*JÎkŒy&í”ÒÉý$@|éCw+`€ÚðÓ»KDâØõ2ÀµxìA]LöÊ0ÖãŽ0SëÌIlúLt>|ÿ”45üÃXKÌ8£Ìuvå©LœÓÁdä‚·{îÕÂÖ|†(}S)½·Œø§¬°] ¯PFÕ/ÀfƒcŒ`üQ]+‡¦?¹€v˵µd\%N?@w2AÀc=ï•Xzqîš“k=Œ‹„{¿f¢é{=Á Ýk…µ ÌßžšØ¦×pÕ‹µv#ZØH\¯‰n—ï¶õ抌èOñås2a´ô,R8ÑÏÞ MÉåqc¡Ö¬ÔÓÎ`™mñî%ÝÙ•€`Èd˜b’WÎC“À}V­(‰syÒ»+Nt?ÚÓr°¾qKéx`Oì+§Ø¿VNOÅ¢u¨'‹™½64@"¼Åô7| Œ~x¢» g[Z"“ý_ê™/rÔ[ŸAO¢vƒöŸ³Gû¦XJÛ)Ì<¼Õ¦†ä&§ƒ05,û Û`^ `þóaCÖ3/ØeÁ|«Á"è ”8ªòa& ³ïoX NAÒµtþ'tIçø=e}xT¥äš~.z D.1¨ECÖŽæxI®iá’5MñcXd9%ÆÉ§Hm@šúôK~rÿ©ªá©žúR ¦-m™ÙH’°iu l‡ä®«÷WÊݪÍÈ6­:ð€ód…Û>Ò<]"ºô•ÀÁ=Iòa]©—OÕöùîº=jšÊdLaí-÷=© BÎf š’Ù„ týݳm ‡Ã=I!-SÎ6Ôc“ó¯k`²Õ/+Ä*Nßþ>EkCžàΆ+Û£t…B§Ò´jP}  ±{Ô´]î9Åñ7ÒÓ×gëÁÄ­BÛŒ‚= VМÌÌâF•w‰º¯|æjy豘¢…;Z|R±0ÀsßÖèD¨j‘wœ¯NêE?Kåݹä‘PþÕcÏ4bÀdI¶€2Áës¹‡n©^f±–ÿ¬Ѩݑ´²-ózàj?Ãè!VV™kÆi»G¯Z0~žìˆxý>v®·Ÿöl—KíŠcëÛPÓЬûñ5ÊÑœ2¼دÎ%¡¿À㻸À­#êõóTyÌjÖ(°ªXz:U^æowÿj&'ˆ0írPºô5É-ÆSÈI­ÃGÕƒc\YQìØdŒšÿñ‹¸UÂçu†Œ¹˜Ö·ð³Åp!äèL.Có€áTUíZ?ÆKa+ëÇ5á픤z_’‡ã/m¬§öIµ»óisu¨iÁ$þZ½@¦© 1 ¯i&éß7‡a±¼"ÜÿÕÞnPojfGÃ2‘ Ëò Ýíuòu £ñ4&·Kõˆú±;<©Fš\TRÐF1.¥”™T ]¤­/õyŒ?ó¥ÿbf(òóæ,a™×ú¢ÿ&ìâî㿸nþŽ|£„Vmý@“ ñú~c²oÐ/`2h‹Ïù±>ðˆÔŸ4RÕþŸ„}$]Dñ¶ÆD*"T³)\­ƒ¢8zÇ`X`TP1|™œgÊ™µ´Jyc„ô½F±!=—˜*Dñ÷L†R'=±ÃÊÑàWyìžÄüÀÅ·üoáÇrc9þWÕ"%°Ÿü㙾¨ÿ¨^ÖälP½e2¹ÛwØB;©j]0CJO„¨¯Gú4$n<¸ÃxðÙèç‘ÀÀ‡ºª`2–E°¶›4¿v)ñ·öê;D­OkÁ _ýö û÷c\þü„h¼²à~2V›M+­õÙ­$‚¨ÉJ1àÙw‘†¡ÊïÞlÛYÔø§2Pwž6ÄÔn¦µg>‡k”ø “î‘DS*¤Dêà¯{yXõ{ƒÃ+-G•/s Þbù;V]ŽWjQžÖ¤j½ñ\Ù&‘§ß¡’±‰ËyMý‚M¥ì9•÷-dŠU Ê;éuÿYµGÜ·÷æ+BWÚ@Tœq?ÿ­öîó\£³«Àã¹óv kçx|–¨ó¤8c|öR—Ó‚ÄŸÁÅ~êú½¹Ï4v¡w¹mfPœ=aºìrNºå¶ò$ÓÃÃÚ½ÏDË52¦æ9§b( Ÿ-žÝq£wk–ü× ×¶`Ü2) ¦váƒXI@µ!KÎ}lí/áqÉ ðŠ[T¥âá#åiiBhÚP:”Þ‡½³lÙÖ®Iˆœ:µCųâ`8×½q»†?ª‹±ªM¢§qlœªcCÊ]Œ¡‰é°Î‰ö+ÞôàÜW—R$>ž®èÒ0tâ" †òÈm¸#xŸ}qKV°í´/+ùR4ãÁ_ øQuM½¾ñ;ú‹4QDe&…®30ËÃåZ{ö¸S%0؃ª 6¤wŠÝš`0j”ɽTß=+µÉ[úK°…:‰ÿŒ»Ä»ñ„t1OñÙ…ÞôÿÒnŠ]nºi¥’†˜3¬: ¤×ó"œ¿52 åKXÞ\kŠ3•RÏÔŸR”vv±V{̳ù" æ…þXO¶MãlB„L;^µžÕ²¥boGÑùè‰B´ oxŽþùI73º&΀t¹1PTf>:`.L˘‚øBYÅ´—KÚdçÆ‹D[ÚÓ4HKD•¾<Ù‰Ú¨ VÂB,îÔmS2u!k·…îABmœ!2y6÷ŠìÚX’t«1RM¿[ÁJm­MCÇ×ÀÈ*jJº±Tñ¯€Sô¨WRZ\ég4c‡—]Iª¦6 ˆàœ å•LõÅåaUXQ’}_/%í›G©g` Ä›»ÛpÃêßM嬎1]e'‡9N¸ÿûŸïG†ýËŽj§ž«&ª™/×!(»…×dæ€cIM¼Å-t1Ntn 4%^мÒޣE‚ö&Î2I \]ººà3uâÒçšÉÖœ.ï~B`9唨xhÙcÚÉÛNÒIj–%çÛ·•A*³×¿œ”îªZ^–âWiá¿´l¨ù=x!3;öÇèr¹pï³mK)™ýc$ã mµüð˜3ú¢à ÷R“ƈ‹K,Ÿ³ûBjÉ · < ( ûø.J–†';ûŒI£!–4§Rž÷–' ¾âäËä6Ó&E êI‘¬‚³¸Nd™¶oøK7æˆë±[˜#IºHÙ€ÛÒ’jЬ¹€ :,'¼1“@¨)ö •äÄ@à‘W“1~Î犥yø7âôm3Z’U†œQyßÿ½s짯,’ØÊ{áwQ1%Ì¢š‰¯‰)H]îÖóü”ó™sÄq}ͬp«»IheÁÑ?C=šöCÌà 8ÇX2ñYcXë– AJ=i6YñxˆhM YëÜ߉J¦ùʯ0 Fý¹&Æúsp `%ôû~òÙkjå‹„g:†èy­êáÊ!KWÕw?Ò%J6Ì·µê¤ziÐûó¬¶T§m® 3]ö>D¥æ¼gðSBêG8äè¶ ÒÌ‚¤n€?P•)mE{T¯{3:ÜGù½{î…s”Ö†l45ΤºÛîÆjBÀ¯¥´gÖà¢Ù—=bd¶R¬@§Ÿõ § I#ª[}ø1)¬r[­}Ñ×Ç•UÇ3T]0F_øx~O%?ßTgÿ?P­ôÔ·Õ‹JÏSŒ3°oà~½Óf@2ã PV £(¥MP6„Q Òô7W”¼¨°¥;íáô§c êŽ íØÓA@bÞ«Í6´Á½Óø"EÈ,¡V…²e“P’S¡zÖ·CÓx?fÖtš£ý3è¨~÷Ö΀±<Õåb@°YVª9ͪßàÎ.§zÒöqÆÝØŒ²#¡c]DSavA˜xò8ºB)©Z¡çÝ<'S ûc0mÓ¿3‘—\S.·Ê¼‹Áº8E%Q¾Þv?×ÏÈO÷b»w‘®âCÛg²b›c^»¼Ô¢)KâhN­1BZ^bI³ÿeŠ'eMBùIh·VOq8¤ /²W}ùÝïøO5K“nkPŸš1–I “w«y´ÀÓÄÇÅ÷å¬Ä;N?•góÅICÍèc{øÔ#1‰Àô€³`hës=ãÙ‚]!0§“ä€ÚýâØ-¿›åÒôéÍ×k%TÒÝž[‹7.ƒÞÅ%íjLðå5þ…_Ù›§DwOé|±Ûa‰@:qëõ£U=±ç!7T#…Têr¾¼DXQ•ýý'"·‡b„qE¾JkÛ`)¤ŽÔ½EMø¥Xâøœ‡=êÈ»‡„¸–ØîŽOÏê—­l›ö,µ“t tSmɧ?ôk ®ß3zÇ>€‘Àr"DsÙ™gÖ"Ù^Ð$‘> à9# ú´E¾ ¨×g c"˜„â´oäŠ!2¬7§~Yø\\w6©,ê&o£(ºöà›…‹bE ¾[¸WŒüÉ Ï;U”PÕ*%ñl›IƒR2æöEØ´;ŸÅâäXs³ÒS~ä—?‰¡ô½™J+"ì~"ß,›(›M@»0lÕ NïT—ã‘ËÚãSä¥ H ö»ÈS!j¬–4Ù(Èu¶½’ÐüaÀйèM zOc<é%±sCŠ®ãß’ÞS5Š(]O4^…´¹Q XÉ×nt+hbx¡`4°&G]{$±zUÏA÷Zåãya…Àø?ÿìq?§IGÐ"çþ´&6/M—å=©Lmà±»Ý/¹©…zR%;…m^ËÈ…*3Åø—š*sjÞq,ð¼f'‰ PV@ùy þ /øðß›(vÖ{×doiûºM^Õ2hÙ&º—Æh¿ë³ŠîdÆ7Ë»@Ïk¥(Õ®“Ò¢Cɳ›nó¶j%’v7Y…§Ã¸{vJQÐNµkžZò8?^<¥×<"sÿ#þ¡s˜øòwýòøí©ãâŸ%x-•6% Ñ#odv”º1J:ã3Iðä}Õîè`pQÓµD˦2ÝŒ8gM›7\°îŠš…û:…,¬ò(vðYKy9˸IÞdžò…“ÕæÄhMޱªq Nm"Ñ?®v¨ŠÂ?¿¾¤aÚ —as,ÅÕ’¬Í4ÊèeÉ:žÊ8Ìá¶Ö3`¾”+Ó@ åÕ—75ÓÖàÉ|%·D‘÷—h•´BP¾Y¾uþQIQ)Øpƒ¦Lî}ºOÌê›]|²8 s3ËÕ¸¬WFÈn2Ó¦sm™ã[Qú¹Gu@ ÖPÜŒ5ÂqÎ#zÜÂ7¦ùöÙ{pÐDÀûœßM-  ŸS®4ü÷‚F™Jn§¶òÊЩE«ç¼D=a¡9'6÷–öyÊ,ªèêÞNEþ6O‡nA«> _¯ÐuffwNúÔ…R€{Ž ¡iü¥Bz¤Äñˆˆ¡-ÓÝñ)¯-"H]Ù¾VEMÔÆ[•Åsz/]%\JÚ ?{Ú6›ÑøWné¬<–!ŽÛV*#LÂØÁÅÄtë—#(†B¬é4}CZ¿öaßy\@äì;ûùœ¿[ëÑèê–»¤rw¢ð(ÒiZåǺ $a`V*×È9V«úª†®²¤z´‰bœ$i ¸²è³ž€7¾Ü×[hD‰5†…¯¸[ï ̯†O"0åd!ñ_tôòæO¿š.Ä´‰<ëØiàDAÐàOœÊøoÀZ´ÎåÎY­.óµªÀ{é¶~*ÈA~ÜØ¢—VøWì·%Ö´ƒÃG”gÙÓüˆŽ†¤òZr j$E_…ûHD±mb{ÇuW)Ft9¬£…Ü(ƒ__Æ‚}~¡¥mØ ÿüÒ¨ÒwÅX¡jaßÁó´™÷òÖ„:¬òæÑö‹v‡0K±8\h8¯=NöêÁíÑn°\Ún†‡m›ü@¥â1GÒb)§¿Ö¼6V¾³†aÙ1Ñß”§å¹7€‘Õ~^-í¦¥÷@̯¹Pçy38B¢ý»&ë‘ò‰%5à ¼þpQಬ)²¦BHɰ8 ãªØ¥ZQ¨-ó=VÎ2pÂXE 6‡ "JcKû0À‘½¤ÞRÈüÄc”4³“3—UYÏÂÁø­AV'~ëÜ-Žp1íÚÎ,XxO¾@-¥þæ0€X2²:›%©7Šš+)\][Rþ;Û²mÚ)o½$­õóM¼'=œ4ùWœ}CæöèòL¡s~bÅ/ÃJ†Š‹hÕu'\4áBµ¨¤é¿x!Cô~—…mr¬ìšè±Wž­N $åÕõŸ”¬Ù5ïÀµöÄ-B úI  ò N˜«¥œÁâ£ËOGKËåǯ°h@Nþ˜‘o)[ÂHî1ªý{íçùð-Ï&F#àËMéà}ì*ƒ´¼¢ªR0v®¹ˆ1ê5&(A\Üȹg)€1”2ÕIø>D#ê·Ã†w•vNìŽÉ™(Ø 3Öú‘M«Ì0{y¹ÌkèQÅ’Ó¡¾Þ`Únù“VÛK09Ér ­[Ž*ZÜEW"!m¦¨Ç<];ÂÏÎ)âôîÄÚ¬ÒÎ ¯¦£Ú˜|ðr›êØ #8/tE"P©ó Ãê‘’ý *þÝD}ÇâlŠøÿŠæzqoBºYÒ;Ò ­ŠRf1HÎ='@®ˆÖN^r#Ò"Ð^&øŸçº›töð&jLF樻ú~§®E“¬Ò*³¥õ·ÝÄ]íáÆØC”×ÒÙÃdñÀo"í䞀àßÿ·UF13)Sf«cÄY¥à¿¯d¢Ñª¾X~ª8”àæ:ºh&"Ä]á®05Þ€ÛÃë%Uvç4ž´–ò$½î÷ŒTÈ7$ãGB¸‹gÙ]"Î7R–ê×e•z¸©* ÅP’B"zGQሞ­y‘Μ·íü"—ý|ˆz§gþ±3G=O‘·~þŒMêtÔSÍ>êX$æwËU“ Œe$¡àPMŒ¹‚Ja¸šõ¸ãwù¹_Jrü&qÝ­ûâK +‡´ˆêÖêR•™²ØÍHî¿™ˆþΤtßð;Í$÷¬ú ãc+8üš#É“ÄX/ŽðÙ‡…—â”†ß ³ðBÞë1rÁÅÃOåöÔìP)3<Þ1YÈ/÷ä&¥¦Éöu;4TÃo€øW\"ǶÓô÷«}[Ÿ€Sú©#ê½» ,¿¿ŽÇe }ZÞæäSΕ’$jؾ¿íî÷ªpîÐýe¡}Œ“©PžòïÐUãûšëx^giãXYß©¹1‡ü{cY !ÄÄ5ùr«2©Ö¢ùý².N»7˜hp‡ÚD±ßF¦\5S°Œ¤.ɲòåËS*§ÎÅrz¿ú] y›ä½ ÌL#¶úú«ÎZW3\K@E§™¥q©“å>ÅÒ¾MëN”$ú¿2' nýì¥êéÜÖÑ“`#L@ØU°‹A¦òüþÚò==2±‡FEAw噊hßœy ÷7,˜ ÂU1¿oÄeÛÝÛR-ï›Ùl H^ÓÇÊí^gwW4áAR1V?XÚo&Ø¡¬WjØ vˆ™åÞôœ³Ÿ11Uèz'ª¨ó‰Òë3°CvdËö­ñ ß3ˆaeÉøéeá£È÷ ‰o”d"Âcü[Õ®¬èÝŜ儢6ˆOE hAyñ¥ù¸+½Êáüó&F6 1'°j=J*È0J£z5œ8{•Y¢dYîîy[ÄN?ez4a‘øŽ¨Š¯­~–C™&Óº%~ÜÜ3£yÁ˜HõÀ\ñÊÎu¼‚F­<@'Ý%dNr7£-ÐõÁMj 0;-sÆú¶adb™ ó•‡Ö¹Ô3œ–ªFo… f=tGœDr†×bÁmaÈön=zEI# "„i„ÊÖ m&bï ´=é";cy–Â’ÆL5G<à(ÑÕ5 3Þy?!½zw>Ä …Û'ˆ¹êSuvÒÆñ?›«ÏO¿Ò&do,bÞ …îåúyáX‚S€d9û.\:Šk¤³““¶çµMdø3­Š?ñŠ;¤"?`¶rûe‰)+2˜溎UGAF^1•Ö\Ϲ@97êöÔXc˜€ßY0ÒÿÖ‹ìþÓ´¡0`…œ*àÄÇV˜¨JʲäÒmÂù‘—ñ¯8Tm­f8dëþ‚YŠé„,€¶ãÉ´WõI°Îg¡¶í¶LyO^¬ìvz NÊ®ºÑþ:€à«¯Ž²±›ÀAÿ:04C¼ï¬Ïš`^Uêstó­N€¾«eEñ÷…ŠVh7”fö2I>¶§Vo·H9Æ"⫆1nç×€ÒèV®r%Ü+#®ÿIwökªÚHøŠ÷‡¾_ô°­Å;Ï*4ƒ3Œ!>Î_Ÿ=†_öË0£{‘‘kÂdò/òúbÈ/ìAQ‰Hx(¨6ž1wÎzNךÔÊÀÞ—³]±®hI‰!„p€¬ÎT“^zbeÇån{OñÛ/\ß‚Z Ø$\|ƒ*=ºqzWЃ×ì'TØbRƒâ¥AÏÒa™èyQ1j¶É¯ODuVíN‡Oü}W€ÜéüÍžz"`Ÿf¡Šó}lý\«Oô˜·ý£dæÅæ=£›(°|ñ03ö‚õ‘ÅUêayÛ’Du¥‡ˆaŸd %ƒ¥ù\ˆXÆþßUäÒóD´S×dáo¾ž òb+[*#¯T€7À£LãÈ–Ë2»e¢0ÇCç~™îê…ØCd² ‹Î2 Ý,D)}4„(;LU.Ìíýå»Eñ¶ø·htb:¡m»nŒu–³Ä_yqÈ·Zw›¿ï4Ì5|8„® M**)Çañ*LIjÑ‘Gób]=+±¯h9|@ƒ„®fÄ¢kK¬^f7ûd .´kjúXju~Û<ßÈ‚š:Bj“Éð!Àâ¹JÝ#]uïuq"`ÙW/îxi »|ª`H° ääÐð®I xc3~|ÿdTJu,R ÿ춸ޙ5«?Ÿ Y ‰åòê–¸®Rn£¸‘±V5PY‰˜¿pÛŸW5¿¿Ï@Þ–=úŠxè~VÄùY›ã(Û2¨;!ð†ÁÛ#£ƒŒMXËS(àÑÏ,à˜xVÔñìÃTõ«‘[“™ð¹‚«©œåЦß–úrBo: pc.Š}»™ÉW™«çÅF‘èw‡ø°Mš·ýÿiüj»±ç0߸6ÝY=‰/(Ì+ż‘ÞVëÐÌ£îzá9gmgÞ%ìµ"¾CMO´Ðûh:|éIX7DôR°—ÿ±øp©û.^̃ÐûÙ¦2GøáoáÙ•¡mÇ—ÀÓ5b„4û÷«ƒf&0ç¶ ÁØÿBn™hµ6ÍQús[eÌR7 ƸC0Cooe%ræâÕH¼¦[Ϲl²fW'n?õjøŒÂÅ‘báÄ¡^w*È¡i•Úry—æ„ñ ¤’]ë·Ë=:ë±uð¨ìâÑm0«GÀg(TÛƒ7|-¹Ü.‰„Wý‰Ÿ‘>Æ $·}!ëìv¼h”Èû`àahÙS÷ZÄôõ!&ªø83(ððø¡Od‰uN[”%Qà}1X'Òõö©RZÏO+íí¡ë0Ü€…ImúÉWÖø |ÑÇ%ã &Ý––S~]»ëv:ïu¶j¹š³¶uc};ìË)j÷¯½ሧwÆš"ï½”œNB4ERÕ'¡¡Dæõ2‰èKªÔ,¸$z¨átwÞ›¸â†¤TˆOÝý\Í#oFçpq_[I)',Áë$ú›o®B¦djÞâ\w/Ó©Ô{óµ£]ò ¶’¨†0³¤h$ú“$]5-uÔ{óÊ4h Šˆ»Y¯ »/ç¾VzÊ\g ÃÎÂÛŘø²6>: ¥4[¦)% #Ú80¿ÁŠe!`±ÄåÏclzÅbÔï1 X_0½«*‰«uÒ Ü¢<€¸Šâ—o›ø Á 0SaÅôMÖœÓHªËžJ@¾“õAïŒô/§êhº<¸ÞÇÊ‚öļê•þßh´û}'6TÌ—6‡CÎ[^4\w×n?)j O7 ýAþÿÃxýøf­Lü²yƒÙP^AÜìhpt¶ö6ú‡$ëKuwä\Lãaé?£Êm:¯ÞÙµGžç‘¯ÙnŒƒýZ0@ƒXe‡aŽSµÑ²&E8%W•åOW€¦Ba«Ãxï³X‚?Eîß^H=šÍ:—+ßú¨f|BD븛~6üe•6ïIz8ÓRêÂðÚ:èÐ7&åH ƒ9MÇî^A†>Ùiµx¬MŽŸõ5ÿ2i© ¿7ŠDËï[Ú?Z'‘Rw »y%7æ…Xk5H¢Óp«Ô@¢Ÿ6ÎïôO)šºÖôК‡±ÞÎÙìø¥ÿ”íÛB:Hl{ ñSÔ¨³œjû{—Úg ¯&ù€°û$Îúûð~NÞýäÞܤËÉu•†ÝqêjJ§‘»³Òeâ8)à=kªàA Ù´s¬N_|*®1/zÚÄÍö×Ü?I@ãEõzŒz:±|IµRŠOã§Éc´; yÝX7k?P÷AýÇ”úº‹A†!ĹèŒêä®9àŒvë„ù®ðü¨ò –Y‹ $ZÚôüNŠU("~ÆBSqXÞðh„$¹…ÛÂÊd¿^|I(·Z:ñiLÔÞ®°y¢õ,^«ÍÙ¥pª~Ê2G²ó;j»zeÖ¬‚á<éf) ð´ÊÚÛf¼2Aí1?ê¥[­gÎZÈ@§D« “r–ãö{ûi_À/òºÄf[ùÜ(.“’Ü'FuCFʼ7]ݲ®ÕeÓÖAl$ý°…2žšE oÂ2¥çf5bÀ¤µb(anä6À®ƒt¼Öom/áúØ‘µ$†Ÿ{ ÑÑá3Ýg‰‡­äašía;Ãð.Þ–š}ÀQç—¡{o;kWÁ0Ñ™ r0'ÿ*d,BÖžÜè™´o,ßä¤6éí‰ÕêfÀWêU€–Œ™8b²ÄÕ¾>j‹ížÆÚóR®Ð`;XÛnBPÐÌSw1 ‚½Æ¥áÜh™à!,Dq ©|¬8Nƒ®¢ÅûêCÒ²†¥À)"L”§“{±Äœ„~9<>¨å9ˆáV€P×Ñ<Ф¯¡mа„2?×/•ÊŒ»!¡ZÈ ¶ÜëMæ![õ€žîA M !œ_Œn_Õýޏk â;)™qp,ýÇ6"›å»«´h"˜5}uû(è¢üAªÄgH×µi›~³g¶x8Á¯üA”únçÄü7žˆâxøÃZ¿á_öˆ¡ÓÅ:Ø1žÓ¬ÙÎqv$ƒÝr%¶›Q$ÂСKS"øÖŠõqe»/eŒÝô#$]„®n~fR²cXè›.~¿ñLð-ÓHuæ$ÙG1‘æÜ<úx~Ç7»ãܳ¢z±ƒà†¦4ʤÒ>{ªùQ¿éÃ!XۥȜ=kÚkblxoEádõCaƒLH*íQwÖÔI²à§¢$BQ^Q ¡œ…—Õ"[ÊEþfõÅ%’È©ƒ½S‰ê»v€ìÁl¹Ûé®àd¡ÀGCj‡cƒŠÁ¤UP’;Ó{—0¥ ^KvÝ¡+øN„ÙûG\›ûì· $ß6ü‡{³ŸˆLá×I¨ ýó7ÔŸ– l }¥±ËÂý«—±%ÿÒαá1§‡O¬EØñ ?¿)XÙ-ˆ÷5Eü e †O=œŽß,äÏV¿9zñƒQšç¥€x¼„Àn÷Çy ÁôW •TUicj þ §ÉAÙ‡ª/\²›Ñ#íKN&¹‹®Oëµe|•Éi ÎY¿-/B ÇXÑH¾N; ÿƒP¾}X2ØÂpY6á0eKï饦GZ‡òB9î©b𨛷N1A\S·ôÞíéFô]=ªÞMÅ®]†¦ùó„² s¨(òRqª|›aàÖˆLXOXSÌ¥XÎß ?¡è"ÿ9­ DÚëì.ߤˆë¯¥k\$•*aˆT0ð: ?TÓf>‚zmlŽ~”²’£„gibUŒá…ÝOx¯_,‹2óg§ SoâR¢€-d· † êå_mBë6¹âºôJV)D²´›ÔÎ 6ð0^©ÇÂéÿÅÀ£c’\Mp.fÃ;2úÁ ¼Úåg,Rt‘­r@½ÏëíùÄÿ¨0óOÒˆžŒæL%îôPÇoŒÚèÉl­Q{ZšCšcOÊѪÓ'‰²ëEò ¯9Öæ¶Aõ]œYÁNŠ{‹íÞ§0,ÏέŸ¡¼Ìhr’»!`sø,pƒGÛÕûVU„lÏGï\ßš2Aç|g Ìëw¾ovÅ®–§yðóJ†¹]¿@“Tj/"ê¾”â|ÝJÜ©²rö–[øƒžŠ“¯žpKŽ«qƒí¶3 –šÛzü¿ œôsðù{2Ãã¬Ëï;(I‰07¤Ê|¢Þ9‘ÎwÚã<¼—R:Rå|ò©Òßl þî¥k%’ëp¶·|––GÒ»ÁƒË½T‡ÌmbwØ_J&dM¶ËC>7£ßê?Æ©uÂEYPJF¨=ñKKnÝWà¸%r·¢ŽÚF_¶av|\ÕËF²¥tѧB¯6/ÔÀ*¯J“æÙkwÖgIÙ@·‡¾ËŽ pËÀýîÝÑÙ= ¢Vl%·K5Ç8K&Ìã€ßTXmÈÜ' fþU{yhwª±þoùÛxHYöÑÐ 5j}Ðó?¶Ld#mŸ¥˜ÁÕ}#–ŽfB(l^ýA9|Nàd+XÿUN§ª¼©> lËXÁÛ»'ûúÅØ4î0êÜ$OÓ^6gäç—îz+ j¦i§.F 3ÎCl'#âW¿pg”Uü”N¬F8yøÎ_I“ÿZ,(/‡Û‚€5ï CUt^J³tS}2b`0ٌʈµa`ØC³šl,ºOœØf.Läë˜B¸_€Â´+ÆŽæNoYæÀ ˆ™t˜®©ª;ãਵß" ¦oà1Kž¸+>¨÷ˆX¬Š/ç5n•œsq"ÒcX¥ØgU»Æ¡’V'bòT…rã” xhü9BÞ@ä¶zÉ4ѾÛËBxRå÷-u¡ñ†?«Êg Vá1.`tRëm ~¦™…® ÔÌ¢"ºôÒ¹¾À×Kû'f=ÌK£ûçþw¼?×EÓGúÌ^5ýßݥŵªüÈ p¢íMd€©$õ²ö½,êá,†€ G|à mTþ6=ºÉ ¸`³n] =H—FénîoÏÞ®kÿ_Ûà{rÓPž“Ì®¬M ѡƩðúñJúASpÆ%d§ŠV8=·GdáT®q£fæDÐ&'b”n[„wgnì`†~z›:¥Ú6²œž€¼ê”œª$%ºç1ùn‡}ŽÚ“+Ÿà`û6ÁÁƒécÑ›Õú+YÑЋo†“¡^_±­y¡¿Å‡¥ÍЃMí®T©ÄE@bE¹Ëˆ^1 hà]dÔžÍA¸dIrÕ¬6-s㜑òm‡ÿŒ"P›«‰§“ ¥Ù€ÝÔ^³%æg'õ2“zŒ€NØÂN0 $t8|jô|k~?x]—ðaT-«²aÐ¥~mkr©È¦­î¨pØôK¸ý&,A*åÈ9ñçÏËDо¢(|$9¡.¾ÝÓwv>/ŠE@Ýñ^ù±*3ôÜÎΟñ`z+SŽßÏÃïòK‰Ñß…žw«uõ ز9õŒ@-¹Jè’0ÃÇp¼…€r+ :äGö³´Eü”ÜÓý±GÑñžSS²÷9ÑÛ{]¦3²spúÖp®F!(’¯·aúöÈ­ €ÔÑ|ýA='ÚéøyìÓ$ucEt°²#yt-è{žy^Ç7É¢!¼ugÂÙwìÉ"«³âÈGÑ[Î.ÈãuªW ŧà ÁÕ‰äͨé×Iù1…~Ñ ýâñÊÉÝàÞ§N§5GgxJHfkù¤­&»Â¿ quŠŸh¨ï^'W&»‡â/' ¡0)+ÄŒa¯%[H}WÎ ÈCIr‡±«EÂä2÷IHІÎÎ íõÀ<ç-ïœsç°"(R+®Y 7ؽî¡–—¸‰”–Ò%;‹ëÄÆ*Oöf0TW5r©=k¼ ê¥ælI ‡ð÷X‰r4ëÞ\§¹ü%’$¾dÏ â8òhÑ{Ê`®”ÛÕöÆö£Ý¡Y!åîò¯í¼»ëó·¼9ï貫˜Ó#´vö®Ì´„Q‹Eròð]G1BÅà†Úƒ&øfNåÂøì‡TKMÌ\•8•Q”q´'rQ¯Ì¿¬/¦¿Þz"ÇrcùÔ§V"Ž{C)Î&‚+α»œZ ü´Ã‰†|Œa*K-qkøÏì5_/d|³µúúK'™XÒ²î’Oš…ó¯Ô…vw;eøÛzrjþ—†¶‡؛²›×‡ú©0{Œ%…ª–’&åÒ7ÙåMÈý[\è-q¤x^*]ÿû°á¢ÁGć›þÿòN¥>^ÛY*y–¯O¶6Å2ð›•k±(ñm…ÖVR¢OtiYÑIµ>Wn·~¸K9¢¢ÿ'É—Dýá~Ò†q5Áå¨0 ðêy,»Ö7£²ôº¢Z' ] mHËSv¹x&Ÿ¼$4D£Ÿ&ûä¿­|¡(Ì$)ú&zè)Ò¦ºàUlLÁ*½Ì\Ym/pØÌ˜SjB%üèFð”™ÒÛ‘ió`Váø#€P;_ÉtsÔìeNÙŸšÉW›W–_®mnϬ]}wàò®Ž¹‚zcµ[”¡ÿ¹¼ß7+EœìX¡+Jêê? ÿØ£³‹µlF± Þ?xmŒàp{\/ˆ’¬16þü[L¸\>*ñÝá°2ñæ+~kIJ58LÌŒ™“ R94"üxRtZƒ%.Ø›çFòTp:‘Â_Øz£[í¹vhÏ›»‡;v~-î¥"’šÃKf0‡y¿ÒÇóHgA hd:XéE®6Ó¬8À=‹*òœÆëûÁ­C‹ ¬Ö?á|Rýo°ÏÏ´*©A]o9b—²6·µžÄ.ÊÀ8õ&¿˜KÜÆá‡Òkçÿßù‡m–UÁ¿øŒ a’‡jàbÞPo¼j¸˜Å¶ìo‰U‡wÄ8¾ØËÌ#Ê‘*Ê1ËÂE± —žnOFý!{žQˆÀи2}Â+?§®=‰ nÝ–å ³Í yIAàD¤¦ª]šé5ã=Ý:¢åu`ΤR!q¼Ù`™‘çj¬å¿K ¯G<‹º; £JMĺ}¬ c #¸IÖ|·¹e®³ $“UÒ§G\Ä–8üŸŒ«Ò)íYûml0f^]ºçËÙÂSÊ ð!>« ´64¢ïdd…u?\@ýžíò±ÆgˆLY7­}ÔæÑ`WßM{ÑD³äò©Œž Cõ)÷˜rÝ]Þñn`.¨æ4Sâ¸×‚ím¼ŠO0s¼ksð z*-òÅ (o¦ Y6^¡( i8‰šæ8›LÐÔ_ö§Qu®.;V`VјO•^¢÷u£©¸&1|rœC4Eë-™ ,1ñpŽ|h ÷_7Þ•;|ƒ’ ¸ja{MA ýí¸+¼qô'„|Ñ,Í{¼Gë ÷Ô­zžm í>z_‰.D;eû’„¿ðŽ4ÍjdD :¡ŽçÁ++KˆB (ÌyÔ–¡˜ÁP¯™G«‡Ú*æ •‚\ÏH^ƒúqæ{\çqŒ³S˜Ä s@VæÃ2tM$úe| ~é8‡ªºD.˜Q¤s¹˜®ÁƒÕ¬xÕÂàµPrê9??ïÄ4Æ€P'µ±Kê!I"ëŠk¹¿½,q?ay÷Xº@€F9vÍÇÄFÇÂvI¼"Ôò™`™\œ¤O«¤âƺRv…º³Kà&RW¹êÒ_Ø_øIlÜ”™mjÒ㜩ÝUüÃsŒémÂåC˜GC…Žšˆv¦±%'}ø2äÑHúJšÒ×BHÙ%P¦&a_NÏWu³oÇÑ3¶÷E žà"i¶j}Ejþ- ÍvIo1ŸÆnaW´-Ńdn×àÓ¶Ý·YÃ; Æ¥,Uw\£Õ8ãÀ: ÛüÖ™Õ ì¡7h•‚Dö§·iz±Q]¥€™ó©Iþq§Döºæ‡D3/ Ÿ]*ÉboòðÍ<Ñ.õ5`Cm³ ¦Ô‚(öãÁ&Q¥RmXœ©I¨â´ïKC‹H}S1G§ù¨ÜZ/mfžˆçÜ’Òš‘…ˆ‰Š47h¬Ì[ÓtÚÝæÐßÀ­ž¤ññÒ¿T÷“LY•­rG%-€h%9^Xº±G>êËtS ÔÈ£gIA.î³_ÓgWWu¹¤âP1»'ûŽ—Š- ßËåÚåEŠa=AÙL 㩇ã]÷Ç(?*ŹŠY^®„V_S/£w‡GçùRhAßÎ&«5Râ~ŽB‘ß( ôÙ];»ávD_1à‘¤gMmjB·üVBø™Š¾Å† OóAXN¬’ˆž¦òïÈ?N…1Lü Ž(jÝ…Ôn l¯!<{æ ’ZaœŒOR-R5^¿;2–8‡oxèîæÈá ³‹C¶¤ˆ¬5ºù§|f® -?Ƙü™œ&Î¥NŠ0lü>¢‰p&ë{QW  ®'p@È¢ßÅ[£Ð³–aâ}¢þ¢]d@ív4Øûuù¤Ì‰))DäÚ ÷­e? ­_ô7ÛUVú×ì/ƒ¨‘ff‘+lÈö4eÊ?Ëëöf¬bŠIÛ\aæ1§Š…”ô‘ÖQˆ­Cõ¨1jïO4¼QÛZ2Y÷?V=µ‹jI +ô™µ1`1Äj‡·… éƒA,Dzl㙵ª£ˆÄ&~Uà½ÙTÍiú^’Ú»=ñ‘} P>Ϫ¼Íì\© êØ±ñÑ•ºŽ)°/Z«óeØ~M yz m=k6¾v»¯¶8c‚»P°“Òõ<Ø´¦<¾ÀïÓøht#¤¾{ASæb —€ð»ÌÎ£Š¼| ïÙʪl_kL›]²dÅJ‰è? p£íÞ%öøê(F‘ '§Ðã!Ëyú<˜s™2/äü‡]ô†*Œ³+RqIç5Z?à±4y`G’a‰œ”èFþßße”UWâAÔJ=ÑdP˜-Ôþ_æc% ÀbW’]w|ò³ÂØ\&˜O®($5¡‡"Œ­ÌúÁ’T+Ž˜ýB ¶V¶ß¸Ù+è åÛg? aƺÊn˜äœR +‘»#¸¿öe-(á‘g0á¼êéÿ‹£«£P¡?f‹WAq'#æøÕ–ÀŒr¯Þ\0uŒ±õEBÙ(Û…P@å•ô7cíqm¬ÏjÑ"—ž×‘M½x çD¾ç&ÌrÊBF%X‘ôuï¶zò ±§ãîcý÷e‹6½ÇËòê̫ݖ¯Ÿ!ħ.4{ºj8',€Pªlö)Š}] Á‹,x3K®À³Ç“*_^‡§U;0µÍ–X÷bÍ¡w¸ˆŽû ‹5i°Ëz§Flüé(ÀùUVsIÀ´N¯î˜CŽŸ‚[8¸¿H6¹ ©öøŠõÆéDóÇ‚°Å¬m=f¢8RºyÙ4^ߣhªQ¦¤eŽGT;AÁÌKðUeA2?¬:­«÷Õ"šº°Qä0Vz{þEÇð^×9rþ“K‡­xg0Aù¢UQö™&;ÙD]|h‡b ÐDäõ‚×zÒ?2gN’%! ¥H¿lËßç° ¾~c[6©¨–ڒΉú±NíèN¹˜(Q)Ò rÊŠ@Äò…Á÷‘ R.£äWÒŽ–ù|J¼ ^è¸g£H"4Þ‚áÚ3ãn¢ÏvóÚ Ï‘P® @å?ÜZ(ÇV¹Gφß5B×ç'€TÆ5¹;¨U½¥·Nf¬]ô/yŽU„î„Ò”ÅhlÈ;<ÎÕ=Dgõ<åѯ¡í+é2"œœ9AL€Ñ Âî0wÓlé·¹O‘¯ùá>»¶E ë²}Ê.nRü§û×ÞËåñ¹ï Û^ÔÉ!d“­"¯åªü²Èæ]î«îÒ+ˆúQ£Õ=”ÝñÓÁ(™’À9ítòŠýí“GófœUƒNášCi¬õU^pe¸5 ˜²q þÐ¥eƒÛo©ÎÖŠ’ì,a»@ éV±ÏHš¡˜Àt4ÌZýAÊË ¿BÌ¢ÇÓÍ`´Äüj}¡È3ÂU æ[Y?vNž B ¾HH’ú\ǦÆ&5¡©ˆ ´˜YöMMô£Ý,¤ö¶÷® ¥¡é¬h+׆­5ìì÷T¥·¾ Êeœµß¼V±Ýy¤L×-Â5Ë…|ApvBá/É6­«¶½P °~5¢ä4G¯d*Pf†ZZX³ÕÛ\·¢m}ªŽ»mþî"²“ç¼r)b”FÄ´,¬&N’µÀ×t‚Ê̾—N±i’ȘÎ^*Õ;AB¾_™€78Fín$¼0½¨s²È°½N gÓ²(7Ñ’Oa‡}± öܹ”„]<5ÂÔÿ‘X a댷¸ö4Ö4(²~+ëòäT ¥1¨Ô]𪓞®X&QÑsX^ÉîÉ•?z€)ò¨R7§‡^ ´ÎY‹n¨.ȰúÆ¡àŠ–z3ÚtåFžPyÏíVZië) œb.zÄ` H”>d€ *Û‹vÙ˜Õ³HrGB­|íÌý4’yR ý Æ¿V™U>'’m4JºUXS¶¤ægŸßIÀ§óبÎ,L*y9—…/êÌF–šñhù!êRS~c¢ÕA µ¹êýÌò`ÝCá“éŠ E”¿ ¾(>bÑÛ-r/8˜ü4X™ mZêcÖðôrœˆn×#€s´5®CJÒ¯|A«Udú™2} «ÍÉm‚  ü éÔÁÃ\Ñ¡0ó..΂¯º¡ðâGKÅÉäJ†ÔŠ»Mxh“šúUŸ”1Koþ¢ê[¡E èãÏØÜ6îsWvƒn=ë¤r§ô‘“–iy(YßmgÌy2ø`Āţȋ=^=Rëöþ2ò7²ôm%€.· ®¬²ßŒª5^Å™úßêÎl5Ãw(n½ê¦q›‡v ªÎòˆ¡Ë›ïiu4ìC gÓˆ&$¿Óˆ¡ž¹í3€ùëè÷Nåîýì²3¡GQ¡íï]àOµÙ€WLà58Ž!Ýá\r½$ÔóOÊ@~ sJc‡ÿûoâ&‡}åÒMMýÔOvŽ+ˆ;LjŒ´± _ýâ{8Õ{± žÎQ²Ó}3ÍÊÐálD£Ú!Jm¸¦Ê™5çëа—$ö½á"ÁÜr©©hsañ$¾ü–ÜÁ§î‰”ŠlŠn$Ñ1õGÓ>o^2FÏÚ…) &Šêž¯¶²\ÄÝÙøyÈy X™b±Ì®à Ía2-Dí¤ ²N.PôJ¦åwyTµm}²SñÏÞt³ Å@Ý?sŸfšsÃ{QÁ㼉±ÃvfìŽ#Ð鮨y,Ífà Ež×T\0 ¶¡G´]`ÔAŠŸW–ÕJØGgs Ô‰ ä%Ð"cDù?É5˜©É62Jm:T'S/Q<áï°Ì8ø˜kU—-€ü ¡`=„ÌÊÜ_%üÃæU?¢NžÌOæ„“„Í6,ð:&y¯ù:)¸C˜hoà–â|—ùQ/n4… ÈÙ½ds#­»t©½ñN¥Î ÜŒó¹Ï©¦žô„ÀÂUâz׳â8aû © s€Nñn6ã^ÝØ-c‰€Â3‚×™Å`ÆËþqq(;Àî®Ùú”~œ-o•)äg–ÒòϺ\>EË®í­{²u¾:Já;ÿ2‡ü"L˜ß]»•wÞ/ðå[—M²Ü“¥* ^å#ǵ …lÒÔ.[Šúšíòbƒï\_ƒ@z*tC‚ (\Œ¯Ê¹Ü(àŒÙ%-0ÓežØ$á™L2­Â&IjÔ6¯}º[ÔX…~-YP꜆î 5 \pRþ8UæÄût ØXŠí©úÖÉ¢„›MrEŸÅgâËó+yÕ±oÅäú„3±ÔT{ÓŒDú*O²ÜXy‚Nå3…–\Tü\ˆ({RkJ÷Yvõ²³±é¯7§öËtþÍwhpÛ|—”Ýä$9¯oô øÇƒÍ²v´Êݬ†æÊZŸ£À`C´Mš“³Ýë&ÖI6e)¿Î™ò¨Á†-¾º÷Pn/kW‘qwð×­ÔE"ÍÆËå¡£ƒÊeqgL‘" ñ,½òš#Òéa€=•»¬Cðço¥Ë¸õ_¢;þ´Æt½¸V¿%ãjÞ(‚I…Z‡Å0ºËË–â,mã È8Ï¥•(ÿç<Æ75„9=œnìNTÄ%=|ÀŒ± ³ P8–,’ åÞO`>Œu AaêãS7¾I³TÚ<üG=»<]?3z[-Ý°å ¼Ï µx°þ³ ‘=×QµKãÁˆp0‚³GY…««V©u·@nNm¡‰~Å–îRRE#Z‘°¶òåûe˜@WmQîM¯?šøbgþ.¦çߟÂýßZD‘‡ËPš$O.$5³¶N­ÃY¯[Q~¯ï[]ç ÒÃ=ZPy®úÆbM²5¨¬š¸ %mÅŠkÎ}ýV†\||V‰®ÛC­t³…ö×¶&¥ýÄפXD×`°fÙSê¶´1%»pĕƇ\ÙÃïÖÆÿDûä`J" N¼àCÚ²Jôp.ôƒ uƒ‘F•mÁ²!›zÃîu2? ÷ÁøU¾Pá¡—Çp#Dø†N};ñ_s}A’>Ź=c©U t#U{(Ág¦¨ô­•™ˆÁÉ/c(o«!|å´Â.L‰G¼kQWü¡n%”EÉz»ß¡Ä¼Ì#Q@ˆÇhðÑáã h _®.dFñí$†‰£f%–ú—þm‚Žñg?ï§­¯ÓÎq¨Ø‰_Ó›·@C8fcÕîÚÝŒPã‹ÖKh&4±•[Ù§“è?i³% l‰µY}'/n cP‘?D5 L™ ƒ¢.)¶]f6ŽÖ©ICjwÉN÷Šøp…wÊ[âüb§nÐb½åcTˆ‰i6ÀÖ½¸­ÔÓ¨à™áC…YETÃ|ä5êÝ7ÿ«É~Ô7jÆ45‰U 4CJcæ¿Y*m¼œøQÜlÊ5°ëtº•«ÙV@~t„=¼ëf°[ŽjíNä_àMÐ5´%œÄѼÔ˜+CxL¿T‚Ýâ»|J]Ý+Á_ê/žP“‘àûÕ†ÉûY¢&!ÓjRMSÜæP8×·˜ Ȉ½ÕØ¥lÞ ÿº´ªÞ°²Òé’/îÕI®Óð‡B[ÀS¬ÀSP|}ÇLŠd‚Ч\âryZQ,HÄ©S%üÒÿ­ðKïдP(ÞáßiucÁ‡›TS¿öxu¨`míÝx}£ì€&Z±•Z©/À`—{Áèþ…p€¶JuŽèdÉ'·â2¶UŒ-5$ÌÞ—¤7ºÜsTþuÌÁl=ÆgÜ #òØÑ…à~*Á¡ØþpB%!F0a€Ý/ñôà.tc § ðy`<:<•â'Ä"Éj …Çè¸èDˆÙ9•WýK6†ÓîiZ÷·_×&R×­ƒb·´*'ÐÈùª™²!m± Ô­šYâM¹ÑÀ÷ÅåÖ QÇ1Í–n³.ÇÁ¦Ùô•Tfú °‡Ø=ì+f}å¢77ë•“Y õhÒƒ°ePPʸ ØnÜSû1ö?UµJ!£]ÍöÊ4y*iyjGœÑ=(HÏã4aÐ8GkÒßç©$™‰ÎV7P¬°°ÂPßýy%5&*ŠáÝ«H.úÂÇ\ƒs5·.3ÍËËhÐ4ŽyT|-#6T u‰51hF-ÓÕ ‚ÕK®šì{Å/ç×ó#ƒq7‚(Ø¢=ûÇ©3‘¶»›éÅŽªpôñÜY@ gŽü.ŸÅï4^ºÈÃÇÃü¼HÌF¥W-õùÏì8¤?ejk‘x?-©k¦ÃèùP0™0O &Õ?‹DZ|€;~$Þ§Œ(jó½OÇT;">åßX§Á;Ý‘‰„ *®èIG™5[î¢Ü´AüA‰~ÚÂJÚ{ƒC#¸Nq«¿qN [e¸]T¯ÁgWæÀÔcñ!ôñDOÍœ‘ƒ¥ %•L5:žð»Ö9° ,°Á“p„›ß­åÔŠUƒ4á;ù9»Ú¯Nd¢ºÄqë*­GÁÄAIÓ*efIïy÷<(¿åcOAÙŒGG¿®ÜJ!Àé¦<¶$_¿óäÖø7Þ&ißPÈkïÙhÔy*¬æ7 „3M|ïCáÍiá–B…LÆê§Ù'Ú¬’Ü1ˆ‹õñýº6ŒÆžûVq_|i1EæYar%<ãPAkìwTüòŠa`ŸK<¶k-¶±щè I1ô€¹>Ä%éCr¸ RML…HySá’Ë5 7Œ[¹p?bRÂ.ôGsM±ùÉCU9h²ˆoÀ02à…ˆ…V“Uþ)ëÆÁN-­žé÷ÿ¥²„óDŽí_èw|{ѵ±L•¥jÞšBˆ?÷\Õ¨ªÞ[e-•Z®q–lmÅO­Q‰£DU_¥”¾r>5J¡H_µÓí9¸¹Þ¹¯ÎdD ƒ7AKîÃpx?Ø0ñåÙ™aX.EôŠí<0Ì™¦Ý±$C¯¢zÚ6a°…:xX%Ë?í Z³æFw¶´@9Sò·Wà 7âŠ"Á½‡ ò‰Ï\ñô%‡¨AðƒmÛF‘Bš)&Ĭ'½q›—U©O£)8p_÷œÁÿ8¹ñô$8õµÀVÕúëîU^›Îov»ozä ¤Ýæ‰Ý)éñ'ÂDSœ²0ßá$i7¦V»îXÒŸìOtLqgQª´fFò%—¡÷Ã;Áüå䋼{±dª»6zðƒŒ(ËÄ­õ³Ö%èËãüÙ×A­þtÛr† p¸<å0í’1læµZWì2GÉ»Âr΄¿gõ­ž¥À…â ¿|vÚf®É“yîP¡}º{6ß1ÀȺWË:…*oFtº„<45*I—ë½W2ƒÚ˜ñ5 ”DŽÒšÖ©Eò7»ó…h†EÔ¶‡âÖ"òJü3ÖôKumR†¥‹èÙˆ/¡,ÝÁÁý4 }ºâU_æZãSËÒ`Õ…C;üÈdT¯ˆ  F.ÛwãO’ÀÌGKnÚɃðj=ù•zá¬y•Øù×)8,>°ùÿw„zE†,uÑY°hë'ã©7cš±ž–ƒÕƒ¢_¶@ÙêÖbâVP<_1Lô5]Ì-œç~~"á&§]Åðçç=HÌ[%Ø_¥à†ø•·«šWíÂ'pË8'YMFåRF&@‚ÿ€^ÓŽd Pó„ZY„TSÕÒô–á;U’ÕXƵÞ(887á /Úg‰4i;ï9­û¾É€w²ÿ"Gò‚Ù…È72Úp'ñ¨ÄÖhüÀ÷+ÇæSY03TËo¯/tö$2winËLžÝh¿‰ñ8W†È¤:Ûù~œÝ¢æ'Jíø»èEÏz½vNŽàÔ—c"sbˆáò‰Ñh¨®´Ä:W)°ÚOZ;iÁa†ù˜—2°êÂÊdÁF~”DØAêaª[ÅGHÔpÕ|å¹ò·pK”¿YÆtÞü«–¤Ñfî‰ü?¥U'uP ÐH+´WLeºÚ¸‡Ùâ-üÂ3b4”Ïi`‹Õc#V¤HïÝ‘*F·mI ºpke$|n 3Oc’t‹Óˆ»¤½Â÷eE}e$íY椹í©Ôù¨.ÙPƒLyaígbÁ,RË;ïEµ ŠÓ.kÁ§ ™½,AGì·ÝÉTÕ€|¶J¹póã»"Â'{1éee‹èÖ ÕŽ÷HU:‘̆²äpÓÅ2eºþaíJ¯sìg¨{ÕÝ.Gn]8V®2ˆº¸ÔæDò)ñ UbXn œ†0 „Ñ”lÒ­ýlؘ±â'¯t.˜û>óËŸ4·zr)P.rE±17x53D1lWZ.ü}U+¾1H.Ö„DÌ-9:£,ëV Ÿj¿\½)Â;6m”qÁ¬ykª/ú› °iÓé±÷PøµÊQÏXDÂ,€£¦ mÚ±_‘WØSû6©0·ËüþèwE8Ùç1tµ¡«føÅ°Dz¼‚üäƒÿ6‰~ó˜ØÌžI^Û.o˜@( 1€fçtõn>……ës&HGC4ýžhÚÙ³g _dýR Âè6=êƒV2„Z…ÎÂR»¶bü]'E¯ævQ$žÕçÈ1q´õÜuêûLsÍõwÛ ~(qž»Þë/‡Qa¾}ùLÿ °F"Gk`D¨`‹ä&¯ÒÒÍœñ„;•Á¿×®”ˆ½>ßc.HÉ—[ m2ð ô_z,[މ•"à®p5•kV`CšÚôÐ7~­VÌL™+<\× ŒЖȆo^®Ý"£Aü|ÚÔ>b E¸ñÚüÍrÌÖ¨w!mÁOýn¼—æ´ˆ¦Œ¢ï-c;ÄßU¯åÒÂ*áÅW§‚–<ê˜c:ü»%ä½¶DIe@9 §Ã‡uÌæ¨ÁÕd·ÆO~…õÞLmß¿ ­PÓ‘XtyÜs€þ<ÞÊTnÕn_ýÖB“ë(V¼ç„(_¸v)è™bæ­ëAQ ôLy9›ø†#x(æDyL8Àغ¦‚NI°Jž7àÿN™sûX+9¥Vª¶Ô ma)3èX¤†‘e’‡ö²"C…' SűÈAíK¹†r£u÷VÐVz3¯tû#Ψ‰?*ÀÝÿ/Ý•RZ o>’¡|ƒûø>ùªæÔ™|ìÙ^Û¤L‰9}L–Ám)s—7ÈíÌë¡ûQ 6Töì-`oý‚-ÄF”ïŒ̳}ô?=þ‹¢õG߀³öË…† ÝÇ ¨nRÅilb‰Æ:T5˜z¶ °Á4ê "6ó‡+û}¾™Ux•¶v3Údödz9¯”=2`õ0 €ø>ÓƒŸ#—[ì{²Øv£äVÅØ‚›^ÇòƆ?ˆ @@4ÇûÔ†x÷ # GÒŠlL“ºWùÜÊ\Å÷Iv¬Úm°´DæÛ.ÅZMQòCÌÀHÏ#ƒD¿´T³Ê4wHòxä)QÝÖÚÜæ®ãÊÞº^`æ¤l¥¤H£yû±aˆ®” ¡/èj—?6 (îWøŒóŒ KV†5rJ¬HÕ)@ì/Ñ‘ÄKÄЬ·á]ßU¸®aÒw"h½ˆÖÕAûL…}ž%ñßá˜ú噟†˜™@ƉäSÁ´%Å¢×Rµ; côžé&2eÑ„fEqë„›ŒtD;‚'aÚD ŠfhþZ˜šÅ_W µó"ùÞ˜¨f9ù!á´4&ø ^å’Z»Ng(ü®{ÕÞã:–ú¨¦AòIV 𚨴SŸn"ûͨ¬êjÅç½ÙÏ.O1PáÚ줚Ę7ÃXˆ€ÙÈUÒff÷áHãáÙ§‰&—æ2ºÀi<†¿P­nO_ÎÃ%-狹p¼óŠÛö/íñ/F‚ý9Ït]¶qÛù’Ÿ>ö¤P4RðË`£>Sãë”–°¯Ð`•ÅõSÆn""M ¼²ÀŒ|K=©€{u&Ü"°Q@ž»÷Ÿ=¸»‡Aë>š÷ð;ÛÌ­9¾vF®$ÝÞr«[¸erœ¼Ð HV Qp¸ó¶làÚ·Œ ÃhÝ&Ý k¤7;€³^yHï>áôS¥×RFSëjfRì<„7r2RÒ?çôÏÊF ¥ëI]ðŸÁêŠ •ó81AÝN;µ‰Í®ÍwŒÏ/<ÈÉÔÿ¬‰§Týð´‘=¾ÊtüXž#‰HM™ªµùm+Lâ.3šðÅÍî®Ýœl—;î„àΞXŽsËÜL˜è¦”ÕÅø'(Ä®ÄsôÇ/~wK,ózb3Òåº4$sýœ„Ð'=Q‘‚u~¦3³èƒãžPÀ¸…"Öó[íšöVÞbûhñXý&Ï>©µ%Ó€|XÜ9u69%M£u9© |üGø5…Nî É€ÂÕ’ë±þt/‡óVˆ)*£V·L¸I[±‚ö†ÙŒwº[`”@¥ßø Ç\1ì\,ŠL,Ec$ôÚxŸñÔå~ñNš^)§dùV5ýYùœà¼ž¸pZ“ãSµ¢š˜Û¦ÒŒ®ºFy‹a±6Uíº°Ä<9}#dO¤ùj\¤xe*²ïõ7ðJâHÎô|Wy‘‰Ñ›zW¨j¤7v}Æ@mêÐ Ëœý&W¨X"ƒàøkTÿí«¯y4¼£^û@G2*ýñE‘ZH â.•픹R$¿þÆ(‰]³¢#uM”ØVì‹+w§-ùoâ1X=çA¼¸Es2MPÝÆ °b€¦&kÞprG8ϺމlÝddõ“A(Δ­ùà½'ÿŸ²œ©Os¨QWãKÄÏ€\'5¤CíïŒ~—YÓ÷ÕŽãù`:òwót‡Wjc}¿cõ”’+$ÉB ×rò1Ðo©­ÀbiÐÝÉa)׿H S„”M-±:¸& ?æz›ïÆ×L¥–Lj³ ÛªFýg<&òDF§ºÅ³öÎàª\ý~²PÂÿ¹¬ÃLÃêÉŠpÿKèŠÅ Æ´–ú®§=­[¾KÇ9û7c@¡ѳ¿/G †“'L*SÏÂAYô{LÞN¸Q› LÞHˆêÞȃƨ[ä{ówçJýÕ}>æ:³Inî(B©cõï^Þh)ÿ}“ØŸEB²»•ƒ%Ô–ØçF‹2çý¸ºrã§®ˆä5{¨‚F 6Ï. ‰rûÙ ¹ëù±Ø2¼Âc@ÔU°D\i…'¹e¼´uyÄ«+mG"}±è‚†ï ÌÏ£s''‚°ú1¶Õ“³XƩ˭2ÍVÇVõñ¥¸;;ºÿ)¯Ÿ²•JŤIuß&ØäB^(aG» C½vÉ‹êœ&U„[¶ä\Ï–'Ƭy/Yeœƒ¨7§øBNOÓöËâÇxq̲^|†Ó 9% üe“ðFrz9 DÐ6@ „%G8;¤«“úPc2×o——û åíž°Ž‘â”©¥ÚÅ$gžÛó»]‚ìèXVõ0Ýn°B`䮦•ê<ÎN®ËgÂáׇ”Í‚Á·ö';!AøK5J_]lð·t°EµÈ‰z¹`ûßÍÎ)î¬4!€÷¯àº„„è-Iu5O$ðO¾¹ªDÁóâ–6¼ýMS¢Ï™à«l-»jqâUœÑzÌéSµ0¬tˆ†Þ&[M>¤ÿ)¸,ö !;Ƽ,^€ÎÖ– 7ùl«™çÄ P¥ðØT]"!œìŽ=+yö¸ÿb6âá)„Jâ¿äðÊw"èÀOÿݦph—ׇÒq(ö•%Gí^E…˽¯3ƒ5ÛrÙ<¶¢ï’9hJÀ”–¯ÜlŠ ã·æ¦ânk}ÙV",²C-)áÏšy&?'°çEb$7ÌÊó¹ËCªX¨¼XÔ.Û½ ³‡/ê4¶;§ßH[–Dz}ú̼€ÅU²÷}43³¤ê)QCŽ/õ‡)ê "CkróSyÌÇ»/\ ÉB¹Üöi4v£ž¿{cgnHDájÏŸ4Ïßö*ŸßÞ ;1æ‹Yvdå]étâþ>²ZšÚ 2>,¯YëÅ1%‰ÞJíEÇl~Ž¢.[HœÐñL@»:© |+p “Žo7ÅæõŽ;9Àñ ÷e^óÇCP‰9·–›ä˜GDk4È:¸Y«+›IïQð”¸Â(ˆÙüÓŠr¡íœiˆQÒß›ÃXª´~÷,¯-à·¦ˆ®õ¢-Ó@ÆÞë_¯ÆçÂvqm6¯Üºi„ ›ÅK-,HDÅ„{+”190{ãÉeYçl«ù$&«6Ã9™—ç^ÜãÀ/ÊÆGšlL;˜ºÊLïhX·4«‡c«¸€­à?µ- ©¤¿4¿ïÏôl»˜¿8Ç­´·ðé¢zèˆÚEJfy*À׿ÿãG½tß¿wÉg áo+ˆC#òøn˜ËfAáÓËÈR:I~a\&lQ³GyÞ§.ˆw.tqûÕÆÏ a£ÍÂÓ*á:±Vº1M)òù{–Lð¨i‡æ>ôAcÒ¿UºŸ'7œ0¡wáÂ.¦Ä\Ðï†ÑGÁ厛‹e³¼;œêÀéPqƒì<¡PrÎÉs€ä·1Ädùðwþþ¨Npóë?ªœ°ÃjñýŸZp¾”>…œ¿:ZW7La0Ú°,ߘs¿=ÛßÖ oG±'2|ÃÐC_®]ÄóŠv¡A•ȽçR¥÷^XR½,iG¬ddS§Lu×bPð‡†EØY‘½*={Ù¥žòþ-Kž¥Ÿñ_87möÎç°˜€wˆØ^õ€•ù,:M «EÈæ?v°àåÖV_¦<à¯K³#Wˆ$vEΪ2¨/óUÿÌð§ç/±76–VÒnc÷3ò9àåëÍÔ¬é±Ö÷¦ÅéwbÓ솠' a¦¹òBó=‘<ÉÁËáX‡ÂI=5í‹*ÞЯÒ¥ÓДrþÂèÒìþG­b!ƒ“Éí‚ £7¸™­atùUèhYy8ú ˜í¤8]n ³9t}ß-òiBÖ/k®lØOLÖvK™–§»®‹¹ ?4^3p9$âßÜ;’ÑÝñe'€ød Ô\«†Ð{³“ ûž ªß?}Ò_(7›ÏÙK§¥ö+þpMî»ÂCˉÌ!§WþÓ¾;”®Û‘oTäWÞÍ£JàhµYŠÀ_¥¥ýßÖƒø8)}¢Ú0Br¹46•Ž8À^€Ú-zÆ®L†¨!ò®¡ˆ×…œëí½³‚‘ÛªÂwGè;#-ºm‚ùu£µqÐJ$SÉg„¼Æä©øå½LÏÜÈô%]̰=82´wmH›´ýŽ^õ›?Âúyçh®8‡ï ú¨¥€h­š‚6îÉi Âøýa¬P€q)¦¶—.‘xƤê2CÍ׈y,¸Óä$uo™Ùé@ºE»&l!¥xÍN±›wy.Ë;iñO‚Ć-‡Ãá-ø˜b7Ãðc+Ëc³Âµa§H.úRÒ};Œv›é÷6 ÀÙ(oAʸ~4UžN…gK'×áè³VL}Ò¡¦QŸäBÁSñ‡j·eXÀÖ3¥¶áT‹¥qB³C½C±¤¨ˆp¦Ô—Ìng@øÙ,Ý#?(ý­ð&°ÝeÏÔ#Ï¡>Q¼<$¬õNAñ ×ô罓ÖÀ3êŸèSGRÿìëQÎ{tï0ºxÄ–Æ{¥úy÷R]DEg·ºc»•ãš=æÒRŒÑ{N°-‰Ê/M‹aØÈ¶,’ E5Œ9ˆåqذEM»ÏÕã½C­ECã5ô‡<ˆ`¡H4ŠÃ¥ =ôÐ ðCŠÎÞ›TèÓá;³M¶6_í¹ÏásôLȽñýw‘ÅeM ‚qE?`:hî!ã6|¦ÛêüGq%çp°Œš¿Ð!Bü1EÏͲXp–·²;ôy¸AÏiùi£±™Äý·—/z¾î)µÏ>¯žÞ`%2®Â§Ø¤·z ÓiÐxŸbwmdÅöûw·Z"‹™¿Í´ü 28¡¥—Ñ!Ç’Lü\²X#dBøÕãÂ=pTË;mUxÁÈëp±?²mæìDt›qî×>Œ4Da=¢‚Œ‘ÇÀƒ¦E!æHR>.iâý 7)ƒd`Ü~r…°Ç±¡ú ÈÁ¥âÀ†HŽ—)ôcÏë`0 zwõõçÚ½‘‹‰ a Ýì¡súÊu”I—™WÊö—ùëh*¡å#\20ôߨŠç~¡ª0œ4ªæ‡ñ<’'ÅøÞO0)²¯ßÎ$Ù*ù À9LN"¡Š&hzÊ:D–B¨5äц†JÞç·˜lÆ{[в¼~‘¯ì¤žàJÇMAŠÔ©@ãÔk·FÇ·œ»H²ÕyߪËp€¹›ÍB„Ú¾Oõ¸hj*·@]˜%jßñ²ƒ\൶ȸ]ÜšlN=’ê7@‘¬E«ÔÎ’Âv>Vòw`® ýºêI*ØÓì‚ Í¿m½’A‹;ô2—ƒä²ŒFeù>€z;ûëçM|øÖ8€X4!¼;tKŽšàO…u9Çc†YC-¹õ؃ ½c78]Іþ'7äÛlT0þSFß®×5ö\³òö,VM}Ë‚iéÝå9¤÷N½àn÷“¬ Rqºý(´æLÎàÝLd‚ŸaVÁr!&ƒÑŠTº¡¢…HúÑÔˆé`/Pê¬Ýð‘t5ü©›ÅÆépšR/4¶´5= ¼JqC_]òɪQ>ÊæBáŸØ['ÜfaJ-ž{L…`9™Œ6#žkøÿó|OEyœåoècš2EÓüùäØÙõ(œ<7N£Â¥ ͵‰cѿ욳PÛ'.¬Ã‘oĈ*24%¿ñ{Sиñm ¹&‡+úWwÆ-}Y°Ò‡/þkY@°}Ó`ÜÞdbÔk pnŽç0³ªÙorYˆoMáƒÏêÔØ¾–ÜéƒC<òWžZLúóÇI¨ Ìzà”ûNɪï6{ê0r·Ð#ó¶7b<`8Iý~{ÖA즴-y%, D)ÉED°_³þ-=*L É›¬æF¼zqŒŠç/iÚ ±”û¨ëTƒ3]Æ~>ð‚IÈ 'ÊÒ¤ _Hžµ(É5¿r„+PñÙ™¿yäÜ#ã ðù~7¨?_ã0"pÕÊ×^ñm蕜¾ÿ.ÌUd _m5 ’™WMPc¨mÞ†   ¤™Ú{ó [ =ù (!™<¶›(ñ Š|HÌë¸`+ªnèÀ ·…»¼œ7N¼ÚL O§ÄÄt¾;¤øpØ3‹â°g½Å4ƒ_TV”Üb.£Fèåh@ïœ3°Ë(µ9·Í ÔÉgãÊ!ÈxŽ„·ë_Ú;hÍfgJ5P w/ˆÐë,…½„`—>|¸¥NÞ)™kg©lm‰íDöÔ± Ÿ[S³ ^}W ÌϰÆã©[\à¾bz*Èø՜Ôt;Q(c?z%mö •*tѦy’Å’À˜~&ÃÂma‹Ïb=Ò¿CLpòLCTx&|d¤iBàźd+Ý‚Méã*RÞLô¼YÂn!=Nš÷¡@üÙ‹¸²Kr`=f—q! EY\˜rÁî‘ßù­À–ÀCW¡§@`ötêhÉ€l?õÍ9 ÜÿšG”_…Š!øIUçCÑñ  à]‚|‡¿Ä|…H–œð¿Êö ÚP+ï¸É¬Çà O1eªS`23ÀÆÌegDE ¾!‚‘Ñ@ð÷)&—f£…­aKó^ºuÃý ó …‚ˆ×çÃ^ç‘Ì76vZ~ý@Á®‡hG­lüˆ!n.çâ>‡h lPí›ú®ìÖþBQ\+¨Ï°îÛE€g©¬¿Õöò z,‚¾…8Åý.°Kr{°’á.’'|!½Ðks©|è#ªÉeÖ7•Áò$­Ø\Yv{ Í‹„º,0‚á7”ÞE{^Ù_åN^ÖrØÎØ·à@ž­Å'–Óó«ÈJ)ÿTngîÄŸ×!kÊ7 gJÈÓñp8™Þöû‡\ƒà§³k9—ß. a¼¾¿|Ôt(IçÁØ“É/×Qµà—žÝð–þUsöÄÕ}6¥ ¨<Ò„ZÈ©S ‹!ˆð¾JUÞ~V®ZwȺœ°ÆÙ%´œý¿¬l±' ¯èéhUôçÞxa›¿Ú ôTŒ°‚‡¿fÐå'æÃ˜VPÖåBOF#Àis+ˆÔÃ¥ÏÑï¼ÝHKg¥ÿp‰Èˆ _§G•þÆÀ²è$ oõq”Ó{—îÔ‹)Ð'~p ñ¤I-§*8Ùà»&§ËÆ;£åÇ ÝfôŽaKaU y"“~‹ÃÞ:p õP„øXÝš|Ô¼‡õì$äƒP±hÃþXX±¹³¿”"k’µQ"Ã×§óþ0¥ p3‰êa,Œšq Fx¡»ÚÂÖ_ù ™¤]3Xöâ9ýˆ'9E7_g3ýçmÈQ«ðKYr¨O½¦ ‘»6½1Ûµ=3 +=+¥€p˜DÒÝÂUÃÆànö°àÊÅš( v›á°êaÃŒú׿ ”a5Ί>FÂA‹–ûY-õ{o`b›Í™>|Y¬Ý" ê¹&ìÖÎn |wÚ@Ð2ZªÆÌCÌKzÎ4¸’_ &A8g^¥/ïàRÝÕóTÖMHˆÆc™BMx:Ò_sX®Ú†˜õåÇãÅÿ¶Ì§;=ã'Ð_ ñÇ¿•Ë)ÏŒxÍŽu jøî>NQ…ñú‹iSñÍÝrÕÉ‘I›á=Âöb£½ Rhè*~Þú¹i­ç'§"Ç‚‰h˜L¡Ù­¶&$›@´E,nLA”‹läTFÂ?kÄ2\o»¿k$h.czË ¯¯h;j9ñïŠ9/+ÙƒïJ·Ó¶±_.ÕŒ?°h‡|ö)û­Œ†~ñÍÒöŤ×(DiÖoÎFAEüô ¯È<1/¡Þ/1¹~eÉ{ÁØ(hºçÛe-d9ã²uµ§òŠ‘Ÿ÷¼™$mŒ“/¬C×#å"¤h8œ"ÏöÓÙ6nº†o“ÈBÇ_ƒÞ™b…q¾ËøL´X@mK¦[øAžŸåX{§‡Ù_aÝ1Ÿ6HCÿ¨¡HFŒò}GþWu“é pµ”H)y·Ž¦ ®[üÛà(ÇÆØÉº~p)n޼Rü«:mrµ´ŽKâªØMè'‘b&;¬ÑFt(îmâDn“àùö]7o`öáát°®#H+¡Â íHÄœÅdÒÍ m«(%ÐÄåà hI…Ž×­×÷<†Þb€å3˜žä ÷R/kÛT9‚åÏ„wŠPRm¬ò–M+Ú}ÏR‘µŸé7M£Q+´QÅi± [kºbW_ø ¯mÜÝ„ÿÙã4Ý w¨J¼,zضx1;ËS[ä³âJ¸ Ï®¥`Ov³R²ßßtQKýlæi%5•ƒÖ~súJM»ƒ¢ nQ|ÿ~ö’½8 Œ@fñïÆÝÚ“L5Á¯L-Iþ¸–¨Û\k ižÆ ÿÄ#@Oݦ™&G‹ÃafþÀþ4/w èj‰ÌÍbŸ­%-ãº3â}viž Ë¾gÂB'k×I8‡ü»¦«\FCu|5ù‹~Á¿ÚÊ<ÚF\ ]™¿Y¬@Q€)x~^BÙœªE0¡Ê=䥖ZÆba™Ä‡¯YA‘U2Ÿâåø<_£°ç«%@&Ï>h5zµ»ÅO ™è;:éìµ8ø&s°¡AøUÑRnoÙŸõ ’ÁÛõ…zËìN€;Sw4·.yN+ÕÖ”ôׂDr¦O˜T€ÌÎà,+`8g­I÷|Y>Ý—¶÷m'8½Œ—Ðoa‰K×ÌÍ`øuà¢Ìˆ¸­÷ìì:Xðéø0î†h >xã­/ŽRÖ³)ßȃYAÌ6BÊîiÉ^x7Þßôѹ޽vLÑ¢Ô‹èZ­OŒŒú³÷1+,ÖÒ+€qdb·¼ ”˜¥ K› 2Ï “hjÅV\< ë©il¾såle·ü›160÷03RÊ!éBm‘åÓ™[pô“¼. ;Qi+¸t]>æH_¿õÖ™é ™Éæ»,”¹2Ý¿ 6cPezB$ö‡L-€uj0uw©{ç²õ¬_Ò2´Jêvt¸éaºÂfø»ê`uÛEILNSŸ(4P¬æ ×5î7â¿ÏÙjóö#)Öý©xX¾ +vHrd ‡ÄV÷ÿ½¼n1häæÏ¾ÈmS9‰ÖÌu =DñOÍNº¢Æóo¨LŠY„^ "y³&h¾aïn Üž.œ®à TÊö"È×&±Y^{DÞ¤ÉR„š©ã"K‡ F#\N+•‚èá[Y2æE+ám×<&ÌlÚµc‘>¼:wâמÁ#:MRÍ“°tA #T7 bÔ@/W]蘽áZ;(-†'.è ìnÈ×·^;")?²)E™Ý]u¦Wâ—5‘ã—4â8ÚoÓSv _Ì“ú ëõ‡x‹OÞ3¶Çk_x½ã·´²ôM áCÿx<î3Ä_£Íd&—¨‡r "î9E„ññý=¨"æCU¦PÙ^»„¬øö]Oˆ!Ùk\ˆH ¸›ã¼´¥øæK&‘;«P¬rš/^/¤ÛðpŒ}ÄßJøúú’q™kƳ1¹áî‚M¸¾C¸¼„†iûtø¬EŸü¾|!¸Ë°8 <E˜âEó«H›ªSÇiâ`² ò°—̹ÚUùÊÇ‹\ÁQö‰RÕ.­¥Ÿ|Š€–êëÕÍBÆe²—Cqi#ÂÆ ù¨¦¿ÝmIqbÀì®äz2Þ2:×­˜ä£‚JML‡J)¡læ©MP²v<¬Ô»ãêA§$]ÈÈù=Å}¿Ë¢ŒãâBô‰ÏÒ•ãU0›Ûh×ÒP¼>¿bß„b|VÈÚçâû±ä˜%$—å‚ ¸¹Ðo‚[Äa$Ñ>Ü8¬f¬¼jŸ1M3(Aßs³¾êoÒàšYÅ´Ux ëc\·=‘Ø· _§]z@™8Ó9¶Ü¤Ý‚Ì¿üC›ÜæI]lS/_S¯Ø$Žœ› ¾$Çê(Kðû-Pð¶ÂV%ÿ´5†Öì”B.}e&Skfñã,>´&à ñ5˜¶P€0b7Œù ip»`âÚ!UÕó™]ÛNuÖ,ÿÛνѳV›%KÕ^#6p»ÍÐ%vÊø UCšðC_蘮$¼Iêü^ …±ðRÅÀ.éœ+¡ÛÒ¤T®ƒÅÝ.¦j+èLT9:ã­Ѓ±Vš=&‘ɹ’ØŠâÞçð7ñ„kÃ:œ§‰ lQ/í@Ã¥” ùwÕO´4ÐQ+Q—ÞKéj•ÑxaOøqÊ.eá‰$ ÈtáXú +Q«˜Ê»ÌÇžØt`ÃL#]¤Í:H„²Qéܬ3Ž˜¯)’êxNŒ¨Yù]ú™¹©ÿŒÓ¥kÿ†&ƒ]YËÅ=epΘœ“€Ì¯˜Ëû¸gbOg !j‚frl£¢Lê.„"ÌŒ®ÐÒÂQýÁ|˃ؽ™kò=Ùò/RØòitÇñ+·Ký%Ñ{Ž’bÜB?°ž#½{gf™‡ôÐÝ,ú^å½kx‘»9D0G„&/‚…¦6 ^-7^gþ³þÐñj.™ÌäÅ®=ý©ËVÈ”ßOù@¹‚ÅŠãô8g;%î»T\(ÉL&f€^,êl‚b‰œ›ùüaÔ`g8ðù8U|„:ЦåŸÖâñðÆ%ÞÄKÅ8Íp>Ô¦»gÙÕL­ð±žö[ª“;~‡ä•Î[|±S#{UbI|û°eúð+:¯( r\a@J£ªsI[vÒ†©ø}üd<í<¿fr'ZŽšñù{ìü½?QÃß~Áa¬µ[é{n„NdïÔaü‘i|Å/NQØo¶™ÿ È0¹Þ¥ •TÚ¬ÄtM›Sz^؉–«eÁÊ·6Ù–n‡‹Û¯^Ӭˡ%³ &µÑ’6¤üˆiJ:|yÐaò0›C{e¨ë¨Á§,áÿuµó6‰',ŽC•AAbµ%ú)@#q>›q™ÒS—¨ã0&'¤„Mò'ŠÑ@Ï.`:ѸÖm%í7$™Á3*æÜÌ @XCäû Ãq3Á›!7xª+m‹–JÙ~½¹®»^á^u¼<=zàjk¡´­5ç@‡ïN§Aåõ…^2VŸDôô¸Îð¼ÛzçÑ[‡ÇÖ¥×s-¯­–¹ÞP@s'O™¼–žWŒf Ixš‡Aô²Ü›©Ú·aÞ»:6¯šÒnØ/›À?Mj723-ƒáÎ ’Lê¾eÔiþ+á%Ð3Ñ _ ‹ƒjíÛ¤¯î#"sÍ>´^Mr÷µ¦…Ï€ÒŸäKE2Ç¥Øñ‚µ 5=éÖ IÕ3â‰]}èa;:ߟ²)IAPù[f°&6 êùZì.›Ž<º5“ó —§¬œ¸]Eÿ’ÆvõTHŠénEÓÛÈiN:Œ”;.Ô•âjJn>ö?0TC÷Ôܯ,õ'gBùþoG‘úéZaý—\É ¥Îp£™ñÅ¿‰¤³>¥þ42¼òŸ-˜?hÔ…Òú¨åè¯9c‘špÊÜ¢=ê2V¡Æ-ÅTÝöc ¬>ÈoøaµR§ ” pzƱée—L î‹Øî—†™æ-r ½Tªp[DÉÕànâH³[ЯØ8v (‘RKi¡ZŸäu˳ 1Ô5çhß@XššO˜Qƒ2¡­ù îAOU\¡ÿW!—Òœä] þKJ3Ž:Ûr¢+Ûy-p€Š¿šbQ¸§h)P—€0À7”˜ *oŸXÄ<¡)¶õ^ù,B×[Ó‘ÜCL¾Ëih'‰-úvú| ¬)\‰PæBnº5|øv$ìýÉõŽØí»& žñ³µz ~fHÝCûáèíÛI“é§çëS[@mÑÒÕÈQœ`»prjññ ‰÷õ(Éô¢Ç=ž$%6=D¡_#ô,ã[jÄÇ,!d¿>Ïù¢/s©Ñy×{¤dÓ°ï°lšE¬íÝñDã*9¬ŒýÓã&ò”E~ˆO§šÓ¥­ *™×h§,#Áİ%¾‘íT$±z7Ù"dN(Û„I_æã(ëÝRr…||ïþX¨â‹dƒŒW‘"«ßBÞwÙÏd)Ï"_-îD"„ZÙ ›ÜDq 8°ÁEþh†‰¾$,“à0ѧŽÞl& Þ~ȨuüDcÒx&5¥Mê•\~AÉ$;²fy-^™òíJ2×Ò@û ÿOQÞ¸ |´cG3ºïµ|ëžWúæ.H:Ç’ê¸ðƱÖiôÎkË~F¦Ÿ/xq®Ë¢y¥$EÏ’«ð¤4°ÌúèЇ§>Ôcs¡ædðyÒïçeCúŠc.²²g„'wtü9-O¬¼I'­óiЮÓQŠ·.µ›{°Ý‚-H÷”6ˆ-ÏVcÄ/Œè›hÄ=+…¯€WÖy*v€ÉûÓ]–÷G†®Þ¿1YŽ©kйdúÊžÞáâùÍ©Ý\i¤v©¦ ®Ð$F¹Í¦Ò‹ð2Oãûø8¨¶uQE;#Äü'€ªˆ£1ÆùQù"‘ Á—ÜÚ=‡<óO…²ƒjüÆMŽj°m@aÖä£x¥#|kqQpœ¢0-·DV’«á†cbIž_ Qìµþô¹…ô.“@W¾ç²?.ÃM#0D¯dø™¿#VÕ~9¸ &V0BÐLJ÷‹@ /sŽxŠþ âÔNkI@Š!¢!rò¾Hk拎rA7ÂÑ‹­/'Žò[†õã{f\¤«“Ø÷ý‡Ž9­°–¢Bèk¶Poã™ »L¤Tp‰rƒ[a-Zm¨:ãš4믆KZyCæ$ ’ŸÙ¿‘f‚?¾’oPÃ4*ö²Dµ|Êàý™íÌ·ýë;®Û©ðtU:¤ÝÆ—T_?´”ŒÖÑô#±ÕµSsæ‚b2;Ž9G{!¢?¯dÄQP™4¹ƒµæ`ÅþzKZ¢R¢­+¬gX„ˆÂ&¹ò+Ú¶eSÂÇ¿¡ -~¨øÎVˆMì²®'é%J5ÏíóîéÞ.,™ìx<üðÖ©, %.uû–ºý—*þngÔp›ŒŠ¨¬LÍœ¥¦Œ«%Ч/Qd2½ÿ½ý„ކ/ÊbÕM=+%½7­å¤ÔR]«_±‹P$|‰ã´Ú«Ÿ°a¯‚P’<¶úx½3`$Sdßh2]ê6¼õ¤&èkbÀ—ºØÌíРAñZ)NQ¬Üà'x9dB€Åâ›x¾9Á¤!ðû•È„gàø9sî*;N¶êLª]†;Ã7jfm?/{˜ Ñåà"e1 »Ä‘ ×ýÍâH‘KÛÒÌpÓÌõŒû %-o V×wÍCx§ÂLÞ6“ O ’Bm¿E³8’& á7Uôì¼;x§žYCÜj“¿˜ë,”Ç4JÒ«£§éy”„z"W98@ä»ÚCÝJÍú˜ê¯ÜG]á….^?oÊÅ2´“æb¦28º&“wPR3`n’Mù`HÈÝfŒ4µ–Œ½€ØwR  Xß-¯í‡†\2zd”ê[Ãõ‹Îjjê>.DÛ¢³Øáêþ†¨ÈÞÑÉ\FmàŽn;¼qgRï¥P;ÅùG£nv©!pDÎäÁ(¯}4- kóºþ~‡N»˜3ï*o4i³êð\ÏÜe‰³.ìŠÓöú˜G{W©}Ñþê=Ed*8íŽÆ kA)f¼BòÞ#ñBêmhÌþü›®í7KAó  Q*@­Œoí0hU š¨ž¬Tž‹Þ_´û=!¢õ÷…ÅÈ’W-‚È1?\AÓT±6WC[„­a>U(´uËÞhï¸W<Çe˜²ÀÀ»Àn-’N·^Cõ)ÿc=xEóÅmì‚õ»3ŠÕÅmšqʋƃ+Dú‘'@ç_;P&ª<ʤi9§œÝxŠj¶òïL-ÿÍ0Z«pø­j¥;¿ U8[8~Ò›îòS"_ê›kæx{øÌr’Æö á>¬Ä‚ŠÈ Nþ§N^è –\Ëû*Ø ,åŠmTæë¶±L2q‚àE:PZÐ]„@…v (ž´sÔtx¬;g>pY¥ÉŠQÃDfÓuѶ®'ZRè;_¼Ú°ælÿ•ÖpP›ýÔ,ô"^ÄHËä+(1Ï;ëÂÚqÂÚÈ<ÃlØÛ¿,|q2!Ác]3ÞzÊÉBDl›é©B‹ç9õøx\f¼­¶,6Mùd\}ljyv7 ^ä3kôvÁ °ÿ`ÃtB Þrr´ÌêUQ ²%ð o ¬Y¶UÏd^©æ( úwºCv"õGíý8«Þ/Þ‰á³ãù¹€^ÐÕç}³møð+âØÿ½@ÿéIÑÏPŠE8iµ¾'­+)Õ:ÒЫTSf gú+ØŽ˜0¤ò}‹ÍÙl—ìÙ•ÊX?Q ?‚oÎ$ô ŸóÖzyñ_BœR¹Å™]§tÓMY\ò—1vt*8ZKñÙñÃË×ôJ_ª]duGVF¹•=jÃK‡T·Í‹T \ötœ­jd pºËà>;è H 긦p„¤Á³Ž‘ZMÓ:V¯Ø¦X»4;ZÌ´æ%©¥ù¥À[È"È5íމX÷s&º}ûÕš¡8’"}õîu[Ý{q•¼3vp¹îâÍù𾇞ÅDõœlÛˆ¦éO¡¼¥¨ëÎe“ž<:Œ¦üÅ—’îÙ^5cV׬!§Îɸ„u=1ó ϧު­ÚÆåÑw:nÁ‚0Ê ;-dñOÓ±—Ã$üâ'Íë‹"£ÿE¤±÷¦±ÆécåïF?¯Žc=–û"iƒjcÛ·ÈŽ‡PœN=3%ŠðÒ“Eƒ=¿a¡ˆàz9Ôj¬ÞúƒL‘6ÕpÛ5YªÏ*šÐ³¥ä2) ì”ûnìyMUk`Eè0ñlöÞR‚&^žy¬w:›w9Œœ°v3ótÔòK€˜!£Ý‰Šÿžo¸~aõ›[Yä |¶lè›á ¯yÛÈVÛ1ë ùܪ¬[£Ÿ¬UŒ‰úU /sþ÷\§§,ßÉœ4#ͪ›Zùl}ò!K©¾(3ªÍa±‹c„Hˆwa3ûu%ò Rï!·@ôS™Tº©uCŒŠ{øXÓ–?7× Ú’*Ž^ŽÕ°´TÂÛ®4‡e…ª[EƒIyK¬/Ùrw‚Í«Çt~bc‚‹—ŒH›ò̆ ”'š=`tB¦.ÓÔmn\÷ÐÏÓÍŽEêù|Îhs »°æ3J•ŠðH¹E¹Yš oNwQQýõüÑŧ‚Ÿ_× =±…ª­Îìá ê•ßKÊ‚UE‹W|ܬF²«P.Àü¨h®°õmŒS¦ „ªš~îîÖèuƒ\Q¹™}G ˜÷–l(ß;©€N'-UË‘CNÚöO††ãÜ=ÚE;À:ƒ7I¢v|°Q°Wc’µ< ÌÁšÿ:›kbG UÂ.—;ZfÊy1Ñêy—ïŸòžK«´jdÍ‘§ó•œÈ"“$ƒå±'æ\MLo?jã!À^Ø?Ñpý› ÕM:©.’c2Î §—˜ŽBT¢´!/s‚Xú«¯gV«~ÎÀ;¢ÖëÀ®#W(ú¡µ²h¦ºÈ@ð`"#Ý|p0ýîàl,9—l–oºn3ÜEð×Fy›´ªûƒG¤…—£^æ#NÄmDÈ®í1±v¼\²±^Ì$´™F† ‘ON¶ÿ|û¤ªÔ@›¯Õ ¤”Ón©b ÙTï1‰kÒ§¯ÔÉö4·tiüB@@¹ñÁ5ÇÊ=îx$U¼RÞs‚Í,÷Ro ¶¼nzÉäRðZbRW-ÁŠäüé©{Îà%žÒcÎãƒÏ©X ¸\Ì®ÄzZv0ƒ€y”a¬™ÜÁLþv~ ¢1’’ÜñýVë¡ k.öG÷r · VÄ?ñ/.Ûµ c1²ï+нÚÜZ€ª‚ 3n4V¿_RæÖ®óƒÞC†9TæzóÓu3ê¥ þ ,Ã,SH,¯Œ•Oq7¯9¶Š½wG|™eõïÁazkeë¦è{·ÿÁÅšãÎýÿ‹‰ûK»ÑF¬Çáö%§)Ñw$åFã-SJú^ î`NéíÿqBðŽ(¼Í/ßÃk‘Q_¤§WE“›ÔðÄÚ¥Ç|÷¡A†—;’¾èj/gv)òÁ!è)”vñäÒ½›7ÀŽÀf%é\›Ð$GÉÃËNpwþ8ÿyh½g/•É"4nFãÁ‰j¸qÃïÆb«ÎEüwñv¿Ý=2 zß]F;qV©¾ 9‰Fç›;æëVz^54ýEwÿÏïyL(ƒLû€Iõ f4B7ÿLÉŒŠ·û|ôÓ”PÀ}Ž„ÇÆŒjfR&kkD1ß²1I²a6¹ü´ºµT臑ÀÂz/ˆ’ 'åÊbji/Z畟æðਢq ¥Ï8sä΃÷ÛÞ²¦ìÏ^i![šQ>- З6:¾í årã€e™òèEü!²Ý·xkuÃvÐY«»ðÖÅGµ?ºüYbÎ/íŽp3ú;\Ñå¡f.·r+iLjCßÑ †€­_dˆsDë“C Ö7n‰ák7 ²D¾èŽy ~Ï”6 Òv„6@Oe Oïù k\â~žÙ)2s(¼xå)û<DÏ»3FŸ.Ð,áRÈ€ 8(zb¨Œ6À;E‘5qÅÙY¿Ýý…¨Ë2lÇâÎ0 š`ç|mêÀr®l ÜŽÿ6ý%îþ´ù€¤œÙÓÂÝQBvRm•º &8v†KVµzk õ4®Ê£ñ¥HÖ¥f%- TJGðQµOÙ) 3Úù“j¹‰:=ò—  Jz•àõ©›–=§WrY—¢½†4ê„ ªŠ£ ]OE¯Ǻzô¥öR]Û0&yÀì.Î0mõ,yoÜ#ˆT?–?BÖߨ}Ù%‘&܇IJûŠo,^Í£{¦«k›;}¾EÇUýŠ)Hë(p‚©Ägàí$z@^”A‚NBCðÄÅ÷¦gK—õHMýžÙï”_Tƒ'K\@3aN‹üQpZçà›Dc¾[élínÅáÄ+\ÖhÚ·œÇ‚slMç¡ÿ“)«]$dåbá¦AWðí^é³¼óø,—¦ßÞ 3ù“­ÈJC²j|"oöYQ¾ì4QO­m FàÿK°þù–ÔQÄöbt™¯@­ØbÿЧЧÒÊ*ü]*x5H‰3šƒ~*¥f¶QT\[¸á)ë¿B‚K'ü‡ÎàÖÒ p“ M„àÀ¹â z˜Ï ª­‰ãÃrÂ2Üæÿ\feŠñxðSu]CÏϲ…X”þjÄÓ"®w¨mª'Q½“FÑzßGè GS‰;îÕvêïCBE¦mÝZ;/ÀÃñ¤ÝcNþ»g¼šm££»6 „~Sg¸ö€“0ž¾ÞOáv¿,LN¹Oš÷Uëí„>—É´Á tni\áéá$‰Æ3Ï^Ý™iuü«Cø¤8‰ÿyî¾/Lkªp[l#æo,g6©ìöòŽêö|r†R8ËiIv‚·ºðËñX¾Iä2…´:”¢±¢ã(Q˜° 8–PhlÂl®ØC¸3ÙMüÝ!eù=9½Ÿw<ª†‚iØx^È­½ÿ„W©F] ëôO¿6ç¢ü‘óÔÕVfMŒŸ½mÊ1±kˆ$ÉX™qF›Žƒ„JZ ÛÐíµ6®¾,ò‡ÉµÛÍ•€²~Ü9Çc?ù¸©¸ S±Í1­‡!ž£"HSü©ßvk÷›ù%øÎX¹]ØÒ¹‰ÙÖÂh¿£Gv|[n€[×}ë®Þ“Âúä/·Î]Í,+Ðø’Œà Áèÿ«’Ž\„B,´tº ™ßÿç¤Ä}GþµÈ<ÝŸÄß²à†œ^s¦vûÀ¥®Ñ€èxÞŠbTBMD—øN×:¯Õß5óaýÊÌMY°Wq½ª¤Ab Çý{ÙÎC׃~’ZõŽ-&Õù )B;%„Y1ÿ]äÉ2[Ö>JÎìù¤G)lÜÚ¯EAÆÛô¾°[+>ÑÆõúaH€K0èïl;O³¦ qzµ#pãíβúìÄ+èÛdz ’ðt¿ò< ÁÊñžj­'¡N‡óØñAîèÞ–Î`—ªs8ÑvìòZ¢eˆ¤´ýãku]ÏC¬à Ñ3Hxj!N€õœï%ÕF$›´± É¶qžï.bÛ/:d¸2î“êˆëP9FÉÈ0*©ãßB3zØÃ™¢˜&ñž‘ñ7›ò²NJµpŽZÔ3 #Ç ‡×ß×]Û°©ùå ¡¿j«' tMµêTx!Ø¥ k’*åËÈÚ³õÅ*oÙ†–¿!¢•±Ûä©Re›Óq}=[‡Ô‘Xi"kï/Ú\)j¼/õÿ–5`ìãP ^z;]Üݨe­ÛÂ52K¬ÛÁ­…‹Eˆ]ù('Y¤ê¨¿si©¸…2xÃ¥PÆ‘\­X†Ðœ½âwêuñnˆl˼ ;ÿG›&`o¼ŸA£Âªú:Wä"9‘•^ ;ð2Î,þõè\ÅCxñH3ìó["eؾHXø =C'ëµh5´ÅNrÕKH„Û¥‹ÿqø3e™¬X7åRŒ¿FLåôMjŽCRÔ¯¬.lեïq:„€XÕwâ"®<ÊÑO¿Ù73Š.&œ9,¦ñæPÑ¥âôÊvàf·én¥ŽÏè3noÙ&ìŸ4T,ïÓƒG çRÕA¥;5V±6íëê‹Ù\ØûöèÔYF0*ä„ʉ“ò*–=Ø«ÕÔ¿Š,¬ÓÜëæÄV×{[¬ÊûUÑYJª@2À}Y(Ák§Àcnî†;ŒÔ¨î T¨“ÂAohÕhíÛ[ ¹Ì—X£{”µ*ûwÏ+ØËU)ÞoX YéRH´ÖæåÕÉ…x¢ÍŠèœOÉY»œN/îõWX/¾úÊí¯xáµ…TÞX]ÄšA‚ê©Ý­sˆ+Dhˆh å-ſ˃ؾ !g0ÒÎ™Ž¸T-dZ넇$Éa ?ísËÀßp?Á-#NÝSpdZÍ> êE'ÛË.Tmp%MŽ?·B8ÏEúÈ’Åz®<wAËåí¥"L±Æ . œ¤ƒÿ¡))¼ÙT[›ÄCƒExÀè2½X¨ÌöÏoÊI\lX.ö2x ŸsÖRNIâêkŠ •6ö½<%™ml¾ŽbûûöÖ9iÃGY}± ¹ek³%°_o´­zÉÀÚEM+D•zXÍ–:×`]XHÇÌ/ÆA†~t(·=#–zZ;˂ğv þÄHå§Ó ‚=Qþ<Ð\ôÂÓÀ¨d¯‰”ýk›ñtaI¹{ÔŽc´:åÜèU}@¢ãö§Ð?áiõêÅõ6(?Ûa ý]‹öÎS3ûefš w‡§…uG•OÑÀn gc©õbÝ#' ƒÉ”"6©…²©ß‚X3õ~}ó›)e)pØX{Òù}˜N¢oÐF»¡Crû_;GݽDT?ßÝù;ä_„â¿â;`Äþ×öy,mÃH\@£ÛŽ”é·è;èï ­I‚uoˆºi–Ò6ò²ª\Bt³-§€váCýºò4ÖAæ1q\LÀÖÏ“K¡ÐWÒ´1ZûÌw Ò}°HDSùp!ü¸(Á”û&±t*ΧêV@*Ì3°I³åyÌ=h°vÿðýö[ô´šÈ_X¸C´í?Ân—Û¥»ŸÚ-&~ƒb×)1'—ãð$ˆm›fìü_üEdNt}e´XþÓ@i&ãoÀ¡û¯’¼TC]@S>Æâ$E¬Ó¿Ë= †À vò²êBA*‹¶=ý º4ÙõûýsûèªZ/Öá‚g-ßßÕ“‡ã²vž X' :L tþNêTkù´¹ÊˆI»¹×nâô|èkø´ÇddˆìˆElW4k<ÊbvVtivóm,Ý·|±÷Ójc×±“gOÐæ5¬wÝO%êW7„™•t ²C+zý +Æ| U Á„€B óJ®ü}¾Ÿ´w(†s Y´i uDâŸ`ÐmP““t}ƒ(jj?þ|Ú-Š&hÓ_)xVœMì±|Ïfþ±éž.ÛGŠßX›ɬ ‡ïžäKÎçàŽß;èoßÙ1®ôªç#è ­¿@%f¾2;Oãéj¿ØûÀ9"E}_º‹Ý]Ôžœ«¶ jú¾ˆÉÆœMÍ£«ëJŒ£+åº`òñöä|ü}lº”[Ìù™”wÙûØ+jµÀÃ¥hBU&Ûñ2ähKâ¢ÎŽQmê ñ³ï¨N.y:Ð;–ä˜4`/eaÍìçÚòvÁâ>„<í!2†œÇpN»_£Pú­ø9¤§‡¶–x ÞÈÜ»ˆÈl' 46^ñäОÌÁ#íš­£¤Û¼IÂÁÈêQKÖ_  ËÔÚN–ÝF]L Õ†ÊÃ8µ‚'\’Wϰüã[l "Åt)Zíg¹f̆ÐåÄ÷ùÎVêÎàw¢åûv\îvϸŽÌ¦ã—DŤ?}ƒÈá_ÌÓ$¤,‘ºÅÊÓh¿ŠŽ+å’p®Ôn:˜ÖËäqó¼›äç„}yåË^tmRûÇ>ÿ XsǼ4_åé5ìÇRq–7vNˆ9NÿûÖ~ߟuî;…Þ e鎈–*¨²^ÝfË1ù—­ø]>Ó\‘ºÙ™tå-vK:Ó×ßÃÁ Çý:lô=äÙpSy[EÔª%šèzýz>—¾5MDBÅ]w+b,ðXžùI^Ì?[JýWk"s3ž¨­ÆÓ·¶øpMÓF„îodúa¸À=%t^ÁÓ6<§ÅäÈ=&u31s9°b1LrhÖiðz"ÂÎ;z›z;üCHÎ)ܨ[x¦5½u‡Ô,Q6ÿí¶ø–, Ôú¤XÌ”:EW(]÷髼ڶ­ÙºÖC1:{—ɇD*.Q÷sÂÈ*®Ž°eÝïó4è}š™j©E.¥hÌøK®ÓX wºÃ~wÈÔlbf‡õ„/^íá¢/À?Àúa¢gnj¦€–Ôl¾å0Ž*½Ý³Ü$z}«dö@lëœe ˆ3ñ殓±é.æÐ¸º ïúTµÈ8¿&þðxýJ´‹CFœ¾£ã­Ü<‘¬¦\ǽ ó-D't7=Öó™rM,[œ#7Xîkf=Ù‡˜º"J"NÀöéð®Áê"Aþs&Þ o®6RÓ@ýÅ×}_.E5‹!3K+ÌdÇ\noËK•O@š—“ùCp'ØŸ9L(›w¤¶Ð\±}ŽC®3lqâè:l ôÕ´!S0 Äû_vˆàÁÎS î€rùËO&ªXÚÔ -ù22'D}¡’Ve˼@)Ö]æÚ3°&=Á{ ¿¶àDÏm€Àþƒœ¨W7â‘uf…±¼U ãÏbW²aïS…nwÀ:` Álýƒ7`–'Ûú["Ø„QÝã â*|}V¿Y”¥à­ºÀ•%ÝJ«—>öËÖ ÂsñÜO›it-6 HÒ­àV†EP²t>/ì ÖϲèçÕF5å&#š*eŽ_Z½h36ªMº<é=K¬Žæ54ULÒa8ú[LjƳÉj†¸ÇiÎ-Úéÿ=l{ot­™`ì§T˜çȧ뾲UAf}8—Š n󎳿 ï0u«*‚ùôû¾ÐÙ³âů;hs)½®báÀ™F¦Êì8!™ìÙM8I‘ Êòvò^ÏBu˜x}>îUVk±·z”Š†Í¡'”ǵÌl2ÀÝ5N7J÷¥·Ë.ãE¯=jfilVigwUä­Æîx ºPÐí2‰êo^º›ÄýQ3¼ Gßøa©È$Ýûªó;WÒ‰9\ p“¢ *%â%„Ò$Þ|N.¶}àãYkˆ×‡g$ÉøÑK=ê5_h0•Œ½[îÜ,¯ÄÝì4 ¦ßmÖˆõ^Ä8û*ç ±y`^å)˲£ÖSWp¶ÏÿIöü•Ûo R+ÒÑp]'LÒŠŒíBy³ëè©!h54²Q äé×#ÊÝŠT#]ÖŠhKv-µö­yØŸéGe"VjpS™­´–ØPÿ=â/oÙâþsxp+ÉD»;-ãL†“ ùS}ºzïcI¡P¥v¨…±ùTtÙJw¶7q¶?©íßû¤#I¦ mh ¤ð„m?¨ëÄ“=ì m Í¼&.¬R«ã¹¸'ŒýU5/^öËvwM4RšLÇÅ6ÿyYEiC’FÉ>_i½°ZD8l°êéîCÙ?¬§ Dº`ó¥0à[Õb9ÜduÍ>ZÒƒP'ÞɶDš&lÈk•Û…j¾vs]Ïx¥†<ÚñüQyš>³ >œû£cð’ ñcZ]Ñ?¨þ¤–Ð]hÕNÎ~S3:ê°ÐÑ#?9éé¾Ûv·±³ž9«Q+Ñ=º­,gE7‡ˆ•Ž)8¢NùŽxþá«Z#‘Í)#h|d;ªKÉÄ\˜hç˜"Wp̵>±%s¿Ë}, …ôêN{!gœ¡fà´ä/”ƒ_לPxïÄPÊ«lÿûõ*_–É_qÐ>áí”b8N¬ÎŠÜ<ƆPøñ 6¢i³C¾mD¥uO”•2ÄÚVÐ׸—n M˜uðb>˺e“álóF`Œ.£zœ‡’m!®+3ÁÉÜ·^œEúä Š‹.±ÝG¦ [."c $¦°¢g7ó™·˜c¨OËãF®!Ô”i70¬÷cLL‰Ö9;™B×y0¼h9kWt|ö×»ø~·Éýý°0é­ej1|,<1¹‰‚žYì˜n# ö³Ëñsð²øÑ3½#}8K®©+cý{†ÛvCÛÖÌð Õ{Fd$VrtgƒY}·òdîË訌hðpê=qØ„úžQºê#b̪?*/ÆUþÖ1¶¦)a³ŸjÔ±m˜ê~†NÄœ¦/ûL1p O,a¤ÝlC·.®»&½ú-1ôƒZòu™ †)Î7ÚIéÙ§¹á”b6=ýâéy"\Û„Ä40±{ª9„䓜çæq­åÌ5º`"ÒLZt ë Þ7—Ó–_MZoÛ[³•s•Æ«Ÿ'“¨;sòMåñ¡§ÓØa­¶nÍ4ÖÕwQ\öZŸT>fâtÔñþq«.óß×õ‚…i¼³ÃŽr'eÚòºùG[­{„A O¢ðÌ:Âô›¶›¡Á›·FˆMÏ›Ryò>0ß_wŽÉ¨Âû£ õ›Mš€zÃÕ³3{’ÎÉî¦HiŽœÊLEG²AkÊ!–†\Wh1uàý‹l–Aúò¤à[ùnE,µòê9p¨òP³÷~1Ž2ƒs ncR!‹Ú]¯c¦µ' °>à ȲUØEÿ¸Š‹ŒâÝH:MŒ0³)É {þÎþœ;±Å¿´ß|é Rá‚=ÌžR‚¶Ëˆ5›ø˜> œ!h‡&PØ *ukló8«è(曚ÝNJm6îâ"ÞØì¼Ÿ÷„UqB'„ gz'ñÜÛ¹•ßâ§¶]ØSiKþ¤$€;‘•‹Ëú|‰ÏщîL7Óaäá×TE‹ÆÆ¥Vï¯:B7rÈ.Ë)ËY`:VÖWÖ¯0›¢Òí©MîâÏå wÂd}˪¼²8çÄÆTQä¯y-øhµp‹©3ÝŸ;ìªt¦åG &Yî¡»ööãáûŠø$ï$ÉéQu/ÆÃgù Àå°K\ãWL`e‰C`$Þâ«Q?™ž}mž”ÖðÚ̶V&¨6d†áÆã0NoºŒ"{iQ0"Œ†X$”:µÑ™Q&„±ÒOˆ¢Á^,xñÎ$?öŸ¡¤‰Ý‹Í&°¥4f˜ͺ½†Ê£L—õFú}ù…ùÅÞê‹ÎtV.ËÿŒïËkòÌmXÊèóx—é³AÅõ¬á˜ã¶Ä;Gö­²îÛ¡][4‰@N­TéZ&šÊRH>ˆç¿æ³RÐß’LÞ Šs¶©®öUR|Õl Ž|cÚ‡9wÙú„hØtÉ*Ÿ?µ³ézö÷½v†W ¶tMkµŒeZˆX ~…PåPÄ«råoȯ§Õ}0šáøZ 9†c¡Ë8û^flrf^Á7KrÃyËÁ]®×NÛV =u.Ö Ï…Ã嬨¥Mv* ¥!Ý&„102nb›~ÑY*w;j "½k—“kåw,ž[ÌÒ³(1#*–27Ÿ×LùrÁ6æµ}«£EgFN]Ðm»5¦J­pøAñqáÚ $‡ÕÔ~9sós¯÷'ð*ÏX”†ÌiJtÔû?–Óõ¡x#q“ÍÄrëîÂT^:¦dS$˜zÅöæú±ª5¹;ÃSˆ¦2(‘že1iÎ6¾ðub:Hsºúuè* 6 íï5¯‚^…Ԩˀã>“Û?¥ÑÇM›v Wwý¸ó› üô1ï{¼ðÞ•Ú%—ʼnëx’.‘ê’jÑht|0(ßþ–@JùqƒjÈ ©R[z%I„ŒøŒé¸&, 2zmÌ—Áõt%|š7™ È¬®j'°—hñ"]g)ä\êz£¦f:8Ðû—S«…ÓK m„¯ îëYWiÔ»+‰´Ì™óåâFŒ8'r(`éJKW€¸®·‰“§íoúeÕë;Ï5œ%Î>2©ÿ_˜ª^óI´†˶p•e_ÔÚY’,둧굸à.fn9\÷㤖ÛõF»¨íBgE5ØÝKv¿)iÜJ7}{­Xàí¢aU‡æ‘½Ç íâÃüúŸQJa|:íõHþ—¿»z³f2¶Òq£DL›wöü G¡‚®È,½Op!®×ú"BiIŽÖXWùþ-æ!¸0ÖèÌÝ^ûã˜áËÝhpÖ5( ØdVÁ\ïóª‘Ì2w€p« Í-‡Ðc;AÕõ›àu\5Ç ‡ð]D>‡ƒ+ß n‚”ß•)`€˜*±©S1wùˆ [µRîæëttå3X,*L»‘.ÀÐ\×ÑžM —´m¡"Cwn®šæ±P çú®OÆñæ{[S)±Ç·3»}hòâØ±üæÅÍ«:~²€Pï^ ‡…5X>–ªóÖ‰)«Ò Ø;ÚÍçÛJÂD"ö’ W­Ÿø…äÃñ”`‘µÏäÉl@âE®tãx³ÉýÕ†>ó{ÚrºsÒÃí.Íöݬ?oþ® ÛÇ,Ôom 2š±*|׫˟ìuÛÇ¡ÆÃrµ¦ìÙÍŸrÃÖ©·,ñ¦âkjöæ§¼$éFOµr›ÐOÈÈfvâ ‹Œã òéý³ôp:•ŽË÷P;.!ÙêÍ`7ÛLÀÝE|[…’Ñ€óúë‹ûÌý'¼C­ÀaÆO¢sÔcî§ýÉt©Lÿ¨J˼ Éf© ÁŠ6{±ZÔ¬e÷fçc1¦.‡ƒ…Ž­­ >ÀN …âä À:ohÅÜ8À§fc¦(ýÛsEOª .o ƹbhèIEÁIˆ’Óaw˜A_0ëPì¼åb§×¼„èÄöpqWù“ø‰é5¥»4÷ÌŒ yƒ—ò¶¡²X‰‘Y?ôpʼnï€W%zjMMA`”¡;úäx?}’"y-9Óí€qóñIþL)DlØëà9©öÍÈMÛ»ÿ‹¡ïIœm½ÿoÁã„ÌóÆó†&£Pw¦<\W]¼Ò‘K™m~Y¦ÍlEöFtª5¨ 1ó73wÍ:<™§ÑVbG˜dÇsDZ3†%ƒ—h`*ʤ³ª›G{Ó^QËõðï—šQþTƒhžÃY˜ªÐ =]Z®£|¢Œ(«ÈÜ‘h×,ÿ…þCwâ¶µòªìàjͼ*Î O¨ŒÒŒò)…2@ZW÷»~¾Õw?Ø  ø„lÐJKùlñM­rWŽ"Úéä%9@3è‡w$¡5³íðÈݨ÷Á]š:Ó ä+Ÿ„…_“æ(êŸÕÚˆ‚º3x™þ+0^œÉé pk‹âL6D½p;5œxY/b0ï>$U,eÚ”¥˜5gÎ`¿°©ûU\J-S‹MãCÒZ •„FÆ…X=RîË÷ˆ¢j%G»Ó]™%'^X—Š™“ïΑ$À§°Ý¨Ê3%ð€¿' \nð(Ê骳n*Œ+Ÿ¯t†‹~¬Yíçé—¹úÏ“pÑæÛ®H4f·Ô ŸvÍ¿2þ4=$áwÜX"…·£ÅáiYÒ5Ý5=xØe>н:”èŒ:€k€Ïω70ÇÃk'Sq:sç]ÐEÚ%Ìv“ÜV*G•—˜,õ–痡ðחJ‰I9ÿAÎGE xMãÅ·›aõÑê=ƒåKV°ÁkÜ;ݳÓÇF驪/½Á,kçbú®‰¬Ñì4½7+juóê§v#Q ïs ê²úï `Ä?9á%ÚÚMéôʤd@|P2–`€¨Z°í+ã]*uôÄfFÿ%؉մ™N=IÅšFå›Eºœ ”a>DbCÛ598O½¥~,øþŸÄÀÅþ°Á“22%û&°¥ôgÌR¬ë[ 82©-I>Ë?U)à4II´$ÎÀž Û-‡j|pˆˆz¥Ðh“‘é3ôô»'­k÷ÕÔ­/¸žüò49q~F¬`_†×~ö队ñú®·'Q,‹úU anÍ2!b˜Ê F§[š½~Ô·”uK‚Î@g`gô_í½tÊÜÃ]‡²)èýòpŸºm•¶^%¹7ÄvVý¥r~ŒMæÙjÂI¶ŒÆ[Å ËO±´¼ºâL#m-ÉTæáë5³,Û´ÞÝQÐGŠU…Xÿp{G¨öë$ÔÉ ¦. 5 º]àñˆéMÿ×köÍk©MoÓÿd°©é:WSîk½sšIB BCó–lGÞÔìøÊ‹¨£8"º½¬?rz#¨awY²NÁô {õÆ@À ˜:´Âä¬j¯4‘© GØh¿ m¦¦BÖÙføÃbÏÜ“^Ï™»Û®·¦Êf‹¡ÙyÌ·©{¿Å“Œ^mª/¯mÃÞ½‡è(w?n½)mäÈ]r6åw"Ç5ïŒ0Iaõ®ìæ¼Ëï7§Ÿ×騄ªGÙ|Á‘º‡d¶åû ÈõFî…#L¹'*±Q†áF ,ÿ×b=ÄEƒÑ»`ø¡ºÌŸ]K2ýÍy`„^-±kªEªw¸iÑõãj*pjÍPêðœ¡2/wq‰‚O&A&S“ĉ\uJØ QÁ& l›‚IÜxý³…Cà Žáäñ–{Dæ‰;Ï&½ ‰¹ôÍŽÎÉKÁã´ÉA[ y¨ Uæ±¹ÎÒ²‘ þô[lJ· ¢¬ŒæÈã:k¸mþáÖA³‰7bRõ°Œ„é4¸~ѳ=àÎ^¯¾ 2Y+T‚g9T²AˆÏF²pb1‰cÏF‘¼DzvÞ%{iV‡gükW„Z+Çê³L#ÅùöµˆÏ7¥?—ghŸª+ 1º%ÞY—б ¦Çy¤“ÌÄiü¬ÂX_x]Έ:‚°Ê—qºC­—¤Œð,»˜Ë}îòú´‘Š ¦Mªhäm8–€uÖ,[[†SHk,¥¥íêcTƒGˆ‰ãU U¸hÒyÜ@ÀÍ%@~ÄjŸu~©”­S¦+@¥Ô(´¥_¿æ÷ãÖfNûÕÅ]_ v‘cÍT¤m×É|¿ôžä°Äðc¢ÇE“3¸ÿj=¡WAÂx¾nŽ!ªR|(#·8çþ—jˆä}ìóªË–8Ý»´_Üôì¯ÛÂ!›tÝÑöÄ]b×aÌ5ùpÌjløúÔÚ†§¼é÷ÄN£SûpÁù'ú×¶Téѽ®é"ÚfCB‡‚¢ù£‹Uº”{½Qy#¼,à Óƒÿ‘©¤´ìònznÑVä@ÉG¾Yp„bUÿ÷¾à¤´é‚Š‚YÕŠýIçëá·©vÜUëšu;^¬IÛ\¨4Å×oTñ16ÿ ™’µf¥(À൵;ž›ÕÙ&•þц Uk¡L$ž7£o²?çŠ7ÌÔ”šõ\•åÚ'-™•Ú–°€‡åZטàC@eêÀ"­«;Þª^„®¿Í ]o£ÿÞ\àÓß Û’èÅë­çHŸÜXµ³u›©Çß¿£¡â÷<'ÕN=»7¸û„8Ùgrú¶æ,‰À¶jp~ÅùbwÒo|™ÀÌùóî‹Ö,õ¦/P£]™(0¬à£VûSq nàåg‰æVJ.!•0\GS!ßö2Çr,f|ὄ_Ýé€.î¬fßšÀò&9ê'Çóóƒ\Ñù€eílù1v¼³"Tßu% Ýù$„Ìc‹¸á_pÇã'K°<<à2Ì‘S˜jû.l"ÇÜ´äúªäò"Î-%ŠõÚrФøx>Ë-+{í@—^uSÓ$2!ec1‰CWÚ}ü¡N…g¬7”ôÕ¬€ŽßúH: {gE]Å$^d«Šeíu¯mš¶ŠÉæŒ}‘'¥VøWçÂݪտÚñIͪâ¢X»H¸øi¶×½swÀL=Ù(ÌCæÃ¤dL`‰>¤ðTà«¡a©™úÚ¿Ñ™¾¤”Eà=-Îæ#<¼nF®†Ò;‰÷AΜvœ!þ âFe5B\ÎÎs|À¶ðüi4tKþ…Â[«ÈD¹Æà° ,E@Oó~-[9ÚDfæ% BE‡ò“çh?ÜmÆ™x€ôÓý(~¯í!ü÷êLŸôrˆ¬Ï3®×w/unV®ý’áÅ+`åO'·œä)±×A/PžNüÍaíöcûz‘õ€Õ é‹sæp¯ËÂŒ"9Œ¢Ñeû'{-‘¡yÆ®ÃI#x-$y&¶“ H9J¹^0òèÃø ³ÛÊù8¹!ÏžÆB?Áž&3Š4]¥øÀ¹ëÍ,õÿi%íWI ®¡§ûU›Qœ÷ŽæJM&­†f›Y—ïGi)@Tk2›#coœT`Ðnü¶¿®ì7`6tdPKÌf‹ßÈpÈE:Ö€dì-\»õK÷%h[‘µ3ŸY·&åüe+è¤Î¬Ê}1Uì›Dÿ&L~æ³!G4ל ÿ|A¾°îáŸlä¸7ì ÿƃ}(/Æv†GA Zÿ¨îfåJGŠ®üª]¶*‚&’ïÿ<]Ò5cÒþÂ1–a ´fö™¹–oPWE7cå`ñîâoO*åÓÿ/muþÚ/¡áúµ7ÄFy4¥¤Æ…㪉]ŸÇ=ÉÓa{ÉÇÈzS°}0g)_š20­ý”õÁ!mSI\ÒßdÕ7N~½µJkÉ2ÍÅiáMøW×±êÕù© ˜N°¯\@Ÿ 4IäN#+ÄšÞòrΧ¿±¯g„e»x&[ìî7âýÝ5xkè +±¹¦ZéGm. çÁqZÙVwΗr«‹Ó×ÈÑÇcyÛ"D ÃmJoo¹°võ8i+üÁùݽ µG2ƒ¶óhÝMcÍÕT6—#þ&<Í”²Á¢Fê Úóç5$‰ù(âK—œ\êÞíÌ‚ù˜Û>ìfPÚ0m7S…šzâoF“D©¤® Yõ%{¡”±yOîe5t [—ñÑ6SuýY,iLh ®ÿ:;¡u‡Zy~hN~>spTö·k`?]ÛüGà¾lØyþíÇ­†Œ¿Yž#ÉLj°ýaôë=+—{G{@rç7¤dO’( š‹õ[­¢§h·ô,Dè´¯ Àfoyx91»œÕkÝ• ÆK 2Ö\sÞe£è ÿUy.Ç_ˆp7¶ã>« G {LÔÖN)U‘‚Öîe®êW‚õ›¼‹JfîBý=¦<ÛͶK¿5B©bvÙ0ž,á°æÑ»º©Ø( |~Þ§ v«2Æ@³´‚ÐÌ$ÿh}VøáH©öŽp¬‚QÀll¨}tzÁÈÆ&¤?ÙÛIùÓ‚Zoé…Ç‘ïHÒ=Á±ñåO›À ÷À<€ÏÉÇéÊGÍs]Ÿú¢xñÕ¶„&[Uðª‚æï/!të§N²£÷»1õ€êü¦KºÏ:ñ‚Ìß@x‘ ðñÿW£3—S×J5SÓ_òW/èøIW/ƒ­Ã‘E™2Þ/uJs(wgÃ8|øæPköhP”EÜüU¦+på¼Ûù—^X¤O.™Œn{I e-µŽy@·ä ­ùåÁ¡¸xgSLƒÖ’~+&ÅNòåÌ[ =N•&šw^½^\ÛÃßqe§Îê Q6:òÅr}g,?æmyìÞÀX ¢ \ÚÓèþkZáï"õ‡®R˜¼–Êôly—ËÍQêË÷ã)Mn¥P›¬q¦æ&tÐ#=ÏÀqYýZäÚ-µïO4Z¼;¯H¦r±ñ B|Æ Ü!Ù³çü1ÃI-ËU›þ¬·(ý>u„€!3iÕaæ¥à&ð#V°*_“h´ÕÿéÓT¾ˆ+aÜ5VõÓ¶ {÷Å'‡Á~ˆE[دWÆì¯fœ8±,.‘$8Ûª¢Ë óx.wî–-U€"ÁHÐ$b DÀzq¨âô†_ÏEÊ£TåV±¾-BiGmÌ9\馯šúĽõ  ðº¥_Ö#¸t¶á˜üÎ7"órÆà’6PÅæßÜù¶bʶƒâfˆÅ÷(«>U×zpJ%ÿ2à zgÖ^fIgM%då¥/³PjûßÝYž¶Ûé#PšÒAc»0êêØOyqGÜÍÉLò}žÕ&wu¤4Ž0ÊäOqGr —æ×ÑÔ•à9µ¤"F“r!o›?Xàj³Çõ+]_….ñùlÌÉ®$2ü5AËr`}M²ÛC©UÇ8YÖÝA~ê4„6pz´CãžVÇWQ…¸<^ÁD ¢y[•¶„Ô;u¹ 3HIHŠ˜ ƒr'-øxq£^ÔÆ¡s½®O+«\¡’êÁ‘Dõž#ôüÏ@êtKvNC§‡q–îKhͳ”&”…„­kùœâqè?$ÞŸ Z$Nä\gO¾êwr®—ÓBLÂ^¢ª»1íH-„·ŒðŒÄ’¸¸b‹<£—ª˜ݧ k¾{q»gvgîðÈ#nÝ‚îjñV¸Êx÷Ù4ž¸p¦ñ↫||ïç³bå_ÈnòÇÐGÚž`Y“5ÝÛsMbOú/ç ¨0Ávmú`úW}WÊ"÷méz2 ‡¾hÍQsøÏZý4 ±¤#¢ó‚‰èömGÿ‰. r€-a.]±êàÕ¯î€&™üŠçWõœš³bK_ ˜L}uá“ x¢=г•õ¤Y¾ž„»Ø`¼l Á ¤IûæxªŸ/€æÑ(Hf5_…3l¥E$cfyߎŒxô®s@$ŠºBá×Ê3™I½ÝGbÔ…õ1^‹®¶×ð^h| ¡¡‹Ã †!5Ext¬Œá[;LHµA~ü'žá¥Xçº1wk°5A…Ú††wá¶nêm3–µx…QÿÚ­/xY Ú;޶!®ßb7Zröb˜ áBÈÄ`1o»‚éí"¯ZÙææ´i ¾š‰+w‹¤j·ßU„úWî·‘ ¡¯xÇ8qZq/áðüý5à „.‡ñ‹ÚÒÜ‚ZxšJ4’þò¡« ß÷/èXôïÝž‚:M¯:¸’[.ÙVÛiGŸQï ×?Š–S%ŽéܪlŒ¨c¤Åìt=kˆÊÅ÷‘5ßJñ%ÿŒ\‘™%›#¬…¸ûÔÿë‡3±ŸN/؈^Ÿäè É‹pÒ8[Øi$RÁ¤,ëöëŽD¥ÕrH·—pZ<š‘2@r"S Y ‘üvæì€ÁNÚbœ$RÊÿÁplq2Ô¾v§¯µîX`IÏiöuN•ƒ>¢ßÂòžt•zÃ7Æo+õ åÙ0zjÍWo-¬ÙR+0ãÜHA…ðˆRíÛx8¦ÌÀ6¡@ËŽ r©owÌ1"l™§CæçºG„"ÞWø¾™¦efçyáC1ׯ4N¡×š–¡cø@ÑE=Æ\eO­•§$Øg1H.¸Ú“)q1A¾jéƒþzÝj¯Ô? `žøo÷ïàˆy…}da8ΨR;ý6 !üÊÖ<û¥ì¥ ¶ùcÍÌÑí©åìöÁn¬¾öc¢k¬HžMfÓ¿«æu£ ]'üPÂÿKÉçU ®˜| wX¯~rA®Ò€Îd÷¹yb­³­[•(Rl¢/9- St1BÙ'´²3ASÅ@³1±@Å臖J—H÷z_¬ÃÌ»P>Æxœ_Þ9rŒ¤úX=Èci€‡ Ýî[gࣈä錧"J#TL é·Ôùg|ù‹5‰žð¯c©9ö‰É4ASŒ‰¤ú;páKKd^üzÉ-—v°®ÓÒI¥‡9‰‡HM¥T­®Ž–- ;>‘,ÏBFvÓ4ÖGë[¡êÕŽ…žSø[~æµ±æ VŒzÊšmVJ[v¢—r”ãsÔŽpç¼wÔ“xŸ¢aÞ+ié %?ÊY8•¹¿¼çAZe[À.¾´„3”'¢½•/Fv§.Büz3m€è$ýq›šÕ.¥¼´Çš?¿áêå¬ṳ̈’Æ“¬Ví™3ùŽ*ií?Oà4¡kÀ©]š]d©•@+²1cWÖedþ£¹Ì¨ìj1åÉrL1æéa–D\:}ålÀÁ‡æ‘ú{a3ºMÈ;RE=E9 ¢ÓßpwŸx°4„­1]+“¢¾K¹kÅGÅÈÓ{á–½”ôí}\ŠÇÕÒ¹o³|Ä+qîiTé•÷¨g²Ýùfí8/]]"@ÕnÈ‘8Wvˆ´UF>öWö°lÔL·ÍÄÕwC_l09wŒ<ä!þh⠨α›Ú­I dþªƒéƒ ^ÉÆT<ס) fø{èÎjÑÉ9×s·¾¢äž§L[Ù¡]`¬p{BöL0ЬFd#XXUcÄäÀƒ;D‰«VÙU UИE¸þÚH|µp(Áš¾Ì'pXpeüŽ¢â™á?›+foÈ*ˆÞúÎ|åû¼h¯»k,>¦ÒöƒêLáÔ0òûKïÍNZ‡QߟŠò£<|´†Y·† ™Ø6°q`ˆ´áéÔ’›ª‘\7ÿ"0ý†a£’#q>oÊ (<ºùŒ½˜€ä¤[úw&·”ß.Ÿ°Á ‘ñ9€¼•rÞZ\¦ž*aqå‚=gaN™ÝüÊTä16f¦‹¡wÓÈsøÂÙïy^äôÒµŽ´±`â•“>Z«%‡ãÆîÏ[\iklrjù0oJpHzWöë.v~‚”Æ­Gñ(ýé±ûlOè±ê´ˆ ÛDùêñ8`.ýËËŸqÿŽ[œ0D ¨|³ù{ìOÀ2wfòRyY3sã3Auû(óòŸìnÒxP †˜›:.í‚+SY^JâI¸~+¬xqÏó˜<ýp1ßz°z—˜½ozíîaªÄÀ8¡Yæ9˜dki°µ½îŒï ÕÅeà‘  Tx!çÃ(Â\Ü´Ãú@´MŒlWwoIe §'3 (‰¿®o»~‹)=0ïé|·i‰£äjÐ'›ì÷’³]–ÿ«pJ·S}ub|Xß¾BÇ{R6Þ?&ÁZÓ`ih齡öÒ&ÈÛH(÷`%)‹fgWJPÃ^@PÙ—¨ü«ÞRPvHù¹  ®Ø4Ús&ëâŒ9`äà9È®­‰ ‘/à#Eašœhå1òûÐò<¼S¦$Æ»<¹»RWo¹¶£06¿¶òl"o­m C!:Hüý1ßQØuŽ¥;{Ål[ó#3+Žèz+IŠÊ1>Fã×óüu^½~‘Ôbî¡Ò,§§ß"žG6mJ´JV:,âDwµ¡5Ô+éÑÃGÙ($Ùކ žwæþ‘¶w.±ƒàÔ™'Ât¡æ¥)š{v+¼ð¤ƒ!?*â’¸N­¡»Ðj_,ýØ?¢ä­ÀR †®s@]ßNG*:öfBëMH¾IÇ"n„+æ]Ê{¸¾ v§"Ò ©\‹E¬*ÇÍu-ÃM–íi›`–Ó­ã¸*öù!$gÕ¸üxê•É­šÎœàð aÉÀ´êÇï…ÿŤ&ü~šÌÙe ­!»w…ŸÕ'_ìÞS®¥4Ò¨/“ÏO£ Ú<{¼Øá÷¾•I§þœÚÆGù^¥²“#³?™ÿt`IÛ¯{*T™°‰~ª|å‚_ð»Únzé­8 ]‡L૘}g½^ù¬Å²×Ù‰+-ÄŠc”Ý‚é‚gˆMìú#“$‰Îg.þívm•°t¡ú4"R·'5.¥ 4hñÞ©¬9˜ŒÈ¯€ýuN†Pîª-–æPÔ¨Àª7¶ñÇiÍQCª"KºË}+l2Ð ˜ f”åc´«¨ðß+÷\ 4?QùÇu8mQy©K_Š`‘^,ô•çË Ø¥EákCY7—˜©.Ì ù¸Xk¡ŠÞÐT¿íêJŠGî:0ÏgäA?ê7qÒSQùÜ}¼üe'™x5vl]ÏÚÓeüfY¾ÀöÆR 9ÕÀŒP…¢ uÆŠsó±‰Êž•q¦»8©5ðÈîÈÔ¯–yt2UÜ4µßÊãˆÅþ â•êUp¾ˆY1Ɖf:ÛO¯Ë*²×JÒtãwâõÞ!yLg·ÚÃÅ6ï äB;°*§µé’Ù˜̧@“¶FºA&¸&'“\¥/ªÆD?¾SϽTt瑆‘ôËV™l%û*k)^V‰Sy™’ ?M vq×€u† ÒÍ{OŠÚöæy^Là%’zj_Îã×u(ªÈø¦¦k z>Å  –A¶O=^|g ‘vnéûžÐˆS¥98\d#åò)´ýøý~ŒEÛ°@XäPƒ2¨cƒ™^åO¹˜O0è½2¢"·ÊÑè7tnCšÒ$ÿW¥)m†õÄ+ %ºPÍ):£µµ#ãÂxܵ‚Õ#ù^‚ŽÝ1„ËQèáU\x>IéZI¸ÝoÎós%¬}æhý¥+i‚€m}µ|± Mi‡j8»Â³3°‹›¥yk¥QþÔwÓ˜jCÃêë-œ|˜çÜ-e^Ÿäb~ݘŠëÑËïìÄw»öåž+®íh|ûºŽÝ5SºjWãy«Ê!ˆC˜Vúvãȹó •+ûã¿*Ä~ĦÖàó—Á{°îZfç XÁÂÕ¨à‹èIg³…“1g>NªïåFðC[«ä"×Õ>oM¼éSˆå8qo [>WÉz˜Ž~c0Yæ|³èä`;É0¡FçZoWZ„šk#Ø éÚnÂD©é6 —ZE ×A'UŸ•û÷(Ò¬¾†`'þ”íŠ#rnÇÁ†óà©ôw9ð‘ÀÝG:GKnIó!ç ßËv«p±ª½ŠúßÇø? –Efo5b‹™S‰NÝÇ'­¡ÜIßG¾ÖWµ2Äy¶à:$hÀ“~#â‚b$ˆÞ›¾ÿÀN¾x+JÙ´Þ ÝÓFÔx¾ôytõ˜/¾–óñcÑYl𒯶œ˜m…ˆÆ­Ð$9«p´ÀW?7¿ÛÏÕ}Ú¬‘AÚIkq‹r'}z˜¨ÍV“Ô̰ÜÏÙ¿ ÕäBÇÒ Áññwúÿ×,°êTÏaM[xÒ\OE¯O é&Gjû[Ào•äÑšI­ÂZrsJÑw=–G1 +™å6ó‚ýaþ¬pÀÇL”¢h¬ÓŠš;e­Öðôò’Ÿ¯=QXÈ"[@!”UqG­ûàJ€ÖTÆŸµNhúÚVp®æ œõ=š_&îÔÉ ´@ÏÀÄœZ\ûcú‡ËI\Gá]?¥­â_M’06´Ì¦EÀg‘ðÃfðWú¢hù×¢7%ã{¿*ð/RùÈeÖ8í?O†fð]– £‚Í5ª+AUp΋ÚÀeÅ|. ¡¤g‹¶UT:ÐkjƒeîÖÑû=ô낸ÿ(s>÷Y-)²»áÁÑNt¼>GJ1A¸Xh­À½::†Ð¿‚£ç «ËVäIZRYÏÊ>ƒÒ®©Ð%›oüKPwi&&u§%£]ÙÑ©:…ˆgÖóÒ­ðn§`žÀüñèÀÕ?å€z4ųÒ´#çt5ÐJo;’q±s¢AÈ@ôöÌ¬ÏØÈšJ°­)Mƒõ$Úl»‹õáÆ²é ïSwõ »âÃÚ(úÕë6¨½°ƒÿý |{ÕÉJKËÞ¥H˜1›q»¶%AV\¾B¥Ê0'¥¨ý±`ÄÎèñlÌê<€Ka0 võèiT·"Ï»¤»¾nrÚ€Á®·j¨Í',â˜E’=¼m÷HvÐzüC*õy1Ä'Õª|»£ó£{q¸Öš¾çÚ/v_ü“Ñ¢* É]i@ÏGž£9Æ W³§´8I«òü›8—| ¿í(j¯ÕÂJr3=ÓxsfÝ 1ƒ8¨Û=X4)]¦êµ©c…+Ðü”cí}Ï KyŽl»¤st—2u’Út»V¢‡+µ2ûïÛæ ùV§ˆûõ•ÌÚðzÕÝ­9 1LS¯ºh ÕX’º®4áWˆmëQ’ð¯ño]ÿu¡>!Ci:·œÚ˜]ROuá³ï?x.ÏS»Èôi©,ùJõÈ _èy=ÉÑð¥¦÷Æ=ƒþ#8‰ìÞlÂI…L2=JªÞ¢öƒèÔŽ™‹{Áé®ï)Ø)íðü%Ìb5Y{¬ÍHÛëG^îPéTofKÝ®C™“¾’?èíºJ0¥Ë²Z»W¬`k˜’‚kkõ:·“Їg„‘TwЄÂÁL ³†ršý©2Uð#ÁhêÞ|àHà%õUænükvèÝáMŒR_ªì4ÛºÖÍ¢l"×.pEƒò°Ÿ¤8Šp;žòS¼SûRÇ™ñƒ‡Òr6'±à å©Ü1ìäü¸´“Ÿ—þF%©éV¸ã1¢;Ù¬(ný5”»óvµrìÿüs»Â´m^\šÔ¤Æ“?%záæû’wE&ŸƒRE¢à†•Â.jþvr[HNÚ¾ƒü¬HsísÙšmÞ;·wugWN÷%ÈKÕ5DÞb-z/v&‚('‚+vz”E°çE¶˜ÉÖˆѵ@ >Þ²:ÙÀ€‡(õ‘º1œ÷²:Fé)‰Ÿ"« g þ¿’1ÂD¨”šíѼÏHsãM é7%'ëiú*Æbk½)ÿuãÖí¸åßÅùÀi C°íå µÅÒž!B´qøŸ_[Y-º~çm½tÉK5ÆGAÛj~iÏi)hÖQ€>ŽœiqiòloïƒBrĶ¢ÐÇ ¼‚XÉ–ÉB;ž«Õoçôcó† …ôñíQ9ˆT£˜R9PU=¨Î£ö&Ó a0 h5¸ÓÔ©Tc8, §³êÀ‘—a¼Š²L£ÿw(ÅQnø:Ýþç$ ÊÄ•X[, f‹Û:Ã! Ö½z›G|ÇD­Z÷£»Z~7ü.Œ½rkÜÔ?Ù*2iQVô 0Y¥¹ï`°±‚CqXWs?=;^Ø'ÈÓ™ñÛN Éguðà¢WÝK`á!#j ûÉ ¡7c~1zKÛ‹Ôl4ß‘-Æ8%¹ F­âí0át[x÷¿Åö Ã;ä¡ã`B˲&Q·vêRþÐBiù`Ý·'}µ>¤ONÏ¡ýœSŸs‚-¶·Qià_ ò$tÜ‘ÿè¢<Â,¼aÚþêlIéz²ñÀvUÿÒ5¤Ç*Όκ—Öy’^;à™R[!H <‘ZÓ0âå'›Êc½'8 aò˜6,•Á¦ÞÝ¡EX%>×uil{­s‡El˜ñ #À`u4ê*2Ûä¤ã\•2¼Õ*º•Žÿ0 îsÛÝÏ Rì„ CmÙQ…ú8é¹ R¢\)uxÓ⛋ín'T®E@¿×Ë©ÅêWT3mhPh{ŽŒ LŒ‰$]q€ô؀͌}y–úœgà}òöXj•ä<Ùp/SZÙUÇqve3X‘D+Ú³9¾T~qŽÐL¦^“\¡§x»°Ä1DÞ* ®ÿ‰C4/†Õ|6‘T£&´j‰£~y¼¤X‘ÖQ°½–úÂ%ÒY"¨ê!4ºŒù`Dr„½œí|híòÒùÌ`â'NèÆŽ‹ìMacÚ+ Ôчâ„]XM?ͱçKw ãëlñƒ§_Á"rÎ$p-2„ówÛÖê(ŠÑh?—ʃ¦nûud×ËN;¤µ|Ø7‘¨ÃR³Ûár V×·dÈ2(´­ú¸¹úûyšF ¡¡ÿ¨:pùÅÉß-ÚíœÚvx‘ÂM);Ò“ æ‰Íîû£‰w…ö×ûîKPü™?¾Â… `&ö;¨k©rl5tpV^[,´®87 ²êò­G¨ˆ–!YãrŽ›55?}ž{Œ}siÅSo¾TÚ3Ždåz,xÝJfìEÙDê ý·xkˆ4•riŸÐ4lg«¯ÆËIX„958M.‹ôTÝm|¨]ž›}nɲ–!gOÅçæÓµpÏG?ö:8ÒeƺÈDŠ ²Àð@Ä:‡Q>˜‡‡“–Få›w—ªÿ’‰§QŠù‡ xôìÔÔ.gpúEKˆ}g÷(óã/– >PÓ¹AÏÕ†õ/gÿ~0ç0CÜöÓãÈAtaÈ&‚hW·Ϲ0mªì©¿E2ÈéxÎ{#ôm’2\᫨¹¤ï{=úÉ}s`¡CÕ¿y¾ò€©Ó(^Ît!|T·‚Ï3P0ºÈGæ[¼Fì€`о¥­ŠVnÚN@m`œê×F¸Uy)✄}¶æúáØêZ\Í24á¼2VJ—€Ÿ{ã$Rºñ²ýkéRQ=s&2©¥ã¤-ŸùôB¢W°Ø ?´I™é¶9³:vEÉs`°U©$RÞêSÂ;ÛG>]„"«C—ˆNuf/P¡úU¤Y2Ï‘ÂQM—=Z[©â$Á˜ÿb5vøºéôÅ5C›M¯D·Ç÷ESÞü/yÃíx¼*tùnß‘¼±P .‡ÖèÒ? ãÇ•Ý+:…íduËÌièÂöƒeg–•ÛV•-1;Ól!ókãÖ9Ê#±>þ¤cpßîb5áÒ«[7¦÷ûؾ±Uê¸åü•]ÓñÌîâa•xΛRÈò'!KȾ\Rÿß¼ê46*‡õê¼¹Ž#ž®N\½ÌhUƒ6*ß–5íÓFÆ™`€dJ¡gK¸ásY ‡ªŽÌB•~Hö¿BBI?÷˜ðín=K;š>’=@D7Haquîe8g‰¡R‹|Š@1ÏU @¥í€ºeî–¿ã-ûèwÔØ M9",‹„(.Õr¥à V䳜5™ª’À‰ +ñ’ÖšP„Ã¥æýs;6¢6ðÖ Ìí{^b˜†WZ&ÖºjùŸóÑãoòèKyI6ÚÅÔº¾ïxößZ§ã–×…è¨ ±ÊG(´Íµú8@KÁ¬¼¾ô—ø†5b˜·3¬8K‰c>ê ÄÐ=7`K#3v' ·6*®•]‹òSh>ëWw…z¡65=¥KêÅ««W£V>ë4Ýp´ü+LO&L@WZ³¤ÄHÖö9ŒûS&”'ô¦v ‹ŠT{g#Ò¢Œ™í{íGswÑšÀÏk[ÍkY¾í_÷ni”›%XQÚãá!îktÌà&+e­‚À¯-]îé|Î[R®µ®¯¦oÑÈC|”~êßCÊ‚GEs["Xºÿ %ÔÆJm$‡»!œÞÛõS /ÖWÉ 5{¿§\§îh¬¯ s• ±Ìë̹qxˆöa:©X4†Ñ#ÇwA• Oç€òèsuþ†!ÜÐ‰Ú ÷º#ÿU£C?ç‚¿¦Ô^YÄr›ûRá[™Ég8¾ï‰¼/âò˜¸®‡S!¨#ä„“´Ö'@'ð]°ib±†f@ÒÏÉh*-y]ñÙ,76su–<(·k€ýÝÊjêø<ã„u9ÏPê7z8æ§±÷ƒÜÇm‹íêÙ„-ɵôÄÌ@:þG€á/gg9¼¸ÛŸáÿãµÉn`÷#”Š¿6²ÇØÔĈœ:Y|ÑûšGᆠVSt]7¦(îaY„%Z±Ø{[ŸOT£gN4ä!aJ-RGjãTÓ-”‡ëÕJ;èÑ@(ßÕ„%-G—õëy½ÉY #¤àìßÄOÕÆ%É8YÉb|hûã$<¤™®Ç_^ùùR\ˆÑ&/êðÛCyÀ爡8ç“CÓÒvN?— <öu¯Mi??½—×ý߬ iˆùÛ+ I#¤bR¸ ð¨äÌÄ›¶)IÓ¸#íT…ƒØ4.à¤êVìb»G–VšŒ¨ÔpÆå.uëH‹ôUöET¶ˆD‘1ëŸKÁ®®”Uó‡õ}»°t‚}ˆ ;S³ä{ýÌÙR6¯5µ¾3bFËPz„“¯×n—¦Ås²<û©*õÏ ŠÆ"¶Ü€LsžŒ+ÀÔ<ìB} ’æ=I Ýq…î|3B¤ŠNöC¼»çPKÆ+Ù°÷ÉX=¬œcLã;[ø2Õ7?6Ëí«3'oÃÆÎ`·ÞX)æ~qQÕ¤s³û‚94/(Â^p[RÏÂ&°º”ï²BQ…¼0ï™þ•ôÅéK¸iÜvc'rîS—JÅj6Ê%×êOʆ‘Ÿ¬l0@X»'W:߇LeOÙëÆótQQ‚Ê$ð`ßD vDûúlÌV½”RÀÂÐÜK¡ ’²~"q†³I ¦ú?xsÉ`òŒjÛ´”Ø$â˜ãÃòå÷åܹøá ro=%Êíyôd­‰{[`Õ(¿¦á÷¤Ä]±‰Gôù0[2Íê©M {ܹZÛé“àI¨C÷m߃COXfå%øà(î3l§îdî‰=ùâ*…ì„ØÜœÅŒo8YÑPa6ÅS•Bb;àK+@ã ¹à«äâÓ®z×køXÏ qÞ‘C•õùjÓJâ¿zJt¢6ˆÆy–ñˆÀC"Nе¢ðïJÎZ¨1§ß ÜLï{Üe …S·TÃÑN&q»åâè¼²šXÄ4GøLSÙ·Á—L,?Âùço³uCãGé²ímĶ»—5ê"íPvÑp»%ZÜá$L¨ÄdׂÖ|«”â,éÌŒ×Ü—•ßw+놖õ³Â7¦¾’ ì¬7Ïꇞƒ?m+ûézÅwÌ¡¸9 Ü—ü*_ÅÝ#Ò«E¹aЮ¸¢vTªÔ‚ë¸r ¨ ´S‰TÉääl©@ü²­¨°+ÜPEøý$éD¨Î_ÉomŽðêò„›äB®\w2G²ì»Qáƒüǧ| Íöú©/%D¥s|8‡ äŠ%°c »KRø Ú —Ô” Å€8ˆâ™™¸­î*ëJöí­ô¸KCÍl}‘õp8ÖŸ†¾1õ79¿¥U&:®µ8at ÏüYówrŸ6¦dNžW?D{Qu‹ÇKŠ>—µÀÝ/éªé_ÅóT€Ù‘Ò­>ïüaÜ\Ñf òQAñ ‰Sè[œßMJí•VÝ`Pi#ݱ>Ä«ý4àS·ˆ¡é›ÉÂV.Æ/6?nð¬†nºèBe@rhë›+‹ûÔlëêFÐÛåã-¨Ó0 ÿs!e>©=¼{ëø·t`´ -W¤çË<)ŒÛÕ×" ™ÉÞŒð–]–JVÆ÷%‡Y¯I68çðÂz™V+}6Ú›#á´¸á·Nõu÷ GõO•ë[Xi#¿×/U ®%HªÔ½qCÎdûáö×ü RpfPIšÓÏ>4v>çŽKa•éltÝ6Õ~oÉוz¬¨…²èLúÊš8.Ï3a½(É™G¿£¼ {lVÆ*-Ð&x £nޤ¢Ë8¾ífÁW¿OÇ j$W`ø¥Ò~fGô×lYVÖ_–ІÅ'0ÌÔ­É}9rßDFïT¶Ú*.æà¤žÏëT4z‡ìe\Üé2"tM=¯â/\Ÿè%2;Å1¦GMÓ¾Õµë>9„U]å6¯l®Û Ó Áj:Çø 2póë°”šÓöo0ž±þöò¡¼¢7Ö}$• b‚º¼ß(ÅL“>^1‹Q’žR©Š„ï^ ·aÿI±vQ>[M,kˆ×ÎXj+êü<²”Yç¿Î)æÒб"5ùíÿ¬ïäûÑ'¨*F-q7d¨\ÊÉòsºèØqìƒ:ózˆQ!B·¸‡ú2óƒa£hBµq§´¤ë=ßÙ²’!wS5`¢õ ã|Øß…舤….Wá~Ì+Q¨ìžÍƒ SöyÐóë3¾~qÔÐò¨È±½¼WR2¬Žmü‰xù'B ØèÇêo2?lAVßóÿ'’4WzÇprqŽÛsf8I8«O ¨$Ñ8‰ëŸ2ìC35cKyJ21í³­÷Ò©ÑdŠ;½Tàj¬è0*|3Ýukáq3¼†¦zŽSÍ40S›Ž"eà9·¨îKÕë|s£c¯÷‰;-aîÇa›ú©+æX é¥s Vö•1¥÷ ª¹);¶÷¸&xB—rNS {µÛZÓ—(‚ƒ£‚žå‰~ÿÎÊY`¡ÛP3×êëUÛ¾(‘ayìS!wKE†Az¦‘ÑÞ]Ñ 3N3!üÕ5ªzYÔ_ûÄ&÷ؤ}áß–æêì5îæŸCFî]þ£®%½·æðhXo žË2yÞHGT—w+^pŸ= €v;ïG[Ó\QP¸¡Dpòìi­S¢ÎYLû®^y‡”;õÅEZQóÊ‘@P”;TÎw«g †ÖŠqïne¢kC¯¿Œvù 9ãuEWÄ ©õ_‚qüT«`G¼4]ÿ<“‡IÛ_ðêèR‘ôÛÒ´ Û€§Aˆ×}ãsÍ@ü&ë GlÇa_&¢¢Ä$‰ †‹"“¶é±¾Uz/è¿Õ·2Æ«ÆX®–Qâxí‚ ÷*¥Iô ±çH¥Þ‹#¸Óê2H¢®ÑOZL¹sÂbñƒ+¦²´71EÁƒ!†Ð€µ£ÿ†7¬¦¢ßûöw|¤™Á|ܵ‹+SF3oÍ;çÆ+îRѹڗ5¶•?' ³L|D3»qk|Ø+¨†ç´r×ÌuIxdiù[eíþ[#¤é<™îbÆÌž)Q|€ "Ô3¨Ò œšÑø”è›Xšh³pHÄX$JwúCÌI *_÷T9||laÊ> %œI -Zb39Ã~°_­œºšR¬ÈÐj)ð Úá-ϵãääs¥_²Ójxú`åyf‘’à!.Î?Fväæ/¶5Žý"þ7U[¯„P+>’QuÁ¯KÍmq©îxØ*šé{dÆ„œ_àÙ+v¹ ¤š#H´‘ª0-½â»SÍÖWCêÆ°Ðh~­†©÷YrlV»Ø_ @¬ü;v\Ê”Nÿ/¢ËO)·Ÿ¬ë¬l‰jCm¡£`hœeYá¹Åü)ïaáO×°ßþÄ™ ŽÖóÈ6=®ÿ’&b+ßk¢ÔÂd;¯«&¾R>å+ƒÀ¯qþXK©–ìH˜æÅd/°ÄÆ™œ]»¡PåÛšÎÿèáÊÉÑÒ^é+ØLòót;vJ=÷×J°*öÓ4_‘0!c1ô-c±»NKÃ…Ìv‡¥¤m4&ÑQv¡“‚´Ö\¢‰ÜW¥°Ã.ïz ×C³¬•æãµ‰$Æ»‡Ð‚‡pGÍ‹è=÷ôúŽjõõŽÒˆØJª ŸøAG5¥ï`¥íîôÜxåê7²ôUˆ¡¥r¿ xõÁ‚t³sˆÍÛi‰hâ{Œ¾ÛûºûÑz¦hÈ“¼Í1 ô­î,غï0Z7|¥w.`^è÷yã+&»qFÛ1í;t6X÷KªBŽÍþª‹¦†ÅËzDn˜¸Ôl¹XZÅêËìéû·GÀ‡RÙš†ê]Ç ^Ÿ__•1ZùªJždÿýí6ó¡IF˜æ‡èh~ ÷‹ƒFˆ8 Ð[ši9O@OÎzÐÝ7?¤É@;.”¤¢æ]RÈÍÆq§Ï9³Vsê'í~Ëp2LT„j”’â„ËÖ û^&eµABŠPl…_¼ó ªÝ:§d_éàc©| m¡¸&k7‡õ÷ÿÄ΃|‡8Ý—h±4 :q…¡Á¢yPDÞŠ~xïKâ¾®Òd{¼HÉRëd’¿÷p*é~À£Ö´òÚº¨}o‚4Ø™X—Š€Í²=ì¹Ü˜ ¹]£,‘ºÞi%/Õ«–Wã^=Áê–$8òf&GÔÑÁ&LÅkue]ÑÊò -Ê™¨>ÍÈà¿>©w‰4Mü–c½³sÆ¥“¾›=ÿÐf#_*‰¯•/^ ÈKW·`Ñ ·— 6.ÊXb]rcõŬîbh >„Ôz®:E…²'_xoÙ?bžËlœß†W¹nCÛ¾_/ù=Å/´ûq9‰éüà=­¦ÞbéMT¦}_ºÎnú²¶Ë‡_ZìÔÈEý$r‚âùLðãÍ>ƒ74 Læí£>¥Ât«@-•]Óz5B_}ðU²{Õî|GæÖƒ.l0I£6±ûY…p |«ŸXƧ^ÒµÜô:xª-»íª Õƒ£¾1R7BíÙÔxÝqY$È’Ç…JNo¸T‡Å†±ðµ0y©hE3ïï<¯º$ßð½V y-ÙI³`ÒØúðys­Ö¿s¿’„š–7Wõ{ ò{;Uà$ËSúU‹^ÊϤd¥Yú)ñ²fká“E\q{¼¥›1vb‰^] Ȩߣë¦?S‹-ÁAî- †ß¢í%fàpûH5ŽÐòÕí&ðC÷?ü•J?¼Þ`Gf1̆Y³}H2?ÞP·?‚®£Kø <îûY FZûÓ¶c”Ä>~|þdQ WFP˜Ô¼óžŸZvc ¤G#ªÛ9,tÐQ~F(Øwö=Ý ç‹lÓ«äa ó)œri‡-á=$"†ýgqþÆcû1Aí:é$?@.Ð ’(h·Á=°I^‚o«fU4ÂRäX;IJjàV` U!—væÐ[¶Æ°ß BËA(Þ—ÿQíêr2ßïÏ󹢪JÑÃÿ÷ÞÑDQ!¥Ç¯'oy_GfS1‹È=.y¸áÈA*†Ê¢S j%ÞdÔþýírpà#‰&.( ìݧ§ùƒÚ°¨p±^”öˆ“Y>Ͻ P¸o|¯bÕÖ\;±eš¯V摻Ȭ¬\›)Wh]O«­ÁìAJŲ–a B㙘ªjÅÜF´D æ"*Þƒ —ÖFßJx(Sͱ+y%U«÷¿•–oQ¿sSzÖ‹aJ؇×äyÜÈôlgÉŒ®Te?]ª¢añ@M©t|U6oxÁ׆ }µËL_@Zª¹Â6²*òÊäùö°:A½Ê „yæDj&–Ÿ*ü<½¿Î^X^à¾ù”:PcÌ~¥Lo×@”Þ"z„ððŽÖÑôÞüEµ€¡Í×áÄïwˆ ˜ÓïSmts·œñ·MQÈÐà‹Öµóˆ8#<±->§Æ¤b|–£˜«y¹OÖÖeQ£ežÛ«aèm#\Iê­h·æ÷Ä'(\ô"„½UíHø­Ý7¡ àöÄýá$Ì)ª õ½ª`³àË»HM2NÖ2Ú¾Wï­*bq6¥-ò°îEj½dšËx襓¿gY@"œEÓÁãݪ1>RáÍF™‰#߉¡…™œ§X«ºÂíõùÞ%)Ð €± {‘Íàˆ£°e۞䛘%êw»s§ÿ¢xêºTuè€Æ€{‰ $òÂeÈy Tš3AI.T·Ü™«ßÐö‚P¿Íz{ÞMn­NøÞ€Ü Ê¿eÂôœVi˜ÖöQDÔ¢t²!9FOQב(jóŸm?rFÆPTÞœè½ÁF«œût0ǺdEGȵ»Æ%‡hÍÓÜXØÿ‹?šoù6¶ÂI£×9yQŒa¨]„R=[º_idpÉ"L¬ ž7Ñåƒ3Ť#šËSò:'S(2NxåL$t›°8ñ®Jf67¡ðíã2ÎÏH¹3à[‹i±+¹2¢¹¨öqt°ã¦}pÒ™¥ÚR)O©›CFUе[Õqç»1k®k(*PáØkÁ7/«Änà‚òJ.bJX#†>ÕÑÄN–ÇÏ'öÙ¤HEIÇx[OÁÆ¢ŸbvØ ÿ}ƒò@§¾ýžªns*-gØ•”j{ŠÚ&X¼J–ñ¥õ‰¡Å”¯_KDGi1›Ò/ÄÚk¾™ v·ê¼¥?Ê‚Ï9öxàcãíuÚUö}ëjóÏè§1q×gut~¥s·MÔq¥­Ò7Å6eé'…ƨ­o¹MON„“q-¬Üßx®&rÎáZs†>0_ßÓpú¸H–&M‹µ«- öÎãå)òT;X¯ZhHwsd"øõ¶™…ý³|rj@Œ=/ŠÁÌ„xø>vY\nôuv+R€m÷0qœ0µ² ÉB’B ÓÖ»cW`xµ'c8F©Ç¾¹ÏµJ&ò=yf .ìæ¸M“1Ñê–aΔ½‘+e’FýÍl‘XŒ,„<–KÃÁb÷([œ¦r”Й¹Ò+¬4ò(¶îG)à…)('E¼R·jR ›1ü¹úÕ1“¹£ŠbÍ„ñ£e &õÁƒvðŸô_?Kyé|>¦„v¡Ý™E§VW[‡Ô’fˆ‚©7+ÇYaÖŒÊ>õp3´æTÌÿgqùÕKr£ž©úŽ<þZÛÀ ÃºŽ´ %.Ùܹ×a‚ŸAÖçÚNN,‰Jº$µ»f÷ÍQÛ5‰x¼ý7¹$NǵçÈ+œ»T¥FŽIç€ßæRBƉú>0¦ß†A/N·39ãùà Ãïuß^Š!}BœÓqå%ÙrÏk÷O´¾ÈK²"ðofTâõßa0Å)¢ˆ1ÏÛU+cÜÿrGÍ]¤KÏs—Þ¿'}ÝÀÔû4ýTézËè¶Å–¬ìÕ—DžÓšðü˜7†Ö°Ÿ:_ ¡*­ïöSMA¯±zQ¢X'ÉP–‚0<3¢ÔçæLåÉ&rJÊ8»ëÊN<î*›½¹a:Ÿ¡$FAÚƒ~„—ÑXÀa{ðÉ=ñ ËQ)EübMJŠ{µï¸6Va9­_HÒÛà•eCå_Nå±LO;p¶Mn¢".7—$øcìtás±©y0LÏËæyÍrQZ*>g˜Y~<½…‘…Ä *ˆO/³\CûåÃ$äL'8\.»Ž^/8(Oˆÿ!ˆÎhmÖwMÛ÷üʧc’æ±â„Fêç@ò¸“ ƒ’ã¦Ho¦G|}rÆh5+ˆÈ%yw•œK`”[dQu@Õ‘¬:€KMªoçéJ;M²E7ÒŸ×&Q¤H‰ÐÆ—ë,ùäIzZk -‚W„‚ø‚NÆšK «‚ýJæœ_õÖW,ü kH!ï<,æê0ÀãaL è,çm\õˆ"k-¨¨mô2EbBÐéVçÓ;ŸÄ(ÿ9‹F…y‘H0ŒèMãç÷˜™95uŒÙŠuU7Õ°+C@×°J¯îÊÙ¯&†Î×v›œTg8<Þä=1hIýÜ ….ù •ÜXÊÀWóÞ%þ>Owyzá3y¿Ô,þ”ìØàØJ-Xi–Û÷ì#ƒ^í;cWxÍýh®Û8­³×_y ÖÁï®õkeˆŸ ¿•ý2Îá‰ó.0>ö-CÍÞIHø§FÆG·׉gààuœi€5NkúÑÈpTÞñ¼!)¨ Õ%ª¤&Sð:<×)ñÏlÜðÙ] øæe¢ Χ¦§LÔêrŸä£ñ¸‡Eñ›îNNÔ„å™–xçF¸/‹õ~ß««×Û_MQfîÔ<÷Âþ’E¥¶¡Ÿ¼G&nQâ™Þ¿N,Ëlδ!OÀ¾éº¯¶—iEćJÅ°Âø6åÅrù+ò×Rš%qÎKóáT Ù¥í,zŠ2òÑ=àŠÿTÅ)´Ã‚µ’]T´'u.Üúã¾9¶F& þ‹» b¥D+±¢J~>%PO!/dí+æ·uEŒóâ„á¸Ô¶Ë`b‘ŠÎå( ½Ðì"“h¬²X&#§EK·!:òé^ƒq÷eIz°…{»kÒœ“¦¢»¥ÝÏ&Žíâ4Êü˜D ÝÚ¤¥VTL6­ËkÅãƒrü®T´ï]ƒ½‹W^è¸Ø-#i¯–¾æÍãKFŽÝ#C“ÕR®‘ OKÊ=;6öU³ç×ÃCß„7f=rHujÈêçÐß8Yº±™„ìE1æ¸T6>H꨷ù‘ž_ïdä ö €e±¼yîÚãð{ÙcÆÅêHãçV*è÷96 mâÎT ·d±ÒV+©p·kÔä, ;_4#q )Xh´f¶¡†Ðt_èÔŸ{)Txmf ª÷Ct#SîMK,‚Y⣦ÕMt™_#}©¯|¾ëßJN°J &>Jë JHÍ?Àûw×/ØI5—à¬\i¶¼od‘šá‡º–ZÎÒÏ>i¼‹£“¤ó áÄý Ê ¡à")Õ@ên¿eToƒBïÞz^¼¿Œ®íx¹Õ(Q?¿ö¸k:“Iþ9Ÿþèv.­}»Ñ= š7)øÐs~§»^ÄGá. ùØS¯ ÃÐ)•âúå}M~V-‹½’5¸¤–Ïz-ï!¡`ëö ª¤sÑc Ò5~°–Q·ô“%Ò4ýˆÜï‰ëÛêBià ¢>¸AÐí/-朄ÎO–QXå=Fq y¿¥]i÷†ëY’¶’©øÖõâ® g(¥\~M}7†êWU㬄hdú¬ñfBäìØÝðê1ØUãÕz…—ù7×`¼7ÒHño¦ÞC¾cQ®Ç¤Ñô ©Ñ›N)[äÝcä`‰‹&³¶ˆMý»â+zÑT@æ…H œË¤ÝnÅÛŽ5’Eú•@uaHvw*Q·¿©à°x£Ž"«3ÑÙ~i—3ŸwÉÅb×? &d£^©%Ì<ò<dï.ÿ|Íe¾º¯G¥¹Å`öµÌÓäë乃ÂìéÑ/é¦P¬y¨^ îÈìá‹<a9ï©¢HŸ <çŠ8J”%&½Ž¦ãõZ„¯ë òEíJÛæDpG„?²NË?Å„ìd°˜Üˆ3,±A½3Á²®&Fü(‰I}Dá6aáÀÞ ^^cäâô,ë[¸Êôu€G}×|+Wmך=?7g>@8çx÷б®5²&jõüÖfÈwøv³ô¦!oØA¶0ä1ÏV tF«Ü)+dÍž,—ù5 d ›1ɺ׻ê i #Ö9¿­žíxf· b"}:Z©ÃÚ»ÈXÂÏf-O`ÆtG¢ ÷ßöj`¬€‡RwUo\ÖþÛR5—‰ö¿<Û[°ï*déÌg˜ï×»•M†­ü_ †°û¸” lŠpG6íe{†}€‰‚l Cn„IþïQL¼3µ@ÛUÚ-°¼BV £¨4È0ÝQðà2ßðúLt­ä¾ 7Ò&¹J„<±F=úW6óžÒ‘XuȬ¹‡ž•¸…Þàúªx8=-À{t?WجB3‘rüO•tÓzÁ Ö‚ê5B{”@žIvÿ: fMÕÿ“øk?mÒËß)îMïÿ)ðÅéQ‘î *NÄè54å„_çY#_Š]Çúë”ÄW œ—¼¯ÐÁÚ7ÙFÐ 4ȨçFŒa‹¹ 13κyói|ËK½<å!%J%éठp雞ðŽ@¦™°A,GuÕ‡q¾’V7…-ÅÎ[ƒÊVÏðÑ[&Yê‡qSõsÜ@ÉÙ½;¬l>s|÷ÖÒVÿ—¤, u#‘ÏéN/ÞüK«/ÝQò>d¶ß‚t]Õ656ä/‰¸X- ØÕ«1 8rÆàèùÄq8w…}ºš;8Žb˜2›ÞÞÆ?:·‡sÉ?!÷#›xdlºÜõÖ·Ç¡hü™ÓJ«‹jwóýy´a5–…»¬ûaÍ[Q½ÀCOœDZÙL/–ÿØ!ÊKÔfN»[D2mÔ &ñ°ŒßL!ºj¨úÉÁ>j‰ÿê€FE}³®NhQ\*|'OªÝ!\$u[ ìÄ V‹„ë®»þÎí”7f;!K·°P!ÈadXÖk*Ë<¤Äçù²~Èy–÷-jÏüi•Gp¬œõØó¹"d’¨ÑP¯˜Ô ¹€˜^Âã@d^?ŠwŒ‡dï ë­m@º~mã.ô-!8Ý¢ÍevÙ6QÐóÂìª~ý¹äé&ÐZþòobäJ4–õ(èœ=êð¢`"d|`ÈiOžø»GIPrYÀ™ç"›)ù¿1ŽR±›ÒE¼ã£ãÓ™‰_ÓPþØÖœG!Þ:·=©ñ _¹j©ý·€ö' +uÄתV~àÉ~k·ïœV>â|ùDTe4¡ï8CÑÃíÎù'¥›Å·z-å4£åˆ@ ç!)Á½îÃêô‚†aÊß‹n%õjïJ9G%«]¿Àõce:ªSþ \[ –ãø)T/û-²z!2´¨­uîñíù3t“Q5â¬eàè"<$à‘–¥jÐ$ú¿‹>)sœZmÞGæè÷ÛrÜ÷¨‘¸ãë}b ¸Öx=Y–äïhÊÆj×xZ„öäŒ=ÜäÛÒÁ§Y’ݱÈé,ž³öM|_7EYwá-inögR©é4Õr´ ®w¥-$àªÇûu-ØÁ`÷”Ž.@uNWR/ø›Ë¿ÕÌiçíáþv­øk‹îÂör8|Ê"ÛŸ-òö´Ê¾Ô‚ó$2Ïï㺸2¿ µÒ“0×½Y‰Ýü²ÏÁ—ú°ÛÅPòF&ÔÒDV€8!A0jp2î5Ž”º‡!?q•œR‹¾ÅÛD/åŠcõ¬´ñ‘fÏ5qžÐ»RôUÿŠ~j† Þg¨ÚbX„f#>pQ¬c™ò`åIdabIæãFª-ná•ù|¼Y™#Ï_×áŒO?¼ðÄó˜²eë·ÙÔ=ƒÃŒ‰Ðã !Ù*­b‰¨£èÌÜ»?äkÝ£0áçS±@ô»Š™á-Ôì¹lŸ0Èм¨$òÇ]¿Éž’Ê÷˜îú½'(ä:1Q…©Tº¦Ä{¾þ÷·møíâM3Êúœç­p×/„fÆ/ kS:¬¶æe•_«iɹ_ï"&÷âO};P:ù‚-õ2ˆ;cԌɔ­.õDœ„|92ÕK“oàwʸžV¥à)Iܘ-¾^s"¯œÂ$¢6Ê(»E&Š˜OH8œ‘}ØWy1ƒ'úXKºçŒ.ìp/åçzäýJ‚Í䘭CëHB‹Œ•m‚ÊGZS™åôØez¢‹©:Î :4óÇü%(} 6<’¦[܇5.Zï^0m·×¦SnY¿Î‚*LŽº jÜ æ¦_—k±Ñ_©ïH(mMVJÊë@û¯W|zz˜ ·Âª(=R¦0¯$¼‰. §è€ ó•eºmº °À“„àdŸëNÛ×û†¹ühFZ“´šfEÎ×á@ëhXí}Ž4Þ¤ûÁØûóŒ}ß󑹯‹Ïd²Ÿ"Ž9§1G,”Þ¤þ úãö ‘n¼µ,m°¡sà ý­—S$Käsm˯ð2ž¡•§û\ú¨æõ®âÁÄooŠÿYöU/)E±fFVW77aú=e\zZ\U»wdc ikñ¥Ÿ\] ö“#)X‹î(ˆá©ó¬;o ˜*È.¢F[&{‡iîB”{÷,k›Î•¡XPÙU9UÕ›8Üc/pør*U%ð„U€3‹=©SN¾.×ߘP?CuÌ2ºŸÆñœmWg¾´©ð}ÏrŒßu;ñ¥EÆË÷´iïÙ¸³«+|x)Ãw*¸i†³Z ô…¿¿+È”Ü;Êišwáß ÏÑLªi)Z{îK¢,$ñàŒ®5ÞÆ^|g)G¦Wï¹ÆÐ>ʸ*Ñaš±-1™;í°1’¹Ü*¿¿"È´É•¹Û+ÄJöñ6P'K"xCð‘L¿|Áœ­4žYk“03EEgcÒàÙîV¢F¼W)íMÉ‹ó¾ŸÏæ&Œú´$à_Bó‰[ó5ðÒ/³Œ?sêW„ˆ¥›Ï$¹~Í ÆJêØønêiz:h|18a~l?}—¿ û1wíT¨kÉÜ=Ó<3GàÜÀ eÍ:¬ŠG .6¥—3?üC_ï85ûò´äÆ]M ¨ý6<&?2S.X)S7!Hîvn5蕲ð”up,õú~Tœú¨¸ ÿs;|R®O«ô©_éÝÞ® ”ë®k5% ŒÈS`òï…³ÙÞ5ÞR ~H&=ÌQ"«R¼× ‡;ñ ಒÚÂH ’KŠ{¡ÔX2Œd^ôÔÝAßP|¶WáhÃØUený¯Oìý#v©Ël€Rjk_hÜ÷~³À²eã¯L±Ì‘ã³»GFgÔ.ðP³µ É™wÏ_€N•Sœ9$-J˜­˜îœÃaTÀ€ó‘S×gnI^ã)ß?zšŒâJXñ½š'BQhפüÇ^þøÙW…åÇD¡ŽD òÝÆÛ^p!Þú[eO符¼&Ì<ô`é¡”ª6{Ší2“&4L³Œ˜]°R¡–¯Ãße·Š³‰«žÂƒnRaî”u¸„h8hß"LlÇÌÆÇ»t”Â<˜f¯È.­ŸDK´CR÷¬ßj¾ºÝ•bÒ‘‘Nú3†vÇÄ–ÂqNè6d!“üÑ\þ2ü•Š51 ’¤,¯YvÛ¬¥©)¶=¦ï ù+íË]´¢ênGfM»éÞp3?â©·4\úJ¬ Uy¨o·…K¬Ë8/›Ú{ÅiŒ¶¯ùQuK_þ+}<2"¤P3Éžæv’­LÓVn-~ú3m_w--éÚA…ltÁß•fœ}úµÃ•£:¹È^…þèE Íû–eû/Ñ.¯ËæÎñ[Š&':]Zë¿y¬Ñ܈ÞIÁe×Ã-n^êwoƒ ^‡Ã( Ü ‰Ö:\Žñ¸2:œ5Ì‚UWz¼Æ4âb»º÷Rï`[èƒN‰ÕE€€œÓ ^ûw_š0òªäe˜e@f9]+~DiK먽˜*œ¾håÅ’ô*sÑÆƒÃÐUµËYéõ‡Zs‰)Ý6¬r%Ïvx7/ЏPZ™T¢Þ­_ üÆY½ KÂ9U)ªµû˜t,±þlUüÇ®þApÐCV“°é¬tò¦åð*²"üNE·¡Xd¯—=î|$[ƒ°Šý+ ᥢԬƒ\åLþŇ%"Zdc–üõ•×®oœ3ÖØ‹ƒ¢¶Ûx‚ÑŒ.z/îeðƧô „O)»xç¹ÂËÂ&Þè¸ÁâÂîáÚ/ÙåôþtOuZ=§SÃç ˜¼)rŸ›ÇiýÍ ÖŒZ*3¼"ªM²:Û´lÔšp0—í –•IàKYiM”‡t—ÝfF3ãh‘Êî’ž¿ªžÚvûóIû^Y£/ÓARDÔ¥¶kfäJFñŠB¾ÛÆÛëܪ(æ¶äÈuÒmïÿz³œÞÙß,·V³’p${ð¸ëûЗ{ÿ2,Ï£è¢Æhª’âí{¿ä~ؽբlðd9¥Í #„Ô Ù>GŒIsrh:?ò&(ËÍD¼+“>Òš?A>ýÐø¤#ÜAPçK=M«ÛYLm1úòèi¨¦´n3l˜ža›„–ôäò¼¢ìds R[…% 2(‚‘IH ꮿŠk7YD²N€6ô³"J‚FÌTÞFGÐnW³I{hêâp/÷>+¬þ¹É&—‚Ð`£‚Md„½ç)³®Ö¯£®Æ‰=Ýí>MBŠÙOÂIÄ´AfG"ìèŠTVÛPÿ#4&´wXð’\— RÒ?å%Éø(‚F¶l±cSe,ܪ‘pt ·˜òZsê7JŸQd6¶’$L¦è/Ó½jëëmV ¶d@g2,}oÑ(¸‘‹ß”‹Ì¹¨…¡ªÙj£[ü÷A¹]Çñ’ôoçË ×ÕYúØÌ? ž;If·tÙ·H[MSt";Ç#âp~^Uðï%d{ûÄ‚€=§q4¿×Ùò£`¯ï/!ÜoîÃòæ^-²Ͼ^Á¯Û R°NÀTÔê¼4%5\,Ç»ìákæÉŬ¡UŒ¾¬Á¨Ñ§ªìøqË*¤FöÏüWÛœSw‘WbÀÁå¨qÕ[r÷ w“»iŸe»Úiv…ëdyU€ ƒúÉÆöË7縮ZáMfµÄu Ü4Œ÷øÊjMö¡‹_ø/Zå"þÕ2eå.‰)ñËß7³0º 5Õ\†›tHð1 =í} pqŽ2‡E~Á0yþc“:µ0xª,„ûöçÀyç í<ùªÛ"¸æµÅ{¯ÄŽx ×ÔŽ@/3q¦ZRÇ»øD}²ç“ òAiâvÌ‹açZW:Ûì2mß@{ÇçV¹6Ɇ[‹|ž›<ÔÖEjü%ÒDÖ[µÉÂÇnU¬u~¦¶^ m™¼s3Ì3DÆ›ýš…t’nG˜¿czËè!–çü?§ks‰yWcyjÝçpi:0«B‹Âô(–ÄÊ€°4M»ñ¤ÇsV©üúóYþèöã%Clâ\Ü¢Å0¥™µô;XR'’6*Œõ ¿¶b Ç˜™<2 à5t”é çÙiViÄ E¦x·ÅÏ4ã°• Ó–¸hhö~z‰¦ÿgiwjõ³ÂX3Õ+ë¶"‰,h÷v ôfnTmÎH§ì8S7jSÔXJ‹3†øÊüáYu¬wÕ üΛK­›³²“¾7³¥ªÉ»ñKˆÔQÌŸGÀý7÷Îr´Ì8o¢° †71N)9Ù²ú¿Sñ´œçFÜéWþµ$LÅ Ùp䔀ûÍNó8Z,tOE5 ¡d&ˆs²ÑNÙ'{Íæ1uynÃ?ʇõFb1˜…pt¶*ðá”6w]„™ü±/Ñ âµ:ˆÝmÆ”ÅÕÑO¢yà[:ÈŒµA×®w wù^Æ·ö=˘·E1N¼e’ûŠMkÛ[(í²²òhJ2ÜU.R‰ê—Dk'e…ß¿âFœ''$£p«óU oˆgÇV|d$#cæËD %^ôçòD46- ¤YZ}€ýHþ7J„IJ¤:±jÈó3_h)ƹÖLa¸ÒO›Ó´J ¹³!Á¡ä~E¨[dáM„=굋¶QŹóÏAZw- gÚ"ûû¼Ë®øcåÒ6爗ÄÉ_¿Î3 ö¿!`Äiµ§jlJ„OCúÒ¾È!­5ûãQ² ò²ÅAô–‹‹T æ7åÁjÑÍg€Ç+ùóÎÄ<]~é;Xe¼ÄŠL¯á-Õ2IùÚ©ŠÿTª2è_ùÇ:0³Y6<ÑaaU;óa›n›ñ£Áj)·\ž•‚ö+or–€3å1óCétkt<|8i™š„Lm®ÙÍdz¡»_»ã"ç@QEï9ø.ô–bR2®ÌˆŽ ÅKl¥NcFÚ>Ò1üBhË4x-Þª !…à(p?3ó©=Ý8F²‰/<œ×К --5ìxw¡êyû£-ľ=ò»M¡n©\G—»fL•V[zà¶;¾àuæoÿ%œsm +êó*"_©™=Ô›µsŒûWGd,©8}‡ëDG® *ë²àÎðòˆÈ·Aï±oŠ`ˆÃ›ÍÇ]e—@?¨wÓ$:­H*’‡ËÈ!@awœ8åFÉJ´®^áŠDë$?ÔÒê! ©8{ôÁ‘–‘ ùØéô)â`™Gxw2A,~ÍçÄšŸ?¾?k‡3b:5"›gõ½m=á_6‘–X­nk¾³›ù~lû'^pÕqFŠòŸßë`'¤Yèöyób]þ@¹p^0Fc›W@ùȲS ¨¹ò½N/ßE“ þ¬ŸÅÙ­× L¡z!˜«ŒcC’p] _ÂP¼ê¢&¹)Œ’7 æâài[ØúرüÕoBÇ5½ïU¦_nÖ ¨OR$JÃ*ý0CŽé¦XWäì¹:¨©{QÐs ™“´H'hJáõfZdÒýˆ lªÛîþ†VK¨·D6 ¡ê,Ù|,îšìr¨Ê õrðŸÒ÷C¦à¡¶'ì–åIüôÁp…“Vo–^Z̵óÜ{$»¹(HÆbÄWƒ2»—…âLOð_Ájÿ±Ÿ¢¾çBíØ Z.ä R­T_®ô°ø3SÙ“l° j ðäB\ÂtèË3žäÿ€Öp²1Ø»ôg#!ž¶:Çt»ÿùý'¦v€³c?åt l“X?êêdg5ÈI[âð²Æ$vÿhW©Û㎆ŸiˆÉðþÔ§õ_¿„€`†X(sGuÐÛQÀD&6VŽÔßç›Ão]d¤/Ü›È+ÒºZŒ(æPt.ºvúý(;—ÜÐi&œPN Þxý¢ë³ÒE¸ ¥”O2>R€ØŒ”ô—ØÇídŽk ™+w¿\ñ8ëÄËÿþL±'1ž _>‡a`r¥®<*‰éãÿŒ#ýe!L–ÿ¿trËy5ð\9ëï—0+HcÐoßÎåc@9E€]ƒŽ Ù>K šöXEEÇÖ«ñÌÿ$ ‹rãÒšNÄØº ÇZlÙ+˱*0ä­fB×…Œ¨åÙ£¼z $R m~×n8i cëƒ3Cö=Øîå?Ïu J~<#å2¢S­šZ:N@¤sâª'/Ï袌'˜¼ñá é;6ж8#pþt°Z¯o†ï¨ƒÊŠ’NԸ̻îJOÁ,ž-i¼ðKLc)¥¯íp ›†Ï™ ’åâœã„Ã-GÉæÆÄýíI˜Þ CT+Ù<%@#8„€sð¢'? EX‰Íì”Çmv)ºOkU­ý©+~©•ô³öʰۦD4ìצ5ÑÛÞªZ±÷k~±[rDPB&œã9|A ’âÊQoÕ¢ÍçI¤‘g.Rì/Õ—Ôè*D<àìL§Sìx&€ÇmTªlß áf‹S'ÃÅÎÍgæ œï‡Ó4iÍ! T†I)Ô>Ál„ .è¿¢Ö§¸Ëj‚Ę(d[S$ïЦ£D“Ö:܈úy%¹$}2Ð$4"×eqÐ$ãâC¡}êÃKt›õ¼®01î]¨_«ÉГýO÷]ãÆ1vš‚¸Ý›¼­êß…øº Ü]q‘Ñ•iðJFh%Ñ»Î]›§0¸|ààEö줻b]b°¼¬7“îÿ…Ëûç±Ö’«ò.vé;ͧD Ì©¢I¸a@ biÝ:Qù, Tˆ\òÎ »Ï÷;ÎJªKGRýqê †g š\œçó›MiÓÈ…Þ÷ñÆŽàÍ"HÓî5ðaŸplˆ.ìem˜ùÚ!À—Ìž wQr|š|G™K\´–ßM¿³.­ªÓ8d&ºó¯Ï^ùµgÕä+M®>¬Bñ›¯!›=±—péªK#¦.)¶ßMˆ‘ÔIûWÝAQX ¦êy¸!Œ¿“5毌z%—ˆ¶çÙqýBÆÆ8L|<êó™âN+óú2eTv^ôˆ²—…I^˜ÐdÔ“2\d{®w¾èŒç›Žâíßí[”I9ñyg”ÎDB™ „v„, ”ªÉóyÜ0­ÅfHêÊòÍ©jÒ oáÄßKé¸"WW&ú´61E?æ€zŸæŠhù§\C6Ÿ$<³CÊçàχ P <>¶$ì RJ¬öÞ9À;÷´lÒ_ïÉCÇà˜Q3.Evq—lë0xE3£9¼­Œþ.Ù“IÁ?x³Ã­¸–šÁšÄXÏYGÄmz¥é¤·ñ;6&˜®\çZ‰LÁOÇ`?ã8×XÝħ±²GF£ÿ‚¡¦5Œ(×tºêTØÞ5þq†`öºGνà09|–9˵M‰*£9TD*¿ç¸¥ÍˆÂ‚žL†¹ª¥ßo¤²ý3B¼?SããåK÷ªªèlk£fdÞuÙÈ.GÎÜ8†Çve© ™ Zǧ«¨çÊ€»KeÈ=¥Å§±ì;?p^ÛWp–œy#‰»,Ô er‹R`(W éÌWå?®k—ÃPîź D-ð[£ÖÂýØkˆv GC±ˆNFØñ÷5½âMµ&Ê Š©¡8S \ÎoÂñ‘—@Ó;¼jpø/ê TeÒ€9JÈÀK2éÇ¥^`±‘ÐÚÇ5žêJ ÛH楰­Èíädw­W0´vÓ|#*-i꣤oòz–¥ïëÑ畯¨ªƒ³fç£ÿƒ ô» ˆYb~¤Ø¶>heÏÝ;'~ð‘/ÕT§Ÿ»/!/ÿ£ÛQÙl†%›²TüqØåä˯Ê—wPñÇ{°…¯ƒVî1{ÄŸE¸Çä¦÷ŒOì6É`¬tžY$ywÚÊ“¢T6ÛJT«õYý¾¿4ð–»7†íök×¼•Àh ®ÒdÌÛX{ƒÐü&V~ó¶žÃ‰± _dˆ˜Ó Ǫw¢ý¶ÓQkK2xM†‘Îd»—þ]µ r‘ž'œ¹=ÔþTn‘Ó"Ù÷qL„\·¸„,½û¹P>\Þv"Œ—Æ’DLwÚ²þœðU’õI¯o|hËT³{ù]Ô{bnµÖr%'JnU50=CPïJôäÇ õµº¸¿("ÿQÈ@EصíWÝ-3íÅAœgþ÷f¹ý{îPXCtëü1ZZó©n6.£3Ò%æžjW…¨Æ~¿’ðÆØµÎ—7|*ïOtUØEÅbî@³n˜¼—‡Ø˜]ã1y²=háRH‹º„F/J«çi†„ñFàC”`+Ž}-LDõë\U(ïÌvèêNÄï5N§!¡’šÇø|ì²Ît2¾?÷·hòA¶…ü`zÈ TÔŒ&‰o ƒ'ŠCL/ôNõãÀWaÍ%àÜxÊÉ\{ti®²õ?D±'ô‹eY×€ ´hÔ0ÊíFñ$]ªDg‡3aý;dôvSΗLÎÊ=Zç^}}FÈž¢1=%ØÕ®ü ÷ùëiHuiP¿sèûΜ—š¢³~­tï‡giON Œ0 ë@Š6ê)6Œê”ŠÎb„Ö:ƒžj0ΆnU®f ¤îîˆ3À‚xð«Ls”Ëqç.µ°= hÚv„\Íl‘bªÄíx·:à&Èü©‹ÏçÈ*¥ßM_ñ<ìåhÑZ†:ØTˆÇaê6!üiŽÿQÇãݱ‡Â¡•#iWˆJ¸ó䓈 ±"BûFhÉGÑK´ÏO¸‚“Pü½âGì  ”ëö•í±Œ{ÕÒåì˜Rc¯³Ý«Y$,+?Žú€™Ø^”7ÞH‰¸ÅØóו©~®j·Z+O€Ö ã.ìø _°‹Ê1Gjñ#}¶_…mÊ݆MÈågðB—kRÝ7BWÓ^T:.~3þ€ž—ØhŽÕÃÀpNÆÓò#Šl×öâb¼÷aï|3g sð©6µçÉÎD‘£Q ‹vÒ–ð+6; ÞëA•ŽX‘<âtØÆ‰ qhAëã—»i£q•Õm÷$žÙH¼Azž?³–jTÝúŸ¼&|aǪRns¦Äù4V¤0 ½gƒ¤_‹ïÌ >ù*ØëÜ€ð› Å­%®)£´ îÝOe„úyä?oðg“ëòæ®É¶ÆÁu~1G›õÄØÃ¢òOä7}cM+=zíúêøûV· †}=ë`ä6È*œ’nñ«#ÆÂ_h¾½bP`^ _ Œ#6¶Õ§¬–c³ Ðª®ê ŠX.dN'Ú˜N¥fkû˜„e§Ü©ÑÔwªLII3îêµ\øYŽCäÂåÑn­Là.ˆäŪêþ‘M•e1CUr2Ù°•ºÅšCÃ%¯žÕ/æÛ§¬oRÔÎ|Õãç°3ïšñ}•XðµtØ÷»ºËÊN»cR1Ètá&‰ ÁÒxì9OïWÛÞñ?”V¬ßSèþ嘩n03ƒ ŸChô’ ™ö2—f¶íÃ)À²÷Ö$r¦ºæƒP›F®ò63<íOd+ò½ô/§AMOá‘Õn†)ƒåÌìRiŽ»x3”2ƒº¿ô•üõ„_ïˆ0²¢j¬Ï~Ö{éÓÉB1æNGµbÌ_Àíxõ UÓ®Ù)cqÎòuAž…ûÊ™Äêet³¬ö˜åGŒhq.P…ùÜÕµ:5QB­„O”ÝW‹P~%$ö|…64X‘ ©>?OÚ,¶FÌ;³ýdÙ0»(dCŽ&&OƳ”Ò.neUÒ0BÉòëU³N\œªb0€@Þ˜9«fçíD5ÅZ«ö複z{cYÚeƒWåí]SfÇÆ¬÷æ=Éø9ïN­¼Zl˜µ¹1ï–²p|tȱ\ÞBÅ_YÂHÿ¾j{kl;!±L|ž ÿ+vYbSàcœÎ xSüûÏ%èÊ,žZ—ŠCò<ìç*»«eú4Z.`âÒÙ{-NÙÉÎ:–à€—SÕA9½-k˜Ñ»ØF}™l‚^Ñó®VV‚ãep¥¬©g@`Ðì톭kXýþe6p]{¯cÐëÀ&⑘]>NÑÈl޽/U·]!w}ð€ÁqóMæç¹½DŸµ1þC”êï†_â{§j³øŽDò*nZëKà¨Ñn¿™3…©D¥õa}ªê]GÁ’4zBÀÂqU½® ZˆÕÛ3mš)j8ÜÓ8µ?/SXÄÍ VæÁ6oμ]“ñ%+âRU?Û¡ ¤ô„×Õɶ,¼R#¡»ÙüUÄn{z}ÞŸçów{uÑÙI§èkÅ;$ ÎkFœª0ÅnFâ-|õ¥8P}¥ŽÄ.Pâ£púAÐáÚSðF:»û/»Îìð›+þÙºë¹5A]ië¼DÎÈ5rÒ Zò×îší tÙÔ\©o¿—™ûrÏh|šäùDˆT—_R»³Ò‹ØBªiÆCöÈúKæ”!µïcUHœ÷F¯­é96¾©6šíh—…¶2ißMµ缊ü æ^³õ›u¤ÁÃÍ.Õ± >±WAA0B‚ê&NÒ“¿ß嘗$7ŽôÐ0±ÕþÿA¿aLêÅg}­LÓ_-G¿ŽßQ<H~YqÇÚ1\²iœ  1vlµ+‘’§ïð;Ñ,¶2aì±ãFIO¿·cXrtÈ_}bñçÔTZ!'¾`ž-{¬ß//÷gmÝé Q‹ ‰ì°‰á½=¶Ö8W ÌYéD· P^8§6²m4utál@æ#Ó§ñëÒ2Z\¥áÆbŸ.},6%¸¡@EÃ!DmŒ«~ÿA—Ú¥<Ùc3p›<ýª´þyDýé^†>§L¶m’Š‚ÚÛõ„·Rb·É`#’ŠÐyà¦{µ×'Œ¥¢=Ͷ´zbÊñtzí®ØPcûf˜Â¥8¢)Ö}×®^9¥“ÇzÚìœô¨îÌ<ðZtÊÕ^L~˜ÝNÑÔ$?B˜²'•²Lå«È¹2¤Lù†[M|•qN®AÛ^™Ÿ*‰kó³–i¦w™¥ÿöô²âG¦ò·ìPÈóªØ ÿµQ¬o›£Yd<ÿc‹¢ÛT½$-õ¾ùNÛÎ×¶ºº"º…iÝEXÞy´ ‹ÅÔ“¦ãŠyŽ´»HdG®C¢×”È]Pf<ÙHÆ{šA_Øš0õ ›ø‘B/½Wƒ•sõ¾ô.Ÿcý÷ë)žVÁ¾ó°Î3Ä=Ù$Ú@%ÈÒ›s·iO*«¤.=Šs±eÖgÌÍ¡WYsô˜‘Ú:cÄô•¿½Œ}²l2Oþ­šHwÐú¤‹ç¬ï÷÷ì‰äQŸI8éqL¢xd7tø”_¸ „Ö O^³@º€¸*$ÕðVsE0D{Jˆ/È01tšNÊÙݸ‚¹;Ñ`ü°ãÀcP¨è¸DC†K4[àÒ¾µn‹°âMã7»¨°·a/|£¢Q@€ÓÖI¤âà1×Á’«fõËV\ìêÖox¦ãAC æµ(”_)Û¦À“KöÍL¸v¡(’þºZ§á|æ°jwLÿIú1^p`K*kÿü¾pQ@Œ-Àr{TÇœ6ki”ϲ°}çD.Ré­‹`fÿH®Ê´ÁÓ -ìxn$¹jßÐðLOáªBA©ÕzA^”ùùÙÏm7:ðåêþ"eØûyôŽžJFRŽp,´h„ùAÞ»rUÁ‰oŽ×›j Cl¶“ ÛKPM…(Í—òƒ±ÊK­Ü©Ä/¢T"çor§NoKJ#æS •0ú¸^]~p¿àèiç<ÑfRÇW«1YéÍlP f›úÙÌ´M…{€º”yÐ]žUÿ ¥—Šy°yR:“êqQ°Øyj px¥œ¬3˜§ÚöºH~ÞY â%»ÜçÞÚP‚8Ä4¶^Â9绪Vʽ•{êÿ¬± ˜\;ÞMØ›€_÷T?ï^ð¬ý⺛aØ6*H¼C,È$&ö?&øÏAÿ´.×üa³)sÜWùÊ©Œ˜;Ri­2F³8Çýÿoì‰Tn1Q$[`P éå;£ùÒ¯‚i·a…ÉâÄÀÝ-Fç·>=9áô¬Zw>ôÅsôÓp•ÿz”y‹O¼8¾Ð€OJ³Ãç)T»s$kâŠYÎó%‹µÏO­P„âi³8:Ìþv½Aû‹Šý±Jÿ€'%ÁÏk'ž]Û5¾và£÷vÇq,:ºhº1èÅý‚æ“OR™‚ü£Î-³BýSº?(kTªoAO ùÛ'ŒïÖÃÛ¨¥q §UÿVßתYÁ^ã‰xyƒ/Ê‹7aIŽu•zs-]l•ÝÛ¿Ÿ­ÄvY/ÕµÊÔšÅz|û07Õ=ÔæGä v_/db\1Co€gåÁ#Å|˜uÈ£:p{Òòň7˜¡ PÍòXjà-Ã_òu3êÏ@ʶn2 «dVÒ2ð™9ŽDuïB‹GÚ@ÊW¾7"Š®¯¢ÛÈ9btGm¦,—Žž4#_R-%„¼¢ƒE¦Õ³œ¢)áy:Óˆèä1!NÕ«Q¦äÕ¨Ã[.î&¼AX^åî4ã± Œñý^&•“åUø¦• ý ›H&[€E%„Xš´^9Oð§“òjM_j}2 ®B¤/hò r#ºHÓh”—Þ“å?þÿ4\RᣠΧ¬Îÿ%Ç稄@ƒq4>í=Flì6ÇõQX(XþZM*,‡/–㋪ÿ¦ Á¬Ç®@T¡=ijÖNß)kkŒa$~,w]¢agƒ‹ì<–çíe-­TMƒÚ¾,6–v†Ñï¨ ÔÕšTrŠ~Û;3ðdõúšR'Ü é%Ó'ÿÄœ¤ç#¡0\—Éã?–™\.[}žÀèÜÎ=ÓI—Ã$^#•·²õ™ í-ñ"´_õ“†ìeXXkG•3AYŠ´,§Û<_)ol<Úµ~øìøËï8¥ïÈÃGÖN¹f h—qø'×)‘9çLœÙ¢CKÓ:Ó&”ˆÿÕ<\¯nk!Íë÷gæûºÞ‚JJ $ò.Šsžõíàije4–•Ì5igq¹¸æÏ@„Î^DŽÿŒeÚâHBî®p½+ŠAðEŽV ¸®  êYÒg=¦}PÑG²k€ NöÇÀìRâš'žç®!žÔSÛ§3ÏQzYG,mþyùñÃcþ¶î×Yn*=Ú±Y€Sjí1™“Uœ 5î(a¥ýsö~Tþ5èIâÕÒ{U‚o× ç ä zßo =´0 [¥›HAl³œ¶<…$ÖWÎL9w™ »ö6¥šé4HãüF`kãñwÞ¿‰B][˜ñÒ~ÑaÒµ¤ªnµHH…3àÓ7q>œF´ŽfeÁ”/¸°X©P8X¨¬aãä£zxð]Êßò4ºì‘çÿ¸qª{µÜŠkl¢_(uY"#ÂÀø‚Á @ÀçD¥<‘dOˆ'Ð/ºUSQ¤˜qÆIiîDdeéÆaî€OÉ*èy“g,O滉¿+#…khº\ûá¨.bâD~O.‹Þ%ñöËÔHcS³Ð•ôfcƒÙÿ02{}ÂQ[¾C#÷0Ži‚î¿å`nçÍâ–ìu>LþJÂIBw#È’Ø ˆ.x±ù;“Ä~nŽÞâ‚Ù4¢(/“ž û~êG¿¯BÄJ¯XèÐfüžÛ°;SED9jí˲&léÃø$…2+:Ú5XŽÊã/ágYÕÅ [¬÷™ÊËÀe?zž&´ËüMãøoL¯¸t£{Ç&Em™ ÇIðÖ€þeatÖæ ŸÝ4ìû0väûÒ7­‹ÅA³"¿ \Wqº-d¾ñ‚c=†n8GŸJô°fŽº„gûl_wjͲЬT®›Ä"½lc9’åÞ½óDÄz+ßøPZme÷E»¦p:”ÉŒ½IÕ?ŠôÒö<´™³"¿NŽ&(ÐA¼É§cxéâ­=4Ü}¡¦ùø×á鬈w8êÜ4§ÿ¦£±ß#ýÏìñï&°¥"Ÿ(oíÒC¿îRâ{ Ý“ý í Uf¡}¡Œø^ù:®XÌÉÖO&PoiÝ$Ŭ3A³fÿÅKp¶Â'6õÙàŸH3ZÂÏ9#2Žwþ1x!”¦‹U”ó*²§ª"Áþ.âk~1ç4ÿP)½`ˆC9ÿh^ÃÅ+µ"×ÚßÓ¸îw+#¯[Áé£è ˜)2 ¡ ÌE¦Y±Ïµ8qd ÚDcËÖygÁ­Ñ0=WcÚoy¾ÇŠôw®xb¸—¼råLÆýN¬H¾äÿÙ®¾«2Õz&±õ¹\ÐDn3ô'tÜ…Í7áàsŸÂ[=$*½6^­¼‡JðI*möH¿cEQ½^déYBõ©z*nš‹^xÙ^Å•e¢v¯õö×"ú¥õKhH$dK„VqŠ&oï“Ò)ºóû˜MÓA°è 3`¾±‰Ò#ÕÚ+wå]ht\ú«Sjc²Š(gß̓ü¸£Òpùl6§þ+›žÖ¨Ð¸“Ÿ-„í½ƒâhÜ/îP Ù¿°ò@ÎøQµT vn‹ï,¤20!½}úxè² Ôò¯qpñ3dB&qðYž› gÞ˜AW” =PŸ§$Ñõ’@ØJ#ÆêŠ Ê¹!òÎx·€/5“9^P¢Ü½Îr "VùÀôªp£<Òèyj#…fòMrü1È÷¸8äA‚Á“àI‚³/Á|(Œž…øg*ûÖô”Ö…) ¤>5Õڊx[]4šŒsd¼Ùd=8y¾Óo!'½ÊÅoëÞç-ëÆ"&»" ˜f¶)júe-‰¶@Ym'ëËOQ,Ë™H¶\”‹ª{ÐZÿfæJÌŸ´ú“tÇ${uŒš_xH«‡ªÌòÜ\^†æ^ÇŠ”•uÊîø.c¹*ÿΠ慩4sã6Ú/çVR±JQr•ê]< 4']ûz:e|Ê”ÿåã?Ÿ%Zn‚~žƒ($Ðÿ2oƒæÛ|øÔëP~Ãe»¡J.2…Ž3pJÞ"a½¨F¹;8÷œŸG¸Ôçà.Sˆ±êgEŒZ3ÿ‡užÚÔb@´2»dË…z  #ÏrˆèÔY%sÔW’¸„‡õ»ÁÔädØ(- E‰éÞb<\wĘñõÖUÄÀcœï¾eí_ܧk°ÖFÝŒm<¯!\˜:-S[×Ü ýêk©|‰<üRðí½ÕÐ-@zsú&¦Cjè~£L6 ²Ö[ý”â¦ÁÀ?X>v’OñCı«á¥ÌÇe&mt”®6ø§î{7˜V^53O¿´òV™AT¥ÚmCÙ´+…ÏÆaAñQ¤öŸ¶èoаç^`­>Sº£5ÓÝR?|ÌVZ¤oªF³15™FÔ)ÌoÊký´ü=®÷ÂVôp£qŸÛèé‘|‘ÓqC?ˆrÂï¨;gÛž5“Õc®cш¿H?ÕFÎú“ŒS±çn¥ýá4~fÌ—©þ`a”Ë‚Ðö_aš…rdï—œ÷øzú“?ÌAo—a‘òà¾Wÿ`™ma`ŽE@ÙGb6"WÉlVŠZf©z×^1uzñP9†iÈ FÊšž²“ä´¹=ÁãltÎyq]&ò‚X43¿K¼ÿóÒ%n 1j¥M¹®Ì}ŸÉH¤ÍSï1%|Š<íb͹ xèÊǗ̆÷W²LàògqÑŒ)Dùt`â>ÿŒF`ª¬:ÅÈhD¢Hœå<š±lxÃÜ}ppO¯F;§cˆ)pµïíÍ$(] ÌÏ«ãÑÊ ôCWˆðš$l¨s$$Šöð êù*+Š Í5ïÄa½v}QÕB™‚BË• dL}¡^ ªô´Þ¶Zíd­Ì«ó/ Ò⤮¸••”ŠÇËvH¸•;ÀÏ9ü>¸>OYO[SÄ §@ßÑÛ%î8o”ÛÈ3í/¯Ôžp…YÎþ5 ŒCgJ·­ ÀÚ…u XNüÇ*´×:wì ~ q!.VLnP“ZåÁeˆ¥¸Zuxû­iÄÄÄd7»qmDó“T©¢û9uä(bj–úü~)GŒ†fRêZøZ&™DHH-½uaƒLT©9™ô¹ã'ø:)2àEæ¨dsÿy>^Ää½@¹‘±‚ä}êü+LÀ)SçDŒà§¼ˆ»´°ÄóôÞŸ6·_Ï;`¶[å…6†Ji+å×Èݽç,Pdê©‹±6›ëH ä&Q¢Ç#I´2¸*ÂòEQúZÑíêbÛ‡ÎÏ ßýlœ5HŒ†—Œÿ)&78—íx{,+§º±dÇWQhWVîz¼·Jö—º; ›]ŸþüQ­Ñc)ð´–‰‡ö¨tËj0,Qü^>›bŠ«O`¿(ãè]ÈÖš“Ùm¹UüºžÌ-AÃÝ©jæ¢h¥&Ÿm&Â.ÆÑ\½Ô¦¡ÔÈëkï›,ÿ0 )mºÀ¯çúUIæõa¥tîñe¨Q4ðÒ†üï'âÚê3Ê üÒñú­_SO­Å}Ÿ±` ?ôö]d oi˜šQ¬wJtcz¯Æ!_}Zƃ׬_€ò[j½Bõ˜p­$}PŸ¥L~¨Ñ(¢³ž¼ý†«oòæ(TkWLÿ¶ƒŒ„5ÂÝʈíIÝFÑóªwQ2è!]Lèï¾uVKõ³ŒRîÓ¼Œ¥¨~KDæ·|ÔuS²L"שŕz’kû "åÎLuíû-YzóãË2 {By eˆ&éw:­Óµ‚ÐÅRÖ7 ýÙúZLî‘8Ÿª©Õ/f>lõâê°I²Ó¿ol3³îí‰âÚ~»ô˜ß|Í\0[“:“¿×.ßb¥¨z÷¢µ§ àDÉ3ƒŸRà¨ÏzÃn®¥†ý¹OÔ§Êè,ê57}ÃI¸Ò›Ç$ërÂ:­}@˜Ž5~ÒDT¯J98½»'1ý–ot˜ûã l:ð_¶Í<¼h¿‡{øžÇ©ý¤T,LmTæ<§Ž/F¥î2)ô$Juݪº£ Z¡4ÛŸ%Ý-Þ!᪌sÒ˜¿ê•`ÍÒZ2,4–qÅfcª¿ö³þs;+0³½jcÂ+Î&IÑ7BÙÖùW>æÆ‚¶E3·Ã$u|¦¹¡@ð%gÅ\‚É>ª  ]É€§pïìÄõA’WíŒO†ÓÀôaÛ‹2œ³MÙȾ.*z\2ªORp¦E]<¹+åïäî•úÓ^û–ý”˹ÿÝ,Û—7\7å9 I}Áhb\uMQ×·A ë HgõšLzµTañ~n?㦰s$ÐÆ¾ÀJo[³™f í¤ZPr˜«yscÀ2dæ$øjEµêzj³Xw—:õ;RIøgϵ )â&Bk†ã€«†p[ò͇a‚&&4 î#Cïñ` Mê!MÖ|Ï> â4Ãg·^ña(ÉÎ0d™K°ʧTÅØÞ®x exí³/~@ôVGnéÏ<ø—£¦X¡\ÚÕüóü,¼t5©ÛI&j>wì…\Å7ÒïÛÙr‹èö¤4¾ÌÄQê÷‰‰­h¸/¢Ì:ÊêèDC*Ô$™¯Ç!œjå,L°X 7¿ ,¿— a ìÀѧ)·´×[ Ï!«Ø} J–OyûnOèSmfb—#™(µE5¼è=.èä&WFêüŠ.4\¡EQP÷ * €±þ¾K _Ìõ5/›ÅþAÛÊÆŸ~» -füŸµ™÷Aõ„ÞÄþáe«á6ha,#kQ£f䩘Ò_ ÛFñ)®` (ñË{öxmÄ^6Yû"ïÜbn¼¸ÉjNK·ê×½·½b”¸éª…–~åèJßSéGÞÔ49/äNȵÜäëÉÂÕB]ÔcBVª Þ±´º•%1)^6*üØM«%·Ç`¿Ý',בˆ"Õ16IꚈÍå„C‹ܫEº˜ óv¤“«å!ðMœZçØcçç8l/|m±n™1¡¤ÈèÎϦ}úGp½ ÓÕ}XÏiÎçö7-íÆñà®ÁΜ.˜o=¹Ò7¦“' Ðséý\‘”:)Q*¤mv†…šTüR Ôî×ÅwLå”Lî ol`Ù{øtøØöÛG€ûK÷:6ËóLk d>Ūˆü¦®¥D|œ 'áX…åöôù¸bƒ?i)¼ÿ_dõõ’¤8öÎ98úQzLž2û:–éÀ®Äeu«cã\‹ï.?YFêS¶Íê]‡·Üx{Ñ.j؉­Æq0¾S4'çŽg%{"ïù¯Ƭæó µ« I(hݶ¥®J`El‚æý Í…Õ°Íÿ´d9^P£°ÉÇÀ´×Å‹ç#ïÿƒâ¥#Æ £YQþ‘¬˜8¿å©…v󯡩¸ŠÐH´dGóëÂåÔÀu•Ѽ‡´ž0ªãå4eÞۑ꡵n²ÝLt×cy|À<•®«‹žJDÁú<(…¯œÎ?Å `¡q'3Íá‚àÉ·¼}I°š,ÈBvšÀå;Õ\]Û†ØL¤j¨i.}Ô`ÇV)µÿ›|®L)ï M¤ô7:¯ëŸjéµn«¯K_µæa=°p¹ëƒ•Щsìœy¹ª«Œ¤†‹ªz®]¹é<ÿð ÞZ(Æö’ø¥‘õÓÚ+×j-0m:"ši/ÉÌ*”Ît`kn‘O›ß˜_²®i9ÓÁ›´šXÄN ïXò¿5©¬Sh÷ µ#{)ßóÛÕŧ³Ë ‰)Cr„øLï:Ë9@¹å ƒ ýu¦ãU·Ðñ_“>lÖÅЃs{ÿ¤è?0BbþäÁóF´³ÒvCO‹“zÞ±ê®Ú[|h¶F¸´gÑ0~ƒ U”\¢ ,€õf_lPc”Þb’·õBÒ’qæÉ‹ìçÞߦä&¢Æ(ræt<µµ#‚´cö¬ý]¸òD’?nÞÑ \ñǽˆ_†ïã„j5" Î ã$ìÞWꘟ ¸¦Q/²§±Ô¼Î}iMs…ˆV´\;ËUÒ\³¨Ä3ý­,µ¢lyÎ’‰n½u]A?%˱†H¸7BÎñOu2ùU[ þϲ’K—8†¯ý  äÙ.ˆ7™Lí?¸VÜÈ¡”êr±¢RBç£V˜yÎìÿžC”&Z;jiÎc…>¾Ê1òµ¹¹ÌôrÔ5?ò‚Sz9µ3ØÝX3ûö½xݬMBpê°Î™nÊÆXpÂèòˆ?íZ­˜Ü- Ú¯ jüCŠÂ‰¢4ËÈÒ -VʸÆA4uÜ­>Z zi¥¸ìë‚È8ƒyÀÜm,mUAµ¡;é ‡‡ÿ&¿pºøÈ°eøŠ®jÚ —Šbý.žµù¯&Rø 1ß 1÷ޝ#êsgë %` ó{p÷°,ñ˜*¹àFäžõ’,¦Ï^ægl x¾¶öB¯dJUÝÐ¥Êãdé‚¢~zm Ñ÷c ›îRËŠæÜLŸØÎƒ'bsÞ óè¶rÍ‹@õ»+jsa‚Näiyî™XÔ½ñ¹1n;ÒBð7hÂŒ—XdÀ§-RæKŒM7À&MÛïÿ—e(ÅUêQ™„o£×w)<áÓSý”ô’;)C~¥o Æ=9¶0©° “Ð!ñO¹Ì‚'aÊAÏMç[ù€Ú×3tAÓ¹½OGT?Ï8‰r„˜·¾FŠ–ZFïúž¯í+|A=3uÎÉÕØÔ„÷§n·÷1‚9Ì•ÎÄPo·pAЭ . lIÏöéeT:3£?q:°­¸L‘:}æûs !c±¯IzçÎÎQÊ Gá%ï}ºãôïÅÐeaxÍ'7›­{5˺÷¹ª·$T²äÑþ°_еM‡vÕQújÕÜ5`ß¿F™Í¸N& @¬‚C¾Ø†Ð€‰nŸ6<Þ!ï¡À#“^ D½s¤&qίÓÍ{1=QeÒÓd&Àm¥ÞÌR.a “ iÒB9%*q×£åk¡#ÉÒ!,ÉÝ{ü_8üÚbçÆJ$æˆíä7†ivˆ°…B(¹è‚¹ö¨_Uß ¾@ßx'qÔ_ø¦AÌ-þz[l©¯A¶6Ö±ÊÄÙ“'}……|ºgg†ëŒ%vF8”â¡\JÞ>i£Ì–ÏÆY¸KìË äÇ 1?ì9_¢“èÅEê|š•Ö€/”½sΤ‹©²øE ÚA"óÂ÷iú;²4$ƒewžbù<÷r!û—ƒ3¤u¥MÁ¨IݦçK'ÇÏ©)&ñmń̃êÊ‹„üÜ‹ˆUTtûCU®§›Ï6ç„Ñ©*i«p‰V‚Æ`¿GµèçÑ—Ô#,Sö ó‹©onÑjzZ÷ÃÚidB§—[¶«_ßésËíܡø-Ã÷õņ_y©MƒHnè¦?kïù y±iA;ÒC<ÌŸ½rà}$QEnn£4þ¾ˆþã´<¢#©¸û[qIúHØLEplàÏSV®Î ±™Ò^žy„È7õ$³uR£y/S¼Ö®ì÷¢ÇM²é#žÁg}ù@¤:} ªc"M»c2…{ñÁ5&ñ(ž,-x(‡úWÖUºòD¹Ç̵’²rRý­XS½#ø{˜Iç% Š'þ mæíø×:¬i²£ ¿}Î%õö¯rrns&€ÉR²PÙÁñë4V´>D¯dï ¤Õ‘Š0 É‘³ýöF£ƒ€Ç˜¢¯òe§¤p"F·Ê34È‘ƒ iýFùt`äšLÌNì ðsLѹÀ¹O Iœ6v†‡vÙ £ö%Òœ¯óÐp”ÃÖ Ä_¿ía‚p‹Ež´“à#ŠK j3?vhx "°2p ^‚òßr‡ ŽœBÐE|wŽ„­4Ó¥7ÏšPíiî`¬:^ È•³šPi„¥rh½ a±±t nãÞâUÎ7ºKrþT´û~þUëbN<ÏÑ#k÷ÛXu‰º¯OW7¾™d*öfò/™;Ôî9¡ð¿ 7ëË[UÅÉÂÐï¬ö<ê,Å$--!"•—ÿ5/hO0? Õö{ð|Å¢¸ÿgn–MÚËH¯8Ð?}QHÞÍçáµ÷e¼àÓâ+ƒ÷wn¡à#aÆ–K…ÉyÜG’ñøsšü‰zØ× 쥡ül¹d‚­—z”‰ôqk&äÄ~”Ï¢AÜ£¶øê…ñÊfñ§…Û8ó ¥™xÐl\T‚6^el’ƒxœGù8ÑÏ(]†dwy<"¨CÚúhBM± :…B·Ò• gÝÜEíÆ+]#Á²ö5̃IŸd_ †Ã‡·ñHÊ$‰`…R½1PínZüÈRú÷ŒnŽíIú ÝOgMÊ ¶‰TǶ~çÄ4Á F¸ –QlÝhm P݆˜kg›þ°Õ騵‹ žfÿÇÞv>ØèÈï…KónYHÚ²³CAJ(ñŽP“3Vç§aXBÒ†Þè-Ãǃƒ3ˆßwQñ§!0.¡Š(zÞ€ey§ Á£,h•0sãT‚¦¤ªp•¯–'%¹^I¼¢µ³Dß#\°K;bZ›ZtíŠ),W:dÇ£º_|ãÝúMÝ_â„dõÆ2$=È%» ’`¦ú¾*ÒêØÀ®QÈPÔÜ€YãŠvK)V$¸-Qæ”Á¶$²ÜHÑN> %Ôô¡è1~Eµö.±xT°ú¸EýŸÎ$Œ–ÒZY¶—Øíw·!˜®wZ› Vœ÷Svµ=—‡ÿçÆbüì8MÌŤkB$€¯-1ÐId-ºÀSR½‡ƒNÃ+óV.lt—·z Øv6YÑðªáÞ ×TJ¼§”WrŽÚó’z=›šú;;>س³¬éd¶÷NË :yVz2fÚ%v6ãvZEÃÝC¶±iŸÃEBúïæ)ò/•>-»œm6Ô_œDž½¥Rf ":/?ž=.ƈuæôè­ŠÃJþCkUŠÛg»{µÞüT¾OÅnŽh1…Øy|JmvJ,Òý<H. t»ïu#Ø}^³P~hlørqžU¶ueZ­]a_œ|‹)49§Ï ´né+Z^ÁéNçìÂAwþÜH+'€º‚[“ ÅÂÈ.å«Nb‰ßµ|ÿôÐÆ»FnªwúŸ]L‚ sLБõÏš%@˜'æ@6ÌÜ{g¹ôñköRµÆÅ«¢ ëGÞ&ÕMÊWNp"¯&mxˆÜb5B>%‚T*Z×&²Lµ¢oðòe ˆbq R\Ûqm*jÜÎÏlw±`’þïú!üú¤@Z¦uJ©C=¦# L‰Ì¹ú4ã¤aqf3b^ê»”'Ù®ÄJö´JóI`Ä&h×+=Þc†&™Òµ,"x AŸˆQÈ_ˆ­ÑmŒAËù±F›Úƒ!iŸ€AÐùx$+º€õ!ÁBDÆ»ç§ðË·žn\uúžówZ><0»n‚ên ·†ø­ḛ́]h“+‘ýþ€Ìúú˜ë´µ9ò_f2êRê¬êõÚÑ[!ª2„­×mtþ€šéÚ$éèkq[…¼q~€vÝ8å3ÝÜ ¦‘¸ç‚’´¥ÚµÝÁeš¡C[®y;¥ô—¼®Ò;»&—^¤ ÀðÄ0‚=.dåÔË.’qmàd‘"-oäû~T)ÊÂyü J[’S€Éº[ãüšS¥€Ø.þ稤n{'×exùDM€ :óvB `>ŠšØü5^­ÍéY ýýö­Ò,UC€èž7µ/Û¼ƒ?q ,”JrÀÌ”„\£!aF:?LÒ›éyd|ÿ0£Z* ¼,ÓM§ÿÌzjX«Q.þ!ðzö—¾nD¾9kÅOÿMLtÂ3`ÌWSh-Júé0&(½ØÌv±?DrD[2Ò„m¥ÝÊò®Î£`‰þDtÞsÓ-§—åø×oòW‰~KJZW5’vg¿÷<‘ü:Véu¢ =0½ÔÔ³úãx£ºÛ"äŽáÿj#•&¡Í ›ûËKž*™ö@"Û»]Ü œã~•¸.ëÆA¢»—Sèi Õ­} 'Än$$·6Fx#~H õ7'éJ–³1°’ØkTÔk:y…?ï¸ÁRE“‚OL {‰Ðfµ=Y0´•ð+Ü"‹ê"ú£? óú¢nfrgÓÝõx†Ó–W;Å%·Z%Kö^K¶6Qi@|ê„pü^kâK R©òÑŸ°y¹’ƒåc.Ù½ûZ¡'X6“k­µ–cTç¨ý#¨aypZ´’j$lÆWŒÕ É &Íܘ•ouÃE¹%2BaÊ)°Ù8þ8«'+®îÌf­öêáé¸×läÞb†Û(þMæBÎ…çØË$Yæ4ÍÎ?•Ô¥‚ñ÷yX0à0(GxZš¿)0å†ñrК’Ç*<=J©ìU¼jˆ6,û…L‰QY‘»¤£Ç2Š»ôæGn*Éf§g9ÖŸWd¨ÇŸWz'NÃ;ÛÉ?<¨áý¯H'$†,"oIÃTqñµ`dh!g wÓú›ŸÜ1¸Ÿ(~e[óÉýΞïš<ðñ*ÛÙé%<]^'#çÏ•ÝÒäG«îø4ü¸ìôe/Ï¡uêàžªnó‹7ZÝR|}þ·‡úªgÙ;“õW <¹-=iÄߊ۞ÑWìfY*£S. Åö:«At»à܈èéžÊ©äu‹_V¾þ3ËlYÏá|PcåZ„cëG^¬gÂ]ƒð)g¨ˆ]Â@¨6’á§`$ç¶VJò†ÎUÿ¡Õ åÓ{ „rºã\f®e Kn9s`(phtìÝF…ôS`›F½÷Ò²nú؇_ªÊ%Fhj¥tE‚H- þúàÑNBuõn]Q=úʈ[©7­€ƒèãùè‡íÁbZ©ji BÊ&°K*7U¬Êd›Ö MAÝ×Åq»gB‚Öl]ÛŒë!N±bZÆÅW7’‰³¡e´xÚôÀGz¤^Mp§…·µý¤Š ‹EÅȽò‘#C ©ìýŠo²Å-“£4¨ÑçjtŒgQšqE‡ô\(\Y§gÏ!rå<ºÆ×7$ü Îfá2|óÞ{ž˜EÂcJøyŸ¦ª¢è(t=Ýs€s·#ÒµÔ]ñÂÒŠ2I®co&įxÊ' [O ¾ÖìïEoÿÌнœ˜7’µìLêÉдgDà4×k]‡¤Ô&N5 œ|ÙFJÖL’‹ d¡¯ «íôáré¸pa¨m\oãTäÑJml€s':MLø.3û^œUå$î!8ÐHòP+Ƚ™àc+¢€'aFæ Øq xvÙ‘¤”ø0ŠÞÃ-ñ>y¥›Ú²47ÉžZ(m#DÞÊÞ* ªH>žçæ ð # Œ®Jû¹»Œ •”ªDtòÆA 18€ –ï`ŽÖènVœÔù”^i;9WI@·Ï÷i¨¬?á]ér«‘«~öàÖÒ-E½Îæ/s‘u=IÇB –ô‹ŒƒkU®lúQo LÊögLï§&Aè+íÉcØÓÛ†¶ΟA&ým×ëÁí˜YM´1I³î3¿¥8ï‚\’ÞF±*£¼Ñ,°©Ü‘ìŃ@,¾ö X¥íW[ËVê¤5‚ä‹íOlÆ…%´ýóñ#ÛO3¿ñl›á™…’Í ç"­b‘;?? FÝç©¡Œ²C‡CéhK§ˆò½o“<ŒUßI/)QC_'»?Pm: ê wð'—«‡;l E¦6ŒñϦ²ÞÞÿ6ÍíŠ{ÝÂsð~Æo†;MÑ’‘ü;R!T8QÓäé(oÒ§NæW¿ùþ\Þ3ÔŠ'8Á €ýî߈*&‡¤hÁ¯g~Ž÷ ¯Ï\ëÖÐ4´BV•©jâÖá *GàS½DÇ9p&ߘ ;¦öu¦Ƀª-÷} ­Ä;–G\ÜOvÀÏíyÿTŸûØÅU)$½Ý¸šý6Â\4OÊD€Až 0jÛúÍ‹4!õ — a¤]÷ØW#5˜s's¯$ÝØB#ì\Ðð2¿Y™o¿bDêø Ì¶ô“@ƒ`”jùn¬rK  |\Fì ˜i#’Ñ ,+Oå|¹þ]&*ûÛ;c¹±Ö^.€’¶Ai«í¯Ìñg\ì<îw¬Ã+-=Y[Ù“úÿ·Ô„~"9¹æ •x¬¶Oð¼¼Æ+÷2¿8°˜>쯤“peón™ÕfÍcA‡:¤Qê²ü\ƒú «œó=œ!0/Ž}ܼR œ m1žbŠ¥&_˜<¬ÿg‰ŠÊ>Ï|èÜ+ÙÊ_©Ö|œ0Ç¡ÞA; ôAZãÅ¢ó®1m\†LºZž¼*x:8Öô…ª2ãq‰b50 ¹…µAó?`uÿ˜ŒCÏQjÂsÈ{ªœë ©ýC67Âã§ã’Cd1N(ñÔ§uX¬i*ÝÜ3dõ¨Ö'xf.ö?GËÝ9€!5lŒ ZÒ—Æéà·L5ÍÏ)n ³SY¨ÍÌ šÌ\Ÿ¥Né9u)’Já"^–áû$ÞdÏì;ÙIЄºÃ»úpÇšZy¶[©½*Èk-YM$ia^q‘Æý%½²Ð}zð¨¡9×3/*1B|`Bš°ñnñÓÚ‹ùp^‚¼šo|‡TJï¦ñˆô3IâJ_åú CÂ?n<Ôߎmêë ¦™íL±)fB°&ãð&]®Íä¨2õTÞNYq^ƒ¦ÿ0ċ欖$–¸4 áox{¾°ŽŸê‡ÍWÖ³(/‹!ÂŽ…lØû±šp ?\²&±X¢+Qëp’–åÿyf¾= eêYRŽ5fzÙŸ‚wáÄXÙÛ›£gdDf²4fòÎ<¹Y:Dý§ ¤rdë•_¸²̾gÀ#½£18Ävje2R.BòéžiWk™røg´y)£Q“Æ“hal¿´¦cèå"K‚éÉÞ{:Ï(Íù,°ëá¬ôüÞ…õ7‡æ/^O’Ÿ“ ¿qòI «øéW:ã Þh’Úoì`mEõ»€ã­Û¢vòn6ôM;‡ } •¹~¬¡BO#÷¨7ç}»ùc«: u€”¬vùUGÓ Ì(ˆÓëäŒ*—hFF95'ÉÜø9Q}Û“œ™!a¹ûô·rPâ']€6ófÓŠÚÕâ¡ ¯¦DМ:8¸ìΘPZúë:õN\ |_û©1Ò¿c¦F LMû®2ç;Ç&0.A’üd”Ñ÷´jÜó ës<ºÏÙÌÊTŒ+jxÄbÕ9†>zóèITÏVFÊ0 —üÐBÁó*ØYÒX [”0Ýÿ)M¶ôùöÓñ‹oäpùÄŽÇ~U­zìm­á²Ú«ëáëªú‰˜ q¶tTs‹NÃW·þtñ³Í©L[º„÷6îDÿžše?”¬cÿùnK¿„²Ã°$ªQ)«CZWŸ £3Hu`0sÃS•º¾ç»;~m*æqv7 6®oH£†®›$Õ#ï)=/$3/Œ3› òf“Þ}…ï‡s»MV(g{ƒz'ê„]–¿ý>Û|yiš~0Ùþ‹­þÜÈd‘ÁæÅ€8 ù]r¢©‰Ñ¨ì`Æ“?ÜþØçGÊ&Q7EÒnÆÙ”dе)f0ÍùiâUŽ«^y‰~':7>xþÒ¯·›˜5½K6êòœO#(þÊñšèw”js¥­Q’.‚Í׳ËW N£Hþ'ÒÈcn`¶„¨ýu!H|N´ÄHY¥Ï!èR”:3 ®Wã€IQF XZ”E!úËøt•SÜ®‹ÿ&‚tsƆb0ã• ½j|R–•ÞQy¼Mv?¶1¤"d‡Ã…>P-XtvÖPS j‡6wEþ£BI¹,HÌdȳ˜Ï—Ç$®GDškžŠûØÖÉeŸ^š*§VŒKí`~Ýp¼„©X+©m¦y›üAL¸‹n¦íju&à/M Àã¦OW£þ+Æ#ö½&V+ Í‹L£dfK|¦ŸÅzmÄP+ÿ8NE÷fÌÏX&• ÓÀLÝ|ά¡߄Ư6µÌäž!ÝÏÀZþ, Nšz'v]p0”ÂÉl?K±€ ñÆY¡D= Ðc+C>Hü?8Žya8°óµ üO7]´×e$°´¬ï®ÞPxEå¦ýÏSbS­›"ž  V£. 5aûóýS™5Pš3íÜAá©Ñaš;!ýòó–6Z¦†Í|ê^)E¬‚C¬sÇb4¡\\œ‹WÚeHc  C „mÏøÈi¸•6!©|¦ÐÙr ÂP¯DYctê>Sô¹·< ޅB†“*ÊŠ‘ð`Ü‚Xk $‚ ”å·yšÝ`cý@ý¤o1ØànmhªÀ`òfê¬î\¤a¿nÀÔÔ€Å8ØŠæ±þZÛµ›¢ÖÌÆgèUîö5«ˆ£aLì=  –ZÐÊ”‰÷ä‘[ûe;qh‡«úIèšiÍpt,HQZrñ›™-í’Pþ!.w oýí\jœn$_åj05&Ö×ïkØ*Uryf}©Rª|€¤ÌýšÍhS+BH‹h›Þ·+"9[3/+€äølûÇb¸ì \¥¡vת’êDæyõ¾6u V7îÏQø2íIž>n¿_J¹MQ†\y¯l$úÀS·hžV¢-ñK=†çé1¹‹ÕîßÕšÎæÝ¥Žy¦æA;?Ï8Ú5¹ÆàÖ#ŒŠƒ\G§ICÏ“À|mª¶P@¥›>H‹$›ê@•²~ì }ñ´åÎXÞ^24ŸOÇÇ‘öùŒPwÝ.èh´ÒQÉÔî7¿ºJ[õbTðªºN€°V?YA9/|ýƒ‚7PZDð#!00¹“` ?`ä‰@5~ÎFdÏ ±IÕU¢W2ŸÒG æ óº´IAhó•®Wíí+‰SÄQ\(Méβš¼’:€C+Ù I ø9"dÕsc³ªã\°a Mm¤v¬ìS>£ÍËBê®H”­qÇ7C·£6ߥQ=Ç8G-K!*ã['í[ɾnó<¿“ÓB(»ü¼¤4 ò¸AÞo„hb[þµ’£gŽ´ÛÑp¾´ÿÜãˆz€º0g샇Jø'K :°ŽštΦ`¾ü j!#ÂV@ROÉ9‰oTŠø/Ó)‰j$fKYè‘Ãø‚ñ(1û³|ZQ>joÏ£/ìÅ¿QJcŒ0—)I­b§zŸ8Ï,Æs_€¾ò ¢N{[HÓžM¿`*a–$CÖ·KoÊhõ£™³¼ªª™ƒy¶ƒYS­ƒeŒ#½Ñ"!¤‘o®Æøš–àcÙ2é{Gr¾Xê>foIÉm9Ö-Cç…Šb2v Û] ÂoR9ôªﻆÐcÓY–á“Zî[Ãצ€… ÚÓ| g„$Û1ïç& ³Z2{¢ŒIy8Ô}%{ÞŒç–  Š/بˆíäf¡ê×+Ò{5†r¦â­0Ý8í«ÔƒýÑTjÜ,JÜÀ)Ðj4;é»!ˆzJßÂÁTØåÚmní5ä¦[àüçw8>‹&a–Zû¸{(1»1äm`GÜÿèå·þGné!Kz"GVβ=“>àòG‘>^éïFý¼Ý;qcàeˆöõÄÜèü ³L¦˜s¥¹EýÙ½¶Ý“y2#m¿J:± ª‘‹0ðǹÑ!H¬"¼”ô¯‹žs³5ïžž eÊUe²•«ÀŠãfÕoû÷xeÖGaˆ˜9bR¥¦Î–ʵAE³Ð/FÄÔ´#U€×‡DCÏgþ¦ûìW²itÆWA3êÍÏYL„‡¤ÌÓµˆƒ`ÎU"|Ò¶Zí}b<á­êóõ# ®y‡ì[ø:ÆìÞÈ‘ê…RXäŸËJx{2šFœ$ØËúY:`p2LY©$.®‡ ± Üy#§p›œíjé \™x¡WgP±S`èK yÔÓN¼ >Ê®è×ÄäÖÊ‚†³ƒp†[.ÿ‹ˆî}5èp/mjdý•<5×ãn ÃÆt‰ùþÂ…06“ùÕ=´äržB¢!¢2ÝÂES2¢õÓÄ}}óÑvòq‘žä»'cûødÞ&åàM™'È’«F2XD†39<ÛêOLŸÌñùa$  Œ ɰ¬ ±|GbX]+OöÉB”-’’„¦Üí„@Ø1õœ„‚¼ÿÂLJOmƒ“šn芗yl•¼Q¥/|}’hal«+ÚЊSLt /ﵜ=à 2½pÖÆnsäˆcÉSÒ8ã¦~¿ù$¿MãkŤ#½ác!þŠ[1cátFWg†‰U¹…±›'hç³ã?É${uÆ >“6kHßD³ìÇë¨6~Ü_Î:5vœÌ¾Žå)x™Û~ hbS¼CMSÚøCmœ×ÁÖ?µt±Hm.˜‘ûñ)s²½^¡À˜t…Ô‹§%$Ä*f£N€C‹2¦Pgn[‘;/i¼Ð«WaÚð=š»ËƒÕ¾Gª¦zË8¶ñ‘”˜`ðµ$¸är‡ÈjŽáã0§¦*äž'´  œƒ9ðÐ1…\ÍÜ*ÔõÈÉË2&µ£€µêFy’—(y'~ê¼4?»yw‡_F—©‰¾U)~¯ÚU!"g޲= ,Ý`J†9“SüÐ|EÜìgV‚‚GÜ)°)?¥(åb.´ÿŸ(˜¢OVì`PüÚE•Í×9ð(ß¼—6«íÊí¸R0ã¹PPó‚è»ÆX¬¿fž¶0˃1LrØáìšž ]­ &BÞ¯šØ”J0 TÈ J–ŠD4/@ýž)U³GÚÛ…SÌ5 )_²åØA¯“œ¯Oe˜C|ñ,dHžxƒšftæÆ$i¯Ù[‚Ï‚À['Ý‘1£» [ö¹§vµ|ƒøVJÃÓNÇÑÔ”dÀôÀCá‘ö©„îZR-à$à •µ>ªÎmTÍšúRd'â·rçͶžó·Íx¬d~iAçïŽ^Ô³ý^$|‚k抉XÎÍ,©7HèãÈ]×(ð‹ß9ɘ#çêi€ÕµŽÆðwÉ †P3[wS9§xF’½˜áI6ÔAX¿M}Ûvž ˆ%a+Ë/ÑqË )Lt{³ˆÐØuª âXT³Û[|Q/¾Þ`ƒ æ2ìZ‚›- )l—!&7€¶ ¢‘ }e•¼M*Ð|Å…³ÛFK6’7û‰™¡§_§iÐ)A>*”[›d%«IOÿ‘‡ù“.ºõ˜q°{G)ÒøÆM®{ò}ÆÁ-æ"óØFÿ¡$kl«sC»@Çöç]v ã®Rƒ7¤­¢vi%ømê÷c\m{?;éDZ5–£´€®-¸ƒahìí¤uÝ`ËIu—™‡¸È¾¥§ƒ®U#½Õ½‘êûGA<(Wë%?))7õ–WôNj>ÒgP?©)UÂf2V$W;cwùnÅÜAãȤg$µGÿ& ó…Öm‡€û8TH̯á2ÅI&´o3®ŠV"Ù䩆4ÒEO¼žïŠ<©]EÀ¡&i?ጺ¿­?Èå,Z“Nx 9xò³Ì}â$v2‘ïÆ°˜•‡ø›£v–sH|ĉ ˜Ï¡i/ý·3wß»)*ra]¸v_¡F톱—v›ž¸GB8MlügoQ)—yï8ÅsUKWþZýw¬O®K0Š·,kmò{NJÿ‘Òœ i=ù$WŠGŽJÞS7ec…m9Ë%žº~MOW‘{î­GÜ• +ØÁì »jkï÷¦HÙRà ÙSdçÎäµIÅ7©¹±Ì£¿A8TÖ.ÙZNòöNñT¬¼bÌQR‘â©l B<˜œÙx•)ÿ’m×ïçëÀ½.M;G·ìÓÄAê{cæ'V Ãë;: lARÒEû‹9È EŒÆ%í'š~¾ÓæÐôHþ ã·g²`ó„ªu’ø†¯}×8@¶¯ üãè9Ïu+ƒ#=–uبSéÐA¤!:í±$bm|̦^‰sùãÙ,ÍöeÊÞï£\ œ¿)žUIï=Ýü ª èFõ–anÜ´¨«`ØÌÏ2ùÜcî¡À¡Žvuþ+ÊgÌŠÍc ~‰ZZrÿ‰žäaúˆ,OuåK›ïl§iN˜äxrè+“Yð”Q#ºÇؘ—¢#Óþ0,°Õ~÷f³ZÑ~²Ó¢S—–—oŒÔì@õàl'ÏWZ¯¡ýWp|ÂÞÃwŸÕHDÖP©¿~q>þ-¡$%S"ãÒ`©·/xÔh†1{Îa í¤ü)¨:عqqFcQ¼‡ •-(ad#ÆuLV;ÜìóØoƒâ^“!‚*Ø6q@‹ÚæˆÇiÉ臾²ÿTGÇTiÛqÌOäOnÈ ‰åM%/˜v7)þÖW &ù|ÔuëQònJC IW©ñ3¸½2ÇÎÂ;çøädÊdË»NgªÜ€6–¿•r#êµ s¹Æû Œe¦SSµ)¡oÀUÅóz:hjtþo&ÈX¹É4D‡v¨€Œª@­Ä“ÑW¤&>؞ܔ|:s© ³ËIu¸ñj‘!†¯{UìR [yîd»èòéÄñD{q¢gm- ñæºù…‘>Éæâ¹3gbùaTp°«žWÅoXTÿ§­ Kû<ìCÛ`y—òî~(SéOêdpä%QÃ@&‚5#åwªÒ¶ˆ´å‡RS2áZk£ª-ÁW¯…UÞö7Ù£g`Ó† ÿRÐ}³¸gåz¨«P}ñožSÃ&'„3\©ÌÇÏ·¾`VRYÆÉ š®Éa¤¡R]{÷=ê²# ¨fj}ØÇRxn;3@„~æ=¥tL •ÍH¡ë~º]ïy7ÏNG'àZ÷Ùwåe}S¨æŽ;0òaUïm¢*—ÏŠµ”Ñë-•3sÔú&;¼<½m“'ø G9BQ#"mDYF¼Ô.õþÆ­B’J·¬ñs’CPnÁgÄÊ›®¯ñ6ä{¯óÎæj2_ž;µYB„X²þ£"´ôŸMeÄy79jHË×|v¹ ,kWô6ç‹¡;ý™Žæä›K×î£ 8ì¤bÝ@ìžÜ4pý7ZÓ¿ Töê}IGÖÛýà+Qx@¹†0R'£yð¼ö#Án²_çýí¦Å½©«eUmY´ÓˆqùHl|ûBë ;¯Ã.!ëôÿàÝ¿~‚®:»÷7?õÀ«ÑàIÐSÓEê²µÓÄ.ÞšÙ’¸ Ð~í"çnU‘Ø÷ý'P rš·CémƒêKóì¶Á¯®ßïQ¨—ÿ*B8h`s§Ž¬9“—„.ËÒÔ|ßÀ×΂kFÁkü¸Ek/cÞÓ‹œt9XtzÿÑí¨—w`5³^ܺ˜Ð%uÛùî-ì´çD(’Œ úb¨óQz4§­°nß Is‡F’wó Ç]°r…ó—’òZåÑ%2è†æð»g#mQ…÷z ÕAä…¡@ }°Ä#¯SÙýï²Ê&òË‘íz¹¯/”¿{;„)ÁúÇÿy*Ýô1NÂæ€ë¹b|RxoÆ#>~›€[|0¬!!rW2¯òc- _4ây–ÀÈèŸÙh„Älµåìø^ÃWÚÆÞy(öV·L¡>_R1UCn¼èH$ó¤Êpýx^ã»MÆog|&«…9@ìT@ÿ[¸­¬@%¡\Ëš 9Á[þÂ`P£€4Rá‹æõŠÖ*»£[±uzºFZ–Yò[£íÄS@ÛžgÄÀï~&ÄgŸêsÏî9}Îa ?8–Pþ¡P›:Ý ¿l3+«E‡K‹eݧ(Ê Zç#§åsl|Jm{•mEô~éÎàÑ@"ËTräàïãFqYÐíWìs/}«tÂüÄÝ‚#0˜3TûÚÁ…ÉÚs£¢Ê4¿$ɉ¯5h© «Ã–©Á4{P´[ ò®ü€Ý>3°3¬ñ5…áF*ç'0ÈØQ^ ZÓ0‰q‡nP6]ÅÛJ²¾€Ãô[~•aF‹ýË{ÍáV埪ëª+¾Ëu4ê¬T4L®ÂÖGÏ&¨£Ü6@ êü]I5rr'„z>[¹@¦I7áñ¨E&ö­rƒ£“×ÕêÛW³äd2´©Z.ËËçIɤôÁÝïÔº ·Pà¥qVôWýŽ»ˆdýÊ«ŽNÏæ%Rmó¨y]b±^ÉI1m˜/ + +ö– ™}Ç”[ÿ3vç&âQÂÑxó;í àS㜎å>à$¦]¥ˆ81Ù¨It+\íu¬ž =æ™ÈÌÑx|‚èê´…!3Í!¬W#¦cÏé&‹µ ní‹Át€ ‹aʼTG›‹«fü%ÿ¨mn`çÅ][„‘<ã‰æhoMæV äÓUgºxtò#öŠ&RòŒILXÅtJj,@Km‘ÇwÍ9ÄZwNû„*樢âLóK/ºtÈêB û6à BÆŽŒ†ç½n‚½q—•ÊÎö­ƒ¯8?(ZâSÖ^¥8¶²XÅ7‹Kתʬ@o˜Î £IßmÀº¢ZêWµSÈó@'Z'ÑžV«’ ^Ç¥…)uX@6v‹`EˆOóxØûg—l¡´|΀Ïúµëwž4„½`?J%:Gkš_|ÙßyV­Mk#þ·”Zî„¡Z!cn³1ú˜ìÎŽMÿÎìú˜gÂL ?92€¬Õ¶¨zŽ?øåp¢ Vk±,롚í}Ï쨗±¿"sÕÑ\KiÄdäí§Í1Ií²5gJ6ùä*¸ÚZ¦Â³!J–Nëmy½q«ZgÁÇ9´`:Ó1öÉ‹j´|þ|+š°&¾¹¹r/u(äôº04Þ/qÒ” r–æмe³pë·Òq¹C‰œ‰ëù8àK'–¬“ðÿq5÷‚fkÿBr† yÁèGdæ!)3eÆ=Û®„;©3kšÎ4ŠÿFVIÏ”è,6FÎ&Öàkôï0ÖÎŽDϬþõ¿P–!ò-`Êʬ6,7|Ï 2׉þrÕ€<ïæÚ¿æ{ïèÿ“x—öé'¡9. ·Á{8Ú®Êø(l©ÿÉ]â hêœnøÇ#Õ+®ßJ#u’]e3=TŽ}R0 ¿w?2ë;?&×€õçÞæÔA¢mz¿ƒ£å‰§îì |@ AxKÎLݱ¾ZU´«t¹ˆ¡Ë(E…T]œ?â­Sï~A;Ę~8ÿ%pBNÄ8½W¬SÙÿ¯[n'ÞY˜;γ‰å—|Ðb)ÌÝ‚‡V£§%—Ê!ƒJF~íÛôM?É´^¬¼t¿’T‰B9ˆî§h/Ì–ëSŒI—MT~ɵƓUš‘&싟­¼“„n厇N:^€C xu£›Ÿ &Ã×âÝ;ÜTˆ4ê¢4TøŒÌ*nysõá›!yÚª[T•#{òù–‰èŸx´±6g&Ë@ 0€Ô›|yÄ”â<÷Rh°Ä1'ì>ú„E¼áÙFH}Ëøä:çTDÿntï«HÀcò†›yllw3š6̧»¨*¹Ó¹\þ,þ.¬´cû©Æ³=JÉ{*ñ\3ÜóöÊv {ÑýU«×£’Ï”õ U2€æò}ƒ¹·ÂÑ뼓óÑ̬Ò}[×K]sÎrI‚6uðq¢jÓÆb¸j%,Íy¼ªÒ“%Hòã9•šJª&ZÇÀ”½òt1ž¡àžAø„ª,ÿk"èÓèª ìßSžåíN¹ ÛíeèšÓí©%ê¶Þ-R.I:ÏlÕ"’ÂÇWµ›¥Õ†¥(%ì¥ 'Ffq䦜áú ±«»¯Ú$±c]·Y×r1GÊQ](±ë»iéXIOÒ»JÇðÉ­˜M-Á»Va|9/:À>´ê¨ï«Â;¶íx7m2_éóœ\¼Ä*§´µ ÀÑxœ¶išˆ­Ñ'棋­1ñÁ»1l %ò¤ã’0VD}åj­Å`éÇÓ•aú"}â3Ï=,"ݤ+Õ§ÞÝ•A‹\$^lñq~FøRìÓ­Gv¨Îõ©ñ¹JªGò[òz¬ð/øÀC}󵡉¾:Á¹J˜wØŸ‡G°naîzTÁõ ÞQ^U€HqRÀáÈú\ÀÐÄ6…€˜™ “À²•d£è!ÏvŒ—N¨Ržƒ`±FBœ®wYi3‘å8®8øê(eìŠp1™Áø÷}…~yÊ?ÿ#—›öÀ ’#p­Bq¤ÇÔœá+ž%Î\«È[ ç.\(x²qFn€n ÓMà„¦Œ¹Ja@?eÜ’IŽŒÔ™=©­%Jl#û5¨¨‹³¿éã±·š$R¥öf©Y'†ÎÚý‰ò0’„AøÊ}Þ#ÏÚ@œ¥¯ÆV’Ôà÷ºvš€æ#ÌÅý>»çf E´:qž]>ƒdxO ½ÿÙ‰LD$Š–KCA{-à4dglÂñ«†3&#AF½ž­Šús[K¥<ÖQ´+þ­ŸiG„wçò1Jºý2M¯Ño+hT‹K”B¢Î/EúÍ¥ŸNgoŒ¢˜›í}}Ë]äHÉ©J_ƒ_Hñ>ñºéÚv¬Fyqˆé©ŒÀf¹P:u#?@À¡ºäWc”±è\’Ð~)˜¡ãC˜‹¡#súå,£aûßD:!Ç…­Nw ÷| ‚Ì—4cJ$QA85¢n¯®S d°ýZþŸ…~õlýR”!Êéíù·qÞ‚„ H•²¯u4ÚB#Y¥¤Ü6k±Ñ›–Í¿˜í#‰qŒQó+IíÔGV”é[ Ž™mk­ï»Ž7oÄnXø=ÒdРޥ ËH±B묊š%ð®>óÕÅaœôYs+·dË:…/ãv‰{r×"ÅÇÁ´“Û\arîþbq±ÑHŽQç9”·P"!-% ù ý¥ÒëÕs¹`0šu—VÎh€/úÊåÓceÁÌIÕq­`…4ŠK#åLˆLÙ À“ââ’b‰m®ôîú2\ÐY©`Ö(ãK žHu3ÈqŒÐ9ÙŸ«¼š© ‚rðƒÿ&ßàåü‘C.…fì= ä©O+úúãÅqÿ"’¾Ù3Áó#m] G‚>˜Q¥Ê•r„ÖãKÊ­¦?­:>BÐ0ÿR#lRë6ÂÙ­„yܾ=1z£~zûêr5Ï] #,%ü%ÌÄŠwþ ^pI2öJ ¥0Ò}00Ú&SSÇ‚üéèÔYoâ˜çBÅð\&ËÔì¢]ÜÁåú¢oÞÕµ$Ë.¡çÅuLŽª Þo€Wl `çF¦Ù@~<ê16YF ºl0qËÞ¯ÛDs©)Ê )ï—óÎÑ… é…SpZbn¾¹ù⬺øy˜˜ºævJB]»<†fíP>°~b`-ë0ˆ²æ€ $%Ž“ü& ¡ìHºÚä6›¸,zGÊu€ê¢ˆG’ïæ€M]ÆDyGº‡Ôä3¥ÐËyz¢¦>ø-~Ep´åʆƒ¿w Æp {[¯’gçº"¢^Å®wè¥c³rŽ¨Ë—©QýeŽ9ˆ¦Õ½[:‡/ ±Ðqa//¡‚7RáÁ¿;¨yR¿RÝd@6íÙ÷,Ù„â5ÎôÇ~ïSª?Ïa»˜z¤ß ‰Föæu‘u9šÚœè0#Œûž›Âí tï]nüiR[Ez^W·z«ÅÕô®TÀ§áq¢ûãÆJõïä.# ¦æ»Qp9ŠŸ†Y*ïx.‘JÍ?qݤ¹Aï%Ü'æ”M°Þxî;8 5¥‘jë]ÎÒýIx;ÉÊÊ \çwÓòˆcòç§zq%$$ѨD¬6-ì¨Ö%}•R;—NwH›¿µ^… •B’¿RÕŽ¶ ™¯Û… Òm’©À30ì.ê4lºé“fW¡ô—·’Lyõ1#„Ïô1­3¸N ªÜˆŒ˜pÌü‰S”‘•ÿ>ÿ§*è“uù‡Š«-—Œëæ´²£ Ñe¿*@ò¶É`¯Ÿ‡\§ºz’ u°÷ØóC‰Ó§ÍåCé#¹ÉÇäLzòáþ&sìÖ­ë¯(έ}¢?ç‚ R dž®ø§K=EuÌ+3ø‰„Í/b¬"«¸ÉÉwh·±L{WEºTY`u7[+kç¿ øJ¶¤ö"í-L‡!ªlòü¯'ØË à†~µzlõ…Ó;1òβ1ó>,ý‡ Ÿ¨FÙâ¼÷Mšñ‚±„>–e+ØL¸M_ꊸ›Ÿ¦¤±ÇRM‘WV¾9ù­Õ†`qvÀæ»þ)ú”K8C©8Ã7Ò®%•J)3Š)?)+*»ÄÝ=‡Då%rÈÞ&ÛŽ¿áhìÓÅaF¸à u}ÿ tG(­X¶¬º¥ø ÑZ‘zî’¶ ÎŒÔ[@5—Íí¦†^t~©¹”†ÃSÚ§zAàj)jWÂn½`âÅÔK"þ´ä¤šë´GÓÙŽ,ly©{7˜[—\£X„j³‡ï6“2 .>ò¬Õ‡},.µùE˜D!ÆuRÚû™áX2s¥Ã£6:‰Ì"²‹5’Ð1p"7Z¬¢•s{Á‚©³­è/LIQÌ2îå¼ÐÄf}‹V ôÔÿ™ÂYŸIå“2瀩.Eüê·ãOœÄžºico8ëúcŸ¹Ä̘ÑÏP†Â{`/êBÓ¶uüg!ˆ¹W£º›^+ª?NJôzrW±!ûT M?£!®™*¥.íZáŠDtf¢"4¸ñÄ`CkMr»V('ÍqpÆëã-`ц•uIíïÎõ/«}‹ò8åÓDÃå—”ÁIŒ´7Çùõ+º‰<]‰|Þ¼´QwîkìÞznìYÞP¼£alr¯ÒÙ‰³YÈWùî–+ˆàjxSž8LÖ«‹Vß(°•&ÊíA̤ ·&|r§„àÙ'¤$¬RÁ½H½8s–ª’Ó•çÿ~Î'e±¥¹EI-ïxNJ>ƒ|¥ ÍçC—xä¬Â'U,ë’ã0J•ßKß[ñŨ»@?xÌÁ&ZÏÆÞÕµžÇ´ÅÆ,=Úu¥²®tuŽ™«E/þ››œdîŠ7T‘ÇæhЏNA‹ÁQïXvvéªÞg>n’çXk¶œ|¡%§È(ôdgËT@3àæ5 äˆQ8Ÿa$Ò×_̵æ~¢ràïr¦˜®”,ß\ÛXŸé[áßi>š…òR3®N5Ƙ%Tå5» [æé€ á:‰Â ‘ñÉŒ^$2 3¨@.ÎÃ캦±Žù/¤ðÍkß;u¨ÌUvëŸe9õÐG[Ÿ4Û²Ø@°PÐwš²}¬ºÄ‚ÇfÄŸTM0#ú7Ð)‚Ÿ†#øÔõϸÑ県IÕ¸íKÔòF˜óniì­Ÿrʃ趃£Ÿ"™HŒã7›¹¬™F¶ð\de‰e"8òËO '*¡êíi†CÍ9ÃìÆ,ŒÆ/‡`ÿ{³Í®’‡Ûer(Ÿ_w‡Œ¹dB°tOwƒ" ]ùùÁ„­—c6ñ^çN åó÷þ9Qtß(E7œæ )*Gm;øÂTýn^IU ºAíÉ´JzÀÓ£ìŒ\¥¬aȨM°ò+Ó.æ= º|Tý>K äTÝ¢‹š øÀ¯¿GÍ«çÿ›ËÞ® ØPñ"õ(† å"viÝú ©ƒoÞ#‘ʼnËÚ唫³ršÅàŒ¢¼ý&ö€MpPd·O »¡°6aÖF‹/’ç¨ÀÖ’'Ö:ÉCÒ\ÕØk­\¡£+ÈE¹MàâKƒŽxŠFÄ–˜—Î+Qx"HÞ{ÔÊRޱ巘rÑ­\öÃwÚî1™eš(ŒåçÔ­+¿þ'k†_fjE®Ó]‡[;wùÅÇCVü‡%ÀD#Ã-’/ªP…|D)T vo)8µ¸6¯•±õ_´ÿ/ ®+OqíNóêÜ@óÿiC‹c¨Ø¤û±±sÓ…6¶àȘ®Ïô„‰¶—ŽÎrVÎ&áÃHZhì*ÊÝÇÐÚPÔèŽÉƒ9ËI±Wçý8ÄÔ{8„%ÆÚ”u-|¹ù2íŽu ÕM$uƒÕm” ¦4ª)œVS¨8A¤O-§ýDïjËó-ô-–…Wø÷ù3ÑëÅ„Ži´-6X ÊòZ磕¾²ÌÐv1ñFYqþË Ò×Åïj“¿ÇöW*¨­±›º0“Íu[e4ÞÊÊp|æZ‚!?åO»ŒGD/ÀBü­5äù»°Î®q¿®:š(MB=†Þ3‘4½â¾COãŒmX$ô“{í,»rH=’*»¥Ä\4ÛÕ€cò"åÐ÷mS£{ö=ÚØ0Ç‹úɚÞ¢^·Ù§:•kG½AÇ$P_ÄR¯ ‹öÛ.˜µ2©x®ò0‡F¨âŸ Îâx†,üNàä #t`ÀtZün0-A áiÓ#7AùrE0oú×í…jðÈv*Óixˆ—ŽÀtÛ×-·&p­ûú^¢¼¯f^@"¡`”õùj/ÀGÔ>.w²CfhŒ^|˜‚!åˆ?ÊÀ=eËÄéÖ”OîkoïÇóž7ÖÇ*vÅÈpÖr ]“èûžbh¼“fqíJ}—ÉfkJ\úKk <-š€3W«Έᣠë˜ve2B‚äl¯Îä2 Iwo­ä-ä:v|ßß³:ð>@—xw•ŸáûÄZêòß±NfÂY¡ìVQ‡éãxY©©ä,å±0„ƒñö{Yi÷·“ØYÆùõ*îýÄy m«+¹Y†4ÿR .#{0¡u‡?h Nrù°ne¦þ:._@ä÷®·r1ÁOCp¯D?ëOî¬#¼ú‹ýQýØà±®¤—)¶¡=Þ÷’ü™‹ùžõ׳zœásN)mD§ÕhÅÝî­ŽŸx˜í†|…_ ø†±L`@MÿM8ÆvŒše+ØŠè,`=x)<1òY‹D‹_Aæ«§=}]ÞôÇjÒ-”m2R˜|<öè\naÑù[[®ÄN)oõ»Î0~ááݸ@×aÍ’²¥9P!p?%0¶)¨Òø¦Cï!é¶RÒsµFpù&LíPOt1¾\Ì…6:|:–SÌ!túщa‚‹¯òØ< ÑUÍ@,Ü‚©ýÂâCز°Ü¶ÅÀ3È/ç*ã/í3Y©ÏrnFÉàE°Œ¦qÆX±Z¦«šc3ú +§&}œ®õˆx ‰3HD‡+^ûvÄù‘§!ùz%7:¡ßgÐ|Z;º>‡ß) ¶îwVÛ0%0ïyí šzÌJÆÔ[‡MVJÌ•3}tûºûjðfT3 D´„Æl¢S]²^Ú}T žP 4²QET¥H_ÏÈéV©+X¿Çö|è×áù‡iäâ¼ünºÕxR…«n—yj îÀ™°£‡}ÎÙB©á‰mŸ¾•û£ý憌,’±}¡1Ì¿¸|TŒ¸:R܃¥Rß¡”Õ†}Z.Â2bn…[˜<6÷‚«-˜jø{cf]Θ9G-ú7G»>ƒöW-8ÿm2ëл·»É ‚*.úV‡‚¿¨›Öƒ¬®"· kž HºúKïA“¸&Ø£Ø\mgƒ’q›g)æFUCàÔ!ÂðÔF!½¢Èq/S^t­AâeªØË\öʼ¤2nõ>É-oਯ…ì»™N¼ˆžÍ‚ïY«Û¯“íôD)Í.æú¢…ðì^È–Æ®ÙúÉ$(Š·Ñ#6ì‰àD¬=×gôíŠÁºU "ëÙ9&7¬æ†ž•cs³/dr¯;LÄÑ9M !ÞˆÊ1 êJ’Õ*ŽÌ!è!ÿ&¾òÜvE˜õ4{RRâH,/øñ mzi¸ö×Ù ¡e4Mðí,k½oí/#PhÂgȈ{ŽÉuƒÉÐú²1çw"Ê€m˜:Kï³ÉT­‹zfPÂ2ÆÙ/›êìŸÖÞ£J†œæ¤”¶K1¨ ¾Æc ã¡_ááI|­ªÅÝ=ja0:b'¤šq ¨Ì(C®Úö“ ˆÐØÜ ubõ¨EæC>eJIPîƒ9üx–¿Ö·{?š€ŽÇ2·0Œ4×  âŽü.:S&j4€X"-JÈ´S„Mú¯MXTK¶\άîŸ$ýÚ§%zñìF¦º¤{p–‡o|ÊGÅ/^cÕi_â¨0]S弘µ³ïòlüñÑæ¨íÛ”•c4 °?¢oψ]8Ž«ßü3‰{&Ü­/j»‡¿WÑÇŸ,.L9ëM{æsí7g~SlôEäI÷¾Æìâ̵B|TsôÈ1L#"13!o­idv¡~FIµT:^Ë@L İa2ÓÆW™E%ÝAl©­VØ’‘ÆáÇÑõÒ{l|'½¹žaoޏq¹Õ#w9 {¿°„}HØTnTL[[qÃÅV·bùKéRû÷1ˆؘÈ;ªåÌ"ò­rÔ‹þ¹:ö—´Ü ìëE®¦Í/X3{øý!_ñü¨ÛÁ¶>Ù¶-o«"^uºKl7sjÓa#qÝJèvÈ’÷ÏŸ?»Gô̧_uN÷* Gý­x£ýê)A/J ´ooØYöyžWfŠt©“ÖwŒüµ×¿PT\«§Ý 8ÔˆÛAxO¸HDZÑÕöÑfû_HO§š˜„Év2ØÎÂYk+J`±éújDLðE¶{Wx ŠV¼lòä—ïžú;0iXD‚xÈéЧßo­ueψ¯“íO¤sŽÙD¬œÆ¥’zZ;6*ËU:²ýÜ ¤ OaIšb=¹ ªõ©¶élï^—¨.Y_'ÜDAÜÒóýËkÉ’  )¶” «“+½kØfÖ 88!‰‡/ &WÕ[â¦ô[aí¯yk˜—)õÛ—Lý S]£¥b×=¿êÍf(Õþ‡Bã¯"B¥úêB ½é—u¦/ªe-°1#"Åš8 ‹€OŠíHz—sɛ՞ƒV9æüq¤³ßòÔ‘>"‡$Z¤DÒ3Óίã²ù{Ssÿ¦na–¦ëÔ<=€ð‹Öõ.•l4V0!ö<«£ˆ•á¤F[W¯NÜ5‚žήÀÜ!å8©iåÌtA®ßA½ÖÝ…ã8Äå CºÝo,~þ±‰·S­#n+oÏ>s­ßi@lÛÈ|ÙodÙ³4§v¹Ðaï“°Äk×K÷ׄخÓXÆZ°¿ÒÉ„¢¶ û<ÔqAõK.4úÒßYIµŒŠD=,sC¾R?ƒgQ$F{2”¿ƒB.Þ¬=¸›ÕÙfó'ØÕÆÔªýô2'a~gÝüU¸ZÎ×3”SÚö~½‚[wEl~kcZþÔ,´¥ŠBZÇuœLœÃ¬:ý@¸„R¡ZŽÓ1¤¿îëÿ–£‡\oìÀ­pàŠÚbó9á.^¥PAP¡»¬Æ`Ü•'iw-‹†ÛhRÈùívR6ó9(_¾,'´Éäú߀w²~Å"5,ô2KV³4«q¡cmnñi‚Åî‡Ë+yëÔ”¥R Ê&-s‘p´RÁâÛÕœ’‡HÿëÁ$“ÿ´Û÷ö€ŸÏ•!ÚíÕ-“gë o<#%¦×BuÕd¾Ïò{B{šæ˜«$ï¼à›´j6—¯Ï„K–Jï==ò„a"åöÏ å£𔇥j~™l…möªF“ó- c…Ê R‚½oz¡Vþu¹ p,?ú Ò@}ñ¨S©§-.ñƒ7õúùˆ—³#œ™°fACî?[ Ü …„ë PÇtÎ/– e'Ž/Þ²>Îoš‰Œëg¤HÞ„î\Î×pôøØa<A±ŸÓhiõ«….‰NØC-ZÞ-6€‰ª*;üë§V£J¥¦EÒ—[ìX7 8Îðéx¦cGÛO·l§ñ§W b8ÊOóÒûôÀPè î×ßHeŒ„üÍlÉ;r͉-·ÇØ|À裠Ž.Ï0qE9ÿ/#ŨXÙ˜I´NèôáD­é_„«ÉëÊÌ[çÀEêÿTäöV§ÿ5YNz¯¯^UŸä+@°A{‰h AÔ8ÇóãÂ~³í÷ƒ{Ë#jN“¿ó ®-¬«Æ¾~ù7¼]²…NC±•`m•¤™{2ˆA ˜ Z±¹g•[7½ ¬\«ÚûµLÅìû µl/L‹ mlų %«ŒXÿRô¬G"ˆIøÉ$~%zê¨KU£-ï-DfµœüüÀª1eßI6PÆ¡4R{|B¸B+20ÜÑLnæ¾²{qfiH4H5r?•ì‡ì¶7Œ´‘|Ú6m™°ûþÂ… í³ÑtÇß/£6˜›¯4k ŒUAïqѦƴT„ töûåÖ¥;1¿cKcα~ ÓŒÇúM÷³…Ë*»š¦©ô XZh£Mÿ¢GÂë[TTAGêa:’þç¶› 3µù…Ö, +UíäQ—í3’,,@}ì_Ì|WU> qñ>;èÈE Ö(¤QÇŽÖ7-šËëPtû¹ð©±ô8òc®ÓOófÞÎk_¬ÆÆÇ¼Û©Ô•ì-¡4ð²cÓv«o°Å!½•’hõCŸµÊÎ¥jÉöƒ<|¶Îcøc>žÝP›€7õ–_ò$…·5‹ ü¦Þ´Á`öC’ð]ò»¼o£j3n ”‘ÈÃ'Îs†4€ˆí.ØŒu_Óõ_ã웸n(-~Ç„œþ&[±û‚OÿZ…´¶«yï =(TìØ1¹c$Ë‘‚ïjþÕž¥SÌØQìQ¤zl«;À½|M ™ Åù¢U‡C,ø;j¾Ý+ËÝ>N)ËØ4Qðßs=ÚÑ‹Î7àb=Úzj¯’×ëµì¦¹Ð…5osØ_&ž ûŠ2ýØ%ÌðÌ4К.¨#»‰ê«ZÕÔ{' GÓÎBZUC£?ó"%>ÒéÚ½f«Gu¦û²Á Æ/™0÷‘GÏw²(Ù¥£yY‰»ê<¾¶ÞhæJ£ú»âœëœ­IS®i`_Ðýñrñù~Â[?¾¡¿Gý[à; B«C5‰‘ ’Gf¡éλ·L˜EoqJHV.s®’±†ÃÝ:³k¯ŽIK«˜N™)R¸Z|æiQÜÉ{1›žèÿ#9{9¾î> Äs+J#;céÀñ`?UYG¸ýow72ñFUYó5 ¾¡òÝ·-½Å^¥ˆñû80Ùzâ'þÒ‰‡>D08~Äøò»G3þã뺖#s·B®.¢ÃÒ]¨_[”ÕJL+C‹)‰63eüÄ/q%nsÅÿ÷»ä3 ti£Ëü‚\8Ả¯ vÓ¬,•ÝRL À* T\ëì44_ÎÊË£dL•«Ã±§uNÂ+E”,1â‰CEjªüŒ>‡ ˜Wœ §înp 6czG±…6'Xù‰SoÂå=/!þ§lNa[~8M)¦f£Æ¤¸x‘Ž3¡;¢ó$„€Û×Öô}’"³m§ tQ/Ü¥íÐá5ÃÕò}Œ2Žô“ü›iékMAWˉ£Aco±ÏVÇ]ÏË‹Q`ÐLêw 89Ôë7ƒŠ‚[Þ|‰&…0Nsôú¢BáÝ'–t„yX|]ÇÄØÃ%Òˆ™…‚”åUîËa²ë:¥fÁÒvÉit­’&mwÀêú}ÆÂ„ë1¾fIWÝ/l9æòúý¼,—+î´LÜÌQÏ´M¡Ô 8¡?ö°Ô¿ÒÃyÝm“²Ì&‰‘*ùeO™ÜƒÂ21fŸËæÓÍquáÈR*•%Í:¥b°F1B.>ùHÚñ6›|òím˜?ÓkæÔŸÅMw)‰Ù Ž)ž·f %:Wia²=…çï&¤¤|Þõ.æº š®ÓÚ“Fì¢`gÈL¢3ð" îHÊríØêŒÛò·„2}¼wѱ¥+úC÷æ)Þßeù¢é›´ Æ%aÂÀLa‹‘Œ]+"»¡é1 Ve^`¶®E½àPÿÀÖ0º‚£Ì¾„À†#8Z4Tgk¦BKb~íþ¹ìbhD¸S’,‘ãÚŒc%ããW—²—1o~\Ù½_{.o›)ÍÏsÆ}‡Ì”º“UAŒÝÔñÔ¤Ú‰ÒUƬ¢ðµ¶Ù¥bßÈjôŠ8¬Ò¬]á›Ô&ù%öjÁ~p©æ¸àgm7¶oˆßJqõ <²Hp—QGf6ÄÖ®>Ê5A?¦à$-{)êô´ {ãR$’0-Î-¹ÇK“ÈɺëéY0ï„þ!¨ˆ/Žr ևĘ=#K0"SDëI†#°žI[W\Gx¯iSF<NSßém¸a¹‹æè!†ÑCëæº§‘©‘Pž*6Q8MÛ>=b8h桾ÐÊ@?ðárïaL*Ыß!¥iðã”™[e¦B‹bºŠŠþÉÅæŒ™¼–1Àáøp•lIÄ€I†ìÀ]u ÂÌ'6[Ù@J}¡ºÔOhãaÃ\×¥»üçèמT¹Qì¼’ÞÛ©çYaeBbþ´<îÆxÇr&ËœvÉÍPh€Põ£M$ü¶.Ej/Cµ­ÄTy®îÌ Ïúœ9…óܺ·_ÿ“ÕÇsY>ŠüT¤2µf7&«nM1Ž\Å0Móñðb=Œ›8PíÞø¸†UX©™ Ù>üK¥ÃË[ÔvDŠ&m ûfeàTKØ?ÁÛÈUsu›á,fºH¾×uù/øDƒ”ZqË:e‹{`Þª`†´øKå;!ÿ ¬TšWФ¶öÔ?kæ  Ë1‰ˆ;x**1½¦~ M¬R?âÒÓ ªÕ…4±gb_è"ÅO±Í¨ÿžgø_zJ‰Þ!…å!Uš±n¯“É]/¼Šú¢2û鶸íu®õ³Íþ9î ÿ+€r±N âã.H:Cêì 0?Ýhbµ­¿š^•kïdPp§¦ž8¸dLN·Îªâ%ÒRrÓˆÿ¾ÝòòM˜É<ã¯L‹{ËÎŒ¯¾ÙË{‚#±Óò•}Ò0Ûg~¯<,ÆàÁB°™Õ€é0¤¦bHDË¥uÐ̆ÊLs®*|Sî¤ãx'†ý§ £w~‹€(‹’:mpèH˜MâüìË!¤g_ùN`1j[?a^èæJf7&pk0Ù•H¹Ì’ãÈcÝu MÆ´ÍF‘œP; Àìqá‰f·ÃŠWÓ²F!0ÎuFø_ºXž‰™Ïû°Œw®#É@9a°ÂÊÝdµ1¡(@ÝœËÅÏ'6üz¥Ó·Ã¿Uéþ"RæùðòoàÛƒÇê#¨ås}àl˜8ã±Íô]¡1Tâe™ubÛ«÷Tèiµ9 ä˜]%“¸®eŸKÓ¤£\Ìa ,„-Ç\»è™"•TÊ~Ø E•JÍ“qR÷æ÷ššm»%Ëže°úÍ-ˆÉ=ïØtä]eæ!Ÿ=™A5UÜÑjT;ð¦g•pM:ˆ:g‚ „øwRUá©ÿå`§§s”M›¥V I&,x¦>Òº_ *ßð“häýh6æ…¬Ëû×¼bÖ}¸å5ážÃúB Ë$α&¦©Ð¬UµX²¨ÉʺÚ'q?»¦×ò+YÌÜ›PÀÌóx›hB&\‚Fú5­(#ð_]оÚ夦ØÖÔt…° Ý"6·cEêÓþ¹³—©…‹Q-äÉ@²á(±ð8°µ±Œå˜Ð’4@QˆáVM(š£|{‚\§J»ÞðÌ µ1['˜ÆF8)mY¡I$¾¯Ww„XТ£]Ö÷ü€ö&¼äçÊ`·Ÿ§Ý¬èrW·k)`[WçTˆu 8³ûÛŠ¥³ðKƒ—]K†6%X> üÅÈð]wÿTÎÖ9¾x9°h@=jÖœÞ$MšÖžº‡6¯á Ö†0ñaéjoþ?Äk ÛrÀ×é»W›Öƒ\”¤ÈPyFŠ’˜”\’ Š=F ÷•ˆ|‡oKéV€)¿n¿omFìÆƒ–4³‰ú@g!rò“tSyö76‹¶TS¿×,Nß_î«H´H„ÞÆÊÁ'EŒÙ$â¯qÙå6UްÂ{pLâð л WîÜÅn»Æ“ó¡V–¯8ÿdCÊudÅ‘óoŠÿÁ6Ò~óɉ l›Zæ¨SõôU%-ª™“V‚Å÷è¥â."h#Š3ºH€l¡ãÝ9¨š;ïØôDØ’AÚ/ÁÚ¬“ưQÊ¢‹8IUÂÊ÷<èåÑÎ}›q—È/‘ŸÆ}øsw \ˆÓGí¾sÑ}Ó¯¾1/®~eè/µÞœ³‹<œ®Åár)U‡KÀ·Ut0¹›æÝ8†.G—-Xc)£²A®o¶Ô-šs'ƒà…[¸säÜ&|¶c.b ákz7Ÿ %,#Â{ÔÊÂ+ðì¡øØ—Xvòé‘D´|Fñ¤RD_Ni­Àüýj¹q¹¨@Ð4®àkó¤P•¢µ.%5xöbk™¨]ÂLôk‡5¦Ðí÷·èHãä΀Hû-”¡»`¢:K®IŒ1'yý»ŠÙªz=ÖÄ;[ñlÇܼœñ·~j2¹> ¤"!»‚t`z_£H :ñ¬iÆû×ò¼29ýIüsŒ £MǺf'±Ä°ô{(˜×Û|ÄõÖ¨Ö'Eyälƒå#E¼:óJ0ìÒ±âõÉÐÌ¢‹:Q­•€ _¼úѽ>t*–#6|ÏŽÅLd€“F—"òßñ€B#W7—¶IÈ áE×& Ÿ SZ.Ÿ©ŠFÕ…"‰ñíYÇT+Ã]‹6ö”°vĉ _ÅÅéÝ4y㱎 — bz‹JlízVû5ì³@Ë2X‘ÃØ·G»`Ç»…WAcú²0RÁçüúU´Â~щ*ÚJùÓX¬ˆTéŸ=ÿ„Óeô®žyÇSQ>7£Ž. [óu ¦Eo¿ã—g1 üÉö™¨‰ÍAoõ¹Èÿ>{‰yýèHIU=%?HËïÏÑןpöÚ_d[8Çñp{îÐè¬&K|+£etáÄ÷?)¦ç ˜7C2Ë@³|áC¶íýKqÛ~^tÖ¹š|N&ŲG|@Öaìæ¡¤ÑþÌÂëêÄ0¹Òä˺ý³,bعm~‡ñ|GTíäóë‰/ažÆ5/ñŠnâô?_Søëø›ãá¬.(éôâgÅ^ gã 5Mߦ8h˜õ(+”YŸë *©uF3çdPÌg˜”Ï„ÿ¦G÷R§áP–ÀyýivŸ* PÞøø«¹çx– d­Ï!VBAüþ0ÂïcÇF+rÞ<&.€KOÕ<À ¾S#5¿á¸Œw¦RQt[Ö[ñqAÝÂßìóœ7Þöm“êb¾Vÿ}Þ-•¢Ÿî©Ã6wœp0æìTq>}‡-¾l'kcšÅ<À#.Jì–?¼z:Ÿ]Í­MïUÏCQ7Uu÷w[Œ¥0y ‘U>V¨ÆO)ÒLÑ—Á_¤xñz=YI*ÞO¹‘|*Óœt´mp¼€_·5 •ÁD“µƒuÚŠÚïÎ4!´²Kóˆ3í|ãì€ÏÏ­ R€9ºôÎ3ïi¸ÙôœìŸv54` ÁÝŸåU…ÂZGwvX™,ïµý¶ûR|+Šh¼ÀÓ‡¦J 9⦒DG”á…÷üÕð3êu¾›\G ÛXV¬»«›!8 ¸˜Oã ×õÿ…  ÉÄH©IÕ÷{÷ùº«;L&;x¢:ÙäVd{¦E'jŸ[.GÑÚ8%â€UÇTrø>do›¿ö‘Ê×,X>1%:® %%‚ǔ։@Üs(¡ ÎÞJ‡‰œ™zÔlØ-¸Úsf =\sǃiÏ‘ lÈa‡´(îê†óß6JÄZK€Z!& 8ø‰T·9H€x§ùävkº@‰Qõ…=Cªë;'Ë:ƯYè#Ž4 ŸÙÊÒ-8'`y>Wòš]µÒF·ÿl‘寘ò6ÕáGá_²æ$ûæ s¢ºXÛÉ@á¾3Fà'ÿ#ðÔkq¼«.VSZ0ñÊ=Š.ÛTÅ`oOÇZ>A31‰ž 0‘ âÒVpëVï¶“vI'd;ÁK¾*BÀ®±º¤;÷ù»„”ß«íõ=ºò™•`[d=|€–ƒ§Ì±gsÓÒ÷3ÃÜÝ$èy  뫼ټµhÝÇ%[I¼Í}c}svÊ|ç%±ûsÁl>Î3jܵÉÖ°$XSÁø–¶°ÓŸeò_4d\LU1é=ç !&ï­+½D{¡%¯&ÇëÜoà\е(®˜]&ýÂzbxÙHd…;aåkXxñ Ƙú…Œz´PîÉ) gŒ BDu6ôd«K4"2~Ùä¥çɪìâL4 ‡—R²÷ŽY •1:ˆ–y>Lœ“Ž €2W¸{¥=ư22ÃU2Éxv 9”aÊB˜œvA¾Ä™(º;e¯Qüì ½¯UÇ,§6¿®¼MüDIzn…ÔA¥ˆÉŒ&Dà[&"yÈPÜ ‡ä¦Â,B´’”^5‡ÊR/ÅgØ­ûžß¸HçïÁÓï5ôØI£*äøÝhÌ%h‰¦êg$ËdÝ?âˆ/º@riR—8÷¥ MoA£ò|¹ã2óc¡DAñç]ÊM°ŠûGÔÏpPMf£ˆUVñ BOJ)ß6œA‡Sl?®j 7êÛ¿ ‰¦eF@·ÕJÃ%ÏLa„€Qµvm$>éúÖl"‘L$¼ûûù) G°º24£ÕÂÕ­‡ sÓ#R¾ÒŠðå1¸›¬:æøÅd€—º§u BÅ%2¨xsz®‚ª™•!¹ ¹/¥z„•dòiÁ9Êa‚+Åǹp¤<¶r‹À.9}&,•ôc1ÜäS‘QÙ÷r• ]¸œ(º¡Ò~§·&*1ÉÃ\ÿ‡ÉWÛžÈÎ=#WZ8Q¿¦*B£Å„ LÓú¬•Nî€Ë2:» §ó¶žñtÎZ éñó)èœ.§\š x¬OÓ|_ôZªXuŸ^ÉDþ;ÛMû µœ½;_± ñƒ£=_åîìµüŸÿì&}af‘¯…óɽi‰»ÙŠó†“¨vÌ;–D2úÚ)U×`¾¿Äã­°é%ê—ðÊš<¾Àê]eŸ‰YJÃÉ®BRïÞk€È9‹ÂkìÒ)ê{øÄbR$·2¦ùjTŒ É8Ci ¡‡&×ô›uí…ÒU×#9|ç^ÒuDK:$ßj1>êšµâvLvÀy0tI»Î²“e4’ëZrüàÿÓ+âÐÝö×Àýk²bôH É\üôò9–)),£§ÕošQîÂ}Þ<$ýì ÷… Âã\Ñ,A í……șζ«¡øüôTg$?GMµLù[uT¨XÄ?¦fº—xˆ Ñf–^çÌçpVxӎж:"èmÇä6œ?‹\üCÝ¢T"¿@ï ÃÙuâ£hªÜœæ\.bãóÝÇ‚¤Îé%sÞï…ØÇeèX@•îìh‘°Àà7k¹~´™ZP ²c7A#ŠãGƒ<úléÞq]ˤÁˆÃy˜•Ô+Kž¿T«Ç6ŒBÉ¢BŠpãÇ¢?( ºmoä¼³ì«{5·îLTHér3QEç"Û&"64…ðò j¬6K|t3kÜì顪ì.. ‚•Ÿ¹b ñR^sZ™= á/ù/8üÖïÏ%ÛQà{„‰rìåðй\~0 ‚^?·ÜNã(.6ð-˜nÒ¤zG“à‘l^ˋχƒ$‘tà²Ë‚‚ÝÝGµýüWØÛ‘so1Õ¤‘y-îqqÀ>Ó>RÅm°à1X´0Ï€ øé¡Xÿ#å¹¥üü=ß³Ð~¹Ž±éb6Ö‹ó9ZsP§L\kUÜ^œÃ÷Ü,ÅF’m­`“ö"RÀXû# Ø€o÷øoŠg6Ëv–\çÄ-rõ5`e>Õgµ1ãŒÛäq:FÓÚ´,ܯ–Ôy ¶nOž”ìa¨5°’þÁ쨻)e̳zmÜ#x€é‹eÞOöuHE›.ʇԴôÊûÏzïö¾ºôt³“Š•<a¶Aݪ݆µy(ƒï‘[°H`œ^áJf‚;~H'LO%ø¥7ó°^ ɦ Á÷ÊM†Æsop‘D€|¼_ÒGA[qô¿a}·˜:èĪÿ:¸ÍàØëS;XûÒwBHNFGèöVƒ‚œK„Lì¬+ ;ŸQO©~R‰Å]Pƒñàf@³¨?IÆ4í;{jÍÇ­¦`–—’—¸_’¤ŒÇW¬Òßѕҋ¶Çĺ[§ò`u½]{£­ñö‡7#n?&\yÙ¬YÏZk}ržkx”d¯.uãÑy2) ]€2ðKjr ´ó‚â[F…=ãÄŠk %F‚ãÚ ¿—h»ù´/Y¼%yRN:Ìx43ª §œJ»Ó Í±-°-Uç|þ[t ÐÀ9˜òÁèŸ~¡í¸m.jé¡$ŒbPd§“£½š};8Èdš\÷­¨K¼•i½6䀘ñŸKSÙˆºxW7œì 'Ê÷ÿ†ý¦dTÿÿþª„P¸‡&¦›"?ìÈÀå-&]5+_è4ã7‘0hýÚ™èÁ8ø¾—ë†Æ<å74*AÙ–ñý¡_ˆRäšÌ+æ~:°¹‹•ÆlÁ˜ñÖqAv°©Zoׂs-v=hñrïÚn’AB´Î"h”“ i2r˜BÑ@{͆6¬Ù×G%ª¾¸]¶‚u¨8Ú69ú°]€þì¯ÓË'˜Iú•Î!fŽÛË æCçK^Ћ ¯-¶ÄªY}ÔÄ¡~sÉ sB`t‘f§òŠ„ÿ˜ n[é µïé¾v^ÆY¥œŽƒ¢Mð{ºÞ=Za?æ÷ƒ%?$Œ&/o+š8†,Q@\¤W˜éYVÞWyº9ßÒMŠ;!ãâÜ,^môðt’ªq5—7˜%Xé!‘öi *ïÿãW¥ú9™ûzÉ9e¬H}1–²Å1p˜™f¨XõÄxi8øÑ2ÏS‡9L7 8#Êü{B˜Z~"b4°˜¥5d¦tÚ ¤³›# ? iñÒ[@ö-9=Árajà|â·ÞÝõ‹ÜõÕ òpá+¾Bþª®’×n€Ò„’JŠUWŸ_#³Ë–Ð…ŒîñH¤uFò°í®±¸A †²Ã1HÎjêg‰|³2ÀÎrhNôäð_¡}‡£P?ìÄhPØÓZõ8êU- ϯXŸx/UuD)³â7¦ºLŽv´UK®ä³ÿ¬ÿÈ8ˆ{ÈãcHã¼|NeM]7Ћ„–'ô¶‚½¥z™ŽâŒb-% …„ðF8%Í®NÁ‹ÿKÑé~uªJ•ûÖÄÐU#ñ¥[£QwL°+Q•ñEܤz(Q¡U´5Ä&uŠ˜Ñ›ñ*@¬V…wj+´œÓÓÂÃ8ËMX .IµgÛ«óÑ í›S;¥I]/®7ÔE<#Ò þÕÍa¦æOÛœ”¨KðQo ¬5`l׿Žtêƒè0yßL`Ÿ†¹wa¹æjzÇÄágØ_Üö„ÿ×™øGäO¥†Ö,Ôàð°ìLTJ~Ts£æ[55Lay)ïß.xÎ!éš- ¸¯m´uZÿŒÒÆš÷~lߪ·¸€©L4ßÑr¬5{á!]ƒ.Z®B”©,æÐñ «& Ïe&Ì(—±‚cæûˆïš«%:6#¡©"±b A/*”Ä@ØeCÐõo ¤É¡ñCÖ©÷¨?a äéû‚ã d?æ':§Ñ{ÑH |· âËt±±ëãUm!nñ¯˜ŠVˆnGù©B)ÿÊôÂQ½Ã€¡+u²ÖÑ/lvÇBÅ$¸±ÈCçF×—×Ò³'ójØÂ­’àÜûÅlSVâÛ—f Ý^Š%¹Å q—+ôý75Y쳘ʇqEÓ1+Š2ò‰ˆ1ü\ÉM"çÚ§Z ¯Övgtø"`ÿíS?r[±jÂô]Bn¬}ƒ°:·ö‚´òme7÷îÞžu!¶BJ0Ø]—ÇŒU”멊-ÜÂÚ¼J½0çõ%b¥äø„º«â³L°ÆX——@ÔÉÑü?ÎÖ‡÷7ÜÚÑí­&¹EËÁ´ûgòhíú)Q°|¤°2WqÓí$ýQ@y㤢WV`ž>¾?x±v¶C/ì ˆXÕ~. [Q Qø°cƒA'SüÚBœ7±“YÍøVóÔžZÊÒ9¾hô| 6i6°`Øý«4ÇÐ4)tO…*ñu£¼[ž]ñ5¶ƒUÆà%;ïžÅHp€™òzƒG÷½d±Ò„97 ¹œÇ*x*·„½ŸáÃûùïÔ™²@šÛ~…‡jMÍR°Û¨*æ×I›Ö³Ûh)(¡ÓÇðrwýÅòÞ&?:Ôg¦°Ê߬ÝEÁW}‹y0‘W(E…®Àõòo˜œ_ (ŒuL$µ¡×T°*ÃOÞߖȘɷ^!VKy ‡²ÕÓzΗ¦È:¦{óiÀÂ4Ö·ÞÒMhMtzç­$­ë‘µ¤C¯ÇX ¬ËÑ?–Õ“Å”®¡áœÄñŸ²9zfaT8¹µéÜ´ùÀu@lû#ÖØ ïa™@ö!OQ|¨Â…é™ì#Jh‘iˆ&ú‡¶ú‘LF Ì\jM{ÿ þÜæ.á,÷=YæÃ:uQÖbpy{×) `NS KMim»[¸âH‘;[Ã"u¬¯@i/Í`çò!™b,ÎÑÌh顎öŸ¼Ž®å€] T©eR=÷Ô‹«ÿQj]Ø‚šW´è§¼”Aœ•|âcÔì”·ƒ‰LÜSXÞs^Üm{öƒêßë£M­ÊOÛ½H僊c1@S* ûøÆ #kc¡¸ë¼jð‘ãÕû†3ËX.@ÙÕøo<Ðù‚¸\qéþ].°÷þ_ì‡æýÏ+ ò+S¼Ò%½U<Èý,Ð ™â),»óÓÇ>úÛƒºô¼·Þ•+û¥ìÞ ·æðµA ·qôößJÐ zkŒÀâËÁÝ\ULC+/qQAŠzD°F”D˜ðà÷–ª3œUhÏÑÜVÎÂ!AÈ=t¶aÎqŸÙ›¤“£Öð"Ý×äèñqð¬Ç753 ¦{jܲAr72Ë ·X­Qµ”¾¹ ¶¿DêU{¨Q~–ž5óKº.BU×/PcÓ»íúe^8jr·^žv/gâ‹s³ TA\ {:.z¶ÿksÃÄZS¨Ô^È9x©ãn¯nwxÌôÎTYð—E:üÆSï¬Tmw³…ZŠEN Q‚±@LjÅž06íêr h/–þo¡þâÜé5@ÓBM…Í­QÀR€æÝý|Ñz þ¡¾}RÄÿ]|{,Vª°-X€À4¢ù…¢è7x$ûЍÉ‚¬-øÖ®ù6’¶`›ôxjÎ6ÿlºß†g¾S/99ÒB+Þ¸ˆ1Á)Ùd½ÜÙé|ãºîz2`Oäý‡¯Á@ú;¸²e­hùaŽ^ÔQiµ…4ÜIxSl²ÂÚÛúYFU"‰†æ¤0Lz°r¿µ†þãÐ#Sn/!Ù“ÜîÁ“_t+›Ié ….HïýYߤ¶M=c²§¿³-¨ãí ²Êôh_Wy‰²õ±Lr…ܤ$œs¶ nÎÐ’è’÷G4M§ÄihèHGKükFf3vI(ž…øe/ST¿˜$éIÒ£×#öÙëp‡vNG0¸y‡@š)°3YùÈDŒV Í3ê‰Ñ¨!×sØL{$æDµÚ·vÕ¡çœSªeYÝ|‹wo%Z·ý–l«çq¶ÒŸ°<ø%ŠIƒ€ËW]y—xéÓø–Ñ»•ÓF„àŠyUjË||²Æü%š§ïæD~fTG+N‘'×ð–ÔÜ£®½H¸/ÁüxÄ5‘Õ=*¦æ~9È_zäÖ ÀfH‡de=éÃ÷4Óò¨06 ÷–GëÖ7tp|¼¨ûPiÊÆûã„ÑÎ9à4·hÙ¾÷¶ö[ÕŸ³/«`?jþˆù QÝs¢î–))Ò˜¸hÏR F°bKymár Æ“Ãr~m>Œçõšdù?ÈÈC÷Åço8é3üL0C‰„í\Õ;‘hdƒ Ô$KõåòœØ ‹ˆè_v¸´E&ZHðá`.{=@Ûü-òe÷Îı©»NÚóq,Ìc¥*¸‚0=S©›—+jøº|‰à yH€1 ×x’[=+7¹I呯túê ¡XÀñ§:ûŸ}lœe–õzú‚»‘Þçq£§_PˆÙT'2^)ä¼ÒðW4œ›b{O£*¨ÚT“iŸg=™mIw„KéûBЙÄ\Ñçâ²’èHÁ¶;§BÌÀ ²×º„ðáO‘ÓêÆ­$ÞÜA‡ýÑé Sâ ÎÕèï±å.òg öõ¯qÌ:ËB“¥8ÛTA¤C¤øy€‚­Ø(vÌwdNGýózîÖ)üGŸÍnœŒ_ ”6X‰^ôCÕÈà/ï\P‘S›A¼„ÇW¨¤¤\ñ“ plgDe/²/q†•¤Œz ³õ»ËETÕÒ(»Ê´ó@=@«^: ûÜž ˆü@ð}>Jq„E¤@a»È—¾ó†ÚNr1‘ ÿܶ,® #™ÂäÌÕë¶#!Rv2 ›:u»iN«dmXËDÔ °DþçK…9åªSõ°§D#Þ!J BƒáM¾|©ÌYL&@_¡†ÒS% ºq¼§(Œk0ÒÒàúÉ'm $!Næ˜w P9¾K[Œâf– F»¿{ýŽÆ[1i©º“ÃÜÕuÍ;Vºöü4Ì —&e6½äM»™¥sâ\ÂzÞ´ê›I86õ±©»¿>1íëzIjájùzQ†[UÊdK¹ÌgT¿Y)è> ¶AÏž¯Š•\èÅ/:~±Èç­žYþÉJ¨¿¥ ŸÚ'ÏºÏ óboðÁÊ j²’yË^ávÑÞðe;БÒmÁDñ5x޵:•€‡«e[ùÖ_K¡,ca8(hGlš²&¦]'f`Hßìq®LMòG‹IàiŒã9{{ö¿‘ç…uÌsÞHÅ1쉪O ŠTCP£iè o-»W¦.$§”ŒãEy‘7ênI²Ã5m;Jf—ÅÍÒ-zrsØšÏþ]*/óô ÚÅo¾ )›ö¿×§éT‚•9ÚqW]ÊÖ¦/”->)Öœžr¬©ÛÝëyøÖì)Ë{ê_X£n­¨3bçã±<ò¤àüærÉÛÚÜ Ê_#W \’ö¾îPaƒº¤kõÄxÑ5S_Î/ò0lÃ&iç ¥OüÛÓŸ›|U/Œ©`­>¼Jéd ðö|¾*¦lÎùyÉÊ g™<áSƒµx£ªßçý~Ç¥2fÑ8ò†j¡³—oÄC\; ŸG‰Ø¹^e •Ü>Sm‹ª-ÆÅ†/“0ý’6æ+˜K~s·Ø;T*àÔ'hF½ôë ŠñªÕi4ÜË:-)šÏÉ›˜ÄˆÝ(¾+¨ç8>¼Õo¥ó¶ÿ¤Œ–äöa ¬Y •@’Faõ.$kÂUŠÈKüò^*ÿpjufkåk÷Yé Æò=èðflâ ô½~]•­E«1I[B*·«WùázAÙįŒû8Šq`t¸œ«vœ—Üœå~ÞüKÓª—«2Ï&n¶>a÷e‰8]ùMâWV…xµÝÜÀ^>Z<Ô.v4´½†B´p‚ãš^ßôŸ¡ËÑÃÈR6ÜvÇ“ñK~,©÷Okf{I}þ"Ñ«=LCéü`ý§'Hj;Iï£[‹¤ñ9m‰ÐM 'ãŸ-¸ˆ›Üfþ½Åt›‘q¢ÈR‹^êÍtƒÜlÝÛŒ€ðs×çuyZê‘S.1®E>‚ÈäÅ‰ß VVT~Tb|9Ä X’ãB>1Kö *¦ÃQÝg`ÂösG‰I´òå’¾ö)@÷çʤºdÐ~oÚï–å ¥žEXzY¾åÊÆXÌQ‹Ž”ª…¢òï…Lbgz.§Rõq–sç!rÎEµÆÚ£k/0ÆB6 Y%Í»ÏÖ€ t¢!=2lúVdp˜ãŽxw[ŒËâǾqbb2Ü{ýó¾Æsæ3¢£-[1:*äåº&ÊFålgQ&ö/4© ÇWÝÀ²‘bële]9Š5ùô‡TÝ{ϱ…¡Mõ_Ûoל¥í#‡Æ#Þ—Öw(—o.w1±@1zAÙï@«{hkÙépaßóí3­ÓïnŒŽ]i#ÿ­Rw¸›D‚u²lîJŠŒ½orBÜ™däƒ[ø'puÈd~óW‹y ï¯©×À»Ùø{¤4Þ-Sæ@ NœÚ#Éô¶üâ‡sˆaäD[3 _ƒïÙ‚S·n‚Òf0ðÿÁÐëE'Ї/p'ô1‚iAÓRÆVO}޹îîªð]­Åöq“¦¯Å¿"üô…r—a·Z÷»"Q!ÊÆOÉØñïFu]â¼É' Ðiv`æqÖ'^@ &Ø7b›ñEã×ê±Pë›^ÛGBàœš¬“³—<#ðê O²“Ò…ïzô:ôz_â%{¶qÌZ‚ü¯áDßN?loU9r›ðzá¼´’")úÅÛoâ»Cµ¹…†/ЬGðµŽÏÆüt ,"æ! J®6™Í–)Ñ+É0àÅÇÖÆú5‡Cçõ¥NB|z2 »›vù¼ûçljïŒ[ÆÄPŸòQ› š—©ô™†®SU$Φ³qþâ9:W]œðB Ž=¦ÌZCS"H覞xYñ­œŠ=è› ‚?bâ‘ò€É(ŽWN)0aHÈ_0àtƒD£‘ >ŒÉ8i½Ä4ïš"¨9RíR/á6²Æl £[P3ufÑLŒ2×d…¾Z‘: Üoÿƒ|åYµÐâ€væîHO±Ç$"þ0$"±Ë õ½]]V^…~ñJ°:ÖßÛó\Ú& ÃX‰àœx9­@(£ø•>â[}&ñ®ÌAV8©¾›á[TÖD™j¡C#}P¾­ô,S)*‘R³-@•4\*ŸU’!37ëd5Ѥ_}J~:|I´N~)"|…êÕˆK ÎzSæ ¶ãqgÓEÉÇ äÎÀ{¼µ0œÚ.è§![@ÀÆÈ ¢Kº×þžö0>Þfî˜Üÿ!———; Å`˜`9@bŒŒ®ýÆîýž¯ýÅ#àÒ GXÊW—4éAðµ¦.SIî÷v’ÀîA‘6ÁaC<‘ûô Ñа¨áBºn[h«Í’¾‡˜=ð†7½ÂÄÞÝb£÷š]ÿtòe¼= ÑdF¼M=Eo×»YXý# i½ânY0^4£ákcÞ£€¡7C °X` eæ?oàÓÂñz˜Ø²Îb@¿ËõžLUúÒ©ñ7ïg2‰ƒ¶¯4«©ÉÕ˜ž®Æ´è]¼®ì[ø+l<¢~i°´ëëL)¤L’iC:î¶Ô8£¾KMæ×ÐÓ£±§rÒ Ìþ~uB?NÜŒ‰ÚŸ„UåU'ö¦3Y.¿²¬“Bo¼ë1½5[xÇ”ÝešÆÒ­Óûˆ Ó}ñ«15Y6÷ ˆs ¼M që¥$Ù¬ôlÆ&«rþ9„ˆ@¹û†:}€nlNîá*jÔ3  ÔIävYSë =îÿ–)ã9œò½ô…¬E¦bïɦ¿ªÈb¾Y7Ò¦· Á*H.Øo·òTHµ-žÛ¸2¬#@'²óYìT$œÇÉÍ!çSE¾žÙ¢zäÁ6£) Ú×.§¬]3Ðh0&”Qr. —ÜZ†Yúý—ͳW.%CÔ}á^€ +X,ºÑ / >±urÔnVL;BZZ!7fÌy'ûQÔŒù [’0.7¯=W8Pø³²êPKpwdaÄ{ŽÔwk~z>!§t&(~„h­îæ» ´0ȸ+¸ ë(\G䈈–›f‚É–Éô='z #*‰(‘¿wdCÓˆ—ÓЉd¤í$Á'yA ÎÎdx]3­õ(׬LÓW_Ô–Ûž&ÿ9‡·Ç¶µuÃp‰ÂöCˆ NŒõrél oèðoNÊ…r f2Ör¥DÝ‹çwRïòœu'@¸øàƒÕ ZDž´„3B58I€æ{¹¹5üæ>ïoOlûF^Ô³‰°×¢˜Ç,䣰U×÷3b@lÓCš2†ÎÀóõ(šUî3ä>émç‡uU ˆ(ˆñªKmµ}KIS~í2 œŒØJWÙçnÞ i•ÕCänè”þ¼iEQú3q{µ¯B‡°SÿXÁ&ÉS‡ ‘\>‘ [éýsº†!Œß.¢W•‹µ ›Å=8ÅóZûRËw(AîӢPÌ0ßõ‡ÄÎ1ÿÚœX Ño#£ ¿i¯+‹ b^‘>Ðç†rÄ^@;•i8$nNm¸J‰ùÔñ¼Z¡4VùŒ‚Û»ÃJ—V/JÎv &40Ë"„Õ÷²’aQ¹«±ESn‹ÁNÙ¤ƒ÷÷uïs„CþÔ,o2$« Žd^U‘SUì·`"x«qpÝ-#3 ƒÍ'Lef ŠÐú>w\,õÏ ¸hªôR÷ XZ,qËLØœE$;C·î)¤ íþm äªÏ]¤ßXSÿže¹¨Ä3°´21!Š7¾æ©¬˜Áíž}vj!b/ËdéüÀó"ÒI££[Þ·êIÖb„ÌÛ«ë•0–¶Æ{L² YC ³î€‹€RjO¯¤ßŸY8ݱ*ÙV#æ£2Á_²°ÏÂ¾Ñ RÌÒÚð™É T}—(ϧ(Ö߃³%úƒ bR‚ó¥fz´™eÄ+ù‡·ŒÆyñ³>ô Àx«ÍJð,ºœ‚úké±*Õ…­ uZOC… Ž˜—m9…}tÃ>6ø{CAÅÙ”S —œ "Ú7¤—}òFíxB`O-¬¬7#·%ІçÜVKο¸ÊB£™$¦ºw'r࢑ ÕšgAðäÞrQº YQÙ÷‘(ÝCNó¾¡Ef >(°/Û ãË4Áþ¾ð€»œ›ÿ£¾ ›Œ×¹¬¬¨Ƹb¯T 9Eö#¥·BäIÆ:ÎÖY|Æ…Y¬•¡ÒyÿGë^ÍëŽvÜÈSñ„q;¯Î4¢& tiäxouõ±‰ “ùsSk@9ü“ffŸÌα Î6Xä–-cý~GuC\>E 'õìò­Œt-‘&s‘ÛvŸÉ——m{L’Âüšƒ6 ¾?¤¤M;‹š%Zdä£vÃ`˜kn¸’lN:×`ùEl6ŠulÀÃh‡ºí½ËË¥5wŽºЉ 9øŠ\üìI‹·îÞ)Ú»·t´!],™ÄÆ­ÀQîT:sD¸—d.ývúx’0åjB p6Y6ýŒ Ã/ÝÏ} º„ÉyG&”‰N‚~­£ˆºX j~nxk£~«Íž  åJ3»%Ú/ð5-GºVîy Ò8˜ãTí ÇLº$áLµØÓìÕú_ÕLÔù ¯äºràhHA81Ë?Xm†r÷wãÁŒKذÿ_m1sõ«S7PTV†ÜT1ÛE]ÂmFIŽšbãÎÖmØÖJµžÈ@ôzÀÐ^1ö àW ÷ÎäoÚ­‰G»Œ‹lÌT‹=â’ˆKê£FŒ8÷“]´Ú÷éÍÈÖh§;üöšµuK³Gin€Û$'Ö¼('‹G…ƒ>+5ÙŸj7¦éD™F w¹EB¡îã¶Üµ»Ù¬'½QÆkÜ¢žé€yÒGG£ë…üßÕÌÆÐ%ùùº¦ 2rtÞ2*O=RN ÀŠ@‡U7½×p×Í@뢻4/ÅDMôÚÛE/¡pþá_3Ω¢¸œ4¨ëï,¨÷ÏÕUû!jçuµ ¢>®30ðÉ;¬1W.-‡ºÝõ@dw5 •W'ìÈ"%zØaMT¥TOâIe¤y›r$ó>>JT¼O 5N¹vh%…þîá¥ÄwYªkètKþ÷ú iÆÑ0Äï5¸&› EØÖ¾AÇüHê^o­° í{„,ÖÇÕèÎ$fòf3èù€Ú£7ƒ±$¿£pµêÕ¨$ˆký“!D‡r *þÒübšÔpÊ”¸³ÇyÓg9DÏ¥|¢¦=‚vp°M,É|i·ÃÊ5:úJâY¬:ʲüåØÀ½fòúô2Z|¬GßÏð~þà¶æÄ É45ù÷ƒNÓÞ2ç¬|å ß”ÑYF©Õ¢¿gÌÏÿD†Ctëg$ÿgã•ö kcŽ‚‚9覊¸êapi¬ÚI‘³m[`ò2'‰NDo,-u2sô8RáÀI[ubj—Xw§#me(³…H`Óf—ÅNªFýÈöXbJ–äšÁ1gÝYÐ=ï"]?w‡ÎŽ*ÃnV`QªØ:©Ø¦!3]@ê|fÉ Rî‚¶½$Ïž?gdC(ìÁÕüSøõM<0µ@¤O°v±2ïÒnM0¬K¥B$v±”VqGãБÞ-5"ô=o5•äÀô¤#5^ÈÛxÂ$cã6tˆÇ¡ú3G…%MŠQTSóÌ ¬Ý}üžŸÝÀ³ïÜýë+ê{vØ¿‡@bW1¥´?X&öŽÙ,‘ H`–Õý¥çË éŸ…~…¢w ÒeQªEYôøîOo”eÈ:jgŠÚr¶ ”uS"mŠÌÿú»¤¶bÑ”ÂÄðÈÈŠ,ÑÓ‘x9mê|þ¾º` ù3g¼zòÀÇbÚ3^1æêZÄSÖŒl ìœÞ…@vfÀðoÌøc0“K’ôaæŸZ7ÎðãJ”s&:#>®b-úçá`]Äo_"ˆøɶãü*œ©ÄoÙýÙTF>eÌ݆<ä” c/Ú…(Ùwn•üµH|FߢOÉârWNµäU,W–>’㘠0¿ ä‹×ßÔËT}O¢Uˆõ/Y Y/<¼ÛÖ†ÓÙµ€Jþ®æÎŠ™§é•ïbß@ ²ÃKÿÛÿ?±&q·àÞçÑ?ÐÆCöÝ*Ëœ¼8 æ r±¸Q BÃ41j¿˜žÚDöhj¿Gçh‹¿ ¨É]uY\H¸§Hm.%z¨PÛK{:Ûÿ[Ìî Ü¥aÈ=EZ@=¢Ä z&£‘à¿dîófûÛÀuý $»d§AY†ºà°d¤£5– Ý(ÓÓó0øøŽÊU[ˆ‘Fp‰_¯‘‘ ÂgÍË™·µEVä|ô¦½à øgìñj 4½ïCPÞu”Á\H ¡8Þnª Í £ØÛ/ÿðA‰@÷d/aÆØµ;ê>“-ƒïd·&{xý\|¼’w•Ü@šœâi:HþÔ—2"ê}×b»ÏhI¾¨Ä%…æÐºtO–T„®S´ kÖTXnŠîÃì¯p¬6ÊO§õL+‹dŽ÷& ÍïW6 èÎDk¬ñÈrgßs·à¡A.ýàqÜ1©[£LþU\´gÑe‡¦¡¾,ä5ù‡Ñ=‘Î-Õ¾ˆ‹Úl²˜lO ©‘}êd0ÅcÐÏ»A´Á3†6Å*GbãìBµuIæUYÜ í8ð´ ½Ú'}¶ù®`]ëÄ2ÊÓ Ž‚h0=…б"f—¿÷$Èšs¨‡Œ ÐÖþw–Â*$“ý•NøP‚Cª'q¡‚¾®Ý¿å=YŒ™n #pÏÖô%=¼9É»çª.,³*§”ÙÁÈ“Ûñ>eÕ»x¹(6üV÷P¥üéǘ(+ •Hl¯Õ”£µ¾=%0~r7‰ú‚øO;z%[r,^ƒ×¡‹©‡ô“!† C¨¶¼'ÖñL¯g°È”´¨ÃNo4D3î½³Sj­cÝcDI>µ½×ËraámLÂÑlWö\AÑÕxáþ²Yn‘Îs=󶨃¨€±·üz¢ÃúMáÄ MÛ”X!qÓ¬h1MÖz:‚êD!20«QnÚýhwÖÕ¶÷3òŸÆ|÷XÐ^1Õcªy½ÒS]ðÐ÷Ý/„*2…¬<†»†$ZOIÚŸ`-kOŠ#›ss àÚΗ¨q)Ë$>€eŒ0yo*B¬'Û—v”0Å‹*®[ÿ½¨ÿ„e/ÆÕ/îÿ¾°yÏ>aóz²°³ßdW:OO§î‘l17°ú¾¶%¹‰‹v«ÄݯB³Ïœ ì“Ç‘#­þEÄ*Îi%Žî¦ã=ãEqòfŠ= ßfUO^°6Ž~¯¼LÄ—[™¡ñ~t嬯ð®®* &I>*ãx3!]É ç0;0"¢½“+LÖÇš{“|l=Mþw`†‹¯T™}.aæÀ°åeè÷ûg!ÜŽzÓl¿t?˜ééñH_,÷¶Üø»¬Õ€!#«YÃs5‚u`ºfù¼Lýw hœ{PÉhêÝŽº×£ÐsX¨áŸTئµYsTˆ–/CvŸY4fyt‰T1]¡4–ÑðÂﴫ²G@ôdo™é£bÓÉ ¶Ør¹ëÜ2y‹ÖåôÇ©PÊ3é40ެé{ê¥ÖA %³Rê8 ± ž@‰R3|¸KI·ž´ªÙÿ’JÊj *“w¬Üz1aÓ·ÝôP3¯µ´.£ ”î†!Ÿa‘ r4GÿžîÃ”Šƒ¼žaó3“”N½…ðÔsºGL'bb5ˆ ú=_Kì—O*ÐC+ä‚ ú—©Þ÷Á$¶¼žo2#»¾ A´$lòPðü O :wŸsN^‰d_)_Þyc¼½¼Š®vHz«u4çHÛ·¢(q‹y*ž]f{eFtAHÙÂ0Ú«+®ŽàÁ93f§ ”ô.¿¾”ÔŒm¦ceƒµÞ÷@¾¥õ\·ÁwÂÊLX40i öø½÷s,|-x í¼ÒYh<—?? Cnº®t|+ #ZÉU{´ˆ²×áV2lѺ…ƒ­\¯ë/ï‡R«fظ³?ðÎ}+,:*27W vO'5¨I"‡éÌ Ë}³uè_”¡;URk€¿Å‡w?æÂùÍ&¸š> S¶èõ täkÊ\"À]KâÙ×ÃõgùÂD1¿¢õeLU˜kQ³jÔæ­º»• }M”½îÉ“¢`hîVÿÀ«½/¹z¸Ž€ÃÑ—•p¿AhÍ¡ŒÑ ð¾^q|;ýökꆪфxxlå ¾éä8[Ò-%6 '½Šá —9’ûþ@êy¡ƒ:Yã“] )E_‘A(¿žo…ÉC“>HuÜp·^´¢¾{ÈZ^p½m‚)ѣӱŲ§ì÷Ú«®Ûnì#«‰ÓwÝå¿2·î¶KOacë  DQ—<3£¹“/:_ >éÀ·"í¤ '=wºAÇtü‹' ôÓ LfÞ-7ð9ܳ#“\·j$Œ§eªUbýÔy ‹˜>÷û²OBU«Óéú‚ÌøåeIævUBv¥ëîô-,P,$¹FDÌ—i3%Sî, æ ê»¬UsU,~U±Ô2Œ›=JJÖäÚô“ãk?›¤—Ä }Ù©ÃÚ}MÌ …#­÷Z4˜ Øÿô=.L¨‰ñìÁè^ˆHgÿNÔN¿t²”»ó†)Èh1lF…Ÿ§Vœ(Ôusô#Œ&ƒ[ûsx¢¹®º;o”›(>»2ŽèzR|P§÷àÆÓe¤Ú>…écÚx!7z!ch&Çêê‚>#mÁ# NSÙ©¶­|Žá±FIÑôp‘2A!_h)Ö™°sC¢’*à@ó'¬ B˜*› þÏloíLr‘›ÆÔùM4Jºî×^æ–»ò9²qä™Rê 6{½”¹fõ² ü®¡QêRH~R·CëvOØ®'Ì&—ÖgUtÀ„> r„!°„JßTÉcê—4+ЋåfQ}#”!éïÎþ}{E€TºýUÁ´œÜ<-ާè:¦øc2cäFæ4ƒa±ìA<%Qñ—²öE}>­¹eÕäËp®‘“P ÷•ß ]Òê2¼pªm‰ßÄM͹÷ äÝ9Ì¿±J7Pà^TB>!sÙ¾yö=+ß'ŒŒT‡ÍSÊsÊ47ô°\@íGðê‡$Xk1l •ä=´ØA>|@•Šƒ5tšG¶­o7cRJ¤+ˆv8ª{’W Ó\°Š[µ ¯d‹ÇFÓ³¾Êb‹{9%P1¿öRǨ“¯«}‘L0*õ¹wDø¢K"´LÞyh¬YõePÖ„ê. ?££jäa‘?:pßµ!aìi5-Ÿ •â"W ¾™‚–ë0%)oZ¬Ü²³uµP†B9Ðó^,ÂËY{9Î4$c}Øö.Ì>÷„Fs%Ù£j, ›Ö@ãvÒÉ* aìZˆÝ¬è¯½~_dPä§Æ}±åבL@³¢JNýNÙ9Pʨ5B`éÇc fd Еɯ6ù¨Í9ÀXi>‰¼’ó4 ©/‰NËÙ:U¤pA¾b) :sÈ:Oÿ¼žP¢%µÔyÅBÐ+›¼ƒ÷ ÏpQè¿Y±WXC~dÓÓ8 ÙœJšÿ²Ó‡l)‘Îèè}A…öåŒCΗBó_ËȰª ”ýÍà‹qu¶[Œ 4x3Ðb»È'›ÜyÞ°ð¯"§w÷Øî£¡#ÓÊ)e\RÝñzÕˆ‡¡»¥¦ –~\ÿJKxÌ|È}A¢¦Óñí)œb’Òã2ì[¥‹ßRÑb#Hýé„I1nFŠj7eç‚â2Ü[AÝýxkdÆÔ‹¯¿ìFmg6ÙÔ ÀÈeæDæ)y'çw£~‘.ÈûkôÄ—[ãíEÙoÌeîÚÉ!YŠ4Bq GýÍævøá'+r;Î$Gb‰àíPȾ±Ê!ލÿ+“ðàrFâÎ]°xx´J¯MÛ®–ÏÍ–çÊL¦ïýk¬†.ÿ'drºŠMÀ¦Ðé…*1»ZªØÊÐȨ ƒyÌæÆøJî´´U“Ý1|®{Âù _ÛêóÃÍMc—+&Z0|O˜ŸÌ¾·þ…ú‚CO¦gÛG¬C¼‘³ €9’ÕàMöll¥ª!(æEm†Î^Y— ¦¨#ž?¶]žÑƒw4ßT} Û¦7`§Ç/¹Eà#3CØâl…*Œ¶ùzˆ™ÒßJŠYõØ3ÕF#eÑùNg̼ô²¢írqOCÿ Ò½"·`ÁˆZìÁûnXqìоø;%þäÎÃ#=4•륉V3cÚ¤¬k‘%›§¥r±–0¢Ë½vÓd ‰´ â“Ö‹¡ºÕ™¤1þCuINû”ѦE™`6R’†@96Q~ —™·úÎR³#á•‹dr¨é7ƒºTû¶í²tÈU`Ó‰Ã$ÄnÐy« ˆ»ãû¨8àÀ£u¼l ’Ø"Ï *+‰‚‰+ŒóŠØJ¾ 1²†¯ƒ…»Š“gSñQtš†q5&Úv& `CáPXü4Ú-2©öl2ÚWü6DÖWò0‡ßnÔÂ"Ÿ€As|I´ÐÍ oélô ¼QT[8¬.àÏOû$Á­ÒÂ$ï\1剔Á´çTwÇ8³ÝÌáR³¨Ô»ÅæT¥¤6D±Ñ8ú£=¾ÁÚª1¦£ìþRóÃϧ¯ª°¡ÿ)q¦Šeñµê€!_ãó`ï&ìû0Hü€ÍbéJ[›AV—2Ô>7-‘ïÆÕ4ÜI×’èõçPM‘<}¢º¨Á¥ µ»®à`ãa»*žl$ãä™ßó>#ûÇ®t˧´[L€D?s Ýör‡,G g1³; CÍ<àYôÊ¿óYR¸>ò¦+­tD}yØf>¢%Þš¢EU4:öYEÉ£ž@UPÙå|™ÉsõY ŃqòY°t©(¨|}8?Ö2¢t¬t(_ Òbaïc ráÒ?Ú“P`öiä‘1FÆdxa {ãe­PÓ–;|pX9:Ôþçsذˆ¨XP®¥ÏÒWùÈã^>þF?ëáÙ¼Í8KÅ"+â íóå€#¶ôw»^Œa;zô Óì²i j¶m}ÏFؽÖòþ0L·qipéDçÍ"ŸÄfïMp‹ÆžTR(Î&Bí‘Ò¶÷Fpï`Õÿ‰r„‰rõ-haËÌG3eö?W©¦\w€Ñå¿à«¨¿1|¬'4HwÁ •ÏÝbA·6lŸ%—¤ŽÈÞö?á{Ù/PO eMeìÇ"¦ßŒkpCWM-ú{a•}Ü 6ÛÃVG»Nk8ØBæ)P£ ðÌ¥mÂpØÅ$¸­Óø…s(2lZ*Ï©–êQïJïYÜöZ{|& ÿÂQ:­0P0t:äK…¹àÂ>Vɉ.ÛEZÀ‰xÙ P0|@ž·À-ƒóœº= S³?8x˜ñD½"®˜G¼òÒ/¢÷ñl* UŸ÷eËË®xQUñˆiŒ–¢ÝûȺ÷8¹½Qˆ ®q…È»2—|´,Ó^6÷ê3á'ŒF¬‘*|à ÿ_E+ïBê‚sØ­6è#+/{É6ëx60ãõAÀ° œh)õQ„Ä Í„(qKy:, ê•‘\$Š®(÷äL ß|5ì]#ã˜o%t&ÔMIÙ¾¢F%2a7á:jxÖj†Õû7µm0L@éy¥eCX2W€ S²'MâïËÇèõg»X–²r£Ì¿Ð}7¼˜eh°“lGdÜ"}¥$\Þ—³Þ«Ë,®°¤žsG˜ši¼±“LAy€â;w’?³=è¢Jývöëc\d¨ø|ä3ÝT‚ÐçUIxr=*X=)îdÁÂÛÅ,¾‘$¦FÉ0[Zdνí ×;¡¼F@:5hæÍÿgx¬_“¡òÁuóÛF´™=¦•&0]©š°rX54ˆG"'b[ðÎdÕ‚£‡‘PÕ«†åÉ=+CüÌR;²5¯L Ç,z%'Æ$f&;‘^ë“̺¼3ŸcØ-F`™¨Ý|í%´#ö(Óg£¢ßýªÌn1\K1NI|\ÈZvS]Ed²6Ex£3ç™Ð8NÒ®lOä=É›™‹Ý[ƒeßDzm'¾hòŽÝ~µ84˜º¢hj¹ˆöW$,~¥o+4ŠˆŠHÆ2ò#DÂ5–Ž'gg€ÿZ*T¯©‘šo+XâÍ2‹eu»‘žÒµõa©ùqÒ#ÈÔ²z”+öNïÈ‹êͳfOÛvËžmâOmüËĽ˜3hnkH0â…°”~Ë϶<榅ªµ&ˆÑÃNƈ‹Ë°·hg?yp2“däÎa !›ìOßsH_Cbz÷´ŠEP‘2å1`6d–ùc§T!œÙ–ÖE<ÝæË60fq)Õ”‘×îi°V©µŠ­ð]-þ®Ÿ\LuXÿ€÷ªá¸ÀkÑëòŽÛmNqª"ÁíÝ@TÙªÝ"=’㛜 ¾_J´ày:TI?ü3À¦ˆ¦{IþåG)Þ©ù×Íì-é’ú±:S ÁSâa¾ü™$Š{K…õäzšÛúGXå9”"À[5ð-’µq5ë*ùH¶9Ž,:µnÝ8´Š˜ÀcÇoòX6ð®,SåJårô¡< _khÕyÃC{YCS1…¦W ¼X@lÚÝ׳¹8 zßÛcnÂÑâÅh;ÏMÚxkåPfÉIr]ëç†ÑÜ``Â^u#ÜóKáäìÿ¤Ä¡ýCÀä=P` ÖúFíl#cÓD:«ŒüÞæS].í±9Ž#¾Æ8Ñ"}ÖRýaAa=Ì`°6ºZxÜUô3q  ÁÆ?æ˜äü²…1@îH¬Ð¶¸sÏ}m‰•bE} Ï4f¢ùÈTáD=lÓóÕg´ËÿÞ9þ¼!ýRbZ‰IgìŠÚˆô^®ä9K}A}u¯ó*Ë(}Î\…ìîÝh]zZ¢fñaf¼ðØÊêP°áÊNÃ`Íóæ³(t…-û`ÓxíæÈÈìë„e µ©ÝK²ì£n¢î«Å,Üæ"umŠÑèe)/ V†‰µpgŠi£\æì€ÑºBP:/=4‘†—sÏCHÖ˜äÔÀfðú|LìiëPè:D|IÅm¢„ )÷Pnºÿ9r2ýŒƒ_, z;:ÖàôgY½Œ“ÿ‹Ô4‡20#‘‚SNF ÐóàË› VqŸp}ÇÇVž™é!ÃG¥LÜ–•M*éÁó6ºóñép÷þR;W¿‚íÃ™ÓÆšýáz+¶®¾Sùƒ”s‹Z)Ìyb ¿A>{H:Ÿn@*–Ý8ò%ZôW €ì •pÈp9áz5K[™"6}¥½ 1ÖT'z÷âFopƒ"h|ˆëmi¢¾3ÌDý»àrK¿’Önw‰}(‡M¿íU ¹Îb™þ¸E™fÇLëÁûF S´T`ÛŽúrGKîO%úDH28³MfcÀãN† ÌÀ½–`_æüN-xN+4ÝÃ䧘ô+äzÙL õä±h6`#Ùª#h˜,>¨Öù%v5G;‚Tþ¡Z†Õ p*0Õƒ½¤"’3ÜvÚ€ÿ+vã‡u\ÔÆ}Gäk™Xó_4o5ÌfõÈ YÆšÈOg—»™U©·ìUÌ(ý=’M•³Â˘ՆÕÖ¯Û„‰çœÄè÷´£xLGóCÖîæA,åpÕØ}Ámjý7^¸›ˆ•!âˆÙ^o ^FI yõ”©®£;§v|+/ý°Êt€Å(A{>&}%)ë?Î5G”æ ò˜ÏÞwdÖR¥\BQB¼¯¶`½ð˜mIdôÐCBÆýü¡Ômy ·]g·Þ/_Š÷MƒÁy#þï–m-ó&!O,ÞŸTóGCAävpèœrŠÞÒRÀŸ Ê0¥)ÔÌWfU4<:qƒD\Ý ' ReACÆøâñ†É:õ M/3¼!W|Oå5|òÒûÔŽ„ðéêâe9èµî¯céÜò{Wƒ£–w0°¸½¡1ÞgÞöéza}©÷®R5çéõ<³è:9H=/JÑeZ‚¥ÁCù Ö(ÑÊð[â`ÔjÁ ìÈ(!ò LÖ@¹&£/gçr\ÃÙáKïU?VwB–ˆ¥åv¡çÕünÊ6Ë‹¯Ë"²š©bm†Â`-ÅÝ€ce.;ÿ/ @ç k=¾Å[½D….á‘/wo9©{ÐSTš] I!äÃ>UÎS'~]ˆmO«"<3ÃÏŸ—Pê}Œ–ÜŸ¬°×J>2‡èrúÌ~Ɉ³ËôÇh7ï¯Ã€ŒÑpv—ekzYGÿŽWÅ ;áˆØ*E)“-©é11–«¶Qu¹ ³q•Š¿_GAº-«ò)lê4:°lW¶Y¢þ.Ž2“()$AÂ"™½ïO /ëiŠÁcxNâÙf-D²«¯12„kcêØ}p¥/C R;Ë…æåŽi& ³5ÈÇBMx+Ö¤­OaÌqZ賌=ŸÃZyPCƒK·ÐÞ«l8ZË6;1»réI°|}ØÀÄ—Çaéîå#AKËÇDï$'_9@m¿Ê½ÚWü]zhfÆÛoa)—ªÈ)F6! øT¢x`{ÐGX鿆15(7¡6È8;$&æwã¢ð+Ü¡&\q3ôÒSdö4ç]Íu<› kŽEgº'|N=ÿÏvtC.Æ‹ ˜Ø ?Ã’…9²n\C\LðoHé¡n.…jò|;¬Ö>Æb+Q€¥~ m’¥þˆ×rþ&æ}XÞ2«Ì cš_Púp¢µ gA+P(#yZoõ(o&pn/ãÅ¿yŸÈΈúQØñµ=~ÚÒ5>PÌéu@ BÉfšvñª[ððÈ4ÙŸL›ÚT€²œ„廈à 6ÔŠƒÕFN5Ñ}Š Ú‹a”oRtÍMA0›ðO©b(r?ìÑÏíå{ˆþî×~6¼º¿þØ‹Møné蘨½ÅÓzY¥úEÞù‡œ¤'V\Øázd0 wî:âòF7€ÞôCö$ð+¬&ÌwŽV¨ª¿ê•è]®ÐËÂ%UÌ­ç9ÈOá‚®À0ƒŒLN qL®kÏrÖb~µlA e?@ îqÉ·%šè £¥”i^>+ÆfU+ñá½Û¤xçV¡Ýk‡GÀëØçÀ™FÈwê_¸_ö]O,3·#Õ¢¹1/ÇßðüÓÇH«¯W«R2:8àÄÓãâ'Ñ«”–]e†-ýiΫx<¼r-‘gêû¾:Aaàêg,äIå;°ðþq¦6‘ÛCEPsá |ž"øþ:¢Üôbx¡GxnKðôh;ŦsšÌr*EÑÛÚ+Š“=$B•û*÷AâõExþëYhÚm‹ Tu„¯ðLØB]ÞdM6j¡ÚÃgólf=:€âYK‚›~fÆ!AtË|n?˜5Ç„BñªÀ”|ù5žC¹¢JÂÛúƒê(ðõûjþñrÝu f‚…¾Tyv¡ŒhP£/<¡¼k±fkxód×_«Ô´oÌÄ(Ǻ²‹nb{d·zqÆB£ƒEƒ–B̰ t—›SÏÁâÓ†«ãÂôâv¶y⟯w0ÍP •Â.qüÄ &.Hx Ö9¬@Õ ˆƒÆ‰ÌèѳÐKq/ÚáÖ‘#:&uNþ³0;¨%º_eã’au†ý±FM”o Î Ø=Õ+¿ÁýóŒy– À€Iƒ[;úR±úô3Õ*Ð3×þò‘Ïo®Þe@; ºÇÑú+k1PÂÄì§e±#™“sQ!ËЫÉÁØ9q>ê`å{tl×§ê‚,^ÐKÒÔõÃo};¡×KÊò8¥•ƒÆlµ‰QÕ§ßgÄ“ÿžz'™/ö(&Íž£/Œbªƒ®$üd+Ôc`wjÑR½_-WSÿa—D˜ú⦗ŠsÅóqŸ™óÔ¡mY„VçêdDaŽl}î 3¾Ëßi‘Ñ‘}å¦U½ðÀfC&1¬¦ý$úøþsKYCƒ«ªuóKs.¥Å¢í(RKZäÇ| )š@CQà™á§I¥{×—Ù¸ºêi%o\Æ¿Ìlª;¡¬ ýn0„Ê~"L¦[ë¹N!.`'fº; –±oÒ¾·ëë‚48o½Š‡æ}¡@^‹i3ÏßÌÓ”PQ¶^ç‚™2 CäšÐÚ ÌB¬„ˆíWu»«'"@ÐûÆïvÆ%l;CéÜÊ‹ó‘`dã¤j²>O0;·Í: b7ÔÆ~vã!sHz– ñ¬4××ðï&ÿf,ßQСÎâ5»ÿê·7 jañ)|(›´°ou¤ásgLšNª×ÒÙJµƒvE·3ýù¿'×<NPñÀù¬øÏ¢ü*ì‡ûr%3 4Yñja÷~Í(§ÍrÁs_]áùYuÙ² f¢4t-Ç@¹GêGTÈjTÙ_ÆW³¡ †å¾"Œ‰ñë_Ûp dfÌ9!Åcµ$°nÇá@`ITúJ’ßá_–n7ÄÇK‰ÞT²~¯ÆV09¤ÓZx«aèÿ4ùÁ²2ǬœöaÉ£ÚpÅjt¾?rT0›‹yÅ›‡µ°lå5B¯×ª:®KøUcàÖϼ'éBxµû5ÂRINb÷˜{Y»ëƨÁtåï¡'üݘcØÿ€‘dž‹øâ‚ÔäZúKÚ.e^nØ2º‚ã‚¥$ñ!²“|3Ì1*S]Dë:ñKHÆ¿"µd.úHh:Hwú­/$î6b°ÉAFã hàbÍ <Ó¾$£èØÖÿÎ #?WÄÄ$Óá+$è5I­Ôs&PÝ冡‹K›9 ¸šûæ¤}8ëÕZýëàµRdä‰1ÅÒdj9þ©3bÑh33›öxºPÛ4R #¶00Qeë‰Et74±:S› IÇ«’üé5Ѧ܆~3ÙD‰¤wÞî ÜM1¼[¯œ€Ûnx û—[nÐ^ÀeéŸ!æ±D‘¼õpo¨© –õº4¯…§ ·ÝÞ*á:Ùú'! 6¾_Ê Sß?'ƒ—™ªA¶-u¢/jÄŸ/4rD¦Èa¡Ö;¿ÜmãÁCÞW†EòÙø÷ðPÜüÅJù¿¦®ú|Ìñ\É¡9»„úÔ#«kV-0b^¨ì”hEÂ0ŸsÓ “Ï»ÞÓâ{qýÒ6bAeëQíÑœH%²5~'•íÜbbš¦þâ¶d=ÕÐk}ªØåb r}™hÀì¦ Ë*‚çá‰ÕX<´¥éúÒ>ü%ŸÐ7:øbX:³5S« û¿»ˆÓú÷{Œ²b“kd‘õÂWé·Åzd¢¸ÜGN= ‚ð„¾ðZS)#¡hb ¨Þ8âÝŽ"z¿š±öž×<½ÁMÝNÝT=k§¯xìuvËÇ…Dl‰±^ðœÝ–vÙ#wq–l‡O²/¦òó§­ây5X¡ ¹ÂSjøEüÅa*N–FÎä´ª¹7“°gmžÏä$5] õ=Öï†ZZ}Mø-Ý)Tyt}Þö¸©¼ùIµâž Ë fÜ–„¼Kõº†ØVeÓf„U›ßÖ&×”¼çkßÞ[¯2¾˜Âí DÀW´Wâñ÷­òU`,}ÿ7]F&ê°ÄµÌØÀ‹5+͵Z{Nú\6x3´~M‹LiÍÑN…wj6 í÷n3ziÁÚµÒÊ ‚™‹PCvèuâE™Æ-ÿ’DŽ=¯‹¢íƒ§ÿFCénÿž´¨•Y7U“øŠ¦c.@R°é—k4Í2¯¡Ñ<ÅÉ×lš u1Õ0‰}¹+‰8$†ršo6ÇÿeAÆ36œosÛ¼‚ k("÷èô˜ñ©ÔÛ4__Ͼ1öAD”ÅݨK{wÀ¼Ê1TpüBb§+ì®z]k­½Þõu!¿•ÛœW(iE€:ùŽú-=­Uò,Ïÿ…3a›Q+H ™Ò¦?µ0až®j£vò«‹<ÐRT–ëHg˜‘{ÕV“½´FSFß3²Žã70¦¼}¼g$o0¥¼Bϰ!¯ A¯'MÑ9ÒSiØ R(ÒQzÓ t”‹&ŒB2œ+Ù—8Xƒ­q£2u»>–⣑ÿAeh7#®FÏœ0|¡3¦íȶ}˜­J?Á0à“ÆÔ4{§à0ï óT•Kýj*ŠáÏÀ"d}·Ô®8í£ÓwK¤ÉsÚr*3á2 jâ\©¸|›É…%×D«êÒMàZÃ’»ðB%Ê«F2V^ˆ™°ØÔ¬ès°@Ð’g±©ÇhBÛ:2»9Œ!¶'dá&œPŸ|s"’QÛ¸¡müæ×dÚ”‘ X?œ'röO܉HΗøå$•K at¨V“ÙÁÑçbðVvÓè}뎃•]D¾8•q.K~ŸBØZ—ËV[L6ÉðL%ý3áÙçWrfäÈfËâ‚o'Åû@øçnäB /”%V|º°{€€oAÞ|6¶XO 1kŸ¢Ÿ–$£ÃÄMs¡7a»öL\/+z›Äƒ‘(Bº7||j‘WúÙÈÖ¸ƒÆý{èß$L`fcXDÙä)„U­†[Ÿž†œ„Ä úªÜ+úæ G^ú[Ü™¯ùn¯’{"–%Û%iéÞ¹ó È´g!ŽþPæ†Æµ&Ô©×i@·©H¢!¶orÍ— âÉ*}~ë–ñ»jåöÕï;ûþf4[3`evt'ý‰>ßßv^|äsK(7ÛGIšÝ~µ‰¨ÀRÜ'ÙL7w°à•«³)ä™Z9<öG O¾dÊ–v4¦L¡¨C q?$ÜãˆÕ:)2¢~§Åò61¿Óf›îû…v•ÇMpLî´½Ó&›ûÈ©ñWã/y»:…Ï*SÄðUNv2ñ^ª!î&„Îþ®<¢?\‰³Ög«s®uÃ}øD± R„ šï"lUéY0$¾2"ÂÍNìP!î÷?÷‰¦~k颓ç‚6‹â1&úÈ:ýŒžkH cÌ{‘nNdÏ_Á…ŸØÔúÙö-˜Ý`ƒm“u]uŸè©,dE Å`"/\pŒ–ÉŸÊÉ8$•myûî|ƒžÍ8´©QÊõ ?ÞÄ‹ë`»Ðnmûý¬d A‘»‚qp8Ä M“Ã!Þø¢-zº1cúÁq¦qÜmñ]`Ip%­<^÷Û^‡ »‡}fÞ¨Zw¥·ˆýê7Ï*QÐþXõ|bƒæ‘âÓ‚«’üÔgHûÂ}æëôîWË*ת6– Å”ÓÖ S'"á¬à8˜YÆï{ôÙ>‘ÕÌv´°ÿoß\ÜæœDW!ÔЖ«³Ò+X¯„5Tèb—«†‹´0¹±ÎWW Tšë¼¥±.~kª6}&Dscø —Hš’דËñãí‘ H½Qìú7æÿ6ÐŒKéâ ©dEÛ†¾8lbOa [-0¼ƒÈ·lñçǾOªú¡™•lýÉêWº…P¤H'³í[Víð``ó@Ïþ ý%Iaª.ÞÆÕæñ‹‡¤” û2ê tBϳÈêá ÌêÖ; ¡Ó ñpVÕL7Þƒ©èølWÿ2!=š÷RPŸ~ñ/æù&|_ÏPC1®Sg”z°ÖŒ©‡cŽªød¢4”pk± Ž»䣽óQ Ô(x‰‚ü>lT?9´’(}ÿyFFÙ~ž˜çö¯HæjCS¼›A;=ùž<ñŠ(?gyç :ÇeîÙÔæšm](î(GÈi$½ªYîAþsÝÓ ÿdoÈŽR"3þ'¢Â.Rî#³ížâå=êBøYßuN\!T°`l&l4LñwÕ;¸N4èÒšß¼&ºÇ³¼AEÇüA4Ÿo.áêjÊcq§A.XêI4 uqQ˜ÂˆgMÏÃoŒØXbå„ ºÚ„Ë4êÁÑU“ö‘*¹1{ß¡š˜â%Ö'½„‘^?%·#i’ },\ óø(1ÅCDf¶ÑËkEN)ÐH™™ŒÑÕç$<&ÞálÐÅXLÑ ä%²ðC¼fF\xµ ™Hk+Ã8í$v†ïìT¶üšZw;Ëe”S9{_0Æý‹îp·!©¦bhÈè¸Öïí!ÒÏ›Há'iÚ¹Z4üÍP´ €ó¿‘qï¤{ÔD3æ³Z:à¶í›â¿ÈžU )b‡¥¾v20JíÝ©ZLe+j·ÜpÀ‹#~ÿªq®áãywlÖý\ 'ƶ«Ïl©ò¢l©OÍý”|DZ^õ rr›s ³ÏtI£@|Dï™Aa|c…w´¬o]‘[5÷ÛL|ÔÂn¿¡5>=ë³8§pЦQMñJ:ó @!èòÞW!Q%=Ù÷‚H êàuÿù¶ÝÿÏVx%GðPOÿjÖÁ…\ ÿ=jn‘û‘ZÊòs‡‘Óʨ HýÅA®CÞ¶XA:W³¥²º ÝqìÀíO¼a,3õG³nd m®“‘¯îyÈ:¨'9Á¨‡z†@;ðVøÛóÜš:gœx¦/)e;W¾½aúé†ü5¶ñƒWä˪BÁõ·6+ ›¥9ÔŒŸÌ—_Ro‘Êj믎“E[oS[T gâ8½IÚ4üIC @øþø 3L­Ä¥ÉÉž„‚SÊvð¼IüµÙiº$˜CcmÒƒ×Ñ𳩻Ks3Žy$¤ø4UáŠc,VûÛ“ÇeׄÓûßxøÏÌe'ªækÿýÀëÍÅTü"¾´µõ;¥´(Ò…nw´c‚‰ÄCJ1³có^ *F|ñôÏKc¸H«C'3fÀÅ×2‚ùðæl ¤î~[•;ìÐ3ð€ ùMüiøžêI™%Ä“•Ô2\5ÀobCÙçh¸[à §ž•iõÈ‘Dn˜ ™n}ˆßNšà:Á*³×³>8Õ 6öé[ÑŒ˜]¡ü„©ìÚWX7—å6é€Éõöä˜Bÿ-WïÂöJùÆò5¨&eð’¦g¸Jtiš¥­pV>‰C‚ya¶6÷¼uÔöÛú5¤ 7‰ÓL!Tµýº]Òêj麳ÔSŵ²¬·Šõ¢"U¶ ÿ%û@)ÿèòܳX6:gî%iõm¹¶/K©éyLÑu„ô/’jrS2® Ç †Ì…t |Sê ö­„·!øÇôW— ×BŒ°QÎ4ygÃ,ŽdçC,&¾Yò2|ÄØüP˜@Øü¿ç ðÀU½Äno¥‘)ÒÍŽûðõÏÓˆ ]^r„Kîø;U&HÏÞØU Å|>zßÜY͈•$ ¢Káƒ\ìMž_üQ®5{äY_×ϳ(~rÄq—l[¼µ›¡`É^÷G‰}``3FiÌÏÐ‰Š‹Y`ñºQ§œü·Oоµ\ãËÓ´;å™lá[Êðe"Ü'K0ðîðö-cj8ívÚçtòOê•ÃåH#šO`ÏïÈn*¢5+1ù‘îèzýYåXlH\#Ê=G((K‚~VA{ùå~F,×ÉPûIë8P—/;["ç ɰ_óRÚ„¨ãˆ¾ë­vÃÈ ò-ýðf¥T¯UQƒ,Y/ˆ9a@Ž?IŽq!Þó´í•>sRo³F·€uñz¥H*Y…ÃÝFãÅe9„BËÔ_¾Aj:—Cݳ¥f V–g× 9¸X„\7Àb׊&YêXÉrϸeÀ·¡å{¾Ô|è$Òã2ÿDÕ–ÆÑoÔ‡¾í YÜÒ+xBE¼ÏfšÁ]3£üÕ@©¹bÝëÖ_4wÊ®Öøf&לÔ\oiílBÐ=|U;à~ ¾ñ*1(Ï{DßtÛt°Ñ#Ç}ì÷àWϙ>›+RÓ ]Ìmû¾òMéIŽ ?»ŽQÌIƒC4×1U–umd(cS ®ÆølMBš5`›Ó¯¶ Ãr5î­zx×Fâ~©àùÑ„]Ò'm… Ë0³:,zc ü>Wº R^’1qtÇczÈDÛ°á°TTyÅѶ–É^éõ·w×=ÉkžÔ7d =“r™¯zñuËÙ”@Ö½7”ýk¾›E—áúhø`­$9®Ý;…L6]8ëÇù/`±v ãÁMK³íÈmÐÎËW+ 4Váä` ½‡øŸä”èáÒÇ‹ì¾ô×tL/êû¡86ØÊ„ôt žº×:ËŠä©p’¾[½:¦Üœc-Ÿª;/¼)tS.W¶€|Å šn@?¯ó¢ Fp½0{,¼‡'5…Ó³¨vs ¶Å}ÝÔÿc«£Ø»Ý¤—°Ä½š5ôVœl35U×SÀÕEùsÉÊ[XVURԼ尴t‚_c´Kf”¿¾Êx<§ZÈyßã¡J!YÒÜÔ<2!øÉH7а,Ècù%Ò¬§I':iÏSœÕÜåt÷Ú€]³Ð9ÃÞ*°¡XË]çó¦P#³”jöšœÃqŽ`ˆMÍßWœÔ‹éã×̓xo{7l37É_€*Ï"”Íõ YÌ'ÃA·L<À{Õ|ÌÝȨüvŒ¶4ØŒ’¼Jä…%©átn²Æ¬âªX(¥|óJ8” ‹ßl}Y.N°óáØM±Ôƒ$×®¢d‹ÿ’ÉÓÅÐ㧸¸ó‰ù¡`ñBé Â_üÕVEO &8nü §J|ÿf=ü¬\¬þ´›`Æitëà¨êcJÂS°5"á™"Á¬¿¤þ@Ô×>§áZJ8M´7‘\™¬É唽WØF®þªÕÞpªG, óó ¢›«àYØÃæ¾’ÝÇöŒÀžT¯1¨£ÐFÁ:Ÿ`Ÿ–Gë„1ok ×SÚñ °Ô‡Y@MëžáYm¸Fn}‡×ç‡2,˜ÐGöè‹Õ"©«#Ì@H$½ƒºÉdÍ53§YUýMm6wš¶7'=Õ½øÌ\ß3NïÌ}Q(òA½Õ܈cÓœ‹ÀìTÏ1<ˆÙ¢˜À£IδÐFK˜è¸Ô2« -©`áÁm‚+(,P`±Q#ƒ¾•aŽ,ÿç W}ÎÌ|çjÊE$¢Àõ-UÆ?ƒêd,‘d.«&¡pÒ)ÔŠí”p ô; asþL|±ñŠG± ywÚ§óDϪ”•¿€òE9§^Ìxö-9CcXþXÜþ[âkRË)Ŷ®Ã«»,ŠgSþøAý…F‡ ;ž`Ò‘ú¡j‘6­fyàÄúÁxEᇩèïÀhæÃêKìQ"ˆ/“Û"g…ƒr¤°1¼-™Ê[ eSE9sù†²î×äX›ÄÑɽ8îÖå'kÁ¸´]ˆ´¶³³‰c$Ôeʰa’Í`Û:ÇÀxæoÃ3,MNÖ>Ò`ÿ9áÁöQ葘6μ Ì“/C̱R¥"‡´ñå9=”{ ËæBšsxü:GB8XžA¬”ehÛ°Xcl3餉ò't˜(}Á&ûÎs¿-\RœïºÇQ×@nüöËXç7ƒ² ±-ñ´Q½kÉ ¨d3ÊÞèïþqÇíÑ÷ÞâÊXg¯>umtŒ¸n ã4b*BÛ·vÇy“))vg3ç“g?/IÅ(oL`">ÆÃÃÆÓ²Jgôt= ©ÙT¼\(s»f:e±ÖúÜM…c„ŸN +´†CðþñyQ0ÇSøæ9”©¦¢Î§:ò¸°?âsÉ2òƒ¡:à0 nv‹çVwú».] s)îÒ„Xf'Quüø%²ü(· .O¡Û\f4H¢þ`íehîþ¤^€ ~gƒšGÅ ;q§x#Ë{BÛ4®Ÿn3CÀTPyä`AŸCñ›Z€ek§šéäÝy°«¬&yyˆk¢Ø”Nƨ9ñlYŠ‘TviHÄÖ&$ò¹õ›)9ˆ<7¹š¶/ÑP†òf| ëwß݆qvpò¥l,ž,› š‘íæ2@JÑ\í,u‘Ü( 3Î*y^–U<ý¡ÑF»ÐƒteÕV„{þöÈUò›nYñ¤¢‹xŽÄ¶#Ê«‡·V泚utK°`”Cq‹”×ö%æI`XJòÒ*8i‘ͺ\«‘”Ž!î¸àá\Í@ÿŸmW ó Ë“Bz|f÷äQ:óc—c8·ÒS^üu+_/ä¹”`¼N˜2é˜¸Üæ:L¯ -ºÏäß(t´°›y> !ïê@_¡Ô•D­e^’ÑϹ—Äè~jð™Ãkµ+­ †Ýë 3.æœmâÆ fŒÁ  "cÖVºÒ‰±Àzu³þ÷ƒ&p0àÜ%4F•gŠ{©þA¡`ø(Ìä7è‰ù£5ûÌ‘/˜•ãšÔ/ûÁ ñ¸âŒ"6HʹÄml*‡öA«œé´IK¸KݦÊþ¹Ö BÔWÏ S¨ÙÜ÷<ÏËgšõúÇD¯QHðä|åÂD2u$ÂÉ#túÚÕ ­=èúE¢…ÒrÃÐ?Àæ¯Ñ[n¶:}ÁœïòÊüûÝç5–eï˜-9dsÆ[ Y7Z?@F 3}W¿}4PFCfË>‚lHúþbµ‚zæ±c‚ÚÝEó×áaþ²Œ´pü¹°š– ŸkÿXÚ5}t7Z :à| s´ª(jj2ß…\‘ÇO›uFyýÀë60.:¥µ ‰`mù"ñ³™ŠÜRå@W)Лj—N÷Ì2б £™Ÿb®U˜U³!£OŸÍ «ö=u—…¹&Ï”ñ yÐ Þ¶5ÊÛçz’´$ý]Æûôa3F—ïd˜xŸÀÂWÃÿ=ÍJ­Ä$R>\ËTîíQDšÝp pã÷Õ¬¥@|ì=ûÚµ'½ ‹Ñ8³$øÙ9#¡Q@MPÏA½roÑõò—ÞŽC’ûF”P]ñ¬úó ¸\·ý!«o?í'¼þI9^&X…ÏŠ‚ü ºšØáþ ¿–:-e]6=ƒ¦"îÞ+&‡~§¹!"ó…lee~@Åê{ï ´õ¨½sÐ MT+¼’9>Œ/ÖÉÚOø*¶hëŠïœÉç]’m ÷²­1rDyF„hE  Ø-Ñϸé|Á*<¿8@½™ämHqÿÌX¸©#IÙ-Ûh¼6[qþ8?–°ó/UšÖ>ºzk- ›èã´F¶‚ Ô¡¸ô£šC#×ÖrÐ"vËs7á¾ngIXj “Ï‚Câ¤S0s5AÆæ È;ÃvÄbÅÁHd¬þް]sÁR Ôv­á5L}%m*}WÑÒµºÁŽÆä¨n„ªôpåàÿÝÙü­§­ûôKÛHý†Ì÷$óFº‰BÍÜF~‚]Öm>DNŸÏ>$4¤DBéokHñ2q¾….<‚ðTò£ã­¼þE…ÎŽïó˜:=Pf`¶ÜÕþ#”rx~gÒ¤ ¹˜ÝƒÉû)zÁ×6¸¬ÖY>¡y6’¤¨ÒGÿ^]Ò2SÏ@Ð^ÇJù‘Î}1à´2õQµöÝþ± ›;¸…ä¢Û@>:³T8q\’`€¦af^^¿J0r ~×xº84èŠ%t½ERNÓ}Ô¥dààžEØÝãƒT¶s%«ÕûÐ+°þ0~¥še¬aŒiפ?•ŸŠ“Àd „Lœ\ ÛüQ4×¢k‰ýñ‘’‡ñ¸9 ßÊÈÉaá4ôàØZÿšMS#¯N¦«™ç:àÆý4ü;ÍZÒ:òÌ þ‘l£–HK?<‹d¼UÂ6Ù¦ê¶ ïìÂ[ÜÞ‘u™Ñ3\®rè˜f®ûS »ž{ïÜ1¥r©š÷ó)î´í™è:êqÂÖôÊ=’ˆæÏhx–&Qšú±ÌF@mÀXáN)éÉ®%ÔpêšÂ ÏþÇ➃zd=‘ª1éí¸ã¿ø0Âbͦƒ¾e.nx¹Œ¯ˆZŠ $4 x­(„-Cÿð´/íÌ 7¯¬ÈíA¤‰îÄ¿÷^™¤ß„Lo—ó‹ëØ^b-åEϳq5D̤ˆس";1’V© îòÎs·‰Ë—e¤é½í°òZÖ¾AXþM SÛR4!Ö© 2ZñÓÐŒoù@ðÄÚÛÎ;El¶Æ˜¥ ŸˆvCƒJqŒ9DBXì@j ´$޲Ì0]!£b)rƒ$›öI–®x 0c‚s%|ÄÎ;Ûqx§¦Àƒp¿^y)ghj6ù™¥ ²/çŸ*¡èŒ~§^é2ÿ"chÓž×QAOLx¿§Û6„¤)38 ƒbÛȸmÆÕ©ühR°¡ïn;ë[ex€VØËsŸvQ“‹;¨p³À{)}*OÂé¦Î¥®`¥Ü±Œ\ \¢=ˆ^Eñӭпr»+  ()¬#’Ò {,5¼öÙ"ØÁ$\ÚÉz€â ¾””>™uß nVøG =©”ô´7,ÀÊV8QªJèîülûÏÒU–«=òk¶uo~&€&ƒÞ0^=¬©’¥¼-bÃT<Ø3Œh_~;¹ ÎÜ$©›Þ=ÓAÙUû¹ÁðâÖpG`2°þçŠlÝ}_¿Þ!u"gø ´‹˜ƒ”sRð:iüëè¼Ó¢;ý,M é»l“×Ä0œֹ€6%`µ&FCRË.« ùìÇÜeèhëÚŠÆœ%>:*§p0}c‰‚Bëu²?øJÕŠ4þSci ;”qZÓ“_à­ODCQ%Úí¬«§ œà¨GG{W‰¥†øÔíÆz­áN=†kn9AÝnæ›¶¾}ŽŒ:æsþ¨©UÒ')‰‡Î>W;HŸŽtŒ6n¤xʯ|m«sÐË›/Œ@îDáÇý|'7í ÄXÒ÷Úp VÅbgWr©Ê ð‚.}ËbJ†]ƒÙÃ7JʃËs Wú5ð̲`ЇwZj¯ÔÞ‚›ÃÈ›xGD#Á} (²tóÔIÌåe‘+–6ߥ¤´{qøéÑ=sá„W©)ˆ».ϱj¦«ÛŒ–£ë””š†üç߈È0Ð ºª¦pôtç ç~oô9:¨®‡yÚ{«—›¤{ ½¯$òçQpBÒʇÄH¦Ò¸Ô7¦Àþ«ÂëüS‹Ï,É"VÓ,Ê_ÀMŸÕ1ù~œìÊᩎ‘ÑÌFø4º<.ÕürWd#¬Nï@›ð["õq•¹ºl±»‹¼ hD«*Â<Üeæ°ñxöU¸q6;}Ýý”+õ»Žº‰ `ga^†¢¼þ1Ç1äø}ˆMÀÁÌ6_§Â ã¶ËœîÓ)‘6OF~á¤a¶‰ºûá؃Ì{Ù¾eð‚.!"¹y×=ÈÖ>A8~»Ó;iö—±í©ºÙtØ6OSÇ —i°u‚Á!¢7®þ´2ÊÅQP¼7úO»=4Û." j<ÈS]ö­ù½çAÀ\µ5fäë^_Ý Býßmƒ­@û'Rló63 ðæwï$ìã·=ô‹LL½†qÏÇßQËyÑß|yöa?š§ëuòb˜›ç¼gÚaö¿õƇã&r•Dïúvÿa¹¤d~XZbwbÒÃm”ÇûŸ#ás°£x§Vx×eíü4¦ ¹`X›Xÿ¾ÄK¸¥á.™Á?ÿÛ™mSÏ÷†ï\çMº‡­/9Ô¿üÄã´¥†Lþô/Г‹âü¤=lEÙ¦²Ù˜§0V<·¸z…Ƴ¡ß[–fhz /ã!¸Ê^TïvRÌ`ká8X`Å]¨B%4ŸËðM­Q8uЙ–åƒA¶Hkß^t ×â@ È,˨ -ô˜Y£0øëËUæ"‚J6ìÒUщÙé‘Â[{ð¥æíJ5ŒÃÖÈDÅN°ÓáŸí m,àÀÂl8Ðu¾m9V‰áºYÙ‘=xnÓ—[µa…1‘{Q‚ÖÂ8›¶£kd`¨”ÈWÊ}{ö®¾[ø÷s&ïéæ2Î`¾7kw‹Þƒm…ý÷ÔÄ”úèËqø*_ºß/6X›¤_ì̪ @ñÉÝÑí媟0¹ù>•ÍŒ/„¿Ycù®Ÿ š–;ÐA«¡·LäôôUEÅ™,æ•wz}‘¦/î9·â ND¦¥³bw.ñ½’eEó}ð»Nç…T–£Üˆ4Dûåγ¾¦hÙ]jÑh(I×¥‡ã'4ÁOÌÓt*µvK@åÚ üAp?våJ×*°?¢Þá÷‰ä+bÕ±¢?xæô?€ì|h"?7Áz7”}ƒ ˜ü›kAë;¤øaÐNJg¯¤;· bËíÜa¹CÁyÄã­¦ÞIuê¹)BÚÈPïaÞí³ 6ãøf–s”d£ÝŽYÁq4ëu‚KG{øsêÉórtoÑѪM!Ât/Õ}ˆ¸:Wå>ŒjK߇zGA&ă‚«m"3í¼ Íµð2Îî~º' Tå]xÂðß³dÒ¿µ©ÍÇXd½fÞªt%¤º\¢€;\b½±…èn²ý1(ˆ/ÑT€¬ZqÜ¥ôU.¡Q5CÃ,†Á @Ÿöct€V,û?b0î>Ãéëá˜x~­(þ5è™¶ÿ% Ñ(œMx€~Â…t<\…ŠÃæííÚ?~7dIüE Ñ–TæÃod¼y5 ç«Nð¬Ãa@7€V+ô‹½ã/EÐðÁã*Ô`|Õ:È!âvÌB”#pyü°Ô¤O/‘Fz¨Ã‹Mù9§ÌÝõ×4¤nM&V±Z ÑÆ·f3d2øá0žâ-´Ýâí0tèê jú8$ãݲӔG3då€O‘û]qùç,ú-f’Rs›lRgly+PLÊàÿ‰%UñÖö-DBÄ|¼º8±ÓÏÁ1PPØüßwxe&¹*ÐÐQu"j\¯…±[²;C?ã¬Ú`3d:bÝ^ '*ïÅ$†ƒ¶™š.מ"ÆÊxÚvÕÍK äv•އE¯X‘.qÂØ²vRèù‡t¿KÔH¬)ïÄq<{]òŒÅª(X¨>‘o ­nˆ…cîl {°aäWÎÈü4†ƒ…ÈUeý¥¨¬žó¤ZÓÌ9•Ue³„¢¢¬ŽFü€sY}Ž_¿ü Úã†Àùð <âÄnC@Ê+ÊêA/(k¶ßXÛA£,¾h˜ø6ÿ< n–Õ6Þ®…±¬}Šïb6¾$ 5ûe6´~ðèÞqÇ .µµí­&1öŸl°ëûèSIýµ¥G3¹¢4KÞSa ??ÂÈÈà.IÇ’Ç÷i™a!gO@Cþ¼Ã›÷BòÀ]ÿ¸fd«tr…5+V/Znvq©^õŒ5 þ«a±ÂíÞ®YhjØêçiGƒQ§Ü °;\Å ×]ž‘cú8ã3Ч ,ërÇ4›¤0 ›œOÞ&b Q «'¡wŒžY)»(JðFÎ[ßy-Z˜‡@×/h7ë`„’œru¶a¸Ê5߬2Ûš³ÉY©m v°»·c½òžm—€ ;vm{k[ Ñ8¨·Ã>$l×Ü]ÎÍ‘䀘UN†•¡$è7=0˜xƒÔΫÃH}ÐÃg€4§BêÀú­cW—$NC#c¨‘k¶>µ2Ü»­ÏRL'dÕw¼Mlæ=(fQ4¶N£Û7d²€7v áû/;ßøeýA(“^‹ô~:°N@ÿGðyÎ_ÁÞkËw¶ä B<€ßPšß…º4beÛü&¼ÂWÅïQC•—÷Y Í”µºnhqÿ ¦úÒ+9ð2ÁWÆý«¯q„[?\Ί½íd‰0#E Ùêg àd[†³pÝãÊZž¬R5Bûæh2ÙB0¸¾1›X·µÏ¦}jed †CéÄ@0ñòÙ./"ÊÆç†“ÓÀ=ç¬M›4—{“Ã(ÑéšM¥ã„°•Y=Ó=´ÈX—1-A¡hWBÍU¥ÒG¤©ÓÊ"Æ$ ÕgÜ‹&E‚´ÁÈ»}ÓÀ à5­Î§š€(úIYTó1ûw½hÍÝ)[ÕܪE+wÆ×zyu§ MˆÓ¬’QhGŠ%)ó˜ÊfAª$‘š‹0·Âì’äÞ£ é2÷-’¿’øk¿ È\Î35€½ŸÞŠ·°èô€ˆÞŶ«f²Û ›K¸Ý¾Q}¤”¸P5#€%%v—ˆŽ‘B€êépP‰´Mß]0ìzðþA´³RXô“RëœîÇÿ¤28éÁ·í‚ø¸Þࢂr.yûÚÓÚ”ouˆvÔ*¤dô´Õ¦ûíá«K„3MM3.ÄðÕdEâÆ â³& <™ªv yå÷<ûå&koh,x ©´€«ãL^Û¬!@›£Âv7þ¶vx&©Qóp¡KSüŠA³7õ³ãº²¨yðCX5ÄÍZ»œœRí–]ûªü«†«ñfëQ¤DlÒé<^Ñ ú•œìý û+^ÜkíÃàŒz¥Èþ VP0=ÉÈÓøï`>Ù4yÄ÷zqXjSmØ‚t¥I'ˆù3Góµè]Á%GÄ`1½"†=Ý]X#|—ºÝ/óÜW²‚­ce·S·l·Å A>ôºN ª7Ê{Ÿº¯bÈøþQ:í¬†_`”wöΫ†)÷m3Mâ‘âú¹žòlÖ0`ÄÏŽO'ªjƒM©¹«Sæ˜OwÚÝýߣÉÂ`3¿µù?ÆèÁãÙ ë#pC®äQó·$0Û:RöÙ Äu LŒ¬ø¥ y :f¡óí¢À¬<]ÿ;ªQ<õ†Qw3ˆåA®lï\g+6Üýj%îêâ·ÏÆD‰F³ fj[5îýP;.qÖ½÷ìC!o<6u}’ÜfØ D%wóè£ÔêèXöKš•H^ïÚÁÁ¸ÛGaß–îS$J 3÷ßHÑ(pN}k<›°©&˜ÄÊ#Úà,)áænS±NŸŒ—!cŸòM°u±CSdÀ2âÄ ‹òì<¡Ø{§Qixzö†3Íx;JU *ãê†J(€"…÷ò8Œú*8S\ ãX>£9„ô=ì¿A§I6âóRúnÑÜØã´´Tœ²%ÚíÄZŽ«ª“P¥Ââ_ŸíîgBµ+´ã"™,Œ‹e^[ÿd.°Z Sa|Þl8è_dLä(v8üUðàïúJaß5ˆ—9æ6Ùº;ÚoY5‚qä¿«t³Ê¦R|ÊbNLÐéóW¦‰–!T!Šr“k\âýýçvñyTçÉ®þ C$we0í¦,jÒ²ð™lzO_¡MZ§ñ N¯·asApÚc/ÜW âÜ#‚{C$¢Hlduj€zGŒûù b[°±ïr¤@½ü_Üt“Ý)^…S† ÂÑÿd`ý'¢ #*ο­k4”[{RVC׃ƥĂ8«r±°Ô9¹zÎé1î5\ÅþhÕæÆÈ—Žs“pd/Ï0‘1®]Jr£Åúø›°R ¿îÚ ƒå´‹§ ¼¤qaãÕÏSˆAÇÜ$I÷»Õ}„~¦4PFWÉÀ3ƒRÍUµ~sé¤/¡§ÐKY-y08Ñ?ß0ûyåÎ]k(?AÖYî [¯F%|ïS¤^Kø©ÓªAôøYZÐ! 5ëÑc ¼ú·òü³#í.¦žÜ EG;«Þb9=Áùˆ@}Á ÉÑÓ÷Ù9’Á´â™MÏóW^å1Òõ#tEC,a ÝTwkéÎBŸ&6,£íûÙXŠñ‹Bk–¨¸Ûá—¤¼¼·Ba­Øõ(xy=fnIe·|Øz¦7´e7™ŒÌŽʸ¯Ó]”; ¨ÆÙF«´èÚÀõníå2Sô;â"×ëíSq'Uþ!#ƒ"èØà?ü"Îj AÆã=q”dÇ>D螉¥?q˜\f,3¡âGÀ- ïÅþB˜8‹“ª ñ3t:2Þ¼ÃÌì|ù ±N®.„dG߬H é=Ï„ @ ½KšsT"©?+t•)"x.V¸)[Å,p߯yH„9 c™Þ¸b;§‚WÓ¿wŒ1*[{®sò†«1±d9M{„o–¢æëß¹½i¢tSù;êÓÜàäzb¨Š÷†Ùy´UMø"B̈6 ÚUVÖÄw´¬7ÄþâpÀLˆ€‘×ršýiJ6 â`âÖƒ˜ ‹«¼ …Û|¼(4ÛF›âSÙ–Ä&¶KJL51„ì¸3 Ή›¶S (Thg¾Rú2Ö»ÿ ¼ÎZZtÚ~iî:8fÖjd¯?yc¾„°ŠÚw+T'vÌÏÚv /=wßjºjóS”{æIF¡ä|‹{£³di·6+ Œ‰M|Oðnü{p^Nä@èÕ ÷Yyïálü:ÊjÍ¥E/'›¦Cï9~5=AQô‹ƺ(]Xréâ"I•7îŶ!!·o¹ê7Ê/[Vbä~…—¤/CùJØ0Ž‘èC£¦wÄùR:Å™ÿ&±¼¨ã~çp©wçD8>ÓÙhf¿@—û¬Ÿã| 5¼Â\ÃO@@q‡Ó¹ÜG²›/“¤ ëîyâçüè—ÝÅ/yç2Å?Í-*† /A1Nì¬x)÷8š‰ÉÞÊ´,7gÀð©µ!íKùÊËB9‰r]Z+©eÃaô^º9tî" ­þ¾_â¹åkm5½A³ÜüHÅ\µŒíYâ’s5[ýʸ¶ÿг&&5oá1¬<—K5ÅŽÿŠÐÎ.ŸB—6Hxïv Ýž79¶pD¦lšÔ Åèj31Ì@Q™„B—ˆóÍÆL*?&=ÿ_ïº+÷giPAAž;-Áp×# ¦—ÐfÁ¿d2ñz µ–KÚKBä<ÎøWÈU®¾ÛH¾W”îǰWµÉ·ø¯ß¡ú§rnƒxV©c£S¿Ôž©Ÿš)Í Ý/—:'hñ“#wÛáe#7ÕPörmA}/ÄLç O$ ¨®—Ì ¶œçÚx @Ìó:æð†¦ð°èõ&íSg®!Kª>AÂD×3&€8ýHÜ:î”=»•OE•Ètv˜þ!xb™l',î@›=@_J?Ìwt˜1e,ÕYöëÄçß¼Šë‰ †„0¥:ð`ÄÈÄ*N`|«64·Ü™§¦J7 Н®àœÑóæ‡ýövª.Tѹ‘ ï ;î[÷ OŒ\8˜°ëôIÿ*UŽzÃ}*…#fc~ÉŒÄbÐÀè„z‡Ü€£³­ovüJ™a×¥bG jgÒÒ¢k¬Ä(¼¸ª›·Ö›æÈ?j9DÇZ`ºÁ.Ãi?+êa*\‘q öD{¸hXQÞõÉ.C “³ðW/~Ò"¤ Ñ”Gò+b°|´n­NÚaÒHä}ª)-Õ“6ÓÙðοû_à¨t€÷øUñÅu¡¦òºÜÀiq£N Ÿ^d%è½!œnÇdHükÖÑñ‹4ÅLôäeºÏÓÿqp²òA}¿ ¥"­éAC,DXž>ÐÔ†q½J±ÇèÌnS䱨ü+’ÔÛ¸嶘z€…«{¾Û ¸¾é³ñz£·Úý+{º7Ù[áTFf]6±F\ƒØlSù÷½d³žw"-W–)L¼÷柨áÔ`ÊÓ¢šÅÎ/wP¼¼çZ9ûÖî$zô´Æï|wehoùž"puÒ?€QÆn„²<ÊË•ÇÂã*³f.Æyåųž5æ‡%SÃËrìüŠÑ]ÉPæ0½Í™‰÷+¤ÜHÐ.¯Zž×ˆ'7B€¸ Sð"Ö"ê"œÐS€ÛŠ˜ê¯‚f`{ÒùêzHYn$H‹’¨Ä ËkÁ¼ÝÞ0;ç„ uZf™$f¿_|¼Pä§Ö-aÁHhý¤â“}À!f˜<æS –eÓZq²úJGN~³§¦§^}-¿öØÃÒ îô oÓ1<%3ëáIKye¤5CÞæï6‰ZrR³Ôv‘W3k'ØL[¹”Á7RÊ}º­¢UB*„ù®‹ÁiXH²¾;‡*檄í¼Ù­>ý½‹–L›ñ ªÄ†¹ü+óO—¢}‡Cß_ ßO¡bäÝú õL \ÅÅ5WÓã•î ·*[Õ¶~¹\dÖ¼L²ýbB°ÆOÏâÃÏ*!ÌÌW˜ÝIÞ‹g þIå“.ö/'˜¯u÷×ö^0Qœ7Te`p>…øˆÕ ,}ë;¯ž+1\à/H¸´“U”b›ŠDa߃C¼¸¢ÁxK<ùÌc8…°´¨ÔÀÑÛÕ—Sž=h=—ÊN†ãPKÂ)¶8\*’%›–ÿá  [Ôæ¡h·Üõ­à`íêp-÷»r2"º9à·÷àa/k}]>¥_üø¨LÏ7Ú¿¶þ¦Ú6ad ˜ùÝ߀[L) šF¿ ½‰oÅW”Z šÕ±ãvlòþ;¿y»?¯L¸ëÞû×7}é»4ÀÁøÂx4~akËîó×$&˜=6nϳåß1xo–‹ÖÈ“‚t8¨ü?–H8¦—ò¿z˜žðæ8M¿§×«;s&hØ…ÔÍï’ñøN˜' K¨­oIàÂlŠ˜1 9 Ó˸ý,ƒ,kú"a5 VˆôÇGë[³€ÆßŠÙÖz®Dôo¤«cšÛ=£ x Y‹«M¸A·Ý#ײŀpxü©úþôFLqN'¾«dÿ®!*‡«GúŒ‘Ú÷É ²Ú°òG<„f/ʆ¦ Èïßù²šin.ûCM<ÆÃ©NÍ-0ÍkNK6IÉðÜ·ÿ»ÙÄ!« æóÜx¯Æé¦¹h¨!EU «´OHFì%vj,²gÉøö÷ÿÔ±’Å«pÔÅ*5ë`ù¡iöK˜3u*§ÛšZ#)ÿµâÑ0=õ¯l;£ºvÑ5€9õRKì$ÃÍ }Y.å..À PéTJ5öÛj(,2EXÿ´v7<Ö-Î!x—ö"{ªzFÅÿ'gæÓ¥C˜üÒmþÂy†ºE\µ‡Ê.‡j@+`$—T × ÛO(YΉ‡<Ñ—ä‚Uœ\¡5}aJkk)gë«å2žýçàèû’”æ‚.ÀªÆ:öq„mrÙ÷Çü´¬Æ›qkÑ1«šÇúÅÀ2~û Ô˵Ü{ÊTPùP‚–¢ùjÓÏÞѪ†­8‘е9XŽ 'ÜÊp>ül¬¥«Þ¦(øyi2GI?qÎvÆP‹Ë™&4ͬ¸)FØn‚«Úè*fŸ¿©5ËpJC @>)ò‘}‘FV鵓¾ÇD/~i^›¯5^¸”áÆš9B›Ô77W’«ýÓvÅ)CÎ4êçe)³§ím_Á«‘ôIiýÙvßšo‘A9tô÷‡¸ wÑBEíkßî´©Âå#/4§ÃˆÖIð¾Ùuñ³b3,)õ~ë¬å]M¹¤¦;†ÂŸ°ÑóÔÜ~cZ&ì©êÕ8nƒÉId¬‰T®‹]çϿߟŸcv:4¸•uI u5{Œ+  À\±lä ¾¦lQðê=äC=îÒ5œ ž”¼a` *âXAV*& ¢*}˜Ü4å.ü%¡´c>îã–ò‘_·’Cz¬Ó×î/NÁðð"EŸ^¶wKà²zÕ„ßñ–ž§àüÁKW‰,4è>àMÄ­åߟ~NýÓ†Xr÷5]^Ð9·XÑò•+ð܉]Tk•ïÍ › ž¥ÐM‡¿Riõ_ ¨vpe¬o*åÅï·âulB}«Kà›Ð‚ G¶ôj/&ûÿ[³[Ž‘$^ÁmQ0ÞIO^aDÅ ÂH)·íYLwwà¡ýá±ÙìÅ´÷eh ú‡ßaÞ6ˆSNÿÉ`ã¤Ê-1Ÿd‚Ê2‚Ý^‹:)ëM°Íc Úˆ­ZIRªâíºª÷ÅžF#Â3J4š ÊimŸ$¶‹q $w—u‡WS;(ŠU5·`Á~X‡”ZŒ*̆±&yÊa¶§½Qh»=é_úWÕl’7‚ñK,KzÅ5^–²A|™Uì5>y|¶¹¢Yûõe\«~VPÏ%[ÿ‰)ö¸ÅÁ7›œGÆ ÈooËçû5¿ŠÈìØó‘4³ –!ù™ea©IýÖŠ¨Zý(ÌmÛ<Ðó^ìaº=‡bµD˜¹ t.e•:KúÎt%†Õ)(1TÙ\œ£ö×8_n»ÛךB)àd±˜ZÉíð¹°¬›pÌ’žÊ ?·Ã£`0:?ðŒj_Á‘’t—s‘ ¼¼¼ƒIYˆ±÷æZÓcxˆ¨×ävd|pP£¯w™a‡oÒZh²ž"˜ãòX#`=¤]/ì#VQªŠ_7f=щM‹—è22£Å +P q«Í ¾ –RSeŒΣm¥þ­Ó¨ÞMqTâUöƒ^A®»Q—v7íÅyÀÀ§ê&¯øýfŸûw !™UR"·ø!Oaª®,B^ˆ)è²—"îÏ0"s¸‰„Çõ³y‡4å¡olS*8«bÎ,,ÜkÊE…ÊÇ`\te­Òª½Õû\êR{›^½DF€ÎIèXÚnÁ%{e¡K´Ë`g•J4£½”òba•íÖMgèp`“50Ü>¥±øöÉÐèóèܲ€¹‰ ÌI2šù$¼¸ÐÒfãDêæ ØŸ¿Ãˆ„Ïa…Û^z”,.\‡dJÁÏÓ°ƒô5ÁÜ@ %e¦È᪩Sw“•ó¦&Mvq éñ5V/c§q€áŸ4Mø'œFß„¢a»‡ˆ€â³À{„4`¢Ú¹o•:9ÙØ¤ ÖgÆŽÄ­ ¥ŠmÚ™‰AsIÞûNƒ¡m4aS‰â$Áa‹W„Äôb{sf²g‡Ÿƽ€Œ-c\+—F×r8aUu1tXúR_ æÆÉ ,WJ£–ã¤[¯¼Ý€}Ùór‰ Ÿ@ØtŸ!ÑVAbŠõ0FÃ|W1Æ!jU‰åQ¹KbÂNå4ócò ÓŠnYÓ6Ÿœcw¾)1Rd/Ò'gÅ&Ð*•Ÿ %(¿¦š5e µUÉ¿cF“Ý.ØLóT s¶ï )øXVcÓû¨±˜Ehä¨{"/kFeϑ٧oGH£ëSºà@9Äw³^Õ϶c(FŒìeÌ·§LÉ¥ ‚šnøR'†(h1Q ìÁ†²ff+«VVX?ƒs"ª£ªë‹9Í@0 ˜ ZiNYùY¦Âê,_o¬ìê¸åÔíÏÓ(ñšd»˜BϦ9@ÃsS8R°ß‡VA×Ú„%¹(JÑ™q‰†ÓoC°]UŽØ®i ™“9Â^¶Š¡&pn–P±ÇäžA¢M §Té§V¨X{“î¬]CÏѹëqbôÖY¶ ¾þ伄sîo摟,üÙô²éM¯)óÕúw&V_Z–É€1^þ»ÇªÏIßèÕT‘õñÎ èXu*¨{Ð} h~'0p׫DA±z]k ã9ch²Ú«OïáÅ@™G¢&gËçV¹GÚמÕàpëAdV7fýAo¨“>fÕ(Šßró¯ºtpüò͘+¿Ñ’ú÷·‹ÄØ[kà^ßÜ‹ÇRoäÓów5¾ Æ^ŒP–cRmKn¨Ì¢ß/ä<|5×¶TXÅ.{á(;‹.Ô%Bc,”ë{¾™§¤Æm¥©l³_#uRŰ›™èŠßÊ@[Ç­©êÄžø±G‡°>q£2kð ô¢/<,’Â"ïvr®)tøD+^ôB¸û0þÝ_OüG’¹áhvMç½)ù5gnYÙà…R«í\šÚ&•.;»°ÆÚ³Êpél¸¸ý5rRi2(¼1’î))ÃÜMœOC–Y#Q…b Ëð#KèÇŒ5ëå¶óßküÇœû>e‹iË›6KMn¬«¶ŠþR˜t¯Kxü¹gó~õÝQ[v°ƒñG“šžîw¿šT}VGåB…b³4©;‡ZÇaÓ¼ë æ6iÍ÷ú®eÓo‹üf4Xb~ K“ÅÃÎè m7gê©È²‹Ü›}LÚBD..™P ËÆƒ³†ÆK%ýÈV„ô;ä)‚f=©µíþhS²OÉŽØ  võ˜O*/SÍBÀ4 BĆ ÷¦bi¾þ¡8A¯Ì¶=M­ÙóÂȪ4O³àRûø6£Ð¼×;Dë+Uø»Tî… Ø«¢ äm[7JA±•Ë`ßÚdÄåGÄ%GƸÁú}™ `¶‹ÅsäÆžÒÄVRB˜ŒK+ʪEß29-ƒ!&µ•!.Žëdþ—8ͦ2ñ1ÒŽ#/Nò‡Aúµ/„àðâ]: ›:c;TkB}aвà V•Ñ“=±:ÝÞÑMt¯$Ö26st,ãù) ÞH»±Ï|¦#¼˜x^3Ðáú:¼•u?Py¼:G*“é«ÝÅèy¡Uù¦¡Ž¦Û´Abu1ÙkóÑ@HeSIK)~ÐD453™ã  ;GÓÙ›Ù»¹h¬„ŸЗOB–ÐÎÁSºÞî¨g™ê eû¢ÔQ£á-ýœ„K!I°|ØÙp„v1H—2äKƒ«ÐTÜû¨JÈçwpÇgZÍøöëƒèû‡ú2ºèXÏ8¯m &ÿÈÁ«£ÄkÈlO_Äu>9ûL’ÐÇöƒlÅPr“ ]–fÇ9O§qžþ›˜ÛùCçIĽËf†°ÿdt¦¼Þ–úï ¸Ü’™C¶ò]Ì;NÍà"3ÍÉÑžÅ÷JJkˆ‘G ¼O ÃÊRau~L»Q<š¬™û(5z-ËKïãŸvOrs)¤ ñˆyÈý4ªÖÞ@q‡#`¼…‚Ò!?3 àZ²ÛWn_¹Ó¶3žá ‚ÏyßÖ­Ý?|}õCO_8¦sF“~wDȧ¼ÈYöôÜÿá ±Ôä˜èðôK(^&‹Õ%as@8W]/TghÖÑ»ˆ¢õú̵üÐßÕ»³:S±T´E+“1e³ Óö2S½í ]†>Ré_¬ÿ%Ü4ŸÛ³ou¼ä0G=øÜrˆ®ôo»Dâz7¬45H±{µ¡¢}Kšúº‚Û‡ëÏKhƒâÞä‰x³PÿÀ+«‡HèÇ„.ÒÛ`(å¶ÑÁî’Ù)éÐÿEü”îÐR\ÐOºp0pnаÇ&¼¨˜ñÐüñ½¨´è–šAÕu¹«Í`æ{ÄÞU ²9^&¿(=&vÙ C ’>­Kµ›drP̱×§L]<2ô—:j®óÙ¦$¬Ã† $¤ãž@kÇ« ;BP†S°9%3¥+£/Ël‰ê,ׄ@êgÈ3Í£» &wh:SÔòkÔ²é&¸ðZôÀíT²*cÇOÄÈ3J,Q?*:KTb ãû?e)'íî–{L&2 –Z„ªÌï掌|׉÷Ô±7E·ŠŸû…b_[ä¦ÿ+t4¯ÈdM¼|ýM °[0mg;ÛMßïÎ maæ{Ò?§y¼°þO¦]ÌË*‡ì‹zžìkn‡4YQÁl·_7ü›PW_éd(ï¸Üç #ÚÈ6(2%<š‡<˜5ƒ–éf—ÊÈqõ9Åôêõ'z6’NÍÝ@e&>!ÕÊIæ›U†ÛU:íÀß|òs:•]ÿܦVì{Uì¥ÞÖ^@ü>øÅuíEaÿ’Æ@0þŠ%Æ$eøU¡ÄºGÒ—Ë-Üÿd Œbµ®b)‘ëN.·~Hö™Í1ÕyN«wÅ{¥Ò‡Ìq"ûËX3 &Go–¡½Ë˜Væ£Pöl·Cßn°.N }¸’àG¼7º³-¼lD „5ÛcuÙÿuó0û‹¸ÙÛ½Åhzù³Ñ̓+Û½·¶Ú6vKšáR4ÿuq¿¬1±³ðËq˜¶áo‚oç²ëìô •ÉÌö`}®¿7ã[y1o“WÌWÁÓUGîîWqýŽTóÖ<àŒŠšü4É8$ ßK'n‰9gµ.§:Dz*ýÌ& ñníÁ‘?Iš©Ê¢úðqÜ8ËÇÒ`º‹ á7¦ 9RQ;0…ÐÈêÌFñ„d­ú¥;^WÜj“g{»;xŸÚ­€’;"ãÃL½æp1Â$Q¾Dõ£Úb*}m‘¯\k€](åЙ"æ¯$’Ý·‰þÖ¸À IÉ£™Wº—aìÿ¢!„—]þ_ "t¼J,rŒ\ƒ‰±´ ŠCÑùˆ±ˆ»[ßůòÙÍõ8’ ä»ôÖ/Ý*U÷³ÓczÒW;ÝQ/ÎãGφ¶OîᢧcŸéO†>iŸ•Ý`½€"ìXìåûììY.¯‡¥t 䨧Ó[@Ýk°z“Îó³ÁÂ˾½é4›‰-Òî˜Àg·”òðâZô,‹F˜·Q!-±{ðyÄb¦þ߀çqp’;ùèi™éR™5i$~à F R ñ’1,ÕiS/eñ/‰Ž1öü™j348ƒGÄ™/PÜÕúîYõ¥ ´|?ì²O ~è<ýg1¬—U]‰ÈOŽä1Sƒ™Çm]"fFKDî§”WŽÙÕ*ZF9ÊEmé;é7å3‘×sÈ)Û‘„ 7ÍûÜÞ׬ü,'[ÕJÐ_yÎÏ ,WÕgJ]Óä… xþ¹;»yˆuí“]ÈZ€ù¯FøÁ³âãÏ´ê@–œ+ãÛûs;½T_ÊŽ®6)D´1¬Â€gF¹|q;êiÌ©ñBî”zΉú„ÀYw1*îÙéj¦‚ßUmH›šo&MnäÒåÿ±1ãA1úD ûQ'箂Рý³l IÆÑ^ œgx‘Hó$ð î%¯é·]Ÿ¶u)BÊ:ÁµÄæpɼÁþú]ÌÒßÞÂרÚ3jÜ·v62~Õ§ùxòQßù\¶L1SßGXÉõíE‚+»´Áï_*óQ¼G¹yX „ºÉÛ Éξ ·©hœý‚&£¸k®7Nü G"6ÇU¢àeýHŽl¥Ñ_Ÿé«nØíÇœ\7½ÛÀÜ ŠÑ¾~FºÁÑ‚<°î=!Dl½~qDTÕëÍŸ¾“î) áDPpQ<›å9ƒ=åùô¹RB‚~ÎåŸÊºQœ.ÒàºV™¡JæÝ¸¶Ê$%ð>ꆗ+ÓóÎ)#%ßf<¡àô¸®»)ð›6”âó¡ßŽ/ÁNÄœfŠ%›044o+¼o^ˆ9»tÑ㿌Ƚ˜N˯RÍ©€ «ã>å"¼þî./F9Iœ ]­ T£¤©ÎÆV»A36-ŒþÅG¨Ž”î˜ÎQ,ÈhR¹±™ÃO ­_:ÌHeÁ~¿ê®øÛáþÈ’¤¶)Òjg¤æÙ·Žê5Zí·@àâ·™/y”6 ~ƒu>Õ"‹õÙuáÓ§vö?ÿ&‘žw®$ܸô >̯Õ_„°;B¢W!ೋ#Rplvµ!ÿ³MÍgèÇdvË>ÞwØ%kºNµâB¤& `}ð“{-›üdjd)…ª”èÈ÷Íå¹¶s€;îÂ@²v"…âP{”¸‚× àUÂö´GËbý–4±jKíVð³š;:¸¾©vÕDXRyáõí@[XF¾¦ê¨(¿t¨'¿\Ê4úÖÓ«‰â·²ÊÂêû£@hŽø@|ù¶ø‚µšÏbɽËÇ^.™´òj Qû*­¹µšÞt]HKÞ«%ãŒQ÷ôôÐÿ“& 5ÜÞúCâË[€Ž u/‘f’±,Ûõ(ÿ:ãôໞr$º1t` …ão/BáoæÍF!,‹c6Dè1€†ØCñHvÃãZ–\ebªõk™n:x5Áâ»Uˆhl%·SÕ!õ{°”³u‰Ô38€ítGãfÑ»ô°2Íàâýfë3Ò{k±£zeOͨ} g²Á[ÅÅF~4‘C÷ú:×GêúêvØû‘t—¸ eK³L¶ë”jfŠ¢v´¬$„kFþl_0MJ¤ÜDPöbMÂ੃PFÃŽLç¶¡H ‡MÐ×/¤)‰þ\îúº? ,+ÓÖÊZ¡€Y¬ªd9— J±'$—‰šb–ŒD­8¨løù®Ø¦18@Jó雲Ê×`4Šªô*G“Ó‘,¨Dé 詯ˆ«îÆ‚Ç@ÑtÇÖÏÆ• zœô(îƒ Uq@õi­k5H :0´“fXýµQn?5‚gâèØþ×4šNž^3/Ö%çõèUy®u‰˜™­»Aº3¸¤Êf!CÍR'¶}î«+ÎÞEØñ3aLpõ¸ÊœOk©w Ò-EFz]æ›b¹ÅnÕFº×„0€{eõîô†‰pÃùÙɯs@…'OÌ«<³v®¬×Ëㆠlé<"OÞ+âËXÃ×;׫^Cª2¥Wõ—ñ¼‘Þ¢—äÌ ŒgÆî¥z3!µ°Q¿uæä{ó;h£>—§Z>ïOq>/1UM ЗԇiDU¿± ª9Â;nuEwôÝ-Q}‹±q3_´Ù‘¸¼D{±DªùÈ`TSoiÀÈHžÐ‰‡ƒA]ç$Ü<+O ¡3òu·¡Ó%ÕËd‡DßÄ[Â\G]Jì+6$¡…wúæW¶ÿþ$â~Dä:¸("•’ ¥&^Ôœã®í' 輟@%œI-¯NÿF{(H=?ec*¹Sõ…šÏï{ó»õ`H¸6ø×¾Ö ÆÏk•õÈ}V"?ÕcÅÅžßÜàx•[è ûÞ@XO,/ GB3$ì¯g:ÛG(ÍX$FhKm?ÜÝå™}¢¾Ù ¯ˆÂÙ1œ‰Ÿð~ؘ’Èý öÖPÕ¨ÒéÛ Ë7¯‰æÝÎ0Ú/x•)#ô¡XpbÐ}³—Õçèr]Ê^dKë¿.Iª‹”tðŸ¹Íç~ðŠÓÀ¥ü¨},‘õ7w(¶C‹š¹K¤J2IQçsþü‘[ÿZ¥T€®Öû~å6ƒ0Í´«¯OÖ&¢‰ž>oäÜK‡Q­e7)ð1AÆ^gE]êQÒìúýÂ%ïÎ,&kS„ž*Ð_“³Ï£x#öÏî/Ö—°#›Ê5¤uœTõh]pRÑJ)´½§Nh¬¤™Od‡l™ Ú`o7?øTŠ÷x ÷÷ÿ‹¡©¦h¶ÝëjY+«Ñûó;EK¢E?éâ±q¢5ìx7:üÌ7ºy$¥Z¢P°ê§üÉ$4E£ k5NSø¢XÚ+¿ÔH{I› E?î¾5@T<. Í1öÜQ…÷W”È¢Ùlˆß·qcÚêød*T-þñºå2÷˜©’áñÔΘT§lÓ_H C=™˜ú9šÑ ȧâÖoÎÝ3š9P7|½GV°Fâ6Èdµmh³ñiV¸[,á¼òüc …ûŒPtrÉ·fu?õdÈ-MË*˜bzÚ#u+ÙéÃÉnxטqK¸”â4ýCëˆ×І}fH¹a27~œ$©sˆ·~˜Z2rÒeƒ âÁÎl÷.áë„Y\bÅî@z'[À¯”B«\/¬Í·×EÃÛª‡d Á¾„݉8…srL°ÝQ€l½»<¤åz(jQ ü%¾"¢òˆà¨>ÜYI|Ùʪz)qãt6i ¬HËZ9”$ÿÀ¾2p>)¨$š†üœÐµ-Àc¹ݬz/æzÝu^ÓÅ‘|@K‡…¦roÓq¥§²ðºµYtÃiºÜ‹Œ£—™ÖÛ™;f‚´ =ºo%«hãkÄ]à‘Vž2½N퇜nÂÂÜ;ªHQëú0èýÿrú(NPha&âšJ-äcÛbcêUê_EI±lÝ}õ3€~6†vn­º¥*”V ´u2Ú=Œç·%1S†@¤L¥ÔÑ~¨»þwz—#M,ø´TÿH!s:¥Å»9 o·w^[·³á 7Âzrê?ý²Êâby«¶z7– ጥæÂDW4 ¢¬Óž«Á¡ç÷¿ÆÒkЯ9éLŽLN(EÒÓRÖ½¹ãéwz‘’EAË“;,ó)RyÈÕïíV&¤$.æFÔÏûŽaH›úa+ý•»©vb&ò¥çCÛJaÍn”oC×ÿ’ÖÕÞô­’å6Ë\¥"âPÌ×G ´ÖƆæñ yÜÒ:¯Ø>’8ËJ°Ç ]¾ï;Õ/ß‘äóK|`‰vLóÄAýÖR~0ÝLý\Ꞣú7Ø­4dØ¥æ §P,uünÖ;J=ʱš Q/šÛ%…´›²Éb}tÎðä÷YŽ2J=²)±º?‡phNžB‡voÑYZ͘Ðf€eú“!˜ô)”ÁX«£¾LÅy*ôó#=¿6™‚7onîÂåCIhäræ£já¬5-ùãC|W´D¨áÖ™õ¡·é}ÞÝí6‡Æ«pÔÂüMßÙ“ÂY#MKDDÕ»R9NÍ‘:Ù“'5~ÏÉÓè§°ØêLa-³œ¶Ãƒ Š0Ógš°Y-0 – jaàÈ ·OÁ½SÂ¥võ6Ž2üyüØ2Þtz{F°têiƒkUt2“©k¢Ò¼8U&PïÈœ ÙyíÔçî`~WØ¡~ô$(Ù¦ŽñÍ Ø=l©®FN“x•¿Ö\RûOcÕið@ Ð84:åR,Âb}ÃØÍH…Âû€zاX²SäXÀ€ðMˆ¶Öw‹™Y5=¸&ãhí®÷œ‹£äGs„˜[RûÐRJ‡QEÑrJ|д8û¼eÿä>OÕê–Nõ%ܹ’¹\¼Ö{ˆ$î·î0TPMÈÎù^ÞæwøìM#»vôä¤ñsºSÇׂ !¾Èo/‘‹[€ht°¬ ¬ÓéÉüqX#dÃáÛJî„…ú t5Ë-Ö‚ŒÂ¸èžÛ4‡½{¯QöG?ƒ¡ÇñˆÈ^‰i‘xlf‚Z…ýe&ÁÂí®­H…pÛ¡k©NýJ\¼/”£°¥˜¦,¹$]€)üWsÅ+þ…5jÓ51Ξv)æÎ,,Qô£Ï)Ôjÿ1Ž0î˜øÀ¥^í:#…5ÀsÁ´Í[–¦×<#[þÉ)¡üª?8:öBþRý·|=ª[$Ñ,˘èkËÀŸ-˜Ó› AOPS(;k=N†cž§\H€oëEHMö’ãÖTeÀ±‘¾&ØÃ ÏØñÉ¡ŸzƒŸ‚<¾ØjòÝT“xü—€±_ªÖXçÝû¨kþ˜.Ô`ë|ïEçssŒå{m7„¶5p™0ç…Jð_…ˆ±Ê &)Ý•ìÓbÃäÿáaË ¥v°‡?­fPãhh﹦Ù‹{:N7‹Y,SÜIŠ—‘çØðC@D^É—~¬"8c&AÂ[ã¯Ó÷îùÒÓ Ó2=P°©ãÞ`iE›Æà¼Œ±ÏŸ¤ÓÜ´ÙYwUÔ¥ß.Ï\§ ¿ëG>eãìaE0ø„T“u·ñ<ξ>§züÀá¿kðuÖL«eSðv÷µŸ÷Ó³AЄOÜ|­µVÏìÈ™_þðêŸk·7°—ÿÔ1Á}j0c“ ІæQTÀÀõäAfá6+jÅm´¢Ëº¿0þ¬Um`0F–}O[6~Ÿs¡qyæÁaÔ>e6ÉëÏ9N'ëvÉhž Ë÷ÅSuËÞ#¥W§e«w9ª´P ¸wô¿Ú«Âð¯G§ÔÂw¸JT•´O.'²Ç±Eñæ»éƒõòðs –޳÷ÏÞ1Þˆ7*]¨€IWP×úÂ×kGU'î9a0_Eó¾]sÊn˜º²‘(âJeŸ”\gÝÀiûI;÷³ R`œm ¡=ñjÒ3•U3H6, vúäÒ#úüÚty§¿LaÝzÏC|þѶìàfäs]\Z"UZ†4]3g.ë°£ã6ÀI`·–ÓL~†ú–qôM§%Õ„#û‰:Šª¶Œ©Íëßm/F9õë(p+í…Y/Û”„î »‰\ôÞ'˜ eÊÄ~òÀ•¬ì˜ÐT\ÿ×íþè‹ÓðvSÅ'“2µµ±”Nÿعúá ä€ð˨ùID‘øî2dˆ‡{›Ûç|%û9)D*}ac¸íÈïe$°Lƒ”«8FBY¼€¤!ï¢tF캽m¦¾‘9Kn³k©h£½A×_ +¼ Á‰ÒbS/‘=;òö¡žQÑSKæ?[°6Ö%aÙ%ˆ«¾Ú^f1ÅÛÅ;Ó(Ï“(1Á1[Í\…Š|%ð¨-j¸}äšw0á;š·ÂSµÞUW$GhÏ-#+MC„ç3ãà¹*øaò7Â’+@¾ÍˆÒŒç“ªŸè=¼Ó›|™Ç«Ò!¸8µÇ§©$ýp«ž/ CIn;ƒ:V¦u7ŸNY°DÄ´½í˜SaBk•\Š2N”ÚùÂ, ÷¸3}å‹„GU¬,ZpŒ"”¯ôuÇ\¥KJ¼‘¼Éþ”n~”Typ&âÜ‚†=K­k~ÈùóQü µš/ ©ûxC†›‹©—¡Kt¤qHžâФ‚xÉI«:OVeü$|ßÖ@Ïÿ(Ïé&Œ‹ L=£aéTD8×—În|¿.Oë2²ÙôTóä¹h{ú=󡦕ë:_réß›ÜDóiPøÍjìÃèK±Œ’œ¿ÑÖ<È40VU:³H““ä(âÔ¯Ë7 ª_©|ÁûGÓ’ÂŽ%YÈ-@–ªÉhWh)hÀ´a‹ ø­É>Ò¿«âÌ— VtÒA½§ÜñÂêo’^°¸#Úº ævbC©ÞhbWj¾@^r5žùdÏ—Ú~Ø }T1íä1gÞ£Wô×ÿ->N¯‘nöš¢O6­„€7d k71. Ë´2Ör#3 Eײuç¾7"HxŠ£tNvø¯>ŠjoI3 ö¼ØpyÈûªf×XØüjT¶Uñ®4ªM‘Þ=\Ò^ü".ç/fS1úÞ®iÎóÿ!üpc<7épæ¤ä(îvÑ´ZŽÀd<Á0ðVGˆhò™‘t¿†‚~|ŸV?­”˱ 8\S€Hä†ôËZóDãÈŒ‰Rv¸ ÷¤ãñ8U&L¶Èã¯e»ÑäÁn ŠN’ïùIKõ'Í·šw%?ygÎ÷³ âÕûq~ØÎ–‰Ñ*‹~´ø»^,°v¯Æê!®Õ÷ÊwM¬šžzŽ\Ð2¿²¤~üíå°®“3…ÞÊ5€š¦¸¾l1ÎÙWç§)ç²7׉ü ýÝâÏ»þõf‰‹gt9t-½¹'Þ˜+‚óçƒDìÒx>3½jhá šu=Uz¦‘÷“Ñ´ÝOŵ|þµzDBÂ*Ú“ T†ì‚AWÝoÔ˜ëR®6)õYñÇœ{ †µZ©ÁðC½ƒX&Tq¡HXê殈 LïØšeòÄõ«öý¯yEÇ9M*—5§§E±ÊF~¢$ò"¸f\à1e5UÞ©S¯TV¬d'p±H£¶àˆÚŽØ„*ì°ÔÚw'¸2À7>J«äWy4o4÷å3†‘¤ÕY^>“̹éÛÛø~òý¹ÁiHžwÒ4•»‚pŽœ°•m°òЬ[¥—;g[¯Oyl`h™‰óÅl)ÃÓÆ“ èNÉH(×~Dªì@¡_¾¡JŽ-­‹ç uW‡;7ÏÄjËbPR–y#ZmÜrûµ•ŽŒî+´ÖN?C¸ì·•[B±%QÙÖ»Bö<'4üýS²3X”Ùµ”•Ýj7¨§þ)`pøÕEýó±c·KÝOëÇÓe;Z‚VV‹¡ld´’ï2:I7M}îmGô‘m—%)‚y?RòñáX–lÇ!ÀŒ"adÃ)’¥K‹üµvõ:²FÕe€¥Û»Áñ}ª®èz ]0vÐd3(ÄÕ\Otçø„ªØOÉ#YÿZD¼É´ªÕ\·&U)—é/ŸÇ§W~ÄßK½O÷ÛŠïùzÁŒ(¯®ŠÉý$(óCj.=—ÕbZ.¤N‰À¡>»S[îï•öÊåbþ4c™æiñÉáËÓ.êK‡é¼Ë&Q‡Ô·üàV"­Á…Ki‘›ÈXV&N¾Yeæ ,PŒ¡¥ôîú‡sy>‡gŸnè㎲aå°Åª]#Çpþz½óKDVío_%$ΰõ÷‚=«6=žŠ†Q}GýË~³"0«1ˆ®+J#”`Q·ÂB Jâ&ßû¦òÒ1¾qí%6Æñ Ú‡ëËžÀùçP8¹?}øóÚsyÐÿP^KÒmÌÔðÒ#%ê+š6³×s^ôµµ]ólÇ„1šV Ÿ´Ëc§’Ыºšéß»|y¾§ÈéÊS™÷ñHÙm³k&µ,TÔ†A`4ý8ì_»f"²DƒºÌonÔŠ(<£C}Ñ/U$R¨triÐý„ا¬­ÓÜßiK”ð²_yÎ+(ãÕ‘tüóªüëÃF H˜ ³Zâ!„·%ò–Ÿ 76´C÷0ZY…ç½t˜9¬·Ø2V/‹ƒÅ¢ik0&¤µC}ñ"‹­b*ÁîÎÙL«ñ¦tÝb@²ÈwÝ3~ú_{ßU7.e2Ò²nNþ6¶L ß,œ‚5þÁ.t6ôq>Wó`–e™â.ùqV<‚(ÔørfÍûC[ƒñÈAì^<ôÂ8 V p²Rk7awBÓµZd¹ÇÔáÊкv¥ŠP,j1,(GÕñ6Ï™h¶X˜ä3¢p³¬®ÆŠhŸnR\Q…leÏæöˆÇú+?ðÅfÚÓ%sïòâæÌ–‡l±?d=ñ·fÓð»†xèÉŽc‹oὋx* x”ÜåAXd™¾‘!«Ð›œÑùÙv=.mÀ¦–Àg¬W5Bâ›ô"&|ø™mi{Uœ¸•¡Ö“ ê¶¿¢3Œ 竉jgDKÀÂ`â‡ð¾?²°«²èW´…¢ÚãÐt_3ö&¼¢u:µ“Ëm˜ÀwäÂÒÓ73}ÞÊ ]³¨’ÄæÜ €AI¾`EŒˆi&\’!øZä¾@ž®]íÓsüóxEM‹¨¨BTZ[%ˆø Gv!˜BýRˆûú…Ž •åæh-noßöý`k¨PQž €¢Z˪‹=àû#9U[ >j=£ˆ:"µTA/S’”~É‘,~piš²u$U17ºx2…áÀŒnZØ›¾çJ%»52„¼*òï³P®6:Šã¶ošÄæ+ƒ ÉûËhÃSxä¬ü×™¥)p§ W}4›]û´ÑûÃH1 •º Ón8°¾§éj¶úE@Ä‚T¬–±DüȨfx†vƒÐʨÃ`ÄÕ{ßäQg/~ë݉†.º·-µ_ ߺ€¥ñH©t–>Ds³.ìâÆîïš}Ê´à+Œo…»„Óû×4+¹°•¢þá ž3ºƒFÁ ^"Àî§©Ë­f¼åkÔÎã þË1+¾§Úº'›ÃsÝÖFÉ{¤7ÚTʦJ=½³ØÜ¹‚JžcÙ_îb;à4]£hbô¤”BÔ |œkɼ±„Ë“îvJfñ><ÆÞU#Ïà“êtegÍaP9 qãJÄù“SЕCQš2Dk£˜R‘ôQeC~g®OàsÂåfÚ²æv¨7#oêw\¥î3—ˆÌÉÍÖÜ*G¡ x¤;h@‚Hiu´®Ìòûƒúñ"ý•“¤lÅ<¦5PHat†c™W,ôvYÏrQç °ˆ§—Ξ’³Mœaá,¤¸v …6üõ÷]9I…@ö9÷Žx)ó¦: £¾†7¸³ÔæsŒïLŸm˜x¿q"ôŠC®®½G¤q¥ïqƒ&íæQïþ’ðTGtN舚랿XÅù_òwNcíküµ×9á(?õºƒnÎ$ë=µ4!;³ ¹ìµ3ã}B¦%"^™FÆÀ0–pSŽ•÷ZX‘~¯iœo.¶ê~Œ3õ/5«<ˆ³0ÌOI™ß¥8Èå>ay;CQÔóïêEõŽ©rEUÈýDeQWE缬*@¹X„u5zN—ñ`¡3Í3âáV …¢Ü•¾¿.e¼±¾Nž¤*ä#m`’Le Г¿÷Æ¢÷ ¼X” v‚•XÒÑžÁOY±Í»ü–âfÕ^§IWÿÂ#_ÍănM½ý/ùÅä£Õ= q›fú ÷¦¿öü>¾±›áy¾ÃTýì`aÕ Ž¡ŽºŠR§b‚WŒ%^UŽX¨¦Ùs°jzu °”„;ÊÉýö» ì!¶àµ˜Ð§’JOþ!n Ÿ›ã±ÐX¿3WÊÓö¬´ÌÞ~=…ÙoÀ7µ¹”Ÿ KøPZgº?¡!R94ò¡xä~¡@Ë¡§ÐÒìçL£C–L§Üc _cÌ÷éj.‡\›Ô¦Ù1–iAf;°”¶ TvÒæõ‘Ç_-knØ…6Û«€óÁ‡/éùªæÈ,4QFg‹Ü9V—)u¿RôbƉ²Ù΄íôô‚½d|Ù@²¡dNÊ*BͤŠ\z<žÌõ¯Ö¹UòÌygwÍ0Ìñ%èt¢´L9Ÿ£GîtÎk6Õ*«½4¾ŠGá¥y¦É—F7øVOLÀoYÒ‘Æ|!ë‚UÄßQ¢é†û;û°ë©¥niã©|¥‡vŸ”$­»žÅé§B_K–5\ÞÁ0,»Å‘®‰1[³§³ÿœ(üWìruS•Ëᣎ‚ ‡à[ïÖõ³%®<ŽÍâ }ÝÅx¼r…v.I†Ý!“~(]þ¿9q‡²‚8¶«<Þ*ëÊô‹´ØX±Yÿƒq¥ ð¾€}(öÌ!å“~,¯˜•xS¿b‹ú§ˆ™BÓÕ¡P“üíš)·‰/±{ø@ìB¬ :Ô9{ìt¹2kÔccr,oÜ|x&Í>ï}»9mDÐ5OJ¯Œqkí€Ô ÎÕü‡zêZM‘·!ø¢8ùÑÀXÝ»­¿æ)Ž7c­‹¼Ñ[pþ–Ï# ùµR£'3Jòú…/göÁs¾º?{.ö¡ÓI}«¹É|¤ "µ”4±ŠxFºó¿,"öápKÚ¹&à­^žÉ¡Ç.ú.¢þo2À šÞ±Î‰¼Srç6‚ýHCµšYþѱ»joSÈ CBx€0Ãxofå2#ÊYÛòƒPX(~qÍãÃrM%ÌFÖ€?xǾ|¤>׆5ÃLlņLñÿ(¼žQiÿ,U¦Ž`¸ÁúR¨ý\²sñ`¹8CõÇé:%ÔYÐBó® _D¨\)ÞŒ\ ÷cá§É¢¹nVêáŸËP-T*K4Q©=”“ãý’ùŽ€žªj’"®x¯WòèÒ7úl3pŽ5» ¤i¦*ÏWÕ‰",z\ÅÐrÃh° v²¢kŽŸeè;›ß:¾M]Ô(•ª¢Âqái•˜šáÆvÎÍ^BR=3Aœô=íð$¦£\–jŽ/¢(%|}Ça"®T+ÈI¢7ßžÊd«¾J{ÂåÐE*VTS+=øÍ¬ß‡ÇÔÑñDž.–%Èë7Ñ¡}£Š¶ /ýÄTl›Ùš àÛáÒÚNØå,Ägp¡òÚ{¡D’¶” .ˆR-æ(‡’¨µL UüV“W~æý¶±(€Ë_š¡Pc#ìË)¶¼fù––›ÄÌG£.rRxýIQßxk YPÇ…Fÿ¬”¥Ã =ÀæÆ'\#ƒ‘5¡ÙÉÓbÖ ‘ :å‘»V_úTðÙš)1¹7]fÓqå¹σ)òã: Ü,<š}ÂvÿEV‚?Ü£Ø÷û†ðµtrbgHŒÇç&Óà[žˆ%•,2_Þ—!øˆ!‹Ø¤ƒ‚­yhŒy¶Æd'Þ›êö Èä÷>sÁs´\é4|ŸOVpÚDNÎØ €€i@ÌÉñæ‘5 ƒw¡è,‚mZ*mKš´Í1áuÕ)“^$ uL©’lõ Íj#æýsQ9cpj"בL©ë^bÄ×:WÌÎ{kÍŠãhO§7Üìþ8[ÔµÑh„‹0S]’ o4€½úý&¼ÎÒnŽQüµ…GŽ¥8å‡sj'I¥ÚE §™œ^®8bÅÏÔ½Ç^0õµdåüPe¬³]eAs¥ŒÊî}Ó¬öþÞ X/8|+·ë…¢Q_Mª+Ì› ›‡á& ¸sy•çK‰=é²O0Úð*Ú¾ÔȺm[)2_™ 1–¶(âäãªmãªîwì™E<犜ÊÓïÃ×þLÍÉž‚-ýµz+ŸÊÂÆ­ÞèÖ>Ù‡§¿†;Áù¯È¹¤ƒ…?XpFx«FCè´ŒX¥£å&‹;Ià=U.øhRuDÃñA›øë34ó#‹¶$ihÄ8–°qMë5Mß®Yh5$Á`©°’+&_[ÍuÇ\ri§‰—)‹b«²QV¶ÓÝ4!ê@NiñK5k—(Y©]Æ´ïRnŠaVm<Ž‹µÊ]«’} óþŸmPB¸\gÊ ªð3„˜}óƒYظKøFþû­˜XF¶ ™Wc`ýEB ‡fæ–ŽäÅ4¥Éax;RQ´|: 3û*FÝ›ÒMÕåÊ; «™LÀ¸T‹i¬T£Ä$3I”=Î&àƒŸ®¸ÅBwø—M×Å! wÝ´b ÿ^[ ñÑÅ4=´j$4¸}ö ` ¡îVŽv‚dÍ ÑëR5X¸¢M«”ùSèݰª hj²BMoÕGoé΂TüqÐF3ÕœØÕÁ³ç-‰gß*n~¹ðáÞñ™¦æ!í*¹. £•†’”Š„g©yd­þ›@µå¤L«Cš'nð=ù›”ûOÕÅBzý*‡ñXQUrzHç@$*šƒôlU»xù•/ÆÂ9µ h.49„œH¯Gª5·Ä¿ñyB&”BRZMô!V (e‹5å¼Õ!Ðkž8,?®,º‡¯ ´ûŒwAÙ=и=µ”3䆗5ÃÊ4q6Ok ºî²é~-Ë)pJù¶môדZúOŸyÖ(¥ÂQè%MŽ#T/'ug¹á°¨Ûùè/ÉdÇÙšÒó^Sný‘Ÿ>¼ã¯ëH,÷‘þ³Íƒ¬m4o‘hµ Ÿî©$ŠìÉ+Z X)¢¼ñº\@¶Ý7¤$¸ÑOÙPZk'à’å…{8ß;ê;G€Ì{èË ú EV‡ø —P`vbég›K$ É|‘)™Ûk¹ù©Í$‰D$H,•”«¾í¬î„uÜ)>]aÊ@„?“ÒþëäYÍì¥Á3#Ûd‘Bü5è‰ö¥7p“¡€e>@âáÈP<£öû²…­ƒU÷½Ñâ~Jú{=Ð^Î@æ±#u™ÿÒœ¦)ºV”±yo|½RÏ ˆœå÷“ê}æs–ý6þ²O^òûF'ä½bÔ@­ÐCtÎa:ÍïV#•<-D«¥‡‚  úËÎR?”ã$3ëƒ'y0.æ•7À?e·J¯±''¿YhJ\{–¾„Écþð|\ž°á+ü#qT™Ét<µ~`Øo©;¡K§î±hQ{t„ÿ×µ¸ç…1¹ÊÝ£zºº}X$÷§lž ½:ˆAó<ŠÜÙyƒ!¡œ¿þ?°.{ò±»*»EßÎC:}qqâöfï0  %ŽŠ ¯Œáˆfö»²ÓQÝ4™O1½ÐË¡ÀuïCÝå똔3 G/T6Agå¼çc0ýݺ÷r²eM;4à!ò…ª!låazÛŠšåYõ6èh5ìûºÄïZ „}ÕüX…¸<ôõGjC)…‚| ½ ÒÛp£a˜X–›;AÝöñ®Ó¬ HB|3Z¼cuÕ´¡²˜2ª¸Q•µ@¤ê˜?‡|Y–í·&𑇹î:U©á2¼8#.L9‡ã“¦)8l°tTÛΦ­|e3!öŠNW%†mòŒÎѪ µiS3¿Ì^弩Lü¼pã1±8¾÷P$Ýg+ñõA9Nõ÷~§cž±ÿ͉I2ðd_Iâ·ÛÆ«ãðHÿ}‘%!-‘·¨¼öWÆv߉—iq6L­Â*•îŒY‚oî8†J­;ÕªXÜ;[ĵ•DE6Ov¹é?uÏOÁúz’rH¢¸ Ík£ˆ÷2øôÛw!­Ãìð)P8uöÂäJ‘¾vÚ±Ìðk_ZB¢˜Øð±éîPNÄ3~aÃ2šÅ…@Å^dt«"LÿR½ƒ_·’þ´QèŠB7ÀâZÅÀsvÌHÿü ^ÇåŽë}"*®–J0Û‘ç4?ºo¬*çð ÑÉ þž¾‘‘7Èç_Y·¨."yd]=O׉Ó€8-ªºDf;£¯QVƒŒŽº§ÏÈC—€HÅ´íœXÙJ R޹§˜«ìÕ Ÿ}ÖᯈiÀÖç-q›;š"?ª‡…„Ú¬ŠÕŸˆŠ¶M¡º`ÿy]Óþ«”ˆNÛ<[ú«—$ .p„ç^9¬Æü¬m#9z­ÎZM[/Îå ¶”;‰çØm¨%J¼Íƒ’5•†bÐ@ö«Šq¨#Ó€‹ÐÂÁžÖ!g£G¦dÑ@=D‰®^©SQ"î>À>ï7×FK|àX6;²)DNçC³£>À7…ðª`œ4´" ¡€FñÇ^o2ÄN»;Ïów>œ6¸’²6T‡ÉvÔïÆ0犫Ñkpƒ‚VäþZlÕ£õ7¦zÏÎÖ"5´+á,±=†ŽÏSÉ<ìLCŽH§WMøZ\âðJ· ý mu6›ïÎÏ0ê¿"0 Ìk „¸ƒ6‡ ‡c~t´ò<†Y¶•®×æ’x×ç'УPbC{Of yhçËípùø_™ôH<„-¤ˆ©›«öïºAßZ‡¼è Í.béêU•Úéß ‚A^¤(ÓˆφOFa¦ ̦ms¬…v5ö¹5¹HïÇ÷ª´J¨•Ü«·ˆJ‹¢—(l…ưû‘Ä kÏI(/‘äÉ" ¥ki(7tcln|É~»äD¥fkŠÛæ (rWu•m+Ÿ¾nÃäUž©ˆå$l££9FP{Ô’ŠÈÝdÝšÿcîx¢}AÞ$ý^Ó˜Žï?“xd¦C;²ÏCŸÛOÍúo0ýQjJ@d¿xÕÐ :BD“ó‘xÞß»ÈÞ?±¨”ºÍÁÔúÉŸ|г‡…#‘mÙ£;-®÷Ð@úug_/‹€Ù˜Ê»}Ú}Œ^¬6L“¥ý gâÿIŸS”ŒTBe»1{h.± 2¹êQìc°¹.º_·6ÚÕûõ, ÁÁ¤!~Ê~”2]ꑬeËøz3e¨iïÛBmZ2&]*ä§BYK~¾>ɤ?€‡‡ºïX+Ý3 LsdXA¹3¹¡NpåÐ üb À8í5š°p`í@Šÿ}P ‹IÿÅŸq ÷ÛÅ“ÖÐ+áZBçÝî›~‘ÅÉØerô_e×Ñ·k_d«!õ7Hr¬)å4Y¯Š¦ÛJŒèÕ¶.Öbéƒá4oK ­D%•õ©¾èÞ½Ú)âeÓ ¤2Ž›Â|Ï¢Ú]ì"Ô½§ú|÷quYŸ~CÙ]ªsÓ2%iîæÑ~• — ¾âr£F+Ô¡þÁÒSC´ö($€k£›°4téÖ«BσXÝ;FƒA„`<÷2{5Õ:’†âÂ;Z-¯Hí`p±¾}>[•cÐËV¦ëkHÆRÆ‹%¶6ÒeßéÚ]ä3Ç¿,È“(ºè/¡:\ð©¡C¦ËD U"í@K1T^ÒݺKÛšÕX"#Ðp-^ÓžNÊWÎ[Ë“ù’©·Šp“ñ#A ì •ÎíñwFIf-&c}j>#IÐk|œÜ™ŠLêÜ3ud\_ÎåÓÍYKÀN„µ†M¯Û1|V¬¹kJªÁH:Íf~þg.Lyiň•PëÂ2z"›'| nÓ|u0€@­Š£¸ñ_V‚8m×/è|®£¨õËKdL!ñ XèÔ¼4¹YÄRÌN!=¥;ó¦ò ð-í¯6Ä­qŠž¢ÔŸìÔ2L^?Q’ X„±1µ@}dçkÏå†åþˆ=­¼½s‹ñhø2ÃûZíoè5„g²gƒJ) ópä>è—fÅI–Æ]™a>Ó_©“_Ò4ÆÓ=Xð`ÄZ0 ~gºMvÿðCá±è–ç[Å*ËGø8(0aknWY„ôyw6ˆý f÷†ï]šØŒgkáR&Åä99D·Ø¾Ö‹ÓÁÎ\¦j¸»úUt%ñ’#Pv6ÏpG '·d«™oè55X/i#’4á/áÝdª¹Ä-ƒ> k´ø¹°RÎ#¸EV}óæl͵¦¿&_3VÊ@ˆ?ÊSš®eÎ8êmÞ ÄžãP x»>®R‘6–‘Í`Ý&'ÞÝhä^|عmãêZÎR€šÿU¤Ò‘3UÓîÜSv¨^D®˜$= öìi1]1u©,íß0æe·HÔÙdq“±3<Ïx|ÚÒ7—Tí@Ÿ¾P¦·ƒMߢžŸPú¨)wkoáT6æÿŸàžÇ&© î‚wAiƒEƒ¡½R¨è®Ïð+ß"TøÎBŸþ߀=Ĭ h*͹ J:Øòë†YÈeâýª›$pÄè¥*dž [.Þqú¾†K[@WÑŠ+?“&ƒÚ-ÐYfî¼J>S1YJÉZCwÍÔº+¸‡o¦šöï.ÁƒÈö‹JeÄ~IÿXS++ ð¢žÐ'øh¬Ÿ³+Ö”A ‘?¼û43–N½”Vr0@©Q0ó¿](pÇê¯9Þú¦þ¬aIJ« AÆ«˜æF*ƒK#Ó®ìŠù|’pšBYÿkÝߌ[nhÂñ…î$J)¾§$˜ZË  ¤…8„kÓsGD—€£SÝ$$Ô R5p £í£ÿ©¸X€¡$ržXÑkµ?â[€zH‘SMþµ>©&Z·ÒhÓ–ûeÜ|ôž›y¤Å;Íw|íÔ#û1iÀH³æ—XýN6 0˜ 5­Çžô—Ü—Gš¤UÙFÃn0òÙû—" F/¬±µ¢£UžBˆúÔ2÷(%›Lj,â+k‚ö­ÔÓ°Ï“íŽëQ„Ã~‰te”|ìøýj4ûïá˜d=Dœ×®:J²Õ!Ç€4T·äãÂXŸ9@/„Ó¼J8TÊ[ISqgT¢qË…þŠ£M¯k”Ô~ Öß÷ ð¿]@hÈýÖ¶µ#”Æ—™g)ì©X.†5Ûí´}½Ü{¦ÍG§jÕ¢’M³tH%ªÉÖ·HTY±+L¿ëG(ÛW£m¤F:Џ{–#C3íªž"#±•1ý£·Ä³æ"kâññ1T‹é¤Ì{&+X E}-òÙ´>13ÏÒµ¾]&:¶Y%[{ (“™Š$U~¾d3Ûê«€¦ý”zÑ,açáJÊ)zë¯:’wA8/¶}M÷À—‡›¤NäêàžÛ­`c¸ìdoKÁ¸÷ñ¡C{å2¡Ø_×Ç»º¡¾r¤¼ÇOd åôè« ³«aö¦ŽÀ~mLä²x@>…B§~¥2°÷e#É=ó¹ ‡I§'ðCm½;;ñvóŸk’2…H÷Hq)zÙ'ú4:$›4î¥qs±L4L )½úˆko:LuÚ2ÉÝA0£%SA[Ò¼×åiËädÈË—âð ¶ö¢ÁtgQD܆í¢;¨Ùá˜x&¹îåA€žl $!ò(Á¥DsZáEÝÀÁ[ ë¹Ú~!Ó ‹ÀT jèØ‡]1ß LÑ:`‰›ÙžÝèmX¬ó’hüö13‚°jÓQïãà+†ßuÄN{óyÊþ;É÷ Pp!ðg…à‘f.‘ñ¤¨®Þe–ب²£¯Ù´ŸD€óÚB$>7 ÆKϤöªG­þ\„b,>m”fG¼ÊÅñú««Uÿ’‚¯íÖ -¨ÆÓÛÙÃ妹(Û¹ÛTÛÇ2§•€`†VŒFߨ¯×”øYáŸâ$¬áUþéÃ\qD¿Y7y1ç¨,2jéÂA,Ðñ-dÈÙü/«±Ã4g'9ÕaÕ" uD¸¿¥Ç –߀æ%º7àn”A£ •$±]–{wº¨Èj±¾äeQÙQíHº%Á‰îD!ñ*T ‹'/_ÈÔ?=ÊÚµçbæ¬ck]÷šÁ'•#0ølà ±÷ØåØóu;=Ý»ð–\êEj6‡$5»$ãYŠú¹Hý»Ì¹ ßË`¢CVq“=à ´…ØêÀÄ2@ÿ+i¹A΍ÆÇõäÅšnpZk°;)) ¬2™†Ñ0qŠüÐayX–z€òªð+­ œìÃÏ !œŽWûh4¯ÖÑóZEï¦ÜBbP̵#®÷kÁ”­KfvÑ¢wâú$˜p3b¥lœ5‹¡‡@ÆÊ¤…†=˜ãËæ-Od%¡þHþ-–êR_–#ó@f Ú¿¾äÿeXè6q±æá&¨D¡Ø¦0ªò°ò*Éç­MÐ3xEî àä[ö1^Y¢Š–Ö‹Qƒ6ª£Zp<ü´=,0¢¹HduÇB‘^>fz²¸Öf`ˆBV,LÊ…Gp´Û'r£þý,VB`›«5 [-"}¤erd>ªÛÀ k†­x–á²ßôÏέ/MÍRÝšX'xÖÈÛÁ~âAÞ ´@Ù|S®×0EˆÄ ßpÍ©ïÄs›´µ?íº†Ü°žj\GsÛÞlù|{ã«a@ã2Ï* w¨I¹P—®ïí¨{zz{‹  *ŽUð+ä(øŸx!yXðcÛEjGõåQ~0÷-†,£ŽE³PÊŽ®&òacËÏJ¯ Ç)Æf›$} å zë³+P‘¥9yÌ1lLF>Úæ)`öcææÖϽeà?Ó7Û`¤ª`Cv±"P_Ã' o²é~ ¿¡!Å9½• Eyñ Þæ*ì×ql·ê¨0õU5mèfŽ–Ìr;w:>ˆ› l¦2þ»QFÕ“O/ýŠæÅ] =`íöº]\L øÃv6G[R§¡¨%¦Ó§<ßR»/yßÂÍf>ŸDG©ua˜Ð\o†Å‘¿L :õ=Y¦rA Ù¿éfc§¯O ƒ›Šbž”ï²-ë°ÿÒÉ€òÌb)dWCOe“1Á²Çô¾¨ú¬Žò~ÍÂ&›ÃJf WqS‡ÂQˆ»1×›oŠÁQç>A¤;2~9z…ì¶,ÃŒDaußzï!nSöÉìð5Ý­qÞ#í]jÊV½G£ðÔµJ Ò|kn¾GŠñµ ^Fs¾*y^®2»DPQá”WJÐngÐ_'c£±ÔÈø—bGŸr*òÁQ'~¥øÃ›âöeºïêö* {Ì’WÜ)–g Ÿë-êgA–ÿ¼‹d’Æ4«U‚?Ñ›[6â!­g’(§ú ƒÄX†Zöy®y‰Ædc÷ ÓuжpÞ– ¦8Îgòˆp~3 Šš­™ƒKØ3áÁ.¤hxŸÁ”+éÇ=á> Ì1‘A[bÞÂ÷Ä?<Îl‰Ši¨Îô­[–ðràôsVÍc޳šh·»O©79q £<ȵk´Ö½Q–æÆœ#Ü" cÚï³Ðù}ffÌrÖž´¶J¤ëc#Ñ¥æãó^I¥kTÆ'?©7£P ¬å¯ãÖ'åâcV´Šh¹jºQ€”>jbEÚŒôö€7w—–ò+4ÊÅ^:ü—ÏX^=és ãõ€g‰Ñ·m }uå8ÎÕÀc'öìBB‘ØS!'O ëºÔr6;‹ò7Ù¦·°Õß{šiÒ¦=¼h_£©L²Ö j‹‚yù¥óìS>æ/Ñ€‘a’\Bs =´^ÚqšW%° Éf€Úí§^-‹(,à¡þñÎŽ’p—ž ̱õ/à); +þ£ßO€@DYïߘI°i`ƒàa’;z S1™›‹§‹¶Àdñ:ÑnC¹Í+é{f“IK|«ÅÐ÷òI¼îÜK…i7à(Ê$®¥YڱЀvEÃ>›Ñêx^o_q£‰L°ïP·ùõì$2^ÜU(­®”×”mŽßZd,Šƒ>ÐPùõƾáÎÜHYä;- ‘iÞQM¦—ùŒº®Ááç!Óœ0ËcRìþ¾û¸…µÇ)$0yr‰QW'ˆe"蔡 ÊÊfWРm[§£ËÕxsràzô-ÂÐ(÷rßaxž|帹¼âM›YN:Í)3«º¤˜ÿÍÄ쨱*²05û)—–ÌŸr@„N?[|>b ±þ4fjåÏšäÐó ;ÃäÉ茸á4ª%2‰°°LbÅUz× ré}K›9­xÍ•I•—*mµ[Ë•¼ýóB‚ÐξúÊ#Ÿ»q/7˹%WÃØj;(ƒè$Ô`Û‘ñXmêh;O½xSJƒ«Ì‰eËßPjÇ'ëÃQ÷¹^Œmwtýç)2âÒ/œý>ÂÆí¬Ÿ+ôîÏó°RKÏçišAè[:kË™ø³7ƒ°u …«-"Øjz¦¤ Wü·@}®ÞBû’aò8/‹Ý˜Yß ™†’NèÎÄÏÊF²{´ÅĨ:…cih'¨>6Äg64&´Ôd2t}¿ÖªZ좦j—F‰Q`n¢û8sqÅæÈ"†U÷Šg–â‡×©¡¹°,Úû~ʧDìÒ3‘e6­kžý¦S6,\NÀ©‚˶9'}lòÛ~B ·Sõ“ͬòÃëÇ,¸¥°À‹ü€ Ÿ„ì‘l×.h3éÔSô1 ‹˜eØþxPüÐb0õ°+ùbCŒ3#vˆŒÝühƒSömž`lLZ| )hšh}’ ‰RÈo§-Tvü,H çÊŸ,}Šd±V&x’§$N*x®·?í›îÂ69>¡㟬­Š¢*üaÐòx8"TâZ]ûƒ*Ž”‰…Ä=£~-ûA`¡ó–Y³¯4îZyã;þ–Õ¯w†B M(¾¹†üp1¯CÓÉ ~ÄܾÄÍ™÷›žêRÌã¿:ûh×`ëœ HVz ¢ñèøçdQuÅÝFú1{èÐ\é <ÇèC,#Ù¼®¡{â¢pŽ-~õ˜ñoH=~ÏP¤žç+È®Žî¼"GäOúáÃNK(…¢ŒÐÿÞŠðóîÝ=AϲÆpTuö^*’fôót§ÓЬ˜urz´–¬a>Æ!Ù…{:-%"MÆÈ®á6Äã&uiQØ1¨À½"UÌé`7üµoäAܬ¶J/å[ÙªÚõÿZò¤¢gT¶¾ß¯—dóNÏ{ûX‚¶8@zƒ®§•–¼B@á2˜Wazb¥Óbò‹¹kE/)û TW!ßP·}°‘ÅCàFHÔ¥ÿ$Ħ'™ ™œßÇåˆ%f7•(Á"=ƒºÅ…ÜL®Š‹œH *ÜÙPfâÓ9Èêä öVFÙÙU¿çû㮽 qffÆ'ÅbÍ¿, €‰´BÖ,sóf]’€¾^ô ™·o½ §:Ó‰:L tþ5Åí?¿›Ad´“6vçô•VÿtgÇëô‡ïË–¸vˆTY¬&Ëוz^å0“Ÿõ4Y…Q~=à|¢W”4‚Ò?åÊUùaæmí…̵í¶8N(7Ï"’…]ã#HМŸûÍm¹í¿aÉ…^K^ÀÈÍ¥#)§2­ÚðÉ 7(2='œC*¦+‰~J-Û-ü¤³‘þ•åªQŒÎF­U\O&²¿ô ë£Z)l~:Ã9&U£Œ¤åx`aú_E.V ”öñÿÃGü–UGãzCKS¢1I}wž² ÌS“lÓ•¬àyÛöÈš¤û\áTÓÀ_r¾Ä^™UNô;ÿn¡Ähg$?¿ë[@bBÂAüf£HHëpÈnôœœÏK…#Ó2ƒþÛó}|)`5J³ûÆÖ&× œ@Dp\ñ{ ­ÉT^ɹôn¬]¼Š”û",ݤºBÕ¤Šç%ŸÍNÇ_¯vÚ . !NÇÈ®<LHß²'‘jìYñ;S­²)?ñÒ4ÔÏF²ïQ”á¯B;3… äGMB8[3ûÁT`í¥[3Èôö°ø¬TÇ‹(Oæœ7 µ\Ú«†n„Çø2£/ ý~Ki¶ú¢:Ÿï<¶Ã,dya+ʬ˜¾^ƒ0–?¹¤M‹:>ÿ'ãn Êéʾ)À—:¥ð*‘`a ¥†Í[e(¼–Ìæh\IÑ3‹tVØ[n¨ Þ/ÔЬH°ðÀðF| ÜÅ‚«ÑIÞîx iÒ£š¤HÛθ£Lɇ gì(ÇL äÙ?Œœøf~î1DƒºŠjºà3t雿××·;akXÕ4Ëi¨/äî· 5(H™“K û€E†– ]9"ÂÏKŒS.*ƒìÈöR²Z¤×ÁƒÅ…»f©9Ò`Wï]k†ÍÕ›!C²þ¼g Ç„±À‹d/Òxê6DúuþÖ9Ù+f.œQ;;qþ̦g}3]F+gg‰º•^G½Uó”0B»“&{è×q¾Ðe„ú¸†ŽšA5+^½÷K¶·9ÛcÚ]¯ é>6ˆ$}b‚B’²Hç‰wÿtΜØeLT)§9!ÔÃ0NŒ¯Ê;;œ*Óè]ˆOêW¢·ôˆÒŽjýQT=x ö~ Í«^P+¨9Û ¨ ®iJ*ˆ6,âIH¨´à)è¡Ö0~iOJÒÂËsqÞnÍô³š÷>­Cù†[á›°ð2ù×(Ûçqûò¯—Ôý•ÇÅ0ñ”»ÇÁ/Ÿö½Ä)@’&¾D¾FF¶®})WÈeƒÌñzø(ùžëÎ1›)öÜeÒCº0VîçýšÛßÍ™3ùN¸º3_.ÓÀ´_à і䋬>¤,‡àSK#=”+”2 µu®ì¨ªÅòdG< ]wª‹9þç\¸ ÒŠ|AoH°ó„ÉÕ õcrŒÚ=ÛQhFæézõÊÌ¢‚´*6(çÌ8E÷‚ªù>J )Stí;|ì˜ÛÑ’íJ£¶ën³SBî[r†Ç§;*à q\³h$+bù˜²ûhè¸j| dÃä*º•šy¸ ?†Ïš;-ƒ*ö¶´ØÍ»Œ¶oêsëú#d'ýé¾)'$$àwEy²(Ð_·L˜äó!É[~'÷5,5þÖ¤„L<^Nõ§JÇxç! ½º§i~Ô¨P>‚$'}˜ÿÀ Í%-p¸c¬à¨Ò%šú¸Éûj£D!pÜ]ÏÑoJgåæ‘ÄÿÓh4X‘â ˜D¸˜J¿í‰_có‚iØÿì­”1[wCþÇ£æá‰u“UìWî‹÷Y¥\±L]ýaIK<þZ¤‹3 Ê>™½×…½ÂîH²…¶ôë‹ÇÌq_2Å®a¡ñˆH¿®,„Úʡʦ ƒa§¤PöhÃ¥5¿ƒ•Ê‘UC¸žå­Ïö+AßîBd`å}Ò•ô 8« fQôea´à%Ž‹¦1}®U c†ºj¯šÃ‚ð|ü0ÕŸÏ9OßÁnOûˆZÛ÷ˆÿÑŠœØð‹ýÖEg Ldb…X"‰’&:aFÜÊwZ AoÖŽî– Ešµhè¥ÙVò›„gÆG¾æà| ’:ÖÏÉþø¬¸—wœQýOYÍPú•펛µ¡Øç -€A6Ù­MY£­+èxÀ½djkêÜû¦Àzýa©aÔI«ýÐtÍÛ 3â¿S,ÓÝ»E ÌÕ„®i*F‚µt\ƒêjS l>~ñZ…M±n2@"èv ã~t“Ì>KFöÎ 8À\”¥TY‹Í€0Ï^߆þÖèŠM°¾}Z—Ã[Àç`™Ek-gÁe˯©¾ó"LöwÖ¬ÚѤ­mÅH¶«â6åãatUX]‹ã8(Nž’Î2;•_fÌ£À5ì(ç·ÕbÁÕÄ›ju:êŒ á®9¾yC»üTTZ–Ç«ê°dü,q;ñ²¹°Úzæ¡ó}ZY_t3­:_…JUÿk½lÆø[ ”¡Þ317XBî-9a¨?SÂJ`AÔ—í¹úë{EÑ_Ò0Pˆkw Q‚L`½¥BTt7mža_8ï$>›»§mIV÷ Ýфϱ¥>ÂVI ÊÆAøíÎ1 ¸—)B= tÏ1ÏE q°È†Ôí9•똰†"íFÕ¥&¼ß¸é¸W]7Ϭӟ@ã`/Ý£^¯1È5.ÔY¦Ú¿¬_™ö‡¡®`=<Ï’ƒ› Ç.;ýl­õ݇m8Á¾#ˆ–w€^:´BÏÙ¸¶~(jðÏŸõJÖ€÷dÒ{yë?‰<™­Ÿ†Ïä€õ°ÄV*­Ë8ý‘éX*³ÌÆüíÓæ‰ÓüÒ7^œ]ªÿñw¶F€º¢dì%‡¸ªK‡#†p°dÜwc{²'R-70І«’! Y*qÜ+›÷p<ãhï¤pà“`ú| ¢qt˜Ý:pÏÁc£Žž6 š^CPC7³¯s½AJ¹CB °Pƒ?¨`Tù/­M‡&¹ÌA%RÙfAM´<;Kð"Ô€±m—ÚIˆ°[L›²˜…ñ¢`A´Z;M?¡1â„o½¿ôTÿX7B¯(_Y¾Jý\©í¹” rˆ£Oßøßó¼QqÖ’ÀpḠ¿z5rU1„D9øÃ'}ÓÊÔøŒÏÄáÇU?EÇ9×ÅΧË3¿•è.ÚµdþžŠohއñŽæTƒºµ×{ún“EÈÓÊ' ù&õ[p±Åg^]{¢á¥;‹ÄPECü¹è>4Eù¸Ç¿@ÜTÃÁÃZŽFíÈojÆñ’ëè± âÑ(Åú,Ð2Z ™o”.¨êxÈáÙÉ Š)i<êðÛÐuøùñØi…%&Ö½¡2ä• †›yeåíkp³WózZÿ48f•{µ6¡žµ0ô®÷IÆwîh×ÃD~üR'2.ù5Å\õfÈçÿîŒÄŒRôså2:(0µ¨ù§g”q{Éçù´Ègž:°kÏ e6tVý”¬.oÕGPFU]¿„@¯&nkk¬†¶ÐQ|”bk­vx²§¡rðÄ) õ»Oq÷F0õJ| ÷¬#±/Ôà6Ož0!ôdåUþùzÜw¨hP±ÒK]X¢úwƒÝCa¯¤]h}*-£=à†¤U/µ‹6;¶R°Lï+‹ðæ†ÖQ3àkÍ\Yî't=¶$ˆVìêX¤uRÅ۩˱y·ßI ´´zCÇp“ÀÞ/†½B,ªƒÖƒz¸¾AmRÇþÕ4i'¹ÆÜs¶.ŸðÉ¥F?åÇ/¸•}]Ž´ýo¹ûþ©nâšUm£¨Àšg]èl¢úƒl±\#Q¶ÌX-}­,µàø¼ ¡í•èÅd[Ix7¾¢¹âÙù á‹ÖÍMµ µ9Ó»i/Í+N,Ó9žÄ¢¸BãÝÕ6· ô¸­Å1eõÌ~‹”×b˜`T!ˆŠˆ/¢šúôÛ±{€ÕC×y*ü3fÓ_š‚ÚOKb‚€:sÉB¡¦¯o^€þóž§$¿WA¶ÏJ ä$o?Xð¸þl!dH«3¤+’¡ÌÝôù™JÁ¶¦`ùÒÂãŒWR}Öð°ƒøÌsÞks`–x²ù¶²Ø³­ûL ‘v[‰8¦UÅõ³€/Óæ·<,ï•‘B…üZù7Wø‘°Ö¥)&B¨íHaI þ…6ã­ öužSÄøöa•:Dœ£åÿü.†Ò5û”¨kBìàámlÛé1†IÚT¿\oÀó­¦ëô¬£Zî7G:"¾Lž¡‰™ËÐÈ?‰€é;G;§Èès wŸrª¬ˆÅb‡œTÙè-Pc®EÚÙήiàÜÎ|. çˆ#€;Ýõ Æ38^'^7õÿ}ãÕ6a2n¼í2|î"…ÉK•×°,–ž¸áR˜·øþ_èÅ*R—ÐV¨W2’ö9Ërî ¤¡¡;^•†q åEu2 …¦+(Gß§¤tõÔDËñ;m‹¤g,YB‚yï8ïªÄËÚËAŽæ‰¶yªÙ6x\JŽJè ó8-Þ™<ÈžÌ_'ôÂ×DHô»b„?“Aè¶£ S¸5ÕÈ€µpM'9†¢°´Âþ KŠôµƒ‹ œp34º£{^å]iå°2eý<éûØcí)~¶ž— ÿWi§#}ì{Éâò²e:WGw•&û£DÜß2öTï6•léøIåÁ¥ t ¦M×(ß fy—á”—Ë©R×;–›l-åVð/¼B•ÏwO¥óé'¢aNÙ”·ˆ°ï|')çØùlˆÍåW”zŒ»SñßÒ‡·Zp;tÿ:jGÏ]ß¿ú3|. 5X@;O\±øåGmȱþcˆ¶rÁ‹?&µ–‡½¦ï¾RSÑþ1ÌÃDÃe§E"֠σ¾oíǘkŠjSrõVóû'zP*TÿM¾’3nõT>¢1­,[l½ßº 7nÔ«©¼Mø8^•Vûe+¢Š‘Ô3«Ï·ÕvÖÿ¨Ó–X(¾D Ç(=~|~eýÒÊ7oT}í]@‡¯Ü%¤2ÔGkzC$’)gˆ2ÎÝYÝÑLtݳ 3+[¢w³dk ò=ìLj¦ÐJýÞE‹#^ŽÑ…Q(`Þ¢]Ð\]ì…wðCã:E'ê7Ãìu)Ñ'ÙažÿʯxÚWëÉA”m„2é¶lÚ‹:W™9è >­Š ìÂ$yLÒ‰ÞEŽ5ªÅÕ öW¿'0JöR䃗ó(oË­nôyï=ˆt'ÿ´8iÂ×£^”{alŽi \þñÐeË–3í#ÿmèB9ëtCѺ˜o´h ÉG®sÎx×Ü>ÁÔ…R±ìà ì"£È­­ÖM׉ŠC¢o¼ÕµòºùUÄÚw¾³¥1w£Ï‰7Çí,r Žäax ÐÝ—¿Œšæ·©(லÇ0QM~+žª1ˆÏ)=êàä÷–=º¥VS«´½xï¼ æß*ç$K!ØÕt!oŠ \õó˹_¿ Ïû¶åŠ?™@ÓæwðŠÒÒÊè–ƒ·•E¬ÉîäzÓ¯èÉüU( ÕÄÌi_nP£¹6¬ì½k&Sn0øíÇꯄÎ^Ø–åO>u&„yiÿBóWïÓ/h1äÒdwxzzbœ#­¯y›Á‡.?{€ŒY(Aռ̖A7ßLz>Èq›æ,95ÔBp£¹ ¼Ê©o9Ë9bøl•¹¸#ö/G €Ææ§é—æ“ÌÝÇ äÀµ.×Û÷¹À&9ÓV\›|â}L”ÃB-¿>%°Q›Ïm|åcþ‰Í‹…æÑ¥+àXšIäZÔ¤ÑIf†€35ñ;<á%±vMЬfx÷†§FÐfưª3Že<šwÔZBŽL‘ÑicÉÈãÈç’M.… „ôH/S{Mí õêɓ׿ ÓÑØk·nãè„$©ñ;'§?üÚJäß§ÒlT>òýØÅ”vå¶½¤ ûZNúDnÁ¨~p¤‰ª3ÇÖžÚÕlþ/´Øüéo킎¼Ñû08T]q¡]¸X-áCP6þßäßúk RH¦-’š1uÞXâ5—5Я†|­Õ¶‰£‘¶ú(Ââ'¾ˆ`¸Ð¥õàB¡ô¸Ù[æOèñ|..3iK‚´N¶²¶VÀQ×öapªK+Cð£fˆÝ³ü(éOÖÈÀíÆsÖž`v+ nʇd;u_šcÙ‹ËôØõwÙÈÏÓ"l)ÝÓ,žóèâ6Âû3J¸Š¢EÓ È°|[t]2‹*Z& Ì2]Ÿ—,âýôæl¯k¬…1ø€ ŸJæáf%îœz¯Õ¡Ž«PóhڎÑ2ÖÍ88Ç8ÂΪÞŽUø©Zh;× «Å2L7seÕ”¼È‰`"MŠÙûLaˆYOØR‰ÏÜÜh Yuíό֭ÜÕƒe“-c`ù6»ë“;öl·„·Ò2 ‡ˆ:3Al³Ðâ$=ãwˆ2Ú?oЂ¨¤ 1Õ…æánIwxñ&ù&Uùcf'·ÊÙ’AQïZ@Ú@ƒ¾‡"ÜB Ô˜j1påÂ=aÒOûλμñ9e N¢5¬Åë×äRÍÅÔÞ¿°+‹³êÉP´Ô{B…ÏV÷‘%κów$âˆ!¿¿ Žl>ƈ´^4QPìU¿k"žIê–WE…õ4www=0˜k;6î+­­Hj† ÍkBwÛž(ÔÙFT¯Ä÷ꓟÉú˜2EÞ2&É+U›rx#íš(+EtEÒ¶p€—CþÌvÀm?&–vÉÙbÒ¸¾oW…Xýn‡,¶--ç)OÈê“sµM%£•yŸ ÚoG[TS±!irÜi¦¥(­þ ²ràÆwn{ùX¦ÎåˆQ_„‚kÔtJ QQâ!Ê[qáÞпԆ$á¡f qµwkÊ*zoJ3¼)[ß7w5‰æXá!Ù@i84ÌòéKE|°¸²¯Vqv™½zcLƒ›Aÿ"[cèꌕS•È 6·™5^鞀VÙg¡òBËÁ Û¾ï ÒôG>ìE^ âŸq9 _&Šå}aB¿÷Þ‚ñ*To%øa«+‹­7D¥I­ÌÓ…Äâ—ÓkkP”éyà[çÁ۸ؘõ?àU¿Be½ÁÙôgJ%bÿÁ¨®¢ÊèyiRlÕ›?~!ð¤%6²¡é¦¦$ ”þ5/eé‡ÀÈ.Û -Aæ¨B,›pšuù^äÅ&Ï%2CðFârwv KçAUKÑ" (^gïÝS©2Ãk‹àgÅgékaÔÿáö³ºVmL·Å l¢ÂWÛ”“b{1•¢ñIéðÞ¸àîr¢Á…V÷zþ7ïž8c‹œ˜Çª,Ý´ôƒæ‚h2›4¼àýTRÉ‹riÁµqºÏEôÛÅçðÔˆöòÛ¡~v÷ïÛ¡ž<èéÒîæÐeÚjcŒjøøßzŸuÐEz²'Á$žç̽ÐÈõÛ0 B¡Íí [ðôÕñ§Üß\Ws8°Êoq¯òÏ„& jq+ŒÎü5´ukçËÝH ;‘¹ÅÖ&Ó b!aṄ@6{šýßK¨g(þwÂÙ­¤ÍHŽO 7yœ9;«Gq–ëJ¥5À9ä#P‹B 2VÕXŒ¿ïä'^ü«ûaÎË|dªXº ®æh-¹gƒ9xî±7+-b¨Cú“Ámý¡Õ|!2i‹àåpÏn!¢Ýk±„„÷}ÿÙ; A#Yï ì\B¦ù ^¬·_z¡XÕPtÞ ²SÖmôS“XcHûâÚÝ_Ž€vˆòƧ¼›YC@óiŽWMÿo½®MßóUÍÙ%[c2.àLGiPЉ>-9ɬÙ x.>ƒ¨^ )‚•hUéø‚Ô[ü=Ô1­§y3Y/É1\Çp[%Ø Ž§Áõ«ÁŽ‚-Ùoâ¦òÕö¥Mjó€žcéjá|­”*à‘ëžá8¤ê5ê zµÕþRMK…? ØnáI&„æ (®€;•kv–¶äCƒXÎômÍÑÐZÔç`ð;ó£§Ùó]DOóÍê”–÷’•x©77# n»±ód+%“<'¯±Ñ–»XÍBFàq Ô d5–Ôy^n¤ãʆ9“*  àöý%›Fr¨Œh\Ýê½%ÆÌÉã8>þý¤Lþd,ðúŽ1ýóQ|ƒ¬ÜSö¥Ò/=‰{ÀM·&]'‘åóq-ŽÙÀ"Ž3]}õ8j£Ââ}ÀüI稂Ë1Ê“É1ˆ5ã¤?ãÿ)}ÝÅ>CvärŒº/8wIY›<ô×þ$ὂÁ Ý —Ëþ%cCpdj0ÐâSM×¾Nï=sŒ¡¦YÌ5÷EÖä­Öt(]É…à>j€8&ögEÔžè#i-šû&ÜDÃAùŽÓ >½7ÁëâÑ2ØJU—æªnaþ‹”\ï“…Ù-'Fb˜›»:˜"Ä ¼ø¿³öaIW"/@®lì ix¢Ùà|Khg(ø[㾚n ÌiŽè $űÜköU{eÉÝ^ó•\õŸ(g™2âáè¿äv·Âú´Þ¦ñ‰£Â&—¥ä€’ÄDÆB‚Ý_±€°øº°ëð7Šì•ÙŒ˜eš$LêÏ7Îù O;A‰ìNŸ‰‡”ÀÄcOð‚~o94_øù6½u–©ãWmÿ@TÎho‹ݨh³grŸ¾øƒ/ò­ÁJ=´’d~ض±*IÄWozžt-æ’«&ûrUÂÔsáÆ¦Áw“ „Á<]Þ4§¨Öàvè#Ð g¾9de…$e ÷j[k½Õ-ÇLåGØrÌY‰,KœI0u‹L$´ëL i§ÛT«ýÖ{nA@¹!Ýè¬í´ø`î¥@_rù4ÿP½š©ùqx9ˆ*ƒI™ ¦h°E½°oÚˆz(ñYém•æqcçÏo<(f”h̳Òòrj ’Èà×Y?[Óu¯YJÆ“³ã+ãhgVB>k—£ë€a¿Ë”²™–t?ÛÅŽïÿ‰ò çYï­ÈúP—õȸÓ=´ ¥r‡DÞ&’À¿Ðuìá¤5tRÛÂ€ŠŒa9-˜h÷0; ŒNwu‘òÉèFŠƒ)œîcÄÉÑ'1aÛêæP@ƒûTR³! ]׋ù'¹dʽÁùɉã3º«þL¹-…¨ö™ÙJâð…ÛXæN{ëMûOõ¢dm"UöØIÁº¯ä-0û¤<Õì$éŽ)áK«Éùìïu=py$á¾þ1F½n³q_÷ñ%˜è`}p³^ûbR“ÆŠkß¼~Ÿáà”bºNþ˜1æ@nŸ9†—Åñ8­Æë. w1•õEÐ[K":´Úþ¯#–DjÀTÒ »_ý&žÊÌô_<u§M•™!ô.9‹f€!áf¢d~d ß}œåбfVtOú| ¼R­’!PdPa>ÔQQåÆåÝ »)Lù”Wña˜­?Ï7Ð!{àÜ$ûŽ ¯ñbMäå ‡‚?e‰™"´^ÉeR«+•d"+K[ÝB×/² óÒ!ü´Ð´ûº²‡: M(téQ)71`]rêÏÙªOë]Êaöš°GcšG<èÝ]Ô‹ˆ"×l‘]v«þ. DÙ¾kjßêš@Ùy ÃY‚ðõzxo†ä!Ü —§ÿµùBÒ˜èÂÍ6Õ»Ö5%m„²¾¢Þò-˜Ø3ãÎþí¾ŸóÉôÍOn#òSóó) ŠT¹+¿MéJ«eÆM‰÷8»;"PÛEcuÅ9›­8ЀõˆgdK€ŠJæE¥œ® „Š/ ÒÀ€U76Ç4yÁˆÂ=Åá çV¨iŠÔãÒD¦AW¿YqìËSä×½¿]výSIm\`G½õU7˜¹$\²RöD{G¥}=¶Ü7q÷5a¤ù´"˜mÃXL&&Ѐ¤Ý°8¿Äjy%î‡ÚçX´éÙ S_ gLì; 1zœ,v„Îa/z$ÔÉ?cè0lã±óšÂ¤ŒWfëŒ|Úœ¹¤{D÷KÌs…ÎFEŠéZ:&NNÇòëG÷<5¼m/Äz¢j³Õ¤z¬JI´GœÉ˜¾¹0¸“dÇlÞ Óæ)x!#æJ­ö(¯DJÚÿ«õÖ¡YêŠö$£öu‰F™T'M“^Ø bo(àÁpRöêÓ»F‹rž€µ‡D&Þ²* ëŒÞù4qŸº‡@ÎÈ(nÕ‡wFÝ1ø¶–ºAM:§’Ï=è šúá®Xµá´Ð7.ðÅ#X’ùÛaZSž5_£©Ù€y>DKV)Œ²_èÂêL0Nnà¼l£»¦@pÚ$W>J`¤}Óíá%š&ýàŸoBWÜÛY¡£së€ç&”æ/É`¾¦6½4rã7>*@S‡QåEÍ„ºkmSˆh5“çý$ŒÈ“š$÷…¿?-•ë EªêÙöõµAÅA:µûûããF¨wôM· ÷ã~ÍÛˆñ‰Fv¡;ƒQ^ÃVHªf;¬Õ@Öò—ôG¯iÍÚ%¦Ô+šeô¥¹§@W±¶A9‡µ¢—%Õ®/œSñcGHP úðâòaŸ³XÚ\Ї ŠÅ«ªä'a³Vؾy)'‹ÅM€ÞÑÞEMýtu?Y±¯B<ÔçËí®÷võ&—÷/3ý“õÁ;”Óÿ¸¾Øö”a:Á#ï¶!U¶ÕÐÜ˾ôP¨füZbpÅXDXX$—!ªª—*‘ï3ºt4“Ëw£zóÿŠ£Õ®rn¯Už ŠÒ½Á¤@†4†N¸”¶ƒÍÁ±Å°l!¯\Œ†ktYÃRðPëC®|(úÑÏ%—k'‚ÅKF¿¢w‹H‘\ÔèêL«œEçÀEøiÞºG5‹É÷pH‚¼]÷ìŠ^OeøùæƒFQduïSC_äM@ §8¬MmÑQÊ»¶Ðï>AM—QҠľÓù:raZÖqˆ=*W6ÙØ@¨¼{×åÊ7møß-qE¦Õá$œ*º²¹–«R êÏÙx¡Í@èP¡ªé6=ü!)i/ö]¸}:&îÝjÞUª¤b îïM¨xŠ d«¤™GeÝXå Ÿêû ¿Átù›ŠrÁüÞo/YC¯½èW˜NÉ ˆÜ©¨/P®ôÙ4ž2Ü£®”ŽÉü’ÁÒ§_’퇕Zo^”:±!OZËv2ö»¼!϶{gÀ^™âx£aÃŒïëÊ»\×6 ‚WoÝ “€ðd—i8~·ìƒó¹¦6%ÞNïû-}ŸU¦Á)™Ô 35'O?‹„²Šã~1/·@Ua)x׸ÿ°ð½ K¾ÅˆÓÇ-?ï Nz£(\Ò´2©Wvo@i²å¥,ÖG ÕØ5µž I&þ~jöfK«+EŽË4fÚßk=—ö‡k2Yƒo¬ý{Øâ÷B:A¡)§úf 3hÿ;!w[ÇxA8óû¸Ì¦6Ò ¥§Á‚WÓSÝËâ_azÿzAÈò¢¨½Û»« ±… „5¯«¶É´’¬Dl¦3€hƒÕÂßTËáìèç`£ÛíQ§¯hMŸ:ßùÌ–§.ðÍ$¥A‚)/þqQ`ªò…„ZüùY­£=é'Ÿ>!ànWÐ ˆÿˆÍkªYhÃõ‘ê©ÊóMËi‚®&%Õç[\¨$Y<ÚCó+QÒ§ÚCQAÆ4Îeè­ÐF›äÓ=ÃÀ®D À*ÍÒÙœ$hòµfñ ÉÓ©Š`—+çÒC•=$µj…<Ží9ÿª`ÆÈq!^Ê.ü­áªUÇ oÏd3 ßÂJ­>PpDè­[­³#˜šhDqªÕÆ?"_-p…⽪Ã6îß3&º]ˆŸ„&&xJ*hùX³Ü—Êc&—¦Ñ‡ºCÒß+ëo3}j”H6øËaݪ± >Àڜ JeÑš{XZ£C+ZA¥TÇP|4nR¸LÉ[YòdØ?ýЩ»¥‚Š%~´PýoÜSžAa‹ÀCF )0‘æÁ×BhÆ4j&ý™]ˆ^”À yÍÈšñˆ¬4HÈñKÇ¥ãÎ},Lè š ƒÃL‰ ÓF¥½æ+QHz_RÊpÆeKÿ¸ÉK[³BïN¯L“_¨unT“cê<&Jä°_ˆ&(½?qÚðs“­øØq:ÎÜkÈ { ’ïûoOǹKW°`»»÷¡\þD{ … E]VQ¹µyEwVx°æŸÚநëoÈ™øìY˜à6¹ýI ˆ˜ÉlvN[б{hÊï0Vþÿ‚}ÇŠ£‚–Ò&ñ,ž†<µ³ z Jž{ĹÁÜLlF½ð°³² âV Ý]ŸšÙØlYá`©É3$^„ÙöÿqìfG›KTÌ{Ù±n%/iÖÁ™–Ϲ?÷9ÅÕöÃï»ßܨ֓‰ùÔ4ˆ.>ÔΖ¢&¶\mŒìPu›Ý#“H‹¨Kó5ãì†ùÌ`nžTB›¡|òt `RªÈ,;·,ÙÇ É’*6Ý®ËÂ@~Wæ'ÄDÐEú€öéÎÃzÆä9`õ ©žè‘ìI~áa[ ùdÃç†ÂUYn™©¢ŸÆK¨™«7 ¤žÞÐÎZôsŒ¯ÏàÏ”—ùÉdU2Âë6ëÍuÜ„bÀçÏ=4ëÌܩ䫮íkkõ&ûQ,àÄ5ûœô:‡ž?ê饉²úØJ#LMJ²¸OÅÆ ,Ã<Æš§]^Miÿ@ÑØZ ò/„ô>4(ýïx^ñÈ“ɎP³<èß2ùÿ«Ef–‘AN/Ÿg:‚EÑžbúc泓> öÒw<.’Î>V±Îëh$1eQ9®ìÞüä£(WÁ´Y+"…+#TÑ1Ôy_üÒtyÊ0Iz$ññŽ€} †]Fûf¬d‹°Ò‡ýÇ ÎÛÉ!K4är²»vÊR¡’x“{4}´aá.c4ÃÜuG ö§iB¦Ö`e«°j­ -”G(veM"^s‚¥ÎÔ£9°ÿŠÀzÖx«l ‡¬4à6؇‘%D¶€W!&ý¸JXêÿÝZÅ“‚‚žÛ‚Ýáõ´h7À+gº7§wÖ©M´à=–Êû ¦sZé.äÕ…¥4¹P~›…’¥x ”٠ˆÈg?ý‹VaÈ™«í5`BÆ)+™Ö®|¸ª€#JJÄT³{\hZj?¢5?v€ný/ZB='ìR%AaÀ1§çþãÎ`¤Ï' ÝäPÓ4™"õéØÈî¾V–ßéÝ}›¥Ó/39‰e[&yæÿ¯´}º§ªiáúΚPÕ¯ô£/A'¸…ù=gg[A÷¾ƒÖ>½{24êXèB‡Š2Ûg|>í Ñ~Fæ.)ùiÊXÊt,PT„4:yŒWë{uz9– ­U݉ pˆÄÃV»¥RÍVjy$õ8iJ›ŠñLçÆÎÿ@õâ‘Ìq£sÒ•‡Þv¾²¯—³Êsð)0HI¶­>,é>ƒöá2’ä•=¢mår"çîldž ‡ÍÆp“1–•¥¼Å7Û²Ùê.!i£qZ²–a³ê­ˆÖ\z¨ñ¥ÅzzmÛÈa».Ÿcœ³†{ýF­kÙÓÿ¾ç³ÿM•Á.´Q~wY#He ‰Úªò㌯hµ%9·¨†­]¶÷1é*F†sQËë3Îë²<ïëÇnÉY-NRxÁ…€3'4Õõ{,ʘºÓMÆ(Ø ›†JP·¼ÍùW$ü¥PÑRØ3葱¬†öÑt(w½·D=ŒŒlÈ{£©Â´ '1‹äÁ`8~¸ˆFn3X›1K°×Â5lÇf¤gp05 6ô3{8qïA"Må:UtûXc˜G`³9±Óžû¡OÔ0E.´›ÈN_wø¼rà¯w ÒòýïÍÖóI«îN-¢.éIjqäÁ¤ÞЀ>[-½dx{Ç$Ón׮ݴL(ˆŠžK‘[Nÿ Ÿ:¶GS%¼;¹Ö}l4¿¼fÍëóª´ ÙðÁ¼h3Ícq8Ä\×M@3ÊÙ1}XhâXU=–â¬dª€ùPAvÉ—ÚgQ\ 9WÃìò/³Æ )âiÌ×°ë¾y°œú=\¾wuËõ°GcD¿Ô3ih n×löøWÝúXÊ$·õòá-Œ[ÃqGžq¼6¹õZ¢5?M¦Ã‚*/œYºSV½¥1zoPޝÎ\yúK& ú2!’¶E1畾=gÔêQ¼2±¡ÎLÃèÕƒ ’±<ÿªà Žùþ¿êí>â>ÃZÎ]ᱚäeBy—±<Š˜•`6â\™·ô ¾_Xì{I8r";”xZ·Þ`§6¢‰Õ¾XÉPš` u¹iܯyKßZ;Wzá¥k ͽàGÆþPdÌ.ª¾ž‹¼\˜ ?9R‚;ìèÆvºB°~èŒ ¥C¾-›gð8¾=iX红Ì*YÏß"¾[ å`Žö¼ž»×v‘´F œI¯Ð8f]¬ë3‚ô¾DP¶z†ÌR¾c6ã%ãæa@ņÒ-þ(ãüXJéx´ÓÔ^ymÁ¨r©šþOû=㿪rùB3ûø˜¹ñµ`—ù9¾lìƒXïBï"`ž â±e~r!Ø6™ÜŸŸÏê'M¤Ž ÈÃì´e©hG—Ú–ŽÇýª¦íãô Ï’¶«Üη¥´º<,BTÝ‹éËвx˜®a6§™1«¶EH÷¶öQ¥¨QÜd®›æ%Ûße ãÌ \X=ežyŸ4pðÍéAó?TO4‡žÐW|_’{Z‰B@jÙp¢ë±!­±ÒG„ÏÌäèœ×E˜—$5ѽVvíÐ'Pÿkšxó|Vã€y3Ú–ãocH¶ǨTPpÓ¦ØÐ®;ÐûÚg$W“i›§‹&L£'þ€<6ÎÿðîTÒOëÂT)훌X}Væe$Äg‚],/ס#,ÍŒ=®/õîoßy¸mc‘bÍ›º©|Cm€h¢ŽÄ3ŸÖTj èÈ`‘+ÑŸfÅn?N>Ý_ÖeùWsý×W¨8ÌP¢iKG€>.´ô1$á?B_@£ª ~T#¤Q D‹ûìü‰E‡ãØ)æ,Œ‰…Ê›]\Œº°RMÿ Ü’¹$Edœùu~†èú(ñ¡KœàdBœ¹®Èï^&÷æ™;•…‰ÃظfÄB°ô4¢X}±âLöZð6ånf7açõ)»C„ ÈྠXóÀ€˜-C¨@TÝ ïw|KZƾgï±Z¦…A‘‡ú+ƒfr–dàÌ~†;X²®¾ìíišZ²Z`þ’Üõü–Qia€a]V?[…€íöˆgP/¨ˆÇ[Cüup~»XHÙ­ü‰ï{iŠ».zŒ%ìfúðœ×äTe¾(C±×öÖº”±þZTjl,ÕÕÀÔ´ºŒû`Õêœä’um܈ ¤!ÃêG­j¾[žÿw ö¢NJXìGc.¤Z\€hÛïû<2t¦ŠËéæÝ–+Žbøý§q°Ù8.füëÜ&¥mÕ¯^l‡ï#κ¯š¾Ô›jƵs3Se¶À¢Îtˆè‘þŸÄ\®¿Å}ˆ  ºÙî%ó°»!môŒ…ðèµëáý¿ó£aœsÍx‹£`š1à b)„3ü|%ûxK'¾þ4IJ+Oál‡ZPñɰÕA<|DCø‡¬aPì,€Y. =0€UWŒ¤'ÆèÜÄrÜñÒ@Íçx3Š4.†oAÉO»M¯YuÙûù Š-éV±Œ8eÛ]'’u¯¢Íÿ8(c? žç¢25ÌcE3ê«§ÓuŒÑ%ÂÒ{Ó¬^Õ/âáìæ·¤+*Ý+6oÂØg\omšòÝÏä#þ÷NÅ,èäåiãö¶¥Ùüaç$pˆÃZšB`ø+AÐ̦ú¢«Ãùïö‰Wé»ûHk‹yâui*h-à2Fþ`jÈ4îãfÍhl[#<¬€$êo%7˜S¦O¸/¦N*6UÉ-©ðÎGîÆ35¿¶íí‚,í?o^ë}GÊ÷Y™`¡Z ÙKU2Á…8Ñ Éc‘‡›^Õ$tJÜÓîeÏÞ_“ùTÓr)Pœ•fój$7—çö ЮRÞ(AÀ´ÃNuü2‘Gæ¡”‘'€sÆÖCœ-”ï¡i}+¨d õ{¯¬)ÞF1ŒC-t꾸YY+­žÉt!ó†©gEªTÅ•SdO4P½1sHTšmë-ì:jèÝ…p’LiéÏûôÆ¢=|Ÿ^˜’ÅÁYùÏP¸=ã‹oÌ)ÍÛÊ7>2ÒM|¤d i8h%ìxI‰Âs>‹¬íТôÖ‰Vº .ÔJoä˜GÄíiP#•«®L;34o Èåö=úp7«½|/‡¤7 Júéu ñ%ÜIîÃÄ `'vbž*Ë”I‡¾û[‡fF¸8Õm½bycݾ˜·¨kVxûÃnÔÞÚG 7B)öb…%ñí'AÒy´§¤Ó3¡6çöЫò‘KYîôû@ÏCøm’o¥yoï„Ôù ÐÑ Í.k»¤Ôüëâ]·Ñkâ*wlŽy¿îþ-ˆaÂ@¯… ˜ƣƈ„úõZì6•ÆnBç}À—}=Åèâ“:£õÔsñˆÔÉc1¸ã”ò=Þ%l>bTÅ~c®¼HΔc2’=3Æ|Τ`<£¦Ä­,Øx¸Sy>DõÓˉµ€Û3ršºÓ,ÒZµ™qhdmK)Õ¼”ÛŠs÷åm.m]vçàÇ‹fS-5kc8••ƒo>†ŒÈÜw±&;OaÞë³VÌdyîËêk¹…§JæÚÔrãß"‹@j2¤Ï¨šQÞinô Ë'–Þ%¦ZúÈ<²–ìÜÖw¥¥^@óñKÊžø²7ŽäÅoaÿÐ?¤À~ÒK½nsRÉìƒ-{–WË8â\ñèïeùËR¼DÜãÛÞûÒ¿Aø;øÕT`®Õìæ°¼‹‹¬DvQ®×dQåñÛP…²®ÖK*q]ZÒ]8ùÄ·ÄwhΘ«&˜ÒTÈ—&›ã]%$€¶‘KkÉÚÕÎÀšaŽO­vÆG…¾Š_\ Ù!ûúÚ‚ÞÀ>U­kÃÜ PrË“|9<ìÀ‹]ŸàÛ%Ú_‘‰Ù·ï…qÔM5³lu!óˆHûÙ-Léªhy*L[®níŸðþÈ B7ú†ñ}¶ï7\,åcê!ß$ïf¦ISàÉ–}Ó¯åjGÉÅ( 6{{dT(<©”-)^åF;H™UNø¸Í(yã®4yÑLÖ’ñÇ ‚sE,‡ÑKX‚žÞ4HÊØ®Žª×l´/¡"®³¢)ËÏXz¶ ÎÑè#íºÇlÐ2‘ßÑk‰‚¯Å’Lì Ò²o"¶dé`Lé&e7äâ#«N½n»õælÐ×!vç(÷’!ðÚ2£Ìq—šÝÉÅên ÛTA›MOP¼´È%¨ ^êPè¨ÐÐbÿ2ãgo”n³æ¸…ö~£çFnMÁªXnù•Ç‘ºï 9GÏ \¡mbÕ9øëÏß×?Èëƒî_°3ÝuWz¼É õ^\{™¿ßØ3Z A‹šw¤ùãÝxÏS¸ÚQŠ%÷U&íÈ‘¤ÝgãGÜüÄÿÒ‚÷Î’¯IãÚVCY½»™úìÊqªom_Õ5d(qj×ë«­u ì–‹´ ⛤Ïf,VH U¿µÝ]ÔÏÎN5)ˆ @«·Ô¾Ué&®£@¥c¶:VŠ ÓXyü½yí>o Q6†Èäµ6SláÈÁ×:’Ô ÐšfÑ¡›~ÝðÌ‹gšqsLBÛЫQíù|Jý¶gÊg–|'¸«Íé¨î‰+*ÙFD±ãV`¸ˆó$ÍSÕÑÐבJ£ËÀÈÌ.’­`JAQirôóÇÕm³Xj¼‚Иb5܇æ(à0¸ž-íxcO(OÚW¢Î«ÅyÊÀPuC„XÿhF î£Rzp½'ÛÁ;º!4Â9‘ÉLÄ&L½“¢ÁLjéƒ&¾ä£Ží¡Or^Ü+ç\3·3û·•±ÀŠ?/(™‹¨Å:ÞŠL)°x7È‹Cˆ/25zY´˜ÑQëC@žÇ‹â™l´ýb™R{^ÜX7THQŠ §cã"nUr×Rªéà œûJcžû¸uÈÂ%Ì™Œ,[?,uñì b‡–¯úïn䤷‚‹·"rÜ’;ÁùšÌÿM|Ñ:OWˆX>#£œ³S¨ºª€Ä~‚±:FëáÇ Yñ‘,€êŒì!ëh³Ð®VEÙOKnˆr4£kyûÒúÍ=ÁuæŸåÐ U§ŸW Éð膈>uuùkî¨eðÓU•QÄÚo•¦ç’E Ö$MlJ—ljà°=mà“ñˆŠDtóVࠬܞ$#ñ"±ÏîFtoƪÑ3ÞmXßD·Bb¦ÝÛäÃB¹šTÓ{Ï—-M3Rf÷|5î‘D6†V¥rK¾àÖ¿$TùU/ †ˆ«'REžX€´ˆŸ¨V\$@Y[ì¥G¿§<¨`~Aô3H£DÕ˜Uý³’„D÷¼8›}ÐÊßrsÉ‹ÛðƒCh0ûë°¶$ºÐ®èÕžî8ya¨&Šð‹‘=›æžçöK(Þùóú4 ØÙ¡0`D¶ß¬{Œ~{Ré{‘èü\×d«ÏñQvZ‹´šõï´äOÊÛ$/‰²@´/ñXã%×1áï9ce5^ªû RÇÐȲ6XúËœê¶}Õ|h…mŸÊ3Ð<6Ÿn%2ƒ"s({š]t“Ýl¥m.Ù J>Qpøh ªšwsª tímbŽZ"º€Z„!§]¦µ–¹ŽÇü£±ý—ÌkÑ7×»B%(F¥Ýp†ˆç‚'ðŽb©†“ž,‹çpì±*I;±¨ì•Â×w•}ƒ‘ŽÛâÅj0݈.th 9‘:.Pt3îX¢ùéGô›XÚÉØ©Ää«üÿsÐ:r]N=?Mf攽‰ÍJ;·Ñ©'¢Mљʕ1æƒîLˆßEbù9«-Þà¡Å» e)ÅrAú2ª\>ÑS7C>:7²í£8ì›Òù#‰,E!ߥœ>þ/l4q²|QÀOôºŠ/¤ÕZ ´P˜Ù`_î”ô<ªÔíé–Ýy7Ù7üoÙÚµ’#àõ¥º¯Lzfßû§!1Î%ý¤ŸÒ¥ÁÖà ·vq¸o5‡ín½Ìs§j¿ycV´Þsüd…ŒE§ž¸Mœ ÜtTzS7¢WÐÛü1áŽùl,"¢}ò `Fi«í{¹UdŽ-”ø»R~îK@ýúamà%¢Ï ü²þæQdÃÞe­n#áz‡‚UEÇ¢· %‚"Û³Ú8í¨œ—wð »•PbÇæ¤\M‡øÞx€SÜ~uèq¯4:DRI ß.p@˜=bßzÒ÷=%Pø°tÃÆCpŸZš±ì}˜ÇÀ8Ô¢å2§Onx ôàÄ7U{ûcën‹ê¼“3ð¥.©†5öÚ¤x&`×bÐäc>u©6L¯7/ŽAlDQÎýá¶Ô§ŒÄ(83^ÏmiŒ¸ýØ,8³uùã#:„9ÁœB²:R¤0ÊBmï#2‰3'ï[žV7¿h¡)n½´ ]8½^|¹ue»ö•\' /r¨a Ò~t *^ê•¢wü‚aš¬£ÆŠ¿Â uküµèŒ°«Nš‘ý%´ñP;Y7”7À@›¼™í)à>;„´¿‰Q¤[)“­s¤çXBLDÖ. Ãæ•{²¡F•­l([ÝgZÎ:‡ßSÕ‚IsMÄ{“´!Îô ÂÓ&UQlØÀÑë‚»ïN;Þ6 ¥Œ/™Ýû¤§]»;Îí exzŸ]0Ø6˜Pì¶{[Pã¼iE½˜MhYDÊ,E蹌EK¬ÍŽP¾ °oË%É´'W­w½ƒX¿È”¥™0Ïù•;Šhæ€äG‡’ñ·& ½s÷Ý2ö°)ºŸ²oÝ4˜~4-ùcê$6VÉ!™ óB4Ë[l‰«ë»ö&SbqËâÝlþ<ĺÿ*¤Ê¢¬Eì]MlöÑÇÐõ#‡8X/ij‚ºÙ'1É v[zGô/¬’µY,Ècõ]2”K@ñC‰úGe®ÌÎÅLq #º?Ï@cR2õêÑèÅ(mrlgoüô½ 6>zûìaN…+IS›ÌÛ³~ŽêQœ×íã³Ï°YCÓèuGUlå[ŸOôt#µ§×ºõPZÕp—k„…_öÑ8VGe™XD§Ð±Úƒ$ÝQz„ÕÏÒÒ ¦í졳ŸtMá¼tÜù¤~áUñˆbg"@r¤úFBƒxï–¶Ùέ6~äŽsˆã‚«©ö?ï:ÓmÆFîû'lÛŽQÆDÉT#°æû0Qß´a êœCâóë·ÐÒãž' JÚÂø8JˆIæ¦d Õ5žV€¯°Ãl(Ã0øÑU|†UJ~q¶SÛ‹4èãÃR hGÉŒ  £íiÅÀ¤N« ¿Yç ©WÅnkE=e•')“ ‚C}<éÉ‹àÇAêé®YØ=[\}Z­Êf¡ðÍpAa$[¦ËÓ$—Ú†ßÙRÒ˜’Ð#À§Å•RÞƒº\-ÿ ÆíΚ«œ†ˆwz}iº\‡ïdÚF“zõFžU?ÝØâÕ˜{öê1¡ 'oöh6äÉžY4âK~U5DTõ Ǫ?þçqÑÄrÔ-÷ ½[&…¶bi[ª‡&i\›fç ‡ö0º9ž­<&ÚÉÔ;:xÞ9Àå‚}åë›· ¦Ð',É‘½º:Cbqá’›À®]¼i:`ŽQǘS@Ÿ[6T+hä_bUl£WÕ„$y®l*.£71]Öµ›Sû¿¦hŽœi6tAJP×Ïçe>ú@ó©Wçc²ÏS|¤‰.jE²s¡Š`QüLûZ4Pv£1{ýÝ22üÍ9Œ;lоX¶š‚5]±âSu G(ÆBeÎSI‚ïxرi°šñÙ¿æEa“¨€µÒänW’Š.‘÷H< *¶RgV.L8iQ¶Iq,Cî§Œmin"]ÏDÊ=¶$­úe!*ÒÙë£>d@U ûú@¶ÞðYñеAw´11ÖÀO$ïkBG –XFìµÎ¢ÛËHLíqÇ0½´³CC‡m­ŒŠtˆ3 ùÇï(H;ŒNôE9A>AêÒÐ%)Y+,^5XÖË. ½Ýí¯•³ MÒWqéQ´ñÏ3Ñò`y6ŒCîÃÈù…Ð.âÆ8a— µÁ³j$;}À × ékH€‚éÝ3Z]"”ûÿÜ bÏ„ÊOœr•au'ßå ¦¾åëàðn;e±œ-‡1˜¶‰}í;FÖ($Úê–õl0¤Ý¥eŠæiö\ºg1ޱtæ`übæäÞZ@nÂÆ«–›¦Í^3§Ð”í± sá·Ùð3Œ—0¸¦º‡ |ùÆC°:eOÃF$\P +C>f¹€µ#z ¯˜&­F‚v¿p’°ØÍ‚LˆnX¶åò-¢rî‘ùªêÉ(õtܼ¡B×Öà·œ[~ðK»§¶)3®ZISx³6ŒcÕ7@¸ª«ÎHó´j_çÒ1.™ÆŽžruòrˆGzqLùÔŒƒK(z[×&;ñŒoÄÎIÓå¬4QX‰†8 Yo…~ ÚMI`¾­Œ+èîG‰N$öð˜ÄêLE}Ã:ULt­ÜލÏÇ‹ÆuM`yh%¼_¡ÝåŸy N CTHK É.•N)-Ù“^õ |ïŽ`ï\ lëlÜæüËDqË!›/¥ Á8¨9£dÞØ'Xå=›e0<£áéª)=|–º@ñ%ð›>ÖvZí–%o^êÇu©CÚ¤•ƒÞ„}qõ_*?ÈéËh ù,\eW2aˋIJ¡ì«k’¬F˜YÒSóÈ*-Ї8 ÷7ZÊ *ÂGêcÒ^OÉÕ÷:ú«Fhsgµã7ÞÁ_íäcå¼/®Gð_*z/_ͨ0cÛ¡…Ö«¾ù}5Lµð«oÜ£Yôø÷æAAÞ¼+c¾_÷TÆžê@Yô0}î¢.”6µ\ŒNß·­ôÇËh² t¦ê¡k“ò)kÙs^+Z$Þ” ù¼ ?Ú%æ@k4˜Fºà´"‰úS[Â++Öú'å¡ð}{-u{°± jZ×>H€³«ÖÆö»L¥Æ m’ðº¶Î#`%+è‡z%dôìk†‰ÿú­ yJŰ¿ÆEûSsÉr]P@Ë·WNÂKqÞ}pA}ÅV¯»µŠ²óþ${~Qû»ôF5",1ºùÊ µïâZ}_Óí]_£ •ú>f àRhËR$¹é„BX£ÉmÃ)ò¶LÜ¥Gh]n¿#ë&®BÎâ!Ú$£éð Â4Ú¼z]5Y3¬)þ|XY ‡WO¾úæë÷z`×X'u¯nqÌjùÓOìlìxľ‡X>ŽÁÒkÕw߃¼D]ÁEV³?ðK ïc¯_äZŒ¶˜Œ}ôIa†QrwÂÊÛÈX9?ÕcœÅ÷ RÕ¬™üGiFFfH…bínÌ ´Ì“lŸÙÆd‚aã|ƒ—ú,ù/6¨Ñƒ¹O@qî§Ã|JÁcÈÃXßêñvõ…5W¨åHNãÒÁ„±Åà¿\J Ž31Þ¸_†®Ö#î>‘éx5”Ú´bs?ÃÞæ­-J•RîÉDõîoµ(¤ÛoýFû¢ qð1ð»aô…3^.hÞm\Yë!Z'p«€ßòê ÖÒ;ÐÇP%_g LÜë¡aüÁÜê&ÿCµsŽõQò`x½<˜·Âÿ®G΃~@&¸± r½m¾¦^Í_ùy¯ørÚqf±ö ãë÷·Õˆ£ÎaK®x”ÓqìÖÑíYw("û³QÈQ²¥|¥µ­Å(|{•ˆ«Ÿ6 'Q©¹ï ÷zcs3·¹qéC"GâV4©Û~]ÓªrC¿)¥Ñ_ÎB]ƒ¿&t}íA7ZÕÚúñ¯6òüc˜|| õãHÛCÞ¶:BÜ=Ig}?þIz‹oà«íŸvÛ°ª=‹B€Hà¯yaŽúÂm6õž¸ácßlÔ© š”Eå)›S[üÕÒ÷”O4 ˆ/«†p烸 |Yi²ÜY_Õ¹ã™-Wy÷}i€ ©}"„3á0Qiàî²Ï½{)0ãïÕ!QòêœÌ#Ê£«’ØD…'ZÙÂV³Kzm¼¥tÍLЃSmÔú®qÈó ký¨Y0#>Œmë"P5¨šÌPiÔ9Ç—ÛÛÖýeô#ø'!€¯¾drO¿_³¡¼0•½tÃåËÔlzî1Àíì6í`º§vêð,M›âpÕñ=r ›wkÕ†»9ÈŠêN%TÞºÎkC$¾ÊÌ srèQû×¢•Ý÷–x9Z;‚%Ìp9ÏÝ/Òf¸åÝ·¦ÇŸÁ×c§ãÚš.âw5ýSÎÖ>({Þï8$í)üNd }MœdXË«ç#ýL”òø(Y†µ¦ VÛÕ6(ŸƒÄØM¾Áb(ôLnÏÔš”ÒJ=פ‰—û’‘sTa[›ìí˜"ƒÓò¼[öqãyÆ&[ò?ã@‚èÛJ³Ê¶ÞÞ/Ȱw½À% §`bé%-¸y¹0üÄ1øù¼8ñèÚÊjsŽ{‡ ìð~—u¯7P°‚¯€h1]1àÏL°8øƒ~ ¹å¨í·Ñ†~õè‚òR¼—?ã¾c‚€^¥A¤‹a¼5/½EåwHm°a•mM ¤Ë«B?wVÏщ?úón¦ëR&!ú$é«Ä|Õ†ÌÚ úÜ<(%g§ñâä isƒü¬áEðòOðøM‚‚ÏÉŠz˜öLf÷Ñ”-.Ï_‚0A)7k_ðV|øëÀŒc/ Šï}‡q'|Ö:9/G›·Ó„=n·ù,¾y¸Õ׈¨70‹™ì.»^ð£ÖŒ­TeÌ1ßÙ%-Ïþ+bâ0‹³î8#ž‘˜f=põcR ÀÓÇÖãfúÛˆ*_Рܹ¬7 ã?n˜aÑÁ!s»·÷ÝÍ~~¡Q(Çìµ#[,äù»Ú¤5d­^)’–ŠéÁ´Y=‡ÏŒ,½=fOÂÙ âÖ ªFÒ–O@Ñ‚ŽìíÁÖ³NïoŸR®Q,×)“+6ùÉ»)g =ꢈ*c\‘škKᢠè^!Ï»&Ü|¤z”²Àw5Ìç¸ÎÃæßiNhëRý„nïÈVþs ›-hz‹ž§±ÌµHF¶mô4Ž D~ŸË4ÂBà0“Ú_\ð†Ê@7]½“ŸG¹‰¤€ðYÙ9PTªþ fmRÕ¶ã7ãb€mÒröå:äÄ€OFÿûÄꑺg!v}ld]ˆûrÓE¸ž[Ý}ݼ>q@“½Íÿ—c«^.‰—âØ•Å߃“o¸ˆüÌ\ù½ž$ŸŽëÒ:ˆ%ÇeZõŸ–\úÜbtZw}ºœ€ŽÒ˜,Üù¿ÓÊgÙºd™ÄksÔføÜK@~™p·Rœ hÚÉuQM >¡ºíˆsýá£ÜKIk}KïÆÌ•òËÒòÞЬTkúþµÔÕÛy~ å´)Aáîm߃Nq¾ÛõD_ =µÌCì^µï4å æÛ};¡wô( ‘¼©éЦÃLa·:‚Ž¿p¿|LÙX¢ã”*¹ yì<“S§žUö•l/•€KÐW¸:yU!ü ¾ÎÖ6yqWY=ß§¿.©÷c¾ΟÒ‘¬òYäˆÚ¹c`º¦¸‹à“ ÈL#æ²×ªä¦8ÎjÛ›“„ßþªÿËŽz­éÁÕÕÁôÇMî=æÃ—ϪÎ@@Ü]y\.)¶ýÉÅTÎËj–¨T&2Ž þ: ™Ð¥Šº¿éÁrWÀù ãŸB£ÒÏq¦ðjrÒž-;–ÁÙ9í¦tÙÑÇ×1¡Vý å쯥®.Ò}øÂÆC€–ò-Xó^ÜÅðe÷7êùi(|‚=ŽÝÐÀtw.ûwNì½”?o—1Ë™·[e:‰'Iþãù«70Ÿ¿5k+íÁÔÊ¿@§ú¦Š“Ñ@jÈ8¡Ò_‘–ÂÑ/òOΙù’ë9¯ˆ¸›S°]`'Ñåþò´PoÆëÍ™Oz^ž#9l«'C-_J[,khϬÿ-½“êØ÷£Ö ­D y6Râä%•këŒUä¹G«Åù»ªéˆÀ»*jêËsÞëPÚÆG*oN¿U{n3Õ\Dõ^#QI?QŠàr¶§~9…÷áþâq¨Eîâ osÀºÖÖkÖÀ‘Èñú˜ÍÛr’Á/‚¸GÎŒ)³ìäo^Ý?Ç«¥»úië°_=‹Ö}«<ßèèj ƒ»ðr5‰Ýg¬fÓ:¤Æ ç_¤ýžûn¯¼Toü„âØ­Yˆÿè à^Pà–ÔÒ;Éiجݞ€æšP«Æõ{‘†â9[ÌÌþk½U/ aCç—]ü9ð‰„¹Ô ;`hjÑT²yóº·„ùÃ|Å`æ&_ĵNbË¢jóeÆÂgB›î>ÓØãe-³ÿ鹦RÏØ}—œáqÄKW´¯ÙÇ™°±4‹ð_9­AˆÒ(Ë1C-&äõ{ ®9g+äB†&”tÌ¢è|œìƒA_Ö´Qþ¨s~„Ì÷ÌÊI»0oM ÚŸl|Rº6ÈÜz‚»“'0$Š›O‘ŽÜ¥ÏzRt(‹ÓÇbJe8³$§x/‡ÒðÍ+òû¼ŠR$~tü@¡vl· Å£~Noç*›T»pžƒ¹âp‹JXûa%m·ú)ÀûI•ñ"2ö'‚ž±ô‚®®ÿO@1ÿ´|=ÏP¡ =Ò[1Öþú¾ +Ë”jW™Çü Â[…6 »“­MÃ"Êvð÷šŸê{ʨF…±¶ö§®Z^ñ‚;¥t‡±Æf ÇÃ:Ôp¿zw<ù~__n4Ž/ÖsX.|‹óeø‘£žà<€oѨÔ]‡žÁô—9ìÙÏV ²Í,: )£@o¹ã#æªJùÔöjB¹Jtz@ZÍðqTú.-4¾$³fŽÎEõzë_ZÏ—¬ÈÓ Þ\á¦yÔ&—rÔúF+e9s§’MEFÐÌ_@ü< '®|÷…-ÍyN4ó(8.ä¹…]I³Û«æj%·úª}˜$ "9oϱ׮¡lªfdA*-ú×-}¨btQLå=ú–µ›¡¢í4ã…6`–Â+Üæ·T~˜%÷ZHïmxq1Í÷°¼Å驟l™ÏTq‚Yüµ>‡”AÌuàëPQ­t†V\|kˆðBºX÷Ü99=­|¡œHÜß1|ЫqÛ4[Ϲù™‹­gˆ}=‰*yÁÜ?ŠÎ=tÀ#lÅçVKUy ïY÷1Ñ\‚Ìc[±[wÔ–N ¾ì—h=í žÆByÕô·¼ ›VÃwÀFœð› én$uFiÄÁdŽºñ\æ¡=¨ ^±¼ ín÷NCS6 à"U,mÞ öaÚW M”‚G–2úM#ŸØ„#@L. ˇ‡šèÉl{ÄLõ$²o—IJF#.\dmËs%¹7Ìso«ÿUc$ª:ë9ãVè”e7Œ¨e kö'Çi7—Ðó ðᕾÀ½X©u 2·¸Ë‹RS„æMiΊS¬lç`<$ŠÕÚÈ}ƒ«xP¸€m4Õør%à.B¨èaÛÛë=ÿVý”¹ë6½Ö`‚çXß»ˆVT6dFDïþ3¥ÿº ®Â6C6ÿa©§Òœá÷Ž•Dù%Fîrbö Er)¹wWm¸ïÙ};Y¾äŒ.eØõAˆSœ4àpöØ~ÕŒ‘Õâ½R> qJUmø—Ó4·Ó¢Bz|ýa漕•9Ϥæ<4ð©4Z÷p„ÆËa’ÂR” l!/U1øÜþáWžI•GÄò!ÈÑÂE)v7 oÈø$}‚je3jë‡Þç$&7…dÒM¾ò$ܤN?ôKå5ŸsÃ1b1y@ 2]9É?ò€[mh¹Ûª†r^sØÏ²Û« Ààx{°¨uKÃÆÑvüpOå’ûçÉ5ŒÇW¬È\[]ÎÄ’ï—Ú:€5’ý¸ãŽ%g"«˜<ßÅv;jäÓ9öŽù v„t—7‰½™© xkM”ݶÒ_RfæûK–MÍ’àâ»Uó#àMäi#83zC“ ·ÿg„-géÓZ˜³¡êž#ðÖ†gãÆ×©y%-A%-Þ|±(#od¼õÄñé3ÚÐkón–ÓàáhÒ©™§õl%Æ–±T±I ¯Ýt?û™U0&8ÄŽ¶¼uGß eIÅS¥ÎkQ2‚uÏ}{`,e§–fi@nàúwòçõ£û`ÒrdØ×‰Î¦Au~`m˜ŠÜ}µžýÎ)ì,Êk”n,•<žèŒaº«ÊâI(ÿð2'w:9<D.Dݦ›ue5–”]÷ƒq=bMk»®#‰žÎêxûÝQæ-ÝêÃ)ÿÆPÚ giYr n6¾ÈIÿQ¥†ÜÊ&Ç™‘.$$¾r,Ô6+eWÇ"+±}øß.NvሴÍ}Žh¡sñþúnë×ò S­÷h… o!ö½ŸÁ¾âP?³=УÍÿçcõYáéS¹=œ‚à^ Š$¬¶2^“~}‘˜ ´¥C&~ØÍ̾` (gã ÿ£Á@œׇéo8ßG”`ŽHtõ¿ !Š ¯öÓeÊwÁÓWàj«é>Œ5¦7Oãƒ¯ÆØºFþMlðʯîV͈¼ ä"-B½Ý˜´@j«v}]ë†èe,¨zà Ñ;ņ4d÷½@ ¥hÜù¡ñ—1ÓS¤“üfýUz%Ãs)»úxÿ凊ÇGÙžõzvKðâõã£D§AÏ£“Zo1ÄåíI¹ºËøVQÛ‰·ßÍK?ºÝñôºEE817oŢtØËq¸ð"mÌÅïâ…­öI¦©qûïLüO:ÔpŸBnbƒ ÂéÀ‹‹Yjóùj†ªÚ0j@†‹â¨Ñn»X“×$Á g]Øtàà|ýµûÇítÞQ’=~Ú*7Ö}öˆ›b9ÅùöÅ1æíîÞ……‡@« 3•Gó˜Ú&›J`£÷ìJ¦“Œí$“ü®_ŠûžOMÏt‰zfÌÔ?oäù!_Fhñ …¢>€±´ƒpeMRn,âƒadÞqN*ä­â…õUðÅè~ºñ ˜Ã²dèÊlç–ij§«hZ~ðäwõd]‚ž:nLW©³“Ç2½{[Ufzá†(ÈÍÉÀLž\Ø.vcÊKÏ3– ÏÙH1˜P¯Ž‹¹ Ó“èA’sÑ­-þì¼JF*ù–HêJ7Ç#D‰­_%êvÛ©v¶å;Ïÿ¥KUö%&!vï~þ«¢¼„óˆèÞöS½>¥OŸ#’iÕÎ~[¸K„ Užz9¦Ô^,Üù¨`•FÅ?U¶]›Áºº$Ð3¨ÖLø“û,J‰gj`yšôt­˜1ª‘&ûoU¾Òâ«»`x½ ‹¾A¦3[n­FÜêÂäVT¿›XßÍ©v_ùL Û;ïÃcØ)µ5ž©vöÊü1R‹n8è,œè¥ED1]¬“kу^`‹v2m.¹}ÝÇ•MRiêýu„n‚êDþA2|®<å³Jù¨–%ä=ŠÀ¥ý]ƒ SvïíÎLHÐ}8™Z7X>v:Al“Ž»{%>ûiÒ˜8%îÐ9ˆµò¸B–Ȥ)žšâöâ&]\Ð J…kpbjÌÉ ðå†Õ-YU6Äš ŽvÜÛÛÊGã>8ÑSÙf‹ÿCn’o¡ÔªŸ”¹ÌÃ5kLGëyÀìk"„ƒšˆH úgçw€ŽÕ38ZøCQzd0d@lë„·åô˜$ôØÒ ÌKj3Е²ïœkÖôl\£…†UôttÌF+ïNùµÿpNFªžsQ‡GE €›S@rvU~³˜Möi€k¢ÈÆ¿‹Q€ßYø<ÎücÍzx’²UÁi¨‰7ê^¤„ÝÅm§.'Gß{€‡ }ÁZx¾o–ùHú<ŒÐæçÖîþ'Ÿ€42%qÛšZ•ÝËñͧ$sÇuÌá+XmIBó‡éáõÔ#úôÁÄADe£˜8ˆƒ,÷RJÔ¨nöè5Ý$€€—‹Ò£Ó©ƒFHÅ úçF!…ùî$¥äÉMžøê~|ªgI»(½ÔäžPÖ„bT«à]¬qŒùhMvd•=ÌZX¡,ºšY¬pyA{O,+o/Þñ¡C*%»8|`kNª¤êcƒTx—†ÑpïÃ:1i­a¾s>fd’ñÝÿ"2ŒTë‘6¤—Ç+ý8β #ÇÅMfWZÝŸÁ.8ÇnS7Gª›w„â~ƒ:Lµy„´ã%û%´ÚÕnì@OÙú 2ðò.3œÑG/¸Ÿõã«o=™e8R'ÙC…T8¢f$zʉ¸‹þI¿³P…ÎpFQF#ü`â ºŽeÆËæ„Ç×0Dʱ$~m^Å×[¶ÿ}’Dï&áw¤>h1õ7Ú=R›ðéüQýnˆ*cèb³?ö@IQ†¨7°Æ˜¡°E?TD±4þo=¯`ÈìI-‡ê2ÓÑùrñk¹oîQR³+ï¯x§kZxÇEåËVx;ÃÖÿ”+'³…,ìN’¾ÞjøšÙ‹nv¨`‘ÄŸ¾ J §2² gýGSº_Îx7ò?wb“øè.RÞ8¡f€€³¶ö*¶Éê¤uâÎK¤ìxÕ—Úl]ä.ªz ú»!$LIö¼½H›€ŽqYh×tÕ8›ÿEvî˜BïÔ¨@i|Û¯·ÑU¡~L@„UßÍœ;ëâà¶²•…$f°‘:Ûj1ìN²ˆ2ëËqNUg.¢–×÷¾®äŒd¾)é.õØ|¤™á´~7´º@Ò™¿M*¿dÿ“§áê%x5³ÂH§¼ú_cnTAü • Ú‹˜è9‹«’½—Å*à¹Ã\e榿¨Ë“JvÑ[ž¶&tc—åJ5æÊ­Y½u®†ÖôsÑbYÎ5'²ŒTžU5ïþÄSi»Þ“ÇÑ)éHE`ßÔЈÆíCüY‡„¾iËYåí¿ÅÚ3H–þBã(‚}c9™`ÿHÜ,¦é·‚`#Q8´Š‚Èæë?=É`ß‚í'tï-˜4‚?û}Ng…Ò™aP©RK¨Ð±4HÒ£¤ìx'¬¹µ3_ ñiUc²í\u˜Z•L÷ú ÕÒâqËägK覂:·Û Ýòº‹#…D')Ì Æú¶£j uø:È%^§1unÓ‹»qt\Þ!˜ÙŽš™ÌEò&¬7"Pˆ£pð^øšbîBÿ¤¹pÓ<3QˆL^<ïÇIi/ñ9ë|‚ÅõkrЍT(Aûtî[Ò¸Ê uK͛ŠÂÅëJ:V˜:ðLÒ‰ˆ§˜y£³ÅTGú„ùÆÖÝ|õíÿ7´W'3º¨ô–ùDFÅ! ªÞ=%°j áõ•8ÉS99ìU®Á°…èF"P¦ïz=8ãûƒ·Ú¨ü<,ÈØÄsã+E1‘§ç¼ 4Ç~€*"1@ Ð)¿L¬ÊP¡yôëó–›aJ¹ÿ 1¦–57˃Q;MVªJá÷¸H'“*S´ÝkµõAAŒG¾¼Ï…1‹[\æÖèvp—ShaÆÓÿíHiwg~ïTÑf#Ï?eòá KZ¢¡2¬‘÷.GIø@5í¾{yí,(Z›Ým!ê‘Ù ¯ÿC ³À4.Åe0ÿ׌žTÀ¯“þ.Qz_ã'öú%#Å.å ‘ØG‡´ð¸Ôøm-Â:5PæüÙæØ¯†?;ŸóèDŸýÌ3`òw"{ß©.žÔhÕ{JcFWœ™¬L†@}¶ÐL:A”Ò½ïnÅ÷±ã‹o룞à(>Ƴ8”úsèG™då[уp)zbï/ͼàð‡ÖÁrT§çü¦ûn_Ôj°L@WƒC\ƒw)8ýòÐDõÑìo” wÿ=GÛb÷—V?×DË*a´ú¿E¯bAÏ%áÀ;E;ü`çT!eK1ô8ÈaµÔ´aJÅG×PkxƒÌ#ú7½-(Ióõr\¥÷Ã%%(°½ß OG£žŽ‰*'çã[¸vÊE­{¦ª m¸¦ÿ^kÝÙ°]W^ά¢ÉY­¯µ´>9NGÚå§<›NéZÂ]®%ä“xqMoÀ®Õœ[†€ûÍÛFä,LVžãpz‰K¦ì¤ÆK/"©X/$E¶¨ˆ°6®à cš”Âk ˜gãð2.E¢ƒpXsšç IqmFQî •:B²KüLòÐÊEÖªM䤂_/ØÄ÷ñ2Ìž%¹ká±hPsöKQ;7÷⚺øÞ£Ü•Æøä3!žpØìüDƒó“Hb¨QÉmóS1§¯:(¬ lM¨°„ÈRF ¦jó@êrîeC^µ9õW¸&Oðô[Í=Aù¯U®Í;Ÿ¯ÍTn| ìláê Š¹jXÔeßrqàê»8òm;Á'å}óÁ:-OvZ0T!ÛúBéÈÃÎVO¿°Ëˆ§×¦‰K¬åºÖrƒmö¿‡,NŸáx;^»!ºEƒ¤Žj)mI?y6aÿa³³}Jѿٲ´R¬R{ÖÙ0¿®]u¡˜¿|â­J‡ÿ3—š~Œ {Ûë‰Ñiäô/ù„ŽÓ©'.}cV1KB—â2T±÷LeóßÕ0Úï Ã{›€³ö‰ˆê;¢Q@£(x«›Þ¢ƒ.ó3i¿FÙÇâwDØ[èÑü}€lï_ñ¸4s,ß[ÎÏsõ•,ߢIXÇC‘òaõ@† óhEɲ3&ÚA{Ya=]Z_û[1ûÆn\üäÎ?a[눋 ™úÖC”RîW´Þb‡Yg]œǚ¶b2»6 Úãw™¶ârU8þý0zvqfj"äK˜R݆Œw‡6q6™m"$¡LÕó­ÞH¨Í3{d¡õà/x ¢öåñÔÝûèBèÞb{ï>8å†.×z»³_ºRIÞE(óž ñÿ¼#ªÃˆÙ> ¨È…ÿ¥±Síq bÜ/ů9öx"ßÏtÐÔÕ0ÇþVöÀà*¢kÆÉ¡(â6ÐÜ–Tsçˆ6/· Ó¾¹øRؘ2½W`\›¦øCŒª`fJ÷0Ú~4V?ëXs×Pú¿ÄÀÑ…±¯’5÷WJž4~ÁE ÐàÕJ­:‰Xd@ça ¢´.†Ž”_žo"wà›~˜õ!ô^zz[Ø(š¡Ö…i£±ÿBS´A¶H_¨èÀ`u@N$nšàúG÷é)å‡}»ð€Êsþ†¶À>í€Â %Ó L6˱µ€[Y"'1šóm±åDâM20톳Ÿ %SE^Ôj:¦EÖ!–Lꃓ-õ¨y‰™Ö›MãªÆ3/ãàHNJ=P©iïΰâ|‘ʶ1obÖU53ÞJ ÈÕM›ŠÊ_ &»N´Ãvû«uNCtÏFG+´L>OYñc÷Êó¢4´ûò1ž‹¾¾\FýcÓ+HŽŽÊZ‹˜ó‡æÿnÐVÎ$FÃ~Ûˆ_àÛǤQÆ«6¬–C.‘±Rq.Zèÿ–æ>Ãñ³!„;XaeÔ‰æ¸ðj !†Lmï‘TÜ µ®Í;ƒÆ~™L’Çú8qs˜;Ž&VOÿFc—¿æÍê˜Jð£¼Ãm›ç0' ©z7íåkÚ¡VË¿òcÿ*xÿ=ƒÔ%ct*‘KцÕèshõâüL»§Ó±¡öæÞƒÐb¥¨%+AöÿÚ¬gÉk½ZÆV³M¸ \rÌÆ¤ECvìøA’åÃ!ÁJh¦~ ù–Ó(W©_§&ÞÆ‹Gõ;½¼ƒè”áý6#Q•$Û_˜ëëZ‚>7‚Ð8K™ïªÔ0f…qòÆ›´³9ÖÒtW¦ÇpóÒC6ü‡¼H=‡:1—t.×J•šÂ—v(yÆï "Š»;’øyqÿ/˜úaq* ù±Ì6I÷x9¸ =<¦¨BPp6¡d64™€tTúÇÁ‰>FX§e'Øf¤¶ÜšR±µÞ7üdD½Â½åuc[Šã s­]—4Å,´µçÌÞû=à¸tÔF×lÜ}‚/µ$ÛzfC?µÑm Ä“ Ë®îq2Ôn盉–¢—¨æÄ£~ÇàNïT[DƒFf #[/nõ¡Nü£¬Ì rNíß(È ÊçJ×À.žõ -GTL ¨øn{;™· X‡SGKC0 d7kÛjÍP>SœCœ 鲑«a¹Æ¿=å¼"Õ7|DïHG÷ë«5Ë]MBmz¸ßÙ†`ÅeFÕ{Ù§ß‘FíËbdì r·ƒŒ,”Ítg3ëÀ)¦ÊþÌ hJ;P]º|?쓳’7fä.,¬UY)LÎýúœF±6÷b[Б7HeZ™ÇˆÅ”>þ†ÜI,--†Ð B‰–±õ÷ Ì÷X6‰[›»Ë„Îo V]'é|⦔}›{P:ǰ-þRÆ‘·Á…1Ø'PŒÎµ;_—w†!ßá«–_[Ü%7ß±$oÖŒì=˜óë$Å(¼íˆ£¾Xì²~ ;r¤N;o° 4ÕÞHËúzì& Wù=-ãØƒR;z—…Í$ÄØ9•©/1g–Œ+0¢RŽa©ÖŸ’!Ž©’æí6dº2ñHaQÅüFUã³{)¹n”>qÉú{ƒÀÎûÆO}:Œ¬¡xÄb» ¨e§ž4–ƒƒD©m«&Brº£†À!ºýìûÿ¯ös8ÿ¾â0»IZ5b¸Èä‚@Ô>¨@äÑV®µˆ[0]¦)žU‘ƺ{¿@hѶ8ÑÒ|Ô6sŒ %¯.ç|9á†?þÊÝI‰»x-!T“$è37V HxáFoüÜPX(B…g͹QJÁïö) ’3Õè €öæSfÞ…0S¢Ü&ù§ª’‚ú¡ÆYÀ‰ØAuŸ[ªÙZM…S¯mÞ©’‚Z‚–@&kåCŠ´_Ö8ò4­w ‡Ÿ‡Æ*Dj8Ø^›" P‰À§'šþ7ߺ²«iO kkÇp¤V«¢©%=:÷€!< ÍdI4)â¦Ùq†¨rŒùwsȦñ‡\OfF½‚Ø V 8s“OÖY‚ ÏçkRrÔ,MT+"–5بš á×£TõvøHPVc´› ~PkÎêÑF~”Ú·í²_“îsá›&ŸJ¥QG|n"Q!–”çæ€þ… ß(µL)Bb¿Íík9N³Ž²DËÙût ÷8;Ÿþ\òX@,JxNe8PÈC2'scwÙÆ5õð¶oÐ/É'H‡ ƒWqÂÛi™zå_“"Ya‡HN «#’ ²³æ\„·L½a* >€„¾ò~~ÉOR¯x‹h›Waaçç„ôq亙ùÌú‚ü×a˜ŸOŽYÂdA&˜]å«EInV'7ÿÀ¹ùûsw(5ùÃÁ³užtk[< ;¹xý«š–¨¬A(Ÿ9ÓvTr“ŒLòbÙ˜ Ú§NÍÊšúA Ýc°bÜES°k&ènïå¤Á˜ÞßNQ£D\¨ßâów¾ù¿ïx ±£/G\¥pP3þGCïhITZnegÎLZøkÛÙ÷éºJÌr–¿\%7y› M=¥%JHô‰Üy¦ÏÆ À ewøí´—s6A]úG—Fys7숷ï±Í €—\P>Ò¸û¾¢©xeY_ï°u~Ù 2Ã>ÝÉ®¶)n*ó ÖB*ú?º³Çi6¬B÷‹ówÅyÞ6Pxo¾i´â´,AÜÙßÌ »¬ãÐc¨:Æ>’;š G(†KwregLêfH௹¢l¿~· $ׇÐKˆ\Éž­½TîÿŸ‹¡7,4 ûS¿AF¬o½çž!$fœGN9áŸÂ_ÿ4² 1Å~Nç;XšÆð5–Ò‰&ÉÎ!•EíÑkAÜÓRÂõb—C4JÂÓQ/‚^»Æ\ ÚUÝlré Ÿ_:«û@;U÷ƒI›ï}‹é°¿µÊHăd•ЩñàÈi© Åaî=  3¹(À¶…hÜH±ôÛ‡WË6Ѿ ³†Y—%Ñ4äRñ,³qCâÍlÞÏiqR:Æœ<’{&Œ..Ùy(ß $êçݰFs„S!(Öéà±Á.k¨›ã ’mw‡Yo%| rgá=µé¿ωÌ9—¬uOØïfw›~8¨£0 r¦N:ûÂÆOÚ>ð`4û½%n] F|û}Þ²;IwÛßIÜ÷³W*•ü7¢À℉oôJý¢ùÏ)^2=ú&–õ}F½’-çJÛ'޼1°F™>@3{”r¤EPX‡`\ÛÒøXȺÖT*l2ÝÉ"ŸOã1„ã†AH˜#ÿT]GSÈBêŠA•Ò*,‘²òPMø1! väDÙ 2Šx=ÖDãÊ2Œ$5Á€ ¬:¨²Âç8j‚ªœÆŽ,Ü(ÝûÀ ·&¦ áòɬ¨RîûÖ:!oHnpiå)¸ÚöÙÞRb¨rÆ/·ëØufJ²N‰ >pmªã!Ji§`)¾®UžMiHë4L6×ñ¥gŒ+—…9¥¼JM»ð™&p*‹àê8ÜØ_Ê©i-tîcÛüŠØß{üuæ=r¬^j®=Z«Õq¼ûg™è|SÆ%ƒvÅ”{âìr#ÚÂRj&«›Iø™…+`Éçqë9ÏÓ<û£š{x—D]†¨,P„çõWß©Næ\Õã%é`ó%‘LÕxÆ›·,!1ó†!û•9}k4CÐ{(s!ù"ËÖ7 Ï f`²“£H¸ßB5$\ž"’…Æú/­º)®|ªº1® 'å`ÞäHˆ,љǴý¿&ùHW<Þ$Gd ÊÓHLƒ8ƒ¶|a|íðÅñ#ÔÂvó¦íq[~o®ÛÉ:þ¹ŒMs0_KÕ2dÏæåJ•Ó¥ÅåžP 7W®¤Ò¡TOúòœ#Æ÷zWäuÀ÷rËþ#½†c³þ&‰sFÜÙ„¤SbU¦O¾iÈJO#·3Üì 6«m‘ebÁºå6Õ\PqAæá¥ìù§aâƒJ0îÄ‚½DÖØ´«¾ ภ´é­š "*†œ†õÎ(a¥Û”ö»v•ã°ñÙª]ªã6âRmTgzF&†ìH,òëÑv½–ã¯xàîÄ­•öçp %§áÙáËš|ýï±,¡™ ꙢüßNmÚ^Øq+\æ²÷Ù&sw a I(HøØåKuŠWƒ ÂlP£øQ<ß ¡ÛN% _ŸEZñmDµ«2)¦+ÌTb‰È׺éy]± ìÛ[X¾C¶¨¡r¶ÂlêqØÜø^Š¡õŽ‚‹>Ÿ< Í[¨”AXœÜNz_õ¸Š×í9*ˆ‡¬ä’¬Wg×zå*ϤJµrÊ:ÖÈOºÐDLh Ÿ$çµä‚ 4WŠ=ªr«6«ÝûgaU ej',Πê Þ½/d /uF€?Ôd-bk‚®ÊxU~v˜ÍÃö:á Sã%áœmq 15ïœþ9Øs ÛÂ'ü©œmT‚PBù«Àø%fè} ­óbÖR~10†æjµÐ v­Ôî°;©.$ xšTuÍÞ8Ô%ÿ”ë»ã•gaãi;k¿Õ¨˜0Tެ ÐÃ/­_4l¸êý•;Q[BØ«°ƒÓ!&ÿ ·µ§1ÖÝÓßêtèœp}»¶¶B¶Ä„hðmS·HŠˆ( h ¦zuÝÓà¶›MôR­Üd<´¡JŽÇ¡§È‡aör”í¥BéþØ4‚…Pa4wŠ”…ÂçCDÊHZ4¹… ~êõM¦­nÛÆeˆ&Á´ÚRôRT=x&a7Õ’ßû@öÅhZ$º9ƒ(ÚhHÑÙ¹PdžÖ‚½‹¯Ù´Pîîãšçö|Ûÿ:1\þ¹ºÜ|â©Cmó{ á rl øiÃ}ËòG¼áÀÏMr³&ŠrÇ’H˜…DC79%¤ íu¤Ké´,½+›@vØH+c³»X÷º£–œ&Ëðþ+÷Ý}.¥G»k|ø[:¹ˆ Y$ÂáOç,œì“{õ¹| /û™Ä/ŸÑ;ÁwA/+:»ƒOw¸²ªÝ„4AÒy¬ü‡Ð[V­ÿÕ8È” #açzÊ'3|å)Q?ƒF s“æ‡"­ÇWëËÙ€ âÖ åÚEðk¹RÑa±n)«µ×'#çR~^ý"a‘œ¢’âLòš×K?³ÆBç†tHÌ W÷JÜwæ5e(õC­Ú5ô\ ³`Õ'ñÀ§º"’†–ö›Éš³âoÑêMö]ÀA jŒ®o^Óö‘b#«õl*fÔýiÌ™:¤k­½º­ñXäïû‹Ãóõ@ßF×"Іãz—¶9]¦F',­ˆqz9àEÁЃԲŽ:.:FHi½e£ –ÖÁ¼ëÑ«ÚÌ$“z^¸ºfä)-™‰nÀÎéS3ø(9äÙ>ó2–}Ç[—ù.)75„ê]e7wI|@ÎU¤G©bÆD䈠ϣú¸/õI߆hÅ„ygnC¯M«CkÆq§ö-e¶Q Ô‰¹hgЃ“²@e”_"¤ ŠàÝd!;ôäþ˜ó=X%[¹õÎý.×/¹…Ì[tÕ-~o@IÚÕüð˜îMgB„C#´ü!iüj£Í‰Ö-ªà’Ã.\™aÞ˃›*Éèi÷;ä"SF–ŽÈÆëªí(  }Ô›… ½© ½:²¤ 6Oã«êô޲`]Kçë0 ¾­½ç1PbˆG‰MïX]Ÿ;³, Ò³Åÿ´Ç ÑwÈËwý³&©–Q¿/וƒós•NªOáa;p RJrR$|ëxp9O˜ô߉íùÇ଀SŸ-ã)j+RQ•¢“}zó¡æN{²>"¾Q¨¶°,ð¶ˆ.uvê”`(T`®¦ZoE<ÿ€2QVö†_;eöØ=“ WîyiÞ=x4[é`“æª}q¨Hìv©ì| `óM½NÔ4Ô fy¡¢¶äKÕM Wè©ÐH§?Oísôa޶•sçp°qÖ—1C~§4 ©Dr‚`ùŠ„}V8TrC”¥>öÕÝS1$þ|̰¿g?\]Ãè¦m§…ZÛv?Ï`t£ÏéáÕ.¿q¥\aÙÖäBQ÷yKÕ rtW´È4ÁU…`fÙAyu?à½yƒeÉh¡äµöÌšt^ì¿q¼{³$µQ~ÊN™ ¸ôÓ¶MÓ”ÙNÅZ«zi­ð,|UA´[~‰Õ;1¤ ¬Þý#Ì¥ÄÌ!< É²›FuËⳫ4MFÍ7éÓ›Â& m«˜Ý¤c‰‰v? 4m  t¾ñúdé0Æ“ƒ¬Œ?g¨+Š —PÍ?•¼ó&Ú¼M-ªaæÏÚ¯» Žœ„(µƒêß2Ôq©Z’ëð\A7Ï ­dCâË>?øj_ŠU;%6K€è«4º]2svˆìr†û6= z‘=×ÁŽšìrSâ¼Ð`±( VàwüÝÅ_/îñs‹yúþá…€€oz õ¬v²ýû«áBÖ‹… Ö#jõŠ´†¦Ý„fÂÆš8ÊtÎñš¼9œã;ºß+ÁÐÞÐ<µP·/dAš!¿›ÿÅ#Z+DáBOÍõžX„àíûj= ;¯†¦ÉÅ‚š˜"9« Þn÷wvn(à|­Ñ@(Yk‰ESªßWÔÊï߉‹ÃŽòE/¶;l+f´·}éc& º¾V þ)”ȳ¶Hx³Âƒ‘ƒíKÐ"×=|™zEçÔ ¯%%¹HèÛÙ¤ƒÊU5²¬«ƒç5\£ÑìýÃÒû”LJ°¶‰í^J¥•øðãÀ(˜y­ŒK­³IÒª°ž©4š]¿‡uPI¸Þ®x=êÄTÂ’ó"’‚öžýܯ€ªsÁÕ.&š+Cóü™¿R•ÐÖMfC/ÖUŽÆzõë]¯‘á~‚Dû§´[]º5õ)Dô£v ,IZiT[ºkÈèW2Òzâçû“ 6‰D…w±7ƒ2š;ØÍpùÛÍ–‚lb:úE¤wmöår&Ù ûÉ!‘øv‘ϸ™ëÔ(#ÇTÕ‘\Ÿ5-ÍhûŠýzÎÄBç[€gW<ŽÁܹ&{Áÿ²ùº< ¬ô— døŒEWiC?oÑ«DÅ}ÑF:ðöšÿÐß>;îà‚‚ô“5ÂÇ—ÓújÖésžF¯½¡ÑÀì»è!Hg\–ëÕ3¢@ Õ°¬’: 7¾'‰æ>ã‘øë¯;b? ˆª‘eÇŸE ì¡ÞÙxH3z=® –ÚÿÏÈ*ø±ŒL¨â½À:9þúµ®¯ŽtÅ$r&Úý:óéQs<+"«±½6Á´þ5‚ `Ñ^KÙ*—·Lfh9 FO{>$ÚRõ«®5Ƨ>Æ’=¡±—Ü ß6ŒÓ¨r¸E”Ÿ}›ùJ&¦[ÈÑ 5sùuÐÊ5hPÿŸòüÎ#fŠÅeß®ØâäÁ<És0ãu©ô{.K[¾ðY¬?"&ìät±“u¾Èì6btÊaµ*îIþ…’h/²ii˜çt7Í{ŠVÁ=Õg¡"@zM’]jÂT›§VÒº06A5PmS3­µ3NŸž)zÉBQÞyqë'94øŒfxLÄö:ÈAyøšÜ*–=ì93r"%³sÔÌcê2(òûušw9ŸÓ¶ý“¬Q²©ëÑ;ÈzÍB•&·Ý‰óz–ò›`ƒDùè ‡P!#¯qWVæ/×)žŒ¯AQ¡W:èD`ñË µ*Mle¹›–Ò:ë*þIÖ·Ö=&üX1¾…™5‰|ˆfsétЃ{=;«§ÜG’oe±Vs9alÍù¤/åÝ÷]f  Ì”©¨Ô»)CUïï¤Åew©àj³ßWnúU¤!ûƒ @¤TûêϲU %sú<54›D|§?&|Û_‚Þ°©n5¼úaû쿵 ¹ÛŠqaqßyÐké‚Îé}§Ö ®sÞx$„'Û‹ó¢³&xß*²†Z­2bŒ»‹j—[Þnly|ל)ṵ̂T+ Y,ºTgú@NtTœJÎ~½¥¬C“ÊÏZÃX f-ÜœãiI9ZÀúš&¾c5+¸i*Q­ÆPsÖNØœ—a$51?ù¶S:²”ˆ±Òª„À/pp^£7²ôÍ¿þ°s5ä×UÁƒ Ü„Evõ„׺eȦngN§¡ÌÆ{0Ò`ôöB ýQ§îZJE¤F¿sPÚaG?Ù}E,»‘ñ°xyÛ pÌL½ÝøGéÓˆ}îË—á€Ý¦æb¾oì“˺”-H”/Ø$Q¢w¶Ù®sù¾Á;±@n2`Ô;; [-;´²iU U]õÐÇxq´Œðò„ãS Úh\y=%ðû‹Ð·´Xß­1dÂÜWolë¢Gž¹æTyœt¡0ê¡ã²^›‡ #QBÛ¦]uYù[}­›ä2+® "©Cý·n–Fô7-6ˆƒ´œŒ÷Y,0ZûµXPñqÓÊFa»ý…0Ö]Á]5¤ý~Â)q¡ª»yƒùR[~{Pœ|ùmZľõŠ/“šã{ qدús³=eŒà«l$ðj)ÉO×±‡ß°Ëóe) ¢ÅøMg_Œ×üÈ݃fF…òrâ@Oc×nþÀæ^Ð è– 1 £ÖU†qšý €Ü-‰:å°…8cøW™Kp&ñNâÝu4P„õôÊœ6ÕÙó]/²ù /3ÎÄP±š…!Ùa: IK3d”§á‡´Iì´Ñ§rœ/(“B%ùÆ¡•Ï¡ý¬yXmM‡V½Æî³ÄTd§ýÅTÑWê!ÚØ<ómJÿ(è8emÞ~oP‰Æ Ú`»êp>Z_zZŒ•UßßPpÐ í/[ˆ7\Ä={e<-Xë¨pÓŸö…IÄÎ[ã—w¸Ã¤‡¦_ÓŸžéÆ<ìaºÁƇüôË­)KàG·ª ¥üݳ@×ËzÎ|©3ÊB¢ûâªΕ_àís4Ô 2nÉ+?›¯×`èÝp…OX[Â:Ã3÷dck‚üð¶AEÑQÂ8Þ>öž/¿Á›O‰£Öy-Ûƒ‚z¤~” i1ü¨Ü=²ï—åâ§¼÷MÞ'#pÚÔêZRLNYÈ]°ÂO1ôuÕ­ú{€N4@åÓdG¢4¥%m?h8ÚëVІ€ÖöF¸H£¹Â)d+C€§ v'·{±ôF°Ô¤(Gï=lâ!=H²§X#¦0~ïY*j÷gÕJ”Ó§rd;”‘EiÔÇí N‰f¹yªOUg ìœê”×ùÖPz!Ù˜…±¤³ØÉúÃ^w³7‰7fÂùÐ'jQ6|7\ò&’E²ž1=€¡9€ì oJ«; ;Ý'ó»òß«†xU‘ŽèÙöY§Øò‰ÐJ@ /nÅ„c+d-¾DÁ_-ÁtÀ•^S®ëõMÄxBе º'âYßX~.8K@óN;”0ÔDnÔèQ!PÂF¤Šàp-Åt~Ž4¬Ý/8ÃØxµãc·3…‡6V×RìhJr;RÉÅSïmk¨+G#a« h!6Ã!û õ‹—Ž€êqnˆï8É!@ÕÐNcÉ⇺V›C¿’°‹Ž„ A„šœ»‚ Ãkdà÷9ÖÆ=-ƒ.ïà7”ÕÈ3t#9Ià;¹§¯Ã8²GXծᦑ­DļæbßS¬ ñÎ ®¹îã'!iæcéI%ò˜ˆ ÚT¨zH¥øª4K†Œ^€ÇTµs[ÎI—-a4´Ñ§oŽ­5.,ÍùµS}½ˆmîñÄÔPyÛýÕpGT̸U•ÅdSÎAÂ"ô B§ù1¾XÄ/ÝJBÐaç„\àã3’ò†~щ_4A ãÅ€O¡4hËà®- *ù'IîÀÙ=ãÀê€-†L¬ñ-nBcï¸ôŽk¦’b¿zúå-àTš1á!–GMÙ¨¼ïÐJy¤‘¾™è„'#®lQ$­‘wx=ÿåHœS¤w‘?ÀhÜxu~ Ò†LŒ&Xuy?^‚ýÜ7ÁPÌ2'ïlÒX¤Ò ¸á5¦M£T-‡ë ©¤Ê4U YI„z~ ›-5´!j`8×£#vUCÚ1X4Ü«ØñÑ¢mË¿h©>Â-eAÛ»ø”Öm 0¦àè"ã]è³r¨E¶ÕÔ-ï¶™¿O9$%QåÁ:²h¶4‚ޏߓÆÃEý2K89°8õpÒPN"Ž Â@`d//â¿TŽ_ p#‰6$ #Äü÷rÄÓs’¼ýªg °mÈýÜ'´iÑÃS~á;÷@»¸×Y°¢ü„͵13¦žl'IÀz Ù¹M`ת À&üºÁûWq¸î‰ùkeÜlŸ÷–<\ÀÕïiî IºÍDž£ÀÏj¡üÜä¯ývTdâ'xš¹puú6ìíÀ@Ï^‘q÷'urN`tÉÿ Ö#*Š\¥×¦ôÄ.ÏÁm­ǰÊ=¼! ˆš…V„úŸ”®¹gqËzî 4%«‚FÕ4ÝCàHg |¯ú‘Gò37p¼ÅôcK/XFÿf™_í)¥—& Ê0Ðå".vk(wÛb­ì“hÀ饲Œ¡hûsêàËÒUà+ù…ç0ÔÊ'^Ðî˜ÓiYè ²¬¸÷,?—²{7-Ñþó- ûÔ ¨Øüi¥·³šz_šåÿ3o}ÌTs+¾PÆÖÇ\û² ­´:ÄPðPê/s§"é„«]½ßÚãÆþ_MN¨îÂ=@¼-Ó†™˜EHñóü™‹Û¡ÑcBèûÐ63û8ùéÒŒ»ÙQCò3/–/×L)XƒÃ+Ç×à8¥ƒ…‘ÞWžröƒw¬Öê¢ØLv^â1 Æ'¤1e«åu›€Fw+´CZ(âlVÂè&/!&+9µá_ÈûŸèÁýœ–²~RVFF„:õâ]&áÞŒ®ƒæKè v,Ó€ª%[ª¸í9€¬€‚¬ƒfj¾Ð?!íÑXžn‹&%®çé'À‡-”èªM®ÕX„ñ¶N梎Ð0Av[“á?ÂÁIÀ2/oÞ–…6âA'‹Š5ñ;•™ÙúG>Å+I_™ïèbJvªYÊŠ¨€oå׿ù¡»Ø÷‹Ðqš›‡sØt©—·,p_IᆕR;‚¿{ÙùËP«1¶¦e”¤%sûK8‹OÜ€²M7é†|¶ÄÜϡعÊ.Þ·káÑá^éuÞt¹™ñò޽ã_–×m¡¦äîÔ×ÞtÊËá îÞ,Í7¸â=¬¥¢Q78˜ŸD6¡ƒúÞ°¨¢¾Jޏú°È°rBŠÁ ±}•keiy§Šžè v0ŠšÎru-lö š2B<šCy½å†Åª‘xC϶~åéœÇd<èí©Ëûê)øÙ’AúE'±—ÁKsÂYbG|¹ÛD•@³ž„5·qn¡Äël³Å?mÔÆï™öªÿë<¢öJ£ëšB°h·ïB ©B†ëÉ ÏåÛÒ׃#!ö” ï†<²Ü ´,âѵ’Úñ0øš;5_÷u’ Œá±Mˆè;×õy/ýÕñ~] ·^zïhàsÒ=qqlCtˆøýÃy;’­8›øŸ‡ûÇ{&Øì~ì2¾S!Çþ„Tʨ¼©\{¯&æ suTÞìpŠwBn GPR¥eá%©…½€hhG¹ØIÕ§H§qgwU<-ðÁ¾|»ÏE‚È] •JÛÖ,ý—Žx5²“ÊígSg‹Ë󵿷f)ŸTܹ…M.P¦[NáÌöhì*Ãb(vÞ¯M3óY@£‘¥0›KL¶P”²ÖH1„,› gŽ2¬H}÷u´qÞ¼À‘öÚÛ)^3¨I bH’ ÛZFAÈ¥ƒˆvªv—ût¶ŒÝÓëÑKc§tý›;w™Qãx¢ø£Èœ^«°¤ - QäƒÀŠî¶vò<¹F¢© K¨é¢Èâ}`Î… {4wäº@9HÛ÷À6#JÓ$6‡2VÔ†o(û¦E/žç®ÍÝÚš Åï/Q˜5ÌØ.UŠ_dGã¯WÐê,âÁ8,,Ο⌠‘ˆ_§# £ÅÄZ cå"( ã0²©AÛÙnΟ8ÛFÝâ¢÷г¼Ð°+~*`y¬¦ºÓ:ßvµÇÈ/á0nšNýv¥<9­¨ÇþUÄåÏéwÜÿñ¿®GŠ: Eg¶Ü%´9Šã{ (0ŠXŽovž.床ñ å–Q1€‰ac`GÔüÏS²šÚ€‹Ü\t5AW)³¿+Ïú”yEÈYÚÆˆÞöê³Ýã³#˃!%E&†91z¤¡Õ§hÛޱë–í}pκ׬hðŸjmÛb“MtœÛ:êm°k„ó­``>äÀ.αL5Ï 5¿›+s tþ&}–Œ&fË@„çŠ ˜-JŽlÿ|±¦,*hsšÐEµ÷º˜‡É¼M –ts¤Ø¶Ö¡œ R@Î/58ÔºXÑ“€å¥¼n «ê¶ëO¸à“_Òðx&ðǦBj˜ì<¸A‰òq¼)Sâ£MDß §‡ùX§Ü{JYÒÁ€m Š Á9NkUÅùžÂÏÕÓ¤ü²B¶]åĆӋ³6~dñߥ¥8ô™ÃÎÍ2QÑâ!$0C‚$ØFþ[Tºs;ú6R2±˜âE£ÑêÉþ=ow|SFsg¤€¯æ«Ñ %ƒ‚= hÈ;¬—Y¶·£‹Yï1ÀW°@™A‚i€NÇ´a-÷aéÜ£à´{„>“ú­o$œÿ»„ˆä'Ö¿š)ꇑ=øúò³I=¸—]Ú#•1п£Gb:½NÁGŽ <êbt-|½I§òçK>‡[NB1 è_m%MgEü!g{VI@­WJ[»JÇ((:éHæm£ože‡6К ΪM T!ž”‘KV9-¡{>:5bï Œ¦?ÉïØ\i¦=ì*É÷MÞ§æT²Ê§wê‘FR¢J÷ Fî‰ðÙÒíubvjÕp/Õ£ò¸X×ïØ-¦…“ÓÒyR‹T Døy¨)õêœ=œfÕÝRй˜«îö /ÐÜŒÖ8éÛã*]rU—žç¤ob¢Ñ=õ\?0Œ• B<¦p}c^.ñŒ·>ï\¬&ºçó§€|ú3±F‘eŸhK‚ÕT÷ãÿ<µ¡Ñ{vNmÝP>@öUd¬rú=vO7`LÔ¨¾Å?×ZžXþbHF‚ŒóÎCŽWï ë¹€ÃnX@¹x`>m+š7ûMÕàCj¾‘í@êК»cb‘{&SYìþD ´L\´zÿ`·‚Ïžmcg/‡°|ô¿ò"³÷%÷ºæsuÍY¿qögiÁÁŠàCÔè"ŒËöЩ”%pX¸Ì’#j|³ÿöcýÐæ5Y2Î8“æGI=vÿÜfž[š¤âJðWÙ`c÷và……|Ê\K¦›ÍEÜUnŽM&V&ç@)Ê!NœÓÿXô[}ïïMkÛhÒÖbJ}–l‰ Yýµ¦ÕÔ¶´ ¨2 G©H5)Ûé )Û ¤ëâ¨ñ@QÄóµ„ä$Ì,v©å¬/4?–âiˆ \NÙ ¤Øþuj‚3 ïÉâXþÓÒ‹l4ÞO!/oPÚ7=¸M¦îû´},dã•–‡‹U²ÈÑd…ǰ•½^¼iƒÇýÍã,•‰õ¦iøìQ!~«F61c}„*ÉÓ¨Nðæ®‹Âઋ1IÈnzÝ r›”X,‘V5¡¥‡?O>¦ÃšX¦hÀÜ,G.ýàÂg5˜90ï#Z ÚR;¦à$ë¤íÙƒŒ+ôéÀlØ ŒÃƼXrë'zóm,» H¼ ¸ë¨A Gèø³o ³Tb‘dD|„‘èÅV|âà¸B†Ú]G«íeê›YÍ:†ê@ÇšÖž%=~4·]ïNó¯ÈdâMFO­Õî…)8&h}Ø wÕgàP`.ÔØ¾M΄ž¥*÷¼CxÚá|UøQ 4jŠf܉ýàç hQRî$äl @Øé‰¾ï6îH¶²î7ÝשMnëzU۸鿵û«ü¿>^n–õ„¿Í}þO7‰±ñ™b¹"¨ëÞ,&læ®Î½pe1NaÆA]˜äâBkóþZ)„i+Ua˜<˜Qr ñdµŠIc:ešÙqqb<†`°æžŸoýSEíO“¢°55TÁŒõ º°3Èú—̄ΰ¹‚s´þ5ƒdõèᾄÏ#n »/ f8RÛÿïZ–¶¤>®S´œm… IÚªÂÈ{HÊýã¡ê¿Ái âõåè:(V a°ôʆtÔ¤â€EtȘŒ:æ«m¶±ŠrW@éû´,B •çLÇÐ0C å 1PÉ~âþ‘ýnëY·ÁµTÃ…Î?™Û—Hõ@™÷Òq¨¹6¸]6€[›÷´¶…z‚/×>M¸ˆ„ 2}×r¦¶¾°¡ÄÛ1ž¨`òS2f>Ž¡Øäág@¼ FcU†®Ì´e͇Þ8 k‹xþò1ŸL0÷‰¹htåÁÂDpCm}ÇL-ç¶ 4‚µ“Kþ B÷²jJ±c¡BÊÒ/%˜+µ+’¢W¥ -ˆ7øßK+´@N<¬¡N—þúœåŒ;…ܲ?Äè–ëUb»Gt“3ezë! êz-b cS[Ñmöh«­Užmî˜m`°•xx:M †VUšP"¾á> Xç™q‡ñ¢ÙßcÕ‚; m–Ž›* …^˜‡]°t¦¨ú=ØPÿ¤Öi“«9†éSS\™ÉDãmE!š†Öé+Oôª<úJW^œe¸­Qi qC2»£bÔWÌŠ}n¦d¥¼”†”1‰³Âcg+e…{;$Õi|bp•6ðH1û™LXˆU7ÄÀó~•«W™V»%9àáuQ~ g¬¸Ô8Šè0H†§mF߯õéåý÷É>Ê0^FŠög6lrߎ„¹©ÞDé¬|Œç0I*VÜ[V/f=È™÷2¸E¹´¸d¹ÿYØÔÁ‘G\w²Rig›þ”ò@ŸõJ„UÀÕšõ@¢Ê]È@LÚçQƒxã+f@Yc û 3rÞ#|à¬`ÿ»ÆÍŸ1ì¤g»õ-~ÙšÇÓç®yÃÛ•.ÕÄm×°•Pr´ë§–ùÚ2®¾Ü´\еꈕfñ`î˜í^ê!Ž4(eNtîa‰m€Û~H¬ŒtÌ{|¦_ý¢âòG|ft´¡½óÒ8B|æß¼ïyùôLÂíªõÎöX^q½MÕå×ÃÇRÖ¤"u׎q ÆZkÛäqM)~»0Ø¥Ù-Xä™(ŽõÊ“ô‡A‰Ã†—ÛBÝ™Mómqm9ÈyÈ_6 Wâ—§À+‘×Ç' AÕ×F”³Xâdtª÷Ã…¶¹„ºne»Jƒ+ñ¢F*C/¥wP§ëÒj¯^ æÉu·B6 À¸%5bŠj¡'dM8‰5"éèm¯4Œ³/­I‚v6”xì q>RR—Û6Ë\¡¨·òiØ”ÕÂÉïÌ:“PáÑ.8Ftþ©~yŽ/¯"ø8tÐ*s«²ÕÿÄS`cÏ…öíÛþ{¢Ý¢ó«aÑê1Xÿ!ÀpþšúÖëÌÑý< ù¯füéuźÎCÿ>Ëþ~!i4Ø<œWp*lßm‰T¦–|Íf£».Ãýù :éÝ®¯Ö&§xÜá"&"7²—“ j»%ÛfDLÄð´O¹ˆ–\³F‰|/L‡¨JÜ€49£$ÝaN«åKÄíYíÖøzíØK´²C.Á±÷%iÈs$–†«©©|Àç…>¦Ÿ“oÊ5A{Äì®Bôûκ£Ü §×@º3 ö/¿@^¨!]ÒìË™}¢ÀC¿(‹¢¯Ì‡W7—F;Ù«Ë‚§  p;ن슮 5ºˆ+"[gíNhî1J“㘸¶¦Þ°œ¦ú­ü³Ü a±£Gqð4$R±Ã­Ã­ø¹Ú¸vˆï±”v@ÏaŠijÎÿ(BÊN7ºàû Í引ÓhÜÍbí?€ ñ_äð2*E’È&0§¡ªl‘j£w"òŸCÜwk0ž7 A;(•ø*Ç|×—ËÚS…  9ª|*Ï:€æ]ø•ú›ƒQMcDØ5”N˜Ì—7ÕW å:¯Z&¸€µ¤”;ÚK4¯/ë:©_+ã@F©M²ÈÃ>ðÏ“µ¸ðŠ–ÀA’òs&_ÎÄ56rã·g.ÂFϲmâ†HÚ|(jJ œÇ¥Åžó³(pÚß=ÿW2&ËzoÊ3"‹‰Ò·A* FC=UŽCuƒžÖÅçaG¬2î ˆAR°Í[/Í™;¡;e‰ B‡ØBô!±=7ÓH—¸àXÃ-樂;Œ§ n˜*vÝ¢†S¥£¾Âv†—Ó},ð6=…~–è¨ß¤Õz4qïգ߲žsw§ªýäÑ@+‡KÑ1‡©‰Ë&؈Œ O9’üª¸'è»þ.Ÿ¾ñ¢HHˆÝº7ÆÇš^PÚµ õŠ´‘²óWóSP²Z|Ñ’Í&ÆG‹3täw*†ð­`»§½×ºÍÑc€¯ÜÀ´­§]Éz´«]¡Ó°7î[(eÖd¤ˆÔ)´÷UolrM²o/4ë e ØÊ<˜d¨ÁÉûC‡`ˆ©¶¢Ý¤ý€âpÁ%„.Ê¿’z€ }žO)‹,–¶ãa ‰÷+äöÁ+»"C&D ]aönŽ[ñ}dÍ1ÞÚRÒ„ìÕÛ­¢œ@éýÂH6J3B攋\¦{ ëP ªMWS3ã¾a§Ë‰­¨Ùa×NÝ€w!m«%Ñrô?QPö@ölCíP]vÓ±MØKJR©19fqŸØÖpw³å#¯– Ô Ô?Ÿœ‰ mõIàÉˤúœx«!¶¡‡ªrÛÌš)¯0:* ËÅÁhí  "òtÌo_æ`M ðZM!ቓ²ÇÈÊM|pžYQ®ZÏp&èÑVAiש6„0È6ƒ¶<0³–©-K´oRÇNÕž‹ÀÂÍv°“Ûw¤—÷·žq”åŸ:9,@•—•ƈiƒ›¯½eRZËĤpÿ¾ñ‹hït•1olÉÖg’ÜíúR¢Ý¤Ñ^©Q‘®)…u‘=¿K¬Bñ ’ˆŠèÌ[E£ðJ˜ù×Ò‰,xñÛÞövs›ôÄmL“€yÀì—)`c¢½ò›ô¥ÆÞ&R‰¦”‡TvEowÎ]'èõÛ‘•׺œl9„1‘‹€`¶#+´ÉŽà+)šÈtéÕ‘õ W¶åÿ'A(O·Úõ/ÿäáèNäÆeœ4—M'‰¹Æ‡¡9)ÄvÅ7¿~bVíkÙãñö¬]'b. ÂÞbݲV°ëwŠyŠòõ8í1G˜uÔ²Ò$¸ù‰áR€uóTZ„ág79ÛÁ䃊ëÖ£±%ÇJùØfù‘JÈŒonöm) 'Â9³Ä,%!ÍeD eqÄ4 YPIè"SžÇ({öñy™@æ»u»0«ŠV:þ )ºÐ°:Üׄ/c®_• ƒÁœùPJ‹ùj`Á¢+êÇŸÒ>cšÁpº9’ð3g#æ¢ØTM2XndžA(°îÀ+íWcƒ¥×%%oá:‹Ô†iúчӌÅUSI¾þÔ±—G–ÄVYg ÖüC¡bðo«ÖFøOOL Ð’£Æ˜Ê i!*[ßIóSÿèÑó ²Â¾eqxeG:–py•Àdp~ä^[f«´øš$XW—ì¼ùã³J̧Á-æd\ý_3_Y޲ÏÁòê¢òç•ièÔÔÅ¿+©ËÚ?e–ß= lÉç ”à!@9 —Z@y`j}î2`7¶öý Üªµ}Lϵ»©£1c@ÄJRÔ†[k†Á.Rvfꞯa¤ù8í×.OFúLšò{–ø~|áß×U'‡‹þ1¼éA#N¹sU.BGY™7oà!MÓà ]™©ôÏœ2¢}-ôb«káàÉÈú|ûNõ8ð±ÛjëcX¨Ñ:¤k©åÊ+"fðÝs¤/›\¦¿¿qD­(—Â&ˆ‰SÃ)p‘Ld‹+x«O_‚Ó#=_IªÚö-“¸3tµ×ßî±'‰-ç^#£#[î¹a2“! xÃ<{…ÄôìÂò±ˆtZ§yêb\Ïw5@{ol‘E6‡½Ò]׳öç°ýƒg³ûó%iHˆVÃ4öM¾EÜ?]¹R6Ï®ÈÄ«X$¾c"yŒRÓþýµÌSm³I=-ñøÂ‚Žx"Hµ±ëZHÊ žŽgž‚$ç}î‚bVÏìf& 4ñ*öE;Äõ•¬ ™VlE†>q&(OS@ð8÷Úº¹<µpoWkX,¾Û‰ … jøH¥ç4Ö "Økr0\“Ýd͸¦É“Ń è>É®Oãƒë¡ŽŠ,Ùveï˜qÁuÕÛO  t9RK@E€øÁÿ€z\„%œšP;?öDP¿Í*tì§xvHlÐyJ¢§1} ¦‹3–RÎþÆ8" .CrW„A ôÊž‚¢x¬z_ƒ²ÿÙ%3ˆµú§-t R( ‰—©–—†ýD7âYߢÃr$ˆKã$ùö µ%Ï ùÛ} _©©7¼»N%•o%wZT¶#ŽõÆq5„Æ0§7r:û©Ë8rÙšU¾ƒ«ò†—(çM!€336p·ÄùH“—?4ÅO²uUïÓHÄ"ó\øntå<ÌzÒ4ò>«ŸûBû$N£˜JÀaBõ‹¶/µ’ ¼$‚ݤ½yô[‚†´ÃþMò{Ý4æ;A”hжÙ³~Co½ Žé²ûßã{kÛȦ¾•‚Ê*B*Æ×Ö³ÒLz1ö8ÔêÁ¥SŠZƒùóÖÜf nÄSUöÕ# DÉ÷zïÔveàÒYê¦õQÊÆÓ.kÇ9×E:Ã¥Söj²§¨C°2¯œúøg›“Pÿ!+qÔ Ýüž(£(ÝϤR|Ùìs£sºÜ7Ó«HWqÈKÚƒ¯YÙ†Ž«pÀr_»‡aœjà­l4ïT†„ÖDí™}½Û±;?d¶S±Ì‘ÌQ#6Q&^Ëœùýƒ²}lš,¤fyc²/£ÒÆrü|Xð9 òuç.iîÁŸSp´NÜëÜÉ'– ‚Çã?l‹ˆû˜÷Ó­cÛQæQ¾T­rYö:6îcojióìïÖl¼Ïw_1¾Ãq]¤ ê67}â›Wß×ëGæÂ©üT1 @ wO¶û•‹H[³Ð†|TB°nøHÐì,ûWms2¬¤®1*p¯jJöx¾O«†~kè Ÿ|Ú¾Ò4’h¼3}ÌŒ~¶.¤"ǘ©Uµ¼Ÿ~Ѻ<©3#ïᲸÎô7¡…á€]Íìè|Í”v‹× ÚË3Lªíßewëî€&ÍÎÔÊê”=¤ra5 Ç®õ9úµ¸^Sê†À âžÁ&ÌÛÇ·ø“L5\ê¦#²4Ë‚;¯hµ¦†•†y¸ £»Û\W¨ÅˆA7¬±èš—î0ûסÁïØªZþHŒx·»`r-…¿ýá ¡ìi¹Bô]V¬Ú­àÕ{ÁCeèSž¶4\Þ¿# ÍK?ìIÛvª¾ú’$¹S•¸&M›€=ÑSŸÔ¶ñâ£놦À}äìd…¦½~*Åxb«w0òf»Mýû™“dŒJ¸¾jɦÑ×@eŒˆpkÞµ çýO^ò„¬ˆ{¼žÕüÚß'å#þÔd¾\ÌuèS© Ô@…¨Ì'ÌGµÜEA›Q‘£ë.¥EH!ç/1¹2Y_Ï-Y;VS]O¯k•¨N¯1)"çÝLÐÛ´½j¦L53Ú™S$tÿ¼§7¼AØ(PlÇ®³ÞÎ1Ësל‚Kªæ!QaÔ>f°¨–E…¯oÿyTÌ9Ïb>.y峇†å Ç‹–qþ¶‡†Iš/ä]5kãs÷È$óu*6LEŽbjÉÞÞÔͪ°¥b~ ôòa½øª”Ð[º]WƒZøÚ˜×Ð8Û]PêÆÝURÒßP3 lûVÔ}8`¯Á÷óøoŸŸ´£½ÊŽFgmñ7zœÙòECI ¨¨Ô¨iÖ–vi7«X0è+M’O¯É»Û‰ãã+ÐzÞ¬|Ë<±%H`êØƦƒ£>ó°ÝƒìN@#ºáîgcÖép…]Mˆß€b°-r¸º®ÝUä©xQàõ‹­$ïÕ««8¢"MaYô޶ßký<=©ì·N€ƒc»d¯vþ44fcTš(ô3[L\ÞÕãF/T“O]'9Ôºy£áù|!p¾ ,/Q/à Ô-)±§ªí% Ÿ¤€¯Dàd„¹¿ÝŒû#ÅçM ˜¼±­1b(`0ñÇRÄ‹ç¶HÅùê+Wñ;±Gã ƒ‚žV§_…> £iL¾?`9‡gÌê7å½Ú‚]÷µ{hžž¬g­û¥øô,=7ŽÃA_a5°žpÁ4ÎÒç=!{íçŠk•ˆNÜ·ÝP[bìÛŒ½ |Íœ[\’Y& bÒáH¬s®5c¾¦£´'ãG©v\¢ºR#Ï™ÏÞ®ß@5ÝQrñŒR“³nÁû€ôÌ:&‡‹Òsi²}j]0<Θ/#(3¢ ³…0Šì< ¦¥eicT@Á¡µwu70î%U0M¥JÊZçÞ*—EÌŪ§u‰ì´Hq’ʦZè!ÔÈkF#vè\Ž„Ñ(c#»gåª;¶›u6Kûâ)±ßY銟šŸÊÊå>yÈɔ蘗ßÁ‰!܉#!ì°)9ÅTWÔB ùù!ñ–ÎØ·¦öß{Ñ,‡ïhd¡ê)=r)šÄú˜™ª,ż·îÊ?*/—ƒ/YÖMh\•f]³¬) :[zäž ½X­ M˜ÿ÷ž¿{œé‡MáÇ(Än4ØÇ©¦½zþ¬é«#Û‹»Ùöîp>CWÜËóÔźóÁ€~ÉA» K Ò¤\!‘:|vz…[!uæå|^~š\,‘+•†ÛÍCÇGZöÅ~ 6M¤qPa‹ Ë ûd%'áäã逇)è*0äëÓXóDåŠ%Ù³ƒß‘í;íÍÐÃõÄ‚>œNªšÎ$ù³tÇãYW,ë»?¿‚)déP T£n!˜NºìÈy²Xe`i_f{3—ÝÕ½ï]µjµsø[´7ÆÄ¢ÖϬT*„ tÌžu×nkÄáÙPÙÂrš“tPÏgÛÆÒ‚©ÑØÆ]|ýÀ:ðöIãÍÊ$T p^N[ÐË Â…SI/§’e¹u¦õ{ù@6Ót@Î’g¥â.”$ lÕJ/« tº*0DŽú-8®±¥»Ù¡bžãïÃ(í§Í~G¾¿ç‡ Æ\ÒóÇQ "*2ÞóMqÈ¢HWþ®Àd9×Èœþ™îŸ9šHC|O`pc=^Ñz=R€\Ç/)áÿî¦!d&³ãª5ä'•ÊßýOgˆüÞ$ÿðe™°7“ˆê‚~øtZ–7ù¾Oÿú¥‘A1áñO±nEXI®z„Ô6ßêñÒaþ0×å±Y"ÊVl¼Ë¿¯&Èd? ‡9ÔJd#údšÄ¡´š~ˆªÓ7fЍS¤ñ¬»ßœ5й*$èú%ÁH=T¦Ï‚*¡óð%‘ï)RVG"ÄÄ‹¢ˆpZƒnÖ-qæ‡þ‹€§êgn7Áþœ—¯« ’A÷CÁRçz{­0ÿEa3iw¹#Y݇Ӥ‚©^é*CƒÄÕÇo†Þò›û Ù%æHkÙPÿ}ŽÆioKXhPÌ5¼T©à2½2¢;¼ u¤ÿ)@…ŒC$àì¾/Í–&oJ}ºÞ,7‹ž˜Ï/ºæ5ÿ  –’ ˆHA|“‚¾àj^°¥tï,N{R+.¼™,‚åAÍbuIÔÀé÷qFÕŠ“šúÎý½0¤V{ÓÌÁ(~½r\Á6Éœ‹XÊZ{>² c€Ò¨—ú¬ð+»7« €ê:}äÌ£ÈK¶Æ Éù™Üo´ss>ON2aò1Èü­ï*bß«êô×iä;…òZå$$Ì7*1*µEwªF¢Ä•<)=p9^^S€Êz,ËДC¯åí+gÚi&p§¸Õ-8&ß&ÓÆfHô¡xú¢Œné(ð–%ÇûK7§WpÏ&—­dXþNv® Äë ^Ò¤ç$̘€á‹g:j4û¨k Ä"Àè•ÝÁÿ5]£BD™Ý^Íb3NÞКŽ²¬"œoÌÞ>4ÒµpnUë3páBâùаm"‰qˆ&Çóµž9Ì·©MTÈ‚5¢ ÐóùÅü;" œ¦ìK‹íýùaŸïùŒ&(^[Ø¢¨m7›(ïrÔV"„„]6ŽZXyˆ#'ô €„Fà¡O£òX»N»ª_«ÙB#b2°ûrÌ&Ϲ¯ô$]ê(übVI\8M®/šìE-;Ÿ"+¿g^ꔽNèΧª_Ä:&’·0ßM‘ÙööZ'Y~ÝA¤¼œ÷rÏ©"±™ˆ¤~|I@o%,akâ,Âo$dèg3w¼n=Iÿãöëweµ³h—Ùûêhäà¥Ö³ñÎbhçåâ7h׌FGöøÒäŒXoGoí;‚gø¬p„Ï(ª;R¶-ÓÖÿ,÷Cšã>A…oP»ì|_‰ï¤<4PüØY‡lúœî:95GxÞÇQ0 ÃÒA8Üöس£v±R­¦>{õé¹SC‰¤òƒóM’æ^ÁrŸzŽb¡™&]£gú90Qís‰—/Þû°cÄŽ¨z\x–OÖª© kÎjÊÔ 7ðÙDÚÚÚ; Zýî°k ÷x6šŒüä;¥p©ë³“fˆ(Sj[É«x3CZvÆ¿}‹®ô›ÊíS/£…Œ ¶û‡@œƒ ñ²:à 2Jêÿ0hÄï}5Z~Q23«Ž MYôèkóJÍ·fvø=m3É{ÉåÛ”¹É¢°1°–S󦿹“ Ü69lÆ2mtj§Í¯#àºÎžb|í(¦IÓ£^&QsŽ&Ñ‘˜ü‹V‰$‹¶°o£·ÓFô²$Õ«aŸáÒ~Ðè{âpÂÍÝœþºhö5Ø"y•šLέ$ÄÑ Y )Õ«RA$ à v©†·ò‰£ÚK”$Î`ë­ínºìN'I]L6`©¯€_w çð›þŒóÙ<Ë17’u½ñÂÇYèª)^‰Ä™Òh€„£º%÷=g䨃ºhðôýlåÚDð>ãûí!cbåˆyRK¶ž06Y™‘)¤ÔyTË!˜¤KöwnYVÓG‹éŸ–/Œ” ª[!=B“_Q8ÔÚ!¡’çp›]Ÿ†¾@e’ºWÊ0ŠQ³×2¥ ɨ¯, ÆšÌO¥¹H‡YÛÎÆD[™±‚"@/X(VŠT p•Ñë\ûë¬1Röä*¿ySkŸßÑK‹–Ø $ªÍZe<²Eó¥½mDK,Ïá3ŽÕ›@’Ëpç1ìÂElû• i 5/ðìŠñ}d9¦Ò0ÿp’ßzæ\WÒ‹Œ¶?{Ìžë'F%Ÿ¶b›úztNEÓÏWÈ‘+lžAÛ',è*7Jú—ÂÕ\Ð=4"%s?—å*—Z´â —~¥–†A©>ë ¦3‚5"x©reWÑ×-ŽÑ"ÿ’·¡TÒëЪ¢zek¥®fAç±dãzA7êЪoé>M^õTü¬£›²ˆ A ª!‡Ïé6ÿÞtSl?]¸Yì¥ññjrñ—g,`.5„¿á4(¨ÛltçMÿa«˜4Ž!ÿJ;óù”Œ÷ºqLȱũN¼ü¯«©#ÉÙQæû‰–vŠ>ƒ*ÅC¦¹¨t0|BPÑÞéó‘-ßì!Ôþ[éŸæÔÒ¿Ÿæ¬´ûNš+|–lú#m³~2tÒ?Zlý"'w11)È"Ÿ­e"ù XÓüø½EƤS¹0kÁ°õnÿêÚËšl‹3ÑŠ:$­ªµ2°-h`)‡oý+P¦Ê1 Ç>ŠYè^—UÖ™ÊLÓOóÛ•¤ ‚z/Âêªî»ÎûhÍÊn#ñ]°í†»ãÃí;ÉÝb(‹èKkM(Ù…!F"?Ž¥DŽ7: H9bà­\k\)w9ènG¿!äÙÌ×I»ó+ «Äï0ɤ­ÌÅp ÎÔ…!Ù>XêªÛ€•]Ú•$®Ý6ŸfµÖ¿ÆzM9•¹úžw@>Rå‡B‚SIíDŒ^I¾WqþÆôè¡`Hg€Ã{Dg¬ÿŸ›]„šð¾—ýå5‚EåШ¥wÑ–u5Öêægý}0ݪúQo6¹2ëïg½œ±íx:ß'¼ÿf>$¢ ß2¤qN ·¹þÒNiß²=< V€ÃÓž{’^öpQÔ'»¨y¶8á `zö ˆê_»”úåÇóú¬¥S>/%VýìäBªÑ4áß?™õÔ§mÒ&ÃsçšQ•’5&›1º[vk‘Ou{ 5çŸö4§¡ñSè:ëB΃­GÛid{Êu.T¤>æ!‹; ïD4ôvêF¶tæßƒI\"Î4²Äõ¾ã©I¯Ôý¢šäÚcGHˆ/F ßxœ"ÚÅwwºƒÌ…Œiº„A5|z50 ðÚþòßàû&“Q†çq˜:êÄ(¤øÿZ0‡©s-¯Ì rÌÞcÐè{^d^sÕc^Á,›L6] q¥¢*¶ºˆz­s-¸ñ¼Àõò,/X!B ©Q «üá”o0më&xÞd'ÛIA™+²÷(ìä( ¯-ª[¤KB×~nÇâ¾EzLý³‘Ëd×P/t„D¼œ…ã“ T¬õ0a6¾Á~w"L«ž?µâíLñ¶G>1—s:¢Ê°È«ÿ²›±Ï2=+n+U"ÄwanŒºõF\L(6^&™†ÐVKèÂ$à£3Ù›t° [>Ž0'N¨Wïõhœ Û&vDüoxw»ŸÆ É «58]mªO¢c5Â݃÷/¿Üm‚~÷»ö_XgRNàoÐFÀΆµE;nò ¡]ÁŽÚ¸RÞZg¨…¥©R)elå¦2±{›§ÄIHŠƒuYùYbJyË»ëôo‹±&\fFH iï…‰ÿgýi4Mµ;9h!du´ tECïéÄ´ÇõÕÞªsgÿ”àšäY®ó–{¦iT)]a‚b#a_|”L»aˆŠ_ön&s¤R‰Z~wÌåóI$‰zl(º;ÆIî3Mµ 𥮤ïðÉ8Rï¤û'“Qý=‹¼É“†9—¨a⛜Aioóù¶öÏ›?4p¥·ÅF²;7£…[È»™nHïÊ·òÝðHÖhò0³q¹TmSô¶%ì•L-¤~>³¿Cî‘3ÜLL.»¬4’höX±ÍŸÏ˵E*#n‡:€èwm´ ¤k]b%ȑ޳1óú'Ú#ôƒôõ^-÷ö–—©<ÜoFg§?- +£<Ñ@ä~œÁQqðò”MäkÕ‘˜"ª2¶Äk|šÓm‹_:¢‰'NrpÞ z‚G-›bÙŸÓÔÔi~õè¦Ìy¡¥7ëŸ^7…?e«Ôç“ðÿDfyóˆ•u‰¦€ 94Û¨m»†ó$Ž—˜:LJ]Œââ›1gðFðk“« $±u ¯óG%'ìå1>…7ól㢵ê›y/\–´’¦N—ζ 'Üc™lQX0§¸Ú§G§áã2¶bŠ[Å1Â+õ]àgHÃåjze’ë÷á-Lšä`3ÞkéÍš âúj³ÊCÔ”å›W„ìÅöúFi…©æS¾ÚÏêèË)ÓÂØ)O¿Žü£4læÜÛÇzþ¨€±y Øœ‚à`’å£"'àX·sÛ°»” $I\”@—µy½¯ú7u…‡#YvÊûÝÝàÃ\vü–Ùvb6.7·Èâv``aJžŒÈ”h8¿{OËeªUÅõÂüHøã§ÓŘekGb}‹Yœ/·Ç¢š%Zãß’Èׄ`̧¬«µ0¹á€ˆ $|ÜsÄsH,høy­”¦±áŸ®õä²Éþ§*ÞlætÊvgåjKæ‡}S'­KŠÙ—Ó§iô÷ŽÑAÅ;É(aj©¿c‰ÍRðü„~‡ižx…Åœ³>;JSPðÒ+«ó 3†-@÷!mÿpªF¹ì´ñù›ur­2zoí-2[!ô 1î 5–ËmÖOP)tîq‚£sʦ•ò¡ª9ÄDÅ}Ï:™Ÿ­‚!ºÃ Î? 0nÕxüäXGÇR1˜¦kEºÒuæyˆ¦t€z(ؤòªðí¡DÃ>íñò‰(âY¿Dr¶œb31›üÞ˜ZÑËénNºg¥Ú o oê™âf¯‚au‡Á¨UÄ‹£™&–·2„ÿƒ/ÒÏ;gÂT IrâøA…Á<,Ûò0¨<5ñZŽÆDTs[Ý }­›ûW¥5ØñK‘rñ%’ç\æÙ5šBUüÁÇÀ¿köl;‰x.œõ™nsèp¨šÎ„´íbÂ(.…5(6²Â‘Ä0=u!SCÄb+ÄZžkG˜‡=‹•¨1y¶ç@‹lD; g]güõç"?D–®¸K‚‰w„=é­Ýýª$í{AIën ¢šGy_ϼßB‰³X!?ô½c³*Ž8ò𠡝”ƒ„*–#8íÓp»Ñn¢!\ I¶ )޳"°û)OÛ(å‘u‘ÇYê(WžœÊµ§dŸf™† ‡uó7µ«Œ[mW¬ýZ£ ½zóŒÏ“­Aáè“Ï{yÁ$—Æ5X+‘‘ýˆhm¿Q"KDÔUOV¶Ð—d;ÎäQ#ªPÚV%›·¯‚ø@6cLÑ`â@‰ç õÒßiV)<5ÀÕÿäsþQ=ö5jŒÜ-*Ê1ÂEˆfdýj .AwLÝ3jŽ”'%“™‹aG[Ê÷ Oàh^¥qt$dz¶¹–ÄNð§ÉÌo>1ƒ½Íw3ýôwŽ™BåÔPVÒ¼åKê̺f;´4_oÞ@urp[?_æLúÞ]ÕÓ#jr%Ô.íR2èí¥Ìušã)ˆî<ºžyý¡NãD' õ¡f§í“X$j'c¬Qdž®^K¼þuQŒeb·0.Kò~{>Ä ZÎ{_Y}W‡êNPùD ÛÓ­‘ÏÌÑZß.äGˆÊV-P(¡÷åtAª­ƒÀy¶€³9…Šuì»ýûyéDÞùîï5wÚ5Oн[´(î2© €Œ“ûß=ˆŽR\ÝTñĘ‘#') ÆÒ¥¾ho™søîÆûEaâįJ^©@9˜@ÿy5é§O¬ÅýëõŸ·ot‰^Á¡…ÓÖGáVìNØÜõ€æ'ÉÙzôIâ™7Sµ9møñy*â„È7±"ý>á~VrÕ²"ˆ½’®|0‰c?ùÓ‚<[ÖÖq‡î®ˆ8ú±ˆÃ}dguÏäÞºê×Y–yÜ–¥9~^beڎ‹™Ø x‹;‹¢ª G¶¢¶^»´N Rž?NQùxkq cTr:õ÷Ô¸½'„æ&ç(Õ°ŠIJüBòR¡ÓT}¢´;ViôÊ,!}‘ TœáåšGVu®ÕC¢¥F/Œ#‹’X¼Ü©" Ü÷8ÔÓçf£‚å˜u±Ë¿ˆ$ħ]çlùã Õ¼wÝ>q@ ŸÛeRžsMj ž[2æc™Îò(,\Ÿb×sºLì‹ ‘µ³ç»¾–òÓÒM¦+€硯®/mݪÂSÆ<M±'å;4Bcœߺm&¦ïËóÑÀ¼÷s[!Rhñ#:Èài*©}Ù+É}‘§¡•h³œ¤-^`Ø5ç Z™ WSï¸Àv)Úóó­B{8èµgO­~ Mëf]ûAä¥p&€³V5ßÌ¡`Šb» "oQë Éíb4$\Qà´a?˜ž-—wRL‘ƒÜOçYñÓKÊ¡L²ÑUÙ\zêÄdŒ Ñk †ysši÷1­3ª<8ìÇ ^áL­½i„å‡?5*^„U…éWŠZççKQÎYo Ès¸\‡‰Ms–KÎÉöKÌ{vyÅ՞ͣ&FÃ!`0"F™iì¯. ÈŸp瀧@ØŽÊžqk’ Içߊ5{#%8ïù Œ:¹âA¹-ÖHzbœi(täÊpýØÃ…gD†"ŸT{eunº,žCÀ4ýdEclhMgsö2mú÷e?š·<•ùé-µªî(® (Äo•…F¥cÅ ÍÆÄ[õïnŰ`+¦óžBËvU‡Ñ…(À©û9“®s´ÆX‘?„ ¹H·e|•ßê8 i ŠO ÂI¥ãä;Ñ ºã¡«ë¢pc°¬´APŒw’‡Î^t‡§ƒTSˆÐâE½ÍëWi{êh$Ê I_OÙ‘üYÄiêÒ¾ãiñEÛ×­Rš&º¿sÑÏ7x˜‹¡´//§—]À4õÒ_,Ktí¡¶ÙÛ`û|<”±!à¹Ts¤È¶1:½öTA¨üø¬Ëùq_b™ ºà¡^<^kR]4+¹À÷ Ö÷°÷QÜÏÃ87?fûW‚ñ¬8Ø;«,ûzO@o {W[€&ö ]±I™NŒ†«Ý é ¸'×Gbî"ÊíôâY«š5—k‹Ì¢bó•è2ÒKï Åÿvr5Ë6c® ŸˆIcœ|5­UK³cÕ¾QÓÑlmÜðu/Œ˜|v–%§Òèd‚àÉÂ.k™^NU|(~¹^ðg€©Å#á=·åð+N=M°ôˆºK·¿!3ªðÌdG²2û1€9RÖËg”tUvM1ìâž"²=‡N ré…`ÒÓƉ¬k¤PH“*ýó-Â:G¿X€%{vüÐ2ôX1óqýùY.‹·íÒu1o§}$©¡Á$Ë»o‘¹nã >òÌBêW :™··½î8­ y&µÌ½@-‚ Œ½+œE>\Õkce™?]¨E‡·dŠ%‡B6‡ ¬‘§™tâ]×ôxTè«­Œ!¿¨!åÝQZóy]SØms%ä 8•€èxŽL YòÆôyF˜Â»gÇ-_¢hdôk†D–·7xÜâ_ «M›·tÜ‘UZ$wq'4çvBep÷;´òã)Þ¸ò < ¯ƒc®°/W‹D·Lé‡7íb¦V§ª—nÁ¯÷kîulÁ@— ¨®.¯:ΦlôÛ‘R¹ZP"5pØXâÆ\·Jï‘Ð]5ÄxPÈÝ÷#u#§ "Ÿú-çoÑÞXš·T ¸ñù ܵ±ê“, uk:|œô³&!Œ¢púÄ: ý´…Mlc™œ<;Ü”xøz—ѰoAb#mÁhsnÜw’¶¨Úýó%ˆ¹‰LŒ´í˜“~ÔaÜ¥dxEL*´LçÄ“‰,2•´–¤Ù£yb¢UwXp¾t¾]Á:c‡XZ“&hpGUj1ò…0eP”×ïÏpß‘™“–ð ¹Âx(Ú˜ùµË¾m]m 7K :¬1ê”då±ÈBÍ:ú±¨~â¶gî äG’x5àw¹‚Í#ÜöGo ŠMËg&/ÖÐO¤%c>{6æjYr‡|Jr¤lÁ§×Ãû€zaœfaŠmE?[ƒm~.÷Õ‚ø—“Št‰ïVÖ&3¨Ô1ðÎ?¸°êÝpÌQܵO;V†Ï–â:)/ZÉS•$i€™:™K¿cØ×ň ÌÑṲ̀NþÒBßÍäQ2*a e|SÓ–ŒÐÊîoG0Ú×lµ`F3Çp34ýG3ÅÛ2 ’°ñ°V€èÐél·hrÆDãð%ÜÄbþrÂ7/ šW’¤% 2û}l»>ØT3‚Æ™ö=ÒÐΛßËkŠ^«SX vÏ_‹e¬C’ f#IWKpßÝ#f¤Z«Ô¯Ž'â~®\fÐu"Õ©'6˜×(ÃnЕօ†q&Ü h’9 {%f,eW¡o/z] )å,#µZLþ¡s^˲ˆŒ¶G#¶l mX˜mˆˆÿ8 q¹+5àÖ“r4W‚r–›<Ü-¶úÛ‚M]÷Û+_V÷Ú1za:‚ ¾àE«WžîœóY^­¢šh›\qH«LF\HÆ»m½¯mÅfKw¹Z&™É…£ie4ÆO†ê“ÓápMc5íÕ?5!í,Ä¡#Èbh®¥Q”ÿÚôˆÿPþîYÈ €ýÏx÷Ï•°Á’£ë„7âB…º‹)Ðél¶ìqsMÒA’ò]Ÿí:Þ½¿B}=¦[¸÷ô³+Âäi}{NÇ·ÁÇ’ÕÄ«otŒ…Hr>A­œ#¥­;zÉ÷îÙЬ Z<°oר àDÀùéÆgöûíûdšª¨8 ©„K®(âp¼c>®8îU„çIïÆیÖfª ¦j6ü‘ýÈIH{“â#á÷5_§Zïñb­å€¸k!öüL4ç¦h(jµqJ%ŒÈ S#_ˆ»ˆiŸj ç#÷^FÕùÒ 3DÏÆ?ÁÝšKñžão ¦f8Òvެ¹¦%dÛüÜ¢–£ÏKx¢ÕGÒz¨™Ü†Íi×øjè˜aöõµ#-þ(`êñvì¹_³ˆ0^GéZ·JåźõØ [X¨T_ ·Î5ïcá| w[ùPPï<ž‘†=„â… è\bFƒT+ïÕÉ ô‹‘Ô¼¦Ñ•”ts³a†fjú‚–~úsÑÝÙ‚ÀB¼?™úð{ïWL°³æ¦eëÙ/~…5ø¥u6â¸$—ÈÞ(—Ê0¶ ßEz^¶ëÆSŸdõÇzêlFùµøæ\À߯*Â-o0¹$0ȱ¬ÉÁ÷²#é>]@] 2ck#VŸ`@Ÿö@ÐlÂÓÜ^À'7S/ò*Þ¬¤6y’Óð¼¨[8é2Š–2¸´çâ¬$%‹ø›ÇÚH¡k®©Iå•_ç:s½Gj;5“¼mÊÎýÓÈÈ.ØÀl(ÝõìƒsÛ• ÷÷&’N°Y}®O݉+Ò~’?±)Ý…Í«*?•Žûw9;t-Ö8¦éÄ6· Õþ3îïÓþÜÇa…0ñÓT`5+hêtJP€¿yþÖè¹Õ³¾Âò£1ú•G‘DRˆGCÿaãˆÕ¨fˉ{ü¼'¢pÉd£}P5%nñÞÆp¢¥qgÇ´Ô»À·©ø]O>moËk.!ê1Éšª©˜Ž?”ÑñU}AUýiŸÇi‰Êñ®}±EÃUˆ‡ ½hìÛK.U‡¢-ÑPká˹š=”{<üþ¶¿˜ÒºÍ91<€#Øb¢#°>8â›d/TMåV§­tæªÊÌíD“Tÿ)¾ö”bUdÔPn6ØT~/Ÿ§5¹& 1:¢°|€Ö¥%þ‰aš=ŠìÍðÛ=?FÜÂW¦•2³ì½=ÎÓЫt¸¼ëð|”¸ßÙO•>W+KA+JQ³çñ-8`¢-á¿xaÐJî¼;ËXáñ®K-€ý¦ÙrùT“—[©Š”D¨Ç×ñð9b®agLض­ –ñ¤©~nÂÿd¿¹¹Kóv#MÅ!€¡†1zòxÔ­ z©gn'üU f®úÉ·b™yjË.¸¬V§,ÚG›Ð>ÞH]g¶®ªÖr:ó†Ç’6rOØÞ ä†ÏA “"zF›Ç|‘ȇäõ£WÇŸž£Ç탛>—:¿)µwª¾ýg3ÏÙQp«è§™m~ð=™«rGH¥¼0Hx…°’<¨;qü¥¢[A‰Ú‹S€\CRôDSêqˆ6{¾0yë¼óŒ(ƒM°X—UKphX祱DœÌŸ—â0Ω¢åÊr+Å¥ºÁ|¶ÓB{½Õ.9À×êU$ m1ÁôþA+¥¯¦Æ¨íFÐQ‡F¿èr1yèÊ–ì8˜¾V¨˜_‹ѲÓÊ%P „{L­²èÝ5ã87J‡: ëŠãka¦¥DOŽOi‘Э¾ŸˆŽcRþ^66Žþ4[:m“â‘«$™{`Þ!Ÿn…ÖÎ ztx©“ȹðÑe0®ëê:³Øš”‚…ðîx9€"VïÞrs€ØŠü°ÊxÍkÇW]œÓ–UÝúÖ,ÚA®]™ÿ…Æû厢{Ðÿ?pE$ÛA75uõZLD^´ßêz tÍžB9í–ûrŸà 0ŸªßYœ¹òÞ7$W¦å)-­Ð¦X ât/~À÷Íp]fò«šTˆÓv½ÁQ©µò¾cô 0þ'wÇE­à3Ó´9o)Ã0§Q¾^Y¹ÓÉÎÛß#,í¸œ°5|ê–iG"ɬLæt“ågÒKÚ´<çNrç`Ò÷5¢îßݯFöåqYóß*5ÙÝÀÙÛ)’õj^s`,Ú‚/ D÷I[ÓeYGB„¦,Ò„& ýêÔ©ïZ‡È³${Ââ<k;&Q[¨(³Ù³ÎØÂõ*¼˜Ô£|DÄö÷BðÒ·FáPd°6ØÞÓ™Z`ïm w@àƒh?_OW©Ó•íÔ«4îv¸ÂÏÕ»ˆ;¾ô0Ôg6„7ódn…ùDšxY½wŸu¡zÎ’úf´Iø’îÈžÉJÓ5D„ÊH¤$ø…‚YQ:ê½Õc¥msb»¢ušKæìd.« š¹«s^’f~zíY‘‹û_t`d(›‡(9åî8<Ù&>hæA‹Š³#ô±–„ÖsÈ×( “ÊšFy—p{ôÐM©û…@.멃 V©Û€Ð³s¿>ÜUKœãÝF‰ÿM~Ý·p_ሺÔqŸbÆNE¤ O«>ô/!5ñ-̨*F¬°ñip/ ›³ý¸<Š™ ?Õ|Sî•Ö˜ˆ¼(‹˜ìB[ Æý%êQ:w';v"Y‹°ºP st!”õ j V™î/ìOóˆÍã7OÙø>…­Ã1€ lÙj&t,[d äåÙ.·`iNwûv(²ÒÀ4š|$Õ ¿ÕnA;n¬Ὄ¬Š«)Îy²zÏ©yŒþ“-‰Ä9TX¸ñþ•H,øõǵ¨(¡ Ø}0ü›U¼pU)‰ÈŽåöJvÐ^º‹Å›BÇ*/÷ˆˇÃMEEP.Þ}Lõ­yèA홋`VÏ:èì¯}«¼+U¢øKßÙŒP™þ³ê(í/ËBƸ¹Ïù!hW< MIŽFsöCRúTúNkÍãþ1uUüÖÚ#2YŸ×÷}ôtÚ¿9Àñ<'W«A63†5B+ræt°s£Îñ¬ƒæu”ºš0†(_µþЪí;Ò^–‹˜˜ÃþÙ–@hT¦!ƒ'”9»º PØ^s(ÏoœÎИ˜Vjõb• œf*ÍixÚöš´V2YÇ$&Nƒe†ñ[×Aê:µŽ±c ŽŠç™D0¼xŽl†ËLÓtô;Šñp­XxÖ¹WÌwrÎégL›1²X±ëOI1Å”V„ï2öåþ71žú§€<]Ô x7]OÄè[&ßÛ"Ÿ™•¶kw‘N±Óv„Ù¥½1f>G¯È“Þ"—B×Bí/g_?mÈ‹u¹M,ˆ‚;5î)_‡…8C™¤?ûÒb8Ðkg¥³S×»&X-æá–o†uòꊹá³òÝûÞz¬¹=ž‘›âlšÉšyõò›¯Ï'žÆƒÓúW¶‡5âs[g4d8¦—¿‹u-Ee[ZÕâ&4¾rÂÆÆ¶PöšD1w6ÿ}  §ö1V…÷„]•d6ùa¦­ÒSïš™™BSÿ±…ý¦¥®ÅiîÖçTó @©¶qe†v9Ñ+v…†?¬ÕË¿ÀÈ$Ñ…¾:,¦¼Ávàá(«__Ã¥4ç³.A@<.­¶ÀÛÕy¬£ðÔñuE¥ŠD¿&þ‚Õ¢f·iõ #Ç{ñT† ëöŸ¯Æ…{¼¿î®rÅ *Ô™·™ðå{¦Ëñ³•ãx&8.¥ñ·_öœZ׺ä±ßK‚¬‡!iª“u1ˆ³g¿«ã¨¯Ïë¨8GÂï½LZ¤>DC÷üsN0QSHüózÿÜÔÏ$ØH7 Ôÿ'’Úl©‡æ­h^èó<”äø-{FkVY-{¦«ÚJV6>.>ZÊM|S´ctÜLdÒbèpÕÖʸ,ÔÄnq õ’ÝøVX  Nr`>絈産û6µó™Å Ž#žÀÔ·•ãT¦üé(–$ó7ˆ¾öí»÷@‚Y~ÈmØwk-c¿ÍY¤ ÈŽÁˆ$uÚíÂ~§Ýíq;µ²±*ÖRĹÕ?u1£KÞƒš[Ln(wÔ¿lûŒ8V &|ÜjÇÃhYºmŸp«ÿ ÒÏ ÕpNOOný-æÊõCÄS'Z)™V-‹œm×MÄ£ã©ÖÐ%& -$J–1iQøPm[zñ«â:³DاŽÚŒ©!v¶i欫Îõ2S%&6‡ˆE`Úâïí'ÁÇÌe1LÝ»`êì<Í÷iF¼Ÿ‹'JÄ”Ü?oÌ3ŒQÒÕ3 Qã0RRH d×@©i‡'|l^NÿùÎ@?¹døä)7çã†ûãj#ú»0­Œ{ÈÑŸî—*¹Ö[ðöEÊfn=»RöVÕ€$t¡£r´ÜÚšzÙÏPÙ¶Ú¶©´ÒÖÙ{ú†k<ÌûÔgÄî0b+Aïÿ(þ®OºÀ¥»_–`rëzê-e_ë¯XzϾІÜgÃw œ4³}qè-³Å®•GF¦úm[î ùÝmެ¹»Þ?(61Œ˜Së#îÊr«®]c’z$¢çàV³¤íà¡%|H@v‚dÖè-cVÍ®‹?É|WMª<žÂºèšóç\[”¸¬x{²–¦TŽª×ÒtÝü(àhïødç(?ñ%$¾†Í´&¨îÀ})ä<òÉῤ¹ê¹Ð BDi3Æzå¸÷,.Á¢7ñ;È'§ Î|Pv‡Úw%ÙCWˇ±Az;Rómí±;HÍ5¤uÞ.:’‘>‚ Nºú)7üí•¢^aÔ÷Ëÿ:±t¤r5‡lŒ"D7ÁF¸|¹fµ]mzùÍã:ÕŠ]­%v¡1‹êÜïC6fÜ)æC›¸ø_Åñ™}äŠC¢eúçÈ>\ø›ÿ°Z%]߇]w ÈQ¡E°‚ŽEÜl¸ÍQ·€ÂzIAë:”ÃKm `Ä$*€ >ƒo¶b9,«ûÖ¶åXJx SÊÙkO!Pxâž–S@‘ç”-¦ÃÑåóG¿×|PpM "¢œgäÓA£±ŠH 8¹7ý”¶"";»z°’ïµêÔ¿"ïÕ\§õ4¦á0ý“Åî &®šà»Ðõ&5™Y¶™#IU›¨CÛä>ît¦±â`yÑvÌÈeÈ@]±XÅ'L›Ší,a$~È c%äÊZãÿWäȰ_^ñ#ß×Åx (o Œ<Œ¸EçdD7âÈ—p'抭3¼ëÞU=è3üXŠ ¿\§ƒâGÌîó¸æòŸ×—àg—&ân74.Îúº£{ÍÈj&ÑÂÌ_OÙ¥Ïæøt´¨…¹ÉrŴϢ³cР€ª›¶#o£?óês·ü“¸„‚ãäñw‰®&/ࣣ[î—u`¯p%ƒGÏoñQFGZü°RÄIºI%–Oõ¦a¸™rÞb8¼M,(Ÿ,räR6ÕLêV•ÎvspΡӉ ÐpAA]©Ü{‰]›FâHÕ1qw >Š•+›Kó4—¤2Fª¾wþÎæ]ý†ÓÚÿ7Yåvësû%¨î–”eªÛ·µu„â  Džße ¢ˆ«‘öÂ~@Í~œé^\w°âõï[WAOÞª¼¥ÃöÖÛJ—‚ÂvjøM+)¬§ºj# Dùï¶@º‘h–-±Î¶ `¦8ÇuÈnÅ(€‹EœØsÞøºt©wtýp@×Ðò×Íß2êSÒh\M¶ýæ2Œªä‘ãGÖÔ/„÷=–@‚cr­éh@ã=æ?|·ÑxÑ;óJº…îýÁà8ÞÑJÃ0TGäšÞZÙý©à§<Sõ:šN^”[Ð5o¬eT¨§†#o6NªÆÚ»YBŸE—ß½7Ð@gÙ—J#À~u~K•”~)€ÄáÚPò¯©þÈù1n#Bà<©.,?ʺXdG¼§½Ð8Ò¦Ÿ Ì™XÝ[PÝY$Ôï{–­®à~m¸&³­sþŽùºJAòÍ/| ì\ý¡- ‘„ç ¨È Ï¤Öµ;6!Pð–-²Ò„h}ÙÖŠeÆC¨ŸÀKÊLý^4—Ù="ÂÞ•>é;n.†_æÏïô6­3,Üž÷~À_hæó¿¥ÎU‘ZojKÍDmûa•~¸öÄZš’'ËØbdÁ ‰#$»e ÚÿÓø.òaÚâÁOƒ`µÊî­ÛÙ{6 ,Q¹Š±Ì 46‡U~qI 鹬åÁb›‰ ^Þ¨S¥îžM0«S2µÓh¶i}RÛ©,¦•§ø˜ÅåtÓð¥:#¾zCºr\î ÐäF+¨-M‰ˆŸâ¸%ñ’Ze–®[í"rÓÃN5Ë·¨0Ý^‘ÕÑhÔƒ;“y†", @ñÿDC"S*Òúе¼ò¥Ö@-Ò#‚k딆ŸÏmç%âê#²³æ žŽ~E•N‘°óÅð©6â„Þiíß_{gƒÍ; OÍÎPž%6’Kû•ÌÁæÄg/ÍÀŽòêîY?<-dªÃ!Z¾÷Ê×7"çtþ)æh£Á«°©^?RLþ†Þzݺþ¶Z 8¼Å¡0ÃQ×Ps½Ž¡úH¬ðu¦'¹;ÚÑë¼>`íWáÀd¹: þðΘ¶üÉl¼:e‡GñžK‚&ã7Ç÷—KäþâP¯sfuR¦•¿uc¡›•³â·Ê©â/Vû6s‰S<—ÊÑFUGJÂÛI €BF·Úu:*+zÖhHÇ_§o¿üjºþ©§ÔœÅåf4 Ö‚ÈÅo0ÅŠ- ¯@Pð4_Þä1‚é¢6×u]WVõ–útk£+ÒyÛÞ7 2N"ì×|*@7'$q"ʤv ès"[\î±%ÊÁL9‹ró©j¯XeœšNê~ùtMÅ÷§ÈG§}sD[YXÖ±_*iæU’·5ÎòÏðÓ’D=«Ú/x&[Al3Ïu@ôæ0¶}Õy ÁÀ±Ò›«óZÙ˜±üFfûl½RJbúÙ”ëÙ—åañ£t¦•@Yp€ù$ Î ¹þPù £ž¶Õ ú m_ šþžKZ´žšñK€ŒÆ\ùîÅ÷üg`ÔhPoÚ£Öïü_ØíŠäQ÷¡©V¥éH_–éÇÄW" bΤH{,È;8I€XñŽJ?ë"µõV‡O„šß/_¿ÜŠE69.¯Uƒ=u9³ŒõÇOõfF3c~I‚€Üã–½§M¶Ã-xÇhªÊ?BOD+BSy©°rf`†X¬U •ã•ô˜µ½$«…ó¤O´GàxÏÇïý=8y÷ªŽ2¬œ]²Ïª6] ZšÐö¨ãçÌ1#9è«g0Tƒœn°ÍMûSCï † ɾ¼`IõLÅBñ>"…Lõïö=VR,Jqî@ÜëhATtÞ³x\‘( öLÎëë ¸ühƒõ¨Äk˜L0‰W­Ra¶³šN¼_rFÝ„þ{¢ÖCQ±ñìóàPSj¸ªœ,þG|b÷¤Ò¯X¿¬‰)ŠØL€V·`Ïäü!ð-µ>ÒƒK÷˜]‘¡ðýñ^Ü„Óä7Pô »ïç›ä9´ª§ÀŸçŒaØö#©~¤÷ Âͪ—!÷µx™?ºgØÞˆ.‡!& i7n7m¥û©Ñ•4û…œ‰5°ÿ ÇgBŸêÖŠø²×jGñ®ýXØ)€–ûYîàWàû6 ö”l¥SúI8ã²oÐ û’±\ ð"á!IÁÚXUHnšŽ— ÒÀ¾¶ãÈéãaQ‡¸ðÇ‘Þ h_ú–¸I©^à‚ù˜q­)zǬÝ8"5ª]%ìér­(î@ù'…רç¾WA³Î!'’Џ¦’qŒ·a(³Â­Ÿ&ݯÃàŸ2x¤%,Û|ÿÌ%‘B%õ_¨O&;„Eù»ÝµÝßÃñÄ-•  a›g›ÌLÎ{7mίeªº9»?ûÁ_?Duçyh¿û‘\17M¶Ü¿AJbB‹¾@Š~Ë«c$ŸX¥'Dûô^÷ÐW ä±V½…@÷ôŸ‚†Ñ?´à¹G…÷”!|™ßNÎpؼ|q_5Á|›ßeµíy4³X(#ê¦Ú´µ„Gœ¢^éR›ûd!Q‚]²˜Ý"*t´_ž¢(-ˆ‡Ç¶Àwš ã³¹·ŒºJNNSÀ™“D@Äbu\rÒ1¸´0µ¡¾xå_àÔÐëö ~‡Ãæ«~ÍÄ4ݨfŒ³FgzUê÷îú‡´ï)ŠT‘¡t•ˆdÿ”ÝBÑ3·¥ŽK!ÝÄ«PØðwͺÈào—¡+ÊãÍ)î¦ÑBš®ª»xys^eÊá­*õY`MåËj±»B»¤s¤âÚ‹Ï­cW-ôuf¨¶ž2œUhQìÅ”ŸgålRˆ“qìô$ß-:I&ñoC^&¸mºQC6tBb¼ª¨¶ò«¨;@YØ”¤Ço½D¯Û~‘np¬7Á5üØ‚Q‚½ëá]}\ñ03AÄzCãÛ¢×Ãöd¶çiøGBøBýW/ºTdØC.ÓøÀ‘2q;f5|Îwݽ²ign*"»çzÃ{l7siJXït§•éŒaƒîÊTux;R‡I™=¸†{o“"ÁŽ‹•s€\üË‘Z.Ù)ï×ø¥èì£WÒF‚ý*x¼¸'èþÅ£WE‡m›~azäÙøžkdóÄÿ¬=s 6œ-NKÆ…‘Ñ% $%dÄ'?{*jˆ ³õßÐç†nßtNð¿äZ¹Hàkã¦ï5Êsöüա·)ƒ”Ò'„m>m›3VuNÉ»ˆŠuå?ª*ñ7¦»*m«Ýc>3ø†=ÑŠ0£…y„5ž‰KzâÛhÆŽÐwỎ¢ `¶û|¡ÿJ}ÌG· DÄÈ*œûäðuĘ„·@41š+âÅ*c Ù†AmÚ ¾èžÝXµÉvi³Î²Üh̳‘?®¤¶™R>˨«ïlÔ… l¡%ÊX^2W€­D’ï!ÔÒ8+píeU—vÏgŒ8KRÌeØ€PŸ·6²–E Ô°û(™# TNÎÎÔÄ!½S“3í™Ð@f´Ñ‡Yׯk»]ä:.æå Þå_”&†R½… Ð!ÏûûÚkåæãßÈëp•áÒ·®ñ=VÄê\Óšeìî´ó ‘1ØWh÷¸^ó*®#ÚF¹qŽÊ»5Ä4UY!oׯjY™oýVÞû& ÒºP‘ýc†?têìÅNÑÈÅ›G‚±2®êÛŠ”v µÁjÊÌ4¾‘NpúÔkÐq© ×Ì졾F­ƒ1°µàEw,4¦?zÌpØø¤V¡”g[tVY³ ŸÀ|¤¨%#CÑËÝÊ·$ݘ?XB…Ÿ¡Úþµ¤§~:¢xOTYâÈ–ŽÅ¨3ësoËd*tm’GþGýQ[Jrn€‹ü@ q"Ýy{,Zƒ„4£æžŽTÉŠ!2‹…ûþ6¯(;}jB²¸låB©YGuNñƒ ¥*Lˆ³Êñ¤¹þ_|ºÔ[<d„ˆ“W»â“ÿ€³Õ>3ÈãÆ  ù é|ÏÜŽ‚ŽpÁu°úÕò0/CïE2D“™÷ŒÛNA¾¢-#A\9ø½_Á&ûõãåÜa/¼–­Í ’D*q'ØâkÉ >:a*Óv'Û=ý¨ïîÈ5ù£n’VÕZQ¢p¥oQS•#VK5×=m¹Òõ„¬î[–fð„²}GM{Ïì9½"{;g±¨ GßB÷àfq>)”lªùÓù«O…RôäácH”iN1,hxŸšÇ±~6ú]“…ÊÔ’DWÞ•©ól ¥q†æ»¥¶¥U"±H\°g±HðŽd’ÕN´Q5¯1h}¨ý½ÐDƒ*_«Y¨…=àŒ›ÉPÔ€q}Í|FÎ[®´dÙ¯ÖÝ iQÚSÊ>óH×% ÖUf÷ܯ…bEŒO~IทywmtÂ×µAF˜„¦•Æ?.ƒ&ù0‚œБ-=BD.üpáh m»(ñijvo ¥ˆèÅA-7u¨´À«Ó@PôJ–SîÚj.xÓáÀ(eÞ¢]€8¨•²Å,\ÜB#h"ßÚÁÕÍwèyYëW2Ää2'°ñþçg{>({©;ˆ€7µ#Tˆ¥¨•L¹QQ=@ת¨¹Ò²e0|ÀkG‰¹5J²ÜFž± êÎÿð7Pý>g€^»§²tfñ-ñ"lõÞ¡/¦#K¿¸K}¦fåb]ÙV›±,í†}ä´S»wk¹ÿܶn‘ìʲ·x{<WÌ™.À ¬ë·­F²À—Ïèi)O±Ç J,ŒÑÞ&õš_ßòüX1Z¡B¡¬ eîYohú_k,?¯$Ьº\£Xµy}ÔdF¼n¿(BÖ™T· õ€qÏÕaöim’ µ-=·CjáJ*ç¯o€‹ Ðâ,\ú€R1~½2Þ$^£i™;¡ÝÜM`gÄøFàK`;7Ä`üF}óJy`ËÅÞN*l LÌmí»˜*ñ AÏp‘îOC]`Ê(!iD[ª´ÊÖ/l yy[Z’SL¿iŠÝQòk'»8³èòõ3ž\1UÝ]Ô“—Ö(MýRJqø©§ÑtÁ¸ÙÛye›â[äJ—||–nÈ·eö˜'ÔAOÑÏ Wµ_F˜½ûÁdÚøÃx¹"æ+îº Œ³eªÈŠ<$xÑcô`)úgªOµ!{ɨ¸:7„ºñú족2o1– YÆ §Ç17+±ÓŠŽñ¿»T¬-¬¢=«%G=7ÿ¹UÕax{ß—jÖKNƒ<C'ÇAcßìd‰wH¬4³Ò_…Þãv¬‰×@à®Â˜Ûn0±ƒLlÚ¯tÓÂ=œ¨ï dBùž9Év#*K¯4!ÿÔ÷0{ØãPÒÎቾ‹ÐHs}-)ùjÝ,Š´”ù$#¸ …6#-nÂc¢ø~êYÊ<öÎÿýwÒl#5C3•{RÞ¼+C-nÜõKZ+è!f¬EÃdj^u˜·¸×Áá§–u;ào·§?êB9§5,d#Þ'Ù9=\⢶ױ•˜Wäêeôwå²Ö––ÿ‡ÍiïHÞÙ&´£ðMT•…)‘(ùBRv‘±ornNtf¤:t2ÜcgîL466©¡ÑÝH¨ïz"ˆ,¿$+A‡S?6ö‚f–Øî—ƋΠXÑnØÕ õx½ãGX1Á°–¥¢À\² >ب›œ±^ì úÞ°B"稞p¿øŒa8I™qò±ÚiÅDfݧRÁƒöZÝÙÅgú4@F÷›Â€PŒÂ„k¸–þ³5—šÌ€Ù˜u ¯†t¹_ÖÇâO߆¡} »•íޗʳ,Ù ¾æ¨K¿7R ÆÙ¨˜©`ªRk\è­øÍ®ŸÝQ n0.{–àe! ˇö›^éV ÛC¬ŸõI¸%á õ!ƒ–Z¹Žq×âšÃô¸5Èt5Քķª]K½q˜,ÿjòy\ÿœXpñÙ¤–;øCCO¢M\ÜIÉ„ïúô¤èPÆÝÒE­óåQdõ]lLC÷ÂË5®bnNXÕ‰_½B6R¹Z·Dx™ HùÍ »µ¢á­ ,®•rÎT†Âé;F¯Zì”é`¬w ¿·öÎ'á@#J«bÃÑÍ0iT¹¼À0þðxMDTC0©Ó:$Ô®n|KæùÔò;×VóÙ]ŠEDŠ÷Üÿ¡bÙÍÚ ÅY˜»·êoE®/—=»è„}ipþš¢ÿZ®«qǾ…Rf¸—£˜Sç0b°‚¾Ôƒó5D ܰn"ia\¿:ñDœ­ŸÃ¸ñK¼M§ÕC&s Fù”xäÛ/“ͨ§ÙEL‹¹áºß0Mòãâ6¤!ÈE.åÜÜ:ħU‰X¶Z‰gm!¯¾4=tox±Wô &“ÀvHVÃØ®­×HLjݨk4¸Ô<~ÆŽó þ¾ã ¾/l›©Å©²Ÿ°€'Ê–É‚Æ?/õ¤.[7'@9ÌW¤ïôH;ô¸‹äÏÌVX¹ˆ`“̽ˆy Žuu]r%„ýð|ZÒ".÷i4º!PnˆDz ÅËÆ_|0¯ûßþïœÉu4Eýõí€^?wm ñ:îO+.*ØÁxãe9±áÒ1Š?I[McF;=×ýC˜±2䢆¢íô%¯ŠL ‹gõWÂÖ'AŠÉ¬iøæÍà,í[z@ú¾‚Ú<|5ÑG ‰ÃU…\ò•-²ÓÏÜú>…fmóeFÑœ ‡˜wÀ¯µÝ›í¬.¡¾Õy rdm“+6€z8x»ÅšÔ0«aÜg»¼vqÑv\g‡>\{CÆ¿ÍIÌ«H‡‡º€¢K| X&«Eè&bÚ,h¹Š5ä$jÓíþWµØ¬‡§ÙrÒpMšx,°ôx¨zÌ´T¤V”H™¯Ÿ<: ¡+ð(žGßÕª¹¦ÎEëX€J¼ˆ Á­;$<µ„úÎ)¡8£ÒWDÊŽNhGÛG/û)°‡2C¡™ßV·¹tç•0ãò±œ|Ü?ß4W¤»©GE»ËÅ®—ø£;ïkãéz0x£uJºž76æFð9#]Ù3/íd‡ùÇœ_Ð0ËR–ÕJÔì,®aàóó6‘¥´g&Jã'§1#=é¦Åï´' }V‘Ù/|[¨º²‚0P¡æ›ó£ä¶ÉÔÊàõ(~€ˆbyÓŸ¥ÖÃ÷ô-}B—…_såV±Â(iõu«˜Gajž÷ JÄ»ä’ÂóÌ.ÔxÅz¢VùÌs­Éåô®ŒQµY»5ˆ Þuõ[¾L’Ù LŽú\ˆÅí{6ÞàB/~O>mÍJ…L"x ½Ï¶®Rn ´¿~ûW$AÂ,ä×äQ4âáâbrøËPi;$ ¦èç²D\‘áÑ¿ÎGy'¥<ô¹ŒÈ=:èÊXg˜jmÇ•ì©æÛ·!-TÉ]ã*^â½kYýÍ-VP¢=qaû<0ot*•pgâ¿|º\÷­¶C¼vQ}>ïÇ…Œ*èBºd*æc_â“©º¼öG­iy‘Gù´= ¥óñ²;i5j&*ü5LÌÌpCýõ`Ì BµœÑòЮnÉê ôbIT'!-ÜÇU¶cDÅJþ…Õêïþ( 6Ñ/MŒVñòò"ö.ͽH EH9|-ôýÃÁ‚_H þƒ,ø8º'½$¯MÉG‡q­ÐòÃ?h œl=Nt~j¤E`q"‡{Jz-h:“¨ Ê"ÑL¸¾ÈÏ‚ÛY¡ÐC‰Á1÷µÍ%zëYÛjÒ@,¶¹6?h*%濊C5Ê~”7SÉFâYJ€”ŽdZ?ö>ûSßòåÍÒõŒ6¶6ÉoÆ›CÕŽ•0õϪNbZ½’ïhOY–b)†Â©Ô¦«âD*£yÜ Mè6ð €õ¶Ëâ;:;«dçÏø·K3á&C;ÈRàòËÈ|7Å%Z/MgÐ4r³Ë]¯õ„ªÆã!HFµpH[f X–ûIi"G„%â\!&Ù:¸â&nV>ª$Yu_ù‡,>8€¿@}qYàóíB(.¹,ØÓô£ŠU¡ ¯Ñª‘K’#°f™ÓôÌ¡¨ƒhKÆ«3î`åOÙ…‘ú¾²éÏCæŸk½µ.™p´w[ÍWÚúP;imJµTÎÍ&ÙdK ªH?ßhB–F~üºŠh‘ kÖ&!ÍVä¨rúò›«IùU]¸#á§vp/žöãN2Éä@ŠÓHjÖ4ƒîoöN%Ã×ö²U¬Ý ]œ‰Î&§ÍÛ´¨‰Ô0`¤Í˜»„)¯· b á. 7<æ«*ï_Ul®dÄRMj&È¿¡:Ì„jß2PÇ)â*è,ÿE[å„¢µ"ùp1û'â¾a—ò(˜©.¸œY@ÊkMNÆp,mc7ðl·f_e]'ßîáξôTübðU¯ÙeªôθrýAcù4ˆÖ”𥰃¬¿J,ªboî8ŸÃœ˜›ª4Yô7/¡©;9’ ÇÍ…Û=ã »7æGãuL©bINЫbj5M˜U¨TÛl¿ŒÑ;ÆÿB©Ñâ¬É@sÂ`‰_o^Ø0j°öȸ?,þOÓîñ˘9y⥠a¨çíp‘ÃL«Ýh2ëÃͪ1 3^]'ùQð®“84Q{˜û±9D. ÔNó°ñ"6äl~ÇÎVƒñfÕý:ÂŒD&ü«òhÔ Öl×/ÄÎH#s V/*±!û^ž6þ3Ô¸‡Ç¼”’SÐ\dÍ„a4[ ×éι­ý+g]Ä:½rÈüÙrsý¥³Ã±9þŸàoÃŒJ08Îþƒ'ÿ´³ 5äÙki¥ÉKgK‡ýß*OǵóXÎJSÁÙ8uR[˜h#žIXtât ™?;ÞX/ï€æÊ'ÖÃ'F8ã¤{uE&õeFÂ…ílwMÒ#úÊFÓK4Jß µÙ81o‚·ón¸õg™;«a.ÇZ€<Ühpü»˜áXx©.Š{Æ ­ÓÈJQx¯Ån‰®<{ò&þÓÃ$-Ø€Ñ}¥oGçÿ/EKÊ¢1$Y{Hü¾ €±s¯(§Á6,‘ŒÛRŽˆŠ~=©Ì*Ù{%B:©Õ†ßÿ¹cœÄifH AÐ"Ç•¢¬J î>ûoè””´ÉØ¥'£Ÿ<+DU|¿ ý¤£H 7Éß ­óÖD dÚÙíQ½u°å_“È{ðð`N¶¹2¡3_<‡¼éÍ’øƒØõØTâ<Äqm/‰Š¥éoìÜ-††uÜÁ® ÅYà¨uÈÑúìÔy˜ Å.‹Ô3LGˆ§wÖqoRoU¨*íEŒPåìZ?Q\[“ª "8Ëgì×…ãonÿÐøÏ§¬Îm æ¹"mœ^â®ö äD§¨g¨süàb¿ÌwY/=@ÿ­¾ƒ?ÕFê1.Ë¢ª9™³¢›òI.¤ §s -i*ìWì`©›Û¾AÄEÍ 7Fô^ºæy7õ¬“”ÁQ”>)•SA:U®ðiœ1<m ’•ÕN§|fóÖ;¹fõT·ŽÙª/ÿr”i}i_c®1ÈxüìÉ{•NÑÀPÁÌ}Ïc“‹JÀªEbqhŸfÏNQ#è–2"µÐÆÎ»ÄÏ/×H~»²™ÓYhDm—¨!U£¯ ‚#I¨—®ŠŒQõ´EF ! ¥yr¼ÔX#«¸võ’¬Í,?ÿ¸ºbNp8fÎö^Ëôp! >ø›=uÈÇ?Ò‰Ó¥aIȹCVü’”Ô{8VDuý‡]W· J:1ýúß,þ4¤kA˜&Fy>¡¼áç‡'üõl±°+µKÈÏÆ"5 F‚Ò†BøøÃiåáå³¾ÄSÍ®Ëá–î3xŒÒ2Îܸh@\¼çen† Ç>³öÞ<âtðâß#ø&ü "È˶°·^ƒ[Þo]âÿŸV‡„b9Ø_ó41NuFbƒÜôkWzKFQvõÁÊ`ÄÏtwJ̯òÁ •l˜Æ wål–ío¯Áõ\Çq„) ‰yTÙ¢`2B¤q7áï0mnió…üRù˜°,º3)öû?Ó¼=¸î´¿¹}éA‡-ê-wəԦuì7Pͺ<•ž»³È3úNúÈ»°sÁÀ¹“ÄU¾ÓcT;j̲¢Š ¡c$ºÇX£Ý'U6ÎZœ›x ¥‚ƒâ©ôÞ¶uýˆó&|°6N0ºo²ÝSª†ÍJøâôÚSšÆÐÊJ¥½9™Ï\Í ¢o…»ìÔÑÒàû‚{lÃ\bW¾•ñÄp´]åÈ ·2,*45þý”S.ˆ0Œû ðÑft´¯Lø®ú¿8ÑJeõ®#°ßB41 óœ>ÿðÉþ ¦Ò²b~'&GUŸhù«úÀVÛü+ F ÖÀÏÓí¡ï…làC<¡ÃbSé9‡ÖÔú^ øº:OSµ‰a'÷K| “7·Ù3Si8X?D²p_Ï©?pŒ¸Ûí¢ïc­ÈÖOäY~}Zu•J=ŒLÝ®| ùïFüÊpÉ7ÓYuãzГí$ò/óÑÀ"0 ÂMÈœÃlºl©]¯}öÕI#þþ ðt€Tõ ½[C«»±I õ`: ‘}Pˆ›%Ýezyj®yj p¿„sfJË™ ¿ˆh^c_Ãϔϒr æƒãä–éù¢h_2²pÈÂ犙j7Ú]Cåõ,£äÙÀ„»ìÚ?Ùîx`¦fœ@ÖÌr†>*%‡~vëžVÒ)žñJb· ®“#ßQŒž¢Û9_vP»~ye4Ô;°^kœsoK‰tËæ”X0™¯o¹ ·åD¯SÇ9Ì¡zºÏ/·}UK¶veàÎ_YÖdÑnrâMÖ—¥ øØ:uŒjdŠ•öŸi]¯Øß3ß‘¥t¾\4ã&J¨],'7I@=ZJ¼¯ñuÜä$¤¶¹ßý¬øÿÕÂõl‹p¬*ÉC±RO} ?ÿ¸w§oœW9ÿL¾´ÊFô× |hqÑ6¯ØÖrsy€t( $ŽFRñzðk#¡m„.‘J÷=Q¼!”X2YI5±•Ÿ¦aöP21Àxè p¡‡N\Kÿ»Ü„GÄÙpò±M¬/cTLË^·÷)ï -’aÁ›/+\0Îi–Yœ Î'&7„I{v†ðXP¯±þcXÊ#^bGÂËíÒo?4Savvu©©‹ÖtIÝ.Öé_Á*CÓ·å·F°»lçš_¨Êñ/r'pææéDöðÙh/ç·ÜK J9~‚Ï)#.±NçÑÌ·5£Ü ZS‹I“]@Ê3¿×iP 9³î1çL‹Ÿ^h`Džß®Iö0pÊ}ξº€ßÖ°ÚoÉuO²„”“Ä)÷·WõÚ^µ!/aVw&Ý7?HôNå¹ ÊÑAÀ:ÿÎÌÞ;úUÚ½AaÙ҇ϧüzä"*·Öçÿ,Ï´ \.2»Ýs¯ ¯ÄPBFŒŠ¦ã¯`R·¿zNèLÚTÿóÔ¤žO @0õ5ˆZ™7„!Ìú+º‹z$¶ÿHïÌP¡A×.Ä0Rÿä°+¡ä•/wé`ýpš¯ì̧Ø6Ì­ÑÛÕ§MZôH¹QÈn&nx4ÖµUŒð”‹rŸÏ”ÔÊ3¥ò€˜=äÙ»Ðñ!Òï E€Äd~ 0¾ ú |{È$›’èP²X ôÙ¯’?;’l´Ó0ÚùÌ”e oVÖ¨AF'o‡¶]W%^rERhë€uc,ŒÊsÿðzu:ó µk8¯E~Ûä6&N0f‰&x÷ëÃ( 4Éõÿ³õ™©ß2üû Aþwç<—Ò[ÓY »­-;JáDéùþ]:¨ÎÂFæŽ(IÐ ÙV÷p>!Ô Äò'WjÂÊSŽh1½â¼éq½ÈÛ¿•À›{x=Ò5¤¿Å|(¨FzX¦+Á*ÈîžHî:3Ls³HšöÛÛê>×<.A¢Ô0…E4>—zš×+ý)Öb”òÁh-IÁÁcÃ_ ½VÉ`J_~¼øß»ŸÎuJ¥ÖÖ<Õƒ¤Å(r0âý[FàD¥ÀOÐ]£i\u«VfM£™9 T(·E4D9L³²›gÐÜ…úU„,ÿ¼¼†OVPrââu'tË‹sX!©gþa$îe9²ê6ë/qÿÕöKI(2”û©Ëpð°CñÕG¦2\gmf]ïNËMb˜Y×k©Àù½Ý`ct)üaù(Ðä­°´ ±.UôàBÂFHZÈqtáG»,bvöøðd8åöýk6Ý*9÷±ÜH»¶ÿs^®˜™Ã£hÖB-<=›: ²×hé£Ås»”€¬Æ©¸ú}eÿ+b‹}T­.­aïµnIOáã)œ[êDáÕ?§b½S›=•òµdIQå$;üüNIÄÞ£œ“”ÇÐo†/ú;$ éÄz§‹Ûê=­Ç½ï [œEù^Ò;Õ¹]aÜÀ BØWCÖs¾½]3z”O¢ç“ 4BkáR í=²¹lÈ;ÎÆoâ±È.$’\g«)ÞJ‡X–ò m!.Ôö«æéïÞ–¢5;Ü~õÒô±Ó‰Ë™uŽ:gÕžy@æÅ±ÁM BÂÎï¨Ëq8Õ¦}2I§ìÔðÎJ7.ª¡…„ZA¹›/ŽðS2a½YŠÙñ)A-‰Áe¸"Ú§Uã%NÖp÷åcyxÀÐâoÚ*gpMòÌ'ÁrÓï"wÅí²v8³z~ÆÌˉA¿lÅ“SPnx´±-v:lÙ냉¨¶!þJ–ؕΗ¶«YQ)8‡n£Nð<ðÍ'Ós2g¾éR²P§þ›Œ²’òóŠ¿·f…nÄ~êâ“‹èƒÀ4;爪ǹr;Ä>p¡·Zh‰{jß{sIPûC~3cK©/„B_¹ÙÄb­Mêe¼Jº–ä'O؉FTË5É7¥ Ôˆ½Q~ØÆ´Ó‹mý"ÖºܾUàCZ‡1eø¾ 5{æâÈ8ÇÇqüÕ³‚³zœqvdßgR£â"b`gSG¡&çn½É gö³ NXfÈ.z¹7HÉ©9áPá‘f¶2„nà²W#¾¿Ì¤ä}: ×LW {LÕ×}‡:–ÌïÖ÷O0ÉtÐä%ÏŸ’+çÖ 0b £t)ºo(·²ƒU;(AÕ3féš\wå|Ä13«,¥È¨;jü¦žéu5yê‘nGíx‘5ú…1)¼]«Š™}û?_NU}a·;&i!tÿ½¾žšñ…žçë’«õ¡FûÚWܵëꜢNŠ @ =òh½òÙØCð´j-0ø7x»‰Ñ[©}£FÙçs¦Íàé üLW»eç/E°…r…ÏùV,¶Þüì‘6à»9>ŸŸ¼• ⳪ðùµ8Rìžù8~À²cb¨ —ÌÝgKDˆÝf(9„|6>‰< ŠB$E‚‰bï…¹š¸~]BX\v‚“ŽÔk" lb–d5ýHÇ!ÁJa3ÅåIÕ9±å‹S˜Ÿ´Í6Ù„Þtû“>Û%ÅŠŽÁ‹×öDüEñWñ>ÛÅ¢I­1sùEˆâ®œý$ÑÙæèee°ü U1¸SåLʰշ³!ãšæì:‡³§Ñ 4Öªä"”žúÅnEviï| vç,/…?ófŠÉ1ƑбáþåÎ9Ûÿ­¼´Ø™Uê0 =*¹º6³¯»n¯Ãº(ÂVxŠ)»ê~÷…þ…}Š·L›hUû]cÔH€ã}aÎ¥^GÊ/tZÀ×âKˆ¤Ô*å­6 ÿ€n ›¢d{ ¶+ÄöÖ[ŒÛ^#W’rÅTåó¹Y<¥=+ö†Xˆ÷lz„¿_§+ê“-n1n.æ~ß¡5›ñÿ&!žmeJgt5g ÜR;b~pCs»µzWŸ‘y}ß-žî©‘²êqH4h²·¡xZÿMóS†ÏÄçº.h9"ûN^iî '…¤F|ù–„E‹Dß-²ÃÀŠÖnÀ´.}Ù«g{=Šueò³îN ¶ØT]`¬Âî¬O¿vÜ¢‰EIÝG7Ë¢å+.Qöþ Q7ɬ‡îü]VPÆäËÑX»(vN1ÓæLáœ\… ð„a%.¹š¾~×çÀvõ€P.$]éÁÝ ë/ù‰Vm7 2hZYXÐ\ËË»ù#6²"8¼Ù\ZAé?"á·Sn1X Çd_úòÒYû÷Ñ‘æÇXœ³ªÔJÀ ¸êÓÁôz’&)CätaóW\ü ýg™Ñ~Ê­¶8NÔ¦Ñ LâÌhá~å²Ä+uO@ß"Šo:j³J\ͪ?  ¥²!ÑïÐí”ò¢A£›x~¦q'§‚)™R¼'"ˆºU)îD}cÉÈßg´ÇaLÓ)ú• LSָʼ*öAto]?ÊB¹º•®SõuèÂ![c vëÑ]òƶÃãL›ä =Ê‚ß H‘YtT”³DAÛ©!LD %_à78”Ño‡*ñø<éÏ=wÄgwýèÕ. ­…NÏ^ ‹Êóòˆbä}Cû—ìêü¦_÷ ×Iút âYãâ€ÐÕmZòxÓŽ ç[\:‰Y’ °V¦\Ktœ „¶ré?IêTOýø¯=U¥¢Ÿà4Р÷°ä¢$ 6kWŽæKÐØ-¿î2s býJ’µË¥ºeŸ˜*jµŽ›¸óøX£öOI¾;›Pֵïä>wLJÒ]0=ÚÏ/s D¿üÅU?Ë~“—S¾?Ák•#òÈIdÀwƒöàL7oØ™GáYFÏëN©š+0&ØÍ‚‹ë9„Y¹Ë;‡‹h „¬e'‘#˜„¹lS¶³·¯¾Dø£ÑIʇTçfy}X œÐKpniP °ª{«õ9C•)í¶ÌÑQàI.ÿ.jÙã:¥òéH•j¡¼r*7E (íÑ{™„?ˆ‡G»‚X”†Ø/y ¼¾OÙ#clzÍôè2‚¹Qá7ªýŒŠfÂØi+í÷ÇRK!Öš‚Õ‘’°ÓŠ´[VxÏá¾ ¹û4ñºhÉJPp¡³v¡‰=Ù$±¯H3@—øDÔ³úºVH÷?x…oŸc ÈÚÉÈáö¶iQÌ×#áÚF‘EþgE%¨3×ÕZ§ó¼ç!ÊIp¡P5´Þàä¼¶‹iX0;/Üyå={°J¾ò!†éÏäг™-3U1¹ ¬•·ËSuz=ÿ)ÿk¡b-÷»/r\Ní4K¸‹þäó\ŒÜߢ•QÃhJ¿F³ul¢úõ`ѽ’¹ÄÙž\BJLÚœCa]ë$øÂ9ÿð”}=_¨¥ÿ¯vÈðot9U¿ýžBù¬°ð¼2ˆíN £R ð×í‡&aÆÕ1»b×ÐCÅl>áÄ3/›‡üo!öYßE´±E2ʉex‰ý¹ßµçsÖÄá­Ca^Úù¦5.¾`ž©[Ö6Ü1©ÝŒoþ ™ÍÛª÷ë”— ¨¸)ïÉGžë™ ¬&pÖ‰~êšEÁa~KÊ(Iz;m÷N±jùˆËd­Ä-€‡br3H¶L·Öt„ý’ Pv=Bîá¸/æ+¦˜•Ô£ ày›+£>#̉|òê@©‹®Ù§F ¤l>¡Ñ©ŸnabÉüÀ¨tÎ)²ºzb¹Ãýž…v¹}gáêŒ=¼d(‘„‹o—“±¶,0§Tâ§ØBz¯k+ºýˆ«½I{(1<בßêó(D·ë~w§˜ž[ðü²×€¹–”(27œžº&ì¤2¶þ#6\û}bV3éݤÀ½ ˜Íž€¬” ý ñFC¹üš.•{?®Ó^ä‚có2,Ó§ºš¼êKLó|ÔI"¯Œ~{AÒxÒ¤§·ÁÓ°šZ-â¬mŽn,úH7‡Ö °™ÛnXßÊVžÜ#EÌ„5VO$ 2²uuy<„ëz©Ò»M õl'¢T¶ù¨!?åvÌknÚ:—¥F¹ˆ´ªÜ¿Ë€d²š~³cr(²ÊjÊÒ Ïz¦K´¶ôúK‘s¶§¼Ýí‡ø,…ëë„R”2ï/áJ¬¶¹ýØN(‡„WmPI[/Öï8Do E¾L)òö(È@-ŽyäWCøøŒa&$¨Ë þ+¥T­M,UÜ9ÖsÍn¥jæ,ƒ“:~÷ÃóPΤ«xfˆ!Åù£sCÇêMŽIlׯfþ¦¹× b½iWvT·®CÚsñÎ M êu;¼ä2ßNømU‚¾<„]²i áY–ü ñ êažÚ<æ)ž·ˆe#‚‘óRH ORÄmdÑó‰ñß‚ßÓÏâ+‰_zuãù&†nn?Ï~]›ò¬Ž¥ðâêÈŒ©nÏó÷Èá•Ù4Ä5àázoJ 3’\žG~jTEOGðZQ)¬Òt'ä‹$qÒu>$Hh¼à“-+>¥9Ô©”Ai*Íò ¦¤&8·>ÔúT·EÖòáË  >žŒ-Õ®Iͬ¤è£É>¨3ž3H)Ø>• ˆ2tFK íL««‚ øª4n/J2ô,þ¦|ü ÿØO‡2BJÖª]7Œ¢è9Î)ëzÁÕ÷á?Î Ÿ*³9^åûNdQv‹Y®èHªÇå iÇDíEO!-ƒE²ôf~º€ydbäòìÔ¯}ááŒtÞ8ËÑcÞ…8‰<Ül&œg”¦˜; ¤13ëA‰Ù'^H]v†°„{޼´£Í÷ª1®¾²ïœ’*¾°–|“ÏÒŽêÎÕUóÌ¿Ú=V!œ|2ÔtÓˆö4€çBî¤Øb[‡ÜåF0OC•_º¤ñR&tn ¤…‡ ¿a¤éÙÝ_ù£Ç{Ë‹­…å>&®Ä†XE%53 àÇXW·¦„þ'‘G›ž%‘mä•s|e©ÔW$äßêà•2i¾Xým`ÔC¨}¥%åçêajKaÐ\‘Êú‹mœÞ“¯ëóP*Š¡Ç8z§â]@,÷hYÄ;¸œsLQÀ Ãüü¶ê™†D¿l ý g§~ßá|®L’OKΉ¼@„„ýwÐzÊA$€ßÚ,ÚM>ÇK±¨B[‹ðx=”k6ê«“þ¡ F+¯Ñ¾µkXÔJõJÎOHóJŒµ¤¤ ]‰ÄÈÒ]wd;£©Pé¦R'ì3TëG8¶Wâ-Z7ÐÒÿü{ˆÔÊ_Ê_ 7#ö&gç§Ÿsýý8ÞÕ ˆ1ÆÈé É—$h~‡$ZX¶ïVÅŽ+#./jxLHÿ½=ß^°kT£°C˜ÓÔŸSmê_p(³žY:OMu™æ¶6+àj«45¡ÉJp¼áº¯d¶¨Æµ²N÷·W%átYêRÏíý%;¥òü–‡Ax„z«ª¸¥9ŸÆv—¯=qíÅ,<Èÿ²5” Wô]pÁ§ƒk²Ë±`ÑSÒrñl&Èzké¡sñ­S v"Çbm¦¶ó»ý‡ÎpÝJ%šÚë• ÏK‹²EeÃQ :Ö=eœñaçY¬ØÓ"L£¾+àýàùÖ¾Oî4¤þïëàN®º²ýtÄònØü&\ødÒè¬ #ç),‘4\uŠ ?G›;0ÏùF`ò8:-‡´º£Ð¹åö—é SýxÛú¸.`H¦TϹó1è[Åñ~”#äàê<Œ’Hép·xÙfåhž$Ë>½ßpÜ®Ýq5VVÿåFX»tÖþН³ìX¾É±o•ÕEÿŽùŽXÁdXlÛ&@+ LB¡Ú«=,wr‰vuz‹ÏÜÕ›m3ünïG7³ÆlŠCN‡/½'¯›½çù6¢Ô=+à|~´ $É2?wäc-“!äõ!æƒ_&L¤c§i†ûTélA>@‹ œ' °ú¼\2[­B¬™m4˜>¤Öî1|¡yüR¯ÎÐI²ä_ž¶øÑV­Dþ–2‘Í>~Kæöù²(EGÉ{gÞTú6ø”vVä¤h&Ïé]¤º¢ï_׿°j0ªtóÔ~¼t1³3Ü´MC°s?aušc¢Ñl²Žþtån^7²@É9À#<¢ ceZ«‰æ!Ÿ£‚ ì*Ä‹y~>:Œd‘¼tS5øh›F7[íù-º4WË–¥\îé‰þŽYÅ¢Ãw–öY£KFPÅËlÄ}~|Ô»¢HiOrÂ'íal…Iƒ?{f²ÕXù¡X=œ¢*ÇÐ0;Ú¼á¼ó€a}ÒЕþØÁÈMêV˜ž^š-’,ž”ÞÙwx­æUìÛPa±vL¨l[F¾†ØHq›Qr% "ju²öåüxlc@îÎÖäGcÂE’ˆ¶ „çtIê­(ѱ¶pð‡þ|y—ºµºK]¤€€3;Ã^H¶mH®§áŽGÂ7ïe;íì°æ¾›NíQg–@\{<ì8u‚†§Öïz©qÜ[ |ŒÈ»ÊãÚwîXˆú×ν0¢ ‚xCÆ|< ¾;r}ë8pÙÄ'憫@ŠÕÀ(ÂQ‹é}Õ§0t„Ô¤TCÐI@ÄÒHÃúãñðúY£{6{Ad©ÎìÓªz`k7½!X-€EÕ%ZÔdI~y$_pô[8ÓÍ¿΅´È… ‡^•«3©¥F J>9ñEX@JgGªn;óFF3IÀ?ƾWa:ãØñ„›Çusç «>½T¿ h0?SÀÔ)-íU¤ø%ZÒɘz“=t¯è_j¸‰—§Lê„îUÐL>=ÃÄ#w†cªŒÃ9£Ât½­Bþ=èÇ5ævŸ˜MÍsè&Ä6 ÿ9g +n²Ž$zë_Ü"En.bîSø}'ÔTÛb÷óÙMW‰"G`RÀ ŸÉŠv/eXh$^p|“ÿ¹4Íò+|Õâ0BÓŒ[:誟?Á A2Kv±JlêÖ<™àÎ5z?iw­àÅ:ÒÅDk騀åEÃú™ê›k#,öìÔ¶bó3HqüD]:kº¾Ìvõb}ç«ü벂·Ñot«câ ‘ãé\¸¹hc(KÅD%òí#€"‘wtŠS–ìÈ|œP8Š£8ðduHÎ9â{sf„Vw`jot‡@ïK•ñ…“ôåAåFÅ»QþRhp>ú+Õ„u1 érô ñáÒ„:®Ç¢jß„kÑ[å_?ˆ¦4a¸­Í¬tHÚ&:e é°Í±;·£ –?l`?4(ô”ŒY²ª*¢”;Cv×êù76ðpU©JQ‰Ñg]Dìæ÷6¹íbB³î/Ê’¬)Üù‚O]°½¬Œc“=I(ÐcYŠ˜Òì/¹*¦t™g¢Q‘Õ)°z¢UUäX'PVšb,e6ÊÙå®bc¤iDȺ­F9×í!y!k¸†¥B'‘Mì¼ò,ÈLK»1ܕċþ&Å‹õ6yK¨ùN ‚ḛíÄ´\‰”À¬ë »ÜE’¦Ñˆy“©ý¢ñ²ãSEïPù¹ÿbÓVPº³Ðyx:ÙÙ×4ù6mWž«ÊÙïM%>£“ jÒ‘>gô´2B›`nóð`X 4ƒhtî&¹–mžO@æT]%4N¸ÐN¢Dœj)ö³èÅj?ýŒ—68ÒiRÝ.%9<õëÐ)Ã(x7Jœã0C>ÐG ¡Oìá“v$6ù”5HìÞfDXg¸ët R$ˆ]„å#mg§“±JIœ¶Dnúq˧’Ïèa]•%w~L0Þˆ°Ýc¿ƒ§íÜ/àr1Ÿ}ÐÝt°'­ õDšZéEh'Ñ}Ö?‚YàÐK7îàvý11Ò6’Ur©”„ŠÇÔÉ÷¯ðH/·Sé±jŠ&ü÷#u#—¥½Ô‘²¸ z¶ï 4óK¬ìX:ŠÀCb(Ò:*ýXÉ^ÐH;¨Ž– Hd¼åÊ“wß ®Ó Ér[ÊõV7†È(ÚémDè]\=6–D $6gl€ŽLÙÆtã§NÖÙÿ}&YŸV!ûÿ%ßxÿ«¶MПÕdy=éøÊrä{‹T¦PÕÎ h5V^M«;.E7ªß\¤u`c+‚¥)ØdÆ[å}Âa À¹„2^ñþâý¤ˆ®!†Ñ¦h̤.r†%bï[\¿ýÓgàêÕHܸ/T03g:ø­ë_œ'‰•ñöL'ä)ßÙ†åÈú¼ 'FîÁY¾3N&²^FgaqÈ£#LX>«Æ`Æ‚ÍwmdM·×_&òã²jè=eñü<ÊšmHnlYd¨S¿Q¢;W‰Ì.ÊsMÆ-§Ê"ßÀ À¤ñ”H£ jzì ~vWËÛfü‰9F×øÿK}o°D©]`ò5.øÔBáTþ[ëØóYgë¼׎Ęü ‰3¦bLœì`ñfA$ƒbn5Î=±§·ª‘›ÒX¨Y²áÉ©—W•JÔ }Ý"·[8i…Òü@Ùz­V  ή½nÆÙC)Ýï¡õ¼xD!´í»Å®’eUd·e3–6&û5³ äë·ùË“Då[m‘­—]¤‘S_H ê`Jv”®xþ¦èÕH¸íZr4;7kUúN`é´ìÐÔ>MéàβRVà]cZ·Î&IÚe6…}Ý&ƒ„üFjÝjÒì.`?ó€¦=7Êf~Ð3£ÿUþwž[­ÃÖ+•ÿq˜=rÐ;<ÁL,ÏÁeåQÃËd¾|¦iÜ «áæµj¹NdÉ$Ó6ð93dUû¥ß0:b£dÁh ¢ê)k¥¼ä®ùÐÇ2b7Øw4ÎÕ§Ê N„õX@ï†â0œ‡i R3Ÿv„mYm%HE?#~r±ºà+ÇŠÆæÂþ#K*µnfÚ7hÝkºÏÞ;Ù)‰û+I{ßÅ©·ÒÑá´ª¹™ðª_®#'ÕºMm“ô—À‰  ®ª\†C R1\‡è ¬Ÿ§û¹D–-Š5÷]òFÌêä/l+áYVý‹¯Ã_&¶æ tVÅT)2†Ca(žëÞ/¬|иîÈþ }VOŸ¯«Æ¦¨³/úÁÖœïéí¦¦ÏÓþ3Ôâ·ÈÐ :#?üa¡µT<6óº(`¨-uT>Yÿ…>¼Ÿ{'üÜÖöQž¾Ü{Z«KdÃ61p¨e~. äUÆQ.æÀO}EÃè$MbÚ²´QáÁÛÈyÒ*{4æÃ/÷ ¤Ž 8jdùøû*JÓ3"4]È×ä/,áSªón.›—9aÒ-çrb K`Î4Í×` @€!b “)Î%Ž4³j(ɾ¬#‘…bLÔýØkѺöž~·XÙ^‡¤*I¦«J^z>;#î>-mìMެ;Å™”‹õ}öÒ§Õ7âP8¡ÁFºOÁnA®IØ¿uò¤’ñq‹PëãG ³-¸óöBÞkÓíÄ®Ù|Þu–…߯úØ´©ø¤uüø„ì=å†G/âoÏääçqÔÖŸ®I<߸¤×þÊGý÷ª„¡vHÀ=‘6ØñO“ŸÍ*2têÎs†cN0È–³Bò¨äLÓ¼Z–/å¨3ae½ ÷š£ßÛM)€à§ ]Y¬€ƒÈÏFr‡$ÃDgkÆ@Ò<#)Ts­O൤ȇ旧U çÞQªÊ™£ú¤î­DmhÃùÆÌ>‹AŸ;ñ ¬.«×ä­i ¡7 E‡]'&äT#¿;¦EÆË/Ê© wŽŸé‚ߊ7Œ½êá)îIÄj,’D¤¾†ÍX­óÏL(º#²í"/i6èýí¯«»úñ“Ö=¤_s«ˆè~ƒhuөǯ)bí|¯®™\þPjÂD­ÿ$¸qVþ]Îtø¿Gµ´â-ÝÊÙ˜·Í³;b–”ñjX¡¸ñ›÷NÝ2Pf“v€Ïëgï:ÔÔƒ¢±ÕSK"·÷Ù%¢Qˆ{L¡ÐòÍc¾†7IÖLNry$02a¿ =r¾Öü´xË^– ÒY»ÿvÍ0ü†åª³ žN\‰·9Uâmvcj¬äXÉ˵5ææ–º±ÂNk&$±CD ¨˜ìŠàúɹCŒ'¹!Ä^ßdéxGô¨<èÿmø[pç{b¯¡ï)ž5×tÛ£tììYEý6J8€aÐ`Æ®Z¦Ó#hÊ¥EŽ´TŸ’§i®dæ7QƒÔ lJXèèBò‡ÂF+ýüV’Wj+&"›Þ×LñrI¥}²Ž}˜Ñð]çq Cp+ŸŒóûÃU{¢®aãØ¹@œÐ>*vFO%t™uä EIL‰Ãö ¼¥u†ùUа¿³ZþɈKïsh¡oíéÒZêÇ»¶hØVˆÂ_ ¶[a5]‰«ƒF—HÍ ÐY[êêq—®`씂) ëÌÀÁ¡Ét†,#Ó¹ p&ÁðÕþž'Œiþ½‚æ4½L.gÅý\øém¼å5N·?¬Çå@öÍ ¦ó€Úßtßc®ZÇ}ºòz\¢HoÖ ¼¹ö«ð !ƒ_¯œšA‚ý—¼ic•ñá½in }š6³½ ¼lY¶#Óusåï/…ê{þéüN“⺀D‘Ïj—Ìt)Ò%ƒ€‘ÂUG9—jsô&°‘! vöÉÍ7¥™žêýµF–^¬÷ý .HXSäÇd s…Í &•’pV®ÕI½¿ §„,û–ŠDÈóª¢KÇ…£`Cñ~0wôAVb­„Šê}ôÙhKjÛ)´ƒÿ‡jîúÆb¯š}NôhOF‰™yn¼ß} ú´mË£x/&q;ŽÇöÃDF ˆ¿`2 פ–~\u(ˆô˜>­YX¡•11lÌÄÊÎà&eûÙªƒ¤ÿÞ‚™&m1«ã`RW79im«‚,¯êÆH¬]äYìi•û£¨ÓÁ»Ñ'Ö>Õ‡¾1jBÐÅ–:´×ÊØI"¾ÙFæ¬6‚×%[än9¢³øGúWº8]¹È:ˆ×\9\J©HfÃAÐ<Œkƒ-W_î#ôn3&5ÃLôÞÍã>kÀó¬º95'Z þúVô˜r[8±í\p¼fÂ7O[w!›=­íl\D„HÂbðâîK”OJDÞŠ¡À‰Ì}ö܃êÅ  ")Œ?‹¼õïž§l+ò*vHÛ·ŸZŸnŒ*•2¼O¼zõ˜± ¨CÇÜùÅ»H9t¶0·¬Ý·×éIEXª’O7£ùó¼üýÜœ?´µ›û~G­w€ý Ž æÌmŠËSéþ>ò½E$ÕÂŽºô§%–šíÂLŠé§X÷k¬ŸäÌ{ÃßTÎþèqg5¯vÄ67¨´Þ¸MÓA¹3lG»_¬Í0³Ã€Rd-µ)/é•w¢÷±G9g¨U±Î X´rÞŒ§“™¯®6O?“7L? ’¿àÝá¯.iŽêÂÞ#hƒÎ)ô‘Z%ÎþõH, çÎkU[OvLé gÀC1£Jr^ e)8­ZÍGÙcüÚÓâ~Þ·an?ú½ìr‘¸‹"ô¢aÐ⊉9ªDMâCŠʼúªõ-¹¬«Õ0ƒ++Þg5€ ¶‘û¹©M…¥Ø²|Ëy}éý´øæqM#Ôð‘ùtÄn÷ \èiŒK«:ƒIƒÃØ€ÇÑшt$®äIV"ö9‹IÓô'æ5ñÝÊÐ 3ýq)ºlO¤K›,ã=èòŒÑñHb˜7(‰Á8¥ß‡ÅþÅÅCôÖ$oÐLÔË`—P¯-¹ãƒ®…798• ¾@ÐŽ¨ø’z}ìNtОº-Ë ÂP,ú·½ZvŸÈ»];òW̆yN,¶Y¶óJ°b;«Ásdc,”aýÓŸÊÌóvw›£ö&Ýñ>ÞqS`#Ìç¸×¨žýI0Þ?mâoÈ_„/4&ã»R’ ŠIüûJw\Ïf1[Ñ­óœåuÜŸ¥Ö„)ÅÐû  êa7‡ÏôûZà ?J/FOª"êÀ¿ˆƒ/A{‡ŸM¨ÆT‚¶°—x›Ž™ÓgÙÖ0¡ððY¬Ç` ïÂ'唊irµX3èN«.öa%Í0"Ã{W¼HîóÉÂ4ÐäÝwC_m·–t䨂›f@‰gAlÿ•”þG }¬Ç$Öjc¡ìHШ>MÅ).$`Jþ>é‹™g4‰Ý:ò«„–‚m²·¥–êájÂðnÃs³ó¡çÚ«`²æ™¡MÉ>M0Ò8n"³1ã.=Á¨õŠO’Âø·W—¾üDT¶ ˆ3ïÅ; P„È”-øp ó‚§Å,ÎmƒÛ ¯c61ºPè?Ä;á*¿U¨Fžr3è¼CÜRœ\K¼ žç…›=mq:†Í\½»Áß'45Nþˆgô8§ < )Ÿd`ôÜ-žj® ƒþĵ(ÊqnÙˆÕÒ䫃€ZêïÁšn@¡Æ{œ<)Ûϋٓ;´*«`\%Ë’,W~i?FšB¤°ýô§J†–NjT^È:åÛQ½Œ ªga fѯï$[\ÎIi%ÄhàL”øÛC&;þK!//FÎÏš+è KøF±v‹cIÎ £dذž’Iáµþ¼øšQ‡!î[›~Ü‹Jª:tͪ'ÂÆ›.¶ƒf?BDìÇ×W‚’÷7PŇº÷„y¡lDîìj~Ù»ãÀ!D òÑîWY¢©C“ ѵYª½mˆ˜‘Då0¤G1_ð6±[¥¿Þ/ŒçÚT"%÷(7ŠYÛÃr²v°IèsÆ¿3©f—âˆÌRÈÒHñpunFN10Í^–}kÎõ ü€óRž£ÆHÿxµ÷-j9G™ßñÌ2å+ªé”¬sgìÙ–˜À¯9. ·[û0Nyݘ@SܶCy†l\IûÞ%ÔÑ; ¹Gü¸›É¦ „'úH“±§½V+RßڽϪÇj"èž:ægz_x^>Û;TÁ¿ÝOj÷QxÑà¡V<9:Ç¢”¹ê¸õ£cq¢U¬6ß;W³œ9éâûDÎï‹ýC {ç+%»½ý­ßU‹öŸAʼnö<º^(3Y¼/‹§ó yq9¼1Êß,‚Å8f1J¦÷)Yþîû4á_ ^íòYr6öÉé§rü«q®šK8àÆ Ù2Ù«¥¶ª5î”>Ê ý±ª¦] 4îÁ»{jò@ÀwJé«)œºBÈÏÃ)¨$pãÜüï¶qgSyh‰Æg&£ŠœËÂnE_¬kÛš¯¶·ƒ0„]wõÄO ŠI¼ò{ó”,Ò`³ùìpñÚë»aÀŒ~ÂY¹»(ZÓì¬ÙÈÉ•Vö‰œbøDüØ|¡ò•îŠhø~ ‡¼- ¶U­ì†‡ “]ºÝˈ¿¼¦æÜY"¡r#l½îé“ )5kDÍ£4Òüžõ\çr ŒÕÔ¾‹9<}äÆ&úèj0$8¡ˆH­ZôÍtW´1E,ð†°¬‡á¦†UËÅWž/Ú=”½­LýÂèˆÆ÷Å^Îhý.£"°„½A[1¿ÐÍFœÈ 1‘.¨<=_cF…̘Àà-.ðI$ÈË‚Kìl•øL[e p¥Óå5«’õ”Xxó•¦ÛþØ|§5 MFsÔ?Æ«F¸š75ŒãêF8K…bÇÊ žÒf]ûÞ‰S(i7ë8 ñïÞ6cs0TF#«ùó ’œjûã¨}ЇÖÔÖæS$q´­¼€?¼¬-næ[âdËFv·Qö¬ î$…ϋθøÇÌ Tnó¹ô?×Àž>Fù†:² ³Øiw·=XÄ6 ›Ê®9»RY^«lCÛŸW¿ôÊ8v!¾hDΖ—úÆr¤fÕ‹{‘<—#„w£+º W#þáFù¤Dr7|è·aÚäñbš(Xß+˜,à!’ô)uV/ (­à«ßˆªnK‰D¡Ð½Š¬Ø[ñ1'¶ÅÃGð¹Ñ¥váa„ôkQzìÞsDýn#Âéò%háQa1Èó·uΪf´#Ç ×V7´+N‹O¾RøÌQ6Vú“•=îC]j¹ (´¯[’XîÁ´?änë ^Û}7ôx n)áàⱈ:ºîÞÉŸl8ÙÑ`ÊЫ0À)Ϻˆigº˜Kw†°oõ3íµt YMëŽv¥>Õ#Ã:)Ê™æD(i“Òw(E³pãÚ³¼Þ±JÒIûš­òúò½u¨#þö±_@@ë$‹ER;º>¡rvú¾MÎÂb Ô2h§_ê9 £YV|Av•ï4òDO7Îc”вÅ<08øÒù?ù–YÂDõÜû+.ðý«äí¥rä É;ë¦zéö§%}ŒñBùŒ|û:Ëg~S ²cÛ8S+Sûõu^k ¢ÎeŒ-u:0ØËÂL ñ „gG~êœR›A7¢µ…V.rÔ«k„.廈åJ%êîIF¿Êšß²šœÚ^–®¸q¯iiº€v¯P¡DCVÁªk$ßž!™uVè~Ø}¼ãèÓß<"­?—ÉnÖ ›µò£Ý›«qsFyÎÙ¯“Û7ò‘ƒ“VïfH6Æ3QBMíÚù%©z÷åÓ\ÞQ9Yع©å&}¯Þ%ghT81õÌ6Å/ʯy`(hjVšˆ8Qf·y%ÉE¶tdÀ9xH¸] ºþgEá‚Vurfà)Þ­µ*_kÃÝÊÄ—E)(Ì3Q¡4ª¡Õsw˜úÛD†ò&Uu )N¤G`ßÉf›Ù"@ €Ö/,à ìºS ¸ŸñNø×áÈôRÞ€åÙbá—ñ©æØÖ¾ QµWl"ÏUìoóŬ~tMZªWc–U•xÝ0JyyÛÞÉËì¤ ´ˆô)T;Å7¥Q|êa1A}ñX¢æïܺ$C‡«óMähWÞžÐײÐûƒu†…_Ñ$gYßX9Ô-->¥®Ž¢ eˆ˜aÚŠQÀ–¹nüÝU Õ‡ïÓP6xÓùU4r^x&C¾õplëkO(±áv1ô´‹Î¸C[Ë”´«slayÑ™e‘f’ü²‘yqšK;ŸPK_&ÉöÇ‚·ƒë&“ ìÒÝUûYllO-O®©âÊû²KöÐqÍ#P¿úýÙñ¡!‚ o¤ ¤ïW뿉µU{…„œ­v Šo™¢ÕAÝÛ, ‚it#·_" ZFyœzÛ(.£éǤæ]v1#›±Àõ`- ždZ6³ÒP«93¦Vóc¶*zå75Õ!«»¯É—™M·Jjí‡I}•$ùY8jüE@ìI× ñ*¿»$”û™;S=‘…!¢|ú N^_픑ÀaÏ„9}øµW^À>°+`l–D2·hH…‹„]¦ Ý"à¯[Ë|¸š$Ѧ8Fˆ¾ìÿ€åX*r'ÕDˆ$ÙÂB][§ùhFì¦`—…&X+]Ÿ96¢ÑÚòÿ¯Ê/ßUŠŠHÜÈ©ÆlÞ^KÌ4¶íi·õÕ,<øµÆÎAPHG}èA (tYiñXÔ zrRºÿZ‘"ÂóÖ/µ§Sã(-$Àsаb×,ìâMdÌ=·‘_™çz©ë΄i+B«z#ó±lMÕøúm×tEWìhFç\æx¥§™±EæmSÑÿʉ5âÒ=¾e1³á.b“«Xu›áਇ8GŒU'ºçNVf¹zÅUö 6KMΫøÁT`,x¯³Ë’½ýÀ÷Måê2ì6±¤ÚŽmJêìnnQoˆ´Dô`ŒYŽžƒp :¼ `Zø,yî'•¤œˆéö÷‹i/£™ãn‰P¢´s_*ëp¬Rm‚5&ÈOPä]lŸ±X·&¤!æHµ\Èñ‡Q+5/t ï`Û-7} :Sžxì*‰ìEnl3+ 'ÖcñøaãžÆ`«j[˜'oCÖ³B:õ_c¡@Ž[Ô]ëVÿ¨!ÅÚ¨÷2üÆjÎÏËFûeÜÛëRίUó¸¾éÃ^’‚xä$gWé_ëJq¸õ…‘eókõû’ÒvÊ8•YŠVvä9r•8ø7˜9Šf"lÂÙ&Úx,«/¨1£m)“tÉm¢X¨›YÓGyò¬m¿^9po–L.˜©‹£µ¼6tŠ5±ÛJTaúŸ~TÏÓG$‚ùòßtl(Ë83÷E6`Eüü¨A¤ÛSÙ…Âù€'ÞTþ=‡êd{?¢¨¡`R®¥8:ÓlqIŽdÑU éóG§`§é„D¼nç%„iÕ;·ÉíŽØ?AúaPT¼&ìÀcEÑÉebªHw‘¾niçò> œð–ž‹åhiU¾ÝXÿžfVp‚¼ùÄöf‹Z§à¿ß¶—ÇEñã™áz¬é7ú Õ8½Œ«a–Á}´r·!¸¹ÒÀ¬FÆ=” ]ÿ2ÊA@¼Ô}›8*’øÑ5ZMÈ“‰DÛ\Wè`í‹é^ 7Ï>ê{Yx½^¤ Þ ÌCý˦»Iûúm=TÑzɲƒT¬Š.?S\…¶¹0Ì-u-Ú@[…¹‡à’¾ Ьñ¨¿“·šY›™Ð)Ó€¥­®†éÅP*ôÃÌ”žà…/Ý«5Œ<‹2ôÊ9rp‰¼®KDÇuZî2M¡'©Õ LnuƒOšŒb“o¡tšØ®fADÞ<5f/²á¼ÒMË%lT1/ü‰V2×´¯§/îÖ‚v“Š ¤n,|vw Á¹Uqþüg:]§1Ö¼ÅK^CÖtŒJ/WlgW\ñÅ—äufñà›r·„åqÎýŠ€¼Ë.çÝZ˜ªy‹DÒvïfV_b¾s¾·è±«\pBUÜ?2Ô‹%‚Ç2go¹`qí4Âö #d0µe¸‚„  1ZË?÷ÍíÄ–À"Ä~~ôõ—‡L*Õ9o«È¿®¡ pA”èwm·…r}çßñŠH¶°ð÷CAMVþ_o“'ÜÉŽ‚JE†r%c÷A+­ÆT…ý®åœøà•W¾tÞrç–•ô7]‚¹ïLïDÛ×Ë'»…â0c6 ÞkEÀ°Š|õrAš‘ò€÷7hp ŠôÇCþÎ(ç2šþAÙLOÜûU¡ÿTTS—µëP ¢û'Ù0•ôŸâ”R;{Æ}5ÓYý#õ£[$€O0Á3–QRáÚbŠ€ß`~úÁLÍìËËm:%#¸”×@ªJ³oP<£'Õ¡^ÿ½“:èU¹O²WBÖ²]„ ˆjÔ²c k%ÊÞ²LŠûùæ9n°vÖû€bûµF“”:=’º>Ðqš¤7ò˜\+cÕ0|W« w8í§Ô·38¥\¾ûo©HŸ=o‡ŒÈS(…†ëbUê0÷þA~•äü©Â7 R³`«, àôíÅ#@ÿ…W{–¯à úx­Ã´è‘üŠ»¾”<<®h)+$â×'—U Û k!íˆJwŒÖ%[¹£š-€ˆäÖ‘N—LÔn™ ¶“XÝÙÕ6Ï8˜úSœ{DHš1jâ)ÁÅj©ßà!Ôæ× 5¥>ž ~Gö“¢3 ¿e‘kå<ÁÙÕÄŽýáŠÑ'pÍÙ{ï1Øm‘1•Ü_är‚8²„ä®ñ#Ìíª2Í»ÎòáèÄ  yç ê´zƒLƒ=äYÑ-.ýù´¡õéb+k ¡ÖQÓÊ>'µ*"Wþb¡²¿tWÌz±Ÿ ôÝ%€:”äάzƒH—ì€×“©-g ñþÛì‚…ò @ú»ª#ìËÿÓ‹õË„¬CPmplȆBN3\F¢Ç«« pÛé¼ä §M]ˆ®(…Y£ ljF³fÌb½5Úr©^žc.5wHµÏ‹ò0 ‹YZrtracklayer/demo/0000755000126300012640000000000012227067657015422 5ustar00biocbuildphs_compbiortracklayer/demo/00Index0000644000126300012640000000010512227067657016550 0ustar00biocbuildphs_compbiotargets Visualizing microRNA target sites in the UCSC Genome Browser rtracklayer/demo/targets.R0000644000126300012640000000251412227067657017220 0ustar00biocbuildphs_compbio################################################### ### chunk number 1: rtl-init ################################################### library(rtracklayer) data(targets) ################################################### ### chunk number 2: rtl-miRNA-track ################################################### targetTrack <- with(targets, RangedData(IRanges(start, end), target, strand, space = chrom)) ################################################### ### chunk number 3: rtl-export eval=FALSE ################################################### ## export(targetTrack, "targets.wig") ################################################### ### chunk number 4: rtl-ucsc-start ################################################### session <- browserSession() ################################################### ### chunk number 5: rtl-ucsc-lay ################################################### session$targets <- targetTrack ################################################### ### chunk number 6: rtl-ucsc-view eval=FALSE ################################################### top <- targetTrack$target == targets$target[1] range <- ranges(targetTrack[top,]) * -10 view <- browserView(session, range, hide = c("refGene", "mgcFullMrna", "intronEst"), dense = "knownGene", squish = "cons44way") rtracklayer/inst/0000755000126300012640000000000012227067671015447 5ustar00biocbuildphs_compbiortracklayer/inst/CITATION0000644000126300012640000000145012227067671016604 0ustar00biocbuildphs_compbiocitEntry(entry="article", title = paste("rtracklayer: an R package for interfacing with genome browsers" ), author = personList( as.person("Michael Lawrence"), as.person("Robert Gentleman"), as.person("Vincent Carey")), year = 2009, journal = "Bioinformatics", volume = "25", pages = "1841-1842", doi = "10.1093/bioinformatics/btp328", url = "http://bioinformatics.oxfordjournals.org/content/25/14/1841.abstract", textVersion = paste("M. Lawrence, R. Gentleman, V. Carey:", "\"rtracklayer: an {R} package for interfacing with", "genome browsers\".", "Bioinformatics 25:1841-1842.")) rtracklayer/inst/doc/0000755000126300012640000000000012227135242016202 5ustar00biocbuildphs_compbiortracklayer/inst/doc/example.bed0000644000126300012640000000131412227067670020321 0ustar00biocbuildphs_compbio##Example 5 from Custom Annotation Tracks User's Guide track name="ItemRGBDemo" description="Item RGB demonstration" visibility=2 itemRgb="On" priority=1 useScore="0" color="0,60,120" colorByStrand="0,0,255 255,0,0" group="user" offset=0 url="http://genome.ucsc.edu/" htmlUrl="http://genome.ucsc.edu/goldenPath/help/ct_description.txt" chr7 127471196 127472363 Pos1 0 + 127471196 127472363 255,0,0 3 300,200,100 0,500,1067 chr7 127472363 127473530 Pos2 2 + 127472363 127473530 255,0,0 2 250,500 0,667 chr7 127473530 127474697 Neg1 0 - 127473530 127474697 255,0,0 1 1167 0 chr16 127474697 127475864 Pos3 5 + 127474697 127475864 255,0,0 1 1167 0 chr16 127475864 127477031 Neg2 5 - 127475864 127477031 0,0,255 1 1167 0 rtracklayer/inst/doc/rtracklayer.R0000644000126300012640000003034312227135242020653 0ustar00biocbuildphs_compbio### R code from vignette source 'rtracklayer.Rnw' ################################################### ### code chunk number 1: initialize ################################################### options(width=70) ################################################### ### code chunk number 2: rtl-init ################################################### library("humanStemCell") data(fhesc) library("genefilter") filtFhesc <- nsFilter(fhesc)[[1]] library("limma") design <- model.matrix(~filtFhesc$Diff) hesclim <- lmFit(filtFhesc, design) hesceb <- eBayes(hesclim) tab <- topTable(hesceb, coef = 2, adjust.method = "BH", n = 7676) tab2 <- tab[(tab$logFC > 1) & (tab$adj.P.Val < 0.01),] affyIDs <- rownames(tab2) library("microRNA") data(hsTargets) library("hgu133plus2.db") entrezIDs <- mappedRkeys(hgu133plus2ENTREZID[affyIDs]) library("org.Hs.eg.db") mappedEntrezIDs <- entrezIDs[entrezIDs %in% mappedkeys(org.Hs.egENSEMBLTRANS)] ensemblIDs <- mappedRkeys(org.Hs.egENSEMBLTRANS[mappedEntrezIDs]) targetMatches <- match(ensemblIDs, hsTargets$target, 0) ## same as data(targets) targets <- hsTargets[targetMatches,] targets$chrom <- paste("chr", targets$chrom, sep = "") ################################################### ### code chunk number 3: rtl-miRNA-track ################################################### library(rtracklayer) library(GenomicRanges) ## call data(targets) if skipping first block head(targets) targetRanges <- IRanges(targets$start, targets$end) targetTrack <- with(targets, GRangesForUCSCGenome("hg18", chrom, targetRanges, strand, name, target)) ################################################### ### code chunk number 4: rtl-miRNA-track-seqinfo ################################################### genome(targetTrack) head(seqlengths(targetTrack)) ################################################### ### code chunk number 5: feature-data-accessors ################################################### head(seqnames(targetTrack)) head(start(targetTrack)) ################################################### ### code chunk number 6: sol-1 ################################################### head(strand(targetTrack)) head(width(targetTrack)) data.frame(chrom = as.factor(seqnames(targetTrack)), start = start(targetTrack), end = end(targetTrack), strand = as.factor(strand(targetTrack))) ################################################### ### code chunk number 7: subset-features ################################################### ## get the first 10 targets first10 <- targetTrack[1:10] ## get pos strand targets posTargets <- targetTrack[strand(targetTrack) == "+"] ## get the targets on chr1 chr1Targets <- targetTrack[seqnames(targetTrack) == "chr1"] ################################################### ### code chunk number 8: sol-2 ################################################### negChr2Targets <- targetTrack[strand(targetTrack) == "-" & seqnames(targetTrack) == "chr2"] ################################################### ### code chunk number 9: export (eval = FALSE) ################################################### ## export(targetTrack, "targets.bed") ################################################### ### code chunk number 10: import (eval = FALSE) ################################################### ## restoredTrack <- import("targets.bed", asRangedData = FALSE) ################################################### ### code chunk number 11: import-gr (eval = FALSE) ################################################### ## restoredTrack <- import("targets.bed", asRangedData = TRUE) ################################################### ### code chunk number 12: sol-3 ################################################### export(targetTrack, "targets.gff") targetGff <- import("targets.gff", asRangedData = FALSE) targetChar <- export(targetTrack, format = "gff1") ################################################### ### code chunk number 13: browserSession (eval = FALSE) ################################################### ## session <- browserSession("UCSC") ################################################### ### code chunk number 14: genomeBrowsers ################################################### genomeBrowsers() ################################################### ### code chunk number 15: layTrack (eval = FALSE) ################################################### ## track(session, "targets") <- targetTrack ################################################### ### code chunk number 16: sol-4 (eval = FALSE) ################################################### ## session$target100 <- targetTrack[1:100] ################################################### ### code chunk number 17: take-subset ################################################### subTargetTrack <- targetTrack[1] # get first feature ################################################### ### code chunk number 18: view-subset (eval = FALSE) ################################################### ## view <- browserView(session, subTargetTrack * -10, pack = "targets") ################################################### ### code chunk number 19: view-subset-multi (eval = FALSE) ################################################### ## view <- browserView(session, targetTrack[1:5] * -10, pack = "targets") ################################################### ### code chunk number 20: sol-6 (eval = FALSE) ################################################### ## viewOut <- browserView(session, range(view) * -2) ## viewFull <- browserView(session, full = "targets") ################################################### ### code chunk number 21: browseGenome (eval = FALSE) ################################################### ## browseGenome(targetTrack, range = subTargetTrack * -10) ################################################### ### code chunk number 22: browseGenome-simple (eval = FALSE) ################################################### ## browseGenome(subTargetTrack) ################################################### ### code chunk number 23: get-track-names (eval = FALSE) ################################################### ## loaded_tracks <- trackNames(session) ################################################### ### code chunk number 24: get-track-data (eval = FALSE) ################################################### ## subTargetTrack <- track(session, "targets", asRangedData = FALSE) ################################################### ### code chunk number 25: get-track-segment (eval = FALSE) ################################################### ## chr1Targets <- track(session, "targets", chr1Targets, asRangedData = FALSE) ################################################### ### code chunk number 26: sol-7 (eval = FALSE) ################################################### ## region <- range(subTargetTrack) + 500 ## targetSNP <- track(session, "snp130", region, asRangedData = FALSE) ## as.data.frame(targetSNP) ## targetGene <- track(session, "knownGene", region, asRangedData = FALSE) ## as.data.frame(targetGene) ################################################### ### code chunk number 27: genomeSegment-view (eval = FALSE) ################################################### ## segment <- range(view) ################################################### ### code chunk number 28: tracks-view (eval = FALSE) ################################################### ## visible_tracks <- trackNames(view) ## trackNames(view) <- visible_tracks ################################################### ### code chunk number 29: track-modes-view (eval = FALSE) ################################################### ## modes <- ucscTrackModes(view) ################################################### ### code chunk number 30: set-track-modes (eval = FALSE) ################################################### ## modes["targets"] ## modes["targets"] <- "full" ## ucscTrackModes(view) <- modes ################################################### ### code chunk number 31: browserViews (eval = FALSE) ################################################### ## views <- browserViews(session) ## length(views) ################################################### ### code chunk number 32: sol-8 (eval = FALSE) ################################################### ## viewTarget <- track(session, "targets", range(view)) ## trackNames(view) <- c("snp130", "knownGene", "targets") ## ucscTrackModes(view)["knownGene"] <- "hide" ################################################### ### code chunk number 33: load-snp ################################################### library(rtracklayer) data(cpneTrack) ################################################### ### code chunk number 34: datavals-accessor ################################################### head(score(cpneTrack)) ################################################### ### code chunk number 35: trackData ################################################### plot(start(cpneTrack), score(cpneTrack)) ################################################### ### code chunk number 36: layTrack-snp (eval = FALSE) ################################################### ## session <- browserSession() ## session$cpne <- cpneTrack ################################################### ### code chunk number 37: browserView-snp (eval = FALSE) ################################################### ## view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne") ################################################### ### code chunk number 38: layTrack-snp2 (eval = FALSE) ################################################### ## track(session, "cpne2", autoScale = FALSE, yLineOnOff = TRUE, ## yLineMark = quantile(score(cpneTrack), .25)) <- cpneTrack ## view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne2") ################################################### ### code chunk number 39: search-nrsf ################################################### library(BSgenome.Hsapiens.UCSC.hg19) nrsfHits <- matchPattern("TCAGCACCATGGACAG", Hsapiens[["chr1"]]) length(nrsfHits) # number of hits ################################################### ### code chunk number 40: track-nrsf ################################################### nrsfTrack <- GenomicData(ranges(nrsfHits), strand="+", chrom="chr1", genome = "hg19", asRangedData = FALSE) ################################################### ### code chunk number 41: browserView-nrsf (eval = FALSE) ################################################### ## session <- browseGenome(nrsfTrack, range = range(nrsfTrack[1]) * -10) ################################################### ### code chunk number 42: rmsk.e2f3 (eval = FALSE) ################################################### ## library (rtracklayer) ## mySession = browserSession("UCSC") ## genome(mySession) <- "hg19" ## e2f3.tss.grange <- GRanges("chr6", IRanges(20400587, 20403336)) ## tbl.rmsk <- getTable( ## ucscTableQuery(mySession, track="rmsk", ## range=e2f3.tss.grange, table="rmsk")) ################################################### ### code chunk number 43: uwDgfEncodeExample (eval = FALSE) ################################################### ## track.name <- "wgEncodeUwDgf" ## table.name <- "wgEncodeUwDgfK562Hotspots" ## e2f3.grange <- GRanges("chr6", IRanges(20400587, 20403336)) ## mySession <- browserSession () ## tbl.k562.dgf.e2f3 <- getTable(ucscTableQuery (mySession, track=track.name, ## range=e2f3.grange, table=table.name)) ## tbl.k562.dgf.hg19 <- getTable(ucscTableQuery (mySession, track=track.name, ## table=table.name)) ################################################### ### code chunk number 44: trackAndTableNameDiscovery (eval = FALSE) ################################################### ## mySession <- browserSession () ## genome(mySession) <- "hg19" ## # 177 tracks in October 2012 ## track.names <- trackNames(ucscTableQuery(mySession)) ## # chose a few tracks at random from this set, and discover how ## # many tables they hold ## tracks <- track.names [c (99, 81, 150, 96, 90)] ## sapply(tracks, function(track) { ## length(tableNames(ucscTableQuery(mySession, track=track))) ## }) ################################################### ### code chunk number 45: session-info ################################################### sessionInfo() rtracklayer/inst/doc/rtracklayer.Rnw0000644000126300012640000007042712227067670021240 0ustar00biocbuildphs_compbio\documentclass{article} %\VignetteIndexEntry{rtracklayer} \usepackage[usenames,dvipsnames]{color} \usepackage[colorlinks=true, linkcolor=Blue, urlcolor=Blue, citecolor=Blue]{hyperref} \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rfunarg}[1]{{\texttt{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\software}[1]{\textsf{#1}} \newcommand{\R}{\software{R}} \newcommand{\IRanges}{\Rpackage{IRanges}} \title{The \textbf{rtracklayer} package} \author{Michael Lawrence} \begin{document} \maketitle <>= options(width=70) @ \tableofcontents \section{Introduction} The \textbf{rtracklayer} package is an interface (or \emph{layer}) between \textbf{R} and genome browsers. Its main purpose is the visualization of genomic annotation \emph{tracks}, whether generated through experimental data analysis performed in R or loaded from an external data source. The features of \textbf{rtracklayer} may be divided into two categories: 1) the import/export of track data and 2) the control and querying of external genome browser sessions and views. There are two basic track data structures in Bioconductor: \Rclass{GRanges}, defined by the \Rpackage{GenomicRanges} package, and \Rclass{RangedData}, a more general data structure from the \Rpackage{IRanges} package. For most purposes, \Rclass{GRanges} is preferred in the context of \Rpackage{rtracklayer}; however, \Rclass{RangedData} has some particular use cases. \textbf{rtracklayer} supports the import and export of tracks from and to files in various formats, see Section~\ref{sec:import-export}. All positions in a \Rclass{GRanges} or \Rclass{RangedData} should be 1-based, as in R itself. The \textbf{rtracklayer} package currently interfaces with the \textbf{UCSC} web-based genome browser. Other packages may provide drivers for other genome browsers through a plugin system. With \textbf{rtracklayer}, the user may start a genome browser session, create and manipulate genomic views, and import/export tracks and sequences to and from a browser. Please note that not all features are necessarily supported by every browser interface. The rest of this vignette will consist of a number of case studies. First, we consider an experiment investigating microRNA regulation of gene expression, where the microRNA target sites are the primary genomic features of interest. \section{Gene expression and microRNA target sites} This section will demonstrate the features of \textbf{rtracklayer} on a microarray dataset from a larger experiment investigating the regulation of human stem cell differentiation by microRNAs. The transcriptome of the cells was measured before and after differentiation by HG-U133plus2 Affymetrix GeneChip arrays. We begin our demonstration by constructing an annotation dataset from the experimental data, and then illustrate the use of the genome browser interface to display interesting genomic regions in the UCSC browser. \subsection{Creating a target site track} For the analysis of the stem cell microarray data, we are interested in the genomic regions corresponding to differentially expressed genes that are known to be targeted by a microRNA. We will represent this information as an annotation track, so that we may view it in the UCSC genome browser. \subsubsection{Constructing the \Rclass{GRanges}} In preparation for creating the microRNA target track, we first used \textbf{limma} to detect the differentially expressed genes in the microarray experiment. The locations of the microRNA target sites were obtained from MiRBase. The code below stores information about the target sites on differentially expressed genes in the \textit{data.frame} called \texttt{targets}, which can also be obtained by entering \texttt{data(targets)} when \textbf{rtracklayer} is loaded. % <>= library("humanStemCell") data(fhesc) library("genefilter") filtFhesc <- nsFilter(fhesc)[[1]] library("limma") design <- model.matrix(~filtFhesc$Diff) hesclim <- lmFit(filtFhesc, design) hesceb <- eBayes(hesclim) tab <- topTable(hesceb, coef = 2, adjust.method = "BH", n = 7676) tab2 <- tab[(tab$logFC > 1) & (tab$adj.P.Val < 0.01),] affyIDs <- rownames(tab2) library("microRNA") data(hsTargets) library("hgu133plus2.db") entrezIDs <- mappedRkeys(hgu133plus2ENTREZID[affyIDs]) library("org.Hs.eg.db") mappedEntrezIDs <- entrezIDs[entrezIDs %in% mappedkeys(org.Hs.egENSEMBLTRANS)] ensemblIDs <- mappedRkeys(org.Hs.egENSEMBLTRANS[mappedEntrezIDs]) targetMatches <- match(ensemblIDs, hsTargets$target, 0) ## same as data(targets) targets <- hsTargets[targetMatches,] targets$chrom <- paste("chr", targets$chrom, sep = "") @ % The following code creates the track from the \texttt{targets} dataset: % <>= library(rtracklayer) library(GenomicRanges) ## call data(targets) if skipping first block head(targets) targetRanges <- IRanges(targets$start, targets$end) targetTrack <- with(targets, GRangesForUCSCGenome("hg18", chrom, targetRanges, strand, name, target)) @ % The \Rfunction{GRangesForUCSCGenome} function constructs a \Rclass{GRanges} object for the named genome. The strand information, the name of the microRNA and the Ensembl ID of the targeted transcript are stored in the \Rclass{GRanges}. The chromosome for each site is passed as the \texttt{chrom} argument. The chromosome names and lengths for the genome are taken from the UCSC database and stored in the \Rclass{GRanges} along with the genome identifier. We can retrieve them as follows: <>= genome(targetTrack) head(seqlengths(targetTrack)) @ % While this extra information is not strictly needed to upload data to UCSC, calling \Rfunction{GRangesForUCSCGenome} is an easy way to formally associate interval data to a UCSC genome build. This ensures, for example, that the data will always be uploaded to the correct genome, regardless of browser state. It also immediately validates whether the intervals fall within the bounds of the genome. For cases where one is not interacting with the UCSC genome browser, and in particular when network access is unavailable, the \Rfunction{GRangesForBSGenome} function behaves the same, except it finds an installed \Rpackage{BSGenome} package and loads it to retrieve the chromosome information. \subsubsection{Accessing track information} The track information is now stored in the R session as a \Rclass{GRanges} object. It holds the chromosme, start, end and strand for each feature, along with any number of data columns. The primary feature attributes are the \texttt{start}, \texttt{end}, \texttt{seqnames} and \texttt{strand}. There are accessors for each of these, named accordingly. For example, the following code retrieves the chromosome names and then start positions for each feature in the track. % <>= head(seqnames(targetTrack)) head(start(targetTrack)) @ % \paragraph{Exercises} \begin{enumerate} \item Get the strand of each feature in the track \item Calculate the length of each feature \item Reconstruct (partially) the \texttt{targets} \Rclass{data.frame} \end{enumerate} <>= head(strand(targetTrack)) head(width(targetTrack)) data.frame(chrom = as.factor(seqnames(targetTrack)), start = start(targetTrack), end = end(targetTrack), strand = as.factor(strand(targetTrack))) @ \subsubsection{Subsetting a \textit{GRanges}} It is often helpful to extract subsets from \Rclass{GRanges} instances, especially when uploading to a genome browser. The data can be subset though a matrix-style syntax by feature and column. The conventional \texttt{[} method is employed for subsetting, where the first parameter, \textit{i}, indexes the features and \textit{j} indexes the data columns. Both \textit{i} and \textit{j} may contain numeric, logical and character indices, which behave as expected. % <>= ## get the first 10 targets first10 <- targetTrack[1:10] ## get pos strand targets posTargets <- targetTrack[strand(targetTrack) == "+"] ## get the targets on chr1 chr1Targets <- targetTrack[seqnames(targetTrack) == "chr1"] @ % \paragraph{Exercises} \begin{enumerate} \item Subset the track for all features on the negative strand of chromosome 2. \end{enumerate} <>= negChr2Targets <- targetTrack[strand(targetTrack) == "-" & seqnames(targetTrack) == "chr2"] @ \subsubsection{Exporting and importing tracks} \label{sec:import-export} Import and export of \Rclass{GRanges} and \Rclass{RangedData} instances is supported in the following formats: Browser Extended Display (BED), versions 1, 2 and 3 of the General Feature Format (GFF), and Wiggle (WIG). Support for additional formats may be provided by other packages through a plugin system. To save the microRNA target track created above in a format understood by other tools, we could export it as BED. This is done with the \texttt{export} function, which accepts a filename or any R connection object as its target. If a target is not given, the serialized string is returned. The desired format is derived, by default, from the extension of the filename. Use the \texttt{format} parameter to explicitly specify a format. <>= export(targetTrack, "targets.bed") @ To read the data back in a future session, we could use the \texttt{import} function. The source of the data may be given as a connection, a filename or a character vector containing the data. Like the \texttt{export} function, the format is determined from the filename, by default. <>= restoredTrack <- import("targets.bed", asRangedData = FALSE) @ % The \Robject{restoredTrack} object is of class \Rclass{GRanges}. To obtain a \Rclass{RangedData} object directly upon importing, pass \Rcode{asRangedData = TRUE} to \Rfunction{import}: <>= restoredTrack <- import("targets.bed", asRangedData = TRUE) @ % \paragraph{Exercises} \begin{enumerate} \item Output the track to a file in the ``gff'' format. \item Read the track back into R. \item Export the track as a character vector. \end{enumerate} <>= export(targetTrack, "targets.gff") targetGff <- import("targets.gff", asRangedData = FALSE) targetChar <- export(targetTrack, format = "gff1") @ \subsection{Viewing the targets in a genome browser} For the next step in our example, we will load the track into a genome browser for visualization with other genomic annotations. The \textbf{rtracklayer} package is capable of interfacing with any genome browser for which a driver exists. In this case, we will interact with the web-based \textbf{UCSC} browser, but the same code should work for any browser. \subsubsection{Starting a session} The first step towards interfacing with a browser is to start a browser session, represented in R as a \textit{BrowserSession} object. A \textit{BrowserSession} is primarily a container of tracks and genomic views. The following code creates a \textit{BrowserSession} for the \textbf{UCSC} browser: <>= session <- browserSession("UCSC") @ Note that the name of any other supported browser could have been given here instead of ``UCSC''. To see the names of supported browsers, enter: <>= genomeBrowsers() @ \subsubsection{Laying the track} Before a track can be viewed on the genome, it must be loaded into the session using the \texttt{track<-} function, as demonstrated below: <>= track(session, "targets") <- targetTrack @ The \textit{name} argument should be a character vector that will help identify the track within \texttt{session}. Note that the invocation of \texttt{track<-} above does not specify an upload format. Thus, the default, ``auto'', is used. Since the track does not contain any data values, the track is uploaded as BED. To make this explicit, we could pass ``bed'' as the \textit{format} parameter. \paragraph{Exercises} \begin{enumerate} \item Lay a track with the first 100 features of \texttt{targetTrack} \end{enumerate} Here we use the short-cut \texttt{\$} syntax for storing the track. <>= session$target100 <- targetTrack[1:100] @ \subsubsection{Viewing the track} For \textbf{UCSC}, a view roughly corresponds to one tab or window in the web browser. The target sites are distributed throughout the genome, so we will only be able to view a few features at a time. In this case, we will view only the first feature in the track. A convenient way to focus a view on a particular set of features is to subset the track and pass the range of the subtrack to the constructor of the view. Below we take a track subset that contains only the first feature. <>= subTargetTrack <- targetTrack[1] # get first feature @ Now we call the \texttt{browserView} function to construct the view and pass the subtrack, zoomed out by a factor of 10, as the segment to view. By passing the name of the targets track in the \textit{pack} parameter, we instruct the browser to use the ``pack'' mode for viewing the track. This results in the name of the microRNA appearing next to the target site glyph. <>= view <- browserView(session, subTargetTrack * -10, pack = "targets") @ If multiple ranges are provided, multiple views are launched: <>= view <- browserView(session, targetTrack[1:5] * -10, pack = "targets") @ \paragraph{Exercises} \begin{enumerate} \item Create a new view with the same region as \texttt{view}, except zoomed out 2X. \item Create a view with the ``targets'' track displayed in ``full'' mode, instead of ``packed''. \end{enumerate} <>= viewOut <- browserView(session, range(view) * -2) viewFull <- browserView(session, full = "targets") @ \subsubsection{A shortcut} There is also a shortcut to the above steps. The \texttt{browseGenome} function creates a session for a specified browser, loads one or more tracks into the session and creates a view of a given genome segment. In the following code, we create a new \textbf{UCSC} session, load the track and view the first two features, all in one call: <>= browseGenome(targetTrack, range = subTargetTrack * -10) @ It is even simpler to view the subtrack in \textbf{UCSC} by relying on parameter defaults: <>= browseGenome(subTargetTrack) @ \subsubsection{Downloading Tracks from your Web Browser} @ It is possible to query the browser to obtain the names of the loaded tracks and to download the tracks into R. To list the tracks loaded in the browser, enter the following: % <>= loaded_tracks <- trackNames(session) @ % One may download any of the tracks, such as the ``targets'' track that was loaded previously in this example. % <>= subTargetTrack <- track(session, "targets", asRangedData = FALSE) @ % The returned object is a \Rclass{GRanges}, even if the data was originally uploaded as a \Rclass{RangedData} or other object. To get a \Rclass{RangedData} instead, pass \Rcode{asRangedData = TRUE}. By default, the segment of the track downloaded is the current default genome segment associated with the session. One may download track data for any genome segment, such as those on a particular chromosome. Note that this does not distinguish by strand; we are only indicating a position on the genome. % <>= chr1Targets <- track(session, "targets", chr1Targets, asRangedData = FALSE) @ \paragraph{Exercises} \begin{enumerate} \item Get the SNP under the first target, displayed in \texttt{view}. \item Get the UCSC gene for the same target. \end{enumerate} <>= region <- range(subTargetTrack) + 500 targetSNP <- track(session, "snp130", region, asRangedData = FALSE) as.data.frame(targetSNP) targetGene <- track(session, "knownGene", region, asRangedData = FALSE) as.data.frame(targetGene) @ \subsubsection{Accessing view state} The \texttt{view} variable is an instance of \textit{BrowserView}, which provides an interface for getting and setting view attributes. Note that for the UCSC browser, changing the view state opens a new view, as a new page must be opened in the web browser. To programmatically query the segment displayed by a view, use the \texttt{range} method for a \textit{BrowserView}. % <>= segment <- range(view) @ % Similarly, one may get and set the names of the visible tracks in the view. <>= visible_tracks <- trackNames(view) trackNames(view) <- visible_tracks @ The visibility mode (hide, dense, pack, squish, full) of the tracks may be retrieved with the \texttt{ucscTrackModes} method. % <>= modes <- ucscTrackModes(view) @ % The returned value, \texttt{modes}, is of class \textit{UCSCTrackModes}. The modes may be accessed using the \texttt{[} function. Here, we set the mode of our ``targets'' track to ``full'' visibility. <>= modes["targets"] modes["targets"] <- "full" ucscTrackModes(view) <- modes @ Existing browser views for a session may be retrieved by calling the \texttt{browserViews} method on the \textit{browserSession} instance. % <>= views <- browserViews(session) length(views) @ % \paragraph{Exercises} \begin{enumerate} \item Retrieve target currently visible in the view. \item Limit the view to display only the SNP, UCSC gene and target track. \item Hide the UCSC gene track. \end{enumerate} <>= viewTarget <- track(session, "targets", range(view)) trackNames(view) <- c("snp130", "knownGene", "targets") ucscTrackModes(view)["knownGene"] <- "hide" @ \section{CPNE1 expression and HapMap SNPs} Included with the \textbf{rtracklayer} package is a track object (created by the \textbf{GGtools} package) with features from a subset of the SNPs on chromosome 20 from 60 HapMap founders in the CEU cohort. Each SNP has an associated data value indicating its association with the expression of the CPNE1 gene according to a Cochran-Armitage 1df test. The top 5000 scoring SNPs were selected for the track. We load the track presently. <>= library(rtracklayer) data(cpneTrack) @ \subsection{Loading and manipulating the track} The data values for a track are stored in the columns on the \textit{RangedData} instance. Often, a track contains a single column of numeric values, conventionally known as the \textit{score}. The \texttt{score} function retrieves the column named or \textit{score} or, if one does not exist, the first column in the \textit{RangedData}, as long as it is numeric. Otherwise, \texttt{NULL} is returned. <>= head(score(cpneTrack)) @ % Sometimes, it may be convenient to extract the track information as a % \textit{data.frame}. The \textit{trackData} function does this by % combining the \textit{featureData} matrix with the \textit{dataVals}. % It also adds a column named \textit{featMid}, which gives the % mid-points (the mean of the start and end positions) of each feature % in the track. Here is an example of using \textit{trackData} to plot % the test value for each SNP vs. its position. One use of extracting the data values is to plot the data. <>= plot(start(cpneTrack), score(cpneTrack)) @ \subsection{Browsing the SNPs} We now aim to view some of the SNPs in the UCSC browser. Unlike the microRNA target site example above, this track has quantitative information, which requires special consideration for visualization. \subsubsection{Laying a WIG track} To view the SNP locations as a track in a genome browser, we first need to upload the track to a fresh session. In the code below, we use the \texttt{[[<-} alias of \texttt{track<-}. <>= session <- browserSession() session$cpne <- cpneTrack @ % Note that because \texttt{cpneTrack} contains data values and its features do not overlap, it is uploaded to the browser in the WIG format. One limitation of the WIG format is that it is not possible to encode strand information. Thus, each strand needs to have its own track, and \textbf{rtracklayer} does this automatically, unless only one strand is represented in the track (as in this case). One could pass ``bed'' to the \textit{format} parameter of \texttt{track<-} to prevent the split, but tracks uploaded as BED are much more limited compared to WIG tracks in terms of visualization options. To form the labels for the WIG subtracks, `` p'' is concatenated onto the plus track and `` m'' onto the minus track. Features with missing track information are placed in a track named with the `` na'' postfix. It is important to note that the subtracks must be identified individually when, for example, downloading the track or changing track visibility. \subsubsection{Plotting the SNP track} To plot the data values for the SNP's in a track, we need to create a \textit{browserView}. We will view the region spanning the first 5 SNPs in the track, which will be displayed in the ``full'' mode. % <>= view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne") @ % The UCSC browser will plot the data values as bars. There are several options available for tweaking the plot, as described in the help for the \textit{GraphTrackLine} class. These need to be specified laying the track, so we will lay a new track named ``cpne2''. First, we will turn the \textit{autoScale} option off, so that the bars will be scaled globally, rather than locally to the current view. Then we could turn on the \textit{yLineOnOff} option to add horizontal line that could represent some sort of cut-off. The position of the line is specified by \textit{yLineMark}. We set it arbitrarily to the 25\% quantile. % <>= track(session, "cpne2", autoScale = FALSE, yLineOnOff = TRUE, yLineMark = quantile(score(cpneTrack), .25)) <- cpneTrack view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne2") @ % \section{Binding sites for NRSF} \label{sec:binding} Another common type of genomic feature is transcription factor binding sites. Here we will use the \textbf{Biostrings} package to search for matches to the binding motif for NRSF, convert the result to a track, and display a portion of it in the \textbf{UCSC} browser. \subsection{Creating the binding site track} We will use the \textbf{Biostrings} package to search human chromosome 1 for NRSF binding sites. The binding sequence motif is assumed to be \textit{TCAGCACCATGGACAG}, though in reality it is more variable. To perform the search, we run \textit{matchPattern} on the positive strand of chromosome 1. % <>= library(BSgenome.Hsapiens.UCSC.hg19) nrsfHits <- matchPattern("TCAGCACCATGGACAG", Hsapiens[["chr1"]]) length(nrsfHits) # number of hits @ % We then convert the hits, stored as a \textit{Views} object (a particular type of \textit{IRanges} object), to a \textit{RangedData} instance. % <>= nrsfTrack <- GenomicData(ranges(nrsfHits), strand="+", chrom="chr1", genome = "hg19", asRangedData = FALSE) @ % \Rfunction{GenomicData} is a convenience function that by default constructs a \Rclass{GRanges} object. A \Rclass{RangedData} may be obtained by passing \Rcode{asRangedData = TRUE} and may be preferred in this case, as the \Robject{nrsfHits} object will then be stored as a \Rclass{Views} object in \Robject{nrsfTrack} without any loss of information, in particular the sequence of chr1. \subsection{Browsing the binding sites} Now that the NRSF binding sites are stored as a track, we can upload them to the UCSC browser and view them. Below, load the track and we view the region around the first hit in a single call to \texttt{browseGenome}. % <>= session <- browseGenome(nrsfTrack, range = range(nrsfTrack[1]) * -10) @ % We observe significant conservation across mammal species in the region of the motif. \section{Downloading tracks from UCSC} \Rclass{rtracklayer} can be used to download annotation tracks from the UCSC table browser, thus providing a convenient programmatic alternative to the web interface available at \url{http://genome.ucsc.edu/cgi-bin/hgTables}. \textbf{Note} that not all tables are output in parseable form, and that \textbf{UCSC will truncate responses} if they exceed certain limits (usually around 100,000 records). The safest (and most efficient) bet for large queries is to download the file via FTP and query it locally. \subsection{Example 1: the RepeatMasker Track} This simple example identifies repeat-masked regions in and around the transcription start site (TSS) of the human E2F3 gene, in hg19: <>= library (rtracklayer) mySession = browserSession("UCSC") genome(mySession) <- "hg19" e2f3.tss.grange <- GRanges("chr6", IRanges(20400587, 20403336)) tbl.rmsk <- getTable( ucscTableQuery(mySession, track="rmsk", range=e2f3.tss.grange, table="rmsk")) @ There are several important points to understand about this example: \begin{enumerate} \item The \Rcode{ucscTableQuery} used above is a proxy for, and provides communication with, the remote UCSC table browser (see \url{http://genome.ucsc.edu/cgi-bin/hgTables}). \item You must know the name of the track and table (or sub-track) that you want. The way to do this is explained in detail below, in section 5.3. \item If the track contains multiple tables (which is the case for many ENCODE tracks, for instance), then you must also specify that table name. \item When the track contains a single table only, you may omit the \Rcode{table} parameter, or reuse the track name (as we did above). \item If you omit the range parameter, the full track table is returned, covering the entire genome. \item The amount of time required to download a track is roughly a function of the number of features in the track, which is in turn a function of the density of those features, and the length of the genomic range you request. To download the entire RepeatMasker track, for all of h19, would take a very long time, and is a task poorly suited to rtracklayer. By contrast, one full-genome DNaseI track takes less than a minute (see below). \end{enumerate} \subsection{Example 2: DNaseI hypersensitivity regions in the K562 Cell Line} The ENCODE project (\url{http://encodeproject.org/ENCODE}) provides many hundreds of annotation tracks to the UCSC table browser. One of these describes DNaseI hypersensitivity for K562 cells (an immortalized erythroleukemia line) measured at the University of Washington using 'Digital Genome Footprinting' (see \url{http://www.ncbi.nlm.nih.gov/pubmed?term=19305407}). Obtain DNaseI hypersensitive regions near the E2F3 TSS, and for all of hg19: <>= track.name <- "wgEncodeUwDgf" table.name <- "wgEncodeUwDgfK562Hotspots" e2f3.grange <- GRanges("chr6", IRanges(20400587, 20403336)) mySession <- browserSession () tbl.k562.dgf.e2f3 <- getTable(ucscTableQuery (mySession, track=track.name, range=e2f3.grange, table=table.name)) tbl.k562.dgf.hg19 <- getTable(ucscTableQuery (mySession, track=track.name, table=table.name)) @ \subsection{Discovering Which Tracks and Tables are Available from UCSC} As the examples above demonstrate, you must know the exact UCSC-style name for the track and table you wish to download. You may browse these interactively at \url{http://genome.ucsc.edu/cgi-bin/hgTables?org=Human&db=hg19} or programmatically, as we demonstrate here. <>= mySession <- browserSession () genome(mySession) <- "hg19" # 177 tracks in October 2012 track.names <- trackNames(ucscTableQuery(mySession)) # chose a few tracks at random from this set, and discover how # many tables they hold tracks <- track.names [c (99, 81, 150, 96, 90)] sapply(tracks, function(track) { length(tableNames(ucscTableQuery(mySession, track=track))) }) @ \section{Conclusion} These case studies have demonstrated a few of the most important features of \textbf{rtracklayer}. Please see the package documentation for more details. The following is the session info that generated this vignette: <>= sessionInfo() @ \end{document} rtracklayer/inst/doc/rtracklayer.pdf0000644000126300012640000125533312227135242021234 0ustar00biocbuildphs_compbio%PDF-1.4 %ÐÔÅØ 1 0 obj << /S /GoTo /D (section.1) >> endobj 4 0 obj (Introduction) endobj 5 0 obj << /S /GoTo /D (section.2) >> endobj 8 0 obj (Gene expression and microRNA target sites) endobj 9 0 obj << /S /GoTo /D (subsection.2.1) >> endobj 12 0 obj (Creating a target site track) endobj 13 0 obj << /S /GoTo /D (subsubsection.2.1.1) >> endobj 16 0 obj (Constructing the GRanges) endobj 17 0 obj << /S /GoTo /D (subsubsection.2.1.2) >> endobj 20 0 obj (Accessing track information) endobj 21 0 obj << /S /GoTo /D (subsubsection.2.1.3) >> endobj 24 0 obj (Subsetting a GRanges) endobj 25 0 obj << /S /GoTo /D (subsubsection.2.1.4) >> endobj 28 0 obj (Exporting and importing tracks) endobj 29 0 obj << /S /GoTo /D (subsection.2.2) >> endobj 32 0 obj (Viewing the targets in a genome browser) endobj 33 0 obj << /S /GoTo /D (subsubsection.2.2.1) >> endobj 36 0 obj (Starting a session) endobj 37 0 obj << /S /GoTo /D (subsubsection.2.2.2) >> endobj 40 0 obj (Laying the track) endobj 41 0 obj << /S /GoTo /D (subsubsection.2.2.3) >> endobj 44 0 obj (Viewing the track) endobj 45 0 obj << /S /GoTo /D (subsubsection.2.2.4) >> endobj 48 0 obj (A shortcut) endobj 49 0 obj << /S /GoTo /D (subsubsection.2.2.5) >> endobj 52 0 obj (Downloading Tracks from your Web Browser) endobj 53 0 obj << /S /GoTo /D (subsubsection.2.2.6) >> endobj 56 0 obj (Accessing view state) endobj 57 0 obj << /S /GoTo /D (section.3) >> endobj 60 0 obj (CPNE1 expression and HapMap SNPs) endobj 61 0 obj << /S /GoTo /D (subsection.3.1) >> endobj 64 0 obj (Loading and manipulating the track) endobj 65 0 obj << /S /GoTo /D (subsection.3.2) >> endobj 68 0 obj (Browsing the SNPs) endobj 69 0 obj << /S /GoTo /D (subsubsection.3.2.1) >> endobj 72 0 obj (Laying a WIG track) endobj 73 0 obj << /S /GoTo /D (subsubsection.3.2.2) >> endobj 76 0 obj (Plotting the SNP track) endobj 77 0 obj << /S /GoTo /D (section.4) >> endobj 80 0 obj (Binding sites for NRSF) endobj 81 0 obj << /S /GoTo /D (subsection.4.1) >> endobj 84 0 obj (Creating the binding site track) endobj 85 0 obj << /S /GoTo /D (subsection.4.2) >> endobj 88 0 obj (Browsing the binding sites) endobj 89 0 obj << /S /GoTo /D (section.5) >> endobj 92 0 obj (Downloading tracks from UCSC) endobj 93 0 obj << /S /GoTo /D (subsection.5.1) >> endobj 96 0 obj (Example 1: the RepeatMasker Track) endobj 97 0 obj << /S /GoTo /D (subsection.5.2) >> endobj 100 0 obj (Example 2: DNaseI hypersensitivity regions in the K562 Cell Line) endobj 101 0 obj << /S /GoTo /D (subsection.5.3) >> endobj 104 0 obj (Discovering Which Tracks and Tables are Available from UCSC) endobj 105 0 obj << /S /GoTo /D (section.6) >> endobj 108 0 obj (Conclusion) endobj 109 0 obj << /S /GoTo /D [110 0 R /Fit ] >> endobj 139 0 obj << /Length 1537 /Filter /FlateDecode >> stream xÚÍYßSâH~÷¯ÈcRud3¿’ɽ)«ž·®g)»û°u¢R XåüﯻgI@ÅÂdÒ3éù¦ûëîIàÜ:sz¬ø?ê|9Òa‘Ï™’NçÆáLú\k'dÊ1w:}ç·Ûñ˜{—zÿvþñ¸(.¸/a‚ÀÈM@.ÃKÒósï¡õ€wžàî ö¤p7±ó”^‡¾a>Ï# bnÏã!Ì¢„›Üz8šFòÀaÌ•â8²¥…*§Åµ¯cfƘÁ‘{ggJ¼–àÊ=§{®Ýª™ŽPަu¸ Ó_DÊLó>Íà2îz-Ð$˜ItÉ?L›C;€ x¤/dh”c ‹`^É}­c3o{ FˆG–Î[SÀ ν“·¾Á)æÄ~òç @IX>‹ÌdÌkÅ ÇÙA&ðÇ Yàö¡õD ˜×áôùÆ;¿a=AÌAýUo¿G›÷póžSÂ,…Whá¦ÿAû‘öú¦p™H|I$(ÝÇ6w‡Ðô&Vàê.‡æI–LÌþfÍ“¥ÓªÖ,`š­Ñúˉ.@;K »@æb×áãny0n›Opñ…£[x»­Ív'(q›¢Z€ïÔ f©¹G‰ ;Ô}UUÍ×÷Z2Ž *¨é¬ýk ¹édU,CZ(óÞZCଠG1,¢˜CÉdF=šÒþ"O¹ã¨àМGTi£ð^Ærÿ?Eûð ?Êí¢l åm–18Ü|ðûb^'¹%®-¦€€Åjì/Ü"{Øëd|4-ÙÓÝ‹$ÄoÐÇðÑpnÚã%P߃EÖa¥^Ç*X’° ]£Íu¢4³fXöèe£Óq1vmjsÊ—±ú›k<Ù2¸Qp[LQòxÆÒb|lèCáxRãÞɨ¿0ÂáÁôx4Úp =]tø1:û ­3T× _«Û³Õ#Èõ<Þf¦³ˆwO§+Mµ¿àºeüšs_X.ç ÚÄË:ƒ[“§Dѧ¨±ŸFÛE ^Œ?è`³b” ÈþV °Mb­?§¹½5b9ÿZ7¼£ô"£ ŠŒlñ¡Æónf¦wMYоΠ{„µð8éWÈ­ã\E3Ãă¼ö†j¥¡{Aç?‘IRÇ/OKJSºæþÈTVø2"Ê¥èÅbçraDÂWòÙgKìélA÷²´ªKÈä'3­ºÔ+~¬Jiß‘¯•.ÞÂÞm@âkæcfŠæÍŠï¿H”þnÔy mœòr¹Îæ<tÐìPk‹b­}¦¿*a’ªøôñ)?4Êj澊ªÚghgà+,ØØYD1,:ôšØ~}q¹T«€ ’ïÿÀaçü’`dÛQˆ¥³>OJr:eîÙi#ÛŠ û|"h·Å­ÖüŠ©å%ŬºŠºâŽD%—Íò¦0Ø»½ÕÆß„¯¥áë£aßrñ ¤;?Ú¤»›±èÐF*¾B O–jâ Ññ.GŸ²ÁÑge[»ùã~E®ö$t s¹wâÙrÏ«N"·àènþ¬1˜^%ðºbþ3pN-ŽbcßÉ-´è;ÊøÎWp›l6€^RΜ5¯~jšš¬çÆœ’0wh¤~`æ„^Õ^Ò\…B’W‰¼J½ŠŽÈ’á£UÛzû°“KÎu•Úó´ˆòø$£Ü =ëÞ³}“y Wðª.Õù`껑*ºQ=l܆æp‘L3óäxyÌ¿ÊáaúÕœ”ðÿy~ƒ²Æ'(vkNòƒ·Ñ‚À {ó K¸››vú@š‘à9¹p¹$)%‡ÜaáÀp1=¢–g\-³Â¿îlŸýÖIú­ª' õ@.•tæGÝFb²@àðÙS¡› ò|¼[Ø™Ëöyqú£]ë`B²Zƒ‰š Ô„/ÂEmDužG<<Ñz˜ß=…ŠÈéÕšã}ƾÀÏÊRû"˜j-8îüb—…Ú endstream endobj 110 0 obj << /Type /Page /Contents 139 0 R /Resources 138 0 R /MediaBox [0 0 612 792] /Parent 149 0 R /Annots [ 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 127 0 R 128 0 R 129 0 R 130 0 R 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R 136 0 R 137 0 R ] >> endobj 111 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.772 497.323 212.801 506.19] /A << /S /GoTo /D (section.1) >> >> endobj 112 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.772 473.473 371.325 484.272] /A << /S /GoTo /D (section.2) >> >> endobj 113 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [147.716 461.518 291.635 472.357] /A << /S /GoTo /D (subsection.2.1) >> >> endobj 114 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [170.63 449.563 320.606 460.402] /A << /S /GoTo /D (subsubsection.2.1.1) >> >> endobj 115 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [170.63 437.607 325.767 448.447] /A << /S /GoTo /D (subsubsection.2.1.2) >> >> endobj 116 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [170.63 425.652 301.229 436.491] /A << /S /GoTo /D (subsubsection.2.1.3) >> >> endobj 117 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [170.63 413.697 343.271 424.536] /A << /S /GoTo /D (subsubsection.2.1.4) >> >> endobj 118 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [147.716 401.742 350.882 412.581] /A << /S /GoTo /D (subsection.2.2) >> >> endobj 119 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [170.63 389.787 280.995 400.437] /A << /S /GoTo /D (subsubsection.2.2.1) >> >> endobj 120 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [170.63 377.831 276.562 388.671] /A << /S /GoTo /D (subsubsection.2.2.2) >> >> endobj 121 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [170.63 365.876 282.221 376.716] /A << /S /GoTo /D (subsubsection.2.2.3) >> >> endobj 122 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [170.63 355.854 251.307 364.76] /A << /S /GoTo /D (subsubsection.2.2.4) >> >> endobj 123 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [170.63 341.966 400.277 352.805] /A << /S /GoTo /D (subsubsection.2.2.5) >> >> endobj 124 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [170.63 330.011 293.687 340.661] /A << /S /GoTo /D (subsubsection.2.2.6) >> >> endobj 125 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.772 308.093 344.765 318.892] /A << /S /GoTo /D (section.3) >> >> endobj 126 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [147.716 296.138 330.389 306.977] /A << /S /GoTo /D (subsection.3.1) >> >> endobj 127 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [147.716 284.183 256.826 295.022] /A << /S /GoTo /D (subsection.3.2) >> >> endobj 128 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [170.63 272.228 292.682 283.067] /A << /S /GoTo /D (subsubsection.3.2.1) >> >> endobj 129 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [170.63 260.272 305.712 271.112] /A << /S /GoTo /D (subsubsection.3.2.2) >> >> endobj 130 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.772 238.355 267.386 249.154] /A << /S /GoTo /D (section.4) >> >> endobj 131 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [147.716 226.399 307.076 237.239] /A << /S /GoTo /D (subsection.4.1) >> >> endobj 132 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [147.716 214.444 287.959 225.283] /A << /S /GoTo /D (subsection.4.2) >> >> endobj 133 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.772 192.526 311.281 203.326] /A << /S /GoTo /D (section.5) >> >> endobj 134 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [147.716 180.571 333.378 191.41] /A << /S /GoTo /D (subsection.5.1) >> >> endobj 135 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [147.716 168.616 461.376 179.455] /A << /S /GoTo /D (subsection.5.2) >> >> endobj 136 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [147.716 156.661 451.225 167.5] /A << /S /GoTo /D (subsection.5.3) >> >> endobj 137 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.772 136.676 204.443 145.542] /A << /S /GoTo /D (section.6) >> >> endobj 140 0 obj << /D [110 0 R /XYZ 132.768 705.06 null] >> endobj 141 0 obj << /D [110 0 R /XYZ 133.768 667.198 null] >> endobj 145 0 obj << /D [110 0 R /XYZ 133.768 510.385 null] >> endobj 138 0 obj << /Font << /F34 142 0 R /F39 143 0 R /F20 144 0 R /F51 146 0 R /F8 147 0 R /F58 148 0 R >> /ProcSet [ /PDF /Text ] >> endobj 153 0 obj << /Length 3101 /Filter /FlateDecode >> stream xÚZY“Û6~÷¯Ð#UeÑÀ3ûäÌ®½Þ­ÊnMÆ•‡d8¥QYÇ„”<žüúíq?x„£4Ý_t²Ø-’ÅûW‰üþx÷êÍ;W-L»4·‹»íÂ8y¹È³"¶.[Üm¿Ff¹2Æfч¥‰NKg¢ 4Úórå’hs]co¦¹ÿÝýëÍ»rQÅUnsÜ/Y¬¬‰Ë¤äa²Ìt@Teȉ¬ªK[¯—ÎFŸЩñÔgì6íô¬Šmâ?"ýzi‹èÓ2Ë£z×,Wii£=ŒwܬOýÐ )/Ä\jK‹eÅoI–@ÿ,Gfá™Æ¦qQ=”˜|¦-¦üYÛ*WRØÕàþ&º_®àl\tA&ž–¶Œšæ4#ž´Œ³*Ón§G»Ê‹îg¢ _b×`ç|$©ÃkTIlm¹€‰Ëßó{"JåßÅËUž'ч‹È-É¢cÍ£ÊùŠ áytîß÷ô¸”_œºŸQQð€kòBÂ?èqW¬R8p–ÝÏ[üM=û8·æ©úDC¸¢–MßÈ™,EV©\ÚefQ5 hò8}¨ Ê‹ù5KÌ¥ éæ@bOt-¿DUÂ,‰8k6ãEDâHìµeÕÅ … yÜ݃ª0iSØÄ·m€Êgž¼¯;ÙwÍQã²·S èäÑZÔnr•¡š#ùþÄ¿?îYw`#;>Ùu-ëÏí3g3ÛÂãþ{ ¼]fpøi'f5ƒr®ŠMáz”#$ ÿ-1)>G î ê±+«±¿™<#Ûi 13ìÁIUÈA@ qͼگóZØ8·ÅË®¸7úôS ŒÉz/ͲAøH8}ów2Œz)l\93“¼jÏ^MÐE©ÌZl6ô;Õ•¡"¨[66v®z xá¦WLAŒWߪeU¾,VÂépìùÃ;™¼ sÞ@vƒš{3㋲¸2ž’f<ô~…(àj4ô® ž°#'„Œ6ËÂT–Þ¥å¬#5EôŸaº–ÍIK©<:’ä99 ZŠIÍl4qëÁ¼ã™íY:OÞõPÃçÝ+Òp´K¥›ËƦ¹$U4ð‡ñõºS‡s(ÂgC›#úöÊD¿ô¯9ó|iáHþ½: Rÿö`A™©)p¸OŠzdÅõ˜+p†óÁóbwÛèüU‹88üB­ÒÄ6¯¾ÿ«FÖÆÂ}Í?êך ‹•"e—f)qE‚QÙVÑÖƒ¿Kü8:~‡–©÷Äv{dCDKC£åðí»Eb 8AÉÝÀ¿ú¯Ž!<¶Qýxê8˜™³Pòò¶äÒùž«[®™ÄÀûñ¹¸Ä¸Êr3‘)L*Ô#µW›S§¤6\|`ZR5ÛkÉ£„áŽÇfëNŽoèż!Ï–èí¹äiƒ\ÛÛ¾ZO™èÖ/Ë—x' ?ÿ|ÑùGãÜãAœHg™ì-nù¬È~Qa|áÙ÷œ47(‡=+±8Ôc_g_õ¬I5œ´ôÐ|¼ £ø½R¶Ÿ˜¶×/Ú€ßÛ\tÖkƒ"6f=µ,%ñ¢ÂmûÚ_'X†£ƒ`kœ?㺉͑D=jSÁù’ˆÃôêSjÅ]êàEý£VÛ‰[¢ùÞ.Pa«TJæ£íOy)<¡€Þ¸Ÿão׬^JüGd—ˆÆìö^`h}nûO3>I;i€¬²ë•4‘©¯x–C¦$FÍZéôN‰ >#?b"…/„+©'og'¡&ž^ö \f‚¬‹w(R€——‘*R ¤Necžv‘T?Âp ûÄæ£7I%àœ>Õ^ê#*Õ°êé½0²!µ˜Zû¹sþçPd˜> endobj 150 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [259.115 500.992 281.571 511.831] /A << /S /GoTo /D (subsubsection.2.1.4) >> >> endobj 154 0 obj << /D [152 0 R /XYZ 132.768 705.06 null] >> endobj 2 0 obj << /D [152 0 R /XYZ 133.768 667.198 null] >> endobj 6 0 obj << /D [152 0 R /XYZ 133.768 367.443 null] >> endobj 10 0 obj << /D [152 0 R /XYZ 133.768 242.048 null] >> endobj 14 0 obj << /D [152 0 R /XYZ 133.768 159.931 null] >> endobj 151 0 obj << /Font << /F39 143 0 R /F8 147 0 R /F51 146 0 R /F58 148 0 R /F55 155 0 R >> /ProcSet [ /PDF /Text ] >> endobj 158 0 obj << /Length 1649 /Filter /FlateDecode >> stream xÚ½YÛŽÛ6}ÏW›¤•"’ºm$ͦ-š Ø}è&²-{ݬí…å`³}è·—CJ´.–¼Iú@‹¢†Ã9g†Ã‹ýÑrä^?òñ|1yôì"¥^ñh4YŒ˜^%£(Œ=.ÂÑd>ºrnÆÌÙŽ];³l/ë+zßÈŸbì†~èlúIß®eÉõëšäf;¾|û¼ɨi™ï©%p ’¢æ¼Ð wc9P¾«ôl§ÈV4h>×r ¥y­eÞÀ¬ËY‘˧7vÓÈw&Úœ“ß$\—1/ i¦Íõ0B„ÎT6DN®ÁÊOwÔ,í£‘·;H‚4²P­k›Õ#›*ÕÛOÊlÕ¤˜É«zE¦€Œ¦9}xï3Av¹Wj6fd+•{-ž–õ[ÍœtŽ"bÞ~™oÌh~â¬6ú #¥ü³‹ÐŠ0ð"Á¤Õyží3à“Mã;Ùì>¬¦¡é3+MÍçZ6ö-aKÛb#¬RÊ%G³WÑÖED^pÓñ\â`¹#§¯fcžÈh”ÈRgF7º®,)¶ú>×/Û©2¸—âŒh™å÷º.yãš( JtÙÈeQê1Ò>0ð½úÖk¯aMØ1óX" l…WZ¦Çl^Cé„’Ò¿ße³±`ÎG¸#£—û±à¨1ŽL1 Lÿ•žñB²¹f‰f›¦€P Ã&IÒ‘Ë™'Ò@ëøINW®û“º)`ø÷+gH&4‹Ö!·¼3sí/Q7vf±V{ŒÞá‡E™¾4÷³~Mq¯nð\ Û…e7Ìöz׋†ÑJìYuuuƒ/ƒö¡gÎ Õ?¨òÅŒ±µåÝVôQÃsÆÀˆÝ4¯U g¥ô Ñj =l" Ÿ+»þmñÌE +Odùr ”¯ÕUTðë¶ßÀNã­ý¡‡úl;?ÆÓÉfæÊ‘u©õ¨¼·zÀÌn¬½ã› Ùs—ÞÊ2)¥°¤tC ´Ì EÏAÕô£~ðJ(CäüäS€nA&=_—Qf+:9¿  ÏÍ$´…bù!’Å<Ó¤¡mÔ˜¯WÍUeŠˆ½¹KDÎKÝC0c…zûN?:4Ù)àù'¾ÝÕÃÇW 9å¼'dÖä¢ û“®hàߨb<³üT´óÁû3ÍÀ<¶†Ø ŸÉKYÞÊòü‹V£k˜?°;ø²\| ÍŸà!r‹¨1“€Ã“s¨€Í,z&ãÒû?G½irô-JމÔx¿o&œ¡ö¿‚o&PIïY]aøöÐÓËß×a}kùÔCÂ(PÏ­öØîâîÕÉ^è÷›¦j Ÿš½²,OÛÚáã!lß¾Cý Rñï–¿Ÿ[2ÈDŽdƒ¯°6œfÙùª1ü-ð]Y[žÓCbP¬w]ÞX9mv°.wqeK‚“aä—Kì„ùäÈqë¼Z¯zP?–"uµ8XpÊ•«8šÚ÷OéÝ]ëÄ¡ãêˆ1Ý.ì_¼÷=.0úÌŠÙÜßBCaV¬äi+°vY§[v5AvÛØÍuÃYà¥ApxÀÅ“:%Ó²UçR\(1GÝ`-õçú”(wyVÝqëòH×éÏ™IÊAÌM½W—p-÷,¾ôUô{–ÔK¢êˆ:ªÞENïÛŽÿ<Œ¼8¢Ô ý“7W;+9ep]uiQ,÷•“ĬÜ—›ã‡fÕyU_ в²rüª4öàÆ`WN'Õ<µÎšÜþs¡ÙùŸtquIâÅA|8e6šv¨.Ù¬%±´LY=®ˆ¢¸ô«¾ u6LÝ!=CuVq™ÄeÍTbªÂâïf·™â]T Ä^¬'8þÔ‹À†NPš ¹eQ€÷]º1UŽËh”-^ñ1­ÀeaÌS*™“  ØÈ0l ûmì¬:ž5¸‰ÕµGŒ— @+4ÃÑäDôJþpô&^R´ñ~1Í÷ô:]î§a/úp‡#§ùÝ„MA¿X¢F€qô­›)¬˜ŒþgäX…# qj%¡ŸÂ†éi~çV÷°"ï|•ÆK4²8G–<*£-$èê"qèù¢¶·°V‡6ñ–ÕA-,î ¹T°@ ë€ôÓÒ!::c«å¿»µÝj”z‚6d\næ’Ø`³;¼š<ú³TŠ endstream endobj 157 0 obj << /Type /Page /Contents 158 0 R /Resources 156 0 R /MediaBox [0 0 612 792] /Parent 149 0 R >> endobj 159 0 obj << /D [157 0 R /XYZ 132.768 705.06 null] >> endobj 156 0 obj << /Font << /F8 147 0 R /F58 148 0 R /F70 160 0 R /F51 146 0 R /F71 161 0 R >> /ProcSet [ /PDF /Text ] >> endobj 164 0 obj << /Length 1502 /Filter /FlateDecode >> stream xÚÕY[oÛ6~ï¯0†=ÈhÄò.ilY´Àöйh‡m[q¼ÆÖf9m÷ïwHJ”E[u:Ém^Î9<çãÇ«èd9¡“Ë'ÿ˜=yv‘ÑIA Íõdv=aBLç­2Â…šÌ“ß5e‰€$!˜Ø4LŠ$þ1{ ÆRÆH¡PA‚N¸Sxj Wô êÔYîÔ¿›¦Š‹dZ%¤-¤%¤ ’©{…õ› ¾q*ßB6uÙ%Yò;UÅ:0"_ã(cògÇ}óªöºp½±J#aΰδÍ!½„ø²+”¾ù´°ÎbŽhÕüÀm±Å‘è9§4³ReàýˆvX»Ñ}v‘fôìÆ*:æ÷æ[A„ÊAÜŠý¿øœbTÍ}g× tg4æ;äQ½1P@Emªàݼ%4sðÎZV¡é‚-d?lºîHFD®¼N}pËä¯Êyd1.Ö[׫'yåŠv°ÖÕÂŽhÊUNŠ"ëì²²x¬E2M¥Ô~R!dG’ÒÑ*E²2y×­±´ÐX8Μ€u£rùM¹îÌÕ×@W½^áôÝÖ¯~þÞ‰”›ÅÐØs3~Ƨj=åYr¹Û]_üòZ¹þ´îõ‡År»ô$­Nzg§‚VëŒñêo+cµÊmgÁãRo+Ä*W–]{iÀaJ¨Óx ²––ÄÐ@t#=Î í ±®›zÝ5^A¤"Ýã@U‚rÊ)/ò¤ñ«eåÊ+$5d eÓ`Ȧ¦Ä–½xûÓ—D³Âû>\ÉÁò‚ЬÈâ¾¼³álŒ£;äªà-Ƈz‡€iV] žÍ&ëìB6ˆÆÅDNt!(Ý­fª Å:Z*L"ÛÔÅÊwƳ Ù¡ÜÜ1Nv†:…×çnÁ²……[å•ÅÝ[÷3QáòSo‘6X¹ê:B'‡TÁšz"S¯ÕcOykWÅ¥›¡v»u!A™³—÷`‚âjÑÑ•Ý'˜4oíR$’7Ó\&8÷çnrÚ¼ØÎX£X½7fª^Ÿ†Zn)iÜ¿>ãímmĸÚ|?iÁ–Sðþdy|ÿþôJ¸ö&ŠÔ¤ÈeS g œ™ÊØ^KþŒìâÎÃTfL ä)Ø¡2‹ÔŸn‹át¡DJÖ'FüD“JV°/Øfݰ‹rÞwoÉéÑóõâÂâ}HB,‚‡°"p鯕ûa¨¨{@¢ØÒ÷°•9†„?d~[Å[ÅQ[ŸÛ±¥-Œ‘GVe~"~Ü­ÊÑzÁ•®W`UY48b‹}ßý s¨r³—/ñϬZÑÓ‘¡ã°?èµdŒÎ2³…»›ŠØYçìFÇëP| lJŸÆm/>G‘¹Uû’»FÕxdh³ìúÁí—\Fì—Ù‰„Î#㔟h£ˆØßc‘<~ÿÁám‡·'bùëC˜üËc*4QRDêoðNXvÞ_-+œ‡·Á s]Ý¢³›ed–| ø_2Ú¾ÉùwWAí³—ù¯ÊÆd ÌVi~°£6Y?>>”°ê‘y½ò U®Ñ "´ìÐÝíû©ÒæyÏ6ƒçí×щà„Â2"É3á<—=‰ç³'ÿ)èd× endstream endobj 163 0 obj << /Type /Page /Contents 164 0 R /Resources 162 0 R /MediaBox [0 0 612 792] /Parent 149 0 R >> endobj 165 0 obj << /D [163 0 R /XYZ 132.768 705.06 null] >> endobj 162 0 obj << /Font << /F70 160 0 R /F71 161 0 R /F8 147 0 R /F58 148 0 R >> /ProcSet [ /PDF /Text ] >> endobj 168 0 obj << /Length 2386 /Filter /FlateDecode >> stream xÚµYÛÆùÝ¿B@^(`5Ἄ"@mÄF‹>9Û¢\Š+)‘D•Ôz½ÿ¾ß5áDmœ‡>Hä\ß|÷Åt±Y¤‹oRy¾»óý‡rQ©*7ùâþq¡­UE^.ò¬PÆf‹ûõâsr^ê¤[®Œ-’šÿ|ÿ̽çÁ¦…÷cwhq˜'0zÚÁß~kµ\9­“û- prà3tdÀ=üµøv+Y–{4ö¼½Þ?/M «¦H^îÊÀeË_ïÿ,Yi­ªLè~‚“'<ÞÕ¹]ãÖ<°C^·-¿78ÔôH\ƒæ0çˆóB¿¨"~›º_{Êá éùùÐÓ%€ç3®¶=CΞÂktò7¹§FHƒ …dxÍzà†—92¿,³œÏï§•µ&y&î ™@Ïž…çÖZºëˆ\=3ž:‚7ð–G„ºß D<àå¶; ÀQŽx€eÒ=!ëÖ‚ r×.¶zåc– uکʹ)‰–¥Cᬬq$¨z  ™0†Ëݱå•ì8vg™`R &OÕ³CT7 ¢Æ1Æ0 ¶ƒƒ bç.€‰DájŽDFTºJNuïÑBMD5Þ×=¯±@eã‘… Â{Æ;I{祺ibÕti°^x}¢»4ˆ°ó–V# ûÖÛsQ¨ÿ¡H#ocL¦2]€B aÛ'Ëà7ÂfDâÙ êü‡eý(k‡ñšØ§U¹²Y¸•‘«Y13­Ñª,<7óÑå!Ir*7ÞKlG¢iíÀ‹±‚áP¼¿*rB=YÓžH(°…AŸy÷/©vBÃZàÕÇq9ɳ“»f³˜F*Q–žFbPàNwƒ/™V¹ g;Pg íw²ßMÁ+é]|áÀŒOÒ+¯Õð<uÇVJ.ÇýN°ú‚7µ‘õË;a°%3@´»mVˆÞÉêQDJ¢#âÀÇr™c´ lTÿàg–€²+“¿6(xdÀ%àÓ3/,YÎÐê£WA¹»#±]±½k©l©ùæ{oú{‚>â3Lz¯¢)ðMé×> AǤ]ô‚&ÅàÑÀXxÿ4a¢ã;j¹ žS­¬TÚMm4Ž£y^ñÀUVÁä:°žÌ%¿I\D!¬2S»ØS­R[L ÙÖí×L¼›ºQG^Ü+ 9ÐnðFç\.qÒ{A™lE“ñt½{ ëãIQ4zoƒÈ¶8­õq’Ó¹€b^'ŠäÀg£ßI$Às5Ei‡C!ôé€ëâkú8î™dí´'Ê5ð¶§^7ÜŽ|£ú•É©Õ:k^x)m™N^h–&¼¾â™‡'™ À‰;ú²(Úµ‡×…S¦2^‚3ÀçkÕ1¹Òi8p73W¹³~ƒ÷ÿëkH:Sy®¿Ò êüßÜ|D™Wq]6˜Eá0e@¥J}I~¹Ä­VnøCJŒÄ¥ U3']„Ëm ½7vÈØÉI <TÞ§ª³ºáB°¶Á+x•1[˜ãVN:Êc½Ûì_0Õ/AM!í²r•ñù¼Ï©¦ó¹äL^JxRÔcŸ¥aÀ›¬‘àR’¸XgÛ¦q9v 0œ4¸"dʱà<V9Ç~†&Nœ¹»(ëŽI?Cj‹2()a”|9²ÈË\{. ¾Œ,:‘ X\EÐG›Y¾õpÃà•¶¢ä5Ñ©!#ÉR‰Š·í!l‹ÍÙGœ»ô¼¡¼’Žhÿ¸6 ÙZ0þ ~øe+É9" :ŠÎôºrÂ͘‡ãRÎç¥Ï¿ÂŠåG/?z‹_èT9§§²úÇì Ì“·”¸U‰–§ ã—ÿ/!p/×2c “·ühtOI‹NRH\RWLæõõVM?®^!à‹<÷Sb6ZÂz;öÊÿ\y6Ÿ–ÏnOyZIR¦®wý{nêOÝóó¼ÄjöÇF0 XÿÅÿ, úU¤íDú9üJY+‚˜ {#r‹—üÖêö6#Û*™3óÛ¬üJAÂ}ó6ÂßßÉ|FÂç3î•Ô]ÔõG, ¨Ún(nÉ4C ë"æ¥Ëlêæ´šX|†¸Sqñx¾.@†àJëiÖ†@‰£™´Éš[ K÷<Á‡½rn+)UfÑ}OÉ%×ò¡I…¹ÏÕ=h¤o@À† ·¢Lû*Rv©Om#ñMòš'é|ámb&§!©µ^¼9Ä ¥™ôÉZ¥«P¤Þ²¹a¦n±yåþ dϵ’®_fãûŒêAå–)9áíâÑJñø“0îtò|¾¨!}%•ÅÄ@£³PIAUqv±igÌ•lŸT“Øî³EŽ)xvgéçàhëÝù‰º{žõux©C3â5¯`!%?÷Ĥ–ÒÂ#—W3üÕeN,ú³…!¼ú3ÓDZ‰ZÁ¶2 ƒ3ª¶¹ÐBîyLǸ#a*Uè|f/º¸AHvä ö»ø÷ãl9iÃú6¡ât6Vp*î;㸩r^šË4;DêÂËÞKtO›-Ïîø4ö+¦<õé^Bâ3“E/q/¶þ ˆ)ÜH5'½_;-œ%O‡/Mçs*+1‹Ï  ´õËœ“êpÏŽ*^Í\¯PcçíóLkNU:hÃÁ«ÞVÒz¾Uú®`¥:œBEðBˆ¬GÒ$¹ÆÞ¿‚á‚;1ûÇìœÔΕ£>‘;wnt­ðŽºžAcvlÜë ½ï»9CÉ UV£Î_×{*uÕX§ô‚Q£¯_}Í}ÏeB¶ 0gpÐèÏ‚;üí‰BUFO s¼]Ü˦Ý\`tåT NÍÖ€Ÿ` dŒUjë±:y×1¤kLË "xþ · •¦z®î¾ðNª*_§w,ýµØaÌMió×¾¯Nå/L)ÞìñV)W݆:îõž„Þ)•r³æDàì?ëÀš×CúZÓ»ï$7Få©2øÙL‹ó‘²™–¾Žjõµ|C!iz‡ê?b¬¿½Rü¶ǯcô¥a”ïàðQìC MÓQÚÿj$¿tl?Ü‚:©$þBÅá«ÐçrsŸn¿ Ð0õ¾Åm&œ¤‘"n¾ÛóÇÔßJmsHž¡Ñ©²,§lràÇû7ÿ¡–öu endstream endobj 167 0 obj << /Type /Page /Contents 168 0 R /Resources 166 0 R /MediaBox [0 0 612 792] /Parent 149 0 R >> endobj 169 0 obj << /D [167 0 R /XYZ 132.768 705.06 null] >> endobj 18 0 obj << /D [167 0 R /XYZ 133.768 571.705 null] >> endobj 170 0 obj << /D [167 0 R /XYZ 133.768 336.187 null] >> endobj 171 0 obj << /D [167 0 R /XYZ 133.768 321.503 null] >> endobj 172 0 obj << /D [167 0 R /XYZ 133.768 301.864 null] >> endobj 173 0 obj << /D [167 0 R /XYZ 133.768 280.292 null] >> endobj 22 0 obj << /D [167 0 R /XYZ 133.768 250.137 null] >> endobj 166 0 obj << /Font << /F8 147 0 R /F70 160 0 R /F58 148 0 R /F51 146 0 R /F71 161 0 R /F55 155 0 R >> /ProcSet [ /PDF /Text ] >> endobj 176 0 obj << /Length 2460 /Filter /FlateDecode >> stream xÚåYK“Û6¾ûW¨6©vÁG*IU{\ÞJmª&Jrpr ž£µDΊRƳ¿~û”8cksÚEh~|Ýh%£Í(½}‘ÈûÕìÅËë\JUf&ÍÖ#m­Ê³b”¹\ëF³åèýø»ÉÔ;¾›èqO Ï ž ž<xVðiŒH¿æ”›ÇG(gÒ‡c x>Àó^V?Fc5ÂÇ,•¡âÇmMjžÚÂ'ä~ÔFñï#Zâ?¢=Џ,BËŒ}Õ‚fl!šy‡«™ %JÎeó¬ÛÚ(&áTÐQ9” Ÿ:^½ÌUžhØ„ Ô7‡ÂÜ‹¾à(5ª4aŽl~¹´.U^žL– ÎàÌxùÏ~¬.wp™ÊÂLaí®ªÑ%V-v+6M$8ÝÉÁQFŸ¥ÞëIaéì³q{?äA]Â<®t-òÅ£Á`¡ý²¿Ùìür©Ÿû<ïÞvWLO twiá0´&˜ÁõQÈË­ØLœd €°2÷t°–bïõ€s2(A8Üø@*þSVöúdÒnZ#E€ Ž»ŠéÃĹqµ‰àÎÛã¡Á£mn™¼’ w›­ bûEüÕž°l¤SU¦iÿ`3R J)%úŠÙ†ŸvÚ slïñ, 2à›~Ï“Èá(~!Þûê¡) ã(ìªXbÍùv₸růXôLs"ËX ¬¸7¬gú]ò¼92ðÀî;tò¾ì »¼¬³é¡)¢§ ƒH…ÐÒœvb›æQ05n¼•wÕ2å+zóZ¬úg·›LSÐ\z[”-qÞvŒl‚<3‰PÑä‰ÊMêq±cNwqèKmª\nü$”8ÉxÑóŒ+–¥Mœ2eÖæý­PRPG> YÐ,ÜIVE½üú=Ñ)Æù•Ï(ð’Hð‘@d ¾1Ba>æçE¹tü/¤i•ì¹í;üìÙ,©ÃÅøÝZ&IÔ‰ A–Âyk°%jl°“Q·ö0œŒ’ý EK·e aÆþ#ˆ†}¦âã kE;‘#…t¨f‡¢ä0:  9­lqˆ¶Xw œ¢ÝÉÊKåÝ–Aégq@\kš&–ýp](gcÑâ±&3:4{&ó0‚íU/Öµ‘Ó$¥Ô,Ìó$–ìeçc :sÙø—¶£:>êN+“¸ØÄ½?ì%Ñò §lœéŽ,¢Ú{PìNÉŠL¹ô,QXy$/&=î$´?ÈzqxýЃø³lB’Ó\_$!=—;Ï0|Ñ äª»s<~7ã4x+¾Px¾o€åˆíʂͶZòGD%wÅ<ÀwIÛ…ûø0M!Y‹ÓO¶,Õ’“´Ê!ÂÈG’Eã­[X9µÝü',.S‰sq†ºÿ,$6eþ $VO ±Ç .JJÂ+ŽdtïwÈäÐó½$qÊ>J0qp.VI«â4šÚr?[ð98LίàËHÌÀÏ¡³·Gáj!7€ÄÌZé‘“;GŒ@ç±òI9½ñ>¥³(ÍüáJR›Ü~ð×FýtœÕÚ&~œMóü“qΟô®ÍÀÌ:ÎÁ6ñ‘æM¢'>%오—É,óùýyc¯~<â#Õâ>¢"È1–‹KÜ9/Å ;R´/A'¶JHn¢ Ù&"}¹ —bè…W—ïáùžŸ1Ë{òΤ2{Ô¾JUä<ž/µ‹!/t€²ày²äSï–sg„ JÜé¾Ù¶7÷ܨ4ÍŸW°¥Ò¹õsÐç@vñ ¤™“lÃ%ur¹5¸žv_V3p*Ëô#B`LÕ™*ÓÏwPÄ[/orV”˻Ʃ«'ÔÜãë9]ÆçsWþ–×vê«Ý•$AD_n‘3™õ YãeäMŒr]:2˜svŒÒÙ³C˜VÖ„ËÄ×КÍUYºÿ#„èë#F‡Ámö—ÖhÂÀs žQ¦•+2UiùÕ]ãˆÀWÐl/7 Ä|mÓ P[¸ªä SêÊj;f+Keu!uÖÁ³Ü¬ªåe$ë× ¨ìÒûÚrzÐçæé½íà޾ȗZû'T’UÛKï£d‡nÍþz$’Þ½¬$ØÚrÄAÝô+Ó9˜O˜ÆŸÖ&ÿŠªY݇<(wÀ¤MAæL5.ÀãPuÄ(ôlV5ºålXd94`Ñ—2?U˜¾ž©äy}1Á'¥-}õÄvÕ+¬ŒR½1¡¥W{±ZQÞ”FÅË•ÿwLÙ5d,&23¤ ã-YRå† +~m(?â Œ%¬ˆŠº\Qz´†s2 ƒí‰*T  *@tD¾î“鳊xF¸ðB] k¢¬º¬²•*¨jÆk\BIµÊ\§G4F˜óËÎc|)Ú·²ÞMY¤ 7t¬dw[öFx'ƒXlû"ZT4s.ˆb²’Sx‹>ŠqHv×Õ"Jì‘&.”áwUËM?¨šZ7{$è™_–â±Ûë‰V¼å+;þK$kb^’ÚGÕ¾¸Ë$2Ì­/MŠìS°©w5‹,’s!´bÎitµ¥„7çRȤ¢Ê õj†¥î9­$,ϧøÃ;.¬Bp‹ Á£×˜àþ0X+ɺÌejà^¶\J2:‰Ÿ{ÎVÜn«}Çã"Ôc—þ_&jÎl¦½¥[.JEŽ Òÿ»Ø”v5E;ì·g0¯3ˆ¢*¤ã…Ä‚¬Góföâ¿7Øw? endstream endobj 175 0 obj << /Type /Page /Contents 176 0 R /Resources 174 0 R /MediaBox [0 0 612 792] /Parent 149 0 R >> endobj 177 0 obj << /D [175 0 R /XYZ 132.768 705.06 null] >> endobj 178 0 obj << /D [175 0 R /XYZ 133.768 617.452 null] >> endobj 179 0 obj << /D [175 0 R /XYZ 133.768 604.634 null] >> endobj 26 0 obj << /D [175 0 R /XYZ 133.768 573.403 null] >> endobj 180 0 obj << /D [175 0 R /XYZ 133.768 280.154 null] >> endobj 181 0 obj << /D [175 0 R /XYZ 133.768 267.337 null] >> endobj 182 0 obj << /D [175 0 R /XYZ 133.768 246.086 null] >> endobj 183 0 obj << /D [175 0 R /XYZ 133.768 228.7 null] >> endobj 30 0 obj << /D [175 0 R /XYZ 133.768 197.469 null] >> endobj 174 0 obj << /Font << /F71 161 0 R /F51 146 0 R /F8 147 0 R /F58 148 0 R /F70 160 0 R /F39 143 0 R >> /ProcSet [ /PDF /Text ] >> endobj 186 0 obj << /Length 2555 /Filter /FlateDecode >> stream xÚ­YK“Û6¾ûW¨²{ ª,† À¶¶¶Êã÷Q)b%'ŽDI³‰.‘šñì¯O¿"gârå ‘@£Ñøúk0[ìÙâ_¯2yÞ¬_}ÿ®P ›Ú2/ëÝBiVe½(‹*Íu±Xo“|©’”þà§–+¥L|€÷¡9ð¸;Áß~¹Òuž4øÐI5mÿwü–¿­ÿûý»:˜)[¬TêZñëö€Î¥I~Í”Ò~ý€U<NÕ~æ2¾w˼Jñ¯AÑmÏMw4Ô’<޳ƒ¿fÃõ¬(Lòx'C¸[ÃÕ·21ÞS·§&a§šaD'·Á¨„Œ@£‰QP“×h2„Jm!Æ>ó*aZ’n¯W³…±Œ•UÒëOð(²¤é¹Ø°­‹ÐضL‹¬†©hŠZT‘'«'Kþ@Êï¹m«ŒT¸‘ºÛåª0Éÿ°çf Y«“73:˜"5ºüóu¸#iZúgËÇÆ½ÝÃï)0Ìb•׬mb«o`Còš7“Lë6>/“n‡OÞ3¹îÇ'™šÓ–_ö-nkwÄ6\õ€zà`=ÚÆ¨ÑÓ¡u×Ý‹Žì-4õžÛ6àdP·uÒ )^Ñ3¸Ùgl[›êü7|%éÈ"_³:K å·Y‡6ÓZNÅÊ…£óT—^·ŸAê-‚ÉÛ™ñ‹4S^’ަz<¸„¿q§*e«Ôf9á‹Õwþ8j.¸®ŒLOG ›ÿ¯+~@ñ|¡ážEx<¾ƒ-MÄßJ4«çÀÐ+û¾d×UîMÙ qYšqÎæ(rUO\ ÁΡA U¾ Ę¢ŸClöÀо`œMwg9Ò Åð¯e©[òZ­=±ØÍó€Ç«Ð’¾´ƒm‚åx¦OóœOóêò¬N~UÚüL†} &Í Dl_/!òt쀤xËõƒ3Ô;sñá… 2õ¸¸ÏÎ"nj™y èÐÿ5·µ9žõH\]•æ„®¸£ŸÄyŽR¾yÁñúÑÁFGª²ç=é#El•üÆsÎ{åôˆÂ(y§tŽäB~l–±U%ad­sÃn ˜ ùé9À .s×â)Ч¹š /Tfɦ9që-í™ôx}ÚÇ¥¸á–ºw“Ã@u{²G–ÇÝÌ™= ,yÄ.Ž„@…sm*ÜwÍÖy#ÖÑjÆÅHø'°8Í…~šË‡€)ŠFmtª*ÞByE'³)¨Ú´Ž0ûrrÑ[TCfBó¥ߢæGjéýLÑùð‡þÞô,4×:Ít-ÇAEçan âëý xûzôìAzŸÉ¹Ë ]<ö^ãüsÖufÝ7XÇ: xQ4V!û:5ÇQ.«!šæNŒÌþrd %„Y]%=ÎÒ]†±Æ»%|Ô 1ô84|h<æ6ÅÔй#ùZ#“àþÝ15¡2­ìž#–ï¶Z¼»§`ë«"K)n>9ͦÐBÇM¦_Ôi­3Ïó.1ux ¿F»Ž+ê¬C¬þ†Ø°,Íþl“嘖mH\ ­ÉTi…§M™o8¦F¥Yi½70Èua´ÅI·?y=+{‚…1««Ê†ŠLßs|k7á¦eù=)Ř‹5 ÇÇFÈ}YX:pþL±“ÌZ)ï"Î0ðAÍmEÁ›*Éù8~ËÂä±ÿÅå>[™ôƒóŒÍ8I4§ñ±öèÓ¼n™Ñ\ˆk`=´¼äSúÏí#™mÃPA-Ë¢H´Ô…©8cfQñ¥Ð3q«Ð>_×ÈÜ‚¦…À.ey+m5Ãß`Ö©Iè4ÙrJ({Qùä.¤mÐ¥ë•ÏPƒëmO_¸gR“;Ï‹ Ûú«ÉÁ·çÉêúÖé/ñ…×ÀÅlÓÙ#°¯nezQ7±JŒëÆÈ¹ÇÌ-h52±™cåAÌêàÞÜA’˜.Z3 ‰˜¢oµ@ÖL>|DþZšÔTcbS­gya®ÓZ½˜QÔ­ÓL¶¦Î3]×ôK ûF]§×Ÿ¼sšäÒ;÷‹nHrc)-üìL‚—mÀœ3ºÑ–XÔM [¯tðY̳õxTW¼fë«¢¬˜í¹€‚g—ƒÓµØ06¸‡`àqï+ÙûJ¿€Æü=Pà§÷oäjtü~ÒòÇFÇÿå#%ÝØøuABÒŽÕÍyߎ‚#Qeé=G ˜éàr•1U¥¥ìd•Û´®kÖµŠd~X¿ú%’ƒ¨ endstream endobj 185 0 obj << /Type /Page /Contents 186 0 R /Resources 184 0 R /MediaBox [0 0 612 792] /Parent 190 0 R >> endobj 187 0 obj << /D [185 0 R /XYZ 132.768 705.06 null] >> endobj 34 0 obj << /D [185 0 R /XYZ 133.768 667.198 null] >> endobj 38 0 obj << /D [185 0 R /XYZ 133.768 502.445 null] >> endobj 188 0 obj << /D [185 0 R /XYZ 133.768 362.736 null] >> endobj 189 0 obj << /D [185 0 R /XYZ 133.768 350.517 null] >> endobj 42 0 obj << /D [185 0 R /XYZ 133.768 302.289 null] >> endobj 184 0 obj << /Font << /F51 146 0 R /F8 147 0 R /F58 148 0 R /F71 161 0 R /F70 160 0 R >> /ProcSet [ /PDF /Text ] >> endobj 193 0 obj << /Length 2117 /Filter /FlateDecode >> stream xÚÅYY¯ÛD~﯈xrq=ã½,]U„Z©¤€ÔVÈ7qšØ!Nz{ùõœmÆ3qn›…Çö,ÇgùÎ6‰FËQ4zr'’ûýé»s5*Ã2ÓÙhº©8ó¬eiê8Mç£WÁwãIªãàÝXk¸j¸®yèxœðã<îájiV¬Ä±Ÿ½*x¥‘³¤“k-Û¸¾bª8|„ ©O᪄âR¶d|/s3¸ÞòÖ/ù6WÔÝ Ë·/„ä¹Ï +_0ójüfúÃÝÇ…«¸$,“d4Q0¤EoOãIë`;Ö9I±9ˆ”ÈÁ†h˜¹o–¬ ©öý,.Þ·HÃX`Ž“s¨ÿÀFµ¨y–v‘êÄu°©Ž¢ñYÊ÷XD“sBþà8\ ¼܃+…ëÍ’ÔÕ`4šè4,ò‚u÷V¾'=ÌP¼®îpuÏ„éP©¯|zF¯&IYȾա‡PÅ7Ô]}-¨p¬…s×kaÅïüh) `ÕÖÁ+n]®Û†©Uà%r8ÖQÆÀrÄÌúxŽÂ¢Pf± »~&À»üI8˜VÛ- •ÆÚ#ñNÏú×L´NBe¾æô%šSš4§x_ó°§-xw´¥Š"x­â„ Bø p02hö`ðI.÷)€OL`¨pæf¬‹€d„/¬ û°?'ê ŒY-t·V5óZ‚ƒÊxc'ìÖ•k(ÿH©0ÉsP Ë4cÕ ùÃ3A¸ÖižõDÇa–iw.†-!ýÀ•‡*)‚ïáë£i%½G¾flÁ(ÀaT RLsJ:–ð¥Ë„„ëø±BMt­¼ð­£ðPaflÓÂÔ5í»‚{H´…Ÿšwt¤<ÔJŽ'I +gQ_†™Åñm‘ï‰Ü™ÛöÔ\ù³4LA¡BŒŒN±ÚÄyô?ä¥Û#=Æ.y#˜#O!fœ˜&ÌWC'Nã`ÑîñAÛU;ÒG=“nTRS¢åW,èéº3–AإᲭæ/lq) ÉŸˆ®ûš_N}‚3!L0îaLŒf¯dcGI‚2„¢jˆCTA$²‹×Ï\ÿæO€ß ¬Eéû8 · gº€`÷Ž\ýFj²EEx%N–ÛÚeÀ’EeðTvXÆáÙ’³ñë ¥šž‰'#C Ò$‚ Ãßçi?R›g–ˆ?tY­B­J¬—°ìÁOø3„`œ†$}Yé«›¬(e¬ œŸªûç=µ @#U#Ë<}ãR“nàq†vC\£žZXX°÷ÉÂKÅa‘–­¾ þÈ+Ò,,²ø•‰¥ç ŸèlÉói®m ›O©Z¤1ÃÝâÖ#ÿn|¾¼5òÌ’ z;¼gôöކ (ønÃq–‹ 'eî78q§­Lƒ\™°U‡ˆVeB¾»Ò@:íC40~Ãl–åÇq¢Áv”Ò«­Q,ˆÆ¡§¾‡*r^ôóÊçÝgÇ×߃å%«—ÕSÉê‰(¾®ñ"䫚{!MÃWQÃ`IXù¶ã±ÅÞJA•Á N¶"ž×ü‚ûê+~¹¿ç/…ì?Z4 XãH›Zw\@Úôweš±HÛ<ÅÁÈÕç7ýœ‰R‘k!Ê€µ°ìi ÕÔo–Š|­a4 _”rpŪçgÓVÒïÙÍÃD WÏdÃI‘™Uk& ÙEâ$¦ä–/‰IÅ…KóEÈv›ŽáGÆ6âÛ¼ ¿•@ú†x!(H,/"¦ýVÏ[¿ýʶÃ~ÍaîØ·èb%ï¢ÝX¬"­µ‰¯—;¨ºiÉåþ›xÙ©‡uƒ¾øÜªgò¾uà zâ‹âös\Œ%mô¥Ç —¹­A‹ ¯g¢ïFôì“,¡sŽÿG]á:j½½*Μ.iiûgleâ|Ø"Ù½Õ_¨0T…çú¶ºogÊcêz©]ì8Ê Øœ¶wÝŸÅPZõÉ,¼ ÿ 3$—’\rZ!K+z1(7×eœÉ¹%Ècù®áœû裀L݆Ž{ʽú Ø}µû¡qø½æÖ‡ÆÜÎOÒ–wZA5-©äø'$VJÇlVgú  U»G¬uË~Ós.øñ¤{œ›šTÚÏ£%µ=l %åD[pÞðôÑૃ(fõ'*ÉÂ4NýþNÄ´¶ƒfnN–;TC‰¡Žb[3Qgtkå2¾¨¯IÀƒmÔWxÌqà‡³æP4Ŷ+fQ¥—òh«µÁq†t¤Pšu½Y½–<ÅjÀ¶0Ÿs®î Ft„äÁþTH½$Ü1¥ÂX[La¶ÔQpÿ†ïNhއQíWZÝë-i?Õ p?Y}怩4!ÞIý¦‘XÈŸ!43ýù¦ä~æ7/˜mst3šˆ°žšÜ.¬Ô1«¨¡ä†—NB¹¯ó¬Öæµ øêt¤tAÐ̃çM¿dÛŸ¨Åù¹*H(Ÿè-õœáÉ™S5ÒF`-Fù¬i·}74 ›:‚^çØŸ¾SÄ©:¿Úl»š'Z) +SÅÊ #Í̉`µçÕö@ŸJÔmÛ1?¤Ÿ8xÖš³ƒÈɬö)vçäœ[KaѪ‹äÄœ—r„iŽ¦È­Ž4´â…¦ÑÂgò`þßQø5F¹œfÍ+Ì¿à{ܾ›` sD.šUö“KÙÊ»øìªíÖÎ#t`V˜»x|µ`ýP’ϼ$? {i¢§·&Ûÿ-±_Îâg®nûk#+!YCƒ|V–%«·ð6<šÞù ëÙ­ endstream endobj 192 0 obj << /Type /Page /Contents 193 0 R /Resources 191 0 R /MediaBox [0 0 612 792] /Parent 190 0 R >> endobj 194 0 obj << /D [192 0 R /XYZ 132.768 705.06 null] >> endobj 195 0 obj << /D [192 0 R /XYZ 133.768 601.251 null] >> endobj 196 0 obj << /D [192 0 R /XYZ 133.768 587.522 null] >> endobj 197 0 obj << /D [192 0 R /XYZ 133.768 565.664 null] >> endobj 46 0 obj << /D [192 0 R /XYZ 133.768 523.846 null] >> endobj 50 0 obj << /D [192 0 R /XYZ 133.768 359.757 null] >> endobj 191 0 obj << /Font << /F71 161 0 R /F8 147 0 R /F51 146 0 R /F70 160 0 R /F58 148 0 R >> /ProcSet [ /PDF /Text ] >> endobj 200 0 obj << /Length 1709 /Filter /FlateDecode >> stream xÚµXYÛF ~ϯ0ú$ñDsh$E€f‘E»ºN_6A!ÛòøØXvÜý÷%‡œÑaywsôÁÖh4âÉŃŠ¼}óõÕøÙ‹7‰ä"·ÊÆóÔZ¤6Ø$J'ƒñlp½ÊèßþöÓüWe5ü4þ=Hyñ&kJPBfÉ`$aJ±)Z/ nG&Ï£· «< GZ«èãeIã›ë÷48Âäv†«öç«>ÆÒìQø9!Ú=.pnQâð9-DNí;ø[C•F÷C•EhÐŒ^ÄÇ[TñÅ›4nØ¢T"Œ’ ´3ã+KÂ7O´¼i¹ŠE–)¿¸còH+t¬ÛÀ¨oæÃÕ Ü]‘΋rëTq7sî,úp77Wt3 œí9Õeî‘C'.jcÐô¸m³n”Ž¾ÖŽ‚{URÇ©ˆ»;€ÑF.ß*š*è²m¼V‹eŒð»¼ö®X°ì zíȆÚë|çrFêB¾¹km‚±Èg“>KhU>8\ò¤¹1¼Úr*3íLÅ¡‡¼²Ø¸n ïûi±æœºÇ¥&ú‚nvÏÞ«%‰r;/PHÉaêVÍjZFÈkfžÑó ͸qAbFY6G]ûˆDÇJX›ø„Û»Ý|xîif(Fš°q'U6%Çòr‡9KåCqÌ èa‹$©ùydÁ͉[Za¥j×–—ÃQ¢¨”lè†Ç[Š7|ü+ G4<‡EB•Mb¸´É×MË~^o(€Åj…[®Ö¾0SÌd†j3„Z£†mêp`.| ,¶ŒsUúZß®‹[ŸHŠNæ¼±¢ïM¨ðo²öhÝèïsESÄ¡§è‘Ržúá°-„ùZ$ýÓ`ËÂq¿Œ>Ït¼Ó·êšï½_«Ç=Ö凗?OzWãï³û±¨ânx/éø”oÖ+'Üyï9VFœ¯Ì—lÅ2ÔSGÙ)·Ä(®¨àäÇF=S}á²¶BÓ–Ì÷ó#Û·&4¤1QÑFáþgv9§¤ý³"°/¤ªØÞâ×ÀœÀ§•'ªnŸ“cªDžn<²3*¾Ž{œô§”¡ëwZj¡E2^è9oÊ Dfr¡ó¼76g»vîûtÿ1’óá¨sKžB3{¦QçxBýèÚ—Éç=nÈ% ¦bC¬¬±j4‘F*ßÝ➎á:uì[ÕBÚå úfN8¾ÑBìRK•ªhC—HL£~§g"MM]©FV›@›Úý%kâo|ÜS³ ±ªvÄÓ)½‹)ŠØZCÝS8…Øäri‘ÈÌëw{n@•6`gª#Šú¾ÇU+0+12zçJ7Ó„N5ö`©³Ó&¾[vê…ãÌ7í§ç$¼]¬‚ÑqôQjÓ9ÊV¿Ð£@™®ÓýÌ;ì°\ «L0”å ñ Š3Šõ@Ì+~Ø`Nèû2T e’Þ>cÓ“X·nC>W±ê¾³8ð|þ©Ånö'ÊíRÎΙ½kH.×ÅÿƒRº:=!×C¯ÞÀÝ}•Y…/ u(¥zÚ~˜nèsªhµ®8(è=Wø*»-= Š7¡2áâ½?î½ØP„hmýbU¬×íC&ʸ˜¬*KDœ†ýÄŸFÉV÷ÜA¹êëçãXÄJ>©Ÿßm{«f‹7m*dW»³¶þƇZejIÊD.ëô}‹è/•ÚŠ8Ëì8k@º1÷mp†x®!îÙcÇ}¤Ã\7΋Ð\Ì”ªU€“N—í¾P¥?úuÒ>ôuò¯¾ÈîùÎè"fê‹þ¾qÆvá£ÌYŸº®OO>kÔ ÆOùˆø¾ºYõŸ˜šß<üÎ;Î<¥Ü­;²ÝÖùÏOWxÖ»~Uãùcß*Ãg¥Î'Iži´Æ›­{Í~çzú²÷ãé•?X6´éVTÙýp+ÈtH3«…¶š¶Î[K^ŸýW‚gk endstream endobj 199 0 obj << /Type /Page /Contents 200 0 R /Resources 198 0 R /MediaBox [0 0 612 792] /Parent 190 0 R >> endobj 201 0 obj << /D [199 0 R /XYZ 132.768 705.06 null] >> endobj 202 0 obj << /D [199 0 R /XYZ 133.768 667.198 null] >> endobj 203 0 obj << /D [199 0 R /XYZ 133.768 653.25 null] >> endobj 204 0 obj << /D [199 0 R /XYZ 133.768 631.392 null] >> endobj 54 0 obj << /D [199 0 R /XYZ 133.768 601.53 null] >> endobj 205 0 obj << /D [199 0 R /XYZ 133.768 222.247 null] >> endobj 206 0 obj << /D [199 0 R /XYZ 133.768 208.519 null] >> endobj 207 0 obj << /D [199 0 R /XYZ 133.768 186.661 null] >> endobj 208 0 obj << /D [199 0 R /XYZ 133.768 166.735 null] >> endobj 198 0 obj << /Font << /F51 146 0 R /F8 147 0 R /F70 160 0 R /F58 148 0 R /F71 161 0 R >> /ProcSet [ /PDF /Text ] >> endobj 212 0 obj << /Length 1556 /Filter /FlateDecode >> stream xÚ­ÉŽÛ6ôž¯ð‘b…¤(’ºhÓIÒ"=4=hlÍŒ5ì$ó÷}ei¬´Iу%.oße½¸^èÅóGZÞ?­=yVT ãòÂy»X]-LQäÁÇ…/Cn‹r±Ú,þPE¶4Æ–êifÔÛ×𸀟ɖE(UóÖw<šýížïjXï7¼~kÜß½¢'¾CboûìÏÕ¯OžÅE•WÞzC/–ÖäQGà—=À­wð8nд֨ÏÈì¿ÞÓ²aj¥‘ !7ˆ1”õÐÕ묰êãŽÄ*ŒºÇmÓ‹RúÜëï~Ù >f¥Wõuƒ¬­BIz^ÖüBaº4IØ^fËÒ©¿ÔçÀgt©qK6D„>EÅKD¾ÿõL@[¹$ãóçÙ‚‰5<ÚÍîʼ,Ì<›Weù5í@8tt¥'ÆÆýŠ[ãÁ5mØEeè•ioy_ó Ããx‰` Q"*í¿E7Z¿{ý6ÓK€ REuÃdÛž^nõˆ-óÔÊkÔãh¬ß‹5|Ucø¹Š0Ú#ÆÖEêz>FE‘k)b‘_h‹ pñž×kD¾i;±Jž-]åÔEÍ‚2Ì;¸eˆêM-äk¡]S¾€›ÀÜHlKÆß#À†‚!cÂþù„² ™ÓnËéfh±&LVŨk àƒJ.DI<äg?fŸ¸mÉäp=ñ¸÷cÀ%ýr'¾~üpMž*ƒgaýûúÂ0Ä5RØËU½^“-IþAdfÚÎi‹F)¹$)”¯«ù#’»M:P¦E¡ÌæŠÉÚ}rŸ+Õ*é'÷í¯K­5óëÉïÝØ°pÊŽîø3 Ò$Ã.ÑuÍZÂ"†Ð„݉åÍÔ·žµ}XMPbƒÒ]97µÌïYtI dÙÖÄÊž\ëD-bmBГ+É/ÈÂ=RÌ¹Š„qåYüáÌ ÿ ÆYffºL¢Ëû>j^Jžt¶ù(UÙë©FìÄ8D«!Þ­ã-‚v©RóÍØhPMØÂG3H‚5Úp/àüœI í}‹š|ƨ¨ Åp·0 £DOòW ”àÙœ;Æ4‚‘½Ž)P¹^è1t•ÇÂO©RºFœ"T~˜¾Ðqԯש¹QÀ>]“JÉV ø)Uáž5w/ØN]„$È¢·T–a×v3Æ1!æÎøo·Î²°æh;õ 5:ð¯on!0œ®TËŠÖnh"¼3šdk|K÷65.!3Òá?hãĨ½ MÆÉl\~=_¡þDm§ùJáþ ù I†PA1‘㮕ö‰â¦CnÖòçì¶AçUðSJ"¥î°]§&^¨7ƒ1ð†¦jig²20Ý—IFüy¿—ô;F—›ª éø¼Ã(ÌS ÐùŽiJÖçZæMúAHšØyž|·¹‰ [CŸ[•‰§/$ä‰!©ëñÚË¿µ ž£0AÖ¥ìý œ!|£ªŽ{—øág…f|ä.¼ºÕWøY§=#,ÅãèÒM' ;ÂòÂŰϨ0#iȲÁÆ nR 6å³j ú”r•¬Q ÕxN5F8í™ÓYܧ!o#oÒì³ä±?MÍ4öã§ô—ñl7ÔkšÒ¤{šL3°8ÍvœnéóV†ÖVÆa¾#ú½£ëôÕVtåáa4ÉþS>fÿoRÿé<𜇙) ë ‡B|gôåbõèo\B%’ endstream endobj 211 0 obj << /Type /Page /Contents 212 0 R /Resources 210 0 R /MediaBox [0 0 612 792] /Parent 190 0 R >> endobj 213 0 obj << /D [211 0 R /XYZ 132.768 705.06 null] >> endobj 58 0 obj << /D [211 0 R /XYZ 133.768 667.198 null] >> endobj 62 0 obj << /D [211 0 R /XYZ 133.768 515.682 null] >> endobj 210 0 obj << /Font << /F39 143 0 R /F8 147 0 R /F51 146 0 R /F71 161 0 R /F58 148 0 R /F70 160 0 R >> /ProcSet [ /PDF /Text ] >> endobj 216 0 obj << /Length 1459 /Filter /FlateDecode >> stream xÚWYoÛF~÷¯ Š>¬“Þƒ'P¨sÁEà´µ‚<$} ¥µeX$‘rêþúαËC”´0dÍîÎÌÎñÍÌJ÷ ÞI÷­à¿ T Œ‰²4L¡#­’`U}=“QjÒ$&–1M‡±Ñ´ðß°yqU©àusö;üyš׎T_.Ï.Þš"P**’DË»Á€4Žb­‚å:ø,L´PB/B¥t,.÷°hF‰o@´ðy¨ï¡ÉbÑm,‰¸¹†íßèøÏå¯o󠈊T§xƒ[òÈäN÷§E ‹‹XÔ¤Yg ™ÖålTLwtFäÞ KlF´Me™jîø™7nïæš !Q«ç<_ÝÀêóܹwf€ E£EXèT|D ·xýãBçÂN4§ä“«ð¾ìë_ 6¹$î·îm‡Ñ*D‹\¸m™ÃùWYÁÿÝvØ-o!˜@†=ÑíçpP°ämjY]‡Ê˲<²(ž–-Ó_>”5žv.Žd-žœWÈÈ¡Râ®A}Ué¹ÜÔƒb_ÕtB65KÓKcÐ~«ý`Ðzt-·H’üxÿ˜Å q†í¿Zês·.P–ù|«’zúQ§é¶ïõz¸¦vƒt:ä©…JBãÃK;£Ž ¦¥òcÏSö|tƒW‘&ºUô Å3ª ‡ n¹pîãÞ2ç¸dÇ£‚g”2äØ|Ϋ\FyÜ Jv{œÓZ<yÄÃð3«¶†vÒ ¯û)l½#þÙã,-ÎòfˆçŠú;~žñ½ËϧP›"Ò2ŸÉzÛ4|ÓIžóÛgX¤/,ÌcÉÞ iRîú‘i©.tæž›‰šIÿœ´Ãr:•ÁצËöEé‘ «’!õt*µ$Ić¡=OspñYŸª¥]ú´Ôâ‹2±ë³˜Œx·#èg#óãLfY¤ûDNP?”&’ð3HŽîßÓ“Üvü,‚ËÒÓC:)¢T*/ú_†soQ3t>í(yîqÞ',èP@·Ô9}ÝP­æÔ$¾¯œªœÖaQðÃOÿ˃Ma¼CƒC3›dâò l¾v{{ËDå»Eÿ+7)Ò–Åf­Õë]5ÕÎÿ:ò{> ÷‰Ú©Û;v‚8<Í¢Êq®Ž‘uôÃ~5Lš=½ÅЪÑ{›ÞMýo÷@¥i”Ã@5$0ÏY±R¦7˳ N½M endstream endobj 215 0 obj << /Type /Page /Contents 216 0 R /Resources 214 0 R /MediaBox [0 0 612 792] /Parent 190 0 R >> endobj 209 0 obj << /Type /XObject /Subtype /Image /Width 1800 /Height 1800 /BitsPerComponent 8 /ColorSpace [/Indexed /DeviceRGB 255 218 0 R] /Length 135798 /Filter/FlateDecode /DecodeParms<> >> stream xœìÝœU¶€ñ3rR@@‰ * P1cN(*k\Ê*˜#º"æ„Y1¡®®9çœsÎ"93¡Þ½UÝ=Ý3cxïM÷©æ|ÿßÛéê‹2ç!UßT‡j 0L´@!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦B€i„`!˜F¦™ aÕ•‡bãª*Í&˜ ádÄÈdÍ&˜ áÑÚÿÉéŽÖl‚Õ: ƒaî­ü‡¨¡}L&„UÚÇdBP¥}L&„UÚÇdBP¥}L&„UÚÇdBP¥}L&„UÚÇdBP¥}L&„UÚÇdBP¥}L&„UÚÇdBP¥}L&„UÚÇdBP¥}L&„UÚÇdBP¥}L&„UÚÇdBP¥}L&„UÚÇdBP¥}L&„UÚÇdBP¥}L&„UÚÇdBP¥}L&„UÚÇdBP¥}L&„UÚÇdBP¥}L&„UÚÇdBP¥}L&„€-ßÝ|î¸S/{t±ö@Šö1™†,»j€DÊ÷|W{ Aû˜L;ZMjì1S{ ¤}L&„€U§øöÜ}ìÁ[•û­®ïixÚÇdBXq¸k_Ù˜OÂíÅ÷ r÷š}¢<ài“ !`Ä®|=>KÝ­¾ P¤û,Å€íc2!lø¶LdÝßÓWî/©5PCû˜LF‰tø9sé‘‚·u¦Òh“ !`Â…"7ÔZ« ²›Ê4@:íc2!L¸\¤GeíŇDÊ—hL¤Ó>&BÀ„á"ÇÕY\ÚLäq…a€ ÚÇdB˜Ð]䱺«Ûˆ\šûY€LÚÇdB˜ÐXäú«ÿ9>÷³™´É„° ªHdjÝ剌Éý0@&íc2!LXY䥺«»‹LÌý,@&íc2!L(rMÝÕ>"Sr? Iû˜LÜßúíê,~-"ß* dÐ>&BÀ„EŠ>«½x„Ha€ ÚÇdB˜PÙÃVg®}Z»'ÚÇdBØp·ˆLÈX™ÝK¤û2¥q€ÚÇdBØP½•Háyi ?¯+RðˆÚ<@Šö1™FÌêéÎ wü2q¯ê¦îîªíc2!¬øÚ—°dûɯ~õñS'÷rÛrtõ_ÿ[@Öi“ !`Ƭ-%]ãkµBÚÇdBroÏT FMÓžˆh“ !`IÅ³Ç îPШ÷WðFzĆö1™Ti“ !@•ö1™Ti“ !@•ö1™Ti“ !@•ö1™Ti“ !@•ö1™Ti“ !@•ö1™Ti“ !@•ö1™Ti“ !@•ö1™Ti“ !@•ö1™Ti“ !@•ö1™Ti“ !@•ö1™Ti“ !@•ö1™Ti“ !@•ö1™Ti“ !@•ö1™Ti“ !@•ö1™Ti“ !@•ö1™Ti“ !@•ö1™Ti“ !@•ö1™Ti“ !@•ö1™Ti“ !@•ö1™Ti“ !`Ê/ï?öÜ'sµ§Òi“ !`Ç·§ô¯hØå ´gR´É„°â·Ñ¥’Òî’ íy€íc2!Œx»sXÀæ}{”…›ÏÔžˆh“ !`ã\üºmÒ¬ÐG° ÀßùU{& ¤}L&„€ 7)i/Ö[¬=ài“ !`ÁòÞ®ƒRÛhí±Oû˜L ®)HÔ¯ ¸8µù¡ö\@ L&„€Ë;$O}çïÝ=º·r•ò`@ L&„€Ï$2XüdråðE32Vs* ¢}L&„€G%:ø~ÍÒ7EáÒ;zC ÚÇdB°qÂûÒמ —6Ñ HÑ>&BÀ€naô¶Î\\'\üXg" †ö1™4›÷ZæâŒpñl‰€ÚÇdB¾…°Mí—ˆ†—ÝHe ö1™ûäíT{µ¥_í 1Nû˜LÂWˆ^kqq˜Çâj•‰€ÚÇdB>4zD­Å)ÑgòžzhÓ>&BÀ€ðAÐ]2×–®&<4ŠXÐ>&BÀ€>y-ªƒê·'±ëˆ1çù÷L½·p°öl€ö1™œ6ïüó:'/9ºÊå'$¶ÆkÏh“ !`À¼:ŸÀ”òžöl€ö1™tÿ£®«= ~L&„€ßÔ¤¯  =„ojO¨“ !`ÂFµÎ5¬ýÞB@ö1™Ìm[ï£Mhè“ !`Áñiç‚%¥5Žž¬= L&„€‹›þÁkešü¤= ~L&„€Gç‚ÍÒ~ö„§= ~L&„€G†Ñ;=øeFáâÍGÿ6½£ßê©= ~L&„€Ûùæõ­õ9¯†MüJg" †ö1™ ðÉ{¤öêÀzW\Ó>&BÀ€µ|òê¼U"¼Üèuóé´É„0`+ÿ¼`eíÕS}/јH§}L&„€úäý\{u[¿z§Æ<@:íc2! ¸É'ï©Z‹ ùÕWTÒh“ !`Ào>ycj-žëK© ¤Ñ>&BÀ‚Æ®y­gg,ý܇pm¥€ÚÇdBX°ŽÞ‘é+‹7ßd?^i  †ö1™œVïúš…_ÖW ëÍ$h“ !`Á'ÑÅFG'..Sqe»è‚£›ëŽxÚÇdB˜°eâºõån9x¥äG2ñšQÄ€ö1™&|PXß§0í®=è“ !`Ãé®{ŵ:ØaºöT@ L&„€ Õ»»ò5n”ÞÁF¯kxÚÇdB±,¼ÎZI§ò䃤¥§VhÏxÚÇdB˜qE«Zö¼G{$ Ð?&BÀŽYcËS‹–…7ÇÔùH ç´É„0ä_>~6;é¶ß‚Šg÷/rwv¥„P§}L&„€“\ùº×¼uð#áµãçBÚÇdB˜ñF±Èº3ÓnçJø Ú<@Dû˜L36éüKÆÊ¢"½yí(”i“ !`Åsîôïé øvTë‚¢öû‡§†Ÿ¸“Ä[´ƒuÚÇdBXq¸È– Ö(H½y¢`Ȳ 8Pd{íÁ`ö1™V¬"²v­7Ž žiÌG1A—ö1™FÌ©ïªÛÝ—4ùP{4§}L&„€Ÿ¦ÞKaT+î´î)ò¸öh0Nû˜L#^‰ÊWôBâþäèÙÂr‘ÛUç´É„0bdؽf S 3“ŸÊô”âT€þ1™6, O‹ç¥-ý˜xé§jCžö1™6ì6ïéŒµË¢ç —)D´É„°¡qø„U™‹áçô–ë $i“ !`ÂÂèQÐÛ2WÃÏê-¨Ö HÐ>&BÀ„×¢¶ü"cõ£pñ{¥™€ˆö1™&\|ýWi‹¿ ×R› ð´É„0áðð=„"­§¤ž'|¨KÇ«4ÔÉ„0áÚðÙÀK Ýד¾©ª~¼~“ä¥fx!ti“ !`‡aò~»·<úà‰VEÑef¯3´‡ƒqÚÇdB˜P&ï¸àû½j>‡I†¯ÖP{6X§}L&„€ -“o|ÿØîa;~¹*<# =¬Ó>&BÀ†3ÃúnÏþüOs·»ñ¢QÄö1™F”D×]üàA¯ÞyÀðs> WÚió´É„0âÆÄ§¦ž!ìݼ¦=ÌÓ>&BÀŠ¥>ãµÇ´É„0£G=ÜF{(@ý˜L3F×í`ËÙÚCêÇdBXql}ŒnÃGO@ö1™Fí¹íc2!lø¹‰«Þí~kù}ûoqÐc•‹v C¸z¥öd0Oû˜LrÑÛ:ceñ °„O+ $i“ !`ÂWþjj¯g®}]êC8Fg Eû˜L&ºäu¨ªµ8Ƈ°¯Ê<@ íc2!Lì’·UíÅ÷}›iŒ¤Ñ>&BÀÿR™ý­©/L¹â¡·ûÍ꾄 4çôÉ„°`Ž/Þ^AðÛɽ¢wM4Ùõq·¼‘Û*Xª=¬Ó>&BÀ‚¯}ü†.=§yÚ;·ü(¼üh[íÙ`žö1™„g„å†\uð°5›úFwø3 ´gƒyÚÇdB˜Ð$qØö¼ïüÝ%líõ'ˆÿVž Ð>&BÀ„ÁQšK¿šîßGñh»héCíÑ`žö1™&L £·ãü›Gvt·%«y¢ê›®~i3íÉíc2!L¯,#E-j^+3ðùüÍ{Ú“ÚÇdBØÐ»îG0ù+¬ý¦= }L&„€ •mõ[eÒôŠÅßNÙ± q²öd€ö1™&¼Zs"ØaÔiZ”8'ÜQ{2@û˜L®«ûÈh¤»öd€ö1™&œ™|R0M'ÿ¥±öd€ö1™&Œõožx+£„çÍŸ7\¢=ÌÓ>&BÀ„Ñ"ÔzT´üb÷¥¹öd€ö1™&lïBXçùÁ‚‘®Ú“ÚÇdB˜°~2~ëùË«½¹fªŠƒ´'´É„0!ñ~ú–ÕÁÌÞ§†ÛkOh“ !`BôA„CƒeµŸ(ÜC{2@û˜L ÷O,ÿ¶¨öó„­µ'´É„°àý¨z'm}Õâi{$šØºZ{8X§}L&„€#ÓO7XîVf-LÜí«=¬Ó>&BÀ‚ƾx›Fá» "˜ýÂÑmjÂx¦öt0Nû˜L ‡DwH„¯¨<ºí•8',¬Ð¶i“ !`ÀÒÚ/‘qš?3¹9J{>ئ}L&„€ Rù+è½^¦ÅΟܜ|’ oC—ö1™Ô½¼š§mÏÒž¦i“ !`AIz˚׎â­ÚóÁ4ícrìC¸ð¾óýçi·ÎlÈßSûȹ k¢WºÖ[õª9C =J{>˜¦}LŽ]«¿xôÆÞI¾ˆmΙ‰×xnó~Ã}í?t 瞬ûÐhQÃ~þËpíù`šö19f!\r^pßì|~¥¿;½OÍ^[pLeC}í?t ç*’Ï®žx…Ì*c¿?=Ü88ü¢=LÓ>&Ç+„wKuo×%AðÝj?Àî²¼¾ö:{×Ô>!ìqgxFØm ÿz­öx0Mû˜«¾Ý2m7Q]=,z§c§Ä³'4Ð÷ÑþCr¯º¬îƒ£^ûð ñGíñ`šö19N!œ›yxÓ-þëæ¹SÃ¥Om.½Ô0ßHûȽªöÉòm{èá;vÍ|;E‰öt°Mû˜§Žó{d«îùòãÉþùû¦mE ¯H^Šù÷æ ó´ÿÐÜ{£&{Å…Éön†iOÛ´É1 ᜦn‡8#Ü®íŸg×üòÕþþ ò´ÿÐÜ»ªÞFWÊ8_{:ئ}LŽQos;déW‰;•ákº{¦½P´z[8·A¾“ö:{ûùçÛ 3*˜zxt„öp0Nû˜£ävÈcS÷žõûçÅé¿~³[تA¾“ö:sÕ­Ýþså—5O <”Øl§=¬Ó>&Ç(„ƒÝùdê^E©»ûaú¯ÿèOÿîoöúµbsBkÞt»O‹ªàîD·ø-ži—x¥Ìbíá`!LéévÉjîöuwç¦ÿzu‰Û“ÿæïõH=—ΰAÄ߉îoýZîö:»FÑíÙ`!LYÅí“iÏÙoâî.ÍøZŠ”þÍßë‚¿è ¬Òpsy`M÷·¾ÑB·ñc³ZûŸEu„0Å¿<æÝš»+¹»?¥ÿz…[èø7¯ynñ'Ü‘ _ÄŸŠPn 7_h’Âÿ(OÂÃS;ª7Óÿú[n¡ƒ|§"ä7òDeøzÑU—$îÞÖ¯¼´¬Íî_úŸ>?S aš nŸì—ü؉àx¿ßîŸþë'¸…Cä;BXSU¾[âÀÌÕ7‹ÜN5Mg" !LyÛ§/ù†‰ÃÏ-þ²æ—öOmÜÕ ß‰œÖ"-Ü4>}í½n¥ ¡®eüŸ”ê ü^yš>¿úÚijkÍNþê‚ÜÝV s Bsú‰ù=lïß’+U7–û}Œ7B!¬ñtؾ’~{ õ?ºÊ¦Ûº/½_~í­ðJ3g4Ì7"„0Çöà5þ²öÍO ßžûûÍëD?lî«=@Ó“þZ¶ÖÓ¿ O ×?íúÉã7 —zÌk˜ïCaÎ{nêöóÐpGj;pãUÃ6+®ýŠ4@!LSyHM?g¾ß©Ñ{ ô}!ìqë弊Imkv¨ÿ^ÝU*þú_²Œ¦«žœúÌ´×ýÝñélûZC}B{^uûPáÓÁŒ´Id°éêþ5£÷hÏÂÚæß¶çÀÎko{í¢èîU5WÁØåÛû&„îKx@[ÉÐc–öX!ü+s&ômä~xí~ô ø›BT9DêÑê1í¹Bø×ª~šÞÀOcBX4¿_}%,ºL{.€* „°hFY=tÿ»^{0˜GBXÔ.#ÍÛf"¥¯hOë¡BƒöO°yyQ”t:ä±KýG´é[©=Œ#„ !ìYè³W^z;¡Ó(ÿµW¡ÈÚÃÁ8B¨€ž’ÁHx-ÃÝDÖÓÆB„ö4vÍóŸ6!]Æ=úáׯß6¢q¢†{»@þô×ÿ>=„P!„9ß&²×xÒò`ùû×^ùÖ¢÷VºwãSꡌ* „0çªDo}¶Qâe£=-õ·%»‹œ«=l#„ !Ì9:ÂäÕ|£ÓÃðëa"ÿÒ¶B„挨ïª2©' ѶB„ææ“W=&Ú{âçŸ_= 0ÂmD.Ö¶B„期:öc´²x¿Äs…íDî×ÖB„漞ìà9þÞ77Ÿqà¿.<+çƒy¡Œ* „0êß"ýªk/ž&2Pc ‰* „0êÓ‘;k­Íh&r¶Ê4@!T@aÕž"+OËX©ÜV¤-劉*B¨€ª©e"ýI[¨-"W¨Íx„P!„Y7¸îuz)u÷—­Üýªþä_²* „0kîæþ݃e«¸s^Pýî)MÝ󵇂u„P!„MÕ÷ (H½•¾¨S›ðvç…ÚcÁ”^ º ß{pËh»×ÚS!TAaÑGM2O xh1ABX41#ƒ…[|x¼»ÙW{*€ª „0èçr‘Í.Ù´$üÂÁº¥£Üiá›Ús„P!„A£E:Ìu·3¿ùqib©b=×FÍ™€!T@aϲ"W×^|Á~§0 * „°çi‘òÅ5w—Ïïôáó„P!„=§‹ìœØüýºámÜ©`ÓÁç~}’Èîªc!TAaÏ"'†sNišzéhÑ‘ ”¡B{¶¹Ôß¾µJ­«Ë¬ª=@Bس§ÈwóßF®}+ùä´Ê_^=­·a{íÉB¨€Âw¨9<^.)ž¼œLխ宄תÎB„ö\#Ò;˜Ù^¤åSi«[º–¼®6"„ !ìù±@äý£DÊÒ?¦~vxùÑÔ†B„P!„Aë‹lY&rQúÚ "þÓ™Òš B„=½FtiÚÒDÎß·B!T@aÑÂÓÒ¾î(ÒyÉ#"Í–þá¿ä!T@aÑÔÖ.„'U§î?æî—<,i"ò–âX!Ô@aÒÝþ”p݇Üé_UeåKÃýgóú·Nô¹_{4ØFB˜ôat)™’¦ ¤Ðo5½Ç/o&röh°* „0é»ZWkz}¸.)úÜ_vmë*íé`!T@aLEK¾–Ëýƒ¡Rú¯ÜÚ­þ½õþ„ðJíé`!T@aÌC®w닌 ‚ªã¢¡ØtÄÖe‰g ÷ÓžæB„ÆlëNþö9Ëoß×=íM廉l¡=Ì#„ !ŒiãN‡‰D—T[6ipêõÛ> ²¦òp!T@aL‰ÈØíE.KÞŸõÔäs¯|x5‘unçíôÐGBزȿ$æ`‘ã2—7é|®È.:C)„P!„-K]/>_dPæò"«n-r‚ÎP@ !T@aL™ÈៈLÍX]Ud2>zú¡Bc:ˆ¬ôÙ+}qI‘Ho‘ö•ZS „P!„1£D çÝì¾<”¶8EÂwÙ_¨6@Bó†kÞ¨*÷¿Ù»©µªöáU׺.Qœ B„ÖtqÑ{õÓæ"MïJ.¾‘°Ñëšc!B¨€š§]óÿðˆ¿¶èæÏ…O Þ~&aá­Ú“„P!„9{ú³¿ži~Óð}÷ï]aí>í¹€€ª „0§jM¾!O O»Ð¨ ýH{,À#„ !ìYº~ؾ–½V*Hd°óýÚ3B¨€¢# ÓÏË&kÏ$B„&ý<4•ÂFG,מH!„ !ŒZ~å°>»öÛé íA€t„P!€ø „ !Ä!T@ >¡BñABˆB¨€®¯/Øn`çÞCö»g¡ö$@!T@aÕk›¥ÞQ_~âlíi€!T@aÓÒÒ¯-#­ÕB„&ý>Äç¯ÏÉ·>ñà5{µp›E—jx„P!„EK»öõ»íÒ‘C×Þhç“__îî^§=B„íë·íz©F;¼ªHéËÚS„P!„AOºøuËxްg[‘>•Ús„P!„=Õëˆ4öùëÜ ß6a‹R·Ù¤@äíÁB¨ž7£³À!¯$îOûg¡ˆ ẪS!T@aÏ)>ƒ§TÕ¬<Ò2\úIo& BBس‘¯Þ…Ko‡•Þ®4BBØÓÙ5odb{Ñ;Þþð› ‚›|ÏQ ¡ Bsª‹Eʦù­Š);‡g‚R¶íu뺛1Ú£„P!„=.„;ùÛ'VO{E{÷¿±Ú“„P!„=E"g¸Ãñ>€û ë[žˆ!!„:B¨€œ%.yGÕ{»›Â}ž_îV*_9¨Ø‡ðXíÑB¨€œoýå¶«Ow_×xñ¡ËŽÃK.†_öt÷7Ò „ !ÌùÁŸüYàj¸nQôhóÝß 6öhÏó¡Bs–ùçËÂÿK)Ü0¼Y“ËB!T@aOçšvßáÀQ[4«¹‡öl°Ž* „°çàDõ VÙýºîþÒW ï—‹ìª=¬#„ !ìy$ý˜ZQýþöÑæV"M—jã¡B{*3?‹0|;¡Âp«R‘Ï´‡ƒq„P!„=·Hmkù׬,ò´öp0Ž* „0çâ¨}ýn“ê`ǒ𜰹ÈÝÚÓÁ8B¨€š'“õëy÷3§2bçVѽ¦W‡’¾ =Œ#„ !Œù=í탭ö8ëš  ¯4ÚæÍʶþvªö|0Ž* „0æ ÿöyŸ¼¢Œ' W‚ÝMûª¿þ€,"„ !lùÉG0|4t­‘M,òkGº¯jÏë¡B[®tµÔ8|:ð®%°÷;ÿkòŒ³ÝâfÁH÷õIíù`!T@aË`ò·šÈÆ"m¾N.þâ²Øhz‘®Š“!T@aKs‘ÂÊ!"'»³Âž_&W»º<®éþw’æh@@UB˜RU(Rœ$2ìwØâ¶êhy‹Ä³…ëNB „¦Ìsµk¼.RôÑùþú2ƒ®ø¶2¨š¶~ÔÁîÚã„P!„)ÕE"M‚ª>"[ÿm]j´Uaò=´Ç¡B[Z¹ò- îwÕ;wɳ;d^ttå…ÚÓ„P!„-[ºàÝÛDé+n¿Raòó'øT^Ä!T@aËÍ.xk,ŸÔºæ<°ßä©c´g¡ B[f»ä­–ñˆ¨ô¿ŽâêjˆB¨€Â˜ã¢ø59pPf /Ô ð¡Bcæ…WÝûç êÎÞi¼_{. DBS>Z|‘Û¬|æˆ>‰' wÓ ˆB„ÆÜ‘8,ßã“ øíÄ•£{­~מ B„¶TöÙ´$óéAi,rœö`@ˆ* „°åE‘’©³·NÏ`×OÎY¥Z{2À#„ !lë/®ßlQU°hG‚`f‘țړ!T@aˆ"WF[s»pâ?DÛCD&éÍÔ „ !lYUäéhëë Ø~è·ßì_&sוALB„¶4ùÐß>00ùañÎ'‹ì¯=àB„¶¬,òrLÛ(ýÕ2…‡.r”öd€GBØâþÆß¼ÕÁ÷¯ÏQ^{Ö+ùÍÖ"çiOx„P!„-£Döÿ¤¹kßÖïG U÷÷ O Ñ ˆÄ?„UŸßwáá»mµáà­v=ì‚{?_.VOaËÝéßj"¥“k––ìŸ)\¤7P#Þ!¬z÷Ì­Zf^Ž¢åVg¾›ïïÂ%„°e^yø¬àƒékmÄ?` Ä@œCøÁa¤^û gf!„1'ûývbÆÒ™~©Û2¥€t± áò»6®¿‚‘MîZžË1!„1sù‹¬¥¯ÜZ âþïn­‰€41 á¯guL&¯t½‡rñ-<:å’SßcýÒäz§ 3r;jÃ!„0¦Ú?Úæ±äÝo§lê/7º»È?4§bÂ…§7Žb×cŸËÞXšùkËÞ¼|TÏèW›œ±0#6‰vÙ-Ÿt»óܯ™|ŽCdeíÉ€ –!¬¾=:ìwÁô?ú·~ºh@øtüO^¾n†˜GE:…/˜)°væÇ1Í× ˆcgìâw.'~òçÿâ§'uñÿÜ®¿ei°l"„0æz‘aožÖ¿¢µvëWà7†ÌÑž ˆaÛ¹cý'þÆÛ«ž\ßý£í²0T¶BsÈæAðìÍ¢ v9vš[üe¢ß^kžöp@üB(Òÿá¿ù€gõÃ.) 8L®Bó¡HÉœð©BY‘Z}PÄ¿,î:ÅÁ/~!¬üßýÿË<!Œ©ZÉ_E¦jm‘õ—Ô¬î/²çö"¹Ð”Å/„Gž?–BaÍA"ý«)ü°fíÛ2‘ÿüÜDär½¹/CXqÑÄ¿þ‡âŒšw D&Q³T½³È*‹ƒcD†ª„bÂïë]ý`œ’•Yr†œ=EJš‰Üã·+_8zý.Mý+Hݹà›"E¼…ºbÂnõ¼£~ñIEB<óSt™ŒÙAPu{ÔÛ ËOœ]í‚øŽöt0.Ö!”^¿Ô^z>¼¼!òÌ[þ¢Åß?¯›qe™6O®!òöp0.Þ!”¾™Ž™}p´óB ß<ï?¢¾p­Ò´ úkËuùöl0.æ!”þ³kîVß³r´ûl?-Ûce!„EÏH]…á×ç´Gƒq±¡ÿyqݹÉ{ÓwŠvöwæå•¶ÓBX´¸0­€›¾ùÞiþrŠEþÎWÚ£Á¸X‡ð&_ „ÛUW'.S¸ÿ¬œ –M„&E϶0tä%ßùû þ–æû¶Èw±apmø££¿îÄçC¢ v{:7se!„Igù]xóô•ëÂByDk" ï—û½d«%ËΊža/<6×cúeÊ©‡ìwÂe4謄&Mö¯Í|ýۅᎽ“Ò@@$æ! .ò»É‰O´îŸƒ·ýzÙˆ“ÛÕOn”|Fcå³ðD !Lò§]ôjÆÒçÅ~÷j²Xi" ÷SÏ®7:wyÖÇù~d‘È~‰;svÌx¿Óƒ ö]!,ú*Ú‘Ò_"ú~×hïzAm( ȃã!65ûÓÜêßó› ᯽j½Ò{BC}B‹¢‡A¥ø”ä+Á_Ð$±oݦ:Ì‹«Oô;J³É9xaÙåÑN¹_xgÉàè^A›ÕZ$öÖÉ ô}!,Ú'|Ôý¯õá÷~<óÓ‡Çú«®oêW/О ¶Å?„Aõ8·£”<–ýY^Ž^ÁÖõÆðÞÙámôמ~mxvXòÉŸÿ!„E›ùè¥U3fi÷Ü%þæ íÙ`[„0¨>Â?Cøl¶G©öOåË€×£SÏÙþ4°ÙÉ_¬8©_ÜFaQ¿}ºàÔ&© –13˜â7îÓž ¶åCƒ*‰ÑòWÿúüyÚï,MÜ»Ñß{2í—Ãç*攢Íý.tM̹cÄ*ÅRÔqÇf‰†¤=l‹_ÔcÞ·¯4-ui=¿ÓÿÛX÷=z¤^ƽ«»·wú/WúŸgÏiïDaÑ?|ò6–Ü1²yøìûºý àŽt›]¸´ TÅ/„ò7dåÓ'6t¿ñ”Ô=ÿ¤àó¿~›[Ö ß‰¢ðÜOš×ìÈÅ£º¹Û£´Gƒq„0ÅZè§©{þgÖe¿þ»[éþw³Oÿ‰„Ý‘¶ —vŠ^šÖå:çíÑ`!Lñ?™Ö\Á­L¤e­ \¤Éßü½^múÿôj°±¼°`ËŒ= ñ?>¿‹DIxŒöl°Ž¦lê~㚟LW)Ë|â¢Úµ±ùßü½Îþ«ÿ:6àà@ü}Ý¡ö>0ºzé¹%~£Ûíá`]üBøËßЀ×ý¬±¿Û%oOÝÛØÝ›žñë?¸•>ó÷úa“nµoÄÞOÑëc2J¸õòÛúÅϵ‡ƒyñ ¡ÿ~¦õR'þ§™W’™äwÝùN¼XÆ,ñ/>K{•LAø½%Ñ‹´§ƒy„0e‘ ý™É{߸;kV¥ýòÂNnå²ùN„ÆøO",Mž¦P½a›…ÚãÁ:BXÿ‘PNN~ÄÅ¡îÎøš_¬ÚÃïÁ¿4È7"„°eVãäâ§­ùDaŸO›s]¨Ëƒþö쥳› ?úÁì}rÙÿ éwExožÿ€˜Ó“ç„¿ïàí †ùF„¶\|~°hæâ³›¥u°ÕÜ`”ÈþÚóÁº¸‡°êAnwù.qï&·]~üìl óVôœÅ*‡Üý]e|ïŸÖè;yzu°üÍçú;Ïýëßãï „°¥ØÁ•D6twfœ34ÜÑÂ7žçß]¸¦ö|°.æ!œ¹A˜¦ïwo ïµ})[Ó¼Ð:ù“jéêm½qb³eb­ýÛ ôm!L™=+¸§È>ÑÂ’¯žaêK~­{ð¦;/Ôˆwgô•zB(%gkœ/ûËêûmC}BS>w žGf^K­2ÌãGߺ/•j£^¼C¸Gâ õ‰û_Ò9\hýC¶æ©º»OýlŲ¿þ·ÿ&BSž w¡ãNÙë¾ý‡ôî¼Îvç}å–ÃÇ_.y»î5œ€‹uÃF*9kZÚRõK½ýâ¾Ù›¨ò¥czÖ®`Ùö76äÅ/!Ly,Ü‹î¸:ñ¼`hè+A;; KbÂÜ~Òñ½Z‹‹GºÕ¢iõþ ¤úǧ.?r—­‡ X£ÿF[îrÌõ/7ð% !Ly?Lß gþx¹oXÅ‘¦ž9´Ä9„óËÜ~rOå¹ÝòõÙ)û!Lù= ß!þ9ÁF{^sëõ“Nì›Êá­Eþ«= ¬‹sý#£ëÕó‰W»õQY›(!léžê^³u—Ȭ¹oòõƒEšÏÓžÖÅ9„7»ÝäÈzÖßôÏ0dižœ „°å´(z+×_òüéuB[~ ¯·Ý¶I˜¾‚Vé=éÄ¥F¡-Î!¼Lê¿Êõ ·>([å!„1ÿ …o‡Ÿª¼~½š—d¿ª=çÞíö’Ñõ¬¿èÖwÌÖ@¹@aÌœèê…­.óoÓm|ôk•ç'?š°ä6íÙ€X‡Ð_¢ýòºë£ÝúجM”„Æü]dmLÅüÃÔ'15yA{4 Þ!¬öol?£Îò'þsÍžÏÚD9@aÌÉó¿Á‡ïÐ$ý Â~Ú“A¼Cœév”¢j-~ë?,iåŠ,Δu„Æ\ €««!bÂá+¬G¥_X´ê†ðºL7fy¬ì"„0æ·Ó®µY­6î+R×?ÒbEë†O%osÕ󫃠úçÇÞ|´qÕŸþkqGản¯½4¸µ,½ƒ]Þ½Â}]¢=÷·¦žT/nÕ"ù:3é7ëÏÿ­¸#„0Æ?4úõ/3χ?ê¾|¬=û­T÷i…m~ËÉhÙCaÌun¿}½‘ß{›öÚxÃw ßNá?‡é íÑ€ø‡0˜uh£Ì vš\ÏåGó !„1Ϻ=×?.Ú<ùìþò×—¹Uu. ûÁìK‡•'+Ø~çûV€'× !Œù4Ú×YZ³ôq‹péa½¡€¤<¡SñáÃS&]qûãßäýÉ`ˆ˜9Q3Ö¦†Oú×þ¼Q@A~„pCaM½çÒW–ná— ¹â6b€* „°f[_½&w¦îWÞ¿Jx’Xð«âP@B>†páСCiðIrˆšu ]~^ÓäÓþ…»~¥<—!œçvŸg|’"„°¦ÛiÃ׉ö8ø´³÷L½úÍ+9~xò[>†ð&·ó\Þà“ä!„5á5eZfôo•ÔæÖsµÇƒqqáò''yh†CvðW›9/'Óe !„5Ñe¡:öM^*ªñ¨þ¾H{ý¡õ|Ú;1á]ê^X&twnÆËBkŠDÖ÷¯Ùñ¤ƒŠEÊu÷EÜb=‘^KFJýÀ äL¼Cxát°c^¿èššr‘ÃÏ Ÿ$LÛ§;´Ù$¨åùºö€0-Ö!ü­ùt°Ç›¹š/+!¬YMdõà¹uêîˇÁ·Cl¨= L‹u÷;JùVc[ÝÝ®{Œs@·Õî<•!„5GºSÁyAõ}‰öØûèÍKýÖÁ•Að‚»}_{BXçVwõ'ß¹­%¥~d¼¿©Èñ9,›!¬ùÞíË»Á¡5§‚]®ø¡‰¿=ÂýªÛ¿Oמ–Å9„_ûÝäÝpó·5=Z}§LäÞì–M„æô)¸µ8ãQÑ’èæº ¸Pd°ö€°,Î!¼ßí$ëE› DH,_)Òyq¶çÊ*Bs¾(z´$Òl†l´“ö€°,Î!¼Âí(ãÛ½E&&6+zˆœ“å±²‹ž#Sõë4|Ë䇌¶~±È˜à+‘¢JíaXœCx®ÛQ.Llï,2*¹>Ñ¿-ŸBØsu²ƒ»»;Ë.(‹ît½@¤l!„®8‡p‚ÛO&'¶˜\Ë­‘ݱ²‹œ©ÂFýû´«yœt;wJx×ó<4 UqáUn79;±}­Û’—aúͭߑ干Šœ®užlÕp¸Èçˆl¤= ,‹sïŒÞnz6õÒ Xì¶/Éò\YEaÍ÷‰GBSŸ;±Ò„àõèC‘¡ë‹ü[{BXç~ìö’ÕïŸæ¶¯H¬é¶ÏÌö`ÙDaÍ^QþÎ Öi²öv'Íð‹í“¯žqÿû@{BXçVµuûÇí‰íÆîçÆÄú}nyR–çÊ*Bkï ÜmÝp£¨Û óƒèŠ2^©È0íaZœCìëŸYO”p¸Û~>ܪÞÐm>”íÁ²‰š:ϰ$ùáLNA~_=ù.Ö!ü0ÜGzùk0—»­.þz„'øýfVN¦ËBc× ¡HË©AQr;߯šˆ<ë£Â¤ÈoþÔØm5Þá”CÖðK;äd¸l!„0fZ²xÍwûÏ•Éü?ß$±µ-o"„ªx‡pÑÀTƒÓÒ~–,z+³e !„1ó“»îI?NÞ¯CêÑÄC£[ÍמÆÅ;„ÁÜQÉ.\Âós0YBXºöÕóiŸ*íé`]ÌCSoº÷ÐÔ[ 布DvÑÖÅ9„·ûýäÓœ’;„Ƅ׃j,õèþ„Hù2íù`\œCø•×Ñý9%w!Œæ›wr}!”ŠDx'!tÅ9„Áþn7Ù)W“ä!„1GúäÝ Ò(ý-õÃWñ_ïí(ò¢ö|0.Ö!üµ§ÛOîÎÕ(¹CaÌ«>ywŠôüdBÍí‚ÖÏÿzzXÅË{‰<ª=Œ‹uƒé=DJV¼Bó¹OÞ+á›%"«œ³0nÓLä]íù`\¼CÌÚÃí)[=¶07Ãä !„1³}òúe<7¸ò Ñ­—Ô¯ÚóÁ¸X‡ðá‡~h¤ßWŠ×¶Ëžéòûµ¤„Ö¤NŒ>ãßc†¤]qmŒHwíé`]¬CXï‹ÌBÏçh¼ì „°¦cbÏ]=úÈ¥_-N,õ9Vy8˜GBXspr×½Èß[ra»äýÕE ÞמÖB„Ö|•Úw›téÞ2íMe"£´‡ƒy±á1èë\Í—„Ö\^ç‡ÙVgú‹´œ¦=Ì‹uWT„Öt ãWœºÊZÓã¾H\o´è íÙB¨€˜D 2OË‹¢ÛÒ›µg¡Bc.Yd}Ïö7~^{4€ª „0f´È>­ë áfÚ“ACèß/ÿ»Â$9DaÌÎ"ÍE šgV°­ÈšÚ“ACèw&É!Bc¶÷»uÉÝÁ]ý×”)Zû ð¶·öd@@UB¾ŸþZ¿5ï‘ËÆsõ A0Ö¯ Óž ¡ BcÎt{õ.Ñfåÿ·eŸ¦ïßÕ-î«;"„ !Œ¹ÁíÕo¹Û©gmT”ñ4áUÚ“!TAaÌén¯žÌSRûU£‡jO„P!„1;¹½ºÙÛfFпžàíÑB¨‚˜õ’á«ëJíÙB¨˜n5Üø×_¾ç让–¼¢=@B3H¤QÔ½ÓÂûÕ·µ‰î6Y§Jy8€* „0f‡äù_é?o~þåÛŽJîY(òíé`!T@aÌøºÏ –ÒÃ}Ý{‘M´§ƒyñ áfÛý¹Ë&m@„Ƽãwëvi¯—)Üã›à&wÛÉýJÑLíñ`]qëik¦î¨ÜD¤WÞ†"B¨€œ5.<”ü˜ÞéÁ»®’/*ÏÓ¡BsÎ £¾pô€Ùîþ/['»øj¸íqÚÂ2B¨€œ=¢êµó_Їì<¸$u‚8>®Y[{@XFB˜³N=¯–‰ìo‹´Ð–B„æ¬*i”Ðo’_Ù$~v7 µ'„añ ¡¿–èt…Irˆœu]ëÆuNÏ`»ƒ` w»OLs‘ä=õп@aΦ.y/™Ð$­„m/­ÜÈÝœoˆ´Ö–B„æìï’×û­U¦"í]î¾|—‰ Ô–B„æëXVß‹e–ÁP‘“µ„eyÂY_:á„Ñÿp[ÕYž''!Ì95ª^I»èQÑ[ L¼¡¾`yð¢»yK{@Xÿ~{tòbLîÎó÷{5ûCe!„9W…ûp£Íý×M_/¨öNøyL¥‹û‹ ^!~ÄE¾Š{—S”zÅÝ}ÞÝ ù"ƒe!„9§=ÚèõpittïÈ‘î´ð5åñ`[ÌC8s`ÚîD!”Æ÷æd´ì!„0gQòõ¢ƒÛˆ4}(¦¥¿—bŒöx°-Þ!\Ø/ÚMJWí”B)~87Ãe !„=¦Þ5QäÎ{¶N½ÌfÚÓÁ¶x‡ðÀp/ÙñÉ%ÁÕQ>­Ðæ×ÜL—%„öìVÏ F‹£›uhãb·ýNÒîI¿™a,ÞÏ/œƒÑ²‡ž!ÑkDëÉ¡l¯=¬‹uGº}¤ÅGáf*„AÕþiÂß³>YBØÓ=lÞÑc›Õ ac.¯]qá¢Fn¹1Ú® a°¸£Û¾5Ûƒe!„=­¢3Â]>¾¿hô¤Ÿð¯žYm”H¡ÈgÚÃÁ¸8‡ðe¿£TEÛi! .qÛ‡dy®¬"„°§gòüoµm<÷„›úÍ‘‹þ%Ò\äiíá`\œCxÔ —Â7Üö°ìŽ•]„ölâËW’ö€¨”_Tl/ÒQäníá`\œCxŽÛW®Hl§‡p–äùçYBØó¯ZO –üã× X\.ÒFä%íá`\œCxÛ[®Il§‡p¶Û^+»ce!„=Ï¥N›Gïš(»9niV$òöp0.Î!¼Íí,'%¶ÓCø¾ÛÞ*»ce!„=Ëûú­qûL·ýãõþszåÌ%«Šl"Ò¾J{8ç¾äßj›ØNáÙn{¿¬N•e„öŒO&.®]}wwoc‘R—Äu'âÂe-Ü®ò\´Â¥ÝÜöÍÙ,›!Ìy&ñVú)É…7£kîâþ÷¬æ`@¼CŒrûHßÂÍ´Žu›…¼¡È#Uî/}7ÿVÂÒwüÝ_÷j—xưXd íá`^¬Cøa¡YÌT¿™ aÕ~ïùGFËBkîv?½¾ûB¹/߸©ßn”~¥µ‚kóbÂè×MOù9Âê§7 _w6=7Óe !„5»‰Œt?Ú¶“úì¿L{<ï.í(ƒÞÞ}½öôûF?BÞ‘£é²„˜¥MEžp·³·Jë_£FÉ­-—kÛâÂ`þ&õüüXp]nfËBc>iöÝX˜¹7GwG+Ïãb bbIíöx5'“e!„1‰ôŒ¶ÆÕÚ'7oÑÆÅ=„A0õèéûÍê“æ`¬ì"„0fŠÈàpã¿wàÏ Ö>­•È«…û÷|F=Å?„A°è±S7ïÝ®¤q§5w¿ðꬔ}„Æ<"Ò+ÜðÏ[|ÑJÅRP:àÇ‘/‚ûßpïTž¦åCW8„Ƽ'RîÏùÞ­óŒÿü _@3B{DXFB³¸qtý˜ñu^ù6'^ôÍxá(ôB„Öì ²¿»œì_QIòգϕmýíwÚ#Â0B¨€šÛDŠ> ‚胢wR\•pj°­¿yEyBXFBXS¹†ûK¿ð†ðlpi´ôSÇÄÙaå?ýÍcº´؇pþËwßQ׌\Ì–5„æ<äZ·]x‰ÑVÑÂ/EJ^ö k…!|Ww>˜óNÛ§¬ÎË̼çs2\¶BØ36µ÷þâï>ÓÉm]¼î—þª= ‹wßj]o !o*wMî½×sïÙÂoŒs˃$ü(&é¡=,‹u_ù:H|S5&±÷6Y)¼)½6\M,ŽÓ–Å:„GG»HËk{'WóeE^†°âç/~­ÒùlXƳkLž^éWË£W̼¯=,‹s—†—ã=àûáªjò/„²¦ÿoQ8èìo´GAÞjïþ µ‰*X~-põò`D¸9R{8˜ç¾êwI9%wò-„ŸíVóâÅÿüQ{ä)ÿ&—j=ÉQ<êLÓ”° )Î!¼Æí 뮈ÆåYoL|~jôy9ÒŠ7|áÿ¤Ôýí ­÷Iÿû´gƒmqáÄô„0ÏBxŒ?P 8ÿ“%Á¢wÎèé ½J{$ä%ÿð`JA=£=Œ‹s/r{ÈS9›$‡ò*„—¸ÿ +ß—|ž¶âúf"E|Š*þú¹¿J—×wB8G{4çþ×í!ïål’ʧ¾V$2pzÚÂ'«‰4ý^mä/ÿ)õŠLÔ ÆÅ9„o¹=äáœM’CùÂDºf^óã³"ÿPšy-Ù½õÚ× aÁçÚ£Á¶8‡°ªû úäA…ðQ‰>G.Ýd‘ÂOT¦A~ëe¯k ÿµ°¬Eû6ÉÄ|Ù°‚ŠsƒóEZæ÷åµë—G!Ü[d»Úk•k‰œ¢1 òÜ/aôŠ’ŸD(¥[]’ÜþX{6˜ë.YOdûðƒ«ó'„Ë[&_Ù^ýÅC×?ú]´z±ÈZz3!o=Zß³„jÏÓbÂ`z‘á¿äh”ÜÉŸ~â~j_èn/_³(<\•¬û_wïK·µP{4äªiåkÒu墴»´‡ƒiña0m°HËã?ZÁÞUŸ?!|Jdµ ¸¡UÚ«ÓãAe±È—Ú£!ï¼Q󷨴ˆJÒÏ‹´‡ƒi±áwÜ1¥—ßKZ Ü|» åj¾¬ÈŸÞ.²^°{ò¥}‰ÛフD^Ö yçÂúMZ¬=,‹uÿx¯y>GãeGþ„ðQ‘^üxËýÞª –>¿kcgç2^6Šÿ¥êõêîÈ«-=2±õ™öx°Œ*ÈŸ¾}N@ñÉ…Šƒç…³5ÇBšTV{/.Ù©2ª†FwnÑž–BùÂùþ:ÉRžþHôá5²:ª„¼T½y­]¸Å¯øs…û•‡¢û'iOËbÂñè»—ùÂ`k>˜ù0èCþœðp¥y§z×$pü^åÉÍf{ü·âæhs?í aY¬C¸¢Ê³žQkm{·v²Ê4ÈW»úÖ ˆ’7pÖ1i/í58ºÝY{DXFäQ;ºCÔà¥K¿wÿZRào›âSwÉìÄ'O´L4°PÒ¦=#,#„ ò'„sÃcÔžé%œ³‰_*U ù§Ê?:)¶¬õ<áË÷ïzSýYÚCÂ2B¨ BxotZÿÛÔÊû½¢¥Ÿ§Bž¹Ôý…éïnŸ­Âf3¾_;¹]ûÒî@åK—þ:õ·檣ù‰"ÅþÇøFㆬzå@ÿü>²‚~b2²c5÷fZ¼Ð©V¥iêcz[­0{7òQ„°â‘c7nî,m·›øiöGʾü ááîXµìÀð¥A[ôoã7 N«.¹J{4äåîïK§ ò¸ÚLw„ö0-ö!\0¾cÆ3ìÉ\Œ•]ùÂ3DJ‚àö.iÿú>,‘ô“‘Ÿ¹¿/Ç,Þúèß«Z¼â]Zù$î!|¢Kýfÿ99™,‹ò'„w¸?ïEA°øÒM¢Ç°m}ce¼å¶¾× yã~÷÷宑ÔÁ•º/MW°ëê#ÏÄ<„7×÷Ùeýóýò^ùBÿIª‡[ó^½óÚ{Þ\nï'RÄ ×$÷·è¨p×-s?O5­7‡oh ÓâÂû¢–×Ó¯=~Ó‘}£fƒ<b=B´é]{­ºÌ‹ÿ…Ü>Û$Üsë(RX^_¯Ð¦Å:„sÚû]¤é9¿'ªßˆÞ‰t~ö˦< áR÷éÀñní2•i—¾L֮鬕ÿèR.U”snÛ›~ën7úÑ¥ýÏZëï÷~?¦/U_áOËgewª,Ë£.(iükÆÒ—Å"­ª•æYÑLç±>] =E–-O>Á±{¸¶Z£•j‡ð`í!Møj·Òäx³£~ÿëÞŽ8‡°º³ûïÕ³ö‚þ ¹)‹#e_…08Æýi·Ÿ™¶ð…+Ë­jó¬H>;¶{ôÐÿ6×/Ñž%«z$¾Wí£^ç_¿ÆÖäí ¨žX’þGÞê>íb$Î!|Çÿ×z¡öjµ¿Ä׎Y)ûò)„Á:þ ¼f—¹Ü¿|t„â<+ŒiûÕ”V¹~E>Ǿ2ñÿå#A¿ÔÿÇ5ÇäaþË8íW| w÷йâá{/Þ³•„ïÖž)6âBÿÚýµë.ßå–WÏÚ@¹W!\þßóbÎ2çôþN_öŸÿ¿WÚ…hÒu¥èÔhÅÚeOu⹃QþfÏÔõdB;ù·Hµ×žq…Wµ£ûcîzKâåÞ '¶pwÇ«N'qáEî¿Ô1u—ý… ›gm \È« × We-‡³­yëÄÿßþóÚ׸ì·YñìaþOvýyÚ3eOâSèï CØ*øâøUÓBxè5þk¥öŒ+ºSÝò¶iïÁþª¯Û©Л'^âÂó%ù&¶LÍÜÏÑÙš''ò+„ApFYÚa«ÙõÚã¬Þk"ÒèòŠäÝo¶r²;¬¸?`ýÝ9Õ¿G6‚³üYpùähu¼-€¼£=ã οÆ-óoØì^"]Vì'§ÿ¾8‡ðN©÷ÃY*ÝÑY(ò-„Á’¶Md°ã‰+îÑ:‡æ»c«×Ò*w¸ÔæÉ¶‰‰¿>øg‹×žlÚ'ZÜ&üúíWp#ÜQs~æÒg¥"èL;q¡¿’×Þu—?wË[em \È»:Óo<}ì·å÷ÛVâc¼ËAæçwTíîʰÂ^póA‘ú®j݌՞qÅöK¡dº–q"«j CqaU7‘òùu–ýcÝWgo¢PáÔ'Ž;mÒ¼§VÉÜf"'Õ^k£¼+fÓÂÆ”Á¼a…ýÿ=®wÍ«ó7_Ç4¦‰Ÿ8‡08ÇíGÖ^ü¦Üåñ·ìM”º!\rÉZ‰ãOó}>Öòÿˆ´©óÒ˜‹D:­°/ÇÝ%ýýNï«~ÿý°Ôÿ>CÞššU{Ö{ Âc£ ±ábľ(smÚnmR6GÊ>ÕÞÕ9íxT¸ï\µA ÛKäÀ:‹3‹DÞV&'ÞM{d´$|0´¸]òõýgûF¾©=âŠm°È”º«ÿ“ûYâ(Ö!Œ®b²GÚ5Öª¦øwµmŸç/ØP aõiáiþ¹Ï°ðáª>ß(Mb™ûaîîXµâ¾"w¯?~–°Å×þkÅ_ÿø¿[Uä麫çŠì–ûYâ(Þ! >íévÜù–Ï–»cø¬gNûö®Ίª‹Ÿ·½ìÂ. Kwww ~4HJƒ‚’J‰’¢H#Št‰¢tˆ€RJ‰´H—äÂÖ›ïœ;/¦6^ÍÌ{;ÿßvæ¾™7çÍ̽ÿ{Î=‘ºL+o_ÛÒûÓŒ|ÐßlûÅš"¸—å’F¢¤bD—·v¯¾,*áAE è@ÓÝlZ èãÀÛ¿CÞú êêË¢G蚇 ö–Õ~žÁ–Ž"cV!Ô’ÔÐŽ)×Uñó¶ÝØq–^Bî¤ Äÿ:²sÃzoûÉË‹nÉŠ…û´êlFe}ÐÒÁÖZ>GM€ÅòÖ~†“’º&ÂDL)b¨%©¡žÅÉDeѪàb“Nÿ?›”Åú„ÓòöJÌR¤Bãv$Ñ‹#µ–Î×Ñ ¼G¢YêË¢GD¨4#–9n‰›FœÓD˜$±%‹ðG®ÒZ÷"®r )t^Û²¡±Ría,È&[†½Œwþ/g¿ñ¯ ³'.ÛûÜ5±tƒ5€VDxäAµ±zh!L’˜A…Ž™ýÅÇM)¿›éCŸ ,H}^£×ÊfåQõ3ÜmržW k-ÏãQÀico€bÎ}Ý?ýóð1¸á*Ÿèšº&ÂÍ)Z’ºZád€2²·v@F½%<¦tëÁX ‡>>V¯n5@z™¹×§ã¹Ýø ßÈ~z}3 ú  ¥é ¸}Q%”XƒàÔkž3ßõ|dˆàÙU<àù4†®‰ÐW¡Ö˜ k|Š×o“v`Íƾ•âIWj'ÛA™e†KÚþóåÌ2W Ö:€²\´rÅýä¿Â€+¸™ Ê a˵¬¨:µr£<›È”kÒ¦V6Ú ˜ë&5„A„ÀY"¼ôåÀæuºŒÞú"ùCÅ85ý¦õºO°_þa €%ô÷ÚÂA-ë¼9rÃ3gDK–/2[™Î B ïaË“’éÜ2T:ú#¯.Ô¢NçQ›—Bb÷Œï^¯é;ÓOÉ>ù©]©l‘ùkNL,7«B®Ñæ²\£Wæ[®ýpÍûíë¼1d¹èžà]Y?¼SÖƒýËéWq¼üm'Îo¸R ¬“ŽþÏçÖËýÖµLTdžª#¹5çh^§ë‡Û}µ.ä<¼Ëå®Ú÷Å™—_¥^ŸJÊócÛB4u1ÿÏÚ®çÄý\ YL8ø&}:ÖÁî.QøY¿½ô½6u:|°Ng9ƒ5€SDhþ¶¸uèéú'Æ}™Û>êœÞàŽÛXÖzHP»‹ —쵋2*)à'¡Š›.G v]„Måû‘?”¶ÜQæÎñ`pZë§¹ç 'Öñý‚l¿´àïŠ_̪Ož#«>±Þšü¬:”_-Áâ\+›i±’B„˜ÎðÓ>…Oþ…¢>ˆpŸ×Eü‡ö̦Q[RvŽyuQë)¡=¼afá苘b¹ÏתÙîQÆ›Þï(òô a½ò9u¢!öéÂ!ìצµNKu@é*JdšÚSÝúâ4ý3±ÓÝ/ Â{»gY'Öþ÷ÞF˜°9C„U¾’¡cS¼¬·¿¨ðÄHÙ‚9× `ôÕzƒ‚Þwè^tѰ±7Ñ#²Œ”6~ÆaEX‚+þÈKµ…Ç[‘æ¥~ZÌޅׇ‰~iCÅËHê^’Ö#¼Xñ†eáôÕ@ÑÕø†ƒ÷Bmô¦ò/B:Ú…¶ÛHÃÁA<{"Ew¬\J*¦œ®,<%ÍD/O]¥Œø÷Øk5vî¬Ñ%E÷(»¬.ô  ÇÒ²Èz»>Á[Šß,Õ_ FŒõ“;-„íþ}\íýÉ@ïD˜°¡"Þ†«–½%¸6Üë£Êœ Â]¬w—6cþ„.h³y {Kéeö¯5jÖܱmØ+õŽtUàCY°B©÷¦-˜Ø#3mÖww½¥kLh¿ ÞlQž-´û}‘Ø¡¿Ê.àb5íßü‘ûX Æ2C¦/˜Ðm6”÷ŽëC-aoà 2ª&yC[39Žcã{šJ-;ÕÏË6£î(};«P_4± õ¿°èó2C§’• ÍšÒŸåf)ÈÜÝïÕ í¬½'.œ6¨»ˆÎýMñ%ÃÞÔæ9šaÏØ2v"¬cr_$á\v…àrM;5,È6ÓIöœmd5Uü`ƼñYGkí+Qb,%50U3ç‹›0¯ìå&šXûœÅd{T¡±ÊJf]Ä9aï”Kñò¯}ÛÿÃ.xuDÈY¦L~f—Ѩ§˜Wj¡Ÿ/üäí´Yñ¦Ó?;%Ð9Þ¯ÊîÎUËî¶—iŸ§¥ò0'Â}8RšÚò™Ñ¸¸edM¨—"­m%¾ÂïZ^®ÂìöI‚%̹ù’pM-•(â×Ñ€[ɽŠ÷dE d™îmd£»B¢ †q¬†¹Ø+û»$ RÔš¥üG!ûZ˳–ã×äŽjöÜ~=h0Ÿi9ÿf_ìÄ&Þ›g ý´Ü»ùž÷¤0ŒŠ—áyÒäÉÊsCÁQ‡é´>‡ï~ÜÈK·«^û@uÜÈrãž•Á",zˉ×R6Ük‰*¬òîbëÀú[k‰Èß=bCD¦5ü¸þr®!É-$ìÆ±ÝÔÑ’j0v1»|3õé£a6rkh™ =K=c´ìØö–ƒvâÎ. y _ŒäÐùøøRh“ˆ[Ý: û¢œýçn0i2[,ûÛÙt3Sý.e×µ$b7o#¶°G }á]ËÊúUË>O„¸Ýãryá5œ8…ÿhßNÊ]JxáލYmkQ½øÊo3E‡œäßoAœWݰ¡³C&¢<¸g;æ=ÿ§Ü@Ü÷O¤ZO€å­³‘ª]‘àN‚ø‘·¢pú+Xùˆî„Ç÷´îQ|Gõ»öO"W…Rö³‰¦×ön‰)?ì;﬛ùÖ ¦ä7³ãµ¿Å¸:øÑÈ„hš›Ó”Ûü9’fÙh3ÑHÁDèkœ'е¡„×cøà³€EÒ$3ø³Ln¹Îqšytµ[6ÙL"êe’ç\ÆA7­ ë)å|µNpܯz”Ç—4×Y{Ûå «|ŸYM哆Nýö ·?œßǼTö¥ù%ÖÒDñ}ûC75§‡#pŸNxŸö‹ãÖÓâx!AΛø!49ñ¤ÁZßDh™”·9çûð+«qÑ&ÂV8ÌŠÖ‘ÞÄ÷(ùð„ÒH}ö¤Úp|­„_%ÊsÙ M;EçѲúV‡$L“ñûŠ$ljl™U6Þù9$Zûu€/å­ß¹rÒÃÁ‰78p°ÁÜl ü¯á©-Jý~Ór œ™&"U÷éß(_ãÜû|&ê ×¿}ò^Ð^Ú Ô°ŸÑµqrLËü7Æ­Ãÿ†‰¾iƒŸ« ³‡Ñ›§Þ_êmP‚;.c΋_ô°%–,ÇIqM°[ˆŠ@%´ÃÞ¥ìåä ˆÆW2ß]aËcäLÿ‰ºâÏ?• –§StÜÖµï`yrâSpå¾e@®2™l]Tc}µ|ɾÏ$Î&5VÚ±Ü ]á.º-¯ šÌûØ”¢›‡Åò,%ƒò— ¿£J²á×+p®ý‹}÷%j9­sˆ¡£Ì07C|^l-œ}¸Ï8Ÿ§ÜGD®*¯7…™%C#Içà± Œ "œñwìGžô“Íqcª¢ü¤'9%µ¡wûQ iŠïˆ?¸¤™.QצGwýrV²ÜKµûXœóólo²¦WUPd×F]: 'Ò%ß8;ŠÓɲTóåžñš€"ºE#\2»úÃt8ò*.ÓZð+È‚TŸ—¨åyt‰)Hü’ŠÜñ&½/jé {@Ù†Z6jÊ¿r'@îä/MŽ€n[iÖwç+~Õ«»ø²}„%Ü•eÐ0£2åÁ•[]aK¼+QR‡f'ò¿®x‚—ÀQ"Ä j5iÛ~¼ ‡Sp¡.Âýxª:þöéà]6G/!¨ÿÄa}'ç.Ð9–BgÒ—þà·xV¢LÃ%±‹1Ü_â1PáïÜGÞ«»àÄTá8äŽËà]ÌP¸¥t^"ejKÛ(ŽB¤‘O !»<›…,¥y»bÎð¨2ÝÖÝÜ´¥Ã ¬Ñ±OërlòbɪÖJþçðù%k¸4cjlûÌõ£ø˜{´:þÕ‡9¤ ë×CK » z&BÊyßËš£^ãÝÙ‰$Âèp€M²ÖÚ A\Á%J¨W Y0=À"kÃ?| Ü Ù©-dš À‹¤£ŽÕìë,ñ¿4äõ“â GË×å­]](>‹c?26À·²Ö×Ñ߯pþ+ëögð÷“)†9La¤M±‘֔ܖëDž¤±mX-2à'g´=>èÌÝäKøêšóؤ÷Ï”+Ÿ¦Ëj$Sž9†Û&…u_sF¼5‰Ÿó,T©Rª++ì 8€ä& ]ÿ/ØþŽENzFî/ 9>â¸['¶}ÛϤP:ò&6'߀ݺ ül*Ñ—…Kœlh™° Nû¦ÉN u ~ž“Ð3’e´²B禇ÔEÞì=pñ>¤•×"žü—ÌçWž¸Ã/Ò´å÷âðÞËA¢ÊLÜ‹ÃßÍíçÎ\l‰=Òº ÷r–5R6C…°ö_‚ŸHc2*lH)ŽÊ~$aY¢?ò7€y|Ê×| ÷†¢öU )’¡LtrI〬¨ë‡²B *Í¿rñ$VÙ½òÁYwü$“÷âôÞå8[ß=ɬ„4G—ý†°E¯,^úò䎃VPå+ç½°5ñH™­¨j˰QY­âôœh6”¶]--z*9Z‚øz?ç.fñ9` Ïô“çq¢’»îsÔDë –"þãßkIü(-)_‘¿ƒŒ¦)ø}ÎAÏD¸ïÇ…ö#Ø^ÇCò¨‰p‘âÏý=ùЫ‘òðž³lRž~éñ;v '§-S[ñâ[ÜòV­Ã´PξNáûºŒÖazS^A— &»H\F…º|³×èSŒïW/`÷V^½[ PIÞŠJ_0MÌ*¬‘Ú‡Œôò¾À{é@^iƒ¯áy¯žQlÔš†¤”“.øoh Ò°3I© À¶”_Ä1\ì((Q˹̴Mpõ—³yØ´Wü«ÔÓż;òUßøí'=gÀkòVT›²¸A =¢›|éá åɺ`DZÝK;RLeþU äî¾(fòï\É–€“Æ4œà Oá7¡6 NÙïÇÞp­ó ï¼E"9è™?e§Ü§ Ót¼ ဎòÖ¬5_ù1Ò¶;µDïtøŠ9"Kä–b‚óÉ­ƒÎà<›Pîåwư‰`îrV=§Š,i4ŠuAÜt+³b]ÑcŽ¢¹õ9^^9L;m ¶a>±lâÐéëø%éGÀ'‡Ž"MM†1™)™¦ {ð´ÛòæÄð¹uæ@¦Z'/„÷€¿[|V7¿8îr¼!ׯ:ž[/ø¿jP~Šä7Ù¬b=BB‡:ìON7v[!±Ê[â·'žimŒ¢ëÝü™Òh9Ák²’20ò©Èï=jã¾ìGX,;¤+Y@`:… ²ï옂ˆúJ’¥IÔ𠾟‹ãÃkË+|A¸'×mõL„¨Àl…ö»`{hÞ ‰p¬¢%øÞ…dt¤ÎJÙpÍãìo´ÿ[·¸™Í¬Ÿ% gÍ¡ÅêYòšöqG®µÓôMïZv( ðÝs¬d6”¤h˜RǧǨ9s¿¬“TW2K¤àkñêÊ^WSÚàŸk},‰] Ääü Œü³*àè1e($ÿµ p Ú§VÓ5ž—'AБæ;™#b‡±çF æ÷HK9ìîõê͹ŸÓœ¥ìŒ‹ÈT·S.8è䌉êœ0­I„@ѰL‰˜+$J\.o¥HÙ‰ž3J©6$wÅJ:úÐk/ÊBQÓ¢ÁcÒ^ë“ÊHôWh*`%ìÏfØ&ýÊ›aIÝa·ð1‹|U·â7åýXæ„Å.¡`á"‹ëöà]ÝQÃI#}ëÍ“¹,¼Ý¬7Íéª<ôw­ ؤd‰W­x…"“U4Ïbþ~\E™GsZ4ì9ïQ(Rî'P*ùPÙY_†[I¥ °,üUF­ú*mÌ ÆN¬-¾„=þc@6øÔ¡‘^¼(ô/[Ê™çñTî5*À¡ä¿ 9ü£8cŠˆJüœÇJ†îŠsŸÀn‰Gôt|sžI:ˆ™_©‘‘á’íYÕÆ_, FjLÖä1U€HžªS°£‹ôKš—) D¬HUM’»ˆóÐ3rãéQHÓS])ˆ­Ù¼:'®£õM¬s¸g‡ÖÍ]wˆ©6”údor'¶¾ ±ÙQ´0†sÁl£š}iîb u® ‡î8(fƒ%'#G1ËZB9§QZ¦gÙ†ÊNY›Y8FF¸¼úeû‘X~¤"x+Ðû2Ñ?|0 ¹fR˜¼KŽs‘ þn_ƒƒvÝ6Öì(3i6À‹p/Ùˆ6^2·ß ÞÒ¼ ;Ï~ñeÜXÈHˆ³~ò q'°m•âÑI¢]R4˜Øj­cÈ* {!§Q¥+*ħýŽ·Û9çXýƒ8ï3Á~Êíû…ÄdÒ…&â,½øFœA~›þ~ŸlõÙ“/á¸X–¬gðÜ„GO( ÷´!Ø—¤#ü½-‚tM„ÏXfÑ.B¥&á6Bz2ëœçá(Ò²ò6.fq3~Í*¤ù’Øx|}K'«ÌÆWYR•àyAéÌŒ|9(ó Ezä›ÌÍñU'§¹³þfEQMý˜º2ÎîåÄ–º7}¡˜uôñp[oHÿÄ [)…õG `û‘JØKÜKrÉÍwÏfÅ%&Г¤h =‹ã^ r™Æ!Ÿ#JkÂfç÷qª]˜—•.ÎH{‹É„®¬ù^”O13À/ñð1@IÙT¨«¢ïQ2ȧHA¶â«î0{ÑÔAâú•¿¤HöGœþ,nŠ«PÁ³é 4ÄÔñíćñ‘{™$ªôlËSÎŽ[Vt_Pþy¨8åøƒ˜Ë?ö ⌢T­ÊØ![ø»Î/Š<(¹vpÜyüd–ø`Ê •I ì6èš¹­ìÖ¼>ïðS|-Í·¶ç“n×òî™'Ý®¯îÃG¡V’´Ø18øx l1¿éYñQ-ÂN²7Í:º}Ö)ww¤sxD®Ç1ê©|Ó÷lü{ƒ6ïúKÜÉ,ˆÞЧI¥Šÿëõ­ ñƒvX~¤ö©€›(T X*?¬Q;§ð½l'(ïã.ËÅ!{›v ?0—–scrhd­ªTÖ*"ËMFžÛQ.YÈ»S±¨¦‡BÜ]/ÄŠr2ÿvŽQu¨£yK)°à î”m‘0‘ÕZÇGyjÄ>‘õmÓ†D`®†C¬Øýc0Øò«û ¡JXÁ6£0¬'µÂE^»[¬åo[Ó]‹¹vš§ˆBËÈ£ß帅}FRo†›­R:yJéó6ö¾½¢c,Y°[¡o"äVØÜÊÒGØ2l”qwÙX•á0þiͬ•¦x½âÖí”Í$Š’1?%ý@rÐÅH€ ;ÍÙ¬aâñ#i±Ÿkü„üá²yo&o¥W Äû2|Î?W>? R…r…lw‚ÿ‘ö}áTÀh/“€Òâù^k±—QCkAŸCFò£D]Ëðÿ¯ìk:ärP¹8‡³ìÌ´*L©èæpq,ݱ?j£ËCò|K{~ãéK-®ð›Ò¡°I¿‹J^é06m ÝŠ1HqvdÏšãžôY[ÉCPÅëY´Óý—ø ˆãxS£+”1}ñœnGŸ ²•­:á1€HŠäT*ÎF°§žÍfmÁi݉&ög˜yFʈj²|Lÿe•<øÙô:ÐÚÂ(w„QÌS‘z˹)Á‡"tN„ܦ¬ Ãë®[Ê´…ã…yÙØgê¸,sq¿6¤÷%]Šì”ñ9í˲IÂ*Ê%#-\Àq;ð-ó§¸l‚ñ +XõÈØ`€³ÒãÅR>V,œª1‘ãÿ Vf‡Ÿõìã¦r;ˆÀ~d_«[ŽèG* (ï;ÞÏ꯽»2/±%„*žŠgXmáѧãÃÁªöÑ Îó˜Ç’1;4©ÚŠØ„ô0à6årCTá«rúǧU¶°“ë˜_ÔþÍB„×zâá¿$ÿµN ‘xºRJ¾GIB‘…p2u›Ów²ÌWÌ3éÁø'†½ uð0«ÿÇÒáËúf‰z hV’iÏ+§ùÎ)1(ÇÙu¾ša=éo/!9øcLiœ‘›²¶[-OE¨Œ™x“¯‰›Î°«µÌ´NѤѲüý;ö5Sgk¹£dÉêÑÚ{z'Bîa_a0"Ç"¯7Þ;N„¼:ÚdÊšm_ )Ê߈¤2êÛ1‰t¯ˆvÓ¿ßüå;,ÑhKKãzÞ/hÕöEﳬƒvcG^€Ÿä'8†ûþüÐMÓ¿1Ÿf¹±Íy­À$W/‘°Üh²Â”á"vù´HÒøÓÕÛ¾F²¡üD»·èÓæÔ’ç/7?½--ðûY“mwe¿.k“Á㺔e?:ݩĮ’8ÖÚò:²µåí'™*4ldÙG~£uY rÃq–Þ¥]%"ñÔ).á„r´j=©29Øê± #…ˆt—ûÛöuöŸÐ½»yÁò”ÚR|CãišMY»uá{,§j ‡ç.^…x²ýB¦.³Ü8çMv¿zIË…™dÀ?Ц¹×ØàŸ?rd]÷EN€ªâIÕÉPþKÃJ·lSŠ÷ µÌZvSÌT@ÝñËw,U‘®^@iùÄ}Ð=rÜ£Yõl~YZýàÕþ¢<&BÊF”Føfšh­twò'"6gž8^qqº¨hTêlŸ—s‡Ý²%¾Çb_‰ ¹lK7µå0<‰Ä¤ ۨ¢¤`¦îÑç. cEI3ÙlˆPJ¦tÆ,ÂÉ‚ ˆª×™«Î°'oˆšKýüW:…k”ïTÞ\Z©,LR°IšKú‹LSØ÷­ÿ|$úþœ)Q$åžâ×ßG³«Ù±,­ðÉ*aŸãŸìýKÓÓùr_+ñüVÂNw:—lbTÐæBz¥¢èƒ¦œ¼j áDˆˆûsóò9sWm¿ìõÊ ƒ£D˜PÕ—³£lµÉñ§¨£TLÙÝx2Ö–7>°Ë¥DŠûÊöí¦äpGÌæiä†žßØSlùwzÖ§ê¼F–À©øl‡÷Uå)ý;Ï6l›^;,Ímq©‹ÍZ9Vèþ¨¥½wgu6]kÌ<e”X‡üA{$¿Ô¶5Xâ±@ã“RjÉ„H›ƒqÊpŠÉIzx˜²J˜×ë?ϺÚÍxsRÖI^δ-ù5ÿ#ùã½÷†Øë*)¬ÏŽgíÃêJ©pT€)Î^“– JÛn®yI8ŽÛWGØ¿=BX*-aµ}âZÕe«Trð"ô18J„?ð¾ñ ûßoZ"õŽóÉŠNUb“KïgEÌöþЬÕ}yR³ª‡ø¾Í_µý‘ÓÅS¥ÐaP°DÿØßsâ ÉR嫸W”rÔ’Pæ êYjy?™jVJö#å˜m ÞM88¢YÉüÕ:Ìe® ’›ñpY÷Z‹5ê¿Cª@¼š]!sp`Ú<]\Éõ’ðÛðf¡¨Ñ̽qþ³Öq¶àÏkÃPÿdf‘«SqZŸ±ù˜£žœUÊ÷K%í’v@‘ f…¾Wä@‚ÿ>· Lˆ]\=kh`x®6ûS~Nü¯Ãš”È_£ÓB7ä<õ ¼ø±Oý"…ëö‚·_êõ0=ÓÕÂÎ>ü¬|8O†¦¬ø¶å¼æÂRIl3šgt±T¨'ÏŸlÿhž>Àd ˆl"[Ë=9®EÙü•Þø\¡X›»a¡p”;´—5¶uwQÆÂJqßßdvƒºSßú¿¯ÀIù$ì§äm¯YŒÜ]¬ñã˜Oè׺ÃÀ©¬°—$”s“¦ Ϲ›AÙx䫼͉ñ~ ²…cLÑÄÓwh„’塯BI»$ÁVœÖÏO„SºÞmÀˆÅŽ_K2•ë n >—ðÙVMýá0$ÆÐ£K"OÄoñΜwJHë™ì¸ÎÀ B à ÆE*åSþ ƒ[-bï+ y…y]À=rc7UÇùd¯SªR'¨cQ)Žb[*>øñˆÖ²ð M–köc'•_øg[ª8µ`Æ[Æ!—«#w!@^Þå`g` Šß¸Šc`uîµãB £¾2¤Tj–(j;¥vàH½DDTob,[FÌÞ˹û®íL‰ Òn‰Î­X«#åØ^ÒþÐM¯º$·[¡?"Üê¡Çœ|T¹þà Ryn÷ç8¸\S8ÚiœÀ/”®híÂ÷õgţū^â¡o e^y5ÒbBÿVäÞSÐ 9(Ft€²ÖAÎ$Tq §a®D¬2aŸ ¸ÄÛ¿AÕ0â îBs€lbCrt%¼°ckzD„ö@¨À’ Âûm@5tÇ'ÐÆ¾Êƒ¤@:â—’‡Tø,iŠÁ)‰žOñk:ò¾E‡x®¦’ÐBõ”G™®ê*¥ƒDˆêIV…æÌîN‡ØuL±5þf”‚ÙÒYü\ÕÞ§jYo®•ðß+<,~šA †Îš6°2yV{ªÞlRh©Péë?$诔ö$~"È:;_Ybói"ÍxñJÖ³.å ãLE˜ý¥bwÌg”³ú\d`ÿoàN¶·úÜZ>ñ`:eÉá-\džË&¿\M ºùîq\œh¾’ñóhó(p²— 7îúÓ¡%f C"ı7…iû(#‚›Rá¥blMϽÁc¨àÎyAÃ?epö~ܲóàÜ¡s.ê‡G–e³Á Ö©Žy)â^´4‘öcK¶€ë}hÀô`®Ýİä!ÞÃ"ÔÏiô+»ea »õ¨Çœ!Mõ§­þb+œœÅ½.&‰à¼R6{±s”÷-©$ÖJ°¸q¾»…ñ^ðè§÷¡]Äî•Ù€CxFÖœ|öñNS¶zW‰Eµ“9¯HÎ/ØiÝsî_šÕvG©nBD8ŒúÊëë“MÛ½ŽP™dÕ’½áœI+4Güî.‰x¬Å[±Ôj§4¯£üæ|„Ñ‘Á|àAžÁ)H¯›$öѸùö–¿\?8‰M9Åߨî^iAæÇß²#«2à‹@‹s9Äe@)Ý‹ÿR\i.5$ZPÃ#IÕä`éæšm ëeü/o§5qt4äu‹œÑœ%x"mûy¬Å(ü—R£®ìd© Ÿ ã ß³Xªw+æ›J“ã„ýƒ)’¹¤·gõJ ú#BîWzñÖ/IdÖŽßÝ“=¹üê‘n€ƒDø/ò½\¹î/Ø<†¤âÓþxÁ½<3§Ý`âðgSA/iêbù× ÅD£yˆ8–þv½Š¢H÷ëÙj²x‡P-.4ÿ€’WÝU»;¦ãoVhÝJ¶¹ T ªÇ.œ»B!>«C‡OzóY5f ü7‘G–‡R†H)î °†ù†u¶‡ýÁ³†æÎÎg‰hò$‰¯ðjè¹çãøþ–óý-Šó;›†òÑßiÆk30¹ ‰Ðœ`™¬u @n·…›,#®uà]I ùT!yøt_®®ÙÅÌÌ`eŽcý²HÊôôwÔGÑ- _ÿô ¬ªÏÝ&u–ä”ñj÷Â>œ» g–¾Ûªa³žÓËŒàµïÞàøÌdg> —@„ª|eGJðâvOÒgð¤Í"¿¥GCyz¢¾ñîª?IADÈq7zY{KþN³Þ´™I£o˜ÞÞš$°·»"µàhá»âZ%‰ã®¿'Ì­™&WÙúõÊä 4… I¾(²^á(RUY©_ ÕÝöH`Á™‰åÉ@j*õŸèJtFÙêQs[³ƒ[¼WÌ”ð×d– ´T^‹ÈúEù¡¤ ù-tŒ„‹{Öm?ëdT'Ÿ4rR ÍfîÏ ì™ôýb¹›ø§{¥5àF¼8»{ß5u’±B¯DÈqTDQí+o6V;œtû²"$W3+ø÷» 1WŽ]´ÒÔQÔÍ+Uï›pvx\é47 —b¼n%ÏÖäL7ûÙíBYfy²š¯ãMAßý÷ÍÙìû¸«À×m6`@+è—^K!E¯©nÈ~©%&ÂSÁÅ…¬—Š«¢%ÕÈ-®Is;§£ ¶RŽºŠ‘zƒ‰Qbøª{–¾ÃbÞúxjyÔ§1€-r®úzá‡Ù-ü(€ð6µnÕZ<©º&B*Ø ™wÒ¦…9.º;5z"Õå‡Jk¸çJÞD„ÜDüÙ·í¡™½ÇóœÞYÚ£v¡¢ ßYïhµ­¸ ke­-œÎÑGuŠm²ìÅ. y˜¦ÆK‘P—zPúâ¹J7úðklPŠK ¨ŠA‹g µC×DØ‘,c§Ø¦¹„þd zà~Q "T„¹'©Äv’{ÌŽŽ¤«õÐ ˆ%…8 ,÷X PÀ¹ï‚?·ã ûþªØ°ÂIáR1~C]ðsAG*±ß¡¿pã‚9Ëø% Bn&n÷ñ€,ûó°Z¡ƒØäoÝvÏ…¼‹9nOyÁV~¯Öâ$|7šË[Ÿ¡ÜN-+·(.)ÉûOZGÝ`VÐ@öútÜrdÃGÙí¯Sô¿Wu>=á° '$Âø]ÏÂ<îJ2ͱÆÎxÆ]N%¼­ç'¬iÁ†­È¶kôk†béÂ(ú-'¾í¦I!ðb¼ÇŠPù0ªY‰ç+Ò 5ÃHú¯©ÖòHåÐ3~Š=d®e[H„q»´gÄY˺e3‘öà žÉ™Œµ˜ûdVqçw­Ûu^÷Y;×T’·^pÆ×§be(†‘ÚQßùŒÍð¿&qïÑûRÌr[»C?­å3Ê¡g"œŠ=de[H„€¼Í<ƒëu©_fªÎáÄdx²»Qfvü†ý Yë*€¼Î|[{€aòÖFyD‡‘ èø¨`v÷?bâSn%þmlí?h-ŸT=!u•Q–m!žÄíFž(ás¶–ñ¶ÝÂн1JYdÚôvæÛª,—·q:#Õâ¾ò¯±Ú"„ ,=ϻȖÞäPRuÜ=á>ì"å-ÛB"ü·»{N¤“Ũo´Užu†“†·9Ë8‹“ ^ó¯º×ìP]º‚wÎ`“âÑÉ /À.yëTÅuH•ñߊŽÕ æ®Òr®Ê÷×9P–»‚÷/K³Vƒw?ºi›fÒ÷³߇ž‰f÷°‡ßá«ü¸íXÞ-Ç=€:§ÿØX‹ˆ:ƒªó£\ú7.ªxYš=-7%¼†£p¬3_V`‹¼'bíœù67âzW[q?Sƒ “<˜›è6ŽÛFß°”ðb‹…ÀÞ#2Ó€¶Ð3rT7 à=¶) BŠqöó@@½ÛX"·Êx "t' ìÀ¦OÕ»rS€C¢Ê” Ï6“ÔøJÞÚOóä2‹B…fv¿ázOúv–Õ",ËÝg±ºõ'®Ø¾xË>Êÿ’²ZKh •C×Dø'u›RLŸ°aÂ8ê8.–ÕI÷('>¤YHF6ƒÇ—|r¿Ð`>khºsª]úJf¼Ü6û~ü@¼~+çâÞR¬7UÚî̬ âû1sb¯%{¬Bå¡‘ÎëmÈéG‰—J×Êi•°3x¬Î³)ƒ®‰D}%üÃ[6"4ïb9ÃnxZ.óB¶œA: –­.°#ÕPŽ[V•¸0@½€ƒ_qpõëf-—´³4M¦œL³ ƒ¬¦ïßø…—]ÏeI$ëB«­wSqÜm ï¸–%5û¢˜ïw(#åÂ^q%ìÞá| –´¯V OÕÖ nk-I2Ð7¾¨Ã÷•ŠoSÒÂ{•àMmkTìïŠt©Ì› "tßõuˆ~uàû¹ßl:Í#3iϳ…Øž¯ç_ç“UÛ ¡õd¨êl±’g¡Ó¥]<Åš2,Ç_TE0|A)y‡j'O °  ò+Š©Ç'³rYZ! †~ÉïáZ‹hÀø§w Í~ßAåzêBßDÈ=­-?*¬Ûx±£™}¯A„âI =£_:¤ãW¾a×þª’Ç™²Â×Åïm™R—b HEÜ´ ߊU. è žfÆ·Gn`F=Ëÿ¬Vò¤{rrwùD}#NŸíc_âì}? ÐEk ¸sƒ…ý0`‚žó1霹¸É AÁßT‘Œ³%5ˆÐ1P‰ù¯ žXð{¤Éÿ¬ž ‹­OL¯tá‹D”Õ%>Ÿž–ÞþÈi¯‹›^h¥4)ÃU|W¹çmÅ9#@öñ€NKhÀíˆgÎ÷Yû,Þ¼uéÀ\´ÝIÇõ—õN„wñ½aï):GÅà[>ù¨A„á ªLyÂé¶¥)ÛâµÂÌ[¦D@~5…H84²eõ u;}q=ùc“Â*¿Ðûþöô¡Ç]ûN—`ήó{þM-¤I)©§âŸ­!öŽ\ñ—ŽVEðÅ>¼Cñ!g™oY¼6¯$*|S¿:¡þ‰'¼ÛÆ4(’904GɶÓ«|+ùä£:€ Àœå¡Á,×Ù9¤áhz”Ü™zÄ(>h eIîÔ&•V¨Å€À‡²Ö‚:w7 &°­2¥ˆ,=`wÂ_89ZÏ>­ 0[[ù ¸˰ãT¸Èü×>ÓNždà D¨)®êÛ·¯› hû6²Ä<ÞžÊ%f$C1V;™œ‡ù3"öò=ÇŽîR~EÚõšÊó)Î0ä­ÃÚ«/KÊñO(Àüû%@aî)ó᫇º6U{æþÅ×C½ðªàQ€²"ã],>ðૉ“, "Ô¾M„Ì*šK”Mf5s;j¬•D®aG.¡i¾œÆ^)ýxF‘`9@Uõeq#ñÖ-â9ok0S0$ŸkÇ BZÊfÀx âqÓý(Ï€; =aì3„j’¨ß&BJþ%]F£ô°Ú¸€èO‹[XЯêR­³b¶ø\Þú3@nõeqÏË Z=j]ý`üQtôÍgä8Ó‘}t:ذŒúb#&I¿Ôëúˆž‰p =zÏå |›‰1ÆHÚâ)¬Ý©JHúÀù/†tì óD²Šèð±¼õKý: è™/³áª‰¢|›Ó¤•5Þ¢ØZ?ëð¡rù.âíû[Úø2À:-¤I16P_NSL”#¬bá0òÈ«ßè2Ïãñ¤J|·HÛê{ñ}HXÑ„å;ÿÓ^h$Óh0_Þú£~ÍBz&B®è¡ªûáÛDHùŽJ{JÔ@…‚·R‚R ùȦ„èÚ­ì%Û*u‹{òã¸^mˉ”Ãôš†ejŒø¹™·¢ÚaÁG{„ys,ñ²ÉB€9òÖuöJëzƒ®‰ðekþN-QÔƒo!¥-"i{R¹DœÃ"?I¶ºËéj#M ÑxÉhËÎn‘ßL¸:™ƒu‰§MÙ-ÈYµA)–>+àKÛGŸ°ØÛ eVfE¡“ó sµÀ[#å­3Wu]!w£ ê¾Ç„¾M„,ì\ëfÎÏzyöÑÞÒŒlG·!Eú9àføKØò_I€ÈûZÉ“üB†Pk¸¯È>ê—¬¢aTŽÞóEÏð”à )}鯲² ±»Þ {au·¦(K¿®¿²;sj™HkF'ú=:Ä'µä­mÜœ›ÄmÐ7rÛã+Ðh›ŠéEÕ€o!_0d‚ %¶2?÷·åܽÂrNêÕ“Zç8†Ãbúíöý3…t/©PÔdËö×dx—û‹ÊFŸBšÐ»š §â›àoã®m?enXÁ6g‘UÅ‹û/¥'묺€.à€¿¬øÙ³´JÂWû×+]¨r«ZšuM„›7oÞÔ‘™ JÕkÝAïö%õm"ü€×þjÛ_öeæ[„UC¨°ºIá|kýH[°¤î¹;‚&#´•(Ć#÷=á·©lrŽc7?ªÀ»ˆ”|§þ?O[ù4ÂT²œÿÛ¨Ú‡^Ã?ª CÏãzà±ËT–Ϙs*(ãÒÊ-¼_Ø–Iêi—9^×D([W²a¯Jây¾M„¿á0M ~ ×¾ÀÎýiQË3ËFIYžœ¿Æ›x([mmõZ¬cõüʼ;vâ Ú,ª®+½qÜa2ëð›18Ê~æã0{WÂ!3ÔÅ!^‰û‘mÄî r›[RÍ-Ö§bëâüÁ›|G§ãÜç ¸é¯p…Û™…ãº_oµä“ B àÛD˜ ZÿœüMög6äÙ75˜û|xÛ- \™ÀÉú´WP=…Ð5K—Ô’Ï#ðq"4ׯ‘mÁ©fürôg±ÅS™ÖÏñ¿lZ‹êŸ¶hdçŽC¾8¥µ)À|ÔSðoÜ»Ò ma.f2Ó –k-£ê¸ˆÊß?²ÖITFD±ºäqT¨!˜»ð Òšÿ[Wù[ï‘HšSê(=ûŽö}òƒæj (‚®‰ÐW¡>:´iÕ¶“¯’?Ð ¸Cîo=îq÷¶L›{àÕ’EfdªaÙÞã>윃%QO TEc#>îÁ÷´¡åEð›üëÔêì%¨‡Ÿn£`{YŽŸÇšÈ€}%í+d˲OÌ8“< ‚\îÃÒ`fë4}Ö{ÕÉ(ä?Mz¢Ll÷iº¼Q=í0ˆP¨N„¯Ôç#ÚÓuܦÆõNEѵúýt+.úʲfdð C-3Ú¿^³L ¿ÑT³ø´Ër ͬz ‹¤ØC³¥¼ä@µä|óÊ[oã½8ƒC!ó(Žßz^,—a¾uÞj«?`³ßòo—ú ¶¶7] ÔÈNd¡P›—æ¼Õ©pÅËK`9¯Ú?ßbq¦QAÚgþ¦+T›7{yWÉÆ´ÍÈk¥FÛÀ§må­¯ðžìW8¡>ÀBKå"Ž)Mj`æv«™WLüÂBÖÞŸkšÜ• 4™Â)VκNS¼ ‘%u_àX{wO÷1xjÊ€íûO:ªàóØ$/\Ê™Cµ©Pa¡P•che&èÝýd„z±þuzIÇ«qÝ'K:4°è 4äß¼q²‚ÐWxÃ|þgñÿÈV5J×éøy1-yW‰%j½“zÂ6€(9;ìÈçpRöILÀ5sæÑ‚X)DáóÉœð’þcYk=€Ï˜$¼ƒÿÛ³zÞ'ŸýýißÈJ¨*R݇Zl»;‘Lj%äzyõñ/)¢ã¤ŸáŠª$‡1€ ë¸)¢¡2jEA8öÇí7´QmÜCº;&kÅñ¸)WEî_Éq;Âô(GÙ0¡æWŸÇßþå=òO¿/é3:d·Îð÷Œ„I ˆðD¿Â¶®“öµê8>zj!¥vì$\z¿Q TVÑΣ %ÊöÒF*A0EU1 h†Ç´8hÚy¡ ˆ«>Î °–‹'·™ªZ‹¨:j*$Y}–?($‹+oÐJÁœ)ûÅwX÷î¿ç‡4—t”[m€òÖ=ø=Œñº'Âß+KÖš2ÏIPC0OBE"|Ž=«¦ØíRFÅez"=7ÉSû›ÚZ«*†íð7Ë)Äþ‹ûe‹¯TÝ0˨R(c>@À_’¶Qí»Ë] g‘9hø^-ÑœÀJ|†¯?4ü P*É41UMB¿ãIóϨaÂ(?¡®v©Y݉J¶JÃvWàäüO•®ÏÀRcЫ֛Ùs­¨¦´D=[÷5eckI& "Ë„jÎýœ´[]kUGL~Äuu(ˇø÷m€p±÷ÐÃØ[tœQ6bE±å–²Æ|Sñs¿n;ú¯Ò9­²Ê[kU¥o"4÷·öž€Œùr†[wJxU†9T$ªÒÒ€ˆ„Ò©t}~2“NÐò€/RžWM) h ©a'rSÂH¶Q¹. ²o—üWø¾Ç__[8”ýœ ¹ÜŒÈ&ôŒ¹QoÒ~•åsÓB¥î>ç6ažê¨ÜÑgþ&9·wÃoòIAßD8ÝÄ VËÏÆÑîƒ]D±–šÞmUïú)9¦O¥øfÁ³ø-µ6 µŒ†å4 >êþ8lN¦ ü!Gê\.‚?½ÀëÞËÏÂøÞº»Lè\›aq3 {ºN¹]`¸´ív˜ð›Ú^“|~h…XЬ*Nèšo1°›Ð7;µ-Môo€zD¸ »¼õ4@ šS |Œ|-&¿R˸èÙyx7ë¨ÔhKµh.[á˜Éqíù­&øBHWËRâ;ѯ¯5÷B ÷ä·d*±f¥þšNòôû3îÕ¹•è°ÁšŠš .¢€2Ϙç|À¼¥Ò³ ;%D(Ø„6òo†êÐ5¢‰Ä|Iã)r½ˆòê8 õˆp¥¢;Þ3¼ƒ²òÑD€b_I†AÓÑ€ÔY}'ub‡õ±ûÛ_ʳڱ¿=êûvúÄaþ”¿&˪ON»ýp%!E:þOtÔV—¶ýW–~ÙÀýdÌ»½¸4Y$©<(Ó‡¤)vB~9CÏDHUŽå 7÷)Þ•~Võˆð €ÿ)4œSG†·P|t=RȃyãWãÿ‡“?×€/àoÈdæŽãV¸ðMðŸ1ÿW%®q¸ýN„.Þz7ÐþQs™*íˆg)ôl¹â–„¡r¸GtHl>þ㢦ZxÎH‰™ôL„àM‰Tˆ!í •Ž½ êáZ€JòÖÇxï«#-´æ¸Q–Ô~Epæ,iT”Á€†ˆçÝ¥êÒ6õÞºiíc|ÄÂåÙZ*ÁÁ!ùé6ÔžyKòɵϪ2…±èÈšHæÞè+išÄ?^{®8ÊÄŸEœIæKÒu²ï'PŽ6OR g"\‡w¥—BûNÐylirP÷d”¯QÕ» €é¶õÛGŸð‘Øu`š2¸ó?‡·í;ÿRk1¼½-Êß.Ü~Z ·Ú/*…P0Öå æÆå{ÊŸ˜ï^¾©QÉv‡0 “¸åÎuP' Œ>GBøàh‘ÔÔÌ~¸†Öƒ®{TÒÄ g"üo‹¬„âxy" õˆð¿@€ƒ²Öñj»©Â'"JŸ8[¼#IБ~|Å4mÖxõÊ´vˆµ&¡L÷®ä£gßIÀƒ™Ïj-¡×°H6¢ ÇǺ ·°m2>wIä[f!*>hÎ’±-#h;ø7O˪ =!)×_+´¿ÄöbžH ¨GØ ‡´"y?Uéút!ãϛݗÞy='ʰáœÐݱèZ‹ã•Xk±ˆDPÑÕ‚u1By¡vÞœéŠÓÁä˜> ‰°íEV¹¿ÿpq¦î(In~Õ g"\€7f¢B;•)©ã!yTŠDø5€¿t¡}’’¼¶G_†Þò"ß±D·f2¿™aêŠÌGFVÏž¥DËo¤K§kùX¨Ìerñþ}ý½ÁP¥7ð5d§[øúþ.nnvÁØ7VÏ©¤ ¤ Y¾6ü‰ãοyÄήýÚHO½\Áþ*„|æa9‡ž‰*õ(•¦ZŽí<%P‘c ¢ö,^¡þ= J—·á)ÿºä®RŽÏ°¥§ÂÍel]1¨ŸÈeaÉZý뻸ùrsŠíjd0¡Ã°¤Iô_̲Œ˜3×xÍî-“Yké ¸}ò £–Tšj¢8æfêÖr3T­Gøޭ»­{qóÃQ/ÛÔ žÂ¹ê¶ÁÏÿ­Gɯ®S¨¯_Íi[Žüúí;d²3ÙÌñ×Âò Ë‹¾  ë+5Ò»Aܯ¡„+X ¦ßj-w`0ˆ’À} ~[|¹9>SW®”B×D8“:J“§¢6óB2´Tö¨Pž†ªDhîEw±ñ²[û÷Tª °Dµ‹‹qmzÍ‚™²k²æIòǪ…§T ¸Ž5ª7f:-_ζìuG}Pœx ¶6ª6Æš–ƒ°k‚ÙÚŒ›Ù²XcF>¬>¯w¸HÏIkyÇVLã3f—f=¥MBí”@×DSˆngÔbûÈc>ÒˆuyH€7AU"ä¸ÉüM€%µKä.¯­w˜É)t”À\s±¨Mc¾àð•äø+Á³ÔÏ7`#B?K*ͳ٨q…¶¢p®S°l3Ù¢KÜÞòôlÇIÙ XŠWÐ5r¿ð<Ó¶ÿ|ËÁÓG^Ô¿ß{tähá T&Bîh»EÊÿíÛÉŸzðñ ¨å6vè"¬ØÉd€¢²åû¡ÕT’ÍgÀ4@0áD,ðíéïœùýã˜Ö–×±•wב1`Ç-¶ôa*X¿e>AêTÙ!oë×ËQßDÈm tñòÞ£6rÜOoeaw®Øh5sŒêñEIÞ¦#¨@/¤jdgœD½æ®*²ùøª¢SN…Z;pPãïßäUD®p1cDIdáéO2¬ÒB²@çDÈ($£Á Éqªˆæ9¨O„”¬é̱ó:Z›ÓöÈÒšt·$hEEæ¨ì svi9Iã.ë·»K {1ŸQzžÖ¢p'î~X„ºiZwˆ”&Îî±â‰ÚCïDȽ˜CDƒ½?“Dè;xrfï¶ÒÅNbˆR¾çÓ¦÷ß6…˜5–¸çâ©þ´Ì€»q~ÃìÏ–í}Áý—»–xaaN~&i$V²Ð=r\ܦAUøµBÈ×ñ‹D²Óz "tÏçÖç­åÅF¹#9Niî †k8BÐS å¸Çe íùµù¤ŽÈzèí.£æë{÷©YÙÓ‹@.ÿ=…1ö3äzžèñà ˆðèÊÉów¼½ÛXa¡“ˆŸU0Šöu}¯SHòÛš-ôÿ‡×x ÿ°:À2—¯›ºðµmUCªîÓZ4Wp½ïüjÊ;Rá=Ií0SÌm ›KBÌŒ`€#I¡)¼„} :‡',W=øgÏÍ»]ä:™ü9I‚êä]‘7÷ç³d¤ø]ö­ñ'ŽaLb–Q¹NÄ^8°íàer|Ýi%H”ðÎÓäÏHexNÀü»l"%ðÜ4*9´.Ù“4ƒA„À B§pŸ¼-Ò ÞO^ž—¦RÏ ÿÙµo4ã,UÁ¶7RQ=¯QÃkÔ1¼™(Ê=ì5yKg>È6SÏ”¾Q{ÒˆIÃ[ŠW]xƒxÖ<ü½Êô«Ö%/ Â{»gY}6üï½>×à BgKÑ­ÿµî¾ú4 ÒÅT{yÕ»Æ_àŸ)e þÔríš©½%ÂÙÉŸ¬öTˆT'Eæ»åLÌ?úlÜ«#˜…4PÏÃ|rˆÝùnâ¹J7ëªEówì÷Õÿ-79¸yz'„ ”èøªeo n‡ ×OžJ'a¡3‚„Ð{eW@±˜DO |$kŒ‰ØŽ/ûËýû/ñ$iÀLâ‡ÂPÝ„5ctq+?å3/eÈÏ*ÃBàÂäO9D~°9lù­~ baW=(£GñrzfÛƒ)³É߳΢jW˜x>ù£µ„Ήð~Uv¯Zv—ð*¶W/±s:… ÝÄMý\J§—egØ †Ùz¤sŒÆiYÞ—.]2‚/Ì[ü ÷wZ!`9Çų‚Çh-¢ Òâ; íÿo%«<:¹SîPꔂd· ’~èÚ¤L3Ï#ÒÒ¹Wшÿ÷À®3ú_AÕ7Þ- DÛ=.—Ga¡è¦@A}²ºäJ|Á°ZÒf.ЊmÝB!p&Ýß>¯øëÉŽ.)¨ö„”ªw•OPŸ¢…ìSëm¶üu2ç¼ÇTYÍÿ£Óæ$v¼®ñ#Õži6û‡ŸVMªLOªð­EÒú&Âö<ñ·z'œï“‹·büãyÉ<ƒGL:…ÍwÒìpék[ä”DaÌ0YŒ^[q°N¿ÊfŽ=iÔ#tä,ñ–¤m1ud¥ºÛêâg?Ôí„yn–Jz©ìž,IÙ{)$7ú/P˜{@?kxö‰úøTò¤Bo0]á.¦þM¼.h2ïcI|º%zŽ7À BDZ L>Î õsékÏTEùnÅ–ÖÖy¬æ—¥Bý›´Ó¨Pï8(ú3ßKîÉÚN5r…©;hO¾Ü^7]ÚH·í ƒPõÎ¥µdíê¿ 5“¶3˜Qð"²Ö¸4:àu‡qŸÃRIjÙe©Ðž <ºˆ©^^H=!YF++d{œí]<&‘ 0ˆÐqt+oýiËÅ/NA=Û¯J÷÷´eµªrp¤Ÿö=M›5†:èÊYÆÏ7—ï=ºíËz,^!ç¹Q F+Ï›e­‹“fèû(|ysQ€0÷I¦ºT’±ÿ†,—´Ý`•vCê¿3¢W–B½n³†:=áRPÔ¸#Ø^ÇCò¨ƒ‡Ç4BŽû6§POyã¦üˆGî:xSaJf ehf½¹¦ìUUÎÈo“\±Rç‚ä+Ï·A1ˬçðãòfÊ÷àmq¾“µ¾ÐVÜr‡",ò.~ÁvîON{µ¼í·& =!96ÏUhª‡UvW`¡ãHt°†ëßýb’5’* Ñ~׿΀ƒèÞ*ÕbŠø\ÛÚ {r+4‡œRh¶à& ÞIÞ\ Øm‚©„c¨åÉk#oÈ(jxEÅç‡Ù™ïJÝ€½z&BòcPÊÁDu>+zJ 5`¡ãHÔkÔÑp†ÓÛÔ*]«í§‰ZÏÞ§ÿ¸• õ ¸*ÉÍ¿ŠR Âð /4ì;€ò ͹ö$~¥j¯$oF5)§ÛS ?”’·Ó‹žÊ' ©=–Ð\ \ÒôL„ø–*.ZÿŠí-<%0ˆÐqÐjÎbiãP»£y½½Lz…-î“Î@’ø†Ýð^¯îŽ)‘ÆÏ$¡ÂB.æ‹uNi„”¡6@–+å4þ”×Ý'™:˜ÐHÞÊûEÁþƒ€ÞâC^U(ëK3z&Bzµ²(„mõ¾LŽ× B'Ð Ç,if™·Ì,óouÑÜ k‚Nüý.ß%DÌP„az…’*Á©5Bn$~þ´q(ÌÔôޝêÉ[cýìɼ2>–󇟒›‘÷BÏDh.„ïÖ8Yó*ï¹×c©ƒÀå`Y…u&Çr`e}+|´|DzQ¥i3—4HÕ€'@YÌAª pOGà€šùšf’9ã5J+kY2)»I Z¼®>ïE¥kø´„ó˲e½ÐÓs‚©=!7_8éÔë å·ÍçA™<ƒÁp|î#…®›?;X}âÕhg­÷GSÜËzÕH‡ ʉ0=~øNp*jfds&Žãê‚4x>Žª(¹¸ëgüäf‘•â‰À üióuüžáÔóƒÝq”I=‹:Bª]á3–Y´‹0±hÂ7,½×Ù D0ˆÐ¸ZðQ^€%‚†/ph.ácáPºÄz€B¡b ,ÄþÐÝ_¢ev*³ w–!?4ÄSº«pï«gΠ𕬵­Ø%ôW€ìlãé¸LÖç—ñ£¿ñÿ'*‰©tM„ÜVyðú¼ÃOQ0ßÚ>œOº]Ë»—i "t .V¨à?~pûjåZ¾»ò?ֲƤTƒÞ€»1àõeÔo3¿…Ä“çµI}ƒùñ”UþèS+ S¹Fy‡vhe[7»IÙØMÞXgþ|©Q唿Ø^¼ ýýÎFƒŒ ñ¨¿8Ÿ¾‰[ág[WOa[e(ãå^î:‡§MØã÷Ï–›×/r9ROû޽6_À^,lßþt¾—6Qwø  Þ›–n Ðl`- )4µ‹qžÌ^­ds¦úÇb‚ྫྷ´Ôñv,DrºÇdô þ«¶ˆøºÅ…9”Pe¯‰S†Ñ4þ5·dé¸×y}|h‰]çDÈmÊ*_YxÝÛÇ.ƒDÂbA(ZÐP‡LQ‰_¢°©fŽ{œIeÀØ‚jòMðþçÞx™þ, Ï› ÒL8JÛQXPÒ ¥ “ñ8ËK‘.€ŸÉj„yúø‰ò9›ûƒ¤ŒÆv€‚G™ÓMàM)ÜãIäÿ’RTÞ ½!÷°¯Äå:Ç"¯Ïue¡Óx>·>?ðuÙ±3…†¶šºlÕ¬^ÌÆÓåǨíA Øqž9˘N..jëÄŸFó óÓçóÝ’ÈYô%9š;T¡žð³(=@‰¤âõŒÇÅÄg؇Ôgí@êzùþé*l.).¼B.ýÒtÝ^ Ý!Ç=šU/Ìú¾eiõƒWû‹ò0ˆÐ<9³w׉[Žž5‰hpŒ% :~QvÜí`æŽâ( ef“T‚üÔw)+bOT.Úõ›p˜^–€ÔDQ?¹#c¬óøŒ_IŸŸi9(÷QDÂüB–…›€2?zVBOâbüU÷òT½ˆè½º867! À⌥D¾1CñÀ ÿ©'§‡áDˆˆûsóò9sWm¿ìõÊ ƒA„ªãg¿söýG ±ÊÅØ<à xCˆ.ÆãFw€1¬åÙÅoø%ÿU«!’FKñ×èvÐí^mŸØó­)û½»(É1怘£ç„/?lÍ4ކÒpHœ¾ä¿"l{ÆÖ¬F¨(§gáDèc0ˆPm¼"¤°%¶@ðe.‡—çfð\%'Q*l> ÒÐIS”å×Õpv2 [ÁqX[·tŽdeê¹[[A´ÀÝ&B#oÐH¯ÿÆ>§6Ý Ï” 0ˆPD¨6fPO.,jz˜ =— `_"çpÞ`({§)h‰v‰bku{áÀ®ƒ—½[·s¿4°– ëyUáóøI°(»êF?ÔíÃ|(ñ¶A„À BµÁJ¤KJø®@•äögn 8Ý´XA!· ÀÀX®ƒ,§³•qwÑЮízŽÞ$O¼J8r˜¶¾.‘)MH†|Í‘ ¨µ|©ñ#D¥"ýF)T4ø€ÿ,´@ZÈT®ß®Xîdq¾ESòp'tM„TBê³õûhûc3Ç= 7²yµÃŒA„*c(À»\4Õâõ›okŒ{^©æÞ]ÈÄK0”š…¿FeðE#Çž¡b?…ÕG†RZË—Šñ´1=ân>}jóèb´ý¿§²ƒ~b©¡ «W|Ö´UEI= =a•,qžß@6-FÏÓƒ—ǯD¨2æ°Ζ£ªý²{PݹJ½Ö©?§õ¡|‰úE~êÌ¡ý¹[ÕÙ}·¥à¦Å§+É… 2Ý•ØfÝÝZ\qrK ~‹Šóz‘Bbò—k=áºÓ–’Wf²Œ~ÂoôvÛ¨A„*ã/|‘®Jä~©µt¾sxÿϧcwü[Ž‹ŸÎþLí®a­4Á|íÕ©YÒmùèJꜸéo²¨õ°xªAÏD¸’Vt,ÛèIœá·´{% "T8Öö¿¡˜M;‚-Åa xQànfa·<ªF‡úùmeFûžà¸¦3µ–0µâ *æ­D `Bs€$‡-bl‘ÉôK“ç3µ[ôL„³Àš¢—Y,ªùUÜ®îiÁ< ƒÕÆ—þÙÞ  ýÕ  £ÖÂù>4DMP˜Û Óüï~ÚàC­%L­è éI”´“¥|”W\)Ú‚-»Ñ;úé’Ÿ¼×º¢g"œ€7z¡e»ið–íW¸]ÌÃryªXÇf D>|kî¶ Û[λŒ#3¦×Z8ßÇ €ø'ÞÏNƒ¾âbMüâ`s/­îîx‚ ¡¬¢ðbT %䘆…ÜBÄT Ó½šÉwÛÝÜÆ’D6¼ívËìè™§ƒ­~¸™\ͬ¡Ï÷ÁËýÌ "T¨þŽÃé-õvÜïÌzïcmEKXmɪJù›Õ åÌ_¡'­7]·”#,°F[ùR-Ö¡b.K4—`½¸){•¨‡tg¬X1£«Ü8”¼žðÃKõ…Š~£«êˆîfè™—àmÀož¤[l-w·kzZ0O Bõ±„õÒßÙ΋ÏiBû6÷­IÁ À€Ûñ+@$y|7eiÞŽ£0þ¹Žá¬V’¥rôè&oí,‹ìÄ)dnY!á¥_̽Έp;yñCDÍ.k¦¥­Œ»Ô‘ݽÐ3ûZ”_È#´†R±ñ¶žÌ“0ˆPt¦NêWç£EË'µf†œ^1–ø6ƒ=ç¡Tèo@N»Ã}?>1ÉdI¥Hê¡…Íæ&Äç­Ä-Aa÷h¨­ŒVèàW‚L£ß’Í´î.b»“üPCt7CÏDK·ÝÔ¤Š[Ô_R²ŸÉžÍs0ˆPìyj@83´?Î`˜FÕ@K€føçV À kÛ½tË9î!*£5-U£2À*y«<™v¤e5ðåŽÞ¨Z¥ÍûÛYN¼p$½c8H‡¯³¹* ÷ÿôœÄž‚ž‰yÈ„m1s)v,IðbºÓÎ~5„ó "ÔgA88íà»|k[€måJøïùÏK‹f͘ÿ.@†ÇÌ[?ò–²¥fÔX$oý UìÚ¸aÇ![mö¹~©´,¹š0WÈr µ@ÔÀsó¦èå@ÚaÒ¡á3ª:Œ—·Žè,n9EkÒÃ(7['œHþ,nÞæÇ4}/ƒ®‰(°eýH Yvôy/‚A„àg|mŠÄIY2èšÈ“ºp, àyŽÛán-6¬À†Ò1×€‘îUCŒ¨/oE=ñcI%Ä›/nº„M¦¼}¤§wGEÅ2ª}á«æ6ìÁ,DØÙ«Bƒµå)’êæ7¨ÑgÒDéKÉ2=3†›O±„µ¾ìlÈ´a(ÕeªøDkÙR/¢BwGÚx '+G$msˆõŽ [bˆq|ö—Í#¯â#>ífA=}!31„1Ÿß`~.Ïá@/7fD¨ÖÑ›ð“¨íö:yáÒ¾b:1`®÷¶Ì°% cÞðîÚ¢Þ *n'«Õ §TÓˆ'wEÓb{Ã_ăcêÈ¿µªVZÖ9rÜK‡vé3ÚÛ‰0SW/¯Oo¡&ØÏ’c„ ÜÌò…Øîk'TjÂys€‹½Û¸ãí˜tPÜ´/`–ìÀ?XV –2!1| ý!å5ÆÑŠÑ‰ú†î‰PŒg®x¹6H0ˆPÜVÈÔÎ:©ÚW™<±"Œ¡X<(fÁà†³ž'šâU~€¬—„-³R(÷ú=ÿÌB+vèZÇ2¥ù"¯Óy,µ¬wÁˈÐ7`¡( Ð'™Ù«]´îË÷™÷qé6´,ðúœÆmEµÇþ € ;íû;2àå Ò‘?K¦1~›9®ÀZù‘˪zJ^OÁ B à:¾Ü9´I‰\5:ͽ”ü±xŒÈògUaW6½y2P±'ë ¿¾aÍiÜî€Ö²ð1,6aGèd©pwª#í-Q>òª¨zH zš*YQ2ÓèjW‰0ú{eÓZRÿ.‰àFÀóÚBö[w(þ5€|z/²}©±püizUky øV3ÄÂß{¯3ë¡‰Ï ÷·´·öoø+kèðŽü°ž¶ÑÞƒ5€‹Døs.‘ZÓ#Úm‚ù6> ufZ·º¿ýõ¿œy0è¿8ú/™.X­E‹jÌÍ2‹¡p+~¯ O*%Môò§%ŸN^¼Ó:ä¬È![bÏ °NÚ¨wD¨\#¯$¶z¨tË}¢ù2¢±Ã›FÚ­žwÀ›÷†Î]e¶‘›zµMlu0zù÷ÿ”Ü9zƳ»Fø¼Þ°¢¢¥R¤_¥•õ‡‡–L'B¬òºØPƒ5€KD¸†÷ù¬Ð´uÍÌüë[Æð½Kþ›Un?¿Z™÷ÊêüÖMºÌ68™¿ HÿwRgèÇF• ÅÁ6{Ço #†®ð|]kfmm¹ÆAkPL²¶ð¢ À›î“M%D¨\!ÂÌ¢_pé´ÿKkÆ„íÜ'›Oãr1º[Y»ŒúlX[¶ÌZï¡Ö"%88íŽûcrÿæuºÿîw(ÙÛ+•ª³ÿ³1r,öÊŸà›ˆ_e2YæIÓ&‰sþÝE-æ¨zŸŸA„À"4W¤eÁcl »³Òë»Í=‚ù<wóØ”ƒG(ÄKé QÚh^isð éuc«ÉssæI"{~UÞ¯<¨Ã?‘4|¦¨&˹–áïºÑ«ÞØ0ÜÝ2zjˆ…™V[®‘…¯¨1ÁN!Ž7 ² Åa]®h-Lr0çèñgE!„Mîä9ã»’ðU¦½qÿì÷]($×­e2@¸^FPïM9îéÖ¾doÊsÑÓcjÓ¬æu÷@%ÜmàR©D¨\ Â*øžM7ýAÉuY¨Tƒ§Æõn÷Îä]z›@ð_š–æ>•>˜1oü›,£ÇÿLÞ™Ó n¶îýÛwsßÕR <žã`-¯Ywÿm»Å)Uý€†$h8çäíÛ'f±ÌkÕy@NOà B à<>òÃñDªýMÆ—¯ŸËBÐÆ” @ì|™ßY”Ÿu„÷å4¦Ò „ãã<€º:wØMèOf¼ðAL39˜l)úM‘ͺ{Á Sƒ5€óDH–Q™»ò Ôr»*“‡˜€t‚à'MùÁF3‘œÂ3äïòâ„jÓñW¬ÑH6œÀ™õPü³|p³&S”Μy)æXK;KÙi°ìnÈéqD¨œ'¾rVA.Šd@¨ËV ›â™ŸðkZIä&¤¹&iÃß‘Ïè{9p^U.žû&ŠÉSö/¹„êõû–„##Ë¥ˆ(ÿáQouV0ˆP8O„ rÉ[çá+lDfù ˜›Œ$ãÕ³âàu9‹Œ”¶]Ø«,xà°ýp6¡e3ë¯ûÿuü»ž>s¿|êÁ B à<VUô\ï¯Wæ $ ²ƒÖ—6îTjÔ5ÎâÈ*«cÎ5¬0XsŽI¼ÆgšQ`žÖ’© ƒ5€óDX ¼u%¾½. d@ŸèJZSf€*êËâ”—·.¨¤¾,„èÀçd±õÌf`;U¼nÚuD¨œ'ÂNrݯ±Fè›àg‰Éº2{¥¥aBZ»YàÕŸ‡]a^(—–üQ¯KnãsníˆR_Upæ‡Y“–ïó‚ÕŠV¼˜qeß¼ÎRׯë ëº ƒ5€óDøö®>ŠãûÏ]\$ÁBp îÅÝ)Å¥Å]Š»S¤§P(®m¡h±–BK‘R\‹»·$¹ý¿7³¾›äd“Kÿû~Zr7·;;»;3Ïß›st—¦5'!Y’ )Ó¨“°eœ· ¶ 9As“Ìð㫵åX»)ƒ·¨ÝÊ›ƒó@î¨m½JˆÛÕµ"!\ïž…½ Ÿº?;{,‰U¬ ã­_†Ñ¦0çÉ9pB'À~Bxæh)uøÕ¯Ðø¹Ãƒr!åaF7OTØpÒÝÂL n±QÓ|‰.r¤¼ºïÃé¦m=EH@ò%©ñúKOÙ˨˜`M#çƒãT4EgǶ*Îóà"„N€ý„Ђ™EW*Û"0å!‡å‚x1ºV±<%êÏJB7¥aú´Žó¥<ñýDÈßI7 û0—ºÚÖ­@ä“,IŒ4­»TÆk•³G” º­­%Óñ¶qÎxœ!tH±6&©÷_ò–èæÐ”-¥š‡þg±#D ;¦°ÓIu‘9åóõ ð’DÃtiicµ%÷E­©G³@áãÔ¤ØKˆ¿–]èKȧNL’â*R¿Ü+iØ?›á˘íì1%„Ïa€ÔðblË-ó¿!t „¯0ݤ÷z©áMï÷Cüg¸Ï«Áª&Q‹-ñ }´’CÅËÔƒTµ.%ÍxìD”¿N>¤Y YæŒÑ$!^å¾h¬Tæ@fBÜ´6ý”/9£n<ùõ??±RÿÀ‚õj£aþãpB'À‘z„ ¨Ò”Ï6òv †­æÊÚ˜¬8Iís¦LÅk…QÑŒÙTºÆj¼0éÒ9†n1×~r[ZAA! ñJY$¦%!…Õ:‹¹ ĦDÏGðLŠÕò†»!„¤OÁ9¨1¡{uc hL­wôŸŸˆ“ÏÜþ¿Wr0A¸¡àP…úöl&†vŸº`x}¦ yfàà\Hg‘Üx¤µ‘¹»mÜà[€- û­Æ“è`“8Ž{£ljxâ=WŸÿœ¢JÂaFËéð÷æÜm›öÿÅÀAôqö¸ Þ¦JÑxΟåòL¡ðÀ©¢bšÖ#÷¥ŽÕI1Ù<æ&Ï“ .Bè8D£ª·Ä CŠò\Þ¹báOEÑÕÿ8žaÓâ’ì1Jåy’B(/?Ìô~/¨l Æ1¥å¿,M‚ñØ àÞÜÖlo'ÃÈ 0ô€¤£‡:‚ïtÏ_9e4Ö€–©öÜ)oÚU݈Ysèc¬4HJMÙsé̶!øù‹ÿ%Ç!t"„\Üh¥Â¬üCÇGôpxnÖ™ó}Ž÷Æðtm‡²A© 5˜~Ö¨S*•>) Òã/dI@3º~ßÁ>¦Íoæ·Cã9þ³çqãd7Þ¨H6›·;{T#¤-šÆL„¬Õ;Ú‰x¹¶y‘Ìþ9Ê þ $BøÏÀ¹µÝd€.óqº(rV¨Vˆn¢~$ÄX Ú¥¼(o»QX軪¶mÄ@Se“J~òèó”ýr«´ÐT“ã2NÃÌ]2£"”ú±ÖŽ¥ž)t‡#;¾L²b Z=Ê´ø¢FFv =&£1KÇñ„–-’üc‰S)'—éó€._! Õ@ä“bæ­P|ð¬Å“˜Âº|Ïþ äFòŸósE ù†ãzÑö€gÜ úa!©“(ºÑ”‡Ñ\ºÚzt¯ñCT- îל7 ¸_{åô$Ä3¤ç¯†å;í¦ë«{nÔ¨+8ŽodS)φi•ç«Üåá|\l®!ç¸(`XÜñØ}9 ™F:ÄÈÿ™¸-!tR!ìs|–¼ál¼Z^9îá±Kï­ër™zCˆÈë­!£u>Òî°ÝCöõ#^ÐS³+ôs~öø>ù:“ð$ÍMNå¢z=*ISÉdŽzø/ǵ#ô¡ãöÐ^C?çŒØJ˜¢6öðšYÓ—ìÀÉõ2‡mg–­…¥ÙYx«A»ùÝêESRFü¹ ÒF*=-ÿz¡÷ç}+–ï¥3É_oø;ŸJðE: Ð:å±ö¨:{‚ä?†Ïrfû÷ßn9“ø‘†ÃE€”D¯xÒ_ÙôÆòá·µh.ál}¬` £yTsáºÍ«d£b Z!$zâ°b|´­‘DÇcÐÜšç»™ÿR’߯zÄÔ¸\Éí–>¡6'@ƒU„d¢I…¼n²ZMèËš´#èçà%ì6`@†ÆÖPݶyǃḨ¶JzÐÆ˜ ¡Eºu"¿MAÕ#¿CBÚNÿ¾r`uYÊyÖ¬2Ÿ·(z\å¸(º÷¸ÎZqr·ªî*òµ£»Þ—Wý§ëüér]„Ð HI„°=!¡jW·É„x?—}3BrW$EK¬ËEô¸ ³YXÇé¸â2éÖfý/¢;!þÚÖXbŒ—|3 lbu*¶ ;èŸò+Q…¨SBúÐ,Cd/ˆ†ðŽQi Lü¹`lLÅU dµÎœ§0,M0‡%/‹I~¼(\Zƒeç?>¿¼R‚²Ï?+qœ…^kZ륜ˆúŸpêtÔ:ÿ6BÎv-B¼½xÕ{Þð\²‹ItaÇî8ࢲ¿~„ô3lp/ºInæ0ëoÖ±upB' ©u6ð÷ Y#}=Í3j|™^‰¨.ŠàA¤T+ jÏJ²ÜÔÉŠéÀk[ïÃ-žr¼ó¿ˆ<žªF‹—RVÞzË^¼¢ú©7 ¨q0Õcµ,@ÈrÚ8–+À S@øËªU?Õu²Lz|@ñæq2žÆ¯Æ$‹ !d’ºíº'¸¤œF›s-YÃl˜4z2!ìóáÏ(¬Ñ$T¢êA0¯RRL©šFHs£wžªüÍê6 ó¢2,žÙ:¸¡‚á~B|µn,=äö›}èá—q¹÷|Scäk%¨J¢Î£ä-o*PBø¿áb¶“èY—@«¾ä­ )-‘Œ ºíƒGwX:¤2Û¥ ñ—Žÿ$µçÛXÇþ¤ã2StÍÛãM휴è¡âåb°ÚBÿø·cA¶R‹„ âçr†ÍK(EHï hXT’¨P°<ó’)þT<0¦á6˜hëÂýv0hlûÃó-¡Égßü€#u3ÂÒ`=\„Ð HA„p¾’Gä±™BÂçK„¸O|'|=Žæ¾ö u‰ùÖJà -öYÙáѦ|0ÒSÓZ–´ô ã(#©jÉM¶›¤ ë!÷»zŸ;BˆGJ‰òꭻɜtNaÞóðþ:)›zÁ¶{Þ€®_§'¤ŠR¶\ /cƒ]€mT‘ ”é:’y½rêdÁ'q‰ª)CاOÐi´¹:"²3!#ŒÛ}àùܦJ Ãz`¾ý’•sB' ‘„tѶþ#mëòÂVü«ì·¨V°D¾K Ëª„xªîoÇu•Ó±¡¦ ÄG­I»m2DKt™´Í„;’^¶’Éç8.£| “ÙXîáæ®vtzè& ; {]ò…k l‚êõEç'¤±} ¾®<ýúBwBª¦š£¸Š²íb³03‡0q²ÿHÛ·‚ ÊrÂdüb/AËMùÙ¹ùÞ˜±Õ†Ùû‹¼á| HÒÚ4=I!t !„q®¸Ìú`më5BÌ<ë8[“2º 0–oµ' 9æM#†zÇw†åÜæ9S×IÂRïFpUmðFMÔ\¥|tRÕÁ=g ûj¢ä°ús.úž¾3Šÿ:Œ»á™‚ÒnO ¤­¶u!y’,ÏÝtl§;€RÁ Ý<(|{„õRJi˜÷4™¶ºà.Œù=y¸~N»Pˆšêol‘â"$$]$Wˆ…²sA¤7çðÑÌÖÀBÌ7¤sëà"„N€Ã„0no¿|Èÿgi½*Šd &èªù’‰}ŠÎl€ê×'©Jy“è…SÍ#ñ*Â.uÊ̶o¿F¿è‘€¾C«-heªi@ÏS i!û:R¢rèÐô®½@öŠNbäqìi)“ÛOùàÍ܇ €§ÆX‡‚ÚÖ¯€”'ÿXVëE[²¨ß¨ø€ž˜¤Âì3/?\ßÔS‚ŒÐ¹ÔñS-øn¥Ýä-7¦“”d¸!KÐ?Ú‹wÞ|둽•y¶á^Ë3¶Ê:˧'!™“Ѹê"„N€£„ð` i‡Ì¸È¡Ù²T7Ê v®’ìÓfš¬D… ñòÀè“fšÖ $׈g=dùH”²m$„Ã@Lód °c/#ÿ)ʼhÇH<¸Ì-wï7$1PîGd n=ÿ¢2„|•ücýµ›¶Þ`wCº«ô]*gŒÈdÖ¢—µˆ[4 C*î™§"&°&@ˆÊ.åŒ:™úêT…Ó´•ð†pTÝî¶.Bè8F£»+·½RÊXÚ²pÍDözã=Xì5­<00)£&êþ5ÑõÊá.R5¯Ò ›V¤®!b0yJÆLiÉÛü·#hÊ3%]i –+=Šâ‚õ æ®<à¦ÿf1Ð1ý: Åe)¶_žÝ}ìÈdèèc€6ÙV4&d¶²ååW•²ùIi¦űêÒ{^”œf®„“F桲ÞGÑq–Ä™)5‡ò]ÊùšƒÏÓ’o’\¢<Ϭ’1C[AHv­!µž®Õ&©à"„N€C„ð=.4sã5·"cî뉩ä³8R˜¸¾iê¶>bV’üº’E±4I³qeý©nƉڃϦ†ö‚ë©{cÌþzHQ–iJqŒ÷hÊÑõ›5SÚRórCúݯ*ä³LŸÎÑT§¥ïr!¤&ïIZ=ålÁ4Å‚Û üp¬:º í63lµ e Y/û7ÝK|t!7Œ¹Ä‰XÆÔö§ÈÄN6, ¤^&cè+zçã¸&Ê’ 4ø—¸³&Y*™¿ôZ¸Å4WÚ`]¶ 6’:Æôo \„Ð p„Zж]Vô,~Ò¾æ·,#aïU‹„=ä LºÑh-h™}¬Ã•UUÝŠ1ÿjŽ aÊmº¤ÛÝR¡‡†ˆ¦@¬Rj&ýŽ$~Š5ˆð%Dî¡SD užf“Ù¿(+4ø.+¥€~CW^Šãñé¬IÞÒÌàÚ1%ÑA.ø©¬¸ëŸ)žšÉ¥ƒk*\žwø(FTƘ\kœq¥aŒÃfBŠö$$·Òcö½ï3\eÕ®–ÌÏ·2š y0³4K’c9V>{ì5hhmt™äŸ“µ~•‹:ޝa¶“»A|ïFH ûÇò" !Ÿ(wÍMâüÿ@Ð_ƒ> ÌšƒtÁ¬W6†§‡uQˆ]Ü•GSuÜì5àY³þêT¼ª/‰an=â7ÓÞÙ¼pòÜõV‹ìUïòfZ8H2¾b¿§›¸ð(÷å‘“‚*0Qú «¦áÌßT1gÐŠÏ -~ ~¶ÞêB“ÿ;8ë:­|z´š³¼÷B`©àOùᳩ2¾h‡Aý[ÑÂi÷5´†„ÌÕ¶îG¯¯dƒ‹:§ ¢ÕU4aeŒÖ0çɧí¹:¯cìfB [»n ƒ¶„Lˆ¯¿·T×ä«àö#0@žJ…äÿA4EéŽyér‡)O†ä p7y¤ ›/᎚+díÈ5Ê:_š}D•»û€§z¯ö¿"ü¶Ÿh¦o.ûzµ£h3Ä}í¾­$ÂB~pYYº>æÞÚ,6ñÆT™«c+: nï1éJ&ÊÙ˜ R¦Ó¶ŽÝÀ‹$!tì'„±t´—õ’û[µp‡ª»ü¸ÌÝ Ð˜fäÿ”Õ&Sâ…{BÄú:hͪ{ˆ-¸{#ýÄNM©sgóå??~ ¦ðëÔº¤÷¿‡XêQCBª¶¨S€îÿ ­ ù¼šV©sR¹{•—„\¨ø-ïpk1ëî+NÆ=¥5ŽÇ¶äH^BÚЗh­v:ÛPM`,:kñØÿA\ƒå6âZz¸ÅB›˜måá—È4G&º°*è)x8­,ÅdÎ5°k¥}yoíÄ^ýflQóâŽað‰Ú ×â:n|I!tì'„Â^øZÓZűœ1Lz›T.tnYAH†G^ ñÛw⊌ëdn=|b×RRçB޵ TgZ¯[áºn ×–6H·0ëàÝih+ñ.‘s¿aî"DŸýR÷­>|®µ‚c”Qi›¡íS¦}MÓî'ÁÐû¾5ì>ŒBÅÜ «ÆfEîä÷éY 3ZJáhƒŸM¬dU –I‰?0È&ÄÕ²\‰&w§˜´\¸óÕ×pF¿µ £ï 5µ‚tØh>ýÌ„!« ϰH‡Òå4î’AÉl£ü5Þ¬w®wEï褋:ö™b †«ßöí0™/U2ËÑGËK{”)àtvUoB¾Qý.(a#Ô~à3ó—“ï{l×»zµ_¾ >©‚J͉hß½t3o}¯—¡í¿‡ pƒ%¯‹_Ÿ£ÃdSk¼C6 èä^}ÚÆÝß÷ÁÇTúÇ]9øÓχn«Å€ûÖÜÛ‹¿¾/Ó»büÄzõ¡ÎÆjôªV»`îO:,½Çqg˜º|Iâ§Œ¸@ŽÑa|¬|P’¾š‡È¡áªø~|faît{”øñÉ‚·@çÍ_½ò1ð[ ñW8ÇÔ¢?ó‰3âVa…&YŠ©»}r¢…Úœ®Á.Fö9!ÙU–v p÷¥ èÚZ¸¡`?!È4•÷Ëðž'¦ ä¤~!$Ÿc#²lOCû3úú%Ç}ØÕžÊl%?Е»LB| âÇ,…™F×Ü7Ò°•·]2™™ªñI3‡iOÞKH¨c7“ph-ùÚ¶ô#V&O<ªà!ºÄo´Š.ÅO#f“az¡w¸31ï%X^‘2ã€ñw¶W`ªû¬´ôÇéÏÖ² 8Ô|hOoltüÛƒä¯Ð–ã=‚›Èâ†m›ERÒ4ày³È êš*¯kRfxÒî‹g¶ ¦S²»Èm½m"Ó!å8Ì9Š[À·P*‡ÆAφ¹¥Z!tì'„mѧòc)ù2K½;ÄÆÁ!À®R-'ã¹ÒØ0“¥”¹.?÷4'/,Ô-½ÐðqC{µlY‘‘XRZ>hbf³NŽ­c´àú–2À›( )hÊ`•.é£T ÕT÷DBG6&Ú*¯G*`Ûh“8e}ð^"Ã…@¶¡Í]]§$°ýšËâ´,ÅEmGÕ…×þ'Vçp=ãÈùyמ¶zýìætö‘B¢:¯å#J¸OÜÃçšTZl#²*õ‘|öª\™?wx`èöÕUö,3Lñ¸ÊDîš7fÐôU·¾¤ .BèØO{2è–·j6ÛOHvÇFôõqÙä¯"›A‹ïsŽÛ ‚]Ú­bû ´}•OÌð±ÂK5FÂÄÃlõºu¨–žíñøN=Ôm²ZˆÿYüJ´‰ù)Ò9&„¸ÃC—/Y­í¢D2UîÀM\•žµ6IÞFq¨Á˜zij¬¿ØpÍq'²3Ò'”ÿaåq<$ðø~W'™·³l {ξ|˜‹kç`—Fáe'µ;@ >®çCU~Ãw凙ÛI– ±Sþñ»¯[Z“.ô2ŽF„Æb€~yq&ßGCB>œÓ­Ç»âßË\¸¡`?!œDHM3Q£œÃià'@/~gMQè…J8ï?ÙB}/GOýÜê2ÜZ\m% 3€_|¦V¼µä’(ꤚ‚ éÙ Ýj€Ã ËÖ/¢,2ŠŒ(¯ç5ø*Ž#F•±¡4c½‡£Ë×ø´1Ñs“w[È詹,‚.7q8±×^àùrÊ¢ÓcíLÇú4 ƒ¤ûê=YÒPÞ4x ¶i H|þ( ¿õ¼8¹rÞ´ê̗ͱ=øìŠ IÔc{âBoèè¸^U€^Üšo¼ýà—.èXz]sг–r2žs§N?vÃEû áÏÂ,ðʨ¤‡]Q¢5`݆?l¡¡l¡•‹3Y®¶U¨«_•Fî-CƒŽBY½°¹bîÅ |¶0/­®°BÁúÿd×KÆzë§Æ^ç*©Ò¿ÇaA<÷dt¶³XÓU™•.'°]IBõ¼’Gjóãðk®H‡,šc>sb¼ž¢¥*Hˆ:ù™œ€¥È8}3w`÷±K÷¦=|¯È‹V‡°¤Wú_p1·¿§®2õÔõ§/pÊ Ž;2´\ˆ¦ÂŸ­~qµIstŽ´ QíÓƒTÒf ¸œ‹¾°íº4¦i”Ì3½¨ .BèØOYÚ♆¨à˜]ölUCk`©§Æ¿ dWJ?Óú| /£7ç’,fÔ>Á{ÒÌSŸrÖŒ©ÿ㈀;»¯mÎ å06 ¨šªñ~jêyó-Vð0¥œúK"³·]túßObîî‚ÚBß-癬x†ãé±ñ¨*/6Õ7u¨ãy°J(x1T |çå¼ÂÓz‡[ Ôkb‹bƒ YéH¯2|\T†·”… µq9^Niƒªí]f¹`õ|Q-ºŸdí­C¯V”O4¯.û¯ÿ±V!3¥!$­íw¢‡˜ûwâq‚éVÁF>fʱ}O!tì'„ü, “<§¾ÌÚšð¶‹MkËó¢æÊ‘Œ54q( »‹Dïf§èÅÿöaž£ÍäÜß4³¼öçøVö^#S4 ë-Yß¼‡¥œD&2`²!’[¡í:²ÆT|›D—Œ=2¥s­:ݦŸŒÏ¡ñ+|^jý5­.äÐugêzDõÒÍa6…Ȉ‘ß=+^¼.³°æqÌ!$—¢áÅÍ{º¡«»¨=FrW1ž>ÌãÍ4×ôÎ1'Íš`«ÛFDnðpB'ÀnBx¿%Ï Jz–mlz94 ”µ¥„¢Mjá÷C·uÞÂKІhÿýˆÌ·[Sø§¸(‹ÞÅr ÊÛäLÄi:¥ið¶ßüùdÅø^FÍ×/éþxq@â•©vŠª+ÃtŽ*݇&³©¼5žSû1é„ý:ótýŒwpK/¬l;mõºr?Búi[W”Ã4†%°Í^·s– ­²-¥H+êù&= £?­”ةԊ¢žmW™½pJ"ç;ˆÏ)¢&âK`FÕÍrB'À>Bøl²TÄ!çaö~sUdÍpR:Us“è¹qü­‹8+îÈÁsL÷w püa˜øGÌôMÑU eCňúÌïjàoUçŸ{uucKÔÊäÐzMÿ¡ëúº]UÞzì¨$øçó_¬ŽÀœ­oÉÛ"Xö•›ñã6Š Î9vëÔS¯06Èä#Ö\7Uô>)Ñ®C舂ϛ œÍÇÝ=Uþ%ÆV]Þ«[ b¨£ò»!tì „Ê2ò§ŒuþÅù@ê:4¢„ø«“V>õ‡ëÅ›ÚäeMÅ(TÛóÃ^R&Vòô öCO~îz2BÈqÈLð9VÄ_ë]ƒ˜E™ÄÃöY^ràŽ§v?Ü• _?P-_ÖVýu(†ŸÌV¦§I98¢0U¬eÄYòò܉pŽ»ÄÔ6h‹©8 Lè?‰/zõ|(êt³}¦ó2§àq²€± ƒWªF¯u-”&SžFà Qþ#¬.X-ãaÄS­=yOR`m¬)…½URfùe¾ ê¥`YZú-×mkfèæ9ØÍG:!tl'„÷1ûd†IiF¨î%ÄÉ–º5¦¨êŸ¼  = QµaÁÞñpcŽÜªÍÝõÏŸºbh…›"¤v›¿vѰ€ýƒ„x½ç¸`¶ŽhÓ‘Áù€9wËòùV[‡g (zo` {ºè 2°ÒñîÈ•íèi?² µ²’[}PÂkÀ“ )Ù•½¦¼e(Y÷Î ²tžuuÔu€‡‹º5®Ò¸ë¢Ó»ëatZø¶ôýbN˜\ºŒ“¦ïµ;*2£46pbº˜%s–Ù$ϽÝÞÁŽ9Zµ9¯Šoøömè¹>b€Žê ×ï=·øö n" Î?í=÷7¡ÅÎe! 40N*IHmëyB| º€‹:6·èu× D6*½°¬Âá=qáæÃŒrPiñ‚##º û’Ii)ø;UW`ð‚¦¢.9£:dÅf£I iÝÕ³ë[ …xY©¨øz6‚/žÑZºÃ—6î@RëÝ`îÏ¿­ÿª,ST>•§°'¤‘SÂky`¸ZšDq ¶_™Ûø…\)3d>!Ì#¤þ£]}ÂÔZ›UòP5á`SUÛÒ‘¾LKH…ïI=E5bŸ:]a˜Ã[÷1|â2õÏ?‰œ™(ŽB/{Um/Ói£!߇ǣ-VÌÝdòL[Wn4µd%$Qmûö Ò|ó^KQ.¢‡Üs&Ó*$„£¸|£wÚÔ¼s¶÷‰ul-èú Ý„éá(çÂÃE› a'Âçk®Bt æt(ï6{”N»Î'YĘšËMf*°L©˜ \¤iŠŒt] AOäì—é©çœ Ä¿=”ý"W !½ðÝþˆÁ?ANrï)¸ÌE=m6£ª’˜xÊc” ‰ŠY„i1ÖØÞ˜ß¿å-Ï ¨KÇ¥x¬Ä“;´9ra÷ìH…¦ü*AåUSÅQMl)ˆ> öë[ʦ3À7êš ¹Ç%ä×q3¢"z.> þŠê^ÍŽFÕS)LSº¾žœ¦9S‹ ´E&Ÿ¦—>2w ³=‰—1]%ÿ]Kã°GG2c/!98n }ýв$n±œeÒ¢`…ôÕz‡ôš¶dZ¯üXàF<=kéOˆ&å B²Æ£q¸UEnR“â–O±΄"·ìÕ>¯Ì_ÁÁPx* 57 ßÛ—Óõ¥g›Qé_Œ¼«%¹!•½4ÚÈ÷‚ã^ãÜ+BV¶¡ÝÜÆ{Bõ¤o¶ùÓ-J¦+ÚlÉQª½ªàØ-‹X£k½]BHIƒ.à"„N€­„°%ðÌl“§˜Ôã^\ºHŽûAé(n¿ˆµí¡}çmœÓ#ë®G<Ç~ÈNȧªå/“µkñÝ–d6ž4¢;ž2ç2ÁÄ‚-í-<o¥ii.I8Ö#ùq:»â†Si¼¿­AY³`«uB?ûqæÆµ|îu R1ôŽ ?—–©.a!¼2ùo1v–DêQIØOZM“ûo½£),7LÜlXô*KºGÕ{Sç~LºÍ¨âUG:Ž…›øWÛ —ã5–éÊP¿¢2ÁøMßX{ɨÊôddŸ—a].JôÚ•ñf0dþÏÈüÀ}@¯ñtw›•G¥öÁŸ‰C0ס†Ä=‰öm0ÀKË 5p¼f–!tl$„‘¾„°JaçwàáDñ¬´_,c$³KEê(ŸQ/q,ÐXpjÄ'°í Ä붺±5!Õè‡-pêAŽm>Jl|4-—] êQ<ìöoùÛ¤MVÖÖ¶¦Z»S1Qrrën—âö¡I'? xíuŽ/~"f•'`φɹX­ª…D^©ñC9˜,$>Ë2 BYk•}tcTªZãi° S(-Kù@Z†i*5ÊáH¿˜®HÇæVEX q´~C©§ž¼¹õ $ÄéÅt{qX®Á}ån¿À‡X™ÑÁà ˆ™y÷QÃÇtR,eðhü¸›ÐD–Úâ; STìu÷b”ÒÖIK{ .§“ Î.¸¡`#!ÜIHÌÕ»ƒ®Îk?G–º‚/¼ßI`ì ª¤°¿ðÙ&•§gÏx×GW=aî …Ê)„üý¥ÒNÕ ?Ÿ?”¢ü¢i<7 Föm@qµEô° kíîÑl*šÁ?S9}ŸG†gKê¢=Ô¿Â ;ãÆWÀžªmíO¥WËÃc»Ï¥DY6à˜§¹™¡Ê»öÂ-ô+!Ü 6LqÜ3ˆº$Øb}¹¦º%F&gù‡Yüj„_¢æð…y©±Á‘Ðë@ÅtÜÄ0@T_†ŠÎ4ÏzÃ× AãŒé~ÓÝâ"€ ¥Â,á(¿U„¿@¤MV ß“ Y—'M‹š{™_âöðŸœý69ºeP¡Ñ J…j˪¶¦ÀZeqB'ÀFB8•&Ü»rëJÑKÜ2Br«,´~Á1—7ûuÿ6‘Ély7Å`^=‰$.[ç>„”)蟧R%B ñþkdPÍm^P’ØéoZpÅ~ÅhlF½‚®=͸jnH¾éÌïýÒ¼g£u3v¬ÕËg·³ «RptŠ+cõŠÚ±sãsÂÐ7¿Ã‘ÜÓÀ¼ Žèé)°EÏRk=å»!µ2H „n……—Ûµ³©Àsܲ•_„RâçÇî>ƒlôŠ'©|ÒBŒùDþV€¼TšÑ‰à·TèqtÖ¡yä;»Ñ¤²k7Ú@F[qm yÞìÓD~Ò\‡UŒ=¨.TòƒÊ¶ZXñ?òâ ûïXލlš,:óˆu]„Ð °‘ö#dÀ"T–Ê[« ›^¦ú»åó_ñÈðB²;°ïžè“•væû醄8-½Îk[k2#ÝDA¹} FÏf#jf}YC5ÎÂ.£µéì%$µÝ]Ú eš©ÍtÖݧê쨿•†cj™$‰Ë¦DáMÈUi6—× Š¸o6 i´pþ5!iÔ)û^¤Ññ€ÑGQÁŒ ÀbBjÚ7r»°Ÿ¨‘æ«÷´²…#žÝ@Ä´‘$ÑÀ7ü#AÆ+®4 ¬7 ‚`¯`5EŽ4ó°ÃO±¦ŠÌÎÖ õLº¼€çÓ[rK/Øýs ·Y]F‰_7¤M>vÝ«[Ñ’üHÖ€þq5 «Øæ"„N€„°!ýQ5Ÿc>ÎÅÊšE†”…™ç¸sÞší¶Ár÷ïßý›°Aæ \R‡?ÿœF4ÍW:ŸófŠGª!»9R™|'!´­˜8#™v_U¿7£ÜÄUhKÈ$më1B2([b°qdÈÉôÛ~I“ËÚnÄbNœ¦(“DP¿•ó˜a&WF¸½S°Sóïî IScŒÕ™Yêꦟk`+ žíˆ¬£HèÈ{©£MzÁq¿©AËáLB¼ÔìOGB‚p)ãÊhηˡœ¸Öñ¨Ie6ÂKð)d°‡¼2£„O•Ö”ØzØf2*ª~t´JèíJ#øš[?ɱ=pB'ÀFB8Jœˆl–ÝPÖŸ#4–Ç[ȶ9¤.c³üieÒ­¿Þ’©1q@>_n=}iÏWÔ›Ìó ý1ÖÌ¢LuŠù[ÊþÈ>é=Ì&7Ÿ2Èsqº^uI€Kì.hr®˜÷€)iŠ ¦;ÔøƒšåˆiŒChº )Í­o óÖÑÞ©„)ý̛ԗøXO䖺н­ ýÙâ-d„x„ò¤æt vÓɦƒîº$¯Nò¦ãY·WæÐ¾û¯^Ó^ÛàH1&k3h8½¦ü#,¢C%ú2#,&b«T¼/Û@jëhvô€¶ ê5ÊmÃÓj<ïJ ¤%Nl4SU‰‚_Ñ [êc$Kwì-ï¨ßo<9±¬!’âìj£¡pB'ÀFB8'€Y̪½[é$íóZŒÕ} [ÌQC«ƒôºÎèYÕ—‰‰§/V†ëß< ¥¥wðéá­!]áO1¢—âùꦨê4©ìouܬþªä9§Ü¨A¼¦w[D_c¹ÜÙ0ü=.n6zÉÒÖyêÓ‘ëñÌvb¡B%UmIП\„Ð °‘Rã‚,éÅB™mЗ $2n·:!ãg|(#÷vðö*Ô‘€<’¾^øLÔ‘zµ>ù ö77\9&‡·<öb-ÑþŠEAR¿y@tÝËe†å¬4fÒ!e“âR( i—{1ÕóÇr åÓÅð@RTö™„4’%d&ù¨Ûá~ØIÙïy„4C¿ë„òVðDñhÞ÷êÆ‰èUmßÀís­ô—û›f†µ\ñžøž°Mb,F?<êÈ?C¿6—QB¾a®µ`-k…ÙPEõËû›[Heå-Ž(•†TaöÊ™ˆÝéˆÅïPk/zØø¡ñô¤õÌ2“z6ýR÷k-þ[ ´\m%m}¡k Õ|¹¡`#!Œn2‹|ïL£˜Ÿ¾ò¨ÑrY%‰IiM#p÷i3Àç€Ú=øØ[/¡!>?qý«p‰Â¬CôÙü˜¯«y !™è=1\Æ«]T4Q‡ù¤PŽb"HËy/ÈÑ¿ÂÅä‰U1„»´ÒEꜿ®NÕyhGÈ„§ø‚šžu–±Ýq³¨ãõâ%÷ë,ÊEˆ•FºÂbQiîÀÓcçÀíB]¼K•ÿöyj½7‹ýƒEµ0 _ªJßÄŸEç&2”;»Á)T9ó5!ŸjO8IHüI­«’Î'©¹¯ŒÔe1˜"ºªfù.Š[¶ŸÔBo*˜N˜T="¿Ä\—ñÞŽ=¸9³r°I[ ç>ƒÓH¹¡`#!|ïFH:…CXx/É%ÅÔþžü§Ebe°¤Ãi¢ˆŠÉ›,ä\1 s¢’Œ&÷uFÙ:2µ3¨ž4ï¥fîs¿ÅþÅgÂIââ <ÐöÓAÕ†Æ|Iq1ØJü`g<:¦,pç~…ûüò‘ûPL•sr1ìhj? ˜w’b@vb{9wv|c’U‡)Ô“»“ƒ9>\"Ä[‡¥ð±:«ü}8´šB y_Lϸ–”ÀBPÒ»ŠèLÏúxX³J.0W(χ÷lÀ‡ý²´0ð|{jG%I$ ‚WEîÒ£i·²¼Ggtw%µû”m5o˜›ºÞøÅÝ ŠÖ˜ìŸÁßÚB®£4)¢èI'Y0ºº§Jôi¥¸¡`#!¤öéfÊÝa*?튌QÊ&˜~¯ºã#ÔEt¸ vÔ&$·hQ°œÙþý·[ºbª_š¿c³†äÙL…Ø¿Ä6ù¢n·vàKÚaaisÛËÐdñ•ĵ¯n³è5· d:(óε©#\Ja®£¯ú¼èÜŽäV0k f3¸¼Ì¶!Ãé‡i¢±ðY/6çܳµ… Ѥ^MæÕ|•wvä;w?!—¦Ns‡”~xù!©²&" ¾yü‘QùuÞsåÅÝÃch Ó4L>Q7Çpžªw.#5^•êÁxÁ“~[¨P-›q4ßkÏd[Ú¨àS—£…þ4}NEQ—Om:Ž„N&#\„Ð °‘~EgY/¹rôg6ó&kõã ©|¦Á‹ï i¿ì4ôG9b(.öï­‹'7qEfÐz@×YG1v¼ªsŒJ¿‹ á ŠLZÏ‘ö¦NެÛX¢4¦ï0I¬Põju—·®õ³oM.åä’ yA¼)÷>T•™U¢Žeõ²ÈLRlå‰ë¶gYÊÏ…¨Yè¢ÉΕ´x/Irè#6êêÏW €•uÔ±OB0Óý~;ëÌ…ŠÔ™ü{Ýb—,Û9W‹¯ƒˆúR.͹u{Óˆ§~­;ulÎkVPÏÞ?H–h ­ ­.¤å1iVkóÆÛj–ïÇÃÊð–Î4oF)ë›3á"„N€„°!!0£jŠv¡7CaB¢EA‡äÕ³.U„mx3.•8ùÍí®³Ja­‰Ôű%‘û:Ž#¤Ú†Øsá7ïé7¬ºDå-XG*‰b”@ùB›Ýeu¹ À0ú`«,8ý0ü⦓*¥×ÚOHfíÿc\(³!€Í¸ åc?1Pð ¨ÇÃXB|…l`ÀöeV S(ÇCtðá |HAçïØ:·£“ÓS#½Ê™ƒâôŠfî&ÁûÁO&fR•:ÇQA³ý4ÉçÈüÅhø—Í8]h3íÂÜ© ÖÃQXK8Íô–¶åÐé|¥dªu¯^›ÆT6`e©ºbÉ[å„>Ïkb=Ì2z¸œ; yŽóýx™Ðt>ºõ¿é1MmxnN„‹:¶Ô/‡sð󯀥;1 ínéÖà?,tš;hÜHN)ƒp½Ws–¶H^ýÑ4ÍàaaÿL=ÉÅÔÖ#rg—l°âÜs8¨&†Tjž)mÿï)«W»ÓpàΪmŘeM™#À+¥2~6ï!4“äW„ÔÁD(¯=ï9g\¸±ã8L]-lÞ&ºÅî4óžÛàÃá@̫ޒÂzÄYyŠZ€©’=Cù=zݪŠ6–t¿öàû@ø‚Ë®æ'ÄKgµÄä¥òßË5mB=‰)¨ö¬ë”ؤÂ@½Ø@Y •€èœ„| ?¸ Qy™¡z­°ê_€ôgâÓ„¦—q´YPk:FXä…„­Ê¨-ºÆ¹Xè/ÓÝŸa™Ò` bÞJYBtðýÐ’¤Í`+>Nj^¶t³±d̲.BèØH‡Ò#ª5O„xÑ,ßõ=øç[õ±“:­ ÜÛJ†Þ{îÆ<96žšFpG|‰Ìëx“&ð‰+™ ºPc 3uI-þéR¹`þò­v ÿ·*«ÔmAePÜqÂr—ù1ÝQ+²°ã’#Åš¯.!DËaaf‡1‡¨Rø¥…ꈆÚó,@\ªúc4šâF“¬½…ýÜó;Ž;Àç¢]Ì[.É8’¨÷ôLzÙfƒžb­'ÿÁVf)5ÿ°K—“­ÄÁ¬I'-|gBü”Ùaïdd’œ ›+äƒ)-/y¥fqºªÎ’¿9U^àæ)dâê)Vk‘˜átOá·Þé X0ÃKÕÝ6¥S å8Œè5ÿµZîÈš‹m”°p»Áõ€µ-Œ]äSr°«„à"„N€„p6õÙ"‹÷ŸASÎ’ŒªE~×ßÖ-C K¸ÒÃ§ ‚Þ%n¦vèMTðd´Èûo\ذ†ñú¤M·¦ŒSì¿8Ç„ã~"‹Õ/<> VIÙ}y„UUhØM¥ÔàŽ“¾ÓŒžX-0‰üUTÀDüÚÖ+$il³áª’ ä“ãè’(÷¹X¥k} G9˜·ÀX< ÷3 Ùú+¸µ5Ûgª wéSø ó£zSÆ]ž&m!lÍEl­°õöÇÎUóæ«Ñc›ƒ‚Ä…'³ÕVÿÛóüËòË7üÁsj:êó+ i-Uµa£ƒš#ÛëEALá#P®g¨"×ÒR¾MÕ° M0%šiMɤ@•k¼˜çßuW8÷`csÞ¹-µê³Bê5ÿÙ‡²„4ÿ\Õê'3C¤Y/»MøCÁp{ïv¨³„à"„N€„ð0`˜£×F™#¯Š3ÑS¬6•Šª(”£Ðs µÞuzø¸õó,°6¼ó ã^Ã>%Ÿ€·Ø‚ðœ-V—óÌ3>ø{~›ëc6B6D•s‰žë¹—:…õäX§˜ñnx§í¸÷1êæ²†¸,ËÊò^dE’÷¬¡ü¡1­ˆ®¨f4Ѓ󄦵a¹FÕ.ã÷”‹«¤ô@ø•,ÚOé‡!8çÑk% :[à…}÷ «ÇUD5w±ä6²ZµÎòßÎÖ‚o·t:LZÜY6¢mõ,¼gIêOmÊò\šú¥:MîUƒWã¤ÒËú4Žf ½²QztýƨԇÁ} ÑãÊ©cúê+ORhøÜº¼’!-ûÓQLƒvµ†x¼*™PXY’ÌÆf±üMVØL*_šô>²ÌÇ/í]àºAðcù¡{zò]'™Pè"„N€„0.3!³ØÇ7Nó¶’+0qîËó ÝCAl•ýãŠ]!3VäsR …Õ¬LO…tˆïŸ4Å~`›¾xÍíô„‘|GÏ› ‹ã6ìf]¤´­9R”Pp ˆpËV²|n„6cãN•ÇQb-aCñ€?‡j f ¿Ž7Yy×dȦr.“QÓŠÛB\숴ñÍÿвIJ|cáðÀµ¥)º–C§â+‘¹lÅ`å†ù‰ÊùèB¶½zïêÑ4?‡•)1yÜûëçõ.;ÂÄ­R‹?¦ú6d-²Ñxxš¦ÁÿÚÄ›Åô sþsLM_Cl±ÜÓ¹Pp±Ž[AÜ…Íá6b´$ûÇÂñƒ&ž;šM=Bµ••Ž_® "XdW‰é% Wuùn¬yØÈö­¾ìä£ìÀÔü¸åc(!™ ËÝçö8‚õº¢ËpØv‡õ+«Açuhᛨg€NÕeCà"„N€„_RzµãCBrÇ¡¼¼„×åGÎF–{€ýà ¯¢œÞ‘ô<òÑ@@Ë•—y„aa–±Õt¦Â`¢¡1‡WO>k}:V§.! ä¦3>ãRz'–ÝT œI¦ ýˆ1¿’3,O$¯Ô¡E§‘Lý…Y“CpÀÁ©ÛÐ_ÞØ÷¥÷Ì‘#­`ÛJL×ÑqUž©®¼ŽGz1L5~@Žáý0=ËrÞõ’®´eÕµ…¿y:‘/H•¥·mäS†ÅuÆ™F›Ë3^´îïO¥ùÀÿÌ8½÷&½ ¹ouÈ YXï7—Œué¦G”âërwQÎöTéþŒØå¸lÏú¯*KŽ.ÁÅ”ÄJÍzGÖè­¼ú1è3Ç}ïĉûîw—ad vÀ? )ÓžVìºî…¶ŸJl¦™ô¸ùeGWúÇÚ§¸/&š*cÑcPU³Ù0¸¡`+! PDô¡ø‰û؉®Ðöè(Þ’ê_¾´ßQüRvœþ-7^z}n>¥‰5£hõË,Ê-!ð[ãp˜ñæ¼ÁÙÂ*µiöIXåL„”ªÈOu“ÌÌ> –/*këé–ÇáAmýÄýðÚKsÙ––041áFV]k l>Dí.@­mAUnðÆ¼³PÍ•I–Eˆî11“”Á(s ñy :upäÉ’Ü6<ËKZ9úÿ2µiÉÐM§ègYØ[L¼éb¶”šŽ+3ªšÛÞKü ü( <¦´HBLMJã“÷ÐFkƇÍðø/Åõ“¨…×hZTqšæÈkp¤ÎšÍ®u0=Có¥½ï­çr•@4ä»üü¹÷{ª|>ÝjOÖZÐÙ˜é¶#™ZÈCyõjð"0‡6ídzî’k kãH`róª›%ØUûðá¹ÅÞêŠÓv:¶Ç²”l¾¹Kf§Úw+ifÑW:‚c´ˆ9iÖ¸‹:¶BêzÝV^}̲ªH8(ÅH ñ ó–µwŽ£QÔÚ"%ÿ@}â|gªWSÕRH9¢®¥áç2°é?ÇwéÇÈâ~'}¯À¶|yrÉX…/Hpµé‰ÑÁúÛµXHC¥ÍªC’äÚ´Qa“² ÖdUÚŠ©Ÿ„ÖÈ”"pçÐæ ­(—ué«Ï*•¬ôÙWÖàñ¤<}Bé †Ñ;“=•XÐIÕ\Õ•ŸsáÃQ°q>þõ³:Cˆ*Á+9U3“‡oæhok,«Ö}é0 R§ƒÒ„¬W5=†¼?§‘çLb:òðrªŸŠÊÉ>ym/(5‰Á¸ì@i½_ÇR̨Ûа·¤¬‹ s¢©1T1ôc •qš©œµYÆ`Ⱦ{׃Hî#·cÁ0¾´abÀóê+›°¬G5«N¶.BèØL-èRZœpá¨¯ÏÆôE{‰¿AŽÔ%©|œ¼ŽJ$JX3,@h«ŽOùB½Œ'T‚q—ÙôŸàW?Æ7ÆËPcP¢ÌGí:|EÞ/TnY_ ÷'¬kŒIk­éÅ$ËŸ‘¤ šÛ‘²ßßÇðëX´‘[ ;U›ç ¢â“nçƒgaŸ4ôŸÆ]$Wé'Q7𥴈žíÕ¨N”üe|æ} æ°i®’ßêN¶¬ýþj]Ë"™ý³—x(–æ‡ÒIzw^?ñ¼À‘ —íÛ~ã€]œí®7˜[ËsŒßõOÏšØqMd+è,Jc^¨ÎÈ÷›ØÈ‹¬¿(®ý‘¬0æÍ'$Ov°/¯ß®ò<‚êhe|òÉ‚òa妶KêÅSFò¼ùÎ%‰<> “ΣI•T®á.BèØL¹ˆÚ0{LVߊˆyôk/ä ƒÅ5òî§ÎõŠ—¬ßÝ1Gñ„fTºñMüiRç«>ã-0 ÒÔl,°eA<é•t?è tcÿ ©…1ßô#~ú6¨Sa>n&7Ÿ¢jÏôöH#S¿ÎFópì•ô!@¶^M:9Œ•Š'¥±Ñ …Xéâ åD¿Ì„xè ɯ.çƒì夤%[…Çþÿ Ô_¤tãJaLŒ]ˆ‰%¸}®ÔLÆ©z]]„À×W…(7‡Ž ñ*54ÀW*©kòT‡*ëT$zíÚ@Ç?‚—ãËÛbcu¾”£fz-Ñ#‚ûwÛ¼« !EÀ²>1O)š™å)zønQ^Q:E†¾–¼«ÿïá‘ýÞ;Êuóüåz՘ť¹è¦ÃÄ8â&ò­é lžV”Ô] '.V7boÓ?×v¸¡`;!äbz+' ]wî k§úzcüu\⇥ÚÎ5–ä¼ú§_e$Ö³‡Ú—¡"_}…äÆu”gâfê+&+åB¼¨ÓÊ-šRŸVŠ+*¼©—¢?hæÊ¾†™ûU=©²I´ÚWQêvüÊŽ;·qì)y‰â´c¼€GâgÙ !öŒÄq[‹ž&fubɸͺwÚRáó ȹR÷1¼½z;"ñ£Ôxvnßoç“&ÂQQF!ßF wˆ<â?áÂøâX?7c³µR®žïáùþí.VJÜHKHåŸ`«Çò¡"Q#TOacÉLÈFUÛU¹¯gals…¦ô­‡É,|<ÿ‡¼‰BÛ་áÖö_Øùíêƒè•Ã{c·‘_‰W´*Í‘OMTßc’ï#ÂÝ ã¿?Ä„Ga(ì}¢üÝï0H£µàòý1!¥”,úý̺) Ô(¬ë†U€?×v¸¡`!ä¸?dúÀ…:¼åãþB.–]f#wž¿°s uî«æI¥u¦®êlMÈ÷¶b[.RÑ’‡i7ñ;¸ÉÓσß|dæÈܰq‡ÁèÓ–‡‹*E›a<È  ;”q•ÿàhÜìOìEuÅmjª |ç2í{Q ÐDcmÎ)O-›H\–¶áÄ5Ehe‰A„æ‹ø V§ôªZ½7°//X.jm¾—¤Dá.MU’ægøþå¹›£yϨ-ù°º{YzLš‰xP–‡çoÚYÇ\c¡¾ò3ÓT c+ŸÂÒT0 ^lŠé2†Áê”¶?>½0ã']ÞÑí_i¨oÇ<º63¨”w_PŸåÖ—¶: "Ûþ¾BYêÔíGy© £Çá,e`ÉÈð¡fölüŽ·•—êü©±Yî~ˆ_:9©P²Å@7¶P®Ã£PÕ 9eÙü¹Ü¨Âë`=d/ð*ÍÀ=½}H>1Ù"c|ä2"Ç*Uo…3Ýfɼ=ß9S¦ã@,Ô«d¦†›Æü@íN#çVÚT€‹:öBÄÛQ’ Þ£?³¶¼AKxæ…ìËÃ)¨ú¯¡·êâÛ£šÉdKó]B»ø§Š—¤Ôöl;ž·^ÏýF0÷ô}dcƒFòA·Û°ð7)}È}Êóòßß6&*Àá³Yv%¹,ÚC1S-Œššó—ÌÆˆƒIínžô8Û¢t7yL¸‘2)ͪŽOV^’ç{Duψº¸û§?n&ybµ³XºÇÀoá\ÜýÍíð]·FÏy7Ó ‰4ÊýÔTáfÐ+Jd/Þ ×"YÃR E¹ß4Ñ“×7+RÛdÛɽ“.ð6G7Ä>Ô‰d˜ü„¥”©hÍþMa)wwˆÅ‰Å#»™(†¥œÐø~ °|m‘±‰ÈƸJ);÷*3Ïò6ã¶BpÒËÁbdým¬w!Ùôâ£`‹2;Ç]ΣX^>2RʧÇêP·®áêßÁ’e¯ÂúÚÈ\aV±3%üé©}› é€}7I>AcbÉÑèàF´a’7á DõÞ:^º;ÅÕyçØÆé'!t"„GƒÓ:-¦ü›í%*Ž¾Þ½m镚–*2Z02A *¢¹/½02»|Ú©ßYÎÂåŒÃ/ ‘Šh¹-ß³~Ê'lAúÈ—-Öí9lÁ‘Xî-ºí³²³"·}–×4>^^n(!Ë䣸Lñˆç[n×x¼ZÑŸ¡_é)VÄÈY…[x[­àMzÉSlÓ'ëek j#ñÙœ®¢.â_œ!UçºaÒm‘Sx‹Ž¹ 4bÑ eR¹­0óF-ÖÊ–‰LB ž2lmjÍ38nLɰÔ=r •Fä¡DÜ.ØyiÌœU@+Øop“3ËdôvK•½ ¥ UfÖe”°âd Á¹ä+¦pl#cg¦CÓ1ÑE Þ~ƒïþ¼vdMdwù’ý®(EÁàÆÒ.EóÂ$m~ò”qcÄÿä[²U¦+8UÅ"ì»Û3j”Gx§ÏÀ–p¡Öû‰!Rg¨HmÀ"¾žŽ×jÓˆ¯ˆÁQ¯uò Ž—X{†é5Õd®Êu½$ëöÄz°.Bè8BB’¾×Ïž]Úñ%ÒD·o9î[ø;D. Ð Ô{ãíD Ôo)«NpïèŽû\(¿_=Ú»fáºßžQg™¬§ðßæpч-Óz²•R=׈ÇG`/;©½Mò­ûAA1•ösV½²òp’çF^eÑqد”ž gd!¦vÎ$ ð¨&IåRM- t°³ñX’ÇcAøò&…2úç¬0â8u;ªžÀY¾mR6{î ­×¾Là GP ^×rŽ{ºaÖá³7½âbÑR5,ÑÓ€GòP!Zâ¦Ìré°Œ¡Úð4¤•õ@nU‡Ž#”ؤòÍ˸ ¦qܦˆhJ£ýÔáo´Ô»õaô€yÝ@RIú/äú ÉÐTˆCŽÓ{µG1?Îòry)ö‹z|‘à rçlBBþDÿþ´VÁÄQ•Kð•hX…¿BnýÃEŸSS‡^M«4ì4ó:Ö²ÔE ìe»ªÄŒðt÷d‘·ºÑçé6ö«/ëPªÜó/å(Vêk“ÓZá-ƒc óî/üË2¡ Í¡cgc ï„à"„N€„ðÌ5÷1ÅŠœ+Ö´åueì,þ’CaÒ­aFŽïÕ¸L†Ÿ†ýª2™73Ê1âæFÿ|qœ~é"Pùìó·ñÜ“R{<¨õó•ÍËû¬1´«*㤪â œòý¾¶ÖQ›;×Ô¯hÎ>/ùKÎ)p!—bì^ê²:ö» åûhŽjÉ>ú®[ã*º.¼ÜAMqóuowW¿_Ç€å&Çßú± ï¢éQg½³÷aœªê±`n¢?ô¶¯NT1#°c÷$$²õ'­Ëî!„²ý››åÄìMHà;®­p ¶®¦tÆjá{xg¿/R¿g{ØQ¯Œ‚ ªÖ¢súm®”wÓò3;ñ—Ôqk²‹]¦™Å£Ÿv.Qz¼ _ëó%èp¸?u­ªA4ÐSÀÌz±j–BÆ2 ß¼{¥søÊ(fÅäO¿ã€S  ^{í #¾õ|ß²ÉßîŒ?íÖ²úTö}^£ñQAr{0. Ô\„Ð °Ÿ>†…xPÖp ¤6à|ýÔ~Ýg`®m³¾ãZ°3hÔ[8_ûQ?é°—e$J´'º€]†¯àtgJ•|Á¡åúÓ2ºÜËÁòÂLÄ÷ë:”"ý)¶flÞw°¬¯Ì ³‘þ¦}"7m¨ DøvÓõØu'&üïIT^îc„¡Ž>ƒ÷ÜIyr,†ÑòÃŽÔ¤oS¥6 AÜGÃÚ8Ž!oÈÊçs&žÐ­˜6ºÅRAé¨ÿŽz+ꘗ|ж7°7—’[žÙÈÉ=MÛTj ”yF^}hA?•V6xþDŠ5·>­WUÊËxO‹?qCvÙó üV5{baíýˆŽt>DÿÚ«TÖ´AE;lÆ™G[Om'¤ì tZ›Èq¯èf¦C|Aç†v2é ¢ØÑõÏ eL›ã^z=Ä'àÄò”ãŽâ]QJÙ¾´pbú¡¯¸§éei–NÂÖ¤õÚýæPž“*4:¾ÄuÈäK¿]LEHª pžìûUÌbc ljpB'À~Bü­·¢vw–o žjª%!Ÿ[ßq# VšàCt}éDKhó)-‚>©"Ûj…^2¡E¨¹9³4ÿ32qõ~V.Àbв´+‚Z.òóBeùý(¾ vZ_i@{`ÁÕ¶þn’§±rñ(AJ·lBO uÁ{@BË íF%«;÷¦¹úÇëÿ:¸ª •-z:VUËO2>Å·êçõ¨‹aÚáÀ%NˆŠ4µ¢ŽÀ›~¨w´íxM'›ZÓz™N%¥"y !G••«.øP—ËŽ(±ý ÒÎ !Žðõ­0 Î³HÌ f}á ¬8ž"BQů‘Uò€Ÿ-5rA5! ²™6¸ ÝVÐ_5)ãp­¸½‚ã#S§¢Á–á_ôþùh±ÔóSU‹­5‰³1Ñç覎½¬ , ?ãÓ“æF{üºèËS•Ìö; ´mÑ}Üï0Ý>V‚É >¦3°pCkwýN©œ˜¥Aº9úª+´ˆVBt? 8‹ÓMz|[R‡ÿ·.BèØMoxhËü@'Óiͱ?f½\‚ÎæLÎxrE0·áÜÃ2–Q,:[íº…€:¬œNúõÊjh½q}eêñßó)* ýÿô¹Ãºc9éñ£áχ.ÇqÂàbfÀ&‘9¥æÎ| ìr¹=öH'f]ñÕ6°'…NêiÊñTùÍR25ݦhöžS—Lï‚=ÏÄè%èÜÙßñaÈð¦¾òM7x{9Ø.>S7(,—"׺#¸@…?µ+"ݬ)ž?9˜¼…šü$Œ€É‹+&„f–ù0S- \›õ™e¾¦g˜e÷Ã'ÄN ¾ï³½ßO_¬qMãÇוª+³-.ac%îc€"¶]*ESÒMÒó„u¶p' ÕŒÕ[ |ÎXåU:2r) O‰˜ïóë'l6v¥e ƒ%Uî[ôÛèè©6pùCRoÑLRµEthø–Ózdâ_)¼2ÓVä@s?£:,Ò¸¡`7!œ‚š§¤ä*–äa‰<ëMgHŸ¼ÿ¾8¥4š Ò5¢ŠßÐ}­&_.©†-¼¢¹˜ôS®ê-j Ù/Hê™(3 Ù± ºÜTâ@ø=6v!Óhžä^‚.!²ç0_2ê3Ûö =)‹’ºPYf·ï½XÊmÒ¨<½¢Y“ü:k4êãN–—ÙýŸnrÏhcÕùGÞ=ô±oδäÇP«l*»EЗ´*E~¾²qøœNªrü¼®0ÏKŽQ•Õü‹ò‚ÞU7=ý—§Ø&y¡Œ˜ LÆh \„Ð °—¾3ÑÐW^@k˜ÎÑE·+ÐAã‘ÊD—IKŽûœ_Õè—¿-Ÿ¾p':b¹étb rS„7M*,Q†ñ~F/³ VÚ-Ž‹åÏ5c´øC¼0ÝãÝ‹]µvLUJay#Íãá¤ß]þs÷ uQÚäÅR  ¼29ú²`²hOH-‡{n+=œ¡ 9¼Ûܱ<³X±)l5hÜ’ÔZwü´DÚ~ l(ºÎ{2+5oX>k+¾ÁÆ ž[”Õæ:Ж‰Yn•æ#ÉZ­®Žn7P𻍕‚ÒX Sn•ÀvÍ@Eí§ŠÖñ„´Ãš{XR½J‹ÝûYxÔnYD €»µõOôïT5î‚ÆŒ‰Y[ÕåêSË_æ½§ü)Ñ¢Ö`KÒŠÒ",¡0aÔHÑ.4€¾ñø·Êð 2õ€ÀØÐÝ#(L“ÅXÆ 'xÕÿÝPKÂOQ­]¹e㻈aM¯p{ÑJûòªœXŽ9äܤ€/宩¾ã”aP7U~­žÊÜÝõʱÙ!tì%„Wa-êhÜÒëÖöD—Ïo^¸|‡5ÂÔ~¦åÿî¥%ü·A,Î/MyZwo9£^"0Ë‘™‘M$WŸMëߺESüÞî}6.€ÿë×#*lˆÚѵÌë¬_­’“ÜqXˆ†üXKgyòÇeé­µ€"Þ~W—­¡\C’7»š ™ò)¼–@'l­…z)xÚœø\:„>tw>ìàe:™dóÈLÅ^rWÜà3luÎŒ®–ÈÛšzÂ`PÃ…&©„=³ª£5pÜ72h‘•ï ÓO«ñfâ?™Þ_.ÿMƒ†RÊû/‡I[ÖA³¢u)*ñ„ ã Óñ±r¹nÄP~¯^iÅHžœÝóûA8¶‰æOM$‡£õòŠa4Æ~V_ÑXœY–žø=”ʈA†Í!,u k»øØxÓ¢Y_ÒTSr»f ªö²Ë¿»–µŒ¬ôpw… R¯Å4ö¿Ä7ÃGÍÙü†Ù™|VVÖi=>ùÙKxl^«ù["¹Y&Ã¥+Äp–Èç.;¾ÀçÈu/ÀÜÒ Ëw€,1:1ÕQyÕ¬W¿Gûá"„N€½„ðn>vܛܴÑÓgaâðUVB$šíä„HxÒUlÚ°4µ"˜–{Ò”Ïões™o6Ù¸ÜëçQ®y8³Çµ+„VrS*o’¾p³.ì¸Å õŠ|Æíʦó›¹Ô¤ŸNë«“,K3É–HË$‰™³é0®ãU3Ùzõ^ÀÅÆíaòiž½Ê¸ú<-š+¯y¾”Õ§y Wž,öðÞË1mÇv¡HјÙFŒ¢‹° }B»'p*‘ ¨"[Eö1ÎÛ¡2ÌÄä¦j‹yù^ãÌòTé JK†Nýì&>ìêݰLXŽÝ0cÍaéÏL%A‰…êÜ' bÙÔQû‰n]!%ŽÃZÖ,Ö…ðž£9î¶°æ2/fúîû4㮉7€l‚É‘j:Kú©Ðum²>‘u?ÄýÒ—Û2wZFéì çT‰B©˜rR³¸žpGHÚvÃÅϸf¢¾ BøÁ~FR¾¡Ú3ÒÓÝ\L/pÀ>ãÀ.C]Ž»ã„ÇÜK˶v¿ª¾¬Áâ%ý )ÊaŒäŸŽG‘R¥*åbôÐt ãïEyÈ] +ò{ÔEò`Ãü2WÁkµ°28’Ò )ÊjÆFuLàÜ;¢œÄPV¬ý`6*ìU:Ìôü–÷¼JÌ3jÇé¾Ô¬Ô,‘Û±­n-dµhש¦nêOÄ!-×ϰöìÒ±_rÜٜʓò=±œ];,[Á*ýöÇ|l@Û­š€aEÊ™[f:•k_æ!Zä–2aï TüRä÷.; £Iÿ%4ïM¾S22v¥ Ê|Þ?çkÞtº‹ÂBŠQp'‘áôbÙÀoÏÆ.ÒóFqjTTÌÁJ‘"K*3(ŠŠQL©à…êU,‡Jå½5f•ùö㢂üY¦ò›Õº¡Ÿá&{ VÂE{ a\:Þ_ðäøÏëUiÙ+Õè¥Ód°,«n†Ù–àÞ\~U”<]_Ò&d*\ÏÎbùáÈÚ¯çl>gaügŽÔMU|³eü.£ŸHñÝ]|mÞMg®^?·/¤¶Žê _òWÈZ¶ÉèÅ3fo½m¯‘n^9¾nú é뎋[²å·ÞÌœ˜«FŒô•Â4|A¿Dm–j@äU*>v$b~†Ë©Õ— ©/ËŽ}5D&’–CÓá)3á3j(AÎ sE‘ …«9ü£…|Ñ ÿeñ/ì°›¤Qì +øâ_¸0{ùEÖzª¬þ ¼ª¬å{2w¿„Sl$‚Ý5P¨»‰¥mdy÷ö)˜‹R*>bœTïÉQ¸¡`wøD{dg?|-®/Ÿv·é+•ÿüḃjiüˆŠŒœ DÖ!¤ž·2{Û!”/1ÏîOšÑ^÷”²Ê¨!( ½'½»½cá俽î-üÔúè|öá_$”¸‹²åß´c,qæ[žZÀ—Ac ÇíðPäã1~$÷‚ÀÒ@™‹°¯v0:o–:ÎîJS;×A–"ÜPt¾|4óÈ‘™Œó WÌ/ø0 ¦ þº£!‹“., ‚aR@*jÄOÒÙLXÖæƒh&êð=›@:ÑãvâC9`FÄr×~Ê´êHÜ<>ÛðJyX„&æ‰}¹²¸GŸMÐr[8*Ö–ÆE-ài…Ó†2ÞqEA„„‰ÈÏø IfG¡Ðw £ÄDÂ4Ķš,`äÁÚ™=ëô&þ¹Ëò¡€˜ß¹ÆÒ(…Ú\äÖŽt~öD½JÆDÌT$8ñ1ª!¦2“ðz¨ŒÌúŒ”V[sMºó;pyuŒ§¶p³SµûT“È!ÐYEÒ=ó§ëîÇqO÷ôàÉL°\×¾•ïÖÄ“Øâ-Ìð¿ÖbMíV¼Üx±-e’‘ßúCk‘Ot`*&[¥ö/Æ0·xÿWÏ€ÈøÚ•p²ŒÛ¸XÔvâCÂÂ’òÄ_Y¨pÔ+á˜îÈ™µ å«>îUÇØŠ¸uE~ ý™Îúµ†\‹ÿD«ñ…ê1å ú£}„„pÔw*‹thuA-@ÈN±µ¯aÉeÊ`½I>à4¨®Þ\ËúôóIâÊ 7ɉæÝE“h“qÁÜ#äK„OÑ»KJ,õteá:àË2¯—OAïÁ7øèyÁká©3£Âî'igušÃnÌ'‡H"ªÌ?ý0|¬x”GÁújæbþÄåtˆ‹.ã}ø÷Øû0:òöÚ¦øl«Š4g´vå4ã×A쪲üø¼›æbJòu«kñe}#ZÐ߯4-užíïbH:Fò!8ÀÐ4Ç¿Uh&áìÚ¡ÝB|ó—9§Eúk*Ýè»õ½ƒ3%$•ðý<,w^D®"æü?$Ó—c†·îTòöe}7ù^°ß U†pB'ÀnB[Hô³ÒÌ/ÞyæðuÓò–ôcÜoye*=W›—Ö Œã~¤ån÷å—í¨¿¢'Ëgt¦Ÿ*༞fÔTúe á³Û #Tp“1˜°[KKÄ]‘»ÍÌ7ÝéJÖ¸H"$“Úû6Vÿx©ÜÜb=ùl?Zõ¨­À>…âÒo¶D™wãÝ9~Ëhš¸@2ɺ͢í£hâÕ÷‹±’ÞA?Ü…ˆ\jÑù£¹®ç:>D VWö ª»ö^ÂßìbZÞ€ø'Pˆ ímȼ¡ÊûKÊ.DW&$]'zG:¥ ìÆMjM é5µ¾rä•×wæ˼—½³R.¶i[b‰”&LÄ»Fô”iÞ½yzZÓ·¨A%5סøö ë‘`À¯"V@ kîãQYåI]Å%‹!ŽY% _ÈBtŠajÓ? ÈOiðà>–ìûœ; C­ÁæÙRÅ“ñšþ€}çÈõÙ[¼C¬á ª\›Ñ?(ËÎIMµ«ü¨«05qiBìd^ËÉôTç=¨vÂØ³ósy °ßaÞmI;ú¡¸IÛ]„Ð °?éö~ çÊ(ŸÑÕøž±çŽKÏ.üô9%B…Å}ù–"Cd®ÚnײyRQì¬$F¹‰ËŒ爧<=Œ)Htaê б˜  y³°M&•úÐb°Ø Åý5PLàzœ`g÷Äβ›Kóá ;I@yœ ï2Ä›ÍåMIŵó?“RÒ*j©^ã.xÒá+0_™\̶ªvú ùäÝã€M™·¯‘ÀÛ”™Ow¡ÍðàPö¹Bd©õ€‰!WãëÞ6t`Éh¿‡—‹¾ˆ¥×Ó‹ô¡cô_¼|#|T=д”:؇û‹-Ñú¬6àu[ùª0µxñø8óÒ*’¬ÍÃÝÿæÌ‚ÃmRv¾95ÝBXfÀ8)ZI¿ªÜfHÀg?Rÿ u¢`}Ä|'‹ *&¹C¿‡•XðMÜá!Õ ‡¢…/Žê;½nÃOK)·Ò°S‡ÚT¶ >ñ7ŠziûýŽjÙ«àÍê”;kÏrÅ,’ÙÿÿØûê8+ª÷á™{ïv°»,±K-ÝÒ ÒH (Ò]¢Ò(­‚(%!"‚”JK7"]‚twlÜóžç9çÌœ‰»¿—ïû|”½wîÌ™3gžótd)݃¾×­t,*Gg©n+ÙœéË”AÍõ*6×R[›rxf„û\ºœÖL3â@dº8ÚM´W‚îrÙ„rø4’Ns'}›…5H{úúìj˜XHa„o’Ï÷!Ù-ŸÙ€Íf‘ÃJ~ÍŒ% £(ïD+¥:Ê’˜7'6»—ˆ–jñq±*£STî­ü|M»Œ…}r~¼-–LƒømÛ{J½ ‚2{ ¨Á_Y”ÿmÁ{“EOloÓuù'§{ˆªIV‡gŽá›kÚ’µKGâZù¼‰°š¾8hµÍÉòÒ¡’Üän ßZÂÇØ»6¬Öj`²Zõ.RÑbW\¼®(Kq®ÇXGey…r@‡6Ⱥ†èÿq”vjC|d þK6ÐqKÑ?7(‚|‰DÝ‘§R¹(¼>ªû›ë] ØBß(¤¨+;yì¨w† ,ªßGÆÒ7{« ¹ÄQ…åOÞù˜I-³[l}à4—Œ/¼Ò‚¸Q4BS +öNu÷Õ=–Ržã!F¬•¦¢¾jÌ0‚Böª˜?(o®Ä6y<§>ŠˆiÛÿ&y©VOrzòàö]‡Í† ²Ñú¨ú!«;ñj8#ý÷œåásB5íuYjºžQLÒ}~™¹öµ4˜ýÀóÌùqôy§ÐÕ̆öþ處4ßdU*ÊΨ…Qܲ¿Òk$úƒ•5£^ä3ÃæÓ¿2 4œ¾ŸT L˜UõS°Q3O¿ÕŸ4Iuyõ=\ÕÕ:×¼v¾é`xú×[«[PA¤BãS ÉE 3lCä@€¸¾|²?í]3[—K|w!…¾H6#ÊjW”ÊÙ>Z ž0opÕÐM»©/¾Lw¨/³ögû ¢Ý2Ž{‰^iªñGІ„Ó<áïjÃe§Ÿ?>>«.3.b|Â~vÝz†9©eæ¿yýØ =¤$±Ü˜ˆCŽ©”j_‘Êv{QŸº%ôwÕ£•¦Ñs¶%.JE—ŒÁÏV@È`Ôü×ëßzl:°MUXº³#ô£ tý[ÈeÉ ŠË$ È3Œ¢ÚIj[ÿ ËN‘”Ḵ8œþb}PуèÝYä0¥êbB–ÒW¡ê¡ì©ï÷檰.¦wê…Ë:F¨NÙƒÞí§g:Æãetþ[°¦å¿ìû‹³[·{ÙVQX÷¦újð5}濹=á"Dèè :啲kWÍíEPëã–°{RE|{}fBô*ñ!ÝZ`÷È]£Û  ü>¾ÓI¿""å0ÜÑeö ˆH ˜` Ýaã• ¶>øÜW¿P´§\'›-Ï&ߌ9î\øwžav½°âͯ Dêë”m5=GeEg|ۨ؇Ô÷é®Q‡Q¾ ª”´5éÊ8ªaÞV'ƒ/•Ç2›å×Ð>Ѿ‰ˆ?d£^:ð@çÎÜ»@áù™k°p3 UÕŽoNLa„o’]YFå^8¡EA ‹Ô„Tà¸Ù~lG„*Êþñ¬¥ûfEÓÿ¾àˆu)µðFëPPQF[nW’Ù°’—©æ2[ɦ³9µHîtÌ&ÓÉ´çs óþHíÐ4Ó),jw£YFÏ%â¢Q­2FÀbÞÀ=Å´PÐâU4÷EqcªÑÊ8ÒêÅ®Î~(‚#\µ_£ç~Í:7é‡ _²À x3ø4•ïr}É« ÌYŽ¤È®GˆG€ÌoØé‡Aâ(þ#6‡9éòcáÐgÉ9‘Ü¥ºJª;"¸>'£ÓçZ;|SIž»¨Š Ú@Ið í¢„©ä°Ô5÷LàéKþ+~jàQBÙг¿‘lKèR˜ºÓUЛQl,ŠuN‚>ª’+wÕN+Ÿ¹Q´t¸ÑÉs€G§ZkŒ Ó“Ù½{QæwP`œ«ê¬˜XS= mÅÏ.'CSÔ¿¬,tU”wðî<“ý@3HxêŒ;â>cX ¶ð²Ë§gSÀms§ŠifŶÂáÑŠ%º NÑ Úæ1›LZÓÛ,"äü·½[0´–°5€K6ÙL-%ýSBnQ[óEJ}¼ö‹³ÀŒ¬êLJz¸´9hÞï'×:èºm¹½¯±”VHa„o’ËçÒ÷q Uã.,Û­ó§t[8—¶Ëvšs‡ì¥bZþ(Ö¼v “¨¡wqí.^õTŠV&£ÂE 3çPJ¬%XQ­ [&Ó{cVܼ{h&-ÎüQß Î°ô‘©MáâU5ÃqH T4ÝU¼ Àð!HI/¿’œ˜å÷-Ì -y¿7ÕU…A #| \F؉©OΓϗ4ç8]÷üÏZ6ž³Úî5Èö¢"àDVòݔ۟_Þ{øê+Hc‰³Ñ‘ÐÐ÷B,ê73±º»µ:âU£µIñ¹: þ˜‰Dí“ï7B‹kbÙføóÌÍ 3i–Ú8¤þ†©ýM×awZÓÎ(*ëöA!>b¿~.å¹ÄçëÑÜthN>óìÇIòÜE\¦/Âå>.[…£VrzÜA¾ä"Øu,‘x+B)§š¶É"Áœ)Y›sbÑänSÃ:˜®Ïà±BTÞq (¦˜ È~û›%6ªYöøU'Ã{w|M*¤(?{@m@ªµ}–†7ÕEG€(ªWÞâE$,¦3©N_ða.ГçX¼“¢†×üî’ûX7>ˆëÛõ¿Ín¯J…ñ%t†ö}4qS"¿»¯m¡âCGIk—Æ›H@Y1¿Ax;̓ØÚÆ\â‚øÅža Úsš\À ®ô?ÚÎË uûŸhñq¥~ÃÂGóÏ¢Oïâl7Wg«à[Aë* m˜¼%»wÜ Ö† [ݧëõûбÙÁQ¡ÑÎ{•ƒ –ß® ãRÌþãlÅ#ÌMþRZ!…¾H.#¬Á¤Í¦ %‡$©-©ìGwqåuÈ–PºÏÜç~µ]Z‰æî¼‚„ãè)ƒdNø  ½Ô{)¥(U¥VÌÐsóT£I(Rf—‘}7]½¾ãs?Ë4)ÿƒƒ^…Ú­~n.oÌ:S4ç.%TL A Ó´P64«U±JÓ[Òêª>Uô*øaWådà•ôÃLàŠé<ÆxÄ ±ðxM àóŸêE½zc¦uyãEж>›ýx‡%>4ŠùVŠ Ó±wÙ¹ÛžTé§¿©;õ ¿T¤ÕßË?÷ÍÊÌö`±4¯üuÊHSõ£ñ^Ó’’ã‹xâúÁT€c<_˜,øŠÍI6›¡/O´myÆ~OmÊsƒE+ j*×ÙoL’L¥¶^ã¾7ÖòøéXž|Po8YÂß$—¾«#Eû ÏçPÁV¢–ª†.ÜùÐÖØƒ\æQ5\€¯ÇŠîâ­¸e¸vÐQHb÷|Xˆ±Þ_ñ(pGÅ)[NïUË_ ©5<À‚´&H½Äš‡¡ƒk: £¼ÔF#ŽVçz2S–Ë8YñÜj¶²ùõǯÎ~û°ˆè^Hsö?~&o,œ±DM¦Ó†JŠwôæÉÃúúñ$ZuÃÁQß“S%ÙŒ,jc¼íú–“X¤e¥¿=t'ú⺞’º• Q o•BÚï¹ãß*Ë&¶Sc›Rq!tdr ½I]¹–¶Ó®D]ð€b̸ DxR ÕÍщé¡Pòá µ‚‰Å h”è8–« ÝäÌGŒ'AQí!Ûx*(¯x3á§5ÿêë) Zõ,Šõ—&UÍà­¤ÊÝam¢ep²#K%8ÝÏÞ©€¼†îC–âHë½õfH5Wìéck¿­vïgEÉÜ‚~ ùŠWÏ=Ä ”Ã#…Â:yu=Onjm.|1Ø»ê¢3äÒ/µ‘(Ãý C¶¾ú¡àøµRóQ{¢µ7z¼)¥Ñ#0aòxKoªäv #|+\FØM B¨/ÑS\ÖÍXMŠòûqðø ØM·Ú}¦6ļ ª&ZÀ‚í²TjXããœãtðŽªõDmŽçƒùâ–|£gjû¿‚%HMâ±ø«Ûú—40Àöžg˜ëM6|úÁ£{Õ£<>Oï÷å.FÓe9Á>ÎÔHàK*Æ×&E?¢=@tzK"܃»‰}‹Ò.&bÃ/£KĬ“×-—U0k¶ ÄdÕúEÜû˜>[ ô˰ä&y°¦9Ê©X{n$;=cb³ÛmKyüŸ@ìþ¥&,ÝŸèüD(ò7ÖêV¼ª6«Ôøã÷†q5*)õÀ¯Ìh^,MháFßÇ[f“ëäôuD–û|›˜âq8È?£š2š¾;uFîFaÆóå/‹Þ‰iM8¥ð›c)ûY[÷&ÐêrAҬç$R15­K)ãhe¿Å?¿B Xc›‘ü çœ_¾­¥ Ì^µ ¤é¸dÛþu“°a}®?ئ+/eXýĶ8Ü,«’tX*´«6Ì<¦#\«áæ†2âgmuô­çG­‡öÝñòfyÛÕË”¾:+\NÿOÍ_ë:]îÞÇ{[¼îàëRá[€ä2ÂÕ+ú ó§bÆÆíZ§,éÙÇgÐÔL ¸ß°ÇÚ3ØHR4‰u¶5XâÆËeÓ²üÉŽ¢zãkœf‘|oQñïùšöEÁ;˜}ílípú˪¡71{d£RÚݬX5@D׉t¼PæI(ÿÊÂYôH¨íæË?ñHÀèœZ‚e¼òæb:Í6£²Üw(`8(/Âm%ƒtÅkÜIî2GL°õ²‰v¥¸¡kU9©q…~‘š©},ë¤||ˆ‚øxõk £ì·öû_ûa”‰¼BBÔ©—ØŠc„\”jÙÔŠGó-(¿“¼bà ¿£)OWcÒiÖã}þ%·E  Ã¬ 8Ò³"ôàõ,÷¹v¼|(§$DŽŒw×»S×غ 5ëߤ²>+“¡ 5‡×´4ŸòÃV®Va[~t\¸Éýx~…l 4“\kÇ©DªÛ‡Ú˜‚·c ùLNŒÁÕ0äèíÀ7Vä_Š™-jWjÖ{å3rC àtþ,ºî«+ÿû]ûú•v™eJ\–æY‚"-G=ÙDê¨ßÂvôÒV•Ä¥`í)Gbæs6ïßxåkdi¦0·Ée„/¶Ôeï5¸¯‰hn á$±›‘#”|ÔUI‡Û Dî;TÓ8úïEÈ*žûæ«Ôíw³$z­Ž¤^ߊÇp_K(dz¹f5;Ð-¨lµ¼¨nË!‚OGì“W›Õ7€Öׯ1Z32kR">t–¢dd‹tWÅ ›KưC 7°LH^-Î h-ö©Ü® òOîÏÑÖœäØè~p ӱ—Q”»Ô-BêœãÃS§c‹ q%C°ºZç”Âå5p‘Õo¶‘Ã…utöá|3´Kt0{¬ájgê¨É&_Ã3¢aùxž,fñÓÿ•s+w›‹"ˆèv5™ÄhæCÐ7𶉒ƒ×BÙØK*/® ·8~»r v‘ý rIoÈ›WXR‹Ö’Lj»üÍý~Ë&µëÖ. O–&Q9qÌ[®øˆà/2Bã§ï€×ZÎzzm¿h«”NDÌ™^æäœL6/ŽåțݔX´Æç^ýbÿNW ø ùðHé;¶¸ï^Œ UdȰÜý¯ìBq´¿{ù6S-@ËkíRxW³åHb›“pc#¤0B3<^ýý Qó­ö—ÿ~£ðfn‘ìÊ2,—uuÃÝ›+扵KŒ‡9ÿ‡” ¼ŸÞ§ÛwÏ‚è@{Šá®©…5¼I3A'Ëg&ônh’»£„áÍ!¦óáWQ _¥ªU líþÓ …2w¯mv#Úz™ ²?=7ûb))_¢|#©‡Âá´G÷ÆÀ–TyËm§¦óèMw*)y›rYRá ŠK“¸„nšp¦iöUdà„„ÞßÏzÝQÅj0ýž>ª)Ð "û|xYi vÍdJv6ÐýŸ’3XY¨,Ö9ûE¾f4WÿÀ«‹{Î'©¨Ç$;C¹ïòD_N¹œŸ®Ú¹{õp´\Ö67áb‡uî¼o:¾¬9 {T«ÍzJ0{ƒ—Jy Êü…¥šü⪱æ|¬3kM!¤Á¨£óHŠ–Z?Ã3ƒ^? È.;sÕò{µ^ÔÁz÷ÚYüÐ z ¯(®w‚Y6üR"–éªPsoý±pÊÂßoîSU˜Lp7qiå̈¦À™ÁP¶—w“Zeº5”jÈó‡á5úŽéÌ?™šÄeË”xy ÐèɹmÑ«î¦̬GX0ðwwé:)®¿&&䟽xVKî›DÝØR¡þ~ËLU¶šôlPÄßÐl“Í·âÔxá!œWY˜:‡Éd~¦VIE¾ÚïF›¡²0ÿzì|Í{çßúLÌó‹ó1.x'eŽŽ›æy£Ÿ£æ€h–ÍRVÊ·|µªù#술ο°Hÿ‹_m#r-/ÏXž¡t¯·V´Ê­5§­OçÌçýUˆ¹/|´©(ÛHá §¢L”.)¬IÔ‡‡µ†ÛRÍa©C ëÄŒ’å䥥ž£E¬R‚¾_H+Süa©7_µÓþù²Š…†%.*ÁOHÚTÃ+K|& ¸Y–Š•[a]õlµÉOÙÐýÎ6’n9¼<Ò9i䉨%¸˜'–< ì³ ÏjuL¾K^íZ…VÆD']Þ}ÙÑôÆíãkœÛÅÌâs„õwo ç¦7È„ô@‘DX‰yиwÏ‘¸È8}œŠ’Q:õ.ð–Aèà%?ÿ “﨨Y5ë¾Ãp46ßR½€2ª¥?ûvÚˆ÷щòÀÛT…&DÖÚ<Áõï«Â²§ªÜÙPlØ1}³¡LBÀ¬/5†óò¹Ú Q¸Èí6Ãâ½ø ó,“Û†:…ÊÛOBèÊF»öÿ#d.#÷à::n¬q¨ˆå¼–°àSÆ¡¦òÙÿXù]=¡@ö;hSc(ßNp6sÇ801ߣŹmìS‡• Î‰«+r*ޝe›mú:yÿMn1ÍÓ@÷úá¡€Ÿ–µDú¤–}”看$¦ªŠ2ýØ‚Qý¾^ñŠ óþ-éh°ÙyÙû’z•–DD·€ñÆ È\%i(2gξ¶•±¤Bk‹ò«ª$árÀxˆÖ„Ì€©ß|HWr?‰¥:œ¾}u¹; ä³­¦k'­ÉUSÿOáBsIi˜èæR±e†ü„üöZ ‚uU©ÑÏsxCmNüICD‹ŒEe+BíŸzDÆmx«@*Š°Ð€(®œ ù².æ%´*­]õIe*þó™û-v#\´¥DÌ2ËzÖl™rævzÂëí0ï+xmÙCK2´š‚RQ*s]¸—‰ %°ï¾oL‰W†›ü ³´ÈTBÎÇݪ/§kcø€Ðf(*“@Ý€[} ¶nþgl.'CØ&ž6„‘izM `Åt¼ß <4q--Â%xQß°ü9/É?þO0BŒW²Þ¡$iâ!’÷†`'M jZîÖ†ÄE {ˆÃØMôv7z¥k3ggU̬ ^º `…4×ccÕf8 {PøJmk'¨P¼*a NR ¢ˆÌ&‚¾‚¹èÓ+y·¿áöÏíå6cÿ¢¢çfùâ›j ½4$H¾ŸrD”Â*¼‰¥5Ks¢á2 ú#Nµ“niú÷Ñã¼¼¹+¼ØH´‡ôEë¾Ê¤ë%–[¥çø>!õ,látéÖ”ahõ ¼ò˜~¾¡][j´DŸü}ñæ³±w¬ßgX}#°˜§†²åØO Âçç1‘Íþ¤ºòBUÏeInÓ7YÆ`Š£‚‡÷9ˉú¤¡r°· ï´ŽóVg%ÇSú[MElOâ‚Uïz1r ÃCT¶ÚÌc¶`_­þã6A/XnÄëâ?²Ku•©f =‚øÙy£ÀøªqRß#ˆO‚âQÐHmÅ}ƒRt©EZ,‰¹²ç4¿ÿF8bqµ ?ˆhIñ`ˆ¦TX ¡ÿÑ£Æû$ t°4ïZ:)óݸ}²Íjº¾ïB;1 Ç«²ý•!]É+3ŸÂ%¦}±"NI?þO0B–I®8 J:œ [ÃËdž‹\M¥£œ­»¢‘ÇU»Ç€¶e¥ýÚŒ·‰îÐÔmñHxÅ…~‰9±Ð]'Uûš§úPu{j!ÈOÄÏ1Û¾ëßyðÇG' XŽOClm ŠùCG¹Ñ‡v[¤•BÀ‘F^`~OT{•Æ4v,ŽÍ6Ãé¢vf;Í-~èK á3²´×ÏOaŽãŸì6é ×p OrÚ¤3@¥îa¦cßY\,ä åK™_lO6lšE &à3«CéÑ'é¡@*½¥7S‘6dœ†½–ˆ®¿¿N£{ /·À„±$îôw(£'.äöyF*™¹_ìXðÕ¤•¢êô'”„&Ž]÷¦8zÃxèq6«ãšùÅ<ƒ½)y•ÒR¡ëpµK.¾é¾·³=âFaIÃÿŸ`„•ÄÀfûIä<ª[ÝÔ‚Ì Ü¿¼ç ÆÉìçž‚êÇób²÷1núBQÿ•1ëÈk»qÏoÂÆ8G¼T+^¡;}âÎÝew x‰ÉÌïpòcü •áC˜ñþ ¸ät>\4Ø'2Vw½)^åZtn$zgùÓ—ŠFß©H¨šxóÒl ++¼eú`ÈKÙü¹lÕ þ<†É×›.ÌN×è‘éØ IÀå°† ƒ1€?âcý—â €‰ÒC)/±”©(Ö@ÚR%ñÁ¨?j¾0ȺÅ"Q]”æSbnõ,Ò*ØBt¨ð¡ÁRQ™Y‚Ÿã¯m$Nkïé *l]¤8ÙÏòè}`Z±–;LþÈ/}-½ïï’Æ„#οÑr‘ÍÏ“\Ø&Á•€[…š®B½0¹†å jLß{ýÒ¶ÌŽ Ž;ðÝgYdsGµžm=Œ ;Y–¡Å}+° ùY–ï11ýòzͤãtgx§Î[kò•»}´8˜ÌÓ4/(„ø}¤º"fÒÝT•„BÈí¹^" Ï™÷X‚"yÝ ¬¡ø' …æ¶&¸’6Â5p£of,'°çP4’$Þÿ Fø¹©¸¡ ½ùß/ ¨¸˜cÀÊC¹U%-˺K×i6rÀdö=ßPÜŒV F·&Šô4ÿÓZûèO„. –Ç3ExÅÎQÛð[&$GE°H …úÆUKP#þ¹¥ÆI`³â‡ûùã˜ÎBc®Œà›’±w‡5ÆRÄzßéM¢æt‚Gß=Ö¬üÖ¸IøõXp<™™Ôxmb:ÄÒŒnÜî!‘ß;j¡„ÂÄt¬’øÝd T‡½Q¥ð4¥ê¹ÎHþ…ö9ñeÐØ®#íW61v@I›ßSóÁ¸H9f!ÞÚîú†;a6d¨<ò zdQa*ÔÞбÜ$ÊÜ|ë‰ù¹¥Xõ†nV¾ûÝqš Vbë˜nÍÚX vÇ"ñO0#IÒ{º”ʉOª›ŽAÆ#Ë;öŠÇ;¡IÌ!ÙyùÖ"€%¨ëPT1ÃgLDÚ©¡£¢D‡¼¼€ÁJ"öáÇ‘ôÝ#GP<¨$ –U_­[ÆFþ= yL百ÉÇßC½ ¬ünšiuc9õDC #Ô£KFh_͡÷¬ûŸ`„ß)J1»Ú·Vð¢bµ)>áÊ!tHÍÅòܤp=Ø8áãxô†Kµ)ČᤂâfO³R ký¾ïÙÇ"®dà_w²¨)¥ÑãGQ6@¦¸qàÁܧAußË8Y·“Ä MøH;ûº¼Ãðy´\ôؼI3[¥eì=èíñ9[â¿r`åGô@€%†`>Kô”á¼V3¬§ëU¤dŽ:1ËË´šA›þ9ó×ïŠJ?mYñ ›Y EûÞdÙmªÚ§6&zü!7ÂðqTùÃrô¼ÂÚ À`hknnfJÖÌd¯h?¯‡ø!S*¯¥¯:þ¤›+Áµ´ƒ+lÖÀE±üG–¹àø†Ô"VœhuDz¥Z‡0µ£0ÿ÷XïZL4A©E*ÏYå<¹R_wQhª,U ½êù­Sv¶I;äªV.]¨li&CÊ % Ac³U§… šZW(‘È …yÚöšmVM†O™4°<Üׇyã[P.Íê>Å¥c%Y)6ìmÅ®:H0ñ‰ÏöwÙ´r/ÖÂÞs¼s¨fš)•ì3%´vÂ5¯`µA*¢‘’ÿ FHwª—ÉÕÍ ÉÖ^™4Œè\Îg}€o·ˆ„¡ìDHU^1¸D4ÁVøÉ…2U‘”bRv æèÝ›¨ 2=¥PÙM‰TÀ5éËRV•gƒ•×¥èkZêì,Oêá#ÓrôÒÆUž"<"Ï3ð€@xd„˜ ¥ê4òê=y8G=·k}>ƒ÷"0MÊØûopÁáÎî´ÎaÍ›>D—úžñÐn¼\؈KA·0Œå+ .ZÝ8“É;€®%2%1p@5¥.Y±5Á+o(Âfm€´底ÈQ¸õ/•O‡6Ƨp_ÛûÏ x2ÀfìÝÚ:>×Sf)ª²Ëq—àR9Ê¥”ûq#.XBÛÎó†%¬>jx‘„Ì/ZÂß/H£A¥=ù©8"a)¶W´J5|j3¸m«‚ d)¢R< ¤N·yÇ}+…Àçé½R)®ˆÒ£OB‰§èNõÝêÃ+Àâ ¾Õn‡æ›YÁæªn¾5°7õÛi«¸æyAiKˆê7w®`¢IFQ¯u¡TE…xô£ªVb–*à^€üíðL0>9*3kïF"Ò&Ážs¹›iKC}9·jFIseÄB #ÔœYSäÈú¾½™;%ŸƆ+öèk!ŒC0¸@,ÙKw€÷šêæ¹1)û7g£)jÎÓäÖƒ¨iöê° 7tnD©o¡zïæÅûdåëÚ ‡µ ƒÞ{ì£ÎëNÚC}uí¶-‰ƒ/Þió7œ-7Ös¬¥Jcã*`P“Ê[ŸA¢òDaP¤ôö.ºQZÈç?)DEÍÒ ÉûD‰ß­öœÊ6/céåDÁ£†âÞ«-ý§ÛNœÚ1©;3‘øTš²ïÌÚnQø( ­£›3ùÙàzßï®ôµYJºÉNIˆ“ª`Öú]ß§DI?z/)ÐWQÞ±(-TSè˜à•‡Mõ8Ȧ‘s)(–NŸÿûª*bVd»Ï•t6›×ÓÇ6Ð0ëþ üžQ* Ž¿©/.ØKýýeqzÍx÷–.lv¹?›@¥ÍK±€„`±Ù˜)ª<Ä7 ˜¸LLaBþ»mFƒ`üL¦²kèâ¼d˜<¿ƒw€FÀ\#ëäðqD–~ ·Æжª••3æjäa^Ù¢ñºW7ÀŠt Þá€mÔËFÎ੉p=¦jQx<Ø ÈĀ蛲ã`Õ&KŠKÅ€¸TÑÄØë1ˆo&>[C'IËgžá®)n{É`túõ§÷Ë(U–ð7g&‰¿#¹éi®f‹ÇÚ€M¼©{ñˆz3aJ¹¾‚fŒ 7,¤Ÿ+^…)ÏãcœKMY`ˆÜBÝh‡àŽHM*2ÐçAC™¥’¸–Lç"<»Ñqâ±–U¢²yr¢ÄR¡@Œ&š#€·"b-IŒp´’D&s’—é ‰!‡+Kc±ÝPcؘ7ë8²76 ÝÉø<»œˆÄù%µÑî±¢ˆSèÉC€¾ïÀ‡~ŠÒã8HþäUƒ•Œ=ŽÂæRÏrÈ“TiTOã7 ýn1¯j€äó¡Ÿ%+IT«ªƒ¢ßßé´ ¨|ø/èÌ^[LËVœàÒ2…Ýùî!I…mt^†"­hs*"Õ`«ú!¿K ³£¥¹Ê(ƒ+¾Ð/Ë ËËq$æ¸[¶ Z­Ú‚s‹Ónc°q¼V#X@ekºÃ#z‡ 6gzÂZÚ>æUï‡ 7Ïk ÔÕÏCɵÎB•lƒ¹¹!“þÀ­Ê"…l›B Ëeu€ £QyŸ€ü$°TÍqL‰X© q> KÐX‘æË{ä¹@sø» {ŒÀ­B½äÑÁ<þC«M=º‹ø1ÁÜðÒõz!NÇ— SôX ÓFcDÿŸm ‘`Ó¤³þ¤Ãg†;_cgz xébõ x37˜)¦å]m=|¾|ð¬Kì'Ñô¨–‹[Pñzª{„™Š€½Çç 9ËÞ¬òW#˜@Î “!N•KeY$(p‘èB¤0B ÖÀTkj_†pN’á.S…w äJx {š1¨³ y áóYßÅRšQÁÈ`[4Å^ahkHF`M–f`Ó¹ÚQ¨,ˆç&Š2ìþN(Œ>…ÜÃOaëiìi¡±¸bƒgèή—7Ì=nî¦Læ_$ðúä !zº/ÝÕU:ee¶ äs}¦“?Äùj±þõåÊn‘#ËÁÊ®!&XD…MBþ‰2Ý^i>1axêg ý@ÍȦ°ßîe~%ØÆ¶†!0!ï<_zô[€lmN¸ 6!ç1ñõÅF{Š¥Õ¨©/XcQÍr‰Ö»Ì„|€üøÀ13ÁHFÛ^Ã2Äø@S#œCk»h„t¿¿–v°ƒñ\rÛ ,$ãð#Tù¹·¢Â{âüÉöbKXù@@æxoDÔ ]@aÐ3¿H½L¢q3Bž®›0kËZÜ0zíJð·¥£cBÁl qéRÈ F%úCðƒP̪a HAnaâªå©kbj–ùÝ0,LÛ¬¥'»í9e/¨@J7¡¿µœÖ³ø›Á¹,ùÀ¨”<%îææS‰Êƒ3Bc:‡¶aÛ^¢ßîÿŒn)c§ñ\Šw8ìÞÞAטv39‰µ×:ÊÑ>þº¶Íqõ¯ö¢'1V;Z9 yþo¨ü&Ì8·@¡Äd‚SÉ¿¿ñÈ3 ”zm£Ô=µm7¢ãˆ¼ä4E#ç±LOÞœ?þš E´=a‰„h¥oæp]ë5Ùþ¾Ã>0ª]ĘÄià‡¹ؤi#¦þX8'qßøxÏqõÍÈ÷“W‰-äÈIbªÓ»re¯>؇_Å9çÆWš¢”Ũ-ÏC0b47l;×À…o6fg9oJrÉ“!ˆ‚ú3ÎÁG‘º~«?„Ú¿éÇØ"˜BäŒkí'2@ÛHÕÌu@…_í*ñ–ML^“ÿ¾ôs{ÁX{š‰J ¹ZH;Ha„@ᆦc¸?þOË@žÚlÒN²ZAdVC4øg1Žh3 H¹!Eõ`X0êErYXÊ L Ñ"ûæ*l‚kéöBâ )Àb„œ9Ì;~óƱ*†ü<^Ù¥\¦ÀÜÕ‡è"¢Ã‡ç_iÐdÁËÏŒ³×N†N¾äf¥+–CV ÏSòB1ë²Åº q¾«õ\§9ëÝ×~èÝ Ò×˾@E–” ;¬ü‚˜•W´ùª¸%Ö | Ę S0s3fLJ@4àˆk´ŠÇîÆSĹH5V÷vÀ"Ñß°³C™Lêž`šnWáÀ¼¼2w„ÒæŒJ9 ¢é圴cCaæu¢M SÎX`:?kHˆ§ƒO_½ìlo¯çaúŸ0Ù­ÑË1zP°ãcé¼Ô{ȉº^K†Á»ãt{§^ö•oŠ]åzØ=¼ ñ$",ü.Ü%n_۾В*:‚¯McÈƤqVGö1 7_Gºð²ÝÌÂÛ¶%s7{¢E&5”#ÿÞóüŒã´öíÁ60Þ@ϼM6¼¸"–ˆ‚ÄA #ÔàGº®‘&­:ÌT™Ð¬õ¿Áçh¥ó½m"3ÕŠV .`¹§_Ûh×1`úp¥”Àï‡Î +Õï0å ïi¨RÆø4˜[Œ Þ¤áº>¿Æj3¬‹°dµ nv›½öˆ„ŒÃtΨo¶Â«ÐØUŠ‹¢aIïeuÀJÄxuáÁC˜Ë ”]†¬xwݤT¶"õ?ŸQ…Ë6gsXQZPŒàtmÅ]†Ê!ZOW¬5Ë0"›ˆ[µÔ¼ð ×Y @Þ:M*"vNz‰¯Lµâ'LbÍŒ«ÓYÈžK4£]'y¥ÞS¯×Y€ð*Q™a&2‘ÃËPÓg6}…ûì®<Þ9™þª«ž'ÁLPMQÂ{=nYšô²þÎÜãxªÞh{ŒP ñ\÷¡cF~•[>,qƒr{!ƒÕÔCätE›ã؉™–MÒg=›ÈGv/ƒ¹ªŒ—,'?…Œ÷,‹ÐRTès[<Ö€0Àpò¼µá@Èz@È´6Õh¾$±Ü{ç ³LíV9+™·õ?úÖF>[ÿ0¸ÖSˆw,Ee*™¿Ð˜9•xHa„Ü…ÙÂ!Ž  `^úŸa„Š'ÿ¼Zv7a˜ Ä¿QA ÍlŽôšù_="Å@«6³ôWpàPýÑO(ïë§4'd¥á º}"­UšJ™ÌÞÍšt°Û%.ÃÈÙÎÌiQ¬Qê{ÿ’cp~ßžè*·Y†*Úsò Æ3\¬µ5<¡¿!KèºÝ6sôç\yyv>ƒ4§Ézëì"ýª_Ñ9äú ­}JÚŽkãbÜü¬z× Ï áE·òÒ&BÐ,ó›6)›ÌÝPayƒsìÇDO#^ˆKËb°>| {®ô9”»oPÔC*FL.ºªárÁÛTLJûø•â÷…6‹£Œ!–üa×71ÒæÐÄ5J1ãË® ©ˆMÑ¿ÑG¶ÂAUDþwséj­åÃ?“>kÙ¬ß7ûÍÉ*ö•4ðfû|ÿÔžz2â= ªÁ”$–GK‰FÁ9 >¬˜Tþ20ó,p—5§ ›Ïƺ¡æ‰µ&Ä|¦¢äìÙTzË"ÒݱÇ&ý žÊ­^yG½ n`ÁF+©Tžì A #ÔMLéÍŸÃÁºÿW!”pRÊ<ü¡ñR¶¡÷Ç«µ=8šÜ£Ÿ7t7mÊwŒý9™µôAÏÈ*úO7`ãP£j窽ŠÒŸ„l‡¯éžlÊ%ýZiß!í³oí[¬ž Ñ9oá8Pm«RÅʌ̆SKö„QO:mÛª0’³¸©ž‰ªË;èVgùºwÀÂkT±$©» ›3¦ßÐï—L Ûjåê4jÊÀ÷PÏ~WSˆæÑo“àn%è¬zÿèŸ{®nï[*£Ó';ÁMKÒõP35é/ü*>x)jÇaçµ¢l âà½g'ù$÷ÑkB;» /Ú¿¶Â‹"Æž©hFÏpÛxÒBO©;ñMh‰.‡£èÃnĈHsÄ´TèÛÓ…¬"·0¾…]ÜÀt®÷²Ã„‘%Œ_U9ÐcüùW÷†°ôª:%Í@»Í}…Ò×ÅĨوN÷u{'‹ÀŠ­í§Œ_Û£t ðŠæi…{ˆäèÏ ?'d)À9 W¦býÊÎ6 µÁ…º‡œ]Â$(YGÈUzÌ{îT4àݶÚP2L; Ód_àÀï;håÔL`tÅ:›ôÁpˆ:¬dï§Œ0eª¸&µv0ƒF¨ÃiDœö¿• ¢‘Zføååÿ#<ÁÐ2®£`µuÙyæaµ˜&äTo¾ è²L]'-ý®§ž[®]¿ï¶l¤¤3Lž6þkDB~«\'A`¨‹mÇeäX¶ B³1Žë5CºÄ‘YÐß¡ "AþHÕV=¬òŒ] &ŒüİýrXks!¬@Š“›mMgjø›ïÑ!*ôö µ ßÄ‘Lyݱ¸Q‡“Eý«àEw„½0ó:ÜÊ=" ÊitéxèL}×=¿‡i#éyÜf¹£5f'>8»ú»qó¶ˆü–%útqS`ÍÎÂC|ÉÈ-S9!DA©]8äX4ÇA/Ã7ëé Í•qŽ;™Ÿq˜IMaq8 ËçgžØ}—§%›ÏË{H“Ó]¿ÇÐO×< ý•y­rÔ¿U«¦¯zx7ůn~‰Ó G¬-nÅOé€SCGÁŠ2b¶Üԑ묹Š5nWCBöK0½]‡|VCn¡,qÁûd#‰WÁ?´‹*«&ø‘–Ôh9¯Þƒ€wÖ¹3è¬.ˆ>Aöé=ø¶ú÷éb¶¤íA@1œ›ÌlêD×£÷9Ð‰Š“ì,ôûC-/%×BθʲB¨KeV÷*°V×b)‰ŸY[£¸az’ …J0^[rÉßz“á_@ C^^ƒºƒ5Ó_K1Ùr+Œq—€eÀlgÚ¯ŸÚš(ÇUþ³ïŸÜæ²ÛP¨7ë°UÙÀŒªô/ý[á¥rÿ¯AàŸ Â>4;Y£@Œ™l°ü yLo*ѳôñ Ï J•’<{­>;Îuá\‡¶}³Lòhw[¤ù9äø±tœf¬Z– S¼¿E„Ù¦N¥¦=F­q/\Xäg™õ:Ú ´y-‚.Ô\}„Ç`^ê }]e4ýgŽÆg- G]_$»èõZ'.TdŸ{Ûðu¿`ާ¾¢Ô²`§J`77¯mô!â©^–$p¿²†áг¢¬TC"à8ˆ]jÉs7.ø¢Z ­16Y=¶±[‚”8kë!ÃÛ¢˜æb²%E3.meÚpã£OÞÃ}]>¶;xÛÇßpéʬÖi;·xtŽU#2†¦ÊJ/KU¾AU3|‚DxÏÁÄ¥4%5;LM ]áA@õ(më>âË^˜ä[ý}h½†C.¶cT^1Ü¥uùeѹüðk–q$‚ÅTî3aŸ»Ÿx›¡]‹’µ´ÑôÎÅ“ $k´áßù}%q¼5Üv|*×ïË™!ñ„ŠëOè‹«VXQ¦¬SqßΡÇO,pé%*JHcãªåÔVBÕ«òÊÿO Âçø‘¥.Ušõ_‰¹€Áß’äA #”Àý…XxÙµEêÿfîóŒ·Ò2Øœ8o-0Ú?ÇTcíªÝ%¨ $ú´êB —bCd ¯{‹©x ÓSW o­èÌã#ƒà¶Ý°ÿ&|ʉ‰d_QÚ»^^S|:µî4G)½FÕyN¥çýÂû;äªÊB6£þ½âY‡‹¢æ}òœ®”~4ˆ §ÛžÞÊùr®&Uû¶¹HîÎÓcÑó6ìøAeœN~ЬZÐ9l•‡pCADýÈÝ^òb1kÌM°©9ªMùëô?\¤j‘ÿ™@ÝHÐV!LµÖlFÍßÉDv2P‘vŽ(Udu£yÏ»ƒµÛaòa}Ù5äÞçÔ­÷jŸà’õ”²ŒfÆše9¶²£­å øû{kóÆ¢Õu÷!3lŸæhɈø’vÚïï’Ó&ü‡ôƒ£³†²Â¹)Zsœ.1« ðDßur"=W»7µ=#;ãhœ‘Wí¹f£?ì)޽¿Â{tÏ Ôìsb•À ؆ſ¿Kâþ›YALAæäjI»|KžÅË´õõŒ ¥JZ(¤¬ÅÇ}jÓc‘%“pžï. ô§«§”­&zÍ)ÜQèÌþ8Ã[ÉA~+?'˜™‡sìîî)|©äó~’KÙÝXZý,dag(¯*’L}0…šà'.QbÜêE–ÞÌ]^‡‚.ÅJNiÅ©Íük|žÎ½"V¶˜Põ¨ Šõ;ø#Ù[è“Y‚§HO‰#­ džÜË¡Sõf*,ð[v°ªfô¥›O>ãU@£¯öhq«Û¸×³Åßb»|šÖ ÷%°•4¦L"Í%ù›èF…Þ1«¯w‰ˆU8N¨ül 0Ê´É!UÏä𕇲,Õ×g7Ë ¤-¤¦-xrEfLÍdzSÒ_ð•ïßÍKß›³4O$B¥b>@†_O®Û(¾0EëI 9ƒ…°wÊjm%øP©\žYK2|cùõå§ Æ¾O<ç›àWÙêçk£,W”¥æcÏ×t¨'Sk Îá±³z - .ˆÀQ7c™«j† f•æ@Ç ì¥}õy"‰1¨ö|y+äƒ^É«LíÑ‚>Ô*Õ­ÖÇ‚úÇ6Ǥ:„fÿ¤Z²›¾Õt»ô‡?™Ó`ê¡6¾Y\ªÓ'}ß—±šŒžz1_ÐsKa ‡#ÁÌÇiCØ×ð“u²¢Oûˆ»!tÉ ¸3¤@.[C0®zØœXr+3U_ºÑ[F“Wæ–Žl ™4åcxa #`aÃÄkõ¯l´D KÈ5¯*§-Ä“œ¼Ðþ`*þH–ÚJæN*¤0B#<^cN{­pi¿™›$“þ»~þ”E€“.´ ¹=h"Oâ4f‹‹Ç°¦ avn8^diýG¯LÅ5shsXÉLÊ÷§ñ§ìw 9;gå^ ÇÊ×h‘ž·O_ÖƒÛ³{ gÛ!Kç1“?¯ÍÔÁHs'# a6{‹e Ui5í9D&ÿcªqæ>N9P&¹‚ñ*J·²CIX;µÄçÓkejSgPቇЙxÜZQŠá3ÿ»d`Ÿ™“Ç£EplþѦ¬Fh¡‚E<>f¾‹µpæ* 3’øŽOÖ“¦T«S±ŒRÁ€‘}飬ø…×Od—<…•}Q Wù(—ý§o3o"v7´Àp|¸ øP,k]]/IßûªqÉlEŒË™M¯…t–*‘¿ÐUÁBËfëÒaÈT©il¾Ìµ:ô¿¥>km”‡Àr=FMRœY÷T{÷·¼†¿Ž•4aÛŠ÷:=;ì$h1ÐÈBâ«Á»„Dç¦ÜÅP°î.½K£õÀz¶AspíÕ7úS?¼Bbùý³­&YB>5õ5Éc9[)oX¨ ¿Õ^¤³ÿ }«à2ý«É޽äF9~BèûÅØ²n-ãà#”ý ö;ªa—ó=ˆÅì°7»Ç`þ§ã†¶.¿€Œ`ï­Iä¯îL¤ÏþI‚eËãFhû;æOÚ`:æ>2¤2ÐÎ7s‡ä0‡c¤|Z_,d[Þ}4`xl*ØEí]÷me@­ˆóW;y¾—µGÃT½1h䨈{“¼n÷µò·xéî磳óï>µv’åìcÈmB®~Se¼œñ„©1ë©ÇŸ}­ež@YáÆRK÷(:fØè`0`ŒxºÕ~ þgèl·â‹Vå Õ뱨ÜÕ "9¤•u6™Fu¢ØrÊ•ªrÙ) «áSŒ3NþäÒŸðÌùre.ŽÅw¢_R8Ì”ð›|í)”ß{š‚Øý0K®È:êÇõàê„÷Yòî?t™‹²j —òi‹º:þû% â˜øî—¯J>†CŸÄ&|‘¤fM±;'Úîó©û˜›ñ4·cè°ÕXG»¹¹`iETÛ¥V»tõÒî²Åh—í's¦úsuE™ÚØîB ªpw+x6¢@(aü†ï1ÈSÒ½ ¤{ ~]—©Ýé ­ßoœa .Þ/ù”‘=ûÍ%‘âsîÏWU:žÄÓØnâkû³BÌ‹{òù»'PæÄ/qí©yþ¢Ød3sÏzcM`(ê“„¨h.…]SpÀ(‘+àÎŒNF°¶¢ùö‰ƒ§’¶Ñ, î›'\D#QtF7Á” ë /ðž©i¶Z¬¥Ð(Šb®5­D\sÓ vÍZ÷û„~mÉFiíH‡ª¾ƒU=œÚ"L2¡n{ƒ^ªµ ¯t­OÒúÔ«ßÚ°¡ô|±ý‚Ü¢˜ÑPû]+µðìɈkOÞ9öÓ°&AYLPS”N_xt#£öiŠª£ßÓûµŒë’38õCC~ÖBµû½¹’´2¯0Ø&GUúbsšbøe/™O/mʾõ6`E\%ëVˆ×üƒ¾¢_ôwžÔ®Ã Á9Á<Ûªäó«½ÔVh/iºBêÌHcC B~„§ h:õ×ß1›vqc#߇ޘÛWŸh NcL _ vÅ.æG˜c¶¥x?þHQ*›ß ò\ÁA@¡™M—Øi½O3€aÞ|fi›_•]¸kPª!NÅÍf1¥¢HË+"ò¦mPDðEÊ«n²ÅqúÃí#¯ýŒs:«h™¶¬‘U'– æü±›úäyqJöÞ¯hæÊ¥mW"WM] ã*`—k()¾ÁhÍu‚F5R,sšæ{ç£z|_ä”=nÆ^ÛŠwÆ·‹pÉ8û’ÄŽ®/a÷¦KB¤ô²tÆ9æÝ½\úÖðC¥¹T£˶ýVe6îoÐ0Ê z~C6´OÝÙ/>ÝÐgrµ—1$à‹‡{ƒõÞuì$0¿}Æ ƒ +`0KÏf²KãdÞi³M¸.ù9oÙnÐß|èýòÞ ž~DŠ JXFQj^õ·ô³DszŸ—: 9Ë›ûÓävö;u˜y0Ž+æ•zšŠ{9Xmqƒ‚A†‡`e¬O…@%8ÔŒê(J‹ù ôAQ%ã^´,·‡/a—Øÿ º\÷<¹5ÂWÞ’ôÑÔ_Áö…½jömZ)<¹É* Q¹ Ç«Š%býKÑJÞRrvù;¼ÁímóvQE†‰ÁótþO|ñ‡F ¥© ©ZWB#S`%óÔ8˜LËeüðlïòËv'§Â¿Ñ<|Quz‡¨ˆ¯Š‘ç¬}µ`œÃôy#D®á}ú¢+JTïYF Ìÿ—?nDÄà ÏAþ+ô\¹ª²ÜL,d†¾`ᡈÐC™öª£‰[’C‰\;Æ+JëRµÐJêÄx¾ ¿ÏsQŽÈ•ô_¡WØ•ÂF®§ºBÓjÒjÅüim2àŸ¹ä9<]}û{;rÖ*o0GàNôßjËìbxßbôM“ëŒ4šQĉ@ÞªE/£ë^œ ÿ””Î)cÛç3©Âß$‘B¸03¦»ŠÙRp“~æÛ×ð5tÀú#{~^yp=Eæp ÎJ»±]_)/s$¹=xHø–~gÒ–~ª{g?Ú^Åþ¼£rÛì'7WE,Äô;7ŠÏ'Ršƒo°ú¦?0YÛF'ÜÇÕ>ñóÆÖ˜ÇÈËtÝžY7“¯˜£åÏ̳Ô^W÷<™a|²kš¯+§‹ÅFYÉ)X…JÑe\dŒÒ/ªÓ§ Q¼BóÖšPõk¸­ÊŒc¿øD)Çr7•‹‡‹“¾§åw¨k_¬'<±™ ƒûТoGN]iíG˜4¸µhèGïõþfoœ1hů¨„ÀŽ–,{ÀM™VèíRªËùƒÂü |‰¾¢MWúÎþÅœ5FÒ«)ñAø âöÜ%´2±îœXÞ‚"ž! }'!3x× ñxEÞ¢Ð茈GQåjj ²¸ŸÅÏ ‹t±µ£¯›ÿÃìò5RÃÏ£èÄWòSŸyCq‚›ñØfG‹4>ÏÒ…Ž‡ g»»ºÝË#·^áкlÚç‘Ðý4þÑ?‘†#®…”ÿMW´+|2$$Í’?{uÔP Sá[€$2B0PÂFÍ4ýL¾ù0@€ÌÙ@ü«`+Ù: wì÷(ˆùä®\íö¶Ðf5¿‰À»ÁDÀóÑ&dp¬¬5Ñãö6ÜìeÊ•ÜÆŸo&|É÷˜+lÖTî^(^ŸÇ“¿¶,ÉK$¸7•ù±Dˆ}‘éÇLCÌaëˆÔ@-$‡¦Ð"4(%HbEÓ¶™®§c6ÛC¢íâ½wÙ.a0JåX¯™ô3~ZY”Tá‹Í*ðû~ymYŠÙú0èÎ~L%ß3‹^íË ª£ìÌÄj·6°^+aÞWÊ0ÐÁ—£Ã°¹ôÚe!k·»OPá)ÅëÜ7gÖX$`?S’Ϭ¾g7¨¶0Îmñ&¶gà!­Xf—s ²æJè’ì Ó2ZßF÷Bí“rAš²–Öñ-扩E³ˆV@n ¼ðÙÕ÷õœ¿²&`ié¯÷ƒävQ˜1“VbæÏói}ˆÙŸŽ¬ ±jTAþ(ÍBçqŽ3c(rÒ”U|þ2ˆdûÊrú43\Î’ø¡(šæÐ~7J÷Ó£`ææ5µß•4ïƒn¶»ÁÚí½:­`WI ü7û±¬¾Ó²v¥*éõW”þ<Ïȧ 9|”Œ¼bq¤Xÿ¥Ë·ŸV5…¦SÇ$ñ»Ÿ2Šïï±Yvr,è&1¬©k@N[·¤ #Å¥TŠIýjƒô<ï˜3î’ Wá±3~¹Ìîƒ]Í)¡Ùï%4ƒ= ¼ ^ÒMø9+YŒXè •iÒß_åx~g A RSçÐÙãBnÓ77Eñùí¼_}uý5œ” jq‹Xð|O^Xv¹¾-&á:·?9dñ“hŠÅQÆë2öL]O\÷(Ð,#—ûyÿ ‹©úXb’6É]„ ÆM£t]¦r¤ßUY\Û?\ô¯€´Ç»²ØV‰í j^¤üÅé?·ŒW2˹øû)zçb.}=;PÊFćàƒyŠÁͬùÙi˜ZæÕ>Ó'fØÏ2˜|«¶±ÓùCøóÞ§Z}É×5€¤0·Ib„,j0øyÖ›½G1ÝÑ•—I¶!šcìg2?Žˆw„}ó$}MÛÖ¢ )W³&Ëg–§jÝPk 9ûÚpB<Ñ qdW5À˜³âd3Q—6 Bsþy{¦qr…IÉ÷ÉÕ¿V.Þ|B8ÙÀ¨’öVÁíüH4SЊ='¶jœ]¥E„ZwïÌe"è°ãúIt%§“óP¡`b. ó)~–Îìqƒµ/+ݪA·¡‚Ò’»pàâÁw¥Aʘé¦ý!öCñzH¢¹q-ÜÞê-“¤‰î[ÿì9ýˆÅT.ÛÿÏÉéý\^Á9¿{SVQÊþáÅuÓ¬Í/È9K\²fd]ŒXõ?œ˜aþ£Z—/¨o‡+Hó÷6?b=<ù å{Ÿý (¥AËè»ëÙó6 6v>Ùé„Ð)µõ—#䛽–.Zä·v+h%“&Š2æB)u^Žª©NAÆh5hd‚y;PÓÖSëöׄ3‡ŽëKsMN—ñyl^9ˆŽUòøI Eý ‡C…DI1ô%}.=ùâúfŽÐ_Ǧµ³ÈVö.o„-tr£Ë'¦YcÌ)‰¼rÓÀrmº¾ûÅtÀ ·gU›Ñ(zî’Ž8·CŒ®·E`qñÎ'ûé­’ÓÊ!…¾H#üwÖà¸yR°Ó,™+¥[UÈš·”ºÊ›Ð~g'PºïwëùºÊWæ7Ž‘m*Žnû.SÜ~º¿;ì+Ô7"ñ¤F©€¢·f÷kݬݠúº%W@ÚÙQ•ß~,Êo„it1xÇ ºH³€JÀD›ðêW]Y¥÷éá#Ñ([Öœ})†ÜÛÒ[¨ i+Œ²)µÔÑÖEÃÖ ë†Jby7Û-ÕëI õœ#pfûBâ_áìØAÈß0cmFkÅK[óœƒ%õÌ›óê}¾xÃ6Þ3,CgÆ e=Ë÷ù×Bˆðªø{ÒP†`’þ•I`NÞªjÜÖߦVšñæó4¬xש¡åñšfüàxöHŠ“X­Ö®7Éùi€ÓjY¹ƒ‘Zj<•Öþ¥£k7´%L=(žeʶìfVØÆC_L%âÖ¬™ SCQo ŸoÎ+« 9g-|–Ö(¯‡«  6üyÿ›À œÇÄÊ| ;Ù‹YxüXw)PÄrÞe¯ˆ«½êý°ýìÎ-5ÑQå¿ê%Þ?P”TnÎÍF* Ué sÄO WáÉp«}Ã*AÿVÒQ»Þ¼Ø&th¢•U8MÃDÏœ¡5 ͹—¶r¡ïÐŒ×} Ha„o’Äçá+ßɲxé33;‘Aöòè…³‡¢XÍ3T\•‹²ÉÌê(¿ó ãeX©“}ÄRËnMB[2µmµâÕÛOýF/iâ«©%ŒÊwdäèì§ï0žKajÀ™)ˆÕyW_²d~©Í/Ñ1ÁͰ“ÄðêNó†­wŠg«Fön×ï«í,Цƒ]`‘?޻лò1W‡¬ÚÓÖÂ.|«pŠýêMÙ^ØmBèb­#L'†%q~l^³æÑKÍEøéx²S/[mF 勬‰Ë¦©«ñè5éW¾9}\õ‡Ø% À Ѽ ^Àœ³%< Ô…’Xm²6L]½ÃV9u‹ùá4½8*ßϨ„…$œsöVâìÊQt·*éÌV3oê \•>§rR÷Í ¾d–ìËdGÇHÛ"A¶G±“'¡» ûùPԈСƒD:ªV /L ô“='l-®~(’½9Jg»0JQfBORÅU„-ôkðò‡×¿ð<` àóLÎò‰Ÿ–A_F†'â-ù¡Ã‡úv7ýÔ˜‰ž¼„ˆ’ÕèIý§¤8K«œñþuô’ÙèE@ #| $FÍ”pvgE )DÑ3ªÓ×bQø/¬©£çCt•è囀n{3Z (ƒEYúŠ!…Š# üµ>†±ùј¦µ“1}©Þäy¦„-k°^|‘2[©ysÖád42èîFÀ‡€{+]T"€–žëÁ h¢(ïPö¼’^ŸvZÜÓaà‚ bÂOü +'Ù“…D+C uö~Â^š²ÐVcô˜-¨—yç"ô0¥ÑþQº óPz^nÆtY•›;XÄ CJªqì×fÿ™“eáó)ö±fé´à¨ëÅl~F¨Ì“”i¡fïnlC(S#¾yœ²’ù&!’(™bkž3X¦R,™ÿ=Ô„)¾zO=<Š}p¥* nºAš„Q ‰¾…ë¡ìÃZÞ%1Ðé®þŒ7eÁÂQ» ß÷\\Ð÷;íÖ †Üèè´¡9Cf®xIÇð _&Rá[€$1Bì¨DlgL·x5ÞªƧT6°ç]ÓIÿ:‘Ë +Æ$€G#§õ y¨˜ï­}×J;¬ÖRÜ-!úêŽ]X•w!_¦óÍŒ·»w¥F 4òïhŽ»ý#ç¼W±Œ,èíyãëw1²Ï3׫¾.©ÁoTzt„XÝ! nÔXãä%Qõ…Uù¦³‹dL³«v¾>-„F¿¹=XzSì¢gˆü ì˜A—4£½Ê–áñ$¬¬öºEö¯5£éJ-¸E.Џ:Ÿ9ÓšóbÆÅc­Ldã’ *ÓÉ$Ï©6\nÊzæÍzÈ…xáyêÏ·Sy‘™W ³c(Ç’¬ù;ñÅ>:ëXŽ|”Q€ü–øÊôúÞ#/mé/¬c9¹¦<¾Ð•øfž=æš«ƒž ôY€`tLÚX ‹IGfá«ðÒX€˜\®KϱúCVÛ Û^ƒrtæÀ){ÚHGå]þi(ÇŸ½`()U-xþâQÚ×xŒ™ïì5»ýÖlä_nÈPy6¾ÈÂuLÜ$­´L\K3•WBp/E¶à‚]¢¦«W¬D"œŠ©7/Cx½2‚éöô½¤§rÄß $¸e¥DËû\µ Ø¥bVÚœôê73†ÁS/Ò¿›©;_8[õпc©ö_z[$Ëm<¯0;¼¡ooq*‰54w ¥;®õ<é»j[ÏS@DŦµò1\„ûv¤²jÒvš·õ¯Ùµbcõ×áÁÔ·cI5ŇÕ$fSÆw‚fÓ•y”´0ÒƒÄkµa )r½cèÙŽÎ ÚØ8i¢ønLåë#D»ð‹~Ø…Žr(uì³Hœ\NWxbîÀÈmžoœ3‚c_³ ` #| ´ÙñPûžùQW+HøVïÈüH™ßëÓMW'·/(˜- eÿ9¶¯¹±˜«ãØlU+5Âæã‘ìÌvÊC¡¥ejô=¾*ˆH6z†É¢Æ,B>?Ðvk¢EÖo!U p_ü0ÓÆæP-töPøŽœ1TcñB³^‹RZº‡übWMS‚š÷ +kó &Ó+\± VYðõÊ©ŠöZ¾ÆetÉM ærm¥7"L¹ÔR6À;“Vb†kǯ·¬ÊŽÓpȳ&åÕ…»XM0õªÓìcY«Síÿ1Þó˜Ñs€w,¤&Ÿ¬líà±éÊÔ9I0È•Áö°]H–| ¯6õ`¿Úk„e/^kî}¨DÐÚ[÷á”rKøá <Î<.·X­ý ‹i¨¸p+ýâ'°¥æ®×ÂõFø iŒm0P[…JÑ8ö|ÉP±‘ mœP?_ø*†çbFò³üo´ŸªY ä)S]¿¬ól!9º.ZzÊ w蘮gXj/ óÕN>”e7['2‚ÌRýêÓÖþl0¹œ’A_>Ú à L¼!’;Ð ®nàÚ39ÞŒÊWgítúQ°ÚT÷8JÖà1¼ð 4hbÑÚ¥­{WïWlà7hœË5Ú¬ØG}®íkþF\Ђ<·Zî¬q£ÊvâFv’ó9³ž{]‚an!Qª—xôŠÆq«1íQy5h†­ÜS„ŒN߆ù Ñ—žß¾1ÂÅ„µPg+Åw=’ÍÙSUó; iÓª¢Î È_;Mé­ÎC9 ás »út<¸ØcKmc¾‰‘dÊ0¹èUgÓi©N· f,7³½û`_§ctNÍc¨®t’‡ò-ñ^94³ûÿ‚q¡c¦éSöªŒLyL6Æ2§ßµFYÕ>[JiçJû\  Æ¥ÝщÍ7•Êc€ÂȲZŽå„{ é0>Q skÉ~›ûIci¶Ì{ñÍ^ë%–yßN ïŒB}½_×Sá[€¤1ÂXàc…)M>«òêûd‹¢`éi6˜Ó‡“ùP . ðt4Ðü憯‹¡…ЦµEæ;<¡[uJ8®šö9 ø~-þ%ý!}v矻/ܬoÑp{)Ó%ãóþ›Ãªé. rÛC©Œ`¬×}U3ö†ýñ»fÓ¯W1s‡Ä3©"r*dCž§t$òÐS¤Ä½è¦?@5²4ìÄ‚g¹fÙ©QÞ<h˜?èžüX_T ÿ v zѨMF8;ðÂpuÖªuU rYz“¯pœñpÌy;©8is™dÁQÿ¾bAåûRÆû¯™ôcÃLBëi.Eù¾IÖÂ0rRáþ_øÕËT/låDZ)LÈ›êÇ‘'"!Þu‹2û.ŠR•EIho †²qeAfMz¡ êÙ뢎OñÍÏ™Ìb†}y”þïÆŽ##ƒ?ŽÏšý1öR³€f­`œl,—×®ÎÞ×*¦»qjõÅl‚¦Îv3aÀ×¶J™Øä½r×hÖ¸ÇPÿÄTà'ºÆ™#ƒõg4í~uv?MzuÔ¯ÃéDؼh–0vºi¼ÞôMEmÙ%M*»¦Jr_§Ÿ¿«¦ŸÃäüä4òrt ‰½Ö!© ªð!7À„¿FãôFø ‰Ý'ºÁK†šT9‰¶“‰@^æ埛± M©¯šä»#T~ö5VÂÄb}«…½–l ïà-cTÎá*×lvÜ%’^aØ2é=8, ½-1;n‘õhgq›è4NÂæ‹âØ(IBhÑÃqÉJøÎ˜y5ÛO]ê–ÈFŸÚ|ýê‚<©ôVNÆØ@<ö{¼–×^#PëAÝžtؾ‡Â_L9Kìà·õúïùÆ@ÂÔËK톢£ ŽŸ>Žîau×0¬þC„OÙÞüšDøCQÒh ú@‡†Ü\¡©ÖèL`˜T?pCAõ¢Ù#²FJjW‘ýÕ!±2í»'ŸâjCR}æÔºÃdž±ä‰èŽ’þ÷êì]«Q}IEÈ»Uª«¢¬8—OÀËHŸôp¤§S`§Á®ûTë±2¯w°ßÁ†£aß2™7=VÖ^×ÈÎÄKÞ'Z_²Vž¦µ­[Ÿ~Ø bZ$ýòè¬ÕxŸù/Èq:¡þ …ºìeÌÄ@ #| DFˆFõ[BNS4ªøô¼ÇŒ$| e1JÁõ·ö~g:èIÄ ‹O¢œ-ÕÈ´ä7qp@jŽyü§Ú"ƒ'zºÁTáÉßþÿØ;8©‰/Ž'»{£sô〣Wiªô¦t” JQDE°"(M@EEQDŠJ ¨ˆ*E‘ÞḻùÏLÊ&»Iv²›»¹½{ßr»›d2I^æ7åÍÑp‚jšà[C®¡¿¤Ê²Üº-/½FÈ'Zèw´¬„"®&ÐaÈØ¨š›ê”l”dúÝmÉ’¤ãô¢¡ŒÓ‹þwJÊ ú(—EªK¶XgæW¶¯¦ÖÎí½Ò|» Ç¢½™t¡õ\u,//uK¹yb¸þ=ò3ô'ù½ݨAŠÓèÞK¿ÑŒîà·Ž»~1w§-ô-ÍÅE2é;ïy)àŠ1¤¢ýáçX—é|†¿chÅx¤ß>b¶R©Ojżm"z4êªy•´H.9d†õ:­i°w´yd’zâ¶ëóÒƯ}ÔåËJæNŸÅŒ‰IA´>Òt_ÿÊIAiæ/Þ™i=ñQF L—r’{žê$-ü'!5¡ºJÖ1ô£Ê=(u{¾ñ‡ö@ÿ÷µÅõÇõ³Œ“Bß“º«Ðûq‘fЧ“^| z+~!úâ³´Üt úU›¦lcPò$’ú‡¤žÓ:¨ïo‰R5€äÚ%uÔ¥;™n> ¿Âxý÷NGŽÓtëü‹«Ýåå9YWHC˜4·à¶x­`C ‚rÀ¦>nü¶û7­†Æb»Œ-$dz/ì­†yŒªteõêé§Žµ”x·,&¿¤Ô_µÞ‰RÌÇ4·ÔAiØÜuß–&kÈþ‰ß›¦Z=ö#¾wù^oIõøiZÈ=ìÕ¢M¸/Ý×B¥¼”|?ITœsýbájŽÄĤw¢î|}ŸïÉé.²ó¨&vÞ/']$½g$à´" R+XÛÔ±?Ñí?húòÄ{/à’?½?+¶°ù@“oYå îYgiÅgÚçÓk^u§ãÜpûœ<0¤íWóŒò}¤8…zŒ^[ˆy¿nЫ×D}sÜç¯,“íøþçÑ…ôEz¥(UA_i*A/ÿM„÷Q5!òž}tæä/„ö©¤þÑP9¾Ý" X¥2¯V‹ äpPtuâ¼9üÅÆ—ë?æn»!vúÃ;Eq|d™ö>mÐÁÑæ&B×´Ó¾êHW¸>ðY"ÛÈéè'ùh—ø†,t“³-%eã4%]ýý M„6…p&6¢©ÞfÙt›Ej¿bzïDí|ǰÜyò)»°Ô"#½îX¯X½%YA«šîaN„¼´Ò+¾‘6éÛB^m[ZyT3}+"‡ÃæGXUy¨ƒk ×s~‚ù¶™8 {Õe¦Êä1ßSò÷ÙAŽô¢‰òòæZæG[ãÃéè[E v²¹Üv sê.$T)®tß4hãÔB¦ÓåÕ?ïQñÊA'“¤ŸNX'"/æN ~\€ÔÏdÕ0‡úÑSK¥ž’…ÐÉ ŠWe¾öÈzÜú*:ê¢ÑÖ’®É‚Æ$'¼«³è@Æ­3Wmëê¦XPj P¬ÒÓÛS¨¦Rµ[Dƒ^SbÞЇCNÛþ´ÿîÆê~µÊ$׸dïèMï˜BÑ‹è\„²„-†xB‘Áß ¸¶ä;mQÈ5BR\Üç l %Iê>~}êì÷¿ÕïÙÁ?€­ÒÊT g ìЪË0Ñ Q¿–}QÏ“[Ïî® !G©­(7#N!A®CM¢ ‚¶)(C$§ì.¯ÜÛÿƒ4uBØBl1W¿3]d[Â]ÌtúUcŸ†ÊËÒúV_Øæzüwó®ÃÆÞ `ǰÝ=á³™¦äN¬Ìà(êGe¥ˆ”üþ…º&¡¢ßXÓÉv2O­ñN¥ªB m ˜'HI3H.?óP+ú¢z|Fµ‚·TÔ_OÑdÖ°üÒØ' |µ¯”v¹ó>O÷S|ûr/‘zt6™ª]¤Î£ïhÌ/-@ó .€¤ÇD›H}‚6N²47{ó ¦\dÔ£³éêK{¨ÉÕ”Èvj ¤$®Hã‡m7©J‰jùù æúðaÍýwu’û‰NŒ-ÓI£­]ÛÃM6XÎb7¥í–éBÞ^`*4Æ<€äž|l?õSÌ7“Ž ‘¬½ðmÿü¾ÇQ"vgÝ[*}|›iˆ¹— Vê\¢Ç¥ëq”VÈÊ?¢Ï=Íø‰šßê¸vèHçe½tˆŽˆî·ÓQÁP±n¦|ðtœôæ J§îï¼°÷Ëψ 5 YÜ× X¯Ü«Ã8«ûƒ³tBØBÒѲ]~Æ|<Ï׿Ùg³[glE'*ü?ºcúã—çÖS‹w7˜¦¬uVHfKg°œ;¥oŠFÑ¡¤LåV u%À2. ×I…›g1’ëµ±äÌ$8ŒˆÐºÅ"„äǧ—×|­ÕH¾|ÙeÕU©Aø\™àõ+)Í‘!}±åìîØDÝ=ˆèMÖLN¾»™O#qº4Wî—Íó›ÏÃ=Ž•º´tÍ´™€Ò”:=ñf"¹’÷­+9UéjJ£Ýs“‚4M_H÷Ø4i¾¿6w‘õ×#4œ|2v‚Õ À”:eáŸÍúÑ ¾‰nK¾RF[ßCë]t^Ð9©ié}´q%!¾ Ž=->&Œ«:Ô/(åàë·2’[mø¶Âµ6c¯›¶4R½ ¡Ý³ËHoDÑ¡ò ñê40é16 wá¸wª Ÿz#E·.´Lüò‡<=>¼9&ÀÎRÿlC¹781`G´mž‚ê5l TþÒkjµåu$íBÈ›BˆaûºŽÐÙ÷ÕXJb[µ×0Î~ÉÕ•ŠU98Ã"ÞòæD—üej(³{+gí³ÅÞ(º’Ê ‡¿H;<†ÐÇ"-]¨#Áeò+Ú¥N:2ì“,(;Ÿjz‚b½!S­×ê–=ø¨{)ýð8z$1ñùËI_šÊr/,© oƒ«†L»ë\JmºžäDå¨~ëØÒ‰£iÞú_ñëÙõ\¥SLDꑚVUY±~#ݸ38ËôEž¹Qõ…­$’y3}*N#Õ€¸@iã¾/{sá@}ÔÄ›Ð|éØ&Ëñs¯‘v|iQUÔ™R¼eõ†¬…W“eY+vßþ¨—Ô½`PCÂu1QªL6:ؽGŠjtn±ÑëÑc€¯DHþØOKSÉ?÷YX!¹è¶ÛtU¨RjïNþ3š3%èŠÒFoúUý" ô(oµú„OÉ -Òí·¨©ø¯´ˆØn¯ºCiŽ„ûƒ³tBØÂ#‘òÐÒPùá7zÜz`ŠQ®cJK Üg½s­¡âWöòZl¼}‡”b–‰ñÚM‚îíti^ õƒt™î½Ûh]¿n›eI`!M­«oõØ=è«i"½Š¾éiäõë¥S¼" ٱ®»¨TÏ&€Þ#ѳÚjf°ä]+¼>ÍZ›Me·ysÒí«ÉñH]TÒˆ xómÕ%Oö¯‰$Ó’Ýš&¼ûÃó~ë²Qd˜ô’΄6Á™:!ì ! åõä—7–_÷®ÆÁóƒ‡Æ«I%í%ãÚz·g‰ËJ ´’Oí¾mXB–±pŬèMµ/{I¯˜H Q“æW¢ì+æ¹BÁ«R®ŸÐÅ'™¦‡˜8|óÎLÂ÷ÊCH¥…Sô6©CP¡¦²ª[£·hó:QòŽ0*˜ê~éÿd§àVM*.$”vCf_™%7lÿ—FfñÓ;ä#¼ B°N 3ñõþ«·ßcÓöµBÇá^i–§>£~r‹7’£¼S\ùͬ&ïÌT´Cþ\Õ Š­@Ÿlk¹SºÏ§‚ÙxŠÒ[0º‹þwƒ7ÂULqŒq¿„Ïàê«ö4$\ð`iûKËÒç!™ó)Ñ_ ÓþEÉý‘üÕjML#õã(tf!íÛx‘vÔ©§ŸøXÇhßæg›–c]ôrü‡O5‘.#àþ¥·¯8ãÄTt»­Oë´šd{Kˆ 3Iïô;”5Ã÷‘`J‹4þ¶ö!ä€m!Ô¯x-M²#æ£áÉ%¢™ê{Æ;í%'ÙŽ?4&h_N¥µã:rc–½¨-hŸºÍó‚QaßìˆÅ¨„.xhœÁáuŒë¼1RGŸTK™†=Dâ³°Ö¼ƒM‹g¾á*5åIdó¢ÒTø++^ÖEêèIòQ`ëÑù;²iÍêuï8ëˆÑ“Å-¥)­³˜N¯…tÞ>ä (0ò"­˜GoùŧϷrjHö©r‡ä˜~`zK¿©'*Ť¥^¶º®k%¸ÑK»¹Ò$ÿC‹§JOÑi“²5´5õTVÚ!¿‘xD=…жÿ±Å»° ‘;©÷Ûkt®žë¯#´×8g¹H_òg¤™'*1hóÉ]ø¯´ÀË*«kÁ•£ñ}#%¡«A×x¦Íšu¤±ô1ñ’ª*ÝGµåÔ°f™ õ:¼°çˆ>¾|¡EG7?­±å*³…`ñY4àþpåZF+èc¿ Çþƒ¢k$ûøOþÚ¡?¾ÎfäSlÇI=™»°#Ô"0q)ƒrÀ¶¢Oý #2@7Ã:*Þ}ÛÞ÷Þy4¿iÿ’¾ÒS[p¹š_÷¦Ç\A[q©Pøôdõu”]éŠûÁm,N—QI24¶ž÷ëW‡’]í=óê.\ܬt­zy¹ùú¼;ÓÆ¸ƒ&W¿ˆË¿ÑïëÞØÈ7…\^ß¶k~¯€B;òœõsMÃ×´;u¤têb5}«)¥Êê!~¹D™•Nì·%7S—ïq1›­OËqVüxä.ç¢_¾ Þp鬥$Bו0ktû‚‹þ(ºÀ’´ZS¢‘#rÝ%ïL}}í1)õS²·8Vð ÛtÂHíºb1y”«ü²¢ò[^ê6VÍ÷8\wr/f÷Ÿ°õtÎ8F@"^ÏQ­-u…ŽxèºÇ‡+`K;2GZÄ[‹Ì›ravi…Za'¦£”×Ô Õ–[^ªŽèJ%j ¦…@ )¯X°zà6P DžY·“¼Á÷¢„äJØä ¿ç=. 7ðIk‘™/1ÛHxHÿxL€rÀ¶.ñkEä`›•Ê[o÷K° ¶ã¢Ÿ“¿’¸À>ÊëúíÄÒ78@Ñ?õ¶Ô¶1nxš·Y;Ó¦û%:”¤¼Å]û¹ÒT*¾òòqeçx‹žš‡”Á¥‚’1̘‰¸Xk}«èéè.ÚæTúºâk}øÃÐäu”³T_þú]`â>ëK¢ß'#¡®^Ÿãv†¦¬}:ž•¤é”î›r ïØæ›\T¾szVáBHù,_U>…+eø¶Ö¨Ü|Ø®ÿèÅ7íá+ø–I>} e8>j¾Oî5ÞÄw&Ê÷FyÄÜÅ Wè2|þ˜ØèÇ)Zés‘!@«õÌbžôy| ÈÂX­NüÌóäß²QMiÔþ(>G§ý¢Ú†çÊk†§nI ¹l×ÖÝÔ7¿@Hs(lAV)aêܕΠ5@öˆ€‡ü„.\ÿÈx[섈—Îw³ñÕ>‚_àeÁÙ:!ì ágø5÷´´7=JœÐÜÖþ”´´ø‹Ä²‘p{û8ê­låSLô•=н»jŒ¢M5ü‹’f5MM±¿÷_„+÷çèð¤ÐSvUú Ëí3¨ý+'í*—Wâoð±‰;:ÒÝo>’ßåRY5I·VrKyoèFõÑÜ ø5¯uðÃý¸ B€«Jë4Ѻ¼O¥ÇçvJÃ¥·ä±”èJƳєX¡ñšªíúêFÒ›q;€ó,ùâЀ{Í$Bê6žáªm…d)#Õ~9Ù70®îvtnúãA)Yo¨ì¼¸»Ó¬µo©I4ž®yã¾Bgãý°ƒë±ÛÒ½PPžk…O¥ÿ$©_`§Ô.(…/Z, l@é-Õ`Ô±â.\To¡:ĆÄr v&ÊöñUàéǤ·“¨{wÊùm{SŠÑÖ}ƒ«ÕÛ€rÀ¦þ‘›Æ·¼újE±ÀÍì$–üú0I‡¨4‰·ÎÕ±Ü]f’ä6:fQÉøˆÈxoñÍ60§gú[þjy¯4ì3"-ÕèQì¤kȪ.®‚Ë…¼k?Ÿ×ž¥_Ô»O­Ï¥µâ}pË)JÄÑС©G¶®ÿáÉm´߭Ò«G{JÚény':ek†N[+ÌÒ%W„Žþ]ŸaéOü¼ SÃsÔ}_/ï0hWÜl=ÿ’ßT©º(”™›ÍÔ;A¢hÿW¾ï/Î0}Äei»£T¯QõS‡K«ÏoÖŽvÁëÏhodÿÓj…P؇f5=Q|jãÇ»ÑN†h“Hì!½(_¿¥P«š‚èúf¤¡RêzV ½$ÐeÆ0qjÃ+ÀÆ™ÊW¨SàôHŠ5×ïyÅѶ¦É-‹½†Èò$Ñ ¥‹]½öDlŠ›ñn'Ðú½G¶BÈ›BØYâ½½¬§A4#cܦþøhdWüÆ} 6-’·1ÅMè?é¦Z:Ç/5?QE«—×¶Ę’Ï#tCÏKÖ5ÒÒÒReêÝó2€;jX”joiÌM„6”Êê¼²¿éãxÚêѦÑs©¡\é’‘OÐŽ’ ŸÛù6ÞméjA‚PíIY#=Ûƒ´N/3±i\¨Óø"ß°æ.ܺÙ)ÏU“V˜7'À¤/²’Þ‹">ß~]$©¡ôúC1ºæ·oí"ò9EkÅž&+XVlè#¤"M;º+øØHnêOã;öUð~É¡¦;5 ²Þ‹0½„Bg«*]pAP$ÀÌÍé+ëë:, åÈõ½Î”üZD‚“îb2ŒpÇ#5%T¾—o‘?ß@ˆ<¢È€áL!ä€=!ÜŠŸï²5~­Aëž«Cìuð']Q3Ÿå†T˜äS')‹¾=Öbz¡+&]Iý-3æ—­{zåù¯==h˜ßhNÉ“—•“UÁYýϬ;s/Ã0½1 ^îÙ´z£.ÏýÜÂwK!Z÷hnøK?š¨}Å={ ?1IþJJÖ˜¬.Qx4¡þúïÛŽÑ£þ À(ƒ!üÔŠ]KŸ(ISÌÆ»ë~¹ Ôg˜°®Òã›z#…ÕŒËþ­sš+¡…¸o¬Fß) VФ$Ÿßâ­}K£ú¤‘RÎVSŠ:m¾4p—êSÇ÷íŠê·^·Rc®®Ô†ï0Ó¦.²$| ™óQj¹ÊÊ—¼ëÄ7ì9¤£©ÝxÚ_¢Ž¦ZmŽ‘_yüb| ý.Ç!}%Éë?“vg5©z¢ÞÜJß=D|ÄSÈd¿H¾¬€rÀžbaiðˆd`ìqôï&»šO4¨¦Ó‹NcúWð{g‹§!ôƒ%´@OÉ8gi„¢6òáC,ùsw¹ú©Xܧ.ÚŠˆT¯i»}g÷èÇrv ½ÝŠBùûG ñiƒFKïo‘š> FxæýL}úOÈ÷v=kõp' R,Œ¯†'«©D*îñíô§¥'+¤Ä(«]¬Mƒr>ÉH_J(]ÃD›$Oýñþï×P²ª_f Zçãœo]´{HšçVNñФ÷O .Ú¯k!“»”± ‰¥Í·M'ÞZ½/[ªyä3l#z §“•æ…&ÄšJRãïµ:Ðye T÷ü=dŽz9[ÑåMé^ßv+S9 îž»}7E‰è&uk²$œ"ÅAü’‹¬Å†¤Õ¯¤¢ªÖ-ï ¦ø—ÖÛé²£s‚µuBØ”üRNWïùO1‡éó4ÔfpÄ6xÀà•Jè'ÙáÁ!%î‡h¨E.ÝœáM‚¥ßk•L-:Ä·*hÊx×þQ* j&Û¾Oü®,¯«?D¬ùÔ±›Ê+z€HE5«§»S Jù³¾é’ÿÏûÚ›úÅ L‰ž½êÅÚj­Eî8ꪦÓç_Õ¤]-ÏX{Þ:%ö‹™6‰ù߬|¶X}CÁ£M;gP|Ï`/§ [„`?ÿ Riµè³Ài·|GÍ¯í½¯%–J¶Å„”þÀÑžéGÇÊ úÄÉÏ{‘”çÛÙ\iÅKîrªy{þCÁæþàs_³˜ŒŒú •;;²}£iþ’åÝó,‚™VÝ@ÿ ý ÿS?ð‹òªò$šîNm·–\zAjBØÂRùPom¯'sA`˜¦Ù‰´¿”_ã–ÿ>ôºØÔèÿ˜O禷±Ù¸–^ay|~¢Ï®·ƒ9uÅ1¯/è©ÔäEÍ¿:daNüNy>þ1¡¢”9ÜñthÃr™""„“Ïã_þ‹>õf ¼+ о¼)¡)4>ók/ÛïRñÿã­Óû ­ŠfQipËýOyÞÔÖ£4I§¶okÔÁl_GÐçÄhÔLùô‹‡Ñí†VÉ‘ˆ§­Ç;k|ʪDÖ.]ÑÏ)¿!ƒ\ÞÉóýhµÿþ‹ÇL–ð&x‡Â‡!ô¥´ÜË%ÝI¿c”Lʺ” ÙÝ¿UlÃTIÏnA"»KÑ,¿¼Œ Þh·4©¥é~ßâEŸûÍMÅæÚ!XS!ä€-!”&Îw~Ÿq-y 2…¹Ö#FQS u§ï­$½Ðq¹‚O°o?}DeËj<#®‡Hô•.f›;“iÌSËŠ©¡„a›Ë×lȽÿ3jûD^—º^„Î[®’>ÒW2=B¬f·¯eÊœŠ.¬td ûðKÐ*qR©rÇúè’+_^yê´@—ß3à¿}Û\$ä2YJ!æÙ? û õ÷¸æ©kæõ êœó#Ñ’7ÐAïèmÈ6XÚhø®¨y”TþH?Ô[óK£Àfî¤DîÄu‡è7>È–g.’EÌ@,8×\öHÌ ½õ{þù†„ØhÙïíÓº ¦F÷’¼[þck,gêëT#ô™ÕÞt æmº:èñ+ò˜M ‚‡ü^Örs¡I°¶BÈ[BH*CBÉä5ª6Õ®t‰–­È"êÖ!«Ç0OS,yÛ» áý¸ZN2I–ï³pe4Ä”T­ÅI]1M§‰{ *O §X©r^ªqyüÎELµ;âØóòó¥e½ªÍU²ÞH]=Ý£{;c®]$>´xº&‘Ë#Þ °ÏºíôYùTÖgÙëà·C¥låŸüU3×…ú¸TÕz•ˆ&=¦?‡% щÀߘG{bHÕé“÷Áî€ýѾÁ±ÞW 伦®>D=ÌK;£ï¼¯‡¼­¯f\]ß6Ä:H;@q)m5&`6A…¹É¿ ¡빺°LAòœ{Zþ9Êè¬1ÚÕ´#¯Þ:¡#íä[Yú}ùw€ì0?aA}šaÒ]RphU*»äöâ›po°¶BÈ[BHKzf8½ï¦¡ ñ’ƸËûMh×àsÖƒjÏ£gè…¸"ÉDQã ö´ÍêÓ[ p®*Tz›¢´"ÐÕ¢ÌñxGåKtÄ’*0î¨2÷UhÅ49ãn¦°m o­¼I,kÃVˆkÐm¿ …ªT/¢yï„h§ÖƒCu6Ò•l=~Ó'¶jF<ÅžÞªAÉÖabs¿Fç(øÕôÝ~Ë)]fÉÓä„C}·ë±ÙLdpý×§ØëüYÿ]ä>í±Gè{S¨÷ ÌØ‘_ŒÙ‚‹¾‘?Å4”k½Ï£udÊýÄ7äúŸáMŒ¥Jl'®¢Ó4C6¶§)Õîb~V×{«ºÚ¢¶€)›¿Â#øù“¾Õ%³ Å „¶„D=ëŽ_¦ò‡ÐÙ÷ÙMVé*Ó]}ig˜–Þ…›m L‹IKÍo’B -BO’o],<îò¦ù9¬Ù¢Áãìa§XÍMïÔ7O÷Æ”|.W‚“S|–%¼DçPýèÝuEhfz\0Ã]²é”ý­!Ÿ£oèJI*ÊbKÙ]65ÃÿF®¢ÿ¹ÆßÃpkòCu HSÞ ¢w „HQó÷r'B{te½®šUñ~ŸÝKV;I‡¡=Ô§ÒõBÿ¬œá»Ó#Ð>Ëðے᱈qüí7C?aä·¤)xIqp¤Ñ!•¥Á;!l !)*kàªb_¦iîvaVó4ê©|¬zÖÌØk¦³$åic´ØÂ¾å•[#:eI=¹(B—Ì]­¥}£Ð!ÛK{J4oÚqÐ+¡AöSÆÍòYºõàçãY #õ49lñtϱ8&)¸"ä“å]… úáàËr’ÔŸ¶†d¥h“éeÕ?¢G³êµ¤;ý²î 4:¥õÂSX;Ã4 #ê‘~ÒF(}¦¦¿4ï ‰£ZâÚÿ_ÊòƒjË[ õ•VwL­jÜÀWìÉÙ^”¨’µÊù™¿yÍŒôNŸI6ÝìK¥‰ä_)ÀÓh©öÃ)\ÒO”ħ‹òïRž |p´·Oýw~*"Õîb»½åÞY‹£ÞîÛ‚ú`\ÌÓöÕŒ5¤HÆPˆ3 Ç7] Mâ‹Á;!l áÏÒÃòup˜y'£o7}ÂD¯À,5 Ãèík§C!b œDky¤ÜIˆçüáÆæH¥“ ¡ÇØòàKgr³7è(½#/E‡}é£Þ®ÞÍòT’¬ž®ÏJæ±jй ù%¨%n¼:è¤ÐEIòcå1ÀÒXÊpq˜×µ‘¢du ÇôeùÔŒWMfšÝ×ö—ÿÏꞄж׿ò´rŽÕWÅ×ü{b]Æ_hÏæÓ——¶*c0ìhYúK—ó¿ô#dx{BGýû¨=¶ÕÃ>Ÿ]ÿëü‡i„P‹ìWÚ)(ùú¡[?0t³èž°ç#ÕÑtBËèKÑÝÄw+WÐÆBÈ[Bø©#´‰Ç7¦ÅyÍ¥}ðÏéŒKßU5hÌ÷~Ž GYÜÞÏ|³©ŸÐj&—®3Ëx9–Dž#‹¿ZT {©gª@£P^ ±%óŽcåg¨õµC§Éø=ã:VNREmù:ZÑ ¢§Ô³Iø#ÒÁdåj+e¾ó~Å…€¨´:Ë ëcDzsšH±üökì „°%„Þâ(£ê½ ]‰1›'`Hµû#îMô“3è!#jbùÛD4XžH'É+‘VHÙ`ƒÐIÍlf¿FHà,ŠÞ^"a§é–dš€’Cý„«» ç2¼¦l¾3Mù‰!B]¹ZRõsù/È ÜT¯qBHVê{‹¶íkå=$­.?õñÿ_Áû\z’ƒ,žò§¾Ù4_3XŸ|;¦½Qæs|¾mM·Wy´îcÓòޱæõ<)QçìYižM&´%‚x•﵈" ¡Æ¶–šo‰© n"ZQ×^OT¿ѶP#H"?V±NÒâK‚5vBØÂ5ò#¯Ó”).S„ýèûm_If³{U)]JA !î1Q#¥àlo‚9dÔ¥”âšçI?ÙYlöIjOjÌBRXä6^?1àŒCéTÞ×·¼×‘é˜~²ÉD–ænd3ZiZY=1ÙûÓ­ÞþÇþ»ãUt­GÃ%†úäÒbÊ¡žÀBÈJôqsÇ”$A =g>õW†Øëoì•v=Ó40Xu ¼ ÌKCd»¥vÕ®W£’E ¯eìä¥8mBX‡„v#Ëî]/Xu§¨±jû+Ö¥ù7NÓ.#ÚUã9‹ nÓÀ}:&Y.ó"]ïs¶t¥Ë2z3yÙLÛi8/·ÉFñm'j@nFÊ‹SåáÉô³¤dÑÇÈú ò;˜¿Þ ÚÒÿ9}ûP¿¬‹5}ïfÒ×?,CÇMšž÷}¶©JqXê;t{nåx‘»œxOø÷öãþ¿ú O–8’¤þR943M„@ETn²ö«wÑÅN’s‡–iœZ»vÂÉõÑ ºQ×'ýCÒϹ¾v¨x,eLw¢xZeòfÎ% îF1è©Í;}c²¾åÝMɼáQÝYuw[Š"áfòæóŒ8“îøúQRe«V?A¬±ƒrÀ–^—Í· ,c7‡ö#é3Ünð{Ë™ôw´´ÚJ0»©Kg iƒn,YH3b攼¡â««´Å¯í²BiÄÔ½.ËO, z*”:ÆU,[Â¢àŽ®3…´4[¦\[ýÊãŸ~}]Upß#š;—`™˜X?p0ñR¯î¹ðÓó55éÑN-Úe*4pLgù€k1dY=ÏH ~þë´5©ôaë}ó…YK¶‘þä}ÒÏ|! £ÒR6NÔ¯I€ÝhîK’+K[éívm±Ô[Ÿ+#;àþï<6B{p 8Qÿ‹UÆ<”ënW; ÂŒ`m„öVŸ ½bRQäÄ€À¸ˆmz=EzF9›†ËrªU1ÚÇi?Ú—GJ-Ðv7ŠRé6ŒÒ¥a¨U0*;´—…°’ 4—»\}ßâܵ ~4 ‚ è•SêÂGù§Nî¥×*yü ƒ½C·SF¶HàzRÜ-ŸD.Û½ÆÜ§Ïh†›|¶¾5nïyWoÒ–4“w(òðŸˆLfÏ"‚àÏü_ú²{¹ÄI7Ì[óÛ¶Yú;˜ôEÈ/ÿ–šòçÊkÎ#ôžÝ¹š6p7|dá`¦Þ"|ûW„Œf,±Xž_ä…ƒµµß]ƒWi}È‹}‚HൂµuBØBb%‘½œ{׋ ¦æÑ §È…÷Óh£ô!Ôð–Éÿýó¢Uø ¡WÈ5’|z1 6Ç‹<™ÎÚéŽ=ŸµÙJZÎýÂÓ$ ŸB³Â·vÑe}¿ÔüØ|õg$Ö²ñÕZ|uˆv*·Ðb瑱8‹Æ`yÉ—\1Jßè'tåd–ûgÌ2þÚpéf–œB7##ŸM=óc‡PÈØ5~õtCè+éúKMT¯˜bø&¦V*q“/ø×̼‘;h%-MË[m'ÐeW}ª+UþÌiüï 2m¢ô[ø­ü*7¶$ „°%„rÇ8)”ÍbÌg .í+æY¨ÊQ÷ZEcb‚ëè,jédƒòjy‘Ñ·ºäœ#¼^%½ª¯fJ¤ñ¬IC”žÆÌ£3ß=æm®Ì¢Ï4ÅoÚIºüÄ™ÜÐ ‰¤Úªä>꺹U1¡ŒÅæé³øëº½!ï!…Ô‹Wb<þ„í4Õ7–‘F?MëUÏž¤Ø ”òDàݲ0^ô±´VJ ¹G57€4÷jT¦HI¯Ùo•/Dè¤R¥÷NÔRíªÜ®–4¯åHmÿ£‹-ì9~1Xìb>#|DÁ(·;*aéȦ®Is¤#Úx{Mö̧ڶ.L>¬J5]ºaù¨†tüR|½lY=Õœ!œu=fW­‡z\lž‘=5ßÄ/ð›¾óš´¤ „Ñ#KάoähÜF‹d¹åÍ%û¸fãñD¾‘†.ûìŸ{"Yþäò±šw\%fŒM)!ä€-!$+ ß!‰˜Q5ÈZFï»ø°3mV™¯EÃÁafoB+ôâÃé§³«ßÄ‘´y”çìñ@sD•­gðk]\¨®Sè\±èýcÃI>Þ[¶&„j§ª‹±¹É0v7¦#7Ë¥#ÞÆRPŸÈà h¿•NˆÙ @Ñ`MUDdvIuÝy¯#2:…U˜Ë˜TÌ ’ûtÜ´'Ã#w B}â/PðÈ[IŒgÈd¬îŒzw£æq†ù â›A‚¹ÿNëæå£"xWV÷!ýí,¸Ñ–­ƒrÀ–’Öà˜Û­ý¬"$œY§Å°G+cçt‰g¼îJÆ5^¹Žrڪĸ ò%‹c‡J]A‘¬ Y)+Ù{äi1¿v„Ò™Æ;‹ÆÒ‰ð‹»=àØåÞ.ª—aB•™.¬ qxØ!q«Œ ÔÑMΣ;¶Š·”é— g±2#Ÿêë †?‰Ë¢~ÙÏ$8L`¬:ˆ»~!¥¯‘IµùÖ®öI¡‡­z0*jo˜¤X¹/ ”6Ű>í×P~Î&.Cœ¶¾£÷©7úO ë(Ä&ö–fy,ß{fÿša¤¶êyÃߢÍ!ä€íy„¹Ð –ùëNkACDnÓ n\‡‘š–™ãLú²¡ï’q+V¬oðk¼zæx$ñÝo¡€óÚµˆÝFç¤i(y&a…CWM‚–Òí¤Lˆ‰ÒÓ5q× É)Ù54pDê Ýâ6›áœ™%°dX4…G§bõ«NÓÞjƒ÷2ˆËs˜¤·`ÝU~|÷Ü~Ô¤>á{»]”ÆžA4äd 5í9º]ˆvºŸ:·ÿó]¤vc&ÞǽÞߤM!ä€=!$R Y­,cÑFÝ uf½-båP7ýo[.0vÀm©’³vÒKaZå—Æ!\ÿ¢›Iø}LA(Ð’ö˜¾ê'‘·®TˆjäȬÿ§YöJ£¢Ø›Ì3!-ãYû6üp<ùÄ–(¼ÌçË!ì !:‰üY3ú‘1Šèaó0Ͱö˜5M»ÈÙ‹5YÜšWC ‡*&¶ª§ïƒ*ÒzæNͲ·˜¨Švï‚Pç[):ÖîkÅa­D¹ì‡T7û(M˜<“®Ñ•â¿å.ì1ù²ž÷”*9vÅ&×N¤·/ ±úî  Šð–‹®dõoxÃÑ3〿Œ$¥v_@wïêx?tÆ-J3SîɽŽ\àýŽÚ<„v§}®F,êVÍßq`iåK²t']Çýå·†pOê\±…ÙÖA9`SSÈSv¡Žc¡c½ÂÌÅàî5÷ä ¼DÁ-Œ4Ö¢çƒÊ‹ŠH&O•ð¶K3úÚÔÖ]L©rÿ¸ü8 é·eïv¤®yîf¯œÃç¸Lªó!.Q¿Î"C®|R1-=›ÆÚÃVkýRšØ üŠmÜõádÍIŒw#3ÉDh­”èYtÙî©+ÿ‰POœëÝ/?j"ÃÔ#¿ÜíУ`RmÎMßÓ'é/ž&ïžF—Öu¢ÝN5ÒÚ 2BÈ›BˆÉÆ’‹¹hÏNä½ß|=pg™Ã¤‰÷îŸ<¿±’`ÅmB7ü›‘ØÒ–yþÙªùv¯$5ýºub×ÇŸM²ÚÅÞÐìÔ4x€øàá4ô™FâDä¦,ì(uì³æ†å•øó0 ¾ ‰'ãÚ‰‚ˆ:XÄj%ôŒ ™Ö;+FèÒŒ`Ž/8Øèï?ºmseÕAÒÀâÆ6««7ð©á‚`Ñ“Sg ²CX*õê¡8i¥O u•nïãçægÔ&€rÀ®¢C™ä—ÒC]í&¡\æœÑ üšGö{úË[?H‹å®:pv†ñ}tn©O—·xÔJßz¾;¸Æ´ì©´E þL1#÷Öèá@³ƒEÃa­âåH’ͦæå Õ¼¹êΧŸæ»ï­ý_,ÿæ.†þñîSyñp¿tú(hrÙ™ç?¨uíF©ÕH;Á^”WÉŸ–}Q$““Û= =¢P ã Tá€ón‹\®j÷”á€2 ©¦|C#æàjÀ«Ð-b%’c¬'^}Aï%HáßÓI8^qÆü¶“a~_g5uBØB”b¹ø­cˆ﹯¡fàJh^ŠãkÿCö*I>‰ôf›ñÆ@tú&Ómwý¦ YÅ´´s—ŸÎ)>Jñ•k.æòÎ3v`¥IQ?kð©3¤‡h¨O3Ÿ=ÿm“$nzíæ tÝï8w¡ÆT †É qÔEiäO²Å é€nC|#¢lN Õ˜PÓ»ôã´¶N5Ä*Bw›om5ŽþixDp«É:g5«2¬†ÏÉèŒù¬ËÆr2n3­'ÒwE¼´V*xˆšäã] ¶ó–doç>3hèø[pU16Q˜gÕƒrÀ¶¦>™©£áÕYv2Œï2ÊÅŠ¨õU{¸¡ˆ\WdRÆ)Ükå‘›„õI©ܬæ.j!úм°–cþðâ횸4õ !êi¹¥-5@]V.?˜¥¡­0i©ë™$+‚뿃äÏ㑺|lå.£}* oØ]6½‘Mp=²ìA«÷:·Ô+:»òÓÊò/15;¶© ÊÝMÆ~ñejÖú2Gk2q¯éS‘;E>Úû4-‰"‰­¥ÌP\ÏDÌ»¨ ¼Ïjê „°+„7IW¹Øz(ƒÍ8È´–ª¶ÏNu8måx]´·–Œ¯Å¤!ô”ÓÉãîe¹ù1òP~*å>dqÚCè–Š°ÒÖCGµ`(ñšz…o3iº™GHÌ<·]á=³$Ø|‘½WG ¸…|6kz¥39ò¼poFg~?q‚µ+Þ1™Š$ó1•ÆS :vâ5ÒÏ›×Î>ÐØ³f?Ú×wãÎïó.ðyÍç±xlÄÛ!ä€]!¼?Ôê?"ô«; aX1‹÷³:#š¢C!MÕî.Ÿd.)ýv‡²B êIkümÙ¸ érds’_çÆä]ýBS–ºßû9`Ë@'h¸ìÅ鯙;@å§D¨†ºÉä\bÙz¾ »©fiX®³SÞ¤ƒýck{ŠèÐSš…4;&XJóYþ¡Ú'‚wRB{ùÖšŽ,‡, îÒ•c–¯Ç†‹F¡)~f5uBØÂùøv»Š?œ³ehŒj•ýL4ÞØ/V|àcüo‰ßngÒŒhÏV9bÝ—?{¹¶_b’§ôS}ÃûÓ™Ï÷nšúú ò9T]ˆ¿ûMIŸ;…j¨MÍNæa€Y–½ #¦ôªnT¼Y@—ü} .MŸ3ˆ˜\ÉkF‰ò­µî·È>xt&¢,H¨ü(WÉ\Feƒû«©ƒrÀž^N„;éðOº3ôÙaj¡¼!ù-bPˆåz;0Æ_œÔsõ=!ÛDŽ>w©«Ïoe. Dú8…úvÃJÑjpR{ïÍHàL+ ™SZ†‘{LÒ(MËã[è ‚a'd®û‡ÎYV¡KmÝc·tk}Í2{’ðÐñ÷+–¨ô‘+VRhÂvô³ù±µ˜M„ö„p2®ãŸ’>ŽBâ…XL¦Ì3ª-Ån|ö„±hºü¹`\Ÿ`'ñGž_— Ü6Ç÷§¶Çß´=6“èv3*Cü4‰FžÑNý< ú^ãjJi\òªq" Xs޵,N}s õµ=‚@j§‘×|Ì-Bq|J5HϦw[‹hÐÿ‰þ Ôò¦Ì#ÌÊØÂJ‚0^úôÍ¢ÓYkxƬ¾ÕÄpCÔÄú¶ÄØd Jdæ„0ȯCÁn´S` ºüRq\G‡j§¦ê ®2%ËÃoRò=Î8‘ͯKl7¨³w  `],s§’\VËI!Mt~ŒÏ©Îm+ô7ѵ`ýÇÒ‘áÚØaó0G»ùÚ©”1µÛ6.î}IOI‹òJ>ìy_»Dmîâ«Êª¡‹Ym„¶„ðü8"tvûªEv#¬dâ¤øŒ)¹C8î… Ž‰wF_¼o^H}™hK=bø†ÛkŒ‹éZÁ4íc™ÇGÌxIN©è›Þ‰¯ü5Mêqm“s ѸY¬ö{{LÖ7ŸìÖèV(T7 Ö0š™ähívŒ«Äˆ‘–Ì ˆ#oæN„Î JàH±Ä µ)Ôè.ß+m®Ìjë „°%„K¡êñiöV™J†ûo?îý° pº¾_¶¬—WxlKéC” T„:ø±þáIl4}ÀQûg<èØ­‚iÛw 5°Œì®ßû ¢38›ÿe~.ÒK7Þ(³»Zšïã÷ÙRÔ7›ví×z"À£xŒ*S‚«š9s\8# `¤™Ò‹Iæ¯ê^úä÷IwèåþòWÖ•˜@9`K§áJ·ë!Cgó–\?Ç›Áê'W0zàÐõ„ÅítMõíÎK-ú7UÜ•4ï÷E/Jèr½j™’Öëbf ,5¾’™¦+þ®"ýWáÖÇC©¦ÕŒ2i±Üû&påín¡¬UÂÐbôl§óZ¾O4Z×90ænea5qÞõßà9Šªq›bR…QŠî¤Ý¡GºíÓ7}×¥³s•®Qüê±BÈ[BhXéÍÆ¯…„;³£#ÛÂîjkñ¿§Ñå{Eéÿ«[à®ùè¸wš@i}ïȶý¼Ï6κ5o~EÂ7¨=h“Š!k-i¢ å¼|Ï™ Šó=h ¥;<õ-]˜¡R<–=É 8™5öž}±±Ô¡–¢)¸zõçÑ«íIT‹¯±&Š7ÐÕÖ¾{ÅjLm$£±ƒrÀ–>¢ n­ ×ÊSOÉ}ªzm@h¥ãN½å©wKÌŽeäñK͵eA©¿Kì;nö³©[Kã5PÈÙZý‹ÿéë=ú ÜÞç$ú«­+pyj:Cd6’Êf¼3ΔIOëú¸…&ïtZës7Ñ?ë¤[ä_Ö¥yA9`C7ÉOõÊ)$Œ9LBVr“÷šºo´K.ï]ö“ó6íʵ.¡¥ËÛ¯ƒO”=&‚htŠÔ‹*¶×¥¦g0öyqjËŠúnøÈv£}Oä…^™ZÑÅ›‰»7 ¡m…¬fŠzS³ÄU”·?W¦Cošs‹n†+XéDRµ»„?ÿû­“³˜ÁûFž¤kB?Ïhó „°!„wJ/Á|òÙ¯PÉAä!½ƒY¨Ûøô#w2#iJ#½×dÍ¿xë|ÊB¤ÏŒ„<©¶­ó3ãåtþŸ]Æ7PóÝž>Ò¢¦±ÿò¤¼>ªÃ䲑eÊ7(S­ÃXp[ÉQD B™„KƒöjûOn½¨þgäßMŒVBÈv!<.—ý t~GÒŒ&«Wù]+> nåÅIäßøéákbïìšlÚæŸv×ڛ؈Î$ÅÒD5•¶‚P' ,Ž‹.ã®xHUð œ_o-'Ê¡Ê~7MÇYQÜÉn—_sBUšèÚvÓ¿„\7QºêÆ*úuiD4îÕ¼ ïÖÔIŸXàIДb-™m„ìBø°TÐB¿Ü$û­/NÈŸª\®~Á¦4íÁ-#ºZÌq2æK5ïGÚ|Än—æëD0@»+= { éV›JU¿y¸ýư@½†º@ô !Gß-ºTr.Ñ̶BÈv!”½ÿF×…jpV#Ø'âþ•´¼’éã}]þ­W¶÷˜é>ÏØ(llpíäØÂs¥%OÐè0e¡7šãà•PVÅØð®©ü9ÚÚ/SúR2xíCäR›W!仞†ê¬LæÜW?«¢Çw¥ûúPê’§›ÞEþ-Ã&¦Eã”w±šå2õ0OPpuýÃÙò/÷íU£P´^)Ú›*ì‘×(_–Ø3^²ïûî™9ùg!ä€È2j”²}eŠåþˆšâÔ¢hû¡‚„Ÿíšê¡%ÅÀ“U¨Ã #”£‚+£Æ¤«)–Ê›HU0·IüÐÉšq±Œ T‘š á.Ö$eë!{㸵ÎQ’ö¬³°w „°!„Ê<úí¸ÜÌ`Ëɲˆò΂†àV\Uù?Ôý¸qyýBÁJí’ÿrkA˜Çj–ì%ž§pn­uñvÁ¦/×á=bõË ‡€t:²d Ý–Ý×lºômvv ÈX!Œ˜r½ùû-«ñƒr€]Ó”öGÄâ–Ù»ú+“µ'K’ÜÙ AæC;ÜnJÁ•Õ7Èté‘fXǨ¸Šø¿¼Éj–Þ Ëåd!3Œ‹Gz\—{e±§ÔtN6Ñí*Å ‰é¹K}¢9â= äÎÖ³±ú&ñ—Ý{¢k†d5~BØ#tÂZ' u™ ñcí#ÉCûoÉWí¼Œ* ÂZV³T§©w9*‰Fr|Õ'vüa\MÆ\[î6®ª&³§„AVz~‰µ5ÊY" b}òäqÆ1Äì@³È«¹f죯±?!Ø…pæÙÀF¨{Så^n×”tDþf ?Gû³8ñ½¬f©´Hû\M¡Å.4F(ÒË/ñr]µ-?ל)•ãdöbYß¶d œ‘‚GQz[|‚^‡1ˆhårV2@E²ÛݬÆBÈv!<‰Ÿef\ ÐS'Ô6 ”^ÿ}i'Ô;mh>.%ÒZ™Œ Œ*âåÖ“DnÕÆÒnXOÏõBñß·˜×£ÈŸczA b=«ñƒr€]wâgùÅ÷<—}|hj ”Zÿ­} ¡Œ‹¨.Ò–+¶œÌfÙB:r B/yÓ1jñtå¥:ŠHE7S†²\Óp"d^R/;Y ½ãR…´Í²?ÉJ¥2Ù$ Ô4›!?P&ãŬÆBÈv!|?Ë)¸ùgÖö"É ä¦5C÷€¬‚Ð×ôC‰»3a®·g?³YޔޏNWÿòG#(£ú©9ý^ëëTyg"‡Ï + t(O|ö:ŸAŠg+(›X¹vÆäà†ìÉuúU†}aúDV†]ÉzkÅqi¶™Ì=ƒª-WÄwïÃBÙyžˆ*;Gc®³?!Ø…P¶qŸ@hQ[Yˆ7QA¨Ê°cçP>$Ø0Ë%ÊA]eögñ²Ê'/^5•$7IJ B¡§Ì#¢…äÑ9ðï.wÊÖDï€%nA¨Èlü „`¾ôqÆCrìBõÙŽ‚(ÅBâêÿV’ñØ0Ë¿Õs³ðì/ޣûT-œ‹{[í3×û3Ÿ­g|Hb6~B° áXAÀ­!am'Þ&8EÁ‹é™4 †[\âEvY×î ´âÐÍŸí¥ºãLlÜÇšYpñ*«íƒr€]?ËÎñós*%¶9{3õÉ4†96ìò ó´L­ÐÛ‚-Ѓ~›q“0þCÚ›ñ _€ æ «íƒr€]oÐÈÂàF—Í[?®8C„ÚNsv™b3ì6ÁíU·”QÆÄQ+gcñ‹! F—¢•Ò²Ú6¤˜•b©g ‡8$ºo‚üQïâ&VÛ!ä€Õ'èß¶áeW@¸ã¹bÃ0¿­~þ ú§uÊÙGp 2î—½í(ÙLD\vñ/ÒlPî=VÓ!ä€ !ü‡gîó?ÓÂ¥Ïò7;–9#´³Iñ› âÖ"”þ¢‘ á‰lxôÝg£Y-„6„ÍÁO3"žQBùolR†»碡MÙéçØ™Ëì¡ N5ÛCß@&ð?VË!ä€!DxÛà0=å¿Éilþ”Á]JZ ˜•—'ÉF¾w½öN% ñ›|Ä<„¶„ðVYdjwa×” >ÓG1‚ð+»]þæP3-née5ÍáÖ»FàÛ'€ŒÂu‹ÑöA9`KÑ_PPdWFšG]q‚ȵ¸Ž|ÝÒº’ƒª5ªÑº»>äQ#}§‘=È, „ kŒ5BØBô–>vâÜ[ÑzŸ_òÂR@fÏlü „°!„+ñÓ|t o{œ%¾m¦ê'v³<,¨}Iƒ?áô?6½qmôMGè7‰ ÕY&€S\b5~Bئ‚; ?ÐŒÅd.ó3ofè2vYS\Çè§¼6Ã=3¡£$°xî?9u'Ym„6„0FšA¬ÑìÆ „†­Á¼lÃ.Âû—!}©{‚;¯(þÕÿ2!²ŽfB :à6d(îÛ¬¶BÈv!Lų&okÂŒe%ìbÇ0[âê\FHYÚfŒèuÍÝ¡¯í#¡º8NqfÓ!ä»þ®!Ø…ðoú8a(°G„÷cìÕÀfæecHm8· 4ĉÜXÝù@V ³áƒr€]Óy[Ž-«ùò‰ÓLÊy; ½8‘½ÕCÌ?8BfÃ!ä€ ¯Ñü¼M w˜W¢Áܺ;”3‰õaʯ¯t”ÆgJ:’}š$fË!ä€ !„•'²'™ØÛÝʆe>ˆ÷¯²Aèg3Œ |n¼&ɱK€ ˆ„Õ'²26„poS­ÎVf7Ì…x÷ÎWÐ Î Y€·XM„6„Âm!RÙ.¯„F7J UÑÊt+æHÖ 4ʱÚ>!lá³¼- k°¤5g¶Ëi‚w‚|°œ­P%#>B(í‡à—4€Ð‘»õ÷2Ú>!láã|­ sŠ Âf»¬.O‘¿ß}:±–É¥4±¼ ’©Œ¶BÈB8ƒ·!aMœ ,f5Ë£xÿÃýÜ&„óÕ„êi4µíN]Ï`Fã!ä€ !\ÊÛ€0ÇsŽÕ,— B%”>9Ô5ŸI§©}íHî $îb4~BØÂyæôf6ËY‚Ð1´ õ…–†R;‡ž„ ë9!ÀkÈ hÌOÖ¾!„ž„AÃñeßù̵Vw9 hfa`B= $7'ÿF2›å4,`ø€ægpÎ88E{Fã!ä€ !¬ÀÛçqgÊYò”þî`5Ë÷袀õ¶‡1û¡æCÏ<8BFã!äÄÍÙÍ´3Ée$ÜMŽˆ]’;ÓrÍpFã!ä!)D‘®Î*ÌvY ï= Ò‘Pim ÈLd´}BØÂR¼ gˆf¶Ëxo\óЇi »0…ÑöA9`Cëó6$ ÜÉËl—/Óý£·B8# »ð£íƒrÀ†ŽãmH@C;(Ù×d›Dzë|\3 ¡á‰ð~~šÑöA9`COò3' ,É…Õ/¦ºÆ1µ1³]Ž ûð4ÖDo©~¹ŸÑöA9`C÷r4( lq%xçݼÂl—O9™p—²Cm„6„°+oCÂÖ…hzwVÀažg´}B° áňÀ¬˜Ål—_ñÎ*8Ì{Œ¶BÈv!ü·ቦÅ:¥¡[Ñdÿ—xeF<Íhû „`ÂGyöt±e˜ÂÀ'ygœ"†ÕôA9À.„=xö´e7Ìûñî#%áB«éƒr€]›ó6$ ìau ÇtäWp”ܬ¦BÈv!§Q Tžc7ÌdÞyG)Åjú „`‡yö|Ín˜±¼ó ŽRÕôA9À.„óyîäJa¶ËË!ŸŒÌ¢‡Õ,Ã8VÛ!仞€ø@h4`·ËÛ.'NíD"à{Xm„6"ËTçmI@˜ÓƆaÆñÎ,8 ûÊ+ „°!„/ò6% ìÛ¿1¼¸ú-»]þý@¶b³íƒrÀ†¾ÇÛ”€ðã!Ø…ð o;ÂMðìBì–ù¿ @Àº!Ø…ð8o;‘=¶L-ÞyGñ¤²Y>!Ø…ð3Þvd.²æ*Þ9‡ù…ÍôA9À.„#y›þıÚåÉxÞY‡YÇfû „`ÂŽ¼Í’Yíò!Þ9§y›ÍöA9À.„ux›þ´d4˼s N³„ÍøA9À.„5y›þôg4˹¼3 Žê³.ìBØž·áÏF³lË;£à8Œq•@9À.„ƒy›þ b4Ë¢¼3 ޳’ÍøA9À.„Ëx›þ<Ëfk·Ý¼3 Ž3žÍúA9À.„—`Íp Tæ³ÙÚyÞùçy€ÍúA9`#èv3Þv„=‡ÙL-œFìGw6ë!ä€ !œÁÛŽ€pÇÍj–yyçç>6ã!ä€ !|‰·áN$«Y–àSpœNlÆBÈBøo;Âf!LæSpœ6lÆBÈBø o;ÂÖÙP"ã´f3~BØÂ¼íw˜…Z„@ö£›ñƒrÀ†ŽæmG@ØÃj–•ygçN6ã!ä€ !ìÀÛŽ€°‡Õ,ëñÎ(8NO6ã!ä€ !,ÏÛŽ€p‡¹k*]@öã16ã!ä€ !ÌÇÛŽ€p'šÕ,ŸäSpœwØŒ„ìBxSämG@¸SÕ,_åSpœØŒ„ìBx•·aÏ»¬f¹‰wNÀq>a3~BØèuñ¶# Ìo³šåMÞYÇYËfü „`ÂC¼Íw˜Ë “¼³ Žó"›ñƒr€]ŸámF@ØsÕ,wóÎ)8N[6ã!ä»Âg Tf±š%¬ d?ÙŒ„ìBËÛŒ€°g(«YáSpœ6ã!仂¯ *­XÍ2?ã0.Ç BÈv!„i„@¨Ôd5KÞça ¬BÈB ó¨Àh•óÎ(dlÖBÈB ó(Èh•a ÈŽ°Y?!Ø…ÐÃÛŠ€°Ç}“ÍÖêóÎ(dlÖBÈv!ŒámE@øó9›­•àOÈØ¬„ìBXŠ·ácl¼ó ›õƒr€];ó¶" üÆfkåxç26ë!ä»NæmE@øÓÍÖšóÎ'dlÖBÈv!œÏÛŠ€ðg›­A\[ âa³~B° ᣼Í&±ÙÚtÞùç‰`.iA ¸üûÎÍëW|²aÛÞ³Î'Î.„ y›þ¬g³µ÷xçœZ„ÁreÅðVZWòB‡¬¼ìèØ…°(7û² 7ØlíkÞùç‰b³~B=ék»DÜ͈¶_¦;wv!Ì•évd7ƒ-º¼@v$›õƒêØÝÂô†6ØâØYØ…ÐH”ÀÑŒV9‡wFÀy °Y?¡–yV±==o8uv!ŒÊ4{²+IŒVùó”e³~B ³å{×|Ô̾޺kß®­_¯˜3¦c‚ü;£û]@ ÄyÜÅh•íxgœ§›õƒzÙå&7.÷Э·}6¤žRžl¿uæD°B=yLc´Ê&¼3 ÎÓ—ÍúAUÒë’ûÖÿ?鯿•R©Žœ‰]óp¶" ü™Âh•=xgœ§;›õƒªì"·m¢éæm¤uö…#gbÂxÎV„?w3Zå³¼3 ÎÓžÍúAUȤ-,&I̘ÛÙ`ÂܼÍ{j0Zå·¼3 ÎSÍúAUÚà»¶Îbûõ<‚P‹1­³÷×¶·-«³¥S„·aO)F›½ «@ÙjlÖB¨Rßµ“V;4„BŒiM ôxгç BuúxËÙ¶lÆB¨BÁ½jµCGöÉÉŸ¹<žlé Ê S²5m}Ç;§à8ƒØŒ„P…¸ÞgµCUæÙ™í^nÁÝÌ7ýgÞf„=½YmàUpš7Ùl„P¥7¾kÏ[l? B3GÎÄ~ÓÓx›ö,`¶ËçxgÆuÊé29cÈBB¸ß¶|šn¾}Þ>Ù‘3Ù¸é…yæ¸O3Ûå¹¼¼3 ÎÒÚù29CÈBBx5ß·²¿›l½BŒâߎœÉÆMèu–ÜcÃ0!î6½pmw¾Lβ¢©äÎE>óÁ¦«ï'ïsæD6núíH¾†„9‘‡lfZWÞÙ'at•!Ô’r½w®¶Ó¾» ùùÚÎy}¥uË;´>¯›>ƒ§ay¨$#®$óÎ/8G­kQ&gYIÑ©ªêŒ¯|gÛÎ÷vi×¼º×•®Ì‡Îcë¦×åa@@6¡Kš=Ó¼^œwŽÀ)*ŸÈ˜29ÈRBˆÎt³¸«íÎ9u[7=¥`¦Ù ÝèÊ\#VÍ-‘wžÀÚ_Ì 29ÈZBˆÐ¦Ú&7µþz‹0¤6±wÓÏ—ÈTë² îñ6Ûƒ„[¹äÕjIl°OÒ‡vJlBÒw?WÙïžÖxj‹s2hû¦§wƒR°O;;~2曬yRØÜ æÎ(f#g¢KNJ,Ý¢GÏG_Ýzø4ºrO hL;­óÎWÄ—ß´eô „œÝüæÈwÝY«ÒÛvýÆ7ÿ:œ¾í›~¢ŽË†xò—©›ß÷GÿçŠo¸ü›dmqæ®Ò¡ ¿T12Âqq÷KPôDr­AD5ýdlå|QÒךw÷³œ¨gãûQ¼V½ÿÕmTZ}”bLõ9Á[íõieätŠY‚Æâv•» ]í¡ÆåvÅ«·V,·„–9—x/@¬X%Æð²Ä²=_ÛC—üüoÏ~Õ6ü3.Éç†D¬tgÕ(å›K=¥»h“Kª»ÅÖ|ç’FoúnF§ò%òFil•'>ø›î‡Ë0-W‰鯹ŋꖈ uüúìÛpDý|;'ÅÞÓlª®Ü! î¨QsYŽat‡i­JôÄ%V,Wº€[ð$v™¶#Ŷ̓r ˜›þa‹òE $­Z½Ñð5¿ŒéÛùÞîýF?سS‡¶û¾8mHý;š š÷Õµ”=›vßRŽø¸_ý2%*Öo7hÚgû´µ£ôï—É“¯òÃ'ì8.-4üÛ´A}ǯ?µêÅLJ ¼£\Ë÷;çq‹®È Úß]½\¥ÖýZ×®Òdêñ¯–Ì_´pá‹÷4©TãÎa‹^›ñÊ܉½×®ÛúáÎe ­Þ°^É„RµF¾:î¾Öw=ñXå±¹‹öÞ³}þÿlËô&ù""£K6êÐcД÷WìxXÊÆ±Ÿ6lüéâʦEòþßœï7¬Z¹î…wŠÎSnðª/Þ}x÷jeŠ&”¨Xçî©IGëKÇFDÄWþêІwæMxâÍ=5Ëåvyò´xdèçÞûüóåŸï¿–¶¼U…„•:~øÁ—Ë?þþ89É•ýkßûzÿŽOW­Z0³M±˜Ø’ÝÖ®^ùñŽœþäÙõê48zܘ>]ŠçŠÉßd :2¢”[ÝùîlÞ°b¹â¥>|h÷šÓ¦¿³cÛ¯§,¼KZL¡Êw×i׫×U“J•¯Ø¬[§;ÊUïùuúŸ³îÛwtÿe’[Ž?†v-Ñ¥{סÓ~TïøyœmÒ¼ö›ûW~ðD«¤¤Æ/~¿îƒù‹—-}op§æùÝ‘]ÈÆÿvløòƒÙs^yå¹Á­·é2ysʉ-Ö­|ùÉGóÄÌe;þÛøþüÅ+¾}÷™!ONÿxÇŸ×ú{Õô×¾ÖȽ´nÁ 3k¿ðåèŠ×^xeé~éËå#êjÕ?uGÑ¢µŸ>‹?^Û°àÉC_úQ»Xõ±îÅòﳋŽÍœøbâC>³úhê–…ÆÍùôºudÇá[È’£Þ]°þçÍ‹Çx|öžëò7Ï{»c®ìßøý±Ûôãí«½9ïzþ³«_yjÂ;›Ï‘=7yt59êðŽ?öô/Ÿ»x‡Õ;t«mÛøö̉Ž{ñƒMäÎÝ<}håÜ©3F÷¬W!¹þÈ÷¶}òÆ”gßÝ{à»…Ï=;añº¿nX&>¾v×FeËÖí6gÓ¥”_–½öîæ3èßívÔs‰˜üS·#tãè‰4”þÏŸ×O½õĽ½'¯úcÓâ·>YòÞü÷¿Ç·êÄ+×쾌Ðîi}zMÙujõ¿¤úzt“*µ¿»váÜ6_G—6ŽÚç‘·7‘+ûïÇ?Ù¶uÚG¿|úêsc_z÷Otê‹÷æ.ùêàŠ‘õêÝ3ó·3û?;ãç£Ë†wèpߨgè×®QÍŠu»Lýfß¿6Ü0ªý åêÝJýæÙ¾Ý‡Ž]øîŒ‡õêØíùchqÏúµïí÷q‰QÑ¥_ZñÌÃߨúÇšçËÇED%´ûè¶ïãH=µ~ÖKs?éY«XÑ÷¼ðذǦ¬\óÌ]5šöšùÒ‹O—ö¸D—§Bÿ9¬žÿÖ‡í’âã ×Û£U½ºÝ_¿¢$pr×ÞûvüsÍ«ßߥÛà×|ߺd®rÛ’·£k&¹ÔË»Iá”~rË—Î|ïGhy›§&äH!L{}¬}â¡rýlF„ Tá§ñB5Þyp· Tç§¡ï<8 .Íïà‡©‡¯ixÅ¥}ÖpÕ„)„A‘(ßñ΃Ó„m¼óà4ùa'ï<8M.AØË;N)yçÁi°h凹…¯éÞ™È@Y! @ð„ÐB€† „a! „0<! @ÃB@axB€† „€Âð„0<! @= „áaxB€z@ÃÂð„0,!ô€† „áaXBè! @ð„ÐB€† „a! „0<! @ÃB@axB€† „€Âð„0<! @= „áaxB€z@ÃÂð„0,!ô€† „áaXBè! @ð„ÐB€† „a! „0<! @ÃB@axB€† „€Âð„0<! @= „áaxB€z@ÃÂð„0,!ô€† „áaXBè! @ð„ÐB€† „a! „0<! @ÃB@O[ÁsŠwœ¦¹y–wœ¦‘}wœ¦®w…wœ¦†û:ï<8M%!ßMÞypšd¡P ï±t•rM;•ôC¦ý:½¶•¿û‰1ô™vMñÛüG—ÓåõhsÓ‡+¿šÜW›Äq°2ªÓDvêÃjc–w™7ùžqíXû­î³ýMÓ¯œyW½rU彦ZS]oér«s§Î]»ðÅóªd¥o ¿Õ¤û:Ù¯XŸXúJ·¦¥;ˆ!S~>m+ôøìÕMè"‹-ÿ]y§›Ë{/>Æákòztþ\/çn”•c*ÿ0Šê4‘†šµ‡ôWnʸk­¤ªŠëWmùö²Ç³VÚk†ËZÕ‡•öšnM“õÞßwÖ^ßNV+ÿé3ÝšŠ¾´êG_)×ô¾µÃæu±v™zMuúæMvUµÈÊÙwº¹¼÷bdJæ´^­­ÜßfΕïù$;Md‡!j_»Ü>ôSnÒ¸¯¶¯‹g¿Ž»e§ÿUÝ%ë§VØiÊ5eõØj¶»ªsñÌJ;M¹&WÝQ*¶ L»¦§¬.{ÄÛeê5=-;ZX[ÛÓZ«YXaŸi×”S‚p†¼X×»«ßÈI|§%Ùi"; º½ÿžM Gb ÂM÷ÛUÖG,粸äï×6‹‹ëuY𭍬ÓtkZ.Co-®ç‘7TØkʯ“k¤Š/Ó®éNkgÄÛeÚ5Õígí¯çzwý-Îvšöë”S‚p˜õZU}U\ÿ‰µÞbU‚&²Ã ïû1á&Œ{M7¥šÆûÃç©ä"ï–ßÈ–É•õšnMS¥‚™ž ò7²šWa¯éÖäúGS¥ZS¦]Ó…¾Ï÷x¤\Óëò^›T\ÏÉÏ(?¬°Ó´_§$˜„ûZ¯Õ žõ7oËú7ž¼wĸ77á"¯¨N°ÃÊÕ„ñÖ0Ôj¹cS†[¿×KboAÉŸ°Y«IŽö¶öþ„ò°ìþ=ßc²VSA­ cìY¡A˜½šä¤¦ ‘È\MòGWïч‡ à?R™¹šaH.’—ênφ -­ ƒ<>°(-Î}/øìÿC§õï0çôÓN(„1×0½Z©C*=Âð¨ìþSï–\µÿÏôìÕ4DΚ›"ãy׳!{5üÌÚi¿\Xf±¦]¬Ý½ÑžÁšä¼ëK£ÁšaHêo¯y·ÈoüǺkµWV{¾\]¼º´‡ÕÓ¦Mû¦áÖ·ÃX­ ÂØkò[×C©æ³*w©ûd÷¾¿MË–Û kY¬éš.]ºœîÝðˆŒç[w5‹59$ÒÛ-È—a&kZ%û_\¶9‹5Í“Ý?U¾=‹5%à +¯ÝRï–ÁÖ†…••}•Ï‹Jzø¤4k¢:­g‡ñ Âøkò»ÉÚ>¢Â—˜:hР!¾-oÈ€ Ç«2YS‰K”÷Xi†kúFÍ?›/ ÂlÖôÕëùº¾çîß;õÏý­™¬éϲû9e›3YS2 By¥¶ñm¹W^ÍÂåjGê·AÏëÆŒÜQ/\23rÈ"ªÓèÆ,,¨ÉgVRál°²ûÙË[FMóä$»Á…µ ×”ëoíñ’|if´&¹Òàð){»±pšw&¼lÖ4ÚÚ×VegfÊfMÉ0$h½PÝ|[~'¯ó­]_¬Öù/z¹n¼žùÁBÞQFï0faA˜@M>2·Ä3Ž»>kjí§¯³²EÔô¹\ÊÕÔýº‘áš~euÝE>þ‚A˜ÑšFXݶT5ãŠÙ¬I~ÃÝÇúïçwÙ©Y›}Μ°Ä͚ۚ’aHžd½$Gú¶È<ÕΩ{ŸÉé=Ü«LgÈÌÕs=„¼!¢:ÜaÜB‚0‰š¼äD±> ß[ʲHÿ}þн’õšÖ-ùòŸœ×ÜÚK•{Š]†kú—ÕúÜ’@fµ¦ªÄ-…¶ŒÖtšÕm¯üòË܂ڌ(~CËhMÉ0$åÀ ¾-ú”ß×õâ•ÖR+Ï©Š/JÓBÞQFî0n!A˜DM99Ó<ê»xÌ‘ËéÝLY¯É½oM»ßºÛ²[Ózym†ëÅ@fµ¦>úÅÙîê·¬ýêÅËìùšžuÚ2Z“œO~ÂÜŽÞlïå&_FkJ†!Aø]ë5éïÛ"ó ª)²´Z&Kô]G{е¡{ ‡7DT§Qm±+ ÂDjòx®äßBr¿ÑGkö\`¯f¾¦BµÌÝ”ášn°ºþž=e‰?3[Ó®²·£ Š!Ó¨¶ö¤FY­é«ßÞöÔõM[;o¿®ÎÛ/«5%à 즂Ó;þS^;}„JÏüá»/Οd‹ïhzè"ªÓ¨¶Ø•a"5m”‰›’žH÷ƒ¾úßí._8뙯ÉýFxØä£ìÖ$7ãméœÄä¬ִZvvBñÈáJùÀWwéå¬ÖT¸k`·q_æòk^ú‘^éo¿û²ZS2 ByCø§nÖÄüA–d ÿÝVjå°ÈsþBÞQFµÅ®4©©HæF9¦²1×gÁ¥ö,ªû\Ø’ùšNìsxgjØ3œ+¶2[“¾oá.tþ ÌjM+ÆÿkïDaŸÔX»ê S#«5u³ßn7Nºµ¬þY/gµ¦d„rˆàDß}X[Ÿ0u¬µp±ÿáò¯ü>ÿ¦7DT§Qm±+ ÂDjr­í â¸‘P„õ÷n£ÿW -þ…žõš´uÓŸE§Ú•g¶&¹ï ßkýA˜ÙšJüXv¯ÿËjM=õ¿¢aÅ õ#ôbVkJ†!A(?åÛ¢OtÒ?åʉ‰ýÆøÈ¯·û{yCDuÕ»Ò L¤&—ÜŠµKÜ÷móz³‡ý—lÏ7=3^“kîž²÷WõrVk’žÛ-(¬ùƒ0«5•zAvÿ,eµ¦^²³}½~_¶èW.«5%à <ÃzY¾ãÛ2I^»diGêZiÞ¦úÕ×iT[ìJƒ0‘š\G[[~™H%Ú†ë툻?æû‡”éš¼>–i­NÒ‹­Iߌ÷YwÕ„­)ÄRÙ½>$«5';ïÝò¬ly,Ë5%à ¼ÂzY¶÷mѳZê…š†¿æ?•¶È7DT§Qm±+ ÂDj*˜mmhøM=F õŸ±ªÍÈÀ,Y®ÉOÎYh²>Ã5ý\ÙSÊ8üA˜ÑšÂ´)Ô™Õšä:Bÿ¿–ʙò\S2 Â1òJù¦”ý…’‰E‹ð×ü@²ZS2 B}{ׇ<rò·ît·–nª·‡£:j‹]i&R“Cæ&Þfnã¹Ir2?¡:"ì JFkÒ—k}ìÛ¤ïc£çËhM‘A˜ÑšB¬—ë'î‘¥¬Ö4Mv¿Þ·©u!ܳZS2 ÂüþÖ+sŽgýsy1íK@å·ß‹êí ä Õid[ÜJƒ0™šlÇ+}¢ÞI!÷EËlMŸ—¼8ù§ÜlÌhM?oå#'ÿTé%iÌhMsdgOø6½#›þ*K­)¿¢™Õù;Þ-óeÿú‰¬Ö” S‚ð:ùÅóùz‡µÞt¹^”{ˆìç;޾úUKà¾ÊaoˆˆN#ÛâV„ÉÔ¤-© yV\rr±î®ËBÛ2ZÓF¹JùZß&¹Mµž»+£5øO–ÉjMUðî²×[[Zê Y³ZSþVçC½ÆÉgÅ?d)³5%” ü›¼þÜÕ2ÿÞñöò[Òô’÷Á#­ íÓ¦‡½!":l‹[i&S“&G=TàžÕ±ù â{sVk’ë»x?^Vïlmé­³Z“Ÿ?³Z“Ü/¹‰gêü²¶ª0—XVkÊÿ¯ÕykÏygäT´õ¸3[S"L ÂÜ!ÖK³›;’ܰR½è4É{ãÏ%kµrÈûü@aoˆˆN#ÛâV„ÉÔ¤]jmøn<ã.u£Õy«2·òÌjMòY¤Fy6 )nÈjM~þ ÌjMÏËî(~ÑÉ)Þ·—3ZS~E;«ûSŠ*û¿ÕYVkJ„)AhÿøtŽ3ÇÂÛ2ס…¿}î—&÷Îcùܲ>-ðü°7DT§‘m1 ¹ S25IOrÖÙµÁ'Å¥¯Õù>—°¯„ÊhM+eNµšÇ «õ©é»:¸­ÉÏ„Y­)'_ÝÕ©…ó´Vë ÖNwÖ2Z““R?rÞmuú½×Ö9Š™Ùš’`LæN”¯ŸÜF¹vŒÜ Æ}•ü: †8_DÖÈ]U¯`h…¾!":l‹YH&SSÞ¾RÖ3©H¼rÛ©PöDÀÙ¬ÉùYFÿÌ7Ö@¾gÏ÷”Ó–Õš|A˜ÕšÞ•“DÕv÷ÎX•ßøñH9~­v/\%žÕšòëä&j·Ñórù¥OØ7£ø£Ó”Ùš’`LæËŸ)ªjÿ“{µÑo‡1ŦizJ¯.#f,]òÎýú®dÍ? >=ô Õid[¼B‚0¡šòùeÓü’'ÅcAxfÄÏdMÖÇÆÙNÍÚÖ8KÅ 3Z“O 3[Ó¤jçåiSeÿwûén[VkÊÑή¥ùÖNq·¹M™­)æa~æžžÖ&7{›Æ6ñðV—ž¯þ†ˆê4²-VaA˜PMùþÖ¶]âºß‡*\áÖ0Y¬É²úÿ°›ñüÝÑš¼‚A˜Ùš&ùHtíiËjMù¿wð»Æ;óhfkŠŸAA˜_~žûºïö’¿ibKïû¡íäÒ'—yCDuÙ§Ð L¦¦õòƒÀÉ1»ÄË*œ{´ Ö¤ýÑó¹QuÖL_[Vk** ÂÌÖôí%5î¨[ßå¿"<«5å—^Xåûúš2[SìL Â|~î-Gvn¶Cϳ_Øl™wŽûfi6ðë˜:nK\B5¥*«5å¦ÿâè}ÛÖ´ëöÇþlËjMQ2[ÓâGÿ«çN5;îîïJ.úÍlMùÿŒ:nŸmZtìsGÉÝo²[SÌÌ Â(ß<|Þ1Ý{ô¹x·i$>Ô” Ô” Ô´Å"F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F7D©{Ÿ­TygŶ—¯¥»•¥Û7î«Ú}Û^€x„@c{½‰:<ר;M7ó“”:£Ñk† ÙêÎJ½Üè{M9ëz*õDl»bEõZüõ×_¯Ží©·(utåcÚT)a~²RíWŶ N!P¯>Ö§û˜¸ž:¿¥R‹aP›è«yE-¬AíY_Û^Êaî`¥†Ç¶ N!P¯Xƒp R'Ä0¦JÈ·Ã~‰ô\>óS•j±0‘"zÅ„óš*õtƒª@*AX·›R·'²S B!P¯8ƒðJ¥Z¯‰cPH%ó×*µëúDö T† êc.·BèâXUt‚ðC«iR"{*CõŠ1ÇYëePH'óßQêÈDö T† ¼Ö¿ÿè¨Ûxâ“:ïÆ ÌÍœ4öŽ»š<'ü*ñÏ~{ǨõaO=T©ÝêÎÍ|æ»}),?rÓŸºgÔïÞßIÝ»“FÝ5î­u!U¼ñä½#ƽYú´ú‚л3¸ò…–<2GZm3ÊîH A½aár»‡:3‚=ç¹ÞÎ ÎoWØÖiè·Åç±6<—Ï/¸¨‰äAÈSÿe-^íßçªÛö¶ÒüÔ¿¶É3‡äóµ#ö´›öº¬ø„áÖ†'óù5÷8­¯Zìïñ£ÛÙ--Î}/´ÌÐ ô½žBË <„ª¬ÕÎsµyÖÊe¡REë7ñDW»©zcHšÕP^mþèö`‡Éü½ôö° i§Ç‹{xõ#OúÉÏڿز˳î3ì œˆ§ñ]O‡µWV{z¼8l"€ˆ ,Œ½žBË Ü„¿’ÿ=»~å>ÅJîö̳†ÍA8Ö÷÷}ì«f¯ËÖÒ4[vÿqªúÏ….t˜,±³$4{[‹¾É§'Vùºên_Û®ƒpæ¶Þ–ªÇ OÑA8¯½·qûyn‡+ûúw@ÈÕòåƒÐ{=…–¸/GËÊ~_Ÿóck=ü;*&‚pÜ¡?Ñ÷tÏØëOÖ_ ÷’_ßæŽ3FÒálë¿ö-#ÎÕëxÙíãG¶£bÂOj&“ϲ£¡ÉÊÒ§.±Ò£“wŸ“uœ´»|ÔèAëgª@” ¼¸«õÿZžuË/¯ØÏîïOÎs$;Üú‚6èÙ÷þ4ÊÁ¹…7©×{^7fôàŽzñàÒ‹5ÊaqìõZnàÞ ü¥ˆ7öï·6ܺ ¯Ð8BÀ¶L&kõ´}&ËÇ:|žtš|g¼Ì–l6qƒ½6½‹<°ðMIÂäGÖÿòû.ÜXúÔüi÷ìsÉÎÖ†ªaút—ÜS»HWúð£¡$ÍåËuË+z'©:%÷Vê¤zmã}ÒÖ¬ð-ì.YëlÿfW7^§üEI©eƒÐ7ö¨BË Ü„wÊâA¾Ÿ/ßVéϪ”"Û£òÁíþ~7«¹ç{–/Í–ÇMtŸö…¤JaÆ”!úËQSÏÕrþ ¼ÉZåÙçeòðñ…µ÷šÊ8YrªÞ[hY¬-¼Ù^®ÛNtO½@V§ÙËŸme-÷pg2›±ƒµZ='XjÙ ô=ªÐrwƒ0w³,î9ÇDzÖz\›à9³@êBÀv•õÁ½sñTŽ£åûŒ³ìK³k­•½<Ï;ÎZÿ™³l‡‰÷ªqž¨|n/‘´=§¸~«<[Ž%ÚAxf±ež¤PûË™ÂÖÿqÛæxöy¥|«ý´ø¼¥íŠ`©Aè{D¡e^ÂÜPYè¼BŽ¢Î îHAØä±^ÅÕ'x³ìK³ÿª®®äyždÏOœe&Ç{{õáîÖÚüb£Õ¬™[\ÿRž.·*ÔAXó¥§} Ñþ¡qxàxg®µ*Å]ÝÆZ¼Þ»ÿS¬ ݃¥–BïØ# -;p'sWéÎJÎX=ÓÚúûàF m!`»ÔúÞzYhSäÌ2—ƒpJÙ§®•_Ý<ç®üÍl_kÃ}y'û{[¾•£öˆ:?ô´àáTåOÚ|þO²eI`ÈåƒpJpkx¡enaÝ ùϱ¥gé\æ=Þ l.BÀ¦Orå×òŸÞÁK%ž·6ö< M!P›ÔÍó™ßþq÷£Þ„«†·ð<ì°ƒAx–¯OßSŸñézÀZÝ.t$„mý›Þ”Í–¥ˆ l„? t_6ýc/[hùÛAØòå|®¯,Œ 4¿ ý„>HAåÞ¹nïâGÿÂí|i¶ê0§¹ùçÜñûy:@„rhô;Ŷÿg­¶Çs¥_¹ô ¡z¾²ˆ ô—Çyî„å -?p„Û¾a-}*—nû•¿Y¾Jrh›‚ð›õà™…#Œ½íiÒüivªn:òwßð6!åd™Ŷ‰Öj“²‡F•ÿÖ ²Iï2"e&î_Õ_b°|¡å®ƒðM½8BOõ?j”µéôúÇ4.‚(‘ûè¶®:œ Ƽiöžlßí•âƒ7!?µVZÛô—¼ÿäCè |É·égÖ–ôRDv·–nª¿¾aD¡åî™kt}OY~Ú×|£ç+`³AaÖË%yê{Å›f?‘c…ï{¹ A¸Nν,Þ6þ3ÙÅTï£g=òÈ#2yµÂaÞ–Ü~nxEáÖÒEõ×  Œ(´üÀ½wŸ˜.Õî¼Ôû°Ë­-#ëиB@[ù‰ÅsÅBîëC{{Ù›f²|²÷‰6<ór/ÛâÏf9¹û»ïŒN™Ýæûy';yϹ”7¨;ôbDÞk-íç;¹úUˆ@­ ˆBËÜw?«eåïÃ~hmx&¸c m! Éïw…{8hr{BçÔHošu²–oð>±ç&á÷­µ7Šò+ÜËuPöÙö¤Û{ZdÆkõO½„o•R©Bî ß  Œ*´ìÀ}A¸ZºPõtqˆ ÎlB@ûB>´½ó`Ê|™{Û‹Þ4“/õ<ìj‚ðfkíŠr9…z¸¸þº¬»‡FÕNÅûÎËyšª¯½„99çõOBÕîdm8?Xkƒ‚0ªÐ²÷¡}íã^ÅcÁë¶Rª5·aÂf‡ ´ÛKð§ÇÔ_gœ Ì%Í SkÊ,fÝŠÇßÛZy#<‹³rNõ·¯—³<ÛÍ)¬ÖJŒµ’ÜpîGØí »!7º‰çW¹ˆ Ô÷€W·¸-¹ ‚ßsµaT¡eîBûV‰CÝÕ¿+®žÀæˆ lr&uÁZgmÕñª/’fÎ]qõ±Fus°qÃCÍub~K ›ݵ¥ÕJuô´Ž×_™œƒ…ËÏ–5}%'U«›>­Ë¯x¦^à<)*Wu–GqªX#§šª^%:4(# -7ð@.’«?(¬Žö¥4°¹ ›¾\@í~ç;‹×ýûõëÛÊÊwœ“gäºNÿXûí¿­åú›Qï?Î^³èÝ»ö”/FÖÿUMX¡ïÛP„Þ§ZŽ´V[s'HgÍþûoWü]Ï ªvзL’ ܾ¿žµSô,œ„ùiú»c—3–.yç~Ýcó’?„‘…–x ó¿•õƒË1õßÓËüϤ‡ ƒT@›NË`gƒ1þ]ó¶ýß>ÒV„¾§æó÷X‹“=Í {ø{kúšÞ,A¸ÓÚ~Þ–ï¹7Œ ÂüØ&þ«'åK4ì‚ú¨BË <„¹ȆÂÏ¢{)µKèuø@ªBÀ±áÇþÏöŽîEtoTyÓìîªâc:<ßÐ%*ýOÕ—Ô_åm_ÜË»Ëíì{ÐÛA˜ßxŸ;ãuËÅ_/£ƒ0?Ñ7Mv[oìütàÀ÷7–Ž=¢Ðr_qƒe­§/eÃö 2ó­^2 e!P{¬Kñ£}Çaž›ÔŽnáM³· _ÕºÞ¹ZVwvóá³W_}u¦¿SÿSó‡)µëFo{Ýx÷–UçÌq6ÚAh}ïzðØÎ-¶îÚï׋<ϘcíÄ{ƒúütkƒçxë¼sÜk6ðëW2öò…–x$¹õñõ? hl!PT÷Úm§Þ}ŸCO6Å7Àÿ> stream xÚÿü  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ™b~ endstream endobj 217 0 obj << /D [215 0 R /XYZ 132.768 705.06 null] >> endobj 66 0 obj << /D [215 0 R /XYZ 133.768 378.369 null] >> endobj 70 0 obj << /D [215 0 R /XYZ 133.768 306.351 null] >> endobj 214 0 obj << /Font << /F39 143 0 R /F8 147 0 R /F51 146 0 R /F70 160 0 R /F71 161 0 R /F58 148 0 R >> /XObject << /Im1 209 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI ] >> endobj 221 0 obj << /Length 2686 /Filter /FlateDecode >> stream xÚíZKsǾëW èJeQ1Ö;;ûL%©’X&eW,©,Ú>È:,^J–ÚH3¿>ýœ™%–’sÏÚyöôôtóMSÉäv’L®_$ò}uó⻫jRÇu‘“›õÄdU\štRäeœÚ|r³œ|ˆn¦•Úé,­ªh=5QÛí±RFG¨lV\Þ5s(Ñj=·­Ûî|àoPþᚥõP>ÍáÐÁ¯YLÓ2ú„"¾ÎLi¢ßÍxð´^@ca£­,°hиhpú ‹\Zr/t¦UtÍIìõÒPÕS?ýxóãdf²¸Î2øš¸ÎeãOµšYX»Áup[‰rغ¿À–Z×D+qÇQÖ¤A[(ÓX•{ÏöOg¹Í£«i•Á4ÙÑ Ç¬dÎÃV ¶©PÜ¢%{o¢[ìÈÆÔO£-ÐSñ[Ð ·ßt¢º)Ø\ ˆ­kMñbÔÙðç|=F§²×IÝ¡®Ö1µž4 ¢9ÜzG^Õö8é÷Ädðùl”Ù2úáè5éy&÷2¥Ã)œ¯&Ç‚K´GÝ·oÀ#6Pϵuõ'¨·ê.«èSÏ}{Ü2ö÷GnhÀŠ%µ–ì£â[Ù †“5qîñ‹ØìÐMyØÃF=Â#K$İ}åônG;“!-Ü¢zñù¶YzWùÒ¦m:r¨ÐH‹Z‘ 6·$ñ–ÛG'ÝËîÈMçRÙ±C€˜GôøÕùî*7&riWeÅÊY ’”"ÅD)8 `Vôn×¢²¬F@•úà{Å7ð{ÇU=Ck@?Z´®iªØVæ Z1/xTl–˜Â©áúý4Ïáôä1z±•CË!$A•4|÷WÁOk4Ä°ØøxŸpš›è­,Bp÷«•B”QŸOár*«æèmÄâáîÓªˆsS‚h÷sš—ñ?ôâZ(æ×­TÎí—gqׇˆbm–€¥C_ûΤdtw‡JÁîÂâ¡>ÀoK!§kÜÒßQ¼ijȃ»ËtÆ)4åüaÛ÷\Qh{2û¬)ÂŽÊ-C¸úQ]Ñ`$Ø– ßäX Š~DI„ 6uÊHX©¿$|û¬Å½$.¸}ç]2àH@•OÊ@ +¨À¿àÆI­ O196ýŠ3.Îeï-õšhàƒ™Óy éå·•é‚^(•¬éˆ‡ËltÖ;éÂæ5¾ô¡ù?ÀÏÀïïðËIª‰>²ãq&âãÀ¦òçbd ?Š h6eEêŒiýr‰þsÉ•yç·gQ3Zf«.çëpÄÊ•°a!ŽXÀÀ‘bˆ#8ª‘/ ]Ô=ÞŠY*zu^¹&(“B÷ä^dÌ7·wr-o‰Põ£lwĺs7s±)І pÀV× èŒJͧ ©O=Êj:+›´+ìX’ã`ñmAá³äNˆ$€T©¸›2k€‘k¯ŽA»ÒÆi](X]3ÚqÐ(››iY0ú5êvÿ&Vç2SQÃ-(®{9¢"_ÞÐöˆT(Iy³U[×!}¨)zî(¦qèbë©NÛ nèÁ7``m+F8Ç/à?½ð¢ºvW —ÅE<>Q½aô£ÈyõÃûiĉ<LËœlqÇÆ„»B/Í#²Q]m=P‹¢¥ÓŽ@W/‹Lü££;øúsçmÊ2.l¦çÝà¼cû~Ag¼ó“Â9YgnÆ Zh¹ŽÃŠŽ}‹mþr‡Pö*‰îsŽX¾ÓÔÆI©OåÁ1çý*¬ê’[n)æÚ¼#2…1UÈ‘`´òÝWv|[,‚¹nPËÒ:Ay¡Ï‘.à³Ôã.|ÃKMž~àηDL{ÚOy†Ò*ö”–¾ÅÏ57q–X=¤Ç PMôï-žÒW)b“šñÃŵ•A•eÔ,…X*Æ;Þóä݇€Šsv‰+‘¡ž€•E«×‘ˆ"Sâºà½‘pÐø¾Ýë–ÁJIç铇jOŠ £PjÍ_:)T~FîÉoË¢Jô\h>¯ô]¦„*3©€,Vw[w]RãøíYÖj!b¢„ˆb÷œ‘c³"NÓlüà~Âû¾aèY'•õ sV”µ#“¨=Ñ1 ­¶±MÊ‘—î|&": ÀGÿj&Ï£4ÿ 7~Fk7þ}§—ã—X> `džóç©Ô—I…ÏÈF@ò(³ßË”Æ_ä9º‚–—x2ò{/èQš·ÁZo¥üVÒ ë0t¹Ÿá÷‹½`Þ߯ŠrTüO¢gG† EÖw²ŒXhÂ…l¼ûß©æRÆbÜÜ÷Ðç)kþºäìû?óaÏÉm=1Yl³"•X²©Ìd˜ñJýg¹¥‡`™ñžJ¡¡aÝ ;ŒÅÌÀÏï¯FYjâ*‘ìÃË1Vw›À9Âóžž¡F¿0±;we5a)öÞRò¦¥Là‚»ÖîI~R¦^Ô.©…;Nd…ŒxpKá 5ÑÓ£p”0w&_ÄE‚9鈾vˆ<à„E2ä„ÐwR"›×Š‹çœ:‹ÜìWêx=ml«ÎÖ¦’Ò¥îîŠÏ[ÑÉe[öqBs·aÅÖÎ*Iä’ž2@ÜAÔo½Äìj®0ô$g63po•Ö ·oÖœhtkÏ~ƒÆo“Sòn‹û©ðz¹Â5“ºñÉWÉþ‚ƒìtLÌ,ŸË¿ÊJµKYã u†ž3ºJçA`£™^Ÿ=uéh'–lëÑg[ƒDîhö.Äx¼ä±|vÚ6S²NüŒ&ëˆÀ8 ›Ìdp¥¸*b‚"Ä‚,ºä¤êíÂ@x2”çO±‚v¹âÊÑãܟʺ”–͆<h‚‹›‘ÙÐle,Åúi´¿26®|ên4ddé–‹#!zn4Ÿ½o.×ËñB×ξUVJB œ³Ãø7§`›4†=Œ“¹nc¦lÓÊÝLÇ•Ëi˜ ×R=k ñæÏ'M/VÜ<ŒÈ´tÈ Å¦§œþ^h*6Ñ<åŒ]9ž/(LœÀå“hnœùåbæú’(Ü>—Ü/†›kº³™zÊÄ!®Ý–1E\Y·Ü·â“â;íévÃ-ŒP¤gD¦Ö݈£/Ê-¸oê!8¿C>æó;øœƒF“à8Nî6¸¦ùû@- :¦ã´(ª Qá®ÔòDŸx&;+á6Þq›wÊGÅÌÃ¹É =„`Bá•·s:¥uWáÖåÅØ{{} 8ì´ü òöÐ8 L3ct&êŒe]õ¡8èTG¯Ǽ^ WBvës/u„º×Pƒm0¶—1½"ëRÚ6"éY°¬g8éAs2Bò_k°²;=á¨{Qè(´nC}ñmÇ€³ü~/„]^Êä:(_åé»út|ðêùši>Èï"в“\ýøuÓì±·Sÿh–M}Ùrú|0IVFßx[Ÿä˜çÎRÔÕú÷Õf ‡}/9£¯µúª ý#ÏNq†ûßOþ+@Qäk4'±2ß g|óâ¿Ú‚Š endstream endobj 220 0 obj << /Type /Page /Contents 221 0 R /Resources 219 0 R /MediaBox [0 0 612 792] /Parent 190 0 R >> endobj 222 0 obj << /D [220 0 R /XYZ 132.768 705.06 null] >> endobj 74 0 obj << /D [220 0 R /XYZ 133.768 593.559 null] >> endobj 78 0 obj << /D [220 0 R /XYZ 133.768 356.668 null] >> endobj 82 0 obj << /D [220 0 R /XYZ 133.768 269.351 null] >> endobj 219 0 obj << /Font << /F8 147 0 R /F51 146 0 R /F58 148 0 R /F71 161 0 R /F39 143 0 R /F70 160 0 R >> /ProcSet [ /PDF /Text ] >> endobj 227 0 obj << /Length 2478 /Filter /FlateDecode >> stream xÚYI“ÛÆ¾Ï¯`éÆ"ÔÝØUQª"Y’E•hèä`û’3\F¨±þ}ÞÖÆBÊòÐèåmý½ï5Õl;S³÷7J7/Þå³",R“Ζw3ça¦Í,M²ÐDÉl¹™ýüwžÇA5_ĉÚ¹î᪎ø®‚õé87yðyn2袃ºåvׇáã®¶ŸçЖ«ÛSMt°áŽe#÷ù¯Ë¿½x—ô„Ëâ0Ö HNbýg'CŸîì÷t¨tl»žVóEÿÃÞk‘ð•¨9.Dë=–(H+b®Ïð³Ç¯µU”ü ó…I­V§» )ƨ0Ê¢ÙBë°HĆ?ÂØsT츱§¤ÎÃÔ$¤Ö(²fûE‘!aOøMZ =؋׆²|b‚Í÷¨`[ŽÅHÒÐĹŠ96bò¸Æñ!Ê´¯¸NL¨ò ÑˆâL16HiÜÁµ”w g|àn†Ç?¾3IM¬oàú^F¶r_Ú qHge÷y(Ã6(»nb^\ßjìOºë\ÏàúNîÒ}-_{âÚ®þ7í†ÁĽ(ùn¾ÐQ ³m'”¯x¡W|{&sne΢/N):}œ0ÉfdAâwÐòW¸þ×-\o­eØãÊó¸W§,ýï÷Ø(âR&ýˆCÐ1mO`æh÷>‡#÷EŸžv³`Ó‘‡•-¿¬x/Ó3š¢ÂqåyOÒñj4”]v¶S6üyj·™8 s•Y Þÿ®í¾ˆTFàü^Œ¶}ËÆ œ2^6ŽÃ4‰ú›¼sõ×69lX;ôP¢iÁ*‘1`¡Ù^"GÜF@ X_¬!ñù;4h²¯?Žm¾çä?¡KõEçH1­L«Â­ÃwHš…ifúöîTO#Rð=JcRª¶RÕömÃ]ÉÜÑf; \lZ“A*ÄêLQZó;VSöIc@lB×Ñj¤u ‘”ç—Êû´“¤¶çw’¥²JDž×ᥡìâ«kU('sž*ÂT ùz‚VabôÅ­´Øwl'Øiª(.™iœXÆ‘¯Â"w™ñÉýr:Óâ £†ƒ%A£e0ï{ºd¨CéÁ³Û(Áî×8†ÒÖ¨¸WFölÐ:Ÿ|äÃü!%X£Ð”i´d記ñFv@i›&ŒCèj çÀrÁkÎ\¸K̹ì‚è…¨½Çu²$X‘6÷z¡ÜÕ„‡1;䔼ևÊö„FéÌͬ¬êôüáãí;~Z‰¥Žû°åuYÕpCYËà~ØÒ§†—,»•)<ÈTâ'S€dü؉öÏDúÀS§rã ‹+z)\’ eeyäs`|ýé fÔ7øËÖF“4 .Ô,`EÏŸÝöLw€„&x]Iñ<5E,‚â½õ ç2Ô;G¶Å«IO«<-+Æ®ž¼Yª)¶BfÞÚ<‹ñFtf¿9¢zßë/@ÌÑ L°¨Çý®{¶°J´–nsÿ¾›…|dÑ,ŠÄî¨ZÄaV8T]yÍÆ9šñý$á󦱃ŽIl€xDZ™dÁGJ­V'ÖwÀ~¿M΋wŒ†Ž!ŽÉ²Ÿc§¨ô7¬ñ³°Ò_-y¤IÿÄ·…|T=f™OËAAj>­›Œ?c(K3AÂEÛI|­K¢Œ-ï( MÒ€ñšb×$°3ÈÞMÃаåáPîùk#…ßzç\HÝv2Ú"¶ ö }Ç÷^ú"ÇádSÑ>‡ßqÅ©ÅïÈt„;!èNˆ*9ä>îO⌧ÛÎ?Ðë¡áV\¦æ "tG>%5Nñ˜:4PܼÛû0+0ÌÒú|_~ÛÔ9ƺr|]-·Õ4¼ d4 Û€§Ž 3¼ é„#Ê#Y¬œbû}ŒâÎ ¼š +:Ûo%nÁ½äc¿‡~+¶ž‡à\™™L ÁwFKCì>:´·èºÙ¹Í=‚:¸q˜rG n[ê¸XÎ…–ž¶5G¨³Àš¿–{›kY¢lwþnÉã.Iy ÍO¶¼Zñ;QùÅô»ù©vZW¯IpÜZ–k–+‡Ù儹nô yŸš=ÌìÓßo¨'P*8Žw/µ’‹_ÂõB®í@ má&Hµ–6[^œeüZæØ1öÆEG;¤‡­²—²‡V¢š+êÜqZ?䊨ƃd‘ô“E†<¯è÷ƒ¨ÒN$ “‡Eæ²YG¥by¶ÉŸýxæÝ€ˆ4¥’¬É¶g©SíxkÊ&'êÚTe§<}拪ˆ{±KŠhc½Mš‡]…F¸sKàÃUš6¡ÒºŽm»=¢qÌ8ZŸÅGë²­¸™€‘:R’V%qN°S­!MG½#iåqbI¥@õ›„IE¥´¬å¤ÓÖÄÜŠfÙ,#n¸QræÅ8‹Kt 3—uÇ“àU+õÓ¢RRˆˆcÒµ&³c7rh…g°¿—‚h&ÏHóòŽÞbKêŽj=fŠÈ‡kCý­´í^ELÿAbT‘Œ˜ÝÔÿ¶˜ï¶Ð7EÌóN¯á6³ÿëôuœú_'íþ×QqVL–Õ¯äþÇ"«'èÐ׸õjδ¢îÀ°ôž ¸º¨ùPÆAà«æs%WÃÀWÎ 'ÆIjæáNrèñlOÿhæFf‘¬.ÇMÌI„ÃvçM»nB/áYüìñö™NSHéPàEÀKS)quÔëôvyóZé3¶ endstream endobj 226 0 obj << /Type /Page /Contents 227 0 R /Resources 225 0 R /MediaBox [0 0 612 792] /Parent 229 0 R /Annots [ 223 0 R ] >> endobj 223 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [218.231 341.834 424.317 352.952] /Subtype/Link/A<> >> endobj 228 0 obj << /D [226 0 R /XYZ 132.768 705.06 null] >> endobj 86 0 obj << /D [226 0 R /XYZ 133.768 529.799 null] >> endobj 90 0 obj << /D [226 0 R /XYZ 133.768 408.693 null] >> endobj 94 0 obj << /D [226 0 R /XYZ 133.768 281.366 null] >> endobj 225 0 obj << /Font << /F8 147 0 R /F58 148 0 R /F71 161 0 R /F70 160 0 R /F39 143 0 R /F51 146 0 R >> /ProcSet [ /PDF /Text ] >> endobj 235 0 obj << /Length 2706 /Filter /FlateDecode >> stream xÚåÛrÛÆõ]_ÁñCNEXÜ3u;‰d¹®ÓdÓãé¤}€HˆdE ZV¿>çºXÐe2îS@bwΞûe7-FÁèíYpôÿýôìâ:~‘št4½…qâI4J“Ì7Q2šÎG¿x¡?þ÷ôoö£Ñ/“¸(¼érz®\\gƒ#Šü´”>>Ô žFþ§ð”ðÜÀ³& ¡÷xò¾‡ç±º„e©_…‹´©æãI”G^y3ž˜Ô«Ç&ó>Mh`>öV´+ƒðÌñÜÚ…ÖnáµÆ]Ïa\¤^¹¼;¡†#¶9Ò((gõF\Cj¶¸>AºG“"óó,MÂd)2œ•- P½IèÝã'—¸q’ò;I††¶®6u«3¡÷ñòÃ%¿ády³î€o\Zï$­ü+HEÚ: G¨œ`t7Ò·÷gG*4aá§a¦â^ ¥ø T¾…çBž…èmK»£Dxì‹N]Ýû,ÅÞP%ò=Þ™àf¹‚Å+ÙéBdµxÄ¢šžÅÙxƒ-¥Ê(TÚ:Ú2?5¨ÅÜ“”aÍ 'üs öP@Þ™A‹È½CCÒ¢‰;+T Ï‘ªQu¬•Ñ#,Ô·@7ÝŠzË"¹ãË-‰Ì”$Á*j¯÷¼Žôp}rŒ*dÐG´kÙòà®Pe¡ñ3cú »Çï€jI~“8Ž * ‘‘eüyà‰–d¯‘7—åR=¦œWÔã—(µ$ÍW±nó¼Û,WkžáˆP­­ØÏyÞ~±CÌäÃU-¨4ÛèÄ”}Ç¢ASxú3YìêO‡=ýá䌃L´–AæWmdA&Ú•xÞºSc€ýJÔ~¿\‘ n–¼°ê`ÔøLQ¬l„AÙ›¬‹u‡`o`âÇËŸà÷êÍ£qjYˆ]qwzƒµv,&<«ÄÏ;C!Ù‰NÔés+–¦åÕr-FlªÙ±îg¸Ñ­„yÅZ¶Ý s˜'|RñÂf<¨øO,T2¯8-¬õ½§ý8Í!X×aÕ7 \ò_£rZˆÊ‘ û8Q#Äúa ¹ „—$¬Œ„…{lÔÿ9\µ¼ÒÙç@þ?6±ÆÇö$¼ž$ç‰)@PÚƒxÚk¹gÁRÛw:fk€$‡"£hYõC‚3ì¾NY !_Jи×à 2<3é 9Íc¡@ëɣc¢! z%Ñ?Ì»H {µø…LìJšÚPüÒâ%dú@o5¬y|*ܬì”DPMqs ’‡½XV5ïv›Ù:GeƒP+"öI‡wtUYƒÆm÷âY‹Š’ߦzIPMŸª4'q•ܦ>È>0愉ó´í¦ƒ#vEvW –‹ Yóë\r2ȃRE) e¹/)ŠÞñŒÈ“6À‹¥üÁù’ƒ)U…n‚yLŒ”ó“¬_ÿeÞV#…<Éh{^ÓOpŸŠ*˃rÙðŠf:Å[uïýF$M& E2Œ¶“qÙÑr xÞ¯t³QA_ sŽø!G¾…NɇUl´:©Í€æ˜ûJ2ŽÁ‚‹xûQÅïkŠÏ &ƒfµé§k´Yä€9cȽu\°þNKdj~(ÅË¡÷”ÊDE1hy8ß³bÈ¥`ö犪‰x*Iàïï(úí;\ªk°`RtÒåb€(5 À;+ ê…°È{I%làåYÄ1¤ÌÏB‡øEFê킯ÂN±IX[¸bý+cO’üØÜñÜNb8rN-ÛºÛ¡9pz ¥“°;ÕŒÁ[GTTrzTZ¡„MÓÌû^0öë3ú”Š–ó!Ž)K $OX y5&‰‡WXJ•Ô¡½srœ 3Tž¨„m-¼Vëjúi²”j¶”êˆÝ;í£®¬:O d7^\Gň™3œÞ±a‚~Íd~M¸&ÄÐ3c‚‰½7_¤HØì$û$I«Ø*NrèÝ®~,µ ®“ëÒt·ÃäÄù†·Ø:U¼Ÿ9D¤ä$æ ZQWXKÉ„ûHlÂWqwTPH“ùEœ3Ñïa9I™ð(K¼KħNã´Å*r,ÂÜòP|ZSSô‹äI ¾±ã–(óþÓµL:ya72÷ó¢n\;ñ™tãs™ëÎ2B&E`ZéÔkY_âqDsOôÔièçQÔë©]PeÁ²‹Y£6Ü?>ȹ@øyÚ÷«%3uº{­YðcŒ·=¨Âh5jêA˜ž¤[¨»WU# ?^~ ÆíZWqÃf7'§,72‘œ¶Æ´9¸›nÒÉd(ˆ4¨’ýŠŠmòOìØâô(f˜8c±<ôÒÀž\ÜÉ , {«í\ 9€=@Ìþ`x0«4fɶZZoyˆX6Š»$–µ`þ/VV@T<è©–Ze݃ h¢Ê¡ü¸îœO%â(ॲ9¸eLc+›^ÆÄé[fZczÃY« „'Íà'lšÊF¸,`³)¸#‘ê— ¿X-Vûú¶«„„kÄ,Iªµ§‚GªÞ©¦» OÛ}Ã8lÈ~ñ‘]jü$M^#îÇwâ…ž¯éÜZNót¼Iû'j±® Ùã 866‡Þ_„5P\{ æšZàAFxbyÏžˆ3& ü$?9º›dQæýtÓÁFõÃ89íWJçHÜJ’Î ¹UsT˜ª[Ñ:7±”•8ì4Ò¢Ra¶ìi1¶škbžÆSŒ7¤1¶‡zQä›à1‡mQÿËEX|+Ý{èHí,óã"fžÿ ÙÇ8}´èúÎÑkiuF âW|}%V²Œ0”Y> Ì•À!ѯ†,Þ¡äø´öGÉ{±-Îù¡÷Wù¦•а;?Ey%8nÅnÕT®[{~Lý[xýùŠwO% iØLeîœ1¼{ƒ÷Q7R·ÊÉ¥,¦c°ÈyÒîL„þ—ņ o0[‡-Ýj)Çú2¸q*{­eî,Âà3$µŽQùbâ®ê}15 _6íTzL² ¹}ä’Aèú}7\.gÏKÓªoÈ‘_ Ï;øqó"™÷PƧ&ŽL™±¿Üô{„KA }Þÿ_j‡¿GézoÄ9èÿOé‰U:mzûðõ4uÜ=}c$}ãÕŠäW!¡}k'Èõ²zŸ–«.,y8‘Ã2,Üah6Ã9¾„Š™ôuå,ï+FòåïÔÐ$n¶fX{45Ô:ÞòÝ1²M­"f¼}YŸø•Ôyï )æ‚ø fïÜ‹X8¯¦ÂŸº§MmoPöÚõàYŠIcçh °ônKðóãËHK“ ¯¨‘Ÿ ´´BF ¥ÑZ@õ~À´lá’íÚkÌ““ŽLÎét©wz9¬ ]—7˺f ¹å†jVp¸\·çqÃÉÝ™-Ó+n'‹ú£âОOCJza%e~~ý«÷ð«_±syï¼–ë Ôhnøƒì|#0ýüx¹o2{¬6ÅÕ=ˆ(É£Žª^ð mÞ®„I>çÔk2*§¹.ª]K›ÑþñUF˜¦~ž%x æç¹Ä‹0î½™žý¬# endstream endobj 234 0 obj << /Type /Page /Contents 235 0 R /Resources 233 0 R /MediaBox [0 0 612 792] /Parent 229 0 R /Annots [ 224 0 R 238 0 R 230 0 R 231 0 R 232 0 R ] >> endobj 224 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [377.295 641.793 478.476 653.654] /Subtype/Link/A<> >> endobj 238 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [157.679 629.838 264.578 641.699] /Subtype/Link/A<> >> endobj 230 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [241.799 372.025 405.624 383.886] /Subtype/Link/A<> >> endobj 231 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [195.337 324.205 447.91 336.065] /Subtype/Link/A<> >> endobj 232 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [170.081 128 470.136 139.118] /Subtype/Link/A<> >> endobj 236 0 obj << /D [234 0 R /XYZ 132.768 705.06 null] >> endobj 237 0 obj << /D [234 0 R /XYZ 133.768 667.198 null] >> endobj 239 0 obj << /D [234 0 R /XYZ 133.768 627.734 null] >> endobj 240 0 obj << /D [234 0 R /XYZ 133.768 598.181 null] >> endobj 241 0 obj << /D [234 0 R /XYZ 133.768 567.512 null] >> endobj 242 0 obj << /D [234 0 R /XYZ 133.768 537.402 null] >> endobj 243 0 obj << /D [234 0 R /XYZ 133.768 507.849 null] >> endobj 98 0 obj << /D [234 0 R /XYZ 133.768 419.298 null] >> endobj 102 0 obj << /D [234 0 R /XYZ 133.768 200.568 null] >> endobj 233 0 obj << /Font << /F8 147 0 R /F70 160 0 R /F39 143 0 R /F71 161 0 R >> /ProcSet [ /PDF /Text ] >> endobj 246 0 obj << /Length 1449 /Filter /FlateDecode >> stream xÚÅXÙnã6}ÏWÓ4µX ډǓI1ISÇ-Z¤Á@‰—ñXv2AÑï%y(]É’—A>¢¨»œ»’”Ó7œÆù‘ƒçYÿèýǶۈí8a£?j¸žg·Ã¨m[xA£?hÜ6jYðš³–Û|£qCcH#ŘÐXИk²hjéé=M—øú ê!ÖvHùË z£‡ÛºëÿLp-×µã i !s0Ïðî݈¡¡ üMiHù.˜Æ»nÐv›ßi>IÛVC½®`kBãÆ“Ò¯>MrSÁ×PÝg^RŸMà[|Q¥Ì†‘ óMºamçÕWæÕ5ÈR<û •¸§ ÿt&Úoß”­Ñç^@´YŠ©åD?FÐóº3&‰ ‚š f%W&oY\ZÀ$—eR]~:ÎÅkyêu1h RÞK1ôYíp'„•N˜1Äo9¬r`Ò"âaNm”MÄÃòl¿œÚ’·ŠŒW~ŒçE¨€ã¼Ð–$qX|uòTºÛbQ LÏÓbÂVœ)!Õ笌K¹\'%ï=WÁû¾ey®ïe±›£#™à1Éå0ÿ¿å{\Ÿ?nsÅÎÂ7ù‡Ñ¼ÿèÅ ×·=?r #OØ‘–ÊÄA³cð=L× ¯«Dl$váÚ‘iö¾ªt/ p’â%…5kSÌDI(gk‡É¯±­]mÛ5ô]³XþùqZŠg­Ïãj\’ÿF¯ä-ÏjGA¼‘G]ļ ›>•b—c±x!ÅBrë¡ p7p†g¾]ÈN,«º€í\äXL­²uccÁת§ ©˜f¸bg/s ä7ö¤xz.Ôô8³wœÔ…•yÐÈX²vfZÚ”ö#Çogg)ƒ’¶;º±Òµd'tsÑÒgXÍkh>@æ £a·Œ5;žO™ŠS›°ÿÆîjš1zsžÜj‹^­ˆÌ‚1³ûßÛ/:[ò&œ!7ëþ¨Ø($~Wš0Ú”åu²:X+ÿIù‚¹ýÀξոZì³,ÛÉŽ»7¤3vJIÙ=eÂî^)tˆCtø¹ŽeÍýÇVÞØ©‰Û"˜NgÍë¼Â?¦"zìWÏ®ÏìM}ìÀæúþ éïÅf;fÇVXY]ì‰U샨X®ÆæONmZËf˜9Î0ÈãyämÛ„œ\0Oø!N´¦­j’Ư býf÷ˆã,ÿŸtÃtÌPØCÖÆ«¬N!ÙŸæâEÑ C;jÔc;ŠpÓvƒG·ô/K~ï| endstream endobj 245 0 obj << /Type /Page /Contents 246 0 R /Resources 244 0 R /MediaBox [0 0 612 792] /Parent 229 0 R >> endobj 247 0 obj << /D [245 0 R /XYZ 132.768 705.06 null] >> endobj 106 0 obj << /D [245 0 R /XYZ 133.768 533.9 null] >> endobj 244 0 obj << /Font << /F71 161 0 R /F39 143 0 R /F8 147 0 R /F51 146 0 R /F70 160 0 R >> /ProcSet [ /PDF /Text ] >> endobj 250 0 obj << /Length 568 /Filter /FlateDecode >> stream xÚ¥VMo›@½ûWìÑ9@öÃ,[í4i«öЄJ•’È‚„&H®]7ªúë;˜Ì® ­ÔÃÓ ûÞì| )ž…×3‰u™Íίb)Ò0µÚŠì›PÆ„±M„âP›HdOân~w¦æŠ  gA¤Íü…ÌgÂO¼2ÀÂû5Ž„„'BAX³½æœìí‡ìù(¦‘§kÝ™{h7çÞA§±K¶ÿ_z‹Aï†Ì[ÂgÂGBE8@kíðµÇ'¸£û’Ì%á½ÇÕøâ);ð¼!s ìà_޵Â^óî1© §˜Þ¶t4­«šKÆ]@¯fqÑŒ[Ÿäöæ~$\ƒw‹u÷Ðä±K|-mÂTµRpæ¨ò¸%_A™·X¶øø;>®Qà9ÄËö³{IìnÊ! lr`ç_z'TCÒ„áâèwj­NljÅèõ^²Üw®òÞÈávžízæ a®öºÞîÒÂkŰzOÇò©ÝþYaì18_Š–X ª±4.oÍÒsÀýwШ=5ZãÌoÖ÷_Éü„ž_³{§ˆIàpð±^Ï'z´ô|]°zõ•õÁæÒ¹öï/á³ãc½]³9^±¾«½X ój„3q9ùkÜóï|,ÿ©Ë×ÕT×¼¯àßx3ÈàzA?›ƒ‰“ƒÈXQýs”Û´¿X púÉûâšàd ö›%ª`¾žœÛŽýOÀùU¬ “8Ñ ý Ä­°²Î‘·Ù쪼 endstream endobj 249 0 obj << /Type /Page /Contents 250 0 R /Resources 248 0 R /MediaBox [0 0 612 792] /Parent 229 0 R >> endobj 251 0 obj << /D [249 0 R /XYZ 132.768 705.06 null] >> endobj 248 0 obj << /Font << /F70 160 0 R /F8 147 0 R >> /ProcSet [ /PDF /Text ] >> endobj 252 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 253 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 254 0 obj [895.3 896.1 471.7 610.6 895 697.8 1072.8 896.1 855 787.2 855 859.4 650 796.1 880.8 865.5 1160 865.5 865.5 708.9 356.1 620.6 356.1 591.1 355.6 355.6 591.1 532.2 532.2 591.1 532.2 400 532.2 591.1 355.6 355.6 532.2 296.7 944.4 650 591.1 591.1 532.2 501.7 486.9] endobj 255 0 obj [613.3 562.2 587.8 881.7 894.4 306.7 332.2 511.1 511.1 511.1 511.1 511.1 831.3 460 536.7 715.6 715.6 511.1 882.8 985 766.7 255.6 306.7 514.4 817.8 769.1 817.8 766.7 306.7 408.9 408.9 511.1 766.7 306.7 357.8 306.7 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 306.7 306.7 306.7 766.7 511.1 511.1 766.7 743.3 703.9 715.6 755 678.3 652.8 773.6 743.3 385.6 525 768.9 627.2 896.7 743.3 766.7 678.3 766.7 729.4 562.2 715.6 743.3 743.3 998.9 743.3 743.3 613.3 306.7 514.4 306.7 511.1 306.7 306.7 511.1 460 460 511.1 460 306.7 460 511.1 306.7 306.7 460 255.6 817.8 562.2 511.1 511.1 460 421.7 408.9 332.2 536.7 460 664.4 463.9 485.6] endobj 256 0 obj [583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4] endobj 257 0 obj [319.4 575 575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.6 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6 606.9 606.9] endobj 258 0 obj [272 326.4 272 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544 516.8 707.2] endobj 259 0 obj [312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.3 531.3 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.8 312.5 937.5 625 562.5 625 593.8 459.5 443.8 437.5 625 593.8 812.5 593.8 593.8] endobj 260 0 obj [667.6 693.3 693.3 954.5 693.3 693.3 563.1 249.6 458.6 249.6 458.6 249.6 249.6 458.6 510.9 406.4 510.9 406.4 275.8 458.6 510.9 249.6 275.8 484.7 249.6 772.1 510.9 458.6 510.9] endobj 261 0 obj << /Length1 2121 /Length2 17232 /Length3 0 /Length 18495 /Filter /FlateDecode >> stream xÚŒ÷P]ËÖ† ãîî,ÜÝÝÝÝ…; ÷àš`Á!î$Xp·àîîn¹ì}$û|ÿ_uoQóé¡ow9 *2U &1Kgs ´³ˆ‰™• ¡$®ËÆ `eå`feeG ¢Ò´9ÿ³Ž@¥ ts·uvâÿ‡‡„Ð ô¾&izwTrvÈ{8Ø8lÜül<ü¬¬vVV¾ÿ8:»ñ$Í>Æ¿ÃbŽ@7[ 3'€’Èèø^ÑÂÌ ála ùüO ZAÈ…Ÿ…ÅËË‹ÙÌÑÙÙÍZ˜Žàe ²¨Ýnž@KÀ_’ÊfŽÀKcF hÚØºÿË álò2sÞl-€Nîï!N–@7À{u€†œ"@Åèô/gÅ90þ½96f¶ÿ¦ûwô_‰lþ6³°pvt1sò±u²XÙ:*ÒŠÌ o#ÀÌÉò/G3wç÷x3O3[3ów‡¿[7H‹©ÌÞþ[Ÿ»…›­ ÈÙÝÖá/,¥yßf)'K gGG Èá¯þ$mÝ€ïûîÃòïõwröròûYÙ:YZý%ÃÒÃ…EËÉÖÕ('ùoŸ÷%„?kÖ@€‹•••‡›t½-lXþ* éãüÛÈö×ò»†?g€Õ» `€­ðý‚Ÿ»™'róøýÓð¿„Àư´µÌÖ¶N²¿/­þÅïçïfë 0`}¿~lÖ¿~þûdô~Ã,|þ¸ÿ}Ä,jêêê² ÿ–ü_£¸¸³7À‰‹ÀÄÎÅ `cãæð¼?üožÿîÀÔÿ½ªjfûïîþ‘QÎÉÊÀ÷/ï»÷!žÿ¾´ÿ:ÀÿVPv~¿Ï@íŸëoÈÊÅjñþ‹íÿóüòÿïîÿ•åÿõúÿߎ¤=þ¶ÓþËáÿÇnæhëàóo÷ûìzŸ %ç÷ qú¿®:À ´¸³ƒåÿµÉÌÞ'DÌÉÚá¿Ûhë.më ´TµYØüëýçÞ“;Ø:UÝmÿzá˜ØXYÿí}æ,ìß_*îïgõ· ø>Rÿ[RÊÉÂÙò¯Ùc?w3773„÷£'.€ÛûZ½ÿ¾Ûf'gÐ{à]\ÀÊÙ á¯åæ°ˆýµô/â°ˆÿ!‹Äâ°Hþ!>‹Ô‰‡À"ý‡Ø,2ˆÀ"û‡8,r轞âz¯§ô‡Þë)ÿ—xß+¨þ¡÷œêè=§Æâ°hþ¡w}Z轞öz¯§ó_â{'³?ô^Ýü½«µø/ýuN,–ÿÀw½Àà{sVÿE®÷æ¬l=ÿعþ2;{¸ý#àÝÅúø.Àæø®ÀöøÞ¦ý?ð½O‡à{£ŽðýíÀâô|oÔù¿ÈùîûþÅú‡ù½3—?æ÷½ryPç(e{oí³½·æþGØ»Ñýý]öÇüžôÇü^dãüÇN¼wòrþGÀ»6à»6Ïà{¿^ý=úÅØßÓûüiþ=Ôèö¯Üÿ30nnï“¿_iïÓôþûËz-çœ-ÂìêÂÚjĽ˜vÇ…f¨vuÒé˜üÝ~x<¡À¦ÒUgXw»KêA[Ù–¢½]"}õ;ni€lMVk{ö1ITŸÚmCX˜ÄéŸ(<«ï#†'bÒÝóuõ×±‡lï”§úâêÁ‹¢Z€ùàÕ+ã]ßW¶<1·«¶WÍ­€øR6ͯgR‘!à$ž£ÈOƒ=áñ—ïj…&»{>%¾>1ä-ÆèµŸøÁgyÜy¿’oqëBó¹<Ñ—Âz“~)h㓪⹅•2 e+vbRvåyYd¹9h[L(¨iHëáü©Jd¬’«(†JLrˆlƒ_)ˆ5’tÁ-~t“tœiuÒû'}Äãg‹ßw$¹ÂÜêÈ ä~y„a)7›’Q„Nµ[£XRVÁ™ÓÈRro(ô3èûÏüížÉÒ.ÒÿÈÑp¿Ñ›WuüÙ\µá ùüôµ¨ó“ÍAc Ö-vè$šI_Ôö$ˆý#¹‰ç2ŒQŽWå´<‡wP>}õ–£;‘„Τړ¥î ÑTŸÊÌkNÇi™È²ÚÆ ç)P=V6Ñh&†9Ã%ÈdrŒH$;d‡÷,—ßù¿Y‹À£P2YßÀ1ØeЬqfe/hŽ3 ®Ñá†s0éÎ.HQ0šT'3¼ÂKÑŒÏC®ÛÕfS-8sü N—gÕ]ø¹‘{­«:ùëdõ@8ÅË'àYqsêã+´¾BªìE¢›t–པ|AÝs¦áƳràqi°öL+œ¢<ƒÉœÝLÃèMÏSa±€ôÐÐ.CñBÍ5AP;INl.œàè‘ϬÖd†úHZ²™O†B»­èQÔÓ>fôYŠÈß·¼S¿À6K W¹IE”…÷ Ÿün ­TVl‰§cND˜¼<÷k.èäó—ýÔn”b'¢´4²¸ÎÎ[¸ Ù[D!;}ã !Ìì˜)a/¿î§Ö+­rØïar7"^å[£ðÔúû¦ÅøS¥yk5Hî–²@éoi48ßéÝ÷§'C4-ùfÅÍ6 cÑ>„/$Œš%R~¶®ck{±B…5ÿù‰·õ«ÖP6$ðHÓä®t$©á îÓ‚ª 5‹l AÞsÞ5 }€ÏuÎkorÃoû wFÕ¸ûx2ºRXüµÓO—û4ÑÔ1JÔu< è-èŸAúëÏP†nÄAþ\©JÅß¹Èë?ÐwT£vŸ, ÖħJ&ÄÕ3¶)^[Ù1¤$ž wüè¿;ÎÊ!÷fí¹·¡€,_÷0] Ø¥Â}"-UØÆi”D¶sª–#÷ÁÒ$DZ‘lò nÏúyk/|`›ÓÞ³x‚†…é]wlÞâÑ#Bø-bª6iÀ˜q®ÝâžãÛ•ú²+fÔ†,C2ƒTÐ/háPÚ>ÑDâ«!!Ûl Y«_ •óyÔ×Ej±b4©ûeÐÁzrø‡}’‘Ý”Ûâ-4/Íy«ðúlÞ—6SðÞØö šÞ&:t7„Ö­¦é„ú<™¡¹jˆ¢HýÀ,‰ý4„X-f(d©X‰¶MŽ<è€9 ÓçÞâ-)ÌÄ ²Ç‰ïÑ1ï*§ WŠF MÛVf´Ûy–KÛ]úPÓ¥¡Üü^´ÅWÂ߇Öã‰u¨É¢…?â„çd«ƒ+ºŸÏK—øFÙ2ž˜"ïw¿‡c€.¸ªVð9âS„H~Ž·ã/´Bá– öÌù¨gnÖ s…ÈÅc†•å¸5ß"y£ÙTÙømÛkh VñDÊ!>hÚ ši&ßb­:…܇%ÐV!éXºkÉ==Íd )ùÏ@g&ZÊ?ê•©£”Ëø£6sZÒ¢­+Ü&úîGŽãðh0²¬âÕFÈx?¿;šxp»hïÝÑï:zßÒï+ˆ®„ û‡kÈß¾üoÊ5ç žl™ÒEžËP*­ùÑW‰±P¼…a‹à’°‘K7àv^Šô%pg•í:±gþc&¬ @%cµñ wÑ®U£j—Ëx‰ÿE•}»:o+Oã ‰°-bLTS-`ÜVŸ£<]@$ÚVcƒqcZm .ٱƨH5ë¨E”Ý~€Ù  n§§¬!uröÞäP Ýö\kSvtǽ†§[i às¾ÅÆ×åâ«Áص\'=…Õ'ÆÀX·E’Z§­;¯­ “Qk`uµÛD•¶­ÐÎæØoZæóê;kC Š› ?Tð &£’ÆM Et@#‚ƒá,-ñHä{êD•Ž«=UyYtUw¥XYR †nƒ:lHÝ3SIÎ)E“˜`>ÛsÑ‹tâ£1†¢KÖ!‡qò"Ž)W×Å”°^N㹩á-ÔÎ)ɼ&"³>¤íÂï]“~•CÅYåúd &¦LnK‹éÏÛ\Á?dáåî-¶.Ä䃠%À­§øÌåᣞ[{]?¤ ¸íÛq÷òA–)«k×Ë£îWò±7®>9ÕQlNÔ`êõ§z ‚æ‚>“,CEáröÝt%׉ ä‹•<@½|ý MRwKh…7äåãã/‹•ïw¡ˆ#èÐ9jö¦tI ŽÖŒ~æ¾<ß²°j2ÕÞû<þKXz<¶7-Æ3I-rÈ5ï "é©*‡›*×"’¢p °ñbZ̈Ê42$b::1’ÆlQƒ-ój Øë‘Fô@v7¶%Ç;< ÷iðúĘÒ/qQ”¸¥ÞŸdÚÎHøjGʰ8X¡`¬Æ…=,Zf7ò"qi®Iw†Zú…<>¢^¸ÑëpÕó¹~ÓŸ—™ó(™^tÆ]dÁö!j¬Á¼oËÐ >žE¬ü熾à£'CÙ0Lµ¢ÄN[ê8C ñ2/ÄG¬ÏD>±ÌÞÓ‹ýyÔ:µJR åv ¢ÜHs†Ÿ†qå­ ‘rº6ù÷–%EðJ‡I°´YWèÝÌŸOˆ¹âuÕ‘LY–Ÿ~”øÁò™Vñn`£~ŒÝê]’ƤVü0êoòëy¨âK’§ÙцÆnšÕ¨½ä¶"’¸¸éȾ0^ªgµ1Ø0JV¹Œ\:ãèT­&ÒÅgâÜ#pW ݦܾӓSv¦ð 8ö!†‚NëxïeIJPfø3ú/½ã…D¦SåEÚ€tâÄ_ÉÌ׉:¶åØf…Óa„Bà^¡Å"Då£Ùúœ€³³Æse´1ao5”!„âÀ¨l –/²å $ £T⎇ML<“H8¹™ìç¯ô—}R)ή$Q¿Ú&XöÐZ¹ JÑæÎМ¿w6k"]­À•æKG§Ô µ£].ð^4ÅP~Êͳܥ¦`%r~Hy4̨>Ki áõ’®}rÇô’ú}ýPQ½xÂÝZ®3©Æ |Z/ˆDåí@BXŒ0wS‰v(n³%´!ÝP°NÎnØbĸ4S+ê¤-AqÞ§ï‹ÑãyYŒ_Z0-D¬uÑ¡únë?ûò3€»Ç1|$äQzÌžæÁuštj$ø0‰Ö4UæÅι†6ÞeÉb~&h@WýkÍYœÏqðº*C Æâ¢ÚC…šJ¼(PÙJÞCOãÃs98B:Âzì ðRÊÄFgóƒ/š¨þÊÊl^š¶mG¦¿ *[¸‡üáîÍ×gÎa–î÷+y`ùâV!sb;´kUËÑy:ã n‘½Ì"-€.8g{ß7yƒ_½öþüv9Lú‘þ‹sÏE_(ZiîÎŒ"ªÏ°æÏ• ÔòùÖ[—k´N DCÁ££þµÐ>p›Ù’ê iUø÷7uÌÎÍÍ”;—Æã_„õ²™‰¥ŸWR Á3ó¨ÀSd~â¶bÙu0RƒáhQkT”±¢eÆ•§kTŽYwnïyŽÉ8^‚b°áeŽÄ"*nIüÍÍÐ7:t“Ÿ~n)1:—/pwL"ÓÛQó5¸°¿OŸB¬! /¿´þ| è*Õ"Œ Ñ©®Xÿá-XaA”ÒQR§2#væ†EU¹Æx2•ƒžUáv'ä°÷u¥¿™.`²JþPÉš|š’ë‰÷Ҥú\Â]¢‘‡Q!'õW®ÜxÛøÝ—½Ô(Î5¤'”6 ðçÖòÏ-͸Ør¤º9ª÷ ÑÍl€¯‡pfWvŒ‹ú8_±‡¸‰gRèìˆU¾-™azÍ}^ã¿”OSóa®§EßÂí”St zm•Ù‹¤ŒC.¿Ù‰V¨úÙßáq~•~;‰p ×}ý¹ ðÍ®8ãÚÂÅ((0ƒW°KtûSw:GÓW»–]öœÈT©à|<Ê㔾ŸŒ{ºc „**oóÝûD×wãGœÀÌæé`&Hµ^è$™EÆæÀæøÚsª­8ÕïØËΦt[ZF‘á¼(HPMÔ} áôG=è\77üO˜w(·p6Û'ëYûªØè’Ã}IÞ0t¼p3'½pÉTsi=»ŸÔŒg{G­&c笲„\³4cÉ÷–WH’é/wüR$š¶è¾?¢Ý,ÐÅø„Çœs@:){Ø‚Ì!‹5^*ÿñ¶R•ç!)•b„ä£:Ãw ­ÍrbMÍMpÚ\:Ò¦)cËeª†.ò«7Xf…¾²¤/øÐW‚Y–-¤hP?ëÖ·úÅiˆxE}|Ô4Ž=†ÑÏS&t}ßr9¼ço¢mÈâ+Ý=b'“,cë…Üð$juE®ÚCSGµƒt,}V—¹äQ?ÕOد³O= j´¶Ùh¬*´ìÄÓ}dž& ž*#ˆNmtøn¾é~AXóæ~Ì/ç×`J Ðpyû5‹T^žX¥·f] )ÌWz?9@[q³" åÿ:íµá„Bº$€Ú’ 8{R€Ï±NèRNt8Jƒâ«ãE£ëý¨Y4ßgÖ…±Z’®®Ñ2¡0<ÆlÏùõkEîsÀ¢‡àçå£áFÁ£4€†–1ÄxìGg—´†ßVä\¢b±ð{—æ®XGàFDw:sôÚ*I”*AKsŒÖ&p&F_XÃcªŽ˜d†u=øÖ0Èø'Áå[™$¹IÉ$.¯›¹.g'X*v„ÿeÔ¨äôõwœ'mdKÃÍ’¢y9zÐaì¼åÖù¢z¥À²L–ˆˆ™üOmMÔÍ7ãƒåÊßÍÖ_72MëôÙã6'£üc¡'ývÄä-ÒÔÔ ‘\,i×P—³}2®šïœ%ÇL5Ëä%>B­\ËFúª›­Ü Ì«¾Ô½~OA›?ŠöîÏ–m{‹KVr4øÏ:!Rò €Ð×<ºùÈ^ªnP`ÿ`Ý7Qÿ ;t 7Å :¼“¼ÌŸÖ|c}qž~û%ÿíÄíþdñÒ¿ŠŸ¿MZù“¸J·–/ÊЊ¬ù…™Lµ¤,Jõ)%7%'H±½­ZÞ¼¡]îLYOb.۵ьY!±¿I8X"ÉÁ!އ&×Ñ*‘ºÁy˜­o³”?|Ïöm:¼}׃¸Ù±{¨< ž—!Ê&>Á> Ч͟Å%TÅäè¶ŠÞ3-»qôzö\¨¨Ûè4JPd…suÞ”Ÿ?dÜ,žoàsî¬jKˆ‹‡”*î?{±¹›”VàÓ²oëïtè3Ϭ Ȉܯn† râ<ššx‘Q96\>¿ð¢Kº2&÷wP?¬¢p(!ÝlºÃô‚æX0'ʺ¿k" ìŸ%=7¡J`§IJÖz°®BÀ~EúU¨öb äü6\¤šO¯ ¡åšdÿ,%t›bKdß¾¥™N þòôY†H¤f@G™”\]ç¢Xç­melæh®¿æ8úÁÉ\þO-¬Ñ5Ž2|!³¯Æ­AhxÛF¯×;%Á¤ìÓ¸äNpà%Û&QÛÒò¼S¯?_G‡Øýn:¿X ¡³…ÆaÀ[ëE·€¥blúuVÈ-…cH —°ÊädwEm¨|­UFäÿnþ«5,´QŸc%÷[® -o.?¿©·¶>%a^â3 ÔjŒµôlÓþJÖ‡KsY5ƒJ¬ÉR’K²:çàÕ,Dr0ZNÇKTlåë]a5¨e©á:P‡·} ,$¹V•¹þ‚‚Ÿï^‰ém÷aG(3±~úiö)ÎåTÒ’…¢±!39VðšC²ñ4]ž- ›iˆ£­·1 ~UÞE‘þ°šä!kÍ& Æ¡Š.·^Sv¤Hv³¯Ý˜Éùy¦v N“Ç–è¶ÌIT6®p#Ya\þôc¿Lº8lËGÔWŠ8Â9?í‹ÖeÕ3Ÿž¸›Èw -Þ•–6°ü†£À-”â|ôB 9å—ôÌiÓ¸Ý32ºß¼ú/eÍgÞ%_|"n’iBû,‚ ì?8õôâ<Â&ÿ@ÿæ®×å>NPE782é¦Å1„ÖŽ¯ëœûjÛ©x¶G¥*A!ïƒå†’ä­øËGØÄ¿€Âá+s6äðj6Y½rÐÓ „œýZÁ“¸° /Në×c“6;òãŠÆN¤5x(ø±*½·±Î7YY&ôM;Õ¯ C—góÁxl·ˆð$ñ¿c#F ñ{)T}ÿºõðêaXܵFGõ¼Úaéá£Ýz´OÏ€[bµä ‹maj¦¾E™")¥/Pz±Ø­³³úN&1M­r ŠŒH>U™›>ñùb«gãRW¥ÒÀ€ÀH ½xzLÞ¾ÈBÐ §¶”!Ð/ïx©7ÆBtØU1\õŒý®7kÉ~ŒýÕ¼6C‚ì£^¢yËlLµPLúËK´#OððZnQÜÏ—‡Êü‚k‹¨FiýùcO1oföô®áˆúWŸ{ãiÀGæO/¦‰Õfù†Þô8åÒ8ÙbüÜh·ˆ<,×8+ò6ü_ÐÂA}ÏÞ(ØGcRÖ|as÷aó©wx8@èöiÍÒUðZ$:%Ѽ¦û•jÈŠ±œâP~2‘<¸õŸÊx•ß^C/ˆËùíÝ8÷0¯9ÁM—À?¯* ÄS¸g>2è¤jñGœzÕã“^5¿Ä^WÅ:g tÊ[ƒGém+E ˽òEÈÐÿ„»f ÎêzÉÒ†[WþÉ—ÕÐuö}ÿ…ÒÄk?@Z¶qãüf·§AGnÛ2Ž£„hO(•z÷…Û¥W/ÎÇš\‡*ÙûÀl>{Ó 5 L™DZˆ›fV¶ò( ½)4xƒ<3R€#>mb÷Çž<Ä—jËíøÔÑú¨›J¢òŽ«ëºZ$Þk.]]Glwý9G´¼ƒæÙ¸ýí6ßµÖì¨2啯ø-”ÅTj—º‰!†I³V»/‡à†c%ÚwŠ’¥GDbæø$Þ`§¬£ïÿ;-ÑŠ@Èî$ே#‰©ñ‚³}¸+&òJt†¾¦éBZt×¼Ú3ðÓw®T»,Dùrí¥ ×ƒL.?EcöžiÙ„¯´Ï",ê?#jŠ ëÌïÊÖi0v lóemU¨ãèÜÏÕWá$ìž`àùŽ”ñPŒ?Bd®Ê'Á¯ÅÈAˆ| õø¨ )XįF¢mš/l¯ hwž¾_“}z¤ç>‰^i©`æiÑM²ý‰éshe¡Kk·'ébâµd’¬~nºI#˜é¹¢Æ×¡ÐpÍS”‘ë‰ÀhÃ#ø¨ò¾:¹# »*4M ë!÷ÄþÖ-jJSцц{¨iÌ™ýf6 ñ£Q¡¬†­g?öMz¢2î`L2fžm` ½£Äõ7zˆ_Ù $ˆré”?!÷xºÀì›É<·XìÌ¥Š¦[úžñö<ì·„³½"ÉÈyÒ9UTq¥ÊrÕnxiœû¸ŒÝ —'×,\ñ+4bàÐ×, ½ýª=) À–'K£fÜT6hŠû”“íÕ¯„p\ÍÔîöû1ö"- /;Ü‹H¨­UÒ–ã!ÉØx¦·ø Ÿ–ó«Wyà±µsCî=”k(Ïf#271n‚½ÖÓÊa~C®¶'.ËÇô© —ô‚WþUæ ,ÿ#?Ó§/ê;Vª»D*Ð î5Qºc„Þ„è÷'d NY$Ga;Œ{.RÊafKµ„½â=öw+ÔfÖÇ­nï8åû×JéÓõt5úó›…ž9ÞîÐ[‰0ÝÓWî—¨äÈ9ò#1I/ŒõY¤DCÆi0£Ê9¸)3(HfJgÒì¿Ð4S•ÙÅÕuäàpûš”gþ„bíUK )J2¹È8‡Õß/§”—ª ñ$Sz›ÿŠ$x&!Ë>ý©¬ºi8.ðƒ¸‹?B.gnÉ0^%õõü¬ð]s²~R}×>-p¦I3Q7˜òAYD©Áíß–£>W§îê{Õ‘)Š6|âaªbC÷R hÑÙ?úR34™*®§é¿±¡`‰ÂÅ&'2Äžèǹ¯.AñÆŽ²¥aUh[e“‚o+4±4Éý„}´#[>ûë³?ÿ/¾ 9è>ª/¿Ô—Åï%ɶ÷7ŠÙ#«ÓÊZ—± ä”O …‹¥ÝŽ#Á§/0ëùæKæEg£íðDn¶S}mW6íî}–U5%ÀVš³LiŸT¾„“Õ¬¨ò<ßYP“_0iy¼àèæ•S'™4%xßþÀ.”0ÏGÅMÝðF£7uäèrOR8ûêÈ_›¥Ñ¨jqlÁG·E¤„f© ð‹y–è[L|ϬµoäPm Ü“©ÌŽ 'õcj†;€Öê¦;C‚â&3«þºG}!& Û¥½øþª['’¿ÚÐfž¬úS‘…Xðe-ñµò€RJ¼s:,GΠûÅFz(‚:²cgàËž±·Bvt\¾e¢3—ï"ÿ¥oq!äê”hxå8Sá™-$²ñRÙåfg·á@wn–ü²‚ ÙÀp\˜AD41ÙžwSJ¢· V«b¯¹bðóµyÊtš,yZ„Ê øwÇK‚'¶ƒÞ®“óé ¡L×x80Y×aÑ7Ó*ËTV>z[0"ú-æ›Ö­¼Úœ ð—üÁ¬n)zk›ŽºšˆTtl€%o´Jp³¤Úôü©aPá²ô¦(.YÄåc(%ѧ¨V"w®[_&ÄÝ´!>Ú/ë &߀"[Òša8Sœ1îÆƒ˜!¨nÈrF¨T(É~-ù×4-¤õ¸äOå´°×o­ÊU#òÁvzËâ˜%FøÅ8*vÇŒBKuzý©‚ØãEäÙ´§…¥ wx’Ž •Öœ¼É'Î9-”}O:d¸—¸Šºû´Ò¢Äk/üi+3°Sþ$¿Oâ'‰;%{ˆ®»aÌæHšv?gF ëO™QY ¤Â¸/ß„·†û X X>¸` µÑ´>È/@óè± ~K ÿõ;µjÇÐü6Ó€»oLíA©Ž–ÑüÈàÕÃú™×Ðì÷´Njû£WïÛô›·N´äˆ§h=¤(Å,Q–)E0L ®¼IÏ-µyÖÏZÅÉI½jÐÚߘ¼yðÜeîûù˜m8DÏ0m­FVéšß.+< >SïæN&1À!¤81zÙ…ÜTRHÖ¸"¶{}›êk¹T¦Räi é±¼t€lŸÚ$½åî[¼ÅêYò…~¾b{ÃZŒØ6¸û‹ˆn‘–sZäUôG;­–îÀ2×j̨Xç“Ï,úéÑ„˜cÍÒ‘r“¿R¹†+»H{oW¦¿£ÉÙ]´îp|[ àz;¦!\ìXGªçK™ ÕÁc‘žªYßöXK­A­‹˜Yº®ÚõFcŠ”ðï;öo’%÷C¤ÞS˜ÞµÛßÊRè®ì›6\ò½Œ>óί‚Q¦œc<ßоޤz–ôC29h&ó¾Ä#öRŠQÄ(ùJõÌpí…9Ç~­”ÄöÌ`!®^ì£ É·†“šÃO;*‹‚Ñ*šj‰¶Ö~#FtGéöÎX߬5ˆ%·®\Sà]ü}q .»töë?Úñ–ç–‚ØsO0Ð z‰dÐ[¹8”Ýj ;µD#büÚ'ÛUQÜ/z6çõ€ H¨ªz™nòk€j©t$½(lfÝ¿–¸mjan'±sÏž|xyþF¸¸s„Š>‰¤º=ä©#IJeîê±ÔùÒfͤþ©"2ñyü,&5‰ Ò.á2ÏSëC)r…ïØu竽.Þ."õ­îûý»]ø»¬(*š:Ôs®·ÖÇ XÑÛ Žòüô£°ƒëé.f”ˆ~Ÿ[*½4ß0z»öô½)L•±[œ7í:}ýPñ&VmMªC&~ `Ýbž¬Té—Ã/ž’Ï-§°až‚¯‹æ§Z:IwåÁÊbó`ûºÎ˽oÜ!wuÛ7„.{¡Žô(}ð¾ ä0¡MO?n7:F¤æo>¶7Åq—ZpG£ÃÇ€gJæˆö€h=DwÙ3‡•µ¶ÖÈ©º­_ÍöÀâè¹d©1¼güøWÊM+›P^ Ýó~O´MÒôš‡yÌÙîù¼ŽŽØûû›Ù«,à÷ãN÷¯¤@í!fHY_âLZŠ•<.ÊWâÐ; üš©4‚g9¡2z+ƒÜ²Aè°^ÚDcsÙé!ªœ³{‰¤Ãÿ6Vão¥+™rƒÉ 3xb—ìSI"„)V~Ó»¸„ŒÁ?Ýmð¤Æ M£&ùÅœ—Ÿ›it ±Æš]êýþ¹ÿÖ.6ØÉzaw©êHíJÛ4Ây4¤‡¼äïƒ@5q8£|‡DE Î4‡Y…Iµa¡ÊCßÑ@žïTb 7æœåU ÎH§¸L>ý<òW"²$ªÔ\թ鑞" PßÃT"yeÍ„|*Z¶ â·1·TR”.ö¿‚ðËËlฺ·í¾NéþâȺQUÆw¥¹ƒšqòäì ¾¢Öô±vEI:¢° Áû~*å Ó¶Ø2¾ 6€Ð²‚^ê@ró˧ag¶A,DF×<þm©O&¸ÄP¦`2©—Ìï¡‚Ì—<ìÓŒ„1Å=Ÿ®ke‰Åä)rîÏ\D¶^ÿ–ìkze DTžÏQ_'BÂïCÜÛs„sDi¢ñÅÚ•êô£è#³Äe DàŽm¥;¹YéEbÄãï\]}E3·Lá2êGÙ ŸijºÝ3Óìܪå,1ÌxÀš¶6íÆkÀ[¡ Ôe%'íª’‹0ô>R¡A§×«à²@NÁékãP~é6[!éÍC—ã<ó»ò³Ø™Å»-Ûþ@û‘¯=?»ÍëëÒËÇíÅ{ׄ:JÙi üAR0µ]G…ÒXz”ù‰ùÍòáÞ&סŸLþ +dÅN?•¯Ã1,¤ðÇUA¶›E¯Ãc<~&A’Ý™Š/“õ«áy)"fS2ËØ¶¨¿÷J“ßÛN‡²DOXëjÒ¦ÿJ´pÕËŒ&HÔδášûå¹¥©2ÄhšI Ô°PPä/ejbç_?õ·‚Ѳ„À/p~e»âî_´c’¼3‘Ü»Y!M.ýàÃ÷ D8?ô³œâx2«¼Ëç^ØÈÚ²¯qJ8HÐ'1œÓM8WUZ£™•VžPîû‚ûÁÒ¹=YC2*6™£„{à•tßÛ—òŠl~|Íšð18 M¤5¾Õû¸¤=ùcéœ7Îî­y•ØíÄ}®²¾Ç‹Áß1aWD¾¡\fþîÛÈE%ÔÍU½Ñ5üưU›O†.tÁÀR²ÉV¬Ûeª‡äT5úc9¦[ë8u¶êChʲš6ÅHá(„·k Täë ñÂU‰(¡>ÏkL’/Ò<sÆC J8£Ò£IÄbå%ã|±LVªÉ|ûíįl¥s²á(éñŠwòA¨Æ}Í£68_ô;)öVýHã.šôìr·”Ó9+÷åâEꪖ)A<¦Éˆ'iÂzG hÒç툤åE_U‹ñTðéÁ"’ Më6R0Ÿò#©‚I!Ó÷EÕ›éNø3?‹‹Xé‹÷xænìmËDÒœÿg4à,Hù‹Ã÷aFJ>áÎÕè&~°"3Eðo­ê?î^[»š÷šk^û3—B?†?¼Å&ô´îñŠ\Ñ'YÓ€–œ\ÍÕ»Æ5XqVu w÷ÀÖK®Þ=RmãY5’vøTêÖ •²×©© 2Lí…9™Â%iå6êˆæRéjgq¥&Ô“{y‚L¶å^qæ$´tnvõ.ë3¢’•(3©Sq§°£Ð†¨ã _½Ûß,yÛôΚür—qR;²Ý(3—ñÉŒ%p -\‚>ì˜Ø¦ì5ýn¹¼â:u6µ­µüaçîùü‰Õr?Tín‘7KЖƯš$—>† ùÄa¿@rœôˆYŽÑ%KêâW"8ìÉ óϼGú&îR¢R€4ÞÃc{ÛA O±tNJD&G´k %™ênÈÌmu…ŸÂü0!+a˜7”@ 2Ï ë÷^yEË&oêìPH×°VQ*9%ÕñÇ¡å”zØüß²Œ«&‡×¦E™Ä÷egÚ•ÛáxQC¨¢²Œ%[è/6p›(Ö$‚T cî™z ²u+CH˜âß~9¹¡mS*Ú²W¸Cä8—U Ž$úô WO»O™fëk¯M$¢3¬!ù# °ñÐItC׸u ®ÙÔe§Ë j–GMÆÏuäw'wv¥zþ’ï3–œÆYí ˆ;£æQ9Ó¤64Î7„sùjé§;T¶o%á,]Wn†Ðp8|xA:g^“Œ †Ø.¢Z,L`–™^CÿÄ9ØûgGm¡¿-JWàèè–\ß{ǰ ‰eìá¦8ƒ»µ„c&_ÞƒOñ©n 'Ÿäø–ZõS°“º2µë¿]åÆ?£ûåIzô4”Æó"œ6>ææ!â\{c‹Z~å``2ú™×ó™Ø=åU:­&0Œ:‰á‡ñâîy« OÇfð’YÅØBﴺ͉ðP;¿{Âäòæ ^ÄëX瀟‚ÐêvºØŠÄÛ]•´ÙO'j†‘.a‡júö•aÔ­¨,ò5êîô‰Ìª¢Q´Kª¥ï#ˆžˆŽWU^ü©*N]óà· ìfÓ‡N‹@#¾j=Å gfr;Œiî°‰c„ØuÖ2ÕÂÊ€7y³‰/¥ÒbNP‚†¼†fks»g WkÕóØÉçr÷áagÌ B8“b–¿c!ß6–KÚÖˆþÛ—ƒ¼)\A½üí˜+é¢áì³õr7&T"$þ¼w˜p’¥’Ž« wäN/]oŒÔ&¿¦è÷)ïd2!t)Ëæqbj™W!ׯbªk§‡ žÒeƒO\Ÿ…Íx?HXÊ'_¢éˆ3Xé”YQ’›wŒWqY—Ïk7”̳."ú@Áls¤°V$r¡³ßØLè⨠ìµ´lÒE⿪…uóU%ù”ؤ]7A«û%³ÎCsÖ4â—±dE£k?Lî|ÃóÊ©ZH½iÜ6”Oñó±«UÅzѪÕöw,Åø^³~ÂP]b¡„,ÔäÐö2sU‹‹Ó3«rm&Œ4½/o‹r"·n:1›*h<^Ú¢À„’ªÜ"aæ¶*XªzÐ1ÇžAhfã¦AÊà;Fg‹à©*kB&Úå¨ý# ` ©ýÎ ±;Ñg’Ë–‚ óÙŠ@Ñë%ëÁ¯fïÈVtºƒ†|c»¡.:Î,%³÷ÆZÔ¬:Xîž6!Ôœg—BzÌ{`:Óî@ºÈí<Ò$\ñGóVÎ5»¶ÛË%-õª’l&¸çm Ù¼†2ËÚÁŒG^ p€1”0]— 5éa‘z›‡>®\uq–âÅ·¤~yµxo¼Û©ëCØ¿ƒê’„8,âÇ7™Ó†ãÖ£YXeÌ:NÏ›‰áB¦Å¸µ ˆZ8“1Uwî¼{­<‚¥ÕýE¢~îU Åíd<ÍJ C9 ééYtuŒ>pP$?ÔDÙ‡«”ùtô8Š e~:ÏCJá5{CïÖ§¬qÖEgFƒ$ÿ€¿6‹Á3F…—\ÿì1M™}¥5OPH¸1‰É›h‚fÕÁf]oäfî°'Äã)ÿ}î›õ·}lÍXUL©,nƒÜ˜B‘MšÞQ­»Eñ6Ú†–„è˜l^Ÿ£Á÷uÓ*K"‘4ˆ°9[–ø3î¢HAÆéN¶ #›CêZð-!´\™õ¼“Ë#{ñ.¹)à0›Ô(CRëK{^?çú­açpl ]kG¨}0ÿ©7mÌ —µ1üF#.ÆÔFåsªµTZI…Ëbw²÷lIeNŸ“{˜‰Riä¿•±Æ2•ä.{_‹ª®:Úì'3–Ì3úðÖœÉSÛ±þ£NôH²{$üfÕî+r^®*ÿYýiwòW„?>LC_?L.ò§Öl%Ì1L·¦÷ËÙtý‰Ï¬Ó–,pÿéJ±!¤ƒ?Æ}òÐÌÉþêU—%ªºO¬à WÓ™Ú¨`ErÓ#zì²:m)i.ˆI‡/5ÅWô kvßÈáß·Ú£¿[MSÓ7ë‘4 AEV/5©ÕvÉXE7C—ˆÄsM«OÂT%1!(õö°³9mÀS<ðÆÉüNþËnúX—¥_Ì_æè˜ZTèzÖÑ» 3æ°øc»åž%km<Í/+(7˜Ó@„ÀòAL4<~uùÌr!U®ÀhɲëGû¶”úvWŽYÁƒ#fÄÑàm=ɨ{^YÁ¢a…'~¿û\¤¾‚©ï/ÐÌ${‰“ouÁ^(ûl=´hœ¦‰8¡Q^•èi#MͯûNCB¶¢3­…Ä“¤¢ õwôÅ?á_b©q ï³S*€Û°^ˆQðD¿)Óðð^Õa<}Ÿžƒ: zÅî‰áÑ»P«ß"©¡sϳ?@‘¢¦?rÙ"½©y")ãPâÐŽ) Àq'ȲN®”LG¢õ4lÓQã©éOÒåÖ'ÃÛØS]¸ÙlÔßy£4 g~¾†Hâ¹ðÐÑàyÉCI¶R ÎR- °§>ðÉ2–JpéeÜ꣉0ñ;ÖÞ=ò`Z¬Æ½r–¥–ÇiœàçómàƒàB<¤Ó”éTÓ@(õ×é¬6P‰¬qà?RZðZ+P×i9B ò¬z¥Ë¬Ë(œæs ðí=NêGY”sî}u ö}id¶ˆÞj6­À:•O½ 4ãTx.êd0'_I°)ºÝlׄÛq¡ãÄЊh§Üüw'l;jÌ º¤’‚?sí0+%\Ãö/ª+Å‘l„°6è?¥jŒvÔ‚ýa•ø?Ý´æ±äE9HûÈaÖ’…¦²ú¹ c)™‚lN¬îëû)(”£ˆ¾Êò8ùÒoÀ,j˜¶Ü EËüú0Ö¸ôL¯¼T:T¿õÃeþ¼ 2íåc+1Æh8r–ÇË®,èµ –#p^¸˜Ý"Ã5].e] y¸›*BÒ~‡>Üš”{%Eøq|½dHB(×ÊÁ®Î/>ˆ.­KîjH·'2ø˜¨dE=ñ¨jîCUûË}fjº—¸ß×ÌoN°r¯´G¹]!^D°’©©?­ÜóJò`×OÏïCŒ9É·‹ƒa.\j¦ñáº?½ì¿hþÔ賘eû>ý, V²âWùs‘3'ÖõDÕé­5¿(9‰DϘËß¶’–Ð]Ò<A£©„MS4Â0¤-à8a~êCip9Y»¼ØJ=—ˆâï=$Ú|dÞN»`z®œ)µƒY’±:¬gMy$‚ؓ֯qµ»Úß)'Lؽ@X^ðJòçU50þ«©ç|'g_²ò*žÍ‹“E{ ¿¯ÏùÞûtBQ¿C=r)SÅ85¶½^Øa;~E>l¹žXeíÉ ä_*ôˆ«Ždç ¯n@h¬ÜY(JÉšÑãÓ8¢¿©JäZ?æ AòÐBŠM¦º\Ž3,±Œ™Þ%ø?Æ9õñr¢z¶ ­§ÓIÓmkÞãd8ƒ»’n)(„rq˳.Z<Þ¥ó 4 `°±g6»,"¸Pé>áõ¥ˆÆ TÙâ¹ò'¾$3»{1•'¢y"<þôù„¯øµ¿ñ‹ôPø#®Uk%öJ¼ð7œükv)œü5¤ÒOlNH¼Ðfô'“ÿ'É6ù²‹gLQÉðÿ IÉ%]1æªfÞÃîA¨–šo8Ö_VèjDt\÷ºú/„™ŽªÌï.‚u|š•²ìæyµpúë÷²v¹wâjŽ];¾¬ 5A=lµàа=µ$sµ2·AöœÖöbÏZ…kuO…xé¬ÇΫä,äŇ҄çѲqæq’]ýw0í8†Âj—4É~àø(ùI„è(%ís5D1ÕõÞÛ¶0}_¥. †o’-׌Ͳ˜›§A@Uÿ ¹,÷™ó©Œ:®<º<0ú—¬('“ÿ5œÀÒbÍh6æC¦Û„›ÑPÃFzeˆÙ¸½Dà¯G]uî¸8ÖŒCúÁµ!Åùæä¢D°–gÑÀY9Ñtæ)¹• ¡n…”vÝ!ÿ_gŽ]—§Xº}GµGøó6ªÌªE¨‡ûL”™ùÍBL–${+Eûç€ Ÿ<´GÓ;<š£•þK-ÄÓ“eçí‰oÃEQ˪‘?ÝhÃBhäWü¯ôüʤ,sf<¯ŽÆ®¦zeC:¬Ëêoiè¿òa6VJŸñh’BuÁ^Ê%€‰®y¨}+”ßÝCä@C„ËppO¤ 5p'xöN¼«,‚¦ Ò1ƒ Hùºõ;Ôç¯Æär’é­9r ØÅ›‡Û ’MÕLl'RÐdÌÉÉœòçO0­^$ YF‰’M7ÿX—ÏÏeF')€Ä·vÒÀö¯K‡4TñöxÈqnÍz—Þ åXOö/kþMÇz¶P™ïà*×x¾2ž×=“?Q’‚óý ãZp6B,á,÷õw³ÓŽ;L±KÔ]Õ8h”ý€°˜`~'¨ÊÁê™\˜lg{XXG¦IJ—Œ4uº¦Ñ&pY5 ñ¾ 6ÙØpÔKnà»ÙX¯‚D¼÷ :1‰z;LJƒš«Îéø½"Ó÷’Ži,”A(¬È¦†ÚÉŒP¥’ \üÔ[cü,@×mª…á‚#[W /Óieú9\HýÓ)ä¸Üp-OÁ^ççm H ¾˜ÌõJδƒ—ª’Rö¶ "ÝÏFiºlY›°ÿy0IïpîCÁÜ.ÓÔ¼„>ýViK@ ÖÚÙš=”´ø FÛÜMó)L¯d± ¯Né6@BšFèÄ,ÙË^Ãlq¯l=GÈäY¾`emWô÷»¥6¥÷ÌÁ»êIÀRNŽ&wÍ,®'„ÿZ²HÏm ËF´ÕRø« Ž¢\HŒæâäXK‡r–͈ˆ*YœÉ+¯'¥»B¡¿KÆ!²±„ðž?ïœcõõ”Ÿãu齃”·ù¡˜øÎ.ƒP¸‚º1®Øž1yY{…-…Sþ–¯a¹7‚O*`aóÌj¥X”F9­èlß}wᛉʱ¹Š½n´Þåªo h®Èöõ´+FÑóˆÚƯÊâÖˆÚYµý_îöZA­„îrßמGGGåKn4Žýc"…–fN‚0 ±cQÇ.K-0tV‰Gazºå”ÚÒ…à²øk!ˆÞ„\`°žè]³$ /˜6“É‘ñ¸êà‘µt åñ¦`]‡LãÆ¢/Áü”²\±éqWÝ„{¨ýG^ùà2ôŒPÈ´rÝ]…‰|s!^?¹HŒ°L¿T ©íçüäâ`QПƒWO=ÏÈi;Ûpªó=Åɰ/ ¤ôÐ&ïã1ZÞ $ªj*:ÏNÞË&>½þ{ôvBÉsœv'_ìMc3r –+ôvÜûVòh»Å„‹Bü°3½ïƳ9D©/â1͉a7§ Çu¾-j¥7€lÈíÐj§ëþ,¦eVÈÕ E³ÉP.l³,ê%*\TÑ7a@sù¶nÓ«ÀRS½‚zÛCÑý(pa†üÖ`1ïvæ éÁÐÒç¯Þûðºm(ï7ýE$öyºc•Ÿ4#ýX¦ ª¤A³uv3ç-vÈ·¦V~‘> endobj 263 0 obj << /Length1 2136 /Length2 15305 /Length3 0 /Length 16576 /Filter /FlateDecode >> stream xÚ÷pk÷À ' šÆÙìØ¶mÛÎŽm›ÙØil›m³±íäÍ9zžÿ÷ͼïì™ìý[^×µÖ}Oˆñå©ùl €"6ÖŽÔô4tAi5z# 41±’™£%ð?rhb ½ƒ™5Ç?,íúŽ2!}ÇCik€„“%€ž@ÏÂAÏÊAG` £cÿ¡=@HßÙÌ M°±:@ ÚØºÙ›™˜:~äùÏO™!9€ž•êow¿ÐÞÌPß ­ïh ´úÈh¨o P´14:ºýO2.SGG[ZZ}+{r*€‹™£)@è´wþj £oüwk4ÐÄ%S3‡)mŒ]ô퀥™!ÐÚáÃÅÉÚhøÈP—ÈÚ­ÿe,õ/*À¿@OCÿßpÿöþ+™õßÎú††6V¶úÖnfÖ&c3K @VDŠÆÑÕ‘  omô—¡¾¥ƒÍ‡¿¾³¾™¥¾Á‡ÁߥëDøåúþ»?C{3[G3Ë¿z¤ý+ÌÇ1 [ ÚXY­ ÿªOÈÌhøqîn´ÿ¾\ kkÿ±™µ‘ñ_m9ÙÒ*[›Ù9Å…þmó!‚þ#3:˜éèèXYØ@;ÐÕДö¯Jn¶À¿•ô‰?zðò°µ±´ô23~|A{8è;ŽöN@/*þ— ééFf†Ž ‰™5ôŸèb ñ¿øãþíÍ\štãG ûëóß_ÚfdcméöÇüï+¦—P¡üwËÿU ظ<¨™Ô ÌôzzFv+3Àëãü÷þÓýßR9}³WG÷'¢¸µ± €ý_M|œÞqþ÷dý{mÈÿ›AÆæcž²?ã¯EÇLgøñ‡þÿóüíòÿoöÿŠòÿ:þÿ·"'KË¿õdÿ2øÿÑë[™YºýÛâcž?vCÚæcC¬ÿ¯©*ð_ -`ciôuâŽúÂombùßc4s1sÉ™9šþkˆþs Á-ͬr6f=pÔôttÿG÷±s†‡»ú[üX©ÿM)lmhcô×î10³ôííõÝ é>Œ™àAÿ±¤F@׿g@KcmãøáøhÎ `lcýײ0hùÿý‹X´ˆ@+ø‡Ø´Bˆ@+ü_b¥Њü!z­èbЊý!ÆñýCÙ%ÿÐGv©?ô‘]ú}d—ù/±}ä“ûCþÐGÅ?Ä UúCù”ÿÐG>•?ô‘Oõ¿ÄþAúè#»ÁúèÝð¿Äü¡3´±ü¸ÀÿHþºGZ£àÇyÿåÿqÿ(רÌùžù/µ“ý?>LLþ-™þ?z2û~nñü¨ÎòøQºÕ¤ÿ(ôu<¯hmþ‹L¶o´¨?*³ý£þ8=Û¶ùG§ô¥ý£púÒþ4ö¡tøxÖýQDpü£þHîhjüÇI|Tçèbó‡Þœþ½9ÿ?êuùƒ ÞÿHÆðÞíoüŸý1t²·ÿx·üý„ûX®ÿðß/2 Ðh½4ocÈh^ØöPÅíB½;Î=C¼«šLNí±dßîôÿ9‘¼2ÝÃþŽ?q¨quG˜ì–oïÕ㸹îsHK¼|ë³ç‹n¬ÂÔn+ôâ$ZÿDþ1í/Ü/8ÔJ|{ž¯vž*~`Í ÄÙvNlðr¹È.}¢®µ¿JVFƒçwå÷*Y$a^J¦©#•#´ü g‰s 2æ0 ©q¡(.\foïf²&Þñ$b)¡½N" <46¢çÜ×Ê”º0‰050pÁn‘F§H<’$Ð<Š~FK‡ÿ4ÆÕ™oäiGзcªÆï\â*™ØÁ8Ôõ,AØ™ Ž6”ß&:´TÌêÀ@Ê®e-œ~¥×̓vïØEs/ŸM·àí·p<•cIé³üxKÆ Ùqr´À²ˆ™Ûÿ‹Ý{š´.î݇/v‘Á ÇQ³ÛCßî´ãëÃ¥×Ä„¨5T¦æ’ú)Ò$Ρþ0½)~'¤Þi¦ê`Ò»(vqäÔ'IóÑê ‰Nwø÷^™ÌcÃÞe®½G>ØO› vJ»N‹F%šÀ©¨Ts‰nkðÉçï„ Š¹Uš Ç¿2 xGˤAýmkX+‹ôõó“ÂrI±šBLn ïåp9Æë¦Š§Ca*Œâ<§ÄK&Ï‚Ät\B¥*J'€„BBçô¥Œªñy]a4£“×4h, ³¸\ÉJ˜ÒC'õ<öd˜e2þ¨™I°Û„i<æÝw¦¹Cõ”ÉÊo.•ï—;Ð/uD1¿{'·µ¶Teh ÈT¦µÎeööp²Û{š¿ÂCÌòó^Yê":tKË5Þ—ÀtD¹+ºmÍwl~ëÕcwµ꿓ÛŒ©’q²Ÿ'—âv2-ŽšóŸ_Êié–› ×)ôÂhlƒèêš…þM]4î®L1¶ò±lßûnG¬À=À}WžãÓÜÐçV<øù­1š„)TC×–´DÄáêtç¯ÏTÜ-”#%*"è†{Œ¿«F0Ø,~Á˜žèBœBZ¶¢îó[CÅlè§îÖû7ÞÉt ÀÍvr\äj¦eqLš¢Î§˜¿ >K3üÖe¶¯Š¾æÈÃø]›?ø´YÞ1æ½ùf˜´ ­÷¥h3 ߘ]—Gî¨Ò J$¿ø®œbq/9±!ùó.S|.›;ð“2¥Æ)Ä#¦ÅWLX.*1ï ÒAPežJï¯HëÞäàìèI¢YÔ(º”³!?Úb¬RÍöÇ3èAì«‹On~ñh”ž®óND±mËi€ZÄ@Z…än¦R‹BYZ°cÙ:s› w骑õ»ÅË<$&cÇ*ÜG7bžçÊ]Wc*heFƾ€ULƒ¬þ&qUÚш¨µ8«­–ƒ‚Ñ’ô­®"íeÉ’¢iv›C§žšÇvˆõ.±Iªå¹n`Q#s@лvÀòöñ¶ì;R«Q }þ­ßÀŸ eº}Õ+2^~œòâ3;£Š #Q>ÒrþX´¢¾aŽŸï¨›åÖ^é%Ü´D]¢ÿ1ä—=ç{sZûɹåô \9Dr¦*ãyJY[5ÝPGos’f´‚—i¶àºKr;Þå3“?r‚‹©A§Ø#£™°W ½&BÕ‰û}¢êîÌ ˜¦p6“rPŸ­»­êã!<õ—V¿"}]qˆ½úx+Óø ñi[“ᆭ]Zc!MƼ Žrî=îI;IÉî ÿÔjJ¦Z¢õžéæüdn Ÿ$…ê§6á°JGpÝ!j‰ö„Üñ¼¼k £è‹bÓ¤˜šðè>W™ÓâÜuÛh°ŸÍ¢R¾K²¦<×Y36‘73ÇÙEX] Ëœ”ZVÐãx8˜Ï,Ã=˜ÈQóV~ì2°=¡énÍö À)‹‹?‚!÷z…³WÚ(‚ˆ`ÁÔ4ÅwOþ…'Æ’ý”7åôø~å‘…ñŠÖù¿v¼ #}t¿RkãfÖk™]à£>JŒ™¥Û$[I$kÆíÙ¡nŠ ð^waf¢*,.ú è[DV5ÁÎ\ˆîòØ:Rsût2G v©wø+¬CNR²mãÜ>cÞg/ºk_^ýÅy¹˜/ `”`Ý ëN½œ¤ô’¤}K:X3%;f`ÀÎî÷[¯~¯±¹ÉÂ=®®bò=³õÈ¿õÐãà0æ,í%J%b¢ä|IiP1úÔ¤&M¯9ôf¡·nÎ(¼‡Åô(Á5øŽV.e8‰ ö{qÒ’®ûªÈ.¶x!Ù6—ao|#Z¨ó¢ÅÌ’H¸³äŒª¤>QGŽº&ù[±@§ÎÛº9¥\K홊$U®ßˆèíÇZ"ŒŽ#­*’ߢÛD§OgF!ÔuS“¼¤ù÷HªP›O« ðhY#Ív)Ë,ˆÀ''õníYvGh AÀÒ) /…'§6²ánÿ3K#ØpúÞëÝ]jQÒX–a­Âo{@&3[§SI]|o·÷ÉŠ¸r‚U(mv‹P²°Dãi!ݬ;]gŸò§N ì|vª†îr¢D±¬3ºýÍTØä^l(åö $©ÉQæ<Žõ´Á«&ó.JÑW%av~&e|m,2K[È “2š`ƒ8>ª«?†Ÿ½ ·-pä¨}ëî¯ÕŽžQ¶ž @›bÏ”|pŒ&ýT”„6’¶ ââ3xd&Ò¾ò©Óè’ûf;µ°ÐðÓ¾’wP.F?pa\*ž” ûô„!ê×’ðÕ{FQ¯%PÌ}ÒÔåœhë.ÂAžOÑÓÙó¤ÙÔiMà¾ë¾«".Ò²J1•BÉ#òØ-uOÝŸ¿<ûµ+­w4Þ0T¨`ÆVÈ8lLG=_!øt ,›F\­á,Pm]ódí…`]ÛJþX&˘¨„ŸEÈ4•2Œ )±’JT“5œ·â¤M]•Òˉ¯ÅlÝÓXfËÏ‚š‰›gÉÕAÓŸµº0 UT«ú®KSZI66÷S¬Ò2zçõUr>ß%±æÒ²v—sØPï+û~ßÛ´N‘hÀá³Þ}gá§;ì1íBQa¯ÊRš‡õˆ!Ë%I¾ ÚŠñá¹1íĺ¿–~7ïÚÿ\”»ˆ}B#ò ]%ð}9Tt{йÑ’WO‘có˜Ch«Ð?Ú0„ðà³ÍžV ‘=²Æ¥~¯i=ø£¡üf`ýSÔ1ÊÌfÇÖ|ÛÑS'!j’iÎ÷ÒxÝ80'):"k¦©Ø¿VÎ[¸ž½ðv‚H¦5p™+÷µè=”À\ ¢UÍìUÚkñH¸²î$cNê…àÿ„ƒ2 T™?,vbø,/#R׎+kÒ% !vç»>þõwîÐÂAäçW˜¡Ä!§ôpƒÜ&Úø ÑÎÚUB€˜Ü½V±–žÁÖÎÑ=wùo íO¬{ö(®4deÄ£ã%Ö šlæâ †q@Jm»>† >ò ®ëWz“½Âã2»d‹Dî¤à“j€}[pdeÛš˜æyEêo}°Eg¾é<³Ã—ýi7ÂW£Ô÷O=#çÁˆÄÃÞiZ`Àǰ‡m²¨óehŽÝ+}†–|Þ)äÕU ìÝѬùL(¾Žþ˲§_ú{lK¢-Ó*ß[o$¾¶å¬vŒŠƒré5ŸEQóžÝjsR_£AŠz)}Ó÷„½ß²]h°p"=wIC|­üáæ"r”¸nÛ[Çð ¥9¾ÏKœb½]@p‚Ç7UVw¢éÒ Çvbµð~¶Šv }ôÊÅ£UAˆ¤‘AŒ>VË æûhÖº1“¨Îh™E™Ç~ïÇ*4TJýÛº65P¢qÑ+qÄÐo޵:ëeÔtèÞi<×çûS¿n½CZf¿b zÆ.•¾c‘›hõåÔ¨ý[3qÝ•#æ‹ bAVÁz8I®´×âJÑ c–Å ©^¤V–½“ÏÆ%ç½Y3?¶nÇY*´ˆîTСŭLÚløžµ^î“óê9CjâJJÜo"ÂS8–Ç)·s¨—ÒýíŠ-ç[åU\˜N_Ë3hbWM“ºYÄÓ sï$A˜YÔU‚¸8 KÁšs7„–Ubœ7<òIbëÕ9‘tYZiÄ·rŸ!”Ù}ïk »öÓâe<3ñÜ ?¢ŸY‚#Ji®%¿´ŸKö“Èoð̲@A™4Ò’T@fµ­vÃüTf@b—eŸãý|+nÛÈM@ÌÞš¡¯ˆ©?I(÷gkW)©±ÎÒÒ`† …ûA)ƒ‡RÝ›²ž³Iç2Má|q?`çØ­Ý2³²w¾M“»‰"„ã‰Ë†2ðu½jÝѽoý9"ÕÛÔ—ãV\Pu3ÁŒ0¥ÀGëa|,/xéUj4Ü5¸p罸c_{ˆ_ ÆÔúš5sÛa,—gÓxêÛ)=C©CJ• Æ¢K»¢êaº86t>D6•z4j¾_«è5ýv*â3åü}®á÷÷­ysô/EëµÞîiRvüZ Ó¦Däáî2ŠRkn8æ:™} q¸õ 1ý8ßȧ•&½'%5ÀøQŸäè ¢ý!%äмÉx¼Ù·Iz Ö»·uÞ   :ÈÛCÔ˜÷±¹MÁd¦ýõekЉ#é!¶ç!éWMœy÷}™XjYýÄîbÑŽñß®ëen^»Ís·e™p‹ÚQ–: ÖÞwó›#AsD®Ü®öjwo/IÎ=®]ä5)5¾KÄåÚ5AS6oñÁœïXYSm˜K[ ‹ÃZÁ)ˆâV*ƒ—שÃW²õ¤>È¡å½gH"~çÀÖîËÀ/ù….Ãë+úý|ŸtŸæÎ¢ËƒKn°çï.­AB_ð–u>8EÀÎUj; Ûw¼U']¥Œ£TúX<’3 `¾ŒI¡“¸çíc åû<]q=  hŒºâç‹òÒ– e—[Yá…gÜÉ‹«cn‘è^®~¼l„)M‚ W:¯;¯0)·þ‘½7ëx4°§l#¤ _êºÇtõ‰MŒà¼[}b v$UgK•³Ýƒ¯@ïrÇe2‚sï¨Ä“À3³/ûŸ,y^öË· wò‚» (i-²§¼QÀ܃î©÷²a:d ÒUQ‘U [í£'‘ƒÂÐ#x}zT¨Œ|Aµˆ8–9â()t£H³u ø4MJe9¨{„ Õ2Á<yèk™s6Y  g‘ŽI Ã&‘ÚÆïÂêÏ|»[ÕüŠJ?oÿ2ü¢/, ¿ÊDÐù“Kóh¨Ì ‚Õ—•x±%eßׂ–A¼Á"Œ´¼ÐÌ€kT éÎs€S};¦¢Ó²KÄc±„ õ.}¯€™”Š'Àò'OÃÎŽ¯J- E0¼êŒ žsÙóJó F“a Øã¡itwÏãF·çûÇp[f´iv‘Ý&¯ —퍓ÔIâÓÐ9’—Ä _ÜÎÍ^³&BFYNY§J»ìªq¥ÃxÁu>ä4]¬»`0¶sxŽL¶±¬ç,0‰=VÌZØ_z‹‚GXÝÌ^¦:—‡UPõh¦º–øûm "ªñ5&oÚãH¡7v‘>á1Žpèð³ F{«Qêî%w(ŠþæWésÔþ.´n×Q‡ÿežÎw›ÂÏibÅýÆà7z•röq©½úÔéÏ™ïUY Ä×S˜&P WƒXÊj$¦c¡,1‹²û×O›³ªã Õ:Ë1 ð§/3™ìéñÒ×W7ãv]Åw‚%žg½;,Ñ}è×ÁcÄo/ƒFjg1õ(·QÍjÂ^ Õé§AA{@U¤V݃,KKùbd–WH3›¢@¿8®Ú,ÆÙ” °·µmb´uyH—qŒµ€ð^4áòŽ\ nBØ!öe*Ž@Qu£¸gA"t–÷ÜrZ¥±d±™…k ú۪̽¾ 3Ãø´Tëmuj­G]àÓ¸cß*V}ì´¶ü¢Q¸[VB®ýÖ­žË…߀jJ> èõL3ÖC-±\ f\ñÖÜqï‡ÿE €,<P-lM¢:0š Ѻîd±‰L>­œ]ì:hÆîaÓDœF†7®+tãóeUÓ̆E ý|h„¤JÊÒ*Á_ô,z+A{Cä-ˆ…_·í• ·ã .-Y ÃߨÁq—ÙÑ kã…2Z!"Ÿ³Î®ß(gªøm|oÙ¹ù5U9Ϭ”­cù¼ŽE[ç>áB|´·­,>À !ˆ"U«{ãj»àœƒìØ{<åФü9x©^éKˆ¶ {­¨77¥þx»~íÓBp+Yô;t'ØðÌ»={‰iÓÄàîvžuû41Œ¤7×êˆkò¶“›¾ ᥼!:Û¤õ#Q’¦îOÿžò–7—à0eÍni£ýÓcùŽ”·u㺰ϓõ.kk„#ð$ÚÒ-œi,±·/Û:Ò=ÓnÏ¢FÍ·R8…,ø5Äß$×m7c©Rw¬m»Ñ¾Iy« Qz: ©Š²TÔ¸Ñ6(Eù¬Æ!)ZPCØwÆ:µÏ8Gm†ˆËD` 7Ο$q½„„ ™¸…‡ÊIã -$9:²jã¯ñs’3ÏÅÀõºí-ÿ%°G•Ö*±g¸³û‡ðf½ã9Š º³64c¸ôÜ¥ËýâĽiæ¯ü:EñM)¥¦ŸèþO nþÔ¦PÈŸKf+ijÁCµ *œí9Û·˜Ãnª·[Ü£c°[e§×7[!¶M3fÙ‘QÊâ2ÀÝD¦,ܧi£<‡9À%…3'ƒƒ"KXú¥JëhZ¢6ùŽÅõêÿFëǃÌëó¢Ý[QCÿ<äòh¹CK VáC–Рè츗xõKG…ߪä@—¸â\»²™šZ[&heþ¼!N•ÝÖ¤WÛJ*›äµ¬î¤`Ê÷H/O'‹U™4C0Ì6DÔÏûþÑÔ‡‘þhdkæ‚DÁžŒ³û}Ïs ï²Ð ¯Ï%ð³F9¿Œ_á´;¦½jÌ1ñÍÒ»†Ê'íÕðÿ<"µlâ$épã`-ÚTŒ¸rŠZ…(Ÿ 'ã?4q Óï>ê§çÑ^J™øùô ä’ r4pC<Ò(VÇSÉö®àm—ÛÕ÷ÝÄ'Nº˜Áˆ¶5sàš¸ˆÐõm¨ÌyÞzŒÇô<¶§úÇåæÏF6JãG)$‹Ú›PšƒoUkš¾|$„"lf;_tØÓ¸â#@]¦>)s¨ -ÛrŒÒÓœ‘Ïy~ Ža°Ýú¦I€Žva¾ ß_™\³<t°xc¢ƒD.çõG¸)×[X°ÉÌCšŠ•Ò™†¥| †‘ ˜\Ò¯0Ùÿ$±óYþZÜAÓòæ6ÔMÜ?ÏýebݵoI®LVmGFXÝéÑ’ÿ2bÓñ‡6ÎÜ>8®:óùwsÙÏÏmœéRü>•t—FíŸý×Úü0Œ­ká±ph1ù‰U¦Ï²Õ—ó%/§uÜ» †äภæê4q¢Ý^à-öÍœ¢ƒ-ûŸAr*¿û|[¼–i„¾ËEÍisx{¸æÏ‘A´^û}vl[øÚÍ]J8'ŽýÖ¸}ˆ¤ÐwíÌ*Ì=F€ªÁ:c³Jö#‰.ÅšÙ»1ñùÂb‚¿¬pN‡™D¢•©n¨zzCkMÀΩÐßë^i°W•ZÀdù€(…ÓD â;}Þ£Ò¦Û§lO9PÏŽfˆ:h¸K#¤Æ’7á€éNOXÔ5Ф¼°ƒ£ƒq#²5ý' I9Ó«X·˜$N2!ßoöùªàÆïl/f.„5‹>Òñ­.8•l¸-ôÝ;¿=CY¯Æ˜%ÆuÞŒ Ÿ(½– ˜Š¹ç™K7Q^Ê£±x;àûS¼Åœ¯~‡Ï}Ó9áª-FG°‚¶Êxà•iÄéÇá§Oêu •[ZISõ0m0£L[¾üª½„¸(…»°nSïa *³Så¥a*vÍ—HšÒž~B B '˜zác`BÏìª'“1sË—ÏÁIó;$%ö¨é…#ß¹íõ”-|Õý¤ Ñë,…1aduà®AöÀn¨ºÿn( “õŽÅ>ßÀKÞt#×TŠƒxasÛŽšVD;ö¢BÁù%úó œ írÛÓVdLç4íTå†Åhö›ìMu±? M*e(JÉV¦dÃ6iÌšZõ¸§+»û!Í‘Å9’ÔßǶs 5ßÏ蟕ä츻0u^Žâ •›yZ+(q¸ÆD˜KFÒŸ4Px4…Ç‚.bý¦NöK õmmw|çõÀ~ZÍÌÈ–½XÄí–€¯”;3¯Ÿè–œ¨´(ç«Ä",SßïG ѵ%LΛr·×YÏW5]:ßÜ{fKŠ*³ô_M@á@p‹æ#t7ƒwv3ß»Ê<ó«¢RƾŠû!5Sر蘼w¹”‚OÕÀè{›¸áÂï8ô €0r»ÿúl˜E$IZ.›– Dts®jÝšE7Žë®£65êð 7QPc‰±ó“Òý¯MT÷ElvüZqXÕ5‚Këhb É¨`„j½þ´Öº„ºas—hyâ‘N/ @¼aãE˜ƒðˆVìDϳ i¤ï×Ñ#ç[OãpE—–•꾺kFWö¯¥d÷q¡¾ëêH;NlÑ*TÑcéë>¡”s<ƒJ·Vìýh`l?·>—I‡}Qø‘†ìIÁ<-?‘ ÔQçå‚™ÐBMñ| âm=ÄÚx-zŽ3Ô‰ŸZÒΆú\tP✜F6ã(¸x›gÃÁÛ–’x(ñUmkLцãÝìàšÁƒÇ¦-Z5ÃNP9±àm)ÂæQ§†·dß–Æ—îz.˜:¢±H†‘ˆd Ñ] Ô\^ü<]—Û¿05<‹ÒwÅa±~K²†ßŽº@ÓôÇJ„U0xÒÖŽYyÞÓÊUõÛJWÃ%¿ËÝ k¦g,:\ö,‚1ÌD'R¥ÀÆÇÂ?ºÂ_ pjÀÊÜHFñyd–¢E§É =ÉS27ó3ïö¢ „öÏ€‚ˆXimIîÜÕ&Ú&å`èKZêW¡£bLšªTVâ]÷ÞÅ7ƒª59–wê+oUå+užƒÑ$®t ¾Åòä®öåüó°$,V˜õ¥ªû}IÿT¨ŸÝu…¬Ìúݰ=1ÏTW€ûÕjåüWNŽuR¼ú#‰<€5F]¸øwü…‚Çq•>ÔÓ-xþË gdãÒåÅ! 5ä[üOÛ…^ÁÊH1¸z¦ï+Vbl£à"Í>U´J¬-•sÒ«ÂAfŠö¾Aǫ́¯swÁŒÑæLõçŽÞÃ>nà‚hz¿´rucò™y¬v¨ÐÀs4é)ïp[XawÑ.7"§5”ìMãUéʆ§ºbrž*•Nç²#TË‹øóˆO– r-n´ßÊw4»‘„Ï‚¥fWÁ("¸ùT'ƒ¾¼žØR…îàÍcÑ$—‚”ŠÀtïxû´Š»„¥80|ï¾Ö ´õk`Úéž…”œkÞN[¼Ò@9¥>¸Åv\›)SW‹gYï옶çNG¢X©ªöË£Áó¡ÒbBï3'CÉF1Θñ®Žl1~¦Ü€ÜjÚFH8«äšb{ÀúRôµ'>âpì7ØM||m㩈LSM,—ÎíÔ>Z·“ñ=ËO“³R¡$ǰ¼K DÄ9NW\AóíˆhËyÇ–óp8r3‰%T‰ WÔ ´ô?#·b‚¾±Âž£.VvS”·YÔ˜‘NScSÚ).âWò_Gúî ©zz×ËH¶É7x›,gNÎ})qº8Íü¡(ïLȨoyv r<®ôËÈ;Z ja6;Ï. ÚVyÀ F.eïÁÖP“P6½W‘Ni¶f/šÁ¢ðSÂõI0'–BSÁ<%|•v â;Ï.iÇ5°ŽH2vŽò¼=øMÜà –qö,f®ßí|x»"ž™1?É3 -ã^LSìØ¸r4 Îe‚¿öÓ‹ÂdßgIùv‹!i†éˆ"/D§âöåqÂs´ê±´âœ¶å‘!»7¯bSmpß(·ö1þЧ®Z¯¶`ˆã1S&–J¾©7ͼ‹jK G2w1‹f\NÛØ´1¨+ü(Ú˜O¼º»Ýc1úɆ5£@e&vù[¡5!ÈZãr½Â×WsqaXEÅfÐÿxÀ¦r0|a™®v9Ÿ5˜sÉ'æ#\/˜„{>" ²ˆö¾Õê糪“ÍH¨I«6±õä ‹*Nn³JÌ»X«¦úÕsÉe=Yõ»ÿ7F~snÎÀ±-·:(ªÂÈ*p6ÜüDÊBÛ×êPô‹Ì(@ÉßíÄ#)ìà·S†% ÝBÁ°æó-/¯ß7 résËœ Ú¶\ªûroA¿|Ù&!]–LüȪYùó£=ÄIZg˜ù£Ï/•·ã‘) ÞÝ;z²È…™9¢ÚÆÛ–Y”Kf_Sœ ûµ\€·;g DH\ó¾V¦Ì^‡fr}Òå¹¾:›~q=O¸{zqb¦üƱ×/[ýãZ‰…§Ü&Qÿ]*äÂżðÊhÔíâH¼~}ž‘F6£“Y2‰#9vúBFɈ¯©lu‰Cˆà2 g´ìpåÐå|Ëy?BÇÕHôÈκ¨œ*|5à<ì ô ‚QLecøß ä÷zöß·3ÄqÕ·& …ü<ÎQ™Pr ¿3…~_V .Œäø†¿Ÿù£ºãó‰‚Jki@–bcû &)OSNšªÒÿ—âêÓ™TÆ…ÀH‹gOž…ÉØÇzh㩹–MÍ3Z©4]ò¬¨É»ïN`£Ÿä¦ìÃCÁ;ÉT6Æ#å5ùß=ëIï(»C0ÝŒ•Ñàñ—;!NWZ±¢²jºÃˆbI$Sòƒ²ØZ…ï„*‚•.Eœ&ðTÈpe¼ÃQ6ÁBuÿ] ×2Œˆ½,dÃÀ#zd€ÞvÏRÌß)ׯš£Ê7¸X{3iL} ­>~=Ÿ:65à”ϳ'Ù·ív ¥;!áJ¡€QÐûÑ+Ûü-@–¾õýü±šç(ãW%@’®ÕÁ-Ç÷àq^Ö÷˜ˆÏ4½À…-¸Â¾²çBòèBªÓdz辞¼d3y€ÙyàHÉ­Ÿ”ÝíÏÒIvLš¥Óû‰+ÈÀF•ãÎ÷EݦŸ”â:Ú…UŒ€%d' ÍSvefEƒÆÀÅ¥Õ¥d‚guÕ¹N|Á*ÞÇÆ!©‘†<(2Ť_LlçÖ®þÙÑ_2æ¬"þ§ôz¿[*î“õ$O¿lQ1JŠÌ|Œ:¤Ä7þœd“š lxÚb‰!»^^ô`ÒiÙiÄL˜à’‰Ô|Q>P²Œ=f$š« %<®¤¡€óÛ²y_ÜÌmÆý TêSu›ù(gNuÑå3æ@ Ê÷6¤§š‡¯¼âÎfœßßn•ªpöésGC£3ø2r¹ðŠrÝao˜ÊÄαZ§91% ÁƒÝë_F‡OðÜ’r;¹¤oÞX-k2:¾‘H)Û*"¶“™©?”FÅÕßQæÈ…4Rç½×ärßK/×xõ/.Á¨ltTqâVÒ€pتY?›V"n“ÑVD €U·Uá–™> Hϊè²  ÃoÎiÐRã(Sú²C úº4vŸn$#à“ÂMƒ¯ ÌzPI‡õz1&x“sKú\ ^íØXƒQÛ}4¹Å$É’D ;„°+æ3ÛÛÑ£ó”S[>“fH ^Û§ÁR@·ù•)ü”ë`”XèϬxíËõ‹Òc+5þ„ì{º$G=ŒL}KŃ–@'$øMðË!od¦€À×—Qy°‡¯? YÆlYH#²$²ºK‘GŠ›Oaœ°ohí¥KÒØØ¦<Ú 9ˆƒý°G\ñ]¿domõYŸðÜ'cзO`rNôÃ?BÀo¸ªQ‰âÔŠ!KS UXM«hÀ”–Ú?á˜|qÅ<Á´>ÝL×\›žÌ›ºŒ–Ų‰9D–Œz|…Ô5‡9HÁ™¡aº‰°'g̪W*º÷7"pñÞì^°ts?f½^q’S£Gp[ö¶B•Iõ:6—–CÈB”H5>r*Ð#ÍwÒ^B鞈¬Î9ÓúvèP¸¸ñgâÉK–ôNï"Üó}DºÚìÖÎÖ]>᳿‚•;D!MÍåÊOO\PܨõW½Þ%½åÏe—0Ö$Îz”p5CÎɹ› L·Uš[AAA3®HÕ•ñ jÈWŒþÚ”´x†í_NW‰­0ú^!ö˜¢¾F°p,î œU_x}s-£‹€þÖÕWc„ë(}@< £ŒC6©ÈŽ|縒OäcÆØÓ¹˜ŸguWЫ¨4ÎÑiAÒë.ZàXõCëAJ—iSt©Ž$ÒzÔ [OÂ;ÆP1´ ög"ƵӗÌ>(¢ìéPå™DŒA=ÒžúÆc­˜5›¨:•ÂB ‡ê…75d—ˆ_ó‚`gmp¦±7p3¹Ø}°GâxÉdóÎÐEGnhµ×tµÊÝ ‡°¦ýOÂÉ}3aœ^¿ÞG*º]rw \ô}ËŽL@ø—ß0ž€T9o²ðDû>$Ô÷Ö]™bªÉ‘‚¨Y‹(zä+/ U®:LÖ‡ôapßäÕ»-Ê’gÖ2}–°C-[t·í片GI䊯ÕV'pÐ6pFĈj€5£Ô¶tCà‹¦—OÔʇÁ9xNMÛû¼–G€IZ‰‚âN°LeqO1ò§ƒtÜ0‡s=ÊÈŸ‘!ƒé‘“0¦h{Éèç-ß┎ç™yó`ßx€ÔP%ýFغÀXz$³jg·yé«€Ñw{cfÏÙýy´*àJh$Ö®1ÜÞæ^w0Ÿ~-¼PšOVâ;ì…jì°^£ÈNÖŸƒx9s7º©CiŠ6†(j°Ÿú} ´|žMëlö€›ªÊa·n©“<ªß9wW]~­††ªFnégW›5;UÓ7 GJÊz†8 ']燹î¸YðøËÕ´mfÏw<È€ë@¸•?²EJF™¶Ò¤@ÚË¡âDjz@´×¶ @¬:Ä#ýÍ5<}†ý„îìdTýý-™èñÓh§¼¢—o÷¾pàÂî‹§c剅´ŒC™àxö¢Ö&©|í|BwkZæõ¶›Ž-—ã•\à~úoOøíÏMp%(&ù¯Éÿx=¢ùÁèCVwTª¥>Ñè•Û“”8nÉàHÈ«yÞåÌ‚cU«nÛU˜™ýGÎzAhÍ/Õ Â\ƒuÞ¬µ´ˆÓtÛ­Ž`ÞUm k£†ð„Ài‹W‡˜½ä5,(Gbå’&‹è²ûáë;êˆJGé¦?åkÒÅiÞ]­Ì­%¤Hñ#?’¿Í©–kÒã¡£*á"à‡[·EBœ?x¢(rY«+^DôÚàJ¤àÖmæ0®{½²­ GËcli&!lr#ÿ”»tÙÀRsü©G̲2ƒDô» ~ÒlæÊSÕÓTf:ZåˆroZïêó#å~ç¹c#Ö+,}”p-TEOjÔCGêªÆÂ.)"ç¶04 UƒÒTHÈ£±)p©î³3ÖÝ J3àÅ´˜“JSÜã†J‘ºƒ %Ôyrݘ‡(¡Æ“HÞ½0I¤0Çå\ºhܬa+‰óônÅÍGÜ©?Â@ôR—U à=»ÿÔrç½’D-±EG“½Ž˜×SÕÉÅΖå†1”Ñ\”AažGÖ2Ôœ<¼T ÷SÉ ·y"Â]l†eža ±Ä:;ƒÈÒ´Út ]Ie0Æ·Ï®FŒþ¸@>m@Åau†— JKñµWŒ}§DQF!’ñé;‚€Ðm\»yq'¬'õ³)øsÕø«fèÑݺú’Ì}Z°ÌWäéäUB¶ºÈ—é#ƒËBOļ–íQÎ1ô«f”äø9óP\‘äŠz[6lÜÔ$Ó©ƒfMžÏ¸³á½QÉ%FøÓn˜O$š ªVE¢V<Æô’بßpEö®?Õ›–ƒRš¼}Û ‚a0ÌœÅÒš–ïl_È5÷Öðû!ŸlEY b¾b{¶ˆ· 1ž®aÉy_³½è&¬ìæòо» Ü? »4…à‘z+Î^áyp¡fu˜¹B7W)’~`ÉáíyÄ}9ì¶Ýoˆ+”{÷E«3ÐËâºIhCGå˜O–ê‰tL†RBSÌZ>g€KbºL3S¢a#êˆé&û’iÓ•¢îδï%FU6þ̹—®¨‚ýš@oÄIŨ|~ým¿´1rG¸Õm2·ùd“cc¸ Õælªn¬t×§Ç–a/¨ÆÀß=ó€zo%ÔÅ; ŠÜ?•¤Aåv©!a,O¬ñ>+2Ȉ!ó+"¤æ‘½ˆÝ”ÖÏöÄ·§Óßë–› µS|Q!}ßg%X:-GÑFݱcÕváG“%1*|È©;Ÿ9%õ¼’.‡ÄäÕè£ÇÄËmÉÛ¾©ùdæY äˆÏ«5Ó—$÷bLO¯1ï í2ßfõl*®ª»Ÿ&ŒpÀ‚£3Áó³Ø¦Ïªk-Aò.pïþ ÌÃl´žÐLHœ0c?c#ZE6À›U¶æäø— ÚêbEÝH Z–ˆÖ(M;FƒnôáN¸¹P¿iäé -bXà<ÜWú–ÒtcžE½bÐ ¡…IÓMè8¿fDõÅH™^‡¾)’Ò^ ëÅÁä^^KˆäÔüƃêŒÛsÑ|‚O)¬±ptÅu¸Ê~¤KÆþ)Ä£øÝ$ÊoG ¸£¼–÷kK¯iÂsÛÇJè~•ë7üTGÿ˜)¶¹¸˜,+…ø¹(û›ä&/íŽeýç«Ôæ¼øm`È´ó†qЖoEí6#žkwiž!q~§Sï®7¥BÁýÐzÎZõ×¢#óÊ3}74ðV£ZêÄÁ¯Û²oÎëÒñ–¶ìÆ—†PëG¿ýª2¹MA‹f…ú|ØéÜiKôztÜs5òª4Ù7ÕÞë0h ¥> ´ÿà2BÒÍSÍÈ5ãü2JÀyì÷*±JdÝ0TÖàé*U]ª¡Š‹\‘'¢PQ¼¢"ÒR84¥CY=ÔpºW~2Mz5TGú}¨B¬•0äÆ~S4ð*åzÅX(Xq—ÒtÇéöˆaÂî2ª R¶È ´7h,‡5“ýt×W—bà@íŠr½ÅŽÅ[¯…×°< Òé›tÒtNÙM}ÊéÑÅñiˆrLú3§'¹lWL™GݳÛÓ»}´XãêWzOj!ÎT>¡„ÌtƒÃ>ñ^F/Öüáæfê)9ý±Ê„>ñø‡ÚWǯ5«x³†„ ¿¬¥¿145¿Dnð'ój:–”<–‰¥à9iR·H.tÁ¯²MSlåqE[¶Ä‚[-C—“»FÙÓšjxiÄ'Õ>Ä+q_<’-”È êi'mÀ´Ý»? •ž7ÆH¹Æü|Ú+’3p÷ãG"O¹â¡ã<çÁ'¿ïMÐéëNCâÕtÀÂz¨a¦«AC f‡/Çòhæ€.-czÁg1gä§~HMœÿyºÑâ¯KðãËfmOF‡3ÉWh¼ i–YoaÝ)d7ñ\WÛ¹|”º†±›Cb›«É¥ŠÎ÷›”i/×Ìfhë34”šJùöš$ÿ€Uólæ!†cúe<æ4÷’ ]Wü¾fN¤^ûß)`=ºqÞŸËÑ\ 4:YˆÎã9—}N2<ôÃéJˆ„€U©”ö:MˆLá=:sza]­T«&ÎE7í ñ· ]ºÿÒá(XA¯Á2ð(ÙñôÒ~]Û•'…[ C«¾ŒðÈÂU¥žpXã ÛÅÎ×ñôó·yÝ÷üÀHSò¾y(ïíI¼› DVî¼Ëjïƒñ‚>Ò8a5ðÑØç/y pømº*k¦&Ä—'hË6b3p,ퟕ¸ñxIçóª‡á¤Ò4ΟýüÉåõw½§ƒ†6\E[HècL‰ÞfV]U`nq>)äkmuOàF–äÒ$ÿ4ÑÑ>¼g¶¨3yëÆž¯qi;"#ŸÎi©æïTÃn5G[ ßÌékQ­Èƒ3¹‡ÐI5»ŒIß‹|¤"&äFÃXsÅ<ÏgïHãªOq†½Tc?gw½Á†lÙÄàB-ìŒã§¼›he‰XJ„(Ò‰ßæß9NÍ´×ãÃöá=nîV»¡ÏSX-=¥R='Šu!K‘|óŒ“M÷à´d+9*æù1È 2\Ú¹Wkëh\‰4cÿéx¡ý½£™Cj°z; ¯'‡ãôãÑšBméó’{Êæ9?bÍ«µÇÓIfd~n­ó±Qàú<¸‹Ð…‚*ð6( „ƒÝ~‰x M•›ŒƒÝÊJβ1=Md™Ï!çKÅW`Ô'°MÖ Ë.§u“ÓZè¨kSB>EüâÞÓ“‚¦¹¥ø0ASÇ ¬Ê¥ÚNõ¯5…“üôcl ­ÄK‚O¥ M¶à÷iW¹$U„é«g3Áq2<Å¡³´AsŸ¨3Ì! 5‹ S ÑBM檰=2J4·ûYŠm‘Ôr  âÜ…Q?O”maÄšèLüJpB'!å<ØQ0›™³1K]åGŽžÛï¯7aL[ÚõiÍøYð¢ŒüÙíuÚNxÆÇA²üJ6K8§Œ•ú^óRƒ“Í®¡ãxY5*Σn”?1‰§l±R —çǯ:¸ÇFª[áÂüÇ$ZjÄlÖai¾…` ê1š‘&÷Ú•‘=‰ìýœwG´Â¦E.k鑱Íxo5«ô;ïzµìÍ 8<üΖr—h5J2eŸCB*–U—ux‰:êýX}ÃÑéͽ›ËñK¤å²ãÙºT¸c¦Ï.S–Φ¢~ µc—9ÝŽ/%ÈåëJu¸íL+V™›L¹ü,8o…e” üOLJ•ǵŸ6£±x[¬jf–]°úsÌÞ”O:áþUügBPÉ•¼­”iÞBD#ç©°>ÉT景£Ûh*Œ;½e›•±§|f7«9™Zä!ôfÓ…·ü+ÿ͇L endstream endobj 264 0 obj << /Type /FontDescriptor /FontName /IJYDFF+CMBX12 /Flags 4 /FontBBox [-53 -251 1139 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 109 /XHeight 444 /CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/P/R/S/T/U/V/W/a/b/c/colon/d/e/f/five/four/g/h/i/k/l/m/n/o/one/p/period/r/s/six/t/three/two/u/v/w/x/y) /FontFile 263 0 R >> endobj 265 0 obj << /Length1 1500 /Length2 7519 /Length3 0 /Length 8515 /Filter /FlateDecode >> stream xÚWuTÔ]×¥Kº‘º‡¡ éîF`ˆ†$%¥%UBBR¤Sº”îîA)}ê}Þïûã[³ÖÌϹwß»÷o­acÒ5à“·‡ÛB”á0$Ÿ$ PÔR05T@ ! $ˆÇÆfEºBþ©à±CžP8Lò?0Šy—{FÞAµà0€º—+@@ *) & A ‰¿€p„$à!ØjÐÔá0ˆ'›"ÜÝutBÞ­ô×#€ÓŽ !!Æû» ïA@íÀ0€éq»[Ñì 0€ÛA!H¿à”vB"Ý%ùù}||€`7O á(ËÅ ð"úOÂbøE  vƒüMˆÇ0t‚zþQ2€; }Àà.á µƒÀ<ïš¼`öàn}€š&@Çû¬ù€ðçñ€û³û× (ìw3ØÎîæ†ùAaލ+ £¬ Dú"y`˜ý/ ØÕ~×öC]Á¶w€ß›”åõà;Ž2ô´C@Ý‘ž@O¨ë/–ü¿ÆÜ´Ì^îæ!=ñ~íï!±»;y?þ¿¯Ø÷ü;@aö¿¨Ø{¹óÁ ^µ‡¢îRxÿä!H€@<_;'þ_‹ú¹C~§ïx¸ÃÝwT APÈÝ^€'Ø@"¼ AÿYøw„' °‡Ú!¶G( ïŸéwiˆÃñ P_€èN„ЯÏßOVw:³‡Ã\ýþÿ¾h~-MeUU3ž¿Iÿ]VP€ûø%|‚" €€ ˜0@LDôïIŸÁ_üguÁÐ?÷÷Õ`p€Ä4îÎï/*ÞêƒóOûpþ½‚6üN×ç?6°‰€ìî¾þßføÝòyà×”ÿ‡ þ{OÊ^®®¿œAþìuõûs§l/äK´àw^ý7Ôò‡¹à®öÿ]SC‚ï¼"s¼Ó;Ÿ€0$üGê© õ…ØëB‘vNèé¯ë¸[Á ƒèÂ=¡¿Þ@w] ÐÕî,hçr÷–ñ¼»´ß%ÈÃþ½®ÌnÿËŠ‚"¢0öûÓÀ]$¸ó¬=Ä÷·Ìü@y׸cp€#ð~]íøU~¥~Gâ‚~ý¿# 1?øïHàN üÿ…üŽÿ„wŠä‡ýG(à÷üþk»v^ij+ëŽË_ñï×⠱Û‚ÛI…:W‡6ŸWÊÓúðm~&èùöüÇdC‰Æ{[/DQúâD(/zF¾}b+úb…t_°è¶ÎÅ”äb½ø2Z’r¶¦ÓÁv7p„TærßSÓKpK£­ÍÜFfïHùµ^¿ÏçTnœ‹Š×ãxs2kWEš½¾ü¬Ìé+6Gí >Ú§Øhljqq!|´Ðù¬–r…*ùñ‰V5VÏorŸ’è•w/^v ЬõÌ•ð¢BW_Òîí¸kœfíɦï|½¯a3gÛø¨D}•ÀrÚÌië9¤›R¦±“1sÕëGùmæ¥úʇ7A‘:¶dÚÛRµZ8©2õÚœ>e~“‡UÁÏ*:Ïå5#»—I¹Xl?GBŸèŒ1'l¨Ò¦#Än‚m;oD^s ’§‹¶bÈxì­ðÅÌœô_T­+%|ôß9.Y›u)è,,9á¡.f}VáÔbêµ¶?˜ºø]èð=ÉÏ€W-dv´¬ˆü0RŒÔ²‘\w]à[-ÕV#I—–dçM<¬à/ÑdS1oŸNéDí@—·È…XÍK˜?zIô¡6mƒEÇ<‹êçï[{Ëg` å™ÌŠÿÚ~×Ö %ÔòcƒèM1úöÐW*E傳PZO‹Ç(¢ŠCõKKtåö @ùuAN’A‚CÀdJz~Ì“!+Cò@LITDiIóò…â¾rÛ½,“²Åœ™NŒÞJKú /oéÌèSê®U§ñõ/'Õþ±ö¤»¡¤J8"^ÙÃ4¾ÊMãf½?–ŠÝGK !1çzçËâë»FG¡¢nsÛ É’;?nÐñÐ'½+‚%³Ó_aÔOŒ°‚û´]Ào¦~Ò€of/¥ñ2ùd1#"ÕH0Òc£Î? 4.„hÝèHÃÞŒ-ƒH»Êþ µjkM P/ꎱp]ªa•¶ÓÙŠW×û­„?Íœ-š&W/¨ó•Ì _8£†õfÑ(APª*x0ŽÓ‡s®g¾%.Ž5¡Uo|V¾’˜'* 'éìLœÕÆ,:<„ 5úY-õ>Æécèƒý¦Ý š½* w š£7}Ë=RE Çõm©ï ëÞzùLNOÝš…´Ù°*“ùmŒ'ûñóãß/Ⱦ,°z6‹ÞÔ&7¾©wÈð,>%Û®ñŸP#HDEÝ{‹oÖýÆÝ^H¨1ÍAVMÆ)YS@–!‘EtSNúDeßü´¢C¬öN›]ø$–1Lʵ‚Î$­¿vÑ«ì{cIÓÁóï¬èƒä‹i:  Ž´Áse(œS¬7¹-C#t·ÎþÔziEÒŸnn£#K%KÊj<Ó¬œVΫT?6ÊÖO· w¸tïá˜z—™~pµ¼VæÝtø™U®òú[^Î 2ɬ`·¡Ç­£Ç%ˆ‰MÖ$‰øÒ.—¹,ZßÌá(³†$PØyÕ‚ߢèß”Oìlõqù>‹•9äÂÍ ÷w/fõ-´î7âþJüþ•Ê(¾Ž²RN=¦Vbû`hÂD¯I•R,ŸU“YƒMêyJùZè­åþRá7¬ãœ/€ŠgÊoJX¡slÝfÃ9H2Ãg´²Èç(ÜÚ—æ+|Ñ/•¥6ÜÈÕºTQ>bÄemû†3áóëEÔX8L4>¿}LÇQÉSdª€ÑÙ¯øD„EÓ•‘9mEÞ„éôj5ÈwíA’†Æ…‰/)I•°à†âG‘)ò®Ö$<^œdþËz³g—ÆÙÉò?pn:’œ:4¸†S?Ÿ 9ôÓv²\F|ê“vϱ‡4è_{ÇT«òœåiHëVOžp"¢ýkT‰ð9É®_wÇÏ-3 t™£ қĜ3( “Itè½)<•ûõUL›5?_Ÿ¾A>èVl«J/G;'àÅ[À>ÐP˜?äxÒ^†ÒôvøÐ1cÝÑX­¥y…«Ó~Ê©S46åüðrê Ss¯Ö SqÇù}ÀÞVN=D®NOtŒå _ø £Ä¤ak‘¦®b¬2@UX‰˜p¦Ï …­?Äf¹ñ ñýRÚA8{㲤0Í-7Úa¡­š*?擎JÈ~"(.ü&Ò\@P¨¸{{Ú<¼Ã“¸sëáЄiØ£â7A.bÊ ûÙa#ºÕ%}·¢a¨¹µ»ýQ¸K!ÉQ™‹‰j©]›}¶1qóÊ×ýC“*­Á¬Ÿ{4°<Âæ:²ŠYzð} KK<â9åˬ¸sŒf?µ‹| ÕçƒÂº'õë5«Ó«QÚ’Ö- £¹¶ÑÏ;\­±úá¬ovêô8>~>Hc»Æ;—±ø!X$«çŠpîW—0±!ËšïÛ’É?Ž0]ä,£}ŽdAmàÏÉJ¯Ê=´°Î3«õ"ãþ‘‹ÙY\€ñ–0ºYƒ•ZåYè{ lR¾ä­vW»q‘ÂÊ J¸.ºÒ>§ OÇ-íqyzN/[‡å㡉ÂÎ'][aNAGTå–êâYk6fË\e†pÝêýe•Šý|@oVvZ)ÖA3 g:у|†C}æÆÏ>ü¹êå pæŒR¶=Îy7j%ÅP*¬D7¦Ë•Å€ËÅȹÆúXPÕØ¼‡Q¯"Ü5ì*‹½NŒ:¼hæj~\º¾j:I‰Ùèä‡9*.j!™†ö Éb­ÛJgz£`ºYõ2›|†ƒ£ W…´ÑúÎKwcÖÑÂS®~ Žõ¥ÒB4~Éw]XÚKºø˜ÀÙø‰çß}Jó;r\±ÈÉð8¨ì:¶×€±¨ë}vÛз›•w[äüµƒë][Çm¬—q5iZÇ,&KVÅE¾èèÄ%æStI«"÷ƒm]_Cz÷…éL•©+Ú™×ÞUaU IˆVGÈ#‘xÙ"Èߤä¹wèÈÊnWKqé$6 î0‰d†[¬o³U–Q ³óÄH~ö86«ÍØ;)e1 ñ2/íÛú›lŠugÖu ½÷4_4Dah2\‡+îLvÍ$¢ÐްvN­Ì#g’…¶ß¨¢qðieŒ¬5‰V~Îox-Á¸ðɇ·ÔÚÀq/"‘>}8>‹Ëu¸0`GO½À}€ÕÂÐiñC~pª?û þ|ç\"Šñ¦w‘¥ í—°I+ £40Yt5µñ †¶ÂPѨ¾óíÖgœÞäÊL⥄$#ŸæÍëÎ6&›„èÞûn£ñ¶•³®[çÓ6%ÂLQºoqL“_è2ÉØß“4“~oA¡ÉÀlnN€FQíth~5©…Ë1aU™*¢à©FÞzõé!Ë–+®ÞS¹á5õð‰…˜ÖÛãy¦„$ÌóµJúÓÿÈ¥B%ÿîçú®›*-U_i Z¿àý–_ª5‘ì ÃG#ùe„ü”d±ÚTS:îûèŽäÓ¨]çm\D—øf”Ó(8-°†sæÅ¹1´2Ö†©qiT·>0íÌrÐyîFHÁÓ‘Ÿ˜CÓ ØÿR¯'?øX!m_áTÈ¢ UNŸ÷{Õ<—QimÖŽ£ô¸€”Š,)>²žª?B_ä^ßCIrÞñÌßœÊjŸ}QlÔ'Ñ^~og¤æTÔ)E‹Ø³yu¸Î‡ïÕÑÌ 8qÉ>xt%®FšØµX^!MéBÖªÉä(Grû/aÖû‰f:³þÐ҃܄›Ö*Fc¥™ò–jÃ!%赞J‰ÂZ­X‚`ÜYœ7Š}µV°ç™ÊË»ÿ1P&Ì—[„äË›Icê‹Çh¹`ìò¢Ki?3ázÏ48C¶»š¶•D³å‹-}.ÆråÄMÐз­‰¸çÒ4õªµ8%•íJgpÇMbPùJ\³‡Ù©¯7á*, P"Öó{#ßÿTÙôÎP%‹²%•ËåÕ:¢²®¾xX.R›Nµó"iRºAPæË@Q¿+J—>y ù(ŠË³3vžO =%ûJß¼S»H÷ÅH"zXÞéÏÍ q©~¶¿PNö¢6Ó h‰`I„}OЫ¦ÏSÀ§æ8l¹—{3úi.ÈÑØÐtÀµõl®Ûw‡¤“i#ý^I=3ÆÇ‡ôÄvoÀl¬¨³Šì0üyÙÞ(}ñ¤æ£±º—üÏü¯€Çäí4dè|ù»SÒmŒš¤ !Ž+Oý§³¡'.å³ìÙß«ùxÃ$¼%íI&_¼®Å‹Ãï(sº*YÚ1>eϪϪøX•ÜY‚xÆ÷y'¥q“p-5§³¶°.M'õ˜øX1³)™-¶-˜Ó$Š7ÃÛ,@ÝfŒ!þ(ÁÔ5ºì”K2Pȯ5Ît+Y™¬-×(¾CU÷2D¥íü ÿ ³ª0ìÊÆöê%Ÿc¦y}iv£}(Îâ¢Çô3â ›Ì.SÏŸÆRE;/fÑ>ý,vbýôT™[>æqF>Ë,ÐM;èg‹ab|áÁAéÂ]æžQføÉ9ßSȬþÏàÞô3†ï$UÀØokFý5Ðë$X÷ZÔ¨(ƱÛe Ù¾QãÕôFÙÛ‹•ÅðÔûkÑ…Ð@Uè%ΆO}ÎWy_¡Ú ›uŽo)>>à ½$5|ÝÞyh$äo°ÃÑnQt®â&sXCCßO„Øu)äGÎ騺î næì«t«Ê·J¦­õF¶íV,ƒª˜RÒÓ¡÷ðÞ3‡Wc(˜v‚‰3žšÐâëW¬ë6T6TY*uYð#N¹Ç©Ýe±vÕÉ+î <~íÏbô½Ž®Ýzu¹¾Ú`Eæ=¾ñê|ÒCäVâÇYdµ\.Ñ6Y†»D'©Onü0ü(#h‰¨É­1€4ÕQ“µ7òŵR’ÑÔDeža³öûÛ*ÕÍ”:Ïò&X5"†Ð†A̺G mÜþ› Sí=[”­ÿwI[ä‹!þ4â'EaO¦#œ3‚,ý£K𲏣?©$=D[»R"2õLæá*q¢×'åè5i+-‰CWSé„ïº÷ä¶,ÓéjȲÛ/ì^*à*¶ô&cÏF áR)e4Ùø‰ÓnÜ>§Ë¥EÝV:öÃÖx,!R±’Ù’ãgót.2Ó‘=uEl…-häXÒ¼7‰ÎïOK${Óç!EûÊ_¨.jñ 'Eë7¸WÅbÙQÌ3¹öâ’Ý[¥£ê©ŸKÇ]oüê*Ÿ^<ª2Vœ&÷A¹ë¤ z¹«_¼Ýí^ÒpQÄž.g2µAA‹0K!(oXÜîRšämâÁ`ylÉéñFºƒYLªÅòúÜ«·EB{%ïèV#Ý=^±}x®·æhß6–ÿ­9÷¼Ä¥-cò]ŸK™Ä×ô¼è–Á†ó2V™ÇBûcÍ·cíïç èÉ»”’Ïý(ô͆ŒTÊ­ª,¿âWò"èÏÇ„ôÏpc+ì»Ì%81d14”?ÌW åͯÒ!&¦Ybe¼~nõ%ÔA–F¢>[Ð(ýÒ¬Ðãx×AÞ§pyÖ…wj•·Çþ±«i/+£<ƒê[°`ÞáZÓ{nü^gTdïûs–G<‹°<‘™—'½Sl¡¨ÜʹFÌ€eŸÞ6³†^‹fÅvÙ¾U×ZE.”T„€™sTv—÷8òa¨Ï%86•(0ÛQ´?²{­k‡<[«Ž£FÜy·ãþ*j8çÙ´„•Àö;c eÝ k¹f³æØU³[MÀ ™úi‘üÖÃb[S»TûnTbëÎÇižµÎ‰uzç½1òç™rT‚Ï«p±‚êê§sjYhÓxÈeŠã-ý,†có–{qoêpšÖå¸IíÓ—Q‹j¶™¸žT’ŠÚŽý›MãäÈÕÒM»<™ðn<6þ¤jþ,ëCœ-5¼¤-)ôÔ,7¨¯—#„U »¯¯YËÇáÍ€˜cÝèˆL8%‚ …?n’%Úr€åÉ_ò½H°ŠÞrÙµ 3JÃØ6 #^)Sm&zFÈèù£böí¥”ý—ŸŒ*¦9øW§x ,IOãÖ´œó@ WêÎ…ÎOÍ?›IÏÀõð5üb‹†éš#v¤1@Úö‡’ógªª¼*âg¬îTð¥{ƒ²SŸÎ„”Žq¾ËíùÓ¿ùi©[­Ã& BÛðá&” ê×mg˜¥è±…Ã(|Œá“óô}XJË­ ‚Ý!,WèlXõûÐÑ1´ÚUÖ‡q÷Ge=qã¼óçqÉ_¸ä‡”€i[ë1~HGߪžÊt°-µdF‡uuʾƒÎY©eææI£¢O>®?2OÏPæ õ ²mVAo%hÂ’cÈŸKy¡mYΡËûã¡=Ëì E°„/˜Uö«îV… ×ú;»-öÖ"Üú ç³ý- „ïÒÍ>="†CA 㫪/=[ytÝíÙ²ê…[ȸ˛&bΩðbWU‹ãxI«:Îæ¸É˜DÌ|p< ÷O;´ëþ0ot¹¥¹„e»@›È©½ônì{Z÷î#©äuh[0[Ô…¬Ð ,Z$ïˆ\ÎàÄS ñod]€‡iÔ¶bКm{aÉc)|]þ¡¾eF'·x!ˆFáÌN÷`»QéÌþ13%f«…™Œš- ùJ%ã$£QîeAx]HQ™,Wê3ý·Yb´ÒÞ~ƒ77Úš"+¬ÖáA~_:d?Òy³Bö˜º¬ö©´b‹¡RxÚ;¡-N¿çHU!P¦Ð½°GÊ ™âT_KÛ¿5äј³Ç¸Ïn²]ûQ oJOåQœ kåʈ1IatÛô#†½¨å¦î”iZÎJǵ²\°A—QjWÉúT"[TŠÞsà=-]|=NïFÛõ6†›A©VUªÕ˜Çöá– ‡îAf—¤ù¯éѼ‹„\ŒÆ¶¢ ‡/“N\é§.W÷>C$“6.©Š÷÷´ÆÉ˰b»!C G@±¤x•ûF‹ ñ g³©N=gkÊ]*k–Ô¦Aû7UæZBÕMK¬þ¢·”x]Jz^Т’øíê’XéÛ!gß¹÷9›u ŒyÜxˆ^·õÅ¥•èãyà5¶ˆ³zÌÜ"lªT1Œl¸]cß’ 0À“ií±ö×f¿Ë ÔÖòš²â ‡ nedÉÌü 0—vÒ“Ê,¨j:ißãž;xªÐrI¹¨ûêæ!b ½‹‚Ê‚úíffŸ¶c\Hž~¦|NŽè€Â-üX|Ä×F-mq=ójÅÝ›"ÊÉþL+^¯?lQet¹ÆR…P%þ2BG Ý$pxl_ÅúõøäkµT/ÜæXr4Ž531Z8AÓùr†ùR6ï1þ¶e±$Ž}ÓJÁ^šÛ¦ŠôpQÿqÛ“5yá*Ÿ©O$­Ê8MñÊîy3¾Ö¯g÷­™àÌ Ùyvñé¨?ßÓ +NµR+ϲYŠÚ°AÏë/›ÏÆúc±L¯¢6Ÿ–Ç.F 7w‹^§âx ¨Å»\‘°Ë_èóñV&ôâ:©“sñHŽ›ý¬iùšïÚrmÑ•€8³:‹{æŒ?—õÒrp÷q¶½2Ñ5Hy \ºÍ’bOL×m2Úßõ»NœôsU »æ»õÜ‹î¿?Óþ3öÅðCb’g~ Ÿm/€|ÉJ÷ú~kv)ÌH5´½eJÐ-1ÈeaÞ™9â–Œ_-vŸ=À™VúŠÃÞc¼@Ä©Öç(÷ý†Ä£2’E®\ÑÁ¥ *Š˜¬Qù™ôú{çèç r‘æo%°=ÄóÚÅøÜI#µVMŸÿôk^n0ˆ´úb®_aXËP( Üo¡J&÷L`‡{ì“à¯éTTbç¾Èõ¦€¸,ƒz-ê©ÄOfO%n½ª¼ð/HE 0¥u3g-&â.²n€ºÞ\þ[x¯”/J£[wòôr"8ß¶<Ùê1nÔÞsyÛòi79Ædf_Â*/c >ùhØo‰ç‘`…¢Œ¢†à·ðä9{tÌ¡tliïÒˆ¬›M/qJ÷¼Z©À§â'}Œ÷ï]S ›«D°‹\å.8a‹—&Üb_¶ Ã|qÖ”[R˜^_ß$ЉnlˆŸ¦HÓu¯L+ÐÙšfåX4u/Ä`ͶèMQ6Y{æf´Q¾¸@rºwõ!®ñ±©Í9šÇ#„MAˆDàäÚt6>V¼‡4ïâ ‹“ØìUëUmRÃöë ûûéÖ™3‘ö»”[R]±Hš(.b\ÿþÓ{ƒ endstream endobj 266 0 obj << /Type /FontDescriptor /FontName /MLFHHY+CMBXTI10 /Flags 4 /FontBBox [-29 -250 1274 754] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle -14 /StemV 107 /XHeight 444 /CharSet (/G/R/a/e/g/n/s) /FontFile 265 0 R >> endobj 267 0 obj << /Length1 2549 /Length2 22421 /Length3 0 /Length 23867 /Filter /FlateDecode >> stream xÚŒ÷P\ÝÖŠBpw·ÆÝÝÝÝÝiÜÝÝA‚»C€àœàî®Á%@ÜnrNrþ÷ªî-ªš=¦5mínJRuFQ '3 ”“£;#+ @\Q•ÀÂÂÎÄÂÂOI©aãnüW O©tu³qräûÃ@Ühê’I˜ºƒìröVv++7 €……÷?†N®| SO €"@ÎÉèO)îäìãjceí¢ùÏ#€ÆœÀÊËËÍð·;@ÔèjcnêP4u·:€ÍMíêNæ6@wŸÿ A#`íîîÌÇÌìååÅdêàÆääj%DËð²q·¨Ý€®ž@ À_ ”L€ÿdÆO а¶qûG®îdéîeê €ö6æ@G7‡‡£Ð"¨Ë*”Žÿ+ücÀø·6V&Öÿ†û×û¯@6Ž;›š›;98›:úØ8Z,mìe)&wow€©£Å_†¦önN SOS{S3Áß'7H‰ªLA þ›ž›¹«³»“›ý_)2ÿTeIG q' £»ü_ç“°qšƒÊîÃüOgí¼ýþ–6Ž–%aáá̬éhã┕ø×$‚ÿ-³º8YXX¸yÙ@ÐÛÜšù¯ð>ÎÀ¿•¬‰Aø9;9,AIl, ð~n¦ž@€»«0ÀïOÅÿ"xVV€…¹;À heãÿ;:H ´üƒšïjã ÐgÍ+€å¯¿ÿ>‚ÆËÂÉÑÞç·ùßýeÖÒRPP¡ÿ'ãÿêÄÄœ¼~Œ,F6Në_CÆ zøß0ÿ-À’ÿ[ªbjóïáþˆ(ëhéàý'Pñþ“‡ç¿cAóïÊÐþ—AÉ 4Ë@ÍïÑ7`ád1}°þ^€¿]þÿÍý_QþßFÿÿHÊÃÞþo5Íßúÿµ©ƒ½Ï¿ Qöp­…¢h9ÿ¯©6ðŸUVZØx8ü_­¬»)h=D­ìÿ[F7)o …Š»¹õ?3ôŸ.€ÂÛÛ8UœÜlþºlŒ †ýháÌí@ЍW«€ }ú_JIGs'‹¿“ `êêjêj=qüXAjôþ{´ÌLŽNî (½€¥“+ü_åâ0‹þ%úq˜Å~#n³øoÄ`–øxÌ’ÿEÜ,f©ßˆÀ,ý±˜e~#v³ìob—ÿ@ì ¿ˆ]ñ7±+ýF våÿ"»ÊoâSû@|ê¿€Yã7±kþF v­ßÄ®ýØu~#»î/ÈÒô7YšýF Kóÿ"NÎÜÉÔêÿH88þ’88üöÿk˜-þ€ ZGñŸümJ×ò7™[þ9þ‚6¿ñ_Æ¿!'û_Ðóøé<\ÿ2±ú‚Zÿ>>¨€Ö>ÎÖ@Ç?,@²?Y@'¶ý‚Še÷UÄþ*—ù€Jñ;2'ÈÕ´èAÉ:ý> ÈÙéÔ dœ«AÁœA/@G{ åïòq°þ+uýŸª²ƒ¸œ® Ý¦\Ëlœþèè+³Ëïnƒ]<œÜföÿÃÂÎñ[ñˆxÿÕü¯˜õ¯ÆýÑVPQÝ~Wäät°ùßYâüËèùG/8AAÜ@ï–ÿfÊÊÍÞÔÍúÀ ¤~Ó‚®gfwkWચ»—Ó @P=ÿ€ “yý1m oï? (¼ÏT.ß߇EòºþCõ?Wœ¹‡+¨Aî¿„@÷ßðß_4€@o 9üê’“9¸mCxç}(ãÁ”à<åv-£ßªk—Ç#2L*mmNè–ë­hêhêÆž$ÍÈÉ‹ßi[LT{²jÇ“ÿ³ñGµÙƒø•ì¡é’SÑÆA"8BF ‘Cÿ­;ˆ6ð¯r”.<È*E÷^ÒÞƒ•ë‘Kª‡µ\òÏ•sŒqš B>-Pšå.â’A»3ÁÒ¡_z£,ÜÜΣçO¿‘È}¤‡8‹c/õÓÛf‹XôݬÒ`sëÁ£ÀÓÃ%‚¸AŸ˜¥ò;N“ÃYö+/ÝZñn(%ÉGbHß`De:fË®µQ‹ulé¯÷œXífÝ/H„S aì'×W´`»’)cÕvÇb¸×³Û‰Ž»-Å6;oµz-mÓ ×xçß HºÖ§Á­½~OM.›£cCŒw‘éí÷£-c{½ÚŸ„… ­¼Xé$­õc6Öù²‰Ò¡*Ý'ßõhe1QÖÿT”{PÌ×e©šHðôãÚÂMY2¸ï¼sÍwÍ"cǼƒHÉÕ˜Ó•gÚÇ=¥íeÀ‘“÷3דÎë‚'&òY§AŽ‘§ŽìgSf™×J¯á’U¡ °úþXÕʘŒ³­ßƒ{ºœ½ƇœŸX¦b£´J1«õº“›ÀËdðp T¬bÀõýæ‘”YµÀE—ÕAW†4؇ôyö÷ëTù–ð@±| ¶9-îøôÝŽÁ¥U¾{5•pÅ^üôÀ¯'GhS¯®äÃNŠ %ñÖì’©5åÛ¥i‘Rm6o’cR‹¹š=§ÓÀ}V-æ#b‚"õ¿²$õê:ù>Püx˜¹¦¨þ:;Šåµóm‡ÍЩ² Pcü",k=Žâq\(æp.Ã×ÌŠ »’f[1âÃuÚ³ö @$…TŽ«àÈ©þÓ‹ª‚ñt¾®6OÚ÷¾œ÷Wp„:iŸfâ¥SöÙZé±iÉo_€œÁ ¡ài¾è€eÓ\ÖC5B¦xvâ0 Ò¢½Y[Rí°aFɲšE÷h’u 3P˜¼•ÌlyÓŸkßE©"ÉVÈG¬%J«.¦À|(P‰}ΉQ)ž'Z¼u—kÏ_ã7Þƒ@CÞ¾¢å(D –Î㧶┄Ö; C³o¬}ùÎLô5HÞßIÁci>]më•ðc’ϾâñWðç‚z£®;S÷<XeÖÓBæ\0©+’”/ì>Ää™{æ(ŠŠË3Òƒz/›úUoí¾Ó¤‚ áÐí+>“õÉ Õ!W´Ä´ÅŽ´h!7ÔGÖmð /B¾}ºPCÇnÅ.íꊆ¨ìRÉe:îR€œ ö¾‡,Ã5ÖŸÒÑŠFþþ¥ZP‹¤¡òvãVðcHr~]Ãs ²N~lMöÀ¾J ÿ`Boï‡{T½[J4±ÄábÇ—ÙR1õœõÅÓœÄ2®ËŸÄÒûÌJLW¹?‡^› H?læÉï·Y9R­ÊŽ}¬¥Å¿RØ9=Œ„^£Ì¤œ·mÃÐÉÃóy‰8ì¬?2Â*_Ð@p[„LjûQ^ê^£Ðì)ãc·VH¼=½UMoîšÙ\uÜ&iëqåbÚâ¸ÁÎ˃)‡*+NÝD à3ﮋVi막R@’›‘Ý"7‹ølGdß½°0ÕÅG%|K„ y¾x†ñh—•®1¥E•ažJݱŠÒܼ² 6¯TÉ¢+V;Žö\>àQrp RÊÍ?äáNU&K”ãEEqÇ<#“ƒ¾ÍÙQ5ßë,7Q¯Ni¯Í„Qõ±„È^ñ°²˜màlVç<àÌòðûÄáy†|EeJóÙÁá}˜~êx·ínº³ŠzTWæ":‹N3és«¯°™y¥Ð›Ü+JΕ€ø¸Ö„ ›ƒd™¤ÄûŸùé¹ J¼¼ñÐuw¥á69%k&7Ž“±Ð ó7ÚÒ¤›ïv.¿Ó‹"Ú·`Ìž³šlðx0]{Пﭒ=^ ñ_2ùŽ6ÍRÂ;uÔnxCŒ°d¸…¢-à¡k³JyOŸ/§o¬^>Æ5{kùÜ4¯¡Íæ’’ûâ¦röüÙ‹”Kù1óve°œÉUŒ÷=–c«®xµ8ëã€{¥…ù]9ØŒRÔB¬|xÁ<qÏÉB²}ˆÔ# 4ÂÊ¥ë˜2pþíR‹×ª¾§àIÕ¨Ï[t1Ce…©{ƒá•n=e¼ÍÒ Hâ’&Zß‹¬·»F(±T“§¤JTºvgÑ‚(*»ÈfÙÙ;ïTx—yÏôâÜx£À©Möª‰‘Î\×´ø”RJÏFÜæo†SZHD -ÃsŒˆ´7#¨Ø8¼Ð+ì})Ø´/0¼6#†Î”yÍÞŠÈ”Ëò1Æ&µûé¤Ð 7™ËL|*?¨ÖÃE¦¨¦öHÑUnØh`_Å)n-Œ‹MÂJ"Õ)5•Úå¹jaéÕ2—Îô]K³ŸGto1~èº:ëWKcïVt£TÁOIkJ]¿~¸œ—ëYD‘ù@ÝÐ,®§*2…"»ºíNY¼ÿ––Ó£_NË=@Õý\`=嘋X÷]—zaÝ´ï‹FÿµŽkÐÂV&³£±c*„œB!6,Mš|ÃQÁøL|u³‘Ÿ¼TóÖú¥‘]¶Ù·>Ç“@ì& µÅ†°ë¦%š…àmƒ~ÏÑèž» [í‡EÉ¿X3(‚0\DßÎÝR1û†®:êmAÐevVܹÝ\:ecš‰ø}ôYB€%'‰õÃ1‡eÒÒûrvA|Ȃ㈰mæa妒aAÁ8kp[;µM¥ àü½ÅÑ¿-0»‰çø‘it í ½åÔ°¯O¹gÉŽqƒ˜oÍXT~ä/6aÏ…NXèw'×7ËQý:à¦Å¤ê†Wùï2«ìÄ–¾W%Ѥåz’²<·ÄH¥„"nn=žWHn™êG‡ZÞ«xsËD`ùŸÀh?7ñ¯K/a¢êb±‹ýâ\½~>¼ß‘1 ›ÿ¬}Ïš6•ùÜSéž·ÒYˆ[®CìåºÙâ<æ‹ͯ o,Udw!ýš]žÉdi·ÁÖ>5 ^C.LªèGŸZ›f¼ÏÑï¶}·Úå± jbFDjb¦ö_O½ –usù8?ÕBnž¯c^ÄÀ`ÄwT£4•?1Û–Dl®’|3I9?• Ò& ©Ü_RÕi£€–Ùút„2á.[RÝ 4²È´ªKx%²âˆõÙ5 Õø×™ãFH,R·ò󞻨£’cZlº0”ñ7l#ãˆu+̤æÀ<ì¡þ8⺙åòbQß.¹€_z7Hj?¶Â ¥ÛUuþ‰ÿ¹(hž¶'òKîCséOæ8~u>{|Wóô˜yæ¤ÅÞ—Pi¡fÓŠ¯Kïw˜-Ø·Ò²OLj÷Ȥ+ÒЪ¨-ÝfaHt´5_žo›[ZušãŒ‚–)m'‡Ieº/b•eÞ`G'ãIŒ¾ÄòG5Lý ú¸+×êYˆÜb¸AO± S‰²N-n-™)®ŽûBÔñc¼®÷J$¹7.Ë´ª)˜3S4È<&ò»½“6x“"ÍÏhW°–Oäë&Ë3Žº~¶ë&ìþöï<‰jLÚ©eí ^‚¶ëIšž oæUúÆÎüRŠ %k3.§œMBV¬O•í Lr[γ÷œï«y<|6(\¦m^§zÀ[˜»ôÓsöú’¾l.æ>Ü÷œ!k2Tƒw»ÐÚðÉü,èVŽX§©1*‡|'’Òê~u™Æªò8Þ`”æ‹Þ¹ð ˋȖÑ3 LÐüá¹ÒFŒ4ã»g„»=.çC¬¤±Ûú…]·Fçt[¸ÓS.é›qž=üŽÈfoYFd#1Är:ìÅ®Ué4ûæÅ“:xØ zR}¯O¢cbÕÞç™—;»Q÷fI¼±zÐá{³Ñ—ZiNcél˜ûæUÖ²'wæ ¯Ûq»—ðÛïëY«£Ÿ$„œ¡é-+­x­)ˆËÁ E.LVŒæÚ¤åoù9?C—x Ÿv@î˺º\ˆ–³[Іné¢ÙxT÷mî÷ÿìš½8›C×uEýN$qsË—·fA £V ± HuGC™˜^¢— Åè×NÅ šÌuOHæ÷yá÷B™ úÚüT0 ÇA°«;y*Ž9 òF9¼Ðþ“yàåŸÁâH‡ì‡\k/¬Wá{›:†+ÔzÄóƒÄ™Qa–j¤ø âBÞD`ÒTNÙg’Vt¾ùuÔ­R¸Ýs¼cÈÈàù=]ÖÒ‹êØN¹’™eýzg÷·ð<'2¸¸ÕOšp¾³×V'V“¦ûñ‰MR³™ý:>›­•U3ïé:ßXݾqë°ö%r”ËdMe/ÿÌ2êqQ:5ädhþ¸D¼+MJšá:£*¹Î”qLÌ{×^^-ÊMöÝO"RM€™ÍýEqpø×ƒÛAY𓯬ί$Ë⊜YˆÝ·é—'zŒÕ2ɳOi¨#L';¤=3ýdtrëêÜÈ=kºÄµ°„ÇP¶ëHDTs«¢ÇrˆôŸ£¿¶uÀ¢¯¡ Þ¤)Ppy6¨ãk袽'_Ç­QHã˜út~$œ 6M}{v×ÿ$…c¡%­°Ä@„í†U%ýZ²mÄÜZáÒÔ9z nýa¥êáA¸Ê7\¢Â]‘ýˆž•¬¸""dK+ mm²¯Ø-ô¶\4ú¸Üþ¡%!·èŸÞÞ®ƒ0ûIÜ5fgHcDtäÁ÷å]FqRŠJ?T Ù|§üí<ùÔG‚d©»Gƒ#ü—;£…d"|þL¸ÿ5€„Á@(’ŒÇ×›êàËLu®*ûˆ¿7yk< û5‰ú_¥­ÚuÊVw¹0ÌBc…Êoç9D®ZßBúð¼ ëÚ ;…hw/ò{› ƒís 8ºQõ g¤øQ”¨Ê©1l*b ê•T{eÊ,Lþš!éÖàû!²"us¤ô†£®Ó»ÉR/PEÛa½­½ÒÅaÙ&%Ñb°Î´Ò¨ñŽÖHj–‘8ÂÑ+à…!ZO©UkFüWí‚.Bœ°Ù·oáö’½sÎþËŠû×WÝN“©@ãlïÞ¸0Í<ÿXj¤æá¨piÍ%T.Y’Ìð£[¡g¾Q-ã§w£B‹e¼t²,ØóÍd~+X°ìšk¾CW£ûR9–«%7*[åc´’‰Ñ<(¡Ïš¥9^´5—V1ãX. |Û¶ä¥mµXÑÖ0.Ã¥9nNHŒm"IðòÒÜ {dÕþª3Qï+z?}Ýü#BŠ›Ô1bJù‚-+:?õ‰²_$,]ª#° â}\Òo´hYI~–Ë1ØhÄ&®&ü‰m~¶†üü€â=îÞmË:;”-zäúƒUÓ3[óŠ7!çÙÇ Oâ÷³)b:Uë[bb|Æs¶jx“þÆ7Í^>BÈеuasú[Êíz¸JbꜼ‘÷a½àq•ydýK9VÇß;7÷Ì*´a¡×iè(¼ «îi±b>$ïEa*‘ºV÷ëú– ”FRḦó‹ZÈŠ˜0G‡À3ÚÀ¹| Æí¢L¼ÄäÈsàÓM†È3â-oj—ª¨ÄNÖˆVJS‡ `l<â4ÎÌMH^°­ÌȨp÷âÔÿÐÝ×elE—Tü¸l˜5"ö~7ŸÌðŠR@µíp7ðÂÚh‡xïûÄY]Pñ0ùÚ°ŸE™³×l8˜Í£Í ‰,¯kò¤¦Ÿ£ïx—ºáµ ŠñÞì÷Í€NU gÕR%5ýO1wÊN%/ÚÊ\•LC;Õø"¤GËéÇ¢Fø58Gò5â-ü”îKÌP‡êô­Ú½Hú­…¤SD»)1r³yx’@éIþøJâ‘LH¥ô9©N¬ž_ûN÷Öƒ+>àâ-2쪎»ðÁû ÈÖúØâTHp_óÁlòý__¯ß›Ü9¥ñÅªÜøÛè-àˆX£Fnt‹ tÑù™Ëæ dÌ[F¬SB Q(¡“‘ÞÈšˆÎ°•Ïz4Gƒ´_*VÈ€¢“È9Àµ/¬8Ú âåå3.íÁ]Þ2̉¢àtËà;ÒÕ¦Ž4J¡»bžÇ§¬…MÈD¢Ÿì œßM=A~@ÐÒû²’K·ÛÁ_íïå=ÈOé[U-Ÿø€tÑÅ»”€ 5ÁímK&hâIv~d±Z›»ì‰“Cb Ÿ:Ô~·6¶A…üR[çЫèÓ$OœþÀÔ´xkkqM¿Í³zóá#Îc¥rúFNÓá´.Þ  .1ë2ƒ±Xpn"»ZÈ®›ê(;ŠâÚ6˜Â qéR¤PÓy§Ø2.é§JPë5_¤–0ÇÇE<1‚¦†‘"Íxb“Ç´ŽÐZ—› 0Þ ßvv÷þà‹­%k$¬’D†É¡•!s©6Õ ›×#û˜0‘bú4î¹ø“§>TÉ’òÌgws|NrHpryV"Ý:ƒnºÕ\¡Kk™Ày‚ù¢PrÅ—¼¯D,¯?£–‡9 =%`Çí”>eµn€uÎåêÛÔÄ?+0ÕxÒ73òöãд³¸j½Ò1f¬(å=™¡–¨¦ß:Š.Cl•ì?ÓUé…±XV®w)™]1™…zÕÍT?|>Þ»+þ§6ð£ Ö«¡¾›æw2ÓW8¡S¶Äk;•{Dj1Öî 0› •®cê kGlW‘Gê;¥y-mï½[9V$~ÒÙB·ÖB“ª WÀàN†uˬaXPa‡” {l³ó";+g׿Z¼Nãÿ@̾´4¦1F#ܳ@mCJߨÚÞ™þâÎë%§ù–gÃ?'é*ÔpÊí¾£q_Ú“¹FŸüúŠUb™Š(QC?÷CëÈÞíkÿpîŠòׯœx—­Ø$‹oý²¶†8 Å ‘Ÿ…<×rod³¦†1'ÐÔ5 ij’y(–cÎàF¥06¿@¾'RCÚ@¦•¨èùõÕª{©£é,4ÜÜVCÚj¿UŒIs <ƒ·,YöR£æJ¤LÆZîgàuO¾ë'¼&;¶oCáÄÆ²ººJ~ž?÷Bö!:j{`!œŠøª"Û0Âa1”$ÍôìG«ïøù?DôÒ¬Þ˜U0ê<¹´µm-¢‰H²’P9<VÇÉP}‹"ëØŽ.Û:€e®©øÐyKZ¤ˆÉ߇J•@£jÑ™ûЉŽZ[Öò~Rf"Z’'ËÅ$‰ä»¡žôàß6Œx‰¢Ê&¨“´¦öÎïäaÈEHzl*Ïãgè0ø Ü*-K  ŒDMë{TUG.Mò EkÏ6VB$f‹Hú¦ß×ÞÁ=EµHo°Pž—¨ÝãŒu°f„$&]z!Ù@äÿ"È ‰.öTUñæ‚Ièeˆv·¸«š¦¢ïdJ"ª:4¥Å“cêöι*©<¥)¶iÆóó!½Ød…â&û?‡ì¾nD}†09]CsZGêÞ V¦wšÚk¬¦TÏûÑ«‰´Cq¥Å¡ð^-ugõ¾ïwá[-ô\!ÉôLï/’ÚÝ 'öfŠS,ƒ·^RËíÞðeÂBI‹GrÔHò™|#Tõ2­V:§w®ÁKÅÂo›SßÎõƒÚ®åX¥d³¥à‹ŒQûZE'Œõ©Ñ,±æ·Ó°÷Ä^ÿ¸7 ‹x²ºå¾‡+lõùGÛ¿®ÇŠ´êgR®_ z¼É|¨&ËwZÌ>ï^›3Îî/¼Á(úêóÕ‡cñg§Þ²¶f? œaÖ¼oÛŸÆ›Ä^A dóôeWûU“­Àüc~/ß…Ä|G/ô×B•æ×fö\väo aDTáÒë̺ß!2£WdÚ¼ F¤YŠØêh½%|2išÖ¼Âæ#Tž›¡ ;Íü›pŽˆbBÊhÆ€D·m‘û8£ùäL vµ‰Hoôª)ɣǬõÖp{ä?šRƒ²¨M3VÍïa¹ýâôó“KƒaÛåv•/è­Æ†z¯ýÀW]ÛÏÔÓE#ýÕxp<¦žçÄ ¿­-ÎC|V€ÖjÖ‚$·ª<Ê·öË0ÀÑ5IIÃÌójñ½~ð,ñuÖO¨ËÒ½­ûÛ@¾Š€FZòüæú=÷¤óœ™Uô)*xÙšv¨yßWl¶d¹^46‹)gª`a8⯌õû÷}¢ÐÛËvÐëù.rz¡‘$,Öy}%,©Q‹œ\y|ݵü qvç2! SBœ_¢[rµœp¤kÒTðaª‰”•„§'wÉl·“ÓR¹þ C(>%—ÇÊ(™çñ¯~äŸ=¨[Lï|‘€Æb•w0 h<Ê8ñª¨ÉÙe^P‰¼ÁzQMüL׫u?$]·.ÂØóJk·t'Œ×.1ÏsªZ3x¢õkA8Û‘N:?hb“c€OUܯ±HŸ¥?o³¼kTPþÒ÷ +ðj¼Ä•a(ÜWe¶Uß.½`î1“pÑåpÚ&õÒK ŠŽû‹ºb™ÂÚ¥Y¢àD;¾ÜÎU¯nk“„gÏ„ðò8òAÝRžÙ^gD¦uIkg…EKsЧƒ®Ïêo”¨ô«Qyœ®ú mjÒ]¡¦×ùÇ-(*´òøø;êÍ*“â•_/»–ÝßëÿšÝØ]ØÓ¹~±#‹|ÆqÇA ZÙ ¡ôå›@›Ów©ôïŽIñ/ïs`•˜"MÐßÓ¶T 9QÀ©ÇÉikv‚]u1ðw¥vò ú1ü"6æ©_L÷Ã©Ì ‘ÿ” ºûLkÚ¹Ï'ÇL,®€Ýg˜*Æí áþ»œ'‰óÍ­Sj¡s­ä3åóŠÉrÂ/Ef&W8‚‹pÜçd™ÀIr°>‰YÍ,ïïÙ±Öú"YîÌ×|æ•Iß#š1®%j.£J¯x¸"ÃÚIŽ~í²Ñq<óÖm¥Yp 6LQ×<µGál¹qF9iÏÑí¾¨{+V²ƒâqkî:Æ3NR|ÚSnÚ&±: U.`•±ÉOL¿ûÑdæTjÁ„u€[QÕ¡5¤jkû-Ô>ÉçPSswS¼ÉQõ XCæµDáß4‰K )&TD‡b¿K*¿L½ÆôñD¾˜îÈ–hJk~·Š{ŠÊ‚0ƒ<{Ù.´C\¢‚ÃÀ•³ÍßènHõ¨ÞcxØÇxIÍK’Aö®9Nê[‚d÷Äùä§QÎ’ùp/úã-~®u‰5)yã#(ýܘŒPÎ&ÓÇQQºrŒÊùž0úøl¼C#ØÊ¹ôr dó—ãmhHº±’‘ <ñ!TÐõ³kÜÌí8‚ãÔ‡° æSj¾e†…L%°r’•J²éçÍDš”òÔWÍ݇ì¶RgSZ×d¨±Ìènщ£yg%{i oêÔ,sÞGèã}ÁoĦnMy;6£¸qºËØÒÙ]"_æì¨®Æ;¸ÞïzÝ0|u—ˆrEn´åúe)'ø]üL[>¾~ )ì’ÝóDçû#dÙ?é…™6#„V|FñÉKhÅÚVÎâ äN~ŠVV—\MCšOþg¢’8ÅíõO8‚ª 8¸TRˆ'ø‰»«—ïc:¼‡&Šz ij—- '_y_šdýæÀ^›íÉ’Û ;0g•–@hr vkA~á–¸œBBŒ›Ð!jÁ}gOkÆœ±PY°Xˈµ'ädK ^Ò…úYBl¿™ËÕ|sÊè0‡Ä«Ñ<<£¯õZlÙ<¢ôÒvŽfLº >¤ˆöÕW*0|~]+¨-NtŽXÑÁ'Þ2è¹—Z­ñº«é«ZdCÙ™9Y¥ñ3é.[6M¹‰ß$:’ &ü‰8Î}?EŽ¢Ý>F‡¢z¢ä™ÚæÜ;SçÀ¡¾…“ÖWÊög”— z3¦´3+üþ{îªSù¬ö…ƒ*žÃy•ìÜ› 'H…'ó*l%|éȰmݤ‚­Œps¹Ò7#åé¤n÷/íAY÷¾¥ZWècCl—ÁÔ W:u8…zå‚ t€¨ËJ­O† j`ñ†›=#å¯1zf &ªŒ ðýXÔ0à h—FMj¼®2O_(Bß…Ó›>dUˆ•òM t½a·Í™Cȼó^gŠÎìf¬Yœ÷w41<¸[U˜DÙF6u±xÜöß7ÃNf¯ìŠ‚_ö¸h®xŸË_£ î£V«bNq벆qùRðÄâRB;sm*£Iš/ˆ–¿|PM3àÚ.$C?^ ùÇ“×æKÒ-¬A3‚¿Ë°¿]Ý$ï|AÏ"2¥©Ùwmºc@xŸÓãújm~ ö‡$ü†¶ë6m`4[ŠÍ› —u›¥¿‘èíNjÒ˰·-Ø Õ”Œ6¸³¸r$Ó™Ecæ‘=à¾Tk•sF…#¤UKÓb'Êdß³ÐÉrU.4–ClÙf &Â?,“†À‚J±"~Eñ- ¥ŸÝΪc†£ð*–á€d:(+·ÞQ>^k+æCäOÕzž„–÷N¨V?ß'Ä0+d¢2žX5a›$_”³šÁMAã;NãÈF8ë+NÙ6^Õó|€Z?vÌZ+Gm£ç#¨itWæ¸v_M ¥¶$üaµ9ÆwèØ<è(Vb°FUÝwS•:ûУ¬[­ÇÜŽ¶ÈŠWyâFÆýÈ\ƒÌžm0íPãrÔñlCý“ù•Ý2Ã[¶éK<Õš}C؇OÓp×ë .VæZ„Ãή‡·‘ÍÙ7x˜Eª:Êy}IZö8Ï ­nãŠÀ:`Q%¬®Ø­ ¾³U+:²3$"ÂpÐ}¨ß}û†6ŽU^;šdÐ;Ÿ³ ÁÁR^kF6þÉÝ—îk=ò¼%Bë™ö.6×a#ŒZ @…˜<s—»ðcV¼{Älšj*×ã /~ ®å«UnÄ-^’kÜQý/Íf?Ž=[uÿ±»£º6f4*o±œTn rˆn¼~l²Îè¤âÜpwñ—s´ÚÅ¡F€æ„íjCBTRA|œ£xMc,Ö¡ÈÏNTŽÿnUø(a`X,ׯq±õš³××ZU¥ü`ðì۸ɾñÐØµJå+N$†kçÎÖÒ»›¶4~O\jHJ£'cùJÕ}VÀÓuvH“.Ð#,.(æFÝŒÒ7íp¡%vë êÓ͹x±ºíµéŒ`‡ëƒâä>Q‡ÑfÜϲe›¬BvÛ‚-)Ô•'-„tÛ5Û åï`h.EŒ8õÅšJZ‰,ªëêã6Öm®Sœç^ý¨¯ýwªØw|3i¾ðxÜ(+w+tbP(ʼŠÉ¥pžJ¥Ú^𺬥Sùm=èo£€·‰/M"F•Y¾o‡®€ª!6}í =ú:éTm<^Ç7!Ix„Wà ÙyJE¯ @úh–5þ]“¥=|r ˆñ=Ë®‰½4{|=ìЦ†*Š­•3¯›«6#ó:² «õÀŽñ§¤lú‹»ú™áJ¢ëm™³ ׯÁG¸!Êð›Y:‰¢ñs;%»»šTQºŽ­AG¸ÙtBY3 ÒÍõÀ[J›P§Yø¸|/}v²œµ%ò€W« µãT M4Š€—á4˜+$„DD«Óî­Ä“ðÊ å§:Þ„#Ö$Ê ¯p2õØNpZI_ Ù“¨£Ÿ™!r*¸•SL$4Ú¦ÂÊÀqäD ØÇ%aJC|}'Š£2¶ Xú®Qo£¸ÆÂ±¢%ç±·tŸË/ˆ•ôvEO ãb·Â|´àüÄ÷1ï|X¿ÁÙ䨂y‹ÞQ{WþFÖ5¾¤%g`£8ù@™Îè¸H5>Kî‡pôZúcMòîbVYã÷:†Ü“Ý6ü)A…æ ØF3´8VF!½çííÔ‰[d'‹e$RU²ÃÃ!0#éÕ+1Xp ×V?ñ¯ü{µI‰»¥°ÃÑy7Z,Ÿ£¡ÒÎò 2 °TóÄã;[øl­#äem¾E 7Á&à—x;éyPŸ.7AÜßÜò¯#Ö´NVfièHs¦êhДìU¿Ê8ËóÉ›;wz–›@È…9N\ “+1~qHwæ‡;ÚÀXÇt´W}W{Õ%à# ÿÀïŸ$8*q³¥¶Ù¨Fê g[‰apw_±'ŠiŽ!î{ÿÒ¦¸D¦³…(*®âàoÁ'ØžaÅÉæÝ$þX!x÷iq\þ¾&4!à›ÏN@ɼ"û–¯ÔI,{$©õ@—fµ˜3 =鵄ðÙ ðƒ?Y™ïFà4ÏmÅÚx(K÷,3ìâÇ£sAþIfS…yyT£j¢÷*ÄÑÖ:ŸZ^×¥ÃSœtbå%õ]ËÎQʳ¾J±-C„/ rµ^&É)±I‹³9j¹î æÂèü¢•-ÞDf¥ôx±šF™I Û§šÔs¬îX¡m¥çYê2èkê”;aZ¼Ö³¾áªÑW¨'€>ÝNw'~¤2Ó²@äÐQ“ïd]Æõõd¦,¢[Æq ‡v$enR°Œ’Tžá}wº•TbZИߗgàЅÓ4ÈJK|'9rOM…ËiÍÁ&[wŸZhe]<"k°›;CMA"½¤gŠìDã¥G‘+§¦#œÖ–¼|sõû@9Ç¥ŸV&[ßñ¬Èõ°,åÀ>ÕHQ•VâšÕ0$);h» -E\àìõ#9·Å};?ìe×L…Ù€D¡™¹U€­Ò¥K“æ%§–DOääbL!1Ÿ~˜èÝ255“bжc¿•:Ò'Ìa4³'+dW$ é놬^ì»p~™’-mÛ ¼G·ô»Z¢ èK ­h0>A=O LD;ñõéðH†Æ¯MW ”Íî§Ý³[/ä\r¿z/(ðwß?I› Ê´fC=䘸|òµš<(mبhŽ3j ›'/Ñ$q|Ó!ËŠa@ Lã”S¥ie'ÏAÛuÇ;ì6b[R˜¤Uˆd;|h¼Epûe;¥.ˆî¥ÀÈ<<²Á–à× çfÆ¿zºÚµéÂHè/×gÜÏaR㣂˶)/ƒ¥¯ÎÇÛ>èßô±a"y`‰¯4_ t¿}‹éª˜}Ïj.¾lÞÅ=8ÉT¯æ7Ž‚t)ow@!ç=ú¾êÑÜÚæÝ‚¥¦ßUݸ'¾Žê9õ÷cCd™ <ôþYÛp¨ã2g&©[5ÍAÂA¯ï龨_Q#Î{ˆÉ÷¾!ßTD”eÇAEb’.@wH¨9Ü·'|Åb‰NnBÑ D ;ì¹'Ò¶zõ};NœOè¤Í†ŒCXÄóû–ë³@ äQ¡¸B̈‡—«#„=᥷Ääg=Iè–,{Ö!…lIbý8KÄÝ*Ü9bU°ŸŽ/ŽïAâüíýÈð™Äš|ŒXû쯘"ea m´ÎÌ“ë÷í9Sl.e é©:‡Rã.• ëKÐhs9Ok¹„ÄÉÓDô1Ø…LßÎ`ƒ–í>À¢²Â) Ü øÂg6ónj)žÞƒÅL²åÀÝIª#-ç8æp$9C‚ZÔsÖt%]MÀ½°.u‚О ;– ÍìBÊý“Ôðè‹ÔØÑ0[«Ÿ4Qó}ʇNÚï¦(╾÷â×(Ÿ6™M°ôÎ…i…»á$"^¸@¤6uÈ¡«/éf^XŽ8ý,íŒ g–Ä]ûv‘’Ê|˜•J’lf&ìâß_:ÅêŠjмF&üq‰àÃCc+}ñ¢ ì¥øËi¶Û¼²LzàÔ'¥KÜIÙ7\ÝsÔ|aÔò»…Twñþ¦f[[JW÷D<”;W]˜Y‹žW²|݃äDTY˜wþErʦŸê4ÒáL9¦†¯%ZäOeý™± Ä RØ‘!û— !æþ·ä)Ä]TÂù&Õèe`xäÉ%˜•Z\½8[zHÒr¤ë³¹óŠÐ“x® %•ø[cwW2´ÙΙ©è'ÔaÅ[PN×õm‚:¾Ù'šž6ø^.Ëýè0×åöµùâ{øðÚY¤Àp'¼»ò“ºç铘¡½¾Ù !©~ã/‚µéÓÍÄt¹ ‹ï}Þ¯z/$cu…q”ÁŽáþã†yÔ 3o¢§¯7LÝ·­-Q×<‹~ïÈÃʰÀ(Þ~öGÕyÖ·/-º=EÓb'@<¥nIm, ÕµÔÔhUžç¹”ÿ g«þº3–B¿pf+ò“ †h¶$åCÖ©C'BUöù°š˜ÃÌ©ÀvŠ E´v‚ƒ|Œ¤8‚ú‡ÄI臓Ú÷Cp®·‹ÂÃFˆ/rþQ~Àa‚à»|Òh!i6A­éëÙe=ìKg!Ÿ}¤2ÙÞõì!*|w,NDmf7fõ0`CÊvrœTíúÐÒœ@¹¦Øž|`"—Snœ’a¸KœIã0@üxjH‚ A€m«PÀÅ(ÌÍåÚO“TfÄ4¾ÿàá”;PhûHÁ×âfGå|H-po™Ì­pŠ]Ë‘WtAúÞêT;g"þ«Å>iÖ ¯bà·‚£ëiCE_JãÜ7»¢mN‘uÔ—/÷`º§¹<Òñ¼-g C¡^‘›Ø£¸ô4Ç便”¬;'ök'Qª™8ç•jˆãEtPÍæxm€Ï2ùÅ ®ü¨jc ”Sý¼ŸŒ˜Q1ÕAÜr›]Ç)æ?уöª}¹=°à¿<Úº€Õ”á<lKî²/Uh°yµÇ’×o%MºÂ#a-ZSÐó*ER?„݈^£6Ÿ™çMhÇ ~¹6H8‹_lÆ®· ¤$ÿì`Šú:ñ‹–#ãyסÔN…”˜Óú¨Ñ…IYœ¸SôŒr{“Çu—Q¿ 唡ލmêîÂ¥+“kªV@åá…ý+UÄ>¯Ágã캾÷”1äª³Šæ7ۼ扛ƾ9xÎ|ÇêiηVåàâ}¤ïßË‹í†!¯µ”FWðT%é:Ñ6³úÕÕ_8-×Ðà“Æ.˜&M,àŒàdªjœÜÊc¤!`|’”Iˆy\çÓ|cçX¡›síÍÀéÂu{¿3>áЯ¼ÈȽGXÔoš>¿;‡i ¢˜Y3¬»#tv¯¡’µ¶K»0·žÊ[—¨ô‚Í>IrŠôQÛæG‰úkUa‰Ëe}°qmþ¢ÀQwÞ["óAÛ„].Ô-†ëä¯W -æÄðÀpÚ#éÅHP&J©qÂ~|0äþŸ ¹ô86,ßåœãÞÕë 7@ã¸Z6ñn8 èQ‡mãÓ̰öÐOÌÓH‹‰=‚]j±­íe²ŒðTbËÁÕUW4X8%ò/kÑ™ýÙxÛB-2š—¾údúw!ïQð’3©Ã€4ON²ð;b¸&^Ôç®4°NktBò× ʨƒÔõû÷j=eFBP›¬„Ò¼,oã°:õ¼$dU‘-6Åj¸‘Éõ†“´†ôí:~Î}ÐV0NÂîˆÑˆöìÛG5ol K®œÂÍŽ>?õÏHÁ¹Ô9ñæmC-´‚Fi†zL§-í³—à¢NÍ* ·n +À][Öu&?sx?þ3¶ú%èb¼¶FÝøpl¦å:³￈ËtÛ)â»"yÖóS‹?µò›?È·‚¼×„Õ¡å³ür qø+Š¡èr"ËhÕfE•“÷lbF¸÷GeáǾNüdO«’ìK‘‡¬$wt =qZäé”°¸ TÕç›-ûY¾8ï ”/VKDrÂ[ /ûçIõë0qÅðmʺi˜8¼‡Vp¡vxsO%RMY‰ó2“›§.I†’&«ÜÚhŸ ˆ—ö Ø( …ÔP §û¨¦ÅZ®ÒÇŠžþµ5›íÈø]’Ú—36É]ug?W ö‘‰Ã×Öj<4Õp²÷lÌ @ðĦÀšéy&Ù½þ::ÆðµÖ:˜X:U ÚÉ9Xâ"Ó &ºN\-ÔÒÎ˯跿Œ(6·CJ*½ÐM9 z©Å¨2 kT‘ýij¡êŽØWOx/ y5 §~/­³lQ21®É9AA2‰´AQ…òÎa¤¼‡û¢²/-TMö¥¶˜¸Ô´Ky¿iˆC-ÕŒ×QÍÕQ"= ˆd a@Åø¾Ð]m>8râÑóU\Ú‘»yãûK Å <‘å 3qœÛ‰Ãª‡òÈ“&¥¿û­ 0Ü)F¥öHx†AØdoNÚ þ:Ž à{[P>!^U¿û7©c¿ä^'<Æf5Äéßµòåõö¾PŸ@[™ Fû©¦©ˆj§~tPÌ”žaEM´ÝTɾ,„Λï{Á‘áß8~ñN~0ÉÁ¤ÀטÏÉ'à£Z°KzŒ@*¯D`‘ðFM@㤆À9ª†Ò÷Ž3¨no7ˆ©ì¾fÄ^Ð]h§©:†/ΗÒJ*±¥RMÒ²´ :âµ:+¯›³–D6«Ü8QÍÑy^>²+O“T¸ÃÜ ›Dê¡§¢Õ‰O"Å\o¤Âþé*pfòîñ¡Z1 £D¥žÍ ¨ù++‡‹?¿òÅ57ÓÐ1 ûÂnª”Šg;¯fèyFžÝî( ÕšÚHŠëø^ÈÞmÚw¿Ý¾2Ö"¬Ÿ-Œ dnøFôô(ÚSY©äY¼7HÜÀ“ø‚Ýÿ —Zô® ~«iV'–ǰþdãˆÏ‡•rs€µŽ 8«­Ù_ Șˆ1D È «Uɯ‡Õ(-¥úß§Q<Ø¡09Ú?´›4H~.ÀYÖ«ìdеz‰‘ðŸÈ³+dÍZ´7 ЗIÞ¾Œcò±„ 2ü'L Äî¡¶.‚™Ÿ5"ž^*]€XÅxB~âdý~V·˜ç>\ò-ªúo¨¬Fñ)‘ƑۺÄë´p@T¹ÉNþèBã¨ó¦é¨O=ùÿÄtÃÚoäæM¾Ó”+ÈöªÌ¾ÿ;plj¶n$yó -]F2À¼2^(9c讜ɳÿøRí>†Èdz•DBų”#Wý×~Øù³.Ë»üÏñ±ƒ}@¤"1µ¶š“ú½Üô†ïK‘”«(’ˆ«ìªî@K„ŸÊZ<ÇÄT©¯Ç®¯` ð5Íötg@ȯ.‹ 2c¤\$jàAû¼ Èí©"¯wžfå<5uZDJÓñÛV¤Œá€æÛxyGÍ*°´TMÕBé…ä£M©3™nÒõ’Rpæ<ñÎØöØ„Ý'+Ç<û¾~ê’¼•-ˆƒì_} ù/ð îà }i^‚˜ŸS–éò¿AT>Lü2ðqta‡m$$|–‰¼P~Î /ý° ·3˜“=Gnô…Ú OÒ¼1®ÔØF¨6:V+2`¶Çù@vë8“ üp9¥8»õB¯ês¾?&‡xU±1Ãæ+}$ý «Azm풴ຮþbprà_ZŸŒ²¦záÃ]œ3pß°8ØÍQëËË{ šÍ‡àšõ•¡wÿµõ/90öÖ˜{m³<—&ùyº¬BF™í·« yR"<žò‚'íWm•W¸{+˜õ~­T 0iUµv 3Ÿ¥ŒÞç‚ÛÕ8qµ÷Z+Dô=Û… -æXQfS‡“‹©´Ù«ª•=^0u©ÂÆ‹•ÆG;¨žOI©SäΫí:â²¾×_nyh~#‘7QG‘VÍ WÈÓ¬7¥ÓÜ´ÁO¹É:Šf²aèÅr§õ-Ü­‰[ˆ+ä¹Wóõ¨ÀÍ´gÎmˆ"‚1V#çÌw¥Ýà£}bfk]bO9xÞ¶{å‘âãyË€sC<—]¼•’ÉÊ­cµ,) `SîzÒ›·‚SæøúzdŠŸ<{³©Ø.©»Lí8 #>\Àìv‘†´†»ô%-LxG8cDÈÚÈUÇb²ñ˜#¸Žü#qÎÅ OÆÎ±Ð' HÙ9ÎòË÷…£ªªQ;n²lÎLŸèèèuIÔ÷á®…ÝRr'˼é-n‹;¸Lƒ$| Ð}P ¼cÎPŸûˆe<8˜°ÌuÐË(@yàÁ»ä-N”ß/ÕFÔ?5K­’Ím’ŠMÈ«Cþ1T^[LÇ*¿¶›Îx¢úà¦xÃíá×ïa†ï$ôì+`—ÍyX\ˆ=úˆ ù6;F"¨^eW¾üÖtÌR…åW‰8H/5² V\=î¦D3 ióÏò3iÜ­¦ZZLé˜Î#p¡ê扥ϴÀóæé"Ý&‡`]Ó½“Þ¥7×Ý?RØ¿m†>[Γ ! Ž@¹æ{üyþìJ¸ïÔP $X‡êf7”ö—S^¯w¡ ¼ÙZX¦ã¿9uØ´„Ì–FeË'ÍYÄ-;4F3ƒªÓï‘a36IG@H%µ¤5öºj)9›6…{ŽÂ™­µfC7%z¿£Œ£„Ù$“ö^¸ÆŒkõÑpˆFÝÿ7+k`VÊi¿øeC:P¼““6¨¬›Æ9ï½*õêè;ê×¢.i‹?œ–B7Ó¶|G‚D”GÝXŽ%âŠ:5yËÜawŠ—pÄVéyCð¬hgK4m,:ºÔ0OGV/Å|¬\b—ž¥Ý©Å”Ú‰ÌÍIÕÖÏÍ"Ñô4 W°O`¶ÑôÿùÍÉSºÁ‹ðÂÔP3ìðYúO¤ˆÁÆ6Ø‹Ï !‚ì))ïÛNUÿöõdÞŸUô\UæXeV1zRùûÒÁ"ÆgÏpiÀ6Û"[Î"CR†wò‘héxÐÒ {y>6Õ;sîÂÖâúù(rh¢1êZ²†¢Çu¦çtÑ$ìF’em¦±i÷[vnóJû”oì(e>:Yƒ¹{“Žì%֪ߟJލš#»›' Bˆ@wÄv-éÅ+0t{.ýn€²ÈÞì-›£#Ößãy÷³Î7,ëXØ2îVW%@–‰’¸4¹3fqýe7¬u舺2åCxšþ÷Ñ'py^æµæª–§àdùÕ”^vÌØ;p_áÇŽaàÒ);m_½ð'œÀ¼½¹Æl¯‚ÿ[Q6Af¿4Ò¯måktËæ‹gÝJÕ˜™Žðy§©ðÙøõí°Î¬†Gý‹a¼ã èÀì69\EŽGÀ® ;Üe Do(lôÎÇ?OHPÉaó°£ß ¿UŒó]FÎ+9ýš«½ÐZb.€ŽJèÁ–âÏéeÇ•ÄùE =wýJÕ·ß¾¹öY¬ì×߉=³8»¬‹m¬ú.Öè vÁÖµjÞÝê?¯q d«™®û¢»ú m(=€³3|êb+²9À«TN5# ¥-#Ýió»~[j¬ÞKäsÕ¡ÍV4ÞÅC§…jT¦=áêËýªðÖ\Bt9ÑNÙH·Š­ðÕk°“ôÇ]‹¨¼oôoôØZå½Ò" ½¯hˆÏT0ο܂/Iƶ*ëè7N#tz"*›ë‡áûT“ûê_±ÒgåÃ_! eò§ÙM‹ì°ÎbÖ­rbAuº7"W/^háß!"æ·-G!5Ø&oÛ´¿ å•Ù;Å1§Ï/‡¾Âäo[A×»8š¡Mdïã´éjSï¤JL>«=8Ö´éÀt¥Ço¢ãtÃçäåý)…xI®¦ŒýáS¢¢c(±hbµŒO_FÅÝð"ãýu•²§ÜǸ~æ<0ó¾Âº¬ýbohV«Èɉ;›FQ«®O±ÛçoÙÜŽÕ…t}&?E†Rw8<× XAä´H»Nåsú ½=^Ü d>&I:Ðu¿º™ªtwÄ¿ü·L&zj/ˆ¢g‚=fšã¹Oú!l%N>÷ɧ|Õ}Ý&Ä<퉎~†>e… ÓGÞkýUnä²3aÃŶð»çáX|:¤Ò›imûÇrƒáUrÙ'0dÏÙ”UŧÓʈëÞ•ÕÒLKk'2¶ØÞï(§ÀßïïNäyS_ZêßUWž¢©ö mÿØ›Ñp ît¡µ){Û<ßk©?—'ÓáÂiIÔzvãC̱ÆÌ–«²ÈâažkäIÏ¢ÔÛüÆ>/#¯°¹W£3#¡sÍ•“cqpãçM‚‘e•€u¥× Ëÿlº&w¶Ä冧âÿµpÇǽÈëø†I+f’Bz‹ JßnPdigÖìp ½AçÌÖÅŸ5[<Cñ¬ò‰êíY#eú,þ4Sß A`ë‡ÅZ8Dr” 'þkz™|gt÷æU°u¯ðD<Ñ-t¬!ãÃø eg(·t×ò.´¼ï±E·žW˜]X`4Ú›ÐòÛzýÎ_Pã§š²™ · µõ½ƒ²ë;ËÖâƒxêçõþÞnÆ/çû)x}^ IT˜˜ÍŸ8CDìÉÚѸçÎÔ&ÜÓ@Ø¿`4+“k®$k~X˜Z®¾ÐømýC¤þŒE¸˜Ó¢Jí»VöL_N†ùÀžˆ†£Ò«)ýWÆùv '°ƒ@H¢0í®i!}B˜}_ø`þ]pþ56µIÕhÙtbDQˆ,˜áÆŒ‡SP“šj°š…öÜ…ÍÌ9vŸ;²÷³=ƒ„ ¬†-ê$ÛÑ”Ð0ŸQiŒ\ì².ÅXu¬+eÚÔ ¢wÙ ’h#Ô!.N¶ë‚è"o§}NŽœü÷üÿ6-Ć3V®¥ùtè? xœë‚¼k j”\º7»µZÕ4zË€ÛA§ð@/RÏB…žÖ_Åô­¢Ÿ4H|Ú~Ó8ÝÍÀ6J(’´X€|’óÐLͺù^@Ä_'8ÄîÆrná÷m¹½ì§1œ ±<);™ž«4n¥U—×8–A=$jÀΦ8›–+ç“à„»}޶.Ôã:ÛÅn)EÈòçtËÑRÁKÅZ\ÿz×ÝZÙÆNûɆ²ýG Þ1G¥ ðÿÁ(ˆ[ùò¥¶uN¹Ñ‹S3 lí k÷H ‚µ©®×ø#7=¸%ø*Sé± †›½µã¥×'±MÚà*c䙦æj.Ë¿«Î,“Ö„ØDá"E4# 나Ý:m˜ßp™ŒÕÓ?euÔöî*ê™ð€0„:¿+ÑK“óÆË7tX<Ó¿çLFÃ÷õJ˜O„dCƒ¬(¡«ßâ_<ëN+ûuK%/•ÕNp‹ƒ¥?ޤ3#î Šý¬L0dùúÀ馨}ù²ttnŒbÛ¬Oçõ¥8µÒA£·ßMP3r83én¶ å£ò¸†âöa/Ó„£›†Ïç'5BM),lqùLå¿ü–Çan¸·“]×Kïë p‚Á}C…t0#ÄúÒÇŸ ÈÁ/£ù¬ûŒþxÍB\ˆÞ)ÌFý]£È93íp7·Ç[Ú¬sI«OºÉäÔs™´àëà2žD„Œqà[[œÈç"ÂQ6Vdƒäìm×"ñÚÁ)3ͤ²UxºL]xˆ¯ŸË°<­_™¦Î×ûÎ+çÐK°ÎdøÕÇ º®ú™V•žì¯µŸÊ·õé*.†ðÑòñ¢Õö:ïœhyV»¬kFˆfþ¥ƒñ”3ש˜BBQÒkA=˪zÂ9ÓBzf—(ˆ÷|­mzSä&»„0~ÞÔkvk;L|f§ŠQ5 ª1‡eñTóíÕòå¬_þ H3ª×„b«“CËXK¿d0Ä¡kH‚Bø·³û÷ÌÊヾFjz:ÀT¤ª‡—ƒÎõL{ÉPôÄ{ ÆKõs¶#D5ì÷ó˹M´š`÷£ƨ-£”y#‹‚$Ç»ã¥ñwZ¦iùž_¯¯ZPC‘ó9Ïúd°Xa¦©O¹äì{CD?cX”4Àu}̪“LB5åK”zTöULHbMÃ8ÚWœ?eýK¡àÆ ’À`¹üÎ' endstream endobj 268 0 obj << /Type /FontDescriptor /FontName /VVLDLP+CMR10 /Flags 4 /FontBBox [-40 -250 1009 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/a/b/c/colon/comma/d/e/eight/f/ff/ffi/fi/five/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/percent/period/q/quotedblleft/quotedblright/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/v/w/x/y/z/zero) /FontFile 267 0 R >> endobj 269 0 obj << /Length1 1691 /Length2 9243 /Length3 0 /Length 10334 /Filter /FlateDecode >> stream xÚ´TØ.ŒSÜ¥hp+œànÅ]Š H‚www·Ò"Å­@)¥8EŠkq(ÖbEKáÑ™¹3sïÿ¯õÞÊZI¾-ßÞß9{&:MNi˜X…sòpE²jÚ<¼ äÅdbÒ…ÀÀ™1™ôÁnîTä_²n`Kø£MÎþ§ƒT<œ<|A! À ‚þsÈYzBlj\ìŽÉ$ sñqƒØÙÃËüç/€Õš À =û# í vƒX[Bj–p{°ócEkK'€Ì†ûü«˜=î"ÂÍíååÅeéìÎs³“`{ð‚ÀíÚ`w°›'Øð[0@ÝÒü§2.L&€®=ÄýO»Ìîeé<œ Ö`¨ûc†Ôìx,ÐQVh¸€¡«þð ð×Ùx¸xþ¦û+û7úG²¥µ5ÌÙÅêÚl!N`€†‚*Üþ ` µùhéä{Ì·ô´„8YZ=üѹ%@AZ `ù(ð/yîÖn¸;—;Äé·Dîß4§,µ‘…9;ƒ¡pwÌßýÉAÜÀÖÇîÃýçÍ:Ba^P¿¿€-jcû[„‡ ·âêV–û+äÑ„ùÍ @!?ì {[Ûsÿ¦×õqÿáäùm~TàçsØ>Š@lÁ?˜~î–ž`ÜÍà÷oÇ#L€ İÛA ˜ÿ°?šÁ¶âÇËwƒxL€³ÇþþüýÏôq¼l`P'ŸÂÿ¸_nmu%EŽ?ÿí“‘yü8ùøœ¼<°0@Høo–¿õÿGûVMKÈ_½ÿ!T†Ú ?%<žÝdxþ5¬m à¿+¨ÃG `ýgò_€Ö_<ÿÏóÿGÊÿߨÿfù¿Mþÿ6¤àáäô‡›õÿÿÇmé qòù+àq’=à[¡{Ü èÿ†€ÿÜd5° ÄÃù½ÊpËÇí†Ú9ý}Œwˆ7ØF·¶ÿs„þs ôN(XæùýÖ8y€Àÿñ=ãã{âþxW¸Àëôß%å¡Ö0›ß{Ç+ °ts³ôÁ>ޝ€ÀçqAmÀÞL6€› ƒ?¦ålan˜¿oTHÀ­úÛô'p«ýƒ@n¿èÑgùp[ýƒ#­ÿFüüèq_ÿ‰æyœgnðßP€Àm ópû—ÿ1Åþ_PÀ ù|,æô両ÿ‚ܰŠ?¶òøÿËýHý¯J<‚áÿtò˜ ·wÿ«·Gr¸ì_ „^ÿÐ?¶â vûÓÿ_7aíáæöøBý±+×ôüÇs{ƒ­1ç`Ö¢ááï®ë¥)½8wÆÅ§™v ²Ù8ýݺEï¦þªåÑȹ­Ý:ÁçXwUSœ zñ/B^Ï0•XÌ’Ó£Á9©Ÿ°žxãÍ\\NM<Ъ¤p`%ð•û¯ó&ÞÌú~y£Ëëþá)ãScrjä ÂÑIf?™½L²y¿Šò5·Ñ¬YÒ®± çt§=Vßuík·ý33f¦ Ö§äÜÈÄÊqñkJ©Î¯éRÑø NVTÖ¼•τڭܟi¤B4œ„š´±@;=·EM¾{è¬$†ìQÚö$M´Ð^(jÄ¢&fÜè²»Á»²ÕƒÖ_F¾·¼áZÈS·woÚå7z…ìÑ¥^ñRž9UñŠöÜßbw">ùaèÞs·q~j†˜ÁÔÒ*¾Wß‘Q$‡ÅAGÚT@íq j§D¥H`ÈÈÏ-nçkÑÄ47mÜ9ÄbË«Ûëì÷¼Žî?Ø"®Ò«z®«)Î'x‰¡„ž”xÓ†µ1æAªøyCDn•0jC%:ñž5²ôÜ æãùØûócÓ2N W•Ž ¶ºS:‘q¡F²êñtI¢¥¨¹—ø^äõóvTÿï ˜¡á~½1€¥¨àª9ùgkO º¾C"“èršeyf6jõß³öî ÚˆyyŠ=,úÔÇxXóþe«‰Tâ¡aaÅå+ OˆŽ~=b@Ò È««U–ç6@û¾y¿  1g´Y^¯o£E™·‘$vÈ¡™Cǘ7aT” ÅPûàøÀ‰oç3lb|:“ä86ÝÕH*½sdª4®ìqÝL”[b^,<Åî!çfêrže­ñ…øù\Š}Í:ÐwÞÆÇß_¦’úNçýä*ЉKSûA˹,6ÜÿÝó—æ´}0ƒ2ƒ†ùŽû——}C Wvõ½[ßH­Ö–9àh‘×i©%'?qŠœ5«Ù¼Yn·’˜yý,\lçìñbÈ®&îðÑ (¿ìN©Õª'^tª£¿9Ç=¥iÔÏ­˜"óžÊ3·¦t¼yŽÝ“ƒ·Ÿ%´òQR+›™4©Ï¸o†-ëþ%EŒ³V HpcAY­ÔRx‡E.i’žÖXv:ò6÷†ã`Âæ‹©Ì~&ñŽä`ªÝkKŸÖcéW“fÛmUhI Ò\®}HGXü{Tï:l‘ž²Ý•‰c£í¯vƒ; ÀºÏûð}'½[_º*S–(7ÉŸ’ì¶´k×þɳ—“¬¥ò?{º¥P;±  Žy¾{àoK±ýe—½«[*…ñMÒEl…ãÙÕQ&}hoˆs©õbzÅ¡ú' \¸¤Ÿ¼Õ.Ò»z{FÄ<|×QA”ʒɹžWÙ(L”1 W~öf-cÜ [±£ÕF&W ÖA ªÕîÑGø¦·|$Içô*AmñÍ$¯‘ÆÞ2q„nŸPùm«×DZ›d;r¹ì“µâL}+b!³MǼÂÊ Ñ7Ö8˜êÒÙÏq©>¼z¹¾èŸ—:ÓK­÷òÁz¬v­tw¸Âi&h#MpÊ>WÕƒwq­åsQ2 ­ñº§ÞÜM§wšþLlúƒoqO:æ« ¨ Å™ßYb~}CúC%±×=;Üœºl´15Õ'1h‘ÂßO;´4A°¯¹p$K&+IÈAùŠ=„,*x(›7‹âW“%qÌÝk&ì‡l)!~,©’~ÖTªw\âˆßc´…Sö,.o¦¶8¼3<Ç "%ãF çøä¨E²BÍZ“ZJ¦‹’Ù™ÛùO]Ü6½î6ÀÈ4ÅIföxyŽR§:棉;´²Nffh£K­œ® ©ŽÉ5ðÃ*†TCçý+ôâ6ÿX/µX·4kbК& ëv¡˜£p'zhF•РwZY–ö’y§Àûšé`´¹½’ùg Tþcì+añáÈDob-iw\bpÉÃÔu°?›Ð1× %Síô3ùÏ^93!IèvM8Öo<Ùwóˆ¨7’RƒÆ¶yŒX0IRài SÿðRä³£¾}‡eSŽövÅi†1FÑÎû ;MoãüÂãƒàf¶ì\E¿‘î‹öøA ‡)„"صZ4@õ>‰á$MDã¾…{ÔâJ*ìëtÑtâ É0ÿÛÄæjLÜpì¸Ñ!Æj#ËÙz% é” ; ©²VúÓs±UQ´¬ŸžþbßÑg·¥à ®†‘ñÃI.Êd5Lõ¬4†?<3Fv…xšAˆNÕÒuÏ—jƒiË ždfš¦õàsäÞ®78¥ü0$9gÉ|zø™oÅ‘]»•µ¶Ò´°OP@{Ó¤‡U¾æHZ…ŽÏ]Ì.]z°R6Šj|_5$ïÞ¬>ïÜlý¹ê”‹kùF;êcôôY¾„Vws;eæ wíÎáh»/4·;:ÒQ¶¢ÞÖÕ€s1ãW˜ k =Û…ƒëÒÎÁÉ¸ØÆN™4.É'Â[_<]ôa¦TÈ¡ó»t¥=ÆýVß©À¥6ëG^¹!š+ „ÞZ¥ÖJzö©s¨d lÕõ 23åýLÃò!<`pÁ»š¨G†R„ýp¨çÒÝÎÀB¸ˆ"ßc®&ˆÞ™)òmè/P„Eƒ>ŒÎЛ‘ÕÜkã¿$òŽò7¦3ëÇ{ï%o9oÛ0õ}¸ âüŸÀÏOÉmU«þpÄB‘s‰ü|ù#ßNÁéÙ~CHµ†ý„Šô`NnÓ; ³×„ Ï¢édvJtegøÛéZu†ã¬Ð²tÕiÊ]Kmïâ^ºˆ;º.m,Äô¼ èÜöÓb´îmÐn1™Nm¿œ ‘ãB/Eªcý­þé`d•<“?À^œ²ª¤íÖ§T£\þL£ ]e½üéÆSimdføC¤ºÆùƒ·%ƈ†náýÎNÖ6:•–6ã÷>†k]t¦u¾ó+Ró\­Á•7$Øßb&8“ÒäT›ÌÝ•vök\íB_×qÓ¸}}Š¿g7V§É”ç xcsÐùÁ»xFú—õaöHÇDIé‘ÍÖpv‘ÂkX‚Eti©´Ú­¦Ux|$'ôeJÔ~%Õ”¡¥Ç(ë[µDŒÙwKš?õãR5\JFáÖ²³Å›À¼Ä¾ÆàZa7FÒ¬ý,û©Ñ<*¹XlØuDéÓâ#PIy—ÄÄ KW‚ÒØu7,lŸÌù©ß<7*©ãh±™“0³^Õ ÊÀŸ ý"&zÊör‰ hÐ6ÕL @ ^QB„eîÙw³¼×¡]R´=ò?‘ä4$:ŠÁŒÄÊËGfo¡‹,±Œª$H®KJÖk½${\z7šÆÒzmÀ[ H©—?ЙóÞM÷Ù¸5ú•ßÙ`§n=K›’:3åXhM銕]Æóm¿€ø¡ìµôj»ŸŸÆS=cž YÚ§¤­A1P“¼²ý¹”GU¦¾z‚Ae»±åäÃù}ïé[j22 É€aÜ0B… å¹±ª½eYÆÛ]ež *Éx/˰°7k¼r¡bIÑ:ÂH‹`ì ÊÓ¨l±0Ž’ÆJ·KÀu¾wá‚CÈ'ñèæ ºNP÷Žo¯ò{:”W­n`EõnCué˜L~4=wS+Q»DšNU‘¯ñWÜ$o–jG]ˆ,2Ÿà‰l}æñ¾L?Ú¶HAÓÿqÊ,/T"ÙjOŽ;wMŒ-»œ5˜#$ÔÈi1¸ÈˆRW£æ¹†~@}@êßÁìÞ?Ž]+hH×gǵ™ˆ2Ió"ز†Û,&fÁf`´W¯Í#ŽÒa¼¸[b_:«0¢¨qzðh¢¼Õ’•»Í0»~Ô˜0ÚÈéÏáß`Oõ:ôµ­‡¦Aü5¸¾Êƒ¼¬t:ÜûeÐ}“7ær‡šéZryíN^ÎÝ Và¯/Y¡[»eÓ¶Ÿ-§PðàIÓ¯A KGOyZ;ù# )!Ï©{4d9IÕ¥+7ÄAdvâß Ì¼ÇFYQ½Cšû– åƒhê{–àÂdøêE?æ”åFÂÓS³cº«sËi»éB’ɇ‘VQƒéM[ˆ»û?¤,Êëñ9kCÄ0^}tã³$öÓÑØn¦î¡vÆêä3øéSÎ!Ô¢-›?àTá®÷½náÎÊ1°Æ ÁÙáI[(òIn¢äÆî˜CÓïØª{ýcñu{ïYHh>»™B-ƒ$¶&ånâÛ`N´»ãÀL çÞ@‡“ôüÔ' žTúÚ˜ç' \øè/XŒJ/‡Æ%PÇDÏùÑó»úqWmÝ„ð6ZƒµÞBÛ8ª1Z„;߸Mb‘º¨ÈMÒBƒ5´=À¯Éî$vû&°Ê}në4?Õ=s0ø’Nª½Të!ÔìŠsÔyíàì„›ËWD·ròä–~H‘ÁØÇ·ðè¦k`¤h²F©¸ÑÓ˹Ó X®À{Kpm#;Dñdw4ó‡Ö®ã=:*¢“Þ̳üWlA½“¯xc…¢‡X‰Š ¶bÖåHóÊh”§óêvÓÅMogQÓ±éqMÙ€ð»sÞ•ÁÇ_ÄḊHXû¢àE¡ùTÔråÌëø. –mwGÊ%FìOÚ§kÇy…`:MÞÄ4…Ï¢ sÉP’`>‘ E‡ä¨+¶@ÇŒÜÑE5é¸×ËÚ²Tkjf·¦‘6ª2oY½²‡ú™³Š*ìxÇ3ïu€þÄ{²Þ°îrˆz|ðs)u©ìøCâì+Ûº¾í/7a¼«õ/?BæÜJ„&Q#™¨J‰¼c'ÇøË…â¾ jûÜ5T*à8+rßU çåB_-êpZ/r[ƒ1n¡£ý¢Õ·kÊK}ì—lCŠãŽQuઇÃ>«0PÀo[™ŒËNt/ ¨fKá·úS#-!LÇK ê ×ü†~{øÃçbÛÒöeXpE¾4Ÿ¤üe"—6~‘ .âêNHªõ„ž¿ÆYG»5c³Û¤øbTLr-%4ùWóW‹ÑŒ²gëÜ3'fn¢’ ‘…< ­|õyEczØ›µ«ü»¬Hq¿Èis¼¡àŒÒ˜ë§fƒ®ér_ÿ<ÝÑæ-}eµ­:[öµ²pÁ$è£Ö_k—ÌIJòµÆ<9½jÙwÔð’¢oÎ3yBõK_aC¢$·KCUdl#ŠŸRk¿BB‡øm+14óÛc±F SÚõ¾Ã~Ï9—8Ñ5F,uÍp”G~³Kª›¦‹¥–•®YÓjqì2]báïwÏ’—ísL‘›Šù‰Lì»|>¤ž»Ø3ºæ¤¬D]üŽ WüØŒW?º9ŠBvô’Ge¼ª’=a¾¾»RÕ$§­/ÁÝÚîBj!ÐÙÑÖ³BVøËÈ Qx$H×ÅX*ÉŒ ltùux1DÈ¥­š·5#TKµºI¨ñ¥Ëœ6R©¯lÚ¦=ö’K&Î.’ GÞeYÀg(^»’0ߦ³¼¶•'Ê›ê2Jx,GˆM'‰dýúU$ñt†‚3à\ÃÎsî ÷kŸ±‚Üo¬Ë ž˜o]ÀÛî‹ÙÑ}hW¨1»?Ⱦֻ–)âøD¿xI&{¦‚P̼öÁY-†‰e«x´=÷ŠtwÏçÑ3!Ù7Åeª¯ ËUdÚ—yÚ7e΂¢a‰5žš›lDŠuw[;šäLx¶¦LIð ¤ö-r'ÛwÒŽè›%„ÃsE-´­RÑæm[¨•çÄÌ_+ØPnÆçƒësãç~r”1'óîBÌs*e |=QŽ-¨Le÷M­9ö‚C&ã;›QÙÃFnZjwÔ(íï"¯Jæ_Œ Ý£Áh—ÏÏ;ô1+Ÿ•ëš¼;G+[œ³ ?féwK\z¿Ø6.ÎQ̵7o™zÆüê£&ÛÒùç×…nìÓü.óŒÅXTz~Ôœñ­“¡21”瀢øH ×¥âœRLK Q×­›lÔ’Õq¾} äéÞÆîsÿ)5íÛ6N‹xÊõ:ìJQÁ]µ[ÿþ¢^»À³à+#€G•IƒÓ+ìÝâÚLˆEŽ“<Þ‘WZÛÛž¹pŽàø —6KM†NÄIr†´Ä¥…ŠXí4V¼jHàœvðüüõD{ÙÐ[¸]z/KªC˜ñB›¤­Ø'K~z/$ï#rÎÇ0J‡‰;]ù±fÚk·ºÖŦºþ}“ÀßuµX¯âõÉiÈçPJÄ/aSŽy7y÷} OÀ3 Ïöúf¯i¥Ëæ ›¹­^\lí5z*¹ÚFjÃB.Ñ"\%xëˆàm[ó _6Óz£ôÑU¸žwøåßiéøÙÙ|ÐlÞÒ0®\4Ž!2)f¼®Ø”}“¦ ¬ ÖJèJÕWË]I,{¿Sm“Þ9%}vNcÊË%`7» ïɺ‰œÖŸSìÌiᣈ—m#¤ìoŽ´P"“ ûѤ8Ëê-´‰¶iÁï)· Ljcת r›ýµøi‡veÅHŒÁ ßÉ`Û;·rñŸ¬™‚Ò‚~-5îÝó¦ìy~@f!Ö9¡ù"eqÏghr’=ç  QnAé©–4å¢)lrÈ”!|¸Í æ_xPÐ U›‚œ0…sà¥\nG¯Øsp¨Jœå(ÇZ»óÒ¶¤¬ý¸FÕ?œN¯þé卿5µÞÙ°.öªgr<>ha4¬JÕ?ß²œTù+?é†ÙðG¼Â›¶OAÔdϹÒ3$u©DÃgFЭÁÔØ@ƒDøQN=ò[í_˜ôÜ’/í|·¦Ž—±ÐW2S¹q:#æ 0³{ç6x®d銈x0E°]ä‹¿utYpš}h~à¶"Mg!¯-ÏŠE±Þå'è5¶¬úÆ]ÆêºcN´ü’üù½E[820Ɉ£à°%=áÝ¿Ä]–Î;&ÖÏ”ÏMú°ìcûüW·ÌgÛ @…d9-æS ê&¢l{<¡ßM_è-‡P‡-NN0ä9ÆÑWë©Ük‰{ìkqxK•³?ƒGWSjµ™œ~ºÌÅ›[s4—Ti6’G±)ÅEPKîµ{BŠGõ¶ª—V‡ MŸBºå»~ŒDX;HúþJÞÞ02uš ð"À²–åÙ„öšnMÞ å[ˆlímN¬ÊÇD &MH¥i}ÚΡ ]~wÈ@mvI0yF ˆ1AÎ@ .‰áJB°2Ã.®ïydQ¹»}&ú*Ùb–D}i†fŸ½hs2èL•u¤fÆpÙGÕûS@€"yzö¬KÛ5¢_i’‘ÞP;r\-ļµ s“Áè­x 4ÂÉåh€E%— ÛWŸé¾$7«z|“„Š×S=Ê ÷)Ö|)*ýú¸A¡lwöÙຓ¨¥Û`3ãÃÙãÙSG6 PØg\C.ÄV*Ë¿fz[zYxõû–0¦7F¦Ea@1½¼—-‰Æ¼,¾‹Ééq`Û®§Ìù¦•ù·fh»˜Ûh‹CUªßÎÐ)hG‹%©Và˜™lÓuR veäA²º”#8{<³vÙº++ж‡Â® S_ÃsjmÑSy7š3HKÆ|Äž'?ìK³ÕS‚ÞÂÈZv8WÊ¡ Ñ(O =~inwnÙcÄ&*Y6èNÎ âUd2ù©ßVZ‚ºUA?xûbëý‚q¥=«%è¸Ì0½Ñ@/ÞcÚþUw0ùt3Ò4=õdEÊÃ…w0àÉC¢Ž?8ñÔʈ»s¸2ÊÙÆ‡LHe¡´Ã§’mÞðV2Ÿ…¦FntüßÖÅù|&3l‰.ЫsW¾=ô ¹™-Ÿ’ìg¾Å­óçAÖØ!z)I¼P¹éû9Tïv¼€âXÉ® Á«x#a•ä×à RM˜Ö›Slfå'¹Q9a¥ˆ«Á»ÍÉÏ6Áu›ØÆá¢µBƒÂÇ /–o2$©úÎt_/Þ‚@™ÉX4ßrÃ,s–nL.7ɱ“ŸLÐþ²)0ïeñ|~»·¾–ÓÆ5K~×Rˆ’„Ù·.JZ…Ów˜ 7W~·^ÁApõyC_­Æ?ÉtâÉNŠŒ¯ëä¼1[oØŒœ¼ŠIºÒ¸Æ¶Æ%†vj/ãv·Ó, κNkR¡Yr[”0 žÕVoì»TN”. ‚;]v©G¾¯\]‹,ãò;R¾1å®y³‹®ßZà tüñn½ÆÛ•óºòÀ ³š&Ëaaþz½2Ÿ3p`èû¾ƒi§USé?Î_QŸ¨ •:ÇÍ™‘7žLù'N®‹[zw#˵Ws$¬ž²Æ7S<´:7„½JnóG£^,&[þÄü1æŸEZ±»û _¬` kõ/Œ°Í=Ýp$Õº«¾m#%‚Úª¼¼¾ýá@,´À)ôd$~!w%)†Gòª³ï´XïùÖÌ›nR³.­»/”/e_1” ÍS±×IÓ Æ'/ðùäÅ_Q<7ÊßÂ>Ö6¡§$²µå;‚Žïj|*#¨¥uA“mí!ljŒÔ÷’fýj¥&üQƒviékåüËäÅñ KmÙ,[äGc_ϧËx±]#Š’(Y CôÊ׬aÙÚ„Ú÷J6ØO ‹#ÖøÒý¨‘xiUu£{ÑÎ7–"…Uw[…ÖV æÈ =¬†Ÿ5ž¯›`.àåä¹iš£ÀzçIÐåÇj¡Ñc>Ú*?§…‘êñXR{~Ö×ÜØZ,À _þ|óDñÉ+ˆb.ŠÄ´£ÈT7é‰ 6íž—BQƒð•RŠþì¤m²(H‡Þ½KvÌpqŒób¨¦ xeöîycV·^q³Ø±n±¸”YiBjœÄêP ÛúŽL°Ò™?Ëšñ©˜"Þ¤ËP‰mô†Oùùê}B óTØl†°L]°%¯> MÓ,<òM[î/É!IޤÇ!›ïQ™ÙЇ~#íèžkfš/Ý‹wÇŸ#“E“T8øNêã¸Z_e>ÛLí¡dXˆ•x‡®E£ àÐISРunÖ,¤#îà¨Úì­³†ìT&â»á÷–’Ò±ìÇ~€$6šµÑwÐë…z+jØ0 Yõý¤ÍøÇ9ýäöye„è¹p¶÷—¸N‡oêŸå®Ÿ¬Šûºöç½Ä¿FéÔ_Š3ŸÇ ™Dúþö]Ì$_Ý‘NÍnž°: ÛÒt:ô$âò}ŸQë—wÏKBÉZ'æXòχô³T‚½ïE0ß,¾¯ßÞÝn 8!Û~ÞBì w\2™è<‰lýR´ÍûMÛöЉ åA%Ê3±FÌWÞ8É“/”ÂöY°ZyKL–#ÝáXáUvÌQdO1è3ÖUgíÜYPÞt¡ï×ãs?­þ‹ÎO8ļׄ]¤`õÃCÏp‚òkN÷„ñÁ30¬ÌÛ5ÇǤ~‡œ87 BvRÍ}U.Í´lLšD,¥#2q:“¤e+eîãØžïQkZ -Ð$Z ö:–‡OFŠFÙ§#Þ›@ˆßµVUõv2ì×;¤')x~,ÿÙ@´î>Ь,Lužhˆw¦æÚNäUsL¡ŒE®›ASîÁÓ|›uÒoYð}‹§Z/ý©‡Ð4Uí¡«O)áêG(âžÝú±½MˆW½Ë/s¥ŸŽÜ‡ }icU’*ÙRFðf„2™D¢–bárŽ—ä?áÏJðE8s¾ÛºoRsVÌöLl¶ºö³™ëFѹx*õLcYÕ¢}7/‰a˜ŒZ|ëøÔ"P¯På ŸÕ´Ú#…¸ò r›vLêUÄ!(cξ/M³“X}qÚä,9íþj×C)ºo¶Faºá(%•Ǹ°\‹)„!®ío!:¼‹*Q£Lêhò·uñS_.òþ–aÕjø¡]Qê}QÖ­MgìÎ)òRú¦pGWÏôfZ vÎç†|âi7hû:Wì|بmÛÚÂ@z%[ED,’¤öÉ]¬›ˆ•Ì$¥Æë}(?/X ÅÚ“A4iªøH›¿¬0W¦q\_'k±ù?ÞèÒ Ëk*àÈýLñ‡äãïô”Þ% §.Üxí9Œó›š SÊáŒÜ6É2éW¥8Ïý*P^䉊ºEjÓÍú¤ÒóÈJ/[j’á6ŒPÆù+›9)»¢9 ýA.o”‘: fV×¥ œ¡™¸ÏfOV£w9§êÍ\x‹"xˆ”&&}BËÈ”µ¼ѯ@üËéý5N*ÙékUfÃCçÆ¾ sšzð‘—NîÁôºÊy=£p_!µ“”“)rdzí\M]<û÷< ›# íúy¿9¿‹²ùêkì<#ˆÔµÚNë‘W‘L•b'u\I˜Ç€jþYæ/”_ŸF=áÁÒwíGÙAqU·°Ø¢‚Ø~âl¡£Ó-`ë[¸çÒÝ젤ÅbZ¾A*¶J œrÇsü†ª x~F{ª¶›¬çØ&Ì¿Ô9*{ÖSTt-ÉãK½8=žKTYn¬g¸£*Þ…È.…蜿sôÁÙÈÿrµ5Þ–×tJüóž1@UøÞùúàžÓÆ.Ÿ¿ËûCq°vÑãSþWï„nˆ&(ƒŠ7ÍWŸ±KØOÍ^yeWš7^ÏpnBÖa3Û<›Y—wµJþ8³d ?éãFù°åUÙÂ#ó̾¥!}oqÁÊ»JwN©¹êDUšÒñ} n8Ëî {“xÅC@ˆïn½Uæ8ÊÞ éVº ·øÂdbõ‰îº×¼ 6—NöÅ­y5žì,a`3â‹\ó Õ.¶]¹ôÌ%šÀ8;tÙ­½+B649œz¶àÐ^¡?¿è„Ò9Ÿ—·Õ6ÄiKÄúؤ²cN˜öç-él1Q¹¼S…Od’ºÆÊÒ·ºWÑ-) ÚZ' õlÀ1+ç“/ŽÆN绢¾¤<zO’Ë&«G&ã’(Ùy®jtÎ.ÍÛïúkÙÖ'N5Q´é®Ê¬›ÆÛÏç¸Ö.oÑf5¯i8; ü~'¡âQô8­ÈSuÏš¸ˆ¥ƒDëîH§e/;0”H{ã–\3zžg?1Êv™;ÍßäVl2Ëqd§Žt#+1'†#ðg¡Ÿ¼VØÐ)›5ÐÇÁÈ»Ü6S"HÏ'µ7c££1=ÌÆ‹³M¸­ž¡¿,@‹­>â²$?¥dã©ø„W:*Caû‚ =»V(NÚ fÁd­ížFR¹ÿYwéüš9HTr‘––ÌqæÄ`l([ù’Q7®M¬Eﮜœ‘?avP*†µÏ\â°{‚Ë[ò¬ÖŸHqZ3ŸÛô:±v•¾ôšP+gPµ÷W ìR¥àzɪ˜’rŒ ^3q°þÅkæM endstream endobj 270 0 obj << /Type /FontDescriptor /FontName /WRNJHG+CMR12 /Flags 4 /FontBBox [-34 -251 988 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/L/M/O/a/b/c/comma/e/four/h/i/l/n/o/one/r/t/three/two/w/zero) /FontFile 269 0 R >> endobj 271 0 obj << /Length1 1487 /Length2 7334 /Length3 0 /Length 8327 /Filter /FlateDecode >> stream xÚ¶T”Ý6 ’ÒHH ¥ôÒÝÝ 00ÌÐÝ]ŠÒÝ H‡ -!)Ò"Ý|èûžóžsþ­ï[³ÖÌsݵ÷µïëÞÏ0Шk±IX!, ²¸+';‡ PJE““ÈÁÁÍÎÁÁ``ІºÂ › ºg(.øRΰëƒMìú§‚€Ý`@Nn çKAN>A ‡À¿΂@i°;Ô ¨ÂTDÀ!.)„£—3ÔÆÖõa™=-™€œ|¬Òg¨%T»ÚBV´ÀZK(ÄÕë¿J0 Ûºº: ‚@ì`v„³(+Ðêj Ô„¸@œÝ!VÀß„ª`È_ÌØ @m[¨Ë_v-„µ«Ø|0À –¸ËC†Ü â |X¨¥  Ts„Àÿ Vþ+€ø÷Ù9Ù9ÿ]îïìß… ð?É`KK„ƒ#î…Û­¡0PMV™ÝÕÓ•†[ýÃ\ù`w0¶xø³s0PVB~ ø7=Kg¨£« » ö›"èw™‡S–[I! pWÀïýIC!–Çîú«³öp„Üço` …[Yÿ&aåæÒCÜ Ò‡<˜ÿØl ®@^>^ Ä ñ´´ý.¯íåùãäüm~`àçãˆpZ?€øA­!?°;èêìñóùOÇ#''Ð jé ´€Ø@ဪ?˜!Öá‡æ;C=FÚãrüþüûÉäA^V8ÌëŸð?ýéËè)h³üÅøß>II„'Ї›ÈÆÅËàáòñýþ»Ê¿ùÿ‹û«:ú÷Þ8þ)¨·Fþ¢ðpvÿ¢áþ·*ÿž&௠Šx2Èøò9x9,¾8ÿŸõÿ'åÿOö¿«üß”ÿ¿’uƒÁþ¸ÿøÿ?n°æõwÀƒ’Ý\¦Bñ0ðÿ Õƒü5É*+¨›Ãÿz\ÁÓ!·ýû¡.²POˆ•:ÔÕÒö/ ý« åaP8Dáý}×Ù898þÇ÷0o–ö÷‰ËC¯þ¸ ãôßKÊÀ-V¿çŽ‹÷%ìì öp<È‹‹—èÃù0 VÏ?Ê‚Øáׇà=? 5Âð»£ü<@öoÓ$ÀÿA@å¿çƒ&Aÿ€Ü@ÍÀ‡B¶ÿ*Ùÿ9¹€ Ç?ð¿voéæìü0Õôõ@í_øÏxB,sÓK¡P»šÐO—Uäl#" z)Ll>sέn×8ï˜*3‚—Ï%Þ}éÂ[X—a<Ÿ§¾óÙùX‡Ñœ Ñrã{köVsl£0û•¸w´`G¢¶‡ò1›¶ø¦ï“¯n=ÊGävE†'7~õ<ÂKÏržµ=e߆§746+_*aÝ–³½Ò‰5*ždȵȜ"¥Ewe£Äd&8ôÄ<;Ÿ Ƚ§V|ËðÛ}Å]èc¸ÂõújÊ{±\›Ë¥ƒŒžÌ”åŒ`hì¹äV’"ÉŒOIQ ^û WÞb¦Én`V‘†Ñt#°ÛÇnD©Cz÷|%ú¹'$¼upó"ÐóÐ[ö“Tf̦^˜œg§H³ƒ"ñ >»å#<ÃóvßË)·=űâ4b¨E öGÛÒÇè×O“‰Œ‚º†YeoüXÝ<µf :Ûmòdz¢œ»ùë% ð p¶—Õ'ÄÞÉÍçåà¡}SOåkÃ]LïÜL51Ã<þÔBFðJÇ!Xø2vZV[eífT·°DEþÑ*Ý÷™1/C¹ÖDË£Xí*ýÕä ?{'Ly’]lâ·g>w ŸÈKÑËpͰ½+¢¤®çëzSÛgÜ)P±ß†Ý"¾.FêÔ˜¨Èv7°Þ.o÷5ëµÅ†±j×NQ[ôaš/±h[£“¿¼Æg´º¦PÐ@f*›¾ÍÿÅJÑ¡›pXÇ’m™×ܧM>t Ìd  ˜X­Å}VÞe&„AØãY)¥4f—±Ù=¯Ûÿ‘>¥îòCÅÁ¦ºòSFïþ¼§ŒV\jâi‡_½ÍqëªðYœô5p)ð#«AW¢*‰á“iç½Âš_uŽÎQÞ£O—›6?¨ZÕwŸ#\FcšüƒŽ£E¼KM¨+P§`'o{±î ÞúDËõ_ D_ኸϱ‰~Á "è»%ðoˆ±ÄK56Q|¶L:øºµNä1 çhÖz8C%]|–ÆE¬Ú>“±²>ˆˆ‰Îs!Íœ’^Â$Äeóñ2}§ÑL”¸î@KèñFG&`å‰`ëV&À÷™`‡éÂÓ3Yo3œYë@ñ›Í•À€Š[áä8½JÙV“p…ªÑÓò«—øc1#.4£‰ò¤jÌ*ã´ªsÝ% cÏ>ô¬Š2Y'ÁMü¬Æâ¢$çkŸAµÂ³¹§ åí„c]Ý($TCµüž~ (Í#5-@n!ðáO3Œ–›)U™ÍqK`‚Ñò¥…2LÖM_}Ž$µÏ{­Së+rZ‹0‹ë[tóö> Á˜m%ÃYËÌh Ú}cNA‰ÏU$¤~+ÝÈ~$îë*†ölœâ«« ‘}§ŽxVŸ5·£±Šô>&Ψ µÑ½}0nY5›áˆÃŽ”<§8¹¬š(Ö‰ö “êÆýqޤÁùùzÍiÂ'kf31o§ä$ZÏ÷qpßæ~iyWâQ¬g ÝµÔ²¸ïJsì;9bÛÏ‚ÁÌ:v7+€«oëÅû>À’›¡ß6m|‰ÏŽUÍs"¢ñl!EÛ-²i¾M©[Cãß‹}B¤8G’ìÀøéw¥w½ã͈–sÇ…Qr•í ÷ÄxÙBïÔ®^D„Õ''â:4¶ÉØòy’5\7¯Ð¾ôò€Á„@Vª°Ø…*ÊýÊ.Y{¡'š”¼Óóòå[ƾoö¨WÛ´Ý}Ìy½!zJƒÒáÚ©ï±jçC從,hO…$·¿Dç›éždË-úÕò«^Í:]’©EgLÊZ†Ÿ½[AÃgi­On²h?,qëq=¡dõEôp˜$¡&™#mË":>Îvûš’ÙrÄY»Êéùœ¯ŽtôRêû©æá=æž¹ÃÎquO‡¶¬*gªí§«1ü£ ým²§|­š¡’ 7¢'—ú\Aþzº1ÕÀæÓ [ièöq]g;$ƒZ[¨Äh+Ÿ³jj]B¡M©Pƒó¨êu)Ø¢E÷ epª¹zPßûË?pè;J¬À=Ý rtãâÆÒ,œy,Ç‘íò·Š¼¼ï«Ðm¼QøÞÙÈÉWDŽJ1½ž›¸™¯ cgË•^!Ã&Ãâo‘V\š3´˜­ ›ô$Q{Þ²ö¥Ç w]d¿÷vFbÛ £‰òM×TÖa!J$?”:èúú=¶8Í~ˆýüàfCºˆ‘£„t‘G\_$pŒÛò¸å~‘¿f°nÓž¶ëÒFv:§Å’ˆÐû•­éþñ ”|æ·+Hº¤HšíkÜ79g†/~º¡¾ÒøŽß³~¯DªR›a°Jmí¨FnrKˆrÑ6¸µUÈ_  r3±Zìþð„‡ˆ€°âëYÙY\ŒÈ¯üçYnõGD4'“æÅ?–2?è^M=+4§'‰z7XðÍeݽ°û¡@†ÎEÝ@lñÜŒ­wµ±ÏO q0‰ëUä¿PÕy¿Æ 4}2ÆÂ!"ÃTÆÌ¤žŽlX²îhdóx Dá†Õs S•/ û›nŠçOÜŦÄ7aÓAý΋ª¸Õv{T‰È†æúTêq Ø—Qá+M?£E¾ô‰\Š€ÊUãuâÏïN<¸Ç´sVuV¹äQ'û~P«9„¼›«X0úÂKƒ=ËHå+|iÆ¥"¢Gò\)€Þ÷ëÌ ¶–á¹²}Q¤ Íj„+?þãC(#Ë÷ÆvvÔfáꬶg;€YŽ®ÓHM‘n…¯¼eFuv¹¾—\¸Ç‚®Þé'G‡ÿLUp×HH%`Ë3­ÿÁÞÁô)AÄØF=£ <±ñÈ‹i·äqó“H1£6›v†¯ ßbh£ŽóþO¢a#ß*¼• SFo\Š-[dÐ7’Ez¼¾H†÷jd,+†¾3KAòÒÌè²DÝüRPlWK4R²îðŸ˜¨Õ¦Ï Fù˜1´»–ÍóJ‡}¹ñuÜop^Ški1ÇUuIBb`©_ƒö(W]øa À¿x'YÊõl$ ºxÍÁ÷{á‰R2R÷o:êBÁ{ $ÉW¿°¼Ø7:áMZ?ÓÍŸz†Þ´ÂY @ ΛcX¥ÊÖ{ëIàÃá°š¢O£}-ÈÜ£ÇñS2_’ÐÜÕ©š©An¿ò~;\?3Ö|nà%–¹R28צRvKDæÎ¶>oZ©)g#Ç@ jL«Ó}ò ö^Έ6sXJˆ¾# ·½Ìm—±^c¼?ÎÛ¾¤ýþ¤Ãzôªé4ÍrH:B@¡Us"ïÂ$õöÂŽ@MŒž&AX_ÙêäÃúk1 –åUM,ýÕ=²™Ÿ†¾¥#Ïšk2Þa`µ@¦*ŸØøØ;Å]”q´B‡ˆ!—€…"±s£Ë¨§}?Fú Û\‡S®![ë(z´¿TváNUl»ïË K1J3”£)wì+Km¡ao»aýȨ ³1õ~ÈÓÆ-xL3z$´ùÓaŠ}…N¸ac5j4¯™«9~ïu¥cKc£cýByê¤yú[ª¹ŠÔ1¥õÕ&I‚“ø 8º€Êç‰Í´ýB«ÇÓŸ_šîZo@¶ô«J¼®è2Ƕ¢ÐÉkÊe” f5Å9RåÀîl¶JF¤€’ K¯ñ™†¯’Üè¦ù\n]•ºóYPú“¯z™d÷˜Ѩn’²Äç¢ñ<«Bß1¤|éñ°¦üQƒû´t™ ±8"ÑõCEú) ¦Dèç©d€æÓ¼4ÿ~Ö¸p)­•Žê泡ó8[hhŠòDÉDýcÂÏäÔtxì¬*>ÕZñ‘¦Ø0V_…v6¾ç^LVoHîWÍåK¾xÄe󾬧B³†·æ”ô¬™úóYìA¨ØÔäÌäê#Äø*ÕÚ/LÁ ÏϦ„}uÛþ€Mãh&–Õié®ÈúxØß. º”C]Ø'\9MÈJB9hr¤ã›z**Y‚·§%â±,ò Þî~Igÿ‡×¯ÀïÒhݹ°Wèvæ¹&”Ä8úžÚ €¡– Øm'*ò½¡(ôœx€QU„qÙ#Ã)–sâ\dPâ¦-÷çÝ~§ü†Þ·óŠûf-ÉKdù´¿5.wêÖÝ0AF ½9ê‹Í*²éO\ëØŸ'úc\k@N öu+5»rF+jf1 Ëð÷ÒMà'kO´°#I8NU3JÆÐ¥Äê?®¨ú? b”¡Œ©·’îUy»ºuæû ‹OÛmÀÚB¯$ÚÊr½ø¾'(ºxï[ô.¶z{âÀäE墜TÎgbX~"ŸÆGV‡ŠnÄ- J}Šq¦þ.åšÈeŸf„üd­#DCùdÍjFú#0K¬ÜXm!ÞóÛ#"Ì´znDÝk¤'ÉH™;ŒÀ#_] ÚzÔÇ; È'¬t§SÑÊš+ ¢â€Ý[öÅúƒÐëi,Çîô8Ïå5Ï÷Z¯¬u~RÆû¢„xä0 ØUG™¦›Æ½O™°¯>´1?µsy¿?bûœAYMÃõ &™¦ÖyÊ7x}*EfÁŠ… º:±f¢ ]>ƒÿÝÏžÌG;j‡{Áù’¥Ý†Ïš_§™öva™/C©$çßž#Öù¢C¨´©Jzã—ãèúežôޣ߰f1Y'^œ‘‘ÆÖð·Ábˆbš™¿Üÿ\ߦ8,‘Q-ؾE³¸Mm·×ÚaOÿî­€tIj1;{7˜ã$QݽÌyÿò-Å$\êàór±YWb/ E­È…fý†ɧ켚“xÎèHE¹Å‡ ¿ìDx‹lxœ‚Ëݦèž[y5YÅ>¨7­.E¼¨ê¾œYsõB–$UEŽ·‡%Ëûñ•ü"sgOXB=/*/à€foc¿¬õ¸<5£ïuDzÓSõ˜ºx„Åãȶ{äGÂUÈâuJY-™8¾G²d÷H?íZ>%ËMóºR™z,þ²á)m^ç¤áa]â˜Ô*[ö­éªŒŽQñ•ø ¿¯]"û’T4æ·GL{ùmÖ÷Aj „C‘{Ô ®]T] \ð+ägVá„Ãü~EÃ#3îЉ¨ ©ôʯ1ê^-:œ±ÆÇZ‚±ùþÐy»QÝW=T¹Œ5Ç×y0Ùj–.]{ÁÛa6¾´¦ÄÎ!ƒÌ¾G Éss¡šÈôÆKs‡Õwr°cê÷ó¾b¬Zhµ*äÙ›æIzý½˜7þÛht B­P‰ý‹YR~öËÅØçœ–báté$4Ñ ’"èÕ§¿z׿LHîf"Ðäøá×uÒN‰k;è·*ù„e“»Šx#iLµÓ'êŸtÛY…,П·¾àÜW¦š å5¦Ã%ÊjØÎ'¢†³2Ç~P{æÞÈ·=cE«è"f*h`ÜÎ6ÒÐ R(i—p¨Õ‚o¸&¥ãÍï!bÌî9ߘÌÕ]xùu—$OˆÃ« 8ºq³§®Ýp}}Þ/Õ\]ÚZŠ/• \œƒ'±´¥ðŸGæ$— Ɔ „¾ÝiðI]‘ø„®å W»™hÂKsç,ã>·IwÍH1o{”›ñY»¦§¨ßÐ,ÚJ©åŸ|Í#yäÔ_Ê’âeŸoMÖ?ϼçŸUéD£ñôÀÕ‰?X½¥ÃíëLqÑkx»2¾Èšº;Ì^º w—MHDG‰ìLb³dOåÂù5?ð{©£u_áÒ;~GòmîuËO Û‡žëLò¥Å‡äáÁT&—"LæäßЄõ:IW­'bõfIaAÒW?½4}9œÿJšôJšºÑQ©€$ù3$ªN§¡QõH¶cH cïà«ߣk[äµ”ÛÃ-lŸ “–ÄÕasþ‰Sjeqò÷tì#¡»˜àíæ¼ KšbävÔÜC޲†dOþ·Ä™)TŽ'·ñ*´{w(ZŠ„N¤Ç‰zU)âtc³o†y«I”a¢†goôš4ÔºD› ZNb.8(Û´÷>5;ûlz9,tM2¸èF3T¯LSÑ㠷áš&ÅÖ4òâ{.Š£íÃRŸÏÛ©ÛPy ¿ýJp˽’™t;S£šžJ­þ p¾7ÿ+¼…x0´«Ê‹ª<äúm¤FüµÎ€é>m“Ë«D‡sÈo˜îÔÃ)øçoå;Ô*b‹ M+n@Æù‡¬-¤pësU¹üómYéÙh¬•$ójUê5$ö¸{©Ž”G ç†áEß™*=>]ù¬•¥”J ŒÁ(Ÿ¿)-ZS¡ìRù,ª£áàŽ÷©xBïš.$8O>œN0h§ép0IaûüË¦Š¬1ÒÐ;IÆ-ÜôÚQ¬Ã޾$—ƒûè&>ødše?{”CÊå‘ÝÄØèæŽe¯m¼õ™Vfâ;yrÙd"3Þs0{­©©|—ۯ괶:Fš½¦<,ž~ô ‚Ò™bÊäYiYÔyÀÈ=“ãržw0k²Z÷³Ã~A¼LDÕ§òs¹hìf ì‹ÐÐ@QÞÚö× 0Û—GŠÃ˜2oŒÝ¯ƒ¿Fl^zÙ\ö?ÏV*›< rÖ‰åùüZ s´é¬QÄ´Z{Ø©2H–|p>Ž@UäòÊžÒ·Õ¸‡ÚZp´\7›bÂrV>6í“0$ñý±Ê;\ÖA2½Ä‰Z:$µAÌs6BP¥É·àPjþ ûåâ˜snOaGrŠ]Ícb^ö=¢XÿÌ!îç½Å{JÐ5¡¡ëísªÑÔg‘¸½à¤5˜Hf¦Š}ã#Z‰BŸÂ#%¹äy}üa¹o¤fÊ3Ô`SÏT‹S‰Âûè.KKçó„:þ†o ‘#/ï›0Åíþðñä=õ\³üÀró³õËjž`:eCɹI±°ºWëQqd²qVmŒ'ÓšÕÖôíúbT±šC_+ne¤.ÛµÄéS M¾wR9ÇTÕQD爲6„Ò¨áZƒ@)[Í”ëy‘/¿]ÕÆtØ6?¡n &£Ù.<–ìñŰýwv'÷CzmF]‰` >"/“ÿâ Mº*J¼)Xî¡+›  e/@?>'îF{]–D™ë iŸS{=nXî’ĵ"ºIá¡"°ªx#I%LÞ¹"QùÍÜ^¤b#ô\Ö»ÛðfDÃÀr¦ÂqãE…M}¤iöò¥\9½ßø â;ØOÍh/²6õÚ© ¶Ÿò(ËÕWòþ”­“×ÊÊ.éhÄêáÍÙ‹¹ŸtÏ¿)»Mv3~m[Ѩ± † ZV‹ N±–ØôôR`Ä÷u§@/erAöáüX4ÊÜçCãÑ)Þ× smœz»Úd–eµãM)mS~˜I%÷®žóV¥ùº=;5#+òÕ”uI6úY;ø+~í¥Õ—ÁÌE{ÏÚî™Gú<´÷Å·î, ü×û;Ž=ÅÕx/ŒÞ·ÍN,cË•a8¡ù×=©ÉÅ«§…™ÑŒ ¦V‘ÞmÓ ë7§~E.G}E$#ñÒpöâ \HjÊMH×-ƒMYÉG{Äåub tYvyìP X 8ùxb“3YÍÛ2Ûö ¼&cŠœ>Žp© n=ý|¢Ó—YæÊ,ž]ð g-ùH\&Ý= R0TªÜËž†iïV„»–Ëí¼8ñ›oššY½€…:Æ›§4]?F6I£è6]1ÀEî‚~aaÏ^Q ‚ņžHäé˜v…õÂÌ#)Í4dïCk0Äý Õ6ÉŒsPsÉ1”$U““§õw‰ž¨ÂyN„8è¹N7짃Â嬥ª±dÈ­š²7áSÑ©&UNñ¯•Í=ŠvÔpرÝ~™ˆ”:¿c^¿ÏY*#¼ ÀLà\(S··ë’qŸSGÈnÔÉÐ×®7Þ×C¿0n|vGM—ï<ŒЩݸd§Íîà{e‹8½y2^ó8;mc˃Jx"܃'…ÑY%ǷMË VgìShCsâ®÷¤ ä7aVYlsÄ21z€—æ_Ieçðo‚ rdѼ­ùëiäÖãéÖi«—ZÛÏtKÍP¥³ûƒÖ6s2^\Sb$!m|÷¤ÍÀÕX%xŸN­6åLûÞmÚåÃ}é}÷,ê’X,bVˆîÛ ép…Zœ^žMpÝšn¢¾µ$¨4u·–£’òµuRE‰ÌÚ'Yh8ÊÄŽŠ„—^„dD›8ÓÙFÎU¬©[¤½:_@õ1#×”&ª%­™.ü€?ù±â&5á´q£µ¿ñ•š;Vé¶î§_›µ™ÎWjß>ˆÕ0úòÈX¬Òx‹óívk”ËN„õ¬€±¹wÞr v D7ù–,³«Ùû¡Ä—σ¢>¾¤›}R‰4?r×½r  á\ñBÝ´Z'Ü5–øH°Ó(BÛBDf+vJuäyúìÚ” N::ÜéµÅ{•€¶f>™!ÑÇ>»|å+þ`žýº°kI½j 6HÁðjÙ7"óµ²ï° ¹ ¼d¡~ëJÛ¶S×!U{OÕ/JÈçÅlŠÈtÛf±–'}èÂnz¹R¯Ê÷Šl·6ñÐ^¯7 ½zéqg µÈBÈj)ú÷¦YÖÉí_xxÚWë /¾v ºæ)½Œc"’j§ÌüªÕúËÚ Q¼¤1 óŸ£zÀ˜eÞŒŽ-fö§Èkß0nÁtS¥pS±%J[QÉóšæÅkç1¤уߴQcNw[ÛÏ4¼ŸØ’K—²G„ºug¡èN)f2êDŠÌi }l^›‹g–º%/—¾™élä8¿Œ'6CÎ1^‹Bãiío[dT„ò\ª{ÑUXâ°dí8Àš•3A6JŽ„ïµ‡AhƒYD€ŽòI|šz1‘Ð* €2N,×PôÀc ‚9‡}’Þ :½Ýmª+–e·.1hu®Ë´›´ÆlÑn´=#?˜*ÞÛ‚ÎÀï~:K¼Æ¾Ú_XfŒóÀ?ß­¿>–ÁVån·_@Q™°ÃÏkô»2 endstream endobj 272 0 obj << /Type /FontDescriptor /FontName /XEWKYT+CMR17 /Flags 4 /FontBBox [-33 -250 945 749] /Ascent 694 /CapHeight 683 /Descent -195 /ItalicAngle 0 /StemV 53 /XHeight 430 /CharSet (/T/a/c/e/g/h/k/p) /FontFile 271 0 R >> endobj 273 0 obj << /Length1 2722 /Length2 18086 /Length3 0 /Length 19638 /Filter /FlateDecode >> stream xÚŒ·uTÚþJI·tÝÝ ÒÝ!9„ÄÐ)ÝÝ) ´tH7ÒÝÝÝH¼9çÜ{ôþÞûã­Y‹™Ï·sï ™²“¨È(²sfbcfåˆ+¨É««³±XY9˜YYÙ©¨Ô­œm€¿9ˆTš@G'+ÿ2âŽ@cg0MÂØ,ª²ÈºØØ8lÜül<ü¬¬vVV¾ÿ ‚ùÆ®Vff€,Èè„H%²÷p´²°t{úïO­)€‡ñou€¨-ÐÑÊÔØ `ìl ´{45¶¨L­€Îÿc‚ö¥³³=? ‹››³±­3ÈÑBˆŽàfål P:]f€¿Ò(ÛÿMŽ‘  niåôK dîìfì€ 6V¦@;'°’‹ÐöP“‘(Ùíþ–ÿG€ðŸòؘÙþ5÷í¿ YÙý­llj ²µ7¶ó°²³˜[ÙJRòÌÎîÎŒc;³¿mœ@`}cWc+c°ÀßÁ¤DUÆàÿ“¡“©£•½³³“•Í_Y²üe\hI;3q­-ÐÎÙ ñ¯ø$¬¦àÊ{°üÛbk;›×olnegfþW*f.ö,vV.@‰ÿHIˆ¿i@g+++/¸±@ÐÝÔ’å/'êöÀ¿™l‘Áyx{ÙƒìæàT€ÞVæ@𢗓±+àìèôöú“ñ¿‘ `feê 0ZXÙ!þ¶&ÍÿÁà)p´r豂‡ Àú×çß_à93ÙÙxüÿ»Ñ,ÊêJâR ÿ&ý/[L äðbbg0±sp¸ÙxÜ|Üïÿ5ôo þ›þßTec«ÿ„÷‡A;s€ïŸ,Àåûo&®ÿÚÿlà=(‚Àc ÐþÞ}V.VSð¶ÿß»ð·Êÿ× üeåÿÇüߘ¤\llþ– ý¯ÈÿKÂØÖÊÆã?2àÁvq/‰¼*vÿWT øÏn+ͬ\lÿ/WÆÙ¼,¢vàgâcæäþ‡lå$eå4S¶r6µü{xþÛ°+; 2ÈÉê¯ÀÄöߦüËo ©5øq7ío¼`ÿëUÒÎdö×&²sqŒ=YÁ£ÆÎÅðb¯¬Ðýï)°0ÛœÁ*p†Þs#â_­åæ°ˆþEúqXÄ~#‹øoÄ Á߈À"ù/âa°HýFl–÷¿;€Eú7â°ÈüF`ïr¿Ø»üoö®ð½+þF`ïJÿ"^°wåßì]å7{WýÀÞÕ~#N‹úoŽEã7Ç¢ù/â{ÐýÀ‘ÿ‹8À‘ÛÚƒwã¯Óï¿T6v°c'S+pomÌ€ÿÒ9Ùÿ"ƒGÌÊÉú·A° “?TÁQš8›m€æÎ¹þCþg·þUfû‡l tþy>ŽéÿG\<ÓØ·)È<ÿ†ÈùÅÖöwŠ &ËïÜ8À©™llŒÿGñ;Kð(²ÿÇ)÷_|ð¢ÿV—Âü· 8\s+×?lüŹüé,bñÛ"˜oñ× üS»åïLÀ³ô°·Úý!¦YýÁ‘~ü‚[kýçwÄÜà*ØüµŒ¿ùàRÚþ†àC™å·+.°-;ðÿ®ص‹­É_ǨÅ!/ Ðï Á6Ah±±µÿÍû°ßìvÿÓlN¶ÿPÿ·ÕàÀ“ ¾Áÿåþ›fúÝPNpaím\þH üþaqøm\U3ÐÌäþ±©”ž œÝo \! ë•ç‹;/½ß à@~‡¾#Xœ- 8Sg7Ð àl\~1ØÃß/'SãŸå÷Ìõ.§ÛK6úG ì`¯@p©=—lÉèøOÿsꚺ8‚kíü÷ >’ÿ‹ÿ~ î@SÄ…Y©@ÐÇš Öûo¢„nL;?9z¸5n_]H9£m ·˜¡ºñ¬K9sox“³$”‡-…*õ  !Câ%£yܬùÄÚ˜á0ßcBI‡3×¾SäG>‡§¿`í!ˆÂKýr îÑ/}FVv«C%$>Š©Âö%¾×ÝÛwP‚%$)˯@PÚŸ¥ãÃy 8U’¶ñQá‡j—`ýšŠ$ÛÑ0ñ@#«‹Ôp|÷¶¢ Óhf¶W …Ëw:ä=¢s͹ ¡N ûhû£e›œH;d'caDÍÞcáÐÝ‚¸ Äç­¼2 :§b§©ù%s÷X\“÷&¸=™Eg⥿šUCF‡káµ¹Öã‡Å M•€še·¹ù…Ÿë¬îCöe½Ëz…Œ@/Rf½Ú'oI`=Ÿª€lKEoÄÅÚƒÂ&£jUÚ“˜­b‹‘ÒÕüÏv>ž—¼^)¶5·e 7¼”vqÁ…E9Q¤9 ²äBê›·ÙŽXF¢:êN™­ÌÙ=¡„½½ª©­Sgâc¤? &%”U6¶?óL]̃ǃr¢Òf„5?Hô;ºU ºœ¸…,"5t0_ìYo¨dÃyÆv±§²ùœˆê\o×DÔ)ª %±a”?Å\í›É°¡ÅìGY¸éB.(‹ª4 ‰¦ ir˜·¤W $RÜKñD¯ËP kˆ{†¢u5À\ê&¡ò™¾—gÓº&ÿWŒ wËFq¨&ŒŽ$¡m·_m?¾\ÔîÃç{Y»ï¯ÛHSZþž^쎟žIÉ”¿ÈI?<¡swÄì)JO0ƒ• å×ÿ8ïjª½û Œ©©3ÆL⪮׹{V½.£œw±F›­lA*¼øüusÅRVŠó¸¦NÆÁù(Uå#KQ¬‘ÿóÜ/w’ ’—_õ;žœ°Ïw| by0…Þ Á®{ЧýdcßN–€ç¡°”âÓ•á‰‘Üæ*ú2lúQŠ”že¸æa9^êIO/€FßßáCC-&•IÑó¨¡DJõ¡8¹«ˆ æM†Ç aÑírÍ2Vÿ.Üu=œ*†Š‡x¹ôŽ[ò9 nn©ºÞ)D+ºY¼ºi”y@Œ_(ÉOæ²ì<˜5í†ß¿:×pV¿ocw"m}Ú ”G+çK<<âd>)®8Ý7-í¢ä›ø¢ï¿"ÙÖe?¨ŒéØŠó%¿±ÕrŠûñãMV‡Ñ†ÁøõBOP}ŸpìEÙ#¨ôíÒUB¤hö´8㸾+›Ò`ã]C|!y$È”ÝÅ>`^ªòñ⇨XÐ)¾ à &Aì¸Xê%ä 8  d%žñ¯|:Q§²-˜z€èΨfõ¼ô?+˜°M‰˜èÒ³ª~BT/`®iúÎmX(¼íöùAºô@R!“'ªé*›ªîl¦_Ìf—9µk†¡‘³f”úíùk›k {çÌ;Äz¢% “á'-ãóYk¥°¦±ƒFù!E\oÉÔOI‡#ŸÒ2$ŸšÕ•‡?°ÏÒ§îN¡ç‰·ÚSa3)3~Á매©uuV}à@©bÄzÃk¨Þ¸m'RÍê6óäb'‰LrYã1a¿îÞ%ÃEÎTdb°èÑ%x@_`o°l3/½ˆá© d¢oû–Õ(¬:pYž…ÕÙX¼Ymú#ådÕgËÐŒJ¦dèS‡/1ê:Bc¾}wk‡ Ž`=¯ ü·g/9f7´'ßzÓáŸi*óÆñäjø5Â/»Ì ý…Ô›‚¯²SKg5 )AËáJ—Eìõðd ÔŸ"Ýü%¯†Çº*";±ke‹ónøüËÃY fë{/T vµë='<3s!ç•ÆñÒHûè³GÛ3³b®„ȓ֤%+Ù;öMø4ç%ýÉ6:•Ê`U/>ñ-ï'¼ml¡,ò½$sjyŸóIuí‰!…%ÄI°:|áPr£-]ã«ß0I^¢ùJx-TfÄÅ|¶p”÷gŽ©_£sOzŒ%0v?ƒ£ñP ðÔÈñ÷JÑ;`Ç„˜9êh ®Wa7ÐÎD>5Ÿa­ýh0"hšJ7»dÑ»;S-Bò~Ö=~n¿i¤Z6ž‘Œd¡ÉU^Ëe]µRÃ=æû×ÃFx„kÓË7f–Yœ›k}P¾­ƒ˜öñ—¶ ÔœÍÚçã–]·Äã>“ºÊZXü¸^³\÷ÎÖÚ’Í> .PãxèiЧ…kô3Kõž*×ÛÆš>ÝóB7²ãÝ£2s¿ôgÿÄMòþ¸‹n³GzQȽdO©““¹þ“.¥ž‘ß3©° 36ÒÚ›I/Ü·YÒ3ɪ¨HgÃtÑÇ>ãLY7ˆ¶¾¶-Û‡¨ Ò†œ£emÐ5Œ–óx„Ãî’Æ8¯‘z– õhLÊ :R𥒮W㶇Æ8ã0dáÞ“¡,:–l—)§›”¨²ße•u5e1 p’f/äF̬èa°…°à}¼+S¶CcÈß|œœWÑ6UpFJÍŽ· dçáàAÔ∇JcµØù±W|Œrn6%(iX–.Æž4õ“Û_·ÀáH¨c ‘¼Àp¥0¾S’Ó÷I¢_ëÞÉdŽ™kõ=iÀw©n: ¦5è»ñv–”FÝ Eú|¥cYõ·7‚o:_Þ†P3û›½˜Ü;7G !÷ÖË­2Äñ—âH/%@nó}ôQŽz§i’AÃ]¿V2‘”™¬ÙE`˜íéH"Ç‘¬‹Þ ¼yu‘‚múEÞ$i¶AdCoj4ùÍàGÌýT5Ò ÙrUzjž÷´ô€Ä÷2i’ÐÄ#‚H¬ä-Æ ¯ÞÎ,kËž§ÑNÒ®äòÈö¹´ö:n\¦ ^Æ«ô»f­<ëµ ­W¶¢nôm‰PH ÷=¬ü ˜ñ“¯ðƒ+’éwÀOÎ÷Ñ¢ø}‰Â—‰yIë¶°?\©¦» škVi”N_pTHÛŒ‰_Ç2ì{­Ou´<¦ÁMÒa櫘H2Ê Ã0‡p|²ÏdäÜV/ ©âÆŸìäÄŒHr4]ü¥æÍg+SXÂÑÍF}To0ÞvY„°sˆûsô‹÷u¶â¥aÏz“j.IÏ| ¾kXÙ„D[!|w¼À]¹jÌO¸¢nµÜ»X-ŽíW5bñp|^k+›áŽÐ9m€ÜIàà½ém !)K Z·Ô+ÅFèaç^iZMú)?{¥cúÅ|]ƤÏn¶q1µYì–¶Nljë¿Èô„¯§jøÒÀƒí>›}U³§×õ+{Ë63»<„'ãë.0Å”°¦ìudè—ßzžÌ¡<~ ‹2E!CuüñNý%wºÎæå§xɾxp'+};€Âµbø`'Ó©Ù[(8OË1±R«ªed§µƒ¿èòŒ&árA~´Eº¸€øŽv½Tò«9òÜš@•åZ²ð 0fÈe}ÇG5&¥I²YåøâÄ3g{Õº=ëÂ¥MXë€ö_¦öÌŸ#„ØEßÊñÒ§×¾às¸ UfèÃv;¤p#ÖÏœ÷Ŷ­z¥Ÿ%7È=êÒd{Ãl"ä2ö¤—“¨å¥‚ÇçÁ‚¨Ãw|­­Í5w˜QÚÃÄ–ŒÓãÁ­„åÔžp¼¾ðÃKßá|úg‚£8“nµk6ï>êE"¡Â-”«\ô½­ð•¨KzéZBIu}´£­‚J;Äà`[0›fÓyr!”žI&FQç+bBº5L¹ŸÌÅŠáå@Oók=ÑÌ\`“ÄüÄÚ”ÒûÁt ˜ùŸ0a'˜f|Mµ±ïzŒDœu7²Q";t¢ðkv_xRò ?7r´O°ŠEdÂÔâb*ow9 ø÷ø(Û;qe“÷8›RE>üê«W-®ŽÈ[8>@´øôM?¥Öc¶ØµreƒN=t ÛjñˆÂ‹ñ>T ¦ƒŒoaþ lyÖ›—8vãþYÆ›¯ûú£f.mƒpíJ:ýÙ:nÃUZr¾z¡Ø”ûˆ¶›ã;g ì!66¢©rꞟúׄé¸lkÚÃ@D{!¶^KÆó­óiEáçA¶§ zÑYJEÅb¿¶k¤OÏ{ªËös‹u°Æ¥µ3¶7<¬ŠøäP°ˆ›…­Æâ’r¶ï3ÂÛ¥zu£î!¿pƒf]yªÝ­ÑÓ½¢Ö-Çéª ZÄ ˜¾™HÓ—âëÖíq7fŽEþDâ]fþºÉùìó›63EÜÕÛͰ*ÛX ]æ5Ȳ^`2SÄùÂÔöÓËRTF°j8O@AúœJIÈæB–ØuJºþË·BaÑ5|ˆ]å­=V¸OÙÆ˜Ï ßPyÙ] i". ù²âµBr}tTÌ…¸ºØ2Vù^M‘>‡9û$³Ï®Fúq*¥~µÃåxÚd¬lnçj8QlΕ…™œ'k*=J\;$°û61y.¹3{‰}P#ÚvD(E ”ˆ½hJI\]vJ€_†¯’6n»TÔ™ ÚÙ¢Ô8r¥‚Cž³Iq®^« 7n\Æ*^ q’Ëù­ñ•AÑ•g”w,î{†‰¾mYC8;gÙy Ï—TáËA"7ÆCü˜eŒñÂÀA$M#g’Ldø(F&sKÀU:"ÒIÜð³xXÇw¸!v‡ËÈ(ãÆt7ú¨&¢bÓtÕJNHš6îÁ® ذ½_:ÓÂðJÑ·pã)KïõÜ{’ñ—ªþù~,‰sqvPsu7MÃF=YœÌm:„ƒ']³óí Ësµ7›-%<*•$T¾â¥FŸ,–ÇÑÅø«‘öó­sÌ„/Húd3Ú:•uôÓáçù®G‚|)àØDóNŸ ý4¾†åäÂ`ãªÊÉ—–¥ØDÛ·} ç§—´ž¯3³¶<¼ÈôöÒVzŽYKص3jðª™NVãݺ¢ÅÙD)òâÐ7„s¸õáò±ÑjV:‘"”CÚ¶T¤a¾ ‡gï»—»Ìy¬\m(·á8µ¤Š"tµB€(Ý.V±zÿ±@<´¦RYL,‡v~‚6‹{WxòîbE(Ÿ¯TŽ÷cßrì 2[ׇ¡p×~ÿMy#‘lðë²,PewT0‹Èí\Òo­’i¯ã-^8\»³O½;/Ý3õ17j(®‰p3¹a1¹öº(#t›Q•Lõõ¢æ6+‰õ41œ”Eêýû`1$Pû³ùŽ05BQòýƒ”€¼Á{ß 6eÒÇËÙ”¶T—ÖM€šF3cy"¬* "…¤ï–…ŠjI†ïUHm“(3Åaî}œ4¹ý*nvªm\Ýï£\)K1‰i¡×íßôìÅœ÷•š0bœö×X¹¬·Ú÷fíÃÄ!ƒÛÚnf_FñlfTˉ_õLYOJìTdŸçuiôg©Ôðµ}-ô±{þ‡ÁèÊV}  Á9â «(ˆt( üÉÔu=aùqäýäz„gX»O;i²”hElÞ°Ë5Ô]!Ù΢€Ûº6ëóŠ[²”<-“™Ê-;cVìôVž+?žµ„L©Íþò¡zÂu P–aCêÇa Oóeϱç§ÄÍ—G&sŠ'&«¡Ë(_e_ƒ¸ÌÇúù(j]ÂQ{¡Rô‚;­S´Ç®_ääùªà€KòÒDè‘lß2·¼¾9@´¾G0¼dˆaÞà-õ#{F„»4‡/ÀââB@õ*ìDxBšYA¹RÛFäM‡:cà¨UIàÅ·0©ö‚Š-S›½`EtêÔD@þU"~W¾x9 ­ø°$±Ë?h¬1p'µL¤¸XùdhË]™ôyTãñÌà4|°©ª5êsç‘GÒ"¿í¸eŒ dëv rh¼æçQ;ŽÀWU«Ö÷,.ÕÜÇÝAãZ2*!ÒV/¦F¥Ôž.Þßõ_eú =ä’MüÒÇÌ>nn®ùoºS&WêšmÍ]Ár|# …ä³¼˜jvcוpÙôqVåäRxzi馩ŽL*ªVCXÖÜmÀ²¦!ïÌð{ ¬+”âw6(-‰µºQãµæ«ëäå†òZǘéŸ[¾AyદKÁ­”`±­Í$pBñÇ8ë²çâˆ,<%ë"¸˜&+¤¢æÝ–ßÈͦÃÞo¢ÿ ¿¯:¡q±e©.ê¦/û ¦Ùó56ú¤®öJMV­È×'ÒqÞS*‹Ö¿]m‚¦2ŸŒ–O KJð¡w˜‚ÕˆÕYé]ÛS+G˜á¨ü'Å›ªß»ð’eÿ›êй7Ë\WÜ5·ùL˜ÇذÈ5Z2”µ í/ÇÐL‰ŸTïعcuĬõø%ålAÞ?'e6eàc‹Ág“Å\¿Q{OCOÓ ¹ßÜž9%€í ¾;„•qN,-x³?Md$è^g' .Q0Á´NÎø+9^Tɱ) Ž.ƒ¼Ü¯3æ|ÇdGKÚ’c*ădmOR)|j´­Ô>4kEÕØUÿÈÛë›’ŽSÏW­-¥O˜œ‡ƒïʾ·¿Œ’j' ªY`{д‚¢@kü™邌 ±N™skZþÃé÷lþ„Þä΋œR¹ÌåüNf¢° ˆ®åã~šÛ·—_IÒyHÇM‘ÆYù7vdÉ[bŒº_W1Ih©zà RÝK¼De„”¶m,«Ú•ÚãV³»ü ­)|ÓÁoTsa(Vgq#Å*°˜8¡&¿¨áùŒ!¤úµÖ²iËÐ''æóãþèöó/ÚºªüâS ;­k8,fôr”¶ËëS6ÔÜ_hÒQÓ¢|Öº%Ý3›^X#0Ý2ZÃy¶Õäû,Ÿ Ä0ßò‚:Wcla„P·RIZå!м#F­ N.0¯²õëÉv4QlnÀ›£¬À0Z1¨£C/æ¹QÑ®ÀGGÁoíT&‘Ž|ã©¶ZÑÉÏGÙUÈÏèÇKíú•æ„Þöþ¤§ºv‰ÛÃW“3ÓÖŠBðoûƒmŠáÊÈ3dr)é2¢H«õçR‚ùá;×Oþ¨“0E ެ 3¸t.Úât­ó»íó£Ñ|aÔ·x8,­Zj…ŸCN©O^Œ¥‘}r!&´¬š¯O4ûûÆ$ø”.ch6œ¸…,h=V‰’VÇt×ôÀîeß›†Ëް1|ßâ! M.š/;ÔIÿ]‘Vô¨·Ïp‘`s™6© ÙôÓ¥b¤På‹ûð‰æËʇ¨zÏ*¶‡ç)>TŠªHBñk§ ½t¸\¾;~Ž=— úqŸH¶\&YW5ì“>þŸóÔöC3\£á÷–KÅo-ÎB×" 5A²r¸ü|¨äŒ¥AíÖA½ìíG À*º…9©¹mÙk˜XBšØµJYÙCö’:ìîV7æ7·– þE‡ÌÈ/}9ô¥HO~m8ΖJ©Ìñ'ýÛORèš»ÖßÎ‚Ï Ï¼•<¥%…ñ1†}ñ‚Ñ©ùIBíT×µ%ù–m{«;gØÅÐ~G íT8Ú½°aìñøþ9T¿:™:Е9jcEvê,~˜Ay‹Œ±ÓÜzó­HÄd\¾c&”µÿ©#@:ž?ýE…ƒ|Á%•n¤uÈ÷]–=#ùvx–=ŽN_QÚÃ͆äÒ£ï¶öÏòs¼®ÏÞ™ˆ±'×ê‹ëѳõ¦í™ß¦ˆ¦g=[¨}‡¨®$ÔPã¡5©<ì—ôKà-Œ¨”$ÒÛâ¿éåp(ÊÍqr‘@[,ÐmÄl )~¢C ^R¥ŠP3cW9ŽÔð‚VžWLVfø0–9ʺ„XìîcW3'м\‘Ø(¤µ#p„±ÀøŠR÷Ó‰ëÀ O˜›H*{*ºRBK¹òC«|åŽCDZØâ(l ·œëÌñÛ|ŒrÙt²i#P€-üÈÂtµ‰< §žõÌ3ΰ ’NýxÛäTµÜœœÔ^ªrX;¬Ö‘BŸ^°£E°`²“²Ùü¸²ÅMHGºL‡5¨'·“…ÚèŠ÷jähwÄou`òêÒ¯²+3ò,†Ÿ)ÎsCÉkËNT3–kœ†Ü´A7ÒzªÅj¼Ð—›¹·ÏÄk°’xñæecCÌòRØFRk¿ç§¹Åù,׬l~‹Š¶¥¢Uq¥‘ñ‡-HãŽáÊ'å{}K˜6W¯s›2ÂAR­·EäZͯ0‡pÜ%f©›zÔ=\¹þXQ×0t š£íx¨Ä9(aBýÁ©°Øt¸Ð§ÀЛ“Þ~š…/òÒ+ò¶Od‰±ò¬’à„ÛdÂÆF&Þ(ͧÐâ¹r(ºÏ.0Ÿ«Ö¥ó&:Áv˜8\^4ë@Bù}ð£^ß#½VÒúÇK‹ìÍ{rÞRhÖVB¶YO2n ­EV Çw™Êtóï(¾#¿µ¥²p9FjBå¹GQ}#,Ü1h¬`q.—b‹Mj •­ãòî¡wL by·t«N¹Êov¨:9¡šª’‚˜Ì¥±è©ýþ‡£ú¿xvŠá»F‰{õQC¡¿žÕB/ÖNÓ–p%ö–ôH4Fæ ¹nuy5Â;.Œ‚`õL¢ž,Ü|”‘ùóÉ8u­‰Qdz ës>SUX(í9ä 0Óf¢l€Ñse%iê5Û©¢^0)l¬‘É÷¬Æ¾Ø>ažפ"«QÏž©Á Hs–eßÞôè|\W,½OÝ9âˆO”<—ó —àç¹afŒ¨2K^ï¿zÖöŠ—ÀÀ¼…6JዎFWžM‰CƒÒ¦ZÏçEïK(1ß-‘Åp.ÓG ?WõÅûðfçéóÍ„£Eº¡ÿw®Hµö}ÃëAE¢\ÿoÝ3ñp†A1ÝÅ,I8ï¶4ܶ`“ › nÏ\hÎSÑ‘Þõ M‹kòœ¤e·ÉsºW“}󽟩Å‘¾3(… KtAÐ#@ë%ä©#­ÑOÒ!ê./âÀ¿-k²—6Ë^ñJcYë¬ì»m?‘:ÎøöõÛª),ó˜/9°8Wœ-HTïe™Z½ù=Þ<¶½¹}ƒBÞÇ]œ°OÁy*HîËòÏ?˜˜¾Cæ0¾ÚÇÜG¾›~òŒzƒ#ƒ–U*ÀáUé![3‡¨:XvWš)”aYRnx[ÕzXúØ…Ö–ì…åVùmg0în¨œ:A´sÑb§½s+^¨Ôq€¿äþ©øVt­2aÙVèÁ%=}ØšÛ⥔ПŸŽm1±x,èU%B¿”)‰;æóÿf‘.Ët˜¢ç!°ÅS\É\öÓè- ½òB#žˆ3Ž0Ô(i»ê{Ƙdßyûj‹ïc.\%êÛ¯8L¯öœ¦âG£;¾×ìc¸çag!wmïéd¶<üÝŒ ™ßf¡Ö|¯n˜1ë! Dåþ†0Ëèt¿&]ÍZÅÈÖv¥¹v]z³Ù*N¾„Ýð|OøëìÓ/ꀀ‚9a¸¸þ6ÁI'ÚçµO Ûõfó½’®vÏŽ°¤ [§Wû‚(ŸK#‰eOÒG¥{…rdNjh„ÐÒücn/L §ÈøÂ혰tñ“$ŒÍIaÞ Ì™L*í:ÈÏ !ž.ð{ûä¯ô—0ÿ˜…a¯²r™+©¼ÜnÝ8²8·^!@ñ êð¶ÏO<f(ž€™Ô‹µ3º)ÁžïÔI›L…dŽ 9—dŸ7M¶ ¸ö]¿Ÿñ[p™™‰à+ë$¶šR»©•Ò ,÷LeG„Dô†¾“^ÊÖPØçÕ;>ó-8ÉGæúàw¹W_2Ø/’;ÆžC¿OëÜ@#«uJÛ—×¢b/ê•ÙkÉ`ßb-çáHI>”ÀÙÂ3”çí&@–`'/L’'újáÙïOTÑÚ,Š‚µâ6SЙíd}úq¯M°S,äÇw‡jÝj %êN™±\8O,Ý$—xE})üjÁmb_}sÝdì.Æ<¶$’OEU =ØNÃBB ·PœãfªÌ>oÍ`÷n½à›Ä¢ÓnXõéTHŠ˜£[½·d7e‡ù3›Dȳ־=ŠøCÑg©­VT:ãzç9ü-ŽM³óäg„9)@€EõË€ 'u¤Âôü<«[¦• €*Ý©Ã0Ù/&f¸,qѯqïûã'ؤúÜæ£U7•  P¯I_, –°ÂJô/Çú«Ø¥ªÛŒ•½fwx62’ü³ì>ÏÃÄ1tHGzÚx8G [¤ƒ"âGѽ¡éF”fÕþ¡ö¹y©ˆç/.ì½Ú-_Ió~RI >³~<ݘ TµÅ,Œ¹¼.–SœkÜ´Ï„†®Žé-¢Þ¼Ui®Må#d w´¢ºþšÍÿ׸Dk{©+ÿ<+Y6o²£w£³M¿s™ocJã.8"Û ýõ}:Ì9•M,l](ýñ!ÏY÷Þbý§CăùwÏ<%i£oÆuŽ+YŠßjŠÜ0 37mR•!g±•þ€-?X) ¡DV{«NËô‘æ‘Ë]Ûªê{R‹3úXl!ŒePLW*×ÃÖp±Zl7ýˆuï/E³é=“Š’š²êûƒ nœ¯ÍXûÞAdb¥¦º2ǾIo]z+6äƒ Q|€Åø mê .þCà.å ?õÈ$a±÷EÇð‘ ŒhjVÄU#/¾c^>Öã‚Y€„±|§ÈìTÿAË·Ñ–ù h»D ¿–ûœ#ºL¨" .$—Ùµaë÷Ž6 ´û'“fwÃÓØ…ªT±܃ɧ4°'ÐK¸Ö Åè &åN‘Ï@®ÆH¢¡N¤sHo„ñ’m)pwd‹3l™†5Y‡ÇX×o¯ÌåÓ¦B{°…ºpØPØYe:“ /òxÅú\ðš)«3ecôòš>W½ëJ[8 #%•Ißêñ޲ÓJñ‹‘5Þ¹LÇÛO*´½[}M|j·Ù ä?,Ï¥[ mVþI*MþeVOƒªxJ£îKÑUrŒÏœy–óF“Þ˜v\}‘`JõµO Uàëø÷<Ø]“aGàûò/â¸åc0ÜÄë kXp Eþ5éo%M_~XˆÍæ³ZF5ßöP`™lø©ä­0#cu*ØÖ×$lž7|Ð1$±ë 2©®æøž)! ;þ<Öe£ŒáÉÀêqkØXu$BªÇ’i¥IB–5KW”ÐTù•N8×ÌñZ†ø¤\Iûˆ–€uò8Ú}ebкK1!±²ÇžØ ’T2’,Ö€þ%êä°™›LÞé}| 3l±öõÚÒü}ñ—SnkbD<ª8Ö{u&%&þuhÒ()ÁÍu ÙË ãéÖð‚_`àAÇeNMÕ:“÷Ý|÷9ŒgIŽßãºæí•­‹|_¾ÒžÂOŠÍY‹§‹<Ó´ B¶’åDÈÎ…`{4Òn—µâËù>Ž÷sÚ»#Rî‡õP¡Jï´ï€BTþ@bÔ\`È:ÙêPÛž j—å°Yj`Šˆ d\,¯Põ öèÖ7ІûûÛ.æ/¡¤rºUÏ ÆSÍCÎËE:¯%÷ÃÇøßáFZp)7ƦêIË|é žw(cQº/iÚPý›u¨).6Ï}Pe4# ìa“à‘çD¬¤…b§ñܨ æyL‚Wˆ!¹œAf"P·ÁBv.6H;)߉ã Ò·Š‰.»’ƒ=³PÈ’Ht±\ÐàÃ'Òve‹½ˆÍí½<o Ó†œè¯òP°4mU»PU?Kà)%Ó`øàudHò¶¦eß/u mEµ ôMK©üð#ƒo๠/+£À+}ľ}Îõ™Dယíkž*ÉŒ4¯7¦,\•BÕ-0œè¬RvË-9i’»,Aè<-Vx¹•SÞ!aþlìWjó>…Ù”%Éê†%QGçMÊt¯ú'ÿRWŠŸo§*PEóû>ò8•_u2®ìšâ‰ö™XdÇB„÷7¦ô…9¥`‡„}«—FŠVq¥Peö#Ãïîý˜÷‹Fè-K< 7VN•VÉ»ÏÜÈÞF_£Ö^Æ«:\¹¥1"¯Ïœ …I?hÀëRòG¾7çI/¶¨ÐÂXòὯ\g§mèÂé,XCð?ß0@:m”±Û`ä°Ú‰í¥h^ôΑJ|bRAÂ&N]K®Vøª1¿C¬Ç÷†4<ˆÛ÷ã2Ͳ¾ d$~Âѯ¯ß0° ¶¹lNpË„Ú*´3Ÿ âhwßÙh YAX¨BwÌòÂJêJ>[߉˜òЛPÅÉå…¸’î:6½:|z›ôÈsï1VÉ+Ÿ(’êcQJôUrš„Ö܉®D†(LÙÚ)-V%h#ÍÙèf…­ë¨›…vå-¶Ê¬{¡)ÄŽ>S×9.Î,Â;FžûíýÚ¹1\V`õúRåJp‹‘|c)ˆrAîÓÂ?‡í§ Ä!‡º¹‹÷¸æebVƒß|P¦m5šµì ¨ÚŒ4]@½ÂÌ`ÝrÕn³Ä¦´B:'ÄÁ••,Ÿ¹â,ŠœÜÿb!àBÃGt¾ü–µC—þcÙ …›¨x;Y¾*Þ2bo\d.÷õýâ°„oÝksy°»Œ{Eb³ÕÙ-÷¡Þ#}õW„žYsŠKDÿ’ã–~÷d°ØÊÞ1°±f¥îŸø¬Åg»ö*ц·Fæhhª@ a1VÃõv‹×fÞõ( jѤÍ7Ñ6MªK9Û •¿V>²RƒZáĵ-´v¨ÔТ]nÆ¥Éñ%£Ï+‰lºˆÝ+²*¤}àEAd,õçbüKJê®7òŠår¶zª A¼Íþ·"u„yºŒηbï‘6ãÛ¶?½Ëˆ§>_dà‘}—Iwó¥B¦è@þ6zPßâM-ê<ï1FkSÓTáㄼ-ÒÝ‹áY€‡ˆ*c¿!d( ç]‹HÏ5otûµJmɵZUQ8ÿEtÉÈ=Ý-ž?.Â×]4”éÈ0Šy^Ù~{R¸š¶ªÛ1~î_<­>A‡Å(ÚȽ‰œxÐwŠŒÎL®9#¯¨— ÿÚ•íãýIØÃ=†2wÐå繈º›ÓÒC<äÞÿÙŠdFóû*þf¾ÌÖu%ÒL:³,,à"¬a,™«”²R~¯ÿ®´’|ŽC.ª™kðj2â­¼ÚÐk·Îy»wL寗 ©‡µžrPÁJ«Ä.щ™ŸÍìªûÇÔêÍÖÓͯùáÚ–wv0Þ:zèSnÎïûÑ¡õÈÿºA¼c:(+·£ëëÓ.”*Öõ5'öšKøÈ@í'vÐÏ/K^ï!]¸Ù¦T²¾ª|5M¢ì!‚7€˜ùDЭÀ6‰Ã8üÁ-ù—\`wQÊkô ÝYn/˜Z= bÝP:ß_MùÎã]¾•Ë!2t¥¡w Êyà5î$}'*ÝÐË“Ÿ`Äú¦û‚ó¶ûÖðe¾3±‡ÖQû{Âuî 5Õš6›‰·ŒÔ‰-Hü|èI‹·²RqXvݬ˜ºŠš½oÉòä’ÃÁä9²à M¯gÁÁNßп 0:^þØïÁñ­'ôs* ¦‘œÀ„ _° Xä)à,êœóŽGXÐx5f›žC+hÿЊխqCÉæç>ïÞm75lüÉ%˜“7M?ìÂ-ô‡¼•å³>ïÙ’ÀRÓaðApÝ1"ÁNÊ*™Š’å}âkôÛTÓ%;{ɹç2ÓèšÀ@ î¦ZÀ.ãÃK2Þ·ì/¶„îu?cZ7(¿KM}3ê5*šâ¼ó}V U[Þ=—ÁLýÌ«Œkíu¹…}Ö12¹(¬æšÌ~Ì5”yn¬"S"X Ñ*eQìyt=…ls}v ‹|õñ;Á ¾ Ñ…~$1û¡—r’Œ~Ù|qᨷdÄíàñ“¥µáBDraîiWvhC¼~$–—&þ[VˆGú#OꪖE•Þ:Éj:¡7-^GEª ”L3åYë5ΆGí39p•Ū=H1ôÞ»a]A\y{¯"G£}5‚_Å»^f>já.F&š_R¹¡g" ’'ualòPa¦áë‹TÇ'›ÓFËåDWxPŽxr>¿)%5ô`M á*÷ÇI|`–»côpÏÉ6c“Ÿã0Íb !ùÙ`~è¾°eE±6‘–üŽX屩f)|¨å=7ßåè>¡.šb¨áéïݘRáçþ zåù›öØu±íF¤|.²5JlB-tFG.ú°Ã`‰õ¡su!‚ÃáÖaJ2T–Gñühq>ÂÐYVqY–µÂŽÔ­a­®i8a+fd÷¬ =÷ú¦Ö5îD¨œó÷šÑ¯D¨²9‡˜œŸyö)Y _%åjXup «N†I嬾 t± Lö!Sq1ÆÉlZÇ5\AëÜ3”W-…-qÑBVWp“ߣ© IŠ:¡ÛïlñÒ$ŒG·´Ú½Òu{òiSÀ}H4D"G=­ :§®öÏž`¶G<ßY=³acÊ-X\çžÈݯ ð°7d:ü,ŸR”ª ?MÒ4r‘Qé³eõNXrMØp äp ÚD D±>;¤,˜R,P…Û½ÉùD"¦pïjìaŠø,²`—ÀwœÏF™])žÍv=¹¬Š\eã![sê,}‡O]Å铤fÖê«•¥?‡gZ©KéÁD)×3¶8â>;žR i¸“¹f7wp['tÚ+f Ròk–4’ ox³#\ë¶K¥lyªp.[Ù igÁÙ¹k*Íî[¦‘¾²ã\€ú÷K°Š˜æ “qj|-à cF=>GíŒNM”yªR<ï÷ÞCÇQ‹po<¿1C¹* +Ç™@þ¸orѾ_¹Š.Â¥ò~š…ˆNo¨žþr͵^§?üóTˆMí©Œµ{¨ªˆj‹ŽÒ¹ŒÁB ?÷ê†úhXÏßrv 8jò¡Á¸Z–ÊŠîN•mø¦)¯A0z‰ÎÌQMÞ}kŠñ«§j_èbk|R{äÃØœ›à3ëôˆoÉ=ϼ¨äÒŒ½ê;³4—oª¥SÅ3ƒ\àIõÇÝ9¤&~±B©„m/ ÕØrUák°µŸA´\½Z™ñXð¦ë+Ì;kò,|v­ j}‚Ì›ORü} vò ÔF3UTtíH].Ûcís#GÊï(Å»‡ÕŠ|‡â_S…ƒºÊ´—åÄI=6¬ŽdÚm“Z“+w/Ú)ˆXzäÐëh§È(Ÿ(Ø£™·²9W×of â˯›>½>ì¾{vm9ÊLP°&bü®LE_Ð`æ7ÔY†“‘ð† Fñ¼³-Q´ëCñkcLŒÑùÖYÍì/oW[BV”WwÑ9æäO©õîÑ6Ä;Ã%ÊwŒ„0ðxµÉœÀKƒÂaºh¡çŽ{•¬/*ç‘Dä×aY—¨1ØšË>ZΧz´ƒÃÅ)ç@Eù¨%GòÐewR¹»H•v’;·‡Ãp|ÇÁ¥Ïé±IÇëaì?§»ÞÇ÷’mFЙtÛa=©¥ðeæmð|¢t Ä/¾“´–­¿~·CHþÌA—e¼:úQ6­c«aNãœZÒˆÊ[î=Åæ¹£æXj! Óú]îmÈþ§wµ$¡²­Ü¬šZÜ,Ía!¥¯4qíØ(}C|?¶uNC'©ù*Ÿ“‰ YøëýzÜ q•X´-úÃñäØZ_ŸJûJºw¤"!P®¦.ñè9ÝVÇ"Æö\ß‘2<]Æ ”6ò¢UÇäF_Ä9Éı\åš¿gEM`%=_ÚCä\VH•<7*‡Ï„è0Æ%±•Ž×!@0éhÚUíeZÝz˜ë}ú¤EoüØo´]êŽÜrûl«ca˜™›#º$Ápª4Õ "äštÊÏú.fì#úÖa‹ çƒ}PXÒ~vcå]ýk¤Þ§²žÖ,}¡ô‡S$^ù~€™ˆ[BŠÔq8ø_­­}Eî›k²É ç_«YÞŸ³>¸°Ûd®÷Œ…ŠÜtu ªñ×ðŒEK™¾^YøÌ½7nxLöQ¼1—ñ~)¯•{Tc—êÙD¾@à¢|`PöqÊ(¼ Öÿ˜c!}…ó££ß<çìó8_Z£°2,îDÿ¹D"n.1zÙ>¬‘¦­úII´ÐY¸ð†@å]¡/q&ìp^ÜFc³y¾.ƒ‚61‹Wg> þ¬þÆ]í|ÿÉ£Ï_ª9†©YϳºîPW2n±Ø¢ œ@¡µ?XœQkæ1¶V$.ƒ³®\iÿOÈ 7õ…!ú†Í%ò"ëTm¿»´ X‡ÂäHæRÉÚ{5l3?¹DÒ¯JtWÿp3Ûk°zß ß#ÊgBö+-¹üü£³ƒê·éÍátÚ0Ü®€òeC3`Î!OiU‹Æ,Äåú~ª12õõø/8.ôø¨ÝvÍo'àäcÂì]e6߆¸¸&Àa²U6(Nš®‡:¡WŸûKüs¢ ×¹1Q³ Ú84… î}ĽŽZ'ßJQ°÷õ+á8)ãG™ “Í‚ô °hÆA(pB\1‘ô€°%œlmïCÍôe^À ‰§4£¯oE‡<£‡OÉ×X ”B1%ËÀË’(SË TFîWïY$t*0x™ù€h0•ESïOWÕ\l¿só ,νpXøÜ`—ù®ÃC{¿°Q£’óâþ­]è®3ò±žQ¦Í…æa· iìA!îðñåØN¡P¢Cò‹*ùãÕê^iñ¾q4MØé(©ƒêðó&£öºp3+H]ZÆÒ>7íB¦óB€w‹Oá\ BvKP‚ÞÆå`Í@îáÛ_üzDÖ·¸þŠ1‚ e©bC‹ R×ÈN¹ X•£‡¿ðiL¥JÓ8 ‚>!åxDvx4t…øp£YÖf°)ÎïM{Õë‰&›,i{4cÔ¼9 I×/h_|AêïÔ…Û'¡Ç Sÿ¥;Å®/tÞUëìN$°)‡RXÁc!‰ª™RàH?_›(ýƒÁd[®f±y©2^Y 2 7«~ç<Ø?PÝáßøº°5[ñP‰Y¿äq"!YûâáYM(q #3=QºWÚÊ“dÒ=z·ü/4 ²×%7e¬EqMæŠæ:+U‡ºø Tñ‰àBÚ÷À ï­ÈÃKü½ò9„NA*Çx+7nYä“?±iÍi™}¯Á\Š|,M¿‡ SÝšíPh­÷‡Xîà`mÎóE,ø _¤µ)ÀÌØ¹9¤Óa¾¡õ×9¥²AFbBT‚yÚÞ‹•„íùbEëW>XAaÿbP¿f†7Ì¿Bi)o<˜ÄcPžÎ>!uÂÞ9V‰9ð(ã÷âe-Ì;=rÃͨò•\¦ÉgËçç–íß0ê4m»»wË\+LQ²~ T¸9e6ªNE6fº³6SS®ï*ªö…˜ðµyùbžÄZG·9„rÿ%ò zȇUdf#tøÞco|t9)ƒóõ8‚}ªéjù’áR#¢x2Çôõ:;Ðæ´ðñˆ‚J8;ŒUeSСïl™Ã³rª_’ êL)ïÜË<^~¶c û1t'û’ÅUy0tçEVÓ»º·ÁT'B ä’ºæaÄrežõ–úâK^©lFaÒ7(`îvcbŸMŒå7!axqàíà[îŠn_öšâ·žEÓ¢8/æ;{,ž»›ºi®.%ŽfU5bíŸtÄZmüN×}‡˜R`ÒZv¾òà–:hú5lÈò†Ýð6ÃuàásJ b¸¸ˆ€Øïbb'o•pp“3>Ù@u _™ï:vSx˜ ]FÉ ô(Vm•ì6K”Yb/œÁ0øãæ_ao¢V  ÿµ`ƹlÌZo–˜nÄÂ"Ffƒô´âYAþ¼¾K«Xš Ì%Ò;¶€ðI*xü(÷ÐÃÌó¼Zבj“ÉXíÎfá ³¾ÿ+Θƒ¤åfÉç·K}‘ZcœW¸¤¢r–n»îT¥¨9ìêX2Ù¬øÇ^Ût8BO‘´=g"Ç ØHº––à§£õ1oà¦Ô$oŠ–ÑnûV–¶Ï|9‡ƒh¿A‹jT¬Û”še3‡ ‚Ò[+å á—u9Zû¹FùÕøO\ǬäPó\´G­Æî倃¯a¨} W`ô 0&§ÑáVxe®' 2/ŸZœy ½WIáË òZ(Ãz‰ ß‚rQ‡s .Íe±á! œŠÀÜ/Z¼0œÐª)UŠ Šg.hòK‰ÜÎñ=®T‰žäT‰' ðD çÌaL9kô’ÞÅËÂý$}Žî±èÈÇtj¬|¶t=Cj–±`m®V?Kœ‹ÑU|c™ˆäÐSÒ¨¤üÔw7gÀ¼)ŠqS弨Ó18òÃX½ÇmÔ Ô|»‘/:éa¾ž…c±µ®¦fµ;ËÞï›Y–ƒÑæ,T¯GCTvÚÕ öù¸ã¸·B‹Vj»z ¢bWbš«[Ú'A.hYË3GáR„ƒúJƒ—ºIP†Â8©¥-Ï ý4® Š"ýC§†”A€±+JÛþP2»jãÛ3¯&óH"º÷Äдº·þBo®²1ΠY˜N¡#2ù$oH·1a"ðÊL¯Ð"Ë gܸ T¯Y¡ô¤‡Ýέ™ýß·¹üþˆœç% %rÃ(\à¸CÂq+”SpÞ)«^˜¤´_‚»JÑàcb5>ƒž?Y¡®V·Öb„Z„ê>¡|¨÷@Ü7´žˆšEÕX8ϯ.W"/E!@´ ,lÐrT‡æ§Ù¶N º8 Ï£‚L‘s‚j¿Æºßà0®Úh),PS–üa›ñ;6ý¹?;­™" ³Ú²Ü\8@[^TæÈðÇ-¶~yiÌÝi ­¹Çm.žA@pÍYvº‚ÒîÞÔLo¶;‡Ô¬÷¶sn^¿ò#¿XÕçkÜäèð|*Àá¿Õ ³Ìòƒ³ÊŒÄOÕn¶Û”^ôÊTû€!k_ +|Œ†¡tØá}ˆåëNü c©½iš2ù:º,ˆReÿ¿ô™æL‚"C OypBj¤Òg¢áRtÏtP´ÜŠÿ#‡ö4Ž_Õ¥p­(1…CÜÍmA3øgI`?õCÊ®$ar/œÉH"J˜¿»à~ð€eühßÓGR)ïâAL^‰WÁ'š7A%$âFŠ‹ ì£ÇLÄoõòmH7[¢ZÛì±ý‹’éþ>×ê_ endstream endobj 274 0 obj << /Type /FontDescriptor /FontName /DPTOCF+CMSLTT10 /Flags 4 /FontBBox [-20 -233 617 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle -9 /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/Z/a/ampersand/asciitilde/asterisk/b/braceleft/braceright/bracketleft/bracketright/c/colon/comma/d/dollar/e/eight/equal/f/five/four/g/greater/h/hyphen/i/j/k/l/less/m/n/nine/numbersign/o/one/p/parenleft/parenright/percent/period/plus/q/quotedbl/r/s/seven/six/t/three/two/u/underscore/v/w/x/y/z/zero) /FontFile 273 0 R >> endobj 275 0 obj << /Length1 1974 /Length2 15218 /Length3 0 /Length 16421 /Filter /FlateDecode >> stream xÚõPËòÆ ãî·…»»»»KpX¸³p  ¸»[pw·ÜÝIÐ`Áõ²åœ½Ïÿûªî-ªàýõôt?=Ó=P’ª¨3Šš;š¥@Œ¬L,|qE YV ; %¥†5Èø;¥ÐÅÕÚÑï_â.@лMÂôî¨èès³°²X¹øX¹ùXXl,,¼ÿqttáH˜¸[›™rŽ@WJqG'/kK+Ð{žÿ|hÌh¬¼¼Ü nˆÚ]¬ÍLŠ& + ý{F3;€º£™5äõ?!h¬@ '>ff&{W&GK!Z€‡5È  tº¸Í” P2±þ]%@ÃÊÚõ¯uG ‡‰ ðn°³6:¸¾oqs0ºÞ³ÔeÊN@‡¿œþr`ü}8V&Öÿ†û{÷¬þÜlbfæhïdâàeí` °°¶”¥˜@ž €‰ƒùŽ&v®ŽïûMÜM¬íLLßþ”nU˜¼Wøw}®f.ÖN W&Wk»?jdþ#Ìû1K:˜‹;ÚÛ@®è“°vš½Ÿ»óß—këàèáàó²°v0·ø£ s7'fMkg7 ¬Äß>ï&„l–@€“………‡t=ͬ˜ÿH áåüs‘õó{ ~>NŽN‹÷2€~ÖÀ÷?>®&î@ÈÅ èçóï…ÿ%VV€¹µ` ´´v@ø'ú»hñ¿ß¿‹µ'à#Ë{û±Xþøùï—Á{‡™;:Øyýãþç3«Kˆ)(ˆÒÿ]òÅÄ=>ŒìœF6N++€ûýÃïãü÷þSýŸVë¿Õý+¢¬ƒ…#€÷¯"ÞOï?…¸ÿÝ4 -à3(9¾÷3@óOûë³p²˜½ÿbýÿ<nùÿ×ûDùmÿÿ«HÊÍÎîÏuš¿þÖMì­í¼þöxïg7Ðûl(:¾OˆÃÿuÕþ5Њ@sk7ûÿ»* 2yŸQË÷>gdå`báøËní*eí 4W±™YýÕKÿ¹Œ÷vÖ@GWë?Þ÷],,ÿgí}ôÌlßß×÷+ûs ø>Yÿ›WÒÁÌÑüdã䘸¸˜x!¼wÀ;q|XßgÕèùg‹˜™Aï[ï5ú,]þ¸X.N³è¦¿ˆ À,öq˜Åÿ!³Ä‰›À,ý±˜eÿ¡÷( ÿÐ{ňÀ¬ü_âa0«üClfµè=¦ú?Ä`Öø‡ÞUkþCïù´þK¼ïùLþ¡wÕ¦ÿÐ{v³ÿÒçÍlþ/|¯ ø/|—cñ¾/Zü YÞåYþ ßõYý9ÞõYy9Y½?­ÿx¼Û¬ÿ…ï¢mþ…ïªmÿ…ï²íþ…ïºíÿ%å]÷¿"ÿ!Íñ_ø®Ûé)ïyœÞÇÍñ_…²¾‹uù¾+sý¾ïý ß•¹ý ߥxüƒlï¹½þÄÿiK37—÷—ûÏ÷ã½gÿÃþ›=f+‹Žfü!6õ!÷µ¢Œ?&Ù8‡¯"¯á´÷%ñÜTƒÄ~³F-‹öÎÿŒzØÆ8a+{k±ÕÁf±5ÜòMâÃ^iì„¶0ÝcðÆ|¼PÍ[ûEùPší‹ ÅäÑ‚Ž;>ö×è¨×‡jx+WM~üb¦!n‘YNXÅtï™aÄÔä›’dá@œÁ'¢ C„«ªê’'Y¶pvïU÷ƒ¨Jó=ªÚÍÅ©’— WqgoúàPÜ-RÕ“ÌLàKâê–¿’UU$%˹ñj¸DÕmúðç³ËU$þxæË[¦¼²,E°v0$=óZköó~­¨ôŸdô4œ (¾LIjwg1ÆËÒ+°<§– y]©šG¸q)áè—š¯)_rQá¼ 娥D)ODâlóbfI¶Ïš3BTäXþüÄ6v;R" ÿA¹•è0¥MüÓM{‹jvÓ¼P¾ÈB»¶Taú`Ý}ÌÎFrazuTž­…Ñ4£î¨|S^Ý„|H•dürdµ­ã*-JÖ°Gy€?<‘J6cuÖ!ðÖ£ÅÍQmEž—LN«15™B‚R'¶ÌžoWS{a/XóS4ó3î¿J‰/zù”.]^£Ïl5ãàb°èÙÀKžmcã?=Dñ»?ˆˆ<Òsk^>­µcPÝ\^¨[&tAWú%c2bÌʘϒ@Õ2£èÀ¤´ò—¬¼\‚î’bäkgÆ®——~> ŒW¬HÍÇ‹,.[UÔãšùr¦Ä:Ÿa1µ=£¬™‹‹“/FX=Í…œ­å <=†þ·Á¯î¡ïîØ•aõ_¶N–û^µ 4QpxüÇ'÷w¢?Ö®î9ÂÉ 9ø‰~c÷´ñÛ,ïÉ¿Òß/·9f“F|-¥õJ`2À„›9Î}›7´T²Óâ»<‘A\¤)úðH2cCÁ÷)¾†3*4{oî²Þ«›ïÝÏž4!oHFBó´ñÕ+¡\økÍÚ£kX˜«D.¨šƒ˜“Vžðþ~þÙÙ¬¸ T«8­åÄosdPemL–úUMÒj½}ò‰˜°#ÜÔé¬ÐϺ£ç‹³ uQ‚P$Ûã JJ\ýª¨ò”]b[ ¦ˆ<ñécÁX†k/‰cð Tæª4K^«\7^j[5‚-OtyH¡aÉ.ç÷x¯5þT˜ô%—¬õðû™5ÔU|TÍRÍNåôÛ=”C•ÏmD>Í£ëšÞA|Þß½çvä–ÓÄ—jÒÀ€ìD¢‹§‹ËsÖ¥pýQßw15Uƒíc>Ö‹ÜßïT"èð]F‚æ)~_P¨7àhÆ>"|Å;_‰óù3<~Êìo†1 6f²_`¨~[”ærå“PÒªQ~7ÝàY±)Ï æ‚M ±?ÇÊlr†“Te'AžpM‘o™“øTuÕ¤_$¨ÆŽ3Šõh.Dª»6sÂÛ¡øYµf2™YkÁ¼a§n£ŸþUì`«æA*Xöò¶…4ðzZZ×e ˆb1ÿ'à<÷·Â~ïÐý‡.žD+¾"kø,‰f„á<¶„L÷gv¿júQ}í|ÑÑã‘ʘ+î×3ø©ÓiØT àwîæêæïìôÅŸ—·ù “w¾dQû2ιy…b-r‚÷Æ$J“H€èO’Sõì«©(Å%„É÷ƒ,œÉ$íåîUB±t¤ædðg§fz6ˆqÿíó©—QZ~9þ¶Œ™ÏÛrlMdz^L¬p{`ÔÀ‚/Ô,`úeÇŠ] >ÂØO–½[ÃÇRôöAÇ.Iì‹Øõåt@ y75H’<èE´“ ±²â!±yðP1ã*öhÙƒV@»ýמU¦¼ß[7”ÔÊ]B:à(Yäñ·ÏG˜ö:cNMy5 ÒÅ}"T°Ü~ñ"BQ’!tg²bL .·£_Ék¢Ë®y·•å®ì[<ìÔ»`ƒõP—§KY{HS±}7-Æ“ЉE½™–™¼ëtŸŸ ºBÒIå»Â%š§Ú!¸wk²_:ç·õÇm·õL‰Ù.Úìel"Xýœ_:*ŒTذ}7LxN‹Gý?ÛÖ«ìÜr8>”„£î þ@ÇŠ†ÿ^ìž9þ;íwÅèÖÚϽ&çÇ6£9”cľÚ£k Œ ý÷ÇïA|o/­¬óÑh¦-È%¼/8~cRÆá‹=U,wf-ûjëÁ½²·Ÿ½¬Õ…ǽ9‰ êæÎWoÀkëÈ7dÕl9-®˜¢t!GÐ3'ÛååIvg‹žöÅk¢*ŸÊTçx¯þYï¤GÉmóow›VÁÉ·m#…d‘°â»¯J³­0!~Rëæ:üpmñß#Ï<¢F~žOR¶›(–™ äœ0œ^ššÈÓcef²9oVXX «Å„ õCC‘!8~P@]rdŽ £öˆ>@„«4¤ÓÆ,H2©/+ÎúáØ|ù¹C„’œ„jwƆGÛHÄ|Ä ¦_n ½ë¶|-ÌüŒøòrÜMZoÙˆHm1 ìÜàÑZÊ’/Ð[xÝÝPAÏ@ä1ƒ½Ðîê¦1x§= yGM÷DCÃþ,©¡d%M.Ék®mÓ&sr›z$Ù_›¨¹°–mí¹ =¨–b Od [¥wç÷¤Û[‚¾Q åªK{|Ï—‰4=ð#üˤѣ]݉mÒ¿'ÚV¨ Zî1_à6Â,¢þ¾32Ð#ÎkîKö>&IDÒ8g Ð*ŸáE·™8[ÓÛjºŽ}C#z ÀäÜíÞj)…,Œ©:WÿZIŸ•¶5›¼Ý9ó)ʆ÷-Uk€xQGC<Ä6øà..juH1ŒJÙïÅ+Äs"ÊÃãxŒÊ:v_„Rûõ[DD¾úwåoH¢îÂÂQ©Iy[ {mñZ¶®‚vS…à<£¾õßô»Œ(}.fË„¨¨¼ ea±²njQ´µºÔ­5E£Ïµ é7Àæ(¾Iø% uÞHß<f-|Q‡ô¿h·Ñ¢² %o[¾¶­Ëº'`ìœqŸZ Ëw6лväKxç±¹^A—½6sÐ÷twGüàupzÔ`^\i¥Òy‹™-ÞÈ_ÓˆaÑå÷¨@|½+ŸÇË=«ýêý­s®t{êØ¸p¹a›`&è=rqc²ÿ c¼`L“rË1ˆþˆŠ0µ!³"m˜ÅL ‚Ó~Ó~™ùþ|0éFÈIg: ‹Ëû¬´; ÝH5_ã·ÚBžM·Ž°Èý&xÎìûØ$^¬Ã–8?¦ÝKê!šzJ`ûm”ZCQ@D}&($ººËV…ǯ¢MH¸âðwUè8à‡[ ²ÐQ4EêüÊhäÒò¯:u%dÎ~)ÁMÚˆaRò%p ïèòDâ¼e]2Œ‘Rõ¢*D+æÍ:~~Yv)tVâš¾¦èsO ´¹€ˆÎ÷Æê „­~żÍINoÐ+„¢ýyJ“õðk—Üç¥å:ƒkû¾Ã…±Òü۳Ŗ™<[¡Ù*d©+¡QMÑÓ±îsчu™ J™)8‹ˆDƒ# $²ÐðEÎ8z^ÉéY 6AØñÖo?Å/b”Û>†5,`VÏÝ#_Í‚Y>† \ˆl7°)p ö@v/”:@Fól`í½¨HÛ½-ðjñ<1ÿñ¬ÑžOãùâêP²i=2߉¹§Þ0ƒYò _@ÕÉYêLŸ8*÷-¥t Kím“f.s#¨½ƒúo?¾Âžu>UU¸OÎ1W:®ÄNk`ùÓŨñ ‹Ý÷2§O¢”G§­ /fè}Â:’A;µîާévtsy“ÃÑ'jއÄ<Ñ5ϲhÖlý«—[õ¡s\þR& ¤0¢}Îr£P5«û w1…ù¿ð¾úìïbÝhÈbë ÍqOiúwUÝõA«S3¾‚X—¬t“.9Wž2ƒ^ht%8ÛÏ®\~´Ó9ê9öã€Iû±{S L­ÆGÕeHj¨F‚ôŒk|"}À*ˆABFTœ½IŸç¯¹[‰ôC1}ÛcGî.`f[‹ýìJKkˆY¶uk}[ž²•ÅŠ¥6´| ™ÂJ®!Œo=$±ä ™©ç°cîÒQƒ¤Ÿö•µ0 ñÉ·šD’ÌÿdÀüÑ!Ó—Ç€¸F<§Sl\k”ŒN)¨Xo¾ed4Õ2©f“θQøy-6»X%,RQ<¤#çê7­Â‚¤Ä*Zÿúì9¾ºú$˜#>HÙ4þ«~¬† óÊÓõS ë·™¡›¡^’¨ÛfP…°xIƒŠ…NémÆü:“ɯqÒå-p Ó¾8ÂñLÉrOüÊ_­3º¿†úÏåµ_X¯2£7Sò™umA"ÝyL¼œWª0DF3uÈß×ô ?6$°7M£Øq³²Á*ƒ«uxŸp gÀösÐ…Pd接ºÍW•$°Ä/6!¬IŽ\g.öBš“që?CLÕèaðˆr%%Éë)Z¤ØKÞI;éäÌçÝîåñwàï»á0ƒŒ¨z;ë«õ÷‚Ró²…²Þºq3_-¾z˜ù¿=fŒJ¹Hß5K¬Îgûì{Oçaw 8Å.ð]pâÌ8šâ;}é"YºÝm²QBº16Ýu"zƒ¶‰ ¾d×þÙ«†õ$tý*™‡bj2ªOëcÜѤa>´pû‰Æ*64g*,†u&Üp<"Ö3+_ ûlÛñøGþA1½”xMÀ ìš>¹ bûÂoК,Ëj0cô͵¢±zBX2ŽâG>GôHk¥ûèžÁÖ}<Ïrpú%P–ÑMJDÁ‹ ¦3}2M¨Èt­?û© …'5,ï¼éHöÓI‚Á+kdúq¯“vzô³àäyG¥£w¤ýœæ$ùÏòr˜Ë/ü½~ÓÅŸ³üéŒn^\©x´îØ¢¿ò$i!3ÔÀ·Ñ$n‡ Hs­}P¯Š62–D'Õù iz1 {"UÕýcƒ¤éõ}šÁÁ]ÌÞJC䊧*ä¬&ÍuP’dâÐì0éë>„ ä÷jÔÇrÆ÷ÕêM J%ÓËÆñRšežËCá/¹Pa7zŒ¿*Ë ?~¿ CŸ}Á&§u•beXí³Ë³¨-ÜÜ4†ÎUŠÏd¾fPPß–ô?bÂˬ'|âÑ)2ÇD) êk!–ux5!z*¯çœPóá‡DˆÛl!ÙÑ(Ú¸áEs†=ì :XºðÃô’äæ…?ØhI3öl]…ݦ²5&_u…µRÏ!r€ÑBËW ‘õn¾,¡jMtƒìv„éBàs$š­ˆU!å*%LÖQÕ{Cßû7Ø©Q3NÊâÌlƒRŸãó ŒF’?ŠËTmùn¡5÷þª+uxQ.•‹‚Ë£i«MmJBË= w<- a“î«a6«~Q6‘HT™°?„æ÷¶4@…Ækj¹)ç\³Ê"’%$ƃS 9º ¢<®ðв —|Ÿ ŒèÊ aêC:þÀùAmùbFï3OEèŽèCê9 x”åyÓïò*«°}u†F<[Äœ&ÉTšç]>r€ß\œs_ô²šÌhO4õipí°dœÊ€âÕ͆6ð´ï×$¯X_7=†Éß!Š«œEô6ðWã,™ªÒaho!äƒ}Óº~)ʲY2Ð7§òèçˆUÉ9:ÅN°¬?·ŠeÏ}yP†— K4_§ \Zý6‰%’d/¤òky×`xªŠi³€Tj I WŸä\?Rš§ÍããÛšKè±}9ÓÝ Ý›ìñبýx²Þ1mÛxoCKò]@¬©X-JýûòÇ®™~òµïRžYZèí_/©÷ÖV©´nÐ&”)¢7.©áH:/D<§…HÛE|-6I]è>’* ݰŸ‡k‡­ ŽÏzÊFYYµ>ŸÆ°y/%æÛ#@/Õp-<Í2'e'v]j‰Œ¥6[|Òpªràâ(”ì¹·¹m}23Îg§„rŽž±j‹gid”I¼jc ˜’Óï ݰ®OÕëyXxÍ3Ûòœ×üjõ@ÄÞ_®fr5FaY>HÆþ-d[‹4£GØ ¯¶ Û(bXc'ƒ&š5­V•ÛHkòÇ;7%s*ÒùaÝjviK¹Û4ìFŸ 9ËfxH÷ŒéAlkåÕkÇ»¶gº-Iá×.£XÛ•ž#=‡VAÕGCSZz·¾(»)ÙAÖU©ÌùHøö:Ä£ Û°ÊäRünu¤«R%jÛô˜ët>auóhÞ ¬qܤš6V¦1vz<°‡ñÒ íÚßý”ëY3?ýu[<ÏðÑX²þ¸5ÕÚuÔ¯MÆ÷HÙÜeÖX¨¢¹yƒàeNòOùUÇæ›A$©Ú«äÎT¦4²£q5Y=Új“#5W\ˆIù¡1Üsj÷N¦zK~¡„«ý—ì³¥{çÐ) ]Ú³\¼uËÌPôæ§,¾Qö˜_"Ý"WÏUhŽ·FS[b³Ô míL?;Ùs¼jµYÌÄ% ­ôÕ¸@njõûí>‘ÃéÆÌBÖ~M^úuŒuõ)b·¥ Õ ;I,X6˜aÍòu÷ï*—åÆ. ­(÷î™åš°v‰ó98å Mæw×X~ƒÓÜV›Ä摇wÛá?²Ñlúæk«B·od‘ÑIgëý%¶ÏmÝq%oÃg.»eîÑçã‹æ½‡éþáFʸ Ý6s²ù¶#~®Î\%ÓEKÒQ‚q0x? $숅þÏ5µSj–Ç1ïé7㮡¡È{=Ï ^0Ÿ¾«HIL» ?¸tŸií1œ4O½f-Ë¡fÅÍ©.½x’ˆ2`¢¸Y.pwµ †"8[¢¼nLÖ PÛ7íIñrgÃçV5C“ê.¼©–r¯Poˆ¿|jwÅÞãx=–-7¹BZ®à|PÀ!¹cÏÒÏò•Zû2Æ8ޡݰu†+ü8‹¤¼psû²è4Ÿ¼ ýp,D[(5HfÇÏõ RLh]t Âö¸X”~»#ácœ>ž±÷Ù ñ¯ËgŸÎ<îVs_±Cø">º+ÃtÛÄæ@é‹jÝ}vb¡¶mä>9x­)Ž(„ÖÖèj$¦µ|©øÃ3q~Ó).®“Ò ù·üPo{2ºÁﵟà}õa>ͽ·±s3'ׂ†â(9—‡|µ­6ä–ÁgW~µšwªåá1ÚV|Ó (^ Çbǯɢ‡¶€nPi•ó´™©/Qùj¦t yÀƒ¦ž¾»k1j´9»34&?Åžß7½ÆÀ™ þr=õ"±2{:¦:*kˆ{þ1¿ÞnSL¿¸ran´ï¸Æöƒþ8ûGˆ"(Rc'2¤èàëQø«(kê®"a¶Ê*E' ºÐÍì¦yH‡(€Ìvûãó›û/ƒç*~Ô^ùþžZ‰¤ÝTQ‹A=Ÿhý^¡µè9N'>‘ÈS¹O²ì!ºœúp Œ°˜Y†š'n¢±@º'cãáÔÆ¨t%EXÄÙñEí(¢°ÃXÄñ¨ÁŸ…eHå„¡$‰¾¥ôjs&ù‡–Ý|j4¤¼» ZÁÐäsTÎø´~l •UÉÚ /| †/l°,÷òI‘§Z•®Éw”-¢­ª¯Ú=wî¾µŠÐÒžÚù[J¹æÍœe§ÏFîØïÄ26Q`®òô¶Ó>é'6:§˜CÑžkµ’ŽÁ‘ìôÒ`1’14fˆútovÑx’ußšÒÙÎóÀ“ 8Á0 |îã÷P_ýÂñ*FÄ›!óÌ>rŸ?Ã]+[$:µA›iÒ…±¥üZ㬱ïôéâfŸÈÕrÿÖÓw–µ‚ÖÅø‚ëDz”„¶‹¸ñ“QD8èg©@ƒð<÷C³ÇyRü8~t^ßs‚G:¶IzÓf 4ÅÃÓI'Ê”qx»ÑÜt×øðŸ?üJfÃŒrmïÌ‹´bB¤ùU±¡ó¶‡ì–ÓËŠ¶«bYÍ0+/¥ ï^(‹,?-D²Æö=rw[“¯L껨2â9FÌuGMM‘Ô£hµvêS8É\K"Ìà»ãzüŽé]áqDt7¤ Ö|̘V¸¤±vfQ ñAò…ÀIfõX„â[¡/o9¾Eéo©>\kˆÞÐöËÑO|r£¸Bù¼ÄØ× õEqSzYE LÕ¨¸ÍnûåÿÇRü9C‡˜Î”º·—Þˆ®å‡O>â8Ö9‡¤Ñ ¬aüf«MƒÊ ‹©P‰ñÙ‚³tpõ5¼švÔçξ`&Ñ$Ô<ÕÚe-ï²X{î†r×çoƒ6Ý0D^\-H°ö¼YD˜D–E~o¼¿óP:ºAÑdTú¢kÖüAQ’iŠÏ©=†Â®ÿE”ˈâw‡ƒ(±»€–3ç+_n¹,q3çîȀϮì8?0m­¡ÔÏ—u®ý3¶a¥ó'¸A¦a£t0nnHÍ7ŒXMW¶è6³²ôPÌLá{F—Ú”ÊÑˠΥ®%AÌßµ3»sÙj6p£Hã¯_RSí½B7ø ’Ѱ«×¶¾Ù1 :‡Þ$N¬Öå* ì6?˜†ÿ† °ÛÛðÄ&Ñldѽ<\üá]á³H‘†ŒŽeå CdÇuåâÌçÃã{iâ­î2ôð”*F¢››Ž!tp“ùiS<ì»)ÖÉ£·ÿe†9º³Ò#‡4…InL6µéQ–ÒæI! é3i)ÜÁí©ôÃFo š5UH÷äØÀ§¾•p‰—´ÈÐzú&d3ŒS kl,•ë q_ŽÀ„; ÞÙÏ*'ñß#ÍÚ±ÌF©eƉ#‡ýãÀ.Øéåćha?Þõ8ÿòÚã3Pʸ¤Ì$„|ˆ¡¼÷<ýíV˜ÇFøLv~ö;e}Ü5´ü7äÈì,¼)z§ý™áÜmÙluZòZp²gè´ò úµpM% Å«xœ”,9©ÒWëhïžÜµ”²“Å!<Éiås;v§˜‡µ¸xoGÍæÆ<ƒ:+Ù%“x4µæs+›´ƒ:5Ɇ|ëÛ~sç* ¼G¦œ“jH' äÁ%|΋C„¬®}‘ùjåñˆÕ.Ð’º õ£ã£‡Z}uÔÕ3±qÜUô¼ IË7(ßÜda$®"¨Kä|ª 5&Ž °IGú I;︠nª¼ÂÖÑÔêsX*9WU.2_  ½‡éLÜà0ßX'OøCvDw2¨¡ù†nþ6cB£Eó7\wª =ÌŒß`ó[¤p?Dn­ùüó´þP§ßQxûPJ’û8¢çNSö¥oO1Æ6lŠïÆ“£DÔ¹6F…ÉÓÏ"«­¶fú_ë}õþ?ØÔ38V —úºÀ¦ÐK6NÛ¸·ßÑ]QMšI®©rn7ž¹©ÉÏ-b³pÊwYþÆo¤æû—¬Ý¬2¹å§¢â"°•o«®‡zã®›’ük]—ÔW&F_Ç•&ñÑÎöz­Œ)Ø7‰J ‚~Ekœ­ÇŽe¶¢dg –Déø¨~‡þN_ù’!‰Ú¢FðšÅÛsË+ísÇô®Ë ëIcŸS@ß`:Ô¥cIÙ°‰¨s¹¾2ÜŸ 5´LËdØ-ƒO‚\ÈøÓÚɲël¢èë7´êë°\iuwÞâäQøŠ.¤7™_4Œç…. –!βHW?2—/Ö Áô‰Ö3šô˜Òë÷ƒ1QµþØ^«×„eY€’•¿±a¸¦šl_ž¥—Äð^ǯ@ù ΜN aD`]Ã2Äò9ßZƒkE ñ®'ͲCò‚Ã’V½F¸ —•"Ya8Õ Ëye|Ô\ʆìαZñŒ+„DŠFñýWÒ¼‡Ó"®ß¨bº~†0Û@Ém`Ò’Þè;#ö¦!& »[l‡¥„XÁU—á(?ÿ)Wá+u–Òp~RñŠ\áŠÖ²0Y"Õ]~q[þ'¯GõçŠ@Ѝ7Mshž €ÂÊÜè¥_{øÙ‰ä‡.‘¦upì¼@,…a4¢]³­h¼ò¢Í… ÒoBƒ>Іí »ä1—êD°‰vèTÌ7Á€gJzD¢g¿ûP$ÇÀ>dûèÉ­­û£g½wOé_¯Ü± šw­æË‘K¦N7ƒtÌ[z–V^†aàZ©úõ”hΚu'bTòTÒI¨âsJÃ0¦ V>Ùñ\M 7±(7Ǧߪ‡î£‹ãP]¼>˨*GFô;LÎ¥‘gz¯¦yÚ¦!¼Ü–¶|^V/"wü¥²wÞhä_B ÏP®[¥ã΄÷y.Y‚T›ºìÛÉ$lv V ¬_ʈ¯‚%m6zu^htD½3{”%=ÂâÏ7—Ù’í2ネèm‰RR†–•,œ^ÁÊA¬Þ¦h'ðåW.®Äɶuy9ùGe²¸DKªÍÀÈ»ƒ0U„{øUR;Jg’j%€Õ_}­N&HŸ—ñÎ! u¦ÿ„ÁU¶û}ªá‘U)¿dèŸE"•†/˜pøIŽK\Ú•ÆÚ :!SˆãÑ5~p»PM ýS¾VvIÒ‡ŸœhÀ²&%»éäo›Š•KQOÃÖC Ÿ?AÆñÁÔMz{˜]üÕwA/ÑÎõÝ [:ÙÁs…Ï»±:[/uœ#E IàX'Ó¹Êh=xÇ«,CÌOxB¼"ó·ë›jiGò³~º×·ñá8ųIå’ù·Ï$)çeæ—F[¼U"At#Ï\ÅÉ7湫<†ÏytŒ©«ð-7;—ÉÒ\Ûn>9øM¡$Ç6QSŠ/õo+ °SJ\E;ZŒk§@*–ñ >°ïé/Ì’mȇO'Ñ– >.‘'j"|¢uÑ„»8…Dî*š³ÆNóýñCšTknX …Èß¹Tñ ¿òÌØ±k„\c:¡ø`Qä²T²C}½Äë"Ë¿0›ELŽ–}3@ C˜_TׂïO%È™Ÿ½20EÃuyjËÜ1¶cÏŸ4æÎ»A©6egJç ³'½…ꛃЎ&Ž‚Ñ‚ ŸðiO9Qçh/j€’èô.cÚpÏüò>ØÐ['y¨Ô F­ÔgGKBêm=–­îvZÇ~a¬Á‘ÞÈW¡šêoË׋V$Uáàˆ1C‹/0€Ó#ÝD¡¬4àuìWŽi„7`d öÐw/`Ç^N›¨]†;íT;L] SÝë“=•Øs(¤»’;ˆç\K;¸IÓ9ezºL’µ8XrQ‘P=êvÚ`óóÐû‡A yMv…²önûÇ ç/ «§Êp]: aCDzvOqÙèRy`]ªtʲ¿¸¦–ft¸éøÇ}E¦Qsåô†@ø- Û’'Ó4ª -OnA)áo›Co¹ûc “à5-§›}ž#rúé£wd Ù¢8>ãºf¹îUYÁÜÚ¾S>­z1{‹“~]ÛgSï“风9é1Ž4ö‹ÙrF2,U 6ÆÒëÛáº+¤É0„ËnõŒœd±&ypëáÿ:Ûr˜q#Hn"„gÙÖáæõˆ Ÿºo­7å9ÚN‰ VŒ®i ró!>Í»ê¦MÅBQ®* c¶—h“¡kJš˜¦øÍU±§âäËc6,o"ȰHVW¬%÷±'rL'_šì#bAÌ—IìÐê\›æ¼9öß ý;B},ñ¡âÜYU2Òî‘Hp†E‹ÁªiõèAàålm &™qqxâzÌ~I¾˜ódÑÇmÛWŸá7ØZ~NíÙ/°Ï.¬:TjŸïhcˆy«QsSÍ„%r*„í^ûº¦¾ªÉ\`˜ÛCQh1@dhù*ÔFðÿܺgÞ)at¿& à—˃ÉU¼ñ`Ó£j1·Bð7¸˜F9ÙO=<„ssÖ©»¦ƒíÇI¬ãCMõÀ&¾cëL„Eÿ`K¬¹—#á|ÆãáøeÂYV¿ÿy¡’¤&YbƒQƒk Wõ[ÊñDhh]•þ7àÕµ¼É³…¿´˜<‹>°0ÍÔåi¥J½Ó~ÙE‰GaE‹&{pž£’ãqá2þI¿™ð0÷SH•?®NiND¯w¡ƒ¬êü}ºøuËÝî]äs£LYÝm7QÈ•­e"î=9EíÞÛ€KÚC ¡|·¾œ ̶³zÇÎ%î•»ËÌø—$®±ZjéBªSššbª˜ýÝ!4¿.Õê¯Òl¥QR­OÅÛ„àÈfs•jUè™}ÙtÁÈž•ÜVØcÔGlšË(‘·Â&SÄÀƒQ)TßilïÊöè…"Jj–¡ÑåÁü¼½ò$ûF:ß?RY¶…ÓRÍs+J÷˜ëœâ©ûÀ†~W:w¯µ:“áwg죊a\èÁîæºn6†ÊÖyÀÅî¶UâÀ3e-ó{\Š&¥4põÖòöiÙ÷ë/ñ!˜ˆo´L?+n½ƒ¸éÐÛüˆ(†bc9ptÐûlJ²JIò[ö/úÎé}Ò.íß‹ÕÜÑ¿6ùÛž{„×U8ôbÒ‰³„©BNÈÝë( Ç畼‰ÒH+Ý ò-pJ›L}¤|eÿQª{_=ÅKå a˜m¯Ç½±„ÝÛÑç‰øË†Ò÷üv­D·Yv‰ÒE‹à®vòŒ°Æ.7¨°júË#‹'BüÆn ÒéŽoDc@QÛ‚° djåšÖ ¾ NëxaÙ‡Ën“Í_1೟ù*éŸÛÑïæDì"iͺj¡p*$¡êÿƾ µ–B¬Ãn/è,iZ2ßÖòDÊ*ÜùÖ\’˜?n &U w¸ŸrˆR”½"pù#øDbÄ&H7÷º=Ø^Qã &?ÀäOÉHÈ ¾Ðe[º©µágÝe؇Éøe'¢^ø«~þvù´òIóNì ñE8Èß/ÒO“í¹ý˜€ÿÆØ¡§ÉÓP³±;ŸÀô±Ëa S"‡@Û”Ú“–ä$Øm|ë@*¿lôQÕWgb¯ÇÚc—Þù B[ÇA±éƒÑ§%ñ ¹¢\9Q„Ü=B›]EõÐæ‡ÅS–š‰J|6}ù ©R¾¡ñbÓôQ?dçVª¼€šo1£iÄ2q…ùT$™Ödz]ªbô†Š,72éçӷɦâ+uy‘ß2Yà‡ªxLçùÐÌUÌ Áq’GJzï4¬Ç2>\NrIë·Ù£@lJ›ï¸ ´ÌÎûÎ Iï‹'ø‰±&,^‚<öØâjæÖÉbiŠõž“´jš“X8¿î{­)W4‰b²SÒžÆ/"rº,Ew¢W5oºgÏà§Êp¿ *ˆôiF’˜kÆ´ôÛ{@YíqÓ”Î_WT¹Ž5G“sº|ôÐTrj¸q}§óêà ßuyLÌ š`æúB\ž³J„ÃË·¾@+=ý‚XˆÉ¿zðµN:3f²èk˜b:¿î}Î oW+S#h$ÒàbYWÞæ•Rr]/×¹aDÅäÿ™ ¿ÇR¡^ëw†´d¿ÛÚñ¤«,|‹ƒ|(ü“Vc¼Ïr ý´2ºÖ«“æÍ€H’ñKç9hÂ‰Ž•c767^kïŒK–nŠÀ¸Hócw'”BD>”œrË›)ÀW»Hù@]aà;=˜ûÄ¢Üëjë`ΠOtímèÖÄñ1Û:ÅYêRs‡>—½iåϦ¼|‡8–•ĵýòAáŠê§u¾p1¥‰Ùž‰`Âü³L¤’ý ÂÁÁäZžïÒŠ¿ŸØN„“úy5û‰ÙtŽÀûÛMSQ ÜÎÅ?i,^âcé—ˆ¼•KãÐ\JÞ` ¼ið×î3z…åÚ²ÌÃ!-6‘†ËÞ¬86Á°A.]!½B!'pŒÌooõOCÁ=Gôm4¨œÅà RŸ¢3ˆŒ8ÄyâS¤-ŽÕ°ÛÜt+s3bã—F÷† UCµ¬’*…$qþ𲼞×Ë„cÃÕ“Ï9Ê2~n” ÁY+б9ÀæKBoÒV­œø’9Çol#¾šTõ3½-ÎÃ`EŒkÊ6R¡^ÎöÕYrhûø€ÓfŽƒY$ pÙP&%Kënj˜v`5+;+Áóñ|cÑØÑûqzÔÞÊ]9ê.Âíñð Ïqökø]EŒÇðS©Z‰[À†|r—Ù¬¸Ý ‹ODtŸgpºAzµÊ÷°iôåƒOMãñîƒQŒÏµ«$K}T*;Ògt™™§aÓG56Ó¶ï=Pˆ¥ªà/\Îý6´éûærE.®ÚûÌOL?íd=¨:Ë„j…Œ÷ðÕ§a4Ò}ælÜnZv&ï±È³Á+C^%.Iæ'Á]PÃüø"ø–t66„3¸R¡%™+…‹<’İÛDeÎàDà/ØæôÙ)¼¥ðK¸¦¸¸,¿ÀÔk^ÛÜc%¦Ý"”³ÁdiðôÏb¬‘;fbíË™€È2&6‹O“jȶ“S™ðøÍkHgóÈú?1hw| ŸowSí# åï„!;’vœªàFZ“jwTÅnÄÙF±2iºŸˆ N4ÕÆ“ÙUµ§5ˆ€êóÐpÔ£¢ 6ɤMh9õlw³™M°?Ã|ô ÛÍÍF+eÖèì†ÓEµÀ¡t‡MJ‘§“Ø¿5@yå &GºÚáKÑ&0:åØý"9­1™ññ®ÞCæ í#î+¢j·Ío††Ù^L˜¡¨¤R‰£º¯åm)KŽŒFüˆ5dÚ º›æŽ£È[üE8¶*à~xæ…@(–c>zHµç )4Ìñ«rqPD’˜Y UŸ…½òŒ“¸"E)Éqúº×­Ä9ÄÛ9¥¡eœÅ2 î9;õí~eLVÝwâŒÊ¢;4^Æ"Nõ“ÿðª [MxÞp2QƆüSšÜ®jÄ‚­F1›7gë…ò³?Ÿ–rÑBU¡á`€t7uÿ3]5y%@ýSØÚÜ;,vÛñY£aà5Ï!ÕÆiÎÑ Ú5l0¶¡éŽaÆ‚â‡ÀmEµ)Uz¶™²\m1æºÃ£$éÙJ;X7êjúá g»”îÛ-cðÔ»nQ¢¤¥êGq+âOàzþ˜[‰YüÔƒ½ÿ¢T¶É¸*½¹ùŠÌa“Õó>ºï‰@,Ñ,]ô•¬³çü·ögg• ‘оëéƒcT6qšAçSˆGcÙ]TžzLiíÎ1]†2hêJyQ‚ä} ÔÏ¿-8MÊÅO† Vls­§<-ÎàÌú¾ ª—ˆg\Ër½H(ËŸn“‘<ÆIöoÅWáÞº>_-¸lFïѯ¤5À»-¿tQ`"Ä=s?¼ëAuÒ%9enÕ}¥"!d57¢ÖâfɱRß`!ÏÆWr‘ôrG ü:ü‰v¡‹û²ÞC­–’{ˆÑUÃ'±©ÀÉûv>+°ÁùÝñ;ï°Ý+7îŠsHöëëQí ‚SÈNñ(ø¹ 2ÿöyÔÅê„‹ :~»ošãIXˆGÍUz]|¼'zæý Š ï1B“{ôGWh5™ªvO)x+]‘9Ûú.2Õ¥ÅR4’ ʸ@ªAâ䮥ë„äà&;ƒ[6ž—ÓD¾¤·¦½g°öqicUO¸®]àáÆ[Ù½@ú‘w¹Ï÷ñŸšÖãi"•bVÀ°žÀÒ$ý„ò'뤭Æê[Û‰Ôs­:ö‘‚øU!~þ´ï¯B¸äŸÃì4ŽÊ5Ag çÅ0‘QG©Z›á]ùât}‚ì(J ‘¥¯z´â49gù(b&”¬a;„)¶Á#Ëž¶ƒ$Ó#‹bȯ§+·¼Â²%t¥ŒD;“¬¢†´ƒ³@fÀšo+Й,^ùÂÃ4ûÒÈ'‹¸óóD±$QÙî¼û!dÁ/ ê<™Þk{GLžÙ¯Ï CžoÜù¬ÇP£‡iVŸØ0ìeÝÀfk©ãéŨ‰}²Åó\=ˆ"Þ¶çÐdE ÷$ªÜ˜»Õæ9ݺ˜Þ B°59²|´€–K*¦ž|µ†ÇsÍ9¢nþXæ­Îbq™=ÚnûZ I½«U}ä/B]ã@‰×Ã)á̵êîK$º´i z¯ÄJ=2ˆ_Çó0ØËDÖÙ]ÆØëÊɃÄìù·Ž‰$o=;2Uà^˰Ã?n”Ìe ]R:ô7à»dÀ,<|—ˆ‰?M—ÑÐÔçUèj:%t šIoè}~ªéÞs° ï˜l‡sP+×À2A™wÆ-ÈÒ…ùЧi5øUlM.û£Þ >²¶ïr«Ø’Ôú¡ùÖ3Žù½h¿‰Û3œ‚ŠYè|J¯7¹ñJfk‚(êGÇ6EÃ]g÷…síÈ9»Ô5ûÅdVwA†M²ÀɬÏF@%žN$t“U¨•þv ;ëù ÿ¹Ò„€ƒvܺì°ú“j=O((„ø”hu¶/̶TÔ5)”ŠÆó{p2pœlérVèŒašò’ªÏL²ò­U¦×ò}”7¨5®]î’—ÿýrö endstream endobj 276 0 obj << /Type /FontDescriptor /FontName /SDBLLA+CMTI10 /Flags 4 /FontBBox [-35 -250 1124 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 68 /XHeight 431 /CharSet (/A/B/C/D/G/I/L/M/O/P/R/S/T/U/V/a/b/c/d/e/f/ff/g/h/hyphen/i/j/k/l/m/n/o/p/period/r/s/t/u/w/y) /FontFile 275 0 R >> endobj 277 0 obj << /Length1 2567 /Length2 18341 /Length3 0 /Length 19827 /Filter /FlateDecode >> stream xÚŒ÷PœÛÒ ãÀàîîîîî 0ØàîÁ‚w— îî.@ ¸\ïdŸ}vöùþ¿êÞš*fžî^ý´®÷…ŠLUƒIÌl”;º1±1³ò$”45ÙX¬¬̬¬ìÈTTš 7{àåÈTÚ@WØ‘ÿ_.@37ˆLÒÌ b¨vÈ»ÛØ8lÜül<ü¬¬vVV¾ÿ‚]ø’f K€3@ìtE¦’;y»€¬mÜ <ÿý  µ °ñññ0þu ætY˜9”ÌÜl€F 3{€Øtóþ´‚6nnNü,,žžžÌf®Ì`ka:F€'ÈÍ tºx-¿S(›9ÿN™  irýBlåæiæ@ö  £+䈻£%ÐahÈ)Tœ€Žÿ1Vü#àïâØ˜Ùþq÷÷éߎ@Ž6³°;8™9zƒ­V { @EZ‘ÙÍË`æhùÛÐÌÞ 9oæa²73‡üº@ZL `Éðïü\-\@Nn®Ì® ûß9²üv)³”£¥ØÁèèæŠü;>I ÐRwo–¿›kçötôý/²9ZZýNÃÒ݉EËä씓üÛ"Bþ#³º¸XYYy9Ø@gЈå7¦·ð/%Ûo1$_'°À ’Ðd„|!ûºšyn.î@ß+þ!³±,Ans 5Èùwˆhõ é¿ È `À ?6ëïÏ?¿Œ f v´÷þcþW‹Yt%Ä•u¥þNù¥¸8Ø àËÄ `bçàpqð¸ù¸þÿëåŸüÿ›û_RU3Ðß±ýËŸœ£À÷Ÿ µûoÏíßKCø_e0dšÚ?ÃoÈÊÅjùÃöÿyþ:òÿoò{ùþÿ‘´»½ý_zÚÿüÿèÍ@öÞ[@¦ÙÝ ²J`È~8þ_SàÖY h rwø¿Z973Ȇˆ9ZÛÿSH«4È h© r³°ùkbþÛˆw{#Pì ú}ߘØXYÿ²rv;ÅÒ¬¿T@ÈFý/£”£Øò÷ê±sqÌ\\̼‘Y!óÅÎÅðeƒì¨%Ðë¯Ñ°0;‚Ý GìüV`äß-åæ°ˆýýqXÄÿ ‹ÄÄ `‘üƒø,Rÿ V‹ôÄ`‘ùƒØ,²€Eî‚ð)þA>¥?§üAøTþA¼>Õ?§öAøÔÿ ŸÆÄ `Ñüƒ ¹kýAX´ÿ »îa×ûñAâ4ûq@,Íœ ;ñûºûÇ"5ÿƒ š»˜YØ!O+·?rŽäÿY”B‹Ä™Ø2#ÿ•ü–?lØ-Áööf.ÿ²€pÿ¸€Xÿ‡‚û·ÞÙ²rŽ@Jgõç$8+Ç¿|üVƒÝÿÍ1±þ„”׿È )¯·“ ðßaCd AHT¶ÿ‚ÂÚý BÒþ7$cûß«ðG)’ù YþPqA|9BVè_zHÂà?ÑAƒÿG ÉÎéâÌ òÄtüŸ~q²ý-ýßnqBÒ€ ü§#œÊ8Ù»ÿ+ZÈ‹óŸl~#w ë_›ÿO9 Án@Kóu… "ýWÍÙ %üã–ë7zü«Æ\sWÈåŸH …pµ7sµù— H¼¢‡ÜÊ,n6.À5’¼›'ø_ >Üÿ '„ó¯—W °Ë¿+é—Ç¿ ¤Âž ;ĩ׿ „Õû_R}Ÿ?1C<ù]þÁÿÜwî.ò»ýõH‚\†ÿŽw^@ äå°…@¨mmhÛíg1"O¦í ¡Yªmt:&ße—v÷{tĺšìu—k±”áž×«[R´W¢+¤O¾‡Íõˆ-Ij­~& êÓÛ­ÈKSx“E‡buýo‘ˆ™4Ewüžœý´ƒí`›¡;å©òÝyÑU?bßzöÉxÕõ— _ØVÛ©áV@y,ŸaŠÕŠ1 .™£*0Ï™' GpczûŠëÌ cîêz+oò…T>Ùÿ(–㓯þû‡»yŸµJMv×.BJB}‚·°WXcÓÔ¾â{©òø‹¾¥Å1ëB‹¹¬tÌPëcý¤~£dÇüŠrXø¬ö.Ë|2c”þ­u,Áº½¨HÙÛ¦NôµN‡è‹ VžžÒ2U¾÷ï E ÝDº0X*yÄ!*{ûîüX†»Ò;¼R8<®4ð1°ÚDBÞÄ]m_“|ŠpöÇQB ¾Üáíò+²Í*£üâÛk;yä4ëµã¥Ñ>P!u⎎ŒX”’ñ»(³‘‡j8áê 6§!R _«9’a7Á0ኴÖ7fçógÎã‚1ýt^…OOâoûäÉb9.s¬&R[‹„c}ÜJôŒ(Æ$ž¼¢…ár…/ü·¢òß,«E§[¥ Ç•"voºMÊ ,1)¬jï…šö„£àæôs"Ì¿6¥éG)_áDÉr鱬l ê×íDô'AãI2 Î•CéáÜ›¿¹F‹ù‰ŠA`ãdgÕ©lP•M…'þ8ÓlÄût72Î~GKy…èÑ´ •ßpEJ[ 9Úv°o¶Ï#,XàìÅ{²¡Æ>ÞŽíq™çÉEdGu{­åÿ0öÍj¡ lõ :iûà¼ø¡ÔÊúˆªÓ©àAtNªBBKã[7_;ŠîYñ¬±£Ì¢á•|9&Ú¬cŸœèÚñ'¹‘® Ÿ/ÏÆ¶$cýëN;Ñ/ÎC@9\~¡I‰¯ G‡Vñ–Nßkö#Kg(øávR€k-»HÕAlnˆ!_{qÄgm¤01Ë4‚À”ÃX9OÕ™úÍçÏ[Ý• F7êêYåŸ$àŒk¸žø(.ÅŽ0ˆ ŠRî®Òˆ&Öò—ÐêÐì0ÂF@=‹÷Ë”£2¹$Ži„§Ìãé‚à0BÅír`Kw©_NTH‘g¹Ÿ·.ëmÜ—™ž cN›’@ÕÓ¦TÍÒ 8dÜ¿EQ ÁPØœE£ÎÃÌ–ÚPUfäWÚóÒàaWGå6ÌÛa:›7ÆÓ¥ ú¶w(Çìl“Þ £G”wñ`bV^ê9¶¬\­å4^bZUu¹™©Ä÷á§ Ž¼õŒ¹'ÙfêX›k_ðˆæL2T•d¬yÈ0¿Ž3™Q h À³5Éôe¯¨ 1†f»ÇtÃÆ¡US3N®ÂQö=ÐþgãGÌöñÄ‹7½ù¦Xk× [ÁéA׋kšR§ÈutZ!¸ =¶æëŠ÷ùZÓ•¥,G*÷ðšÈT¦ÔGľ¡´ ýüÌG q¾^²ýLØ›Rsœ^&\$‘ÛqùË-Q™}Œ—¹%–›ö\4æ£ækÎŒ©²×Ì•¤Ï{¼ý?”•oôûd.àÝÇIš¿,(%Ãt\v[?ìÏY²ÀÂ0#‚èûÚS±~´t`ŒtqœnGÙNjýÁA PG´©§¾bo¦\•¶ÞšŠ0QsFý _ûa]dcAa•Ϭ”Ð>¬°uzä)Aë>.‰ÙÆ“iÃýzgÇ%t0@¥Wp"Yöü>ê‡_Jî!Q­ ôÙ’†ûò=vßTúݦ<¢ YWųÏ@Á`o¡3o¡X¶›)CÚø`ù ùUuZÐ;Ó2¿çÀ*3úêqË]-”x8D:f79bç„ÅçHzVØ|ç“ –/A5»¡Ê¸ƒZHý¤Cq<}A|*n~±g\.¬°¿š–ž–x×StÒ‰%ûÛÛ>ø®›Öâ$ Yz&ù-†¢ÉÈ¿ø°4eïÉÒtèS†¾_†ÊXRš(â-Úø7 ÿz,òtÑ+AžußE§ï˜½7ÚtTØX?öìFV9Þ…eh‚‹%ý9…›ô_\†>û¶ºàwké¿ðI•ç-ÌÉTÿpOàä[Þ0:wŒ³„ýØG÷ÚLÓó˶â#]¬éÒ=gv÷²’1—zdöÔxË3v!áW´³ShðEä³zemýÈm¿ïWAÝF4C€®4dF_8Gyýþm§Åj£ðÖ‘Å~àxo#bM N„ãWeŒ©Œ ¶˜ÌÝbïψ¥Ë/Ú«¨eéÊî |/+œ<˜ÑÞ2´Ó=Ïëëh¥Áh=]QäU>#›è`•“d¿J ýgbñ¢w¢MúAb¤kw¢f…@¯Ôm"s‘ø]aò Üè—aD½®°Ó“ìü÷ûšÅÖâõöpØË±|ZOÒò5"äXNF=(+ð#N61KÝù]‰¥çáZ0¼A“óI>»ß;ÃEê‚îa’ðùI¢ª¯î t^¨Æt“C¯à(—"øñ͇ùœ¶ê¥-3Å'HäÕi¡¹ ˜4é9ɲc§½õ Li”žhaQª^Õ(aW¨ŠQ X%i’[ÇÉoÒžuK¨Õ;ú¤QŒJÙƒÂû ¸áPÏElèx©ÇpYÄÍ^[½»NM"Ãoal8s{ݤ$Ø «Ë íÓζNÉM‰Ûäÿ¬#¸Îf» ÚäáÞ}¢ìàü„þ\_Ø-SÜfô˜(ÐtWÛ7ó¯]û¿mª-¥ÝÒgeNê¬ùÀöÅò/úů9„qÖ U#|¬öá†ófÞL–.ã^hVDíc¤÷X<òëÓ ç·¡‹³]7õ9e[4yoˆ|| ›Í>ÍZØ©š¿ †ZBf-øÒÓ{[<îC´%7[EЦùîk´z9å,ã'’Ò#–ü=q¨¢£Í`j©tÞÁG%$O­›ì#䥕>Æì Pq„žéz3=pÉH!ÖùR)¡ˆ¾)' …¨ËgµEð»w°ÖŽÄ”hxš^a8Qž¤QË躃{Nø÷ƒ¿Ê>¡³¦yƒ>æ|s@&¦ G”öÇúÂ|„z"Nõ}ò¸·xEµS g?ÐÑÑÊÀáòitº©;q›ýtôiïB¦d‘†Ew"&x,Uz wFBu¢ÃÍ.kV«ðsù]ñ©=HèÉ•ÇHÒ½÷7mù”å áÓ¸bmæ×0˜ “¢î~*’˜Ïáv3ÖX«8Òðâ?•WU“á¿‘š §xûƆˆØ Ï ¤!üe¦?°ß%.­¼æ¹#/˜0ÒœM%W#Jötš°ÍÂMš·Ñe»© ¹*‚¯7.vÆœ¤=ýxßÍ%Ó… ä}mo6aŒBDj‚d™Æ`_¡IîKâþlâ᢭ò ïcø+èx+„Ôݼr›wëÖ,^­Ÿ•§fµØE.¬%NpÔ‚+p(œýõä Bîú#;foÄÒOÕUÇHUí@‚7:šÐÛIEñh‡¦‘n*‘‰ª™öcqך¾ô†¬š(ã$TCâ+ÛùÊù¨µ"ð¬ÉiN„/ÇÏŠgõɺõ_ÐV¾ßI&›)#l ›c¹´q.&Í‹ÞYv”§u'ïzÔpáÔÁ´dsqû$­Ôš,„TA0/®ßtxß>gÎM98De~ªªQ<è3Ê–õ«ÒHêùü%¢ @q5Ô‰ØYrv;ú¶¾d{÷sWëF¹ý.úU-Ñ]Æ`è¦ô"Tƒï.jç XtÒÝIÆôJ\OÓúu: Â<ÍM³ô‰ÈȼŠI+ܬ9ë¼âÖ¹ç3Ýb·d¶v:±tßõÒÛÓ-‹w‹Ÿó*J}TéÕFËÒ4Õ·-éIwí•ñ—â̱m‡#Êp`<ÛÝMúK` ˆY× 8>™t:ô Á²ì­ª_Ö¹[]n~D>§‘CR†ûغ)2Œíl[~žA‡<òá0s¶–!·±@ kpúí”ËÇÍÖ2njÙ©d ¾x¿^—Z¬_2wTüò.Ï‚ßi+¬eŒ{úêëj¼T÷Œƒ6¿ÏâwoèÝë…IŽ&‘ß~M¦Ä±jâ!I[É\÷ÇlNÔý Þ‹Üåx̦ÙdÐ úñ\äyÝòIw$. Œ$RpÜ‘ÇNÓ“A[¯l ù”Ý0 ß&†ñ…´ºƒ,v\ÇÊy"[èû5vãÀSJ L“€¢gïPfÈo j7:Þpø‰%øHÿÐã¼ÖA\Ò –I—ÿQ’»Oð‚C•]bnЉ©"Ò{Þ/€›§î±Þ<(UÅU(Bž«³í$0_-Ç} “¬ Cchµ§pwéêÏCè«&FçùFþÀ Qwã.ˆÃ=F‹F3Ë™+ÁÜ$àð>QpŸý¡‹‡Ð\Ì?,8/ãÍ'EÝ9îÝ–×40¦ü¤“sçí0õõ ¥$-иç¼Ö1rДW2Œ)/cJ¦Þþ2ÅÙø#"t‰«ðߥf¾ðüP@!ãiÿ`=Ì¼Š ¾"™Äk˜wô@Vh ÕgÕ,Ûv¡dœ –‚ù±pšŒ&¨iiT@3Üh b@"CïØtiöˆõ¶få.©''aÛ/>6¬NTÊ5¢j¸b‹Ëi6ÅÌÏy\`-÷ H‘Ô[í<ì)ýª@7G¬ÎNgíÈj^PÓ.à-Ù{µÈº ŸóݬþwgÀÈåsÎ8ÓÒÁ1`™ùMz‹H…6M™×. jýq<¤ÁèÖ€h¥m ‰Ëï«“¯XgÈ]2‰\³&4$ªw`„zf¼GP ææŒɘŠÙ(?s)&WÂÄ”c~Æ›O–;b‹°¤ÈÆ’ç;¡Î‹ƒ £ø˜ì·þ°ÞhAß*Ž ÍPZ…»*­ãh®ä?©®çža® ÛR呹k!bb­dÇ¥î¯áü$.Í«{7c•€¿~,Ó#<÷¸Ôp8ɘ÷:¿2}ËÚnØFŠ»I6=oÉÔ,R™ÅÔ ¡cwbsŸ[zï6ŠDËbÐ'ºå' Q¼edæÂ½5¯{…ªó•¦M": Jïú½ÚÑ{=ÓÒ]Syñš ›’9çó}l^T2aæ‹ÉA¢Nú¾NE¥›ÊÁÓÝ,óÎäb%Â43_s°B–ÜŽã´V(ø+‘ç¼õÛ ŽÄîùX¿õç·"˜g4÷e;Ð÷ `¹mÃ>ÄoF Më¡èX“uý“#ÛpâêÂçd®¢šRe^O ¥H*D)~ä¨òPد³å§e?’ÌŠ½ð&õP?˜Ö9 Þ|™Æ^œž–‘›»n€œ…ûÞè;޼í-ÍâØé‰NÑ~úb=°~(ÆmQ©ß5½ä5<¯VÞÃ×äÑÀnÊó[Ø–s‡X±#+'6ðsHHÄ ¨¼ñ  Īá꜋0Kœ%òŹ¿Wmj¼¦öWÜqtÏ)$øÄù-OÛ`lƒù£I˜ùA)¥ÛuE<Ûs£ÿðÂàl·ÅôcïÏ AÁ,£›Õ¯ëxc> —‚÷(ãPç©CS…kP|c.ß ‚ɳÍCÜ3FÒ)½÷§Ê ´F:©= 3sÂ…k[¬°¹˜W¤ªEâ‰M:ôoõ%†²¢Tr4‚ƒYëöƒæÍâð[B&ºZ¶5B¿pM¤Ü0ùó¼y57€·ÌÔEÿUN¢:Ηm¨9\,*}]¿¿î'b5¡‹J­Ì+”7ŽéXÜ[¤8mqù@[\ëæ˜’OÊ7µ¤$4žŠ=hhÐÛŒXµ¶ä)ûP:uÞJæVYÍEwÄÔŒóᲈÕáï^O7¶É„X…÷áR'•©vy}­§–Ã"ÈÌx9,Š ÑbŒ¦åïùð‡ø2)î…à¦ê våì=ª½U/—-cf H`CÜ0[|¦= LÛ@Y|âK­Ù×EÕà=ÂòÍI@ŸÏÑ«”ç´Ãum>£¡taÈrË|ŠØá¡ ¥[w ŽVÔS›CÛRäI¢«ª³¾j _ü•0žÐHÎÙÕöbˆ|-•õD¿‰Œñ_iä:„Ÿ‡¸æÊöCV:,j9YM1\'G³N‘  àägÜÉû|ÂCÇø5ã ×–aþ<ã4%ß^>©¤þ&œib˜1Þé5ñ-7ÁŠÃ:×oH‰þ=¯ƒwŒ&•Åž¦N? =H·vÙ½LOq8÷GRͲú¿»ŠÜ_`6lHªI6å7çZ&i·}V!ƒü£d4>âyûîu ý'R¦dlj®§8Fy]‹²Vl¬G‘™{eEezƒàw´V¨¿¨dˆöä‘?¡Lu3h‘5/ÓHÅËue.êÓÌÏj_éhWrBøh¶sD÷Í®ò—åäF Š'F«NàQ`Çj¨:ŒÈæ Û^¬]®*…×ÏQö´×òM*×;ƾÜëußdZµwR±[x·ÌǸuÌ -2_*u…Wƒðóð¹G…Ÿ;ƒ?+º¡_R؈¶v×]!¢4› _ÁPÀßBÛ-åÓ—dé¹ËÓ^¸?ú˯úóm|Š ÝJâ[wý†WV “MQ2 ‹¹HFEœŒå-–ycØØ—höŒïÔ‘PŸ<ü.ÑÚ1Æ$àKXRšˆ=óC7.ß/2_C¿ÓX\¡©ø‰8C¡‘‘ÿnnü¯^?k©dsv6“ ¤7¼•qûê­ùžÎZY|6Œj¢˜á+9ÿõʹʶ÷2ÇÙhöXÈVdí6X€1ð&å Î~µPÜGbaê9$”ÙP9"àÏÏw”ï/5Œ¥ÄÞ ýú p­´S“K{? LIÃ÷—Òç”"û!Ù‹¤67v»jë¼&yÝžVRW¬sã)ú,ehwi}wo3¸Éº²èŸ¡Æ§AwTFJOv8ê×¹„‘ðæêcŸ>#œÕ!'.ÂcÅâ¯ý¢¸ÊÏBÇ•.AlC8!ìTffÇx·åÁuCLþo¸ã4^'”ÉÍ¡Ëò¾ý–ÓA,ß™\e0W“oTìè8Ü êÕØz¹E úð5„üð¬]°ýühñ~š€õL/`HzEÃ;©ÄNO¢"ZCã[ù£S¼Ä“ü†¹˜ Ž}Jü4?ôj¬n¨„­ãEÛéÌIòå™Ê'TDÐ[*.†Ö-¾9Q Î{1—’¤Rà¥g•åξKª3÷ú)5‡ïk¹±H¢©)²¡@måW‚|ƒZeÅ2¶3¬µ¬Uª[îp_Ü'ß CÖžÒóÝæ¯kÀ¶_¥-2¦ãø§;¼ÉÄŸzXã‰ÏyÍ.’aüýÜ›fx ¬ƒÃÊ&[5Z eÿýgmKÉð1Q£×Ó*ÏgŒÏMG­‹…{¬e øþ!:e¹ËæLöÌÓšz.šAu"š_ºFÅËëŠÌHʦ°ˆËVÝÂgÐI}Q‡¿RBùxÕ{íßTÜŽè\àø,º Eêœg !R}K›ÃLºØòj§3Nd¥Óúe'¼½Æjr૚HiEÖ¼É,ñ8Z½h?ÅáR¯'ƒÔû-.Q7DE*íð&w$d¼ë$ûLä=-;²7Õ|Ñ}ÊÍ?^œ7®Ýß¾èùžyÖ‹‰zêèh 5ùÑ.J~xp´®4c”÷-Ì£pS¹M•ÊgUL¢ŽCq´Z+ÄÑZÝ6pRf¡M˜Uzå&D¶‘ÏÚ¡¯j|G °!H½@<ù±ôF4ÒúLIT®øQªË‘ÇœGÿÔ Ý®W³Í¬’&å)•äHìvëCyâ;ü3bt¶.'öÀ º=ú×¾iï#à4·kgl'é•ý­Š%†$hDö&èçæÍýá=0sæßz¾tV1°ùr µg…Ša|¥ä»µð~½ñ0®Úº³þuŒøEÆ*wÑîdZ÷›À&#a*ÍE‡)ÈF£¥#Geà­ó!®ÒGƒO“Û2E×W~Ÿí¾P¬…½—×á”ßKÂ"Âìpñ&ÀÊOǺI´d‹,ÖbÐM‰@›EÃ8û)JÞ¬ ·Í ¶Ve7Hì ~Ñ_ûÚ†ƒ³Ü÷"žLã³ô`¶yø¾‡eœMÎà|ýiNèÊÑÔ‘ͨçƒv ë°ªq/­¢À~Q£š›Ú×ÓEY“”‡2]¦³å_î8Çë/£Ej­¬Àf"ñÅÔÈ׫£¦oÄÙj —ŽÆqþ^=ßC8Ê);’Ë~±N¬‚w¼(«´;¸‘ù~8ZÊ•’½qØ?ÕâœÈYPÈÝòÀá&j¹*Ö¼XÉQoƒ sTÝæÉHò`TôUج†Ý=Ñp¼±¸þöy+·ÙgðËÜ-Âs3‚lÎcê {˜)G¦ì)ö¤ªJ$º LÂG^é‰0m&É[(L¾´Ò™‡ t©ÃOKÏÌï!ÝøÆÖ»`<¦‹ñ»€ü›ìE<°bŒ¼Í­%òpRäŠÚÅÔÚ<<"ðL—ÒU¶¯ /ng}øWž!‚0¯¥©C8 ;3åý,L 4í‹üáT*ñcéët¹3LQÓ-÷AX«“Òy_^œ}1ÐÓ2€:¿†t̓û¼­%]B×½³çCRt(¬Ö …îðGØ\]+¿Ð¯çOi›Æ9f¸äËW’aµûÃûqk?R¢Pa¥Öíº¡é$0úÌM’(Å/ÿ RcêHÑ™HI8ä$™Iè‰M÷åˆ \õ¨ïýøýŸ"ª”{—„Pε¡úàA"´@±»þ&vµª÷%&ÜÑu5$™»èö¾ÕFÅèÛRISä!û²0€4‚Ž°Þ˜¿¸=›ò%¶C³ïD¾k»[ÚJÀÑ‘ßb⺦Ö {Tw§8¦[\Re ~Æ&¸rBóÖ™k"vC&šÙØŸÄ7¸éVJBIP¤­þB`åLÿvZŒ//3PZ0Þ…_¡¯¢•U`û‚i· ¶Ì(_ˆnŦ3úè‡wLiïYâbn6ö–æFA_#ZWNJ‹d`wl“íSoÃòµ³×4PŽK÷¥mp|æÞ˜…šÓ$Ùg–¤Mž,ƒCLØk?³íx¦Ï 9k÷mšºªÎL¹^§3†êše¯c•]·«bÒHuái´t{ïI“ƒÊÞ©‹wÓ§g첎{õCÚ–õ[òcš¼m€NÉqhÙù­!«¼a%ñ¬1{4áÞ™•‚ò«ûÔ°c»Û^àpR {RѤ(PsIi’ŒÕmÎ[•سR1tÒp?ÍŽ0ǰe¨ŠÕ•Àh¸ž×¯üñ‹o4•[#DÛ¡Ò_¹Ä=hm߈ÌYt []䯤Cw‘”¥V½-–{=Ž›8¯+•Ì,[QñYë˜'ÉÄ£þ§MÑgË•Ÿ4¦®ÑÙÜ=ïšØ×,4Δ.[ðcB§‘-Æ}Ôï‘f„Z·Zcm“ã]÷ô58…Ói-–‚åÍܤ®W-h™BE|se yÏÕzo,eS©”)–r¿çó¸Ãô!‘ghì´Z\\/û¤\-/0snñ1bfß3¶¡P³;œ¾u8Œ“KqV»1‹7y)£23°ëZÊ>ý,­ØŠ3ÉâÙvñmkSX±X&2½ÇZ˜å«,øÝÒ;J†µHÙiZýtò”7bd»ÍŸÜ8÷Ï¢tCɉq*¿1ͧ(jÁ†Î”O™VÇ-2ÓF}Õ ÙÊ4aïSOÌOI4ÙE S`»MÚ–Ù†iNì”4F¬³;ø}B%yPyÍÐøù”‚ÊkbÛkDtnr+¿ÎÇôüæŒ*‡Wþò©Í©EK-¿œA.ל^÷!s}O[{£Š¢§ OÛ͘2æƒVÀ«ûÞN‡5¶_ðÒù —XÀíy¦µÚzäˆ8é¼)¹æmêC¢Ð³„a8a ºW'‚BeŽØØé&&·³¦Wµ¦sX@ê·Û¤…Ë®ò¸=&‹+D‹JÌq"àf¯à:ëíÝ£LÚû˜·É‹yŒYóU‡¸ô)[|ß[½¡NÉ!yÍWKÏëaôƒ*ÀcF³ýB¡ãW-bò)¿qg¤h<Ÿçíyìƒ<. 1ûÈ^É,#SÜ:[ †âüºrâYäwió÷¯¹@“k+iIÎ$þJ TlœÑVÈàðr5˜žË•=+Ì<€,ÕXîqôÎØø æûØyøƒeª£ü ¹PñXÖÖVÖÁ"°I•âôǯȩŸ¢”³€`&ýþ»&ÞÐ’DsLÝ|;ÖµÐÔjÃk$’½%xž¼—FZvÙ¹gŒ;Î ¢ÁoÊOõDh}OVƒÆ2‚Ô§Mœ½úØÅDÊdŠNs¯Þ'òÁê º÷èTE¼§c±ž[H ,N¼ËbÒ‘³yêk´9 a&âúß;¾Ÿ¡ìÚ«=Öñû…–Ï0\¦fc ¼¢º² §<6 ÅY‘¶Yœ¨û(¨Ü‰¯Çe.†M"1ª4;bfPa[‚gÏLý¢ÞJáÚÙ^¯0¨Ü¼ŒB¤8n²ìÈ´V°ûÁ ]¶£Žq-Vöüå;“ìÄo6! Ô»Ü‘³ /ñæAׯΠ·Aµ˜ !rÒü®È-Õa¥½;Ãù‰¯A"lؼMȲ!¥…ÓãûD½R“sÆdsX3orjæ2ýáñÂÕOlò‘¼TÁ€éHîEßÏiSùÈ(”g'3ˆ(Ú$¹TU§Íõká¹klŽÚŽ Û=DȦ­"ºo¶Ð?¹œ}l¼kGÊÉ_zÆbÕÌl>{µÕ°â Šj–=šSR»P{)*³Ë`+o¨ñsÉ“!ì)™¥3oµJÿÒ§_îuv‰ÇÌÁ—CÛçÔ¬õd} Ôo~¯è–*‹MÙ Ÿ…WÓ=Â6 ú”胱o Í)µF½æ¬êàE”‰¹ÍË&ÆÁ~ªëU¦¯\B‡]%Œ%J¸ÞS~‘¢á=i=¥„u·|±L”y¿åí!ŠzC}fGñmDkÑQôë“’æ·³“ú½Õ vûÄ\º«_ŠÁ?f‚ÜïZÂWM²Ñ=u¿™}ÿ¤Í÷«p¡_Øñ›„¨Ì‘¬ðÁ/Ù]†ðŒ%#®v7£Í qûû9×Yáê<‚‡ê´Šý ã¢Ù\>èÜPf:<ï#ŸLrSu»·Ÿ­”#C’ýƒ†7‰ÕÎ^ o„×£TÂç¬ö…"í£3­Fø3ˆ0š¢\¿‚ x±”<)꜆¨Öõ¢üCŽ:½üz>šhÖÛøËqîłԌ6‚ݶ•à“bìr 빫• ¿ïîÂڥÌhà ‹ÎE7ç‡ïmüpÏ…kÂfQ6j Z¢åw{s°Ùf˜PÌ ßžÎÁÛ•¼…·¦„K™ÀÁo0Fšn\"IlÅþ|äã´Þÿ|´›çh‰"ž¥¾Ž1Jr¢ÔF2¯ ü¥1x.¤6”:—°˜Õ@3Ûþž_M6sÒ~~:I®-ó"¸ñþƒOF!í¸þ)þgÂxþÝÙèg„F½ÄO=4àÛbgKyÒåómè%AúQâ§âú¢SO‹WÔ9¼™¤;aÕ­R|‰/ý~›^rÄÕáÏéz_âíKÑDNRúïŸï÷m5xÀ¾ñè÷*ƒîXµÅçrdIËÒ¶ò󖺔\|ý†2¤HÉN¤›ûË÷¯ö¨.$(?·ÃAñÄæ7™¶wµ¾ù)çæŸ^™è$Gjrtª¼2ãìfžZ4{hŸ3æÏqVb¥làN›À2Kàõ«»¶òL˜í•Û=ÕNù|º$FçùõÝøòLàiilÁüR#•PÅ£j·òÚ'é çë³"ABºYÛ4Ïg-¬WoŒ?lñ¼Iáʨêªütž¶?»æJ9ä½]’‡øc5  çm$à/kRFk£ðS2¶Pvõ¤Æ$,î1ÛÚHt4ñ#e_IÖŒ]˜² ¶\“ÝgŠ<|B© ò†œmiÖØš}hl*ŸVêf‹á¼ó(%õ 2bóþ_<¨9¸oÌ$cæyKìÓü'ê´.Í-ˆ]?7: Ît=ù‘–ÎÖå'ág,˜Üb§4÷Ì­ h:#î7_GÍvúeòÀ§Ïí Ž÷¶éøMõÑ7¤uDâ÷È!»¬Þ;5=°Êä}õ+¸…‡‘G¯ír½3ýeެ1Ñ=eüÞ¹J¶Âsª{zj¿?v¾)r™‘ •_&P8ø¡)næ!³{‚;f"K(#kZ˺ó²;Ñ Ýt$Á—‹ÁY Éë‹T ‚×K!&* Äë=gÏ”Ðû9~+¸Òå;äµPYl1ùϸkÖeݳ#éúGàzÂb œÒQ`4ä•kæ%î¼ F¤ØæÎ„»<84 »n+•ñnîºß ukŒ¶ÅK6”2A=ëðu½RÌŸPÅv‡—å';&¬éÝ!ÐÔH³_[@2ýŽ^}˪ªèéc²ÞÜ")œx·i£Sõ~`C:…Œ/âØ|Â!cR7MÙ«NJ|ý\q[§øù–ÔAÿÜÐÛ×eõß<,±7Ö~•âkHŸrÁM›é]£Õô—öTg&½cï¦gt¥êº\ݵ­ÙÌ8ü((mšãgšÒ$3È(Í\(£jÛÖ; w­Yãâ…½þ«Å´âã‹RÀ ÓÌ1,þ^1¾·½%=q é •½Où{, ©4VÖ4J”ê¯"‹›háÆNÔX®zt×l£î+íÝ —Ü]iU²³Œé—åPõjUËèIc yŒé³üpW衵ò+$Ïu=8 CW_Ï9†­HÉ5ìåbÒ.klÜ`4æùuÐz…ë–ዠǧ&Ømç ÊK¡éÀyý³êÔkëbíj¶S~!ª`á/0 vテ³ß†–•æÞ¥¾äwf`›~Øù¨»ë4Î{ÿ*ªD€ ¸cµø­çQñ§%ÞÏL÷ÃìC`µ¾¥¤-!ýAŽJ3SïH[AÊÓ×Å=2š´Ö]¯Õo±hñ½¦j›Õ{ÖÐ"âoFZí§é³ÍÌ_i¶r»0 “‡ú>˜ãâÈ-3«³¯ 0üÐÍŸúJãc°&OO欗ê²\ät#Ÿ4( 4«ŸáÑ`-áë“oÜc⬖jQZÇÅob¤ÅD£ ð, ¼ Ô›ÅÙÝI=]®Æ®ªmϰ]¾Œ†&Í=®ºª°9P©\SZk&­¥—ö½½jCÈŠ˜nnk˜ò—nH·õöŒðm¦®OÚK7œáÂÉúÏawµïK…“…ŠšãL«óLhˆ=îüéj}¾ÜãÇëþ2”BÌä7øª.èU|÷QÛPÎ7-9“9–€dÙ‰€X VsÏv¬ñwºWù(xN&ù>Ò¢-’éP™?Œ„qÙ¿úzZ©ò̵FøótD£?ÑeMGìS¾¤eƒ³¬G“‰uËbˆÙvÆÛéA]¹ç wNG:i¾¹IwdOêS¼ÌT5Óý0†½Ì똪êÑœJOO¦jxPÇiçcA+:Oˆ~ç*‹‘þŸÊSjq¾XóŽ ô®Ñ#Ü¿ÆïÈ÷ÖÒW÷4ë2”}ÞYîõ‘cnmŸÅOº†’ æÄiF:?ÜXbl¸) Ë%jÄ!\|eŽÂ¹aãûpEJ˜“c´ïF+<ˆeõÝ; ¹Ÿà8Ò ©œp1×2ö·›Mǽ\“¨(ß¿¹ª3j„¾c×Ûü²?/ÊwŒèЍé‘Ö½ª#‘Á»XEp$ ÞQs+ˆ]#ú|åáU÷É„GÌ‚Òü5¬ˆ|VÖ§_]}n:†s*CT'>ÕœqùD=Ö7{ŒûYWµŒoúŸÇ2eüX{óKyíJ ~bü‘ã6O*XI-˜ ­£IùS%£>`®Ò·ù»Ó³ÿ’}|O[q‡Žî*Rúavm{>¯äÌÚ(þtÖ£%ãDáV›*4¥ÙÎb y`Ñ™¨åÌàûå«òàÞ˜kõ}ðÛ÷oìj¦Ld·o{Rž¸döËxpêwòÑnnËfÃóF¿ÓÅ’¡bò ~-œ¡Œö–XIS8^i’7Yi½aìWN°™+Rêà-ŽÔH6² ¶Œ'ƒ×J®ò`·9TÛÅÓsðµ9 ‡ž~3€ÜO²ê–>€=ž™x×_/D« v߈€C0ü!ÀÅFŒõô ¿ÄL¡ì©™½d™ñrÇ©Ùô®‡%qçìË9âûW¯Â âìÒ^j‡úåIvê[L6àØbžä÷ñž_zgÛÉ{ XùÒƒTáñ\ÃðLJ¨¡l”yˆ^¸H8?ÑÒpªß¥ÄÛÞN§ON$¬eeSF cQ=•]† ¹²ðbZf =3tÊ}Ð8û?¦){_ÿ&·†«ñ)÷?HT’ÁÖ5ÖÀ'–c¿S±¥Q!SæÙ+N?T ¡7òDVJ" ÷S®C…W%ðmÈøü¤:[Þ8ýÛS¡‡ «¥ù‡‘ÔÓE-{ú¦ ôýVãhŸtI7mÓͦ ½Eÿ1J˜î,v²3Zê íÔP‘¼ýO­;>æÇ#|çì??ñk#¼½ ÇGnÌñš¡ðéìau5.¢/»“ôåÀž›W5jÖ—×~ä1‚æòN<éþ¾FÅ©5µ’Ь.ÖWl¨›ÒÄÛµøÙsCvˆ¡8¾¾CwlK7ù"•ç¬è)!2yn»ÔdÈœöÑM¤MB›)ì4zñ=ˆOõ¦ Ýî;Ô&à§šJEKÈQŠáÅø”l›|VúM¬JNÿwW›j+U›—özж“öb¢Â7å¡T,TAÇúÒ° •¢¹>t];¡ŸeŒØg·žÀ,yýòÛ”åI<×éÚêxC%=‰á¤eÓö­»­¢eê…  °÷4½6Þýð$GÃóø›ôÁün9¥¥ûZÔÏÒVXHZÓrЙ|[x…ØýW´$˜1ýZ|~bd»IÉÍá<´WóílDèÅÉgß/¨ÑÃõMÕóí–¿Ò?(Öa‹4­z VNYA—£©'ëU’Kk™_ÿð"Xïoó2›K©ª£ ñ÷™úåå©ÃN,×Å®ß ²¤ÞºHR;Ÿˆ‹^¸õðëí‡ëo€½ŠD)ÿZÐs€ño*´ˆwlu´&*ºœ°ž:D“Ç?G¿Ìè°-z5 à~ 7GR}ØÅÞ{ô·[cϺØqµÿ~ìÓûF¼±a$02áü\©moà…÷Ùc³¤÷`™ÛkíSþâ‘´CkNãþnT{C¡ír!˜çÕñ(Õ)ÇæÖuy8=KÐâêÚ¬›œ„âèŒî_x šÝò\¤¥£9È÷ê–I1a¨cmÖOÄžÚ”_oZ/©Y—¹Ž!Þ¥=cz5Ó4:±ÖNtñüNq§±FÈ–—”¤^?\N>ÊeÚôž ç^Ö5SrŠì…è¹I\ÉûM”Zǂکê#t|æ¡¡C-ŽÑ(¥ž›I{ÅȪ7–GæIèö),{ÖO"ÏžÝâðùIÓXÃ…¢ßжuô-ygªZQë/g÷Ç ¹™,óûm/ÒµŸÞM5.-:9;›„P“R¬˜úI‡ÑÂ[„V;|(ÅæZ*Œk.¨ÓÎt“ëõø–w}{NURäÂèÛ@·ðf_ë—±ëþ?¡ ^ô¥?˜e!£M-ö¤ùB—ÎÕÆpÐ2Uv…L¸©uC³šúqÁ!”Eæ¤J…4\ü*ÀExÂîühIÊÜdãš!Ý!—ñÜË-ÇåÇÚu‘ëâ-ó½F`ö™ªÎ9iÂE&ýÓ#éÆñ™q "¼L8o«âÖ WyK7Ûãâeè_È#›u$˜—”è.7•x_FuàóXƒtE¿nÒoØÀäîbÁ'Âwñ»ºOö¼ÖÖ~—é‚<¬o/Ü‘PŒ7Ž~½Í>e¤ý]Ò§b$¿D¨Qã BÓW®%¿½Ðp ௺®G<'î]åŸK¤Ñ>–wÒ&7¼ÿÖmyÎe|ÐpÁ–302OI˜Ù;ûïq‹ûÍéñ^W»C!¯Åilj½+Ê0„…t«ÍôkýµÕƒ<ªÂ ¤Éóã30àìTã'LÖ <àÞ-l¾:ÍIêÙï«î»‹™Í™®{ ò<Û…ìeo-ŽÉµøÌ Í»ä)ž.+ÞïsRR„sDiëræ’¤ÓqèŠÚ¯iû™a§ïRh•RäM­ç'fª9 }œý¢c%¬‘»KˆCq{â°ªë]ã´ š%hný]Ÿîý‚=¼˜œMòvZRý*'YFBëšØGWgÿ®w3qQg–m~1Q5× pb]¤;Á‰ö¡Ö>Ãpݪ¢)J®ÑM›‘Žf8fXÞhÅ| H,ñâÊiKEÔAÎ,¤nGÖQV9m+\÷âÀW=‚ z6HO9ÿÖ‚.}Õ]6û£°º½Æ‹‘qJ»NŒªG¸“ʘ¹ÛÿHG“ò²Õ‰†´—y“ÈP×÷GçÏ1Çešy‰6JxaÉ|È)ýÌ5nŽ=ÄÏ©7'µ£ÁÇoVõ£zÉJt=æ;zƒ•jÖà±X€Rì”´ tª¯ˉt¿ðK…üøšlé|­îïìôG5÷²ˆûA ÝæÏ^eÄZ1ýâ~Hø9˜ªAºréÉu ì67â†7ßÅ>ó§Kyõ÷=„rÁ«ûpªn6Jgá©K04Ž4í‡,Å&q…4L K=©M]1L±j”j½´åžØ½VI”Âd$åC³û/ƒ‰†hÂËÉÉGPÛ$Ñ)Oó"ÅJÿÓ̵Œœ A®‡°öš+`]³ŸÀ_(Ó³ÙË• ªŸ-¼QÑÂ5•®­²Ö·ípðƒ“àq€bÑÛ;"GO@ƒŸoñÍnõHË ‡YŽ4³8ƒ–ÉËõ¤®Ö-ÚšÈÖyˆ Õ¢HÏ ƒˆÛÈà C¸©V‡Ÿ8Úõ~ÿMV±°w3Ĭ«ÕA­ýs}™·üŸÉ`ñp®_1uwEëG­‡pT›PL«¶a°)¶ìë3:,ã&Õ‹•Êš^S4Þj^Ö°Ò2VÃÑv6¦û~bø²ÀÏ~ùøúÞ…«õmGêœÒUf)¡Pn';r.·´7Ú{'³U|Žnë:nÛT¿ªæ´ŠËe[œµþG¤£†ÃAìCDÄ— yáá¡ÓzßÕœ*ѦS«.Þ-´±¼®Y~)ºû(KÃûC êG€Ù´ 7Ⓨ2ž,Úa×XžŒTÆý8‡³»Y^ ˜è, :Ò³Î`­¦ÊLªúåð…¶‚09 w—âix Šù÷ê$y/ÌS1Äyà’ÐÆ£n¥BAQYÍ@ûË@âÚ#¤ºíÿÀÅ»Ÿé|°}½¹ä²¤Õ8"÷7’ú`ž^|ÝF¡ 3¯JÌÌíRÄ„[ÐQm7x»fô¼ËI™Ô†Fç3 :|‹ fý %˜zñ¼,D8¦sEqÚ%à?¤#~±åàG;á–‹ŽÌÐF—bSwörúÓ‡ù6$ú {}df"]¿ê›0Ô”A¶³œœ¸W`Õàšíþh¶qDó'ÌHSíHŠnjh€0WTè@e?Ì\“á ±Øº!…Ìaý4TÚ#-϶_f²P+Ž…åo=<†« Í·3•@Ag =àû¬Ïx9ó–‹%%\È´Qx׃ôÐaÙš¦ßùhîàž¯:æ-Þ„°maÍ<7•¢+Mà´;; "ܚஸÛN}IÓ"ìMc{©!Dë1̺K9Z€Q¼Š“näç÷‹*°QJ¡†˜/GÚGΆ© "¦aSå»Ï •¥;a½®Ü¸#ϬãTu¸´‚rcI\eõ6K¹RÎæ–Ç÷ËÞþ•ŠÉ;]vÆYª ±·¢'r‘ñâŸ/‘»i€”Žùi€ÞÈ禣[*×Ú1D–Œ†Ú´*àgÈ#Õ©¡p…½W§·zQ~ËlTtdíû÷6·gæáP«b+èþ¹EÅ?|éL?†&^cò¡¦½¼TÓF$ijx³•È9”W¿g°„0–|»£Ä!D½&¾ñ¡[Z|æöjô\#ÌAúg\*·æÞyz¡<ºõÍ%sÿBߢvôŸ$U¨8Ä¿2§EVp;'vþ:®1´«%ÈŽ^ÏZš`’r.ªZÎ L.7c’?²Üƒh¨‰4%ÚÄn+§˜Œé#¿GÔZjDZ;ùE@£˜½õökϼFo/̆\rŠÞ>¶ÀK éào_±¸ ½«ºSP¼Xr{Ç& _Ïa*èà 2%¶¾ð£…¥ßv£¸Ã5jt*¾_ƒÙAk­jð«›Tÿ³ÚöF¢Ôið$/r~W5–±ô¢Ã]Úo£Z ~Qp¼k5ôFôêJ=¬«3kˆ ɶRlUÍ"@^¯sÔlb5AÄœª=&C-k#OYe1Hæêܯýó@^òã1eE%„«ñT 5…X`Õ÷Áíôå+JÏLا{йòIXM]V #D=¨Ò›g­Ñ­ ”}¼bÀ!IìØ}ï!,ÉØlb„s—"¶&¯²äQЯŸ°fÇjbéþxLkj¸­)V%-)ÖˆŒñ±í{¨Cø[hÐîþä1†XRÌÆL<›v áD­ÁI..¡]뤌üXLL=PŸIjtOès÷Å›ÎR²|³Ë¯³Í ê ~s¸œ÷¦] wÈÏDÀdKYNÙ· þ‡¼³Õ{Ï”&ÈÐH“s ]ýpqKE!¢G¸N»Uó¹;:ÉŸsøLè"»aÆa¼B•Ù?ƒâ½Ö¸Îèç‹{ ].ò³SgGU öݳZö‘ |£ @®úÛAþš¯J†üÐÇâŽr„J/…IâSôe22’^¡L°žFf3pGGWõìlµ‡4K•Œ+_0@èA®0µ7) Æ(8Z{½&¾:}ãˆ6º²ê¾Ý8ˆ9ˆþy¹øhhCµ–ÒUµTÁƸ*ƒñd~û„p‹xíÉ1?ÐzùC RHP]Ý#àÁÜ4ø@¢÷wÎcÓ×p¤ÅšŽÚ1 endstream endobj 278 0 obj << /Type /FontDescriptor /FontName /XCBNXE+CMTT10 /Flags 4 /FontBBox [-4 -233 537 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/L/M/N/O/P/Q/R/S/T/U/V/X/Y/a/ampersand/b/bracketleft/bracketright/c/colon/d/dollar/e/eight/equal/f/five/four/g/h/hyphen/i/j/k/l/less/m/n/nine/o/one/p/parenleft/parenright/period/plus/q/question/quotedbl/r/s/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) /FontFile 277 0 R >> endobj 146 0 obj << /Type /Font /Subtype /Type1 /BaseFont /QSRRRH+CMBX10 /FontDescriptor 262 0 R /FirstChar 46 /LastChar 121 /Widths 257 0 R >> endobj 143 0 obj << /Type /Font /Subtype /Type1 /BaseFont /IJYDFF+CMBX12 /FontDescriptor 264 0 R /FirstChar 46 /LastChar 121 /Widths 259 0 R >> endobj 155 0 obj << /Type /Font /Subtype /Type1 /BaseFont /MLFHHY+CMBXTI10 /FontDescriptor 266 0 R /FirstChar 71 /LastChar 115 /Widths 254 0 R >> endobj 147 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VVLDLP+CMR10 /FontDescriptor 268 0 R /FirstChar 11 /LastChar 122 /Widths 256 0 R >> endobj 144 0 obj << /Type /Font /Subtype /Type1 /BaseFont /WRNJHG+CMR12 /FontDescriptor 270 0 R /FirstChar 44 /LastChar 119 /Widths 258 0 R >> endobj 142 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XEWKYT+CMR17 /FontDescriptor 272 0 R /FirstChar 84 /LastChar 112 /Widths 260 0 R >> endobj 161 0 obj << /Type /Font /Subtype /Type1 /BaseFont /DPTOCF+CMSLTT10 /FontDescriptor 274 0 R /FirstChar 34 /LastChar 126 /Widths 252 0 R >> endobj 148 0 obj << /Type /Font /Subtype /Type1 /BaseFont /SDBLLA+CMTI10 /FontDescriptor 276 0 R /FirstChar 11 /LastChar 121 /Widths 255 0 R >> endobj 160 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XCBNXE+CMTT10 /FontDescriptor 278 0 R /FirstChar 34 /LastChar 122 /Widths 253 0 R >> endobj 149 0 obj << /Type /Pages /Count 6 /Parent 279 0 R /Kids [110 0 R 152 0 R 157 0 R 163 0 R 167 0 R 175 0 R] >> endobj 190 0 obj << /Type /Pages /Count 6 /Parent 279 0 R /Kids [185 0 R 192 0 R 199 0 R 211 0 R 215 0 R 220 0 R] >> endobj 229 0 obj << /Type /Pages /Count 4 /Parent 279 0 R /Kids [226 0 R 234 0 R 245 0 R 249 0 R] >> endobj 279 0 obj << /Type /Pages /Count 16 /Kids [149 0 R 190 0 R 229 0 R] >> endobj 280 0 obj << /Type /Outlines /First 3 0 R /Last 107 0 R /Count 6 >> endobj 107 0 obj << /Title 108 0 R /A 105 0 R /Parent 280 0 R /Prev 91 0 R >> endobj 103 0 obj << /Title 104 0 R /A 101 0 R /Parent 91 0 R /Prev 99 0 R >> endobj 99 0 obj << /Title 100 0 R /A 97 0 R /Parent 91 0 R /Prev 95 0 R /Next 103 0 R >> endobj 95 0 obj << /Title 96 0 R /A 93 0 R /Parent 91 0 R /Next 99 0 R >> endobj 91 0 obj << /Title 92 0 R /A 89 0 R /Parent 280 0 R /Prev 79 0 R /Next 107 0 R /First 95 0 R /Last 103 0 R /Count -3 >> endobj 87 0 obj << /Title 88 0 R /A 85 0 R /Parent 79 0 R /Prev 83 0 R >> endobj 83 0 obj << /Title 84 0 R /A 81 0 R /Parent 79 0 R /Next 87 0 R >> endobj 79 0 obj << /Title 80 0 R /A 77 0 R /Parent 280 0 R /Prev 59 0 R /Next 91 0 R /First 83 0 R /Last 87 0 R /Count -2 >> endobj 75 0 obj << /Title 76 0 R /A 73 0 R /Parent 67 0 R /Prev 71 0 R >> endobj 71 0 obj << /Title 72 0 R /A 69 0 R /Parent 67 0 R /Next 75 0 R >> endobj 67 0 obj << /Title 68 0 R /A 65 0 R /Parent 59 0 R /Prev 63 0 R /First 71 0 R /Last 75 0 R /Count -2 >> endobj 63 0 obj << /Title 64 0 R /A 61 0 R /Parent 59 0 R /Next 67 0 R >> endobj 59 0 obj << /Title 60 0 R /A 57 0 R /Parent 280 0 R /Prev 7 0 R /Next 79 0 R /First 63 0 R /Last 67 0 R /Count -2 >> endobj 55 0 obj << /Title 56 0 R /A 53 0 R /Parent 31 0 R /Prev 51 0 R >> endobj 51 0 obj << /Title 52 0 R /A 49 0 R /Parent 31 0 R /Prev 47 0 R /Next 55 0 R >> endobj 47 0 obj << /Title 48 0 R /A 45 0 R /Parent 31 0 R /Prev 43 0 R /Next 51 0 R >> endobj 43 0 obj << /Title 44 0 R /A 41 0 R /Parent 31 0 R /Prev 39 0 R /Next 47 0 R >> endobj 39 0 obj << /Title 40 0 R /A 37 0 R /Parent 31 0 R /Prev 35 0 R /Next 43 0 R >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R /Parent 31 0 R /Next 39 0 R >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R /Parent 7 0 R /Prev 11 0 R /First 35 0 R /Last 55 0 R /Count -6 >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R /Parent 11 0 R /Prev 23 0 R >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 11 0 R /Prev 19 0 R /Next 27 0 R >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 11 0 R /Prev 15 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 11 0 R /Next 19 0 R >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 7 0 R /Next 31 0 R /First 15 0 R /Last 27 0 R /Count -4 >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 280 0 R /Prev 3 0 R /Next 59 0 R /First 11 0 R /Last 31 0 R /Count -2 >> endobj 3 0 obj << /Title 4 0 R /A 1 0 R /Parent 280 0 R /Next 7 0 R >> endobj 281 0 obj << /Names [(Doc-Start) 141 0 R (Item.1) 171 0 R (Item.10) 197 0 R (Item.11) 203 0 R (Item.12) 204 0 R (Item.13) 206 0 R] /Limits [(Doc-Start) (Item.13)] >> endobj 282 0 obj << /Names [(Item.14) 207 0 R (Item.15) 208 0 R (Item.16) 237 0 R (Item.17) 239 0 R (Item.18) 240 0 R (Item.19) 241 0 R] /Limits [(Item.14) (Item.19)] >> endobj 283 0 obj << /Names [(Item.2) 172 0 R (Item.20) 242 0 R (Item.21) 243 0 R (Item.3) 173 0 R (Item.4) 179 0 R (Item.5) 181 0 R] /Limits [(Item.2) (Item.5)] >> endobj 284 0 obj << /Names [(Item.6) 182 0 R (Item.7) 183 0 R (Item.8) 189 0 R (Item.9) 196 0 R (page.1) 140 0 R (page.10) 213 0 R] /Limits [(Item.6) (page.10)] >> endobj 285 0 obj << /Names [(page.11) 217 0 R (page.12) 222 0 R (page.13) 228 0 R (page.14) 236 0 R (page.15) 247 0 R (page.16) 251 0 R] /Limits [(page.11) (page.16)] >> endobj 286 0 obj << /Names [(page.2) 154 0 R (page.3) 159 0 R (page.4) 165 0 R (page.5) 169 0 R (page.6) 177 0 R (page.7) 187 0 R] /Limits [(page.2) (page.7)] >> endobj 287 0 obj << /Names [(page.8) 194 0 R (page.9) 201 0 R (section*.1) 145 0 R (section*.2) 170 0 R (section*.3) 178 0 R (section*.4) 180 0 R] /Limits [(page.8) (section*.4)] >> endobj 288 0 obj << /Names [(section*.5) 188 0 R (section*.6) 195 0 R (section*.7) 202 0 R (section*.8) 205 0 R (section.1) 2 0 R (section.2) 6 0 R] /Limits [(section*.5) (section.2)] >> endobj 289 0 obj << /Names [(section.3) 58 0 R (section.4) 78 0 R (section.5) 90 0 R (section.6) 106 0 R (subsection.2.1) 10 0 R (subsection.2.2) 30 0 R] /Limits [(section.3) (subsection.2.2)] >> endobj 290 0 obj << /Names [(subsection.3.1) 62 0 R (subsection.3.2) 66 0 R (subsection.4.1) 82 0 R (subsection.4.2) 86 0 R (subsection.5.1) 94 0 R (subsection.5.2) 98 0 R] /Limits [(subsection.3.1) (subsection.5.2)] >> endobj 291 0 obj << /Names [(subsection.5.3) 102 0 R (subsubsection.2.1.1) 14 0 R (subsubsection.2.1.2) 18 0 R (subsubsection.2.1.3) 22 0 R (subsubsection.2.1.4) 26 0 R (subsubsection.2.2.1) 34 0 R] /Limits [(subsection.5.3) (subsubsection.2.2.1)] >> endobj 292 0 obj << /Names [(subsubsection.2.2.2) 38 0 R (subsubsection.2.2.3) 42 0 R (subsubsection.2.2.4) 46 0 R (subsubsection.2.2.5) 50 0 R (subsubsection.2.2.6) 54 0 R (subsubsection.3.2.1) 70 0 R] /Limits [(subsubsection.2.2.2) (subsubsection.3.2.1)] >> endobj 293 0 obj << /Names [(subsubsection.3.2.2) 74 0 R] /Limits [(subsubsection.3.2.2) (subsubsection.3.2.2)] >> endobj 294 0 obj << /Kids [281 0 R 282 0 R 283 0 R 284 0 R 285 0 R 286 0 R] /Limits [(Doc-Start) (page.7)] >> endobj 295 0 obj << /Kids [287 0 R 288 0 R 289 0 R 290 0 R 291 0 R 292 0 R] /Limits [(page.8) (subsubsection.3.2.1)] >> endobj 296 0 obj << /Kids [293 0 R] /Limits [(subsubsection.3.2.2) (subsubsection.3.2.2)] >> endobj 297 0 obj << /Kids [294 0 R 295 0 R 296 0 R] /Limits [(Doc-Start) (subsubsection.3.2.2)] >> endobj 298 0 obj << /Dests 297 0 R >> endobj 299 0 obj << /Type /Catalog /Pages 279 0 R /Outlines 280 0 R /Names 298 0 R /PageMode/UseOutlines /OpenAction 109 0 R >> endobj 300 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.10)/Keywords() /CreationDate (D:20131014204642-07'00') /ModDate (D:20131014204642-07'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0) >> endobj xref 0 301 0000000000 65535 f 0000000015 00000 n 0000012793 00000 n 0000341358 00000 n 0000000060 00000 n 0000000090 00000 n 0000012853 00000 n 0000341237 00000 n 0000000135 00000 n 0000000194 00000 n 0000012913 00000 n 0000341128 00000 n 0000000244 00000 n 0000000291 00000 n 0000012974 00000 n 0000341054 00000 n 0000000347 00000 n 0000000390 00000 n 0000019690 00000 n 0000340967 00000 n 0000000446 00000 n 0000000492 00000 n 0000019999 00000 n 0000340880 00000 n 0000000548 00000 n 0000000587 00000 n 0000023034 00000 n 0000340806 00000 n 0000000643 00000 n 0000000692 00000 n 0000023341 00000 n 0000340696 00000 n 0000000743 00000 n 0000000801 00000 n 0000026347 00000 n 0000340622 00000 n 0000000857 00000 n 0000000894 00000 n 0000026408 00000 n 0000340535 00000 n 0000000950 00000 n 0000000985 00000 n 0000026593 00000 n 0000340448 00000 n 0000001041 00000 n 0000001077 00000 n 0000029334 00000 n 0000340361 00000 n 0000001133 00000 n 0000001162 00000 n 0000029395 00000 n 0000340274 00000 n 0000001218 00000 n 0000001277 00000 n 0000031727 00000 n 0000340200 00000 n 0000001333 00000 n 0000001372 00000 n 0000033968 00000 n 0000340076 00000 n 0000001418 00000 n 0000001469 00000 n 0000034029 00000 n 0000340002 00000 n 0000001520 00000 n 0000001573 00000 n 0000172866 00000 n 0000339891 00000 n 0000001624 00000 n 0000001660 00000 n 0000172927 00000 n 0000339817 00000 n 0000001716 00000 n 0000001753 00000 n 0000176108 00000 n 0000339743 00000 n 0000001809 00000 n 0000001850 00000 n 0000176169 00000 n 0000339618 00000 n 0000001896 00000 n 0000001937 00000 n 0000176230 00000 n 0000339544 00000 n 0000001988 00000 n 0000002038 00000 n 0000179366 00000 n 0000339470 00000 n 0000002089 00000 n 0000002134 00000 n 0000179427 00000 n 0000339343 00000 n 0000002180 00000 n 0000002227 00000 n 0000179488 00000 n 0000339269 00000 n 0000002278 00000 n 0000002330 00000 n 0000184018 00000 n 0000339180 00000 n 0000002381 00000 n 0000002465 00000 n 0000184079 00000 n 0000339103 00000 n 0000002517 00000 n 0000002596 00000 n 0000185954 00000 n 0000339025 00000 n 0000002643 00000 n 0000002673 00000 n 0000004343 00000 n 0000004683 00000 n 0000004834 00000 n 0000004986 00000 n 0000005143 00000 n 0000005304 00000 n 0000005465 00000 n 0000005626 00000 n 0000005787 00000 n 0000005944 00000 n 0000006105 00000 n 0000006266 00000 n 0000006427 00000 n 0000006587 00000 n 0000006748 00000 n 0000006909 00000 n 0000007061 00000 n 0000007218 00000 n 0000007375 00000 n 0000007536 00000 n 0000007697 00000 n 0000007849 00000 n 0000008006 00000 n 0000008163 00000 n 0000008315 00000 n 0000008471 00000 n 0000008628 00000 n 0000008783 00000 n 0000009120 00000 n 0000002725 00000 n 0000008935 00000 n 0000008996 00000 n 0000337960 00000 n 0000337384 00000 n 0000337817 00000 n 0000009058 00000 n 0000337240 00000 n 0000337674 00000 n 0000338249 00000 n 0000338537 00000 n 0000012570 00000 n 0000013035 00000 n 0000012438 00000 n 0000009256 00000 n 0000012732 00000 n 0000337528 00000 n 0000015061 00000 n 0000014888 00000 n 0000013158 00000 n 0000015000 00000 n 0000338393 00000 n 0000338103 00000 n 0000016940 00000 n 0000016767 00000 n 0000015184 00000 n 0000016879 00000 n 0000020060 00000 n 0000019517 00000 n 0000017050 00000 n 0000019629 00000 n 0000019751 00000 n 0000019813 00000 n 0000019875 00000 n 0000019937 00000 n 0000023402 00000 n 0000022737 00000 n 0000020196 00000 n 0000022849 00000 n 0000022910 00000 n 0000022972 00000 n 0000023095 00000 n 0000023157 00000 n 0000023219 00000 n 0000023281 00000 n 0000026654 00000 n 0000026174 00000 n 0000023538 00000 n 0000026286 00000 n 0000026469 00000 n 0000026531 00000 n 0000338654 00000 n 0000029456 00000 n 0000028975 00000 n 0000026777 00000 n 0000029087 00000 n 0000029148 00000 n 0000029210 00000 n 0000029272 00000 n 0000032035 00000 n 0000031369 00000 n 0000029579 00000 n 0000031481 00000 n 0000031542 00000 n 0000031604 00000 n 0000031665 00000 n 0000031787 00000 n 0000031849 00000 n 0000031911 00000 n 0000031973 00000 n 0000035878 00000 n 0000034090 00000 n 0000033795 00000 n 0000032158 00000 n 0000033907 00000 n 0000172988 00000 n 0000035766 00000 n 0000034226 00000 n 0000172805 00000 n 0000171945 00000 n 0000176291 00000 n 0000175935 00000 n 0000173168 00000 n 0000176047 00000 n 0000179118 00000 n 0000182636 00000 n 0000179549 00000 n 0000178986 00000 n 0000176427 00000 n 0000179305 00000 n 0000338771 00000 n 0000183010 00000 n 0000183189 00000 n 0000183384 00000 n 0000184141 00000 n 0000182472 00000 n 0000179685 00000 n 0000183585 00000 n 0000183646 00000 n 0000182823 00000 n 0000183708 00000 n 0000183770 00000 n 0000183832 00000 n 0000183894 00000 n 0000183956 00000 n 0000186014 00000 n 0000185781 00000 n 0000184251 00000 n 0000185893 00000 n 0000186959 00000 n 0000186786 00000 n 0000186137 00000 n 0000186898 00000 n 0000187043 00000 n 0000187434 00000 n 0000187809 00000 n 0000188086 00000 n 0000188749 00000 n 0000189372 00000 n 0000189811 00000 n 0000190229 00000 n 0000190678 00000 n 0000190871 00000 n 0000209487 00000 n 0000209830 00000 n 0000226527 00000 n 0000226873 00000 n 0000235508 00000 n 0000235745 00000 n 0000259733 00000 n 0000260217 00000 n 0000270671 00000 n 0000270947 00000 n 0000279394 00000 n 0000279626 00000 n 0000299384 00000 n 0000299943 00000 n 0000316485 00000 n 0000316796 00000 n 0000336744 00000 n 0000338872 00000 n 0000338950 00000 n 0000341429 00000 n 0000341602 00000 n 0000341772 00000 n 0000341936 00000 n 0000342100 00000 n 0000342270 00000 n 0000342432 00000 n 0000342614 00000 n 0000342801 00000 n 0000342997 00000 n 0000343217 00000 n 0000343468 00000 n 0000343728 00000 n 0000343843 00000 n 0000343953 00000 n 0000344073 00000 n 0000344166 00000 n 0000344265 00000 n 0000344303 00000 n 0000344431 00000 n trailer << /Size 301 /Root 299 0 R /Info 300 0 R /ID [ ] >> startxref 344757 %%EOF rtracklayer/inst/extdata/0000755000126300012640000000000012227067671017101 5ustar00biocbuildphs_compbiortracklayer/inst/extdata/demo.narrowPeak.gz0000644000126300012640000000035112227067671022476 0ustar00biocbuildphs_compbio‹¿‰Qdemo.narrowPeakEÐ9nÄ0 Кs•À÷å<©sÿ"”#M C¶õô©÷÷7T«¬%¼æáÀ$‡B¯l¢û‹•YÜï«Äèõ~¶›w±¶Ï ò ºâ9XÜD/y·Ñ^‚Øö b^ƒ=¢ Lxœcb``8ñ¨ƒùËãf(`B$±ý°? òà¬h$ppxœc```(xÐÁüáwsÃаŸÁa?ƒó†„WÎŒ@‘/;˜Kþw0s°ƒå÷±=à †A–:˜=þu0ë€30ì‡`±Ã Óœ  à¬h$pàˆHþˆbpàˆHþˆÀaZxœc```(xÐÁ\à×ÉÁä04ìg`pØÏàÀ|„!á•3#PäËãæ/Ìì`ù}@lÏp@Ã…!@ФåÄ£æÌ: Å û!Xì0Ã4'˜ãšà¬h$pàˆÈP‰´ÂpàˆÈP‰ZÂZ&üˆrtracklayer/inst/tests/bed.wig0000644000126300012640000000060212227067667020056 0ustar00biocbuildphs_compbiotrack type=wiggle_0 name="Bed Format" description="BED format" visibility=full color=200,100,0 altColor=0,100,200 priority=20 chr1 59102000 59102300 -1.0 chr1 59102300 59102600 -0.75 chr5 59102600 59102900 -0.50 chr19 59102900 59103200 -0.25 chr19 59103200 59103500 0.0 chr19 59103500 59103800 0.25 chr19 59103800 59104100 0.50 chr19 59104100 59104400 0.75 chr19 59104400 59104700 1.00 rtracklayer/inst/tests/genes.gff30000644000126300012640000000373612227067667020477 0ustar00biocbuildphs_compbio##gff-version 3 ##source-version rtracklayer 1.15.4 ##date 2011-12-06 chr10 rtracklayer gene 92828 95504 5 - . ID=GeneID:347688;Name=TUBB8;geneName=tubulin%2c beta 8;Alias=FLJ40100,TUBB8;genome=hg19 chr10 rtracklayer mRNA 92828 95178 . - . Parent=GeneID:347688;ID=873;Name=TUBB8; chr10 rtracklayer mRNA 92828 95504 . - . Parent=GeneID:347688;ID=872;Name=TUBB8; chr10 rtracklayer exon 92828 94054 . - . Parent=872,873; chr10 rtracklayer CDS 92997 94054 . - . Parent=872,873; chr10 rtracklayer exon 94555 94665 . - . Parent=872; chr10 rtracklayer exon 94555 94665 . - . Parent=873; chr10 rtracklayer CDS 94555 94615 . - . Parent=872; chr10 rtracklayer CDS 94555 94665 . - . Parent=873; chr10 rtracklayer exon 94744 94852 . - . Parent=872; chr10 rtracklayer exon 94744 94852 . - . Parent=873; chr10 rtracklayer CDS 94744 94852 . - . Parent=873; chr10 rtracklayer exon 95122 95178 . - . Parent=873; chr10 rtracklayer CDS 95122 95178 . - . Parent=873; chr10 rtracklayer exon 95348 95504 . . . Parent=872; chr12 rtracklayer gene 87984 91263 . + . ID=GeneID:100288778;Name=LOC100288778;geneName="WAS protein family homolog 1; pseudogene";Alias=LOC100288778 chr12 rtracklayer mRNA 87984 91263 . + . Parent=GeneID:100288778;ID=4644;Name=LOC100288778; chr12 rtracklayer exon 87984 88017 . + . Parent=4644; chr12 rtracklayer CDS 87984 88017 . + . Parent=4644; chr12 rtracklayer exon 88257 88392 . + . Parent=4644; chr12 rtracklayer CDS 88257 88392 . + . Parent=4644; chr12 rtracklayer exon 88570 88771 . + . Parent=4644; chr12 rtracklayer CDS 88570 88771 . + . Parent=4644; chr12 rtracklayer exon 88860 89018 . + . Parent=4644; chr12 rtracklayer CDS 88860 89018 . + . Parent=4644; chr12 rtracklayer exon 89675 89827 . + . Parent=4644; chr12 rtracklayer CDS 89675 89827 . + . Parent=4644; chr12 rtracklayer exon 90587 90655 . + . Parent=4644; chr12 rtracklayer CDS 90587 90655 . + . Parent=4644; chr12 rtracklayer exon 90796 91263 . + . Parent=4644; chr12 rtracklayer CDS 90796 91263 . ? . Parent=4644; > ACCCTGACTCCAGGATTACA rtracklayer/inst/tests/gtf.gff0000644000126300012640000000250012227067667020057 0ustar00biocbuildphs_compbioMm.16.ENSMUST00000040592.1 EnsEMBL exon 22572990 22573061 . - . gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310143.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL CDS 22572990 22573010 . - 0 gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310143.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL start_codon 22573008 22573010 . - 0 gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310143.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL exon 22568081 22568323 . - . gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310133.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL CDS 22568081 22568323 . - 0 gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310133.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL exon 22566859 22567246 . - . gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310124.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL CDS 22566977 22567246 . - 0 gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310124.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL stop_codon 22566974 22566976 . - 0 gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310124.1"; rtracklayer/inst/tests/multi.wig0000644000126300012640000000335712227067667020470 0ustar00biocbuildphs_compbio# 300 base wide bar graph, autoScale is on by default == graphing # limits will dynamically change to always show full range of data # in viewing window, priority = 20 positions this as the second graph # Note, zero-relative, half-open coordinate system in use for bed format track type=wiggle_0 name="Bed Format" description="BED format" visibility=full color=200,100,0 altColor=0,100,200 priority=20 chr19 59102000 59102300 -1.0 chr19 59102300 59102600 -0.75 chr19 59102600 59102900 -0.50 chr19 59102900 59103200 -0.25 chr19 59103200 59103500 0.0 chr19 59103500 59103800 0.25 chr19 59103800 59104100 0.50 chr19 59104100 59104400 0.75 chr19 59104400 59104700 1.00 # 150 base wide bar graph at arbitrarily spaced positions, # threshold line drawn at y=11.76 # autoScale off viewing range set to [0:25] # priority = 10 positions this as the first graph # Note, one-relative coordinate system in use for this format track type=wiggle_0 name="variableStep" description="variableStep format" visibility=full autoScale=off viewLimits=0.0:25.0 color=255,200,0 yLineMark=11.76 yLineOnOff=on priority=10 variableStep chrom=chr19 span=150 59104701 10.0 59104901 12.5 59105401 15.0 59105601 17.5 59105901 20.0 59106081 17.5 59106301 15.0 59106691 12.5 59107871 10.0 # 200 base wide points graph at every 300 bases, 50 pixel high graph # autoScale off and viewing range set to [0:1000] # priority = 30 positions this as the third graph # Note, one-relative coordinate system in use for this format track type=wiggle_0 name="fixedStep" description="fixed step" visibility=full autoScale=off viewLimits=0:1000 color=0,200,100 maxHeightPixels=100:50:20 graphType=points priority=30 fixedStep chrom=chr19 start=59107401 step=300 span=200 1000 900 800 700 600 500 400 300 200 100 rtracklayer/inst/tests/quickload/0000755000126300012640000000000012227067667020572 5ustar00biocbuildphs_compbiortracklayer/inst/tests/quickload/T_species_Oct_2011/0000755000126300012640000000000012227067667023760 5ustar00biocbuildphs_compbiortracklayer/inst/tests/quickload/T_species_Oct_2011/T_species_Oct_2011.2bit0000644000126300012640000000010212227067667027721 0ustar00biocbuildphs_compbioC'Atestd8úè :µˆº:ŽD‰Z‚©© ¢Å»’irtracklayer/inst/tests/quickload/T_species_Oct_2011/annots.xml0000644000126300012640000000024712227067667026007 0ustar00biocbuildphs_compbio rtracklayer/inst/tests/quickload/T_species_Oct_2011/bedData.bed.gz0000644000126300012640000000043512227067667026401 0ustar00biocbuildphs_compbio‹ÿBCmÁj!E׿+$ÛLA}ꌋٔ@é&)ýƒI*AÚ™)£ú÷÷BkÐì.çp”—–áüɧaôýkòãûËóÞ3ÿðñ¼„ïæ©ß¢à«Yé8O1-ò-¿†Ná+¤Ÿ^ñ€õåÔ§Mò11©ZÝJéìm)°ÀÞæ(™`»‡RÓˆFÜÕ„iµÊu!ëš0-m]‹5äºuM˜–鬯ZçºuM˜V+@²ƒ¿àÝOåZ6ë w5aZtÖ*×…¬k´Xƒ5äºuMW' (¼Ûä» YÝ}ô¤uÿÖÿ—òïï_r  2‚‹ÿBCrtracklayer/inst/tests/quickload/T_species_Oct_2011/bedData.bed.gz.tbi0000644000126300012640000000026512227067667027157 0ustar00biocbuildphs_compbio‹ÿBC˜íËK €0Ð-\0€nÜk¡ ¨-<ÒòQÀõ½d2ÙI6o{JÑ¥è=´Œ-˽DL-µõ>Îõs|žß2?å·/äŒ{Wqó‹ÿBCrtracklayer/inst/tests/quickload/T_species_Oct_2011/bedGraphData.bw0000644000126300012640000000000012227067667026606 0ustar00biocbuildphs_compbiortracklayer/inst/tests/quickload/T_species_Oct_2011/mod_chromInfo.txt0000644000126300012640000000001112227067667027274 0ustar00biocbuildphs_compbiotest 100 rtracklayer/inst/tests/quickload/contents.txt0000644000126300012640000000004612227067667023170 0ustar00biocbuildphs_compbioT_species_Oct_2011 T_species_Oct_2011 rtracklayer/inst/tests/step.wig0000644000126300012640000000066012227067667020303 0ustar00biocbuildphs_compbiotrack type=wiggle_0 name="test" description="test track" visibility=full autoScale=off viewLimits=0:1000 color=0,200,100 maxHeightPixels=100:50:20 graphType=points priority=30 variableStep chrom=chr19 59104701 10.0 59104901 12.5 59105401 15.0 59105601 17.5 59105901 20.0 59106081 17.5 59106301 15.0 59106691 12.5 59107871 10.0 fixedStep chrom=chr18 start=59108021 step=300 span=200 1000 900 800 700 600 500 400 300 200 100 rtracklayer/inst/tests/test.2bit0000644000126300012640000000027212227067667020360 0ustar00biocbuildphs_compbioC'A|gi|157704452|ref|AC_000143.1| Homo sapiens chromosome 11, alternate assembly (based on HuRef), whole genome shotgun sequence‘d8úè :µˆº:ŽD‰Z‚©© ¢Å»’irtracklayer/inst/tests/test.R0000644000126300012640000000052712227067667017724 0ustar00biocbuildphs_compbiolibrary(rtracklayer) files <- dir(system.file("tests", package = "rtracklayer"), pattern = "[^R~]$", full.names=TRUE) testExport <- function(file) { track <- import(file) export(track, format = "ucsc") } options(error=recover) sapply(files, testExport) ## test GRanges imports sapply(files[-8], import, asRangedData = FALSE) rtracklayer/inst/tests/test.bed0000644000126300012640000000133312227067667020251 0ustar00biocbuildphs_compbio##Example 5 from Custom Annotation Tracks User's Guide track name="ItemRGBDemo" description="Item RGB demonstration" visibility=2 itemRgb="On" priority=1 useScore="0" color="0,60,120" colorByStrand="0,0,255 255,0,0" group="user" offset=0 url="http://genome.ucsc.edu/foo.html?query=$$" htmlUrl="http://genome.ucsc.edu/goldenPath/help/ct_description.txt" chr7 127471196 127472363 Pos1 0 + 127471196 127472363 255,0,0 3 300,200,100 0,500,1067 chr7 127472363 127473530 Pos2 2 + 127472363 127473530 255,0,0 2 250,500 0,667 chr7 127473530 127474697 Neg1 0 - 127473530 127474697 255,0,0 1 1167 0 chr9 127474697 127475864 Pos3 5 + 127474697 127475864 255,0,0 1 1167 0 chr9 127475864 127477031 Neg2 5 - 127475864 127477031 0,0,255 1 1167 0 rtracklayer/inst/tests/test.bed150000644000126300012640000000065412227067667020424 0ustar00biocbuildphs_compbiotrack type="array" expScale=3.0 expStep=0.5 expNames="breast_A,breast_B,breast_C,cerebellum_A,cerebellum_B," name="Microarray" description="Microarray custom track" chr1 159639972 159640031 2440848 500 - 159639972 159640031 0 1 59, 0, 5 0,1,2,3,4, 0.593000,1.196000,-0.190000,-1.088000,0.093000, chr1 159640161 159640190 2440849 500 - 159640161 159640190 0 1 29, 0, 5 0,1,2,3,4, -0.906000,-1.247000,0.111000,-0.515000,-0.057000,rtracklayer/inst/tests/test.bedGraph0000644000126300012640000000070712227067667021237 0ustar00biocbuildphs_compbiotrack type=bedGraph name="bedGraph track" description="Test" visibility=full color=200,100,0 altColor=0,100,200 gridDefault=Off priority=20 alwaysZero=On yLineMark=10 windowingFunction="mean" chr19 59102000 59102300 -1.0 chr19 59102300 59102600 -0.75 chr19 59102600 59102900 -0.50 chr19 59102900 59103200 -0.25 chr19 59103200 59103500 0.0 chr19 59103500 59103800 0.25 chr17 59103800 59104100 0.50 chr18 59104100 59104400 0.75 chr18 59104400 59104700 1.00 rtracklayer/inst/tests/test.bw0000644000126300012640000022112612227067667020133 0ustar00biocbuildphs_compbio&üˆ˜Ö*p@I'na¤a$àÁÂŒ ð¿ð?”‘@‘ŒÊxchr2í~chr19—<†xœc`€€;¬ :ŒÌÌä04ìg`pb nØR[Zxœcd``¸ÃÊÀÐÃÅÀ ÃÁÌ ,@Ñ; aÏÀàÄ öL¢à¬h$Œ *ÜÞ%ÜŒ 'xœc`€Ou†;¬ VÃ~°@ƒõ†<.Œ qU]† ,` ; ¶Ê»€äÑ Tà¬h$%-¤a%-ra2xœc`€•¹ wXA¬†ý`ë# x\ â‹6°€%ì€Ø(ï’85 öà¬h$£Â£äÁ2&üˆrtracklayer/inst/tests/test.gtf0000644000126300012640000000044612227067667020303 0ustar00biocbuildphs_compbio##gff-version 3 ##date 2011-05-17 chr1 aggregate_genes.py aggregate_gene 564418 570350 . - . aggregate_gene_id "CUFF.168931" chr1 aggregate_genes.py exonic_section 564418 565718 . - . exonic_section_number "001"; transcripts "CUFF.168931.1"; is_full_exon "True"; aggregate_gene_id "CUFF.168931"rtracklayer/inst/tests/v1.gff0000644000126300012640000000024512227067667017631 0ustar00biocbuildphs_compbiochr21 TeleGene enhancer 1000000 1011000 500 + . touch1 chr22 TeleGene promoter 1010000 1010100 900 + . touch1 chr22 TeleGene promoter 1020000 1020000 800 - . touch2 rtracklayer/inst/tests/v2.gff0000644000126300012640000000227012227067667017632 0ustar00biocbuildphs_compbio##gff-version 2 ##Type DNA Escherichia_coli_K-12_complete_genome glimmer/tico CDS 337 2799 5.347931 + . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 2801 3733 11.448764 + . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 3734 5020 6.230648 + . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 5088 5237 3.815619 + . Escherichia_coli_K-12_complete_genome glimmer/tico REANNCDS 5310 5741 -0.111382 - . shift -21 ; note "weak tis" Escherichia_coli_K-12_complete_genome glimmer/tico CDS 5310 5720 -0.111382 - . note "weak tis" Escherichia_coli_K-12_complete_genome glimmer/tico CDS 5683 6459 0.234908 - . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 6529 7959 19.75313 - . Escherichia_coli_K-12_complete_genome glimmer/tico REANNCDS 8238 9191 19.169035 + . shift 63 ; Escherichia_coli_K-12_complete_genome glimmer/tico CDS 8175 9191 19.169035 + . Escherichia_coli_K-12_complete_genome glimmer/tico REANNCDS 9306 9893 19.613488 + . shift 3 ; Escherichia_coli_K-12_complete_genome glimmer/tico CDS 9303 9893 19.613488 + . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 9928 10494 4.670315 - . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 10643 11356 13.285624 - .rtracklayer/inst/tests/v3.gff0000644000126300012640000000166412227067667017641 0ustar00biocbuildphs_compbioedit_test.fa . gene 500 2610 . + . ID=newGene;Alias=NewGene,new_gene edit_test.fa . mRNA 500 2385 . + . Parent=newGene;Namo=reinhard+did+this;Name=t1%28newGene%29;ID=t1;uri=http%3A//www.yahoo.com edit_test.fa . five_prime_UTR 500 802 . + . Parent=t1 edit_test.fa . CDS 803 1012 . + . Parent=t1 edit_test.fa . three_prime_UTR 1013 1168 . + . Parent=t1 edit_test.fa . three_prime_UTR 1475 1654 . + . Parent=t1 edit_test.fa . three_prime_UTR 1720 1908 . + . Parent=t1 edit_test.fa . three_prime_UTR 2047 2385 . + . Parent=t1 edit_test.fa . mRNA 1050 2610 . + . Parent=newGene;Name=t2%28newGene%29;ID=t2 edit_test.fa . CDS 1050 1196 . + . Parent=t2 edit_test.fa . CDS 1472 1651 . + . Parent=t2 edit_test.fa . CDS 1732 2610 . + . Parent=t2 edit_test.fa . mRNA 1050 2610 . + . Parent=newGene;Name=t3%28newGene%29;ID=t3 edit_test.fa . CDS 1050 1196 . + . Parent=t3 edit_test.fa . CDS 1472 1651 . + . Parent=t3 edit_test.fa . CDS 1732 2610 . + . Parent=t3 rtracklayer/inst/tests/variableStep.bw0000644000126300012640000022140512227067667021575 0ustar00biocbuildphs_compbio&üˆ˜ãp@šUÍa+bhVgÂÅÂð¿4@À€­£@‘ŒÊxchr17»¼chr19C°Íchr5 ¬Ç xœc```ÈÐÁ|üQ3É ÃÈÀÀ„ 1††ý³‚h‡ýÀº _xœcd``øóªƒ9þ{3ÉÀÄL œ`1Ç#¯A´‡ãŽ· ºÀ±áˆîq\óD/pLøáÛ|„ÈúQ÷¢8U½xœcb``8þ¨ƒùóãf “A‡‘‰,ä»à¬h$oàˆóãˆoàˆÇâˆë)üêˆ_÷ˆJÇâˆóãˆ^#xœc```ÈÐÁÌiÖÉÁä04ìg`pØÏàÀ|„!á•3#PäÏ«æiÌœ iG†@ÌäÌðà› HËñG̉Ì:Œ`û!Xì0Ã4'8Šà¬h$oàˆa8‰+boàˆa8‰ÑaZxœc```ÈÐÁ|ݬ‹9‚ ÈahØÏÀà°ŸÁùCÂ+gF ÈŸWÌ)Ž]Ìœ iG†@ÌäÌðà› HËñGÌú–]Ì:Œ`û!Xì0Ã4'pªvà¬h$oàˆ/9ŠÅÂoàˆ/9ŠkÂZ&üˆrtracklayer/inst/tests/variableStep.wig0000644000126300012640000000070012227067667021744 0ustar00biocbuildphs_compbiotrack type=wiggle_0 name="variableStep" description="variable step" visibility=full autoScale=off viewLimits=0:1000 color=0,200,100 maxHeightPixels=100:50:20 graphType=points priority=30 variableStep chrom=chr19 59104701 10.0 59104901 12.5 59105401 15.0 59105601 17.5 59105901 20.0 59106081 17.5 59106301 15.0 59106691 12.5 59107871 10.0 variableStep chrom=chr5 span=300 59102600 -0.50 variableStep chrom=chr1 span=300 59102000 -1.0 59102300 -0.75 rtracklayer/inst/unitTests/0000755000126300012640000000000012227067670017450 5ustar00biocbuildphs_compbiortracklayer/inst/unitTests/test_bed.R0000644000126300012640000002621212227067670021367 0ustar00biocbuildphs_compbiotest_bed <- function() { test_path <- system.file("tests", package = "rtracklayer") ## Import of classic test.bed with RGB colors test_bed <- file.path(test_path, "test.bed") ## import() createCorrectRd <- function(seqinfo) { ir <- IRanges(c(127471197, 127472364, 127473531, 127474698, 127475865), width = 1167) space <- factor(rep(c("chr7", "chr9"), c(3, 2)), seqlevels(seqinfo)) blocks <- split(IRanges(c(1, 501, 1068, 1, 668, 1, 1, 1), c(300, 700, 1167, 250, 1167, 1167, 1167, 1167)), rep(seq_len(5), c(3, 2, 1, 1, 1))) names(blocks) <- NULL correct_rd <- RangedData(ir, name = c("Pos1", "Pos2", "Neg1", "Pos3", "Neg2"), score = c(0, 2, 0, 5, 5), strand = strand(c("+", "+", "-", "+", "-")), itemRgb = c("#FF0000", "#FF0000", "#FF0000", "#FF0000", "#0000FF"), thick = ir, blocks, space = space) if (!any(is.na(genome(seqinfo)))) universe(correct_rd) <- unname(genome(seqinfo)[1]) metadata(ranges(correct_rd))$seqinfo <- seqinfo correct_rd } createCorrectUCSC <- function(rd) { on.exit new("UCSCData", as(rd, "GRanges"), trackLine = new("BasicTrackLine", itemRgb = TRUE, name = "ItemRGBDemo", description = "Item RGB demonstration", visibility = "2", color = c(0L, 60L, 120L), priority = 1, group = "user", offset = 0L, url = "http://genome.ucsc.edu/foo.html?query=$$", htmlUrl = paste("http://genome.ucsc.edu/goldenPath/", "help/ct_description.txt", sep = ""), colorByStrand = matrix(c(0L, 0L, 255L, 255L, 0L, 0L), 3), useScore = FALSE)) } correct_rd <- createCorrectRd(Seqinfo(c("chr7", "chr9"))) correct_gr <- as(correct_rd, "GRanges") correct_ucsc <- createCorrectUCSC(correct_rd) test <- import(test_bed, asRangedData = FALSE) checkIdentical(test, correct_ucsc) test_bed_file <- BEDFile(test_bed) test <- import(test_bed_file, asRangedData = FALSE) checkIdentical(test, correct_ucsc) checkIdentical(import(test_bed_file, format = "bed", asRangedData = FALSE), correct_ucsc) checkException(import(test_bed_file, format = "gff")) test_bed_con <- file(test_bed) test <- import(test_bed_con, format = "bed", asRangedData = FALSE) checkIdentical(test, correct_ucsc) close(test_bed_con) test_bed_con <- file(test_bed, "r") test <- import(test_bed_con, format = "bed", asRangedData = FALSE) checkIdentical(test, correct_ucsc) close(test_bed_con) test_bed_con <- file(test_bed) test <- import(BEDFile(test_bed_con), asRangedData = FALSE) checkIdentical(test, correct_ucsc) close(test_bed_con) test <- import(test_bed, trackLine = FALSE, asRangedData = FALSE) checkIdentical(test, correct_gr) test <- import(test_bed, trackLine = FALSE, asRangedData = TRUE) checkIdentical(test, correct_rd) test <- import(test_bed, asRangedData = FALSE) checkIdentical(correct_ucsc, test) hg19_seqinfo <- SeqinfoForBSGenome("hg19") correct_genome <- createCorrectUCSC(createCorrectRd(hg19_seqinfo)) test <- import(test_bed, genome = "hg19", asRangedData = FALSE) checkIdentical(correct_genome, test) subcols <- c("name", "thick") correct_subcols <- correct_ucsc mcols(correct_subcols) <- mcols(correct_subcols)[ , subcols] test <- import(test_bed, colnames = c(subcols, "strand"), asRangedData = FALSE) checkIdentical(correct_subcols, test) strand(correct_subcols) <- "*" test <- import(test_bed, colnames = subcols, asRangedData = FALSE) checkIdentical(correct_subcols, test) which <- RangesList(chr7 = ranges(correct_rd)[[1]][1:2]) correct_which <- subsetByOverlaps(correct_ucsc, which) test <- import(test_bed, which = which, asRangedData = FALSE) checkIdentical(correct_which, test) test <- import(test_bed, format = "bed", asRangedData = FALSE) checkIdentical(correct_ucsc, test) ## import.bed() test <- import.bed(test_bed, asRangedData = FALSE) checkIdentical(correct_ucsc, test) test_bed_con <- pipe(paste("head -n2", test_bed)) test <- import.bed(test_bed_con, asRangedData = FALSE) correct_empty <- new("UCSCData", GRanges(), trackLine = correct_ucsc@trackLine) seqinfo(correct_empty) <- Seqinfo() checkIdentical(test, correct_empty) close(test_bed_con) ## export() ## the 'gsub' is to handle Windows paths (for later coercion to URL) test_bed_out <- gsub("\\\\", "/", file.path(tempdir(), "test.bed")) on.exit(unlink(test_bed_out)) export(correct_ucsc, test_bed_out) test <- import(test_bed_out, asRangedData = FALSE) checkIdentical(correct_ucsc, test) export(correct_ucsc, test_bed_out, format = "bed") test <- import(test_bed_out, asRangedData = FALSE) checkIdentical(correct_ucsc, test) test_bed_out_file <- BEDFile(test_bed_out) export(correct_ucsc, test_bed_out_file) test <- import(test_bed_out, asRangedData = FALSE) checkIdentical(correct_ucsc, test) checkException(export(correct_ucsc, test_bed_out_file, format = "gff")) correct_ucsc2 <- initialize(correct_ucsc, trackLine = initialize(correct_ucsc@trackLine, name = "ItemRGBDemo2")) export(correct_ucsc2, test_bed_out_file, append = TRUE) test <- import(test_bed_out_file, asRangedData = FALSE) correct_list <- GenomicRangesList(ItemRGBDemo = correct_ucsc, ItemRGBDemo2 = correct_ucsc2) checkIdentical(correct_list, test) export(correct_ucsc, test_bed_out, name = "ItemRGBDemo2") test <- import(test_bed_out, asRangedData = FALSE) checkIdentical(correct_ucsc2, test) test_bed_url <- paste("file:///", test_bed_out, sep = "") export(correct_ucsc, test_bed_url) test <- import(test_bed_url, asRangedData = FALSE) checkIdentical(correct_ucsc, test) if (FALSE) { # enable to test an HTTP URL using the R help server http_pipe <- pipe("Rscript -e 'tools::startDynamicHelp(); writeLines(as.character(tools:::httpdPort)); Sys.sleep(10);' &") port <- readLines(http_pipe, n = 1) test_bed_http <- paste("http://127.0.0.1:", port, "/library/rtracklayer/doc/example.bed", sep = "") test <- import(test_bed_http, asRangedData = FALSE) checkIdentical(correct_ucsc, test) close(http_pipe) } ## GenomicRangesList export(correct_list, test_bed_out) test <- import(test_bed_out, asRangedData = FALSE) checkIdentical(correct_list, test) ## To/From gzip test_bed_gz <- paste(test_bed_out, ".gz", sep = "") on.exit(unlink(test_bed_gz)) export(correct_ucsc, test_bed_gz) test <- import(test_bed_gz, asRangedData = FALSE) checkIdentical(correct_ucsc, test) export(correct_ucsc2, test_bed_gz, append = TRUE) test <- import(test_bed_gz, asRangedData = FALSE) checkIdentical(correct_list, test) test_bed_gz_url <- paste("file:///", test_bed_gz, sep = "") export(correct_ucsc, test_bed_gz_url) test <- import(test_bed_gz_url, asRangedData = FALSE) checkIdentical(correct_ucsc, test) ## To/From tabix export(correct_ucsc, test_bed_out, index = TRUE) on.exit(unlink(paste(test_bed_gz, ".tbi", sep = ""))) test <- import(test_bed_gz, which = which, asRangedData = FALSE) checkIdentical(correct_which, test) ## check TabixFile test_bed_tabix <- Rsamtools::TabixFile(test_bed_gz) test <- import(test_bed_tabix, asRangedData = FALSE) checkIdentical(correct_ucsc, test) ## look mom, no track line export(correct_ucsc, test_bed_out, index = TRUE, trackLine = FALSE) test <- import(test_bed_gz, which = which, asRangedData = FALSE) checkIdentical(subsetByOverlaps(correct_gr, which), test) #test <- import(test_bed_tabix, format = "foo") ## To/From text bed_text <- export(correct_ucsc, format = "bed") test <- import(format = "bed", text = bed_text, asRangedData = FALSE) checkIdentical(correct_ucsc, test) ## TODO: empty text ## Using connection to add comment header test_bed_con <- file(test_bed_out) open(test_bed_con, "w") comment <- "# test comment" writeLines(comment, test_bed_con) export(correct_ucsc, test_bed_con) close(test_bed_con) checkIdentical(comment, readLines(test_bed_out, n = 1)) test <- import(test_bed_out, asRangedData = FALSE) checkIdentical(correct_ucsc, test) ## Set seqinfo on correct_rd, coerce to UCSCData, export, import and check correct_genome_rd <- as(correct_genome, "RangedData") ## Set offset in correct_ucsc track line, export, then: correct_offset <- shift(correct_gr, -1) correct_ucsc@trackLine@offset <- 1L export(correct_ucsc, test_bed_out) test <- import(test_bed_out, trackLine = FALSE, asRangedData = FALSE) checkIdentical(test, correct_offset) test <- import(test_bed_out, asRangedData = FALSE) checkIdentical(test, correct_ucsc) correct_ucsc@trackLine@offset <- 0L ## Drop all extra columns, see if it still works correct_stripped <- correct_ucsc mcols(correct_stripped) <- NULL export(correct_stripped, test_bed_out) test <- import(test_bed_out, asRangedData = FALSE) mcols(correct_stripped)$name <- NA_character_ mcols(correct_stripped)$score <- 0 checkIdentical(test, correct_stripped) ## - and even when asking for a column like blocks: correct_blocks <- correct_ucsc mcols(correct_blocks) <- mcols(correct_blocks)[ , "blocks", drop=FALSE] test <- import(test_bed, colnames = c("blocks", "strand"), asRangedData = FALSE) checkIdentical(test, correct_blocks) strand(correct_blocks) <- "*" test <- import(test_bed, colnames = "blocks", asRangedData = FALSE) checkIdentical(test, correct_blocks) ## Drop the columns except for blocks, see if it still works export(correct_blocks, test_bed_out) test <- import(test_bed_out, asRangedData = FALSE) correct_fill_to_blocks <- correct_ucsc strand(correct_fill_to_blocks) <- "*" mcols(correct_fill_to_blocks)$name <- NA_character_ mcols(correct_fill_to_blocks)$score <- 0 mcols(correct_fill_to_blocks)$itemRgb <- NA_character_ mcols(correct_fill_to_blocks)$thick <- ranges(correct_fill_to_blocks) checkIdentical(test, correct_fill_to_blocks) } test_extendedBed <- function() { # the narrowPeak format represents a variety of "BED6+N" formats # used by the ENCODE project. see # http://genome.ucsc.edu/FAQ/FAQformat.html # "This format is used to provide called peaks of signal # enrichment based on pooled, normalized (interpreted) data. # It is a BED6+4 format." file <- system.file("extdata", "demo.narrowPeak.gz", package="rtracklayer") extraCols <- c(signalValue="numeric", pValue="numeric", qValue="numeric", peak="integer") gr <- import(file, forma="bed", asRangedData=FALSE, extraCols=extraCols, genome="hg19") checkEquals(length(gr), 6) checkEquals(colnames(mcols(gr)), c("name","score","signalValue","pValue","qValue","peak")) # make sure that all seqnames in the gr object # are also in the seqinfo(gr) object checkTrue(all(seqnames(gr) %in% names(seqinfo(gr)))) } rtracklayer/inst/unitTests/test_bedGraph.R0000644000126300012640000001134212227067670022347 0ustar00biocbuildphs_compbiotest_bedGraph <- function() { test_path <- system.file("tests", package = "rtracklayer") test_bg <- file.path(test_path, "test.bedGraph") createCorrectRd <- function(si) { part <- PartitioningByWidth(rep(300, 9)) ir <- shift(IRanges(start(part), end(part)), 59102000) score <- seq(-1, 1, by = 0.25) space <- factor(c(rep("chr19", 6), "chr17", rep("chr18", 2)), seqlevels(si)) correct_rd <- RangedData(ir, score, space = space) if (!any(is.na(genome(si)))) universe(correct_rd) <- unname(genome(si)[1]) metadata(ranges(correct_rd))$seqinfo <- si correct_rd } createCorrectUCSC <- function(rd) { track_line <- new("GraphTrackLine", type = "bedGraph", name = "bedGraph track", description = "Test", visibility = "full", alwaysZero = TRUE, gridDefault = FALSE, yLineMark = 10, windowingFunction = "mean", color = c(200L, 100L, 0L), altColor = c(0L, 100L, 200L), priority = 20) new("UCSCData", as(rd, "GRanges"), trackLine = track_line) } correct_rd <- createCorrectRd(Seqinfo(c("chr19", "chr17", "chr18"))) correct_gr <- as(correct_rd, "GRanges") correct_ucsc <- createCorrectUCSC(correct_rd) ## TEST: basic import test <- import(test_bg) checkIdentical(correct_ucsc, test) test <- import.bedGraph(test_bg) checkIdentical(correct_ucsc, test) test_bg_file <- BEDGraphFile(test_bg) checkException(import(test_bg_file, format = "wig")) test <- import(test_bg_file, format = "bedGraph") checkIdentical(correct_ucsc, test) test <- import(test_bg_file) checkIdentical(correct_ucsc, test) test_bg_con <- file(test_bg) test <- import(test_bg_con, format = "wig") checkIdentical(correct_ucsc, test) close(test_bg_con) test_bg_con <- file(test_bg) test <- import(WIGFile(test_bg_con)) checkIdentical(correct_ucsc, test) close(test_bg_con) ## TEST: 'genome' hg19_seqinfo <- SeqinfoForBSGenome("hg19") correct_genome <- createCorrectUCSC(createCorrectRd(hg19_seqinfo)) test <- import(test_bg, genome = "hg19") checkIdentical(correct_genome, sort(test)) ## TEST: trackLine = FALSE test <- import(test_bg, trackLine = FALSE) checkIdentical(correct_gr, test) ## TEST: which which <- ranges(correct_rd[3:4,]) correct_which <- subsetByOverlaps(correct_ucsc, which) test <- import(test_bg, which = which) checkIdentical(correct_which, test) ## TEST: basic export test_bg_out <- file.path(tempdir(), "test.bedGraph") on.exit(unlink(test_bg_out)) export(correct_ucsc, test_bg_out) test <- import(test_bg_out) checkIdentical(correct_ucsc, test) export.bedGraph(correct_ucsc, test_bg_out) test <- import(test_bg_out) checkIdentical(correct_ucsc, test) test_foo_out <- file.path(tempdir(), "test.foo") export(correct_ucsc, test_foo_out, format = "bedGraph") on.exit(unlink(test_foo_out)) test <- import(test_bg_out) checkIdentical(correct_ucsc, test) test_bg_out_file <- BEDGraphFile(test_bg_out) export(correct_ucsc, test_bg_out_file) test <- import(test_bg_out) checkIdentical(correct_ucsc, test) checkException(export(correct_ucsc, test_bg_out_file, format = "gff")) ## TEST: append correct_ucsc2 <- initialize(correct_ucsc, trackLine = initialize(correct_ucsc@trackLine, name = "test2")) export(correct_ucsc2, test_bg_out_file, append = TRUE) test <- import(test_bg_out_file) correct_list <- GenomicRangesList("bedGraph track" = correct_ucsc, test2 = correct_ucsc2) checkIdentical(correct_list, test) ## TEST: track line parameters export(correct_ucsc, test_bg_out, name = "test2") test <- import(test_bg_out) checkIdentical(correct_ucsc2, test) ## TEST: export trackLine export(correct_ucsc, test_bg_out, trackLine = FALSE) test <- import(test_bg_out) checkIdentical(test, correct_gr) ## TEST: RangedDataList export(correct_list, test_bg_out) test <- import(test_bg_out) checkIdentical(correct_list, test) ## TEST: gzip test_bg_gz <- paste(test_bg_out, ".gz", sep = "") on.exit(unlink(test_bg_gz)) export(correct_ucsc, test_bg_gz) test <- import(test_bg_gz) checkIdentical(correct_ucsc, test) export(correct_ucsc2, test_bg_gz, append = TRUE) test <- import(test_bg_gz) checkIdentical(correct_list, test) ## TEST: Using connection to add comment header test_bg_con <- file(test_bg_out) open(test_bg_con, "w") comment <- "# test comment" writeLines(comment, test_bg_con) export(correct_ucsc, test_bg_con) close(test_bg_con) checkIdentical(comment, readLines(test_bg_out, n = 1)) test <- import(test_bg_out) checkIdentical(correct_ucsc, test) } rtracklayer/inst/unitTests/test_bw.R0000644000126300012640000000533512227067670021250 0ustar00biocbuildphs_compbiotest_bw <- function() { if (.Platform$OS.type == "windows") return() test_path <- system.file("tests", package = "rtracklayer") test_bw <- file.path(test_path, "test.bw") ir <- as(PartitioningByWidth(rep(300, 9)), "IRanges") space <- factor(c(rep("chr2", 5), rep("chr19", 4)), c("chr2", "chr19")) score <- seq(-1, 1, length = 9) correct_fixed <- RangedData(ir, score, space = space) ## convert the Compressed lists to Simple equivalents for identity with C code ranges(correct_fixed) <- RangesList(as.list(ranges(correct_fixed))) values(correct_fixed) <- SplitDataFrameList(as.list(values(correct_fixed)), compress = FALSE) si <- SeqinfoForBSGenome("hg19") seqlengths(correct_fixed) <- seqlengths(si)[levels(space)] test <- import(test_bw, asRangedData = TRUE) checkIdentical(test, correct_fixed) test_bw_out <- file.path(tempdir(), "test_out.bw") export(correct_fixed, test_bw_out) on.exit(unlink(test_bw_out)) test <- import(test_bw_out, asRangedData = TRUE) checkIdentical(test, correct_fixed) export.bw(correct_fixed, test_bw_out) test <- import.bw(test_bw_out, asRangedData = TRUE) checkIdentical(test, correct_fixed) correct_bedgraph <- correct_fixed width(correct_bedgraph) <- seq(1, 300, length = 9) export(correct_bedgraph, test_bw_out) test <- import(test_bw_out, asRangedData = TRUE) checkIdentical(test, correct_bedgraph) ## TEST: 'which' which <- GRanges(c("chr2", "chr2"), IRanges(c(1, 300), c(400, 1000))) correct_which <- subsetByOverlaps(correct_bedgraph, which) ranges(correct_which) <- intersect(ranges(correct_which), as(which, "RangesList")) test <- import(test_bw_out, which = which, asRangedData = TRUE) checkIdentical(test, correct_which) ## TEST: BigWigSelection (range, no score) test <- import(test_bw_out, selection = BigWigSelection(which, colnames = character()), asRangedData = TRUE) correct_which <- correct_which[, character()] checkIdentical(test, correct_which) ## TEST: empty which which <- RangesList() correct_which <- subsetByOverlaps(correct_bedgraph, which) test <- import(test_bw_out, which = which, asRangedData = TRUE) checkIdentical(test, correct_which) ## TEST: asRangedData=FALSE test <- import(test_bw, asRangedData = FALSE) checkIdentical(test, as(correct_fixed, "GRanges")) ## TEST: non-UCSC naming correct_ncbi <- correct_bedgraph seqlevels(correct_ncbi) <- sub("chr", "", seqlevels(correct_ncbi)) names(correct_ncbi) <- sub("chr", "", names(correct_ncbi)) export(correct_ncbi, test_bw_out) test <- import(test_bw_out, asRangedData = TRUE) checkIdentical(test, correct_ncbi) } rtracklayer/inst/unitTests/test_gff.R0000644000126300012640000002040312227067670021373 0ustar00biocbuildphs_compbiotest_gff <- function() { test_path <- system.file("tests", package = "rtracklayer") space <- c(rep("chr10", 15), rep("chr12", 16)) start <- c(rep(92828, 4), 92997, rep(94555, 4), rep(94744, 3), rep(95122, 2), 95348, rep(87984, 4), rep(c(88257, 88570, 88860, 89675, 90587, 90796), each = 2)) end <- c(95504, 95178, 95504, rep(94054, 2), rep(94665, 2), 94615, 94665, rep(94852, 3), rep(95178, 2), 95504, rep(c(91263, 88017, 88392, 88771, 89018, 89827, 90655, 91263), each = 2)) type <- factor(c("gene", "mRNA", "mRNA", "exon", "CDS", "exon", "exon", "CDS", "CDS", "exon", "exon", "CDS", "exon", "CDS", "exon", "gene", "mRNA", "exon", "CDS", "exon", "CDS", "exon", "CDS", "exon", "CDS", "exon", "CDS", "exon", "CDS", "exon", "CDS")) source <- factor("rtracklayer") phase <- NA_integer_ score <- c(5, rep(NA, length(type) - 1L)) strand <- strand(c(rep("-", 14), "*", rep("+", 15), "*")) Alias <- CharacterList(c(list(c("FLJ40100", "TUBB8")), rep(list(character()), 14), "LOC100288778", rep(list(character()), 15))) ID <- c("GeneID:347688", "873", "872", rep(NA, 12), "GeneID:100288778", "4644", rep(NA, 14)) Name <- c(rep("TUBB8", 3), rep(NA, 12), rep("LOC100288778", 2), rep(NA, 14)) Parent <- CharacterList(c(list(character()), rep("GeneID:347688", 2), rep(list(c("872", "873")), 2), rep(c("872", "873"), 3), rep("873", 3), "872", list(character()), "GeneID:100288778", rep("4644", 14))) geneName <- c("tubulin, beta 8", rep(NA, 14), "WAS protein family homolog 1; pseudogene", rep(NA, 15)) genome <- c("hg19", rep(NA, length(geneName) - 1)) correct_gff3 <- RangedData(IRanges(start, end), source, type, score, strand, phase, ID, Name, geneName, Alias, genome, Parent, space = space) seqinfo(correct_gff3) <- Seqinfo(c("chr10", "chr12")) correct_gff1 <- correct_gff3[,c("source", "type", "score", "strand", "phase")] correct_gff1$group <- seqnames(correct_gff3) correct_gff2 <- correct_gff3 toCSV <- function(x) { csv <- sapply(x, paste, collapse = ",") csv[nchar(csv) == 0] <- NA csv } correct_gff2$Alias <- toCSV(correct_gff2$Alias) correct_gff2$Parent <- toCSV(correct_gff2$Parent) target_gff1 <- as(correct_gff1, "GRanges") target_gff2 <- as(correct_gff2, "GRanges") target_gff3 <- as(correct_gff3, "GRanges") ## TEST: basic GFF3 import test_gff3 <- file.path(test_path, "genes.gff3") test <- import(test_gff3) checkIdentical(target_gff3, test) ## TEST: import.gff* test <- import.gff(test_gff3) checkIdentical(target_gff3, test) test <- import.gff3(test_gff3) checkIdentical(target_gff3, test) options(warn = 2) checkException(import.gff2(test_gff3)) ## TEST: GFF(3)File test_gff_file <- GFF3File(test_gff3) test <- import(test_gff_file) checkIdentical(target_gff3, test) test_gff_file <- GFFFile(test_gff3) test <- import(test_gff_file) checkIdentical(target_gff3, test) test_gff_file <- GFFFile(test_gff3, version = "3") test <- import(test_gff_file) checkIdentical(target_gff3, test) test_gff_file <- GFF2File(test_gff3) checkException(test <- import(test_gff_file)) ## TEST: 'gff' extension test_gff_out <- file.path(tempdir(), "genes.gff") on.exit(unlink(test_gff_out)) export(target_gff3, test_gff_out) test <- import(test_gff_out) checkIdentical(test, target_gff1) export(target_gff3, test_gff_out, version = "1") test <- import(test_gff_out) checkIdentical(test, target_gff1) export(target_gff3, test_gff_out, version = "2") test <- import(test_gff_out) checkIdentical(test, target_gff2) export(target_gff3, test_gff_out, version = "3") test <- import(test_gff_out) checkIdentical(test, target_gff3) test <- import(GFF3File(test_gff_out)) checkIdentical(test, target_gff3) test <- import(GFFFile(test_gff_out)) checkIdentical(test, target_gff3) test <- import(test_gff_out, version = "3") checkIdentical(test, target_gff3) checkException(test <- import(test_gff_out, version = "2")) ## TEST: 'gff2' extension test_gff2_out <- file.path(tempdir(), "genes.gff2") export(target_gff3, test_gff2_out) test <- import(test_gff2_out) checkIdentical(test, target_gff2) ## TEST: 'gff1' extension test_gff1_out <- file.path(tempdir(), "genes.gff1") export(target_gff3, test_gff1_out) test <- import(test_gff1_out) checkIdentical(test, target_gff1) ## TEST: 'format' argument test_gff_file <- GFF3File(test_gff3) test <- import(test_gff_file, format = "gff") checkIdentical(test, target_gff3) test <- import(test_gff_file, format = "gff3") checkIdentical(test, target_gff3) checkException(import(test_gff_file, format = "gff2")) checkException(import(test_gff_file, format = "bed")) ## TEST: 'genome' si_hg19 <- SeqinfoForBSGenome("hg19") rd_all <- RangedData(space = factor(character(), seqlevels(si_hg19))) correct_hg19 <- rbind(rd_all, correct_gff3) universe(correct_hg19) <- "hg19" seqinfo(correct_hg19) <- si_hg19 target_hg19 <- as(correct_hg19, "GRanges") test <- import(test_gff3, genome = "hg19") checkIdentical(test, target_hg19) test_gff3_out <- file.path(tempdir(), "genes.gff3") on.exit(unlink(test_gff3_out)) correct_genome_hg19 <- correct_gff3 universe(correct_genome_hg19) <- "hg19" target_genome_hg19 <- as(correct_genome_hg19, "GRanges") export(target_genome_hg19, test_gff3_out) test <- import(test_gff3_out) checkIdentical(test, target_hg19) ## TEST: colnames empty, colnames := "geneName", colnames := "strand" test <- import(test_gff3, colnames = character()) target <- target_gff3[,character()] strand(target) <- "*" checkIdentical(target, test) test <- import(test_gff3, colnames = "geneName") target <- target_gff3[,"geneName"] strand(target) <- "*" checkIdentical(target, test) test <- import(test_gff3, colnames = "strand") target <- target_gff3[,character()] checkIdentical(target, test) ## TEST: import from connection test_gff_con <- file(test_gff_out) test <- import(test_gff_con, format = "gff") close(test_gff_con) checkIdentical(target_gff3, test) ## TEST: export to connection, with preceding comment test_gff_con <- file(test_gff_out) open(test_gff_con, "w") comment <- "# test comment" writeLines(comment, test_gff_con) export(target_gff3, test_gff_con, version = "3") close(test_gff_con) checkIdentical(comment, readLines(test_gff_out, n = 1)) test <- import(test_gff_out) checkIdentical(target_gff3, test) ## TEST: 'append' export(target_gff3[seqnames(target_gff3) == "chr10", ], test_gff3_out) export(target_gff3[seqnames(target_gff3) == "chr12", ], test_gff3_out, append = TRUE) test <- import(test_gff3_out) checkIdentical(target_gff3, test) ## TEST: 'source' target <- target_gff3 mcols(target)$source <- factor("test") export(target_gff3, test_gff3_out, source = "test") test <- import(test_gff3_out) checkIdentical(target, test) ## TEST: 'which' which <- RangesList(chr10 = IRanges(90000, 93000)) which_target <- subsetByOverlaps(target_gff3, which) test <- import(test_gff3, which = which) checkIdentical(which_target, test) ## TEST: 'index' export(target_gff3, test_gff3_out, index = TRUE) test_gff_gz <- paste(test_gff3_out, ".gz", sep = "") on.exit(unlink(test_gff_gz)) on.exit(unlink(paste(test_gff_gz, ".tbi", sep = ""))) test <- import(test_gff_gz, which = which) checkIdentical(which_target, test) ## TEST: GenomicRangesList correct_grl <- GenomicRangesList(new("UCSCData", as(correct_gff3[1], "GRanges"), trackLine = new("BasicTrackLine", name = "chr10")), new("UCSCData", as(correct_gff3[2], "GRanges"), trackLine = new("BasicTrackLine", name = "chr12"))) seqlevels(correct_grl[[1]]) <- "chr10" seqlevels(correct_grl[[2]]) <- "chr12" mcols(correct_grl[[2]])$genome <- NULL names(correct_grl) <- names(correct_gff3) export(correct_grl, test_gff3_out) test <- import.ucsc(test_gff3_out) checkIdentical(correct_grl, test) } rtracklayer/inst/unitTests/test_twoBit.R0000644000126300012640000000363612227067670022112 0ustar00biocbuildphs_compbiotest_twoBit <- function() { test_path <- system.file("tests", package = "rtracklayer") test_2bit <- file.path(test_path, "test.2bit") correct_name <- "gi|157704452|ref|AC_000143.1| Homo sapiens chromosome 11, alternate assembly (based on HuRef), whole genome shotgun sequence" correct_seq <- "TGATGGAAGAATTATTTGAAAGCCATATAGAATGAAATGACTCTATACCCAAATTAAAACTCAAAAACTTACTCAAAATAGTCCAGAGACTACAACTTCA" correct_char <- setNames(correct_seq, correct_name) correct_2bit <- Biostrings::DNAStringSet(correct_char) ## TEST: basic import test <- import(test_2bit) checkIdentical(test, correct_2bit) ## TEST: basic export, import test_2bit_out <- file.path(tempdir(), "test_out.2bit") export(correct_2bit, test_2bit_out) on.exit(unlink(test_2bit_out)) test <- import(test_2bit_out) checkIdentical(test, correct_2bit) ## TEST: twoBit extension test_twoBit_out <- file.path(tempdir(), "test_out.twoBit") export(correct_2bit, test_twoBit_out) on.exit(unlink(test_twoBit_out)) test <- import(test_twoBit_out) checkIdentical(test, correct_2bit) ## TEST: character export export(correct_char, test_2bit_out) test <- import(test_2bit_out) checkIdentical(test, correct_2bit) ## TEST: 'which' which_range <- IRanges(c(10, 40), c(30, 42)) correct_which <- correct_2bit[[1]][which_range] which <- GRanges(names(correct_2bit), which_range) test <- import(test_2bit_out, which = which) checkIdentical(unlist(test), correct_which) ## TEST: empty which which_range <- IRanges() correct_which <- Biostrings::DNAStringSet() which <- GRanges(character(), which_range) test <- import(test_2bit_out, which = which) checkIdentical(as.character(test), as.character(correct_which)) ## TEST: which with empty range which_range <- IRanges(1, 0) which <- GRanges(names(correct_2bit), which_range) test <- import(test_2bit_out, which = which) checkIdentical(unlist(correct_which), unlist(test)) } rtracklayer/inst/unitTests/test_wig.R0000644000126300012640000001304212227067670021420 0ustar00biocbuildphs_compbiotest_wig <- function() { test_path <- system.file("tests", package = "rtracklayer") test_wig <- file.path(test_path, "step.wig") createCorrectRd <- function(si) { score <- c(seq(10, 20, by = 2.5), seq(17.5, 10, by = -2.5), seq(1000, 100, by = -100)) start <- c(59104701 + cumsum(c(0, 200, 500, 200, 300, 180, 220, 390, 1180)), 59108021 + cumsum(c(0, rep(300, 9)))) width <- c(rep(1, 9), rep(200, 10)) space <- factor(c(rep("chr19", 9), rep("chr18", 10)), seqlevels(si)) correct_rd <- RangedData(IRanges(start, width = width), score, space = space) if (!any(is.na(genome(si)))) universe(correct_rd) <- unname(genome(si)[1]) metadata(ranges(correct_rd))$seqinfo <- si correct_rd } createCorrectUCSC <- function(rd) { track_line <- new("GraphTrackLine", type = "wig", name = "test", description = "test track", visibility = "full", autoScale = FALSE, viewLimits = c(0, 1000), color = c(0L, 200L, 100L), maxHeightPixels = c(100L, 50L, 20L), graphType = "points", priority = 30) new("UCSCData", as(rd, "GRanges"), trackLine = track_line) } correct_rd <- createCorrectRd(Seqinfo(c("chr19", "chr18"))) correct_gr <- as(correct_rd, "GRanges") correct_ucsc <- createCorrectUCSC(correct_rd) ## TEST: basic import test <- import(test_wig) checkIdentical(correct_ucsc, test) test <- import.wig(test_wig) checkIdentical(correct_ucsc, test) test_wig_file <- WIGFile(test_wig) checkException(import(test_wig_file, format = "bed")) test <- import(test_wig_file, format = "wig") checkIdentical(correct_ucsc, test) test <- import(test_wig_file) checkIdentical(correct_ucsc, test) test_wig_con <- file(test_wig) test <- import(test_wig_con, format = "wig") checkIdentical(correct_ucsc, test) close(test_wig_con) test_wig_con <- file(test_wig) test <- import(WIGFile(test_wig_con)) checkIdentical(correct_ucsc, test) close(test_wig_con) ## TEST: 'genome' hg19_seqinfo <- SeqinfoForBSGenome("hg19") correct_genome <- createCorrectUCSC(createCorrectRd(hg19_seqinfo)) test <- import(test_wig, genome = "hg19") checkIdentical(correct_genome, sort(test)) ## TEST: trackLine = FALSE test <- import(test_wig, trackLine = FALSE) checkIdentical(correct_gr, test) ## TEST: which which <- ranges(correct_rd[3:4,]) correct_which <- subsetByOverlaps(correct_ucsc, which) test <- import(test_wig, which = which) checkIdentical(correct_which, test) ## TEST: basic export test_wig_out <- file.path(tempdir(), "test.wig") on.exit(unlink(test_wig_out)) export(correct_ucsc, test_wig_out) test <- import(test_wig_out) checkIdentical(correct_ucsc, test) export.wig(correct_ucsc, test_wig_out) test <- import(test_wig_out) checkIdentical(correct_ucsc, test) test_foo_out <- file.path(tempdir(), "test.foo") export(correct_ucsc, test_foo_out, format = "wig") on.exit(unlink(test_foo_out)) test <- import(test_wig_out) checkIdentical(correct_ucsc, test) test_wig_out_file <- WIGFile(test_wig_out) export(correct_ucsc, test_wig_out_file) test <- import(test_wig_out) checkIdentical(correct_ucsc, test) checkException(export(correct_ucsc, test_wig_out_file, format = "gff")) ## TEST: append correct_ucsc2 <- initialize(correct_ucsc, trackLine = initialize(correct_ucsc@trackLine, name = "test2")) export(correct_ucsc2, test_wig_out_file, append = TRUE) test <- import(test_wig_out_file) correct_list <- GenomicRangesList(test = correct_ucsc, test2 = correct_ucsc2) checkIdentical(correct_list, test) ## TEST: track line parameters export(correct_ucsc, test_wig_out, name = "test2") test <- import(test_wig_out) checkIdentical(correct_ucsc2, test) ## TEST: export trackLine export(correct_ucsc, test_wig_out, trackLine = FALSE) test <- import(test_wig_out) checkIdentical(test, correct_gr) ## TEST: Plain RangedData / bedGraph export.ucsc(correct_rd, test_wig_out) # mixture of steps leads to bedGraph test <- import(test_wig_out) default_line <- new("GraphTrackLine", name = "R Track", type = "bedGraph") correct_default <- new("UCSCData", correct_gr, trackLine = default_line) checkIdentical(test, correct_default) export.ucsc(correct_rd[2], test_wig_out) test <- import(test_wig_out) default_line <- new("GraphTrackLine", name = "R Track", type = "wig") correct_default <- new("UCSCData", as(correct_rd[2], "GRanges"), trackLine = default_line) seqlevels(correct_default) <- "chr18" checkIdentical(test, correct_default) ## TEST: RangedDataList export(correct_list, test_wig_out) test <- import(test_wig_out) checkIdentical(correct_list, test) ## TEST: gzip test_wig_gz <- paste(test_wig_out, ".gz", sep = "") on.exit(unlink(test_wig_gz)) export(correct_ucsc, test_wig_gz) test <- import(test_wig_gz) checkIdentical(correct_ucsc, test) export(correct_ucsc2, test_wig_gz, append = TRUE) test <- import(test_wig_gz) checkIdentical(correct_list, test) ## TEST: Using connection to add comment header test_wig_con <- file(test_wig_out) open(test_wig_con, "w") comment <- "# test comment" writeLines(comment, test_wig_con) export(correct_ucsc, test_wig_con) close(test_wig_con) checkIdentical(comment, readLines(test_wig_out, n = 1)) test <- import(test_wig_out) checkIdentical(correct_ucsc, test) } rtracklayer/load.R0000644000126300012640000000063112227067671015534 0ustar00biocbuildphs_compbiolibrary(RCurl) library(XML) library(GenomicRanges) library(rJava) files <- c("web.R", "range.R", "trackSet.R", "browser.R", "gff.R", "ucsc.R", "bed.R", "wig.R", "io.R") sapply(files, source) #track <- import(system.file("inst", "test", "v1.gff", package = "rtracklayer")) track <- import("../inst/tests/bed.wig") track@genome <- "hg18" session <- browserSession("ucsc") layTrack(session, track) rtracklayer/man/0000755000126300012640000000000012227067666015251 5ustar00biocbuildphs_compbiortracklayer/man/BEDFile-class.Rd0000644000126300012640000002533612227067666020046 0ustar00biocbuildphs_compbio\name{BEDFile-class} \docType{class} %% Classes: \alias{class:BEDFile} \alias{class:BED15File} \alias{class:BEDGraphFile} \alias{BEDFile-class} \alias{BED15File-class} \alias{BEDGraphFile-class} %% Constructor: \alias{BEDFile} \alias{BED15File} \alias{BEDGraphFile} %% Import: \alias{import,BEDFile,ANY,ANY-method} \alias{import,BED15File,ANY,ANY-method} \alias{import.bed} \alias{import.bed,ANY-method} \alias{import.bed15} \alias{import.bed15,ANY-method} \alias{import.bedGraph} \alias{import.bedGraph,ANY-method} %% Export: \alias{export,ANY,BEDFile,ANY-method} \alias{export,RangedData,BED15File,ANY-method} \alias{export,RangedData,BEDFile,ANY-method} \alias{export,RangedDataList,BEDFile,ANY-method} \alias{export,UCSCData,BEDFile,ANY-method} \alias{export.bed} \alias{export.bed,ANY-method} \alias{export.bed15} \alias{export.bed15,ANY-method} \alias{export.bedGraph} \alias{export.bedGraph,ANY-method} \title{BEDFile objects} \description{ These functions support the import and export of the UCSC BED format and its variants, including BEDGraph. } \usage{ \S4method{import}{BEDFile,ANY,ANY}(con, format, text, trackLine = TRUE, genome = NA, asRangedData = FALSE, colnames = NULL, which = NULL, seqinfo = NULL, extraCols = character()) import.bed(con, ...) import.bed15(con, ...) import.bedGraph(con, ...) \S4method{export}{ANY,BEDFile,ANY}(object, con, format, ...) \S4method{export}{RangedData,BEDFile,ANY}(object, con, format, append = FALSE, index = FALSE, ignore.strand = FALSE) \S4method{export}{RangedDataList,BEDFile,ANY}(object, con, format, ...) \S4method{export}{UCSCData,BEDFile,ANY}(object, con, format, trackLine = TRUE, ...) \S4method{export}{RangedData,BED15File,ANY}(object, con, format, expNames = NULL, trackLine = NULL, ...) export.bed(object, con, ...) export.bed15(object, con, ...) export.bedGraph(object, con, ...) } \arguments{ \item{con}{A path, URL, connection or \code{BEDFile} object. For the functions ending in \code{.bed}, \code{.bedGraph} and \code{.bed15}, the file format is indicated by the function name. For the base \code{export} and \code{import} functions, the format must be indicated another way. If \code{con} is a path, URL or connection, either the file extension or the \code{format} argument needs to be one of \dQuote{bed}, \dQuote{bed15} or \dQuote{bedGraph}. Compressed files (\dQuote{gz}, \dQuote{bz2} and \dQuote{xz}) are handled transparently. } \item{object}{The object to export, should be a \code{RangedData} or something coercible to a \code{RangedData}, like a \code{GRanges}. If the object has a method for \code{asBED}, it is called prior to coercion. This makes it possible to export a \code{GRangesList} or \code{TranscriptDb} in a way that preserves the hierarchical structure. For exporting multiple tracks, in the UCSC track line metaformat, pass a \code{RangedDataList}, or something coercible to one, like a \code{GenomicRangesList}. } \item{format}{If not missing, should be one of \dQuote{bed}, \dQuote{bed15} or \dQuote{bedGraph}.} \item{text}{If \code{con} is missing, a character vector to use as the input} \item{trackLine}{Whether to parse/output a UCSC track line. An imported track line will be stored in a \code{\linkS4class{TrackLine}} object, as part of the returned \code{\linkS4class{UCSCData}}. } \item{genome}{The identifier of a genome, or \code{NA} if unknown. Typically, this is a UCSC identifier like \dQuote{hg19}. An attempt will be made to derive the \code{seqinfo} on the return value using either an installed BSgenome package or UCSC, if network access is available. } \item{asRangedData}{If \code{TRUE}, a \code{RangedData} is returned, instead of a \code{GRanges}. } \item{colnames}{A character vector naming the columns to parse. These should name columns in the result, not those in the BED spec, so e.g. specify \dQuote{thick}, instead of \dQuote{thickStart}. } \item{which}{A range data structure like \code{RangesList} or \code{GRanges}. Only the intervals in the file overlapping the given ranges are returned. This is much more efficient when the file is indexed with the tabix utility. } \item{index}{If \code{TRUE}, automatically compress and index the output file with bgzf and tabix. Note that tabix indexing will sort the data by chromosome and start. Does not work when exporting a \code{RangedDataList} with multiple elements; tabix supports a single track in a file. } \item{ignore.strand}{Whether to output the strand when not required (by the existence of later fields). } \item{seqinfo}{If not \code{NULL}, the \code{Seqinfo} object to set on the result. If the \code{genome} argument is not \code{NA}, it must agree with \code{genome(seqinfo)}. } \item{extraCols}{Names of extra columns to read from the BED file. As BED does not encode column names, these are assumed to be the last columns in the file. This enables parsing of the various BEDX+Y formats. } \item{append}{If \code{TRUE}, and \code{con} points to a file path, the data is appended to the file. Obviously, if \code{con} is a connection, the data is always appended. } \item{expNames}{character vector of column names in \code{object} to export as sample columns in the BED15 file.} \item{...}{Arguments to pass down to methods to other methods. For import, the flow eventually reaches the \code{BEDFile} method on \code{import}. For export, the \code{RangedData}, \code{BEDFile} method on \code{export} is the sink. When \code{trackLine} is \code{TRUE} or the target format is BED15, the arguments are passed through \code{export.ucsc}, so track line parameters are supported. } } \value{ A \code{GRanges} (or \code{RangedData} if \code{asRangedData} is \code{TRUE}), with the metadata columns described in the details. } \details{ The BED format is a tab-separated table of intervals, with annotations like name, score and even sub-intervals for representing alignments and gene models. Official (UCSC) child formats currently include BED15 (adding a number matrix for e.g. expression data across multiple samples) and BEDGraph (a compressed means of storing a single score variable, e.g. coverage; overlapping features are not allowed). Many tools and organizations have extended the BED format with additional columns for particular use cases. These are not yet supported by rtracklayer, but a mechanism will be added soon. The advantage of BED is its balance between simplicity and expressiveness. It is also relatively scalable, because only the first three columns (chrom, start and end) are required. Thus, BED is best suited for representing simple features. For specialized cases, one is usually better off with another format. For example, genome-scale vectors belong in \link[=BigWigFile]{BigWig}, alignments from high-throughput sequencing belong in \link[Rsamtools:BamFile]{BAM}, and gene models are more richly expressed in \link[=GFFFile]{GFF}. The following is the mapping of BED elements to a \code{GRanges} or \code{RangedData} object. NA values are allowed only where indicated. These appear as a \dQuote{.} in the file. Only the first three columns (chrom, start and strand) are required. The other columns can only be included if all previous columns (to the left) are included. Upon export, default values are used to automatically pad the table, if necessary. \describe{ \item{chrom, start, end}{the \code{ranges} component.} \item{name}{character vector (NA's allowed) in the \code{name} column; defaults to NA on export. } \item{score}{numeric vector in the \code{score} column, accessible via the \code{score} accessor. Defaults to 0 on export. This is the only column present in BEDGraph (besides chrom, start and end), and it is required. } \item{strand}{strand factor (NA's allowed) in the \code{strand} column, accessible via the \code{strand} accessor; defaults to NA on export. } \item{thickStart, thickEnd}{\code{Ranges} object in a column named \code{thick}; defaults to the ranges of the feature on export. } \item{itemRgb}{an integer matrix of color codes, as returned by \code{\link{col2rgb}}, or any valid input to \code{\link{col2rgb}}, in the \code{itemRgb} column; default is NA on export, which translates to black. } \item{blockSizes, blockStarts, blockCounts}{\code{RangesList} object in a column named \code{blocks}; defaults to empty upon BED15 export. } } These columns are present only in BED15: \describe{ \item{expCount, expIds, expScores}{A column for each unique element in \code{expIds}, containing the corresponding values from \code{expScores}. When a value is not present for a feature, NA is substituted. NA values become -10000 in the file. } } } \section{BEDFile objects}{ The \code{BEDFile} class extends \code{\linkS4class{RTLFile}} and is a formal represention of a resource in the BED format. To cast a path, URL or connection to a \code{BEDFile}, pass it to the \code{BEDFile} constructor. Classes and constructors also exist for the subclasses \code{BED15File} and \code{BEDGraphFile}. } \author{Michael Lawrence} \references{ \url{http://genome.ucsc.edu/goldenPath/help/customTrack.html} } \examples{ test_path <- system.file("tests", package = "rtracklayer") test_bed <- file.path(test_path, "test.bed") test <- import(test_bed, asRangedData = FALSE) test rd <- import.bed(test_bed, asRangedData = TRUE) rd test_bed_file <- BEDFile(test_bed) import(test_bed_file, asRangedData = FALSE) test_bed_con <- file(test_bed) import(test_bed_con, format = "bed", asRangedData = FALSE) close(test_bed_con) import(test_bed, trackLine = FALSE, asRangedData = FALSE) import(test_bed, genome = "hg19", asRangedData = FALSE) import(test_bed, colnames = c("name", "strand", "thick"), asRangedData = FALSE) which <- RangesList(chr7 = as(test, "RangesList")[[1]][1:2]) import(test_bed, which = which, asRangedData = FALSE) \dontrun{ test_bed_out <- file.path(tempdir(), "test.bed") export(test, test_bed_out) test_bed_out_file <- BEDFile(test_bed_out) export(test, test_bed_out_file) export(rd, test_bed_out, name = "Alternative name") test_bed_gz <- paste(test_bed_out, ".gz", sep = "") export(test, test_bed_gz) export(test, test_bed_out, index = TRUE) export(test, test_bed_out, index = TRUE, trackLine = FALSE) bed_text <- export(test, format = "bed") test <- import(format = "bed", text = bed_text, asRangedData = FALSE) } } \keyword{methods} \keyword{classes} rtracklayer/man/BamFile-methods.Rd0000644000126300012640000000360312227067666020502 0ustar00biocbuildphs_compbio\name{BamFile-methods} \alias{export,ANY,BamFile,ANY-method} \alias{export,GAlignments,BamFile,ANY-method} \alias{import,BamFile,ANY,ANY-method} \title{Export to BAM Files} \description{ Methods for import and export of \code{\link[GenomicRanges]{GAlignments}} objects from and to BAM files, represented as \code{\link[Rsamtools]{BamFile}} objects. } \usage{ \S4method{import}{BamFile,ANY,ANY}(con, format, text, use.names = FALSE, param = ScanBamParam(...), ...) \S4method{export}{ANY,BamFile,ANY}(object, con, format, ...) } \arguments{ \item{object}{The object to export, should be a \code{GAlignments} or one of its subclasses, like \code{GappedReads}. } \item{con}{A path, URL, connection or \code{BamFile} object.} \item{format}{If not missing, should be \dQuote{bam}.} \item{text}{Not supported.} \item{use.names}{Whether to parse QNAME as the names on the result.} \item{param}{The \code{\link[Rsamtools]{ScanBamParam}} object governing the import. } \item{\dots}{Arguments that are passed to \code{ScanBamParam} if \code{param} is missing. } } \details{ BAM fields not formally present in the \code{GAlignments} object are extracted from the metadata columns, if present; otherwise, the missing value, \dQuote{"."}, is output. The file is sorted and indexed. This can be useful for subsetting BAM files, although \code{\link[Rsamtools]{filterBam}} may eventually become flexible enough to be the favored alternative. } \seealso{ \code{\link[GenomicRanges]{readGAlignments}} for reading BAM files into a \code{GAlignments}. } \examples{ library(Rsamtools) ex1_file <- system.file("extdata", "ex1.bam", package="Rsamtools") gal <- import(ex1_file, param=ScanBamParam(what="flag")) gal.minus <- gal[strand(gal) == "-"] \dontrun{ export(gal, BamFile("ex1-minus.bam")) } } \author{Michael Lawrence} rtracklayer/man/Bed15TrackLine-class.Rd0000644000126300012640000000360712227067666021306 0ustar00biocbuildphs_compbio\name{Bed15TrackLine-class} \docType{class} \alias{Bed15TrackLine-class} \alias{coerce,character,Bed15TrackLine-method} \alias{coerce,Bed15TrackLine,character-method} \title{Class "Bed15TrackLine"} \description{ A \acronym{UCSC} track line for graphical tracks. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("Bed15TrackLine", ...)} or parsed from a character vector track line with \code{as(text, "Bed15TrackLine")}. } \section{Slots}{ \describe{ \item{\code{expStep}:}{A \code{"numeric"} scalar indicating the step size for the heatmap color gradient.} \item{\code{expScale}:}{A positive \code{"numeric"} scalar indicating the range of the data to be \code{[-expScale, expScale]} for determining the heatmap color gradient.} \item{\code{expNames}:}{A \code{"character"} vector naming the the experimental samples.} \item{\code{name}:}{Object of class \code{"character"} specifying the name of the track. } \item{\code{description}:}{Object of class \code{"character"} describing the track. } \item{\code{visibility}:}{Object of class \code{"character"} indicating the default visible mode of the track, see \code{\linkS4class{UCSCTrackModes}}.} \item{\code{color}:}{Object of class \code{"integer"} representing the track color (as from \code{\link{col2rgb}}). } \item{\code{priority}:}{Object of class \code{"numeric"} specifying the rank of this track. } } } \section{Extends}{ Class \code{"\linkS4class{TrackLine}"}, directly. } \section{Methods}{ \describe{ \item{as(object, "character")}{Export line to its string representation.} } } \references{ Official documentation: \url{http://genomewiki.ucsc.edu/index.php/Microarray_track}. } \author{ Michael Lawrence } \seealso{ \code{\link{export.bed15}} for exporting bed15 tracks. } \keyword{classes} rtracklayer/man/BigWigFile.Rd0000644000126300012640000001420112227067666017506 0ustar00biocbuildphs_compbio\name{BigWigFile-class} \docType{class} %% Classes: \alias{class:BigWigFile} \alias{BigWigFile-class} \alias{class:BWFile} \alias{BWFile-class} %% Constructor: \alias{BigWigFile} \alias{BWFile} %% Accessors: \alias{seqinfo,BigWigFile-method} %% Import: \alias{import.bw} \alias{import.bw,ANY-method} \alias{import,BigWigFile,ANY,ANY-method} %% Export: \alias{export.bw} \alias{export.bw,ANY-method} \alias{export,ANY,BigWigFile,ANY-method} \alias{export,RangedData,BigWigFile,ANY-method} \alias{export,RleList,BigWigFile,ANY-method} %% Utilites: \alias{summary,BigWigFile-method} \title{BigWig Import and Export} \description{ These functions support the import and export of the UCSC BigWig format, a compressed, binary form of WIG/BEDGraph with a spatial index and precomputed summaries. These functions do not work on Windows. } \usage{ \S4method{import}{BigWigFile,ANY,ANY}(con, format, text, selection = BigWigSelection(which, ...), which = con, asRangedData = FALSE, asRle = FALSE, ...) import.bw(con, ...) \S4method{export}{ANY,BigWigFile,ANY}(object, con, format, ...) \S4method{export}{RangedData,BigWigFile,ANY}(object, con, format, dataFormat = c("auto", "variableStep", "fixedStep", "bedGraph"), compress = TRUE) export.bw(object, con, ...) } \arguments{ \item{con}{A path, URL or \code{BigWigFile} object. Connections are not supported. For the functions ending in \code{.bw}, the file format is indicated by the function name. For the \code{export} and \code{import} methods, the format must be indicated another way. If \code{con} is a path, or URL, either the file extension or the \code{format} argument needs to be \dQuote{bigWig} or \dQuote{bw}. } \item{object}{The object to export, should be an \code{RleList}, \code{RangedData} or something coercible to a \code{RangedData}, like a \code{GRanges}. } \item{format}{If not missing, should be \dQuote{bigWig} or \dQuote{bw} (case insensitive). } \item{text}{Not supported.} \item{asRangedData}{If \code{TRUE}, a \code{RangedData} is returned, instead of a \code{GRanges}. } \item{asRle}{If \code{TRUE}, the BigWig file is assumed to contain contiguous ranges that define a run-length encoding of a vector (like coverage), and an \code{RleList} is returned. } \item{selection}{A \code{\linkS4class{BigWigSelection}} object indicating the ranges to load. } \item{which}{A range data structure coercible to \code{RangesList}, like a \code{GRanges}, or a \code{BigWigFile}. Only the intervals in the file overlapping the given ranges are returned. By default, the value is the \code{BigWigFile} itself. Its \code{Seqinfo} object is extracted and coerced to a \code{RangesList} that represents the entirety of the file. } \item{dataFormat}{Probably best left to \dQuote{auto}. Exists only for historical reasons. } \item{compress}{If \code{TRUE}, compress the data. No reason to change this. } \item{...}{Arguments to pass down to methods to other methods. For import, the flow eventually reaches the \code{BigWigFile} method on \code{import}. For export, the \code{RangedData}, \code{BigWigFile} method on \code{export} is the sink. } } \value{ A \code{GRanges} (or \code{RangedData} if \code{asRangedData} is \code{TRUE}), with the score values in the \code{score} metadata column, which is accessible via the \code{score} function. } \section{\code{BigWigFile} objects}{ A \code{BigWigFile} object, an extension of \code{\linkS4class{RTLFile}} is a reference to a BigWig file. To cast a path, URL or connection to a \code{BigWigFile}, pass it to the \code{BigWigFile} constructor. BigWig files are more complex than most track files, and there are a number of methods on \code{BigWigFile} for accessing the additional information: \describe{ \item{}{ \code{seqinfo(x)}: Gets the \code{\link[GenomicRanges:Seqinfo-class]{Seqinfo}} object indicating the lengths of the sequences for the intervals in the file. No circularity or genome information is available. } \item{}{ \code{summary(ranges = as(seqinfo(object), "GenomicRanges"), size = 1L, type = c("mean", "min", "max", "coverage", "sd"), defaultValue = NA_real_)}: Aggregates the intervals in the file that fall into \code{ranges}, which should be something coercible to \code{GRanges}. The aggregation essentially compresses each sequence to a length of \code{size}. The algorithm is specified by \code{type}; available algorithms include the mean, min, max, coverage (percent sequence covered by at least one feature), and standard deviation. When a window contains no features, \code{defaultValue} is assumed. The result is an \code{\link[IRanges:RleList-class]{RleList}}, with an element for each element in \code{ranges}. The driving use case for this is visualization of coverage when the screen space is small compared to the viewed portion of the sequence. The operation is very fast, as it leverages cached multi-level summaries present in every BigWig file. } } } \author{Michael Lawrence} \seealso{ \code{\link{wigToBigWig}} for converting a WIG file to BigWig. } \examples{ if (.Platform$OS.type != "windows") { test_path <- system.file("tests", package = "rtracklayer") test_bw <- file.path(test_path, "test.bw") test <- import(test_bw, asRangedData = FALSE) test which <- GRanges(c("chr2", "chr2"), IRanges(c(1, 300), c(400, 1000))) import(test_bw, which = which, asRangedData = FALSE) \dontrun{ test_bw_out <- file.path(tempdir(), "test_out.bw") export(test, test_bw_out) } bwf <- BigWigFile(test_bw) track <- import(bwf, asRangedData = FALSE) seqinfo(bwf) summary(bwf) # for each sequence, average all values into one summary(bwf, range(head(track))) # just average the first few features summary(bwf, size = GenomicRanges::seqlengths(bwf) / 10) # 10X reduction summary(bwf, type = "min") # min instead of mean } } \keyword{methods} \keyword{classes} rtracklayer/man/BigWigSelection-class.Rd0000644000126300012640000000334412227067666021665 0ustar00biocbuildphs_compbio\name{BigWigSelection-class} \docType{class} \alias{BigWigSelection-class} % constructor \alias{BigWigSelection} \alias{coerce,RangesList,BigWigSelection-method} \alias{coerce,GenomicRanges,BigWigSelection-method} \title{Selection of ranges and columns} \description{A \code{BigWigSelection} represents a query against a BigWig file, see \code{\link{import.bw}}. It is simply a \link[IRanges]{RangedSelection} that requires its \code{colnames} parameter to be "score", if non-empty, as that is the only column supported by BigWig.} \section{Constructor}{ \describe{ \item{}{\code{BigWigSelection(ranges = GRanges(), colnames = "score")}: Constructs a \code{BigWigSelection} with the given \code{ranges} and \code{colnames}. \code{ranges} can be either something coercible to a \code{\linkS4class{RangesList}}, a \code{character} identifying a genome (see \code{\link{GenomicSelection}}), or a \code{\linkS4class{BigWigFile}}, in which case the ranges are derived from the bounds of its sequences. } } } \section{Coercion}{ \describe{ \item{}{\code{as(from, "BigWigSelection")}: Coerces \code{from} to a \code{BigWigSelection} object. Typically, \code{from} is a \code{\link[GenomicRanges:GRanges-class]{GRanges}} or a \code{\link[IRanges:RangesList-class]{RangesList}}, the ranges of which become the ranges in the new \code{BigWigSelection}. } } } \author{ Michael Lawrence } \examples{ rl <- IRanges::RangesList(chr1 = IRanges::IRanges(c(1, 5), c(3, 6))) BigWigSelection(rl) as(rl, "BigWigSelection") # same as above # do not select the 'score' column BigWigSelection(rl, character()) } \keyword{methods} \keyword{classes} rtracklayer/man/BrowserViewList-class.Rd0000644000126300012640000000125012227067666021753 0ustar00biocbuildphs_compbio\name{BrowserViewList-class} \docType{class} \alias{BrowserViewList-class} % Constructor \alias{BrowserViewList} \title{Lists of BrowserView} \description{ A formal list of \code{\linkS4class{BrowserView}} objects. Extends and inherits all its methods from \code{\link[IRanges:Vector-class]{Vector}}. Usually generated by passing multiple ranges to the \code{\link{browserView}} function. } \section{Constructor}{ \describe{ \item{}{\code{BrowserViewList(...)}: Concatenates the \code{BrowserView} objects in \code{...} into a new \code{BrowserViewList}. This is rarely called by the user. } } } \author{Michael Lawrence} \keyword{classes} rtracklayer/man/Chain-class.Rd0000644000126300012640000000563712227067666017700 0ustar00biocbuildphs_compbio\name{Chain-class} \docType{class} %% Classes: \alias{class:Chain} \alias{Chain-class} \alias{ChainBlock-class} \alias{class:ChainBlock} \alias{class:ChainFile} \alias{ChainFile-class} %% Constructor: \alias{import.chain} \alias{import.chain,ANY-method} \alias{import,ChainFile,ANY,ANY-method} \alias{ChainFile} %% Generics and methods: \alias{ranges,ChainBlock-method} \alias{offset,ChainBlock-method} \alias{score,ChainBlock-method} \alias{space,ChainBlock-method} \alias{reversed} \alias{reversed,ChainBlock-method} \title{Chain objects} \description{ A \code{Chain} object represents a UCSC chain alignment, typically imported from a \code{chain} file, and is essentially a list of \code{ChainBlock} objects. Each \code{ChainBlock} has a corresponding chromosome (its name in the list) and is a run-length encoded alignment, mapping a set of intervals on that chromosome to intervals on the same or other chromosomes. } \note{ A chain file essentially details many local alignments, so it is possible for the "from" ranges to map to overlapping regions in the other sequence. The "from" ranges are guaranteed to be disjoint (but do not necessarily cover the entire "from" sequence). } \section{Accessor Methods}{ In the code snippets below, \code{x} and \code{object} are \code{ChainBlock} objects. \describe{ \item{}{ \code{ranges(x)}: Get the \code{\link[IRanges:Ranges-class]{Ranges}} object holding the starts and ends of the "from" ranges. Each range is a contiguous block of positions aligned without gaps to the other sequence. } \item{}{ \code{offset(x)}: Integer offset from the "from" start to the "end" start (which could be in another chromosome). } \item{}{ \code{score(x)}: The score for each mapping. } \item{}{ \code{space(x)}: The space (chromosome) of the "to" range. } \item{}{ \code{reversed(x)}: Whether the mapping inverts the region, i.e., the alignment is between different strands. } } } \section{Import}{ A \code{Chain} object can be loaded from a UCSC chain format file simply by passing the path \code{import} function. If the file extension is not \dQuote{chain}, then either pass \dQuote{chain} to the \code{format} argument, or cast the path to a \code{ChainFile} object. The \code{import.chain} function is provided as a (slight) convenience. It is documented below, along with the extra \code{exclude} argument to the \code{import} method. \describe{ \item{}{ \code{import.chain(con, exclude = "_", ...)}: Imports a chain file named \code{con} as a \code{Chain} object, a list of \code{ChainBlock}s. Alignments for chromosomes matching the \code{exclude} pattern are not imported. } } } \author{Michael Lawrence} \seealso{ \code{\link{liftOver}} for performing lift overs using a chain alignment } \keyword{methods} \keyword{classes} rtracklayer/man/FastaFile-class.Rd0000644000126300012640000000426612227067666020511 0ustar00biocbuildphs_compbio\name{FastaFile-class} \docType{class} %% Classes: \alias{class:FastaFile} \alias{FastaFile-class} %% Constructor: \alias{FastaFile} %% Import: \alias{import,FastaFile,ANY,ANY-method} %% Export: \alias{export,ANY,FastaFile,ANY-method} \alias{export,XStringSet,FastaFile,ANY-method} \alias{export,BSgenome,FastaFile,ANY-method} \title{FastaFile objects} \description{ These functions support the import and export of the Fasta sequence format, using the Biostrings package. } \usage{ \S4method{import}{FastaFile,ANY,ANY}(con, format, text, type = c("DNA", "RNA", "AA", "B"), ...) \S4method{export}{ANY,FastaFile,ANY}(object, con, format, ...) \S4method{export}{XStringSet,FastaFile,ANY}(object, con, format, ...) \S4method{export}{BSgenome,FastaFile,ANY}(object, con, format, ...) } \arguments{ \item{con}{A path or \code{FastaFile} object. URLs and connections are not supported. If \code{con} is not a \code{FastaFile}, either the file extension or the \code{format} argument needs to be \dQuote{fasta}. Compressed files (\dQuote{gz}, \dQuote{bz2} and \dQuote{xz}) are handled transparently. } \item{object}{The object to export, should be an \code{XStringSet}, \code{BSgenome} or something coercible to a \code{DNAStringSet}, like a character vector. } \item{format}{If not missing, should be \dQuote{fasta}. } \item{text}{If \code{con} is missing, a character vector to use as the input } \item{type}{Type of biological sequence.} \item{...}{Arguments to pass down to \code{\link[Biostrings]{writeXStringSet}} (export) or the \code{\link[Biostrings]{readDNAStringSet}} family of functions (import). } } \seealso{ These functions are implemented by the Biostrings \code{\link[Biostrings]{writeXStringSet}} (export) and the \code{\link[Biostrings]{readDNAStringSet}} family of functions (import). } \section{FastaFile objects}{ The \code{FastaFile} class extends \code{\linkS4class{RTLFile}} and is a formal represention of a resource in the Fasta format. To cast a path, URL or connection to a \code{FastaFile}, pass it to the \code{FastaFile} constructor. } \author{Michael Lawrence} \keyword{methods} \keyword{classes} rtracklayer/man/GFFFile-class.Rd0000644000126300012640000003056312227067666020054 0ustar00biocbuildphs_compbio\name{GFFFile-class} \docType{class} %% Classes: \alias{class:GFFFile} \alias{class:GFF1File} \alias{class:GFF2File} \alias{class:GFF3File} \alias{class:GVFFile} \alias{class:GTFFile} \alias{GFFFile-class} \alias{GFF1File-class} \alias{GFF2File-class} \alias{GFF3File-class} \alias{GVFFile-class} \alias{GTFFile-class} %% Constructor: \alias{GFFFile} \alias{GFF1File} \alias{GFF2File} \alias{GFF3File} \alias{GVFFile} \alias{GTFFile} %% Import: \alias{import,GFFFile,ANY,ANY-method} \alias{import.gff} \alias{import.gff1} \alias{import.gff2} \alias{import.gff3} \alias{import.gff,ANY-method} \alias{import.gff1,ANY-method} \alias{import.gff2,ANY-method} \alias{import.gff3,ANY-method} %% Export: \alias{export,ANY,GFFFile,ANY-method} \alias{export,RangedData,GFFFile,ANY-method} \alias{export,RangedDataList,GFFFile,ANY-method} \alias{export.gff} \alias{export.gff,ANY-method} \alias{export.gff1} \alias{export.gff1,ANY-method} \alias{export.gff2} \alias{export.gff2,ANY-method} \alias{export.gff3} \alias{export.gff3,ANY-method} % Other: \alias{genome,GFFFile-method} \title{GFFFile objects} \description{ These functions support the import and export of the GFF format, of which there are three versions and several flavors. } \usage{ \S4method{import}{GFFFile,ANY,ANY}(con, format, text, version = c("", "1", "2", "3"), genome = NA, asRangedData = FALSE, colnames = NULL, which = NULL, feature.type = NULL) import.gff(con, ...) import.gff1(con, ...) import.gff2(con, ...) import.gff3(con, ...) \S4method{export}{ANY,GFFFile,ANY}(object, con, format, ...) \S4method{export}{RangedData,GFFFile,ANY}(object, con, format, version = c("1", "2", "3"), source = "rtracklayer", append = FALSE, index = FALSE) \S4method{export}{RangedDataList,GFFFile,ANY}(object, con, format, ...) export.gff(object, con, ...) export.gff1(object, con, ...) export.gff2(object, con, ...) export.gff3(object, con, ...) } \arguments{ \item{con}{A path, URL, connection or \code{GFFFile} object. For the functions ending in \code{.gff}, \code{.gff1}, etc, the file format is indicated by the function name. For the base \code{export} and \code{import} functions, the format must be indicated another way. If \code{con} is a path, URL or connection, either the file extension or the \code{format} argument needs to be one of \dQuote{gff}, \dQuote{gff1} \dQuote{gff2}, \dQuote{gff3}, \dQuote{gvf}, or \dQuote{gtf}. Compressed files (\dQuote{gz}, \dQuote{bz2} and \dQuote{xz}) are handled transparently. } \item{object}{The object to export, should be a \code{RangedData} or something coercible to a \code{RangedData}, like a \code{GRanges}. If the object has a method for \code{asGFF}, it is called prior to coercion. This makes it possible to export a \code{GRangesList} or \code{TranscriptDb} in a way that preserves the hierarchical structure. For exporting multiple tracks, in the UCSC track line metaformat, pass a \code{RangedDataList}, or something coercible to one, like a \code{GenomicRangesList}. } \item{format}{If not missing, should be one of \dQuote{gff}, \dQuote{gff1} \dQuote{gff2}, \dQuote{gff3}, \dQuote{gvf}, or \dQuote{gtf}. } \item{version}{If the format is given as \dQuote{gff}, i.e., it does not specify a version, then this should indicate the GFF version as one of \dQuote{} (for import only, from the \code{gff-version} directive in the file or \dQuote{1} if none), \dQuote{1}, \dQuote{2} or \dQuote{3}. } \item{text}{If \code{con} is missing, a character vector to use as the input. } \item{genome}{The identifier of a genome, or \code{NA} if unknown. Typically, this is a UCSC identifier like \dQuote{hg19}. An attempt will be made to derive the \code{seqinfo} on the return value using either an installed BSgenome package or UCSC, if network access is available. } \item{asRangedData}{If \code{TRUE}, a \code{RangedData} is returned, instead of a \code{GRanges}. } \item{colnames}{A character vector naming the columns to parse. These should name either fixed fields, like \code{source} or \code{strand}, or, for GFF2 and GFF3, any attribute. } \item{which}{A range data structure like \code{RangesList} or \code{GRanges}. Only the intervals in the file overlapping the given ranges are returned. This is much more efficient when the file is indexed with the tabix utility. } \item{feature.type}{\code{NULL} (the default) or a character vector of valid feature types. If not \code{NULL}, then only the features of the specified type(s) are imported. } \item{source}{The value for the source column in GFF. This is typically the name of the package or algorithm that generated the feature. } \item{index}{If \code{TRUE}, automatically compress and index the output file with bgzf and tabix. Note that tabix indexing will sort the data by chromosome and start. Does not work when exporting a \code{RangedDataList} with multiple elements; tabix supports a single track in a file. } \item{append}{If \code{TRUE}, and \code{con} points to a file path, the data is appended to the file. Obviously, if \code{con} is a connection, the data is always appended. } \item{...}{Arguments to pass down to methods to other methods. For import, the flow eventually reaches the \code{GFFFile} method on \code{import}. For export, the \code{RangedData}, \code{GFFFile} method on \code{export} is the sink. When \code{trackLine} is \code{TRUE} or the target format is BED15, the arguments are passed through \code{export.ucsc}, so track line parameters are supported. } } \value{ A \code{GRanges} (or \code{RangedData} if \code{asRangedData} is \code{TRUE}), with the metadata columns described in the details. } \details{ The Generic Feature Format (GFF) format is a tab-separated table of intervals. There are three different versions of GFF, and they all have the same number of columns. In GFF1, the last column is a grouping factor, whereas in the later versions the last column holds application-specific attributes, with some conventions defined for those commonly used. This attribute support facilitates specifying extensions to the format. These include GTF (Gene Transfer Format, an extension of GFF2) and GVF (Genome Variation Format, an extension of GFF3). The rtracklayer package recognizes the \dQuote{gtf} and \dQuote{gvf} extensions and parses the extra attributes into columns of the result; however, it does not perform any extension-specific processing. Both GFF1 and GFF2 have been proclaimed obsolete; however, the UCSC Genome Browser only supports GFF1 (and GTF), and GFF2 is still in broad use. GFF is distinguished from the simpler BED format by its flexible attribute support and its hierarchical structure, as specified by the \code{group} column in GFF1 (only one level of grouping) and the \code{Parent} attribute in GFF3. GFF2 does not specify a convention for representing hierarchies, although its GTF extension provides this for gene structures. The combination of support for hierarchical data and arbitrary descriptive attributes makes GFF(3) the preferred format for representing gene models. Although GFF features a \code{score} column, large quantitative data belong in a format like \link[=BigWigFile]{BigWig} and alignments from high-throughput experiments belong in \link[Rsamtools:BamFile]{BAM}. For variants, the VCF format (supported by the VariantAnnotation package) seems to be more widely adopted than the GVF extension. A note on the UCSC track line metaformat: track lines are a means for passing hints to visualization tools like the UCSC Genome Browser and the Integrated Genome Browser (IGB), and they allow multiple tracks to be concatenated in the same file. Since GFF is not a UCSC format, it is not common to annotate GFF data with track lines, but rtracklayer still supports it. To export or import GFF data in the track line format, call \code{\link{export.ucsc}} or \code{\link{import.ucsc}}. The following is the mapping of GFF elements to a \code{GRanges} or \code{RangedData} object. NA values are allowed only where indicated. These appear as a \dQuote{.} in the file. GFF requires that all columns are included, so \code{export} generates defaults for missing columns. \describe{ \item{seqid, start, end}{the \code{ranges} component.} \item{source}{character vector in the \code{source} column; defaults to \dQuote{rtracklayer} on export. } \item{type}{character vector in the \code{type} column; defaults to \dQuote{sequence_feature} in the output, i.e., SO:0000110. } \item{score}{numeric vector (NA's allowed) in the \code{score} column, accessible via the \code{score} accessor; defaults to \code{NA} upon export. } \item{strand}{strand factor (NA's allowed) in the \code{strand} column, accessible via the \code{strand} accessor; defaults to \code{NA} upon export. } \item{phase}{integer vector, either 0, 1 or 2 (NA's allowed); defaults to \code{NA} upon export. } \item{group}{a factor (GFF1 only); defaults to the \code{seqid} (e.g., chromosome) on export. } } In GFF versions 2 and 3, attributes map to arbitrary columns in the result. In GFF3, some attributes (\code{Parent}, \code{Alias}, \code{Note}, \code{DBxref} and \code{Ontology_term}) can have multiple, comma-separated values; these columns are thus always \code{CharacterList} objects. } \section{GFFFile objects}{ The \code{GFFFile} class extends \code{\linkS4class{RTLFile}} and is a formal represention of a resource in the GFF format. To cast a path, URL or connection to a \code{GFFFile}, pass it to the \code{GFFFile} constructor. The \code{GFF1File}, \code{GFF2File}, \code{GFF3File}, \code{GVFFile} and \code{GTFFile} classes all extend \code{GFFFile} and indicate a particular version of the format. It has the following utility methods: \describe{ \item{}{\code{genome}: Gets the genome identifier from the \dQuote{genome-build} header directive. } } } \author{Michael Lawrence} \references{ \describe{ \item{GFF1, GFF2}{ \url{http://www.sanger.ac.uk/resources/software/gff/spec.html} } \item{GFF3}{\url{http://www.sequenceontology.org/gff3.shtml}} \item{GVF}{\url{http://www.sequenceontology.org/resources/gvf.html}} \item{GTF}{\url{http://mblab.wustl.edu/GTF22.html}} } } \examples{ test_path <- system.file("tests", package = "rtracklayer") test_gff3 <- file.path(test_path, "genes.gff3") ## basic import test <- import(test_gff3, asRangedData = FALSE) test ## import.gff functions import.gff(test_gff3, asRangedData = FALSE) import.gff3(test_gff3, asRangedData = FALSE) ## GFFFile derivatives test_gff_file <- GFF3File(test_gff3) import(test_gff_file, asRangedData = FALSE) test_gff_file <- GFFFile(test_gff3) import(test_gff_file, asRangedData = FALSE) test_gff_file <- GFFFile(test_gff3, version = "3") import(test_gff_file, asRangedData = FALSE) ## from connection test_gff_con <- file(test_gff3) test <- import(test_gff_con, format = "gff", asRangedData = FALSE) close(test_gff_con) ## various arguments import(test_gff3, genome = "hg19", asRangedData = FALSE) import(test_gff3, colnames = character(), asRangedData = FALSE) import(test_gff3, colnames = c("strand", "geneName"), asRangedData = FALSE) ## 'which' which <- RangesList(chr10 = IRanges(90000, 93000)) import(test_gff3, which = which, asRangedData = FALSE) \dontrun{ ## 'append' test_gff3_out <- file.path(tempdir(), "genes.gff3") export(test[seqnames(test) == "chr10"], test_gff3_out) export(test[seqnames(test) == "chr12"], test_gff3_out, append = TRUE) import(test_gff3_out, asRangedData = FALSE) ## 'index' export(test, test_gff3_out, index = TRUE) test_bed_gz <- paste(test_gff3_out, ".gz", sep = "") import(test_bed_gz, which = which, asRangedData = FALSE) ## RangedDataList rdl <- RangedDataList(new("UCSCData", test[1], trackLine = new("BasicTrackLine", name = "chr10")), new("UCSCData", test[2], trackLine = new("BasicTrackLine", name = "chr12"))) names(rdl) <- names(test) export(rdl, test_gff3_out) import.ucsc(test_gff3_out, asRangedData = FALSE) } } \keyword{methods} \keyword{classes} rtracklayer/man/GRangesForUCSCGenome.Rd0000644000126300012640000000371012227067666021347 0ustar00biocbuildphs_compbio\name{GRangesForUCSCGenome} \alias{GRangesForUCSCGenome} \alias{GRangesForBSGenome} \alias{SeqinfoForUCSCGenome} \alias{SeqinfoForBSGenome} \title{ GRanges for a Genome } \description{ These functions assist in the creation of \code{\link[GenomicRanges:Seqinfo-class]{Seqinfo}} or \code{\link[GenomicRanges:GRanges-class]{GRanges}} for a genome. } \usage{ GRangesForUCSCGenome(genome, chrom = NULL, ranges = NULL, ...) GRangesForBSGenome(genome, chrom = NULL, ranges = NULL, ...) SeqinfoForUCSCGenome(genome) SeqinfoForBSGenome(genome) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{genome}{ A string identifying a genome, usually one assigned by UCSC, like "hg19". } \item{chrom}{ A character vector of chromosome names, or \code{NULL}. } \item{ranges}{ A \code{\link[IRanges:Ranges-class]{Ranges}} object with the intervals. } \item{\dots}{ Additional arguments to pass to the \code{\link[GenomicRanges:GRanges]{GRanges}} constructor. } } \details{ The genome ID is stored in the metadata of the ranges and is retrievable via the \code{\link{genome}} function. The sequence lengths are also properly initialized for the genome. This mitigates the possibility of accidentally storing intervals for the wrong genome. \code{GRangesForUCSCGenome} obtains sequence information from the UCSC website, while \code{GRangesForBSGenome} looks for it in an installed \code{BSGenome} package. Using the latter is more efficient in the long-run, but requires downloading and installing a potentially large genome package, or creating one from scratch if it does not yet exist for the genome of interest. } \value{ For the \code{GRangesFor*} functions, a \code{GRanges} object, with the appropriate \code{\link[GenomicRanges:seqlengths]{seqlengths}} and \code{\link{genome}} ID. The \code{SeqinfoFor*} functions return a \code{Seqinfo} for the indicated genome. } \author{ Michael Lawrence } rtracklayer/man/GenomicSelection.Rd0000644000126300012640000000171312227067666020771 0ustar00biocbuildphs_compbio\name{GenomicSelection} \alias{GenomicSelection} \title{ Genomic data selection } \description{ Convenience constructor of a \link[IRanges]{RangedSelection} object for selecting a data on a per-chromosome basis for a given genome. } \usage{ GenomicSelection(genome, chrom = NULL, colnames = character(0)) } \arguments{ \item{genome}{ A string identifying a genome. Should match the end of a BSgenome package name, e.g. "hg19". } \item{chrom}{ Character vector naming chromosomes to select. } \item{colnames}{ The column names to select from the dataset. } } \value{ A \link[IRanges]{RangedSelection} object, selecting entire chromosomes } \author{ Michael Lawrence } \seealso{ \code{\link[IRanges]{RangedSelection}}, \code{\link{BigWigSelection}} } \examples{ # every chromosome from hg19 GenomicSelection("hg19") # chr1 and 2 from hg19, with a score column GenomicSelection("hg19", c("chr1", "chr2"), "score") } \keyword{ manip } rtracklayer/man/Quickload-class.Rd0000644000126300012640000000402412227067666020557 0ustar00biocbuildphs_compbio\name{Quickload-class} \docType{class} %% Classes: \alias{class:Quickload} \alias{Quickload-class} %% Constructor: \alias{Quickload} %% Accessors: \alias{$,Quickload-method} \alias{[[,Quickload,ANY,ANY-method} \alias{genome,Quickload-method} \alias{length,Quickload-method} \alias{uri} %% Coercion: \alias{coerce,character,Quickload-method} %% Show: \alias{show,Quickload-method} \title{Quickload Access} \description{ The \code{Quickload} class represents a Quickload data source, essentially directory layout separating tracks and sequences by genome, along with a few metadata files. This interface abstracts those details and provides access to a Quickload at any URL supported by R (HTTP, FTP, and local files). This is an easy way to make data accessible to the Integrated Genome Browser (IGB). } \section{Constructor}{ \describe{ \item{}{ \code{Quickload(uri = "quickload", create = FALSE)}: Constructs a new \code{Quickload} object, representing a repository at \code{uri}. If \code{create} is \code{TRUE}, and \code{uri} is writeable (i.e., local), the repository is created if it does not already exist. If it does exist, then a message is emitted to indicate that the repository was not recreated. } } } \section{Accessor Methods}{ In the code snippets below, \code{x} represents a \code{Quickload} object. \describe{ \item{}{\code{x$genome}, \code{x[["genome"]]}: Get the \code{\linkS4class{QuickloadGenome}} object for the genome named \code{genome}. This is where all the data is stored. } \item{}{\code{length(x)}: number of genomes in the repository } \item{}{\code{uri(x)}: Get the URI pointing to the Quickload repository. } \item{}{\code{genome(x)}: Get the identifiers of the genomes present in the repository. } } } \author{Michael Lawrence} \examples{ ql <- Quickload(system.file("tests", "quickload", package = "rtracklayer")) uri(ql) genome(ql) ql$T_species_Oct_2011 } \keyword{methods} \keyword{classes} rtracklayer/man/QuickloadGenome-class.Rd0000644000126300012640000001532612227067666021721 0ustar00biocbuildphs_compbio\name{QuickloadGenome-class} \docType{class} %% Classes: \alias{class:QuickloadGenome} \alias{QuickloadGenome-class} %% Constructor: \alias{QuickloadGenome} %% Accessors: \alias{seqinfo,QuickloadGenome-method} \alias{seqinfo,DNAStringSet-method} % sneak it in here \alias{seqinfo<-,QuickloadGenome-method} \alias{genome,QuickloadGenome-method} \alias{length,QuickloadGenome-method} \alias{names,QuickloadGenome-method} \alias{quickload} \alias{mcols,QuickloadGenome-method} \alias{releaseDate,QuickloadGenome-method} \alias{organism,QuickloadGenome-method} \alias{uri,QuickloadGenome-method} %% Data Access: \alias{track,QuickloadGenome-method} \alias{track<-,QuickloadGenome,ANY-method} \alias{track<-,QuickloadGenome,RangedData-method} \alias{track<-,QuickloadGenome,RTLFile-method} \alias{track<-,QuickloadGenome,RsamtoolsFile-method} \alias{track<-,QuickloadGenome,character-method} \alias{referenceSequence} \alias{referenceSequence<-} \alias{referenceSequence,QuickloadGenome-method} \alias{referenceSequence<-,QuickloadGenome-method} %% Show \alias{show,QuickloadGenome-method} \title{Quickload Genome Access} \description{ A Quickload data source is a collection of tracks and sequences, separated by genome. This class, \code{QuickloadGenome} provides direct access to the data for one particular genome. } \section{Constructor}{ \describe{ \item{}{ \code{QuickloadGenome(quickload, genome, create = FALSE, seqinfo = seqinfo(genome), title = toString(genome))}: Constructs a new \code{QuickloadGenome} object, representing \code{genome} in the repository \code{quickload} (a URI string or a \code{\linkS4class{Quickload}} object). The \code{genome} argument can be an ID corresponding to a genome (potentially) in \code{quickload} or an installed \code{BSgenome} package. It can also be any instance of a class which has methods for \code{organism} and \code{releaseDate}. A good example is \code{\link[BSgenome:BSgenome-class]{BSgenome}} or any other derivative of \code{\link[BSgenome:GenomeDescription-class]{GenomeDescription}}. Those items are necessary for constructing the canonical Quickload genome string (G_Species_Month_Year). If \code{create} is \code{TRUE}, and the genome does not already exist, the genome will be created, using \code{seqinfo} for the sequence lengths and \code{title} for the display name of the genome in a UI. Creation only works if the repository is local and writeable. Reasonable defaults are used for \code{seqinfo} and \code{title} when the necessary methods are available (and they are for \code{BSgenome}). } } } \section{Accessor Methods}{ In the code snippets below, \code{x} represents a \code{Quickload} object. \describe{ \item{}{ \code{seqinfo(x)}, \code{seqinfo(x) <- value}: Gets or sets the \code{\link[GenomicRanges:Seqinfo-class]{Seqinfo}} object indicating the lengths of the sequences in the genome. No circularity information or genome identifier is stored. } \item{}{ \code{quickload(x)}: Get the Quickload object that contains this genome. } \item{}{ \code{uri(x)}: Get the uri pointing to the genome directory in the Quickload repository } \item{}{ \code{genome(x)}: Get the name of the genome, e.g. \dQuote{H_sapiens_Feb_2009}. } \item{}{ \code{releaseDate(x)}: Get the release portion of the genome name, e.g., \dQuote{Feb_2009}. } \item{}{ \code{organism(x)}: Get the organism portion of the genome name, e.g., \dQuote{H sapiens}. } } } \section{Data Access}{ \describe{ \item{}{ \code{length(x)}: number of datasets } \item{}{ \code{names(x), trackNames(x)}: names of the datasets } \item{}{ \code{mcols(x)}: merged metadata on the datasets } \item{}{ \code{track(x, name), x$name}: get the track called \code{name} } \item{}{ \code{track(x, name, format = bestFileFormat(value), ...) <- value, x$name <- value}: store the track \code{value} under \code{name}. Note that track storing is only supported for local repositories, i.e., those with a \code{file://} URI scheme. Currently, supported \code{value} types include a \code{GenomicRanges}, \code{GRangesList}, or a file resource (copied to the repository). The file resource may be represented as a path, URL, \code{\linkS4class{RTLFile}} or \code{\link[Rsamtools:RsamtoolsFile-class]{RsamtoolsFile}}. If not a file name, \code{value} is written in \code{format}. For generic interval data, this means a BigWig file (if there is a numeric \dQuote{score} column) or a BED file otherwise. An \code{RleList} (e.g., coverage) is output as BigWig. For \code{UCSCData} values, the format is chosen according to the type of track line. For \code{RsamtoolsFile} objects, the file and its index are copied. The arguments in \code{...} become attributes in the XML metadata. The \dQuote{description} attribute is standard and is a blurb for describing the track in a UI. For the rest, the interpretation is up to the client. IGB supports an ever-growing list; please see its documentation. } \item{}{ \code{referenceSequence(x)}: Get the reference sequence, as a \code{DNAStringSet}. } \item{}{ \code{referenceSequence(x) <- value}: Set the reference sequence, as a \code{DNAStringSet}. It is written as a 2bit file. This only works on local repositories. } } } \author{Michael Lawrence} \examples{ tests_dir <- system.file("tests", package = "rtracklayer") ql <- Quickload(file.path(tests_dir, "quickload")) qlg <- QuickloadGenome(ql, "T_species_Oct_2011") seqinfo(qlg) organism(qlg) releaseDate(qlg) names(qlg) mcols(qlg) if (.Platform$OS.type != "windows") { # temporary qlg$bedData } \dontrun{ ## populating the test repository ql <- Quickload(file.path(tests_dir, "quickload"), create = TRUE) reference_seq <- import(file.path(tests_dir, "test.2bit")) names(reference_seq) <- "test" qlg <- QuickloadGenome(ql, "T_species_Oct_2011", create = TRUE, seqinfo = seqinfo(reference_seq)) referenceSequence(qlg) <- reference_seq test_bed <- import(file.path(tests_dir, "test.bed")) names(test_bed) <- "test" qlg$bedData <- test_bed test_bedGraph <- import(file.path(tests_dir, "test.bedGraph")) names(test_bedGraph) <- "test" start(test_bedGraph) <- seq(1, 90, 10) width(test_bedGraph) <- 10 track(qlg, "bedGraphData", format = "bw") <- test_bedGraph } } \keyword{methods} \keyword{classes} rtracklayer/man/RTLFile-class.Rd0000644000126300012640000000224012227067666020102 0ustar00biocbuildphs_compbio\name{RTLFile-class} \docType{class} %% Classes: \alias{class:RTLFile} \alias{RTLFile-class} \alias{class:CompressedFile} \alias{CompressedFile-class} %% Accessors \alias{path} \alias{path,RTLFile-method} \alias{resource} %% Show: \alias{show,RTLFile-method} \title{RTLFile objects} \description{ A \code{RTLFile} object is the base class for classes representing files accessible with rtracklayer. It wraps a resource (either a path, URL or connection). } \section{Accessor Methods}{ In the code snippets below, \code{x} represents a \code{RTLFile} object. \describe{ \item{}{ \code{path(x)}: Gets the path, as a \code{character} vector, to the resource represented by the \code{RTLFile} object, if possible. } \item{}{ \code{resource(x)}: Gets the low-level resource, either a character vector (a path or URL) or a connection. } } } \author{Michael Lawrence} \seealso{ Implementing classes include: \code{\linkS4class{BigWigFile}}, \code{\linkS4class{TwoBitFile}}, \code{\linkS4class{BEDFile}}, \code{\linkS4class{GFFFile}}, and \code{\linkS4class{WIGFile}}. } \keyword{methods} \keyword{classes} rtracklayer/man/RangedData-methods.Rd0000644000126300012640000001245412227067666021201 0ustar00biocbuildphs_compbio\name{RangedData-methods} \docType{methods} \alias{RangedData-methods} % constructor \alias{GenomicData} % accessors \alias{chrom} \alias{chrom,RangedData-method} \alias{chrom,GRanges-method} \alias{chrom<-} \alias{chrom<-,RangedData-method} \alias{chrom<-,GRanges-method} \alias{seqinfo,RangedData-method} \alias{seqinfo<-,RangedData-method} \alias{seqnames,RangedData-method} \alias{score,ANY-method} \alias{score,GenomicRangesORGRangesList-method} \title{Data on a Genome} \description{The \code{rtracklayer} package adds convenience methods on top of \code{RangedData} and \code{GenomicRanges} to manipulate data on genomic ranges. For \code{RangedData} the spaces are now called chromosomes (but could still refer to some other type of sequence). Similarly the universe refers to the genome.} \section{Accessors}{ In the code snippets below, \code{x} is a \code{RangedData} or \code{GenomicRanges} object. \describe{ \item{}{ \code{chrom(x), chrom(x) <- value}: Gets or sets the chromosome names for \code{x}. The length of \code{value} should equal the length of \code{x}. This is an alias for \code{\link[IRanges:RangedData-class]{names}(x)}. } \item{}{ \code{seqnames(x)}: Gets the sequence names for \code{x}. The length of the return value equals the number of rows in \code{x}. This is an alias for \code{\link[IRanges:RangedData-class]{space}(x)}. } \item{}{ \code{seqinfo(x)}, \code{seqinfo(x) <- value}: Gets or sets the sequence information as a \code{\link[GenomicRanges:Seqinfo-class]{Seqinfo}} object. This is just a wrapper on top of \code{\link[=RangesList-methods]{seqinfo}} for \code{ranges(x)}. } \item{}{ \code{score(x)}: Gets the \dQuote{score} column from the element metadata of a \code{GenomicRanges} or \code{GRangesList}. Many track formats have a score column, so this is often used during export. The IRanges package defines a method for \code{RangedData}. The \code{ANY} fallback for this method simply returns \code{NULL}. } } } \section{Constructor}{ \describe{ \item{}{ \code{GenomicData(ranges, ..., strand = NULL, chrom = NULL, genome = NULL, asRangedData = FALSE)}: If \code{asRangedData} is \code{FALSE} (the default), constructs a \code{GRanges} instance with the given \code{ranges} and variables in \code{...} (see the \code{\link[GenomicRanges]{GRanges}} constructor). If \code{asRangedData} is \code{TRUE}, constructs a \code{RangedData} instance with the given \code{ranges} and variables in \code{...}. If non-\code{NULL}, the \code{strand} argument specifies the strand of each range. It should be a character vector or factor of length equal to that of \code{ranges}. All values should be either \code{-}, \code{+}, \code{*} or \code{NA}. (The \code{NA} code for \code{strand} is only acceptable when \code{asRangedData} is \code{TRUE}.) To get the levels for \code{strand}, call \code{levels(strand())}. \code{chrom} argument is analogous to \code{seqnames} in the \code{GRanges} and \code{space} in \code{RangedData} constructors. The \code{genome} argument should be a scalar string and is treated as the \code{RangedData} universe. See the examples. If \code{ranges} is not a \code{Ranges} object, this function calls \code{as(ranges, "RangedData")} and returns the result if successful. As a special case, the \dQuote{chrom} column in a \code{data.frame}-like object is renamed to \dQuote{space}, for convenience. Thus, one could pass a \code{data.frame} with columns \dQuote{start}, \dQuote{end} and, optionally, \dQuote{chrom}. } } } \author{ Michael Lawrence and Patrick Aboyoun } \examples{ range1 <- IRanges::RangesList(chr1 = IRanges::IRanges(c(1,2,3), c(5,2,8))) ## just ranges ## ## GRanges instance gr <- GenomicData(range1, asRangedData = FALSE) ## RangedData instance rd <- GenomicData(range1, asRangedData = TRUE) ## with a genome (universe) ## ## GRanges instance gr <- GenomicData(range1, genome = "hg18", asRangedData = FALSE) genome(gr) ## "hg18" ## RangedData instance rd <- GenomicData(range1, genome = "hg18", asRangedData = TRUE) genome(rd) ## "hg18" ## with some data ## filter <- c(1L, 0L, 1L) score <- c(10L, 2L, NA) strand <- factor(c("+", NA, "-"), levels = levels(strand())) ## GRanges instance gr <- GenomicData(range1[[1]], score, chrom = "chr1", genome = "hg18", asRangedData = FALSE) mcols(gr)[["score"]] strand(gr) ## all '*' gr <- GenomicData(range1[[1]], score, filt = filter, strand = strand, chrom = "chr1", asRangedData = FALSE) mcols(gr)[["filt"]] strand(gr) ## equal to 'strand' ## RangedData instance rd <- GenomicData(range1[[1]], score, chrom = "chr1", genome = "hg18", asRangedData = TRUE) rd[["score"]] strand(rd) ## all NA rd <- GenomicData(range1[[1]], score, filt = filter, strand = strand, chrom = "chr1", asRangedData = TRUE) rd[["filt"]] strand(rd) ## equal to 'strand' ## coercion from data.frame ## df <- as.data.frame(rd) GenomicData(df, asRangedData = FALSE) GenomicData(df, asRangedData = TRUE) } \keyword{classes} \keyword{methods} rtracklayer/man/RangesList-methods.Rd0000644000126300012640000000375512227067666021266 0ustar00biocbuildphs_compbio\name{RangesList-methods} \docType{methods} \alias{RangesList-methods} % accessors \alias{chrom,RangesList-method} \alias{chrom<-,RangesList-method} \alias{seqinfo,RangesList-method} \alias{seqinfo<-,RangesList-method} \alias{seqnames,RangesList-method} \title{Ranges on a Genome} \description{ Genomic coordinates are often specified in terms of a genome identifier, chromosome name, start position and end position. \code{\link[IRanges:RangedData-class]{RangedData}} represents this with a \code{\link[IRanges:RangesList-class]{RangesList}} instance, and the \code{rtracklayer} package adds convenience methods to \code{RangesList} for the manipulation of genomic ranges. The spaces (or names) of \code{RangesList} are the chromosome names. The \code{universe} slot indicates the genome, usually as given by UCSC (e.g. \dQuote{hg18}). } \section{Accessors}{ In the code snippets below, \code{x} is a \code{RangesList} object. \describe{ \item{}{ \code{chrom(x), chrom(x) <- value}: Gets or sets the chromosome names for \code{x}. This is an alias for \code{\link[IRanges:RangesList-class]{names}(x)}. } \item{}{ \code{seqnames(x)}: Gets the sequence names for the ranges in \code{x}, as an \code{RleList} of length equal to the length of \code{x}. } \item{}{ \code{seqinfo(x)}, \code{seqinfo(x) <- value}: Gets or sets the sequence information as a \code{\link[GenomicRanges:Seqinfo-class]{Seqinfo}} object. If this has not been set explicitly, it tries to come up with a reasonable default. First, it assumes the \code{\link[IRanges]{universe}} on \code{x} is a genome identifier and attempts to look up the corresponding metadata an installed BSgenome package or, if that fails, via UCSC. If that fails, it uses \code{names(x)} as the \code{seqnames} and \code{end(range(x))} as the \code{seqlengths}. } } } \author{ Michael Lawrence } \keyword{classes} \keyword{methods} rtracklayer/man/TabixFile-methods.Rd0000644000126300012640000000456312227067666021060 0ustar00biocbuildphs_compbio\name{TabixFile-methods} \alias{import,TabixFile,character,ANY-method} \alias{import,TabixFile,missing,ANY-method} \title{TabixFile Import} \description{ These methods support the import of \code{Rsamtools:TabixFile}{TabixFile} objects. These are generally useful when importing tabix-indexed files that have a non-standard format (i.e., not BED nor GFF). This relies on the tabix header, which indicates the columns in the file that correspond to the chromosome, start and end. The BED and GFF parsers handle tabix transparently. } \usage{ \S4method{import}{TabixFile,character,ANY}(con, format, text, which = if (is.na(genome)) NULL else as(seqinfoForGenome(genome), "GenomicRanges"), genome = NA, header = TRUE, ...) \S4method{import}{TabixFile,missing,ANY}(con, format, text, ...) } \arguments{ \item{con}{A \code{TabixFile} object} \item{format}{If any known format, like \dQuote{bed} or \dQuote{gff} (or one of their variants), then the appropriate parser is applied. If any other value, then the tabix header is consulted for the format. By default, this is taken from the file extension. } \item{text}{Ignored.} \item{which}{A range data structure coercible to \code{RangesList}, like a \code{GRanges}. Only the intervals in the file overlapping the given ranges are returned. The default is to use the range over the entire genome given by \code{genome}, if specified. } \item{genome}{The identifier of a genome, or \code{NA} if unknown. Typically, this is a UCSC identifier like \dQuote{hg19}. An attempt will be made to derive the \code{seqinfo} on the return value using either an installed BSgenome package or UCSC, if network access is available. } \item{header}{If \code{TRUE}, then the header in the indexed file, which might include a track line, is sent to the parser. Otherwise, the initial lines are skipped, according to the \code{skip} field in the tabix index header. } \item{...}{Extra arguments to pass to the underlying import routine, which for non-standard formats is \code{\link{read.table}}. } } \value{ A \code{RangedData} or \code{GRanges}, depending on arguments. } \references{ \url{http://samtools.sourceforge.net/tabix.shtml} } \seealso{ \code{\link[Rsamtools]{scanTabix}} and friends } \author{Michael Lawrence} rtracklayer/man/TrackDb-class.Rd0000644000126300012640000000270612227067666020162 0ustar00biocbuildphs_compbio\name{TrackDb-class} \docType{class} %% Classes: \alias{class:TrackDb} \alias{TrackDb-class} %% Accessors: \alias{$,TrackDb-method} \alias{$<-,TrackDb-method} \alias{[[,TrackDb,ANY,ANY-method} \alias{[[<-,TrackDb,ANY,ANY-method} %% Data Access: \alias{track<-,TrackDb,ANY-method} \alias{track<-,TrackDb,RangedData-method} \alias{track<-,TrackDb,RangedDataList-method} \title{Track Databases} \description{ The \code{TrackDb} class is an abstraction around a database of tracks. Implementations include \code{\linkS4class{BrowserSession}} derivatives and \code{\linkS4class{QuickloadGenome}}. Here, a track is defined as an interval dataset. } \section{Accessor Methods}{ Every implementation should support these methods: \describe{ \item{}{ \code{length(x)}: number of tracks } \item{}{ \code{names(x)}, \code{trackNames(x)}: names of the tracks } \item{}{ \code{mcols(x)}: merged metadata on the tracks } \item{}{ \code{track(x, name)}, \code{x$name}, \code{x[[name]]}: get the track called \code{name} } \item{}{ \code{track(x, name) <- value}, \code{x$name <- value}, \code{x[[name]] <- value}: store the track \code{value} under \code{name}. Different implementations will support different types for \code{value}. Generally, an interval data structure like \code{GenomicRanges}. } } } \author{Michael Lawrence} \keyword{methods} \keyword{classes} rtracklayer/man/TwoBitFile-class.Rd0000644000126300012640000001055312227067666020657 0ustar00biocbuildphs_compbio\name{TwoBitFile-class} \docType{class} %% Classes: \alias{class:TwoBitFile} \alias{TwoBitFile-class} \alias{class:2BitFile} \alias{2BitFile-class} %% Constructor: \alias{TwoBitFile} \alias{2BitFile} %% Accessors: \alias{seqinfo,TwoBitFile-method} %% Import: \alias{import.2bit} \alias{import.2bit,ANY-method} \alias{import,TwoBitFile,ANY,ANY-method} %% Export: \alias{export.2bit} \alias{export.2bit,ANY-method} \alias{export,DNAStringSet,TwoBitFile,ANY-method} \alias{export,DNAStringSet,character,ANY-method} \alias{export,ANY,TwoBitFile,ANY-method} \alias{export,BSgenome,TwoBitFile,ANY-method} \alias{export,BSgenome,character,ANY-method} \title{2bit Files} \description{ These functions support the import and export of the UCSC 2bit compressed sequence format. The main advantage is speed of subsequence retrieval, as it only loads the sequence in the requested intervals. Compared to the FA format supported by Rsamtools, 2bit offers the additional feature of masking and also has better support in Java (and thus most genome browsers). The supporting \code{TwoBitFile} class is a reference to a TwoBit file. } \usage{ \S4method{import}{TwoBitFile,ANY,ANY}(con, format, text, which = as(seqinfo(con), "GenomicRanges"), ...) import.2bit(con, ...) \S4method{export}{ANY,TwoBitFile,ANY}(object, con, format, ...) \S4method{export}{DNAStringSet,TwoBitFile,ANY}(object, con, format) \S4method{export}{DNAStringSet,character,ANY}(object, con, format, ...) \S4method{export}{BSgenome,TwoBitFile,ANY}(object, con, format, ...) \S4method{export}{BSgenome,character,ANY}(object, con, format, ...) export.2bit(object, con, ...) } \arguments{ \item{con}{A path, URL or \code{TwoBitFile} object. Connections are not supported. For the functions ending in \code{.2bit}, the file format is indicated by the function name. For the \code{export} and \code{import} methods, the format must be indicated another way. If \code{con} is a path, or URL, either the file extension or the \code{format} argument needs to be \dQuote{twoBit} or \dQuote{2bit}. } \item{object}{The object to export, either a \code{DNAStringSet}, \code{BSgenome} and something coercible to a \code{DNAStringSet}, like a character vector. } \item{format}{If not missing, should be \dQuote{twoBit} or \dQuote{2bit} (case insensitive). } \item{text}{Not supported.} \item{which}{A range data structure coercible to \code{RangesList}, like a \code{GRanges}, or a \code{TwoBitFile}. Only the intervals in the file overlapping the given ranges are returned. By default, the value is the \code{TwoBitFile} itself. Its \code{Seqinfo} object is extracted and coerced to a \code{RangesList} that represents the entirety of the file. } \item{...}{Arguments to pass down to methods to other methods. For import, the flow eventually reaches the \code{TwoBitFile} method on \code{import}. For export, the \code{TwoBitFile} methods on \code{export} are the sink. The \code{BSgenome} method forwards arguments to \code{\link[BSgenome]{bsapply}}. } } \value{ For import, a \code{DNAStringSet}. } \section{\code{TwoBitFile} objects}{ A \code{TwoBitFile} object, an extension of \code{\linkS4class{RTLFile}} is a reference to a TwoBit file. To cast a path, URL or connection to a \code{TwoBitFile}, pass it to the \code{TwoBitFile} constructor. A TwoBit file embeds the sequence information, which can be retrieved with the following: \describe{ \item{}{ \code{seqinfo(x)}: Gets the \code{\link[GenomicRanges:Seqinfo-class]{Seqinfo}} object indicating the lengths of the sequences for the intervals in the file. No circularity or genome information is available. } } } \author{Michael Lawrence} \examples{ test_path <- system.file("tests", package = "rtracklayer") test_2bit <- file.path(test_path, "test.2bit") test <- import(test_2bit) test test_2bit_file <- TwoBitFile(test_2bit) import(test_2bit_file) # the whole file which_range <- IRanges(c(10, 40), c(30, 42)) which <- GRanges(names(test), which_range) import(test_2bit, which = which) seqinfo(test_2bit_file) \dontrun{ test_2bit_out <- file.path(tempdir(), "test_out.2bit") export(test, test_2bit_out) ## just a character vector test_char <- as.character(test) export(test_char, test_2bit_out) } } \keyword{methods} \keyword{classes} rtracklayer/man/UCSCData-class.Rd0000644000126300012640000000512412227067666020174 0ustar00biocbuildphs_compbio\name{UCSCData-class} \docType{class} \alias{UCSCData-class} \alias{export.bed,UCSCData,characterORconnection-method} \alias{export.bed15,UCSCData-method} \alias{export.gff,UCSCData,characterORconnection-method} \alias{export.ucsc,UCSCData,characterORconnection-method} \alias{initialize,UCSCData-method} \alias{show,UCSCData-method} \alias{coerce,GRanges,UCSCData-method} \alias{coerce,UCSCData,GRanges-method} \alias{coerce,RangedData,UCSCData-method} \alias{coerce,UCSCData,RangedData-method} \alias{split,UCSCData,ANY-method} \alias{split,UCSCData,Vector-method} \title{Class "UCSCData"} \description{Each track in \acronym{UCSC} has an associated \code{\linkS4class{TrackLine}} that contains metadata on the track.} \section{Slots}{ \describe{ \item{\code{trackLine}:}{Object of class \code{"TrackLine"} holding track metadata. } } } \section{Methods}{ \describe{ \item{\code{\link{export.bed}(object, con, variant = c("base", "bedGraph", "bed15"), color, trackLine = TRUE, ...)}}{ Exports the track and its track line (if \code{trackLine} is \code{TRUE}) to \code{con} in the Browser Extended Display (\acronym{BED}) format. The arguments in \code{...} are passed to \code{\link{export.ucsc}}. } \item{\code{\link{export.bed15}(object, con, expNames = NULL, ...)}}{ Exports the track and its track line (if \code{trackLine} is \code{TRUE}) to \code{con} in the Bed15 format. The data is taken from the columns named in \code{expNames}, which defaults to the \code{expNames} in the track line, if any, otherwise all column names. The arguments in \code{...} are passed to \code{\link{export.ucsc}}. } \item{\code{\link{export.gff}(object)}}{ Exports the track and its track line (as a comment) to \code{con} in the General Feature Format (\acronym{GFF}). } \item{\code{\link{export.ucsc}(object, con, subformat, ...)}}{ Exports the track and its track line to \code{con} in the \acronym{UCSC} meta-format. } \item{\code{as(object, "UCSCData")}}{Constructs a \code{UCSCData} from a \code{RangedData} instance, by adding a default track line and ensuring that the sequence/chromosome names are compliant with UCSC conventions. If there is a numeric score, the track line type is either "bedGraph" or "wig", depending on the feature density. Otherwise, "bed" is chosen. } } } \author{ Michael Lawrence } \seealso{ \code{\link{import}} and \code{\link{export}} for reading and writing tracks to and from connections (files), respectively. } \keyword{classes} rtracklayer/man/UCSCFile-class.Rd0000644000126300012640000001741412227067666020207 0ustar00biocbuildphs_compbio\name{UCSCFile-class} \docType{class} %% Classes: \alias{class:UCSCFile} \alias{UCSCFile-class} %% Constructor: \alias{UCSCFile} %% Import: \alias{import,UCSCFile,ANY,ANY-method} \alias{import.ucsc} \alias{import.ucsc,ANY-method} \alias{import.ucsc,RTLFile-method} %% Export: \alias{export,ANY,UCSCFile,ANY-method} \alias{export,RangedData,UCSCFile,ANY-method} \alias{export,RangedDataList,UCSCFile,ANY-method} \alias{export,UCSCData,UCSCFile,ANY-method} \alias{export.ucsc} \alias{export.ucsc,ANY,ANY-method} \alias{export.ucsc,ANY,RTLFile-method} \title{UCSCFile objects} \description{ These functions support the import and export of tracks emucscded within the UCSC track line metaformat, whereby multiple tracks may be concatenated within a single file, along with metadata mostly oriented towards visualization. Any \code{\linkS4class{UCSCData}} or \code{RangedDataList} object is automatically exported in this format, if the targeted format is known to be compatible. The BED and WIG import methods check for a track line, and delegate to these functions if one is found. Thus, calling this API directly is only necessary when importing embedded GFF (rare), or when one wants to create the track line during the export process. } \usage{ \S4method{import}{UCSCFile,ANY,ANY}(con, format, text, subformat = "auto", drop = FALSE, asRangedData = FALSE, genome = NA, ...) import.ucsc(con, ...) \S4method{export}{ANY,UCSCFile,ANY}(object, con, format, ...) \S4method{export}{RangedData,UCSCFile,ANY}(object, con, format, ...) \S4method{export}{RangedDataList,UCSCFile,ANY}(object, con, format, append = FALSE, index = FALSE, ...) \S4method{export}{UCSCData,UCSCFile,ANY}(object, con, format, subformat = "auto", append = FALSE, index = FALSE, ...) export.ucsc(object, con, ...) } \arguments{ \item{con}{A path, URL, connection or \code{UCSCFile} object. For the functions ending in \code{.ucsc}, the file format is indicated by the function name. For the base \code{export} and \code{import} functions, \dQuote{ucsc} must be passed as the \code{format} argument. } \item{object}{The object to export, should be a \code{RangedData} or something coercible to a \code{RangedData}, like a \code{GRanges}. For exporting multiple tracks pass a \code{RangedDataList}, or something coercible to one, like a \code{GenomicRangesList}. } \item{format}{If not missing, should be \dQuote{ucsc}.} \item{text}{If \code{con} is missing, a character vector to use as the input } \item{subformat}{The file format to use for the actual features, between the track lines. Must be a text-based format that is compatible with track lines (most are). If an \code{RTLFile} subclass other than \code{UCSCFile} is passed as \code{con} to \code{import.ucsc} or \code{export.ucsc}, the subformat is assumed to be the corresponding format of \code{con}. Otherwise it defaults to \dQuote{auto}. The following describes the logic of the \dQuote{auto} mode. For import, the subformat is taken as the \code{type} field in the track line. If none, the file extension is consulted. For export, if \code{object} is a \code{UCSCData}, the subformat is taken as the \code{type} in its track line, if present. Otherwise, the subformat is chosen based on whether \code{object} contains a \dQuote{score} column. If there is a score, the target is either \code{BEDGraph} or \code{WIG}, depending on the structure of the ranges. Otherwise, \code{BED} is the target. } \item{genome}{The identifier of a genome, or \code{NA} if unknown. Typically, this is a UCSC identifier like \dQuote{hg19}. An attempt will be made to derive the \code{seqinfo} on the return value using either an installed BSgenome package or UCSC, if network access is available. This defaults to the \code{db} BED track line parameter, if any. } \item{asRangedData}{If \code{FALSE} (the default), a \code{GenomicRangesList} is returned and the track line is stored in the \code{metadata} of each \code{GRanges} in the list. If \code{TRUE}, a \code{RangedDataList} of \code{UCSCData} objects is returned. } \item{drop}{If \code{TRUE}, and there is only one track in the file, return the track object directly, rather than embedding it in a list. } \item{append}{If \code{TRUE}, and \code{con} points to a file path, the data is appended to the file. Obviously, if \code{con} is a connection, the data is always appended. } \item{index}{If \code{TRUE}, automatically compress and index the output file with bgzf and tabix. Note that tabix indexing will sort the data by chromosome and start. Does not work when exporting a \code{RangedDataList} with multiple elements; tabix supports a single track in a file. } \item{...}{Should either specify track line parameters or arguments to pass down to the import and export routine for the subformat. } } \value{ A \code{GenomicRangesList} if \code{asRangedData} is \code{FALSE}) (and a \code{RangedDataList} otherwise), unless \code{drop} is \code{TRUE} and there is only a single track in the file. In that case, the first and only object is extracted from the list and returned. The structure of that object depends on the format of the data. The \code{GenomicRangesList} contains \code{GRanges} objects with a \code{trackLine} element in their metadata, whereas the \code{RangedDataList} contains \code{UCSCData} objects. } \details{ The UCSC track line permits the storage of multiple tracks in a single file by separating them with a so-called \dQuote{track line}, a line belonging with the word \dQuote{track} and containing various \code{key=value} pairs encoding metadata, most related to visualization. The standard fields in a track depend on the type of track being annotated. See \code{\linkS4class{TrackLine}} and its derivatives for how these lines are represented in R. The class \code{\linkS4class{UCSCData}} is an extension of \code{RangedData} with a formal slot for a \code{TrackLine}, and objects of this type are returned in a \code{RangedDataList} by the import functions described above, as long as \code{asRangedData} is \code{TRUE}. If \code{FALSE}, then each \code{GRanges} in the returned \code{GenomicRangesList} has the track line stored in its metadata, under the \code{trackLine} key. For each track object to be exported, if the object is not a \code{UCSCData}, and there is no \code{trackLine} element in the metadata, then a new track line needs to be generated. This happens through the coercion of \code{object} to \code{UCSCData}. The track line is initialized to have the appropriate \code{type} parameter for the subformat, and the required \code{name} parameter is taken from the name of the track in the input list (if any). Otherwise, the default is simply \dQuote{R Track}. The \code{db} parameter (specific to BED track lines) is taken as \code{genome(object)} if not \code{NA}. Additional arguments passed to the export routines override parameters in the provided track line. If the subformat is either WIG or BEDGraph, and the features are stranded, a separate track will be output in the file for each strand. Neither of those formats encodes the strand and disallow overlapping features (which might occur upon destranding). } \section{UCSCFile objects}{ The \code{UCSCFile} class extends \code{\linkS4class{RTLFile}} and is a formal represention of a resource in the UCSC format. To cast a path, URL or connection to a \code{UCSCFile}, pass it to the \code{UCSCFile} constructor. } \author{Michael Lawrence} \references{ \url{http://genome.ucsc.edu/goldenPath/help/customTrack.html} } \keyword{methods} \keyword{classes} rtracklayer/man/UCSCSchema-class.Rd0000644000126300012640000000247412227067666020530 0ustar00biocbuildphs_compbio\name{UCSCSchema-class} \docType{class} \alias{UCSCSchema-class} \alias{genome,UCSCSchema-method} \alias{tableName,UCSCSchema-method} \alias{genome,UCSCSchema-method} \alias{formatDescription} \alias{formatDescription,UCSCSchema-method} \alias{nrow,UCSCSchema-method} \alias{ucscSchema,UCSCSchemaDescription-method} % Accessors: \title{UCSC Schema} \description{This is a preliminary class that describes a table in the UCSC database. The description includes the table name, corresponding genome, row count, and a textual description of the format. In the future, we could provide more table information, like the links and sample data frame. This is awaiting a use-case.} \section{Accessor methods}{ In the code snippets below, \code{x}/\code{object} is a \code{UCSCSchema} object. \describe{ \item{}{\code{genome(x)}: Get the genome for the table. } \item{}{\code{tableName(x)}: Get the name of the table. } \item{}{\code{nrow(x)}: Get the number of rows in the table. } \item{}{\code{formatDescription(x)}: Get a textual description of the table format. } } } \author{ Michael Lawrence } \examples{ \dontrun{ session <- browserSession() genome(session) <- "mm9" query <- ucscTableQuery(session, "knownGene") schema <- ucscSchema(query) nrow(schema) } } \keyword{methods} \keyword{classes} rtracklayer/man/UCSCTableQuery-class.Rd0000644000126300012640000001713612227067666021406 0ustar00biocbuildphs_compbio\name{UCSCTableQuery-class} \docType{class} \alias{UCSCTableQuery-class} % Accessors: \alias{browserSession,UCSCTableQuery-method} \alias{browserSession<-} \alias{browserSession<-,UCSCTableQuery,UCSCSession-method} \alias{trackName} \alias{trackName,UCSCTableQuery-method} \alias{trackName<-} \alias{trackName<-,UCSCTableQuery-method} \alias{tableName} \alias{tableName,UCSCTableQuery-method} \alias{tableName<-} \alias{tableName<-,UCSCTableQuery-method} \alias{range,UCSCTableQuery-method} \alias{range<-,UCSCTableQuery-method} \alias{names,UCSCTableQuery-method} \alias{names<-,UCSCTableQuery-method} \alias{trackNames,UCSCTableQuery-method} \alias{ucscSchema} \alias{ucscSchema,UCSCTableQuery-method} % Query execution \alias{tableNames} \alias{tableNames,UCSCTableQuery-method} \alias{getTable} \alias{getTable,UCSCTableQuery-method} \alias{track} \alias{track,UCSCTableQuery-method} % Constructor: \alias{ucscTableQuery} \alias{ucscTableQuery,UCSCSession-method} % Show: \alias{show,UCSCTableQuery-method} \title{Querying UCSC Tables} \description{The UCSC genome browser is backed by a large database, which is exposed by the Table Browser web interface. Tracks are stored as tables, so this is also the mechanism for retrieving tracks. The \code{UCSCTableQuery} class represents a query against the Table Browser. Storing the query fields in a formal class facilitates incremental construction and adjustment of a query.} \details{ There are five supported fields for a table query: \describe{ \item{session}{The \code{\linkS4class{UCSCSession}} instance from the tables are retrieved. Although all sessions are based on the same database, the set of user-uploaded tracks, which are represented as tables, is not the same, in general. } \item{trackName}{The name of a track from which to retrieve a table. Each track can have multiple tables. Many times there is a primary table that is used to display the track, while the other tables are supplemental. Sometimes, tracks are displayed by aggregating multiple tables. } \item{tableName}{The name of the specific table to retrieve. May be \code{NULL}, in which case the behavior depends on how the query is executed, see below. } \item{range}{A genome identifier, a \code{\link[GenomicRanges:GRanges-class]{GRanges}} or a \code{\link[IRanges:RangesList-class]{RangesList}} indicating the portion of the table to retrieve, in genome coordinates. Simply specifying the genome string is the easiest way to download data for the entire genome, and \code{\link{GRangesForUCSCGenome}} facilitates downloading data for e.g. an entire chromosome. } \item{names}{Names/accessions of the desired features} } A common workflow for querying the UCSC database is to create an instance of \code{UCSCTableQuery} using the \code{ucscTableQuery} constructor, invoke \code{tableNames} to list the available tables for a track, and finally to retrieve the desired table either as a \code{data.frame} via \code{getTable} or as a \code{RangedData} track via \code{track}. See the examples. The reason for a formal query class is to facilitate multiple queries when the differences between the queries are small. For example, one might want to query multiple tables within the track and/or same genomic region, or query the same table for multiple regions. The \code{UCSCTableQuery} instance can be incrementally adjusted for each new query. Some caching is also performed, which enhances performance. } \section{Constructor}{ \describe{ \item{}{ \code{ucscTableQuery(x, track, range = genome(x), table = NULL, names = NULL)}: Creates a \code{UCSCTableQuery} with the \code{UCSCSession} given as \code{x} and the track name given by the single string \code{track}. \code{range} should be a genome string identifier, a \code{GRanges} instance or \code{RangesList} instance, and it effectively defaults to \code{genome(x)}. If the genome is missing, it is taken from the session. The table name is given by \code{table}, which may be a single string or \code{NULL}. Feature names, such as gene identifiers, may be passed via \code{names} as a character vector. } } } \section{Executing Queries}{ Below, \code{object} is a \code{UCSCTableQuery} instance. \describe{ \item{}{ \code{track(object, asRangedData = FALSE)}: Retrieves the indicated table as a track, i.e. a \code{GRanges} object. Note that not all tables are available as tracks. Pass \code{asRangedData = TRUE} to obtain a \code{RangedData} object. } \item{}{ \code{getTable(object)}: Retrieves the indicated table as a \code{data.frame}. Note that not all tables are output in parseable form, and that UCSC will truncate responses if they exceed certain limits (usually around 100,000 records). The safest (and most efficient) bet for large queries is to download the file via FTP and query it locally. } \item{}{ \code{tableNames(object)}: Gets the names of the tables available for the session, track and range specified by the query. } } } \section{Accessor methods}{ In the code snippets below, \code{x}/\code{object} is a \code{UCSCTableQuery} object. \describe{ \item{}{\code{browserSession(object)}, \code{browserSession(object) <- value}: Get or set the \code{UCSCSession} to query. } \item{}{\code{trackName(x)}, \code{trackName(x) <- value}: Get or set the single string indicating the track containing the table of interest. } \item{}{\code{trackNames(x)}}{List the names of the tracks available for retrieval for the assigned genome.} \item{}{\code{tableName(x)}, \code{tableName(x) <- value}: Get or set the single string indicating the name of the table to retrieve. May be \code{NULL}, in which case the table is automatically determined. } \item{}{\code{range(x)}, \code{range(x) <- value}: Get or set the \code{GRanges} indicating the portion of the table to retrieve in genomic coordinates. Any missing information, such as the genome identifier, is filled in using \code{range(browserSession(x))}. It is also possible to set the genome identifier string or a \code{RangesList}. } \item{}{\code{names(x)}, \code{names(x) <- value}: Get or set the names of the features to retrieve. If \code{NULL}, this filter is disabled. } \item{}{\code{ucscSchema(x)}: Get the \code{\linkS4class{UCSCSchema}} object describing the selected table.} } } \author{ Michael Lawrence } \examples{ \dontrun{ session <- browserSession() genome(session) <- "mm9" trackNames(session) ## list the track names ## choose the Conservation track for a portion of mm9 chr1 query <- ucscTableQuery(session, "Conservation", GRangesForUCSCGenome("mm9", "chr12", IRanges(57795963, 57815592))) ## list the table names tableNames(query) ## get the phastCons30way track tableName(query) <- "phastCons30way" ## retrieve the track data track(query, asRangedData = FALSE) # as a GRanges object track(query, asRangedData = TRUE) # as a RangedData object ## get a data.frame summarizing the multiple alignment tableName(query) <- "multiz30waySummary" getTable(query) genome(session) <- "hg18" query <- ucscTableQuery(session, "snp129", names = c("rs10003974", "rs10087355", "rs10075230")) ucscSchema(query) getTable(query) } } \keyword{methods} \keyword{classes} rtracklayer/man/WIGFile-class.Rd0000644000126300012640000001624312227067666020077 0ustar00biocbuildphs_compbio\name{WIGFile-class} \docType{class} %% Classes: \alias{class:WIGFile} \alias{WIGFile-class} %% Constructor: \alias{WIGFile} %% Import: \alias{import,WIGFile,ANY,ANY-method} \alias{import.wig} \alias{import.wig,ANY-method} %% Export: \alias{export,ANY,WIGFile,ANY-method} \alias{export,RangedData,WIGFile,ANY-method} \alias{export,RangedDataList,WIGFile,ANY-method} \alias{export,UCSCData,WIGFile,ANY-method} \alias{export.wig} \alias{export.wig,ANY-method} \title{WIG Import and Export} \description{ These functions support the import and export of the UCSC WIG (Wiggle) format. } \usage{ \S4method{import}{WIGFile,ANY,ANY}(con, format, text, genome = NA, asRangedData = FALSE, trackLine = TRUE, which = NULL, seqinfo = NULL, ...) import.wig(con, ...) \S4method{export}{ANY,WIGFile,ANY}(object, con, format, ...) \S4method{export}{RangedData,WIGFile,ANY}(object, con, format, dataFormat = c("auto", "variableStep", "fixedStep"), writer = .wigWriter, append = FALSE, ...) \S4method{export}{RangedDataList,WIGFile,ANY}(object, con, format, ...) \S4method{export}{UCSCData,WIGFile,ANY}(object, con, format, trackLine = TRUE, ...) export.wig(object, con, ...) } \arguments{ \item{con}{A path, URL, connection or \code{WIGFile} object. For the functions ending in \code{.wig}, the file format is indicated by the function name. For the base \code{export} and \code{import} functions, the format must be indicated another way. If \code{con} is a path, URL or connection, either the file extension or the \code{format} argument needs to be \dQuote{wig}. Compressed files (\dQuote{gz}, \dQuote{bz2} and \dQuote{xz}) are handled transparently. } \item{object}{The object to export, should be a \code{RangedData} or something coercible to a \code{RangedData}, like a \code{GRanges}. For exporting multiple tracks, in the UCSC track line metaformat, pass a \code{RangedDataList}, or something coercible to one, like a \code{GenomicRangesList}. } \item{format}{If not missing, should be \dQuote{wig}. } \item{text}{If \code{con} is missing, a character vector to use as the input } \item{trackLine}{Whether to parse/output a UCSC track line. An imported track line will be stored in a \code{\linkS4class{TrackLine}} object, as part of the returned \code{\linkS4class{UCSCData}}. } \item{genome}{The identifier of a genome, or \code{NA} if unknown. Typically, this is a UCSC identifier like \dQuote{hg19}. An attempt will be made to derive the \code{seqinfo} on the return value using either an installed BSgenome package or UCSC, if network access is available. } \item{seqinfo}{If not \code{NULL}, the \code{Seqinfo} object to set on the result. If the \code{genome} argument is not \code{NA}, it must agree with \code{genome(seqinfo)}. } \item{asRangedData}{If \code{TRUE}, a \code{RangedData} is returned, instead of a \code{GRanges}. } \item{which}{A range data structure like \code{RangesList} or \code{GRanges}. Only the intervals in the file overlapping the given ranges are returned. This is inefficient; use BigWig for efficient spatial queries. } \item{append}{If \code{TRUE}, and \code{con} points to a file path, the data is appended to the file. Obviously, if \code{con} is a connection, the data is always appended. } \item{dataFormat}{Probably best left to \dQuote{auto}. Exists only for historical reasons. } \item{writer}{Function for writing out the blocks; for internal use only. } \item{...}{Arguments to pass down to methods to other methods. For import, the flow eventually reaches the \code{WIGFile} method on \code{import}. For export, the \code{RangedData}, \code{WIGFile} method on \code{export} is the sink. When \code{trackLine} is \code{TRUE}, the arguments are passed through \code{export.ucsc}, so track line parameters are supported. } } \value{ A \code{GRanges} (or \code{RangedData} if \code{asRangedData} is \code{TRUE}), with the score values in the \code{score} metadata column, which is accessible via the \code{score} function. } \details{ The WIG format is a text-based format for efficiently representing a dense genome-scale score vector. It encodes, for each feature, a range and score. Features from the same sequence (chromosome) are grouped together into a block, with a single block header line indicating the chromosome. There are two block formats: fixed step and variable step. For fixed step, the number of positions (or step) between intervals is the same across an entire block. For variable step, the start position is specified for each feature. For both fixed and variable step, the span (or width) is specified in the header and thus must be the same across all features. This requirement of uniform width dramatically limits the applicability of WIG. For scored features of variable width, consider \link[=BEDGraphFile]{BEDGraph} or \link[=BigWigFile]{BigWig}, which is generally preferred over both WIG and BEDGraph. To efficiently convert an existing WIG or BEDGraph file to BigWig, call \code{\link{wigToBigWig}}. Neither WIG, BEDGraph nor BigWig allow overlapping features. } \section{WIGFile objects}{ The \code{WIGFile} class extends \code{\linkS4class{RTLFile}} and is a formal represention of a resource in the WIG format. To cast a path, URL or connection to a \code{WIGFile}, pass it to the \code{WIGFile} constructor. } \author{Michael Lawrence} \references{ \url{http://genome.ucsc.edu/goldenPath/help/wiggle.html} } \examples{ test_path <- system.file("tests", package = "rtracklayer") test_wig <- file.path(test_path, "step.wig") ## basic import calls test <- import(test_wig, asRangedData = FALSE) test import.wig(test_wig, asRangedData = FALSE) test_wig_file <- WIGFile(test_wig) import(test_wig_file, asRangedData = FALSE) test_wig_con <- file(test_wig) import(test_wig_con, format = "wig", asRangedData = FALSE) close(test_wig_con) test_wig_con <- file(test_wig) import(WIGFile(test_wig_con), asRangedData = FALSE) close(test_wig_con) ## various options import(test_wig, genome = "hg19", asRangedData = FALSE) import(test_wig, trackLine = FALSE, asRangedData = FALSE) which <- as(test[3:4,], "RangesList") import(test_wig, which = which, asRangedData = FALSE) \dontrun{ ## basic export calls test_wig_out <- file.path(tempdir(), "test.wig") export(test, test_wig_out) export.wig(test, test_wig_out) test_foo_out <- file.path(tempdir(), "test.foo") export(test, test_foo_out, format = "wig") test_wig_out_file <- WIGFile(test_wig_out) export(test, test_wig_out_file) ## appending test2 <- test metadata(test2)$trackLine <- initialize(metadata(test)$trackLine, name = "test2") export(test2, test_wig_out_file, append = TRUE) ## passing track line parameters export(test, test_wig_out, name = "test2") ## no track line export(test, test_wig_out, trackLine = FALSE) ## gzip test_wig_gz <- paste(test_wig_out, ".gz", sep = "") export(test, test_wig_gz) } } \keyword{methods} \keyword{classes} rtracklayer/man/activeView-methods.Rd0000644000126300012640000000124312227067666021307 0ustar00biocbuildphs_compbio\name{activeView-methods} \docType{methods} \alias{activeView} \alias{activeView<-} \alias{activeView-methods} \alias{activeView<--methods} \alias{activeView,BrowserSession-method} \alias{activeView,UCSCView-method} \title{Accessing the active view} \description{ Get the active view. } \section{Methods}{ The following methods are defined by \pkg{rtracklayer}. \describe{ \item{object = "BrowserSession"}{ \code{activeView(object)}: Gets the active \code{\linkS4class{BrowserView}} from a browser session. \code{activeView(object) <- value}: Sets the active \code{\linkS4class{BrowserView}} in a browser session. } }} \keyword{methods} rtracklayer/man/asBED.Rd0000644000126300012640000000215512227067666016461 0ustar00biocbuildphs_compbio\name{asBED} \alias{asBED} \alias{asBED,GRangesList-method} \title{Coerce to BED structure} \description{ Coerce the structure of an object to one following BED-like conventions, i.e., with columns for blocks and thick regions. } \usage{ asBED(x, ...) \S4method{asBED}{GRangesList}(x) } \arguments{ \item{x}{ Generally, a tabular object to structure as BED } \item{\dots}{ Arguments to pass to methods } } \details{ The exact behavior depends on the class of \code{object}. \describe{ \item{\code{GRangesList}}{This treats \code{object} as if it were a list of transcripts, i.e., each element contains the exons of a transcript. The \code{blockStarts} and \code{blockSizes} columns are derived from the ranges in each element. Also, add \code{name} column from \code{names(object)}. } } } \value{ A \code{GRanges}, with the columns \code{name}, \code{blockStarts} and \code{blockSizes} added. } \author{ Michael Lawrence } \examples{ \dontrun{ library(TxDb.Hsapiens.UCSC.hg19.knownGene) exons <- exonsBy(TxDb_Hsapiens_UCSC_hg19_knownGene) mcols(asBED(exons)) } } rtracklayer/man/asGFF.Rd0000644000126300012640000000243712227067666016474 0ustar00biocbuildphs_compbio\name{asGFF} \alias{asGFF} \alias{asGFF,GRangesList-method} \title{Coerce to GFF structure} \description{ Coerce the structure of an object to one following GFF-like conventions, i.e., using the \code{Parent} GFF3 attribute to encode the hierarchical structure. This object is then suitable for export as GFF3. } \usage{ asGFF(x, ...) \S4method{asGFF}{GRangesList}(x, parentType = "mRNA", childType = "exon") } \arguments{ \item{x}{ Generally, a tabular object to structure as GFF(3) } \item{parentType}{The value to store in the \code{type} column for the top-level (e.g., transcript) ranges. } \item{childType}{The value to store in the \code{type} column for the child (e.g., exon) ranges. } \item{\dots}{ Arguments to pass to methods } } \value{ For the \code{GRangesList} method: A \code{GRanges}, with the columns: \code{ID} (unique identifier), \code{Name} (from \code{names(x)}, and the names on each element of \code{x}, if any), \code{type} (as given by \code{parentType} and \code{childType}), and \code{Parent} (to relate each child range to its parent at the top-level). } \author{ Michael Lawrence } \examples{ \dontrun{ library(TxDb.Hsapiens.UCSC.hg19.knownGene) exons <- exonsBy(TxDb_Hsapiens_UCSC_hg19_knownGene) mcols(asGFF(exons)) } } rtracklayer/man/basicTrackLine-class.Rd0000644000126300012640000000561212227067666021525 0ustar00biocbuildphs_compbio\name{BasicTrackLine-class} \docType{class} \alias{BasicTrackLine-class} \alias{coerce,character,BasicTrackLine-method} \alias{coerce,BasicTrackLine,character-method} \title{Class "BasicTrackLine"} \description{The type of \acronym{UCSC} track line used to annotate most types of tracks (every type except Wiggle).} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("BasicTrackLine", ...)} or parsed from a character vector track line with \code{as(text, "BasicTrackLine")} or converted from a \code{\linkS4class{GraphTrackLine}} using \code{as(wig, "BasicTrackLine")}. } \section{Slots}{ \describe{ \item{\code{itemRgb}:}{Object of class \code{"logical"} indicating whether each feature in a track uploaded as \acronym{BED} should be drawn in its specified color. } \item{\code{useScore}:}{Object of class \code{"logical"} indicating whether the data value should be mapped to color. } \item{\code{group}:}{Object of class \code{"character"} naming a group to which this track should belong. } \item{\code{db}:}{Object of class \code{"character"} indicating the associated genome assembly. } \item{\code{offset}:}{Object of class \code{"numeric"}, a number added to all positions in the track. } \item{\code{url}:}{Object of class \code{"character"} referring to additional information about this track. } \item{\code{htmlUrl}:}{Object of class \code{"character"} referring to an \acronym{HTML} page to be displayed with this track. } \item{\code{name}:}{Object of class \code{"character"} specifying the name of the track. } \item{\code{description}:}{Object of class \code{"character"} describing the track. } \item{\code{visibility}:}{Object of class \code{"character"} indicating the default visible mode of the track, see \code{\linkS4class{UCSCTrackModes}}.} \item{\code{color}:}{Object of class \code{"integer"} representing the track color (as from \code{\link{col2rgb}}). } \item{\code{colorByStrand}:}{Object of class \code{"matrix"} with two columns, as from \code{col2rgb}. The two colors indicate the color for each strand (positive, negative). } \item{\code{priority}:}{Object of class \code{"numeric"} specifying the rank of the track. } } } \section{Extends}{ Class \code{"\linkS4class{TrackLine}"}, directly. } \section{Methods}{ \describe{ \item{as(object, "character")}{Export line to its string representation.} \item{as(object, \code{"\linkS4class{GraphTrackLine}"})}{Convert this line to a graph track line, using defaults for slots not held in common.} } } \references{ \url{http://genome.ucsc.edu/goldenPath/help/customTrack.html#TRACK} for the official documentation. } \author{ Michael Lawrence } \seealso{ \code{\linkS4class{GraphTrackLine}} for Wiggle/bedGraph tracks. } \keyword{classes} rtracklayer/man/blocks-methods.Rd0000644000126300012640000000251512227067666020461 0ustar00biocbuildphs_compbio\name{blocks-methods} \docType{methods} \alias{blocks} \alias{blocks-methods} \alias{blocks,RangedData-method} \alias{blocks,GenomicRanges-method} \title{Get blocks/exons} \description{ Obtains the block ranges (subranges, usually exons) from an object, such as a \code{\link[IRanges:RangedData-class]{RangedData}} imported from a BED file. } \usage{ blocks(x, ...) } \arguments{ \item{x}{The instance from which to obtain the block/exon information. Currently must be a \code{RangedData} or \code{GenomicRanges}, with a value column of name \dQuote{blocks} and of type \code{RangesList}. Such an object is returned by \code{\link{import.bed}} and \code{\link{asBED}}. } \item{...}{Additional arguments for methods} } \value{ A \code{\link[GenomicRanges:GRangesList-class]{GRangesList}} with an element for each range in \code{x}. The original block ranges are relative to the start of the containing range, so the returned ranges are shifted to absolute coordinates. The seqname and strand are inherited from the containing range. } \author{Michael Lawrence} \seealso{\code{\link{import.bed}} for importing a track from BED, which can store block information; \code{\link{asBED}} for coercing a \code{GenomicRanges} into a BED-like structure that can be passed to this function. } \keyword{methods} \keyword{manip} rtracklayer/man/browseGenome.Rd0000644000126300012640000000423012227067666020173 0ustar00biocbuildphs_compbio\name{browseGenome} \alias{browseGenome} \alias{browseGenome,RangedDataORRangedDataList-method} \alias{browseGenome,GRanges-method} \alias{browseGenome,missing-method} \title{ Browse a genome } \description{ A generic function for launching a genome browser. } \usage{ browseGenome(object, ...) \S4method{browseGenome}{GRanges}(object, ...) \S4method{browseGenome}{RangedDataORRangedDataList}(object, browser = "UCSC", range = base::range(object), view = TRUE, trackParams = list(), viewParams = list(), name = "customTrack", ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{object}{ A \code{\link[GenomicRanges]{GRanges}} object, a \code{\link[IRanges]{RangedData}} object, or a list of \code{\link[IRanges]{RangedData}} objects (e.g. a \code{\link[IRanges]{RangedDataList}} object). } \item{browser}{ The name of the genome browser. } \item{range}{ A genome identifier or a \code{\link[GenomicRanges:GRanges-class]{GRanges}} or \code{\link[IRanges:RangesList-class]{RangesList}} to display in the initial view. } \item{view}{ Whether to open a view. } \item{trackParams}{ Named list of parameters to pass to \code{\link{track<-}}. } \item{viewParams}{ Named list of parameters to pass to \code{\link{browserView}}. } \item{name}{ The name for the track. Ignored if \code{object} is a \code{RangedDataList}, in which case the names are taken from the list names. } \item{\dots}{ Arguments passed to \code{\link{browserSession}}. } } \value{ Returns a \code{\linkS4class{BrowserSession}}. } \author{ Michael Lawrence } \seealso{ \code{\linkS4class{BrowserSession}} and \code{\linkS4class{BrowserView}}, the two main classes for interfacing with genome browsers.} \examples{ \dontrun{ ## open UCSC genome browser: browseGenome() ## to view a specific range: range <- GRangesForUCSCGenome("hg18", "chr22", IRanges(20000, 50000)) browseGenome(range = range) ## a slightly larger range: browseGenome(range = range, end = 75000) ## with a track: track <- import(system.file("tests", "v1.gff", package = "rtracklayer")) browseGenome(RangedDataList(track)) } } \keyword{interface} rtracklayer/man/browserSession-class.Rd0000644000126300012640000001045212227067666021674 0ustar00biocbuildphs_compbio\name{BrowserSession-class} \docType{class} \alias{BrowserSession-class} \alias{show,BrowserSession-method} \alias{range,BrowserSession-method} \alias{genome,BrowserSession-method} \alias{genome<-,BrowserSession-method} \alias{names,BrowserSession-method} \alias{trackNames,BrowserSession-method} \title{Class "BrowserSession"} \description{An object representing a genome browser session. As a derivative of \code{\linkS4class{TrackDb}}, each session contains a set of loaded tracks. In addition, it has a set of views, in the form of \code{\linkS4class{BrowserView}} instances, on those tracks. Note that this is a virtual class; a concrete implementation is provided by each backend driver.} \section{Objects from the Class}{A virtual Class: No objects may be created from it. See \code{\link{browserSession}} for obtaining an instance of an implementation for a particular genome browser.} \section{Methods}{ This specifies the API implemented by each browser backend. Note that a backend is not required to support all operations, and that each backend often has additional parameters for each of the methods. See the backend-specific documentation for more details. The only built-in backend is \code{\linkS4class{UCSCSession}}. If a method is denoted as \emph{virtual}, it must be implemented by the backend to support the corresponding feature. Otherwise, the fallback behavior is described. \describe{ \item{\emph{virtual} \code{\link{browserView}(object, range = range(object), track = trackNames(object), ...)}}{ Constructs a \code{\linkS4class{BrowserView}} of \code{range} for this session. } \item{\emph{virtual} \code{\link{browserViews}(object, ...)}}{ Gets the \code{\linkS4class{BrowserView}} instances belonging to this session.} \item{\code{\link{activeView}(object, ...)}}{ Returns the \code{\linkS4class{BrowserView}} that is currently active in the session. Fallback calls \code{browserViews} and queries each view with \code{activeView}.} \item{\code{\link{range}(x, ...)}}{ Gets the \code{\link[GenomicRanges:GRanges-class]{GRanges}} representing the range of the genome currently displayed by the browser (i.e. the range shown by the active view) or a default value (possibly \code{NULL}) if no views exist. } \item{\emph{virtual} \code{\link[Biostrings]{getSeq}(object, range = range(object), ...)}}{ gets a genomic sequence of \code{range} from this session.} \item{\emph{virtual} \code{\link[=sequence<-]{sequence}(object, ...) <- value}}{ Loads a sequence into the session.} \item{\emph{virtual} \code{\link[=track<-]{track}(object, name = deparse(substitute(track)), view = TRUE, ...) <- value}}{ Loads one or more \code{track}s into the session and optionally open a \code{view} of the track. The default implementation will coerce \code{value} to \code{RangedData}, so the backend should implement at least a method for \code{RangedData}. } \item{\code{x[[i]] <- value}}{Loads the track \code{value} into session \code{x}, under the name \code{i}. Shortcut to above.} \item{\code{x$name <- value}}{Loads the track \code{value} into session \code{x}, under the name \code{name}. Shortcut to above.} \item{\emph{virtual} \code{\link{track}(object, ...)}}{ Gets a track from a session as a \code{\link[IRanges:RangedData-class]{RangedData}}. } \item{\code{x[[i]]}}{Gets the track named \code{i} from session \code{x}. A shortcut to \code{track}. } \item{\code{x$name}}{Gets the track named \code{name} from session \code{x}. A shortcut to \code{track}.} \item{\emph{virtual} \code{\link{trackNames}(object, ...)}}{ Gets the names of the tracks stored in this session. } \item{\emph{virtual} \code{\link{genome}(x)}, \code{genome(x) <- value}}{ Gets or sets the genome identifier (e.g. \dQuote{hg18}) for the session.} \item{\emph{virtual} \code{\link{close}(con, ...)}}{ Close this session. } \item{\code{\link{show}(object, ...)}}{ Output a textual description of this session.} } } \author{ Michael Lawrence } \seealso{ \code{\link{browserSession}} for obtaining implementations of this class for a particular genome browser. } \keyword{classes} rtracklayer/man/browserSession-methods.Rd0000644000126300012640000000171212227067666022231 0ustar00biocbuildphs_compbio\name{browserSession-methods} \docType{methods} \alias{browserSession} \alias{browserSession-methods} \alias{browserSession,character-method} \alias{browserSession,BrowserView-method} \alias{browserSession,missing-method} \title{ Get a genome browser session } \description{ Methods for getting browser sessions. } \section{Methods}{ The following methods are defined by \pkg{rtracklayer}. \describe{ \item{object = "character"}{ \code{browserSession(object, ...)}: Creates a \code{\linkS4class{BrowserSession}} from a genome browser identifier. The identifier corresponds to the prefix of the session class name (e.g. "UCSC" in "UCSCSession"). The arguments in \dots are passed to the initialization function of the class.} \item{object = "browserView"}{ Gets the \code{\linkS4class{BrowserSession}} for the view. } \item{object = "missing"}{ Calls \code{browserSession("ucsc", ...)}. } } } \keyword{methods} rtracklayer/man/browserView-class.Rd0000644000126300012640000000403012227067666021156 0ustar00biocbuildphs_compbio\name{BrowserView-class} \docType{class} \alias{BrowserView-class} \alias{show,BrowserView-method} \alias{visible} \alias{visible,BrowserView-method} \alias{visible<-} \alias{visible<-,BrowserView-method} \title{Class "BrowserView"} \description{ An object representing a genome browser view of a particular segment of a genome. } \section{Objects from the Class}{ A virtual Class: No objects may be created from it directly. See \code{\link{browserView}} for obtaining an instance of an implementation for a particular genome browser. } \section{Slots}{ \describe{ \item{\code{session}:}{Object of class \code{"BrowserSession"} the browser session to which this view belongs. } } } \section{Methods}{ This specifies the API implemented by each browser backend. Note that a backend is not guaranteed to support all operations. See the backend-specific documentation for more details. The only built-in backend is \code{\linkS4class{UCSCView}}. \describe{ \item{\code{\link{browserSession}(object)}}{ Obtains the \code{\linkS4class{BrowserSession}} to which this view belongs. } \item{\code{\link{close}(object)}}{ Close this view. } \item{\code{\link{range}(object)}}{ Obtains the \code{\link[GenomicRanges:GRanges-class]{GRanges}} displayed by this view.} \item{\code{\link{trackNames}(object)}}{ Gets the names of the visible tracks in the view. } \item{\code{\link{trackNames}(object) <- value}}{ Sets the visible tracks by their names. } \item{\code{\link{show}(object)}}{ Outputs a textual description of this view. } \item{\code{visible(object)}}{Get a named logical vector indicating whether each track is visible. } \item{\code{visible(object) <- value}}{Set a logical vector indicating the visibility of each track, with the same names and in the same order as that returned by \code{visible(object)}. } } } \author{ Michael Lawrence } \seealso{ \code{\link{browserView}} for obtaining instances of this class. } \keyword{classes} rtracklayer/man/browserView-methods.Rd0000644000126300012640000000330712227067666021522 0ustar00biocbuildphs_compbio\name{browserView-methods} \docType{methods} \alias{browserView} \alias{browserView-methods} \alias{browserView,UCSCSession-method} \title{Getting browser views} \description{ Methods for creating and getting browser views. } \usage{ browserView(object, range, track, ...) } \arguments{ \item{object}{The object from which to get the views.} \item{range}{The \code{\link[GenomicRanges:GRanges-class]{GRanges}} or \code{\link[IRanges:RangesList-class]{RangesList}} to display. If there are multiple elements, a view is created for each element and a \code{\linkS4class{BrowserViewList}} is returned.} \item{track}{List of track names to make visible in the view.} \item{\dots}{Arguments to pass to methods} } \section{Methods}{ The following methods are defined by \pkg{rtracklayer}. \describe{ \item{object = "UCSCSession"}{ \code{browserView(object, range = range(object), track = trackNames(object), imagewidth = 800, ...)}: Creates a \code{\linkS4class{BrowserView}} of \code{range} with visible tracks specified by \code{track}. The \code{imagewidth} parameter specifies the width of the track image in pixels. \code{track} may be an instance of \code{\linkS4class{UCSCTrackModes}}. Arguments in \code{...} are passed to \code{\link{ucscTrackModes}} to create the \code{UCSCTrackModes} instance that will override modes indicated by the \code{track} parameter. } }} \examples{ \dontrun{ session <- browserSession() browserView(session, GRangesForUCSCGenome("hg19", "chr2", IRanges(20000, 50000))) ## only view "knownGene" track browserView(session, track = "knownGene") } } \keyword{methods} rtracklayer/man/browserViews-methods.Rd0000644000126300012640000000110612227067666021700 0ustar00biocbuildphs_compbio\name{browserViews-methods} \docType{methods} \alias{browserViews} \alias{browserViews-methods} \alias{browserViews,UCSCSession-method} \title{ Getting the browser views } \description{ Methods for getting browser views. } \section{Methods}{ \describe{ The following methods are defined by \pkg{rtracklayer}. \item{object = "UCSCSession"}{ Gets the instances of \code{\linkS4class{BrowserView}} in the session. } }} \seealso{\code{\link{browserView}} for creating a browser view.} \examples{ \dontrun{ session <- browseGenome() browserViews(session) } } \keyword{methods} rtracklayer/man/cpneTrack.Rd0000644000126300012640000000137012227067666017453 0ustar00biocbuildphs_compbio\name{cpneTrack} \alias{cpneTrack} \docType{data} \title{CPNE1 SNP track} \description{ A \code{RangedData} object (created by the \code{GGtools} package) with features from a subset of the SNPs on chromosome 20 from 60 HapMap founders in the CEU cohort. Each SNP has an associated data value indicating its association with the expression of the CPNE1 gene according to a Cochran-Armitage 1df test. The top 5000 scoring SNPs were selected for the track. } \usage{data(cpneTrack)} \format{ Each feature (row) is a SNP. The association test scores are accessible via \code{\link[IRanges]{score}}. } \source{ Vince Carey and the \code{GGtools} package. } \examples{ data(cpneTrack) plot(start(cpneTrack), score(cpneTrack)) } \keyword{datasets} rtracklayer/man/export.Rd0000644000126300012640000001723712227067666017073 0ustar00biocbuildphs_compbio\name{io} \alias{export} \alias{export,ANY,connection,character-method} \alias{export,ANY,connection,missing-method} \alias{export,ANY,CompressedFile,missing-method} \alias{export,ANY,missing,character-method} \alias{export,ANY,character,missing-method} \alias{export,ANY,character,character-method} \alias{import} \alias{import,connection,character,ANY-method} \alias{import,connection,missing,ANY-method} \alias{import,CompressedFile,missing,ANY-method} \alias{import,character,missing,ANY-method} \alias{import,character,character,ANY-method} \alias{import,missing,ANY,character-method} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Import and export } \description{ The functions \code{import} and \code{export} load and save objects from and to particular file formats. The rtracklayer package implements support for a number of annotation and sequence formats. } \usage{ export(object, con, format, ...) import(con, format, text, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{object}{ The object to export. } \item{con}{ The connection from which data is loaded or to which data is saved. If this is a character vector, it is assumed to be a filename and a corresponding file connection is created and then closed after exporting the object. If a \code{\linkS4class{RTLFile}} derivative, the data is loaded from or saved to the underlying resource. If missing, the function will return the output as a character vector, rather than writing to a connection. } \item{format}{ The format of the output. If missing and \code{con} is a filename, the format is derived from the file extension. This argument is unnecessary when \code{con} is a derivative of \code{\linkS4class{RTLFile}}. } \item{text}{ If \code{con} is missing, this can be a character vector directly providing the string data to import. } \item{\dots}{ Parameters to pass to the format-specific method. } } \details{ The rtracklayer package supports a number of file formats for representing annotated genomic intervals. These are each represented as a subclass of \code{\linkS4class{RTLFile}}. Below, we list the major supported formats, with some advice for when a particular file format is appropriate: \describe{ \item{\acronym{\link[=GFFFile]{GFF}}}{The General Feature Format is meant to represent any set of genomic features, with application-specific columns represented as \dQuote{attributes}. There are three principal versions (1, 2, and 3). This is a good format for interoperating with other genomic tools and is the most flexible format, in that a feature may have any number of attributes (in version 2 and above). Version 3 (GFF3) is the preferred version. Its specification lays out conventions for representing various types of data, including gene models, for which it is the format of choice. For variants, rtracklayer has rudimentary support for an extention of GFF3 called GVF. UCSC supports GFF1, but it needs to be encapsulated in the UCSC metaformat, i.e. \code{export.ucsc(subformat = "gff1")}. The BED format is typically preferred over GFF for interaction with UCSC. GFF files can be indexed with the tabix utility for fast range-based queries via rtracklayer and Rsamtools. } \item{\acronym{\link[=BEDFile]{BED}}}{The Browser Extended Display format is for displaying qualitative tracks in a genome browser, in particular UCSC. It finds a good balance between simplicity and expressiveness. It is much simpler than GFF and yet can still represent multi-exon gene structures. It is somewhat limited by its lack of the attribute support of GFF. To circumvent this, many tools and organizations have extended BED with additional columns. These are not officially valid BED files, and as such rtracklayer does not yet support them (this will be addressed soon). The rtracklayer package does support two official extensions of BED: Bed15 and bedGraph, see below. BED files can be indexed with the tabix utility for fast range-based queries via rtracklayer and Rsamtools. } \item{\acronym{\link[=BED15File]{Bed15}}}{An extension of BED with 15 columns, Bed15 is meant to represent data from microarray experiments. Multiple samples/columns are supported, and the data is displayed in UCSC as a compact heatmap. Few other tools support this format. With 15 columns per feature, this format is probably too verbose for e.g. ChIP-seq coverage (use multiple BigWig tracks instead).} \item{\acronym{\link[=BEDGraphFile]{bedGraph}}}{A variant of BED that represents a score column more compactly than \acronym{BED} and especially \acronym{Bed15}, although only one sample is supported. The data is displayed in UCSC as a bar or line graph. For large data (the typical case), \code{BigWig} is preferred. } \item{\acronym{\link[=WIGFile]{WIG}}}{The Wiggle format is meant for storing dense numerical data, such as window-based GC and conservation scores. The data is displayed in UCSC as a bar or line graph. The WIG format only works for intervals with a uniform width. For non-uniform widths, consider \code{bedGraph}. For large data, consider \code{BigWig}. } \item{\acronym{\link[=BigWigFile]{BigWig}}}{The BigWig format is a binary version of both \code{bedGraph} and \code{WIG} (which are now somewhat obsolete). A BigWig file contains a spatial index for fast range-based queries and also embeds summary statistics of the scores at several zoom levels. Thus, it is ideal for visualization of and parallel computing on genome-scale vectors, like the coverage from a high-throughput sequencing experiment. } } In summary, for the typical use case of combining gene models with experimental data, \acronym{GFF} is preferred for gene models and \code{BigWig} is preferred for quantitative score vectors. Note that the Rsamtools package provides support for the \code{\link[Rsamtools:BamFile]{BAM}} file format (for representing read alignments), among others. Based on this, the rtracklayer package provides an \code{export} method for writing \code{GAlignments} and \code{GappedReads} objects as \code{BAM}. For variants, consider VCF, supported by the VariantAnnotation package. There is also support for reading and writing biological sequences, including the UCSC \code{\link[=TwoBitFile]{TwoBit}} format for compactly storing a genome sequence along with a mask. The files are binary, so they are efficiently queried for particular ranges. A similar format is \code{\link[Rsamtools:FaFile]{FA}}, supported by Rsamtools. } \value{ If \code{con} is missing, a character vector containing the string output. Otherwise, nothing is returned. } \author{ Michael Lawrence } \seealso{ Format-specific options for the popular formats: \acronym{\link[=GFFFile]{GFF}}, \acronym{\link[=BEDFile]{BED}}, \acronym{\link[=BED15File]{Bed15}}, \acronym{\link[=BEDGraphFile]{bedGraph}}, \acronym{\link[=WIGFile]{WIG}}, \acronym{\link[=BigWigFile]{BigWig}} } \examples{ track <- import(system.file("tests", "v1.gff", package = "rtracklayer")) \dontrun{export(track, "my.gff", version = "3")} ## equivalently, \dontrun{export(track, "my.gff3")} ## or \dontrun{ con <- file("my.gff3") export(track, con, "gff3") close(con) } ## or as a string export(track, format = "gff3") } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{IO} rtracklayer/man/genomeBrowsers.Rd0000644000126300012640000000164512227067666020547 0ustar00biocbuildphs_compbio\name{genomeBrowsers} \alias{genomeBrowsers} \title{Get available genome browsers} \description{ Gets the identifiers of the loaded genome browser drivers. } \usage{ genomeBrowsers(where = topenv(parent.frame())) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{where}{ The environment in which to search for drivers. } } \details{ This searches the specified environment for classes that extend \code{\linkS4class{BrowserSession}}. The prefix of the class name, e.g. "ucsc" in "UCSCSession", is returned for each driver. } \value{ A character vector of driver identifiers. } \author{ Michael Lawrence } \seealso{ \code{\link{browseGenome}} and \code{\link{browserSession}} that create \code{browserSession} implementations given an identifier returned from this function. } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{interface} rtracklayer/man/laySequence-methods.Rd0000644000126300012640000000047712227067666021467 0ustar00biocbuildphs_compbio\name{sequence<--methods} \docType{methods} \alias{sequence<-} \alias{sequence<--methods} \title{ Load a sequence } \description{ Methods for loading sequences. } \section{Methods}{ \describe{ No methods are defined by \pkg{rtracklayer} for the \code{sequence(object, ...) <- value} generic. }} \keyword{methods} rtracklayer/man/layTrack-methods.Rd0000644000126300012640000000407512227067666020761 0ustar00biocbuildphs_compbio\name{track<--methods} \docType{methods} \alias{track<-} \alias{track<--methods} \alias{track<-,BrowserSession,RangedData-method} \alias{track<-,BrowserSession,ANY-method} \alias{track<-,BrowserSession,RangedDataList-method} \alias{track<-,UCSCSession,RangedDataList-method} \title{ Laying tracks } \description{ Methods for loading \code{\link[IRanges:RangedData-class]{RangedData}} instances (tracks) into genome browsers. } \usage{ \S4method{track}{BrowserSession,RangedData}(object, name = deparse(substitute(track)), view = FALSE, ...) <- value } \arguments{ \item{object}{A \code{\linkS4class{BrowserSession}} into which the track is loaded.} \item{value}{The track(s) to load.} \item{name}{The name(s) of the track(s) being loaded.} \item{view}{Whether to create a view of the track after loading it.} \item{\dots}{Arguments to pass on to methods.} } \section{Methods}{ The following methods are defined by \pkg{rtracklayer}. A browser session implementation must implement a method for either \code{RangedData} or \code{RangedDataList}. The base \code{browserSession} class will delegate appropriately. \describe{ \item{object = "BrowserSession", value = "RangedData"}{ Load this track into the session. } \item{object = "BrowserSession", value = "RangedDataList"}{ Load all tracks into the session. } \item{object = "UCSCSession", value = "RangedDataList"}{ \code{track(object, name = deparse(substitute(track)), view = FALSE, format = "gff", ...) <- value}: Load the tracks into the session using the specified \code{format}. The arguments in \code{...} are passed on to \code{\link{export.ucsc}}, so they could be slots in a \code{\linkS4class{TrackLine}} subclass or parameters to pass on to the export function for \code{format}. } } } \seealso{\code{\link{track}} for getting a track from a session.} \examples{ \dontrun{ session <- browserSession() track <- import(system.file("tests", "v1.gff", package = "rtracklayer")) track(session, "My Track") <- track } } \keyword{methods} rtracklayer/man/liftOver.Rd0000644000126300012640000000227612227067666017341 0ustar00biocbuildphs_compbio\name{liftOver} \alias{liftOver} \alias{liftOver,GenomicRanges,Chain-method} \title{ Lift intervals between genome builds } \description{ A reimplementation of the UCSC liftover tool for lifting features from one genome build to another. In our preliminary tests, it is significantly faster than the command line tool. Like the UCSC tool, a chain file is required input. } \usage{ liftOver(x, chain, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ The intervals to lift-over, usually a \code{\link[GenomicRanges:GRanges]{GRanges}}. } \item{chain}{ A \code{\linkS4class{Chain}} object, usually imported with \code{\link{import.chain}}. } \item{\dots}{ Arguments for methods. } } \value{ A \code{GRangesList} object. Each element contains the ranges mapped from the corresponding element in the input (may be one-to-many). } \references{ \url{http://genome.ucsc.edu/cgi-bin/hgLiftOver} } \examples{ \dontrun{ chain <- import.chain("hg19ToHg18.over.chain") library(TxDb.Hsapiens.UCSC.hg19.knownGene) tx_hg19 <- transcripts(TxDb.Hsapiens.UCSC.hg19.knownGene) tx_hg18 <- liftOver(tx_hg19, chain) } } \author{ Michael Lawrence } rtracklayer/man/targets.Rd0000644000126300012640000000212612227067666017212 0ustar00biocbuildphs_compbio\name{targets} \Rdversion{1.1} \alias{targets} \docType{data} \title{microRNA target sites} \description{ A data frame of human microRNA target sites retrieved from MiRBase. This is a subset of the \code{hsTargets} data frame in the \code{microRNA} package. See the \code{rtracklayer} vignette for more details. } \usage{data(targets)} \format{ A data frame with 2981 observations on the following 6 variables. \describe{ \item{\code{name}}{The miRBase ID of the microRNA.} \item{\code{target}}{The Ensembl ID of the targeted transcript.} \item{\code{chrom}}{The name of the chromosome for target site.} \item{\code{start}}{Target start position.} \item{\code{end}}{Target stop position.} \item{\code{strand}}{The strand of the target site, \code{"+"}, or \code{"-"}.} } } \source{ The \code{microRNA} package, dataset \code{hsTargets}. Originally MiRBase (\url{http://microrna.sanger.ac.uk/}). } \examples{ data(targets) targetTrack <- with(targets, GenomicData(IRanges::IRanges(start, end), strand = strand, chrom = chrom)) } \keyword{datasets} rtracklayer/man/tracks-methods.Rd0000644000126300012640000000266712227067666020503 0ustar00biocbuildphs_compbio\name{tracks-methods} \docType{methods} \alias{trackNames} \alias{trackNames<-} \alias{trackNames<--methods} \alias{trackNames<-,UCSCTrackModes-method} \alias{trackNames<-,UCSCView-method} \alias{trackNames-methods} \alias{trackNames,UCSCSession-method} \alias{trackNames,UCSCTrackModes-method} \alias{trackNames,UCSCView-method} \title{ Accessing track names } \description{ Methods for getting and setting track names. } \section{Methods}{ \describe{ The following methods are defined by \pkg{rtracklayer} for \bold{getting} track names via the generic \code{trackNames(object, ...)}. \item{object = "UCSCSession"}{ Get the tracks loaded in the session. } \item{object = "UCSCTrackModes"}{ Get the visible tracks according to the modes (all tracks not set to "hide").} \item{object = "UCSCView"}{ Get the visible tracks in the view. } The following methods are defined by \pkg{rtracklayer} for \bold{setting} track names via the generic \code{trackNames(object) <- value}. \item{object = "UCSCTrackModes"}{ Sets the tracks that should be visible in the modes. All specified tracks with mode "hide" in \code{object} are set to mode "full". Any tracks in \code{object} that are not specified in the value are set to "hide". No other modes are changed.} \item{object = "UCSCView"}{ Sets the visible tracks in the view. This opens a new web browser with only the specified tracks visible. } }} \keyword{methods}rtracklayer/man/ucscGenomes.Rd0000644000126300012640000000113112227067666020007 0ustar00biocbuildphs_compbio\name{ucscGenomes} \alias{ucscGenomes} \title{Get available genomes on UCSC} \description{ Get a \code{data.frame} describing the available UCSC genomes. } \usage{ ucscGenomes() } \value{ A \code{data.frame} with the following columns: \item{db}{UCSC DB identifier (e.g. "hg18")} \item{species}{The name of the species (e.g. "Human")} \item{date}{The date the genome was built} \item{name}{The official name of the genome build} } \seealso{\code{\linkS4class{UCSCSession}} for details on specifying the genome.} \examples{ ucscGenomes() } \author{ Michael Lawrence } \keyword{interface} rtracklayer/man/ucscSession-class.Rd0000644000126300012640000001202212227067666021141 0ustar00biocbuildphs_compbio\name{UCSCSession-class} \docType{class} \alias{UCSCSession-class} \alias{initialize,UCSCSession-method} \alias{track,UCSCSession-method} \alias{range<-} \alias{range<-,UCSCSession-method} \alias{track<-,UCSCSession,RTLFile-method} \alias{genome,UCSCSession-method} \alias{genome<-,UCSCSession-method} \alias{range,UCSCSession-method} \alias{seqinfo,UCSCSession-method} \alias{range,ucscCart-method} \alias{genome,ucscCart-method} \title{Class "UCSCSession"} \description{An implementation of \code{\linkS4class{BrowserSession}} for the \acronym{UCSC} genome browser.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{\link{browserSession}("ucsc", url = "http://genome.ucsc.edu/cgi-bin", ...)}. The arguments in \code{...} correspond to libcurl options, see \code{\link[RCurl]{getCurlHandle}}. Setting these options may be useful e.g. for getting past a proxy. } \section{Slots}{ \describe{ \item{\code{url}:}{Object of class \code{"character"} holding the base \acronym{URL} of the \acronym{UCSC} browser. } \item{\code{hguid}:}{Object of class \code{"numeric"} holding the user identification code.} \item{\code{views}:}{Object of class \code{"environment"} containing a list stored under the name "instances". The list holds the instances of \code{\linkS4class{BrowserView}} for this session. } } } \section{Extends}{ Class \code{"\linkS4class{BrowserSession}"}, directly. } \section{Methods}{ \describe{ \item{\code{\link{browserView}(object, range = range(object), track = trackNames(object), ...)}}{ Creates a \code{\linkS4class{BrowserView}} of \code{range} with visible tracks specified by \code{track}. \code{track} may be an instance of \code{\linkS4class{UCSCTrackModes}}. Arguments in \code{...} should match parameters to a \code{\link{ucscTrackModes}} method for creating a \code{UCSCTrackModes} instance that will be merged with and override modes indicated by the \code{track} parameter. } \item{\code{\link{browserViews}}(object)}{ Gets the \code{\linkS4class{BrowserView}} instances for this session. } \item{\code{\link{range}}(x, asRangedData = TRUE)}{ Gets the \code{\link[GenomicRanges:GRanges-class]{GRanges}} last displayed in this session. Set \code{asRangedData} to \code{FALSE} to obtain a \code{GRanges} object.} \item{\code{\link[rtracklayer:RangedData-methods]{genome}(x)}}{Gets the genome identifier of the session, i.e. \code{genome(range(x))}.} \item{\code{seqinfo}}{ Gets the \code{\link[GenomicRanges:Seqinfo]{Seqinfo}} object with the lengths of the chromosomes in the currenet genome. No circularity information is available. } \item{\code{range(x) <- value}}{ Sets \code{value}, usually a \code{GRanges} object or \code{RangesList}, as the range of session \code{x}. Note that this setting only lasts until a view is created or manipulated. This mechanism is useful, for example, when treating the UCSC browser as a database, rather than a genome viewer.} \item{\code{\link[rtracklayer:RangedData-methods]{genome}(x) <- value}}{ Sets the genome identifier on the range of session \code{x}.} \item{\code{\link[Biostrings]{getSeq}(object, range, track = "Assembly")}}{ Gets the sequence in \code{range} and \code{track}. } \item{\code{\link[=track<-]{track}(object, name = names(track), format = "auto", ...) <- value}}{ Loads a track, stored under \code{name} and formatted as \code{format}. The "auto" format resolves to "bed" for qualitative data. For quantitative data, i.e., data with a numeric \code{score} column, "wig" or "bedGraph" is chosen, depending on how well the data compresses into wig. The arguments in \code{...} are passed on to \code{\link{export.ucsc}}, so they could be slots in a \code{\linkS4class{TrackLine}} subclass (and thus specify visual attributes like color) or parameters to pass on to the export function for \code{format}. The \code{value} may be either a range object (like a \code{GRanges}) or a file object (like a \code{BEDFile}). } \item{\code{\link{track}(object, name, range = range(object), table = NULL)}}{ Retrieves a \code{\link[IRanges:RangedData-class]{RangedData}} with features in \code{range} from track named \code{name}. Some built-in tracks have multiple series, each stored in a separate database table. A specific table may be retrieved by passing its name in the \code{table} parameter. See \code{\link{tableNames}} for a way to list the available tables. } \item{\code{\link{trackNames}}(object)}{ Gets the names of the tracks stored in the session. } \item{\code{\link{ucscTrackModes}}(object)}{ Gets the default view modes for the tracks in the session. } } } \author{ Michael Lawrence } \seealso{ \code{\link{browserSession}} for creating instances of this class. } \keyword{classes} rtracklayer/man/ucscTrackLine-class.Rd0000644000126300012640000000356512227067666021406 0ustar00biocbuildphs_compbio\name{TrackLine-class} \docType{class} \alias{TrackLine-class} \alias{coerce,character,TrackLine-method} \alias{coerce,TrackLine,character-method} \alias{show,TrackLine-method} \title{Class "TrackLine"} \description{An object representing a "track line" in the \acronym{UCSC} format. There are two concrete types of track lines: \code{\linkS4class{BasicTrackLine}} (used for most types of tracks) and \code{\linkS4class{GraphTrackLine}} (used for graphical tracks). This class only declares the common elements between the two.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("TrackLine", ...)} or parsed from a character vector track line with \code{as(text, "TrackLine")}. But note that \acronym{UCSC} only understands one of the subclasses mentioned above. } \section{Slots}{ \describe{ \item{\code{name}:}{Object of class \code{"character"} specifying the name of the track. } \item{\code{description}:}{Object of class \code{"character"} describing the track. } \item{\code{visibility}:}{Object of class \code{"character"} indicating the default visible mode of the track, see \code{\linkS4class{UCSCTrackModes}}.} \item{\code{color}:}{Object of class \code{"integer"} representing the track color (as from \code{\link{col2rgb}}). } \item{\code{priority}:}{Object of class \code{"numeric"} specifying the rank of this track. } } } \section{Methods}{ \describe{ \item{as(object, "character")}{Export line to its string representation.} } } \references{ \url{http://genome.ucsc.edu/goldenPath/help/customTrack.html#TRACK} for the official documentation. } \author{ Michael Lawrence } \seealso{ \code{\linkS4class{BasicTrackLine}} (used for most types of tracks) and \code{\linkS4class{GraphTrackLine}} (used for Wiggle/bedGraph tracks). } \keyword{classes} rtracklayer/man/ucscTrackModes-class.Rd0000644000126300012640000000504512227067666021561 0ustar00biocbuildphs_compbio\name{UCSCTrackModes-class} \docType{class} \alias{UCSCTrackModes-class} \alias{[,UCSCTrackModes,ANY,ANY-method} \alias{[<-,UCSCTrackModes,ANY,ANY,ANY-method} \title{Class "UCSCTrackModes"} \description{A vector of view modes ("hide", "dense", "full", "pack", "squish") for each track in a \acronym{UCSC} view.} \section{Objects from the Class}{ Objects may be created by calls of the form \code{\link{ucscTrackModes}(object = character(), hide = character(), dense = character(), pack = character(), squish = character(), full = character())}, where \code{object} should be a character vector of mode names (with its \code{names} attribute specifying the corresponding track names). The other parameters should contain track names that override the modes in \code{object}. Later parameters override earlier ones, so, for example, if a track is named in \code{hide} and \code{full}, it is shown in the full view mode. } \section{Slots}{ \describe{ \item{\code{.Data}:}{Object of class \code{"character"} holding the modes ("hide", "dense", "full", "pack", "squish"), with its \code{names} attribute holding corresponding track names.} \item{\code{labels}:}{Object of class \code{"character"} holding labels (human-readable names) corresponding to each track/mode.} } } \section{Extends}{ Class \code{"\linkS4class{character}"}, from data part. Class \code{"\linkS4class{vector}"}, by class "character", distance 2. } \section{Methods}{ \describe{ \item{\code{\link{trackNames}(object)}}{ Gets the names of the visible tracks (those that do not have mode "hide"). } \item{\code{\link{trackNames}(object) <- value}}{ Sets the names of the visible tracks. Any tracks named in \code{value} are set to "full" if the are currently set to "hide" in this object. Any tracks not in \code{value} are set to "hide". All other modes are preserved.} \item{\code{object[i]}}{Gets the track mode of the tracks indexed by \code{i}, which can be any type of index supported by character vector subsetting. If \code{i} is a character vector, it indexes first by the internal track IDs (the \code{names} on \code{.Data}) and then by the user-level track names (the \code{labels} slot).} \item{\code{object[i] <- value}}{Sets the track modes indexed by \code{i} (in the same way as in \code{object[i]} above) to those specified in \code{value}.} } } \author{ Michael Lawrence } \seealso{ \code{\linkS4class{UCSCView}} on which track view modes may be set. } \keyword{classes} rtracklayer/man/ucscTrackModes-methods.Rd0000644000126300012640000000521512227067666022116 0ustar00biocbuildphs_compbio\name{ucscTrackModes-methods} \docType{methods} \alias{ucscTrackModes} \alias{ucscTrackModes<-} \alias{ucscTrackModes-methods} \alias{ucscTrackModes,character-method} \alias{ucscTrackModes,missing-method} \alias{ucscTrackModes,UCSCView-method} \alias{ucscTrackModes<--methods} \alias{ucscTrackModes<-,UCSCView,UCSCTrackModes-method} \alias{ucscTrackModes<-,UCSCView,character-method} \alias{ucscTrackModes,ucscTracks-method} \alias{ucscTrackModes,UCSCSession-method} \title{ Accessing UCSC track modes } \description{ Generics for getting and setting UCSC track visibility modes ("hide", "dense", "full", "pack", "squish"). } \section{Methods}{ \describe{ The following methods are defined by \pkg{rtracklayer} for \bold{getting} the track modes through the generic \code{ucscTrackModes(object, ...)}. \item{object = "character"}{ \code{function(object, hide = character(), dense = character(), pack = character(), squish = character(), full = character())} Creates an instance of \code{\linkS4class{UCSCTrackModes}} from \code{object}, a character vector of mode names, with the corresponding track ids given in the \code{names} attribute. Note that \code{object} can be a \code{UCSCTrackModes} instance, as \code{UCSCTrackModes} extends \code{character}. The other parameters are character vectors identifying the tracks for each mode and overriding the modes specified by \code{object}. } \item{object = "missing"}{ The same interface as above, except \code{object} defaults to an empty character vector. } \item{object = "UCSCView"}{ Gets modes for tracks in the view. } \item{object = "UCSCSession"}{ Gets default modes for the tracks in the session. These are the modes that will be used as the default for a newly created view. } The following methods are defined by \pkg{rtracklayer} for \bold{setting} the track modes through the generic \code{ucscTrackModes(object) <- value}. \item{object = "UCSCView", value = "UCSCTrackModes"}{ Sets the modes for the tracks in the view. } \item{object = "UCSCView", value = "character"}{ Sets the modes from a character vector of mode names, with the corresponding track names given in the \code{names} attribute. } }} \seealso{\code{\link{trackNames}} and \code{\link{trackNames<-}} for just getting or setting which tracks are visible (not of mode "hide").} \examples{ # Tracks "foo" and "bar" are fully shown, "baz" is hidden modes <- ucscTrackModes(full = c("foo", "bar"), hide = "baz") # Update the modes to hide track "bar" modes2 <- ucscTrackModes(modes, hide = "bar") } \keyword{methods} rtracklayer/man/ucscView-class.Rd0000644000126300012640000000524612227067666020442 0ustar00biocbuildphs_compbio\name{UCSCView-class} \docType{class} \alias{UCSCView-class} \alias{range,UCSCView-method} \alias{range<-,UCSCView-method} \alias{visible,UCSCView-method} \alias{visible<-,UCSCView-method} \title{Class "UCSCView"} \description{An object representing a view of a genome in the \acronym{UCSC} browser.} \section{Objects from the Class}{ Calling \code{\link{browserView}(session, range = range(object), track = trackNames(object), ...)} creates \code{\linkS4class{BrowserView}} of \code{range} with visible tracks specified by \code{track}. \code{track} may be an instance of \code{\linkS4class{UCSCTrackModes}}. Arguments in \code{...} should match parameters to a \code{\link{ucscTrackModes}} method for creating a \code{UCSCTrackModes} instance that will be merged with and override modes indicated by the \code{track} parameter. } \section{Slots}{ \describe{ \item{\code{hgsid}:}{Object of class \code{"numeric"}, which identifies this view to \acronym{UCSC}.} \item{\code{session}:}{Object of class \code{"BrowserSession"} to which this view belongs.} } } \section{Extends}{ Class \code{"\linkS4class{BrowserView}"}, directly. } \section{Methods}{ \describe{ \item{\code{\link{activeView}(object)}}{ Obtains a logical indicating whether this view is the active view. } \item{\code{\link{range}(object)}}{ Obtains the \code{\link[GenomicRanges:GRanges-class]{GRanges}} displayed by this view. } \item{\code{\link{range}(object) <- value}}{ Sets the \code{\link[GenomicRanges:GRanges-class]{GRanges}} or \code{\link[IRanges:RangesList-class]{RangesList}} displayed by this view. } \item{\code{\link{trackNames}(object)}}{ Gets the names of the visible tracks in this view. } \item{\code{\link{trackNames}(object) <- value}}{ Sets the visible tracks by name. } \item{\code{visible(object)}}{Get a named logical vector indicating whether each track is visible. } \item{\code{visible(object) <- value}}{Set a logical vector indicating the visibility of each track, in the same order as returned by \code{visible(object)}. } \item{\code{\link{ucscTrackModes}(object)}}{ Obtains the \code{\linkS4class{UCSCTrackModes}} for this view. } \item{\code{\link{ucscTrackModes}(object) <- value}}{ Sets the \code{\linkS4class{UCSCTrackModes}} for this view. The \code{value} may be either a \code{UCSCTrackModes} instance or a character vector that will be coerced by a call to \code{\link{ucscTrackModes}}. } } } \author{ Michael Lawrence } \seealso{ \code{\link{browserView}} for creating instances of this class. } \keyword{classes} rtracklayer/man/wigToBigWig.Rd0000644000126300012640000000166012227067666017725 0ustar00biocbuildphs_compbio\name{wigToBigWig} \alias{wigToBigWig} \title{ Convert WIG to BigWig } \description{ This function calls the Kent C library to efficiently convert a WIG file to a BigWig file, without loading the entire file into memory. This solves the problem where simple tools write out text WIG files, instead of more efficiently accessed binary BigWig files. } \usage{ wigToBigWig(x, seqinfo, dest = paste(file_path_sans_ext(x, TRUE), "bw", sep = ".")) } \arguments{ \item{x}{ Path or URL to the WIG file. Connections are not supported. } \item{seqinfo}{ \code{\linkS4class{Seqinfo}} object, describing the genome of the data. All BigWig files must have this defined. } \item{dest}{ The path to which to write the BigWig file. Defaults to \code{x} with the extension changed to \dQuote{bw}. } } \author{ Michael Lawrence } \seealso{ \code{\link[=BigWigFile]{BigWig}} import and export support } rtracklayer/man/wigTrackLine-class.Rd0000644000126300012640000000675512227067666021243 0ustar00biocbuildphs_compbio\name{GraphTrackLine-class} \docType{class} \alias{GraphTrackLine-class} \alias{coerce,character,GraphTrackLine-method} \alias{coerce,GraphTrackLine,character-method} \alias{coerce,GraphTrackLine,BasicTrackLine-method} \alias{coerce,BasicTrackLine,GraphTrackLine-method} \title{Class "GraphTrackLine"} \description{ A \acronym{UCSC} track line for graphical tracks. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("GraphTrackLine", ...)} or parsed from a character vector track line with \code{as(text, "GraphTrackLine")} or converted from a \code{\linkS4class{BasicTrackLine}} using \code{as(basic, "GraphTrackLine")}. } \section{Slots}{ \describe{ \item{\code{altColor}:}{Object of class \code{"integer"} giving an alternate color, as from \code{\link{col2rgb}}.} \item{\code{autoScale}:}{Object of class \code{"logical"} indicating whether to automatically scale to min/max of the data.} \item{\code{alwaysZero}:}{Object of class \code{"logical"} indicating whether to fix the lower limit of the Y axis at zero.} \item{\code{gridDefault}:}{Object of class \code{"logical"} indicating whether a grid should be drawn. } \item{\code{maxHeightPixels}:}{Object of class \code{"numeric"} of length three (max, default, min), giving the allowable range for the vertical height of the graph.} \item{\code{graphType}:}{Object of class \code{"character"}, specifying the graph type, either "bar" or "points". } \item{\code{viewLimits}:}{Object of class \code{"numeric"} and of length two specifying the data range (min, max) shown in the graph.} \item{\code{yLineMark}:}{Object of class \code{"numeric"} giving the position of a horizontal line.} \item{\code{yLineOnOff}:}{Object of class \code{"logical"} indicating whether the \code{yLineMark} should be visible. } \item{\code{windowingFunction}:}{Object of class \code{"character"}, one of "maximum", "mean", "minimum", for removing points when the graph shrinks.} \item{\code{smoothingWindow}:}{Object of class \code{"numeric"} giving the window size of a smoother to pass over the graph. } \item{\code{type}:}{Scalar \code{"character"} indicating the type of the track, either \code{"wig"} or \code{"bedGraph"}.} \item{\code{name}:}{Object of class \code{"character"} specifying the name of the track. } \item{\code{description}:}{Object of class \code{"character"} describing the track. } \item{\code{visibility}:}{Object of class \code{"character"} indicating the default visible mode of the track, see \code{\linkS4class{UCSCTrackModes}}.} \item{\code{color}:}{Object of class \code{"integer"} representing the track color (as from \code{\link{col2rgb}}). } \item{\code{priority}:}{Object of class \code{"numeric"} specifying the rank of this track. } } } \section{Extends}{ Class \code{"\linkS4class{TrackLine}"}, directly. } \section{Methods}{ \describe{ \item{as(object, "character")}{Export line to its string representation.} \item{as(object, \code{"\linkS4class{BasicTrackLine}"})}{Convert this line to a basic UCSC track line, using defaults for slots not held in common.} } } \references{ Official documentation: \url{http://genome.ucsc.edu/goldenPath/help/wiggle.html}. } \author{ Michael Lawrence } \seealso{ \code{\link{export.wig}}, \code{\link{export.bedGraph}} for exporting graphical tracks. } \keyword{classes} rtracklayer/src/0000755000126300012640000000000012227135242015247 5ustar00biocbuildphs_compbiortracklayer/src/IRanges_stubs.c0000644000126300012640000000003412227135242020160 0ustar00biocbuildphs_compbio#include <_IRanges_stubs.c> rtracklayer/src/Makevars0000644000126300012640000000024512227067663016757 0ustar00biocbuildphs_compbioPKG_LIBS+=-lz include Makevars.common OBJECTS = $(PKG_OBJECTS) $(UCSC_OBJECTS:%=ucsc/%) PKG_CPPFLAGS=-D_FILE_OFFSET_BITS=64 all: $(SHLIB) clean: rm -f $(OBJECTS) rtracklayer/src/Makevars.common0000644000126300012640000000103412227067663020243 0ustar00biocbuildphs_compbioPKG_OBJECTS = \ IRanges_stubs.o XVector_stubs.o R_init_rtracklayer.o bigWig.o chain_io.o \ twoBit.o handlers.o utils.o UCSC_OBJECTS = \ bPlusTree.o bbiRead.o bbiWrite.o bwgCreate.o bwgQuery.o \ cirTree.o common.o dnaseq.o dnautil.o errabort.o hash.o linefile.o localmem.o\ sqlNum.o zlibFace.o dystring.o hmmstats.o obscure.o pipeline.o \ rangeTree.o rbTree.o memalloc.o dlist.o udc.o net.o bits.o twoBit.o \ _cheapcgi.o internet.o https.o base64.o verbose.o os.o wildcmp.o _portimpl.o PKG_CFLAGS = -g PKG_LIBS += -pthread rtracklayer/src/Makevars.win0000644000126300012640000000064612227067663017560 0ustar00biocbuildphs_compbioZLIB_CFLAGS+=$(shell echo 'zlibbioc::pkgconfig("PKG_CFLAGS")'|\ "${R_HOME}/bin/R" --vanilla --slave) PKG_LIBS+=$(shell echo 'zlibbioc::pkgconfig("PKG_LIBS_shared")' |\ "${R_HOME}/bin/R" --vanilla --slave) PKG_LIBS+=-lws2_32 include Makevars.common OBJECTS = $(PKG_OBJECTS) $(UCSC_OBJECTS:%=ucsc/%) all: $(SHLIB) clean: rm -f $(OBJECTS) %.o: %.c $(CC) $(ZLIB_CFLAGS) $(ALL_CPPFLAGS) $(ALL_CFLAGS) -c $< -o $@ rtracklayer/src/R_init_rtracklayer.c0000644000126300012640000000160112227135242021240 0ustar00biocbuildphs_compbio#include "rtracklayer.h" #include "bigWig.h" #include "twoBit.h" #include "utils.h" #include #define CALLMETHOD_DEF(fun, numArgs) {#fun, (DL_FUNC) &fun, numArgs} static const R_CallMethodDef callMethods[] = { /* bigWig.c */ CALLMETHOD_DEF(BWGSectionList_add, 5), CALLMETHOD_DEF(BWGSectionList_write, 4), CALLMETHOD_DEF(BWGSectionList_cleanup, 1), CALLMETHOD_DEF(BWGFile_query, 3), CALLMETHOD_DEF(BWGFile_seqlengths, 1), CALLMETHOD_DEF(BWGFile_summary, 6), CALLMETHOD_DEF(BWGFile_fromWIG, 3), /* twobit.c */ CALLMETHOD_DEF(DNAString_to_twoBit, 3), CALLMETHOD_DEF(TwoBits_write, 2), CALLMETHOD_DEF(TwoBitFile_seqlengths, 1), CALLMETHOD_DEF(TwoBitFile_read, 4), /* utils.c */ CALLMETHOD_DEF(CharacterList_pasteCollapse, 2), {NULL, NULL, 0} }; void R_init_rtracklayer(DllInfo *info) { R_registerRoutines(info, NULL, callMethods, NULL, NULL); } rtracklayer/src/XVector_stubs.c0000644000126300012640000000003412227135242020222 0ustar00biocbuildphs_compbio#include <_XVector_stubs.c> rtracklayer/src/bigWig.c0000644000126300012640000002323012227135242016623 0ustar00biocbuildphs_compbio#include "ucsc/common.h" #include "ucsc/linefile.h" #include "ucsc/localmem.h" #include "ucsc/hash.h" #include "ucsc/bbiFile.h" #include "ucsc/bigWig.h" #include "ucsc/bwgInternal.h" #include "ucsc/_bwgInternal.h" #include "bigWig.h" #include "handlers.h" static struct bwgBedGraphItem * createBedGraphItems(int *start, int *width, double *score, int len, struct lm *lm) { struct bwgBedGraphItem *itemList = NULL, *item; int i; for (i=0; iend = start[i] + width[i] - 1; item->start = start[i] - 1; item->val = score[i]; slAddHead(&itemList, item); } slReverse(&itemList); return itemList; } static struct bwgVariableStepPacked * createVariableStepItems(int *start, double *score, int len, struct lm *lm) { struct bwgVariableStepPacked *packed; lmAllocArray(lm, packed, len); int i; for (i=0; ichrom = (char *)seq; section->start = start[0] - 1; section->end = start[len-1] + width[len-1] - 1; section->type = type; section->itemSpan = width[0]; if (type == bwgTypeFixedStep) { section->items.fixedStepPacked = createFixedStepItems(score, len, lm); section->itemStep = len > 1 ? start[1] - start[0] : 0; } else if (type == bwgTypeVariableStep) { section->items.variableStepPacked = createVariableStepItems(start, score, len, lm); } else section->items.bedGraphList = createBedGraphItems(start, width, score, len, lm); section->itemCount = len; return section; } static int itemsPerSlot = 512; static int blockSize = 1024; /* --- .Call ENTRY POINT --- */ SEXP BWGSectionList_add(SEXP r_sections, SEXP r_seq, SEXP r_ranges, SEXP r_score, SEXP r_format) { struct bwgSection *sections = NULL; const char *seq = CHAR(asChar(r_seq)); int *start = INTEGER(get_IRanges_start(r_ranges)); int *width = INTEGER(get_IRanges_width(r_ranges)); double *score = REAL(r_score); const char *format = CHAR(asChar(r_format)); int num = get_IRanges_length(r_ranges); int numLeft = num; SEXP ans; struct lm *lm; enum bwgSectionType type = bwgTypeBedGraph; if (sameString(format, "fixedStep")) type = bwgTypeFixedStep; else if (sameString(format, "variableStep")) type = bwgTypeVariableStep; if (r_sections != R_NilValue) { sections = R_ExternalPtrAddr(r_sections); lm = R_ExternalPtrAddr(R_ExternalPtrTag(r_sections)); } else lm = lmInit(0); pushRHandlers(); while(numLeft) { int numSection = numLeft > itemsPerSlot ? itemsPerSlot : numLeft; numLeft -= numSection; slAddHead(§ions, createBWGSection(seq, start, width, score, numSection, type, lm)); start += numSection; width += numSection; score += numSection; } popRHandlers(); PROTECT(ans = R_MakeExternalPtr(sections, R_NilValue, R_NilValue)); R_SetExternalPtrTag(ans, R_MakeExternalPtr(lm, R_NilValue, R_NilValue)); UNPROTECT(1); return ans; } static struct hash *createIntHash(SEXP v) { struct hash *hash = hashNew(0); SEXP names = getAttrib(v, R_NamesSymbol); for (int i = 0; i < length(v); i++) hashAddInt(hash, (char *)CHAR(STRING_ELT(names, i)), INTEGER(v)[i]); return hash; } /* --- .Call ENTRY POINT --- */ SEXP BWGSectionList_write(SEXP r_sections, SEXP r_seqlengths, SEXP r_compress, SEXP r_file) { struct bwgSection *sections = NULL; struct hash *lenHash = createIntHash(r_seqlengths); if (r_sections != R_NilValue) { sections = R_ExternalPtrAddr(r_sections); slReverse(§ions); } pushRHandlers(); bwgCreate(sections, lenHash, blockSize, itemsPerSlot, asLogical(r_compress), (char *)CHAR(asChar(r_file))); freeHash(&lenHash); popRHandlers(); return r_file; } /* --- .Call ENTRY POINT --- */ SEXP BWGSectionList_cleanup(SEXP r_sections) { pushRHandlers(); if (r_sections != R_NilValue) { struct lm *lm = R_ExternalPtrAddr(R_ExternalPtrTag(r_sections)); lmCleanup(&lm); } popRHandlers(); return R_NilValue; } /* --- .Call ENTRY POINT --- */ SEXP BWGFile_seqlengths(SEXP r_filename) { pushRHandlers(); struct bbiFile * file = bigWigFileOpen((char *)CHAR(asChar(r_filename))); struct bbiChromInfo *chromList = bbiChromList(file); struct bbiChromInfo *chrom = chromList; SEXP seqlengths, seqlengthNames; PROTECT(seqlengths = allocVector(INTSXP, slCount(chromList))); seqlengthNames = allocVector(STRSXP, length(seqlengths)); setAttrib(seqlengths, R_NamesSymbol, seqlengthNames); for(int i = 0; i < length(seqlengths); i++) { INTEGER(seqlengths)[i] = chrom->size; SET_STRING_ELT(seqlengthNames, i, mkChar(chrom->name)); chrom = chrom->next; } bbiChromInfoFreeList(&chromList); popRHandlers(); UNPROTECT(1); return seqlengths; } /* --- .Call ENTRY POINT --- */ SEXP BWGFile_query(SEXP r_filename, SEXP r_ranges, SEXP r_return_score) { pushRHandlers(); struct bbiFile * file = bigWigFileOpen((char *)CHAR(asChar(r_filename))); SEXP chromNames = getAttrib(r_ranges, R_NamesSymbol); int nchroms = length(r_ranges); SEXP rangesList, rangesListEls, dataFrameList, dataFrameListEls, ans; bool returnScore = asLogical(r_return_score); const char *var_names[] = { "score", "" }; struct lm *lm = lmInit(0); struct bbiInterval *hits = NULL; PROTECT(rangesListEls = allocVector(VECSXP, nchroms)); setAttrib(rangesListEls, R_NamesSymbol, chromNames); PROTECT(dataFrameListEls = allocVector(VECSXP, nchroms)); setAttrib(dataFrameListEls, R_NamesSymbol, chromNames); for (int i = 0; i < length(r_ranges); i++) { SEXP localRanges = VECTOR_ELT(r_ranges, i); int nranges = get_IRanges_length(localRanges); int *start = INTEGER(get_IRanges_start(localRanges)); int *width = INTEGER(get_IRanges_width(localRanges)); for (int j = 0; j < nranges; j++) { struct bbiInterval *queryHits = bigWigIntervalQuery(file, (char *)CHAR(STRING_ELT(chromNames, i)), start[j] - 1, start[j] - 1 + width[j], lm); slReverse(&queryHits); hits = slCat(queryHits, hits); } int nhits = slCount(hits); SEXP ans_start, ans_width, ans_score, ans_score_l; PROTECT(ans_start = allocVector(INTSXP, nhits)); PROTECT(ans_width = allocVector(INTSXP, nhits)); if (returnScore) { PROTECT(ans_score_l = mkNamed(VECSXP, var_names)); ans_score = allocVector(REALSXP, nhits); SET_VECTOR_ELT(ans_score_l, 0, ans_score); } else PROTECT(ans_score_l = mkNamed(VECSXP, var_names + 1)); slReverse(&hits); for (int j = 0; j < nhits; j++, hits = hits->next) { INTEGER(ans_start)[j] = hits->start + 1; INTEGER(ans_width)[j] = hits->end - hits->start; if (returnScore) REAL(ans_score)[j] = hits->val; } SET_VECTOR_ELT(rangesListEls, i, new_IRanges("IRanges", ans_start, ans_width, R_NilValue)); SET_VECTOR_ELT(dataFrameListEls, i, new_DataFrame("DataFrame", ans_score_l, R_NilValue, ScalarInteger(nhits))); UNPROTECT(3); } bbiFileClose(&file); PROTECT(dataFrameList = new_SimpleList("SimpleSplitDataFrameList", dataFrameListEls)); PROTECT(rangesList = new_SimpleList("SimpleRangesList", rangesListEls)); ans = new_RangedData("RangedData", rangesList, dataFrameList); UNPROTECT(4); lmCleanup(&lm); popRHandlers(); return ans; } /* --- .Call ENTRY POINT --- */ SEXP BWGFile_summary(SEXP r_filename, SEXP r_chrom, SEXP r_ranges, SEXP r_size, SEXP r_type, SEXP r_default_value) { pushRHandlers(); struct bbiFile * file = bigWigFileOpen((char *)CHAR(asChar(r_filename))); enum bbiSummaryType type = bbiSummaryTypeFromString((char *)CHAR(asChar(r_type))); double default_value = asReal(r_default_value); int *start = INTEGER(get_IRanges_start(r_ranges)); int *width = INTEGER(get_IRanges_width(r_ranges)); SEXP ans; PROTECT(ans = allocVector(VECSXP, length(r_chrom))); for (int i = 0; i < length(r_chrom); i++) { int size = INTEGER(r_size)[i]; char *chrom = (char *)CHAR(STRING_ELT(r_chrom, i)); SEXP r_values = allocVector(REALSXP, size); double *values = REAL(r_values); for (int j = 0; j < size; j++) values[j] = default_value; SET_VECTOR_ELT(ans, i, r_values); bool success = bigWigSummaryArray(file, chrom, start[i] - 1, start[i] - 1 + width[i], type, size, values); if (!success) error("Failed to summarize range %d (%s:%d-%d)", i, chrom, start[i], start[i] - 1 + width[i]); } popRHandlers(); UNPROTECT(1); return ans; } #include "ucsc/verbose.h" SEXP BWGFile_fromWIG(SEXP r_infile, SEXP r_seqlengths, SEXP r_outfile) { pushRHandlers(); struct lm *lm = lmInit(0); struct hash *lenHash = createIntHash(r_seqlengths); struct bwgSection *sections = bwgParseWig((char *)CHAR(asChar(r_infile)), FALSE, lenHash, itemsPerSlot, lm); bwgCreate(sections, lenHash, blockSize, itemsPerSlot, TRUE, (char *)CHAR(asChar(r_outfile))); lmCleanup(&lm); freeHash(&lenHash); popRHandlers(); return r_outfile; } rtracklayer/src/bigWig.h0000644000126300012640000000130412227135242016626 0ustar00biocbuildphs_compbio#ifndef BIG_WIG_H #define BIG_WIG_H #include "rtracklayer.h" /* The .Call entry points */ SEXP BWGSectionList_add(SEXP r_sections, SEXP r_seq, SEXP r_ranges, SEXP r_score, SEXP r_format); SEXP BWGSectionList_write(SEXP r_sections, SEXP r_seqlengths, SEXP r_compress, SEXP r_file); SEXP BWGSectionList_cleanup(SEXP r_sections); SEXP BWGFile_query(SEXP r_filename, SEXP r_ranges, SEXP r_colnames); SEXP BWGFile_seqlengths(SEXP r_filename); SEXP BWGFile_summary(SEXP r_filename, SEXP r_chrom, SEXP r_ranges, SEXP r_size, SEXP r_type, SEXP r_default_value); SEXP BWGFile_fromWIG(SEXP r_infile, SEXP r_outfile, SEXP r_seqlengths); #endif rtracklayer/src/chain_io.c0000644000126300012640000001423712227135242017173 0ustar00biocbuildphs_compbio#include #include "ucsc/common.h" #include "ucsc/hash.h" #include "rtracklayer.h" #define LINEBUF_SIZE 20001 /* hash these chain blocks by target and query name */ typedef struct _ChainBlock { char *name; RangeAE ranges; /* to become an IRanges */ IntAE offset; /* starts in the other sequence */ /* rle of spaces and scores */ IntAE length, score; CharAE rev; /* use CharAE until we have a bitset */ CharAEAE space; } ChainBlock; #define HEADER_SIZE 11 #define DATA_SIZE 3 /* returns an array of ChainBlock pointers */ ChainBlock **read_chain_file(FILE *stream, const char *exclude, int *nblocks) { /* fgets() a line if first or after blank, parse header get names, use hash table to get existing block, ow create one add score, get offsets for starts ow parse a record for width, tstart, qstart */ char linebuf[LINEBUF_SIZE]; char *header[HEADER_SIZE]; char *data[DATA_SIZE]; int tstart, qstart; Rboolean new_block = TRUE, excluded = FALSE, trc, qrc; ChainBlock *block, **result; struct hash *hash = hashNew(6); struct hashEl *hash_elements; int line = 0, i = 0, header_line; while (fgets(linebuf, LINEBUF_SIZE, stream) != NULL) { line++; if (strlen(linebuf) == LINEBUF_SIZE - 1) { error("line %d is too long", line); } if (excluded) { eraseWhiteSpace(linebuf); if (!strlen(linebuf)) { excluded = FALSE; new_block = TRUE; } } else if (new_block) { /* have a header */ void *value; int matches = chopByChar(linebuf, ' ', header, HEADER_SIZE); if (matches < HEADER_SIZE) error("expected %d elements in header, got %d, on line %d", HEADER_SIZE, matches, line); new_block = FALSE; if (exclude && (strstr(header[2], exclude) || strstr(header[7], exclude))) { //Rprintf("excluding: [%s -> %s]\n", header[2], header[7]); excluded = TRUE; continue; } value = hashFindVal(hash, header[2]); if (!value) { /* new block */ int name_size = strlen(header[2])+1; block = Salloc(1, ChainBlock); hashAdd(hash, header[2], block); block->name = Salloc(name_size, char); memcpy(block->name, header[2], name_size); block->ranges = new_RangeAE(0, 0); block->offset = new_IntAE(0, 0, 0); block->length = new_IntAE(0, 0, 0); block->score = new_IntAE(0, 0, 0); block->rev = new_CharAE(0); block->space = new_CharAEAE(0, 0); } else block = value; IntAE_insert_at(&block->score, IntAE_get_nelt(&block->score), atoi(header[1])); append_string_to_CharAEAE(&block->space, header[7]); header_line = line; trc = strcmp("+", header[4]); qrc = strcmp("+", header[9]); CharAE_insert_at(&block->rev, CharAE_get_nelt(&block->rev), trc != qrc); tstart = atoi(header[5]) + 1; /* 0-based -> 1-based */ if (trc) tstart = atoi(header[3]) - tstart + 2; /* start one too high */ qstart = atoi(header[10]) + 1; if (qrc) qstart = atoi(header[8]) - qstart + 2; } else { int matches = chopByChar(linebuf, '\t', data, DATA_SIZE), width; if (matches != 1 && matches != 3) error("expecting 1 or 3 elements on line %d, got %d", line, matches); width = atoi(data[0]); tstart -= (trc ? width : 0); qstart -= (qrc ? width : 0); RangeAE_insert_at(&block->ranges, RangeAE_get_nelt(&block->ranges), tstart, width); IntAE_insert_at(&block->offset, IntAE_get_nelt(&block->offset), tstart - qstart); if (matches == 3) { /* normal line */ int dt = atoi(data[1]), dq = atoi(data[2]); int tchange, qchange; if (trc) /* width already subtracted above */ tchange = -dt; else tchange = width + dt; tstart += tchange; if (qrc) qchange = -dq; else qchange = width + dq; qstart += qchange; } else { new_block = TRUE; IntAE_insert_at(&block->length, IntAE_get_nelt(&block->length), line-header_line); //Rprintf("end of %s block, line: %d\n", block->name, line); fgets(linebuf, LINEBUF_SIZE, stream); /* skip empty line */ line++; } } } result = Salloc(hashNumEntries(hash), ChainBlock *); hash_elements = hashElListHash(hash); for (struct hashEl *h = hash_elements; h; h = h->next, i++) { result[i] = h->val; } *nblocks = i; hashElFreeList(&hash_elements); hashFree(&hash); return result; } /* parse the chain file format from UCSC for representing alignments */ SEXP readChain(SEXP r_path, SEXP r_exclude) { const char *path, *exclude; FILE *stream; SEXP ans, ans_names, ans_listData, chain_class, chainBlock_class; ChainBlock **chains; int i, nblocks; path = translateChar(STRING_ELT(r_path, 0)); if ((stream = fopen(path, "r")) == NULL) error("cannot open file '%s'", path); exclude = r_exclude == R_NilValue ? NULL : CHAR(STRING_ELT(r_exclude, 0)); chains = read_chain_file(stream, exclude, &nblocks); PROTECT(chain_class = MAKE_CLASS("Chain")); PROTECT(chainBlock_class = MAKE_CLASS("ChainBlock")); PROTECT(ans = NEW_OBJECT(chain_class)); ans_listData = allocVector(VECSXP, nblocks); SET_SLOT(ans, install("listData"), ans_listData); ans_names = allocVector(STRSXP, nblocks); SET_NAMES(ans_listData, ans_names); for (i = 0; i < nblocks; i++) { SEXP block; block = NEW_OBJECT(chainBlock_class); SET_VECTOR_ELT(ans_listData, i, block); SET_SLOT(block, install("ranges"), new_IRanges_from_RangeAE("IRanges", &chains[i]->ranges)); SET_SLOT(block, install("offset"), new_INTEGER_from_IntAE(&chains[i]->offset)); SET_SLOT(block, install("length"), new_INTEGER_from_IntAE(&chains[i]->length)); SET_SLOT(block, install("score"), new_INTEGER_from_IntAE(&chains[i]->score)); SET_SLOT(block, install("space"), new_CHARACTER_from_CharAEAE(&chains[i]->space)); SET_SLOT(block, install("reversed"), new_LOGICAL_from_CharAE(&chains[i]->rev)); SET_STRING_ELT(ans_names, i, mkChar(chains[i]->name)); } UNPROTECT(3); return ans; } rtracklayer/src/handlers.c0000644000126300012640000000077112227135242017220 0ustar00biocbuildphs_compbio#include "ucsc/common.h" #include "ucsc/errabort.h" #include "handlers.h" #define WARN_BUF_SIZE 512 static void R_warnHandler(char *format, va_list args) { char warn_buf[WARN_BUF_SIZE]; vsnprintf(warn_buf, WARN_BUF_SIZE, format, args); warning(warn_buf); } static void R_abortHandler() { error("UCSC library operation failed"); } void pushRHandlers() { pushAbortHandler(R_abortHandler); pushWarnHandler(R_warnHandler); } void popRHandlers() { popAbortHandler(); popWarnHandler(); } rtracklayer/src/handlers.h0000644000126300012640000000016412227135242017221 0ustar00biocbuildphs_compbio#ifndef HANDLERS_H #define HANDLERS_H #include "rtracklayer.h" void pushRHandlers(); void popRHandlers(); #endif rtracklayer/src/rtracklayer.h0000644000126300012640000000021412227135242017740 0ustar00biocbuildphs_compbio#ifndef RTRACKLAYER_H #define RTRACKLAYER_H #include #include #include #endif rtracklayer/src/twoBit.c0000644000126300012640000001124612227135242016667 0ustar00biocbuildphs_compbio#include "ucsc/common.h" #include "ucsc/dnaseq.h" #include "ucsc/twoBit.h" #include "twoBit.h" #include "handlers.h" /* .Call entry point */ SEXP DNAString_to_twoBit(SEXP r_dna, SEXP r_mask, SEXP r_seqname) { pushRHandlers(); dnaUtilOpen(); const DNA *dna = CHAR(asChar(r_dna)); struct dnaSeq *seq = newDnaSeq((DNA *)dna, strlen(dna), (char *)CHAR(asChar(r_seqname))); struct twoBit *twoBit = twoBitFromDnaSeq(seq, FALSE); int *mask_start = INTEGER(get_IRanges_start(r_mask)); int *mask_width = INTEGER(get_IRanges_width(r_mask)); int mask_count = get_IRanges_length(r_mask); SEXP ans; if (mask_count) { AllocArray(twoBit->maskStarts, mask_count); AllocArray(twoBit->maskSizes, mask_count); } for (int i = 0; i < mask_count; i++) { twoBit->maskStarts[i] = mask_start[i] - 1; twoBit->maskSizes[i] = mask_width[i]; } seq->dna = NULL; /* do not free memory owned by R */ freeDnaSeq(&seq); popRHandlers(); PROTECT(ans = R_MakeExternalPtr(twoBit, R_NilValue, R_NilValue)); setAttrib(ans, R_ClassSymbol, mkString("twoBit")); UNPROTECT(1); return ans; } /* .Call entry point */ /* Writes the list of twoBit pointers to disk and frees them */ SEXP TwoBits_write(SEXP r_twoBits, SEXP r_filename) { pushRHandlers(); FILE *file = mustOpen((char *)CHAR(asChar(r_filename)), "wb"); struct twoBit *twoBits = NULL, *twoBit_it = NULL; for (int i = 0; i < length(r_twoBits); i++) slAddHead(&twoBits, R_ExternalPtrAddr(VECTOR_ELT(r_twoBits, i))); slReverse(&twoBits); twoBitWriteHeader(twoBits, file); for (twoBit_it = twoBits; twoBit_it != NULL; twoBit_it = twoBit_it->next) { twoBitWriteOne(twoBit_it, file); } twoBitFreeList(&twoBits); carefulClose(&file); popRHandlers(); return R_NilValue; } /* .Call entry point */ SEXP TwoBitFile_seqlengths(SEXP r_filename) { pushRHandlers(); struct twoBitFile *tbf = twoBitOpen((char *)CHAR(asChar(r_filename))); struct twoBitIndex *index; int i, n = slCount(tbf->indexList); SEXP r_seqlengths, r_seqnames; PROTECT(r_seqlengths = allocVector(INTSXP, n)); r_seqnames = allocVector(STRSXP, n); setAttrib(r_seqlengths, R_NamesSymbol, r_seqnames); for (index = tbf->indexList, i = 0; index != NULL; index = index->next, i++) { SET_STRING_ELT(r_seqnames, i, mkChar(index->name)); INTEGER(r_seqlengths)[i] = twoBitSeqSize(tbf, index->name); } twoBitClose(&tbf); popRHandlers(); UNPROTECT(1); return r_seqlengths; } SEXP TwoBitFile_read(SEXP r_filename, SEXP r_seqnames, SEXP r_ranges, SEXP lkup) { pushRHandlers(); struct twoBitFile *file = twoBitOpen((char *)CHAR(asChar(r_filename))); int *frag_start = INTEGER(get_IRanges_start(r_ranges)); int *frag_width = INTEGER(get_IRanges_width(r_ranges)); int frag_count = get_IRanges_length(r_ranges); SEXP r_seq, r_ans_range, r_ans, r_ans_start; int total_width = 0, offset = 0; for (int i = 0; i < frag_count; i++) total_width += frag_width[i]; PROTECT(r_seq = allocVector(RAWSXP, total_width)); PROTECT(r_ans_start = allocVector(INTSXP, frag_count)); for (int i = 0; i < frag_count; i++) { if (frag_width[i]) { // UCSC library does not like zero width ranges struct dnaSeq *frag = twoBitReadSeqFrag(file, (char *)CHAR(STRING_ELT(r_seqnames, i)), frag_start[i] - 1, frag_start[i] + frag_width[i] - 1); Ocopy_bytes_to_i1i2_with_lkup(offset, offset + frag->size - 1, RAW(r_seq), total_width, frag->dna, frag->size, INTEGER(lkup), LENGTH(lkup)); freeDnaSeq(&frag); } INTEGER(r_ans_start)[i] = offset + 1; offset += frag_width[i]; } PROTECT(r_ans_range = new_IRanges("IRanges", r_ans_start, get_IRanges_width(r_ranges), R_NilValue)); r_ans = new_XRawList_from_tag("DNAStringSet", "DNAString", r_seq, r_ans_range); /* There are at least three ways to create the result: - Read everything into the same RAW vector and then convert to DNAStringSet. This is our choice. - Create a CHARSXP for each, and coerce to a DNAStringSet. This uses the same amount of memory as the above option, but it also might take more time, as it creates a CHARSXP for each element. It is the simplest solution. - Create a DNAString for each fragment and concatenate at end. This uses the least memory (during the process but the result is larger right?). It would be slowest though. */ twoBitClose(&file); popRHandlers(); UNPROTECT(3); return r_ans; } rtracklayer/src/twoBit.h0000644000126300012640000000056112227135242016672 0ustar00biocbuildphs_compbio#ifndef TWO_BIT_H #define TWO_BIT_H #include "rtracklayer.h" /* The .Call entry points */ SEXP DNAString_to_twoBit(SEXP r_dna, SEXP r_mask, SEXP r_seqname); SEXP TwoBits_write(SEXP r_twoBits, SEXP r_filename); SEXP TwoBitFile_seqlengths(SEXP r_filename); SEXP TwoBitFile_read(SEXP r_filename, SEXP r_seqnames, SEXP r_ranges, SEXP lkup); #endif rtracklayer/src/ucsc/0000755000126300012640000000000012227135242016204 5ustar00biocbuildphs_compbiortracklayer/src/ucsc/_bwgInternal.h0000644000126300012640000000100412227135242020763 0ustar00biocbuildphs_compbio/* Stuff that should be in ucsc/bwgInternal.h, but wasn't, so rtracklayer put it here. */ void bwgCreate(struct bwgSection *sectionList, struct hash *chromSizeHash, int blockSize, int itemsPerSlot, boolean doCompress, char *fileName); struct bbiFile *bigWigFileOpen(char *fileName); struct bbiInterval *bigWigIntervalQuery(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, struct lm *lm); rtracklayer/src/ucsc/_cheapcgi.c0000644000126300012640000000310712227135242020253 0ustar00biocbuildphs_compbio/* rtracklayer took out these little utilities from cheapcgi.c */ #include "common.h" void cgiDecode(char *in, char *out, int inLength) /* Decode from cgi pluses-for-spaces format to normal. * Out will be a little shorter than in typically, and * can be the same buffer. */ { char c; int i; for (i=0; isize = size; fi->isDir = isDir; fi->statErrno = statErrno; fi->lastAccess = lastAccess; strcpy(fi->name, name); return fi; } int cmpFileInfo(const void *va, const void *vb) /* Compare two fileInfo. */ { const struct fileInfo *a = *((struct fileInfo **)va); const struct fileInfo *b = *((struct fileInfo **)vb); return strcmp(a->name, b->name); } rtracklayer/src/ucsc/_portimpl.h0000644000126300012640000000037112227135242020363 0ustar00biocbuildphs_compbio/* Utilities that rtracklayer made common between win9x and unix */ struct fileInfo *newFileInfo(char *name, off_t size, bool isDir, int statErrno, time_t lastAccess); int cmpFileInfo(const void *va, const void *vb); rtracklayer/src/ucsc/bPlusTree.c0000644000126300012640000003426412227135242020266 0ustar00biocbuildphs_compbio/* bptFile - B+ Trees. These are a method of indexing data similar to binary trees, but * with many children rather than just two at each node. They work well when stored on disk, * since typically only two or three disk accesses are needed to locate any particular * piece of data. This implementation is *just* for disk based storage. For memory * use the rbTree instead. Currently the implementation is just useful for data warehouse * type applications. That is it implements a function to create a b+ tree from bulk data * (bptFileCreate) and a function to lookup a value given a key (bptFileFind) but not functions * to add or delete individual items. * * The layout of the file on disk is: * header * root node * (other nodes) * In general when the tree is first built the higher level nodes are stored before the * lower level nodes. It is possible if a b+ tree is dynamically updated for this to * no longer be strictly true, but actually currently the b+ tree code here doesn't implement * dynamic updates - it just creates a b+ tree from a sorted list. * * Each node can be one of two types - index or leaf. The index nodes contain pointers * to child nodes. The leaf nodes contain the actual data. * * The layout of the file header is: * 4 bytes - The value bptSig (0x78CA8C91) * 4 bytes - Number of children per block (not byte size of block) * 4 bytes - Number of significant bytes in key * 4 bytes - Number of bytes in value * 8 bytes - Number of items in index * 4 bytes - Always 0 for now * 4 bytes - Always 0 for now * The magic number may be byte-swapped, in which case all numbers in the file * need to be byte-swapped. * * The nodes start with a header: * 1 byte - 1 for leaf nodes, 0 for index nodes. * 1 byte - Always 0 for now. * 2 bytes - The number of children/items in node * This is followed by count items. For the index nodes the items are * key size bytes - always written most significant byte first * 8 bytes - Offset of child node in index file. * For leaf nodes the items are * key size bytes - always written most significant byte first * val sized bytes - the value associated with the key. * Note in general the leaf nodes may not be the same size as the index nodes, though in * the important case where the values are file offsets they will be. */ #include "common.h" #include "sig.h" #include "udc.h" #include "bPlusTree.h" /* This section of code deals with locating a value in a b+ tree. */ struct bptFile *bptFileAttach(char *fileName, struct udcFile *udc) /* Open up index file on previously open file, with header at current file position. */ { /* Open file and allocate structure to hold info from header etc. */ struct bptFile *bpt = needMem(sizeof(*bpt)); bpt->fileName = fileName; bpt->udc = udc; /* Read magic number at head of file and use it to see if we are proper file type, and * see if we are byte-swapped. */ bits32 magic; boolean isSwapped = FALSE; udcMustReadOne(udc, magic); if (magic != bptSig) { magic = byteSwap32(magic); isSwapped = bpt->isSwapped = TRUE; if (magic != bptSig) errAbort("%s is not a bpt b-plus tree index file", fileName); } /* Read rest of defined bits of header, byte swapping as needed. */ bpt->blockSize = udcReadBits32(udc, isSwapped); bpt->keySize = udcReadBits32(udc, isSwapped); bpt->valSize = udcReadBits32(udc, isSwapped); bpt->itemCount = udcReadBits64(udc, isSwapped); /* Skip over reserved bits of header. */ bits32 reserved32; udcMustReadOne(udc, reserved32); udcMustReadOne(udc, reserved32); /* Save position of root block of b+ tree. */ bpt->rootOffset = udcTell(udc); return bpt; } void bptFileDetach(struct bptFile **pBpt) /* Detach and free up cirTree file opened with cirTreeFileAttach. */ { freez(pBpt); } struct bptFile *bptFileOpen(char *fileName) /* Open up index file - reading header and verifying things. */ { return bptFileAttach(cloneString(fileName), udcFileOpen(fileName, udcDefaultDir())); } void bptFileClose(struct bptFile **pBpt) /* Close down and deallocate index file. */ { struct bptFile *bpt = *pBpt; if (bpt != NULL) { udcFileClose(&bpt->udc); freeMem(bpt->fileName); bptFileDetach(pBpt); } } static boolean rFind(struct bptFile *bpt, bits64 blockStart, void *key, void *val) /* Find value corresponding to key. If found copy value to memory pointed to by val and return * true. Otherwise return false. */ { /* Seek to start of block. */ udcSeek(bpt->udc, blockStart); /* Read block header. */ UBYTE isLeaf; UBYTE reserved; bits16 i, childCount; udcMustReadOne(bpt->udc, isLeaf); udcMustReadOne(bpt->udc, reserved); boolean isSwapped = bpt->isSwapped; childCount = udcReadBits16(bpt->udc, isSwapped); UBYTE keyBuf[bpt->keySize]; /* Place to put a key, buffered on stack. */ if (isLeaf) { for (i=0; iudc, keyBuf, bpt->keySize); udcMustRead(bpt->udc, val, bpt->valSize); if (memcmp(key, keyBuf, bpt->keySize) == 0) return TRUE; } return FALSE; } else { /* Read and discard first key. */ udcMustRead(bpt->udc, keyBuf, bpt->keySize); /* Scan info for first file offset. */ bits64 fileOffset = udcReadBits64(bpt->udc, isSwapped); /* Loop through remainder. */ for (i=1; iudc, keyBuf, bpt->keySize); if (memcmp(key, keyBuf, bpt->keySize) < 0) break; fileOffset = udcReadBits64(bpt->udc, isSwapped); } return rFind(bpt, fileOffset, key, val); } } void rTraverse(struct bptFile *bpt, bits64 blockStart, void *context, void (*callback)(void *context, void *key, int keySize, void *val, int valSize) ) /* Recursively go across tree, calling callback at leaves. */ { /* Seek to start of block. */ udcSeek(bpt->udc, blockStart); /* Read block header. */ UBYTE isLeaf; UBYTE reserved; bits16 i, childCount; udcMustReadOne(bpt->udc, isLeaf); udcMustReadOne(bpt->udc, reserved); boolean isSwapped = bpt->isSwapped; childCount = udcReadBits16(bpt->udc, isSwapped); char keyBuf[bpt->keySize], valBuf[bpt->valSize]; if (isLeaf) { for (i=0; iudc, keyBuf, bpt->keySize); udcMustRead(bpt->udc, valBuf, bpt->valSize); callback(context, keyBuf, bpt->keySize, valBuf, bpt->valSize); } } else { bits64 fileOffsets[childCount]; /* Loop through to get file offsets of children. */ for (i=0; iudc, keyBuf, bpt->keySize); fileOffsets[i] = udcReadBits64(bpt->udc, isSwapped); } /* Loop through recursing on child offsets. */ for (i=0; ikeySize long * val - pointer to where to put retrieved value */ { /* Check key size vs. file key size, and act appropriately. If need be copy key to a local * buffer and zero-extend it. */ if (keySize > bpt->keySize) return FALSE; char keyBuf[keySize]; if (keySize != bpt->keySize) { memcpy(keyBuf, key, keySize); memset(keyBuf+keySize, 0, bpt->keySize - keySize); key = keyBuf; } /* Make sure the valSize matches what's in file. */ if (valSize != bpt->valSize) errAbort("Value size mismatch between bptFileFind (valSize=%d) and %s (valSize=%d)", valSize, bpt->fileName, bpt->valSize); /* Call recursive finder. */ return rFind(bpt, bpt->rootOffset, key, val); } void bptFileTraverse(struct bptFile *bpt, void *context, void (*callback)(void *context, void *key, int keySize, void *val, int valSize) ) /* Traverse bPlusTree on file, calling supplied callback function at each * leaf item. */ { return rTraverse(bpt, bpt->rootOffset, context, callback); } /* This section of code deals with making balanced b+ trees given a sorted array as input. * The difficult part is mostly just calculating the offsets of various things. As an example * if you had the sorted array: * 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 * and wanted to create a tree of block size 4, the resulting tree would have three levels * as so: * 01 17 * 01 05 09 13 17 21 25 * 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 */ static int xToY(int x, unsigned y) /* Return x to the Y power, with y usually small. */ { int i, val = 1; for (i=0; i maxBlockSize) { itemCount = (itemCount + maxBlockSize - 1) / maxBlockSize; levels += 1; } return levels; } static bits32 writeIndexLevel(bits16 blockSize, void *itemArray, int itemSize, int itemCount, bits32 indexOffset, int level, void (*fetchKey)(const void *va, char *keyBuf), bits32 keySize, bits32 valSize, FILE *f) /* Write out a non-leaf level. */ { char *items = itemArray; /* Calculate number of nodes to write at this level. */ int slotSizePer = xToY(blockSize, level); // Number of items per slot in node int nodeSizePer = slotSizePer * blockSize; // Number of items per node int nodeCount = (itemCount + nodeSizePer - 1)/nodeSizePer; /* Calculate sizes and offsets. */ int bytesInIndexBlock = (bptBlockHeaderSize + blockSize * (keySize+sizeof(bits64))); int bytesInLeafBlock = (bptBlockHeaderSize + blockSize * (keySize+valSize)); bits64 bytesInNextLevelBlock = (level == 1 ? bytesInLeafBlock : bytesInIndexBlock); bits64 levelSize = nodeCount * bytesInIndexBlock; bits64 endLevel = indexOffset + levelSize; bits64 nextChild = endLevel; UBYTE isLeaf = FALSE; UBYTE reserved = 0; int i,j; char keyBuf[keySize+1]; keyBuf[keySize] = 0; for (i=0; i blockSize) countOne = blockSize; /* Write block header. */ writeOne(f, isLeaf); writeOne(f, reserved); writeOne(f, countOne); /* Write out the slots that are used one by one, and do sanity check. */ int slotsUsed = 0; int endIx = i + nodeSizePer; if (endIx > itemCount) endIx = itemCount; for (j=i; j blockSize) countOne = blockSize; else countOne = countLeft; writeOne(f, isLeaf); writeOne(f, reserved); writeOne(f, countOne); /* Write out position in genome and in file for each item. */ for (j=0; j 0; --i) { bits32 endLevelOffset = writeIndexLevel(blockSize, itemArray, itemSize, itemCount, indexOffset, i, fetchKey, keySize, valSize, f); indexOffset = ftell(f); if (endLevelOffset != indexOffset) internalErr(); } /* Write leaf nodes */ writeLeafLevel(blockSize, itemArray, itemSize, itemCount, fetchKey, keySize, fetchVal, valSize, f); } void bptFileCreate( void *itemArray, /* Sorted array of things to index. */ int itemSize, /* Size of each element in array. */ bits64 itemCount, /* Number of elements in array. */ bits32 blockSize, /* B+ tree block size - # of children for each node. */ void (*fetchKey)(const void *va, char *keyBuf), /* Given item, copy key to keyBuf */ bits32 keySize, /* Size of key */ void* (*fetchVal)(const void *va), /* Given item, return pointer to value */ bits32 valSize, /* Size of value */ char *fileName) /* Name of output file. */ /* Create a b+ tree index file from a sorted array. */ { /* Open file and write header. */ FILE *f = mustOpen(fileName, "wb"); bptFileBulkIndexToOpenFile(itemArray, itemSize, itemCount, blockSize, fetchKey, keySize, fetchVal, valSize, f); carefulClose(&f); } rtracklayer/src/ucsc/bPlusTree.h0000644000126300012640000001262712227135242020272 0ustar00biocbuildphs_compbio/* bptFile - B+ Trees. These are a method of indexing data similar to binary trees, but * with many children rather than just two at each node. They work well when stored on disk, * since typically only two or three disk accesses are needed to locate any particular * piece of data. This implementation is *just* for disk based storage. For memory * use the rbTree instead. Currently the implementation is just useful for data warehouse * type applications. That is it implements a function to create a b+ tree from bulk data * (bptFileCreate) and a function to lookup a value given a key (bptFileFind) but not functions * to add or delete individual items. * * * The layout of the file on disk is: * header * root node * (other nodes) * In general when the tree is first built the higher level nodes are stored before the * lower level nodes. It is possible if a b+ tree is dynamically updated for this to * no longer be strictly true, but actually currently the b+ tree code here doesn't implement * dynamic updates - it just creates a b+ tree from a sorted list. * * Each node can be one of two types - index or leaf. The index nodes contain pointers * to child nodes. The leaf nodes contain the actual data. * * The layout of the file header is: * 4 bytes - The value bptSig (0x78CA8C91) * 4 bytes - Number of children per block (not byte size of block) * 4 bytes - Number of significant bytes in key * 4 bytes - Number of bytes in value * 8 bytes - Number of items in index * 4 bytes - Always 0 for now * 4 bytes - Always 0 for now * The magic number may be byte-swapped, in which case all numbers in the file * need to be byte-swapped. * * The nodes start with a header: * 1 byte - 1 for leaf nodes, 0 for index nodes. * 1 byte - Always 0 for now. * 2 bytes - The number of children/items in node * This is followed by count items. For the index nodes the items are * key size bytes - always written most significant byte first * 8 bytes - Offset of child node in index file. * For leaf nodes the items are * key size bytes - always written most significant byte first * val sized bytes - the value associated with the key. * Note in general the leaf nodes may not be the same size as the index nodes, though in * the important case where the values are file offsets they will be. */ #ifndef BPLUSTREE_H #define BPLUSTREE_H struct bptFile /* B+ tree index file handle. */ { struct bptFile *next; /* Next in list of index files if any. */ char *fileName; /* Name of file - for error reporting. */ struct udcFile *udc; /* Open file pointer. */ bits32 blockSize; /* Size of block. */ bits32 keySize; /* Size of keys. */ bits32 valSize; /* Size of values. */ bits64 itemCount; /* Number of items indexed. */ boolean isSwapped; /* If TRUE need to byte swap everything. */ bits64 rootOffset; /* Offset of root block. */ }; struct bptFile *bptFileOpen(char *fileName); /* Open up index file - reading header and verifying things. */ void bptFileClose(struct bptFile **pBpt); /* Close down and deallocate index file. */ struct bptFile *bptFileAttach(char *fileName, struct udcFile *udc); /* Open up index file on previously open file, with header at current file position. */ void bptFileDetach(struct bptFile **pBpt); /* Detach and free up bptFile opened with bptFileAttach. */ boolean bptFileFind(struct bptFile *bpt, void *key, int keySize, void *val, int valSize); /* Find value associated with key. Return TRUE if it's found. * Parameters: * bpt - file handle returned by bptFileOpen * key - pointer to key string * keySize - size of key. Normally just strlen(key) * val - pointer to where to put retrieved value * valSize - size of memory buffer that will hold val. Should match bpt->valSize. */ void bptFileTraverse(struct bptFile *bpt, void *context, void (*callback)(void *context, void *key, int keySize, void *val, int valSize) ); /* Traverse bPlusTree on file, calling supplied callback function at each * leaf item. */ void bptFileCreate( void *itemArray, /* Sorted array of things to index. */ int itemSize, /* Size of each element in array. */ bits64 itemCount, /* Number of elements in array. */ bits32 blockSize, /* B+ tree block size - # of children for each node. */ void (*fetchKey)(const void *va, char *keyBuf), /* Given item, copy key to keyBuf */ bits32 keySize, /* Size of key */ void* (*fetchVal)(const void *va), /* Given item, return pointer to value */ bits32 valSize, /* Size of value */ char *fileName); /* Name of output file. */ /* Create a b+ tree index file from a sorted array. */ void bptFileBulkIndexToOpenFile(void *itemArray, int itemSize, bits64 itemCount, bits32 blockSize, void (*fetchKey)(const void *va, char *keyBuf), bits32 keySize, void* (*fetchVal)(const void *va), bits32 valSize, FILE *f); /* Create a b+ tree index from a sorted array, writing output starting at current position * of an already open file. See bptFileCreate for explanation of parameters. */ #define bptFileHeaderSize 32 #define bptBlockHeaderSize 4 #endif /* BPLUSTREE_H */ rtracklayer/src/ucsc/base64.c0000644000126300012640000000560412227135242017441 0ustar00biocbuildphs_compbio#include "common.h" #include "base64.h" static char const rcsid[] = "$Id: base64.c,v 1.6 2008/09/17 18:00:47 galt Exp $"; char *base64Encode(char *input, size_t inplen) /* Use base64 to encode a string. Returns one long encoded * string which need to be freeMem'd. Note: big-endian algorithm. * For some applications you may need to break the base64 output * of this function into lines no longer than 76 chars. */ { char b64[] = B64CHARS; int words = (inplen+2)/3; int remains = inplen % 3; char *result = (char *)needMem(4*words+1); size_t i=0, j=0; int word = 0; unsigned char *p = (unsigned char*) input; /* p must be unsigned char*, because without "unsigned", sign extend messes up last group outputted when the value of the chars following last in input happens to be char 0x80 or higher */ for(i=1; i<=words; i++) { word = 0; word |= *p++; word <<= 8; word |= *p++; word <<= 8; word |= *p++; if (i==words && remains>0) { word &= 0x00FFFF00; if (remains==1) word &= 0x00FF0000; } result[j++]=b64[word >> 18 & 0x3F]; result[j++]=b64[word >> 12 & 0x3F]; result[j++]=b64[word >> 6 & 0x3F]; result[j++]=b64[word & 0x3F]; } result[j] = 0; if (remains >0) result[j-1] = '='; if (remains==1) result[j-2] = '='; return result; } boolean base64Validate(char *input) /* Return true if input is valid base64. * Note that the input string is changed by * eraseWhiteSpace(). */ { size_t i = 0, l = 0; char *p = input; boolean validB64 = TRUE; /* remove whitespace which is unnecessary and */ eraseWhiteSpace(input); l = strlen(p); for(i=0;i> 16 & 0xFF; result[j++]=word >> 8 & 0xFF; result[j++]=word & 0xFF; } result[j] = 0; if (returnSize) *returnSize = j; return result; } rtracklayer/src/ucsc/base64.h0000644000126300012640000000171012227135242017440 0ustar00biocbuildphs_compbio/* Base64 encoding and decoding. * by Galt Barber */ #ifndef BASE64_H #define BASE64_H #define B64CHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" char *base64Encode(char *input, size_t inplen); /* Use base64 to encode a string. Returns one long encoded * string which need to be freeMem'd. Note: big-endian algorithm. * For some applications you may need to break the base64 output * of this function into lines no longer than 76 chars. */ boolean base64Validate(char *input); /* Return true if input is valid base64. * Note that the input string is changed by * eraseWhiteSpace(). */ char *base64Decode(char *input, size_t *returnSize); /* Use base64 to decode a string. Return decoded * string which will be freeMem'd. Note: big-endian algorithm. * Call eraseWhiteSpace() and check for invalid input * before passing in input if needed. * Optionally set retun size for use with binary data. */ #endif /* BASE64_H */ rtracklayer/src/ucsc/bbiFile.h0000644000126300012640000003512512227135242017717 0ustar00biocbuildphs_compbio/* bbiFile - Big Binary Indexed file. Stuff that's common between bigWig and bigBed. */ #ifndef BBIFILE_H #define BBIFILE_H #include "cirTree.h" /* bigWig/bigBed file structure: * fixedWidthHeader * magic# 4 bytes * version 2 bytes * zoomLevels 2 bytes * chromosomeTreeOffset 8 bytes * fullDataOffset 8 bytes * fullIndexOffset 8 bytes * fieldCount 2 bytes (for bigWig 0) * definedFieldCount 2 bytes (for bigWig 0) * autoSqlOffset 8 bytes (for bigWig 0) (0 if no autoSql information) * totalSummaryOffset 8 bytes (0 in earlier versions of file lacking totalSummary) * uncompressBufSize 4 bytes (Size of uncompression buffer. 0 if uncompressed.) * reserved 8 bytes (0 for now) * zoomHeaders there are zoomLevels number of these * reductionLevel 4 bytes * reserved 4 bytes * dataOffset 8 bytes * indexOffset 8 bytes * autoSql string (zero terminated - only present if autoSqlOffset non-zero) * totalSummary - summary of all data in file - only present if totalSummaryOffset non-zero * basesCovered 8 bytes * minVal 8 bytes float (for bigBed minimum depth of coverage) * maxVal 8 bytes float (for bigBed maximum depth of coverage) * sumData 8 bytes float (for bigBed sum of coverage) * sumSquared 8 bytes float (for bigBed sum of coverage squared) * chromosome b+ tree bPlusTree index * full data * sectionCount 8 bytes (item count for bigBeds) * section data section count sections, of three types (bed data for bigBeds) * full index cirTree index * zoom info one of these for each zoom level * zoom data * zoomCount 4 bytes * zoom data there are zoomCount of these items * chromId 4 bytes * chromStart 4 bytes * chromEnd 4 bytes * validCount 4 bytes * minVal 4 bytes float * maxVal 4 bytes float * sumData 4 bytes float * sumSquares 4 bytes float * zoom index cirTree index * magic# 4 bytes - same as magic number at start of header */ #ifndef CIRTREE_H #include "cirTree.h" #endif #define bbiCurrentVersion 4 /* Version history (of file format, not utilities - corresponds to version field in header) * 1 - Initial release * 1 - Unfortunately when attempting a transparent change to encoders, made the sectionCount * field inconsistent, sometimes not present, sometimes 32 bits. Since offset positions * in index were still accurate this did not break most applications, but it did show * up in the summary section of the Table Browser. * 2 - Made sectionCount consistently 64 bits. Also fixed missing zoomCount in first level of * zoom in files made by bedToBigBed and bedGraphToBigWig. (The older wigToBigWig was fine.) * Added totalSummary section. * 3 - Adding zlib compression. Only active if uncompressBufSize is non-zero in header. * 4 - Fixed problem in encoder for the max field in zoom levels higher than the first one. * Added an extra sig at end of file. */ struct bbiZoomLevel /* A zoom level in bigWig file. */ { struct bbiZoomLevel *next; /* Next in list. */ bits32 reductionLevel; /* How many bases per item */ bits32 reserved; /* Zero for now. */ bits64 dataOffset; /* Offset of data for this level in file. */ bits64 indexOffset; /* Offset of index for this level in file. */ }; struct bbiZoomLevel *bbiBestZoom(struct bbiZoomLevel *levelList, int desiredReduction); /* Return zoom level that is the closest one that is less than or equal to * desiredReduction. */ struct bbiFile /* An open bbiFile */ { struct bbiFile *next; /* Next in list. */ char *fileName; /* Name of file - for better error reporting. */ struct udcFile *udc; /* Open UDC file handle. */ bits32 typeSig; /* bigBedSig or bigWigSig for now. */ boolean isSwapped; /* If TRUE need to byte swap everything. */ struct bptFile *chromBpt; /* Index of chromosomes. */ bits16 version; /* Version number - initially 1. */ bits16 zoomLevels; /* Number of zoom levels. */ bits64 chromTreeOffset; /* Offset to chromosome index. */ bits64 unzoomedDataOffset; /* Start of unzoomed data. */ bits64 unzoomedIndexOffset; /* Start of unzoomed index. */ bits16 fieldCount; /* Number of columns in bed version. */ bits16 definedFieldCount; /* Number of columns using bed standard definitions. */ bits64 asOffset; /* Offset to embedded null-terminated AutoSQL file. */ bits64 totalSummaryOffset; /* Offset to total summary information if any. (On older files have to calculate) */ bits32 uncompressBufSize; /* Size of uncompression buffer, 0 if uncompressed */ struct cirTreeFile *unzoomedCir; /* Unzoomed data index in memory - may be NULL. */ struct bbiZoomLevel *levelList; /* List of zoom levels. */ }; struct bbiFile *bbiFileOpen(char *fileName, bits32 sig, char *typeName); /* Open up big wig or big bed file. */ void bbiFileClose(struct bbiFile **pBwf); /* Close down a big wig/big bed file. */ struct fileOffsetSize *bbiOverlappingBlocks(struct bbiFile *bbi, struct cirTreeFile *ctf, char *chrom, bits32 start, bits32 end, bits32 *retChromId); /* Fetch list of file blocks that contain items overlapping chromosome range. */ struct bbiChromIdSize /* We store an id/size pair in chromBpt bPlusTree */ { bits32 chromId; /* Chromosome ID */ bits32 chromSize; /* Chromosome Size */ }; struct bbiChromInfo /* Pair of a name and a 32-bit integer. Used to assign IDs to chromosomes. */ { struct bbiChromInfo *next; char *name; /* Chromosome name */ bits32 id; /* Chromosome ID - a small number usually */ bits32 size; /* Chromosome size in bases */ }; struct bbiChromInfo *bbiChromList(struct bbiFile *bbi); /* Return all chromosomes in file. Dispose of this with bbiChromInfoFreeList. */ void bbiChromInfoFreeList(struct bbiChromInfo **pList); /* Free a list of bbiChromInfo's */ bits32 bbiChromSize(struct bbiFile *bbi, char *chrom); /* Returns size of given chromosome. */ void bbiChromInfoKey(const void *va, char *keyBuf); /* Get key field out of bbiChromInfo. */ void *bbiChromInfoVal(const void *va); /* Get val field out of bbiChromInfo. */ struct bbiChromUsage /* Information on how many items per chromosome etc. Used by multipass bbiFile writers. */ { struct bbiChromUsage *next; char *name; /* chromosome name. */ bits32 itemCount; /* Number of items for this chromosome. */ bits32 id; /* Unique ID for chromosome. */ bits32 size; /* Size of chromosome. */ }; enum bbiSummaryType /* Way to summarize data. */ { bbiSumMean = 0, /* Average value */ bbiSumMax = 1, /* Maximum value */ bbiSumMin = 2, /* Minimum value */ bbiSumCoverage = 3, /* Bases in region containing actual data. */ bbiSumStandardDeviation = 4, /* Standard deviation in window. */ }; enum bbiSummaryType bbiSummaryTypeFromString(char *string); /* Return summary type given a descriptive string. */ char *bbiSummaryTypeToString(enum bbiSummaryType type); /* Convert summary type from enum to string representation. */ struct bbiSummary /* A summary type item. */ { struct bbiSummary *next; bits32 chromId; /* ID of associated chromosome. */ bits32 start,end; /* Range of chromosome covered. */ bits32 validCount; /* Count of (bases) with actual data. */ float minVal; /* Minimum value of items */ float maxVal; /* Maximum value of items */ float sumData; /* sum of values for each base. */ float sumSquares; /* sum of squares for each base. */ bits64 fileOffset; /* Offset of summary in file. */ }; #define bbiSummaryFreeList slFreeList struct bbiSummaryOnDisk /* The part of the summary that ends up on disk - in the same order written to disk. */ { bits32 chromId; /* ID of associated chromosome. */ bits32 start,end; /* Range of chromosome covered. */ bits32 validCount; /* Count of (bases) with actual data. */ float minVal; /* Minimum value of items */ float maxVal; /* Maximum value of items */ float sumData; /* sum of values for each base. */ float sumSquares; /* sum of squares for each base. */ }; struct bbiInterval /* Data on a single interval. */ { struct bbiInterval *next; /* Next in list. */ bits32 start, end; /* Position in chromosome, half open. */ double val; /* Value at that position. */ }; typedef struct bbiInterval *(*BbiFetchIntervals)(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, struct lm *lm); /* A callback function that returns a bbiInterval list. */ void bbiAttachUnzoomedCir(struct bbiFile *bbi); /* Make sure unzoomed cir is attached. */ struct bbiSummaryElement /* An element of a summary from the user side. */ { bits64 validCount; /* Count of (bases) with actual data. */ double minVal; /* Minimum value of items */ double maxVal; /* Maximum value of items */ double sumData; /* sum of values for each base. */ double sumSquares; /* sum of squares for each base. */ }; boolean bbiSummaryArrayExtended(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, BbiFetchIntervals fetchIntervals, int summarySize, struct bbiSummaryElement *summary); /* Fill in summary with data from indicated chromosome range in bigWig/bigBed file. * Returns FALSE if no data at that position. */ boolean bbiSummaryArray(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, BbiFetchIntervals fetchIntervals, enum bbiSummaryType summaryType, int summarySize, double *summaryValues); /* Fill in summaryValues with data from indicated chromosome range in bigWig file. * Be sure to initialize summaryValues to a default value, which will not be touched * for regions without data in file. (Generally you want the default value to either * be 0.0 or nan("") depending on the application.) Returns FALSE if no data * at that position. */ struct bbiSummaryElement bbiTotalSummary(struct bbiFile *bbi); /* Return summary of entire file! */ /****** Write side of things - implemented in bbiWrite.c ********/ struct bbiBoundsArray /* Minimum info needed for r-tree indexer - where a section lives on disk and the * range it covers. */ { bits64 offset; /* Offset within file. */ struct cirTreeRange range; /* What is covered. */ }; struct cirTreeRange bbiBoundsArrayFetchKey(const void *va, void *context); /* Fetch bbiBoundsArray key for r-tree */ bits64 bbiBoundsArrayFetchOffset(const void *va, void *context); /* Fetch bbiBoundsArray file offset for r-tree */ struct bbiSumOutStream /* Buffer output to file so have a chance to compress. */ { struct bbiSummaryOnDisk *array; int elCount; int allocCount; FILE *f; boolean doCompress; }; struct bbiSumOutStream *bbiSumOutStreamOpen(int allocCount, FILE *f, boolean doCompress); /* Open new bbiSumOutStream. */ void bbiSumOutStreamClose(struct bbiSumOutStream **pStream); /* Free up bbiSumOutStream */ void bbiSumOutStreamWrite(struct bbiSumOutStream *stream, struct bbiSummary *sum); /* Write out next one to stream. */ void bbiOutputOneSummaryFurtherReduce(struct bbiSummary *sum, struct bbiSummary **pTwiceReducedList, int doubleReductionSize, struct bbiBoundsArray **pBoundsPt, struct bbiBoundsArray *boundsEnd, bits32 chromSize, struct lm *lm, struct bbiSumOutStream *stream); /* Write out sum to file, keeping track of minimal info on it in *pBoundsPt, and also adding * it to second level summary. */ struct bbiSummary *bbiSummarySimpleReduce(struct bbiSummary *list, int reduction, struct lm *lm); /* Do a simple reduction - where among other things the reduction level is an integral * multiple of the previous reduction level, and the list is sorted. Allocate result out of lm. */ #define bbiMaxZoomLevels 10 /* Maximum zoom levels produced by writers. */ void bbiWriteDummyHeader(FILE *f); /* Write out all-zero header, just to reserve space for it. */ void bbiWriteDummyZooms(FILE *f); /* Write out zeroes to reserve space for ten zoom levels. */ void bbiSummaryElementWrite(FILE *f, struct bbiSummaryElement *sum); /* Write out summary element to file. */ void bbiWriteChromInfo(struct bbiChromUsage *usageList, int blockSize, FILE *f); /* Write out information on chromosomes to file. */ void bbiWriteFloat(FILE *f, float val); /* Write out floating point val to file. Mostly to convert from double... */ struct hash *bbiChromSizesFromFile(char *fileName); /* Read two column file into hash keyed by chrom. */ bits64 bbiTotalSummarySize(struct bbiSummary *list); /* Return size on disk of all summaries. */ void bbiChromUsageFree(struct bbiChromUsage **pUsage); /* free a single bbiChromUsage structure */ void bbiChromUsageFreeList(struct bbiChromUsage **pList); /* free a list of bbiChromUsage structures */ struct bbiChromUsage *bbiChromUsageFromBedFile(struct lineFile *lf, struct hash *chromSizesHash, int *retMinDiff, double *retAveSize, bits64 *retBedCount); /* Go through bed file and collect chromosomes and statistics. Free with bbiChromUsageFreeList */ int bbiCountSectionsNeeded(struct bbiChromUsage *usageList, int itemsPerSlot); /* Count up number of sections needed for data. */ void bbiAddToSummary(bits32 chromId, bits32 chromSize, bits32 start, bits32 end, bits32 validCount, double minVal, double maxVal, double sumData, double sumSquares, int reduction, struct bbiSummary **pOutList); /* Add data range to summary - putting it onto top of list if possible, otherwise * expanding list. */ void bbiAddRangeToSummary(bits32 chromId, bits32 chromSize, bits32 start, bits32 end, double val, int reduction, struct bbiSummary **pOutList); /* Add chromosome range to summary - putting it onto top of list if possible, otherwise * expanding list. */ struct bbiSummary *bbiReduceSummaryList(struct bbiSummary *inList, struct bbiChromInfo *chromInfoArray, int reduction); /* Reduce summary list to another summary list. */ bits64 bbiWriteSummaryAndIndex(struct bbiSummary *summaryList, int blockSize, int itemsPerSlot, boolean doCompress, FILE *f); /* Write out summary and index to summary, returning start position of * summary index. */ boolean bbiFileCheckSigs(char *fileName, bits32 sig, char *typeName); /* check file signatures at beginning and end of file */ time_t bbiUpdateTime(struct bbiFile *bbi); /* return bbi->udc->updateTime */ #endif /* BBIFILE_H */ rtracklayer/src/ucsc/bbiRead.c0000644000126300012640000005257712227135242017720 0ustar00biocbuildphs_compbio/* bbiRead - Big Binary Indexed file. Stuff that's common between bigWig and bigBed on the * read side. */ #include "common.h" #include "linefile.h" #include "hash.h" #include "obscure.h" #include "localmem.h" #include "zlibFace.h" #include "bPlusTree.h" #include "hmmstats.h" #include "cirTree.h" #include "udc.h" #include "bbiFile.h" struct bbiZoomLevel *bbiBestZoom(struct bbiZoomLevel *levelList, int desiredReduction) /* Return zoom level that is the closest one that is less than or equal to * desiredReduction. */ { if (desiredReduction < 0) errAbort("bad value %d for desiredReduction in bbiBestZoom", desiredReduction); if (desiredReduction <= 1) return NULL; int closestDiff = BIGNUM; struct bbiZoomLevel *closestLevel = NULL; struct bbiZoomLevel *level; for (level = levelList; level != NULL; level = level->next) { int diff = desiredReduction - level->reductionLevel; if (diff >= 0 && diff < closestDiff) { closestDiff = diff; closestLevel = level; } } return closestLevel; } boolean bbiFileCheckSigs(char *fileName, bits32 sig, char *typeName) /* check file signatures at beginning and end of file */ { int fd = mustOpenFd(fileName, O_RDONLY); bits32 magic; boolean isSwapped = FALSE; // look for signature at the beginning of the file mustReadFd(fd, &magic, sizeof(magic)); if (magic != sig) { magic = byteSwap32(magic); isSwapped = TRUE; if (magic != sig) return FALSE; } // look for signature at the end of the file mustLseek(fd, -sizeof(magic), SEEK_END); mustReadFd(fd, &magic, sizeof(magic)); mustCloseFd(&fd); if (isSwapped) { magic = byteSwap32(magic); if (magic != sig) return FALSE; } else { if (magic != sig) return FALSE; } return TRUE; } struct bbiFile *bbiFileOpen(char *fileName, bits32 sig, char *typeName) /* Open up big wig or big bed file. */ { /* This code needs to agree with code in two other places currently - bigBedFileCreate, * and bigWigFileCreate. I'm thinking of refactoring to share at least between * bigBedFileCreate and bigWigFileCreate. It'd be great so it could be structured * so that it could send the input in one chromosome at a time, and send in the zoom * stuff only after all the chromosomes are done. This'd potentially reduce the memory * footprint by a factor of 2 or 4. Still, for now it works. -JK */ struct bbiFile *bbi; AllocVar(bbi); bbi->fileName = cloneString(fileName); struct udcFile *udc = bbi->udc = udcFileOpen(fileName, udcDefaultDir()); /* Read magic number at head of file and use it to see if we are proper file type, and * see if we are byte-swapped. */ bits32 magic; boolean isSwapped = FALSE; udcMustRead(udc, &magic, sizeof(magic)); if (magic != sig) { magic = byteSwap32(magic); isSwapped = TRUE; if (magic != sig) errAbort("%s is not a %s file", fileName, typeName); } bbi->typeSig = sig; bbi->isSwapped = isSwapped; /* Read rest of defined bits of header, byte swapping as needed. */ bbi->version = udcReadBits16(udc, isSwapped); bbi->zoomLevels = udcReadBits16(udc, isSwapped); bbi->chromTreeOffset = udcReadBits64(udc, isSwapped); bbi->unzoomedDataOffset = udcReadBits64(udc, isSwapped); bbi->unzoomedIndexOffset = udcReadBits64(udc, isSwapped); bbi->fieldCount = udcReadBits16(udc, isSwapped); bbi->definedFieldCount = udcReadBits16(udc, isSwapped); bbi->asOffset = udcReadBits64(udc, isSwapped); bbi->totalSummaryOffset = udcReadBits64(udc, isSwapped); bbi->uncompressBufSize = udcReadBits32(udc, isSwapped); /* Skip over reserved area. */ udcSeek(udc, 64); /* Read zoom headers. */ int i; struct bbiZoomLevel *level, *levelList = NULL; for (i=0; izoomLevels; ++i) { AllocVar(level); level->reductionLevel = udcReadBits32(udc, isSwapped); level->reserved = udcReadBits32(udc, isSwapped); level->dataOffset = udcReadBits64(udc, isSwapped); level->indexOffset = udcReadBits64(udc, isSwapped); slAddHead(&levelList, level); } slReverse(&levelList); bbi->levelList = levelList; /* Attach B+ tree of chromosome names and ids. */ udcSeek(udc, bbi->chromTreeOffset); bbi->chromBpt = bptFileAttach(fileName, udc); return bbi; } void bbiFileClose(struct bbiFile **pBwf) /* Close down a big wig/big bed file. */ { struct bbiFile *bwf = *pBwf; if (bwf != NULL) { cirTreeFileDetach(&bwf->unzoomedCir); slFreeList(&bwf->levelList); slFreeList(&bwf->levelList); bptFileDetach(&bwf->chromBpt); udcFileClose(&bwf->udc); freeMem(bwf->fileName); freez(pBwf); } } struct fileOffsetSize *bbiOverlappingBlocks(struct bbiFile *bbi, struct cirTreeFile *ctf, char *chrom, bits32 start, bits32 end, bits32 *retChromId) /* Fetch list of file blocks that contain items overlapping chromosome range. */ { struct bbiChromIdSize idSize; if (!bptFileFind(bbi->chromBpt, chrom, strlen(chrom), &idSize, sizeof(idSize))) return NULL; if (bbi->isSwapped) idSize.chromId = byteSwap32(idSize.chromId); if (retChromId != NULL) *retChromId = idSize.chromId; return cirTreeFindOverlappingBlocks(ctf, idSize.chromId, start, end); } struct chromNameCallbackContext /* Some stuff that the bPlusTree traverser needs for context. */ { struct bbiChromInfo *list; /* The list we are building. */ boolean isSwapped; /* Need to byte-swap things? */ }; static void chromNameCallback(void *context, void *key, int keySize, void *val, int valSize) /* Callback that captures chromInfo from bPlusTree. */ { struct chromNameCallbackContext *c = context; struct bbiChromInfo *info; struct bbiChromIdSize *idSize = val; assert(valSize == sizeof(*idSize)); AllocVar(info); info->name = cloneStringZ(key, keySize); info->id = idSize->chromId; info->size = idSize->chromSize; if (c->isSwapped) { info->id = byteSwap32(info->id); info->size = byteSwap32(info->size); } slAddHead(&c->list, info); } struct bbiChromInfo *bbiChromList(struct bbiFile *bbi) /* Return list of chromosomes. */ { struct chromNameCallbackContext context; context.list = NULL; context.isSwapped = bbi->isSwapped; bptFileTraverse(bbi->chromBpt, &context, chromNameCallback); slReverse(&context.list); return context.list; } bits32 bbiChromSize(struct bbiFile *bbi, char *chrom) /* Return chromosome size, or 0 if no such chromosome in file. */ { struct bbiChromIdSize idSize; if (!bptFileFind(bbi->chromBpt, chrom, strlen(chrom), &idSize, sizeof(idSize))) return 0; return idSize.chromSize; } void bbiChromInfoFree(struct bbiChromInfo **pInfo) /* Free up one chromInfo */ { struct bbiChromInfo *info = *pInfo; if (info != NULL) { freeMem(info->name); freez(pInfo); } } void bbiChromInfoFreeList(struct bbiChromInfo **pList) /* Free a list of dynamically allocated bbiChromInfo's */ { struct bbiChromInfo *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; bbiChromInfoFree(&el); } *pList = NULL; } void bbiAttachUnzoomedCir(struct bbiFile *bbi) /* Make sure unzoomed cir is attached. */ { if (bbi->unzoomedCir == NULL) { udcSeek(bbi->udc, bbi->unzoomedIndexOffset); bbi->unzoomedCir = cirTreeFileAttach(bbi->fileName, bbi->udc); } } enum bbiSummaryType bbiSummaryTypeFromString(char *string) /* Return summary type given a descriptive string. */ { if (sameWord(string, "mean") || sameWord(string, "average")) return bbiSumMean; else if (sameWord(string, "max") || sameWord(string, "maximum")) return bbiSumMax; else if (sameWord(string, "min") || sameWord(string, "minimum")) return bbiSumMin; else if (sameWord(string, "coverage") || sameWord(string, "dataCoverage")) return bbiSumCoverage; else if (sameWord(string, "std")) return bbiSumStandardDeviation; else { errAbort("Unknown bbiSummaryType %s", string); return bbiSumMean; /* Keep compiler quiet. */ } } char *bbiSummaryTypeToString(enum bbiSummaryType type) /* Convert summary type from enum to string representation. */ { switch (type) { case bbiSumMean: return "mean"; case bbiSumMax: return "max"; case bbiSumMin: return "min"; case bbiSumCoverage: return "coverage"; case bbiSumStandardDeviation: return "std"; default: errAbort("Unknown bbiSummaryType %d", (int)type); return NULL; } } #ifdef UNUSED static void bbiSummaryOnDiskRead(struct bbiFile *bbi, struct bbiSummaryOnDisk *sum) /* Read in summary from file. */ { struct udcFile *udc = bbi->udc; boolean isSwapped = bbi->isSwapped; sum->chromId = udcReadBits32(udc, isSwapped); sum->start = udcReadBits32(udc, isSwapped); sum->end = udcReadBits32(udc, isSwapped); sum->validCount = udcReadBits32(udc, isSwapped); udcMustReadOne(udc, sum->minVal); udcMustReadOne(udc, sum->maxVal); udcMustReadOne(udc, sum->sumData); udcMustReadOne(udc, sum->sumSquares); } #endif /* UNUSED */ static struct bbiSummary *bbiSummaryFromOnDisk(struct bbiSummaryOnDisk *in) /* Create a bbiSummary unlinked to anything from input in onDisk format. */ { struct bbiSummary *out; AllocVar(out); out->chromId = in->chromId; out->start = in->start; out->end = in->end; out->validCount = in->validCount; out->minVal = in->minVal; out->maxVal = in->maxVal; out->sumData = in->sumData; out->sumSquares = in->sumSquares; return out; } static struct bbiSummary *bbiSummariesInRegion(struct bbiZoomLevel *zoom, struct bbiFile *bbi, int chromId, bits32 start, bits32 end) /* Return list of all summaries in region at given zoom level of bbiFile. */ { struct bbiSummary *sumList = NULL, *sum; struct udcFile *udc = bbi->udc; udcSeek(udc, zoom->indexOffset); struct cirTreeFile *ctf = cirTreeFileAttach(bbi->fileName, bbi->udc); struct fileOffsetSize *blockList = cirTreeFindOverlappingBlocks(ctf, chromId, start, end); struct fileOffsetSize *block, *beforeGap, *afterGap; /* Set up for uncompression optionally. */ char *uncompressBuf = NULL; if (bbi->uncompressBufSize > 0) uncompressBuf = needLargeMem(bbi->uncompressBufSize); /* This loop is a little complicated because we merge the read requests for efficiency, but we * have to then go back through the data one unmerged block at a time. */ for (block = blockList; block != NULL; ) { /* Find contigious blocks and read them into mergedBuf. */ fileOffsetSizeFindGap(block, &beforeGap, &afterGap); bits64 mergedOffset = block->offset; bits64 mergedSize = beforeGap->offset + beforeGap->size - mergedOffset; udcSeek(udc, mergedOffset); char *mergedBuf = needLargeMem(mergedSize); udcMustRead(udc, mergedBuf, mergedSize); char *blockBuf = mergedBuf; /* Loop through individual blocks within merged section. */ for (;block != afterGap; block = block->next) { /* Uncompress if necessary. */ char *blockPt, *blockEnd; if (uncompressBuf) { blockPt = uncompressBuf; int uncSize = zUncompress(blockBuf, block->size, uncompressBuf, bbi->uncompressBufSize); blockEnd = blockPt + uncSize; } else { blockPt = blockBuf; blockEnd = blockPt + block->size; } /* Figure out bounds and number of items in block. */ int blockSize = blockEnd - blockPt; struct bbiSummaryOnDisk *dSum; int itemSize = sizeof(*dSum); assert(blockSize % itemSize == 0); int itemCount = blockSize / itemSize; /* Read in items and convert to memory list format. */ int i; for (i=0; ichromId == chromId) { int s = max(dSum->start, start); int e = min(dSum->end, end); if (s < e) { sum = bbiSummaryFromOnDisk(dSum); slAddHead(&sumList, sum); } } } assert(blockPt == blockEnd); blockBuf += block->size; } freeMem(mergedBuf); } freeMem(uncompressBuf); slFreeList(&blockList); cirTreeFileDetach(&ctf); slReverse(&sumList); return sumList; } static bits32 bbiSummarySlice(struct bbiFile *bbi, bits32 baseStart, bits32 baseEnd, struct bbiSummary *sumList, struct bbiSummaryElement *el) /* Update retVal with the average value if there is any data in interval. Return number * of valid data bases in interval. */ { bits32 validCount = 0; if (sumList != NULL) { double minVal = sumList->minVal; double maxVal = sumList->maxVal; double sumData = 0, sumSquares = 0; struct bbiSummary *sum; for (sum = sumList; sum != NULL && sum->start < baseEnd; sum = sum->next) { int overlap = rangeIntersection(baseStart, baseEnd, sum->start, sum->end); if (overlap > 0) { double overlapFactor = (double)overlap / (sum->end - sum->start); validCount += sum->validCount * overlapFactor; sumData += sum->sumData * overlapFactor; sumSquares += sum->sumSquares * overlapFactor; if (maxVal < sum->maxVal) maxVal = sum->maxVal; if (minVal > sum->minVal) minVal = sum->minVal; } } if (validCount > 0) { el->validCount = validCount; el->minVal = minVal; el->maxVal = maxVal; el->sumData = sumData; el->sumSquares = sumSquares; } } return validCount; } static int bbiChromId(struct bbiFile *bbi, char *chrom) /* Return chromosome size */ { struct bbiChromIdSize idSize; if (!bptFileFind(bbi->chromBpt, chrom, strlen(chrom), &idSize, sizeof(idSize))) return -1; return idSize.chromId; } static boolean bbiSummaryArrayFromZoom(struct bbiZoomLevel *zoom, struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, int summarySize, struct bbiSummaryElement *summary) /* Look up region in index and get data at given zoom level. Summarize this data * in the summary array. */ { boolean result = FALSE; int chromId = bbiChromId(bbi, chrom); if (chromId < 0) return FALSE; struct bbiSummary *sum, *sumList = bbiSummariesInRegion(zoom, bbi, chromId, start, end); if (sumList != NULL) { int i; bits32 baseStart = start, baseEnd; bits32 baseCount = end - start; sum = sumList; for (i=0; iend <= baseStart) sum = sum->next; if (bbiSummarySlice(bbi, baseStart, baseEnd, sum, &summary[i])) result = TRUE; /* Next time round start where we left off. */ baseStart = baseEnd; } slFreeList(&sumList); } return result; } static bits32 bbiIntervalSlice(struct bbiFile *bbi, bits32 baseStart, bits32 baseEnd, struct bbiInterval *intervalList, struct bbiSummaryElement *el) /* Update retVal with the average value if there is any data in interval. Return number * of valid data bases in interval. */ { double validCount = 0; if (intervalList != NULL) { struct bbiInterval *interval; double sumData = 0, sumSquares = 0; double minVal = intervalList->val; double maxVal = intervalList->val; for (interval = intervalList; interval != NULL && interval->start < baseEnd; interval = interval->next) { int overlap = rangeIntersection(baseStart, baseEnd, interval->start, interval->end); if (overlap > 0) { int intervalSize = interval->end - interval->start; double overlapFactor = (double)overlap / intervalSize; double intervalWeight = intervalSize * overlapFactor; validCount += intervalWeight; sumData += interval->val * intervalWeight; sumSquares += interval->val * interval->val * intervalWeight; if (maxVal < interval->val) maxVal = interval->val; if (minVal > interval->val) minVal = interval->val; } } el->validCount = round(validCount); el->minVal = minVal; el->maxVal = maxVal; el->sumData = sumData; el->sumSquares = sumSquares; } return round(validCount); } static boolean bbiSummaryArrayFromFull(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, BbiFetchIntervals fetchIntervals, int summarySize, struct bbiSummaryElement *summary) /* Summarize data, not using zoom. */ { struct bbiInterval *intervalList = NULL, *interval; struct lm *lm = lmInit(0); intervalList = (*fetchIntervals)(bbi, chrom, start, end, lm); boolean result = FALSE; if (intervalList != NULL); { int i; bits32 baseStart = start, baseEnd; bits32 baseCount = end - start; interval = intervalList; for (i=0; iend <= baseStart) interval = interval->next; if (bbiIntervalSlice(bbi, baseStart, end1, interval, &summary[i])) result = TRUE; /* Next time round start where we left off. */ baseStart = baseEnd; } } lmCleanup(&lm); return result; } boolean bbiSummaryArrayExtended(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, BbiFetchIntervals fetchIntervals, int summarySize, struct bbiSummaryElement *summary) /* Fill in summary with data from indicated chromosome range in bigWig file. * Returns FALSE if no data at that position. */ { boolean result = FALSE; /* Protect from bad input. */ if (start >= end) return result; bzero(summary, summarySize * sizeof(summary[0])); /* Figure out what size of data we want. We actually want to get 2 data points per summary * value if possible to minimize the effect of a data point being split between summary pixels. */ bits32 baseSize = end - start; int fullReduction = (baseSize/summarySize); int zoomLevel = fullReduction/2; if (zoomLevel < 0) zoomLevel = 0; /* Get the closest zoom level less than what we're looking for. */ struct bbiZoomLevel *zoom = bbiBestZoom(bbi->levelList, zoomLevel); if (zoom != NULL) result = bbiSummaryArrayFromZoom(zoom, bbi, chrom, start, end, summarySize, summary); else result = bbiSummaryArrayFromFull(bbi, chrom, start, end, fetchIntervals, summarySize, summary); return result; } boolean bbiSummaryArray(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, BbiFetchIntervals fetchIntervals, enum bbiSummaryType summaryType, int summarySize, double *summaryValues) /* Fill in summaryValues with data from indicated chromosome range in bigWig file. * Be sure to initialize summaryValues to a default value, which will not be touched * for regions without data in file. (Generally you want the default value to either * be 0.0 or nan("") depending on the application.) Returns FALSE if no data * at that position. */ { struct bbiSummaryElement *elements; AllocArray(elements, summarySize); boolean ret = bbiSummaryArrayExtended(bbi, chrom, start, end, fetchIntervals, summarySize, elements); if (ret) { int i; double covFactor = (double)summarySize/(end - start); for (i=0; ivalidCount > 0) { double val; switch (summaryType) { case bbiSumMean: val = el->sumData/el->validCount; break; case bbiSumMax: val = el->maxVal; break; case bbiSumMin: val = el->minVal; break; case bbiSumCoverage: val = covFactor*el->validCount; break; case bbiSumStandardDeviation: val = calcStdFromSums(el->sumData, el->sumSquares, el->validCount); break; default: internalErr(); val = 0.0; break; } summaryValues[i] = val; } } } freeMem(elements); return ret; } struct bbiSummaryElement bbiTotalSummary(struct bbiFile *bbi) /* Return summary of entire file! */ { struct udcFile *udc = bbi->udc; boolean isSwapped = bbi->isSwapped; struct bbiSummaryElement res; ZeroVar(&res); if (bbi->totalSummaryOffset != 0) { udcSeek(udc, bbi->totalSummaryOffset); res.validCount = udcReadBits64(udc, isSwapped); res.minVal = udcReadDouble(udc, isSwapped); res.maxVal = udcReadDouble(udc, isSwapped); res.sumData = udcReadDouble(udc, isSwapped); res.sumSquares = udcReadDouble(udc, isSwapped); } else if (bbi->version == 1) /* Require version 1 so as not to have to deal with compression. Should not happen * to have NULL totalSummaryOffset for non-empty version 2+ file anyway. */ { /* Find most extreme zoom. */ struct bbiZoomLevel *bestZoom = NULL, *zoom; bits32 bestReduction = 0; for (zoom = bbi->levelList; zoom != NULL; zoom = zoom->next) { if (zoom->reductionLevel > bestReduction) { bestReduction = zoom->reductionLevel; bestZoom = zoom; } } if (bestZoom != NULL) { udcSeek(udc, bestZoom->dataOffset); bits32 zoomSectionCount = udcReadBits32(udc, isSwapped); bits32 i; for (i=0; i res.maxVal) res.maxVal = maxVal; res.sumData += udcReadFloat(udc, isSwapped); res.sumSquares += udcReadFloat(udc, isSwapped); } } } } return res; } time_t bbiUpdateTime(struct bbiFile *bbi) /* return bbi->udc->updateTime */ { struct udcFile *udc = bbi->udc; return udcUpdateTime(udc); } rtracklayer/src/ucsc/bbiWrite.c0000644000126300012640000004265012227135242020126 0ustar00biocbuildphs_compbio#include "common.h" #include "hash.h" #include "linefile.h" #include "sqlNum.h" #include "localmem.h" #include "zlibFace.h" #include "cirTree.h" #include "bPlusTree.h" #include "bbiFile.h" #include "obscure.h" void bbiWriteDummyHeader(FILE *f) /* Write out all-zero header, just to reserve space for it. */ { repeatCharOut(f, 0, 64); } void bbiWriteDummyZooms(FILE *f) /* Write out zeroes to reserve space for ten zoom levels. */ { repeatCharOut(f, 0, bbiMaxZoomLevels * 24); } void bbiSummaryElementWrite(FILE *f, struct bbiSummaryElement *sum) /* Write out summary element to file. */ { writeOne(f, sum->validCount); writeOne(f, sum->minVal); writeOne(f, sum->maxVal); writeOne(f, sum->sumData); writeOne(f, sum->sumSquares); } static int bbiChromInfoCmp(const void *va, const void *vb) /* Sort bbiChromInfo. Unlike most of our sorts this is single rather * than double indirect. */ { const struct bbiChromInfo *a = (const struct bbiChromInfo *)va; const struct bbiChromInfo *b = (const struct bbiChromInfo *)vb; return strcmp(a->name, b->name); } void bbiWriteChromInfo(struct bbiChromUsage *usageList, int blockSize, FILE *f) /* Write out information on chromosomes to file. */ { int chromCount = slCount(usageList); struct bbiChromUsage *usage; /* Allocate and fill in array from list. */ struct bbiChromInfo *chromInfoArray; AllocArray(chromInfoArray, chromCount); int i; int maxChromNameSize = 0; for (i=0, usage = usageList; inext) { char *chromName = usage->name; int len = strlen(chromName); if (len > maxChromNameSize) maxChromNameSize = len; chromInfoArray[i].name = chromName; chromInfoArray[i].id = usage->id; chromInfoArray[i].size = usage->size; } /* Sort so the b-Tree actually works. */ qsort(chromInfoArray, chromCount, sizeof(chromInfoArray[0]), bbiChromInfoCmp); /* Write chromosome bPlusTree */ int chromBlockSize = min(blockSize, chromCount); bptFileBulkIndexToOpenFile(chromInfoArray, sizeof(chromInfoArray[0]), chromCount, chromBlockSize, bbiChromInfoKey, maxChromNameSize, bbiChromInfoVal, sizeof(chromInfoArray[0].id) + sizeof(chromInfoArray[0].size), f); freeMem(chromInfoArray); } void bbiWriteFloat(FILE *f, float val) /* Write out floating point val to file. Mostly to convert from double... */ { writeOne(f, val); } struct hash *bbiChromSizesFromFile(char *fileName) /* Read two column file into hash keyed by chrom. */ { struct hash *hash = hashNew(0); struct lineFile *lf = lineFileOpen(fileName, TRUE); char *row[2]; while (lineFileRow(lf, row)) hashAddInt(hash, row[0], sqlUnsigned(row[1])); lineFileClose(&lf); return hash; } void bbiChromInfoKey(const void *va, char *keyBuf) /* Get key field out of bbiChromInfo. */ { const struct bbiChromInfo *a = ((struct bbiChromInfo *)va); strcpy(keyBuf, a->name); } void *bbiChromInfoVal(const void *va) /* Get val field out of bbiChromInfo. */ { const struct bbiChromInfo *a = ((struct bbiChromInfo *)va); return (void*)(&a->id); } void bbiChromUsageFree(struct bbiChromUsage **pUsage) /* free a single bbiChromUsage structure */ { struct bbiChromUsage *usage = *pUsage; if (usage != NULL) { freeMem(usage->name); freez(pUsage); } } void bbiChromUsageFreeList(struct bbiChromUsage **pList) /* free a list of bbiChromUsage structures */ { struct bbiChromUsage *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; bbiChromUsageFree(&el); } *pList = NULL; } struct bbiChromUsage *bbiChromUsageFromBedFile(struct lineFile *lf, struct hash *chromSizesHash, int *retMinDiff, double *retAveSize, bits64 *retBedCount) /* Go through bed file and collect chromosomes and statistics. */ { char *row[3]; struct hash *uniqHash = hashNew(0); struct bbiChromUsage *usage = NULL, *usageList = NULL; int lastStart = -1; bits32 id = 0; bits64 totalBases = 0, bedCount = 0; int minDiff = BIGNUM; lineFileRemoveInitialCustomTrackLines(lf); for (;;) { int rowSize = lineFileChopNext(lf, row, ArraySize(row)); if (rowSize == 0) break; lineFileExpectWords(lf, 3, rowSize); char *chrom = row[0]; int start = lineFileNeedNum(lf, row, 1); int end = lineFileNeedNum(lf, row, 2); if (start >= end) { if (start == end) errAbort("line %d of %s: start and end coordinates the same\n" "They need to be at least one apart" , lf->lineIx, lf->fileName); else errAbort("end (%d) before start (%d) line %d of %s", end, start, lf->lineIx, lf->fileName); } ++bedCount; totalBases += (end - start); if (usage == NULL || differentString(usage->name, chrom)) { if (hashLookup(uniqHash, chrom)) { errAbort("%s is not sorted at line %d. Please use \"sort -k1,1 -k2,2n\" or bedSort and try again.", lf->fileName, lf->lineIx); } hashAdd(uniqHash, chrom, NULL); struct hashEl *chromHashEl = hashLookup(chromSizesHash, chrom); if (chromHashEl == NULL) errAbort("%s is not found in chromosome sizes file", chrom); int chromSize = ptToInt(chromHashEl->val); AllocVar(usage); usage->name = cloneString(chrom); usage->id = id++; usage->size = chromSize; slAddHead(&usageList, usage); lastStart = -1; } if (end > usage->size) errAbort("End coordinate %d bigger than %s size of %d line %d of %s", end, usage->name, usage->size, lf->lineIx, lf->fileName); usage->itemCount += 1; if (lastStart >= 0) { int diff = start - lastStart; if (diff < minDiff) { if (diff < 0) errAbort("%s is not sorted at line %d. Please use \"sort -k1,1 -k2,2n\" or bedSort and try again.", lf->fileName, lf->lineIx); minDiff = diff; } } lastStart = start; } slReverse(&usageList); *retMinDiff = minDiff; *retAveSize = (double)totalBases/bedCount; *retBedCount = bedCount; freeHash(&uniqHash); return usageList; } int bbiCountSectionsNeeded(struct bbiChromUsage *usageList, int itemsPerSlot) /* Count up number of sections needed for data. */ { struct bbiChromUsage *usage; int count = 0; for (usage = usageList; usage != NULL; usage = usage->next) { int countOne = (usage->itemCount + itemsPerSlot - 1)/itemsPerSlot; count += countOne; verbose(2, "%s %d, %d blocks of %d\n", usage->name, usage->itemCount, countOne, itemsPerSlot); } return count; } void bbiAddToSummary(bits32 chromId, bits32 chromSize, bits32 start, bits32 end, bits32 validCount, double minVal, double maxVal, double sumData, double sumSquares, int reduction, struct bbiSummary **pOutList) /* Add data range to summary - putting it onto top of list if possible, otherwise * expanding list. */ { struct bbiSummary *sum = *pOutList; if (end > chromSize) // Avoid pathological clipping situation on bad input end = chromSize; while (start < end) { /* See if need to allocate a new summary. */ if (sum == NULL || sum->chromId != chromId || sum->end <= start) { struct bbiSummary *newSum; AllocVar(newSum); newSum->chromId = chromId; if (sum == NULL || sum->chromId != chromId || sum->end + reduction <= start) newSum->start = start; else newSum->start = sum->end; newSum->end = newSum->start + reduction; if (newSum->end > chromSize) newSum->end = chromSize; newSum->minVal = minVal; newSum->maxVal = maxVal; sum = newSum; slAddHead(pOutList, sum); } /* Figure out amount of overlap between current summary and item */ int overlap = rangeIntersection(start, end, sum->start, sum->end); if (overlap <= 0) { warn("%u %u doesn't intersect %u %u, chromId %u chromSize %u", start, end, sum->start, sum->end, chromId, chromSize); internalErr(); } int itemSize = end - start; double overlapFactor = (double)overlap/itemSize; /* Fold overlapping bits into output. */ sum->validCount += overlapFactor * validCount; if (sum->minVal > minVal) sum->minVal = minVal; if (sum->maxVal < maxVal) sum->maxVal = maxVal; sum->sumData += overlapFactor * sumData; sum->sumSquares += overlapFactor * sumSquares; /* Advance over overlapping bits. */ start += overlap; } } void bbiAddRangeToSummary(bits32 chromId, bits32 chromSize, bits32 start, bits32 end, double val, int reduction, struct bbiSummary **pOutList) /* Add chromosome range to summary - putting it onto top of list if possible, otherwise * expanding list. */ { int size = end-start; double sum = size*val; double sumSquares = sum*val; bbiAddToSummary(chromId, chromSize, start, end, size, val, val, sum, sumSquares, reduction, pOutList); } struct bbiSummary *bbiReduceSummaryList(struct bbiSummary *inList, struct bbiChromInfo *chromInfoArray, int reduction) /* Reduce summary list to another summary list. */ { struct bbiSummary *outList = NULL; struct bbiSummary *sum; for (sum = inList; sum != NULL; sum = sum->next) bbiAddToSummary(sum->chromId, chromInfoArray[sum->chromId].size, sum->start, sum->end, sum->validCount, sum->minVal, sum->maxVal, sum->sumData, sum->sumSquares, reduction, &outList); slReverse(&outList); return outList; } bits64 bbiTotalSummarySize(struct bbiSummary *list) /* Return size on disk of all summaries. */ { struct bbiSummary *el; bits64 total = 0; for (el = list; el != NULL; el = el->next) total += sizeof(struct bbiSummaryOnDisk); return total; } static bits64 bbiSummaryFetchOffset(const void *va, void *context) /* Fetch bbiSummary file offset for r-tree */ { const struct bbiSummary *a = *((struct bbiSummary **)va); return a->fileOffset; } static struct cirTreeRange bbiSummaryFetchKey(const void *va, void *context) /* Fetch bbiSummary key for r-tree */ { struct cirTreeRange res; const struct bbiSummary *a = *((struct bbiSummary **)va); res.chromIx = a->chromId; res.start = a->start; res.end = a->end; return res; } static bits64 bbiWriteSummaryAndIndexComp(struct bbiSummary *summaryList, int blockSize, int itemsPerSlot, FILE *f) /* Write out summary and index to summary uncompressed, returning start position of * summary index. */ { bits32 i, count = slCount(summaryList); struct bbiSummary **summaryArray; AllocArray(summaryArray, count); writeOne(f, count); struct bbiSummary *summary = summaryList; /* Figure out max size of uncompressed and compressed blocks. */ bits32 itemSize = sizeof(summary->chromId) + sizeof(summary->start) + sizeof(summary->end) + sizeof(summary->validCount) + 4*sizeof(float); int uncBufSize = itemSize * itemsPerSlot; char uncBuf[uncBufSize]; int compBufSize = zCompBufSize(uncBufSize); char compBuf[compBufSize]; /* Loop through compressing and writing one slot at a time. */ bits32 itemsLeft = count; int sumIx = 0; while (itemsLeft > 0) { bits32 itemsInSlot = itemsLeft; if (itemsInSlot > itemsPerSlot) itemsInSlot = itemsPerSlot; char *writePt = uncBuf; bits64 filePos = ftell(f); for (i=0; ichromId); memWriteOne(&writePt, summary->start); memWriteOne(&writePt, summary->end); memWriteOne(&writePt, summary->validCount); memWriteFloat(&writePt, summary->minVal); memWriteFloat(&writePt, summary->maxVal); memWriteFloat(&writePt, summary->sumData); memWriteFloat(&writePt, summary->sumSquares); summary->fileOffset = filePos; summary = summary->next; if (summary == NULL) break; } bits32 uncSize = writePt - uncBuf; int compSize = zCompress(uncBuf, uncSize, compBuf, compBufSize); mustWrite(f, compBuf, compSize); itemsLeft -= itemsInSlot; } bits64 indexOffset = ftell(f); cirTreeFileBulkIndexToOpenFile(summaryArray, sizeof(summaryArray[0]), count, blockSize, itemsPerSlot, NULL, bbiSummaryFetchKey, bbiSummaryFetchOffset, indexOffset, f); freez(&summaryArray); return indexOffset; } static bits64 bbiWriteSummaryAndIndexUnc(struct bbiSummary *summaryList, int blockSize, int itemsPerSlot, FILE *f) /* Write out summary and index to summary compressed, returning start position of * summary index. */ { bits32 i, count = slCount(summaryList); struct bbiSummary **summaryArray; AllocArray(summaryArray, count); writeOne(f, count); struct bbiSummary *summary; for (summary = summaryList, i=0; summary != NULL; summary = summary->next, ++i) { summaryArray[i] = summary; summary->fileOffset = ftell(f); writeOne(f, summary->chromId); writeOne(f, summary->start); writeOne(f, summary->end); writeOne(f, summary->validCount); bbiWriteFloat(f, summary->minVal); bbiWriteFloat(f, summary->maxVal); bbiWriteFloat(f, summary->sumData); bbiWriteFloat(f, summary->sumSquares); } bits64 indexOffset = ftell(f); cirTreeFileBulkIndexToOpenFile(summaryArray, sizeof(summaryArray[0]), count, blockSize, itemsPerSlot, NULL, bbiSummaryFetchKey, bbiSummaryFetchOffset, indexOffset, f); freez(&summaryArray); return indexOffset; } bits64 bbiWriteSummaryAndIndex(struct bbiSummary *summaryList, int blockSize, int itemsPerSlot, boolean doCompress, FILE *f) /* Write out summary and index to summary, returning start position of * summary index. */ { if (doCompress) return bbiWriteSummaryAndIndexComp(summaryList, blockSize, itemsPerSlot, f); else return bbiWriteSummaryAndIndexUnc(summaryList, blockSize, itemsPerSlot, f); } struct cirTreeRange bbiBoundsArrayFetchKey(const void *va, void *context) /* Fetch bbiBoundsArray key for r-tree */ { const struct bbiBoundsArray *a = ((struct bbiBoundsArray *)va); return a->range; } bits64 bbiBoundsArrayFetchOffset(const void *va, void *context) /* Fetch bbiBoundsArray file offset for r-tree */ { const struct bbiBoundsArray *a = ((struct bbiBoundsArray *)va); return a->offset; } struct bbiSumOutStream *bbiSumOutStreamOpen(int allocCount, FILE *f, boolean doCompress) /* Allocate new bbiSumOutStream. */ { struct bbiSumOutStream *stream; AllocVar(stream); AllocArray(stream->array, allocCount); stream->allocCount = allocCount; stream->f = f; stream->doCompress = doCompress; return stream; } void bbiSumOutStreamFlush(struct bbiSumOutStream *stream) /* Flush out any pending input. */ { if (stream->elCount != 0) { int uncSize = stream->elCount * sizeof(stream->array[0]); if (stream->doCompress) { int compBufSize = zCompBufSize(uncSize); char compBuf[compBufSize]; int compSize = zCompress(stream->array, uncSize, compBuf, compBufSize); mustWrite(stream->f, compBuf, compSize); } else { mustWrite(stream->f, stream->array, uncSize); } stream->elCount = 0; } } void bbiSumOutStreamClose(struct bbiSumOutStream **pStream) /* Free up bbiSumOutStream */ { struct bbiSumOutStream *stream = *pStream; if (stream != NULL) { bbiSumOutStreamFlush(stream); freeMem(stream->array); freez(pStream); } } void bbiSumOutStreamWrite(struct bbiSumOutStream *stream, struct bbiSummary *sum) /* Write out next one to stream. */ { int elCount = stream->elCount; struct bbiSummaryOnDisk *a = &stream->array[elCount]; a->chromId = sum->chromId; a->start = sum->start; a->end = sum->end; a->validCount = sum->validCount; a->minVal = sum->minVal; a->maxVal = sum->maxVal; a->sumData = sum->sumData; a->sumSquares = sum->sumSquares; elCount += 1; stream->elCount = elCount; if (elCount >= stream->allocCount) bbiSumOutStreamFlush(stream); } void bbiOutputOneSummaryFurtherReduce(struct bbiSummary *sum, struct bbiSummary **pTwiceReducedList, int doubleReductionSize, struct bbiBoundsArray **pBoundsPt, struct bbiBoundsArray *boundsEnd, bits32 chromSize, struct lm *lm, struct bbiSumOutStream *stream) /* Write out sum to file, keeping track of minimal info on it in *pBoundsPt, and also adding * it to second level summary. */ { /* Get place to store file offset etc and make sure we have not gone off end. */ struct bbiBoundsArray *bounds = *pBoundsPt; assert(bounds < boundsEnd); *pBoundsPt += 1; /* Fill in bounds info. */ bounds->offset = ftell(stream->f); bounds->range.chromIx = sum->chromId; bounds->range.start = sum->start; bounds->range.end = sum->end; /* Write out summary info. */ bbiSumOutStreamWrite(stream, sum); /* Fold summary info into pTwiceReducedList. */ struct bbiSummary *twiceReduced = *pTwiceReducedList; if (twiceReduced == NULL || twiceReduced->chromId != sum->chromId || twiceReduced->start + doubleReductionSize < sum->end) { lmAllocVar(lm, twiceReduced); *twiceReduced = *sum; slAddHead(pTwiceReducedList, twiceReduced); } else { twiceReduced->end = sum->end; twiceReduced->validCount += sum->validCount; if (sum->minVal < twiceReduced->minVal) twiceReduced->minVal = sum->minVal; if (sum->maxVal > twiceReduced->maxVal) twiceReduced->maxVal = sum->maxVal; twiceReduced->sumData += sum->sumData; twiceReduced->sumSquares += sum->sumSquares; } } struct bbiSummary *bbiSummarySimpleReduce(struct bbiSummary *list, int reduction, struct lm *lm) /* Do a simple reduction - where among other things the reduction level is an integral * multiple of the previous reduction level, and the list is sorted. Allocate result out of lm. */ { struct bbiSummary *newList = NULL, *sum, *newSum = NULL; for (sum = list; sum != NULL; sum = sum->next) { if (newSum == NULL || newSum->chromId != sum->chromId || sum->end > newSum->start + reduction) { lmAllocVar(lm, newSum); *newSum = *sum; slAddHead(&newList, newSum); } else { assert(newSum->end < sum->end); // check sorted input assumption newSum->end = sum->end; newSum->validCount += sum->validCount; if (newSum->minVal > sum->minVal) newSum->minVal = sum->minVal; if (newSum->maxVal < sum->maxVal) newSum->maxVal = sum->maxVal; newSum->sumData += sum->sumData; newSum->sumSquares += sum->sumSquares; } } slReverse(&newList); return newList; } rtracklayer/src/ucsc/bigBed.h0000644000126300012640000000572712227135242017544 0ustar00biocbuildphs_compbio/* bigBed - interface to binary file with bed-style values (that is a bunch of * possibly overlapping regions. * * This shares a lot with the bigWig module. */ #ifndef BIGBED_H #define BIGBED_H #ifndef BBIFILE #include "bbiFile.h" #endif struct bigBedInterval /* A partially parsed out bed record plus some extra fields. */ { struct bigBedInterval *next; /* Next in list. */ bits32 start, end; /* Range inside chromosome - half open zero based. */ char *rest; /* Rest of line. May be NULL*/ }; struct ppBed /* A partially parsed out bed record plus some extra fields. */ { struct ppBed *next; /* Next in list. */ char *chrom; /* Chromosome name (not allocated here) */ bits32 start, end; /* Range inside chromosome - half open zero based. */ char *rest; /* The rest of the bed. */ bits64 fileOffset; /* File offset. */ bits32 chromId; /* Chromosome ID. */ }; struct bbiFile *bigBedFileOpen(char *fileName); /* Open up big bed file. Free this up with bbiFileClose. */ #define bigBedFileClose(a) bbiFileClose(a) struct bigBedInterval *bigBedIntervalQuery(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, int maxItems, struct lm *lm); /* Get data for interval. Return list allocated out of lm. Set maxItems to maximum * number of items to return, or to 0 for all items. */ int bigBedIntervalToRow(struct bigBedInterval *interval, char *chrom, char *startBuf, char *endBuf, char **row, int rowSize); /* Convert bigBedInterval into an array of chars equivalent to what you'd get by * parsing the bed file. The startBuf and endBuf are used to hold the ascii representation of * start and end. Note that the interval->rest string will have zeroes inserted as a side effect. * Returns number of fields in row. */ boolean bigBedSummaryArray(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, enum bbiSummaryType summaryType, int summarySize, double *summaryValues); /* Fill in summaryValues with data from indicated chromosome range in bigBed file. * Be sure to initialize summaryValues to a default value, which will not be touched * for regions without data in file. (Generally you want the default value to either * be 0.0 or nan("") depending on the application.) Returns FALSE if no data * at that position. */ boolean bigBedSummaryArrayExtended(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, int summarySize, struct bbiSummaryElement *summary); /* Get extended summary information for summarySize evenely spaced elements into * the summary array. */ bits64 bigBedItemCount(struct bbiFile *bbi); /* Return total items in file. */ char *bigBedAutoSqlText(struct bbiFile *bbi); /* Get autoSql text if any associated with file. Do a freeMem of this when done. */ struct asObject *bigBedAs(struct bbiFile *bbi); /* Get autoSql object definition if any associated with file. */ boolean bigBedFileCheckSigs(char *fileName); /* check file signatures at beginning and end of file */ #endif /* BIGBED_H */ rtracklayer/src/ucsc/bigWig.h0000644000126300012640000001140612227135242017567 0ustar00biocbuildphs_compbio/* bigWig - interface to binary file with wiggle-style values (that is a bunch of * small non-overlapping regions each associated with a floating point value. * * There are several ways to use this module. To create a new bigWig file use the * bigWigCreate function, which takes as input an ascii file in fixedStep, variableStep * or bedGraph format. * * To get a section of of a bigWig for display on a browser, use the bigWigSummaryArray * function, which will fill in an array of doubles with on value for each pixel that * you want to display. * * To read all the data out of a bigWig get the chromosome info with bbiChromList * and then fetch all of it for each chromosome using bigWigIntervalQuery. * * See also the module bbiFile that has a description of they structure of * a bigWig file, and lower level routines used to implement this interface. */ #ifndef BIGWIG_H #define BIGWIG_H #ifndef BBIFILE #include "bbiFile.h" #endif #ifndef BITS_H #include "bits.h" #endif void bigWigFileCreate( char *inName, /* Input file in ascii wiggle format. */ char *chromSizes, /* Two column tab-separated file: . */ int blockSize, /* Number of items to bundle in r-tree. 1024 is good. */ int itemsPerSlot, /* Number of items in lowest level of tree. 512 is good. */ boolean clipDontDie, /* If TRUE then clip items off end of chrom rather than dying. */ boolean compress, /* If TRUE then compress data. */ char *outName); /* Convert ascii format wig file (in fixedStep, variableStep or bedGraph format) * to binary big wig format. */ struct bbiFile *bigWigFileOpen(char *fileName); /* Open up big wig file. Free this up with bbiFileClose */ #define bigWigFileClose(a) bbiFileClose(a) struct bbiInterval *bigWigIntervalQuery(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, struct lm *lm); /* Get data for interval. Return list allocated out of lm. */ int bigWigIntervalDump(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, int maxCount, FILE *out); /* Print out info on bigWig parts that intersect chrom:start-end. Set maxCount to 0 if you * don't care how many are printed. Returns number printed. */ boolean bigWigSummaryArray(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, enum bbiSummaryType summaryType, int summarySize, double *summaryValues); /* Fill in summaryValues with data from indicated chromosome range in bigWig file. * Be sure to initialize summaryValues to a default value, which will not be touched * for regions without data in file. (Generally you want the default value to either * be 0.0 or nan(0) depending on the application.) Returns FALSE if no data * at that position. */ boolean bigWigSummaryArrayExtended(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, int summarySize, struct bbiSummaryElement *summary); /* Get extended summary information for summarySize evenely spaced elements into * the summary array. */ double bigWigSingleSummary(struct bbiFile *bwf, char *chrom, int start, int end, enum bbiSummaryType summaryType, double defaultVal); /* Return the summarized single value for a range. */ boolean isBigWig(char *fileName); /* Peak at a file to see if it's bigWig */ boolean bigWigFileCheckSigs(char *fileName); /* check file signatures at beginning and end of file */ /* bigWigValsOnChrom - a little system for optimizing bigWig use when doing a pass over the * whole chromosome. How it is used typically is: * struct bigWigValsOnChrom *chromVals = bigWigValsOnChromNew(); * for (chrom = chromList; chrom != NULL; chrom = chrom->next) * { * if (bigWigValsOnChromFetchData(chromVals, chrom->name, bigWig)) * // do stuff using the valBuf, or covBuf fields which have * // the big wig data unpacked into them. Can use chromSize and chrom too * } * bigWigValsOnChromFree(&chromVals); */ struct bigWigValsOnChrom /* Object for bulk access a chromosome at a time. This is faster than * doing bigWigInterval queries when you have ~3000 or more queries. */ { struct bigWigValsOnChrom *next; char *chrom; /* Current chromosome. */ long chromSize; /* Size of current chromosome. */ long bufSize; /* Size of allocated buffer */ double *valBuf; /* A value for each base on chrom. Zero where no data. */ Bits *covBuf; /* A bit for each base with data. */ }; struct bigWigValsOnChrom *bigWigValsOnChromNew(); /* Allocate new empty bigWigValsOnChromStructure. */ void bigWigValsOnChromFree(struct bigWigValsOnChrom **pChromVals); /* Free up bigWigValsOnChrom */ boolean bigWigValsOnChromFetchData(struct bigWigValsOnChrom *chromVals, char *chrom, struct bbiFile *bigWig); /* Fetch data for chromosome from bigWig. Returns FALSE if not data on that chrom. */ #endif /* BIGWIG_H */ rtracklayer/src/ucsc/bits.c0000644000126300012640000001333012227135242017311 0ustar00biocbuildphs_compbio/* bits - handle operations on arrays of bits. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "bits.h" static char const rcsid[] = "$Id: bits.c,v 1.20 2008/03/25 16:32:31 angie Exp $"; static Bits oneBit[8] = { 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1}; static Bits leftMask[8] = {0xFF, 0x7F, 0x3F, 0x1F, 0xF, 0x7, 0x3, 0x1,}; static Bits rightMask[8] = {0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF,}; int bitsInByte[256]; static boolean inittedBitsInByte = FALSE; void bitsInByteInit() /* Initialize bitsInByte array. */ { int i; if (!inittedBitsInByte) { inittedBitsInByte = TRUE; for (i=0; i<256; ++i) { int count = 0; if (i&1) count = 1; if (i&2) ++count; if (i&4) ++count; if (i&8) ++count; if (i&0x10) ++count; if (i&0x20) ++count; if (i&0x40) ++count; if (i&0x80) ++count; bitsInByte[i] = count; } } } Bits *bitAlloc(int bitCount) /* Allocate bits. */ { int byteCount = ((bitCount+7)>>3); return needLargeZeroedMem(byteCount); } Bits *bitRealloc(Bits *b, int bitCount, int newBitCount) /* Resize a bit array. If b is null, allocate a new array */ { int byteCount = ((bitCount+7)>>3); int newByteCount = ((newBitCount+7)>>3); return needLargeZeroedMemResize(b, byteCount, newByteCount); } Bits *bitClone(Bits* orig, int bitCount) /* Clone bits. */ { int byteCount = ((bitCount+7)>>3); Bits* bits = needLargeZeroedMem(byteCount); memcpy(bits, orig, byteCount); return bits; } void bitFree(Bits **pB) /* Free bits. */ { freez(pB); } void bitSetOne(Bits *b, int bitIx) /* Set a single bit. */ { b[bitIx>>3] |= oneBit[bitIx&7]; } void bitClearOne(Bits *b, int bitIx) /* Clear a single bit. */ { b[bitIx>>3] &= ~oneBit[bitIx&7]; } void bitSetRange(Bits *b, int startIx, int bitCount) /* Set a range of bits. */ { if (bitCount <= 0) return; int endIx = (startIx + bitCount - 1); int startByte = (startIx>>3); int endByte = (endIx>>3); int startBits = (startIx&7); int endBits = (endIx&7); int i; if (startByte == endByte) { b[startByte] |= (leftMask[startBits] & rightMask[endBits]); return; } b[startByte] |= leftMask[startBits]; for (i = startByte+1; i>3] & oneBit[bitIx&7]) != 0; } int bitCountRange(Bits *b, int startIx, int bitCount) /* Count number of bits set in range. */ { if (bitCount <= 0) return 0; int endIx = (startIx + bitCount - 1); int startByte = (startIx>>3); int endByte = (endIx>>3); int startBits = (startIx&7); int endBits = (endIx&7); int i; int count = 0; if (!inittedBitsInByte) bitsInByteInit(); if (startByte == endByte) return bitsInByte[b[startByte] & leftMask[startBits] & rightMask[endBits]]; count = bitsInByte[b[startByte] & leftMask[startBits]]; for (i = startByte+1; i>3); int iByte; /* scan initial byte */ while (((iBit & 7) != 0) && (iBit < bitCount)) { if (bitReadOne(b, iBit) == val) return iBit; iBit++; } /* scan byte at a time, if not already in last byte */ iByte = (iBit >> 3); if (iByte < endByte) { while ((iByte < endByte) && (b[iByte] == notByteVal)) iByte++; iBit = iByte << 3; } /* scan last byte */ while (iBit < bitCount) { if (bitReadOne(b, iBit) == val) return iBit; iBit++; } return bitCount; /* not found */ } int bitFindSet(Bits *b, int startIx, int bitCount) /* Find the index of the the next set bit. */ { return bitFind(b, startIx, TRUE, bitCount); } int bitFindClear(Bits *b, int startIx, int bitCount) /* Find the index of the the next clear bit. */ { return bitFind(b, startIx, FALSE, bitCount); } void bitClear(Bits *b, int bitCount) /* Clear many bits (possibly up to 7 beyond bitCount). */ { int byteCount = ((bitCount+7)>>3); zeroBytes(b, byteCount); } void bitClearRange(Bits *b, int startIx, int bitCount) /* Clear a range of bits. */ { if (bitCount <= 0) return; int endIx = (startIx + bitCount - 1); int startByte = (startIx>>3); int endByte = (endIx>>3); int startBits = (startIx&7); int endBits = (endIx&7); int i; if (startByte == endByte) { b[startByte] &= ~(leftMask[startBits] & rightMask[endBits]); return; } b[startByte] &= ~leftMask[startBits]; for (i = startByte+1; i>3); while (--byteCount >= 0) { *a = (*a & *b++); a++; } } void bitOr(Bits *a, Bits *b, int bitCount) /* Or two bitmaps. Put result in a. */ { int byteCount = ((bitCount+7)>>3); while (--byteCount >= 0) { *a = (*a | *b++); a++; } } void bitXor(Bits *a, Bits *b, int bitCount) { int byteCount = ((bitCount+7)>>3); while (--byteCount >= 0) { *a = (*a ^ *b++); a++; } } void bitNot(Bits *a, int bitCount) /* Flip all bits in a. */ { int byteCount = ((bitCount+7)>>3); while (--byteCount >= 0) { *a = ~*a; a++; } } void bitPrint(Bits *a, int startIx, int bitCount, FILE* out) /* Print part or all of bit map as a string of 0s and 1s. Mostly useful for * debugging */ { int i; for (i = startIx; i < bitCount; i++) { if (bitReadOne(a, i)) fputc('1', out); else fputc('0', out); } fputc('\n', out); } rtracklayer/src/ucsc/bits.h0000644000126300012640000000375412227135242017327 0ustar00biocbuildphs_compbio/* bits - handle operations on arrays of bits. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef BITS_H #define BITS_H typedef unsigned char Bits; #define bitToByteSize(bitSize) ((bitSize+7)/8) /* Convert number of bits to number of bytes needed to store bits. */ Bits *bitAlloc(int bitCount); /* Allocate bits. */ Bits *bitRealloc(Bits *b, int bitCount, int newBitCount); /* Resize a bit array. If b is null, allocate a new array */ Bits *bitClone(Bits* orig, int bitCount); /* Clone bits. */ void bitFree(Bits **pB); /* Free bits. */ void bitSetOne(Bits *b, int bitIx); /* Set a single bit. */ void bitClearOne(Bits *b, int bitIx); /* Clear a single bit. */ void bitSetRange(Bits *b, int startIx, int bitCount); /* Set a range of bits. */ boolean bitReadOne(Bits *b, int bitIx); /* Read a single bit. */ int bitCountRange(Bits *b, int startIx, int bitCount); /* Count number of bits set in range. */ int bitFindSet(Bits *b, int startIx, int bitCount); /* Find the index of the the next set bit. */ int bitFindClear(Bits *b, int startIx, int bitCount); /* Find the index of the the next clear bit. */ void bitClear(Bits *b, int bitCount); /* Clear many bits (possibly up to 7 beyond bitCount). */ void bitClearRange(Bits *b, int startIx, int bitCount); /* Clear a range of bits. */ void bitAnd(Bits *a, Bits *b, int bitCount); /* And two bitmaps. Put result in a. */ void bitOr(Bits *a, Bits *b, int bitCount); /* Or two bitmaps. Put result in a. */ void bitXor(Bits *a, Bits *b, int bitCount); /* Xor two bitmaps. Put result in a. */ void bitNot(Bits *a, int bitCount); /* Flip all bits in a. */ void bitPrint(Bits *a, int startIx, int bitCount, FILE* out); /* Print part or all of bit map as a string of 0s and 1s. Mostly useful for * debugging */ extern int bitsInByte[256]; /* Lookup table for how many bits are set in a byte. */ void bitsInByteInit(); /* Initialize bitsInByte array. */ #endif /* BITS_H */ rtracklayer/src/ucsc/bwgCreate.c0000644000126300012640000010426112227135242020257 0ustar00biocbuildphs_compbio/* bwgCreate - create big wig files. Implements write side of bwgInternal.h module. * See the comment in bwgInternal.h for a description of the file format. */ #include "common.h" #include "linefile.h" #include "hash.h" #include "localmem.h" #include "errabort.h" #include "sqlNum.h" #include "sig.h" #include "zlibFace.h" #include "bPlusTree.h" #include "cirTree.h" #include "bbiFile.h" #include "bwgInternal.h" #include "bigWig.h" static char const rcsid[] = "$Id: bwgCreate.c,v 1.27 2010/06/10 20:13:29 braney Exp $"; static int bwgBedGraphItemCmp(const void *va, const void *vb) /* Compare to sort based on query start. */ { const struct bwgBedGraphItem *a = *((struct bwgBedGraphItem **)va); const struct bwgBedGraphItem *b = *((struct bwgBedGraphItem **)vb); int dif = (int)a->start - (int)b->start; if (dif == 0) dif = (int)a->end - (int)b->end; return dif; } static int bwgVariableStepItemCmp(const void *va, const void *vb) /* Compare to sort based on query start. */ { const struct bwgVariableStepItem *a = *((struct bwgVariableStepItem **)va); const struct bwgVariableStepItem *b = *((struct bwgVariableStepItem **)vb); return (int)a->start - (int)b->start; } void bwgDumpSummary(struct bbiSummary *sum, FILE *f) /* Write out summary info to file. */ { fprintf(f, "summary %d:%d-%d min=%f, max=%f, sum=%f, sumSquares=%f, validCount=%d, mean=%f\n", sum->chromId, sum->start, sum->end, sum->minVal, sum->maxVal, sum->sumData, sum->sumSquares, sum->validCount, sum->sumData/sum->validCount); } static int bwgSectionWrite(struct bwgSection *section, boolean doCompress, FILE *f) /* Write out section to file, filling in section->fileOffset. */ { UBYTE type = section->type; UBYTE reserved8 = 0; int itemSize; switch (section->type) { case bwgTypeBedGraph: itemSize = 12; break; case bwgTypeVariableStep: itemSize = 8; break; case bwgTypeFixedStep: itemSize = 4; break; default: itemSize = 0; // Suppress compiler warning internalErr(); break; } int fixedSize = sizeof(section->chromId) + sizeof(section->start) + sizeof(section->end) + sizeof(section->itemStep) + sizeof(section->itemSpan) + sizeof(type) + sizeof(reserved8) + sizeof(section->itemCount); int bufSize = section->itemCount * itemSize + fixedSize; char buf[bufSize]; char *bufPt = buf; section->fileOffset = ftell(f); memWriteOne(&bufPt, section->chromId); memWriteOne(&bufPt, section->start); memWriteOne(&bufPt, section->end); memWriteOne(&bufPt, section->itemStep); memWriteOne(&bufPt, section->itemSpan); memWriteOne(&bufPt, type); memWriteOne(&bufPt, reserved8); memWriteOne(&bufPt, section->itemCount); int i; switch (section->type) { case bwgTypeBedGraph: { struct bwgBedGraphItem *item = section->items.bedGraphList; for (item = section->items.bedGraphList; item != NULL; item = item->next) { memWriteOne(&bufPt, item->start); memWriteOne(&bufPt, item->end); memWriteOne(&bufPt, item->val); } break; } case bwgTypeVariableStep: { struct bwgVariableStepPacked *items = section->items.variableStepPacked; for (i=0; iitemCount; ++i) { memWriteOne(&bufPt, items->start); memWriteOne(&bufPt, items->val); items += 1; } break; } case bwgTypeFixedStep: { struct bwgFixedStepPacked *items = section->items.fixedStepPacked; for (i=0; iitemCount; ++i) { memWriteOne(&bufPt, items->val); items += 1; } break; } default: internalErr(); break; } assert(bufSize == (bufPt - buf) ); if (doCompress) { size_t maxCompSize = zCompBufSize(bufSize); char compBuf[maxCompSize]; int compSize = zCompress(buf, bufSize, compBuf, maxCompSize); mustWrite(f, compBuf, compSize); } else mustWrite(f, buf, bufSize); return bufSize; } int bwgSectionCmp(const void *va, const void *vb) /* Compare to sort based on chrom,start,end. */ { const struct bwgSection *a = *((struct bwgSection **)va); const struct bwgSection *b = *((struct bwgSection **)vb); int dif = strcmp(a->chrom, b->chrom); if (dif == 0) { dif = (int)a->start - (int)b->start; if (dif == 0) dif = (int)a->end - (int)b->end; } return dif; } static struct cirTreeRange bwgSectionFetchKey(const void *va, void *context) /* Fetch bwgSection key for r-tree */ { struct cirTreeRange res; const struct bwgSection *a = *((struct bwgSection **)va); res.chromIx = a->chromId; res.start = a->start; res.end = a->end; return res; } static bits64 bwgSectionFetchOffset(const void *va, void *context) /* Fetch bwgSection file offset for r-tree */ { const struct bwgSection *a = *((struct bwgSection **)va); return a->fileOffset; } static boolean stepTypeLine(char *line) /* Return TRUE if it's a variableStep or fixedStep line. */ { return (startsWithWord("variableStep", line) || startsWithWord("fixedStep", line)); } static boolean steppedSectionEnd(char *line, int maxWords) /* Return TRUE if line indicates the start of another section. */ { int wordCount = chopByWhite(line, NULL, 5); if (wordCount > maxWords) return TRUE; return stepTypeLine(line); } static void parseFixedStepSection(struct lineFile *lf, boolean clipDontDie, struct lm *lm, int itemsPerSlot, char *chrom, bits32 chromSize, bits32 span, bits32 sectionStart, bits32 step, struct bwgSection **pSectionList) /* Read the single column data in section until get to end. */ { struct lm *lmLocal = lmInit(0); /* Stream through section until get to end of file or next section, * adding values from single column to list. */ char *words[1]; char *line; struct bwgFixedStepItem *item, *itemList = NULL; int originalSectionSize = 0; bits32 sectionEnd = sectionStart; while (lineFileNextReal(lf, &line)) { if (steppedSectionEnd(line, 1)) { lineFileReuse(lf); break; } chopLine(line, words); lmAllocVar(lmLocal, item); item->val = lineFileNeedDouble(lf, words, 0); if (sectionEnd + span > chromSize) { warn("line %d of %s: chromosome %s has %u bases, but item ends at %u", lf->lineIx, lf->fileName, chrom, chromSize, sectionEnd + span); if (!clipDontDie) noWarnAbort(); } else { slAddHead(&itemList, item); ++originalSectionSize; } sectionEnd += step; } slReverse(&itemList); /* Break up into sections of no more than items-per-slot size, and convert to packed format. */ int sizeLeft = originalSectionSize; for (item = itemList; item != NULL; ) { /* Figure out size of this section */ int sectionSize = sizeLeft; if (sectionSize > itemsPerSlot) sectionSize = itemsPerSlot; sizeLeft -= sectionSize; /* Allocate and fill in section. */ struct bwgSection *section; lmAllocVar(lm, section); section->chrom = chrom; section->start = sectionStart; sectionStart += sectionSize * step; section->end = sectionStart - step + span; section->type = bwgTypeFixedStep; section->itemStep = step; section->itemSpan = span; section->itemCount = sectionSize; /* Allocate array for data, and copy from list to array representation */ struct bwgFixedStepPacked *packed; /* An array */ section->items.fixedStepPacked = lmAllocArray(lm, packed, sectionSize); int i; for (i=0; ival = item->val; item = item->next; ++packed; } /* Add section to list. */ slAddHead(pSectionList, section); } lmCleanup(&lmLocal); } static void parseVariableStepSection(struct lineFile *lf, boolean clipDontDie, struct lm *lm, int itemsPerSlot, char *chrom, int chromSize, bits32 span, struct bwgSection **pSectionList) /* Read the single column data in section until get to end. */ { struct lm *lmLocal = lmInit(0); /* Stream through section until get to end of file or next section, * adding values from single column to list. */ char *words[2]; char *line; struct bwgVariableStepItem *item, *nextItem, *itemList = NULL; int originalSectionSize = 0; while (lineFileNextReal(lf, &line)) { if (steppedSectionEnd(line, 2)) { lineFileReuse(lf); break; } chopLine(line, words); lmAllocVar(lmLocal, item); int start = lineFileNeedNum(lf, words, 0); if (start <= 0) { errAbort("line %d of %s: zero or negative chromosome coordinate not allowed", lf->lineIx, lf->fileName); } item->start = start - 1; item->val = lineFileNeedDouble(lf, words, 1); if (item->start + span > chromSize) { warn("line %d of %s: chromosome %s has %u bases, but item ends at %u", lf->lineIx, lf->fileName, chrom, chromSize, item->start + span); if (!clipDontDie) noWarnAbort(); } else { slAddHead(&itemList, item); ++originalSectionSize; } } slSort(&itemList, bwgVariableStepItemCmp); /* Make sure no overlap between items. */ if (itemList != NULL) { item = itemList; for (nextItem = item->next; nextItem != NULL; nextItem = nextItem->next) { if (item->start + span > nextItem->start) errAbort("Overlap on %s between items starting at %d and %d.\n" "Please remove overlaps and try again", chrom, item->start, nextItem->start); item = nextItem; } } /* Break up into sections of no more than items-per-slot size. */ int sizeLeft = originalSectionSize; for (item = itemList; item != NULL; ) { /* Figure out size of this section */ int sectionSize = sizeLeft; if (sectionSize > itemsPerSlot) sectionSize = itemsPerSlot; sizeLeft -= sectionSize; /* Convert from list to array representation. */ struct bwgVariableStepPacked *packed, *p; p = lmAllocArray(lm, packed, sectionSize); int i; for (i=0; istart = item->start; p->val = item->val; item = item->next; ++p; } /* Fill in section and add it to list. */ struct bwgSection *section; lmAllocVar(lm, section); section->chrom = chrom; section->start = packed[0].start; section->end = packed[sectionSize-1].start + span; section->type = bwgTypeVariableStep; section->items.variableStepPacked = packed; section->itemSpan = span; section->itemCount = sectionSize; slAddHead(pSectionList, section); } lmCleanup(&lmLocal); } static unsigned parseUnsignedVal(struct lineFile *lf, char *var, char *val) /* Return val as an integer, printing error message if it's not. */ { char c = val[0]; if (!isdigit(c)) errAbort("Expecting numerical value for %s, got %s, line %d of %s", var, val, lf->lineIx, lf->fileName); return sqlUnsigned(val); } static void parseSteppedSection(struct lineFile *lf, boolean clipDontDie, struct hash *chromSizeHash, char *initialLine, struct lm *lm, int itemsPerSlot, struct bwgSection **pSectionList) /* Parse out a variableStep or fixedStep section and add it to list, breaking it up as need be. */ { /* Parse out first word of initial line and make sure it is something we recognize. */ char *typeWord = nextWord(&initialLine); enum bwgSectionType type = bwgTypeFixedStep; if (sameString(typeWord, "variableStep")) type = bwgTypeVariableStep; else if (sameString(typeWord, "fixedStep")) type = bwgTypeFixedStep; else errAbort("Unknown type %s\n", typeWord); /* Set up defaults for values we hope to parse out of rest of line. */ int span = 0; bits32 step = 0; bits32 start = 0; char *chrom = NULL; /* Parse out var=val pairs. */ char *varEqVal; while ((varEqVal = nextWord(&initialLine)) != NULL) { char *wordPairs[2]; int wc = chopByChar(varEqVal, '=', wordPairs, 2); if (wc != 2) errAbort("strange var=val pair line %d of %s", lf->lineIx, lf->fileName); char *var = wordPairs[0]; char *val = wordPairs[1]; if (sameString(var, "chrom")) chrom = cloneString(val); else if (sameString(var, "span")) span = parseUnsignedVal(lf, var, val); else if (sameString(var, "step")) step = parseUnsignedVal(lf, var, val); else if (sameString(var, "start")) { start = parseUnsignedVal(lf, var, val); } else errAbort("Unknown setting %s=%s line %d of %s", var, val, lf->lineIx, lf->fileName); } /* Check that we have all that are required and no more, and call type-specific routine to parse * rest of section. */ if (chrom == NULL) errAbort("Missing chrom= setting line %d of %s\n", lf->lineIx, lf->fileName); bits32 chromSize = (chromSizeHash ? hashIntVal(chromSizeHash, chrom) : BIGNUM); if (start > chromSize) { warn("line %d of %s: chromosome %s has %u bases, but item starts at %u", lf->lineIx, lf->fileName, chrom, chromSize, start); if (!clipDontDie) noWarnAbort(); } if (type == bwgTypeFixedStep) { if (start == 0) errAbort("Missing start= setting line %d of %s\n", lf->lineIx, lf->fileName); if (step == 0) errAbort("Missing step= setting line %d of %s\n", lf->lineIx, lf->fileName); if (span == 0) span = step; parseFixedStepSection(lf, clipDontDie, lm, itemsPerSlot, chrom, chromSize, span, start-1, step, pSectionList); } else { if (start != 0) errAbort("Extra start= setting line %d of %s\n", lf->lineIx, lf->fileName); if (step != 0) errAbort("Extra step= setting line %d of %s\n", lf->lineIx, lf->fileName); if (span == 0) span = 1; parseVariableStepSection(lf, clipDontDie, lm, itemsPerSlot, chrom, chromSize, span, pSectionList); } } struct bedGraphChrom /* A chromosome in bed graph format. */ { struct bedGraphChrom *next; /* Next in list. */ char *name; /* Chromosome name - not allocated here. */ bits32 size; /* Chromosome size. */ struct bwgBedGraphItem *itemList; /* List of items. */ }; static int bedGraphChromCmpName(const void *va, const void *vb) /* Compare to sort based on query start. */ { const struct bedGraphChrom *a = *((struct bedGraphChrom **)va); const struct bedGraphChrom *b = *((struct bedGraphChrom **)vb); return strcmp(a->name, b->name); } static void parseBedGraphSection(struct lineFile *lf, boolean clipDontDie, struct hash *chromSizeHash, struct lm *lm, int itemsPerSlot, struct bwgSection **pSectionList) /* Parse out bedGraph section until we get to something that is not in bedGraph format. */ { /* Set up hash and list to store chromosomes. */ struct hash *chromHash = hashNew(0); struct bedGraphChrom *chrom, *chromList = NULL; /* Collect lines in items on appropriate chromosomes. */ struct bwgBedGraphItem *item; char *line; while (lineFileNextReal(lf, &line)) { /* Check for end of section. */ if (stepTypeLine(line)) { lineFileReuse(lf); break; } /* Parse out our line and make sure it has exactly 4 columns. */ char *words[5]; int wordCount = chopLine(line, words); lineFileExpectWords(lf, 4, wordCount); /* Get chromosome. */ char *chromName = words[0]; chrom = hashFindVal(chromHash, chromName); if (chrom == NULL) { lmAllocVar(chromHash->lm, chrom); hashAddSaveName(chromHash, chromName, chrom, &chrom->name); chrom->size = (chromSizeHash ? hashIntVal(chromSizeHash, chromName) : BIGNUM); slAddHead(&chromList, chrom); } /* Convert to item and add to chromosome list. */ lmAllocVar(lm, item); item->start = lineFileNeedNum(lf, words, 1); item->end = lineFileNeedNum(lf, words, 2); item->val = lineFileNeedDouble(lf, words, 3); /* Do sanity checking on coordinates. */ if (item->start > item->end) errAbort("bedGraph error: start (%u) after end line (%u) %d of %s.", item->start, item->end, lf->lineIx, lf->fileName); if (item->end > chrom->size) { warn("bedGraph error line %d of %s: chromosome %s has size %u but item ends at %u", lf->lineIx, lf->fileName, chrom->name, chrom->size, item->end); if (!clipDontDie) noWarnAbort(); } else { slAddHead(&chrom->itemList, item); } } slSort(&chromList, bedGraphChromCmpName); /* Loop through each chromosome and output the item list, broken into sections * for that chrom. */ for (chrom = chromList; chrom != NULL; chrom = chrom->next) { slSort(&chrom->itemList, bwgBedGraphItemCmp); /* Check to make sure no overlap between items. */ struct bwgBedGraphItem *item = chrom->itemList, *nextItem; for (nextItem = item->next; nextItem != NULL; nextItem = nextItem->next) { if (item->end > nextItem->start) errAbort("Overlap between %s %d %d and %s %d %d.\nPlease remove overlaps and try again", chrom->name, item->start, item->end, chrom->name, nextItem->start, nextItem->end); item = nextItem; } /* Break up into sections of no more than items-per-slot size. */ struct bwgBedGraphItem *startItem, *endItem, *nextStartItem = chrom->itemList; for (startItem = chrom->itemList; startItem != NULL; startItem = nextStartItem) { /* Find end item of this section, and start item for next section. * Terminate list at end item. */ int sectionSize = 0; int i; endItem = startItem; for (i=0; inext; ++sectionSize; } endItem->next = NULL; /* Fill in section and add it to section list. */ struct bwgSection *section; lmAllocVar(lm, section); section->chrom = cloneString(chrom->name); section->start = startItem->start; section->end = endItem->end; section->type = bwgTypeBedGraph; section->items.bedGraphList = startItem; section->itemCount = sectionSize; slAddHead(pSectionList, section); } } /* Free up hash, no longer needed. Free's chromList as a side effect since chromList is in * hash's memory. */ hashFree(&chromHash); chromList = NULL; } void bwgMakeChromInfo(struct bwgSection *sectionList, struct hash *chromSizeHash, int *retChromCount, struct bbiChromInfo **retChromArray, int *retMaxChromNameSize) /* Fill in chromId field in sectionList. Return array of chromosome name/ids. * The chromSizeHash is keyed by name, and has int values. */ { /* Build up list of unique chromosome names. */ struct bwgSection *section; char *chromName = ""; int chromCount = 0; int maxChromNameSize = 0; struct slRef *uniq, *uniqList = NULL; for (section = sectionList; section != NULL; section = section->next) { if (!sameString(section->chrom, chromName)) { chromName = section->chrom; refAdd(&uniqList, chromName); ++chromCount; int len = strlen(chromName); if (len > maxChromNameSize) maxChromNameSize = len; } section->chromId = chromCount-1; } slReverse(&uniqList); /* Allocate and fill in results array. */ struct bbiChromInfo *chromArray; AllocArray(chromArray, chromCount); int i; for (i = 0, uniq = uniqList; i < chromCount; ++i, uniq = uniq->next) { chromArray[i].name = uniq->val; chromArray[i].id = i; chromArray[i].size = hashIntVal(chromSizeHash, uniq->val); } /* Clean up, set return values and go home. */ slFreeList(&uniqList); *retChromCount = chromCount; *retChromArray = chromArray; *retMaxChromNameSize = maxChromNameSize; } int bwgAverageResolution(struct bwgSection *sectionList) /* Return the average resolution seen in sectionList. */ { if (sectionList == NULL) return 1; bits64 totalRes = 0; bits32 sectionCount = 0; struct bwgSection *section; int i; for (section = sectionList; section != NULL; section = section->next) { int sectionRes = 0; switch (section->type) { case bwgTypeBedGraph: { struct bwgBedGraphItem *item; sectionRes = BIGNUM; for (item = section->items.bedGraphList; item != NULL; item = item->next) { int size = item->end - item->start; if (sectionRes > size) sectionRes = size; } break; } case bwgTypeVariableStep: { struct bwgVariableStepPacked *items = section->items.variableStepPacked, *prev; bits32 smallestGap = BIGNUM; for (i=1; iitemCount; ++i) { prev = items; items += 1; bits32 gap = items->start - prev->start; if (smallestGap > gap) smallestGap = gap; } if (smallestGap != BIGNUM) sectionRes = smallestGap; else sectionRes = section->itemSpan; break; } case bwgTypeFixedStep: { sectionRes = section->itemStep; break; } default: internalErr(); break; } totalRes += sectionRes; ++sectionCount; } return (totalRes + sectionCount/2)/sectionCount; } #define bwgSectionHeaderSize 24 /* Size of section header in file. */ static int bwgItemSize(enum bwgSectionType type) /* Return size of an item inside a particular section. */ { switch (type) { case bwgTypeBedGraph: return 2*sizeof(bits32) + sizeof(float); break; case bwgTypeVariableStep: return sizeof(bits32) + sizeof(float); break; case bwgTypeFixedStep: return sizeof(float); break; default: internalErr(); return 0; } } static int bwgSectionSize(struct bwgSection *section) /* Return size (on disk) of section. */ { return bwgSectionHeaderSize + bwgItemSize(section->type) * section->itemCount; } static bits64 bwgTotalSectionSize(struct bwgSection *sectionList) /* Return total size of all sections. */ { bits64 total = 0; struct bwgSection *section; for (section = sectionList; section != NULL; section = section->next) total += bwgSectionSize(section); return total; } static void bwgReduceBedGraph(struct bwgSection *section, bits32 chromSize, int reduction, struct bbiSummary **pOutList) /*Reduce a bedGraph section onto outList. */ { struct bwgBedGraphItem *item = section->items.bedGraphList; for (item = section->items.bedGraphList; item != NULL; item = item->next) { bbiAddRangeToSummary(section->chromId, chromSize, item->start, item->end, item->val, reduction, pOutList); } } static void bwgReduceVariableStep(struct bwgSection *section, bits32 chromSize, int reduction, struct bbiSummary **pOutList) /*Reduce a variableStep section onto outList. */ { struct bwgVariableStepPacked *items = section->items.variableStepPacked; int i; for (i=0; iitemCount; ++i) { bbiAddRangeToSummary(section->chromId, chromSize, items->start, items->start + section->itemSpan, items->val, reduction, pOutList); items += 1; } } static void bwgReduceFixedStep(struct bwgSection *section, bits32 chromSize, int reduction, struct bbiSummary **pOutList) /*Reduce a fixedStep section onto outList. */ { struct bwgFixedStepPacked *items = section->items.fixedStepPacked; int start = section->start; int i; for (i=0; iitemCount; ++i) { bbiAddRangeToSummary(section->chromId, chromSize, start, start + section->itemSpan, items->val, reduction, pOutList); start += section->itemStep; items += 1; } } struct bbiSummary *bwgReduceSectionList(struct bwgSection *sectionList, struct bbiChromInfo *chromInfoArray, int reduction) /* Return summary of section list reduced by given amount. */ { struct bbiSummary *outList = NULL; struct bwgSection *section = NULL; /* Loop through input section list reducing into outList. */ for (section = sectionList; section != NULL; section = section->next) { bits32 chromSize = chromInfoArray[section->chromId].size; switch (section->type) { case bwgTypeBedGraph: bwgReduceBedGraph(section, chromSize, reduction, &outList); break; case bwgTypeVariableStep: bwgReduceVariableStep(section, chromSize, reduction, &outList); break; case bwgTypeFixedStep: bwgReduceFixedStep(section, chromSize, reduction, &outList); break; default: internalErr(); return 0; } } slReverse(&outList); return outList; } void bwgCreate(struct bwgSection *sectionList, struct hash *chromSizeHash, int blockSize, int itemsPerSlot, boolean doCompress, char *fileName) /* Create a bigWig file out of a sorted sectionList. */ { bits64 sectionCount = slCount(sectionList); FILE *f = mustOpen(fileName, "wb"); bits32 sig = bigWigSig; bits16 version = bbiCurrentVersion; bits16 summaryCount = 0; bits16 reserved16 = 0; bits32 reserved32 = 0; bits64 reserved64 = 0; bits64 dataOffset = 0, dataOffsetPos; bits64 indexOffset = 0, indexOffsetPos; bits64 chromTreeOffset = 0, chromTreeOffsetPos; bits64 totalSummaryOffset = 0, totalSummaryOffsetPos; bits32 uncompressBufSize = 0; bits64 uncompressBufSizePos; struct bbiSummary *reduceSummaries[10]; bits32 reductionAmounts[10]; bits64 reductionDataOffsetPos[10]; bits64 reductionDataOffsets[10]; bits64 reductionIndexOffsets[10]; int i; /* Figure out chromosome ID's. */ struct bbiChromInfo *chromInfoArray; int chromCount, maxChromNameSize; bwgMakeChromInfo(sectionList, chromSizeHash, &chromCount, &chromInfoArray, &maxChromNameSize); /* Figure out initial summary level - starting with a summary 10 times the amount * of the smallest item. See if summarized data is smaller than half input data, if * not bump up reduction by a factor of 2 until it is, or until further summarying * yeilds no size reduction. */ int minRes = bwgAverageResolution(sectionList); int initialReduction = minRes*10; bits64 fullSize = bwgTotalSectionSize(sectionList); bits64 maxReducedSize = fullSize/2; struct bbiSummary *firstSummaryList = NULL, *summaryList = NULL; bits64 lastSummarySize = 0, summarySize; for (;;) { summaryList = bwgReduceSectionList(sectionList, chromInfoArray, initialReduction); bits64 summarySize = bbiTotalSummarySize(summaryList); if (doCompress) { summarySize *= 2; // Compensate for summary not compressing as well as primary data } if (summarySize >= maxReducedSize && summarySize != lastSummarySize) { /* Need to do more reduction. First scale reduction by amount that it missed * being small enough last time, with an extra 10% for good measure. Then * just to keep from spinning through loop two many times, make sure this is * at least 2x the previous reduction. */ int nextReduction = 1.1 * initialReduction * summarySize / maxReducedSize; if (nextReduction < initialReduction*2) nextReduction = initialReduction*2; initialReduction = nextReduction; bbiSummaryFreeList(&summaryList); lastSummarySize = summarySize; } else break; } summaryCount = 1; reduceSummaries[0] = firstSummaryList = summaryList; reductionAmounts[0] = initialReduction; /* Now calculate up to 10 levels of further summary. */ bits64 reduction = initialReduction; for (i=0; i 1000000000) break; summaryList = bbiReduceSummaryList(reduceSummaries[summaryCount-1], chromInfoArray, reduction); summarySize = bbiTotalSummarySize(summaryList); if (summarySize != lastSummarySize) { reduceSummaries[summaryCount] = summaryList; reductionAmounts[summaryCount] = reduction; ++summaryCount; } int summaryItemCount = slCount(summaryList); if (summaryItemCount <= chromCount) break; } /* Write fixed header. */ writeOne(f, sig); writeOne(f, version); writeOne(f, summaryCount); chromTreeOffsetPos = ftell(f); writeOne(f, chromTreeOffset); dataOffsetPos = ftell(f); writeOne(f, dataOffset); indexOffsetPos = ftell(f); writeOne(f, indexOffset); writeOne(f, reserved16); /* fieldCount */ writeOne(f, reserved16); /* definedFieldCount */ writeOne(f, reserved64); /* autoSqlOffset. */ totalSummaryOffsetPos = ftell(f); writeOne(f, totalSummaryOffset); uncompressBufSizePos = ftell(f); writeOne(f, uncompressBufSize); for (i=0; i<2; ++i) writeOne(f, reserved32); /* Write summary headers */ for (i=0; inext) { bits32 uncSizeOne = bwgSectionWrite(section, doCompress, f); if (uncSizeOne > uncompressBufSize) uncompressBufSize = uncSizeOne; } /* Write out index - creating a temporary array rather than list representation of * sections in the process. */ indexOffset = ftell(f); struct bwgSection **sectionArray; AllocArray(sectionArray, sectionCount); for (section = sectionList, i=0; section != NULL; section = section->next, ++i) sectionArray[i] = section; cirTreeFileBulkIndexToOpenFile(sectionArray, sizeof(sectionArray[0]), sectionCount, blockSize, 1, NULL, bwgSectionFetchKey, bwgSectionFetchOffset, indexOffset, f); freez(§ionArray); /* Write out summary sections. */ verbose(2, "bwgCreate writing %d summaries\n", summaryCount); for (i=0; ivalidCount; totalSum.minVal = sum->minVal; totalSum.maxVal = sum->maxVal; totalSum.sumData = sum->sumData; totalSum.sumSquares = sum->sumSquares; for (sum = sum->next; sum != NULL; sum = sum->next) { totalSum.validCount += sum->validCount; if (sum->minVal < totalSum.minVal) totalSum.minVal = sum->minVal; if (sum->maxVal > totalSum.maxVal) totalSum.maxVal = sum->maxVal; totalSum.sumData += sum->sumData; totalSum.sumSquares += sum->sumSquares; } /* Write real summary */ fseek(f, totalSummaryOffset, SEEK_SET); bbiSummaryElementWrite(f, &totalSum); } else totalSummaryOffset = 0; /* Edge case, no summary. */ /* Go back and fill in offsets properly in header. */ fseek(f, dataOffsetPos, SEEK_SET); writeOne(f, dataOffset); fseek(f, indexOffsetPos, SEEK_SET); writeOne(f, indexOffset); fseek(f, chromTreeOffsetPos, SEEK_SET); writeOne(f, chromTreeOffset); fseek(f, totalSummaryOffsetPos, SEEK_SET); writeOne(f, totalSummaryOffset); if (doCompress) { int maxZoomUncompSize = itemsPerSlot * sizeof(struct bbiSummaryOnDisk); if (maxZoomUncompSize > uncompressBufSize) uncompressBufSize = maxZoomUncompSize; fseek(f, uncompressBufSizePos, SEEK_SET); writeOne(f, uncompressBufSize); } /* Also fill in offsets in zoom headers. */ for (i=0; ilineIx, lf->fileName, line); /* Parse out a bed graph line just to check numerical format. */ char *chrom = words[0]; int start = lineFileNeedNum(lf, words, 1); int end = lineFileNeedNum(lf, words, 2); double val = lineFileNeedDouble(lf, words, 3); verbose(2, "bedGraph %s:%d-%d@%g\n", chrom, start, end, val); /* Push back line and call bed parser. */ lineFileReuse(lf); parseBedGraphSection(lf, clipDontDie, chromSizeHash, lm, maxSectionSize, §ionList); } } slSort(§ionList, bwgSectionCmp); /* Check for overlap at section level. */ struct bwgSection *section, *nextSection; for (section = sectionList; section != NULL; section = nextSection) { nextSection = section->next; if (nextSection != NULL) { if (sameString(section->chrom, nextSection->chrom)) { if (section->end > nextSection->start) { errAbort("There's more than one value for %s base %d (in coordinates that start with 1).\n", section->chrom, nextSection->start+1); } } } } return sectionList; } void bigWigFileCreate( char *inName, /* Input file in ascii wiggle format. */ char *chromSizes, /* Two column tab-separated file: . */ int blockSize, /* Number of items to bundle in r-tree. 1024 is good. */ int itemsPerSlot, /* Number of items in lowest level of tree. 512 is good. */ boolean clipDontDie, /* If TRUE then clip items off end of chrom rather than dying. */ boolean compress, /* If TRUE then compress data. */ char *outName) /* Convert ascii format wig file (in fixedStep, variableStep or bedGraph format) * to binary big wig format. */ { /* This code needs to agree with code in two other places currently - bigBedFileCreate, * and bbiFileOpen. I'm thinking of refactoring to share at least between * bigBedFileCreate and bigWigFileCreate. It'd be great so it could be structured * so that it could send the input in one chromosome at a time, and send in the zoom * stuff only after all the chromosomes are done. This'd potentially reduce the memory * footprint by a factor of 2 or 4. Still, for now it works. -JK */ struct hash *chromSizeHash = bbiChromSizesFromFile(chromSizes); struct lm *lm = lmInit(0); struct bwgSection *sectionList = bwgParseWig(inName, clipDontDie, chromSizeHash, itemsPerSlot, lm); if (sectionList == NULL) errAbort("%s is empty of data", inName); bwgCreate(sectionList, chromSizeHash, blockSize, itemsPerSlot, compress, outName); lmCleanup(&lm); } rtracklayer/src/ucsc/bwgInternal.h0000644000126300012640000000772512227135242020644 0ustar00biocbuildphs_compbio/* bwgInternal - stuff to create and use bigWig files. Generally you'll want to use the * simpler interfaces in the bigWig module instead. This file is good reading though * if you want to extend the bigWig interface, or work with bigWig files directly * without going through the Kent library. */ #ifndef BIGWIGFILE_H #define BIGWIGFILE_H enum bwgSectionType /* Code to indicate section type. */ { bwgTypeBedGraph=1, bwgTypeVariableStep=2, bwgTypeFixedStep=3, }; struct bwgBedGraphItem /* An bedGraph-type item in a bwgSection. */ { struct bwgBedGraphItem *next; /* Next in list. */ bits32 start,end; /* Range of chromosome covered. */ float val; /* Value. */ }; struct bwgVariableStepItem /* An variableStep type item in a bwgSection. */ { struct bwgVariableStepItem *next; /* Next in list. */ bits32 start; /* Start position in chromosome. */ float val; /* Value. */ }; struct bwgVariableStepPacked /* An variableStep type item in a bwgSection. */ { bits32 start; /* Start position in chromosome. */ float val; /* Value. */ }; struct bwgFixedStepItem /* An fixedStep type item in a bwgSection. */ { struct bwgFixedStepItem *next; /* Next in list. */ float val; /* Value. */ }; struct bwgFixedStepPacked /* An fixedStep type item in a bwgSection. */ { float val; /* Value. */ }; union bwgItem /* Union of item pointers for all possible section types. */ { struct bwgBedGraphItem *bedGraphList; /* A linked list */ struct bwgFixedStepPacked *fixedStepPacked; /* An array */ struct bwgVariableStepPacked *variableStepPacked; /* An array */ /* No packed format for bedGraph... */ }; struct bwgSection /* A section of a bigWig file - all on same chrom. This is a somewhat fat data * structure used by the bigWig creation code. See also bwgSection for the * structure returned by the bigWig reading code. */ { struct bwgSection *next; /* Next in list. */ char *chrom; /* Chromosome name. */ bits32 start,end; /* Range of chromosome covered. */ enum bwgSectionType type; union bwgItem items; /* List/array of items in this section. */ bits32 itemStep; /* Step within item if applicable. */ bits32 itemSpan; /* Item span if applicable. */ bits16 itemCount; /* Number of items in section. */ bits32 chromId; /* Unique small integer value for chromosome. */ bits64 fileOffset; /* Offset of section in file. */ }; struct bwgSectionHead /* A header from a bigWig file section - similar to above bug what is on disk. */ { bits32 chromId; /* Chromosome short identifier. */ bits32 start,end; /* Range covered. */ bits32 itemStep; /* For some section types, the # of bases between items. */ bits32 itemSpan; /* For some section types, the # of bases in each item. */ UBYTE type; /* Type byte. */ UBYTE reserved; /* Always zero for now. */ bits16 itemCount; /* Number of items in block. */ }; void bwgSectionHeadFromMem(char **pPt, struct bwgSectionHead *head, boolean isSwapped); /* Read section header. */ int bwgSectionCmp(const void *va, const void *vb); /* Compare to sort based on chrom,start,end. */ struct bwgSection *bwgParseWig( char *fileName, /* Name of ascii wig file. */ boolean clipDontDie, /* Skip items outside chromosome rather than aborting. */ struct hash *chromSizeHash, /* If non-NULL items checked to be inside chromosome. */ int maxSectionSize, /* Biggest size of a section. 100 - 100,000 is usual range. */ struct lm *lm); /* Memory pool to allocate from. */ /* Parse out ascii wig file - allocating memory in lm. */ int bwgAverageResolution(struct bwgSection *sectionList); /* Return the average resolution seen in sectionList. */ struct bbiSummary *bwgReduceSectionList(struct bwgSection *sectionList, struct bbiChromInfo *chromInfoArray, int reduction); /* Return summary of section list reduced by given amount. */ #endif /* BIGWIGFILE_H */ rtracklayer/src/ucsc/bwgQuery.c0000644000126300012640000002634712227135242020171 0ustar00biocbuildphs_compbio/* bwgQuery - implements the query side of bigWig. See bwgInternal.h for definition of file * format. */ #include "common.h" #include "linefile.h" #include "hash.h" #include "localmem.h" #include "options.h" #include "sig.h" #include "sqlNum.h" #include "obscure.h" #include "dystring.h" #include "bPlusTree.h" #include "cirTree.h" #include "rangeTree.h" #include "udc.h" #include "zlibFace.h" #include "bbiFile.h" #include "bwgInternal.h" #include "bigWig.h" #include "bigBed.h" static char const rcsid[] = "$Id: bwgQuery.c,v 1.24 2010/06/03 18:08:37 kent Exp $"; struct bbiFile *bigWigFileOpen(char *fileName) /* Open up big wig file. */ { return bbiFileOpen(fileName, bigWigSig, "big wig"); } boolean bigWigFileCheckSigs(char *fileName) /* check file signatures at beginning and end of file */ { return bbiFileCheckSigs(fileName, bigWigSig, "big wig"); } #ifdef OLD static void bwgSectionHeadRead(struct bbiFile *bwf, struct bwgSectionHead *head) /* Read section header. */ { struct udcFile *udc = bwf->udc; boolean isSwapped = bwf->isSwapped; head->chromId = udcReadBits32(udc, isSwapped); head->start = udcReadBits32(udc, isSwapped); head->end = udcReadBits32(udc, isSwapped); head->itemStep = udcReadBits32(udc, isSwapped); head->itemSpan = udcReadBits32(udc, isSwapped); head->type = udcGetChar(udc); head->reserved = udcGetChar(udc); head->itemCount = udcReadBits16(udc, isSwapped); } #endif /* OLD */ void bwgSectionHeadFromMem(char **pPt, struct bwgSectionHead *head, boolean isSwapped) /* Read section header. */ { char *pt = *pPt; head->chromId = memReadBits32(&pt, isSwapped); head->start = memReadBits32(&pt, isSwapped); head->end = memReadBits32(&pt, isSwapped); head->itemStep = memReadBits32(&pt, isSwapped); head->itemSpan = memReadBits32(&pt, isSwapped); head->type = *pt++; head->reserved = *pt++; head->itemCount = memReadBits16(&pt, isSwapped); *pPt = pt; } static int bigWigBlockDumpIntersectingRange(boolean isSwapped, char *blockPt, char *blockEnd, char *chrom, bits32 rangeStart, bits32 rangeEnd, int maxCount, FILE *out) /* Print out info on parts of block that intersect start-end, block starting at current position. */ { struct bwgSectionHead head; bwgSectionHeadFromMem(&blockPt, &head, isSwapped); bits16 i; float val; int outCount = 0; switch (head.type) { case bwgTypeBedGraph: { fprintf(out, "#bedGraph section %s:%u-%u\n", chrom, head.start, head.end); for (i=0; i 0) { fprintf(out, "%s\t%u\t%u\t%g\n", chrom, start, end, val); ++outCount; if (maxCount != 0 && outCount >= maxCount) break; } } break; } case bwgTypeVariableStep: { fprintf(out, "variableStep chrom=%s span=%u\n", chrom, head.itemSpan); for (i=0; i 0) { fprintf(out, "%u\t%g\n", start+1, val); ++outCount; if (maxCount != 0 && outCount >= maxCount) break; } } break; } case bwgTypeFixedStep: { boolean gotStart = FALSE; bits32 start = head.start; for (i=0; i 0) { if (!gotStart) { fprintf(out, "fixedStep chrom=%s start=%u step=%u span=%u\n", chrom, start+1, head.itemStep, head.itemSpan); gotStart = TRUE; } fprintf(out, "%g\n", val); ++outCount; if (maxCount != 0 && outCount >= maxCount) break; } start += head.itemStep; } break; } default: internalErr(); break; } assert(blockPt == blockEnd); return outCount; } struct bbiInterval *bigWigIntervalQuery(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, struct lm *lm) /* Get data for interval. Return list allocated out of lm. */ { if (bwf->typeSig != bigWigSig) errAbort("Trying to do bigWigIntervalQuery on a non big-wig file."); bbiAttachUnzoomedCir(bwf); struct bbiInterval *el, *list = NULL; struct fileOffsetSize *blockList = bbiOverlappingBlocks(bwf, bwf->unzoomedCir, chrom, start, end, NULL); struct fileOffsetSize *block, *beforeGap, *afterGap; struct udcFile *udc = bwf->udc; boolean isSwapped = bwf->isSwapped; float val; int i; /* Set up for uncompression optionally. */ char *uncompressBuf = NULL; if (bwf->uncompressBufSize > 0) uncompressBuf = needLargeMem(bwf->uncompressBufSize); /* This loop is a little complicated because we merge the read requests for efficiency, but we * have to then go back through the data one unmerged block at a time. */ for (block = blockList; block != NULL; ) { /* Find contigious blocks and read them into mergedBuf. */ fileOffsetSizeFindGap(block, &beforeGap, &afterGap); bits64 mergedOffset = block->offset; bits64 mergedSize = beforeGap->offset + beforeGap->size - mergedOffset; udcSeek(udc, mergedOffset); char *mergedBuf = needLargeMem(mergedSize); udcMustRead(udc, mergedBuf, mergedSize); char *blockBuf = mergedBuf; /* Loop through individual blocks within merged section. */ for (;block != afterGap; block = block->next) { /* Uncompress if necessary. */ char *blockPt, *blockEnd; if (uncompressBuf) { blockPt = uncompressBuf; int uncSize = zUncompress(blockBuf, block->size, uncompressBuf, bwf->uncompressBufSize); blockEnd = blockPt + uncSize; } else { blockPt = blockBuf; blockEnd = blockPt + block->size; } /* Deal with insides of block. */ struct bwgSectionHead head; bwgSectionHeadFromMem(&blockPt, &head, isSwapped); switch (head.type) { case bwgTypeBedGraph: { for (i=0; i end) e = end; if (s < e) { lmAllocVar(lm, el); el->start = s; el->end = e; el->val = val; slAddHead(&list, el); } } break; } case bwgTypeVariableStep: { for (i=0; i end) e = end; if (s < e) { lmAllocVar(lm, el); el->start = s; el->end = e; el->val = val; slAddHead(&list, el); } } break; } case bwgTypeFixedStep: { bits32 s = head.start; bits32 e = s + head.itemSpan; for (i=0; i end) clippedE = end; if (clippedS < clippedE) { lmAllocVar(lm, el); el->start = clippedS; el->end = clippedE; el->val = val; slAddHead(&list, el); } s += head.itemStep; e += head.itemStep; } break; } default: internalErr(); break; } assert(blockPt == blockEnd); blockBuf += block->size; } freeMem(mergedBuf); } freeMem(uncompressBuf); slFreeList(&blockList); slReverse(&list); return list; } int bigWigIntervalDump(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, int maxCount, FILE *out) /* Print out info on bigWig parts that intersect chrom:start-end. Set maxCount to 0 if you * don't care how many are printed. Returns number printed. */ { if (bwf->typeSig != bigWigSig) errAbort("Trying to do bigWigIntervalDump on a non big-wig file."); bbiAttachUnzoomedCir(bwf); struct fileOffsetSize *blockList = bbiOverlappingBlocks(bwf, bwf->unzoomedCir, chrom, start, end, NULL); struct fileOffsetSize *block, *beforeGap, *afterGap; struct udcFile *udc = bwf->udc; int printCount = 0; /* Set up for uncompression optionally. */ char *uncompressBuf = NULL; if (bwf->uncompressBufSize > 0) uncompressBuf = needLargeMem(bwf->uncompressBufSize); /* This loop is a little complicated because we merge the read requests for efficiency, but we * have to then go back through the data one unmerged block at a time. */ for (block = blockList; block != NULL; ) { /* Find contigious blocks and read them into mergedBuf. */ fileOffsetSizeFindGap(block, &beforeGap, &afterGap); bits64 mergedOffset = block->offset; bits64 mergedSize = beforeGap->offset + beforeGap->size - mergedOffset; udcSeek(udc, mergedOffset); char *mergedBuf = needLargeMem(mergedSize); udcMustRead(udc, mergedBuf, mergedSize); char *blockBuf = mergedBuf; /* Loop through individual blocks within merged section. */ for (;block != afterGap; block = block->next) { /* Uncompress if necessary. */ char *blockPt, *blockEnd; if (uncompressBuf) { blockPt = uncompressBuf; int uncSize = zUncompress(blockBuf, block->size, uncompressBuf, bwf->uncompressBufSize); blockEnd = blockPt + uncSize; } else { blockPt = blockBuf; blockEnd = blockPt + block->size; } /* Do the actual dump. */ int oneCount = bigWigBlockDumpIntersectingRange(bwf->isSwapped, blockPt, blockEnd, chrom, start, end, maxCount, out); /* Keep track of how many dumped, not exceeding maximum. */ printCount += oneCount; if (maxCount != 0) { if (oneCount >= maxCount) break; maxCount -= oneCount; } blockBuf += block->size; } freeMem(mergedBuf); } freeMem(uncompressBuf); slFreeList(&blockList); return printCount; } boolean bigWigSummaryArray(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, enum bbiSummaryType summaryType, int summarySize, double *summaryValues) /* Fill in summaryValues with data from indicated chromosome range in bigWig file. * Be sure to initialize summaryValues to a default value, which will not be touched * for regions without data in file. (Generally you want the default value to either * be 0.0 or nan("") depending on the application.) Returns FALSE if no data * at that position. */ { boolean ret = bbiSummaryArray(bwf, chrom, start, end, bigWigIntervalQuery, summaryType, summarySize, summaryValues); return ret; } boolean bigWigSummaryArrayExtended(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, int summarySize, struct bbiSummaryElement *summary) /* Get extended summary information for summarySize evenely spaced elements into * the summary array. */ { boolean ret = bbiSummaryArrayExtended(bwf, chrom, start, end, bigWigIntervalQuery, summarySize, summary); return ret; } double bigWigSingleSummary(struct bbiFile *bwf, char *chrom, int start, int end, enum bbiSummaryType summaryType, double defaultVal) /* Return the summarized single value for a range. */ { double arrayOfOne = defaultVal; bigWigSummaryArray(bwf, chrom, start, end, summaryType, 1, &arrayOfOne); return arrayOfOne; } boolean isBigWig(char *fileName) /* Peak at a file to see if it's bigWig */ { FILE *f = mustOpen(fileName, "rb"); bits32 sig; mustReadOne(f, sig); fclose(f); if (sig == bigWigSig) return TRUE; sig = byteSwap32(sig); return sig == bigWigSig; } rtracklayer/src/ucsc/cheapcgi.h0000644000126300012640000004565212227135242020134 0ustar00biocbuildphs_compbio/***************************************************************************** * Copyright (C) 2000 Jim Kent. This source code may be freely used * * for personal, academic, and non-profit purposes. Commercial use * * permitted only by explicit agreement with Jim Kent (jim_kent@pacbell.net) * *****************************************************************************/ /* Cheapcgi.h - turns variables passed from the web form into * something that C understands. */ #ifndef CHEAPCGI_H #define CHEAPCGI_H #ifndef DYSTRING_H #include "dystring.h" #endif #ifndef HASH_H #include "hash.h" #endif #define COLOR_BG_DEFAULT "#FFFEE8" #define COLOR_BG_ALTDEFAULT "#FFF9D2" #define COLOR_BG_DEFAULT_DARKER "#FCECC0" #define COLOR_BG_DEFAULT_DARKEST "#EED5B7" #define COLOR_BG_GHOST "#EEEEEE" #define COLOR_BG_PALE "#F8F8F8" #define COLOR_BG_HEADER_LTBLUE "#D9E4F8" #define COLOR_DARKGREEN "#008800" #define COLOR_LTGREEN "#CCFFCC" #define COLOR_DARKBLUE "#000088" #define COLOR_BLUE_BUTTON "#91B3E6" #define COLOR_DARKGREY "#666666" #define COLOR_LTGREY "#CCCCCC" #define COLOR_YELLOW "#FFFF00" #define COLOR_LTYELLOW "#FFF380" #define COLOR_WHITE "#FFFFFF" #define COLOR_RED "#AA0000" #define COLOR_TRACKLIST_LEVEL1 COLOR_BG_DEFAULT #define COLOR_TRACKLIST_LEVEL2 COLOR_BG_ALTDEFAULT #define COLOR_TRACKLIST_LEVEL3 COLOR_BG_DEFAULT_DARKER #define COLOR_TRACKLIST_LEVEL4 COLOR_BG_DEFAULT_DARKEST void initSigHandlers(boolean dumpStack); /* set handler for various terminal signals for logging purposes. * if dumpStack is TRUE, attempt to dump the stack. */ struct cgiVar /* Info on one cgi variable. */ { struct cgiVar *next; /* Next in list. */ char *name; /* Name - allocated in hash. */ char *val; /* Value - also not allocated here. */ boolean saved; /* True if saved. */ }; struct cgiVar* cgiVarList(); /* return the list of cgiVar's */ char *findCookieData(char *varName); /* Get the string associated with varName from the cookie string. */ void dumpCookieList(); /* Print out the cookie list. */ boolean cgiIsOnWeb(); /* Return TRUE if looks like we're being run as a CGI. */ char *cgiRequestMethod(); /* Return CGI REQUEST_METHOD (such as 'GET/POST/PUT/DELETE/HEAD') */ char *cgiRequestUri(); /* Return CGI REQUEST_URI */ char *cgiRequestContentLength(); /* Return HTTP REQUEST CONTENT_LENGTH if available*/ char *cgiScriptName(); /* Return name of script so libs can do context-sensitive stuff. */ char *cgiServerName(); /* Return name of server, better to use cgiServerNamePort() for actual URL construction */ char *cgiServerPort(); /* Return port number of server */ char *cgiServerNamePort(); /* Return name of server with port if different than 80 */ char *cgiRemoteAddr(); /* Return IP address of client (or "unknown"). */ char *cgiUserAgent(); /* Return remote user agent (HTTP_USER_AGENT) or NULL if remote user agent is not known */ enum browserType /* How to look at a track. */ { btUnknown=0, // Not yet known btOpera=1, // Opera btIE=2, // MS Internet Explorer btFF=3, // Firefox btChrome=4, // Google Chrome btSafari=5, // Safari btOther=6 // Anything else }; enum osType /* How to look at a track. */ { osUnknown=0, // Not yet known osWindows=1, // The evil empire osLinux=2, // Workhorse osMac=3, // ashion or Religion osOther=4 // Anything else }; enum browserType cgiClientBrowser(char **browserQualifier, enum osType *clientOs, char **clientOsQualifier); /* These routines abort the html output if the input isn't * there or is misformatted. */ #define cgiBrowser() cgiClientBrowser(NULL,NULL,NULL) char *cgiString(char *varName); int cgiInt(char *varName); double cgiDouble(char *varName); boolean cgiBoolean(char *varName); /* The cgiBoolean is a little problematic. If the variable * is TRUE it exists, but if it is false it is simply not * defined. cgiBoolean() thus returns FALSE if the CGI * variable doesn't exist or if it is set to FALSE. To * work around this when need be use cgiBooleanDefined(), * which relies on the fact that when we define a boolean * variable we also define a hidden variable. */ boolean cgiBooleanDefined(char *name); /* Return TRUE if boolean variable is defined (by * checking for shadow). */ char *cgiBooleanShadowPrefix(); /* Prefix for shadow variable set with boolean variables. */ void cgiMakeHiddenBoolean(char *name, boolean on); /* Make hidden boolean variable. Also make a shadow hidden variable so we * can distinguish between variable not present and * variable set to false. */ char *cgiMultListShadowPrefix(); /* Prefix for shadow variable set with multi-select inputs. */ int cgiIntExp(char *varName); /* Evaluate an integer expression in varName and * return value. */ char *cgiOptionalString(char *varName); /* Return value of string if it exists in cgi environment, else NULL */ char *cgiUsualString(char *varName, char *usual); /* Return value of string if it exists in cgi environment. * Otherwiser return 'usual' */ struct slName *cgiStringList(char *varName); /* Find list of cgi variables with given name. This * may be empty. Free result with slFreeList(). */ int cgiOptionalInt(char *varName, int defaultVal); /* This returns value of varName if it exists in cgi environment, * otherwise it returns defaultVal. */ double cgiOptionalDouble(char *varName, double defaultVal); /* Returns double value. */ #define cgiUsualInt cgiOptionalInt #define cgiUsualDouble cgiOptionalDouble struct cgiChoice /* Choice table */ { char *name; int value; }; int cgiOneChoice(char *varName, struct cgiChoice *choices, int choiceSize); /* Returns value associated with string variable in choice table. */ boolean cgiVarExists(char *varName); /* Returns TRUE if the variable was passed in. */ void cgiBadVar(char *varName); /* Complain about a variable that's not there. */ void cgiDecode(char *in, char *out, int inLength); /* Decode from cgi pluses-for-spaces format to normal. * Out will be a little shorter than in typically. */ char *cgiEncode(char *inString); /* Return a cgi-encoded version of inString. * Alphanumerics kept as is, space translated to plus, * and all other characters translated to %hexVal. * You can free return value with freeMem(). */ char *cgiEncodeFull(char *inString); /* Return a cgi-encoded version of inString (no + for space!). * Alphanumerics/./_ kept as is and all other characters translated to * %hexVal. */ void cgiMakeButtonWithMsg(char *name, char *value, char *msg); /* Make 'submit' type button. Display msg on mouseover, if present*/ void cgiMakeButtonWithOnClick(char *name, char *value, char *msg, char *onClick); /* Make 'submit' type button, with onclick javascript */ void cgiMakeButton(char *name, char *value); /* Make 'submit' type button. */ void cgiMakeOnClickButton(char *command, char *value); /* Make 'push' type button with client side onClick (java)script. */ void cgiMakeOnClickSubmitButton(char *command, char *name, char *value); /* Make submit button with both variable name and value with client side * onClick (java)script. */ void cgiMakeOptionalButton(char *name, char *value, boolean disabled); /* Make 'submit' type button that can be disabled. */ void cgiMakeRadioButton(char *name, char *value, boolean checked); /* Make radio type button. A group of radio buttons should have the * same name but different values. The default selection should be * sent with checked on. */ void cgiMakeOnClickRadioButton(char *name, char *value, boolean checked, char *command); /* Make radio type button with onClick command. * A group of radio buttons should have the * same name but different values. The default selection should be * sent with checked on. */ void cgiMakeCheckBoxUtil(char *name, boolean checked, char *msg, char *id); /* Make check box - can be called directly, though it was originally meant * as the common code for all lower level checkbox routines. * However, it's util functionality has been taken over by * cgiMakeCheckBoxWithIdAndOptionalHtml() */ void cgiMakeCheckBox(char *name, boolean checked); /* Make check box. */ void cgiMakeCheckBoxWithMsg(char *name, boolean checked, char *msg); /* Make check box, which includes a msg. */ void cgiMakeCheckBoxWithId(char *name, boolean checked, char *id); /* Make check box, which includes an ID. */ void cgiMakeCheckBoxJS(char *name, boolean checked, char *javascript); /* Make check box with javascript */ void cgiMakeCheckBoxIdAndJS(char *name, boolean checked, char *id, char *javascript); /* Make check box with ID and javascript. */ void cgiMakeCheckBoxFourWay(char *name, boolean checked, boolean enabled, char *id, char *classes, char *moreHtml); /* Make check box - with fourWay functionality (checked/unchecked by enabled/disabled * Also makes a shadow hidden variable that supports the 2 boolean states. */ void cgiMakeTextArea(char *varName, char *initialVal, int rowCount, int columnCount); /* Make a text area with area rowCount X columnCount and with text: intialVal. */ void cgiMakeTextAreaDisableable(char *varName, char *initialVal, int rowCount, int columnCount, boolean disabled); /* Make a text area that can be disabled. The rea has rowCount X * columnCount and with text: intialVal */ void cgiMakeTextVar(char *varName, char *initialVal, int charSize); /* Make a text control filled with initial value. If charSize * is zero it's calculated from initialVal size. */ void cgiMakeTextVarWithExtraHtml(char *varName, char *initialVal, int width, char *extra); /* Make a text control filled with initial value. */ void cgiMakeOnKeypressTextVar(char *varName, char *initialVal, int charSize, char *script); /* Make a text control filled with initial value, with a (java)script * to execute every time a key is pressed. If charSize is zero it's * calculated from initialVal size. */ void cgiMakeIntVar(char *varName, int initialVal, int maxDigits); /* Make a text control filled with initial integer value. */ #define NO_VALUE -96669 void cgiMakeIntVarInRange(char *varName, int initialVal, char *title, int width, char *min, char *max); /* Make a integer control filled with initial value. If min and/or max are non-NULL will enforce range Requires utils.js jQuery.js and inputBox class */ void cgiMakeIntVarWithLimits(char *varName, int initialVal, char *title, int width, int min, int max); void cgiMakeIntVarWithMin(char *varName, int initialVal, char *title, int width, int min); void cgiMakeIntVarWithMax(char *varName, int initialVal, char *title, int width, int max); #define cgiMakeIntVarNoLimits(varName,initialVal,title,width) cgiMakeIntVarInRange(varName,initialVal,title,width,NULL,NULL) /* All four of these call cgiMakeIntVarInRange() and therefore require utils.js */ void cgiMakeDoubleVar(char *varName, double initialVal, int maxDigits); /* Make a text control filled with initial floating-point value. */ void cgiMakeDoubleVarInRange(char *varName, double initialVal, char *title, int width, char *min, char *max); /* Make a floating point control filled with initial value. If min and/or max are non-NULL will enforce range Requires utils.js jQuery.js and inputBox class */ void cgiMakeDoubleVarWithLimits(char *varName, double initialVal, char *title, int width, double min, double max); void cgiMakeDoubleVarWithMin(char *varName, double initialVal, char *title, int width, double min); void cgiMakeDoubleVarWithMax(char *varName, double initialVal, char *title, int width, double max); #define cgiMakeDoubleVarNoLimits(varName,initialVal,title,width) cgiMakeDoubleVarInRange(varName,initialVal,title,width,NULL,NULL) /* All four of these call cgiMakeDoubleVarInRange() and therefore require utils.js */ void cgiMakeDropListClass(char *name, char *menu[], int menuSize, char *checked, char *class); /* Make a drop-down list with names and style sheet class. */ void cgiMakeDropList(char *name, char *menu[], int menuSize, char *checked); /* Make a drop-down list with names. * uses style "normalText" */ void cgiMakeDropListClassWithStyleAndJavascript(char *name, char *menu[], int menuSize, char *checked, char *class, char *style,char *javascript); /* Make a drop-down list with names, text class, style and javascript. */ void cgiMakeDropListClassWithStyle(char *name, char *menu[], int menuSize, char *checked, char *class, char *style); /* Make a drop-down list with names, text class and style. */ void cgiMakeDropListWithVals(char *name, char *menu[], char *values[], int menuSize, char *checked); /* Make a drop-down list with names and values. In this case checked * corresponds to a value, not a menu. */ void cgiMakeDropListFull(char *name, char *menu[], char *values[], int menuSize, char *checked, char *extraAttribs); /* Make a drop-down list with names and values. */ void cgiDropDownWithTextValsAndExtra(char *name, char *text[], char *values[], int count, char *selected, char *extra); /* Make a drop-down list with both text and values. */ char *cgiMakeSelectDropList(boolean multiple, char *name, struct slPair *valsAndLabels,char *selected, char *anyAll,char *extraClasses, char *extraHtml); // Returns allocated string of HTML defining a drop-down select (if multiple, REQUIRES ui-dropdownchecklist.js) // In valsAndLabels, val (pair->name) must be filled in but label (pair->val) may be NULL. // selected, if not NULL is a val found in the valsAndLabels (multiple then comma delimited list). If null and anyAll not NULL, that will be selected // anyAll, if not NULL is the string for an initial option. It can contain val and label, delimited by a comma // extraHtml, if not NULL contains id, javascript calls and style. It does NOT contain class definitions #define cgiMakeMultiSelectDropList(name, valsAndLabels, selected, anyAll, extraClasses, extraHtml) cgiMakeSelectDropList(TRUE, (name), (valsAndLabels), (selected), (anyAll), (extraClasses), (extraHtml)) #define cgiMakeSingleSelectDropList(name, valsAndLabels, selected, anyAll, extraClasses, extraHtml) cgiMakeSelectDropList(FALSE,(name), (valsAndLabels), (selected), (anyAll), (extraClasses), (extraHtml)) void cgiMakeMultList(char *name, char *menu[], int menuSize, struct slName *checked, int length); /* Make a list of names which can have multiple selections. * Same as drop-down list except "multiple" is added to select tag */ void cgiMakeCheckboxGroup(char *name, char *menu[], int menuSize, struct slName *checked, int tableColumns); /* Make a table of checkboxes that have the same variable name but different * values (same behavior as a multi-select input). */ void cgiMakeCheckboxGroupWithVals(char *name, char *menu[], char *values[], int menuSize, struct slName *checked, int tableColumns); /* Make a table of checkboxes that have the same variable name but different * values (same behavior as a multi-select input), with nice labels in menu[]. */ void cgiMakeHiddenVarWithExtra(char *varName, char *string, char *extra); /* Store string in hidden input for next time around. */ #define cgiMakeHiddenVar(name,val) cgiMakeHiddenVarWithExtra((name),(val),NULL) /* Store string in hidden input for next time around. */ void cgiContinueHiddenVar(char *varName); /* Write CGI var back to hidden input for next time around. * (if it exists). */ void cgiContinueAllVars(); /* Write back all CGI vars as hidden input for next time around. */ void cgiVarExclude(char *varName); /* If varName exists, remove it. */ void cgiVarExcludeExcept(char **varNames); /* Exclude all variables except for those in NULL * terminated array varNames. varNames may be NULL * in which case nothing is excluded. */ void cgiVarSet(char *varName, char *val); /* Set a cgi variable to a particular value. */ struct dyString *cgiUrlString(); /* Get URL-formatted that expresses current CGI variable state. */ boolean cgiSpoof(int *pArgc, char *argv[]); /* Use the command line to set up things as if we were a CGI program. * User types in command line (assuming your program called cgiScript) * like: * cgiScript nonCgiArg1 var1=value1 var2=value2 var3=value3 nonCgiArg2 * or like * cgiScript nonCgiArg1 var1=value1&var2=value2&var3=value3 nonCgiArg2 * (The non-cgi arguments can occur anywhere. The cgi arguments (all containing * the character '=') are erased from argc/argv. Normally you call this * cgiSpoof(&argc, argv); */ boolean cgiFromCommandLine(int *pArgc, char *argv[], boolean preferWeb); /* Use the command line to set up things as if we were a CGI program. * If preferWeb is TRUE will choose real CGI variables over command * line ones. */ void useTempFile(); /* tell cheapcgi to use temp files */ boolean cgiFromFile(char *fileName); /* Set up a cgi environment using parameters stored in a file. * Takes file with arguments in the form: * argument1=someVal * # This is a comment * argument2=someOtherVal * ... * and puts them into the cgi environment so that the usual * cgiGetVar() commands can be used. Useful when a program * has a lot of possible parameters. */ boolean cgiParseInput(char *input, struct hash **retHash, struct cgiVar **retList); /* Parse cgi-style input into a hash table and list. This will alter * the input data. The hash table will contain references back * into input, so please don't free input until you're done with * the hash. Prints message and returns FALSE if there's an error.*/ void cgiSimpleTableStart(); /* start HTML table -- no customization. Leaves room * for a fancier implementation */ void cgiTableEnd(); /* end HTML table */ void cgiMakeSubmitButton(); /* Make 'submit' type button. */ void cgiMakeResetButton(); /* Make 'reset' type button. */ void cgiMakeClearButton(char *form, char *field); /* Make button to clear a text field. */ void cgiMakeFileEntry(char *name); /* Make file entry box/browser */ void cgiSimpleTableRowStart(); /* Start table row */ void cgiTableRowEnd(); /* End table row */ void cgiSimpleTableFieldStart(); /* Start table field */ void cgiTableFieldStartAlignRight(); /* Start table field */ void cgiTableFieldEnd(); /* End table field */ void cgiTableField(char *text); /* Make table field entry */ void cgiTableFieldWithMsg(char *text, char *msg); /* Make table field entry with mouseover */ void cgiParagraph(char *text); /* Make text paragraph */ void logCgiToStderr(); /* Log useful CGI info to stderr */ void cgiResetState(); /* This is for reloading CGI settings multiple times in the same program * execution. No effect if state has not yet been initialized. */ void cgiDown(float lines); // Drop down a certain number of lines (may be fractional) char *commonCssStyles(); /* Returns a string of common CSS styles */ char *javaScriptLiteralEncode(char *inString); /* Use backslash escaping on newline * and quote chars, backslash and others. * Intended that the encoded string will be * put between quotes at a higher level and * then interpreted by Javascript. */ #endif /* CHEAPCGI_H */ rtracklayer/src/ucsc/cirTree.c0000644000126300012640000004246512227135242017760 0ustar00biocbuildphs_compbio/* cirTree chromosome id r tree. Part of a system to index chromosome ranges - things of * form chrN:start-end. Generally you'll be using the crTree module - which * makes use of this module and the bPlusTree module - rather than this module directly. * This module works with chromosomes mapped to small integers rather than chromosomes * as strings, saving space and speeding things up in the process, but requiring the * separate bPlusTree to map the names to IDs. * This module implements a one dimensional R-tree index treating the chromosome ID * as the most significant part of a two-part key, and the base position as the least * significant part of the key. */ #include "common.h" #include "localmem.h" #include "sig.h" #include "udc.h" #include "cirTree.h" struct rTree /* Recursive range structure. */ { struct rTree *next; /* Next on same level. */ struct rTree *children; /* Child list. */ struct rTree *parent; /* Our parent if any. */ bits32 startChromIx; /* Starting chromosome. */ bits32 startBase; /* Starting base position. */ bits32 endChromIx; /* Ending chromosome. */ bits32 endBase; /* Ending base. */ bits64 startFileOffset; /* Start offset in file for leaves. */ bits64 endFileOffset; /* End file offset for leaves. */ }; #define fileHeaderSize (48) /* Size of file header. */ #define indexSlotSize (24) /* Size of startChrom,startBase,endChrom,endBase,offset */ #define leafSlotSize (32) /* Size of startChrom,startBase,endChrom,endBase,offset,size */ #define nodeHeaderSize (4) /* Size of rTree node header. isLeaf,reserved,childCount. */ int indexNodeSize(int blockSize) /* Return size of an index node. */ { return nodeHeaderSize + indexSlotSize * blockSize; } int leafNodeSize(int blockSize) /* Return size of a leaf node. */ { return nodeHeaderSize + leafSlotSize * blockSize; } static bits64 rWriteIndexLevel(bits16 blockSize, int childNodeSize, struct rTree *tree, int curLevel, int destLevel, bits64 offsetOfFirstChild, FILE *f) /* Recursively write an index level, skipping levels below destLevel, * writing out destLevel. */ { struct rTree *el; bits64 offset = offsetOfFirstChild; if (curLevel == destLevel) { /* We've reached the right level, write out a node header */ UBYTE reserved = 0; UBYTE isLeaf = FALSE; bits16 countOne = slCount(tree->children); writeOne(f, isLeaf); writeOne(f, reserved); writeOne(f, countOne); /* Write out elements of this node. */ for (el = tree->children; el != NULL; el = el->next) { writeOne(f, el->startChromIx); writeOne(f, el->startBase); writeOne(f, el->endChromIx); writeOne(f, el->endBase); writeOne(f, offset); offset += childNodeSize; } /* Write out zeroes for empty slots in node. */ int i; for (i=countOne; ichildren; el != NULL; el = el->next) offset = rWriteIndexLevel(blockSize, childNodeSize, el, curLevel+1, destLevel, offset, f); } return offset; } static void writeIndexLevel(int blockSize, int childNodeSize, struct rTree *tree, bits64 offsetOfFirstChild, int level, FILE *f) /* Write out a non-leaf level nodes at given level. */ { rWriteIndexLevel(blockSize, childNodeSize, tree, 0, level, offsetOfFirstChild, f); } static void rWriteLeaves(int itemsPerSlot, int lNodeSize, struct rTree *tree, int curLevel, int leafLevel, FILE *f) /* Write out leaf-level nodes. */ { if (curLevel == leafLevel) { /* We've reached the right level, write out a node header. */ UBYTE reserved = 0; UBYTE isLeaf = TRUE; bits16 countOne = slCount(tree->children); writeOne(f, isLeaf); writeOne(f, reserved); writeOne(f, countOne); /* Write out elements of this node. */ struct rTree *el; for (el = tree->children; el != NULL; el = el->next) { writeOne(f, el->startChromIx); writeOne(f, el->startBase); writeOne(f, el->endChromIx); writeOne(f, el->endBase); writeOne(f, el->startFileOffset); bits64 size = el->endFileOffset - el->startFileOffset; writeOne(f, size); } /* Write out zeroes for empty slots in node. */ int i; for (i=countOne; ichildren; el != NULL; el = el->next) rWriteLeaves(itemsPerSlot, lNodeSize, el, curLevel+1, leafLevel, f); } } static void writeLeaves(int itemsPerSlot, int lNodeSize, struct rTree *tree, int leafLevel, FILE *f) /* Write out leaf-level nodes. */ { rWriteLeaves(itemsPerSlot, lNodeSize, tree, 0, leafLevel, f); } void calcLevelSizes(struct rTree *tree, int *levelSizes, int level, int maxLevel) /* Recursively count sizes of levels and add to appropriate slots of levelSizes */ { struct rTree *el; for (el = tree; el != NULL; el = el->next) { levelSizes[level] += 1; if (level < maxLevel) calcLevelSizes(el->children, levelSizes, level+1, maxLevel); } } static struct rTree *rTreeFromChromRangeArray( struct lm *lm, int blockSize, int itemsPerSlot, void *itemArray, int itemSize, bits64 itemCount, void *context, struct cirTreeRange (*fetchKey)(const void *va, void *context), bits64 (*fetchOffset)(const void *va, void *context), bits64 endFileOffset, int *retLevelCount) { char *items = itemArray; struct rTree *el, *list=NULL, *tree = NULL; /* Make first level above leaf. */ bits64 i; bits64 nextOffset = (*fetchOffset)(items, context); for (i=0; i itemsPerSlot) oneSize = itemsPerSlot; else finalIteration = TRUE; /* Allocate element and put on list. */ lmAllocVar(lm, el); slAddHead(&list, el); /* Fill out most of element from first item in element. */ char *startItem = items + itemSize * i; struct cirTreeRange key = (*fetchKey)(startItem, context); el->startChromIx = el->endChromIx = key.chromIx; el->startBase = key.start; el->endBase = key.end; el->startFileOffset = nextOffset; /* Figure out end of element from offset of next element (or file size * for final element.) */ if (finalIteration) nextOffset = endFileOffset; else { char *endItem = startItem + itemSize*oneSize; nextOffset = (*fetchOffset)(endItem, context); } el->endFileOffset = nextOffset; /* Expand area spanned to include all items in block. */ int j; for (j=1; jstartChromIx) { el->startChromIx = key.chromIx; el->startBase = key.start; } else if (key.chromIx == el->startChromIx) { if (key.start < el->startBase) el->startBase = key.start; } if (key.chromIx > el->endChromIx) { el->endChromIx = key.chromIx; el->endBase = key.end; } else if (key.chromIx == el->endChromIx) { if (key.end > el->endBase) el->endBase = key.end; } } } slReverse(&list); verbose(2, "Made %d primary index nodes out of %llu items\n", slCount(list), itemCount); /* Now iterate through making more and more condensed versions until have just one. */ int levelCount = 1; tree = list; while (tree->next != NULL || levelCount < 2) { list = NULL; int slotsUsed = blockSize; struct rTree *parent = NULL, *next; for (el = tree; el != NULL; el = next) { next = el->next; if (slotsUsed >= blockSize) { slotsUsed = 1; lmAllocVar(lm, parent); parent = lmCloneMem(lm, el, sizeof(*el)); parent->children = el; el->parent = parent; el->next = NULL; slAddHead(&list, parent); } else { ++slotsUsed; slAddHead(&parent->children, el); el->parent = parent; if (el->startChromIx < parent->startChromIx) { parent->startChromIx = el->startChromIx; parent->startBase = el->startBase; } else if (el->startChromIx == parent->startChromIx) { if (el->startBase < parent->startBase) parent->startBase = el->startBase; } if (el->endChromIx > parent->endChromIx) { parent->endChromIx = el->endChromIx; parent->endBase = el->endBase; } else if (el->endChromIx == parent->endChromIx) { if (el->endBase > parent->endBase) parent->endBase = el->endBase; } } } slReverse(&list); for (el = list; el != NULL; el = el->next) slReverse(&el->children); tree = list; levelCount += 1; } *retLevelCount = levelCount; return tree; } static void writeTreeToOpenFile(struct rTree *tree, int blockSize, int levelCount, FILE *f) /* Write out tree to a file that is open already - writing out index nodes from * highest to lowest level, and then leaf nodes. */ { /* Calculate sizes of each level. */ int i; int levelSizes[levelCount]; for (i=0; istartChromIx); writeOne(f, tree->startBase); writeOne(f, tree->endChromIx); writeOne(f, tree->endBase); writeOne(f, endFileOffset); writeOne(f, itemsPerSlot); writeOne(f, reserved); writeTreeToOpenFile(tree, blockSize, levelCount, f); lmCleanup(&lm); } void cirTreeFileCreate( void *itemArray, /* Sorted array of things to index. */ int itemSize, /* Size of each element in array. */ bits64 itemCount, /* Number of elements in array. */ bits32 blockSize, /* R tree block size - # of children for each node. */ bits32 itemsPerSlot, /* Number of items to put in each index slot at lowest level. */ void *context, /* Context pointer for use by fetch call-back functions. */ struct cirTreeRange (*fetchKey)(const void *va, void *context),/* Given item, return key. */ bits64 (*fetchOffset)(const void *va, void *context), /* Given item, return file offset */ bits64 endFileOffset, /* Last position in file we index. */ char *fileName) /* Name of output file. */ /* Create a r tree index file from a sorted array. */ { FILE *f = mustOpen(fileName, "wb"); cirTreeFileBulkIndexToOpenFile(itemArray, itemSize, itemCount, blockSize, itemsPerSlot, context, fetchKey, fetchOffset, endFileOffset, f); carefulClose(&f); } struct cirTreeFile *cirTreeFileAttach(char *fileName, struct udcFile *udc) /* Open up r-tree index file on previously open file, with cirTree * header at current file position. */ { /* Open file and allocate structure to hold info from header etc. */ struct cirTreeFile *crt = needMem(sizeof(*crt)); crt->fileName = fileName; crt->udc = udc; /* Read magic number at head of file and use it to see if we are proper file type, and * see if we are byte-swapped. */ bits32 magic; boolean isSwapped = FALSE; udcMustReadOne(udc, magic); if (magic != cirTreeSig) { magic = byteSwap32(magic); isSwapped = crt->isSwapped = TRUE; if (magic != cirTreeSig) errAbort("%s is not a chromosome id r-tree index file", fileName); } /* Read rest of defined bits of header, byte swapping as needed. */ crt->blockSize = udcReadBits32(udc, isSwapped); crt->itemCount = udcReadBits64(udc, isSwapped); crt->startChromIx = udcReadBits32(udc, isSwapped); crt->startBase = udcReadBits32(udc, isSwapped); crt->endChromIx = udcReadBits32(udc, isSwapped); crt->endBase = udcReadBits32(udc, isSwapped); crt->fileSize = udcReadBits64(udc, isSwapped); crt->itemsPerSlot = udcReadBits32(udc, isSwapped); /* Skip over reserved bits of header. */ bits32 reserved32; udcMustReadOne(udc, reserved32); /* Save position of root block of r tree. */ crt->rootOffset = udcTell(udc); return crt; } struct cirTreeFile *cirTreeFileOpen(char *fileName) /* Open up r-tree index file - reading header and verifying things. */ { return cirTreeFileAttach(cloneString(fileName), udcFileOpen(fileName, udcDefaultDir())); } void cirTreeFileDetach(struct cirTreeFile **pCrt) /* Detatch and free up cirTree file opened with cirTreeFileAttach. */ { freez(pCrt); } void cirTreeFileClose(struct cirTreeFile **pCrt) /* Close and free up cirTree file opened with cirTreeFileAttach. */ { struct cirTreeFile *crt = *pCrt; if (crt != NULL) { freez(&crt->fileName); udcFileClose(&crt->udc); cirTreeFileDetach(pCrt); } } INLINE int cmpTwoBits32(bits32 aHi, bits32 aLo, bits32 bHi, bits32 bLo) /* Return - if b is less than a , 0 if equal, else +*/ { if (aHi < bHi) return 1; else if (aHi > bHi) return -1; else { if (aLo < bLo) return 1; else if (aLo > bLo) return -1; else return 0; } } INLINE boolean cirTreeOverlaps(int qChrom, int qStart, int qEnd, int rStartChrom, int rStartBase, int rEndChrom, int rEndBase) { return cmpTwoBits32(qChrom, qStart, rEndChrom, rEndBase) > 0 && cmpTwoBits32(qChrom, qEnd, rStartChrom, rStartBase) < 0; } static void rFindOverlappingBlocks(struct cirTreeFile *crt, int level, bits64 indexFileOffset, bits32 chromIx, bits32 start, bits32 end, struct fileOffsetSize **retList) /* Recursively find blocks with data. */ { struct udcFile *udc = crt->udc; /* Seek to start of block. */ udcSeek(udc, indexFileOffset); /* Read block header. */ UBYTE isLeaf; UBYTE reserved; bits16 i, childCount; udcMustReadOne(udc, isLeaf); udcMustReadOne(udc, reserved); boolean isSwapped = crt->isSwapped; childCount = udcReadBits16(udc, isSwapped); verbose(3, "rFindOverlappingBlocks %llu %u:%u-%u. childCount %d. isLeaf %d\n", indexFileOffset, chromIx, start, end, (int)childCount, (int)isLeaf); if (isLeaf) { /* Loop through node adding overlapping leaves to block list. */ for (i=0; ioffset = offset; block->size = size; slAddHead(retList, block); } } } else { /* Read node into arrays. */ bits32 startChromIx[childCount], startBase[childCount]; bits32 endChromIx[childCount], endBase[childCount]; bits64 offset[childCount]; for (i=0; irootOffset, chromIx, start, end, &blockList); slReverse(&blockList); return blockList; } rtracklayer/src/ucsc/cirTree.h0000644000126300012640000000771512227135242017764 0ustar00biocbuildphs_compbio/* cirTree chromosome id r tree. Part of a system to index chromosome ranges - things of * form chrN:start-end. Generally you'll be using the crTree module - which * makes use of this module and the bPlusTree module - rather than this module directly. * This module works with chromosomes mapped to small integers rather than chromosomes * as strings, saving space and speeding things up in the process, but requiring the * separate bPlusTree to map the names to IDs. * This module implements a one dimensional R-tree index treating the chromosome ID * as the most significant part of a two-part key, and the base position as the least * significant part of the key. */ #ifndef CIRTREE_H #define CIRTREE_H struct cirTreeFile /* R tree index file handle. */ { struct cirTreeFile *next; /* Next in list of index files if any. */ char *fileName; /* Name of file - for error reporting. */ struct udcFile *udc; /* Open file pointer. */ boolean isSwapped; /* If TRUE need to byte swap everything. */ bits64 rootOffset; /* Offset of root block. */ bits32 blockSize; /* Size of block. */ bits64 itemCount; /* Number of items indexed. */ bits32 startChromIx; /* First chromosome in file. */ bits32 startBase; /* Starting base position. */ bits32 endChromIx; /* Ending chromosome in file. */ bits32 endBase; /* Ending base position. */ bits64 fileSize; /* Total size of index file. */ bits32 itemsPerSlot; /* Max number of items to put in each index slot at lowest level. */ }; struct cirTreeFile *cirTreeFileOpen(char *fileName); /* Open up r-tree index file - reading header and verifying things. */ void cirTreeFileClose(struct cirTreeFile **pCrt); /* Close and free up cirTree file opened with cirTreeFileAttach. */ struct cirTreeFile *cirTreeFileAttach(char *fileName, struct udcFile *udc); /* Open up r-tree index file on previously open file, with cirTree * header at current file position. */ void cirTreeFileDetach(struct cirTreeFile **pCrt); /* Detach and free up cirTree file opened with cirTreeFileAttach. */ struct fileOffsetSize *cirTreeFindOverlappingBlocks(struct cirTreeFile *crf, bits32 chromIx, bits32 start, bits32 end); /* Return list of file blocks that between them contain all items that overlap * start/end on chromIx. Also there will be likely some non-overlapping items * in these blocks too. When done, use slListFree to dispose of the result. */ struct cirTreeRange /* A chromosome id and an interval inside it. */ { bits32 chromIx; /* Chromosome id. */ bits32 start; /* Start position in chromosome. */ bits32 end; /* One past last base in interval in chromosome. */ }; void cirTreeFileBulkIndexToOpenFile( void *itemArray, int itemSize, bits64 itemCount, bits32 blockSize, bits32 itemsPerSlot, void *context, struct cirTreeRange (*fetchKey)(const void *va, void *context), bits64 (*fetchOffset)(const void *va, void *context), bits64 endFileOffset, FILE *f); /* Create a r tree index from a sorted array, writing output starting at current position * of an already open file. See cirTreeFileCreate for explanation of parameters. */ void cirTreeFileCreate( void *itemArray, /* Sorted array of things to index. Sort on chromIx,start. */ int itemSize, /* Size of each element in array. */ bits64 itemCount, /* Number of elements in array. */ bits32 blockSize, /* R tree block size - # of children for each node. */ bits32 itemsPerSlot, /* Number of items to put in each index slot at lowest level. */ void *context, /* Context pointer for use by fetch call-back functions. */ struct cirTreeRange (*fetchKey)(const void *va, void *context),/* Given item, return key. */ bits64 (*fetchOffset)(const void *va, void *context), /* Given item, return file offset */ bits64 endFileOffset, /* Last position in file we index. */ char *fileName); /* Name of output file. */ /* Create a r tree index file from a sorted array. */ #endif /* CIRTREE_H */ rtracklayer/src/ucsc/common.c0000644000126300012640000022631512227135242017651 0ustar00biocbuildphs_compbio/* Commonly used routines in a wide range of applications. * Strings, singly-linked lists, and a little file i/o. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "errabort.h" #include "portable.h" #include "linefile.h" #include "hash.h" static char const rcsid[] = "$Id: common.c,v 1.151 2010/06/02 19:06:41 tdreszer Exp $"; void *cloneMem(void *pt, size_t size) /* Allocate a new buffer of given size, and copy pt to it. */ { void *newPt = needLargeMem(size); memcpy(newPt, pt, size); return newPt; } static char *cloneStringZExt(const char *s, int size, int copySize) /* Make a zero terminated copy of string in memory */ { char *d = needMem(copySize+1); copySize = min(size,copySize); memcpy(d, s, copySize); d[copySize] = 0; return d; } char *cloneStringZ(const char *s, int size) /* Make a zero terminated copy of string in memory */ { return cloneStringZExt(s, strlen(s), size); } char *cloneString(const char *s) /* Make copy of string in dynamic memory */ { int size = 0; if (s == NULL) return NULL; size = strlen(s); return cloneStringZExt(s, size, size); } char *cloneLongString(char *s) /* Make clone of long string. */ { size_t size = strlen(s); return cloneMem(s, size+1); } char *catTwoStrings(char *a, char *b) /* Allocate new string that is a concatenation of two strings. */ { int aLen = strlen(a), bLen = strlen(b); int len = aLen + bLen; char *newBuf = needLargeMem(len+1); memcpy(newBuf, a, aLen); memcpy(newBuf+aLen, b, bLen); newBuf[len] = 0; return newBuf; } /* Reverse the order of the bytes. */ void reverseBytes(char *bytes, long length) { long halfLen = (length>>1); char *end = bytes+length; char c; while (--halfLen >= 0) { c = *bytes; *bytes++ = *--end; *end = c; } } void reverseInts(int *a, int length) /* Reverse the order of the integer array. */ { int halfLen = (length>>1); int *end = a+length; int c; while (--halfLen >= 0) { c = *a; *a++ = *--end; *end = c; } } void reverseUnsigned(unsigned *a, int length) /* Reverse the order of the unsigned array. */ { int halfLen = (length>>1); unsigned *end = a+length; unsigned c; while (--halfLen >= 0) { c = *a; *a++ = *--end; *end = c; } } void reverseDoubles(double *a, int length) /* Reverse the order of the double array. */ { int halfLen = (length>>1); double *end = a+length; double c; while (--halfLen >= 0) { c = *a; *a++ = *--end; *end = c; } } void reverseStrings(char **a, int length) /* Reverse the order of the char* array. */ { int halfLen = (length>>1); char **end = a+length; char *c; while (--halfLen >= 0) { c = *a; *a++ = *--end; *end = c; } } /* Swap buffers a and b. */ void swapBytes(char *a, char *b, int length) { char c; int i; for (i=0; inext; } return len; } void *slElementFromIx(void *list, int ix) /* Return the ix'th element in list. Returns NULL * if no such element. */ { struct slList *pt = (struct slList *)list; int i; for (i=0;inext; } return pt; } int slIxFromElement(void *list, void *el) /* Return index of el in list. Returns -1 if not on list. */ { struct slList *pt; int ix = 0; for (pt = list, ix=0; pt != NULL; pt = pt->next, ++ix) if (el == (void*)pt) return ix; return -1; } void *slLastEl(void *list) /* Returns last element in list or NULL if none. */ { struct slList *next, *el; if ((el = list) == NULL) return NULL; while ((next = el->next) != NULL) el = next; return el; } /* Add new node to tail of list. * Usage: * slAddTail(&list, node); * where list and nodes are both pointers to structure * that begin with a next pointer. */ void slAddTail(void *listPt, void *node) { struct slList **ppt = (struct slList **)listPt; struct slList *n = (struct slList *)node; while (*ppt != NULL) { ppt = &((*ppt)->next); } n->next = NULL; *ppt = n; } void *slPopHead(void *vListPt) /* Return head of list and remove it from list. (Fast) */ { struct slList **listPt = (struct slList **)vListPt; struct slList *el = *listPt; if (el != NULL) { *listPt = el->next; el->next = NULL; } return el; } void *slPopTail(void *vListPt) /* Return tail of list and remove it from list. (Not so fast) */ { struct slList **listPt = (struct slList **)vListPt; struct slList *el = *listPt; if (el != NULL) { for (;;) { if (el->next == NULL) { *listPt = NULL; break; } listPt = &el->next; el = el->next; } } return el; } void *slCat(void *va, void *vb) /* Return concatenation of lists a and b. * Example Usage: * struct slName *a = getNames("a"); * struct slName *b = getNames("b"); * struct slName *ab = slCat(a,b) */ { struct slList *a = va; struct slList *b = vb; struct slList *end; if (a == NULL) return b; for (end = a; end->next != NULL; end = end->next) ; end->next = b; return a; } void slReverse(void *listPt) /* Reverse order of a list. * Usage: * slReverse(&list); */ { struct slList **ppt = (struct slList **)listPt; struct slList *newList = NULL; struct slList *el, *next; next = *ppt; while (next != NULL) { el = next; next = el->next; el->next = newList; newList = el; } *ppt = newList; } void slFreeList(void *listPt) /* Free list */ { struct slList **ppt = (struct slList**)listPt; struct slList *next = *ppt; struct slList *el; while (next != NULL) { el = next; next = el->next; freeMem((char*)el); } *ppt = NULL; } void slSort(void *pList, int (*compare )(const void *elem1, const void *elem2)) /* Sort a singly linked list with Qsort and a temporary array. */ { struct slList **pL = (struct slList **)pList; struct slList *list = *pL; int count; count = slCount(list); if (count > 1) { struct slList *el; struct slList **array; int i; array = needLargeMem(count * sizeof(*array)); for (el = list, i=0; el != NULL; el = el->next, i++) array[i] = el; qsort(array, count, sizeof(array[0]), compare); list = NULL; for (i=0; inext = list; list = array[i]; } freeMem(array); slReverse(&list); *pL = list; } } void slUniqify(void *pList, int (*compare )(const void *elem1, const void *elem2), void (*free)()) /* Return sorted list with duplicates removed. * Compare should be same type of function as slSort's compare (taking * pointers to pointers to elements. Free should take a simple * pointer to dispose of duplicate element, and can be NULL. */ { struct slList **pSlList = (struct slList **)pList; struct slList *oldList = *pSlList; struct slList *newList = NULL, *el; slSort(&oldList, compare); while ((el = slPopHead(&oldList)) != NULL) { if ((newList == NULL) || (compare(&newList, &el) != 0)) slAddHead(&newList, el); else if (free != NULL) free(el); } slReverse(&newList); *pSlList = newList; } boolean slRemoveEl(void *vpList, void *vToRemove) /* Remove element from doubly linked list. Usage: * slRemove(&list, el); * Returns TRUE if element in list. */ { struct slList **pList = vpList; struct slList *toRemove = vToRemove; struct slList *el, *next, *newList = NULL; boolean didRemove = FALSE; for (el = *pList; el != NULL; el = next) { next = el->next; if (el != toRemove) { slAddHead(&newList, el); } else didRemove = TRUE; } slReverse(&newList); *pList = newList; return didRemove; } struct slInt *slIntNew(int x) /* Return a new int. */ { struct slInt *a; AllocVar(a); a->val = x; return a; } int slIntCmp(const void *va, const void *vb) /* Compare two slInts. */ { const struct slInt *a = *((struct slInt **)va); const struct slInt *b = *((struct slInt **)vb); return a->val - b->val; } int slIntCmpRev(const void *va, const void *vb) /* Compare two slInts in reverse direction. */ { const struct slInt *a = *((struct slInt **)va); const struct slInt *b = *((struct slInt **)vb); return b->val - a->val; } struct slInt * slIntFind(struct slInt *list, int target) /* Find target in slInt list or return NULL */ { struct slInt *i; for (i=list;i;i=i->next) if (i->val == target) return i; return NULL; } static int doubleCmp(const void *va, const void *vb) /* Compare function to sort array of doubles. */ { const double *a = va; const double *b = vb; double diff = *a - *b; if (diff < 0) return -1; else if (diff > 0) return 1; else return 0; } void doubleSort(int count, double *array) /* Sort an array of doubles. */ { if (count > 1) qsort(array, count, sizeof(array[0]), doubleCmp); } double doubleMedian(int count, double *array) /* Return median value in array. This will sort * the array as a side effect. */ { double median; doubleSort(count, array); if ((count&1) == 1) median = array[count>>1]; else { count >>= 1; median = (array[count] + array[count-1]) * 0.5; } return median; } void doubleBoxWhiskerCalc(int count, double *array, double *retMin, double *retQ1, double *retMedian, double *retQ3, double *retMax) /* Calculate what you need to draw a box and whiskers plot from an array of doubles. */ { doubleSort(count, array); *retMin = array[0]; *retQ1 = array[(count+2)/4]; int halfCount = count>>1; if ((count&1) == 1) *retMedian = array[halfCount]; else { *retMedian = (array[halfCount] + array[halfCount-1]) * 0.5; } *retQ3 = array[(3*count+2)/4]; *retMax = array[count-1]; } struct slDouble *slDoubleNew(double x) /* Return a new double. */ { struct slDouble *a; AllocVar(a); a->val = x; return a; } int slDoubleCmp(const void *va, const void *vb) /* Compare two slDoubles. */ { const struct slDouble *a = *((struct slDouble **)va); const struct slDouble *b = *((struct slDouble **)vb); double diff = a->val - b->val; if (diff < 0) return -1; else if (diff > 0) return 1; else return 0; } double slDoubleMedian(struct slDouble *list) /* Return median value on list. */ { int i,count = slCount(list); struct slDouble *el; double *array, median; if (count == 0) errAbort("Can't take median of empty list"); AllocArray(array,count); for (i=0, el=list; inext) array[i] = el->val; median = doubleMedian(count, array); freeMem(array); return median; } void slDoubleBoxWhiskerCalc(struct slDouble *list, double *retMin, double *retQ1, double *retMedian, double *retQ3, double *retMax) /* Calculate what you need to draw a box and whiskers plot from a list of slDoubles. */ { int i,count = slCount(list); struct slDouble *el; double *array; if (count == 0) errAbort("Can't take do slDoubleBoxWhiskerCalc of empty list"); AllocArray(array,count); for (i=0, el=list; inext) array[i] = el->val; doubleBoxWhiskerCalc(count, array, retMin, retQ1, retMedian, retQ3, retMax); freeMem(array); } static int intCmp(const void *va, const void *vb) /* Compare function to sort array of ints. */ { const int *a = va; const int *b = vb; int diff = *a - *b; if (diff < 0) return -1; else if (diff > 0) return 1; else return 0; } void intSort(int count, int *array) /* Sort an array of ints. */ { if (count > 1) qsort(array, count, sizeof(array[0]), intCmp); } int intMedian(int count, int *array) /* Return median value in array. This will sort * the array as a side effect. */ { int median; intSort(count, array); if ((count&1) == 1) median = array[count>>1]; else { count >>= 1; median = (array[count] + array[count-1]) * 0.5; } return median; } struct slName *newSlName(char *name) /* Return a new name. */ { struct slName *sn; if (name != NULL) { int len = strlen(name); sn = needMem(sizeof(*sn)+len); strcpy(sn->name, name); return sn; } else { AllocVar(sn); } return sn; } struct slName *slNameNewN(char *name, int size) /* Return new slName of given size. */ { struct slName *sn = needMem(sizeof(*sn) + size); memcpy(sn->name, name, size); return sn; } int slNameCmpCase(const void *va, const void *vb) /* Compare two slNames, ignore case. */ { const struct slName *a = *((struct slName **)va); const struct slName *b = *((struct slName **)vb); return strcasecmp(a->name, b->name); } void slNameSortCase(struct slName **pList) /* Sort slName list, ignore case. */ { slSort(pList, slNameCmpCase); } int slNameCmp(const void *va, const void *vb) /* Compare two slNames. */ { const struct slName *a = *((struct slName **)va); const struct slName *b = *((struct slName **)vb); return strcmp(a->name, b->name); } int slNameCmpStringsWithEmbeddedNumbers(const void *va, const void *vb) /* Compare strings such as gene names that may have embedded numbers, * so that bmp4a comes before bmp14a */ { const struct slName *a = *((struct slName **)va); const struct slName *b = *((struct slName **)vb); return cmpStringsWithEmbeddedNumbers(a->name, b->name); } void slNameSort(struct slName **pList) /* Sort slName list. */ { slSort(pList, slNameCmp); } boolean slNameInList(struct slName *list, char *string) /* Return true if string is in name list -- case insensitive. */ { struct slName *el; for (el = list; el != NULL; el = el->next) if (sameWord(string, el->name)) return TRUE; return FALSE; } boolean slNameInListUseCase(struct slName *list, char *string) /* Return true if string is in name list -- case sensitive. */ { struct slName *el; for (el = list; el != NULL; el = el->next) if (string != NULL && !strcmp(string, el->name)) return TRUE; return FALSE; } void *slNameFind(void *list, char *string) /* Return first element of slName list (or any other list starting * with next/name fields) that matches string. */ { struct slName *el; for (el = list; el != NULL; el = el->next) if (sameWord(string, el->name)) return el; return NULL; } int slNameFindIx(struct slName *list, char *string) /* Return index of first element of slName list (or any other * list starting with next/name fields) that matches string. * Return -1 if not found. */ { struct slName *el; int ix = 0; for (el = list; el != NULL; el = el->next, ix++) if (sameString(string, el->name)) return ix; return -1; } char *slNameStore(struct slName **pList, char *string) /* Put string into list if it's not there already. * Return the version of string stored in list. */ { struct slName *el; for (el = *pList; el != NULL; el = el->next) { if (sameString(string, el->name)) return el->name; } el = newSlName(string); slAddHead(pList, el); return el->name; } struct slName *slNameAddHead(struct slName **pList, char *name) /* Add name to start of list and return it. */ { struct slName *el = slNameNew(name); slAddHead(pList, el); return el; } struct slName *slNameAddTail(struct slName **pList, char *name) /* Add name to end of list (not efficient for long lists), * and return it. */ { struct slName *el = slNameNew(name); slAddTail(pList, el); return el; } struct slName *slNameCloneList(struct slName *list) /* Return clone of list. */ { struct slName *el, *newEl, *newList = NULL; for (el = list; el != NULL; el = el->next) { newEl = slNameNew(el->name); slAddHead(&newList, newEl); } slReverse(&newList); return newList; } struct slName *slNameListFromString(char *s, char delimiter) /* Return list of slNames gotten from parsing delimited string. * The final delimiter is optional. a,b,c and a,b,c, are equivalent * for comma-delimited lists. */ { char *e; struct slName *list = NULL, *el; while (s != NULL && s[0] != 0) { e = strchr(s, delimiter); if (e == NULL) el = slNameNew(s); else { el = slNameNewN(s, e-s); e += 1; } slAddHead(&list, el); s = e; } slReverse(&list); return list; } struct slName *slNameListOfUniqueWords(char *text,boolean respectQuotes) // Return list of unique words found by parsing string delimited by whitespace. // If respectQuotes then ["Lucy and Ricky" 'Fred and Ethyl'] will yield 2 slNames no quotes { struct slName *list = NULL; char *word = NULL; while (text != NULL) { if (respectQuotes) { word = nextWordRespectingQuotes(&text); if (word != NULL) { if (word[0] == '"') stripChar(word, '"'); else if (word[0] == '\'') stripChar(word, '\''); } } else word = nextWord(&text); if (word) slNameStore(&list, word); else break; } slReverse(&list); return list; } struct slName *slNameListFromStringArray(char *stringArray[], int arraySize) /* Return list of slNames from an array of strings of length arraySize. * If a string in the array is NULL, the array will be treated as * NULL-terminated (shorter than arraySize). */ { char *s; struct slName *list = NULL, *el; int i; if (stringArray == NULL) return NULL; for (i = 0; i < arraySize; i++) { s = stringArray[i]; if (s == NULL) break; el = slNameNew(s); slAddHead(&list, el); } slReverse(&list); return list; } char *slNameListToString(struct slName *list, char delimiter) /* Return string created by joining all names with the delimiter. */ { struct slName *el; int elCount = 0; int len = 0; char del[2]; char *s; del[0] = delimiter; del[1] = '\0'; for (el = list; el != NULL; el = el->next, elCount++) len += strlen(el->name); len += elCount; AllocArray(s, len); for (el = list; el != NULL; el = el->next) { strcat(s, el->name); if (el->next != NULL) strcat(s, del); } return s; } struct slName *slNameLoadReal(char *fileName) /* load file lines that are not blank or start with a '#' into a slName * list */ { struct slName *lines = NULL; char *line; struct lineFile *lf = lineFileOpen(fileName, TRUE); while (lineFileNextReal(lf, &line)) slSafeAddHead(&lines, slNameNew(line)); lineFileClose(&lf); slReverse(&lines); return lines; } struct slName *slNameIntersection(struct slName *a, struct slName *b) /* return intersection of two slName lists. */ { struct hash *hashA = newHash(0); struct slName *el, *retval = NULL; for (el = a; el != NULL; el = el->next) hashAddInt(hashA, el->name, 1); for (el = b; el != NULL; el = el->next) if(hashLookup(hashA, el->name) != NULL) slNameAddHead(&retval, el->name); hashFree(&hashA); return retval; } struct slRef *refOnList(struct slRef *refList, void *val) /* Return ref if val is already on list, otherwise NULL. */ { struct slRef *ref; for (ref = refList; ref != NULL; ref = ref->next) if (ref->val == val) return ref; return NULL; } struct slRef *slRefNew(void *val) /* Create new slRef element. */ { struct slRef *ref; AllocVar(ref); ref->val = val; return ref; } void refAdd(struct slRef **pRefList, void *val) /* Add reference to list. */ { struct slRef *ref; AllocVar(ref); ref->val = val; slAddHead(pRefList, ref); } void refAddUnique(struct slRef **pRefList, void *val) /* Add reference to list if not already on list. */ { if (refOnList(*pRefList, val) == NULL) { refAdd(pRefList, val); } } struct slRef *refListFromSlList(void *list) /* Make a reference list that mirrors a singly-linked list. */ { struct slList *el; struct slRef *refList = NULL, *ref; for (el= list; el != NULL; el = el->next) { ref = slRefNew(el); slAddHead(&refList, ref); } slReverse(&refList); return refList; } struct slPair *slPairNew(char *name, void *val) /* Allocate new name/value pair. */ { struct slPair *el; AllocVar(el); el->name = cloneString(name); el->val = val; return el; } void slPairAdd(struct slPair **pList, char *name, void *val) /* Add new slPair to head of list. */ { struct slPair *el = slPairNew(name, val); slAddHead(pList, el); } void slPairFree(struct slPair **pEl) /* Free up struct and name. (Don't free up values.) */ { struct slPair *el = *pEl; if (el != NULL) { freeMem(el->name); freez(pEl); } } void slPairFreeList(struct slPair **pList) /* Free up list. (Don't free up values.) */ { struct slPair *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; slPairFree(&el); } *pList = NULL; } void slPairFreeVals(struct slPair *list) /* Free up all values on list. */ { struct slPair *el; for (el = list; el != NULL; el = el->next) freez(&el->val); } void slPairFreeValsAndList(struct slPair **pList) /* Free up all values on list and list itself */ { slPairFreeVals(*pList); slPairFreeList(pList); } struct slPair *slPairFind(struct slPair *list, char *name) /* Return list element of given name, or NULL if not found. */ { struct slPair *el; for (el = list; el != NULL; el = el->next) if (sameString(name, el->name)) break; return el; } void *slPairFindVal(struct slPair *list, char *name) /* Return value associated with name in list, or NULL if not found. */ { struct slPair *el = slPairFind(list, name); if (el == NULL) return NULL; return el->val; } struct slPair *slPairListFromString(char *str,boolean respectQuotes) // Return slPair list parsed from list in string like: [name1=val1 name2=val2 ...] // if respectQuotes then string can have double quotes: [name1="val 1" "name 2"=val2 ...] // resulting pair strips quotes: {name1}={val 1},{name 2}={val2} // Returns NULL if parse error. Free this up with slPairFreeValsAndList. { char *s = skipLeadingSpaces(str); // Would like to remove this and tighten up the standard someday. if (isEmpty(s)) return NULL; struct slPair *list = NULL; char name[1024]; char val[1024]; char buf[1024]; bool inQuote = FALSE; char *b = buf; char sep = '='; char c = ' '; int mode = 0; while(1) { c = *s++; if (mode == 0 || mode == 2) // reading name or val { boolean term = FALSE; if (respectQuotes && b == buf && !inQuote && c == '"') inQuote = TRUE; else if (inQuote && c == '"') term = TRUE; else if ((c == sep || c == 0) && !inQuote) { term = TRUE; --s; // rewind } else if (c == ' ' && !inQuote) { warn("slPairListFromString: Unexpected whitespace in %s", str); return NULL; } else if (c == 0 && inQuote) { warn("slPairListFromString: Unterminated quote in %s", str); return NULL; } else { *b++ = c; if ((b - buf) > sizeof buf) { warn("slPairListFromString: pair name or value too long in %s", str); return NULL; } } if (term) { inQuote = FALSE; *b = 0; if (mode == 0) { safecpy(name, sizeof name, buf); if (strlen(name)<1) { warn("slPairListFromString: Pair name cannot be empty in %s", str); return NULL; } // Shall we check for name being alphanumeric, at least for the respectQuotes=FALSE case? } else // mode == 2 { safecpy(val, sizeof val, buf); if (!respectQuotes && (hasWhiteSpace(name) || hasWhiteSpace(val))) // should never happen { warn("slPairListFromString() Unexpected white space in name=value pair: [%s]=[%s] in string=[%s]\n", name, val, str); break; } slPairAdd(&list, name, cloneString(val)); } ++mode; } } else if (mode == 1) // read required "=" sign { if (c != '=') { warn("slPairListFromString: Expected character = after name in %s", str); return NULL; } ++mode; sep = ' '; b = buf; } else // (mode == 3) reading optional separating space { if (c == 0) break; if (c != ' ') { mode = 0; --s; b = buf; sep = '='; } } } slReverse(&list); return list; } char *slPairListToString(struct slPair *list,boolean quoteIfSpaces) // Returns an allocated string of pairs in form of [name1=val1 name2=val2 ...] // If requested, will wrap name or val in quotes if contain spaces: [name1="val 1" "name 2"=val2] { // Don't rely on dyString. We should do the accounting ourselves and not create extra dependencies. int count = 0; struct slPair *pair = list; for(;pair != NULL; pair = pair->next) { assert(pair->name != NULL && pair->val != NULL); // Better assert and get this over with, complete with stack count += strlen(pair->name); count += strlen((char *)(pair->val)); count += 2; // = and ' ' delimit if (quoteIfSpaces) { if (hasWhiteSpace(pair->name)) count += 2; // " and " if (hasWhiteSpace((char *)(pair->val))) count += 2; // " and " } } if (count == 0) return NULL; char *str = needMem(count+5); // A bit of slop char *strPtr = str; for(pair = list; pair != NULL; pair = pair->next, strPtr += strlen(strPtr)) { if (pair != list) // Not first cycle *strPtr++ = ' '; if (hasWhiteSpace(pair->name)) { if (quoteIfSpaces) sprintf(strPtr,"\"%s\"=",pair->name); else { warn("slPairListToString() Unexpected white space in name: [%s]\n", pair->name); sprintf(strPtr,"%s=",pair->name); // warn but still make string } } else sprintf(strPtr,"%s=",pair->name); strPtr += strlen(strPtr); if (hasWhiteSpace((char *)(pair->val))) { if (quoteIfSpaces) sprintf(strPtr,"\"%s\"",(char *)(pair->val)); else { warn("slPairListToString() Unexpected white space in val: [%s]\n", (char *)(pair->val)); sprintf(strPtr,"%s",(char *)(pair->val)); // warn but still make string } } else sprintf(strPtr,"%s",(char *)(pair->val)); } return str; } char *slPairNameToString(struct slPair *list, char delimiter,boolean quoteIfSpaces) // Return string created by joining all names (ignoring vals) with the delimiter. // If requested, will wrap name in quotes if contain spaces: [name1,"name 2" ...] { int elCount = 0; int count = 0; struct slPair *pair = list; for (; pair != NULL; pair = pair->next, elCount++) { assert(pair->name != NULL); count += strlen(pair->name); if (quoteIfSpaces && hasWhiteSpace(pair->name)) count += 2; } count += elCount; if (count == 0) return NULL; char *str = needMem(count+5); // A bit of slop char *strPtr = str; for(pair = list; pair != NULL; pair = pair->next, strPtr += strlen(strPtr)) { if (pair != list) *strPtr++ = delimiter; if (hasWhiteSpace(pair->name)) { if (quoteIfSpaces) sprintf(strPtr,"\"%s\"",pair->name); else { if (delimiter == ' ') // if delimied by commas, this is entirely okay! warn("slPairListToString() Unexpected white space in name delimied by space: [%s]\n", pair->name); sprintf(strPtr,"%s",pair->name); // warn but still make string } } else sprintf(strPtr,"%s",pair->name); } return str; } int slPairCmpCase(const void *va, const void *vb) /* Compare two slPairs, ignore case. */ { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return strcasecmp(a->name, b->name); } void slPairSortCase(struct slPair **pList) /* Sort slPair list, ignore case. */ { slSort(pList, slPairCmpCase); } int slPairCmp(const void *va, const void *vb) /* Compare two slPairs. */ { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return strcmp(a->name, b->name); } int slPairValCmpCase(const void *va, const void *vb) /* Case insensitive compare two slPairs on their values (must be string). */ { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return strcasecmp((char *)(a->val), (char *)(b->val)); } int slPairValCmp(const void *va, const void *vb) /* Compare two slPairs on their values (must be string). */ { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return strcmp((char *)(a->val), (char *)(b->val)); } void slPairValSortCase(struct slPair **pList) /* Sort slPair list on values (must be string), ignore case. */ { slSort(pList, slPairValCmpCase); } void slPairValSort(struct slPair **pList) /* Sort slPair list on values (must be string). */ { slSort(pList, slPairValCmp); } int slPairIntCmp(const void *va, const void *vb) // Compare two slPairs on their integer values. { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return ((char *)(a->val) - (char *)(b->val)); // cast works and val is 0 vased integer } void slPairIntSort(struct slPair **pList) // Sort slPair list on integer values. { slSort(pList, slPairIntCmp); } int slPairAtoiCmp(const void *va, const void *vb) // Compare two slPairs on their strings interpreted as integer values. { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return (atoi((char *)(a->val)) - atoi((char *)(b->val))); } void slPairValAtoiSort(struct slPair **pList) // Sort slPair list on string values interpreted as integers. { slSort(pList, slPairAtoiCmp); } void gentleFree(void *pt) { if (pt != NULL) freeMem((char*)pt); } int differentWord(char *s1, char *s2) /* strcmp ignoring case - returns zero if strings are * the same (ignoring case) otherwise returns difference * between first non-matching characters. */ { char c1, c2; for (;;) { c1 = toupper(*s1++); c2 = toupper(*s2++); if (c1 != c2) /* Takes care of end of string in one but not the other too */ return c2-c1; if (c1 == 0) /* Take care of end of string in both. */ return 0; } } int differentStringNullOk(char *a, char *b) /* Returns 0 if two strings (either of which may be NULL) * are the same. Otherwise it returns a positive or negative * number depending on the alphabetical order of the two * strings. * This is basically a strcmp that can handle NULLs in * the input. If used in a sort the NULLs will end * up before any of the cases with data. */ { if (a == b) return FALSE; else if (a == NULL) return -1; else if (b == NULL) return 1; else return strcmp(a,b) != 0; } boolean startsWith(const char *start, const char *string) /* Returns TRUE if string begins with start. */ { char c; int i; for (i=0; ;i += 1) { if ((c = start[i]) == 0) return TRUE; if (string[i] != c) return FALSE; } } boolean startsWithWord(char *firstWord, char *line) /* Return TRUE if first white-space-delimited word in line * is same as firstWord. Comparison is case sensitive. */ { int len = strlen(firstWord); int i; for (i=0; i= haystack; pos -= 1) { if (memcmp(needle, pos, nSize) == 0) return pos; } return NULL; } char *stringBetween(char *start, char *end, char *haystack) /* Return string between start and end strings, or NULL if * none found. The first such instance is returned. * String must be freed by caller. */ { char *pos, *p; int len; if ((p = stringIn(start, haystack)) != NULL) { pos = p + strlen(start); if ((p = stringIn(end, pos)) != NULL) { len = p - pos; pos = cloneMem(pos, len + 1); pos[len] = 0; return pos; } } return NULL; } boolean endsWith(char *string, char *end) /* Returns TRUE if string ends with end. */ { int sLen, eLen, offset; sLen = strlen(string); eLen = strlen(end); offset = sLen - eLen; if (offset < 0) return FALSE; return sameString(string+offset, end); } char lastChar(char *s) /* Return last character in string. */ { if (s == NULL || s[0] == 0) return 0; return s[strlen(s)-1]; } char *lastNonwhitespaceChar(char *s) // Return pointer to last character in string that is not whitespace. { if (s == NULL || s[0] == 0) return NULL; char *sPos = s + (strlen(s) - 1); for (;sPos >= s;sPos--) { if (!isspace(*sPos)) return sPos; } return NULL; } char *matchingCharBeforeInLimits(char *limit, char *s, char c) /* Look for character c sometime before s, but going no further than limit. * Return NULL if not found. */ { while (--s >= limit) if (*s == c) return s; return NULL; } char *memMatch(char *needle, int nLen, char *haystack, int hLen) /* Returns first place where needle (of nLen chars) matches * haystack (of hLen chars) */ { char c = *needle++; nLen -= 1; hLen -= nLen; while (--hLen >= 0) { if (*haystack++ == c && memcmp(needle, haystack, nLen) == 0) { return haystack-1; } } return NULL; } void toUpperN(char *s, int n) /* Convert a section of memory to upper case. */ { int i; for (i=0; i=sz) return -1; for(p=strstr(string,oldStr);p!=NULL;p=strstr(p+strlen(newStr),oldStr)) { memmove(p+strlen(newStr),p+strlen(oldStr),strlen(p+strlen(oldStr))+1); // NULL at end is also moved! memcpy(p,newStr,strlen(newStr)); } return count; } char *strLower(char *s) /* Convert entire string to lower case */ { char c; char *ss=s; for (;;) { if ((c = *ss) == 0) break; *ss++ = tolower(c); } return s; } char * memSwapChar(char *s, int len, char oldChar, char newChar) /* Substitute newChar for oldChar throughout memory of given length. */ { int ix=0; for (;ix= 0 && bNum >= 0) { int diff = atoi(a) - atoi(b); if (diff != 0) return diff; a += aNum; b += bNum; } /* Count number of non-digits at start. */ int aNonNum = countLeadingNondigits(a); int bNonNum = countLeadingNondigits(b); // If different sizes of non-numerical part, then don't match, let strcmp sort out how if (aNonNum != bNonNum) return strcmp(a,b); // If no characters left then they are the same! else if (aNonNum == 0) return 0; // Non-numerical part is the same length and non-zero. See if it is identical. Return if not. else { int diff = memcmp(a,b,aNonNum); if (diff != 0) return diff; a += aNonNum; b += bNonNum; } } } int cmpWordsWithEmbeddedNumbers(const char *a, const char *b) /* Case insensitive version of cmpStringsWithEmbeddedNumbers. */ { char *A = cloneString(a); char *B = cloneString(b); int diff = cmpStringsWithEmbeddedNumbers(strUpper(A), strUpper(B)); freeMem(A); freeMem(B); return diff; } int countSame(char *a, char *b) /* Count number of characters that from start in a,b that are same. */ { char c; int i; int count = 0; for (i=0; ; ++i) { c = a[i]; if (b[i] != c) break; if (c == 0) break; ++count; } return count; } /* int chopString(in, sep, outArray, outSize); */ /* This chops up the input string (cannabilizing it) * into an array of zero terminated strings in * outArray. It returns the number of strings. * If you pass in NULL for outArray, it will just * return the number of strings that it *would* * chop. */ int chopString(char *in, char *sep, char *outArray[], int outSize) { int recordCount = 0; for (;;) { if (outArray != NULL && recordCount >= outSize) break; /* Skip initial separators. */ in += strspn(in, sep); if (*in == 0) break; if (outArray != NULL) outArray[recordCount] = in; recordCount += 1; in += strcspn(in, sep); if (*in == 0) break; if (outArray != NULL) *in = 0; in += 1; } return recordCount; } int chopByWhite(char *in, char *outArray[], int outSize) /* Like chopString, but specialized for white space separators. */ { int recordCount = 0; char c; for (;;) { if (outArray != NULL && recordCount >= outSize) break; /* Skip initial separators. */ while (isspace(*in)) ++in; if (*in == 0) break; /* Store start of word and look for end of word. */ if (outArray != NULL) outArray[recordCount] = in; recordCount += 1; for (;;) { if ((c = *in) == 0) break; if (isspace(c)) break; ++in; } if (*in == 0) break; /* Tag end of word with zero. */ if (outArray != NULL) *in = 0; /* And skip over the zero. */ in += 1; } return recordCount; } int chopByWhiteRespectDoubleQuotes(char *in, char *outArray[], int outSize) /* Like chopString, but specialized for white space separators. * Further, any doubleQuotes (") are respected. * If doubleQuote is encloses whole string, then they are removed: * "Fred and Ethyl" results in word [Fred and Ethyl] * If doubleQuotes exist inside string they are retained: * Fred" and Ethyl" results in word [Fred" and Ethyl"] * Special note "" is a valid, though empty word. */ { int recordCount = 0; char c; char *quoteBegins = NULL; boolean quoting = FALSE; for (;;) { if (outArray != NULL && recordCount >= outSize) break; /* Skip initial separators. */ while (isspace(*in)) ++in; if (*in == 0) break; /* Store start of word and look for end of word. */ if (outArray != NULL) { outArray[recordCount] = in; if((*in == '"')) quoteBegins = (in+1); else quoteBegins = NULL; } recordCount += 1; quoting = FALSE; for (;;) { if ((c = *in) == 0) break; if(quoting) { if(c == '"') { quoting = FALSE; if(quoteBegins != NULL) // implies out array { if((c = *(in+1) == 0 )|| isspace(c)) // whole word is quoted. { outArray[recordCount-1] = quoteBegins; // Fix beginning of word quoteBegins = NULL; break; } } } } else { quoting = (c == '"'); if (isspace(c)) break; } ++in; } if (*in == 0) break; /* Tag end of word with zero. */ if (outArray != NULL) *in = 0; /* And skip over the zero. */ in += 1; } return recordCount; } int chopByChar(char *in, char chopper, char *outArray[], int outSize) /* Chop based on a single character. */ { int i; char c; if (*in == 0) return 0; for (i=0; (i=0; --i) { c = s[i]; if (isspace(c)) s[i] = 0; else break; } } /* Remove white space from a string */ void eraseWhiteSpace(char *s) { char *in, *out; char c; in = out = s; for (;;) { c = *in++; if (c == 0) break; if (!isspace(c)) *out++ = c; } *out++ = 0; } /* Remove non-alphanumeric chars from string */ void eraseNonAlphaNum(char *s) { char *in, *out; char c; in = out = s; for (;;) { c = *in++; if (c == 0) break; if (isalnum(c)) *out++ = c; } *out = 0; } char *trimSpaces(char *s) /* Remove leading and trailing white space. */ { if (s != NULL) { s = skipLeadingSpaces(s); eraseTrailingSpaces(s); } return s; } void repeatCharOut(FILE *f, char c, int count) /* Write character to file repeatedly. */ { while (--count >= 0) fputc(c, f); } void spaceOut(FILE *f, int count) /* Put out some spaces to file. */ { repeatCharOut(f, ' ', count); } void starOut(FILE *f, int count) /* Put out some asterisks to file. */ { repeatCharOut(f, '*', count); } boolean hasWhiteSpace(char *s) /* Return TRUE if there is white space in string. */ { char c; while ((c = *s++) != 0) if (isspace(c)) return TRUE; return FALSE; } char *firstWordInLine(char *line) /* Returns first word in line if any (white space separated). * Puts 0 in place of white space after word. */ { char *e; line = skipLeadingSpaces(line); if ((e = skipToSpaces(line)) != NULL) *e = 0; return line; } char *cloneFirstWord(char *line) /* Clone first word in line */ { char *startFirstWord = skipLeadingSpaces(line); if (startFirstWord == NULL) return NULL; char *endFirstWord = skipToSpaces(startFirstWord); if (endFirstWord == NULL) return cloneString(startFirstWord); else return cloneStringZ(startFirstWord, endFirstWord - startFirstWord); } char *lastWordInLine(char *line) /* Returns last word in line if any (white space separated). * Returns NULL if string is empty. Removes any terminating white space * from line. */ { char *s = line; char *word = NULL, *wordEnd = NULL; for (;;) { s = skipLeadingSpaces(s); if (s == NULL || s[0] == 0) break; word = s; s = wordEnd = skipToSpaces(s); if (s == NULL) break; } if (wordEnd != NULL) *wordEnd = 0; return word; } char *nextWord(char **pLine) /* Return next word in *pLine and advance *pLine to next * word. */ { char *s = *pLine, *e; if (s == NULL || s[0] == 0) return NULL; s = skipLeadingSpaces(s); if (s[0] == 0) return NULL; e = skipToSpaces(s); if (e != NULL) *e++ = 0; *pLine = e; return s; } char *nextWordRespectingQuotes(char **pLine) // return next word but respects single or double quotes surrounding sets of words. { char *s = *pLine, *e; if (s == NULL || s[0] == 0) return NULL; s = skipLeadingSpaces(s); if (s[0] == 0) return NULL; if (s[0] == '"') { e = skipBeyondDelimit(s+1,'"'); if (e != NULL && !isspace(e[0])) e = skipToSpaces(s); } else if (s[0] == '\'') { e = skipBeyondDelimit(s+1,'\''); if (e != NULL && !isspace(e[0])) e = skipToSpaces(s); } else e = skipToSpaces(s); if (e != NULL) *e++ = 0; *pLine = e; return s; } char *nextTabWord(char **pLine) /* Return next tab-separated word. */ { char *s = *pLine; char *e; if (s == NULL || *s == '\n' || *s == 0) { *pLine = NULL; return NULL; } e = strchr(s, '\t'); if (e == NULL) { e = strchr(s, '\n'); if (e != NULL) *e = 0; *pLine = NULL; } else { *e++ = 0; *pLine = e; } return s; } char *cloneFirstWordByDelimiter(char *line,char delimit) /* Returns a cloned first word, not harming the memory passed in */ { if(line == NULL || *line == 0) return NULL; line = skipLeadingSpaces(line); if(*line == 0) return NULL; int size=0; char *e; for(e=line;*e!=0;e++) { if(*e==delimit) break; else if(delimit == ' ' && isspace(*e)) break; size++; } if(size == 0) return NULL; char *new = needMem(size + 2); // Null terminated by 2 memcpy(new, line, size); return new; } char *cloneNextWordByDelimiter(char **line,char delimit) /* Returns a cloned first word, advancing the line pointer but not harming memory passed in */ { char *new = cloneFirstWordByDelimiter(*line,delimit); if(new != NULL) { *line = skipLeadingSpaces(*line); *line += strlen(new); if( **line != 0) (*line)++; } return new; } char *nextStringInList(char **pStrings) /* returns pointer to the first string and advances pointer to next in list of strings dilimited by 1 null and terminated by 2 nulls. */ { if(pStrings == NULL || *pStrings == NULL || **pStrings == 0) return NULL; char *p=*pStrings; *pStrings += strlen(p)+1; return p; } int cntStringsInList(char *pStrings) /* returns count of strings in a list of strings dilimited by 1 null and terminated by 2 nulls. */ { int cnt=0; char *p = pStrings; while(nextStringInList(&p) != NULL) cnt++; return cnt; } int stringArrayIx(char *string, char *array[], int arraySize) /* Return index of string in array or -1 if not there. */ { int i; for (i=0; i 255) { warn("String too long in writeString (%d chars):\n%s", len, s); len = 255; } bLen = len; writeOne(f, bLen); mustWrite(f, s, len); } char *readString(FILE *f) /* Read a string (written with writeString) into * memory. freeMem the result when done. */ { UBYTE bLen; int len; char *s; if (!readOne(f, bLen)) return NULL; len = bLen; s = needMem(len+1); if (len > 0) mustRead(f, s, len); return s; } char *mustReadString(FILE *f) /* Read a string. Squawk and die at EOF or if any problem. */ { char *s = readString(f); if (s == NULL) errAbort("Couldn't read string"); return s; } boolean fastReadString(FILE *f, char buf[256]) /* Read a string into buffer, which must be long enough * to hold it. String is in 'writeString' format. */ { UBYTE bLen; int len; if (!readOne(f, bLen)) return FALSE; if ((len = bLen)> 0) mustRead(f, buf, len); buf[len] = 0; return TRUE; } void msbFirstWriteBits64(FILE *f, bits64 x) /* Write out 64 bit number in manner that is portable across architectures */ { int i; UBYTE buf[8]; for (i=7; i>=0; --i) { buf[i] = (UBYTE)(x&0xff); x >>= 8; } mustWrite(f, buf, 8); } bits64 msbFirstReadBits64(FILE *f) /* Write out 64 bit number in manner that is portable across architectures */ { int i; UBYTE buf[8]; bits64 x = 0; mustRead(f, buf, 8); for (i=0; i<8; ++i) { x <<= 8; x |= buf[i]; } return x; } void mustGetLine(FILE *file, char *buf, int charCount) /* Read at most charCount-1 bytes from file, but stop after newline if one is * encountered. The string in buf is '\0'-terminated. (See man 3 fgets.) * Die if there is an error. */ { char *success = fgets(buf, charCount, file); if (success == NULL && charCount > 0) buf[0] = '\0'; if (ferror(file)) errAbort("mustGetLine: fgets failed: %s", strerror(ferror(file))); } int mustOpenFd(char *fileName, int flags) /* Open a file descriptor (see man 2 open) or squawk and die. */ { if (sameString(fileName, "stdin")) return STDIN_FILENO; if (sameString(fileName, "stdout")) return STDOUT_FILENO; // mode is necessary when O_CREAT is given, ignored otherwise int mode = 00664; int fd = open(fileName, flags, mode); if (fd < 0) { char *modeName = ""; if ((flags & (O_WRONLY | O_CREAT | O_TRUNC)) == (O_WRONLY | O_CREAT | O_TRUNC)) modeName = " to create and truncate"; else if ((flags & (O_WRONLY | O_CREAT)) == (O_WRONLY | O_CREAT)) modeName = " to create"; else if ((flags & O_WRONLY) == O_WRONLY) modeName = " to write"; else if ((flags & O_RDWR) == O_RDWR) modeName = " to append"; else modeName = " to read"; errnoAbort("Can't open %s%s", fileName, modeName); } return fd; } void mustReadFd(int fd, void *buf, size_t size) /* Read size bytes from a file or squawk and die. */ { long long actualSize; if (size != 0 && (actualSize = read(fd, buf, size)) != size) { if (actualSize < 0) errnoAbort("Error reading %lld bytes", (long long)size); else errAbort("End of file reading %lld bytes (got %lld)", (long long)size, actualSize); } } void mustWriteFd(int fd, void *buf, size_t size) /* Write size bytes to file descriptor fd or die. (See man 2 write.) */ { ssize_t result = write(fd, buf, size); if (result < size) errAbort("mustWriteFd: write failed: %s", strerror(errno)); } off_t mustLseek(int fd, off_t offset, int whence) /* Seek to given offset, relative to whence (see man lseek) in file descriptor fd or errAbort. * Return final offset (e.g. if this is just an (fd, 0, SEEK_CUR) query for current position). */ { off_t ret = lseek(fd, offset, whence); if (ret < 0) errnoAbort("lseek(%d, %lld, %s (%d)) failed", fd, (long long)offset, ((whence == SEEK_SET) ? "SEEK_SET" : (whence == SEEK_CUR) ? "SEEK_CUR" : (whence == SEEK_END) ? "SEEK_END" : "invalid 'whence' value"), whence); return ret; } void mustCloseFd(int *pFd) /* Close file descriptor *pFd if >= 0, abort if there's an error, set *pFd = -1. */ { if (pFd != NULL && *pFd >= 0) { if (close(*pFd) < 0) errnoAbort("close failed"); *pFd = -1; } } char *addSuffix(char *head, char *suffix) /* Return a needMem'd string containing "headsuffix". Should be free'd when finished. */ { char *ret = NULL; int size = strlen(head) + strlen(suffix) +1; ret = needMem(sizeof(char)*size); snprintf(ret, size, "%s%s", head, suffix); return ret; } void chopSuffix(char *s) /* Remove suffix (last . in string and beyond) if any. */ { char *e = strrchr(s, '.'); if (e != NULL) *e = 0; } void chopSuffixAt(char *s, char c) /* Remove end of string from first occurrence of char c. * chopSuffixAt(s, '.') is equivalent to regular chopSuffix. */ { char *e = strrchr(s, c); if (e != NULL) *e = 0; } char *chopPrefixAt(char *s, char c) /* Like chopPrefix, but can chop on any character, not just '.' */ { char *e = strchr(s, c); if (e == NULL) return s; *e++ = 0; return e; } char *chopPrefix(char *s) /* This will replace the first '.' in a string with * 0, and return the character after this. If there * is no '.' in the string this will just return the * unchanged s passed in. */ { return chopPrefixAt(s, '.'); } boolean carefulCloseWarn(FILE **pFile) /* Close file if open and null out handle to it. * Return FALSE and print a warning message if there * is a problem.*/ { FILE *f; boolean ok = TRUE; if ((pFile != NULL) && ((f = *pFile) != NULL)) { if (f != stdin && f != stdout) { if (fclose(f) != 0) { errnoWarn("fclose failed"); ok = FALSE; } } *pFile = NULL; } return ok; } void carefulClose(FILE **pFile) /* Close file if open and null out handle to it. * Warn and abort if there's a problem. */ { if (!carefulCloseWarn(pFile)) noWarnAbort(); } char *firstWordInFile(char *fileName, char *wordBuf, int wordBufSize) /* Read the first word in file into wordBuf. */ { FILE *f = mustOpen(fileName, "r"); mustGetLine(f, wordBuf, wordBufSize); fclose(f); return trimSpaces(wordBuf); } int fileOffsetSizeCmp(const void *va, const void *vb) /* Help sort fileOffsetSize by offset. */ { const struct fileOffsetSize *a = *((struct fileOffsetSize **)va); const struct fileOffsetSize *b = *((struct fileOffsetSize **)vb); if (a->offset > b->offset) return 1; else if (a->offset == b->offset) return 0; else return -1; } struct fileOffsetSize *fileOffsetSizeMerge(struct fileOffsetSize *inList) /* Returns a new list which is inList transformed to have adjacent blocks * merged. Best to use this with a sorted list. */ { struct fileOffsetSize *newList = NULL, *newEl = NULL, *oldEl, *nextOld; for (oldEl = inList; oldEl != NULL; oldEl = nextOld) { nextOld = oldEl->next; if (nextOld != NULL && nextOld->offset < oldEl->offset) errAbort("Unsorted inList in fileOffsetSizeMerge %llu %llu", oldEl->offset, nextOld->offset); if (newEl == NULL || newEl->offset + newEl->size < oldEl->offset) { newEl = CloneVar(oldEl); slAddHead(&newList, newEl); } else { newEl->size = oldEl->offset + oldEl->size - newEl->offset; } } slReverse(&newList); return newList; } void fileOffsetSizeFindGap(struct fileOffsetSize *list, struct fileOffsetSize **pBeforeGap, struct fileOffsetSize **pAfterGap) /* Starting at list, find all items that don't have a gap between them and the previous item. * Return at gap, or at end of list, returning pointers to the items before and after the gap. */ { struct fileOffsetSize *pt, *next; for (pt = list; ; pt = next) { next = pt->next; if (next == NULL || next->offset != pt->offset + pt->size) { *pBeforeGap = pt; *pAfterGap = next; return; } } } void mustSystem(char *cmd) /* Execute cmd using "sh -c" or die. (See man 3 system.) fail on errors */ { if (cmd == NULL) // don't allow (system() supports testing for shell this way) errAbort("mustSystem: called with NULL command."); int status = system(cmd); if (status == -1) errnoAbort("error starting command: %s", cmd); else if (WIFSIGNALED(status)) errAbort("command terminated by signal %d: %s", WTERMSIG(status), cmd); else if (WIFEXITED(status)) { if (WEXITSTATUS(status) != 0) errAbort("command exited with %d: %s", WEXITSTATUS(status), cmd); } else errAbort("bug: invalid exit status for command: %s", cmd); } int roundingScale(int a, int p, int q) /* returns rounded a*p/q */ { if (a > 100000 || p > 100000) { double x = a; x *= p; x /= q; return round(x); } else return (a*p + q/2)/q; } int intAbs(int a) /* Return integer absolute value */ { return (a >= 0 ? a : -a); } int rangeIntersection(int start1, int end1, int start2, int end2) /* Return amount of bases two ranges intersect over, 0 or negative if no * intersection. */ { int s = max(start1,start2); int e = min(end1,end2); return e-s; } int positiveRangeIntersection(int start1, int end1, int start2, int end2) /* Return number of bases in intersection of two ranges, or * zero if they don't intersect. */ { int ret = rangeIntersection(start1,end1,start2,end2); if (ret < 0) ret = 0; return ret; } bits64 byteSwap64(bits64 a) /* Return byte-swapped version of a */ { union {bits64 whole; UBYTE bytes[4];} u,v; u.whole = a; v.bytes[0] = u.bytes[7]; v.bytes[1] = u.bytes[6]; v.bytes[2] = u.bytes[5]; v.bytes[3] = u.bytes[4]; v.bytes[4] = u.bytes[3]; v.bytes[5] = u.bytes[2]; v.bytes[6] = u.bytes[1]; v.bytes[7] = u.bytes[0]; return v.whole; } bits64 readBits64(FILE *f, boolean isSwapped) /* Read and optionally byte-swap 64 bit entity. */ { bits64 val; mustReadOne(f, val); if (isSwapped) val = byteSwap64(val); return val; } bits64 fdReadBits64(int fd, boolean isSwapped) /* Read and optionally byte-swap 64 bit entity. */ { bits64 val; mustReadOneFd(fd, val); if (isSwapped) val = byteSwap64(val); return val; } bits64 memReadBits64(char **pPt, boolean isSwapped) /* Read and optionally byte-swap 64 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ { bits64 val; memcpy(&val, *pPt, sizeof(val)); if (isSwapped) val = byteSwap64(val); *pPt += sizeof(val); return val; } bits32 byteSwap32(bits32 a) /* Return byte-swapped version of a */ { union {bits32 whole; UBYTE bytes[4];} u,v; u.whole = a; v.bytes[0] = u.bytes[3]; v.bytes[1] = u.bytes[2]; v.bytes[2] = u.bytes[1]; v.bytes[3] = u.bytes[0]; return v.whole; } bits32 readBits32(FILE *f, boolean isSwapped) /* Read and optionally byte-swap 32 bit entity. */ { bits32 val; mustReadOne(f, val); if (isSwapped) val = byteSwap32(val); return val; } bits32 fdReadBits32(int fd, boolean isSwapped) /* Read and optionally byte-swap 32 bit entity. */ { bits32 val; mustReadOneFd(fd, val); if (isSwapped) val = byteSwap32(val); return val; } bits32 memReadBits32(char **pPt, boolean isSwapped) /* Read and optionally byte-swap 32 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ { bits32 val; memcpy(&val, *pPt, sizeof(val)); if (isSwapped) val = byteSwap32(val); *pPt += sizeof(val); return val; } bits16 byteSwap16(bits16 a) /* Return byte-swapped version of a */ { union {bits16 whole; UBYTE bytes[2];} u,v; u.whole = a; v.bytes[0] = u.bytes[1]; v.bytes[1] = u.bytes[0]; return v.whole; } bits16 readBits16(FILE *f, boolean isSwapped) /* Read and optionally byte-swap 16 bit entity. */ { bits16 val; mustReadOne(f, val); if (isSwapped) val = byteSwap16(val); return val; } bits16 fdReadBits16(int fd, boolean isSwapped) /* Read and optionally byte-swap 16 bit entity. */ { bits16 val; mustReadOneFd(fd, val); if (isSwapped) val = byteSwap16(val); return val; } bits16 memReadBits16(char **pPt, boolean isSwapped) /* Read and optionally byte-swap 16 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ { bits16 val; memcpy(&val, *pPt, sizeof(val)); if (isSwapped) val = byteSwap16(val); *pPt += sizeof(val); return val; } double byteSwapDouble(double a) /* Return byte-swapped version of a */ { union {double whole; UBYTE bytes[4];} u,v; u.whole = a; v.bytes[0] = u.bytes[7]; v.bytes[1] = u.bytes[6]; v.bytes[2] = u.bytes[5]; v.bytes[3] = u.bytes[4]; v.bytes[4] = u.bytes[3]; v.bytes[5] = u.bytes[2]; v.bytes[6] = u.bytes[1]; v.bytes[7] = u.bytes[0]; return v.whole; } double readDouble(FILE *f, boolean isSwapped) /* Read and optionally byte-swap double-precision floating point entity. */ { double val; mustReadOne(f, val); if (isSwapped) val = byteSwapDouble(val); return val; } double memReadDouble(char **pPt, boolean isSwapped) /* Read and optionally byte-swap double-precision floating point entity * from memory buffer pointed to by *pPt, and advance *pPt past read area. */ { double val; memcpy(&val, *pPt, sizeof(val)); if (isSwapped) val = byteSwapDouble(val); *pPt += sizeof(val); return val; } float byteSwapFloat(float a) /* Return byte-swapped version of a */ { union {float whole; UBYTE bytes[4];} u,v; u.whole = a; v.bytes[0] = u.bytes[3]; v.bytes[1] = u.bytes[2]; v.bytes[2] = u.bytes[1]; v.bytes[3] = u.bytes[0]; return v.whole; } float readFloat(FILE *f, boolean isSwapped) /* Read and optionally byte-swap single-precision floating point entity. */ { float val; mustReadOne(f, val); if (isSwapped) val = byteSwapFloat(val); return val; } float memReadFloat(char **pPt, boolean isSwapped) /* Read and optionally byte-swap single-precision floating point entity * from memory buffer pointed to by *pPt, and advance *pPt past read area. */ { float val; memcpy(&val, *pPt, sizeof(val)); if (isSwapped) val = byteSwapFloat(val); *pPt += sizeof(val); return val; } void removeReturns(char *dest, char *src) /* Removes the '\r' character from a string. * The source and destination strings can be the same, if there are * no other threads */ { int i = 0; int j = 0; /* until the end of the string */ for (;;) { /* skip the returns */ while(src[j] == '\r') j++; /* copy the characters */ dest[i] = src[j]; /* check to see if done */ if(src[j] == '\0') break; /* advance the counters */ i++; j++; } } char* readLine(FILE* fh) /* Read a line of any size into dynamic memory, return null on EOF */ { int bufCapacity = 256; int bufSize = 0; char* buf = needMem(bufCapacity); int ch; /* loop until EOF of EOLN */ while (((ch = getc(fh)) != EOF) && (ch != '\n')) { /* expand if almost full, always keep one extra char for * zero termination */ if (bufSize >= bufCapacity-2) { bufCapacity *= 2; buf = realloc(buf, bufCapacity); if (buf == NULL) { errAbort("Out of memory in readline - request size %d bytes", bufCapacity); } } buf[bufSize++] = ch; } /* only return EOF if no data was read */ if ((ch == EOF) && (bufSize == 0)) { freeMem(buf); return NULL; } buf[bufSize] = '\0'; return buf; } boolean fileExists(char *fileName) /* Return TRUE if file exists (may replace this with non- * portable faster way some day). */ { /* To make piping easier stdin and stdout always exist. */ if (sameString(fileName, "stdin")) return TRUE; if (sameString(fileName, "stdout")) return TRUE; return fileSize(fileName) != -1; } /* Friendly name for strstrNoCase */ char *containsStringNoCase(char *haystack, char *needle) { return strstrNoCase(haystack, needle); } char *strstrNoCase(char *haystack, char *needle) /* A case-insensitive strstr function Will also robustly handle null strings param haystack - The string to be searched param needle - The string to look for in the haystack string return - The position of the first occurence of the desired substring or -1 if it is not found */ { char *haystackCopy = NULL; char *needleCopy = NULL; int index = 0; int haystackLen = 0; int needleLen = 0; char *p, *q; if (NULL == haystack || NULL == needle) { return NULL; } haystackLen = strlen(haystack); needleLen = strlen(needle); haystackCopy = (char*) needMem(haystackLen + 1); needleCopy = (char*) needMem(needleLen + 1); for(index = 0; index < haystackLen; index++) { haystackCopy[index] = tolower(haystack[index]); } haystackCopy[haystackLen] = 0; /* Null terminate */ for(index = 0; index < needleLen; index++) { needleCopy[index] = tolower(needle[index]); } needleCopy[needleLen] = 0; /* Null terminate */ p=strstr(haystackCopy, needleCopy); q=haystackCopy; freeMem(haystackCopy); freeMem(needleCopy); if(p==NULL) return NULL; return p-q+haystack; } int vasafef(char* buffer, int bufSize, char *format, va_list args) /* Format string to buffer, vsprintf style, only with buffer overflow * checking. The resulting string is always terminated with zero byte. */ { int sz = vsnprintf(buffer, bufSize, format, args); /* note that some version return -1 if too small */ if ((sz < 0) || (sz >= bufSize)) { buffer[bufSize-1] = (char) 0; errAbort("buffer overflow, size %d, format: %s, buffer: '%s'", bufSize, format, buffer); } return sz; } int safef(char* buffer, int bufSize, char *format, ...) /* Format string to buffer, vsprintf style, only with buffer overflow * checking. The resulting string is always terminated with zero byte. */ { int sz; va_list args; va_start(args, format); sz = vasafef(buffer, bufSize, format, args); va_end(args); return sz; } void safecpy(char *buf, size_t bufSize, const char *src) /* copy a string to a buffer, with bounds checking.*/ { size_t slen = strlen(src); if (slen > bufSize-1) errAbort("buffer overflow, size %lld, string size: %lld", (long long)bufSize, (long long)slen); strcpy(buf, src); } void safencpy(char *buf, size_t bufSize, const char *src, size_t n) /* copy n characters from a string to a buffer, with bounds checking. * Unlike strncpy, always null terminates the result */ { if (n > bufSize-1) errAbort("buffer overflow, size %lld, substring size: %lld", (long long)bufSize, (long long)n); size_t slen = strlen(src); if (slen > n) slen = n; strncpy(buf, src, n); buf[slen] = '\0'; } void safecat(char *buf, size_t bufSize, const char *src) /* Append a string to a buffer, with bounds checking.*/ { size_t blen = strlen(buf); size_t slen = strlen(src); if (blen+slen > bufSize-1) errAbort("buffer overflow, size %lld, new string size: %lld", (long long)bufSize, (long long)(blen+slen)); strcat(buf, src); } void safencat(char *buf, size_t bufSize, const char *src, size_t n) /* append n characters from a string to a buffer, with bounds checking. */ { size_t blen = strlen(buf); if (blen+n > bufSize-1) errAbort("buffer overflow, size %lld, new string size: %lld", (long long)bufSize, (long long)(blen+n)); size_t slen = strlen(src); if (slen > n) slen = n; strncat(buf, src, n); buf[blen+slen] = '\0'; } static char *naStr = "n/a"; static char *emptyStr = ""; char *naForNull(char *s) /* Return 'n/a' if s is NULL, otherwise s. */ { if (s == NULL) s = naStr; return s; } char *naForEmpty(char *s) /* Return n/a if s is "" or NULL, otherwise s. */ { if (s == NULL || s[0] == 0) s = naStr; return s; } char *emptyForNull(char *s) /* Return "" if s is NULL, otherwise s. */ { if (s == NULL) s = emptyStr; return s; } char *nullIfAllSpace(char *s) /* Return NULL if s is all spaces, otherwise s. */ { s = skipLeadingSpaces(s); if (s != NULL) if (s[0] == 0) s = NULL; return s; } char *trueFalseString(boolean b) /* Return "true" or "false" */ { return (b ? "true" : "false"); } void uglyTime(char *label, ...) /* Print label and how long it's been since last call. Call with * a NULL label to initialize. */ { static long lastTime = 0; long time = clock1000(); va_list args; va_start(args, label); if (label != NULL) { fprintf(stdout, ""); vfprintf(stdout, label, args); fprintf(stdout, ": %ld millis
    \n", time - lastTime); } lastTime = time; va_end(args); } void makeDirs(char* path) /* make a directory, including parent directories */ { char pathBuf[PATH_LEN]; char* next = pathBuf; strcpy(pathBuf, path); if (*next == '/') next++; while((*next != '\0') && (next = strchr(next, '/')) != NULL) { *next = '\0'; makeDir(pathBuf); *next = '/'; next++; } makeDir(pathBuf); } char *skipNumeric(char *s) /* Return first char of s that's not a digit */ { while (isdigit(*s)) ++s; return s; } char *skipToNumeric(char *s) /* skip up to where numeric digits appear */ { while (*s != 0 && !isdigit(*s)) ++s; return s; } char *splitOffNonNumeric(char *s) /* Split off non-numeric part, e.g. mm of mm8. Result should be freed when done */ { return cloneStringZ(s,skipToNumeric(s)-s); } char *splitOffNumber(char *db) /* Split off number part, e.g. 8 of mm8. Result should be freed when done */ { return cloneString(skipToNumeric(db)); } #ifndef WIN32 time_t mktimeFromUtc (struct tm *t) /* Return time_t for tm in UTC (GMT) * Useful for stuff like converting to time_t the * last-modified HTTP response header * which is always GMT. Returns -1 on failure of mktime */ { time_t time; char *tz; char save_tz[100]; tz=getenv("TZ"); if (tz) safecpy(save_tz, sizeof(save_tz), tz); setenv("TZ", "GMT0", 1); tzset(); t->tm_isdst = 0; time=mktime(t); if (tz) setenv("TZ", save_tz, 1); else unsetenv("TZ"); tzset(); return (time); } time_t dateToSeconds(const char *date,const char*format) // Convert a string date to time_t { struct tm storage={0,0,0,0,0,0,0,0,0}; if(strptime(date,format,&storage)==NULL) return 0; else return mktime(&storage); } boolean dateIsOld(const char *date,const char*format) // Is this string date older than now? { time_t test = dateToSeconds(date,format); time_t now = clock1(); return (test < now); } static int daysOfMonth(struct tm *tp) /* Returns the days of the month given the year */ { int days=0; switch(tp->tm_mon) { case 3: case 5: case 8: case 10: days = 30; break; case 1: days = 28; if( (tp->tm_year % 4) == 0 && ((tp->tm_year % 20) != 0 || (tp->tm_year % 100) == 0) ) days = 29; break; default: days = 31; break; } return days; } static void dateAdd(struct tm *tp,int addYears,int addMonths,int addDays) /* Add years,months,days to a date */ { tp->tm_mday += addDays; tp->tm_mon += addMonths; tp->tm_year += addYears; int dom=28; while( (tp->tm_mon >11 || tp->tm_mon <0) || (tp->tm_mday>dom || tp->tm_mday<1) ) { if(tp->tm_mon>11) // First month: tm.tm_mon is 0-11 range { tp->tm_year += (tp->tm_mon / 12); tp->tm_mon = (tp->tm_mon % 12); } else if(tp->tm_mon<0) { tp->tm_year += (tp->tm_mon / 12) - 1; tp->tm_mon = (tp->tm_mon % 12) + 12; } else { dom = daysOfMonth(tp); if(tp->tm_mday>dom) { tp->tm_mday -= dom; tp->tm_mon += 1; dom = daysOfMonth(tp); } else if(tp->tm_mday < 1) { tp->tm_mon -= 1; dom = daysOfMonth(tp); tp->tm_mday += dom; } } } } char *dateAddTo(char *date,char *format,int addYears,int addMonths,int addDays) /* Add years,months,days to a formatted date and returns the new date as a cloned string * format is a strptime/strftime format: %F = yyyy-mm-dd */ { char *newDate = needMem(12); struct tm tp; if(strptime (date,format, &tp)) { dateAdd(&tp,addYears,addMonths,addDays); // tp.tm_year only contains years since 1900 strftime(newDate,12,format,&tp); } return cloneString(newDate); // newDate is never freed! } #endif rtracklayer/src/ucsc/common.h0000644000126300012640000013615712227135242017662 0ustar00biocbuildphs_compbio/* Common.h - functions that are commonly used. Includes * routines for managing singly linked lists, some basic * string manipulation stuff, and other stuff of the * short but useful nature. * * This file is copyright 2002-2005 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef COMMON_H /* Wrapper to avoid including this twice. */ #define COMMON_H /* Some stuff to support large files in Linux. */ #ifndef _LARGEFILE_SOURCE #define _LARGEFILE_SOURCE 1 #endif #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #ifndef _FILE_OFFSET_BITS #define _FILE_OFFSET_BITS 64 #endif /* Some stuff for safer pthreads. */ #ifndef _REENTRANT #define _REENTRANT #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(MACHTYPE_ppc) #include #endif #if defined(__APPLE__) #if defined(__i686__) /* The i686 apple math library defines warn. */ #define warn jkWarn #endif #endif #ifndef NAN #define NAN (0.0 / 0.0) #endif #ifndef WIFEXITED #define WIFEXITED(stat) (((*((int *) &(stat))) & 0xff) == 0) #endif #ifndef WEXITSTATUS #define WEXITSTATUS(stat) (short)(((*((int *) &(stat))) >> 8) & 0xffff) #endif #ifndef WIFSIGNALED #define WIFSIGNALED(stat) (((*((int *) &(stat)))) && ((*((int *) &(stat))) == ((*((int *) &(stat))) &0x00ff))) #endif #ifndef WTERMSIG #define WTERMSIG(stat) ((*((int *) &(stat))) & 0x7f) #endif #ifndef WIFSTOPPED #define WIFSTOPPED(stat) (((*((int *) &(stat))) & 0xff) == 0177) #endif #ifndef WSTOPSIG #define WSTOPSIG(stat) (((*((int *) &(stat))) >> 8) & 0xff) #endif #ifndef HUGE #define HUGE MAXFLOAT #endif /* Let's pretend C has a boolean type. */ #define TRUE 1 #define FALSE 0 #define boolean int #ifndef __cplusplus #ifndef bool #define bool char #endif #endif /* Some other type synonyms */ #define UBYTE unsigned char /* Wants to be unsigned 8 bits. */ #define BYTE signed char /* Wants to be signed 8 bits. */ #define UWORD unsigned short /* Wants to be unsigned 16 bits. */ #define WORD short /* Wants to be signed 16 bits. */ #define bits64 unsigned long long /* Wants to be unsigned 64 bits. */ #define bits32 unsigned /* Wants to be unsigned 32 bits. */ #define bits16 unsigned short /* Wants to be unsigned 16 bits. */ #define bits8 unsigned char /* Wants to be unsigned 8 bits. */ #define signed32 int /* Wants to be signed 32 bits. */ #define bits8 unsigned char /* Wants to be unsigned 8 bits. */ #define BIGNUM 0x3fffffff /* A really big number */ #define BIGDOUBLE 1.7E+308 /* Close to biggest double-precision number */ #define LIMIT_2or8GB (2147483647 * ((sizeof(size_t)/4)*(sizeof(size_t)/4))) /* == 2 Gb for 32 bit machines, 8 Gb for 64 bit machines */ #define LIMIT_2or6GB (2147483647 + (2147483647 * ((sizeof(size_t)/4)-1)) + \ (2147483647 * ((sizeof(size_t)/4)-1))) /* == 2 Gb for 32 bit machines, 6 Gb for 64 bit machines */ /* Default size of directory path, file name and extension string buffers */ #define PATH_LEN 512 #define FILENAME_LEN 128 #define FILEEXT_LEN 64 /* inline functions: To declare a function inline, place the entire function * in a header file and prefix it with the INLINE macro. If used with a * compiler that doesn't support inline, change the INLINE marco to be simply * `static'. */ #ifndef INLINE #define INLINE static inline #endif /* stdargs compatibility: in a unix universe a long time ago, types of va_list * were passed by value. It was assume one could do things like: * * va_start(args); * vfprintf(fh1, fmt, args); * vfprintf(fh2, fmt, args); * va_end(args); * * and life would good. However this is not true on some modern systems (for * instance gcc/glibc on x86_64), where va_args can be a pointer to some type * of object). The second call to vfprintf() would then crash, since the * first call modified the object that va_args was pointing to. C99 adds a * va_copy macro that to address this issue. Many non-C99 system include this * macro, sometimes called __va_copy. Here we ensure that va_copy is defined. * If if doesn't exist, we try to define it in terms of __va_copy. If that is * not available, we make the assumption that va_list can be copied by value * and create our own. Our implementation is the same as used on Solaris. */ #if defined(__va_copy) && !defined(va_copy) # define va_copy __va_copy #endif #if !defined(va_copy) # define va_copy(to, from) ((to) = (from)) #endif /* Cast a pointer to a long long. Use to printf format points as long-longs * in a 32/64bit portable manner. Format should use %llx for the result. * Needed because casting a pointer to a different sized number cause a * warning with gcc */ #define ptrToLL(p) ((long long)((size_t)p)) /* How big is this array? */ #define ArraySize(a) (sizeof(a)/sizeof((a)[0])) #define uglyf printf /* debugging printf */ #define uglyAbort errAbort /* debugging error abort. */ #define uglyOut stdout /* debugging fprintf target. */ void *needMem(size_t size); /* Need mem calls abort if the memory allocation fails. The memory * is initialized to zero. */ void *needLargeMem(size_t size); /* This calls abort if the memory allocation fails. The memory is * not initialized to zero. */ void *needLargeZeroedMem(size_t size); /* Request a large block of memory and zero it. */ void *needLargeMemResize(void* vp, size_t size); /* Adjust memory size on a block, possibly relocating it. If vp is NULL, * a new memory block is allocated. Memory not initted. */ void *needLargeZeroedMemResize(void* vp, size_t oldSize, size_t newSize); /* Adjust memory size on a block, possibly relocating it. If vp is NULL, a * new memory block is allocated. If block is grown, new memory is zeroed. */ void *needHugeMem(size_t size); /* No checking on size. Memory not initted to 0. */ void *needHugeZeroedMem(size_t size); /* Request a large block of memory and zero it. */ void *needHugeMemResize(void* vp, size_t size); /* Adjust memory size on a block, possibly relocating it. If vp is NULL, * a new memory block is allocated. No checking on size. Memory not * initted. */ void *needHugeZeroedMemResize(void* vp, size_t oldSize, size_t newSize); /* Adjust memory size on a block, possibly relocating it. If vp is NULL, a * new memory block is allocated. No checking on size. If block is grown, * new memory is zeroed. */ void *needMoreMem(void *old, size_t copySize, size_t newSize); /* Allocate a new buffer, copy old buffer to it, free old buffer. */ void *cloneMem(void *pt, size_t size); /* Allocate a new buffer of given size, and copy pt to it. */ #define CloneVar(pt) cloneMem(pt, sizeof((pt)[0])) /* Allocate copy of a structure. */ void *wantMem(size_t size); /* Want mem just calls malloc - no zeroing of memory, no * aborting if request fails. */ void freeMem(void *pt); /* Free memory will check for null before freeing. */ void freez(void *ppt); /* Pass address of pointer. Will free pointer and set it * to NULL. Typical use: * s = needMem(1024); * ... * freez(&s); */ #define AllocVar(pt) (pt = needMem(sizeof(*pt))) /* Shortcut to allocating a single variable on the heap and * assigning pointer to it. */ #define AllocArray(pt, size) (pt = needLargeZeroedMem(sizeof(*pt) * (size))) #define AllocA(type) needMem(sizeof(type)) /* Shortcut to allocating a variable on heap of a specific type. */ #define AllocN(type,count) ((type*)needLargeZeroedMem(sizeof(type) * (count))) /* Shortcut to allocating an array on the heap of a specific type. */ #define ExpandArray(array, oldCount, newCount) \ (array = needMoreMem((array), (oldCount)*sizeof((array)[0]), (newCount)*sizeof((array)[0]))) /* Expand size of dynamically allocated array. */ #define CopyArray(source, dest,count) memcpy(dest,source,(count)*sizeof(dest[0])) /* Copy count elements of array from source to dest. */ #define CloneArray(a, count) cloneMem(a, (count)*sizeof(a[0])) /* Make new dynamic array initialized with count elements of a */ void errAbort(char *format, ...) /* Abort function, with optional (printf formatted) error message. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; void errnoAbort(char *format, ...) /* Prints error message from UNIX errno first, then does errAbort. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; #define internalErr() errAbort("Internal error %s %d", __FILE__, __LINE__) /* Generic internal error message */ void warn(char *format, ...) /* Issue a warning message. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; void warnWithBackTrace(char *format, ...) /* Issue a warning message and append backtrace. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; void verbose(int verbosity, char *format, ...) /* Write printf formatted message to log (which by * default is stdout) if global verbose variable * is set to verbosity or higher. Default level is 1. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; void verboseTimeInit(void); /* Initialize or reinitialize the previous time for use by verboseTime. */ void verboseTime(int verbosity, char *label, ...) /* Print label and how long it's been since last call. Start time can be * initialized with verboseTimeInit, otherwise the elapsed time will be * zero. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; void verboseDot(); /* Write I'm alive dot (at verbosity level 1) */ int verboseLevel(); /* Get verbosity level. */ void verboseSetLevel(int verbosity); /* Set verbosity level in log. 0 for no logging, * higher number for increasing verbosity. */ INLINE void zeroBytes(void *vpt, int count) /* fill a specified area of memory with zeroes */ { memset(vpt, '\0', count); } #define ZeroVar(v) zeroBytes(v, sizeof(*v)) void reverseBytes(char *bytes, long length); /* Reverse the order of the bytes. */ void reverseInts(int *a, int length); /* Reverse the order of the integer array. */ void reverseUnsigned(unsigned *a, int length); /* Reverse the order of the unsigned array. */ void reverseDoubles(double *a, int length); /* Reverse the order of the double array. */ void reverseStrings(char **a, int length); /* Reverse the order of the char* array. */ void swapBytes(char *a, char *b, int length); /* Swap buffers a and b. */ /* Some things to manage simple lists - structures that begin * with a pointer to the next element in the list. */ struct slList { struct slList *next; }; int slCount(const void *list); /* Return # of elements in list. */ void *slElementFromIx(void *list, int ix); /* Return the ix'th element in list. Returns NULL * if no such element. */ int slIxFromElement(void *list, void *el); /* Return index of el in list. Returns -1 if not on list. */ INLINE void slAddHead(void *listPt, void *node) /* Add new node to start of list. * Usage: * slAddHead(&list, node); * where list and nodes are both pointers to structure * that begin with a next pointer. */ { struct slList **ppt = (struct slList **)listPt; struct slList *n = (struct slList *)node; n->next = *ppt; *ppt = n; } INLINE void slSafeAddHead(void *listPt, void *node) /* Add new node to start of list. Now that slAddHead is an inline instead of * a macro, this function is obsolete. */ { slAddHead(listPt, node); } void slAddTail(void *listPt, void *node); /* Add new node to tail of list. * Usage: * slAddTail(&list, node); * where list and nodes are both pointers to structure * that begin with a next pointer. This is sometimes * convenient but relatively slow. For longer lists * it's better to slAddHead, and slReverse when done. */ void *slPopHead(void *listPt); /* Return head of list and remove it from list. (Fast) */ void *slPopTail(void *listPt); /* Return tail of list and remove it from list. (Not so fast) */ void *slCat(void *a, void *b); /* Return concatenation of lists a and b. * Example Usage: * struct slName *a = getNames("a"); * struct slName *b = getNames("b"); * struct slName *ab = slCat(a,b) * After this it is no longer safe to use a or b. */ void *slLastEl(void *list); /* Returns last element in list or NULL if none. */ void slReverse(void *listPt); /* Reverse order of a list. * Usage: * slReverse(&list); */ typedef int CmpFunction(const void *elem1, const void *elem2); void slSort(void *pList, CmpFunction *compare); /* Sort a singly linked list with Qsort and a temporary array. * The arguments to the compare function in real, non-void, life * are pointers to pointers. */ void slUniqify(void *pList, CmpFunction *compare, void (*free)()); /* Return sorted list with duplicates removed. * Compare should be same type of function as slSort's compare (taking * pointers to pointers to elements. Free should take a simple * pointer to dispose of duplicate element, and can be NULL. */ boolean slRemoveEl(void *vpList, void *vToRemove); /* Remove element from doubly linked list. Usage: * slRemove(&list, el); * Returns TRUE if element in list. */ void slFreeList(void *listPt); /* Free all elements in list and set list pointer to null. * Usage: * slFreeList(&list); */ struct slInt /* List of integers. */ { struct slInt *next; /* Next in list. */ int val; /* Integer value. */ }; struct slInt *slIntNew(int x); #define newSlInt slIntNew /* Return a new double. */ int slIntCmp(const void *va, const void *vb); /* Compare two slInts. */ int slIntCmpRev(const void *va, const void *vb); /* Compare two slInts in reverse direction. */ struct slInt * slIntFind(struct slInt *list, int target); /* Find target in slInt list or return NULL */ void doubleSort(int count, double *array); /* Sort an array of doubles. */ double doubleMedian(int count, double *array); /* Return median value in array. This will sort * the array as a side effect. */ void doubleBoxWhiskerCalc(int count, double *array, double *retMin, double *retQ1, double *retMedian, double *retQ3, double *retMax); /* Calculate what you need to draw a box and whiskers plot from an array of doubles. */ struct slDouble /* List of double-precision numbers. */ { struct slDouble *next; /* Next in list. */ double val; /* Double-precision value. */ }; struct slDouble *slDoubleNew(double x); #define newSlDouble slDoubleNew /* Return a new int. */ int slDoubleCmp(const void *va, const void *vb); /* Compare two slDoubles. */ double slDoubleMedian(struct slDouble *list); /* Return median value on list. */ void slDoubleBoxWhiskerCalc(struct slDouble *list, double *retMin, double *retQ1, double *retMedian, double *retQ3, double *retMax); /* Calculate what you need to draw a box and whiskers plot from a list of slDoubles. */ void intSort(int count, int *array); /* Sort an array of ints. */ int intMedian(int count, int *array); /* Return median value in array. This will sort * the array as a side effect. */ struct slName /* List of names. The name array is allocated to accommodate full name */ { struct slName *next; /* Next in list. */ char name[1]; /* Allocated at run time to length of string. */ }; struct slName *newSlName(char *name); #define slNameNew newSlName /* Return a new slName. */ #define slNameFree freez /* Free a single slName */ #define slNameFreeList slFreeList /* Free a list of slNames */ struct slName *slNameNewN(char *name, int size); /* Return new slName of given size. */ int slNameCmpCase(const void *va, const void *vb); /* Compare two slNames, ignore case. */ int slNameCmp(const void *va, const void *vb); /* Compare two slNames. */ int slNameCmpStringsWithEmbeddedNumbers(const void *va, const void *vb); /* Compare strings such as gene names that may have embedded numbers, * so that bmp4a comes before bmp14a */ void slNameSortCase(struct slName **pList); /* Sort slName list, ignore case. */ void slNameSort(struct slName **pList); /* Sort slName list. */ boolean slNameInList(struct slName *list, char *string); /* Return true if string is in name list -- case insensitive. */ boolean slNameInListUseCase(struct slName *list, char *string); /* Return true if string is in name list -- case sensitive. */ void *slNameFind(void *list, char *string); /* Return first element of slName list (or any other list starting * with next/name fields) that matches string. */ int slNameFindIx(struct slName *list, char *string); /* Return index of first element of slName list (or any other * list starting with next/name fields) that matches string. * ... Return -1 if not found. */ char *slNameStore(struct slName **pList, char *string); /* Put string into list if it's not there already. * Return the version of string stored in list. */ struct slName *slNameAddHead(struct slName **pList, char *name); /* Add name to start of list and return it. */ struct slName *slNameAddTail(struct slName **pList, char *name); /* Add name to end of list (not efficient for long lists), * and return it. */ struct slName *slNameCloneList(struct slName *list); /* Return clone of list. */ struct slName *slNameListFromString(char *s, char delimiter); /* Return list of slNames gotten from parsing delimited string. * The final delimiter is optional. a,b,c and a,b,c, are equivalent * for comma-delimited lists. */ #define slNameListFromComma(s) slNameListFromString(s, ',') /* Parse out comma-separated list. */ struct slName *slNameListOfUniqueWords(char *text,boolean respectQuotes); // Return list of unique words found by parsing string delimited by whitespace. // If respectQuotes then ["Lucy and Ricky" 'Fred and Ethyl'] will yield 2 slNames no quotes struct slName *slNameListFromStringArray(char *stringArray[], int arraySize); /* Return list of slNames from an array of strings of length arraySize. * If a string in the array is NULL, the array will be treated as * NULL-terminated. */ char *slNameListToString(struct slName *list, char delimiter); /* Return string created by joining all names with the delimiter. */ struct slName *slNameLoadReal(char *fileName); /* load file lines that are not blank or start with a '#' into a slName * list */ struct slName *slNameIntersection(struct slName *a, struct slName *b); /* return intersection of two slName lists. */ struct slRef /* Singly linked list of generic references. */ { struct slRef *next; /* Next in list. */ void *val; /* A reference to something. */ }; struct slRef *slRefNew(void *val); /* Create new slRef element. */ struct slRef *refOnList(struct slRef *refList, void *val); /* Return ref if val is already on list, otherwise NULL. */ void refAdd(struct slRef **pRefList, void *val); /* Add reference to list. */ void refAddUnique(struct slRef **pRefList, void *val); /* Add reference to list if not already on list. */ struct slRef *refListFromSlList(void *list); /* Make a reference list that mirrors a singly-linked list. */ struct slPair /* A name/value pair. */ { struct slPair *next; /* Next in list. */ char *name; /* Name of item. */ void *val; /* Pointer to item data. */ }; struct slPair *slPairNew(char *name, void *val); /* Allocate new name/value pair. */ void slPairAdd(struct slPair **pList, char *name, void *val); /* Add new slPair to head of list. */ void slPairFree(struct slPair **pEl); /* Free up struct and name. (Don't free up values.) */ void slPairFreeList(struct slPair **pList); /* Free up list. (Don't free up values.) */ void slPairFreeVals(struct slPair *list); /* Free up all values on list. */ void slPairFreeValsAndList(struct slPair **pList); /* Free up all values on list and list itself */ struct slPair *slPairFind(struct slPair *list, char *name); /* Return list element of given name, or NULL if not found. */ void *slPairFindVal(struct slPair *list, char *name); /* Return value associated with name in list, or NULL if not found. */ struct slPair *slPairListFromString(char *str,boolean respectQuotes); // Return slPair list parsed from list in string like: [name1=val1 name2=val2 ...] // if respectQuotes then string can have double quotes: [name1="val 1" "name 2"=val2 ...] // resulting pair strips quotes: {name1}={val 1},{name 2}={val2} // Returns NULL if parse error. Free this up with slPairFreeValsAndList. #define slPairFromString(s) slPairListFromString(s,FALSE) char *slPairListToString(struct slPair *list,boolean quoteIfSpaces); // Returns an allocated string of pairs in form of [name1=val1 name2=val2 ...] // If requested, will wrap name or val in quotes if contain spaces: [name1="val 1" "name 2"=val2] char *slPairNameToString(struct slPair *list, char delimiter,boolean quoteIfSpaces); // Return string created by joining all names (ignoring vals) with the delimiter. // If requested, will wrap name in quotes if contain spaces: [name1,"name 2" ...] int slPairCmpCase(const void *va, const void *vb); /* Compare two slPairs, ignore case. */ void slPairSortCase(struct slPair **pList); /* Sort slPair list, ignore case. */ int slPairCmp(const void *va, const void *vb); /* Compare two slPairs. */ int slPairValCmpCase(const void *va, const void *vb); /* Case insensitive compare two slPairs on their values (must be string). */ int slPairValCmp(const void *va, const void *vb); /* Compare two slPairs on their values (must be string). */ void slPairValSortCase(struct slPair **pList); /* Sort slPair list on values (must be string), ignore case. */ void slPairValSort(struct slPair **pList); /* Sort slPair list on values (must be string). */ int slPairIntCmp(const void *va, const void *vb); // Compare two slPairs on their integer values. void slPairIntSort(struct slPair **pList); // Sort slPair list on integer values. int slPairAtoiCmp(const void *va, const void *vb); // Compare two slPairs on their strings interpreted as integer values. void slPairValAtoiSort(struct slPair **pList); // Sort slPair list on string values interpreted as integers. void gentleFree(void *pt); /* check pointer for NULL before freeing. * (Actually plain old freeMem does that these days.) */ /******* Some stuff for processing strings. *******/ char *cloneStringZ(const char *s, int size); /* Make a zero terminated copy of string in memory */ char *cloneString(const char *s); /* Make copy of string in dynamic memory */ char *cloneLongString(char *s); /* Make clone of long string. */ char *catTwoStrings(char *a, char *b); /* Allocate new string that is a concatenation of two strings. */ int differentWord(char *s1, char *s2); /* strcmp ignoring case - returns zero if strings are * the same (ignoring case) otherwise returns difference * between first non-matching characters. */ #define sameWord(a,b) (!differentWord(a,b)) /* Return TRUE if two strings are same ignoring case */ #define differentString(a,b) (strcmp(a,b)) /* Returns FALSE if two strings same. */ int differentStringNullOk(char *a, char *b); /* Returns 0 if two strings (either of which may be NULL) * are the same. Otherwise it returns a positive or negative * number depending on the alphabetical order of the two * strings. * This is basically a strcmp that can handle NULLs in * the input. If used in a sort the NULLs will end * up before any of the cases with data. */ #define sameOk(a,b) (differentStringNullOk(a,b) == 0) /* returns TRUE if two strings same, NULLs OK */ #define sameString(a,b) (strcmp(a,b)==0) /* Returns TRUE if two strings same. */ #define sameStringN(a,b,c) (strncmp(a,b,c)==0) /* Returns TRUE if two strings start with the same c characters. */ #define isEmpty(string) ((string) == NULL || (string)[0] == 0) #define isNotEmpty(string) (! isEmpty(string)) int cmpStringsWithEmbeddedNumbers(const char *a, const char *b); /* Compare strings such as gene names that may have embedded numbers, * so that bmp4a comes before bmp14a */ int cmpWordsWithEmbeddedNumbers(const char *a, const char *b); /* Case insensitive version of cmpStringsWithEmbeddedNumbers. */ boolean startsWith(const char *start, const char *string); /* Returns TRUE if string begins with start. */ boolean startsWithWord(char *firstWord, char *line); /* Return TRUE if first white-space-delimited word in line * is same as firstWord. Comparison is case sensitive. */ boolean startsWithWordByDelimiter(char *firstWord,char delimit, char *line); /* Return TRUE if first word in line is same as firstWord as delimited by delimit. Comparison is case sensitive. Delimit of ' ' uses isspace() */ #define stringIn(needle, haystack) strstr(haystack, needle) /* Returns position of needle in haystack or NULL if it's not there. */ /* char *stringIn(char *needle, char *haystack); */ char *rStringIn(char *needle, char *haystack); /* Return last position of needle in haystack, or NULL if it's not there. */ char *stringBetween(char *start, char *end, char *haystack); /* Return string between start and end strings, or NULL if * none found. The first such instance is returned. * String must be freed by caller. */ char * findWordByDelimiter(char *word,char delimit, char *line); /* Return pointer to first word in line matching 'word' and delimited by 'delimit'. Comparison is case sensitive. Delimit of ' ' uses isspace() */ boolean endsWith(char *string, char *end); /* Returns TRUE if string ends with end. */ char lastChar(char *s); /* Return last character in string. */ char *lastNonwhitespaceChar(char *s); // Return pointer to last character in string that is not whitespace. char *matchingCharBeforeInLimits(char *limit, char *s, char c); /* Look for character c sometime before s, but going no further than limit. * Return NULL if not found. */ boolean wildMatch(const char *wildCard, const char *string); /* does a case insensitive wild card match with a string. * * matches any string or no character. * ? matches any single character. * anything else etc must match the character exactly. */ boolean sqlMatchLike(char *wildCard, char *string); /* Match using % and _ wildcards. */ boolean anyWild(const char *string); /* Return TRUE if any wild card characters in string. */ char *memMatch(char *needle, int nLen, char *haystack, int hLen); /* Returns first place where needle (of nLen chars) matches * haystack (of hLen chars) */ void toUpperN(char *s, int n); /* Convert a section of memory to upper case. */ void toLowerN(char *s, int n); /* Convert a section of memory to lower case. */ void toggleCase(char *s, int size); /* toggle upper and lower case chars in string. */ char *strUpper(char *s); #define touppers(s) (void)strUpper(s) /* Convert entire string to upper case. */ char *strLower(char *s); #define tolowers(s) (void)strLower(s) /* Convert entire string to lower case */ char *replaceChars(char *string, char *oldStr, char *newStr); /* Replaces the old with the new. The old and new string need not be of equal size Can take any length string. Return value needs to be freeMem'd. */ int strSwapStrs(char *string, int sz,char *oldStr, char *newStr); /* Swaps all occurrences of the oldStr with the newStr in string. Need not be same size Swaps in place but restricted by sz. Returns count of swaps or -1 for sz failure.*/ char * memSwapChar(char *s, int len, char oldChar, char newChar); /* Substitute newChar for oldChar throughout memory of given length. old or new may be null */ #define strSwapChar(s,old,new) memSwapChar((s),strlen(s),(old),(new)) #define subChar(s,old,new) (void)memSwapChar((s),strlen(s),(old),(new)) /* Substitute newChar for oldChar throughout string s. */ void stripChar(char *s, char c); /* Remove all occurences of c from s. */ char *stripEnclosingChar(char *inout,char encloser); // Removes enclosing char if found at both beg and end, preserving pointer // Note: handles brackets '(','{' and '[' by complement at end #define stripEnclosingDoubleQuotes(inout) stripEnclosingChar((inout),'"') #define stripEnclosingSingleQuotes(inout) stripEnclosingChar((inout),'\'') void stripString(char *s, char *strip); /* Remove all occurences of strip from s. */ int countChars(char *s, char c); /* Return number of characters c in string s. */ int countCharsN(char *s, char c, int size); /* Return number of characters c in string s of given size. */ int countLeadingChars(char *s, char c); /* Count number of characters c at start of string. */ int countLeadingDigits(const char *s); /* Return number of leading digits in s */ int countLeadingNondigits(const char *s); /* Count number of leading non-digit characters in s. */ int countSame(char *a, char *b); /* Count number of characters that from start in a,b that are same. */ int chopString(char *in, char *sep, char *outArray[], int outSize); /* int chopString(in, sep, outArray, outSize); */ /* This chops up the input string (cannabilizing it) * into an array of zero terminated strings in * outArray. It returns the number of strings. * If you pass in NULL for outArray, it will just * return the number of strings that it *would* * chop. */ extern char crLfChopper[]; extern char whiteSpaceChopper[]; /* Some handy predefined separators. */ int chopByWhite(char *in, char *outArray[], int outSize); /* Like chopString, but specialized for white space separators. */ #define chopLine(line, words) chopByWhite(line, words, ArraySize(words)) /* Chop line by white space. */ int chopByWhiteRespectDoubleQuotes(char *in, char *outArray[], int outSize); /* Like chopString, but specialized for white space separators. * Further, any doubleQuotes (") are respected. * If doubleQuote encloses whole string, then they are removed: * "Fred and Ethyl" results in word [Fred and Ethyl] * If doubleQuotes exist inside string they are retained: * Fred "and Ethyl" results in word [Fred "and Ethyl"] * Special note "" is a valid, though empty word. */ int chopByChar(char *in, char chopper, char *outArray[], int outSize); /* Chop based on a single character. */ #define chopTabs(string, words) chopByChar(string, '\t', words, ArraySize(words)) /* Chop string by tabs. */ #define chopCommas(string, words) chopByChar(string, ',', words, ArraySize(words)) /* Chop string by commas. */ char *skipBeyondDelimit(char *s,char delimit); /* Returns NULL or pointer to first char beyond one (or more contiguous) delimit char. If delimit is ' ' then skips beyond first patch of whitespace. */ char *skipLeadingSpaces(char *s); /* Return first non-white space */ char *skipToSpaces(char *s); /* Return first white space. */ void eraseTrailingSpaces(char *s); /* Replace trailing white space with zeroes. */ void eraseWhiteSpace(char *s); /* Remove white space from a string */ void eraseNonAlphaNum(char *s); /* Remove non-alphanumeric chars from string */ char *trimSpaces(char *s); /* Remove leading and trailing white space. */ void repeatCharOut(FILE *f, char c, int count); /* Write character to file repeatedly. */ void spaceOut(FILE *f, int count); /* Put out some spaces to file. */ void starOut(FILE *f, int count); /* Put out some asterisks to file. */ boolean hasWhiteSpace(char *s); /* Return TRUE if there is white space in string. */ char *firstWordInLine(char *line); /* Returns first word in line if any (white space separated). * Puts 0 in place of white space after word. */ char *lastWordInLine(char *line); /* Returns last word in line if any (white space separated). * Returns NULL if string is empty. Removes any terminating white space * from line. */ char *nextWord(char **pLine); /* Return next word in *pLine and advance *pLine to next * word. Returns NULL when no more words. */ char *nextWordRespectingQuotes(char **pLine); // return next word but respects single or double quotes surrounding sets of words. char *cloneFirstWord(char *line); /* Clone first word in line */ char *nextTabWord(char **pLine); /* Return next tab-separated word. */ char *cloneFirstWordByDelimiter(char *line,char delimit); /* Returns a cloned first word, not harming the memory passed in Delimiter of ' ' will delimit by isspace() */ #define cloneFirstWordInLine(line) cloneFirstWordByDelimiter((line),' ') #define cloneFirstWordByTab(line) cloneFirstWordByDelimiter((line),'\t') /* Returns a cloned first word, not harming the memory passed in */ char *cloneNextWordByDelimiter(char **line,char delimit); /* Returns a cloned first word, advancing the line pointer but not harming memory passed in. Delimit ' ' uses isspace() */ #define cloneNextWord(line) cloneNextWordByDelimiter((line),' ') #define cloneNextWordByTab(line) cloneNextWordByDelimiter((line),'\t') char *nextStringInList(char **pStrings); /* returns pointer to the first string and advances pointer to next in list of strings dilimited by 1 null and terminated by 2 nulls. */ int cntStringsInList(char *pStrings); /* returns count of strings in a list of strings dilimited by 1 null and terminated by 2 nulls. */ int stringArrayIx(char *string, char *array[], int arraySize); /* Return index of string in array or -1 if not there. */ int ptArrayIx(void *pt, void *array, int arraySize); /* Return index of pt in array or -1 if not there. */ #define stringIx(string, array) stringArrayIx( (string), (array), ArraySize(array)) #ifndef FILEPATH_H void splitPath(char *path, char dir[PATH_LEN], char name[FILENAME_LEN], char extension[FILEEXT_LEN]); /* Split a full path into components. The dir component will include the * trailing / if any. The extension component will include the starting * . if any. Pass in NULL for dir, name, or extension if you don't care about * that part. */ #endif /* FILEPATH_H */ char *addSuffix(char *head, char *suffix); /* Return a needMem'd string containing "headsuffix". Should be free'd when finished. */ void chopSuffix(char *s); /* Remove suffix (last . in string and beyond) if any. */ void chopSuffixAt(char *s, char c); /* Remove end of string from last occurrence of char c. * chopSuffixAt(s, '.') is equivalent to regular chopSuffix. */ char *chopPrefix(char *s); /* This will replace the first '.' in a string with * 0, and return the character after this. If there * is no '.' in the string this will just return the * unchanged s passed in. */ char *chopPrefixAt(char *s, char c); /* Like chopPrefix, but can chop on any character, not just '.' */ FILE *mustOpen(char *fileName, char *mode); /* Open a file - or squawk and die. */ void mustWrite(FILE *file, void *buf, size_t size); /* Write to file or squawk and die. */ #define writeOne(file, var) mustWrite((file), &(var), sizeof(var)) /* Write out one variable to file. */ void mustRead(FILE *file, void *buf, size_t size); /* Read size bytes from a file or squawk and die. */ #define mustReadOne(file, var) mustRead((file), &(var), sizeof(var)) /* Read one variable from file or die. */ void mustGetLine(FILE *file, char *buf, int charCount); /* Read at most charCount-1 bytes from file, but stop after newline if one is * encountered. The string in buf is '\0'-terminated. (See man 3 fgets.) * Die if there is an error. */ int mustOpenFd(char *fileName, int flags); /* Open a file descriptor (see man 2 open) or squawk and die. */ void mustReadFd(int fd, void *buf, size_t size); /* Read size bytes from a file descriptor or squawk and die. */ void mustWriteFd(int fd, void *buf, size_t size); /* Write size bytes to file descriptor fd or die. (See man 2 write.) */ off_t mustLseek(int fd, off_t offset, int whence); /* Seek to given offset, relative to whence (see man lseek) in file descriptor fd or errAbort. * Return final offset (e.g. if this is just an (fd, 0, SEEK_CUR) query for current position). */ void mustCloseFd(int *pFd); /* Close file descriptor *pFd if >= 0, abort if there's an error, set *pFd = -1. */ #define writeOneFd(fd, var) mustWriteFd((fd), &(var), sizeof(var)) /* Write out one variable to file descriptor fd. */ #define readOne(file, var) (fread(&(var), sizeof(var), 1, (file)) == 1) /* Read one variable from file. Returns FALSE if can't do it. */ #define readOneFd(fd, var) (read((fd), &(var), sizeof(var)) == sizeof(var)) /* Read one variable from file. Returns FALSE if can't do it. */ #define mustReadOneFd(fd, var) mustReadFd((fd), &(var), sizeof(var)) /* Read one variable from file or die. */ #define memReadOne(pPt, var) memRead((pPt), &(var), sizeof(var)) /* Read one variable from memory. */ void writeString(FILE *f, char *s); /* Write a 255 or less character string to a file. * This will write the length of the string in the first * byte then the string itself. */ char *readString(FILE *f); /* Read a string (written with writeString) into * memory. freeMem the result when done. Returns * NULL at EOF. */ char *mustReadString(FILE *f); /* Read a string. Squawk and die at EOF or if any problem. */ boolean fastReadString(FILE *f, char buf[256]); /* Read a string into buffer, which must be long enough * to hold it. String is in 'writeString' format. * Returns FALSE at EOF. */ void msbFirstWriteBits64(FILE *f, bits64 x); /* Write out 64 bit number in manner that is portable across architectures */ bits64 msbFirstReadBits64(FILE *f); /* Write out 64 bit number in manner that is portable across architectures */ void carefulClose(FILE **pFile); /* Close file if open and null out handle to it. */ boolean carefulCloseWarn(FILE **pFile); /* Close file if open and null out handle to it. * Return FALSE and print a warning message if there * is a problem.*/ char *firstWordInFile(char *fileName, char *wordBuf, int wordBufSize); /* Read the first word in file into wordBuf. */ struct fileOffsetSize /* A piece of a file. */ { struct fileOffsetSize *next; /* Next in list. */ bits64 offset; /* Start offset of block. */ bits64 size; /* Size of block. */ }; int fileOffsetSizeCmp(const void *va, const void *vb); /* Help sort fileOffsetSize by offset. */ struct fileOffsetSize *fileOffsetSizeMerge(struct fileOffsetSize *inList); /* Returns a new list which is inList transformed to have adjacent blocks * merged. Best to use this with a sorted list. */ void fileOffsetSizeFindGap(struct fileOffsetSize *list, struct fileOffsetSize **pBeforeGap, struct fileOffsetSize **pAfterGap); /* Starting at list, find all items that don't have a gap between them and the previous item. * Return at gap, or at end of list, returning pointers to the items before and after the gap. */ void mustSystem(char *cmd); /* Execute cmd using "sh -c" or die. (See man 3 system.) fail on errors */ int roundingScale(int a, int p, int q); /* returns rounded a*p/q */ int intAbs(int a); /* Return integer absolute value */ #define logBase2(x)(log(x)/log(2)) /* return log base two of number */ #define round(a) ((int)((a)+0.5)) /* Round floating point val to nearest integer. */ #define roundll(a) ((long long)((a)+0.5)) /* Round floating point val to nearest long long. */ #ifndef min #define min(a,b) ( (a) < (b) ? (a) : (b) ) /* Return min of a and b. */ #endif #ifndef max #define max(a,b) ( (a) > (b) ? (a) : (b) ) /* Return max of a and b. */ #endif int rangeIntersection(int start1, int end1, int start2, int end2); /* Return amount of bases two ranges intersect over, 0 or negative if no * intersection. */ int positiveRangeIntersection(int start1, int end1, int start2, int end2); /* Return amount of bases two ranges intersect over, 0 if no * intersection. */ INLINE void memRead(char **pPt, void *buf, int size) /* Copy memory from *pPt to buf, and advance *pPt by size. */ { memcpy(buf, *pPt, size); *pPt += size; } INLINE void memWrite(char **pPt, void *buf, int size) /* Copy memory from buf to *pPt and advance *pPt by size. */ { memcpy(*pPt, buf, size); *pPt += size; } #define memWriteOne(pPt, var) memWrite((pPt), &(var), sizeof(var)) /* Write out one variable to memory stream. */ INLINE void memWriteFloat(char **pPt, float val) /* Write out floating point val to file. Mostly to convert from double... */ { memWriteOne(pPt, val); } bits64 byteSwap64(bits64 a); /* Swap from intel to sparc order of a 64 bit quantity. */ bits64 readBits64(FILE *f, boolean isSwapped); /* Read and optionally byte-swap 64 bit entity. */ bits64 fdReadBits64(int fd, boolean isSwapped); /* Read and optionally byte-swap 64 bit entity. */ bits64 memReadBits64(char **pPt, boolean isSwapped); /* Read and optionally byte-swap 64 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ bits32 byteSwap32(bits32 a); /* Swap from intel to sparc order of a 32 bit quantity. */ bits32 readBits32(FILE *f, boolean isSwapped); /* Read and optionally byte-swap 32 bit entity. */ bits32 fdReadBits32(int fd, boolean isSwapped); /* Read and optionally byte-swap 32 bit entity. */ bits32 memReadBits32(char **pPt, boolean isSwapped); /* Read and optionally byte-swap 32 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ bits16 byteSwap16(bits16 a); /* Swap from intel to sparc order of a 16 bit quantity. */ bits16 readBits16(FILE *f, boolean isSwapped); /* Read and optionally byte-swap 16 bit entity. */ bits16 fdReadBits16(int fd, boolean isSwapped); /* Read and optionally byte-swap 16 bit entity. */ bits16 memReadBits16(char **pPt, boolean isSwapped); /* Read and optionally byte-swap 32 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ double byteSwapDouble(double a); /* Return byte-swapped version of a */ double readDouble(FILE *f, boolean isSwapped); /* Read and optionally byte-swap double-precision floating point entity. */ double memReadDouble(char **pPt, boolean isSwapped); /* Read and optionally byte-swap double-precision floating point entity * from memory buffer pointed to by *pPt, and advance *pPt past read area. */ float byteSwapFloat(float a); /* Return byte-swapped version of a */ float readFloat(FILE *f, boolean isSwapped); /* Read and optionally byte-swap single-precision floating point entity. */ float memReadFloat(char **pPt, boolean isSwapped); /* Read and optionally byte-swap single-precision floating point entity * from memory buffer pointed to by *pPt, and advance *pPt past read area. */ void removeReturns(char* dest, char* src); /* Removes the '\r' character from a string. * the source and destination strings can be the same, * if there are no threads */ int intExp(char *text); /* Convert text to integer expression and evaluate. * Throws if it finds a non-number. */ double doubleExp(char *text); /* Convert text to floating point expression and * evaluate. */ char* readLine(FILE* fh); /* Read a line of any size into dynamic memory, return null on EOF */ off_t fileSize(char *fileName); /* The size of a file. */ boolean fileExists(char *fileName); /* Does a file exist? */ /* Friendly name for strstrNoCase */ char *containsStringNoCase(char *haystack, char *needle); char *strstrNoCase(char *haystack, char *needle); /* A case-insensitive strstr */ int vasafef(char* buffer, int bufSize, char *format, va_list args); /* Format string to buffer, vsprintf style, only with buffer overflow * checking. The resulting string is always terminated with zero byte. */ int safef(char* buffer, int bufSize, char *format, ...) /* Format string to buffer, vsprintf style, only with buffer overflow * checking. The resulting string is always terminated with zero byte. */ #ifdef __GNUC__ __attribute__((format(printf, 3, 4))) #endif ; void safecpy(char *buf, size_t bufSize, const char *src); /* copy a string to a buffer, with bounds checking.*/ void safencpy(char *buf, size_t bufSize, const char *src, size_t n); /* copy n characters from a string to a buffer, with bounds checking. * Unlike strncpy, always null terminates the result */ void safecat(char *buf, size_t bufSize, const char *src); /* Append a string to a buffer, with bounds checking.*/ void safencat(char *buf, size_t bufSize, const char *src, size_t n); /* append n characters from a string to a buffer, with bounds checking. */ char *naForNull(char *s); /* Return 'n/a' if s is NULL, otherwise s. */ char *naForEmpty(char *s); /* Return n/a if s is "" or NULL, otherwise s. */ char *emptyForNull(char *s); /* Return "" if s is NULL, otherwise s. */ char *nullIfAllSpace(char *s); /* Return NULL if s is all spaces, otherwise s. */ char *trueFalseString(boolean b); /* Return "true" or "false" */ void uglyTime(char *label, ...); /* Print label and how long it's been since last call. Call with * a NULL label to initialize. */ /* In case the development environment does not supply INFINITY */ #if !defined(INFINITY) #define INFINITY (1.0/0.0) #endif void makeDirs(char* path); /* make a directory, including parent directories */ char *skipNumeric(char *s); /* Return first char of s that's not a digit */ char *skipToNumeric(char *s); /* skip up to where numeric digits appear */ char *splitOffNonNumeric(char *s); /* Split off non-numeric part, e.g. mm of mm8. Result should be freed when done */ char *splitOffNumber(char *db); /* Split off number part, e.g. 8 of mm8. Result should be freed when done */ void vaDumpStack(char *format, va_list args); /* debugging function to run the pstack program on the current process. In * prints a message, following by a new line, and then the stack track. Just * prints errors to stderr rather than aborts. For debugging purposes * only. */ void dumpStack(char *format, ...) /* debugging function to run the pstack program on the current process. In * prints a message, following by a new line, and then the stack track. Just * prints errors to stderr rather than aborts. For debugging purposes * only. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; // SETTING_ON set of macros are frequently used comparisons of string values for boolean questions. // Notice the subtle difference between NOT_ON and IS_OFF. NOT_ON could be NULL but IS_OFF must be explicitly set #define SETTING_IS_ON(setting) (setting && (sameWord(setting,"on") || sameWord(setting,"true") || sameWord(setting,"yes") || sameWord(setting,"enabled") || atoi(setting) != 0)) #define SETTING_NOT_ON(setting) (!SETTING_IS_ON(setting)) #define SETTING_IS_OFF(setting) (setting && (sameWord(setting,"off") || sameWord(setting,"false") || sameWord(setting,"no") || sameWord(setting,"disabled") || sameWord(setting,"0"))) // Standard bit mask macros #define BITS_ADD( flags,bits) ((flags) = ((flags) | (bits))) #define BITS_REMOVE( flags,bits) ((flags) = ((flags) & ~(bits))) #define BITS_ARE_ON( flags,bits) (((flags) & (bits)) == (bits)) #define BITS_ARE_OFF(flags,bits) (((flags) & (bits)) == 0) // It is sometimes useful to distinguish between 3 "boolean" states: TRUE, FALSE and UNKNOWN enum enumBool { beUnknown=0, // Not yet set ebYes=1, // already set to TRUE ebNo=-1 // already set to FALSE }; #define SET_TO_YES(ebool) { (ebool) = ebYes; } #define SET_TO_NO(ebool) { (ebool) = ebNo; } #define IS_YES(ebool) ((ebool) == ebYes) #define IS_NO(ebool) ((ebool) == ebNo) #define IS_KNOWN(ebool) (IS_YES(ebool) || IS_NO(ebool)) #define IS_TRUE IS_YES #define IS_FALSE IS_NO time_t mktimeFromUtc (struct tm *t); /* Return time_t for tm in UTC (GMT) * Useful for stuff like converting to time_t the * last-modified HTTP response header * which is always GMT. Returns -1 on failure of mktime */ time_t dateToSeconds(const char *date,const char*format); // Convert a string date to time_t boolean dateIsOld(const char *date,const char*format); // Is this string date older than now? char *dateAddTo(char *date,char *format,int addYears,int addMonths,int addDays); /* Add years,months,days to a formatted date and returns the new date as a cloned string * format is a strptime/strftime format: %F = yyyy-mm-dd */ #endif /* COMMON_H */ rtracklayer/src/ucsc/dlist.c0000644000126300012640000001572012227135242017474 0ustar00biocbuildphs_compbio/* dlist.c - Doubly-linked list routines. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "dlist.h" static char const rcsid[] = "$Id: dlist.c,v 1.11 2005/07/04 18:44:09 markd Exp $"; void dlListInit(struct dlList *dl) /* Initialize list to be empty */ { dl->head = (struct dlNode *)(&dl->nullMiddle); dl->nullMiddle = NULL; dl->tail = (struct dlNode *)(&dl->head); } struct dlList *newDlList() /* Return a new doubly linked list. */ { struct dlList *dl; AllocVar(dl); dl->head = (struct dlNode *)(&dl->nullMiddle); dl->tail = (struct dlNode *)(&dl->head); return dl; } void dlListReset(struct dlList *dl) /* Reset a list to the empty state (does not free values) */ { struct dlNode *node, *next; for (node = dl->head; node->next != NULL; node = next) { next = node->next; freeMem(node); } dl->head = (struct dlNode *)(&dl->nullMiddle); dl->nullMiddle = NULL; dl->tail = (struct dlNode *)(&dl->head); } void freeDlList(struct dlList **pList) /* Free up a doubly linked list and it's nodes (but not the node values). */ { struct dlList *list = *pList; if (list != NULL) { dlListReset(list); freez(pList); } } void freeDlListAndVals(struct dlList **pList) /* Free all values in doubly linked list and the list itself. (Just calls * freeMem on all values. */ { struct dlList *list = *pList; if (list != NULL) { struct dlNode *node; for (node = list->head; node->next != NULL; node = node->next) freeMem(node->val); freeDlList(pList); } } void dlInsertBetween(struct dlNode *before, struct dlNode *after, struct dlNode *newNode) { before->next = newNode; newNode->prev = before; newNode->next = after; after->prev = newNode; } void dlAddBefore(struct dlNode *anchor, struct dlNode *newNode) /* Add a node to list before anchor member. */ { dlInsertBetween(anchor->prev, anchor, newNode); } void dlAddAfter(struct dlNode *anchor, struct dlNode *newNode) /* Add a node to list after anchor member. */ { dlInsertBetween(anchor, anchor->next, newNode); } void dlAddHead(struct dlList *list, struct dlNode *newNode) /* Add a node to head of list. */ { struct dlNode *head = list->head; dlInsertBetween(head->prev, head, newNode); } void dlAddTail(struct dlList *list, struct dlNode *newNode) /* Add a node to tail of list. */ { struct dlNode *tail = list->tail; dlInsertBetween(tail, tail->next, newNode); } struct dlNode *dlAddValBefore(struct dlNode *anchor, void *val) /* Create a node containing val and add to list before anchor member. */ { struct dlNode *node = AllocA(struct dlNode); node->val = val; dlAddBefore(anchor, node); return node; } struct dlNode *dlAddValAfter(struct dlNode *anchor, void *val) /* Create a node containing val and add to list after anchor member. */ { struct dlNode *node = AllocA(struct dlNode); node->val = val; dlAddAfter(anchor, node); return node; } struct dlNode *dlAddValHead(struct dlList *list, void *val) /* Create a node containing val and add to head of list. */ { struct dlNode *node = AllocA(struct dlNode); node->val = val; dlAddHead(list, node); return node; } struct dlNode *dlAddValTail(struct dlList *list, void *val) /* Create a node containing val and add to tail of list. */ { struct dlNode *node = AllocA(struct dlNode); node->val = val; dlAddTail(list, node); return node; } void dlRemove(struct dlNode *node) /* Removes a node from list. Node is not freed. */ { struct dlNode *before = node->prev; struct dlNode *after = node->next; before->next = after; after->prev = before; node->prev = NULL; node->next = NULL; } void dlRemoveHead(struct dlList *list) /* Removes head from list. Node is not freed. */ { dlRemove(list->head); } void dlRemoveTail(struct dlList *list) /* Remove tail from list. Node is not freed. */ { dlRemove(list->tail); } struct dlNode *dlPopHead(struct dlList *list) /* Remove first node from list and return it. */ { struct dlNode *node = list->head; if (node->next == NULL) return NULL; dlRemove(node); return node; } struct dlNode *dlPopTail(struct dlList *list) /* Remove last node from list and return it. */ { struct dlNode *node = list->tail; if (node->prev == NULL) return NULL; dlRemove(node); return node; } void dlDelete(struct dlNode **nodePtr) /* Removes a node from list and frees it. */ { struct dlNode *node = *nodePtr; if (node != NULL) { dlRemove(node); freeMem(node); } } int dlCount(struct dlList *list) /* Return length of list. */ { return slCount(list->head) - 1; } struct dlSorter /* Helper structure for sorting dlNodes preserving order */ { struct dlNode *node; }; static int (*compareFunc)(const void *elem1, const void *elem2); /* Node comparison pointer, just used by dlSortNodes and helpers. */ static int dlNodeCmp(const void *elem1, const void *elem2) /* Compare two dlSorters indirectly, by calling compareFunc. */ { struct dlSorter *a = (struct dlSorter *)elem1; struct dlSorter *b = (struct dlSorter *)elem2; return compareFunc(&a->node->val, &b->node->val); } void dlSort(struct dlList *list, int (*compare )(const void *elem1, const void *elem2)) /* Sort a singly linked list with Qsort and a temporary array. * The arguments to the compare function in real, non-void, life * are pointers to pointers of the type that is in the val field of * the nodes of the list. */ { int len = dlCount(list); if (len > 1) { /* Move val's onto an array, sort, and then put back into list. */ struct dlSorter *sorter = needLargeMem(len * sizeof(sorter[0])), *s; struct dlNode *node; int i; for (i=0, node = list->head; inext) { s = &sorter[i]; s->node = node; } compareFunc = compare; qsort(sorter, len, sizeof(sorter[0]), dlNodeCmp); dlListInit(list); for (i=0; ihead; else return list->head->prev; } struct dlNode *dlGetAfterTail(struct dlList *list) /* Get the node after the tail of the list */ { if (dlEmpty(list)) return list->tail; else return list->tail->next; } void *dlListToSlList(struct dlList *dList) /* Return slList from dlList. */ { struct slList *list = NULL, *el; struct dlNode *node; for (node = dList->tail; node->prev != NULL; node = node->prev) { el = node->val; slAddHead(&list, el); } return list; } void dlCat(struct dlList *a, struct dlList *b) /* Move items from b to end of a. */ { struct dlNode *node; while ((node = dlPopHead(b)) != NULL) dlAddTail(a, node); } struct dlNode *dlValInList(struct dlList *list, void *val) /* Return node on list if any that has associated val. */ { struct dlNode *node; for (node = list->head; !dlEnd(node); node = node->next) if (node->val == val) return node; return NULL; } rtracklayer/src/ucsc/dlist.h0000644000126300012640000001000312227135242017466 0ustar00biocbuildphs_compbio/* dlist.h - Headers for generic doubly-linked list routines. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef DLIST_H #define DLIST_H #ifndef COMMON_H #include "common.h" #endif struct dlNode /* An element on a doubly linked list. */ { struct dlNode *next; struct dlNode *prev; void *val; }; struct dlList /* A doubly linked list. */ { struct dlNode *head; struct dlNode *nullMiddle; struct dlNode *tail; }; #define dlEnd(node) (node->next == NULL) /* True if node past end. */ #define dlStart(node) (node->prev == NULL) /* True if node before start. */ /* Iterate on a doubly linked list as so: for (el = list->head; !dlEnd(el); el = el->next) val = el->val; or for (el = list->tail; !dlStart(el); el = el->prev) val = el->val; */ struct dlList *newDlList(); /* Return a new doubly linked list. */ #define dlListNew newDlList /* Add object-first synonym. */ void dlListInit(struct dlList *dl); /* Initialize list to be empty */ void dlListReset(struct dlList *dl); /* Reset a list to the empty state (does not free values) */ void freeDlList(struct dlList **pList); /* Free up a doubly linked list and it's nodes (but not the node values). */ #define dlListFree freeDlList void freeDlListAndVals(struct dlList **pList); /* Free all values in doubly linked list and the list itself. (Just calls * freeMem on all values. */ #define dlListFreeAndVals freeDlListAndVals void dlAddBefore(struct dlNode *anchor, struct dlNode *newNode); /* Add a node to list before anchor member. */ void dlAddAfter(struct dlNode *anchor, struct dlNode *newNode); /* Add a node to list after anchor member. */ void dlAddHead(struct dlList *list, struct dlNode *newNode); /* Add a node to head of list. */ void dlAddTail(struct dlList *list, struct dlNode *newNode); /* Add a node to tail of list. */ struct dlNode *dlAddValBefore(struct dlNode *anchor, void *val); /* Create a node containing val and add to list before anchor member. */ struct dlNode *dlAddValAfter(struct dlNode *anchor, void *val); /* Create a node containing val and add to list after anchor member. */ struct dlNode *dlAddValHead(struct dlList *list, void *val); /* Create a node containing val and add to head of list. */ struct dlNode *dlAddValTail(struct dlList *list, void *val); /* Create a node containing val and add to tail of list. */ void dlRemove(struct dlNode *node); /* Removes a node from list. Node is not freed. */ void dlRemoveHead(struct dlList *list); /* Removes head from list. Node is not freed. */ void dlRemoveTail(struct dlList *list); /* Remove tail from list. Node is not freed. */ struct dlNode *dlPopHead(struct dlList *list); /* Remove first node from list and return it. */ struct dlNode *dlPopTail(struct dlList *list); /* Remove last node from list and return it. */ void dlDelete(struct dlNode **nodePtr); /* Removes a node from list and frees it. */ int dlCount(struct dlList *list); /* Return length of list. */ boolean dlEmpty(struct dlList *list); /* Return TRUE if list is empty. */ #define dlIsEmpty(list) ((list)->head->next == NULL) /* Return TRUE if list is empty. Macro version of above. */ struct dlNode *dlGetBeforeHead(struct dlList *list); /* Get the node before the head of the list */ struct dlNode *dlGetAfterTail(struct dlList *list); /* Get the node after the tail of the list */ void dlSort(struct dlList *list, int (*compare )(const void *elem1, const void *elem2)); /* Sort a doubly linked list with Qsort and a temporary array. * The arguments to the compare function in real, non-void, life * are pointers to pointers of the type that is in the val field of * the nodes of the list. */ void *dlListToSlList(struct dlList *dList); /* Return slList from dlList. */ void dlCat(struct dlList *a, struct dlList *b); /* Move items from b to end of a. */ struct dlNode *dlValInList(struct dlList *list, void *val); /* Return node on list if any that has associated val. */ #endif /* DLIST_H */ rtracklayer/src/ucsc/dnaseq.c0000644000126300012640000000777612227135242017644 0ustar00biocbuildphs_compbio/* dnaSeq.c - stuff to manage DNA sequences. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "dnaseq.h" #include "bits.h" #include "hash.h" #include "obscure.h" static char const rcsid[] = "$Id: dnaseq.c,v 1.20 2008/10/30 09:27:59 kent Exp $"; struct dnaSeq *newDnaSeq(DNA *dna, int size, char *name) /* Create a new DNA seq. */ { struct dnaSeq *seq; seq = needMem(sizeof(*seq)); if (name != NULL) seq->name = cloneString(name); seq->dna = dna; seq->size = size; seq->mask = NULL; return seq; } struct dnaSeq *cloneDnaSeq(struct dnaSeq *orig) /* Duplicate dna sequence in RAM. */ { struct dnaSeq *seq = CloneVar(orig); seq->name = cloneString(seq->name); seq->dna = needHugeMem(seq->size+1); memcpy(seq->dna, orig->dna, seq->size+1); seq->mask = NULL; if (orig->mask != NULL) { seq->mask = bitClone(orig->mask, seq->size); } return seq; } void freeDnaSeq(struct dnaSeq **pSeq) /* Free up DNA seq. (And unlink underlying resource node.) */ { struct dnaSeq *seq = *pSeq; if (seq == NULL) return; freeMem(seq->name); freeMem(seq->dna); bitFree(&seq->mask); freez(pSeq); } void freeDnaSeqList(struct dnaSeq **pSeqList) /* Free up list of DNA sequences. */ { struct dnaSeq *seq, *next; for (seq = *pSeqList; seq != NULL; seq = next) { next = seq->next; freeDnaSeq(&seq); } *pSeqList = NULL; } boolean seqIsLower(bioSeq *seq) /* Return TRUE if sequence is all lower case. */ { int size = seq->size, i; char *poly = seq->dna; for (i=0; idna, seq->size); } aaSeq *translateSeqN(struct dnaSeq *inSeq, unsigned offset, unsigned inSize, boolean stop) /* Return a translated sequence. Offset is position of first base to * translate. If size is 0 then use length of inSeq. */ { aaSeq *seq; DNA *dna = inSeq->dna; AA *pep, aa; int i, lastCodon; int actualSize = 0; assert(offset <= inSeq->size); if ((inSize == 0) || (inSize > (inSeq->size - offset))) inSize = inSeq->size - offset; lastCodon = offset + inSize - 3; AllocVar(seq); seq->dna = pep = needLargeMem(inSize/3+1); for (i=offset; i <= lastCodon; i += 3) { aa = lookupCodon(dna+i); if (aa == 0) { if (stop) break; else aa = 'Z'; } *pep++ = aa; ++actualSize; } *pep = 0; assert(actualSize <= inSize/3+1); seq->size = actualSize; seq->name = cloneString(inSeq->name); return seq; } aaSeq *translateSeq(struct dnaSeq *inSeq, unsigned offset, boolean stop) /* Return a translated sequence. Offset is position of first base to * translate. If stop is TRUE then stop at first stop codon. (Otherwise * represent stop codons as 'Z'). */ { return translateSeqN(inSeq, offset, 0, stop); } bioSeq *whichSeqIn(bioSeq **seqs, int seqCount, char *letters) /* Figure out which if any sequence letters is in. */ { aaSeq *seq; int i; for (i=0; idna <= letters && letters < seq->dna + seq->size) return seq; } internalErr(); return NULL; } Bits *maskFromUpperCaseSeq(bioSeq *seq) /* Allocate a mask for sequence and fill it in based on * sequence case. */ { int size = seq->size, i; char *poly = seq->dna; Bits *b = bitAlloc(size); for (i=0; inext) hashAddUnique(hash, seq->name, seq); return hash; } int dnaSeqCmpName(const void *va, const void *vb) /* Compare to sort based on sequence name. */ { const struct dnaSeq *a = *((struct dnaSeq **)va); const struct dnaSeq *b = *((struct dnaSeq **)vb); return strcmp(a->name, b->name); } rtracklayer/src/ucsc/dnaseq.h0000644000126300012640000000433112227135242017631 0ustar00biocbuildphs_compbio/* dnaSeq - stuff to manage DNA sequences. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef DNASEQ_H #define DNASEQ_H #ifndef DNAUTIL_H #include "dnautil.h" #endif #ifndef BITS_H #include "bits.h" #endif struct dnaSeq /* A dna sequence in one-character per base format. */ { struct dnaSeq *next; /* Next in list. */ char *name; /* Name of sequence. */ DNA *dna; /* Sequence base by base. */ int size; /* Size of sequence. */ Bits* mask; /* Repeat mask (optional) */ }; typedef struct dnaSeq bioSeq; /* Preferred use if either DNA or protein. */ typedef struct dnaSeq aaSeq; /* Preferred use if protein. */ struct dnaSeq *newDnaSeq(DNA *dna, int size, char *name); /* Create a new DNA seq. */ struct dnaSeq *cloneDnaSeq(struct dnaSeq *seq); /* Duplicate dna sequence in RAM. */ void freeDnaSeq(struct dnaSeq **pSeq); /* Free up DNA seq. */ #define dnaSeqFree freeDnaSeq void freeDnaSeqList(struct dnaSeq **pSeqList); /* Free up list of DNA sequences. */ #define dnaSeqFreeList freeDnaSeqList aaSeq *translateSeqN(struct dnaSeq *inSeq, unsigned offset, unsigned size, boolean stop); /* Return a translated sequence. Offset is position of first base to * translate. If size is 0 then use length of inSeq. */ aaSeq *translateSeq(struct dnaSeq *inSeq, unsigned offset, boolean stop); /* Return a translated sequence. Offset is position of first base to * translate. If stop is TRUE then stop at first stop codon. (Otherwise * represent stop codons as 'Z'). */ boolean seqIsDna(bioSeq *seq); /* Make educated guess whether sequence is DNA or protein. */ boolean seqIsLower(bioSeq *seq); /* Return TRUE if sequence is all lower case. */ bioSeq *whichSeqIn(bioSeq **seqs, int seqCount, char *letters); /* Figure out which if any sequence letters is in. */ Bits *maskFromUpperCaseSeq(bioSeq *seq); /* Allocate a mask for sequence and fill it in based on * sequence case. */ struct hash *dnaSeqHash(struct dnaSeq *seqList); /* Return hash of sequences keyed by name. */ int dnaSeqCmpName(const void *va, const void *vb); /* Compare to sort based on sequence name. */ #endif /* DNASEQ_H */ rtracklayer/src/ucsc/dnautil.c0000644000126300012640000006057012227135242020020 0ustar00biocbuildphs_compbio/* Some stuff that you'll likely need in any program that works with * DNA. Includes stuff for amino acids as well. * * Assumes that DNA is stored as a character. * The DNA it generates will include the bases * as lowercase tcag. It will generally accept * uppercase as well, and also 'n' or 'N' or '-' * for unknown bases. * * Amino acids are stored as single character upper case. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "dnautil.h" static char const rcsid[] = "$Id: dnautil.c,v 1.51 2008/10/24 18:20:17 kent Exp $"; struct codonTable /* The dread codon table. */ { DNA *codon; /* Lower case. */ AA protCode; /* Upper case. The "Standard" code */ AA mitoCode; /* Upper case. Vertebrate Mitochondrial translations */ }; struct codonTable codonTable[] = /* The master codon/protein table. */ { {"ttt", 'F', 'F',}, {"ttc", 'F', 'F',}, {"tta", 'L', 'L',}, {"ttg", 'L', 'L',}, {"tct", 'S', 'S',}, {"tcc", 'S', 'S',}, {"tca", 'S', 'S',}, {"tcg", 'S', 'S',}, {"tat", 'Y', 'Y',}, {"tac", 'Y', 'Y',}, {"taa", 0, 0,}, {"tag", 0, 0,}, {"tgt", 'C', 'C',}, {"tgc", 'C', 'C',}, {"tga", 0, 'W',}, {"tgg", 'W', 'W',}, {"ctt", 'L', 'L',}, {"ctc", 'L', 'L',}, {"cta", 'L', 'L',}, {"ctg", 'L', 'L',}, {"cct", 'P', 'P',}, {"ccc", 'P', 'P',}, {"cca", 'P', 'P',}, {"ccg", 'P', 'P',}, {"cat", 'H', 'H',}, {"cac", 'H', 'H',}, {"caa", 'Q', 'Q',}, {"cag", 'Q', 'Q',}, {"cgt", 'R', 'R',}, {"cgc", 'R', 'R',}, {"cga", 'R', 'R',}, {"cgg", 'R', 'R',}, {"att", 'I', 'I',}, {"atc", 'I', 'I',}, {"ata", 'I', 'M',}, {"atg", 'M', 'M',}, {"act", 'T', 'T',}, {"acc", 'T', 'T',}, {"aca", 'T', 'T',}, {"acg", 'T', 'T',}, {"aat", 'N', 'N',}, {"aac", 'N', 'N',}, {"aaa", 'K', 'K',}, {"aag", 'K', 'K',}, {"agt", 'S', 'S',}, {"agc", 'S', 'S',}, {"aga", 'R', 0,}, {"agg", 'R', 0,}, {"gtt", 'V', 'V',}, {"gtc", 'V', 'V',}, {"gta", 'V', 'V',}, {"gtg", 'V', 'V',}, {"gct", 'A', 'A',}, {"gcc", 'A', 'A',}, {"gca", 'A', 'A',}, {"gcg", 'A', 'A',}, {"gat", 'D', 'D',}, {"gac", 'D', 'D',}, {"gaa", 'E', 'E',}, {"gag", 'E', 'E',}, {"ggt", 'G', 'G',}, {"ggc", 'G', 'G',}, {"gga", 'G', 'G',}, {"ggg", 'G', 'G',}, }; /* A table that gives values 0 for t 1 for c 2 for a 3 for g * (which is order aa's are in biochemistry codon tables) * and gives -1 for all others. */ int ntVal[256]; int ntValLower[256]; /* NT values only for lower case. */ int ntValUpper[256]; /* NT values only for upper case. */ int ntVal5[256]; int ntValNoN[256]; /* Like ntVal, but with T_BASE_VAL in place of -1 for nonexistent ones. */ DNA valToNt[(N_BASE_VAL|MASKED_BASE_BIT)+1]; /* convert tables for bit-4 indicating masked */ int ntValMasked[256]; DNA valToNtMasked[256]; static boolean inittedNtVal = FALSE; static void initNtVal() { if (!inittedNtVal) { int i; for (i=0; i= 3) { int c = ntVal[(int)dna[pos-3]]; if (c == A_BASE_VAL || c == G_BASE_VAL) return TRUE; } return FALSE; } boolean isReallyStopCodon(char *dna, boolean selenocysteine) /* Return TRUE if it's really a stop codon, even considering * possibilility of selenocysteine. */ { if (selenocysteine) { /* Luckily the mitochondria *also* replaces TGA with * something else, even though it isn't selenocysteine */ return lookupMitoCodon(dna) == 0; } else { return lookupCodon(dna) == 0; } } /* Returns one letter code for protein, * 0 for stop codon or X for bad input, * Vertebrate Mitochondrial Code */ AA lookupMitoCodon(DNA *dna) { int ix; int i; char c; if (!inittedNtVal) initNtVal(); ix = 0; for (i=0; i<3; ++i) { int bv = ntVal[(int)dna[i]]; if (bv<0) return 'X'; ix = (ix<<2) + bv; } c = codonTable[ix].mitoCode; c = toupper(c); return c; } Codon codonVal(DNA *start) /* Return value from 0-63 of codon starting at start. * Returns -1 if not a codon. */ { int v1,v2,v3; if ((v1 = ntVal[(int)start[0]]) < 0) return -1; if ((v2 = ntVal[(int)start[1]]) < 0) return -1; if ((v3 = ntVal[(int)start[2]]) < 0) return -1; return ((v1<<4) + (v2<<2) + v3); } DNA *valToCodon(int val) /* Return codon corresponding to val (0-63) */ { assert(val >= 0 && val < 64); return codonTable[val].codon; } void dnaTranslateSome(DNA *dna, char *out, int outSize) /* Translate DNA upto a stop codon or until outSize-1 amino acids, * whichever comes first. Output will be zero terminated. */ { int i; int dnaSize; int protSize = 0; outSize -= 1; /* Room for terminal zero */ dnaSize = strlen(dna); for (i=0; i= outSize) break; if ((out[protSize++] = lookupCodon(dna+i)) == 0) break; } out[protSize] = 0; } /* A little array to help us decide if a character is a * nucleotide, and if so convert it to lower case. */ char ntChars[256]; static void initNtChars() { static boolean initted = FALSE; if (!initted) { zeroBytes(ntChars, sizeof(ntChars)); ntChars['a'] = ntChars['A'] = 'a'; ntChars['c'] = ntChars['C'] = 'c'; ntChars['g'] = ntChars['G'] = 'g'; ntChars['t'] = ntChars['T'] = 't'; ntChars['n'] = ntChars['N'] = 'n'; ntChars['u'] = ntChars['U'] = 'u'; ntChars['-'] = 'n'; initted = TRUE; } } char ntMixedCaseChars[256]; static void initNtMixedCaseChars() { static boolean initted = FALSE; if (!initted) { zeroBytes(ntMixedCaseChars, sizeof(ntMixedCaseChars)); ntMixedCaseChars['a'] = 'a'; ntMixedCaseChars['A'] = 'A'; ntMixedCaseChars['c'] = 'c'; ntMixedCaseChars['C'] = 'C'; ntMixedCaseChars['g'] = 'g'; ntMixedCaseChars['G'] = 'G'; ntMixedCaseChars['t'] = 't'; ntMixedCaseChars['T'] = 'T'; ntMixedCaseChars['n'] = 'n'; ntMixedCaseChars['N'] = 'N'; ntMixedCaseChars['u'] = 'u'; ntMixedCaseChars['U'] = 'U'; ntMixedCaseChars['-'] = 'n'; initted = TRUE; } } /* Another array to help us do complement of DNA */ DNA ntCompTable[256]; static boolean inittedCompTable = FALSE; static void initNtCompTable() { zeroBytes(ntCompTable, sizeof(ntCompTable)); ntCompTable[' '] = ' '; ntCompTable['-'] = '-'; ntCompTable['='] = '='; ntCompTable['a'] = 't'; ntCompTable['c'] = 'g'; ntCompTable['g'] = 'c'; ntCompTable['t'] = 'a'; ntCompTable['u'] = 'a'; ntCompTable['n'] = 'n'; ntCompTable['-'] = '-'; ntCompTable['.'] = '.'; ntCompTable['A'] = 'T'; ntCompTable['C'] = 'G'; ntCompTable['G'] = 'C'; ntCompTable['T'] = 'A'; ntCompTable['U'] = 'A'; ntCompTable['N'] = 'N'; ntCompTable['R'] = 'Y'; ntCompTable['Y'] = 'R'; ntCompTable['M'] = 'K'; ntCompTable['K'] = 'M'; ntCompTable['S'] = 'S'; ntCompTable['W'] = 'W'; ntCompTable['V'] = 'B'; ntCompTable['H'] = 'D'; ntCompTable['D'] = 'H'; ntCompTable['B'] = 'V'; ntCompTable['X'] = 'N'; ntCompTable['r'] = 'y'; ntCompTable['y'] = 'r'; ntCompTable['s'] = 's'; ntCompTable['w'] = 'w'; ntCompTable['m'] = 'k'; ntCompTable['k'] = 'm'; ntCompTable['v'] = 'b'; ntCompTable['h'] = 'd'; ntCompTable['d'] = 'h'; ntCompTable['b'] = 'v'; ntCompTable['x'] = 'n'; ntCompTable['('] = ')'; ntCompTable[')'] = '('; inittedCompTable = TRUE; } /* Complement DNA (not reverse). */ void complement(DNA *dna, long length) { int i; if (!inittedCompTable) initNtCompTable(); for (i=0; i 0) { if (*a++ != '-') --size; } if (skipTrailingDash) while (*a == '-') ++a; return a; } int countNonDash(char *a, int size) /* Count number of non-dash characters. */ { int count = 0; int i; for (i=0; i 4) { count += 1; x >>= 2; } return count; } long dnaOrAaFilteredSize(char *raw, char filter[256]) /* Return how long DNA will be after non-DNA is filtered out. */ { char c; long count = 0; dnaUtilOpen(); while ((c = *raw++) != 0) { if (filter[(int)c]) ++count; } return count; } void dnaOrAaFilter(char *in, char *out, char filter[256]) /* Run chars through filter. */ { char c; dnaUtilOpen(); while ((c = *in++) != 0) { if ((c = filter[(int)c]) != 0) *out++ = c; } *out++ = 0; } long dnaFilteredSize(char *rawDna) /* Return how long DNA will be after non-DNA is filtered out. */ { return dnaOrAaFilteredSize(rawDna, ntChars); } void dnaFilter(char *in, DNA *out) /* Filter out non-DNA characters and change to lower case. */ { dnaOrAaFilter(in, out, ntChars); } void dnaFilterToN(char *in, DNA *out) /* Change all non-DNA characters to N. */ { DNA c; initNtChars(); while ((c = *in++) != 0) { if ((c = ntChars[(int)c]) != 0) *out++ = c; else *out++ = 'n'; } *out++ = 0; } void dnaMixedCaseFilter(char *in, DNA *out) /* Filter out non-DNA characters but leave case intact. */ { dnaOrAaFilter(in, out, ntMixedCaseChars); } long aaFilteredSize(char *raw) /* Return how long aa will be after non-aa chars is filtered out. */ { return dnaOrAaFilteredSize(raw, aaChars); } void aaFilter(char *in, DNA *out) /* Filter out non-aa characters and change to upper case. */ { dnaOrAaFilter(in, out, aaChars); } void upperToN(char *s, int size) /* Turn upper case letters to N's. */ { char c; int i; for (i=0; i= 0) { if ((val = ntVal[(int)*dna++]) >= 0) ++histogram[val]; } } bits64 basesToBits64(char *dna, int size) /* Convert dna of given size (up to 32) to binary representation */ { if (size > 32) errAbort("basesToBits64 called on %d bases, can only go up to 32", size); bits64 result = 0; int i; for (i=0; i= 0) { bVal = ntValNoN[(int)*in++]; out <<= 2; out += bVal; } return out; } bits16 packDna8(DNA *in) /* Pack 8 bases into a short word */ { bits16 out = 0; int count = 8; int bVal; while (--count >= 0) { bVal = ntValNoN[(int)*in++]; out <<= 2; out += bVal; } return out; } UBYTE packDna4(DNA *in) /* Pack 4 bases into a UBYTE */ { UBYTE out = 0; int count = 4; int bVal; while (--count >= 0) { bVal = ntValNoN[(int)*in++]; out <<= 2; out += bVal; } return out; } void unpackDna(bits32 *tiles, int tileCount, DNA *out) /* Unpack DNA. Expands to 16x tileCount in output. */ { int i, j; bits32 tile; for (i=0; i=0; --j) { out[j] = valToNt[tile & 0x3]; tile >>= 2; } out += 16; } } void unpackDna4(UBYTE *tiles, int byteCount, DNA *out) /* Unpack DNA. Expands to 4x byteCount in output. */ { int i, j; UBYTE tile; for (i=0; i=0; --j) { out[j] = valToNt[tile & 0x3]; tile >>= 2; } out += 4; } } static void checkSizeTypes() /* Make sure that some of our predefined types are the right size. */ { assert(sizeof(UBYTE) == 1); assert(sizeof(WORD) == 2); assert(sizeof(bits32) == 4); assert(sizeof(bits16) == 2); } int intronOrientationMinSize(DNA *iStart, DNA *iEnd, int minIntronSize) /* Given a gap in genome from iStart to iEnd, return * Return 1 for GT/AG intron between left and right, -1 for CT/AC, 0 for no * intron. Assumes DNA is lower cased. */ { if (iEnd - iStart < minIntronSize) return 0; if (iStart[0] == 'g' && iStart[1] == 't' && iEnd[-2] == 'a' && iEnd[-1] == 'g') { return 1; } else if (iStart[0] == 'c' && iStart[1] == 't' && iEnd[-2] == 'a' && iEnd[-1] == 'c') { return -1; } else return 0; } int intronOrientation(DNA *iStart, DNA *iEnd) /* Given a gap in genome from iStart to iEnd, return * Return 1 for GT/AG intron between left and right, -1 for CT/AC, 0 for no * intron. Assumes DNA is lower cased. */ { return intronOrientationMinSize(iStart, iEnd, 32); } int dnaScore2(DNA a, DNA b) /* Score match between two bases (relatively crudely). */ { if (a == 'n' || b == 'n') return 0; if (a == b) return 1; else return -1; } int dnaOrAaScoreMatch(char *a, char *b, int size, int matchScore, int mismatchScore, char ignore) /* Compare two sequences (without inserts or deletions) and score. */ { int i; int score = 0; for (i=0; i 0) { lineSize = lettersLeft; if (lineSize > maxPerLine) lineSize = maxPerLine; mustWrite(f, letters, lineSize); fputc('\n', f); letters += lineSize; lettersLeft -= lineSize; } } static int findTailPolyAMaybeMask(DNA *dna, int size, boolean doMask, boolean loose) /* Identify PolyA at end; mask to 'n' if specified. This allows a few * non-A's as noise to be trimmed too. Returns number of bases trimmed. * Leaves first two bases of PolyA in case there's a taa stop codon. */ { int i; int score = 10; int bestScore = 10; int bestPos = -1; int trimSize = 0; for (i=size-1; i>=0; --i) { DNA b = dna[i]; if (b == 'n' || b == 'N') continue; if (score > 20) score = 20; if (b == 'a' || b == 'A') { score += 1; if (score >= bestScore) { bestScore = score; bestPos = i; } else if (loose && score >= (bestScore - 8)) { /* If loose, keep extending even if score isn't back up to best. */ bestPos = i; } } else { score -= 10; } if (score < 0) { break; } } if (bestPos >= 0) { trimSize = size - bestPos - 2; // Leave two for aa in taa stop codon if (trimSize > 0) { if (doMask) for (i=size - trimSize; i 20) score = 20; if (b == 't' || b == 'T') { score += 1; if (score >= bestScore) { bestScore = score; bestPos = i; } else if (loose && score >= (bestScore - 8)) { /* If loose, keep extending even if score isn't back up to best. */ bestPos = i; } } else { score -= 10; } if (score < 0) { pastPoly = i; break; } } if (bestPos >= 0) { trimSize = bestPos+1 - 2; // Leave two for aa in taa stop codon if (trimSize > 0) { if (doMask) memset(dna, 'n', trimSize); } else trimSize = 0; } return trimSize; } int headPolyTSizeLoose(DNA *dna, int size) /* Return size of PolyT at start (if present). This allows a few non-T's as * noise to be trimmed too, but skips last two tt for revcomp'd taa stop * codon. * It is less conservative in extending the polyA region than maskHeadPolyT. */ { return findHeadPolyTMaybeMask(dna, size, FALSE, TRUE); } int maskHeadPolyT(DNA *dna, int size) /* Convert PolyT at start. This allows a few non-T's as noise to be * trimmed too. Returns number of bases trimmed. */ { return findHeadPolyTMaybeMask(dna, size, TRUE, FALSE); } boolean isDna(char *poly, int size) /* Return TRUE if letters in poly are at least 90% ACGTU */ { int i; int dnaCount = 0; dnaUtilOpen(); for (i=0; i= round(0.9 * size)); } boolean isAllDna(char *poly, int size) /* Return TRUE if letters in poly are 100% ACGTU */ { int i; if (size <= 1) return FALSE; dnaUtilOpen(); for (i=0; istring = needMem(initialBufSize+1); ds->bufSize = initialBufSize; return ds; } void freeDyString(struct dyString **pDs) /* Free up dynamic string. */ { struct dyString *ds; if ((ds = *pDs) != NULL) { freeMem(ds->string); freez(pDs); } } char *dyStringCannibalize(struct dyString **pDy) /* Kill dyString, but return the string it is wrapping * (formerly dy->string). This should be free'd at your * convenience. */ { char *s; struct dyString *ds = *pDy; assert(ds != NULL); s = ds->string; freez(pDy); return s; } void freeDyStringList(struct dyString **pDs) /* free up a list of dyStrings */ { struct dyString *ds, *next; for(ds = *pDs; ds != NULL; ds = next) { next = ds->next; freeDyString(&ds); } *pDs = NULL; } static void dyStringExpandBuf(struct dyString *ds, int newSize) /* Expand buffer to new size. */ { ds->string = needMoreMem(ds->string, ds->stringSize+1, newSize+1); ds->bufSize = newSize; } void dyStringBumpBufSize(struct dyString *ds, int size) /* Force dyString buffer to be at least given size. */ { if (ds->bufSize < size) dyStringExpandBuf(ds, size); } void dyStringAppendN(struct dyString *ds, char *string, int stringSize) /* Append string of given size to end of string. */ { int oldSize = ds->stringSize; int newSize = oldSize + stringSize; char *buf; if (newSize > ds->bufSize) { int newAllocSize = newSize + oldSize; int oldSizeTimesOneAndAHalf = oldSize * 1.5; if (newAllocSize < oldSizeTimesOneAndAHalf) newAllocSize = oldSizeTimesOneAndAHalf; dyStringExpandBuf(ds,newAllocSize); } buf = ds->string; memcpy(buf+oldSize, string, stringSize); ds->stringSize = newSize; buf[newSize] = 0; } char dyStringAppendC(struct dyString *ds, char c) /* Append char to end of string. */ { char *s; if (ds->stringSize >= ds->bufSize) dyStringExpandBuf(ds, ds->bufSize+256); s = ds->string + ds->stringSize++; *s++ = c; *s = 0; return c; } void dyStringAppendMultiC(struct dyString *ds, char c, int n) /* Append N copies of char to end of string. */ { int oldSize = ds->stringSize; int newSize = oldSize + n; int newAllocSize = newSize + oldSize; char *buf; if (newSize > ds->bufSize) dyStringExpandBuf(ds,newAllocSize); buf = ds->string; memset(buf+oldSize, c, n); ds->stringSize = newSize; buf[newSize] = 0; } void dyStringAppend(struct dyString *ds, char *string) /* Append zero terminated string to end of dyString. */ { dyStringAppendN(ds, string, strlen(string)); } void dyStringAppendEscapeQuotes(struct dyString *dy, char *string, char quot, char esc) /* Append escaped-for-quotation version of string to dy. */ { char c; char *s = string; while ((c = *s++) != 0) { if (c == quot) dyStringAppendC(dy, esc); dyStringAppendC(dy, c); } } void dyStringVaPrintf(struct dyString *ds, char *format, va_list args) /* VarArgs Printf to end of dyString. */ { /* attempt to format the string in the current space. If there * is not enough room, increase the buffer size and try again */ int avail, sz; while (TRUE) { va_list argscp; va_copy(argscp, args); avail = ds->bufSize - ds->stringSize; if (avail <= 0) { /* Don't pass zero sized buffers to vsnprintf, because who knows * if the library function will handle it. */ dyStringExpandBuf(ds, ds->bufSize+ds->bufSize); avail = ds->bufSize - ds->stringSize; } sz = vsnprintf(ds->string + ds->stringSize, avail, format, argscp); va_end(argscp); /* note that some version return -1 if too small */ if ((sz < 0) || (sz >= avail)) dyStringExpandBuf(ds, ds->bufSize+ds->bufSize); else { ds->stringSize += sz; break; } } } void dyStringPrintf(struct dyString *ds, char *format, ...) /* Printf to end of dyString. */ { va_list args; va_start(args, format); dyStringVaPrintf(ds, format, args); va_end(args); } struct dyString *dyStringCreate(char *format, ...) /* Create a dyString with a printf style initial content */ { int len = strlen(format) * 3; struct dyString *ds = newDyString(len); va_list args; va_start(args, format); dyStringVaPrintf(ds, format, args); va_end(args); return ds; } struct dyString * dyStringSub(char *orig, char *in, char *out) /* Make up a duplicate of orig with all occurences of in substituted * with out. */ { int inLen = strlen(in), outLen = strlen(out), origLen = strlen(orig); struct dyString *dy = newDyString(origLen + 2*outLen); char *s, *e; if (orig == NULL) return NULL; for (s = orig; ;) { e = stringIn(in, s); if (e == NULL) { e = orig + origLen; dyStringAppendN(dy, s, e - s); break; } else { dyStringAppendN(dy, s, e - s); dyStringAppendN(dy, out, outLen); s = e + inLen; } } return dy; } void dyStringResize(struct dyString *ds, int newSize) /* resize a string, if the string expands, blanks are appended */ { int oldSize = ds->stringSize; if (newSize > oldSize) { /* grow */ if (newSize > ds->bufSize) dyStringExpandBuf(ds, newSize + ds->stringSize); memset(ds->string+newSize, ' ', newSize); } ds->string[newSize] = '\0'; ds->stringSize = newSize; } void dyStringQuoteString(struct dyString *dy, char quotChar, char *text) /* Append quotChar-quoted text (with any internal occurrences of quotChar * \-escaped) onto end of dy. */ { char c; dyStringAppendC(dy, quotChar); while ((c = *text++) != 0) { if (c == quotChar) dyStringAppendC(dy, '\\'); dyStringAppendC(dy, c); } dyStringAppendC(dy, quotChar); } rtracklayer/src/ucsc/dystring.h0000644000126300012640000000605412227135242020225 0ustar00biocbuildphs_compbio/* dystring - dynamically resizing string. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef DYSTRING_H /* Wrapper to avoid including this twice. */ #define DYSTRING_H struct dyString /* Dynamically resizable string that you can do formatted * output to. */ { struct dyString *next; /* Next in list. */ char *string; /* Current buffer. */ int bufSize; /* Size of buffer. */ int stringSize; /* Size of string. */ }; struct dyString *newDyString(int initialBufSize); /* Allocate dynamic string with initial buffer size. (Pass zero for default) */ #define dyStringNew newDyString void freeDyString(struct dyString **pDs); /* Free up dynamic string. */ #define dyStringFree(a) freeDyString(a); void freeDyStringList(struct dyString **pDs); /* Free up a list of dynamic strings */ #define dyStringFreeList(a) freeDyStringList(a); void dyStringAppend(struct dyString *ds, char *string); /* Append zero terminated string to end of dyString. */ void dyStringAppendN(struct dyString *ds, char *string, int stringSize); /* Append string of given size to end of string. */ char dyStringAppendC(struct dyString *ds, char c); /* Append char to end of string. */ void dyStringAppendMultiC(struct dyString *ds, char c, int n); /* Append N copies of char to end of string. */ void dyStringAppendEscapeQuotes(struct dyString *dy, char *string, char quot, char esc); /* Append escaped-for-quotation version of string to dy. */ #define dyStringWriteOne(dy, var) dyStringAppendN(dy, (char *)(&var), sizeof(var)) /* Write one variable (binary!) to dyString - for cases when want to treat string like * a file stream. */ void dyStringVaPrintf(struct dyString *ds, char *format, va_list args); /* VarArgs Printf to end of dyString. */ void dyStringPrintf(struct dyString *ds, char *format, ...) /* Printf to end of dyString. */ #ifdef __GNUC__ __attribute__((format(printf, 2, 3))) #endif ; struct dyString *dyStringCreate(char *format, ...); /* Create a dyString with a printf style initial content */ #define dyStringClear(ds) (ds->string[0] = ds->stringSize = 0) /* Clear string. */ struct dyString * dyStringSub(char *orig, char *in, char *out); /* Make up a duplicate of orig with all occurences of in substituted * with out. */ void dyStringBumpBufSize(struct dyString *ds, int size); /* Force dyString buffer to be at least given size. */ char *dyStringCannibalize(struct dyString **pDy); /* Kill dyString, but return the string it is wrapping * (formerly dy->string). This should be free'd at your * convenience. */ #define dyStringContents(ds) (ds)->string /* return raw string. */ #define dyStringLen(ds) ds->stringSize /* return raw string length. */ void dyStringResize(struct dyString *ds, int newSize); /* resize a string, if the string expands, blanks are appended */ void dyStringQuoteString(struct dyString *dy, char quotChar, char *text); /* Append quotChar-quoted text (with any internal occurrences of quotChar * \-escaped) onto end of dy. */ #endif /* DYSTRING_H */ rtracklayer/src/ucsc/errCatch.h0000644000126300012640000000342412227135242020113 0ustar00biocbuildphs_compbio/* errCatch - help catch errors so that errAborts aren't * fatal, and warn's don't necessarily get printed immediately. * Note that error conditions caught this way will tend to * leak resources unless there are additional wrappers. * * Typical usage is * errCatch = errCatchNew(); * if (errCatchStart(errCatch)) * doFlakyStuff(); * errCatchEnd(errCatch); * if (errCatch->gotError) * warn("Flaky stuff failed: %s", errCatch->message->string); * errCatchFree(&errCatch); * cleanupFlakyStuff(); */ #ifndef ERRCATCH_H #define ERRCATCH_H #ifndef DYSTRING_H #include "dystring.h" #endif struct errCatch /* Something to help catch errors. */ { struct errCatch *next; /* Next in stack. */ jmp_buf jmpBuf; /* Where to jump back to for recovery. */ struct dyString *message; /* Error message if any */ boolean gotError; /* Some sort of error was caught. */ }; struct errCatch *errCatchNew(); /* Return new error catching structure. */ void errCatchFree(struct errCatch **pErrCatch); /* Free up resources associated with errCatch */ #define errCatchStart(e) (errCatchPushHandlers(e) && setjmp(e->jmpBuf) == 0) /* Little wrapper around setjmp. This returns TRUE * on the main execution thread, FALSE after abort. */ boolean errCatchPushHandlers(struct errCatch *errCatch); /* Push error handlers. Not usually called directly. * but rather through errCatchStart() macro. Always * returns TRUE. */ void errCatchEnd(struct errCatch *errCatch); /* Restore error handlers and pop self off of catching stack. */ boolean errCatchFinish(struct errCatch **pErrCatch); /* Finish up error catching. Report error if there is a * problem and return FALSE. If no problem return TRUE. * This handles errCatchEnd and errCatchFree. */ #endif /* ERRCATCH_H */ rtracklayer/src/ucsc/errabort.c0000644000126300012640000002127412227135242020176 0ustar00biocbuildphs_compbio/* ErrAbort.c - our error handler. * * This maintains two stacks - a warning message printer * stack, and a "abort handler" stack. * * By default the warnings will go to stderr, and * aborts will exit the program. You can push a * function on to the appropriate stack to change * this behavior. The top function on the stack * gets called. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ // developer: this include is for an occasionally useful means of getting stack info without crashing // however, it is not supported on cygwin. Conditionally compile this in when desired. //#define BACKTRACE_EXISTS #ifdef BACKTRACE_EXISTS #include #endif///def BACKTRACE_EXISTS #ifndef WIN32 #include #endif #include "common.h" #include "hash.h" #include "dystring.h" #include "errabort.h" static char const rcsid[] = "$Id: errabort.c,v 1.16 2010/01/12 18:16:27 markd Exp $"; #define maxWarnHandlers 20 #define maxAbortHandlers 12 struct perThreadAbortVars /* per thread variables for abort and warn */ { boolean debugPushPopErr; // generate stack dump on push/pop error boolean errAbortInProgress; /* Flag to indicate that an error abort is in progress. * Needed so that a warn handler can tell if it's really * being called because of a warning or an error. */ WarnHandler warnArray[maxWarnHandlers]; int warnIx; AbortHandler abortArray[maxAbortHandlers]; int abortIx; }; static struct perThreadAbortVars *getThreadVars(); // forward declaration static void defaultVaWarn(char *format, va_list args) /* Default error message handler. */ { if (format != NULL) { fflush(stdout); vfprintf(stderr, format, args); fprintf(stderr, "\n"); } } static void silentVaWarn(char *format, va_list args) /* Warning handler that just hides it. Useful sometimes when high level code * expects low level code may fail (as in finding a file on the net) but doesn't * want user to be bothered about it. */ { } void vaWarn(char *format, va_list args) /* Call top of warning stack to issue warning. */ { struct perThreadAbortVars *ptav = getThreadVars(); ptav->warnArray[ptav->warnIx](format, args); } void warn(char *format, ...) /* Issue a warning message. */ { va_list args; va_start(args, format); vaWarn(format, args); va_end(args); } void warnWithBackTrace(char *format, ...) /* Issue a warning message and append backtrace. */ { va_list args; va_start(args, format); struct dyString *dy = newDyString(255); dyStringAppend(dy, format); #define STACK_LIMIT 20 char **strings = NULL; int count = 0; // developer: this is an occasionally useful means of getting stack info without crashing // however, it is not supported on cygwin. Conditionally compile this in when desired. // The define is at top to include execinfo.h #ifdef BACKTRACE_EXISTS void *buffer[STACK_LIMIT]; count = backtrace(buffer, STACK_LIMIT); strings = backtrace_symbols(buffer, count); #endif///def BACKTRACE_EXISTS if (strings == NULL) dyStringAppend(dy,"\nno backtrace_symbols available in errabort::warnWithBackTrace()."); else { dyStringAppend(dy,"\nBACKTRACE [can use 'addr2line -Cfise {exe} addr addr ...']:"); int ix; for (ix = 1; ix < count && strings[ix] != NULL; ix++) dyStringPrintf(dy,"\n%s", strings[ix]); free(strings); } vaWarn(dyStringCannibalize(&dy), args); va_end(args); } void errnoWarn(char *format, ...) /* Prints error message from UNIX errno first, then does rest of warning. */ { char fbuf[512]; va_list args; va_start(args, format); sprintf(fbuf, "%s\n%s", strerror(errno), format); vaWarn(fbuf, args); va_end(args); } void pushWarnHandler(WarnHandler handler) /* Set abort handler */ { struct perThreadAbortVars *ptav = getThreadVars(); if (ptav->warnIx >= maxWarnHandlers-1) { #ifndef WIN32 if (ptav->debugPushPopErr) dumpStack("pushWarnHandler overflow"); #endif errAbort("Too many pushWarnHandlers, can only handle %d\n", maxWarnHandlers-1); } ptav->warnArray[++ptav->warnIx] = handler; } void popWarnHandler() /* Revert to old warn handler. */ { struct perThreadAbortVars *ptav = getThreadVars(); if (ptav->warnIx <= 0) { #ifndef WIN32 if (ptav->debugPushPopErr) dumpStack("popWarnHandler underflow"); #endif errAbort("Too few popWarnHandlers"); } --ptav->warnIx; } static void defaultAbort() /* Default error handler exits program. */ { if ((getenv("ERRASSERT") != NULL) || (getenv("ERRABORT") != NULL)) abort(); else exit(-1); } void noWarnAbort() /* Abort without message. */ { struct perThreadAbortVars *ptav = getThreadVars(); ptav->abortArray[ptav->abortIx](); exit(-1); /* This is just to make compiler happy. * We have already exited or longjmped by now. */ } void vaErrAbort(char *format, va_list args) /* Abort function, with optional (vprintf formatted) error message. */ { /* flag is needed because both errAbort and warn generate message * using the warn handler, however sometimes one needed to know * (like when logging), if it's an error or a warning. This is far from * perfect, as this isn't cleared if the error handler continues, * as with an exception mechanism. */ struct perThreadAbortVars *ptav = getThreadVars(); ptav->errAbortInProgress = TRUE; vaWarn(format, args); noWarnAbort(); } void errAbort(char *format, ...) /* Abort function, with optional (printf formatted) error message. */ { va_list args; va_start(args, format); vaErrAbort(format, args); va_end(args); } void errnoAbort(char *format, ...) /* Prints error message from UNIX errno first, then does errAbort. */ { char fbuf[512]; va_list args; va_start(args, format); sprintf(fbuf, "%s\n%s", strerror(errno), format); vaErrAbort(fbuf, args); va_end(args); } void pushAbortHandler(AbortHandler handler) /* Set abort handler */ { struct perThreadAbortVars *ptav = getThreadVars(); if (ptav->abortIx >= maxAbortHandlers-1) { #ifndef WIN32 if (ptav->debugPushPopErr) dumpStack("pushAbortHandler overflow"); #endif errAbort("Too many pushAbortHandlers, can only handle %d", maxAbortHandlers-1); } ptav->abortArray[++ptav->abortIx] = handler; } void popAbortHandler() /* Revert to old abort handler. */ { struct perThreadAbortVars *ptav = getThreadVars(); if (ptav->abortIx <= 0) { #ifndef WIN32 if (ptav->debugPushPopErr) dumpStack("popAbortHandler underflow"); #endif errAbort("Too many popAbortHandlers\n"); } --ptav->abortIx; } static void debugAbort() /* Call the debugger. */ { fflush(stdout); assert(FALSE); defaultAbort(); } void pushDebugAbort() /* Push abort handler that will invoke debugger. */ { pushAbortHandler(debugAbort); } static void warnAbortHandler(char *format, va_list args) /* warn handler that also aborts. */ { defaultVaWarn(format, args); noWarnAbort(); } void pushWarnAbort() /* Push handler that will abort on warnings. */ { pushWarnHandler(warnAbortHandler); } void pushSilentWarnHandler() /* Set warning handler to be quiet. Do a popWarnHandler to restore. */ { pushWarnHandler(silentVaWarn); } void errAbortDebugnPushPopErr() /* generate stack dump if there is a error in the push/pop functions */ { struct perThreadAbortVars *ptav = getThreadVars(); ptav->debugPushPopErr = TRUE; } boolean isErrAbortInProgress() /* Flag to indicate that an error abort is in progress. * Needed so that a warn handler can tell if it's really * being called because of a warning or an error. */ { struct perThreadAbortVars *ptav = getThreadVars(); return ptav->errAbortInProgress; } static struct perThreadAbortVars *getThreadVars() /* Return a pointer to the perThreadAbortVars for the current pthread. */ { // A true integer has function would be nicer, but this will do. // Don't safef, theoretically that could abort. char key[64]; #ifndef WIN32 static pthread_mutex_t ptavMutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock( &ptavMutex ); pthread_t pid = pthread_self(); // can be a pointer or a number snprintf(key, sizeof(key), "%lld", ptrToLL(pid)); key[ArraySize(key)-1] = '\0'; #else key[0] = '\0'; #endif static struct hash *perThreadVars = NULL; if (perThreadVars == NULL) perThreadVars = hashNew(0); struct hashEl *hel = hashLookup(perThreadVars, key); if (hel == NULL) { // if it is the first time, initialization the perThreadAbortVars struct perThreadAbortVars *ptav; AllocVar(ptav); ptav->debugPushPopErr = FALSE; ptav->errAbortInProgress = FALSE; ptav->warnIx = 0; ptav->warnArray[0] = defaultVaWarn; ptav->abortIx = 0; ptav->abortArray[0] = defaultAbort; hel = hashAdd(perThreadVars, key, ptav); } #ifndef WIN32 pthread_mutex_unlock( &ptavMutex ); #endif return (struct perThreadAbortVars *)(hel->val); } rtracklayer/src/ucsc/errabort.h0000644000126300012640000000472512227135242020205 0ustar00biocbuildphs_compbio/* ErrAbort.h - our error handler. * * This maintains two stacks - a warning message printer * stack, and a "abort handler" stack. * * By default the warnings will go to stderr, and * aborts will exit the program. You can push a * function on to the appropriate stack to change * this behavior. The top function on the stack * gets called. * * Most functions in this library will call errAbort() * if they run out of memory. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef ERRABORT_H #define ERRABORT_H boolean isErrAbortInProgress(); /* Flag to indicate that an error abort is in progress. * Needed so that a warn handler can tell if it's really * being called because of a warning or an error. */ void errAbort(char *format, ...) /* Abort function, with optional (printf formatted) error message. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; void vaErrAbort(char *format, va_list args); /* Abort function, with optional (vprintf formatted) error message. */ void errnoAbort(char *format, ...) /* Prints error message from UNIX errno first, then does errAbort. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; typedef void (*AbortHandler)(); /* Function that can abort. */ void pushAbortHandler(AbortHandler handler); /* Set abort handler */ void popAbortHandler(); /* Revert to old abort handler. */ void noWarnAbort(); /* Abort without message. */ void pushDebugAbort(); /* Push abort handler that will invoke debugger. */ void vaWarn(char *format, va_list args); /* Call top of warning stack to issue warning. */ void warn(char *format, ...) /* Issue a warning message. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; void errnoWarn(char *format, ...) /* Prints error message from UNIX errno first, then does rest of warning. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; typedef void (*WarnHandler)(char *format, va_list args); /* Function that can warn. */ void pushWarnHandler(WarnHandler handler); /* Set warning handler */ void popWarnHandler(); /* Revert to old warn handler. */ void pushWarnAbort(); /* Push handler that will abort on warnings. */ void pushSilentWarnHandler(); /* Set warning handler to be quiet. Do a popWarnHandler to restore. */ void errAbortDebugnPushPopErr(); /* generate stack dump if there is a error in the push/pop functions */ #endif /* ERRABORT_H */ rtracklayer/src/ucsc/hash.c0000644000126300012640000004403512227135242017301 0ustar00biocbuildphs_compbio/* Hash.c - implements hashing. See hash.h for usage comments. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "localmem.h" #include "hash.h" #include "obscure.h" #include "dystring.h" static char const rcsid[] = "$Id: hash.c,v 1.51 2009/11/10 22:46:19 angie Exp $"; /* * Hash a string key. This code is taken from Tcl interpreter. I was borrowed * after discovering a lot of collisions and poor utilization of the table * when hashing accessions. * * This function was compared to Bob Jenkins' lookup2 hash function and * (http://burtleburtle.net/bob/hash/) and Paul Hsieh's SuperFast * hash function (http://www.azillionmonkeys.com/qed/hash.html). * Both of those functions provided better utilization of the table, * but were also more expensive, so the Tcl function was used. * If hashing of binary keys is implemented, SuperFast hash should * be considered. * * for an explanation of this function, see HashStringKey() in the * Tcl source file, generic/tclHash.c, available from * http://tcl.sourceforge.net/. * * The Tcl code is: * Copyright (c) 1991-1993 The Regents of the University of California. * Copyright (c) 1994 Sun Microsystems, Inc. * * See the file "license.terms" (in the Tcl distribution) for complete * license (which is a BSD-style license). * * Since hashCrc() is in use elsewhere, * a new function hashString() was created for use in hash table. * -- markd */ bits32 hashString(char *string) /* Compute a hash value of a string. */ { char *keyStr = string; unsigned int result = 0; int c; while ((c = *keyStr++) != '\0') { result += (result<<3) + c; } return result; } bits32 hashCrc(char *string) /* Returns a CRC value on string. */ { unsigned char *us = (unsigned char *)string; unsigned char c; bits32 shiftAcc = 0; bits32 addAcc = 0; while ((c = *us++) != 0) { shiftAcc <<= 2; shiftAcc += c; addAcc += c; } return shiftAcc + addAcc; } struct hashEl *hashLookup(struct hash *hash, char *name) /* Looks for name in hash table. Returns associated element, * if found, or NULL if not. If there are multiple entries * for name, the last one added is returned (LIFO behavior). */ { struct hashEl *el = hash->table[hashString(name)&hash->mask]; while (el != NULL) { if (strcmp(el->name, name) == 0) break; el = el->next; } return el; } struct hashEl *hashLookupUpperCase(struct hash *hash, char *name) /* Lookup upper cased name in hash. (Assumes all elements of hash * are themselves already in upper case.) */ { char s[256]; safef(s, sizeof(s), "%s", name); touppers(s); return hashLookup(hash, s); } struct hashEl *hashLookupNext(struct hashEl *hashEl) /* Find the next occurance of name that may occur in the table multiple times, * or NULL if not found. Use hashLookup to find the first occurrence. Elements * are returned in LIFO order. */ { struct hashEl *el = hashEl->next; while (el != NULL) { if (strcmp(el->name, hashEl->name) == 0) break; el = el->next; } return el; } struct hashEl *hashAddN(struct hash *hash, char *name, int nameSize, void *val) /* Add name of given size to hash (no need to be zero terminated) */ { struct hashEl *el; if (hash->lm) el = lmAlloc(hash->lm, sizeof(*el)); else AllocVar(el); el->hashVal = hashString(name); int hashVal = el->hashVal & hash->mask; if (hash->lm) { el->name = lmAlloc(hash->lm, nameSize+1); memcpy(el->name, name, nameSize); } else el->name = cloneStringZ(name, nameSize); el->val = val; el->next = hash->table[hashVal]; hash->table[hashVal] = el; hash->elCount += 1; if (hash->autoExpand && hash->elCount > (int)(hash->size * hash->expansionFactor)) { /* double the size */ hashResize(hash, digitsBaseTwo(hash->size)); } return el; } struct hashEl *hashAdd(struct hash *hash, char *name, void *val) /* Add new element to hash table. If an item with name, already exists, a new * item is added in a LIFO manner. The last item added for a given name is * the one returned by the hashLookup functions. hashLookupNext must be used * to find the preceding entries for a name. */ { return hashAddN(hash, name, strlen(name), val); } boolean hashMayRemove(struct hash *hash, char *name) /* Remove item of the given name from hash table, if present. * Return true if it was present */ { return (hashRemove(hash, name) != NULL); } void hashMustRemove(struct hash *hash, char *name) /* Remove item of the given name from hash table, or error * if not present */ { if (hashRemove(hash, name) == NULL) errAbort("attempt to remove non-existant %s from hash", name); } void freeHashEl(struct hashEl *hel) /* Free hash element. Use only on non-local memory version. */ { freeMem(hel->name); freeMem(hel); } void *hashRemove(struct hash *hash, char *name) /* Remove item of the given name from hash table. * Returns value of removed item, or NULL if not in the table. * If their are multiple entries for name, the last one added * is removed (LIFO behavior). */ { struct hashEl *hel; void *ret; struct hashEl **pBucket = &hash->table[hashString(name)&hash->mask]; for (hel = *pBucket; hel != NULL; hel = hel->next) if (sameString(hel->name, name)) break; if (hel == NULL) return NULL; ret = hel->val; if (slRemoveEl(pBucket, hel)) { hash->elCount -= 1; if (!hash->lm) freeHashEl(hel); } return ret; } struct hashEl *hashAddUnique(struct hash *hash, char *name, void *val) /* Add new element to hash table. Squawk and die if not unique */ { if (hashLookup(hash, name) != NULL) errAbort("%s duplicated, aborting", name); return hashAdd(hash, name, val); } struct hashEl *hashAddSaveName(struct hash *hash, char *name, void *val, char **saveName) /* Add new element to hash table. Save the name of the element, which is now * allocated in the hash table, to *saveName. A typical usage would be: * AllocVar(el); * hashAddSaveName(hash, name, el, &el->name); */ { struct hashEl *hel = hashAdd(hash, name, val); *saveName = hel->name; return hel; } struct hashEl *hashStore(struct hash *hash, char *name) /* If element in hash already return it, otherwise add it * and return it. */ { struct hashEl *hel; if ((hel = hashLookup(hash, name)) != NULL) return hel; return hashAdd(hash, name, NULL); } char *hashStoreName(struct hash *hash, char *name) /* If element in hash already return it, otherwise add it * and return it. */ { struct hashEl *hel; if (name == NULL) return NULL; if ((hel = hashLookup(hash, name)) != NULL) return hel->name; return hashAdd(hash, name, NULL)->name; } int hashIntVal(struct hash *hash, char *name) /* Find size of name in hash or die trying. */ { void *val = hashMustFindVal(hash, name); return ptToInt(val); } int hashIntValDefault(struct hash *hash, char *name, int defaultInt) /* Return integer value associated with name in a simple * hash of ints or defaultInt if not found. */ { struct hashEl *hel = hashLookup(hash, name); if(hel == NULL) return defaultInt; return ptToInt(hel->val); } void *hashMustFindVal(struct hash *hash, char *name) /* Lookup name in hash and return val. Abort if not found. */ { struct hashEl *hel = hashLookup(hash, name); if (hel == NULL) errAbort("hashMustFindVal: '%s' not found", name); return hel->val; } void *hashFindVal(struct hash *hash, char *name) /* Look up name in hash and return val or NULL if not found. */ { struct hashEl *hel = hashLookup(hash, name); if (hel == NULL) return NULL; return hel->val; } void *hashOptionalVal(struct hash *hash, char *name, void *usual) /* Look up name in hash and return val, or usual if not found. */ { struct hashEl *hel = hashLookup(hash, name); if (hel == NULL) return usual; else return hel->val; } void *hashFindValUpperCase(struct hash *hash, char *name) /* Lookup upper cased name in hash and return val or return NULL if not found. * (Assumes all elements of hash are themselves already in upper case.) */ { struct hashEl *hel = hashLookupUpperCase(hash, name); if (hel == NULL) return NULL; return hel->val; } char *hashMustFindName(struct hash *hash, char *name) /* Return name as stored in hash table (in hel->name). * Abort if not found. */ { struct hashEl *hel = hashLookup(hash, name); if (hel == NULL) errAbort("hashMustFindName: '%s' not found", name); return hel->name; } struct hashEl *hashAddInt(struct hash *hash, char *name, int val) /* Store integer value in hash */ { char *pt = NULL; return hashAdd(hash, name, pt + val); } void hashIncInt(struct hash *hash, char *name) /* Increment integer value in hash */ { struct hashEl *hel = hashLookup(hash, name); if (hel == NULL) { hashAddInt(hash, name, 1); } else { hel->val = ((char *)hel->val)+1; /* The much simpler ++hel->val works for gnu C, but really adding one to a void pointer * I think is not well defined. */ } } long long hashIntSum(struct hash *hash) /* Return sum of all the ints in a hash of ints. */ { long long sum = 0; int i; struct hashEl *hel; for (i=0; isize; ++i) { for (hel = hash->table[i]; hel != NULL; hel = hel->next) { int num = ptToInt(hel->val); sum += (long long)num; } } return sum; } struct hash *newHashExt(int powerOfTwoSize, boolean useLocalMem) /* Returns new hash table. Uses local memory optionally. */ { struct hash *hash = needMem(sizeof(*hash)); int memBlockPower = 16; if (powerOfTwoSize == 0) powerOfTwoSize = 12; assert(powerOfTwoSize <= hashMaxSize && powerOfTwoSize > 0); hash->powerOfTwoSize = powerOfTwoSize; hash->size = (1<lm = lmInit(1<mask = hash->size-1; AllocArray(hash->table, hash->size); hash->autoExpand = TRUE; hash->expansionFactor = defaultExpansionFactor; /* Expand when elCount > size*expansionFactor */ return hash; } void hashResize(struct hash *hash, int powerOfTwoSize) /* Resize the hash to a new size */ { int oldHashSize = hash->size; struct hashEl **oldTable = hash->table; if (powerOfTwoSize == 0) powerOfTwoSize = 12; assert(powerOfTwoSize <= hashMaxSize && powerOfTwoSize > 0); hash->powerOfTwoSize = powerOfTwoSize; hash->size = (1<mask = hash->size-1; AllocArray(hash->table, hash->size); int i; struct hashEl *hel, *next; for (i=0; inext; int hashVal = hel->hashVal & hash->mask; hel->next = hash->table[hashVal]; hash->table[hashVal] = hel; } } /* restore original list order */ for (i=0; isize; ++i) { struct hashEl *hel = hash->table[i]; if (hel != NULL && hel->next != NULL) slReverse(&hash->table[i]); } freeMem(oldTable); hash->numResizes++; } struct hash *hashFromSlNameList(void *list) /* Create a hash out of a list of slNames or any kind of list where the */ /* first field is the next pointer and the second is the name. */ { struct hash *hash = NULL; struct slName *namedList = list, *item; if (!list) return NULL; hash = newHash(0); for (item = namedList; item != NULL; item = item->next) hashAdd(hash, item->name, item); return hash; } void hashTraverseEls(struct hash *hash, void (*func)(struct hashEl *hel)) /* Apply func to every element of hash with hashEl as parameter. */ { int i; struct hashEl *hel; for (i=0; isize; ++i) { for (hel = hash->table[i]; hel != NULL; hel = hel->next) func(hel); } } void hashTraverseVals(struct hash *hash, void (*func)(void *val)) /* Apply func to every element of hash with hashEl->val as parameter. */ { int i; struct hashEl *hel; for (i=0; isize; ++i) { for (hel = hash->table[i]; hel != NULL; hel = hel->next) func(hel->val); } } int hashElCmp(const void *va, const void *vb) /* Compare two hashEl by name. */ { const struct hashEl *a = *((struct hashEl **)va); const struct hashEl *b = *((struct hashEl **)vb); return strcmp(a->name, b->name); } void *hashElFindVal(struct hashEl *list, char *name) /* Look up name in hashEl list and return val or NULL if not found. */ { struct hashEl *el; for (el = list; el != NULL; el = el->next) { if (strcmp(el->name, name) == 0) return el->val; } return NULL; } struct hashEl *hashElListHash(struct hash *hash) /* Return a list of all elements of hash. Free return with hashElFreeList. */ { int i; struct hashEl *hel, *dupe, *list = NULL; for (i=0; isize; ++i) { for (hel = hash->table[i]; hel != NULL; hel = hel->next) { dupe = CloneVar(hel); slAddHead(&list, dupe); } } return list; } void hashElFree(struct hashEl **pEl) /* Free hash el list returned from hashListAll. (Don't use * this internally.) */ { freez(pEl); } void hashElFreeList(struct hashEl **pList) /* Free hash el list returned from hashListAll. (Don't use * this internally. */ { slFreeList(pList); } struct hashCookie hashFirst(struct hash *hash) /* Return an object to use by hashNext() to traverse the hash table. * The first call to hashNext will return the first entry in the table. */ { struct hashCookie cookie; cookie.hash = hash; cookie.idx = 0; cookie.nextEl = NULL; /* find first entry */ for (cookie.idx = 0; (cookie.idx < hash->size) && (hash->table[cookie.idx] == NULL); cookie.idx++) continue; /* empty body */ if (cookie.idx < hash->size) cookie.nextEl = hash->table[cookie.idx]; return cookie; } struct hashEl* hashNext(struct hashCookie *cookie) /* Return the next entry in the hash table, or NULL if no more. Do not modify * hash table while this is being used. */ { /* NOTE: if hashRemove were coded to track the previous entry during the * search and then use it to do the remove, it would be possible to * remove the entry returned by this method */ struct hashEl *retEl = cookie->nextEl; if (retEl == NULL) return NULL; /* no more */ /* find next entry */ cookie->nextEl = retEl->next; if (cookie->nextEl == NULL) { for (cookie->idx++; (cookie->idx < cookie->hash->size) && (cookie->hash->table[cookie->idx] == NULL); cookie->idx++) continue; /* empty body */ if (cookie->idx < cookie->hash->size) cookie->nextEl = cookie->hash->table[cookie->idx]; } return retEl; } void* hashNextVal(struct hashCookie *cookie) /* Return the next value in the hash table, or NULL if no more. Do not modify * hash table while this is being used. */ { struct hashEl *hel = hashNext(cookie); if (hel == NULL) return NULL; else return hel->val; } char *hashNextName(struct hashCookie *cookie) /* Return the next name in the hash table, or NULL if no more. Do not modify * hash table while this is being used. */ { struct hashEl *hel = hashNext(cookie); if (hel == NULL) return NULL; else return hel->name; } void freeHash(struct hash **pHash) /* Free up hash table. */ { struct hash *hash = *pHash; if (hash == NULL) return; if (hash->lm) lmCleanup(&hash->lm); else { int i; struct hashEl *hel, *next; for (i=0; isize; ++i) { for (hel = hash->table[i]; hel != NULL; hel = next) { next = hel->next; freeHashEl(hel); } } } freeMem(hash->table); freez(pHash); } void freeHashAndVals(struct hash **pHash) /* Free up hash table and all values associated with it. * (Just calls freeMem on each hel->val) */ { struct hash *hash; if ((hash = *pHash) != NULL) { hashTraverseVals(hash, freeMem); freeHash(pHash); } } void hashFreeWithVals(struct hash **pHash, void (freeFunc)()) /* Free up hash table and all values associated with it. freeFunc is a * function to free an entry, should take a pointer to a pointer to an * entry. */ { struct hash *hash = *pHash; if (hash != NULL) { struct hashCookie cookie = hashFirst(hash); struct hashEl *hel; while ((hel = hashNext(&cookie)) != NULL) freeFunc(&hel->val); hashFree(pHash); } } void hashFreeList(struct hash **pList) /* Free up a list of hashes. */ { struct hash *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; hashFree(&el); } *pList = NULL; } static int bucketLen(struct hashEl *hel) /* determine how many elements are in a hash bucket */ { int nel = 0; for (; hel != NULL; hel = hel->next) nel++; return nel; } void hashHisto(struct hash *hash, char *fname) /* Output bucket usage counts to a file for producing a histogram */ { FILE* fh = mustOpen(fname, "w"); int i; for (i=0; isize; ++i) fprintf(fh, "%d\n", bucketLen(hash->table[i])); carefulClose(&fh); } void hashPrintStats(struct hash *hash, char *label, FILE *fh) /* print statistic about a hash table */ { // count up usage int i, occupiedCnt = 0, maxBucket = 0; for (i=0; isize; ++i) { if (hash->table[i] != NULL) occupiedCnt++; int sz = bucketLen(hash->table[i]); maxBucket = max(maxBucket, sz); } fprintf(fh, "hashTable\t%s\n", label); fprintf(fh, "tableSize\t%d\t%d\n", hash->size, hash->powerOfTwoSize); fprintf(fh, "numElements\t%d\n", hash->elCount); fprintf(fh, "occupied\t%d\t%0.4f\n", occupiedCnt, ((hash->size == 0) ? 0.0 : ((float)occupiedCnt)/hash->size)); fprintf(fh, "maxBucket\t%d\n", maxBucket); fprintf(fh, "numResizes\t%d\n", hash->numResizes); fprintf(fh, "\n"); } struct hashEl *hashReplace(struct hash *hash, char *name, void *val) /* Replace an existing element in hash table, or add it if not present. */ { if (hashLookup(hash, name)) hashRemove(hash, name); return hashAdd(hash, name, val); } char *hashToRaString(struct hash *hash) /* Convert hash to string in ra format. */ { struct hashEl *el, *list = hashElListHash(hash); struct dyString *dy = dyStringNew(0); slSort(&list, hashElCmp); for (el = list; el != NULL; el = el->next) { dyStringAppend(dy, el->name); dyStringAppendC(dy, ' '); dyStringAppend(dy, el->val); dyStringAppendC(dy, '\n'); } hashElFreeList(&list); return dyStringCannibalize(&dy); } int hashNumEntries(struct hash *hash) /* count the number of entries in a hash */ { int n = 0, i; for (i=0; isize; ++i) n += bucketLen(hash->table[i]); return n; } rtracklayer/src/ucsc/hash.h0000644000126300012640000002454412227135242017311 0ustar00biocbuildphs_compbio/* Hash - a simple hash table that provides name/value pairs. * The most common usage is to create a hash as so: * struct hash *hash = hashNew(0); * to add elements to a hash as so: * hashAdd(hash, name, value); * and to retrieve a named element as so: * value = hashFindVal(hash, name); * The hashFindVal function will return NULL if the name does not * appear in the hash. Alternatively you can use: * value = hashMustFindVal(hash, name); * which will abort if name is not in the hash. When done with a hash do: * hashFree(&hash); * * The hash does support multiple values for the same key. To use * this functionality, try the loop: * struct hashEl *hel; * for (hel = hashLookup(hash, name); hel != NULL; hel = hashLookupNext(hel)) * { * value = hel->val; * // Further processing here. * The order of elements retrieved this way will be most-recently-added first. * The hashLookup function is _slightly_ faster than the hashFindVal function, * so sometimes it is used just to test for the presence of an element in the * hash when not interested in the value associated with it. * * One can iterate through all the elements in a hash in three ways. One can * get a list of all things in the hash as so: * struct hashEl *hel, *helList = hashElListHash(hash); * for (hel = helList; hel != NULL; hel = hel->next) * { * value = hel->val; * // Further processing of value here. * } * hashElFreeList(&helList); * One can avoid the overhead of creating a list by using an iterator object * and function: * struct hashEl *hel; * struct hashCookie cookie = hashFirst(hash); * while ((hel = hashNext(&cookie)) != NULL) * { * value = hel->val; * Finally one can use hashTraverseEls or hashTraverseVals with a callback * function that takes a hashEl, or the void *value as parameter respectively. * * There are various other functions involving hashes in this module as well * that provide various short cuts. For information on these and additional * details of the functions described, please read the full hash.h file, and * if so inclined the hash.c file as well. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef HASH_H #define HASH_H struct hashEl /* An element in a hash list. */ { struct hashEl *next; char *name; void *val; bits32 hashVal; }; struct hash { struct hash *next; /* Next in list. */ bits32 mask; /* Mask hashCrc with this to get it to fit table. */ struct hashEl **table; /* Hash buckets. */ int powerOfTwoSize; /* Size of table as a power of two. */ int size; /* Size of table. */ struct lm *lm; /* Local memory pool. */ int elCount; /* Count of elements. */ boolean autoExpand; /* Automatically expand hash */ float expansionFactor; /* Expand when elCount > size*expansionFactor */ int numResizes; /* number of times resize was called */ }; #define defaultExpansionFactor 1.0 #define hashMaxSize 28 struct hashCookie /* used by hashFirst/hashNext in tracking location in traversing hash */ { struct hash *hash; /* hash we are associated with */ int idx; /* current index in hash */ struct hashEl *nextEl; /* current element in hash */ }; bits32 hashString(char *string); /* Compute a hash value of a string. */ bits32 hashCrc(char *string); /* Returns a CRC value on string. */ struct hashEl *hashLookup(struct hash *hash, char *name); /* Looks for name in hash table. Returns associated element, * if found, or NULL if not. If there are multiple entries * for name, the last one added is returned (LIFO behavior). */ struct hashEl *hashLookupUpperCase(struct hash *hash, char *name); /* Lookup upper cased name in hash. (Assumes all elements of hash * are themselves already in upper case.) */ struct hashEl *hashLookupNext(struct hashEl *hashEl); /* Find the next occurance of name that may occur in the table multiple times, * or NULL if not found. Use hashLookup to find the first occurrence. Elements * are returned in LIFO order. */ struct hashEl *hashAdd(struct hash *hash, char *name, void *val); /* Add new element to hash table. If an item with name, already exists, a new * item is added in a LIFO manner. The last item added for a given name is * the one returned by the hashLookup functions. hashLookupNext must be used * to find the preceding entries for a name. */ struct hashEl *hashAddN(struct hash *hash, char *name, int nameSize, void *val); /* Add name of given size to hash (no need to be zero terminated) */ void *hashRemove(struct hash *hash, char *name); /* Remove item of the given name from hash table. * Returns value of removed item, or NULL if not in the table. * If their are multiple entries for name, the last one added * is removed (LIFO behavior). */ struct hashEl *hashAddUnique(struct hash *hash, char *name, void *val); /* Add new element to hash table. Squawk and die if is already in table. */ struct hashEl *hashAddSaveName(struct hash *hash, char *name, void *val, char **saveName); /* Add new element to hash table. Save the name of the element, which is now * allocated in the hash table, to *saveName. A typical usage would be: * AllocVar(el); * hashAddSaveName(hash, name, el, &el->name); */ struct hashEl *hashStore(struct hash *hash, char *name); /* If element in hash already return it, otherwise add it * and return it. */ char *hashStoreName(struct hash *hash, char *name); /* Put name into hash table. */ char *hashMustFindName(struct hash *hash, char *name); /* Return name as stored in hash table (in hel->name). * Abort if not found. */ void *hashMustFindVal(struct hash *hash, char *name); /* Lookup name in hash and return val. Abort if not found. */ void *hashFindVal(struct hash *hash, char *name); /* Look up name in hash and return val or NULL if not found. */ void *hashOptionalVal(struct hash *hash, char *name, void *usual); /* Look up name in hash and return val, or usual if not found. */ void *hashFindValUpperCase(struct hash *hash, char *name); /* Lookup upper cased name in hash and return val or return NULL if not found. * (Assumes all elements of hash are themselves already in upper case.) */ struct hashEl *hashAddInt(struct hash *hash, char *name, int val); /* Store integer value in hash */ void hashIncInt(struct hash *hash, char *name); /* Increment integer value in hash */ int hashIntVal(struct hash *hash, char *name); /* Return integer value associated with name in a simple * hash of ints. */ int hashIntValDefault(struct hash *hash, char *name, int defaultInt); /* Return integer value associated with name in a simple * hash of ints or defaultInt if not found. */ long long hashIntSum(struct hash *hash); /* Return sum of all the ints in a hash of ints. */ void hashTraverseEls(struct hash *hash, void (*func)(struct hashEl *hel)); /* Apply func to every element of hash with hashEl as parameter. */ void hashTraverseVals(struct hash *hash, void (*func)(void *val)); /* Apply func to every element of hash with hashEl->val as parameter. */ struct hashEl *hashElListHash(struct hash *hash); /* Return a list of all elements of hash. Free return with hashElFreeList. */ int hashElCmp(const void *va, const void *vb); /* Compare two hashEl by name. */ void *hashElFindVal(struct hashEl *list, char *name); /* Look up name in hashEl list and return val or NULL if not found. */ void hashElFree(struct hashEl **pEl); /* Free hash el list returned from hashListAll. */ void hashElFreeList(struct hashEl **pList); /* Free hash el list returned from hashListAll. (Don't use * this internally. */ struct hashCookie hashFirst(struct hash *hash); /* Return an object to use by hashNext() to traverse the hash table. * The first call to hashNext will return the first entry in the table. */ struct hashEl* hashNext(struct hashCookie *cookie); /* Return the next entry in the hash table, or NULL if no more. Do not modify * hash table while this is being used. (see note in code if you want to fix * this) */ void *hashNextVal(struct hashCookie *cookie); /* Return the next value in the hash table, or NULL if no more. Do not modify * hash table while this is being used. */ char *hashNextName(struct hashCookie *cookie); /* Return the next name in the hash table, or NULL if no more. Do not modify * hash table while this is being used. */ struct hash *newHashExt(int powerOfTwoSize, boolean useLocalMem); /* Returns new hash table. Uses local memory optionally. */ #define hashNewExt(a) newHashExt(a) /* Synonym */ #define newHash(a) newHashExt(a, TRUE) /* Returns new hash table using local memory. */ #define hashNew(a) newHash(a) /* Synonym */ void hashResize(struct hash *hash, int powerOfTwoSize); /* Resize the hash to a new size */ struct hash *hashFromSlNameList(void *list); /* Create a hash out of a list of slNames or any kind of list where the */ /* first field is the next pointer and the second is the name. */ void freeHash(struct hash **pHash); /* Free up hash table. */ #define hashFree(a) freeHash(a) /* Synonym */ void freeHashAndVals(struct hash **pHash); /* Free up hash table and all values associated with it. * (Just calls freeMem on each hel->val) */ void hashFreeWithVals(struct hash **pHash, void (freeFunc)()); /* Free up hash table and all values associated with it. freeFunc is a * function to free an entry, should take a pointer to a pointer to an * entry. */ void hashFreeList(struct hash **pList); /* Free up a list of hashes. */ void hashHisto(struct hash *hash, char *fname); /* Output bucket usage counts to a file for producing a histogram */ void hashPrintStats(struct hash *hash, char *label, FILE *fh); /* print statistic about a hash table */ struct hashEl *hashReplace(struct hash *hash, char *name, void *val); /* Replace an existing element in hash table, or add it if not present. */ boolean hashMayRemove(struct hash *hash, char *name); /* Remove item of the given name from hash table, if present. * Return true if it was present */ void hashMustRemove(struct hash *hash, char *name); /* Remove item of the given name from hash table, or error * if not present */ char *hashToRaString(struct hash *hash); /* Convert hash to string in ra format. */ int hashNumEntries(struct hash *hash); /* count the number of entries in a hash */ #endif /* HASH_H */ rtracklayer/src/ucsc/hmmstats.c0000644000126300012640000000223612227135242020213 0ustar00biocbuildphs_compbio/* hmmstats.c - Stuff for doing statistical analysis in general and * hidden Markov models in particular. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "hmmstats.h" static char const rcsid[] = "$Id: hmmstats.c,v 1.5 2009/02/03 20:50:29 kent Exp $"; int scaledLog(double val) /* Return scaled log of val. */ { return round(logScaleFactor * log(val)); } double oneOverSqrtTwoPi = 0.39894228; double simpleGaussean(double x) /* Gaussean distribution with standard deviation 1 and mean 0. */ { return oneOverSqrtTwoPi * exp(-0.5*x*x ); } double gaussean(double x, double mean, double sd) /* Gaussean distribution with mean and standard deviation at point x */ { x -= mean; x /= sd; return oneOverSqrtTwoPi * exp(-0.5*x*x) / sd; } double calcVarianceFromSums(double sum, double sumSquares, bits64 n) /* Calculate variance. */ { double var = sumSquares - sum*sum/n; if (n > 1) var /= n-1; return var; } double calcStdFromSums(double sum, double sumSquares, bits64 n) /* Calculate standard deviation. */ { return sqrt(calcVarianceFromSums(sum, sumSquares, n)); } rtracklayer/src/ucsc/hmmstats.h0000644000126300012640000000213312227135242020214 0ustar00biocbuildphs_compbio/***************************************************************************** * Copyright (C) 2000 Jim Kent. This source code may be freely used * * for personal, academic, and non-profit purposes. Commercial use * * permitted only by explicit agreement with Jim Kent (jim_kent@pacbell.net) * *****************************************************************************/ /* hmmstats.h - Stuff for doing statistical analysis in general and * hidden Markov models in particular. */ #ifndef HMMSTATS_H #define HMMSTATS_H int scaledLog(double val); /* Return scaled log of val. */ #define logScaleFactor 1000 /* Amount we scale logs by. */ double simpleGaussean(double x); /* Gaussean distribution with standard deviation 1 and mean 0. */ double gaussean(double x, double mean, double sd); /* Gaussean distribution with mean and standard deviation at point x */ double calcVarianceFromSums(double sum, double sumSquares, bits64 n); /* Calculate variance. */ double calcStdFromSums(double sum, double sumSquares, bits64 n); /* Calculate standard deviation. */ #endif /* HMMSTATS_H */ rtracklayer/src/ucsc/htmshell.h0000644000126300012640000001275412227135242020206 0ustar00biocbuildphs_compbio/* Htmshell.h - stuff to make it easier to generate HTML files on * the fly. Typically included with cheapcgi.h in almost any * CGI program. * * To use this generally you should call the function htmShell() * very early inside of main(). You pass htmShell() a routine * which does most of the work of your web server-side applet. * * These routines will throw errors, which are caught by * htmShell, which then returns. For the most part you just * want an error to cause an error message to be printed and * then terminate your CGI program, so this works fine. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ void htmlSetCookie(char* name, char* value, char* expires, char* path, char* domain, boolean isSecure); /* create a cookie with the given stats */ void htmlParagraph(char *line, ...); /* Print a line in it's own paragraph. */ void htmlVaParagraph(char *line, va_list args); /* Print a line in it's own paragraph. */ void htmlCenterParagraph(char *line, ...); /* Center a line in it's own paragraph. */ void htmlHorizontalLine(); /* Print a horizontal line. */ void htmlNbSpaces(int count); /* Print a number of non-breaking spaces. */ void htmHorizontalLine(FILE *f); /* Print a horizontal line. */ void htmTextOut(FILE *f, char *s); /* Print out string to file, if necessary replacing > with > and the like */ void htmlTextOut(char *s); /* Print out string, if necessary replacing > with > and the like */ char *htmlTextStripTags(char *s); /* Returns a cloned string with all html tags stripped out */ char *htmlEncodeText(char *s, boolean tagsOkay); /* Returns a cloned string with quotes replaced by html codes. Changes ',",\n and if not tagsOkay >,<,& to code equivalents. This differs from cgiEncode as it handles text that will be displayed in an html page or tooltip style title. */ #define htmlEncode(s) htmlEncodeText(s,FALSE) void htmlMemDeath(); /* Complain about lack of memory and abort. */ void htmlStart(char *title); /* Write the start of a cgi-generated html file */ void htmStart(FILE *f, char *title); /* Write the start of a stand alone .html file. */ void htmStartWithHead(FILE *f, char *head, char *title); /* Write the start of a stand alone .html file, plus head info */ void htmStartDirDepth(FILE *f, char *title, int dirDepth); /* Write the start of a stand alone .html file. dirDepth is the number of levels * beneath apache root that caller's HTML will appear to the web client. * E.g. if writing HTML from cgi-bin, dirDepth is 1; if trash/body/, 2. */ void htmlEnd(); /* Write the end of a cgi-generated html file */ void htmEnd(FILE *f); /* Write the end of a stand-alone html file */ extern char *htmlStyleUndecoratedLink; /* Style that gets rid of underline of links. */ void htmlSetStyle(char *style); /* Set document wide style. A favorite style to * use for many purposes is htmlStyleUndecoratedLink * which will remove underlines from links. * Needs to be called before htmlStart or htmShell. */ void htmlSetBackground(char *imageFile); /* Set background image - needs to be called before htmlStart * or htmShell. */ void htmlSetBgColor(int color); /* Set background color - needs to be called before htmlStart * or htmShell. */ void htmlBadVar(char *varName); /* Complain about input variables. */ void htmlImage(char *fileName, int width, int height); /* Display centered image file. */ jmp_buf htmlRecover; /* Error recovery jump. Exposed for cart's use. */ void htmlVaWarn(char *format, va_list args); /* Write an error message. (Generally you just call warn() or errAbort(). * This is exposed mostly for the benefit of the cart.) */ char *htmlWarnStartPattern(); /* Return starting pattern for warning message. */ char *htmlWarnEndPattern(); /* Return ending pattern for warning message. */ void htmlWarnBoxSetup(FILE *f); /* Creates an invisible, empty warning box than can be filled with errors * and then made visible. */ void htmlAbort(); /* Terminate HTML file. Exposed for cart's use. */ void htmlPushEarlyHandlers(); /* Push stuff to close out web page to make sensible error * message during initialization. */ /* Wrap error recovery around call to doMiddle. */ void htmErrOnlyShell(void (*doMiddle)()); /* Wrap error recovery and and input processing around call to doMiddle. */ void htmEmptyShell(void (*doMiddle)(), char *method); /* Wrap an html file around the passed in function. * The passed in function is already in the body. It * should just make paragraphs and return. * Method should be "query" or "get" or "post" (or NULL * if you don't care).. */ void htmShell( char *title, void (*doMiddle)(), char *method); /* Wrap an html file around the passed in function. * The passed in function is already in the body. It * should just make paragraphs and return. * Method should be "query" or "get" or "post". param title - The HTML page title param head - The head text: can be a refresh directive or javascript param method - The function pointer to execute in the middle param method - The browser request method to use */ void htmShellWithHead( char *title, char *head, void (*doMiddle)(), char *method); /* tell htmlOut to not escape special HTML chars '<', '>' */ void htmlNoEscape(); /* tell htmlOut to escape special HTML chars '<', '>' */ void htmlDoEscape(); /* Include an HTML file in a CGI. * The file path is relative to the web server document root */ void htmlIncludeWebFile(char *file); /* Include an HTML file in a CGI */ void htmlIncludeFile(char *path); rtracklayer/src/ucsc/https.c0000644000126300012640000001644412227135242017523 0ustar00biocbuildphs_compbio/* Connect via https. */ #ifdef USE_SSL #include "openssl/ssl.h" #include "openssl/err.h" #include #include #include #include "common.h" #include "errabort.h" static pthread_mutex_t *mutexes = NULL; static unsigned long openssl_id_callback(void) { return ((unsigned long)pthread_self()); } static void openssl_locking_callback(int mode, int n, const char * file, int line) { if (mode & CRYPTO_LOCK) pthread_mutex_lock(&mutexes[n]); else pthread_mutex_unlock(&mutexes[n]); } void openssl_pthread_setup(void) { int i; int numLocks = CRYPTO_num_locks(); AllocArray(mutexes, numLocks); for (i = 0; i < numLocks; i++) pthread_mutex_init(&mutexes[i], NULL); CRYPTO_set_id_callback(openssl_id_callback); CRYPTO_set_locking_callback(openssl_locking_callback); } struct netConnectHttpsParams /* params to pass to thread */ { pthread_t thread; char *hostName; int port; int sv[2]; /* the pair of socket descriptors */ }; static void xerrno(char *msg) { fprintf(stderr, "%s : %s\n", strerror(errno), msg); fflush(stderr); } static void xerr(char *msg) { fprintf(stderr, "%s\n", msg); fflush(stderr); } void openSslInit() /* do only once */ { static boolean done = FALSE; static pthread_mutex_t osiMutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock( &osiMutex ); if (!done) { SSL_library_init(); ERR_load_crypto_strings(); ERR_load_SSL_strings(); OpenSSL_add_all_algorithms(); openssl_pthread_setup(); done = TRUE; } pthread_mutex_unlock( &osiMutex ); } void *netConnectHttpsThread(void *threadParam) /* use a thread to run socket back to user */ { /* child */ struct netConnectHttpsParams *params = threadParam; pthread_detach(params->thread); // this thread will never join back with it's progenitor int fd=0; char hostnameProto[256]; BIO *sbio; SSL_CTX *ctx; SSL *ssl; openSslInit(); ctx = SSL_CTX_new(SSLv23_client_method()); fd_set readfds; fd_set writefds; int err; struct timeval tv; /* TODO checking certificates char *certFile = NULL; char *certPath = NULL; if (certFile || certPath) { SSL_CTX_load_verify_locations(ctx,certFile,certPath); #if (OPENSSL_VERSION_NUMBER < 0x0090600fL) SSL_CTX_set_verify_depth(ctx,1); #endif } // verify paths and mode. */ sbio = BIO_new_ssl_connect(ctx); BIO_get_ssl(sbio, &ssl); if(!ssl) { xerr("Can't locate SSL pointer"); goto cleanup; } /* Don't want any retries since we are non-blocking bio now */ //SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY); safef(hostnameProto,sizeof(hostnameProto),"%s:%d",params->hostName,params->port); BIO_set_conn_hostname(sbio, hostnameProto); BIO_set_nbio(sbio, 1); /* non-blocking mode */ while (1) { if (BIO_do_connect(sbio) == 1) { break; /* Connected */ } if (! BIO_should_retry(sbio)) { xerr("BIO_do_connect() failed"); char s[256]; safef(s, sizeof s, "SSL error: %s", ERR_reason_error_string(ERR_get_error())); xerr(s); goto cleanup; } fd = BIO_get_fd(sbio, NULL); if (fd == -1) { xerr("unable to get BIO descriptor"); goto cleanup; } FD_ZERO(&readfds); FD_ZERO(&writefds); if (BIO_should_read(sbio)) { FD_SET(fd, &readfds); } else if (BIO_should_write(sbio)) { FD_SET(fd, &writefds); } else { /* BIO_should_io_special() */ FD_SET(fd, &readfds); FD_SET(fd, &writefds); } tv.tv_sec = 10; // timeout tv.tv_usec = 0; err = select(fd + 1, &readfds, &writefds, NULL, &tv); if (err < 0) { xerr("select() error"); goto cleanup; } if (err == 0) { char s[256]; safef(s, sizeof s, "connection timeout to %s", params->hostName); xerr(s); goto cleanup; } } /* TODO checking certificates if (certFile || certPath) if (!check_cert(ssl, host)) return -1; */ /* we need to wait on both the user's socket and the BIO SSL socket * to see if we need to ferry data from one to the other */ char sbuf[32768]; // socket buffer sv[1] to user char bbuf[32768]; // bio buffer int srd = 0; int swt = 0; int brd = 0; int bwt = 0; while (1) { // Do NOT move this outside the while loop. /* Get underlying file descriptor, needed for select call */ fd = BIO_get_fd(sbio, NULL); if (fd == -1) { xerr("BIO doesn't seem to be initialized in https, unable to get descriptor."); goto cleanup; } FD_ZERO(&readfds); FD_ZERO(&writefds); if (brd == 0) FD_SET(fd, &readfds); if (swt < srd) FD_SET(fd, &writefds); if (srd == 0) FD_SET(params->sv[1], &readfds); tv.tv_sec = 10; // timeout tv.tv_usec = 0; err = select(max(fd,params->sv[1]) + 1, &readfds, &writefds, NULL, &tv); /* Evaluate select() return code */ if (err < 0) { xerr("error during select()"); goto cleanup; } else if (err == 0) { /* Timed out - just quit */ xerr("https timeout expired"); goto cleanup; } else { if (FD_ISSET(params->sv[1], &readfds)) { swt = 0; srd = read(params->sv[1], sbuf, 32768); if (srd == -1) { if (errno != 104) // udcCache often closes causing "Connection reset by peer" xerrno("error reading https socket"); goto cleanup; } if (srd == 0) break; // user closed socket, we are done } if (FD_ISSET(fd, &writefds)) { int swtx = BIO_write(sbio, sbuf+swt, srd-swt); if (swtx <= 0) { if (!BIO_should_write(sbio)) { ERR_print_errors_fp(stderr); xerr("Error writing SSL connection"); goto cleanup; } } else { swt += swtx; if (swt >= srd) { swt = 0; srd = 0; } } } if (FD_ISSET(fd, &readfds)) { bwt = 0; brd = BIO_read(sbio, bbuf, 32768); if (brd <= 0) { if (BIO_should_read(sbio)) { brd = 0; continue; } else { if (brd == 0) break; ERR_print_errors_fp(stderr); xerr("Error reading SSL connection"); goto cleanup; } } // write the https data received immediately back on socket to user, and it's ok if it blocks. while(bwt < brd) { int bwtx = write(params->sv[1], bbuf+bwt, brd-bwt); if (bwtx == -1) { if ((errno != 104) // udcCache often closes causing "Connection reset by peer" && (errno != 32)) // udcCache often closes causing "Broken pipe" xerrno("error writing https data back to user socket"); goto cleanup; } bwt += bwtx; } brd = 0; bwt = 0; } } } cleanup: BIO_free_all(sbio); close(params->sv[1]); /* we are done with it */ return NULL; } int netConnectHttps(char *hostName, int port) /* Return socket for https connection with server or -1 if error. */ { fflush(stdin); fflush(stdout); fflush(stderr); struct netConnectHttpsParams *params; AllocVar(params); params->hostName = cloneString(hostName); params->port = port; socketpair(AF_UNIX, SOCK_STREAM, 0, params->sv); int rc; rc = pthread_create(¶ms->thread, NULL, netConnectHttpsThread, (void *)params); if (rc) { errAbort("Unexpected error %d from pthread_create(): %s",rc,strerror(rc)); } /* parent */ return params->sv[0]; } #else #include #include "common.h" #include "errabort.h" int netConnectHttps(char *hostName, int port) /* Start https connection with server or die. */ { errAbort("No openssl available in netConnectHttps for %s : %d", hostName, port); return -1; /* will never get to here, make compiler happy */ } #endif rtracklayer/src/ucsc/https.h0000644000126300012640000000032112227135242017513 0ustar00biocbuildphs_compbio/* Connect via https. */ #ifndef NET_HTTPS_H #define NET_HTTPS_H int netConnectHttps(char *hostName, int port); /* Return socket for https connection with server or -1 if error. */ #endif//ndef NET_HTTPS_H rtracklayer/src/ucsc/internet.c0000644000126300012640000000714112227135242020203 0ustar00biocbuildphs_compbio#ifndef WIN32 /* internet - some stuff to make it easier to use * internet sockets and the like. */ #include "common.h" #include "internet.h" static char const rcsid[] = "$Id: internet.c,v 1.11 2010/03/11 17:54:35 angie Exp $"; boolean internetIsDottedQuad(char *s) /* Returns TRUE if it looks like s is a dotted quad. */ { int i; if (!isdigit(s[0])) return FALSE; for (i=0; i<3; ++i) { s = strchr(s, '.'); if (s == NULL) return FALSE; s += 1; if (!isdigit(s[0])) return FALSE; } return TRUE; } bits32 internetHostIp(char *hostName) /* Get IP v4 address (in host byte order) for hostName. * Warn and return 0 if there's a problem. */ { bits32 ret; if (internetIsDottedQuad(hostName)) { internetDottedQuadToIp(hostName, &ret); } else { /* getaddrinfo is thread-safe and widely supported */ struct addrinfo hints, *res; struct in_addr addr; int err; zeroBytes(&hints, sizeof(hints)); hints.ai_family = AF_INET; if ((err = getaddrinfo(hostName, NULL, &hints, &res)) != 0) { warn("getaddrinfo() error on hostName=%s: %s\n", hostName, gai_strerror(err)); return 0; } addr = ((struct sockaddr_in *)(res->ai_addr))->sin_addr; ret = ntohl((uint32_t)addr.s_addr); freeaddrinfo(res); } return ret; } boolean internetFillInAddress(char *hostName, int port, struct sockaddr_in *address) /* Fill in address. Return FALSE if can't. */ { ZeroVar(address); address->sin_family = AF_INET; address->sin_port = htons(port); if (hostName == NULL) address->sin_addr.s_addr = INADDR_ANY; else { if ((address->sin_addr.s_addr = htonl(internetHostIp(hostName))) == 0) return FALSE; } return TRUE; } boolean internetIpToDottedQuad(bits32 ip, char dottedQuad[17]) /* Convert IP4 address in host byte order to dotted quad * notation. Warn and return FALSE if there's a * problem. */ { #ifndef __CYGWIN32__ struct in_addr ia; zeroBytes(dottedQuad, 17); ZeroVar(&ia); ia.s_addr = htonl(ip); if (inet_ntop(AF_INET, &ia, dottedQuad, 16) == NULL) { warn("conversion problem on 0x%x in internetIpToDottedQuad: %s", ip, strerror(errno)); return FALSE; } return TRUE; #else warn("Sorry, internetIpToDottedQuad not supported in Windows."); return FALSE; #endif } boolean internetDottedQuadToIp(char *dottedQuad, bits32 *retIp) /* Convert dotted quad format address to IP4 address in * host byte order. Warn and return FALSE if there's a * problem. */ { #ifndef __CYGWIN32__ struct in_addr ia; if (inet_pton(AF_INET, dottedQuad, &ia) < 0) { warn("internetDottedQuadToIp problem on %s: %s", dottedQuad, strerror(errno)); return FALSE; } *retIp = ntohl(ia.s_addr); return TRUE; #else warn("Sorry, internetDottedQuadToIp not supported in Windows."); return FALSE; #endif } void internetParseDottedQuad(char *dottedQuad, unsigned char quad[4]) /* Parse dotted quads into quad */ { char *s = dottedQuad; int i; if (!internetIsDottedQuad(s)) errAbort("%s is not a dotted quad", s); for (i=0; i<4; ++i) { quad[i] = atoi(s); s = strchr(s, '.') + 1; } } void internetUnpackIp(bits32 packed, unsigned char unpacked[4]) /* Convert from 32 bit to 4-byte format with most significant * byte first. */ { int i; for (i=3; i>=0; --i) { unpacked[i] = (packed&0xff); packed >>= 8; } } boolean internetIpInSubnet(unsigned char unpackedIp[4], unsigned char subnet[4]) /* Return true if unpacked IP address is in subnet. */ { int i; for (i=0; i<4; ++i) { unsigned char c = subnet[i]; if (c == 255) return TRUE; if (c != unpackedIp[i]) return FALSE; } return TRUE; } #endif rtracklayer/src/ucsc/internet.h0000644000126300012640000000271612227135242020213 0ustar00biocbuildphs_compbio/* internet - some stuff for routines that use the internet * and aren't afraid to include some internet specific structures * and the like. See also net for stuff that is higher level. */ #ifndef INTERNET_H #include #include #include #include bits32 internetHostIp(char *hostName); /* Get IP v4 address (in host byte order) for hostName. * Warn and return 0 if there's a problem. */ boolean internetFillInAddress(char *hostName, int port, struct sockaddr_in *address); /* Fill in address. Warn and return FALSE if can't. */ boolean internetIpToDottedQuad(bits32 ip, char dottedQuad[17]); /* Convert IP4 address in host byte order to dotted quad * notation. Warn and return FALSE if there's a * problem. */ boolean internetDottedQuadToIp(char *dottedQuad, bits32 *retIp); /* Convert dotted quad format address to IP4 address in * host byte order. Warn and return FALSE if there's a * problem. */ boolean internetIsDottedQuad(char *s); /* Returns TRUE if it looks like s is a dotted quad. */ void internetParseDottedQuad(char *dottedQuad, unsigned char quad[4]); /* Parse dotted quads into quad */ void internetUnpackIp(bits32 packed, unsigned char unpacked[4]); /* Convert from 32 bit to 4-byte format with most significant * byte first. */ boolean internetIpInSubnet(unsigned char unpackedIp[4], unsigned char subnet[4]); /* Return true if unpacked IP address is in subnet. */ #endif /* INTERNET_H */ rtracklayer/src/ucsc/linefile.c0000644000126300012640000007647312227135242020160 0ustar00biocbuildphs_compbio/* lineFile - stuff to rapidly read text files and parse them into * lines. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "hash.h" #include #include "dystring.h" #include "errabort.h" #include "linefile.h" #include "pipeline.h" #include char *getFileNameFromHdrSig(char *m) /* Check if header has signature of supported compression stream, and return a phoney filename for it, or NULL if no sig found. */ { char buf[20]; char *ext=NULL; if (startsWith("\x1f\x8b",m)) ext = "gz"; else if (startsWith("\x1f\x9d\x90",m)) ext = "Z"; else if (startsWith("BZ",m)) ext = "bz2"; else if (startsWith("PK\x03\x04",m)) ext = "zip"; if (ext==NULL) return NULL; safef(buf, sizeof(buf), "somefile.%s", ext); return cloneString(buf); } static char **getDecompressor(char *fileName) /* if a file is compressed, return the command to decompress the * approriate format, otherwise return NULL */ { static char *GZ_READ[] = {"gzip", "-dc", NULL}; static char *Z_READ[] = {"gzip", "-dc", NULL}; static char *BZ2_READ[] = {"bzip2", "-dc", NULL}; static char *ZIP_READ[] = {"gzip", "-dc", NULL}; if (endsWith(fileName, ".gz")) return GZ_READ; else if (endsWith(fileName, ".Z")) return Z_READ; else if (endsWith(fileName, ".bz2")) return BZ2_READ; else if (endsWith(fileName, ".zip")) return ZIP_READ; else return NULL; } static void metaDataAdd(struct lineFile *lf, char *line) /* write a line of metaData to output file * internal function called by lineFileNext */ { struct metaOutput *meta = NULL; if (lf->isMetaUnique) { /* suppress repetition of comments */ if (hashLookup(lf->metaLines, line)) { return; } hashAdd(lf->metaLines, line, NULL); } for (meta = lf->metaOutput ; meta != NULL ; meta = meta->next) if (line != NULL && meta->metaFile != NULL) fprintf(meta->metaFile,"%s\n", line); } static void metaDataFree(struct lineFile *lf) /* free saved comments */ { if (lf->isMetaUnique && lf->metaLines) freeHash(&lf->metaLines); } void lineFileSetMetaDataOutput(struct lineFile *lf, FILE *f) /* set file to write meta data to, * should be called before reading from input file */ { struct metaOutput *meta = NULL; if (lf == NULL) return; AllocVar(meta); meta->next = NULL; meta->metaFile = f; slAddHead(&lf->metaOutput, meta); } void lineFileSetUniqueMetaData(struct lineFile *lf) /* suppress duplicate lines in metadata */ { lf->isMetaUnique = TRUE; lf->metaLines = hashNew(8); } static char * headerBytes(char *fileName, int numbytes) /* Return specified number of header bytes from file * if file exists as a string which should be freed. */ { int fd,bytesread=0; char *result = NULL; if ((fd = open(fileName, O_RDONLY)) >= 0) { result=needMem(numbytes+1); if ((bytesread=read(fd,result,numbytes)) < numbytes) freez(&result); /* file too short? can read numbytes */ else result[numbytes]=0; close(fd); } return result; } #ifndef WIN32 struct lineFile *lineFileDecompress(char *fileName, bool zTerm) /* open a linefile with decompression */ { struct pipeline *pl; struct lineFile *lf; char *testName = NULL; char *testbytes = NULL; /* the header signatures for .gz, .bz2, .Z, * .zip are all 2-4 bytes only */ if (fileName==NULL) return NULL; testbytes=headerBytes(fileName,4); if (!testbytes) return NULL; /* avoid error from pipeline */ testName=getFileNameFromHdrSig(testbytes); freez(&testbytes); if (!testName) return NULL; /* avoid error from pipeline */ pl = pipelineOpen1(getDecompressor(fileName), pipelineRead, fileName, NULL); lf = lineFileAttach(fileName, zTerm, pipelineFd(pl)); lf->pl = pl; return lf; } struct lineFile *lineFileDecompressFd(char *name, bool zTerm, int fd) /* open a linefile with decompression from a file or socket descriptor */ { struct pipeline *pl; struct lineFile *lf; pl = pipelineOpenFd1(getDecompressor(name), pipelineRead, fd, STDERR_FILENO); lf = lineFileAttach(name, zTerm, pipelineFd(pl)); lf->pl = pl; return lf; } struct lineFile *lineFileDecompressMem(bool zTerm, char *mem, long size) /* open a linefile with decompression from a memory stream */ { struct pipeline *pl; struct lineFile *lf; char *fileName = getFileNameFromHdrSig(mem); if (fileName==NULL) return NULL; pl = pipelineOpenMem1(getDecompressor(fileName), pipelineRead, mem, size, STDERR_FILENO); lf = lineFileAttach(fileName, zTerm, pipelineFd(pl)); lf->pl = pl; return lf; } #endif struct lineFile *lineFileAttach(char *fileName, bool zTerm, int fd) /* Wrap a line file around an open'd file. */ { struct lineFile *lf; AllocVar(lf); lf->fileName = cloneString(fileName); lf->fd = fd; lf->bufSize = 64*1024; lf->zTerm = zTerm; lf->buf = needMem(lf->bufSize+1); return lf; } struct lineFile *lineFileOnString(char *name, bool zTerm, char *s) /* Wrap a line file object around string in memory. This buffer * have zeroes written into it and be freed when the line file * is closed. */ { struct lineFile *lf; AllocVar(lf); lf->fileName = cloneString(name); lf->fd = -1; lf->bufSize = lf->bytesInBuf = strlen(s); lf->zTerm = zTerm; lf->buf = s; return lf; } struct lineFile *lineFileTabixMayOpen(char *fileOrUrl, bool zTerm) /* Wrap a line file around a data file that has been compressed and indexed * by the tabix command line program. The index file .tbi must be * readable in addition to fileOrUrl. If there's a problem, warn & return NULL. * This works only if kent/src has been compiled with USE_TABIX=1 and linked * with the tabix C library. */ { #ifdef USE_TABIX int tbiNameSize = strlen(fileOrUrl) + strlen(".tbi") + 1; char *tbiName = needMem(tbiNameSize); safef(tbiName, tbiNameSize, "%s.tbi", fileOrUrl); tabix_t *tabix = ti_open(fileOrUrl, tbiName); if (tabix == NULL) { warn("Unable to open \"%s\"", fileOrUrl); freez(&tbiName); return NULL; } if ((tabix->idx = ti_index_load(tbiName)) == NULL) { warn("Unable to load tabix index from \"%s\"", tbiName); ti_close(tabix); tabix = NULL; freez(&tbiName); return NULL; } struct lineFile *lf = needMem(sizeof(struct lineFile)); lf->fileName = cloneString(fileOrUrl); lf->fd = -1; lf->bufSize = 64 * 1024; lf->buf = needMem(lf->bufSize); lf->zTerm = zTerm; lf->tabix = tabix; freez(&tbiName); return lf; #else // no USE_TABIX warn(COMPILE_WITH_TABIX, "lineFileTabixMayOpen"); return NULL; #endif // no USE_TABIX } boolean lineFileSetTabixRegion(struct lineFile *lf, char *seqName, int start, int end) /* Assuming lf was created by lineFileTabixMayOpen, tell tabix to seek to the specified region * and return TRUE (or if there are no items in region, return FALSE). */ { #ifdef USE_TABIX if (lf->tabix == NULL) errAbort("lineFileSetTabixRegion: lf->tabix is NULL. Did you open lf with lineFileTabixMayOpen?"); if (seqName == NULL) return FALSE; int tabixSeqId = ti_get_tid(lf->tabix->idx, seqName); if (tabixSeqId < 0 && startsWith("chr", seqName)) // We will get some files that have chr-less Ensembl chromosome names: tabixSeqId = ti_get_tid(lf->tabix->idx, seqName+strlen("chr")); if (tabixSeqId < 0) return FALSE; ti_iter_t iter = ti_queryi(lf->tabix, tabixSeqId, start, end); if (iter == NULL) return FALSE; if (lf->tabixIter != NULL) ti_iter_destroy(lf->tabixIter); lf->tabixIter = iter; lf->bufOffsetInFile = ti_bgzf_tell(lf->tabix->fp); lf->bytesInBuf = 0; lf->lineIx = -1; lf->lineStart = 0; lf->lineEnd = 0; return TRUE; #else // no USE_TABIX warn(COMPILE_WITH_TABIX, "lineFileSetTabixRegion"); return FALSE; #endif // no USE_TABIX } void lineFileExpandBuf(struct lineFile *lf, int newSize) /* Expand line file buffer. */ { assert(newSize > lf->bufSize); lf->buf = needMoreMem(lf->buf, lf->bytesInBuf, newSize); lf->bufSize = newSize; } struct lineFile *lineFileStdin(bool zTerm) /* Wrap a line file around stdin. */ { return lineFileAttach("stdin", zTerm, fileno(stdin)); } struct lineFile *lineFileMayOpen(char *fileName, bool zTerm) /* Try and open up a lineFile. */ { if (sameString(fileName, "stdin")) return lineFileStdin(zTerm); #ifndef WIN32 else if (getDecompressor(fileName) != NULL) return lineFileDecompress(fileName, zTerm); #endif else { int fd = open(fileName, O_RDONLY); if (fd == -1) return NULL; return lineFileAttach(fileName, zTerm, fd); } } struct lineFile *lineFileOpen(char *fileName, bool zTerm) /* Open up a lineFile or die trying. */ { struct lineFile *lf = lineFileMayOpen(fileName, zTerm); if (lf == NULL) errAbort("Couldn't open %s , %s", fileName, strerror(errno)); return lf; } void lineFileReuse(struct lineFile *lf) /* Reuse current line. */ { lf->reuse = TRUE; } INLINE void noTabixSupport(struct lineFile *lf, char *where) { #ifdef USE_TABIX if (lf->tabix != NULL) lineFileAbort(lf, "%s: not implemented for lineFile opened with lineFileTabixMayOpen.", where); #endif // USE_TABIX } void lineFileSeek(struct lineFile *lf, off_t offset, int whence) /* Seek to read next line from given position. */ { noTabixSupport(lf, "lineFileSeek"); if (lf->pl != NULL) errnoAbort("Can't lineFileSeek on a compressed file: %s", lf->fileName); lf->reuse = FALSE; if (whence == SEEK_SET && offset >= lf->bufOffsetInFile && offset < lf->bufOffsetInFile + lf->bytesInBuf) { lf->lineStart = lf->lineEnd = offset - lf->bufOffsetInFile; } else { lf->lineStart = lf->lineEnd = lf->bytesInBuf = 0; if ((lf->bufOffsetInFile = lseek(lf->fd, offset, whence)) == -1) errnoAbort("Couldn't lineFileSeek %s", lf->fileName); } } void lineFileRewind(struct lineFile *lf) /* Return lineFile to start. */ { lineFileSeek(lf, 0, SEEK_SET); lf->lineIx = 0; } int lineFileLongNetRead(int fd, char *buf, int size) /* Keep reading until either get no new characters or * have read size */ { int oneSize, totalRead = 0; while (size > 0) { oneSize = read(fd, buf, size); if (oneSize <= 0) break; totalRead += oneSize; buf += oneSize; size -= oneSize; } return totalRead; } static void determineNlType(struct lineFile *lf, char *buf, int bufSize) /* determine type of newline used for the file, assumes buffer not empty */ { char *c = buf; if (bufSize==0) return; if (lf->nlType != nlt_undet) return; /* if already determined just exit */ lf->nlType = nlt_unix; /* start with default of unix lf type */ while (c < buf+bufSize) { if (*c=='\r') { lf->nlType = nlt_mac; if (++c < buf+bufSize) if (*c == '\n') lf->nlType = nlt_dos; return; } if (*(c++) == '\n') { return; } } } boolean lineFileNext(struct lineFile *lf, char **retStart, int *retSize) /* Fetch next line from file. */ { char *buf = lf->buf; int bytesInBuf = lf->bytesInBuf; int endIx = lf->lineEnd; boolean gotLf = FALSE; int newStart; if (lf->reuse) { lf->reuse = FALSE; if (retSize != NULL) *retSize = lf->lineEnd - lf->lineStart; *retStart = buf + lf->lineStart; if (lf->metaOutput && *retStart[0] == '#') metaDataAdd(lf, *retStart); return TRUE; } #ifdef USE_TABIX if (lf->tabix != NULL && lf->tabixIter != NULL) { // Just use line-oriented ti_read: int lineSize = 0; const char *line = ti_read(lf->tabix, lf->tabixIter, &lineSize); if (line == NULL) return FALSE; lf->bufOffsetInFile = -1; lf->bytesInBuf = lineSize; lf->lineIx = -1; lf->lineStart = 0; lf->lineEnd = lineSize; if (lineSize > lf->bufSize) // shouldn't be! but just in case: lineFileExpandBuf(lf, lineSize * 2); safecpy(lf->buf, lf->bufSize, line); *retStart = lf->buf; if (retSize != NULL) *retSize = lineSize; return TRUE; } #endif // USE_TABIX determineNlType(lf, buf+endIx, bytesInBuf); /* Find next end of line in buffer. */ switch(lf->nlType) { case nlt_unix: case nlt_dos: for (endIx = lf->lineEnd; endIx < bytesInBuf; ++endIx) { if (buf[endIx] == '\n') { gotLf = TRUE; endIx += 1; break; } } break; case nlt_mac: for (endIx = lf->lineEnd; endIx < bytesInBuf; ++endIx) { if (buf[endIx] == '\r') { gotLf = TRUE; endIx += 1; break; } } break; case nlt_undet: break; } /* If not in buffer read in a new buffer's worth. */ while (!gotLf) { int oldEnd = lf->lineEnd; int sizeLeft = bytesInBuf - oldEnd; int bufSize = lf->bufSize; int readSize = bufSize - sizeLeft; if (oldEnd > 0 && sizeLeft > 0) { memmove(buf, buf+oldEnd, sizeLeft); } lf->bufOffsetInFile += oldEnd; if (lf->fd >= 0) readSize = lineFileLongNetRead(lf->fd, buf+sizeLeft, readSize); #ifdef USE_TABIX else if (lf->tabix != NULL && readSize > 0) { readSize = ti_bgzf_read(lf->tabix->fp, buf+sizeLeft, readSize); if (readSize < 1) return FALSE; } #endif // USE_TABIX else readSize = 0; if ((readSize == 0) && (endIx > oldEnd)) { endIx = sizeLeft; buf[endIx] = 0; lf->bytesInBuf = newStart = lf->lineStart = 0; lf->lineEnd = endIx; ++lf->lineIx; if (retSize != NULL) *retSize = endIx - newStart; *retStart = buf + newStart; if (*retStart[0] == '#') metaDataAdd(lf, *retStart); return TRUE; } else if (readSize <= 0) { lf->bytesInBuf = lf->lineStart = lf->lineEnd = 0; return FALSE; } bytesInBuf = lf->bytesInBuf = readSize + sizeLeft; lf->lineEnd = 0; determineNlType(lf, buf+endIx, bytesInBuf); /* Look for next end of line. */ switch(lf->nlType) { case nlt_unix: case nlt_dos: for (endIx = sizeLeft; endIx bufSize) { if (bufSize >= 512*1024*1024) { errAbort("Line too long (more than %d chars) line %d of %s", lf->bufSize, lf->lineIx+1, lf->fileName); } else { lineFileExpandBuf(lf, bufSize*2); buf = lf->buf; } } } if (lf->zTerm) { buf[endIx-1] = 0; if ((lf->nlType == nlt_dos) && (buf[endIx-2]=='\r')) { buf[endIx-2] = 0; } } lf->lineStart = newStart = lf->lineEnd; lf->lineEnd = endIx; ++lf->lineIx; if (retSize != NULL) *retSize = endIx - newStart; *retStart = buf + newStart; if (*retStart[0] == '#') metaDataAdd(lf, *retStart); return TRUE; } void lineFileVaAbort(struct lineFile *lf, char *format, va_list args) /* Print file name, line number, and error message, and abort. */ { struct dyString *dy = dyStringNew(0); dyStringPrintf(dy, "Error line %d of %s: ", lf->lineIx, lf->fileName); dyStringVaPrintf(dy, format, args); errAbort("%s", dy->string); dyStringFree(&dy); } void lineFileAbort(struct lineFile *lf, char *format, ...) /* Print file name, line number, and error message, and abort. */ { va_list args; va_start(args, format); lineFileVaAbort(lf, format, args); va_end(args); } void lineFileUnexpectedEnd(struct lineFile *lf) /* Complain about unexpected end of file. */ { errAbort("Unexpected end of file in %s", lf->fileName); } void lineFileNeedNext(struct lineFile *lf, char **retStart, int *retSize) /* Fetch next line from file. Squawk and die if it's not there. */ { if (!lineFileNext(lf, retStart, retSize)) lineFileUnexpectedEnd(lf); } void lineFileClose(struct lineFile **pLf) /* Close up a line file. */ { struct lineFile *lf; if ((lf = *pLf) != NULL) { #ifndef WIN32 if (lf->pl != NULL) { pipelineWait(lf->pl); pipelineFree(&lf->pl); } else #endif // WIN32 if (lf->fd > 0 && lf->fd != fileno(stdin)) { close(lf->fd); freeMem(lf->buf); } #ifdef USE_TABIX else if (lf->tabix != NULL) { if (lf->tabixIter != NULL) ti_iter_destroy(lf->tabixIter); ti_close(lf->tabix); } #endif // USE_TABIX freeMem(lf->fileName); metaDataFree(lf); freez(pLf); } } void lineFileCloseList(struct lineFile **pList) /* Close up a list of line files. */ { struct lineFile *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; lineFileClose(&el); } *pList = NULL; } void lineFileExpectWords(struct lineFile *lf, int expecting, int got) /* Check line has right number of words. */ { if (expecting != got) errAbort("Expecting %d words line %d of %s got %d", expecting, lf->lineIx, lf->fileName, got); } void lineFileExpectAtLeast(struct lineFile *lf, int expecting, int got) /* Check line has right number of words. */ { if (got < expecting) errAbort("Expecting at least %d words line %d of %s got %d", expecting, lf->lineIx, lf->fileName, got); } void lineFileShort(struct lineFile *lf) /* Complain that line is too short. */ { errAbort("Short line %d of %s", lf->lineIx, lf->fileName); } void lineFileReuseFull(struct lineFile *lf) // Reuse last full line read. Unlike lineFileReuse, // lineFileReuseFull only works with previous lineFileNextFull call { assert(lf->fullLine != NULL); lf->fullLineReuse = TRUE; } boolean lineFileNextFull(struct lineFile *lf, char **retFull, int *retFullSize, char **retRaw, int *retRawSize) // Fetch next line from file joining up any that are continued by ending '\' // If requested, and was joined, the unjoined raw lines are also returned // NOTE: comment lines can't be continued! ("# comment \ \n more comment" is 2 lines.) { // May have requested reusing the last full line. if (lf->fullLineReuse) { lf->fullLineReuse = FALSE; assert(lf->fullLine != NULL); *retFull = dyStringContents(lf->fullLine); if (retFullSize) *retFullSize = dyStringLen(lf->fullLine); if (retRaw != NULL) { assert(lf->rawLines != NULL); *retRaw = dyStringContents(lf->rawLines); if (retRawSize) *retRawSize = dyStringLen(lf->rawLines); } return TRUE; } // Empty pointers *retFull = NULL; if (retRaw != NULL) *retRaw = NULL; // Prepare lf buffers if (lf->fullLine == NULL) { lf->fullLine = dyStringNew(1024); lf->rawLines = dyStringNew(1024); // Better to always create it than test every time } else { dyStringClear(lf->fullLine); dyStringClear(lf->rawLines); } char *line; while (lineFileNext(lf, &line, NULL)) { char *start = skipLeadingSpaces(line); // Will the next line continue this one? char *end = start; if (*start == '#') // Comment lines can't be continued! end = start + strlen(start); else { while (*end != '\0') // walking forward for efficiency (avoid strlens()) { for (;*end != '\0' && *end != '\\'; end++) ; // Tight loop to find '\' if (*end == '\0') break; // This could be a continuation char *slash = end; if (*(++end) == '\\') // escaped continue; end = skipLeadingSpaces(end); if (*end == '\0') // Just whitespace after '\', so true continuation mark { if (retRaw != NULL) // Only if actually requested. { dyStringAppendN(lf->rawLines,line,(end - line)); dyStringAppendC(lf->rawLines,'\n'); // New lines delimit raw lines. } end = slash; // Don't need to zero, because of appending by length break; } } } // Stitch together full lines if (dyStringLen(lf->fullLine) == 0) dyStringAppendN(lf->fullLine,line,(end - line)); // includes first line's whitespace else if (start < end) // don't include continued line's leading spaces dyStringAppendN(lf->fullLine,start,(end - start)); if (*end == '\\') continue; // Got a full line now! *retFull = dyStringContents(lf->fullLine); if (retFullSize) *retFullSize = dyStringLen(lf->fullLine); if (retRaw != NULL && dyStringLen(lf->rawLines) > 0) // Only if actually requested & continued { // This is the final line which doesn't have a continuation char dyStringAppendN(lf->rawLines,line,(end - line)); *retRaw = dyStringContents(lf->rawLines); if (retRawSize) *retRawSize = dyStringLen(lf->rawLines); } return TRUE; } return FALSE; } boolean lineFileNextReal(struct lineFile *lf, char **retStart) /* Fetch next line from file that is not blank and * does not start with a '#'. */ { char *s, c; while (lineFileNext(lf, retStart, NULL)) { s = skipLeadingSpaces(*retStart); c = s[0]; if (c != 0 && c != '#') return TRUE; } return FALSE; } boolean lineFileNextFullReal(struct lineFile *lf, char **retStart) // Fetch next line from file that is not blank and does not start with a '#'. // Continuation lines (ending in '\') are joined into a single line. { while (lineFileNextFull(lf, retStart, NULL, NULL, NULL)) { char *clippedText = skipLeadingSpaces(*retStart); if (clippedText[0] != '\0' && clippedText[0] != '#') return TRUE; } return FALSE; } int lineFileChopNext(struct lineFile *lf, char *words[], int maxWords) /* Return next non-blank line that doesn't start with '#' chopped into words. */ { int lineSize, wordCount; char *line; while (lineFileNext(lf, &line, &lineSize)) { if (line[0] == '#') continue; wordCount = chopByWhite(line, words, maxWords); if (wordCount != 0) return wordCount; } return 0; } int lineFileChopCharNext(struct lineFile *lf, char sep, char *words[], int maxWords) /* Return next non-blank line that doesn't start with '#' chopped into words delimited by sep. */ { int lineSize, wordCount; char *line; while (lineFileNext(lf, &line, &lineSize)) { if (line[0] == '#') continue; wordCount = chopByChar(line, sep, words, maxWords); if (wordCount != 0) return wordCount; } return 0; } int lineFileChopNextTab(struct lineFile *lf, char *words[], int maxWords) /* Return next non-blank line that doesn't start with '#' chopped into words * on tabs */ { int lineSize, wordCount; char *line; while (lineFileNext(lf, &line, &lineSize)) { if (line[0] == '#') continue; wordCount = chopByChar(line, '\t', words, maxWords); if (wordCount != 0) return wordCount; } return 0; } boolean lineFileNextCharRow(struct lineFile *lf, char sep, char *words[], int wordCount) /* Return next non-blank line that doesn't start with '#' chopped into words * delimited by sep. Returns FALSE at EOF. Aborts on error. */ { int wordsRead; wordsRead = lineFileChopCharNext(lf, sep, words, wordCount); if (wordsRead == 0) return FALSE; if (wordsRead < wordCount) lineFileExpectWords(lf, wordCount, wordsRead); return TRUE; } boolean lineFileNextRow(struct lineFile *lf, char *words[], int wordCount) /* Return next non-blank line that doesn't start with '#' chopped into words. * Returns FALSE at EOF. Aborts on error. */ { int wordsRead; wordsRead = lineFileChopNext(lf, words, wordCount); if (wordsRead == 0) return FALSE; if (wordsRead < wordCount) lineFileExpectWords(lf, wordCount, wordsRead); return TRUE; } boolean lineFileNextRowTab(struct lineFile *lf, char *words[], int wordCount) /* Return next non-blank line that doesn't start with '#' chopped into words * at tabs. Returns FALSE at EOF. Aborts on error. */ { int wordsRead; wordsRead = lineFileChopNextTab(lf, words, wordCount); if (wordsRead == 0) return FALSE; if (wordsRead < wordCount) lineFileExpectWords(lf, wordCount, wordsRead); return TRUE; } int lineFileNeedFullNum(struct lineFile *lf, char *words[], int wordIx) /* Make sure that words[wordIx] is an ascii integer, and return * binary representation of it. Require all chars in word to be digits.*/ { char *c; for (c = words[wordIx]; *c; c++) { if (*c == '-' || isdigit(*c)) /* NOTE: embedded '-' will be caught by lineFileNeedNum */ continue; errAbort("Expecting integer field %d line %d of %s, got %s", wordIx+1, lf->lineIx, lf->fileName, words[wordIx]); } return lineFileNeedNum(lf, words, wordIx); } int lineFileNeedNum(struct lineFile *lf, char *words[], int wordIx) /* Make sure that words[wordIx] is an ascii integer, and return * binary representation of it. Conversion stops at first non-digit char. */ { char *ascii = words[wordIx]; char c = ascii[0]; if (c != '-' && !isdigit(c)) errAbort("Expecting number field %d line %d of %s, got %s", wordIx+1, lf->lineIx, lf->fileName, ascii); return atoi(ascii); } double lineFileNeedDouble(struct lineFile *lf, char *words[], int wordIx) /* Make sure that words[wordIx] is an ascii double value, and return * binary representation of it. */ { char *valEnd; char *val = words[wordIx]; double doubleValue; doubleValue = strtod(val, &valEnd); if ((*val == '\0') || (*valEnd != '\0')) errAbort("Expecting double field %d line %d of %s, got %s", wordIx+1, lf->lineIx, lf->fileName, val); return doubleValue; } void lineFileSkip(struct lineFile *lf, int lineCount) /* Skip a number of lines. */ { int i, lineSize; char *line; for (i=0; ifileName); } } char *lineFileSkipToLineStartingWith(struct lineFile *lf, char *start, int maxCount) /* Skip to next line that starts with given string. Return NULL * if no such line found, otherwise return the line. */ { char *line; while (lineFileNext(lf, &line, NULL) && --maxCount >= 0) { if (startsWith(start, line)) return line; } return NULL; } char *lineFileReadAll(struct lineFile *lf) /* Read remainder of lineFile and return it as a string. */ { struct dyString *dy = dyStringNew(1024*4); lf->zTerm = 0; int size; char *line; while (lineFileNext(lf, &line, &size)) dyStringAppendN(dy, line, size); return dyStringCannibalize(&dy); } boolean lineFileParseHttpHeader(struct lineFile *lf, char **hdr, boolean *chunked, int *contentLength) /* Extract HTTP response header from lf into hdr, tell if it's * "Transfer-Encoding: chunked" or if it has a contentLength. */ { struct dyString *header = newDyString(1024); char *line; int lineSize; if (chunked != NULL) *chunked = FALSE; if (contentLength != NULL) *contentLength = -1; dyStringClear(header); if (lineFileNext(lf, &line, &lineSize)) { if (startsWith("HTTP/", line)) { char *version, *code; dyStringAppendN(header, line, lineSize-1); dyStringAppendC(header, '\n'); version = nextWord(&line); code = nextWord(&line); if (code == NULL) { warn("%s: Expecting HTTP/ header line, got this: %s\n", lf->fileName, header->string); *hdr = cloneString(header->string); dyStringFree(&header); return FALSE; } if (!sameString(code, "200")) { warn("%s: Errored HTTP response header: %s %s %s\n", lf->fileName, version, code, line); *hdr = cloneString(header->string); dyStringFree(&header); return FALSE; } while (lineFileNext(lf, &line, &lineSize)) { /* blank line means end of HTTP header */ if ((line[0] == '\r' && line[1] == 0) || line[0] == 0) break; if (strstr(line, "Transfer-Encoding: chunked") && chunked != NULL) *chunked = TRUE; dyStringAppendN(header, line, lineSize-1); dyStringAppendC(header, '\n'); if (strstr(line, "Content-Length:")) { code = nextWord(&line); code = nextWord(&line); if (contentLength != NULL) *contentLength = atoi(code); } } } else { /* put the line back, don't put it in header/hdr */ lineFileReuse(lf); warn("%s: Expecting HTTP/ header line, got this: %s\n", lf->fileName, header->string); *hdr = cloneString(header->string); dyStringFree(&header); return FALSE; } } else { *hdr = cloneString(header->string); dyStringFree(&header); return FALSE; } *hdr = cloneString(header->string); dyStringFree(&header); return TRUE; } /* lineFileParseHttpHeader */ struct dyString *lineFileSlurpHttpBody(struct lineFile *lf, boolean chunked, int contentLength) /* Return a dyString that contains the http response body in lf. Handle * chunk-encoding and content-length. */ { struct dyString *body = newDyString(64*1024); char *line; int lineSize; dyStringClear(body); if (chunked) { /* Handle "Transfer-Encoding: chunked" body */ /* Procedure from RFC2068 section 19.4.6 */ char *csword; unsigned chunkSize = 0; unsigned size; do { /* Read line that has chunk size (in hex) as first word. */ if (lineFileNext(lf, &line, NULL)) csword = nextWord(&line); else break; if (sscanf(csword, "%x", &chunkSize) < 1) { warn("%s: chunked transfer-encoding chunk size parse error.\n", lf->fileName); break; } /* If chunk size is 0, read in a blank line & then we're done. */ if (chunkSize == 0) { lineFileNext(lf, &line, NULL); if (line == NULL || (line[0] != '\r' && line[0] != 0)) warn("%s: chunked transfer-encoding: expected blank line, got %s\n", lf->fileName, line); break; } /* Read (and save) lines until we have read in chunk. */ for (size = 0; size < chunkSize; size += lineSize) { if (! lineFileNext(lf, &line, &lineSize)) break; dyStringAppendN(body, line, lineSize-1); dyStringAppendC(body, '\n'); } /* Read blank line - or extra CRLF inserted in the middle of the * current line, in which case we need to trim it. */ if (size > chunkSize) { body->stringSize -= (size - chunkSize); body->string[body->stringSize] = 0; } else if (size == chunkSize) { lineFileNext(lf, &line, NULL); if (line == NULL || (line[0] != '\r' && line[0] != 0)) warn("%s: chunked transfer-encoding: expected blank line, got %s\n", lf->fileName, line); } } while (chunkSize > 0); /* Try to read in next line. If it's an HTTP header, put it back. */ /* If there is a next line but it's not an HTTP header, it's a footer. */ if (lineFileNext(lf, &line, NULL)) { if (startsWith("HTTP/", line)) lineFileReuse(lf); else { /* Got a footer -- keep reading until blank line */ warn("%s: chunked transfer-encoding: got footer %s, discarding it.\n", lf->fileName, line); while (lineFileNext(lf, &line, NULL)) { if ((line[0] == '\r' && line[1] == 0) || line[0] == 0) break; warn("discarding footer line: %s\n", line); } } } } else if (contentLength >= 0) { /* Read in known length */ int size; for (size = 0; size < contentLength; size += lineSize) { if (! lineFileNext(lf, &line, &lineSize)) break; dyStringAppendN(body, line, lineSize-1); dyStringAppendC(body, '\n'); } } else { /* Read in to end of file (assume it's not a persistent connection) */ while (lineFileNext(lf, &line, &lineSize)) { dyStringAppendN(body, line, lineSize-1); dyStringAppendC(body, '\n'); } } return(body); } /* lineFileSlurpHttpBody */ void lineFileRemoveInitialCustomTrackLines(struct lineFile *lf) /* remove initial browser and track lines */ { char *line; while (lineFileNextReal(lf, &line)) { if (!(startsWith("browser", line) || startsWith("track", line) )) { verbose(2, "found line not browser or track: %s\n", line); lineFileReuse(lf); break; } verbose(2, "skipping %s\n", line); } } rtracklayer/src/ucsc/linefile.h0000644000126300012640000002456112227135242020154 0ustar00biocbuildphs_compbio/* lineFile - stuff to rapidly read text files and parse them into * lines. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef LINEFILE_H #define LINEFILE_H #include "dystring.h" #ifdef USE_TABIX #include "tabix.h" #endif enum nlType { nlt_undet, /* undetermined */ nlt_unix, /* lf */ nlt_dos, /* crlf */ nlt_mac /* cr */ }; struct metaOutput /* struct to store list of file handles to output meta data to * meta data is text after # */ { struct metaOutput *next; /* next file handle */ FILE *metaFile; /* file to write metadata to */ }; struct lineFile /* Structure to handle fast, line oriented * fileIo. */ { struct lineFile *next; /* Might need to be on a list. */ char *fileName; /* Name of file. */ int fd; /* File handle. -1 for 'memory' files. */ int bufSize; /* Size of buffer. */ off_t bufOffsetInFile; /* Offset in file of first buffer byte. */ int bytesInBuf; /* Bytes read into buffer. */ int reserved; /* Reserved (zero for now). */ int lineIx; /* Current line. */ int lineStart; /* Offset of line in buffer. */ int lineEnd; /* End of line in buffer. */ bool zTerm; /* Replace '\n' with zero? */ enum nlType nlType; /* type of line endings: dos, unix, mac or undet */ bool reuse; /* Set if reusing input. */ char *buf; /* Buffer. */ struct pipeline *pl; /* pipeline if reading compressed */ struct metaOutput *metaOutput; /* list of FILE handles to write metaData to */ bool isMetaUnique; /* if set, do not repeat comments in output */ struct hash *metaLines; /* save lines to suppress repetition */ #ifdef USE_TABIX tabix_t *tabix; /* A tabix-compressed file and its binary index file (.tbi) */ ti_iter_t tabixIter; /* An iterator to get decompressed indexed lines of text */ #endif struct dyString *fullLine; // Filled with full line when a lineFileNextFull is called struct dyString *rawLines; // Filled with raw lines used to create the full line boolean fullLineReuse; // If TRUE, next call to lineFileNextFull will get already built fullLine }; char *getFileNameFromHdrSig(char *m); /* Check if header has signature of supported compression stream, and return a phoney filename for it, or NULL if no sig found. */ struct lineFile *lineFileDecompressFd(char *name, bool zTerm, int fd); /* open a linefile with decompression from a file or socket descriptor */ struct lineFile *lineFileDecompressMem(bool zTerm, char *mem, long size); /* open a linefile with decompression from a memory stream */ struct lineFile *lineFileMayOpen(char *fileName, bool zTerm); /* Try and open up a lineFile. If fileName ends in .gz, .Z, or .bz2, * it will be read from a decompress pipeline. */ struct lineFile *lineFileOpen(char *fileName, bool zTerm); /* Open up a lineFile or die trying If fileName ends in .gz, .Z, or .bz2, * it will be read from a decompress pipeline.. */ struct lineFile *lineFileAttach(char *fileName, bool zTerm, int fd); /* Wrap a line file around an open'd file. */ struct lineFile *lineFileStdin(bool zTerm); /* Wrap a line file around stdin. */ struct lineFile *lineFileOnString(char *name, bool zTerm, char *s); /* Wrap a line file object around string in memory. This buffer * have zeroes written into it if zTerm is non-zero. It will * be freed when the line file is closed. */ void lineFileClose(struct lineFile **pLf); /* Close up a line file. */ void lineFileCloseList(struct lineFile **pList); /* Close up a list of line files. */ boolean lineFileNext(struct lineFile *lf, char **retStart, int *retSize); /* Fetch next line from file. */ boolean lineFileNextFull(struct lineFile *lf, char **retFull, int *retFullSize, char **retRaw, int *retRawSize); // Fetch next line from file joining up any that are continued by ending '\' // If requested, and was joined, the unjoined raw lines are also returned // NOTE: comment lines can't be continued! ("# comment \ \n more comment" is 2 lines.) boolean lineFileNextReal(struct lineFile *lf, char **retStart); /* Fetch next line from file that is not blank and * does not start with a '#'. */ boolean lineFileNextFullReal(struct lineFile *lf, char **retStart); // Fetch next line from file that is not blank and does not start with a '#'. // Continuation lines (ending in '\') are joined into a single line. void lineFileNeedNext(struct lineFile *lf, char **retStart, int *retSize); /* Fetch next line from file. Squawk and die if it's not there. */ void lineFileReuse(struct lineFile *lf); /* Reuse current line. */ void lineFileReuseFull(struct lineFile *lf); // Reuse last full line read. Unlike lineFileReuse, // lineFileReuseFull only works with previous lineFileNextFull call #define lineFileString(lf) ((lf)->buf + (lf)->lineStart) /* Current string in line file. */ #define lineFileTell(lf) ((lf)->bufOffsetInFile + (lf)->lineStart) /* Current offset (of string start) in file. */ void lineFileSeek(struct lineFile *lf, off_t offset, int whence); /* Seek to read next line from given position. */ void lineFileRewind(struct lineFile *lf); /* Return lineFile to start. */ void lineFileAbort(struct lineFile *lf, char *format, ...) /* Print file name, line number, and error message, and abort. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; void lineFileVaAbort(struct lineFile *lf, char *format, va_list args); /* Print file name, line number, and error message, and abort. */ void lineFileUnexpectedEnd(struct lineFile *lf); /* Complain about unexpected end of file. */ void lineFileExpectWords(struct lineFile *lf, int expecting, int got); /* Check line has right number of words. */ void lineFileExpectAtLeast(struct lineFile *lf, int expecting, int got); /* Check line has right number of words. */ void lineFileShort(struct lineFile *lf); /* Complain that line is too short. */ boolean lineFileNextRow(struct lineFile *lf, char *words[], int wordCount); /* Return next non-blank line that doesn't start with '#' chopped into words. * Returns FALSE at EOF. Aborts on error. */ #define lineFileRow(lf, words) lineFileNextRow(lf, words, ArraySize(words)) /* Read in line chopped into fixed size word array. */ boolean lineFileNextCharRow(struct lineFile *lf, char sep, char *words[], int wordCount); /* Return next non-blank line that doesn't start with '#' chopped into words * delimited by sep. Returns FALSE at EOF. Aborts on error. */ boolean lineFileNextRowTab(struct lineFile *lf, char *words[], int wordCount); /* Return next non-blank line that doesn't start with '#' chopped into words * at tabs. Returns FALSE at EOF. Aborts on error. */ #define lineFileRowTab(lf, words) \ lineFileNextRowTab(lf, words, ArraySize(words)) /* Read in line chopped by tab into fixed size word array. */ int lineFileChopNext(struct lineFile *lf, char *words[], int maxWords); /* Return next non-blank line that doesn't start with '#' chopped into words. */ #define lineFileChop(lf, words) lineFileChopNext(lf, words, ArraySize(words)) /* Ease-of-usef macro for lineFileChopNext above. */ int lineFileChopCharNext(struct lineFile *lf, char sep, char *words[], int maxWords); /* Return next non-blank line that doesn't start with '#' chopped into words delimited by sep. */ int lineFileChopNextTab(struct lineFile *lf, char *words[], int maxWords); /* Return next non-blank line that doesn't start with '#' chopped into words * on tabs */ #define lineFileChopTab(lf, words) lineFileChopNextTab(lf, words, ArraySize(words)) /* Ease-of-usef macro for lineFileChopNext above. */ int lineFileNeedNum(struct lineFile *lf, char *words[], int wordIx); /* Make sure that words[wordIx] is an ascii integer, and return * binary representation of it. */ int lineFileNeedFullNum(struct lineFile *lf, char *words[], int wordIx); /* Make sure that words[wordIx] is an ascii integer, and return * binary representation of it. Require all chars in word to be digits.*/ double lineFileNeedDouble(struct lineFile *lf, char *words[], int wordIx); /* Make sure that words[wordIx] is an ascii double value, and return * binary representation of it. */ void lineFileSkip(struct lineFile *lf, int lineCount); /* Skip a number of lines. */ char *lineFileSkipToLineStartingWith(struct lineFile *lf, char *start, int maxCount); /* Skip to next line that starts with given string. Return NULL * if no such line found, otherwise return the line. */ char *lineFileReadAll(struct lineFile *lf); /* Read remainder of lineFile and return it as a string. */ boolean lineFileParseHttpHeader(struct lineFile *lf, char **hdr, boolean *chunked, int *contentLength); /* Extract HTTP response header from lf into hdr, tell if it's * "Transfer-Encoding: chunked" or if it has a contentLength. */ struct dyString *lineFileSlurpHttpBody(struct lineFile *lf, boolean chunked, int contentLength); /* Return a dyString that contains the http response body in lf. Handle * chunk-encoding and content-length. */ void lineFileSetMetaDataOutput(struct lineFile *lf, FILE *f); /* set file to write meta data to, * should be called before reading from input file */ void lineFileSetUniqueMetaData(struct lineFile *lf); /* suppress duplicate lines in metadata */ void lineFileRemoveInitialCustomTrackLines(struct lineFile *lf); /* remove initial browser and track lines */ /*----- Optionally-compiled wrapper on tabix (compression + indexing): -----*/ #define COMPILE_WITH_TABIX "%s: Sorry, this functionality is available only when\n" \ "you have installed the tabix library from\n" \ "http://samtools.sourceforge.net/ and rebuilt kent/src with USE_TABIX=1\n" \ "(see http://genomewiki.ucsc.edu/index.php/Build_Environment_Variables)." struct lineFile *lineFileTabixMayOpen(char *fileOrUrl, bool zTerm); /* Wrap a line file around a data file that has been compressed and indexed * by the tabix command line program. The index file .tbi must be * readable in addition to fileName. If there's a problem, warn & return NULL. * This works only if kent/src has been compiled with USE_TABIX=1 and linked * with the tabix C library. */ boolean lineFileSetTabixRegion(struct lineFile *lf, char *seqName, int start, int end); /* Assuming lf was created by lineFileTabixMayOpen, tell tabix to seek to the specified region * and return TRUE (or if there are no items in region, return FALSE). */ #endif /* LINEFILE_H */ rtracklayer/src/ucsc/localmem.c0000644000126300012640000000726712227135242020155 0ustar00biocbuildphs_compbio/* LocalMem.c - local memory routines. * * These routines are meant for the sort of scenario where * a lot of little to medium size pieces of memory are * allocated, and then disposed of all at once. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "localmem.h" static char const rcsid[] = "$Id: localmem.c,v 1.13 2009/12/03 20:04:29 kent Exp $"; struct lm { struct lmBlock *blocks; size_t blockSize; size_t allignMask; size_t allignAdd; }; struct lmBlock { struct lmBlock *next; char *free; char *end; char *extra; }; static struct lmBlock *newBlock(struct lm *lm, size_t reqSize) /* Allocate a new block of at least reqSize */ { size_t size = (reqSize > lm->blockSize ? reqSize : lm->blockSize); size_t fullSize = size + sizeof(struct lmBlock); struct lmBlock *mb = needLargeZeroedMem(fullSize); if (mb == NULL) errAbort("Couldn't allocate %lld bytes", (long long)fullSize); mb->free = (char *)(mb+1); mb->end = ((char *)mb) + fullSize; mb->next = lm->blocks; lm->blocks = mb; return mb; } struct lm *lmInit(int blockSize) /* Create a local memory pool. */ { struct lm *lm; int aliSize = sizeof(long); if (aliSize < sizeof(double)) aliSize = sizeof(double); if (aliSize < sizeof(void *)) aliSize = sizeof(void *); lm = needMem(sizeof(*lm)); lm->blocks = NULL; if (blockSize <= 0) blockSize = (1<<14); /* 16k default. */ lm->blockSize = blockSize; lm->allignAdd = (aliSize-1); lm->allignMask = ~lm->allignAdd; newBlock(lm, blockSize); return lm; } void lmCleanup(struct lm **pLm) /* Clean up a local memory pool. */ { struct lm *lm = *pLm; if (lm == NULL) return; slFreeList(&lm->blocks); freeMem(lm); *pLm = NULL; } void *lmAlloc(struct lm *lm, size_t size) /* Allocate memory from local pool. */ { struct lmBlock *mb = lm->blocks; void *ret; size_t memLeft = mb->end - mb->free; if (memLeft < size) mb = newBlock(lm, size); ret = mb->free; mb->free += ((size+lm->allignAdd)&lm->allignMask); if (mb->free > mb->end) mb->free = mb->end; return ret; } void *lmCloneMem(struct lm *lm, void *pt, size_t size) /* Return a local mem copy of memory block. */ { void *d = lmAlloc(lm, size); memcpy(d, pt, size); return d; } char *lmCloneStringZ(struct lm *lm, char *string, int size) /* Return local mem copy of string. */ { if (string == NULL) return NULL; else { char *s = lmAlloc(lm, size+1); memcpy(s, string, size); return s; } } char *lmCloneString(struct lm *lm, char *string) /* Return local mem copy of string. */ { if (string == NULL) return NULL; else return lmCloneStringZ(lm, string, strlen(string)); } char *lmCloneFirstWord(struct lm *lm, char *line) /* Clone first word in line */ { char *startFirstWord = skipLeadingSpaces(line); if (startFirstWord == NULL) return NULL; char *endFirstWord = skipToSpaces(startFirstWord); if (endFirstWord == NULL) return lmCloneString(lm, startFirstWord); else return lmCloneStringZ(lm, startFirstWord, endFirstWord - startFirstWord); } char *lmCloneSomeWord(struct lm *lm, char *line, int wordIx) /* Return a clone of the given space-delimited word within line. Returns NULL if * not that many words in line. */ { if (wordIx < 0) return NULL; int i; for (i=0; iname, name); return n; } rtracklayer/src/ucsc/localmem.h0000644000126300012640000000325112227135242020147 0ustar00biocbuildphs_compbio/* LocalMem.h - local memory routines. * * These routines are meant for the sort of scenario where * a lot of little to medium size pieces of memory are * allocated, and then disposed of all at once. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ struct lm *lmInit(int blockSize); /* Create a local memory pool. Parameters are: * blockSize - how much system memory to allocate at a time. Can * pass in zero and a reasonable default will be used. */ void lmCleanup(struct lm **pLm); /* Clean up a local memory pool. */ void *lmAlloc(struct lm *lm, size_t size); /* Allocate memory from local pool. */ char *lmCloneString(struct lm *lm, char *string); /* Return local mem copy of string. */ char*lmCloneStringZ(struct lm *lm, char *string, int size); /* Return local mem copy of string of given size, adding null terminator. */ char *lmCloneFirstWord(struct lm *lm, char *line); /* Clone first word in line */ char *lmCloneSomeWord(struct lm *lm, char *line, int wordIx); /* Return a clone of the given space-delimited word within line. Returns NULL if * not that many words in line. */ struct slName *lmSlName(struct lm *lm, char *name); /* Return slName in memory. */ void *lmCloneMem(struct lm *lm, void *pt, size_t size); /* Return a local mem copy of memory block. */ #define lmAllocVar(lm, pt) (pt = lmAlloc(lm, sizeof(*pt))); /* Shortcut to allocating a single variable in local mem and * assigning pointer to it. */ #define lmAllocArray(lm, pt, size) (pt = lmAlloc(lm, sizeof(*pt) * (size))) /* Shortcut to allocating an array in local mem and * assigning pointer to it. */ rtracklayer/src/ucsc/memalloc.c0000644000126300012640000003227612227135242020153 0ustar00biocbuildphs_compbio/* memalloc.c - Routines to allocate and deallocate dynamic memory. * This lets you have a stack of memory handlers. The default * memory handler is a thin shell around malloc/free. You can * substitute routines that do more integrety checking with * pushCarefulMem(), or routines of your own devising with * pushMemHandler(). * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "obscure.h" #include "memalloc.h" #include "dlist.h" static char const rcsid[] = "$Id: memalloc.c,v 1.31 2007/04/24 18:35:43 hiram Exp $"; static void *defaultAlloc(size_t size) /* Default allocator. */ { return malloc(size); } static void defaultFree(void *vpt) /* Default deallocator. */ { free(vpt); } static void *defaultRealloc(void *vpt, size_t size) /* Default deallocator. */ { return realloc(vpt, size); } static struct memHandler defaultMemHandler = /* Default memory handler. */ { NULL, defaultAlloc, defaultFree, defaultRealloc, }; static struct memHandler *mhStack = &defaultMemHandler; struct memHandler *pushMemHandler(struct memHandler *newHandler) /* Use newHandler for memory requests until matching popMemHandler. * Returns previous top of memory handler stack. */ { struct memHandler *oldHandler = mhStack; slAddHead(&mhStack, newHandler); return oldHandler; } struct memHandler *popMemHandler() /* Removes top element from memHandler stack and returns it. */ { struct memHandler *oldHandler = mhStack; if (mhStack == &defaultMemHandler) errAbort("Too many popMemHandlers()"); mhStack = mhStack->next; return oldHandler; } void setDefaultMemHandler() /* Sets memHandler to the default. */ { mhStack = &defaultMemHandler; } /* 128*8*1024*1024 == 1073741824 == 2^30 on 32 bit machines,size_t == 4 bytes*/ /* on 64 bit machines, size_t = 8 bytes, 2^30 * 2 * 2 * 2 * 2 = 2^34 == 16 Gb */ static size_t maxAlloc = (size_t)128*8*1024*1024*(sizeof(size_t)/4)*(sizeof(size_t)/4)*(sizeof(size_t)/4*(sizeof(size_t)/4)); void setMaxAlloc(size_t s) /* Set large allocation limit. */ { maxAlloc = s; } void *needLargeMem(size_t size) /* This calls abort if the memory allocation fails. The memory is * not initialized to zero. */ { void *pt; if (size == 0 || size >= maxAlloc) errAbort("needLargeMem: trying to allocate %llu bytes (limit: %llu)", (unsigned long long)size, (unsigned long long)maxAlloc); if ((pt = mhStack->alloc(size)) == NULL) errAbort("needLargeMem: Out of memory - request size %llu bytes, errno: %d\n", (unsigned long long)size, errno); return pt; } void *needLargeZeroedMem(size_t size) /* Request a large block of memory and zero it. */ { void *v; v = needLargeMem(size); memset(v, 0, size); return v; } void *needLargeMemResize(void* vp, size_t size) /* Adjust memory size on a block, possibly relocating it. If vp is NULL, * a new memory block is allocated. Memory not initted. */ { void *pt; if (size == 0 || size >= maxAlloc) errAbort("needLargeMemResize: trying to allocate %llu bytes (limit: %llu)", (unsigned long long)size, (unsigned long long)maxAlloc); if ((pt = mhStack->realloc(vp, size)) == NULL) errAbort("needLargeMemResize: Out of memory - request size %llu bytes, errno: %d\n", (unsigned long long)size, errno); return pt; } void *needLargeZeroedMemResize(void* vp, size_t oldSize, size_t newSize) /* Adjust memory size on a block, possibly relocating it. If vp is NULL, a * new memory block is allocated. If block is grown, new memory is zeroed. */ { void *v = needLargeMemResize(vp, newSize); if (newSize > oldSize) memset(((char*)v)+oldSize, 0, newSize-oldSize); return v; } void *needHugeMem(size_t size) /* No checking on size. Memory not initted. */ { void *pt; if (size == 0) errAbort("needHugeMem: trying to allocate 0 bytes"); if ((pt = mhStack->alloc(size)) == NULL) errAbort("needHugeMem: Out of huge memory - request size %llu bytes, errno: %d\n", (unsigned long long)size, errno); return pt; } void *needHugeZeroedMem(size_t size) /* Request a large block of memory and zero it. */ { void *v; v = needHugeMem(size); memset(v, 0, size); return v; } void *needHugeMemResize(void* vp, size_t size) /* Adjust memory size on a block, possibly relocating it. If vp is NULL, * a new memory block is allocated. No checking on size. Memory not * initted. */ { void *pt; if ((pt = mhStack->realloc(vp, size)) == NULL) errAbort("needHugeMemResize: Out of memory - request resize %llu bytes, errno: %d\n", (unsigned long long)size, errno); return pt; } void *needHugeZeroedMemResize(void* vp, size_t oldSize, size_t newSize) /* Adjust memory size on a block, possibly relocating it. If vp is NULL, a * new memory block is allocated. No checking on size. If block is grown, * new memory is zeroed. */ { void *v; v = needHugeMemResize(vp, newSize); if (newSize > oldSize) memset(((char*)v)+oldSize, 0, newSize-oldSize); return v; } #define NEEDMEM_LIMIT 500000000 void *needMem(size_t size) /* Need mem calls abort if the memory allocation fails. The memory * is initialized to zero. */ { void *pt; if (size == 0 || size > NEEDMEM_LIMIT) errAbort("needMem: trying to allocate %llu bytes (limit: %llu)", (unsigned long long)size, (unsigned long long)NEEDMEM_LIMIT); if ((pt = mhStack->alloc(size)) == NULL) errAbort("needMem: Out of memory - request size %llu bytes, errno: %d\n", (unsigned long long)size, errno); memset(pt, 0, size); return pt; } void *needMoreMem(void *old, size_t oldSize, size_t newSize) /* Adjust memory size on a block, possibly relocating it. If vp is NULL, a * new memory block is allocated. No checking on size. If block is grown, * new memory is zeroed. */ { return needLargeZeroedMemResize(old, oldSize, newSize); } void *wantMem(size_t size) /* Want mem just calls malloc - no zeroing of memory, no * aborting if request fails. */ { return mhStack->alloc(size); } void freeMem(void *pt) /* Free memory will check for null before freeing. */ { if (pt != NULL) mhStack->free(pt); } void freez(void *vpt) /* Pass address of pointer. Will free pointer and set it * to NULL. */ { void **ppt = (void **)vpt; void *pt = *ppt; *ppt = NULL; freeMem(pt); } static int carefulAlignSize; /* Alignment size for machine - 8 bytes for DEC alpha, 4 for Sparc. */ static int carefulAlignAdd; /* Do aliSize = *(unaliSize+carefulAlignAdd)&carefulAlignMask); */ #if __WORDSIZE == 64 static bits64 carefulAlignMask; /* to make sure requests are aligned. */ #elif __WORDSIZE == 32 static bits32 carefulAlignMask; /* to make sure requests are aligned. */ #else static bits32 carefulAlignMask; /* to make sure requests are aligned. */ #endif static struct memHandler *carefulParent; static size_t carefulMaxToAlloc; static size_t carefulAlloced; struct carefulMemBlock /* Keep one of these for each outstanding memory block. It's a doubly linked list. */ { struct carefulMemBlock *next; struct carefulMemBlock *prev; int size; int startCookie; }; int cmbStartCookie = 0x78753421; char cmbEndCookie[4] = {0x44, 0x33, 0x7F, 0x42}; struct dlList *cmbAllocedList; static void carefulMemInit(size_t maxToAlloc) /* Initialize careful memory system */ { carefulMaxToAlloc = maxToAlloc; cmbAllocedList = newDlList(); carefulAlignSize = sizeof(double); if (sizeof(void *) > carefulAlignSize) carefulAlignSize = sizeof(void *); if (sizeof(long) > carefulAlignSize) carefulAlignSize = sizeof(long); if (sizeof(off_t) > carefulAlignSize) carefulAlignSize = sizeof(off_t); if (sizeof(long long) > carefulAlignSize) carefulAlignSize = sizeof(long long); carefulAlignAdd = carefulAlignSize-1; carefulAlignMask = ~carefulAlignAdd; } static void *carefulAlloc(size_t size) /* Allocate extra memory for cookies and list node, and then * return memory block. */ { struct carefulMemBlock *cmb; char *pEndCookie; size_t newAlloced = size + carefulAlloced; size_t aliSize; if (newAlloced > carefulMaxToAlloc) { char maxAlloc[32]; char allocRequest[32]; sprintLongWithCommas(maxAlloc, (long long)carefulMaxToAlloc); sprintLongWithCommas(allocRequest, (long long)newAlloced); errAbort("carefulAlloc: Allocated too much memory - more than %s bytes (%s)", maxAlloc, allocRequest); } carefulAlloced = newAlloced; aliSize = ((size + sizeof(*cmb) + 4 + carefulAlignAdd)&carefulAlignMask); cmb = carefulParent->alloc(aliSize); cmb->size = size; cmb->startCookie = cmbStartCookie; pEndCookie = (char *)(cmb+1); pEndCookie += size; memcpy(pEndCookie, cmbEndCookie, sizeof(cmbEndCookie)); dlAddHead(cmbAllocedList, (struct dlNode *)cmb); return (void *)(cmb+1); } static void carefulFree(void *vpt) /* Check cookies and free. */ { struct carefulMemBlock *cmb = ((struct carefulMemBlock *)vpt)-1; size_t size = cmb->size; char *pEndCookie; carefulAlloced -= size; pEndCookie = (((char *)(cmb+1)) + size); if (cmb->startCookie != cmbStartCookie) errAbort("Bad start cookie %x freeing %llx\n", cmb->startCookie, ptrToLL(vpt)); if (memcmp(pEndCookie, cmbEndCookie, sizeof(cmbEndCookie)) != 0) errAbort("Bad end cookie %x%x%x%x freeing %llx\n", pEndCookie[0], pEndCookie[1], pEndCookie[2], pEndCookie[3], ptrToLL(vpt)); dlRemove((struct dlNode *)cmb); carefulParent->free(cmb); } static void *carefulRealloc(void *vpt, size_t size) /* realloc a careful memblock block. */ { unsigned char* newBlk = carefulAlloc(size); if (vpt != NULL) { struct carefulMemBlock *cmb = ((struct carefulMemBlock *)vpt)-1; memcpy(newBlk, vpt, cmb->size); carefulFree(vpt); } return newBlk; } void carefulCheckHeap() /* Walk through allocated memory and make sure that all cookies are * in place. */ { int maxPieces = 10000000; /* Assume no more than this many pieces allocated. */ struct carefulMemBlock *cmb; char *pEndCookie; size_t size; if (carefulParent == NULL) return; for (cmb = (struct carefulMemBlock *)(cmbAllocedList->head); cmb->next != NULL; cmb = cmb->next) { size = cmb->size; pEndCookie = (((char *)(cmb+1)) + size); if (cmb->startCookie != cmbStartCookie) errAbort("Bad start cookie %x checking %llx\n", cmb->startCookie, ptrToLL(cmb+1)); if (memcmp(pEndCookie, cmbEndCookie, sizeof(cmbEndCookie)) != 0) errAbort("Bad end cookie %x%x%x%x checking %llx\n", pEndCookie[0], pEndCookie[1], pEndCookie[2], pEndCookie[3], ptrToLL(cmb+1)); if (--maxPieces == 0) errAbort("Loop or more than 10000000 pieces in memory list"); } } int carefulCountBlocksAllocated() /* How many memory items are allocated? */ { return dlCount(cmbAllocedList); } long carefulTotalAllocated() /* Return total bases allocated */ { return carefulAlloced; } static struct memHandler carefulMemHandler = /* Default memory handler. */ { NULL, carefulAlloc, carefulFree, carefulRealloc, }; void pushCarefulMemHandler(size_t maxAlloc) /* Push the careful (paranoid, conservative, checks everything) * memory handler top of the memHandler stack and use it. */ { carefulMemInit(maxAlloc); carefulParent = pushMemHandler(&carefulMemHandler); } struct memTracker /* A structure to keep track of memory. */ { struct memTracker *next; /* Next in list. */ struct dlList *list; /* List of allocated blocks. */ struct memHandler *parent; /* Underlying memory handler. */ struct memHandler *handler; /* Memory handler. */ }; static struct memTracker *memTracker = NULL; /* Head in memTracker list. */ static void *memTrackerAlloc(size_t size) /* Allocate extra memory for cookies and list node, and then * return memory block. */ { struct dlNode *node; size += sizeof (*node); node = memTracker->parent->alloc(size); if (node == NULL) return node; dlAddTail(memTracker->list, node); return (void*)(node+1); } static void memTrackerFree(void *vpt) /* Check cookies and free. */ { struct dlNode *node = vpt; node -= 1; dlRemove(node); memTracker->parent->free(node); } static void *memTrackerRealloc(void *vpt, size_t size) /* Resize a memory block from memTrackerAlloc. */ { if (vpt == NULL) return memTrackerAlloc(size); else { struct dlNode *node = ((struct dlNode *)vpt)-1; size += sizeof(*node); dlRemove(node); node = memTracker->parent->realloc(node, size); if (node == NULL) return node; dlAddTail(memTracker->list, node); return (void*)(node+1); } } void memTrackerStart() /* Push memory handler that will track blocks allocated so that * they can be automatically released with memTrackerEnd(). You * can have memTrackerStart one after the other, but memTrackerStart/End * need to nest. */ { struct memTracker *mt; if (memTracker != NULL) errAbort("multiple memTrackerStart calls"); AllocVar(mt); AllocVar(mt->handler); mt->handler->alloc = memTrackerAlloc; mt->handler->free = memTrackerFree; mt->handler->realloc = memTrackerRealloc; mt->list = dlListNew(); mt->parent = pushMemHandler(mt->handler); memTracker = mt; } void memTrackerEnd() /* Free any remaining blocks and pop tracker memory handler. */ { struct memTracker *mt = memTracker; if (mt == NULL) errAbort("memTrackerEnd without memTrackerStart"); memTracker = NULL; popMemHandler(); dlListFree(&mt->list); freeMem(mt->handler); freeMem(mt); } rtracklayer/src/ucsc/memalloc.h0000644000126300012640000000322312227135242020146 0ustar00biocbuildphs_compbio/* Let the user redirect where memory allocation/deallocation * happens. 'careful' routines help debug scrambled heaps. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef MEMALLOC_H #define MEMALLOC_H struct memHandler { struct memHandler *next; void * (*alloc)(size_t size); void (*free)(void *vpt); void * (*realloc)(void* vpt, size_t size); }; struct memHandler *pushMemHandler(struct memHandler *newHandler); /* Use newHandler for memory requests until matching popMemHandler. * Returns previous top of memory handler stack. */ struct memHandler *popMemHandler(); /* Removes top element from memHandler stack and returns it. */ void setDefaultMemHandler(); /* Sets memHandler to the default. */ void pushCarefulMemHandler(size_t maxAlloc); /* Push the careful (paranoid, conservative, checks everything) * memory handler top of the memHandler stack and use it. */ void carefulCheckHeap(); /* Walk through allocated memory and make sure that all cookies are * in place. Only walks through what's been done since * pushCarefulMemHandler(). */ int carefulCountBlocksAllocated(); /* How many memory items are allocated? (Since called * pushCarefulMemHandler(). */ long carefulTotalAllocated(); /* Return total bases allocated */ void setMaxAlloc(size_t s); /* Set large allocation limit. */ void memTrackerStart(); /* Push memory handler that will track blocks allocated so that * they can be automatically released with memTrackerEnd(). */ void memTrackerEnd(); /* Free any remaining blocks and pop tracker memory handler. */ #endif /* MEMALLOC_H */ rtracklayer/src/ucsc/net.c0000644000126300012640000017755212227135242017157 0ustar00biocbuildphs_compbio/* net.c some stuff to wrap around net communications. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef WIN32 #include "common.h" #include #include #include #include #include #include #include "internet.h" #include "errabort.h" #include "hash.h" #include "net.h" #include "linefile.h" #include "base64.h" #include "cheapcgi.h" #include "https.h" #include "sqlNum.h" #include "obscure.h" static char const rcsid[] = "$Id: net.c,v 1.80 2010/04/14 07:42:06 galt Exp $"; /* Brought errno in to get more useful error messages */ extern int errno; static int netStreamSocket() /* Create a TCP/IP streaming socket. Complain and return something * negative if can't */ { int sd = socket(AF_INET, SOCK_STREAM, 0); if (sd < 0) warn("Couldn't make AF_INET socket."); return sd; } static int netConnectWithTimeout(char *hostName, int port, long msTimeout) /* In order to avoid a very long default timeout (several minutes) for hosts that will * not answer the port, we are forced to connect non-blocking. * After the connection has been established, we return to blocking mode. */ { int sd; struct sockaddr_in sai; /* Some system socket info. */ int res; fd_set mySet; struct timeval lTime; long fcntlFlags; if (hostName == NULL) { warn("NULL hostName in netConnect"); return -1; } if (!internetFillInAddress(hostName, port, &sai)) return -1; if ((sd = netStreamSocket()) < 0) return sd; // Set non-blocking if ((fcntlFlags = fcntl(sd, F_GETFL, NULL)) < 0) { warn("Error fcntl(..., F_GETFL) (%s)", strerror(errno)); close(sd); return -1; } fcntlFlags |= O_NONBLOCK; if (fcntl(sd, F_SETFL, fcntlFlags) < 0) { warn("Error fcntl(..., F_SETFL) (%s)", strerror(errno)); close(sd); return -1; } // Trying to connect with timeout res = connect(sd, (struct sockaddr*) &sai, sizeof(sai)); if (res < 0) { if (errno == EINPROGRESS) { while (1) { lTime.tv_sec = (long) (msTimeout/1000); lTime.tv_usec = (long) (((msTimeout/1000)-lTime.tv_sec)*1000000); FD_ZERO(&mySet); FD_SET(sd, &mySet); res = select(sd+1, NULL, &mySet, &mySet, &lTime); if (res < 0) { if (errno != EINTR) { warn("Error in select() during TCP non-blocking connect %d - %s", errno, strerror(errno)); close(sd); return -1; } } else if (res > 0) { // Socket selected for write when it is ready int valOpt; socklen_t lon; // But check the socket for any errors lon = sizeof(valOpt); if (getsockopt(sd, SOL_SOCKET, SO_ERROR, (void*) (&valOpt), &lon) < 0) { warn("Error in getsockopt() %d - %s", errno, strerror(errno)); close(sd); return -1; } // Check the value returned... if (valOpt) { warn("Error in TCP non-blocking connect() %d - %s", valOpt, strerror(valOpt)); close(sd); return -1; } break; } else { warn("TCP non-blocking connect() to %s timed-out in select() after %ld milliseconds - Cancelling!", hostName, msTimeout); close(sd); return -1; } } } else { warn("TCP non-blocking connect() error %d - %s", errno, strerror(errno)); close(sd); return -1; } } // Set to blocking mode again if ((fcntlFlags = fcntl(sd, F_GETFL, NULL)) < 0) { warn("Error fcntl(..., F_GETFL) (%s)", strerror(errno)); close(sd); return -1; } fcntlFlags &= (~O_NONBLOCK); if (fcntl(sd, F_SETFL, fcntlFlags) < 0) { warn("Error fcntl(..., F_SETFL) (%s)", strerror(errno)); close(sd); return -1; } return sd; } int netConnect(char *hostName, int port) /* Start connection with a server. */ { return netConnectWithTimeout(hostName, port, 10000); // 10 seconds connect timeout } int netMustConnect(char *hostName, int port) /* Start connection with server or die. */ { int sd = netConnect(hostName, port); if (sd < 0) noWarnAbort(); return sd; } int netMustConnectTo(char *hostName, char *portName) /* Start connection with a server and a port that needs to be converted to integer */ { if (!isdigit(portName[0])) errAbort("netConnectTo: ports must be numerical, not %s", portName); return netMustConnect(hostName, atoi(portName)); } int netAcceptingSocketFrom(int port, int queueSize, char *host) /* Create a socket that can accept connections from a * IP address on the current machine if the current machine * has multiple IP addresses. */ { struct sockaddr_in sai; int sd; int flag = 1; netBlockBrokenPipes(); if ((sd = netStreamSocket()) < 0) return sd; if (!internetFillInAddress(host, port, &sai)) return -1; if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(int))) return -1; if (bind(sd, (struct sockaddr*)&sai, sizeof(sai)) == -1) { warn("Couldn't bind socket to %d: %s", port, strerror(errno)); close(sd); return -1; } listen(sd, queueSize); return sd; } int netAcceptingSocket(int port, int queueSize) /* Create a socket that can accept connections from * anywhere. */ { return netAcceptingSocketFrom(port, queueSize, NULL); } int netAccept(int sd) /* Accept incoming connection from socket descriptor. */ { socklen_t fromLen; return accept(sd, NULL, &fromLen); } int netAcceptFrom(int acceptor, unsigned char subnet[4]) /* Wait for incoming connection from socket descriptor * from IP address in subnet. Subnet is something * returned from netParseSubnet or internetParseDottedQuad. * Subnet may be NULL. */ { struct sockaddr_in sai; /* Some system socket info. */ ZeroVar(&sai); sai.sin_family = AF_INET; for (;;) { socklen_t addrSize = sizeof(sai); int sd = accept(acceptor, (struct sockaddr *)&sai, &addrSize); if (sd >= 0) { if (subnet == NULL) return sd; else { unsigned char unpacked[4]; internetUnpackIp(ntohl(sai.sin_addr.s_addr), unpacked); if (internetIpInSubnet(unpacked, subnet)) { return sd; } else { close(sd); } } } } } FILE *netFileFromSocket(int socket) /* Wrap a FILE around socket. This should be fclose'd * and separately the socket close'd. */ { FILE *f; if ((socket = dup(socket)) < 0) errnoAbort("Couldn't dupe socket in netFileFromSocket"); f = fdopen(socket, "r+"); if (f == NULL) errnoAbort("Couldn't fdopen socket in netFileFromSocket"); return f; } static boolean plumberInstalled = FALSE; void netBlockBrokenPipes() /* Make it so a broken pipe doesn't kill us. */ { if (!plumberInstalled) { signal(SIGPIPE, SIG_IGN); /* Block broken pipe signals. */ plumberInstalled = TRUE; } } size_t netReadAll(int sd, void *vBuf, size_t size) /* Read given number of bytes into buffer. * Don't give up on first read! */ { char *buf = vBuf; size_t totalRead = 0; int oneRead; if (!plumberInstalled) netBlockBrokenPipes(); while (totalRead < size) { oneRead = read(sd, buf + totalRead, size - totalRead); if (oneRead < 0) return oneRead; if (oneRead == 0) break; totalRead += oneRead; } return totalRead; } int netMustReadAll(int sd, void *vBuf, size_t size) /* Read given number of bytes into buffer or die. * Don't give up if first read is short! */ { int ret = netReadAll(sd, vBuf, size); if (ret < 0) errnoAbort("Couldn't finish netReadAll"); return ret; } static void notGoodSubnet(char *sns) /* Complain about subnet format. */ { errAbort("'%s' is not a properly formatted subnet. Subnets must consist of\n" "one to three dot-separated numbers between 0 and 255", sns); } void netParseSubnet(char *in, unsigned char out[4]) /* Parse subnet, which is a prefix of a normal dotted quad form. * Out will contain 255's for the don't care bits. */ { out[0] = out[1] = out[2] = out[3] = 255; if (in != NULL) { char *snsCopy = strdup(in); char *words[5]; int wordCount, i; wordCount = chopString(snsCopy, ".", words, ArraySize(words)); if (wordCount > 3 || wordCount < 1) notGoodSubnet(in); for (i=0; i 255) notGoodSubnet(in); out[i] = x; } freez(&snsCopy); } } static void parseByteRange(char *url, ssize_t *rangeStart, ssize_t *rangeEnd, boolean terminateAtByteRange) /* parse the byte range information from url */ { char *x; /* default to no byte range specified */ *rangeStart = -1; *rangeEnd = -1; x = strrchr(url, ';'); if (x) { if (startsWith(";byterange=", x)) { char *y=strchr(x, '='); ++y; char *z=strchr(y, '-'); if (z) { ++z; if (terminateAtByteRange) *x = 0; // TODO: use something better than atoll() ? *rangeStart = atoll(y); if (z[0] != '\0') *rangeEnd = atoll(z); } } } } void netParseUrl(char *url, struct netParsedUrl *parsed) /* Parse a URL into components. A full URL is made up as so: * http://user:password@hostName:port/file;byterange=0-499 * User and password may be cgi-encoded. * This is set up so that the http:// and the port are optional. */ { char *s, *t, *u, *v, *w; char buf[1024]; /* Make local copy of URL. */ if (strlen(url) >= sizeof(buf)) errAbort("Url too long: '%s'", url); strcpy(buf, url); url = buf; /* Find out protocol - default to http. */ s = trimSpaces(url); s = stringIn("://", url); if (s == NULL) { strcpy(parsed->protocol, "http"); s = url; } else { *s = 0; tolowers(url); safecpy(parsed->protocol, sizeof(parsed->protocol), url); s += 3; } /* Split off file part. */ parsed->byteRangeStart = -1; /* default to no byte range specified */ parsed->byteRangeEnd = -1; u = strchr(s, '/'); if (u == NULL) strcpy(parsed->file, "/"); else { parseByteRange(u, &parsed->byteRangeStart, &parsed->byteRangeEnd, TRUE); /* need to encode spaces, but not ! other characters */ char *t=replaceChars(u," ","%20"); safecpy(parsed->file, sizeof(parsed->file), t); freeMem(t); *u = 0; } /* Split off user part */ v = strchr(s, '@'); if (v == NULL) { if (sameWord(parsed->protocol,"http") || sameWord(parsed->protocol,"https")) { strcpy(parsed->user, ""); strcpy(parsed->password, ""); } if (sameWord(parsed->protocol,"ftp")) { strcpy(parsed->user, "anonymous"); strcpy(parsed->password, "x@genome.ucsc.edu"); } } else { *v = 0; /* split off password part */ w = strchr(s, ':'); if (w == NULL) { safecpy(parsed->user, sizeof(parsed->user), s); strcpy(parsed->password, ""); } else { *w = 0; safecpy(parsed->user, sizeof(parsed->user), s); safecpy(parsed->password, sizeof(parsed->password), w+1); } cgiDecode(parsed->user,parsed->user,strlen(parsed->user)); cgiDecode(parsed->password,parsed->password,strlen(parsed->password)); s = v+1; } /* Save port if it's there. If not default to 80. */ t = strchr(s, ':'); if (t == NULL) { if (sameWord(parsed->protocol,"http")) strcpy(parsed->port, "80"); if (sameWord(parsed->protocol,"https")) strcpy(parsed->port, "443"); if (sameWord(parsed->protocol,"ftp")) strcpy(parsed->port, "21"); } else { *t++ = 0; if (!isdigit(t[0])) errAbort("Non-numeric port name %s", t); safecpy(parsed->port, sizeof(parsed->port), t); } /* What's left is the host. */ safecpy(parsed->host, sizeof(parsed->host), s); } char *urlFromNetParsedUrl(struct netParsedUrl *npu) /* Build URL from netParsedUrl structure */ { struct dyString *dy = newDyString(512); dyStringAppend(dy, npu->protocol); dyStringAppend(dy, "://"); if (npu->user[0] != 0) { char *encUser = cgiEncode(npu->user); dyStringAppend(dy, encUser); freeMem(encUser); if (npu->password[0] != 0) { dyStringAppend(dy, ":"); char *encPassword = cgiEncode(npu->password); dyStringAppend(dy, encPassword); freeMem(encPassword); } dyStringAppend(dy, "@"); } dyStringAppend(dy, npu->host); /* do not include port if it is the default */ if (!( (sameString(npu->protocol, "ftp" ) && sameString("21", npu->port)) || (sameString(npu->protocol, "http" ) && sameString("80", npu->port)) || (sameString(npu->protocol, "https") && sameString("443",npu->port)) )) { dyStringAppend(dy, ":"); dyStringAppend(dy, npu->port); } dyStringAppend(dy, npu->file); if (npu->byteRangeStart != -1) { dyStringPrintf(dy, ";byterange=%lld-", (long long)npu->byteRangeStart); if (npu->byteRangeEnd != -1) dyStringPrintf(dy, "%lld", (long long)npu->byteRangeEnd); } /* Clean up and return handle. */ return dyStringCannibalize(&dy); } /* this was cloned from rudp.c - move it later for sharing */ static boolean readReadyWait(int sd, int microseconds) /* Wait for descriptor to have some data to read, up to * given number of microseconds. */ { struct timeval tv; fd_set set; int readyCount; for (;;) { if (microseconds >= 1000000) { tv.tv_sec = microseconds/1000000; tv.tv_usec = microseconds%1000000; } else { tv.tv_sec = 0; tv.tv_usec = microseconds; } FD_ZERO(&set); FD_SET(sd, &set); readyCount = select(sd+1, &set, NULL, NULL, &tv); if (readyCount < 0) { if (errno == EINTR) /* Select interrupted, not timed out. */ continue; else warn("select failure in rudp: %s", strerror(errno)); } else { return readyCount > 0; /* Zero readyCount indicates time out */ } } } static void sendFtpCommandOnly(int sd, char *cmd) /* send command to ftp server */ { mustWriteFd(sd, cmd, strlen(cmd)); } #define NET_FTP_TIMEOUT 1000000 static boolean receiveFtpReply(int sd, char *cmd, struct dyString **retReply, int *retCode) /* send command to ftp server and check resulting reply code, * warn and return FALSE if not desired reply. If retReply is non-NULL, store reply text there. */ { char *startLastLine = NULL; struct dyString *rs = newDyString(4*1024); while (1) { int readSize = 0; while (1) { char buf[4*1024]; if (!readReadyWait(sd, NET_FTP_TIMEOUT)) { warn("ftp server response timed out > %d microsec", NET_FTP_TIMEOUT); return FALSE; } if ((readSize = read(sd, buf, sizeof(buf))) == 0) break; dyStringAppendN(rs, buf, readSize); if (endsWith(rs->string,"\n")) break; } /* find the start of the last line in the buffer */ startLastLine = rs->string+strlen(rs->string)-1; if (startLastLine >= rs->string) if (*startLastLine == '\n') --startLastLine; while ((startLastLine >= rs->string) && (*startLastLine != '\n')) --startLastLine; ++startLastLine; if (strlen(startLastLine)>4) if ( isdigit(startLastLine[0]) && isdigit(startLastLine[1]) && isdigit(startLastLine[2]) && startLastLine[3]==' ') break; if (readSize == 0) break; // EOF /* must be some text info we can't use, ignore it till we get status code */ } int reply = atoi(startLastLine); if ((reply < 200) || (reply > 399)) { warn("ftp server error on cmd=[%s] response=[%s]",cmd,rs->string); return FALSE; } if (retReply) *retReply = rs; else dyStringFree(&rs); if (retCode) *retCode = reply; return TRUE; } static boolean sendFtpCommand(int sd, char *cmd, struct dyString **retReply, int *retCode) /* send command to ftp server and check resulting reply code, * warn and return FALSE if not desired reply. If retReply is non-NULL, store reply text there. */ { sendFtpCommandOnly(sd, cmd); return receiveFtpReply(sd, cmd, retReply, retCode); } static int parsePasvPort(char *rs) /* parse PASV reply to get the port and return it */ { char *words[7]; int wordCount; char *rsStart = strchr(rs,'('); char *rsEnd = strchr(rs,')'); int result = 0; rsStart++; *rsEnd=0; wordCount = chopString(rsStart, ",", words, ArraySize(words)); if (wordCount != 6) errAbort("PASV reply does not parse correctly"); result = atoi(words[4])*256+atoi(words[5]); return result; } static long long parseFtpSIZE(char *rs) /* parse reply to SIZE and return it */ { char *words[3]; int wordCount; char *rsStart = rs; long long result = 0; wordCount = chopString(rsStart, " ", words, ArraySize(words)); if (wordCount != 2) errAbort("SIZE reply does not parse correctly"); result = atoll(words[1]); return result; } static time_t parseFtpMDTM(char *rs) /* parse reply to MDTM and return it * 200 YYYYMMDDhhmmss */ { char *words[3]; int wordCount = chopString(rs, " ", words, ArraySize(words)); if (wordCount != 2) errAbort("MDTM reply should have 2 words but has %d", wordCount); #define EXPECTED_MDTM_FORMAT "YYYYmmddHHMMSS" if (strlen(words[1]) < strlen(EXPECTED_MDTM_FORMAT)) errAbort("MDTM reply word [%s] shorter than " EXPECTED_MDTM_FORMAT, words[1]); // man strptime -> // "There should be whitespace or other alphanumeric characters between any two field descriptors." // There are no separators in the MDTM timestamp, so make a spread-out version for strptime: char spread[] = "YYYY mm dd HH MM SS"; char *from = words[1]; char *to = spread; *to++ = *from++; *to++ = *from++; *to++ = *from++; *to++ = *from++; *to++ = '-'; *to++ = *from++; *to++ = *from++; *to++ = '-'; *to++ = *from++; *to++ = *from++; *to++ = ' '; *to++ = *from++; *to++ = *from++; *to++ = ':'; *to++ = *from++; *to++ = *from++; *to++ = ':'; *to++ = *from++; *to++ = *from++; *to++ = 0; struct tm tm; if (strptime(spread, "%Y-%m-%d %H:%M:%S", &tm) == NULL) errAbort("unable to parse MDTM string [%s]", spread); // Not set by strptime(); tells mktime() to determine whether daylight saving time is in effect: tm.tm_isdst = -1; time_t t = mktime(&tm); if (t == -1) errAbort("mktime failed while parsing strptime'd MDTM string [%s]", words[1]); return t; } static int openFtpControlSocket(char *host, int port, char *user, char *password) /* Open a socket to host,port; authenticate anonymous ftp; set type to I; * return socket desc or -1 if there was an error. */ { int sd = netConnect(host, port); if (sd < 0) return -1; /* First read the welcome msg */ if (readReadyWait(sd, NET_FTP_TIMEOUT)) sendFtpCommand(sd, "", NULL, NULL); char cmd[256]; int retCode = 0; safef(cmd,sizeof(cmd),"USER %s\r\n", user); if (!sendFtpCommand(sd, cmd, NULL, &retCode)) { close(sd); return -1; } if (retCode == 331) { safef(cmd,sizeof(cmd),"PASS %s\r\n", password); if (!sendFtpCommand(sd, cmd, NULL, NULL)) { close(sd); return -1; } } if (!sendFtpCommand(sd, "TYPE I\r\n", NULL, NULL)) { close(sd); return -1; } /* 200 Type set to I */ /* (send the data as binary, so can support compressed files) */ return sd; } boolean netGetFtpInfo(char *url, long long *retSize, time_t *retTime) /* Return date in UTC and size of ftp url file */ { /* Parse the URL and connect. */ struct netParsedUrl npu; netParseUrl(url, &npu); if (!sameString(npu.protocol, "ftp")) errAbort("netGetFtpInfo: url (%s) is not for ftp.", url); // TODO maybe remove this workaround where udc cache wants info on URL "/" ? if (sameString(npu.file,"/")) { *retSize = 0; *retTime = time(NULL); return TRUE; } int sd = openFtpControlSocket(npu.host, atoi(npu.port), npu.user, npu.password); if (sd < 0) return FALSE; char cmd[256]; safef(cmd,sizeof(cmd),"SIZE %s\r\n", npu.file); struct dyString *rs = NULL; if (!sendFtpCommand(sd, cmd, &rs, NULL)) { close(sd); return FALSE; } *retSize = parseFtpSIZE(rs->string); /* 200 12345 */ dyStringFree(&rs); safef(cmd,sizeof(cmd),"MDTM %s\r\n", npu.file); if (!sendFtpCommand(sd, cmd, &rs, NULL)) { close(sd); return FALSE; } *retTime = parseFtpMDTM(rs->string); /* 200 YYYYMMDDhhmmss */ dyStringFree(&rs); close(sd); return TRUE; } struct netConnectFtpParams /* params to pass to thread */ { pthread_t thread; int pipefd[2]; int sd; int sdata; struct netParsedUrl npu; }; static void *sendFtpDataToPipeThread(void *threadParams) /* This is to be executed by the child process after the fork in netGetOpenFtpSockets. * It keeps the ftp control socket alive while reading from the ftp data socket * and writing to the pipe to the parent process, which closes the ftp sockets * and reads from the pipe. */ { struct netConnectFtpParams *params = threadParams; pthread_detach(params->thread); // this thread will never join back with it's progenitor char buf[32768]; int rd = 0; long long dataPos = 0; if (params->npu.byteRangeStart != -1) dataPos = params->npu.byteRangeStart; while((rd = read(params->sdata, buf, 32768)) > 0) { if (params->npu.byteRangeEnd != -1 && (dataPos + rd) > params->npu.byteRangeEnd) rd = params->npu.byteRangeEnd - dataPos + 1; int wt = write(params->pipefd[1], buf, rd); if (wt == -1 && params->npu.byteRangeEnd != -1) { // errAbort in child process is messy; let reader complain if // trouble. If byterange was open-ended, we will hit this point // when the parent stops reading and closes the pipe. errnoWarn("error writing ftp data to pipe"); break; } dataPos += rd; if (params->npu.byteRangeEnd != -1 && dataPos >= params->npu.byteRangeEnd) break; } if (rd == -1) // Again, avoid abort in child process. errnoWarn("error reading ftp socket"); close(params->pipefd[1]); /* we are done with it */ close(params->sd); close(params->sdata); return NULL; } static int netGetOpenFtpSockets(char *url, int *retCtrlSd) /* Return a socket descriptor for url data (url can end in ";byterange:start-end", * or -1 if error. * If retCtrlSd is non-null, keep the control socket alive and set *retCtrlSd. * Otherwise, create a pipe and fork to keep control socket alive in the child * process until we are done fetching data. */ { char cmd[256]; /* Parse the URL and connect. */ struct netParsedUrl npu; netParseUrl(url, &npu); if (!sameString(npu.protocol, "ftp")) errAbort("netGetOpenFtpSockets: url (%s) is not for ftp.", url); int sd = openFtpControlSocket(npu.host, atoi(npu.port), npu.user, npu.password); if (sd == -1) return -1; struct dyString *rs = NULL; if (!sendFtpCommand(sd, "PASV\r\n", &rs, NULL)) { close(sd); return -1; } /* 227 Entering Passive Mode (128,231,210,81,222,250) */ if (npu.byteRangeStart != -1) { safef(cmd,sizeof(cmd),"REST %lld\r\n", (long long) npu.byteRangeStart); if (!sendFtpCommand(sd, cmd, NULL, NULL)) { close(sd); return -1; } } /* RETR for files, LIST for directories ending in / */ safef(cmd,sizeof(cmd),"%s %s\r\n",((npu.file[strlen(npu.file)-1]) == '/') ? "LIST" : "RETR", npu.file); sendFtpCommandOnly(sd, cmd); int sdata = netConnect(npu.host, parsePasvPort(rs->string)); dyStringFree(&rs); if (sdata < 0) { close(sd); return -1; } int secondsWaited = 0; while (TRUE) { if (secondsWaited >= 10) { warn("ftp server error on cmd=[%s] timed-out waiting for data or error", cmd); close(sd); close(sdata); return -1; } if (readReadyWait(sdata, NET_FTP_TIMEOUT)) break; // we have some data if (readReadyWait(sd, 0)) /* wait in microsec */ { // this can see an error like bad filename if (!receiveFtpReply(sd, cmd, NULL, NULL)) { close(sd); close(sdata); return -1; } } ++secondsWaited; } if (retCtrlSd != NULL) { *retCtrlSd = sd; return sdata; } else { /* Because some FTP servers will kill the data connection * as soon as the control connection closes, * we have to develop a workaround using a partner process. */ fflush(stdin); fflush(stdout); fflush(stderr); struct netConnectFtpParams *params; AllocVar(params); params->sd = sd; params->sdata = sdata; params->npu = npu; /* make a pipe (fds go in pipefd[0] and pipefd[1]) */ if (pipe(params->pipefd) != 0) errAbort("netGetOpenFtpSockets: failed to create pipe: %s", strerror(errno)); int rc; rc = pthread_create(¶ms->thread, NULL, sendFtpDataToPipeThread, (void *)params); if (rc) { errAbort("Unexpected error %d from pthread_create(): %s",rc,strerror(rc)); } return params->pipefd[0]; } } int connectNpu(struct netParsedUrl npu, char *url) /* Connect using NetParsedUrl. */ { int sd = -1; if (sameString(npu.protocol, "http")) { sd = netConnect(npu.host, atoi(npu.port)); } else if (sameString(npu.protocol, "https")) { sd = netConnectHttps(npu.host, atoi(npu.port)); } else { errAbort("netHttpConnect: url (%s) is not for http.", url); return -1; /* never gets here, fixes compiler complaint */ } return sd; } void setAuthorization(struct netParsedUrl npu, char *authHeader, struct dyString *dy) /* Set the specified authorization header with BASIC auth base64-encoded user and password */ { if (!sameString(npu.user,"")) { char up[256]; char *b64up = NULL; safef(up, sizeof(up), "%s:%s", npu.user, npu.password); b64up = base64Encode(up, strlen(up)); dyStringPrintf(dy, "%s: Basic %s\r\n", authHeader, b64up); freez(&b64up); } } int netHttpConnect(char *url, char *method, char *protocol, char *agent, char *optionalHeader) /* Parse URL, connect to associated server on port, and send most of * the request to the server. If specified in the url send user name * and password too. Typically the "method" will be "GET" or "POST" * and the agent will be the name of your program or * library. optionalHeader may be NULL or contain additional header * lines such as cookie info. * Proxy support via hg.conf httpProxy or env var http_proxy * Return data socket, or -1 if error.*/ { struct netParsedUrl npu; struct netParsedUrl pxy; struct dyString *dy = newDyString(512); int sd = -1; /* Parse the URL and connect. */ netParseUrl(url, &npu); char *proxyUrl = getenv("http_proxy"); if (proxyUrl) { netParseUrl(proxyUrl, &pxy); sd = connectNpu(pxy, url); } else { sd = connectNpu(npu, url); } if (sd < 0) return -1; /* Ask remote server for a file. */ char *urlForProxy = NULL; if (proxyUrl) { /* trim off the byterange part at the end of url because proxy does not understand it. */ urlForProxy = cloneString(url); char *x = strrchr(urlForProxy, ';'); if (x && startsWith(";byterange=", x)) *x = 0; } dyStringPrintf(dy, "%s %s %s\r\n", method, proxyUrl ? urlForProxy : npu.file, protocol); freeMem(urlForProxy); dyStringPrintf(dy, "User-Agent: %s\r\n", agent); /* do not need the 80 since it is the default */ if ((sameString(npu.protocol, "http" ) && sameString("80", npu.port)) || (sameString(npu.protocol, "https") && sameString("443",npu.port))) dyStringPrintf(dy, "Host: %s\r\n", npu.host); else dyStringPrintf(dy, "Host: %s:%s\r\n", npu.host, npu.port); setAuthorization(npu, "Authorization", dy); if (proxyUrl) setAuthorization(pxy, "Proxy-Authorization", dy); dyStringAppend(dy, "Accept: */*\r\n"); if (npu.byteRangeStart != -1) { if (npu.byteRangeEnd != -1) dyStringPrintf(dy, "Range: bytes=%lld-%lld\r\n" , (long long)npu.byteRangeStart , (long long)npu.byteRangeEnd); else dyStringPrintf(dy, "Range: bytes=%lld-\r\n" , (long long)npu.byteRangeStart); } if (optionalHeader) dyStringAppend(dy, optionalHeader); /* finish off the header with final blank line */ dyStringAppend(dy, "\r\n"); mustWriteFd(sd, dy->string, dy->stringSize); /* Clean up and return handle. */ dyStringFree(&dy); return sd; } int netOpenHttpExt(char *url, char *method, char *optionalHeader) /* Return a file handle that will read the url. optionalHeader * may by NULL or may contain cookies and other info. */ { return netHttpConnect(url, method, "HTTP/1.0", "genome.ucsc.edu/net.c", optionalHeader); } static int netGetOpenHttp(char *url) /* Return a file handle that will read the url. */ { return netOpenHttpExt(url, "GET", NULL); } int netUrlHeadExt(char *url, char *method, struct hash *hash) /* Go get head and return status. Return negative number if * can't get head. If hash is non-null, fill it with header * lines with upper cased keywords for case-insensitive lookup, * including hopefully CONTENT-TYPE: . */ { int sd = netOpenHttpExt(url, method, NULL); int status = EIO; if (sd >= 0) { char *line, *word; struct lineFile *lf = lineFileAttach(url, TRUE, sd); if (lineFileNext(lf, &line, NULL)) { if (startsWith("HTTP/", line)) { word = nextWord(&line); word = nextWord(&line); if (word != NULL && isdigit(word[0])) { status = atoi(word); if (hash != NULL) { while (lineFileNext(lf, &line, NULL)) { word = nextWord(&line); if (word == NULL) break; hashAdd(hash, strUpper(word), cloneString(skipLeadingSpaces(line))); } } } } } lineFileClose(&lf); } else status = errno; return status; } int netUrlHead(char *url, struct hash *hash) /* Go get head and return status. Return negative number if * can't get head. If hash is non-null, fill it with header * lines with upper cased keywords for case-insensitive lookup, * including hopefully CONTENT-TYPE: . */ { return netUrlHeadExt(url, "HEAD", hash); } long long netUrlSizeByRangeResponse(char *url) /* Use byteRange as a work-around alternate method to get file size (content-length). * Return negative number if can't get. */ { long long retVal = -1; char rangeUrl[2048]; safef(rangeUrl, sizeof(rangeUrl), "%s;byterange=0-0", url); struct hash *hash = newHash(0); int status = netUrlHeadExt(rangeUrl, "GET", hash); if (status == 206) { char *rangeString = hashFindValUpperCase(hash, "Content-Range:"); if (rangeString) { /* input pattern: Content-Range: bytes 0-99/2738262 */ char *slash = strchr(rangeString,'/'); if (slash) { retVal = atoll(slash+1); } } } hashFree(&hash); return retVal; } int netUrlOpenSockets(char *url, int *retCtrlSocket) /* Return socket descriptor (low-level file handle) for read()ing url data, * or -1 if error. * If retCtrlSocket is non-NULL and url is FTP, set *retCtrlSocket * to the FTP control socket which is left open for a persistent connection. * close(result) (and close(*retCtrlSocket) if applicable) when done. * If url is missing :// then it's just treated as a file. */ { if (stringIn("://", url) == NULL) return open(url, O_RDONLY); else { if (startsWith("http://",url) || startsWith("https://",url)) return netGetOpenHttp(url); else if (startsWith("ftp://",url)) return netGetOpenFtpSockets(url, retCtrlSocket); else errAbort("Sorry, can only netUrlOpen http, https and ftp currently, not '%s'", url); } return -1; } int netUrlOpen(char *url) /* Return socket descriptor (low-level file handle) for read()ing url data, * or -1 if error. Just close(result) when done. */ { return netUrlOpenSockets(url, NULL); } struct dyString *netSlurpFile(int sd) /* Slurp file into dynamic string and return. */ { char buf[4*1024]; int readSize; struct dyString *dy = newDyString(4*1024); /* Slurp file into dy and return. */ while ((readSize = read(sd, buf, sizeof(buf))) > 0) dyStringAppendN(dy, buf, readSize); return dy; } struct dyString *netSlurpUrl(char *url) /* Go grab all of URL and return it as dynamic string. */ { int sd = netUrlOpen(url); if (sd < 0) errAbort("netSlurpUrl: failed to open socket for [%s]", url); struct dyString *dy = netSlurpFile(sd); close(sd); return dy; } static void parseContentRange(char *x, ssize_t *rangeStart, ssize_t *rangeEnd) /* parse the content range information from response header value "bytes 763400000-763400112/763400113" */ { /* default to no byte range specified */ *rangeStart = -1; *rangeEnd = -1; if (startsWith("bytes ", x)) { char *y=strchr(x, ' '); ++y; char *z=strchr(y, '-'); if (z) { ++z; // TODO: use something better than atoll() ? *rangeStart = atoll(y); if (z[0] != '\0') *rangeEnd = atoll(z); } } } boolean netSkipHttpHeaderLinesWithRedirect(int sd, char *url, char **redirectedUrl) /* Skip http header lines. Return FALSE if there's a problem. * The input is a standard sd or fd descriptor. * This is meant to be able work even with a re-passable stream handle, * e.g. can pass it to the pipes routines, which means we can't * attach a linefile since filling its buffer reads in more than just the http header. * Handles 300, 301, 302, 303, 307 http redirects by setting *redirectedUrl to * the new location. */ { char buf[2000]; char *line = buf; int maxbuf = sizeof(buf); int i=0; char c = ' '; int nread = 0; char *sep = NULL; char *headerName = NULL; char *headerVal = NULL; boolean redirect = FALSE; boolean byteRangeUsed = (strstr(url,";byterange=") != NULL); ssize_t byteRangeStart = -1; ssize_t byteRangeEnd = -1; boolean foundContentRange = FALSE; ssize_t contentRangeStart = -1; ssize_t contentRangeEnd = -1; boolean mustUseProxy = FALSE; /* User must use proxy 305 error*/ char *proxyLocation = NULL; boolean mustUseProxyAuth = FALSE; /* User must use proxy authentication 407 error*/ if (byteRangeUsed) { parseByteRange(url, &byteRangeStart, &byteRangeEnd, FALSE); } while(TRUE) { i = 0; while (TRUE) { nread = read(sd, &c, 1); /* one char at a time, but http headers are small */ if (nread != 1) { if (nread == -1) warn("Error (%s) reading http header on %s", strerror(errno), url); else if (nread == 0) warn("Error unexpected end of input reading http header on %s", url); else warn("Error reading http header on %s", url); return FALSE; /* err reading descriptor */ } if (c == 10) break; if (c != 13) buf[i++] = c; if (i >= maxbuf) { warn("http header line too long > %d chars.",maxbuf); return FALSE; } } buf[i] = 0; /* add string terminator */ if (sameString(line,"")) { break; /* End of Header found */ } if (startsWith("HTTP/", line)) { char *version, *code; version = nextWord(&line); code = nextWord(&line); if (code == NULL) { warn("Strange http header on %s", url); return FALSE; } if (startsWith("30", code) && isdigit(code[2]) && ((code[2] >= '0' && code[2] <= '3') || code[2] == '7') && code[3] == 0) { redirect = TRUE; } else if (sameString(code, "305")) { mustUseProxy = TRUE; } else if (sameString(code, "407")) { mustUseProxyAuth = TRUE; } else if (byteRangeUsed) { if (!sameString(code, "206")) { if (sameString(code, "200")) warn("Byte-range request was ignored by server. "); warn("Expected Partial Content 206. %s: %s %s", url, code, line); return FALSE; } } else if (!sameString(code, "200")) { warn("Expected 200 %s: %s %s", url, code, line); return FALSE; } line = buf; /* restore it */ } headerName = line; sep = strchr(line,':'); if (sep) { *sep = 0; headerVal = skipLeadingSpaces(++sep); } else { headerVal = NULL; } if (sameWord(headerName,"Location")) { if (redirect) *redirectedUrl = cloneString(headerVal); if (mustUseProxy) proxyLocation = cloneString(headerVal); } if (sameWord(headerName,"Content-Range")) { if (byteRangeUsed) { foundContentRange = TRUE; parseContentRange(headerVal, &contentRangeStart, &contentRangeEnd); if ((contentRangeStart != byteRangeStart) || (byteRangeEnd != -1 && (contentRangeEnd != byteRangeEnd))) { char bre[256]; safef(bre, sizeof bre, "%lld", (long long)byteRangeEnd); if (byteRangeEnd == -1) bre[0] = 0; warn("Found Content-Range: %s. Expected bytes %lld-%s. Improper caching of 206 reponse byte-ranges?", headerVal, (long long) byteRangeStart, bre); return FALSE; } } } } if (mustUseProxy || mustUseProxyAuth) { warn("%s: %s error. Use Proxy%s. Location = %s", url, mustUseProxy ? "" : " Authentication", mustUseProxy ? "305" : "407", proxyLocation ? proxyLocation : "not given"); return FALSE; } if (byteRangeUsed && !foundContentRange) { char bre[256]; safef(bre, sizeof bre, "%lld", (long long)byteRangeEnd); if (byteRangeEnd == -1) bre[0] = 0; warn("Expected response header Content-Range: %lld-%s", (long long) byteRangeStart, bre); return FALSE; } return TRUE; } boolean netSkipHttpHeaderLinesHandlingRedirect(int sd, char *url, int *redirectedSd, char **redirectedUrl) /* Skip http headers lines, returning FALSE if there is a problem. Generally called as * netSkipHttpHeaderLine(sd, url, &sd, &url); * where sd is a socket (file) opened with netUrlOpen(url), and url is in dynamic memory. * If the http header indicates that the file has moved, then it will update the *redirectedSd and * *redirectedUrl with the new socket and URL, first closing sd. * If for some reason you want to detect whether the forwarding has occurred you could * call this as: * char *newUrl = NULL; * int newSd = 0; * netSkipHttpHeaderLine(sd, url, &newSd, &newUrl); * if (newUrl != NULL) * // Update sd with newSd, free url if appropriate and replace it with newUrl, etc. * // free newUrl when finished. * This routine handles up to 5 steps of redirection. * The logic to this routine is also complicated a little to make it work in a pipe, which means we * can't attach a lineFile since filling the lineFile buffer reads in more than just the http header. */ { int redirectCount = 0; while (TRUE) { /* url needed for err msgs, and to return redirect location */ char *newUrl = NULL; boolean success = netSkipHttpHeaderLinesWithRedirect(sd, url, &newUrl); if (success && !newUrl) /* success after 0 to 5 redirects */ { if (redirectCount > 0) { *redirectedSd = sd; *redirectedUrl = url; } else { *redirectedSd = -1; *redirectedUrl = NULL; } return TRUE; } close(sd); if (redirectCount > 0) freeMem(url); if (success) { /* we have a new url to try */ ++redirectCount; if (redirectCount > 5) { warn("code 30x redirects: exceeded limit of 5 redirects, %s", newUrl); success = FALSE; } else if (!startsWith("http://",newUrl) && !startsWith("https://",newUrl)) { warn("redirected to non-http(s): %s", newUrl); success = FALSE; } else { struct netParsedUrl npu, newNpu; /* Parse the old URL to make parts available for graft onto the redirected url. */ /* This makes redirection work with byterange urls and user:password@ */ netParseUrl(url, &npu); netParseUrl(newUrl, &newNpu); boolean updated = FALSE; if (npu.byteRangeStart != -1) { newNpu.byteRangeStart = npu.byteRangeStart; newNpu.byteRangeEnd = npu.byteRangeEnd; updated = TRUE; } if ((npu.user[0] != 0) && (newNpu.user[0] == 0)) { safecpy(newNpu.user, sizeof newNpu.user, npu.user); safecpy(newNpu.password, sizeof newNpu.password, npu.password); updated = TRUE; } if (updated) { freeMem(newUrl); newUrl = urlFromNetParsedUrl(&newNpu); } sd = netUrlOpen(newUrl); if (sd < 0) { warn("Couldn't open %s", newUrl); success = FALSE; } } } if (!success) { /* failure after 0 to 5 redirects */ if (redirectCount > 0) freeMem(newUrl); return FALSE; } url = newUrl; } return FALSE; } struct lineFile *netLineFileMayOpen(char *url) /* Return a lineFile attached to url. http skips header. * Supports some compression formats. Prints warning message, but * does not abort, just returning NULL if there's a problem. */ { int sd = netUrlOpen(url); if (sd < 0) { warn("Couldn't open %s", url); return NULL; } else { struct lineFile *lf = NULL; char *newUrl = NULL; int newSd = 0; if (startsWith("http://",url) || startsWith("https://",url)) { if (!netSkipHttpHeaderLinesHandlingRedirect(sd, url, &newSd, &newUrl)) { return NULL; } if (newUrl != NULL) { /* Update sd with newSd, replace it with newUrl, etc. */ sd = newSd; url = newUrl; } } if (endsWith(url, ".gz") || endsWith(url, ".Z") || endsWith(url, ".bz2")) { lf = lineFileDecompressFd(url, TRUE, sd); /* url needed only for compress type determination */ } else { lf = lineFileAttach(url, TRUE, sd); } if (newUrl) freeMem(newUrl); return lf; } } struct lineFile *netLineFileSilentOpen(char *url) /* Open a lineFile on a URL. Just return NULL without any user * visible warning message if there's a problem. */ { pushSilentWarnHandler(); struct lineFile *lf = netLineFileMayOpen(url); popWarnHandler(); return lf; } char *netReadTextFileIfExists(char *url) /* Read entire URL and return it as a string. URL should be text (embedded zeros will be * interpreted as end of string). If the url doesn't exist or has other problems, * returns NULL. */ { struct lineFile *lf = netLineFileSilentOpen(url); if (lf == NULL) return NULL; char *text = lineFileReadAll(lf); lineFileClose(&lf); return text; } struct parallelConn /* struct to information on a parallel connection */ { struct parallelConn *next; /* next connection */ int sd; /* socket descriptor */ off_t rangeStart; /* where does the range start */ off_t partSize; /* range size */ off_t received; /* bytes received */ }; void writeParaFetchStatus(char *origPath, struct parallelConn *pcList, char *url, off_t fileSize, char *dateString, boolean isFinal) /* Write a status file. * This has two purposes. * First, we can use it to resume a failed transfer. * Second, we can use it to follow progress */ { char outTempX[1024]; char outTemp[1024]; safef(outTempX, sizeof(outTempX), "%s.paraFetchStatusX", origPath); safef(outTemp, sizeof(outTemp), "%s.paraFetchStatus", origPath); struct parallelConn *pc = NULL; FILE *f = mustOpen(outTempX, "w"); int part = 0; fprintf(f, "%s\n", url); fprintf(f, "%lld\n", (long long)fileSize); fprintf(f, "%s\n", dateString); for(pc = pcList; pc; pc = pc->next) { fprintf(f, "part%d %lld %lld %lld\n", part , (long long)pc->rangeStart , (long long)pc->partSize , (long long)pc->received); ++part; } carefulClose(&f); /* rename the successful status to the original name */ rename(outTempX, outTemp); if (isFinal) /* We are done and just looking to get rid of the file. */ unlink(outTemp); } boolean readParaFetchStatus(char *origPath, struct parallelConn **pPcList, char **pUrl, off_t *pFileSize, char **pDateString, off_t *pTotalDownloaded) /* Write a status file. * This has two purposes. * First, we can use it to resume a failed transfer. * Second, we can use it to follow progress */ { char outTemp[1024]; char outStat[1024]; safef(outStat, sizeof(outStat), "%s.paraFetchStatus", origPath); safef(outTemp, sizeof(outTemp), "%s.paraFetch", origPath); struct parallelConn *pcList = NULL, *pc = NULL; off_t totalDownloaded = 0; if (!fileExists(outStat)) { unlink(outTemp); return FALSE; } if (!fileExists(outTemp)) { unlink(outStat); return FALSE; } char *line, *word; struct lineFile *lf = lineFileOpen(outStat, TRUE); if (!lineFileNext(lf, &line, NULL)) { unlink(outTemp); unlink(outStat); return FALSE; } char *url = cloneString(line); if (!lineFileNext(lf, &line, NULL)) { unlink(outTemp); unlink(outStat); return FALSE; } off_t fileSize = sqlLongLong(line); if (!lineFileNext(lf, &line, NULL)) { unlink(outTemp); unlink(outStat); return FALSE; } char *dateString = cloneString(line); while (lineFileNext(lf, &line, NULL)) { word = nextWord(&line); AllocVar(pc); pc->next = NULL; pc->sd = -4; /* no connection tried yet */ word = nextWord(&line); pc->rangeStart = sqlLongLong(word); word = nextWord(&line); pc->partSize = sqlLongLong(word); word = nextWord(&line); pc->received = sqlLongLong(word); if (pc->received == pc->partSize) pc->sd = -1; /* part all done already */ totalDownloaded += pc->received; slAddHead(&pcList, pc); } slReverse(&pcList); lineFileClose(&lf); if (slCount(pcList) < 1) { unlink(outTemp); unlink(outStat); return FALSE; } *pPcList = pcList; *pUrl = url; *pFileSize = fileSize; *pDateString = dateString; *pTotalDownloaded = totalDownloaded; return TRUE; } boolean parallelFetch(char *url, char *outPath, int numConnections, int numRetries, boolean newer, boolean progress) /* Open multiple parallel connections to URL to speed downloading */ { char *origPath = outPath; char outTemp[1024]; safef(outTemp, sizeof(outTemp), "%s.paraFetch", outPath); outPath = outTemp; /* get the size of the file to be downloaded */ off_t fileSize = 0; off_t totalDownloaded = 0; ssize_t sinceLastStatus = 0; char *dateString = ""; int star = 1; int starMax = 20; int starStep = 1; // TODO handle case-sensitivity of protocols input if (startsWith("http://",url) || startsWith("https://",url)) { struct hash *hash = newHash(0); int status = netUrlHead(url, hash); if (status != 200) // && status != 302 && status != 301) { warn("Error code: %d, expected 200 for %s, can't proceed, sorry", status, url); return FALSE; } char *sizeString = hashFindValUpperCase(hash, "Content-Length:"); if (sizeString) { fileSize = atoll(sizeString); } else { warn("No Content-Length: returned in header for %s, must limit to a single connection, will not know if data is complete", url); numConnections = 1; fileSize = -1; } char *ds = hashFindValUpperCase(hash, "Last-Modified:"); if (ds) dateString = cloneString(ds); hashFree(&hash); } else if (startsWith("ftp://",url)) { long long size = 0; time_t t; boolean ok = netGetFtpInfo(url, &size, &t); if (!ok) { warn("Unable to get size info from FTP for %s, can't proceed, sorry", url); return FALSE; } fileSize = size; struct tm *ts; char ftpTime[80]; /* Format the time "Tue, 15 Jun 2010 06:45:08 GMT" */ ts = localtime(&t); strftime(ftpTime, sizeof(ftpTime), "%a, %d %b %Y %H:%M:%S %Z", ts); dateString = cloneString(ftpTime); } else { warn("unrecognized protocol: %s", url); return FALSE; } verbose(2,"fileSize=%lld\n", (long long) fileSize); if (fileSize < 65536) /* special case small file */ numConnections = 1; if (numConnections > 50) /* ignore high values for numConnections */ { warn("Currently maximum number of connections is 50. You requested %d. Will proceed with 50 on %s", numConnections, url); numConnections = 50; } verbose(2,"numConnections=%d\n", numConnections); //debug if (numConnections < 1) { warn("number of connections must be greater than 0 for %s, can't proceed, sorry", url); return FALSE; } if (numRetries < 0) numRetries = 0; /* what is the size of each part */ off_t partSize = (fileSize + numConnections -1) / numConnections; if (fileSize == -1) partSize = -1; off_t base = 0; int c; verbose(2,"partSize=%lld\n", (long long) partSize); //debug /* n is the highest-numbered descriptor */ int n = 0; int connOpen = 0; int reOpen = 0; struct parallelConn *restartPcList = NULL; char *restartUrl = NULL; off_t restartFileSize = 0; char *restartDateString = ""; off_t restartTotalDownloaded = 0; boolean restartable = readParaFetchStatus(origPath, &restartPcList, &restartUrl, &restartFileSize, &restartDateString, &restartTotalDownloaded); if (fileSize == -1) restartable = FALSE; struct parallelConn *pcList = NULL, *pc; if (restartable && sameString(url, restartUrl) && fileSize == restartFileSize && sameString(dateString, restartDateString)) { pcList = restartPcList; totalDownloaded = restartTotalDownloaded; } else { if (newer) // only download it if it is newer than what we already have { /* datestamp mtime from last-modified header */ struct tm tm; // Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT // These strings are always GMT if (strptime(dateString, "%a, %d %b %Y %H:%M:%S %Z", &tm) == NULL) { warn("unable to parse last-modified string [%s]", dateString); } else { time_t t; // convert to UTC (GMT) time t = mktimeFromUtc(&tm); if (t == -1) { warn("mktimeFromUtc failed while converting last-modified string to UTC [%s]", dateString); } else { // get the file mtime struct stat mystat; ZeroVar(&mystat); if (stat(origPath,&mystat)==0) { if (t <= mystat.st_mtime) { verbose(2,"Since nothing newer was found, skipping %s\n", origPath); verbose(3,"t from last-modified = %ld; st_mtime = %ld\n", (long) t, (long)mystat.st_mtime); return TRUE; } } } } } /* make a list of connections */ for (c = 0; c < numConnections; ++c) { AllocVar(pc); pc->next = NULL; pc->rangeStart = base; base += partSize; pc->partSize = partSize; if (fileSize != -1 && pc->rangeStart+pc->partSize >= fileSize) pc->partSize = fileSize - pc->rangeStart; pc->received = 0; pc->sd = -4; /* no connection tried yet */ slAddHead(&pcList, pc); } slReverse(&pcList); } if (progress) { char nicenumber[1024]=""; sprintWithGreekByte(nicenumber, sizeof(nicenumber), fileSize); printf("downloading %s ", nicenumber); fflush(stdout); starStep = fileSize/starMax; if (starStep < 1) starStep = 1; } int out = open(outPath, O_CREAT|O_WRONLY, 0664); if (out < 0) { warn("Unable to open %s for write while downloading %s, can't proceed, sorry", url, outPath); return FALSE; } /* descriptors for select() */ fd_set rfds; struct timeval tv; int retval; ssize_t readCount = 0; #define BUFSIZE 65536 * 4 char buf[BUFSIZE]; /* create paraFetchStatus right away for monitoring programs */ writeParaFetchStatus(origPath, pcList, url, fileSize, dateString, FALSE); sinceLastStatus = 0; int retryCount = 0; time_t startTime = time(NULL); #define SELTIMEOUT 5 #define RETRYSLEEPTIME 30 while (TRUE) { verbose(2,"Top of big loop\n"); if (progress) { while (totalDownloaded >= star * starStep) { printf("*");fflush(stdout); ++star; } } /* are we done? */ if (connOpen == 0) { boolean done = TRUE; for(pc = pcList; pc; pc = pc->next) if (pc->sd != -1) done = FALSE; if (done) break; } /* See if we need to open any connections, either new or retries */ for(pc = pcList; pc; pc = pc->next) { if ((pc->sd == -4) /* never even tried to open yet */ || ((reOpen>0) /* some connections have been released */ && (pc->sd == -2 /* started but not finished */ || pc->sd == -3))) /* not even started */ { char urlExt[1024]; safef(urlExt, sizeof(urlExt), "%s;byterange=%llu-%llu" , url , (unsigned long long) (pc->rangeStart + pc->received) , (unsigned long long) (pc->rangeStart + pc->partSize - 1) ); int oldSd = pc->sd; /* in case we need to remember where we were */ if (oldSd != -4) /* decrement whether we succeed or not */ --reOpen; if (oldSd == -4) oldSd = -3; /* ok this one just changes */ if (fileSize == -1) { verbose(2,"opening url %s\n", url); pc->sd = netUrlOpen(url); } else { verbose(2,"opening url %s\n", urlExt); pc->sd = netUrlOpen(urlExt); } if (pc->sd < 0) { pc->sd = oldSd; /* failed to open, can retry later */ } else { char *newUrl = NULL; int newSd = 0; if (startsWith("http://",url) || startsWith("https://",url)) { if (!netSkipHttpHeaderLinesHandlingRedirect(pc->sd, urlExt, &newSd, &newUrl)) { warn("Error processing http response for %s", url); return FALSE; } if (newUrl) { /* Update sd with newSd, replace it with newUrl, etc. */ pc->sd = newSd; } } ++connOpen; } } } if (connOpen == 0) { warn("Unable to open any connections to download %s, can't proceed, sorry", url); return FALSE; } FD_ZERO(&rfds); n = 0; for(pc = pcList; pc; pc = pc->next) { if (pc->sd >= 0) { FD_SET(pc->sd, &rfds); /* reset descriptor in readfds for select() */ if (pc->sd > n) n = pc->sd; } } /* Wait up to SELTIMEOUT seconds. */ tv.tv_sec = SELTIMEOUT; tv.tv_usec = 0; retval = select(n+1, &rfds, NULL, NULL, &tv); /* Don't rely on the value of tv now! */ if (retval < 0) { perror("select retval < 0"); return FALSE; } else if (retval) { verbose(2,"returned from select, retval=%d\n", retval); for(pc = pcList; pc; pc = pc->next) { if ((pc->sd >= 0) && FD_ISSET(pc->sd, &rfds)) { verbose(2,"found a descriptor with data: %d\n", pc->sd); readCount = read(pc->sd, buf, BUFSIZE); verbose(2,"readCount = %lld\n", (long long) readCount); if (readCount == 0) { close(pc->sd); verbose(2,"closing descriptor: %d\n", pc->sd); pc->sd = -1; if (fileSize != -1 && pc->received != pc->partSize) { pc->sd = -2; /* conn was closed before all data was sent, can retry later */ return FALSE; } --connOpen; ++reOpen; writeParaFetchStatus(origPath, pcList, url, fileSize, dateString, FALSE); sinceLastStatus = 0; continue; } if (readCount < 0) { warn("error reading from socket for url %s", url); return FALSE; } verbose(2,"rangeStart %llu received %llu\n" , (unsigned long long) pc->rangeStart , (unsigned long long) pc->received ); verbose(2,"seeking to %llu\n", (unsigned long long) (pc->rangeStart + pc->received)); if (lseek(out, pc->rangeStart + pc->received, SEEK_SET) == -1) { perror("error seeking output file"); warn("error seeking output file %s: rangeStart %llu received %llu for url %s" , outPath , (unsigned long long) pc->rangeStart , (unsigned long long) pc->received , url); return FALSE; } int writeCount = write(out, buf, readCount); if (writeCount < 0) { warn("error writing output file %s", outPath); return FALSE; } pc->received += readCount; totalDownloaded += readCount; sinceLastStatus += readCount; if (sinceLastStatus >= 100*1024*1024) { writeParaFetchStatus(origPath, pcList, url, fileSize, dateString, FALSE); sinceLastStatus = 0; } } } } else { warn("No data within %d seconds for %s", SELTIMEOUT, url); /* Retry ? */ if (retryCount >= numRetries) { return FALSE; } else { ++retryCount; /* close any open connections */ for(pc = pcList; pc; pc = pc->next) { if (pc->sd >= 0) { close(pc->sd); verbose(2,"closing descriptor: %d\n", pc->sd); } if (pc->sd != -1) pc->sd = -4; } connOpen = 0; reOpen = 0; /* sleep for a while, maybe the server will recover */ sleep(RETRYSLEEPTIME); } } } close(out); /* delete the status file - by passing TRUE */ writeParaFetchStatus(origPath, pcList, url, fileSize, dateString, TRUE); /* restore original file datestamp mtime from last-modified header */ struct tm tm; // Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT // These strings are always GMT if (strptime(dateString, "%a, %d %b %Y %H:%M:%S %Z", &tm) == NULL) { warn("unable to parse last-modified string [%s]", dateString); } else { time_t t; // convert to UTC (GMT) time t = mktimeFromUtc(&tm); if (t == -1) { warn("mktimeFromUtc failed while converting last-modified string to UTC [%s]", dateString); } else { // update the file mtime struct utimbuf ut; struct stat mystat; ZeroVar(&mystat); if (stat(outTemp,&mystat)==0) { ut.actime = mystat.st_atime; ut.modtime = t; if (utime(outTemp, &ut)==-1) { char errMsg[256]; safef(errMsg, sizeof(errMsg), "paraFetch: error setting modification time of %s to %s\n", outTemp, dateString); perror(errMsg); } } } } /* rename the successful download to the original name */ rename(outTemp, origPath); if (progress) { while (star <= starMax) { printf("*");fflush(stdout); ++star; } long timeDiff = (long)(time(NULL) - startTime); if (timeDiff > 0) { printf(" %ld seconds", timeDiff); float mbpersec = ((totalDownloaded - restartTotalDownloaded)/1000000) / timeDiff; printf(" %0.1f MB/sec", mbpersec); } printf("\n");fflush(stdout); } if (fileSize != -1 && totalDownloaded != fileSize) { warn("Unexpected result: Total downloaded bytes %lld is not equal to fileSize %lld" , (long long) totalDownloaded , (long long) fileSize); return FALSE; } return TRUE; } struct lineFile *netLineFileOpen(char *url) /* Return a lineFile attached to url. This one * will skip any headers. Free this with * lineFileClose(). */ { struct lineFile *lf = netLineFileMayOpen(url); if (lf == NULL) noWarnAbort(); return lf; } boolean netSendString(int sd, char *s) /* Send a string down a socket - length byte first. */ { int length = strlen(s); UBYTE len; if (length > 255) errAbort("Trying to send a string longer than 255 bytes (%d bytes)", length); len = length; if (write(sd, &len, 1)<0) { warn("Couldn't send string to socket"); return FALSE; } if (write(sd, s, length)<0) { warn("Couldn't send string to socket"); return FALSE; } return TRUE; } boolean netSendLongString(int sd, char *s) /* Send a long string down socket: two bytes for length. */ { unsigned length = strlen(s); UBYTE b[2]; if (length >= 64*1024) { warn("Trying to send a string longer than 64k bytes (%d bytes)", length); return FALSE; } b[0] = (length>>8); b[1] = (length&0xff); if (write(sd, b, 2) < 0) { warn("Couldn't send long string to socket"); return FALSE; } if (write(sd, s, length)<0) { warn("Couldn't send long string to socket"); return FALSE; } return TRUE; } boolean netSendHugeString(int sd, char *s) /* Send a long string down socket: four bytes for length. */ { unsigned long length = strlen(s); unsigned long l = length; UBYTE b[4]; int i; for (i=3; i>=0; --i) { b[i] = l & 0xff; l >>= 8; } if (write(sd, b, 4) < 0) { warn("Couldn't send huge string to socket"); return FALSE; } if (write(sd, s, length) < 0) { warn("Couldn't send huge string to socket"); return FALSE; } return TRUE; } char *netGetString(int sd, char buf[256]) /* Read string into buf and return it. If buf is NULL * an internal buffer will be used. Print warning message * and return NULL if any problem. */ { static char sbuf[256]; UBYTE len = 0; int length; int sz; if (buf == NULL) buf = sbuf; sz = netReadAll(sd, &len, 1); if (sz == 0) return NULL; if (sz < 0) { warn("Couldn't read string length"); return NULL; } length = len; if (length > 0) if (netReadAll(sd, buf, length) < 0) { warn("Couldn't read string body"); return NULL; } buf[length] = 0; return buf; } char *netGetLongString(int sd) /* Read string and return it. freeMem * the result when done. */ { UBYTE b[2]; char *s = NULL; int length = 0; int sz; b[0] = b[1] = 0; sz = netReadAll(sd, b, 2); if (sz == 0) return NULL; if (sz < 0) { warn("Couldn't read long string length"); return NULL; } length = (b[0]<<8) + b[1]; s = needMem(length+1); if (length > 0) if (netReadAll(sd, s, length) < 0) { warn("Couldn't read long string body"); return NULL; } s[length] = 0; return s; } char *netGetHugeString(int sd) /* Read string and return it. freeMem * the result when done. */ { UBYTE b[4]; char *s = NULL; unsigned long length = 0; int sz, i; sz = netReadAll(sd, b, 4); if (sz == 0) return NULL; if (sz < 4) { warn("Couldn't read huge string length"); return NULL; } for (i=0; i<4; ++i) { length <<= 8; length += b[i]; } s = needMem(length+1); if (length > 0) { if (netReadAll(sd, s, length) < 0) { warn("Couldn't read huge string body"); return NULL; } } s[length] = 0; return s; } char *netRecieveString(int sd, char buf[256]) /* Read string into buf and return it. If buf is NULL * an internal buffer will be used. Abort if any problem. */ { char *s = netGetString(sd, buf); if (s == NULL) noWarnAbort(); return s; } char *netRecieveLongString(int sd) /* Read string and return it. freeMem * the result when done. Abort if any problem*/ { char *s = netGetLongString(sd); if (s == NULL) noWarnAbort(); return s; } char *netRecieveHugeString(int sd) /* Read string and return it. freeMem * the result when done. Abort if any problem*/ { char *s = netGetHugeString(sd); if (s == NULL) noWarnAbort(); return s; } struct lineFile *netHttpLineFileMayOpen(char *url, struct netParsedUrl **npu) /* Parse URL and open an HTTP socket for it but don't send a request yet. */ { int sd; struct lineFile *lf; /* Parse the URL and try to connect. */ AllocVar(*npu); netParseUrl(url, *npu); if (!sameString((*npu)->protocol, "http")) errAbort("netHttpLineFileMayOpen: url (%s) is not for http.", url); sd = netConnect((*npu)->host, atoi((*npu)->port)); if (sd < 0) return NULL; /* Return handle. */ lf = lineFileAttach(url, TRUE, sd); return lf; } /* netHttpLineFileMayOpen */ void netHttpGet(struct lineFile *lf, struct netParsedUrl *npu, boolean keepAlive) /* Send a GET request, possibly with Keep-Alive. */ { struct dyString *dy = newDyString(512); /* Ask remote server for the file/query. */ dyStringPrintf(dy, "GET %s HTTP/1.1\r\n", npu->file); dyStringPrintf(dy, "User-Agent: genome.ucsc.edu/net.c\r\n"); dyStringPrintf(dy, "Host: %s:%s\r\n", npu->host, npu->port); if (!sameString(npu->user,"")) { char up[256]; char *b64up = NULL; safef(up,sizeof(up), "%s:%s", npu->user, npu->password); b64up = base64Encode(up, strlen(up)); dyStringPrintf(dy, "Authorization: Basic %s\r\n", b64up); freez(&b64up); } dyStringAppend(dy, "Accept: */*\r\n"); if (keepAlive) { dyStringAppend(dy, "Connection: Keep-Alive\r\n"); dyStringAppend(dy, "Connection: Persist\r\n"); } else dyStringAppend(dy, "Connection: close\r\n"); dyStringAppend(dy, "\r\n"); mustWriteFd(lf->fd, dy->string, dy->stringSize); /* Clean up. */ dyStringFree(&dy); } /* netHttpGet */ int netHttpGetMultiple(char *url, struct slName *queries, void *userData, void (*responseCB)(void *userData, char *req, char *hdr, struct dyString *body)) /* Given an URL which is the base of all requests to be made, and a * linked list of queries to be appended to that base and sent in as * requests, send the requests as a batch and read the HTTP response * headers and bodies. If not all the requests get responses (i.e. if * the server is ignoring Keep-Alive or is imposing a limit), try again * until we can't connect or until all requests have been served. * For each HTTP response, do a callback. */ { struct slName *qStart; struct slName *qPtr; struct lineFile *lf; struct netParsedUrl *npu; struct dyString *dyQ = newDyString(512); struct dyString *body; char *base; char *hdr; int qCount; int qTotal; int numParseFailures; int contentLength; boolean chunked; boolean done; boolean keepAlive; /* Find out how many queries we'll need to do so we know how many times * it's OK to run into end of file in case server ignores Keep-Alive. */ qTotal = 0; for (qPtr = queries; qPtr != NULL; qPtr = qPtr->next) { qTotal++; } done = FALSE; qCount = 0; numParseFailures = 0; qStart = queries; while ((! done) && (qStart != NULL)) { lf = netHttpLineFileMayOpen(url, &npu); if (lf == NULL) { done = TRUE; break; } base = cloneString(npu->file); /* Send all remaining requests with keep-alive. */ for (qPtr = qStart; qPtr != NULL; qPtr = qPtr->next) { dyStringClear(dyQ); dyStringAppend(dyQ, base); dyStringAppend(dyQ, qPtr->name); strcpy(npu->file, dyQ->string); keepAlive = (qPtr->next == NULL) ? FALSE : TRUE; netHttpGet(lf, npu, keepAlive); } /* Get as many responses as we can; call responseCB() and * advance qStart for each. */ for (qPtr = qStart; qPtr != NULL; qPtr = qPtr->next) { if (lineFileParseHttpHeader(lf, &hdr, &chunked, &contentLength)) { body = lineFileSlurpHttpBody(lf, chunked, contentLength); dyStringClear(dyQ); dyStringAppend(dyQ, base); dyStringAppend(dyQ, qPtr->name); responseCB(userData, dyQ->string, hdr, body); qStart = qStart->next; qCount++; } else { if (numParseFailures++ > qTotal) { done = TRUE; } break; } } } return qCount; } /* netHttpMultipleQueries */ #endif rtracklayer/src/ucsc/net.h0000644000126300012640000002404512227135242017150 0ustar00biocbuildphs_compbio/* Net.h some stuff to wrap around net communications. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef NET_H #define NET_H #include "linefile.h" #include "dystring.h" int netConnect(char *hostName, int port); /* Start connection with a server having resolved port. Return < 0 if error. */ int netMustConnect(char *hostName, int port); /* Start connection with server or die. */ int netMustConnectTo(char *hostName, char *portName); /* Start connection with a server and a port that needs to be converted to integer */ int netAcceptingSocket(int port, int queueSize); /* Create a socket for to accept connections. */ int netAcceptingSocketFrom(int port, int queueSize, char *host); /* Create a socket that can accept connections from a * IP address on the current machine if the current machine * has multiple IP addresses. */ int netAccept(int sd); /* Accept incoming connection from socket descriptor. */ int netAcceptFrom(int sd, unsigned char subnet[4]); /* Wait for incoming connection from socket descriptor * from IP address in subnet. Subnet is something * returned from netParseDottedQuad. */ FILE *netFileFromSocket(int socket); /* Wrap a FILE around socket. This should be fclose'd * and separately the socket close'd. */ void netBlockBrokenPipes(); /* Make it so a broken pipe doesn't kill us. */ size_t netReadAll(int sd, void *vBuf, size_t size); /* Read given number of bytes into buffer. * Don't give up on first read! */ int netMustReadAll(int sd, void *vBuf, size_t size); /* Read given number of bytes into buffer or die. * Don't give up if first read is short! */ boolean netSendString(int sd, char *s); /* Send a string down a socket - length byte first. */ boolean netSendLongString(int sd, char *s); /* Send a string down a socket - up to 64k characters. */ boolean netSendHugeString(int sd, char *s); /* Send a string down a socket - up to 4G characters. */ char *netRecieveString(int sd, char buf[256]); /* Read string into buf and return it. If buf is NULL * an internal buffer will be used. Abort if any problem. */ char *netRecieveLongString(int sd); /* Read string up to 64k and return it. freeMem * the result when done. Abort if any problem*/ char *netRecieveHugeString(int sd); /* Read string up to 4G and return it. freeMem * the result when done. Abort if any problem*/ char *netGetString(int sd, char buf[256]); /* Read string into buf and return it. If buf is NULL * an internal buffer will be used. Print warning message * and return NULL if any problem. */ char *netGetLongString(int sd); /* Read string up to 64k and return it. freeMem * the result when done. Print warning message and * return NULL if any problem. */ char *netGetHugeString(int sd); /* Read string up to 4 gig and return it. freeMem * the result when done. Print warning message and * return NULL if any problem. */ void netCatchPipes(); /* Set up to catch broken pipe signals. */ boolean netPipeIsBroken(); /* Return TRUE if pipe is broken */ void netClearPipeFlag(); /* Clear broken pipe flag. */ void netParseSubnet(char *in, unsigned char out[4]); /* Parse subnet, which is a prefix of a normal dotted quad form. * Out will contain 255's for the don't care bits. */ struct netParsedUrl /* A parsed URL. */ { char protocol[16]; /* Protocol - http or ftp, etc. */ char user[128]; /* User name (optional) */ char password[128]; /* Password (optional) */ char host[128]; /* Name of host computer - www.yahoo.com, etc. */ char port[16]; /* Port, usually 80 or 8080. */ char file[1024]; /* Remote file name/query string, starts with '/' */ ssize_t byteRangeStart; /* Start of byte range, use -1 for none */ ssize_t byteRangeEnd; /* End of byte range use -1 for none */ }; void netParseUrl(char *url, struct netParsedUrl *parsed); /* Parse a URL into components. A full URL is made up as so: * http://user:password@hostName:port/file;byterange=0-499 * User and password may be cgi-encoded. * This is set up so that the http:// and the port are optional. */ char *urlFromNetParsedUrl(struct netParsedUrl *npu); /* Build URL from netParsedUrl structure */ int netUrlOpen(char *url); /* Return socket descriptor (low-level file handle) for read()ing url data, * or -1 if error. Just close(result) when done. */ int netUrlOpenSockets(char *url, int *retCtrlSocket); /* Return socket descriptor (low-level file handle) for read()ing url data, * or -1 if error. * If retCtrlSocket is non-NULL and url is FTP, set *retCtrlSocket * to the FTP control socket which is left open for a persistent connection. * close(result) (and close(*retCtrlSocket) if applicable) when done. */ struct hash; int netUrlHeadExt(char *url, char *method, struct hash *hash); /* Go get head and return status. Return negative number if * can't get head. If hash is non-null, fill it with header * lines with upper cased keywords for case-insensitive lookup, * including hopefully CONTENT-TYPE: . */ int netUrlHead(char *url, struct hash *hash); /* Go get head and return status. Return negative number if * can't get head. If hash is non-null, fill it with header * lines with upper cased keywords for case-insensitive lookup, * including hopefully CONTENT-TYPE: . */ long long netUrlSizeByRangeResponse(char *url); /* Use byteRange as a work-around alternate method to get file size (content-length). * Return negative number if can't get. */ struct lineFile *netLineFileOpen(char *url); /* Return a lineFile attached to url. This one * will skip any headers. Free this with * lineFileClose(). */ struct lineFile *netLineFileMayOpen(char *url); /* Same as netLineFileOpen, but warns and returns * null rather than aborting on problems. */ struct lineFile *netLineFileSilentOpen(char *url); /* Open a lineFile on a URL. Just return NULL without any user * visible warning message if there's a problem. */ struct dyString *netSlurpFile(int sd); /* Slurp file into dynamic string and return. Result will include http headers and * the like. */ struct dyString *netSlurpUrl(char *url); /* Go grab all of URL and return it as dynamic string. Result will include http headers * and the like. This will errAbort if there's a problem. */ char *netReadTextFileIfExists(char *url); /* Read entire URL and return it as a string. URL should be text (embedded zeros will be * interpreted as end of string). If the url doesn't exist or has other problems, * returns NULL. Does *not* include http headers. */ struct lineFile *netHttpLineFileMayOpen(char *url, struct netParsedUrl **npu); /* Parse URL and open an HTTP socket for it but don't send a request yet. */ void netHttpGet(struct lineFile *lf, struct netParsedUrl *npu, boolean keepAlive); /* Send a GET request, possibly with Keep-Alive. */ int netOpenHttpExt(char *url, char *method, char *optionalHeader); /* Return a file handle that will read the url. optionalHeader * may by NULL or may contain cookies and other info. */ int netHttpConnect(char *url, char *method, char *protocol, char *agent, char *optionalHeader); /* Parse URL, connect to associated server on port, and send most of * the request to the server. If specified in the url send user name * and password too. Typically the "method" will be "GET" or "POST" * and the agent will be the name of your program or * library. optionalHeader may be NULL or contain additional header * lines such as cookie info. * Proxy support via hg.conf httpProxy or env var http_proxy * Return data socket, or -1 if error.*/ int netHttpGetMultiple(char *url, struct slName *queries, void *userData, void (*responseCB)(void *userData, char *req, char *hdr, struct dyString *body)); /* Given an URL which is the base of all requests to be made, and a * linked list of queries to be appended to that base and sent in as * requests, send the requests as a batch and read the HTTP response * headers and bodies. If not all the requests get responses (i.e. if * the server is ignoring Keep-Alive or is imposing a limit), try again * until we can't connect or until all requests have been served. * For each HTTP response, do a callback. */ boolean netSkipHttpHeaderLinesWithRedirect(int sd, char *url, char **redirectedUrl); /* Skip http header lines. Return FALSE if there's a problem. * The input is a standard sd or fd descriptor. * This is meant to be able work even with a re-passable stream handle, * e.g. can pass it to the pipes routines, which means we can't * attach a linefile since filling its buffer reads in more than just the http header. * Handles 300, 301, 302, 303, 307 http redirects by setting *redirectedUrl to * the new location. */ boolean netSkipHttpHeaderLinesHandlingRedirect(int sd, char *url, int *redirectedSd, char **redirectedUrl); /* Skip http headers lines, returning FALSE if there is a problem. Generally called as * netSkipHttpHeaderLine(sd, url, &sd, &url); * where sd is a socket (file) opened with netUrlOpen(url), and url is in dynamic memory. * If the http header indicates that the file has moved, then it will update the *redirectedSd and * *redirectedUrl with the new socket and URL, first closing sd. * If for some reason you want to detect whether the forwarding has occurred you could * call this as: * char *newUrl = NULL; * int newSd = 0; * netSkipHttpHeaderLine(sd, url, &newSd, &newUrl); * if (newUrl != NULL) * // Update sd with newSd, free url if appropriate and replace it with newUrl, etc. * // free newUrl when finished. * This routine handles up to 5 steps of redirection. * The logic to this routine is also complicated a little to make it work in a pipe, which means we * can't attach a lineFile since filling the lineFile buffer reads in more than just the http header. */ boolean netGetFtpInfo(char *url, long long *retSize, time_t *retTime); /* Return date in UTC and size of ftp url file */ boolean parallelFetch(char *url, char *outPath, int numConnections, int numRetries, boolean newer, boolean progress); /* Open multiple parallel connections to URL to speed downloading */ #endif /* NET_H */ rtracklayer/src/ucsc/obscure.c0000644000126300012640000004003112227135242020010 0ustar00biocbuildphs_compbio/* Obscure stuff that is handy every now and again. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include #include "portable.h" #include "localmem.h" #include "hash.h" #include "obscure.h" #include "linefile.h" static char const rcsid[] = "$Id: obscure.c,v 1.53 2010/01/27 21:04:04 galt Exp $"; static int _dotForUserMod = 100; /* How often does dotForUser() output a dot. */ long incCounterFile(char *fileName) /* Increment a 32 bit value on disk. */ { long val = 0; FILE *f = fopen(fileName, "r+b"); if (f != NULL) { mustReadOne(f, val); rewind(f); } else { f = fopen(fileName, "wb"); } ++val; if (f != NULL) { fwrite(&val, sizeof(val), 1, f); if (fclose(f) != 0) errnoAbort("fclose failed"); } return val; } int digitsBaseTwo(unsigned long x) /* Return base two # of digits. */ { int digits = 0; while (x) { digits += 1; x >>= 1; } return digits; } int digitsBaseTen(int x) /* Return number of digits base 10. */ { int digCount = 1; if (x < 0) { digCount = 2; x = -x; } while (x >= 10) { digCount += 1; x /= 10; } return digCount; } void writeGulp(char *file, char *buf, int size) /* Write out a bunch of memory. */ { FILE *f = mustOpen(file, "w"); mustWrite(f, buf, size); carefulClose(&f); } void readInGulp(char *fileName, char **retBuf, size_t *retSize) /* Read whole file in one big gulp. */ { size_t size = (size_t)fileSize(fileName); char *buf; FILE *f = mustOpen(fileName, "rb"); *retBuf = buf = needLargeMem(size+1); mustRead(f, buf, size); buf[size] = 0; /* Just in case it needs zero termination. */ fclose(f); if (retSize != NULL) *retSize = size; } void readAllWords(char *fileName, char ***retWords, int *retWordCount, char **retBuf) /* Read in whole file and break it into words. You need to freeMem both * *retWordCount and *retBuf when done. */ { int wordCount; char *buf = NULL; char **words = NULL; size_t bufSize; readInGulp(fileName, &buf, &bufSize); wordCount = chopByWhite(buf, NULL, 0); if (wordCount != 0) { words = needMem(wordCount * sizeof(words[0])); chopByWhite(buf, words, wordCount); } *retWords = words; *retWordCount = wordCount; *retBuf = buf; } int countWordsInFile(char *fileName) /* Count number of words in file. */ { struct lineFile *lf = lineFileOpen(fileName, TRUE); char *line; int wordCount = 0; while (lineFileNext(lf, &line, NULL)) wordCount += chopByWhite(line, NULL, 0); lineFileClose(&lf); return wordCount; } struct hash *hashWordsInFile(char *fileName, int hashSize) /* Create a hash of space delimited words in file. */ { struct hash *hash = newHash(hashSize); struct lineFile *lf = lineFileOpen(fileName, TRUE); char *line, *word; while (lineFileNext(lf, &line, NULL)) { while ((word = nextWord(&line)) != NULL) hashAdd(hash, word, NULL); } lineFileClose(&lf); return hash; } struct hash *hashNameIntFile(char *fileName) /* Given a two column file (name, integer value) return a * hash keyed by name with integer values */ { struct lineFile *lf = lineFileOpen(fileName, TRUE); char *row[2]; struct hash *hash = hashNew(16); while (lineFileRow(lf, row)) hashAddInt(hash, row[0], lineFileNeedNum(lf, row, 1)); lineFileClose(&lf); return hash; } struct hash *hashTwoColumnFile(char *fileName) /* Given a two column file (key, value) return a hash. */ { struct lineFile *lf = lineFileOpen(fileName, TRUE); char *row[2]; struct hash *hash = hashNew(16); while (lineFileRow(lf, row)) { char *name = row[0]; char *value = lmCloneString(hash->lm, row[1]); hashAdd(hash, name, value); } lineFileClose(&lf); return hash; } struct slName *readAllLines(char *fileName) /* Read all lines of file into a list. (Removes trailing carriage return.) */ { struct lineFile *lf = lineFileOpen(fileName, TRUE); struct slName *list = NULL, *el; char *line; while (lineFileNext(lf, &line, NULL)) { el = newSlName(line); slAddHead(&list, el); } slReverse(&list); return list; } void copyFile(char *source, char *dest) /* Copy file from source to dest. */ { int bufSize = 64*1024; char *buf = needMem(bufSize); int bytesRead; int s, d; s = open(source, O_RDONLY); if (s < 0) errAbort("Couldn't open %s. %s\n", source, strerror(errno)); d = creat(dest, 0777); if (d < 0) { close(s); errAbort("Couldn't open %s. %s\n", dest, strerror(errno)); } while ((bytesRead = read(s, buf, bufSize)) > 0) { if (write(d, buf, bytesRead) < 0) errAbort("Write error on %s. %s\n", dest, strerror(errno)); } close(s); if (close(d) != 0) errnoAbort("close failed"); freeMem(buf); } void copyOpenFile(FILE *inFh, FILE *outFh) /* copy an open stdio file */ { int c; while ((c = fgetc(inFh)) != EOF) fputc(c, outFh); if (ferror(inFh)) errnoAbort("file read failed"); if (ferror(outFh)) errnoAbort("file write failed"); } void cpFile(int s, int d) /* Copy from source file to dest until reach end of file. */ { int bufSize = 64*1024, readSize; char *buf = needMem(bufSize); for (;;) { readSize = read(s, buf, bufSize); if (readSize > 0) mustWriteFd(d, buf, readSize); if (readSize <= 0) break; } freeMem(buf); } void *intToPt(int i) /* Convert integer to pointer. Use when really want to store an * int in a pointer field. */ { char *pt = NULL; return pt+i; } int ptToInt(void *pt) /* Convert pointer to integer. Use when really want to store a * pointer in an int. */ { char *a = NULL, *b = pt; return b - a; } void *sizetToPt(size_t i) /* Convert size_t to pointer. Use when really want to store a * size_t in a pointer. */ { char *pt = NULL; return pt+i; } size_t ptToSizet(void *pt) /* Convert pointer to size_t. Use when really want to store a * pointer in a size_t. */ { char *a = NULL, *b = pt; return b - a; } boolean parseQuotedStringNoEscapes( char *in, char *out, char **retNext) /* Read quoted string from in (which should begin with first quote). * Write unquoted string to out, which may be the same as in. * Return pointer to character past end of string in *retNext. * Return FALSE if can't find end. * Unlike parseQuotedString() do not treat backslash as an escape * character, merely pass it on through. */ { char c, *s = in; int quoteChar = *s++; for (;;) { c = *s++; if (c == 0) { warn("Unmatched %c", quoteChar); return FALSE; } else if (c == quoteChar) break; else *out++ = c; } *out = 0; if (retNext != NULL) *retNext = s; return TRUE; } boolean parseQuotedString( char *in, char *out, char **retNext) /* Read quoted string from in (which should begin with first quote). * Write unquoted string to out, which may be the same as in. * Return pointer to character past end of string in *retNext. * Return FALSE if can't find end. */ { char c, *s = in; int quoteChar = *s++; boolean escaped = FALSE; for (;;) { c = *s++; if (c == 0) { warn("Unmatched %c", quoteChar); return FALSE; } if (escaped) { if (c == '\\' || c == quoteChar) *out++ = c; else { *out++ = '\\'; *out++ = c; } escaped = FALSE; } else { if (c == '\\') escaped = TRUE; else if (c == quoteChar) break; else *out++ = c; } } *out = 0; if (retNext != NULL) *retNext = s; return TRUE; } char *nextQuotedWord(char **pLine) /* Generalization of nextWord. Returns next quoted * string or if no quotes next word. Updates *pLine * to point past word that is returned. Does not return * quotes. */ { char *line, c; line = skipLeadingSpaces(*pLine); if (line == NULL || line[0] == 0) return NULL; c = *line; if (c == '"' || c == '\'') { if (!parseQuotedString(line, line, pLine)) return NULL; return line; } else { return nextWord(pLine); } } void escCopy(char *in, char *out, char toEscape, char escape) /* Copy in to out, escaping as needed. Out better be big enough. * (Worst case is strlen(in)*2 + 1.) */ { char c; for (;;) { c = *in++; if (c == toEscape) *out++ = escape; *out++ = c; if (c == 0) break; } } char *makeEscapedString(char *in, char toEscape) /* Return string that is a copy of in, but with all * toEscape characters preceded by '\' * When done freeMem result. */ { int newSize = strlen(in) + countChars(in, toEscape); char *out = needMem(newSize+1); escCopy(in, out, toEscape, '\\'); return out; } char *makeQuotedString(char *in, char quoteChar) /* Create a string surrounded by quoteChar, with internal * quoteChars escaped. freeMem result when done. */ { int newSize = 2 + strlen(in) + countChars(in, quoteChar); char *out = needMem(newSize+1); out[0] = quoteChar; escCopy(in, out+1, quoteChar, '\\'); out[newSize-1] = quoteChar; return out; } struct hash *hashThisEqThatLine(char *line, int lineIx, boolean firstStartsWithLetter) /* Return a symbol table from a line of form: * 1-this1=val1 2-this='quoted val2' var3="another val" * If firstStartsWithLetter is true, then the left side of the equals must start with * and equals. */ { char *dupe = cloneString(line); char *s = dupe, c; char *var, *val; struct hash *hash = newHash(8); for (;;) { if ((var = skipLeadingSpaces(s)) == NULL) break; if ((c = *var) == 0) break; if (firstStartsWithLetter && !isalpha(c)) errAbort("line %d of custom input: variable needs to start with letter '%s'", lineIx, var); val = strchr(var, '='); if (val == NULL) { errAbort("line %d of var %s in custom input: %s \n missing = in var/val pair", lineIx, var, line); } *val++ = 0; c = *val; if (c == '\'' || c == '"') { if (!parseQuotedString(val, val, &s)) errAbort("line %d of input: missing closing %c", lineIx, c); } else { s = skipToSpaces(val); if (s != NULL) *s++ = 0; } hashAdd(hash, var, cloneString(val)); } freez(&dupe); return hash; } struct hash *hashVarLine(char *line, int lineIx) /* Return a symbol table from a line of form: * var1=val1 var2='quoted val2' var3="another val" */ { return hashThisEqThatLine(line, lineIx, TRUE); } struct slName *stringToSlNames(char *string) /* Convert string to a list of slNames separated by * white space, but allowing multiple words in quotes. * Quotes if any are stripped. */ { struct slName *list = NULL, *name; char *dupe = cloneString(string); char c, *s = dupe, *e; for (;;) { if ((s = skipLeadingSpaces(s)) == NULL) break; if ((c = *s) == 0) break; if (c == '\'' || c == '"') { if (!parseQuotedString(s, s, &e)) errAbort("missing closing %c in %s", c, string); } else { e = skipToSpaces(s); if (e != NULL) *e++ = 0; } name = slNameNew(s); slAddHead(&list, name); s = e; } freeMem(dupe); slReverse(&list); return list; } struct slName *charSepToSlNames(char *string, char c) /* Convert character-separated list of items to slName list. * Note that the last occurence of c is optional. (That * is for a comma-separated list a,b,c and a,b,c, are * equivalent. */ { struct slName *list = NULL, *el; char *s, *e; s = string; while (s != NULL && s[0] != 0) { e = strchr(s, c); if (e == NULL) { el = slNameNew(s); slAddHead(&list, el); break; } else { el = slNameNewN(s, e - s); slAddHead(&list, el); s = e+1; } } slReverse(&list); return list; } struct slName *commaSepToSlNames(char *commaSep) /* Convert comma-separated list of items to slName list. */ { return charSepToSlNames(commaSep, ','); } void sprintLongWithCommas(char *s, long long l) /* Print out a long number with commas a thousands, millions, etc. */ { long long billions, millions, thousands; if (l >= 1000000000) { billions = l/1000000000; l -= billions * 1000000000; millions = l/1000000; l -= millions * 1000000; thousands = l/1000; l -= thousands * 1000; sprintf(s, "%lld,%03lld,%03lld,%03lld", billions, millions, thousands, l); } else if (l >= 1000000) { millions = l/1000000; l -= millions * (long long)1000000; thousands = l/1000; l -= thousands * 1000; sprintf(s, "%lld,%03lld,%03lld", millions, thousands, l); } else if (l >= 1000) { thousands = l/1000; l -= thousands * 1000; sprintf(s, "%lld,%03lld", thousands, l); } else sprintf(s, "%lld", l); } void printLongWithCommas(FILE *f, long long l) /* Print out a long number with commas at thousands, millions, etc. */ { char ascii[32]; sprintLongWithCommas(ascii, l); fprintf(f, "%s", ascii); } void sprintWithGreekByte(char *s, int slength, long long size) /* Numbers formatted with PB, TB, GB, MB, KB, B */ { char *greek[] = {"B", "KB", "MB", "GB", "TB", "PB"}; int i = 0; long long d = 1; while ((size/d) >= 1024) { ++i; d *= 1024; } double result = ((double)size)/d; if (result < 10) safef(s,slength,"%3.1f %s",((double)size)/d, greek[i]); else safef(s,slength,"%3.0f %s",((double)size)/d, greek[i]); } void shuffleArrayOfPointers(void *pointerArray, int arraySize, int shuffleCount) /* Shuffle array of pointers of given size given number of times. */ { void **array = pointerArray, *pt; int i, randIx; /* Randomly permute an array using the method from Cormen, et al */ for (i=0; i 1) { struct slList *el; struct slList **array; int i; array = needLargeMem(count * sizeof(*array)); for (el = list, i=0; el != NULL; el = el->next, i++) array[i] = el; for (i=0; i<4; ++i) shuffleArrayOfPointers(array, count, shuffleCount); list = NULL; for (i=0; inext = list; list = array[i]; } freeMem(array); slReverse(&list); *pL = list; } } char *stripCommas(char *position) /* make a new string with commas stripped out */ { char *newPos = cloneString(position); char *nPtr = newPos; if (position == NULL) return NULL; while((*nPtr = *position++)) if (*nPtr != ',') nPtr++; return newPos; } void dotForUserInit(int dotMod) /* Set how often dotForUser() outputs a dot. */ { assert(dotMod > 0); _dotForUserMod = dotMod; } void dotForUser() /* Write out a dot every _dotForUserMod times this is called. */ { static int dot = -10; /* Check to see if dot has been initialized. */ if(dot == - 10) dot = _dotForUserMod; if (--dot <= 0) { putc('.', stderr); fflush(stderr); dot = _dotForUserMod; } } void spaceToUnderbar(char *s) /* Convert white space to underbar. */ { char c; while ((c = *s) != 0) { if (isspace(c)) *s = '_'; ++s; } } void printVmPeak() /* print to stderr peak Vm memory usage (if /proc/ business exists) */ { pid_t pid = getpid(); char temp[256]; safef(temp, sizeof(temp), "/proc/%d/status", (int) pid); struct lineFile *lf = lineFileMayOpen(temp, TRUE); if (lf) { char *line; while (lineFileNextReal(lf, &line)) { if (stringIn("VmPeak", line)) { fprintf(stderr, "# pid=%d: %s\n", pid, line); break; } } lineFileClose(&lf); } else fprintf(stderr, "# printVmPeak: %s - not available\n", temp); fflush(stderr); } boolean nameInCommaList(char *name, char *commaList) /* Return TRUE if name is in comma separated list. */ { if (commaList == NULL) return FALSE; int nameLen = strlen(name); for (;;) { char c = *commaList; if (c == 0) return FALSE; if (memcmp(name, commaList, nameLen) == 0) { c = commaList[nameLen]; if (c == 0 || c == ',') return TRUE; } commaList = strchr(commaList, ','); if (commaList == NULL) return FALSE; commaList += 1; } } rtracklayer/src/ucsc/obscure.h0000644000126300012640000001425512227135242020026 0ustar00biocbuildphs_compbio/* Obscure.h - stuff that's relatively rarely used * but still handy. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef OBSCURE_H #define OBSCURE_H long incCounterFile(char *fileName); /* Increment a 32 bit value on disk. */ int digitsBaseTwo(unsigned long x); /* Return base two # of digits. */ int digitsBaseTen(int x); /* Return number of digits base 10. */ void sprintLongWithCommas(char *s, long long l); /* Print out a long number with commas a thousands, millions, etc. */ void printLongWithCommas(FILE *f, long long l); /* Print out a long number with commas a thousands, millions, etc. */ void sprintWithGreekByte(char *s, int slength, long long size); /* Numbers formatted with PB, TB, GB, MB, KB, B */ void writeGulp(char *file, char *buf, int size); /* Write out a bunch of memory. */ void readInGulp(char *fileName, char **retBuf, size_t *retSize); /* Read whole file in one big gulp. */ void readAllWords(char *fileName, char ***retWords, int *retWordCount, char **retBuf); /* Read in whole file and break it into words. You need to freeMem both * *retWordCount and *retBuf when done. */ int countWordsInFile(char *fileName); /* Count number of words in file. */ struct slName *readAllLines(char *fileName); /* Read all lines of file into a list. (Removes trailing carriage return.) */ void copyFile(char *source, char *dest); /* Copy file from source to dest. */ void copyOpenFile(FILE *inFh, FILE *outFh); /* copy an open stdio file */ void cpFile(int s, int d); /* Copy from source file to dest until reach end of file. */ void *intToPt(int i); /* Convert integer to pointer. Use when really want to store an * int in a pointer field. */ int ptToInt(void *pt); /* Convert pointer to integer. Use when really want to store a * pointer in an int. */ void *sizetToPt(size_t i); /* Convert size_t to pointer. Use when really want to store a * size_t in a pointer. */ size_t ptToSizet(void *pt); /* Convert pointer to size_t. Use when really want to store a * pointer in a size_t. */ boolean parseQuotedStringNoEscapes( char *in, char *out, char **retNext); /* Read quoted string from in (which should begin with first quote). * Write unquoted string to out, which may be the same as in. * Return pointer to character past end of string in *retNext. * Return FALSE if can't find end. * Unlike parseQuotedString() do not treat backslash as an escape * character, merely pass it on through. */ boolean parseQuotedString( char *in, char *out, char **retNext); /* Read quoted string from in (which should begin with first quote). * Write unquoted string to out, which may be the same as in. * Return pointer to character past end of string in *retNext. * Return FALSE if can't find end. */ char *nextQuotedWord(char **pLine); /* Generalization of nextWord. Returns next quoted * string or if no quotes next word. Updates *pLine * to point past word that is returned. Does not return * quotes. */ char *makeQuotedString(char *in, char quoteChar); /* Create a string surrounded by quoteChar, with internal * quoteChars escaped. freeMem result when done. */ char *makeEscapedString(char *in, char toEscape); /* Return string that is a copy of in, but with all * toEscape characters preceded by '\' * When done freeMem result. */ void escCopy(char *in, char *out, char toEscape, char escape); /* Copy in to out, escaping as needed. Out better be big enough. * (Worst case is strlen(in)*2 + 1.) */ struct slName *stringToSlNames(char *string); /* Convert string to a list of slNames separated by * white space, but allowing multiple words in quotes. * Quotes if any are stripped. */ struct slName *commaSepToSlNames(char *commaSep); /* Convert comma-separated list of items to slName list. */ struct slName *charSepToSlNames(char *string, char c); /* Convert character-separated list of items to slName list. * Note that the last occurence of c is optional. (That * is for a comma-separated list a,b,c and a,b,c, are * equivalent. */ struct hash *hashVarLine(char *line, int lineIx); /* Return a symbol table from a line of form: * var1=val1 var2='quoted val2' var3="another val" */ struct hash *hashThisEqThatLine(char *line, int lineIx, boolean firstStartsWithLetter); /* Return a symbol table from a line of form: * 1-this1=val1 2-this='quoted val2' var3="another val" * If firstStartsWithLetter is true, then the left side of the equals must start with * and equals. */ struct hash *hashWordsInFile(char *fileName, int hashSize); /* Create a hash of space delimited words in file. * hashSize is as in hashNew() - pass 0 for default. */ struct hash *hashNameIntFile(char *fileName); /* Given a two column file (name, integer value) return a * hash keyed by name with integer values */ struct hash *hashTwoColumnFile(char *fileName); /* Given a two column file (key, value) return a hash. */ void shuffleArrayOfPointers(void *pointerArray, int arraySize, int shuffleCount); /* Shuffle array of pointers of given size given number of times. */ void shuffleList(void *pList, int shuffleCount); /* Randomize order of slList. Usage: * shuffleList(&list) * where list is a pointer to a structure that * begins with a next field. */ char *stripCommas(char *position); /* make a new string with commas stripped out */ void dotForUserInit(int dotMod); /* Set how often dotForUser() outputs a dot. */ void dotForUser(); /* Write out a dot every _dotForUserMod times this is called. */ void spaceToUnderbar(char *s); /* Convert white space to underbar. */ void rangeRoundUp(double start, double end, double *retStart, double *retEnd); /* Round start and end so that they cover a slightly bigger range, but with more round * numbers. For instance 0.23:9.89 becomes 0:10 */ void rangeFromMinMaxMeanStd(double minVal, double maxVal, double mean, double std, double *retStart, double *retEnd); /* Given some basic statistical properties, set a range that will be good on a wide * range of biological data. */ void printVmPeak(); /* print to stderr peak Vm memory usage (if /proc/ business exists) */ boolean nameInCommaList(char *name, char *commaList); /* Return TRUE if name is in comma separated list. */ #endif /* OBSCURE_H */ rtracklayer/src/ucsc/options.h0000644000126300012640000000653112227135242020055 0ustar00biocbuildphs_compbio/* Stuff to process options out of command line. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef OPTIONS_H /* Types for options */ #define OPTION_BOOLEAN 0x01 #define OPTION_STRING 0x02 #define OPTION_INT 0x04 #define OPTION_FLOAT 0x10 #define OPTION_LONG_LONG 0x20 #define OPTION_MULTI 0x40 #define OPTION_DOUBLE 0x80 struct optionSpec /* Specification of a single option. An array of these are passed * to optionInit() to validate options. */ { char *name; /* option name */ unsigned flags; /* Flags for option, specifies types */ }; char *optionVal(char *name, char *defaultVal); /* Return named option if in options hash, otherwise default. */ int optionInt(char *name, int defaultVal); /* Return integer value of named option, or default value * if not set. */ long long optionLongLong(char *name, long long defaultVal); /* Return long long value of named option, or default value * if not set. */ float optionFloat(char *name, float defaultVal); /* Return floating point value or default value if not set. */ struct slName *optionMultiVal(char *name, struct slName *defaultVal); /* Returns a list of the values assocated with a named option if in options hash, otherwise default. */ double optionDouble(char *name, double defaultVal); /* Return double value or default value if not set */ boolean optionExists(char *name); /* Return TRUE if option has been set. */ void optionMustExist(char *name); /* Abort if option has not been set. */ void optionInit(int *pArgc, char *argv[], struct optionSpec *optionSpecs); /* Read options in command line into options hash. * Options come in three forms: * -option words starting with dash * option=val words with = in the middle * -option=val combining the two. * The resulting hash will be keyed by the option name with the val * string for value. For '-option' types the value is 'on'. * The words in argv are parsed in assending order. If a word of * "--" is encountered, argument parsing stops. * If optionSpecs is not NULL, it is an array of optionSpec that are * used to validate the options. An option must exist in the array * and the value must be convertable to the type specified in flags. * Boolean options have must no value, all other options must have one. * Array is terminated by a optionSpec with a NULL name. * If array NULL, no validation is done. */ void optionHash(int *pArgc, char *argv[]); /* Read options in command line into options hash. * Options come in three forms: * -option words starting with dash * option=val words with = in the middle * -option=val combining the two. * The resulting hash will be keyed by the option name with the val * string for value. For '-option' types the value is 'on'. * The words in argv are parsed in assending order. If a word of * "--" is encountered, argument parsing stops. */ void optionHashSome(int *pArgc, char *argv[], boolean justFirst); /* Set up option hash from command line, optionally only adding * up to first non-optional word. */ struct hash *optionParseIntoHash(int *pArgc, char *argv[], boolean justFirst); /* Read options in argc/argv into a hash of your own choosing. */ void optionFree(); /* free the option hash */ #endif /* OPTIONS_H */ rtracklayer/src/ucsc/os.c0000644000126300012640000000017412227135242016773 0ustar00biocbuildphs_compbio/* Added by rtracklayer to condition on the platform */ #ifdef WIN32 #include "oswin9x.c" #else #include "osunix.c" #endif rtracklayer/src/ucsc/osunix.c0000644000126300012640000003511012227135242017675 0ustar00biocbuildphs_compbio/* Some wrappers around operating-system specific stuff. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include #include #include #include #include #include "portable.h" #include "portimpl.h" #include "_portimpl.h" #include #include #include static char const rcsid[] = "$Id: osunix.c,v 1.48 2010/06/03 05:14:39 kent Exp $"; off_t fileSize(char *pathname) /* get file size for pathname. return -1 if not found */ { struct stat mystat; ZeroVar(&mystat); if (stat(pathname,&mystat)==-1) { return -1; } return mystat.st_size; } long clock1000() /* A millisecond clock. */ { struct timeval tv; static long origSec; gettimeofday(&tv, NULL); if (origSec == 0) origSec = tv.tv_sec; return (tv.tv_sec-origSec)*1000 + tv.tv_usec / 1000; } void sleep1000(int milli) /* Sleep for given number of 1000ths of second */ { if (milli > 0) { struct timeval tv; tv.tv_sec = milli/1000; tv.tv_usec = (milli%1000)*1000; select(0, NULL, NULL, NULL, &tv); } } long clock1() /* A seconds clock. */ { struct timeval tv; gettimeofday(&tv, NULL); return tv.tv_sec; } void uglyfBreak() /* Go into debugger. */ { static char *nullPt = NULL; nullPt[0] = 0; } char *getCurrentDir() /* Return current directory. Abort if it fails. */ { static char dir[PATH_LEN]; if (getcwd( dir, sizeof(dir) ) == NULL ) errnoAbort("getCurrentDir: can't get current directory"); return dir; } void setCurrentDir(char *newDir) /* Set current directory. Abort if it fails. */ { if (chdir(newDir) != 0) errnoAbort("setCurrentDir: can't to set current directory: %s", newDir); } boolean maybeSetCurrentDir(char *newDir) /* Change directory, return FALSE (and set errno) if fail. */ { return chdir(newDir) == 0; } struct slName *listDir(char *dir, char *pattern) /* Return an alphabetized list of all files that match * the wildcard pattern in directory. */ { struct slName *list = NULL, *name; struct dirent *de; DIR *d; if ((d = opendir(dir)) == NULL) return NULL; while ((de = readdir(d)) != NULL) { char *fileName = de->d_name; if (differentString(fileName, ".") && differentString(fileName, "..")) { if (pattern == NULL || wildMatch(pattern, fileName)) { name = newSlName(fileName); slAddHead(&list, name); } } } closedir(d); slNameSort(&list); return list; } struct slName *listDirRegEx(char *dir, char *regEx, int flags) /* Return an alphabetized list of all files that match * the regular expression pattern in directory. * See REGCOMP(3) for flags (e.g. REG_ICASE) */ { struct slName *list = NULL, *name; struct dirent *de; DIR *d; regex_t re; int err = regcomp(&re, regEx, flags | REG_NOSUB); if(err) errAbort("regcomp failed; err: %d", err); if ((d = opendir(dir)) == NULL) return NULL; while ((de = readdir(d)) != NULL) { char *fileName = de->d_name; if (differentString(fileName, ".") && differentString(fileName, "..")) { if (!regexec(&re, fileName, 0, NULL, 0)) { name = newSlName(fileName); slAddHead(&list, name); } } } closedir(d); regfree(&re); slNameSort(&list); return list; } boolean makeDir(char *dirName) /* Make dir. Returns TRUE on success. Returns FALSE * if failed because directory exists. Prints error * message and aborts on other error. */ { int err; if ((err = mkdir(dirName, 0777)) < 0) { if (errno != EEXIST) { perror(""); errAbort("Couldn't make directory %s", dirName); } return FALSE; } return TRUE; } struct fileInfo *listDirXExt(char *dir, char *pattern, boolean fullPath, boolean ignoreStatFailures) /* Return list of files matching wildcard pattern with * extra info. If full path is true then the path will be * included in the name of each file. */ { struct fileInfo *list = NULL, *el; struct dirent *de; DIR *d; int dirNameSize = strlen(dir); int fileNameOffset = dirNameSize+1; char pathName[512]; if ((d = opendir(dir)) == NULL) return NULL; memcpy(pathName, dir, dirNameSize); pathName[dirNameSize] = '/'; while ((de = readdir(d)) != NULL) { char *fileName = de->d_name; if (differentString(fileName, ".") && differentString(fileName, "..")) { if (pattern == NULL || wildMatch(pattern, fileName)) { struct stat st; bool isDir = FALSE; int statErrno = 0; strcpy(pathName+fileNameOffset, fileName); if (stat(pathName, &st) < 0) { if (ignoreStatFailures) statErrno = errno; else errAbort("stat failed in listDirX"); } if (S_ISDIR(st.st_mode)) isDir = TRUE; if (fullPath) fileName = pathName; el = newFileInfo(fileName, st.st_size, isDir, statErrno, st.st_atime); slAddHead(&list, el); } } } closedir(d); slSort(&list, cmpFileInfo); return list; } struct fileInfo *listDirX(char *dir, char *pattern, boolean fullPath) /* Return list of files matching wildcard pattern with * extra info. If full path is true then the path will be * included in the name of each file. */ { return listDirXExt(dir, pattern, fullPath, FALSE); } time_t fileModTime(char *pathName) /* Return file last modification time. The units of * these may vary from OS to OS, but you can depend on * later files having a larger time. */ { struct stat st; if (stat(pathName, &st) < 0) errAbort("stat failed in fileModTime: %s", pathName); return st.st_mtime; } char *getHost() /* Return host name. */ { static char *hostName = NULL; static char buf[128]; if (hostName == NULL) { hostName = getenv("HTTP_HOST"); if (hostName == NULL) { hostName = getenv("HOST"); if (hostName == NULL) { if (hostName == NULL) { static struct utsname unamebuf; if (uname(&unamebuf) >= 0) hostName = unamebuf.nodename; else hostName = "unknown"; } } } strncpy(buf, hostName, sizeof(buf)); chopSuffix(buf); hostName = buf; } return hostName; } char *mysqlHost() /* Return host computer on network for mySQL database. */ { boolean gotIt = FALSE; static char *host = NULL; if (!gotIt) { static char hostBuf[128]; gotIt = TRUE; if (fileExists("mysqlHost")) { return (host = firstWordInFile("mysqlHost", hostBuf, sizeof(hostBuf))); } else return (host = getenv("MYSQLHOST")); } return host; } char *semiUniqName(char *base) /* Figure out a name likely to be unique. * Name will have no periods. Returns a static * buffer, so best to clone result unless using * immediately. */ { int pid = getpid(); int num = time(NULL)&0xFFFFF; char host[512]; strcpy(host, getHost()); char *s = strchr(host, '.'); if (s != NULL) *s = 0; subChar(host, '-', '_'); subChar(host, ':', '_'); static char name[PATH_LEN]; safef(name, sizeof(name), "%s_%s_%x_%x", base, host, pid, num); return name; } char *rTempName(char *dir, char *base, char *suffix) /* Make a temp name that's almost certainly unique. */ { char *x; static char fileName[PATH_LEN]; int i; for (i=0;;++i) { x = semiUniqName(base); safef(fileName, sizeof(fileName), "%s/%s%d%s", dir, x, i, suffix); if (!fileExists(fileName)) break; } return fileName; } static void eatSlashSlashInPath(char *path) /* Convert multiple // to single // */ { char *s, *d; s = d = path; char c, lastC = 0; while ((c = *s++) != 0) { if (c == '/' && lastC == c) continue; *d++ = c; lastC = c; } *d = 0; } static void eatExcessDotDotInPath(char *path) /* If there's a /.. in path take it out. Turns * 'this/long/../dir/file' to 'this/dir/file * and * 'this/../file' to 'file' * * and * 'this/long/..' to 'this' * and * 'this/..' to '' * and * /this/..' to '/' */ { /* Take out each /../ individually */ for (;;) { /* Find first bit that needs to be taken out. */ char *excess= strstr(path, "/../"); char *excessEnd = excess+4; if (excess == NULL || excess == path) break; /* Look for a '/' before this */ char *excessStart = matchingCharBeforeInLimits(path, excess, '/'); if (excessStart == NULL) /* Preceding '/' not found */ excessStart = path; else excessStart += 1; strcpy(excessStart, excessEnd); } /* Take out final /.. if any */ if (endsWith(path, "/..")) { if (!sameString(path, "/..")) /* We don't want to turn this to blank. */ { int len = strlen(path); char *excessStart = matchingCharBeforeInLimits(path, path+len-3, '/'); if (excessStart == NULL) /* Preceding '/' not found */ excessStart = path; else excessStart += 1; *excessStart = 0; } } } char *simplifyPathToDir(char *path) /* Return path with ~ and .. taken out. Also any // or trailing /. * freeMem result when done. */ { /* Expand ~ if any with result in newPath */ char newPath[PATH_LEN]; int newLen = 0; char *s = path; if (*s == '~') { char *homeDir = getenv("HOME"); if (homeDir == NULL) errAbort("No HOME environment var defined after ~ in simplifyPathToDir"); ++s; if (*s == '/') /* ~/something */ { ++s; safef(newPath, sizeof(newPath), "%s/", homeDir); } else /* ~something */ { safef(newPath, sizeof(newPath), "%s/../", homeDir); } newLen = strlen(newPath); } int remainingLen = strlen(s); if (newLen + remainingLen >= sizeof(newPath)) errAbort("path too big in simplifyPathToDir"); strcpy(newPath+newLen, s); /* Remove //, .. and trailing / */ eatSlashSlashInPath(newPath); eatExcessDotDotInPath(newPath); int lastPos = strlen(newPath)-1; if (lastPos > 0 && newPath[lastPos] == '/') newPath[lastPos] = 0; return cloneString(newPath); } #ifdef DEBUG void simplifyPathToDirSelfTest() { /* First test some cases which should remain the same. */ assert(sameString(simplifyPathToDir(""),"")); assert(sameString(simplifyPathToDir("a"),"a")); assert(sameString(simplifyPathToDir("a/b"),"a/b")); assert(sameString(simplifyPathToDir("/"),"/")); assert(sameString(simplifyPathToDir("/.."),"/..")); assert(sameString(simplifyPathToDir("/../a"),"/../a")); /* Now test removing trailing slash. */ assert(sameString(simplifyPathToDir("a/"),"a")); assert(sameString(simplifyPathToDir("a/b/"),"a/b")); /* Test .. removal. */ assert(sameString(simplifyPathToDir("a/.."),"")); assert(sameString(simplifyPathToDir("a/../"),"")); assert(sameString(simplifyPathToDir("a/../b"),"b")); assert(sameString(simplifyPathToDir("/a/.."),"/")); assert(sameString(simplifyPathToDir("/a/../"),"/")); assert(sameString(simplifyPathToDir("/a/../b"),"/b")); assert(sameString(simplifyPathToDir("a/b/.."),"a")); assert(sameString(simplifyPathToDir("a/b/../"),"a")); assert(sameString(simplifyPathToDir("a/b/../c"),"a/c")); assert(sameString(simplifyPathToDir("a/../b/../c"),"c")); assert(sameString(simplifyPathToDir("a/../b/../c/.."),"")); assert(sameString(simplifyPathToDir("/a/../b/../c/.."),"/")); /* Test // removal */ assert(sameString(simplifyPathToDir("//"),"/")); assert(sameString(simplifyPathToDir("//../"),"/..")); assert(sameString(simplifyPathToDir("a//b///c"),"a/b/c")); assert(sameString(simplifyPathToDir("a/b///"),"a/b")); } #endif /* DEBUG */ char *getUser() /* Get user name */ { uid_t uid = geteuid(); struct passwd *pw = getpwuid(uid); if (pw == NULL) errnoAbort("getUser: can't get user name for uid %d", (int)uid); return pw->pw_name; } int mustFork() /* Fork or abort. */ { int childId = fork(); if (childId == -1) errnoAbort("mustFork: Unable to fork"); return childId; } int rawKeyIn() /* Read in an unbuffered, unechoed character from keyboard. */ { struct termios attr; tcflag_t old; char c; /* Set terminal to non-echoing non-buffered state. */ if (tcgetattr(STDIN_FILENO, &attr) != 0) errAbort("Couldn't do tcgetattr"); old = attr.c_lflag; attr.c_lflag &= ~ICANON; attr.c_lflag &= ~ECHO; if (tcsetattr(STDIN_FILENO, TCSANOW, &attr) == -1) errAbort("Couldn't do tcsetattr"); /* Read one byte */ if (read(STDIN_FILENO,&c,1) != 1) errnoAbort("rawKeyIn: I/O error"); /* Put back terminal to how it was. */ attr.c_lflag = old; if (tcsetattr(STDIN_FILENO, TCSANOW, &attr) == -1) errAbort("Couldn't do tcsetattr2"); return c; } boolean isPipe(int fd) /* determine in an open file is a pipe */ { struct stat buf; if (fstat(fd, &buf) < 0) errnoAbort("isPipe: fstat failed"); return S_ISFIFO(buf.st_mode); } static void execPStack(pid_t ppid) /* exec pstack on the specified pid */ { char *cmd[3], pidStr[32]; safef(pidStr, sizeof(pidStr), "%ld", (long)ppid); cmd[0] = "pstack"; cmd[1] = pidStr; cmd[2] = NULL; // redirect stdout to stderr if (dup2(2, 1) < 0) errAbort("dup2 failed"); execvp(cmd[0], cmd); errAbort("exec failed: %s", cmd[0]); } void vaDumpStack(char *format, va_list args) /* debugging function to run the pstack program on the current process. In * prints a message, following by a new line, and then the stack track. Just * prints errors to stderr rather than aborts. For debugging purposes * only. */ { static boolean inDumpStack = FALSE; // don't allow re-entry if called from error handler if (inDumpStack) return; inDumpStack = TRUE; fflush(stdout); // clear buffer before forking vfprintf(stderr, format, args); fputc('\n', stderr); fflush(stderr); pid_t ppid = getpid(); pid_t pid = fork(); if (pid < 0) { perror("can't fork pstack"); return; } if (pid == 0) execPStack(ppid); int wstat; if (waitpid(pid, &wstat, 0) < 0) perror("waitpid on pstack failed"); else { if (WIFEXITED(wstat)) { if (WEXITSTATUS(wstat) != 0) fprintf(stderr, "pstack failed\n"); } else if (WIFSIGNALED(wstat)) fprintf(stderr, "pstack signaled %d\n", WTERMSIG(wstat)); } inDumpStack = FALSE; } void dumpStack(char *format, ...) /* debugging function to run the pstack program on the current process. In * prints a message, following by a new line, and then the stack track. Just * prints errors to stderr rather than aborts. For debugging purposes * only. */ { va_list args; va_start(args, format); vaDumpStack(format, args); va_end(args); } boolean maybeTouchFile(char *fileName) /* If file exists, set its access and mod times to now. If it doesn't exist, create it. * Return FALSE if we have a problem doing so (e.g. when qateam is gdb'ing and code tries * to touch some file owned by www). */ { if (fileExists(fileName)) { struct utimbuf ut; ut.actime = ut.modtime = clock1(); int ret = utime(fileName, &ut); if (ret != 0) { warn("utime(%s) failed (ownership?)", fileName); return FALSE; } } else { FILE *f = fopen(fileName, "w"); if (f == NULL) return FALSE; else carefulClose(&f); } return TRUE; } rtracklayer/src/ucsc/oswin9x.c0000644000126300012640000001102012227135242017762 0ustar00biocbuildphs_compbio/* Stuff that's specific for Win95 goes here. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include #include "common.h" #include #include #include "portable.h" #include "_portimpl.h" /* for cmpFileInfo */ static char const rcsid[] = "$Id: oswin9x.c,v 1.9 2008/06/27 18:46:53 markd Exp $"; /* Return how long the named file is in bytes. * Return -1 if no such file. */ off_t fileSize(char *fileName) { int fd; long size; fd = _open(fileName, _O_RDONLY, 0); if (fd < 0) return -1; size = _lseek(fd, 0L, SEEK_END); _close(fd); return size; } time_t fileModTime(char *pathName) /* Return file last modification time. The units of * these may vary from OS to OS, but you can depend on * later files having a larger time. */ { struct _finddata_t fileInfo; if (_findfirst( pathName, &fileInfo) == -1L) errAbort("_findFirst failed in fileModTime: %s", pathName); return fileInfo.time_write; } void sleep1000(int milli) /* Sleep for given number of 1000ths of second */ { if (milli > 0) { Sleep(milli); } } long clock1000() /* A millisecond clock. */ { return clock() /* 1000/CLOCKS_PER_SEC */; /* CLOCKS_PER_SEC == 1000 for windows */ } long clock1() /* Second clock. */ { return clock()/CLOCKS_PER_SEC; } void uglyfBreak() /* Go into debugger. */ { /* __asm { int 3 } */ } char *getCurrentDir() /* Return current directory. */ { static char dir[_MAX_PATH]; if( _getcwd( dir, _MAX_PATH ) == NULL ) errnoAbort("can't get current directory"); return dir; } void setCurrentDir(char *newDir) /* Set current directory. Abort if it fails. */ { if (_chdir(newDir) != 0) errnoAbort("can't to set current directory: %s", newDir); } boolean maybeSetCurrentDir(char *newDir) /* Change directory, return FALSE (and set errno) if fail. */ { return _chdir(newDir) == 0; } struct slName *listDir(char *dir, char *pattern) /* Return an alphabetized list of all files that match * the wildcard pattern in directory. */ { long hFile; struct _finddata_t fileInfo; struct slName *list = NULL, *name; boolean otherDir = FALSE; char *currentDir; if (dir == NULL || sameString(".", dir) || sameString("", dir)) dir = ""; else { currentDir = getCurrentDir(); setCurrentDir(dir); otherDir = TRUE; } if (pattern == NULL) pattern = "*"; if( (hFile = _findfirst( pattern, &fileInfo)) == -1L ) return NULL; do { if (!sameString(".", fileInfo.name) && !sameString("..", fileInfo.name)) { name = newSlName(fileInfo.name); slAddHead(&list, name); } } while( _findnext( hFile, &fileInfo) == 0 ); _findclose( hFile ); if (otherDir) setCurrentDir(currentDir); slNameSort(&list); return list; } boolean makeDir(char *dirName) /* Make dir. Returns TRUE on success. Returns FALSE * if failed because directory exists. Prints error * message and aborts on other error. */ { if (!CreateDirectory(dirName, NULL)) { perror(""); errAbort("Couldn't make directory %s", dirName); return FALSE; } return TRUE; } struct fileInfo *listDirX(char *dir, char *pattern, boolean fullPath) /* Return list of files matching wildcard pattern with * extra info. If full path is true then the path will be * included in the name of each file. */ { struct fileInfo *list = NULL, *el; long hFile; struct _finddata_t fileInfo; boolean otherDir = FALSE; char *currentDir; int dirNameSize = strlen(dir); int fileNameOffset = dirNameSize+1; char pathName[512]; if (dir == NULL || sameString(".", dir) || sameString("", dir)) dir = ""; else { currentDir = getCurrentDir(); setCurrentDir(dir); otherDir = TRUE; } if (pattern == NULL) pattern = "*"; if( (hFile = _findfirst( pattern, &fileInfo)) == -1L ) return NULL; memcpy(pathName, dir, dirNameSize); pathName[dirNameSize] = '/'; do { if (!sameString(".", fileInfo.name) && !sameString("..", fileInfo.name)) { char *fileName = fileInfo.name; strcpy(pathName+fileNameOffset, fileName); if (fullPath) fileName = pathName; el = newFileInfo(fileInfo.name, fileInfo.size, fileInfo.attrib & _A_SUBDIR, 0, fileInfo.time_access); slAddHead(&list, el); } } while( _findnext( hFile, &fileInfo) == 0 ); _findclose( hFile ); if (otherDir) setCurrentDir(currentDir); slSort(&list, cmpFileInfo); return list; } rtracklayer/src/ucsc/pipeline.c0000644000126300012640000004665312227135242020173 0ustar00biocbuildphs_compbio#ifndef WIN32 /* pipeline.c - create a process pipeline that can be used for reading or * writing */ #include "pipeline.h" #include "common.h" #include "sqlNum.h" #include "dystring.h" #include "errabort.h" #include "portable.h" #include "linefile.h" #include #include #include #include enum procState /* process state, in order of transition */ { procStateNew, // plProc object created procStateRun, // proccess running procStateDone // process finished (ok or failed) }; struct plProc /* A single process in a pipeline */ { struct plProc *next; /* order list of processes */ struct pipeline *pl; /* pipeline we are associated with */ char **cmd; /* null-terminated command for this process */ pid_t pid; /* pid for process, -1 if not running */ enum procState state; /* state of process */ int status; /* status from wait */ int execPipeParent; /* pipe to wait on for exec */ int execPipeChild; /* write side is close-on-exec */ }; struct pipeline /* Object for a process pipeline and associated open file */ { struct pipeline *next; struct plProc *procs; /* list of processes */ int numRunning; /* number of processes running */ pid_t pgid; /* process group id, or -1 if not set. */ char *procName; /* name to use in error messages. */ int pipeFd; /* fd of pipe to/from process, -1 if none */ unsigned options; /* options */ FILE* pipeFh; /* optional stdio around pipe */ char* stdioBuf; /* optional stdio buffer */ struct lineFile *pipeLf; /* optional lineFile around pipe */ }; /* file buffer size */ #define FILE_BUF_SIZE 64*1024 static int pipeCreate(int *writeFd) /* create a pipe of die, return readFd */ { int pipeFds[2]; if (pipe(pipeFds) < 0) errnoAbort("can't create pipe"); *writeFd = pipeFds[1]; return pipeFds[0]; } static void safeClose(int *fdPtr) /* Close with error checking. *fdPtr == -1 indicated already closed */ { int fd = *fdPtr; if (fd != -1) { if (close(fd) < 0) errnoAbort("close failed on fd %d", fd); *fdPtr = -1; } } static char* joinCmd(char **cmd) /* join an cmd vector into a space separated string */ { struct dyString *str = dyStringNew(512); int i; for (i = 0; cmd[i] != NULL; i++) { if (i > 0) dyStringAppend(str, " "); dyStringAppend(str, cmd[i]); } return dyStringCannibalize(&str); } static char* joinCmds(char ***cmds) /* join an cmds vetor into a space and pipe separated string */ { struct dyString *str = dyStringNew(512); int i, j; for (i = 0; cmds[i] != NULL; i++) { if (i > 0) dyStringAppend(str, " | "); for (j = 0; cmds[i][j] != NULL; j++) { if (j > 0) dyStringAppend(str, " "); dyStringAppend(str, cmds[i][j]); } } return dyStringCannibalize(&str); } static struct plProc* plProcNew(char **cmd, struct pipeline *pl) /* create a new plProc object for a command. */ { int i, cmdLen = 0; struct plProc* proc; AllocVar(proc); proc->pl = pl; for (i = 0; cmd[i] != NULL; i++) cmdLen++; proc->cmd = needMem((cmdLen+1)*sizeof(char*)); for (i = 0; i < cmdLen; i++) proc->cmd[i] = cloneString(cmd[i]); proc->cmd[cmdLen] = NULL; proc->state = procStateNew; proc->execPipeParent = pipeCreate(&proc->execPipeChild); if (fcntl(proc->execPipeChild, F_SETFL, FD_CLOEXEC) != 0) errnoAbort("fcntl set FD_cloexec failed"); return proc; } static void plProcFree(struct plProc *proc) /* free a plProc object. */ { int i; for (i = 0; proc->cmd[i] != NULL; i++) freeMem(proc->cmd[i]); freeMem(proc->cmd); freeMem(proc); } static void plProcStateTrans(struct plProc *proc, enum procState newState) /* do state transition for process changing it to a new state */ { // States must transition in order. New state must immediately follow the // current state. if (newState != proc->state+1) errAbort("invalid state transition: %d -> %d", proc->state, newState); proc->state = newState; } static void childAbortHandler() /* abort handler that just exits */ { exit(100); } static void plProcSetup(struct plProc* proc, int stdinFd, int stdoutFd, int stderrFd) /* setup signal, error handling, and file descriptors after fork */ { int fd; #ifdef __USE_POSIX struct sigaction sigAct; #endif /* make sure abort handler exits */ pushWarnAbort(); pushAbortHandler(childAbortHandler); /* treat a closed pipe as an EOF rather than getting SIGPIPE */ #ifdef __USE_POSIX ZeroVar(&sigAct); sigAct.sa_handler = SIG_IGN; if (sigaction(SIGPIPE, &sigAct, NULL) != 0) #else if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) #endif errnoAbort("failed to set SIGPIPE to SIG_IGN"); /* child, first setup stdio files */ if (stdinFd != STDIN_FILENO) { if (dup2(stdinFd, STDIN_FILENO) < 0) errnoAbort("can't dup2 to stdin"); } if (stdoutFd != STDOUT_FILENO) { if (dup2(stdoutFd, STDOUT_FILENO) < 0) errnoAbort("can't dup2 to stdout"); } if (stderrFd != STDERR_FILENO) { if (dup2(stderrFd, STDERR_FILENO) < 0) errnoAbort("can't dup2 to stderr"); } /* close other file descriptors */ for (fd = STDERR_FILENO+1; fd < 64; fd++) close(fd); } static void plProcExecChild(struct plProc* proc, int stdinFd, int stdoutFd, int stderrFd) /* child part of process startup. */ { plProcSetup(proc, stdinFd, stdoutFd, stderrFd); /* FIXME: add close-on-exec startup error reporting here */ execvp(proc->cmd[0], proc->cmd); errnoAbort("exec failed: %s", proc->cmd[0]); } static void plProcMemWrite(struct plProc* proc, int stdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* implements child process to write memory buffer to pipeline after * fork */ { safeClose(&proc->execPipeChild); // memWriter proc doesn't exec, so explicitly close plProcSetup(proc, STDIN_FILENO, stdoutFd, stderrFd); ssize_t wrCnt = write(STDOUT_FILENO, otherEndBuf, otherEndBufSize); if (wrCnt < 0) errnoAbort("pipeline input buffer write failed"); else if (wrCnt != otherEndBufSize) errAbort("pipeline input buffer short write %lld, expected %lld", (long long)wrCnt, (long long)otherEndBufSize); else { close(STDOUT_FILENO); exit(0); } } static void plProcWait(struct plProc* proc, int status) /* wait for a process in a pipeline */ { proc->status = status; if (WIFSIGNALED(proc->status)) errAbort("process terminated on signal %d: \"%s\" in pipeline \"%s\"", WTERMSIG(proc->status), joinCmd(proc->cmd), proc->pl->procName); assert(WIFEXITED(proc->status)); if ((WEXITSTATUS(proc->status) != 0) && !(proc->pl->options & pipelineNoAbort)) errAbort("process exited with %d: \"%s\" in pipeline \"%s\"", WEXITSTATUS(proc->status), joinCmd(proc->cmd), proc->pl->procName); proc->pid = -1; plProcStateTrans(proc, procStateDone); } static struct pipeline* pipelineNew(char ***cmds, unsigned options) /* create a new pipeline object. Doesn't start processes */ { static char *memPseudoCmd[] = {"[mem]", NULL}; struct pipeline *pl; int iCmd; AllocVar(pl); pl->pgid = -1; pl->pipeFd = -1; pl->options = options; pl->procName = joinCmds(cmds); if (cmds[0] == NULL) errAbort("no commands in pipeline"); if (options & pipelineMemInput) { /* add proc for forked process to write memory to pipeline */ slAddTail(&pl->procs, plProcNew(memPseudoCmd, pl)); } for(iCmd = 0; cmds[iCmd] != NULL; iCmd++) slAddTail(&pl->procs, plProcNew(cmds[iCmd], pl)); return pl; } void pipelineFree(struct pipeline **plPtr) /* free a pipeline object */ { struct pipeline *pl = *plPtr; if (pl != NULL) { struct plProc *proc = pl->procs; while (proc != NULL) { struct plProc *delProc = proc; proc = proc->next; plProcFree(delProc); } freez(&pl->procName); freez(&pl->stdioBuf); freez(plPtr); } } static void execProcChild(struct pipeline* pl, struct plProc *proc, int procStdinFd, int procStdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* handle child process setup after fork. This does not return */ { if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) errnoAbort("error ignoring SIGPIPE"); // set process group to first subprocess id, which might be us pid_t pgid = (pl->pgid < 0) ? getpid() : pl->pgid; if (setpgid(getpid(), pgid) != 0) errnoAbort("error from setpgid(%d, %d)", getpid(), pgid); if (otherEndBuf != NULL) plProcMemWrite(proc, procStdoutFd, stderrFd, otherEndBuf, otherEndBufSize); else plProcExecChild(proc, procStdinFd, procStdoutFd, stderrFd); } static int pipelineExecProc(struct pipeline* pl, struct plProc *proc, int prevStdoutFd, int stdinFd, int stdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* start a process in the pipeline, return the stdout fd of the process */ { /* determine stdin/stdout to use */ int procStdinFd, procStdoutFd; if (proc == pl->procs) procStdinFd = stdinFd; /* first process in pipeline */ else procStdinFd = prevStdoutFd; if (proc->next == NULL) procStdoutFd = stdoutFd; /* last process in pipeline */ else prevStdoutFd = pipeCreate(&procStdoutFd); /* start process */ if ((proc->pid = fork()) < 0) errnoAbort("can't fork"); if (proc->pid == 0) execProcChild(pl, proc, procStdinFd, procStdoutFd, stderrFd, otherEndBuf, otherEndBufSize); /* parent only */ if (pl->pgid < 0) pl->pgid = proc->pid; // first process defines pgid /* record that we did this */ plProcStateTrans(proc, procStateRun); pl->numRunning++; /* don't leave intermediate pipes open in parent */ if (proc != pl->procs) safeClose(&procStdinFd); if (proc->next != NULL) safeClose(&procStdoutFd); safeClose(&proc->execPipeChild); // child end of execPipe return prevStdoutFd; } static void waitOnExec(struct plProc *proc) /* wait on exec to happen on this process */ { // execPipeChild will get EOF when exec happens char buf[1]; // even with (void) cast, so compilers on some systems complained // about the result of read not being used. Hack to save unused result. ssize_t l = read(proc->execPipeParent, buf, sizeof(buf)); l++; safeClose(&proc->execPipeParent); } static void pipelineExec(struct pipeline* pl, int stdinFd, int stdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* Start all processes in a pipeline, stdinFd and stdoutFd are the ends of * the pipeline, stderrFd is applied to all processed */ { struct plProc *proc; int prevStdoutFd = -1; for (proc = pl->procs; proc != NULL; proc = proc->next) { prevStdoutFd = pipelineExecProc(pl, proc, prevStdoutFd, stdinFd, stdoutFd, stderrFd, otherEndBuf, otherEndBufSize); otherEndBuf = NULL; /* only for first process (read pipes) */ otherEndBufSize = 0; } // wait on execs to happen so we know that setpgid has happened for (proc = pl->procs; proc != NULL; proc = proc->next) waitOnExec(proc); } static int openRead(char *fname) /* open a file for reading */ { int fd = open(fname, O_RDONLY); if (fd < 0) errnoAbort("can't open for read access: %s", fname); return fd; } static int openWrite(char *fname, boolean append) /* open a file for write access */ { int flags = O_WRONLY|O_CREAT; if (append) flags |= O_APPEND; else flags |= O_TRUNC; int fd = open(fname, flags, 0666); if (fd < 0) errnoAbort("can't open for write access: %s", fname); return fd; } static void pipelineStartRead(struct pipeline *pl, int stdinFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* start a read pipeline */ { int pipeWrFd; pl->pipeFd = pipeCreate(&pipeWrFd); pipelineExec(pl, stdinFd, pipeWrFd, stderrFd, otherEndBuf, otherEndBufSize); safeClose(&pipeWrFd); } static void pipelineStartWrite(struct pipeline *pl, int stdoutFd, int stderrFd) /* start a write pipeline */ { int pipeRdFd = pipeCreate(&pl->pipeFd); pipelineExec(pl, pipeRdFd, stdoutFd, stderrFd, NULL, 0); safeClose(&pipeRdFd); } static void checkOpts(unsigned opts) /* check option set for consistency */ { if (((opts & (pipelineRead|pipelineWrite)) == 0) || ((opts & (pipelineRead|pipelineWrite)) == (pipelineRead|pipelineWrite))) errAbort("must specify one of pipelineRead or pipelineWrite to pipelineOpen"); if ((opts & pipelineAppend) && ((opts & pipelineWrite) == 0)) errAbort("pipelineAppend is valid only in conjunction with pipelineWrite"); } struct pipeline *pipelineOpenFd(char ***cmds, unsigned opts, int otherEndFd, int stderrFd) /* Create a pipeline from an array of commands. See pipeline.h for * full documentation. */ { struct pipeline *pl; checkOpts(opts); pl = pipelineNew(cmds, opts); if (opts & pipelineRead) pipelineStartRead(pl, otherEndFd, stderrFd, NULL, 0); else pipelineStartWrite(pl, otherEndFd, stderrFd); return pl; } struct pipeline *pipelineOpen(char ***cmds, unsigned opts, char *otherEndFile, char *stderrFile) /* Create a pipeline from an array of commands. See pipeline.h for * full documentation */ { int otherEndFd; int stderrFd = (stderrFile == NULL) ? STDERR_FILENO : openWrite(stderrFile, FALSE); checkOpts(opts); boolean append = ((opts & pipelineAppend) != 0); if (opts & pipelineRead) otherEndFd = (otherEndFile == NULL) ? STDIN_FILENO : openRead(otherEndFile); else otherEndFd = (otherEndFile == NULL) ? STDOUT_FILENO : openWrite(otherEndFile, append); struct pipeline *pl = pipelineOpenFd(cmds, opts, otherEndFd, stderrFd); safeClose(&otherEndFd); if (stderrFile != NULL) safeClose(&stderrFd); return pl; } struct pipeline *pipelineOpenMem(char ***cmds, unsigned opts, void *otherEndBuf, size_t otherEndBufSize, int stderrFd) /* Create a pipeline from an array of commands, with the pipeline input/output * in a memory buffer. See pipeline.h for full documentation. Currently only * input to a read pipeline is supported */ { struct pipeline *pl; checkOpts(opts); if (opts & pipelineWrite) errAbort("pipelineOpenMem only supports read pipelines at this time"); opts |= pipelineMemInput; pl = pipelineNew(cmds, opts); pipelineStartRead(pl, STDIN_FILENO, stderrFd, otherEndBuf, otherEndBufSize); return pl; } struct pipeline *pipelineOpenFd1(char **cmd, unsigned opts, int otherEndFd, int stderrFd) /* like pipelineOpenFd(), only takes a single command */ { char **cmds[2]; cmds[0] = cmd; cmds[1] = NULL; return pipelineOpenFd(cmds, opts, otherEndFd, stderrFd); } struct pipeline *pipelineOpen1(char **cmd, unsigned opts, char *otherEndFile, char *stderrFile) /* like pipelineOpen(), only takes a single command */ { char **cmds[2]; cmds[0] = cmd; cmds[1] = NULL; return pipelineOpen(cmds, opts, otherEndFile, stderrFile); } struct pipeline *pipelineOpenMem1(char **cmd, unsigned opts, void *otherEndBuf, size_t otherEndBufSize, int stderrFd) /* like pipelineOpenMem(), only takes a single command */ { char **cmds[2]; cmds[0] = cmd; cmds[1] = NULL; return pipelineOpenMem(cmds, opts, otherEndBuf, otherEndBufSize, stderrFd); } char *pipelineDesc(struct pipeline *pl) /* Get the description of a pipeline for use in error messages */ { return pl->procName; } int pipelineFd(struct pipeline *pl) /* Get the file descriptor for a pipeline */ { return pl->pipeFd; } FILE *pipelineFile(struct pipeline *pl) /* Get a FILE object wrapped around the pipeline. Do not close the FILE, is * owned by the pipeline object. A FILE is created on first call to this * function. Subsequent calls return the same FILE.*/ { if (pl->pipeFh == NULL) { /* create FILE* on first access */ char *mode = (pl->options & pipelineRead) ? "r" : "w"; if (pl->pipeLf != NULL) errAbort("can't call pipelineFile after having associated a lineFile with a pipeline"); pl->pipeFh = fdopen(pl->pipeFd, mode); if (pl->pipeFh == NULL) errnoAbort("fdopen failed for: %s", pl->procName); pl->stdioBuf = needLargeMem(FILE_BUF_SIZE); setvbuf(pl->pipeFh, pl->stdioBuf, _IOFBF, FILE_BUF_SIZE); } return pl->pipeFh; } struct lineFile *pipelineLineFile(struct pipeline *pl) /* Get a lineFile object wrapped around the pipeline. Do not close the * lineFile, is owned by the pipeline object. A lineFile is created on first * call to this function. Subsequent calls return the same object.*/ { if (pl->pipeLf == NULL) { /* create line on first acess */ if (pl->pipeFh != NULL) errAbort("can't call pipelineLineFile after having associated a FILE with a pipeline"); if (pl->options & pipelineWrite) errAbort("can't associated a lineFile with a write pipeline"); pl->pipeLf = lineFileAttach(pipelineDesc(pl), TRUE, pl->pipeFd); } return pl->pipeLf; } static void closePipelineFile(struct pipeline *pl) /* close a pipeline with a FILE associated with it */ { if (pl->options & pipelineWrite) { fflush(pl->pipeFh); if (ferror(pl->pipeFh)) errAbort("write failed to pipeline: %s ", pl->procName); } else if (ferror(pl->pipeFh)) errAbort("read failed from pipeline: %s ", pl->procName); if (fclose(pl->pipeFh) == EOF) errAbort("close failed on pipeline: %s ", pl->procName); pl->pipeFh = NULL; } static void closePipeline(struct pipeline *pl) /* Close the pipe file */ { if (pl->pipeFh != NULL) closePipelineFile(pl); else if (pl->pipeLf != NULL) lineFileClose(&pl->pipeLf); else { if (close(pl->pipeFd) < 0) errAbort("close failed on pipeline: %s ", pl->procName); } pl->pipeFd = -1; } static struct plProc *pipelineFindProc(struct pipeline *pl, pid_t pid) /* find a plProc by pid */ { struct plProc *proc; for (proc = pl->procs; proc != NULL; proc = proc->next) if (proc->pid == pid) return proc; errAbort("pid not found in pipeline: %d", (int)pid); return 0; // never reached } static int pipelineFindStatus(struct pipeline *pl) /* find the status of the pipeline, which is the first failed, or 0 */ { // n.b. can't get here if signaled (see plProcWait) struct plProc *proc; for (proc = pl->procs; proc != NULL; proc = proc->next) { assert(WIFEXITED(proc->status)); if (WEXITSTATUS(proc->status) != 0) return WEXITSTATUS(proc->status); } return 0; // all ok } static void waitOnOne(struct pipeline *pl) /* wait on one process to finish */ { int status; pid_t pid = waitpid(-pl->pgid, &status, 0); if (pid < 0) errnoAbort("waitpid failed"); plProcWait(pipelineFindProc(pl, pid), status); pl->numRunning--; assert(pl->numRunning >= 0); } int pipelineWait(struct pipeline *pl) /* Wait for processes in a pipeline to complete; normally aborts if any * process exists non-zero. If pipelineNoAbort was specified, return the exit * code of the first process exit non-zero, or zero if none failed. */ { /* must close before waiting to so processes get pipe EOF */ closePipeline(pl); /* wait on each process in order */ while (pl->numRunning > 0) waitOnOne(pl); return pipelineFindStatus(pl); } void pipelineDumpCmds(char ***cmds) /* Dump out pipeline-formatted commands to stdout for debugging. */ { char **cmd; boolean first = TRUE; while ((cmd = *cmds++) != NULL) { char *word; if (first) first = FALSE; else printf("| "); while ((word = *cmd++) != NULL) printf("%s ", word); } printf("
    \n"); } /* * Local Variables: * c-file-style: "jkent-c" * End: */ #endif rtracklayer/src/ucsc/pipeline.h0000644000126300012640000001424712227135242020172 0ustar00biocbuildphs_compbio/* pipeline.h - create a process pipeline that can be used for reading or * writing. These pipeline objects don't go through the shell, so they * avoid many of the obscure problems associated with system() and popen(). * * Read pipelines are pipelines where a program reads output written by the * pipeline, and write pipelines are where the program writes data to the * pipeline. The type of pipeline is specified in the set of option flags * passed to pipelineOpen(). The file at the other end of the pipeline is * specified in the otherEndFile argument of pipelineOpen(), as shown here: * * pipelineRead: * * otherEndFile --> cmd[0] --> ... --> cmd[n] --> pipelineLf() etc. * * pipelineWrite: * * pipeLineFile() --> cmd[0] --> ... --> cmd[n] --> otherEndFile * * Specify otherEndFile as "/dev/null" for no input or no output (or to * discard output). If otherEndFile is NULL, then either stdin or stdout are * inherited from the current process. * * I/O to the pipeline is done by using the result of pipelineFd(), * pipelineFile(), or pipelineLineFile(). * * An example that reads a compressed file, sorting it numerically by the * first column: * * static char *cmd1[] = {"gzip", "-dc", NULL}; * static char *cmd2[] = {"sort", "-k", "1,1n", NULL}; * static char **cmds[] = {cmd1, cmd2, NULL}; * * struct pipeline *pl = pipelineOpen(cmds, pipelineRead, inFilePath, stderrFd); * struct lineFile *lf = pipelineLineFile(pl); * char *line; * * while (lineFileNext(lf, &line, NULL)) * { * ... * } * pipelineWait(pl); * pipelineFree(&pl); * * A similar example that generates data and writes a compressed file, sorting * it numerically by the first column: * * * static char *cmd1[] = {"sort", "-k", "1,1n", NULL}; * static char *cmd2[] = {"gzip", "-c3", NULL}; * static char **cmds[] = {cmd1, cmd2, NULL}; * * struct pipeline *pl = pipelineOpen(cmds, pipelineWrite, outFilePath, stderrFd); * char *line; * * while ((line = makeNextRow()) != NULL) * fprintf(fh, "%s\n", line); * * pipelineWait(pl); * pipelineFree(&pl); * * To append to an output file, use pipelineWrite|pipelineAppend: * * struct pipeline *pl = pipelineOpen(cmds, pipelineWrite|pipelineAppend, outFilePath, stderrFd); */ #ifndef PIPELINE_H #define PIPELINE_H #include struct linefile; struct pipeline; enum pipelineOpts /* pipeline options bitset */ { pipelineRead = 0x01, /* read from pipeline */ pipelineWrite = 0x02, /* write to pipeline */ pipelineNoAbort = 0x04, /* don't abort if a process exits non-zero, * wait will return exit code instead. * Still aborts if process signals. */ pipelineAppend = 0x10, /* Append to output file (used only with pipelineWrite) */ /* these are internal options */ pipelineMemInput = 0x08 /* pipeline takes input from memory */ }; struct pipeline *pipelineOpenFd(char ***cmds, unsigned opts, int otherEndFd, int stderrFd); /* Create a pipeline from an array of commands. Each command is an array of * arguments. Shell expansion is not done on the arguments. If pipelineRead * is specified, the output of the pipeline is readable from the pipeline * object. If pipelineWrite is specified, the input of the pipeline is * writable from the pipeline object. */ struct pipeline *pipelineOpen(char ***cmds, unsigned opts, char *otherEndFile, char *stderrFile); /* Create a pipeline from an array of commands. Each command is an array of * arguments. Shell expansion is not done on the arguments. If pipelineRead * is specified, the output of the pipeline is readable from the pipeline * object. If pipelineWrite is specified, the input of the pipeline is * writable from the pipeline object. If stderrFile is NULL, stderr is inherited, * otherwise it is redirected to this file. */ void pipelineDumpCmds(char ***cmds); /* Dump out pipeline-formatted commands to stdout for debugging. */ struct pipeline *pipelineOpenMem(char ***cmds, unsigned opts, void *otherEndBuf, size_t otherEndBufSize, int stderrFd); /* Create a pipeline from an array of commands, with the pipeline input/output * in a memory buffer. See pipeline.h for full documentation. Currently only * input to a read pipeline is supported */ struct pipeline *pipelineOpenFd1(char **cmd, unsigned opts, int otherEndFd, int stderrFd); /* like pipelineOpenFd(), only takes a single command */ struct pipeline *pipelineOpen1(char **cmd, unsigned opts, char *otherEndFile, char *stderrFile); /* like pipelineOpen(), only takes a single command */ struct pipeline *pipelineOpenMem1(char **cmd, unsigned opts, void *otherEndBuf, size_t otherEndBufSize, int stderrFd); /* like pipelineOpenMem(), only takes a single command */ char *pipelineDesc(struct pipeline *pl); /* Get the desciption of a pipeline for use in error messages */ int pipelineFd(struct pipeline *pl); /* Get the file descriptor for a pipeline */ FILE *pipelineFile(struct pipeline *pl); /* Get a FILE object wrapped around the pipeline. Do not close the FILE, is * owned by the pipeline object. A FILE is created on first call to this * function. Subsequent calls return the same FILE.*/ struct lineFile *pipelineLineFile(struct pipeline *pl); /* Get a lineFile object wrapped around the pipeline. Do not close the * lineFile, is owned by the pipeline object. A lineFile is created on first * call to this function. Subsequent calls return the same object.*/ int pipelineWait(struct pipeline *pl); /* Wait for processes in a pipeline to complete; normally aborts if any * process exists non-zero. If pipelineNoAbort was specified, return the exit * code of the first process exit non-zero, or zero if none failed. */ void pipelineFree(struct pipeline **plPtr); /* free a pipeline object */ #endif /* * Local Variables: * c-file-style: "jkent-c" * End: */ rtracklayer/src/ucsc/portable.h0000644000126300012640000001114412227135242020166 0ustar00biocbuildphs_compbio/* portable.h - wrappers around things that vary from server * to server and operating system to operating system. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef PORTABLE_H #define PORTABLE_H #include #include struct slName *listDir(char *dir, char *pattern); /* Return an alphabetized list of all files that match * the wildcard pattern in directory. */ struct slName *listDirRegEx(char *dir, char *regEx, int flags); /* Return an alphabetized list of all files that match * the regular expression pattern in directory. * See REGCOMP(3) for flags (e.g. REG_ICASE) */ struct fileInfo /* Info about a file. */ { struct fileInfo *next; /* Next in list. */ off_t size; /* Size in bytes. */ bool isDir; /* True if file is a directory. */ int statErrno; /* Result of stat (e.g. bad symlink). */ time_t lastAccess; /* Last access time. */ char name[1]; /* Allocated at run time. */ }; struct fileInfo *newFileInfo(char *name, off_t size, bool isDir, int statErrno, time_t lastAccess); /* Return a new fileInfo. */ struct fileInfo *listDirXExt(char *dir, char *pattern, boolean fullPath, boolean ignoreStatFailures); /* Return list of files matching wildcard pattern with * extra info. If full path is true then the path will be * included in the name of each file. You can free the * resulting list with slFreeList. */ struct fileInfo *listDirX(char *dir, char *pattern, boolean fullPath); /* Return list of files matching wildcard pattern with * extra info. If full path is true then the path will be * included in the name of each file. You can free the * resulting list with slFreeList. */ char *getCurrentDir(); /* Return current directory. Abort if it fails. */ void setCurrentDir(char *newDir); /* Set current directory. Abort if it fails. */ boolean maybeSetCurrentDir(char *newDir); /* Change directory, return FALSE (and set errno) if fail. */ boolean makeDir(char *dirName); /* Make dir. Returns TRUE on success. Returns FALSE * if failed because directory exists. Prints error * message and aborts on other error. */ void makeDirsOnPath(char *pathName); /* Create directory specified by pathName. If pathName contains * slashes, create directory at each level of path if it doesn't * already exist. Abort with error message if there's a problem. * (It's not considered a problem for the directory to already * exist. ) */ char *simplifyPathToDir(char *path); /* Return path with ~ (for home) and .. taken out. freeMem result when done. */ long clock1000(); /* 1000 hz clock */ void sleep1000(int milli); /* Sleep for given number of milliseconds. */ long clock1(); /* A 1 hz clock. */ char *rTempName(char *dir, char *base, char *suffix); /* Make a temp name that's almost certainly unique. */ /* This structure helps us generate temp names and use * them. Since different servers locate where the cgi * runs from differently, and where the generated html * file runs from - this is necessary for portable code. */ struct tempName { char forCgi[128]; char forHtml[128]; }; void makeTempName(struct tempName *tn, char *base, char *suffix); /* Make a good name for a temp file. */ char *semiUniqName(char *base); /* Figure out a name likely to be unique. * Name will have no periods. Returns a static * buffer, so best to clone result unless using * immediately. */ char *cgiDir(); /* Return directory to look for cgi in. */ char *trashDir(); /* Return directory for relative path to trash from cgi binaries */ void mkdirTrashDirectory(char *prefix); /* create the specified trash directory if it doesn't exist */ double machineSpeed(); /* Return relative speed of machine. UCSC CSE dept. 1999 web server is 1.0 */ char *mysqlHost(); /* Return host computer on network for mySQL database. */ char *getHost(); /* Get name of this machine. */ void uglyfBreak(); /* Invoke the debugger. */ char *getUser(); /* Get user name */ void envUpdate(char *name, char *value); /* Update an environment string */ int mustFork(); /* Fork or abort. */ int rawKeyIn(); /* Read in an unbuffered, unechoed character from keyboard. */ time_t fileModTime(char *pathName); /* Return file last modification time. The units of * these may vary from OS to OS, but you can depend on * later files having a larger time. */ boolean isPipe(int fd); /* determine in an open file is a pipe */ boolean maybeTouchFile(char *fileName); /* If file exists, set its access and mod times to now. If it doesn't exist, create it. * Return FALSE if we have a problem doing so. */ #endif /* PORTABLE_H */ rtracklayer/src/ucsc/portimpl.h0000644000126300012640000000253612227135242020231 0ustar00biocbuildphs_compbio/***************************************************************************** * Copyright (C) 2000 Jim Kent. This source code may be freely used * * for personal, academic, and non-profit purposes. Commercial use * * permitted only by explicit agreement with Jim Kent (jim_kent@pacbell.net) * *****************************************************************************/ /* Implement portable stuff.... */ /* There is one of the following structures for each web server * we support. During run time looking at the environment variable * SERVER_SOFTWARE we decide which of these to use. */ struct webServerSpecific { char *name; /* Make a good name for a temp file. */ void (*makeTempName)(struct tempName *tn, char *base, char *suffix); /* Return directory to look for cgi in. */ char * (*cgiDir)(); #ifdef NEVER /* Return cgi suffix. */ char * (*cgiSuffix)(); #endif /* NEVER */ /* Return relative speed of CPU. (UCSC CSE 1999 FTP machine is 1.0) */ double (*speed)(); /* The relative path to trash directory for CGI binaries */ char * (*trashDir)(); }; extern struct webServerSpecific wssMicrosoftII, wssMicrosoftPWS, wssDefault, wssLinux, wssCommandLine, wssBrcMcw; char *rTempName(char *dir, char *base, char *suffix); /* Make a temp name that's almost certainly unique. */ rtracklayer/src/ucsc/rangeTree.c0000644000126300012640000002252412227135242020271 0ustar00biocbuildphs_compbio/* rangeTree - This module is a way of keeping track of * non-overlapping ranges (half-open intervals). It is * based on the self-balancing rbTree code. Use it in * place of a bitmap when the total number of ranges * is significantly smaller than the number of bits would * be. * Beware the several static/global variables which can be * changed by various function calls. */ #include "common.h" #include "limits.h" #include "localmem.h" #include "obscure.h" #include "rbTree.h" #include "rangeTree.h" static char const rcsid[] = "$Id: rangeTree.c,v 1.24 2009/02/01 01:34:21 kent Exp $"; int rangeCmp(void *va, void *vb) /* Return -1 if a before b, 0 if a and b overlap, * and 1 if a after b. */ { struct range *a = va; struct range *b = vb; if (a->end <= b->start) return -1; else if (b->end <= a->start) return 1; else return 0; } static void *sumInt(void *a, void *b) /* Local function used by rangeTreeAddValCount, which sums two ints a and b, * referenced by void pointers, returning the result in a */ { int *i = a, *j = b; *i += *j; return a; } struct range *rangeTreeAddVal(struct rbTree *tree, int start, int end, void *val, void *(*mergeVals)(void *existingVal, void *newVal) ) /* Add range to tree, merging with existing ranges if need be. * If this is a new range, set the value to this val. * If there are existing items for this range, and if mergeVals function is not null, * apply mergeVals to the existing values and this new val, storing the result as the val * for this range (see rangeTreeAddValCount() and rangeTreeAddValList() below for examples). */ { struct range *r, *existing; r = lmAlloc(tree->lm, sizeof(*r)); /* alloc new zeroed range */ r->start = start; r->end = end; r->val = val; while ((existing = rbTreeRemove(tree, r)) != NULL) { r->start = min(r->start, existing->start); r->end = max(r->end, existing->end); if (mergeVals) r->val = mergeVals(existing->val, r->val); } rbTreeAdd(tree, r); return r; } struct range *rangeTreeAdd(struct rbTree *tree, int start, int end) /* Add range to tree, merging with existing ranges if need be. */ { return rangeTreeAddVal(tree, start, end, NULL, NULL); } struct range *rangeTreeAddValCount(struct rbTree *tree, int start, int end) /* Add range to tree, merging with existing ranges if need be. * Set range val to count of elements in the range. Counts are pointers to * ints allocated in tree localmem */ { int *a = lmAlloc(tree->lm, sizeof(*a)); /* keep the count in localmem */ *a = 1; return rangeTreeAddVal(tree, start, end, (void *)a, sumInt); } struct range *rangeTreeAddValList(struct rbTree *tree, int start, int end, void *val) /* Add range to tree, merging with existing ranges if need be. * Add val to the list of values (if any) in each range. * val must be valid argument to slCat (ie, be a struct with a 'next' pointer as its first member) */ { return rangeTreeAddVal(tree, start, end, val, slCat); } void rangeTreeAddToCoverageDepth(struct rbTree *tree, int start, int end) /* Add area from start to end to a tree that is being built up to store the * depth of coverage. Recover coverage back out by looking at ptToInt(range->val) * on tree elements. */ { struct range q; q.start = start; q.end = end; struct range *r, *existing = rbTreeFind(tree, &q); if (existing == NULL) { lmAllocVar(tree->lm, r); r->start = start; r->end = end; r->val = intToPt(1); rbTreeAdd(tree, r); } else { if (existing->start <= start && existing->end >= end) /* The existing one completely encompasses us */ { /* Make a new section for the bit before start. */ if (existing->start < start) { lmAllocVar(tree->lm, r); r->start = existing->start; r->end = start; r->val = existing->val; existing->start = start; rbTreeAdd(tree, r); } /* Make a new section for the bit after end. */ if (existing->end > end) { lmAllocVar(tree->lm, r); r->start = end; r->end = existing->end; r->val = existing->val; existing->end = end; rbTreeAdd(tree, r); } /* Increment existing section in overlapping area. */ existing->val = (char *)(existing->val) + 1; } else /* In general case fetch list of regions that overlap us. Remaining cases to handle are: r >> e rrrrrrrrrrrrrrrrrrrr eeeeeeeeee e < r rrrrrrrrrrrrrrr eeeeeeeeeeee r < e rrrrrrrrrrrr eeeeeeeeeeeee */ { struct range *existingList = rangeTreeAllOverlapping(tree, start, end); #ifdef DEBUG /* Make sure that list is really sorted for debugging... */ int lastStart = existingList->start; for (r = existingList; r != NULL; r = r->next) { int start = r->start; if (start < lastStart) internalErr(); } #endif /* DEBUG */ int s = start, e = end; for (existing = existingList; existing != NULL; existing = existing->next) { /* Deal with start of new range that comes before existing */ if (s < existing->start) { lmAllocVar(tree->lm, r); r->start = s; r->end = existing->start; r->val = intToPt(1); s = existing->start; rbTreeAdd(tree, r); } else if (s > existing->start) { lmAllocVar(tree->lm, r); r->start = existing->start; r->end = s; r->val = existing->val; existing->start = s; rbTreeAdd(tree, r); } existing->val = (char *)(existing->val) + 1; s = existing->end; } if (s < e) /* Deal with end of new range that doesn't overlap with anything. */ { lmAllocVar(tree->lm, r); r->start = s; r->end = e; r->val = intToPt(1); rbTreeAdd(tree, r); } } } } boolean rangeTreeOverlaps(struct rbTree *tree, int start, int end) /* Return TRUE if start-end overlaps anything in tree */ { struct range tempR; tempR.start = start; tempR.end = end; tempR.val = NULL; return rbTreeFind(tree, &tempR) != NULL; } static struct range *rangeList; static void rangeListAdd(void *v) /* Callback to add item to range list. */ { struct range *r = v; slAddHead(&rangeList, r); } struct range *rangeTreeList(struct rbTree *tree) /* Return list of all ranges in tree in order. Not thread safe. * No need to free this when done, memory is local to tree. */ { rangeList = NULL; rbTreeTraverse(tree, rangeListAdd); slReverse(&rangeList); return rangeList; } struct range *rangeTreeFindEnclosing(struct rbTree *tree, int start, int end) /* Find item in range tree that encloses range between start and end * if there is any such item. */ { struct range tempR, *r; tempR.start = start; tempR.end = end; r = rbTreeFind(tree, &tempR); if (r != NULL && r->start <= start && r->end >= end) { r->next = NULL; /* this can be set by previous calls to the List functions */ return r; } return NULL; } struct range *rangeTreeAllOverlapping(struct rbTree *tree, int start, int end) /* Return list of all items in range tree that overlap interval start-end. * Do not free this list, it is owned by tree. However it is only good until * next call to rangeTreeFindInRange or rangeTreeList. Not thread safe. */ { struct range tempR; tempR.start = start; tempR.end = end; rangeList = NULL; rbTreeTraverseRange(tree, &tempR, &tempR, rangeListAdd); slReverse(&rangeList); return rangeList; } struct range *rangeTreeMaxOverlapping(struct rbTree *tree, int start, int end) /* Return item that overlaps most with start-end. Not thread safe. Trashes list used * by rangeTreeAllOverlapping. */ { struct range *range, *best = NULL; int bestOverlap = 0; for (range = rangeTreeAllOverlapping(tree, start, end); range != NULL; range = range->next) { int overlap = rangeIntersection(range->start, range->end, start, end); if (overlap > bestOverlap) { bestOverlap = overlap; best = range; } } if (best) best->next = NULL; /* could be set by calls to List functions */ return best; } /* A couple of variables used to calculate total overlap. */ static int totalOverlap; static int overlapStart, overlapEnd; static void addOverlap(void *v) /* Callback to add item to range list. */ { struct range *r = v; totalOverlap += positiveRangeIntersection(r->start, r->end, overlapStart, overlapEnd); } int rangeTreeOverlapSize(struct rbTree *tree, int start, int end) /* Return the total size of intersection between interval * from start to end, and items in range tree. Sadly not * thread-safe. * On 32 bit machines be careful not to overflow * range of start, end or total size return value. */ { struct range tempR; tempR.start = overlapStart = start; tempR.end = overlapEnd = end; totalOverlap = 0; rbTreeTraverseRange(tree, &tempR, &tempR, addOverlap); return totalOverlap; } int rangeTreeOverlapTotalSize(struct rbTree *tree) /* Return the total size of all ranges in range tree. * Sadly not thread-safe. * On 32 bit machines be careful not to overflow * range of start, end or total size return value. */ { return rangeTreeOverlapSize(tree, INT_MIN, INT_MAX); } struct rbTree *rangeTreeNew() /* Create a new, empty, rangeTree. */ { return rbTreeNew(rangeCmp); } struct rbTree *rangeTreeNewDetailed(struct lm *lm, struct rbTreeNode *stack[128]) /* Allocate rangeTree on an existing local memory & stack. This is for cases * where you want a lot of trees, and don't want the overhead for each one. * Note, to clean these up, just do freez(&rbTree) rather than rbFreeTree(&rbTree). */ { return rbTreeNewDetailed(rangeCmp, lm, stack); } rtracklayer/src/ucsc/rangeTree.h0000644000126300012640000001021012227135242020263 0ustar00biocbuildphs_compbio/* rangeTree - This module is a way of keeping track of * non-overlapping ranges (half-open intervals). It is * based on the self-balancing rbTree code. Use it in * place of a bitmap when the total number of ranges * is significantly smaller than the number of bits would * be. */ #ifndef RANGETREE_H #define RANGETREE_H #ifndef RBTREE_H #include "rbTree.h" #endif struct range /* An interval in a list of intervals. */ { struct range *next; int start,end; /* Zero based half open interval. */ void *val; /* Some value associated with range. */ }; struct rbTree *rangeTreeNew(); /* Create a new, empty, rangeTree. Free with rbFreeTree. */ #define rangeTreeFree(a) rbTreeFree(a) /* Free up range tree. */ int rangeCmp(void *va, void *vb); /* Return -1 if a before b, 0 if a and b overlap, * and 1 if a after b. */ struct range *rangeTreeAddVal(struct rbTree *tree, int start, int end, void *val, void *(*mergeVals)(void *existingVal, void *newVal) ); /* Add range to tree, merging with existing ranges if need be. * If this is a new range, set the value to this val. * If there are existing items for this range, and if mergeVals function is not null, * apply mergeVals to the existing values and this new val, storing the result as the val * for this range (see rangeTreeAddValCount() and rangeTreeAddValList() below for examples). */ struct range *rangeTreeAdd(struct rbTree *tree, int start, int end); /* Add range to tree, merging with existing ranges if need be. */ struct range *rangeTreeAddValCount(struct rbTree *tree, int start, int end); /* Add range to tree, merging with existing ranges if need be. * Set range val to count of elements in the range. Counts are pointers to * ints allocated in tree localmem */ struct range *rangeTreeAddValList(struct rbTree *tree, int start, int end, void *val); /* Add range to tree, merging with existing ranges if need be. * Add val to the list of values (if any) in each range. * val must be valid argument to slCat (ie, be a struct with a 'next' pointer as its first member) */ void rangeTreeAddToCoverageDepth(struct rbTree *tree, int start, int end); /* Add area from start to end to a tree that is being built up to store the * depth of coverage. Recover coverage back out by looking at ptToInt(range->val) * on tree elements. */ boolean rangeTreeOverlaps(struct rbTree *tree, int start, int end); /* Return TRUE if start-end overlaps anything in tree */ int rangeTreeOverlapSize(struct rbTree *tree, int start, int end); /* Return the total size of intersection between interval * from start to end, and items in range tree. Sadly not * thread-safe. * On 32 bit machines be careful not to overflow * range of start, end or total size return value. */ int rangeTreeOverlapTotalSize(struct rbTree *tree); /* Return the total size of all ranges in range tree. * Sadly not thread-safe. * On 32 bit machines be careful not to overflow * range of start, end or total size return value. */ struct range *rangeTreeFindEnclosing(struct rbTree *tree, int start, int end); /* Find item in range tree that encloses range between start and end * if there is any such item. */ struct range *rangeTreeAllOverlapping(struct rbTree *tree, int start, int end); /* Return list of all items in range tree that overlap interval start-end. * Do not free this list, it is owned by tree. However it is only good until * next call to rangeTreeFindInRange or rangTreeList. Not thread safe. */ struct range *rangeTreeMaxOverlapping(struct rbTree *tree, int start, int end); /* Return item that overlaps most with start-end. Not thread safe. Trashes list used * by rangeTreeAllOverlapping. */ struct range *rangeTreeList(struct rbTree *tree); /* Return list of all ranges in tree in order. Not thread safe. * No need to free this when done, memory is local to tree. */ struct rbTree *rangeTreeNewDetailed(struct lm *lm, struct rbTreeNode *stack[128]); /* Allocate rangeTree on an existing local memory & stack. This is for cases * where you want a lot of trees, and don't want the overhead for each one. * Note, to clean these up, just do freez(&rbTree) rather than rbFreeTree(&rbTree). */ #endif /* RANGETREE_H */ rtracklayer/src/ucsc/rbTree.c0000644000126300012640000004232712227135242017603 0ustar00biocbuildphs_compbio/* rbTree - rbTreeRed-rbTreeBlack Tree - a type of binary tree which * automatically keeps relatively balanced during * inserts and deletions. * original author: Shane Saunders * adapted into local conventions: Jim Kent */ #include "common.h" #include "localmem.h" #include "rbTree.h" static char const rcsid[] = "$Id: rbTree.c,v 1.12 2008/10/16 02:39:51 kent Exp $"; static struct rbTreeNode *restructure(struct rbTree *t, int tos, struct rbTreeNode *x, struct rbTreeNode *y, struct rbTreeNode *z) /* General restructuring function - checks for all * restructuring cases. Call when insert has messed up tree. * Sadly delete has to do even more work. */ { struct rbTreeNode *parent, *midNode; if(y == x->left) { if(z == y->left) { /* in-order: z, y, x */ midNode = y; y->left = z; x->left = y->right; y->right = x; } else { /* in-order: y, z, x */ midNode = z; y->right = z->left; z->left = y; x->left = z->right; z->right = x; } } else { if(z == y->left) { /* in-order: x, z, y */ midNode = z; x->right = z->left; z->left = x; y->left = z->right; z->right = y; } else { /* in-order: x, y, z */ midNode = y; x->right = y->left; y->left = x; y->right = z; } } if(tos != 0) { parent = t->stack[tos-1]; if(x == parent->left) parent->left = midNode; else parent->right = midNode; } else t->root = midNode; return midNode; } struct rbTree *rbTreeNewDetailed(int (*compare)(void *, void *), struct lm *lm, struct rbTreeNode *stack[128]) /* Allocate rbTree on an existing local memory & stack. This is for cases * where you want a lot of trees, and don't want the overhead for each one. * Note, to clean these up, just do freez(&rbTree) rather than rbFreeTree(&rbTree). */ { struct rbTree *t; AllocVar(t); t->root = NULL; t->compare = compare; t->lm = lm; t->stack = stack; t->n = 0; return t; } struct rbTree *rbTreeNew(int (*compare)(void *, void *)) /* rbTreeNew() - Allocates space for a red-black tree and returns a pointer * to it. The function compare compares they keys of two items, and returns a * negative, zero, or positive integer depending on whether the first item is * less than, equal to, or greater than the second. */ { /* The stack keeps us from having to keep explicit * parent, grandparent, greatgrandparent variables. * It needs to be big enough for the maximum depth * of tree. Since the whole point of rb trees is * that they are self-balancing, this is not all * that deep, just 2*log2(N). Therefore a stack of * 128 is good for up to 2^64 items in stack, which * should keep us for the next couple of decades... */ struct lm *lm = lmInit(0); struct rbTreeNode **stack = lmAlloc(lm, 128 * sizeof(stack[0])); return rbTreeNewDetailed(compare, lm, stack); } void rbTreeFree(struct rbTree **pTree) /* rbTreeFree() - Frees space used by the red-black tree pointed to by t. */ { struct rbTree *tree = *pTree; if (tree != NULL) { lmCleanup(&tree->lm); freez(pTree); } } void rbTreeFreeList(struct rbTree **pList) /* Free up a list of rbTrees. */ { struct rbTree *tree, *next; for (tree = *pList; tree != NULL; tree = next) { next = tree->next; rbTreeFree(&tree); } } void *rbTreeAdd(struct rbTree *t, void *item) /* rbTreeAdd() - Inserts an item into the red-black tree pointed to by t, * according the the value its key. The key of an item in the red-black * tree must be unique among items in the tree. If an item with the same key * already exists in the tree, a pointer to that item is returned. Otherwise, * NULL is returned, indicating insertion was successful. */ { struct rbTreeNode *x, *p, *q, *m, **attachX; int (* compare)(void *, void *); int cmpResult; rbTreeColor col; struct rbTreeNode **stack = NULL; int tos; tos = 0; if((p = t->root) != NULL) { compare = t->compare; stack = t->stack; /* Repeatedly explore either the left branch or the right branch * depending on the value of the key, until an empty branch is chosen. */ for(;;) { stack[tos++] = p; cmpResult = compare(item, p->item); if(cmpResult < 0) { p = p->left; if(!p) { p = stack[--tos]; attachX = &p->left; break; } } else if(cmpResult > 0) { p = p->right; if(!p) { p = stack[--tos]; attachX = &p->right; break; } } else { return p->item; } } col = rbTreeRed; } else { attachX = &t->root; col = rbTreeBlack; } /* Allocate new node and place it in tree. */ if ((x = t->freeList) != NULL) t->freeList = x->right; else lmAllocVar(t->lm, x); x->left = x->right = NULL; x->item = item; x->color = col; *attachX = x; t->n++; /* Restructuring or recolouring will be needed if node x and its parent, p, * are both red. */ if(tos > 0) { while(p->color == rbTreeRed) { /* Double red problem. */ /* Obtain a pointer to p's parent, m, and sibling, q. */ m = stack[--tos]; q = p == m->left ? m->right : m->left; /* Determine whether restructuring or recolouring is needed. */ if(!q || q->color == rbTreeBlack) { /* Sibling is black. ==> Perform restructuring. */ /* Restructure according to the left to right order, of nodes * m, p, and x. */ m = restructure(t, tos, m, p, x); m->color = rbTreeBlack; m->left->color = m->right->color = rbTreeRed; /* Restructuring eliminates the double red problem. */ break; } /* else just need to flip color */ /* Sibling is also red. ==> Perform recolouring. */ p->color = rbTreeBlack; q->color = rbTreeBlack; if(tos == 0) break; /* The root node always remains black. */ m->color = rbTreeRed; /* Continue, checking colouring higher up. */ x = m; p = stack[--tos]; } } return NULL; } void *rbTreeFind(struct rbTree *t, void *item) /* rbTreeFind() - Find an item in the red-black tree with the same key as the * item pointed to by `item'. Returns a pointer to the item found, or NULL * if no item was found. */ { struct rbTreeNode *p, *nextP; int (*compare)(void *, void *) = t->compare; int cmpResult; /* Repeatedly explore either the left or right branch, depending on the * value of the key, until the correct item is found. */ for (p = t->root; p != NULL; p = nextP) { cmpResult = compare(item, p->item); if(cmpResult < 0) nextP = p->left; else if(cmpResult > 0) nextP = p->right; else return p->item; } return NULL; } void *rbTreeRemove(struct rbTree *t, void *item) /* rbTreeRemove() - Delete an item in the red-black tree with the same key as * the item pointed to by `item'. Returns a pointer to the deleted item, * and NULL if no item was found. */ { struct rbTreeNode *p, *r, *x, *y, *z, *b, *newY; struct rbTreeNode *m; rbTreeColor removeCol; void *returnItem; int (* compare)(void *, void *); int cmpResult; struct rbTreeNode **stack; int i, tos; /* Attempt to locate the item to be deleted. */ if((p = t->root)) { compare = t->compare; stack = t->stack; tos = 0; for(;;) { stack[tos++] = p; cmpResult = compare(item, p->item); if(cmpResult < 0) p = p->left; else if(cmpResult > 0) p = p->right; else /* Item found. */ break; if(!p) return NULL; } } else return NULL; /* p points to the node to be deleted, and is currently on the top of the * stack. */ if(!p->left) { tos--; /* Adjust tos to remove p. */ /* Right child replaces p. */ if(tos == 0) { r = t->root = p->right; x = y = NULL; } else { x = stack[--tos]; if(p == x->left) { r = x->left = p->right; y = x->right; } else { r = x->right = p->right; y = x->left; } } removeCol = p->color; } else if(!p->right) { tos--; /* Adjust tos to remove p. */ /* Left child replaces p. */ if(tos == 0) { r = t->root = p->left; x = y = NULL; } else { x = stack[--tos]; if(p == x->left) { r = x->left = p->left; y = x->right; } else { r = x->right = p->left; y = x->left; } } removeCol = p->color; } else { /* Save p's stack position. */ i = tos-1; /* Minimum child, m, in the right subtree replaces p. */ m = p->right; do { stack[tos++] = m; m = m->left; } while(m); m = stack[--tos]; /* Update either the left or right child pointers of p's parent. */ if(i == 0) { t->root = m; } else { x = stack[i-1]; /* p's parent. */ if(p == x->left) { x->left = m; } else { x->right = m; } } /* Update the tree part m is removed from, and assign m the child * pointers of p (only if m is not the right child of p). */ stack[i] = m; /* Node m replaces node p on the stack. */ x = stack[--tos]; r = m->right; if(tos != i) { /* x is equal to the parent of m. */ y = x->right; x->left = r; m->right = p->right; } else { /* m was the right child of p, and x is equal to m. */ y = p->left; } m->left = p->left; /* We treat node m as the node which has been removed. */ removeCol = m->color; m->color = p->color; } /* Get return value and reuse the space used by node p. */ returnItem = p->item; p->right = t->freeList; t->freeList = p; t->n--; /* The pointers x, y, and r point to nodes which may be involved in * restructuring and recolouring. * x - the parent of the removed node. * y - the sibling of the removed node. * r - the node which replaced the removed node. * From the above code, the next entry off the stack will be the parent of * node x. */ /* The number of black nodes on paths to all external nodes (NULL child * pointers) must remain the same for all paths. Restructuring or * recolouring of nodes may be necessary to enforce this. */ if(removeCol == rbTreeBlack) { /* Removal of a black node requires some adjustment. */ if(!r || r->color == rbTreeBlack) { /* A black node replaced the deleted black node. Note that * external nodes (NULL child pointers) are always black, so * if r is NULL it is treated as a black node. */ /* This causes a double-black problem, since node r would need to * be coloured double-black in order for the black color on * paths through r to remain the same as for other paths. */ /* If r is the root node, the double-black color is not necessary * to maintain the color balance. Otherwise, some adjustment of * nearby nodes is needed in order to eliminate the double-black * problem. NOTE: x points to the parent of r. */ if(x) for(;;) { /* There are three adjustment cases: * 1. r's sibling, y, is black and has a red child, z. * 2. r's sibling, y, is black and has two black children. * 3. r's sibling, y, is red. */ if(y->color == rbTreeBlack) { /* Note the conditional evaluation for assigning z. */ if(((z = y->left) && z->color == rbTreeRed) || ((z = y->right) && z->color == rbTreeRed)) { /* Case 1: perform a restructuring of nodes x, y, and * z. */ b = restructure(t, tos, x, y, z); b->color = x->color; b->left->color = b->right->color = rbTreeBlack; break; } else { /* Case 2: recolour node y red. */ y->color = rbTreeRed; if(x->color == rbTreeRed) { x->color = rbTreeBlack; break; } /* else */ if(tos == 0) break; /* Root level reached. */ /* else */ r = x; x = stack[--tos]; /* x <- parent of x. */ y = x->left == r ? x->right : x->left; } } else { /* Case 3: Restructure nodes x, y, and z, where: * - If node y is the left child of x, then z is the left * child of y. Otherwise z is the right child of y. */ if(x->left == y) { newY = y->right; z = y->left; } else { newY = y->left; z = y->right; } restructure(t, tos, x, y, z); y->color = rbTreeBlack; x->color = rbTreeRed; /* Since x has moved down a place in the tree, and y is the * new the parent of x, the stack must be adjusted so that * the parent of x is correctly identified in the next call * to restructure(). */ stack[tos++] = y; /* After restructuring, node r has a black sibling, newY, * so either case 1 or case 2 applies. If case 2 applies * the double-black problem does not reappear. */ y = newY; /* Note the conditional evaluation for assigning z. */ if(((z = y->left) && z->color == rbTreeRed) || ((z = y->right) && z->color == rbTreeRed)) { /* Case 1: perform a restructuring of nodes x, y, and * z. */ b = restructure(t, tos, x, y, z); b->color = rbTreeRed; /* Since node x was red. */ b->left->color = b->right->color = rbTreeBlack; } else { /* Case 2: recolour node y red. */ /* Note that node y is black and node x is red. */ y->color = rbTreeRed; x->color = rbTreeBlack; } break; } } } else { /* A red node replaced the deleted black node. */ /* In this case we can simply color the red node black. */ r->color = rbTreeBlack; } } return returnItem; } /* Some variables to help recursively dump tree. */ static int dumpLevel; /* Indentation level. */ static FILE *dumpFile; /* Output file */ static void (*dumpIt)(void *item, FILE *f); /* Item dumper. */ static void rTreeDump(struct rbTreeNode *n) /* Recursively dump. */ { if (n == NULL) return; spaceOut(dumpFile, ++dumpLevel * 3); fprintf(dumpFile, "%c ", (n->color == rbTreeRed ? 'r' : 'b')); dumpIt(n->item, dumpFile); fprintf(dumpFile, "\n"); rTreeDump(n->left); rTreeDump(n->right); --dumpLevel; } void rbTreeDump(struct rbTree *tree, FILE *f, void (*dumpItem)(void *item, FILE *f)) /* Dump out rb tree to file, mostly for debugging. */ { dumpFile = f; dumpLevel = 0; dumpIt = dumpItem; fprintf(f, "rbTreeDump\n"); rTreeDump(tree->root); } /* Variables to help recursively traverse tree. */ static void (*doIt)(void *item); static void *minIt, *maxIt; static int (*compareIt)(void *, void *); static void rTreeTraverseRange(struct rbTreeNode *n) /* Recursively traverse tree in range applying doIt. */ { if (n != NULL) { int minCmp = compareIt(n->item, minIt); int maxCmp = compareIt(n->item, maxIt); if (minCmp >= 0) rTreeTraverseRange(n->left); if (minCmp >= 0 && maxCmp <= 0) doIt(n->item); if (maxCmp <= 0) rTreeTraverseRange(n->right); } } static void rTreeTraverse(struct rbTreeNode *n) /* Recursively traverse full tree applying doIt. */ { if (n != NULL) { rTreeTraverse(n->left); doIt(n->item); rTreeTraverse(n->right); } } void rbTreeTraverseRange(struct rbTree *tree, void *minItem, void *maxItem, void (*doItem)(void *item)) /* Apply doItem function to all items in tree such that * minItem <= item <= maxItem */ { doIt = doItem; minIt = minItem; maxIt = maxItem; compareIt = tree->compare; rTreeTraverseRange(tree->root); } void rbTreeTraverse(struct rbTree *tree, void (*doItem)(void *item)) /* Apply doItem function to all items in tree */ { doIt = doItem; rTreeTraverse(tree->root); } struct rTreeContext /* Context for traversing a tree when you want to be fully thread safe and reentrant. */ { void *context; /* Some context carried from user and passed to doIt. */ void (*doItem)(void *item, void *context); }; static void rTreeTraverseWithContext(struct rbTreeNode *n, struct rTreeContext *context) /* Traverse tree with a little context so don't need little static variables that * prevent reentrancy of callback functions. */ { if (n != NULL) { rTreeTraverseWithContext(n->left, context); context->doItem(n->item, context->context); rTreeTraverseWithContext(n->right, context); } } void rbTreeTraverseWithContext(struct rbTree *tree, void (*doItem)(void *item, void *context), void *context) /* Traverse tree calling doItem on every item with context pointer passed through to doItem. * This often avoids having to declare global or static variables for the doItem callback to use. */ { struct rTreeContext ctx; ctx.context = context; ctx.doItem = doItem; rTreeTraverseWithContext(tree->root, &ctx); } struct slRef *itList; /* List of items that rbTreeItemsInRange returns. */ static void addRef(void *item) /* Add item it itList. */ { refAdd(&itList, item); } struct slRef *rbTreeItemsInRange(struct rbTree *tree, void *minItem, void *maxItem) /* Return a sorted list of references to items in tree between range. * slFreeList this list when done. */ { itList = NULL; rbTreeTraverseRange(tree, minItem, maxItem, addRef); slReverse(&itList); return itList; } static void addRefWithContext(void *item, void *context) /* Add item it itList. */ { struct slRef **pList = context; refAdd(pList, item); } struct slRef *rbTreeItems(struct rbTree *tree) /* Return sorted list of items. slFreeList this when done.*/ { struct slRef *list = NULL; rbTreeTraverseWithContext(tree, addRefWithContext, &list); slReverse(&list); return list; } int rbTreeCmpString(void *a, void *b) /* Set up rbTree so as to work on strings. */ { return strcmp(a, b); } int rbTreeCmpWord(void *a, void *b) /* Set up rbTree so as to work on case-insensitive strings. */ { return differentWord(a,b); } rtracklayer/src/ucsc/rbTree.h0000644000126300012640000000773012227135242017607 0ustar00biocbuildphs_compbio/* rbTree - rbTreeRed-rbTreeBlack Tree - a type of binary tree which * automatically keeps relatively balanced during * inserts and deletions. * original author: Shane Saunders * adapted into local conventions: Jim Kent */ #ifndef RBTREE_H #define RBTREE_H typedef enum {rbTreeRed,rbTreeBlack} rbTreeColor; /* Structure type for nodes in the red-black tree. */ struct rbTreeNode { struct rbTreeNode *left, *right; /* Children. */ rbTreeColor color; /* Heart of algorithm. */ void *item; /* Item stored in tree */ }; /* Structure type for the red-black tree. */ struct rbTree { struct rbTree *next; /* Next tree in list. */ struct rbTreeNode *root; /* Root of tree */ int n; /* Number of items in tree. */ int (* compare)(void *, void *);/* Comparison function */ struct rbTreeNode **stack; /* Ancestor stack. */ struct lm *lm; /* Local memory pool. */ struct rbTreeNode *freeList; /* List of nodes to reuse. */ }; struct rbTree *rbTreeNew(int (*compare)(void *, void *)); /* Allocates space for a red-black tree and returns a pointer * to it. The function compare compares they keys of two items, and returns a * negative, zero, or positive integer depending on whether the first item is * less than, equal to, or greater than the second. */ void rbTreeFree(struct rbTree **pTree); /* Frees space used by the red-black tree pointed to by t. */ void rbTreeFreeList(struct rbTree **pList); /* Free up a list of rbTrees. */ struct rbTree *rbTreeNewDetailed(int (*compare)(void *, void *), struct lm *lm, struct rbTreeNode *stack[128]); /* Allocate rbTree on an existing local memory & stack. This is for cases * where you want a lot of trees, and don't want the overhead for each one. * Note, to clean these up, just do freez(&rbTree) rather than rbFreeTree(&rbTree). */ void *rbTreeAdd(struct rbTree *t, void *item); /* Inserts an item into the red-black tree pointed to by t, * according the the value its key. The key of an item in the red-black * tree must be unique among items in the tree. If an item with the same key * already exists in the tree, a pointer to that item is returned. Otherwise, * NULL is returned, indicating insertion was successful. */ void *rbTreeFind(struct rbTree *t, void *item); /* Find an item in the red-black tree with the same key as the * item pointed to by `item'. Returns a pointer to the item found, or NULL * if no item was found. */ void *rbTreeRemove(struct rbTree *t, void *item); /* rbTreeRemove() - Delete an item in the red-black tree with the same key as * the item pointed to by `item'. Returns a pointer to the deleted item, * and NULL if no item was found. */ void rbTreeTraverseRange(struct rbTree *tree, void *minItem, void *maxItem, void (*doItem)(void *item)); /* Apply doItem function to all items in tree such that * minItem <= item <= maxItem */ struct slRef *rbTreeItemsInRange(struct rbTree *tree, void *minItem, void *maxItem); /* Return a sorted list of references to items in tree between range. * slFreeList this list when done. */ void rbTreeTraverse(struct rbTree *tree, void (*doItem)(void *item)); /* Apply doItem function to all items in tree */ void rbTreeTraverseWithContext(struct rbTree *tree, void (*doItem)(void *item, void *context), void *context); /* Traverse tree calling doItem on every item with context pointer passed through to doItem. * This often avoids having to declare global or static variables for the doItem callback to use. */ struct slRef *rbTreeItems(struct rbTree *tree); /* Return sorted list of items. slFreeList this when done.*/ void rbTreeDump(struct rbTree *tree, FILE *f, void (*dumpItem)(void *item, FILE *f)); /* Dump out rb tree to file, mostly for debugging. */ int rbTreeCmpString(void *a, void *b); /* Set up rbTree so as to work on strings. */ int rbTreeCmpWord(void *a, void *b); /* Set up rbTree so as to work on case-insensitive strings. */ #endif /* RBTREE_H */ rtracklayer/src/ucsc/sig.h0000644000126300012640000000625212227135242017144 0ustar00biocbuildphs_compbio/***************************************************************************** * Copyright (C) 2000 Jim Kent. This source code may be freely used * * for personal, academic, and non-profit purposes. Commercial use * * permitted only by explicit agreement with Jim Kent (jim_kent@pacbell.net) * *****************************************************************************/ /* Sig.h - signatures that start various binary files. */ #ifndef SIG_H #define SIG_H #define aliSig 0xCDAB8245 /* Binary alignment file. */ #define alxSig 0xA1B1C1D3 /* Index into binary alignment file, sorted by start base offset. */ #define pgoSig 0x690 /* Index into GDF file, sorted by start base offset. Signature is 32 bit. */ #define cdoSig 0xCD01 /* Index into c2g text file, sorted by start base offset. 32 bit signature. */ #define xaoSig 0xA0B0C0D0 /* Index into xeno alignment, sorted by start base offset. 32 bit signature. */ #define glSig 0xF1E2D3C4 /* Binary gene file, sorted by chromosome and then starting offset. */ /* IX sig is int ixSig[4] = {0x693F8ED1, 0x7EDA1C32, 0x4BA58983, 0x277CB89C,}; * These are made by snofMake, and are indexes sorted by name. */ /* XI - same as IX but on big-endian (or is it little-endian) archetectures. */ #define nt4Signature 0x12345678 /* Signature at the beginning of an nt4 file - 2 bit a nucleotide binary file. */ #define lm2Signature 0x12131416 /* Signature at the beginning of a lm2 file - a 2nd order markov model for nucleotides. */ #define oocSig 0x584155f2 /* Signature of file that contains over-represented oligomers for patSpace * algorithm. */ #define oocSigSwapped 0xf2554158 /* Signature of file that contains over-represented oligomers for patSpace * algorithm. */ #define fofSig 0x13410da8 /* Signature into fof type index file (that can index multiple external files). */ #define nibSig 0x6BE93D3A /* Signature into nib file (4 bits per nucleotide DNA file) */ #define qacSig 0x32b67998 /* Signature of qac file (compressed quality file) */ #define caqSig 0x9879b632 /* Signature of byte-swapped qac file. */ #define twoBitSig 0x1A412743 /* Signature into 2bit file (2 bits per nucleotide DNA file) plus * information on N and masked bases. */ #define twoBitSwapSig 0x4327411A /* Signature of byte-swapped two-bit file. */ #define chromGraphSig 0x4528421C /* Signature of chromGraph binary data file */ #define chromGraphSwapSig 0x1C422845 /* Signature of byte-swapped chromGraph binary data file */ #define genomeRangeTreeSig 0xf7fb8104 /* Signature of genomeRangeTree binary data file */ #define genomeRangeTreeSwapSig 0x0481fbf7 /* Signature of genomeRangeTree binary data file */ #define bptSig 0x78CA8C91 /* Signature of generic b+ tree index file. */ #define bptSwapped 0x918CCA78 /* Signature of generic b+ tree index file. */ #define cirTreeSig 0x2468ACE0 /* Signature of a chromosome id r-tree index file. */ #define crTreeSig 0x2369ADE1 /* Signature of a chromosome r-tree index file. */ #define bigWigSig 0x888FFC26 /* Signature for a big wig file. */ #define bigBedSig 0x8789F2EB /* Signature for a big bed file. */ #define udcBitmapSig 0x4187E2F6 /* Signature for a url data cache bitmap file. */ #endif /* SIG_H */ rtracklayer/src/ucsc/sqlNum.c0000644000126300012640000000533612227135242017636 0ustar00biocbuildphs_compbio/* sqlnum.c - Routines to convert from ascii to integer * representation of numbers. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "sqlNum.h" static char const rcsid[] = "$Id: sqlNum.c,v 1.17 2010/05/17 18:01:41 hiram Exp $"; unsigned sqlUnsigned(char *s) /* Convert series of digits to unsigned integer about * twice as fast as atoi (by not having to skip white * space or stop except at the null byte.) */ { unsigned res = 0; char *p = s; char c; while (((c = *(p++)) >= '0') && (c <= '9')) { res *= 10; res += c - '0'; } if (c != '\0') errAbort("invalid unsigned integer: \"%s\"", s); return res; } unsigned long sqlUnsignedLong(char *s) /* Convert series of digits to unsigned long about * twice as fast as atol (by not having to skip white * space or stop except at the null byte.) */ { unsigned long res = 0; char *p = s; char c; while (((c = *(p++)) >= '0') && (c <= '9')) { res *= 10; res += c - '0'; } if (c != '\0') errAbort("invalid unsigned integer: \"%s\"", s); return res; } int sqlSigned(char *s) /* Convert string to signed integer. Unlike atol assumes * all of string is number. */ { int res = 0; char *p, *p0 = s; if (*p0 == '-') p0++; p = p0; while ((*p >= '0') && (*p <= '9')) { res *= 10; res += *p - '0'; p++; } /* test for invalid character, empty, or just a minus */ if ((*p != '\0') || (p == p0)) errAbort("invalid signed integer: \"%s\"", s); if (*s == '-') return -res; else return res; } long long sqlLongLong(char *s) /* Convert string to a long long. Unlike atol assumes all of string is * number. */ { long long res = 0; char *p, *p0 = s; if (*p0 == '-') p0++; p = p0; while ((*p >= '0') && (*p <= '9')) { res *= 10; res += *p - '0'; p++; } /* test for invalid character, empty, or just a minus */ if ((*p != '\0') || (p == p0)) errAbort("invalid signed integer: \"%s\"", s); if (*s == '-') return -res; else return res; } float sqlFloat(char *s) /* Convert string to a float. Assumes all of string is number * and aborts on an error. */ { char* end; /* used to have an ifdef here to use strtof() but that doesn't * actually exist on all systems and since strtod() does, may as * well use it since it will do the job here. */ float val = (float) strtod(s, &end); if ((end == s) || (*end != '\0')) errAbort("invalid float: %s", s); return val; } double sqlDouble(char *s) /* Convert string to a double. Assumes all of string is number * and aborts on an error. */ { char* end; double val = strtod(s, &end); if ((end == s) || (*end != '\0')) errAbort("invalid double: %s", s); return val; } rtracklayer/src/ucsc/sqlNum.h0000644000126300012640000000223312227135242017634 0ustar00biocbuildphs_compbio/* sqlNum.h - routines to convert from ascii to * unsigned/integer a bit more quickly than atoi. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef SQLNUM_H #define SQLNUM_H /* get off_t */ #include unsigned sqlUnsigned(char *s); /* Convert series of digits to unsigned integer about * twice as fast as atoi (by not having to skip white * space or stop except at the null byte.) */ unsigned long sqlUnsignedLong(char *s); /* Convert series of digits to unsigned long about * twice as fast as atol (by not having to skip white * space or stop except at the null byte.) */ int sqlSigned(char *s); /* Convert string to signed integer. Unlike atol assumes * all of string is number. */ long long sqlLongLong(char *s); /* Convert string to a long long. Unlike atol assumes all of string is * number. */ float sqlFloat(char *s); /* Convert string to a float. Assumes all of string is number * and aborts on an error. */ double sqlDouble(char *s); /* Convert string to a double. Assumes all of string is number * and aborts on an error. */ #endif /* SQLNUM_H */ rtracklayer/src/ucsc/twoBit.c0000644000126300012640000006312212227135242017624 0ustar00biocbuildphs_compbio#include "common.h" #include "hash.h" #include "dnaseq.h" #include "dnautil.h" #include "sig.h" #include "localmem.h" #include "linefile.h" #include "obscure.h" #include "bPlusTree.h" #include "twoBit.h" #include static char const rcsid[] = "$Id: twoBit.c,v 1.28 2009/09/23 18:42:29 angie Exp $"; static int countBlocksOfN(char *s, int size) /* Count number of blocks of N's (or n's) in s. */ { int i; boolean isN, lastIsN = FALSE; char c; int blockCount = 0; for (i=0; i> 2); } struct twoBit *twoBitFromDnaSeq(struct dnaSeq *seq, boolean doMask) /* Convert dnaSeq representation in memory to twoBit representation. * If doMask is true interpret lower-case letters as masked. */ { int ubyteSize = packedSize(seq->size); UBYTE *pt; struct twoBit *twoBit; DNA last4[4]; /* Holds few bases. */ DNA *dna; int i, end; /* Allocate structure and fill in name. */ AllocVar(twoBit); pt = AllocArray(twoBit->data, ubyteSize); twoBit->name = cloneString(seq->name); twoBit->size = seq->size; /* Convert to 4-bases per byte representation. */ dna = seq->dna; end = seq->size - 4; for (i=0; isize-i); *pt = packDna4(last4); /* Deal with blocks of N. */ twoBit->nBlockCount = countBlocksOfN(dna, seq->size); if (twoBit->nBlockCount > 0) { AllocArray(twoBit->nStarts, twoBit->nBlockCount); AllocArray(twoBit->nSizes, twoBit->nBlockCount); storeBlocksOfN(dna, seq->size, twoBit->nStarts, twoBit->nSizes); } /* Deal with masking */ if (doMask) { twoBit->maskBlockCount = countBlocksOfLower(dna, seq->size); if (twoBit->maskBlockCount > 0) { AllocArray(twoBit->maskStarts, twoBit->maskBlockCount); AllocArray(twoBit->maskSizes, twoBit->maskBlockCount); storeBlocksOfLower(dna, seq->size, twoBit->maskStarts, twoBit->maskSizes); } } return twoBit; } static int twoBitSizeInFile(struct twoBit *twoBit) /* Figure out size structure will take in file. */ { return packedSize(twoBit->size) + sizeof(twoBit->size) + sizeof(twoBit->nBlockCount) + sizeof(twoBit->nStarts[0]) * twoBit->nBlockCount + sizeof(twoBit->nSizes[0]) * twoBit->nBlockCount + sizeof(twoBit->maskBlockCount) + sizeof(twoBit->maskStarts[0]) * twoBit->maskBlockCount + sizeof(twoBit->maskSizes[0]) * twoBit->maskBlockCount + sizeof(twoBit->reserved); } void twoBitWriteOne(struct twoBit *twoBit, FILE *f) /* Write out one twoBit sequence to binary file. * Note this does not include the name, which is * stored only in index. */ { writeOne(f, twoBit->size); writeOne(f, twoBit->nBlockCount); if (twoBit->nBlockCount > 0) { fwrite(twoBit->nStarts, sizeof(twoBit->nStarts[0]), twoBit->nBlockCount, f); fwrite(twoBit->nSizes, sizeof(twoBit->nSizes[0]), twoBit->nBlockCount, f); } writeOne(f, twoBit->maskBlockCount); if (twoBit->maskBlockCount > 0) { fwrite(twoBit->maskStarts, sizeof(twoBit->maskStarts[0]), twoBit->maskBlockCount, f); fwrite(twoBit->maskSizes, sizeof(twoBit->maskSizes[0]), twoBit->maskBlockCount, f); } writeOne(f, twoBit->reserved); mustWrite(f, twoBit->data, packedSize(twoBit->size)); } void twoBitWriteHeader(struct twoBit *twoBitList, FILE *f) /* Write out header portion of twoBit file, including initial * index */ { bits32 sig = twoBitSig; bits32 version = 0; bits32 seqCount = slCount(twoBitList); bits32 reserved = 0; bits32 offset = 0; struct twoBit *twoBit; long long counter = 0; /* check for 32 bit overflow */ /* Write out fixed parts of header. */ writeOne(f, sig); writeOne(f, version); writeOne(f, seqCount); writeOne(f, reserved); /* Figure out location of first byte past index. * Each index entry contains 4 bytes of offset information * and the name of the sequence, which is variable length. */ offset = sizeof(sig) + sizeof(version) + sizeof(seqCount) + sizeof(reserved); for (twoBit = twoBitList; twoBit != NULL; twoBit = twoBit->next) { int nameLen = strlen(twoBit->name); if (nameLen > 255) errAbort("name %s too long", twoBit->name); offset += nameLen + 1 + sizeof(bits32); } /* Write out index. */ for (twoBit = twoBitList; twoBit != NULL; twoBit = twoBit->next) { int size = twoBitSizeInFile(twoBit); writeString(f, twoBit->name); writeOne(f, offset); offset += size; counter += (long long)size; if (counter > UINT_MAX ) errAbort("Error in faToTwoBit, index overflow at %s. The 2bit format " "does not support indexes larger than %dGb, \n" "please split up into smaller files.\n", twoBit->name, UINT_MAX/1000000000); } } void twoBitClose(struct twoBitFile **pTbf) /* Free up resources associated with twoBitFile. */ { struct twoBitFile *tbf = *pTbf; if (tbf != NULL) { freez(&tbf->fileName); carefulClose(&tbf->f); hashFree(&tbf->hash); /* The indexList is allocated out of the hash's memory pool. */ bptFileClose(&tbf->bpt); freez(pTbf); } } static struct twoBitFile *twoBitOpenReadHeader(char *fileName) /* Open file, read in header but not index. * Squawk and die if there is a problem. */ { bits32 sig; struct twoBitFile *tbf; boolean isSwapped = FALSE; FILE *f = mustOpen(fileName, "rb"); /* Allocate header verify signature, and read in * the constant-length bits. */ AllocVar(tbf); mustReadOne(f, sig); if (sig == twoBitSwapSig) isSwapped = tbf->isSwapped = TRUE; else if (sig != twoBitSig) errAbort("%s doesn't have a valid twoBitSig", fileName); tbf->fileName = cloneString(fileName); tbf->f = f; tbf->version = readBits32(f, isSwapped); if (tbf->version != 0) { errAbort("Can only handle version 0 of this file. This is version %d", (int)tbf->version); } tbf->seqCount = readBits32(f, isSwapped); tbf->reserved = readBits32(f, isSwapped); return tbf; } struct twoBitFile *twoBitOpen(char *fileName) /* Open file, read in header and index. * Squawk and die if there is a problem. */ { struct twoBitFile *tbf = twoBitOpenReadHeader(fileName); struct twoBitIndex *index; boolean isSwapped = tbf->isSwapped; int i; struct hash *hash; FILE *f = tbf->f; /* Read in index. */ hash = tbf->hash = hashNew(digitsBaseTwo(tbf->seqCount)); for (i=0; iseqCount; ++i) { char name[256]; if (!fastReadString(f, name)) errAbort("%s is truncated", fileName); lmAllocVar(hash->lm, index); index->offset = readBits32(f, isSwapped); hashAddSaveName(hash, name, index, &index->name); slAddHead(&tbf->indexList, index); } slReverse(&tbf->indexList); return tbf; } struct twoBitFile *twoBitOpenExternalBptIndex(char *twoBitName, char *bptName) /* Open file, read in header, but not regular index. Instead use * bpt index. Beware if you use this the indexList field will be NULL * as will the hash. */ { struct twoBitFile *tbf = twoBitOpenReadHeader(twoBitName); tbf->bpt = bptFileOpen(bptName); if (tbf->seqCount != tbf->bpt->itemCount) errAbort("%s and %s don't have same number of sequences!", twoBitName, bptName); return tbf; } static int findGreatestLowerBound(int blockCount, bits32 *pos, int val) /* Find index of greatest element in posArray that is less * than or equal to val using a binary search. */ { int startIx=0, endIx=blockCount-1, midIx; int posVal; for (;;) { if (startIx == endIx) { posVal = pos[startIx]; if (posVal <= val || startIx == 0) return startIx; else return startIx-1; } midIx = ((startIx + endIx)>>1); posVal = pos[midIx]; if (posVal < val) startIx = midIx+1; else endIx = midIx; } } static void twoBitSeekTo(struct twoBitFile *tbf, char *name) /* Seek to start of named record. Abort if can't find it. */ { if (tbf->bpt) { bits32 offset; if (!bptFileFind(tbf->bpt, name, strlen(name), &offset, sizeof(offset))) errAbort("%s is not in %s", name, tbf->bpt->fileName); fseek(tbf->f, offset, SEEK_SET); } else { struct twoBitIndex *index = hashFindVal(tbf->hash, name); if (index == NULL) errAbort("%s is not in %s", name, tbf->fileName); fseek(tbf->f, index->offset, SEEK_SET); } } static void readBlockCoords(FILE *f, boolean isSwapped, bits32 *retBlockCount, bits32 **retBlockStarts, bits32 **retBlockSizes) /* Read in blockCount, starts and sizes from file. (Same structure used for * both blocks of N's and masked blocks.) */ { bits32 blkCount = readBits32(f, isSwapped); *retBlockCount = blkCount; if (blkCount == 0) { *retBlockStarts = NULL; *retBlockSizes = NULL; } else { bits32 *nStarts, *nSizes; AllocArray(nStarts, blkCount); AllocArray(nSizes, blkCount); mustRead(f, nStarts, sizeof(nStarts[0]) * blkCount); mustRead(f, nSizes, sizeof(nSizes[0]) * blkCount); if (isSwapped) { int i; for (i=0; iisSwapped; struct twoBit *twoBit; AllocVar(twoBit); twoBit->name = cloneString(name); FILE *f = tbf->f; /* Find offset in index and seek to it */ twoBitSeekTo(tbf, name); /* Read in seqSize. */ twoBit->size = readBits32(f, isSwapped); /* Read in blocks of N. */ readBlockCoords(f, isSwapped, &(twoBit->nBlockCount), &(twoBit->nStarts), &(twoBit->nSizes)); /* Read in masked blocks. */ readBlockCoords(f, isSwapped, &(twoBit->maskBlockCount), &(twoBit->maskStarts), &(twoBit->maskSizes)); /* Reserved word. */ twoBit->reserved = readBits32(f, isSwapped); /* Read in data. */ packByteCount = packedSize(twoBit->size); twoBit->data = needLargeMem(packByteCount); mustRead(f, twoBit->data, packByteCount); return twoBit; } struct twoBit *twoBitFromFile(char *fileName) /* Get twoBit list of all sequences in twoBit file. */ { struct twoBitFile *tbf = twoBitOpen(fileName); struct twoBitIndex *index; struct twoBit *twoBitList = NULL; for (index = tbf->indexList; index != NULL; index = index->next) { struct twoBit *twoBit = twoBitOneFromFile(tbf, index->name); slAddHead(&twoBitList, twoBit); } twoBitClose(&tbf); slReverse(&twoBitList); return twoBitList; } void twoBitFree(struct twoBit **pTwoBit) /* Free up a two bit structure. */ { struct twoBit *twoBit = *pTwoBit; if (twoBit != NULL) { freeMem(twoBit->nStarts); freeMem(twoBit->nSizes); freeMem(twoBit->maskStarts); freeMem(twoBit->maskSizes); freeMem(twoBit->data); freez(pTwoBit); } } void twoBitFreeList(struct twoBit **pList) /* Free a list of dynamically allocated twoBit's */ { struct twoBit *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; twoBitFree(&el); } *pList = NULL; } struct dnaSeq *twoBitReadSeqFragExt(struct twoBitFile *tbf, char *name, int fragStart, int fragEnd, boolean doMask, int *retFullSize) /* Read part of sequence from .2bit file. To read full * sequence call with start=end=0. Sequence will be lower * case if doMask is false, mixed case (repeats in lower) * if doMask is true. */ { struct dnaSeq *seq; bits32 seqSize; bits32 nBlockCount, maskBlockCount; bits32 *nStarts = NULL, *nSizes = NULL; bits32 *maskStarts = NULL, *maskSizes = NULL; boolean isSwapped = tbf->isSwapped; FILE *f = tbf->f; int i; int packByteCount, packedStart, packedEnd, remainder, midStart, midEnd; int outSize; UBYTE *packed, *packedAlloc; DNA *dna; /* Find offset in index and seek to it */ dnaUtilOpen(); twoBitSeekTo(tbf, name); /* Read in seqSize. */ seqSize = readBits32(f, isSwapped); if (fragEnd == 0) fragEnd = seqSize; if (fragEnd > seqSize) errAbort("twoBitReadSeqFrag in %s end (%d) >= seqSize (%d)", name, fragEnd, seqSize); outSize = fragEnd - fragStart; if (outSize < 1) errAbort("twoBitReadSeqFrag in %s start (%d) >= end (%d)", name, fragStart, fragEnd); /* Read in blocks of N. */ readBlockCoords(f, isSwapped, &nBlockCount, &nStarts, &nSizes); /* Read in masked blocks. */ readBlockCoords(f, isSwapped, &maskBlockCount, &maskStarts, &maskSizes); /* Skip over reserved word. */ readBits32(f, isSwapped); /* Allocate dnaSeq, and fill in zero tag at end of sequence. */ AllocVar(seq); if (outSize == seqSize) seq->name = cloneString(name); else { char buf[256*2]; safef(buf, sizeof(buf), "%s:%d-%d", name, fragStart, fragEnd); seq->name = cloneString(buf); } seq->size = outSize; dna = seq->dna = needLargeMem(outSize+1); seq->dna[outSize] = 0; /* Skip to bits we need and read them in. */ packedStart = (fragStart>>2); packedEnd = ((fragEnd+3)>>2); packByteCount = packedEnd - packedStart; packed = packedAlloc = needLargeMem(packByteCount); fseek(f, packedStart, SEEK_CUR); mustRead(f, packed, packByteCount); /* Handle case where everything is in one packed byte */ if (packByteCount == 1) { int pOff = (packedStart<<2); int pStart = fragStart - pOff; int pEnd = fragEnd - pOff; UBYTE partial = *packed; assert(pEnd <= 4); assert(pStart >= 0); for (i=pStart; i> (6-i-i)) & 3]; } else { /* Handle partial first packed byte. */ midStart = fragStart; remainder = (fragStart&3); if (remainder > 0) { UBYTE partial = *packed++; int partCount = 4 - remainder; for (i=partCount-1; i>=0; --i) { dna[i] = valToNt[partial&3]; partial >>= 2; } midStart += partCount; dna += partCount; } /* Handle middle bytes. */ remainder = fragEnd&3; midEnd = fragEnd - remainder; for (i=midStart; i>= 2; dna[2] = valToNt[b&3]; b >>= 2; dna[1] = valToNt[b&3]; b >>= 2; dna[0] = valToNt[b&3]; dna += 4; } if (remainder >0) { UBYTE part = *packed; part >>= (8-remainder-remainder); for (i=remainder-1; i>=0; --i) { dna[i] = valToNt[part&3]; part >>= 2; } } } freez(&packedAlloc); if (nBlockCount > 0) { int startIx = findGreatestLowerBound(nBlockCount, nStarts, fragStart); for (i=startIx; i= fragEnd) break; if (s < fragStart) s = fragStart; if (e > fragEnd) e = fragEnd; if (s < e) memset(seq->dna + s - fragStart, 'n', e - s); } } if (doMask) { toUpperN(seq->dna, seq->size); if (maskBlockCount > 0) { int startIx = findGreatestLowerBound(maskBlockCount, maskStarts, fragStart); for (i=startIx; i= fragEnd) break; if (s < fragStart) s = fragStart; if (e > fragEnd) e = fragEnd; if (s < e) toLowerN(seq->dna + s - fragStart, e - s); } } } freez(&nStarts); freez(&nSizes); freez(&maskStarts); freez(&maskSizes); if (retFullSize != NULL) *retFullSize = seqSize; return seq; } struct dnaSeq *twoBitReadSeqFrag(struct twoBitFile *tbf, char *name, int fragStart, int fragEnd) /* Read part of sequence from .2bit file. To read full * sequence call with start=end=0. Note that sequence will * be mixed case, with repeats in lower case and rest in * upper case. */ { return twoBitReadSeqFragExt(tbf, name, fragStart, fragEnd, TRUE, NULL); } struct dnaSeq *twoBitReadSeqFragLower(struct twoBitFile *tbf, char *name, int fragStart, int fragEnd) /* Same as twoBitReadSeqFrag, but sequence is returned in lower case. */ { return twoBitReadSeqFragExt(tbf, name, fragStart, fragEnd, FALSE, NULL); } int twoBitSeqSize(struct twoBitFile *tbf, char *name) /* Return size of sequence in two bit file in bases. */ { twoBitSeekTo(tbf, name); return readBits32(tbf->f, tbf->isSwapped); } long long twoBitTotalSize(struct twoBitFile *tbf) /* Return total size of all sequences in two bit file. */ { struct twoBitIndex *index; long long totalSize = 0; for (index = tbf->indexList; index != NULL; index = index->next) { fseek(tbf->f, index->offset, SEEK_SET); totalSize += readBits32(tbf->f, tbf->isSwapped); } return totalSize; } struct dnaSeq *twoBitLoadAll(char *spec) /* Return list of all sequences matching spec, which is in * the form: * * file/path/input.2bit[:seqSpec1][,seqSpec2,...] * * where seqSpec is either * seqName * or * seqName:start-end */ { struct twoBitSpec *tbs = twoBitSpecNew(spec); struct twoBitFile *tbf = twoBitOpen(tbs->fileName); struct dnaSeq *list = NULL; if (tbs->seqs != NULL) { struct twoBitSeqSpec *tbss; for (tbss = tbs->seqs; tbss != NULL; tbss = tbss->next) slSafeAddHead(&list, twoBitReadSeqFrag(tbf, tbss->name, tbss->start, tbss->end)); } else { struct twoBitIndex *index; for (index = tbf->indexList; index != NULL; index = index->next) slSafeAddHead(&list, twoBitReadSeqFrag(tbf, index->name, 0, 0)); } slReverse(&list); twoBitClose(&tbf); twoBitSpecFree(&tbs); return list; } struct slName *twoBitSeqNames(char *fileName) /* Get list of all sequences in twoBit file. */ { struct twoBitFile *tbf = twoBitOpen(fileName); struct twoBitIndex *index; struct slName *name, *list = NULL; for (index = tbf->indexList; index != NULL; index = index->next) { name = slNameNew(index->name); slAddHead(&list, name); } twoBitClose(&tbf); slReverse(&list); return list; } boolean twoBitIsFile(char *fileName) /* Return TRUE if file is in .2bit format. */ { return endsWith(fileName, ".2bit"); } boolean twoBitParseRange(char *rangeSpec, char **retFile, char **retSeq, int *retStart, int *retEnd) /* Parse out something in format * file/path/name:seqName:start-end * or * file/path/name:seqName * or * file/path/name:seqName1,seqName2,seqName3,... * This will destroy the input 'rangeSpec' in the process. Returns FALSE if * it doesn't fit this format, setting retFile to rangeSpec, and retSet to * null. If it is the shorter form then start and end will both be returned * as zero, which is ok by twoBitReadSeqFrag. Any of the return arguments * maybe NULL. */ { char *s, *e; int n; /* default returns */ if (retFile != NULL) *retFile = rangeSpec; if (retSeq != NULL) *retSeq = NULL; if (retStart != NULL) *retStart = 0; if (retEnd != NULL) *retEnd = 0; /* start with final name */ s = strrchr(rangeSpec, '/'); if (s == NULL) s = rangeSpec; else s++; /* Grab seqName, zero terminate fileName. */ s = strchr(s, ':'); if (s == NULL) return FALSE; *s++ = 0; if (retSeq != NULL) *retSeq = s; /* Grab start, zero terminate seqName. */ s = strchr(s, ':'); if (s == NULL) return TRUE; /* no range spec */ *s++ = 0; n = strtol(s, &e, 0); if (*e != '-') return FALSE; /* not a valid range */ if (retStart != NULL) *retStart = n; s = e+1; /* Grab end. */ n = strtol(s, &e, 0); if (*e != '\0') return FALSE; /* not a valid range */ if (retEnd != NULL) *retEnd = n; return TRUE; } boolean twoBitIsRange(char *rangeSpec) /* Return TRUE if it looks like a two bit range specifier. */ { char *dupe = cloneString(rangeSpec); char *file, *seq; int start, end; boolean isRange = twoBitParseRange(dupe, &file, &seq, &start, &end); if (isRange) isRange = twoBitIsFile(file); freeMem(dupe); return isRange; } boolean twoBitIsFileOrRange(char *spec) /* Return TRUE if it is a two bit file or subrange. */ { return twoBitIsFile(spec) || twoBitIsRange(spec); } static struct twoBitSeqSpec *parseSeqSpec(char *seqSpecStr) /* parse one sequence spec */ { boolean isOk = TRUE; char *s, *e; struct twoBitSeqSpec *seq; AllocVar(seq); seq->name = cloneString(seqSpecStr); /* Grab start */ s = strchr(seq->name, ':'); if (s == NULL) return seq; /* no range spec */ *s++ = 0; seq->start = strtol(s, &e, 0); if (*e != '-') isOk = FALSE; else { /* Grab end */ s = e+1; seq->end = strtol(s, &e, 0); if (*e != '\0') isOk = FALSE; } if (!isOk || (seq->end < seq->start)) errAbort("invalid twoBit sequence specification: \"%s\"", seqSpecStr); return seq; } boolean twoBitIsSpec(char *spec) /* Return TRUE spec is a valid 2bit spec (see twoBitSpecNew) */ { struct twoBitSpec *tbs = twoBitSpecNew(spec); boolean isSpec = (tbs != NULL); twoBitSpecFree(&tbs); return isSpec; } struct twoBitSpec *twoBitSpecNew(char *specStr) /* Parse a .2bit file and sequence spec into an object. * The spec is a string in the form: * * file/path/input.2bit[:seqSpec1][,seqSpec2,...] * * where seqSpec is either * seqName * or * seqName:start-end * * free result with twoBitSpecFree(). */ { char *s, *e; int i, numSeqs; char **seqSpecs; struct twoBitSpec *spec; AllocVar(spec); spec->fileName = cloneString(specStr); /* start with final file name */ s = strrchr(spec->fileName, '/'); if (s == NULL) s = spec->fileName; else s++; /* find end of file name and zero-terminate */ e = strchr(s, ':'); if (e == NULL) s = NULL; /* just file name */ else { *e++ = '\0'; s = e; } if (!endsWith(spec->fileName, ".2bit")) { twoBitSpecFree(&spec); return NULL; /* not a 2bit file */ } if (s != NULL) { /* chop seqs at commas and parse */ numSeqs = chopString(s, ",", NULL, 0); AllocArray(seqSpecs, numSeqs); chopString(s, ",", seqSpecs, numSeqs); for (i = 0; i< numSeqs; i++) slSafeAddHead(&spec->seqs, parseSeqSpec(seqSpecs[i])); slReverse(&spec->seqs); } return spec; } struct twoBitSpec *twoBitSpecNewFile(char *twoBitFile, char *specFile) /* parse a file containing a list of specifications for sequences in the * specified twoBit file. Specifications are one per line in forms: * seqName * or * seqName:start-end */ { struct lineFile *lf = lineFileOpen(specFile, TRUE); char *line; struct twoBitSpec *spec; AllocVar(spec); spec->fileName = cloneString(twoBitFile); while (lineFileNextReal(lf, &line)) slSafeAddHead(&spec->seqs, parseSeqSpec(trimSpaces(line))); slReverse(&spec->seqs); lineFileClose(&lf); return spec; } void twoBitSpecFree(struct twoBitSpec **specPtr) /* free a twoBitSpec object */ { struct twoBitSpec *spec = *specPtr; if (spec != NULL) { struct twoBitSeqSpec *seq; while ((seq = slPopHead(&spec->seqs)) != NULL) { freeMem(seq->name); freeMem(seq); } freeMem(spec->fileName); freeMem(spec); *specPtr = NULL; } } void twoBitOutNBeds(struct twoBitFile *tbf, char *seqName, FILE *outF) /* output a series of bed3's that enumerate the number of N's in a sequence*/ { int nBlockCount; twoBitSeekTo(tbf, seqName); readBits32(tbf->f, tbf->isSwapped); /* Read in blocks of N. */ nBlockCount = readBits32(tbf->f, tbf->isSwapped); if (nBlockCount > 0) { bits32 *nStarts = NULL, *nSizes = NULL; int i; AllocArray(nStarts, nBlockCount); AllocArray(nSizes, nBlockCount); mustRead(tbf->f, nStarts, sizeof(nStarts[0]) * nBlockCount); mustRead(tbf->f, nSizes, sizeof(nSizes[0]) * nBlockCount); if (tbf->isSwapped) { for (i=0; if, tbf->isSwapped); /* Read in blocks of N. */ nBlockCount = readBits32(tbf->f, tbf->isSwapped); if (nBlockCount > 0) { bits32 *nStarts = NULL, *nSizes = NULL; int i; AllocArray(nStarts, nBlockCount); AllocArray(nSizes, nBlockCount); mustRead(tbf->f, nStarts, sizeof(nStarts[0]) * nBlockCount); mustRead(tbf->f, nSizes, sizeof(nSizes[0]) * nBlockCount); if (tbf->isSwapped) { for (i=0; i #include "common.h" #include "hash.h" #include "obscure.h" #include "bits.h" #include "linefile.h" #include "portable.h" #include "sig.h" #include "net.h" #include "cheapcgi.h" #include "udc.h" static char const rcsid[] = "$Id: udc.c,v 1.37 2010/03/19 19:16:37 angie Exp $"; #define udcBlockSize (8*1024) /* All fetch requests are rounded up to block size. */ #define udcMaxBytesPerRemoteFetch (udcBlockSize * 32) /* Very large remote reads are broken down into chunks this size. */ struct connInfo /* Socket descriptor and associated info, for keeping net connections open. */ { int socket; /* Socket descriptor for data connection (or 0). */ bits64 offset; /* Current file offset of socket. */ int ctrlSocket; /* (FTP only) Control socket descriptor or 0. */ }; typedef int (*UdcDataCallback)(char *url, bits64 offset, int size, void *buffer, struct connInfo *ci); /* Type for callback function that fetches file data. */ struct udcRemoteFileInfo /* Information about a remote file. */ { bits64 updateTime; /* Last update in seconds since 1970 */ bits64 size; /* Remote file size */ struct connInfo ci; /* Connection info for open net connection */ }; typedef boolean (*UdcInfoCallback)(char *url, struct udcRemoteFileInfo *retInfo); /* Type for callback function that fetches file timestamp and size. */ struct udcProtocol /* Something to handle a communications protocol like http, https, ftp, local file i/o, etc. */ { struct udcProtocol *next; /* Next in list */ UdcDataCallback fetchData; /* Data fetcher */ UdcInfoCallback fetchInfo; /* Timestamp & size fetcher */ }; struct udcFile /* A file handle for our caching system. */ { struct udcFile *next; /* Next in list. */ char *url; /* Name of file - includes protocol */ char *protocol; /* The URL up to the first colon. http: etc. */ struct udcProtocol *prot; /* Protocol specific data and methods. */ time_t updateTime; /* Last modified timestamp. */ bits64 size; /* Size of file. */ bits64 offset; /* Current offset in file. */ char *cacheDir; /* Directory for cached file parts. */ char *bitmapFileName; /* Name of bitmap file. */ char *sparseFileName; /* Name of sparse data file. */ int fdSparse; /* File descriptor for sparse data file. */ boolean sparseReadAhead; /* Read-ahead has something in the buffer */ char *sparseReadAheadBuf; /* Read-ahead buffer, if any */ bits64 sparseRAOffset; /* Read-ahead buffer offset */ struct udcBitmap *bits; /* udcBitMap */ bits64 startData; /* Start of area in file we know to have data. */ bits64 endData; /* End of area in file we know to have data. */ bits32 bitmapVersion; /* Version of associated bitmap we were opened with. */ struct connInfo connInfo; /* Connection info for open net connection. */ }; struct udcBitmap /* The control structure including the bitmap of blocks that are cached. */ { struct udcBitmap *next; /* Next in list. */ bits32 blockSize; /* Number of bytes per block of file. */ bits64 remoteUpdate; /* Remote last update time. */ bits64 fileSize; /* File size */ bits32 version; /* Version - increments each time cache is stale. */ bits64 localUpdate; /* Time we last fetched new data into cache. */ bits64 localAccess; /* Time we last accessed data. */ boolean isSwapped; /* If true need to swap all bytes on read. */ int fd; /* File descriptor for file with current block. */ }; static char *bitmapName = "bitmap"; static char *sparseDataName = "sparseData"; #define udcBitmapHeaderSize (64) static int cacheTimeout = 0; #define MAX_SKIP_TO_SAVE_RECONNECT (udcMaxBytesPerRemoteFetch / 2) static void readAndIgnore(int sd, bits64 size) /* Read size bytes from sd and return. */ { static char *buf = NULL; if (buf == NULL) buf = needMem(udcBlockSize); bits64 remaining = size, total = 0; while (remaining > 0) { bits64 chunkSize = min(remaining, udcBlockSize); bits64 rd = read(sd, buf, chunkSize); if (rd < 0) errnoAbort("readAndIgnore: error reading socket after %lld bytes", total); remaining -= rd; total += rd; } if (total < size) errAbort("readAndIgnore: got EOF at %lld bytes (wanted %lld)", total, size); } #ifndef WIN32 static int connInfoGetSocket(struct connInfo *ci, char *url, bits64 offset, int size) /* If ci has an open socket and the given offset matches ci's current offset, * reuse ci->socket. Otherwise close the socket, open a new one, and update ci, * or return -1 if there is an error opening a new one. */ { if (ci != NULL && ci->socket > 0 && ci->offset != offset) { bits64 skipSize = (offset - ci->offset); if (skipSize > 0 && skipSize <= MAX_SKIP_TO_SAVE_RECONNECT) { verbose(2, "!! skipping %lld bytes @%lld to avoid reconnect\n", skipSize, ci->offset); readAndIgnore(ci->socket, skipSize); ci->offset = offset; } else { verbose(2, "Offset mismatch (ci %lld != new %lld), reopening.\n", ci->offset, offset); mustCloseFd(&(ci->socket)); if (ci->ctrlSocket > 0) mustCloseFd(&(ci->ctrlSocket)); ZeroVar(ci); } } int sd; if (ci == NULL || ci->socket <= 0) { char rangeUrl[2048]; if (ci == NULL) { safef(rangeUrl, sizeof(rangeUrl), "%s;byterange=%lld-%lld", url, offset, (offset + size - 1)); sd = netUrlOpen(rangeUrl); } else { safef(rangeUrl, sizeof(rangeUrl), "%s;byterange=%lld-", url, offset); sd = ci->socket = netUrlOpenSockets(rangeUrl, &(ci->ctrlSocket)); ci->offset = offset; } if (sd < 0) return -1; if (startsWith("http", url)) { char *newUrl = NULL; int newSd = 0; if (!netSkipHttpHeaderLinesHandlingRedirect(sd, rangeUrl, &newSd, &newUrl)) return -1; if (newUrl) { freeMem(newUrl); sd = newSd; if (ci != NULL) ci->socket = newSd; } } } else sd = ci->socket; return sd; } #endif /********* Section for local file protocol **********/ static char *assertLocalUrl(char *url) /* Make sure that url is local and return bits past the protocol. */ { if (startsWith("local:", url)) url += 6; if (url[0] != '/') errAbort("Local urls must start at /"); if (stringIn("..", url) || stringIn("~", url) || stringIn("//", url) || stringIn("/./", url) || endsWith("/.", url)) { errAbort("relative paths not allowed in local urls (%s)", url); } return url; } static int udcDataViaLocal(char *url, bits64 offset, int size, void *buffer, struct connInfo *ci) /* Fetch a block of data of given size into buffer using the http: protocol. * Returns number of bytes actually read. Does an errAbort on * error. Typically will be called with size in the 8k - 64k range. */ { /* Need to check time stamp here. */ verbose(2, "reading remote data - %d bytes at %lld - on %s\n", size, offset, url); url = assertLocalUrl(url); FILE *f = mustOpen(url, "rb"); fseek(f, offset, SEEK_SET); int sizeRead = fread(buffer, 1, size, f); if (ferror(f)) { warn("udcDataViaLocal failed to fetch %d bytes at %lld", size, offset); errnoAbort("file %s", url); } carefulClose(&f); return sizeRead; } static boolean udcInfoViaLocal(char *url, struct udcRemoteFileInfo *retInfo) /* Fill in *retTime with last modified time for file specified in url. * Return FALSE if file does not even exist. */ { verbose(2, "checking remote info on %s\n", url); url = assertLocalUrl(url); struct stat status; int ret = stat(url, &status); if (ret < 0) return FALSE; retInfo->updateTime = status.st_mtime; retInfo->size = status.st_size; return TRUE; } /********* Section for transparent file protocol **********/ static int udcDataViaTransparent(char *url, bits64 offset, int size, void *buffer, struct connInfo *ci) /* Fetch a block of data of given size into buffer using the http: protocol. * Returns number of bytes actually read. Does an errAbort on * error. Typically will be called with size in the 8k - 64k range. */ { internalErr(); /* Should not get here. */ return size; } static boolean udcInfoViaTransparent(char *url, struct udcRemoteFileInfo *retInfo) /* Fill in *retInfo with last modified time for file specified in url. * Return FALSE if file does not even exist. */ { internalErr(); /* Should not get here. */ return FALSE; } /********* Section for slow local file protocol - simulates network... **********/ static int udcDataViaSlow(char *url, bits64 offset, int size, void *buffer, struct connInfo *ci) /* Fetch a block of data of given size into buffer using the http: protocol. * Returns number of bytes actually read. Does an errAbort on * error. Typically will be called with size in the 8k - 64k range. */ { verbose(2, "slow reading remote data - %d bytes at %lld - on %s\n", size, offset, url); sleep1000(500); char *fileName = url + 5; /* skip over 'slow:' */ FILE *f = mustOpen(fileName, "rb"); fseek(f, offset, SEEK_SET); char *pt = buffer; int i, step=1024; int sizeRead = 0; for (i=0; i step) readChunk = step; int oneReadSize = fread(pt, 1, readChunk, f); verbose(2, "slowly read %d bytes\n", oneReadSize); if (ferror(f)) { warn("udcDataViaSlow failed to fetch %d bytes at %lld", size, offset); errnoAbort("file %s", fileName); } pt += step; sizeRead += oneReadSize; } carefulClose(&f); return sizeRead; } static boolean udcInfoViaSlow(char *url, struct udcRemoteFileInfo *retInfo) /* Fill in *retTime with last modified time for file specified in url. * Return FALSE if file does not even exist. */ { char *fileName = url + 5; /* skip over 'slow:' */ verbose(2, "slow checking remote info on %s\n", url); sleep1000(500); struct stat status; int ret = stat(fileName, &status); if (ret < 0) return FALSE; retInfo->updateTime = status.st_mtime; retInfo->size = status.st_size; return TRUE; } #ifndef WIN32 /********* Section for http protocol **********/ int udcDataViaHttpOrFtp(char *url, bits64 offset, int size, void *buffer, struct connInfo *ci) /* Fetch a block of data of given size into buffer using url's protocol, * which must be http, https or ftp. Returns number of bytes actually read. * Does an errAbort on error. * Typically will be called with size in the 8k-64k range. */ { if (startsWith("http://",url) || startsWith("https://",url) || startsWith("ftp://",url)) verbose(2, "reading http/https/ftp data - %d bytes at %lld - on %s\n", size, offset, url); else errAbort("Invalid protocol in url [%s] in udcDataViaFtp, only http, https, or ftp supported", url); int sd = connInfoGetSocket(ci, url, offset, size); if (sd < 0) errAbort("Can't get data socket for %s", url); int rd = 0, total = 0, remaining = size; char *buf = (char *)buffer; while ((remaining > 0) && ((rd = read(sd, buf, remaining)) > 0)) { total += rd; buf += rd; remaining -= rd; } if (rd == -1) errnoAbort("udcDataViaHttpOrFtp: error reading socket"); if (ci == NULL) mustCloseFd(&sd); else ci->offset += total; return total; } boolean udcInfoViaHttp(char *url, struct udcRemoteFileInfo *retInfo) /* Gets size and last modified time of URL * and returns status of HEAD GET. */ { verbose(2, "checking http remote info on %s\n", url); struct hash *hash = newHash(0); int status = netUrlHead(url, hash); if (status != 200) // && status != 302 && status != 301) return FALSE; char *sizeString = hashFindValUpperCase(hash, "Content-Length:"); if (sizeString == NULL) { /* try to get remote file size by an alternate method */ retInfo->size = netUrlSizeByRangeResponse(url); if (retInfo->size < 0) { hashFree(&hash); errAbort("No Content-Length: returned in header for %s, can't proceed, sorry", url); } } else { retInfo->size = atoll(sizeString); } char *lastModString = hashFindValUpperCase(hash, "Last-Modified:"); if (lastModString == NULL) { // Date is a poor substitute! It will always appear that the cache is stale. // But at least we can read files from dropbox.com. lastModString = hashFindValUpperCase(hash, "Date:"); if (lastModString == NULL) { hashFree(&hash); errAbort("No Last-Modified: or Date: returned in header for %s, can't proceed, sorry", url); } } struct tm tm; time_t t; // Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT // This will always be GMT if (strptime(lastModString, "%a, %d %b %Y %H:%M:%S %Z", &tm) == NULL) { /* Handle error */; hashFree(&hash); errAbort("unable to parse last-modified string [%s]", lastModString); } t = mktimeFromUtc(&tm); if (t == -1) { /* Handle error */; hashFree(&hash); errAbort("mktimeFromUtc failed while converting last-modified string [%s] from UTC time", lastModString); } retInfo->updateTime = t; hashFree(&hash); return status; } /********* Section for ftp protocol **********/ // fetchData method: See udcDataViaHttpOrFtp above. boolean udcInfoViaFtp(char *url, struct udcRemoteFileInfo *retInfo) /* Gets size and last modified time of FTP URL */ { verbose(2, "checking ftp remote info on %s\n", url); long long size = 0; time_t t, tUtc; struct tm *tm = NULL; // TODO: would be nice to add int *retCtrlSocket to netGetFtpInfo so we can stash // in retInfo->connInfo and keep socket open. boolean ok = netGetFtpInfo(url, &size, &tUtc); if (!ok) return FALSE; // Convert UTC to localtime tm = localtime(&tUtc); t = mktimeFromUtc(tm); if (t == -1) { /* Handle error */; errAbort("mktimeFromUtc failed while converting FTP UTC last-modified time %ld to local time", (long) tUtc); } retInfo->size = size; retInfo->updateTime = t; return TRUE; } #endif /********* Non-protocol-specific bits **********/ static char *fileNameInCacheDir(struct udcFile *file, char *fileName) /* Return the name of a file in the cache dir, from the cache root directory on down. * Do a freeMem on this when done. */ { int dirLen = strlen(file->cacheDir); int nameLen = strlen(fileName); char *path = needMem(dirLen + nameLen + 2); memcpy(path, file->cacheDir, dirLen); path[dirLen] = '/'; memcpy(path+dirLen+1, fileName, nameLen); return path; } static void udcNewCreateBitmapAndSparse(struct udcFile *file, bits64 remoteUpdate, bits64 remoteSize, bits32 version) /* Create a new bitmap file around the given remoteUpdate time. */ { int fd = mustOpenFd(file->bitmapFileName, O_WRONLY | O_CREAT | O_TRUNC); bits32 sig = udcBitmapSig; bits32 blockSize = udcBlockSize; bits64 reserved64 = 0; bits32 reserved32 = 0; int blockCount = (remoteSize + udcBlockSize - 1)/udcBlockSize; int bitmapSize = bitToByteSize(blockCount); /* Write out fixed part of header. */ writeOneFd(fd, sig); writeOneFd(fd, blockSize); writeOneFd(fd, remoteUpdate); writeOneFd(fd, remoteSize); writeOneFd(fd, version); writeOneFd(fd, reserved32); writeOneFd(fd, reserved64); writeOneFd(fd, reserved64); writeOneFd(fd, reserved64); writeOneFd(fd, reserved64); long long offset = mustLseek(fd, 0, SEEK_CUR); if (offset != udcBitmapHeaderSize) errAbort("offset in fd=%d, f=%s is %lld, not expected udcBitmapHeaderSize %d", fd, file->bitmapFileName, offset, udcBitmapHeaderSize); /* Write out initial all-zero bitmap, using sparse-file method: write 0 to final address. */ unsigned char zero = 0; mustLseek(fd, bitmapSize-1, SEEK_CUR); mustWriteFd(fd, &zero, 1); /* Clean up bitmap file and name. */ mustCloseFd(&fd); /* Create an empty data file. */ fd = mustOpenFd(file->sparseFileName, O_WRONLY | O_CREAT | O_TRUNC); mustCloseFd(&fd); } static struct udcBitmap *udcBitmapOpen(char *fileName) /* Open up a bitmap file and read and verify header. Return NULL if file doesn't * exist, abort on error. */ { /* Open file, returning NULL if can't. */ int fd = open(fileName, O_RDWR); if (fd < 0) { if (errno == ENOENT) return NULL; else errnoAbort("Can't open(%s, O_RDWR)", fileName); } /* Get status info from file. */ struct stat status; fstat(fd, &status); /* Read signature and decide if byte-swapping is needed. */ // TODO: maybe buffer the I/O for performance? Don't read past header - // fd offset needs to point to first data block when we return. bits32 magic; boolean isSwapped = FALSE; mustReadOneFd(fd, magic); if (magic != udcBitmapSig) { magic = byteSwap32(magic); isSwapped = TRUE; if (magic != udcBitmapSig) errAbort("%s is not a udcBitmap file", fileName); } /* Allocate bitmap object, fill it in, and return it. */ bits32 reserved32; bits64 reserved64; struct udcBitmap *bits; AllocVar(bits); bits->blockSize = fdReadBits32(fd, isSwapped); bits->remoteUpdate = fdReadBits64(fd, isSwapped); bits->fileSize = fdReadBits64(fd, isSwapped); bits->version = fdReadBits32(fd, isSwapped); reserved32 = fdReadBits32(fd, isSwapped); reserved64 = fdReadBits64(fd, isSwapped); reserved64 = fdReadBits64(fd, isSwapped); reserved64 = fdReadBits64(fd, isSwapped); reserved64 = fdReadBits64(fd, isSwapped); bits->localUpdate = status.st_mtime; bits->localAccess = status.st_atime; bits->isSwapped = isSwapped; bits->fd = fd; return bits; } static void udcBitmapClose(struct udcBitmap **pBits) /* Free up resources associated with udcBitmap. */ { struct udcBitmap *bits = *pBits; if (bits != NULL) { mustCloseFd(&(bits->fd)); freez(pBits); } } static struct udcProtocol *udcProtocolNew(char *upToColon) /* Build up a new protocol around a string such as "http" or "local" */ { struct udcProtocol *prot; AllocVar(prot); if (sameString(upToColon, "local")) { prot->fetchData = udcDataViaLocal; prot->fetchInfo = udcInfoViaLocal; } else if (sameString(upToColon, "slow")) { prot->fetchData = udcDataViaSlow; prot->fetchInfo = udcInfoViaSlow; } #ifndef WIN32 else if (sameString(upToColon, "http") || sameString(upToColon, "https")) { prot->fetchData = udcDataViaHttpOrFtp; prot->fetchInfo = udcInfoViaHttp; } else if (sameString(upToColon, "ftp")) { prot->fetchData = udcDataViaHttpOrFtp; prot->fetchInfo = udcInfoViaFtp; } #endif else if (sameString(upToColon, "transparent")) { prot->fetchData = udcDataViaTransparent; prot->fetchInfo = udcInfoViaTransparent; } else { errAbort("Unrecognized protocol %s in udcProtNew", upToColon); } return prot; } static void udcProtocolFree(struct udcProtocol **pProt) /* Free up protocol resources. */ { freez(pProt); } static void setInitialCachedDataBounds(struct udcFile *file, boolean useCacheInfo) /* Open up bitmap file and read a little bit of it to see if cache is stale, * and if not to see if the initial part is cached. Sets the data members * startData, and endData. If the case is stale it makes fresh empty * cacheDir/sparseData and cacheDir/bitmap files. */ { bits32 version = 0; /* Get existing bitmap, and if it's stale clean up. */ struct udcBitmap *bits = udcBitmapOpen(file->bitmapFileName); if (bits != NULL) { if (useCacheInfo) { file->size = bits->fileSize; file->updateTime = bits->remoteUpdate; } version = bits->version; if (bits->remoteUpdate != file->updateTime || bits->fileSize != file->size || !fileExists(file->sparseFileName)) { verbose(2, "removing stale version (%lld! = %lld or %lld! = %lld or %s doesn't exist), " "new version %d\n", bits->remoteUpdate, (long long)file->updateTime, bits->fileSize, file->size, file->sparseFileName, version); udcBitmapClose(&bits); remove(file->bitmapFileName); remove(file->sparseFileName); ++version; } } else verbose(2, "bitmap file %s does not already exist, creating.\n", file->bitmapFileName); /* If no bitmap, then create one, and also an empty sparse data file. */ if (bits == NULL) { udcNewCreateBitmapAndSparse(file, file->updateTime, file->size, version); bits = udcBitmapOpen(file->bitmapFileName); if (bits == NULL) errAbort("Unable to open bitmap file %s", file->bitmapFileName); } file->bitmapVersion = bits->version; /* Read in a little bit from bitmap while we have it open to see if we have anything cached. */ if (file->size > 0) { Bits b; off_t wasAt = lseek(bits->fd, 0, SEEK_CUR); mustReadOneFd(bits->fd, b); int endBlock = (file->size + udcBlockSize - 1)/udcBlockSize; if (endBlock > 8) endBlock = 8; int initialCachedBlocks = bitFindClear(&b, 0, endBlock); file->endData = initialCachedBlocks * udcBlockSize; mustLseek(bits->fd, wasAt, SEEK_SET); } file->bits = bits; } static boolean qEscaped(char c) /* Returns TRUE if character needs to be escaped in q-encoding. */ { if (isalnum(c)) return c == 'Q'; else return c != '_' && c != '-' && c != '/' && c != '.'; } static char *qEncode(char *input) /* Do a simple encoding to convert input string into "normal" characters. * Abnormal letters, and '!' get converted into Q followed by two hexadecimal digits. */ { /* First go through and figure out encoded size. */ int size = 0; char *s, *d, c; s = input; while ((c = *s++) != 0) { if (qEscaped(c)) size += 3; else size += 1; } /* Allocate and fill in output. */ char *output = needMem(size+1); s = input; d = output; while ((c = *s++) != 0) { if (qEscaped(c)) { sprintf(d, "Q%02X", (unsigned)c); d += 3; } else *d++ = c; } return output; } void udcParseUrlFull(char *url, char **retProtocol, char **retAfterProtocol, char **retColon, char **retAuth) /* Parse the URL into components that udc treats separately. * *retAfterProtocol is Q-encoded to keep special chars out of filenames. * Free all *ret's except *retColon when done. */ { char *protocol, *afterProtocol; char *colon = strchr(url, ':'); if (!colon) { *retColon = NULL; return; } int colonPos = colon - url; protocol = cloneStringZ(url, colonPos); afterProtocol = url + colonPos + 1; while (afterProtocol[0] == '/') afterProtocol += 1; char *userPwd = strchr(afterProtocol, '@'); if (userPwd) { if (retAuth) { char auth[1024]; safencpy(auth, sizeof(auth), afterProtocol, userPwd+1-afterProtocol); *retAuth = qEncode(auth); } char *afterHost = strchr(afterProtocol, '/'); if (!afterHost) { afterHost = afterProtocol+strlen(afterProtocol); } if (userPwd < afterHost) afterProtocol = userPwd + 1; } else if (retAuth) *retAuth = NULL; afterProtocol = qEncode(afterProtocol); *retProtocol = protocol; *retAfterProtocol = afterProtocol; *retColon = colon; } void udcParseUrl(char *url, char **retProtocol, char **retAfterProtocol, char **retColon) /* Parse the URL into components that udc treats separately. * *retAfterProtocol is Q-encoded to keep special chars out of filenames. * Free *retProtocol and *retAfterProtocol but not *retColon when done. */ { udcParseUrlFull(url, retProtocol, retAfterProtocol, retColon, NULL); } void udcPathAndFileNames(struct udcFile *file, char *cacheDir, char *protocol, char *afterProtocol) /* Initialize udcFile path and names */ { int len = strlen(cacheDir) + 1 + strlen(protocol) + 1 + strlen(afterProtocol) + 1; file->cacheDir = needMem(len); safef(file->cacheDir, len, "%s/%s/%s", cacheDir, protocol, afterProtocol); /* Create file names for bitmap and data portions. */ file->bitmapFileName = fileNameInCacheDir(file, bitmapName); file->sparseFileName = fileNameInCacheDir(file, sparseDataName); } static long long int udcSizeAndModTimeFromBitmap(char *bitmapFileName, time_t *retTime) /* Look up the file size from the local cache bitmap file, or -1 if there * is no cache for url. If retTime is non-null, store the remote update time in it. */ { long long int ret = -1; struct udcBitmap *bits = udcBitmapOpen(bitmapFileName); if (bits != NULL) { ret = bits->fileSize; if (retTime) *retTime = bits->remoteUpdate; } else warn("Can't open bitmap file %s: %s\n", bitmapFileName, strerror(errno)); udcBitmapClose(&bits); return ret; } struct udcFile *udcFileMayOpen(char *url, char *cacheDir) /* Open up a cached file. cacheDir may be null in which case udcDefaultDir() will be * used. Return NULL if file doesn't exist. */ { if (cacheDir == NULL) cacheDir = udcDefaultDir(); verbose(2, "udcfileOpen(%s, %s)\n", url, cacheDir); /* Parse out protocol. Make it "transparent" if none specified. */ char *protocol = NULL, *afterProtocol = NULL, *colon; boolean isTransparent = FALSE; udcParseUrl(url, &protocol, &afterProtocol, &colon); #ifndef WIN32 /* force WIN32 to use transparent (local file) loading */ if (!colon) #endif { freeMem(protocol); protocol = cloneString("transparent"); freeMem(afterProtocol); afterProtocol = cloneString(url); isTransparent = TRUE; } struct udcProtocol *prot; prot = udcProtocolNew(protocol); /* Figure out if anything exists. */ boolean useCacheInfo = FALSE; struct udcRemoteFileInfo info; ZeroVar(&info); if (!isTransparent) { useCacheInfo = (udcCacheAge(url, cacheDir) < udcCacheTimeout()); if (!useCacheInfo) { if (!prot->fetchInfo(url, &info)) { udcProtocolFree(&prot); freeMem(protocol); freeMem(afterProtocol); return NULL; } } } /* Allocate file object and start filling it in. */ struct udcFile *file; AllocVar(file); file->url = cloneString(url); file->protocol = protocol; file->prot = prot; if (isTransparent) { /* If transparent dummy up things so that the "sparse" file pointer is actually * the file itself, which appears to be completely loaded in cache. */ int fd = file->fdSparse = mustOpenFd(url, O_RDONLY); struct stat status; fstat(fd, &status); file->startData = 0; file->endData = file->size = status.st_size; } else { udcPathAndFileNames(file, cacheDir, protocol, afterProtocol); if (!useCacheInfo) { file->updateTime = info.updateTime; file->size = info.size; memcpy(&(file->connInfo), &(info.ci), sizeof(struct connInfo)); // update cache file mod times, so if we're caching we won't do this again // until the timeout has expired again: #ifndef WIN32 if (udcCacheTimeout() > 0 && fileExists(file->bitmapFileName)) (void)maybeTouchFile(file->bitmapFileName); #endif } /* Make directory. */ makeDirsOnPath(file->cacheDir); /* Figure out a little bit about the extent of the good cached data if any. Open bits bitmap. */ setInitialCachedDataBounds(file, useCacheInfo); file->fdSparse = mustOpenFd(file->sparseFileName, O_RDWR); } freeMem(afterProtocol); return file; } struct udcFile *udcFileOpen(char *url, char *cacheDir) /* Open up a cached file. cacheDir may be null in which case udcDefaultDir() will be * used. Abort if if file doesn't exist. */ { struct udcFile *udcFile = udcFileMayOpen(url, cacheDir); if (udcFile == NULL) errAbort("Couldn't open %s", url); return udcFile; } struct slName *udcFileCacheFiles(char *url, char *cacheDir) /* Return low-level list of files used in cache. */ { char *protocol, *afterProtocol, *colon; struct udcFile *file; udcParseUrl(url, &protocol, &afterProtocol, &colon); if (colon == NULL) return NULL; AllocVar(file); udcPathAndFileNames(file, cacheDir, protocol, afterProtocol); struct slName *list = NULL; slAddHead(&list, slNameNew(file->bitmapFileName)); slAddHead(&list, slNameNew(file->sparseFileName)); slReverse(&list); freeMem(file->cacheDir); freeMem(file->bitmapFileName); freeMem(file->sparseFileName); freeMem(file); freeMem(protocol); freeMem(afterProtocol); return list; } void udcFileClose(struct udcFile **pFile) /* Close down cached file. */ { struct udcFile *file = *pFile; if (file != NULL) { if (file->connInfo.socket != 0) mustCloseFd(&(file->connInfo.socket)); if (file->connInfo.ctrlSocket != 0) mustCloseFd(&(file->connInfo.ctrlSocket)); freeMem(file->url); freeMem(file->protocol); udcProtocolFree(&file->prot); freeMem(file->cacheDir); freeMem(file->bitmapFileName); freeMem(file->sparseFileName); freeMem(file->sparseReadAheadBuf); mustCloseFd(&(file->fdSparse)); udcBitmapClose(&file->bits); } freez(pFile); } static void qDecode(const char *input, char *buf, size_t size) /* Reverse the qEncode performed on afterProcotol above into buf or abort. */ { safecpy(buf, size, input); char c, *r = buf, *w = buf; while ((c = *r++) != '\0') { if (c == 'Q') { int q; if (sscanf(r, "%02X", &q)) { *w++ = (char)q; r += 2; } else errAbort("qDecode: input \"%s\" does not appear to be properly formatted " "starting at \"%s\"", input, r); } else *w++ = c; } *w = '\0'; } char *udcPathToUrl(const char *path, char *buf, size_t size, char *cacheDir) /* Translate path into an URL, store in buf, return pointer to buf if successful * and NULL if not. */ { if (cacheDir == NULL) cacheDir = udcDefaultDir(); int offset = 0; if (startsWith(cacheDir, (char *)path)) offset = strlen(cacheDir); if (path[offset] == '/') offset++; char protocol[16]; strncpy(protocol, path+offset, sizeof(protocol)); protocol[ArraySize(protocol)-1] = '\0'; char *p = strchr(protocol, '/'); if (p == NULL) { errAbort("unable to parse protocol (first non-'%s' directory) out of path '%s'\n", cacheDir, path); return NULL; } *p++ = '\0'; char afterProtocol[4096]; qDecode(path+1+strlen(protocol)+1, afterProtocol, sizeof(afterProtocol)); safef(buf, size, "%s://%s", protocol, afterProtocol); return buf; } long long int udcSizeFromCache(char *url, char *cacheDir) /* Look up the file size from the local cache bitmap file, or -1 if there * is no cache for url. */ { long long int ret = -1; if (cacheDir == NULL) cacheDir = udcDefaultDir(); struct slName *sl, *slList = udcFileCacheFiles(url, cacheDir); for (sl = slList; sl != NULL; sl = sl->next) if (endsWith(sl->name, bitmapName)) { ret = udcSizeAndModTimeFromBitmap(sl->name, NULL); break; } slNameFreeList(&slList); return ret; } unsigned long udcCacheAge(char *url, char *cacheDir) /* Return the age in seconds of the oldest cache file. If a cache file is * missing, return the current time (seconds since the epoch). */ { unsigned long now = clock1(), oldestTime = now; if (cacheDir == NULL) cacheDir = udcDefaultDir(); struct slName *sl, *slList = udcFileCacheFiles(url, cacheDir); if (slList == NULL) return now; for (sl = slList; sl != NULL; sl = sl->next) if (endsWith(sl->name, bitmapName)) { if (fileExists(sl->name)) oldestTime = min(fileModTime(sl->name), oldestTime); else return now; } return (now - oldestTime); } static void readBitsIntoBuf(int fd, int headerSize, int bitStart, int bitEnd, Bits **retBits, int *retPartOffset) /* Do some bit-to-byte offset conversions and read in all the bytes that * have information in the bits we're interested in. */ { int byteStart = bitStart/8; int byteEnd = bitToByteSize(bitEnd); int byteSize = byteEnd - byteStart; Bits *bits = needLargeMem(byteSize); mustLseek(fd, headerSize + byteStart, SEEK_SET); mustReadFd(fd, bits, byteSize); *retBits = bits; *retPartOffset = byteStart*8; } static boolean allBitsSetInFile(int bitStart, int bitEnd, int partOffset, Bits *bits) /* Return TRUE if all bits in file between start and end are set. */ { int partBitStart = bitStart - partOffset; int partBitEnd = bitEnd - partOffset; int nextClearBit = bitFindClear(bits, partBitStart, partBitEnd); boolean allSet = (nextClearBit >= partBitEnd); return allSet; } // For tests/udcTest.c debugging: not declared in udc.h, but not static either: boolean udcCheckCacheBits(struct udcFile *file, int startBlock, int endBlock) /* Warn and return TRUE if any bit in (startBlock,endBlock] is not set. */ { boolean gotUnset = FALSE; struct udcBitmap *bitmap = udcBitmapOpen(file->bitmapFileName); int partOffset; Bits *bits; readBitsIntoBuf(bitmap->fd, udcBitmapHeaderSize, startBlock, endBlock, &bits, &partOffset); int partBitStart = startBlock - partOffset; int partBitEnd = endBlock - partOffset; int nextClearBit = bitFindClear(bits, partBitStart, partBitEnd); while (nextClearBit < partBitEnd) { int clearBlock = nextClearBit + partOffset; warn("... udcFile 0x%04lx: bit for block %d (%lld..%lld] is not set", (unsigned long)file, clearBlock, ((long long)clearBlock * udcBlockSize), (((long long)clearBlock+1) * udcBlockSize)); gotUnset = TRUE; int nextSetBit = bitFindSet(bits, nextClearBit, partBitEnd); nextClearBit = bitFindClear(bits, nextSetBit, partBitEnd); } return gotUnset; } static void fetchMissingBlocks(struct udcFile *file, struct udcBitmap *bits, int startBlock, int blockCount, int blockSize) /* Fetch missing blocks from remote and put them into file. errAbort if trouble. */ { bits64 startPos = (bits64)startBlock * blockSize; bits64 endPos = startPos + (bits64)blockCount * blockSize; if (endPos > file->size) endPos = file->size; if (endPos > startPos) { bits64 readSize = endPos - startPos; void *buf = needLargeMem(readSize); int actualSize = file->prot->fetchData(file->url, startPos, readSize, buf, &(file->connInfo)); if (actualSize != readSize) errAbort("unable to fetch %lld bytes from %s @%lld (got %d bytes)", readSize, file->url, startPos, actualSize); mustLseek(file->fdSparse, startPos, SEEK_SET); mustWriteFd(file->fdSparse, buf, readSize); freez(&buf); } } static boolean fetchMissingBits(struct udcFile *file, struct udcBitmap *bits, bits64 start, bits64 end, bits64 *retFetchedStart, bits64 *retFetchedEnd) /* Scan through relevant parts of bitmap, fetching blocks we don't already have. */ { /* Fetch relevant part of bitmap into memory */ int partOffset; Bits *b; int startBlock = start / bits->blockSize; int endBlock = (end + bits->blockSize - 1) / bits->blockSize; readBitsIntoBuf(bits->fd, udcBitmapHeaderSize, startBlock, endBlock, &b, &partOffset); if (allBitsSetInFile(startBlock, endBlock, partOffset, b)) { // it is already in the cache freeMem(b); return TRUE; } /* Loop around first skipping set bits, then fetching clear bits. */ boolean dirty = FALSE; int s = startBlock - partOffset; int e = endBlock - partOffset; for (;;) { int nextClearBit = bitFindClear(b, s, e); if (nextClearBit >= e) break; int nextSetBit = bitFindSet(b, nextClearBit, e); int clearSize = nextSetBit - nextClearBit; fetchMissingBlocks(file, bits, nextClearBit + partOffset, clearSize, bits->blockSize); bitSetRange(b, nextClearBit, clearSize); dirty = TRUE; if (nextSetBit >= e) break; s = nextSetBit; } if (dirty) { /* Update bitmap on disk.... */ int byteStart = startBlock/8; int byteEnd = bitToByteSize(endBlock); int byteSize = byteEnd - byteStart; mustLseek(bits->fd, byteStart + udcBitmapHeaderSize, SEEK_SET); mustWriteFd(bits->fd, b, byteSize); } freeMem(b); *retFetchedStart = startBlock * bits->blockSize; *retFetchedEnd = endBlock * bits->blockSize; return FALSE; } static boolean rangeIntersectOrTouch64(bits64 start1, bits64 end1, bits64 start2, bits64 end2) /* Return true if two 64-bit ranges intersect or touch. */ { // cannot use the version of this function that is in common.c since it only handles integers. bits64 s = max(start1,start2); bits64 e = min(end1,end2); return e >= s; } static void udcFetchMissing(struct udcFile *file, struct udcBitmap *bits, bits64 start, bits64 end) /* Fetch missing pieces of data from file */ { /* Call lower level routine fetch remote data that is not already here. */ bits64 fetchedStart, fetchedEnd; if (fetchMissingBits(file, bits, start, end, &fetchedStart, &fetchedEnd)) return; /* Update file startData/endData members to include new data (and old as well if * the new data overlaps the old). */ if (rangeIntersectOrTouch64(file->startData, file->endData, fetchedStart, fetchedEnd)) { if (fetchedStart > file->startData) fetchedStart = file->startData; if (fetchedEnd < file->endData) fetchedEnd = file->endData; } file->startData = fetchedStart; file->endData = fetchedEnd; } static boolean udcCachePreload(struct udcFile *file, bits64 offset, int size) /* Make sure that given data is in cache - fetching it remotely if need be. * Return TRUE on success. */ { boolean ok = TRUE; /* We'll break this operation into blocks of a reasonable size to allow * other processes to get cache access, since we have to lock the cache files. */ bits64 s,e, endPos=offset+size; for (s = offset; s < endPos; s = e) { /* Figure out bounds of this section. */ e = s + udcMaxBytesPerRemoteFetch; if (e > endPos) e = endPos; struct udcBitmap *bits = file->bits; if (bits->version == file->bitmapVersion) { udcFetchMissing(file, bits, s, e); } else { ok = FALSE; verbose(2, "udcCachePreload version check failed %d vs %d", bits->version, file->bitmapVersion); } if (!ok) break; } return ok; } #define READAHEADBUFSIZE 4096 int udcRead(struct udcFile *file, void *buf, int size) /* Read a block from file. Return amount actually read. */ { /* Figure out region of file we're going to read, and clip it against file size. */ bits64 start = file->offset; if (start > file->size) return 0; bits64 end = start + size; if (end > file->size) end = file->size; size = end - start; char *cbuf = buf; /* use read-ahead buffer if present */ int bytesRead = 0; bits64 raStart; bits64 raEnd; while(TRUE) { if (file->sparseReadAhead) { raStart = file->sparseRAOffset; raEnd = raStart+READAHEADBUFSIZE; if (start >= raStart && start < raEnd) { // copy bytes out of rabuf int endInBuf = min(raEnd, end); int sizeInBuf = endInBuf - start; memcpy(cbuf, file->sparseReadAheadBuf + (start-raStart), sizeInBuf); cbuf += sizeInBuf; bytesRead += sizeInBuf; start = raEnd; size -= sizeInBuf; file->offset += sizeInBuf; if (size == 0) break; } file->sparseReadAhead = FALSE; mustLseek(file->fdSparse, start, SEEK_SET); } bits64 saveEnd = end; if (size < READAHEADBUFSIZE) { file->sparseReadAhead = TRUE; if (!file->sparseReadAheadBuf) file->sparseReadAheadBuf = needMem(READAHEADBUFSIZE); file->sparseRAOffset = start; size = READAHEADBUFSIZE; end = start + size; if (end > file->size) { end = file->size; size = end - start; } } /* If we're outside of the window of file we already know is good, then have to * consult cache on disk, and maybe even fetch data remotely! */ if (start < file->startData || end > file->endData) { if (!udcCachePreload(file, start, size)) { verbose(2, "udcCachePreload failed"); bytesRead = 0; break; } /* Currently only need fseek here. Would be safer, but possibly * slower to move fseek so it is always executed in front of read, in * case other code is moving around file pointer. */ mustLseek(file->fdSparse, start, SEEK_SET); } if (file->sparseReadAhead) { mustReadFd(file->fdSparse, file->sparseReadAheadBuf, size); end = saveEnd; size = end - start; } else { mustReadFd(file->fdSparse, cbuf, size); file->offset += size; bytesRead += size; break; } } return bytesRead; } void udcMustRead(struct udcFile *file, void *buf, int size) /* Read a block from file. Abort if any problem, including EOF before size is read. */ { int sizeRead = udcRead(file, buf, size); if (sizeRead < size) errAbort("udc couldn't read %d bytes from %s, did read %d", size, file->url, sizeRead); } int udcGetChar(struct udcFile *file) /* Get next character from file or die trying. */ { UBYTE b; udcMustRead(file, &b, 1); return b; } bits64 udcReadBits64(struct udcFile *file, boolean isSwapped) /* Read and optionally byte-swap 64 bit entity. */ { bits64 val; udcMustRead(file, &val, sizeof(val)); if (isSwapped) val = byteSwap64(val); return val; } bits32 udcReadBits32(struct udcFile *file, boolean isSwapped) /* Read and optionally byte-swap 32 bit entity. */ { bits32 val; udcMustRead(file, &val, sizeof(val)); if (isSwapped) val = byteSwap32(val); return val; } bits16 udcReadBits16(struct udcFile *file, boolean isSwapped) /* Read and optionally byte-swap 16 bit entity. */ { bits16 val; udcMustRead(file, &val, sizeof(val)); if (isSwapped) val = byteSwap16(val); return val; } float udcReadFloat(struct udcFile *file, boolean isSwapped) /* Read and optionally byte-swap floating point number. */ { float val; udcMustRead(file, &val, sizeof(val)); if (isSwapped) val = byteSwapFloat(val); return val; } double udcReadDouble(struct udcFile *file, boolean isSwapped) /* Read and optionally byte-swap double-precision floating point number. */ { double val; udcMustRead(file, &val, sizeof(val)); if (isSwapped) val = byteSwapDouble(val); return val; } char *udcReadStringAndZero(struct udcFile *file) /* Read in zero terminated string from file. Do a freeMem of result when done. */ { char shortBuf[2], *longBuf = NULL, *buf = shortBuf; int i, bufSize = sizeof(shortBuf); for (i=0; ; ++i) { /* See if need to expand buffer, which is initially on stack, but if it gets big goes into * heap. */ if (i >= bufSize) { int newBufSize = bufSize*2; char *newBuf = needLargeMem(newBufSize); memcpy(newBuf, buf, bufSize); freeMem(longBuf); buf = longBuf = newBuf; bufSize = newBufSize; } char c = udcGetChar(file); buf[i] = c; if (c == 0) break; } char *retString = cloneString(buf); freeMem(longBuf); return retString; } char *udcFileReadAll(char *url, char *cacheDir, size_t maxSize, size_t *retSize) /* Read a complete file via UDC. The cacheDir may be null in which case udcDefaultDir() * will be used. If maxSize is non-zero, check size against maxSize * and abort if it's bigger. Returns file data (with an extra terminal for the * common case where it's treated as a C string). If retSize is non-NULL then * returns size of file in *retSize. Do a freeMem or freez of the returned buffer * when done. */ { struct udcFile *file = udcFileOpen(url, cacheDir); size_t size = file->size; if (maxSize != 0 && size > maxSize) errAbort("%s is %lld bytes, but maxSize to udcFileReadAll is %lld", url, (long long)size, (long long)maxSize); char *buf = needLargeMem(size+1); udcMustRead(file, buf, size); buf[size] = 0; // add trailing zero for string processing udcFileClose(&file); if (retSize != NULL) *retSize = size; return buf; } struct lineFile *udcWrapShortLineFile(char *url, char *cacheDir, size_t maxSize) /* Read in entire short (up to maxSize) url into memory and wrap a line file around it. * The cacheDir may be null in which case udcDefaultDir() will be used. If maxSize * is zero then a default value (currently 64 meg) will be used. */ { if (maxSize == 0) maxSize = 64 * 1024 * 1024; char *buf = udcFileReadAll(url, cacheDir, maxSize, NULL); return lineFileOnString(url, TRUE, buf); } void udcSeek(struct udcFile *file, bits64 offset) /* Seek to a particular position in file. */ { file->offset = offset; mustLseek(file->fdSparse, offset, SEEK_SET); } bits64 udcTell(struct udcFile *file) /* Return current file position. */ { return file->offset; } static long bitRealDataSize(char *fileName) /* Return number of real bytes indicated by bitmaps */ { struct udcBitmap *bits = udcBitmapOpen(fileName); int blockSize = bits->blockSize; long byteSize = 0; int blockCount = (bits->fileSize + blockSize - 1)/blockSize; if (blockCount > 0) { int bitmapSize = bitToByteSize(blockCount); Bits *b = needLargeMem(bitmapSize); mustReadFd(bits->fd, b, bitmapSize); int bitsSet = bitCountRange(b, 0, blockCount); byteSize = (long)bitsSet*blockSize; freez(&b); } udcBitmapClose(&bits); return byteSize; } static bits64 rCleanup(time_t deleteTime, boolean testOnly) /* Delete any bitmap or sparseData files last accessed before deleteTime */ { struct fileInfo *file, *fileList = listDirX(".", "*", FALSE); bits64 results = 0; for (file = fileList; file != NULL; file = file->next) { if (file->isDir) { setCurrentDir(file->name); bits64 oneResult = rCleanup(deleteTime, testOnly); setCurrentDir(".."); if (oneResult > 0) { if (!testOnly) remove(file->name); results += oneResult; results += file->size; } } else if (sameString(file->name, bitmapName)) { verbose(2, "%ld (%ld) %s/%s\n", bitRealDataSize(file->name), (long)file->size, getCurrentDir(), file->name); if (file->lastAccess < deleteTime) { /* Remove all files when get bitmap, so that can ensure they are deleted in * right order. */ results += file->size; if (!testOnly) { remove(bitmapName); remove(sparseDataName); } } } else if (sameString(file->name, sparseDataName)) { if (results > 0) results += file->size; } } return results; } bits64 udcCleanup(char *cacheDir, double maxDays, boolean testOnly) /* Remove cached files older than maxDays old. If testOnly is set * no clean up is done, but the size of the files that would be * cleaned up is still. */ { time_t maxSeconds = maxDays * 24 * 60 * 60; char *curPath = cloneString(getCurrentDir()); setCurrentDir(cacheDir); time_t deleteTime = time(NULL) - maxSeconds; bits64 result = rCleanup(deleteTime, testOnly); setCurrentDir(curPath); return result; } static char *defaultDir = "/tmp/udcCache"; char *udcDefaultDir() /* Get default directory for cache */ { return defaultDir; } void udcSetDefaultDir(char *path) /* Set default directory for cache */ { defaultDir = path; } int udcCacheTimeout() /* Get cache timeout (if local cache files are newer than this many seconds, * we won't ping the remote server to check the file size and update time). */ { return cacheTimeout; } void udcSetCacheTimeout(int timeout) /* Set cache timeout (if local cache files are newer than this many seconds, * we won't ping the remote server to check the file size and update time). */ { cacheTimeout = timeout; } time_t udcUpdateTime(struct udcFile *udc) /* return udc->updateTime */ { if (sameString("transparent", udc->protocol)) { struct stat status; int ret = stat(udc->url, &status); if (ret < 0) return 0; else return status.st_mtime; } return udc->updateTime; } #ifdef PROGRESS_METER off_t remoteFileSize(char *url) /* fetch remote file size from given URL */ { off_t answer = 0; struct udcRemoteFileInfo info; if (startsWith("http://",url) || startsWith("https://",url)) { if (udcInfoViaHttp(url, &info)) answer = info.size; } else if (startsWith("ftp://",url)) { if (udcInfoViaFtp(url, &info)) answer = info.size; } return answer; } #endif rtracklayer/src/ucsc/udc.h0000644000126300012640000001427312227135242017137 0ustar00biocbuildphs_compbio/* udc - url data cache - a caching system that keeps blocks of data fetched from URLs in * sparse local files for quick use the next time the data is needed. * * This cache is enormously simplified by there being no local _write_ to the cache, * just reads. * * The overall strategy of the implementation is to have a root cache directory * with a subdir for each file being cached. The directory for a single cached file * contains two files - "bitmap" and "sparseData" that contains information on which * parts of the URL are cached and the actual cached data respectively. The subdirectory name * associated with the file is constructed from the URL in a straightforward manner. * http://genome.ucsc.edu/cgi-bin/hgGateway * gets mapped to: * rootCacheDir/http/genome.ucsc.edu/cgi-bin/hgGateway/ * The URL protocol is the first directory under the root, and the remainder of the * URL, with some necessary escaping, is used to define the rest of the cache directory * structure, with each '/' after the protocol line translating into another directory * level. * * The bitmap file contains time stamp and size data as well as an array with one bit * for each block of the file that has been fetched. Currently the block size is 8K. */ #ifndef UDC_H #define UDC_H struct udcFile; /* Handle to a cached file. Inside of structure mysterious unless you are udc.c. */ struct udcFile *udcFileMayOpen(char *url, char *cacheDir); /* Open up a cached file. cacheDir may be null in which case udcDefaultDir() will be * used. Return NULL if file doesn't exist. */ struct udcFile *udcFileOpen(char *url, char *cacheDir); /* Open up a cached file. cacheDir may be null in which case udcDefaultDir() will be * used. Abort if if file doesn't exist. */ void udcFileClose(struct udcFile **pFile); /* Close down cached file. */ int udcRead(struct udcFile *file, void *buf, int size); /* Read a block from file. Return amount actually read. */ void udcMustRead(struct udcFile *file, void *buf, int size); /* Read a block from file. Abort if any problem, including EOF before size is read. */ #define udcMustReadOne(file, var) udcMustRead(file, &(var), sizeof(var)) /* Read one variable from file or die. */ bits64 udcReadBits64(struct udcFile *file, boolean isSwapped); /* Read and optionally byte-swap 64 bit entity. */ bits32 udcReadBits32(struct udcFile *file, boolean isSwapped); /* Read and optionally byte-swap 32 bit entity. */ bits16 udcReadBits16(struct udcFile *file, boolean isSwapped); /* Read and optionally byte-swap 16 bit entity. */ float udcReadFloat(struct udcFile *file, boolean isSwapped); /* Read and optionally byte-swap floating point number. */ double udcReadDouble(struct udcFile *file, boolean isSwapped); /* Read and optionally byte-swap double-precision floating point number. */ int udcGetChar(struct udcFile *file); /* Get next character from file or die trying. */ char *udcReadStringAndZero(struct udcFile *file); /* Read in zero terminated string from file. Do a freeMem of result when done. */ char *udcFileReadAll(char *url, char *cacheDir, size_t maxSize, size_t *retSize); /* Read a complete file via UDC. The cacheDir may be null in which case udcDefaultDir() * will be used. If maxSize is non-zero, check size against maxSize * and abort if it's bigger. Returns file data (with an extra terminal for the * common case where it's treated as a C string). If retSize is non-NULL then * returns size of file in *retSize. Do a freeMem or freez of the returned buffer * when done. */ struct lineFile *udcWrapShortLineFile(char *url, char *cacheDir, size_t maxSize); /* Read in entire short (up to maxSize) url into memory and wrap a line file around it. * The cacheDir may be null in which case udcDefaultDir() will be used. If maxSize * is zero then a default value (currently 64 meg) will be used. */ void udcSeek(struct udcFile *file, bits64 offset); /* Seek to a particular (absolute) position in file. */ bits64 udcTell(struct udcFile *file); /* Return current file position. */ bits64 udcCleanup(char *cacheDir, double maxDays, boolean testOnly); /* Remove cached files older than maxDays old. If testOnly is set * no clean up is done, but the size of the files that would be * cleaned up is still. */ void udcParseUrlFull(char *url, char **retProtocol, char **retAfterProtocol, char **retColon, char **retAuth); /* Parse the URL into components that udc treats separately. * *retAfterProtocol is Q-encoded to keep special chars out of filenames. * Free all *ret's except *retColon when done. */ char *udcDefaultDir(); /* Get default directory for cache. Use this for the udcFileOpen call if you * don't have anything better.... */ void udcSetDefaultDir(char *path); /* Set default directory for cache */ #define udcDevicePrefix "udc:" /* Prefix used by convention to indicate a file should be accessed via udc. This is * followed by the local path name or a url, so in common practice you see things like: * udc:http://genome.ucsc.edu/goldenPath/hg18/tracks/someTrack.bb */ struct slName *udcFileCacheFiles(char *url, char *cacheDir); /* Return low-level list of files used in cache. */ char *udcPathToUrl(const char *path, char *buf, size_t size, char *cacheDir); /* Translate path into an URL, store in buf, return pointer to buf if successful * and NULL if not. */ long long int udcSizeFromCache(char *url, char *cacheDir); /* Look up the file size from the local cache bitmap file, or -1 if there * is no cache for url. */ unsigned long udcCacheAge(char *url, char *cacheDir); /* Return the age in seconds of the oldest cache file. If a cache file is * missing, return the current time (seconds since the epoch). */ int udcCacheTimeout(); /* Get cache timeout (if local cache files are newer than this many seconds, * we won't ping the remote server to check the file size and update time). */ void udcSetCacheTimeout(int timeout); /* Set cache timeout (if local cache files are newer than this many seconds, * we won't ping the remote server to check the file size and update time). */ time_t udcUpdateTime(struct udcFile *udc); /* return udc->updateTime */ #ifdef PROGRESS_METER off_t remoteFileSize(char *url); /* fetch remote file size from given URL */ #endif #endif /* UDC_H */ rtracklayer/src/ucsc/verbose.c0000644000126300012640000000651112227135242020020 0ustar00biocbuildphs_compbio/* verbose.c - write out status messages according to the * current verbosity level. These messages go to stderr. */ #include "common.h" #include "portable.h" #include "verbose.h" static char const rcsid[] = "$Id: verbose.c,v 1.7 2010/04/01 17:31:10 markd Exp $"; static int logVerbosity = 1; /* The level of log verbosity. 0 is silent. */ static FILE *logFile; /* File to log to. */ static boolean checkedDotsEnabled = FALSE; /* have we check for dot output * being enabled? */ static boolean dotsEnabled = FALSE; /* is dot output enabled? */ void verboseVa(int verbosity, char *format, va_list args) /* Log with at given verbosity vprintf formatted args. */ { if (verbosity <= logVerbosity) { if (logFile == NULL) logFile = stderr; vfprintf(logFile, format, args); fflush(logFile); } } void verbose(int verbosity, char *format, ...) /* Write printf formatted message to log (which by * default is stderr) if global verbose variable * is set to verbosity or higher. */ { va_list args; va_start(args, format); verboseVa(verbosity, format, args); va_end(args); } static long lastTime = -1; // previous call time. void verboseTimeInit(void) /* Initialize or reinitialize the previous time for use by verboseTime. */ { lastTime = clock1000(); } void verboseTime(int verbosity, char *label, ...) /* Print label and how long it's been since last call. Start time can be * initialized with verboseTimeInit, otherwise the elapsed time will be * zero. */ { assert(label != NULL); // original version allowed this, but breaks some GCCs if (lastTime < 0) verboseTimeInit(); long time = clock1000(); va_list args; va_start(args, label); verboseVa(verbosity, label, args); verbose(verbosity, ": %ld millis\n", time - lastTime); lastTime = time; va_end(args); } boolean verboseDotsEnabled() /* check if outputting of happy dots are enabled. They will be enabled if the * verbosity is > 0, stderr is a tty and we don't appear to be running an * emacs shell. */ { if (!checkedDotsEnabled) { if (logFile == NULL) logFile = stderr; dotsEnabled = (logVerbosity > 0) && isatty(fileno(logFile)); if (dotsEnabled) { /* check for an possible emacs shell */ char *emacs = getenv("emacs"); char *term = getenv("TERM"); if ((emacs != NULL) && (emacs[0] == 't')) dotsEnabled = FALSE; else if ((term != NULL) && sameString(term, "dumb")) dotsEnabled = FALSE; } checkedDotsEnabled = TRUE; } return dotsEnabled; } void verboseDot() /* Write I'm alive dot (at verbosity level 1) */ { if (verboseDotsEnabled()) verbose(1, "."); } void verboseSetLevel(int verbosity) /* Set verbosity level in log. 0 for no logging, * higher number for increasing verbosity. */ { logVerbosity = verbosity; checkedDotsEnabled = FALSE; /* force rechecking of dots enabled */ } int verboseLevel(void) /* Get verbosity level. */ { return logVerbosity; } void verboseSetLogFile(char *name) /* Set logFile for verbose messages overrides stderr. */ { if (sameString(name, "stdout")) logFile = stdout; else if (sameString(name, "stderr")) logFile = stderr; else logFile = mustOpen(name, "w"); } FILE *verboseLogFile() /* Get the verbose log file. */ { if (logFile == NULL) logFile = stderr; return logFile; } rtracklayer/src/ucsc/verbose.h0000644000126300012640000000302012227135242020015 0ustar00biocbuildphs_compbio/* verbose.h - write out status messages according to the * current verbosity level. These messages go to stderr. */ #ifndef VERBOSE_H #define VERBOSE_H void verbose(int verbosity, char *format, ...) /* Write printf formatted message to log (which by * default is stderr) if global verbose variable * is set to verbosity or higher. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; void verboseVa(int verbosity, char *format, va_list args); /* Log with at given verbosity vprintf formatted args. */ void verboseTimeInit(void); /* Initialize or reinitialize the previous time for use by verboseTime. */ void verboseTime(int verbosity, char *label, ...) /* Print label and how long it's been since last call. Start time can be * initialized with verboseTimeInit, otherwise the elapsed time will be * zero. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; void verboseDot(); /* Write I'm alive dot (at verbosity level 1) */ boolean verboseDotsEnabled(); /* check if outputting of happy dots are enabled. They will be enabled if the * verbosity is > 0, stderr is a tty and we don't appear to be running an * emacs shell. */ int verboseLevel(void); /* Get verbosity level. */ void verboseSetLevel(int verbosity); /* Set verbosity level in log. 0 for no logging, * higher number for increasing verbosity. */ void verboseSetLogFile(char *name); /* Set logFile for verbose messages overrides stderr. */ FILE *verboseLogFile(); /* Get the verbose log file. */ #endif /* VERBOSE_H */ rtracklayer/src/ucsc/wildcmp.c0000644000126300012640000000460212227135242020011 0ustar00biocbuildphs_compbio/* Wildcard matching. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" static char const rcsid[] = "$Id: wildcmp.c,v 1.7 2009/11/20 19:11:16 angie Exp $"; static int subMatch(const char *str, const char *wild, char single, char multi) /* Returns number of characters that match between str and wild up * to the next wildcard in wild (or up to end of string.). */ { int len = 0; for(;;) { if(toupper(*str++) != toupper(*wild++) ) return(0); ++len; char c = *wild; if (c == 0 || c == single || c == multi) return len; } } boolean anyWild(const char *string) /* Return TRUE if any wild card characters in string. */ { char c; while ((c = *string++) != 0) { if (c == '?' || c == '*') return TRUE; } return FALSE; } static boolean globMatch(const char *wildCard, const char *string, char single, char multi) /* does a case sensitive wild card match with a string. * * matches any string or no character. * ? matches any single character. * anything else etc must match the character exactly. */ { boolean matchStar = 0; int starMatchSize; char c; for(;;) { NEXT_WILD: c = *wildCard; if (c == 0) { if(matchStar) { while(*string++) ; return TRUE; } else if(*string) return FALSE; else return TRUE; } else if (c == multi) { matchStar = TRUE; } else if (c == single) { if(*string == 0) return FALSE; /* out of string, no match for ? */ ++string; } else { if(matchStar) { for(;;) { if(*string == 0) /* if out of string no match */ return FALSE; /* note matchStar is re-used here for substring * after star match length */ if((starMatchSize = subMatch(string,wildCard,single,multi)) != 0) { string += starMatchSize; wildCard += starMatchSize; matchStar = FALSE; goto NEXT_WILD; } ++string; } } /* default: they must be equal or no match */ if(toupper(*string) != toupper(*wildCard)) return FALSE; ++string; } ++wildCard; } } boolean wildMatch(const char *wildCard, const char *string) /* Match using * and ? wildcards. */ { return globMatch(wildCard, string, '?', '*'); } boolean sqlMatchLike(char *wildCard, char *string) /* Match using % and _ wildcards. */ { return globMatch(wildCard, string, '_', '%'); } rtracklayer/src/ucsc/zlibFace.c0000644000126300012640000000527512227135242020100 0ustar00biocbuildphs_compbio/* Wrappers around zlib to make interfacing to it a bit easier. */ #include "common.h" #include static char *zlibErrorMessage(int err) /* Convert error code to errorMessage */ { switch (err) { case Z_STREAM_END: return "zlib stream end"; case Z_NEED_DICT: return "zlib need dictionary"; case Z_ERRNO: return "zlib errno"; case Z_STREAM_ERROR: return "zlib data error"; case Z_DATA_ERROR: return "zlib data error"; case Z_MEM_ERROR: return "zlib mem error"; case Z_BUF_ERROR: return "zlib buf error"; case Z_VERSION_ERROR: return "zlib version error"; case Z_OK: return NULL; default: { static char msg[128]; safef(msg, sizeof(msg), "zlib error code %d", err); return msg; } } } size_t zCompress( void *uncompressed, /* Start of area to compress. */ size_t uncompressedSize, /* Size of area to compress. */ void *compBuf, /* Where to put compressed bits */ size_t compBufSize) /* Size of compressed bits - calculate using zCompBufSize */ /* Compress data from memory to memory. Returns size after compression. */ { uLongf compSize = compBufSize; int err = compress((Bytef*)compBuf, &compSize, (Bytef*)uncompressed, (uLong)uncompressedSize); if (err != 0) errAbort("Couldn't zCompress %lld bytes: %s", (long long)uncompressedSize, zlibErrorMessage(err)); return compSize; } size_t zCompBufSize(size_t uncompressedSize) /* Return size of buffer needed to compress something of given size uncompressed. */ { return 1.001*uncompressedSize + 13; } size_t zUncompress( void *compressed, /* Compressed area */ size_t compressedSize, /* Size after compression */ void *uncompBuf, /* Where to put uncompressed bits */ size_t uncompBufSize) /* Max size of uncompressed bits. */ /* Uncompress data from memory to memory. Returns size after decompression. */ { uLongf uncSize = uncompBufSize; int err = uncompress(uncompBuf, &uncSize, compressed, compressedSize); if (err != 0) errAbort("Couldn't zUncompress %lld bytes: %s", (long long)compressedSize, zlibErrorMessage(err)); return uncSize; } void zSelfTest(int count) /* Run an internal diagnostic. */ { bits32 testData[count]; int uncSize = count*sizeof(bits32); int i; for (i=0; i 0)); } /* Utility for collapsing elements of a CharacterList */ /* Assumes that 'x' is a 'list' */ SEXP CharacterList_pasteCollapse(SEXP x, SEXP sep) { SEXP ans; if (TYPEOF(x) != VECSXP) error("CharacterList_collapse: expected a list"); PROTECT(ans = allocVector(STRSXP, length(x))); for (int i = 0; i < length(x); i++) SET_STRING_ELT(ans, i, _STRSXP_collapse(VECTOR_ELT(x, i), sep)); UNPROTECT(1); return ans; } rtracklayer/src/utils.h0000644000126300012640000000016712227135242016564 0ustar00biocbuildphs_compbio#ifndef UTILS_H #define UTILS_H #include "rtracklayer.h" SEXP CharacterList_pasteCollapse(SEXP x, SEXP sep); #endif rtracklayer/tests/0000755000126300012640000000000012227067656015637 5ustar00biocbuildphs_compbiortracklayer/tests/rtracklayer_unit_tests.R0000644000126300012640000000013312227067656022563 0ustar00biocbuildphs_compbiorequire("rtracklayer") || stop("unable to load rtracklayer package") rtracklayer:::.test()