Seurat/0000755000176200001440000000000015117462442011523 5ustar liggesusersSeurat/tests/0000755000176200001440000000000015063070153012657 5ustar liggesusersSeurat/tests/testthat/0000755000176200001440000000000015117462442014525 5ustar liggesusersSeurat/tests/testthat/test_spatial.R0000644000176200001440000002331115056057544017351 0ustar liggesusers# setup shared test fixtures path_to_counts <- system.file("extdata", "pbmc_raw.txt", package = "Seurat") path_to_image = file.path("../testdata/visium/spatial") build_spatial_data <- function(assay_name, image_name, id_prefix) { raw_counts <- read.table(path_to_counts, sep = "\t", row.names = 1) image <- Read10X_Image( path_to_image, assay = assay_name, slice = image_name ) cell_names <- Cells(image) counts <- do.call(cbind, replicate(34, raw_counts, simplify = FALSE)) counts <- counts[1:length(cell_names)] counts <- as.sparse(as.matrix(counts)) colnames(counts) <- cell_names test_data <- CreateSeuratObject(counts, assay = assay_name) test_data[[image_name]] <- image test_data <- RenameCells( test_data, add.cell.id = id_prefix ) return (test_data) } test_render <- function(plot) { grDevices::pdf(NULL) print(plot) dev.off() } equivalent_plots <- function(plot1, plot2) { if (length(plot1$layers) != length(plot2$layers)) { return(FALSE) } for (i in seq_along(plot1$layers)) { layer1 <- plot1$layers[[i]] layer2 <- plot2$layers[[i]] if (class(layer1$geom)[1] != class(layer2$geom)[1]) { return(FALSE) } if (!identical(layer1$data, layer2$data)) { return(FALSE) } } return(TRUE) } test.data.1 <- build_spatial_data( assay_name = "Spatial.A", image_name = "slice1.A", id_prefix = "test-data-1" ) test.data.2 <- build_spatial_data( assay_name = "Spatial.A", image_name = "slice2.A", id_prefix = "test-data-2" ) test.data.3 <- build_spatial_data( assay_name = "Spatial.B", image_name = "slice2.B", id_prefix = "test-data-3" ) context("SpatialFeaturePlot") test_that("SpatialFeaturePlot works with a single assay/image", { test.case <- test.data.1 plot.1 <- SpatialFeaturePlot(test.case, features = "nCount_Spatial.A") plot.2 <- SpatialFeaturePlot( test.case, images = "slice1.A", features = "nCount_Spatial.A" ) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plot.1, plot.2)) }) test_that("SpatialFeaturePlot works with multiple layers & images", { test.case <- merge(test.data.1, test.data.2) plots <- SpatialFeaturePlot(test.case, features = "nCount_Spatial.A") plot.1 <- SpatialFeaturePlot( test.case, images = "slice1.A", features = "nCount_Spatial.A" ) plot.2 <- SpatialFeaturePlot( test.case, images = "slice2.A", features = "nCount_Spatial.A" ) expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[1]], plot.1)) expect_true(equivalent_plots(plots[[2]], plot.2)) }) test_that("SpatialFeaturePlot works with multiple overlapping images", { skip_if_not_installed("sf") test.case <- test.data.1 suppressWarnings( test.case[["slice1.crop"]] <- Crop( test.case[["slice1.A"]], x = c(0, 5000), y = c(0, 5000) ) ) plots <- SpatialFeaturePlot(test.case, features = "nCount_Spatial.A") plot.1 <- SpatialFeaturePlot( test.case, images = "slice1.A", features = "nCount_Spatial.A" ) plot.2 <- SpatialFeaturePlot( test.case, images = "slice1.crop", features = "nCount_Spatial.A" ) expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[1]], plot.1)) expect_true(equivalent_plots(plots[[2]], plot.2)) }) test_that("SpatialFeaturePlot works with multiple assays & images", { test.case <- merge(test.data.1, test.data.3) DefaultAssay(test.case) <- "Spatial.A" plot.1 <- SpatialFeaturePlot(test.case, features = "nCount_Spatial.A") plot.2 <- SpatialFeaturePlot( test.case, features = "nCount_Spatial.A", images = "slice2.B" ) plots <- SpatialFeaturePlot( test.case, features = "nCount_Spatial.A", images = c("slice1.A", "slice2.B") ) expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[1]], plot.1)) expect_true(equivalent_plots(plots[[2]], plot.2)) DefaultAssay(test.case) <- "Spatial.B" plot.1 <- SpatialFeaturePlot(test.case, features = "nCount_Spatial.B") plot.2 <- SpatialFeaturePlot( test.case, features = "nCount_Spatial.B", images = "slice1.A" ) plots <- SpatialFeaturePlot( test.case, features = "nCount_Spatial.B", images = c("slice1.A", "slice2.B") ) expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[2]], plot.1)) expect_true(expect_true(equivalent_plots(plots[[1]], plot.2))) }) test_that("SpatialFeaturePlot works with multiple assays, layers, & images", { test.case <- merge(test.data.1, c(test.data.2, test.data.3)) DefaultAssay(test.case) <- "Spatial.A" plots <- SpatialFeaturePlot(test.case, features = "nCount_Spatial.A") plot.1 <- SpatialFeaturePlot( test.case, images = "slice1.A", features = "nCount_Spatial.A" ) plot.2 <- SpatialFeaturePlot( test.case, images = "slice2.A", features = "nCount_Spatial.A" ) expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[1]], plot.1)) expect_true(equivalent_plots(plots[[2]], plot.2)) DefaultAssay(test.case) <- "Spatial.B" plot.1 <- SpatialFeaturePlot(test.case, features = "nCount_Spatial.B") plot.2 <- SpatialFeaturePlot( test.case, features = "nCount_Spatial.B", images = "slice2.A" ) plots <- SpatialFeaturePlot( test.case, features = "nCount_Spatial.B", images = c("slice2.A", "slice2.B") ) expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[1]], plot.2)) expect_true(equivalent_plots(plots[[2]], plot.1)) }) context("SpatialDimPlot") test_that("SpatialDimPlot works with a single assay/image", { test.case <- test.data.1 plot.1 <- SpatialDimPlot(test.case) plot.2 <- SpatialDimPlot( test.case, images = "slice1.A" ) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plot.1, plot.2)) }) test_that("SpatialDimPlot works with multiple layers/images", { test.case <- merge(test.data.1, test.data.2) plots <- SpatialDimPlot(test.case) plot.1 <- SpatialDimPlot( test.case, images = "slice1.A" ) plot.2 <- SpatialDimPlot( test.case, images = "slice2.A" ) expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[1]], plot.1)) expect_true(equivalent_plots(plots[[2]], plot.2)) }) test_that("SpatialDimPlot works with multiple overlapping images", { skip_if_not_installed("sf") test.case <- test.data.1 suppressWarnings( test.case[["slice1.crop"]] <- Crop( test.case[["slice1.A"]], x = c(0, 5000), y = c(0, 5000) ) ) plots <- SpatialDimPlot(test.case) plot.1 <- SpatialDimPlot( test.case, images = "slice1.A" ) plot.2 <- SpatialDimPlot( test.case, images = "slice1.crop" ) expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[1]], plot.1)) expect_true(equivalent_plots(plots[[2]], plot.2)) }) test_that("SpatialDimPlot works with multiple assays/images", { test.case <- merge(test.data.1, test.data.3) DefaultAssay(test.case) <- "Spatial.A" plot.1 <- SpatialDimPlot(test.case) plot.2 <- SpatialDimPlot( test.case, images = "slice2.B" ) plots <- SpatialDimPlot( test.case, images = c("slice1.A", "slice2.B") ) expect_equal(length(plots), 2) expect_true(equivalent_plots(plots[[1]], plot.1)) expect_true(equivalent_plots(plots[[2]], plot.2)) DefaultAssay(test.case) <- "Spatial.B" plot.1 <- SpatialDimPlot(test.case) plot.2 <- SpatialDimPlot( test.case, images = "slice1.A" ) plots <- SpatialDimPlot(test.case, images = c("slice1.A", "slice2.B")) expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[2]], plot.1)) expect_true(expect_true(equivalent_plots(plots[[1]], plot.2))) }) test_that("SpatialDimPlot works with multiple assays, layers, & images", { test.case <- merge(test.data.1, c(test.data.2, test.data.3)) DefaultAssay(test.case) <- "Spatial.A" plots <- SpatialDimPlot(test.case) plot.1 <- SpatialDimPlot(test.case, images = "slice1.A") plot.2 <- SpatialDimPlot(test.case, images = "slice2.A") expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[1]], plot.1)) expect_true(equivalent_plots(plots[[2]], plot.2)) DefaultAssay(test.case) <- "Spatial.B" plot.1 <- SpatialDimPlot(test.case) plot.2 <- SpatialDimPlot(test.case, images = "slice2.A") plots <- SpatialDimPlot(test.case, images = c("slice2.A", "slice2.B")) expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[1]], plot.2)) expect_true(equivalent_plots(plots[[2]], plot.1)) }) Seurat/tests/testthat/test_visualization.R0000644000176200001440000000157715056057544020627 0ustar liggesusers# Tests for functions in visualization.R set.seed(42) # Tests for visualization utilities # ------------------------------------------------------------------------------ pbmc_small[["tsne_new"]] <- CollapseEmbeddingOutliers(pbmc_small, reduction = "tsne", reduction.key = 'tsne_', outlier.sd = 0.5) test_that("CollapseEmbeddingOutliers works", { expect_equal(Embeddings(pbmc_small[["tsne_new"]])[1, 1], -12.59713, tolerance = 1e-6) expect_equal(colSums(x = Embeddings(object = pbmc_small[["tsne_new"]])), c(-219.9218, 182.9215), check.attributes = FALSE, tolerance = 1e-5) }) test_that("DiscretePalette works", { isColors <- function(x) { all(grepl("#[0-9A-Fa-f]{6}", x)) } expect_true(isColors(DiscretePalette(26))) expect_true(isColors(DiscretePalette(32))) expect_true(isColors(DiscretePalette(36))) expect_warning(DiscretePalette(50), "Not enough colours") }) Seurat/tests/testthat/test_modularity_optimizer.R0000644000176200001440000001117715056057544022216 0ustar liggesusers# Tests to verify the RCpp version of ModularityOptimizer produces the same # results as the java version. # Equivalent java commands are given above. context("ModularityOptimizer") # The "karate club" network available from the ModularityOptimizer website at: # http://www.ludowaltman.nl/slm/ node1 <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 8, 8, 8, 9, 13, 14, 14, 15, 15, 18, 18, 19, 20, 20, 22, 22, 23, 23, 23, 23, 23, 24, 24, 24, 25, 26, 26, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32) node2 <- c(1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 17, 19, 21, 31, 2, 3, 7, 13, 17, 19, 21, 30, 3, 7, 8, 9, 13, 27, 28, 32, 7, 12, 13, 6, 10, 6, 10, 16, 16, 30, 32, 33, 33, 33, 32, 33, 32, 33, 32, 33, 33, 32, 33, 32, 33, 25, 27, 29, 32, 33, 25, 27, 31, 31, 29, 33, 33, 31, 33, 32, 33, 32, 33, 32, 33, 33) dim_s <- max(max(node1), max(node2)) + 1 # Note we want to represent network in the lower diagonal. connections <- sparseMatrix(i = node2 + 1, j = node1 + 1, x = 1.0) # Result from equivalent command to # java -jar ModularityOptimizer.jar karate_club_network.txt communities.txt 1 1.0 1 1 1 564 0 test_that("Algorithm 1", { expected <- c(1, 1, 1, 1, 2, 2, 2, 1, 0, 1, 2, 1, 1, 1, 0, 0, 2, 1, 0, 1, 0, 1, 0, 0, 3, 3, 0, 0, 3, 0, 0, 3, 0, 0) s <- Seurat:::RunModularityClusteringCpp( SNN = connections, modularityFunction = 1, resolution = 1.0, algorithm = 1, nRandomStarts = 1, nIterations = 1, randomSeed = 564, printOutput = 0, "" ) expect_equal(expected, s) }) #java -jar ModularityOptimizer.jar karate_club_network.txt communities.txt 1 1.0 2 1 1 2 0 test_that("Algorithm 2", { expected <- c(1, 1, 1, 1, 3, 3, 3, 1, 0, 0, 3, 1, 1, 1, 0, 0, 3, 1, 0, 1, 0, 1, 0, 2, 2, 2, 0, 2, 2, 0, 0, 2, 0, 0) s <- Seurat:::RunModularityClusteringCpp( SNN = connections, modularityFunction = 1, resolution = 1.0, algorithm = 2, nRandomStarts = 1, nIterations = 1, randomSeed = 2, printOutput = 0, "" ) expect_equal(expected, s) }) #java -jar ModularityOptimizer.jar karate_club_network.txt communities.txt 1 1.0 3 1 1 56464 0 test_that("Algorithm 3", { expected <- c(1, 1, 1, 1, 3, 3, 3, 1, 0, 0, 3, 1, 1, 1, 0, 0, 3, 1, 0, 1, 0, 1, 0, 2, 2, 2, 0, 2, 2, 0, 0, 2, 0, 0) s <- Seurat:::RunModularityClusteringCpp( SNN = connections, modularityFunction = 1, resolution = 1.0, algorithm = 3, nRandomStarts = 1, nIterations = 1, randomSeed = 56464, printOutput = 0, "") expect_equal(expected, s) }) test_that("Low Resolution", { e1 <- rep(0, 34) # java -jar ModularityOptimizer.jar karate_club_network.txt outjava.txt 1 0.05 3 1 10 10 0 s <- Seurat:::RunModularityClusteringCpp( SNN = connections, modularityFunction = 1, resolution = 0.05, algorithm = 3, nRandomStarts = 1, nIterations = 10, randomSeed = 10, printOutput = 0, "" ) expect_equal(s, e1) # java -jar ModularityOptimizer.jar karate_club_network.txt outjava.txt 2 0.05 3 1 10 10 0 s2 <- Seurat:::RunModularityClusteringCpp( SNN = connections, modularityFunction = 2, resolution=0.05, algorithm = 3, nRandomStarts = 1, nIterations = 10, randomSeed = 10, printOutput = 0, "" ) e2 = c(0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) expect_equal(s2, e2) }) test_that("EdgeWeights", { # Make 1, 4, 5 and 20 a community by weighting them c2 <- connections c2[5, 4] <- 3.0 c2[5, 1] <- 5.0 c2[4, 1] <- 8.0 c2[20, 5] <- 8.0 c2[20, 4] <- 5.0 c2[20, 1] <- 5.0 # java -jar ModularityOptimizer.jar weighted_karate_club_network.txt outjava.txt 1 1.0 3 1 10 40 1 s2 <- Seurat:::RunModularityClusteringCpp( SNN = c2, modularityFunction = 1, resolution = 1.0, algorithm = 3, nRandomStarts = 1, nIterations = 10, randomSeed = 40, printOutput = 0, "" ) exp <- c(2, 1, 1, 2, 2, 3, 3, 1, 0, 1, 3, 2, 2, 1, 0, 0, 3, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) expect_equal(s2, exp) }) # test_that("pbmc_small network", { # observed <- as.numeric(FindClusters( # object = pbmc_small, # reduction.type = "pca", # dims.use = 1:10, # resolution = 1.1, # save.SNN = TRUE, # print.output = 0)@ident) # expected = c(1,1,1,1,1,1,1,1,1,1,6,1,6,1,2,2,1,6,2,1,2,2,2,2,2,2,2,2,2,6,3,5,3,3,3,3,3,3,3,3,5,1,1,1,1,1,3,1,3,1,2,1,2,2,6,2,3,2,1,3,5,2,5,5,2,2,2,2,5,3,4,4,4,4,4,4,4,4,4,4) # expect_equal(observed, expected) # }) Seurat/tests/testthat/test_integration.R0000644000176200001440000006212115117056271020233 0ustar liggesusers# Tests for integration/transfer related fxns set.seed(42) pbmc_small <- suppressWarnings(UpdateSeuratObject(pbmc_small)) # Setup test objects ref <- pbmc_small query <- CreateSeuratObject( counts = as.sparse( GetAssayData( object = pbmc_small[['RNA']], layer = "counts") + rpois(n = ncol(pbmc_small), lambda = 1 ) ) ) query <- NormalizeData(object = query, verbose = FALSE) query <- FindVariableFeatures(object = query, verbose = FALSE, nfeatures = 100) ref <- FindVariableFeatures(object = ref, verbose = FALSE, nfeatures = 100) # Tests for FindTransferAnchors # ------------------------------------------------------------------------------ context("FindTransferAnchors") test_that("FindTransferAnchors defaults work", { anchors <- FindTransferAnchors(reference = ref, query = query, k.filter = 50) co <- anchors@object.list[[1]] expect_equal(dim(co), c(100, 160)) expect_equal(Reductions(co), c("pcaproject", "pcaproject.l2")) expect_equal(GetAssayData(co[["RNA"]], layer ="data")[1, 3], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")[1, 3], 0) expect_equal(dim(co[['pcaproject']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject']])[1, 1], 0.4840944592, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject']], projected = T)[1, 1], 0.2103563963, tolerance = 1e-7) expect_equal(dim(co[['pcaproject.l2']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject.l2']])[1, 1], 0.05175486778, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject.l2']], projected = T)[1, 1], 0.2103563963, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(128, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(5, 5, 0.08361970218), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 100) expect_equal(anchors@anchor.features[1], "PPBP") expect_equal(anchors@neighbors, list()) }) test_that("FindTransferAnchors catches bad input", { expect_error(FindTransferAnchors(reference = ref, query = query, reference.assay = "BAD", k.filter = 50)) expect_error(FindTransferAnchors(reference = ref, query = query, query.assay = "BAD", k.filter = 50)) expect_error(FindTransferAnchors(reference = ref, query = query, normalization.method = "BAD", k.filter = 50)) expect_error(FindTransferAnchors(reference = ref, query = query, reduction = "BAD", k.filter = 50)) expect_error(FindTransferAnchors(reference = ref, query = query, npcs = NULL, k.filter = 50)) expect_error(FindTransferAnchors(reference = ref, query = query, npcs = NULL, reference.reduction = "BAD", k.filter = 50)) expect_error(suppressWarngings(FindTransferAnchors(reference = ref, query = query, dims = 1:100, k.filter = 50))) expect_error(suppressWarnings(FindTransferAnchors(reference = ref, query = query, dims = 1:100, project.query = TRUE, k.filter = 50))) expect_error(FindTransferAnchors(reference = ref, query = query, k.anchor = 80, k.filter = 50)) expect_warning(FindTransferAnchors(reference = ref, query = query, k.filter = 81)) expect_error(FindTransferAnchors(reference = ref, query = query, k.filter = 50, k.score = 80)) expect_error(suppressWarnings(FindTransferAnchors(reference = ref, query = query, k.filter = 50, features = "BAD"))) expect_error(FindTransferAnchors(reference = ref, query = query, k.filter = 50, reduction = "cca", project.query = TRUE)) expect_error(FindTransferAnchors(reference = ref, query = query, reference.reduction = "BAD", k.filter = 50)) expect_error(FindTransferAnchors(reference = ref, query = query, reference.reduction = "BAD", project.query = TRUE, k.filter = 50)) }) ref <- ScaleData(ref, verbose = FALSE) ref <- suppressWarnings(RunPCA(ref, npcs = 30, verbose = FALSE)) test_that("FindTransferAnchors allows reference.reduction to be precomputed", { skip_on_cran() anchors <- FindTransferAnchors(reference = ref, query = query, k.filter = 50, reference.reduction = "pca") expect_error(FindTransferAnchors(reference = ref, query = query, k.filter = 50, reference.reduction = "pca", reduction = "cca")) expect_error(FindTransferAnchors(reference = ref, query = query, k.filter = 50, reference.reduction = "pca", project.query = TRUE)) co <- anchors@object.list[[1]] expect_equal(dim(co), c(100, 160)) expect_equal(Reductions(co), c("pcaproject", "pcaproject.l2")) expect_equal(GetAssayData(co[["RNA"]])[1, 3], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")[1, 3], 0) expect_equal(dim(co[['pcaproject']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject']])[1, 1], 0.4840944592, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject']], projected = T)[1, 1], 0.2103563963, tolerance = 1e-7) expect_equal(dim(co[['pcaproject.l2']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject.l2']])[1, 1], 0.05175486778, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject.l2']], projected = T)[1, 1], 0.2103563963, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(128, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(5, 5, 0.08361970218), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 100) expect_equal(anchors@anchor.features[1], "PPBP") expect_equal(anchors@neighbors, list()) }) test_that("FindTransferAnchors with cca defaults work", { skip_on_cran() anchors <- FindTransferAnchors(reference = ref, query = query, reduction = "cca", k.filter = 50) co <- anchors@object.list[[1]] expect_equal(dim(co), c(100, 160)) expect_equal(Reductions(co), c("cca", "cca.l2")) expect_equal(GetAssayData(co[["RNA"]])["PPBP", 3], 0) expect_equal(GetAssayData(co[["RNA"]])["PPBP", 1], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")["PPBP", 3], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")["PPBP", 1], 0) expect_equal(dim(co[['cca']]), c(160, 30)) expect_equal(Embeddings(co[['cca']])[1, 1], 0.04611130861, tolerance = 1e-7) expect_equal(Loadings(co[['cca']], projected = T)["PPBP", 1], 12.32379661, tolerance = 1e-7) expect_equal(dim(co[['cca.l2']]), c(160, 30)) expect_equal(Embeddings(co[['cca.l2']])[1, 1], 0.06244169641, tolerance = 1e-7) expect_equal(Loadings(co[['cca.l2']], projected = T)["PPBP", 1], 12.32379661, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(324, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(1, 1, 0.8211091234), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 100) expect_equal(anchors@anchor.features[1], "PPBP") expect_equal(anchors@neighbors, list()) }) test_that("FindTransferAnchors with project.query defaults work", { skip_on_cran() anchors <- FindTransferAnchors(reference = ref, query = query, project.query = TRUE, k.filter = 50) co <- anchors@object.list[[1]] expect_equal(dim(co), c(100, 160)) expect_equal(Reductions(co), c("pcaproject", "pcaproject.l2")) expect_equal(GetAssayData(co[["RNA"]], layer = "data")["PPBP", 3], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "data")["PPBP", 1], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")["PPBP", 3], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")["PPBP", 1], 0) expect_equal(dim(co[['pcaproject']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject']])[1, 1], 1.577959404, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject']], projected = T)["PPBP", 1], 0.1145472305, tolerance = 1e-7) expect_equal(dim(co[['pcaproject.l2']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject.l2']])[1, 1], 0.1358602536, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject.l2']], projected = T)["PPBP", 1], 0.1145472305, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(208, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(1, 10, 0.4984040128), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 100) expect_equal(anchors@anchor.features[1], "GZMA") expect_equal(anchors@neighbors, list()) }) query <- ScaleData(query, verbose = FALSE) query <- suppressWarnings(RunPCA(query, npcs = 30, verbose = FALSE)) test_that("FindTransferAnchors with project.query and reference.reduction works", { skip_on_cran() anchors <- FindTransferAnchors(reference = ref, query = query, k.filter = 50, reference.reduction = "pca", project.query = TRUE) co <- anchors@object.list[[1]] expect_equal(dim(co), c(100, 160)) expect_equal(Reductions(co), c("pcaproject", "pcaproject.l2")) expect_equal(GetAssayData(co[["RNA"]])["PPBP", 3], 0) expect_equal(GetAssayData(co[["RNA"]])["PPBP", 1], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")["PPBP", 3], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")["PPBP", 1], 0) expect_equal(dim(co[['pcaproject']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject']])[1, 1], 1.577959404, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject']], projected = T)["PPBP", 1], 0.1145472305, tolerance = 1e-7) expect_equal(dim(co[['pcaproject.l2']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject.l2']])[1, 1], 0.1358602536, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject.l2']], projected = T)["PPBP", 1], 0.1145472305, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(208, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(1, 10, 0.4984040128), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 100) expect_equal(anchors@anchor.features[1], "GZMA") expect_equal(anchors@neighbors, list()) }) ref <- FindNeighbors(object = ref, reduction = "pca", dims = 1:30, return.neighbor = TRUE, k.param = 31, verbose = FALSE, l2.norm = TRUE, nn.method = "annoy") test_that("FindTransferAnchors with reference.neighbors precomputed works", { skip_on_cran() anchors <- FindTransferAnchors(reference = ref, query = query, reference.neighbors = "RNA.nn", k.filter = 50) expect_error(FindTransferAnchors(reference = ref, query = query, reference.neighbors = "BAD", k.filter = 50)) expect_error(FindTransferAnchors(reference = ref, query = query, reference.neighbors = "RNA.nn", k.filter = 50, k.score = 31)) expect_error(FindTransferAnchors(reference = ref, query = query, reference.neighbors = "RNA.nn", k.filter = 50, k.anchor = 31)) co <- anchors@object.list[[1]] expect_equal(dim(co), c(100, 160)) expect_equal(Reductions(co), c("pcaproject", "pcaproject.l2")) expect_equal(GetAssayData(co[["RNA"]])[1, 3], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")[1, 3], 0) expect_equal(dim(co[['pcaproject']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject']])[1, 1], 0.4840944592, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject']], projected = T)[1, 1], 0.2103563963, tolerance = 1e-7) expect_equal(dim(co[['pcaproject.l2']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject.l2']])[1, 1], 0.05175486778, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject.l2']], projected = T)[1, 1], 0.2103563963, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(128, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(5, 5, 0.08361970218), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 100) expect_equal(anchors@anchor.features[1], "PPBP") expect_equal(anchors@neighbors, list()) }) test_that("FindTransferAnchors with no l2 works", { skip_on_cran() anchors <- FindTransferAnchors(reference = ref, query = query, l2.norm = FALSE, k.filter = 50) co <- anchors@object.list[[1]] expect_equal(dim(co), c(100, 160)) expect_equal(Reductions(co), c("pcaproject")) expect_equal(GetAssayData(co[["RNA"]])[1, 3], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")[1, 3], 0) expect_equal(dim(co[['pcaproject']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject']])[1, 1], 0.4840944592, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject']], projected = T)[1, 1], 0.2103563963, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(115, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(5, 5, 0.2950654582), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 100) expect_equal(anchors@anchor.features[1], "PPBP") expect_equal(anchors@neighbors, list()) }) # SCTransform tests V1 query <- suppressWarnings(SCTransform(object = query, verbose = FALSE,vst.flavor = 'v1')) ref <- suppressWarnings(SCTransform(object = ref, verbose = FALSE,vst.flavor = 'v1')) test_that("FindTransferAnchors with default SCT works", { skip_on_cran() anchors <- FindTransferAnchors(reference = ref, query = query, normalization.method = "SCT", k.filter = 50) co <- anchors@object.list[[1]] expect_equal(dim(co), c(220, 160)) expect_equal(Reductions(co), c("pcaproject", "pcaproject.l2")) expect_equal(DefaultAssay(co), "SCT") expect_equal(GetAssayData(co[["SCT"]], layer = "scale.data"), new(Class = "matrix")) expect_equal(GetAssayData(co[["SCT"]])[1, 1], 0) expect_equal(dim(co[['pcaproject']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject']])[1, 1], -1.852491719, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject']], projected = T)[1, 1], -0.1829401539, tolerance = 1e-7) expect_equal(dim(co[['pcaproject.l2']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject.l2']])[1, 1], -0.1971047407, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject.l2']], projected = T)[1, 1], -0.1829401539, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(256, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(1, 1, 0.688195991), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 220) expect_equal(anchors@anchor.features[1], "NKG7") expect_equal(anchors@neighbors, list()) }) test_that("Mixing SCT and non-SCT assays fails", { expect_error(FindTransferAnchors(reference = ref, query = query, reference.assay = "SCT", query.assay = "RNA", k.filter = 50)) ref.0 <- ref ref.2 <- ref ref.0[["SCT"]]@SCTModel.list <- list() ref.2[["SCT"]]@SCTModel.list$model2 <- ref.2[["SCT"]]@SCTModel.list$model1 expect_error(FindTransferAnchors(reference = ref.0, query = query, reference.assay = "SCT", query.assay = "RNA", k.filter = 50, normalization.method = "SCT")) #expect_error(FindTransferAnchors(reference = ref.2, query = query, reference.assay = "SCT", query.assay = "RNA", k.filter = 50, normalization.method = "SCT")) # references with multiple sct models are now supported expect_error(FindTransferAnchors(reference = ref, query = query, reference.assay = "RNA", query.assay = "SCT", k.filter = 50)) expect_error(FindTransferAnchors(reference = ref, query = query, reference.assay = "RNA", query.assay = "SCT", k.filter = 50, normalization.method = "SCT")) }) test_that("FindTransferAnchors with default SCT works", { skip_on_cran() anchors <- FindTransferAnchors(reference = ref, query = query, normalization.method = "SCT", reduction = "cca", k.filter = 50) co <- anchors@object.list[[1]] expect_equal(dim(co), c(220, 160)) expect_equal(Reductions(co), c("cca", "cca.l2")) expect_equal(DefaultAssay(co), "SCT") expect_equal(GetAssayData(co[["SCT"]])[1, 1], 0) expect_equal(dim(co[['cca']]), c(160, 30)) expect_equal(Embeddings(co[['cca']])[1, 1], 0.0459135444, tolerance = 1e-7) expect_equal(Loadings(co[['cca']], projected = T)["NKG7", 1], 8.51477973, tolerance = 1e-7) expect_equal(dim(co[['cca.l2']]), c(160, 30)) expect_equal(Embeddings(co[['cca.l2']])[1, 1], 0.0625989664, tolerance = 1e-7) expect_equal(Loadings(co[['cca.l2']], projected = T)["NKG7", 1], 8.51477973, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(313, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(1, 1, 0.616858238), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 220) expect_equal(anchors@anchor.features[1], "NKG7") expect_equal(anchors@neighbors, list()) }) test_that("FindTransferAnchors with SCT and project.query work", { skip_on_cran() anchors <- FindTransferAnchors(reference = ref, query = query, normalization.method = "SCT", project.query = TRUE, k.filter = 50, recompute.residuals = FALSE) co <- anchors@object.list[[1]] expect_equal(dim(co), c(220, 160)) expect_equal(Reductions(co), c("pcaproject", "pcaproject.l2")) expect_equal(DefaultAssay(co), "SCT") expect_equal(GetAssayData(co[["SCT"]])[1, 1], 0) expect_equal(GetAssayData(co[["SCT"]], layer = "scale.data"), new("matrix")) expect_equal(dim(co[['pcaproject']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject']])[1, 1], 0.3049308, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject']], projected = T)[1, 1], 0.05788217444, tolerance = 1e-7) expect_equal(dim(co[['pcaproject.l2']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject.l2']])[1, 1], 0.04334884, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject.l2']], projected = T)[1, 1], 0.05788217444, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(290, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(1, 1, 0.6315789), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 220) expect_equal(anchors@anchor.features[1], "PPBP") expect_equal(anchors@neighbors, list()) }) test_that("FindTransferAnchors with SCT and l2.norm FALSE work", { skip_on_cran() anchors <- FindTransferAnchors(reference = ref, query = query, normalization.method = "SCT", l2.norm = FALSE, k.filter = 50) co <- anchors@object.list[[1]] expect_equal(dim(co), c(220, 160)) expect_equal(Reductions(co), c("pcaproject")) expect_equal(DefaultAssay(co), "SCT") expect_equal(GetAssayData(co[["SCT"]])[1, 1], 0) expect_equal(GetAssayData(co[["SCT"]], layer = "scale.data"), new("matrix")) expect_equal(dim(co[['pcaproject']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject']])[1, 1], -1.852491719, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject']], projected = T)[1, 1], -0.1829401539, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(249, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(1, 1, 0.760589319), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 220) expect_equal(anchors@anchor.features[1], "NKG7") expect_equal(anchors@neighbors, list()) }) # Added test for multi-layer query pbmc_small <- suppressWarnings(UpdateSeuratObject(pbmc_small)) reference <- pbmc_small reference <- NormalizeData(reference, verbose = FALSE) reference <- FindVariableFeatures(reference, verbose = FALSE) reference <- ScaleData(reference, verbose = FALSE) reference <- suppressWarnings(RunPCA(reference, npcs = 30, verbose = FALSE)) query <- CreateSeuratObject( counts = as.sparse( GetAssayData( object = pbmc_small[['RNA']], layer = "counts" ) + rpois(n = ncol(pbmc_small), lambda = 1) ) ) multilayer_query <- query multilayer_query$dummy_group <- ifelse( test = as.numeric(factor(Cells(multilayer_query))) %% 2 == 0, yes = "Even", no = "Odd" ) multilayer_query[["RNA"]] <- split(x = multilayer_query[["RNA"]], f = multilayer_query$dummy_group) multilayer_query <- NormalizeData(multilayer_query, verbose = FALSE) test_that("FindTransferAnchors handles multi-layer queries when mapping.score,k is set", { anchors <- FindTransferAnchors( reference = reference, query = multilayer_query, reference.reduction = "pca", mapping.score.k = 30 ) co <- anchors@object.list[[1]] expect_equal(dim(co), c(230, 160)) expect_equal(Reductions(co), c("pcaproject", "pcaproject.l2")) expect_equal(GetAssayData(co[["RNA"]], layer ="data")[1, 3], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")[1, 3], 0) expect_equal(dim(co[['pcaproject']]), c(160, 30)) expect_equal(dim(co[['pcaproject.l2']]), c(160, 30)) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(multilayer_query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_true("query.neighbors" %in% names(anchors@neighbors)) query_layers <- multilayer_query@assays$RNA@layers expect_equal(length(anchors@neighbors$query.neighbors), length(query_layers)/2) }) test_that("FindTransferAnchors handles multi-layer queries when mapping.score,k is NOT set", { anchors <- FindTransferAnchors( reference = reference, query = multilayer_query, reference.reduction = "pca", ) co <- anchors@object.list[[1]] expect_equal(dim(co), c(230, 160)) expect_equal(Reductions(co), c("pcaproject", "pcaproject.l2")) expect_equal(GetAssayData(co[["RNA"]], layer ="data")[1, 3], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")[1, 3], 0) expect_equal(dim(co[['pcaproject']]), c(160, 30)) expect_equal(dim(co[['pcaproject.l2']]), c(160, 30)) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(multilayer_query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_false("query.neighbors" %in% names(anchors@neighbors)) }) # Tests for MappingScore context("MappingScore") test_that("MappingScore works as expected", { # Calculate leverage score with and without precomputed query neighbors. anchors_vanilla <- FindTransferAnchors( reference = reference, query = multilayer_query, reference.reduction = "pca" ) anchors_with_neighbors <- FindTransferAnchors( reference = reference, query = multilayer_query, reference.reduction = "pca", mapping.score.k = 10 ) for (anchors in c(anchors_vanilla, anchors_with_neighbors)) { scores <- MappingScore( anchors, ndim = 30, ksmooth = 10, ksnn = 5, kanchor = 10 ) # Scores should be numeric values between 0 and 1. expect_setequal(names(scores), Cells(multilayer_query)) expect_true(is.numeric(scores)) expect_false(any(is.na(scores))) expect_true(all(scores >= 0 & scores <= 1)) } }) Seurat/tests/testthat/test_load_10X.R0000644000176200001440000002202615117056271017257 0ustar liggesuserscontext("Read10X") # These tests were added to ensure Seurat was forwards and backwards compatible for 3.0 data dname = "../testdata/cr3.0" test.data <- Read10X(dname) test.data2 <- Read10X(c(dname, dname)) test_that("Cell Ranger 3.0 Data Parsing", { expect_is(test.data, "list") expect_equal(ncol(test.data$`Gene Expression`), .5 * ncol(test.data2$`Gene Expression`)) expect_equal(ncol(test.data$`Antibody Capture`), .5 * ncol(test.data2$`Antibody Capture`)) expect_equal(colnames(test.data2[[1]])[6], "2_AAAGTAGCACAGTCGC-1") expect_equal(test.data$`Gene Expression`[2,2], 1000) }) # Tests of Pre-3.0 Data test.data3 <- Read10X("../testdata/") test_that("Read10X creates sparse matrix", { expect_is(test.data3, "dgCMatrix") expect_equal(colnames(test.data3)[1], "ATGCCAGAACGACT-1") expect_equal(rownames(test.data3)[1], "MS4A1") }) test_that("Read10X handles missing files properly", { expect_error(Read10X(".")) expect_error(Read10X("./notadir/")) expect_error(Read10X(dname, gene.column = 10)) }) context("Load10X_Spatial") # setup test fixtures path.to.data <- file.path("../testdata") path.to.visium <- file.path(path.to.data, "visium") path.to.visium.hd <- file.path(path.to.data, "visium_hd") test_that("Read10X_h5 works as expected", { skip_if_not_installed("hdf5r") path.to.counts <- file.path( path.to.visium, "filtered_feature_bc_matrix.h5" ) counts <- Read10X_h5(path.to.counts) # check that the shape of the returned matrix is correct expect_equal(ncol(counts), 2695) expect_equal(nrow(counts), 100) # spot-check a few of the values expect_equal(colnames(counts)[[151]], "AATGCAACCGGGTACC-1") expect_equal(counts[1, 151], 1) expect_equal(colnames(counts)[[9]], "AAACCGTTCGTCCAGG-1") expect_equal(counts[5, 9], 1) expect_equal(colnames(counts)[[2328]], "TCTCGAGGAGGTTCGC-1") expect_equal(counts[99, 2328], 1) }) test_that("Read10X_Image works as expected", { path.to.images <- file.path(path.to.visium, "spatial") coordinate.filenames <- "tissue_positions_list.csv" # only test HD the dataset containing a parquet file if `arrow` is installed if (requireNamespace("arrow", quietly = TRUE)) { path.to.images <- c( path.to.images, file.path( path.to.visium.hd, "binned_outputs/square_008um/spatial" ) ) coordinate.filenames <- c( coordinate.filenames, "tissue_positions.parquet" ) } for (i in seq_along(path.to.images)) { path.to.image <- path.to.images[[i]] coordinate.filename <- coordinate.filenames[[i]] # read in the coordinates as a data.frame - only keep the relevant columns # and rename them to match the processed output coordinates.expected <- Read10X_Coordinates( file.path(path.to.image, coordinate.filename), filter.matrix = TRUE )[, c("imagecol", "imagerow")] colnames(coordinates.expected) <- c("x", "y") # read in the scale factors as an S3 object scale.factors.expected <- Read10X_ScaleFactors( file.path(path.to.image, "scalefactors_json.json") ) # default/lowres scaling image.lowres <- Read10X_Image( path.to.image, image.name = "tissue_lowres_image.png" ) coordinates <- GetTissueCoordinates(image.lowres, scale = "lowres") spot.radius <- Radius(image.lowres, scale = "lowres") scale.factors <- ScaleFactors(image.lowres) # check that the scale factors were read in as expected expect_true(identical(scale.factors, scale.factors.expected)) # check that `coordinates` contains values scaled for the low resolution PNG expect_equal( coordinates[, c("x", "y")] / scale.factors[["lowres"]], coordinates.expected ) # check that the spot size is similarly scaled expect_equal( (spot.radius / scale.factors[["lowres"]] * max(dim(image.lowres))), scale.factors.expected[["spot"]], ) # hires scaling image.hires <- Read10X_Image( path.to.image, image.name = "tissue_hires_image.png" ) coordinates <- GetTissueCoordinates(image.hires, scale = "hires") spot.radius <- Radius(image.hires, scale = "hires") scale.factors <- ScaleFactors(image.hires) # check that the scale factors were read in as expected expect_true(identical(scale.factors, scale.factors.expected)) # check that `coordinates` contains values scaled for the high resolution PNG expect_equal( coordinates[, c("x", "y")] / scale.factors[["hires"]], coordinates.expected ) # check that the spot size is similarly scaled expect_equal( (spot.radius / scale.factors[["hires"]] * max(dim(image.hires))), scale.factors.expected[["spot"]] ) # the size of the two images should be different expect_false(all(dim(image.hires) == dim(image.lowres))) # `VisiumV1` image image.v1 <- Read10X_Image( path.to.image, image.name = "tissue_lowres_image.png", image.type = "VisiumV1" ) coordinates <- GetTissueCoordinates(image.v1, scale = "lowres") spot.radius <- Radius(image.v1, scale = "lowres") scale.factors <- ScaleFactors(image.v1) # check that the scale factors were read in as expected expect_true(identical(scale.factors, scale.factors.expected)) # check that `coordinates` contains values scaled for the low resolution PNG # also make sure that it has the expected column names coordinates.expected.v1 <- coordinates.expected colnames(coordinates.expected.v1) <- c("imagecol", "imagerow") expect_equal( coordinates[, c("imagecol", "imagerow")] / scale.factors[["lowres"]], coordinates.expected.v1 ) # check that the spot size is similarly scaled expect_equal( (spot.radius / scale.factors[["lowres"]] * max(dim(image.lowres))), scale.factors.expected[["spot"]], ) } }) test_that("Load10X_Spatial works with SD data", { skip_if_not_installed("hdf5r") path.to.counts <- file.path( path.to.visium, "filtered_feature_bc_matrix.h5" ) path.to.image <- file.path(path.to.visium, "spatial") # load the expected counts matrix counts.expected <- Read10X_h5(path.to.counts) # load the expected image image.expected <- Read10X_Image(path.to.image) # set the image's key Key(image.expected) <- "slice1_" # update the expected image's assay to match the default DefaultAssay(image.expected) <- "Spatial" # align the expected image's identifiers with the expected count matrix image.expected <- image.expected[colnames(counts.expected)] spatial <- Load10X_Spatial(path.to.visium) # check that `spatial` contains the expected counts matrix expect_true( identical( LayerData(spatial, assay = "Spatial", layer = "counts"), counts.expected ) ) # check that `spatial` contains the expected image expect_true( identical( spatial[["slice1"]], image.expected ) ) }) test_that("Load10X_Spatial works with HD data", { skip_if_not_installed("hdf5r") skip_if_not_installed("arrow") # since the "HD" test data is actually just the standard definition test # data re-structured to look like it's been binned at multiple resolutions # the `merge` call inside `Load10X_Spatial` throws a warning spatial <- suppressWarnings(Load10X_Spatial(path.to.visium.hd)) bin.size <- c(16, 8) for (i in seq_along(bin.size)) { bin.size.pretty <- paste0(sprintf("%03d", bin.size[[i]]), "um") assay.name <- paste0("Spatial.", bin.size.pretty) image.key <- paste0("slice1", bin.size.pretty, "_") image.key.pretty <- paste0("slice1.", bin.size.pretty) path.to.bin <- file.path( path.to.visium.hd, paste0("binned_outputs/square_", bin.size.pretty) ) path.to.counts <- file.path( path.to.bin, "filtered_feature_bc_matrix.h5" ) path.to.image <- file.path(path.to.bin, "spatial") # load the expected counts matrix counts.expected <- Read10X_h5(path.to.counts) # accomodate for the way cell identifiers will be reset during # the call to `merge` inside `Load10X_Spatial` colnames(counts.expected) <- paste0(colnames(counts.expected), "_", i) # load the expected image image.expected <- Read10X_Image(path.to.image, assay = assay.name) # set the image's key Key(image.expected) <- image.key # again, accomodate for the way cell identifiers will be reset during # the call to `merge` inside `Load10X_Spatial` image.expected <- RenameCells(image.expected, paste0(Cells(image.expected), "_", i)) # align the expected image's identifiers with the expected count matrix image.expected <- image.expected[colnames(counts.expected)] # check that `spatial` contains the expected counts matrix expect_true( identical( LayerData(spatial, assay = assay.name, layer = "counts"), counts.expected ) ) # check that `spatial` contains the expected image expect_true( identical( spatial[[image.key.pretty]], image.expected ) ) } }) test_that("Read10X_Spatial handles missing files properly", { expect_error(Load10X_Spatial(data.dir = ".")) expect_error(Load10X_Spatial(data.dir = "./notadir/")) }) Seurat/tests/testthat/test_transferdata.R0000644000176200001440000001662415056057544020403 0ustar liggesusers# Tests for integration/transfer related fxns set.seed(42) pbmc_small <- suppressWarnings(UpdateSeuratObject(pbmc_small)) # Setup test objects ref <- pbmc_small query <- CreateSeuratObject( counts = as.sparse( GetAssayData( object = pbmc_small[['RNA']], layer = "counts") + rpois(n = ncol(pbmc_small), lambda = 1 ) ) ) query <- NormalizeData(object = query, verbose = FALSE) query <- FindVariableFeatures(object = query, verbose = FALSE, nfeatures = 100) ref <- FindVariableFeatures(object = ref, verbose = FALSE, nfeatures = 100) anchors <- FindTransferAnchors(reference = ref, query = query, k.filter = 50) # Tests for TransferData # ------------------------------------------------------------------------------ context("TransferData") preds.standard <- TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, verbose = FALSE) test_that("TransferData default work", { # categorical metadata expect_equal(dim(preds.standard), c(80, 5)) expect_equal(colnames(preds.standard)[c(1, 5)], c("predicted.id", "prediction.score.max")) expect_equal(rownames(preds.standard), Cells(query)) expect_equal(preds.standard[1, 1], "1") expect_equal(preds.standard[1, 5], 0.4280746, tolerance = 1e-6) expect_equal(as.vector(rowSums(as.matrix(preds.standard[, 2:4]))), rep(1, times = ncol(query))) expect_true(inherits(preds.standard, "data.frame")) # continuous assay data pred.assay <- TransferData(anchorset = anchors, refdata = GetAssayData(ref[["RNA"]]), verbose = FALSE) expect_equal(dim(pred.assay), c(230, 80)) expect_equal(GetAssayData(pred.assay, layer = "counts"), new("matrix")) expect_equal(GetAssayData(pred.assay, layer = "scale.data"), new("matrix")) expect_equal(colnames(pred.assay), Cells(query)) expect_equal(rownames(pred.assay), rownames(ref[["RNA"]])) expect_equal(sum(GetAssayData(pred.assay)[1, ]), 64.46388, tolerance = 1e-6) expect_equal(sum(GetAssayData(pred.assay)[, 1]), 281.0306, tolerance = 1e-6) expect_true(inherits(pred.assay, "Assay")) expect_equal(pred.assay@var.features, logical(0)) expect_equal(ncol(pred.assay@meta.features), 0) }) test_that("TransferData can return predictions assay, ", { pred.assay <- TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, prediction.assay = TRUE, verbose = FALSE) expect_true(inherits(pred.assay, "Assay")) expect_equal(dim(pred.assay), c(4, 80)) expect_equal(GetAssayData(pred.assay, layer = "counts"), new("matrix")) expect_equal(GetAssayData(pred.assay, layer = "scale.data"), new("matrix")) expect_equal(colnames(pred.assay), Cells(query)) expect_equal(pred.assay@var.features, logical(0)) expect_equal(ncol(pred.assay@meta.features), 0) expect_equal(sum(GetAssayData(pred.assay)[1, ]), 26.59365, tolerance = 1e-6) expect_equal(sum(GetAssayData(pred.assay)[, 1]), 1.428075, tolerance = 1e-6) expect_equal(as.vector(colSums(GetAssayData(pred.assay)[1:3, ])), rep(1, ncol(query))) }) test_that("TransferData handles weight.reduction properly, ", { skip_on_cran() # test for custom dimreduc custom.dr <- anchors@object.list[[1]][["pcaproject"]] custom.dr <- subset(x = custom.dr, cells = anchors@query.cells) custom.dr <- RenameCells(object = custom.dr, new.names = sapply(X = Cells(custom.dr), FUN = function(x){ x <- gsub(pattern = "_query", replacement = "", x = x) })) expect_error(TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, weight.reduction = custom.dr, dims = 1:100)) preds <-TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, verbose = FALSE) cdr.preds <- TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, weight.reduction = custom.dr, verbose = FALSE, dims = 1:30) expect_equal(preds, cdr.preds) # weight.reduction = "pca pca.preds <- suppressWarnings(TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, query = query, weight.reduction = "pca", verbose = FALSE)) expect_true(inherits(pca.preds, "Seurat")) expect_equal(sum(GetAssayData(pca.preds[['prediction.score.id']])[1, ]), 27.83330252, tolerance = 1e-6) # weight.reduction = "cca" anchors.cca <- FindTransferAnchors(reference = ref, query = query, k.filter = 50, reduction = "cca") cca.preds <- TransferData(anchorset = anchors.cca, refdata = ref$RNA_snn_res.1, weight.reduction = "cca", verbose = FALSE) expect_true(inherits(cca.preds, "data.frame")) expect_equal(sum(cca.preds[, 2]), 43.61738383, tolerance = 1e-6) }) test_that("TransferData with l2.norm works", { skip_on_cran() preds <- TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, l2.norm = TRUE, verbose = FALSE) expect_equal(dim(preds), c(80, 5)) expect_equal(colnames(preds)[c(1, 5)], c("predicted.id", "prediction.score.max")) expect_equal(rownames(preds), Cells(query)) expect_equal(preds[1, 1], "0") expect_equal(preds[1, 5], 0.3973124793, tolerance = 1e-6) expect_equal(as.vector(rowSums(as.matrix(preds[, 2:4]))), rep(1, times = ncol(query))) expect_true(inherits(preds, "data.frame")) }) test_that("TransferData with other k.weight works", { skip_on_cran() preds <- TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, k.weight = 10, verbose = FALSE) expect_equal(dim(preds), c(80, 5)) expect_equal(colnames(preds)[c(1, 5)], c("predicted.id", "prediction.score.max")) expect_equal(rownames(preds), Cells(query)) expect_equal(preds[1, 1], "2") expect_equal(preds[1, 5], 0.6145459065, tolerance = 1e-6) expect_equal(as.vector(rowSums(as.matrix(preds[, 2:4]))), rep(1, times = ncol(query))) expect_true(inherits(preds, "data.frame")) }) test_that("TransferData with reference specified works", { skip_on_cran() pred2 <- TransferData(anchorset = anchors, refdata = "RNA_snn_res.1", reference = ref, verbose = FALSE) expect_equal(preds.standard, pred2) }) test_that("TransferData throws expected errors ", { expect_error(TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, weight.reduction = "BAD")) # better message expect_error(TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, weight.reduction = "cca")) # better message expect_error(TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, dims = 1:100)) expect_error(ransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, k.weight = 1000)) expect_error(suppressWarnings(TransferData(anchorset = anchors, refdata = "RNA_snn_res.1"))) expect_error(suppressWarnings(TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1[1:10]))) expect_error(TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, query = subset(x = query, cells = Cells(query)[1:10]))) }) test_that("TransferData with multiple items to transfer works ", { skip_on_cran() preds <- TransferData(anchorset = anchors, refdata = list( ids = ref$RNA_snn_res.1, groups = ref$groups, dat = GetAssayData(ref[["RNA"]])), verbose = FALSE) expect_equal(length(preds), 3) expect_equal(preds[[1]], preds.standard) }) test_that("TransferData can return a modified query object ", { query <- suppressWarnings(TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, query = query, verbose = FALSE)) expect_true("prediction.score.id" %in% Assays(query)) expect_true("predicted.id" %in% colnames(query[[]])) expect_true("predicted.id.score" %in% colnames(query[[]])) query <- suppressWarnings(TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, query = query, store.weights = TRUE, verbose = FALSE)) expect_equal(dim(Tool(query, slot = "TransferData")$weights.matrix), c(128, 80)) }) Seurat/tests/testthat/test_objects.R0000644000176200001440000000173715056057544017355 0ustar liggesusers# Tests for functions in objects.R # Tests for SCE conversion # ------------------------------------------------------------------------------ test_that("as.SingleCellExperiment works", { skip_on_cran() if (requireNamespace('SingleCellExperiment', quietly = TRUE)) { mat <- pbmc_small[["RNA"]]$counts seuratObj <- Seurat::CreateSeuratObject(mat) sce <- suppressWarnings(as.SingleCellExperiment(seuratObj)) expect_equal(ncol(sce), 80) expect_equal(nrow(sce), 230) # expect_equal(length(SingleCellExperiment::altExps(sce)), 0) # expect_equal(SingleCellExperiment::mainExpName(sce), 'RNA') seuratObj <- Seurat::CreateSeuratObject(mat) seuratObj[['ADT']] <- CreateAssayObject(mat) sce <- suppressWarnings(as.SingleCellExperiment(seuratObj)) expect_equal(ncol(sce), 80) expect_equal(nrow(sce), 230) # expect_equal(names(SingleCellExperiment::altExps(sce)), 'ADT') # expect_equal(SingleCellExperiment::mainExpName(sce), 'RNA') } }) Seurat/tests/testthat/test_preprocessing.R0000644000176200001440000006556215117326655020615 0ustar liggesusers# Tests for functions dependent on a seurat object set.seed(42) pbmc.file <- system.file('extdata', 'pbmc_raw.txt', package = 'Seurat') pbmc.test <- as.sparse(x = as.matrix(read.table(pbmc.file, sep = "\t", row.names = 1))) # Tests for object creation (via CreateSeuratObject) # -------------------------------------------------------------------------------- context("Object creation") fake.meta.data <- data.frame(rep(1, ncol(pbmc.test))) rownames(fake.meta.data) <- colnames(pbmc.test) colnames(fake.meta.data) <- "FMD" object <- CreateSeuratObject(counts = pbmc.test, meta.data = fake.meta.data) test_that("object initialization actually creates seurat object", { expect_is(object, "Seurat") }) #this should be moved to seurat object # test_that("meta.data slot generated correctly", { # expect_equal(dim(object[[]]), c(80, 4)) # expect_equal(colnames(object[[]]), c("orig.ident", "nCount_RNA", "nFeature_RNA", "FMD")) # expect_equal(rownames(object[[]]), colnames(object)) # expect_equal(object[["nFeature_RNA"]][1:5, ], c(47, 52, 50, 56, 53)) # expect_equal(object[["nCount_RNA"]][75:80, ], c(228, 527, 202, 157, 150, 233)) # }) object.filtered <- CreateSeuratObject( counts = pbmc.test, min.cells = 10, min.features = 30 ) test_that("Filtering handled properly", { expect_equal(nrow(x = LayerData(object = object.filtered, layer = "counts")), 163) expect_equal(ncol(x = LayerData(object = object.filtered, layer = "counts")), 77) }) #this should be moved to seurat object # test_that("Metadata check errors correctly", { # pbmc.md <- pbmc_small[[]] # pbmc.md.norownames <- as.matrix(pbmc.md) # rownames(pbmc.md.norownames) <- NULL # expect_error(CreateSeuratObject(counts = pbmc.test, meta.data = pbmc.md.norownames), # "Row names not set in metadata. Please ensure that rownames of metadata match column names of data matrix") # }) # Tests for NormalizeData # -------------------------------------------------------------------------------- context("NormalizeData") test_that("NormalizeData error handling", { expect_error(NormalizeData(object = object, assay = "FAKE")) expect_equal( object = LayerData( object = NormalizeData( object = object, normalization.method = NULL, verbose = FALSE ), layer = "data" ), expected = LayerData(object = object, layer = "counts") ) }) object <- NormalizeData(object = object, verbose = FALSE, scale.factor = 1e6) test_that("NormalizeData scales properly", { expect_equal(LayerData(object = object, layer = "data")[2, 1], 9.567085, tolerance = 1e-6) expect_equal(LayerData(object = object, layer = "data")[161, 55], 8.415309, tolerance = 1e-6) expect_equal(Command(object = object, command = "NormalizeData.RNA", value = "scale.factor"), 1e6) expect_equal(Command(object = object, command = "NormalizeData.RNA", value = "normalization.method"), "LogNormalize") }) normalized.data <- LogNormalize(data = GetAssayData(object = object[["RNA"]], layer = "counts"), verbose = FALSE) test_that("LogNormalize normalizes properly", { expect_equal( as.matrix(LogNormalize(data = GetAssayData(object = object[["RNA"]], layer = "counts"), verbose = FALSE)), as.matrix(LogNormalize(data = as.data.frame(as.matrix(GetAssayData(object = object[["RNA"]], layer = "counts"))), verbose = FALSE)) ) }) clr.counts <- NormalizeData(object = pbmc.test, normalization.method = "CLR", verbose = FALSE) test_that("CLR normalization returns expected values", { expect_equal(dim(clr.counts), c(dim(pbmc.test))) expect_equal(clr.counts[2, 1], 0.5517828, tolerance = 1e-6) expect_equal(clr.counts[228, 76], 0.5971381, tolerance = 1e-6) expect_equal(clr.counts[230, 80], 0) }) rc.counts <- NormalizeData(object = pbmc.test, normalization.method = "RC", verbose = FALSE) test_that("Relative count normalization returns expected values", { expect_equal(rc.counts[2, 1], 142.8571, tolerance = 1e-6) expect_equal(rc.counts[228, 76], 18.97533, tolerance = 1e-6) expect_equal(rc.counts[230, 80], 0) rc.counts <- NormalizeData(object = pbmc.test, normalization.method = "RC", verbose = FALSE, scale.factor = 1e6) expect_equal(rc.counts[2, 1], 14285.71, tolerance = 1e-6) }) # Tests for v5 NormalizeData # -------------------------------------------------------------------------------- context("v5 NormalizeData") if(class(object[['RNA']]) == "Assay5") { fake.groups <- c(rep(1, floor(ncol(pbmc.test)/2)), rep(2, ncol(pbmc.test) - (floor(ncol(pbmc.test)/2))) ) object$groups <- fake.groups object.split <- CreateSeuratObject(split(object[["RNA"]], f = object$groups)) object.split <- NormalizeData(object = object.split) group1 <- subset(object, groups==1) group1 <- NormalizeData(group1) test_that("Normalization is performed for each layer", { expect_equal(Layers(object.split),c("counts.1", "counts.2", "data.1", "data.2")) expect_equal(group1[['RNA']]$data, LayerData(object.split, layer="data.1")) }) object.split <- NormalizeData(object = object.split, normalization.method = "CLR", verbose = FALSE) group1 <- NormalizeData(object = group1, normalization.method = "CLR", verbose = FALSE) test_that("CLR normalization works with multiple layers", { expect_equal(Layers(object.split),c("counts.1", "counts.2", "data.1", "data.2")) expect_equal(group1[['RNA']]$data, LayerData(object.split, layer="data.1")) }) object.split <- NormalizeData(object = object.split, normalization.method = "RC", verbose = FALSE) group1 <- NormalizeData(object = group1, normalization.method = "RC", verbose = FALSE) test_that("RC normalization works with multiple layers", { expect_equal(Layers(object.split),c("counts.1", "counts.2", "data.1", "data.2")) expect_equal(group1[['RNA']]$data, LayerData(object.split, layer="data.1")) }) } test_that("NormalizeData scales properly for BPcells", { # Tests for BPCells NormalizeData # -------------------------------------------------------------------------------- skip_on_cran() library(Matrix) skip_if_not_installed("BPCells") library(BPCells) mat_bpcells <- t(as(t(object[['RNA']]$counts ), "IterableMatrix")) object[['RNAbp']] <- CreateAssay5Object(counts = mat_bpcells) object <- NormalizeData(object = object, verbose = FALSE, scale.factor = 1e6, assay = "RNAbp") object <- NormalizeData(object = object, verbose = FALSE, scale.factor = 1e6, assay = "RNA") expect_equal(as.matrix(object[['RNAbp']]$data), as.matrix(object[['RNA']]$data), tolerance = 1e-6) expect_equal(Command(object = object, command = "NormalizeData.RNAbp", value = "scale.factor"), 1e6) expect_equal(Command(object = object, command = "NormalizeData.RNAbp", value = "normalization.method"), "LogNormalize") }) test_that("LogNormalize normalizes properly for BPCells", { skip_on_cran() library(Matrix) skip_if_not_installed("BPCells") library(BPCells) mat_bpcells <- t(as(t(object[['RNA']]$counts ), "IterableMatrix")) object[['RNAbp']] <- CreateAssay5Object(counts = mat_bpcells) object <- NormalizeData(object = object, verbose = FALSE, scale.factor = 1e6, assay = "RNAbp") object <- NormalizeData(object = object, verbose = FALSE, scale.factor = 1e6, assay = "RNA") normalized.data.bp <- LogNormalize(data = GetAssayData(object = object[["RNAbp"]], layer = "counts"), verbose = FALSE) normalized.data <- LogNormalize(data = GetAssayData(object = object[["RNA"]], layer = "counts"), verbose = FALSE) expect_equal( as.matrix(normalized.data.bp), as.matrix(normalized.data), tolerance = 1e-6 ) }) # Tests for ScaleData # -------------------------------------------------------------------------------- context("ScaleData") object <- ScaleData(object, verbose = FALSE) test_that("ScaleData returns expected values when input is a sparse matrix", { expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[1, 1], -0.4148587, tolerance = 1e-6) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[75, 25], -0.2562305, tolerance = 1e-6) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[162, 59], -0.4363939, tolerance = 1e-6) }) new.data <- as.matrix(GetAssayData(object = object[["RNA"]], layer = "data")) new.data[1, ] <- rep(x = 0, times = ncol(x = new.data)) object2 <- object object2 <- SetAssayData( object = object, assay = "RNA", layer = "data", new.data = new.data ) object2 <- ScaleData(object = object2, verbose = FALSE) object <- ScaleData(object = object, verbose = FALSE) test_that("ScaleData returns expected values when input is not sparse", { expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[75, 25], -0.2562305, tolerance = 1e-6) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[162, 59], -0.4363939, tolerance = 1e-6) }) test_that("ScaleData handles zero variance features properly", { expect_equal(GetAssayData(object = object2[["RNA"]], layer = "scale.data")[1, 1], 0) expect_equal(GetAssayData(object = object2[["RNA"]], layer = "scale.data")[1, 80], 0) }) ng1 <- rep(x = "g1", times = round(x = ncol(x = object) / 2)) object$group <- c(ng1, rep(x = "g2", times = ncol(x = object) - length(x = ng1))) g1 <- subset(x = object, group == "g1") g1 <- ScaleData(object = g1, features = rownames(x = g1), verbose = FALSE) g2 <- subset(x = object, group == "g2") g2 <- ScaleData(object = g2, features = rownames(x = g2), verbose = FALSE) object <- ScaleData(object = object, features = rownames(x = object), verbose = FALSE, split.by = "group") #move to SeuratObject # test_that("split.by option works", { # expect_equal(GetAssayData(object = object, layer = "scale.data")[, Cells(x = g1)], # GetAssayData(object = g1, layer = "scale.data")) # expect_equal(GetAssayData(object = object, layer = "scale.data")[, Cells(x = g2)], # GetAssayData(object = g2, layer = "scale.data")) # }) g1 <- ScaleData(object = g1, features = rownames(x = g1), vars.to.regress = "nCount_RNA", verbose = FALSE) g2 <- ScaleData(object = g2, features = rownames(x = g2), vars.to.regress = "nCount_RNA", verbose = FALSE) object <- ScaleData(object = object, features = rownames(x = object), verbose = FALSE, split.by = "group", vars.to.regress = "nCount_RNA") test_that("split.by option works with regression", { expect_equal(LayerData(object = object, layer = "scale.data")[, Cells(x = g1)], LayerData(object = g1, layer = "scale.data")) expect_equal(LayerData(object = object, layer = "scale.data")[, Cells(x = g2)], LayerData(object = g2, layer = "scale.data")) }) # Tests for various regression techniques context("Regression") suppressWarnings({ object <- ScaleData( object = object, vars.to.regress = "nCount_RNA", features = rownames(x = object)[1:10], verbose = FALSE, model.use = "linear") }) test_that("Linear regression works as expected", { expect_equal(dim(x = GetAssayData(object = object[["RNA"]], layer = "scale.data")), c(10, 80)) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[1, 1], -0.6436435, tolerance = 1e-6) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[5, 25], -0.09035383, tolerance = 1e-6) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[10, 80], -0.2723782, tolerance = 1e-6) }) object <- ScaleData( object, vars.to.regress = "nCount_RNA", features = rownames(x = object)[1:10], verbose = FALSE, model.use = "negbinom") test_that("Negative binomial regression works as expected", { expect_equal(dim(x = GetAssayData(object = object[["RNA"]], layer = "scale.data")), c(10, 80)) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[1, 1], -0.5888811, tolerance = 1e-6) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[5, 25], -0.2553394, tolerance = 1e-6) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[10, 80], -0.1921429, tolerance = 1e-6) }) test_that("Regression error handling checks out", { expect_error(ScaleData(object, vars.to.regress = "nCount_RNA", model.use = "not.a.model", verbose = FALSE)) }) object <- ScaleData( object, vars.to.regress = "nCount_RNA", features = rownames(x = object)[1:10], verbose = FALSE, model.use = "poisson") test_that("Poisson regression works as expected", { expect_equal(dim(x = GetAssayData(object = object[["RNA"]], layer = "scale.data")), c(10, 80)) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[1, 1], -1.011717, tolerance = 1e-6) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[5, 25], 0.05575307, tolerance = 1e-6) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[10, 80], -0.1662119, tolerance = 1e-6) }) #Tests for SampleUMI #-------------------------------------------------------------------------------- context("SampleUMI") downsampled.umis <- SampleUMI( data = LayerData(object = object, layer = "counts"), max.umi = 100, verbose = FALSE ) downsampled.umis.p.cell <- SampleUMI( data = LayerData(object = object, layer = "counts"), max.umi = seq(50, 1640, 20), verbose = FALSE, upsample = TRUE ) test_that("SampleUMI gives reasonable downsampled/upsampled UMI counts", { expect_true(!any(colSums(x = downsampled.umis) < 30, colSums(x = downsampled.umis) > 120)) expect_error(SampleUMI(data = LayerData(object = object, layer = "counts"), max.umi = rep(1, 5))) expect_true(!is.unsorted(x = colSums(x = downsampled.umis.p.cell))) expect_error(SampleUMI( data = LayerData(object = object, layer = "counts"), max.umi = seq(50, 900, 10), verbose = FALSE, upsample = TRUE )) }) # Tests for FindVariableFeatures # -------------------------------------------------------------------------------- context("FindVariableFeatures") object <- FindVariableFeatures(object = object, selection.method = "mean.var.plot", verbose = FALSE) test_that("mean.var.plot selection option returns expected values", { expect_equal(VariableFeatures(object = object)[1:4], c("PTGDR", "SATB1", "ZNF330", "S100B")) expect_equal(length(x = VariableFeatures(object = object)), 20) hvf_info <- HVFInfo(object = object[["RNA"]], method = 'mvp') expect_equal(hvf_info[[grep("mean$", colnames(hvf_info), value = TRUE)]][1:2], c(8.328927, 8.444462), tolerance = 1e-6) expect_equal(hvf_info[[grep("dispersion$", colnames(hvf_info), value = TRUE)]][1:2], c(10.552507, 10.088223), tolerance = 1e-6) expect_equal(as.numeric(hvf_info[[grep("dispersion.scaled$", colnames(hvf_info), value = TRUE)]][1:2]), c(0.1113214, -0.1332181523), tolerance = 1e-6) }) object <- FindVariableFeatures(object, selection.method = "dispersion", verbose = FALSE) test_that("dispersion selection option returns expected values", { expect_equal(VariableFeatures(object = object)[1:4], c("PCMT1", "PPBP", "LYAR", "VDAC3")) expect_equal(length(x = VariableFeatures(object = object)), 230) hvf_info <- HVFInfo(object = object[["RNA"]], method = 'mvp') expect_equal(hvf_info[[grep("mean$", colnames(hvf_info), value = TRUE)]][1:2], c(8.328927, 8.444462), tolerance = 1e-6) expect_equal(hvf_info[[grep("dispersion$", colnames(hvf_info), value = TRUE)]][1:2], c(10.552507, 10.088223), tolerance = 1e-6) expect_equal(as.numeric(hvf_info[[grep("dispersion.scaled$", colnames(hvf_info), value = TRUE)]][1:2]), c(0.1113214, -0.1332181523), tolerance = 1e-6) expect_true(!is.unsorted(rev(hvf_info[VariableFeatures(object = object), "dispersion"]))) }) object <- FindVariableFeatures(object, selection.method = "vst", verbose = FALSE) test_that("vst selection option returns expected values", { expect_equal(VariableFeatures(object = object)[1:4], c("PPBP", "IGLL5", "VDAC3", "CD1C")) expect_equal(length(x = VariableFeatures(object = object)), 230) hvf_info <- HVFInfo(object = object[["RNA"]], method = 'vst') expect_equal(hvf_info[[grep("variance$", colnames(hvf_info), value = TRUE)]][1:2], c(1.0251582, 1.2810127), tolerance = 1e-6) expect_equal(hvf_info[[grep("variance.standardized$", colnames(hvf_info), value = TRUE)]][1:2], c(0.8983463, 0.4731134), tolerance = 1e-6) expect_true(!is.unsorted(rev(hvf_info[VariableFeatures(object = object), grep("variance.standardized$", colnames(hvf_info))]))) }) #object <- FindVariableFeatures(object, assay = "RNAbp") #this breaks currently # Tests for internal functions # ------------------------------------------------------------------------------ norm.fxn <- function(x) {x / mean(x)} test_that("CustomNormalize works as expected", { expect_equal( CustomNormalize(data = pbmc.test, custom_function = norm.fxn, margin = 2), apply(X = pbmc.test, MARGIN = 2, FUN = norm.fxn) ) expect_equal( CustomNormalize(data = as.matrix(pbmc.test), custom_function = norm.fxn, margin = 2), apply(X = pbmc.test, MARGIN = 2, FUN = norm.fxn) ) expect_equal( CustomNormalize(data = as.data.frame(as.matrix(pbmc.test)), custom_function = norm.fxn, margin = 2), apply(X = pbmc.test, MARGIN = 2, FUN = norm.fxn) ) expect_equal( CustomNormalize(data = pbmc.test, custom_function = norm.fxn, margin = 1), t(apply(X = pbmc.test, MARGIN = 1, FUN = norm.fxn)) ) expect_error(CustomNormalize(data = pbmc.test, custom_function = norm.fxn, margin = 10)) }) # Tests for SCTransform # -------------------------------------------------------------------------------- context("SCTransform") object <- suppressWarnings(SCTransform(object = object, verbose = FALSE, vst.flavor = "v1", seed.use = 1448145)) test_that("SCTransform v1 works as expected", { expect_true("SCT" %in% names(object)) expect_equal(as.numeric(colSums(GetAssayData(object = object[["SCT"]], layer = "scale.data"))[1]), 11.40288448) expect_equal(as.numeric(rowSums(GetAssayData(object = object[["SCT"]], layer = "scale.data"))[5]), 0) expect_equal(as.numeric(colSums(GetAssayData(object = object[["SCT"]], layer = "data"))[1]), 57.7295742, tolerance = 1e-6) expect_equal(as.numeric(rowSums(GetAssayData(object = object[["SCT"]], layer = "data"))[5]), 11.74403719, tolerance = 1e-6) expect_equal(as.numeric(colSums(GetAssayData(object = object[["SCT"]], layer = "counts"))[1]), 129) expect_equal(as.numeric(rowSums(GetAssayData(object = object[["SCT"]], layer = "counts"))[5]), 28) expect_equal(length(VariableFeatures(object[["SCT"]])), 220) fa <- SCTResults(object = object, assay = "SCT", slot = "feature.attributes") expect_equal(fa["MS4A1", "detection_rate"], 0.15) expect_equal(fa["MS4A1", "gmean"], 0.2027364, tolerance = 1e-6) expect_equal(fa["MS4A1", "variance"], 1.025158, tolerance = 1e-6) expect_equal(fa["MS4A1", "residual_mean"], 0.2362887, tolerance = 1e-6) expect_equal(fa["MS4A1", "residual_variance"], 2.875761, tolerance = 1e-6) }) suppressWarnings(RNGversion(vstr = "3.5.0")) object <- suppressWarnings(SCTransform(object = object, vst.flavor = "v1", ncells = 80, verbose = FALSE, seed.use = 42)) test_that("SCTransform ncells param works", { expect_true("SCT" %in% names(object)) expect_equal(as.numeric(colSums(GetAssayData(object = object[["SCT"]], layer = "scale.data"))[1]), 11.40288, tolerance = 1e-6) expect_equal(as.numeric(rowSums(GetAssayData(object = object[["SCT"]], layer = "scale.data"))[5]), 0) expect_equal(as.numeric(colSums(GetAssayData(object = object[["SCT"]], layer = "data"))[1]), 57.72957, tolerance = 1e-6) expect_equal(as.numeric(rowSums(GetAssayData(object = object[["SCT"]], layer = "data"))[5]), 11.74404, tolerance = 1e-6) expect_equal(as.numeric(colSums(GetAssayData(object = object[["SCT"]], layer = "counts"))[1]), 129) expect_equal(as.numeric(rowSums(GetAssayData(object = object[["SCT"]], layer = "counts"))[5]), 28) expect_equal(length(VariableFeatures(object[["SCT"]])), 220) fa <- SCTResults(object = object, assay = "SCT", slot = "feature.attributes") expect_equal(fa["MS4A1", "detection_rate"], 0.15) expect_equal(fa["MS4A1", "gmean"], 0.2027364, tolerance = 1e-6) expect_equal(fa["MS4A1", "variance"], 1.025158, tolerance = 1e-6) expect_equal(fa["MS4A1", "residual_mean"], 0.2362887, tolerance = 1e-3) expect_equal(fa["MS4A1", "residual_variance"], 2.875761, tolerance = 1e-3) }) suppressWarnings(object[["SCT_SAVE"]] <- object[["SCT"]]) object[["SCT"]] <- suppressWarnings({SetAssayData(object = object[["SCT"]], layer = "scale.data", new.data = GetAssayData(object = object[["SCT"]], layer = "scale.data")[1:100, ])}) object <- GetResidual(object = object, features = rownames(x = object), verbose = FALSE) test_that("GetResidual works", { expect_equal(dim(GetAssayData(object = object[["SCT"]], layer = "scale.data")), c(220, 80)) expect_equal( GetAssayData(object = object[["SCT"]], layer = "scale.data"), GetAssayData(object = object[["SCT_SAVE"]], layer = "scale.data") ) expect_warning(GetResidual(object, features = "asd")) }) test_that("SCTransform v2 works as expected", { skip_on_cran() skip_if_not_installed("glmGamPoi") object <- suppressWarnings(SCTransform(object = object, verbose = FALSE, vst.flavor = "v2", seed.use = 1448145)) expect_true("SCT" %in% names(object)) expect_equal(as.numeric(colSums(GetAssayData(object = object[["SCT"]], layer = "scale.data"))[1]), 24.5813, tolerance = 1e-4) expect_equal(as.numeric(rowSums(GetAssayData(object = object[["SCT"]], layer = "scale.data"))[5]), 0) expect_equal(as.numeric(colSums(GetAssayData(object = object[["SCT"]], layer = "data"))[1]), 58.65829, tolerance = 1e-6) expect_equal(as.numeric(rowSums(GetAssayData(object = object[["SCT"]], layer = "data"))[5]), 13.75449, tolerance = 1e-6) expect_equal(as.numeric(colSums(GetAssayData(object = object[["SCT"]], layer = "counts"))[1]), 141) expect_equal(as.numeric(rowSums(GetAssayData(object = object[["SCT"]], layer = "counts"))[5]), 40) expect_equal(length(VariableFeatures(object[["SCT"]])), 220) fa <- SCTResults(object = object, assay = "SCT", slot = "feature.attributes") expect_equal(fa["MS4A1", "detection_rate"], 0.15) expect_equal(fa["MS4A1", "gmean"], 0.2027364, tolerance = 1e-6) expect_equal(fa["MS4A1", "variance"], 1.025158, tolerance = 1e-6) expect_equal(fa["MS4A1", "residual_mean"], 0.2763993, tolerance = 1e-6) expect_equal(fa["MS4A1", "residual_variance"], 3.023062, tolerance = 1e-6) expect_equal(fa["FCER2", "theta"], Inf) }) test_that("SCTransform `clip.range` param works as expected", { # make a copy of the testing data test.data <- object # override defaults for ease of testing clip.min <- -0.1 clip.max <- 0.1 # for some reason, the clipping seems to be a little fuzzy at the upper end, # since this is expected behaviour we'll need to accomodate the difference clip.max.tolerance <- 0.1 test.result <- suppressWarnings( SCTransform( test.data, clip.range = c(clip.min, clip.max), ) ) scale.data <- LayerData(test.result[["SCT"]], layer = "scale.data") expect_true(min(scale.data) >= clip.min) expect_true(max(scale.data) <= (clip.max + clip.max.tolerance)) # when `ncells` is less than the size of the dataset the residuals will get # re-clipped in batches, make sure this clipping is done correctly as well test.result <- suppressWarnings( SCTransform( test.data, clip.range = c(clip.min, clip.max), ncells = 40 ) ) scale.data <- LayerData(test.result[["SCT"]], layer = "scale.data") expect_true(min(scale.data) >= clip.min) expect_true(max(scale.data) <= (clip.max + clip.max.tolerance)) }) test_that("SCTransform `vars.to.regress` param works as expected", { # make a copy of the testing data test.data <- object # add a fake mitochondrial gene to the counts matrix counts <- LayerData(test.data, assay = "RNA", layer = "counts") counts <- rbind(counts, 5) rownames(counts)[nrow(counts)] <- "MT-TEST" # use the fake feature to populate a new meta.data column test.data[[ "percent.mt" ]] <- PercentageFeatureSet( test.data, pattern="^MT-" ) # make sure that `ncells` is smaller than the datset being transformed # so tha the regression model is trained on a subset of the data - make sure # the regression is applied to the entire dataset left <- suppressWarnings( SCTransform( test.data, vars.to.regress = NULL, ncells = ncol(test.data) / 2, verbose = FALSE ) ) right <- suppressWarnings( SCTransform( test.data, vars.to.regress = "percent.mt", ncells = ncol(test.data) / 2, verbose = FALSE ) ) expect_false(identical(left[["SCT"]]$scale.data, right[["SCT"]]$scale.data)) # if the `assay` points to an `Assay5` instance the regression is handled # using separate logic test.data[["RNAv5"]] <- CreateAssay5Object( counts = LayerData( test.data, assay = "RNA", layer = "counts" ) ) left <- suppressWarnings( SCTransform( test.data, assay = "RNAv5", vars.to.regress = NULL, ncells = ncol(test.data) / 2, verbose = FALSE ) ) right <- suppressWarnings( SCTransform( test.data, assay = "RNAv5", vars.to.regress = "percent.mt", ncells = ncol(test.data) / 2, verbose = FALSE ) ) expect_false(identical(left[["SCT"]]$scale.data, right[["SCT"]]$scale.data)) }) fake.meta.data2 <- data.frame(rep(1:2, ncol(pbmc.test)/2)) rownames(fake.meta.data2) <- colnames(pbmc.test) colnames(fake.meta.data2) <- "Condition" object2 <- CreateSeuratObject(counts = pbmc.test, meta.data = fake.meta.data2) test_that("`SCTransform` is consistent for multi-layer inputs", { skip_on_cran() clip.range = c(-1.632993, 1.632993) test_case_v3 <- SplitObject(object2, split.by = "Condition") result_v3_list <- lapply(test_case_v3, SCTransform, clip.range = clip.range) result_v3 <- merge(result_v3_list[[1]], result_v3_list[[2]]) test_case_v5 <- object2 test_case_v5 <- split(object2, f = object2$Condition) result_v5 <- SCTransform(test_case_v5, clip.range = clip.range) expected <- result_v3[["SCT"]]@data[,colnames(object2)] result <- result_v5[["SCT"]]@data[,colnames(object2)] expect_true(all.equal(expected, result)) expected <- result_v3[["SCT"]]@scale.data[,colnames(object2)] result <- result_v5[["SCT"]]@scale.data[,colnames(object2)] expect_true(all.equal(expected[rownames(result), ], result)) }) test_that("SCTransform is equivalent for BPcells ", { skip_on_cran() skip_on_cran() skip_if_not_installed("glmGamPoi") library(Matrix) skip_if_not_installed("BPCells") library(BPCells) mat_bpcells <- t(as(t(object[['RNA']]$counts ), "IterableMatrix")) object[['RNAbp']] <- CreateAssay5Object(counts = mat_bpcells) object <- suppressWarnings(SCTransform(object = object, assay = "RNA", new.assay.name = "SCT", verbose = FALSE, vst.flavor = "v2", seed.use = 1448145)) object <- suppressWarnings(SCTransform(object = object, assay = "RNAbp", new.assay.name = "SCTbp", verbose = FALSE, vst.flavor = "v2", seed.use = 1448145)) expect_equal(as.matrix(LayerData(object = object[["SCT"]], layer = "data")), as.matrix(LayerData(object = object[["SCTbp"]], layer = "data")), tolerance = 1e-6) }) Seurat/tests/testthat/test_data_manipulation.R0000644000176200001440000002252215056057544021410 0ustar liggesusers# Tests for functions in data_manipulation.cpp # change in random number generation in R3.6, this ensures tests will pass under older and newer Rs suppressWarnings(RNGversion(vstr = "3.5.3")) set.seed(42) library(Matrix) # Tests for row merging # -------------------------------------------------------------------------------- context("Row Merging") m1 <- rsparsematrix(10, 10, 0.1) m2 <- rsparsematrix(10, 10, 0.1) m1.names <- paste0("row", sample(1:10, size = 10)) m2.names <- paste0("row", sample(1:20, size = 10)) all.names <- union(m1.names, m2.names) rownames(m1) <- m1.names rownames(m2) <- m2.names m1 <- as(m1, "RsparseMatrix") m2 <- as(m2, "RsparseMatrix") test_that("Row merging done correctly", { m3 <- RowMergeMatrices(mat1 = m1, mat2 = m2, mat1_rownames = m1.names, mat2_rownames = m2.names, all_rownames = all.names) expect_equal(m3[1, 14], -0.17) expect_equal(m3[3, 2], -1.4) expect_equal(m3[14, 18], -0.43) expect_equal(length(m3), 280) }) #test_that("Row merging with a list done correctly", { # m3 <- RowMergeMatricesList(mat_list = list(m1, m2), mat_rownames = list(m1.names, m2.names), all_rownames = all.names) # expect_equal(m3[1, 14], -0.17) # expect_equal(m3[3, 2], -1.4) # expect_equal(m3[14, 18], -0.43) # expect_equal(length(m3), 280) #}) # Tests for log normalization # -------------------------------------------------------------------------------- context("Log Normalization") mat <- as(matrix(1:16, ncol = 4, nrow = 4), "sparseMatrix") test_that("Log Normalization returns expected values", { mat.norm.r <- log1p(sweep(mat, 2, Matrix::colSums(mat), FUN = "/") * 1e4) mat.norm <- LogNorm(mat, 1e4, display_progress = F) expect_equal(mat.norm[1, ], mat.norm.r[1, ]) expect_equal(mat.norm[4, 4], mat.norm.r[4, 4]) }) # Tests for scaling data # -------------------------------------------------------------------------------- context("Fast Scale Data Functions") mat <- matrix(rnorm(n = 10*15), nrow = 10, ncol = 15) # should be the equivalent of t(scale(t(mat))) test_that("Fast implementation of row scaling returns expected values", { expect_equal(t(scale(t(mat)))[1:10, 1:15], FastRowScale(mat)) expect_equal(t(scale(t(mat), center = FALSE))[1:10, 1:15], FastRowScale(mat, center = FALSE)) expect_equal(t(scale(t(mat), scale = FALSE))[1:10, 1:15], FastRowScale(mat, scale = FALSE)) expect_equal(t(scale(t(mat), scale = FALSE, center = F))[1:10, 1:15], FastRowScale(mat, scale = FALSE, center = F)) mat.clipped <- FastRowScale(mat, scale_max = 0.2) expect_true(max(mat.clipped, na.rm = T) >= 0.2) }) # should be the equivalent of scale(mat, TRUE, apply(mat, 2, sd)) test_that("Standardize returns expected values", { expect_equal(Standardize(mat, display_progress = FALSE), scale(mat, TRUE, apply(mat, 2, sd)), check.attributes = FALSE) }) # should be the equivalent of t(scale(t(mat))) mat <- rsparsematrix(10, 15, 0.1) test_that("Fast implementation of row scaling returns expected values", { expect_equal(t(scale(t(as.matrix(mat))))[1:10, 1:15], FastSparseRowScale(mat, display_progress = FALSE), check.attributes = FALSE) expect_equal(t(scale(t(as.matrix(mat)), center = FALSE))[1:10, 1:15], FastSparseRowScale(mat, center = FALSE, display_progress = FALSE), check.attributes = FALSE) expect_equal(t(scale(t(as.matrix(mat)), scale = FALSE))[1:10, 1:15], FastSparseRowScale(mat, scale = FALSE, display_progress = FALSE), check.attributes = FALSE) expect_equal(t(scale(t(as.matrix(mat)), scale = FALSE, center = F))[1:10, 1:15], FastSparseRowScale(mat, scale = FALSE, center = F, display_progress = FALSE), check.attributes = FALSE) mat.clipped <- FastSparseRowScale(mat, scale_max = 0.2, display_progress = F) expect_true(max(mat.clipped, na.rm = T) >= 0.2) }) mat <- as.sparse(x = matrix(rnorm(100), nrow = 10, ncol = 10)) test_that("Row scaling with known stats works", { mat.rowmeans <- rowMeans(x = mat) mat.sd <- apply(X = mat, MARGIN = 1, FUN = sd) expect_equal( t(scale(t(as.matrix(mat)), center = mat.rowmeans, scale = mat.sd)), FastSparseRowScaleWithKnownStats(mat = mat, mu = mat.rowmeans, sigma = mat.sd, scale = TRUE, center = TRUE, scale_max = 10, display_progress = FALSE), check.attributes = FALSE ) expect_equal( t(scale(t(as.matrix(mat)), center = FALSE, scale = mat.sd)), FastSparseRowScaleWithKnownStats(mat = mat, mu = mat.rowmeans, sigma = mat.sd, scale = TRUE, center = FALSE, scale_max = 10, display_progress = FALSE), check.attributes = FALSE ) expect_equal( t(scale(t(as.matrix(mat)), center = mat.rowmeans, scale = FALSE)), FastSparseRowScaleWithKnownStats(mat = mat, mu = mat.rowmeans, sigma = mat.sd, scale = FALSE, center = TRUE, scale_max = 10, display_progress = FALSE), check.attributes = FALSE ) mat.clipped <- FastSparseRowScaleWithKnownStats(mat = mat, mu = mat.rowmeans, sigma = mat.sd, scale = FALSE, center = TRUE, scale_max = 0.2, display_progress = FALSE) expect_true(max(mat.clipped, na.rm = T) >= 0.2) }) # Tests for fast basic stats functions # -------------------------------------------------------------------------------- context("Fast Basic Stats Functions") set.seed(42) mat <- replicate(10, rchisq(10, 4)) fcv <- FastCov(mat) cv <- cov(mat) test_that("Fast implementation of covariance returns expected values", { expect_equal(fcv[1,1], 9.451051142) expect_equal(fcv[10,10], 5.6650068) expect_equal(fcv, cv) }) mat2 <- replicate(10, rchisq(10, 4)) fcv <- FastCovMats(mat1 = mat, mat2 = mat2) cv <- cov(mat, mat2) test_that("Fast implementation of covariance returns expected values for matrices", { expect_equal(fcv[1,1], 1.523417, tolerance = 1e-6) expect_equal(fcv[10,10], -0.6031694, tolerance = 1e-6) expect_equal(fcv, cv) }) merged.mat <- FastRBind(mat, fcv) test_that("Fast implementation of rbind returns expected values", { expect_equal(merged.mat, rbind(mat, fcv)) expect_equal(mat[1,1], merged.mat[1,1]) expect_equal(fcv[10,10], merged.mat[20,10]) }) mat <- as.sparse(mat) test_that("Fast implementation of ExpMean returns expected values",{ expect_equal(ExpMean(mat[1,]), FastExpMean(mat, display_progress = F)[1]) expect_equal(ExpMean(mat[5,]), FastExpMean(mat, display_progress = F)[5]) expect_equal(ExpMean(mat[10,]), FastExpMean(mat, display_progress = F)[10]) expect_equal(length(FastExpMean(mat, display_progress = F)), nrow(mat)) expect_error(FastExpMean(mat[1, ], display_progress = F)) expect_equal(FastExpMean(mat[1, ,drop = F], display_progress = F), ExpMean(mat[1,])) expect_equal(FastExpMean(mat, display_progress = F)[1], 6.493418, tolerance = 1e-6) expect_equal(FastExpMean(mat, display_progress = F)[5], 6.255206, tolerance = 1e-6) expect_equal(FastExpMean(mat, display_progress = F)[10], 7.84965, tolerance = 1e-6) }) test_that("Fast implementation of LogVMR returns expected values", { expect_equal(LogVMR(mat[1,]), FastLogVMR(mat, display_progress = F)[1]) expect_equal(LogVMR(mat[5,]), FastLogVMR(mat, display_progress = F)[5]) expect_equal(LogVMR(mat[10,]), FastLogVMR(mat, display_progress = F)[10]) expect_equal(length(FastExpMean(mat, display_progress = F)), nrow(mat)) expect_error(FastLogVMR(mat[1, ], display_progress = F)) expect_equal(FastLogVMR(mat[1, ,drop = F], display_progress = F), LogVMR(mat[1,])) expect_equal(FastLogVMR(mat, display_progress = F)[1], 7.615384, tolerance = 1e-6) expect_equal(FastLogVMR(mat, display_progress = F)[5], 7.546768, tolerance = 1e-6) expect_equal(FastLogVMR(mat, display_progress = F)[10], 10.11755, tolerance = 1e-6) }) test_that("Row variance calculations for sparse matrices work", { expect_equal(apply(X = mat, MARGIN = 1, FUN = var), SparseRowVar(mat = mat, display_progress = FALSE), tolerance = 1e-6) expect_equal(apply(X = mat2, MARGIN = 1, FUN = var), SparseRowVar(mat = as.sparse(x = mat2), display_progress = FALSE), tolerance = 1e-6) }) # Tests for data structure manipulations # -------------------------------------------------------------------------------- context("Data structure manipulations") mat <- rsparsematrix(nrow = 10, ncol = 100, density = 0.1) mat2 <- rsparsematrix(nrow = 10, ncol = 10, density = 0.1) cols.to.replace1 <- 1:10 cols.to.replace2 <- 10:1 cols.to.replace3 <- 91:100 cols.to.replace4 <- c(10, 15, 33, 2, 6, 99, 55, 30, 25, 42) ReplaceCols <- function(mat, cols, replace){ mat[, cols] <- replace return(mat) } test_that("Replacing columns works", { expect_equal(ReplaceColsC(mat = mat, col_idx = cols.to.replace1 - 1, replacement = mat2), ReplaceCols(mat = mat, cols = cols.to.replace1, replace = mat2)) expect_equal(ReplaceColsC(mat = mat, col_idx = cols.to.replace2 - 1, replacement = mat2), ReplaceCols(mat = mat, cols = cols.to.replace2, replace = mat2)) expect_equal(ReplaceColsC(mat = mat, col_idx = cols.to.replace3 - 1, replacement = mat2), ReplaceCols(mat = mat, cols = cols.to.replace3, replace = mat2)) expect_equal(ReplaceColsC(mat = mat, col_idx = cols.to.replace4 - 1, replacement = mat2), ReplaceCols(mat = mat, cols = cols.to.replace4, replace = mat2)) }) test_that("Cpp implementation of row variance is correct", { expect_equal(apply(X = mat, MARGIN = 1, FUN = var), RowVar(as.matrix(mat))) expect_equal(apply(X = merged.mat, MARGIN = 1, FUN = var), RowVar(as.matrix(merged.mat))) }) Seurat/tests/testthat/test_integratedata.R0000644000176200001440000001412115056057544020527 0ustar liggesusers# Tests for integration related fxns set.seed(42) pbmc_small <- suppressWarnings(UpdateSeuratObject(pbmc_small)) # Setup test objects ref <- pbmc_small ref <- FindVariableFeatures(object = ref, verbose = FALSE, nfeatures = 100) query <- CreateSeuratObject( counts = as.sparse( GetAssayData( object = pbmc_small[['RNA']], layer = "counts") + rpois(n = ncol(pbmc_small), lambda = 1 ) ) ) query2 <- CreateSeuratObject( counts = as.sparse( LayerData( object = pbmc_small[['RNA']], layer = "counts")[, 1:40] + rpois(n = ncol(pbmc_small), lambda = 1 ) ) ) query.list <- list(query, query2) query.list <- lapply(X = query.list, FUN = NormalizeData, verbose = FALSE) query.list <- lapply(X = query.list, FUN = FindVariableFeatures, verbose = FALSE, nfeatures = 100) query.list <- lapply(X = query.list, FUN = ScaleData, verbose = FALSE) query.list <- suppressWarnings(lapply(X = query.list, FUN = RunPCA, verbose = FALSE, npcs = 20)) anchors2 <- suppressMessages(suppressWarnings(FindIntegrationAnchors(object.list = c(ref, query.list[[1]]), k.filter = NA, verbose = FALSE))) anchors3 <- suppressMessages(suppressWarnings(FindIntegrationAnchors(object.list = c(ref, query.list), k.filter = NA, verbose = FALSE))) # Tests for IntegrateEmbeddings # ------------------------------------------------------------------------------ # context("IntegrateEmbeddings") # test_that("IntegrateEmbeddings validates properly", { # expect_error(IntegrateEmbeddings(anchorset = anchors2)) # expect_error(IntegrateEmbeddings(anchorset = anchors2, reduction = "pca", k.weight = 100)) # expect_error(IntegrateEmbeddings(anchorset = anchors2, reduction = c("pca", "pca2"), k.weight = 40)) # expect_error(IntegrateEmbeddings(anchorset = anchors2, reduction = "pca", k.weight = 40, weight.reduction = c(ref[['pca']]))) # pca3 <- RenameCells(object = ref[['pca']], new.names = paste0(Cells(ref), "_test")) # expect_error(IntegrateEmbeddings(anchorset = anchors2, reduction = "pca", k.weight = 40, # weight.reduction = c(pca3, ref[['pca']]))) # }) # # test_that("IntegrateEmbeddings with two objects default works", { # skip_on_cran() # int2 <- IntegrateEmbeddings(anchorset = anchors2, reduction = "pca", k.weight = 40, verbose = FALSE) # expect_equal(Reductions(int2), "integrated_pca") # expect_equal(sum(Embeddings(int2[['integrated_pca']])[1,]), -3.13050872287, tolerance = 1e-6) # expect_equal(sum(Embeddings(int2[['integrated_pca']])[,1]), -5.78790844887, tolerance = 1e-6) # }) # # test_that("IntegrateEmbeddings with three objects default works", { # skip_on_cran() # int3 <- IntegrateEmbeddings(anchorset = anchors3, reduction = "pca", k.weight = 40, verbose = FALSE) # expect_equal(Reductions(int3), "integrated_pca") # expect_equal(sum(Embeddings(int3[['integrated_pca']])[1,]), 0.221867815987, tolerance = 1e-6) # expect_equal(sum(Embeddings(int3[['integrated_pca']])[,1]), -16.7881409595, tolerance = 1e-6) # }) # # test_that("IntegrateEmbeddings works with specified reference objects", { # skip_on_cran() # anchors4 <- suppressMessages(suppressWarnings(FindIntegrationAnchors(object.list = c(ref, query.list), k.filter = NA, verbose = FALSE, reference = 1))) # int4 <- IntegrateEmbeddings(anchorset = anchors4, reduction = "pca", k.weight = 40, verbose = FALSE) # expect_equal(Reductions(int4), "integrated_pca") # expect_equal(sum(Embeddings(int4[['integrated_pca']])[1,]), -3.13050872287, tolerance = 1e-6) # expect_equal(sum(Embeddings(int4[['integrated_pca']])[,1]), 13.1180105492, tolerance = 1e-6) # }) # Tests for IntegrateData # ------------------------------------------------------------------------------ context("IntegrateData") test_that("IntegrateData with two objects default work", { expect_error(IntegrateData(anchorset = anchors2)) int2 <- suppressWarnings(IntegrateData(anchorset = anchors2, k.weight = 50, verbose = FALSE)) expect_true(all(Assays(int2) %in% c("integrated", "RNA"))) expect_equal(Tool(int2), "Integration") expect_equal(dim(int2[["integrated"]]), c(133, 160)) expect_equal(length(VariableFeatures(int2)), 133) expect_equal(GetAssayData(int2[["integrated"]], layer = "counts"), new("dgCMatrix")) expect_equal(GetAssayData(int2[['integrated']], layer = "scale.data"), matrix()) expect_equal(sum(GetAssayData(int2[["integrated"]], layer = "data")[1, ]), 44.97355, tolerance = 1e-3) expect_equal(sum(GetAssayData(int2[["integrated"]], layer = "data")[, 1]), 78.8965706046, tolerance = 1e-6) expect_equal(Tool(object = int2, slot = "Integration")@sample.tree, matrix(c(-1, -2), nrow = 1)) }) test_that("IntegrateData with three objects default work", { expect_error(IntegrateData(anchorset = anchors3, k.weight = 50)) int3 <- suppressWarnings(IntegrateData(anchorset = anchors3, k.weight = 25, verbose = FALSE)) expect_true(all(Assays(int3) %in% c("integrated", "RNA"))) expect_equal(Tool(int3), "Integration") expect_equal(dim(int3[["integrated"]]), c(169, 200)) expect_equal(length(VariableFeatures(int3)), 169) expect_equal(GetAssayData(int3[["integrated"]], layer = "counts"), new("dgCMatrix")) expect_equal(GetAssayData(int3[['integrated']], layer = "scale.data"), matrix()) expect_equal(sum(GetAssayData(int3[["integrated"]], layer = "data")[1, ]), 372.829, tolerance = 1e-6) expect_equal(sum(GetAssayData(int3[["integrated"]], layer = "data")[, 1]), 482.5009, tolerance = 1e-6) expect_equal(Tool(object = int3, slot = "Integration")@sample.tree, matrix(c(-2, -3, 1, -1), nrow = 2, byrow = TRUE)) }) test_that("Input validates correctly ", { expect_error(anchorset = anchors2, k.weight = 50, features.to.integrate = "BAD") expect_error(IntegrateData(anchorset = anchors2, k.weight = 50, normalization.method = "BAD")) expect_error(IntegrateData(anchorset = anchors2, k.weight = 50, weight.reduction = "BAD")) expect_error(IntegrateData(anchorset = anchors2, reductions.to.integrate = "pca")) skip_on_cran() #expect_warning(IntegrateData(anchorset = anchors2, k.weight = 50, features = c(rownames(ref), "BAD"))) #expect_warning(IntegrateData(anchorset = anchors2, k.weight = 50, dims = 1:1000)) }) Seurat/tests/testthat/test_differential_expression.R0000644000176200001440000006660115117326655022640 0ustar liggesusers# Tests for functions in differential_expression.R suppressWarnings(RNGversion(vstr = "3.5.3")) set.seed(seed = 42) # Tests for FindMarkers # -------------------------------------------------------------------------------- context("FindMarkers") clr.obj <- suppressWarnings(NormalizeData(pbmc_small, normalization.method = "CLR")) sct.obj <- suppressWarnings(suppressMessages(SCTransform(pbmc_small, vst.flavor = "v1"))) markers.0 <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, verbose = FALSE, base = exp(1),pseudocount.use = 1)) markers.01 <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1),pseudocount.use = 1)) results.clr <- suppressWarnings(FindMarkers(object = clr.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 1)) results.sct <- suppressWarnings(FindMarkers(object = sct.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("Default settings work as expected with pseudocount = 1", { skip_on_cran() expect_error(FindMarkers(object = pbmc_small)) expect_error(FindMarkers(object = pbmc_small, ident.1 = "test")) expect_error(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = "test")) expect_equal(colnames(x = markers.0), c("p_val", "avg_logFC", "pct.1", "pct.2", "p_val_adj")) expect_equal(markers.0[1, "p_val"], 9.572778e-13, tolerance = 1e-18) expect_equal(markers.0[1, "avg_logFC"], -4.180029, tolerance = 1e-6) expect_equal(markers.0[1, "pct.1"], 0.083) expect_equal(markers.0[1, "pct.2"], 0.909) expect_equal(markers.0[1, "p_val_adj"], 2.201739e-10, tolerance = 1e-15) expect_equal(nrow(x = markers.0), 228) expect_equal(rownames(markers.0)[1], "HLA-DPB1") expect_equal(markers.01[1, "p_val"], 1.702818e-11, tolerance = 1e-16) expect_equal(markers.01[1, "avg_logFC"], -2.638242, tolerance = 1e-6) expect_equal(markers.01[1, "pct.1"], 0.111) expect_equal(markers.01[1, "pct.2"], 1.00) expect_equal(markers.01[1, "p_val_adj"], 3.916481e-09, tolerance = 1e-14) expect_equal(nrow(x = markers.01), 222) expect_equal(rownames(x = markers.01)[1], "TYMP") # CLR normalization expect_equal(results.clr[1, "p_val"], 1.209462e-11, tolerance = 1e-16) expect_equal(results.clr[1, "avg_logFC"], -2.946633, tolerance = 1e-6) expect_equal(results.clr[1, "pct.1"], 0.111) expect_equal(results.clr[1, "pct.2"], 0.96) expect_equal(results.clr[1, "p_val_adj"], 2.781762e-09, tolerance = 1e-14) expect_equal(nrow(x = results.clr), 213) expect_equal(rownames(x = results.clr)[1], "S100A8") # SCT normalization expect_equal(results.sct[1, "p_val"], 6.225491e-11, tolerance = 1e-16) expect_equal(results.sct[1, "avg_logFC"], -2.545867, tolerance = 1e-6) expect_equal(results.sct[1, "pct.1"], 0.111) expect_equal(results.sct[1, "pct.2"], 0.96) expect_equal(results.sct[1, "p_val_adj"], 1.369608e-08, tolerance = 1e-13) expect_equal(nrow(x = results.sct), 214) expect_equal(rownames(x = results.sct)[1], "TYMP") }) tymp.results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, features = "TYMP", verbose = FALSE, base = exp(1),pseudocount.use = 1)) vargenes.results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, features = VariableFeatures(object = pbmc_small), verbose = FALSE, base = exp(1),pseudocount.use = 1)) test_that("features parameter behaves correctly ", { skip_on_cran() expect_equal(nrow(x = tymp.results), 1) expect_equal(tymp.results[1, "p_val"], 3.227445e-07, tolerance = 1e-12) expect_equal(tymp.results[1, "avg_logFC"], -2.188179, tolerance = 1e-6) expect_equal(tymp.results[1, "pct.1"], 0.111) expect_equal(tymp.results[1, "pct.2"], 0.682) expect_equal(tymp.results[1, "p_val_adj"], 7.423123e-05, tolerance = 1e-10) expect_equal(rownames(x = tymp.results)[1], "TYMP") expect_equal(nrow(x = vargenes.results), 20) expect_equal(vargenes.results[20, "p_val"], 4.225151e-01, tolerance = 1e-6) expect_equal(vargenes.results[20, "avg_logFC"], 1.796863, tolerance = 1e-6) expect_equal(vargenes.results[20, "pct.1"], 0.139) expect_equal(vargenes.results[20, "pct.2"], 0.091) expect_equal(vargenes.results[20, "p_val_adj"], 1.000000e+00) expect_equal(rownames(x = vargenes.results)[20], "PARVB") }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = Cells(x = pbmc_small)[1:40], ident.2 = Cells(x = pbmc_small)[41:80], verbose = FALSE, base = exp(1),pseudocount.use = 1)) test_that("passing cell names works", { skip_on_cran() expect_equal(nrow(x = results), 216) expect_equal(results[1, "p_val"], 0.0001690882) expect_equal(results[1, "avg_logFC"], -1.967123, tolerance = 1e-6) expect_equal(results[1, "pct.1"], 0.075) expect_equal(results[1, "pct.2"], 0.450) expect_equal(results[1, "p_val_adj"], 0.03889028) expect_equal(rownames(x = results)[1], "IFI30") }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 0.1)) results.clr <- suppressWarnings(FindMarkers(object = clr.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 0.1)) results.sct <- suppressWarnings(FindMarkers(object = sct.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 0.1, vst.flavor = "v1")) test_that("setting pseudocount.use works", { skip_on_cran() expect_equal(nrow(x = results), 222) expect_equal(results[1, "avg_logFC"], -2.640848, tolerance = 1e-6) expect_equal(nrow(x = results.clr), 214) expect_equal(results.clr[1, "avg_logFC"], -3.322368, tolerance = 1e-6) expect_equal(nrow(results.sct), 215) expect_equal(results.sct[1, "avg_logFC"], -2.668866, tolerance = 1e-6) }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 1, mean.fxn = rowMeans)) results.clr <- suppressWarnings(FindMarkers(object = clr.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 1, mean.fxn = rowMeans)) results.sct <- suppressWarnings(FindMarkers(object = sct.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 1, mean.fxn = rowMeans, vst.flaovr = "v1")) test_that("setting mean.fxn works", { skip_on_cran() expect_equal(nrow(x = results), 216) expect_equal(results[1, "avg_logFC"], -4.204346, tolerance = 1e-6) expect_equal(results.clr[1, "avg_logFC"], -1.353025, tolerance = 1e-6) expect_equal(results.sct[1, "avg_logFC"], -1.064042, tolerance = 1e-6) }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, logfc.threshold = 2, verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("logfc.threshold works", { expect_equal(nrow(x = results), 139) expect_gte(min(abs(x = results$avg_logFC)), 2) }) results <- expect_warning(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, logfc.threshold = 100, verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("logfc.threshold warns when none met", { expect_equal(nrow(x = results), 0) }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, min.pct = 0.5, verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("min.pct works", { expect_equal(nrow(x = results), 66) expect_gte(min(apply(X = results, MARGIN = 1, FUN = function(x) max(x[3], x[4]))), 0.5) }) results <- expect_warning(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, min.pct = 2.0, verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("min.pct warns when none met", { expect_equal(nrow(x = results), 0) }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, min.diff.pct = 0.5, verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("min.diff.pct works", { expect_equal(nrow(x = results), 44) expect_gte(min(apply(X = results, MARGIN = 1, FUN = function(x) abs(x[4] - x[3]))), 0.5) }) results <- expect_warning(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, min.diff.pct = 1.0, verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("min.diff.pct warns when none met", { expect_equal(nrow(x = results), 0) }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, only.pos = TRUE, verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("only.pos works", { expect_equal(nrow(x = results), 127) expect_true(all(results$avg_logFC > 0)) }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, max.cells.per.ident = 20, verbose = FALSE, base = exp(1),pseudocount.use = 1)) test_that("max.cells.per.ident works", { skip_on_cran() expect_equal(nrow(x = results), 222) expect_equal(results[1, "p_val"], 3.428568e-08, tolerance = 1e-13) expect_equal(results[1, "avg_logFC"], -2.638242, tolerance = 1e-6) expect_equal(results[1, "pct.1"], 0.111) expect_equal(results[1, "pct.2"], 1) expect_equal(results[1, "p_val_adj"], 7.885706e-06) expect_equal(rownames(x = results)[1], "TYMP") }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, latent.vars= "groups", verbose = FALSE, test.use = 'LR', base = exp(1), pseudocount.use = 1)) test_that("latent.vars works", { expect_error(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, latent.vars= "fake", verbose = FALSE)) expect_warning(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, latent.vars= "groups", verbose = FALSE)) expect_equal(nrow(x = results), 222) expect_equal(results[1, "p_val"], 2.130202e-16, tolerance = 1e-21) expect_equal(results[1, "avg_logFC"], -3.102866, tolerance = 1e-6) expect_equal(results[1, "pct.1"], 0.417) expect_equal(results[1, "pct.2"], 1) expect_equal(results[1, "p_val_adj"], 4.899466e-14, tolerance = 1e-19) expect_equal(rownames(x = results)[1], "LYZ") }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = "g1", ident.2 = "g2", group.by= "groups", verbose = FALSE, base = exp(1), pseudocount.use = 1)) t2 <- pbmc_small Idents(object = t2) <- "groups" results2 <- suppressWarnings(FindMarkers(object = t2, ident.1 = "g1", ident.2 = "g2", verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("group.by works", { skip_on_cran() expect_equal(nrow(x = results), 190) expect_equal(results, results2) expect_equal(results[1, "p_val"], 0.02870319) expect_equal(results[1, "avg_logFC"], 0.8473584, tolerance = 1e-6) expect_equal(results[1, "pct.1"], 0.455) expect_equal(results[1, "pct.2"], 0.194) expect_equal(results[1, "p_val_adj"], 1) expect_equal(rownames(x = results)[1], "NOSIP") }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = "g1", ident.2 = "g2", group.by= "groups", subset.ident = 0, verbose = FALSE, base = exp(1), pseudocount.use = 1)) t2 <- subset(x = pbmc_small, idents = 0) Idents(object = t2) <- "groups" results2 <- suppressWarnings(FindMarkers(object = t2, ident.1 = "g1", ident.2 = "g2", verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("subset.ident works", { skip_on_cran() expect_equal(nrow(x = results), 183) expect_equal(results, results2) expect_equal(results[1, "p_val"], 0.01293720) expect_equal(results[1, "avg_logFC"], 1.912603, tolerance = 1e-6) expect_equal(results[1, "pct.1"], 0.50) expect_equal(results[1, "pct.2"], 0.125) expect_equal(results[1, "p_val_adj"], 1) expect_equal(rownames(x = results)[1], "TSPO") }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, reduction = "pca", verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("reduction works", { skip_on_cran() expect_equal(results[1, "p_val"], 1.664954e-10, tolerance = 1e-15) expect_equal(results[1, "avg_diff"], -2.810453669, tolerance = 1e-6) expect_equal(results[1, "p_val_adj"], 3.163412e-09, tolerance = 1e-14) expect_equal(rownames(x = results)[1], "PC_2") }) results <- FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, test.use = "bimod", verbose = FALSE, base = exp(1), pseudocount.use = 1) test_that("bimod test works", { expect_equal(nrow(x = results), 222) expect_equal(results[1, "p_val"], 4.751376e-17, tolerance = 1e-22) expect_equal(results[1, "avg_logFC"], -2.57219, tolerance = 1e-6) expect_equal(results[1, "pct.1"], 0.306) expect_equal(results[1, "pct.2"], 1.00) expect_equal(results[1, "p_val_adj"], 1.092816e-14, tolerance = 1e-19) expect_equal(rownames(x = results)[1], "CST3") }) results <- FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, test.use = "roc", verbose = FALSE, base = exp(1), pseudocount.use = 1) test_that("roc test works", { expect_equal(nrow(x = results), 222) # expect_equal(colnames(x = results), c("myAUC", "avg_diff", "power", "pct.1", "pct.2")) expect_equal(colnames(x = results), c("myAUC", "avg_diff", "power", "avg_logFC", "pct.1", "pct.2")) expect_equal(results["CST3", "myAUC"], 0.018) expect_equal(results["CST3", "avg_diff"], -2.552769, tolerance = 1e-6) expect_equal(results["CST3", "power"], 0.964) expect_equal(results["CST3", "pct.1"], 0.306) expect_equal(results["CST3", "pct.2"], 1.00) expect_equal(rownames(x = results)[1], "LYZ") }) results <- FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, test.use = "t", verbose = FALSE, base = exp(1), pseudocount.use = 1) test_that("t test works", { expect_equal(nrow(x = results), 222) expect_equal(results["CST3", "p_val"], 1.170112e-15, tolerance = 1e-20) expect_equal(results["CST3", "avg_logFC"], -2.57219, tolerance = 1e-6) expect_equal(results["CST3", "pct.1"], 0.306) expect_equal(results["CST3", "pct.2"], 1.00) expect_equal(results["CST3", "p_val_adj"], 2.691258e-13, tolerance = 1e-18) expect_equal(rownames(x = results)[1], "TYMP") }) results <- suppressWarnings( FindMarkers( object = pbmc_small, ident.1 = 0, ident.2 = 1, test.use = "negbinom", verbose = FALSE, base = exp(1), fc.slot = "counts", pseudocount.use = 1 ) ) test_that("negbinom test works", { expect_equal(nrow(x = results), 204) expect_equal(results["CST3", "p_val"], 1.354443e-17, tolerance = 1e-22) expect_equal(results["CST3", "avg_logFC"], -2.878123, tolerance = 1e-6) expect_equal(results["CST3", "pct.1"], 0.306) expect_equal(results["CST3", "pct.2"], 1.00) expect_equal(results["CST3", "p_val_adj"], 3.115218e-15, tolerance = 1e-20) expect_equal(rownames(x = results)[1], "LYZ") }) results <- suppressWarnings( FindMarkers( object = pbmc_small, ident.1 = 0, ident.2 = 1, test.use = "poisson", verbose = FALSE, base = exp(1), fc.slot = "counts", pseudocount.use = 1 ) ) test_that("poisson test works", { expect_equal(nrow(x = results), 204) expect_equal(results["CST3", "p_val"], 3.792196e-78, tolerance = 1e-83) expect_equal(results["CST3", "avg_logFC"], -2.878123, tolerance = 1e-6) expect_equal(results["CST3", "pct.1"], 0.306) expect_equal(results["CST3", "pct.2"], 1.00) expect_equal(results["CST3", "p_val_adj"], 8.722050e-76, tolerance = 1e-81) expect_equal(rownames(x = results)[1], "LYZ") }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, test.use = "LR", verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("LR test works", { expect_equal(nrow(x = results), 222) expect_equal(results["CST3", "p_val"], 3.990707e-16, tolerance = 1e-21) expect_equal(results["CST3", "avg_logFC"], -2.57219, tolerance = 1e-6) expect_equal(results["CST3", "pct.1"], 0.306) expect_equal(results["CST3", "pct.2"], 1.00) expect_equal(results["CST3", "p_val_adj"], 9.178625e-14, tolerance = 1e-19) expect_equal(rownames(x = results)[1], "LYZ") }) test_that("FindMarkers with wilcox_limma works", { skip_on_cran() skip_if_not_installed("limma") markers.0.limma <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, verbose = FALSE, base = exp(1),pseudocount.use = 1,test.use='wilcox_limma')) markers.01.limma <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1),pseudocount.use = 1,test.use='wilcox_limma')) results.clr.limma <- suppressWarnings(FindMarkers(object = clr.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 1,test.use='wilcox_limma')) results.sct.limma <- suppressWarnings(FindMarkers(object = sct.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 1,test.use='wilcox_limma')) expect_equal(colnames(x = markers.0.limma), c("p_val", "avg_logFC", "pct.1", "pct.2", "p_val_adj")) expect_equal(markers.0.limma[1, "p_val"], 9.572778e-13, tolerance = 1e-18) expect_equal(markers.0.limma[1, "avg_logFC"], -4.180029, tolerance = 1e-6) expect_equal(markers.0.limma[1, "pct.1"], 0.083) expect_equal(markers.0.limma[1, "pct.2"], 0.909) expect_equal(markers.0.limma[1, "p_val_adj"], 2.201739e-10, tolerance = 1e-15) expect_equal(nrow(x = markers.0.limma), 228) expect_equal(rownames(markers.0.limma)[1], "HLA-DPB1") expect_equal(markers.01.limma[1, "p_val"], 1.702818e-11, tolerance = 1e-16) expect_equal(markers.01.limma[1, "avg_logFC"], -2.638242, tolerance = 1e-6) expect_equal(markers.01.limma[1, "pct.1"], 0.111) expect_equal(markers.01.limma[1, "pct.2"], 1.00) expect_equal(markers.01.limma[1, "p_val_adj"], 3.916481e-09, tolerance = 1e-14) expect_equal(nrow(x = markers.01.limma), 222) expect_equal(rownames(x = markers.01.limma)[1], "TYMP") expect_equal(results.clr.limma[1, "p_val"], 1.209462e-11, tolerance = 1e-16) expect_equal(results.clr.limma[1, "avg_logFC"], -2.946633, tolerance = 1e-6) expect_equal(results.clr.limma[1, "pct.1"], 0.111) expect_equal(results.clr.limma[1, "pct.2"], 0.96) expect_equal(results.clr.limma[1, "p_val_adj"], 2.781762e-09, tolerance = 1e-14) expect_equal(nrow(x = results.clr.limma), 213) expect_equal(rownames(x = results.clr.limma)[1], "S100A8") expect_equal(results.sct.limma[1, "p_val"], 6.225491e-11, tolerance = 1e-16) expect_equal(results.sct.limma[1, "avg_logFC"], -2.545867, tolerance = 1e-6) expect_equal(results.sct.limma[1, "pct.1"], 0.111) expect_equal(results.sct.limma[1, "pct.2"], 0.96) expect_equal(results.sct.limma[1, "p_val_adj"], 1.369608e-08, tolerance = 1e-13) expect_equal(nrow(x = results.sct.limma), 214) expect_equal(rownames(x = results.sct.limma)[1], "TYMP") }) test_that("BPCells FindMarkers gives same results", { skip_on_cran() skip_if_not_installed("BPCells") library(BPCells) library(Matrix) mat_bpcells <- t(as(t(pbmc_small[['RNA']]$counts ), "IterableMatrix")) pbmc_small[['RNAbp']] <- CreateAssay5Object(counts = mat_bpcells) pbmc_small <- NormalizeData(pbmc_small, assay = "RNAbp") markers.bp <- suppressWarnings(FindMarkers(object = pbmc_small, assay = "RNAbp", ident.1 = 0, verbose = FALSE, base = exp(1),pseudocount.use = 1)) expect_equal(colnames(x = markers.bp), c("p_val", "avg_logFC", "pct.1", "pct.2", "p_val_adj")) expect_equal(markers.bp[1, "p_val"], 9.572778e-13) expect_equal(markers.bp[1, "avg_logFC"], -4.180029, tolerance = 1e-6) expect_equal(markers.bp[1, "pct.1"], 0.083) expect_equal(markers.bp[1, "pct.2"], 0.909) expect_equal(markers.bp[1, "p_val_adj"], 2.201739e-10) expect_equal(nrow(x = markers.bp), 228) expect_equal(rownames(markers.bp)[1], "HLA-DPB1") }) # Tests for FindAllMarkers # ------------------------------------------------------------------------------- test_that("FindAllMarkers works as expected", { skip_on_cran() pbmc_copy <- pbmc_small Idents(pbmc_copy) <- "orig.ident" results <- suppressMessages(suppressWarnings(FindAllMarkers(object = pbmc_small, pseudocount.use = 1))) results.clr <- suppressMessages(suppressWarnings(FindAllMarkers(object = clr.obj, pseudocount.use = 1))) results.sct <- suppressMessages(suppressWarnings(FindAllMarkers(object = sct.obj, pseudocount.use = 1, vst.flavor = "v1"))) results.pseudo <- suppressMessages(suppressWarnings(FindAllMarkers(object = pbmc_small, pseudocount.use = 0.1))) results.gb <- suppressMessages(suppressWarnings(FindAllMarkers(object = pbmc_copy, pseudocount.use = 1, group.by = "RNA_snn_res.1"))) expect_equal(colnames(x = results), c("p_val", "avg_log2FC", "pct.1", "pct.2", "p_val_adj", "cluster", "gene")) expect_equal(results[1, "p_val"], 9.572778e-13, tolerance = 1e-18) expect_equal(results[1, "avg_log2FC"], -6.030507, tolerance = 1e-6) expect_equal(results[1, "pct.1"], 0.083) expect_equal(results[1, "pct.2"], 0.909) expect_equal(results[1, "p_val_adj"], 2.201739e-10, tolerance = 1e-15) expect_equal(nrow(x = results), 222) expect_equal(rownames(results)[1], "HLA-DPB1") # CLR normalization expect_equal(results.clr[1, "p_val"], 1.338858e-12, tolerance = 1e-17) expect_equal(results.clr[1, "avg_log2FC"], -4.088546, tolerance = 1e-6) expect_equal(results.clr[1, "pct.1"], 0.083) expect_equal(results.clr[1, "pct.2"], 0.909) expect_equal(results.clr[1, "p_val_adj"], 3.079373e-10, tolerance = 1e-15) expect_equal(nrow(x = results.clr), 222) expect_equal(rownames(x = results.clr)[1], "HLA-DPB1") # SCT normalization expect_equal(results.sct[1, "p_val"], 4.25861e-12, tolerance = 1e-17) expect_equal(results.sct[1, "avg_log2FC"], -5.088014, tolerance = 1e-6) expect_equal(results.sct[1, "pct.1"], 0.167) expect_equal(results.sct[1, "pct.2"], 0.909) expect_equal(results.sct[1, "p_val_adj"], 9.368941e-10, tolerance = 1e-15) expect_equal(nrow(x = results.sct), 212) expect_equal(rownames(x = results.sct)[1], "HLA-DPB1") # pseudocount.use = 0.1 expect_equal(results.pseudo[1, "p_val"], 9.572778e-13, tolerance = 1e-18) expect_equal(results.pseudo[1, "avg_log2FC"], -6.036353, tolerance = 1e-6) expect_equal(results.pseudo[1, "pct.1"], 0.083) expect_equal(results.pseudo[1, "pct.2"], 0.909) expect_equal(results.pseudo[1, "p_val_adj"], 2.201739e-10, tolerance = 1e-15) expect_equal(nrow(x = results.pseudo), 222) expect_equal(rownames(results.pseudo)[1], "HLA-DPB1") # Setting `group.by` the group by parameter is equivalent # to setting the object's `Idents` before running `FindAllMarkers`. expect_equal(results.gb, results) }) # Tests for running FindMarkers post integration/transfer ref <- pbmc_small ref <- FindVariableFeatures(object = ref, verbose = FALSE, nfeatures = 100) query <- CreateSeuratObject(CreateAssayObject( counts = as.sparse(GetAssayData(object = pbmc_small[['RNA']], layer = "counts") + rpois(n = ncol(pbmc_small), lambda = 1)) )) query2 <- CreateSeuratObject(CreateAssayObject( counts = as.sparse(GetAssayData(object = pbmc_small[['RNA']], layer = "counts")[, 1:40] + rpois(n = ncol(pbmc_small), lambda = 1)) )) query.list <- list(query, query2) query.list <- lapply(X = query.list, FUN = NormalizeData, verbose = FALSE) query.list <- lapply(X = query.list, FUN = FindVariableFeatures, verbose = FALSE, nfeatures = 100) query.list <- lapply(X = query.list, FUN = ScaleData, verbose = FALSE) query.list <- suppressWarnings(lapply(X = query.list, FUN = RunPCA, verbose = FALSE, npcs = 20)) anchors <- suppressMessages(suppressWarnings(FindIntegrationAnchors(object.list = c(ref, query.list), k.filter = NA, verbose = FALSE))) object <- suppressWarnings(suppressMessages(IntegrateData(anchorset = anchors, k.weight = 25, verbose = FALSE))) object <- suppressMessages(ScaleData(object, verbose = FALSE)) object <- suppressMessages(RunPCA(object, verbose = FALSE)) object <- suppressMessages(FindNeighbors(object = object, verbose = FALSE)) object <- suppressMessages(FindClusters(object, verbose = FALSE)) markers <- FindMarkers(object = object, ident.1="0", ident.2="1",pseudocount.use = 1, verbose=FALSE) test_that("FindMarkers recognizes log normalization", { expect_equal(markers[1, "p_val"], 1.598053e-14, tolerance = 1e-19) expect_equal(markers[1, "avg_log2FC"], -2.634458, tolerance = 1e-6) }) test_that("BPCells FindAllMarkers gives same results", { skip_on_cran() skip_if_not_installed("BPCells") library(BPCells) library(Matrix) mat_bpcells <- t(as(t(pbmc_small[['RNA']]$counts ), "IterableMatrix")) pbmc_small[['RNAbp']] <- CreateAssay5Object(counts = mat_bpcells) pbmc_small <- NormalizeData(pbmc_small, assay = "RNAbp") results.bp <- suppressMessages(suppressWarnings(FindAllMarkers(object = pbmc_small, assay = "RNAbp", pseudocount.use=1))) expect_equal(colnames(x = results.bp), c("p_val", "avg_log2FC", "pct.1", "pct.2", "p_val_adj", "cluster", "gene")) expect_equal(results.bp[1, "p_val"], 9.572778e-13) expect_equal(results.bp[1, "avg_log2FC"], -6.030507, tolerance = 1e-6) expect_equal(results.bp[1, "pct.1"], 0.083) expect_equal(results.bp[1, "pct.2"], 0.909) expect_equal(results.bp[1, "p_val_adj"], 2.201739e-10) expect_equal(nrow(x = results.bp), 222) expect_equal(rownames(results.bp)[1], "HLA-DPB1") }) # Tests for FindConservedMarkers # ------------------------------------------------------------------------------- if (requireNamespace('metap', quietly = TRUE)) { context("FindConservedMarkers") pbmc_small$groups markers <- suppressWarnings(FindConservedMarkers(object = pbmc_small, ident.1 = 0, grouping.var = "groups", verbose = FALSE, base = exp(1), pseudocount.use = 1)) standard.names <- c("p_val", "avg_logFC", "pct.1", "pct.2", "p_val_adj") test_that("FindConservedMarkers works", { expect_equal(colnames(x = markers), c(paste0("g2_", standard.names), paste0("g1_", standard.names), "max_pval", "minimump_p_val")) expect_equal(markers[1, "g2_p_val"], 4.983576e-05) expect_equal(markers[1, "g2_avg_logFC"], -4.364959, tolerance = 1e-6) # expect_equal(markers[1, "g2_pct.1"], 0.062) expect_equal(markers[1, "g2_pct.2"], 0.75) expect_equal(markers[1, "g2_p_val_adj"], 0.0114622238) expect_equal(markers[1, "g1_p_val"], 3.946643e-08, tolerance = 1e-13) expect_equal(markers[1, "g1_avg_logFC"], -3.69215, tolerance = 1e-6) expect_equal(markers[1, "g1_pct.1"], 0.10) expect_equal(markers[1, "g1_pct.2"], 0.958) expect_equal(markers[1, "g1_p_val_adj"], 9.077279e-06) expect_equal(markers[1, "max_pval"], 4.983576e-05) expect_equal(markers[1, "minimump_p_val"], 7.893286e-08, tolerance = 1e-13) expect_equal(nrow(markers), 219) expect_equal(rownames(markers)[1], "HLA-DRB1") expect_equal(markers[, "max_pval"], unname(obj = apply(X = markers, MARGIN = 1, FUN = function(x) max(x[c("g1_p_val", "g2_p_val")])))) }) test_that("FindConservedMarkers errors when expected", { expect_error(FindConservedMarkers(pbmc_small)) expect_error(FindConservedMarkers(pbmc_small, ident.1 = 0)) expect_error(FindConservedMarkers(pbmc_small, ident.1 = 0, grouping.var = "groups", meta.method = "minimump")) }) pbmc.test <- pbmc_small Idents(object = pbmc.test) <- "RNA_snn_res.1" pbmc.test$id.group <- paste0(pbmc.test$RNA_snn_res.1, "_", pbmc.test$groups) pbmc.test <- subset(x = pbmc.test, id.group == "0_g1", invert = TRUE) markers.missing <- suppressWarnings(FindConservedMarkers(object = pbmc.test, ident.1 = 0, grouping.var = "groups", test.use = "t", verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("FindConservedMarkers handles missing idents in certain groups", { expect_warning(FindConservedMarkers(object = pbmc.test, ident.1 = 0, grouping.var = "groups", test.use = "t")) expect_equal(colnames(x = markers.missing), paste0("g2_", standard.names)) expect_equal(markers.missing[1, "g2_p_val"], 1.672911e-13, tolerance = 1e-18) expect_equal(markers.missing[1, "g2_avg_logFC"], -4.796379, tolerance = 1e-6) # expect_equal(markers.missing[1, "g2_pct.1"], 0.062) expect_equal(markers.missing[1, "g2_pct.2"], 0.95) expect_equal(markers.missing[1, "g2_p_val_adj"], 3.847695e-11, tolerance = 1e-16) expect_equal(nrow(markers.missing), 226) expect_equal(rownames(markers.missing)[1], "HLA-DPB1") }) } Seurat/tests/testthat/test_utilities.R0000644000176200001440000004027415056057544017736 0ustar liggesusersset.seed(42) pbmc.file <- system.file('extdata', 'pbmc_raw.txt', package = 'Seurat') pbmc.test <- as.sparse(x = as.matrix(read.table(pbmc.file, sep = "\t", row.names = 1))) meta.data <- data.frame( a = rep(as.factor(c('a', 'b', 'c')), length.out = ncol(pbmc.test)), row.names = colnames(pbmc.test) ) object <- CreateSeuratObject( counts = pbmc.test, min.cells = 10, min.features = 30, meta.data = meta.data ) object <- NormalizeData(object) object <- SetIdent(object, value = 'a') group.by = "a" data <- FetchData(object = object, vars = rev(x = group.by)) data <- data[which(rowSums(x = is.na(x = data)) == 0), , drop = F] category.matrix.avg <- CreateCategoryMatrix(labels = data, method = 'average') category.matrix.sum <- CreateCategoryMatrix(labels = data, method = 'aggregate') test_that("CreateCategoryMatrix works for average and aggregate", { expect_equal(unname(colSums(category.matrix.avg)), c(1, 1, 1)) expect_equal(unname(colSums(category.matrix.sum)), c(27, 26, 24)) }) test_that("AverageExpression works for different layers", { #average expression on data layer is equal to log of average exponentiated data suppressWarnings(average.expression <- AverageExpression(object, layer = 'data')$RNA) counts.from.data.avg <- expm1(object[['RNA']]$data) %*% category.matrix.avg expect_equivalent( log1p(counts.from.data.avg), average.expression, tolerance = 1e-6 ) #average expression on counts layer is equal to average of counts suppressWarnings(average.counts <- AverageExpression(object, layer = 'counts')$RNA) avg.counts <- object[['RNA']]$data %*% category.matrix.avg expect_equivalent( avg.counts, average.counts, tolerance = 1e-6 ) #average expression on scale.data layer is equal to average of scale.data object <- ScaleData(object, features = rownames(object[['RNA']]$data)) suppressWarnings(average.scale.data <- AverageExpression(object, layer = 'scale.data')$RNA) avg.scale <- object[['RNA']]$scale.data %*% category.matrix.avg expect_equivalent( average.scale.data, avg.scale, tolerance = 1e-6 ) }) test_that("AverageExpression handles features properly", { features <- rownames(x = object)[1:10] # check that the average expression is calcualted for the specifed features average.expression <- AverageExpression( object, layer = "data", features = features )$RNA expect_equal(rownames(x = average.expression), features) # check that an error is raised if none of the specified features are present expect_warning(AverageExpression(object, layer = 'data', features = "BAD")) # check that an error is raised if any of the features are missing expect_warning( AverageExpression( object, layer = "data", features = c(features, "BAD") ) ) # check that features can be specified as a simple vector even when # `layer="scale.data"` and `return.seurat=TRUE` object <- ScaleData(object = object, verbose = FALSE) avg.scale <- AverageExpression( object, layer = "scale.data", return.seurat = TRUE, features = features, verbose = FALSE )$RNA expect_equal(rownames(avg.scale), features) }) test_that("AverageExpression with return.seurat behaves as expected", { # counts avg.counts <- AverageExpression(object, layer = "counts", return.seurat = TRUE, verbose = FALSE) avg.counts.calc <- object[['RNA']]$counts %*% category.matrix.avg #test that counts are indeed equal to average counts expect_equivalent( as.matrix(avg.counts[['RNA']]$counts), as.matrix(avg.counts.calc), tolerance = 1e-6 ) expect_s4_class(object = avg.counts, "Seurat") avg.counts.mat <- AverageExpression(object, layer = 'counts')$RNA expect_equal(unname(as.matrix(LayerData(avg.counts[["RNA"]], layer = "counts"))), unname(as.matrix(avg.counts.mat))) avg.data <- LayerData(avg.counts[["RNA"]], layer = "data") #test that data returned is log1p of average counts expect_equivalent( as.matrix(log1p(avg.counts.mat)), as.matrix(avg.data), tolerance = 1e-6 ) #test that scale.data returned is scaled data avg.scale <- LayerData(avg.counts[["RNA"]], layer = "scale.data") expect_equal( avg.scale, ScaleData(avg.counts)[['RNA']]$scale.data, tolerance = 1e-6 ) # data avg.data <- AverageExpression(object, layer = "data", return.seurat = TRUE, verbose = FALSE) expect_s4_class(object = avg.data, "Seurat") avg.data.mat <- AverageExpression(object, layer = 'data')$RNA expect_equal(unname(as.matrix(LayerData(avg.data[["RNA"]], layer = "counts"))), unname(as.matrix(avg.data.mat))) expect_equal(unname(as.matrix(LayerData(avg.data[["RNA"]], layer = "data"))), as.matrix(unname(log1p(x = avg.data.mat)))) avg.scale <- LayerData(avg.data[["RNA"]], layer = "scale.data") expect_equal( avg.scale['MS4A1', ], c(a = -0.07823997, b = 1.0368218, c = -0.9585818), tolerance = 1e-6 ) expect_equal( avg.scale['SPON2', ], c(a = 0.1213127, b = 0.9338096, c = -1.0551222), tolerance = 1e-6 ) # scale.data object <- ScaleData(object = object, verbose = FALSE) avg.scale <- AverageExpression(object, layer = "scale.data", return.seurat = TRUE, verbose = FALSE) expect_s4_class(object = avg.scale, "Seurat") avg.scale.mat <- AverageExpression(object, layer = 'scale.data')$RNA expect_equal(unname(as.matrix(LayerData(avg.scale[["RNA"]], layer = "scale.data"))), unname(as.matrix(avg.scale.mat))) }) test_that("Aggregate Expression correctly sums counts", { test.obj <- CreateSeuratObject( counts = pbmc.test, min.cells = 10, min.features = 30, meta.data = meta.data ) # test normalization method aggregate.obj <- AggregateExpression(test.obj, assay = "RNA", group.by = "a", return.seurat = TRUE, normalization.method = "CLR") aggregate.counts.calc <- object[['RNA']]$counts %*% category.matrix.sum #test that counts are indeed equal to average counts expect_equivalent( as.matrix(aggregate.obj[['RNA']]$counts), as.matrix(aggregate.counts.calc), tolerance = 1e-6 ) }) test_that("Aggregate Expression return.seurat=TRUE returns normalized data", { test.obj <- CreateSeuratObject( counts = pbmc.test, min.cells = 10, min.features = 30, meta.data = meta.data ) # test normalization method aggregate.obj <- AggregateExpression(test.obj, assay = "RNA", group.by = "a", return.seurat = TRUE, normalization.method = "CLR") aggregate.obj.2 <- NormalizeData(aggregate.obj, normalization.method = "CLR") expect_equal(as.matrix(LayerData(aggregate.obj, assay = "RNA", layer = "data")), as.matrix(LayerData(aggregate.obj.2, assay = "RNA", layer = "data")) ) # test margin aggregate.obj <- AggregateExpression(test.obj, assay = "RNA", group.by = "a", return.seurat = TRUE, margin = 2, normalization.method = "CLR" ) aggregate.obj.2 <- NormalizeData(aggregate.obj, margin = 2, normalization.method = "CLR") expect_equal(as.matrix(LayerData(aggregate.obj, assay = "RNA", layer = "data")), as.matrix(LayerData(aggregate.obj.2, assay = "RNA", layer = "data")) ) # test scale.factor aggregate.obj <- AggregateExpression(test.obj, assay = "RNA", group.by = "a", return.seurat = TRUE) aggregate.obj.2 <- NormalizeData(aggregate.obj) expect_equal(as.matrix(LayerData(aggregate.obj, assay = "RNA", layer = "data")), as.matrix(LayerData(aggregate.obj.2, assay = "RNA", layer = "data"))) # test scale.factor aggregate.obj <- AggregateExpression(test.obj, assay = "RNA", group.by = "a", return.seurat = TRUE, scale.factor = 1e6) aggregate.obj.2 <- NormalizeData(aggregate.obj, scale.factor = 1e6) expect_equal(as.matrix(LayerData(aggregate.obj, assay = "RNA", layer = "data")), as.matrix(LayerData(aggregate.obj.2, assay = "RNA", layer = "data")) ) }) test_that("Aggregate Expression with return.seurat=TRUE returns normalized data in multi-assay case", { test.obj <- CreateSeuratObject( counts = pbmc.test, min.cells = 10, min.features = 30, meta.data = meta.data ) test.obj[['RNA2']] <- CreateAssay5Object(counts = pbmc.test, min.cells = 10, min.features = 30) # test normalization method aggregate.obj <- AggregateExpression(test.obj, group.by = "a", return.seurat = TRUE, normalization.method = "CLR") aggregate.obj.2 <- NormalizeData(aggregate.obj, assay = "RNA2", normalization.method = "CLR") expect_equal(as.matrix(LayerData(aggregate.obj, assay = "RNA2", layer = "data")), as.matrix(LayerData(aggregate.obj.2, assay = "RNA2", layer = "data")) ) # test margin aggregate.obj <- AggregateExpression(test.obj, group.by = "a", return.seurat = TRUE, margin = 2, normalization.method = "CLR" ) aggregate.obj.2 <- NormalizeData(aggregate.obj, assay = "RNA2", margin = 2, normalization.method = "CLR") expect_equal(as.matrix(LayerData(aggregate.obj, assay = "RNA2", layer = "data")), as.matrix(LayerData(aggregate.obj.2, assay = "RNA2", layer = "data")) ) # test scale.factor aggregate.obj <- AggregateExpression(test.obj,group.by = "a", return.seurat = TRUE, scale.factor = 1e6) aggregate.obj.2 <- NormalizeData(aggregate.obj, assay = "RNA2", scale.factor = 1e6) expect_equal(as.matrix(LayerData(aggregate.obj, assay = "RNA2", layer = "data")), as.matrix(LayerData(aggregate.obj.2, assay = "RNA2", layer = "data")) ) }) test_that("Aggregate Expression return.seurat=TRUE keeps group.by variables as meta data", { test.obj <- CreateSeuratObject( counts = pbmc.test, min.cells = 10, min.features = 30, meta.data = meta.data ) test.obj$b <- rep(as.factor(c('c', 'd', 'e')), length.out = ncol(test.obj)) aggregate.obj <- AggregateExpression(test.obj, group.by = c("a", "b"), return.seurat = TRUE) expect_true(all(c("a", "b", "orig.ident") %in% colnames(aggregate.obj[[]]))) }) test_that("Aggregate Expression return.seurat=TRUE passes arguments to CreateSeuratObject", { test.obj <- CreateSeuratObject( counts = pbmc.test, min.cells = 10, min.features = 30, meta.data = meta.data ) test.obj$b <- rep(as.factor(c('c', 'd', 'e')), length.out = ncol(test.obj)) # check that min.cells works aggregate.obj <- AggregateExpression(test.obj, group.by = c("a", "b"), return.seurat = TRUE, min.cells = 5) aggregate.obj.2 <- CreateSeuratObject(counts = aggregate.obj[['RNA']]$counts, min.cells=5) expect_equal(nrow(LayerData(aggregate.obj, layer = "counts")), nrow(LayerData(aggregate.obj.2, layer = "counts")) ) # check that min.features works aggregate.obj <- AggregateExpression(test.obj, group.by = c("a", "b"), return.seurat = TRUE, min.features = 50) aggregate.obj.2 <- CreateSeuratObject(counts = aggregate.obj[['RNA']]$counts, min.features=50) expect_equal(ncol(LayerData(aggregate.obj, layer = "counts")), ncol(LayerData(aggregate.obj.2, layer = "counts")) ) }) test.dat <- LayerData(object = object, layer = "data")[, 1:10] rownames(x = test.dat) <- paste0("test-", rownames(x = test.dat)) suppressWarnings(object[["TEST"]] <- CreateAssayObject(data = test.dat)) test_that("AverageExpression with multiple assays", { avg.test <- AverageExpression(object = object, assays = "TEST", layer = "data") expect_equal(names(x = avg.test), "TEST") expect_equal(length(x = avg.test), 1) expect_equivalent( avg.test[[1]]['test-KHDRBS1', 1:3], c(a = 20.66116, b = 751.54445, c = 38.31418), tolerance = 1e-6 ) expect_equivalent( avg.test[[1]]['test-DNAJB1', 1:3] , c(a = 230.50887, b = 50.50505, c = 65.35948), tolerance = 1e-6 ) avg.all <- AverageExpression(object = object, layer = "data") expect_equal(names(x = avg.all), c("RNA", "TEST")) expect_equal(length(x = avg.all), 2) }) meta.data.2 <- data.frame( b = rep(as.factor(c('c', 'd', 'e')), length.out = ncol(pbmc.test)), row.names = colnames(pbmc.test) ) object <- AddMetaData(object, meta.data.2) if(class(object[['RNA']]) == "Assay5") { test_that("AggregateExpression works with multiple layers", { object.split <- split(object, f = object$b) aggregate.split <- AggregateExpression(object.split, assay = "RNA") aggregate <- AggregateExpression(object, assay = "RNA") expect_equivalent( aggregate.split$RNA, aggregate$RNA, tolerance = 1e-6 ) avg.split <- AverageExpression(object.split, assay = "RNA") avg <- AverageExpression(object, assay = "RNA") expect_equivalent( avg.split$RNA, avg$RNA, tolerance = 1e-6 ) }) } test_that("PercentAbove works as expected", { vals <- c(1, 1, 2, 2, NA) expect_equal(PercentAbove(vals, threshold = 1), 0.4) }) context("BuildNicheAssay") test_that("BuildNicheAssay works as expected", { test.data <- pbmc_small # generate fake coordinates arranging the cells from pbmc_small into a grid test.coordinates <- data.frame( cell = Cells(test.data), x = rep(1:4, times = 20), y = rep(1:4, each = 20) ) # associate the coordinates and counts with a FOV fov <- CreateFOV( test.coordinates, type = "centroids", assay = "RNA" ) test.data[["fov"]] <- fov # dividing the grid into 4 along each axis creates 16 regions - label # each cell with the region containing it's x, y position x.regions <- cut(test.coordinates[["x"]], breaks = 4, labels = FALSE) y.regions <- cut(test.coordinates[["y"]], breaks = 4, labels = FALSE) test.data[["test_labels"]] <- ((y.regions - 1) * 4 + x.regions) results <- BuildNicheAssay( test.data, fov = "fov", group.by = "test_labels", assay = "niche", cluster.name = "niches" ) # the new niche assay should contain the same number of cells as the input # and a feature for each unique label from the specified `group.by` variable expect_equal( c(16, ncol(test.data[["RNA"]])), dim(results[["niche"]]) ) # exaclty a quarter of the cells should be assigned to each niche for (niche in 1:4) { expect_equal( 20, length(results[["niches"]][results[["niches"]]["niches"] == niche]) ) } }) test_that("BuildNicheAssay works with FOV and VisiumV2 instances", { skip_if_not_installed("hdf5r") path.to.data = file.path("../testdata/visium") test.case <- Load10X_Spatial( path.to.data, assay = "Spatial", slice = "slice" ) # populate a meta.data column with random labels random_labels <- sample(1:3, size = ncol(test.case), replace = TRUE) test.case[["random_labels"]] <- random_labels fov <- CreateFOV( GetTissueCoordinates(test.case[["slice"]]), type = "centroids", radius = Radius(test.case[["slice"]]), assay = "Spatial", key = "fov" ) test.case[["fov"]] <- fov left <- BuildNicheAssay( test.case, fov = "fov", group.by = "random_labels" ) right <- BuildNicheAssay( test.case, fov = "fov", group.by = "random_labels" ) expect_equal( LayerData(left, layer = "scale.data"), LayerData(left, layer = "scale.data") ) }) test_that("AddModuleScore works in the multi-layer case", { cd_features <- list(c('CD79B','CD79A','CD3D','CD2','CD3E','CD7', 'CD14','CD68','CD247')) object1 <- AddModuleScore(object = object, features = cd_features, ctrl = 5, name = 'CD_Features') split_object <- SplitObject(object, split.by = 'a') split_object1 <- AddModuleScore(object = split_object[[1]], features = cd_features, ctrl = 5, name = 'CD_Features') object2 <- split(object, f = object$a) object2 <- AddModuleScore(object = object2, features = cd_features, ctrl = 5, name = 'CD_Features') expect_equal( object2$CD_Features1[object2$a=='a'], split_object1$CD_Features1 ) expect_false( all(object1$CD_Features1 == object2$CD_Features1) ) }) Seurat/tests/testthat/test_find_clusters.R0000644000176200001440000000472215117326655020565 0ustar liggesuserspath_to_counts <- system.file("extdata", "pbmc_raw.txt", package = "Seurat") # Builds a `Seurat` instance and annotates it with the requisite data # structures for running `FindClusters` (i.e. a shared-nearest-neighbor # (SNN) graph). get_test_data <- function() { raw_counts <- read.table(path_to_counts, sep = "\t", row.names = 1) counts <- as.sparse(as.matrix(raw_counts)) assay <- CreateAssay5Object(counts) test_data <- CreateSeuratObject(assay) test_data <- NormalizeData(test_data, verbose = FALSE) test_data <- FindVariableFeatures(test_data, verbose = FALSE) test_data <- ScaleData(test_data, verbose = FALSE) # Reduce number of PCs to avoid warning from `irlba` caused by the # small size of the dataset being used. Plus, we only want to build our # SNN graph using the first 10 PCs to get "interesting" clustering results. test_data <- RunPCA(test_data, npcs = 10, verbose = FALSE) test_data <- FindNeighbors( test_data, k.param=10, dims = 1:10, verbose = FALSE ) return(test_data) } context("FindClusters") test_that("Smoke test for `FindClusters`", { test_case <- get_test_data() # Validate cluster assignments using default parameters. results <- FindClusters(test_case)$seurat_clusters # Check that every cell was assigned to a cluster label. expect_false(any(is.na(results))) # Check that the expected cluster labels were assigned. expect_equal(as.numeric(levels(results)), c(0, 1, 2, 3, 4, 5)) # Check that the cluster sizes match the expected distribution. expect_equal( as.numeric(sort(table(results))), c(9, 10, 10, 11, 20, 20) ) # Check that every clustering algorithm can be run without errors. expect_no_error(FindClusters(test_case, algorithm = 1)) expect_no_error(FindClusters(test_case, algorithm = 2)) expect_no_error(FindClusters(test_case, algorithm = 3)) # The leiden algorithm requires that `random.seed` be greater than 0, # which is the default for `FindClusters` so a warning should be raised. # Test with igraph method expect_warning(FindClusters(test_case, algorithm = 4, leiden_method = "igraph")) expect_no_warning(FindClusters(test_case, algorithm = 4, leiden_method = "igraph", random.seed = 1)) # Test leidenbase method if available skip_if_not_installed("leidenbase") expect_warning(FindClusters(test_case, algorithm = 4, leiden_method = "leidenbase")) expect_no_warning(FindClusters(test_case, algorithm = 4, leiden_method = "leidenbase", random.seed = 1)) }) Seurat/tests/testthat/test_sketching.R0000644000176200001440000001455515056057544017705 0ustar liggesusers# setup shared test fixtures path_to_counts <- system.file("extdata", "pbmc_raw.txt", package = "Seurat") build_test_data <- function(multi_layer = FALSE, preprocess = TRUE) { counts <- read.table(path_to_counts, sep = "\t", row.names = 1) counts <- as.sparse(as.matrix(counts)) if (multi_layer) { barcodes <- colnames(counts) counts.layer1 <- counts colnames(counts.layer1) <- paste0(barcodes, "_layer1") counts.layer2 <- counts colnames(counts.layer1) <- paste0(barcodes, "_layer2") counts_layers <- c( counts.layer1 = counts.layer1, counts.layer2 = counts.layer2 ) test_data <- CreateSeuratObject(counts_layers) } else{ test_data <- CreateSeuratObject(counts) } if (preprocess) { test_data <- NormalizeData(test_data, verbose = FALSE) test_data <- FindVariableFeatures(test_data, verbose = FALSE) } return (test_data) } context("SketchData") test_that("SketchData defaults work", { test_case <- build_test_data() result <- suppressWarnings( SketchData( test_case, assay = "RNA", ncells = 50, method = "LeverageScore", sketched.assay = "sketch", set.seed = 42 ) ) expect_equal( dim(result[["sketch"]]), c(230, 50) ) expect_equal( as.numeric(result$leverage.score[1]), 0.9036446, tolerance = 1e-5 ) expect_equal( colnames(result[["sketch"]])[1], "ATGCCAGAACGACT" ) result_2 <- suppressWarnings( SketchData( test_case, assay = "RNA", ncells = c("data" = 50), method = "LeverageScore", sketched.assay = "sketch" ) ) expect_equal( dim(result_2[["sketch"]]), dim(result[["sketch"]]) ) expect_equal( as.numeric(result_2$leverage.score[1]), as.numeric(result$leverage.score[1]), tolerance = 1e-5 ) expect_equal( colnames(result_2[["sketch"]])[1], colnames(result[["sketch"]])[1] ) }) test_that("SketchData with multiple layers works", { # (and one is less than the number of cells in that layer) test_case <- build_test_data(multi_layer = TRUE) result <- suppressWarnings( SketchData( test_case, assay = "RNA", ncells = 80, method = "LeverageScore", sketched.assay = "sketch", set.seed = 42 ) ) expect_equal( dim(result[["sketch"]]$data.layer1), c(230, 80) ) expect_equal( dim(result[["sketch"]]$data.layer2), c(230, 80) ) expect_equal( as.numeric(result$leverage.score[1]), 0.9036446, tolerance = 1e-6 ) expect_equal( colnames(result[["sketch"]])[1], "ATGCCAGAACGACT_layer2" ) }) test_that("SketchData with a different number of cells per layer works", { test_case <- build_test_data(multi_layer = TRUE) result <- suppressWarnings( SketchData( test_case, assay = "RNA", ncells = c(50, 30), method = "LeverageScore", sketched.assay = "sketch", set.seed = 42 ) ) expect_equal( dim(result[["sketch"]]$data.layer1), c(230, 50) ) expect_equal( dim(result[["sketch"]]$data.layer2), c(230, 30) ) expect_equal( as.numeric(result$leverage.score[1]), 0.9036446, tolerance = 1e-5 ) expect_equal( colnames(result[["sketch"]])[1], "ATGCCAGAACGACT_layer2" ) result_2 <- suppressWarnings( SketchData( test_case, assay = "RNA", ncells = c("data.layer1" = 50, "data.layer2" = 30), method = "LeverageScore", sketched.assay = "sketch", set.seed = 42 ) ) expect_equal( dim(result_2[["sketch"]]$data.layer1), dim(result[["sketch"]]$data.layer1) ) expect_equal( dim(result_2[["sketch"]]$data.layer2), dim(result[["sketch"]]$data.layer2) ) expect_equal( as.numeric(result_2$leverage.score[1]), as.numeric(result$leverage.score[1]), tolerance = 1e-5 ) expect_equal( colnames(result_2[["sketch"]])[1], colnames(result[["sketch"]])[1] ) }) test_that("SketchData with specified features works", { test_case <- build_test_data() result <- suppressWarnings( SketchData( test_case, assay = "RNA", ncells = 50, method = "LeverageScore", sketched.assay = "sketch", features = VariableFeatures(test_case)[1:100] ) ) expect_equal( dim(result[["sketch"]]), c(230, 50) ) expect_equal( as.numeric(result$leverage.score[1]), 0.7202897, tolerance = 1e-6 ) expect_equal( colnames(result[["sketch"]])[1], "ATGCCAGAACGACT" ) }) test_that("SketchData with specified features and multiple layers works", { test_case <- build_test_data(multi_layer = TRUE) result <- suppressWarnings( SketchData( test_case, assay = "RNA", ncells = c(50, 30), method = "LeverageScore", sketched.assay = "sketch", features = VariableFeatures(test_case)[1:100], set.seed = 42 ) ) expect_equal( dim(result[["sketch"]]$data.layer1), c(230, 50) ) expect_equal( dim(result[["sketch"]]$data.layer2), c(230, 30) ) expect_equal( as.numeric(result$leverage.score[1]), 0.7202896, tolerance = 1e-6 ) expect_equal( colnames(result[["sketch"]])[1], "ATGCCAGAACGACT_layer2" ) }) test_that("SketchData when setting your own variable features and specifying features works", { test_case <- build_test_data() top_features <- VariableFeatures(test_case)[1:100] VariableFeatures(test_case) <- top_features result <- suppressWarnings( SketchData( test_case, assay = "RNA", ncells = 50, method = "LeverageScore", sketched.assay = "sketch", features = top_features, set.seed = 42 ) ) expect_equal( dim(result[["sketch"]]), c(230,50) ) expect_equal( as.numeric(result$leverage.score[1]), 0.7202896, tolerance = 1e-6 ) expect_equal( colnames(result[["sketch"]])[1], "ATGCCAGAACGACT" ) }) test_that("SketchData when setting your own variable features and not specifying features errors out", { test_case <- build_test_data() top_features <- VariableFeatures(test_case)[1:100] VariableFeatures(test_case) <- top_features expect_error( suppressWarnings( SketchData( pbmc_new, assay = "RNA", ncells = 50, method = "LeverageScore", sketched.assay = "sketch" ) ) ) }) Seurat/tests/testthat/test_tree.R0000644000176200001440000000427715117042666016662 0ustar liggesusersPATH_TO_DATA <- system.file("extdata", "pbmc_raw.txt", package = "Seurat") TOLERANCE = 1.0e-4 setup_test_data <- function(cluster_resolution) { counts <- as.sparse( as.matrix(read.table(PATH_TO_DATA, sep = "\t", row.names = 1)) ) test.data <- CreateSeuratObject(counts) test.data <- NormalizeData(test.data) test.data <- FindVariableFeatures(test.data) test.data <- ScaleData(test.data) test.data <- RunPCA(test.data, npcs = 20) test.data <- FindNeighbors(test.data, dims = 1:20) test.data <- FindClusters(test.data, resolution = cluster_resolution) return(test.data) } context("BuildClusterTree") test_that("BuildClusterTree works as expected", { skip_if_not_installed("ape") # TODO: this test doesn't really check that the phylogenic trees being # generated are biologically valid but that would be more useful # for testing purposes we'll over-cluster our dataset to introduce # some structure into the resulting phylogeny test_case <- setup_test_data(cluster_resolution = 5) result <- BuildClusterTree(test_case, slot = "counts") tree <- Tool(result, slot = "BuildClusterTree") # check that the tree contains the expected number of leaf nodes expect_equal(length(tree$tip.label), 6) # check that the tree contains the expected number of edges expect_equal(length(tree$edge), 20) # spot check a few edge lengths expect_equal(tree$edge.length[[1]], 1127.60199, tolerance = TOLERANCE) expect_equal(tree$edge.length[[5]], 182.42944, tolerance = TOLERANCE) expect_equal(tree$edge.length[[10]], 59.24525, tolerance = TOLERANCE) result <- BuildClusterTree(test_case, slot = "data") tree <- Tool(result, slot = "BuildClusterTree") # check that the tree contains the expected number of leaf nodes expect_equal(length(tree$tip.label), 6) # check that the tree contains the expected number of edges expect_equal(length(tree$edge), 20) # spot check a few edge lengths expect_equal(tree$edge.length[[1]], 1206.4312, tolerance = TOLERANCE) expect_equal(tree$edge.length[[5]], 657.0097, tolerance = TOLERANCE) expect_equal(tree$edge.length[[10]], 982.9843, tolerance = TOLERANCE) }) Seurat/tests/testthat/test_integration5.R0000644000176200001440000003415415056057544020333 0ustar liggesusers# Tests for IntegrateLayers set.seed(42) # checks that the absolute value of `x` and `y` are within `tolerance` expect_abs_equal <- function(x, y, tolerance = 1.0e-04) { expect_equal(abs(x), abs(y), tolerance = tolerance) } # setup shared fixtures # update `pbmc_small` to use `Assay5` instances test.data <- pbmc_small suppressWarnings( test.data[["RNA"]] <- CreateAssay5Object( counts = LayerData( test.data, assay = "RNA", layer = "counts" ) ) ) # split the assay into multiple layers test.data[["RNA"]] <- split(test.data[["RNA"]], f = test.data$groups) context("IntegrateLayers") # setup fixtures for standard integration workflow test.data.std <- NormalizeData(test.data, verbose = FALSE) test.data.std <- FindVariableFeatures(test.data.std, verbose = FALSE) test.data.std <- ScaleData(test.data.std, verbose = FALSE) test.data.std <- suppressWarnings( RunPCA(test.data.std, verbose = FALSE) ) test_that("IntegrateLayers works with HarmonyIntegration", { skip_on_cran() skip_if_not_installed("harmony") integrated <- suppressWarnings( IntegrateLayers( test.data.std, method = HarmonyIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE ) ) # the integrated reduction should have the same dimensions as the original expect_equal(dim(integrated[["integrated"]]), dim(integrated[["pca"]])) # spot-check a few of the integrated values - since the integrated # reductions sporadically flip sign only compare absolute values expect_abs_equal( Embeddings(integrated[["integrated"]])[5, 5], 0.3912 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[40, 25], 0.6668 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[75, 45], 0.7248 ) }) test_that("IntegrateLayers works with CCAIntegration", { integrated <- suppressWarnings( IntegrateLayers( test.data.std, method = CCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10 ) ) # the integrated reduction should have the same dimensions as the original expect_equal(dim(integrated[["integrated"]]), dim(integrated[["pca"]])) # spot-check a few of the integrated values - since the integrated # reductions sporadically flip sign only compare absolute values expect_abs_equal( Embeddings(integrated[["integrated"]])[5, 5], 0.9174 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[40, 25], 1.4885 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[75, 45], 0.5442 ) integrated_sub <- suppressWarnings( IntegrateLayers( test.data.std, method = CCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10, dims.to.integrate = 1:10 ) ) # check that the integrated reduction has the specified number of # `dims.to.integrate` expect_equal(ncol(integrated_sub[["integrated"]]), 10) integrated_overflow <- suppressWarnings( IntegrateLayers( test.data.std, method = CCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10, dims.to.integrate = 1:100 ) ) # check that the integrated reduction is the same as you'd get if you # didn't specify `dims.to.integrate` (i.e. the same size as the initial # reduction) expect_equal(Embeddings(integrated_overflow), Embeddings(integrated)) }) test_that("IntegrateLayers works with RPCAIntegration", { integrated <- suppressWarnings( IntegrateLayers( test.data.std, method = RPCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10 ) ) # the integrated reduction should have the same dimensions as the original expect_equal(dim(integrated[["integrated"]]), dim(integrated[["pca"]])) # spot-check a few of the integrated values - since the integrated # reductions sporadically flip sign only compare absolute values expect_abs_equal( Embeddings(integrated[["integrated"]])[5, 5], 0.1785 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[40, 25], 0.5832 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[75, 45], 0.5442 ) # check that the integrated reduction has the specified number of # `dims.to.integrate` integrated_sub <- suppressWarnings( IntegrateLayers( test.data.std, method = RPCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10, dims.to.integrate = 1:10 ) ) # check that dims.to.integrate is not being overwritten expect_equal(ncol(integrated_sub[["integrated"]]), 10) integrated_overflow <- suppressWarnings( IntegrateLayers( test.data.std, method = RPCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10, dims.to.integrate = 1:100 ) ) # check that the integrated reduction is the same as you'd get if you # didn't specify `dims.to.integrate` (i.e. the same size as the initial # reduction) expect_equal(Embeddings(integrated_overflow), Embeddings(integrated)) }) test_that("IntegrateLayers works with JointPCAIntegration", { integrated <- suppressWarnings( IntegrateLayers( test.data.std, method = JointPCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10 ) ) # the integrated reduction should have the same dimensions as the original expect_equal(dim(integrated[["integrated"]]), dim(integrated[["pca"]])) # spot-check a few of the integrated values - since the integrated # reductions sporadically flip sign only compare absolute values expect_abs_equal( Embeddings(integrated[["integrated"]])[5, 5], 0.4092 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[40, 25], 0.3246 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[75, 45], 0.5442 ) # check that the integrated reduction has the specified number of # `dims.to.integrate` integrated_sub <- suppressWarnings( IntegrateLayers( test.data.std, method = JointPCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10, dims.to.integrate = 1:10 ) ) # check that dims.to.integrate is not being overwritten expect_equal(ncol(integrated_sub[["integrated"]]), 10) integrated_overflow <- suppressWarnings( IntegrateLayers( test.data.std, method = JointPCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10, dims.to.integrate = 1:100 ) ) # check that the integrated reduction is the same as you'd get if you # didn't specify `dims.to.integrate` (i.e. the same size as the initial # reduction) expect_equal(Embeddings(integrated_overflow), Embeddings(integrated)) }) test_that("IntegrateLayers fails when expected", { # an error should be raised if a v3 assay is passed in expect_error( IntegrateLayers( pbmc_small, method = CCAIntegration, orig.reduction = "pca", assay = "RNA", new.reduction = "integrated" ) ) # an error should be raised if a nonexistent `assay` is specified expect_error( IntegrateLayers( test.data.std, method = CCAIntegration, orig.reduction = "pca", assay = "DNA", new.reduction = "integrated" ) ) # an error should be raised if a nonexistent `orig.reduction` is specified expect_error( IntegrateLayers( test.data.std, method = CCAIntegration, orig.reduction = "lda", new.reduction = "integrated" ) ) }) context("IntegrateData with SCTransform") # setup fixtures for SCTransform workflow test.data.sct <- suppressWarnings( SCTransform( test.data, # use v1 to avoid potentially different # return values depending on if `glmGamPoi` # is installed or not vst.flavor="v1", # set seed for reproducibility seed.use = 12345, verbose = FALSE ) ) test.data.sct <- suppressWarnings( RunPCA(test.data.sct, verbose = FALSE) ) test_that("IntegrateLayers works with HarmonyIntegration & SCTransform", { skip_on_cran() skip_if_not_installed("harmony") integrated <- suppressWarnings( IntegrateLayers( test.data.sct, method = HarmonyIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE ) ) # the integrated reduction should have the same dimensions as the original expect_equal(dim(integrated[["integrated"]]), dim(integrated[["pca"]])) # spot-check a few of the integrated values - since the integrated # reductions sporadically flip sign only compare absolute values expect_abs_equal( Embeddings(integrated[["integrated"]])[5, 5], 1.1520 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[40, 25], 1.0302 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[75, 45], 0.1886 ) }) test_that("IntegrateLayers works with CCAIntegration & SCTransform", { integrated <- suppressWarnings( IntegrateLayers( test.data.sct, method = CCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10, # `CCAIntegration` needs to know how the data was normalized normalization.method = "SCT" ) ) # the integrated reduction should have the same dimensions as the original expect_equal(dim(integrated[["integrated"]]), dim(integrated[["pca"]])) # spot-check a few of the integrated values - since the integrated # reductions sporadically flip sign only compare absolute values expect_abs_equal( Embeddings(integrated[["integrated"]])[5, 5], 1.6113 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[40, 25], 0.6927 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[75, 45], 0.0855 ) }) test_that("IntegrateLayers works with RPCAIntegration & SCTransform", { integrated <- suppressWarnings( IntegrateLayers( test.data.sct, method = RPCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10, # `RPCAIntegration` needs to know how the data was normalized normalization.method = "SCT" ) ) # the integrated reduction should have the same dimensions as the original expect_equal(dim(integrated[["integrated"]]), dim(integrated[["pca"]])) # spot-check a few of the integrated values - since the integrated # reductions sporadically flip sign only compare absolute values expect_abs_equal( Embeddings(integrated[["integrated"]])[5, 5], 1.6492 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[40, 25], 0.7343 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[75, 45], 0.0855 ) }) test_that("IntegrateLayers works with JointPCAIntegration & SCTransform", { integrated <- suppressWarnings( IntegrateLayers( test.data.sct, method = JointPCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10, # `JointPCAIntegration` needs to know how the data was normalized normalization.method = "SCT" ) ) # the integrated reduction should have the same dimensions as the original expect_equal(dim(integrated[["integrated"]]), dim(integrated[["pca"]])) # spot-check a few of the integrated values - since the integrated # reductions sporadically flip sign only compare absolute values expect_abs_equal( Embeddings(integrated[["integrated"]])[5, 5], 0.3427 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[40, 25], 0.1015 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[75, 45], 0.0855 ) }) Seurat/tests/testthat/test_dimensional_reduction.R0000644000176200001440000001111615056057544022272 0ustar liggesusers#' Returns a random counts matrix. get_random_counts <- function() { # Populate a 100 by 100 matrix with random integers from 1 to 50. counts <- matrix( data = sample(c(1:50), size = 1e4, replace = TRUE), ncol = 100, nrow = 100 ) # Assign column and row names to the matrix to label cells and genes. colnames(counts) <- paste0("cell", seq(ncol(counts))) row.names(counts) <- paste0("gene", seq(nrow(counts))) # Convert `counts` to a `dgCMatrix`. counts_sparse <- as.sparse(counts) return(counts_sparse) } #' Returns a `Seurat` instance containing the specified `assay_version` and #' populated with `counts` which is also preprocessed (normalized + scaled). get_test_data <- function( counts = get_random_counts(), assay_version = getOption("Seurat.object.assay.version") ) { # Use the `assay_version` param to choose the correct assay builder. create_assay <- switch(assay_version, v3 = CreateAssayObject, v5 = CreateAssay5Object, stop("`assay_version` should be one of 'v3', 'v5'") ) # And then instantiate the specified assay type. assay <- create_assay(counts) # Instantiate a `Seurat` instance using the default assay name. test_data <- CreateSeuratObject(assay) # Normalize, and then scale the input data. test_data <- NormalizeData(test_data, verbose = FALSE) test_data <- ScaleData(test_data, verbose = FALSE) return(test_data) } #' Checks that the specified dimensional reduction `method` returns equivalent #' results for each test case in `inputs`. test_dimensional_reduction <- function(inputs, method, ...) { # Avoid replying on default reduction names. reduction_name = "test_reduction" # Run `method` on each test case in `inputs`. outputs <- lapply( inputs, # Use all features from the input for each dimensional reduction. \(input, ...) method(input, features = rownames(input), ...), reduction.name = reduction_name, verbose = FALSE, ... ) # Fetch the embeddings for each dimensional reduction in `outputs`. embeddings_all <- lapply( outputs, Embeddings, reduction = reduction_name ) embeddings_1 <- embeddings_all[[1]] # Check that the first set of embeddings has the expected row names. expect_true(all.equal(colnames(inputs[[1]]), rownames(embeddings_1))) # Check that all of the embeddings are equivalent. for (embeddings_i in embeddings_all[-1]) { expect_equivalent( abs(embeddings_1), abs(embeddings_i), tolerance = 1e-4 ) } # Fetch the feature loadings for each dimensional reduction in `outputs`. loadings_all <- lapply( outputs, Loadings, reduction = reduction_name ) loadings_1 <- loadings_all[[1]] # Check that the first set of feature loadings has the expected row names. expect_true(all.equal(rownames(inputs[[1]]), rownames(loadings_1))) # Check that all of the feature loadings are equivalent. for (loadings_i in loadings_all[-1]) { expect_equivalent( abs(loadings_1), abs(loadings_i), tolerance = 1e-4 ) } } context("RunPCA") test_that("`RunPCA` returns total variance", { # For the motivation behind this test see https://github.com/satijalab/seurat/issues/982. test_case <- get_test_data() counts_scaled <- LayerData(test_case, layer = "scale.data") # Calculate the expected total variance using `prcomp` prcomp_result <- stats::prcomp( counts_scaled, center = FALSE, scale. = FALSE ) expected_total_variance <- sum(prcomp_result$sdev^2) pca_result <- suppressWarnings( RunPCA( test_case, features = rownames(counts_scaled), verbose = FALSE ) ) expect_equivalent( expected_total_variance, slot(object = pca_result[["pca"]], name = "misc")$total.variance, ) }) context("RunICA") test_that("`RunPCA` works as expected", { counts <- get_random_counts() input_v3 <- get_test_data(counts, assay_version = "v3") input_v5 <- get_test_data(counts, assay_version = "v5") inputs <- c(input_v3, input_v5) # If `BPCells` is installed, add `IterableMatrix` inputs to the set of # equivalent inputs. if (requireNamespace("BPCells", quietly = TRUE)) { counts_bpcells <- t(as(t(counts), Class = "IterableMatrix")) input_bpcells <- get_test_data(counts_bpcells, assay_version = "v5") inputs <- c(inputs, input_bpcells) } # Check that `RunPCA` returns equivalent results for every input in `inputs`. test_dimensional_reduction( inputs = inputs, method = RunPCA, # Reduce number of PCs from the default of 20 to avoid warning from # `irlba` caused by the small size of dataset being used. npcs = 10 ) }) Seurat/tests/testthat.R0000644000176200001440000000043715056057544014661 0ustar liggesuserslibrary(testthat) library(Seurat) # # # Run tests for 'v3' # message('Run tests for v3 assay') # options(Seurat.object.assay.version = 'v3') # test_check("Seurat") # Run tests for 'v5' message('Run tests for v5 assay') options(Seurat.object.assay.version = 'v5') test_check("Seurat") Seurat/tests/testdata/0000755000176200001440000000000015063070153014470 5ustar liggesusersSeurat/tests/testdata/genes.tsv0000644000176200001440000001005415063070153016327 0ustar liggesusersENSGXXXXXX MS4A1 ENSGXXXXXX CD79B ENSGXXXXXX CD79A ENSGXXXXXX HLA-DRA ENSGXXXXXX TCL1A ENSGXXXXXX HLA-DQB1 ENSGXXXXXX HVCN1 ENSGXXXXXX HLA-DMB ENSGXXXXXX LTB ENSGXXXXXX LINC00926 ENSGXXXXXX FCER2 ENSGXXXXXX SP100 ENSGXXXXXX NCF1 ENSGXXXXXX PPP3CC ENSGXXXXXX EAF2 ENSGXXXXXX PPAPDC1B ENSGXXXXXX CD19 ENSGXXXXXX KIAA0125 ENSGXXXXXX CYB561A3 ENSGXXXXXX CD180 ENSGXXXXXX RP11-693J15.5 ENSGXXXXXX FAM96A ENSGXXXXXX CXCR4 ENSGXXXXXX STX10 ENSGXXXXXX SNHG7 ENSGXXXXXX NT5C ENSGXXXXXX BANK1 ENSGXXXXXX IGLL5 ENSGXXXXXX CD200 ENSGXXXXXX FCRLA ENSGXXXXXX CD3D ENSGXXXXXX NOSIP ENSGXXXXXX LTB ENSGXXXXXX SAFB2 ENSGXXXXXX CD2 ENSGXXXXXX IL7R ENSGXXXXXX PIK3IP1 ENSGXXXXXX MPHOSPH6 ENSGXXXXXX KHDRBS1 ENSGXXXXXX MAL ENSGXXXXXX CCR7 ENSGXXXXXX THYN1 ENSGXXXXXX TAF7 ENSGXXXXXX LDHB ENSGXXXXXX TMEM123 ENSGXXXXXX CCDC104 ENSGXXXXXX EPC1 ENSGXXXXXX EIF4A2 ENSGXXXXXX CD3E ENSGXXXXXX TMUB1 ENSGXXXXXX BLOC1S4 ENSGXXXXXX ACSM3 ENSGXXXXXX TMEM204 ENSGXXXXXX SRSF7 ENSGXXXXXX ACAP1 ENSGXXXXXX TNFAIP8 ENSGXXXXXX CD7 ENSGXXXXXX TAGAP ENSGXXXXXX DNAJB1 ENSGXXXXXX ASNSD1 ENSGXXXXXX S1PR4 ENSGXXXXXX CTSW ENSGXXXXXX GZMK ENSGXXXXXX NKG7 ENSGXXXXXX IL32 ENSGXXXXXX DNAJC2 ENSGXXXXXX LYAR ENSGXXXXXX CST7 ENSGXXXXXX LCK ENSGXXXXXX CCL5 ENSGXXXXXX HNRNPH1 ENSGXXXXXX SSR2 ENSGXXXXXX DLGAP1-AS1 ENSGXXXXXX GIMAP1 ENSGXXXXXX MMADHC ENSGXXXXXX ZNF76 ENSGXXXXXX CD8A ENSGXXXXXX CD3D ENSGXXXXXX PTPN22 ENSGXXXXXX GYPC ENSGXXXXXX HNRNPF ENSGXXXXXX RPL7L1 ENSGXXXXXX KLRG1 ENSGXXXXXX CRBN ENSGXXXXXX SATB1 ENSGXXXXXX SIT1 ENSGXXXXXX PMPCB ENSGXXXXXX NRBP1 ENSGXXXXXX TCF7 ENSGXXXXXX HNRNPA3 ENSGXXXXXX S100A8 ENSGXXXXXX S100A9 ENSGXXXXXX LYZ ENSGXXXXXX CD14 ENSGXXXXXX FCN1 ENSGXXXXXX TYROBP ENSGXXXXXX ASGR1 ENSGXXXXXX NFKBIA ENSGXXXXXX TYMP ENSGXXXXXX CTSS ENSGXXXXXX TSPO ENSGXXXXXX RBP7 ENSGXXXXXX CTSB ENSGXXXXXX LGALS1 ENSGXXXXXX FPR1 ENSGXXXXXX VSTM1 ENSGXXXXXX BLVRA ENSGXXXXXX MPEG1 ENSGXXXXXX BID ENSGXXXXXX SMCO4 ENSGXXXXXX CFD ENSGXXXXXX LINC00936 ENSGXXXXXX LGALS2 ENSGXXXXXX MS4A6A ENSGXXXXXX FCGRT ENSGXXXXXX LGALS3 ENSGXXXXXX NUP214 ENSGXXXXXX SCO2 ENSGXXXXXX IL17RA ENSGXXXXXX IFI6 ENSGXXXXXX HLA-DPA1 ENSGXXXXXX FCER1A ENSGXXXXXX CLEC10A ENSGXXXXXX HLA-DMA ENSGXXXXXX LGALS2 ENSGXXXXXX LYZ ENSGXXXXXX RGS1 ENSGXXXXXX HLA-DRA ENSGXXXXXX HLA-DPB1 ENSGXXXXXX HLA-DQA1 ENSGXXXXXX RNF130 ENSGXXXXXX HLA-DRB5 ENSGXXXXXX HLA-DQB1 ENSGXXXXXX HLA-DRB1 ENSGXXXXXX CST3 ENSGXXXXXX IL1B ENSGXXXXXX POP7 ENSGXXXXXX HLA-DQA2 ENSGXXXXXX CD1C ENSGXXXXXX GSTP1 ENSGXXXXXX EIF3G ENSGXXXXXX VPS28 ENSGXXXXXX LY86 ENSGXXXXXX ZFP36L1 ENSGXXXXXX ZNF330 ENSGXXXXXX ANXA2 ENSGXXXXXX GRN ENSGXXXXXX CFP ENSGXXXXXX HSP90AA1 ENSGXXXXXX FUOM ENSGXXXXXX LST1 ENSGXXXXXX AIF1 ENSGXXXXXX PSAP ENSGXXXXXX YWHAB ENSGXXXXXX MYO1G ENSGXXXXXX SAT1 ENSGXXXXXX RGS2 ENSGXXXXXX SERPINA1 ENSGXXXXXX CTSS ENSGXXXXXX IFITM3 ENSGXXXXXX FCGR3A ENSGXXXXXX LILRA3 ENSGXXXXXX S100A11 ENSGXXXXXX FCER1G ENSGXXXXXX TNFRSF1B ENSGXXXXXX IFITM2 ENSGXXXXXX WARS ENSGXXXXXX IFI30 ENSGXXXXXX MS4A7 ENSGXXXXXX C5AR1 ENSGXXXXXX HCK ENSGXXXXXX COTL1 ENSGXXXXXX LGALS9 ENSGXXXXXX CD68 ENSGXXXXXX RP11-290F20.3 ENSGXXXXXX RHOC ENSGXXXXXX CARD16 ENSGXXXXXX LRRC25 ENSGXXXXXX COPS6 ENSGXXXXXX ADAR ENSGXXXXXX PPBP ENSGXXXXXX GPX1 ENSGXXXXXX TPM4 ENSGXXXXXX PF4 ENSGXXXXXX SDPR ENSGXXXXXX NRGN ENSGXXXXXX SPARC ENSGXXXXXX GNG11 ENSGXXXXXX CLU ENSGXXXXXX HIST1H2AC ENSGXXXXXX NCOA4 ENSGXXXXXX GP9 ENSGXXXXXX FERMT3 ENSGXXXXXX ODC1 ENSGXXXXXX CD9 ENSGXXXXXX RUFY1 ENSGXXXXXX TUBB1 ENSGXXXXXX TALDO1 ENSGXXXXXX TREML1 ENSGXXXXXX NGFRAP1 ENSGXXXXXX PGRMC1 ENSGXXXXXX CA2 ENSGXXXXXX ITGA2B ENSGXXXXXX MYL9 ENSGXXXXXX TMEM40 ENSGXXXXXX PARVB ENSGXXXXXX PTCRA ENSGXXXXXX ACRBP ENSGXXXXXX TSC22D1 ENSGXXXXXX VDAC3 ENSGXXXXXX NKG7 ENSGXXXXXX GZMB ENSGXXXXXX GZMA ENSGXXXXXX GNLY ENSGXXXXXX FGFBP2 ENSGXXXXXX AKR1C3 ENSGXXXXXX CST7 ENSGXXXXXX CCL4 ENSGXXXXXX PRF1 ENSGXXXXXX GZMH ENSGXXXXXX CTSW ENSGXXXXXX XBP1 ENSGXXXXXX GZMM ENSGXXXXXX PTGDR ENSGXXXXXX IGFBP7 ENSGXXXXXX TTC38 ENSGXXXXXX KLRD1 ENSGXXXXXX ARHGDIA ENSGXXXXXX IL2RB ENSGXXXXXX CLIC3 ENSGXXXXXX PPP1R18 ENSGXXXXXX CD247 ENSGXXXXXX ALOX5AP ENSGXXXXXX XCL2 ENSGXXXXXX C12orf75 ENSGXXXXXX RARRES3 ENSGXXXXXX PCMT1 ENSGXXXXXX LAMP1 ENSGXXXXXX SPON2 ENSGXXXXXX S100B Seurat/tests/testdata/nbt_small.Rdata0000644000176200001440000133013715063070153017430 0ustar liggesusers‹ì½œVŹ?Kï[XzÙeaé°ô"x¾TQ©ŠJP@é¶¥ vÀ^bÔ5&7ÑhnÊM17É5æ¦hŒÑ$&Á^b¡)]ÿù3ÏœüæygÎÌœsÞ]ÈÝçóIVÞ÷œ9ç=eæ)ßï÷™2zfßú3ëW«V-§ZÕ«åÔøçÖÌùçÿU¯V³Z½þ­wÙ¼Õ½V-›»tiµj5 þùAcñ¿Ùß®Æ,øåälm÷½)üóðû¿5Ýðúßljú^®›`YÎÿ¿ù•¶íÃýÚÿóèÿ<…ŒÏûOüõ?í7@'ý÷Õ¾wâÄ1O‡/ÿÊ+õ‡ÿëû.Ÿþ÷­³»bFέ³»|ú3tiyÏ?í^×óÊ8ÞéÇOŒü}ö‰mÛÏÕ?qBÆñZžøYíÃo¯©ß®U¿ë¤ÿßóykƒ×}±ÆNsz.²ezr?ƒ½'nÏ çýÛÑß7ÿóWlx=ü<×ïzãÜa'žL˜ÿÏÃ/ĸ]>=×Ì9ñܺŽî¿ê'ÿÿi޳m|ü=eüà õ½°çünÊs‹Zú÷3ßÂnßà›'& ãøõ_W¯wÿw”ý+Ê0dhäû|(î—ï¸Ág #Ü~bb0îÿf²÷ËÓŽÏçñàì¾DŸ·ÍøüP×|³¡rßå<НG_¯êÑÏŸq¿ÚêïE±˜ÿQ]Ì»Á[êý þ*æàm¿y$8(ž÷`·ïÒþô»îs׉û>Ãi>ó‘ºÞœjüÿwëŸëxâq ïgpìÄ>㟣M²÷ÑwAuþÄño\ÝàÄ ƒ›ÿªõc‚ÔyÕz^?ýÿ_Ïɺnî·×ó¹{í×›ºâÄ|üÅí}Fm1Ÿà–^~ׯÖ+‘ókÆöuÕy*8"žÔðûÎÇk©ÿýrþñ/ßo}÷¾úûpίç!øLsÕô×½ì5å|]§ ·ÖDä_Σ^ÿ9űÖ_tŠ~~Q"æSäyŽÛq®WÈ8NÏÂlªÞnÁ¡èu-øXÿžã´6âù›U-+qopT}îP3Ή™_Á5Õüó®n".ÜÍòâ-Þß»{©ïY?ýü<W­Ùñv~MÜ×–Ñë&gœ·åq§û‰:éä×0~}¬ºn°×í:¢½>o€Îúç…·ŠybŽ>ák¸´‘ÞÏâV‡F~ôûn·ãgzÿ¥¼£ø[Z½ÿØ>b)ÒûÁ2ŽC]ªÛo?¦æ),uu”>o+ÞkžÂÍ ôñôyj›hݼþF§ùk/WòØøœ~™Ö@Ÿ¿¨ãÏïòD¹~ó€q|™g õóè8óîSŽKEa ¨%âM·¨ëîÚKÕÏý±}Ëwü–žƒj†ç…êè#Öçà5u¾BKÊ×ý^¼oÁјþà~u“¡Ëã"Î/üçãüjd§þŽßB×Pìæ…Û÷ŠW?ÊçìÿMeãøµÔ÷ ›êˆ÷}×÷¢ëÃëd§þ³`™x®¯ì¦_ß_`ÿ~“æ7G\¯oâ*zÏvLÐ>—Øðœòyð©x¯PH‡êý;“€é¢>‰?<ñŸ{âO&ïPó6»g¿—NÞ¹){þ»<]¸rœÖ¯ òÔnPã©e•çIζó Þëw°G]°b‚XO Y½¸¨Wdü¦¸mŸD~iÍ/½ò·¸l€ˆËv¬<±:¿(Þ§&â:àÞâ¼FPu$åÉÕûÏÛ-ž«U „ÿ?y•¨«m*~ÓŠ¯Š÷ã¢ĺ!ý…›Z‰ñšRýík[Gþ¿ófp@ÿœbæ‰ÄúgÁÊӪ׃Äó‰>«ÔçaÐýâù=ÄâßI7«þCmÇëvÕMâwœ3O}žg‰çãnç·ì›Z¿1øêJäçÇôëÛê:Xøq¬<–Üæ4¡ü~Q¿¿ñõùÜøâ‰ûgª‹¡@}/ƒ×õ~ŽÌ«cí¯ô~ž·†Žƒ£ó´5¨þÑg¢“ß|æöׯÍoḠ>Á~·õSØú0ç‡N¿Ó8^Ûtëó¨Íü¼é?y¤)Åûß(Úïå84L ê°GÉÏí¨ŸçQBóÌÜ+"ãWôùÔ$¿ó[½ü=›¡Ø-jÜÓ‚D÷3c¼/&ª/aý|±.œÿu5nêççßbéh·ðij†û/{ gØÐÓO™×X”ùQ‰GÁU¿Ï þ&xÝGösKžq_ºï¡É°áq1OÌë´Éÿóµº[M~?Z±û¿ö?TÎ'~ñ\8Nóèû‚} ~ïóÕŸÆy„ÏÝtµŠKˈß~(üËÍÛ•ßÇñl¾†v–úsgò›k3?¼«K¿Luž¯˜6AøC“?~nmZoäç#ºåŸÚR>d?­gÓ£ívúù!>˜ãÙ‚}Éü›´ 9ôwAy<E ÂeýL¼WÁçê¼ìÏ7Ê; ¼­ú\I<Ƽ+êh#E×å xÔduÈ¡ìy¹pPô¸–ü<ê~v’?Õ‘âˆhž_0ÂP§tãU–¡«7uÍýO Vq¥1ëÜ‚ƒô‘ÿíŠ ÏoË!ÁØÃüÕí©ÏÅ„îÂOÈu«ëcúËñø†bðb:þ–4TgyÀÉ/¹ÅÑ_úZt<1¦Pñ'øõOˤñ9áOÃõj]}ñ·”ðúµhÞÿ¬þü—.Wódwvuª7fŒÓ€ñ\·/ÖÍ)ûÕë>Zï¿cœ/!-C¿»œæ éï¥vÜÁ«œž¿Øãßð¿ÿ¶íïéÔëÌL„÷À‚‘/fx=ÉǰíÏãæØç±®¿¿œÕB}_Ö¥®ã—¾¡ÇPÝ—" Üõ˜È뾫ëPªò&|yZ[¦úIŒ‰íôǽQÍ“Êú‘íx²îŠy%úø¶­Å¿íÇòÄTÿEI¼uEÞºáIqöéé¾÷Þ‘z<³Åƒ(‰ÆÇ5ä¿âŠÜôpÃn8JOÜ…¯¡È-OŠžéÄèZ.þÖ3¬ÿ-|'èùï¨Oy‰M££ßCÿœ`Áñw݉Âõ#²îfù9ÿÚ¿ãŒXþzðA:ózxÕU?+?ˆç¯øW'«¡ß…±æ5œcÑ}èó¬öóà}†û]x]…âå9Î\æC*êøÒЫÄ/pÃ'~Ûok#ò—ç¸ñµÐ‚Õ û&›·‚7 õØMkýpG­Ò}Ïe¾=8d¨G_»Yäk‡‰º1rÝp—Þça¨‡ ˆòÎõ˜?֟劷m‹ê½â7ÿ_è× +?Ëp]pý-¯šîvR—ÕÒáw¡«g^®F<a¸ÿ™¢ƒªŸÎë:q-mÞ[p”å?–|77òÍA?Ò½¯Ánõ:»ÆàÆWÀØ»ÅûWÝq܉Éâòà¸[ž Sžˆç¼Ãæ×¼èó ¾ˆ©ƒ³ø%¯ü qñ‹µ÷ s'dÕÏö5äfg\ŽÛmÈΧº@ž…þ_Ý:øÈ/ŽAÙ¶è:’g×ÐÎó÷$äw›ôÓ6±<Ó Â†olÁ“2}Ósü™ò$—^­‹ñ¶ÛuÄÚåÚx Ó'µGŸ?±éöà®ÿëö3-E~nÞGn¸¶WHŸ ¯[ÞÍ£ó3¨AùîÛF‹üöýŸD뺔ÔRq3])¿Ø…Õù;\?ÇíbK‰XﯸÊ)o$ëÁ¨Áêì&ÿ¸¡ãuÁ»±ò68»®[¾KÎg ŸWùdó®‰/Ö'üËSJ¼³ïxãoì*ê +šhý‰ßËø¼4:¾Àæ§Åû¸åZýúW‹å ZQ|ñ¢'ÞéÏéæÓ¸¡1ûw;ý:Àuò|ã§Ãã5eqÿØébý«ÿÝh!î‹Ôç ?¿QÏßÆÕ ãé7J||w5NÆåÕÅó_Óð{9潦›B=¿úvÿ´áô/])â4†pöãǧS§CÀpmCÇÄó{Ç©ùÍàÆ®–®ne›g4„½/µÓ‰C] [ˆúÕC/­ñyƒ—ñì›–ùñ¡ë%Ëï¡Ã;Nñ·)Ÿ|š§¸õ§ý%ßÒÄ 0é¸ÈóÆMo«|Ú3²¤‡Ø8^>ùÙ]ÃãÌ{ÜO²¥î²ât>k„Z'®eà»0€× ±pXd^7ƒØŽÕO_ |ãÉ÷'Ê{¢È/Œ~ÌÚÞWàS „Ÿ>ů2¿†ó/TùF—o|ž& ‡²n£Š³6½ïù·ïöÎãZòÈÑã÷p[~ —èõ;¥¾¡ÿ³ñ[²xwíG‰Ö!´&E[‹ŽÅé’§I¹N=O¹NNâq{JÖÇë‰ ,J·ë›wæ8éaÒd§ë/ó\¸öláwró/y<~Þ€®ã U×ÈUÄ×$>8ü7«£û÷ ¼ê`&C+?Þ‡M¯>cüZŽzI=X½ª¹!¿Q>BÅß›ø.ƒË]OQÝo6é®>SïüL\WWû>›ø¨I µÕû|æVç¬l~ꦣ›ôº¢·A¸‰ÞßGž_„<ÂÓx×iÊHëƒ?6üÍD<ÑŒñZ0Œ§ÎTÆxõ,uK=9§†…Ç^ƒÍ£ÅûŒóëªyÚ.z]LØ$Ö™NÄ?ë æa×z×ñµYð ;ß™êu‡¾ Ð?ÏóˆW¾]ÜòB¾ºóquԤ߅˓é½`Å(½ÞÆ„›²‚¯7_ß³mØòŠ2ëvPq!Ówˆ:È¡{…~¿Pë¥Üƈcj¾lþÙ'Ö§°oKnº8œŒã_9É¢;(æáPG*‡â¿¹Äû"¾Šôx'Ž{ö1}ªc Ïàˆß@-ÊŸÌß.ø¼†üwRóÕ…ÌØ¿ ‹¯g¾«æ{z¥ƒ—Ew?/dëHÿÞÆýËl6ÍfuwZGn«+ônþXޣϯÿ­>¯¸òy1O=t¦~Ý x¶¸ãQõ¾ß÷ñùÒëõóø––bžŸÿ?2ϺQF¿‡»÷Gó“=y¨iàÙܳ]Å[­{"~ŸÇ-}D¨ïDpÌ--q|òº¢3­Kó¯ÏUoÒtì[Ž{$;:;ØAçu¾úÜ„ú™c¿ê–ç¼Rè±ò>eØ1V¼ “J>,äÿ,›âTg²éœáºgE†ê$¸å®hS]†³¸w×ù˾ È·ð×[PòS6Ž;ì+4ôoÑ}“êúáí9®1-ãù¤ðóÎt=&+Öº€BGüsÍhžF“®¡…nLSç£i~çÕk"×]œ·‹ú!Pó€a»þú|Ô35Ž?±‡:/¾D¯×]]ß²m¨Ît1y¿îúƒï:ÙÌ–gÆìÍ©êÃàüÆj=êæ÷­»¦~š¸ÿcÕ¯<_J0^¾qío…^]®áÛù\2=¦«nÓ…G#Ρ®˜ŸÐMö£¢ÏsY„ðFœuÇ'úãØ 9nï—Ä+†<›;‰|ÃÀ2}>ªã)¯Üé‡Ã'½“¾Π¾˜üz­[¥â ®ø#ÓÃ`yÆmõ³’?G'Ê÷Í)ÔãO‡ ~ú²¸é#ÿ”Þ³‡»½¨íSÆðñXô‚öù°éÝcŒ›înyUäaö¹å‹0Îï~›,Ô§·èYaNKÏÒú…O&[g×ëÜÚ¶^ù%ôŸ¦÷¾¶¤–‚{é¯n#ýPÌúN,V K7[eÙµà{¿û ¦ìמT_:<Înú+õ­Pëß½ÒáG 8éŽ?¢ð«Ð%Z—fùñ1ëÇó+3ô°z©}¤n*ßã°°Á€+¸p¼[Ý,ß3Ï¿×'­mˆg.-ýÕ–WÎ'Pýª¡ºŽÉú ys·éŸ=åñ0ò™hþ¡÷ŠYÔã†ï(×;ÄÝLâ÷<Õ1à‹ ýÆl&óYhjྭ¿.ÞÇɲރóy¼D~Ïný÷èã×ß‹ZF?·CÊõŸH¦“€ï…‡nh,‚uÏ©¸_Yꙮη¯¡/ë'I¼,rRémqÃ#ÕulõïbÕpÍÕn÷ñî¯Æ{Ï <@®k,û ‡Ç+ ^)ãk!ú¯´!†¯mÓñ5l£^÷–ä·¤|oc¦o”//‚³ô¸³ðûfúy-øØ1~¡þšÁÛñÞ?Ì|ÖwuÿbªÏýÊð;^`ÿfþbÚÆõßmºý®†þB(3Ç)ï× öJþ¬Ÿ®¦õøíÓ¹n¦ü‹ì»g<¾Ä­Oú^4NøÑ7×ýJýürƒ¿Éó3üêÈRgãXÐÊ‚w,ÖŸÍPVªúÇM ~ߜբžÎæG©GŽú¬nÕØ ›ÔWè`l7Á»#~¥ÄƒbçÏ£çh•ׇÕßþhkVO^}•à•PþŒúœ¡x¤¾·§¶7ÖÎOfâW¹ùão|Z9uúð< ú¾ÆûT†ŸW£û-ï{!‹»¯Pã1œÛ\äe?Í.ìý8Wø±xl”º^oRûãú¶Ñ¸‘™KcÍKÈg|Z®8\}nMº‹'›áwôø½ê–üÿ!ò‡v4sÓö|ÞÓæ#føyc©»y´¨´ˆž3ÎoÕ~{ö£Ê<;Jø÷¨Çžã‹¨âDwvùè!‚ljÖÉÖMÉ猻¿É°¡švÝ0á ÂïøÅéh¡_Ÿ‚w uš¥-Ô¼Qãxzhèý|âü£B¿Å ë™±ý™Ä÷¯íÏqý_ôÚ£öí!=$Ìê¥ê5gÏó–­bž]ü½æY‡EÞ¨6‹k6ÏxYª£3õ'ZRM]ïÏÚ¯òk :’hIñãÅK½Y´¡ø{Üú;I}¨š”·™&ôÌ9^«ë×åUßÇ­Åx0ãïßé\¢õ‡¨üÌÌÓãíÊÔ:ôWåóŠ®þÓš<ágÒ¼Š&”gë'ˆÏ’w$ã(L¸0Üy{t´›x^p™è‡RêkpýKÙÁ‰t*þ¾ˆþûú|v¡ºâ¼›Åý¨Æüå,¾½ÈMïÞ®¢Þ[‡ü¿óŽèó¿[7ŠúÎètð²˜â¦#|Z1xiW£$YÝÍõó+6ôQyi3ýê”2¯ñ9ãá:}Ÿ£pûÑ~Wp0f=ÛC*Rêxñ¹>N¨Exï2u>GÙ{ÑñhÊ×RÚU·c ëcC'=1Þ¿Õh]¹«\7˜ù˜ª#wáWÒÅÃÆìgoÚk±ü3×zr ëê¶Ö*þb• ÇÓÛ¬²ìjdǯ2a2o™ñùaÏúí«†õ¬ÍßwÞ üÕ¯Š|Ó¹D^kŸAo¾-ùu—oT× ÎÆÕ0ù´ï;¦ì‹æõ ÐóŽPÀòj+ ¾ÒëñòS(óÝÃ0NS>mT®>9ÿt5Ϲó½ õ»2Χf2]n”Eû—˜sHø¿‰›äË™ê™Ç7ð” ü\—#Þ“>ª®0×?FsÆê«ú'Ør\õ#Û3bé7£óǹ¤lÂŜ樇қñøöR}–ÎGö-<ðŒýG»é=Ä543øa_~÷êÇôŸ7´è´”IäÉÚ¦Ç{ Ÿ“®yð–A‰t·ÐŒåa%nöοªùGM,o£Ï4d¸¢îêuÅrªS]¥†ñçÞ‡éJ\˜íüÂqºDë:÷ šJyÆ+oOÕ?ÁåOF?GWvy‰Ä;š|¾ÓúbãE†Û±ë™ŽGú>ë´äq¤vÜ.¤_¹ÛqûnnuBtfúÝWGçñ±ì€þ=ÙòW‘§ªÇæùÉ/$Ó+QÇ3õ«Â¥OeGŸý£tðAò½çúqhj¨#NÀ|Üp³ÈkµÌŽÌ»(ñ ¥käMNëÊú™­‰Z†ûÞ/§-óôhÀòЇØÉ-†ª×“¾$J™¿2w·ºýuŸðƒ\ûbέ©ð¹ÞôÉnØ^ê…O Þ5¼/MýÞ½£\'“ÞcZ&ë*&µuOþ‘I×?÷ÞçOzýÃ>ƒ£×ñžñp(i[ðûuRóúèEùÙºÙ™?}Mö«ˆ»?Öÿ>ŸžóàEŠd׆™OŠx©M²ßŽWÇ¢º¥,}! .uÕ¸>[ý2Ž»èXù£à#ï“ú;àÌêj½eâÑy¥ójÅ«·‹Æ™†Ûå1?ui1é;±íÎ|Z­×–Pýõ¬V§Âp«({ BñßÁ!v¾‹¿×~Cœç9Ýõ<’~ gô@³h=‘ž~ñ0i†¾4´\ü-0äZ2\¹–>]í*ïÏÍGb3Üú¼ºN‹7©~ê¶ëõ<‹_‚T‡dúéiæ‰|6mrò+Lxl+‰Åè/€6h<Óã;Ú¨ûßöS1_öû8«zµ8㺬øõhS_Æÿ ŽVLÿ¬_¿\í_Ìë;Ø"ä¸á}ý¦óDíó…\Š'{‰ø›–‰üßü;T<ñþ3ð-sžºAE~ÈÖÈÏã"ôaëEƒdù(‰ÛÌV߃¸ÆqêÜ0R­£Gȸ{ŠÈcNRêõñ>Xhä÷~`´Ê°ño3~Ï? yV²Ísá~…,>jÞ9”÷î'†ç»Ÿðn5ÜÖ_´PŸ3ë¼þNJ|™æ¾.õp­›…ûVñ‚&ÝõpûŽ|^ï,í<ÆV÷û½Ô7 ×ÕJuˆ«ƒÆqWÆíº 7šVÌúUцUÝýøIÄ“ÁéÄu9ûƒtúR|&û•8¯oº­;ÈIz†4Î7Ý®ÿ‚Îôwãf=ŽÑ¢hêÓŽñ´Ï§­ÏF¸?½ Á§nuÂàgnºªi›kÿJl*Óçƒ×¯þYM†sŸE|Èõúëh<ΈIÑ}foP뎖¸N>(0èè•FóñM¸2®ç$y~RÇ ó…n<{ú5WÙ·Sþq4/³E:ëu˜Ï”óUïtôT¤áš¯«ïw óK,úR-ü·£®¦÷yvzö¾}ÿÂýïø/â ×?%øjq Òå[òø n}Ç8~+G??7ýCÉ×”ÿæ¿'ì×òµyz<ù{úóÍóo]÷J­yUÿ«ùËBŠ{%ç¼eÑñº¡–qû=ù%ŒïUßm4á8=>CêÁÈßïz~Ç•}%ë9ê³WO–§ÈïÁÿqÛþtô¼ŒÇ9“ðgl]FI¼ã¢¹Åœ&ˆÎò²®÷!ñërqŽew©¸¶þ‚Ÿ‚ñÎ?ÄIÖ‰©ÃGø?´Žö£d¼ŽÖ¤÷Sï$äã;â5ŒçÓŽáLäý >4Ù®·róÍÇbäsâ9>[ð¶|ëÕh–^Ê“¿+yXá¿ÉFžÛókÄ•P¿Wœ:ºå2ö›&pÖ}¤ Ýp®ý*±åkÑ:ЯëXû²X÷—կ﮺?½âÕ[јå³7æÇŸð>©6<%Ï+šð‡eu‡Zǘ.êî¨Kóå|Uçg¯÷ÓÙ›ù­ÿa,®lÍòäEžº [Ö‰y& }„†ÛõÕ ({Vü-Œ7¿"‡æ PݺEô8(&¿¦«'¶‰Æ`®àÓ£)­Wžt[Ÿs£ç1ÞO¸ÝíôœôqÓ%ÎØßÀ÷¿·èu› “EA ³p Ûæ‹ëÓE­ÃÉu:ܯg2ýŒ˜Éô[¨¾7D_ÏÅ5ßWã„ bD‰¥Ž÷7½_ÂO\C1ñÍøë!þµ!Õ#›ŸíŽ#Â/fü5L¾MÅϤ”O5™IŸ/®á®m¢Î´ü ÕOD3O?ËÀï=U MãáŽ}óUÁa·¼¥ÔgÃtÁwD̈’û¿¾|_Ãøm^ßxñÕA_ÞQLݹí=Ô§sý°µ¦Šß~™ê÷‹¿k|Œ{,ò¹ uòœRž­(Y>÷.‹öOš%ãðyyŽ|ÑŽŒ§YK}¿1(Z÷‚ûãœ/‰;ͳÁgžuú&ÌŸ-qü½»ö9âÕ,ùœKTüì~ÏphÃxD¨"u%­ßÉúœp?g Ü®úŽð‡o]«æ3‰í%^Îæ¿„:ÛËé§…º!بâskSÞµù7ý£g2´¬XEŒÿ†ê·¦¼y¾¥ŸMÓèù%ôçŽÆ¤ƒPцb=_\êv9S;:ÿƒŸF¿OË‹Äs³õ;"μK˜N¸ƒC~qfþÄù?ïŬ·üp]YÂÍ¡—g7‡ô×Îï%½WRŸ5<ß#Ñy¿`›7¤õ¦>©ð<\ ;^PçAǾxh©â0ËÖ™ÔÄïúZð\–ýÇázÜjx|Ç/µ•E÷/’u>ìü‡ZO{Ïï½ÇE¿ÏÕG±h…ú<Ž$?d¥^®Ê’%{ßyþLæópDÐ'ºÎÈ’^V§èûï=Þ¹+œâ[dW~³Ô§ÇÅ]êT8‡ú£Í›­æ£-|#ßûŸ´obس¼Ÿx/ªE_/WCC7?_ÖÐÓ¯þ|Áòêržé¨Ïcñ>šÎÇ1ðÑÐ"Ý<ƶЮ¯hÄâáë¿™.ßô¦Y'~ï×…:Žü±šL/lÒj~„ú4 1ùÛ½ÝøT8ø|ÌE×w´ñ´ä-¢4šÏ|Bù˜6–úØ =ÅsÉü/ΫÃp‘'Æä9ÑÇýܧö¦¾sTÜGð>­SÅž8ýkÅý4ôNÊ÷GOO}0G—¸&õ*Ð&ݾ»áøûÕç„ãœÇy™x,}/SŸŸ~z¿‹Ö}KåÉìeóBÇ%‚MK¿€v¬Ñë3¾?Ã웲‚ûpÕo²m¡eñøµ«¾&ê½92®òôƒçÔõܰð*7œQW=>’ŸO\“yIÛvR·©õ<Æ¿GgýïÇꇅŸuŽž·•OäO„ó Õ×± z•úÉáñ«yò滉|‚ä¡óõ…‡ß0\¬GŒO€Q÷êû%9>ç½H¡ÿ‚ÎÚûã­‡Rƒ]÷êŒ7q;þ¹·‰÷ê‰Xq¸¿…¤gÙ‚ã%©Îó ýû!u-CýÐBâ1´4<·=i»¥’g:6;ui,y0É_ÅX·üVëñB2.±Ö™«Ÿý<1ë ߯’OôÌû$5Lk«ÖyëÓótÅéú¼XƒMºŸ¦~&Þç56º¯1.ÐãÑ0©Ž~¾ú­¡ßrzÏóÙ{Î~9F®Òã~g‹Ö½’zº\ß°:wá<±>ÞxµÚ§Â¢?ׂÏó>GÆK}õý’šôË0¥ŽÈKî¡ÔµÂã÷tÔ±ÊqÔ+í®Ç}gÛ°¬…ø[Z…¬²*«²ŠµàûL¯‹åŸm:i÷²ÀŽ2Ćý]ñªûM)tÂ¥ÙÆáqbÆ÷¿¦¸$ÇPϬKëTs¦‡UÆxsŽ:”رNøé7«ù0ê·Šb_ÎódáçO >ãôTóËèã†F ‹Nþ°xy “Õ°ýtÒg~ºRðd®fÊ?ãÛOéß·˜º0iÚÄÛOöãy[ýSÖû8^pÔ3?Wô[öfÉOwì£ì<žG•R^1[†.éö©àÆ×!t,wÛo7ý%ý¡à3·|bXõ”ŠÓ¨cзdú,áçSD]EÖ3ŽcÈeŒÓÖ/Ÿêƶ£÷ÍSÇ%©ÅÅÅW¶¡môýHÊ6÷ì;²’WBÛtÏ7ÔÇläÈK¬™LW»¢ ùñp˜ËòÍ ñná8¹,_rý½Úë×߇àS?¼†²|}ÃìμßKÚ†\}|÷>K qõç|Ã+³ÿ Í×eäÅ:ëq$ÿ®†æúûdÓ‰æø‰ûÄâ¥Y©+`å¹"¾kcà=Õ´è,9â–Âí[^ÿ ¦ÛCš+þ,C×¾óËGƒ.Gôõ€<Ò?cøuT¯`<{=¿ã¡…¯Ý€xñõ q~Jýj3Ž[—ñ=-ñÔ{LíøŽÏ©äW‡“ý¿.æãƒ.Ò‡L_«Ì÷…V4ß7dñG…×xîËnxÞçbÓ¨dú–¾Íáv‹oÒç:ëqЍ™¿×ÕpÃã©âKMýuÂã|Õë9 ÷ D>Mò‚0Zèe„8ý<îîoEݱå8 +6„æL¿÷¸›Éõ™Ñ:»<.tbuↆ<õUÏÖyd¯=-=×™|?œ„äùe|Þˆáƒ[»åÙMfê#‹®Ñ8g›Éó Þ&à÷öM2œgÆqÛ'ëÏÈuµ$® ¨/ƒcìk<ÎC!ñI?fx-©ÿZ¯¯Ÿk½>c¿bµ."7]Iãx5-ü׺~×EnÏ+ø¿Kôx,D¿¯¦ø(߸ªKt^¼áÁÚèý:Ôf}VŽÆ!]Lîcnß·iðƒ·õylœß\¯wÛCø]èßmÓ½ ûu‹—_G£ìÆ)©ë¦¾í™ªmÀ%.h¯ú<üÉnI¯3ç·Ký™Œí&.RuE:%Ô—ìO|¾)ýÕ×÷«,Ckq݃ƒ,?×!ÞxÁz> ¼gÎçŽ2\짆øyõ"ṟägÑÏGÚõ›á‚»á2z«yWÞWÆ8§E÷¡ŠkÁgâ¾Ê~*¸È±NY#f‡=Ù­o ùwµd]©bqR˜»-Ú0ô G]Ãö#²Ã‡Cº>Eª¬Žî“ÂpvXvÚwKêDyæAÂñYpçþÚ§‹5§av⿌ã\¢òÑAÍ×ïœZºÏϰg³{¼n¤càˆ‡rí;ò&Kbê‚ìsÄí‘Î&þ.™^Þâ‡Kò@¶~›úþZümëq{”¨x‰=Ñõ¢ ÿ¥€pÅL¯ ÄzjÒ%áøqÔ4ôè¯êÐã®ïˆø°­‡Lržåˆ[»èN‘'{Çw],®#F~(øµoF×ë‚}†û¸q]Vùž&ÃÔ2õß›EãuLZJ¼ïÉú8jXC??pÉQW½}“ø÷üÝúzç–Ÿ‹÷öÌ¡ªß>ä>^e<7î§dŒßÑÅ÷‰üó׸þ}°?a¿–í«U=ÝfË/ {îGªnÓ-5.ê æ›B·ëÿÅó=¸²\ÄU×|_ÌŸ–þP\ßÍ /rËi±ò!R›ç7‚ƒ|ĽgFã6,q9rôßK`ÔŠ‰7ý¬Š‡]{¡¿æS÷לås65Ñǽ}®VŸ³|7ÿØ¡žO 5ï#ë›a·½!ÿ^,â?‰ë@Ù³âó›Ô|«_‡}ЖՉÎ[“þš¾çù­Ñþ'nz)z^»ÿ&uýî#ñ¯Íüò9¤£aê?„wªqìë¾!áÌ1<º¯˜¯¡š£ž×ÃmK÷­Oºõ!©w—ñ9é bê7Ýç"üЂžÏú,ž›ÂuÜé¹ç¿».áÔ‹ò7¼p?½~]𪾅ŽBŸñ -õ>¬¾OäKÖ\©ÏŸ®~@Å×7sÿf«Þ‡¡l‹‰óçfœÿëp=FƵôÕ@{‹ßS‹áþÖëõÃï’¾p;ÕóÜîËyâ½~éV6­_ÛYò½ÜL:ÀØöŠþ¹¶ð©ÐÁ ù#ÎÛßôFVq†UVeUöïohjóG\-Ø“]\v•Ú–”ïZeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVen†.gG÷ÈÖ÷æ¯Lï{íU¢t4RÖ Ç/!>înúw©¡Î`¡û-û,ðþ.Æñç¾,Îßзko:³[üðš÷/ÖW^ž·ñø}ËÅvŽzŸá¸¤{ ˆ¾˜ô]ÁÇé­kOzM‰ÂôÕ‘gàUtã¡”x·=’ö3ð®˜GÏã>³îO'ø÷ÜÍCÀ ‚׺mKÜSÓ»á¿?o›ÞëW‰Õ›´¸ÍàÏÄ Gã|Þ½Øý¯C¼·–¿fz¤ï[ç.ytçýž¥¿W3ê·yÝmB—`ý·SÑùÂÔ«T=á¢rq>_ÄÓËÀ…‚‡yO ~QÿÒhž^y©Ú¿¥Avu$0ë»'^ôàÓÁi¤âƒqSOÁ÷èDü¯7Ô÷S >Wë?8ö­¹ýcÁîÇx(W>(øI×>¯\,[(ú–u»/XnÐe">)¦> æ¥a¢o –,WùT[¶éûÉ~Nº‰]QžÔü¸é‹÷3ôêDú£Õ,ïKÛuâýŸ­Û¿¥ÇWc¤Xpþ3âzÞýuñïê¾%銘tÂãôÇÐ_¬û8_ðímºûh¥ÎS\7 7þ\ðsI“ésÒ‹@£ìöUŠkR÷*õq_Ñó°þçz]´:Œ/Kýç˜îŒÔá·6-‘.8¦ëu›$Ýüâ¬(ž'ÎÇ-a¼_âKåp»Ö1yÕ è|I§ˆëI.î{P÷šÇ~úÐ))X¼w#„¾ò¨ïʶï©:P?¿âáÛO}y0©†ö|qëçÑ}ròYœ´î²Dë1Æ"&ç«à½Ê鯇ѼÊl_·÷£~3(o¢ê–Zø [§Ê¯Àiúu–Çáöõhz¢™›^Ôm‹’õ¥©AýÀ^ÒÇ{&¾i\“}æãê¶ceUèúkáÅ —ßïÀü™êy'싃Z¬Ê –í§Wõ$ªs>5Ó¡õ±vþ‚Fzÿãš-Â!ÿë»E>($Ý¡zÉò¸õ3%žý÷ÐWèTà¼üxÏÅÈ:‰îOÆxã…n¹©¯B¸]1[ç þ¨Ô- ÿÍüFì$ýÕûÚ2ý.¬»0ZÅ’Äê?¤×É÷(øµ¡_ë†mD¾hì/qŒÙ)ž×YÔ'’úc“Èb‘ÐÁµì>\õ31ÿöÑûÀ(ñ¼^5EÕiùŒõS¤ê®GH·s\‚§&ée,êP;YŠ×#GŸõùÚ[ŸTïK-Êgœ­Ïã`Êq¾M)ÿ2·Lï5Êû]QWõ¿/÷:oŒ§ø·—þ|3¶Ÿ”£}þ¥Žv]ãwü>B7ƒ©g—Ôy€Å¸þVUwb˜ªO‚ëÏÏUzN§ÏáÕ¯‹þNÃÕ~´¸ý›bûUMSy/±õ»ªŸ4Hk0BèÁáæéúõaçKê¿'NRïïíÏ‹ó-ß.®÷y{ÅûyÉãÑþØì‡Åºp}5qü­_R×ÁZ†8o.õ¯ì#òª2?ì|=¶ÿQ—¸nÄ}YS7úü«ÅìÓÁ ¯Üå9¥/ºÔ#GMC_=ʰô£·ô+ÏØ~ÙËÒ? ø‡c¾¬»ªgƒbÒbëšÔÏØ?Ç-ÄuqÓ_ļþ¥¥ú~¦ÝW´M¨c-cÐ¿ÏØÞ S~ÿ¥u=Xÿ[u^û0ÚO°éWãîÔñ/aºÔ}1›–qÿÐç1x^Ħˎ _Ðטžò(ïvåv¿þ†&=ŸK&EŽ“m}wãq y5SÜ~/ãŒ"Ï~åý£ók¼ÞmÜÎÒç7ã¸wü·ÐÛë3K䩆©u¬zJÏŠ(ÏzÕ§ÑõÊ"Ž5ïzÅQaß.¦+Èûp`Óz?=©ñôF0m¦ê4¶ôÝîÀê/s:kt_¤®­qÿë.¿ÿö-z?î¸[ÝÐTWGõÊé+éjh“>9È×1èo~Ìòá¶ùÓ Ó‰yÿ«ÿ|û²“RßÄWOúþ-+}Þ0W0ã’ßD÷•œUKø«—þ>ZÜa3Sëð{Ò§ÅäEÿñ³ÇòÒ|¾ƒÔ÷ÒkSÁ±‡ 8¦eÿ£Î¿—Ÿ¯Æuƒ©¯ÆÄÆbþºí×"þíÎô}ÛÏVòq±ÏÓ‚ó5´¦ø½¾E¯wé¡XybL{*YóÕT|@¼:ZP5ü }^~åNÕoÜGõ,Ù§¯%áØ>2à|† |“üÞ† ŽSžl¿£nèZ?=O®ÇiÜ./ú¾Ë¸’¯#2¯Ëý[ŒyR¹_&½Y›™ú „êŠ :1üÅ=‘ÏYFœÈæ/ä0Ú‘ÿ‘ó¶Õþ¢ì×]=žî7†þÂ-Þ]õc¯ë††çRêOúS*ý¾²eغ˜òtw«ýq ~ŠÉ‚nb¥È·cÁ«ñú‚šô¢ ߆.jßTùéGcv±/?­æ¿n¼MÌÏm(¯:Ë-ÎAJJŠ6zëyt0àcæ|-Õ~6=^tñ«/TY•UY•UY•ý;Yp(;ýº«¬Êªìä5”úÅ«@®šw!üCÔA‚#Ü{kÏêœò¤§(Ž„úç5eý _K†oöêóªÁ›Ä/¥~{˜ÛTåŸL§Nƒ"ƒ½ÊðàE3bÕ½°®®øÛÊ—kgX¢ÎƒC^á«‚ßèçC,ƒñ”üpÁKÄ·ðòl†üìÌS®–Ñ(ê üž›°ÿá>6^7ª_ÝQ®ÖµŽ%ë?ƒ!‚·€!½Ry¾ƒßëý€pþÄâDï¯Éç6ß{“=gI-8š†¤fâÙfl÷¦aÞ7ðnãìaû׋æû¨l‰àW¢„á:çOu¼]¿Ö눬>MÔõ‡”ˆ:çç ‡•e<×Y0ngè+ŽjêùoÇãc…ãQ} ))Ö%Œj!æ™eÌC×ÌóÅ µŽ&ÜA ¯k›~—ñüúÜ%üâMK$ü¾ ñ, Ýð/ÁÄÓ«ß1žAÿF^Ïðß;ĺ.ñ"I›qüòè2Rí/œK÷¿DÏË>"ÞÈYÔ_þÚïÚ;U…B ÎØ ÿ“-C]v|zÿ‚Ï®ñ–)ªÿ"ým¦w‚mO‰ç{ÌÕZ?ËÕ‚ÃÄã>³·z3ŠÝx17<©÷Ç;¨}å±ü˜ø;±¿öyGÏè÷ó÷½›gGîþšÁ̧½w7oóöRÁ×ŪGoæ®sô¸ï,ã®Uq[ßßð¾ßz´× ;ô9ùc1ù¤¸y‚þóõ<˜E/øB?¾äã_Þ[¿NQûr›âiœfy¯?¦udëbýOÇú[=ÏlÅYb¾é[.þkà­¨êÅ4¦yª§zŸLÏa†Þ åK%î—¼,Æ«nÀÙ,¸Vy?]ãE¿ÜÏ’º?ÁþŠáà|µ8éqVèÀp0cǹå=w;žÇ¥¿‰\·l:èà‡#²™ÔµóÝ%nþš^±áK;èuDŒçG|!®d<^-ƒž^.å¥sè=½ò/‘×9ƒyþ/£y½—¤‚ÇU—ˆxñ?Ü\¸»¤g Zð&Ý·™o§“‡Ë£ñêòk9ñ$oŠó™½Ïgdå¾GÔ|¦÷ÓóäY¼/õ"âžG\‰àtüzçã™ôŠ2~v¯ìöÆ`Ãçóôüii&¤õx¾ýçOWç\ßJäµ?Ó?÷áù¯Aê„ðü+Úëï7.ÿµþó­£õë|#®?©ÇyK|´ñwÖæ༉z]™ñÖàMǸ÷pvëX\×Lvtó÷š_êy¶Þ©ñxo¸ñ-âæ“Ñ0»ºMaž¤A—’ø‘¸ð-ýs|…r@ùÃ3Ù|³¡P_˜Gq×€=ñpÓ4¿"ϳNyv™Þ?ßMßç1ÒÍB‹Óó…ß¼mᯑ®¤Ì3c<ãíäê$Rç°©úþo°ë›Ç~‡a½Â‘'ÀÕcb­‡²žŽ WFÎã¸|ut]¾ˆâ Z§å{!ŸCïóZ5M??6ø1“Å:„%Tg»õ…È|=ú\˜þñxwÞ,ž»™/ ½«ÝìûšéÔ—pcñÞ¶PŸÃ´x|i™œŸùó~ÿ"{¯òÅ{Ëëšû‹w>ÿŒ“g;¾qü)â=C«èùÅÈaùépÜšô·kvü@äòùÿ}Þ¥.›OkÒúqù™ªÖC؃Oõ×ÎyäèBõ•£’O£êìà¬/yåOQý^à<1¯lj—ná•óø£ã|õ?O\l¸Iý7þÍÖ<ñ·L­Ÿbó¥"VÓnÂ[˜æWWC~–øè¥~ü(W ý^%¤›T,òòG-ÏC¹êÿõ|;LŒ|¥î ¦½*üˆÍ³ÅßÛgWŠ®§¬ŸŸÒ߃ y\[W¨ï}C‹žÜ–“²n]Ù†÷Åz¯C~î†ÁnëšìÃ0}ˆù²ˆ¦\(æÙM%¢ÎrçÍj‡éê üAÇ~¦<%jÄÃ1»Ýê•èæ—G þH:é¿d¸ª«~/>‰ß2å³1IÔÁ°q›ÈãÍ¿Êë}4áPŒ~DgÁwÄìkÄ:÷¢›ÿŽ:éÄÿ8ûYõßע꺲ü90]œïÆÖb¾¢üuðNºy{_ãù cüvÅåúûpõXñ¾8 l›.ÞãñSUœ"ÍÏØø õsV¯Âˆ¿}HOux2½HɧÿݘÅ?÷ëƒ×x ÔO縦¾,áq.jI83½¾n¸]ƒtð´ÿ×ÍÖ÷Ë‹£¿Æòº¿¹>`ùßEkX¹Ûù Ñ÷CÁY„®Ç^Ï\- ‰7ËØï"ÒÕ¼½™X‡;~þ­÷¨õ’[扺xc6/^w¿>_ziG1îÅ Äß;rŸ_µäÄüòØÔ‰;,.ÎÕ4ð0zPÂWSý3Ö¨ú«ïó÷–Uý¨7ë¦IW#ýSN· ]P©ù¹o?Ÿ›¿!æÝ nùœ6ÆMŸƒúF×ßKÚ©ø;ÒI±é+r uîGwSëª õ¤GŸKU(wüÿŠºÊ¶~"ûrpò¬.vÙÅÓ¢6Ë/<Èt©~ÃñZ®~®¸Ý)/ƒmÄsW"ðsR›ëý ¯>Oh«[~¸²à9ºO,¿€Ö¤g³¦o´^;  |yoÂótóŸÄÿeœï‚f‘Ïeˆ›rÔ9MjØ(„¥?gÓŽÛ'#»EŽnWð†t#Îhþ-ú<Û ¤ÇdÀ £•ŸŸˆyßÏKn:õ-,¿Õ/>ÛGxV¯Æ(ò“K.µð2çªúJòyçq^Æñ :\2?Œk¿­_¹ì=ñ7‡áÈòã׎x±Ñ ‡~ãÍzÞÎÑbý^ù’ÓuG[âˆJZFžn}|°yž?Ôů ç¿LèUá’çE€ø]FÅ"½¾6õ+¦§‹î~ùuÌõUL Îßgܨ½¾ÁôüÖñË{` á,¸”oP×áõþ§ìG‡æô~Ô¦¿ú„«oÈ>'œ=Ö|vâB¸æ2Æßö¢gIKñ°z.®x(:îc‚p,!ÐðÜYÏŸðw(¤ëÔ(æ8ÛÇ蟳Wýðü&ˆQ×pæÙj¼5·–r<Ëx|n:mãþœ/Ï0[†¢ÛÓá“Ðï ^×ׯ¸^·Ô±ô>ßqúz V¼)âê¾"^FWCÝd{›h¼A½¾îå†ú©æŸ‚×iÜ]ñêÕÕúžÔÙÛú Õß=[øÈc}›?c áZ¨ó0ªu#, :Ó|\ðk§y<ãwP>óë©çß%z]CWVwtŒ‹Ó6Ž··®ùk´ÿuSuq=ú ,fÞçæ÷œû±x\qb¦ú`M¶ÝKnë~FÇq´N>;—&Òk²áDxß*nÈeþl¿gãž gÐ ÏM‡çŠ%óUú‡~~^8N[·ý0s³Þß{<òy óý# Ôz[kÒ÷ðÍyÖwQÈâˆÞž:«ýo\ Ç­:Ÿ×(†gº½ØÚÂé_ ŽZú§oýÜŸOý­°©¶˜×-¼\òWQo1øõ®†fÑq¡­‹|ž2tÒ; ]âúÂþÅ’ýËo¯|R=¯Ñïäm†ÿ¾x?ãÎÊ´?Ó½ûD ÷ãÏa¨¡OÀE"F±a}©cˆ¯]ýAºî(4ðñ–¢¯×õ3ø¥ÃÔ¾$¸ø°Šwéï§ ^“µyë~}Õ8RòX3¶ô»Tû_žª†ë.ÏíõõøÎ÷Ù{Ù¥bû…¡µ!ß(ëýÕ÷Öµï ZߺŒ=·¬‚Eç‹ø¹š»|4ñ`ÙúsÍ1,ÿ­:_Ýq–Z¯,¦úØeDçcwž£/7‹÷ù+;ÄzwÛÛj¼·ú7çýPŒsù]Ñ}ó ¸‘pœm¸Å¡WÝ)üTÖOŸjÁÒÛ 'r•¸~[¨ßê–GÅï87WoSõ÷¬l+®›üûÕgÄçwݦÇ{^q}7mסùA#IiûqÿÖÞ¥>G›zŠ÷åªËÅsPHõ§k׈çïöijŽâªNÄ×ܹÎ/%ã´ýEþñ(åéu‡Ò6Œýe<Ñ×Ó'Çñ6x¼‹ŸwÓa—yà¬9h€X·Ngyñ{^þu>Õ™:óþ¬Î3ï95߈ò"Œ—a³`Ã{ΉοfôŧÇ'„ß×㺜,Ž=à‡{D?º¤ÿ‡ü˜º‡Üð`hmØßÂ/3Ž·ðެ̛ºUÃH¤Nvù·&C©#ÿºV:}³’šìÿÁ?GMÏç³ ù[G*'ˆfz\ú°ø+_}^‚}žx`‹ƒeçüæ^s¦ÇÓQÈ!Ûõý#ë*àGêóƒ©\?nÁa‹¡Igbqºü¨Œãâ#Sœeg·ãv{õ×AÎc9ÁÉßå:-·î|¾/:Öu[’ß)ãi–?Ao Wþ(pÐÈeßø‚¨ë毘,øËcz®kÎlj‰×çýÞŸÇ~ÃzN¼hçþDÃ…î…+_,-3Í£¦|¡÷øÕ+×ï2ñ—ÐŒâɳ\Žx|®‘9½ÿ¶y8cÜ9¤ÛZ×Ó_’8Ù‹E¿ï pãtªÇ[ô8x÷¯•ó –\¡äïK}šðx“¯Pÿ=BäcÑ-úwau{±Ý@½¾F’¿@ú‹XR¦žÿóÑñ‰ü=—Ž‹¯ ¨nU×ðþpžôЛÄuicÁež¹Nä_>:9xåÒЊt†¿\‹òË»ŽªuÓÅBï-ÒÕɲáµy]]ê¡Æ=ºÿñ¶GÜú@Ìù­6ê¡®Ù)®‹ßm_¢dÿ>ïýûDëWâ¦Çâ[¡åÇ66‹~~qÑDßÖ'mõ×Kò2¶ÏM§^WY†aéèÆ>~5ÆSlÉôA^HVG‰}^›U=ÏØú¢)ïV¢ò 0Q?G,uúÓ„^!Ÿk°AW·ÓcàÇo@ú0ï;ÖÑÖ}K_ßœ×_赿’N}‚ç9CÔUÇ(8Lyæ÷³‹—Áèêúú¾!ï#òÜtšÂý¯#®z*Ö¼ÃûÛ££ŠŸCÉž åÁú®¤¥ßº„5ÔºÃÅTßÈ5໓ŽÒ[Œ×Eë¡|îLº¼ãÍùYä<÷{ŽmýÑqqGêûÈêKŒWóüÁ \Ý_Ö)ŽÑï•øMê?†ÉÏ©º÷ïõñù‚“¡›ÙšÖíó…>~¨¿=Zõ—C}¥ó¿ª÷o[1ýªË¨?P íךÕÉŠ™NƨGÕç½XünŒù±^?{Ó2áOW'ÿóÒ—z¤§Š“¬í`á̤¾Á eê}XúžzÞù–ùå¨N U\ º’>Ë-müp8M+Ÿ˜q×|ê÷¾Áý ëq¦®Sq»ü+n¿[ïFßGãq© Ö©zhä©ëU¨.1÷kêûÙ–ÞÏ-?ÿž¤ê"ûöýpíÇ…mëÔ:ØŠ÷´ëÇ …Û¯](â¦I„ »²ÐOëdtöëSˆ|K=\êÈ–]¦¯»:öóC5ÎrÙæTtÐç=ŽÌ¦‡ø?gœÒÅÓ¯+ïEø»kÑ|7ú=í{“q<Æ Ç%óò+±«¡ºÎ¯ýpá÷ôïí­ôù „ç0@¯ÃnÜÿ0ùµÄ›0ñ/Ð[ærÕç´¾:ñþÇ3éí–-Vס´ŽÞ³QøW~/þ'úZ¢•#n¿ã…Lz#ò¯÷ñ›±üÕ¤NÑësMÃøò ¾Ôu×ëë§åõçy±n/ëÔŸ³U>/ZÆ[OÐŒéÞl¹\ðÁ>¯ þÝ Oûž_ýõ)oÞÔO¯@öe2ñäe_\S_‡Ê¶à ?v÷bÞÛò„¯ê3}¦éðüx_Þpü†ÄŸ¿®¿ÈÇl¾ZÅíWc}†[òhçbÙoTžÄ¾ŠÁe»–Ÿã§{ºê+"®®OÇÁù8¬ïA°;Y}ÚÔ/øßÕ’ê΢&ʼn7•«uŠôyÝxq‘±oó¦g#ýj_¾¾‰‡‰Q{UÞ÷Ö—ýê›ú‰÷zž^ï,<>̓ùµó÷GëÉïW4W×Ïk‘Êó‹)jžcÞGC?7Lk©æIjŸîF‘ÏÆÆKÅ¿ }qÑ‹Ö͹"ñ…|Æ#é*ü2®+ž—ìk½£}äïÂu¢õ=SÂk Ä°>,)ÖÇqkˆïîÉ#F{¿÷íÓÍ/Øúš[ÏÇTÈ5ôþ¬z|ÉsܵS]¯woÒ‘wlã'™të°ùês?æ™X~ 龜·ëjm>Žëa`ØÐhÝ”¯_z¡S=/Ì맬+åk8c˜_]b éLîeu˜®"à7Õá¼Ï«ƒ¨Ë£n<|a8ÎM‹û2ë!·<ûø"åß&¿’óÛMu:ÉãăK¢ãº+¯ÑëŽQ½ í®¡í—Ä34fùÅšñüÔˆ—6pàÅÉÅÛ•†æ—\Úú Ðü0ã]/ÿ>xƒádʦ9͸åK^yšàZ }½ÂqKhû?ÆÃ-¤eð4õYc:HmH¯s¬Š/F¿ruÿ&TDzÍOW„ã–ŠØqJ…n±o^Ãf˜¬×Y=ÞÙW©xÉ÷+–?Œžéô;ˆkqýPlì%æóºê¼hÃA„Ûôq*ÊðÈ;‡wUž¯=S²JÁÙ1‡à˸­,:¨Ý*ŒŽÆ=†Ûq½³‰ôþ×bõã+ﯘüe#O½Êq}F›IÝ%4uÄ‘^æ‡'ÆÂv±êíh—ÎüsÿS¼O‹ßRóÑ]Äý•ë’ô¯Ðô~ º©²¯iÆçÇãù hNëÉx·ç4ܯ;å÷—<%ø6ÅÌ_.vÃûIÿdU'ÁO9Àô©e]hËïUœåp‰¥¯—ÑÓÅï¸P­_bÒ ây6à†Âñ-}j} +_ŠÞ½üâþºß=ÇKøkt‰É¯²¼ïÁ¡ìà'°v“È#µ5ð™ê±8¤Ë#5¡úØß ßw_}³ùK²þ&¨MÏó¬§Ež”å/Ðù9êkîVÇ ^¶\ß¿3|ÀÈߊ÷píUgóOì<úPcãçt¾ôþ÷ï;6>~J÷¡ç:¨Ø1Ö‰×']K6ßàL!Ž‹Ê”í±èWú|PŽ£ŸÅóÃ…LWKö;3äóù}5å§xm›áºÿû½•NÞ'­¾‹Ánâ…v}‘Ö+Šjp15üÖS™Wàx;Eë«Úú¸[[H¿+Wÿ¾KHô˜ë~ ×-?‹"ο§­ó÷{>ƒŸ³ûÃð¶ÇéÁx™ÉÖýàhÌ>”Bo7=þàÕ3ç.Ïj<†Í[õz ylþ® ¼)VﺻÝö_ØVß7êŒÃÑñÄŠ?‰çè²õ©ÆÒl<‡´ -ܶ“ýÒÃýñÑÆñ }Ãþ]-øD?Ã>§ß;ëļ?€âä’ÁÑýŠk9]\¼C}×~ú”Š|/J<ëÂÍßžòYØ”#übÞÏrùwÕu¬”êH-éß5H¯z¿¥¯ÒbSŸ¦èy܆§BmOÞÄòMâþÌj¥ï–çÉO¸Zèà`G 1îBñB¢]—C”o3à)Ò2,9W¯³B¸*k.ê?`ºŒ¿‹KÄs1Ÿœ;ÏO?à-öœúK†ßÿGËòon¬~ÞŽð'à }¹d^ªo‰ðæßÍ?“~Ù%GÕç~å⹟}©ð›Ñ}µà°0cé+/Cit\€¬¯Tuöžom/ò‡óƒX~z3½ Â#ÏrßÊÏyˆ wk·ÃªKæò¥”GÅÔ˜ý6~íæŸ ­[>«YÝ­‡Š#Ç"}¿Hl=]\‡³‡Qþå5zéì¶K'_‰e½ôç³²–>ž^Ø@}î[Ñzvï“âù)ùHÙ§ éùŵ¸xQt¥¼={.dß%t$<Œçl—÷A½z\²øèà7>ï?sªX˜‡¥<'®[*ÖCÎÖïó·Eûå|!S`³ÐÀ•GÕ÷ëúÿÖ¿ŬŽ~Ég³ïo.å›êuc• ªK?õ(¯ÝS{Ðã5¿@:`ҟö'ÄöË/ÏJ}=x•ÕƒþÌó³/ˆùcÎöè|ø«ñÞknظN¼çŒgaʷ㌷E<Øå¯y uh,d<–·÷Õ„«D-w=?Ÿ;ö}¡Æ&ÿè¹Y¿D}/n|Þ Àïoð¹ÛóYßÐ÷ç¨çÇ„ýÂkëó˜Áï-ñ ³Ä|ÄtB$ÈzþùÌï]¹P}ïäûéY—÷?NóäÃÄ8w}êvß;D篱27ß{8¢¿¯Iý®êùù˜õWíï û€1|Jp4]ÝL›q\™Ä`š¸Î¶þÖÁ;ìùº©¥ˆ+NH̃-Ùü¸p¡Ð›ú“~‘¼zþù?çuýüqyu—Öaõþ;U¼ÍÊÇÄ:9ÿs7¼0áÝlÛýëü6ºÍ e–uÛh}þ`MXyݸ}j“Š©Þ'ë=×:êÞÓû&õjú¾©êÈt0ðóÖlÒû;ËÓëÊXð—ãlŸ¤öIû±>.ä}zÃýIççSõœ>d~ú1ògZ°xôå¥ú›põ õ}X=^}R|਀Ž,þëFü•úü(6ÃèC÷Ѻ‡˜O÷8ÜÿÊ¡"î`}ÑAŸÏDk N·.›ÝíñþhR ]“õÃLÛ\ù·+ýQÙŸ]öÃÇãÖ¦:&õà³ýêâ¬.ÌûY¥m˜•ý}—¹^¸qô æ¢ïêëX+'ÐüéV7Ä%ߌ¼~¶ü&?­}ÿ¼ç~•³eœÇ²¾zbî#z½‰§Ù7G÷%Ê_ ‡éb©Ð7ùM˜x&ãø©;Ö ¿“Ï{sºˆ¿³V‹ïñôè têÐ@³–þlð9Íg3 züíX¼ÑÅWîwþr·íH?4c>Ù°%Ú?»gŒŸÿ?'_ͳ\wðï.ps¤ÿ€]tý´qß}_Qq;wߪçÓ-zz¾}àÏÁ‡ªŸÂâs¬ôó“Ç©m˜/š1\Gè|¼<НÏþ~"|+Æéu Ðp]éóÏ7Þ=Lj¤õ$O€ëî †¬Çò,eâ|l}båûŠBz?>QÇ“ó†É¿Í8nÓk6ñNkêç™ßÃ'…¿Ð:ú9~ý|àêQŠ¿ìc~ŠAï[ÞOSçŒóðäp¼zªúŸ2oï:^ÆùPˆ5NuÖß·0ÿX“öo£ŸŸC¾maýgï#®zLŒ;DÄYR?>ã|WwŒæQ|Áü—ÓÕõ’æ/ɃǪNÖ^.æ¹Î¼íg¸áVrˆÇIøg¬=Màd¨Ï9džyÓ.3¢q$WÏó/ÃÂñÉ’}$01;ü ”ß.â9ÉêBxûú8™ã(ÂÏ¿Ÿìüxœi=ïEëõëu×ÇÕºf_õ½øëùæ}¿†Û1œvý\Oº¨™Ø¯)­ eW ÿe}ý…’Ç{ÝÓ_žt[äû‚+~¦ÇÉ9Ö×l¸_œFþKSÂÓ®jP¾Cú£ŸTyÔ½ôë>Êæ‹çî´ U¿Ÿñk13W|ÎüÉ‹õ`»‘_–ÏpŽ£ýtÉ“âuoãu˜¥¾®âˆÿ—þ4Vß©çëLº üd²ydá—Õzˆ¡®žq~&Õ¡ {Å|á.yU_¯·Œ¥®êôÓêâ¶›UœÊ^懓4ÖåFç!fl¸¬cÔ7í¬M‰ò/£Þ?ê®ê­q½´‹~žP@óöò¬„ê×qÝÙp;òÏЄžG©8ù€:ÿN µ\ßÿ5.ÍË+Öž’#מ&î_¾>’q˜ ‡|Jyc£ÈPÇ 7]¦aê}Fo—ú3elßCÔ1Юãbñ|£q4“w¨ÿžªâÒBœrm¶ž1zS=2_ÿ!‡ö#½ò Šçǽ¦Í‡ßçRŒøE«0óQÕŸ/ ¿Ž:ná~}ž¥¿çèë>Lÿ ÅT'jÌøŸuØz2ù»z}Éfìýëëg…ûudy¦j~D'O¼E†#®Ãîߦzœ<ùM¯t5W üНN:ÒºÛ!ú:¡ ùuôÇ·çrÂç÷£ù¿ýBuÕϨžPß‚WßÚZä 82>1ìû7 Y½+oEWâ“úõ{ ÷7ðYCýê–†ïûP߆{—yõ…ì=jÃò›7D¯OÅ&^•…:©ŸX‡Z. ÕCЯØôœ5®Vmö·Mã¥e®þŠÍPÍÐw5Ì?ÒßÕë…¿R=O «#ÎÈ׿·äCÂíl8LW¡Ö£†­#üôX§Fçù¥õ\„Çùl²ý;ÔÇÕõãé)¡LŸgq“-üôü}óá~¬áZ3ªGÇß&^Ç)îá$Pæ‡s±÷¿ãš©îlݯàå©”dwžÁokçiãŽo ܃/ޱŸ¤‚w öQño~ï£q¼„¸ìÊê›Î N®¾ Ù2“mêÓŒN%‰î¯>ºê×¥ðû¡ÉÎ'…Ö ÷Šß°ÎP/V翤ýH3Æ_¼•åw^s¯!ÏÉõºS»z²z}\Cítûr z2]=ä§£·l3׸SoH¥þ×2p|~ ú¼—L‚õCLû} Çý.ñΛ¸=ï&],ä3ÞWM?ÿç="ê‹?%¼ÐŽYn¼ÜÊѵGß Ò{kžÎºƒÙEÞ¼ßãNÏ¥‰*ñ,IÏ'®aÆ/Ôu«C<ýT›Ùú‘¢ÕcóØçWÐÆoIu %ï*îþá8ÜòùÙ2©»lÝî4ýçÁoýòX(› æ·ÍÕºp>«Ç–Q}%WçPBüÞŸˆë‘úš¹Zp(îžtü‘cSY§e¾_é+Æ}jãIü‡ðü†FçЋp‡5ýžOôŠ—âøW ¢úf7u<,™§ú­„/A-–8D~5áf9Ÿ&¯mvpèÇqÔ›LË$ÿ%<þ¨ÕÑx—Íw‹8Õ3î ±èïµç:x#„?ÑŒë 8ò·mõÿs{ºáÛVŒ}ªšÌ{bzBÝ,‹¿$㌌<Φsž`æ7.êçŽú€ Ï×ߥi¼|Z®Ö‘/‚òß*~C¨Ë6Ó-ÎtÕMÁZŸ¹»#OÐÀ_IÚ¿Ãd¸XÅK|†ÎéúÛ„> é¢â¶ÑÑóÏÝÿË_—|JŒê¡Ç™ŠçŸ} ¹ yÓ„Îú¦ƒw ÇmšN}Ò8~1Ã-ëy62ŸoÂÅì|ÏÑ0üspH¿^bóÀè÷f΋Ñü¢-OiŸ{©£nW¾BĹ«žÑã© ü’P?Ñ€ïÀØ9êö”_—¼Ïp;Ç>¢Ù2<õæãÚü ñ·°³m¥ÄïÁ»Žz–>Š’xñ¿«Þ &Xtʺ¨ºDè÷C{ª‹^ÿW½÷5ñùib>’}Pp#é_´xþxý,ÐÄoý´õB'õz¯ŽÜ7.ø§ü™Í“úI¦ú[E.xM}>‡Ó¼"ý®Rñ†:žø©à=Ãqk%ó œÿy4Ád(”¸ð£õÚf/Ök'먦Ý÷6ã¸Ò?k–Î:™–I|°é{8F&¦z^ø=ùç&>¡Ípõœ¬úw&óÅ•¢MLÿ©-«;ó:ÑmóbÕ)¸¢ó~†zgøýa?ÿuhþ*Ë£¾f†>>Í ü‚kÊÓ­k¶óëÆÅ§e’Ÿèº½ ¿!ûŒ¤svfÃŽÿqïyûÄý?çÇYéÓf=^úº•w±=ã=J>¨©Úpîü¤«¡ñUo<®âÞfóFƒ®j̾Âáþ–þ4èP.þZð!ެț᪟ߎx²õ‰™Guùyõd8®à ýûdã³Ø uýæÿ¸ó³óùS¼°åGñÖÝ<êÇ`ÐçŸb]?ëO">þ7¾OÂùcÕ:ip îHžÇ5ð¬Âï‹×Ī"'Ýùã üв¯Gú8f…øY({'+õ äÑó^è†ëýCdŒú¥Óûˆú³~†ÇL¯ÇÕ\uùL†¥K¼ü”Š6 ýú–íWNEÖ+ú¸áñ-y6ŽÿÇÔå~ãbðïG_Z¹ý¡˜ÞZ¼„é^ìÍNŸáð¸5 ŸÏu»>¸s‡Êç0ÄSÒ|uߌÇÅö 幄ǽìxt}ýôîz”„zZÙ6ŒHGŸ7ñTÐÆ-ß—m]wãq uc´‹Žƒ1LàoПòº¯;Ö¹óãá@¥N„ï~áq«9êË7MVÂ(UŸYê§q=D“™ú5¡¹Ûu«ìº–¯É8Ÿó?¸¡ÔÀ´ðÑÜ“ß~$üæõ‹rp<ËüfÒ³ËÖøÒd<ž”ÎÓo‡zÑÏ1ΈÖ÷ ÷¾'òÄÚ¼¦@ø£3ÿ/oÜ¡ÜwÅLz²•e6_C?Ý ïñ‡ç¤ºN‡ã5ä+]±|bn¨Æx\8nqûaÏžºRYæasü ò“ñ.0 %ÄNé>ÿ¡6Å\O»þSÄMgw©Î“v}ÝTAƒ>”‰wTÊên)顨x¢h®ÿyéò÷| xN¿~Õ6ø­ýî+úéû®ó:E°ßp=ñ‹¶>CÆýL8´®~u<ûëÞÇ¥xШyWËlFµÐç÷ ³›ï°™ÔÏFsƨaÉk$äÃ8Ÿ_nvãc®"mCûìäE‚˜ŽÕS7ŸÀ«-VóFèÍÇñ#ÑÐÏŸD™È´®8¯ï´ ÕK¨(C]Òq±àHœÇcõ1Îúãxù4s[gqWa4Þ¬¶þs×> ðšÏ´:oŽ< [ß©Œã ÑóI3Æ% ›ïˆ|_Lë2V×Ôë—l[kýÈÐ…NˆWHË\qªRŸ7x#¥üº¬G¨~X°']\’Ô'OkÏ‘¼Íü¥U/èy]c™Ó€G³‚«0å5+Ú*ZÿQö#H{\\¯ÏˇXiW«Ê­‹I–E?êçе<ųò8þ¦æÊûjÒ‡CkÒ{_|PÏ{þä¨_¡qLý±7´¤†å?N4ÿð81cü¹ù*oñ~™1Nãè|0îì.p¨w<Ï}AžŸïžt|ƒaܾ©AŸr~}}RöO[z¯WmYJqÉåM”up¹[ÞËÏŠù{+W¼öÃRyOd»¸ûKÜ­õ8ŽøuÙdžëXdŒÇüŸ¸ë-V^¢ÏÏ·§¼€¡ï^\Sõy =ëC½“é@qýöpÜ’tp„¦¸;O£á_S?7éÊÏ«¤\=óxù>`¨Z—E‰^ß§æ: œ r˜>ÊÆ‹Ôü-雡(¡_4yœÓþ²O«÷ø‹n‹îßòN:8<›I]3¬ûF²ëuÉ5ª.û¡ŽA«{І«_†…ªS‰òͬc†üPKßs _\!¸.ÔÏUŸ2¼Zp¦>…ÉꟲÏÖç;ùU&²ÍлI"?£ë,1*žŽä©où')éô6§|[Ûèù©ÏaÂzŠ“]W“ûëlE7èý•‹&Џã7nx,lOOo{ÿȼHXW=w®[¿ØÂxþ:zêÀ¼“¬Îd{^ƒúu>­>R'‹¹ö[Ǭ]±òJÆþªu,ø'Ãõw>®'ïƒÜtÁ­Çý¡cÜšÏò ×yKËä|{ÿ¤ TšÐ/.I—/–ÔpÏtõþ (<‡ u'<ûƒÏoÝÝz¼ã•gmÕ¹X Xô¢úѺvÊó ç‡`ï{ë/ôzï/ÄúYÿÚÿˆí}H7ÂxvèNyÂ\‹MB¼upÌm½´ñNuËV]ÜUw1©¡:{~ÚòP Tÿ½áOjÞa®h¸†üèù08¨þ.Ù_í ·õ)ÕǦþU߯•ðÛxlæ\å}÷Ô‘C/¶ŽÍ¾&ÑüŽó÷œhä…v)×YnZ­ò=˜¾Š„ßð¯ytûžºþë‘ñÓªwõóãQ—ÁÍ*®·m‰ÆW.ú­XWoÿÜï÷yòÂås ýZëºÙÏG¿^&õßÇËuÔ-oO¿×·ÞÔ_ß—^궸Žã«Ã`ë ˜q>,‚«¿-êkïyöà8®üdº_Æó]P¨æqfõVq¢äÏcú[nu|êw‰bêk1t¨>ÜŒéà·ô¬µv»²›ÍÏVë×oû½ÏãuÈκŠK>©U?&žõÌQ‰®·©î޳èT¿CÙþdÇïjÈõK§îüÃRïª'Ö}Ô?µÖyôJ÷yÌÿ´Û£ó›‹¾“*.ÊÔ%c»×ôq%®xHø=³«ß†sŸ÷ÃÅŠîOn×Ô±Oî‘ì>§qûbaz·¾'Mi>®cÈãµÏA\ž¾©orÆvwWý¥Âèëš¡gr–¥ÈK,þ5øƒáö¿2c;Ö§CöG5â=§¤wŒÉúy¹ƒ~½B©èÛ…A‡T=Á¯ß­òä¶¿£úa‡›ú'qsíO'õhŒ¿o€à?c¨¾FÖ—Òê‡òß‹¼ò}ùnël¾gßë.œë.×ãÑ{ˆ€õyî×a×F5Ö+º/¨ìÃþ›áãö1¶õ3¨²“Ãx½¨N’Gùâ”ûÐKœS°áÏgÎí%}œ’´^†Nø¡âAÇ€,ᣠ:јßKÿy>Ó]qw¥èߢI:õ(´HÈKí æ)ßPš±oÖ„u•¢‹Q§‹<ñQâÖóqîìTyøÁaÙçç2µ¾Jø‡à3¶Ä쓉œ´Î8ôë)†ëãR“>¬ÔwÄ™j\.u%0ÑT‡I ?ºª•Ö?í¿ùÓ‹Ö ^Ç®×ôø¾I¢ñ¾>¬\=»SÍðí–ÝÓÀ©`ùÂïþ‹H¿ bÖ™&·SßoÒ‘ þÌòëìþ#OïÿK}7t¤º£¥¿5:êùš®zßû1>ªäË£¥áø--¸0CŸ.MY¾¿ùMŽúGr^ ñýžõjäGãù3ê%žº˜qG<|ó=ïк_ù½ª^ÀI¢#åj˜{‹žŸkÐÓpÕ£KŠ»C=·ú1žxé„_Ž)TWÛMu&®cu »º.RËø}‡xøeŽgE‘ß~_—騵¤u½•#ßa±˜(ƒct›~ø²-b½ezõÎ}Š{Óýù³¥~Õ^Ü7.6®¥Å¯ã}žOUCKCüJ}[$®Eì¹Ât¡Ö.²ctþ¦¢ K™^C'õ¼lëxp bxÅÙ2䤣wûø=+WoØ×ðí ¤®ãÑq£ÔÅϾ»óDÜÒKÌ[œík¦<À©b¸î6½®u7Ž7q5®×.ý€×äxýw±2ae¾ˆ .£î_‡ðâlĘ㌺+•|†4®w_ÛMðJYž Û~ªòÿ;îºáF y;4 |hu†—mM~É#›ÕzÚ]¿ôš·1CÕƒÆLáàbÇ.q½//þÎSóp¸Bô¹DsŠ'[éÏßu ^¡ßÙŒê–ü¾®oÎ}µèÿc„¾ :G×ñ3¶¨ï‹f2ÙÏu*&~2åÓ2Îë퓌÷VVê†ó¥×9GwCŸÝ› UÝŽ­Ù¡ÐÚp°¶>T(tÃ…I]„p¿hý!´ÐÏ×’w€aª~:–=«?&‘>«#b…*ÂàCÚë·ÎŽ¢Så›ÉùÕTÅEháÊ/ÁÛ*TGÕÕpý©Æ•xæ÷¿Sž3@âd}_~B]φ¼vJùËm&\}•š–‘Ç—¸ÂA»òj|õïqÿoE6ïšp>§ƒ^ÿöoCß(_ã}²1ê6·uoÿÉÁ»A±[· Ò×)SîÓçk8ï¬dõCß•¸¸/ù<˜ôMp^mµož¡jêý+©'‹qלÿc}] 4aÿÖ–¾%gž'òË~¥¯ãuróÿÐH‘K~N=ò×<û}eÛPG?¡ºA§¥‘E·µƒ]óߙ/?•td•Ñ7ƒô±6O­tM3ÎÃ&ýsÚþæ?¢ËI áiQfè'ëÆ\5XúF±Ôs }§¸þŠ(Nž{¯öúŸ¤3ÿ£Œpœ …þ×J»Î·®îjè³³Bô9Бñ÷NËÏ¿£nÆÍ¯”¸).nÖdh“]þVZ†oÕp«g3} ~/uö¨-þ«õ¥>6eXVê…¾ý€\õÄÒ9^X+Çý‹õ:±®†¶TÿÝ÷ϸÿúê£/œ{j¼/Òð½wç“ÍXÇ®DèÊîÿžÏÖ¦éð=uí2öÿ“Û:ˆ††x”üþà­“«ïºÍЧ¡Šãë.æS›.ê©b®:¨ÁA}Ü|ÁüfKÿçÊ2ïMÈÿwÔûÂÜxüKô×óˆ%Oƒ×ãlúí¶|Ž-OrŒc¦èõ¤eœbÛ?ø»©ÿ8Õ1VÿU_ÿXðRvyö¬*rôyŒ~ÏDêï¡›Ê;A™¾>¾ìþ^rÈMïsn¹>¯2³G¬¼sX¯ÔÒ+®É¨§o*ŒÖY´ô •uu”ø<‡€Ej“>l7uKܨGtŸ´ôÔþÔoþÀÆ?TŠ‚ùÓÔ÷ƒx¯<C›ÿI?ËÕÿGì𱦣×ûjñð—ÙAÕÝ:$æ•“]W ¥Épx¦¼jÄ‹ã‚Æ<Ó^=>7Ôi;/šßÌõ5Ó6‰GuÞ~·Á‡3é|`ÙËêºR+z]Æ–:"¯¸âõhÿÖwÙ¯eW(ó i^ ë¤?\„òè.^ Û†‰*^08LqÍQâ}ÉþV­hüœñO=ûÿâ,vëøá~¤®WÆç1ûgsü.š:ö²Ä¨OxîÓç&š—Âã1¾¨}Ÿøïà}èƒWSÒ¡êø#½_Y#¥|xŽ¥neY_ÃzCÛìêÊÄ5Ô¥¿ßøÒšTóÀ7 ÄQK>jìñS|@ÄQÆïd3\½:Þ~RoožŸÎP°›ö_?G¯cIó®kß×øª›í>ܾú÷¦8>£_â¸Ýâs6ÏaåmÚßãú¼J>ÚFûÏÒ_písQYfÂããû–œxnsXŸ:eÉêÜ\yg(y@_wî®~žÑõQÆåsÄq™J¨nQ,ÖSŒ¯ßÜU=SÁÑ„ú Î üTB}“Kö¼Éxu‰ÛÏ:cü3,þy÷hÝ4N„yYñ¿qß«'Eýäd7Tgºkê-_J¤#„•§‹³ÞÖã‘Z¦£³oŠëÿu|‘?ÁS¯þÀ‹ÇqOMûN¹¿QZú®è½†ÅåÄ£ýLVúÉÇ5 Qû`#/»¸3t'¿#ÉxÔèNº:Å¤Ç ·J"²¯wÒñ¬Ç£õ_¹D̓w‰÷¼£‹O `ýÊÆAá¸ÝÈOlæÙ'†ú„G¤Ž¹~;WÞ;†oŠ^™BÜþ­Á¾ìà„eú´ÇŬUÊ}1éµ ®áó ½òZm2xœ"½Î\ø}5ÖW¶éFÈ>Ku}û‰oއšþÕSZ'€ëš ý?Ž•WáýÙqù §Œ«ûÆ Eå~Ûï:æ¦+K¼‰ßF/µNŒÒtòøÑHõßÍIÏò#ÊGö~I°ÏS6Ÿòn-hÝ øÜÖ·kK¿Oö™B³x÷+ØCø†sÜò("Þ9ã‘¢¹å¼sÈŸrä?†ûÕ³èÆçèý&NÆUß9Üþ`B<õµ²ñ¬0ùˆÈ õËç£V6ð8?Uë ®¯à·ü®­žM?<?&ê^%p‡ßYÓëÄóuÑjí1àúšYpüÔï ;[Uª®·¸|<´ õBmê;`È_fl_‡æ—'/NE<®¡ç §8ýÎKâÞÑŽõcxØ&Õú;Š÷TîÙÄûðÇÔ×ësGþëjãŸÐ÷¯ì¥Ç³glw.ÃΛ#ü¹‡ÿçDAÄU¿£»‰<ÿž”u@ÿT}È­¿æê ¢N5í%5qözñœ^ÝRø{kôM·O¢¯¡QÅ讹ÎÃÒËê„;~æWïT7«ùan¦>oijÒßäéש{ÿS̓ڈóyŸáÚ>ÏnÜlº¿¸­¯àAÈzR÷“£/‰ÉÐÞÍo ¾¨ Ô^oP‹x†¾Ê2ÿ‰: wÑ:o3ÉÏ)a8Âöt†>°!r¤NOø|D¿G × ß~ö» ðdhäX÷¤× ÇÓï¾ãþÃjÞ᎞¢žšOñíyEêö× Wó‚~˜ Î ¾=õe?— Ÿ_šlÿØÇÍ¥þ×p»%–|vBü¼Mg?ÜÎòÜaÃß7"\Ùºkõ<úÖéè}¡kÂß¿ÿÔî÷6’ßYÃo^hàI÷Wõ‚wižhnÉ÷Ð×õ‚£é^ßà >?†‘^`Íd¼šàpÅøÇRïMöé³n0^ÝOMüJRÒ xºþŒ8”Ï)Ž^þw·üHù|¯çYö)÷ÏeºŒ?‰úzÿ/îýFý¾ñú¼:Yú›µ"¼Ë9ßÊjþuÓí£ˆçûá˜;Ý æuîÜé—òz¸M?Wâ­­çÓŒæƒzêúæ\Ÿš#lÌc~q'ÎÑQûd5äþ„ëè&ü=é7aD ½ÞÛ–÷³‚7 þA}$zëûJ§e¸ál}=ª¶E÷ès·|bØ_÷Û]T¼Ñg–¾MåÑ:vÇÉR k©%Wñà²tŽ÷‘§]ÙÓn}>HOÜÄ@‡wRésøŸ3DÍŸ—ýAYßW›¡ë?»yŽ~]£çm r¶ðkm¸yœñ[1o./Vûwå;ÎÛMÔí¸pð2ÅE[ç‡7T¾éÖÑï'ã}øöaÈÞW¬¼*•:Ÿ¬3alyäv(ŠÖ]È—ú¿£§çúÕÄ·¶Hæw`pºº#I-Ä·u‡³´Žÿtã9t‰§Çž1ã)§5ne™ ß|aÁUÎuRèÇ»âD} õÓ=õú=‰Ç…¾Ï#7©?eëcgO:ñÎ]šh@m†sôläöœîwÞôDq¾Ä¡͇Ãõº;r¿à%Ü‘£ÌãÜ?D KŸøßÓº—#üà(Ó±æ<ŠŽåâï­#Þ‚p–èsµŸ¾1Õu±tˆÀ!Ìb8JòÃ¸Ž€ÄAââó£ë<ºëçW_~j©×UöÅ4žAÏ =…Nï †< >“ñr‘O׫À’)aÇãù»k2Ý‚+Å€¸õ%7~œá½É8N?.‘ô†Çò ²Ïá¤ÿL5nÈ<>á_ª3ùM‹Þ"ºŽl­§éâÁÓ2´'Þü¾xùj`Lºyöè=øj1¯´0ä×O¿"ò|³—k²ß¼äµg|?ò=ƒK::ãaŸEC}ËÖœ‹ÓöÂóqÔYBíd÷½²Ëÿ>£õW®‹ùô^É>ÞM˜NgG½6çµ£XÏ÷D¿»ÔøþSÙß°rð§ªÙæí*«²*«|Cê_ÿã ”çù齌ÿ_‘_Ÿò› Á/cþ‹YíK‘q¼BC_¶£´.åú-©n¾þˆg¿ÞŸ¯³>ž´ÃëL¶¸Î8NqÅè?&µ´úiš }“Õ M8Èðû½†þ2=ôñcÆvsf ÿªvêuèìW/à&uqmýÐ’ò8í˜^]Qvò„•m_À-Ø}rêHCÿìÄóa¿¦óÄý}çñÎÇ=çþtùÍdŸÆtëò¾¢£î]SÇühW7œ…«!Ï/Šé\Î·Éø~Ÿ#}S7cMCݦÀÏÅušÐ=»} ìö?ã¼iÁ§É~—ìË—ìì"Æ÷œ“¦µ®ó8Ʊ?¹›Š÷—nܕԜû·#ÉÏ ~€¯þ{Ÿìöo”fÒ Í<êoxœôź²º¬Egÿ¦}ŽPO]GЈt” óZ¶ ¯ÃhÁ¯ÁPKÿ¹^¤ÓËqbÇé÷å¥ë?„Ç­Ãò,ï¼ÅëÏéâŠÑÌQ߀tªm:gÎÇ5èÜ¢&Ó×ü'¯÷ e¢ž‡ÖªÔ²ßœïêóNûõ~xÈ ¢ï‡mýAG|d™ßü’´Þ”m“ü¨´ÆC!{,Ù<„?xwÙÏñªõѺÝÕ(¾ ü† '+ñ´qÏ‹ë’Ú õâÅ]¼ÿºdWg§±ùÍÀÓ@aÅæSP/¾AÏ|E¡þyå¼|ô¹!Öûì¥õËà_£ÌM7Ð8þQZ7÷GçÃ\ µ-< ªS£4Ùó€&¬_æú|õÁϨmá³/O_×ðxôùïfú}ôùYy|ôŒ§Ç„1û/©ëš2ÝžúõPö5ÍpäœÏ~ÿ襑zÝÛwTï‹IÏ9ŒïÐÛ§Š£çwƒß€žÝŒú¬ßÀ1y>ÝÕÕMÕ>Ÿp-šGë¢aý®;ÊuÉ‘÷–ëÙwâtµ®‚e¤‡LùÚŒ¼kÜÆmoáÕ£ù¬‡ãy®= öÇtÔó>UÍÏþ»†>šn½—ð“ÜÏÂäæ*îip²8£Äú ùÁáçM³Û¯™›ÔGÅð×¼ò¨(µè¢/¬¼€+^mÓ­/£õkb¼AÔ¦úg]¶¾×¬\ýNÔ6¬'Í©ÎÕ åëÃøhNœ'ûÍ¢ƒÐ¡â}¦Qªú%(‰é¿‰ÖÙD+ºÏÍ ëy½èë‰q—мÁ0Š3Y\ƒ1“²R/ãý"ÃÏû¸Í;²>•öyU¶Åå[I] tHV¯ÃìsÔ|WQ4$í~¾Æãi¨_9ý©l:îhsœ¸í8hí¦ïjЇ’Ö³| # }ƺ$Ãq >ñ•ì›Ö¸2¿æ¼}n̸·¥á:5Tï7º¥ë_»êñÛðWÞǵàìÑGßg¾žÈ_°õY·;îÉWwä— ©e}®V1ýÌ“šäÁ˜¾G?}ŸcäVL³õù±ŒíŠÖÄò+Ð:»ë ï·‡á'¡(:Ž«:¤—âüh>¯±Ï8éÚºâžx=&xÑ/.>#œQ‰ÊoŘë¢ñYý]©‚®éðǸÉ:žñûžéê,£†¡>TR9z(ñ”kË`oåúŸÜ¸nFëu`Ã~Ñ“åÐ6Ù:<`ˆÇ±Nðz»ÆÃKãϺÓì—“ÕOÆý¯š'»ã¯Ê÷’×{üuõ´ç窻j7Ÿô·òÔx%Øo™Z²¼N ý¼€«/»~L¨+AñxM¿Y]í õÜlŸï1K.Çú¬­ÿ ÉxÿJïý‰‰ý²[¿ðÕ{‘:¶Á'Žú²ŽózêãTٗϺÿT½ŽcÉK\€í8Áû׿/®–ú‘Ö혷w×0u¯þý´è7ò¾ËÙ6ÔL¶ÎU¶¡ñYF®RëýbæågþÙéýÃÍ›ãõ5àw1†úugúÞ4Hßãq3½_(o¯× â¸Ðƒ~ž'¿ ©¡4Ý¾ÃØñšWÜaÒ÷G ßÃÔ÷5W¿¾¡ å,øgü×e't³]uH‚#=§¢óc‡ìeú½Îùýñp®ê/ºö#Äc_}1ROhêÇ⎥¢/„uè㯾—Åó{j‘Žœ±}©˜×ùûkܾÄG,ÍTÁ¹â ž7”ú.ÆãWç×…x ©}ë/üðË[ºÇÂé`Á»‘óÜ$Ö¥G¿žÅîz½›¹êÇ­ÿá¡¿ |2åõÐéô¬97ºî˜°_JZê]6XÄg—öü–ò£Nù×z_Æ~‡Xü¿þ":îý¢èAOþ^kúÔy‡¿h}¿qžšï >3¬_w¼žÈ5é"—ð¸ÅúzQx^{oÁ§aì úuöÌ D~yI§¸À5Ž”~=¯7apt“zˆxuXô{+ù¥èí÷Âv¢ÆóXãÆëÍKV—EÃ; z›ÁúçBêá'ã7½@ûW7ô»òQUÿüï¼±eÝŠkÁÊÁ1˜Lò÷øçhB:#Þ×΢ž…NÑýrÑšòzÌF öÞ”ŠúˆüD¨£ÚÉOO­h¿©¿È îµÜò9ÈwÌW¾”l}DqJ}—‰¯ŽMw«ï«Ûp?}£y èa‰7ÞfÏņ/²¢ë#q–Áë”—û©šÇ’|=LañN}‹¾imÕo~ºF×»QϬ²*«²*«(CÇSC_.©I]ÚÊ>*;9 ÿ=qñUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVe'›¡ìͬðwqίÎ}Ê“iŠa˜Ÿ>¡«Y8þº/ålÒgüul\¡ö3aºBøö$ѧf¿äÔ ^ÏÔ¢_îg}¿’x}©P`à‡¶óéÔ4‰Ë—zhKúÝ’·±¶G,2Ú0Öš*¯툷0çAe|©§i¿³¸ßh﨓gÐ[ºr|4_zv=µ̺Á›{üJ7ÝáÖÉô0‚×,z_0ÝÕ×»é¼wÔ¿O®}î’šœPËÀk©ë9ÿ鯓ç‡>ÝÅüBýlú)Îç3|–úÜþ(Ú2½¡7é=hÉø3OÌÖóßæ6Ö¾Á/ê‘W×ë€p> Î~)š¿Ö8¥¾P¥~}NÐTÏÓ°õÍFým㦃bzŸm}SƒŽý ýYþu¾^ç饱tBЈõÇ*ˆž1`‚_ª‰.<8è¹ý§Ñó*š;ö…;ëŠÞFð ës2·[|(ú­à'YúËT–™úøšìχ+ÇݮƬ¯½¥ofpܱ/GÞ?Œ´ð¼Z[xlïô»h>AZ/˜^&~C¯·*û00W¾ FýÙM?‰ñª¹^±OÎòꟚq‹ðx^øßÓÄ<Œ¤ËÕIèÓH‰pÿ‡–©<»«KSáK  Ùz,ûî$>t†±ç9ïú½Bõ›-~bÚ†nb‚Çòu±ô¹ÐÔS§òÜtûaûjмr.œüy|íÆD¼Q´¦¾´,Ž–ºrÁ;)ë«×Š×ÿCòc9ï7xƒÎÓ ë‹ SÑ¡âý?2¾ÿ±ßùÅB·3¾™H—¢ý¾ÞáË5µó±\÷l:é!ÿ™ôö¹n\“ý“QByÑÏÄëÁâI“¾”«¡+õ}9lÑo/ûªkeèñßj•¯ì¦Ï±~xµÓé¿‹Óÿ~ÓVõøŸ³~nwž›ýk[?4ί÷54%=‚vä?œ‘£^ϳÎy•Iúù¿ ÎÃÔthd…BoÖäWá’Ѫ®Îúâý±èœgÄÁMÕ÷2õù¯ºåµv>¢úŸù”ÏsÔ™ u9ÎZœÊ¼i–>ȬŸi¨ÜÍMئ«ŠžùÃLŸ‚÷õ¨A×£åk¦©z=¸ï¡“²zQ"]RŒqÓ5ż’Èzîþ‘>¾ì»Mè }iæ‰û‘Ѳ‹¡OuÒÍX~µv>À}Õ¼þE‹<ÞWϨåÕ—¸O²þ!á8Ǫý%è,îÛŒÞêüŸP—Åz¢× ­kè–ï¦ë*ßÏŒýK+¶O@ðWæßÅÔ]ˆÂO9ÈæÓQéóÀµã/†n÷—ÇŠóeùQ›¾2ºÄìGrÅU"aÐuÀnû@Í»ííÏ\.”I¿Ú÷¼¤n_ðgÃy}Ìêu7Ÿ§ê|¥£ãп6¿ÝúµoÞ—º†¾N·}K_±äpÖzýû¾õ½ íë•Ôd}Ä·mÒ^ úQ|7ŽcÈgÇ5ôSuRQ*ò¸ýÞh¿aĶdëù空å‡Y=ç¿?zS™?öŰžÏPŠÛr=ó,}Y?ZK=Ç·¿ºQtð|5ú™a^²èéʾ@®Çw5g½úCnzm|ýŒk˜ü=½¿Çôy¥¾¢qœƒÎyI¹v{®×°äV%ïƒÓœê>¬÷ƒƒã ûMô‰Ö»Ë¶¡)½§yÙésÀ×ÃmýpÁ—µóTðA¼þéa>eÇ ñòI®}W5qëg;ýJ}Ýû=ÒsoLÿ¶è¬[ÓÍ¢#Û%:ÎËØÞ1ÿ„Î鮯e~“¨vŽsÐ…Åï;g¨~u ýú¼®Ÿÿlþ5ªùåýP­ÛŽâç”÷Þu=AQô¸Á‡”gkFu‹õ:˜òhIMâY2ηÓáHù‰É½æ=ä»ù3üz&«ËJ|îÞáÆ»k™zKZ†>ú:&Jõø.tôëC­Øø—ÌJµzëïŸo>ÌùxŽ<œŒó9îØG³c<Þ¯uÜ’ìà…°^ô%Æ£CZ*øÁ#¢îŠê y|ƒýêYè¯Ï{Z&ûîáB†­–°ŸÙÊêjŸÆ)„ë#^)îð†žj^üóxý¶y_p4"¼ «'àl¿þgá~y”Ol®ÇÉ ‹ÈcþV¯¼>N¿Pí³Çú]áÌU~óãû†ºr5ºÞuÓÅÉ&µ`Ÿ_},ØËp#?UD—2ˆúGK¼$pÊcOî ~NõdÉçÍM©ÎÙWÔ÷1Màm±\Å¡ßwÄç¹nóêJ~îÉQG³Yð&éÝŒøeä} >5è3p„ôý#ÑYI|t°‡õ^9Eå÷Œ^/Mï»qûW’ùŸÁnáqßåÊïöÑsÂxà˜5Iôñþy<~VÔ\]qÌi†6׿%þCâøÑÚ ŸbàÁg§¦¿MüAL)pã»Omㆠ|èætp‰ÄoçëDø}«˜¸{ÆßÆÎÓÞstéèÌ´¶è…L~WðÛÈB‡xë?ŸgP&x˜X~‡^O€é ©#~ÿúyÛ¤KÑŽ–b>Ã01oâ¢h¾šùá/1Éo{é e¼uÓWß÷Ö|E?õ=‹‹ëÌ÷?žëúÚíÊsüMÿûãæ[PÍ€ï;è6^pØÑß*VóLXü¾þ¹Ï#þÜÐûÅß –FÎc/|J¼kW=¢–ÑøÔ¦ùý’N~sR“þŒóöLoÇW ÍÓßÒÒ½‘†¦ä_°uà¢A‚w³âÔ„î Q²|1jÆÃ%£ áq«¥ƒ—B'6œ¦÷³¤ÙâÝlÏOÚ ÝR:îáèu+ØKëtc½¿¶~y/Ì89߯“?P`Ø¿»…ïtİ~]þ#+¦|Öü\Í£^ô·X~rýïF¼fM懦£[a=ÌJ´ÞdðuI×*øqJy‡‹.dN¼:@eF»é„™LÆÿåÇ@] ¨®¡nQƒé]¹ê¿6 u5 ~牺Îã£ý¡.z}žà/Ñù"T3äÇî»^ø¹çˆ©?ì7/Çé>ãÄóê1eYï€[ŸÅz‘·»öÑÈûRŸ,ü…r!ƒ2%x3úþÈí|ϧ1ê:nþd°ß¢“9éôJåc€[ÝÕ¨šcˆ¯?a~kuzïꯨ•XŸ%¯/ÜÏ [a=ŸéŸ¹ébÄäO{i}îíG6è$~ùùHôM'¯“1¾£¿<¦Gyåi6Uë’ÅùèÍxö}[ªüšÎnz}’‡‡>êó‡6Y[ñÞÉ<3¶ýQÅ] ÊÓëvÆÌ3ãÉŸüÉ ‡RHïCÓ˜xâµb×—£ŸK›ÞÝûÙᣧž¿ê»Îp1©qT¨¸›Þ§ÎJ}6<Þ1ƒn´c#Ø›.£ýt¯½Ç™Çþ¿nqu&x~Ëy?âibS}¯x5HO ý»:˯tlyJ_“ücëùóä½wrÓ‰KÛ°}Pt|0Æ0¤Œ/ >4'&nÍfX¹Ö'Ý rêîÁ1–ç¨iðg_g<ôÙ»c+¿Pùå3øí=ëßïÅ‹ÿÐYèp?jUpÜ÷Ó j–ï»—Nå¯EëïV­w.fÒwÞÿ“dûW–áüÿÒó¶wQÿÝÊ€c3ô­À¢uz\NM†¯ùJ-;`:ϸ¬^úÔúÓ|©X›. ]²è÷Å–÷·ûŒø,¤w¾Â0éÏs¼^W3c»àY·ñúR}6ß ÿBõ`W\õxÃT‡E÷Eê•¿·äw­ç—Ãò”ƒŽNöI“­ã,õË †qpqôõÆYcñƒ­zÊ×]='½é˜ùWWÃÂûÄuØ9Ey/ƒOýòŒè“îyPÞfÜo³Â£A§×b­«(ÒëfáÞn¢†¥]ÕõlüÁ?Èeë_™¡n™¯¯gè°â ù\#/gÀqÑáçM øl .ÔuÝà8Ûð¸ý/óµA'7cû~ú|gø}±Xo1ûÙh?¹­~]F§¹~}øÖoȦ/ØßçnF<½F4aõd>LÞ?´ðËŸpؾ¦<ŸXrKt=Œtš¥N $^þv÷ÄGåZêT&ÐÚê{cÒûvðw¬ïšøÅ¥Xw…¨C7³ÔeYþ8ü¼›çušé§Óå]½ÎÓ¾ªÎÛ+–ˆëJרù8êw¤üüƱ·òèöwc…~"Ö}¤úMä¿ ¯úüñ~]6݈´ mSÖ¼¿±èד®Ë¤;oÒ%Í8ˆ:'†[xNl= >¢~Ãtб<ß/N¬¯s˜òÅ|ç}£’öC)õ×亪–¸4öñjVþgžÝJâ;G¦£Ëã««ŽžS_ ödG8®I¬+6ܯfå⮓šcê/”±éËKÞoÆq(ÿ:†x ºÞOKç×f²ÎdËóeìGxl­J}ÂÔWwü#—cˆƒQd¨S’®«ì;šà”ÕãÍñ3ï|ë„T¶aˆ^/;öxr¾ùöò .~ƒ ‚Ç{þHw9¿½R·7`üça‚G/û´†yKKìpÿnÑx>´vÔ…0ð‰Ñ4Yœ‡‹Tü5¯ó‡Û•zænêæ‡0èY»Öðµ…G¸ê¥h¾ê¨QÑõÆgÅ`òKw;üˆ*Kl8KÏsG‘ªïãÊwHí¼ªò” ÔuõÅ ÄûÅpã~¢+îËù|™Þ &Mu 5ÛÔxýÛU~úŠú"Îî¥æ‹¹®¾}¡>O²Qªp+åXŸ2|y¸àoæèýdüìæŸpí8õx#Tþ=¾>EÄÿsT]}´d¸=Â_°ûôÈŒ?Õ~ðXÙXœÿbµ_6wRçIªçãú)"î-Sûrâ2¦ÿqÛm¢Þ'ýÅ]­Ä|õÌ‘gO|¿ãQo¸{®—xžx¨ü„Þ®Y,®çÉ|ÇÃO‹qþÝsZ¼Ã:î³Zð‡6-yñÇ.®Û“+ÅïÿÆ÷qÚ(ÎãÎN"nÝOùtÒ?À·ŠçhîÁÛ“:,÷ß$ðŸZÖó&Ñ~úBý÷ùãôü§Öäç bÛÿ°‚;Çm›Äß]w‰ëyO-ñ;.Íc»ú>ñœÊ¿Rç©sö(<>;…¿så×Äu;s‡ê?ÜÓP\Ÿ]ãEþë‚»Ô<À3O•‹óûèÄ¿ù¼†ë:ªÏÑ×]ë„_þØ»âþO{QÏ·øÖcâ|Eûý(0ð5jêxŒŸ‚ÿPß¿û¦~?íŽTân<ú˹'øbË–'JkÁâïyê¡!>É1Ôi^F¾§áQT+º®Sþ¨:ÿ‘.λ«Bòœáyìº^Ì+­hž,$<Æ—n‰~ÿ/~,W1·šŠc ýO¿8ñïè'øé<Ž3£û’ygÉ`õß}x"îÁiϦuˆk >6èÙô =½,ÕÃpy»JÕu5Ž‹>ÏÒû²£gdþ3Ì÷wÑÏÁa‘wÊèwòYÅ}”óµñ³Bñï8ëa¡#hÐñ²™é9FÏh¼çÙ`ÎÌ ÍOºêäI}dS?Ñlã(Ó2t÷ì^­;‡Qc¢ýÁÚéèöÇ_³BÌ˦¼á€‡üppg¨ú'¾<>çã\û¸ÈçR^uXÞ7æCâå˜øÁ’/È-- ôŽ©{5™ÄYᎧ³? åן'^û¦2whЛÃ7Þ/n¨úïRáŠë‡3ý Vï“õfÌs«£G‰?ðŽÁ/%=®à G}G ^Û¤»pª.~<+ï}¶ +ÿSÜÏŸF¯·û]¹Æ G(yȘ>ÔgàÓ¢-ó/Igc;8éf¢†ê¿Jž *G瞛ijG(/Ïò“r¾ ··è1y¿5Í3ïèýrt0äÁûÆ71è|¬«Ny¢Êáobéªq›·8“oJ‡—gÐáÉØÎÀ_s>ÎÅX/JÒÍÿp 1~ò“Cæ*ëW˜:A+£ëÑÁ»”¯ë0CK‹oƒÕõ] ø–Féâ*QB¼È£óèä†güJçã_qˆÏ ºð»†<¹ôcúZÎàOÌqªÎçY”lþÂ`½“©?·p}’ºN«G¹éiµ#ý#ä cuº˜@úÀCôu$4Ë.¾>8ÎÖKÒ=7⛚²zNž:ÿŸ9úÄ Æ ÏGü¤Vñâ;®ÓƒíãõõŠz~‡a<.Ý_Þ8ãø—÷t»>ŒO.qE®y|¹vºzD3“­3qͦ÷g2É“Jz|ôMIÇz]` …vþ—¸qÉËØ¯[·,úß&sÅÃÇ5¹Îe÷Wnñê°ù¦y¼óˆ‹¯Á7ý:ãqÿà·~ñ>qß{ꪛ -Å}GkÂoÔgúó–|Ãú9#;ú†áñ{ê=Ë>j-ȯ’¸”a´¾Òïé øÐÁ?y 5Ýâ>´ˆ‡ÏŦ]zþ”'O2Û†ÓîÒ^/‰µíïÛ(ãøµU¿ÂW_)Üå•pãaÁ;òì«îOýLP$t/ÑŒén¶ÕÇ è{^öìóÑ*;8l_–p?Oyëx__ÊùTâü\õõ€Ú•Ã'bzXX_,üÞ\qdÞ6îø\?9ãû„º'Öã‹þÅ•£×g3Üñcg«í·_ðõ+hJø§[ÎRñ¼\Ϻ)Å·ýotÿ†ÿüæwG*¸Z6/à’_‹8jS?>T>Ógzƒ¨lžA²7«¯æzê®ä’_Ëú5¡SKm|vÙ© Õɵ¾JÃÚƒ±Î ÃvúÝÿj¤›Ü‰ú9>ý…êgoüBÍ×>C¿LýR"ýèSÅ‚¿ºù£\WsÚ ¾£>Q¨;R4RŸG+Õ÷-àýƒ] · 9%úcÆ5Œ;9ßó*«²*«²*«²*«²*û¿aÁ/Yܽ7:.Àâè<' ©>݉ôжöñû0§ß)xÁq†š*pÓ;úºÿ^·ºnþÀ3¿M:°»Ýò2¿hªs¹š©OòÒíËâ|>Õâá·CœÅœ'T½2ÒWÄ}w¹Õ#D_Oœ&òRSãéÇ5›î¾½F<ÏýJýú(È>¢M£ë¡øÉ¯gœÈ»²:‚äµ÷ð¬þ¸][ ¬P£¯¡^åê.r¼:2= G½÷´ ]Òá!à\z¯»³ÏÏ[­æGwïCµìàPyß´ ¼“A'"cÿ˜ø_Ã@Uÿ0Ô¸ÿ£JÑ!Âè7½ê\RŸ1ø”ð÷E4_åÅÃ?†ã²z&í—G®ÃÞ¯U§ÄÔŸùd1´¦üéºÑ^ë>÷WlõK”Ÿ±ë‹YàV§Æ×½§Þ'ûtÚ¶ Ž8âðöS¿ÂêT_ÝÍŽ7÷]}ÝŸëU-ŽmpÀ€ÿÞ& l¼NÈù$øÊ#g£ &®Å5j]£•{ÏêýäëÑ׿¸AÁuÞù¿ÂŸ~vð þñaoñÇÆï_¼¶ýBÝ·¥ª>¯ä[/Õ3ÑŽÕ·×ãr)ޏëQö‡Xë•×××mý-­çñ`þ‰‰‹÷ÉAGC?„³…~~È‹šsA<ÞꞸgìg(¸4ÞÇÕÈŸ¸ä'¾ò :¹ûØ{™Gx±.#i½b¸áWüðuq뺦yÙ†SÁ”—΀ŸC ª~#wƒ2O½õR†Ó¬ÆÖ›®gŽãqŠ+‡/Çùÿßÿ÷ù'f4<ýuÏžÏøóíÊ Äì¹në¤ï€¹_s;βíz]~Æ—µÅ•¦ýQ ž7[~$CßÜUl‰“KŽeË1Á§¹}R¢º?êTnŸ8ts|ŽjŽô‘½_óŸ¨x¿ÖÄø”ø%éÄE¼/\âñ®m=ñ¶žx©ð¸_°ãöfþXQ2ýVÔ‰ÆM¢ùcÔ|§/üò¨=ÿcþ”X8R›Ç£ù È#?¾·þú¡–E¿‘ù[qLõ;y|YË ÝìäèÓq²jÄÇû_Ü]Íë8|ŸÍù„˜û«Èã™tÂïIߥėÜñV,?»~¬æε^×ä|l<¿‹¿©×šõƒÈu4ØcÁÝîÉòïJد5mÃW O¢8>üþ4AìH,y‡(p[oQñ®Õ#~?IÍ•g! 9”¿›×G^ùìxùAWÝ9lo¬}.ÃügJ}U} £ô:Þ¨Ãüõ&žº·4ñzžƒ}ÄGÊ#?ÿÑÇOL°¶&Ò¿àz¥ÆóéèÈ[šûK¡tËâ¾ü½bçy|÷“zÂÞÇû[Ïeº|»“énaô嫳Vó$ë¿«Ÿ×Cþ|ÊÃŽí£â 9ÎÛO ]´¸|®_7ƒOÒéÿ¥LTgÂ5oT êdé3‚ê1u,&ÿJÍ£L»RõãóH§$ŸéËx“˜rEtÝ¢®ÛyÙüÿŒí y%”ozQÔ—ÌU,ܺžÿ“qüØ~7Ü)x,¤Ï„;æˆ:–kþ«Z:þ9fÖMÅO [ôæçޫ擸EÑoq>ß­õ¼òض>£Á>Æ{5ô+Âãgù郙tݯ÷/Mõ÷Içf¿_?gS_êŒý÷Ip²>˜S/nÌS'[_QçŸ`[4îiÅÙêü•ï§·ŒFL¿Ø’ÏJÛ$ÿ*ØÃê·Õ:×]±îéo=¨Oü;Ö_ÜYcqƒtôMÚ1>ièü+êtÚúêëÁs¬‰¥?V8^IvøÊ¸ÿñhÝÉ÷Øö—<¢Ï§6H–Çs5Yäy]SþÕ×P/ú:Å÷®ë‹ÄGàÆïª|hWþdm·yEö%²m—q~YæÁcUM5¾œ'õ (^)x-ÞÇ»ÆíõóQOÌ£é¶Îùê߸ZðÅlêÏÃæ¯ÎŽqdO¡ÿ†IÓU\Ž “#®êXLü÷1ŽøHºõ}Tg}o¨¯'Êô~UÚ†f~õFÞgÙy?ƒ®×Iu54"¡Åe*.á [^4®~Æ8_Äßøý‰' ›ªëÉŽo«ëôKžuÑjYÖeü¨ŠO>ïl/—°¾nyéöI5žg¹ñú(Ëú4 |÷t3,ªO÷(/åú ÓsæqœŒÏ0FßÏCú™ÁC߈„yR?ºnÏûöñ¾É€˜g]qsÁÒ}þÐq}kBëtg½Þ>F—Óv„o¹ø·zTÔ=Uë&˜÷ª›?èè¸ZÇ‹¯MýrŒÛ[xyçuoCá÷v#¯äkuŽ©+¶þ®ÊÑ»¾aP4ž¯‹W¹Ž‹ñX'+žÜƯßîå/ª:_í)°J࣠:‰hHóDaô{’gÉeq*ãiâþߺ½wþåGê{Û#òú¸êËfÛ0¯(Ö<ŠiÛÅsÀêªHzSƒ¾ã‡«Q’U]욬<_‡nS\æS]ãbãy6H·o0:S\TBuúÏSÒ¿Í¥x‡†IG޶à(­ou,}C‡u—Ç+¦>²=˜¾üÃϹé4w(Wˆ:¼)횇æfê×RQ&ëéèHõ-î½ÒßdHö ”y]4¤udŒ·m3É[Æ3çßà…çõ:›ÿZD¯S(`|ývÉÞGT·Ô—¾§÷Ÿ'\-®ÛiÏEãÿäWã²®‰òØÖLåß­(;9êÄݳÜOãp²ú zèõgqÓÚ¬ê:cýÊT×+n6œnë™U<¦ÉÂxàúÿIÆóµÔaÿ¯^ "¾ùeÑÿ}ˆ^1Ü~èßÜðsß_ ú)?º±üÄßGž8½o^zâx²FØ'ª®ÿZè‰ßì Ÿge7Ùß¾©çï}Fz³ÊN Ý]ÜyƒÞ¯ÙùˆÀæÇã Ÿoµ­«Èß(Ë«T¼˜ÄÃðÏq†¨áªþ‚ÇÉt­C]γ¦u8ü÷0Q·çuã´prȧ|÷=Kµy 9¯YÇi`é÷·GŸßÇí„ßVBÏýÃSÖ= Oç¹ÇÂ5ïÅt†PÊòÏ­XÞ’ú¤¡£ÐQÀùEÏOELaE;=ަ0aß/™'1ñ¡[PþpóH·þS ïÜ!âÛëãf߸7ìã%ëTל§âv-}3L†jÞ¢ý[çóe:·mz_x?tþ#òÿ†õ ¢-nßy 8nÀµ²>G¾<ò&éæ?dW]œ•~G2¯ˆA1ñ 1û!ÙöCíèü8æþÆižŽÐ|·­•˜¯ë²uêè+ò}¡þȼ³Ô÷…ü)×>-çÁq^¢‘пæÕǼì=~Ô@±Îb8Õ™öÓºxW/u¢>"2_+qIõ,2Îë+'%v?ö·yƒó°ö—â>uÐë7es<Ý¡%~:JÔ·¬Rý>KIé'¡ ÃL×ÇÓ®¸sôùÃà¨#?ªo<<ƒä/‡ç÷Ž#¾'&~"Ü?&^"-“ó†|x½XæÑâöñ Ç)oå‡ÿìÝÏ>ÜnH›Èq3pí-Ýô0mü)[_–ðx(?ŸP‡Ó8þ9ñê 7ä‹uà£dúháxÅL¯k]?݃E½ÏZ®c«}3®=M5ð q&ýr{´ǰâìôA1ô“¿¿ªrëi×á±™MÿóPO?ï`€_}yúyZÖ1¬çý]½_cÂ]cù?„cÉ“˜ôš¸éìົý®ÿžù²úúâ-G\-ÚT,Ö†[·kaÉs·cÿÿ˜Ï‹é Ç4°rô”M†¦Ñ~|ˆGÏg:pã)ÿF|]É'Æx·ãG <×9n<¶pû. ¶á™J­_¡$žþʨÏSm¹\Ô ¯Yà†ÿígÊ|šïùIÝŒãõÝT!<›aÔ'z<Óúüh}©{aª«÷}ÔëzGnq`¼õµ.¬Äß]/øS¨ÅðW²^¶jt¬ù×4¢)ÍcÄz‡ô:%íØ|qú·¼s-ÕàýÕÃíݧ¯ °ûˆŽGÎظMÌ_ÍÙ~«úh×s®‡)õDqïwÅßMT^ÀÀG)Íu»,þjm?^mì>ß­Ø8&?çËoŠ|“Oš±ý’µz= aª?Ùz¼„uü¡*.ynïnZ}.çïq›WûNˆ\'1yŸŸÚˆá<;Òz:ÊÍÏÀÕå"~¢| JX]eñÝb<êKmÃ_cÔ…©â-ÐÉÒ XÅw˜ê|<®·™Iç†×MÆýëö½8,Øî:”ÖB¾ôÄ«£ãϺ¬žöKýïå8L´róÛmz~Û—øã¯©ë/&ÐbuCÞ M.lý³bþ¶èúšÑoJ¨ó'u¢ƒ£T×[@»®/ÓÉEûýO­þ݉¼;ñ@Ð_?/šði˜r³xk§S7ç|JäN¡„ô“»ê®ýÜt·Mxp߸9<îŽß¹ñ׸ÎCAºü“a°ÛüöO-³äE_Ö¿'ÁÏö!š¼¾Bòä’‡{ÖHêþK~4r©¾2HÅ qõYý(ßQÇ žþ} ŽÑ}´ô‘}Œß›úJ7£ßWÊüÚE/FÇŸ¬^¹uÜüqKEÛðÜ÷“ø›æž¸ÚÎê<Š"©·µô!Øü;w5¶ä—1=‚öÙÑgB]ÂÕ ¼Lý=MuY^ÒÖgÅæ¯™ÖÃŒóÎeÿž»Hà8òõûs]z4¦8µƒ\/Ò<&à0áO>qô‹ }†äº#ÊéšuÚ ¯Ñ÷ãuês6ª±vœŒóÉ¡ù`Ð}>ה÷D|ÜžâÜŽâ¹ úñ„­}¼X]ÖÕP@ý&‚è:»)_êóŽ˜)ü‹>÷†úôÞÔ ß/âKÜv§:OoÈÓÏÔ? ƒDü¼J|¥Cl»äÇ3ÿ;8$ð$ÒA™È³¡ãÿÔazg¾(ÚzŒDzå9Á÷ =aÙ.ãºyêò8Köi±î÷ºa}ÛËð^-Üòê²îÍužãâÖÏ<ë/é/ÅS¨mÑ c8ýàmñû3ô9ªùÙÿ<7®îã†W2éëõ×ãÕÂï[[ò‰oÔŒáF9Öñ$¾¨@ü^~Eÿè|Q7öÅQ¡†e¾3àlpÃb1ïLø±Î>¦Ç€R‘åy(iRƒî…t?,ý@ùs‹2áwH\D˜—æº] ‡¾4Î^'­#ï³£?cÐÓA7YçŠ~‚#lþ-õ[lâO`ÐÀÀrñïV´~-ü¹êr½ƒ®†1õMþQÆv- ~ÓåD=?EöÉD¯èó@)å_cê¦`Îñ¾—þŠéá£áisÞnÚt½ŸSç5Œç&´JUo ]Ýð]ûu¶Ä¥õþF^,ôÖh¾F'Ê}­_­Èü7ÜôÜåóŒNñxda<Ö‰xû­­÷럞Áìoû‡çS­çuõhßCèÇ)‹ÆËòø %Ä—ï£÷ÐÒQ¯}n»Èç,-5×þ#hS1y=_ÃH½N 7¯¤~üþÉð@hcX«ùÝ_É—Ci“hÿÏѯð5ô0ðò¹x뉫qœBøù^¦#µæÏš”O!]Ùê{¾†UW \(ëêkÁáxõW]Õ“Ílq”«q]…pü_,Ô®›ø¯›æº¼o2ï÷¼0™ò†<6–¹ÍgÜlýŒ²eØöŽßº\]wF±ºÞúÖËOC-üŸkàô”_rË;¡†_}Èç W:8XS?,kÞ}ßqÐ5Þ{+óȸLÇ3¯¦¥ëÛlëûš¶¡÷k©Ü¿p¼ú”ß=pœ E]Ä÷á,–¤uËjFçWúČߚU®ÿ›Á§á†ãD_–‡ê´FäíßMØ— €á³Ï–ê<ÉÓãå1 )?vnvúu¡¥_óè÷ņCäu»R]¿ÄWOyNíß{\œ‡ Ÿ›-Caºï©ñ8¬®Ñ#Þûˆû~%ê-7©ùjÔ5ô}ø³¾pä/ž¶-Ý<×p‘MSã 40à>M¦àŠ—C7Þï{ák¨×ýÄs¯eÃÏð#ÑÒ‚‹ý”⪇ÞùÒçèóVt¿ÑÉ1aè+…BÆ7+÷1ø‚á ¨¾Íú.Žœò"\ß”ÇÝX~8×x‰htäꙌóU°õ'eÑ|%©ÀuȬ㖤³N¢—àé£=«ý•Ê$ü”I§?8(ž©˜qðåq| *6/oÍãÝy“Êÿ#ç;fŒ{Ào]ç8Wly[¼ŸÍU¿=ø}Júâen×5¢ý׺WŽŽ ŽsÿžÊu”}†1ñd::%Žë×·C<ÂK¹é lì*Ö© Õú¹¬‡aý›õõ qÕ¹<Øýuô~™ì‹g‰—Гp1 ûÎaÔK*žê47¼G¨[–ŸÝzÎ÷Ä‹ðŒ5 Û_ù†:ÿïg~äy¬¥Ûyð<þ@ø5ņ¸§=á ©—ô?ÜŽöÿwïzC§tû0¡uZ#™Æg~]G=ÜÔ?3‚¬öÅIÚoQš0<¼¡/UE¶þRͺöc=ó!á'ôÖûñÛOÞ%æ×;ïuã›”°ç¢¶a~hËôöúûxjã9òîû·c¼·‰–¾CÇY|r¨‚ó%ÓG»ñKßÔ¯kè[.þÎ,Pû'uôÓ×ò5LùF4Ž`r-·ËæõŽ£qR·÷Óú…hŸ°TDøÀ6žüû†\¿AïÅûüÖuò ly=´õÓû°žWp¿š_ºît‘7kéÈ_;“Õ£®ê.pi¦çÚ¢€éÑù%J¾†íü2ö7ð„P=Ç%Î:Ùõ–øpïóäó×g¬.\¶8:¿GøÀÏ“áРbuÙâšÔó@G~—%NŽŸœõœÍÏ—:UÎã ùU¬õ}UžpÆóiá5™,ØG|žszDçILüŵéù©9”×ì2CÏc2èÙ¢§XoMzF¦zò)¿{×'©Ä ¿fÓ_v5S¿½Äã¾á—oâýVƒÃ,ŸlðSãšIwÎÉJÿGS}ÉdhfÑXvG"\–OÖ¯ƒôý´ðoÌO’_EMz¯·ŽPyq¬l¤ï_°Ÿ·)Î ÛYàcQ‹ô™-¼T#>øÛáõ!É+’ŸûöEޏ^|žã|‹¸}"ÂýW®Þ879Ïqý<çý ,yÂÛ.Tu®^¡©!þ0YpŒ½Wo³º˜£ÎŽÍ0äÞoiç6¿aûÞ˜}:,ã.^Gùë”~çЧ³Ú7Xšo¿xn˜êˆ›?(Ñ<޳¾Ÿ›¾iýLyÚ–íó+'Œ:†~ŽõFÜ{“Ø>fÞ6øÐ°ôãÀÚíúyÝ¢÷‰~ñâ&›ñ>#˜ØB?_Ô"þĤÕu‹tiŸý37Œ£ñâüม~³r¨ÊßíkÐá›t…Š3¶Ä5qõ2Æ•{JòøþÝMêq~gpÔQÈ CTYfÃc ápæ·ðz}yûÆql}|G¬Qóý%'®ÿ65™>#ú³úÓá”úÒÔuä‹tÏžmÒÁá˜ÌÖïÍbê–¶¬¬«¡ivñÉ(Õ¯_ÆíïÿY²ç¿¯ˆ;‘¯¬~Íȯ¦ŠWǺ]à†6õ>¢$»Ï\Cmæwm¼\­7ŽÖ8U ý³ã·bØýZÿ1ø„á òÒ­_ZÏ‹Õ!‚*çùÿíƒCéæ»¹qéë"á÷k¢uæp[«tð$N9ãx².„߉¼ÑŸÓ‰/2ŽÓHï¿¢=év-ÿ‰š—4è‹£ËSYx¼ º¸õ±Èg þý6Õ¿\͵§ñ¼ºèqÄ&}~4HG/GâƒC„0àß}--ý)i¶÷:cû'¿4R«û{õ);ì†kÀÒ«Üú­¬ú†ŸÞIO½Þf»éºÖ'Q˯>"ëTÈgŸ;öͶ¡}vúŽV–¥õ>K“yþ|àLÒêÄü™NýAƒnªñø —bÕå/ù\ÅÕ£ÀøÝúÏ‹*Ö‹k¾<‰JÚ¿9÷i¨Cø¤¬ÿÏ›ÔHVŦÑ} 8zÔ³à fýIœÿib~żæn}LÞ¡:ö1·ç ýdúÌÍé­ï0\ÏÓø¸ðß«·¹_~È‘?[Ñ&ë¡¶í°Fð:‚wÓ™O¥þ1ÏÛºâêx_CãvuÅ{&û͇Çy3úy6áI0ó’hžKõ¼x_[_o×¾Gw쉩ËôôÐŽ­[‹Îþ+Ýo_|R¶Mêß¿Ÿ·+Ös*ã ô6à›âDË:œ-ãý&mÆßwÔõ¥)é¿\²Ö-~n¼y +ûkçq€Õ:¥«›ö_9Iæã¸ýé\ Ó·¨<ß·+˜}̾MEZ°?¡np©Ÿß˜±ÿÒ÷]\ æg1pšv”º€¸ä±x:_Þ•ú7oÌfè¨×mOÛ0g³^ÔÐ/Í{ü SÕ¼Þ¿$¥<jUì<€&žq®¥O Ç£`õia9/{ùKR‡Åu{[_$ëñ u{ÜÀ·«(“ýÁøç¦< O.^‹É0øŠ×UÎk8ÝQº_‡÷A̯¦EOÍS¼/z\C~ô{€z (ו+Ô~(£¿ÓF©|²y¿Pë)m¨ÏßqKZâU¡(Y½ »6¥šWCñfPþ΢K˜TÉûürÆÏ·öÓ¯‡#»eU÷‚›o\-CŸÒèúâüñj©È÷¡„òº¸¿ð”À»,Lº]CÅúÈóÅYž»¥\²ÛoÈdržç::èNýÑιÛi} >о¯²^e Ú‹ZßáEæ/ïöÃpþf\3áð²e¸â»Y­3IÞz¶Æ7·Qô|†––> µ,ýÈûå¸Õ•û¹ñ=]-ø±¡ŽØ“á:jòw³£õ¶Ò64óÌø×(×ï'Ü¿)­“Ó&žúBØò€šo^zŸð7¾ðÌkǬכú¢ñögèŸ[ìd}bú–D>ßXøSáDZ~•üù ÞJ‡šyÕë]=¿ÇÕÿt>Ÿ ½‡¦¾ˆǹà·~Õ³‹ªø©1¬¢òøxà/ªŸ•ë¸_©ªßæ˜!çebú8¯ü›ì㎷ =¦c‡›Eëjìú¡¾î³>ì‰ÎW†¸œ–¤W2@ßçÙf(ÖëÜâÊóD?j¬ÑŠú©O c ý¥Ûºå[Ñ—ÆÙ´¬Bp²Èóˇ²‹ß >sŒÓV-K¥ž"ýëvŽº€¼ïˆ)ÿâÍ pì׃n¢ÑÇ3Z÷›­öW«hPÚôô»H_KDc £þ(ÓÝÆÍ«ýæÕ&Žº¨ Hÿë=ËvÀQ£™ZÛ³.\û¼kÑmµÔŒû=­gnW˜Tö¿Áˆ>~ó¨­ž2SèýbÉ—*4ÿ^eÿfů˵Él8È`/Õ[ó+¯w²™äÕóÏѯ~ KvfXó+¾ò£È¾¼¸b@,<+Æ>&úœ®»:Šû}¦ÐAEÒWìgÐ)ÝøÝh¾îÃcáLº õq…ú1UmÁÖ·ä‘[N$`]ûš¹úR¼^~"`ý ç?¡S<]&çãwŒ^ïeýSö;ÉÖy¸ª3 ^×8ΘÉúÎ^ë’Õ+L:°(vä[´7Ì_³ÎÒ÷ËxÉ/€‘éq·×>¥®›(H–g`õYÌÒó[çYS}_“Æ…´Sàa[dGo6ïÕdþ}¨‘e^;ú·I5ÿ‚í3´ÏKp$Ÿ–‹¼ÔªKõºâšxb>Û €gøêæÇµú”û¨NÞÇ­Ïo¶ s;$º¯ »ÏO‹¢ŠíÃwþ5Nׇ÷ qï»V0þ‹È3 %­ëM£¯J^Ôëø¾í6Ï`M ñ¼_üqÜ3h½nD¼¡\1/"_ŸwC; îÝ¢[c<¯Ö,o=¶ éþ¸=ÁçÌÿšó¿8óÁÓžóª“/aú™{IÇÑ0?£ƒOb³àÍtx7ÁgŒ‡a‰COVC·tâÿàX̾P5yßÛ%âÇnÿžõðÖŒÏ Ÿ ‰§ÏW¢þžàš/—üêŒývÝ£æZD_!ŸüáVŽ×sŒXׂ½ oÚ<¡îk±Ð=”çcÞŽòBýŸÌn|Õ¬bø¦PvRãzoÈ“Ïjp=pÒ?®Éž³o¿ù¬2ánš±õd‘ªÇƒíÕõý†qñúŸæzö™Î±ô15?ÿSÇ3-ã÷›Ô•ÀL}žAö3}ü,ó¹±(þuáxÏŽ™k:“òí‹Dc+Ä««#ÝMCßÂp»”úÈøšI÷‚Zêó#®8o4ˆ/sžiƸµâÕ“ö•ûÂ}õg' ”ÿ–ø“lþœr“À}›úsÝõ¶à3~xp(;ñYowûïø»E|uEW=þdšÞïÂWÏ=á˜cWs=nò±Öjž‰â"L™"êÃD¼ÿ¨¡Ô%0²U2={ƒ~p¨ïpå®ü›øw-ÂÞþ á§,|‚t¦ÓÅiãáNƒ~OJùm4d}o_t|¯[ûá9qé•nyÒ/¿$®_]òS×þ,«ú‹áqǺõ‡©¬þ#&C[·u5 ý:<§Ï¯œ¤¾ï]k¥¿ç–GE¹È·˜â p;CýÛ·_s8^ž!î’ý¯ûøõ‘â}ÑÃÏwëWoѤ›†11õIÿÜVOÂük*µÞÔ°òj•§5¿Ós#õœ¬ã×säÔR×y̺€6þAÆ89Ùå}VY´¡Iåâ?Læ«Oè=~Íd~§ /è«[fÕÁú„úÅŸA¼i‡Dÿ‹n©ç!Çq=/ã¸÷ׯ7 7Êu™Ðí“ò9ã†q?®”åFªucÜ»•xò_×÷£¶ÄsÙ6×:7Ù }®ÎN_²éõëþ`µî!ùí²/né&ò=9Ýž>z¡ðûöÉæÜöW}|X*üMô¡xkjž¾ŸZ¡[Äõö$_…gäÐ_O½þ´ 5 ø’¶†íÇÅ:ŽÇ¶a†Ê+’y-T'Ǽhðz2wF?(–ÏEÙij§zC=O (Þ¯m‰Kò-ïUÿ‡„Ž¡AŸˆë˜a„>¯Áý Þ]^oÓyØ sÄ:#õ±0ë'¢¾æX‹}ÜU³«_2,ZŸÍ³óû¸Ž¬uûÜ,ë¸ä1Š:´N°÷×&Ã7b°Oød79¿Hà:<2/M"ƒò'O ýÊ´páxGôó"r-ulÙ—±ë’D<ž\ù;“¡ZvúØfËð̳©ðÜP7Þ~§º^†É\u¼ÐÄ £]-:AEúQãÝ2áÿ{NŽün¿K¬èý7›I~¨u;ÃøÜŸ ŽŸzéÒ‚OY¾3?jëìúZÖWâåy02//òDµx|©êúó ~¨ÆáÁ{=€íÍ´ó4Î|iœ»%«~}\“8ÝðߟVæ;ô9Ç­~—%Blý›xHåòsd¼‰¦ú<Zªyé·£ƒ_ÜâÊ;6Š£q˜­g‘¶qœtÖ7âo/ý÷Á>Æ£qÌJ¼°?;}Äqzw?:âÑMñ@8ÞèIÚß|Âú‹-£ße¨·ž,†Ññ –þ62ì1|ž°obÆx~VðBZ#V®ot:²oýBílÀÙ`Ôvu½µàðâößAZ×>tóçyßæðsê'·O!&ŽKåý2áÐw°>>RÅ]R_¨‹žúŸÔïu ýÑ›yêû ŠÆóÆ5´gü•û´ œõ–ï Äb7?"xÇ¢SCxôu;×ç/<ïÖÌ/eýë¸N$–]•Šÿ‰fz?Õ£ýœ·Î o††¾X}·ü Zâ;Ù'i–¾^¶MÖËÐoLªù¿l›sªVßk^B>áΌLJCy¡ž§þ)árë9ú{–þ¹áñêWLž'8\9ºGXÐ\;ÏØúêfŒÃû¶NPëZè¬×AË–ÏÄ»oXz¿^‡î»û_Ôú–~#Æó{#Ýü¿ì»…Žz\(ºª}6¸î¬‰GÏõÑpy û£ßûµTêÿò9ÅÖ ÄSIˆYøÕ¬®3xä÷åÿï¿}õÚТrú¦Å5ëùêhzjÕ•’š3?¿¶%ሳ7îŸçÆâ}]b¯}´?Ûˆ8â¾6úºQ?¦ÓV=!ïéñIM"õ Rêû¾*Oço~ló“«>ˆNªfŠ[MÆû3Kä)PšN_d”ˆçÀ† ˆÛG)ãxy´î­úŸ ñÑeˆ‡o{O­?ÆÔ‘È¿¿^xFïÿä:ò±zðƒý$p…~÷#̯^¸¼Á>ƳÔݱfˆ¸žÃ,<ÿBõ{ßþÈÙ6Ù¿uIÇÉÀßñ÷c¦aС–üû¤Ç«h3éK{ãé·Ÿ2 ÚŽ8áYÂ_ÇÜ‘*¾kÛ:7ÞÚ@ò‹ûyê*õóã•¥eP¬ê¼:âP¦×}“y+ã~¬n3·z:ñˆ%jÊÿ§e¦¾ÃÁ nëtˆ lLóî¢_*ßãö…~z€ç=¯ÇÕoš >×M©ÖQÊuˆ‡g Çk«¾g®|Ïp{‰óË‹çocæeâý½È-ž”ùŸàë¯6ðþÈ8;8FuÏ>Oü8ß{ÖñP+&>¥³¨d«?.&«ýîPÏq^i“gÓÌs¾¯ê`âŠtóÜXúN"œ VÍÓ®<_„ºŽõ£VÉômê#,H†Ï­lC®ŸNOZ8Šà¹“#¿„â˜óîôz~ýô,ýÈÂí$_¨-ñOš§¤C_`éÏDóbð™ß{O7ÏÛñ>¬˜: .i£æ+ºÅÓƒpí/y²z«uw,ù¯¬Æ©œ÷ë½L^6ŠæªxË5V~ñ(ǧ³£‡†>*/]õ8 Ì=¬ÖW¾´ÇÉï§‹³F÷±|J´ÿƒ|™‡°àº¿u×ÛnñÇ!úËú`[u´ªq^<éêÖcü¨ÂB!Õ‹-¼bãñJ*¦Ÿ’M?;¿O¢yôz.ûÉV–~›ÍpÑO£û=Š— >bõêΖóX@qñÎöbýüñy/ÿ>UóbI×¥®0Nk¨êÈ5òãMg['ÄxÜE_¨ëK'Ÿiìz‘¯`ý˜ƒ£”7è¦êW¢å7bê*¹ZZ}ˤáþÛ¢ýÓ?Å[‡Lù|ëtUo÷"¬Iޝ[ÁéÄ3Á±¤#èÍÖ7Ëyœmkœâ]ÌÂŒh ®&¿¥úÓ}£ýiù|‡ÛרŠ7 ~+ü™ÿäßcJmÑÏÝп;ÏSçáæ†:\µ~ŽV„Wn ¯Ëºê]à¾?«y¬iUÞþ– N)^`Z†KÖd…¯ƒþí¤ÈÓ¤m&>ªÔLûx¨]1yÔcqkÙ"óGRçž×e1ÀÀKÈè#lÐuü‹[5 Õ8Yæ¿z¼¦Î3WÎÔóRVÿDߨŠG6LCò§·å»åßö§§ãkMµý>ÐÛ/oŒë_qpâ­.Ü!âÊë·ˆß7¤»^7ùú?¨ùóó¨<ä¯ÎSúHb®LÂÆÛTý Žêz|AþçU‡Üú.?òSõߣŸ´4¬Oçüï)o¯2a8¯bqÚǯ^1º•ÁQƒ¿ó÷Šñgƒ?G¯;8땟u$Y¾ ƒ¢×›ŒóÛGüìÉ¥‘~g¸½cÝ+V¥2O :åïvnçÇø\¸ùl1ÿ®›¤×Q?_À¦;Õuîš:¢>/ûçYò£&½ <ÝW¯s]’®N{8îØËâõD ÜêÙòyñ=ÏÃùš¬“ïüFÒÉ3ég˜ð¾:†û-u÷3>gýéЊò?TŸæ}ö€ÿÑóE ¢ß+t¶ð*?Óë꣺£ô–ÝÑx&V?EŸ7UüÊ쇜ž‹PïpÒDu¼Iu³Š0é¬Ç¯ïÜDñ„éyʶIÝÏ´yIÖãNî¬×·¬¦¯'ãæ ‚çãX·ÇÕwŸøë… Xeñ —ÎëqñãçßÏ­E¸oWò~Ãè¯ÇƃA÷^Ú÷(ØŸÿ ÏÐCõýo“ö®(}9ù~¡¦Ûûâ‹WÊØ¿ËÛÇÔ3«hC^ÅòP¶J}?Úpú&ü¾…oê2íúƒX¥µ7~2SÞg¸Þ¯Dqôû‰®’Sàõ¼aº_VöÇÊø|ìáJ‰±þ×YñƒÐÁOO·¯Qëq]“É:éçqW]ÂljYð#ëzÕ©9NŤEýhÑßP=wsVâC7¡ãÿTPŸ[+WVÓºŽ±†õyÄ7âáF*¸ï–Ì{Ûú/zëÙ?}á…ÿÃÂ'ôþ{}_ϸfÂ=£Ãúr'5Ž¯ÂŽ™éð¦O¼çà]C¾=ߢóEù8“`theé+Gõlø‹X¿«¥„K,6äqÎQžS™ïÁ¼Í‘ó$|¢Ïv%6õ© ^¶è6·ÐÇ7RG.ü÷Ñy-Ì]ªâsÐ[è%’n!ëwÃÓ¦>`ÏÑÊ £JüÙß-<öL§¼¦¥ÞÜw“Š œ²Kè«8ò\ã"ô0Äi-è9ÍUg¨ :õTê"¦8Äy{é==Ûð|ž-f.Û'íkU”| ¯q´¤¼€¡œu¼—ôÏ+7œ®Ï¯p|FŠ,ú~ÙÒ9Ûì¦¿ŽøØà¨[~—êëÀ õó7 Rê¿.׉júº7¦|!æµÛÏQq†{+wO×chÃT®_ð¬e}=Mè” ±z¿xŸXt2ðñý ø’>ÑzUVeUVe§šaõ7²ÊÄØ2÷ü@g]>#ÕüΊîû™ÚqzQÁt¬ƒO©áJe¿Mçq¿u[y¬ó™¹S¯[ÍP¯–ý‘G}Kø½üp¬á8‡X|´è6õß×9÷~AÅö+>Ù õ)^” ÿ`ÊÊç3ã¸mÔ ýa²mX{Qºóbè:Œì”ÖñÒ6”éã·¤&ûå ¯K\ü…_~½Xßr^w©Ez“u 8iÚž÷[ Ï'fCëy“þ8“^ILº¸f㜬†\Ë{³o“õ¸£õþAâq;¦›§zÈ®8 ®§ˆñ†z‘#ÞÒùãéÅì|ÊxÔM™ŽD¿< Êꈺ(Ó™@sKÃs‡¹õ •u{ª'¡[t¾%xË2Ï4qÔu%Ý6”?ëÆ_npràZÒ2YÇ4ªÓ:ŸP'fŠøâN ³Ì“õë¥žË ®ÐdÁaz>ó<ãgÖý‹³êW¢«ã~®ŸO‚›OñÕG÷+õ;OpGÕRê4–të }hÑA<—¶÷Ë8¾Ì§tŽ—ïί±¥>]“ô},ýî}ͤ³~ŸRŸt~_y_«ðó†Ô϶W<Ü zÇ›oКÅÿ ™Býçùõ²òõê&¯{Ös bâM{ëçqœnÁw4èXuøõ©ùí},ßH}šÐ\ÿžËþÖó/*z¯®ãÛL/¯§gÿŸ}žý NSqòè-žcÈ—XúWÕ5à„òmÏå—»¹=7X}žr]¸ÎÄÉbèjÀMzæ]óC7’ñ'¸ïôQF«üx”Æã…û“Þ::0=ÞJÊ¿s]`›¡Eåè~Äí‡ÜtëáÖ¾§å“•y-8ï¼Ó⢡§[C¼?&׸bþMÃdz`Rw ET_ncø=>f¼€!oFûŸÍ©Ÿç!ýûŠf¼cÈ/þ8†ÿ°nõ#i­Ï™ü¢WÃõ ÔúpL=P'4?aŸã³YOKþ"8Ï1öMO©Ÿ‚M [†\ _¤ZÊuʦL÷g±'`¨·ÆÕ¡ˆkn¨ßv¢þPW¤£×ìÍŽƒ¯ž²ìóà[×E¡A祋«Úùõ‡0™ì-o¢Èguª˜x×Uç4õã6§8ê”ÁN)Û}¥Œù¦Ãeúó#}ôKÆ£ówyÛf¾:gq Ó‹X¼l©SÏØ¨ê÷c¼×.ªžl¶û‡‡Ç=÷3¯u3äTWŸ'“¿a¢þÉû_øá…b«dÒHKoõç7/ŽÁ‡ôõ‘ͳô¼ˆê~ó8†ÎPŸ³æ´Î 2à-x‹kékB×#øÄÏ?G3ÃsQ-;ó£ÄG¢>Ew‘o6és¥ehä‡Óäú8ô#zyê[M_ï×GÙ³#rÒÉcA3U÷¿_<½ûpÿqª. Ÿ7‚cÑyE^/Ìê^U—cäPUŸfë»nõ·"CÞ±«;êøH]zÛvÆóé@ø9¬Ð<Œ¯¹âòNV þAóR™Š_@çxë¦>“L¿ä𕱿?\´[ðmKÊÕÏ×oH5Ä^íç£ÒyP¯‚ãÖVÙÁr%šø­k¦~œá÷l§ë¾ÃÂ×Ây‘,­À¸$;÷g¨:G{ÝŽƒßñVw©çÆò¨CXüð¥µ*BóoN„ÿÈèÛzô˜,ùJÌ;ËúFÆïÛ³ó1ø«ñ }O:½$^Àm_©Ôus®OG¿-xVü½ç>‘§@¼à;OÄ]ëòhàˆÏ¦ø¾‹g$uëÑo~vú+]ûjüÞ¡ru©Ò2\ xèè–ïDß‘=å;é⇠øZãö%/-¿ ý <Ü]ˆ^æONV§®eп§¾ÕhcYW=u¼3ŽOþ0nø™Ó<Š.nq éoÒÓ<#KúÛŎϧ§ Î\‰ùRî®Ø¢Î{OüAÌ‹×nMWÔ‹êÇ]ýðpRSÜúpÊ>ÉÎÖÝ8ÿÙ¸Ý ê¿ÑSß5ƒç䘟 ·7¬ShFG&Ì#ȾÚu oÞÔp<ªë ŸéÈ×SóN¸¬O:ù’îôœl>”|”¬çY·Ûö‘õ†6iáp ýBY݆ÿ]K¢ý×R .û0{vΊŽ8.ïúëñR‡5ãs ßÕf¡Þrïrõ|víöë×ÓÁÂ'›3§Bê?UVeUVeq ­Níü´«Ùú'WÙÿmCõ“£ÿ[•UY•UY•UY•UY•UY•UY•UY•UY•UY•UY•UY•UY•UY•UY•UY•UÙ¿»¡ËÉW²õ;‰k(Ín,ß®þ*OgÏÄïã¡ÇO(Ra0ñ…;©ú'Áž|ˆ÷÷‰Fz»˜óªª×]ìÖ÷&Ü~FÝhýðÔÐÙ1´¼lý…Ð%]~W¬÷…ë\ OÕ5Ccƒ~ùkŽº=Äó„ÖÙÕQÄ̯*8mÜ)ˆÁçn:)hžŒ×e??Þ|Vý¦”û ÙúŸ¢5Ó ~àtÁï*4ðW¯«¯×glnÐÙ4èä‡ûµWqø¨žÎïǙϪÿ.&ÞÀÂïŠß×.%]ç Õ³«ãGýÙ0e{vúgN¤çÙôB.ø‹à}|y“úÜÐó‚*ÿPêk†Û !Ý®cR@ûw¶ô þ”ôd¢çµõŸÛxg&~f]¡ÿœúö XÏË”¼&ìÚ&ÖÁ }›> jû鮚ø}9Ní ôNtаWuǾMò>Œ©/Þ‚ôö¡ŽgwŒÚÉtª‚ýäǵS¯×ѵžG+K¿¶‹žÏwm¶Ž wëc‚Ë~¯×Y3è·GÕõ<øµ_õ<õgó/¯ÍO=£y\ß…êqMº¸ó¡K¿eÐßúé9'>/YÜÇ!¢O¸\g±é+êºùóÆu•ãôƒ¿zöÓ\{n"Þ…oßpçqÿæ6¿{Òí;! C*·oªësŸ±ñMQàÏeK_:ã8–ß|îvßqc©à-¯Zë>çZÿ‚—ûu¸ÍƒÁ1Ïó[ðŠèÿE:IÁj"u¬}ûÊøZðb²~Θü²ºn¬ªí§ó8„ñ©Áô¶ŽÖ¯/·îïjè“–1N7šùçg%ã«Éù -²«çëkè,ÖßàK¿‡!L×ÕQ_ës´ùÌÝ¡Ì hžÎü‹ªÎoŽàƒ˜}@Ø{ƒŽ>z‡ttCQBúž«z©zÍK =ªÃ´>”1}‰6´_#ƒ.ngzÎØé_àŒÊ|(×g“Þ®qœ¼ìòA]ŸWîÿ›úÆà‘öz}Þ{/ýwÓ¿û%˧aŒð·|¯gZ†6}z¦Žó„n Æ Aolz¦˜ó¹Ð9¹ô5oysuñýÔG"×UŒ>[˜ßå{cÅèÏÎÿ¬u"ŸtO^ô|xß%z]ëI?þ}ðuÙX¯³¾«Xí{³¹L}Oæ8ÝwtO–gÃ5׫}¨n‚s â¤ËVfåùÃõºÎ_SóL­D<Š|ƒ>5éÇ/QœÜ­—þz¯ä§“]Ìrµàp¼þ7B~!ësü]¿žG=㦿†›ÞÒ®§Á>‹ÿÐ!º^e=ç&ÕAÅ×>™›Dÿ(ØméOoÑ©wÖ-ÛØ';z?ÁC"ÏS+»õi6]Hlø¦>ÒÐ/ï™–!×зªÀ¢ï}ûZá7uðëÏ‚nªŸüEç‚?¹å%mz¹áv»~&æÓ)iŸS”ÕÑ×Tw‹£„`Tü~®m™Ž}«+=ü‘Þo]µÅ¯È+žuð†~ù/ôdºÊµÒ©‡Øq&}Oÿê¹§m&ý0nèÝ'4-C7ò6ý—¾nÎúÒK¿Â8^MVOýHs º1û­gÛxŸu_CÏ'³nªÔ|nدæŠßŽ’Îê—šêõ Þ¤çøö³Üêˆ-âÕ·ÐoŒÈxö4ŽwyƒD~µÔÙ6Ž?Ô³.R‡úw3àhŸ‚Ž1Ï÷'N=ŸŽžÇ:QÕ §Šý¼…jnyñŒýš{ö¥aõz+eÀ§z2š[üÓKZ òÌ/ ¢ý”©q(6¶Vë/Øðµôý7»¾–Êüòôgª©Û£ ^~ §³þ%5 õÍ£)å…{éŸ[‰ÏBÙM~øÄÔïlÝŽ¬äóñØmj^hÇý©àX1ó¡TæïàǪŸ€Á·«øÔvÑÏ•Ô7·¿ýaõß 7&ýGäù;u¸lJ ý¢gÎO5þæýQ;žæÿªû“á—ªìä6SV[Ö*;9Í?ReUöÿšŒ›+û<ª,™ŸWl“*;µ Ý£ó6 >öËsTùÂÐÓ‡…e7¨¸¿®éð{‚?GçÝmqkÚ†}þ 7^,âÝj'§ˆ>ߘtP͇5Í.0ŽãƒÏ+&ž Ïgçåú~ÔìzáÁêƒþEõdþ¥Í‚ƒúºJÜ𾆠—«ºäÇaàÐÈãIÜ.ò |ÓÜÖǰÿt¡oóÔ_ÓùYò9ËØ~pi4^j’¸ŽÀ/?ƒ ø”Ö¤•rŸiÎs?O¨û ùÑøLØ«¬‡hhØ®!ñgÆ]§½î¼Öîâ=Çè±7øyôº‡Ÿ{=÷¸Èí=áë}¸6/½íøß6Õmý^ÕůW—Þ¯ÆÊs¤Å—<·ðß]Ë“7©…ˆ+&wøáÍûÕüÚÈh>f¸Ý‚ï'Ò1A x|’׃9;á"lx¼püÖŽÛu$Þtß&zžÂYyªÊòrþAÆ_Þk˜'s£Ÿ‹à­m¢Ï»²ñ÷hiX7Æ Žô{P3æñúéùvÁéâÜ¥þ‚IËÖ:ùK÷L…ÄÛ(q{΃ÉpZqó@<>ò5S\à}ä?§y½¥£ÎÆÑtqÕ¸`…Óº`Õá[û©ÊW*M‡ï‰Ž[¤~–ñý¨ãÉË/Ú¹Þ„º}¹àÝèß-yhÉâ¢É׈|J©šwÇâgNLÀÁ×_ÀŽ·×í÷›â nXñr*xÁ`_¼8Ï•W`Êß?UŸ©[àkh[¹¸IL™~ú¤+“éáìüx¾›úåI‚Ïâù§úŽõãPGêtáOa¤ãóß™òàë®ðã]î±èBv××ða(¼Ø=L§®ý}øÒdzÅê¸R·3îxÜLuð{­c¼!ïtn™v?,üºà›±<®_šj~ÍÕÏ>u{î]ãɸ†>3?I]m®k~ÿ;¯zôÞ­ý~Vø 8óÿcï½ã´*Îöñ-ôº]ØÂÒ˲ôæ¹@@ÄFÇ.EÄŠ Økl{5£¦˜hÌ«ÆÄ5M“ƒ½+¤þ~ß™“wîgæÌÌ)Ï.¾ÏýÏ~v÷œ9óœçœ™»\÷uK߈vüÙ2^¶Þj~Qޝ-‡çOnÏæ:íÆp|¡¹vσ·_½¿â®'å~•‰©û—¸_/~êxjQ-ÇIh­Î"òÕ”ÿžò0 ›ùg®|ðÆë_sÿrûÏÔýÐx\wÙu,¾.°ó‡P©é«Àxs¼Fß%5Ûº««¥Ô»>æ}Ȇx%eœ7ÔÇl»}>ʼÀêùB»pyœ(ÏèΟ§‹·ËQ\¨ÆG`r¶•ô²N|.0îÅ@õ~ƒ|M ѳ@Ç r^*\æÙñÚ-Ê«ˆÖC1Œã˜lq—ý ÿ/³ëOÁ¢.ê¼qËóÚú͘LtÕšï®ýgègèë¸uª†¿’ÿú–wªó½=Ùû‡B¾ÞÄqŽ£ò×mŒßd·®/b÷½fóy ]ºFì¹Cw5nI;NkM= †×˜ðÃñ¾ÿh}Ý‚_û \= Lù“VJÜ Í8_··w†¿–×ëÙ×ó.Æ1SjÙx‘õ'kòšœo˜æE¢Îýëß¾2Ü~«Ó»¶í©oÃh;r_¿ú™á¯×á²"Æ“Öók‘÷†óyÛžv KD ?[×ç„E'©ëF|èçMòX5j§®ï퓹¿8dŒÃé£ÉÛïÖÔG*Ü®çíŠÖ?†j?oþó Ãe~˜³N ÎÃWGÓ3˘›aþeê~€‘r¾S§§€q×$ƒ×t¢Z·Lèºwày÷Ùg…òo…t<³ýÿçÕ’è]>p^ÝŽÑ$ž¶…åßg³8}ÕïYK­A×ö®Uj>€³dëÿõì«Á½Ø¾™Cø¼ÖÞÉò wtd|œ÷[—ÀÝWÈõ@¢×‹GdzúÇš_±ùžÈâÁ†f¼®Ðƒóõ¸ýŠ}Þ£×Ëëýù³ù.|ŒáåÞæã•¯”?çïŸQ—¾q#û¼·´—ù¨.þ‰Œcz$û é¾ßÓ‘åKžé\÷Àâ{ûÙ8«—³¾7?aÝêú`PÁõV:ù×ìóþg¨ü<ú»Æu|X?ëÄÆ}jRЖüžÝ—+ŸfyúebþÒ\·õì9YÏ6ü°ãÕªâùýgOÌ©»wÏ”?×a2=ǶºS˜xF ˆÅ?b÷çÆ‰rþçñfì¾þ𱺆F<ÑæðºçäåSsëp /g~íÚ9¯®ûç²< ÿó…Þãëîó(=G\ï×NgóùlÃÔ ÙßOľ§•'²ç½œÔ-ŸoÁžÃ{[Ëy³GÚ³Ïñ£;eÍ=£Ùu.]ξ—ãÊÕóúÓ5¬_K­ûç§Ñ?|LÞ_‚ã\°J^gŽx‘ýlÇïËú“~>îVÂßÖ&Z>Úû,þ…ÚÜAÿø•, ¿ïÓC§pþ¦Vã®Ú,û7µeûï1…‰äS°ì,¶¯ßz¼ü\Œ³ì/ÖàÒ­¯¿fx¢uW]̆j"î¤G;–õ6ç?¼Ï |–«ŸW×Ç'¬pã«bqtXµ°FûÂEÇuLûšõGhêH&ÝSÜÌxm°è9îÒTö÷6}£hú 8§½òïZ}Æq³åãøsì½EôÖº¸í?ȲóK„î5Æ_ËüÐ3ÇÏ|Ø^»ë•×^—¬uzŸŒý3íF…·ÃÄ×¢þ;n]ÃâÄÃ~jW¿èËpûº>Sãù-Õó|4)Çiø¾æ»ñ\‹ÏQë÷3íùoß_[COÍ>³ê²`\ÝÀ‹ìÞ«šãˆ,qVÞ{Ñâ/´ }y–ñr,qáwKôÙɾ:^®o`é²høëZ–/ñ>çû>^%ÞíÆ½²Wàÿþ_ ÕpL0Þ+݆{©ýÿÙo²<Ù“w¯ûKoußv <œ¤#,/VÊuRó- ~}´äy<)¿?³w³Éc5%çaù}+xû8ßM3Þÿ•îó¢¹eŸT{ÍóùR8¼ž«ƒõ¸„/^Ä-º~¾¸ü'í|¾H/žÑÕè÷‡¶ñôÓ &Mx¯SþG§»öL5©/‰/ËÃÍÓµ^¢ãÙ×ªÔøwÁ­Kd\V¥¼^{û\È<Xži Z)Lùy¬ÏÛ¨>/¬¿I -9Î'‹ó@\ÝI]oêÿìˆ3Æ´¿ÈõM>L{~×5á~Ïß ŠèUt2Ì;¤î‡èÏt>oñåû[_ÝêËÓšgƱW)óÞ»ŽxíÞ_åØç¤ÃÓ¥\gÖXß¶eŸuÊuöp<ÕÁŒÇ Uòz~êÏ-úŠ]¯§3t.,lÞ7nþJ]ǵï5nûù}<~D¶Úråµ×YÜ:ƒÞÜxÅhÿœ÷1ÑÝêÍñv5Áýóé6Lg‚‚Âú¼\¾ßýØ%³ä:lGÒGËù"D?‡n\¡v•¼çëL/^g?ö-V·ÌsË;¢&2èQáž6,ž=ƒç! /0åÅH9Ÿ÷Ç¢áżøUuŸ@u•Õ:žrÞ]kå&øçã×½®^'&¯ Îö Ljr‚«¾e#Ãm%ü&†|åwÝ„þ†¿Ûux|…*®ÿ›Çß³Õ/0<‹F7ùÜiä†ÃÄE&’¿ðÇ?çÑDÇÏXz 7œ\/zÏõm˜xO":ËXÆ2–±Œeì»k¿õƒ®ùA4žˆá,¿Hu¾¬ÏÄ’XÒÍ*_äíÔŒS±’ý³ºÏ„êÙjç³òE–GY3$R]Ãû·:7Åç(sã/Ö°ø¬ØÀ7ïÈ»êí5à ¸ÎN©Pó”VËŸ ý?óþä®Áø“áô ¼]$ÿsá©øñǯ‡É‹â¬Fìy:þº`>Ø__–¯Ä…4#ý¬ËQº2\J-ûtŸÆú3Î;ç€êGÃ0RwüýštM¢}¯Q-×W¼Ýõ£vñäП½¨ÚHxZîgÏç7öÿÞÄnÝÇ¡ßÄ'zÈ(äõÓÛþmÇg8¦‰Sý w U÷À h:Cq†övÚÏÑ‘¯»xݽïsÚoߪ·+/?š“|pW‚ÓÞÖ0ú}t†<^—Éwñç}\›Dó%h¿',tÛogœÏðó~Œojí{ÒádE¿§YŸ}~Àšþú¦Žú­„'íìú?Pj{…ï–¡wzùüër>_ dϳ÷·|œxïuÿ×ò’GäÄxÓo‡iÝüòÔ*˜ç}Œºÿ;å¸";?ÓÔùœ™ÑOWæ`ßçÍs3l“ä|ýfvï¡­ÎzÛñ„ljˆ{öã¯Å—EêÃCÍáVykï)­ ækœ°4˜—Îï$m8H­÷Fã ÌIV×9ÜÿíÀ?ã'Ì/¼~Ç݇îmá8ò˪Yœ±™Ä§ï$[ßÁò.iÁi óÞ×Ä«ûíö¡†j:}4o[zqÛh«ÑÕZÚ‘Õ;4zzÞ>»<†ò>’A ^g <ˆQ ?8#‘ýŸæãâ64?0qüTO¹Þæaè÷wæ<ÊŽ<,QöW'õ?Üÿj]áÂû3ÁŸhtÔu†›æ³:¨cü¢ç—„»„×q®zB®o®~/–ëaÖcÉûètÌqÇ/ýfLúyà{Òú‰O] óÿ¨Kã7`ž:¾˜Q7‡ênv²‹ü:_ó˜ûÁþ]fœbòú¸1P­·ãÿ¿H½ïyßpœAáE1ð»Çmh«^_¼]ˆö2þÀVÏÛcYwì’¼oÂqAO‹_±ºF×±ì 8"μ/íðŒ®ý¥Bo(ÚìãjêÓ(²‹ßQÆq#ÜxÚÑ&¾/a)z}çoJ„/ò´y;d-Õ§ú®™+¿×#HágÓðÞ ?ÿwC_fµòËL¼ìþq¤ÿëNa8– Êe¼ã¯"hÌc h¬¢ŽO4ý("ùD?„öú«ùŠ»Ür›ôÄ9‚7Óöx´ ÉÏ&tŠ’Á¹ãÄ߆ÛG bâ!;ùxVÿ?rAgëÞü.8ðvºádêËPë†cÇ8¶Oyÿ ø=žŠy^a§à8ÚÀkQ¾IRÆÜßÛõ{•DÛ?Q ÏUTC¿ß ¾¥*äx+ìpV¸÷Åxu6g×Q ï'¦¼,¨ÔstžWSŽëÁñ§óòÕ}p\WÉ•‡cd\»÷Ç<´ ŽN„¯×{-f¾¸»²Ò?Îà}y$/{ë WuvkYWqY{å~‡#˜þ .º'‡Õ1ZS¾: ü_ïÃxë³èÌq»Ýžg}Yê<Êù›òõ± Á­åkp"7MaÏKÛ˜ò“ <ñ¼_÷¼f—hÁq„—= ï‡nr^@ðPbj8\,Æ> óÅU® ;µXÌ÷_9W׿‚¥/FÓ•\{I¿ºþžE•ãCwÉýLGý)ðûÂeÕx¯•'²ÏÃud±fI8^\Z_èÿ¨^¯k4ÿV‡o0ñó ÝOtwËc \tØùš w6aùµ¹=‚ë²?9±yuç÷+‡¯_ÀúÏn¸Õ*nÂÉÁº:}P[ÓåcÑѲ¿xðJõßs‚¿o'Ÿ‡í»òÏO¿= ¢í×é~ŽªyL¦j"þ}Îeu}“Âø‡ë×¢?÷kZêË?_®Wþ쾺…?½òDÆóÌÆuWo“g¤«cžù”ý /•­©·esªÁ¯9âoÉäß ¸@ xåkxý ‹Î ®ôPBÏ3¤~ll×çz8:œÀ»Ðz¯À£Š~yó,,¯ßu,ª¡¦›òýë[X<r’­ç74£ýãÚãH„òûPC ŸYE8ÿضî…~¤ßp‹#l?o}ÎLîËäxo ÇíÂxÀ¢ê ‡5žÔdXu©:>ìŒÁ¡+Ùuÿìö>c ÁÍ”tèæ]ÃÖÇæ¤Ï>Ë.ß Ó ¡:ˆ¶}˜ÖÞM¯¨&¤®ÒÛ²ŸDqÆë.ùµ›~W9ç½0¬þ|z_±nc°>옘õfÖ-;Ü •œè‹ùnǤ ó/Ëõ7›÷?| ŽºW­“Z^š–õ Éü½Oìð¸4›å.~Fù½ 28j«‡ç}¤és"ý÷ÇŽ¦Ñx0reØSƒÇ혞¼W}º5 ܲâÍbíS¡êÍ>?ÏFÔ‚^ÿ¯S¸u]‡'ÇÊ/bÑÕzÄ(g|˜|p¬øô—õ+ý>ì1YþcùW¬¯`G<ûÎ>;Ðoù,\°.8ŸvÑqò:>9š~…Ï/RѰòÏ(¶‹×EŸ³ÿ»&/ˆŒ?GãnãÊãLŽ pÞ¾zå•@WÇüÖXyLé¼á)†[ ©«—yûÔë?†No}q¡á9ûiu_·¥Ÿ*¾¯Ásm'º}ýÙù&=Rú4&qY3M_ãÍØùA“^ž?Ž7‚íóŽd‰ùÇ'veu…ÑKØ~váXæŠKY=áÁù>ÓŸýÿî vÏÛ¢Å\çÐm}Dv<ù]ßæóϹê2y_ ¾$œÅo‚¯ÃÔû·vü›·³ï•烜uÐ'Œ’û¸ û¶q¼eãä>NžD>ÉC¾çö|ˆ¸-å{ëkéטtÜ-y¦0“ë{pÞmñ\Ú|iœCo ¼ùò÷Žþ¼ó:7«ùcÑ'Z'†DÄ…}ìoÐ~|TÛ=ŸQù›SòÞ_iô~¸ß†ÊWCõEˆ~ëh³MÞt¼Dö©ãØ &p#Þ—<_BxÂSøŠË8nçÐ2~¶@ã_5'ë´ÈcOZö·8žÉÇôÑðfó|øeGÊñ%é{DvðûJõüó ÙçúÝþñ†zVãõ1ËPOkì†kÄ$†÷¢q®œÅò7BääÎÊçw|ɾ÷™,ÿn?¸9yΊ ®ùÊ©±ðüyoðñf<"}ïºøÎd‚o8ê¼LæíP?wÞ>ÿBy¥ ùûQÎq~#sX~³—c½oâKì{?§ŸÄOÂàûçmÞ‡qìHå~ïíâxÒ÷Fdý8úZî¿ê˜Ãü y]?ÊÖèZÌ:;ü¹ï;‹å½ªñBaÍ–Ï&õ< ¾³/Ë;ãܾvñÔHþ½væÏ ï—ó¾å~äf~¿Oª”ã–K¿e8ÍäûjÇ÷‰r~ŒâQ1_—ô‘RþWTsÞ¾9Î8VÓçøHtgq–®^·?¥Œ§ñGLzþuNüQ¤õ ‹^–¯û­Ýu]ýyS_7Rÿ}æÃ,ï÷)éךù«ó~l¡k#tŽÄýs­s¡JÓg6¾)óN/.<à•Nùû çÔùÊ<Ïh¨£’¿¤þŽ^¬ßÇÄ‹"xÅ{%ò£Þ§ä½ZÀø¿©Œj¶£œynùï“Þvƒ¾¤ŽçÓ1NÔŽ/úó þZþœÎá÷3ßÀßÈó`ð4¯óÝ­îCmJóæ¿6Œ÷ÿb¨#öÙ”ëödBÞ‡<~ýu'ö ôE~ŒæÛ„^ŠÂñÁ¡„êðŸô:ÕqrÈ<5uÌ™)ãx‡ÊÞ#W»ë5võ„бrÜÁqÇ(¶ÌOðúºÛùkº>zïO<³¬sú×ÉpÎhàËçGû‚óÜ5ÞÝnl½Õ­3:þ=ߤ¸Ùj– AS.‹ü®‰tO3ªƒ×WÜۘᛮý;Ñq¾šùÓù<0MÈÛjÈÃhú q|»`üÉV²lÕŒ?ýáÀõ'NJg¼´Ÿûßó5ö¨† Û*ãËj»øÒÛ©·0Þí”ëtâõ=Q?]ýw6/Mÿr5ñåe®âüCo…ãG³Æ÷muË?Çeó@´8ذû×)Œ'.Æ’/X}qÕ6¹^[Bê·ãvr~‚«›5ˆá8ºÏ ŒO¬û¥/*•ÁÙO³zΡç1œŸ¡^ÖD_„q>=쮯{Ÿ¯< uíì¶OµuŒSÇ»ñýÃ[©ü»¨ãët/RÆ©fÏ·àõÿNô(Ñ›ãw 伺ò:b™‡àË-ãuþænû,íOF W|]zu˜¢†ã›Ñ›×«º¸=çhN×9¥/d¯[Ó¾XOÎ×£×P(~4‡=—; |r%éÙ¯0¤~uâ±êµÿpãñÅÚINüü'¨½.©3bÑV© u¢Íñð2Øê†¢RÿÀÔñè™ ¸.-øâ¤ gßÎâù)·Dª'¡Òn_ÒéV£Ô®.€ëZ3­Œ NY×›¨ßw4!zÃd}x¬l¼£™î®ÿÜßrõÃìïxüyÎðPë-ŠÝÖ9]Ÿ»ÿÿ<òùN-UóðøXÔ©üã{ò¾®{ãmÞSú *HÿèügÂz¶† þâ”@˘øœZ¤'Oìˆ|‚}‚ñsX|4Ë3Îë)¯ëD¯ˆàwpd8¾YW£ü ÕÐŽ÷ûçXâ\4¼N~_{"³Œn‚‡%®ñ¢öéú|—Þ*Çs!y’2Ÿ¿e›£_€`žCä“< á1ƹìêÈ TÈ÷‹÷ÆÓ—׿añ êŒúI™ð0~½â|Q ÿnÿôߨûÄÊ4ü}ƒƒû›tüþùœ×’ò¢1Áçq\Ö.&óhâK=)¯* åcÒéõò{¿›÷3v‘ã0ÿïêö_£á®«Øº¥Ñ[¦üÎã·rìgšóY¢ü’hÇëòån|~þù~;dñ:½7óŽ•û¦šE«c`ø–Dò/º<æ°Þþ–ãÉ&Þ?û0˜§bù.¹^ß”¿gçoˆ¥nLï+*ãÁ {›8þDÔS[ð~™üdùRhØTF¸‚%[Âõöˆ†ëEMpÊzœ¼xu>£âLüq6&zj^ÇÈã‘÷Sï3Ž[väÕŽ}^]ä¸H§·›ø<ºÞ\¯û5z_ÐÎϽ1™ú#z?ŸÈ÷ƒ±—©ó§œ‡Éò¬¼OÏc}ýlõ¾‹*u? _XÕXÎ;oŒgúñºÿ£LíW„ÕÂìÚxü¹®šyixÑ5žº$Šåû¥ãp5ª—…rËþ"MžÃu×,+þ oS̼F†úLÊ<'húh›Ãp½ ¼Ÿ–ñ‰k½Xç›ò‚/^;ßõŸŽ#>áø$â6Z' =NÓhõ/j‚÷ÁÛLxÆÀø½ Þ½Mðú‡lǾ1’O3­ïx[8\ô;áö ¡Ïåz^C5œwã£Ø3þ³9Ñ5+Q»òƒõ¢4y[½ì¸ ×?ÈúÕ®¹Ò)>ñ6p\V•v×éÌó˜rüpë}Bî{ކç¥Bk£ýM¾OU¸8&Ý<2´Ï ³¾´ó3Þ_ïcùü°ï…Ïkßšðîy½6ðŸhÏÛ¬á+7äk‰Ÿ…üp8ÿü㊣J ®Fóþa,Ë“ÅcUI¨ñ(ŽP{ÜŒBùÛb]F…¦O­ÛJõy­\¯Í0€ <ŒÎ ~9 ~?9ï€vÉöQ£¯GM-Qó\OÞ.†}0+~Ýû£ãÓŽjØTÆë9òÀt<°ùI‘Åû^~¯®Ñ s¿±ë_6éFžô9þ=„ñÙËØæOt²mup­Ç¿élu½¨«Ûþ.ò/ÖÇ[Ö1P3B—úm¸÷ÑÄãlœÏÊ å¼çËòÞt{OQûk Ÿhãh8G‹?þêÉëcÀ»\;š_•ç•ï¨ûãó4u¯áêíhœžu£®bu³€‹þä´Ÿ#ߎ÷ yO4Î’ïçÒͲÕÃëϾˆŽ”†³O’÷Ïêõ#…ÿód˜x:E}Ü>O ïÞƒS‰Çlù…þ;º}ž¸™­ãÈ!õ·ÑÁú;q›­>i\† õú–r܉ƃ»ævyÝ™Éú½/yþ®Qzâo“á$¦ ‡Cï|Êû5ó£XòY¡¯ƒÓdÝ Wœ~0‡3¦=ÃÝêøÑ›…¬³.ë)®CGž·w¸ºCìu‚BïÑ CÐÛ’w–à/Røézr}ÎÏâÝçÓÕŸîj‚ŸAüŽï«ùÖ\Màk0$\ÿŠ,ãŒòp¸*W~;êŸ"—×]bâÍl(fÒ©öÛ’ÇìøÆë`ñ¸‰—>c Ût¼•IŠ5?û¥ßŠY$ï£ÉcEž×ôBá¼=šzÈã—$º¢mD>›A÷ªñל¨~ØÓ’¾àÑŽß…óvLî*ãj:ðýl€º¿Ïþø‰Gò¬y2ë¹ÛÂåÍ-û•ýëP=·I²ÿîý‰à;4¼Ëº÷ 4zcƒåü«ž†Îly PÕOöW 4¸ZòùÑOæiöùZ;;ö„¬‹ØÚÈ÷Ýû<\_Ž÷2Ñ¡ßÓ‰aEpKèªaÀB»¾ÿ‚G‡ëËœsºZ¹Xþ|Xû†Ó}B¾€¶·¡©ùÇMøVîOüG4tU¯QMàŒüßôüÇÒþUŽ÷U–< }ìâ>S_æ>K^ó\[ðs†¿z±tD÷Œ}7 K®®{âê¯3á%â2,þ³ÕuÐF½~ºêàÜ ì縋ãí'Ðà“/yÊßoü}¤º»Ÿ€;Z[­‚<ªyß|Ϊ5,æû%¦4 ÞǪãÑ=1õ!Ïß’LEÖÇD·®ï8åü|þ³¼q¨øÌ§¿ZG$¬ ~B”±ü¯)ŒÆ²™ÑôRÐCw¼vDÇëרõ¥PÏø&žäóxT“—LʼOêWGÍd܈bõzªãÏ5Y\ù$ܹXæGù0&>«™/»õ_ gú8|µ•Œ)ÕOëˆÔbçØ“NÄíÛá‹y_X#MÞk6«¯„­óbáZ;ݼ;›Ëz#eÜ_# /öËvÏóõþàߨó9ÓþÅð³“>|RpÅò÷Gñcq›ïÿлÁ¼hëO•ó'[Ôë šjú† }WÞ~KrG>î¦1¿w¼Ï5²?—ßï§Åô=ñàšV-“óŒ•áô’üóÊËg¬a˜ðÃSþ^m½¢<8í6Y7“¬/tj¢¼,ºøÕÿ?ç!ÆÀ«’Å)pýb¬¿q—„ëøH^?麆,MÞÀÐOµ?ˆòm…§µ]\¨=¿…N¯H½Oéô 0ùÐPùå¨qyÊq韂ë•.³Ï˜ÎpîWõè¨õDQÔ^ÿöóÝpܼOÔui½5q@¯Oö½™ótö¡^ñàu¸etá8êJõ~…Ž]Mß›‰ëîS¯]&ôg÷#E/S3í8\™¨Ž3‹%n5­wÚëçD½²åu¦0´`þRÜ<¶ü_aMì×ÚëYö½­o_'Ô„»>—ñY–~“T†‹û‘KøªL|ôD¶ÇÿZê% žG‘ïF!ÿ{§hù´·ì¨"|n;ÓÛ‡<7‡·3‡QWxszp­èªÎÏ‹xD«/xÖX9>¿³Ý÷ûƒ§ä¼cc²¯ûa,¸ao/‰O›öûZ¢ø—dýÌ~<–< ž¸n™”·Éx]mø¼S¹]ç¦r·ºEUÃâO§†V7ø”'Õ Íü3c=•ó zØO‘/ ;¯Ð<¯œÙ/Œ¿bÒéˆË¼–ýž-"êkê†ÞÆàü ŽÄÛ®åDÿwú¥ç‹êO];tá8D’'Âe½YÜCt°qQ ÃCÇT}µ4¿—òù ÔßSJÿâ¨ñlÞœ¿ËÈ:¢ž•OGy¶+Ÿ‘ñÞ~¨>ÿüá¸MÁ|FKÞb¸›j>Þ¿ˆ¿öÄÕ÷ù]:ý<,’óºº}8e<nE†õìúÏXž†|P¿ÃU9ßO¼ºm&‹Kÿ%݆Þóã½Ô:Õ¸ø ¹¯À‘G_g)ñHcúbÐù Ûï…ùÔ¸§î³Ô¸¥ÏyÜ4ÊÏÎä×§ôÏûFý>zï…Œ3Ïn?™×B§k¢WÌý\¨TëFÄeQñû)ãí³ËÃàk7JþæÀp¸1×¾ùŒe¬!ÆÉøÁ'`«+ë,kêœ(":b[‰N¬#ï²mßå/‰Ë0BÓï~ÉI2Ï×ÒÒ?`2t·Ó…À”(×_o[´uÙ¤fÂ%ch8< :ñ8g@8\aÞ7nñ-ÿ•)o‰áGÉxÆeʸŽ^ƒu=7p}”q4xkô´ìmMðŒøßËÙüÅ}ˆŠƒÅâÉáÎ+ЇÕ+å߯>K^Ú°ù ¼FŽºÇ<¿äóa|b÷\{ßÚÕß°à u=s¯÷òz0:<ó-]ÙÏf¼?xF_‚󚣉F—æÙm´ù1Ü SÒÔÀoÈó(·ã‰ÛÐ^ž¿·5^|°ëzçj2>V½(ëëÖ0œ í{‡!ù¹Žþ’­ìýÜo½ •ò÷6¯Ö¼ÝñôÅ`ô§ _Më°µeÊç5%?{öiå¥4Z˜t ìê¼”wA{=‚çô6ó¼JsËõ½ŒãdÖ ÇoÖ*=ücÅõøOçó5¼¹õe˜-ç]D ÍcÖÝk•,ÏF\†¾ÑúŒãwö«h]Eן‚ùw7身ÎЛÔú žÑôôÃ'm&ž"“ù<~+?eõAÇo³FŸ£ ['’æëÀ°ôâÅýnx%¼DæËke—¯}3ÈRßf=Ÿâ§_c§ØÄà/ð¸že=óK¾.ô¬üë×^$ç‰ ë½-ï…ñº•êõb¿­7×ÆÒ¯Ío˜ùѯí}/#Õywœ»ŽÅ±"êÈÝÿŸÒú¨‡¤ËpÓ»áx:9¿5Žþu¸ó‡Þ¦ÆÅq¼­­Þ„ÀѯWšÞü§–ÇoÅ §|½àkDÏ`]W,Ë~éíM¯Î•«Ñú‡ÿwÂû€ÙÇ©ñ,#x=6‡ðq¬x4TýHäÍlG»|ÁŸæÿ®ÿ”m/Y׫8ðîô¼g¢·Þ+ÏÛ w¡3ô$ëLWÎÛhành†,ôzû²#ÅmÞVâ/äüB•ZWÝ8¯ü^þ¼t¼6‰xô|Æ;³S¾­ßàø_1ÜFÇxâEä7ûÂ:ZúµÏÞ,á1œéozÿÔààÛñü`‘%Ž¥éËÜ¡é³ÉçüjSÔùVïçj?7^.ó€òÞ‹ÇPÊëÂë¶?úIç…Éàb—¾MW=a?¯bÉÛeâOð»î®@Ê{›÷-¬¡>¿v}0ÏŸ7«ý,ظ~aùOäz÷Ï1ž’o-ïÃò,»zËý£ßQêZ ²‹«ÿ$¾Ç qð‘r|ÑŒ÷76Óð÷¬ë¹Rú}éóxfi‰S“ûi‚'3²”÷ ]ˆŸÝ[Æ)a`M°.N¾Ÿ\~`òÖfL6Ì»Ú Ÿ£Ñ7 }ý¦é‰´zã¹hèãLÊ0WÎK¡Û5áxfnîÉðkÃÜp[Èc÷ÁÛü^ëÖå°úÆÖóãü98JÝŽ5_±Ÿ7nWóîêäIÕKðÔ *þÇ¢ÕûïÿFÇdã}oOD|\kCŸuQð~.ú Q(ç™luB¼mòs"úÁÑ•ðúµ$}&¥¤¿~ð ¦o@x…î‘öóÕ:òÅ ÿ ¥¦^9“öù’|~­¬/«å¹=ªZÓüT½¡”çý-‘ïÛØ‹]Gt†µ—„ÃÝõV—A§úñ£.]ôѤýú‚ëÇwmÛç»Z²8Ê1þʘ›áøÏÙº’òüÑê:>íWõt2àfû«×ooK¼õo‡&ΪŽÇ£ö=èúÛ’2äYò!–DÃu¡:YžUãõû…Ó9x¶úª£â‡³åø})‚y´³Iü?ós%ç3ýI‘Ljk¾¾Nö”·Õ~C¹z¼ëÀò$÷M{8^|8‹ó½ê} ÓNLdýü^qk¼®¡¿EÇ •rÜ^Îãþ1á§ÑèMbîoêŽÃ¬Nùd'„£Ô<×që CŽÛºŽnnusïKõû‚ñòÕêøF1ôi¿û6á?É”r ;=ïS¾î9ê°àé‹Û*Ÿ_KþoŸ¥Þô®ÛÝ/\žÑçäÁþljûí–}ò&óýŒΓ~Up_‚÷E¸¾, ½Wö§fÿ!pòöô4yiëùŒH“nø­GØùÙœŸ{àÂDâoÑ_×xÏ<½ídêš Î<]¦íohì?böýuÏ£ˆ»mû:C¡ÐcŽ'¯€ª„øPÇüÞ¿/ø G…Ôýãñ‡·5ÜÆ¼.÷™ô‰¦oƒB¶®£Ç-×ÙquQ ~-D¬[~óÏay¹&$É?Ô¸„ìþx{ìê…¸ìM™Ÿâ{o³ŸœGD‡ŸE©³ ÿÀë'`¨›Œ'¼ ‡±À–ö ×À¯ØOÍo$Öô‘ý=øY¹?‹UŸ1M#ާéªö§E_nŠnüAn~„·‘Ü…?e×íÏyVþjÐg!Ï%Ž{^cìGòø7…Opé«Éôíßx›G¾%_Q1Ï_\{´u¡ aðx¡õÏ뿆g/ª‰zŽbü'(qŒ£æ7“ûä ¼õe¸ô¯j\J¹w¥ÁÙ¥7øº`ïÛ£zçÞ>¾µÕ¬ã…¦+‡3Ûx ¢åGÐ'Ï„v\M¾-I}¿˜äS?Uׇ¨Dûbp÷KŒoo¨Ì_ˆ•y ò9ÏX°¥ —±Œ†Ç÷/KB§“¾fqÊ+Ùï º¤…¯3ó"Õ[ÐÕÍÏÒñi í?B8ì|¢š÷guFÜ-ï—ÕŽõFÎo‹ÁuC–V׋¾íwÕL:½:Ü1jÔ¼ªé6t¶ä}hBtWNgü§–ºÂ¨aÏ?º‘¼ÄªÑvù™V¦#–¡…''æ~ƒ¸ ¥ÉÔkE=â¥Ñ?\^Ò•Ç5$_Ùƒð)Ôò~µÝþÎO¥ãÅÂé‰ÔЖÅÍèÌu*‹ÒÌË“cY§ÝㆠDNÂýÁñwb¸„iG$ÓçY£æÉBópõVÁCŒö†õê3^Ù™LŸÔøQÑÆuýh£èÍu=<Ð ë÷ú&(Z³ï›Ö RŽ3ð¢Ð-~C/®ëÄyþ16;™ú‚-n¶–­"žD?‚§n—£Op_™·…ï+¥¼m©gek&>%Š[1†ôcyp]¼cË©¿½zÿCáËûÆÀ_lx®SŽß¼>aÜ<«õ ]x?^ŸhýI¸‚óðj>'ò PwÇúÙ|Æ{Z@êj]\\vë=ú‡JŽ>×¢Fð±¢2‡hÄÑ•êìœ 3¿Tïy/1Ž ¥ }ýôx_¥·ïGôÛ¡‚óÝV‹¦£2æj†«ÉâqXwúьèŽhð÷è Uˆä— ÜŠñ:ydŸ¨±[Â:1á ‹ ùV®‡r»¾wíuF|'Ás£X½_Ûòèj¯›KêêÔÏZr^­ovÊù=ÂÕIP.ï“èÑïáýû(Òôßž8Œ, Ö‘è¦Æk¥׊àÄúªßþD`úgþßûó}yÖr¹ÏBð]éxx‘Mü?/u·{¿Êÿ‚¾nz†(p쯩ñ“Eþth8ÞF“Þ­·—ãï}ð*î¶5[þ±tzÄËÿ” ]q4—÷]̾AÆyvŒ¨·ýPq]Ÿj?•ùI4:ïÞödpŠ˜ò[·;ê «ã:qÞôp$æm´ô߯nÜ|×b×õ]ãÚgäß;$›75²4ñH1ÿ¥1ߟÆr¼Œ7?ÚûZ3DÏcuU×ÕQE∖áò8ÖÐ÷דùG:žZíyy‡=èEöûÆ_„¦¼XÔM]ßÇ&vq>úkâ‰Qê>œ4ø€Âõ¡]Èx-Ï®î)LÄÑBï•ãéù²ÿÛ*ÚþR_&ü²t_‚Ÿ´‰8~–ì¢,9š¦·cš¦…RøÞ_Ü>Ÿ©/ñÝݽÁûJ4'¼ñhžAôŸPíüºÆ“W²5ñ®œö³w4^ÛýMà=Çä}ó–u1Ãz`Í×6œèøXâäâ2L¼0œÞGßhú&ó¾åùø“¿°Ê¢[¸<ž÷U¼q®·‹äÿ4ý”ÞÞ˜ô(¦ÙÕ—qêõþúhò0[4ßåV×¶5\UÎò\5r~ã'ÈþüŸY~¢Þl=Ÿ1vúíƒß[tKO= mÒ‹#÷DßèCCÿ쾆Ù( cÏT×I³xÝ U4^‘¶]ïMøqÿ8î *=u[Lé*×+Üô)1^îw ¸œÄthÜü ·óG3^qœLAèlcÄ»iŧè ÃdÞÏÊùãG®×‡ƒ»¢æë3ðóbú_‚qcç<)¦ûƒÐe;žÎЄóä\ÞNγ¼<Nx¸Ó­[Nóèšy;ÙOŒ”ãMT3û€ÓýÄ 3œö šWÒò<¶2à€g/`ñ,Á• >e4±Q¼†NržM÷ùüãÓÌLõ”#7!MyÌ·ÝꢿR¬g:ü#^y®O»„ä“ý9-|ÿÞ¦ýC?X/õ³[çÇ~pË«øòѤNØ+=q%ª5ü€÷d¼Íþ@íx‹kÿ™ ßq©·ÔNÿ²‡ó¶-ý—Œcè ©ÿ­»ƒùÓ8âÊ-ñ¤þñ<ï‹+Î’÷á3߉z÷5}ï5Þ×<µ&T¿åmCgo¬ëC1}ŸøáƺÑ—*;:Ìž¯ÖuyÉ /Dú€ñ??¯#"Á¹OÙáÓ»úÊ+Vš†ç³—ôcåØñ↿Êz«KÕ÷ãK7þTŒhlÕo‚F]·êõån}Aè¨áÍ~Ë Öž÷moâ|õ?{fXý»þ¹¢ûJ~=þ^ áëñ Ñú1ù8u?o#Gþà^¬ê>†íjèbÉ·‡óiô÷lyîeÙç‘«Ž'0±ôÕ¡ŠóRix?°¤:=9Þ7æí0ðà |ͮ￙#ß÷fžúùç0½û~båOxïqÞÉ"ÃçèËÎtº&¾'œ|»ãRÏãýIûÓËlk¨J¦?ÈÛåÖ/€%Ïî/xøåÿ×øú·‰ð¾üœšô^myˆly@½ýÁ}™hcÐa Éû‹ù=Ðõ§ã´>Ìÿk¶?=ü—~uïѸuì=éËãZÎ+1á™Ïçž dÿÙ-±¬SQy»£öcÈ›ê¸Ãr}p5ïÏšuðΛd=ó12¿„X÷’™UªaÞ#õ;¸êMàŠViåÝæ}+¿/hã¸~{U¨ï탿ϸôL¼¿q~¸Æáö!_/ü3¢_Åye½Éèˆû×ÙÜ¿n¾6Ú§oâcÔ²åï·Ü®¾×ÃA¡†§Ú #kœG_¶þy»Ã#âIø²»ñçj—!®Y"ó¢ýÝ®Ï?%¾~âh§]r. Z°ã(Š­aé¯e^…á½áC¤æýÓ ·&ø¤®þ)ã8îõÀûO SÏb|Kx>ÏQ¿8.Ó=‡®¼“èÌu“ÖŒe~Q£úÉâÒUrž­5Ïk.úÌû5æ5OñhÔýŒªgéwØsŒÏèÌ%,Ž=¹]¨8CòÔu Þwt|‚ÇÛû€½×Èãqä9=%¿ËÛ`üB)¯„‡ ž·Š‹WÞ-ßsõod?p¤üyI¾r”&_QÆßg¾ïS}ô‘ù¨pèooÛiÅòú¸î»$>±3‡²ñr4ùÎþD/™ì›&ýïsÃú¿þÖXâWÓuüë ¾MÞoßSg ßh)û»Îß·žß?å¸1l=Äùº;Ãé /çÇÜ)çtûò,ëUyä>¼Âó¹žåä×¢3ï#ê7Ó:›·‘ø·ÈKª ùªª•a§Â¯ïv<&Éüjè/§àå {>®º)-¼5hfÈÇ|±·ÿýŠÕ+ŸŽã”wz Î:Áƒ þâf;þ&oK¸¸zÕMÏÌ£Ô¿ŸÏ&½‰Õ$^Ë'¿?¶¨T®‘ýöé;ZÅÊ“ü³Ÿ³:i×/ õíAÿPûƒƒåz*ò‚ã>Ü›Ëü¼ãñÀï Þ·¼ “_CËg9ýÆôòÄç8æ¥òå|4Vþžå}Qëžbˆ:~¨oóöDË/aH2q(ªëès'Ç=¥yo‘u`ô©Áx‹§Æ³ï |äiôYúÛÝ?ÿø¬ôâ¼ðð¿cí÷A¦OÎÐúz}›h>…ñâÞ1‰áºŸ ž^à}PÎë ×Âú·ó>äW¢åÝEýw½m×§ÕÜPßÍå¸8Šï&}•¦yã‚®«Õ:¦ß!÷©Ð¾ÛËn‹å½¸a”qœd Ñ-Ó­oÍ ºQz¶¦.Ü)œ"Ž›Úª^ÐçØ•=O[ìêCBŸÛÿýs7ýù”ñþ¤ÎçyïsܯfþЉºJÊß5ŸÛdÈ#ý%~Ѝ}¸Æúø1!\?JÊxWþÙêùÒž¿ö„±þï#»Ï‡ Ë:ln´<ºNÐÖPØ0òø&ÃÒnuçvï/®xŸáŽ4ý†ÞlÇ_^0$Þµ+åëhúëÃâÎLf»~RýLÿïM‰þ`H=Ï”qjüòVÏA#ÍÿÇÿ¿ ×ÿì¬#Kãí¼Ëõ$ÜòcùzCV±úu+;œ´·›û?í’Ýg¼oâÕï5^oŸü{›ƒ÷à7j=UÂGbª§ãG=¹ßÆ÷ŽšýßZ¼Å‚“#íÚù=ò9Nçº×Þ^ò\}¯Œ{ÊæëŒåsÛ|+ít¾1÷²Xpiþ\ Mà±ÑI³N[ö™"_ÃïÒÆíþо Ûãqùí‘ü"‹G?6O ‡>j=ëQØù™ —t Ž»æ\%÷é7®ßãL5¯‘÷7â§àqÔ°{íü¶*M#úHÐTó<ÿ›¬ §ü0=ýE|},HOŽ­¡Æ ÷o2¾ Ù/?ž>ö¤ 5vQô¡¢‰¥ÿThÈKpÞ<\õAà:Dó;®†žÌ¤qZç—t:ó¶æ}oÞ6‰Õ¯ú¸ÈÒèÛß8ή?eF/§xÈûy¸ïÓÛf‡{[£Õ£i¾ÌÖ¢òÁ u]æŠÕÊw%ÊÛ!ÌÛïWÀã¶¾sdþƒBÇ>оÁq™èAÅ5j¾ >[ãÏáG3ûòµóh?¨Îh~P˃jÙ…>éñ?𳟭‹Ô?«ó#†<.ó…äOÔù#þÿÆáâÒ—É`ԶߟUÿq]Ÿ"ºÙÅ©þyù†úO¥†/%OÞotÏwÊy×þ‘Åïº1~²Ë7Ú½O¥!ñÿ‚ý1ªY86p?EW¹?Õû]Ý&eœ¼~èÈ'€UV}ü¦úZ’¸ê„¡2âäJÖ—s߯d~¤&v}ÂI›÷ûIŸco—Ãã.ôw«à{­Ô/&xªçNdûÙ>æ?bÅçŒ{ÎÊõÜ*ô)pÉËlÝX|:ÃS]]Æò1wü“]ïÔñ,ÿ>ç!5Žã©S—Ôñ òST‡A;¯³ngõBËz“q¼q+íŽëÎ÷§ý¬Nà½Ìý žÿÀºofIû~{²¯ìsÃ…b2á)›^^°†|D'»üÍ›Æõ½ùãw&uã§n»7°^íˆÏ¥¼¸)ÿçϵ÷††·vyo‡[â¢48Oëys\Ô’úÑoID?u—·?"ÿû)ÇÚíçÝ0Üûãûò˜¬+õ¾cžº­úyC.ç¯ô4¸­#?ýø£XVàXýù¼‡‚¶œ_©€ó,nt<ÿܧ÷Ô„ãÝC‡pu„¸ Ço’󿓸÷T!Ç{(ÕàšðŸ'þ(¸~’k¨;µ6¬ü™ÈsëÎÓŽWc×g©=«o ^Vãñ}Õy9̬dÏe%ïsZÿ»@~QtÓð„ws䥛ðK¶ŽŠºþ%«×i\v‰Óó <ã‡{ûy=Æ‘gH<—®|ÅûF0¾r×YÊ6ôÝ5çßÛ¡ ЈbžO© ækKgæÔuô»òXÞRÃo.ô LzpÚë6"ûyópx$tIOWþÖÖ𽾜ïËÑô›;_oU–zs]¿Ê•?JÔoEGµÿ úuçyÛÓw¢ULüç[ ø¤÷H>¥e¼øXÑkûîS&Ý ÔªãªóöùÅ÷°x¬XÓ;ûYoAäÇžý~SÉï¸ôE¶Ž³|›Ž7¼#ÿþìÅÊø³æõÔ›¥}HW'M9ŸÄQèÄqá§*ã'Vž'ãökeœ–Î; ú M~5ÎèÏð–¼§ÆëiÖqñs5ßù­å¯Ñþt¼âxúÂpüuì¹=¾Õx)|ÅCä÷Óo¨O•æïÅÉÔ—¼Ý¤Ÿ~ò’áC%õºñº—Fg-ª¡ìÀ¬ÿÆmÀe,¯öÝ}F³dx×´×[±LµÙG3³U²xÅ¢St[%«WS½Êö\Çzí#uºXÄpé¸gE¸üÃág³þöó×0¿“Ô‹„®šð¼Ã)]ÔyÔ™Á:P8ï æOœ$ï3èdÙÏuçClž·ÈqÌ-Ÿ°÷ö/4&÷óÙNr}zꯕë òäß½/4ý.7OcùŒÎ>Á»±ä6ùûÓô¡cÓ)ÛX_Ò)Ÿ°ó—öd×éÉúE³/aõÒö¼Þ$êƒOýºnÁÄH®?Ú6øýÔñ·…5œ|‡[á¡Æìç̯ÙsÜš÷täu¼Äp)WVÊûüý_ ÔU¹`9»{òóÂñƒ(g}_˜<=×+O™ò¿õ1ýRösu§áÇ+Ç×Íï±9u/(äïE7&HЉ„go4ÿ<Çp]Ùçþóº2ŸÈûÛqË5ÁýG]Ôß—-QÊx׌= ãh´‹‡7Xà9SþžÏûÚ‹ÙïÞ׎õµ[×óÒý_äòu£·š/)ÃŒ3Øó÷ÀÓu™LÁ‰ÚׂóãGÖ—§¦|,ÕÇnùó[C>¯ÆÏqé=ê¾›‰Ëê•_Í8Ìmw%çh¦«û‹¾xd'£ u XJ}ig4|¯÷ID|TwuŸ'ŽÇâ]_%çÏÕéÔ»š·‘÷!ñ<ž5¿Àˆl_p¡\ϺèPµÈuÉБàÛjð#y½ñ¼juÜÑU³o‡ä¡E-_Oz&ÃßÖ0<|ÐUÆ©¯ØñÍ-½xÓŽêÏiËû+òŠ´_Ýìú©1—iÿŽöøˆ<±þ¼5y­”ë]¸"­ae¿PûªØ—éßEߺ¿Œ§›—éˆxøuÐZ^otüñXt›ßôuÃa¤Ôcóå}Æ´>{{qwWæ±8q€Œox4%¸’‰¿UÞOïwÉø"~4w®ÌžnýªQy›M†ÛÞ Ü¯qv±Œ{›ù‚ÚŸ»ãç„—ÑO~ÆrÞ¤œái-®ü›Õ¾@ñ Zó®¾È|7| ^(z.ùÎt™Žs.l}z¶†×Æ]]—¯YuM,óFO9¯GuPQOÝþ¢…ÙO øo̽D½¯iôP”f\hgõß½]<ß\Äyj¿5¼—ãÅå Šç=š¨ë€è¡Æ%SOÊyåýó¬¨T¿W¶õ•¸Ìû–òTÉ÷A繚Žç‡uˆ•Oô Øö„5Ê—ƒ\%û'¿ wßpηêç¼èDÎk£ÎS¢Rí÷èð¢a =ØsK×Aï3ÙE–]<áíŠæï$UöÇß² }´ø£Õ¸Á‹o{ßÐÒÑ¿y² ö¥ÐÏÆPyóë(ƒ?Ÿ·9\ü¤ã§J™'ÁùÝÈ:Œ29oe‹ßüîÉûÛóx?'\ÞÛú{l­Þ/E>Åõº¦þ°F몂¯Ã{§añ† K*ÞBVȺ]Lý@P ­X>ÈÛêÈk<ÈNg(å¼^¤Ÿ¸v=Ëî"ú€“õS¾«†“^rzßD|…nj|#zjú"K ÏÆÌUVþ–1~JñÓvžÆq½xxï¿«†³á£<€ ÃÊê•G+cËXÆ2–±Œ}wÌi=Þù#Y=õW)óeË8Üôn`\çíÑôékxüPù4Ã5húèµ×±íSX5P¯Óàe¼Ýñà6tõíñ!ëMÇ^'çWN~éüƒçwzºéñé,r¿Œ£¾\Êù»I>îßåøõñ*ÖßPi§KçŸ×–ç㪃Ïß—þGÙgšCð°„GL×'Gùü0ãôòâ©SÔ—™xæ½oÒË/ŒŽ¤ïkK2ø ㇾŽü²K/Só3^ùT¼øÓj’—ÔàÕÓeNYè!%¥—á}®ÞŠ Ñ]æ±FÓôâm]MàÓP톡ý.˜ÿyp_w7Æ«èí“×wª‡à½gÙÏqÕQ±ÞWŸsÊq›ùz±¨7Ãu·$ûØÕOªóÐõWú!tqž7í x*/Géïu³äEÉ£|rÿ˜‰× CùótËGj¿sþ•óÀËŸ.ñ45àô-a~ó[êÏ%xWpˆ.*­ß˜ œ7§ï+ZRŸ´aèøºšÀ½¢E´}…ééËG G[Ÿœ5_qï§îÄqU¼“΄. ípÂX{ëÿ X'špŠÞ»Ür9›¯·=ÚóIõiŒÇ×~èyÿ4íÓ¦þÜŽ8öG®{Y–º”÷Ací¤euþíaCÕ8üR²_n ~(ž“Üt R®¿â”À}$¬€Ð½ð¯3ıoøc¾¥§î®ë×Gÿ`¼$n/ ÇÏew_mýçëw°óQ¼îà¬2Ù?^ÓÛ'rDðz„Þ\ÃQÄd)zî–< ÿ=Þ’ç“èÄy[ÏöAr]í’űQý/´ˆ‰ƒó cÞÆDò=hdпØÉýÔîš¼l3Ò§h໡|”×­5~jÛxx4¾ë—Ά³†Œgx!ª·ëm2ô—í•÷%\u?óÏæ<N­æ:äyÃ0–Wº-¶z÷Þ˸ïÞÓ÷-“þ±?Ϊ‡ìð훓å›8ÐLÄQ( ëý¸ÍסВ_¤À.…‹žj¸GW>4‘÷Q±ïad4ž?S¨ñü˜yø] “FYÕ+°@§õvpþƒ#ûËý¼Üx‰Ä÷ƒ"ù{5éa'Æ ùý¹,Ÿù~zù»qý‡¡Î «ëŽ®,žÄ(ÂSÝÆ±¾¾úpö=ZîãŠéxvcô‹I ­4ï¯ééŸN—!—óXÞz~¼uÍÊç9^@Î÷yÛ’Ý/E}Ùúø­¤ŽÌù¥ñ`DžŽËÁêà‹'÷QU¯´;ÅFu’óâìfj¾—ë7ȸ“C7„›ÿŸÆÒï@ã7ãuÏ­Wª¾ C4¿ñBe&òè"Ob}j»}M9î¨s<õoCÔ‚ê >/”Ùåð0‡õK_óÏ å½ÜAp——è>ŽÆì{8:ú“kìóÉ×Mv¿7Σ½Ûñ:<úÇ7 î#£jެ§R¡î׳]Ͻ¿«óG~mäýùØ”óöiÆ3ð/SžCoŸÜ›„§%_ö+èÿµ×/±{ŽPNÿÃoN¤¾€Χ9¿‚ÅãW©²ÓãÄá2ߌmý—šÀõXoÉÏFy“ë˼-œ7Œè΢¿†¿sÆÙÏ«¹†õã{n}}hdÀ|ÿ`–Ó)\ÝX£k‰ ü<%^œ¿ZzÏE½yÖÙéÑQ`T¢ý¯B÷OÇ;–—ÜÛËÖ17 œ¨ó¶žGHÞ ¬+`¸àÿ¸QÂÙ­;2˜Ÿuqß@¿VôGx›äûíý-žøƒÉ~;ç+æo÷&õ…ühþ·àÏ6Χ±Û:ˆv<þɃ„òúÁ¹ë %éÍë š÷SÌhÏxÎ_V__𧥜Æ^ÞŽÿË„/s5ô<Ã-ïÂu°(O%ú®TŸÅ×óÊàøÂÛ¯öïðƒžlÍÓð™kø)RŽ[¹.ÖüòÓÓOc«S" ž/KñóºÑç%GTAüß{vÄâ/¢’ùíèÇxÈt|SÞ.¾mäùŒÙ'[íËXûþ±ðv¯ŒçzôNåókÂczÿlØñ°ÉPÂqÃÝä¾" ázfc_wëÿøí™¨ÿPy×õ;šø¶’6”ǃ ô¾âuë+Æ…kA Ç1RÞ¯nñÄ“XzS žC¬ þñ‡>“ZÎyé¹yM0þµ'ѧ|ˆ O¤Gtyý¿W\“¨_‡_­Éºšm_“?ŽËѾG}“å‹}M˜“ǾçQïªó˜†ú+:F{ß½7ÈxyÁ÷ÑÛ@xëäÔpÓ¥‘ü1ôPë3ûÿŸzDzuRîü£]~òoɬÓXÛZot›“è~1ŸÃ5ú"ã¢é«áû—ó ÷ ;òwÃPfÇs‘1;à 1\ã…¼¾{p½ÖûÇ=8y¥ôûÍO°ë\qËïžÙÈé{Ć;C)ïçÿ°Ïð>Â}¶Ïxÿ\¾e¶iÃÈ×› Å!ó±?Ó_©ðwQ¬ö£±üNö¢#"ÎóþMøuÇÊÏ·«HJÞºÒдþ·,.¸z¹º?lõHu¿Ik®oô9ï'.‰–Fqýèøb°áʲŸË?v«ÃˆºÊc;Â=ß[5ù·J®÷ø–úýÆ´‹Õ?†÷ñ¶ãx•vñèÉàŽ¿©q/q¼ôìñÑpç_ò|N#¢£tãC7Õm‰÷wìïÕŽS©Žg´uùÿJŽ[{ü'l½ïs`ã\1~«O¿7š‹üdÖ cx Û>GçñÛ§7Ÿ‡ZþóŠ£Ôï©çª#‰õ'ÕÔå¾U?ð†Éø³6„ÿˆë~Ûîo®:ɶ†™!u•Þ#x˜CvÔK_$æ©õ"RŽ»X~ÄñýÓÔz5b=§áŸ¿ñˆ\c¤: ¦ïÌ3ˆyPžATØ}_¨´Ó8ãxÇÞ+ç‹?2ð½ Ï õ¼zÛäçÊûÖ.ŸGûe0sŒ?ã ŸçŠdq#˜{¨ÑÏc©“©3á§:Ï««eôœ[‚y6éç) öC¬õÛYâÎn× ãDï³eè_÷ÛGòü|6]íôüèôäpê]ê<‘úùÂ)ÃíúU‡¯¤[†Æý¤AÁ~%Öúê\w†Ê†ÁÃiÛ¿‰ †ËÏíÒG•Ï'Å ‡Ís£Â7Ë'oé}ÄyÆžZ¨¼žk1®Êáõw@õÓpÇêpý¢#d•¤úo] •Áý¯h«^½=!qƒ¹<5rDƒêç¼uÆãÈJ-ô5½wØsíªÓ—áÌa Èý+ŒV¯ë”N¯5ôx—s;~q°n‘‘çMÃË«Ëÿ`âl§ùE5m¾«ëÑ‹îŒgtñµþˆ5‘¾O å¼]Ÿ¶ÊŸ ¾4œ·IÆå÷Tó ãžßºw·ìßñ¾¡î<ï|Ë~†¥Û‚÷½¹'1žÞž!û08c/ ^¯bù&o3çÃyƒã¥ŠÂá~±z»OÎÙ“ÙÏ«?`xÏ|Âõäà•u?vd?—<›·-Üýr5äqÞ­+vÆš§£ü}þõú%SOCǧŒM†}x?DH>C´#üÈD‡Ý8~ªDün——}<Úëæržì¦éÁ¿ãoØçh£ÁG€×ƒ*íâ~Ûö7ô¢±Û÷o›÷@>‹?Sú÷gŒRë{pÿQ§7Ž^ê÷Û¶¿ÚûK8qï—$O Ög…“ï–ñ},ûï/($¸ÁjõûoÚ‡m «ž‘ëÀûyQŠÒƒ/AA´÷Üï&|¯è§Öí ù} ™¯#}Dþß§/gû_“p÷ ʼéš>ÝÒá½1Z£û©Áûx÷äÿ£Ê­ïCìxÁ(ÝÕyt:Ÿ¸MËß´‰ã—‡¾ÆâÕ êõÈûLí‡ëú°­ç¥ÑmGãxë·è Þ7Mylo+ï'/“ë7Þ^Â;³‡û –ü‚ŸÞÿ}^ð>'žo§F_*]×Ä ‰¹LCǦÃ?aî*ö|Œ"ïí¼ýë¸àGCóôàþ…®8ªØzb›ßC[²´âø‰®†~°Ïx+ï×Çô|eüˆ„?¤0™¼˜ÐòvÇãÿ¡3ÿ|¼ˆ­_BñÞ¤€ë £Œð±¾¯©ÿÅ<®áú0ÄéfÙÕQÎó®ÙWÈqøây¦ï¹xÿµŸŸôOã`Ö¿#òi)Ç?_ćp¯ÝóÌûm1\Ý¿‰bMßç„'Øz—ÏïcÏcjê!a cÃñš"Ë.ïèmÔô»‰÷ô Æ?…ÁìyÀÃÏ×!'ÐHøYü~ŸÜTÆ%xö þÿá3¼*ï[¦~.:óqÛ’ºôVòœr}+œ{˜Œ?,´äçyô_ÉÎãz)z1y”ÿX§ì°Û×´ó « ð™ÓÈ2nâýé(‡·‹úªyk4¸Bí¼8¯;йÿÕÜ€Ç;„ñ° ¾;ôäyÃ\;¾×þû”ùмÜÂwÃ÷Wô6ðþw ö¯QÅów$žÇðëØzôÀþÃù{8ïŸÐY¡}ßþxcÔõôf:ŸèÁŸ—FŽüþÍ øÍzäŸÏùáÑÙ_W®.'xÇvP¯û¼/Ã8þ¸œßÏ Ã÷šOº3¿ù†÷ ‚ãps5¼Z}\¥\¿xº¯ßÕ•õzïÏ‹eœ*ø:ªÉ3`@SõzµêHöþjx)h^Eèï¤|Ží¤~ý™ŸQKp𣯠®{4Óô°ã]@å;‘ò°(2äùº½Êöí<õþ„Š•òï¹$ÿñäÕm­ü¾ê¾Sÿÿ½8ï(×ÕÄœvy³>|?\ö>áëONOÛ\ß{3\œ,pN˜¬Û—.C{®E¿mJž«§&Ï3ô69ލ°{1ÈQ¯³@ç‡ÖuGV þ-îêñõm²²Žÿ1ý£‰·YÜ/,?ÞϹâÃXüy æÏéÑ_«×ãlçu1Ô/ ý½¶Fû†ýñ©^±é¾Zê3¦¬?mÒ)ýƒ#ßí¬Iõò~‹xÃÕu|¢ãËÜ­‰g‰¿ŠîÉð@š ýxè¹ËÔŸëk¾þ¬ÞîTÃŒO×!ÑoŠ«û¦·ï3‚ûJÚċ˼¨Þ>î÷?vÑJåu_xº7ã#¼ZñÄÓ&ô/ÙüDyÙ¥Éòýßò°:/ÞKö?PÊó¢ïg¢¾b}ýåïÞWt¯_þœ¤Màx\õ¸‘­…–¼¾²Ár¿õu`>#ƒqy¶æý<\|]ß<ÙÔ0°•GmŸ¸èoÃ$Ê{ã_¯4æñšðõ•çoM|ÚqÎíÃú˜u¡D~g|ÌG3X®_(z$˜þÿŒäùÔ^ ˆÎä@7ÁÃk{<šÇ/(gu(]~Þöùü·GbÌÇ5#¿÷u‹ãýëjø|RŽû­ºÞ„âpñú©ó†´O—œoǃ†N®3äçõ$¸•wDÓ«¹õîà¼nþÁð<‰ºÊß-ýe]Du×}^YÂî}aW‡ñÇÍÕĵÒ?Žã»\ëNI™«¿fOó}XŸ¿£~ùŸ½­ñð„Äe‚ÿ§ `~È- Ù>™ÃñpüûC­%OÒÏT×1Èû¶îkü<Ûõ^S×½­òïhÂu)j4u•›&Êø§c G¯a?tãËÆùo¥Õ?Ae8±óušÄÃ×ñÏ0üøØMv}¿ºuu'9îèÊóO‚ów(¯C9êjîFÅ“oÀ¢“£ñRÄÌûšàï_ä ÐÑ1¾ª‰'ŸŽJ^o¼n‰¼–·Mƒã~ßïÕ2L§ÖRø}{‡ó›Péâ‡\êvM„ûsaó!¢®Ÿz}ž×*áùGžW÷vr<ÎR™Ç"E7,7.'lÇï¦Ñ'6ž7󉚷U§—’rÜì'Æñ~˜µ«”ø#“¡"x_Ðñ<øyųvºñ@~›þ­6ê}ßvÿòÇ“Ëp}Ånû®ywÎt†³9¿£ÛúzC‘šÏÁ€cûÊÓ«ënktF6_—w‘¿“>}Ú¯B µÁ|&Úó.eD ¨bqÕcC{ÞÀ×M­ÆšÌ‡¡ç…·2\Uµ[ ‘Ç«S<}8Y­‡Œ*¢ÿñÀ­ÓÉŸ.Óéø%•¿§¸$íq Ö·ÙN“—l¡éãZ5!޹O~÷`¹N}ÝeœIu%05?­8†þno¿ì7¡U²¸Ìßà–¿iÉñŠ5a)} ¤ß:E§ì†[•û¹ ¯æŸ0¯qÞ7ÚO„SN“וµŒ9-Þˆ?_ó)ósøMÝqXR)?Çr|4ï»2õEùŸ‹öÙ·ÒôEmÓøñ›^tásrX;»| N}^ý¾žü>Ë®ú¶(ûPʼ5ùQ,?ˆíëbºÎNõ߃XüqØ=l¯å}KOgõîÓþ_ŠÓ÷~\·ó6jÖ»"žo=¿”õmtXýñ,u'ýã-ýy¡Âíxѧ‹bù¹ÖõQ'e¢^7žAV]O¯À¿ÿ÷:/¸ñö‹~MÎ…É% €žÁ¼e8óÇNÏ+N½9T¼íóO âqÏe‡ÉÏûò¿ÃvžG*ò/:~Lʶ..=¦aá=›ózØ! Bí»:Ñÿ¿èÛe‡ûÅ!ŒXBô ¸ÎÇgïGÈ6Á?ï?ü2ò{Ûàü3^\þWI_Uè¼URï©­a€æóær&Οÿ•G¾Ÿ~,ÿMñ:8¿:®!úÞFõócªGë «.Ž¥~Fût¸PÑÿ‹µ£ãá÷|Ç—©ã_v5‡0ÕÓ´óËÕà)4ú?þÿ I}· k:~fëó‰. ª ýKûŽüð°W&ã þ÷Ù'|ãKì9+!}³xÞkYžÌã®Ñ;AïKuÔ ø «õœyÊõ,ûÞã2œÁ×MÞo'p+ô8Qô': 8¨DŽwó"ê1hꬶ†‰·Ëõ>Ëú1zõ«¾š¨¸ÓtÕ­‰}üÍ„—á…†¡÷.,*^Ó¤Û”´áÁ_I|ó¸{»:߯²ßaŸ›ÿ˜nC n£Kzø©pâ݉¾/¸òy™¿åaKþ8â·aõÛvüã'°ü× ?s7Ck·}]åzšè‡7ÅmF=”,ŽêÑo«ûâ4ºEÚëkê¬Iíkñÿ¾¤]4?Ñ?Ù:ØÝŠÏԎיçW‹ }ž–qhC3ô—y\P¼o¥ðª‘þ€Mnñþ¶q"¸¸6÷ñ"ûÙŽó ]÷7®ge©#<÷Uåq‚Að‚úç:€qéúãn ªË3.ù›úïíy4y !ßq=Ôô‡¯Óšà´IŸñÿ®ã×ä<–‚_‡ôkèøFt¸IÜyv|qQͶ¾ˆÉ[Xœ›¦:í·õ3ãjâW[C¿•ê¿kžWt·ét5“2 ’qnèm÷þaQ¥Sž¥†¾“o‚×GoÑ×k$ ÿ×à·1m¥ìW’>ÎÇHy¦Ñ•ñO£H}ŸÅ>ë½Ëó¡×6e¸ÌRË<Åø7Y¾«Ozúµmû0{T½ÖémÍÛ¤ÖÇÀˆôæaDž eéÁ«áþ¿S÷/Èë&õch_f1ü¸À³¡1¹¼nO÷AŒŸÎp”\ïmã¿qT3†ëõ¨ºo¡‹z=ÁHö>éðθ²Æ­¾êÈÿ›r½ ™ÃƒRK>•¦ééOJ¹nÛàõ#˜^¡«.XT£8Ko/ÏÚð—EÜß3èâ¤ôI\0º¹å‘1Ä/i¬CjxS޳ü>lÇ£†cºÄ£SVÛ­‹ß åס¬~qcÔ´ziö…¾³óy<ž0éÀÙê™ £¾.E§QÃ+jªƒ»ê“Q#Õï©mß6n>?¸o\Wß×ð¡×›$?cÉ›3qʼ4¼r¶&Þ4%ü$ß[íôž FíÔ—¡©ës±té1èòÞÈâúu9Ïy>0Hý\âœÇ‚×î_ãüÛX|s¬÷™n0º>Ð~5mÊ8–ú<ÔÐ=\?¯Žw T«q ÝÕë³-n?cÁ–”nˆÉ°b ÕLéÜWÕä)…iq²qfJNÍ~¶ÙÀç^=+øóÝpR¨x§üƒåM9âÿv¸ùK¨‘G¹Ü÷.ðq8KÍû†ûÞ`ñJ/‚ä8Œfü/ßïë‹Dž·¶•÷ÏSú°}µ½[¼ˆ!nºÃÞfGýGþC[Þ7TÆ”W6à]pIOÖßSDêB?HâE&÷ù¡›¦îÚÞmþ®<>¦†ß8e>Ío”ã÷ì“ÃýŒ¿ñ~©šyn¸è­æcêŽ3ðc»š¯S!øqnù:o<öƺQôÝ?àô½`ñUvuJþ¾7­þÉ ÎïµEóÿ ·÷Ýây¯°ê™Ÿ7‡ä ×ÿ]æçû4ÜuE\…¥Áy Á â:¾õ<õrÑÔÀ[Ëû±Ÿ«ö8M<ÖÿFq¼|–‡ ýÃñuÙš÷­!ŽùP£§ÂupýL5_7í¯sĉꮋuÙ*y² ýØýwÉõ§%÷Iϳ®ŽŠùÿQã ~œ­¡‹c?cD<‹q|>@\}BW·ü"TþM ¾oÁ…ÒsƒrÃs1÷òàüá¤üiÒ+ÈX4Cwµ¿Žf<.z#丗Çm8º@®ToLtÿD×±Á|ê£ØþŽêd÷ÑÕì®fÒñL™G›¨WäãŒØ©¾‡Žn~¨–_ãÒ•¡æ!üR“îžõx!q‡È‰v]L|W®¿îây­â¯ðº"šjúOæ\çô†7uÓ]žd·ï ãÅ5ï«y:ýžÄS‰+ ÖǦyÏnò>‰6¼>õP/ö¹ŽäylÁ'ÙžÇM <]å‡Ëø&eÊü4ºc)ãgóü£—Ž.!yr;&8?=qºNAùgÆÕÈÿüìúå‰ËЄë‚–ù=PÄq9Å~­¡¤võ»ì9kÏñH>Q<ýê^鼓ÝüJL=ÞN÷bñ:Ëÿ·Õkxh’ÔHyBc»Îÿz³jóöÎË6ô›=òã3¢ÜÊÕ¼×Ôþ9®ÝjŸÂª>rŸÙã4º°ŸûS/·x¼Û‘û—ùœeÁyáêŽüþ<î©iÐuG Qþçqã"ißsÍ÷èLôƒÿ÷znu=\úkÖ×2_)oÿ?—à‘¯½”Õ«8°¨×øÿ?æÊütÔ¼µÎO¥ýо¾x3®Ës$ãLÑ{¼Œá¡øþím3Ô«DßvwN½¿îu'²ß˸ŸšGîãC¿yÇ ïyÊ.æÇm$þÕ‚/Hx²ÏÀ4–oÊçqP{ ïåç_ã„oÁóØ'S'Bc¯„N—¯[2yf >ƒ=ïôy³äýïÆãß¾ÎÖŸÚàçΕ²ƒ¯ïµò{.psXÃp¡8fµíTb1ooL|w•Ñô?)~F{œF×ÌŸ× Ä²?ÉûVÖÉ‹ÖPv`ñô6t£ùÛ†nhOü6®³šžxñ¾Hù@ï MßÇ»nû$f‡»>†ÛåÃPÎýä…צ•O6eˆ^ñºÙ¬?NðóbpŸÍ[ñôM`ÊÛÊû¦ãñÿOù;kVÙáêKxüß3™¾êw`I Óm ~:ßÜj–—Óô­ùÇõ Ƶ *"S';ÿM«ÖÉ’w”ðÝùxÿ|àùíë‡×F§„bu^RøA”_Í ý(!ûmt¦‹·0L®+â´gþ@ðš¨ÆÓˆ~˰óÁò•jY¾~ˆñÑA§Ç ðš>§‹Äôê÷D‹1 ¸¾n« (ú:1«c·FîJ¨ß cÕþ3Öe©ï+áuÐñ<¤‹ÿÃòÍ÷û×iGÞÏÞŽýÀ]’­KèxKo*Ê,uÇúþ)¿°ÎÐÓ€³<—¿ÿTo§ç¹¿‚_Ïûœçï¾úná"¨ÙâD^þ%ÁχàGCaD]ú2žÇ}Uî4=0úÀ… DÔqÐÒ‘¿œó‡ {zuRpýs¡âkŒ²Ó¡7Y P—ïVþ=?`§†¡¿*,ê>e‹gÒžOuczÿÒeÈ ÇcV¿ çîP÷}?>,ùºïâµQrœ@óa:dïjïfq˜†gÓ&F‹çãKo¯Ý{^d½ëLîC¿hùü¨fëß¡¦›ïÿ×¹ñ}pr‚‡ùšç£%ÉÃÕÄé†~XS|ìíày€ ^P×ÛJ u¿óÖ5ÈõN§Ïjk¸ü÷r\Ñ‹çyhüLú:]ñÅÈM†—$çøy›š9\'ˆä7×ôc|èuJ’6ÔF«ëyŸž¸wxþ§I8Ü·®?ÁŸk?"ÿ‚ɶxûCöç÷&|ó_ô…r8¯ðÆ6͇ó?EDe³fݾrºï<ï‹G{M~ó¬%i‰#ló›Â01[¾ü¹ü~‰çm);Jërã.³ºXù}u¾óõóèí“ß“½¹_èOŸZðõ£ŸºO!e_8ò›’yR.o3ùcv?„ìòY¤ë–«ùÉ]õ0¾±š­Qðó„»úò5}Ýû°†&në0š \Êe¬>Ö/^ܼ*Æ÷óþ ø½-VþÌÖh^Äú<Ö°¸G„‹“0ãuüÌû ©Ž‚NWÁ–G]I½6$þж7E¯·:š,Öuݼqêþxt\š[æÝn•n¬ì[Á£=”xiä|pB~¦ð3tÿÇñ¬‘…š>ÑîòþAõ(ÐH=oúþ [sGƒ75–ªõW]Mèsz»9OòŽxêÌbßÃò¢Xóp8êI7þ ŠŸÉJo}!¬ ¾ LuÓÉú®š·Ñ’W.&>,¡’Åm&¿mâ© ÿMûÿÞ|û~õÿ;hôlV°W“ã½_®¸I¡?[°Ñ_ös? óx#wЬÇÉy0:qþ‰¬ˆ8ºskƒq ìûÒñIZ_§ŒíWÆüo̸Ýtåõ¼o9nƒ¬(Œ7‡lÒW6 '?΍qÕ¬Ÿ ÅáòcBŸ4,ÿ¥ÏÏSið£*IÿxûpõQ?ñ9O™ß˜¡rÏŸò77kúšPaoWLûY¾]žÌ¿.ÉŸ~Œ²Ë«à¤õáæYi—GK9OèÌÛšLÕýš¾ƒõOM’ülŽó@ÿEzõ¼uFã ŸšúêŒãï´Ô‘OS¿õ'Pk×ÿ¨ïOþÏ7b™fÚ ÅÉêy¡ ǃlq‹üóWý^ÖGÝhÙWVAðf·àª£!úÐü|@«˜ð ‡|-ûEs¶È¸Ðîvëîûg<ý çMvòCÐÍίõñü¾†_È·£PìÇ¢ÏÆgz®Œ×0ä¯Å{LõÙPNp•Dï4壿I;¯Ë¶EôY)__ôƒO›&Ï»YpÝKnSójp'ޏ/“QþÛþR[Ã¥qÊ›Š~°¿”Ä'&þ-¡ÓáÌӵ̿ILzä{÷]·~šøµüãBöiÇ{†ðƒŒ |'ã9~£Ôî¾ýnÝÿÑØðÿµUßé~cjè.ïW¨|>žºç_D‘%n-_ýÞ஽rüÔ™ï­Y1…ß³G<|åøÞYn%.C×›‡qoq´:mU2|VQ +ÎT㞨¯køD0r?ªAŸÙ¤¿—yßœ !_âãÙhýn•ú½«'ù‰æ>^»€ôpÿhT°^‘¯ç˜CüÂ'[µ­‹2¾~?޼ë9õõoŒõUðºœI/ÊÇØòÕ´Ðô}Öîü…ßcx™Ÿ-¯C ¡–áPÊëPK^ÖÇ õGŒàø›¯bëü‹ÙUÆ+ŠBŽŸZxŸüœœùoöü|ªö_ýþ›¾r½•Áydž3Ngý¤ºÿgìÀ0ä×/¾ÃÛž|«g•÷+)³Õ%Öž?Ê-Ï…|ß|o^Kgl¾ÜzººNýìu„Á8aËGp~)ÑWwNM×ç€u/GÒ¯pžÇæ`ÜN Ž'ÐÝîûÛ'U'JÄEþï=äxÔÄ,úÕSü¬ K^eÍ:Bûþtay:qØN†l7U«^gÐGÍû‹¦†¼£&Ñéæ„Æ•«Ñ!ëªé[iAúˆ’î²å¡BNÄ}¼ŠðKXâ5ëÛ\ñÒÚqæ²F?¬žËê'š¸«~­x‹üœÓu–úÅhc·èô@¼ÝÄáy0Ô,QçºüƒBÁ³è¦ƒŽ‹pã»ÊÒà_û ^žKtKô|]ÂÙUŸÒ÷ޱ²N‹·KSÿ"ñnËòbî^£Ç¨ï>»õ(.C‡˜ù&ÊH}¥=çÕÚËãÙš¸q ãkÛ§€*¿~yýàGÑ(xß°Å/»âxSúÚË,¯ó™¥þ—ë{¸Qý½ ^F,«Ž5N1éQCW7ÿy¾‰¡v8qÑú¤¶¤é¸²¸tVQh‰?"xÌ¿ˆ Æ3þ(ñý²Xæ,°äkÚi˜ÿ€»e½Ñ®¥2~ØÀ/›¢{_Q.Ç¿ÿ¡a_\ó{ÖO´øƒàzŒ©F§óZfX¿>ÂØ–c÷¶Dé?‹ïOW@ ©»ßÁéþxßr>¡ Ƈãí$øØ!lßE÷Rõç°ä×J¹.ß¿éùè¡©ãñ>§\îw”pš?—ÞÿïÄãñ"Žˆ‹Á™-Õyó*g‡3™Ã•Rש2|Ï"Îó¾B7E7Ÿ”ó›ñûÍ÷;‘8Ø §‰ófÈqIÇ“hú&qÏ%¬_¸¹ü¾¡wð:’2ŽÐþ±ÀC{·ÙÕÁD]U£Gè_§œèðûŒ"ŽCÔÜLŸÌîg×8ûÃÆç•8~Ê_Îý<пƼË>Ù è}iðOÛÓ ø!QJ⓼h¼ŸÞ –yãÜpøRÚ¦ÿ‚Gd¾÷'Õç§ã›ôçScè'¢~¾Q¢Áq}ÿ+p’hÎÞ>ZZ×EžÎ{Ÿ¬ÛšþÙÈó±ì'E»hy+Œ¾?¼‘-orÉ>lè/ÑŽÓX“÷¨™¸^ãòIr?ÀÁ\/±Œe,c ÒpìR†Ÿšñ”ÓºŠ!¯0?ú¨hq¯õõÆ]N'ã—áðAÈ"¸Ž#@ï×tÔ­ÀÝPû#<ߌMþ#ÖA6‰4x̽Ãþ¦o©;n#ºnWߘ–ïý»bXØÇ)n¡8Lc¾]SC¥%×7¼e\úÂùmÿhªËø×iÄ.zñ¦ò<"ÎÎÿNöÓ¡‰!ßÿF'ÂP›lÿ‚·à¯³ÚGh}<¥þ½¬KpÜÐWÆáÑú)²Øûª« Ë·étÉpei¨º‹É~Y7”•]oÿú–|íÞvG]”œd?ª ý‰½ÈÐ×xf2<×ÑxùRÆk!ø²-ñq{yž³¡^œ3ݱ/µÓCõ-ã–פÏå}Sßø)wؽ?{Ôû†·ÔY.n\_ëDðYyÉòã Ø'd蟰¾n‡hyCo[¼ºPÔP~`è\¸š·Qç½=ÿ¸Máú¼÷Ó»¿QC¯3kú&ëgpùÝdùmu´Ñ‰û9¼N†rR/3èjt³ì+ãõI4‰·ÕX¯mᨇØÍPϨdúãÏÇ¡_ó„lR÷-^Ç£òΦ\лv:Ì¢Î^Ïõu:3TgµuzŸ0ˆñ™ 1yÞ{ø©G®Wî´¾ãífq½èÃA׈ýμoÒAÆèàùûóãþŒ®/#.³åï_ð`XOâ[ý]ú¿—'ÌoWIâuKý¤LàÎДûŽ}TÞ|¼ú¹ò¶†ó{u}.ÈÕôùuã8ª>!ë»…ügMLõý½Áþ¤à»«O¥÷}»¼†÷µ›‡,×QœÕ¸Bõ÷¿‰÷ÙT~¬þ>ç77ø3ÃBõ¡|¬Œ×ð%ØòRø|äyñô'‰¾:ãuIž ]ÕßÊ 8÷šø`ÌϬ®tø4–×WZïñëÃuG4:JB‡Ë?¾½£nsž¦¡Á‹`ìÏåýe+ÇÝp|*:‘ùô¶{½ýD_^£G‹NvýÄ8µHŽW·DÓÏÁß%Ò†ÒxÖ3´Mv¿n(7ß¶Ž7å>yé±oh0ó/QHžsM¿hܺ€)óYv+ËXê>£"Þ>ï[»÷8,¿¸·-Þq<&×™Òñéâìéòz?HXxe><~~ˆ·?Þþo#ñwÚÇ3.:ðxlPc5N¿'é_û6Ü:ˆCƒùŽÓ–oÂ?¯üivß+Y4†p~Á¤¾Y¡þ|:³ QÆûHÝ=4ºsÔqlC±°yç”qö…ä#å}C¨tû¾¨aæ`¹ïÇ óæ¤Oh8W‡ÊýBè«ñCòŸ™ yñÔ{\ÍÛfÀ±·ˆ—‡ÁûÌ’/]ÃWë}•ÞüFÜûµÎ„ÿ@ý÷¨fâ]ˆí:m5q^cÒ¯”ï~IñŽ ÝÐ[Ís·Ù¾gÂÂòy¥\wgH¼ÜÖp<ÈJÏû™näϭÖ„¼ßdÿ÷vļî´ÕäK[’ý× +y3Öÿ¿XÓo¥É£Ûò½<§-Ï1jXž%ÄÿÇѱ쿶}Kþu z_¹¼®cÀE¡Kzø†Ð)Ùç(åzW>Çx;ò¸vw¸ø¸;ÖýÐÕ("½¢ôCEEðv"‡ç)‹Üò9Þf7ÄÛi‰»ãú5h›LŸ"5L üµ³Õý$XðwµîèxY_!…ïHÓO\߸h4ß?™ïfÞ_²ƒ×÷ ë¤.o…> {?Gïxù*…ŽSŠž«¦Nf[‡†Ë侚Î̓©ûñçÛá[RÎkÂ?×N·<ˆŽg Í’åô¾®kàôêdqØ×EÂkA9lýtj"<¸ }Ý í½ìˆ£p¬ÿ[ϧ9y_ |7)ç2˜'lÇk•jt£çM­×>2¯ñ™ß7^GÈc_’óâ$Dõ$Âêf†5W~¹tZYâP 4jÙzŒÅsüÌh-Ϻ`e8<Ä”ÌO, yú¦†ò×чÇ.î-àõ4Á§T á‘zö—uý]É÷oÉï‰*7é¸ Ë8L´5øýy]äé[‚y‰†ýC~Ÿ®þy0îË ïé3\—òÿß#Z½&e^œWç]\‡˜Õ#ÜúÓYŽC|Þ+¯æùFa<ø+þHgÁyä6ðßg¯LT'}øûx×5nèLWËÕx$ïM’WÔðõ鯮^!p®çÙÎ8JÆÕkêša sœ±h²Õþ†6áòy¦8ÐUJô¥á §ý^œ´Ø©>­ã¡ÅÈ«q(º¸\ä]½]šx^ä­ø>¨Íûèp„Y\&Á‹¢”í;˜Ìu6Ÿ ~~ÑÍn¿ü ~_ÇK|ý8ÙÐßÏyãÄú€ãïT¯Ç<þ@à})å<¾hUk9ÒÊÎÏB^Ìzëµüû8/ø¹¢æóJlQûII›©/Ƈ ~Tï·ÉÖm±àQv=˜ë¢aæíŒÏÒ±>âSÄó¡Ý ýveì'ų¡5á‰;‘Åwô>S>q#s÷eNñ¯÷÷à ³;~‡]ž]×7aß²?Ê¿Ž£>«¡©ËM?Aæç( ~~Ð'X'ÜÛGúäBöŸáò&v}e‡¸õÿ{{ƒý8Ä ‚y§bûµIß§.÷QýÛï ú%(×üýÖ•jÞ®—μϿ›ýêËXÆÒg(MV—¸¡˜èkªïyd,cËXÆ2–±Œe,cËXÆ2–±Œe,cËXÆ2–±Œe,cËXÆ2–±Œe,cÿ— }ãé k¶< q†ÛádqΙV}Y)zz‡"ãÁOÏ•ðó8xS0Oùé1ÞOÉuxÿºm¤­ }Oï+ ®¾¨~úêË_«øÜ®¼¦ÔМè®4gød¡gŠ" /¢‰G]èW¼É~æ%£…›V«y ¿ÿ2ë÷Ùa×G„yÁšYêP]¹é(çåÜ¿‘GÔÛ­î#F±ú¾yohtUyîýóò8ÿ×OîüÿÖ=¬.Œ¥_µrÿ:ðë4•û;týQùéÚ·…ð\æð¿ó~'tå:E;’áéð¯Û™ô }£^/pO3Æ7稓ŠY¿‘õ÷}o åÿð¶Èß'~ÐÎŽW`}ÛR%QA°®f¨uB0ã]»>¦âà~$“þ *íú …Œ­ 6·³RMð1‡æ±;¬·ߨ·oS¯o\ß ¦NJbú>ˆž€nýÖñê «¥ÞÙ>¢ó2šø§îwò>©+ð±Ÿ$>Ö­P¯+'T•²þâkþèö|R~;]ÿõª_°ñÏþ5ó«~¼ç¢ºýjñÙ¬º?ï‹kÆý¯%]å}â™Öÿïu/.~¿¨¼[h¦áÇ0ô§¿•üþMpŸ&úů 鯭•ùìlu;ÂÕ‘ƒéø ê¿ =FoÜgŒê†Ís% MÓÃÏŠ"5¯¤àuˆ›'ÄÛާÉûœë`¼¡ùÄ8Òx}?ç[nýÔÈuó»Ñƒèv‘ïãžôu÷]ø•ÞÎàë žo ÿùZ<ë€ßGßñ¼#/Ü8#ë©âÊÍ‘ø1„ñ ÓüBÊq2¯åóÑ}Ž…~†#¯8ïÇ—¾„'™”ï£ù'ïÕxùËmÍûÐwáÿ·õw´ãpÞ(œú¬Ì;pÚ ¦£;z%û}ÂbÙ«QûÑÔ0sOàçÀ€GÕ:7ŽüN‚ÿBÜ—¸õEpÆÅVyÌ>WŽcyŸ*θÚj>sÌË8tÌÇZä¶ž`|ýò  ¾4º€”—-x>ƒÇ%4Áúòsxû_:‰K(ÿ¸ÿw ?£à÷·Ô?Ã@—׆ßwþÜtª<ŽÇâ\dkôŒ;Zò¢<н·k~Åâƒi/Èù£×HÏnîK~M/á¨çBÕWlõ¼w5¼ýò<¼ qi S;XíW-˜œ¨Þ›Î¯2ž÷Žús¢‰ÝùèöfƒàõAëôò²ÛÊâ‰k¢øžqúÁ¡ü+š‡ÖüÚŸøãB¿Þo~Q¤ïâ‹E¾ëÿg•2¾|³yœÁy¦°õÓ¸ µÁùSið#—×*ñÞ/¿¦«¾#ºË|™Æúz¡]þ¯ó8óøyl}´Í+êðW˜2*Úó_Êq_×3Gq~XMÞ W)ý´qÌG=8_ºÿÈ ô%yÚ¯Ôu ´Œ'‹|õ}ñ¶'[O k󑬿— ¿„LãÞ‰e_¤85Œ$qc/ë’ßÉzÄ_Á Í:TÊ÷½=vër†ŒŽšÏsá¿bÕs¡uà”ÿ¿m—gú¿jI×W3–±Œe,cõkÞöpzBõmIãÄ3–±ï²¡*žø'cn†J·ûŽãïg8Œ¨‹gÐ.ZT{ɹrWÕ½V8P×¾.íõs5uú^LçĤçS_†r¼ï½Çñ[;ñž¼ŒÉ(Þ§¾ ƒšªëJŽ8Ù¸M×ÿaêE§dðfèÞ6‘ú?κ€á®.~–Õg—|ŸáṎPT\šsüÃ.Ž9s‡:3€Õ»EŸ!nüÂMGÉÇÖÎoéP7÷'^Ç8ã¹þ±ŸM5ýDÙìþ"Ÿãþ¾%:¼ŽzÊþyoß¿àxì7‰NZ…g€–\ON“ïòöðãz‘¼ã䳘îeÑ)ß§þ~¼ƒ×gž¾¥Õ~¨ÓúZ Wã}åÖ¿Lõ1.Þuýô>ÖṞ_GòÜdG«+ #Ôøgçñ:ZêU/ý*V|Úû1Þ[Á÷ ç=¦îÛ ½N“dü¿ú6³uÝ,ñŸäû°ÕôÞçëó6;¼ž?¿[²õ}¢Þ1.Óõ·RC‰z½ uw]¿¦·ÙÍŸÇ÷»éò¾$ô#ú»Mø÷_?À›y/³ë`–ŒßÆ ÌO±¬s ‹ö}ŽêÇ'x%ï=Kœ¤&ÿ‡Ãú¨ëõ£ï¯ûž¼ír=5r?–Îïö?·Rþ>Ú¿ÂIùûÌÓ­âBôžãVßÿaQãÿ}ÿÇžO¿÷ÿþär½· ÷;‰Þ)æ_¼¿˜ú 9nOàóiÜ";§.Ž¥î‰–}%ýhÚ÷¬=¿¡~þÃùñø æÉù§Ç] Þ‚¯Ç8{šºæ¬f¡ð¸ùJ9®yW'ôõiŸí”*Ökð7¼ÑÖWtí8ûÉüëEé6ºÎþKÿwŠwïá¶èø“t<0þÿÿÆ÷Å,M>¬Èm€£”ùEL›ÈâÌ-<ÿ;Aƒ/®~Z™·õ统órXö!øçYò—¢€Äkó®g|/7ïÿȶì×>mh¬ùW4vû~¼ìâºßáœÍʸÌă£û¿)?¶Î·éøE¼M꼎ʋÆÇ)xÊØíKÿÁï Á³ï"ñ±cÞ5,ÄH¹ÏçÿT½ßvÇWê}¦¾ß"¿‰‹¯‰´¯x_G«Ï£;ÛL}Q «ãcQ§¥û VMf~óaO„âgùQWòþ//jJ~šô“kÏ3åÍÆ|ÃꯗŠ¥oOžQ¥ÇÛ7M𜢱†¿„ÔóÅã jÁ{£áá˜5*ï¤_[å'tû³qü,ž×® ïà‰"å>+ö ”÷“z7Ô¯4õ´âÏ¿©¯·­¦oãR™‡#ß0N‡¶þáQ¨ ¿×>#òCU߇ߟÎã@Áïà_qƯ‰çM<¨Ôàšn) Ü×¼OøûÓÞ­CÛÇýu<ý˜tx¨÷O;^ëxúÚRxÈgü¢n_~¡XÏLë«­áÉŽ,®ÔðuŠç*åï‚÷í–áÁùUÿ¯ó|+ëÞºÀõmHý®×Jåq ·Õüý*—à|v6 <žÎ0~[/ç³¶ì æ<&hÃy9 ¼Â‘çùÌuü†è@xC^±Ë³`Pp75³Šš¯´5Lc‰ ÌΓ?_D]{=®üÖ.Íþ‘'Ù¿þ[e|ÙÚ"·~÷VõÓ¯)òHþï{“åUÇÈ5²_|÷ÚÀü Ÿóõúú[׆¡OCõGÐ>ž¼ ªƒy„*‚¯‡¬†…7ü¿bX°1Q¾ ¸L«¿²‰û£Š9¿ò@8¤Fwùá"帘Ïöõ3ײ>‘åwÈyN.’­áÜìà<Üú¯ûÕá@ÏBó}àÆ•ÿ柳×8å¼û^W×ÉÓÔ·ˆQêï!å¸~Áý2¢ŽíŸ¯É÷°Û_p¬'‚~jüwT%“Ѻ®éÌüŒ&–u‰Ž4O¯ÿ…–ò:Ž5ײx~ ïg0àpé5ÁqÐÑüo/á1Åu=~ÕŒXöÁ‡§Ã3{/ñ|ÈQÁyz]ÞÚÖ°jJ0_Q?NËÕè÷¢=.¡þ&Ûü«.¯ƒòàçÅvïÅÝ Ezî¿}žÃ] ÔïÅ`&°…Þ¤®ÇùåðÈj÷l™ç7Õ=Q­Ž/1€×¹ÆmRïÓY–ü¢…–ßÏgr^Wô¦ŒÇùmõ=ÐWλbý‘òsЃå1”éêpd(Ö<Ÿ–ŸÏ?~”ÌKFןžTÍ}ÐŽ?ôëPï1]§Ð7˜Mx}cÇ·}O—d÷¼pü:*Ùý¸ô Γ§ŒCxA1ö&¶oäò~,M~ˆÖénÂöº‚Wß?ß‘§HôïE­gjõÆBö/:_Ÿè»àêÏXýâsƒYÄýJàßÅ}Çɧ¨ëV×}]¯y_Q?ÑþßgÓá L†Gtǘtu48_íñ!ûÆqSžšWñè_±ºFW¾ž4ÖÔ½Z}úØR+²®¿.k[oÜÚ7˜w¿¯÷¿Íë@º~Ò7Ã}ïB?ËÿÇù~?Èa?g:xãYœèíâýN]Hž«„àÿŠÙz­«'ùÇå©ý]=Ð?¯'ÉCº§^ð†T?Åx¼¡_×ßÃú]¯n“Ö~Iog4ÿXË“šÿç¸h<µÈ7?¬ÃÓ#7ÞjÁ;ïÊ€é5vÇM¾_§Œ™aåçal8?”š·ß‘¤BÖwñþÉó–øöú6¡¯‡U¿ûÛ/ ŽãÎáýë‹fëus»:Õuþ®™É†–í;ߟ¨ö“;«Ÿgäht=ûãŠÑ•Ũ­_>ë¤Lø€Ì“¨Ãg`ÊÓiís¢_2ÜÌâÃbíÓ¦õOjtÒñÙ%m&¿ µñÔ’6_‘ÿÿã~ÜOÛ8&~Љ,¾ÆYyñøK µ¡‚ÕcMõÿøÙýeÿÕ2¯çŸ_î†óŠGY6ƒ5΢¿.Ç9¡F®¯Q]_\¶^Ý«ÁY>rëùñuÛׄ!këV¶&öÙ¨þ‚ɨî%¦É÷]Ç_…Ê`<¢àá¢|õÈç¼¹Gÿžåilõ‘/éoýoé»ç8B Ž'F%ϯÝÔ-OË®†cÖe ‚GÈÖpGKæ?õLÿUEôÍ`.ë£Âƒ%2>b<¾ÀѦŒCúß1žçH]Ãû¯ë~U¡0ÞïÐX³~õWç—¼PÅœßTÃç‚Nšþ—ÍɾçÞV‚SßBøòbâéH¹.‰ãLõÌÈ׳ä†óát¼÷A0-lŸN±ã7A'Òw¡©ÿÓz´à÷µåƒ²žw5ßO ~òfY×6ÎOà`C׃kWŸÒðϳìKÔž?ôu<ÜÙ±¯Uà‘5~#ÅûâæsY¥3¯§ à}Møñ†uCà,½oÂá*±ö#u>e ¼>S? µeÁ|fmHV£nœ_#î¯öb}KhÊýÇâºKŸÛ­¨R×—\ó¥þxÇÝL?!áY׿›¥‡¯ËOm:6º¾XS~ÜÖÐWæKq´k?RØ>\ò5Þº·Œ ñLqÑœDpU&C¥\—Au<ëãº÷êgÄï6áWã6ô¹&Ž?4ûµ4Îö6ÅÃ[v\_¬ Ç…u×àW‡ó+ÐαOð²9r>£ÖPß"üGÈ㟣„Çk<ŽÀˆ½òq§ÜËýK™AolêqêúùÂÔ}—†zZÒ{½NôW5çϸöé`å;½›Žn8ˆ”yÑ<\KÒg[£ÆI¢4\XםжÉèœ%'µžÇ>î|·k߉÷%)C±¦.Çõ>7ÝóŠË¼M†:Q9óL8Ì”qÿæ†óAwÙÏ:\Æó9ö3 rd?…òâˆü òƒý‡ãˆ‚yŠHIõgý¿“þKªŽóp&ót}2Þ^y=HÁ—½dè{x‚+Àp¶O§ÄÑÇü§Aó¶yÛâí+óù68žW£Ö»0žWe§kÂÁ~×ÍÏ»oÐü?&^!,Æ~«÷5ô`õ`Ì{Q®Û¶àë˄ǃñ†O÷ÏeS˜ß<J½è¤f,c‚al0ŸÆ2–±Œe,c˘ÎЛô Ü5ÈÇðôáÑfu\ æ}»×}ÃâK}gÜ÷%Ë—kê§T§Åÿ;¯{_júè_vì?±Ä‰ø'å|Mÿ]\ýüÿ×­Ÿ9¬›”ÿ)":½Žx[C¾&.¯¾ÃâéC8u*닪ùà1•ça)þpCÔ+jæÑŠäc9ß=nÙi÷þ§ïÑxšÁVu[ÝûÈóA8} ï[^ÍsÃ㺃íp¿§&óhï±Ü_‰>*‰^–¥~q}Zs\ƒ¡o)å¼ÉåýsF×Àïý8~“à5½ÄÐð^Š|²i^&žUíy_?WÞ«¼îHëGDçÄ„ÛMWÓ—ßz4Wx<ç‹XôÇÄß´ò/vu½rþ< c:ß¶ºTÞ»¯9âlò^¬êÏö÷'F·•ö§Qü¼§{3Þ—ûs™.ZSƒ?Ö‹ãÊ8¿–·‡ó¬Ì•·ô·ó+M¼)×ç}z¾.úx;•”ë~‘Œßëj¨ÙǾ9¿AÒýþuvkp¹nõH´!¿QëHŠ:/²ùÏv¤,øÎaµ^¡‰%^7Ç’ÏO£ßäsê~ÆS²!Ξ[ ¥ï€ðê¾GÑŸ`â‡÷¯SX?úfº¾ Wâ×÷ÿ¦î¹8w«ŒãõËST;^/f~[Ìù «·ëúÁ4¸pTÚÕÍýãód\ƒØuÇ ÜÚÚá_(^Ï7£wµŒ—G Á§”:ö ÕŸó±ÅÃÖÐÞn]A¶aßþåÅ2±àÅxä?vû´¦ß-å¸-D·ëº.±âòÿGJ?ȸ?©ûü²Cò=åüeWy=Ežëˆn&î·÷-óD~Ó¤3„ù ćy?`Ï æ²˜¯öÿBŸ “ŽŸÝÍÂÁmeÂD/aÇ›4¡88MÙ²?'ª ^´O†¾¡Ê9L?ÞÇGúQ¾2ð|ªsh¼^že~uˆÌÿIó1Àæ…lÞ—¼Úòã㡲XqL8ê—v¼h½ÿk&ô¼Üåý ™ ŽÓ9Oe¾]>Íï‹UØå ,ë$aͶ?ƒ9?óÀÛd¿íª^,ÿ3 |=Áñ#æ÷CÅ¥–”a˜†g‡›KëŠh®Þopckõõ¾ýÀü½˜6ÛöÒòø+JB­;´7¾ÂxÖŸ¥†Âpq åƒNù¶úsxÛ4¼×‚¿?!>“ÙÆÂpþÇv¼­íòþqÕ&â= áÏ}{³Û4¤Ž×/5ùõ’‡t5oO²õtO¯,VN´Š;¼O ãĬcÖ¼Ýù¥Xý=´ã}1†>*ÿø£—ÇRoEnD}I·#xL°îBÆ—ÝÍ1®8ýlæ·4s‹qÙí,ßrÌû2N`ùHu¿íƒ?½YÊ£ÄÄo…é“bÍgéòNZÞ¸Ÿþ2Ú÷hàuÖ­ëÎ×1ä=m ƒW(÷iÌ$ç™kx]â¶«Y}Í?ƹž^¥Vñ¤÷!þ u>[:Ѷ<_®8äÿóZ㽸^z[ÆQÍHüß$ͺäšüzªý¨¤ã9ñçE¯Ò:|Ü&êôÈ'ßËmk‚u:uïÍy|û{µ×©ZÉ~Þ|t´z]GŽ×\~)Ë9êOëÌÛNêx{ u‚—º„ã5z›¿gåò~ê}Ï}Ö¦ïcÏDZÕv8ª§Kð-Þ–zVù–yŽBËu§]zù¿QNø#ç¯g8ŽÊ`Þ]×äkÇs\?tú)ÇYâ–¢šÿ#tš<}Oõ{áí øÜ<îÇßw¿Üß/XWM u¢‡2Ø’7ežïÈñ¬ð+\ÇÑί¿Åø¢–fž÷wÕA†FÁû3ÖÜk½ M¸ŽÕ^u¾J§{”Ñz°­á–óX½å©så:ï’á‘üVÊ ¡=.dCÅ4Æj™ÿÓÛšž|Ú¸=·br­·ù:–ý<鲸/í¨*ça5õ«8òòٺƒ—ó[©ëƒ?uíþ ócËìžÏÀ¡åÁǵá÷•ø“xø‡u0Ý_…YëôTŸ!/šNU'tû'‹'Àð¦nùø^?üüû¹Qn¶åƒÂ#§”ÆZï~ðë`>F2/ºž§ð5Þø:‹ û½)_‰v_SÉñ] ׳Ï1xÜû’·›øµ%ê|Â Ž‹)$|P›a?åóp ó™ÌÛ"pÃd´„=ƒŸ%¸ƒ>÷"uþ/¶ùrýl”šxËÝöA¡·­ã­u54‹G—@ÌGà9Ñ•éuéü]çñ9>ÛÛEðb†ûûqD½AQ_o¼£L£ÏöIð>Bþ}R^Âv–ók¤ÁËíÖøEYÁß7ŽÌ–üݼÖ&Óõ5¥Çý;ñû´¯Ï/Ý¡vÑðShÂó|K›È|¹ÿà<ê¼ó>Qó“ïY«¿Èuê0ûªpü¤Ÿ }VÿO‚Çía§Ó©3Üxu¤÷ýÇÚÕsòÃSæsïoä¾½%¿Rû>]ü¸öñ8ëӥkÔÏ2í'hKúP4õ TDÔáy'8_…VÉèè ›÷Í}Kø²û“6äG{/ÂæË¾k&ôqð?×sÉJ濌 îÇpµßžr܉¿—ù)º±:0.ÈêÉ?>¦.¡oÛgŽ »ü à{Gk _ðØB¦;Îu1í¯ÁþÀÕW§o¯a)˃ K}¿ÐÄ-¿…Æ?vþrö¦ôæc©‰xNèÄëŽÃÜbö}_ü„¼ž‹þбódá}ÄžZí7êÖgðFŽ”¿?óþº¸õÙçÔ¼ãUªûPÛñç¸=ÿMÃñC` ïƒnËpžðwâñ?Pf§éú†)_SÊøs{ÈÇ[æõÑÍPo>úhµžÃÖמO©¶Ã·¸šàÒéJ‰ø:e~÷ÿS‡àq ÐEB7‹¢«Ÿò~v]ŸmÊõ Òs3Ô=0TæãF)ïcZÕÕëÊç4ˆüX^+ÌÌœ¿ˆSqI·þõÅU‰ôÝ$­¿aâIO9žãÖÃòàÞ1©k¸<#jÔ¼&£¸‘ÿÁ¢k‚ó{`z¹qñÍ C¸z<ò }Pû3"þÅe Ù:XOxtŒ‘óH¹¾éô ½¿‘ºÐÙ냯W(×A¬çÙ†ðOu λépœT7S{¾%žÕû¹ekÊRÙÓì{˜™Ç~GçŽÆ»¿ÒuH»ëšp³Çå3œÚèp¼1&ÃSO^Øw‘ï3·°<ñòåìçÌÛY¾Ò×41ä•& BÜ_ÃB‘AÿÊÒOô¾±ô_ ø/œõJ$>5Ì_ÈsaúÞ1j¼œoíHx'›‡{n´: [4}€M¢ù•¨fë‰Nß%ô¸†ÿ_qP½ÆÑqîÚ#ãê4¼¶Úó[ ¼6ïwáS‹özÃÕ}=xrU½ê¢¡Ï/½§ÞŸð½W9ÞëÛí ÷ù…yûy}xàÓnq‹!ÿÕ¼Mvë7²dæÑ½WuɸµO#Ýý¹:Co–`AG»uŒÖKñØ—ìü#ÇÈõÊ¥ßsËë.oËâÜÿ¨÷Qï·áâAª£êÿ}gzô“MÌU>XpB0>bcðºŒQnz‡·Ž/²ŸË'»ñÔ6!¿W©óW¸[Ý:Ž5‡Èyî üÿ7üšå'1¼$jo®wŒ›ÍÎ'¸yRÿ ·P÷.þDöyß´+îZà¬'}jè¶ÒöTÉP«Ö릸8ÑÏÕ Xž‚ÆûO=[÷á¡{´ã…2åeíˆs¶ìòÇÈòhKð7ngþ†Ï#‘óQÜÏŽÎÉè¬"_“/˜ôz<:æÝÕ¸CÿÿçÝÜ÷rÖeòû¹àŠÉº1ÍCžŒÑÛÐoÃõíu:Ú¢ÿyñ®ã:^ a8Eä<Å'O¢ hâo¼Ã¶ó~™é8QwE3ž=·Iðó@øURpHÇnæOn"yaM¿”÷k»¾ª¿Šáêç 7|$¯ÙÞOÁg{ä‰r~màxå¸ôþ¤\·:ø=HûõÞÞ`¿H>cèmNyf¾1åzíxÿ˜†_Çzœ¦ìsaéUò~×Y£'ó á¿,×ä݉OóÁ:œŽ=ˆÅ‘9áêÆ("¼¨9¤tÆEìý+æñ+×%¦u&ôä8““îvú^¼áúÅ~/ô~MëõŸOëu“2_g¹Üo%u4ä|HAÈ8C‡ýÑ×ËÂé’xûòÑ”ã¼Ús?È’' eòçøWO9þì^lü]üý1𫥜¯ÑE kbÿ|‚w•Ÿƒç©«Û9_GãWh¯»Ä]y^³#ïsoÏuÁ7jÎ7ôå‹~Eo‡¥¿¨ácëf ß©ÃP|ƒ®_ƒñš)ÇÝ¥ö4ý×ÉxæE}5¼>­Áãà–ùáúª]OçñûŒsN‘ñŒƒ‰üVðó„Z‹byp¡s‚Vr=7ÿ^:OWÁq‡²ñŠù{ÈýÄ”¸÷Šþ<\ñœlâ~Þ˜78îŒ<çˆ^ŽŸ(Ö/ã}hDpñ‹w=ö¯Ó38žvÕŸBsžÇä.êþ mñ|.œÿššOììný“¼Oy|ÚÉû½,ýCï#ò\t"¼ÜOðy±vkÖ“G6ø«< Å5àêAìü¶†~ŠÃÿ;ñ¼Z¿–Dt:Iþ¼øçCkîÿìåëD¯Ó‰ºW M6ß7ћü.þùŸç¹tu'ÿÿTWJÓ·€™—‡ê}sÞf ÷›ÑƒÇ«‡¼Â¾ÖÝ G~†”yÃôPÃã=¾¥×lÉûIŸá‰xÅ„3ó¶“8§˜?W­ÂÅh¤ùûÇIþ\]ŸEc»u Iž·–Ä¡¼¯ë›üï<ΰË'•Eô3 -qcííülï£<É]góueõokȼG+>?QGÅê4Âϧ-?LXC;î'kô«ÒmÆý!O]w@_™×]Õ<)çõ®Ë£%É ´ ׇ'øPÀü0ñ3à½k“•uü¯S_º®Bßìàiêø —ä[K O Á£$’¸ø¥tÏ]Êq–úlé6Lç÷Úòõ¯? ¸ïgãÚ{¨ëàauÍpÉÁ8ÑýÑ>·Ÿº¥µÕñ‚ßÂõ:´ÇûØ€7Îâ~¾'ë·›øeáæéŸ_!ë``´_‘”1YÂð×Ç(vCD¿Tœs ¼nH1‰¸Óÿµê¼ÐªÕ‹Ž1æÞ£Îc¯›ŸÖù €àcBöueÌÎtû·Žï=ÒÌÇIêag޾v¼Æëû€Jî?úÚ\ûÞpˆ[<åüÉ+Ýøsù˜Ek¸Ù¹Õ¡<žW{^eLþ°%~ýë'ŽˆÛlqgè(/‚?<ÙÙE7Ñ€lËú¦†GB{|;C®ÏÅgU[òtr^ÊñY¥éáMJ™Çñêõ=…¯j¶ŒGÆÈ•ì8Þ_–œoKð瑾víõ/(°«Kæ7̸”Úú_6ïº|½-ï.å;÷çÕ\~¾“Ò¹û›mƒÐ±ÕÑúYÒm´O×ÕëˆÓ;}q¼:¨÷{oCâц³¹nÔãÂÎ2N°‡¡NËý6¬kô¨²ßdozx„pÅó¡Ö5 X\oìÏ£ Çÿ d¸ 4²\oÒ¤ïL ]Ò£#¶>B ·ìcuò[íBuø5Ï$£{¢cw¦WωÕ§uθL·¯Ö—Ùö?†5tc<–8„ë_ˆzÇáà¡ÁVï=ÕÇÅcÙ{ИðWtåø%úwÎË„¦„÷ëÚc"KüyÛ º1ë~øq ŸËôƒyo\Mè0ëúC;ÂзÅuÉL})çåÇóþ£ŒÏ ø’7¡é¿Méÿ#õgd…ãAr5ªSCqN‰_¿O0-&-ù¾Ï ¯>IŽº#ðEºqé÷‚Y콦ºÙq™mžùáêq=ßIzÆÃ‡“ïŒÔO‡œpy'Qòù]/ʉeýÀ¯Õ}^¡q¼î¬O‡ê à+…£ZÝ߀ß&ûÞC6:õ“YöqÄe˜Ýžý¼îYuÇ¢qêuûKô…êþš§Žú ×ã‘+ÃÕcE_3r4<©Ù¼áãhþeT^~ÜÒ‹ù=ÕÁø.Wü³¨÷‡—qüޤïjvp|žrþ”›¬æ‡©WãÞÚ%ëÇ{_‡ÄWYò×…5,êk½]{µƒêi8sk¸¾ÄMÜÿ{z0^W³^˜xè“6œÓ]Ý·çØßy'4 ÷n0üŸø×hg¨ßjú­çÃy„pí]2¾c9óS0k[÷kXÂŽæí°÷;ÜÍÙ2ÏÆÁëY}Bóùqú7v:K#8ÛÂS¯Ñ?ªo£øº”ÿå8¨CHýÁÀw‹Æáð ¢.Ç?–ã±\Kž‡ÞŽ:æ%–ý»¢í‹:=—¸ CšÚá «nJ×Ïœ“ì¼i ŠâÍ'à9n¤Ðh³kx&øjÐØÀËR®ž.p`ÖÇoL/ß¿­ÎXX³åωËD\'xå´óZ=T]Ÿp‘ìWÞæ©Ñ>f׋µçµ?°ê ß5C×pq˜÷a]!}xxô™:ÏÓÛšLÞÇ=®Þ¾«žønù(Qÿ —MÖ÷Ô5âz“.׸•Áÿ?·¨ýÛÛ£Á¯p¾MLbñ jÞLäy¼iôï(±ô÷¶óý`^Ïdæ·ÏÀGs=‡/a8“cé½@Sõzæí×àââ‰"¼ Qq7þ8!qi˜¨ö·PèÈ/}æÔú†ç#݆žv|m‘¯³¶m,ø6okÃпҽª¡(™¾,´µ»OèïuMúµ)×_R)îÁ¼gÝxÁ»ý¶†ùo°Ÿ%ñ~®Õ6ÑöOEº ßïËð•½ìô9„ßàm&zhšçåÁ8û”ãG©ñ‘þu4ºƒ(Ñèþ™ÌóS»y¤ /–”ád†‡ríGÔŽÇëQ¦þµÈ×i£©׸ù="ŸŠó™ƒˆAÁÏ•œ†¡+Jö]¢øás¹¢Læq?gª\}ÈS_Õ?,ô£Q-ë–a ×¥j«ŽcÑ4=ø3ž`Ë÷€&_½—ôsW3Þi9Œõm'„7¥ºXXû¡Zgu°Ì£±/$ÚW_ßæªKÕP˜ì{ŽÉïÈü]ê'Ÿ‹kŽUëÓì‹Ö/¨ÃZŸñ‹Ñøn µ{ßó8Ìøó4ÍBæ3òÓ„K›3$Y^³ïgxð¹ûþR£÷”rÞÚ®uÀ]¾•†þÝûÿ*ß6…üýÝ9ÑÞר–nžaí‰u7iü’êdø‡\-êºIÍÛW¿}1Ôtú+¡Ç;HæIzÖç—GãŸH7¿†Éús¸i+ýÜý ËUèU‡HyÊë#úñ0$~OèÜE¯«¡Ç05OÌÍñMÜÆ÷ö§g=Ag‚ïÊ w]Û|6ª-÷ÝT~O?Ó¯>ñJhÁòèTÏ}Š•êõMuú¼!y!ÒÔÏè_O£ƒŠòà|"ÕÅHÚ„ˆÿ{Lº5º~}aºþàL9ß Óç#ú©¨âxúm'Mu™¹þ6J¢=÷¸ét–¯Zñ—`ü̘ϕߧIgÎzµÉàâ6Üsˆ:_?¥gZãܰú:a gDÓQðÇ)¿7XïR“ÂM/Ê: Do“&÷½”…Ì/,ù$šŽO'ÞX`ÐÜrü¨y¨ÁûÚ‡û~uqhXºÄhièo*âºÈ޼>8Qö—“â£4ñ©Õ—™ô½Â¦0{LE¸óó þÍ'ÊqÜìúª­!+ÙÏéíIjd>¾®OÝÀ#ƒ}¦sÿlÜøÃcÎ |_iÿQTKé'>ëOõR÷Bçkúܒǵ§:Î@»ˆúÍíÏæE/Õ«.½¯Ž/ ýÆqÜOl¶¯‚ö$¾)"ý˜kVËy–¥¿´ë»íñxxøÛ‡ÃbU?™gÈòyu¾Î 0ýòE¹2î'澺~yŸ¯/Þ_¾[8Mj¸~L28vÇ•œ†Õw]߆î7×5ËãõqÁqÑêÄÇ,®WÿM‹ ¬ Æ øÇY⳩¿â}Ý0t£Qe§{$x )µ?N>ï¯2ôOañŸÔõ’öážKôÍ7G[„nxÜ<žt}3ñiÇÙ@øÁkžSヲ5ëuo_cÈUrÜ¿zŒ\7yô0å¾â½—^ ÎýY8$¡>]¾ÝäõµáÞw\róã¿'XgùòÏ­î n}Q®wu‰oàŠ ¤çĵ?ÆÛÑ0ò‡SšÛ½7Þñ^×û@~.Ð5"?„A'IîÏÖJú™¨àzÐíâíg÷þ²/ŒèO{ÛÒÛGë_7&\šiþ~²]¾MÙó‚2Â_}<ÃG¢§ÝóƒÞc£ñ¼Ý»:Ö}ãf¸ñÏdEãRæÏú‡ºxפe}ÝF\¤àj© þ”kp&¹ñú|w´}ù¢¯Y]eä£j}¸572¾š›Éxón¼7𾣸a~/ Ý0i¥üû’^¡ê÷8ú;\Ò3¼ß%Ž:ÃÚñÉõ~¬¸CŠïp«œÿxn4á:•EWpÝÉ`ÜZÝ#ŽçÀÌ`¢v¼S(¿ÛÿµýPy ဗ<¦æQÒð;Ñ}\ຄ¾®ØãÔׄó>Ž/‚ª†‰·òv¥7‚ìdð7(Ž'©ÓwÂøà<ÅGhçyß-l_ñäý  ƒ¿Q:×eP£Áíæ‘ßK‚q1ííäxž\ËûÙOæéD6ÏO‰˜WÍ·{žÐ9½}Þ¶úåé kÞ–xô™tõ(W1ŒMýü6'}ã§?&ÇCÉz›˜Ê~ÇÂõNŸÃ8¿C?Ã…ò¼¢êÍ{ï&³[_?M:q:‹Š æýMS·¼r},ë<~¼ç(é9ÛD­‹>íh¹/äÑ^+ë~dþ0²¢åc¼÷-u·7Œz 5œ®ùû”k­ÖYoW¸çÖ„¿Ç’Âñ+ixèýq»ç¡ü'8N™ëª`âä@Ü ~Ô·NèÍ ý©†ü®ìKŸ’.&¾\Æ€8²M<þ|úyÆÒσó¤w«®/]<×Nçóü²àï÷ªžj>ƒ3wËß{'Žsš2ªn¤ ?iQ„E›L¿\Óù[³‰nèLx>º?ÏpfÛëGÿ;nC“hþ‡÷)á“JX§/nC+KªžÑt2Lf«Ï·á؇ã=ni—ÏÑå§pÇü`œë¤p<þùÝÝŽ÷vÚísBÇÀÿ½ á³/Ž™×øüm‰ÄU¨´Ë#Q®¸LôÇ¢•f~ÍåûˆRù¾‹ºñ:~´7Ô;ðYß}@g8ÿiö=%ãѺdlãN† µ¾Îè|yÿãøGGC16@š7nzØMù ŸòûD–&/º•ÿLhj(†žmíôÏŸ)ï7Ÿ’Ÿ¿ÍÁëíÕGôBPBtM4õ-SŸLX£ú[qš¹Í=—û_¿·WÍ7žÃóÊ{H}½£>Ûá;äüîÞxpá:^Cãy{ˆÿÓ><¯·—ó+ô±ãárÕF áu$ï÷ éþ]LýšM4ºC–þ³qü|CßÅvÍõ*¿ßšyÆm¸ô&;¾ø¹upE¾Óƒq‹ë†ÿ|šþï·Œñìßaù,ºáúÏ"­ó8ô©X÷ LnÏž“ëÛ­dÓ—f¾ïÅxyL†vüMÆqrã¹OÞÎúÍ¡XÃÛ´h3«Ëî$û9ç5Ľö»øç¢üÂÖó:kpßùä«ï¸׊*ù¾RždÛõ­{Ûø>]-nãÔá:ââô¶°ýÜûèÀŠðh›xôï:¤^ò‡:Ã܉l=žøéÿ ½¥°†U+ä>ÄÆ²_¨ë}½2»uZøãq]×dx¹uÿ u×5I nÍÛO]•²?ŠZ–'BcROšó«úÕ+êBp?ÍÂÕƒ¿ž‘´{þÂò‘‹>DQ·BN²q ®ýBŽÓ”×Ã@ÎÃAx–P’0ÎjðE’㪓¨·˜½WB7ì8:=%“Þ2†q¿e݃þÉ{ôæÒmhGòp[Ó/DÝpÊÏÒË£ð5[ßt¸]çñöº½h-ž ›OŸénú¦Gœ]÷þx›ÒÌSz‚ºŸÝúüšÁ¡î¯·#8o†“ßJÿ⥉衄5‘gñ fž)ã“Ë-ùRÆã pižG·%õÞB·y£?Û'1½†}ŽÝ„ofƒÛxþ¸ýcü¯e?JôÛÑþaíuª®(‡ÝÞÀ6/›ép¾éöÞ ýe]þ8…/9æþÖtºî”§@#þ3'\_ ¢õÍ⮫ În¤îwiÂqøSú0~‘ë6Øõ¿deúÆCŠÛog¼Zì½v¿üqË̸J~|ø)^-æüï$~2Åßô9GEýø¸vŠœÿuìkFõ2æ¶$ú œ×;)^¥¤ yòó™ÂƒÒ5x}©o ÇS£}N8o~,û9N)‹—ô×Þ°£™~•®Žâ|½M ç~ ˜I í8~è[;| š[Çó :}.¡Ëéí=°p5ßuÃoÖë{‡[–'ƒóÿ“šA‡cŽ|½-õ£«&x™Ï»åce]'­e^þx½~eÏ{ YoõÜ¡–è$ŽeøDÜÞƒÅ\w=c§›R_Y;¿Qj=OÔØïí`ñ2Öþš}žN„'ö–‹YÞԱИãn*”q_“³ãﻞݧ۾TçÝèøŽÏ6BÍ3|È.»üJW¢ÿRœÐåmP‘ýôŒ%k®ýIq[X?WCÒˆhè?L®çGÌ K‡+êÈ)ÿ Ù¼Úóüà‘¯ªûïº1¾Ür¼ºÿiêíºAç«QßâÃÓe4¯÷]3Á[¬Ãc¡ÏÁÇ–´Ñz™0”Îã<+(á¸ÁAjÝ-¡›æ{i¦á…Øfà×®P×çtº–aMW÷Áà翼0Þ.»õLðù„½jÌ<2 cêzº][›qОäjX^­-ùœ |ñbD5Ÿ³ úU—N ÌËaéÿȼ »8n ·æø¾j¿Dè>á§Ë©Ã­ö_©»¤zÜ+^sÃ7$´ÛòV¥Ìçôû’™Ï7ný-8ø6¹ê þó•}Í'÷uŠÓÝŸ·!Ÿð}w`þ½èGÀ@M<²z=«Ó$įƒòÆrpåTߓɼÏÔÏ…Ž ƒW*ÇÁ0_G×G5Ÿ–IG$ôõu@Ñ7žú âíWÓú«ÓÃ#¢úÑ5±åYuæ·*¨ßõUðêÒz‚÷¶Æ/Ðäýÿ‹¸d]ÝÊy¾ßºÅ&}d›ÉÐM]תosíç²5žLXCßxâ6äþ©Ž“2™î¹¤¸nj˜yZ½ô¤ËPJú #öA üÍdü»Í÷·ƒø£Cìp ˜}mà>ަ½`Ëz>†Úåá}]ÈjÒ¿ß’è¼÷¸&ÔzFñðü¢_©º^FòHOp—!q*¢?—« ÞfL™ˆGð¿¿#ßG–©ïW‡Ôºí-åz‹‰‡Èüi‚Ëû–÷×¶#<“› ã±XæsåõpäkŽ_YÈî[y{É|õÆ>‰Þ³+ûÙás4~xÊxÕÏ!†²u¹j|4½«nNÊø¹\Õ‘'U†<ôä¥ãÅŽËjÿ¥0ïËïfß ªÕ~"Ž>R­WÌñ»û Ÿ®®®‚ÇžV×g²ãÁyx»ë‡gc’íÇÀ]ÿ’ûÍ* ŸáÆÚ®O«ò Þ?äuÓ۬ѡ¬2èdž¾÷€î7ÊXÆ2öÏðد:ñ½Ï~Ý)^Âh¶àð×Õ}Æ–ú@Ö×›üË´êêiã‡æ<?ÝÖpÃb¦—¢ÑcL9¾0\nÊbñ1õòù“6<±>QÞ,¿1ÿ ‹VÉxÉ3òÔ~h•¿†SÁø‡Ïï–ŒnH¹¼`yy¨ú‚÷‰%~5äµ&ÿ²AñÆÅe®õªú2Ì>Uý|æÅ«ï+L×g‹Ún¡ê /¬ãðùvË?NÁ7 ¾@ n…<¾ü§&mÀ%…5³÷êGÇ9ÉèáQýèE&m82Þ%oWÌü;y¼Òò{@™ßQÜ:gèšžz0–ç÷C«Ñ‡LÊ0PÆ·¡q²ù!ïÃd×%ÞÐÛí=8z,>>\ÊÜÖ7X¼*ÔP¬~P.¿*ö÷tóƒ#ËÐç”å¶ÏûñiûdqVÞ˸¢‡œ_E·÷UZ}~±îyûë_fk¦~aäp›¢íwº¼FÊu ïAX=Dýõìž Q_ÖÕ=¯KÖ{o?ÏkåÓ¾uNë?Ú±¸Œòj#Ï Ÿ<ÝŽ‡Þû†ÅÁÞÞ×{ø#‘pˆèœßÝ&î¦ùßCS¶þ†Ö-ãüBBxo8ð9¯kôGÐ$Íû›#O¦vœ‚dý>t$zé ÷ã'mhãæ7x[ÔùÞ¸yŠ_)ý;Jy|xØÛ¡òAhÏõìbêËEk»÷E1÷G>ÜvºŸÓ’G7ª!‡÷Ÿ‘¾rëóËÕ|Æó:ãš#ù=Þþs£æz“÷wÊWpín5N‹è»ëôLºÞužÝoj?°Z×Q¤~®qæÛòõ>QûWÔŸIù?Á¡ƒÛº-ô‹mÇ@5O‹÷÷{…[¿ÐÂÐ÷)p†]íúpɯÝw“êsóÇwô÷ÑܲN3ª´ï ÓÙל´aòrïœ7ßóÉÛáȼ¯“å÷wÍ㢜èþôK¿—.ZÜFu|Q*¿:¿+]F×uªËhêKs¾Þ²µ‰¶> ï ^+ÔÔÿþÝÛ²ýà`Þ¡«¢ï>MÝðkÁ'À¾tÅ>On´¼’í÷‡&êºÚ5lütÒæý3Z½ m¢é™à$·|ZÔŠVÁ÷IðÛšÿüÿ]ý< ¾"<»´Î/@ç<ê<·ºþ7œŒ}¾n œ=¼¡îÏ›ÈøœÐEÞ—0i­<Þ×v8<Ø!˜ohÄN¹.9kqz➃~¥#¯šý` ß):aV˜÷ynq«®žˆ§v•ÕGž‰·%ñ^7¾ˆÁÓ—ÖÝæöþY__ƒóÒ™·—í“¶ü ÈWÿóvÊy´$qà¢ß¥w‹%ÿO?þQmX¼Pœ,>ÄÔ—Gü\[ÞG°=^¿2±þä*øüóãÍ ½]œ p¸ÚqZ×µSpN=ê×””¹êLCW–·ˆ»ÁÄ—‡©›#ùõhÉñºå†þ¨všùqûu¾þúSÏPù[ÞÎdyi¾J{œ¥Ž¹¼+^·#ç}o“~ÂRÇ%*þ—æ+P»7Ôú€ËÞ³Ó Xô?NuoŸ%ÿÁÌÁñ!ÁïàêçeœÄüY?š§ˆòàõG'‹À÷¯þNò‘f,cKŸ¡¨~ð é6ʳž±Œe,cËXÆ2–±Œe,cËXÆ2–±Œe,cËXÆ2–±Œe,cËXÆ2–±Œe,ý† ã*‡ëY×—a˜šE{ü‰×ÆÊIûãRþÿÀA¬ÏõêÓ™ï'IŠ÷Öçuä'ˆj¸¦U"z‹qÕlj«Ÿ ÙD7¾$Z:¥wˆ9Sd\÷ƒ×8õ…Ä¥‡ 3dÉ÷•êùaéY2^½0½¼¢ß™þÝÛIŽë~/ënëÈÏQ ÑÏ0õvM׉.r˜èóóçµÛ0¯‘êõž¡oàœOÁŒe2ßÂì "­çxìmÖ7þx³Àõ§ Ö¿9ò:+ÞTttãmF~Hùÿ`ü?\d×OØÂ‘Çk¹|ß=Öî>ßû‰Z‡b§Wz/YŸsâé#D®¥ŽB±ÝõÐ4Y,úc ?ãí3ð;ü'\ŸjÊ8 §ŸŒ"Î^Ð0ùìÑ©aðI¢ƒzŸGcyÄù×È|“à }¸ÝŸ¥oÕ{?fÞ!êøBòØ·$úz¿ã|uϯ÷çGßà:¯Y¸¸ ßµª?aòS±Ä}:<‹IÏ'nó>±äÙnAüÝvÑÞ;ï®ÿtlðóh=ÞKÄ??æe¹~] ‡¡ãsE›n”÷aý¬×8y¬¬ ÐBýžà8;žiª3 =nƒa^OT/í@7ñžÔ÷<2–±Œe,cÉÚ¦×ïËXÆ2Vÿ†r·¼PÆâ1”YÖ¯¾dqnø¥O¶OV·Æ¿N;=ï}7ýjíõ«ã Üþ—Dòèq™Ð{÷þBòFŸCº åœÅÉöE› òCõ x»’ÑC~²ý‘È“Ÿ;‘×ÓÕA­Çm¤Î%Õ—a¸Œ?ó6F¼3Ôºè"Ÿ‰lÞ@ð€ÞŸ-õ¡ÆÊó³ÕGëpï™ÐËöökêG¼ÎÛÿ¸žá‚ïɸ+’?²ÅëÌû‹úóy›¾ë¬÷¹¦ž§‡b¢ÇZªÙ_/n ¿…JV‡ªµ|NK 8Úz©£eýîSÿ×MÔÁ1Z®kàPõºämTƒ ÷ãSŽ#:‚³ÿÄxV÷nÐz£Ö}&šý‚þÝû,þUfíSãÞÛsÝÉ,MßË ™‡@àõPÏ ªØýB?Ž ¿µ³Ì·1àn¦¬ÑS§&ôB½ýšzÜ3Ï}} îC8ñ§ú$z«Ÿ/tp«/â¸ÆÒ}ôö÷—èü'œ\ ~X;Ï£É>úýÃìö¹ËΗž{\ÿI¢|@(·‹+°èyyý+ÇSbÂõŠú«®ÏŖ߀â 4CÇð¼ š^ùb­³z{â¹_ÞnCëàyr?SÓpû‰÷G¾îOfàWÍ~Š~žó¾R®·Bw¹š¸À¶À±Ä6Þ@÷ïÕQ¥NxXÁ3æíŠÖ‡Õpõ'rþ+ïÀÆ&eh/ã¯(/š·%…Ú%¡êubÿx7¼Ó4ûùýM½¾¿¶äŒÀ¸Ið‚¸Î7ªá¼õ‘pWÞW [—Uð пãÔóœü ”ñüõ?ÓËÛ¦3ï›hüI¸0+T}¹ñÄCQòç¡ü»¥ƒŒ’˜ðî_Øátï1†­sº¯¶¼qh¦™ÇÇÞ°¿…[o¨Ÿ†ãwÄš5ñ¤¢?›7£ñÈ£û‡?¾c^wO‰Tô>"©Bæéð¾Uï(NïqË9J3ÞVÞwÌœÆxÑ.ÍbëGS7YWÓù&»¤ =íx¾RÎ{âªp¸žOÜ>/åóÅ`7^%L‘ûšPäX'9wT,y=Ì9Væ';+Öz·à‡Šk¼ŒE3ïKõs†2žW?çìp~e3æ¯y›ø¾4yG2üçþ]éùú çwv»žÈy￟ކxù—¼-éí¿ÀÁ–ü` o§Æïº|5Ë+–p¾ÍqÖók—ÏÀ÷ïKwdêûA‰úÿBÍ?®Y¼ýL8XÖß@cy¿ÄÚrM¾ù:=)ÿüóFÄÚï@ó/è[¿qæõ°ËS~ü^à‰Ÿô ì˜>)˜_ÿ »|½Ð 1§=ÿÊQjžnN‚«¹æüy5æõ‘'“÷îî¼ØpÖ<ž)çu‘ýS dükÞ’§iÍùª/#ý“†:Ž\np=GðÂjÏŸ®öW½í1ëúô!Ÿûñå}EçïZ¾ÒN«¿üýP^8äÉ÷QËk›­É·¶w{/ЋôW6â×ÕðçéòþÿÉy¿¸Å-°}þ¬Çãz0Þ¶àº3n<…á7r¼ ÷ý¾‹nÝÀÓ›m÷ýRÀd”ÿÖûÌ?®;’O䔼àÿg[âF&?Àò-†çÖÖâÇd˜Ãøªñp¯Xê’¨Œ7®ÆÄ…ÊçÐÔ‹&ÉÔÛüë ]ì×{+ž:z¨yïá±û &Ï6QÛ¯iÀ)cZïâæSþß½±y×:õ<8?¹èß׫½ÞŠÓÔ¸ÙÙDµ”ä±FjxeÆúšÉñ²íòyè¦éï¼ì<µÎS_¾î\–0á+oGzë‚(p«¿bB÷à~äkƒ÷vzu¸£š¶~Ëóß×”nC÷˜u} Õã¡ILz D‡=iœœÎ0à»÷¸sýàÎÑ\ö“âçÛpY8ý¸È×=¨aàå“2´¶{]upœìïëðG4½Aê'e¢OÆUw@WGcyÜõ–~œéŒ"«a>¿8çÐ9/“áÔén¸žû^°Ó«ŸðB,û bê» º7¨f~¢ÀW ¿QäߌãømL}¨þqÿàïá¹F£xžóØì¡ò}è¬Ã©‡«Çãˆkåýx{²ñ(Î=‹éîõwôÇţߥHzøîºa!Ç%´®Ÿ~J“¡ºJé¯{»Â½8æœDãïKRw»}.ã[l%ãCðô›l=»²?ËoŒPãrRæÿèA¯*õŽÖÎd¸¹{š³÷mÍòÇ>ÿœkåïwM«ÇÍ•uá±âav½;îd÷µwýuD=¸óZuçê‡äÏ7ónö=¬k¬Guïõìyzjþ£ýöÝÚªq ¶õ髞’ß“;²û|ñöž/j[/¸Fï_áüo{eêë{¿ ®ÇP= ïs ïÛÈ™Ÿw“Ì¼oNƒ/ ËC‹Å™Û»ßwr}ÀüYœsÚ3vºlÇmHìâ3»¡ºÕhk™ç~—ÇUÿ{ïfGq¥+ç0A9ŽF9g¡êWåDÊi$¡DA€„H&c¢qX0¶Y§5¬íÅÆI,ÆcLN&HBIð}êTûWçVuUu÷½3òÎùgž¹·»ºo‡ªÞ÷=[vœ’ùˆ\÷÷‹k($=¢~ïipüÔÌ¡ï•Ú|6Ý¥âœHZ⥤‹vËÓ‰éqÛÝØH̯ãòŽŒtkpNvx€Öóis>o—:«Q¯¤ßÝòF- qQc?ÿLâZPÍQ—» «“ïgóä Íœâ>\Ÿ«+uVþu>•¼~JÔ¡³eÁ~ƒÿ3áÔŠSÐŒžÇÅÙ鋞q¼¶¤ÛS˜—ª<’5ÿPó.›«Å­UMÖG>gù‘g‘î¼…š¬_ˆ÷†L?rœ_ÚŒñ úàá÷MãÕÒÒÁÍ–aöÏõñ‰á}O|¼ssZW¾Ê1¯}ÑÂD¼çpœÇ£ytЈÕ;ŸŠ*ïHGlëGjÞ±rºù.Ïö~™¬¼çÁL¸#L빪%Ôõ çÿ£‹¾þ)ç’ê> óÏ“>S…ÞMe o©F²~åxKK(ôQã²þGûÝÎGò±Ð[4Êë~°7ŽÔµþ€Ç>ö=ƒK|”«y3x!¿$[|­ƒ—k³ñ«\ Å?uŠÇrmh¢þ>+¿‹ò«ÈO6_XÏ«´@å‹éýW¿Lz½Öqbê¸b°[ m ÞÓß§àËtüM‰[Žé…â‰âoßù±æãÄçç©·|DzPlýBWï†]ßÍNɢˈé/‹÷ïÜ·sz=Ñ÷H™ö™fÒ¿/kC«dë„ÄËÉ~ ¨Ép ¤3’qÜât×Ë´u9Âqë”<=Ç KCUO>ñà²áë˜æ39Ÿ›~Ÿóø ûurCÏã`¯Mù®gáÜÕÿ[‰uç´õö¿IÇ Üùl%n ¾$=Kß ×þv®†ênó ÎpÄÉÞºN]_«øÌSÜxž(¹ÎÑñøÙê €K«ÅÔ½r»ûÕrÔW9Í­ÞXazC%·ù]öÓ1Åi¨cXGŽÄÔç¹aw¹Âuª†’6å:?SaVaVaVaVaec¦¾èiÆît‹÷ïü»à^?QàC¿1Zß×ìm}žXßËoܯÄ%ÁKžy¹ê ûˆÆÃÅ>Þµ]#g«Çùš+ÑÕ0¹lûOÛ }ï§±tÞ.Ý"òt£ëåxùùJ’ú0Xõ¤[ø=§Û÷”Ò3ã†)~}W³mÁ¦'úÇÜàS¹açëéà Ú­)«¿Ž{PÝ®•[^“†Š|5éƒÉ¿}TgýYàŽ&©¯ÐoÂÔ–¾Ç=o¦¾Î5ýÉTﺪ<»´óåÞç“ïú®ÈË'Ên†á¯PÄôƒª¤»¥mRÇ­ýt±æ°W} }…NÇ-£ñ!SÒqõ5WÝDôaø½'ÔŒôkfPq‹-£ëøR¯:ã8ƒÝp¸ïFu9DÅ9yêbÃ(1öQðê¨~.9?aõÍb>¾Zÿ»¶¿£×ûY½ï6Ý=tg8•©§~ oùDåè¾ä¤Ï%ùá®|`—Š¿··»èóˆÅWDÖ-ðèψ÷}9Õ,8œ g)yiž“ÎÐPž¨á©VÝÿ"û  žá=¿­—Ózˆ¼x¸Œ8êt¾õšªo1Tü ¾Òûïè:^_W;Àü²æ~ë×kæ8 lj¬¿ŽˆWë:;êÖ;Ÿ÷¢÷Ýø¥šG÷1øé÷NÞ<¸LÛ_ÆÖ·-W&y±üs¬Ü­×ã¾øÞè~#L¯Þ×.ûV¢ZvóEáñ~kÐumkéS1ñÅxý€ ó‡óþMH¿«Ivû&`Îíb=½O;¯áÉ¥ºý\yaX¾C_ç_ü[Õ瀞›~šhí¨¯`Ѓ²Ž_C—‚à ß]=»ø¼àŠw—Ìñ—¥lx^ç6 Ü’çÛ#;yÈàåèùÕ_VÝÐW 0]þêŽcð'P#»8Rôÿk¹ÒÙÄ]¿ÌwÖçj|ÞœæÁ1â} >ó»Ïx°4š?ÉóFÍÈÿ«íÙGi‰ª›‡Ùá3aônü®kºù©géû›TX´¡¶ÁÏnNóÔY›³2O"/Ý|‹Ô Mk¼¸ü>z zÆ{ï¤?‹{[— >@\C»Üæ'ðg”þáR/WꯇÛ}swò胱S„îÆ–åš?Î Ní<Ó¿«ŸòRÄ@ñ(î«úýUýü‰àwÑu²¼ça¦>~ŽëM˜Ü2'ý‘167u“>k} Ea#8ž[yå£þˆÎÑz6³õ ŽQÿ¼Ç^Ñçy?NŸâ¼Æ^uèàýñ$Þ ëŽ•÷Ãàh¾6¾¶GÔÁ©g4æbåk±¹oªñ9:ÅÌ?­ù¥×{Êûç·£>PÁ±„8¶9+Dïxܸù$ÙwS꨺ ˨ùÇMaýº=ûˆUQãÞÿÛ¸_a:ù@_=Ù5éqçCu¨àˆ¥¯íýûŒK¥.€ª,¿S/ú:™ð¸çWéòV›¦ë¿¡Kº}xPá,¼Þ¤ìgïÏžlÉp|Ͼݱów7ÄUw 3ä$ÀÓ£n¢3«ï®8&ð4ÓåÏâÖ‹S­÷†ùNÏD×výC¯çã‰÷¶FEó²1²G"?µw9â4¿áö„A~ôsÃýiÁ!ªSпÏhs};Œ¯‚Üäue|ìº= H¿|¢äQP¿Â¢ò¡ŸåjøA‡Á‘~WŠ×ã}v3¶øáÿŽüC¢xUê>b˜¨Ç£‹wìcþw½x×߆·1žgOÖ§ô¦©øYh)Éò­ÞÇk.ócÌ™ôˆx_åêLÜÌÔG’[°/^Ü|žNý•õ½z:ö¿,¦8x4\:öyÖ õýKŸŽæÑã»ú¹ÖãW±àöÚÇ‹ÏM¼eL}À ÿYÉ­nÌpò“Ö¡²U7•q³IÍê¼ßðßnùä…}®Oð™ZOÄöºÂ:Bÿß8)Öóü‰­ŸGýü¨¤üÔMVïCãòÕÏÜü5·ç¿y+xϳ.缓Òpzq §ëßÇà ññ‚xþ«ë:è=îßļ,gu—„õ-,‡Ö?âyÓŒýÚEó¼MÆñpØ>Jßõá÷î±1ýþ³âÿ^z^~® }­ó?Võ'%‚óöqM¿¬ÔÛÑÕr߆ŒëLëtòÁ¯-|ð~ãâñ‹±þŒ£WR=<ž‡?ßÏøÉ¬`ÊãŸÚW·¾}_Z‹çƒû¹ÖófõW¼”¯q¾Y\}y›á´×ˤ‹É°ú5??·•gžÇ,õ{Œß×2<‡cöµðÚseÁ‹LWt°ÈË¿ˆ¾Îh.æ%y}Ñ^_—‘ýš²vþ†<ªŠ÷\®ß¸ñ;¢î5çWN×½^szn| õqÏ¿›ÙtËÊ‹¡JÂúÍû1û¶ŽÖ+ÉÞÍUÏýÖ þáçÑ«T?Þgñ®GxœÎÑxز2[<ˆ>w¦Š#•x ô._ºÁhì–?A- îkm7Ø-oüE¼®x¬ð<æ¬RñÓ¯Uë¿*[\)ê»Õ#|ªæw&ú{_ÞÎOnzvüAÔÑçÑ;»¼ WCooúÎÞ‘×ÃÚ‡®ØM‡*x[wBŸxõfÞß ôç-‹œâE´ò›wPÓmÞ7ñа°³övÔóºì:µ>µé-§ç- ÏgS‹nèãùéÔ}ïí"ø+×Ö×ë~çìê'uT½üd=àÞÑúw)ëßû î_ÍÀs+òËׇûmº"äˆãâæZçB×d~>fïT{PÍ[ 1Ã#¼ïVï Þ´ä“ßcÔ$üíýL%޵ñËÐȱŸß‹~þ<Ç¥eÁ Ï<“E‡»¶«ó\ëd:ì‰qá5Y}¸ŠãºwÔ³OI#ýs-u©}ñ\i›ïïñŸòIuž%_Vꇟ7uóÇÐ$ú=Á7ü®´¤ý—3Ž_‰ù?µÅ<Ê”ŸšúS­_…Bª;}’®&Οãµ=¯/‡Ÿ3¼3”Mÿ®­©~ºË-žC¡A×Åq ·$v¤®‚q»¬ú.íŒãUc}rÈÏB5 ¿®*Í?†û‚ëôqJdëwð¡!_Oó²IÿPò‚\ •y³žxšŒãT7Ì'çv}ä:‰"ñ¢šg½‰õ0õçÈØÏ‚3Çð%ìù¢õœð6} ‰wÃòÿô›Ç†éãT6è÷-‹¨¿WÂå´¬m=ýöwãÅo2/…6z¿ KOõ/C¾p»®â}GczNjP~’Þ«¸þšXênLâÉäç<¯š4OÖd¸°ªŽóÿ§¬mà%IÿÊõ÷eÛœ×7O>F_é—W¹X½Eb=A]Ò3¸ôtõúZxá8ƒ„>Ç»'<ùñGÊ6ïÍ ÿ­dR´nSéù}À>oáv|é?†} <8´$ž]tcq0Å!ØyÌëy &‹cMþ7Ì~.ÞøG©Þÿ7CÝ¡Ÿx?P—üØÆôœ7fóO;•‹;^Qó¾¤gTçw‰GPœÑRõ°úÇ‚/@:i¸¡¹>ž’ë`>ë3óíÿ7¨TéÂè—EcÁûeÔ7ñp´Ÿ¼Êò!­H×g»cD( H¦{×µžbëÓØ-¯ˆ®éÔ!|ñ6ÃÄ—²Šß³¿ßm‘8ëþ]õyé¸ü] ÔçcÂïcöÙ˵a¬úûQ`YßjÐß)•Å|ônôzËçQ ø"Öõ¶™Mg¾¿…÷IúðÒïŒ{œ\šü¿VÙÕsÂsÆžŒÃØ<„Ç÷6?é×›ð}ýøŽÒLú(ùšIÈ×Ǹxϯ G]aªI]ïÄãú+št¸«/.Pâ!2Žgðo2úðMÿR“§Ó_Ô”·³=—¾üa x1+>î®úñî=2N|¼å‡;v>Ÿ®Ñ~)ÚÐß&Šèý ¸2Wý¦2γùIýG¦›×o”]þ" ߯C4¯w}¤Îë³9%úºK|”÷~Ÿg¿Žë>Qq_#Zá÷%Ï“å˱ò ö}–ø'‰WÆÊB_v(ó­i+Ž·à58ï,ñ<·'ÿ¯¶~~ÍÐã«JøH¦„ö–ùò ±z/ÏŠþGð…¸n¸ZÿP§|ÄŸ63ÕA0I$¤-ñ«hS'Ä1O!ëÙ²-ª¯…ú:ãöây;ŒÀAçYî-ªûŒúyw½Þ¨ìÇÍûþ;ž[OýjCßµp¼f~ña°ŸõÝùQÏN'ñ²=Ýâ îÿf|Oz6= lϮߌ|³ŸñÊO³ä}0Òó8ۮѿs£§WçMz>ávß_a:ü¬_¹¯Îºõ¼ £ýj™÷Favãw¬Ý›Ê<|I¸ôö,ïÕɀñà8N'msÏÊ›áî?¾£E[‰‡ëcz haá‡Ü|ž[¼ýáX:XòšMˆ?Qr§àkôù•à€aû¶¾è–nN|U¾!§9­Çã’å 2Žë©›ãj¨æÙ'aûÿÃù[p'i™Äý ?ñ6º®,pÝ(Öçý|õS°ªØÇaá1Å5äëùU¨Ãð­ y‰|Š“^‰‰Ë²é˜®±ŒÏlý&ƒŸ°zJeò[eÿÔʤ' ?Ï‹‡C”ç-õ/2Îû²Éü“¹ÅGÚ íhŸqa¬õƒ×³ŒÛúHÍsMfñóª‡Õü¹gúŽ:Jƒ³3áÌ)Ñõ—ÎÑ÷5bÆ“–þI #?uòw¹¿`ÓŠ}>²Ã›Ç´¿ˆ|L¾Ÿ®®ùŒꪇoâUøΗêq1„¨ïbª^ˆÍÛ¸lMNý=Tb}-zóá~“¾H•׌~úFqóœÎçÓEÅm¢Ovð¾†ÆÙñ·MyÔ&½º±BŸózÒ2cÁjbÊóþk{†ý8ú¬¿ƒºý?CÿŽŒñ³¤3…îžù‡6é¬ãèÎt÷ªž¯Zž|*ñò—Áz¿–ëÅâ–¼èçë¯Åå°ü·ÔÇñ=Ï´ #~“h¾BQvu}Ðóæ-úéæ&Ï€ÿ^}(‘—î¼æÓXÞ/Äßu`õʼ“Á7ßS=£Ÿã´ûͦ¥WWÞŒ÷ÑÂí÷$›_ê³ywËr‘§¿íjµn<³…Ч`àYt›€±òhÝÿ]ú£XE¿ãöo;+ù!\'!xI_7µÕWxôˆ®{ šÞŸÃ{ÕõÛÀ£Á}\c<¿7›¡_-Zpm™~tm¿uÛÔ7ÊÖwÀ×$^,ü¿ã^}鿲Ó?õ£×1_ˆ‡ZõWQ‡Zsg¬y[ÆE¿‡ÒÅÅ£O+5þ¬ïÙO¦}²|aÒ¾{q ÷=$ða•©Î„º‚_*ãÔ[wDóiæŽÒ>·Rÿ0ÄË“~Fnÿ[øJÞ¿£ Ã'ɾ+ó—úá¿4ø— ÿnÀ§ù­‹6CÆö¯Gǃ®8_|¸«þ˜ÉpÅÔTêÙÒý >gu;G\¡ä#q< vÍŠî6&nSuˆ¿¼'ŽãÙO3cÿ~ÛõyC?S[?ÅŒíC=„ã–ÎVãHùü¡™%î?á7ÿ£À bL<= ýdCçðûÝðíy–ºs-ƒî󖿪yŽ,²âQ¯)Vëëè-ü=Î/”<4¤|õÑ—EÄßš[ >´Ãwû§í‚wôuìúT¯“`Ñ5·K©¯‚õ8WÂXÇùÑ8ëíœöa‰·Æ5,/ßÓÁð~´ ç¹.Ã)L¯$p…3Sß—sæ¨û×õÄÏ¿8+õk‰«öNó+ÐÈ3o\LïÍÅs‰înz½!ï|a-?~×ÙÉú™ñ>™\—ýcê§<ŸÈþxhgwåídìWz®ªcÔ‚ž#Gœ—­¿v¸ÝqG^XÉ®Èç5n>,}¯.õ2úx+Ec¥¸ú(ö‹w¹î”÷ñªXtŠšùõñ9Uͦ3á=žc?mO:­zM\Ãw.=y†þòx*ÿZøŸ¸ákdÙTN6¡@¼¯¦¸Éf²ß4ÚGë ¿q½ð£[g—¯!ÇÝÆóê®ââ‚7I¿á‰Ž/)yž7,ÇÛÿ\µãQÞc¨Íc¡›ÿrá2=µçãÝæ9Üÿx:ËþWŸçj@ñ˜…¿z¾ú´-j>¥_$å¯;„Æ7è¯VX2ãz¹2ÑnÛáýÙÔBÿ>Ö‹ÞÏw^áùBÉÀÊ“BJ]9ïŸs÷¥GÏ'MSêóqéÇ×÷û"_SOœ§o½/Ç g~ßKôóÄ·úŠÿ[‹÷\æïÃ~ëçE÷»3ŽßÚâg®ÝEø#ÇÞ3'VÞÑ—_§ë{бßÇùßñzŸPᦳ\_uÍS ­Û|‹Ž* ½ô¼(4öÄu{öSrÕ‘Çý­…^ë‚eÃSY¿²Ö£aºyv‰×G[Ê{]s@¯—ÕÌ¢××ÚÂ×oéú¼QÝÆR/C¦óù§d~e‡G‚|KŸC´,Ø›%ý¥BÒÓµðî¼Ç=WÌÁÞìè§báÕNþFp,;¼;W3éfV˜ÞduõÏc¶u×L†)M¢qnç_§×§ª*q ÿŽò ÁkÉÞ ôj/x(ƒ6f¿žqEG-8«ÉòȼQZ†:¬?²¡Ïuœëª¨8•§~¡æ ' ¿3Ôüú!µ>²ö¸¯§wRñ’ŸJue<£ÆS¨Dù@Çx놺åkžzwGäüUÝ74ÛÆóH¶yDú¦ïqïUn}{ÞcgÌLõùèÍk·ž×ÚWÓÍ œ‘NÿÖ KÇЖñ/üI®ßìÚçÒÕøxèé×ÿÝ×ÐÄÂS(ôÀ0èµr±Ž£ššO4é0Ç˧¼ì{—øx—Ô×÷ÙÛçX‡icЗúZ=Ÿpe¼öäÏ1½÷à˜ú?&¿!þ^Ó7ÖúÍûäÊ<®m]1ž÷µ§ËÃ"Þz«|_T£øÃJõŸxØRW{?‚?[ðˆƒú­s‡¾ß¶¯éy‘ß+ü;Âqãé³çêæ™·Aÿ×Ë7 ‹¢ëî§Šaýc±â W7ny*]ŒÕ¹~VÝ%â‹sT|r°Ÿø~]IW¤éƒuÕ÷—FM®ƒãv~Áûú÷$øHOP—x*= tŒWWÄŒ¶ÑxÆúaG\hc†SÿKùÒçÆö•)N+mý6ëñRî3) =ôý|Möû@w?}Tu|¯û±xK§¨8:¬ßW/¶ß#cªÇâO{:Ήé±ÜÞTføÑ| ß÷§4!ÉŸÏØÿ{†þ)­âš9ön“]œeðá>LèwUÏmþÔÄ7Lj¨eСÝGùÓ®†þ~­ÕóÉèØ?Yj}$Ú°óýÓݪÁ¾?˜Œß€‚ìè´YûÍ‘â}¯•Ûu(ã<²Ô—Rš¬+bɰxyêmw¨uóá*_MÜòßè%tz0Và‡Ð2¯6øK–pSýžÓoOÚG2ÀZ5^ïª××G­xïÍÅÓĬçD¯¦¾p˜üXtþ.ñ96ñÀÆ?‹:†ÁD3Ž÷ˆÆ¹_úáüdœ¼eÑ3ðÄdžç[õwÿüøIàÚYpžsª|Z¿ñÃ+•÷ö›xùøþ‰è¼Ç#õ…Y@~Ô×k4?Éëaº+hÅÖ“IýÊ´¿ˆÉP=ž…®”wÙòxvðÅ5 ·týçéæ G'Û%Å÷zOòæ¥_ÐÎí½ ò— yÁ…ßSëˆ{r«§žGUÖöYÞ¤¾žÛ•÷.ù•Ÿ× þŒCU^ Šôº¼á÷•Ôûfëû$õ±‘—oYæé}ó2aßë Tÿý5½Ô‘ç–ÙòÒI wž–®Þ¾7Œ+nSó÷ô‘ÞI·nVaV-8 ΃Ã~óKð¶#¿§2ù‹ )ÿ_9ÚoÎ8Ž!¯ׂ²>ÇýUü.ŠÔøˇ™òxè½~†Ûí*›ü‰´à‹„ºC](^(Ž7Ÿÿ´ð·F¾(ôïžpŠ5«DÝtx{­ß†aB¿õÕúx~ OwVÿ']ן\#Þ¦cŠÛ/Qyø\·hå|5/_hÀk¶"ý†Ñ×…nþçJ<£ôå:ëª7‘Ôpî·>¼G<ûÕ´<'–|”¯®/ÈUè+o†{ÿ¤×¹çý—±¾’2¿]›ø§}·èã¢+oqoóèßu°ôÖó$žÁYª‘EwÜ’¯Šk¨Åú‚öJÆɵ™ôH³~ÜþWžt4\ëM®:ui6|¢=/›Þ-úæGæ©Ñ!Ž·¼YÆ:ÙÞ_©š›õ$©á®±zݬ"·:=6=/p¿°ègÔ3ôé"=ncLʯ¢8YÿCÉÛ ÇýkvæÇ¤fë$-Wõš\òüpÚ®:(åÍœõ+ xP®Ë"ùœ|;ŒÛ™¶´ ]æ2ÿbáãÊŸ» ü`7¿ú¬Œ3çÚwÙ€ÜÃþÏ’¾F¶,8^ÆÇ'Ü|°ß-¯`‹¿seÁ†KùLÿšøz˜·4ZÏæ¢xqW\sÕAëwß™é%ÿ|ªÏ?®ø"ÖºbÍÓ ãå¿/¥;ß!âÛ&†º_+Ö§ê >Ø¢ç±ôU.&3ƒÿ…ö–¾A9ÊÓäÚpïN5?6`¨ÈK1\;ïê‹2áü’ò(Ÿæ˜Þs«§K_Sïÿ ã¬àçåû¹À½«I]یϿŠW5õ­Cƒtu¦ÃqgU)W8ôŽŽPÏ×oý"Öñ\û€‡Çé ò9Mý¦qëSâýõ½È¸Â„O+ï†q«u zÞQWü•ó ¨‹ ÑØs~02ÑsjŠïâòû8þNöA0mûjž¼^¶¾ÔòyÂÀîN󒯨}0‚/¢ã^S_o_CCM™g²ä©2öÛœ§ö³©ý;8ÿ<üü‚³TÜGãòù>¢!ë7ùŠ_^Æ8îÅ3³ŠCGG¡¿…­N©ú¸«á‚{âõÇÌ£úó™¥Û?‚p‰®})Pű®Õ07ý¤Ϧƒçp­·aV7}^çˆßñPC½î¸qþ)•’†?Ñç/{ïäú|Åð1¤‡ó ¯¡®S =Üêoè¨ï§žŒwÌú¤ ‘þ}à}IÐðyô½çúŽëÙ7³éã ÂabúñÿW õº~‘Uœ#nøA´Ÿßeúõz ádbö¯*+C½ìÄo§š¡6ÓM}àV•ÇOø$4ɲÎ}gÇõ±q2? õHÆ‘ƒÆñpmhåVŸÄ¸Õ1?Ž7Ÿeoàú÷øüTÿý–$òC“ö—D¾¸?’—ô¾Ûê‰è"ú ™úc¹ºPÿ©½–ü¯£n9*ê– Ôûe‹cÓ2S¿ôÍ.ÿxVÕqúm:|]‹ûŽ.~uòàã¯Õ4è†RzS*Ü¿[t>…¯¯È‹Ùߒ×0ñˆª×V<ÜJ‚w ø˜fñò»áþk• ÿÛÔÿ™[p¢“ÚÜÏÿâÏ#*ûùÿØöF¼>žÓžôZǤþDøÿ‡)×ûV}Lö¹Å¥®Ûað•n÷•õçzé˜ún:ºóTÿ1Äy\‡7­÷7ã8ŸÄ[_þ”WDâß-ªí×ÙÒ—‡ëX õs yÝüð¦Áa6o·`󙡾n¿ö?Ôý+Q>ºi´_Êq‚²^'¾ì·óGòÿ™:Xλ_¼õ%øÜ’wÄ……ÛÇäbh+µ®ôw·çg>è6þ¶ÇÓEjó÷XtÒ²léqHæ_‹:Ö•gâ_ïx@¼3Dõï{°—Û,»uÛ{~ª˜©†qûm+´ø±¸ýy3Æù"·¼7©+›õãÔñä£ µ’ééH žN¨ç4³iªñhpÌÀƒ[úh¼^•´ÎÀÏÐ7Yß\×®\âî} ’áy¬ãwJ6oóz’)ŽÏ8n[—0k þf™ö{7©|b®óhÝ^Ÿhý¤÷üæcôÑ÷ ¿oãÈó8!æ«àù-|,Ǿªáø–~F6Ã$1É:Pp‚ñ-‹Ô¸#Ž«qà_ºé¨[ô.Ó2kÜr~t\†bÂÙ^¬×ýÊ–~cÆyÌÿ*V>‹_Ó×%©Ok¿M9ø":?„u³„¿»åáÿH4ÂÃÜfÇsŠöwJÛP›øËõY[ßÒGªû¿ãm9ÅÍÈ~˜hÂt:Ä«£?ë_M:Öqû”•a¤Ûü€ ?Keƶ7ùcz¯?H§~±ùòhÇÏÄëkáÙïÑxü—ŠA U]²•¤Çqù+âùžv…ÀÆìcYÈÞÂtõTãö÷úw1™7䟇¸¹"½ŽJÆö¬œ)?'ó°¼oîÙ&Ö×”ðhXP»\áÁ°ðÊ´ŸuRÃÏ'}Zø§i6VWóöÄ3 ŽegÝä8¸l™­ÿbRCÛtçM´0èr[OMú:¸çRÁ“ø€é¼¯¯+ã¡cmÃy¤eèä–GAéçzÔ: ¯`ðc±s“ž÷Ø_èýàæçÜxk ÿ#u=]û»ã¾ÓÔy¿ø¥Èyµ }Ú•¯~+ÜÒÖÉûw5ŒÐ÷)ÏÙñ sƒo•y g}Ij•ýÎC›„ýÝGçÅÃìµè×W.øœñeòôó o4ñn]Ìø'g¾>h¢?ø¥xq÷*e~C%ýüˆjñÞ¬ñ5 z}²ßvž–ê|Çu[m†.éÌ·èý|ûšÄU ½ú¡ƒ¥ÿ ¡™¯¡ËãtÒëB£Z<<36èK|hâ6¢ª_}ZyùO¯ˆö/,urÚÐfÁ!š—ûëxO|}tNÌŸšþ¸“Èû¢9Ëÿµ/Mzjej¨fÀ|ÍÆÊåêyLËЀž»ªToM¨ÃŽÛIíO|æ?._îÖᆠj_ˆÖžóÔ®]‰âÞ—%ö8 Näw_N­÷è¡_¤Ÿ.ýðŒó¨/Þ ÷—ùÇb}|kÝß±CÆ~¢œ{júá\‚ƒÉòL²~‚îë”øDòÈpožª3A|,ëÓ~Iÿ;ÐÞï|qáÇÊ{&u¤x]Ħ'%õ±ÐO¬»¸yÈo4!>/ÃY¢¹%ÿò9«û®ûÈôdבú³G©ŽÍñÖ]nÙV¿ ·7ôëÂö"Ÿ`‰{œu÷ú|®?N ÒñÊ7à†ŠÒéÛcÒyF qx½Ìd˜t¹ÈC-ÿ^¤?‹é³£õH.­Ÿ]ïâ{b­K(ñ·sã±þ˜X»(VÝÄ—Çî&j|gz^7:ò˜ óHY™|¿0õ?õë齨–N>,äu7ÐãÉÐH¬#\oùÙᡪ#?°NÂüãˆìòL2p<__%pøÕ)>ö7nxÃÊ,ïgÂKöQõP|ë&,x£¬Ï Â*¬Â\-ø^²úΦ8鼇rR7ÃEƒsŠCA]CêW‚ geÈ÷X3!:Äëaá~K¨ÿ|¢º>¢ó?潨ǣ÷Sû–Ëúïï9U-ÔtìkåkØþ@Bž¦×XŇiaؾA/³ÿü¬ð Ñ9YŸaY7·õËC+úÛ†Å÷-Ùx)éÖúZð»tõ®lý¬³eqõò¸¡gvú K}^žÏA¿nùŠËÔÒ-cÿ¬ïÃm *ñH;ת}W zT&½Û¤&û¡£È‡¡Snûvºò»}óåÁGÙÅ÷ yÙô7Å„-YÁW £~ý7å‘l&õÑܱßœÍßgd·Ï€4_Þ†/‰‡ë»èö¬èŸ À ‡gz|õ—ÑŽåkŠ’é[——]¿u |MO\HÆþGZ†6ñpm˜yí)Yoæ:Ñ’7üovñŽÈ‹žç}ý"O†û³<;êyêZ’k¶ûJ‡Üæ œ&ôãƒOiþ/Vý*4¶èÏ¸ß ç.ñOhP>yÕXÿ=Qê= ù­Ç øÆ„ú &>Dp”õemýܹöu>¯Iî[p‚ê·Ý£y÷®fÒ!C!{»y¾‡D_)4d:1yÑþ.^è§w_@uàv~ºÛã8òV}ß/4&]oGB¬ús™øÑIí_ó›Àíñ>¾†‚×)û¡¢g40xS]—Lý”Ñ$·¼!Ù‡ýÝâniÁq†ì݇$©¡£Ê¯1õ7w5_¼xÆþ{輊cò»¦„¯‹‰Ã6ŽW`èïÚ3Ù¸2bÊÛ{税ÉòW§öäøS_ˆàOÉÖ_®7„š†úxMÒyì³¾qþÁxýÍÕLºRÁ§ž¼Àö cŪ÷gÑÜ¢÷Ù—RÎCGKö‘߇6†þÖ Ç%y"™Çó›WÐ_è2»Î§®8–pûÞ^d âEt‰7Úô¢¥®#:¹éØò>¨Iù†—./ÈfÁkžþo˜}V>N‡—pªj°ºí”/T¼ ¥ÏuüÓo£|,ÃËæ6~ÆÎå'稿îW\6º®Ï§ä_gý|>ÐÎyœY¶zÛל ù³s/#?ì—w·j¨×ßÖçÐf²ÿ&ŠÅù¢å™>z³ÿ›ÄËûbÜñh 5õýj`è;XÙ¢ƒßƒüå3> ½Èdñ‚+Ïm ¸ƒÁ?*“z|R‹‹Å5ï¨zçžý)ÂýHXüïˆËÏgÚjþ¯jô|aÊÿñþÁ‡¬¯\¸%Ç„‹jW6º(’7dü¾0ݺš;öç4ô¥´é¼¥müK}<Ñ6]^¬¿/¥Ü³¥'°ALþº!ÁuÎѲlÖó¤}ôPÇ3~4èe¢‡¥ïl+ ®ÒÒ¿$§‘Ÿ‡BGÿpŸm¾Èî<Æqލâ‰o¢øƒãåeQÃóx}ýÞgÉÇÄùt«S6Š·.¡ut\œ7ÐÄðyÓÜö}Àô6ÑuÚsõx’„ý)xëy6'þÕ–?ÄU‰Þ'É»¿Íly5tÕ_߸&ur2ŽÓ¤lð¤èÌò—-¢ï»©>^^ à þi~:qn𥘯L:HÛïSý,?²ÛO4ø õ‹žòwUo·›¿cïÖÇù¡ßü¼ív=Qß³Oã{£.ñý™'uºƒX¡›!Ïmè#Š®„ß5ÔulÓç-Ò‰ßÐ^è:øêܦe¾ù&t&~áP@+±u¦º_½ËK¢¿¯B<ã|K¿½,ß×Jï§'í ÜÏú‹~ Þ?©w|n˜âÇGA­dφŠz0Ço¿¼Ô™Bï×Tÿ²³Ð›¶=ŸÜ0é†DÏe\Ý+Ì;Jý6Ùò³lëapœþ¾˜#œ»î²ÚžüôÒd}z†½.ÖÍÕ}vÔߘù‘a?ˆ•¢€Âèu ÷¶rÓù,Î2߸ª#_ûËxq›÷{\μÂÇí³Ôª3ùޝEãÞºG_/ÎKÅâGcÝ?ìå6/¹Jà·üMž«¿îègÁ%ìW¿7úómêwpxá÷ öWôÿ­° «°rmIùw§ŠË—þr…•/ã}ƒ+¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*,;†¶ÙåãÒ9åÓ¸z¯ËªÎFõUõÁW<¬òd>·ð"Ÿ‘õ ¼Síà©§h3É; ŽΧoû¬è;¿MÆOÂÒCY壣§ÎÞ‚ z=ѺªŽ×- û$1¾,ª8ö5j/Çuã_˜tzã_ÖQÕ‹ÉóJÿ,øºéÚ ~vqahÊtv_pã¡®ì×ãÒ]õÇ]ul1ù+Á ôóRð¥§î_Kƒ®me¶•äùI¥_EÆø²¾§EôüT÷{0g¸àåt¨­ëÈëFe?¾gð‰úœàánȆJÆq¿ðãÁ˜x÷®:CøñŽ“‚XÚ1ºOSeÃq¾$ "®3å§|AºŽ+ލzÀ«î:Ýœ)&ˆ¾Uh‘°?Ym‹^Lñ3nú\•<ûXÖJ—·‹F–~ݧo‘éGïS?¯jŽú¤¾/ ç5%ýðvñxâÙ6ÔK‡×Èu+8_Úºÿ>Ò}lÝ QçƒzŒ—zZ²óNt€±õöˆ›þŠí}°é[¢(žž2šªÇ5éáºOD?€§|¿ñÖËOêšoh,to ú£ñ<7¾¢®o?¿QY'†¤ÓÇ>ø*™Î$’ž@Üã.y<½ñàφ¾Pg°ç0e]!›aâöDzXXõûKªäD÷%©aB+7^ê×ÿ‘èù—þ¬i^ˆÛ÷ m ~G|yæ'ʾžÁõ~iZçoënë#‡>C…N'ùؾ+‘Ϊ¦ÓÿÕ˜Þüä>'ÿr>¹Ì' jÊ:þ¯R|Ô–ü¡'k ÿ²;¯‹^ãúèjèüSq^¶~=T[SŸÙŒó5èÞ>W÷¤ÿ…ÍϪóÄôåjë‘«“õï¸àvå|pÿq¡ã½Šõ1­DúÞ×o÷ßÒ—›&œŸÙÒï Û[ÍÏI=$4ÐÏshhXg.Ý“¨~„Ç®x-Í>GiÇè/î ª3=ü=úë”´/¾½C;Øêè­ƒcܯ†þsé'‡Û]¼Ê+>ÄüñYíq¼3ÞSë5-Òíè[ûÿç±H?È_­•NÞÊØù® ÂÞ=-U½¾´ m=óûïˆu =ë~ý£uÊQ×Í?võpËÍñú(tu\ÌÊ~~Îëù–:¾¸ÿ/j„÷__ÕOŸþtú«¢çöT?ÂÖosî‹×_ü®Éªaék†'.Ìi¿¸îoâDõÿ͇õunþ×ôµ¸ú¨&ÃŽ{Üôrçü>+yuTÏn<§ûOÕzúü#j¯Óc¦Køù_ñJE˽ꎧŠÉþ­˜ÿ®[NÇëÅ SîÑóö·}[Ô5ÏŽÖ3AOËAßqÙß²£ïaX3ŽßÔð|íu«ÓÜð“&^z¿ì+Ÿý­“cXݳ:­›Å¥b; ÿÊz~=Tœ-nÜ¢ÖŸ!øæ(rú2¢‰Ï“nJ%>ÁƒÕžˆ….t‹ƒãžxÙ!z\Ú;êxÞ[4Vý#‰s ÿOˆ“ñ5Ü~·â§oÑsÍô†ÐPõçåï“xW=—Äx³?Mô¼á¡#÷{Õ“GÏ“Ág”¯¨®÷{å÷ÖãäßáÖÿUù/ôbN ý|÷ëèëÎõ²e(¢çaôÔXõ÷¤ujœñP¬ý±Mø¦ç#ž§ úO¥/¡©§I¥èy5ȯ¹úõ:4fqE£îÞ¦¿]¸‘EžoT=§óuՋ匇ûßËúÉêNèÊôõ$¯Âu;”.ù×§þvçÿ;¯‡y„‰“é/Ôïïzž¾Æy§¨êæ—û²_æÊÐB<'(4ä9ø”p}Oð+–|%ÞüI“ܞǷêL—¿†šÄŸí˜Ný˜׉âü#¿™ô}±å{©ÆßhÇêŸýÔ¼Yð†¡ŽÉü L¯)ž¿ö¬ÚDÑHø‰¨â©l©Cá¾îú<Òæb^kÍôžh=Çè·„ÿÕÚõL,ç¹/7ùN_3ᆜ÷_ Ä‚çÕõ¾®æ'秪3b3©Oˆÿy—Â+îæOÄ5̸ÑÉ/Hª›…§»LøçaäF‡«Â’†Cü­Eñè§~óÚR ¾ŸU¼_ð‰cýµ¿^Û8î›b¶â͘ÿ‹ï<«®ƒ+w ¿÷±»âÕ…Þòÿblw±Ž—Üíå?¡JºzŠw¼Ëô»-~—k¾9msÕ§LšWÀ%#Å{E~qðñì—¨þ°%_æÊÇ7žG×h&WúšhÆâ÷–éð—¥~¡u»å-"ï'òõy “®v…Å3S¶¼–Ý¡}\u0v§Ð¿>숓ha™?¥Ó–éúxäºO½ü7̽æä{äZ÷@5K¾¹¾E'øá‡f3ok´ò‹#ÌUâ?ÔaëÎ%ÛÕ¸üÚi~º³gÄ›e܇ÅßpÃÛÔŠ‡+ >´ð„WF뢇ÛHø04£úiçèù8cœ<Âin½@]_{¾*žÿF~óZ°ŸõßjÈòå†~ZÆñÏŠÑë z'[9ÿÊxœ ÅÊKK…qÜ –] ?öòE¿»?§«ãÔ°ètu(Tç+ÎËÍØßû<;¥Ó×Çö1uÆÉëG: xnð–“zÏ×FÖÓyZ¬óKþ¡â»û²¸ãK‘åq]XÇ]ù'}¿:º¯¼^~_z«8þãMôýKf>(ð  _¾õEáŸ3^ Θ¡æõ{«þúPßǹ/5{HGhœÈ§¬üJ¯—ö ÆŸÜî¶R±é ¤šøÿg¿>9Ïýÿÿ‹ñºPžüúÊÂïü~CñÒjAù›§¦m%×êñtqùõ×í¡žN}PãžýM¾²®Ïw6Ô?gÿ¹N\ï-E¿Ö×÷}®¾?;·Šóßz·¸?Wîþ—þ zjaÈ»x((]¢¾GO]ü}eÞ/òs»Ð±Ô!Ê›!ß·‚oÓßWê—Œ•Qñ¤¯æê÷…ãUï•ÍŸäë"êP¬RvóýÁ{zü HWèÍ·-çoÁƒáÑÙz?qÇã©ô Ç»½–¸õ)ßÜEűŒh!æ…ù“Óé×s±Ð½Ãä›#ã޳„™âtþup<;yòàY'ulX.ïçáŸ'Ãýàæšñú—Îo"ÖÉ"U77ô³Gndù_U}b©;¶DÄwÁ†x1áûœˆö{eÞ Ýh>Õ]íÇmÒ¿”uùšêø\WçNþYkò£ò ú' Ç9¯®€6ô{:”ÏzRR“yX”ü\ù}¦~æ®z”åÍ8þ ½눟ˆù!8æ¨ÃiYÇ3Æ'\V&8ç\™)^”†ã…?Ö+ž?†vª.¡Ô¿ÿÑ"‘¯Ê‘þ·`/ÅÍ´Kžšïû„9ó…?44:?†b–G¬jÐÃYVÉ ÇÿàÏŸ\ŸšÑï`zȾú5ã_[äWÏ&}àsϸ$hŸÊ<ü.ç(xÙ¨G5®÷-Üp¾¨Átd Õx_+pÃóëq¦ïÀqYáçµ=߇ÍÝœp´qû8”•™údcÂ½Éø#žl0Ÿz=µ u˜ëv«qwgu^’úX¨eÀƒüÃíývå!`îT1ÿ~ë:‘W2Õžuõù"ž]²Bä¾p[ßQ›Å?[i¼ê†y¸inë¸v·²Ùü{´bÿ7Jæ£ åªéÇ‘ºÛò® m·ñ“ ó*úèãÐà‹ìèɆÇ}ædÁ̸>J=«´Žü“ê±gOe2ß/ñøUÕü+¦²¸ñ3? ga´Ž6JÖˆy ¸¹—šÞç®j¼ò®*Yô ßô¬ëðöy1y ¯Çä-ˆë`ÅW_þýº?ãi7}Û*†|Ö·~·\ÁÙ1!%Ô›q޾>ÞO|1ï íuã8M4ô›çñÃoŸÌ{4#=´3¦!Í£w¾cèO|ÙÕµå:6ÿ-Y|V•ñ;ùô’€A”“}¯:Zú"x Á·çíôºäqûá¡Zvæéà„ZW•}âöQÉ•ûËF÷#C¿¯^:u ÉWqÀïäV߃õýƒÐ¡—òž™âFÙ¯Ê4¾ ב±ý—žu¾Ný7š_ñøÌÈãûYý¸Vnó¹è—Pßú•tu¶|u„ŒãÞMÅý‘y.¾ú=“jÒùü«ÿ3™¾jÍtxl®ÆyˆÞû³ç>­uPòtlþo¸ýÕª~\ ¦/Ö‚ñœ»òež|jëyUqÔIZõǬè’fÛLx~T÷ãÿaÐÔüÄǹÉ/¢T-¥ùüý²ÅÝ{Ùÿ,ƒöÔ÷æ¡JsOÆãÓ.Ư>– ë Xù}ÏRñ·†Ÿ_£¸®ŠA·â„Ïq4ZwNêȹžFÔu¥ ­DüÔ…åUd>‰åÐ÷ûz݉ÕWˆº)×g¼VàîºYÍžõ?¼~MZŸqthA<»³kéýÛÿeùªËaÔf­ŸŠ?uÛÒšå2ŽB!õì1l7Ið8ðýñõNæÅwåO ¥þyã}Y¤Ÿè;~…ùî}Lüíb¨ËµgþFñ¾£M̾"+;œ’þ€«aù»9Á½à¬+s£{uQi¶QaVaVaVaVa90<ñâ ‰úF?ô†> ET­iÑ÷¢>›ý¼š÷¬]׈Û'ÒfÁ!Ò5:ÎtˆOðýütªLÆû¥`x4/?8ï÷ó|Fø¹¥î“Qÿœuš¾oåQ©y\àé¶ôuËÃŒÏKÍï¶NUÿ¨V"~æ~7gý§{JNþ]=F­ï¾¡æå9ÞMõh¥nË­7GçûŽ”o|«o]+Û†&¬TFýÐ>¥qO²ÃoŸ¥òzpõËsćW¦ù½²Û<„Ž*.Íüêu˜ÿzNtÐ1€õt¬ÛÅíCh=Ÿü˜¸!êç„–YÂЇçD=ö§/ÔzÙ›¹Õ•C#O½`9ï¶1èÛÜûhð&nõüç ­Æú/²ëcãOÇõrVq¸´ÚÉ¿RÏ#ü|ó_T½‘÷üð¨ÁACöÛŠynõjQéÄæ›Ù«u+O\’ɰëY7\¼o}…NzÈ¿mÈæ“×™®J7Âÿ.yV­3Q= Ö×ë‚ü¢ó´“}!ïþàä ¾²ð…Ú‰÷ çмðØO„ÎÆîbŸGýŸ\Ýßâ ÔË&~ÀqG\@C†Ï t:°ë%¯õÕÆ{*¯êVOØ?â#?Iê†båC‚çèŠC¡º3¯â‘§½ø¨hèV7’ø‚P¹«'3½%ëqòP| %Ë„®óÞdþ67õÛt¶ð,ü×~~È+?=x×€s 8 ÏwùƒÇõ|Çú~~YÎy1ל¡ÇItö¯‚=„+#Þrpاò×I·VŽ—q“×êùR…éä_ÐWÅKáÁv¯¥«–ø 9’Uþ–ÉPÇ1Žê)xCXcðkúöJ´^ ›Ûü‹¼¸GÐ[ð‘ŠãF3ú{æ'Uêù—ë… ›ªCˆJÙõP…å û0`ÍÇ¢Ï÷øEÎ?XÝ2]ݦ&”ï´õ-—}Š ù)4ôägO~F̓±ù5IŸ›éŒ£¾á=É2¿Ðf!æIßy¸¼RžgÄ£‚ÇçÙ7^Öœ·ßtPwôÕÃÀN¯ó”¿ Ëž‹ÞΠ+ù U–ÂÀæÚ<&•‰îÈ©nÆ~Ræjq™ÞãOøNœSE½uÝüIWÜ7ÚW/ºI’‹ZñxmX°Tø1§=–hƆŸGÆ#¸ñ‘¹âÖTyOiFîÓçk2\eɘȼ#žqð‡özÿóïŠô+Bÿ·1ýÝÕ)žÎÙÈxýÈ2ƹ}­ˆ× zCÙ2œ÷v¬< -qócŽçoœ8çàLgã­²áÝr“yÇŒÏgŽ¿Äÿ»/PõFã2Æ ç/œª&unƒ¯RŠÛ.Ðê±#/YýƤ‹kÜÞ³¯Qy7©_iêû×Be¦w!u Ò:NÆq=uK2ö§üŸì#w,€,^½îîøX¯Ë|ÏYÑññTW¹ªYÜSŒ4ÌJ§_K\ËèO³Nkì R%Ùú‚›„±àRÉ Þo@o}~ßÂ/8@uÄÊôþ¶Iç}å|Jûöžýî«u.<òÇÈû‚‡;©ùŸ"?]h4`óšAß:[†JT/{ݯž-ÍUÇÌù|ZÒóR¬Þ˜ø¢´·Ûþ!ÎtÔéB7¯!>/T×eГ‰iÿˆœçQ‡Æø€>_XËÑoó|âZ¥{ŒÛ­÷#†¿î—'è`À=ôM_®ý;Êkÿvÿeôab:‚øæ‘‰éo„ã´ ç”øÁ»†~AG诧®:©÷Iâ\½Ïsô«Ùás8â¸Ë«azgêsÅü‘«'‰<ÈÂçTj‚^ï)ü~Îå:?`³àh:ñkðEºýóЊt˜»R^:~‡¬;¡ÃÝEë·'5©c†öãÕü¸ 7ô~+üqœ¾+V|%uíâž±ø²’¥¿ú¸ÁÑuï…Ï•+þ…ÄY¡9ù¿üº{æåϾÙ)oŠÅW¿é :Ë<ŠûçéõG‡R×SÔ?¶†Ç4¶ð‚.Vqk|ò>þš®‰òèï÷¾f×Áö‰êõ¬_>ü& ê£ÕñúÏS©‡ûÖáqG•Ǿ¸ÀÏ=UCõ×f–ÌOÛy X5Z¹Ï˜_K¼‡kk |Ï×7‹çùY⥜Í—r5ɋƃóãß>øÂH¯yºmJñîÔ-"î¹mº[½pðl•×Q¬cø‰'ùÜèQ¶úîÒ‚wböã2C¯Gõ~¼ùËîõŸFÙñ‡²Eq<¼`\6ž•¬_Èénï1v=£êg4Rï/ï'1WtÛvý 1ÏÐ'ÆÄóÇýshü= 6ëyaVÖ÷=ý%å;¦¬þ(á1v]nëe3¿.øõg3¬{ÁÛn뫉‡÷Òùbž®í‡ç—|wçíYü‹¶„ïÍsÛߨW{ «3WrÔO§n'óMeàãžVêv¢Ìx5×:G\¢pÖ¿GöÙ;^RÃX}\“xÜ)‡•ùAö1 ^ÕçeÑÚÒÏ}õ9"ïiy¾eŸÑp¿VŽ8¸ŽÑ몸­è®_0úïz¿¿¥'_§.ñ&~¯ŸZðb2ü¹ÔCC±á½ßÔÛË@â#7cþq¦opëÏDü"ûž8êñe/ÓŒq{” Ž2׆Yo—ë¼™\QËWäºngìGú<’7ˆÑÏòcòI¤ÎÚÂщêçÓSÅÿ OºüÇà ùqÇ(ljÿ¤m¶ç ®Uý˜ž‚§ŒUÿ¯OL=zNNjׂO²¤¿ÙÄQ¿¥.‹C¸_L|ZŒtÄq²>](ŸŠ?üWvûÙÛ -ÓÕßÁ†^8lhš•ú ꋸSò,ÃÏ»§—Å­wâ´%ú<ýuu£uÆ-õ. ÙýÄ1ÏJüjÆ÷%mõõüf,>ëÒ^Ï×;³žˆó™Žªø½ÁWŒÏ–¯Ç㇘îÕ,Cþ€ù›èŒ'‹³¢ïuë$ïš®›÷ñ7Ÿ$vÍÐ7'>®øo‰¸Ž?ÇX÷´_Ýÿ¨_}Iêoºÿ":/G½^ïq xE4cú¾ ùÓḵ¹þj:yóp¼¹ÔçŠ÷3øÆZ¯û‹ªÔWR®›Ôw2ÄSmé¦oÒF}ÿÆC†¸zäó®ç¿Ž•Î{Ò‡òößÓWêƒpþ¬ÉŒùIɾûyO{À³»%n·×m;ihkÉkLI˜Oú\]‡ƒãÉô`3ø8Žü„à^D®³è¦Æá8“ò¬Ov=ÂñÖ×ë!õ ~í©ÃßÈ€Øç7[SÏ/Þâº:¨CëÎSãŸPê‰Ýó^ÝKõŸÏRõy1ú|•wÎûÚï'î¯!ÞûÊ~y-ãù] ò>ÐA¬ãÒOA±`ÁA¢¿þ¹FÂC Ôëâ :éÉÆÌ¿…ãœ×J­ÿ:òÐ0åé¬è™ô€ÑÜ/N P>$¦’k ÞÑ¿'ñ+UW̧z¼Ó]FUŠˆŸˆi"ÑyÕüfý|$õGÃÿiåÇôbÀÉ õïÇx%/»Õu¥>F²÷úÂ[#ó È£ümAW¹§Á/éHyì7-ù²fýÃ{Vx­sÁaš/Z;æ9Ö s4¥ÿŸºýdæ.ÌgYt ÂãþÎSG4?;ºqÁ>ÂÍyâL†î~õ߸&qmÖí |`÷¡‹Àûc~7êqA2?©’Xwƒ—£ç9FÇ5R—Üù÷l¹Q­Ê¼ðüõÚù‰÷¯ ߃3ô÷ ïë0ÂÑÉü幉¿½ÓÕkòÕW÷«gÁm;óä¼fË󣟈%¾U‰¿C<#_]9T’z}ÿ&yËò<‚}„CëD÷¥×Caãäï5bqgÒ·¶èòÈüqÈã8`ðƒ°zܤ?d'ŸØ/ÙóÃy“¨«_O$ž$ü_êÄ5ή®žoÿ‰_ ŽQ³{-:ëØÊÉïÆÆâ}°Äm¸bžÓý‘ÏSæùXòuM¢¯òÅ÷œGŠA¿ÿçE·+~[Uâá5 y‹üw€ð5-é=Ÿ$ú'કjþ³%í7Œ¶«çÿçë·—8înþJðØýÓúÔø¿›Õû• …‰ÞT÷ßú'ºžÑó êÒûÕŠžã©ÏªõütHIòQ$Ö%ô¦>N÷‹ùhÞkgÈK^d †ëaùðpûÎêºæ%¨ï’Ô 0þ>†‘:5qùû¨lˆª²ø¢…~gC—åª?TäMýRãts<^GQ/5Î#¢yÞÁ1VgZõ²ö¸¨G÷o‹ú•¬/Êü ¸=ƒŽ°G<§=GFÇA glÒk_õbýgþ,.¢ý¶üC¼g3(<›â±ñôžT§¸2¦¥«¡áÃÏHÖ%µói}¿ÐÖðÞœ®ê㣅›ºøé ‰ÅßúÌ óW‹þv§õi&TžcfýºA¥J~×õ¼Âqæ©âZðOÂûtÀQD~飑ß9é^q},z Á¯ÜêW¦þÏ<Ÿi34qËo¢)ÓõØï~˜øFq CT~Jó¢ý°aéâuŸP·¶þy޲x`õ¬è¸p]_×öÑç÷þuXQ,ò0 _Uóo--ùò"_dåw.bzTƒÞÕÔí‚ÏÔû‰’Z©è†_¦“À”Så£dŒß8úŸWŸ¾Ÿx¾À1Œ·Nºšp7=ÌðÙÁñÆ5ÏÞ»>–°¯Wp„êIY¦&z0©lô©pu3½Ý":ÿ„©ÛEݦt®¾>³¶Hy³Õkôýt0d»žÇ qÖ½¢ëШf™ÏóY}òüvjþù‚­ª¿ÖÛÐ_·6åûÝídèË &|ûœóvÂí‹,ú‰#VZîÿén}`ë¦S¿Àq>ØÐIÕãëoÐÅœü5_rÅŸ‚ëL¼F]—7ü,Y?¶ª†û<šð/¨ójdç½p}ßdÿ­ðÿ‹îÇS<ä— >ð=‚0ÌŸ›(×Ðç ¯õ_pë7³äúè|m¾ÞâùiQþ˜çkiËÈëJ>FŸŸÎÁRÿžSEŃsÝ…K~.ò·#®\ÿseØÚ0ݾZ}>ˆŽ«›Ñõ÷ô³‘Ÿÿ¡­k ™ÞHO¦ßLu%SßÛ|‘ fH=ëð{Ò!–Ï[Òó6þžŽÉtÚÂqJÎtã©p–qM£ómw>¬_W7tqß6Aï·Ôcÿ_ö¢X÷˜¿ÁûgüCÝ3ãx¥œü¤ƒïÇ™Sãõ¸è¡tûÆržj¿ßÓç“ÎK¦SÛÔ‘·WòŠêçQþ %ωï]]CxŠQCcÅEÁ‹|N'}Þ”ú6J=YlZç™' &~‰Ìg÷ßõ¥Àù­¾R¬w- ¼—›«ü´ÕoˆëSÕ€Gq¬ÏcZg}“ë¶§ËŸ§üFÞèüWÄï^¶Iä³K»¨þçÃmÅs3g—ȃ­^Hz»†<Ê^Cëö¯‹ü½Ÿ„>¤çFžq®ò¿&CÂ^÷3GiJõç·Å›Ÿêg—ÿ„Zl¾jl¸Wž·êny¬Žö¯±¼YVñEÁAµ>’uü[ç½Ñúb’牪3‘áÿž],âK ?$c|®ëØŸðaà 8ªó>RßßùÃÕ<øš—ôû 'ò/±ëËðIû³ãŠºÑ~S K>½¤†¾Žù±¿5ø9éb_7!Õ8޼$C^ÓçŠù·Ë?2¿Î”¯T=–¿MO‰õo×fá×ï8¤Ö7¾VCàh/¸@Ìw~[øý7½$þŸx»Àu/%®ëµźx=ákKÄ£„k®®Ÿ›¯5 ~†¬K¬*ÌI~›oùò=ôÿ¬¾‘ïïKå‹« [Ý€ÛŸ›À è¾>çkñ[û®Enøœ¡æŸqýKâ½µ3«u#ëyRžbO:ã…ëãèxº+XýH4±±'ÿ®³!¯q,åþ‡ƒ£óãÎãtJ7Ÿ‰*Ù©sáb¿¾Øá~=ýô7]óJ\GÎyü.¼g#–Z2P¼÷ßþo¯õ×Ê–<4ɯ­Ìtö.ã^×ûEl¾M«ï\Æq,x!ïñ>H·î>ú¸ ÛþÏ5ëÔzÙ-7¦òÞIœ¢õü3¿ï\†ïZpŽ¿jÓ•~ïS+CñÐ%^ùU\ø¤wœûKñ^œB]ÿO0þÚA°ÃÈ+Õë‘[}Äd&püº„O>nø¾é”LùaÄC$þÎxòºq|Eøù?ãÕë±LIJŸzÆïÚã8NªëTaþñÚÕNÏ5®ß”“~_ÁqÊKNÔ×ãÃóéI<¸ÁõX?fÇ:féŒh<#Ó; ŽéówÆüÖ¦>* ã ßy}VuÝÁft\nàÿ9™ŸƒÙú~E®æ«»÷²"®\$êŒÁ±tô¤2ŽÓ‘ðØMÓéw‡&†¾P5Üü0¬×ÛÖ¯“TÞl°/žÜ×Э|è7Û ›ê{=¿Xûýdù®óDÞÏ1O‰ÍT'¯ÆÖ•£D~hÕõâ/ã}c^nú3J~~Æçm™NÕâ‰úy²áíbæm%¯(ou¾šŸüŠùÅg»ÍWØY*ê#¯øÚ§{æmSÊKK=Ìóôeë Ó C·x³ãõá|\IýÛNÏ–OTdzôOÁÍ7¥¯ ]s§u‡ëÂx§ »>óõ:ήìµÌû›nÕë©ÆäédŒ?{[*¦ÖÅ×OQžktó««S¼Ì+fo#éõöß"ârÒuãõTOÆ#G CYhÈ·ç>¿ó×*.ß²ÎbúÃÊsW'Ȥ»š´ßeRC{½ž‡)_Žš ÏDúºè¨¿Ž¦:0QÞã3‘:VûÑ÷‹ó}Âý5ˆæIyêûƒæÌŸ EÌ8Ü[ª÷7x¯Ï²“ou5tÕ㛂ã®<&·¸kyÅÿ¦¼¬Ô5îg‰KÒ²à@Âý÷e_ékÁ‹>Õ0¿8TòÌLz˜¦æÉÐ‚Ö ?æ„_ÞÂ[g³½[+Üþ²O½M4õÓYCK×-³cœ—––'Ò]Ç¤Ž·ü;6©uo†»ÀÊ ÑõÎií’Õž×¢;aÜÿÁö·õ‹'ÍòŒ¾õuÙ/åEõ½®ÇQ£±Aïí¦bw.|RÔ}Ï!~Àj £ ­ÇS†©ø–,Høi¬ÝyBÞ÷Eyâø§‰:>¶}©o¤ž V_%x»GX½æüçs¢»€9ç¨õŽIW;æáE|‚÷¨~ï 5cÕ‘Bé¢ûT~éä”â„›D|9ä1=o(/Ú_7öu)´ô ˜U‡ðXS÷9Í£Fÿ`Á©Öë8OKQÏrŒM}d2¶sõ{»Ð߉;¢×kÞߦؠ§5éÕxõ*z/ÑHý}!.µ–aOè7qC‘EOkã§/^ßí>àÖÄûVé—?!æ±ù3ÅßÎ"ÿƒÛ>Nφ›èãÚËô¡FnRë“}—;ù“¾ú9\,®%í7·~ˆÛÞ¸ëƒ~ú¦®¼­´,ØËŽ?IÏ÷ÂÙãSÍ»É>5Ÿ¿”¬Nˆ¶ÉâZLÖ±KË0KèãüM99^¶ÌÔ¯Ms£o„9ó½âY̹UÌËíÝü”ª?Æôÿ3ú1ß~£ðs×2üoÉ\§ºMO Ë£u)8OÑÕPä©ËiÒ½Ÿ,x¶ò¹úD¡|éEÑ|ÀâRãÜü—”ûuÆ5¬éÚcØï–‡Ýô*>ÔÏ‹aß K~Êf¨å–·wÕá—}fÑÀó<¬§~YANðŠÁ;„[nËú¨W÷¬ß«y™ïvï]ëÃÙ2ù~ã±3¾ÝÑO˜w y_²ç\òP|ëª|ªÎ«’‡i<Ïêýá÷;ÇP‘ýŽ2Ƶéõ7QëV¾þPZº{˜2ÃéÈ×6oåÓÑ“Ý#+õáà([÷÷ª×ÙÄ/¿·è4gËGëî×òËtD;½nKð¥Ï„æžyÿ/hþ<®ŸyZtMˆ[êDø (OVä—3õ½µîwæÝñô{˜.êZòd#»Eã jGçA‚Ï :>W.PóDEúz ÎTõ>1GÄM¼ž <®®”§CËÅ!·¼ §’-T_ÃÀ٩̸j«^ffng®û“c÷³¢ŽqË­?(&<䙕Ýpÿý(?xnc5_\“٧Êz>]Ôº–Íu+òe|ŠÙW þÃæ¦bžÙv¹Êk91šGpëÀdyžû. >Ì Óa³¤úhfñO»Œ•—LšÍ8F4ÏÖöSQ­»dÜoÞGj½¦U–øî1ßL¾Ëi¿Øý[gýDœ-ê.¸k˜¨^R'^^z鉼=¶¯åaúR¿|‘!JËdÿîðÿ„y丆ÑæúZ³áËÃí>tÄáÖµÄ7†üT¸ÿe"ÇugÄÓ ÕG™?Ð_ÕsÇÅz=¡•“ã½'W?§ú§¼ðåï¦:¡ÿF·|´g_E,z›áGIǪ‘º¾øâg$~2üõP1/°úåïå$OüFû\¡2ÓKñìG‘–aÊ=.¦»ŽëWˆúnõ˜8ß]oøõ3ûŠx¨çýRÅy”6ðz$?¯ÐãkbÆ9Îêÿ.WO"©¡*Å]Û:«¿ÊûÁÒ–âùƉynþgjžÖ‚§FmzÏΪ¢_§êý}ì¤âßd_ì™OˆüûÂO¢~m¯FûÇoèWq&å{†Σ”ák°|:ñWPM¼ç®úQ¸=/r}‰õNöËÆ÷¨ñe¾ˆsÃ~t‡IOõÆÕyõÂbÝ[]KŒ³{:ß-"Þ{šG.£þÞÝBH×/ñöä+T^Ôîgm?Uÿû+ùñ€¹Ʊx{(ÃKðÓMËÀoÕÒŸƤƒ[@%KŠ™KÄýªïÈo¦ysùÙ.¥Úí¼ëI;æódÏRÇÏwÚÄû{Íze½‘ï.áµnbVtƒ´Œã£ç3û4·þ—²Ž½tŸø{Y‘ö¹@u]Æ5Õ¼QOÖ¿‚Å(p[_$ïÐGb@Ê:“}¡¤|Áx”_°~Ó¬/«aˆÛsîÊ3ÃʳÜâ yÄ:Èúd¸îª³™-7d}—çã°ëmѯX”µq½ “^»õ¼Ö½§â [3ç†u)ÕQ§üJ}>Z±çç«txò§š¡¯¥nvþ™"¯LxÌí©çâ?Üp?lýÆŒUnûyƹØ2Dõwçj½pÃ.‘7¬bÀÝw¶ôœ¿Cõ—òi¾ïî†v5Þç%üüKƒsM¥¬Öå­ý™çôPõ… ¼µ9Åߎ*. ÚF®O§€¡úúj8νT|Ûñò§ÁçeË+åÆõÅÂÏ?eúržïâ¦S*ñIû¦…sÏ‹ü2‰¿³¿¶§TìÆ3Ž['ÙïÂÀ„ÇocеkN~!øž¥õÝæúuÿ×ûçÜx?Ãðó÷búy«¾Ÿ(OuE¼?£¯ºPñL&ž0:XøÍ£ëi¿Gé—úçwëÇÂïíéxþ%Ï»áÎ=ûؤmÁ ý<Š3ÜÎ 5(î>jxï ÄçÁú¿Ø Ï±ézõ>·'^ÙyðüE´ÿ%ñêÞÎãW#žk#æ'’. Ç7¸âty]Sçī߯Þì†c©gø¼év/û­¸%W©~Ê„'¹f”š5à¯Ð@?Äíc’1~ûè~bXx‘šWÜú²8ÿ|¿<õ<&0]Õ‰EÑxšÓ óî+Žyž‹ø ÀÍoäý,1„p«6 >.é¦Ùø¼Ù2lZ“ª>c…eÇÐå%Hï§žŠß•ñœÎú®À±1Ý&¥ƒ7Áe7hýJ®gŸñ=á™ÑÞÔŒøÞ=OÂ5²™)/gÍañðSXûËDó9š¥Ãß‘ºuÞǯFë‰Ä™~çsë|o>OÅaçaÐéÃÔÆ©Ô5M¿E„¿-ŒÇ7ÈÀÿT³lÏy«2ÿÕRÅ-à¬ë¢ëT#†ÎÕIÎ×ë¤È¼7¶ ütðó÷Ny}©»•qœêŒ§Ø<;<%›aËH?ükÂ>#¾fë#{\êï‹Û”õNêÚ¢Ã\¹Mü)¨Ãâ/áÀћƫnˆ/ïªú£74UŸïŸÌ_Ký\ñšÈƒŽ}È-ߘç¿™ôD­ûQ¿Hl°à†3üã3U\ÿš/I'£¯Š•OCéß“õqí§nè×”1ÞÚi*߇ò·¸úbý>Þß Ï>¥âC§üEàL?±ÜÇo~P]ôQ§ëÝ ™ÞiZ}›÷ 7Ü:6t¡`óÚ÷×ÔO“óÄPËož“ç5õ~ï5^eŽ_~?ÿYý|U-$ÔKé'tT±p¢:2ýl­$x³‡¨þ4é‡*ß}÷FO{Æí+øRÿ8©aûQåþò~E˜7Høí(³öuq¾¬^€B3x„ÅeKD=ÉÔئã†;©x»‹?ïÛ–;T<Íî)âóvã_öŽšç;ÌîËâ—H/T$„PEÝ?œo™¿Ž6„ =@œáØ×­s4n'©¡’…ÿ|†ÁOk›]\CÚzÎÜPÛ’OZý‘êéX.ñŽhª÷;ySM õòM<ΈÿaãÏTüõî•Ñý.66Qæ ž‡àæÚ•óÞÑÜ ãÛXÿypˆüØ®ž~c†~5ñéãW©·mKÅßuѺW7ñd} ïÿ,Á§‘¼ãñ7=*Ÿ ×ÿBK&‹»pËõ9ß¸Ü _ûÇ>zïYžßOõ×£þ«‚Wx ˜k’ fâIšúýH^¡ì[‚óŒß´áÛ|ûÇ¥ÍSŲª?Û)ºŸ/:úé—¥ÝoÔ×PÇm¾Äʽ®ì½»£û=xöÅàúÁ[Ñ}[¸ž¤¯¡g–ýømˆ•DòkV¿¥¿îcÎSùHÛŠÕï “Õµ¹ŽDÆ÷õí¸æÛz^D¾[¿TÕß?é? &å­+ëó;\G"mÖ¿jŸ_Ü4N¯§Àx.R_Á7Ùô®|-ø ^}‰×m᫇ÇùØ1/µyö÷‡üpY¯dq& œ*òéû|ƒ¾õúFÂ/Kþñ8}_HtkݧÍÂ{ Ž¹âž©n¼NôéĄéâ¸1ˆõ§ŸXWÔYß®à÷”‡Úp,<6ã±§mèüÓ¬èˆYKz!®õ›NgÚ†¥¼Vö^rœ1UÅ]ð}’eâª|Áò¡LÿC…ÿ†nñtú°êg©ö²ÏÔÇô̳RÅòõ#ßÏ›¥®na2?Vâ0}÷ ^Í-®ÕÒåž*VÞãi4£8´%áÆ:»ÕÁÂýwüÉ '·ì.¯÷.Ø—Ý|y® íXÿ³¾ßþ­ß•kÃMùY¾ý¾­ã9ÖÍË‹Ùâ,Y”“ß¼!ÞcߣJ¼y×Ä“ÂÄïÅÏ_6ñòƒ—Y>ÃÐôuPT#¾Õôf*^«–ï™û™©?ÏçdèJ²ï‡êy´¶qM†5“üt6›Yt×Nóº1|ÃŽ‚Tñê6üFÈjHúgå©qp¦óÖË ›Q+ú:âÂínñk}Cÿ ¿K*ŸÒ}ÓL†ëÞUëQ¦¾öû |sÞŸìuý|†ª~~?î„cƼ»½ò¤qõÈyß5ù^ÛðR®:TÙ2tL¦?+q˜iž“ö8´¦Å‹–†KÝtŽÃóp¯çmŽ™ÿŽ®_sÞ6xÎŇÕ~#ýO›>v8þæß«ø%®3ᘵá&ŒûÅÔÙð>οz Në¥æ!IŸ×¸·=ôyGÑ·‹óåLúÆã`ùuŠ;8NÔd&ÜaÆvŽ:õ(dýnõådŸS}KÖ=ÑÁ1ÿ‹ßþµª*~¿•§¾iJy“^¨|L:aXö­gÆvU-|œ"7~¬-¿›–^¹k?"Œ¥þ’ÐÝP£þxhàÇ7vÅkÅ5Ô¿“÷»úw1ÜòF<‰êƒS—rÖ}|Û’æEGÜqð¶å½Dóºg?MãxcêºÍ×L§Oö#“8ÈàwLÏÀà·bò"?¸NàÇ1}…¾>8ÿ7éü¾Ún× ê±UÏ®.;}^?¯ò§Ú8§ÓïşaΟ¼øÇXDÎ#èù…àT6ð‹X”éNsÝ+Éæ~¯ô/Q‹ê¬+Þ‹ÇãÙq³›.àÖ¯‹:øº'¢ñ'¨¯—j=ÞÆļMu5,;ï÷µ7è>­ â«vöwËOT§¼`ÝtóµR×*­ñþ¯ú;êLýÙÑ«mÐ]øZ*ù9[ŸÌp»Ê)­{•-ù³u îékmÒ9Þ’è[³ªõœ"ÿâÚ‡ÊzXœx õ$žtRŸñ¸£žôEêy‡<ã$ ^1ãxùéøÃ( }7 8[ÒÑå¼ãx%Ÿ‰¼Ý^æ]ñwâ‘o¹(7øUl¤÷¢ä5Žm›ßÚÄÇÀè¸7ØGŠv# ßï¹—üCÿYίضMï—þJøó¢ñn¨ÉòU²ÓçÑÕ8ž ]Õ~ð®y8ëqÞ`~žìû±ûÒœäy³miõ™Ež_Þ@òÂÿõm±®‹øÛÞ_î?âU?Ý}ê3á{çñ[éý Ô÷¡rÅó¢×{ñòËYê!û}»n—¦Š/Eéã^ë+–|C9ßàKñžÈ>¦ÿÿs¨Önñëëg<îã÷4WæYò7e‡"Ùgk„[Ýeg¡ûzǯ‘ü \5_àú yVë¸6=®îz>…Ä18§™xn¤®‰äi /z½üW¿3¿¼Jð¥…grÐ1Nh“wqaá§pCØöl²ñÇÇôWòýò“8§P܇æžýN6Þ§âPgf—Ïîk(yWŸ«Dùч¦ÎˆNùÙí{š–î7Œ|:+:GÆãòÆíW?Hߥ¼™«NOÆ~Cüü¼às?ýØ0/X';ºWiºSœ,ùþÕ-<·^nçÏ"óî¾:Äq ×ܬæO yVïqW ™ãZpV2~Ž©ïOÚ†üdq*ò£yÇÈK˜WIþõ2õÁÊØñ:¹_‚z~²Ä]pŽSuVß솃¿c²û;Cý­!ÓiíèÖ_ ^ršWLzEÆq)þ?Lø—2‡ߺOõ¸ËÄ;0ô Ïó#7ÿ—ݼ–Žº#ý Ÿ_ö°ú|°>q¨IñÅÒ¢^Ö&ºžˆéWéq¡½ùp¿‰¯¦’7‘ø\qH.¿/ú½mýû‚§³Ë'Nj8?º‰©_OÆ8ëþ;:Ž[Ôí9]v¥ˆËî©*êqK&‹ºã»úøÅxÞ1qqÙ6W¼X¸ý[ §}e¡ÐY;Áp±R÷±µAg¦Óe«žüŒÉdÜ€›ŸRç‹Ú–~’Sjéù ù,ŸJ<Ö´pTá¸Ïf‡¢õ!PùåèûºÀgq[‡0úœž÷Œ~&Û¦úé\‘¡Ä¹¢z:8ëà¸þsœý†úÿyžù¿q¿Lõ9ç|©—Fôþu•ú²Ÿ°š²éÉð>°Á±ò•¯ð5 X—Žžø{)ÕÖ< ç¯“ß+ó.ûmª£òyLâYqïê<+ŸƒªLgoÃW‰îkØwò å‘7÷*—ëÝ©f¨Oý"þÞ©x=1f¬[Ü7”p½Ý…ÿ‡BOuN Ÿ]/7ºî\W 8lÑ#œ]†>”©ß@Ûïú(¶íP2['F ]_tq«3p}L}RÄ[sç ݉#¼sáû–‰ïû¯ëÓðR1ñGm¸q¬›!⤉?r‹ç·ŒÐÇ»ý¿OMý/1_.$¿è1Ñ¢¶ÄçQ¼vsWQwâ}`ÖŠ¾jXð•Z׿˜~ÿé4_>öýåÊ:+ýÖÏ ýÚ œ¦ì?yÏÛâø  ú½õú¸õ~•ŸÒˆt‡.î¦Ï«1à‡FëÄUØ©aÀ£Y»‚¢ó”9ëg¨§…ÿ‹k˜7Tä§Ö6WqŠÍãõ¹ ÷èwr?߸Ý'ÙÖõuñµ]Ò‰ÇþJóäî%úºñuˆ|âÊhܸÉpÓ9YÑ=Â÷9þäüz‰þ?öñV?#Ö©mãÄz»QÕ¯D¾i¿"^,pä㽓]4ãq-}íт➺œ(ñ¸N~ðG꘾¾ƒ<¦S`àùM¦~©ÅÄs;«µšO+ˆÆi Øo¾’þ$*9ò™7<­O?*ÏëýÂâ³¢uº'Wýü’'ʤ"fÇÓK!úc`ÛŠxý9r´þqÃ"âÚgÛyÜÑEéŒSÕR§™;F &Ýóàm7-:éÊóÏÐ} :WÚ:§šÙúÀ÷ëÎt wÿẊYÜü©~¾Î¯©Á¿cõcSÿ=W Þ1èõ6ôÃ8”°ÿîÛÑë]Ú†zŽ:<¡õ8ÅéÔä_˜tWsåSYÇyè#á–œëùpÕõ°ñ7d} sžqH¥túmâÊWEž¤á[¬ÕãÁ›Xð®—`'>nÓ7ÝæÒÇ2èl£UÙèÛáìÛS¹Ü|qÑØ5OÕqÔOÁôAbfu44pŒ/¤PL¦¤†ÎéÔmQSü°Ó’xjÔ‡ýÔ<]p˜ê3Ô§cç(ãñü°¯…øŸ¢dým†7êuå ¢ßc×~ó&žŸ)ß·^çê»ö/ ·7à'y¾_{8Ü)ƬôÊ? _|oî;|¿ÓüiÓ±²§Ã_°ü„¯N–·¸ß<¦ç4ï·çó·ñâ:\,p_Èê¹_:Λû,º>T—ÂÆÞ¢¾ÜþsV¯n,_V†>ÝE½ÖÀŸµê£žç§³˜-CéÇn¸ƒu‰ù§«¯ÔµŸ”«¡%ϵ ƒÓ:ì%Ü×шGæ—­û¥õ`£ŽQkÃüz(Þ$fž©Œ/y8-ºO‰©.ƒb=Oý-ýë.QëÝ>ZÎlãñ=Ó{çó¾Ôõ3Ž[lÐ}£ð?kðMéý]z^VÖQT'ý°ý_ö¿NqžŒçßßöpô|^»|öAÏøhþ”Tò&|Ë ‡öìžO¬%¾7ÕIÂ|´ÄÿLeû½2+ú“R88êW§KË$¿6×ÇMj¶þ¦6žx\Ã9'R}ÐêÉ­Òå'  áPO¸]‡à+¦+5áN=Ï;eü°o~†ó6] s¢y“q UÙ|WEý^úq&Ý?®¥Gó)ú©ùSÿ¦´Œ÷!rÅŸ;<üfƸäOc®ÞOË–™ú”™úžÒ©ÏÆÅï¸ZŸz‚6C5‹~<Å™®8NR_'҇źÆYYwœû´§úœ<Ÿ<ÏVŠ~NPü‚N›Þ¯`_nñì®zmÒÐq|4/¿Ðo0Õ¯“öQ—ñQÆçL—Èv}yO¼'74räÏ~DõÆZÉøáx†¾¬¨ÂêнüüR´k/êGYßèj†zݘN·8Ö±?ä zÏé9A•dë–­ïL¸Ýp½¾jð†út¶ ‹¯ÕŸÇy«³º^H¿)ìóU›Õÿ¿pÔu@|Š.ä/ÅѺªaŸ‹ž> ã­›( <¥'Ÿ@êÐH¿ÔµŽÌû=›ò­iŠÕ>!¨™oŤwê|^•âáîÑÒo>ްü'éêŸúéä[ó¾~•ë<®æO› (/Ú.¥þ.‰¾~Áëôž&˯ñõ@®oáÿ–:6Æuš_që?Ôq÷²ûÝNß×N¾hß>^_€ÎÑþŽq¿bÆo­á;‚j¡.lK.ðšA~óZ‹xëšèóµ6¿ üºÂ^ÚÛ xÜÀûaï¹é½çºbã°¼ÚPžÓ•'¾ß³Hß'ôxÉ4Ÿ´‰‰ï9jñ©ÏZ¸á~ƒw²ÛÇ!Ûæëï#ÏñºäWVÞͤ‹³™ÎG³dõIô}JÌÕxBïÚú?Ç>]õô=žû”n„k_´àÃE§¬_m«cbÜaµ^_µlëÀÈ7ô+¢|1j¤¬óÌô"¹®}\ Ï· ùÇ ‹V ߟïºãLƒŸRŸðõy„4áFŽô4ÈÏ@'±nb Õë_<¦„ oŸqþM¨Ïøph—Ю•]ÒÌã¦ÃÛq½~ûQ}•„_Wï³òÕzwÌùÊÄ/sVa*z,&í˦ÿ¨­n(qsÆï«¹åÓåqPÏÀÓwäÑK¿ [ïʉ~º”EZ&uý·'‘«ÎŒ4T×oÏëžh“Ì×Ë•aã4M¶^¤wÈ| Ç-˜ •,u¿,몢%ÃMòÃ×bpM_кã©ß‘- þD¸¯I—yÆïò¸hs½³ôóö%ÃQÉ:ÿœëûaD:úî&ä×#¯#ÚðÐÕs‹?Ήõ‘õÙB?‹nÎnù©´ ½HÏ´†~} ûŠ¥{yž9üÜз%Û†"ÁËu« yJiñÝiéô%‰kÜ_Æ`ý|Æ_C…ž_×] I¯åM·x •OÑÒ·*­>@ÖóSYÕx?zýÄ̇Õ÷ºoŸè¼9­Sé1gÂ|ŽÌ/gàíšQ½¥Ë+ÐA¡z}‚ÃüBKâÍS~‚û¨dÑ•7ÔéÒ2t¦üÉ{T·C¼:Q\ã×Ý×P37øèàò+÷Zü V¯DCýûMæWòü0†±ÿÏŸ¬Ï;Qþ؆Ê8ÞÎ_øù¥3 öûØò7¿þbíÄsˆ>YÒ_¢:ä'Ïc†—㬻RÉoñ>¨hÿ’öú`‰h8‹Ö–ubX´îÆN‹|n±±DüÏpĺÀû§ðz8ÖéÏ?ã8pÔÑ3äSÛ[úìdœÇÙßÏñ²pÛýpt{YÜÖ#»yOWÝû¸&qi‹)¤ã3ã€X_†‹oG¸ª‰E㥘.6Î>Ë)_†n,þ8k¡>Ÿ?è9·ßÓ—ü‚f·S'qÚ¹éèMÕõË£ðç7Ûf›¿¼Ç»ànñ\µ5à#.¾[å­,]á¦Ëq‚ቇŒfÑ~fï~­ëÁg?ðxöÛ'›PÙ ßú¯”޳4Œ™-â}„{µø1QO̳ßìøZ4E½N˜¸6ÎiÁß¼ü*L5àVÎ{%V+¯zXž—G*që¸òA½Ÿø‹ÒóE:°X&òj˜»§.ýV¦—íWêuÀìO¼æ+ܼ^¼„ŸÍà^ÿqþ£ªˆ|ÑÙoG×Ó üꢸáíèzÏ]¢o)æÿZÍãM0äû®K¼‡¼zÆöÅ1q£Mqøž~O8þšï«z‚ÜægÌûnªùz8>IhªžŽÂíNŸ%t1 ¼ª´Læ{°ö=ŽooôþèÊx•µHwoŠ…ç×Â2¯ŒPëÇV^ºá:Ṳ́#ÎK,úÿ;—©õ¥‰úùȯìGþûÄ£õ\»0ýÌÃE½þº¿©zŽÄÓÇð1‚GÐŽt€ºåxŸËŒßMu ´¤uâÌ7Ôý¯ê-ê9KÇŠóu‘ß|ÛÄðùÒÇÕ¸®ù5Sÿªç¾nÑ{ÜTÍû’>(nmêõÞÉzÇA[ú™>_ž¥<™­?\ðÓ¿ªqªùo¬þRÔ¯iýF‘AG´:ÍGs†$â× áXH/žãÃí (ïÍêj¨Ïú}©ž¯Ìw£³çyµ¡:¾å¹Œk¶¼^xµâÅáãé·4Qçlþ£š‡.vÓy–þ_Æçœ¿}€¿ÈÒ¿¯S´_#ë¾áÿoZÖƒC†çzÉ…nx¶Å¿×¾ÿ2O…îLGéx:¼eôþ*®}#ºþ±¸¡˜×1>Õ1‹ë‘çÈšnÅ·>9¥ñ@VaVö†ü²éÿ™k³­cöÛ’Ö³+¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*ÌÍÐÙ‡l3®7ÇùRÞãýpÜ Tçà/)áUXôïHŸ•âõõÀŽU=ÉŽj_ZlzBÅ¿`<ø§ç4?ùûwô4-º$á8ë7:oðñˆ_‰ù‡…NöAâÔÉ-O¶¼˜äOI>q;EŽÃõw3ô“ó üÝ 7ºõím'ôïÖ_7øG:ú»xèô“&uÒ÷9™w¿ªC”ô€¶ó-Ž`íïs˜ŸÐ¿ºxÏ©ò³ƒk4ñGÂï×MüЃ]âšž}Nšêy&­p¿æÄ{éÚ×7BûžcÒy/-º×&?DæPù‡gxêiI=¤ç¨Ó1víÓqeñœµsÓ5À êsÊâTŠw?±¡–úKò«¯÷ëßöE½àBƧuº¦[Üžq~­HG “AwuÅMí÷ªù&Ãói÷‹øoí­"t–¾Ïœ­ê«4%ÝÔ‹_S×…y§ ?µq<>× Ã] UþºÅ?kXBºjçŸÍï§çMIßÖ‘Ÿ.·CZÆ0ýˆÞBZê“Ç9l‰Ošâë«Vˆû2åe}ÿez.]uôQúwô¦÷ÏXÇõ²º^ÒÓIÿCYÞ@êù^r¯ú\.¡÷¦^YÆ;è•,…ÿxɯS]ŸœO:$Xõ¢^ÿ›õÏÅòûÕ÷‹úŒ`Ë`ñ>ï»]ï_ÏA¼MêËOY÷ô‰†s•zÚ-ÕRÉÏ`ÕA½.î-ÍÔy£¡Z?AñŒXþ[Æq.ªêÖ§ôKæßnûĭŊÓmýHLúý˜x_™ô?3ºêçég†úbmüôµÐ%Úsí«aÓa·{—òdó/Uýš’ÍÑuí<·¼úÆëŸ$õçPÌt*¿bïËö¹ªgè~?§q:úЖ¾v˜tL­Su/:ÖnúS6=ÀÝsÅzyýü=Q7¢Pýý2®àÛ¿-ßú2hšÝ¾®¨ÍÖÉÆ¾¤uY`éZ}¿Ñ7èãêm“³ÚÄfÁAòwW}¬öI9^AºÆóC½Sò®vžÂÂWsÚ·-x•ꇵôߣé—JyŸŸýý©Tæ¡ÒªxŸ¶1õ‹ûêuK3¶ð¹¨ŽY’hþ@ÒÑ~©|é?™ô幡 fÿãu3“å6>žŽØÜ’ï)hÃüûß fè7E>iš¨S¿gøˆŽ”o*ô«¡Žßz„ÎËýté›PÞ¼¤Fä¼€N†þ»½ÄßPÏ8ß JÏìuÿ}†~E¿ôë† ëó2/³äªî²%ß‘q>üên˜õÿ*ñü<´gúïêëµ××ÐÜÐðD¼ºvß‘Õu˪:úëÿCïžáÙjœ¾o‹÷ù±>E¯©þyK¿¼:®ùªÿœÇòÙk)ŸÖ‰Õ§nŽîwSÙÐøUK¿¸7hÿ+ÏJE×mX=ï)/z¾>ׂ?[æ÷z¹­³—W3á$+¬Â*¬Â*ìßÛ‚ÙíG_aVaåÏÐ*·uì †6jÞÌÖgþRÅC7ÍN¿ÛyJ þš¾!Áa}¾»›eµnRCmqx µýò[§º¡ÈÀk0ôA’u€¸Ç“}K%À¸‰ÿ³ÓR¿¤~託VÞð©j¾(ø<¾/ð Q¹ï6‘§^¶¨kUÏ¡)¯èjŒÛÆ ÞˆÛNÎCÁów«Î ÁaÂ1gî×s]qß–ý8'ü$”lWóMo§»î¯™ð2Ï†Ž·©õDOÞšñxÔO˜÷ Eóxó²¼OÁª)åóל‰§àøG‰Óÿ7̨§_Ï\û§ÞÄ’ÇŒk˜ñ`ÚCjãU0ŒÞ«Þ~ùc‰k@–—n*Þßà õz#/a»7çð†^õ–pÿ…ÓbÝ7 NÕ/À™G¢ylƒ?ÏÐ'ó©/ýü¨}‰Ï¥þŸgS›ÿ·+™Ç}Î1}m¹ö÷QÓârÄÏ_Íÿ“ºáöÝÄ<Åu¢ë¢·.K·Oñ]ëµói°×€WzÖÍOý1ƒ?³õá"=>?®aÐ]Á…¢î„+¨qÔ?¹ñ—Ê<'~Ô ¡s¦Ô‡“x¬¨âyÛªߊ½Gíhž©çÉ¡À™ÚðLáyï'>ÚCÝûsuÅê šþ^ºqjÄÓבë§óqºèý|´`~-=ÁOÔí1h ¸_.ë¶äù‰>à ÚîS·ë–­~Ý\ï·<¬âãÏì¥u¸¤­xéãÉïáó’ÉpËVñ¾ÝzµZnäˆÛ™ÌêÓ}ôü‚ðû«Nèy–ÅѼ\L~™i>{ñ½äS.¸Y]O'+læ{šò2@!ùE‡˜¿´`e*¸D4~‚‰ÿ…ãc͸mþ¸eLaýSÔ{½_Ø!º/³qÜËÇ«ëÄ[WNŽ ÚR\?ˆü¥„“{W#Âz¾Eøý¨_EâªpI3ýçÕ üš+n }( ŸjãSªŸ½éyí}àó™É¯4™ŒëQº?V|üÜ/FSƒ®Ò†#êïmå|ÓO¸ñ7¦Ç H‡g×PD¼È”Ÿ±ÌÿRG ƒØç¤¯ƒ[Æ©ñ7ÿaÌE"?4òNóMpÄð9õ¯ó[ç‹<ÓÅÙáeÑzÆý6=)ø•âñ­P;.£ëócôýÄ¥™x Æã4"¼uU5nÂ2q½P:&'Ï7º¯cK§èøyÁïÝø8ï'ã=˜ò½ÖýÞK˜NKO³&ó/×oWÿ1ãxÚæŽVé¬ <¾Íø~ý5ðÅP×sÝë'†ú†3 ヮjO›×‘.~Hï~ÑV?4ž¯cü|èÈsÛz4žÎËß ~Ýöïúáç×¾.ðæoFŸ¯ô73öŸ¼LÍ ³8Þü_ɇœ¶aDG'\3Ç»ãÆÆÑ~ôÕ¯¤ò»°àw^ñ¦ëãLtæ?dèÖÔó¨uÞ¼Õ>— tó?ÐPÏŸ³ég™ô1±~»˜OjÄ[W‚c†óáù˜Íqp-C¼S$æ‰à5?~Š)Ok¨ÿ“2¦5Õ×ÿ§¾¯æÕ6«ñ6%[·Ÿž/0P™ø8sˆÊOè!c>npÈ‘üR:x<“n/®|+'xo™Ï>7àH˜n’äšÖƒp»>u¿1⥬âýqÛ,‘ï?+ZgÕpMï—Ôù⸌íŽéý9Ïsyøý‡Œ_ÒZ?_˜_Ò…x`_Û ê¾tñÔW«òpЂéètRñ®ùúpÿÎL/~õMz<ÊW¤bÈï‡Û±| ÚÄô»ß§®OÃTþK¨ÿ™ï¨Oß̢ÿö±TëWizŒOÄuÕÄ`Áוq–|OÔý†}?7<íMD¾äܾ~zw “îwÆvWÿHäCÖÌL¥î„ Ô8µ]vó}¦–•oÃ=…»u”>/ºý¨Þo+i#òóõ¨®Ãtœ“ê%¸šÍ—†ž?bÈ jÝŽðT¼ÎŽ"‹ÞXé]>§ÿ¯ýîî.pc–õƸe^¶¶þ|m¼~재çiÇÌ/Ø wÿQø]ÜxìR'7íó°÷ýtð™6Ä»ôñ×(·Áû§ >á+‹©ž0ü§‰pph½žbÖÖœàˆxÞ)8˜ŽN†+c^ˆ<ž ¿Ìõ þ¯[ðYvuŒ2Žçˆ“ʶa.é¥^ý„ú¾N»Ný¿á'ïøºŠÿ|à3á§Þ|Ž'Üñ„ð㽤â*S˜Ígªú,õÁ«¾ë÷­Ž#%®~ÌXá¯n¾EÔ÷X~4Å6‘úŠðÞ‹TÝ=”~&ö¿r‡¸g¨ó=6ÿXäå7ƒÛ~¤Ïú&˜ ëþ¨ê#ìüÏXúè¶×i?·oþ‡éúàÆ«×…é$-þJëó0ú7êud3SüxÇÒTt.2Χ¶Þ/ÀMÓEĤµøIµOGCO[tå¼Ï³¦¸nRoÝÔþä:Ðóºn©Ê[ < Óz:îÊtôò.٦ǹ³ü/š¸Õû0j€Š·X»0ú½&æ°eðÑ_ÕµÂ@ØN%–aKíg´K——Œ™}»V&ÿìij&ÝÂŒãïs¬»­™k½CÛxñZZþ°k=WŸé? ·è¯SÏ+ÔÛ.©®âR?¡÷ÚR×1Åñ1î´3õñ×¶*bükþKYçƒÏ(³ÿæ®Òë _r§êT'=Ãñª®2FíëÁ¢ÎN8atˆŽKÑÜ1ïvõýå‡â:©× s¯¸šÏsÔ÷ªN:ùÌÚíÿ±ç•bÎwÃõ<94¤uua´ŽÇÙÉ~ɘr—ð»'½­¯?’N;FøÕOÂý 80þ¼q|6¬Õ¯»‰?@úæÿ‡Ó¨ŸÙd1ObºX0ºSt=§ÃgTgz¿$8ÊûdÑù]­¯w†ã©ºÌx°DÅ[4ËŽo܇kDû…+[‹¼ñuP-·zߘßFà@öêý(ôÐϯ”±½¡¬÷yÍîë§“¹é3•÷Êê‘¶þÐÖñ›ëý¬?•>é|½N{]Ç}Cý_êçrì—ÎëÌÇÄ<1(¥õ`þ½Ö/“^1jåFo&ã¸#W¸Õµ×þ"ÖøIõÿMz5Ù2É/•þzÒñPÝ‚“e}J$>&cœj´~Öó£qÕŸÅóÝó m<†ÑWéñ­¢ãä´tˆ‚OD¾ÛÚ—eYwÕO¼t-隸ñ¬çᩇžÇ5KôuÛ ëH3âSÖÈN “ãé*cE«2™gl†ÁÌœ|ºþ"7ž†c}3nrÏ‘w‚ªäŸOlª÷g«8ò8n|ç,¡7ð1Å•E†¸?f_Yðÿ›𠤣„óê©ñxUÃö4£Ÿ¾/‰Í‚#ă“ý WÎÔ«®`yæ÷¯¹G­ê)ç%ëw• ¸ò£yZÃÕú\°ò u }Ô® œxk\w&cœN^鸉YñÏN5ÃŒÑ"Îü‰cÞ|Âz†¹Ñy‚ØçׯPGù€“ 8Ç4/`SÓ¬êÒÐ_Ò'ÀÍω÷æüÙjßûE¼„‡Fˆ÷|Õ‹bžyüÊ‘ ~½«ãmy Tñà¸û›¢ÎýÌš“Gƶ!b’ºa›ã?zÉI ¾»âGJÞæÑ™b»ÛÏæ-<òÎÜ“~ÙmOª8{Ãü~_ƒò—V~¶_ªçÿÐ3'g*Ì… t¡í'©uT\-ú†â®šâº=ýχNò³¤[ÒXäÉI?7Ü"ôX¨;Vü@ÄCWÛÝ;^gíOŽ—â8”þNçbâ¡^/nnÙ%®ÿåÿãm8S­—?±[|ÿGÄ}Ÿ9OäÅê.Ž÷ˆÿÜsR g œ2¾VCüž;ö‰óyj‡¸͉}g¡øþöŽ"ÿÓM噯þø:ýýÃ’Ún}ˆZDÇ­XÔZÜ¿îì¹|b±ø½7=+æõM¤Ãóìýù'ÏëÖ©¢Ntï!‡¿úK•g<õ#ñœÊ¿O>'~÷Î&j>iCkq=׿ûÞÊb»u Åño¡þÐO,,Þ¿íjþéÉãâ|œ£âcvˆÆ/Øõ¶Š'¸¶¹xž‚WøÆ§úë Š[6ëý¹p;Cœdª/aË]êùìê¡^ÇƉ뵲¿xþ1ÞaýÜôcà¼i¡aA5•L]?ù³¥ãrµ!RˆÞïÊnùç¾UEªÞ †“ßxãk¶]³bÁqù; 6öýh¦¥ï$¾sƒŠº¬®˜o¯þ0+<ì%擨õ…Anù¬Œ®CY÷¿øBqý6Õó¼›d§_ð ƒß²Á ¢êªcå}^x^üZ.è£è¼jGßO,xÅ+b«ó¡vnûÒÿdz¥1óK¡^Õ´WÕupY=á眧ף ·»c¡¨÷6äÅÛORöMÚü¹W—¼KC¾î¾&z~Çêc©æ31€æÕF¬~eâ9_ç¨:)ïŽ_üÎõ·ªóùÄ'Åq[0 Z°Qɧк‡Q T?§€ü„ß÷¥}¼|A8^¿{µu+àxNqÒܼÁÂ躚44¥õûÁ7_(K½_ ŽªyV´2àXÏ!Ü(ák°øé·vާ ±è'~õMæ·«^¶}pý6ýû|ÈðÞ>ÐSŸNþOÓtêœÙ6/_ïs2n—}Åmã  Õ,:áöËÿ(Ö‘{E|YIúnëe°Ïq»=t¼+¾-æÙùsE¼VÚOÄ‹4‘óó–yfÛøÆß7z¾ŸV=/s~¬ž×õ`ú°ñp˜¾&q76=\Ù*ÏP3^½õó…3ÔëêñRWEë(n)âú¹w«ñl õ{gõVÜtŸr=8~C)ÏÖ[ŸÇ ·£õœ÷QE®ç¹£L×׸Æõf¥aª›Ž_RÃYѺèÒLzR8ƒæõÇÄ”Ž%zÞq¸ý¤‹õýiÙ¼…nÑqÄ{…}É/z[ä[&TÌ[dœÏÄo‰ù¶%ù;ãH'B¾}©ïÆmõç}T}.Ã:Y-·ùͲ۟ óz‹xâ0å]w]­á¨óê|ü&b^øøŒï[Ä‹ßÑ8zÚî"/ÒYÕŸˆ[‡w>¯­ª^.Ruàƒh>["ô‡}žÎfR'¤Nœ¾Šñnï·ñ÷\v«^ÇÞO0áHÂñõT2tXnݣĵÆüìäh¾9&Eë‘àl‘¸A>ÑÉùæK¶ît5\‡Ï£ñ羆º”ÇIˆk’fÊOawÍè¼.á¤^¾õ8l~ôz‡ûísËÏp½ ›n³ÍpZqŸYþ §‹~$Xý‚S<&u°ùÛnøÛú‰y!âôþ´ŽÜò¸ÈUfùŽÓ_Wõ¹©¿{¶û=£±Êë‘u1ÓöÏœPïWðCÇûL¸ôï·ÄuÚxµÆñ8þÍ„Ë-Òî««îGõp¬¹/U½ ®ÃòA÷¤uÏó1ðƒÊ«¡²§îX}"t`ü÷¾/ÆÃq~9[2¶'¬`¿A—±[·*1^Ó®sÝxƒÃôùMãö5£×Al{GÍ£wÖ¿Ïò}ÃâhÜ0Ï“Äå¸Ö3Žß=Þ~q ›îëEõìèb„z©5I÷`?á .i®>O7ÏëT÷d:Œ˜s‡'vÛ/„¿»ù5•|LäMLº/sº>¾–<¹”ÿ=ƒp}v¨ïÅ-Åý)‘Æû)†Ÿ7·èQM;k³¸¾;Æ4¬¹ QÞ:Œ“Æ_ëGÏ{[Å5¦ø}ÉšTã=äQÿ-Çú!º÷RëMòü?ÁuyÑàgN:R·"ñ﨟ºBð«Üä÷Q‡ñtYQö“ÊØ¯–ŸÉT§5nßWåÿaäžxº4 õ|êw‘”Gkª»z3ŸbÓûAsÂm.øžŸ¿1âKuýê÷;1;ºï$®ý£Ègíó{åûò‡ðuEïÜüS¢ž_aVaVaVaVaVÍÆgAcﯫªÏûˆ¾:è+ôå1üs=_àÖÏE|çF5ï½U­³à Ò×Ýr£È¬yI¯hè'€&”mEõíõWª|R ‰Ì§JÞ¨éûpœ5ÜúpðØòâò‡×ü2+ý4¹Ž:Z{îÏê×!>hé{ú< ×I²èV¢=ᆠüêGëõc’ª—ê)°ºš+>8há=9HÔŸêgG·ßüò%%¿,ós–¾o²4ÿÜÔÇã>È©ŽYÚ¼S¾úÉþƒòÿ¸z¢‰Ï£i:ý-Јê¯ù ÷4­‹x?¯WñÔ¦<\\“¼4ÉC”8<ÞiùpíüÏù¸¨Äë¸øúÑóM­OÕYŒñÃÏûDçU³eÑ̯щðN_QÝ ž§®ò€h½Ni¶>¦Æý2ôíY¿òª¹Ñ—ŒkhFº5ýps¸ÃÓ,zÚ‰tX½>RŸ$Ü®£ÞÓæ.úó"œ>?Fp$º'u¡‚wØ|ÊðF¡îËGìsÎþ¾?~ßKö+x\L#ÜþÇl÷̧Å<Ö”ð!­UK£÷_LþÑâê¿é^¸FÔuë„yó³ºnc»è›ë‹Û–}<ã®(Ö¯?Kö >Õ¢ên:ûÛ+Ç‘}tmïm¸5ÂÏNcóï¼gÀý£‡Ê» ׫ö÷‹x¯¹e~ù›'hÐ;Ë–aµpplõ÷Œýnù½xoÇÒ{^Àpä3­CÙB}Ÿ9~Þf6m 'Îp¡®ü¤iÑ÷¡y2|9×ÇPñð•šW+ðÔE/Ö¯ç(PçW®w’±}×#Òxü½•ýE&¨úg¸Œéëͺm„±ÔÇa¦Š/ÊàÝTaçÝ‘}ŸeýêWÿ&áŸõÄñ€Hý»Œqï'\Ó½¿DÆÆó%~ G®Dþ@[ƒŽ}ïª?›±ÿÀq §mø=%B×ɤ3/ ôy…lYØO<Çý-çS5¼:ˆ¼FlÏóöý®/ôñÆ¢‹‰‡fÀÙ“¾™é¹ >´ä‹ûÜ­[Ù'š·™-“~¶ëö8³£Sü€[£óÞÁÑÜêc••…¼Êú†zÌ Ñ7AâmQzw¢y ì¹s¢à‡¯9ìä—˜øëç»öªxýߺ¸åé\-ìÃ5GÏ ·£:&}(üÿ³ÅýÞ"ý±þñp³X2RäJV¨øbÇ<£<¾ïqÓ6ô™á†ãìoÀ•}Ôº_ž¡~Z•â³iäGnî÷_ßQåiÍX•N‰R±0›òwÙ2|»Îà8ó"Ö#úû-ëô~ØÛj=žyÆÃéðû9nÛy?GÞty·àˆ!ž!¾+úˆ8CUÿã 0ê7‘ó”¬[¥ÿ ÊÆpú.‘7ô±î?÷ §¸IÆòÎK¶î_ò¶W=^öIrÝÞ8Îô3ýŽ[úDVâ “^««a‚ÞÿDÒq¶á&>ês/õÝ]·Géÿ¨ÿŸ.êRÁñd*ýî„} 1k†ˆã¥¿?ô=7ü›AwÎxœš,7šò25 8¦?Së’Méïµ;Üt3™.†ÖÙ‡˜Ø*–?ŠÕj¾LêX÷;³S*ë•õ85)¿òOG^Y_„+{¥Ó×ý+7ˆ‹÷‡êWX öËFÃtpI(yNø‰W OTÄÎÖ¢ž}£ÊkÅúÅѸÃÍ+Ž‹Êê}³ÕmqÅý{UÇñ¹lËê–úª«ßcxŸ6 Bñ ÚéóÚX8V<Rß¼Í[üúìÕÿÎ \‰cR/8W†eêu›L8¢†*ž{ÙÂéà™wÜ]*âRÏ8½£õòL&uð­ãôpæÝÚ÷½Ôº¤¯¿i<[ Å:Ïxéh熓ÂÊ«ŽáÚ³ÕûuV4ÿÕ¢ŸO¬~PäQ>wÌ‹ýE½îRo4üÿw¼1ÓëÃæèx9ã<»‰ú5ïŸí¼ÿu÷•iü™Ï¸õYÈð1[ ·þ\L=¨‰ƒµu>^O5™­Žë|µÜæÞ×?º\ômº}“º~ß98:ßbÁ `be7Șy.´3è[æ1=BÏ>¿6ž„q?GþJ¸½#®+c?ªO£‰Ûz‡>ÉæW\°Óí¼ÒÊ—J=²:Žý JÆÇÒ¹ÁÜA‰üzÌd|ž[Š£ó4kþKÔíÇÕ£~Gy¢.V,ðëèA¸-Ǹ Õ·`Y§±ý91?‘î3¶nˆîTÙ‚/»À°þ¼Ï®ôë.&!}«¯[Ý.c¿wúáX}î†Èë6’ágŠÙº-óM xßêÑó FäFwË׸(Çs]y¬yi4J†w@Câ’'6lÒû¡„+Å”KDRdЕYWÅÍû•þ¸ Øï=}_p†Š²×õyIm¼žã´ô½Ò6ìšè†˜ÛOÄGõ˜ßÚŽpó ó.¬{®V¾=Vs<ÿöÉô=‘†1SÓÉ¿™-ìÓŒâý¦„;N=Xö“1¾s–ûaâ7Å|Q?zECÞr‡l}²Ãí q<Ï“$5Éc dz7Õõ×û|Hß½‰g¸ßàǦSÏ ¾dÏ×fÑ(ÕdýÙÀ›_6Ä-~ù’]_<ïU/âë'ú{Ö_[&ôï»zâ“©Î"ã?´sÃíùâìâ6Þ©Ö&ûõ£Ê–¡­Áï[ÙQÍwJþí[ì¹j¯^g\‘§ÖíYÝÀÔ—ÝdFÞÏ–‰â$©KiúI´›#îšéãüšç7úµžô†Äu[t¾½WCòŧ?Õ ÿ»è¤gŒkxºv–篙c}á?®Róû_¯Wý¤±öG"¹èVÇŸ¡âÌxŠpÿa~yylí æÝß³8ó‚?“n»ãïØtžÏìÍÎùÏf©ÿ åñPò3¯çLæÛ}y"òÁ¤oeð‚Ñþ¸Iÿ=ãxk ~,æëñÏéÇ“ø¶óÿKŸ]ýš¨Ótµ’VþÊo±õ íº-qÓèõsZGyÎU?<®a¹ÁïÜV+ψɂ—;êª}/„}ż”Çâ³î%Z¿Õf²¿žóöÌ_AgªË“G¿'ÁaÂ×R×It&¿j’ø<ÍòЛ:èý˜~L§k¿þ¹Åú¡âú]p³Š[Yì¶®ǘ^<ë3a2\PMŸw«“Rÿɘýó\ ·ÕUuMóÌê©òfPÖݯŸ¯Ö}äû,Qq˜ Ýøtk™_¹Žb}Ëö¤_€&Ñï Ï·ϯ´©Þ/I)ÿïj, ¼åöœÏýœá}vŠxi⇱þêX úûâœB7¼ù™&=&x¯¼Ýºq~úL½üú¬8Ûñ†H?ÇÔgs—iÍ×Ðü¿I—ÀOo[ØwÛ¢Ûpª.œ&Þ‹Vêç\O•üâ"?#-CÎ þ”#ÿÓôyŒWõ½Ð¾4µs>9^MKrÁJ7?;ß2NUæ·Ìþ(ž^êîeó> cô’…j¾à—Lï‘~J:875ü[J8þp¼„}zQ-Þþ˜¼I¿îÍÚ+þÞˆó³Õ‡n\ ¿ž1΢Õ7àsÑ%·8+cŸûEÓõyÊ…&ãU¶ò‹Ÿy}íÿ ýâ ë#âàYBM õÆe=D]þÒ_«ù¯)¤7÷¸øÞ×_j¬§‚ƒª†é*> g À׃Cg¦z†%¿zMûXü Þ÷[î‹ÖýšŸ¯ïzòÆÛF«qóÝË…ÿûÐÏ8y½çtqÎÎâ¾o£úÅ·_<é bVo7ܹ¥dÆy5Žg‡’ùsÆóYþ¥>/ÕA?_d!üÎÒã@¾4𠆉ˆ†T¿£<†oŸl›¡J<¿Áµî|nÉ÷v¢< ñì0O4ÁÅâ=¦ùXö´ñžƒ}´ý¬WM¸Öà+†—jD¸kÆ»ÎØnéž?X]w&©yC›þ$Š©Žcˆ{‚c,nZÔ\w1àÅÂýªGÏgÁÛny[,¼Nÿ|s‰I·»‘ÞoË–Ngð½¯êkÞø5yäGô¡y¾[ÖÕƒÏÈߨfñ›æ|âæ;æŸ0æz©…Á?oCë¼…÷‡V¤§•GgŠÂ3:«õÖàcCÀËüY²V%ßÓ3â‘ñ.ªæažÿ0àdx¾Åx<6Ký„Œñx< –Ç+¦¼ƒ×ò`1<¾#Ï3<ŽìÏÔÓðÜ× ï‰_ìeþó»3ê¹”4âeˆÿÌûûÇØóÝZ\Ÿà¸~¾ÄÖq~,O~?Vôµ‘óEØß¡#å=(ï ç9¬}\¼—ýÜðnhMû[âAÙW½õyÒ¸†óüt•Âý±ù`u5ÏÕå}}¦Ÿš÷DCšÇ H/ÄP/Fÿšn׳ÿsâoLÊà Š'Šï ÅBG Ûþª¾ïÃÂy½A¥J~Ýãé’åÊ0àJñœ}ià{t-›Rq»naˆéL` Å1ûÏo“ààên~ýµ_æ´— •±#ŽÔù¸†¾c&½4Mö¾ºê:‡Ç;÷#uÞdugßþ‚Æã,-òÛ¾ÅG®8‡KÞ¸‚ɤ³wñwüpcTׯˆµ~úŽ,>D}¯ucùQÊoûê¶»®½Mƒ‹ ù¬ñü³Ÿ:o ð›Yßjã~ëÕþ\¸àµx¸¯©¢y!èeØŸpŽ<ÏiâÁçÊpÑXáÏT¡xú ­¤'ÿÏØ¯HèÅ`Ãl}=õ—z¿3öyöÜ›Õëd;ß §™s"ÇC¾Aß`í»â9*6äßoºGÄÝ<¿J~ò ñb'7¼¦þ]­t¨.Öå˜x+9ocÁj¯uí(_Ú‚ò7kžu#®±±µz¾Lï0<꓃)ôž^ØAø·}.ü—÷ ë¡e}6ÝǸ†™[³R·F~týĤŽÞ¿fâ‘9æÍvv×?—ÍžÃѲoÉ—úøu¿[Iê8¯Zny‰ÜLùP“ኟF×öEëwùÆ)Ùæ›—µeô¯¾z¶ž?ÑÜ0ï ~B¿èã Fnâf,<Óm½èCyuòxŸ%´auåº~ÏAØß½-­oUþuœ¸nxðe£k†â—rÂß1éys:é 4!<…-/vÁµÂ:W䓯›.îÿqq½Óί†ÇÍçÃÙ‹Õ|B#ý|Œ¥[ÅѶëâÈ ãz¼ õ_ >LÄýàhvû}¢ÏlQžs¥ßP/Ì ­¯yÝÐI­§Éy׆Ÿ ·—¸bU‡ €hÔeõÈb‘ÿBU^ÿ$ýæ÷s=n_Ý æýzVûéÄo©úS\ÇsÍd‘‡QC¼ÇÅñpšŸ%ï[‡QïÇÓØ)ºoAcÂO×ó«¢Y:øOtuQ䳺};ÖGèšÿ¸póEb^5àBÂí sç£ûàx|Ä;çb×j½_´ö‘çÚr‘š/oEx’ÔqºÎPóW¶8­ »×\*žÿeûÕ<£¥®âUAü. —ü­?JAJz7žóL¸ßOüŽoÊgËBþÄd{Àöiñòƒ-Üð‘÷‚Óçªø¯cF4ßTöÅœ?©º~ü‰´„øGïEÇw¸³½úÿª?êý­IíÕ¼ý ¡W„–ÙÑCÅ¡âÐÖ[à!ºR_‡¦”ÏX{šê/v¦û[ Ž'uæ°”ñ¶/þÂ% ¿eÅ2eþÁm¥ªÙ†K‰z±Ÿ¾úumÄß®œM[†c§lõœÑ5z~|NçñòÝò’ç:n8~;öÿ•ßÐÏçK_ó~§xÏ-Ëú4ùЬæ$—¬ùÜ„ºC‰ÏGê-–Ññ›ÿ¸>jÆö…}a%üÖûÅû½òSu^–ñÀ½Þ§Ô±G7Â9Ⱦ?kñÞ´îbËÔºú'Ñõ %]ƒ©ó^Ýòÿ‚å;Ö¾ï|õëÓ•ç:Í‹¨œnþ UÒ]Ÿ1{·Š®cÐ}šp·š×xy† >ï5×åKí|7+ž ÷7èb„ßÏ­ì7/­Üã†÷øWµþQú€È.Y¤Í_óyÃ×$Áº]=·û$qZÎúÚ—7ëÔÝâŽÂÿÈ€+ë§âþMý ¤^køÿ ý­À@†è?;':®XOäL<ëZøÚ#nøòžz?Ýù×.Öc´`|Šǵ~äcK3?ÃJnñ*j{ÆG¦coÙäǃ¯ ¼èUÑ~vZý”­ú!Œ¿ƒñŽú€×~,òÕÇ¿þ^ª|&_3­Û¦þw6ÃÒñü«/X^mù%"ß·Ò-åx¶à¨%´íg©äÐÿ›NyWý™lºW<Ô·è 9æ±ÐØàçô²Ü—Å—Ðûk¾zKiúfwݰáѹ¡’_œèë—G º(í'jáéÈ~d®Çó5tróÿ1jL:ú‰¤«Šª,_׌øjÇ,yàA‚§Æë¤Ø8>Yþy,ñ={ÄÓAQ¼¼°Ì'¢dt¬ü[ÆyÔgúh1y`Æñ©¿™k_0ïñ×/ÖwG<¨ ?ßGïOÅÕeIËâöY ÷DñùüÓví3¾núkáö+÷èØGõYÞµ—_^=.…Ñy\›ß·êò_›îqö¨)âþ~™®NExœ¢Rýç­ w3à!5¸µ¶þ|óY~ó=V_óãXóÔ‰5éÁ`ùÂDy_´3ÄÑóâé~…û71ès73ä÷Ž$óKÃñI/Wо˜&}ÎoA# ^~ÜJíºŽÙG+õ*3¾¿²£>ÍŽ‡³ £y(ýÆëóŽìwØðW¾†ê~~VŠúsðiL|¸£n|å×WÈP”ñ‹iÛï}¯ôŠgP/þAcuãzúÞã ›šŠ_à—Ø,äûxiÈgù® ¾g­›^`\C‡txÎÇk•ìx¼ßŽuûŸ§Ãw2üTÁ¡StÝÑy\î_Ý0X䓹.Õ»0ý?T\ܧ„ƒ´ô×v>zO°fa,ü¾¶DàBŸ¸VÄ¥‹š©ßlªŸ×$Ï`†[ÜbÃç}nSÎ8èÒÿVñžíY}mŒª£ˆ»F‹ëÐT]ùúŠ©WEÆÙá~²Òw«¼+Gý°lºEçÃíª’Îе¥Ã/$Ü`ðOƺbg:ñ;ñ1P)¦~ çÕ¿˧yÅÁ1Ò)=7¡»b~*~i8^uæ÷5öÄ+7sÔÕ™ŸÀÁõ ¾uõyzLê'âèå Ôl>]¼×]Ô¼f.Ð×¹¶ÔŒ®‡ÌyA?ŽÔx“š |Y]Cܲ~Ÿ«ñ> ÜPL¼Í«~!¶ÿ”Ń„ÿiÏ œ~ýxñ³¯aqK=ž~´ª—„éð.“Ö›| ÍtŠ;Lº²Öñ¯î/ÏQ;]ý±pÜ)ÝôïÇ£ÍÛ®Ït¤õ¥8:oÔ‚ÑyzÞÇ›ì÷ø8﯉âbî—uÈWNóíØ¢¸‡Ê‰™êp6“xÌlœ“rœyë½âXÙŸK/Ñã ‹Ôø[Rq„£ýAl­Îß´aêÜè>:ƒH'~Qý÷í£ó$ç¼³/ckÂ׿á–_ãz8‹ôîé â$éW­þ‰¨Ÿó?Â?è«ÏO…ãLùÜÿ•Z7[{‚pÏLßb¿_þÀÆwŒk˜×>Òä}ŒÂýfYpžXZ:œ2obÝÎñxÒO±ÅO¡®óŠÏÅßK„^K°ÅßT§áxû`/½Ï›îHkÃá„Ûu&}1ÊËþ$ÎÇév›Þ/îàÖG—]­âði1õ?ð5L>¤ê’tPŸCœFõíG¿Wýä}1Ïé½Âl½®Žì£ÆõR0â{ ¿Úfy›÷-y¿5C³‚ïF3 ž¨€=ßžº ¶>Þ\OSöMÉgþr?±Ž7j¸ú>_Ú]¼·ãHÿâŠ[£ñi‹æŸœd`S(\o /í:_¯ð˜¤ûŒ¹¿UuÉ ~]ðóÿè9KŠsv5Œ~Y½¿Ä»IŠçJ|^ô<à„!OßÂo]ÃE"!dâ…¥m¡nï¢_ëyX…½›ÓÅï–~’íx²¯iÆç] ý¹~«Ÿë6Øô:¥þ‚õ¼jEçULxN”ÎVýä<–OÚ¨ê>`¾x‘Љô9P=Žñ|CÝŒ’¶"OÔ„pø5 <½ /WóUÒ}ù›ô_‹¿¤ëóõ|[L¹.žß]Û¢ƒ‘¿îj¡Õ-Ù8¸à)ýõŸÝüº3Ý5KØÄÇ[ñ#5>¹v¬ð‡J?ÕçO/Ñësat=Õ¯šü)éQVÕ¯o&ÊÄöê¼oȃJãz€\ÕX?ímàÝN4|N:r2¿ÇëhIïóök¢ù6Sïù’Z¤S²l«ŠgxÅpke1Oäg'ïˆqßJ¤?ÀëÔß=’*? ‰U‡—ýñdŸKãvíD¼c¿„Ûå3ÿÊ™jýiÈ8áO¥Ä?’ì7ø'‡)ïIúkœoŠÞ¤S4LÔé°6&>{ ËûŸ)ü8t¦zÇ5kÄ:¶cb*ùW\ò€wkûx¸•N{£ó`k¦«z)å)ÐJŸG1é znÖÏòb!¢s{·<ÓÍ”ýâøv¨gÁ}ÆÌ;†ãÏj­ÏFõ¯ñ/GÎÓ6|sRãý.ƒ– ¯Œä]Ï@5·<æN×ã+›ÄÄážÿ¨˜çZ:ê°ÔŽw_‚w=×óæìþH<ÇæFÉðN9òM§ŽÓæiÂ~í·ëç§þLwü9VëcÀ=Ï[§Ö)¦ÞÇô¥¾£õÿ‚¯(_Ù–þ^Ò-Þ„i~Gåm-ý>“šäEaÌ”Tü9#/þ"1¯ÚðióQÊÊ0±E¢¾¾fÊÃeý¸Ÿ`Ógb½Hy¿Ë.Uý² H/æâ›îøÓR?ï u|´¡u¹Ṗ!^©õ¹Øü+Wz+éŽß'ü´ž„Ϲþf·¬î¢Ž_LùŠõ?Ç!}aþ;1XèG£Ûkz¼;ñc0ḗ‹•Šu©€ÞÃuޏµ57ëù¬Ô:a¨ËÚõ! \s8ß7§üÏ-Ÿëù ë®8¦ ÍÕüÒM¿…Óˆ·¶¹êçïü¾ˆË¯ý§¸_7>¥Æ)7?"î×E“½ê‹&½;“ñ|!¶6ŽîƒZÒKŸ÷2õc«¡úk‹T½Ï±¯¤¢#$yÖí¨Ï—¬O›ü= WuyP\*þ²÷ǰYRü˜IïAÆÃÃH<ÞÂù=Ý|¤#v,Ý~­áøÎÐã)ÖwòãÅS/œeÀÍ0ݵùõ!Éw¬ïæQÞêEo~è§©â¡Pœþšì‡iÒoæ¿0Oü]þ;QWèã7Oñu=ØKãN \ý¹†ý¨Z΀A§*<Ïɳô}Lú£×<)üŠš4ï¿kÑÿÙÑ+§ýsLfêÓÇyÒß;ê…Û3¼ÆSÜSËmT&\lj„:ÉÝïOg¦8°«ï¡ãõß%ž»%=ÄúV×Pç›øçdº|Ó®ÑûÃÓõ—ŒÇonX¯»ºåÅmÆñÇ!ç³ý_7ôµøÓ«îÒ~ìs«ãð¾ï².|å–ïæódˆaº@g¢z®|T¼‡»î‹<¯ ~ÆÂÇD¢_tŸ†pûyź¶üLK0ª«7¥yÍ ‡`=ÞÁËâ|Œ¶¬? ¾(Ü®£Ôë1ä5Ð’_Ä”zzƒ#?ÍHïj/ý_›üœ†<~'Ï>w,/J)ñ‹k©ï%Î`x±•Mãé’p}çé%âïu—‹x¢-åYëꎗÏyµz}©‡머Y!oÔ6= ›?Ÿ±ýê%©æ»±õˆðû®™¥âyÿÏÞj~%“Ej¸š5Õ¿Púªø{µ¾ÀµƒN¾¿&~DZIþ®ôë0ZàÞ±³¥z^M’ÅXüXù\ñUNðº–Ìpš^‡„ã°Çk`À•ÏTõž%^2üþŒèþI Å”/h`àµ$qŸµéÔ?cò^Ãó©ÅêñÜ—qœùKâq {]øE,žâ¸bnr¶ŽŸ—WÚÔ ôáËH7üÜpýmú &ã~ƒs_rYWÃ]êþ’G¹ð/|UpÂ𻞇Ӓº¡¨Gu@Â/Éú+ªXöw|.Q]?CÞ%[† CÔzårµ.-ý^ôÔïæ›Æ¨õ$`¤Ö/—}TPú~>ì,êÝ6^çýÄ5Ô§úßì<‰×%uP3·:áùµ5ø›Îñz®1ñÜœæ °û§j~ùÒ{£q¼³_Ñóž,ºÌ(¦8h¸ÐÑtå9ÚLòÓeþKòØï¢¯#Ö“çEóÅÑëZ2Ü磻'ú±#o–êÇX>\Ô‹v Pñ„SE]CÝ3ßr};²u¯[óÈõ#(®Óó u$u‚n¦#ùóžëþ<|Üs¿mé°DóŠ<ã¹Ùj¿dl¨¦þçUñtßç|#«ø¹ð8] õ¡fº­§'ë`áŸK×Gë˜â‡§Ï8é—”Þ!æ™bÁ9/DÆsqûD {©~<‹ÿŒ&,Þ«~3Æ=ÆðÑ<®3ŽB±=òu†»Ñ¼µë1Ïî£y¼.Í·}õþ–OPyçÐ<+ó©Mh=ßý~!ŸôçÖ^*Žc„>ºïüVgå·>™póÞçuF½TƉ}üZ†ør½G yÚMt=·B䑿ߢÞÿ‘¿ünÛh}¬Ýo«y÷ U5\:+žj5õ›N%>Ò6l} Z?„ü‡`o´Ñ×לãÜéÛ²‚¿5áŒÛW!üÍR~q™~=D¥d<÷gú­j' L0¾^*t.æ‹æ)Þó?b¾LùšBâ=ÆÄ-/—MÓ¿päÇûjÐzô¡_ž µâÍó²ït&j±>Äù„שDÏc1ÓU¼i¨ˆÏ¯¨+p{ÄçÁçl½oDù¥I3Ýò—¯Ôú§8K}1êmuÞ&úyâ2u>ÇâÑâ:o3ào6¿ þ®5×P=ám}žèå%®~‡ÔaóßüD¿>m_í´N`‘^çÓE½—ž-Ž3]ÅycskáW¸Žpèb¾“}h1:®í(¿1!~ãoÐß×ÚÄO2ô‰—zÏ|B‘8³éñYÏëR½¹«þD®-[z ØÖ,Vž ’šæ£Òªùû”ô9±õ Šs_ü+ívá:lÃGpóËl÷-Ìçé'ñËÀ÷üôæ ×Í/¸æå} Û¿æÇw þ%¯[`Æs"þëA÷ç<=o7Üþú¦ú{°l]d]۸ߤžês·»ŽÀ l9;Vü`Ì7mPñ#¦¾®è7XÏ/l®žƒý8²òh\§»Ââ.Ú«ý<اÆèÅæ£åªÿàšÇ7¦ž$A[²~œhÈŽÛ–á÷»á ¸?žq]ÈÏ?Cø÷˜¶W|>çÙÈñ1ô„×|€n3bÕÓ2 îsƒš’Wp~^}`Tªøôà?×»u5ôËñB·¾¡ØðݬèNJã~‡ìGo<Ÿ9Ô¸´Dí§ÖÉüB¬ií—½*ýŒúu´²#Ÿå5ƒWèy«IñÏÎ1ìÓç7Ó6¬^©Öá;ôk¶þRχØÃ¶“:[ûÔº ŠX‰ÉòßX(â®_·og8n+–ßœÓ&§ø)™‡³m‡­ýÜüG9.é3K=ðûÕóÅ<ÁÁPæO޾OØöǬÖÑ•é_´×óÐ\ëX)ð‹˜rVd>†ãÅÂþiyŽóf½dº:¼¿ ÚR}Æq¾Í•I¯²>WÃsSÑ•@?Ü6ÎLGW0cÜÕêqX :÷ tüDS~kwnãù6KY³Œt˜¤¡½š¯EgYç)[ó¤†1"Î7éÁ¸ï›ëêGçÚ\ýápûýéê\`Ë»‘yÞ_!®N f4UynLχëáŠ^Ñýšüé•OŒóN˜×ÏÃíÚøÏ&EãG¦ßžÓuÐU§­Xý±ãïŸY´ÞµÄ_ýP¢ß¥ºH›xu7 Të°Xóúxõæ§ô¯’J|Œu¬vz}6Ž'ÄP½¿e[—dÞz>ƒ>ׯ-,¸Æ/ËV'[†Í;Eü{“4 ‹!ÏÀòÊÒOǸ͑óVø„ê~~}¿¢Œí¶¿Ÿ“ùg­Vò3Ÿü—Ç¿rw™â Ð)ŽÃ¤;aÓ1Ž·GïO™ðޏjANôzrehë‡çB?ÁCÇ…¤£ù„xîß ÿñŽu©+Õüz æŸ|ýü$í“•+“ë¨ëöÔíÃüÙ¬›Ôüäˆ*:‘ÿú|£×zÎ?õó[ßdx~Gý_×þ^¨ÁòÕUù9–zFð)õÇìæ§ûâQQléoó†ëH~†<}~y–ýJæŠzS¾MoÊ2ÎZ7#Éû’:áçÓs›Í8¯fTwý™6“q¾íë8o°ãÜ9MÕMö¬ËfœwSzž ˆ˜n­¼fÌ÷{ÿäßÛž~¼èy¿uŠ»$^Û„ŸÃ¤;Ež»#¢Cnw0%=–FŽóãkaî2Q¾4ßÿ·€ô@‡Dã3°x£vþöÅÄÕ¹ð5ÌêŸjÞ K.W×ç]Gô<²ï®{êdžƒå祾nXã·®·fúÙ—öHGˆ§ÒÐÀ‹*Öã®Ãïkêëjæ/òˆ?׋p哊üâ¸Ñ?qË·œ·JŒßã }¼!qíË…Þ6¦=™¬.3f Êãî/ô<Òꛉ]ç«:þ7MqÓ)}GðÖ ýÐN5û¿†# ¿ÓRÿEuƒ.ØÀ§R©/¡6áJR=¸¾áxc’‰Æ©cѹ»|…àµýìßÔâÝ ýœ€ÿŠÇSØ52ò¹3å!¼Ó‰ñŸ.8 ôÅ6ÔˆåO£›‚†~óz²þ¬Ž}ìeïð¹¦ù1ø{t<ˆ6é¼÷hG¼«ÏÕu‹ãá“ò¡QÒ\ëæfþÅTA(ÃüN*¾©Qºqn]¦Æó½ yö7êpµ£x¨¡_^(ì‡3ˆx¬Uôu¦Pjë"ýùK}ž>+#Ïûà‡â=¯W¿4<Ÿ+G>¿Á¸#Ž'ûýT2ô7tÄ/…Û—Þ0ÇïÇ5äùéÊH=Ûpÿê ¯8ß×x…ê{Ãbò|G}=^ûîKe~–ù_ôg:žGØñ.é«ç{~éØWpém× ú½¾˜ñ®ŠY^öütúÑØòëR§(ü?f\ާ¿Ç CX¾aó?©ìQß*òÏ’?ƒÇ…éµÕqfõy É7g}ð5µ/˜ôC}*Ò²~~z Û_Ô5/îWÌòÚ%ÕÄs5ò¯Ñycâ}bú•—sHÌ“ÁA·y­é} êØ  ú¹Ä†ëÿùˆ§>T5KýÆÔw{¥a{K=Èx ¿†1u£u-vSëY¦ø`XxÑË¢?ºP_÷7ôéàÆó^¼?«q?ƒ?êÄ3þ˜M—*Ü΢ãk¸~—ŸQ“ò#_?wîÉyá†s~õ}ËóZ™ãÒ™ÇÂñ^3ð™ }4m†I÷”I¾Õ=ujÖ¼”S¼6~UÜ r“ 8êÇH\‡äßWr{ϱâ:Ÿ™ŸGºùiéçgŒßÝo{_žG¸õë´ñ3džÚw|i¸˜ñÊŠ×ÅzîqM®™&ê‹çŽõ¨kúå„w—q>“W$‹ó“ánmy/T5ôèQê6þ/ãÅ_²o¬sóõÝ£ùļ_1*ýWn¼¿%~âÖ‡öJêc°¤j4kŸE×±3éP˾ž§uRûjô}LýθÈû“­C~z o—éÅbÓë~ùO¿[z ?䪇±8ÍÔóEßš"ÞOæÅŸs;Nóx<~] ·”èõçÎ)Rÿ/¹PÕ5Ù=š×LüŠ´ýÆòfX³[Í ³¼1¶¯Öóý›Q集‹÷h£ŒáÒïŠõ£)gÁ{fŒKë–/ÍŠÎN®,8L×gñ_Nþ/q‚˜p·ï“~’i@UƳi—,oj3,¼\ä7ˆï‡•#Åyo-RãÑ¢½~y„‰ÅsÂøíR§#îûÏãü²eá‰K]½I¬ õ¸þp»-[TÞåÉqãÕÑþ£—ü“½×¤g~mXë< u¦,ñ21óÞTžsô3_s|ÜùBhýÆÞ¤úÞ~ÖŸ«a<Þ#&?Ý/Þ/•ÔP'K÷ug ò°G³¼Þb½~›ßFócpÜ ÁtyŠÄßóÔó >>訟ç0¬UtÿèÓïd:›-DÞ·˯_¸'+üØ´ -¢ãW L‡ÿ×ÐMÜ'꘹©öõ‘ù·ŒãÜz~*u9bÛ/ôz|÷ž-âðK&ʯH=wWÉ+A‘·z÷ç®;Gõ›/MÖÊdè@¸‚Õ?ˆ‡—mí—µ¡vtýXò¯Œß÷*ò>K/QóÔÓ®sÓó6ÅcÍYÞ¹=GÞ4zëçî/K|Lø}1ËüaÓû'ý(Ù7Éöû°ðOz=®=úíƒwÅïÆ‚½z\ÆÆÇôy섨âºÑw»¾î´p”ÈëTqÃkûê¿ø 4Kæñþç¹2™7sçpy^vuáf}¬êÃÞ S¦‰¼ùàèübÆxµ¨^Õ¸|é«qà ‹'ëƒ|•2ÞgÔâh½S~jÙ‹Âo) ~#žüYô­ç­5eúR²l#KžÆïÄÅ7˜Lö}É8~Ÿ‘Y‰‡l}·R?žcß#ÔK¦ƒƒ"?nRç')ÞÞ×PÜ0?!ò»Ç }:dîQ"þßÑQ™pûÁ‡,¯ÅxÐ!Ÿržd0éùâkÃñÓyCõ~{[ ¨ÐsÆiŒõ£’cŸC¼Ù?~v²¾‘Xqz4nk±8?âëºö—}‹Ïã±ë´u;ãø ßÉ×ÓóÅÇ•}I9ž'®aWCý{öÞŸwÅq‡Ût¥Q“òÏ’_¼VÕ“Ç@ÿJâ‚YŸ¸àÅ”ò4!ê¥]üêÞÆqëZÞçÚÑßsýãv¤c‰-oª×ç¸!Ñ=Ýx ®^H8/¿k¨C¼JuŠ…wŠûSÒ*™^'=wÞx•Î~ù!LÔß7´qŒ/¦utò;L¼ŽKÃ…Wˆ¼Ë”tõÖÑŠÕYK÷ëëºï2žÃäçE§þÕè÷œú¹#þSê˜xÀËNñŽäWÈ>V˜(úcÍ(‘ÿ¸îcuÞ­©¾ÁG=,¦+…;zEç› :áq=ù•ã÷/_ù:éG¡qvt2ãòsM†ö/©ùµµ+âá[ª3œq}ÿà´ —ëˆ!>Oj¦¾Áh¯À¸tù=qÍÖ¿Ñf<ïŽ;ñE¾ã•ttØÑ#]ýt\:UÌ{Mû¸TG¾öÏj>™ñº°´Pøã5ôñPZ}Êqá›N÷ ýßüöœò¾R˜ø]=þÔÖls]uýT$þºÁ\·+cÿj¿4³ôa³SïÊ:ÞœË#ýaœÅôÉïà}æÃïMÏu½dï FÜ(âˆýïmï¨ùÝç)îÍÇ0ÖOÚ ¿ÎÕÏÀ…uôqå¥,ãœaÀ-Ox:‰ËÀ¥o‹û”GyŽflüƒÑï7¦üpˆë¨L÷ÏÐ_ Ëþ,⎟î÷Ÿ¿>œõÕnIùöµÛD¾ÉpÝÃß%ùq]=t^®>Ÿïµà"Ρ>–œGì§8hÍú“çâ¸zê·|[—´#?‘p,X÷èÎü`LÙ£î7¯Vt]}NqäóŒiÉòžÙ24§¿>ê¶n´J'/mì#P—ðá “.*ݧ~*®)0b Š¯¢>ñr~°=Ϲ6‰sÃt=~›èûc×J§žîbÞ öÒ{Lù6YßÀ°oŠü4Ó›µéÏÆ5W½T×¾Û&ÃiéúËRo©~‡è+‰ÉËÄçÕY¾ÀP§Ê÷íh?½èùéRÃKÃLóP…UX…•ãº0(ùŠ›úlr}Ã/…¿=°^Vq-áùL^œ(/bêÇb²à3CüP™ü*þù⟉¸â*‘³ÕaPâó(’~‹Ç1Bøa¸a£ª·tÅéb½œ³IÝ~â‡j~µ‰[\ÊãTcý¦YÜ›4ïZ^,äéýŽüK’õ©4Fªýk$Ãù<ß#ýPOÐóÑ ýÈrm&J›oˆýd||aéDÏ-š°^3\ø­cY¿1†ÝSSÞ¿)‹ãN&+<¹àÃõüˆé—u"©o]ƒñÕ-}„Ñ9š/*ù²/*jæ¶ß ×±ºEׯÐå6¡/f¨ úö_tµà;,ÿc™ÇÓÂцÇê†3”󜩋¯™pëRç%ü¿£IòYx¿w´Öã0‡È+ûs7üîÊÉ÷ª0ÙõÀ”Ó’í¿¹¥˜7 Ž2|vŽù(i[p„p ,ßfžúêCÄý qü½,¼¦ãeÂ+Ký9Ÿß”ÄL~¦Íx_'™wM÷ìþŸãuÎÎ:×$>.n?;cûª,Q—ø­ŽúìÎÇ©dÀOµJÖG UˆÇóinó¼ÏsâñXÞUÒ½þÆãp!ž«M<¿ íãé} ˜éVKˆ¯«JïSBüC8^cGžg}–ìlðÛ-}¾ÐÂðyÂO\º):ßHq=*üJVÏ ê t6]špûÑó*¨þ¬ôk2ÎïU¿a°Zôžš_v̳ ‘E7“tNÐÕ †å«ú†[úå¤n×pË%‰pvhn^®¬Í7΋}C_`ŒTõPì|°ê=74fqÎiãõ:()ûŸ‹;§ |ªGjÜ?í¼¯a¾ËØî=Â9Ëz¤¡Kð Ó‘mš.OAê{˜úÅ¡;;~A:}:ãš33áMP™úV¶ð^›ù=¼¹I‡Ï×P$üS\‹ª¾AÜ>£Çõ£­;EtÿM<£š†ç¢HäÏÑt-y¦÷cËËeŒ[Ç-NAKÂ[ìcøûö„ÇܹJűÓ'¥‡T._úýqõÉQ…þ%«‹`šŠãò]¿1çR§ç…ëñ¤m¼_d®-xËÐ4åõSöUн?Õ¤Î~Zçe2ôK–_Ai3·ç‹t$LñB8^žï×t_ã×Pý÷ýXÞpòýÂ?:ÁÖ³ÚéÎ_qû½eÛ2xÁ‹¾/ôÌZ³õ£zvüsßü›s?Ãc–|®kŸµW˜Ÿ7§w¬÷3÷¹õg[¼NÍ3ÇÄý£ªßû‡®ž¸„|â5Mø‰Ó¼ÆñžŸàS Ÿ;aŸ:T3ð7 Õç'i?3ëyœóM•‡ÈôÅÑÖàO™­×½øUvò˜ÔQÌ­XÝmÌ9‘þ‘ÆÉú¹Ç¥<½ÌO·k—²nƒásÉM<þªv~þc[ñþ…}m*gG—#ßO5—–1‹ÖÿÁÿ…¦žñV¡çºdÀŘô ãê ¢ÈíùÁ™y¯16ºaÆ~«Ç«ÿw£x¼š¡~ñ½,áùkúÕsMûsýX¬û_‘—ëý„ˆËiž”z¬R§Nêg™ü4´\Ÿ±ú;z>Ë`êSqö³ªîœ¿þFÜ_NÇ-¢üVQŸ¯xóN\bWNnX×Gü-¤q~áXO¨³Ÿ ñXƒ£~(y˜ø¼^p*Iã ® –ñý{†y`¿Ûs‚>”ojé9/ç5ÏpÝ!Ÿ }ýæIWC5o„ÉÇÔóz;ú=Á™Ñx%\·Ng/l¬_o®VûMbç>á¿ß]WèjP¼‹‹çu”ø«¢Œã«;ÉÍÔ×WÖû⎋K…Cm·žÝ?'øÿØ{Ë;Žc T ­˜aÅh­­ùÄ`Y̸bfæZ2ŠÌ 1íà ù:7Éu8r;vì82³#Y²Åò{OU=y]§{¦gΜ•ì»õg¥Ý™ž9szº ¾ï«ƒã|LhžÑ¸]òï¯TCYóûããýsèMz~³ëç/«\?^4FߟG%û¼]ãg ÷ÉþÂꙉä=d½ÄÕ$?È;r|š8ލ¦x'‰·çk´îlœÑ÷Nñm±ñIG=q>/lùÞ2âo×vìÏbÑ»²"x¿ð^ŒY[ ?jï‹`¼«Â'㩇êï=ë´(¥µž—ÆÍÇ2Zç÷ŽskÍ‚`ÜÿPÒ÷ǬAnº¥\ß´áåÕ¾†ÎŒšÑŒpó 7'q¸ÂGEöCUÝ™yz˜5ÁŒ3µéüo{“®[Ÿý¬¾'Â_CƒyÇuzïÖ { o±ø%Ó)b!ã ýpÜ\˜ôTûŸ4ëÝ÷*ÍÏÁ¯ýL‡ÞÇ»Z›ãyÕ¯&;Ú¾Eô=Ê~µ)Ç¥›Ï<|Šuýx¾ÖàùX“ñ½x,üN2xÿ éù36Þ¦Sÿ#”OïþB¯—;ê@ùÇŸ§ŸèðIZëžÔoWz ®÷‰m5ƒu€_`ã'ª~Nè¢Ã¬ö…©zœŠëý§V5÷WéU„Ö-ÜâÆ#—8Ö­SøóÎÕõ”g§õé Š;•~5ö?¦ë,‹<5º¹åU5™/µ¸wðþÓ b^®Ž¸¯ù]ç!tP0ËÜǿχIgE騡%ëð|:Z}h"ós,ýa°ëœ^oÍûfàsÆŠ6‰Ölq¨ÿwÎ_©ü“ô»°þW±ð¶þ*Þö[·Ÿuxõ\Zë*jp(Ã’¢^NÔÃ* <³Ò ìö,ý}Ül=ŽêPÝ8ßÑ(ï+j½?,¾÷ï£H´|?®‹×gGñÇ£žgoâãz^ùU¡+$q`­ž®Ã… ÷U_ ×ûóy٢ϕìl½Ÿ;Íþ¶EÿÉ»ŒóR:[¡×í?šÞ‹U·“NÈû"Ÿ¨ö¹û_#}X¡g…BÁy•ßv5×>xþøßV »X`V`iYTß—ÕTœV`f2W]¥+°+°+°+°+°+°+°+°+°+°+°+°+°+°+°+°KÏÐ(38 ¿å¤f=R¥#ÑJ×C–º ¶¾#é:wã1joü wêz?ësu|÷ÍR_[¿žïã'—x^·”'\»Ðßò>µôS°è¯†™Â£ûúýDïwP#Y='dåŽ|T“<”âþÂ륥Ó.qÖÞ9Á§›{ÞÈÀ”’<,.J|‡ÆÌKh ˆÑOë|é›y×ù ñ?gêzn¸óÄ_<ü[7…]Íý°ZÅëƒßÐ× G½(4f=šãôyÑ×¢óþ¦EO™u=°çÑ/³T¤y‚ž‚ÏoÑMSë «®šâǦŒ¢k¬Ã»·0áõw5LKWÈwÈV¿ÛŒx¸înⵊÇ×A?½¼ë¦¯×”õ_Î…ð¶™…EEu^È’§¢Ýç YFþºò÷ʺS’·èW#b_¯±KõçÝ–õÍËp¦,Á›»ƒ¾‡¤»„¾‚³zo¼¾/[þK¿ÎÎ9f]¾=u¾ÔÂo’îZQÖ¥º óP°¬#õéfæ+§Œ?ùõci l{/êG1[Ǧ˘rüûÁ¼`ä¼éư‡ø8!:þu-ýFщ×É1¬º?oÕhÝFVft Ó5Õ÷ÊöwÙŸÍÕPRèVv%ýsl¼Î¬£Þ!¤³â늾2Øî¦Wì#øb6Ý%ïe¡ÓpÚµŸ‰¾aÓït>X?â9ÚúãÄÕÇÞ»ißf"«^ý-#h½X~šâ˜'_#¾çÊö´N6£¾hHñ Öþ^ÿ¿;õÿ 0>R:ŒØñ¿éõ™Í½‘ü¼Ó꯮úEøÿ.¸¯ŒuœçõyU÷}îMKã¤?ïÎñú:%e˜Û+X/µéš`~ãØãÑôI§­Ëˆþš«)þ&öÿÁÉßÅC÷7JKŸÒ¢§…µˆ—¢3äß·Œ»¦•4ûÉÿfÝ×ÒÑt5}¤¾Oé: JïŶžMþv":·a}lºqX@;(%âßu/ë‚[x¶èËz‰þqK;Òþôº%Îì¸C×­ÄÏMé=´ýÒ‚+õšÕçòºõ隯W1ž„BpýObƒkÔ-ÑxÙ¬7; xÜØ}á­4÷}©ªïóªÿf<žO_]¿Ié¨ÈãO?Lß-ö}Loàvܵ Ÿón‹5ßTß:úà¬Ëˆ–÷¤~K¿'ÿ¸²–<ái^§5ëá“ÄÏg}f t\WU??Î'{gÉýâškü„%žî”c]©S3šöO¬ú„ú0~N÷ë¯ÓJŸ£ïj]‡áh´ûFöÿFêûLŠM§§"í3ÖëÔu²q°D _!õsñd}]=ÃÏa2χû×Ò¼YñWz~k/P\8ïŒîÏß¶‚ÎÛS‹Î+"®ò—°`y >ª„Ä]M³??ž®—÷8ÝÏî£ú¾³ü;´NÎn¨­ƒ¾îÞÚ¿Óù”¹éaÙXý9Ö}Pæü=X×pW=/ÕŽuÛnZMù—uUôû»úþxzÓ¯ë°à†7é½Ü=^Ë·gJÏÞ¿é1sž·ãDózV"X' C¨®1ë5y¿µ¬“›ÝüÓ¨†1º>6Þ«çqÿÙ’7Ö×1ì™MqAùW¥Or]KÿÐûÍ¡ù…ýY4Ï=¡ß7j£1T:‚È6÷³YŠ®Ž£ŽŒ«áÎr”—]x-½×«¾é|ÙÁwá¿éùàúû²y»¾¾ qÓ§³íJ7…âécê=¬7};Åa……Þëð§èÚíz—öÃw£Åýaý(±zœy¾®y.‘8kû%¢okÓ7ö÷}•ﯱ¿OˆºÒY ½¿çƒŸ³ëqbá>Ú滋ý#\[FÏãïuËC¡ý±¾7¿î_\ôy]Ü]NßO¯ïéûõ>öÞ ×ëš ]¶j">­C÷éÇ‘Mõ}9¬_7æn§ïc¤9À®‹úºÛãϤ¸âi=ú²y?óÏ»e²Þ÷ê™+£_š­/xÆ®7í:sÃsÑÖ7TÖã(´Pú–~4‡>ÉH_GéXï—ë´)ç§ÙÇ u£é¦å—Éþ^a~¯ó¸Gè§-ÎV†ž¬yðM½®ÚÏ->ƬׂóÃ5Ìþ Åó÷RÆ™Bþ³­¯º÷'¿@ô'Â䥌ûø=ùÜÙÖÏRö%GWè×94•p–þOþq»ßŽ–â–ßÂþ ñò4ìcßo©3„õ1‘†å¼O4ÔãûEŸÃ&ÐÏ ¬+y‘õvû?m|¾¨ ˆb¾ìx.8^_{³¾o|”~väüWÿŠNó@íï¶¿«ýTåó1«½ÏC÷êûqßõ”HXw4å~Óú…)ºn3Véu”:ºCËëÇ÷áïsìCÁýÝ&Q^Oê"«>Dªÿ¹óý·qÃë¨>éXðY!ùOëxËû›×¯_[â†n¸…CÎûåQ½Å,}˜_±ÔÕmõ‘ÑÿHÿløŽ¶Õu…±|@4ÿidMÝ¿Ïø¡ñߢ|p«¼H÷é}³ǽØY=žîpc±®6°àtÇÔIÄQæÑÓÙ—îÿŠÙðV`V`öÕ°¨ºúV`öå74ʻܷðÒÐPÿ¿÷çmýŠ–½ª×Uf\H'ÍÇ]ZxŠh‘Á8iÜÐ$¸îi郃=í®hýs¬ý›ž÷šMýªPšù–úxbׯÅx±q¯FŠŸqý¾Dy£hd®ËzoEë›”®y¯ |Zï‹æ~o·w Äã¢×//Ð÷çʇ´ŽWqÐå2“w@ÆÕ>¸†ê­»_ ~¨o1~ÁÒßÐy|Q?Á¤efù¸úqCt>Šß—)¤náoé7ˆ)­ç»ß'iÝïtœÚ¿ôºuÔ<¶ï£<ñPâxŸÐú毛µ˜ÿ}LÜ­oê£;¢õ!ã¾×²_$v~`^¯û ƵmJ¸©O-}Õ*qžGe3ß°5$ÅÊ»ôz„ÀÅÈþŽhNÚ°¾Yþùªž÷$ÿÞÂ/þ²6}NïóöÑøfñ: úý¡!óL&•Õq>N¯ÎÝ’úÜ£×—£Ÿ¼ÍP:Ë?Ðïõ<}Õdî+å:qn{íeñŸ°ê£h8$îSµí̸2ÕßÙãõ6j?ÆoóyŒïÁ¡ŽéÚá´žïÎ¥º´ç ï:ù7ªÏ¥ë}9ßH`ÿúeÌþ¦Âߨú»íù¡”…‡TN__½S¼žŒüW`]È;o‰kºè<>Õ5§DZïl†FÊoãú÷`}C?ÙÿtÖ³n@1ö£.ºÕ³±9÷ç½mö;P)ž¿ŒÎ7¢Õ wŸ î×ü†¾/Ë~“)×é¤ë/`oWšu¢í¿Ø1Z§R°.ƒ÷…y|Ìþy—O×”rÂoÅý£u¿éãÝ.ECô1,ý‘±¼²yÝ‘ã÷Ÿd~ÍŽeÒhx Þ–<@“`^ ûôV]ª+܈ÊȾ¬ÖqÎ2^¬Žàdz?š˜çÅÒ¶:IðÑýe}¼Óãq`”×~„W#š@æò6þõ&MW…&Áº^èÑ_ŸWEË !‹çÂ9ï(LñSÃçéç`Âó`ÌC:_`Ðòænß;ã–_ñÎXâȼ=ŽjÉñÕQ˾u>o‘»ÂŒ/©Ä¸‰JÌßÙÝÉ¿´éÖøã.¼GÇ›æ8­tþà°þãz„ ú¾ˆéá¾P•ßï©+(¾ìL8)…³Â†o0ŸnWà:‚œùú÷[&uQÐ'äïÙæç$¿OTa]—…ÌyÒ\èÿ/$öuÞ/0gºÓ>B–ûbÜ*ŠŠ8Ü⟢_pÞ =BÖ™œÊ1îÙûòï¯YèW ©YÿDñ€\õüózGë+Ÿrþ†qn¸õÂ/•üŽ?¡ø?—„$9eœâ<¯ú¾iýNg ®…ËõûZp‹q}’|,+––ßfÃS‡žgÁæ·á*Á£ ñ³üãºEóëÒ5¾3ÌЬf"ë¯Ìó§üó`Þ'–x¶#"],<öÛ}œdi‹ÎÂ{ÁükïC:Oå9ýßÿ;8Ó)±~ž*™‰’6´/k¼Oï˜y]‹[oCîw»Ö‹õ\]u»¬÷QÔ-ðÚhD|¬Õí:‡›ë7ÙO˜÷ñù‹Óš/ØÜ•ê_%£ù_’—áW™óx Í|‰Ã÷N¸å•|S§V”7ê­ó°à}³¿_—ã™7DÅÂ?÷ÿþ…àÏhAû6ó‹-¦t‹½Ó´Þ„鉅ép &¯£¬oæK/?§ôXRîƒóP)ùÔ1P~©<××niBÇy Áç÷ó Šo´§%ñ–,Ñ󎢈öô}Kÿ6ª©÷óþFyýXÿ¼ƒ×/`E¬}½o2Ç Å3”¯~—ñ–}Zîs(Çyiþ=ªXtöW5ÿÐ=YÝí”ñw>D|÷FÁút6óÎZtÙŠ2ÿ¥RfxTÿ‰åÍÍúÙíDÞ7ïНvŒÓýÕÖÁñOJ¾}ú)Ýÿ¿NÇkH¼TTCm_LÖy?~» ǵE‚ç‰÷¢þ÷°º3öUÓÏWy˧V¸ô½Þñ-ò—>BûM7æ³UãõnhËhúÞ†÷Ap‹ÙÓÜâÎæéÅ·)ãµN†g‚Êâ{¾a;­¿[WÓóœ1ŒÖ—úFʸmBtlzŠ3FÐ÷|Gš_9ÜôÚÏ„NÒ‡ñÏÏe\ Ð±ÀOŸ¿Ç‚ïO/E5ܰF_V®^ü¿…3Ûïm¸&WC7·ý@擱&í¯‡~NuïM\§EïÁûïŒ%z~¿!ÅíjýV?Q“ýœnÑtÃâ$ôokœOVBÄ}h­iÍ_¶çúSÿ·ÍáÖçèyžÎï [<=3i*O€¥ëE‚óþqC[×·<ªû ».Dãíb=¡[›&‚p5ïC{°Õ…JEË«ø¯Öçíb~¿€nÂïñ#ý~þ¢xëYô‹ÎgÊõ-º¨\G²õ5IÚdž%“©oyâü溾0×iÑ"DW£”Eÿ*b½àÿªÙð¡çYò*ŽËãcá€ü©“îºÑŒç˜Hð'ÊKçüÄ]Ï]šOÞyÞoe½ƒž"?ñdsãûÉÔßòx·þƒâ™=¤ß¾ž~®¡†;ªn¬ÎWø0ìxŒÆ[?‘Þƒ§u=Ý]ëɯðù³õøK:QrVEÊ£¬~Yß6ž£¼ï{8ð0ó$¸õH1=¯¹Šü]ô­çÉʉõ¡U2ú¸)ϵwOã~#û©)YÏRñ"öK³×3[þcººáÿ5#zþ¶þhÈû+ó‡Üü/Ôëq­d÷TùÕGÒ{PHõ±ÉÖëäJ·°ézbiýàø¾r°«ø]?Ù¼nã|­šÿ½×”뎠<¥« ‰ýó¸_‘Mïëw›çÛX·ï#ßÔý•*¿zÙkÑðB+›êëÌZJt`k‰Xy=t"œ'òÌøzïä•Q Í/úf¼|hÍxõn”ÉÌ:k3‰·”þ-ºÌ }¦¦¨\eñÏqx¶ú"²™ï0ö¡@ÿý w‚Šú:ïg¿¾é }ÝyV¿g`ùQ3.}gžžGâz·Ô7Cº×ú(ÆUúœöµõß >®yâúÔG–çì¾ÃréÿCÆèûçf*˜ÛâÛ¸Öûì¿ZÏk+žóúg¬¥ã£8/‹utþYH3+ñ,hO_´Ê[Hü”ãs9OSˆùwTÞ›óÍÃyß+/æ]csþÁVÇ {î²>šò÷2ä’p,æƒò£°îšc~·¿IçW ÁU ŽOpÝ?õï½Ï/Œß“ÿ÷¥ãèýã÷…Óä“ÞÕ›â„,K>b̧ù5Í£ñ†÷̦÷¾×4òWæ‰ù5ϯˆüeaýúBïïöäo8ŒO?r§’á¡XÇW¸çÉà±âÖ`~ÐC ÃY¯3džÿ;Žõ³·£ùѲnL|!ø{ù•e?(Ïþúö@mDC3ΨzµÄL.fÞ¿öý/ÅC)ïí}láóÔÕu^1NıÃ9._û æ› ~I1Gã,Žû×S`r\o¥ëåÂ+¢Ç­Íxìoó×0ñsŸ…7¾œÔQ󕪱ÿÿÜžõþ63Y=CîË…½[Ó—EÕ{ÆH=¾Âšz¼¾¨fZõ[[œ¥ò`qÇÅ’;Ìõ#Å3]µ2Ñ:vÊõnןoˆ¶ãU7tî)“}ŒÏ> 7àoá3ƾŸU¯¹ñzþ”ž^?¼§ôõv´ÞÏEÖ üß‹{Åh7On3\?È8¥¿¦ò›ª/¡ä‰úã©~ƒo1¾O¸ëçÆ|’ ˆ£NÚÔ~õ<@é6%ƒ«Pñ ªGû¾±â´y<ÅóVº$ý’ú7‰VðRà{†YÜoéD0Þ5ô:×dÖïŽj¨æ¶¾`Ã)7ÆùãúûÉOî{4ÒýH?SöƒBq ^ºxp¾ÏÖÏ'å8á¡ ãA^ç|ÂìÒ¼ý>l:PŠ÷o»ÌÒÝÖ×WEãaW7]' 3¿çWçã{§4§¸¤¶%/jÑcpÌWøøå>s¨âö9Ñåùà¼Fg N¸/ñ¥±þúž76¢<ת§ƒçÕþ)ü ›ï–¯iœ‡,0²ZÝ7̤žwʲn}ÊíþrÄâwàÖ5´..î8?pS¹à:úIKíñ«ótÍòÜîo–G~Õ2ó„ÁtZˆQ•ãÖö[t?~ØïóÈç;ïž«ç7,x^U·B/w¢t Šðû“»@ŸÏ»†.÷”àõÏý}Î~¯ˆþšXy³þÞ-.\çmà¦obë”r\SÎŽ1ã¯ÑP×ÕÅ’Ö´ÿ1þÔ:.ë|ZyÝ6ô˜yWÃàU”ÿË«KûâÖó:<"žÅ†ûƺáÚ¼w奌3b]$ÿ-¨ßJE‹þ)å÷¾‚ÔaA;}?÷N ÅæûXêãþq#NÞ·Óª!ôä™Ïç÷)áz:²Íû¾Ì—ùãäÝøÞ`æó:zu²8!W½*ÿx¥öO…wÍl܃ÂÜÐÎ\ég~¾UÒÓùDטëImy^L$ v~+×PŒ÷޼…à u¶%ï—÷Œ¡ç®æeˆ~ Â‘º|Ö8–Ò'júG~oŠNñBWØ‘O¯tnБó™ÜWWÅâ˜åÌþJ˜®žu¼œN\óõõØÁ䜤/‘C¡„ñbÝ@%¡ïaãņìþq^ öKZäÑÏ6´OÆž'e£­¯²ÿVÊxì×a+ç­ªÆÔg8ª®çˆ›+ì'bé&½^×Þì'*¾¤Ê#YÇ+$ô9-u‘0Sùê”ß¿òyÚ¤‡WŽËR<ô”ß[ôU£JÒ})þJJ=°¯ÇÍÌzëñ¯+⫽ÿ4ãþÏó~;5Çm\0/gÅzO9Ž@oöï^wÕ;´ÿ†|ïQÍÖ— ~H~&çßÑMø¡ý-øÏ•ÝòÖS æónj‘H|„ë'šó3ó '«ÿ0¦ª/Ê<L«“(O뿯éžbÑu‘Öi¿~U‰ùb’;§­ñýÇUÉê¡ç™GÅËÚÌ;ËŸkþÑËš‡Sü”¼n©ˆxávÌS_Ciô Yÿ{OÄ¿CóšfêÉèV„égÚlùe¨Ï~ì¢ëÍþZKs?¦t ¾˜ODÿ£—~Úpê6SŸWé}¤ÄQ…-zÈ…‚盌㕮úL¥8yé7aðŸ)ךóŸñ~½ùIÇÿã³®åzR Ë}ÝJó\Í#ïgºNÊ`W_§ó{U™(^ºè¬çMýþ ›ý›”û=ø B§ýYg|ÖÚŒò“6õ}ØþŽÎOÐsýͰøOÁqJC·÷Gá¨1ëcò¿'®Õópoëüç(Ÿíÿ‚a†¹‰œhuaeÞ9=~EYÎq6Tã}}Æfúi©#!+fݤsþaXX]ù†¦éé XXå—av[Ý¿_9ð× ÿ¯š¯ÅƒªVÊ8).DmJ=ÃêÌKÚ´CèJ×·P}@ö­ ½ÏŠŸNåïwÅšhù³z#žXpu¼º™#ÞÿÇ™y5EBÎkdÆÙò%Þùüåõ§k8p•®Ó>5Xÿ/¿ Õ¤.b2õÐÈ÷Q]Õ£¤UÿB΋KüG7Ê_cmáö¥.¤ÐépÖ…:ÍèÛQ_Ë„àî6üUÇŸ7·ð-|?tüs¬¼ <€Â¯þ‘®ãŸ!hÊýàÞH<¬ªÙø¡ç}(ø Ùz]Ç;ŸîE¼Ÿ}á”ãUŸ«2ÑpÁØþ¾îWux9Xg =ëéJ|Š˜ï6\&ºFÔ ËáýºœÛ¼–}-üß+]ëUÿCu•‹¬ÿËúÉ("æcî(𧽝ÓwíûH¯Ø;.ôÞßd½¬/éºwÜFã䵡:“ÀAû}‘¾Þõ _‘€I‹u|¶Â¶#  ¿ªßWs »?ãÒúŽëëïòŸ®¥z&Qÿ3¬\Bǚ̟÷ª§œѧ¾š¯ÇúDu3,&ànßËø3±OdYüÞ•ŽHès[µ‹êx÷^C×mÅûÛ¶^:þnôÁ8Ù"Žü¥½/e´^¯F[—k«þÔéõoóNÅóGÃu×7Ctߎ¨ãͼfä\ˆ´Øú.`E]Oáô?6‹ýþ¢\GìÎñ™xO±v`0ßý¬#Þ°‘x_gT1ÇýÍu~Ÿ'}mUâ_¾SG{Ý÷Õw«[ûçÕ¸ºÂzœ%yœ˜ûŒàEï¯o–¾Ð¶þwþõ¶>éÔ÷…-¼ˆÏÍþНðëB.ÿóš.ýÞm„¿™ÔˆtTäþ‚cñ÷/U'-fé‹7Ð ·ƒû»Óóë®Ï_¥h=oö|ú¹g½›î­ècë÷Í^}o-#¿ß`þ¹¡¸žoiOþ³w‚ëÃméóbk?zî7î3/*2¤Ó}[ó?Ë^%\I—1f}ZÁËJÁoT`}†þÝòU¿Ü{‹÷µr"2æ¿Ìëéöošó1_à`eý{iÄ8G¿ÅÆ“x$¥?ƒßÞ_YÇÓ•çìßw5^çw~]³yþ5zN…âå5¼3"îl&ð|‹çd”‡¤úíøÿ?&ü©^Áþu\õ>_ã†Ûu5ÔfüÖÀ`ž‚ßLèeøãŽæ— £®ã‰ù#õ÷Ù¦ÿ¹£¿¹¢\<ý¨ú!ºabÞcü=´¾³žâG½n˜)¿ÌÕ€$‚wÄÕ„+(þ°ñg­ç—qÌK׎8nû²:Ÿs…Ð+hÏ|š]lÖýHìÌ—ûÄR?ÙFùz¿¯òôªzœ;ª¯™·?ÄmC _#&_åËj*þQý¦d>]9¾-MÇ-D}cÓtÂ¥ª¼Á-×0Ð àªóƒ‰/$ƒÿW9Ò~)ûÀ§èwDðõ6§ç/øGè¾4Ð/ÀêvÁºÕ[¶:}oØý²þ~¨uYòôÒÐ ÆßËu·Ð•u*?ï¿êicÜdíCØí!ÝOÜÀy0Ž÷1öRa÷£°õÃt}Æ0¿0SuE,"]ã¨|59O£zDËÓø× ‹këYtã_ý×ë:G!ý¨ãŠÇÞ31yÏ7 _Ìç•_W¿Ã; o1çµÉ¦{©àûXÜòšG2[Ggœ)½C_¿½µÀíwŽæÏ¤ôÉa]aG—âEÿâ>"òÇ£ÂB ·ç†-óíó‡"¬ïbé§–zý–z^ëÚ¿¦µ^*óÎèþ¾Ä[à±z=ñäOZî/‹çƒôôù1?‡Ö»šn8¦ÐñŠr|£ò؇ÿœî4®Àa„麢zH\7ûæ> ª¾SUŸ'¶õÊùþ7n4×5>Õýj*}0tÍ&\šgíßh^üZèôä½"âT3£u=ï„cÝ$¤.šßæ÷·©'žÃŒ¥”—¯oYo¯íXÏI9~ÁšÌô!pŒûQ‰ßó±MôüN¿Âf¼ñÆöfÝ·…Ã÷7Ì­èGøõ–…õºT=Z7lóí?Ÿƒë%½"âDª?'µcÙŸãñßÙG{EÃÃYÇYý=^ýűûWFÿÌW‰úŽzl}Òóû­ã ¾ƒ4[ßòÐqg¼BþQQ7õfF>‡ÍÔzõ<<öß—»¡Ë³úïŸ.YS«ï±œßÿ˜¹ÎÁx l(ø¹GÜ·|œ]]KÅx‡_“?:((ñørŒÇ‹¨çè÷ã«ì¶/¢µùû±?í¥˜z‹Éè`Ú×w0ÜM߃¨>ˆ&‘[4^çŸwRÌ¿]çÝîw,ãDFÕãÑlZÇ¥ÞtÊõÃx§…?¢ûÁ%ùãO|†ö·ißÖßñúsÓýÅøOhœ>?®»þÍÒ/–q@aºö®†"1×í æx kΛëÅkÍùëøó'ëÏ•Ú=ÖG›®Æñe~"åï?»\ýZ†Ö“dõ”øñg<ð3Z¿Æ?“%8þhÊy°B–ùƼCï×™—m3ë¯m%!Ô¶Ôíe<£÷£ûYpœ7AèŸo 7±°™9稫Õ¼÷Ò‹³QÁ‘o·ë›Ÿ ýCÖuGMáO­™b森{Ûgôì«n‡-W›ù›MùýmËñ¯…W•Ò‡µ•[cçNã£1ž› Çã×½$p´5¢­ë¸¡Xzu›ñtoÑ,î3k˜»ÅiÝ÷y +$ªû›r#|_u¿ýÜÖÿø¾Áï?rŸ“ÿßùSêS\½®¤Žƒ¿µµ›.㢱fÞ7‚糊׭¼à½Áû¸µ~ÇzÙþ÷œ}ƒŽŸc\0*%´ï¶¸Æªnut”¾¼:­_5à 'ò.ý<Ô™Öù¦Áñ¡ÒÉ ËwãÎZú÷»ê6ÞOÈ_Ý÷ͧº4ŸÂêé¸Jð˜÷…Òæø{¿ |«ˆ«±Žð êz˜’/Îû޹NÿiÈ{:ÑœÏÿÏùBÿeB®tó Áùƒ¢žö¶[QÕ‡1ÿ}½ÞäØÏ ӆᄗÅ\Ês£›Àõþ’ãÔî"®>θ.:‹çëy¤y ¢Å—ã£ã]®c{—X5‰~ÿÔK”×½Iߺ°{?ý\×üºÓÌšªóÁÐôsW½`½—6æü6ÒþŽ• )*pSj¿Uúàþy9Áxl}ÔþÒŒÿhÒ¯óœà›ôþ®»4d}¿7üx³£Þ×וMד,øZ”‰›Vô¥|Å-ýôïµ:ï]i–ýëUžAá%Ð ¢.ÐÞê4o;“~²Bt~æo”òß‹5cõﯩ…ºŸÞìâ„ËA•ÌêÉ †¥,ð¯XBx.Üøoz¯ˆõÑ1|¥?[Ö¼OÒëÆ\i$Æe5›žš4¥{‚1Óþ>ó®hýÔñ¾ ŽÖy®Cë׉Š×Çcþ@s~ñx°_Š,Ë:´oªž']ÀºE›³oÓñ1=?¶{ ½¿7}¬ã5gÓúØ€yzÃÈñQ|å”ëÖy·†™ÑûÁžúÚ:£x–þßçøo(üoºì²èlcÙ_9ïʺ U-|}ÙWcgs^êǼ/,^NßÓâ.GÎç~³Rþ¥÷õf¿“õHÍ~Û­Ói}}0Ð*xžcyosüÉ}}0âd°Î~ ƃUºƒ³gëx¤#¶Äx]:EÊ££­˜Gk§¹áLß¼zŽ£}^ãP3½O¤‡¯*ö§~ÂSº=“Á§¤\ÿÀ(ýyåí%Ü)¯o¶~è®æÇcúR\·µˆqÝñÞø®¬àú‰kX9Ï0Ã|}ÿø|´?NÉà8 Û+Òû¼­‹¹N¶üó´ðœþýª8Í¢7ã'øoz'½§ 9Å9ØqÒì6柕Å{·¸X¤¼œÊ/I¿sGy…câº7T¡õ¨•Xgæ$?£…£NËšÑÉ@Ks}Úÿû͘çÅüÑ×KÊPÉQ—`Á”ßgœŸÔ«=¿—ÎC½o‹[š/æÃŒ&òž9ßç‚sÞ„pœÈæ=¢¤¨‡ï®BqU¿&ÁùZ~ïeý3¿O‡iá43w—†]sh4|‡Þßž‚_–!>8êå9æ¼jŠ}jOs]ïxHßÍ–Ïëù´¼¿gÿÜiŸEÞ§—ž[Ò}S®ÓÈÐP×;BMöÿXoÓ¯Û,_ï4_T߯4n®7Iϳbe™ËÚÕã}.é—bóG´> ¦|;¶Lëé{!×ßü¬Î?:J6¾»­ï¼ÿw¹_WãùÜ ^Ý?iCîzóïÛ§Ç'C»hù‚”óg£÷XÕÕ†ü$XGéÑ­Öù%¨&t(*s=.¯ëZê~¡ßNéX²-ùu˜6ËŸÖã•GMÑÏÜ^Á¬Ï:œö5,aúfãÞ Ty(W=¤)›è¹í ç“+Šx藍ß_žu*¦VÔñókëø›_PÞë¾S”î^’òý;j“p÷;´Ï<øâÍ/ïg‰ï™¿cÓ´™kœ„rÂ)!þ>ýHõUYÇõïç¼¥>Ýü í÷¶z4ê[ø¤ãH7ktGÔä}(Cºh?`@Èß+‰x_à–Q…ù4^â¼P%úœ_¢uVè\+]|…•¸ ºHãá¿fѹU¼ƒQnzZ˜qgØ!tÜuÏæ¥Ž'V¼dôgåzz]QÆæ×aO¸Åa(‘wP–×^=›UO¾ß˜òEp}yYö”¾¬å}i ôµ¿o¹Ÿš¼îp]Åúÿšˆ·F‘ž³ÒÙ´? >~0×˲D>}ŽÈWŒšÌ|ûƒëòU,xÄöß |m>Üÿ\§\6ìŒh†É;ͺº§ÒÓP}L|\NyÆÕ50?ï-‘¬)pæÙOQõK¥›0j´¾ßOü‡J¬1’x¨J'Qá‰üã– ÜÿSüK‘D;®gœ¥ù£t²1N_wÑPÿ\Þ»nõHÌkIù¤Bªÿˆ¾ÏºW÷#”÷êõý­Où¾¦¾dÜÿd µÃî, }s/ýôõ‡è¸ Ù·ÀÏŸãzÜߦï]í'û¯‰‡sî{ñOy½ñë@RwôÕ§©\°ÎÅžï™ß¿Ìñ5æ¿bö‡%ŽH¬ÈÍÖýÄ Miß¾n;ÍWµT2LJêýõÿŸ¼ßààíôܬ þüƒÖ™¯Ç}°¤¾¢ÒöÛzÄŒ+¹ízOöõÒß45óŸtß7ÿ†òB;ÚÐó9¼K~3Všùõ¼N¨üݼOôçç^‘çeßï»wT"¿iüL]/@é‡ñ—Y"L?8E·¼‚9þVzI)÷¹¦­Ws^Æ…±ž£Ì·`)ùghœ¿N¹néàü†Ò‹§¾ùó*|5Jð÷[”ý’cÁïƒwLì˜R—ýêç¢uÉ’—Tºvê:ØôssýT­W}_ÿþöUÑëÅj~–`ü}±O´ÑyQ>î­ãDsü%ü2¥/ƒ„¯ÂÚõü‚…‡„΄GSó]øgˆ~yÑà÷? þûfþP ˆõa°xsa~ªê?Žºœ×jOþªâ]úûýÊ n¼ æ‘ ÝPý{¼®‘¾Î×e?î3‘o®Éþ×J€ )Ïcѯs¾GóºpÈ{©tBø¨Æójåi7þûB…¾W݈š‚?iç–7•¸-ÌßLë{QöC¶OÖ×a_·à_âñ`SÆ™R–æ‰ÄeE¬›ø:¢Yì?Š–ÿAUž§íy½ßþ7ŠÛÞ YŸV-¸Î¬p"¹#Ìç[ò7þßk‰x²…àõ0Nê¡ájK¾Ièg)?6%¯~ó âO¨u<ç0=7Γ¢Ÿÿ¹ªop>v}·xRéü”0ïWÿdç8ï#Þ¤ÿyjºÍÌ8²¼¾Yt—°~­+õ>ŸG)á }7lÿ«þ=‚uUFižçé}ÇðÖìsÜÉýLИ¾t ÑÃ8Ç~ü™`¿,å<Ñ7•x©¯¨ï×?¯ã¹Æšõxl|=?Ï?¾=Wq¾â_û×)cþ|2®÷/ú¢Ž¾.`þñøšÍCüZå—_—^}ÃKæýUKÕ¡Rþþ&ïc9„+óÎYúïXü=t–~6 áèõºTpBæ7¼7Ø?YJ_4ú2ν¯Ó-©nî÷bž4&ü̬ºj”þv8¬¯¯ÕBÖû ü^¶w«O‡™Â!aùŸçzïS~ŸeÉc©>{ÕÅû1¨2??áoÕpŒGÚ»í×Fº±hÌßÓþœHõyïcöãªðzÚûƒ°üTùB…¦|×uüü2µ¿Êßcփ߃/Ä÷V<8ªòKéßq2&ý ›…ᯒGˆjè{&žîÕþ_î®ú¨ìXÏ]bîw`Ûç]óý)×±èøã¾1ÎÝR\÷J$g Š”§‘z’)ãUµì›¾‡w†×­âìïTOæsE5,úÌ /u\™·ŠúÞe§e½îééÚ„}Nü袹>ÿs¯f`Þñ­¨ñ¯¥ßDÖ™·ƒü½º é\¤Ù§íù¾®ÖqqQûX%m¨ýÕäLJå+RŽÿ<=Ü–Í¿‰k¨wyûXIÞ¯ÍTËNå+Ž2¬ÏŠäÿ§ü}ˆ9Ï×°›8ôÍ£ÿ—¶¬OÍïåçI¼FÆ[Ç1ñ¹xxS¥+¢…Šéáüq&½¨ƒ…œ7ü,§xªQï?®Þ­u¼˜þª2`spÜ$ëºO ÿFò„¶ö œÇÞÙà<£ÂeØòQÖó>0¯Ó Gz¾ÀHü—Ä÷Ø øQzùªbœ÷õÌúXþqÛ‹êóþ*æYŸuû¼éšì‹ÕÐbá«„þ ºÝAû†…ß`ÃyZ¯S&ø=õ~Ì¿°éɤð˺/2ãá-qJ»ÅÿQ 3²)ß/êô®õœ½µ®^?“HþÛQýÿDp]Ñ;¼©:JÏ!]sÖõËð}D54áŸw?¯×EýÕi¿Ä¦Ò‰äãšM=¬€ÔãÇÚèõìÃÆu3+™ñ+¹Sôý¨f²ëzXŸ ¨†Êù3UÞ;îùÈ&þFßÁø·üŒ-÷Þ ‰'=—}›éŠS|=‹N 4TÉß>—WºÙòbŠwv¾ªÿ+œ›œÿ(Æuà „3Æm 擪Ÿ‡¢ºÚÊç5Jéñ¡2ïs×Z‚ëëXá—±¿VðçêõN`žŽGãI4JOw"ÌÔ>‹Ñ-õú÷íÄÓ»®‚ÿäøÒûâòðûÏ\á›mÇ)][¿ä°xWâÁÑ#™º±4©Û•ióN ×§‚O q´sWêu÷_Ld?•ùK츗âDÑ4L7ÓÖWBF¿îôÞâêx|ߤú1DÕk÷.d&^ 3ôˆ—T¦ð_¡×é/ÎSy½¾hÿ9øË`¼û¶[‚ó[:Ò>Õî)ã÷5ßãŸÇ}U•VÔóýûk÷ž›óÐqý=>êxŸjÿh–™ü zQ¾Håë¼OÒ㯪¼ð ~3(?÷û EBüßBn<é”óF³Ž™E·ÅþÀ|uö²ãù½®y½ÐûmÌS<ž§—”Éùjù“7”†MËWÝ,/D8ÑùÉ~_‘®/#qÚV7x½­`ÉK—¸þ#ô³²9_‹ƒïèëÙi=~“ýQ05x^âñù”¿®Ç8Ãr—w…»^7óÕ_r˯Eµ°|räñ_è# ¾zÑâc ìKûu–è;2zn@v0:$¿Ž;®ºˆe]nDû²8Näþ°(âþ™/¿ïj¹ö¨^gúöÊâ‘ôoû€âãBéÕó¥©}Ðù>j‹:Ómߤ}î‘k\üW]ŠË…#’†Yý£ñOBt •…á•zÊøC¿ì¯ˆ×²ä‹­ã¯ø•¾žVv;?E—r! U»ÆeÖqϧ·Æõkþ1tœ3é­Ï¸©­kõŸ¿¬†Yn:xÒnTéÓ`Ô_u¾byǺ|LܲwJ÷;ðÔšà|ﯘ¢çßDï+‡Š!üú"òÿŠ¯ÑŒâ§‰¯$â/ fº#èæÇÿßK4Ÿ·•÷£º­%ÿ˜´¡ÕùñTÙ!Iê+#+ZŠ2™õ«ÑÕŒg@ádø)ã–`Þé?‚óø(bñƒ eÆŸ÷ÇW¼>Çõ×–¢<Ìú¿ÒO”ù8ÿ÷1ç/F¿\G7É)/¢t½¤¾WŠ~ã+1÷àeÁ¨xåâÍÔ¾§#®ÖëöƒXßaÛ`Þ‡oÐÎ ë·–rþÜ;tþy]=ŽPù<|§î/¢Y¾ô‰Ë¸R »*õ»°é¶dã?õþf¸Ï•Ês‡§òÌ 2[M×PCà–¿³ù¹/³?ýõ“É#OÌsí[A_¿Æžb5å‡JH]‰ü‰Û’6,®œl~Mà›1ÏM·ƒwóâd6f¶ø%¿Îz˜a¼Å¤ «½ï§ëJÝÎ0]…¨æ=Ê~Ý¿…®AÕ+‹/œ”¡hfûªY¯[‡ýÆÅiº‹)ÇUsË«Hœ›+ÏUß8iÊ¿÷> ¾oTaý‰Ù}£áÞMï¢ðÇ®ýmüóBtfüãyÞÖóOãúqÝñøLª E¾ˆ¼×¤ 1+ÀR!S抋÷?MûGº<)Ùÿ@ú=žè~ïú~¤ô=ÐDÏ{Zô³mýŽý¿÷¿:ÖúÚ¬»4ba¤}󮢸¥p¼u ‡^É(~Aé$fjüËm¸~Å å£Õ³œÇ/aÞï“®—G5™OL·Ÿþ§:nÊy…¯0ÔÕ¿*¤.2 Kϳu‹0)ZÞ[é]¹ï>®y½õõ }† Õ×Ñ@Ä÷eE¾2/+˜ßÞôòÄ-®}w3v}‹ßé}–!žeƒà÷ÁÖ'#S†ëÿAuÖ\‹Nio3îGöc½Î£/wÂ+K–çŽÍ÷Gzß/&©ëgÚ$Ï#+'²«þþÿCð"QçC\CÉüY§¼ã¯ÅÓ£PúN)º˜w¼O:¨‚_ìK6ߢô}]w݇SΛ¸5ž^5½¸þJ3ÔaTš~¡´”þÝmXiæUE¬7†¦ ',εž?ô'1§µ¹>_›`œLCýÿÖ~^åÝêZ’oåŸßDè"œÒãMå×I¿}oI+Ÿ† GýHÙ>F%溔2Žk·™/¹é9mLz}ãNèùø‹ñü`…+—x×üaèý‚tÕ¢®—a¦údÙÿ.ê¼_ _p•ü6™?GÉ`?ý£õ÷È/Cÿ³F«[ÇOéyÛttlï§'>úÇŒÖÓÐO×ÑP}]ÏOéÿ\U_ge>1íûílÑe®kÑËn þ¯ú¶IêŽòÇÐù7ÜUÄ|¶?þã«ûGèõþ~ýûÉâ÷FøIõgNÊÒåû¡¨Ðû,óvXúoݱäOSt"®ÕuÉ’ÂÓ_.˯øÝ®Ï(Žw>®¯¿ßU•}À’6¬\žV~Oâ+Ò¾Ÿõˆ÷»pëçT^]HèÒñ—=×›õª…nZºuõ¸†~Áº¤Þg]ÑëO^ï¹wÑ1nsÄA«>0®:œQõï¤áÐ×ó—§\Kÿ>£ê^á*‡pßìhzEðÃ,cyûý¿îƒ4ê†DòÖaºùÎãØôÌ—Ï6ç…ÎXús'„{JZ¿ÖÕ°®PZ÷™Ácbå3Ã#wí9áñ|õ¯Ñ³¤ÎSH(_“®Ùú»Øp4(‘Þõ°áÓŒú¨Âº&5ãá#°|⥠ÒÖ§=i“:8X}W2ýŸBêQªOªü=îºYÿI³ß†¥wS?ˆrŒ[*Ïú9oëë·Ôÿôñ‘¦Oîú_½ušº=)ãçqÚ‡¼ã—‡ãjX׋ðÚ²O3ZO”øÁ0ÜvL4>ÅÖ«òå=FYŽ“–tòû1rˆ^× Éƒ'ma:ˆ¶uÀæE¾~ļŠ1¯zˆÎ£äŒû…›îsš8å°|*p|õÜåá ø÷Q–û„èv£œ#/wBâŸdYü…S™ÉWÚtàS9nÀí¿ÓëÅóò’ñç?gÞ5Ïo<Ñ' ¥Ð.&O÷íüÅO…™ 7¦›y¥XÒøå¨zNþy?Ì;{yôŠPÝÒ7D¬÷˜S1£z/W Ó{=šˆ¥ÌõP¡¿„[Ž´® ¤¾¢ãåÅó¡OY‹îDþÄW¸®fp}~:ëu‹¼ʆôe´G×÷îÎ|³kIŸsƒû';ßvš|¯:©÷©.3jÆëëÈ:ÿ=>½xï;ßÿRÄY_UKJ?:ª¡½ÀáÚôóOZpêlj¼æRý 7|–Ñ| ®É ¡þSxèsŠGbꥌ×~¾q ‚Èûpœ¥ðˆ>žë®[Ïî£<ÒãÝt=×ì·$Ýs4þÅÖ}Á<à§ï&½°oÖ?%¯µïpÔþ˜QÍ•'µÏ—uœÏÜxŸjÞFÅ_ZûHGìËäºùÇ;âqèiÒÉ8KlÛO_è¬{¯qž£=ñE1;¸Ÿ «až.ô€ª½Ù­Ý#ʼn*¯kó'$ž.jßx×ü­ ƒuÜNµ„qç¢ï|Rù•GPÿÇÈ,úykMòKcòÙUÿtïϯwþè²`ÂûÁþúMµHo-·‚ÛÞ3ó·WœJFohDÿHóã'\x’ÿ«†IOkówÍ3ã–X·Ã;veèY _yÇ>kɬwÞÜGµkÅ|ùüÞYËþtçǤw3ë¶XõP×ú-Š›ý ¹Þûǯíä‡aeK=?ðõ>4žw¯ß9íøVVÞ¥ûQúµ“‰¼¯,Þ¼²”¾¶Ë£õsò޳Ž_áôx’™z>ª¾ûü†ü~Þø^¬qd_g¥[“)|»4Ô0×'>Ó×÷û®}‘¿øúü“Ä5dó.d”´¯W1Íów°ZïüÑu•fâ®Û¼B_ƒ…ÅI²]Ê8ûŸ‰·?:ÆÙVÙXÿ‚[.ÍìjÂOå~&}j¿o}X]}Ë3/up4+© ç‰˜g8êz$Ï:¨šì{/qÛ(Ïïâßê<ÝÖ:OQåIBûôV1×GÕz‡Þ­t<öq~Þ»”'̰¾ ¿îG䵦‹W†%íÌþäì‰ÄÃzæÈâ|éׯÃ16à÷*"O-ëÚ×é~Y)¾Ï6–|¼Å.°ÿ&ûnaHpý#íë©:ƒÐÅÁ#õ»Âð|(Ãïq…+COâY\ûÙcîUnxXÇ:–Ï®ÿU¤º‰÷¦¸ÿÓÑê.RYá%pà}?œÿY´ü^#±†ÄXžÎ30¯»ÜçÌû<.(L6ª©÷Qâ’•æ—%ÅEhõ4²ð“?¸²ú\nýº0ÃŽ#ÕÕ°òÁ Þ»aÎ9ÝÏßsKFüc¾£X0Nx\²xMï„Ï(ú¦ÊúXÊ}:DWŠŠéÝ·Oõóǽ9pMe2ƒóV¼Ó”ß;Æ/Þûúq¸{óõž&¥_k[Ÿ14Dg2ïj¨—?8T1Ϥ9n h}1ÂÙä½Gó¾Á«ï_/ºyx°üèlÂ;Ìú¸ûÚßß¹üʼn£b¼¼¿÷–À©…èÿK|‘Ò öÎGÛOñØw4]Ñtyu®–_<&Ì΢yÓ"žßs¹y¶hœYü5úåE;¾÷alÄ?÷ÔU'ÃOJd_Êïu;fŒ£â¸þs^p| q7®|o›a“[\›) ëÛ˜ñëŸÌ§÷¸~¼z¬wTÏ_â¶5f¾â…^éõÉ_«Ió “óß ÍÖ^®IOï ÓìÓœ[Ñœ§ý®lúÀaÖŸ‹¯ÏW\ô{Vÿ%ñ9¾gè%\(Ç)˜ñmçÑj(õkºãOù•—Çü»Ýêp× ‰–?È¡ï742ëó[ÖgÜÑÁ¬§»õí;çhóÓuýÂê½f]HG~0nžo8X›ø7ÓuÞ>òæR~¯"½w’¯¯ê-r>c`[³þEGæù´aÜîà£a·n¾ßæ!ú Çãá!ü~aãŸÍH¾]õǪ3ÒïäËjÆ»37Ç=بãq÷édt—¢â÷Côܾ=ÝûòÇ;i®££Ï÷«Òäõ¼/å·aøÏ‚û“–|ÅZ!y²yO$}‹ùjxhBžÓq•ÒËÇØøÞXÿÚ‰—,°ˤYù–ûxEã±`ÏJê â¨ké_'&ÿÍûmpÁ–—¸%串e©³cÅ2ªf¶ûu5lšäíD6›~QèyÜçYêXxOXowâT½OƒŠ7D Oùß‹Á~¦£qÂŽ+“žÚ?÷˜óYŽýˆ_qWï<ú=çÇÃüH™wOÚpÇŠ|y?QèòêŠc¹ßi~™Úglxg”æ|F)óù(ÂïÕ)·÷Wò üߟ ž·aû 6/#=¨!¤ŒÍeò÷…ÁÉò>óÛP+3zFa}ŒQ4Ú>‚b™é§)MåKÑ"C8ûÂR·þùmx`›N±„¾ è•7KºŸ’«aI%§ýÑæç£Pðû˜>¤.r¥˜wÒQ‡#DoßúƒS?Ðt ³6Dëûþ‹®›%>B›>ƼHRýØ’65_Q>$_VÂòBôñØ}WÎ;S&û-¢*ë¿$ÜWñrY\Ü‚¾ˆãö©r¾^>á©1¢[¾òyÂô=\ O¼å„¿Á€`À0sÕ µõÀíKƒùÝʨ¿ÖÇÐfªèSNø“ƒÍß#Їà|,þ:zý9Ò:ãÚÿ•󩯲ežøùŽw,¸_©‹PÇ-_€±3u]¶˜ù2Wû²÷Gs5”7ç¥lúâ˜{ÚMOídRw(®_<™ï=,ï¯øGé^'¿ %/O|f³¤û¾E5l˜tYõ*l}½CÏs'å-ýŸRŽÏ!þµÜ·¬Ç÷$–ì“í½š^üêeË.?IV/ $ï•rü©hû 8>·Rä÷H^JÔýuÒÔõ9÷LËxoïv³þu"òo0kM°^Ø·Yÿ!¡õ·>’È|÷Þ°Ôõw}®ãXŒÐÏ˰.Ô•ftÛÑÏær›«Ž Þ”ÿÏ7ž®^$jð~ì˜×ÆM'£õ­^}s<ç¡àþôªYÔqSƱá"%~òHz×AUÁߊØw%Äý¸öIç>gÞyÇ>ìÇ8Þ/Ê:{G\ïÐ2žÒçéo˜îu”aê¯ißKH'ôzýt?Dåwðøªç’¨‹`E7㺋b™áo{Ÿñ÷eÑù°ž'úŒÅ­W¢×ês²®IÜ2Jæ¯nnT ë{œøõŽ&Ûg"¿,)}Æ0=kÌ® çÇ,øçëõ6×iÃòFè<ëKù=)Ãò¯¹ñl³âñ¿½D}1ïOùÓÿ÷cÇÖâÄsùy´}Fø}Oúa:àXÓȬ[w1Úºìã´ž3¬.†[)?:dt4~ÒëæúŸZ¯\õŸqë»Ô'yÈ-Áù}K¾ÍûîëŽg$ÿŒ®ëó%žFw~n¯Dì%ò•ØþcÂ?çéK>Ú~/ÙüvŽ…9ï^QàßRÞVñÛpýÆHÏ×ûBèÕ~4Qÿ%©~p—Û¼Ñüΰ¸ òï“”ÅÕ[Anéhøß¨õbÖ݉š§ÃÒÝæxkÈ»Áa R´Ï…Þë ‘/ýJ¤Éï÷ÏÖò a}‹­ãŠü5nž|Yð¼ÞÓ éB^Ìl_ôtq)8ˆó‚EôzÄÙÇÅÍD5ä¾–Vuq#¹O>çæÃǹÆáª_{θß{o³>Xuñ\oz;÷ö)çw†äßø=Sy8 ²èç±?a›˜S=žþV.Ê;³ŸH¶#®"Í>ÒþsÛ¾'Þ ¥‚ãµ+¿h«3¢n´ú#†<ü÷þ[ÆÃÊ·H/ö¿ëϺôsþ§”× ùž…¾þ©4¬O~Ç•(+tBxí)ºÖuÅ-/kû½ÒgÆœ—´ã¼Ï£ñ|žÌùƤøƒùeÈû3Õ=Ž»åO‘÷hFqSaõ-©êã +¤‡wVõ¦¸ç[Ç áɆéG*C¿™ó+RÏqÔÞôö#É÷úüÊÞ? sK$’µéò¢-ëµíέûÍeÍ|îo"qØÖû±ùQÛéëìºo©Žeé¾³ùïu‰ ,³†a[®¨¾(I™ÍrÅkF¾^D]¯ü¶¤qÍ®†ýwi×õã³Ï2ÿ«ÿ* ¸Úi=ÇCµ‡šâ)Ôt䬨Mþâ£{È¿èHóË@ý!ºomÌû;v#8_»¿©O]@ñÃj8TÕo5ØÏóuºî5¢¥¥?î(£÷+Âw;mÆoâæÇ®è~¿æfÞi¡?ÿX‘ûó³nà}’¿xeuòò\×ÒçFšw8Aé•#;=ýt-j?aWÃCÔ(UD̯?ÐçR]zÌ+”—`ýzïÝhñ·+ÿYŽ÷ûì±—#^Rx\çãw?@ó¦Ô•­s’.õ?ãè~'®wë£çµð- éÏ-l¡*ÏOQï Ó_Béˆ}›ÎྱŽóºiH_ÏGëUF䉠‘¨C”p¬sä=“Ñú—«y'¸^ÙO >(¬V¦ …#Ö‹çŒúRå1½w¸ÉøÎ ®ƒX°aD<œ-ªYô¦?3ÏKï\pýeóÇ´ÕÏ0èË­KªÌ•7™®IÜc~[Xûy éA2¯DâÔQ#DÇuz^º—¾¯÷Ó«›(ÃÁ/(̼HTЧ—¨ôŽQ;"þªßfs™q¯H~‡ÔÓÄúìŒúÞ›Ž}©‹úc?+ëx…,úQz™û%_&þ ®Í£Ÿ­#ò—ÄóQü7ÿÿÅÉWõT3ûûxð¡K`ÔÍL]W‘߉]û(î›22Qœ²._kÓCÎ×ÎöSÆËÐü³á–ýyÑ1Y£ÌxTëñ¥’¹>*eÿ‚Òbßúo’·7²Äû[:æ8›n‰„'@‡º®á{ŽéqXô“Р½7ÇÌã«øÅv}ìzˌߞ[K#åçS)xÿÃܶfÞêÉh~9F,4ëÈ ¾²ª aÆ7¾Ê`Šs¼3Œ›»(tSCô¾RõR߯ çÏsÑ—ÚÖïÉzÝ—,¸Ž-o»á õg½c–ëômBzž…-x™ŽŒ£ìP2#û¨úÞÕOt¹×­þgÑùr5™¸RÌ; Þ­îO/•§é_¿òåÁ“$mÞKäˆÛº‡ñÁyNõþª|?zƒþÏ늺>Z‰¸údðßÞbýzÝq=I3ÿ.ùí™6©…I/iï™M¯ÊU× YBŸYÅ_ó3«ƒ€"_N] +Í$N$ê>^`v%²¾º¨Oë&šý<ôýºÖÉ×~qJ¯1å>ŠQü®t-òë~°¿´[?Ÿ!Ãu®Â1u‡O ¥£åù°ý×WdøËj®õæ”ó,úJèÙ5tž–’®7 ;ê‰÷âü û³ ­tqÃt·½÷8Ÿ êQó™2Ù§+íñ"öc¹ÒÌÖ×܆sˆjÞ{bÜ,Ç>"ÿçÊ#õ¯céêgÉ«Mµù±ß#=’[äË~ã½Åù»Jý<¢j\ž÷M2sݨzŒ¡ãñûãsÔù·c_£O3ƒÈoKªoˆwœóåCt\ûŸ=øFà<ðÎëß§ÍoNÊluÕÄÆÿÀ¼Î£DA^áJ0 æuä³/×þdíëÂߌª£üý+e]Tù _§Xô«C‘ຉwÂíó{s]Ï‘§u¹ •CðDŽûcÒ&õzÂú̆õ‘H9Þ¢kí|>÷ÛSú{Þédö©kîÿþ _(­n£êØ*õÇ)ÂÃii^×dŸÿ÷ü^¥Ûw Ý*f'Qïýê&šOÄòœüí÷ÀëUTž-ú}Õ,Æ1°~jºå Âô¯P&3z$I›zÏýÿŸË캎R¢¯Oš8…¤Lá_ps4=áÄúy[êè±Ç³Ô©Q6½|’^®+•Ãû(øýUº‰÷ ŽØï')CKÿ­³Œo/ïûA÷ëãé’K>BB:6¿ÝÍ}c¬ã\Œ—ÇE5s^%ƒ?ŸwÂ’Çg¼öÑý·¿›Ç³á餮¢íü¨u ïDÄã#ꇢ¦ž×W~js¤áxÁ'sŒ'uPÜ †Ù?Òër‡ç~¥û8†é\U WÏHÏØy¨ž?c¼§äÍ!Gï{›n= ÕYç¼ðåÑ×E]}~¨¾6ò8©_ïŸ_ú ï3'ô˜Q;3z >^]áq߇­ïèþsBz±ïÓÒ?)ß®ŸPŸ`åïÙxÞIý{¶å“•¡šo»(8O¤xŠ–~†*f½®êWT߼ޠufæ ê™ã8¹2â­/›yÇ\2MdŽÐ¿ Á GÕ]J7ÿçj¨—é+ij0=tÏÃfqyÔþõþ Ï®…õëFåÌø‹¨”PÜøqþÔ›ò«_rÊuÏ_^=¡¨†v:>#ûeFïÚ‡àïèg„éÚòý)Ç%ToÇ!¸Ý÷ÛBo1$Of'¤OhR†Nn×ñÎÇÓ[IéÑTÇUFÕ;HßG§ôhO¯£t~ —¶¦F°CB¼&ë}v[ÇQÌòûfO×™#æû®0.n{úRÞ.ËQ?½t>í?ÞtƯû×Í2ì—Dõ³âê˜ßû¤úâ(܈«ŽB ßùHðñ(“?y!äèõ°x9åül=ï­ž;Ze6?$u²ðàþhõƒß0žAÄéaó_ê‚ÛðßRO9ª%ÕØZoþfÒº4¡÷õÛ˜º«3ú’þœc?ΤLêᮆ!}-¿Ï°þˆw!3y>[=*å¸tõ *±žA}Æï8^£ñö£ö‘Tq:$›'C«˜~ãâ…”gnꦿƒU1×=;6ç/-:ƨ™áù¢7y<ÑgÛw&ê`ÒR³îç'I廯케«¿(õ9”~6DìóÐ¥HZþ›«NCÊu[æÑùog&nÆŠ¦ùâï%¥ì|=Ç>œQ +ªgu@!ƆôÇÄš]j´å½Çõß{ÿiÖ*“Þ×o3Ž+ë¹¶|ž|Jÿ‡‡âék>zkà~!õUqè;ÁýCOdÿÁøýé¡™Ò¿F}˾yð°YLè½Ù¾/âpïXñEÔü6ЉïgBC걞«ò¤¨Ìý–u Ð>&Îk[Ñ`î=ߢ÷oû3:¢ËÄDÖ+‰guµ°ºrЧ÷à‘ÿÑó–í.O?\›~_\¢é9ãÐÞ‹†ó‘ú7è‘ÌCfüÊçOý‡÷ŪӨ|·Â-XÇwÄ㥜·áG:ßㆉÆ|êñúÑ=Ç©>cã›ãÞwõx¾ÃËù’wEYÆ JOoã±aÄÝZü€¢ ëWaµrÑÞg…'Æõ7›ñÀžÀom¼.Θ“hÞ:,?«ö3›.ÖÏI´îÆgQ¸û¨¼0ÿüB¬Wié§ê`½!K^Ú;«ïÓ˜Ò–tc+ <–#ŸÐ?žóY(mÞâ΃n|Ç|UT<­¿^V²øƒu,¸¯rù«k$ëÀ¸õ÷Ázì!8 É Äí?…c õƒú_í‡D›Oùpa†^Ô7 WW0Î7TrÔ»\UZóËl:z(syêƒV`V`ÒâæS ¬À®$ó>KSÁ/X`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`é™÷Á—Sç0nÿIe¨˜ÙþI¸öq÷qÝ5\.¶½â†ƒ½k.áiK‹þ¿Èç~¯W%««ðAª_}Rã&mÞEÖ9Xý|$>E˜^ fïÕùßÅ,º©®}ÑJÑ÷“.ŸÙ;bÆgKÿº?Ürá’N’£î”·§Ê®‰3¿°éo‰¼ÇqõÖb_ï ÷kú¶ïÛû<Ú:Bñt«dŸ¡¤ åõûQÿOWEZÒ}ư¡[°^r§üÑÇ´ñÉ0Ô<ÿÓÝ×Ãúø¢;óÜj1_sñ·I¿bå/‰ÏQÙ:ÿ9]Œ^ã'aã†h|%Õ·9DÏUõÎþzyûÀ¡õÐXº˜Ê¼ÏûJ„ða­ç]ÅüÁ“ù»»Zº}ð1¥¯ÝY‹ÞDûUf]òQ}ÝöYÕ7ùúaÄ+Ñ&­u ]‚yÛénýV¤÷Ã;Íz!+³"]GÍc¥S¤tïüûØõéV¬§>m˜A_ îÚ@üÅ\r\Q•ùŸ¥¸Q®èÏ÷è]4=/¶N4œ¼ÔoŠj²}¦®“i“º°(Ÿž—Ô¯Ío“ó0ôø÷¿\¼GÞžž?báÙª8+Ý|€2Ô`¿4M]Tìgö׿·¼,ýmâN¯ŸÐŽây¯0‘×ï?êë'º°ßöoÖS˜w4QZðþñ@uÒý9#ò2Kÿü{¨ïpî“ñЩôtQ/Ð:¦ƒ¢B×õm·}»éz·7 \wÂxêQÍÖ§Úÿ{B}¼w¸ô¤?Žbu¡Æõ¥o¡t‘£ë£÷©¾`‰ûrÜ®‡ÁûxRºCÞy¡kq™ú;É}Ü–ÏÊ/C݈zI&³ùã…èŸH=MŒh­Å9hÈ:e;J’~ÉM¿2ë¦öjø9mq!~ôÿ Lÿ¨â•hŸ.yýÚ*. =¯õ;Úþ…•tK®õZÙ7Ã;)òl_›YúozÇÉßUõ,>pD}=K\§sëOi_\t‹æ©þ³Øu·¶î$­Ÿ´…é*ÃÚ·âõéñ%²Ì~“úž£ŽïÛóóÿ1£~ÚGÓoUµfÊuë¦Wç°ŽÛâ˜[ÿ¸|®ÿ`õ뤛wÛíç =bö»”ÿÚÀís„™òãT|†ÂÁ~¼eü»­1^§Çuå"Ö8¢ö#ÌëãwÐþtFô’ÑJßgÂúŒ¸ÖWQ2ž®‘ÒéŽz^R†¦‡¢JH=ºbÈ8E“í×u½AÉàü¶5ÖÇÿÔ-‡2–¾ìUôïÍ;i~~(Äïá=Ÿj럊Ë®ÕP>™uVéåÛô6CÏçuý¢Í ×÷È5o:αx~±-ŒAÜŸàú×Å¢2׃-­¯¿ûÆ'â×£a´þ0Îã6~Uƒhºú:_ÏÿZÞ[ïóÌÜÒ†…åµûô¾°¬/ƒþ‘h?¢¤úÜXXX}Í;óåÂ?XXú†²_Žøá«f¨Çcè ›/z€pѪê}ÕJ¤—ï@eǺUiL(_k3k\X"Ùzw\ÃÒêf¼Âö”§hqVï{~ñÊŒ?3…ãBsëróul†Ú!yð çùBšu°Ö4?¼cqG°Œ{ßã:>HõÓC/”ÂÁ¹Ö«C¯wèëT‚yk»¿¯ç½úRÿ"Ù‡Ôÿû܃Nùïgæº$²Îiß÷õï‹y²^™}Ï;Æxiæ£âkMò´¿;ò•¡¾¹Nb»Ôˆ÷ý*ü² à}Äü§Ç‚ûH£QpßÕ¨øb¬ø³¶n„á—‘•™zëå6ŒŒVRó ů§$ÿ~]½xãwÿz´xT¿õôx‘—Û’î›™) ã_)†©­âúĬJÿ·év`ï:³Ÿ6j¼y=="Ž{`ÂeÁù&eÞ KŸMG>? Ö³ï{ŸYø³*Ÿ'qŸÅAä?(<’÷v2uuߺûׄ¯h¡¯k¨Ä:ï¹áº? E2«w×P5®"Œ—ŸrÂþà!:7%~á9Æÿ Ð÷57û/(Ê8ÈþSÔãÇñnªü¹Ÿø;á~‚7Ù_Áéú¸{‘ÑÏB³ày?`ã·…õõþEþ¹wÒì—¹ÞOnoË ßcüèDü…ŸD¯ûÝ3m*ÏdÃé"[Clß3Ö¦u¾°›ß‚ëhSxkî§÷ë¾ãÇ_*Aë¿Ìy#ÛïS޳ðómø[Ï÷VB¸#ûÂé7pŸLï\<½¨úhü=7ÝŒˆ}­óÛ¢êêdÊP4Çw ñS¼O8ÏRÜQLøQj>{§ÜæI˜Ž‚zÂÆIÚP=Ï'ª¥Û·3Ó– “©ÿbt°>€÷ª%WH÷¼ciêXê¡çYâ¦Lj¸é¢‚ÛçÁÄãM®y%_ë+(›O:oE‚×wïtĸ§j0î_å'mú7*¯æýÁ³ ‰¬×É£ò>wû¼#òX—2)=\ìÜ’h½Êöœ‘ûñVZóïCÇ?2OΛ¿ÿ0Ã=mâÅob¿GcÊÓcE5â1W×÷q,ÿ9_s׉è)xo&›¿´ézéþ¹w:Ú¸ÈÎãŸÁu ÿøޑͼßï¿ï]Öú7JÄ[—RÆéñgÒ½¨“O`ìlòWþÿõÒä7¿<ºÈ¨.x»–:¦´°ú<ÐŽêšöã±ü—5¾ñyÁE-ï§Ð_óû”n/V7ˆµ¢Jfñxìw—Ö5TOï:˜uB›¯ê¹ \†ò™b=Æ¡ÞÆõÆûXÔýëe7*÷G×ímçñnÿŽæï$U·ûª™Mïÿrî¬M~Ò=/šóú‡n»ôS­C2îãºiÂüC[\œrœ¥î/×kËì}¸:ý9ð=ŽÛ·#®Î[äëü=C¼íwR]~ÑËWt ¿Í»Èúb«Î˜ë¼3?N4~Æ ã:>ò,×·8_‹{‹%ª£èjJ#òyÿH&¿ˆÉ£ƒëÛŽ¸‘KÏÂâܨ†ûë]8Eï=ú‰šf?ÏûÔ\ÀÄ<3cë#Tê¯Ã/á Šñû;m+é;s¾·“?³¯«aªøÿײiz Sèä?àÀƒóc%Dý|ê¡du*§»é­£ã¾ ±ôãàøXùQþÿÃô™eÜR1D¿òÖ;2ºn‡ù¨`Ágì«çÅ>Ï,¿Gá×ýë?ù§šŸ¸¥áßß0¿è_*ÐÏÂàò‘Ö'‰ßOÁTwéòš÷ã!Ŭg,3ãB#3íé 3þ³³Òoã-óµ™6¬ü}¬õ 7õæK”Šw?éöÅKÚl:^ÞIK•×]Œ=ìß½¼.ajëKaû˺N:×yÑÄ¢ÏüŽ¥î/ÖŒŠ§ß‡ñ»(¾ï¡÷=B%Ɖ=ã–Tü7«î“E/2å¸Z\`QGêÕßc< X'oéAùQÕ·$Í|jD›×J?4 ÷œr^̺8zÜø¼\ñŽXT‰ð¨7µ¦uŽûß |4|0š¢=otãúL6}_²ÏÆÒ°ç§‰¬}G¬q°¸)Å·!øô6ë-‡é*\³÷§à÷ -ëƒkì8ï¿Å-º•Õ,8‡¥?uÞýÕÞ3×%±óW”'LˆWŒÕMâõÿP¼ËƒÒz1¢ÍÇÞEÌ|…¨}¢ÂûJC G]ÆâÁy°¾[)~gÌü n~ŸøÄ2ß:öªkµL¦ÎšÒÄÒïÖ¿þµÑÖat¦u¹/Gñü¬.¯ê<ä:Î_ñ0„t_QWèwÑûÊþŠWzW‹qïÝNùÕMôúéÚ¥:/´¬X§‡éßë—UGÏ;yyúոꊣý4§z{é8ïÇ7ó¸¬x ¨ý“à -_5ú-I÷¹ðLjgŒj˜xÀ¸¯¨ýÉz÷qF•dæm®,åúÕ ô€þ/˜kGW\€kÜ…õ«ÍïùÙ4ã¶Ùï'ãoDÄAÄÍ{]nóqy£žŽ‡Nz×o0Î/Sëö•nxhåÞ >Nñ°P‘ù\½¿Íoí“'ð‘[ü‚ÖÁzÕ€Ê"N´ôQ°^¯eˆnŒÌï?à„—Àmý˜/—~ Üê(­NUßÖo¢õ7Á=9Áúsõ¢áïÂô÷Ñ#ÏiÏ=†ÿŸ\O¤¡÷1ZÕÊÜÿüàú{˜~5]‹º(C.å)%]ýµÐë=~ŽûÕ½cÖ9´‘êæs©®‚!õÏG?1çËî=HøÞ±\‡ÿú­¿=F žø9áE— Ðù;ßúôó>©×ƒgÓÖ<|îR"wÓÏõ‚¾žŽ¾ŠòÍ8Ï^…ñG¬'õ>0ð1úûÌ3”7î–Çϯ…þ9îEù‡Õýèÿ÷ÿ”æ/·%ÁÖ7©oó:7†â\ÕGcÕý‘ûuÊWßsŽöW‘·ÂíÝt¾äƒŸW¸tüŒ”=üwã~†¯}LñôÃ].Ý7¾]î¨04¡ŸËkÑõïkDÏã¾(N[Õ—¾§ï.rI—ˆõ0ðôš—þ?e0ùC!y«ü6üðù\ú\·¼Cõ«Ã7Ðó¿ÿޛꟸ«¶Î ñ¾ïó~äÿ¼½ wß]ºŸÒá¹­Íû~;é9­|„~ç8z゚UöÒßw=«Ï×ïÞ~©Ï&ö>Düй÷Ð<½ë8Í“o×çãyÿIJ¼Kÿb˜%îàx»ZHÞTöÛëð;‘‡ÔѼ/8_Ó««þ^>ñ}žÉç3“O¾q¯7´éµDöƒÄt/ou[õüäh¸öU—†Üǧï—mt\>–ëþ6F·¤õ/MÞNäûœq•¾_s]T ÎócÎáàþfû²Íý~³’ÅÑùãî^HûÁïêëCíÿÛ|Î_œ*†¬cÍþŠª7„Õ+ÃLö“ ½ßK_QøÙäô|ØŸYU:-œ¶ÂoZÿþàç?¥÷ªêÆcÏEÓSS:Co»ùá(bÑUúÀ絡¼‘ÄëI_æ[¼wYwìƱÿÕ-ßúyfö%¿¥ffÖÑÐë|-£ë)ŠRýiY³.û~ïʈ/#âýQJè÷U‰¶îaêï/Ÿ¼Hý¨eþö{k¸ã³`=¿Ê!¸œ§ÿg¼q]u=ì=Jñäúû—oÕ¼÷ܾÈü^æÇª|YTýÎÐññGè¨ë=£½9O‡;~“ÑõÒUgžÈc„Ä}Î×WýÅ÷}LùŽñp$¡×‰É¯uÖA}AU½@áhñõσó]](U÷ëñÖX¿ŸÕ\‡›°p }>ùy ™¿sšß¸ãí`Ý+$Õ¼s¢Þ²ïÊ£äLüRõíÂúù4?¦MпÿåÈ_¾©—ñ<‰?F•h:;(Íïgµx¸ ¬iM?û¢ï#ÌÏÂrÎûí¸×¸ÎIeÑO®›xÌ,Å¿wÍ~«ê¯ã½,ô±gš ªŸˆÜ”ùiÅ(Çú¸-,~¾¥ÿJ„äßBp>6oÕG>쾓♦Œ+x'XCLÔõ£_‰åçà`Í´ü#uÿ6}g¬Ìˈ~:f|WÇ-Æä­cøÖÀç¬úŒ ªÐw²à$¥nŽÿû„õqQ5q¨c~¾Þ‡¬Ÿ¦ë—GÕiL¹Ïý9Úu¢ââRÆ«b>•X×gV›hñèð˜ºý9Ï=dí?%õû²éBæ7+·½òWº¾ˆÐÿ‰¯¡ ŸÇõb©‹íX·“úµþù?ŠÙI¼QûUÉý9ÌphßeÁwcüŸÜðÏ+Ïçk¿ ¬oÖ—áý7n]Ê¿|š÷WVè‰%„·Sý[pï”ç|ï Çõ:¢?U¯ Å,ïÇwhW2p}“z÷ù­cŽÚéé›Å­Ó(¾vÜëZÇ=LÏ]ù9ÞGü  µ3ã7cæéúŸXê\!ú )Ç+^©êcÂû)êÏ_é{eêùZïï¨ü?=o,jh°ô•/@›Òª·É:Qäó3Ôï »V^š¶xuÅúóoKßÛz<ï.êëêåÿöUÇqÛtùÂú ©ý ßSöòÔ]PÙ²Ï,N2®EÕõ åOfÞúþ¦ÉÜ`š†ÂŒßñ&Õ¥E[ŸÂðàè#x¢œ¯Õ Êо„ ¥§s<À\'Qø•tõϤN–n4ç'”~¥#Ž!ªI¾B\C·ï wÔ ž7SoÑŸKI·q]ûE¦œwÄñ¸ 㹿,†ÕÇ2:¾Š¯PÈ’GgÞ ¦ Öóÿ“Ö¸ñλtÒë®§ºÝÄë¯( +°+°+°+°+°¯‚á‘=—²˜ù‹Œäw±w,ó0wéø¼3œÙKøNtpì+k©ûÛt1±ñÅXõÜú'§øÒ;jѵëeÖÙ¾«k0~¹ÿï™G<-X·zõªhz“"† éÜ÷^lÆ]•}—f™u?ü¿—¤:=æV¦<Øêéé.ÜP#šžBn?ºQ¾žŸ°îcëÿèÏ­˜èC(êªh·Å­'çKŸ6ùO ®÷|28yú…6oÐÞ-¯)“u t’Ö㼩ÔMa|¦0^èæ›‰g‚sñ^1ë*bí–àõ­4ó‰†ržÚ¢Çœ´aùóæºÛÕÜV­üé'îjhîÖLšâ H&î*¾ygõ:J}9úÓ¡ë_Ÿf>g•hõPéW`ɯ iÃE|{ß%á‰0]ÌA"xñ¨õ]÷¼>óKÜIupY—¹®©Î/¬h®`eÆ!Y®±¾†}$òž£-5dWý$>1ôû»ï»ô|îé¥û +º¾ä€¿ñ££Ÿ\Ê«ç’_åÖ»E)Ưˆ:úpýz÷Âé8â‰\uãÿs_jEIò¯fþð¹h¸HT²Ä /›×󯚡Uþ\Ç;͸öl¡ÿûiÄu†¿²ÔûT;ï¬âÓTÐñ¯\GnÙ+jŸŽÛo ¥OñˆxÉ‹ÿ¢ûr¾zÞ!¼Qïß—‡çž²ž>¯ãð³69—tc~Õÿ ã>jÑÉóÿ^Žü=Ô0ÏS”M†—á·\ÿê>æýnÚŒöãòïë¤Ûq˜yRç÷Vu[oÃêú(”Þóµ­‡Øü¦[_ƒçãáçlý¡ü¿ŸsÃ7©x}‹R\tAìÏÓç{Y7BTà—2ê‡{Ÿ˜ýŒòˆ'³àmý´é¦bЃÁ×zë¨/ÖLj¸³¨æ÷Éœð×XykŽý)~¾î¾àyÒÇc~jæ3XâzÿïÜg¥-ýv?‹æI^r¿¥÷w8Æ?…>L˜ÎbèuÞÇýΩ“޹ãÁë¢&çmšÕ×Yæõ]雥{ÖëŠ8ÒÕ/ÂêŸæSÑã“dçO Ëó‰Ïàëuó…7~¥˜ì·‹Òœgh xYW¶ÞŠrÜ],3ûyT“<¨0Ãòõ¼y[Ö=(ìO©zŸ5þsÔåÀêñ—¥u˜¡†…ß-êœ8ð¿Áùòûǘó>[Z¸éˆü:ÆäÒ|+q]9ø¦¹:er4îmmHW0áþ͡ךO ¾×­¿^·ùÑò’ýW¾Ä}_V³Õ;U^>,fèhî?ôe7Ôãz±%Kê½”ýÊ2m¨ŸÞ÷×TÞ,ô¸¨þòÎWbùÅ~_¹fü€÷ ÷¡täƒáÖÒúþÞ®l,?%]} ´fUÍ4ûmþNz÷qàgnñCgÁÏ]Kï‹X1ž~ ˆþŠ=“C.·yŸºÕ“pÏ~_T^·uœ‹f¿[Ì8Ìrëß—r^õhøï|²:A™²tûªºf÷-÷ÿTï\u'’Š¿Âú<].‹{_xèîšqê©RçÔ;mÿ³å/q•…ß3™áiÛü«Èãp¿y æþ¯gV§…3Ä Þ0'­çŒaæ~V6|p˜yŸ;ò‡/ä¯ëj($ô¸ûržbÉè™âÛ眞JEä³;æ_múîQóSéšÍoG–Û¼Sóµ"ê ^‘ÑýÞ׉¹ó\¢qoÜ>_a†]+Ýâ—%¾¼}‘-~¨ÒC²‡~?0ãçuv[·òYwHîý'ñ˾]ëGgV?¯é$ ü¿qYtôýë¸D0oý*}½õNæ¾KT¼½wŽõÞŒ¸Þ\dÝxÇø+¿,¿æ±÷c¡s<à›Áø÷#™¹tz9=ÒNÓó…#êd~k)ýìKýÉÂð´jžÙúùÇ ¹îÆoQ}yYw½^{Jé)©~€#ŸGæ…Òíïâš×ËoCIÆ 1Þy•y?A¿ôôÔ2exêo&Y§ÆCÿ• Oæ"Ç[¬#në×åë,…ÌTÐãXYïTxš¨÷‰JìW^Û2n:ì½ø²ã§ÑÖÜ7…ù½)-ðFÙÉÄKI™÷ºùùÇÕ•O ç–”~•?ÞûÌ;+ÎøK‚Øã‹ñ¼ÓÓ• ÓÿWþƒšgê÷¨”Ìû„QGÍ¿/쨿+×öÐûªûe¶x=¿Lùcª/«í=B¡„tØ,æó\g‰ûÞpˇû}?ÇN$ßáu£›ªãC½˜u>ÆCÇÅWâ–C”‡(rÜžzœöDŸXyjçûÚû³L –Éþ5X´‰ðWË:™óŽy+e6ÞŽóý-ÜcæSŒx"-ÿ•‚çò Ï÷í_×׿7¾:¶aýb•ζì'í½™?zÿW / ¼„8Ç@Æ7–ñûKºíûøyçiFýöúï®Kqñ5f~Pº†åÿ Ü_¼c*î¾&pß½#íªnƒœêÁ8ë[¦Gë[±¸kྜéúÙå6L7?O¬~‡ðÐ"/èãpY7÷½d®»ökFñfînþfDÊ1¯d@¯xø‰‘}‰s°¥¢ÎZþ`ðñMÏó%ϺíŸ6VWöSï1ªˆï]ô;Â®ÞÆxe…ßXÄÂüþƧŒx3æmª<^ÔÏ•ru­Œ}H¬ÇOºhîow œŽÃîó5-¤ú¹ F¼¸t=¥û;Jÿ>Í>¡×Ÿx§¹^.òMŠŠµ7ëñ¸¥OA~™Â)F=mÌù¿ëž_ÄÓ¯þ»ÒC¾ãŠÀàÆÛ¯(¾YJ?Ë9ÏÅ‚ß[ìmÎï÷<ŸÑ:ÄÖ·!eœ‰ÇÉŸ)Æû݊”/x:föÛ}3ªWŽ ? uãÐ=ÌïqR8£t וŸÄþÞÆ8Õ;Ò®a´ün¿Šô¯>¼ê*Áë –¾EúwÄÓu8æxÜ·ãÐÙ×[Ç=+xÐûG:ùé²ÿ–ìÇn}.ûCnÌùý/›arqÒ}zÇï\*dݱ#Ö:䌽ÿOt¼oçš×´Ž¸é—Š·ŠiÛƒë¢^#uUPˆ÷ŸU3ƒq@²®Í}¡dc”f}?Ç>ÅÖë]•™ýÄÖó«f¨@ùºtûÊ+4üͶB÷fgàý««ÎcÃØ»ÓÒµôÇéû‚9¿¼÷™@ü ¯7Þùˆúm9f\pÊq7Ä«£ È¯géÏß;ŸÎçUéåÙÓ¾þ®\³ÞoH_ Ïç®óÑðÀߥtGmóÍ.N,Š;öG:â6žkþBÕi¥ÿÕ°­£Ž qä²î·¸*Þ>…·™×¡Ï…™f}ÿï7ÿw ?—?fÃi¨ý9êxÖëDÄwú÷‘m¹¿¿1¾·ÞøÂwÉ/hù2´.X|IÞ¹LÌ~Ü?lÓÛB®Kµ\ÿÁ2H‡#š‹åï›y¶§ùïåOVÇ<ßáéùz”Š÷^DÅÉb€Ð7ÞúâœwÙÛ‹ògsæ®Tè$b,㬗î׿Ï3ÁŸ+ê};Ç;]žÊ—õÑ;nÁ©Ts«„êÊç¡Ï0npÛáHŸÃÝðg(r?·îߘÕDÏË>ª¿„ë}û罨<šäÂ+®¯s;Cê‹Qõs® Æ#e g®úV§ÜO‡àû÷~‚? †Ýg’ÁÇu«oý²ä_ÐмyÿÖuбï#·~"!|·{'¢é!§kè;÷ûR4cÜÏcµ£¤ùº·,ù¥j\?nfX4±àêy¿WõKï´¥~,t±¼¤ö†ÍOY•ø ›¡˜ˆkç]£ãøý„^§(ó¸Tþeùñà~V ï%! ?^õa·ž_™ùê7ü3ÿ%úk (¯3=»GZ¿0bT°þtcæSõýÔ/ÆË‡£dfð—8ÔM×Á·è[¢*Ÿ'Câîü¹ÛS¿#t ?[žÀÕ\óU>0{†/ÐÓ܇Éï'²t½¾O¼(â…~&ÞQ±ž|È:· ,ëÀ§–üIŸ­t?å'Ò€¹˜¹:QÿåCê€]Í~\ºýÁT¼ ô¼hðNòOÁCK\[RàÐx½Eq±Žõ²nwN‘ë˜Fu ï¡ëý}2?¦Ö·¸Ÿ?åy~‰Úg¤MºxS´kêTÀºNy+”º!Ý‹¯‹sÚ¥UOôNFŒ‡{ãeÞ\¾¿)ãõ¥ Þç)‡èÞùþBÞú¿XOp_9½ž6`ƒ>>³è¾ÊyÁyb©ó‘rÿ!:ç(l‰ã³óG2þ÷¤ð3²é|ï]ÆÍÕcÿˆù=Èf?-‹ŸW]^÷wD}o•7C öÎíÞKÄÏÂâ®±¾O©[iÿ4ç{›ˆzÎ1þyÂ-ϨtÁÐ Z_wÙ×ù÷¬ÓÙ¥ôùÀõ ä–N”ωöÿcÑ=oTÅ¡z<|ʱNîGzÞ ë‚ëF›Ê“ÿÌy6LëýÂÌnä÷¤õCù)ǵ8¡±Áx´%³ª b[½Å;ž™u x>r¿<™O9¾­Ï؉ޗ÷Ezuô¢¾KØÈó N´ñ¼ÏEßÉ\süëÿ½lHž³:çQ¿ù-î3!y#*®Aåçè~^íôy0±ŸŽÿîHŸCÆë)Ÿ_ÕéY7KþH÷Ïù9«¾±M‹ëŠ*eËßbyyÊWåÿƒùMBG@æ°â»Œ3¥ø-gš»ÕM?ùtz<ª”Ï3eª>ú%£C‚æ!~þQ>.ï÷æ÷µ¢9¯â}’/ÜR†òm7|Ë'£Š™?Рߣõ¼w¼ü™êÏíã«Kó< Ñ©õÏ/œJéÏ×4³¼ˆÚüÏ`ül™4y"éó#·_¬|päëUïï”t\ºEUêË`Þ=‰Ôw%ŸcÎë~ÇÂ)`—®7ƒÑ¯›ß¯¼næ:Z's¿@4O¶>m3¬:|égJõ}‡¬Ê볪k‡ôA¥hºŠXøSÊ'Ôã|IÏëÍ:»¢žªêd):&b½Rq°íú¶Ïãý]䇮±•ΣŒÊÇrÆ{Éÿ·q½‚8oÍTGœóKý9‰} óP|0ë}>ðý¦¼½tþ}º—p¸ñçÁ8§ñ5Èß°ø{)÷§p/•Å{½¾%Å«#¿–OÜÚngI·}¼J4>ŒŠ£¥ÿ…ãñAùåþuª¹½‡èÌëaDž›u¼±„›«ŽRn~'t¡¸¦ ¿ š“ßÓ³"á ^yt?¼n´-&¾Z3žJäOÐ׬»‡B!ñtïªB?­=Ícæ†õ)ÀrÊ/`Ñ4T^qÄ“nóuÄfzŸëó ¹uÿ»åA%n> õpÌJ·¾\uÌß76<â†C)é†+Aÿÿ5×Á©z&ד‰[‡Qžbãoèü±Oè뜌ûšÓº‹ÜbúzÜóeÌþ-Š2þ¯½ߎšì¿É~ˆ¿…Y¥Õ°Z3þjxG£?‰ÑÖ;TJhýpÔüû,¯ž¡¸`æ_ƒ÷µÆééœ+³Õ|<î Æ‹n­AóîÚ]Ú¿›ýNÅqQ k/‚*œ?î£óÃd܈•c"ÕçQ…ßß¼ki=^“GºXŒSºÕ¾¾1×±Þ<ƒQÆÂŸ]Ôœ—f}t#Z…WǹÑê œxTCß·Íù×Z"¯V9„µà¨qžºö A?J”bîXZ¯ñ• ×›_u ‹Ò£EO¿¶À‹8˯“äÄë_¡òXxôÏÈOØD×g\0và×–'?wï½´îý—ž?[SŸâ±ÁÏÐ{¹·>wëToù|=.X.x¼{¦iü=zþFàâ1žï¿ÿž<Â\÷Äæ²úÿ·{ä7ˆ>9Øõ=ýù.ëfõ;Z ü–ãô=.¡}«ÎãBŒ˜Dq·òƒ…޲u]b´ü^ðº[M蛼ïW`YMOt:äø•×éúš}fQ\Îër/š÷û*nù2´cÚ¶%füAeö??ˆÆÓ“ý¯ÂL擜ÏSy‰ºŽþù¶5úsìýxpß  å8Ë>çj(– n ̓uË0!XWÄzÞÔA7Ÿ2çi0q“_¦ê„~ÿæm¡nzõ¤¤ ƒœ/®-U[¢åŸš1?§…À Õc?ùν*ö¡9„‹Å¦ñäg3BÖ%±¿ùÙ).Qº±?W;ÁëÛÏñ3ó#0a‚žg«çæwI}¸”ëìNŸ·ÇI¬Gã}Îy€bnñ­uüÏÒÏ9Û2¢…Æãu½®#c3éubm.̓"¼¿÷ =d[ÿnÁûXöóùŽ_¢âO•ÿí÷ÓYÑZ;ßûŒã¢ânï!îÜAûkDÞ„â¯Xÿ®òå×çó\ ­ÎbûU‘Þï­Ìò¨”)þ~èq#MG€*œ϶쿅9þgý;ÌüçQùôbþïyá/¸5ý°>Ha}Jl†y3ÍyÿÊÁøá¨&yèè§çï½³æëaÝË”—³ÕAÛG˯aÝ3Á:®™ñ›’§ò·¶~ÔØp'ù!}ÙSt>GÏÖñÑÙnë‘z¾¨ÆyÊ>ytþžïëãYüw¬¼MÇ|ì¡¥n6ïUýýhs,˜ßס¿1oœòùÒó¯»0+øï8î($ÖÏ¿Ðñ4ù¼²ÿ†õúOçÛ5?ÿ”‡AåG§ç/IÝ*•ß =O¼/Î×;)þ/ü4އóCNvp×á1zöý˜ü‹÷Ö?¯Ip>-åøÙëÍ¿ÏæÑúÇUḤ¼ÛúŒv?IÙJ¯ øg©à}s*èú3³º1?›ñm1÷­L›÷i¼º£wœãÜ0þwÃàºõ¼j×›7㽇)×Û™>WOçóhu€È÷aѯO9®‚[~Ï–—G¿×¨ŽÕàuM)åü£!÷z«ªå¸7šyÔ}ÍÖÿý ÑäÕ×5+ßWÔcë¬þq¤º!:>K?«Š<æˆFúz<@×YÂ7'?oÄY }ç8¥¸ÛûŒwGÂ) ™y½ÂÕ´¿aÕ Áx/ î-席¿ŠÆsSºdõÅü¸ ê #u}É0}Ф uÒÃbÝŸÎǤæÕRfËßÅë@)ù± äH 9½¿~ʾçYTý¿È}¬ZSüŽÊéñ¯×0XÿAZ˜îfèõŠÅÔ‡Šø•.œk?¯Ðñ. üÞ8®ó-ùÂXÇÆ’Ù:^ýítû §Ü— ÒõÏõu<Þwè¥zÃO–_t£›ˆŸÚ[âTU÷}(8¯Øòh¢Úå1}?í\ÿ–ºˆØó:å©û–×ùóÓ¾oö϶>KõDÆ¢‰å¾XïÈ¢ü»#~\êÆûãþz<}ˆâúxX»“ð !ëöÝHëHÞ×ôy[/ßPá­SüÓ½Áÿ\7„¿ÎøÊ¨zŽaýj°}’6¿^Æÿ¿äƒ—¶î*ÿÀAÏ5’a’®,Qœózð>õ‰ðS7róÛfÜe|þÖüVqßž}-½)ß„ÞÍô¼íøo™qZ«6ó37¿iÆßcžScDZ$  úð`÷}º_\Šö æ• P2ß+M$ÿBôB+Ýï ëéëZu#^ªäaÛpÒlõxt7ëV`œ¹>P"_é~£‹™ÿ•rž%êߟØ×€ÅWD~?]ÿGFYxtK­ãçŸßÿ}“Ÿ§•ßD§FwÓñc)üœ¼z\ó æúzGó#SîgMó|,iÑvUà{ëý›õêë÷‹EË#å+1ãÝ´pP¥ãm~,FÞBu‚ߊ´þZ¯Û$3:Oa}­÷“O}Α{ÒŒ{ÏìW¨|6v|ä–?Øp3áU^ bpQõ1@væëñy‹ÊêóBôiC7Þ¿j[pÍÜ/ÀÇ£ûÊê4ׇ†Ñòú²/–ÿ³¨Ð§ô±²í×cf1{~°¾àÜ´oŠ÷Bõ Àà;t/êù#o½gg£úrZÏçxÕ†;F;îÇÐ,„o»â·ôÜo¾p޳6R~¤/‚?÷üMÆý]áØýõí]þ¿êk©ôÛäêñ(ûÞ§Áó_æmºÏM:hO¸L¥‡o÷U‹_=Ð¬Û ¿÷”¿ ]äN‰†S,üý«|>füˆò\ß@c„ß0O¬Ïñµô÷°˜Ï8»'ûNWû׊æïcþ(šœ_÷ù³;÷P\´’õ³¦Rü)çð§dêšU㭯ؾYË›±.tš0¨W2|úÞOëùŽSŒC¾}}zx¾—Òä43û‘¨nÙäE¿&½‡6>1*%‹/òûw D–ô“•?ŽëZ™ã™Ä'B?Ç<ãY÷ÿ‚ëj½ü$xßIÁqTyÆ–÷whO½FÈþþ¡îo)Ü+VtÒ¯?HèVòú¯t<ý:I#æu®ø/3ÞZéf¼Æü˜Ú|~ ‘Oe®Wª¼=ÖW¡×ó¾¬ß™õÍÓú×›qX×KZ4-Rü&¬Só’ª[±»ŠÛ`ú’~ŽÜ’–Ÿ¡êŽ~ÜóåoóõG‹5.6Ñ׫\¯Y±3V>eBê‘ÓÉŸÇÈîäŸXxX‘¯[1¢.AÌüe\‹ÿ?™,®ÕãùÒOôÇúè)8ŪŽ|çõÖfdÞ_ü¿ïü[Zó Ûþ+8¯;a„þÿ½ÌÇ–üôæœ÷ÚØ:RÝ…ÝÞ¥7ïÿ¿!­o(Ì|ùÏEüÛêK¨ÌºrçY×içmjG{Ÿüq«‹ë¬ðÌûíü_çO`SI³ÿ1s[Zù^‰ûóǦÏG¬4óu±ä¯Ìçú­àãbÅ5ŠÏ€vÑú¯â—æÜñ ‘×yG«Þ檗tœó5±\è„Îl ÷vR÷gÿs½Ê4ïBâÓ¨&ëjèÌñᾦn¸Öö‹È>Êÿ¯Çù%¥U)".Ä1ïûU1¬*ä¶Þ‡ð¾RŽÁ÷$e˜õ)­ƒÛ)¾÷ë} æ{æÎÛï£ü¿ê[·µI°>Ú¦«éz<3Ñ:Øõu?ßyög0æ/f`'Öó-dË·‰8®ëMúþuë Úzç÷=Z$ô5N‰ûRõ÷\ÏW^?»¸ùá(ÄëëäcÂ×è{™Åyyå/'B1js~sñ—0=ÆY0@¿þÈ3z¾éáIk´}tÝm䯶e|Ãè7õçtp!ŧÜÿ 7•×ãß{ —žÑôrmúcÖ㋈ýco)³E_Ž—? /Ž"âÿ•¹.6c­À[Âm¼ ó‚ãë}J‹®F•Óñ+\‡@žG-Å>¡ôXûVø÷ù~4¿Õµ¯ ö¾EuŒŠ‚opŒZêt)ã4Ë£Ÿ¢¿½ÚwÑ÷¦Œâ©ÐIäŸz1NLèÿØÌ×qâúj»ûÿ¯»‡Í=éø)è~ÞiËûR>8…¢Ǻk)OÒ xWé±­¢†^R‡õùûèbÑÛó]s}RÄØß_ÛŸüþä öÓçêÈ~qws^Ïç–Q‰æ“6é÷JSóÖy¼B÷\<š§ô$Q)='˜'çjÊ_µ^¿ç‘óºWºE}¿l†&Ÿ?ºU7ó~ÞbÝ'‹k3Ù_ã?¿wó×1©í‡#õ>T蘌þ6Q"ÓûƒE?ð¯ÂXGMÝò Øò4½Ç3s‚+"ôÒö¾Dq ÷™Å5‹"=wì* ³æõjìAZg™ŸŠµÌ7[ÙXÏw3/ʦ+†,Χ ŽËQÓÂטaη¥Þï=t=™‡Æý¬ÑÛ¬Ûƒ]»¢éª¾.âlÖE3>Ã…ß±k¨[iݯô¼àŒ.ÉÄ·}I¯ë:Ó<Îf~ÛXÎËô#Ü©ì7np‡²œÿ[ðWý½8ô´®³)ð ˜ò z–?­ñ9üãG œL×Tý‚1 ôõ¢ç‰EÿOì¼ò‰+âÕE¥ù}tzû˜¯ã¥°€€!h`žÿÞ)ý¾>«ˆï„%Óõz`vž¢ßvú>æü\ÿžØ¡×7pÝòmË{9MÄß‚Ÿ`Ó1Dñ=tÕýpk_ˆ¶Ç¾ûùWÅPÊ‚ã/ï„™Mg ¥xñCýýiþœöþJ~—«aEs¹6ç-ºŒèLõ`4`®¿‡=IÇEòÃ]Í;O‚ºæ<‹ê{Œìh¸Ð¤ «oÖuЖ°N¦‡”®aV_Ý®nöC±å:ZG›[öÛ9ÇUcHÏûF×ÝD?+àhàýû|ôýc Ô /å/*êó7‹qÜïÇÆCò¯/ðn}êÆÂùúú1ìO+¼ë¨lÙ§8ßì`>NÊõ,úŒ¸†Öu,êlö÷%¾ª¨å¾JñóíÍz>/šýf›aÙ_ÓòÓüqzYô«"âdŸYÌ»6Öýaî5”7šx·^·hÊxÍS"áíÑ=$߸öŠÇŠ ½¦Ï8Ìé)Ï2~]7ëùÃÒã7*|«ÿÿášûá3ô^mùƒ‰o~~¿ŸÒ7=ÜNñt…Q‹÷ã#¢ñ{}WŸO-¢ŽàÛ‰>~¨Ê|‚JŽºAЇ7…ð®(Êõ÷œß›e¾Ïµ%Í8òYë)OWÓRG,Ìã³n èzMh™¬®ˆÊ+G>Oè6ÙøäÎã‰Bô|QÍ’™sD÷븄μ¯ü¥9.¹ó¿ôz¦Äk=x¢Q .S'=x'8ïåŸW\¼7ÜW¨ÞåÑ·á{±´†Ùß~WŒ?gš¨¦ýw~Ç¢7¥úh¤ü^á¼ö•0ã6Îóþ÷sö“v˜q¥¥Dœ¿»v4ÿ='Ù:'ÆüBÇ&ÞFþѤâõ™d¼-JóÏï~;ûÒ|Xȸ±[§Ÿõ…0±~_«ï¡xièËôýVN7µ_ÞëÁþ‚õ¼ªkÍYIñ£Mg£¿ÙÅÂÞúû±­4+Ÿi$ów,}‰PÉüÜ¥þ^˜¡žØ'¸o Vì ^œÒ‡*£Çw8°•æáª;¢CŽ®—ñè]Å/å;z0¾cÍOhÝ á«bæïÈOlcù^êÑúî]ù©i„KTùôuÉ[ªç5‘Ç•§ë®(=Ùqœ?`>˜Š/0ì;ôþ Ô×+Ÿ§qÛuäw¬y‘>GOŽóú1^a¶Î÷ñÞä÷ù¦õçÛßœ÷ÁÊa:œõe°‚rxhi×Kþt%‘šû'ÚïÚ±>A)Λ0O y=ع30ŽW8%ôäþ€ y¼Õ¯Ñ÷˼;ÌÙ‘¯…Å÷<|¸çèdöÓÚã‰1ø¨ö}½Ê¢ë__ø­*nYûT"y»苦¬÷3¾_ˆN¥£îü’‘p¼¶þÈa¼Yd›÷uï·n}ŒÐàjcŠ 7éþËš¾zݹ_H<õ<çc§<£çsª‹ý³i×`'Ä/Vë‰õïZê%‹²ÍëßÔ7Íþ룥Û~¤ò’¶~µÖó„ÿ—³_ÑxßÞg–ýJåG§¼­~qŒÏ«&ê©³Þ ?yD3'ÜVIFiÇË´O´+¢ë±Äôs°õ,í?Ÿrœ9òÚhÏÇR‡KákYt(UÿµÎù¿Ï¡zг®¿T`öU2,(­çç‡~Ÿø¸çüç/±rŒÙP~ë±¾’åØÏÌaœQÂßÈø³Ñ߇ÐŒQÔãt®³J¾³ô£æÃýë/ÊÒï§¹èo”ó˜Ž?èÅÏ©×X§m¸^þEþàl†j&?ï8û y?0ç‰î9‘ˆˆ%Åh^I]kÏ÷÷ÍI„WSº‡‘¯—ÍzíÍýýãêFįïøoz^“(¯ŽÎŒÃš¢ãkmù$…ßJ©kÏ™¤ÇíhÞ)ÿBå#T=õ‚ë+ÞûÌGh`‰7ˆô‰P¼âáïšë’µÜ¾”ÑýNŸŸÁºôØ1žÇéá†âYòªKîÖ¿ÖkÇ 2f|R!Ͼ_ÇíYø;þß…^_˜9óS‹3ïò#ö‹¹ÿ˜êËr|C'°®i˜¿‡M¯ý-_'QᙫrÞ¡ÿTFmž¯ ÍzÚ¸…7ô2ã,R®{Aòb)‚æ–:ûŠ«mýüã|ÞÿòŒûQïål]Ç#îþã_gH½÷ü½añ¿è½ÏÕy½ØÚ&­gÒ†µÃi=*­¾›T>Oâ·£î—ÛP,¤N9ÿÛ×v‰¦§äjª>á`½Žâ¾G)|²#ÁÇc÷ ”÷°è)>š÷1ûõËY+÷å,º%þø­ÌÏ +k™ë`E¸=ãmºÎÆb!Ÿ8“ñQÊß9¡úSøºûuÙÿÚ~†öé¦Áøol½'utIó>Äù’°Ÿü}Êõwt%?t÷ªÿ·Öq~Oý`dž•X?ëßâû[¹UÏÏiHó¯h´}MÝpç˜û“üÑol¯çg°ú3MGßzÞšiݸv9Þéñf¬8Êù¾sš¦•ñǽK÷ Ç‹§SúGu%Ze^‚ä÷õJ÷ÎÅõÿìgýw aÞãô_ÄËÏ·ïËõ5Íx±!z|ù»tÝ£âøNŒ×až‡Ÿü4šÿ‡:n>¬ß«w,8àT:–ü£cˆt-ª.;úèúQjýíWÑçQ8-æÏIvT‰Æ_@ïŠN~½÷¹y³â>Žç§+ÿÿ Üö#×uÍ×÷Þ·Ðú°b¦g,u®ºE¬k5O†7‡2žlXbÕ_dõ=ÁùN[ŸÚšO,}ØiD) bâÐDßCÔ†£õãŽ}ï˜ui~—^^Ú5ÕT_+Ù§ã«b˜U1’ߦúî¨z†œ <ßÚ÷}°y}Pë°ÂÙ†ÞO_ƒKÿ›e῟M‡7Ä¿ð;"®³oÅ•5bæûßÃ-8÷™[ŒïcX?ø”qŠ8Ö_¯ýÝ‘7Sæ½'xiKW™ó»?¦„Ÿª?ú¿_ׂü¾‰ºž¥ÔUMo~§òÍõ-øˆOï½wð|­É¼¡Šfÿ[êV§|Ž*¢>\‘ëå ÷0ú}EŽ«¯Ž§;ˆ›£y90DaëlMxÞŒ7=Ë8„I‹ w²Ò²®¼=R¼ƒâ¼Ní8–Hœä{ð·z¼”·ÂÍ*Æy¦å'£ÕŠtb°|yºC˜ƒá:Zm¸}\KõïtÞâºÍzœØÕ\·éÒ àY`ŒYï΢SÕ0d™Ž“y¡^§yø­÷ÍzyCtˆ÷¯—S`^‹[ÝK‰gƒ[{ú³IõOñyÙœ¿Pùâ™÷R>m õýÄØ±òyŠ úû×íŒ'‘<dë`ZÇá¸Ö;£ç?QRè-1.Uå Њù¸}ƒqa†*̃°ÄQèDóZé;[B䙿§y3Œðþ®õ-Ù?;ªášù´ÞoؘkÊ÷Çñ3š—íÌï“ô«¥n]ÊýO:Ù•çV5æýª¾ëŘ·X‰×å¯.ì¥àu@éߣnH?ùzBß¡X¼<–ò|yÍÔãÆãGý@÷O¯q=f¿$q*ÿêŠ_òïwX2ó5]Ãðhz˶: ªrÝjÓÇf\Ýö\ý½*,ÞQo“ºñ)ã Ù+Žt>~ÎrÂë3ÖU¿ |ܧõüg!w¬¹ÍìןtÄɵpÓÛ’ùïbzxTÿú]x”ûùXW½ ï³¼ñÈî7Ì0¥ ÕïÏPÔ±þ·8jKŠG³øÿÌ+÷û’<ù‚^ïá~*~߇†üsû^·ývÿ'¢GäëËô¢}Tñ뜟ÆO‡ä‰3óÏpô 7ܺ²^à‚gY#D'z$ñÉ1zU¤}À;Çu‹ U g±â-Ö]OÏKÔwPÞÒ?FÕ¥Oūנ­X&þ5¸Þ^‹ãý) ·ò|È{1‡Xo%Ÿß\§rå)¡4×Ó¾ÖÒ§ÇÕÅÆÚiÕ÷•^¢uüž³œöclFŸgs%³ É*uÀåè=[ýOŠÞ×÷M©ã¡â7œVÉæÇ­õ®ãéáÑã×ùÊ[C…ˆ:¯JÏ#çÞXïá•f¨¯f²^dÓ#ÂÔv¾4çEE¿ì;c®K¼<¿½o‡è,Yúvù×­hÑ#õ`,ïèTw†WG_YwÍ;RÏwÔ£ˆªCr+óôx¸QL^ëÐí´nmû'ù9«úR|9PÇW¤[_ ½”÷sí[ŽBþb¯xúq®ËÌA3.kÿ ã‚O‰÷¥¸£~ICQǺ-xÜüžrŸx.BšMgÝ/§ˆyœfÉ?¸0ÇþæØÔÐé{ô.ïgJ‡Í×+ ãɰ&›ü¾õÔ— Åz¡ôå·¢ã*‹ï¯×s«‰ýþ¼ø~j²¾l)å?wü‹pÃÇq#‹÷]úœÞçì÷å- ö‡·T ¸ ¯[‚/:_ˆçˆÑò<¨âg]kÖ%rÕ‹÷gœ/VÞ+σJæûTuEïùƒ'MÚ|þnˆÎ˜24uÙ/èy¾­mƒßÿ%ÌÓ~¸Þ¥‡öÓ÷Ò”×™ýë¸ëVQÖñ¡Œî3Q ûR)Vk)p”¸ÕÇs»™óËçE¾¸bfõf°¡†¾N5åømu=þ®’/®ÄuÙb}­,ñª¬ß`ÑŠkÞ³ñø–®†Ý5Ìû^;ÎÏæºÖu{õýþ¯1qëˆÐªôpUŸ%ÿï‹Néõ%KÞÁï3ÅëgôøZ˜w'ý¼šöuÕ?AÖߢê|‡ádïoå¡ÐGðG ÓuÏf ¢ùz ¬™—3ìûfýrîc¥ôHüã-üò+Ý€VÝ÷°ê5ÝŸš[_×|Û¼/cžØ—®£ú÷¯³»_4󖿪ãrwo7®ßX3FÿY®«•Pú Éøè-ÞÛ‰fœ®ÿ÷’b¿ØQßm__uM,½ŒiOgáç—¡ ãÁ¾Y7^¾µŸ…¿\’çWÉxëvRæë5ö#Ü&=K÷Ç|€0¾–Ço³†Þáÿ+ž¥¯S]NåoÙQù\QïöÎ üœè烞Œ³ä¸•Ä}}"x™!ñ¦º¾äa˜yÝòÎYxxŸ„ä—,u>l¼HþP~ž)/‚†‡óHX~ ÕåW4×ó4S©ÎÍïÐóUú»›ÿNûôD½?žÒÅ$ÒÑ Ë?ùç9î§8ð-3Þ¨¥[~ +)Áþƒô\ªþ]Ó•Å[è¸Ä;T}žÞëÿ¥ó'¼Ç<ÒÛéçþoÒº¼ë.zŽ çÑx[Êï@eö«›siV!}ž…ð<×ó™\遲*a™/טyªöå2¬íŸ¨Î–ôÔýãs¢¾ÙPàJ¸åGâò—üómqƒ+¾«ëa7Ì‹{ æqÛR|Ãtÿ©¦Àg·Óß7•ïòÿ?¨(óóÕñÁúqÍÖ·³Æf4~W¼AÜ2ÇÌ|xí+ QžH|ßXùRpŠmô|g^·‡ô5ûOãY÷°×Á‚zèK_0V]HV§lÑ/Ì:ò¹¼?Œ7ëÙúPÃãù]Á-¯•T¿†¨†â!yûRÌ3ý‘…OÔ?'÷kóß,XÜ?΢»‚Z"N®#üP¥#5ŽñÀ¬£*ý8Œþ–žGq^Ìã¬Hq¶žE,¸‡3‚ïqó"=ßÂø?UÃÞùÁ8мcôù:²žôà—t=Yæ¡"û3ã&éyÀÜ­Áã'¾uXÂöyý¿WÕߥ—­ð•J?Õv¾?N ]§…"ò‹³’Á¥E5 ¹ÏM_M}O-ÒÄ7÷ÉéýJ9¯%å·0³Q¤zˆßï0¤oJŠÎ½ÅßµžŸ¦ž äå{óò“Ìθú}ØÂýR¸ßµkßÿ|©/2v­õ,<–ŠÁqêYðjo%ÃëöÇ{ײ¯ä¬‰Tçs¾žMÇd¼÷)ÌPÑW5=¼ŽÔÙ•uÒ°ºIXåLY _À£çöŸÓ|RžâñlñùÏò~[NäI7Œ1h»N_·Œ–úz¢ðÈØ¸Œò!:¡×Ûy”ë~Ä»R}ãÐ>ÇèW¢ç¡…n†Êƒ)|:ˆä?#7~Öv«kÚtÖ±Œý΢­ÛþŽ%[¨^6ðgNþšÂóýçºçÍu™£ü÷¥;u¿±§Û:‡¼ªÆ}_æÛ0ú–`?¬ÓR=?*꾿Øâ~}þŽ|Ò·àz³îÙÅ+³‰5:ãjýóaÜ‚â6å¼á,æÅu©iÖ)SñnQÁ¯SúùGyü ߉Æsaþ¶üRçYF¬cJCM :Ÿ†aO¹ÅŸ–zš­Ÿ1?sô„Hþ€wÒõÈhæ6¿¯)új›{˜ùý££Õ3QÏm}ðõ jGÔ‹Z9•ÖI•çŸÒ—Öýœ n:wÊqœWõÅÀ½’ÌÓ¹âUÃÌ×QÁµz§Åy7iÓùD%Æswäýnâ½Ô x_Æ êÛ¢ú^Xë!ÖãNÄ“sÅ•HÞ%3ŸdÐ"ýýW¼Ÿ&æ~ªæ}Êßç¿Íþ¤¿æœvËÏ´çç·ê^WöÉá|‡ä›a†Ð‘,oŽ»-p>‡&ó¿Î¯«qû¬ú×·ô‹°^/æ{€Qw;íJ÷-còh{<¬Ëš&ž<åz­ÝôBÇ™,ü§¬|Ò³‹‰» 347çC•^¯õ¼‘¿Ì?9¿ Ë7êy¡™£(oÉ}šý~.M£é¨¾bþ¸-Ø/lhÓ·mÄ›¡V¿™#ÿl:9j˜9öÓ‹ÿi2éF ¬yò>–7ÃÆ³ô¹w~¤çZö öëRúTžþ’úý1þǘëÝÂýúÿç =ÛU:Î.¥ßŽÂÔ´Ä•WsÝhî7ÌþëßcÛVýù Ö!óóžü=ºêŠ#ÇâþÝ2/³è¹zg¹ÞÔ’âŒéoÎßU¼@Î÷ Ý–ÀýËû¾À ¯ÝHqxî\³®NŽYÅ×霬ë§Ô§‹³ÿÚF¯ŸJܹߧmÍ7è{V¸àFb„ôQý\¼Ó\·Ry†b–|&û )u£vQùÀâs_ÅyþUOßt$äücœ9Rgi t~+ñúÕ’ê&¸J¼ÏœGFGÐñXWCá¸^Á·´[¯×›æ´5¯g‹I˜AõMDîûÁz"*Ÿ1«MpÝiA0$Wg¿×üþ”[[FÊ«¢¡ž¿ÀÄîÑê_ëÍõLtf|S?®_V°èhõ}Pÿÿö>åÅÅ5Œ2¿Ï˜u£_°ë­WCu|·÷nH¤¬cÇuïsÁ—b}Yµ`Ö¿ôüSÄ>}®fËç¤÷Q¼¸Bz¹é »šŸ§V~Yîï ÇW‹qÖ¬«†²Œ?m©¯Û¶ýYê1H]‰ÿøŸ:>á ЈüRŒ¹M¯+œW¯(°+°»R uBô T>2›ySøùƒãém¥\¿q°Ÿ¡‚ùÛ!ùWt ΋ùÇõ"‰o€¾œoµÔÕЄ÷ÿS¢Î=ÿ}ßb>:&¾Ç¼\ö„.4z2Ç•²_Ðæ›É¿Þý?:>8`Ó§SzVþ8u«0Ž/‹)Þ6üò){¿™ÿ×ï‡U‹¾÷°ç‡YKt¿ã(ÿ¾žEåñK¡©~p%7þ•Ô!MÊДçu7¿Už‹ña*ªïÒœy7…ù=T:ªcnÒuZ,u”Ȱ.HŸ‡Ýðò«:¸á.Ât-bâÓRî'DO_êÚ:ÛTä‰ë˜a¦p€ÞÇÿÓЭ®ðŸþº‹4>×룱Ðíª'ôáJ³Þ¨?`ú:=^}í½‹œG9\'#¸F…—C þ)úÒ»®º²p'*ÞË”¡ˆØ/×Óç‚ñ@±¯;´afúØÖM÷éóüBô!ýãnºIp}Ȇ›Uú7‘ï³X´~õhP<Öz…ÙÿÔ÷÷¼”ó¸E?lÞ­Æç'óÆþï ‰yŒþ*òôÿWÌðþY>³ù_©»åÿÞR×s—ý=li“_PáŒÔÿe½\öKÊ׊üåì@èôubÍo›ÿ’¢¯Õ•õUè8Y¬Š§•r½£åõ9ê—fýHZÇå~kë©ú¥ü¾vþÔGl¼É3U}á>uļ­¼ÏH¼PÊõØ¿÷û5Zðþ)ãvޑȾUÿ5Bphõ‚×ϰ>\¡×¯löceCâ+U~"îue?/,}Zßgj;êTàxÝ1ž ½¯#–ë²£ñSКq.â9¢lHƒñûœö?_Äú–hr|î ×õ§úp.ÓR?B§—Íñté„õŠMéŸû׫l~¾aº×ißóM® E‡¤gï¶K'ýøne‰7ʺÚóÝ= ›hkÁÍÔ©3Ö•t•°kF¤õecâØ…^¤Ô‡KÚÐXü?f_æ¤LåwQ6¦^ovp\‚2âùZtšP6ÙçnÓÝA þ{Ì8]ù‰èx¿Ù/Ê­éýë¼9²Ó‹“åº$û.`hDxŠR·@âPшñ"3…žµâs7t«ŸHC‹x¼NÔ÷WC<'KýEê ú¿g½ÙÝ?wV$¿Ù_pÜæW‰ï³e¼ZÁ8CÔ°ì» (>ÇÁ£úþQAêo±~BaË{>ûv7}éÆÄ;Æfnu…JŒ§ éïé_("¶£å¹¬?MëgËàü…uÜb!ºiÜÙÏ»Å3ëq϶[ÒÊß*ÞxÜóÃÌÚçÃñ{tí+Œ©?ÐçmÖ—S3®¡È“°î¯Œ·p]=ßQ2Mþx;ÒO–õ{ï33Ž …3Ó_NqÇ»þÒ§?¶aðû‰Ùñú4†™Ì»Y¯_HøÿEÒã…§ŒÏ}Ò¬º¨3ugT]ޤ ÅN²G„õCa ﯮ*ta¤^väûßp/á^”^%ã}Sô}› œDH#Õ)åz}:®³Š_gõg*2Þ`ÆR³?Ü–ýºŽ)ã—c¾â¤ãnx“ò1u¨ùBQMÍ{[-çZÅÔ XÖ ¸äó`¼j}‹[Ô‚ÏùÂm=ªW€ý+Éï­"ð‚ñ6]ºÐûû{¼óüû*Æze,~xsÆ4Ο¾S®~(:¼—,>¬©Îƒ ]mù©3_PZè³ËÌûŠVwÕYèYp^SŃŠ/¬ôUpU´ûò>àýТƒ”rQêøxøÚñü[¾Æz_?ÒyíÇBð Ýt< š±þ÷Õ̧—y³Æù£#fÒ¯@y®Ûó³Ã7(O_ƒõT°)åݽ‹dÉ£>×£¹^ÙMƒ×ïuÍ„Dð:¯„ZKK·'e¼ÎCÌ<ÐÓ–yÏý®Âøðÿ¹_î§¢xª\ŸÆz3…/öõº>ö¼1s’E'+3¼Táyf©ß(8[> ÛE?¦¬‡q®ÿöœ>Þù¾ëù1tä÷²÷Bó|²àt1{E4ýÞ¾Ó˜ØN÷³[/ÊÈþ6b½Ü6Sèë˜qĺҽkæ!ÐyÔóŸ'ÞÓY‘ÞZ™ò¥,za7\Ôq Ìy}tަ›`Ó…NÑ“>ê:bÈõØ¿Ää_Q½¶÷´~ì® ¯ÿ¢n6ŸÑŽÖ=•NænÿãŠWDík€ Ñt¯S®gѽÊõTŸ]’û[±>ÇÌÝ”¿ŸFïÚã0^_G14½û 3ÌÉ\Ï´‡øHåÎkÄOœâ…ËEÞÒ9qyê¬(Ÿ¿}/P3ÙωY¿%}ûE=§ü™}Y§e])ô¾*2¾#¤ÎˆŸ¯»´p«þ”þï¯ûSFê»Òl<:…3²§úóøÿ/ãØý±Ã:î8g¨îg´ÑýP’/ºè˜=U_ç ÍBtgéºÅ~¿Ë­mÌz÷Ûûо³ú å)ÿ‘çT‘ñÆ çÖÀ61RýÌÑ¿¼Pà¼Má»Ì8˜?ÂÒS¬¿ÓžüsÎ'`+é ÷T}^XBoLÌqÚWÑLäãöo ÆsÝ÷*ázÖŒ•··=_Å—FS·øU®î¤¨gçm¼´p÷XÛ™ê¼}¯'¿¯‘Û}*þ7æ×¡y<%½¸^#m=qÎós>2å}@TvËŸIœ§«…ñ?\ãYe¨Ä<ç]5 6뤣À7–༔M÷°¹y?¶é°ªzž÷šÞ+ ›qyþjnŽCñqýÅ<¿­½¾¿ìøûÌÑùø&á~gM û©²ß64ç90GðÒcâ-0êvZÏYÿU,Ï—qBJOSê‚ å;æxèE£û·Ï?)ë6ï‘û³àu^ꚌÖõOpG/ýúùs¯îɯT:žeü~Rö›E÷úu*/aÃ%D5 yϹ~·î‹>üÄ@³N¸â%bò÷ô÷¤ÇU£Þ öW—¼OTã:ãPAäE‡¯¦ë—R}·Å÷Sžy†¬ó†!¥ÌþGŸ0åø¦„_·õm”µ䚯BQþ\ý9ßx,d½^u#ǽÁuMdëz¯aýl] Y<§Ôùý¶Ž“l‚ƒo'¤¿¡¥Žk8.ÖÝÑ”ÐõΉõ°XðsóñßCÊPܵêN/i©ƒÈÏŸò÷Ó¼.íØ¼¯Tæuwé1bM!=Oªô†æÍ1~4êÌ'³ìk6]ÿ¨†§ûU¸ý§ ,3†>e/K?ÓûrÖ®MÇPÅ7Xý_2ÎLý'¿Lò½ ¬À ¬À ¬À ¬À ¬À ¬À ¬À ¬À ¬À ¬À ¬À ¬À ¬À ¬À ¬À ¬À®TCó„ûg >µÂ¦Çü'§þ¡À»– Ö›Âègõÿ³–´1óÃÛ ]Û6Ä»“|Tº͈ßí½Îzwsºé3tå>}Ÿ3N½¨Ð·_¥ë{cÁS:ïï›+. EãzꉪÌó9«úvFÔ!_3O¤ú#yŸ1~¾éH*þš÷=ûª™â-¡?íˆghÑUO9_Ì{”f}VÖ“ÓçÝâ#æq>sÔ÷­Í<¤Fn·\oþiÆçz'-ëÆŠ'I§ã€¼EÁú0ëÿbž5x>UOOçãÊeFo·JzýÔóöNˆ}D[úe¤ðà†ëë#ª9êc†ðýñf˜ù—J—Ë?®<¿¯¥D¿ *ñtÃ0µ-Ç:E’ëû}³èøU¤ˆŸÖ¢Ÿëè!‡tmQ•uNÖ]õ«ÀÏ÷-ÒÖùµ7'Ógõ‚å½uÔgQ:®þÿ“ç]XþÞ©üÑ5Ä´;(ÎÛ5C×l›—Ö¸)óàEÇuu1ñ‡éõÏé øÅë+ód·ç¶üžÿó{Þ_×¾éö¾ã#òS¸áSäûÈ2¯[ª Uߥ½®Ã†Žf>¹4ïŒþž)þjèyJ¯tàÛšÿçë4Žø·¹¤â‰§Ù/ ì}öÞú ¢?*Џuý+œÿpÔ—ýEGfëz-Û‚ûˆ¤¬ÿ ^é¬Ï¤/Ó~Áþóžófžßy^æ>Fþðô’”·)Ÿf¿•‘Ôµ8ÿ²¬s¬÷58Ž8jžÏþqÍYÏpÂò›Zæ7ï˘—g§ëQ\³_ÞóyhÉù-î#®tš½•^/ïÛ[¦ÓõCòyþ¸ÃƒuXQŠã·µsh=™×HÄÑñüùÞ`û›w½É‰GŒ±¿¤üÙ/"ö_®ÆþCcÿŽVÜÿpÁ$ò'ʉ~ê58>«̳³ùùÿoœHïǶuú¾³ä§ä'Ñý8ïx0-8þܱ…ÎWýåsÇFòÇe_{Ì~™ÞóѬ;ËyïW–8%wÍ»†ôü”>1Ö½J糎Š÷KÎwЏ •tûÿ×ן{Dý>ôŸGëO‹î/릠yz:ŽXöš'#Å~Ç}+Ñ€ýÒ~z~Aê¦áðs´Oqž›î#?wêÇô¾íœuÂî£ÿ/¡„ nî¤ë—Ý¿–ÖK×ßkq_^ÏÖ‘>†MÒïw¸Ø–Ž¢ûÎ~¼þ­è¤çSæl¥÷"WÏËaJYºÞlÒÑŪ›iYO Û1ûº¿G掿ôsã×iþŽ>FçÏÿ‘ ¡< v^Gó‰ý_Õ—³GëyŒÙ¬ã[Fß6þÝO‹®”o?ÍǪ·‚u9Ž¡û:]Ÿ&GÎÊßMª:Î×õGø=C-‹Îí¹•Ý¿¤uòZ]o7tB}Ðåç‰æàéyTLÖûübæÕæÏùc¡4˜îË×EŸö-z¯z¼fö»{’ÿdûž¼÷Btx¼Ç¼Tãü˜E÷Lõuµk½ÞÂ)”Oä¼€Ôƒ³åŰûïÁ:¸ŸÈ»t¾Š¿šEû~¥.¿ÿ{U_ë/ê#3êûD=Ë}õù¦¾~­˜©n†ŽÏÒ}½ë>¾º½ß»×ëùðkXêMQWíÎúu½]ÌfœwÞ –8p$ ÇaæƒúïÇ}—ò”¢Ï@\ÃŒ§ãÅm»êùµO;­o¨/â¿çBÖ§œ1Á:rŽúÆ®} P‡ÞÛžöÓ(z3 ©þÙ)çeÓþ¤ütëø>1Ÿ?»…›ž¤è…R"Ï™[AÏß´ y¾#h>¡»¹îb?/O¯«²èÇO©Dã7e?©?똷 ýÛ9ÿÇ}(T½Õ;¥?GŒc=Ƶ«Íïkk À}ýÈMÔHž[Xçþ*!ú™)ÇIè=­ê–Ä¢ó‰ä ÑÖÒo´ÈçYÖOÿø’¢~5;‡ÎûÀ2þ£‰èŽù÷÷kžw9nžÑÄœïjÅ~TÞÆïWêÉùç•pËg¢fHŸ•çh·çe† ÷§i4Ýu›_’®¡ÏqºŸ¹u˜ëo€ÞÇßwƒÑ?ZÍ5Rñ«¯ûÙè~ó¾ûAH¿…µo˜ãàN;ô|BÍõ~ø÷͸ŒÎ«h_ÿ2÷ùTy®×­ôôz–¨3âºkõü ëþ{Ÿóú×íoŸw¦Â*ÅËkcf.ùÏC>gõÌèý£åšà8¤µî‡ø¿ßù¿nx²åÈÏjù|°niCчó,ãæ¶âø›ã“<ïò>â> ¼¯UЍóoDËwmÐñyØÐ"ø¹u¬H÷Õxhà÷†l³ÿïÇ­9.g?gèù>î{…zô\|<œ­_ë{¿ ÎÛ`Õ£1ºçø÷µ8Ruüë¯2×õBòîªß:;æ)'̧<ƒÒ ç|n«i]Gg·<…k_ÅÐë5ºÁŒ·9±¿KƒôôÑ7ØoÁ¬Ðû´äkô½çP¾ ‹ÍëjYtM˜÷aL{1žNû³º?ˆzü^ô©NyÎz|ÊÁãaéí:žk¯ž¯@-áOMæu¾q´ùà]H³ÏÑxç¡¥À!Õ³äEæ^—h^IöIOé9àî|ÅGXXX]I¦ê%—û> ¬À ,ÿ ÍãÕ! ,=CcYwç< ¥OVÿ…ò› ÔÄ2.“èGx2ôbÜS;Îû4wãWy¯0¥‰¹oTÊñŸq¾gý×Íõçâ,”¶ðSÖ=Dy•¶Éà)âFu1Ç­-<¿"Œ\Q1£ýXÑŠû9â¬ÑëÌ9ÑúD†ŽÛÆ×Ûúj§}½"æz’ìŒT'‘õLú5áŽVÖä:¾À¯•Ðç›÷~4<¢õ¾¯ûŽçýZ#×—øÏµ˜òcwô¡üÿ­?¢ÏÇý¥T½ öu¸·wœù•{Ѻ$ûÆkÏõ_Ú_¬x ^ö‹•ù6ÿüš\ç[2›>÷œžÆy†ézžŸaóÿ¹ß5ŸD¹J¼Ÿçσj¼~ævÓóMó7¯7|/Þæ(ç»E¾;®1ÎO´âïßÒ·Ñ»Èyü"‚W:’û Vg|ìÖÍïÛI^çŠú”x½÷ôç†bŒÓšû{ó÷Û3Ç)®paý3CÇy+ÙzŠG{¯SÖ­ÕÜÏvBGzļÃêÖæ÷Šû ÊσƬë0o•ž¿Î¹>RUE>º=Õ­Ð!ÞþŒUE¡øçõÆ …žße‹Ž³]Þ*‘ýÌõIÿïåÓëÇ’f|ħeÚÐ(¤N;¶¹îRÒ¼¢ãˇ–ôc0׳,õÄ‹œIÿ{ ϵ|$Õ“&ßOþq‡¦´¾Í)ܧ|Ö8ýýìÝPÇ_Æì×éjò}öÎ[x\sXö[ñÞ6·àÀG?Aëþ´Á|Æó`9áÏÐû÷´0þÂçÍVxµY7Ðï» þÔy>¾*û‹wÄZüë4æºü¦Ê´?Må~ŽuxnEü”tÄY•ÓucâÞ—2ï%ó|ñ>Õýrï<ŽöýuÜÁþ»ê£ŠÝŒû"òÞ!þÇ'Ñú>"§ˆŽ‡QºÙÇM¸oTfœVeá— ûW;òsSöµZnz6Ü­óý.öᣢþ{['½Ï:ã |=‰Yíè{°ôÅ¢cùW\ŒSñ0Äé9`­[ØÕCÇ[V°ì+–¸ÓÌ—¸þ&ZÏ™W—µ1ãRÆá¾ãè4œæI³ÃÌCú€ù壃ñí•×1ú×ÑøF{×»JÇïZaþ~¯#žF®3—è~ܤxû6nî¡ÅŠw-u Ðn~¬ü>3.ǃôqU|(óû“O|Õ¸Îúy­¼7åï‹yG)º³Ô¯[Ñ-aÝ/›YâPÁÓC6ãôú/ W›Ÿ‹ê'ñâmÔŠ7œa=µGòÆq¬Œ‡3µÞß‚%ô½ˆq1VøÙÁ8³ÐëŒçùü~ÿk³ØUðWíI?z_+KÑ~× gnãÅøãTæy_‡ñ‚–¾ÌþñœïBŽyÝÄÖ1Æñýûá} EÍ}¶1Eä+lÇÕgÿ‰ñ¡X¹›òG,÷]Mĵ=õ÷Ù{#—;™ö+¥e;.å¼…OÓ¾ÛÄì熞ßÀ-ß‡í¿ ŒçàñzÑâlŒ»1™<"ókQXàTyÝòù\̓ãMŒÿ¯Dê¿Ø¾48î]}»™ÓIÇ›"âu%®[ñA"“¶îŠô có¹Ð‘h”Þ:ê|Ýçƒñâ’_¨â]t&©g˜r>ë ñ¢DæÊø¯Š¸ !óó>³ð8jYxïýÌú…¨ò|”ÞQ‹»@ š·Š‡‹ÎÝô*¯};£yŸ¤â]ëø–ç¢¾7ï=Kœ,öWLäß[âê0Cá7az›h~\o˦û¦x)ãÙÆ9¯êÆ"nî÷8í37£}§©/-âÿ÷)¾—nå5—a¦ºÙ/ú²(Ëu“Ó!÷·ò;´¯®":›u>SΫÎëMDÝï¼ÐÈázwU®»ŒºhÞ7w½¡ûUs‡ëyˆóâø¹ëÍóîœÙÏóÏ«/ôRÆ Šä/(½'Ü|7ùïËîÓëgÌÆì£z<¡ôSg½Mþ%ç·±ï¯æüîОÂâü׌}zý¯´Ðo人›ßsÌ2Þ<¯Ïþ½Š£Ctüû ñ_Ëyëò¢^WÕÍÿP|ÿ¼kϬrzuâ”ë}jÙE¾\éU…òÃW¼ ·þÙq†\çh¼9Ì~…Ö¡Íi~·=×¹l²¹ZŠßƒZQGt3/¨º8¦Xêèeøïƒ(ãcn÷HÿuÎÈ?~ïõó[îS©„Á¿\!ô#6V×óåœ?Gwη5ÒóNX‘m^?*òûZ˜×™¼çÜt:ßÑsš÷m¾ª<~ôR oÓuÀ<âà¬î§†ñÖqãó~øn4ÝÜ”qYÿ(Ý:{ʸuãñ’PSüV¡`^ú²›8?Êóv:÷¸ýo‘ê±hKñÖT7úhÄõ« £Èz˜ØQ÷jÜIýüv‚G=æA}ßóŒ9Þé$êJ!y—¨†!üͪÑêC_vS¸ëß8î×ׇfì÷³þ,F¸á4ýóï>A~Ñ?£}ë¦ÓÏqÈï¼¹ÍßùÍñH)šGJ;¾NûÇÚÛòàê_£åŒà¼b=¡ê»¨ u¥¨®7¿ƒ‹Ì¸¯Ñ>5û¿õ1eÞGæ¸0LŸ*åz ouy}°ž'üå¤ ‹f“¿ÔÊR—©.òÆÅò—§‚®ôÓ;)ð~B÷à8cÜC‰¬§Ø|qDœÇ޹´ß\Íxî¢WǼpTåúÀ„FñæéÊùô³È«ø:ŽìÉŸïAòõÎ<å8Î÷` PÂxÊRS²¸n7³?=Ça§ý¿¨ú‚Öq"Ö5¾*¦xRÇOFÌvÂùyÏ3î¢/q„ŸÁà“Nã¥k˜´ßüû'~uÉïÇHÒÁôN3~öÐ7).XÞŽ»ívúýh‘×>ôq¿GÖß<´‡ö•›†Qüt¸3íkû¿Eûü”Ÿ˜óÞySi_Wx£v–÷¤'ã鄊³þZ·: Üõª™´®µ¿/$ò_3Åõ±nØÎÉôý5ä뎢:šìçƒMÍùGÝ8œ§u¼CÇÉô5ÏÔa\"ç1Ð_¯#àæÍ¤sö…wqÝ3ç0½1í×°N÷u"oÓ^Ôß;Òç–ñ$òöe¦Þò‚9îõñ5,ùìAåõ﫚ø{¡ôp”ÈÖëò(.ü¹GÕÞ§b".âýÝ;ÅûÝòãáš›mÏOBÔõ#—9ÂŒßTzËþÿ%.f%åó1ö€—ò ÇïJ·™óêª?Ϊbfó]áw?È?¿Oeýó ÛiÎk­3×Ùü¿Ob¼Ç?ªÞáÿû{aíaŠWjÄóSQ›¿‡E?&?nåPú|œgÁì©ä\’çÉŽçwYÇc¼‡ê3Â;Q:É«™ßð<ê ÖóØ*ð¹I\®²ðqº_HT¿ÅwåÃb}:â]úÞAð†P™óú³D~±[ÿµúÿgœÆ=LóeÁPsž´!¿_[xOê{ á}¡¨Xï'YðÚ«Ÿ3ã3³Eý«%Ï—Ñýô|Òè‘Æõ­ƒë˜¨.Ö³·Ìqª[ίê¨Ï Ò5G±Ž³Î2zoÏÎÛg®ïwˆÆË@æ½lÞ©çru]!•/ÅTÖ•-+ž›âÿþÛü¼1À炱«ÝŽ+Ë?çÖ&ÿr,½·hAï‘ÂÇ{çYü|BY=œýô¹$N{ãÄ>²·~¿ax9ÿ8‘WCÑhym¬oçôþI~è}Ùð¥EÔº±•üC“ÁÐÇâaI]®oôÑy(ŒãÁT³Žÿw~b¨dÁÁìXcæc÷Òë;Ø0üÔEUôï{Dc·¸Mà?\ó¢6CU}ŸöŽY®ûªÙ?õÇ©–^½$e¼Qßùwަ§£ç¿µùw6={{PýRÆY¿Îì×Õáü’…w‡íÔ-83ÿ ³_rÖ¢ÓW“qsX/º²àc—þîÒ¦ºNªGÓ‡oÀ}w˜/†1´aÚt"1štìÔû†\î/ØžóàÅÄýkËqž¨ÿôxÇ­)Þ¾³?í'}tþêºÅ­¨ ¿GX¶‰Ö÷¯êqâèÞ´ß0î-D|ãÅ{%eX;Ã<ÏyßÁºÙ„;ñè{Eÿhu’”ë͉†ËGV¼8Ö†£D þ\׿ª­×ù÷hx…9 "åo1ô¨þÿy:_[zÅÂcøç—·Ô¿«&›gÆìÛ©+öiÕÇ8©ë¨ýKÆCè“g¾¯ñô<1ƒu—;±~ËΩ^ýI0HÖ—ýq»Fãc+Þ Jr‹×iŒ}šÖ‹“æïCåqýÿ¿#âÅÜUø2ëýdqQä=â*3^°—øþ¹ï²ÿÿ:NNîCÊlþqXÉó3ù|3eRBæ…lû¢ª· œeßÜHÀoë¾Ï86ï˜ðëG¾)®‹k* ë+¥gô8§5ÅãÎüák{~•ç¶f‰êò¤ÜG;ÎKKv\Ÿ¿Ý=ßÐÏWá¼Þä5ùªg`½/GÝÌ æËûã±:†ñúÚw±9O¾¶ƒŽçe¿Mƒy*oíÃùpY'I¹^7Å÷¯ZðzÚü¹˜çËz’ª®)óƬãÑ1*ïÚпh‹×åﱺå‹G¦8¥ãû[QäŸÛ1?õoJçÀ¼¾ÙtÕUß!ÿ¸7Eþrý^ú½Ê; þÞýó®¶Ô?K[ôåZrÚ¯*ͯ.–½©ÞŽ¥GôxeIëŒè‡}Ù ¹Ì‡µø)ïY{â»c¤^—ÀŽbùc¡÷×È‚_bÝ\«ótýüǪ,óx¹¢Ž´HàAŽEËÉþ)úY;Òýþ_ý>¦S=Û¸ê8Σß4.xÝÚÅz(#Gè¿ßxœÞ³‡ö,ºôþìü·þ¬kCùˆŒ+¿ûëzàqî‹pç=»nÿ?~Žü“{Ò{¥ê!²Þ©x%D~Ï_èsjA~É¢ ôû½·ÒñÃhŸÇ^ÿVåêïí÷À¥Ÿw=OÿxåÕZ=b çO*2^öVOõ¥ÅM•è~ïú­·?AÏcUUÖ5aœxîFÊ e¿æ¾¿Ñó½ÿ§ôs)ãû‚{·Ñý?}`Ç¥ã™KÇßÌýKŸ~þåK×Yõ}:¾ñ®±½]ÿkÓq·§xIé`>°>×­è¹çßsO[,ÿ¾ ‹ý{ç³ßÌÿ^=ÏŒëÿÉßËtÛ™÷½ߦüÐOÒ¸ÿ°èFU6×¹•—ò{¹ßP\¿ï)®ón^­ÞŠÑø'Q %^.Z}ÓмÏâ8eÞßôûp"Ò¾‚Q-éûËù‚Êì_–‹ö|Æ194NIŽ#*KŠñz]tùaš£Êf”g­ê£*žÀ®#b^âE~®½ ÌS¢nHœzý>}¿ßxü€»¶d$žöu%n:%ü¹Þ”Où ”ûmX“Þ¿˜:%Xý­Dq’‡ëë99æaÐëÅ‚ëKaü€¤ÍÆÃC5æY;öK}}Ž1æ´¿t¼ÞéýFÇ¿éë{Îaã~h=ÿš-Áûm{ÂM¦èÙ,oGyO£A×Ú/GU5ûáÜg ‹;ëëÚÆóÕÁUìú>퓹gÍ|Ô[:‘Ÿ²®¥Ouú†îµŒ 0Ý_Káï-ÛÌùW æ8qôOxý6óŠ}þëÈÓúuFÀ'c?ò¿‰åWéÿoÊ~_5•ŸþÒ`ο×á|ÒŠ¹:âw‡Á\‡ëòžÇÂqxºÙI®‹ÉSQz23éùoKž“.Ò÷Ë~fü;ŽxŸ;ÆèßçQýï6>¥šÇ¨)pQïòKá· fœóqý¹¯æ ~\š÷‰À ÑëX×7#q}Ò†ÃÃÌu¥3ÝÜMÐ?oÙ÷ƒ×Ón:؆³’æ}¬‹`½Þž!·îüíkÖã+›æÑõŸË†ƒÆˆ,ú¹âÇÏ ¶è:XðŸ¨nÑÃÙE÷‰ž$ì>„ Åœ,ÚÖwÑó eÙOÏ¥<=ú1?iÖ!O°†uC:~/Ñùé×'™¢OtZ<ÏûèùÛ®æçf3Ô: ×mv›Gìç©>îhœg—|oÿ÷ót ¥û—r\1OõÆ-ûý>nü»^¯f|¦Ÿç=<^.ˆ|œÒ-«ûEXÚ•Þƒ^Ïéëî¢õãæ<¤û“‰§‚~¿ÖëdÁIæ-×õîN‰|(÷˶=‡¤ …Ò ~ÛüýaÔ±àó˜ß†nxç¤ Cž3ÏËÇž)n\÷ùûEÛh~½Ò×õÇù?ÿT—ó‰ýo¡÷¯û9#ç•ëUì÷ßu†ÖÙ¼ŸS>adò+‡4Ó¯7¯©^?Wõ/©#Úžóv%ùïÏ×mx¾¤ C¤ŸÅù¹ Gƒ<‡pÜŸÑY÷£Ñݬ‹‚º_sZåý¿Wy{®3bâÎÀýDå³gµßûù ‹nT¦ Û‰ï‚É?5â=ýùñÌ ýï²OÍd¿™—TuKÿ:޼ˆ”ë}65ŸãöŸw¾îû".]«ëJ¡¸·#ûüäˆudÕbãõ0‡ö{¿^GŒÃõaÌ÷•­¯kÞÏ8(t+ý¿ÇìC‚â·z¯&ƒ›sí.¯ç¦ólzþq¿ öƒB¯{&Þû‹ª!xƒ+ƒy^9œ¿âOÌuó QŽ×±!fœ¬/`7>|¦¶œçØ“Eg¿U9ïÒŒãZžOÊ?Sý~Rîgÿ°Xù?©+$Ÿ/²¹ný ~PîãeEþÕ‚oLGáRÚÓ>£ðâ(õñx6Ýû&­k™UâéÉJ}t¸:·3e¯Óûž²¯n(CüóÏÝž/fý)n1t¼Ù-ß_ïužçíú;åÝ]õŒ¤?f½¿Þ‡‘—Œvf>(š'“÷÷ß÷²Áß_ /²›G„l‹­(ðY"ÿÄ|zä~®Ç›KÇÅÂÙ£¡%nXþßúûаñûS¸Z\_;p¾xDœP!š^§Þ˜E~»õ¼Vùù×-dÁ§½žžŸæë0Ÿíkéã„6æ÷Bæ3C¯«xúB/•Ÿ³æA}¾ž´äÓZêC§õ§+®råöÕ—g¿I×¼ƒñÎh@ûV¥—gE™¸ÈÏaöÿûãWsÞi_´WßïОpXPE[?¤Þ‹¯+P:„§ß‘׿*æyà]àë–àãú¼à¶þ"¼šp¾Ç‚KÂPÖojeñ;Gv¡8„uÈÑ©$ýŸ÷õ0\ Ú¿LyÃó–¿×~ì4â/ãjƒý4Íy¤ü€“Ì'z;8ÿa3×>Þþu÷m ΃æüÜi]ôÞþ7ÿVéb¢¯}®7çáþĤ~FSâùã_6ÃÖáä¿Zü„0>šuÜVGaÄzÜ$ú@(PÔæ÷nB9QOáýäÚ‹ÑöÃI’åív5óQ ¬À ¬À ¬À ¬À ¬À¾ †Ü1ÁxÖV:þ“鸎/îmäË‘òÒ˜³™êµª/Ð0âç`o;çñoæ[MžD?Gަ8ð@Š÷öN1ãè§›ã‰3Ç }iœÅYçîU·ºz® ¼g©ËöïFŸgßï)NªbÁ‰yŸ \ïZÙ+0.ó.0ŸæWŽ:£Ì ðÁ<)©“Ýöy§z$¼£×çFs~âY…8jΟK]¾BòL£8ÎFù#¥‡>5œò*èĸ…Ç»†y.ÝÝô7Âòßx¤Ï1ÊϺ=·¨†ÿêØÊÈ;°ðMüóÚý.x> ^ª÷E²º„Q £Ö_ýÿ+\qq±m~(_ù"a†:ú¼N—û>Ÿ©7óRx'ÛKºÕ;q>¶¶X/¦>AuŹÓ)Ë:W²4¶Öó¥M-ëh+¡kØ’óNƒ~CïïÒoBó®t²¼>44×SÆï­žê¬ÓÓ]ð E¿^ÅÄ(—…"ü÷×ã錻ºXøt‹sŒùd,/MÏ•q (±~5È /ˆz®#ŠóJ |Wït|×ÉxãÆ5×ü:&PaYéî kÅhøŸÆ¢îЧ{ ?€®gµ_\²àè°wºÎÇàz6–çc]y×s6øþ§ßò÷›kèëË8Ö›h!ÖÜ[Wª/ù<†]§ôúè 4ï súSQ÷lÇü¥ÇÿBþÞxæ«n{?Òþã}&ð¼²/rWuKôc?kV}îÝÓ¨n6|§þy–w§çwý½N²îNZ?ïjÏçñóyÏÑ’pR¾¾ËÔC:ìàhz~+ïr«)½ØnŸèûùXK'÷¯ô¹×_KïÏâ«(žØt­±^…Vf\²çgÇà:®šŽk‚×IÌû—>ûîgüFzõ,ìúTÇW¿éˆ êí†CöŸ^¾§ñÙúüÛç„—ô¯dÁù²ëëßõ'œ–´¢Ÿ]Ù_èÎz½³ÛÑÏ¡K™·#ø}JgîCÆ9‡øÙÖûí¿Ã̯º*OªúÖDÆ=M.Dó¢=ã[Gà ¡¶þ>¨Ï­ uD?^ö–ýflæ}¯ŽªÁÏë ¨cÛ‡Uüì?|¼¾žþð =·ýCדêEüRþü±àûQ:dÞg”ïHLJM½èûÈýŽKÂõÖÅoš×¹‰çôýû¬ðK…^=®®ë«ý9¬Óµ¶åQ6}AŸ7„Wè¸klÓqz~ݱŒ“œÜSÇ«œ¯ï>™ãµªÌ[ó0¿Mæg±ð{nù,Îã¯,Jë/ãøÐšðB’'ꟷ¹y^䞥ó'¼ÌK9ÊÇWa~ØóÑðËØWKïÛ2nz×RÚg{ë>y_8úÑ£zÐ{º¢åÍ9¯ï÷yœJ†3n‘óPŠ!uÔ^¦õz^ˆ>Ĭô}&§ÎWZó*1>ÕÌ_ANý7ŠŽëš^:Ì8ì¾nzý(²7e¬Ç+_¸ëŸ_Û·æj>¾BÈúÍúöÈû;á[å~Û…òÈ5ã1aÕÃlúšwM |1õ§ôþm¹MóW“ê ‘®¡«Ùò>yÏ"ÁºaþzR™ù?#‹’ÿ4ÜM·ÄçãÍøíK+§ŸÕ‚ýalk™Þ¹£é{Rº ;ÞH„OãÆsT}”oé‹§ŠÍçÓ†¿cü<¨Áõ‚y ¼¿ü6[üe=þ\7ÊÛìo«~…ŒËG¿3ZQ}Xåï1¦ Õ‡7ÜDyÑJèù·ÊnusêÛ‘rýñíÁI(~ Æý‚üÏf¬ŸšÚ§W4×ý¹º¿åÓŸ£â;a[z’1ÛÌO缓w6=}b[ÿ2ÿúÍ,}Z–üÑŒX¸çÒsŒª[Šnõ Ÿß—•̾£ðpØ“™PQêzg8_9…Ÿç0„ðNØUUç#©~yÁ|6ÿø*Bìs/è}j‰—VLä½Âª_SÞGàä°ífýÙߊû½ êÊÕ‚ù®þqu¿Î£pw…ÒWÿgN‘DpdRŸGênÙxõXp'Õïø{Â(ÒƒñëYĸÅÜtjlf«{)Þbäñ0‘öÙeyÑÞÿlªCËú Jðû¡~·øs)¯†}tþê{â¸Îœ—:\ªÏªéù|[ßQWóõWÕ4®W˜Eú¥ÞGf}0l¨¬Û"ôÒœõ~ëy¨Ío‰kŠçz?K¦ÑóÌú‘‹øýh`~Î)ãd ž³ÈàŸÏ;^ŽÖƒùÔa:p(ÄûRK]×Íù1ˆ [ʺá×*Ïì|˜Çk+ô½ãHîŠN:>_éçZÏ+⨳w<ž¾‡Ôöõ ç˜õ–’2Œ¨š¨Îv׿—v‡Ô‡øÞŸb⶯ Ü_°bœžw_Íú÷£H`6,.EcQ÷V†êì¨þþßGšu0ëXÔædÞ G]t¡¯¯Uz)ÿ2û6½ÎñãÕÏâgj„Äw}*Sþs_¡X: ÖûÿŒõ‰<öHþYEàÕE ©Ã‘”Éú·Š«ìÇÇÓÑQë±k‚ö'"í‹(¢ß·wÆ‘¿q1ý%_¬ßi³ÎÎ9®{°^4®ã:îì3níM‹¶£¡qÝV<k¾¬÷7(Ïz•˜+¸ïËÜeÁº7¹Chý^Ëx‘&Œ³hÌqýÌÆºî™àÅ ççǒΩª¤\'¯¸gœã<ÂÈëƒïÏ–ÏÚÙŸó|¿ÓOé÷¥ÖÑUÇ /0í¸Ñ¿Ã®Wí¿‚Jnq—«)>WÊu/¾è’ÿû–/ «'TX|õ,¸¹#Áù~ïüeâµìoO~ EÏ Õ„b™¾>Òvæ#6IS¯§4×;Zq~¯—^GWzB>?¯ï/ih1ƒòQRw°Fp~)eßìß§?¯? Y?xùÝX·M¯Gáöùªq¸©9Þpå'fÚT_2¿ÿùµÁ}9T¾£¯,ê‚èK|Wlè¤û#˾­ãëëïUŠúœ=4/–½‘èsBþ¼6=ä÷LgŒ7kt¢õ7ïl²ý­Ð€ßŸ¹œ—û,ž.Vʸ¹Ç.ý”ü!¥gf=¯¨#þÙ’Ae®{–7×½-¸í¹éaHGš×³7™ñzcséçêZ„Ÿ>cñ/j(¼ã“Â}£0¸„>ÿ'I¿Ö‘5TÇãa–ˆ—ëH¿ºFFô›P‰~*ýO xåÚ1ãe7õýÉÜcä7$ÿÌïÒÆ¢§¾+„ï5²½ì/£^4|š÷)ø²Ê!çÉüÏêéåUǦ·^Àyâ]äy¼àD,¯óýÜp'íCËŽè×?+ò!ú”i߇үïÌûYSË~!x/J'W‡ä3~¥Ç "yZÕ“~Î8&p¸ ð8Ö>GÛ_ Î »‰ëßÉô½ðÇ-)ò5™—4“ê½~]òµ`? bê„2¿W2¾@Ñôêƒqóe_“ü¼¸î‘w½Eë~KËyÌ;CsÖù(8‹Çÿ¨oSÈáÅ‚ëÈŸè8ö±Ænõ(d‡ð?‡~Mß¶T¢ëu‚~Ü’Ýä—q|ˆ­«ƒë䃄Ñ.¤?EÏxóËÆKQ8ql›DÏkü½æº})ÁÿnpÞbËÿÐ><¢,å‘y=Am¾®ÅßÊ”ajuúœS_ÓqýU-:¾¼¯cÄBòE¼©úô`ùµ„úÄâ·LeýþEOéó•qD²¦÷‘È÷)iòD½ÞÍu<õÐ%âî|Ü'aþ»ê·¡ÖWäO7—¦ý°lH¾}ÍÝfÞÂü;(nÌ.Nï/ç$¿Î?¾åÑ‚ýÌÂæ÷ûè|) .DêÏHþ¨÷¹ØÏ'äiçû}nV¦Ï1ú3çÖ®·-É2þ^ògRÎ[GùI[ÿTŒb\GEsžIâ$üó:XòYüþ§à+F=Hxôˆ?ç'~¸â‡ªë(ܣ׋›¾AóõUäþ™’穇{ƼŸc:ñ²±â¨þ^²N‚>ã¤TÜí×€ýçéÞÊø 4ÌŸºwÒÐ:‡Oêï“¥ÞêÚÁû Mœ™ÐRyÙ¨xl¬/¾ä›®N=‘Oît8Vü‡Ê\þŒy=¬Roïà7¢ÇÇ‹÷Rü]Oà¦öÜi^·wýšu28Ï;òÂmZê2þyÝ›’Ÿ$ü>䱞CÅÃ+þÃÖÛé>˜¦ú}a õñ´ÇU}80{-íþ“hž.åz–>‚ØrþüûµsÃG̤ÂF|¡ãôWr]¨ºÐ9S<Ë6¼žÍrÔ)šÑ—Î[õÃH<ëþ´â·¼XY3 óƲ¿Šê^ Í:†˜—¾oôú5ÍÕ·/Ÿ¥úoûÿŸmžçRAéøÿx)™ùÏõBôjq|,úDc×_ûäÚN¥ãVÏÎ(¯‡*êõ›Mÿ6êbÞ¶xïù2¿`ù”q;¯FˆîHúž1?˜7¡üTàç=æ›ÁÊ  Hå,¡ˆF‘  äd ÆÆÆ‡Åëkcl¯íc ¶1LRNéû=ª[í¯nWuU‡w$vçþ3ϼowu¿ªn8ç\ô©«¯WeE<Ç‹ ÐóÈ0ZÅÉþ"þsœOõì–Ofq\Ãz9ņ7»ùäŸÚô8¾sêñ§ý)O¶µ½:Oê@ýÛ¨ë4ïË týú‡ëÆíkÈK4dùÞGJæW.. =CÜ{åê±ùÚDùvT&éÄøçcáÓp¿´ Ånó²~?›ÞÓš„ç”y°íê¸8›ô®oQŸ«^DÓݹ˜é߬œp^ã{4ŒÆÛÀ$QßCÉ=úçpû ÏÍ"ž×ßYü¥Í#Åún¨Óp|´ÿ¹EØÈ[ìà¦W“iÃà_ëy7³ôz!è!êÕ<Ø®OûDx´7ÔµØ{ï}Àê2óª ¿"¯‹6j…ëEYò‘dxf™ïÆð#ŠÞ º ÏÔ ¿jÃ!5ßëY1îa¦ÿ´é»úy¸PàÆp­ š£óÇ:ºå0ñ¡ù)T`ùãSTÿ4;ü}ÄõuôuØ”ÿ®Ûúç[¾&æÁ¯|"â§™‚Ç*û~b¯èÃýŸ‰÷¼ \ÇNÇÇÛ s® Û1Æý”óÌØvÜôuüúËhCÜSÍPo)fÏÁ›ô~ÑUªž'Ú—¨ß_Ìø• ç14àªÃ„æáùTÜ|I8þe¢ÊoF–7¯A×Sæ ÊYâNÏô§Çr=¬n¤ËDýî¥^ÖÑ×iŠõ¸-¾^àŽíá¿s6Õ³ÖÕVë4ÅÄW‘|GÆ‚§×‰Z¯wÅßûÛ¿á¶^ŸçKé÷f±ÏË1ü Ç-mû0™îæPáGz§)ž‰å†öÐꌡíKú÷dâ¿Ä:3s¸ø=³…ž ú„ãS#ÖdÝÿì5B„pÐ~Ÿ•5Oˆóg×Íf~ýAÆes¯]g8 7ª÷ipgq~ÿÜ(Þ5i]¨M7pÞÇ)ïqq+õüÛ…¿/ç-ëÁóëFywÒM:02nó»j²˜WfLó áCQÞPž¶(|ÞXy­: føÆ~?Ð<–Mó$‹/Ñšâ­·D{.)Ÿ-ëðþõ’º“Òèñ3ÊÏ××GâôGªuIÌeyÅë/uÔ¯ª~^{7€›ÔÝCïpÎø{±yý2Uϣͻ( ‰á-M8ã8Ý(.çy{ƒ®1æMóéúŸOù‰úûVÿZå]¼iÐ ½Ô-éeùSúÒÇp1Ö.Q¯kuC½»çdzã^QÆ ²î¦ä7L˜¯æó%^VêD¼i8®ä…ô‚þwîgÿK>ÂÎ=bž¾û÷ês¾îúp¿¥%«Ó÷dïùö·ÕzÙì߈¿£¾§_·vÕ ÷ï³h^jÊÖÇAØÔWÅ{ÞJÌ+Þ{ô{kQ\ÔÀ0¿­Ø/æÅ|Á3Æü…áqúÚ·Õy +žSêÌŽ3Oàç1«³v½2Õ=ç]É kX@|¼q„ãÚüLxýî–§Õ÷›½¨Èü„É"6é `÷.uýèBzmDž#Lj÷ÑCøïÙS=¯‡éý¡xZêÿr+€« Ïgúº0+Tdç”Cïù/Õß)ý<~<“nÇÍúþPWýz·jóB,VИޣn¢N‹^áz è ÖEWÿv†Ïƒþ¦Ç²¼‰¿ýDQ`ñŽÑºÞXÿÞúú ½Èß%4¢¸Jâ£HÃèßÿ¹ŒOG¼ ì,æÉ‡ÇñNèCº¹‡iû†ä¿’_!q÷(¤úl56Ž;)ü³¿éó‚þºDõ0ô¥õƒë¤ÐïD-VëÑÿví×Ñ,Yý sÐÀOâëªÿysKÞ]ú}§Äü/õŒz‹hýÌêC ú†Îÿü~ÉzªS=ù`´øíeÚ¢ûu­èSiÊ/ ˜žÃ±ýCãh__kª>ï„–„ã+óØ{ÐMå¡2=ÿ<¯ÑÁ¢ЖÖëÉÔ÷úÈø£g ½6ùíEtÝ«P^¢™8ž÷/Š#:R|‘"ãÿ¼†ª~Ž)ï„•_'¼2=w ·,¯‹ÿU7^N ~íDëÁÆôõΙs WIõ¿k¾&Ö'ÞõßçÇô$?-~Ô¬G×»»ŠSE5ºÎ’ß6]¼ßhhXï/º_5ý:àÿþãôÈþZ5)ž›"Î=Ådž?…ãgYÞÞÇ›´‰†—G~‰ø;è—zÜ?ÓkGUý|‰lÆë}›p½Çïm‚ïûýk‡L8»+BñMþ~ó/¡ü€>äo·Xiqæ¶÷8‹~ÇqýóíûKÔ§Ö;aÈÿŽ'ÿ·À€Ãèõ©ÖBwQWD+Æ×gü[´ ¸—pâ˜;UïŒ@õo©/îº^<ÄÇGÏSÂ?ì)ó-´ÝxÊ;¬ Lm§¾?ƒwÂí™ åÈ/íÙ Už֝ޅ»ÁÀp¿ÑÄûD{–Ê ÇíùÛõvûݨCu5VÇðû¿®[¢Î³SO«qÌ¢B±5¢y#‡âïk–‹ï{ˆùøÿ‡¬S®Ü´ïÛÎëB14´|Oü¿YÑà—Ë8©ž[~Þ{>|þõ^5Ô½Ÿ‹V/põ[‘ `29Ï%GÔJ4ºvI„£Ãpý|뼑>þ’:G®ãøx•âôyzž¤Î]Üóu5|û±ŽƒçlÆùA¾Nö¿ øÆ»ò?§øÍÏcV§÷”é½ ]ºxJL¾B÷€¥îY.ü½rÕÛ@–ê_É~Ÿ¶ýl:ei™Ô‰‘ÿK?—°¸©nº|&®×„?Ôݤå>Ý#.&0Þ²uáñâýÍôq&á_°iA¤ãùy¡uõCý #o´åm~@q‹E÷²´,ê¼ñe1TÖ×/ŒñEþÌD¸IßVöa |nÑ“ÄeL´îýû8ÑÖ9?C½+°ó‡Ð]ðx\óQ¨¯Ž!õ”¥^¥õ8ã]‡¸††é¾WÈ¥øöhļÁè{cé Hó¾GñÓ…2õ¥GwUWÒô¾q¾–÷Q´uɔǷî÷Œ£ÞumÊ{ïŤÓ,ñTþÿ¿¢ùݰ½óyøÛ±ÇsüÝÆýO²<Öc¿îö~K\½±ÎX,pÀÞÙhï%Æp•m%Â2¯ø$Ÿ¿Ö*¯äj¼ÍPà–gù¿ž4ïQ}Oöåó v¼'~ç»—4п/6]L䦫µO®«¡‰£nÓ¡Á’ÛDaª×gzg¿ [>Òט=.ÎMäË|·ù{·y'ê:òe3d…Ç]¼>Ø¿B4ÿµ2ëÏ£Mfy=Q ¯×ÆÕ(8•(Þåz]i¯ƒþ¸‡7@å™xä~¾¾ã‡1Ü…¬ö? ë$¬ßÚªóƒI×Ðß¾ö—SG¸á[||n—á¿S—ºá£Š |Wâ%HýDä.£.͇ÔwUéÿòì9'™ç¼þžr ×ùÁ”µÑp+Õ#â‹N¤[‰jèñ»p}Î|ªüs“qî³ñꤿø|¸žß&ùG¸åF‘þÜQ?Tê4ÖãXç—cÑͺ·žŸu‰^çã|³ëåÔ‡ޓճÑÔ¢SqSA¢ç[öˆû4ýÇb~ÞóC•gW‰åÑwœ¾þ?*nx–Š“Äž™â÷\WCÔ/ö^¬âŽKòD]¦áë÷ 묡_uà¼çî5›}¾f*én¿¡ç?É~¬¦¾Ø×0ü쬽ú:Ô Yá|Š›9Å£¼N‚Zêõ–õEž ¯F<üÆ_ÚAÏûl?ß çïm>©ÆA+ ¢ñ­ÇõÓþ®çâ<^Ëhu?Sß5ãöl]‘¼ãù̺…øÞµÕ÷|BUe¡ðžaCq²u2 ãNÏ/úéu<’²Üê±þìÔGÝçCËú¿c?í¨–)üºV–WÛs2Ö}°êî^½-Q\Õ°ì§Nú=<oï‘=â9í>[økL']â"8_Üÿþâ-*ŸáŸO=†Ã˜¿ÄÉï àq1Yvþ3#÷É;mý±ây+éÇÃ=sR=\Ît=¨¿ *R¼lÀµØ,*.Õ,×ãîU±â9ï} N&Ç€wú$^>Ï—ôq×ÕOd§q±¯ðV%ýªÛ|nê3ñnun,é§<·Þ‘tq¿åw@¸~6¶ÊHþ›Ÿ ûqqÅTê\ÅU¿Ô:®Éºd´êO9ö3çË£Õ5wÐqµ~rʱßÀÖ¢ŒâöüãT°|ßâƒuÕ<»¿zÀ0ÞŒ÷cÍŸ>çî6úúO¶[>PÞ?ï`<º¨¼<Þ)ªÉó@·óã—`¥®³‹å_x'äõÓQßP'´éÛר¯œa?Ì?ÎQÊë1Üšÿý±tð¹ÈM–ÿˆ|<©û³¬»ò¾ùëüœ¬ðýÁæÿÞK½h÷ é)]tS<]ã–‹å½1û‰Tpa¥…ŸÇÊÇJ—(qÄÖóéýd¬ëjîª^Ç¿õÕ¸Ä;í†Ï”yŸèñ67i?x,ñ¢ñ[E›oð¨×G뇷տoO³“Õù ù¸Àq}º¾yÇõóTÒ¼£Ô3œÏ<ê¿y»D½³ý´¾ÑôëÇ7èÊ>®íy\,õèÆnWqœ†u£éØòZh¤÷çy‡]‰])ô}Cè‡ZxsiòJWÃxUÓñ§Q#¼†4¿ÞcÒ‹^~Šg’:°„ GÓ·0èj„çC-x¿®Éô£Š?ÈqÝ}¼iK…èã’æ¦Ã¯ªÉü«%]TFu¥’âÆõçýó¹èùp|ûýŠ<Õ÷§×:çןró‡$¾×ܬâNfÓëtúåàRâP2£?÷Õ›')ñ²ÉŸk¯^iêç}BÏÏ¡?/ñXD}’šE›ЭSèù¡³AßçñV6uÃPßQïl²¼­?^u串¯lˆÇlæëúúmñü·óyß‘oÁß3Ý«ê¤Ãòi†ô "öÅñÏ+—é’îŽ?®Ôµ$âÃÒâÛaÈOÃñGÓÔz¾ÌïùÿË>+ÇãJB.«R|/ûEöû¸tô¹¡Qø}áõä€d±Ê×CÌâwüó0ñFvVëýðºqØ)éáJ¾k=4°LÿÈ;âˆY·P­÷V.åx¢ãµÆ¬÷D>î®Nú8ËÐßÓyÜ:Éö—ú2±¿âe·<.éaf¶^—jܘRyÏ3e(Ò÷Mý8WÍM†ç±ô±ÁŠ­*_ªr<ÿ k® ¯ë-»XðÒ·ÿQ¬õ óïÊEáþ…Wd<~Ëhë1.ºS˸ï:¡¿à9mŸ@”Ü«ÆÇÄ/A!}_žp³f:½ÇQq‹™ªÙôñL<$tý‰“_bÂ9™pQMæalu×ë‡t_³Üü,Ü(ø%§ã­Ó| ®ûo¡¿jÐ'ˆkè÷:ã“DÔwm©2miáD}¢Ç×ÿÊ1ïô¸|Òiãü;‰ßõã w¤âñ<»é¹–¼T2¼þ´©†–Ñêõ‘óïeFÏ̦/æÚ_Ò×ÙhH¸ª{óy‡ë±Ëþ¤˜û¢¸óïRó˜äߣ»Þoâ¸TÎk´ž7ãCúI·×÷IÄТŽnˆ§üñbê"Æá:+µèïîçRÅóDGP´FïïW3ðšE¼?ÿ"žÄ ×=’™ÿ/þ¶ÂÏyDã~RêeR§Ûv<Îû±cŸšJL_ĵŸÜ¿Âç+S?FCŒîƒU¼{–!H:ݨO×{wá§œf¼zƳ‘q?æLu÷}ÏÆêï‚ÙãÅ8«ÿ[Ü/ƒŸçªø}–ü`ܼÚ„÷m5î·ú¾D8 Üÿ¨ðÿ;±þ€Ãê§êq ô#ߟ©#Ñø‡ãõ Bã­/Uû™`zeá77$¼拺d¶Eo³‹Úßш·¾Ì  ³¾²›~\O}¾BæuŸS|Æõ¯½³´^7'¾àNáha J£"ëÇ÷–œßæ‡n¬*ø`Ûw»Í1ûØðßÖýk…×#ÐÉQ·‡ùµò>q|RìóÌ’%½U}mKþmH—­&>…œ/]ãìÿçw«y3Nȸÿ¹Éô9†?qq±Æñ˜n?Š(ÞJº=c¯uÂsð8Òf¸îsáƯL¯3Óú”þqR¾®®†fÒÕJÈ;kXûŽ›ó¢×ôŸW ¿ßØs{<ÞΪ:zÜü×ôëŽßÂpÑêéŒà1±c”ðO«é×Q ùa¢uR®Ï˜5\àòæ­ÇOø©Ç=r“ˆ›·ß ÖgŽžoï0ñþ>³ê°2Ï×KÄÿ·–Sõºîú‡Øÿ޹b»¹SÔ<ë ¡‹}Ñò¬hËqûØ48ôýÚßDêè>ß2\õßg»õƒ±¯ªc_¿úú|†Äm÷+6ø•U"òq@~=ÃpÝMúÀXs³š¿™:Èé9ò—®n\›Îqľz²‰ÔƒÆô‡ô¼¨¦_{ãs‘üX×>ÊÈçcÃ…¢Ïåáø~Ç~;þöm3ƒ›‘ºº<>ò¿/ˆÇÏÇ-B÷#Ãu/ÒîoŸÔlù[ŒþplÞJ Ÿü{ÿÏßî®¶©èO¦m˜vs¤uåÿŠaÕôüdÉÿ\'p˜/æw[e\©ò:¤®YäóºqE8ÎísYüHÙügÒ÷‰š?EK©#“?@}‡M}ºÇ«eàÙnØ.üÇ„ú˜þxÓ‰_xŸf©{….Ý£+竺íÝò»¸ûg¢Ÿ*ñˆ½7#®ß²BÂ>±6ýÇ´ÌûŒÕ—"þ^dSýªn2¼6Š^Ê,?Rɰ]C^óÊþÉt>z°þ¹‹ôý42e\7Ùÿ¼}:}£­Ç—}Ó ãÕ‰¿ìæ6èùu ¿þ¸á_éæ ¸Yçý O‡!Hë”·y†Îáú†þöÕ)Ž‘uDCƒ¯7þþ gÇÓïÑ÷÷2™©¯³­O%®l,ô›³É¿2ô‹ÅÚzâ>–‰ßÏb: “»„Ö/±f¡ÈåÐÿž¾_æÏ´~ð¸ZöÿÂå«õãOê'ž—%?Œ'Wgùì£ýGÜe[½Y½oîVáGK¾ÀmÍU¼(ó“1æÙðóuÄáÙ ÅbÝs­Û¸ê¯8¿õ /4£‹úù½§TÆ’×ÔüæÎöb¿¦ìù:_‚ãey°µ,¿ié¿ÂÇ |Ÿ².r™]X†–êúŽÆ"¿åÊP}Šô=8ŸDÆQÇÃä?:í'ñÓF^n'‘7D÷ÒÕ1Y€_“W‰ûW(Ù§®Ó5HW3©þèIƒNò°3á8‹†T·*x‹NÙ Ûå'¿ù?Xüˆ¼­i´ßcé§a2 š.ꋇÂó–&ýPäü³ü˜zõhýgz^¨MõÀ*éä%ß)é86KÊßAßUÂÏç}À x‰GÁ¶…ª.ÆÊýá|ö§mÞQv?óÄ{ÄýD©‚îôžÝ^í¼ðêpS±êŸVÌìõIËÐ5<-Çw·þŠtyH™^þìn½^äçˆÿàkÕïZ -<ð|ÆK|#]žÄ{£ž¡^Ý(3y$Ì«×!²ÌCh/òR'K®ïÞ‰xëJRsí¿Õ’Æ?¼xÚfª3ú6~á¨óiÂá'ä]ŒzWqñ](ÇúàÝ\E‹úÏæ‚‡ÇtÔÑ€éÜ´DË/MËgéÿÖ‚xmÓ‰Ö¿ës–‡²Ì ¸VÕ‹F#ÂY4vÄAŒ½Jà¯I¿•i½­ž°R.ád º²þvu“ç|›Œ“òV0²Nx~lB:õxT1ä‡e¼¾A¯‰ú^£ã!¯ú…à{3}:ìzI£ÇÍRóvsÚ©u:Ö×/®Šz,eèèŒùÓ§£Í‡¸µm©ðpù3úxÒuþ7ðøqäÐëŒëþŽci ×dÕ!a8zÉÁÚWÅi˜I}Û¿–‰‚3Ëu{¥N$®Dp4KX®|añ,¸aîÂó¯L¿BâÕ%¯ÛˆõÅŸZxG±ÏûÉfª°ö¿Üø–>+¦çÖÖ¿ µXÞ{æwˆ÷Kx Îo&]TïS¶ß–ï }Ä›žë«)Ï.ùR ÷€É*žØï»¼Ÿí³z_1EêÄ6Uç÷,†×lj‰+¾úܹH wÿ^?åæD^Lö!ÿZ>?øJyò+è{ê_áÊsäx'¬×Sê;`×±’Že%Ò£l)ü[  ²HWZêR.¾EàZ«0?täNëøÿ‹oN%ÎBµ˜û—ÄÚëþò¡’ç}†ò=‡ôþH\ÃB}½3ïvÊÃs>™)NN O6VÅA#‹}ßTÄyÞáð¸Ê”GSOdí÷T¿lï©ø/¸t˜ÊÏÜ|{8áhøutíSÀu4°³¦^¡ža’úâ]+¸ñ/ç œ'??ëúA|eÙoÛvœL*Ð|Ú†é%—;?ùÿø³:¤ÓQÎçk^‹õ{$>p~3³Ô¾"†º‘ÿ=ÓÏ–ë‹q¤®QÔó+³2»ÍäÏ›tî¼ã¤ x Ççr‹x_AÜòX(Î, £bÉ[qC½„8D6ß`àÛú>†ëûÒù#QÓ’§|¸HÕ¡>¤æÍÑ*%½šG>X£›·½ç,yÈò1õž† Ý_ï£S‡ÅÕLy2TµàîF^£Æïï2\]K7ªqü<·z õïš8â kèß T ø‘âŒóåß`ß¼™çâq6aƒžBfÒ­FµpœBÚ¸(ïtD=žg #ùPÕY?÷¹Zoe~PÔ~‚¼/ê±ÿç\M:Áä÷¶ÕãÔQ‡âùÜd}“ÐRâ.j œð Q§AeÊëXê¨Xñ¢“––~hà8mõó¯;¥ÍCöûxYø‘q ]3“W´÷î¶"?åX?@«2ҷئË*ß/›Ž~»xz”iYÚºÈý©Vz™÷Å]ƒE>ð7n÷ÝÖʇßߨ}°óMë6à8¤>€ÿ¿¡_¹­o2®¼.VžÈuýÏæ‡Ö%}áU'Íލcºø|þÓ—¨úb]À~­/I濬úe¸Ž©EïVöõD?£é§ùo½>åß,ï¯Eeü¬ÌúGzȤ¤ íj<.DŸ߆á-rÔó’zch§êºšô¨Q.ݺº¼ˆ}ã­ãÑõø;\çwÖ ¡¯š¡[k Î埰îM¡w6oZ$ÛU×ïcT‰ò£LïÙ¤wÄy¡¦>42ÏT#©Ùú£b’ŠÓA5)ù‹Þ!†+ó%j2ÿ |´¸]O$ãáU3¼§ÙñæGï,›ï»­KœG8ŸÊ„7èþ©þi¿å{žóøþ–¸6¥|/Š Ÿw¯ËOĵ«Õÿ-ºO6=`»\¯ø²ëÏòUćÛðkQW yUÒ™/pÃë•Rž&0~Uª‡¹°ý€¸f‹›M† ”7¹ô-‡uäãûxm†Ÿóލó¯kþÃó„˜ý¶ˆ÷ ¼Ÿ¨}¼QÁ7ÂêxäWâóˆyx”'~TSCž{… Æ`ÕNýyXpâñª;örÔ/>_†ê†yð©ÊƒÏÕGk0?ŒÅ¯&½ÿ{òwÒîãóvs ~l›N*_õ@mƒ®õgê}•ñŸìëµï±¼JnyBt½'õ©ÄKÐûÿj2~2–ïxÇWXŸ0“ÞIQ´øk—©|G¿[Y›×0ñ%¯›«ñßYf™1×ç3‹·FcþhË&ç–•ŽŸeêwí}Høš‹6 ¿ÿ?jëûö±øPâ01á6½Žîª‡õ}?täÝÄì³86lþy1Â%§Ò2üŒñ¹¢Å§ÞIV›óXx¾´HàP'aý\öaµà“ê½s>‹wŒú~}¯Å#ýU£c:¸@SüŒ–zQDž³ôPLׯLôÜ{§ óÉG¤ÿaÈ#JCçð>%\ŸÁÖO*p1õÅœÇgøàLñ2Lñw&~é|õ‡’õ¡´tY|^ueÇ>,ì:Ê~’ÇìðuIÆ·‘Ïs|xßÞ¯ãžçÓKàlü0Ã| ýJïc‹þÈLC|ZΑç^ŽçÃŒ½bØÚYý½¢Íð ï0駤jÃç{ÇÏîËÊ+È¥øéý¥¼=æ·ñՆߋíé[7.jwµHyUìý½Q•øÑgß9bD‚½ ¿°á¦ë3¾¿cþDÖíðØÊsLSÿjÿ¸×^£Ç%Küô~Ëñ~%uY„0X@¯dý¯B÷w}Oǵù/†þ\7)j¿ãñó!R¯ãîqß<}}yBgá¯É~­LWDêöká6ïJ6Æ>¤©cœñ±!¾¿ôÉHþF\C¶[Þ×¼¥ò†)‡ª”ŸÿÑäsH |V|oáCÈ:©?žc=òÿš!++n?žÀqû^~Aà7Q?æ¼ö~´¸Ú;æöÈ>ª²ž†º¬±ÏœÉ0:3}×l~Xâñ#úOqãcŒ€ú‹xãx0ÝlŠÒŽSÐ+]¾+üLŸ÷j53³úŽ9 u«¹îþ¡pÿÃ?nÒþ‚â Æ¿F—hùtŸ¤âlçþ9Õú¶IoÓ¡}?МñX¯^Ô‡,:i¨š¬¿|[Õo,x/Z£ù;ùáógÔ>'2OëÚO-p¼{ˉz°ç,ÃUÎWx"Žocè{né×€aÍ"­OX`B[ÌTwòÇmbù¾ƒ/Ú”N wgë_šiä"Þ—|ßñW«ñìʡõ,þ†ÀÛ=ô7ñÿs—Ô9W¿XúM¡_v(æzÖ63zÁqͤ»h2 ûBÍOg ?#кš%Äúu£Efp9ÒxžWnùˆ©¿WñzùñÖoþ{džVƯÉûãÌÖ‘°íiíóÉõßÇìwcóûy ë~þ\å’n‹äûÿ!šŸê—ê¾Wûé8#ÕõÓ{†ô-ù[ïó„|Wò»½tsTqyL¿äòźW‹òІú¬É°æ5ÿs"ü½v¯¾ìæ½gÑÕY’hT%ËÐ75Õ<%êtö–WRŸ±Oˆºt:¾…?ïjèÀþßÞŸ¦´ 7ÿî|ŸB"Ãã‹ÏK=-ªáòªçA÷Ë!\W1ñms"Æy£ºŠzVVøüš6žÊdü½äÑ©Þæ¦:6á^8_s ñ~´øÍfÁê'2ÿÕªrèü€ÉKD>üÑï¼ ¬; ö üöÊ!J¾Ù–õžâS¾<®aü.}<ÞkŒ“ß‚›_óæÞ±¢N–JÔq¶´ùñ=]Äs;§½~¾Þ»[ÕýÙVåÜ_¿Ð}ï©ñÉîE݃õËÂWÄsrÝ b]o)ô>±ù7ÜÿÊ#*~§¡¥ýÞ_@Nfýõ2+Üúê|³A?ß8·âM}—"½Ÿ•×¼Òé‹…É»ãÅý–>n¸._]N'«“¡M4}<Î*°á%e¼ãþbfëzÞIÂî<)꺌o‹íµÅü»c¯^_Ù±‚¼h}vä} ’/þƒG:;ï/§ÊƒyM©çŸ÷IâÕmë®×“~Ñ2nÇúØg™ÍC˜Ìï`È[ÙòȘ÷²6¿ƒ 8å}$ïÀ?å=PÀp±9ú竦ˆ¼boÁóĆí ^J˜ïM¹~`3ŽG4ï§ù8m¿œï“Ô…Jáêê³õô ‘m]ÀºêúuÙ‚?è»W3è²8öÃÂ'Cyâ‹R]ƒôyt±à ZJˆÂHñ×1D‡p< ª˜Þëxú±ÿÕ°q^4¾ù–<§| fgEÓÍføÞß5ªá¢ˆ÷ñ¨£^À)­óŸ3ëxNñ2ºNEââÛú&PÝ/KUßÚ?¯VñôHLfÒà·¦œ¯:æ}Q΀§¶è[b¼(ÌcûQQ¯µèGdJÜ;Èt-H¿Fê€Útýý zKí"ÖùP+b¾„×7~K‹tûÑËõ„ç Ñá¦wTy}n“^ïÏ*užÛñßO¶)O†¶–§Ôçù/ GÈø¶˜VÍr|ÍÓ(u{¾.Ž¿´$Ú Ì•GaÓ9Çœšê:~Ý~}ŸÐzzÿ„çéPßÂ{<`ÐKÌQý%©ça‡ý~Ô¤8~õ#ú<úìÓáy~OÑfXS]øLѦ[$y|hHyáˆqžÄ×¢Šáz6ˆçGóëŽÝg…ÿ¾®£>/i¸Ÿ¦ºªñ•wÔ¢‡Á® ÚŸ·`ðÛ±÷5›òЄÛE«±¸ Ùä7gëÏC®3Èf8Ï6ÑÖžÇôõjVr«ÿ9êôÒdœKÏ[u}ü%׸¸bëùNó8ñ™qI¸î%戅wü%_µÓ‡Ò2äEì+ù»2ZÏÁú»Å|2WN¨hИ+Öð:¸´¨ý2£šUgaw/5Ù”Õëé½ãñJ²ôù Çç~®ƒOñ³¯÷¼æU§Žü?ÔdquùÌäíeÕºÝÉôë02³ýÀó9{nQ‡}¿à{úõ²äçj_ Ÿ EÔ<Ëó`èì2¾}™•Y™}© ›î Ï˃ŽõЇôLƽ‘‘úŠ^¤w‚Ëþ\ª:ƾ政áõedé×ï¯Äk3øW6C[úýRoú´Hüˆ¿ÝÞ[„Ÿw ÓËm7‰ðõ[.ÍÀæq"ïcËu¨­}–j3=Ï”ûx¦m™Öª‹ØŸòû¸gµ>oó͉‹]ò0çËЈÅˆ<–Ä¥z_c}žI×ÇÉ!¶mUXæU\õÖÏ$Ë·Úúk¥m²¯¢ñ|Î“Ž¤«¡sfÆõ¾ ¼D-–çiQw‡êަþ·í¥ÞW ¦;ÊuÔh¦áú'¯&× änÚ¦Ù™Õ­É¢x¶€ÞÄõµ¨&õR%î#­qQ>³y#Ù§#Sãë¥S ŒÛ*Ýú›ï7Õuì7Rò—”gEU?Û2ÿE54‰6_¢I<'LÙÉø¬éðLg&=<ÔHöœÉþ2ÉÎ.d|z½ÃŽyÀˆº¥eÞqC=ƒÕéåzèOë÷+½–zû—Fz^mzñ'çÓ×§üµ!þ6鎚øc¨I¸)Ò‡Å޼¥ ¢áZ_wÓ@!éøP^¹,nmdéÛÓ_ƒ tœ3¥‹ç‘8×í‘oÑÓ/ë¹QO8S¸Œ† tÊ¢3ÀtppõÉDó>ºmvZ·PŽê»Mӹϼÿ¬›¢{N;•D…¢NÂýNäéç7Œ_(¶Ÿ<<4äÿ/ý"Ygj3)<ßgÉ¿ðºJTCë>z¢ñ…¡g„ìttù¬Ç¹è¿úódñzo‹úâ¢Z"þëù¬~û|7=S4ˆ×Ìß¿w{¡ëuÄmþçxŽÏ2'‡ÅÅ_d6¦§—§ÿ}Iy)Q-êsä&^pçˆú¿1-|¤¯×cªÃ¶K–§DåýJ*¦ç{,:mrþmœ°/S1ëÎê¼Ïƒÿ¹Eç4pœªŒ/ñ9Ãåçèï3êN³Û#ñt;úÆ›ÑRí¿ˆÂ;nÒmØŸ´ýKn<Ï£ ÿQx§žçs6ü:¡¾ÁohN~õ¨¿©ùòæ,^•p­F­Vóó&ž®Äãòܼ¿%ê©<Óïó·¯ñ>t´ð»Æ«;¡vøóåãŠÝðF¼ß°ÿ½ÇüŠ#ŽãNz;#x7ÙÄÿ?êZ ©®[!ݼ ʱ÷§V::-hM:Cù"Þæ¸4dÛ׊§ó‡aùáß7 }åSÚЗÛÿ¾-ù ýq&ÕÉ}þd•hë¦k^ …d›ÌÌ/™¶ÔúyÅÌëI\ ²“ù˜=T}_,ýQ9Þúnê÷¿{<œ´«_Úfí?ÒÈO>í9²ñômæ÷w³ôµKËÐù…Ðû‰Q7¥‚‹—ú/IÇ ŒkàE™ U 8; õôߣýGìwf39ï[õ «–î<-õx½->ÿŽyȨü)×¾¹¼ßGÔï­ãÇÄ›ZÇM©Ow¦Í;Mu¢™uË‹7‰O™tTÒ²@Ój”G=TºuNÌØ¥â2†Ú†üÔuÏèóDŽñH@Þ¦7sTòÊY j>Ü7YÏç•ÌÔ!lü-dF"pœrÉòÙ±[ò³®órÌ~g¥e&t dÿrù¹¿Îð,ÑüÞÅR§÷{éÂÚú¤µuËo'5Œ÷ Ûç³÷º7ëÏÖ'[ß%“Yù -U³¨ø=ÙLjãG|ýéŽzÿX¥¦¡b§SÚu) 3\$~¥þ«ÿ¿Ew"ª¡[IZC‰ñ†}+Ò¼µÏ’¯/F¼w©C€™Uµ÷Éu³Wê¨[ôB:qMõÏ£w$™_è=Ìæ³?3üÌz¿Ü;Ly¾›fdtÞFVB|CQwDÇp< 7×8Aâ0^$ lº(þ~û»Ú2ýœÓëÊýº¨ëØðp æß«âªJæ üÒô~z<ãšÑü•{— ý¯=UùÊ­éÖç·-¯¿^#ø_h?â´Ôw‹#Æ7’çjá?»ÖïŒçu÷LõºÇ¼âXþQ§5ë‚à7cÖ£ÂÏXø|Fùö¼Þ,ûHýïl´øÇ;Jzxƒ/ ÝOêrFÕ ñ÷§|Šì×È¿ÇB·þ'¦þϾnç ï„®/¦õ SÇ«<ƪ„ýSµ¿ù¬B‘_ÔÛǺº‹ŸsÏ)7²û? k~ì¶ncó±>P!tq«z§ ãíÛ&®÷ú_Šç§ª#ïð¨!¯u÷‘é×Ûê¹èD|û•ÿ ïNóno«ÏW0?•,~•åû¨f‹÷%~›ãüï ýÇbŸ¡^ƒæ4ŒØ›Œï² ·ÀÓ^ÒUä»Þ4<'Ù”Gb:z¨ÍòéÍÓ‰ã‘/ê.<jÝ/ËÀ¡ü…ÔAåù3ãx–¾¿í¯ÌuÃ["ˆÔ—idðÿf¾•J5˜>3ãY åÓá8xKïÓ‡´éÔø-¶:£>×ü^Ä] ¿ãí§¿ì9†e<ÿ9p\¦ËŒIã´~V~,ô4î(Qu¡òÃýTÍ,_KF^ÐzPeVfe–ysïL†_NÜpTË´>]™}¹ë”Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•YfLâÕ36þìÜp¿_iR*<7ÿxÃÆDÓѺöh$^®wˆáa'žPy~“G…óâö8ö»óϼ·Ôþciã¯$¯Á׸ï›êùæŸ~rçËP t`Дt»¶uqâ1<·ï“ ûùÿ3ý]tއ÷!ÀÕ× þAKÒÿÈO—_8ÞMßQñãS„Þû‘[Š™í;UODê6¡±ž÷àˆx|Æ'ãü.ù?j®m?¦×ËÇ# Éw3—õ B Ç€Ëóùtü~¥¿˜ Ÿ=U=M©—lâ 9ö1ÁµÏ„¾Þ½^&–WuëVŒï{Õÿ =šéÜ!?³ú®>²•^?ɤ»ŠGÞ©›¯xßÜô+}ŸõËTޛẚt‹PÑÀk¼fƒzü¯|]ð¾ëù|óÞdý+böQEMâgæzžg¨¯Ñâ…Jþª¥2Z»Í·Þ‘hω÷Žc?#Kßï#âÕ;êÅb\ÅDz"ØðSUÇÁ±_ÚüL\ÿœ ³?tZ}î¤>†ÿÿ'û?Ÿ0Ìocf«:=«—ª: ©[GPÕ±ùA=ÿQòÒpµhn:¿À~‡õ~ V~*üPÔß®Ëp}뚆yqÂD¡—bÑ)ÂΗż{ínÁ»þåœc°bíjÁ_kGþasšGVÿCð'¥ÿüÓ'w+ºRÖÎS6}ãÀyÕŠ¶}àxgÒéÏû‡ûŸ¿¦Ÿg0òýöŽ};m†_Îþ5ÞûÄnÍüŠi_ ×cvÔiË”I½|w/\¶Ç¿vN÷íãõ7ê—“¤w2^ÜcÔo;”L/QÆëþÿÔoŠûéi›mÞäçeÜNê¯8ê¹JÃÄËÄs1ñj±Þ0Ýp\± <ÖÀ´cÆo…nCD=MWC[¡OŠ*ñøüQãIëùÜ2Vôá,\ê_¢Ó‡uÔMá~#îl¤¿îÕõë¹÷F´¼דµé[ã®òêóÕmq*ùù¡ÍÃázƒ_ë~L,œúlþo¬ÿ¤4®§8nÉMj¸giž2¬ãÆã®4V½uî½KkžÃhG=iy¿¶ŒQó)µõóŒK¤^ ÷é´çŠëîëØ-o—L¿uPp#®sübÄñ›ZúâÔ ÿdtûÒ¡|UÄã²$¯z=r»mªú&}ôùãyQœ‡®­TýÐÛ¿÷qöâ½bÏa ÖÜ‹óeùÜÜZ¯ÿ¿ËSß³Û:ª¿ˆxßqëóâw_׊úkéç\|•^?jߊ™Jþ„å%ù:Œ>ýsŠßøç¦ü°ÿ>ìZ#þvRõúMù–´ ņ|ª¡ê8곸¹ÝJƒ>W\ÃÃCÄó0h‹o7t‹cP¤ö%GߦÔW›ùI¹ú<¹MÏxÜKn:Ò÷TÓÞwT´ô‹êš°r%¦+,ãž=Y±ò*˜ý´šÜQ)ZÿÝç¨_Ý¿X]æêŸêu’>Uã-”üG©êê ì¼½·ôï²-ë}G½ïáë9²õó Æüù‚ª¢¼¡/ŒÚþ¥ßG·Y´ø}6†ú)\ʸÝAG¿\êHCÌ;(ë$ö} æ×·|S]§›…¯3~þªÏ‰DùÔg:S˜Nx5îªóŽßu{^ÿièCÚÈ76Ôç¤"ó¨Èò·¬¿fsÓuHùî‡~®=Oïcƒ^[Êu<ü‚ÛóæØgˤ§˜)óÞ1äÃoø©ºA×NÞ_T‰˜çXûFfú.‘`ª·ÎãRÊG ¿Y设gð¯ýž[¦ÿ³1Ï<Cw·zHZïA ¿ñ8:)}‰¸îæÍMÒÑq\-ÏÊû…ñòU¸³¿¨OÌÙ?4q|žj;ê°tÝm}¹qY‰ØîÕtãÔ!<Å?QëüþåÅì«wM^Fp+˜m&7mß6<ÞA+á?øõkg¦\_5æå yuìú™šŸÙY-ü¹­ïVŸD1ó'ø{}±èÇ„j”ßz‘ï‹–>¨w.ûí§ÿ¼«ÏPA—gõãÞNân*è×WL+òT‹~¢_¿FŸ‰–wÉ#éåE"þª³ÿAŸjÞÂp¿«$«ËÉû$ßoï‹{^Œ7.. ÏëÆ5çr?ÙÑü"42è Ï|5ÿ #žxÒýôgv¾ùïEÓëgºØ|À°Eâ9/Òã`po‰>ß‘R?ó¨èïk¸¸*^&0ž¥ß¥÷V:õû2+³2+³2+³/£y¿œ:Ë2þ8ßçQfeöe44Ì,~®Ìô†"5^ð2Xý%j}<'˯‰4_¢£þKæk¢âÓÇ«cÈûlo!ò‘«¯=¯|T7Ô; ô}Mu°ÿ­†Ö†~;i÷«Šˆ‡Co~ÆÒŸ Õ2ƒ Ç#RÅ×£6áÇ«Jùìžÿÿ|¢w„pÝÇÝò¿&ãxtPóÕÞKjÞK⋼¿ßšñ%1è7œÒoæ=Y}%Àz)Z>‘ã‹dÿCdn —êþóÖ*¿ÏÄÓ1ç]ï¯}Ïøjh­¿»œÓ„{¨l˜ßêP]íšzü§ÄÇ]Áúû}¨ÎÞÖ,­ºã qþ<ÏyÃú…õÅÊKü¯ñ{†«ðŽI¾¤¨çaÄsuíºhÇ¥q½ÏXÞµ5ÝÇ›G0þ¼‹?ÖæSÑê ý‰…§“Ϭ?Äí#í|g~2æý§xnúVóM%CüNñV? _ÁæIÓ<%u…Ÿ_ýšÊ_›§ß¿÷‚Ðyçêu&¿ŽK»ø^u¾¡ú .5ð—ötrâù‘Øy·þ±ãç<´!‘?$y¨’,omºßí ù!ïS†¿¯làE:â¼QðºbÎ+úç®6Å…q½gY^™~ê†ãEe^ýg†ž¿ã/¾¾zGÓÁy¯EÔý1Ì7®†nçÍy Æí6õ‰{*úñhýó¾Ðû¯¸)ÏßÓ/ /7üzaÉ7ÞÃ)ÊS ii^÷÷‰sãýêÛxôQñd¯øœ½·(ާËå|3¬#Èó-Ezýµ´ C»Š8Ý€¯Gv´ß‚ðçÊÇ×V7èž ¼…A/"î{Èù‹®†j,ŸpãJýs}ôüàC¼O"æ>u\× ×7oU×áüxzJÞépÿÄU?.p~Uõñ¯›Ôs>~ù·´ˆ÷¼U¤üA㈺¢–ú!vmÐç[ë1Ü4Å¡¶¸Ó;K|êîO  Ï‘ïSø´¡>bɾÉêfLŸw G‹ëŸŽIMµÞbȳ،ÏOhHõ;Ò“ßc~¸nœóñxÝðÓw ¾8ÖüQÌŸ‡Õë‰=Ð>O_ Λùû¨Éê.Žó®Ì9ÿ.6®wاeÓ)lŸ2ÿËfØü3Gþ*ñ§ò’ì¾#‹æ‡Ö¤›b¨ŸaCÝX:ôS7}ƈq†?þ£WžS¾AaÌ9?ï"ï_¾ªOê½Íâ¡ÁGœü%þÜÊ:5 _ºñ¼Îƒj†:ÝÞ·U<æñðøž?w2NAªg~L×û´%ïP»tñݘÞçèB7ï{1ó›ÿ:°ý~¦_ññùñK°½ŸÞûî_g+y©bÊol›,þ^Õ@èápIøöãz}‹@êúß×¥ßÕ‰õ[Š›”ûc¨ÈK¹æ[l†‘•넪úùù¯`ªwb¥À»I<|@ŸÙ”ïXõ¦~¼A*þ º…%¯Çª£Ù †Ï}Ûn× Ø:ä¨Ûç|ž5^kßòsž³ÔsFCÊ;5£ü&Ëó¹öõ0×i øÇX~²w`È?Êú–+ÿ w <™÷Í XnðcNùGï·|‚©.Š·…ë-_M‡í*9÷wÏßÝòõ•¿0ý»"ºÅdž|˜wF¼gWƒA†ùºm8³êk¯7êRþªZ¼ú_ã7ÇŸæz”q͆K5õµ®ãÝ#üâVêõG®AêòáŽ8o ~y֟¿¯hXdmçLu}îËÖ·ÖÂÏ÷ç©•ãôyK¯šð¼hIùGü *ëçÊKáÎ.¡ûKRäâ¥ÂIÑê­U¼©Ä‹ûß³>œäo·y…7ß+žŸÈë­\ߨÿ\®û=j;†[–ñbžšpµú¼Ü¸TÕï2ÔY8¯OˆûrÕ‹âÿ*ä6!µÃ†¼c@ÿOŒ+Ÿ'Ù_7=©¿¾-¨Î@<' ‰‰ËfÏ·‰'g'¡¾*Çaì7XÝ”Å!ÌE}Ù¯1NÍÔÁÿ¾Rfô1üþ;|#Ö? _ÊõÏ¢îØ,t_÷óy‘ñ@?ÒûSX>UðÑΆçÒ2Ôs«7špLþ87EÊCzÆÄÉ™ð3[W ¿¿Åkuô¿‹÷ýô?—õbƒ^3riÞ ü;ö90ô4®¦qX]».qÃ}îØ¥Æ³ýXt6ÅýÞ/ü‚– ÿáÚ¡­·3þK¬Ïs„*@óýE?¼Ãç5e˜¶¹öéô·7ð¤áګĺD|B4Ì,¯4-“~ÿõ-øŸ%‡žG™/F£hõÿSìù8”g]Ÿò® w†)óYU'æz›øøΑ¼ï^ñpÏñ,8ÄÀù8Æó޼†¤æ§D—ÍgXtµÈÒ_çqÎf†‡}¡j±xÊà/#'ü¹Á½3D^×€ã4é’ ²¸¾<ìïG8D¾ÒÕlñ¾q¿—ñƒÇÂçÙ÷ÓFz®°½•~¼ôWÖ {íxx   þ×fÞIÊߟˆy }Fη¥Uÿþ÷xt?¨.t:ò”\ M’ÕÏe?ï·‡ÐÉù<‰+÷9ö9ùÌR¯eüa©³ÇTw±ôµ½¿&=¿vWOqœ&†¼a~r7üßaÐiqåûÅÝxDOº­Ru>²øÙ­Ýp©¨Ìp‰ìºr^½w"‘ÿ-†O ¿}¶^·žÇå¨gX¯¯ü{Fp hdŠ÷™nØìb76|¼=Õü¦Eȶ¾ƯÍêÌ»v ¼ÜýEj²Gã`ÎïD\]‹ú£°ë+×?¿¯×Òâ{±ý9CýÁä~çxŽÛªªñ÷x/Å„ÇÛú5µÞññR6=¯æ#úSønØó¢ðŸxÿŽ,†ºAà“±øq5OüèÿŒ{^ÿ_7]üî=Ýżמü/мãê<§ºœ+ÄcÉáoÜ7Rô…£>©˜ÛSœÕÙ°¥ŸÈÛI=5ªŸà!Ñ _?%Ž?UðæuÚ¯‹qî©.p¶wu½;ßÕ®ßÞQÒËûúÀ5çÎo =—w‰ëñ£ûÎõ/ƒy"ßtÇâùÈ£õ{ßú>çöÿÞˆójLŸÉǧöÁ•ßmYŽß­äØGPêÚ 5èr];Pë—ã;Eâ:5&¼Ä¾-âyúÎ{⾎ =Žs£z§])®—üûÄ·Åý~²ýßA}ЀxU èþ.%ÜÝA¼_ÕóÛÜaêû·ïâþïj#p”Äýµ÷KDœËÄûÛ:èã‹»+Šë·ø²ðø%Kïÿ9óû³Ø¼|›pP"„q׋B÷Jê¥xýþìh4ÿÀz÷ôKŸˆ*4ÿUd}ó#âQò‘¤C(ë·œç8‡Ô¡µàñÿÊ;îƒõδaáŸÅs¼d¦˜·Ñ{×È‚»Ï ¿˜ó¾º.I}å 3’·A'Š'ïü©:÷-póÿnð›ðå ×€e2ŠW5õß’õNþ9v+Z;fÞ!ªu·ŠJÄ÷Ç-º ÿ°è–}ež6¾àdº¼DÏ{2½è´ók½Ïãå•0z{¢¼%nàÐùaýúýh“s_à;·©øMªgI]ÂîLú ÷>¬«L¼ô¸zœh#t±1ê¿ÕõoÕÚyÖ;Iøó,vŽžÛÆ„Céøžï¢Ç]y_ò‹¾çîj&ü¿üh¼’À88?z þñkü™S÷U5>Èp»þ*pIói:ÇãçJ ôSk â.Ý<%ni"ž;‹ÎnSªý‚ç19|Ý7áМüÊ¢x¸ÀÀxó69áLz©quëñTsáïÝì4o¢½aÞ}Æ‚£ßO¹Îõ)õñðmUœô7pc-å:›p×~½`áD¦{ùñ;çˆ~íèÿ X·?çæ÷™tp ¸}®ïŸåE­}GoŸ§âC;\ÉOÃô\±®²¸Ï¦WìogñŸ¬ÇŸš—=Ãæå͵ô|“,·õ¨7¾ñû™ÿÿ<Ši¾°é8™t­ÇkÞ§jä‡ð|GëFz?çL´|©ÍP¨çõ›øê6‹ªçïGïq\Ý@,ì§äü“^Uy þ}¸’óº3ò“åÛÐí»z&ÒCÇœqnqGcò{ ~+:°<õCcÅ:šCyœn"ïá¡zH†ã]=D_ÿ­™YïDLþlŸ?gÄïÇðèë/”¿—¸ÃÀ÷Ž8=“ù¼ÆªÃNØ„›DçÌêUb¢?‹QÑðd¨AõØ‘B÷ ³ŸóòÑ×AêÌÈõØu\W¼*ÇôŸ¶?™QÜœ©ŸDäq^tÛ7ݯ÷ãÖM½÷£=‡˜å¦G€¦”pì§8/V÷F}Æíù´ÖïEVº¼ d»Í㦼¬qû¸×Å¢WØÞR·ôuO¹Þqˆ8¾UcýžÀùFÄŸ Ó硜õü,ýÇñèëg±>é|ü§« ÓêÉYú-£XßoAÖ7üúñK‹/––¡Ë?•+ý(WC ¦ÃnÉ‹eì<¥£«Œbêû“ÇêH3ƨxñÛ—ŠúfEK?̘:\<_.ûCa™£oÕÏ[‡“é=ñõíT¼Ÿ»lp~ò½¸b¤Ç¿õ%½³ÔÓ-G×7ï·cäe}E+Öílº:T®æëÖs‰•ú›¨?°éªÎÿ-:G…"o+uùýýXw“î%¦,WÏ?b]ÖfÞ)G½ƒ1Tÿöû\0¼á¹ßeâ;yŸ“Ã⮿‘®„×ôÕ>¯,Gº±ÓU}‰¨úq¨@벬¿Õ žÁ~ï§þþâ߉÷ô¶ûT|!õ¯Æ5õ™WY}¢!ñ¹î-¶#¼1®Öó@ÐSð_Mue[Ÿ$âãzl[²ýÊŸ7›Î»§ÐµÄ®õy>bégxõ©ð“ýw¬uÇäoÊ:½õ¸Ûþõâ¸g#>×»^ztLg:*5Üð|’7#ñ-}åb=nÞ<ž›ß†}ƒñW0„ð`báðÎèkª?béXõ?Àxüú Áx2þÄòýzÃi·û‰l†78@-zpqÊ1ÜÆÊöb^ÓF£ïÛEÞ¯_ö_O‰¸õ¡Æ¢~Y‘ç+ÑøI6]uÿ¼Ö½®+Cë-® }«jYò0$4 gÈ‹øß¿£Æ}ÞAæßÏ«ê¯úç—Gñ¤Ag:Ð_}ÊY±}J:•h­>¯Xûw§¸ׄÿ>TÎL\ïj6I»Y‰çÏh½þü×.{]‰Ór¢áT°áÙð>ÞÄW–ú&hM}?d¿ØîñðlœßŒº4~“p¿I?ôt<}RT`ÿ·z]Åw×L/ÚLò°‘Kÿ³þ$sJ¯tË×DüaᥚúK'>oÖ‘ëfy'i¾hnÐk¨lÑÙ²ð QO]ïM~ ç“oãj¨ôCTòÑ«‚ðû#êå˾4hhˆ«™nVÜ~/<¾ÅÚ©Â/Ûý™Àw¥”'ŪwTÜZZß§³yfÙR§çcލãM¥ø‘é‡z' ×ù7{~yR¥eFýùá[Äúaшk¼FÌÔûMùóHe×xÃvˆ÷jOS‘o™ÖNÕ56&ôº£¼E7®ŠåˇT'ž‘Ô|ð¼ÌÏè3ZŸ§>Åü€¶uïÓÕ³U¿{òK‘ê$¨Iqéðb‹'ø÷œs€ÏŠðó4ÐA>å}æ aw®ïži½ûغMMbò„)OÌ×#[ÿÍ/«ñ¸3ãÇ3ÔƒQ@<ø.¤‡=l‹:O×wÛþ$ðÊÔo3½3fR¯+îþX¤Ï›¤eè¢_÷›Ùø*©™ô¹pkÎ…¡¿Cù4tˆ–´™äoó>©Æí³X=æ`<þ˜ìï¼ý¿2ƒÀŽý±Ö©æÚ?»nUëê+þ¢Ö—×Mˆ§#ëØ?Ýf¦8\ò1 i*< SßXãöÌ_6é’Èú\\¾=ç š Okõ¼°ðñ~®ù»š¯¥¸½^Ð÷ã8©ÐÒ’ï‘:#Ô'yéÄwRG‰ûÑiY@gôFŒóoE–/$½Yµñä‘ÃŽÇò‡Fœ!{îlõ_S_*Sÿ7LÛr^âqT•:nç—·‹šŽ<Ùnä¿•§ü3˃¢Š~]ÀšY±æEtJÖW8Óæç[‘þOUKþôž»B×ç€þ·¬;}(ëòjφ[Hjg#ó¼¶üp Ít»ywýP;*;â–ÖväIF}Ð2ßáñË+Ÿ»OmX=nMQo(.]jN#°=ñο†Î&]k×|¾ì'äz^ÆqÎâÌ|âÓÞ1E¿£>ð¨Dy¨~jœd‹ëPÕ’[‘'æÇ˜}vucšP˜’žÕl¡›Öwž×xJÞ‡Øû;úûÆýÉß0ö'4è?#›xOVyó)÷´™©¿ u¿[Ÿ÷ÿ¶†*Îó7©ëáû\ýqÙ¤C)õÐFŸ—°žw±Ú7Óˆ÷—­H¨›Y\“ÌŽvý!–µ‹¼Ñâ¹î"Ç-NÇæj¢hÑñÇgz­˜3ËmýÍ-õ, ÏÚ<|þ5ñƒ¬Çy1ü{\ôx$\=®½GÍo^ž­þŽ–BßÁ5¿ŽÝuwÇü¨YïëëlÙä7ö·ø¥Lß“ºýJZG{Ž)4o*癸ûsÃ¥cõóüîçÂý Ù÷«uµ¡;Õx–ðêh¢Wmë… ž)³õKáº0¼ï×ãÆÝ?¸„˜}¦ýqrÉ?-$Þš—$q̲>¿LµÏ šYô¨ûÅ{>1ÿ^Á_ؘ_*ù€ÒêcíOâ³T? I÷·ÓÍõG1ßúMË>þö[õ:àÖózÇ€cjW¨ò: } eY×ãá–Þe:yBTHG—\êZ£ù ‰÷—n<ÏÚtŸ+°>(ùz}Dÿ¼uö°é›zÖ(Òµ7Ä‹þvôýǬÇmH~Ý[1ýñ\†Þ­^kŠ[°+Wåä³÷dèMéèþÊm>—y* Ù.òĦþ(¹û«·0¬«äŸÿ»ƒø½¦÷<ªÉx#n#€;°èšÊüŸüæÉô§9¾ßz¾Žú·Æã=».+£zÙÛóõŸ_­ê+G͇E>\ÊÓô&ÿ¤h’ê§_t"ÑzËûȸÐÄ °žoEÃzvÝU™Õ{¾îŸ¡ó9¶ß+/…DžúU ¿RfòÀŸgòßQ;aüã¸>üo5žÇÇ?W¿tŽŸyà ÇÜUÕ›ç8S4#üî;áëž^S¢üß–ü× âÆbÁâxÝ„‹­žŽá<¬€?»å5±~­½WÔ(¯!ÿ¢­«óþÎ×èäæJˆ­¾ŠJz?ÊZÿ½ùçáyˆ6ž¥w˜åAXýÍÆw(-“x´;¥ÕSÀ¶{î‡=?ÞAŠciÞçq·¿ÿ¤kôu5×¥‚¯Æö?‰çìi¨ï•¬£Ì¹7¼R‡þÖŽ—ÏÀMôû©ßºÏãž{[øóvûoEüÿ5}<0C\_ª{™xˆh¥ò™½C´½E¯Üßá“LyñcŒWÈæwï}ƒ¿\+<.B=¦ß»nŸZ¯ ü°ýæ‡Çcó§ùÕˆ»8HñäuCÔßù…!¯xû|½_ÿO‰3ð,>ÕÏs¨G|xz¿pÝ7TÞò Ö_ıþl3<úß*>b×G¢žnàç 9û¿]·}GE·ˆ=‡]«LjÄô7›é?÷ÞŒ™/k+ê—XvsFòX‘õÆû`þ5ϵðáHþ¶i°·˜øï†|Žw:Ü/F?=/2°ÝÌ¢Î7sˆ‡ú1|ÞÎõïéZñ£˜øh«&Š|ÁQZ þšk=ë ã=gΜÏ/XÚCøc¬~&×E‰‡ðu~&¤Ó2òùçάwûhù•Ïh×W”d‰ßý¬~ý‘¸| Êu{ú¾Az/ÑLú˘¡ÆÕÞ!Â#Úú‰4Óû«è+ø ~|mÈûö›?^¬3¤ÓbåÓ÷Qót7þÒ)ÏÉŸCηÀünz]…ný´QO¾nù Œ—‡ÇöM±òi˜.„’Ö3|}“Åm…¹Ã±/dýp¼k ‰cG}š/Ê…ÿ”wì÷æØ7)nÿOWÃÌ_$Ò síK‹Å¿ùßéÿ»gˆûy{wñ·"‹'©óÆWó· ïHºƒ¡Ö‰PÍ0/VR×/Q=³½#þ¶ïï2ƒ/²è_=¼NwÞû›/Uÿèû¶»|l²ã\-žL©"æ“=õº´Ž:6þöŸü¶˜ú¨Xš£òÒZÖ«lCÜu8<¯e2Þ7M®/Xþ¶ðÿ–¾®×i’ë+«Ÿ¢›þ:'5L½^¬/„»‘ý¨}ÞGÊut\WMÅ呎…¯µMÌW¨b‰ÿ§¬'(û•9ÎÃ×ü¬Tø™Èqäñ³õT>?r°õçæû™)Õ/³Õã¥ù×Ï‚ãÅ’ŸŠ÷zóR7^WŽôa¼çÚ˜GëÙ ‘_’–áŠuÚç^¯XøÝè‹HçÁõLÑšp ó4¨Åp›…úº3¾²QÔ9–TëâŽù-L,§ÇïUeuöӒ϶3Ôe€vª~E7ÎkC^´|M@ß¡N:ý}>!å¹ýx§—à1ã»7:ç÷Ê<«Ô÷ï#úbëýjÝbwõðødk4œ·-ÿäo÷.ó$ëŠ7båWLù#Ô1ðK yƒÈÇ=Àê˜ÙnñÚˆ<0¶DÌç´¦úž'¿-ï‚íß„>gzjÆý‰gŠááýô$þÏ{“ôcäóQ7Ò?Ï’qáüžÄSh¨Þg,è"ü®wŠõ,—Ý¿júß9ü#ÿyQûHxj>¯[Çg¸F¿ßƒÄWêÄ®z£?†J†óèú3õ>ôX¥ç'Oo,ž™w­gȳùÕ„Gó¿gy´ª¬êàQÒç½î;n\„{;Þ'Õ-º4hÅÖë}<÷} o‡ðFýd:ÞiúK<,´î$Ö™|7ýh42ð³ê…û)hnès¿ù‘'¯jx®ÿ-?†,¾!éTdþÉ)Ê'Ý ôºlï+÷cx9©™úH <ã·æ&äññ>ÉŽuuþ<ûºb½éïìÃuU¹žý¿2£Gl3Ìñµ÷”xž$Î6€#|R{8ïGê¶ùÿŸ¡q9ö£^¶V­w×´äOi]DUòK_eø¹îSýƒž×óy9ÿ„å…Lx@äQý(›él+'ê>–|3†,ÑûQz…ú?‘ã¨öT”¸¯ÍBý_w»&Ó 8AûÓ¼‰\½ßàë^Ûx@ìú ~D\±«Žw6ÕSÓÒ­ñú_¹ÝÉŸE‘ê§Dí'}D䧈ç&û!âµZqûŠQ}‰ø"Ò¿0ž¥ßvÕ ÷K¦1¿©ÇªßE8\ᨠõztҿφ¾]èKÇiDuµ¶„Ãsìçàj²¯Oäýˆ‰zÝløŠðóÿª_g%žÝùÙ†ÄO®,yr”§#=lzUø—¤'mì»þ=Œ¯Åun‘KzÚ )ëÒÞ‡ÄÃkE×=‡ÅU¹nyWT¡õˆøÞ§ú|.j–åú=ÌÏqÖÍ&ü£ÄëbÉ;¡ó4…óšL<´²è^±øÏÇ'SÞHêaÙ~¿ÿÚß„óáýÉj%ã½ùù0Ã:„¶–ù±óß§úyhDñóËÑ…Þ;YG2ÄË2Ž‘zø¦~)hb™§ÓyDíRÓrÿð›k¾#æ›Ï©^”E:aÄ—B¯ªy“.6Å˽.¼ÞKïÑДëñ÷æÅÒ9A-Vºþ¨˜W¨­Oëõ»±¼(çÇNÑâdÇÃKÝ?Ù'õ­yå:åÊMû~Ôã¸fÓüêX³Ž·Ò‚ƒi.õÒû zêÞðþÃ_ÀqB–|·~Y×éé¹³åKç÷¶¡Îœ!].§Ë•u™Èû­º[ÄW³øÚ+pZ—Еðh“»=׃TÞ"–ÿVÔÓ¾×ü§#~Ø{M}L¼pnŸ•]œÎ_æw±xÙ…­§nÁápCE7¾­¿}CKž”âYïl:º¦hê·_wúÇ«_Èy>n¼…6"¿ÅçÍÀv“^Qózi¾¤¾Î>?㸺î`¯ÇtYX¾<Ÿp@S‡¿Ñ…¡cÓïCãðçSþ~lþµçÓüÚ†üd#ªß\êQr}M“>ŠÙücªÿ½­^ ù‹ÁÏç·z~ÑûçGÃã|þž™ò3þx¶~‚•-ñ®×g<¿ÓçGâB1ô¡|}þºÛæ9ÌWóñ¼Îç»ôV±Nú+p“:¼ÆAÅeSÀx‚¦¸@ÖY1\àÆp™àMú|ûËDÞÕº€ßGrô•©æûl†"}^ÁÿþÊOÃqh¿tÔí`õ‘¸~:V >fA=7 x¬O™Þ2ñÎ$nη¨D=Îe/Gò’Z\]ãxË~-òû-Ûu%ÿ–á¯Læ7Ä]ŽýKÐ8ž† ¬T>¼¬ñx• y…>ä_xµÂñ±²ïÐ3Eq£Dx¨¸-T¥üSÂ/Ý"ä çNQ§—¸¦ñÙ"oßüs¦ã+q~œcÁ¢¤–êoqc¿h:˜÷Xyçñ—?¦Ö¯þ8.¡ïèp–T¿n±žØÎ ·o§ ÍoØü–Ïtv$>²[ÿn¬!êé’¯}‚ø‹Ô·Rê¹ V:õBëï)*å¾O–|)_gxñ¡Åáúö]ÄzkÒ{ó·+õìñÔñg×Wq.Ãqà§õ¢%Þû˜~΄{¶î×RÕ@‘‡jgÚ=åã’>ÚùËÔ/³gªñ ¬ã zÀ‹1Ï£Àÿé×!f~_ü½z·˜ï›~æG}”Õ¿WžG_/a²šW èuçÏ£áÏæ=Ž'ëKyÕ÷ÎÑßðÇ1èó~Bè®ê``ãZáoæEÃcŽ¿ëONÛEíïÂûû¸ð»Ÿ¤2Å%³ú‹ù{ê0õwÞó¸Š+ÞX'¦Þ(ñ¡ÛQ>‹ñÐQ@󑬗ý+žß›V] Ý£­cVÝc žÒÇ5ßÍâ$tdx´M¿ÒãoÛˆy õ¿œy ïáß>ÿc±ˆÇ\õ¸2eXÞKÍÃRÞ #(®_"‰<ÿgë÷Àõ\±ë9Ág\TEëÛôЈørÁx·äp¶U8cƒ¾½¿]ßÕõ"¢þ‹Í0u^O˜õûõ¾H7ŸÙÉpñÈ£u×2¯Iž˜¿_ãÝq¿î‹dõ6ìk.âù5îðÆöjþé–Nâ9î'ò¸ç×â¹¹þSQolIóú¬Êâû ûÔñïxEäÓoj¨~¾ò¿Õ8äûcÖ8ñ•$Bâçåª~Çýó/ù¨L¸î«ÞÖú½¨ÌêÛ&>¾Ôé1éW°ðŒ)oóÃ|þ»¡_œ¼z¾Hj¶ù³Ô¾E˜ý¬øýÍ Ït(f}=š¼­NFüSï,[÷:Qýqáÿèó´Ž~¤óñÉÿFÓˆûüŸãŠßˆu¸¾?w¾i]õkÑ Àqë,ôõï¥ÃoqŠÜÓ#å—P5|¾䥻G«['5ôxVœÇþðçšûX¹ÃÉO²å¬ûŸŽ¨wد6öNÑzyû_¢é¿U´è'±¾Ö¸˜Í‡­/Ñ?¿{¶ˆº„/¡z¬Ò2Ô`ú.£óÅßbÒ-»:™¿ÖÚ ‡Ây÷Øý#áW,ÿ–.{ÛWUœI)ñ¢ÐãÓR©p¿Sú©oÀŸbÅE*ÏsÕjŸºÅ¯Æ‹ÏïxB_÷&Ý,ÓëµE5‰7ò›ã¨Wx8ž:®I¼‹m;“Þƒÿ}á¢å'¤ÞÄ+Âë*å¢ÅépÃÜDù2›¾)®X«žîóÀ÷‡ogâÛ M©NhÑYñÏGâÀ^‹–ò÷ÿ0Zžu3›B£x¿#òq ‰oÒšpõ- ú°}š†ãÂF…ó*àÅ»^¸|…Èì~=V¼ÇóZ‘÷/©™ þ™ãy2e(ÌL݆óZ]ßôŒ‡ÇÄÝUÃç­^z×¥ÀÆ™©Æç6ãxySŒÅpZOlü#ãytˆ–—°ÕË’òX¶{8¾Î:^ûˆuÕWôuUä'ÿŽC}l0y ¾Þ—CóíˆË…ÿJ3Ïóó¾r‘Ïã€' Ÿ†B†ËU½î¨Sõ¤O`Ð{wõüq.‰¹n̨¨çivÑóQPÝ ÷hèù|²Ôÿ¥þªu¿k‹ÂóÎ1yoX1ê‘L¿³ê·Hoã8w¿«×Ï8ÆòKåÓõ·\ë¸þñ{Yê·[*„ûGÙnó¦þ0Zó¸þ¹“úÃÆýÎÆÃÅaø“áøÂ#SÄÚQ7;Ó†µ§Ãë+U xíÉåÜê–:,ÇDµ´ôÏýñšR?‹Úáë¾ä`]OÁ»X®slg~uí:í!}œréÔcІþö&œ¸¬OT ¿þ<ö,®ŠX/7éúã5àކݛJ¼…Ñ¢à'>N×az]C6ßÊ>>ÆqÙºˆ{ļJ:Ž®}Omfë;ˆ‹…ÿ€ D¾b[G½¿bÈ—št”Qh˜(ŸÍu7P>¾ÓÆSõÏOêjæYæMOÄ«zŸ[žÇM;®qåǾs‘ЦêôbçâzP]Á×ç3Ô0Iè`¸êbyqÞ~½ÿû޳çØP4îÏùu£[©yâE RYÇÐKÅE"+z™©”óyu5àtsôëŠÝòÔ’/‰ßù÷SéÌ®†,Š›úVñGÂöúûÍ©N(u—ãŸ)¯È¢+Q0Øí=jnyï{«zghFëýĶjÜÛQÍo¡:«ƒN¥¸Žúü¢ {Ÿ† Rq"²MÂcŽ-Ї›»êrµÐE_¯Ã}_RëøkLJû ê·m<ŸiÿJ„“ÀÞ·õuû‘¥£#'­´õ±q®ð{êûQøÛ}í65nbú Þ‰8€ò•ë^¢çþïaở‰ìÒÕÀ5£ôþ7­{œ€E·ˆ÷³ås'>'þŸ tõ0u»>¿bÉG8ŸoâY´RãmŽï•:[‘ǯ“,‡F¿>zN`»\öûdžoý‡nüKþSæPDz]Wz~^Â}W«z-¬Þ‰aÅs’ÿtº¸-ëaG~ß’§2’÷ÂÆÛEœ5éÖËzÄÓWèّü[aëþ^¨©.iÒóÉ”Ùðû‰ÇwÄãÛtF0á€>­dÈË[N³ G…ÅžüOåsd¼Ñ%_×㊅_‰=Ã=\—Æ;–®?ƒzŽú9yÉŽ#ñh–Lù†÷ÅÓO§[¸¿ä|>+>UëåDü‚òŒ¿gÑuäú}X,úö&í …¹íõy‹¶Ìÿ#þ˜Ì§cδyy©7†bÊ‹0NcÔz0ÆM‡S¨C¸·#”G’úâÝTÿÄÔ÷$ð»~ìØ‡ ªˆN1uöÞ«}¤ÞPÔñþ¯¦}3#ñUR˜¸†,Ççn€¡¾W#íÑ^ä§Wöb}¹ãŽøìm¯Î?wÿPÄÝ+’­n‡j,޾ëöp>@÷5‘æ1dë벿ŠkHW³á«1…òÔ‡ÀV¿G#¦gÐý=¿¾r4Óöª¸Ǽ6M.®O2® <£yÜ5Þ“qßb¿~;4fyáWDº/Èrãy'ÈŸ9bÉkô~Žì[ø>'ZÝ$ò3MÆy“Ø6J̫į´é@› W lÞ΋:Tºù_›aƒ%¿6z®XGOÅÃ1¡d’S~«§‰y•òbèþ5þ¸÷P©æÿË,™a™ÈÿÙúÕJü׃·Ž¿}®[Ÿ¡ª®— ‹ékÕxôqÝ=Â/ʧ†”§þ<ü}4^ŸÜx< ›îV]¢òØ&ˆuÈt¼þç¡|ÖpýýA/ýqúCûÙ~¬Ï6ÊÇão9÷‹­b¸î½.=W©z.¤_,ý/Üó{Õ•}Ÿe?æß-ž.@ZtfºüÞ66?ŸªÞ¡ßgS¯Ð÷Õ×7¯F¼ ÒËFA4ÿÓ…ÿŽ•]Ãór+ßUó6cE¾€ó¤ñø ••ÿ ÝpˆÆãÓŸü¨ÅYªÕ{ÕyYÊLoØQ“ñÓ‰/›•YQÎGûp¼Wb~Nóp¿— ž5Ú¥«ŸîßPÿ¹ Ï…jê:wýÀWrÄü2åcQÉ 'Ч·­÷4~B}#ç<ÙèY‰âHëø~ßgÀ9b,ÓãºÿŒÈc’¾1r |ø{š¨ïÁÎÛÕqF…ëÝ`Üoâñ³XÂû|òú&×ËÅöÿˆÆÿΰþ–?ª1PÔálüa4!ÿzŒ~~Ū‰ò ¨qûëf‰y"bŸÌl’ÊuÆãµoÕꯠH8 Ø»SàD%Ô;Zºõ;žwHjè¤Ïßšt9ŽÕcê·üDÜÕSbå/$.Ðu{‹ßƒõ—¨¼R§Tcz³_«:øÜ{[ò'‘÷XU©'æUÂ1ÈùEæw|<¥á~âáqúõ¹¶ÁOìÊÎ÷†»…1pÕŒÿ¯yZ=ÏÍn÷7åìZâw6!~ê=w–ñغ—EÞB®K9?=öguûõÃ…ÿ»ßR‡ë$pXS_]X[Ÿ~ϲgÕýGоæ¸ôâ¾PÜVÄô»mf”÷ ='Š?¬ã7Ÿ_My ´¶Œ;úÏN8xÌ.®Ûq ,}VÄõÉß\×CœÇ¡xú>K¿3ê:Œéƒ´çÅû ;Ÿ·Ô‘hw«Gïù±ˆãe=¢­ÒÕ+½íë©êàÄ5ç> _D{>1í ß‘aÞI™ýï4Þ‡âB7ŒÑóG$>·Ís{ß¹Õmx~;*NÐUßßÏ÷—7øÕë·ˆ<:{ Ô| ï'†înø?û?)]gãñ›â½éï1 ¾aã¢túÜøízeÓ·ã<0¬Üïöjûðuý+Dã_hôfÿ} ÷}]â—õù'Ïcïñ\'ÊßÕ2Ä‘­êH45ð¡Î»/Ñ×%ZºáReãÀþ• xÝ ÁÇIØ×—ÇìVÅW-~"Ôo•:þö,_.ë9Þ~³-x2ÔŠª¿në‡ÍëCþû.uÁNºÏ5ï‚¥oèõ2ØüŽVj~H¾'È¡üCkýñ$o8©#züúlý{û…á½øÎqnmz~Çꟛ¸ ǃåă<+ù wnœ¦>gŽþ°«¡ä'â>dgF‡=˜‘q­ÇmKº Ž}äqSfëÆãVÔãb×ÀMÿ%S†vzýÙ¸&ù̲1Zëu/¼O(ÿ» áÿëåWŸ*U]Ü~µ¨@q«A7,pœcÿ¡õkѯUx’ú¸Èüøù]_MfÔåü"fDG¿IŠYÿGþ>¼ÉÞ›3TO,ÍŸÅô®j~`Î?BŸS,ÿ•x?-}…ýó¢øýÜtM} ðØFá‡pø¤¯‹zÛÕ]3:ŸbðzŠGéÿzz|÷“O¸µî‚¿ŽF,_ÖÁ¯ Ž÷ž¹Öùüã p»h“Œï`3_1[ÿ»½3äoeéß?ä³~tÝõ¸OëyXtspóÉð¸³%h8ÿ/»áÁB¡;Eý€Ð]§bÙNUßåU}ÝÒÄIKÇ%0n½hy‘¸ø¦@?•!”ç2äA1TðC¤?…«ÂqÔ™2tPû#Gžg&<¥çCäÆÔÕ6ô±ññëÇd´_jÒ~NXñQ§¾óñtÌÛªúÃØUYíÏ`èk¨g|oVw—øG®ÃWÖÝwm¦¸øm5OiÀ™Ûð ’w(÷7á_вQ¢|~¦ Póê2o‰ô»^¤íÿ#5%ñêÎÇó’á.M:•®õÉÀùTgþNn::K¨Iñ`'·8Z>÷\OÉ8~†³>`Áe6KI_¬Ð 'a¨ÃÚŒ÷G ÃûSÖ—jŽçÙÀP·K‡ÕЗtp7NÑΦ>l63ñIýïߊ—‡”†ÆT§¸HÏKù²æ<O‡¦èi?Nü~ªyEL¹5ŸÇÍÔ?×o‡‚AmÆçŽ©Ÿ€ª†y˜Õ½8/Mê'¢Q¼u -óÜ2=î2jd1½ƒ…z™˜:(¥e¸µ½žôƒsи.¹¬xÇȘ‡A7;Åß¶¾kWQÔ}ÚP^¦…7Éúø²Ùz\B /˜ÌÛ6¦zSïx¼tsÄKXp£¨FçAºèm]µùý;Vlgók÷;æ]îØ¤òb·OÕ߯­ÅïªÃx–µ’ñxÇYµô‚Èc—™0©×˜±ñ›ºñŽ_oZg±ª–ø[‡òÜwîÐç–7$¾5ù³»þ©Æ_?ÎçÚ=nóÍ'éè´ ›ºþa4ùƒÕÜ®iŠ'©ùìdu-ÎÇ;Buótœn¼“¡á+[tj ºñºêõŸQò¬ZŸX÷ ®££õ»ìOº}2èçzg6ߌÁáýcmë¥iD±Èÿ¢ÓhºTó>¦ç§ã'’ çMÆ¡z õþ®?×­hm>ñ‡w‚þ‰gñÇc¼ ôí§Ö dwà4Ôej¨çcÓ;ÁUÞÑ7 ­z=š„¯7˜ö{5~+Ïâ¢rÑêXùËxº‘ˆ†‡æºÆ˜´ÖM|ë‹úu{ö “¸l˜ò¾Ùðõþþ»ÿå”7Á%GB׿›—øó€“ÓÑg³Ä¨Áú7~”®¿‡•ßVã<ÇùGöÅCÒüBêÕ’> å/0«À ÿ¼úöðºë¦ë›+üD9¿ ƒàH½Zk¾vÞÕ¢NôÈ–DßÙPö}vì·Cý]}¼dý¸zV¤Oè˜Gþ[ä9ëÒº/qà -ókí˜y¡šýʳú:®Ô%’.øBÞÇñj¤›¿àÏ ø“žØ…ª—ˆ¼h~w<ž>É…j&_ë~ó¯ˆôþ¡¢c½€úCÊþœ(`qóÊ:NÚçÃçPýù_´~sù¬ªÏSýž¯s²oS`û¤ü‹˜þU»xulŽ;ÀºÎBÇ%¡>v¦ ôù´,Éìq¥?eñWM}[½Oï-×í9@kê p˜ð(õ˜ßÞÖ‚ïc+V6~ËL‘ïqíoÕÐQÍÿ £cžò®-nu¡S–<Ìk£Ý‡„?ë—b¾(fýkIÏZêJúûÕ y°ùÍÔ| ¿ÿ¼Ï VíÓ®S~ˆräwï9áuÚ€Î:Å×R¿šëe£Íß;Šz]·'Õùd«g¸~£ÇDÓeŽ©g,ñùÜSŸG_¿X¯Ÿ5¥±ø_÷‹áP0N43ùEIãb±üxqTK NãÇünÆ›÷MµþyççáuÆy=Dþq×o…ßûäVñ|^"t £ÖËýó7ðῬ†agD}˜ó6-yï$Ë?µ>?üLù­Š;oa©ûò+Èc8¹Ž´ÞpÁ™6És‘y ×ý°¾¥ÞßXó¹¾Î#ûuÎøE"üœÄ‡¢*[?.}HÍ??Ãú0.ä.cöÄsyåMñt¨/+O;ÅYþúµí‰ðºÄ[éö!”}êýñ>s~,òy¼Ÿq\ê3é½Ë®oËúü^:ú?6½Sÿ|òÏNsZ&õH1K<çhCÏ]mò[êôCVôQÿo}§~»»žQŸ‡lz?V­ÏÅðËBuçâçwžoÃefX›¡&áö¼gpGW±?ñ_h†šlý¤>€~<7ŽÂ„çµÕÒ2ÙÐÿß’¯“ëï—`î‹Àüûþ«œüJÞÊßïǪ<†tqÛ«õsï]vŸ6=.Öÿ¯V×åµO‹8ó–7Õ¸àžÿròól[½~}"Ö‡¦tü½_ˆubí+á8Žƒ4.Ã5¢(¼:ïãê>L¯Pf_.ÃÊú*ÝЯ%cÇwÌÇ_(†ÍgcåOÐo]¨ŸŠ Ô¼•c¿r”£|ü~úõm×'’_ìã&Þw?xœ¶¡2å÷5;§Íãj(ͯXß=UÄõìܴΤt̤u¢ð'u[°à·N~‘÷cz»èy²(T×ï ÅG-ýZ›úϦܟїDw½Î£÷y2œŽ÷&ã±[Ö×ØÇ¡<ê8â& xqWCÇÌö—É”¡1Í+Žxi|ÞÀ·Z4Ò>G®Š•§4éšÉúºÿÓp\jîãC¦OfèOèWw‹ZŸößßQOêϯ•þ½õ¿¿a…¨«tŸ GŸG<ÝS„o¶ð¼PQ_wÆŠKÅwÜe¡ù™ß”ºÌ®ý¬£Öÿ±¯¶Ò‡ãCŒÇ1è4`P»HÏ7çÿ”–I~†èqÆý?õÈÿ{ƒô½[^EÖ ûxhÅÄê§?)^ͯ7­¼EŸO©o½ÉPݧ±ðû¤I=£@¼aÐÑG‘(LbÁ Ñò‡câxŽ…ã¸þ£ÿ¹Ì‘Ÿ´hh*øiôŒ¦§‡‚ˆ} n|Mù_âÑ)!¿”ñádŸA”¼"x4Ï €õ»Ëa:ó9þ~<~Ïs¬ܼTÛÛ[ê„kðç…åR>ŽúDïסۧâ:öQã*ëûÙ‚å9&‘^Éš6úí ý;¤ùxã‚düYÿx3nãÚø¡\GùgFÓV–8$_­³bÏöpœÙúá‰ê(èV:um×uå¨nU4)#y ¿EO·ñm8xtއæ×ƒçÑæÂâõD5Œ ½n¨dÑQšöŒZ^_)ܪE»OQõ-Ï£ñÓ)Åëüþññ¿è>ïÙð¢˜÷Sý}êNùÕ®áó Í/¨fÈûK¼\yCžó:‹ó„ßGLþTÅ…ö7èÈ ¸‡é%¡2Õ¶·ok;2\1°ø—ë¾N­^‡ ÝGêu-mú³ÞÑðçWò“ŸS¿)4r«³ø}ºu¼Ï™Þ¨<Þ%¯dQ݃Ö_¿ÏÆŽFª®ša} þNæßÎýŸëUá½Î¦-xPêç¬þŒòô\1Ôy–õõ¼Ë?V×ù,É_`|C-ÿûËU¾?êÐú™mè˵­„ŽÇt^;D[oÑ@?¯ø÷Í’ç–¼kíBÆ'™(p#˜õ¬øß°ž`æ½â‰âLÕë·`î_Î=¸~Ÿ_‹î%6ŠÎôÞIã:ÿqj\}.¸¡I´8  béœp=W½Qï´a¾cuЀžâ’wS©s¡ýÓám ÐP_Y´@TvÄEOÿH~é>Èëèϯل[ÛSQ ÷!©yŸ¹Å1ÈIØ÷±kfê=•yUEþcÅf5°éI·üÁÜ'Ôñ©ŽŒªŽº©ùA‰“ñÿŸµï¼ä¯Ë¬ÌʬÌJË0îgÑü—Q„‹VUð ÞÊ,ÿvEÚžç/]ë22ï!û?¾?CñZ-V¾k¶šg—qÛ&CècÒdzÞqªܾAè#ÉüݪçA}0¾š:n›BâwGà r¾.ÎW¾ÇÊŽ‘òÍX5<^[¦ ÒáÝÇ_ÿ’À‡ˆ‚›5nG{V·¡z×…ð·ßþ;ýçcžqówóè¹ÎʾCK·íxÞQâ½Ct~Mmý¥¨¾Õ‚ÞcÂ1¢®[ýÇ;›Y~¹)/ ÜúÞ¢|x]Á”_EÏp]ÏÒ2l(ò¬5Ú'ã¥ÊþäÞqƇî/¯më·Í íYÝ“õQ–<`T`ù®uB7AÖCL}gÒÒ]œw3ÊCS½ßΔÉëusRå[šðirÃýäf&îÇ¥·0Ýë%ý%d;Öu*1ÿ¨½žŸÍó×IMâí\·GQL½Ë±ßM¤sk·>áPkXòʆ:*EìcÒáF,úI 3£¿#ÍÄ+òN&{¼O3‹ÃCíÿ}5±å´Êû~_· Ž>>ÃUMÔzÖ­}Bý#\¼9£üI_Ëôúß—7Ô™ uŠz¯¬ÇºòÑ¢šk¿/t"¼¦Ô£o©öûAËïïæÆ[‘º7¨œòzð²E¿ÏQgEZßš§G{ÂEpÞáøâêRZÏ«ëod‹+ :®Æq¡↻“út®}Y¬ã3èQUS?G—Z‘®;zS¾Ô±à)®ÐÇ„OG ºÅ<„¥7&ß«¯«]ÆòmÄŸEƒÌæU8¾5ð=é¡£°S¤ü—q¼×ôñ»|ž½/hÞ­ÿ{¹ÀíàRÒ§ úD£ ùÍÔW›ãGüýëÓ¼ñ"aÞB³xó#.ù¹8¿{EãuW`øGÜ ;Óê›j<^6ßžÑ?W¦þì63áêÛK}ô¬xþ.Ú„ó‚Ç;cÀ᥄Ä¢.ÿaÀõAþ÷y±ø ¹â{žWk²ÿ’m;tMz$6^U–7ª3_u–åï/×)Cc=?Mêb£[´õÏß¿k4þ¿_'5?‰ö/8Å_¨bÈwNÊ;jàḐ¡!á¼õTýý ¸´Ž–õ¹çŠÞE¾lãæÐû+× S|‹M©×»¦áyh§ÇcúÇau&´ë.ïŸiü•"æYûµÒ^7Œº«Ïú8â„û¿¨D~E› [î|*$Œö§x24ì˜ Ççï?ú ªÃS×àß»GÅ«$«·cðñü¶Uãqï´Á¿ÍP}_+>Çã6éà÷³ôùÉ”ÙúùùÛÅäË9Ÿ‡¬oq=ÁŽ%âï$oÉýðÒ647|N<èñ’õxì=BV²|¯¯Üˆpµ ïiG¶Þ°úž«>FXôÎr„¿ ùœï›Zòÿ=ĺ‰>¢ÁõÆÑ>Z¼,ã^Ûvh¥¯;£­èokßÿ_¥ïîjÞë1û‚W¦ç²g™O<û‰l¾ÈÏÇÅ=ß´âIï”!o—Ùúñ|lú–>ÁR?Ðõx¨m¨ 0Ý_Œóþ3mè™Ù< 4Ù¿ ]DÜ)u#’Ž+ùhÎÛ“®>&|+\·øÃôáùüŠzÉtã¿ÙüZ\óNëëâ™îßä?¢þ¿Ÿ&C–…_/û8[æËÇç‚©?ÕëíÇ!`Ñk*NkìÏ3èÕÇi™œÔ ‘y@\åx=ZÆÌ³VJw^Œ_“é™K¾hV:}0\û›`üWÃyÔÍ y¥Š’Ëê–ºª¿]Ôuqã3W—Ët6.úŸ ¢¯¶ÉP3ÜFËtõ ¼õë™w(Zþ-ñyÈ>‘”Ÿ•z-Ubö‡Š©¿ìjÈׯ“|Æ0ƒnk-š×‰ïÆutσ®ë|ïbú,¿×û…˜¼JÄ·…™ÁøÇ'\..}.Z¾·ÐýE×gÅÿýÂý–¨y+ïˆ#ßPt5¯Réu2?Ï×=ëHuþyËTÞI5ª·ˆ³eŸ@ÿó…€(òÕz –AäöÓqßÏl\tHwžñžŠ6_Hý3ã÷LŸ)_zë·D}>/Ý냦úë!q6¼_`†#C¾¡ÎT!­36œG®…ŸQÌú¡ØôýürÉü"ôxVt{)ÎaÅLQ‡+ Ç«I^XÔ>:™Š×ÑSís€ªGãu [^´Ü_Ì<«æ[°¼íFÒIî&ôK1ïM¡óv$ÚõC{ý}áy,ž‡Ž×XÏ£õ¯û"\¿ÈÀß)-C¥tûí¥mRoÁô=òhþì.ð >Orý;âó©÷‡ûßc~ÝÔ{’áÀõ:¿cñq3´^áu‚L*E{>Ñ´”óŽÙéí©N1¢8£ü9Óú€1…j\ÛKøqRïJê2¢Ž>®ÀÓÃÎ=H\G'S¸b|ò§¼ñöÇ%;Ô÷°º[þvAÁñNVq4èÖ@­«_þãRé'öݦÁ«…¿_hɲyåˆ7ׯj¸þèdPàºzây±ø!¨@º)MH׆õA5ö')gø}̬¡Ï]>?»š§¼{©àGÝÚNÅ+[ty­ßvýJä½^4¼Ç®~Ièc¡æÿûèõ¶ûolÞ§§ýÌhqõ¨Öb±è$àòÉò™;öªï_#Öxàóáýsz¨ºN¨žÙ|«aõŸ-І»j÷aüÞQJò$/ÇÒ÷麿…ó ØyI}<_kìnQ—»ÚRÏ`u(žÿ5õ§ò³@Ô5Lü(ï¨>ÏÏõŒq½àéxG˜¿ÞJè_aÉ!7þFxÝmëAäGÅÕKǬõNñ*ZŠõùnýípó_ôø’.L7+×±ÎÒÔ¢‹h©Cbнê}j#âtïÝh8\ï#Ò•xŸÇ›ï‰üÎÌú*vNËpüùMëÒÅ/Í1ä™ÿ*ù½¥œ§7ñ ·Ü.ü‰‰¹‰øËh&uÚ)/:÷¨Š›’:ç•H'7‹ëÊ“NN?Ê__¾VÏ)ï×ãv‰¿SS뛽Ž×CÏ» ù,ñ¾,0ø™w䑾pM5~ªaÑuo»Æé÷øßŠ˜Ø÷ÄyÁi•Y¸að‘óšo,³ÿ[†[“ío¨Çÿo3Ÿ”Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y麜_NiÞaÃEEâi<#på6~ª«þ)7Wt\úóXýæP•ôÖHw8 C=ÝSÎ[êõIt<ýÑçðãÛ¿ª×_;±/VU‹¾×gß ¨Þ+ÿ‹Æéôû²þ"ú "Œ÷A<],yFÕU®ÍxD†>eÞqË}#¾ ˆÜNËwÖy­Žÿç¸u|ýuÑwùÁªz}ö½•TÜýÙh¼EëùN^åýLsãËJ¾ÿÿ¦Ó‚w¶¶¡àáon&úDQŸÑ×ám ÷éÏw}6ª¼’/ô¼%ÞÉßÞÐGõ÷Ûû—¥/d{Á‡E‹tuÐCÕ/AñüÚ»ñ¾LÆæ,:V?5½Oâýð^ލ¸Zè~ð>cX\^Õ+¨îe:šÙ†>µha}¸°çeñÞÏÂŒR_5ôóµ÷ñµªý3°º@}²ÕyóéùV†>‘&¿%Ÿþb©Êû öpì¿Ó{Œªç´á ºÞ>¯?_¬ºKðï\+æŸú çŒÿë}Gâ…þ&®œ(ôïiþǾ+;)zv›×ÅÓUìÌôû«&ÓwÕ)±Ž3ˆéžWë8~–Jôþ!ÓsÍŒž¯ñøýÂõ¸Qhé»Êß×[—_:ܤžƒÔÃŽ©nzw~YLÿÏWˆ×÷z´Awúh2Àüù1ÅW=•Ñþõ6}bSÑÀv”wÁŒÙÑüäújüб˜ÿP¼þkåØ8[þ¬½ŽÒoCyê?éØßÑdÞ»ªÿ"ûZà¾ÎÕ;ÀÜpÞ¹¿õS¶ö{èªêtyo¹åÍþ:õ—ó޳|Q=CÜ2Hí'åý1LÌߣÕ~qR7ÚûM´<Ê‹y]!ž”ú\D5lF)Žõž¥¾ßg¤® /ù×Bô³}Qìç¡õ £ñy1‚úïvùÓ8¦þ(±_üê3ý=–ïÃ}·‹õž7ÌfºÌY,oÖ”ô+'ÿM?Ö_&æ%zO°í á7WdùŽ%t_ò^×ôWÏïúFj?n§šÇXKóÿ}7êûaÝówU¯pÂVÕ¿¾çGú>»·?ªƒ†,:n5Ò;|¼½¾?ö²ºjÞwJ}ñœõ]Þ/Ó§Ø óîÏ¿£®‹¼˜º þqÛ©ºcRw Ãuè­ã^?1£þ“Íd\LÇüÑNïm@¿µë§¢)ÓICCþö˜E¯Š¯Gl½Å׉|[!ÓíœÞïµY2}'4Õß_GD]/ð`n2ÿüM}ugô:WϲþRîw$õ ;ò>ì}D%Êj¸®4_`ê ñþ@ûõÎŽU¿òXtÑÿj¸ž×,U]°¤†‰Â@óˆúš]ÃçW”w{^¢ößÀ¶"¿;ü—b~½cš:/íØ£ú餳‹ẞ蕬¿ òX?¿ŠlÞ»¸³š—ëêæ%54q»¯2~ÇöC"Ÿ·b¨¨Ï`ÙÏ Kg<Ÿ{ÞÐ÷Í3åßw‹ÎWÿ4tz8#ë³)¯ŒùU´ï•w†å_,þ*±üÛªëŽÖ÷™Ç7:­IÕOŸØ_}?nø¶^¯x~µðø¹³>/Ž=Ýò ]6¦’ý²6œuÓ;ì.æCÜÕ!•øLúeR'mãõïÁ®¿Šxû9Kþ¹ãâðïGÿC­£o|X­·4guê?iÒ“ö·kÌêók>ûp qÍ;Kõ˜©µµ×Ñ;@ë^ãx~,¶NËH]Yë­©ïBÖ¹û w62ô¡m#õ4…ßlVóz†õÂÔ7£+ÿ²YÄ"&oÆ'eœ­é|M††Ÿu±¸/û£#û°ygX]kV7ñ>Ôgxón—;ýno?=×}Ù}î÷¶¨ƒ ý󗺿òÜÖÞMâùýÿ#â¾ç3y¶~ݪÂêV†ùÃ8nýzƒE?=¿þGUÂIW ¯ŸùuÄcú¼…ÔÙŒß}·XÏ®ø®¢^÷{Zßï¼;ôü¼¿þzü‹n<ÜRíƒçZçǵ;õ|ýƒl~©¬¿N|]±ž—¡®$ù›&ÿý^¥¾€Äã¢A43~¡¯µ{Zà‹§|S‚Ï*ý<ëï¤z’IW"püÕâéÝÜ}­ê¯xhÞÛj}Æ{9¯Ú¤;8žìOÛñ%=Ž¡àNõ¼-ë1_oQÛÿM-+[êy?`¸Þ.ÉøLÞµ¦|/¼# ß¶ç)•_D~réïB¡«‚ùcâÝŸQ‡UÞÆMW‹çz¥ª€áÏ%æ"΃â9ŸE=¼V†ºôLêŸMþšž_O%0^ ò;º³û{Ýûâ:ìùA*zQUÅÙ–wðùÕgñ¢Æß«÷ÿi~”ú7Îç{Ë×TþÐtê{3NŒßNÿžÿûx÷>ÿ¸Ëþ&;Úüƒ–èíW×{´£y¦/ûÍ ?³÷oã/ô:œ7ü–þyG‘~žà¸Wû^%êÿƒ~¢>— žtª›{¿Ô××чÅu>PïóŠ*¾•æoŒ¬iÝôy3ƒoF;æo Ÿ0amè|`𝰍¡ò^y'-øÍYµœò8X1SS¹±¿:OÜ÷–^W^K+öœ_ó_bþÜÏžs‰ºâû¥^ž>¯“~MM§¼exÎË[xФ£…m‡Cëp¸å…ð¾Þ㯠ç%û{,pR“ñˆu»=5åïâЉ{–ù´®Ê8ƒ[‡¿W/¹­Ã¶ý}'Ã:†Uúü°äÕúÿ7ï_n=Ÿñø–ÞédºŒiåï‘Ëþ‰gw>Þ¦ÿrŠSLy(ŒRulùl´¾$Òýõ>7à©-ø=¬BlwÂðý˜Í‘ð´hÏ{S¡¼á| m£\¼çÞû0žN*¸•uÙyÇ®&õ°\ç'L.rËc~dàM_Ÿ¯úYõ-ñ«A uÃÏפK`óðÀcñô^¦Óþ”\—yÍ×…¿¿8^žÁûK¼üމƒ!B †øò„ú|#Ï‘ÿPžê8˧‹õŽÏ_ C>Ò¢Ÿå}Äôk (.’| ÊçcìC¡ë€Ô¡ÁØ!"¨›Ž_f”Ÿ“u Ï$òø)ï;”]‡áÂoñïÇbUßTÖñ°ü_·%´ ÃÏ q®¿WÔE©÷IæµdØtžÞßõó†wÈ #ø"û…L‡†å©‘EyÒ½1Õ=±i¥¸ÄÅè±±ôº2mrÝ0^·™ßW‘òòwÐ×Û±ú¶x8€Ñn|‰Èz=Ãÿ(žÃÍÿyª‚ðu5ª¿-õ Ð,]½gÿ|ˆ'ï×AÆWÓ×Nèî|VÍOöÏöß7\§[‰|™ô“Ð!\××6Ðç!W¾#ø ùÝ{ª? —ü3¦ bå;Ïy;žÿuïõjÞ«©:øø…Ë÷ªz9áq†wŠé”Œ÷Í;ž~Ê×m1äë£ÚFË{úçAùxtÕÇ•þøÝ®ùÉ™—‰ü=ÓÃÖ%áÏ×èE±ÖQ¬{PïçõzB[“:æQc=nBÖ{“é þÍͯ7Ž;>Ký¿^2S™Å3,¿4t]@9–_üÚóç>±½£ð‹šÐçŽ ?ëÅáz&ù”G¬›Õd¼¾éþsu~3éÓ£cÄ8ÃP¯Ä¦7Äߪ\Á¾Nñæ҃IJ¬p¿ólJ~|Gšw"â’¼Óäÿÿ<Ýø»´=÷ÛKËlxi®8¬XÍ?tD­«³û€Á¬>ÔËPŸ_­ê â¾þzÜa±êgb…_‘i“ýüóÈ2ÄùÌŸ¶Ý‡À|¸}ŒzœM÷9ùs¨žÜx¼õƒ3:ß–¶aº›ÿˆZG«+/\­â·î¢‚¡?ÁªrïKýEçMó ZÒ}jMu—ù‹Ö‘€á$¡Ëå½AzŒ†>¦ù#ðûLëS-ú;P¬“®ºvqª%Ìnü«x: <‹_·ßß)~ôǹjH,Üî½D­'²:Z'ÓåýÈüq×ü@üÕ) z™®ë³‘ç8o 8¬Ÿwת8¹_ú€þ˜êÜuüâ;âpºXø½.ŽË3é£Yûü"T¤ù¤ õU6FÁµ£­ŒoƒQ‚ІÉïŠuyõ­ú÷¾¦`ÙL•_ë˜×ôñІ:¬·_¿¶=­®Ïëþ!ÖÙ ´Ÿä‡ðøæz5¿‹±w©þ~W1qàÎfâÿz _Pè6×¥ºÜ¦­b}éIqÁMgÔúêÕo«~Rk†—xðŸ*cÂ÷K%ïÄûô¤eÿ[ïpìŸÕ$.]ö7–~AÜúšé=F£tòèóÃDó½ ¾‡{ÿžŒGT(êXÆò\53ÃKà}ÈlzÏ®†&áxAôfø¦1ÃõóÜEñðuÜdÞÏu{äëñ¹%.:Ó†‹ÝÞ3ÎÏö÷—ú­ƒô¿ßxܪé<7¥mÈeq§Ÿè`xµãúçRâÖLÇóqƒ†:&‰õ.З¶È¯¹4Ñr+äüu,êî¶>¯¿)ܯÚOÛm|?ÌÕ¼ã¤Û1‡åÊQÜY#Ï‚¶?-ü¡Šñò·RW<­óIËpÿÂó»³úŠzŒAß$°=é7`î?ÄsoðKÒÜðx“þèV«ÆúÖI]…„W–ùèýóÈ{½î×p^)V\¤¯o/ýR1ü¹ÂŠ»Ýt&ªux4b|äöŒWGñ£I"*_5 : “ùÍü<0p’ÓyÉø ãáq9Ë_mé¥ÖiîÜ+ê–ÝÒÕÑø²Ö~,üä’—Üð(/ê¦]§däz"Ç€ó>N\çó:½ ]_°£\h|Çë$ü|qÛïEþîñ:)ñM=šÏîû‰øþÅ"/ÝúÎк*¾[u´Ö_ZßY¼7ÿѯϹq·vy‘ZôûJZ‹ñw}_ÜïÍŸ«øê§>?w`tWó¸ìjú[7.>··dù–J,¿0JàC1S­'ã:Ê¿Ïþ®šwŸò;q¬ù†®tÞ»;ªy„dõ;—׸OÇ¡:¯`Ù]"n–¼ä›GæqËíâºo»OœßŠÅvUiÞiAùŽrTÏ™(úÕàŽ„ßóÄ)±Ýý ôõÇë>þJ‰Gõ•ÛEžjQº›Ï«ð՗ϽIèN8ñ'z5:w¿¾7übKEÀŽúô;¾9ó\ 4÷µ»Š°ò#W^ë¤c&qêFõ%–ýÒýÏ¿ó¹€×þ§¨ìú«ðGž×êÜßûöŠë¸}œúÜ}õ­§•ÿ³è>È¿OüL\Ïo|W­IüÉúšâ:]5LÜŸu¯‰q¨ÿ8¾2ZàJæ²ü“_û™À£TPýŽ[ŠqîPý$Ü!ÖsÜ%ãÑÿÒû yt?¿Ò9týG]½ÿ`âµö¯Âê’{ç©¿oW3õÿ®â€¼?«aÖ+™å 74Ä‹oEÔmªhÈ7äÎVª§Œ çöï®Ó¨“ ¥|udõ ¨†[ E¾œæc¹Nr¼J`¿Üð8› þ¾™Ä(œêùûü‹^Ÿàúž Ž¿Pß›þ«R‡LÆëXÞ^Ÿ÷0áÁ«P>øt:ñ5rÒÑó‘ëj`ü´Ž$ÔóÆ Bó \ï Óõü{ïÆêÛ¶þxIëµxŸ‡ÇÞ}õ/¦“åûœò>NÔ¦Óêl/¨y?c}Câ!'®Wqx&}š|ª'"O¾Dz¥*n•âá!ÿ~nÇŸB\Cg·øÓ h­á|I‰{™;<>aR‹¬ÚˆóíÃã8YÇóyâG’ž±á¼ çÝúßïýªú¾dxU^æ|Š º Wëû§÷ ÿ§Ø‚»¼Lä1õ 'ŽèwÖÌLÝFâ³±úæHó únþÇ ŒÔ÷9 ð]N1Üàγz<á¢ÑøÀe¸µ­L×lÜÝj>†Š„_+ uhů®PêU8êšxÕØîÆÓ÷·o$u ,xס*•„Ÿßau^‘ø¶ÀvßK÷yB[ý|„¡ªþ×)ÀŽ¥zþ€Ç,󿸢™ê¿W¡yï åc¶íJ…Oá—ñùõþaå—†=çVß%¼¾I,ð~ ‹Çë.m“õSþ9f× ÷O ºYçËpçõb~4Ì¿˜ÜB¯£òA4žÌO`DE5~Ü\AÍÃI«‰,1H=5›¾J¦R§E1Ï¡!݇:†úV±!^X¿4t^@CÂô\¯÷‹M8‘Àþ#ÇÓ$Ü%ö‰õsÛ gñn²¼‰ñ¸Ÿ³zGw_æºÙiòhÝ ?„ŠnxŽ€nVö½!ЉáxF\õ“p?b¸¨“ ð€ZɦüÝõ Ôì)âî4´¢üÆæ'D? ãáù*K_&ɧ²cÜæz=¿Ø´þÔgz× ç튣õ눅è –~lÔßá}®¯Op8´2ð,ýŒÇ%ù¨zðÖqY~ *uÒåãº&áùbÂÏȺjZÇåq¯«ñº¹õ8¦ºl÷{Ôukçðx~Ä~·|8Ö/ñ9ùÑè×OÿÞö‚êd±üÀåá¼6ÿ¼"ö•ðކãq•ŠWÁŠºú8÷}ÊKÞ},Ãÿ>b|ØŸx«2å! /âáC±êOê:Ñ,Ús†YÍ¢m?RðAQŸâ“>‚燋ˆç(óàùá}Ž㮟é”CVL]çìÌð\P$ò¶˜õq©ât±f-é3°úáŒç“=·u&LxºÀù’n4ïkâcÁ}z§iž®C8ˆV§ë¤_‡ÑÐõ—¸™IÏ8ñ¸UÒ1žy' õÛjÑÖô#ÝZG:¥ƒëF×Vúø¶ñêç#“ïz’M§À×-\5,#¸ŸÏ=Ï¥ÌʬÌʬÌʬÌÊÌd ×WfzC9¦ÿ^ŸÕ3¶´Rùw–:|`üyž²äf‘ÿXE8Ï[þ ¯k_$ðõ˜.ü~\ÓG|¾ä"YKÍOÈ:M`™7%\3®<[‰ó0ñèýqYþÍ;ë¦ç‚±†ú;Ãwøã¾ã—ßôO§ë.ñ@¶ü*«¿Ç;¢Æ‡6<¯ËI}F\*ʲŸ¯í|çÂÝ]IÏ \ÜJs5õõ0î_Á‚7ùþ -ÛyüJ–ñÿóaQ÷byWÉk‘ÿt¼»ø”l;¿ïR¯'¿ºCÞaÒŸ¹y«Šë½Tÿ^•–¡ åE$î™ñAx_:ÿó„uRëyYôˆMü½À8ƒÿ•׉0Nðª%/+¨^Ëê :[ëp>­¿]{1>Æ4} ÿ‚Á„+Í#œþ0·:¬©~,<ïÄÿ~K[u½l«Ç¡¡gº¸WC~þ4ö_ÞšEë&åÛó˜P1%=9Î;q]³XÞ¹ª³ìÚ_'Ó†ê o·b–ðrIß"'.Cªz@Ï„çS1Pà‚¼S §Åx³&\&©Øz‹þþîë"ô\žØ%Þs©³¹ŽÞŸî*î?¶0ÝÚlÚoï-„¿w‹¼Ï#êUÕ'ü‡Î- èdÀ–|/ܯª—Ž.ÆÝž¨®„åå#‡ÏG2ô{·oPKñ\oß/µ÷öhÛ/óÆìTu’êGÓåsí;íëB7¡x¯.á(¨^ËûRØôPPÓQWžüÌ»)QŸL(ÞãU—Dã{6`ës!ÓA›Q'üw6f:s\ù 5žúiVÏs<õ=õ8üZáþÇ¡›útÅ5ìê"æÝ¹3ôøß¥ßÓ¯7ç¡3=zαéŸûü_ÒݱáÓýþË’é«rC_Üpƒš×0ô àú Èbù„|Gô¥úxßxü+4u»Nè,ñ±?îþbnÌî¯ì W>Ï¡¿à3¢’áû©ÄSqœ\Ï;¨EñŸEgs?~ce^¾7ÃÅð8„÷‰ì ú½hž.ÏŠ›\—Єx”qá¸é;Zü–÷0ÝïžéàÅ}sO[¶§ëŠ–úïMºhþ÷ †^w¬Û¨ÆÙ¾^–#ÏkX4ÿ¬Ìô†@ð¹†ê¶<µ£ÿ÷^²÷ÝT=ôyEïCòï6Õ ßÏO­û"\¸šA7«:å[Æ ÝW>.»]]·~Ëæ¯âìº^ÏŸ¨ÌÖ…ƒé®Ïª¡²OÒŸôÖ¤ñ†c©¬khDyâÏ ùyÆKDEõþcà:õ½:Aä+Fß®õ«KÛ¢òÌQÍÅ["¾øÐ§¹cBxÞëÑ }Bý™­BˆÍT7ôã¹ÛJ2ºÎϯ¿AæÓ7¹fmxžã¶¡ªNÙ(ƒnÁŽßëë’Ôç#„®‰ŒÛ±vK¨ÿ€jo“^BTÃÆ{Î×û4³þWำ¯Œ Z:üVgûÿ[êÖ™2ÞÞfèèVïIËx½)p>†~¸õ ‘_l'õ£û¨yØo;üü²ãuJʧɴúQÞGêuEM)ž±ðŒQ/3|C›EÅöO©ïSR3­kIMö¿å}l½nó; â]¯Î¸=ã ûxŸ3ÉÞ7¬ÿG¬~iXùs‘×Ý~RÌ/MÅùõs7\­®Ÿ,@õ˜|çq SÑ[ó牯«ñÒ Ÿ†ã©N²<³_ä}Lóïìßeæ9^–Îo³ä=Ó!·„.LGvͳçq}G¾c_TÉÛi–ÒïFõÑ}Ýô• :Þ~ƒ_Z›ñ»ö\®ÏÅu_òE¿ZWÝ{ä1\A9Vg^ÓH¯¼ YÝGšœGz0J¥O£óy¿ŽräÿôQ‘éÐ]üõT®ƒïÐz“Í},°’ߜ۵ÏÏcºòÓÕ9äq¢>28™^’?^5ú;ý3‘c}C‚ÛÇ[ý¼nš'{]K}¿¼3„;{)|]ôÞbñsÃQ²~>¦:žkpäF«ÓcwÛTÞ\*tOe<ø¾ëW1ÿ-ñžµÔ_?Ù—Át<“žºõ<ÛEÛÞÖ×Í·¦~Aáæ·Ìˆ>aàx7~C<—¼OTKC_+¶¢Íý£Í:é'ãáøzz\ªÍ¼C,O9Oà‡±·J*q¾_'þF‰Þ?|'3ú’ã¼™,Žm›Âó”ÃÂó¶6ÜËÿ‹Ôõmï$Q÷ìKø¹CÌŸYÑÜéºÙú¾»Ï_;ï÷ˆ¡¯îïGíÖÆK³wˆç¯yxü.ûYú±4¦÷læ$gf¸J\âX‡i¯úû¸Zôí@WUµÒÕ½3™­ß7äŠënêWo<ÎYÂEÖvÄK*ü-Ä‹“ãuŸ)æs þÃ?ñ¾á âýÓüýf~/<.}Ñr~[>Rõ©×„ûã¸éŠð<\WQ¯Åº<·yƒô@¼ôñe`”xÚ¥}Ü*Ô_€ÅE~ÿÆA´ÝÌê{¶ñ3u~œl¨'M‚Ÿéótp¡ Ò}¾e>$pœû>‹† Yœ-üô†lþënxw|%¼ŽÝHêYðCw|5ÑzxnºZÖÅ,Žkcz=¬î‹Þ%<÷âdýªj^½á± 8WÉOø7¿Bâçî»qøºÃû9K¨šgE?}ˆ®Ýx4†<·)Þø²@ÄØóR“ðUne[ËpÂßÀ²³©ðh0útx߆ˆuyÉë”ó8úwITIÊ Œ×’xH‡ôL:¸Cä>®»Ïáºâ|~1Ž?c¨~>X#ËœçØ®½>OjÓuB‰OÿE¼ºAýtëIÞÉ _äÇ›¹ô¿IW¼E:ü½@ô½«Å:z$ü=q_‘OùÏ’µ±øZ\gU,<‰T¾;Ú\âtÐOÍ›clE1ß´Œ‡OåxnëöR_nÆÚTãnX÷;7Ý€Õ¹"þÌTýöƪßÓI/£s]7Ýár¬N1µŠ>’ì}‘ø£Àq7¼®OØÌm~1ñlýðÈ·ÇñQŽâ˜WÝt$’º©¸ÜTÇÉà:íQ-Sýf¾¬†·çN<7ßõœXç¼g 3ñ«(ÏÉã»§&©÷÷kfŸó_¿Úlð¹¼ÓC¯‰ý)ߋقÿç0ð¾ëFËû!—ü/‰{¾úÞsᅵW¥.€-Ÿï'‘üC¬þµ¾ênq¸_ïÜüð“VèßT"¿Xn?ÿªHüOìùºÊ«£n-òl¤WƒB–Ï.ù@ͨþÁúõÙüq#N@ò¤]8_,j ÞßÙ=ÂyÁ?—yzžm<`‰×D<ûãýˆîŒ_¹g€~ªÀ?aßZâw®œ/æÅ"àÆh†¯|àGzÿ¨ËCO¹EÄíÐÿc…?€iÏ—*^ %ÓÂñý+¨|Wª£øºx‹ç‹çbÄŠTxQ ›ÿáTw‘õ¿™é×M îC„ÃjêSiª_¡s´¸Í¿Î Wîœ/Ü~BÏ_ž8_ø©« ÿË€Ï ìçE[7ÐCŧšêPܼcä×Jܵ#_×ÇÓ‡'ž·Ì[aȃᛸö!÷·—~!áR1ïgb~ŒÉ3ðù%gÉï[ÓÒÇÜÈ¢38@äë8o4p|©£B¼Ì>^gjD÷ÃÒoÏÔ10^ù ;¯àªËcÊü??štíXýaV¼>é˜Õ[õï×cÔE¨nÐQ­ç¨CÑ÷Ù¨§èdè68ô¾ã®Úù/SyÔLGÃåóþ.Ò_CušoŠÔº×ç;gÞ¡òMhÝÂõgT]½>4Ÿf¨k¯:á6ÏWq[û5cñÚë,ÿÌúiúy¯ÝÛBëÚ&\ ¶vˆ•§Å³Åq×Þ®ê—ô‹§ck=^[UÿÐ÷;äú3ÿ›©Ô_%n.pÝ(§ÇÛÖ÷KЇãb“ñRP›â×>oG{RÖk œWG¯!ãÕ1\5÷KmuÔ¢üÉõëb½oþ8™.’Áo.-KšWÀ(ƒÛˆøÕ±8î?›xN~¨©!:ÙΨt = Ÿ ߤ.¸qÜ>ÏF;ë««ùË®‡wäŸc¤Ê/D3ƒ~ÖPò›nš¢âógÞ«¾Ž ”÷¬Èôao!t)øüz}#½~/Ç‹‘&fDìc»bŸX/ùË<ÏŽ"UÛ;Àæõ…¯éǹ¼§šGžBü§ëþ¨òøf®¼ÅÛþ$òR%—ˆëw©Ð…ƨÅ]jüˆV–ºG%7ýßãYðxR¯ö:¨¿?;?ƦÀyþñ:ü3Æg ä%¤|?ã¢)êõ¤þÁQã`WC{ŠãMx×ÕC¯#×AM–×kFu» _QóH剋×TüÂ!á§šú>à†É"n–|ÃÊþÙ/ÓáUøÇ/bóÇQGÅ”„grã-DÕgAĈ ó?T‡tÛâÖApO>äˆÛxçn€_[•ñQû´wšozú4/øú7ݬæ ²çbI/Q×`þ$z¹Åkóù€xʤ×ÎõiÛ¿¨þl–ßèW5#ø+SYWóŽQ½ŽÅ»h§>ßÀù{&9á{1uˆ·/^,ðà3ôýP—êS†þ»˜-„!°º³~‹Ý×жD|߀kIý n ×õÁæWµñ –}_Ÿw·ôæº:¦º>×WC–åùt¬ûF5¿þG¿ K_ïí¿(Ú,<Ž ð]ä~ 3Z¦÷k&¤»>êQ«ÿ¤×³? Æ•¡â¤pËNQç:Kxü|ÒQqÕI¬ÄüÒšŽ<îÛ›«÷üdï3âYJÜËM§ô~ñâ0þ6ñ\ÿ²ÀËXž;l,_¡ÎÛ¿ú~£[¾Á¸ÿ@=ĸ=ñYPÖ[^bìZQ¿¨Íü³e«„ÿYŸæ¹èïk\Ý,LÛ9ùs·õ™xéiå›ÑÅà?þ²÷+·ü‹·jÑò8¸ï??¦µ8?‰ãG?Ò)yHï[ß¿ãtÝe<+õºQÅ‚šV%—ÎðHržðûf\ù°g6fù6¹^ zLÏ×ÿÀpÜÕç¾Ðç…0ôoâºïÅtÜ*éâgKyý|½_‚KZéë :uY^ÐçAUš¯ûÒïkN: ‰—Bñ±ì뇕ÛÝêÕhÞi­ò•¼#Œ¿Ðœâ³ª ×C|™ÏD¾ÄñQž[òKo-÷#ÿ½ðçò9ROWêøì¾Fõ?l}ùüãÔJw„Ï“pœXø|¬<™q\‰³;-o/ù–ÞAzþ˜®40(7Rî§äo7ìbqœOÜøðþùýÝ  Âã¿è}2Ä!è-ð>hhÑSo,ñi ŸÛa±ÛºwÞß:´îKü`­ éÿì½{›òLtZ Ü ×«°rôó£|ÿm¸”£|ü[$ûø±ø¡v< ƒÞ%~{}ý}•uÖšÇrhþ¨Åü~æ¡ å= <)ä…óýÏûÐï2]ͧϯ¥æ•+K\7{NJéuåò (_Ù”¯sÑðë’×lÝNâ¾/ Ü—€ŽCÕ¿ñçÿ~†ÿf´þW ü¢ô/‹f œåyù}âq¶w€ü‹¸zW5‰ïß;]|°&ÖúŠ&ì}žñ€˜zѼ\T¨õ¿ÑSÅ“¢©c~·«¥oËðeª?žïV ŒC}»P›Ö™•ë…_9ÔøüÔ)WnÚ÷£ÇÆ+ lo¨ ›Ì„Û“yrã~¬¿Úüý^4¯­úa¼ú‹w¹¾žq¿§,ërGG¼鬠¾#þuùcÚ÷â½ÏÆãÌ}=÷R‹ýßüʃÉp(¸Šø$C?K¦s\ ÏëÆíûŠm…÷wiÑOþWœóBQŽG6޳þeÇ|rDþ”ßïL&ë'Ï q»‰—ãŸOߦ©øÕXñh8?Ù ßç}?\Z†ªõ câ´]óšÑn¦¾.Yð„6~´ê°øô«+gºÔ;0ã»úçïpÄëWòPÞº¿]¯tžÛÒ6´§ºOñÇ;“?U9ž~úEÓ‹E59›t§%_ÊÈ»4ÔML&õß^À;n˜7Ä߯µA7¡À±þ]…åE:߯T»dþŸkß` 8>¬ÿXäyFR¾”tÑ–žÛr†ûV5Ï -“íoÕyµä] âí'ëOhlà‹å0]—¨îÂxxô)ýsÉû~Œ9/Ĉ'Ý{D¼¿=œÀöÕ)ïÚÁ-߯u¤/t³ñu¬û7̬¿Õ|žêЧ¢³™Ô°qœvA—ðøÒ–W“<{›äªÓ‘ÖY”÷¹n!.ùu´:žÔݬ³ÎV—ò˜ƒ7©ø Â{àRˆíbâð“úZtéß2äywÎבWŒ–?ê/>“ý¡°±Žcó«z¿=¥þ—i™+9ªy‡ù}M_·‹¾¾ÁûK¼¦3îëã˜ú¤K±ßëÜc»¢Ëpå³j}»´ó‡§ò9¾·Ow{:1­›òÄuàùú>T_âzGͨÞY›ÕE²û³/†¿1ýÕЭîöøß^Èļ‡å¢Ÿºª¸±¤úTfá ç‹øM£ñ…Ñ,ü :ˆ< Âñ`Ò¯ô>gõíG‹Î%¥ž*êãM2ßúÇéÑÏi^IËüÀZ,O3ìãp½©7U•tóßÔßWSþYæÓ9?Û~#âC¦笻¼øáùéϺ½¯)ሗÿ"£ºcqûÅE5®)ëH˜zo2^{«˜ý…/:­Sh@¸ã£–üÎâ?N•­ÿ²è÷ŒÖûèA~Ãã=Oè&xY˜üõHó¦­Nc<^aŸŒÆ¨žŒáÓkŠÞo;kÁ[.zP÷ºÅã½áþáŸwÒ_/äÓº#õšböóÂây±ôOã\tSº}˜²ÓåÑÆoÅø“»jŸ—<¦Ç˳ºšw”áJ‡:ê_TŽWÿw5léÆ[–ùæŸû7”ÓûSù-}~ðÚ®*îšÕ+9.ØûLÏ·ñõðd}½¯è³ãróïpÑèTŸŒ!Êk¾mà‘ê?O|Üütñ²ºä#ûŸK>Öav¿ò-:b]¯3Ö½Îÿxôº’sG^&üÈ:–<\-õ{Œ{ÊMϯá9n&ù*s„¿aáö/dý²Ãó¹¦þ þþMÝâ- 9ŽÞÓÄÉÏ2ñ1Rôãóu±lùÔñµ“áV&ï ]Ÿ$ž…ëÉ-z ?ˆÍ—êqÿÕÔßïí§|ßæß…ãÛ/»,ÒódªGºÚ&Óóûܲ>®xðo©ø5ÆãJ_óÒ©‡`ÜßÜú!ì7|Nó'j»Í’ïlüžp&>Óù2‰÷Lm¼?¦3G8*©‡‚FÄGø”áð[Ä‹ŸœÏƒæIô¾ïT¨^Ó5ÆEŸÑ¿Ç(dy峩Μ°+ Øõ­žR°HÏ“C‡—"ù9˜ü/1_ >)æ«“Ñòø¤wh}ÕÒé[f=M¢N¥ÿ©}Ïx]#òø»_ró— ÒÑ Fc¦"õ¥çëßOôÉL½ 9ô·Ãá4duŽ–†ýcâµ¥Yý¥"‡z9¶ñ¤>­?>ñq%>5iÝfŸ[ÇõÜø X|q$¼?šªýÏ¥ÃCHËP“òÚ·­ŒåßH~œñû¦¼OKQ7Ã÷Kh¡)Ë×sóƒp¹ í5È(žÃ;@¼Üo4~B‰‡Qý묘yµQ·«<·ÑïŸÜ0Vq–>²®&ë1XÛGŒÛ.~ã£é’¡U<^¨-_ë_13ù.4Ó¿èY’hÜ ­ÿžw*"vÒÚtü³þ"OoÃ¥™tY¬ã—KŸ¢b:ñ‘ìûmÓá ìwŠùßsV«ø‡\æÏ ×Ç𷻌òrŸòTÃÂëèšÙº"ïoûïã®c×cFx>dù?Õ8_ù–Ð9xè9µþ°|§^çâCu]4ñ £šäÇÏ{#)e]=\Ät9FísÛï¡«/h^NÚ†ÊL?£ŠžJöë´Ž¿û—‰ògÞ{Žþ`–…ïןtÈNE‹»0èT×sŒ[»p.ª¹Õ?8^(òùôg¸–Š”GÙöžˆF>ÿu¼âÖ.TC=âÕ ÷óÐ=&ž¶ñˆ^tÜÞÐÇTš÷»¿/Üþ §¬ë¼Wr¯[~Ñt£àéó/x|ë`'ѵßlnÄ>Dµ yK˜é>Þ{¤Ø1Ý<°w6³8V›!7Ýß#uŒy¿ò ŸTðpø{yÂ1oq€Æë1ÏÜcw©êQ¡eI*ã¸òÊ1$¦~ẫÑòÈï¦üå0¾ÜŒ«žRö}ËËǬû¤ŒKÂH‹.ìÎ}Âzú¾/¢ÌS>OɳŒ¿¦ƒ¨W6‹¶ÆÉez¸I4u¬Ç_¯ÆéἬ¯ÓKQŸ;ÉûBûp<6UèÞ|ý³Tp6hH8æz'W8{_*y8”3øÙáû™ú­`õ*¡ãmÈ£qÍ£­ÛÞñhú“Qëaþy1\:žìáOýó°òëúëX¾tõ?¼Ó,/ØÁÐG¤gxÝOéß{Ò@{Áäør´4èwU·>`Øb᩼“4oÖ'äoŽþv«›ôϦ/ùóBC½~OC¿ÂoÇš·¼O ºDñÐï´y§Ð…|ÝR¯Ë‰6bPùó¢“ÁÍ5_žÔ°é;"‘Wºþ8ÊŸ½@?ÿQ ú«‡$Ó-^ö5Î~Ïðø1 ùâ‚Âï¥ehXJy­á<}ã~›~¡Ï?tSu±´Då'ÖK‡?fä®uãçs? ©¡EÄ<Éjµ~+ëÌ~зު®Ï7´Õë!È~,­…ž ª¸ùMQý±óe¦¾Ex¦ß—º§«®}\C½”óåMÉ/íਵáÊDx ™[ª<t¹JÅGåDì«Ðí»Éôwú…ç­b;ó÷zÝý\†#©DõíoÎUõ±O[Æ¿V¯Wãç7gÞ­ÎsE€Ãù;ȶð‰OèÿezÎ\ݦkü= uvƒŽ:ZêC7êûT9ŸOe /îƒÌä1LødtuÄYµ×ǃXù±.,»ËMß,&>ª¡\Ä>tL7 zdÇ„|¦§@ønÜy¬TøWÆóê¨ç½£±¡ÞÒIÇsã}Q©”ø®SEŸ{“~<Æ÷ ]O1c¢è·rL_§p>U?ã°lÇêe²_²’å‡P?gê—…‘*ÏùŽ}À®l'ò¶yNê#µJx}G=çè‡ÆÔ7Ê ÷$(ê¸QÍU?Òf˜½Z¿Çÿ£TãÜ´pèq äFÊ#xÙ–zóOYd®È#øºØ–~óó퓌Gbwýߨ¿§!ÏßZð61‰ùÓÝ/×ãÑŽÞgþ*‡ëÍÑt,ºÑßzœkÌ÷BÖ‘"ïG|4÷c0´J¬y-õ¼áŠÐÌ‚/”z¡Ë!ðYÜŸ¾LßÅ™‰÷ãÖi2e¯‰VÄg\øÛTë9賟iqľÇ)­/æñõ~†i޹РC®L/êϺö;F–§[!Ãù)–ï@Q²:4‰cA—pÝGd1µRòËçÑ$Zþ]Õú‚'èT9Ñûˆbšº3¿¥Ãùé7'ÖªyâÓb÷}ç•wç}NþÊE¿ñ^eõê6jœËq hnѽ·UÜÏ»©zÁ/:žÕyy¿ë¨†ÎzÿQÖLøé´ =Ãu°Ë¬t +Z$Zoãö Hj6¾›¿Ý%úϳÃó ÞIò“WüC;sݪÀø³ŸO%o+ëkIÇñ>`ÿS4ÔL×?Ç=ëÂõ`Ú‘îœgÊ‘ŽÜ΋Ãu/÷üL?lÈSî{:<¾¹Xðöq÷}ÑúGäÕ ýHÂ/âþ·Ãõ/DÔwÌuÔß3èÝG54vÄçQê·ÃŸ/L®¤Æ‹Ýõ¸U4‹¶ÙtÓ“j³º£.o`œÖj¼œÖ}âøj\5(]]ê“€,ê×ÚWgý6ÐåÎHø<´rÔçj,Þ‰ã3n7Tõ£1÷[±ð‚¨Kø‡ñogÄOB^øs€úñpS¼þbÜîLéôIË|ý­Ž:#Ÿ1ÜæúWÂ×󉟪q€üÛ%š^r¦ -õº’enÖXàã ýtüí&,ùz o—î(•û€ñŸ…ã)d^šéîc:}ÿrDœB·öÂî_!YŸÒ#LçÏÀëõÎÀç»ÿ)ê#wvQ4Ò¸ë+†wýƒ&üÁ >ê™+²£áŒòˆ{qøuÆîwSñ۽ϓÍ_(—™ø—ݬâ”ÞS×#ïpÄç·ÅsÅÑtvã´×WÜd²/<ïóg<¾Aÿ ¾¯ž½¹XäÝš9¿Ð çù^™6SÏ Å0¸]x‹Ê†þ%¢Í˸–ò/ Êf(¯ëÙ@·~F¨ï6Ÿ¢Vft£ýñwwy îݸ_ªWXê”hAqcŽA¡™x~\ë]ý³ãáþm¸`ôQù’cÊßs8ª‹yÖT¿Æý/»á&ï¦Æ/Y¬?â]#âõEvÔ¹G£ðû‚Áz}¿ÿÒò—UJê×È[”Ó_'îĵ¨|Ò´çïLýhœÇ\Ímþxôý{7Hô3´3ê}¸Tÿ^`"ãÝŸ™Î¨c¼»à¶µ7þIfûŒ•Y2C3ÖGHò÷ûÈĵϩwAFñC6+º > :„÷KjR/Ã-}ű:w«5¥ª¿è·q:ï¯w6Y]Ëï·Õµ®“ž–n±w‚tv^/OÑJäqãƒj]á·ø.0ÞÀGR}O$ÎE“”û#õ‡y݆ëáί×E=‘éÇ!‹õÃ=–Y9®Áà!óz­Ídß4ï}®Î±Nœhþ¾qœüð<zÞgû‰tü¸›#=ß6ý/® h§cˆªŸ¶®Qàx·üX™p™ã~ÛïŒ5?áÎßD‹ã»öÔóƒˆWÊõçÛ55èÄP]\æé‘gѯhÉøƒ‡¢ÍϨÊêCc(?ñÐÊ—‘ßbèÅëÃï ySô ŸoѪDû¹Iß3°?é©¡ãÏâሤ4?TÖ_Sß·´ ýÔx’÷Mó>/e=–'‹"?„6Í%úýgLÒó4š®oÌøÊÕpÛ?…¿YÉ‘Gþ÷gžË_»G#›êß×úuÚ†B•nqz@(ÛRg¬Ãx§y4ïä»õ¡ÄäIâ9ºX hNºFy ñ¢…ú>[íÚ¥3?dÚP݃»7ݾŸÝVed^AžÏ^Žò°- óÀw€ãóuÛUnÏAnºø4Pç-‰_4mïªj<^†[*—™ç ¦èñ¥ŸŸ_¹.EÞïêð>!˜¨ÇÙ`yd}Ÿÿã8´Ÿoùk¸?uïûb½t¿¨Ãf'äW¯»9Õú°Í\ó¨ç—˜ò´¸ö·¾ Ýêý*©xQÎoÀ”kBó0غS¯gQ'ž?Éûáa¤ª‹ˆöîqÉÆZbÿÓjý ßxíÜ àýN½c1õ&ûÄôß=+þîÙ*ò&ü:÷y>´n$ãH<øC‘£:(Šõ~¥©ÿÞ9é÷ãæ#n}¥v]f‘ÿT—åƒ~OqäÅ"ÿŠü”òŽ/é×ã¤}Œ¥¡}8o] øv¯ÇÓ=6èþÆgº°œï~¾Ì5.ŽèI:G7ÒëBÅ磪¥Þ³zJh\åóaÇÿsÜàìëE>¯¶…OyCMÅäë; KL»ªã,ðy‘>î”}qp©ˆ3°ëV}}+ß O,}µˆOK} l:'™2ÌùO}ždº^§CâüÛWçñ¡!Ã&ì{µ~‚Ù߸LªÛÊ>mþx¯éýyŽÛŒÿð-õq/òKÄßn%úóŸw“à]çXðÈ»O„×zRžãÒ{õ¼¤šŽü Cý{Ÿ;A[uW“ýê±ø1qÞT¯*øn&KïD¼ãáÎB_tIÆ3Ž?8^UçñGªz‡èLñRG§²ùþ~=K·>‰-‰¼âé”õÀ |îÒ2ï·÷É{ÓícºG]Tn èdÿÜ{½ÚgiQFðc<ÏlÝÞÖo|F–Û82ÿyý„P„Ca¸†ì/ƒÞn¼“aHx=Û:=¤wίúéÌÛ¥e¸µv*õhÔ¹0~7Z¥¤‡[L—ÊÔO–û3&ðËjœ‹b~@³ó»Ž¤e6½'»wõy®/+ëiŸgÚ†’&·™’.MRóްÿOêã!ÎÔÕðä?ê&Ó; üû®ÍwÙ[_O3á†1!/¼Þ7ãÒRÍ» ßàÔSóh§òìщÅsí’õý ÁÌtuvWžþQÛˆý75Òsgê‹é·üu‘÷)©®çëµbý‘/5ämF„ãP5îÕ-¼ÙÆnõRïÍtt»PJ!Ìý–š_ë.Ö;©"±ð{Ÿ0œñ ½¬:†ü@VÄ|ì$·yÕèïmëÄyúßùç}Öqäþëï„÷¹Àt¼¹¡Oftä°«k,¿ˆ?GþxˆW½ù65ï–P_cKo3®‡Ë¢éÉIãúãh§Æ³Þ!qÝlýœdžÍ§%ÃÕZt¥üí*éã(ï4Õîž‘þC®fzîüïÏ2œÈØj½œöÇ57ª~Bo¡÷Èë¨-Ÿ…¿Sï_Äþ{&~Ÿ·¼Üð¼.êŽ8ªáó!Ê“Ž(~í?¸æ-ýñ{±ûþ{y¿‡¸†v†ü~5æ76sô#ްë_ÙR7˲ð2Æg‰¿†ú¹ÝWCȺ+{ cûtëa¼¯Eà¸+š'ë×Ô‘ò× ÿ_©Û€ÛvÇÃén“ºFºŸ¾žÂ¥ú÷Dê¶z:æÍ8®_ ÒÁÏbí4·÷›÷ç»6&_á®ßˆúØ*ÁFk½>VŽ××Ë"êР˜Õõ7ÖóG+„ûmhžL'ÆdÒÿç~MàøûQ€ólð½ßžcî¡–zþX$ø¼®Ïû+޳äTó>ÎÂÄ3î®âdßTÿ^É;À·£úJÂ>½IyLÜ|þôœ•t^³¸áDÆ ž#ÇÝ£^fyÄe–óN¸Õ“’öÁ´ŽßÕñ<òÒÑ}A¶žÁÀÃzæÅŸ)qŽ%>|ÍH`Søz'8^?µ>ŒÉÔ/té¾Ré ëjhÍò9™­‡ ݇íï%Š¯ÐŽüA>±Z2],Qç_׸Ӥ—é|Ü1[´ó<ú¼Y‰1*~›÷;Òm®”lÝAGñœaÜ7"ÍoÞ{â>{~%Ë€ïrôW1Àâ¨z¦ü•õ8÷ý,ù³5Ë? QuTRë«Áû•£xê0ËûUÎŒži³á‹ÛOX¨×…tÔð·Ïfú|Ùô<;Öƒ0ïl<Þñ7½Ì¤†ú–ù× DÇNÚ8 LsŠÐ;WMÿ{eÿÞSò“2‘aßU÷÷ 'å½ež =âùc&|4†¨yEyŸP‰â¸ ë;-D¾Ðû‚úCVŒ©X9烶”·nÍê.MÄusÕ½ESÒ¬Kõ„iC„~CËûCúïX­>jâù÷þEõ ×ÕuÎûœñÊI·{êêy„¼ŠÉäºîŸÏµ-ÜêUô~šôbz†ëvÃtþ¸nžq¿Žz?ƒ?ÕÏs{öªñýE*Þì|éBùç3¼µÇt ¼v}zN— JÌ<ã”§DƒÌÆ ž+©¡YÄúV…tâõ¨†[nÉHŸߥ=nà8ÕÜê©’g)û±¡ <œ÷½tñb¥m$æ+›nUZÆý ôLÖ×÷Ž:¯zTq …ê<‡‚ÌÆeh!Ö¿¨}3¤ñ¾FÜ¿0·[¹®O¡Wpu‰Ï{µT?çTfæä±:ýÀSÕ£@ùduIô¦ö‹ì êV{û©ž4¸–6ÿÆô}# ¯ÜÖ®@Ô¥Mþ/õ/6ÕgqßÏÝúxP¼"ã ÿó†,¿hY,LmT*ýåã¾oÒÐåTèþÞ//,\¦Ì¶>ÙêΘQ$Öý[D<0U䱇 ý8©oŸ™³/=ÃÕÜâœÀ~•H—³%õ}Ëe:ã2_µIÏ#:Éêœí“õ³‹jFÜr§xó,òYÝkÐCb~K¨ß)3é aÑ¡xxÞ”táL†Y9zýÆS;sÔpÄÙb8r”/±à/Ñ÷»áóH[–gÀúB•™§êEõ•«Ÿ }o°ö;â=ÌŽ6_a8á°™ ²,ùו×|©ã›¸†óõºÆý®6èÁQÐûÂ1ŸhÐãÆ®êó—OuTâa =õY¹÷n±Þ­ZËoE9ö®¬|^ôLÒ6Ôûß±Î_¨fòGÑ(3y=4*ü‹ä#ùÿW _‡ä:èxESýüP?]ܾò–>ŸnÑ{ÇE¢>©«õ;®º NëOòwv˜ôvÇ¿÷Y7~ØS…ôõ]G§m‹Å|¹QôEÇ•"Á[: ^ìíEÝlý2ã#½ ¬û‰ž»j½š×úî{‹•ùsól¡×Âúbè߀á¢O2nÞ!â“Bæâ”´}:vÿYä7Û…óŽgè—Xpaè%”Y2ÃÕwg$‹ÖŽøœ ¥Ã›4ê/²Ô[·=z~ú´4vÔiêg¨·÷–Ÿ—:tQÏÓßߤŸvÛ´tú,U ý»«ç?zûàsuÉ[zþï ÂÐü‰KÏOŽ'>KEÏÅfg‚õBg{ZGŠ+q±H<¢M·xù¸¡?Ÿ¥ƒ­_õ<Yð9áûKÜ Ê³úÄiÇã³~鲟K€ÓÀð>¬+ü¥áý½žÚâ‘á×—é*zGÈïÊq›g½¥£C)õÓq5»ž}Dÿû¾éöñôÇ}ä™xz¸ãñ¶ýýž'ÝO¦sbÝ~æ÷ôëL¿Å¥O-l'žã&†~jb:É”_Æ×f´ó—Ý0ýhxŸ”N–>—i~™&Þ[,>íô>à"}6Ù_3ðy=˼Øõr½þvt×}ÙŸ pœÞ†í'ãx/•.¾ yŽú¯Ž×ÕįA·ó3ï%5´T뫱û Û™(~Æ¥*¾õ ýr°)ôüøó‰z†|tžc_ÖQ}UÿCöɾü}¡ØÀC%?-I¿w4½z\lÐ!ù­!ŸQ×­î‡ú™Á=¡dP¸~éoôï ×'²™wšôL» bdEÔ³¶ô Âò,ñ÷JÁ÷÷°>.yýŽ:¥««„Mù©êYBÈ“v—ú¾èÒ^äõ¨®ƒÑ¼Íú-b¿“éÎÿ²ßz¦ûãž nÛÕ·ÔS9Æ)Ç©~µõ/HÈÿ 'a¼Ê “):ôik3SŸ“¡ë³©m ýêÅì¯Xžð¸WœUëõ φî³|ƒ ïa3©³àÛ’Å«×Î×ÎgœjË3rÃ5{ÕãÖvÔ]ªææWÉóC¡³è=géß°ëIÁcc::˜!òÞßâùÙÞ§Tûûd}///ò*WÝê4{Ÿ°¾˜= ÿû—ˆùºM8NÉ;ÈpM•è¯Ao)éüŽÉxSi›Ì«¡0^_O›yï ?Ã?H…ïˆöéà:Q‰éçµO†S?߆z½{d‡ó¢pÕÓê¼ÕýËÍwà†þé®Ûè¼&.뺭nùâ-Ûxò¸â7¢^0KßÍß®:õÍùL¿ŽrÞx\ÃŒ«Üê†t$´S×g©oޝˆ¿}Ôë‹.Žýá7VׇAbžÀÄ+õ¿Ÿë¢çO³¡¿Ûöÿ _o+êã$Ì­©ÇiÌx¹>{G üÈ¡%êyñ™³>Úö?†?'ÅÔ׊ù[¼®!ýwÛñ¸ÿå×Eõï0Tð-¢òQ|‰Ÿfñ>Ò=•çGöËäzX(&¼$ˡ귡"«;±z ò7mÐOîD¸OÆ«D×hëªüò[òÜúÕ8ÆEèÕ^ÿ.ÿDÔsòMãoWó[=Òë0ù°À÷:ö[Áhá/¢Õ áùð)+ÂùIu.L:õÁ’õHäàmºÞÙŽxnÆ ÀãµNië[ƒÞÕçý‡vyޛ߿ ç› Íx> Ìʬ̾<Æë²ÆíÆ_'ê0#îõ¯1—” ŽãWª}Ò¼×ôy`ä’éác¡~¡´ã¡M¼l6ýgÜÙFïçGÔÅ™»?#÷=ßPys¾­ß©ô÷'Ž}~‘Gù«n¬ŽPDïíœßÄÿ)˜ÔMk<´‰–ÿÌ”aóÒXq/.ÊPŸhªGøÌùzÜœqœá”ûÜ‘O0hŒˆ[:²¼UK–ïj%æeï”!¿Y‡Ž{Ì€ïùg´÷ÚÕPŸò4…•sìsóTï>©ô}p¬ÓzÇ£ép '³ñ Z¦Óÿ&òq/Õçc'û^7MW7E¢ž‰F޼¦–ªî8v>§çÒî÷Ìõn¬Ûwpã?öü=•ï]'<'š©ó ïoæoWSïWz"êŒØ®òV[FÃÓùûí{Ù­~’›YÞ¤I—5Ýð›&CÅ ë8:ò}ýí¤û~ÆO¨Ãäc¨G¡Aº~T\üu\KùƒC×%Ô¶n¡¥¨¯H\5F>šÿª².Tý[tÙ G7Èõ|È¿o‘2ÞÓÖ—7'Z¿yt·ô9/ê6¥Žodõdä±úó£ËÔíYÿmëø}#´r¬ŸW%p‹ÌòÅ~Ïðºe`ÿ.ÔG,—Õ!ŠJÂ÷›£¯Gp“ý^dÿ\tH¨{—'Æ‘:†Æí ü¦;ê>ÔÎLœr¡šwšxÓ§“õëÂPñ¼¡Õ•»„÷1áz¦&<*ºÆ‹P> 7Þ«øÓÞÇücmöÞ´Ì,ù¯3=úÌÄ‹Þ;nÏ…\w¸§«¡C´uIæ×ãÔN¿ïÔó„Ð-ZŸÀþ?ÙÖkW3é1øß¿+ó$éÆ#¨ËÖº€„þµ÷ÃiîMÊt‰ÉÓëîß÷kÃòeæÕáxf䑜áý“ýµÏ¯ˆÍ·†þÇhÌô ‹ by“PÏ#/^]#Ãq5hA<®,}œ‚V–õeéõºœ—‚¬hëÌ¿Y·ëøº¾ÑWÿþs<Ë…fœÏ{œCu¨ÿ˜œ·_¢~oˆ³üïY|ƒ…L—ÃÒ×Õ3ÛwÙf¦ú7šž]“¿, …)ëÍÖŽßsóö“~Øžº¥ÒϨ¿Ýð`*ljªçájœ×dݾV< Í õG΋JY¿Ø{éËÅ3ÅœŽ¡þ¢ìÓhüÞ g8Ž#þÅß¾–c|yÝÂpp¥˜ù–&¥ƒC‘ºG¸ìÖTóƒi*‘®Úª_¹ñ}Ç«ï£z8Iâi¬ãdé×kž—õqmý³¤†9¿÷' |ÛËõý¢¼Ýò¦Þ ÆOþ$ܯA_‘oDõ¹Äàd:r™6Ô×?XÈ{Û¢o–[º}DÐ>ßËf2>É´ûº;¡¯÷Õ§záP¼W ñä>9×'‹÷›MËÐ!ü½²ñ¶pß$¡ÃÅt’1v²ŠªàÖ—Ï |žõõŽ™w»>;Ò~è©ï ‡öñú«£ù£Ýˆ7ø†©.Lóá°hëò#òªæ¥M„_>¡PÕñrÔáø>Œÿ“Ÿ'ùr½Äì‡Ô¸kåüDñˆ¯W3øY1ÞöÇÄqF\¯âìz Þ'¾õ†ÀmÝU]ÏçVL%.BOõïÿŒ‡Bý®¯øþñ½b~y'î_颯•íâ=ïšaþpkªÎR·<­ãxgÕyóÉ£òºP°†ú/Å‹¼¿ðBû u¬ÙUôÏeÂïô ýíªêã`¿/UÊ—|bØîEø7­Sü#NyéB ú¹êOV6ôCïÃð3õzõI }ŸP×DZņ¼áÖ6ÑënK=évŽ<ÝÇß<@KÃõzð±.ÍþçµL¹Þ•ú/xòÏë×ï-ÂÙ}äæaâ´RÅ)Zug©_´©GêçCxôRñ¼þüqù¦Dq¨äÑ¡H<Ÿ&Þ$šÐyTäx%ú¼ä”¨Œ#¨2éÉÉ|÷°hzèBúsï2¿ãÊ—“åMú \2ª:ÖkG«ObÏ?dö‚HxfFŸPÏÿq^ÚÍ õ£Ññ‰Ð߃[ΪõÒ-âñ–îû·ºÊ¦÷ô~vECüUɱïÓÉp—¿(îïC]Cq)˜ÿ¶wÙ,ü<ÇîËu©æ™°iÞÿ)^`™•Y™¥oh}aè_eÚlõ¢2û¿m¨÷åÂo–Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™}Y ]KôŸ?^7Ý2ïd<] t¢¿E*ŽÞØŸ®O-Âa;â—‡<£lç6àc—üCàÉ·n„·ÇP1žì‹áý@à˜%ãÕß…5Ôÿ¿÷‰ØnóJÁW¿d¶ª;t&3ºZ&Þ:%ÓÃ7ϱÿ‚É€hý{œÇmH:…BÀ77I¦¯’Çú/æ©|5´1ô÷mç¦v¤/Þuv"7[ß<½D¼®üõêáðÑ󻉸Ñ`g€j†>wüìý ¸$ÙUß‹J]Ý5u«%¡!4´f©DÆÞ;& œÈˆ+#3£"óTŸS`¤FBbHÌbB #K Œc<Â?sñõgóág›‹g0Æøú]c°1`àd1½½#"cý׊Ìsòœªj‰{•_wý[{Þ±çñ×ç;Þó²úÞ¸`{½qðGâ>œo}çm½»Öº#Ò!ùÒW×ùí%Íy§çˆûS.žñ>ê—ìŠÏÉç$;÷4ǯܙwÿœ¸—øyo©ÿ>­9'÷)ßÎÏWOšsã¿/îßx×kjóÅŸøv³jÝ)~èlç¿ðKêû­O|·ÉOßÙóüâ]ªäåÍ;bùÎäNò±ÛëÕ]÷g'ß8åç+v”ÓNxgÇ}O÷íxWâ»êó?ïïi¼é ÛÐÄ?ÞÑ>ß#Üyê~÷ê%#~ÇIæ6÷*$_ñ¢íç›ûνß;\ÉÓÎv¿ÔÁoÝÙö}×;­þ…;ó.Ö¾ïðuì=§9‡þ„sÞSûªoçåòs¿å¬NœìþSîÎý`g~Oñ¡ýîuJž êÍþõÛºusßÛÁ·ðzes³å÷îYo¼ÿä~…tWþ’¯ß˜<¿>¯·¹wa×û+É[þnÝŸúŒ§Ôý„¿ó5uûüš/¬Û¿WŸw{YsŽó3¿‘Ÿ#üÁgñöìk¿õöÞ“ šûv¸½û ’+â~œsÞÞûÖwÝ+»ïïà?6ý…[¢ü¿NŸáúÜßp»õuòQâ}•O›Ü•{ÃÏúÛ÷<úi¿äÝ¿y[ß]Þ7¾ùüL3N»Rÿ=øG·wßú枈ÓúÉ;í¿¿¹Ï%áõúæÞäøÙ[ïyL’úþ†äÒíµ3›wµý Í=Ù»ì'Ï»½qþÁš{Ÿšûžþ'¯'’OùÕý?ø=^ÚûF›÷À’¯ñqô'ów‡6ó É•º?sÚ;¯gý%º_'ïükç»éèåwôœqr­¹§à”{½“˜Ï帪•ÿGq?àê2oÇÞù-uýûi¾ö÷°º ãÙò»Ý©ßÁïŠy“½‚ß?xé.ÝvÿÉý²Í{XÉ#g»g«ãÏ«¿¸îG¼æA¯7¾€ß–½•ßË´ç=™rÊ»wè}ŠÎ;y÷ßÙûà“×íùóxÈÓíþ¦ÞÔïº%_ðyý²£ÿ·yG)?ã¶î3Ië÷Œ’5ï=îyÏü™ýydG»ò¤æ=ÆÑÑö{!^tʽ êêòþßTÏÏ}ï÷²qs²~õö{ãwæ^ñÓ~É×ý ¿úó^Wï^}ÏæþÔä³^Y÷šùÌÍŸnÏ!ù–ÇÔßóøÇïJ»”½™Ï—ýÅÏÚ«¾K.‰wnÿ\]¿$—šþÒŸ6÷èï¸'>y°ù{ùl÷£mÞßN~臶ÎWüÂÉã—äfvb¿Pö:ú¿º}~)ùÞ¿t®õ›äÆ'×ñùΟë=¶Sï…ýŒŸâýž/ç÷o'O¾3ïPïZw”áÛ¼÷×úÿ qoÑ󶷷Ƀ¢?'çKë«¿±}| ûaûþ’·<åÃê½<ù^ümÖ—“~ö™æ1ÿ”{¢ÜoO®/œ÷—¼üÛëÅï7J¯¿­~Jbø;È¿+ê½ïÿ ~ßê¾—rg¸žr¶þn7ó _ÔÜGý„“ç“·þÑùîùäûø|ÁfûiGg{÷òkþò]ywoÿŸ·ß:ð©îÛßMÒÿ±ßýˆO>ãw¾¸½_ž¼ò›·ï‡øÿô?ßÛußjrq¿þxÒû…»Ò_Ú÷·¹ùQóïߟ2>÷Ù&?üº/`ígÓ;ï{ÍÐÌk™sÞ³ý'|^às?gû=«_pO=OóޓÙÌx½Ÿ|Ê‹êúïóßÉßxÿßxÌÝy“Üoö 4óÉ?Ú^žÏû®Þd{{úhÿ’ÛŒ[Åþ±×ýp=ÎÞŽý[/oæ^ºý~²výy¼ßsZ»,ße:5ü/=ÛûÉ×¾­wÿé'–ͽªm¸UÜKýÏšöôÛó¡œ:øÙ÷Å¿ñÍwæ>ô—½¥þ;äïãÈúïàOž¯?ø3–ÃWùºð•ó½C˜øû­'Ÿõ½öä›_´½ýzÁöñ¥üΧºÿ}ÿà£ñiò¶ÿ“ïwú—Ÿí–ß±¯æuŸ{{ë[?ß´7_öÊzžêÍzQó@ëOïÒ™Êõ¦kí?wÇøCqÛŽ}Dwêwðþíýùƒ_ãägì¸?þ /õôüøo³ßúCŽü>òûÈï#¿üîÎO¾Ãý‘ßG~ùýßÿ—|Üÿu[û§’Ç>:ïÖÿßí—h1¾{ÌÉëHÉ_\ðuGµýÑö¿ò|ó,IïÑ%Ï9y½.ùþ{žQzߣó~}Çÿ›sû¾ŸÙŽ÷¸ŸÿÁ3í«?øýfÞõ.íÿ;í—Lý¶ÖáõÜíçï½»ïuü›¬øzèŽw”~ÿäù“ƒÞ÷ “‡îÌ~‡Ž»o}{½®ú¼ú\Frëázúj=ßwðÁÛ+7ÉáN^ßyŸW<øƒSöG‡ÛËÍæ½ûäKÞugÞÿÚ·óý¿{wÒ¿Ý÷Üf¿ôŸòù¶äò)É“w̧ÿ­_ŠÎSo$÷4éý81ïßÌÛ'Õû“éOžíýèLjüp›ï¯ï<_Ô¼c~ð³wé\Ùôß=:û/ÓÜkМ›HÞø%õß/û¥úï'ï·ßýàwš÷ò^À÷Û&ϯç¥>ÀÛu¹o9YïØßšÿÛíóЮ9¿5ý²ÛêOîûÛõþè®_òεu|»Ù¶É7ÉÓ÷|¿íQš7N>ûo?÷{ÿ9_úáöKžq¶õ-ùlòÆï:×~™äåÑ^í|òîwœØ~Þí÷:~i¿õáä9¿²}}ïOj’‡êzøn¿w¿Ù›Ûþ‚¤xe}ŽëWšòò´æ\…jÎ¥§Û÷K%/ç`?¡wGÏÇm~ïß±Oá _¿¾ï_ø“­õL¢:׺Jâq΃Í>ûá·Ÿk¾"yíÉçQÎûKü³½Ç½ïOÞg‘øÍýÿåΞ“<í—]?q<¿w­'ßßö}‡OiúŸôÅûõW/ˆöõžæ>¬Ïœü®ô³šsÐvÌ3|ý›ë~[ÓÏ9øã“ÓýàÅyÖ|{;yêŽ{Ž^÷k§Eu{<Þù÷wOÂû§º×Û^ÿËßÁ¯ï¹¿üÍ9Ø?ÜÑ¿NëlõHÿ+îê¼sòÿd¿~í'þmõ“Î;®I¸½þâ¾÷õ´þ=r°ý<é}â|OïîÌCo~›s’絟äÿålû_q¶yº¤¿ãÞÁÇœrÞà¿7ý®Ç︧í‰;ü‹Þ¾µÞN‚“ëóM}ŸÛ¾ƒ÷m7oîÅIžºãÜóºO“&vø·™NÿUÝ¿n¯ä/yÆÙÎo´þ¶Nöšr¦u»äþ¦ÿö¸ýêõ䞓糓—6ëÒͼÇiç¼ÎûKÞe¶æ¯Í=ÊÉ#ÿåäpæõ½¢ÉƒÍúÇôiûÝ_yÏ)÷ã½éþsãä½ïÝ/üé)óhßôwõ¾‰;õK×Ì—íè_ÈyÎä±Íøæó¾„¯O5놿×䃯<ßz\2ÿ‰½ÌüúùÖɓϫÏÉ%/:ç½ßò¦í㟦–çÔîÔ/yâ~íû®{ “G.ðvóÙg[çN¾æ7ùúcï›I^ÒÜ#×ô›’PÜï§¿{ë¸%ù¼úü]¢Å¹°ÿºãþŒ§4óûO;ã=¢/Úo\×±÷ÃÏxÓÖqÛ_~s=¿ôÈ×Õ÷Ú<ålë»îã8øƒSî­}ø|óU·ûK^zßöðžÒÎ$ý„ó ¶çƒÖ½÷ÖßõàOżÈ#O¾½û>ýyÛïÓùþ7²óqÉãë|—¼æ·ëzñß§÷¡þ%Ï»;ûjþ¬þöý¾ÿúîžçî܃þW?¿¾Wò÷›ùÀï|;¯¿ø{N^gú˜¦|—Ï¡ßî/‰>õLóY?½çxøo9[8»c]è³_Z÷gvŒ_ÚpýÛ;;ÿ³kÕ®_òÌfžñWosžèÙ¼]M¾çk~åLûÉîÒý”§úû o‡äüA²¨ï‡Mnñögó>ÍÞþ|v}Ÿòî¹Õ^gÝã |ÿþÁÞ¡{ç_üø“ÛÝsÞKæp|”ˆïCûWØuoK«ÿ§;ö;øMñmÿ[].Ÿ~Ê~ôÎVŽvºóæ'}XÝëõ‘ßù%Ÿº½?|ÜžûÍæ¯Û>=¯ïÏK>ÿ)|üü@3~)êuÉv?Õ&WãÇëßvG׳äOîÇëèŸò~ÙÁ/œ­“÷$œöK¾íkÏ·?0ßï¼MÒkî§}B=N–ý‰äïãç~Ä=õg×è'8ïx¯-yÇWÞ•ù¢ä™Íýb_ò7þEu¯SböÛÿ–¼XŒçoóÞöŽû‰þïß{ßgoÝGþúz¸éçt¾ßS·¯Ïœõž­ƒßû­/4ód›ûæãíí\òÆŸäé4ÏXøÎºÿ}×:iò©ûÍwßî/yÛƒ'¿‡öZo¯|›”wèÞí¯ÿŸü¾¦3Þt§íý[ùíweœµÙ‡yf{Ïݾ¾•<ëŒåà¯þK>õ£ø8â›w_*öe>wûû ÉÕæ¼Ë‹ù||òÍÿ÷7Åúèæ>”ͼvòÆÃ“×#¾¬·µ½Iž¼£ã…ÄìùÖüÓö{ÇȫۧÍùSÍ¿h{?º}7æeÍ=hO<ù;&oý‹Ûë³çœmþ+I‘ó='Ï3üÖÉý yŽ$ùÄóõκOHÞó¶¹/îà½;Úï‡Çõ>†ãæï 5ïH%o®ÛÙä1 â¯\¯~ñWÕõJñwk{Olö]¾ülëzÉ}§|w9~ûøfß÷ëþeÝ?=çy‰vþ¦¿õš³M´÷~Ÿñ>µÍO¾‡ØÖ ‡Ÿ÷{ÍÍú>|u¶y¨}É{þ3¿7ý;î9ÛÑŸJ.ñ|»ïüAò¥ïãõìgR]¼ûEü=³ßº³ûïÏúKêóÈÉ ¶ß£{ð{;öüÇ4ç7û¯’=ß¾ùÛµ®Õê‹yæ]ûNûmö‘väoýÄ:½›û “OøÝíóXÿcǾ™kÍ~ÒÍ¾Ž—6û·^ûâz]øAqOû‹ïÎý¶Ésv´{â>¹äè ÷Êß›ó³-÷ÿ6¾ú u;ú]ÿºN?qþ¾÷l'Ï­çí’·þb]¯¿úMõºñÓO©§?N܇ÿº×óyÅSö÷Þ©ßÁßÙósÉçÕ Îû¾aǽ·>çQ¹—a×{ŽÉ“šõš/úÛZ§Ýô:îÿ•KûÝ«Ê;Ögý%ÏØ1û¸»sÎõàýÍþ æ¼iról÷èîíX/Ifï?ù]÷üJ]þ£îÈ»Fg¾Ïö…;öå?ûŒçzþÚ3ïê<ã‡Ëï´÷Àþ¬ÿ~MŒ{û|kòôæüÍ/ï¸÷ÿÓßr²?;ö‡%ÏÞµïó.Ýß±c?ï®_òõŶÉg½áΜÃ=¥ÿvf÷v¼G—|T3~z²X}ÍsÉä|ó‡Éšö-÷¦|ì£ûŽÁyÉ·¿~¯öss/Êæ{'½'î7ÏyõöÒ!yizGÎãmÞ#ÜìßLâ¦ü¿¿®/6÷&%Onö 4óèÉ#ÿlûþÞSÞñKžò¹ðÍ<é®ùÄÍzÌN÷Ÿºçyû‡ø|âfœÒê¿âlýäƒ?Ú×dãþcvôÛú½#ûÈ6ïÜ&éÙÎÓ&ŸXoîô>•Ío“¯î´»VÉ«^µ—¹]ý¿¤¼;ïÒ$½þó¾šäõ÷òspoûº½æc>°_¿7y’8wûæ/®Ç?ð˜GØüÖÖ=Õ¼ê·~q]Ͻ¯Ù‡ü=ÿŒ¯6óÑ›÷Ë“üƒÕ}\ÉóÄøúþfýà;þM]~û¨6ÿÜf]â‡ÿI5 I¾õf½åðñuþ¿þ܇ªùzˆÏ‹þWòCŸ[ûsü \~Ê>ªÍ=eÉ÷üÔ+*ûßüP=óŽÏªåïþ´z×4õýæž°¯úü¼Í÷ÿójÿkòm÷Ôû¾5åëËÿÖìÇmÖ‘ÞV¯O4ït$ïúƒºŸò®úþËäÙÍzÃk?Ççró=^ÿ¤zû õ÷OÌ k{¯úo߇ñÖWÔþ~ßÔû#~¨_õ˜’Ï©ï¹JÞZ§ÿ·÷kw¼–?ücuø²_­Ó÷|És«tyas/À7ÔÚ$éßñ}çÿ«i/Ÿuò¼â©ëb>&yÆŽó‘ïyi=ÿü_W‡ë±Í¹ ý5ë§ÖßóS~´–ÏWyò®·×ß÷Ç~6eë#ržèZ½ß­ýû÷_]•›äo_äùàõÏ©ýûüŸ¬ýûº›uºz=/»9|רÓõ‹ïãëõ?ðWê|ø-SçÕ÷ÔæXU'ïþG|œýž×Öî|îëw%amy¡ä©Ûûò]‹Öü›Þ/øF~)y××ÖñxÕöóLÉžíÜö©áçÿº#ãÔ͹ôä™;ÎéÆçÖ_´ßzXra‡;͸/ùèfœò}÷¾‚­Ó~Ìí½ûœ¼õ±|>6«ûOÉà9çur?“÷òwOªûµÉÍù–ͼԳNyñ£Ä<¾XGKn}•Øï=¬ËßÑÝyÏ0ùªïªëÅÏù|Þ^ç?±Ÿý¯ùîsÍ'¶çÅ;L÷¿ôËoïÝñgü{ÿú¼î|¨´cüðЦÿ~Êþ¡]ïöKF;λ?ñC³Ÿ{×ïà×ÅúÒ—?û®Œ;’wÿ½“Ë÷—ý˺ßòb¾TŽ7O»'$¹gG¿à›ž^·Ã?pÿãÙüÏ·þ³í§\í¸¿âÉÍ~‚'6ûB¾ðà;ÚÍæþλÞDgUßï¼¹ß4yÏ—Éw~e­ÿ¼ÚßÍ{’Éëê÷_~oûzkò´f>æ ¿{ûú䛟Z×s/9y>âÏêoóNsòÙÿï+øÔÞ~~åó¯ü™˜—Ûü6ãyxrí”{D~Fì{̇f>"¹ñy'Žk“¯HªrµÙ_*ϋܱp|QxWã/çÙN5ÿ¶ÿº}|÷¦ø¼O‘¼av¦ôIÔ;¶Ÿßq?áÁÄ8ÿ©gÜ·µcü™ü¥üÄþaò Ïåícùêúðs?Ÿ÷G~ûzîÞỹý<ðNóÛŒ^qòü¸¼O0IþóÉípÿlã°Íyåä Ù×Ê™~É;¿¿7úŠýÚ¡äc÷ÛÇ”<Ì×Á“‹b?íÑ?àûÖ¿úÇø|Îßzk=/õÕŸ¹}pú³½ÛùÆŸ¨ÇCl¿¯c~öÕ'–»äI·—/?T¿äIbŸ^³O4ùô§Üÿ{Ö)ó|߸ßþú;õK¾èWx~Š?ãL㾃ÿ±ßúJ;.\þÀ™Æ»²—¿äV}KR>§æûÅ9Ð×ü‹ïYˆs$Ÿûu¿t3ï9Þï~ŸÍüݾñÙ÷—|r½Þ“<¡.²ÝI–?Ê÷I?ãlëä§úÿœº¾ßuÿYð}Ù?·ß8|s_JÒÛ±¯º·ýœëÁ¯>:÷ëüL3.y×'óöó÷y{žŒ_tr¾|Í_Ûë<îÁŸÜûc:á™<¯.Ͼ»÷AüÚÉ÷¢œõœûæ—¼ñ}'÷ ÞÚ«ÿ>[Œ ŠÝ>ŸùŠû]/mÏgÉ»¿ô|÷ø¾ðΖË}×ÑZóÿ²™¯½Òäëþ~ýŽƒ÷?ºç¬’ç<ãöæ‡ïÜ>î¿§Y{ÛöõqOcòôfŸÄ[¾s¿{'Þ9®çé>аWßœ|YZ·#O=åÞÁ_jú O½³ãByϾ|Wëà¿Ò/ÿúWðõ›‹â\Îc÷¼7­Ißdܬ¯Þß´¯O:_¹ØÌû¶üÉÍ>–kbüÕÛ~¾ãàGÎyØw7ë­ßûʇïä8»ó]þY³Î{‡ÎÜ­_2¹;áKjöaýñž÷i>ý35·÷îæmûÿmÏÜ~.ñù|Ü-ï­Ù÷^¼äí¯:S?c׺DëÞk^ÆËa´ãüäïîÙÞü±h·w¾uÓîíÜõKþù‡dÝc×}Tï»3û+“G>º®OÚù±ÿý Í91ûüirøöó¥ç½ûõk7÷]ííîf_Â'Õó‘›w²“É¢'mÞiû¶ß>ùþÖãåùÎYÝßìklöñ&_ýÓûÝó?ïî;TÉÓîÐû"ßðÎÛÚ/¸ë]Ͻý¿Ò쇹ïöÎùuî1}|sÄ®{ù¹tòzÃÅ:äsø=ÎÉÇï8÷Ü;».qÖ{š÷v÷)çëüô)î>÷lù>¹°cüµcËNw‚áÙÌïx'÷¬¿$æï¤mêñä‰u¾Û÷±×ßÁNÙóÂGg>㬿ä9Mù?cÿ@¾ç”|mÂÏ›Þ+î¡kžE9íÿÓÎa'£·Ÿ¿{n³Ÿñ3·¯3ü›Sîsú`3ÿvó™uà>“߯ҜGî¼§ö„³Í¿%ë©÷åþñ~õUò¬fŸÕ…ïqÏ:w›LL½¯öŒíe½«ÞGûÍ¿µß¹ÐÿQ÷£“5óuÉûÙˆ{î}tßÿpû%oýåºùö?Ûy‹?ß«ÿö{w¥½ŸBo7*ñ߲ݟ›~ç•3¾GvT÷—7÷µ÷‘ßÿ3Éë¿éCzOÈG~ù}ä÷‘ßG~ù}ä÷‘ߟµ_ò•Ç×G¾ñ§ø:óôG÷¿%Ÿ÷®z>;]ñ}}Ok湿õÕÜÝ·ü\=ßôžºýþŽ·Ï·®«¼oǹ„‡øýÉ×ézÞàÝ_TŸúÅÓbÐØýäéOîz?-yá앞göï'Ï7ã±–?{û¾ü}›sÌ{‡ï”yÿ$}R=îû”¿Uï3xÇ·mÿȯßÞ:ÔÁ/¼Ž›üØWÝÕqFòsãçªñò«~Šï£}üÉóYÉlÇ=y;ö'o|ÑŸéû•’7ÝÕ÷lOûÉý}òž¡ÓÞɺ[?yOà¹ÝùŒzj¢ùþÚä‘ç°toïŸ)F|ÞùEbøË›ù¼{›óY÷î¸ÿÙˆ}£)ßç<ýŒóHݱoî•ï¹£û Íï=;øÝí;V‰¿ý¾ÒSíÝßìzÚݹ‡%ùªÿí|÷x|´Ø÷–Çü^„Û|únÿ6÷&Ïܱžûê[Ûû _þ¯W~âäušäù?ÃîQjíIÞ±O=¹±8ßùÜ{÷[7NîÙÓ=±žÞÙÏüàùá‘7ÖûF¾ìon¿êƒ;ú‹ß÷ Ï8ñ^'ÓÔo?ü«÷°õóçñž·÷¼ù¿™Ooõ›{“vÙ—÷°%½fßÁWu}údQo~ÛŸcù&Yþbý÷»x•›<Ьc½ú·ÏëbsÿI³$)ßÂëõ¿ùÌú^¿úûÝ3ßÜ¿»ë=æŽùOçÌösn{ò¼ïÓ><Öy“OyÂ~çOšý®ÉšwkÿÃí­svL'œ}¾ýÉß®ïkã‚dyñLýfy_ñ潃äÿ¹>࿬¹§§Y¾Vƒÿy{ë±ÉãÏ×oK^wÿùöé¾°Ùvá|û‡ÚõÒÞÏ;>_ô«.‹}½,î©~Ãcëþ`óžYrß~ëÊwzŸø¾¿äS>nû¹œoú¡?ùÅu½þ·ÿ߇mšûÞ?Fì_‡'Ž—N»ð¬¿ö]ÍWñ~êÁ5ûBN9¿”˜íë´ò~½ƒßã˜Ï{Á‰ã‡ƒ÷5ý÷§ž/¿&ïÖwdßj¢O~ŸâÜî¾ôîÞS~Úû—Éó÷<—öï©ëÃ/ydûy··ýc~ÏcïÎ>®ä±û…wßw6ï.&¼²~Ïä—šwM~c¿ýtÉå³½Óúû+¼|RÂݽÍû¢Nõ¿™ÏÜÜ—œÜ·_;–|ýº®'–Ûëÿƒ÷6çX^÷nᆱ—íG?éä~ÕæÌä£wÜߣoo¾Bž‡:ø÷¼`¿óZIrügz¿ãíþ’§Ÿï6:S8ÚzñjÓÏîž÷Ô¢~<í|ç°Þø>¯÷ö£ú>äGéÞÖß¿þÜü\óÏ΃ÿ"ÎI~P¬'Ýæ»›ûAÏkÿNÿþðѽ·1¹¸ã¼Ó'¼ºîo¿ê§¶ë?ýäõtùŽÈÁ?ç½/ÝóOÖos^jó.øm»·ã^¯äcooÜÿ™^ϾÝ_ò˜z|*ß—»mwŸÔœûÃ=ïcþ”ÿÁÊõæ¾³®K'¹CçäÇ·ùÞÉ{~þŽÞ+"Ïgµò3ž+Þ÷—ÌÎù>ã@œûéÛ ÇÁíõïn÷wð'çßäÓ¿ÿŽÌï$ÿ½Û×o~R=Oÿ…ïæ÷}­šuŒ¯ù¹³«Úó˜ƒ?jÞ1xÆ9§–¼j]¯·è»Ó_ÞõÎl«ÿòÏæíë÷¼‘ß‹&î×8í¾íä©¢ßõâ¾/ü·wõ|Ù®{‹þdG=q—Ç)ÿ¿Íz”H‡ôÿÜ~ÿÙKζî´ï/yPÜtÊ} É•íå!yÉöûÙήÞö÷ ÏíÞ§ý|}ß§yõ9wŸ<®y÷äeu{›<é”üÿu¿¾W|~A¬5÷¦%ŠÏCìš=5ÜÇ¿¹ß»Ñ¯{U?›{þ’×íûÊû“xÏûhNyŸ¾5÷üüC²Þ¹ë—¬¿°y¿VÜ3ùÖM=~¾qú®}¥{Ûÿ/ûµ_û®/µ÷4Ž~œ™ßµobswkÿeÍû3Ÿp{û¡“¯ü½ííÿsNÞ·²™MžÕÜ{ó÷lçyŸqÊþàuÝÿ8íµÖü[~žŸ³ïx¶æ¾p}òúÏ÷Èw½Ïû¾øyûÞ{»¿ä»¾dû;Ÿê©}?øÝfXSN’LjyÖÞoßÐiï@ìž?9ßx+ùAµõžºäïü·½Ö_vÎ+æÑY/IúͽDÙgÕßí¹¢þzV³oê¥o9›»ßüÏù|Ô7}g=¾ÑŽûFÿtÇû,ÿlǸå¿5ù-ù´Ó)¹ïœ÷ß©ösÏ|tÚ½­›~]ò’zâ:á|þ™ßL¾âOù=f_óõ9‰æ¾¹äèóOG7ëÿòÜP«ÿûM|Žþê¹Æ›÷¾Z>ãx0yÉ9ßuŒ›rðô³Íkwƹ×öç½ÿÑ9¼ãMVïRn~‰Ù>ß·«ê˜û÷¢¿ñÈ{øwø¤íóÄ{‡ïkÞRÿ}ž8ò™Ÿ|W÷ƒ&Ÿû g7ïû.ÈæþÑÍ>öÛ åÙÉž¬Í}|7¿'ãy··Ïu3üȯþ%ÿþ=½:_ô)Í8õ”÷“—ìwŸòýßÊËÅßú¡ê‚Õä+–u=ú7¾ü-•üžýê¹ä1"ˆw)åýýÉ»ßÉýÿDqN·Ù’|Ñã¶ß;ñæ÷×ç®þÒï|HÞ/H>ælïi$5〃³½3¶ùüŽxçã±ÍüþÇÿñ¹§a§¿§ÔO¿'¾ë_{Ó}ÛïÙë°¸ß9ûäyM<Ÿ¼_ý/ïåI^ûö“çúõ{gÉ_ùœýÎn}¡zò"ñÎïžóã;Ý}Ûóy…¦œŸv?y’l?œ<çä}R›÷X“¨ÞgÒî×}óožißiò=ßX§ÞõÖíó)ü÷ËIò®bû~É'Ÿö~æ—ÕåÿMmŸü’úœ’œ/ßìoK^q¶õ÷ƒ_õÙ3Nž¿’çì[ù{··ß¿ßŒÇ/mï"ù «³ÕCϾ3ý‡ä/ÿÚös¡;îuNâëÙ›õíäï­ËSïÃcßå®qæi¿äÆ;êþ™Xÿ9íÜÏÁûO^÷Ø÷üÞN÷ÿÅö|º™7Ø¥nÿľÑä%wvŸË®_’ÖïØìZ—>xÿíí[oï­î×ç’Onö=M¾ë•û­ëžrÛÞþ?Þ¬û¼ílëœâ~ùäê)÷×½m^Ï÷¾ƒ÷ v½›Ô±ñýæ:é^ò ÿjk:%ÞÿÁ÷g2O>ù÷Ïu¿Üg¹yç+ùœvóýwoÝ×¼¤Ñÿ¬ï½#ùxóÞ|ríξ[w»¿}ïÛI®ˆï/æÑ“°¾0¹¶§{ëo¨óÕÏÞf½žß7´çºêÝú%/Øo~|³ÚÚû+?°}þå-¯¨÷ï}ÍÓöë‡|ûo|Žâ5¯?×ùýÍ>9¿”˜;{ÎGî;ÚÛ^¶c¿Õë~ï¶ÆÉŸ;y½8¹(Ίq`ŸbÿqÛð¯×û¤'ú³ÏÝQO}âös|mxšùõ³ŽO彆›÷=åû³É#?²½þTþ¾mâýÃsÍ_'—÷[ßßÜ Ø9—ŸsQû~»öéW&µ¹ïû懪þðÛ~¨®ÿÔêñÞšþì_ûÙêÞÖä‡^r¶{%ϸ/J®wït÷µGÜÞŸŠ}~ßôÀ‰ã˜äiû•ÏäI;ι½l{º&O:ÍÅ&¼Íü§<™”/®ëÉüïÜ{qÌßlÞoÜQÏ|Ü)ó-Ÿ$ÏðÚæÕ=Ów]Ï{üÉ)þ6ï}|àÑÙOrðÍ÷¹ö–Í%ÏÙsÿÓOŸ­¿$ßUH¾,>¹~Üóˆ,'§ý’gœržñãno^6ù¢ï­Û‰·äU…|Öy Ö¨™º$Ú­ç6ç3ßô'ß¶ãÃäSv”ÿíhÇÃÝÙ÷}ûÓ~?u¶qhrôš;zÏ®ù”ä…ûÝW´ë·¹¯%ùÊßâý„—í÷^Kò¢ŸÙ~žûŸŸÜîìº×=yr3zaÇw_ÿ¿N®§þˆùƒƒlÂ]÷§’'îÈwêËëzôÉ'—¯Í{ö;õÿ¯³Õ—ÉÅ=÷±<Ä×!“ÇßÙyáä3ÿ÷½Ü“÷ë&ïza=o»Y‡ûÀ>Øœ#zYsµ¸×7ÉÞ]ŸÏú_··/>1çë'žõ×ÙWâÕó2É÷|à~>nÝÔWíºÜÓš~â_×õl+ù9ù(>Β㳤÷–úï•íé}ð§uøÚõ´ŸÝ^Ÿ¶çãúܾÿ×w”³ïüòº~ñ”··¯ùÒ»³Þ˜î¸¯ä3ëû³“áŸÔíØÇ‰qÓæÞõ—ìyþïóÞTïz)—oòKò”“ËkòñÍ=]Ç÷\¿4烒/×áöùÖAÞÊ|þ{›u¸ßýÍËç[¯Þì“J¾àßnÏw¢^ÙéΫžtò:Ã3w”“ïrÈó ÉÕ&œ×šïßû…:<éœéüÍûí;ÔèÛêþÑE1~å¯6òçb~®ùï;ã;¯ÿÿðqíæïô·‡WÌÏmòAòI¿»½¸gG9ÿÔï¯Óï‰M=¡›}ð=¹ÿ~ðŸÏvÎ0ùèýÎqvì5ï,mîÿjý볉:eœôñõý¿É jsÉ ›{Išõ?Ù8øUqŸ³\ç~bSÿïïÊû³6û¥’'Šö(ùóõ|Æ6ñ{yÝŽtÆëOàëeßûcÛß«º§YÝä¿]ç]ùO·5zZ¿ª5÷ýÈWî·ßôà_‹u„Sî?ìØ¿CçCw½?²«½í˜kömöß%Ïhú_Ïjòϳ¶÷cþ§¯mîe~{ïäý^ßò„º^ëÿËóÓ¯ˆvö«~älçŸØô_~ò>÷äùõ>Ëäi;ÎGÿ÷òæÞŠä†_×G·ê |›ï™\ªãµ9ï–¤o­Ëûo_¿kÝýåýÎSÞ1Ûì×KÆwf?Öíþ’§ž¼¿ YýËí÷|’Øÿr1Žþï;ÆÁoüÍûãíý)ÏÝÜÛ|¿Ãןí›'4õc3Ižµã†«›ü{¯ñ<ö1÷>æŠý{ß_xäs>ýMVñûÿƒðþÉg¾rü°ò^¡^©Ñ•Jä¯TRJAÜ®n^OJ”îH‚®ß~WtÜÞ„ç2äñ@+OÚ :ödº¼úõ¼i“.áÕ×<òù¼âµo´I&Œ_yã¾è”Ÿò÷{û^:nÔ—úZå‘^6Úø×Wù`£q¡¯æò’U‚klž#¸Ø7ã~¾nµÌx±nýé÷R÷W¤ÎV­u«.Èåþ ŸµAp+Žš£A›ŠþpnŽû)y=£dèÏ 2´èC¸Kê¨Wd¡\)ŠD¹BWƒI›öŠÜ^A:¬G ž‘õŒ}¯¢–f}J{½6EyÓTŒ43è¨BÐÁGB„!H1ðiøš<4ˆÞ¦èmŠÞ¦èmŠÞ¦èm†ÞfÌÛÌãzЦD†i”1 l¶ ì• X1²‚>B´y¿AæF'Ãè ÐÅÚ`°¬!Ú1@FèÀÑØãçC¨'H[ =F½«5ABÕúTô+J™¦fš¦¿©¼ÖÏŽ=n„Û÷™fÐç˜b‚F0>B€°I[’§Pª§ ÔšB7ÕiA:9ØÈ!sæÓ¹ÇˆëmÜ»ÐO—ä@Au}Z’¸ì“ÝÒV«¤³†°NP²dý¾‡€:Y¾AÖÇìàD1BŽ0GX¡s+æÕMŠRÖ_€¥}-0à…X£±5K!CX0>B€Rh2jR¬:o?O6 åŒÁïaé!0MV&CÒ˜.(7eù1iÌWÔÌe‹˜ÔK°°/–kÊ}8)F­17 B€"D–G:}„žÁç/ B…µjJ‘£¡Ô›FÙ~¡’Ì—Px³2›F«tÌ Â¾1€ˆ¬ fé"³š£¯sÕg”¢At|ŽŽÏÑñh…á^k¬Ö}HÐ5Ó5ÕoÎX†vÆT™;( êAn[çX«¬ó Ï}ËC¦Bì×y„9n½ÀP-0¼ Œð€Û% Séõ¡¿Xˆ×¥FszcîrMmÞݰÏLgè Dh ‹´%Åbw³ƒ7)5eH˜Ã,mL^­‰5ùVm5ßN žc•}ܦÂ;håƒ>ô,P†ôsЀÒà Çˆë)F>£QÄ(Fï˜#jãÝåš æ¡ò˜®'t¹Kš €Š‘4‹¢f®hæŠî#ùF#@"„c0fT„-¯W,‚{‚•`-Øö‚CÁ‘à˜Oxß~­F[s4}ŽÇcÄqŽû´…D„%I—K}‘T¹H*hØô ,)›FÍå€2õmÌ]­‰ rØ]`wÉõKTE ²™‡ 4‚A€hPuq±ÈLŽ0’Ù1:ŒÎ£óÇÌù!Dˆ eÇ”¶W,©R P é> ¾Û`LÃ`âõ˜NFV&Ô>¨PC5 ! STÉÔ´XÞ Oî>ù¥JR „šyFÊ9¹?‡H/ ‚Y`¥¾¤0,Ë>xa©m\L™Yø°ÅxFÂÏ®E9!w,äG…Fçä‡ NŸQÊh€¤˜IÅL*(%Œ±%Œ±,@ý\¦3œÃ7\å ¦’UCWr°.)ù‡)–a ßb¸ %ZF˜Ë°Œá¹@ú죑j”kPSÝ:ëf¸RðF4ͧ4|QÜFëbÒÊÇTœÆ}h^x¨¥4‚Að„!B ÞÁ8…2Æž°`¨€‡4`æÆ86n“ܦ•Ë1u‹Æs˜ Ï©Ž‹>ô)FšÑ&˜Wkº6v}F£hõ丠ÉÓ1LÒŽa¼;. ¦o?^Í æ›^²Êsüx]2€(®Ë> íÆG4'kÕ4Wår|…äÈ$[CžŸdÇ sœ{Œè«MXšR'‹þŒìX â0¡ùIIYc²‚±˜JÄÉj jJ¸iÖö¬ïíOQ ³ˆVÌQg®èKMÇ©)Ú˜{9h€íy¦ jšBp ELË!¨iâç:v{®¦ýÖ%È$˜3ê¶´]«ôI’’Jø ë=F\O1ÒŒ¨ töÑ…  ‚ „úå¨E³B3^ͦ0‡=›–4ÅÔ å°Ù‚ZA«†Éá™3JÁG=Ž>šÍ˜ÍL1ÒŒ :“åÌ"Î Ûbr¹&ü¬–!ÕËòî ª<«†ÙR†Ö³õ”ª˜¼?h5rì±ä4"¸ÐÏ©#˜gýyÎÜv ƒ6QkŽ åX¢â¨¦Üp›x÷7í>ˆ¸“P§YdzšFóÀhî»N™®áv}ŽÇ£H“ªÇ|°ì#¤ÔåΡ±µj*ãRÔbæ‚F09:}§|Œj jÔ¨#PoʲÍ?Ô€ä³tâ1RŒ4#ÃÈg0 A0rêùæs˜ r@ݼ|ykAÑ\X……b†}fØç†}¨ù-3³~Ÿù:„T-¦d«€Ñª…€VrPƒÃN)ç°ŒlÕíÚËåŠJÏ áóÈ5ã>Ôq9¤¥ÿ9Í[ßÛŸ§ PShç)º¬T’óÁD%Ä|˜!“ £Ÿúó ™™@Ok>ÅEîùt¼ä¤Q-5Ÿ³’¬FZR™C ad¾\“{Ë54 Ž N´z˜¥÷†sêHÏ×Ôû˜ÃPÞBŠ(4ÖfzëØ-þ-HŽ[Ø2-ú̹UÔã(t5GŸ#ͧU(äÉ8›{ŒP¯ì3@ ;êqºÔsª°WÞp*8<àÎCn:®Gׯ4<(¸¸`1S̸êµÕÐý­ m˜H¤ i­ãŽ–7‚vн•DIÚ:öJqÔ Ç€!€i›F ì‡#Ž1KHÝë æ)o9g±±‚‚_󌣅®æî‹|£ðßHýŒ;çs ¸év¡ðê†ÛÔ"‰ O.34¼n×ðOexà Ïó†fGr³>÷Ççþøü ûÜ[ßgo|}bM¶e¹Vôˈl䎄Œ0ä+V® ´„ÚÊ0­´S¬´nÁÌÊ"§Æ~±„qÙVWNj륵µêÔÐ,#PC$ ݶàWk‚i°ËµÛQË)£ŒÑ€mëXC¨ÆÖG°<ëˆ:*‹#èW9è1âz­A>:‚áoƒBW£;ªDw˜£ÁGB„½Šr#‹*ÍW,û´!Óªá#X½LZƒš2î3YµÕý}öãõK¤:€‘Fá(€9êÌQg…:+¦C Y(²Zc*EôG¡Ó:eèêÌ 1æÔ¤ÔÊ8`+/…" óù>ùÌØ-€>LNiŸB€„LñûY€YE‹h«]‹¹`;´m6Á^p‘  ŸTQi»Ò(¨BF³^âê_A«ÖþÔ5ÕÅtÝàþš®eË’F$E>5N¬òtŽ™8‡ÉÆbÞ‡äYÂ,Šƒ”é)ƒao§Wœ )n¨ú‘¶ýÈ«~e*LHÎOx€0)¤Ø’…ÓóÑ»‰‡@MY -i™CÃhªÜÜÃæ4W„2c¡m«.7˜£Y!@7CæC˜B7á½êÔ×V‹#X˵Ø<_B?¥ÌÛĪ Cøh “-÷3p>|àv…†£Ï1G#ô.ÂxR“_ÎaÚA‘Bƒ 4‚Að„!BˆÑ×#¢#ÅH32Œ6>?XÓµqQöW·ZAþlO†ÞçÔ úÀ¹"Âg >iÉU`rЙvpm½Îs¦ï££>x_Pƒ]‘‚^H NàF½’6êY;å¿·%®×žA®‰mwÃ:d«>¨!«ÁÉr5õÔÐ\M@=õuPÏH s%t À©¡ã¸†p®i掼ØDºÙž:¶=VZ\é9å‹Uj7 ”tRЂÙkÐ2Tº ½‚¯¶J¡Ž\áéS A#!@"€5Ì€ÚuêÔè&åX«†!Ã*Ë(ˆU–£±å̘A€È`vÂ|¨1l§[a.r5i'D®TÀ¦†VEmÍjŠÑ˜b4¦)Ô’ Ûy‘ }ػœ7_Cp,ðà,`|µ ´V #ãUÉP & 15­é­ \CwÙ£˜ƒz¦¨X]²´Ê`¾we‡@ŒÂöy¯Öºx¦iµ†ýZ«CšZa9†9¸5žÂY÷¡›ä E‚.‰#®—¡#>ùuÖ§=SÜn¹†-Æk¯a ¼†1ðzDEÚªSРY«ns×¥š(mÖc¨cÖ¸çg{~ÖcèxY`^»B´›,@ Æè AS°‚b!C€}ˆù8C1ºƒ[Èkë)u°Ö(‡9Z~¿Ð_Óvíõ|JmæÆõr Dˆ ?³¶cü>£”ÑÉc&=f²­a6é’#ܬV¡â¨9Ž>: [ô*Z®˜®b¤¤”%AÊì¥Ì^ŠöTßc¤¡=Å|PÌ•r“̇ŒÙƒÚ{]`.- &¿Sö–˜VÆ´CHiX`ý†Ãsb&±$þaŠp-]ß8ñ@M׊5^Ô`e9Ç2]øKÌ~Û^¹(8¡U£ÐV¨}³Çr—c©YÓrÊqS®4Øv¥ëáü@8?úCL£ŠÙD‚“µE²¶BùzÃÜ Úý»aÅpm"ÚçÛqí±0Þæ“ÇoøÚ`p¤ÛJqcLsW1 …˜çCÌØ+‹+‹+}QÊõ4#ü¦Q g7×VåEŒžÓ‚ÙÕšØÈÄIÐKºêàjMÂôŽ™¬KÒ(ûS(¯%ìv^— 0¶ÀF ë#Ø+å Ç(Gƒ µÓÒ¨¥™M9À†Ø¡âšµ£¶*¿Ð?¤p¸€XBoý°œQÞw0…Âî¸X1Ã)5ê‡ktßRËzsJ]ß›9í¾Iäf1¥ä½YàQuG)„®üÃØ{ PM T„#ú·Æ0ãÖnMQM¸…÷ZÜj—.¤í…V—S=îç š>l¸ýž·Ú ]ÃÑçpl+{‡´±"ÅH-˜É3¹& #ŸQÀ(d1Š!Ø ê¸]NH0ÃlÃZ0¥‘á jx‚V¨9 »>Ç€c;NcYu›+Ò~¿Ý_~¯…v—oÚOéä¿5FW#]®àZ{UY¥ f´ÖÎN\HûòˆÖ­¬ZZƒÚ€Úuê!ù5ÆPŒÛ}éÊý þ-A"õ§¨† Ò-DV }‰š oÔ¬˜iˆÞ <ž§S‚Ý”baä!@ aK­…‚ÔØ }¨Ö8µ[¸V¡­#С«ç.UP€·íÝl÷¥0p¬ Ĥý#’ߢ9)€B²¥)Í^¤é"—҈ƚZÝ“PS¨6 öA‚ºmÒ´]^Oé‘S·MršÁú_Eš•õKÁ¬Ðmr€vVhgvÖ`'£aw𠦋v?Çý âz)]ƒdC?LúŒècYšÀm2¼>#ú”«¦~œ#êCÔÔã(tGÍÑpô™?««éZÑO‹$ÍÓXu± þt-NL'û1hÄ9„v^¥Ù| þÓvK«.Éʲ„Âk‰n)K¡¾ÈÊB!@ŽYy€ãâ<˜ š>Ò`7ZTDa,Fm*[55V Êè°¿ }Óá¸ßNhX­´I4‚Að„`‚BÐT ÑÊš:ÉÚ¾¯5Um=sjpéˆ*“m}LGp‰§ Õ8o·‰]HÇ‹6a'ù¤Ù×aŒ”ÆhtH[ÝkÔ i™·FŠÈ„¦xšÂ5ÅÖq uÔ°Ó=é´]I¡»™ÂW«¦/0-3…Àt|„!DˆÈå››jùªS_–tÏäÕt¦|;ï½¢KóŒÎª§9Ä¢=îg•TÓçíQ,«^ÌÚÔÌ—mB} Ák%],ÒQ5Gñ]Clðš+ÑJWcˆ%¿Yö¨FÊiÇ÷…tÞ.w¥sèßÀ‘q§î!ø`J†š†µ5Z@‚C´<ì Rõ7ÇaVEhn9HᄤSœ#ÃÈgPšQ»¿ ¬šRcÝ’Ìm; î¢ƒµÚcw)”M—Ðe³êœ•º%åÀ%»¬%]æ}k)jµGn*`eNÕÞ:}Kº3-†+H’bL…¥˜PäÚc¡ÖÂtí¾#ň …#S fÊ,¦Ì"MîTdQ1±”ÐÀ͆—®N ºüÈ©SúN´Ñ©Û髆–¤Ìú í£OKxÐ+§F3Ô4ZµêME ŽA½n¿G{ßÃ%«d9§öÁójr•p«µŽå œB[YÂh§Ä2ê€òY¹¤±BY@ÉÄ:Âå ]^Í nõJÓF0]3ãä*®ï¦+Ú«p!m7 X%5Ô«œâ¿×â€l0^å1™‚ìG}ë.¥Áû‰ëj=F\/`2ŠÅèBÐBˆ!Ðxi‘’Fþ40¼èÔt¶ÔmN¶ǨV Ö 6äµGëœj¨õ.Ͱ¤Q£ìH ©™Q 5•#Hœd L'B â¸.©"¡Z÷9u äÔ!Ýæì@SâÜlìÔ¬?^QŸÿl”¾Z3{ëaT·Ó™×{Ã_K›17ìKA(‘pº-F )ž(a@É€«Ž‰H b!Ð2 tŒ±ˆÄ¢¡5·{|Üð5Üѳ1%lÑÖ݆CÎí9Å ÁÂ=_ØD¨©/’6ôœ#á^$ìÇ">±p/ácJdÏ¥:i{˜#7pVB_ ûÊpÖ¼æµ4ï þážî%X¸g"Á1g_ØÇìà‰ìà‰Ï_±p?öž@Ø„ýPÄ7ñ …û¡_(ü‹„{‘ˆo$Ü‹„{‘tO|ŸHħͮMvÉ‹èÄ"8±N,‚‹àÄ%²³c¥ ó*欕`_°°¯¡t96\Ûˆàá¼Á3Ò¾ðÞï„¶/¼ó=ÁÂ{_xï ï}[Ìü‹Ô „ÿð?á „ûX*î‡ÂýP¸Šø„">¡ð?þ‡?í¾®ìSò¨K¯4Øë”øBàER ¤@šÐÒÓH+¾ÒJûm®¶‚T‘Ž„2¨a(2ºQO d@ÚªItÈÃF”ðŠ#Î:,õcÎF¸‡EÐq`8‡Â>V¸FÔh¾¯/j¤ŠCÁ1g¬¡|?ã÷à†¯á9é)á*VT¾hf}‘*¾¨¨|ÑÌú¢¦ñEM㋚¦b_°H_ÄÒáDøþ@„›éà ЫÞ0d:ÇÂ8fŠŠÁ·.Œcê"u‘:H@¤FÅ‘à˜sû&8Â:V«¨V+Á EpCÜP'Á‰„‘p?©‰ðFÂýH¸ ÷cŸXø‹øÄ"¹c¨ÖªïI'J ´)𥠔‚H b!ðdÀ<ˆj(jGÇ8ª8æŒ=ŠŠ=ÁZ°pßîµåòñ¾V䫬Î"ØXéVì ‹h"¡ˆV(ü …mÇá†Ù‘ÖF&ü ER„" ‘C$‰8FÂ~,â ÿcá?£7° C%ÙpÆv¨bÃÙ}_èû½@øûæÁ‡ØÅoàÿŠ•`a£[±ì (TóàdØ]¬X¸¡EŒ³a6Â=#Âh„ûX˜cÑ(Ç¢Ù‰EáÅ'ŠE³‹f'ÆÂ}©æ€k"zÔ9‡Â|(’7Á …{¡^$Ü‹ÚéçÌPÈqëØ•i5&ónôAÝ.b8uhÐé A# Ä5íPjPqÜØ|\ƒ×ðNÍÆŒpÐçp 9FáÛT¸‰ø†ìoÓ³¤¤(s²ZæÜØŠ´X;ºaO°/8sö„{žp+…7àÄ膅žðO ûØ—Õ6 áÕ"|F„ßH}á~Û:?®aïÚ‚îöߊ‹@"R0Š@…Â|(!‰ŠDˆ„{‘p/!‘ޤ{">±p/á‰yü”È„ª¥H4 ã"O)O æÁWJØWR?,‚+òÒš7d¨=Ž>CÃíÒ…~5r»¾â(ìòTó†w*àvn7à "†!7qÃ÷7â©q§bîTÌjóÉ=uæ•\ri‘hiÂH7Œ_šð¥AO 6Ñ\+ÀåÚFj!ˆ¥×±/P6­JEõ<)PR …Fp Xxi„}¨˜jŽÇœ¡¢©8þcœëæ (›µ€rPÅŠkCÿ°æ3 ¾”X{P¬PmXxï ûð?yð„÷‘p†ÑŠÍÝ?°ákô2§5SÍ¿kÁ>g%ôñ›W,Í‚#Á1g-£”š…ZØ7¼á5"|m‹|_¦h/ßÅ rÔÒ¨E·±T”2ÊQGU‰ öX¬k§*/}Á)3®b†´±1c)Ñ æh8†#ŽÜ#Ÿ{Í [“h{äóûÜ߀;ð(<ñîTÀÃð0‡<Ì!÷(ä…< !BÈý ¹¿÷(âEÜ£ˆ{q§ÚòzmÍ4퟿7Ót&!ÓUÄÑçrŒ8Æ é ÃGÍ‘û«ŽÜ_Í]ÖÜeÍ]Ö< 𻬅ËOOŸ/Ÿ'/[^jûës}î¯Ï= xbÜå€G0àµ÷žvcýŬZ>jUD©ÁgO°ö¡U¯U }èôÔ,üƒi…šC\Ÿk¹@x“ó5 û¡^ÌõUÏÌÝWžÐWJ°0¯„û*±èBÑ x¶+ylå®AnØç†ªpÕ­Ö„j­aÕØNÖß“‘µóRƒš¡ès 8Æ aª äiÈ+‰jˆ6ܰáþî‘Ï£às»má}°Ákùa‡ák)OŸ{pÖ€;pïô€'YÀ= ¹Ë!w¹í^È"jOÛ£VÙÞÜ™U 2Š¡âŸ'âŸ'⟧Âv§r…\Z=¶PÓàÆð ^[gÜ3¨È#^b"^bØ:OƒB7fp ¹¿!GÈ]Žx<"¡» ä= ùbV_ªÙãÚ0G\s 8ä µQÍÂ;-܇E¢š…y‘VìKþù":"¸0ï ²®Y7Þ‡Â=øFlYíb…šiB÷›-‡5èqäv ·ës»>7ìsÃPļQgËT Æ CnzÔÕw &'cž%c¬òë´áþÄ<öí\Ô: soFj85ʨ5¨ 9£HIU{G5ÜÞoêÔ4GaÕth6ëCÀBRF¤lFd}8SŸõSMñwÁÞ–òáJ g˜›Ó1>B°BŽK F6¢“"–èZŠlA/r7˜rÜÌãÜß ¾YI"#ESº©¢ 89Ž8޹sc¼ò¨M8N9ÒCEw.5¬oÂúÀ†Ùªx-3†‹Ôc¤iFÌÞ˜Ù3{cfoÌíùŒF!£hݪvt˜£ïÇí¯ÍÝí %«œ{4Ýí6Uºòé }vúb`i<„>™“Fžz`%Ïú)}™<[fKO0³ ÁBZX*òÉœ“bÑÌ1yò9ú5‡˜ÏsN†‘Ï(G:y %T€ù!¨ÉÐ|±°0`4F¢·*J1{ŠúwްNs¨Ð{ƒy`f ‰™;º )nóü‚lT!Áçë¾ÇB ÷+9@5$þâˆÔÈé) «“eº7âb=F\O1ÒŒ :©4‚ „BŒ­XV–EÉ®_¤¶¸'±`+hûŠ[ø,)F•[÷àmÄš iÅícæNMÛ·Ò¶o¥ÔªT 4¥k ,)¤„UãAQËÔO©,¤C-kA!h! wÀº[Ū©º´êu ôtëŠU£«!¨#RƒoÇäC¦à‹ŠR$Åôèn€ ïwʲtˆ3PРeƒ ÷‘UØú¶á”× GŸcÀ1äqŸbˆõA®©ÇQèò8y<¤Çéñ@Bï;¬x(…†¹·Š{«¸·Š§ ,ã8ÜÄçjMl¤RIx¸4ˆæÑ< šDó€À ‡Cî’áÞ(˜©Ðô§‚7Ë•†9wÔð€¶Si÷7ØI$ÃÓ”§‚Ï£âs«>OPŸç/Ÿ§Š/\æá„I½ c†°¸ÂöMˆÛÛãÜ瀧PÀ}¸Ïíd̓ ^[-'9ÝÅUI¹ !O¤'RÈ)ÔÌ%žØ§PÌOÅìÁ¤˜#Ÿ j'ބВž÷¨,ê#®Ç<Ô#V7ð¢¡Y” óÁxŒX:Ū=Ãc˜‡†yè3/|æ…Ï\ñY”|æ¦ÏÝŒ1ÍXÜæ]À¼ Ø ˜ç<‹†Å6`ß3à²p,œ '3²pò,Ò}t²bš>ÇMHïo¯R®D,ð! nȂ˴"܈y±dX²F,Y#¿Ï1å˜1«,™#Vˆ"^ˆ¢ˆ;q‡X´XE÷úÙgY4c͘E3fY7f!YŠÇê†[­I̬«ºe3²1£Kó,´Ï†Z Ø‘¢K!+Ð49éàšû×G}Bˆ!Ä èÂåm7¤ “bÆ0€Ê `h†FahT€ï’k˜äs¤Á|±Ü0s†žœÈè™§A ~ÂÄWF/½T€:)taîy`4™2“ÐE´2@+¨$ƒ”¹=d‘koªtc45FSPOÁÐ ]ë9h@ö]`.]`2/– ±FSk4µ™Þ»èÔøÑ êy[KÅŠ>JX]ÉJp&³Ò€>€²B Y¡„â]bléé:ÚraÚ;ಌŠÙŠ®]Ì2Œ9 ~³5„o %dô *[0óá]ƒ˜¬¡Î_Gø}nATàrâl@³ ¨*ÀÊ€:ª‚e\93hPÏ@å2 3(¢ø‹aèƒ:uê¨7K12(]:Pr©˜>©1G³!F¡‹* H)e [&+!„ Ä›ê£!zF›Õ.Z á¶%Ý£'p*ÊÑr•£<å8à8âHsÄ!=´‚/¨5¨ ¨!*:5$Œ†¯©‡î!­Aû8·ýÎàt‡­&ßMA0 ÃР逪¯@ 1óÑ ÄÀ‡,ãS5ÓAƒœ ÀjÛß´Æ!`!¤m¡Á|ÒÓ ¬`ÙŠ)â$Üõq)Ô¬z mßrAè2^«Q¢’¤„£cz÷bP7:Êgü¤£»kƒ–¥+ÈdíݼV Küƒ›mXnÀrÓ•Çðõ±Ós% 'q ip Û‡ýŒ^Ô¹Ü` 8s† õ5oÜ»Òp;EÝø§9Ž>Ç€cÈ‘ª!§R«ZÁaˆ0F¸E€c×aùi˜A•9¤Qê• Øp`HãÖ hGß>Ç0‡ `-o£W¤™ž†(æ#A!hƒà#P4Ì ðgUzŒ#p.ìφ8_2\à§YÀI'°ÿÉbƬ F„)Âu„BŽ0GX , „k„›¥›ÐÐT¨ÐèÃÝ‚VG+‚– kë(BÒ>’ÏìÌMØ‚\~$x1½tFù轊‘t«ç1è"Œ¡mÏÓG€¢k!G[F€B]„èS¨´aâD~ŽZ1@ŒÁ‹C¨q¦xXÂ#K– w•3ð¦ÄJ „ÍIC¸%ÞAð 4Bó9ÄÇ#*R`ÕàÍÊ@é[Á:€Ìð€¯…@c) íÖ§õF}!Qƒ3‚rlÕ4æQU<À qDz„ÝÕvWGØ]awuDÝUëÖ”Â3•V èFÐmåíäþ• Ø=;#Ší¨}ó¾lÜk /dã>))Æ©jjÔ!¨©Ç¸1|L5Ôxq—ÃR íÀDѸ٤_ÄfҀƀúr“þz‰ŽR 9¤å„žèË&lgwE=¦©iF†‘Ï(`2¢^óÚ«ÎA¢L/X€§÷‚—÷‚‡÷‚w÷ ÏbPCbaŒdú[ 9˜ KÊ\“-*MÚ åÔîS\Xq±šR9ŸLñsOa£ßdŠ)4…šn2?Û7J¯:õµÌV‰”¯éɾ Ù„*ÄÉ2Í}F)’bz°ci2‡ý³ 3h˜#0+4™ÃÀɶNèaBØÖ< n²lóý• ØÖɲ¤i,ks>TÀè¡X5¸^À¨cRöÑ­v³žÓà·µD£‘I9²}_ø¾%ìÿ¶ 4‚A€UÒrÙ¥šzLS1ÒŒ #îhÀ(d#¥#æ_ÊüK1‹Âúò“¦¸…#®§iF†‘(`˜!DˆèflL1Y3€à®G0+b a ÕÌáŒì–mf¼¿¦k£ÅšŠã´¿¤\2íð~Z6MQ­@­AMÛ2§T\§ƒa!E ùÔŸN×TAMsÐÈ¡NéÕÑl ‰iÙ4¹R›—˜–B´‚:Ò‚B€È­&9j§ë!Œi)FÔÞLamoÖ‡u 9jêę́Nžµë=WúZ6_Ï©–žÍÉíùjfG”ú3xh/›­ ÊŸÁžòœmçÎa—vEm“v!ƒÀ9<:å¬dôÄM¥e2´4BX0P]ƒã „³˜õQåXÂpÐk½"–©œ„“bdùŒF!£ˆQŒcÀÒ×ÓŒXP`ï‡%`˜±!DˆbôhÀR§-&—²|˜y°?È¡ÇQ L®p 9F¹S톦cÈ9¥HŠé)®7`”#ifO3{†éÁåVŽ˜›fÈhĈV˜*ÂÂlyŽä3F!#ž2mOæÞ,‡ÁK>Á=å 4‚Að œLq÷JŽ{|rxýкMOCfù  V]€†5,o_¯¿TÁrEææ Pƒ[0á/|P Ž@MMw¾XA‹•/Û½jÖtPó"5x '#­:žŽ ª(¨¹TSŽQèñÞ+°n‹(ø«‚‡æ«5Ö¯«5Vh«5&ôò5Äq …bÁ@¥=¬h5qÞ#?„¹¨ü抄úλ̡1›÷'hÐgŸ£èôÏaô=o—S.fóY–y1c@!–½¦£ ‚ „T]Ïû4¿ð'Á+ȽE ÁôÜb¶€—–P¥¾,Ò,FT-,Æž‚F€ŒS´ÎÅ”†âV­4µz‹Ns;RŒÀqè/à@âòôbÈ‚B`Æ :K²8è¡–BÐÌ…]rÔ h»Ì‚²ß¢( Û»(Ž(@è?/¦ ¼Áiuà¨Üb^®aŽf±F;5â ‡Œƒs– œ³\¬ñƒ¬ÛžË• Ør+ðhÉÉ®W¨8Òî‹S®m8¢?%5û–T‡-áRŠe_ƒš¬/û«cÒHÉ©%¹sT¢cí']ÂFÍ%ì9]ŽÁñµêÔ!¨©­ZNélÎ2·½9Ñ“¨×Õ GŸcÀ1äµxƒì"‰VÄ‚à EAhTñh*MÅã¥x¼—âñR<"*b¡PŒ4##hÞ«5±‹“P†®(-˜®aä3 €|æ«Ã=G(`&f2`¡ úäkæ¦}Fžù BWø×Ž…ž†à)=ŽPªòäÌ|3äõ˜¦b´ññþš®Á#éµÃÈg0 EŒh&{ =Ôå| ¦ÖÐæ/aMwY@Slâ K¸ËbŒ¦Æ `Å@#"W¬`0â(EƒÀ- Ã-Hêl½u2œ_Þ€úñÔ7 ~¼õã ¨oÐ`}YÂ¥(Ër CIG)£ I1“0wn)@Øx|× ØÚaÃRR+¼\Cxyï9`y+``|„!Dˆ EŽ`Âbyd0›[‚rä÷ ­ŽXmrÄj“£ ez)º@±ÊÂTñŽr°¢ç!s2Ì" q;§pOFE­€†º Ï­ZƒÚ€Ú5•û™a‰ª€IZ*˜—š-r¶[d¬’Šl1„‚mA!h]º"?b 4Í´¢T@go!)ð`M±2`|„!Dˆh_w»1Ć¥}Þ¦7DغA†àî&«¾6…é‰b5b ¨ut£–A-ôˆÏ¦ œìµ@g1 8òRܤîdq„;¡Š£9Eñ¾Õ*a@Ç3.d0(áž±š(þe@çJ·ÌLƒè²]g¶jÈØ%´8% Ë”æ]JXI(3ø%æñ’²õ¥ ÚŠ±AÅQ6èµÄ e &X,•#¤[#pdŒA£-¼7ʤÀpN‰N#ár£ô÷X”¸Ç¢œÂ'.q­ÄY´r ë´ú3ÔZƒ®8RŒ¨çˆ"µaÊa%Mpáf›·¾•¸õ­Ä­oeX‰[ÕÊÅ€æJËÅ f.Ë4ËeF3Á` X!d»åšB ß}UD@kÜ‘aiŽ_jÍŒÁ$©MþÐ5Q%\"R¸½<î÷¨å*Shñ)F)e&¡I©¨àºi ŸãxŒa§Âa°Àv<‡ ÍÙ-1åñ-ЭÖÖ=íIÀ{³UŸ¼\õ¡ZPôÁWpäŪ!s­ðÁVhµVC¨Ø°5°ê4èKXuÙg”‚9 èW³Õ¸Ÿ/úTß‘„*ŒÕÄ5„÷y¬¨€¯æÐ¯æ°<ºšÃ†žÕƒÐ|k}[Á\ÚjAõêj1£Qôåi³FÍëœ`ÀhÈÜj?hƒ_ïoíü¨D,,ЇÅbÁµú óUÑN¦\® ðŽQÓÀè” AŠ|öó] Õ“¨û-BÖ…–vF8 øk´`@íƒ:uêÔ1xCþ‡Ùül?X­±`¬±0XX£$Ä:ÇhP[´68+áH1ÒŒ #ŸQ„3õ8 ]ŬrÒŒ #Ÿ@È(b#AŸi Wr¬m5×gDŸ`Ý3ƒp|¬¢^ÁÙì̶aDË Ž‚‚aÈmRÖYSïñJl„ºNa7È:¥Š} K0ëŒzYVMS•ëÁbåh=€Ò·¬)FèŠ%œSY7>_ÈÖ²?)1xS^Ž9a±À,¼À}Zލ®r”3£p ‚£)Ll;憜 . jwצ{×p]B{}õu™šªƒõªêÔ`~5õÔ#PA=55fëtñ@ÅYa„F‚— †,·zÔ·H½^'ëåØ+ . 1!_BŽ`éÃÓ¡ ¦4Ít8¤}Œ5Ñ·8„Jó0G9Õ¬‡9l%·‚)Ô!¨i^ñ*ùÃ5}ÉC8ót3‡· ›ñp³Kgp°òáL1:fððÈ‹áãVö&p“Ò‘Î ÿ[‚áÑQP¶Ž8€R!%ÐsÅB×SŒ4#Ã(`¢w ÄGbŒ' Ñ/UP0=tvÞe%úT¢O%õržú.ŽÐ«#Øîa¾£7à[0Go`ï ñGŽøûGüÁŽ CŽC¸/Q!w ž¢>ª®Þï N™qý‚‡ kLû^_0wÍçañy´|î\&wÄó8âw÷ñ×;ŽøUþr—êh§>¼?^Ñ@2å[Ë}„ÝfÈ‘B*™^Éõ4#ÈêV;¶m#aÕt®Ó€”°òqœ¡zEØž;œÄ:M¡·àˆ*UðãTÌqž1+9µwÇp!õqÁS¦bÈ ãj—EA ©uöjMl¤t\ÀÚçe‡*Æp°ÕN‹À”cÆÇA…ÜpÈ ÷¡ju0 ‘Ò#†s(ƒ7ú*ŒÑ.\Úæˆé ˜»ƒóE¡†ŒFÌÏq›†•æuü ªdWŒ=ŒŽjþÍuß fßh¦é3Ú$׃5]«þ°d2üK9Tþœy™Ù‘bšðpU…¦`†5ÓÕ0L©Øç¦ñã™›ÌÛ#L,s‹…ð–Â,îóârJ‘"è—mmi‹6–©U¾.BÐV¸ ìx=a 4‚h7Ÿ9€5ÀããÖß+å­T/ŠÚIÒšŒÛÃN—f¥t»Ûô¾AŸÎ“WÐÖ`ƒ>>­ºˆSS8ýlâ!(€5꬙Žnƒë'ýý¨ÇàÄ8ï#lªä ƒv2Û./éžèAÑ>äà ]l·V–äDzm°—ÙtÒ€¶Y§`¯Ÿ…€Ær4V@¼h$5€»àp¼Õ8:"õ-°| ÌÜÒ 6”·¨˜×„vÚuRã8Hé´¹SSú¦RN[GÓiÞ–ÊK5‘)í µêÁ€šËÉmJlºFÜŠ×$>‚ÐQ–Ìú#êºWä1j«žšÚ¯²aî’fºšN*öŒÚþ³£¶š®€65*4ê#Ìň¸‹s±}…À†+…¥§ŠÚ5šA»Db•²—@9€ÔÐÆøJ >YyàÉŒä9”ܳ=€}Ú6:y9¤ó5¦!à r„Î0VÐŽwñ"«¦ò†ó©˜C½ä€Þ±¾P&ÌÖT´ŸñJ8µå A#òÔš* ¤ÃuÌT5GѪ¿Œj–ì¨]¾ h[¯UOP a¤ô¡™‡s½Àò,Ó&«¦}²¨*s@•Ä`AÊ%YX®èÁÕ2ºZÆ:TŽgT­ Àš*DºÑå>§î!Чv€ýéJÕJ=®­8úc ç‘×öS*C„ÍÑ!ŽŠR0¨0è #¥4‚AðÁ90ç0t;¢í%ÍB¤YˆôÂ1$9†Á`PBÀpÓÛó0píøÜ¹ìƒ†)â£7>zã£7>Íg®a|L€¦èÆí ÚEñÁ°Oë&Æ Ú«0­Ìø àb›{ÃUCClR‡t5ŒUSÀ†#êéWÐö±/V˜¢I`|„€æ«+èµ£6œr6Bß}_èûB?úÐ…~(ôÛƒcWj¦;¯¶‚,…'+jT5GÃÑçpŒ8Æ •Ç‘û«¸¿Šû«¸¿ŠûK“j5ò`( Í£¯y¨4•æ¡Ò+85Ø=»G†vhvÙ©Y 4‡=¡ƒyºF/çð çô çch糩axNw]æ%úPÂL¹JQ ´DQ‘BJ™^´«5±¦±’¤Ì8ø ÛŸó‡!^GÐû³@é Ûš¬š³5q=ªéý œ@gÌ×SŒ £TÌ3!@`D1ôd-`€®ÓRjM…Ït¹YÍ£rÖ×j¨8jŽÜ%ægÊüL¹IÖ4`2Ú$ÍÕšð,j%‰‘2x8{Y£ÐU5GÃÑçp 9Fy¹·ŠJ ]Švdý¸¯c˶5¹¿AV +QÄÂÃã­{L“}¶Œ'=V㘙e5c5ãˆñgì2³ìP¬Ã“O1+À«5å’•`ÍlcÂ[¢!ÒCZÜ[LP#¿EjXÞ\Ðe(—0 áÐxp*»9„uŽýÉÅœî,«€§u^Å5]TQʈÚöE1¤u±E»=ú’SÞЩò[Ò…FóÆhÑ{ëôyh]‡eN ÁGB„ÇË 5žKè',¡Ÿ°„ÎÖ’îÿ·jÔ¨CRç4^æ4ô˹¾EZ‹U{u½¥bxì1‚´XÓ#„ƒ¢?†!J«jÎä°iÙB ¸Á…ùº¡Ò©ÁÌÌÀ* Ê.:u¦(•Š9È!“tïÉ  ÷¿­.c²êÔ!¨#PÇàh_! w0á\À±ÙAQÒàÛª[ß/ *Å1ì"½Ò ”“J ¸>mlZ wRs„(kH¾ãMޏìÔ¬/^¯(zÇp«SEš‘aDIt£íž^@~+q—GI»<@΀msV­@­Am@M>—c° £ŠrL­\®&4õU¢ì ©4°ujÊ+ºÍûJz€Æï—*´W+º›ð¢…–öV°[ÖA"„ö¨ñ€ö³[%­%® IV$+h­` µZÐÇ[Q¥¿jï³bü¬ÖT?Y5Ô!«õ1MÂ=ƒ5µ’pÑs½èƒšš ··l?<`@ZàhݎÞêÔ…wí°˜iw꣘¯,¢IJu«†àÀ‚àúxN¥Ã%¬ÎZ bÆFŽ(9ឤÁኞ ³ 4‚A€1¯ƒ#®§iF†‘Ï(`1Š1(ÌÅ^À…Q¡Õ¼L=Ž Í®™M˜[8.gt¤¬"šû´¤4Õ^Çt’gp uÓñ‘³Ž]ÇG/nõmGïjM¬ç| vfW£V[—i3®S+P£jÔ¨CP·ý—¡÷ûLM~õé ’!ìæ»o˜öÇm'w˜‚íl§ÒBšN59”ÓA"mΦ‹¾Gg“. iCU¶[h†m§ôÞa6ô@M͆´rR5ÕCÚðyѪá„REŠ…ö‡Y'¦¨§ç Ÿƒ¼¤DÍV´§ÓB{‘³5µ†¬E¸=î}ŸUªviÓBÙFÒªûJ ºS·Íp0˜Ó¸­¢”ܦÕå 87SÓ4èö”!] ìÔ”ŒƒEÙGhGÆÃaÛþ]Ûµèáp»œ+RHtEŒ£ö& h2×a›S¨éÚüpÝúSÙSXF謚;«ö¾p«E óÅá(£ Ç—jêqºŠ£f.)Fš¥ÅøSfÖg´©®Ö„3^•$dÁóJ5QŠŒ&´ÍÎ}éÑ$ Meh€:ÐY Ëð¦¶`|€HÑ(uaê öûR¤×‡øy-QÍÔª½d•¶ØPñè𛃡í9hWk²ß†*Ì1Ý@9c…9¦ ³*~ã%U%cÚBhÕ Ô`žÆ à õ“/U@=‹!ÌL a'ä^5Ò«&†“öz™ádÒo—®Ö„ ãpBSJãSEi1…L!·Xu š)Mà;uÀèˆÑ19GÎ8 Ý2Ì<ŽŠ£æhÀ•zŒ#͈Ûó‘2æJÆ\ɘ+tžÑFíTÄ¡5\KP>,`ºè ,é,G­Âa„0F˜ L!5\äð: …aÁƒ»(+RŒ0¾£Ø/¹T­4UÈioÿº\£ +Áí4LÅ žU͘ójÌÂÛN2ZðAƒ.P¯³©Óß¡ðЦýa÷9Píû'-Ðè£&ÅH3¢ÂœCÏ1‡žc=Ç|„æ)vù*B `{a™Ñ½/NÜQ-•ç$ÎÁ!: óùÒCP¿ùÚ GŠ‘&?äÂ>|¾di¹¤´¼Zk¶D32Œ|F#À&V iT@ÚÓ’·U·«TÃ|UÀ¼Ê0§)š Ã9¤9ºw8‡\5§Å4§¡@­Am@€:uêÔ›”¾ìÔ×ho¾ u’ç0z˜!c+¼_å€ Ô|šÓó4 ]ˆ 4¨sÈoóÍ@ŒiNÔª!ö˜¤ð çð çÐøÏ¡ñŸÓ,¡UÓ£zÃùX I)§nW‡. iro%oÑŸ€zNjh¯ƒ%$¢¥1Â!ÂMòcLöÇ}š¡.&K²1;¤áÐbI•¯UãÜ´eòRƒš Ïb »Ä,Á-Y–ŽP]ë[ \X@c4/åÀ øåõE{I‰ L„Ö¤€ ¦W½v¯[M¬jqÃÈg0 QI\SZ/Çí­IÃåœ6Ö Ýë˜.U° &½Àc‘Òg¹@Å‘Zç Û‘Ó†èoÌ¤Ü =WTßÐ3²N †hÆßœëÒ\NMíBAc«+°ïã=4«4‚Að„!€q”ô'ERô'E§Ð#tà8æôöwp‹ÿ®f0gdÕüZ†W-SÕO7ªZ%¯ : k5JÈ£+Ú©QTâtËóE§†öÛ‘b¤Ö0uDïôÙ°‘ø˜¦Jì³ÁZWTÌÊ>…º¤K/U@§jjpà:¨!íó¼ìÔžW-g×zö§:Ý‘˜Ž$–¯ãŽ×qÇë¸ãIØ‘tüR¿TÇåvS I")ÑÔÐ0ëŽËºã²î„°ÝòL’Ž_¦ ÓñÝt|73xù¿üŽË~Çe¿“ò~×åNLƒNLƒŽïA'¦Aǯ ãrØq'ìÄ"ìÄ"ì|°“baÇ÷°Ó°ž¨ž¨ž¨ž¨ž¨ž¸“>qÇVܵՉE܉E,cáuʲד¶¼Néö<w¯SÞ½Ny÷:¥Ûë”nz¬œ$wTÇݱÕ)Ë^§äÒé.’t£;©Ñ)§^§œzrêù=Óñ«Sr=¿¯N9õüN,:%×ë”\¯SN½N©ô‚N¼‚ŽïA'^Aǯ°ãWÍ<Íè@!hƒà#P÷ÕA»•®&æ ufËáfraØ^œm•4:)ÇSë8RŒ¨ÿQÒP©„n@ +Hå”: å—ªJØYïˆÆž5Aøç0ÿQΠªrj°½¤í`Ѐ¾¤e÷ bCㆲM!l7õ5êž•7Gå€ñÌ#}ûáo·¥6×ÐþMA”Z+è^¯2˜­±@“õtsãp³O+XíZе£âœ E,P® 7¿‚Qöª¤Ñ-Þ‘;„;rÀ:˜…¢VЋ^¯(*ë>=ì0„­ðVÝ5y¸ÑSâÃõ„iY»Šä†ÖëÈo‚ü&Ê!€7i«ŒjÔ¨7¹îÂðfÖŠoBpsJ»EÐÔæÍ©>-ªÞ¤@Ü,èÀÄÈMÃ<Œÿh€jjšf8‚¼y´Ì(ZGp£Û Gƒ6øTí9HQ+Dˆ ¸c°C{Û.ÕÔcšŠ‘fdùŒF!£ˆÕ3G°÷sxü#(Gpµ”¦CßäÊÉ1,b÷Ñ Í·»ïÞ¢=«VM5Í­Í òÝçs.ó¹×*ÁD®<9fÍ´Ë-÷´óãFí²ÿ}VIñs tk—T~« [Uû±GøMOS95¹ÐNuŒújBêvîï>§¦pà{0-Á ´Cï ¸Á!D€ÒVM“H‚FÈ>Õ£>| Œ4LÃ9 §’*J)–èíQ:'7¦s… ÉÒÜëÑ«Ä5¦ =®ëq]ÅuÛà\®^ƒ«ØpÓ†»ås]ŸëÒU5¶Q­µCn9ä¡ü×p*8ã¹k1 ŠÇÌë ÝŒã€!ONÏcá„w7¬˜qžDžÏ½ ¸nÀÃÅSÈ ¹nÄu#¦«Ú_i°³oô…q.Å3‰Rܰâ†57¬¹aÍ ó ¥x†R<µÏPЧ–â©¥xj©Pèò`ðì¢xvQ13¬yм@iæI§µ@–{´nËDÃVF4O-ÍSKî3O<ÍOóÄÓ‘@n8â.GŽCŽíÖŽ 7_­ §ª+IʈydbVe˜8e…ÜçÅØçyØçŸÉçŸÉçÂ×B—…Ãçéîót÷yBû<¡}žÐ>Ï¥>Ï¥>Ï¥>Ï–~ÌrKÐãueÅ9ú)«‹ž@O €gÜ€—ù€'_À“/àIð$x< žϘϘO €—Ûç°Ç’/ôxò…¯ªCž¡by1¤ÇKjmž !Og g g §^ÈS/ „nÆ‚ò;ä©òÔ yj†<5CžšO͈—¶¨ÍL÷7ˆ‡@k·ÀóWÄóWÄ“3âÉñäŒxrF<9£@ 7Ì(â E,ËD1Ï2Q̳LÔ¦XU™ ·xåµ…ñq ^Ëe{#`e&æIó$y ÆZ 7Ì“,æIó$‹yŒy Æm V}‰8„9f) }N˜’–`TNg&*H2Œ€aEܰ.Šñúíyì +4ía$Œf.±~µa‘0,±MÀô®Ç|`IoXò–¼†%¯ 7éš®­Ö)Ë †åHÛJCMee6fþ²‚ï³ÔôY…é³ôñ5×Ãðú,+So¿"kŸÅÚg±ð#z^Õ! 6uå]Žð`P¡@sBÏèÀçÄLrØçØçnrÀK^Àb°ÄèJÈb²O²z;ô¸sÅÃ!hHçvT G\w„Ù)d¥=TÌOVû…,õy?4¬ßòiŸÐ°~‹Eì·„>·ës»>·ëK»>Ç€cÈ0ãeÜ£×pÜß÷wˆÅ9dy*dyІ 5¡^ľ?0DŠ¥RZVÈÜa_*Ò\/c4`4d4b4f4Abe/b~D«Ú¢€ É#zRærª`ÚŽCŽ#ŽŽ×±6ŠXyåã–ˆ%tL³ Wl¯Tn*Äþ¿1$±ÇÝçÃîXqïÜ[¦ø¡cÖÁ²Ìw1Ëw1Ëw1ËwqÄõ0OÄ,mbVS·Z0vÍqÔ§VõRðu‘Ñ™%GC„ÂaŠ#ÀÚ-Ð^õa}–'­|‡õh¨³bÐGHɘZ^áQ.‹ù˜ü\-@c=KpçhƒŠ£æè“£kˆ³j jXBZ!qÉÌ}O:Ç|a”RO1ÍáUrK9‚BðBò…¶ZXµ5…ÎJŒàEÑQÚîG½èÔ´Ït”Á›~iF†‘Ï(`2е{ºjbß<¥;ô*Ãí¦¬šXP•BkÁ øBˆ€\z=F#ŸQÀ(dKŒØ’EeIûHkbóÞNb±(æ¥b^âç[j'Í<Ð,pšÛcžk_ÍR­Ý~Zyάæ¹ažæ¹ažî ‹¹aA1, KÌKÌKÌKf'çfùáa–ö0>Ì€zA Ìçc˜Æ`<ŒÁx˜’4ëÏ˶gíAý‹#w]pŸUû–¨ägtüd”aÄ‘™ –RF’b&3©˜IÍL ×Òš`²ô(7d“ŒüA\ Ì(§š Ãm nkÈÊœ3>B€ÐG è ²ön" #hU5oV·igµh#–Sçd¥à½F3f´S`8§§}¤ÔÁ!«ÑòŒÍ$tȯ"ŸQ»µ³&V! Ë]Èl nñ«H1ÒäýŠ‚¸>¤.Àð&…–õ²jú^Ã[mÖ½Rk5¬€ŒBW¥¦C÷I™¶~Žiç•U+PkPPo’í²Sã1Ë´óc %oL;y*`: ¡=Ù[‹²Ô5xQ·!B„CÑo…ATè²bÆ YF¨†$¢+e¬“$ujªyÇ#Üö3†nLM‚Bï V°¤aEì’sÅ€pÿhL}Ññø˜Ô9|ð¶‚±Æ7EížÙ =ägn!MèÒ–ÑœœÐÁN«Ö ¦Jj²DWétðÅÑ4Í@kšNÛ‹—-Pß~J×ߌ¦tùšUÓXbJO :ù1^@Ò}¢i×qÖDõƯ„M!oOáYH”S¨®Ó³–£Y 7UÄõ #ŸÑ&Z«éÚjÁûZXp稪áÞ³fÈî=›ÑÞ³ „!BˆÑ×8G­vGéhÖÞd­ÆŠJôlMc¦Þåíaæ #cÁÍç#¸ŽË©YÅ–O§¤wÝëõèõ芃ÀCö”ö‘•n{”5GŠék¯=PR³R̼ñz!çö KÅmò¯YÎa{¤Æ±êõ”ÇØ÷0>Ê3=ÆÊ‹ ccBÆa{|¡bíùŠq0ó¾Vgnß}¦(ã3ŽÚÇšûgë{¦§,=t/bßS{ÖcùŒƒ@1Ž<æ¾µÎÌkôû,?XŽ<ÆfæbßCŸÇÇ13ï÷Xþ±©±ðúZ˜7Â|²øû±aôz̾Í_ø}uØcù_‡ªÇ⟅?ô{Ì|DÇ jöyxb:f×pÄ‹ôsæþÇ!Ó7=/6ŒUqŽãˆå?ã)–>–CfßÓ>× óßzñ3Êë1÷•bñuÌìÛê‡Û×±f¨qØãö£ÐgL_óüctÀʯe–Ÿ-ÿÜ|ÄÊŸ1¾ÇÌ›€å›Ý¹yûy™{¾1ܼÏÊ£ñãÐpŽ˜~`+pÆÊ9³úÏß@³ú߯p÷bVŸÄ½Ð§ž`N÷®Zu jZÍ—ÐÕµ@-p^¢NÉu¨÷”à ®|tjléÅÍQ~“Z9 Í:æÇÓ9«©iÃÈu³}óŒV狜éPàé §g—hÆ€šºóePĘ¢> ÝöqÙ©YD-·_åÂb²h/PºèÔt=áh}x9jQ'i':€ÙG)d¶|„!B ™”Üå€q±îƒš¼\f}Úú¿Ìé]`.‡Á§… è-4]³¤ÃaFí®kkf~¬ Ÿ,WOàÆß ˜ø~”¢±e¨“¡ÎuÚ¡ñ• ØÐtIÇ”* I0t©FÅQsv}Žx3Ä 10sà@„u„q£ÎaÊíLѯëhì:»ŽÆfhl†ÆðÓ±O;G4¶@èIe K´SÃRÔBKZ*У=*ÐÎ ´S2À¯]Gt>RáG4=PŒW ÞŒšïwêkëÅbÚVCVÖ¬ ˜-Jjïʾ׃ëÉF%æŽÞMt@á+ábSL‡êá2”U§ 6ÆôªšƒMCwaTÎH>‡òg>ŸXQv”¢AaS`®T€—Åo ‡í£1@•^Îáz Š¨{V‘0KY¥„ç+ Q--:5MÛ•4õRƒñ[”¶+˜ÚXÁê*ƒR³Ê Ô¬2X6[AB[u¤Õü›”d[–µ,Fí5õV§ hƒ@3gk˜£YCócÕt)­%Zz»0ZÓdË:‡+Fëùš µW_Ö+¨¾,(ðdu¾·#Šåº}Ðztº9 XfÐLY ë‡Ô‡8dÝG”«*‚VûpI ؇å”&7©®8„¢lÕ=L«Ðc<\Pû @‚:uLjŸáQS{atDsGPiAÿáèò¥¦£ ‚° ëý\ë8CY瘊Í1‚·ršø;^¯aJé„Ϊ{ ¡@­Am@íƒ:uêÔ4Éu‹ÒkÜ£Jc¬¨0Ö© h‡N­4˜Ú¾ ã~ÛAÓíÌN­@­AÝva¬º_¶[*®4H³lJ Ú¢giÝš(Äý´èƒVÑîjMد$ ¨ì{Œ¸žfdùŒ¤”¹Éý£K£ †hnÌÜ37ÆÌášcIV–Ì>Õ>'í!±êm‰m0å8¦¤®Z+ÉÆCŒ…9dI¥3ŽŽCŽ#ŽcŽŽSŽ×Y 4’ê3JeŒŒ†kƒà#!¦ÀÛB7#eN!ÏõŠ^·©QqÔÛ*Çbj*ÝûZ”ê|‹Å5_°P,ÖøU ]ÅQs4ÌaÅH3â&}F£QÄ(fÞç<¬9kn8úH,(Ž0&v  øåkRSeÜ_ùE?%34#äÞU…º ho¹XÁŠì´¯b9›Xà±’(a¾ÅØ/!Œ+°½‚ï´R¹ÇˆëË«vžÎ©¯qÐ „^êÔkJzµ…  ‚yhM•㥊TŸ#|—5”¬õÔPdÖ+L£õ ÓhM/{]§Ôܦt“„USRx¯Ë}­trZ€§ð Ý&§œ‚~u_Ú€ÚujúDð>®UoܼgÜŽóÆE2£÷Çt?•SS`2º]gœ iT:ÎF­+à\‡(òrLεkÕV=óô¶½5?#330Õh–ÓdžgKÆôlÉű‚Ak˜QÅYBЉl‰þ¬¨Ø[uA™ˆ^;±JZ‘®‚3€û/ÇÈ<zor o•8uéø`œ¥]VfP‡ ŽI=… MÁÍň<†—½(`¨ñã6….Œ‡íÝ÷VI7‚ÕdùŒF!£võ§&(N´Yɪ¡µ†ÈcÚÅdÕ4-çÔT _Œhvf<‚½@§€¼htJ¨JGeŸéhƒÐNŒÇtŽU+PS^gkPµ`Ǻ>Ǻ>/!Cçôä˜U¡#´~„Ö6±›:¬9 #òµ]î|­|‰h6 YK‘ ønët f®€9|½¢ï!2‡ m_«Á‚ï‡9i·=ÝKÀȳBÅ|8ÎúsøqÖrÎÂ`sîµ;#îÓUðV#ß@¡œVdnÅÏEe>JAMéù”ŠýœºóEjÑ΋¢Ž%h”àsAá[ô¡ÏiA!hƒàLÑ):E|ÑÏAƒ6 X¸êMÀ.;5{,`%Íú³Fn‘’~A5ŸÓ œoÕ9„ƒ4‹”ŠÛ‚æzcè¾[ðhÖÌØhÓ¤U£ü§§¬:uŽb ¡…]` s”ÃÎ5$P~Lj˜I|·(ú4²(0ýëˆÊÞ¢€Oç4×íŒse=&(aìhA!”ä‚jé`m™!ŽèTT¨c!ÐÁåFà3ûš‘aD3WŽèØm)ÇŒã€ùÀ ~Ã=aÀöÂ:"Ûbö'äxT"¡›1—#:#\óãˆã˜[n«º*X)~¼éœ*œe>G­b¢ÁUK9h®éRE”×– C9| Ë6˲q,û+àWHq¹‚Æa W,—Ç­Jl/³ã´°ñ÷˜zÇÕ5m—ß*c²Ø×‡EŸ†ÛœÄuÆ`fÛl/«Qèjކ#M)œ–Ã\—*€t€iÆt–q¼PÐ[VM¹ÜªY­ÈÐÃm6DY œÍ(`1~\@·¢RS‰/ØX€Q@1YÐ× åb:ÁÕÁb¶|˜ GïçAšjxHfLÉ85|çÅ,Àd³U÷8…Œ"$:äP³ç)Fš‘aä3 A>-¹“Š9©˜“Š9©˜“ŠEA375sS3W4Õs¥3f6F2,a óÑ0 ‹…aá6,܆% ¨Ï¾ŠÏ<÷™ç>óÜç®0Ï}– è…šØZ®•,×SpælÈ †,p!K™.diÁ’)b!‰Xì#ÖÐ :mæÀCÀÐ+!@ NíîrÓè˜fÆ zÃr¡sæ^ ¾¢ ]ð1r>ÁgÆp ã —ìk… ËA@ÏÒT`sRŠ®„!ZŒÐgö)#ô9BŸ#t-ÂŒwŠT”2ÊÀZŒn´˸¯Ášú›zçJæ÷¥Œ2F¤íÁ›)FÐôaóS¼ á€éÐ EA³¿tý X:*ŽP>A£{íÝd¨#(G”†e> KìjL9RB9TŒ4# ír¹o ŠU¬ÀX c1 àŒºË”2C9„§pvgŽqw渜@.éteFßåæ„,(`ڞÕ ز„G?+€©Ùr:C›3´Ù 03ž†æ Y¦vyºÏ(e”1 ifö;êóc^àlh9C5d€™êÔ”©KXï)çah3®Uƒ›sêZ5ë–sðcŽ~ÐBI}I:~i•CXÖv!ÁË5¦ÏÃ0%We%'e¬h>iÓ÷«Á¼"d²O›”: px¦û4ô¡‹yÆ+\C[QEf •¤¤é«nRXá&…nRXá&…Õ¶œY Ðj7É:˜¡Ûs”Lý£¿s`‰v–pæÚš‚€¯¡œY‚儚â0‡épÑ[á7©¨ÇÑcf#ÍÈ0òÑ@öætµÂÑq¾æDmË1¬ØÃY«†0[+9l‘8nWœå¨iéðšÈcXr¿)ykÞu ê ¨g n÷Lè*’‰7jû‚V½X,—`j³ÖvÙ©qLm#sê>BJ¦Æ`jê-LÒ>ªÛŽÙ$¥Œ–Rgå”ÏRÈ@é°½ÆjŒÁÍ1¸9'qFn€;tÖËÂ-šNR*KÌM;Pô²Œ¾)쀼Tº@û-ÀrŸƒ!PhGi!@)pc&öTФÝ\iÍäÙàŽ³ Üq6ãjVmHM»Q'YI5UÓ@¢"p‹6 Otòb=FTÁ øBˆ!PÂО±É`€^hÕa2h³äE§¦•}Gt#iƒÔ ÔTËSʃ£Ö«aÕ‘b¤µ+0Ñq’Sf6`šíâ—kL¹7›”»¿¦kë5|€!,m8 Ï>l÷[g2:ÉU“bDi1ÌöÀ=¨ †t5žUÓþ 7@½5úá¼Ýçè`[ÐEs6iŠ~Ö.—]nÂSLÈb³>–ôH}Tñ;€.^ÍŠ£æh8†côG#rBYÀ¦›!¶Pi W(× 6 öA€šJ%¼k5Ž õY“8<‚Ï}ÔY›îGtçmM²cpàåÔõO«$##ptœ¯hgQ'ã)Û-ÑVÙÏH¾"»«m¶ŸLúTZ5unlÀIÝ6T—šu9-眨B™ä4Ñá€éP^˜ÂV 9'*•Ó;oÓ´½òÞ ½íÔäÑtÔö®T€«®•`fi€;™ŽiЏ¦”Q†¤˜I&ó‚vá[‚ÞÒtÑÞEî`:k…@™æº˜¡ÎL!h* ÓB]NÛb}y2]­½‰×œ ίé;8Vý¾¤RIÁ@ †R0–‚‰L¥àº̤ —‚M |ÿF@ !3©Œ^*£—Êè¥2z©Œ^:’ßTÆ7•ñMe|SßTÆ·íÚ¶‚…,ù×Ö"÷h‘{´È=Zä-rOûÎÀ†Ç‚'‚§‚¯s6"|F„ψð>#ÂgDøŒŸá3"|F†o&xóI®:V®ôèŽÄàGQ²@)Y ”̤JæI%³ ‚,x¹ð/­Ä—UâË*‘òJ¤¼ž($ åæR-Ј†æG'Ó›C:RŒ¨¼~XRç–nþŸ´õ¦U’é\Y:™ÁÐ*·­ BŠÐNñ: õ‰S†K®»¤$qXЋz5§’ãÂü¾ÐöoмcÅeŸi—ÂxÙî.Úp€ñ"PuåW`Œ0A¸Ž@’¼ó^˜ä4"Ï×”'­¼±Æ¨3§ ᜚ucæéú}ó”ÆÖó ¦fæcxo®"úæsÚÈy©ÚîPÐ_LGƒ©.˜Aоdq©‚ f%1ÃXZBßhkA¹ÄAaÔÔ:gáˆæ¬+ƒè Î')$öœú1sú @` ˜)¯hžfŽß6 X5õaBa30 ì.Fì=ÎJ70}„19Øn5¾4Y”‹¢ßãHý‚ÛþìÕF@íƈ¢÷ojæú”+}êo:¤ú·"èM;01‡&Ü]ZêQ3«3æÍ¬àº9£9£’Ñ!KŽCøµË‡¹äM°Üðµt•Á0aQô¿Èé“/a·õd9–œ#Êó–h¬¾\BgÛ‚B Îú²h_íœ,Ë9%¯üZ÷§eÉŠ`°·\¯aüµ¬†¡Z0•3¸ ïb›Ìõ@M×ÜŸ˜™ Zѵö@C­­Ñm…ÀtX|„!Dˆ!©ˆ–ct&Åh¥,T)†*e:ª”9‡¡J1Ti„€AÌ H.8SèÈc¤a¨2 U†¡Ê0T$À X)©Ó`€!°P<®§a( 0È X{)Ñ=ô˜Ö¤è…ÚP.+<¸I`RÀ$œUCå¨=¹9E*ÐVÝÎwÜçÔÔ#(¤¤&¥ ËQ­Ýª!H0KTÀ,Q³DÅŠº6VMé]ܤ;­&-žt(ë:Õ;)¡|Yu;Qx©&űÝV?)iV¸ÌÖäcImEqjj jJáö¦=+^Pµ\® È+øx–Ô fkVZu"ièŠVœrÓ†‘Ï( ˜/ùrµ&Ö•sʺ¸~],Ò5y—Ü“+ttk̹¶B ¹évòmXê+ÁZ°áÎ ß4Ga8ษϮ4XÇhem5`ßÄ’b‚E+¬«mêµP ”õhW…SƒÛ#zÞéPS¸AÐø8:†ïj¡@ƒ°N½¢í56¡‹¸×‡.Yͦ‚ à6Ra#UÂFª¥ÀPeè˜YjÔîÃëÒ5RΡfdõq{Ôí±¤˜†™ó„!Bˆ07)¬ž­hœú`×l‹ù†7¾³Q­·ô>EïSô¾m£]⥸®¾*Xé/²^ˆž 0pírïÕ ®Í—ÐyXc´Hw=LÖôåÖý5ìótH™ÿJƒ°µ†QÉÆWk\Ô_—0±0@"Œ: Ð•h4¦Ñ˜fÆÐSM«´¼ç4ÚÅ=§€º={áÔPJ×pèÜBÀäèSƒµ¦±ÖzÍ–céJžÉá‚Ú5Ü `ÕÉÇaÿ&\’:9îç ‚F bd¢vW˜µÐqÉG¨¦‘CNul޵j~“¬ŸÎçðX§#EÅv£™9Íg[5%Ò¼€qÕ¼€® …ö²ËŠh’Þ `jRàÈ]¤ çpÚÔ*44XdЩ]dÃU! ºðΪ)f‹1˜£\ƒÚ€Úõ©'¾ í4©WZ EȨ纘BDÚoñ€S_ÙQk+Kº’¡‚Öý5]{»RN”10¢†vQ µ¢ 7h*J‘|¦çs½£!££ëŒfHôPï´½Rê²U^ƒÞ¨M«Äm5{Œ(§-VЧ³`|„f tÐßùZ‚F °†¾—ƒ#…h„vþ»‚œô„!B Zf±>$õMšc)Zöu ¨ë]dCšòžsªuŠ¥ç!Pq*èá:«öA‚:u{X` 3BE»(oÅí}>Ó8×sY·zê!X¡mèMZÐÁGÀå1¨ÛMqNÍÚúÙ&ÛßïÔ×VÙ§EndTnŒaÊ·"ň>ÍÕ0ó)FôAnRURöÛï~¹8]àX!hJ.Qœ–?J5–|˜Xòab…9XÔ 6 öA€:ujÊù%Ôüå8õÔ7H  N•Y5„çÌ™#ÿš‡ðQá]a&^e0Xe‡¤1¦[-´]ÐK@ï”.âwj”SEµÊ¡WAõœSÓ7_-3lÐúõtSœ+j"WíÖU§¾VöSº¨ÉJhvêÞéº--÷M×#èXP”×°Ù¥‚# *Ô¢%GÌAƒà#!B„# †9Âá&­±U@eià 3 Q§ƒv@VéaŒSŒqŠ1N1Æ´¾êæPÖ8EjA!hƒà#´·ëMéØéšVà °R*ãëLÑi‚+°Þš0£)BP¢˜š\Ó]UÐ` Z3X]a4W´®2½9 eÞÚ¿¹Xy}Zgž>L;C§ÇÔ»uHÏËÖ¤µÕÓõ>U‘VÝ̪ 1Cµu›Ï¬zN Zƒ“÷7ÉÞ˜ÐäÖÜm'¿/^ïÃ-;6X4t¥ld¯¨¥¼>̽¶4^ŸÑÙæ‹×ç×é¸Ë}Ž B€°)«àZ‘÷þ¬L´»ëóãV¾„×PÔh©Õ©Q®AÝ® ]o·ß\¸N›[¬²ÍNÙùúª¤ó¿×Û·o/\?lGÇV™‚z@FÚzbÖ‡Œ1ƒõC«n‡ÙàrK A#´ó©¨­ºZæ‹Z’3㊑¦pъᬿ¦jÁAJ¦Ú5§ ©M… ŽÈÇ55Z—*Ê*4›‚æ­>]B€"D”3CxÛ¨"…T2½’ëQ˜l/²(ÔQ¨£QG£N;¿z¥–¬€ÍCýj'e¯T œ÷ÑE] Ðè è²ÄÙ $1ͅΆ4[uaF‹‚³!­ÍÆ£šG”í'ð@t9R{­ü%Ke ýÄ Çvqd6™‘‹cê±NVíIÉ˳i¿ßëµy³a#¸½ü¶f¯×ìqná6B¿ÝÒp{!oñ°sóª]Ø»²áœÐÜA%"¤ jïý­Y{¡à˜yh™{¨}bÝ^TÜpÌSÀô¸¾Ñ<€&Þè ãñJæÓfóšwÓ÷yªùç  ~HÃ9w1ô%ódŠÄwŽbŸ%“ežLq§k,¢+þÝb‘,1ÿn6Ɯەà+ι­9Ïã´Ì= ;×7,ÌçX2wOy=Á‹€å\à*-4†³/ܼ̇)¦eŠiž«<ruÄSĈ4Š{(rºeÅ™çZ[Uý@¸ÏKšçó,d™'ˆoxxD©ðü˜»ˆxܽ@$x „<"½Â·z/ œZZƒÚæirØ­æ€é(`|„!?!\#×Ãåƒ:5ºšrU½òK5õ˜¦b¤F>s¦Ý¾Ø`Ê0⺴­Bªcrº îb=F\O1ÒŒ #ŸQÈ(BÏ™“Šy®˜çŠ›dž+æ¹bžÓÓ;EŒX:0'5 ŠfAÑ,(šÛcAÑ,(šE³t0>B€ÐžÞ¬€ J­€¹Ø.ÞÏrXZÈgX¬fÓQÁ @a˜Aá™Aá™Aᙡy(<3(<3(<3ø*³X@u’/(1K8[c%Úë (° ðý\³ÿbªÁÁ #èæuƨCw Íæí•ͳEFê\&4ÃYêÅ"QÐÒA A#!@hЬhG÷V½nW¼ftFý¾Y™BXJºE÷¢¸®eVfP–Ã9½jÞ å¢r Öà‰åYY‚&þ¬º‡ 4‚Að ÚYS#s$D þ¦ƒÂgŽÆèJ\@×F¨ó,(¦…>+ ¾BŸè¦]@§è˜ÆôƒêÌôu¥hƒ 1ƒ 1PËYˆ!<è˜ÁD0ªcè Ì­•ëƒd`ý1¦!¦nˆ bhBô3Ĩ…ÌiŒZˆQCsg„¡‰04†&ÂÐDš³jT,4Â*×îmvO°L³,÷Z W[A¯#éšQÒ™Ž@K‘‚NP)¥ ’‚˜ (þ@uJ ´ˆj醖nh醖nøÒ@ B)ˆ»%Z ŒøRHA(XÁõ %²%à†µ`ÕñP2³(™Y”Ì,J~W+PR Ü_^É/¯äwUF äWSò«©P¤Žî°ÌSKzi®y6$K`_p 8 æUŒLŸ*ŒVà J°lû‚Á¡àH0q ¾I ˆðÈo Ž;¬kÁFp${ YŸuE2ذlq@ç¿f+èÑ+¾÷ÍÖSút«Äe§Æý^3ºêžYûVöìxÑîŸÍ=º\Ü,—æj2nï^¾”ëy /×ר8jŽmc—÷©Ÿè`ˆÐÞÞï ÝŒu±‚6Ž9±jÚÎaÕC€ié!(‚œÞ3Îû´_BÐÁHѺ¶§‚‚é¡{)º‡)2Ï0 Úa®h¬`Æ|ÃzI' kT5¥òn ¬H1Ò”êt ¼U¯i™¶Aør¼ –÷Ëñ ß,¤¨ePË0­!¤@Ñö¶.ĸRŽ¢ó>¼Ã‘Ã{šrº=§·§­™5Ú¦s)ÖÔäÅváôBÞÞÃ|RÈÓvM8OÁbÚnŒ¿ìÔXhó òšUç A…Å–¢>BŠ! †#…®)tM¡k ]ÓhG£v4³ƒ!0è€Ð .ätð#ÏrxŠ&ÏæèÁÝ.NÝCP>XAë¨#PÇ`9‡/¶,IcYÂ+À½žg”é2º‚?Ð@ݪ¨© ÒF—œ:¦`Õ¨¤nO?\rj¸²²FÅQ3„Êi@‡".V@¥m£æÃ ¾™Š#¡ºìÔx^ßòú˜¸÷3çC¸“'ÎémÒ X0¤G^+ êt¸hWs0ö"„˜B¿¤¥µmÅtõ©S)uåGƒV—kJG9„ }t@U¸…h®Ûƒ(9\ ’ût/Ñ¥šGÍÑpl;o5¶3صˊ‘fféàE­k…Ì›0ešíKá5±üâ$1³ÜÞÁÐ`ÆÌR Ó‰g«V Ö 6¤ž/H]‚¼ôAMÕ ½"z!ŸP9ÉÆÔNLF”(V ´#ÅH·©Pnn%܆aD¡œÐ±Â|-Õ„ŽpYµµ5¸CÏ1[uj*-Óv²ñB>‘xD‰@‡VZƒš"0ÍéF€š#͈ÛóH)s3en¦ÌÍ”¹™27if0§÷`î³j ò<£È– ¾šÊújŠõÕt>D4ÆX1ML_Áµ|™›t.VâœhAW!ÔDÙwº ÉA ¾B0t7‡t ¤öiÚ6³—­:»V¶­ëǽ^¯m±´“ŸïI4ÑNȵ‚@ B!ˆ¥íƬFàõ„ Ïó¤ cBKtÔó¥@„Ô“‘óüH DŠyAO dHéh CˆòBi"”q eÐ#i"!U½ž()¥@DŸvVmÊ“é¨ ¤@LûR ½ÕÒŠ‘á0Ò[#ÒCÉœ¬|iB~J%?¥’_N76q¹#€™±Fv2ðòû«P~™P&Q$ÝBÅ2z±ôECKocñ!tÏ“-F |)¥ ’é­Ì‡ZÖZÖZÖZÖ´?µHo•ôVIG•tTf­¤/Z:ªe\d­¬µôVK_dÒ²iY„´‘Þé‹‘¾#½•¥NûÒQY£ê@úJ‘t4Þ™?Œ¬§ŒürF~9#¿œ‘©ndš™„FVKF¦©‘ij|‘¦FVKFVKF¶0F&¡‘-Œ dÐC鋬¥Œ¬¥Œ¬¥Œl¥LèK ˜¬ØŒ¬ØŒüúFÖtFö@ŒìÙ1‘ôE¶–FVŽFVŽFÖ…¾lO}Y±ù²–òeäË>Šï‰ú²òeÖöeÖö•tTfm_ËpÈ6Ù—5Œ/k_V¾¬ |_]Ö¾ì€ù²æËê—m²È Ò ™×}™×}™“}™“}™q}™q}™OýH†TæB_æB_ö”}™-}ÙDû².ôe> d> d‹ô)¥@øÈö699½í@¶·lo™×Ù» d^d5ȼÈQP ;¤l‘ Ã×Åxé1RŒ¸IëÓ½SVÝ^!áÔ0‚+† †~1õÔSP_õ ÔsP·Û«¬f-ÀØsݯÀÔLOæc˜J³@Ãö¼ á}ù¼Oo‚U£–B-Zi ¶,äH¦£ûyË]t¾Ü©)tóœfžæt1œUÃêÔ|³Ètã…S£\ƒÚ€šõó%L$ZP4u:_ÃìƒÐ9‚õ 45½€)ÛE“§‹ö“]vj<(а³õù2ózn,´ôFë í“‚¬­i™§l·BIYÒá…,Œ¢ŽÝ0nëÇVõÔ™ßq/ê…ÞYЕuÃyA×=o‹]…‚ÌïÄ7R[ÜSÝøFª›VõÛAt㦷Äôµ%Éü¶j™×uÏ—ß×ɶ¤3µ¥ »ßˆÚ)’a7,AÔMƒÐëúúݸ…áYÛÓ#Y¤º~DQ7¾±é~󸸧:~Ä=Ý sÜëº÷üNĽn¾½n>ˆ=³EÖMÓXy]÷”× ‹ê¦i¬‚Nõ»Útý5[ÒÅD]?¨K ²nÞý-iêo 3õ#@¶Å½@wãvó†•m1wÃùÝxÄ[«®Ý¸[Þ¬¬›¦q§ìkWGwež´«]Ý‘yü§mÛõCuòŸîuë5+ëä?+ëÔMæ‰@¶Å_ÝÉãVæË4Õv€¿EæwÝ3úYà d|ªíG–+Û¿S—è^Щ­,îš ·|˰Sg[™é¦}¸%‘é†9ÚòÍ£°›.Ñ–4ˆ:ùÞɺ~Äréd]»ñ–<wêl+ë´Ú뙎9¯tüµ²-æ¢N˜½^7nVÖIS¯[kfÆAÖ©¯4œÙ–°èN}ee[âk¶øa¶„Ùï–Ï尿tê:+ëÔCVÖÍCÞ–üìuëNíÑöV¦zAçûª^؉¯•uÒYyþ‹•uÚZ­T·NTª›¦Ju˪RÝ<©t·.±²NšZY7,~7]TØëúvÓ^…¦ß°[çØNá6Y7ÌQ÷»©-eÐVlpÃ䮹PŽÁœLö¹Üpz‹Q'ïºa·ÌãVÒýnQOÖ±NÖµyÝ|uÚ'“í “Éñ‡›ý+ÓÝxD¦›ï#ÓMÓ¨3^­dÝøúrŽÂÊÝÉCî£weݼa#×õ#ê–™hË7²Í~7­â°ã^Üó:ß#îuóFìuã{²aeJwÒ Þò=bÝ-qgîËMÓÈþš“É6ÏÊü^7¹/'ÛâG û>•¬“¦qgœç¦Pä8JÙ‘}§ÅÆë´=±mãE:WÃîž”éPŽó´ö{2µ-Ñ2O[:de\X|7ÛÌK™ý¾º+“ã(+S²ž´2#ëb' ‚-²-vÛ9ä§ ìZ/Ë‘'3q¥)ï÷ìøBwdΈï2ÍÙs2ÓY™/5'“°’m±+?ª“ÉA¾“É`e,´N&+ÑJÖ-oLVHN&'¼*ÙåGu²-ñètŒœLV N¶%9èõݲn7¾¡ìxT²-veƒèd[òF§ãæd²©d[ìnIƒP6ö•¬û=Â-iõºîEr`Sɶؕ>'“ÚJÖýF‘¬¨,ØbWNV²n˜ã-aŽ·|xK>íL(U²nÜâ-å7îÖAOv´œLv<*Y'nvì´E&’JÖ sЙÈr2¹¨ådÝüt*Y7,žœlt²nt:Z•¬fO6j•¬ó}ON6V²Î÷°UØ–ðuó} äĉ“ɵ“uó‹­þºiªºõ} ecåd²óådªëžÞ’.´™dÝ:"Ðr±´’m ‹\Pt29@«d]÷Ì–0›-ùÀlI¿Î$»“ÉN½“mùæ[ÚÕÀȉ +ó»mmzºiàˉh+ëLT:Ù–t¶¤_(®•¬›J'“¯J¶Ån·ý¶´ Á–úÞö+»iß™4p²-ñè ä*Ù?ä Íɶ|·Î¾“m s¼%]:ENtÓ*ÞRÄÝüö䤕“ÉA[%Ûb×ßb·Û ;ŸVæuÛP+ë¤KèÉΰ“uû„¶«Òõ×ëöYÃN‡ÛÊÔ–4èL~T²® 'ëæ+Ûb·Û¾…ªÛ¾…jKšªnùµÅ¨ë^g¢·’uýè +Y×_Ý­ÃÂÎÀËɶ¤½–ONÖ­³­l›¹-ñÝ’¯L·ü†¦Ûþ†[êçÐtÛ™Ðl‰›é–·pKnG…[Æ=¡¿å»ùÝú*ôå@ÓÉä$±“ÉIv'ëöõBË÷ð»}$+ëÚ ¶„9ØRf‚nߢ;ÑVɶøÑÍk¶‹.ýUa§x/ëÎÀ­¿D]™ì¯ÙžŠ–ý«ÀzÒqÏÉâ®L¶—N&'²œLæ]+‹å¤‹“ÉrncæË1Id[s¾(°Õ¤’2È~qdc&Çnþ¬í \q2·4×cßó¸ÀvyB¨÷=[ÑAÀw›W‚6ý;¯=!PàɾJ€GB*Aľв¹ƒåc+ðtO‚ Œçq/¼õŸG.è)nET¯¶ðh?ÒHÅÜŠ° GEº§µDBà÷„ Ï7xuR „·^,L(O ø§Œ4[l>˜ž‡1"¤¼ ³߈€ù¾pÃ|)V%‚Λ_'ˆ:‘ÈA¬¤@X =QÄ\$‘A ‚ËTy!Œ o;œ@i!yL–¹È(Ï‚@š!ùÃV¦RŠ€iñ¡ŒŽ…Àx"r2ã _|^F†7YN ²” D>5V‚@ZÙÁ„ÒÛÐ… c%‚¨'Üàý'DE‘HÓXÔ&•íäpoýžøú¾¬a܈O"!P=0_ófÍ x%ÙªßOš0Ò„ôÖ—nø"ø²ºð}ñm}?”&DAö—@…R ‚.k?½ʆ¾X()&"™b‘ŒmJ+"Ãø1ïnDvü ¨ ƒž(êçI¨èÙœ^$­Dˆpx1O±@‰†/P¢­ d¦ t Mˆ¦Q Àˆ2Ì mk1V±9+êVÀ;hVja…}'ˆ…‰ÈÞÆ¬ÑÒ¶i`#S·w‘å1'ˆ;îmÌcëö:²’í¬ñ¬±hi%¾ð"f|Œä2.¡HSÛQÒR t4 ¤ q‰b!ˆÙ°ÊvXzü3XëÒV#±x=á†ç 7´/Lø½H<0¯Çú·6‚(⎚˜çdS€÷P´e=!`›a}KmFaÂæ0w.ŒEÎúÊê1+YÆ "áF„W÷Te¤€uY¬@óôˆ"ÃË\ñ¾¥ðzÝ ÂX8yÂJd„£|å2¤±áé÷DôcÞD;%’0æ½q+0"Õ 5ÀVòÊÀ )ˆ…[‹<Å=áhÜ‹xÀb·Ÿ ”ÈR¶¬… °¸ØrÌ ðdFZá_ßvœ¤•ˆU}Æ]¨ û.NÀ>ãî6 ¤ âã ¼ã¾=áKÀJ¶È€ñál%ð¥@D.ˆ¤£2rA$ÜY1u‚XX‰Xrµ§LÓØoc}¯çõ„@xëñJÚ bžðHáF ÂáñG'¤ Vx¥dzžßÅÓÊ“ᨎ…£&A7Ò„/¾œ‹/§x½nÜ…S<úaÄZuSÍt¢ÀVÓ9{8AܰÈvE]-à»JT!`Ãj'`-²¨H8Ê;ŠV {Â>Uᾑ‚€ øô¡"`x—K-DHް+¾D2 yÓX DHcéhÜVø¤­(iÂoã[“ØN Ü𔈋,n‡¬‘á†Ld›‘¥ àÑW2)Oso•ñc!à&Ö!XlDíàv÷z\À+iß]…¾Øñ¯a³ü•ó‡î² ‘J LðzÝv`¼ÅZd'`½ ;2õY dû‘KÓ „¬R Ü!ÝP "&ˆiÓÖe'Ð1›‚µ] >6³Þŵ‚-F¹-KZ4Ë •@˜0,²•@˜ˆ¤/k<¬ f;Mq{cku­µ°Â;ŸV`¤Ó „ÀH‘0áË€ù†]"úšÏu9ß‚@8²á¾HGC-¡p4ꉀE2 céhìóì`øB£„J"tûµylïó¸˜À+Hiáh,²¥‰E¶4¼!t›êD>õUO <%"¤¾ ä–J¤€ÇÖç+ÂVˆ¸ø¡Èü~,¼ ¼€[ ”Èꘅ@‹ŒðªÐ ba%å6=áF¨¥ £… à‘ "‘A$MÄ=a")Ä1GØ_.äã+Ð"¯‡‘/܈E¥Æ!71O±(ê ±¨rìÀŠ{kQ'ÇZ|ý˜OÑÛºBñÏà³[E+æ_ßï‰:ÈW|dî¶½ðòb!÷VóþªˆºÐ†žpCäußÖtBòeÂQ[~¸ cX†6&¬Ëo|È ø„€°þYè¶ÕøBÀš['ˆD<9°ñŽ´D„úB +Šu`@ ÏÉN`DÀt A(­ˆ$ŒøÊQX­zIpÃôzRàKð…¯?8«>Ãj¥ˆ |-ÜàÍI% ô!ð„£¼ºƒ­ÂJ(¿m¨{R âvõEF2ú‘Ìq(âGÜJÜq‰{ª'Æ_º +žV¼0þbðŠ ‡1„/¾Kô´ˆ"=b¾jl¡VRJp4ß%Ž=}>ªv‚@Åœ€Õün-k,¬€÷ð+þ¡¬€ÇV÷”¾ð«Û£Çš+ˆxä´ÇÇ"NÀs¡ö Ïün§B,<[º >6n¸¡GÓatÇQÎãT ›TlhY¾fº¼©áÖCÇ6Ó›€1Í+×LâÕL{ó+¶ýÚcš®XQϯbM”k¦Õ”ŠƒÀ÷&žÊJO0]>¸Äk-ÐË=ô[×Û|¸ yûî€U‘™£ Ü…¸<ÊáÓ[`6XBЦu½½Fó>«EÞ¶±Àt4‚Að‚6àEF¯'Õ¤iF†hŒ¯.“…aš¢±)›.(‰‹œ”KRn.¼d•pÏ£µ\`Š%ÓÑž')ŽèÚÌÞþ*á…¸_å° 4%R™-áÑr´` 4‚A `‹ÓV}8#˜Ž@g:f À›é­ÑXûÕ­Ÿsº{³„ÒcÕ=¦£R°Oy˪St|,¨Â°jö ZYøà4¼‚F¯Á9uÞôáu¹Ò~õŒÌA®)KxªÊÁ&r—jJ™¦aš†kúL^⪛ EŒb œB-zFº"ÍÈ0òŒ˜çŠy®˜çÔj9`*9 æz,Üš…T³¶ÃÙ*tû&ÌÕ=o“[.7%˜‡2ì›B|) îgÊõÓ‚Ç…¥PÛµ©‰}Vxè®¤Çæ+-ÃË0 K,Ã˰i؇4ìCLÂÉsªÉ|æ»Ïüó™>óÏgþù,ã0k‹lÀõ˜5æ~ÈR,dŽ„,Ì!K1x—È‹yÄb  ‘2¬"༲M ˜é ‘fõ{9Cà¢ä²ÄÖ¢\0€µÑÂd9xEÀÕ¤iFOW}x<®\s7ÖËùš´†uJ›[kP¿‚w¼VàºU÷˜ùkÁô¥àœ5xÙÆÏ©}P ÁC¸n{5UÔUYQopµ"ómÓz!_SbÝ7’§$OMÙºï@´¹˜ŽF è­ÛçE­FfVä刔t‡:=lÕ7É·Ã,¤¬ä@1¢48œ“¼ÿx©&j£W”YoA¼,(ƒ´þ@'í8€šJìq0öSFRÀiÀˆ¹ŒÀý ¨)ÝŽÛ×U§¾– tòÞqDÃ$«†FóB~“±˜²ßq¿$5”ã18›ƒ3tßýñn²?. ‚F0>ÕÎRÔŠ@+‡wëm¼ºTô}Ë9…`|j Ž¡@Ö¤iFTŽ!ÓßBêÝ"ù- é-kY0ô±nM)/ÝZÀ[ë¡ýîW*`#Á[ô„ð=múÜ;ÚB/Íû©òèIÐÇö“ÎáMí+ oV0‡²’nïopãîý bOoÞP8©–.×D¯vV d}ˆ]0 õ°êvØ7§7¬¬ŽÀø(5šS¸Fc>Xž‘c îx؇¤p´i†lðZõ×熄ÅTL³}<¹ÖÔŒ #ŸQÀ(b3/bæEÊ—Òx¦Æ€#s7eIYXSÖ”….ó1W2æÊ€™0“mÙ½T‹ÕY2‹#¦7aDEÚÒʈ^Fè}×JWÁDC+ÐhœÁÀr!XN£ RgaÞŸ‘|Ö~$+o[Ñ9MY—àék§“ƒÎêb•¯!9æü6– œç‚B€O8ÏñÎWë’háõ=F )ez˜eªÏ í)fO¥L/ƒ0/Ú)›‹ä 5D­!¦éb:+ªU›<ÖÜêŸ%|ÂÞ1q°Ñ¹ì ÏÚ'Ñ7Ü47¬„ ][‘ŸÄ»P3×ÓŒ x`©à6}F£HÏ VqÔã(tGÍÑpô™?Š‘fdq{#öˆQ ©Š.–ª†…ݘ·çƒ‹Ž`e´À0…XŠ,)Flµãc«f¤oP×SŒ4#è]ˆ¨hJýöÊG`„¡Ö¯€FËV‚™д³>·kÿS‚µàöº„ C%_9™²P9)FøÖàѪ¦TG—¸Tà´s;0cBˆ!Äè@C` "e6[Q`aU_fK€êÌ [À¬XbÆ(gPQ–+ÐXÁç*o©íذԇǶy…™’Æä@KE£ï ˜ŽF0àôkóµbÎ54Ö4ˆ¾RïT¬ A#@ Ö%DüP‘úf;†Ÿ÷H¹ÁÜ3§N’@¥âˆÜI¡"J™œj«†n¾#ň›4Œüÿ[²Ý¸’­Ý‚#{l/vDü÷Et‡h6 €Õ 8ÉIïßFŽìäû7r¤(aÍ: —¯I«–Õ%Ìàc€Ìß “Ýõú4/ï&yÚ 7Îd)Y_P‚ˆ ô¼b‡k"'„Ê9yk¨72MÇnP²”lV½É²‡ GÈ›3äqÖ£±Á@ƒõÈ €¼m¶[“w°´›Ÿ¡û1Lðò´ÛýŠ€/&#;[ÉKg8°UÇ,o>ùçƒdºÖØš]’#är ¹‚¼†2˜›62üm®§ËJHͬª6ÝÑëQ½›±@ºÙì?åãë¬\ÛX$ÛÝq¶ŸdËìv¿Y, [h’än®}±Ÿ1ûn‘-Ò·½ÀNy0/mõä¼Å¯Öhm¡ñv³³±Á¶¹žé°m¬ؼð_Y~&ˆ‰åQ†<¼B$„’PÖGíµsŽà ÔÀQG 5pÔÀQO ü ©hƒý$KÚ¢ýݶ%ä 2BÙ¡÷KðQÔ¾MpùÀÿ¼ãíL‚­ûlwo&ïQ€öÐc?ï]%y‡qn&¤øžm¿«6Êßá[ä l‰n™á§Á&1PQ¶'lñªæy{AX×›¼ærkSÈ 5çÛùÕdÐÏ#”&C‹Ž2üæXi;°öÍ«£ß²|ÄRÄv4ßF¬ê?¨C5öõ—h<Ñ—DYúý«Z¢W ŠQ±P,+A§z¸9'>¸^ðG©þùÁ˜ <~i5‰Ó˜8É\ãÞ±–ôBA( i ”êk©¾VB¨ÿ7¿!Ô„†Ðΰ۠´íX8˜úN4 „¨|9ÏK»é÷ýÖÝذíæe»ïY–Fow¡ì ïMîm´·0ÚËð,¤fŽ4g݃jzé  }(N4* a=§ÖÞ¨öër÷Ä'·28‚ePÛe¨jè,Ò(Z}Ù7ùÏ‚«ù»Ù‰qÛøƒíLì;'Œ‰ÝÊž;8¿=¦l'3—ö¼ç;WV=3GA»T$Ûöù…^r°{w³u_–TƯ}IåC¬žŸ…튣ÌWºf.Nél›){O¶~¹?ÛtaŒÆ‚óžÓâ=§Å{›9?²üGŸúMm{ëéÙCM®Wa¿±²”dÌ139!k3͈>dBaîØ¼Blt%ùØÑîÛ‹¹g¯}ÜöŽ€¤³Eäã.ìm´sÄL÷x¢_g,ßí½î$c‘ïx¹bi¢Ž¦ãs ÛZ5°ç´¿M€FùØ]™3ýêIÉ‘P’':ì…Íí;a¿Y-xa^/Ìk5 ÿã“ÕÛÌvòîµè^ m„j:´»üßq-8WÏw\)ÚÞÑ„aÖyþá“ ¯?Ä¥“E2†Nè½bPÔpWîªR”Õ†²ÐN»p’Á…s›KÒª¤vYEP5‚F?jÀÚCÚCÚCÙ­Î﨩U¨jÄ…Eé7íZïwT%I¹H ÞÚ#Ùý­ï(U@»«¢Ô`µC*´C*Ê…[})ƒ£bÙÙÕ¢_ÕIB{GU¥*Õ³jé»NÃÒëÍ‚ë7êÁº]-Xú¸]ðNRVs_û§bQ»µ*µ–:O(WR3JiuDQujE™œ”\ñ¥®ÀdV õ«P¿¤h”óm¯*íS«×ÕVQÒµ”6¦’†¹’Ž ’”‘<¯¥k­í§®½y›8N%a½ZåüƒD@—ؼ-±½[÷K÷þia#,m„e…¢ê¯Íòz%Eq­ ñZgOk=­uº„{¬¸‘çîU5~aYõÖ)ÏZ§lXîÆå>lÐ}Ø|û¶¢jV©f•”O§z®Uϵê¹V-ÖªÅZµXkr­U©µ*µ5t -è~l°û1ÞÑ+ŨX(–Š•¢$•W-Vªãjaª:®TÇ'Ø õtÎôýª½RµWªöJÕVŸœªíTm·°¬j;MZm‡¼SêèTG§:j8^t Û 1ªrP•ƒªTÇà>K)\¤.à"Óò<¦æ-†w E½Zþ°BõñªOЈKßBP¯ä QB]ÈO¬)4¨¨Ai´O Ú§íD‚v"A;‘ HÐN$h'´×Úkí5‚öºítÛ?èÆ~ÀÍêtOŸ~PÍ´# Ú‘íH‚v$A{Ž cßÔÐ.þ}àR±j©X¥ŠiÇ´ã•*V-ÂÖ$Ó®"hW´«kUC;ƒ AX/Ú(ÖŠ\oIåV(â8黹WŒŠ•ºÖE¾é·ü'QÒ2£Êì4Ñ>j'µ‰ÚkD™1†¸Rݵ‹ˆÚhFí"¢Ìn9ù rþ$¿º°Y°FI{”¨Ístš\.,< Ï4RÚ@Gí'¢vÐQ›ï¨}Lôš˜>J¾z›ó<Ò@mËRaÐAt¡án¡á~á¶P,+EIB»‡B»‡B»‡"¨VAµ ª•öEP­´‰Âã FHO?¨*Ú¹èZ]еº ku¡X$½v=…v=¶t÷ý²Z”YÊž®Ö]­ º<ty.ØòÜÃëB$VÅ´o*´o*´oÒ廄š\ÚÚéZ_е¾ k}¡Í§„‹Æ°(׋ŒÔIŽîÿ]ú …vLºt%0?1¢¨Šj?Uh?¥‹rAå‚.Ê…Bû©Bg8…Îp áÚ©Ú©Ú©•:Ã)u†Sj/Uj/Uê¦Ô9L©s˜òYÃÕ§Ô§ÔYK©ý®X†RûŸRûŸRûŸRûŸRûŸR‡ô¥v!¥v!¥ŽðKá—:))µ)uÀ_ꤤÔî¥Ôî¥Ôî¥Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ô C©†RÛôRÛôRÛôRÛôRÛôRÛôRÛôR§eT­´ /µ /uvQj‹^j‹^êd£ÔÉF© z© z© z© zYʲ,«?ùUTõ²Œj½Xº/–îUY”ºrUj£^j£^j£^j£^j£^j£^j£^j£^j£^j£^j£^j£^j£^j£^j£^j£^j£^j£^j£^j£^i£^i£^é²U¥m|%Ç;ƒld„JÍ¢è[Éô„2’—“ÉA×2¤]ËèWÚ\îA¢ÛZt›ÓòA*´Ê‹…戅æöÊõ¾v'ºu 8F©ŽòÕ`ŒÒ%GsÈd-‘Ô™º%zV\)r’”P'IÓ™{$,¥•Š¢W!íR!Q/$ê…ø"“¾h«a߈ë \«õ KÅEPª¿ŒJuý+â Ü:-Gé‡za¡Yºhœúè5"kˆv˺H ù'Ê<9ê’YB§èƒbT,+ Vz¢Rò_>£‰¥ýRJƒ Šr„-ʶ(s½(³»(ß™FÍg™±E™±E™±E™±ECË-®%òT”Ì)d°]<ë~ÅóJÈ y¡ …*! _V2*ä`U±’ðä›ÀB¾u-ä[Âb%¡; Ok2´*dhUÈЪóð…Œ• §áIlå,|!gá cÙþÒƒ$~òå~!§æ 95_ÈHM·’Š ­%¬Å®àvƒÚíd*k»JÉñ¶cô Ioéœ éœ éœlwèAžÄ¿Ð¥ÐSÛE!ßF$”øJïa{D’ðK ±”¥Õ)䳿Rv-K™”²SHj¬¶¥Ô§RjB)·+”’n¥¤[)éVJºÙâëƒÄOI™R._)¥Ïµ•Õ‰$Õ*iu*iÇ+iÇ+IÑJR´’V½’Ö¹’õ´JZçJºÝj-넵 SS©QkÉSýFÆVZ&’6j-m”ùE¯ÿŽâ+®L$Ax¥ … ¡R¨bÂÙ àïé¬6³[°_°è$ÓʵL+í¼ðÍ‚ úÍ‹âøè´K™\N?¸åT1ÿðáÅÏ–+.ò/͂ۅ‹ö“‹í"ÐÝR-™£å–>Ø ÒÇ]è`—X|Ÿ¯É#® ?ÎoÃ%ƒ.ò~9b‡$Ã|“Ü×óËü¢@’O+ÈÎÜŸp‘Þ‹]k÷c¹&?ýw¼»ðÏf°Â ìHk¨‡Ë·_ìežÓf¾hïëù„›¸OÛÆd¼&”dDú4çF’p=Ou“<Ûÿže¼ ‘ø¥”ÛIO/öì®täņ§¼žï|Ͳ]zâ?¬2NÔ©éŠ=ÁÎJf J?Ø“D'»øýtéMîf+³¸-Ï2Ø5§§{c÷&ž7ÈÖ´ž7Í¡µ3}9Ÿá|^ûH?Û÷îç-Š÷yϨg¼oœALÁ! BIXCúì¨ú„ø2SM‹TÁQGU˜°Y¹„L;vCð™õôÌzzpœù<8gåN.|ÁêÒR¶Ì¿à ¸ jõÅîňç+o ¾Ö¸X;A=;¹Öž¶¢ 8 ;³ÔÌ÷nf@Ià~Vþj£¸ëžOT\÷|¢âŠKyS ûÁ<° ǯFòÂH"G®=ž¸Ú£Ò?&ª~µWŸ'°IùµßÜÁ:á‡G¿ã«‹õ¹0<…’Àn€ž“6%ÆÐánæLNÞ½a)*ýõFOn­³Ö½C %ùÓ»kq¹l×þ1ƒíÞ g·Ÿ“·;$åh’? ®l×:wGíFõîô‚Ž©»´féj?ãvØW¿w¨è½›ä¹€l-F×áÁ¤­Rª§‚öç¹{Ô=ƒ]ò;‘µÜ’ïtfp«X½E¸ßXí7ˆ}¿±¡K1^Z?÷ÛÕÊÚ ~kõµßñIª‰pmn¿ïúVh+´²¡L·•¢SôŠ–kýq8[!ìíY§¾+<€ w',ÊdR3'ä…‚P*„J¡JhMÅ$8'Š9QÌ©ÍÅ~>H·É¿ˆªNÔÁ+‰$†^ð¤W›€—´ð’^÷’^ÒB¼ ¢JØáŽô‰: >ˆ¢A}â2vÅ ŠQ<ˆâ¸ 1Q]£è%„(ºEÑ-F&¤ÄRb)±ƒ”ÑAÊè etÀÑÇL¸PmÂZ±nƒ„(Åtpjæ…D7'º9ÑM ìà˜ôƒ”ÑÁ£iÊÔIˆ^I—2;Ø[t™˜ƒ˜”ÌösC—d¦Ïà0ÌíÇ«uûýÞfÍ ‰ÁÎuü5Á³òBA(ÒKGWó èdi4Ÿ ЖK¡Ì ›Ëˆ‹è'tŠÁÿ÷ŸÆóv·[¸ùˆË—ó`%pØã‘‹áà {ÈòG„þÎòÓ°éø„Øp°ž@ß2á5¦üÉ¿#O|#gÀ¤q˜­KÚó½œáÜY aÝúÐ#kúzEpëð†!Â=FÛIF‹—ÉàD=!õÆ ,]éÛ£Éá†0oåæ*#F#þWmƒ-ää=äãÊÿqõ}:A>C¾™<¯k~9ãq¤À¸Að.Ĉw!Æ BÅlilð€YÀCCæ'¦’-b·íí€MT¬ "tÂTrÄÛxãî<0w(yãÞòz*f*­HãëyìŒÏØ_z{ËþÇ?/,¸û‡Ç .l«+c½Œa3 êލP¯LW¼XžASë ¯7ŽhŸÆ·’öŠq’Á"¡ ”ðŒî±À•€Á8'±†A¹„%ôK¯”Ï––I¦Io=éëPÁ`°Ö^{äõËùÕZ‹×ñ~˜³IøÛ‹‰Ö¥Ý̤ø }ï ÍÕ ©Þð‚Ý­ßDBI°ºwß´ç9lš=‘M³ï6P¹×5£»×˜ußù8ë½¶å’©™‡³yYx2:ØZàÝ’þÞàÎ Þý|<âœÁìþÎ\¿7øsÁÚܽÁ+H÷¶BRmÑÖÞ·×7ó!åÔ}![¼£O»°xœ@L#t çîÎÝ´_£²†AÙFêwf0—àI³Lð #¾;6(îØ ¸£—ºŸ RУò–°vtŸ_WüžeiÒ;‚' O ›îÀݯŒò•÷ågªiñ#?&%†ôC%.+q¹&lb­!´„-aGØÏp<É4‘(F[í¾_‘e×’NJ:YÓdœ½26 cƒæî~E¶\Œk8ÊÛu„Á:ùC'à¤CæwW4"=Í÷ÏæÞÙlŒx‡üþ£?xüìšàúÿcŠÿë°;›a>N`kît´:O¸.ÅÆÞ{YÜØ”y‚! €£Gkž&^L*@ µH˜™|M0/¶$ù´±sËœ£ÿÁæÿþ`<Ûš¼³œH2’€i¼±4N¶æêþ•eG˜Ws3мǾÍÏ/ÿ•e›'$î(·…¼ƒl/9&ùÅBÙŸ^݇­pg9ý0˜Í#ý¶R~Ùœæ¾òÇlZ/›s7\æÚùm‚yröWFk 'rBÈ™Ky0[\CŸÈ y¡ … óNžïYÖÔéj‹L·íN-Œöð°‘ݰ!Ôæfžþ+Ë'ÀÅbÛgÙc dÉ`@ 1ð‘Õw´±CDz„W#G¥­sÊp‚­µÉoH®7TÈ·\Ù‚#ìZv×¶Ñr©·sÿ˜edw&G²å‘‹ ?$yóül·Š}¹ÔsK~©»<ìð`ôDj„¢Ð|Ð9“›—s&CÛ]Ïä bRJ‚%oÝ#’6ã¾4›¹,f°^0ƒåm3˜òW’±:‘‡#ç ɆåÀˆ %†âÉ^Ó#w{4óÒl0ØÁýÎ9ØB„æ$Lò |zAà/xŠúA'1ŒbOÀc7/­|¹4V䛢p¶9Å¥¹nVGð„@ˆ„‚PzD#SûÚ#QPHùÝ›ûÞŸæu©Ÿ /©–àúöôËk·±–ç’lK™—¶™»½´[³ÕnQYÛ½ ú yžö ´³_.sùH>^¬l/Á´–Ée@ÛïWGðË€ïÜfpO°6 }ÝÙ±Ê=+.L¢ŸœšY£9ÑIíF¡B¨ª„Ö¢N­Êï¼â|üë»…ë¨(:jÀµ¦a8#ÊL&N¥¦_$ÝjÉ«ZÒ©V$jI§zMj$¼yìöŸ=½4c»’`UÁA²nuu'ê¢î ê¢î›„÷&á½YIÞÚáËek#’mm-ã¶±Rñ 'äIØ´½ºË¶mW‹e†>"òs‚§sÛ‰Kë·»ää³9ØÏÍà p 2™OŽ`‘í l½`$•`[2]Èr¹„\AFtOÖnOT>/ÛóÎä ä+rÚÆU[¦†-›OO_ÍWþŽh¾ZCº}í­÷Ì`_N脼P Ã+f?:Å…åBp¯n÷êvÕoóÊÿCíî¥ß­lì8®Úml+5½fŸíD&Od'Y'öBVfv[K®$£7ͤf§Ýü{–kÈP÷(nfðR¯䥞=~P-Ô Í¶ODÍþ±ú(ˆ‰ÖånwƒJvÌ<ÜÓ;<š—‡¿\ööó£ŠývgV¬®ìç-¶oYæ´}º[ÈûÞÆ?‡-Ƈí?;ê=%æáÔ£„dR3/d%â€!õË;_.›4‡mÛ±Á"‚=pŸeó÷¸óH㣠»-ÒÇ â™ÀZ†ãÅÚã£ÿK2ÆÅ `ÇY]&5óBžÌÕ÷ÃŲëÇ;Ïk™ó6¥8õ"Ö7dÙÂÙ/+!5óB–Q/˜$ùk8[yyi)["¾ìçCE——c-ŒZ–¾tôÂNÏ\^æÌè ·C$²»P¤f^(E¡B¨y ÁK…˜ 3k—N˜Kœì¨ÊŽ` '7¡oì>Hfóö@­h£úM€!O†g!5sB^ˆþcÜ”€jtbMÔ(%¡"¬¶Ÿx9[y®mºw¶ýÄËykõ*ÉOéƒ!e: #är ¹‚¼6ýŽsjñÜÿƒœ¥ë¹ß  <÷/Ö·Ÿmòåbß\lY Éèd¯õÕºßkc>xB°v;!%Kí|É[wM¿Ÿ0t½ž°†µƒºÉ+ ®¶#—är ¹‚¼†§ ôÃéz¾ 8¾\Í £êV[~L ëÎ× šWT¥k ´îl”͵è$Û Ö¥¿bU:y5̹o Æþh‹kWœWz'ºœÄÔ !íG¤Åøú1¿IÙûf¿¿¡kMmoȈRø†nÖš\oôévµnçzë·˜ÈuuÌ…Ž½S·Aru¶üû5Õ’yQý¯$þ¶³HYdpn ˤà;‹K×ÒÚGÖ3uVá»ÝÎLv;›ÕÃÜ*ÿ{‚§¼Ó³²öññÛ .@LP®:Ì ’l_&\0xèNW »3Rk¼mt^:´@66ºÅÆF×Õm©µÃJbǼ葯=†˜]OÕmPÚ ˜ŽgÐ౞ØïwvÂhë º7Áw¿M¼›õû|3ƒ#DBa¾þ²ócI¶ ûg4Ùý36ûªEšg@8‘Ö"­Ù…b]úMkÇS/=£°éi`§¯©47úm|ßlÎæýc¿ýð÷{–¥ØõØß´UãïY~:ÚtîÆõ{þ [îTóH5UÞÆŸ½õÛ=âAo’mÐ_m*Ë û®‡ ¢€ÚÖßhë†uËßÁ×–=z˜¥híˆÖe°ÖuØìˆJ"(Ì©êpÞÀ͹±ÏÅ&²ÒŸÉÎÙ_†©=¼" ¯Öa'yGÙTLò v‰XÄ$“ƒ£`2R»Ej·v~5Éfß>AúzÝÛRYž¶ë~wEÂe2mŸ$›ôÈ“½]fpÝ[Šî­hçÕËïYæ€üŠA÷õd­o’MÉÓÎV”28‚'Ìý`; ;‘ÝÁõÀZì›ã~Ep(kóä«u_®óÍ2IÜ›8/]/Ûæu\):E 庵gÛ)ß³,ÉØÙ’$ŸlßæÚ5ó× 6ö¿v–ÆÉQšlü&ç›läh8ü¶mX˜ä9ZH6=ËðB8ÎˆÑØ@ž—Ù®ýÊnÂ} BQ¨š7\&²Ýç í¾ŒÐ^ÂßKø{ ÞÔyP%´&$„ƒ„pÂAbøøò¸ûGl¾ˆÍ ¯³_B½ØÄl³7IÐ7; ™ñ·8¼ ý!­6B’ô«ƒH¤†JAˆ%Š¹Ö 1 ½(c‹&›MŠB•Ëo%„”I/%Æÿäv4ÂÆ3¾áH—Á¶um ¦IChim>¦1AléfK7ËÝ\P²ÑžŽŽQûz÷Ux¡µ“€'Ð}‚”¡œéÁE€ü¢É kŽ¥ÉmXzÝE0Y´þ!ÃsG›.Òf QÐÄ^I{kñp+jí•DÉ¡NlŽÔÄNõåÀkªU{RÞ±¹†ÖX⬆fØÑÍŽÖöt³g zp ›è$n¾™¥_ã\ñmðÌœÚwÎôáLÎ,0gzw.RGæV&R3qÆøŽ®ZÓ"“bôJAˆ ŒÊ(&̪5Ó½1ßÞ¨íošüf’ý¦×wZûðG@Œü& áú¤€ ¬—¡Fª‡f¥ä„¼PB2…F,±Ä"ýP‚g¡-:ãÒŠ(a‹ö,ìVž ·“¨ì$áv«’äVB ó«@wT‘C¢^(E!ææ “ã…a±ó gº¹0—/¾£ãq¡ßM~1îì}+¸Ñä†Pãj£„JR-6k±YG¡‚ÄâW[%ñs'f;1Û‹Ù^ÌŽbv³“˜…~ B£ÐI:óè8ñˆNRÉI*9I'éâ$%ÜVÜmÅݶ"Ä—£’øÉ)Bt/bóElJš9I3wQwÑú"éÒ‹;Î b±QòBAˆ~µ¸«Q1"ò(e|Ó½ }JĆ=n$²XnË$ÚHáÙ¼’j6æ‰Ð„D)-µ£Ò,ENJcËö*¶l¯B,+[/"‡OQJÑA|Ä%™Mjäˆ=r9./bÂ8¾0ÿØ‚FŽ¥¢Ç3{«DtÅ!S—œ•œUlk«šcýª #6­UªTa±¯¯˜$W**WQ¹jÔ®8#«ØÔØ«aŽ4áâ@ŹZÅv§zÊ¢U½ ¦kÖßõ‘[3r뽘 ¡Y³\³Þ¬YÒ׿`²¡›ÍQLÐl®öY6ntþŠ ¿âú毸½9Ëra2hû3ú©sËñÁÙî]xÐ|æj7?^»ë-ËÖç&°ã«¿#oõyü´ÀÍbF'ä…¢P!T UB–qC3'›MÔ°ßZ}Ì€töø´`"géb»Iù7» vÈ!ÉvÇ^’óteÆ™gŸó~¹b¡}¼n Ïß %y #¯€#xxÖC,l+#Žgd€O¯-M°à“ ,gØí›Õ¤RÌìò£+î:»ÚIÄïYæ!Ïë·ßpSa˜ì‘•Ö¶~Üö„f·ËÛ}7¡Û\Ì’“{À7Û­»Ù…x³ï&pO„løÏOãæ¶²Ëg&s¥› £Q °þy‚g!5sB^ˆÊ݇»˜„¹™ïÂÁ&a.â j؉ªnãæöÿÛ6[ï6öÝõ_Ý¥}{ÐG©øñŽó&æüÃG ß?Ø|db/Äóùó‚‡a$]D;ˆ˜4næ»ÈLÀO²§h×jLgž6Ñad\˜ZyÙ´ÇÁÄZ ÌÝV·±]ÔÎ<¥Øns°v F&væÓZí·È…5Ï?yBkiOζ¢™ Gl.ˆÍ\d¾g™ÍuâGðä É@77$œ}ÍÓmº6"¡4'êH7CI¹Ø]O¡Zhg-âëÊDkd"hþ«÷„@ˆ„‚P*ÂÚêŸìænÃLêQ´Jߢn%¨IÅFHÍ>âçƒx"ý‚dê™Õý ò G`\›àƒ)ÉOþ&R3'„¢PÁ¨:ÉMÏnßüe¨Ì‚ÎÆÔn‹Ê0¢0÷oBM@âÙQï”,ó§É`dk7nÁ…ñD7'ºùƒ`~÷&ßðû µï†²5<²Œ&ì†l¿U‘t7k$¿tõËl©¶[–ºÚæT XhêeÙC¶2Q#¸ÿ±¯oºÆ¾°H2²¬©[° '†w2Mà –tÍ|­Ý÷,K}j+Mk«‚|TˆoÍwƒ¿ã]ì:¡(T UBk’Ý3˜©$T„µ¥I‚';Í8ÿàé­]ìó gÅ…©STŸ$š5 B’v:i"I$ˆ]ä3Q£Ê5~-†µÆ«^-L¢W ŠQ±P,çG‹h'&V•%ÉjI²Z’¬–$«%ÉjI²Z’lo'éÞñyÁKs§ÎèƒbT,KÅJQÕÖÌÜתF­jÔªF­jԪƜv×U'Æzݨ×ö|Bt˜Í¶µU™‰>’ŸÒ– —ïuÍ~{†Ñ~'àž Öe6G6˜¸ä²Ã r]ƒ¡qsºšLUpoj†V \Т^62KjpqE¶ÙA!ßàâvrB^•äzj¶–Ì™¸töøjv”áM‡ ë®^ }‚ !"¡ ”„µ©0¢a¸ÛÇÌßt‚áȲuÇ‹™L¥vƒ~}þJ'ýŽt&x² ÓiïèÐѪ}¿Ÿ)"Á*\»[5£OÚ†Þ¬êZ|"ÖµÛÕó†d÷Fgr1© H™­£5/@7&ALè[h-æ óm¤…ý+è_Ñö„ ¤o%}«hRÑd¾¢:•ý¾ßm5¡!´– ù2!¡Z¹Ìå% RY˜W”²l³Ìöˆ5¨Ödèh‘PÀÑ ÖwÚãÉš ­c‹Ö±ÅÂAûb­F{²Ûƒ䄼º‹B¨h*[ fÛŽÊuȶ€É«!»v`q"òqhm@LoˆÏ­ÅX+“=â“ð2~¿Ûô¾ýƒ³S™Á¡$T„5àmÖ.úüûƒ¥#È¿¡³nÿàÁä‰L…-îýN€¥”­Íóà›Ê –¿[ÜOû5‘Íñ¶èÙ·û¹Nóå÷,ËPa{: 8‚•Ìí܇g£íÙŠøöbù¶ílk‹Œ­í¼$`ack_³w[ôõÛqõüLÂ4(“ô-–›’ G·úºLµÐžÎÁ¡ ¬¡Ý»ˆö ¥á6_ž› èà#f_péqm[²ÛÙWÿÝ®µ#!"Áš±Ý‹Ý,ú 'ä…,ãv/'ÈgÈ–¡» |¾¬0fÚ]({È»6;ȲEe‹38B ÐMG7Ý`¢¿çÒÁžK ÄZ Øj´}!›DŒ¦ö¶X;ߨ÷W·ßÛX,Åô=Èþô‘õß’|·u¶wtŠ^iˆveÞ&É'š æüže˜'¶{ »½E÷©m€†™Nf¯7{ý#³Lˆ2ß4Mû:E¯hQ>lnsÐ!Ø,:ɶߟdþnépØÞætH²,ùÐ*ìŠô ÄÄøéåt°gt“'×›Û!rÖ0=‹Õ¨€B:¿“õW–1MKd÷o=ÈÚîã*BþÈÔ/ŠéŽášf2Mmf¯3 ¾Oèhî809â*¬ ž`5âXc×÷Øp¿ìÈ \Ø™d›\·®+!K=.níu$×È;È{ÈÈ/‘äû3ä ä+äò/È=äòùòäßoïÿX pà|"'dMíñÅKÆ¿øÆmkŽùô‚o'ÚÕB­Ðžžâ¶ŠŒ½’’û … ±»¿ÍïDuÇ“½“šå«Må²l +Ž4e£l»5›à²D/ttºw0ÂNÊq¾ôèK‡ŠìPß±Vl€ñeµQ¬?, ó?1–ÁŽöz]„Ð{ó£ÚI¥êQ dûÐc)ñ8²¡;ŽÝ¼|øóA2NÉ¿ ‰01Íx^ SD©{ <¸‰-ƒ#ÀÑo\ð<‘R›6rùÇ>ðO²•§D=É'%'äI(m/-í9ñÞ%jõÛÌȲàÛÈú—c´îåÅ.ÜNr ÙÚÏ—ÓG‘øÒͳŠ"ÞK–.”‘ ˜Š¿àNÇÁ ãï²u<§ ªÂiãöØø˜p®V\«õ¨X(ªe§A¡NNØ*nm>‘Ñ‹aPƒ4œ á 'h8Q¨*Ižæ'ÉrúbôŸáD#G`¦4”j*»„kÀž¾ïOJ*_áÁ«uº§ÁpŠxâñÔÐZS‹‰' B }Ã…WhmKk{†s É&L© Å©¹¡IɤfÔ‡N-e¤§]œä9B¶yÄiÛ@¶s'{7â[î:O¸0õŠA1*Š¥âG ûñކ\/PiÕt·@µ¼WÓýÂTã4ŸŒüþ޵k÷ǽÆñ 4àƒüZžûÀïïØ©±úuV¿.ê×uêÖ®³ëpœë´Ç¹¯˜ÍeBéÝ÷/£9;bÑìtÄ¢Ù‰(OG¬ %@©Å@,ɘ¢ž°XsÂrÿ çO/ði~¯û‹hK¡]Ù\Ù²\Y«Ð‘0Õ:Ùú}2 z8¾qŒ‘39!µ„;‹ÞÞæ‹J“µwÛ2ÁûÛe³R3/Hµ¸«Å]-î$ô ¶³{^ùrÞðÔç¹±9u’Ñsd²œ>om‹õ¼í0^;ϵþg–ŸêTb-λ ƒg›"ž1…8c qF&'™`/lf°ÑÕÙÓÁè$f˜LeòBAÈ ƒ½Êý5­­¿¤Q»¼´-1.'+0ɉ=Pü}[ëü`·`«¹—3Ö”8‚X³¡KœÌÔµ$”„L–A¸Ô¾»ØÔþb×%'¹1+ˆ~wBÈ䄼PŠB…P)dÇø.mó\¸ÞtéK¼kƒð+nnài¿9]ì›ô›ŒkkÛyIÆäÚÞN0ºaÎqÝaÇæº{ż/“%úu^hù–äÓ+¦ ×y=ã_nJ›Ì†³AK[hz¯'Œ€®6¢ù–ስ÷ =|ßÂÙ–néái‡NîjÇ(²Áòò ää3ä ä_–˜§«Á™j¡F¨Ú’œøâÄ'¾8ñÅ©/;¡½ÐAè(ô2ϼ£W âôEè$t&y‰¢—(z‰¢—(z‰¢—(ú=Uó{ ÞKŒ½(:·5‰Î«ù“÷oúÐæçO«ù¤¿¸åÖä>~XZK/ªåóÅTÆÎ 4Ú_X-ç›ýRù>£ñ¹Ú“"9RX0ë¿bÖÅþá÷û]WtR×ΚÄkÇaI¦ù›Ënþö.iÕÛÕš¾LžQ÷q»!Ô„†Ð¶„aO8P&_W˜X\_?J¸ 'äA^lz±é6Qy^F8É’[þŠѧ(ªGkï¿?pÎý☢~1›ý|œáèV®À)ÝnbiÙØá:‘®+ŸíÕÖŽ#»ýG7¿üw–ŸÚu›Mc¦ZÈVRó/ÖÉ~°Íî&vŠÖ…t,IçO<{xÚï5Ì5bcë öeÄ_YÆð³kæcɾ¶êÚÎJ±œTI`YÖíŽïdR3/d}m¢Óð áòpB3ÑÍ+Žß²| ¬ÅVq«¸SÜ#P$åitl![­Oò ;Èôô?ux“3ƒ'B…»ˆOÝ&üðäK‡¯¬º3| jBKØv„=á@ø‡ðB ΄ `‹Œ¾Ú¡ßTŸ±…”©B.w«Gû'´IÆ„XÙ}p½àFÙ/Ìç Þ9,ü ûaáß\ß9.ÜÇ…ûba^Ô½R±RÜ(.Ü6LFœ»˜h¥X(–¢•C»þàµX÷ê·Šê·×(yƒ×8xÍ|ß*nwŠ{Áà$9J!M×µê´fytRV]C}æˆÓq½SÓ¹lþýŽxÉ÷ÝF£Ø zõΫw¾Ö>4ÿÄáú †Q}‹ªzTM¢j·ðØK y©Í¾¡ ÜóÍ„†± ´zF$ô8!ŸÑ ¡í"}‰˜(v]A£B4)ÄÇß’v¸b¤ëFÊ6€IòÓv¿³+UÓ/êìÿÔxÛV~‡oö»;œþâÓ_§FÀl`Ýo,zý† 5ý‡ŽzžÇK`*¾!àó‚—ænÁ~ÁaÁqÁÅ‚ËW ^«º‹àÝB]·P×9uîƒbT,KÅJq4ÆŒ§¯);ÈÈHœádáë›r Ùfj}‹cêž…ÔÌ y¡ … ç â¦$T$[‹û 7t$` 7ŠC»ýÖ·~{:bãgBø¾×û³3$íîžgšû-v®û­Õo<ÊÕq½pux„«Ã#\]?ïúüÈòS×÷4DA>\o83ÑW¡–›{}öƒ?\ÿûƒÑqð·ÿÍž_øµddÇ‘M ?™H€™Eÿ²Y#ÕbV‹:žLµÐž´_öÖvO$3âü Z†— ;ù kA§¦8{׿`Í?˜´pÕ´ø¾=á–°'GÂ/D ÄÞºÄþ…ÿk§ ÀžnötÓ3î=xe´-…þåù£Š|éz›Xõ'è|:Àí 2¶]zl»ô¸m£ç§Œžiäâ( BI°úþ‚V;öóÇŽ)U®«²€“+zékƒåîD= =À^‹Ãýõ…Ž^P®/Ôd¢«]h {8ýµÚÊ¥½+û#æã­-釱p¥S›òíj§ûn‡ä3¡;è°,• x¢j£X‹]ñ&ÐfxÞ(ŠC|ú—¨ G;ÛŽÕ Trà©«„Žf<›9!¼éq2=˜xúì'EE1*a G_bfª…¡VM™ÍA'p´çÅ/þû†ÎÁ{|¿$}å¼þï,?múÃ~Ó1¢øÐ§ï1íK9ÛÞ÷(G=ö®¸P-DíÙ’ölIm0#9Ò Û¯~n¿~L ß’¥è + ï;ëy§N'TТ9qæÔÌ •ô=k{òaBqç£P!T Uâi'ÊQ4¨™$ˆP‘ægå$ŠÆ $~Fñ3ŠÚ±b ã®åÀÄ`Äñ—þõbÓð ¶DØÛ§4=¤wkyœrH2§aƒiî0`¾tƒuwN‘ 8ï2àܰÅ!ž–ò ¶¶C3`l–ägëqAŒšŒšŒš‡}„\@.!W?êô÷n8ž›ñ ³w^Vždx’aàI† ¡$T „3< Q‡š:ÔÔ¡¦5u¨©CMjÑa hhÃ@q¯F|L”:4Ô¡¡-cÛJlÛ•š9!/ÄÀZªØ2]Z±FæÓ?&xâ‡0é&TË„j™P[&Ô–l©Å–Zìèf/@öô§‡4x³çŒ>Ø-Ž;´8Ã<¦É²­è\F;Ó1Œ ¾£i9næGö2``8r¡kä•N#¯tyðvl#OᎮ·v˜&ÉX·H‰önÆ}Û››ŽFŒ¶ägrB^ÈÊÃDLßýV<ÄôÒ}ŒþûŽO›M?0OðŒâ{Â`IØKŒš Ö¯6Ø+›Žh‘“Œ83âJ—ñ÷JޏrÄezãyy05?»;íDz–0va£ä„]×lÇn>7ûm¬XMèhµ†/<«1v~Y)9!/„*zé ÉÅ=o©ËÅI€Ntžž B$„’°`“=AMh mßl:šµ„-aGØ„/„3Cæd%ü"ô„0^é÷[GÂ#cÔ³ÕìÙjöl\ŒtÄaø èà‡q?ßÛ’BÅ] #Öm_wóûÑ_»W¬ð¼b…çµß@®!Ûü+š$ÃS{ç7É%,•'Áo›¹V}éÞ,ñßúã@=öùØÜ,ƒÌÍÒ6f}ÃhûwGÙ¼ûÝc(ý»ÇPú÷ož\ÉdÅýÆYÄ­½ÀàbŸøÝ¬ Þxz9A0KŽ¿%Q¦Å7,¶Ýi¹7hßï Ú÷{ƒ{‚îl÷î-¾ê¿ãÓÞ;>Ͻï­:Ý÷×ÁRæ~àMÌ÷þzkhÝÊÝæH÷»ýüg.»¿6sûúË.âùòëe>áù«k暘哨—’¿úÝ\U²<÷š¿ú£^äÌ"Jæ/®¬ý°²–ÁÜŒø 3ƒzhì³Ê`ˆ=¤‰œPš³±ß`F’Á¬Nô‘“?„"ôcúOÙÏ?¸å~ùCXþ©#xB ˆ›’PÖ„ ¡Ø5žVHçèÈQG}õ™iL>”! —ºjH´æ©Þ¼ˆ:ƒßÞo„Ä *ë©ì¼D3Sr^ ™¼[‹çkñœšk° a>t“÷Å|ðèY±»NÈ‹UÃBh «¨0ÙpoS|4fC@ Ó­öóäìû;:áv@ì;vy«»Þξj‹’Ñ)zÅ2ñ÷;jMÍ?EÅ:&dCÛö¦@o‡Â³\CÞ›ç}¿eТ‡ÃÁBÂmùýfجbâ ÁüNРË6lû¶î烸þ1ýBÙ>ÚB†ùÊ”rCΦ͂ë#[‡}ÏlÍè;5í¦^1@ý£8=­8\ÈX ®Ô”Mì`ódDáaÇÁsBµê…‚P*„J¡Jhmô†%ʼnæP?_É– ÕÍ~¶­ˆ$6è7ëÍGƒüß,?®¯ÖÁvºúÚîÏœ  BIl(^ãZ©¾ž¯³Mjíp»ÈDNÈ*Ký2˜|‚oè¸j;I7ÁŠÏvüüçƒ8ïÏ¿‡§ô7Ð8Ò/ ú•„Š€ä8;êéÌ80TÌ8Ì,ôwÔbžs¤Ä:Ów/À <Ÿf|]$C`‘ô9ˆF"ê¨@¨¡@„\@¦k •ë³$Ì@-Ñ×ç XÏ7´£™ÔÌÚ¤ú|_ah1¡=->q-Ô m…vBÿ0g/üM¸ôswœ"Õ¡šØõ<½² #qçzå,qºN€y±ý¯ †-xô?X4öœñbbI›ac!5õˆ–-“…ËV®iàŸíM%ƒ-B=Üa€†¥¹PF¶Þ7×~EpXc‡Ú¼Í+Ë_좯I´a1Îöxåd‚Á68!À=Ó-b)íbOv$¹„LUF‚^ó²mò|9ÀÛùIš$ÛdYÆ"ĥÀêÒa-0ƒXÄ`åòº°-ºËkØŒóɗר>­ˆ[Å`ñd—p?p-8·ƒô^1(FÁ n£ST¯"ÊiBUªÐpŠ…i©¨1(5º¥jQªW¥ª\ªW•z5·%9 äB΢ eìŽRy·úr­íL]Gð« WÛˆù6&Ó׃Åë¾ÌñCÔ$3Tœ\ž ²¶+V¬l™4ËÈ5d›,Ù÷¬_l‡ðï$>­Êr_üß¾ý'?‰žÊc<¸çÿÛtìV˜ÔÙóJöpù×$Ú˜W“õ¸š,ɲ¥h·9^HÏ߇f°½þnk¿o ›w8 Ñíö¼ñ-ËGœhx MºŽ¡d°<°K¼’µ†böKt¢ÅÁ<ÍáþxRøøÁîýxÿÁ/8.Ø*Wf, ' 1ùö¿¤ql•Ʊ^¯¨x%ɲ¦ëN"ìî :W)*e·˜Lpb2:¦œ“”s9]Ü⇹±ûøanѾ¿ÿP.,TºÇÆlBQ“‰ì U³¤š%Óɉ‡kú±ÆVS‡cI~&01}jˆ²§úÞuâK@\}U‰ôC„Î>Rgû6u‚£ÿ>èépIæA.6¬ žÉá%9<“ïio-^ :ž˜ 5‡ÝºS¹„ƒ’5¶<Ñyy 'Ý3âÖ=³u:±Ý:11çŠO¾ì€eÈÈ‚ˆÇÐ1Ѻ@;bÝw=^ñžÈdASûz#ËÕ–lÿžàéòÚŽ6|È?áCÇEÝŽ‹ºu;.ê&@œ»]îǃ:,w†LØ® ogXT´S ¸ÕÛ TÙ1dfÓà¶ ƒ£F˜èfz:°…xð9•g{1°½Èw¢#*…]¼n7xî+!ú€Ú30¥ { ï?\ýý޼çíñ“W ŠQQ«Õ+, glÔ”õw`š–£ƒš=`ø2làYê-œ"z»„p7bäb °ÉÚë€Õ¶LNÈ YÉùÅMö~3c’äý†PB ÷ P¦q®!ÁvNç/}o+渦·hþ•eeâÉá,cæ›É Ñ&—¤{*ÃáBßaXÒwh¶úGðûIh×U-ÛzŒ‡Ñõ <Õ<àÓÃ~¨1JÏðQ1>HV_†f…ð€).È_ºØg:‰\`àÖ~›`>~÷ýíZÊ&À¾i"œšO´\Ü•þaê“ À»þG¸œ?ƒ5 ëŒukÛü£ÝÕ-~ŒÛ¹úþw‚§ñ²KIWX^ŽHÇñŪ݈g·ú­Àx¡ ;vIw’­=J2.BÈØÓ̾€{Gøˆ®cìø;BÂ)¡­ÆëIšÀ<Áòáõ‚gÌ'ÂÚí„VS^í9¾H À2KBG@øCoȘ1ý`Uýõ­Æ®R&óó7w2àã…L5-z‚µ·2)#x‚%ø säæÈ7û¤²¿Ï[±_ú»n¸cÚ}Ç´ûn §Áϳõ‹zV\˜:E¯ Ç ©A( ©/¥17ŸßxÒ@*¡¹ ÉTö„Ž!ØÕݓكΠŽà 0wèƒ]¨—åyÒ—å§ôÇ\mì$á×…•ÖaÓø–d÷?'GóÅâIÞ"Ø¥ÂÆÞ,ÿ2l,A6{;/7lp$*ƒ#x´¨j…ö–xW$$šÝÆà ›ÂnË Âå Žˆn÷Èà0ÒÚÜ—¥Ê2Zø#Ç×z»rB¨· dhvg©¸³TÜ1&k±n1àÒ‘·y öN–­—IrÀø#ƒÕ›¶ip/ó­{j·ÉÎwfw;÷nI>XH2ºƒLŽÔ‰Y§fˆÕ¡†Ü@¶Æ¬E§Þ¾@çù¨ZŠZ¿*šôë×08dkۯ秾 ­ ÆÛÁšÊmmϯ Û—sLÔ˜ÅÓ®Á®¿£}ùøÁ).\ŨXP‹Bt²› 2u0²{4T 5$/6ílæDGñ4ˆÕ¹µùù Zç_$˜Ð‚¼¤­_1ÐbµY):Ø-VµÐ)P8‚õÞÛæ8X%ùñÁ'x4b̽=¬P(N+Ø;áAú‰¬\oçç¿g‘g³È'ÈgÈWÈHö“=œ · øô%Éofë¼a®&ª…¡Vh+´Ú“‚„$„ ! !ˆŸAüŒâg? 1+ÔLÂ+$AÍ &kj±¢4±« ´6“ÿN:Œñiß­êšæž±qÞ“ú6‘¥r¶ HÄî7÷dÂ+‰vlUúÆV[›ºüw‚§f¯ý®ðp°·g Píû[ðþxÁ wÂ…©W Š(-=KžÎp´ùÕ~^þðɆ[þà~.9,8.¸Xp¹àµr½Ð¨^ê\/u®—:×KëEºÔKóEêEêEêEæË{?x'»!öÁí‚·K^è»]è»[Øß-ìïæ‡—Ìâ7âÌ.L½â|yÇ;j/ÞKÇ8\5i°{Ô¾ óGÉ`”ú:¶¬¯cËú:bÝ,'B$„’PÖ µ°ú±Ï›áfê^Ç›ÉП E›pØåÄÃÎoÁ M†@#:ªÅ‘X³u€Ý¾ëQ Š^ÌI÷Ëd¬¯ïØRízô;» d[ZÚ ¿±$µñ éDNȃ6ö5q&G =;-ø ZìjBCh n(Ñ ÁÁ’x?ïJf¹†ÜBÞBÞCþcò‹Å$ÉX¢O´.`ÏÁÄÎyg“°6…÷øp*ƒErÅÌ%ƒ¬è¦`§›t6CÛÛ›:IFÛ‘À øˆ$´ËʆƒÃÚóÁ¡ø'°¸›‘L5ɉ™WjHAÌA+“  ”æÈ×vPôAó«™ïèìéMc&'„"ƒéâ †­}$ÉÑSû6øûƒº%;±­äèþdçkè€/µxÜÝ,>yä¹ÈœÉ }ûóAÒ=üØ(Ñí›s‡ÍåEÉ6º&RÓ/ˆî&w²sk‰õ |í:0/;`Eç€Cƒ|lpÍØƒNFkâÖDŸvvcÄp8˜¯ÇÓåL^(E¡B¨ª„PÄ×I+Ü«UöÊ$™×Y²Á ó½‡ÉÀ®N¿TýÕNÄ¿£SôŠ‘þŸa>T?7ó)ð$c7#X/pl»–ÎÇý±·ªÜŸ¶2>ðyÁKs·à°à¸àù¢w.; ?*Š¥b¥¸Ö°ìðJâ³½Lñ…²ƒl#Þ$ãØHJ¸ì±ìháeyÀÕï#W¿VŠ2œè‘•}g­} »29Zl {#…'‡20${a(C$„ÒbOŸßpJáx£Œô¶Û'’ GÈ6ŠxŸ/Ø8yÁXôSd°áâ‹íq¾[zu<Áä2’ÞœÍý'²ôzÁç)à ºÁ$chñì˜$Z=/xiîì\,¸\ðG¶üüàù@÷»Â ÜBa·PÈ-rQ½[X÷+5Š Ç…b©X)²„9msœ¶9NÛ§­ŠÓVÅ…¥å Eç¨ùùùùùùùùù-ÿ?x­ê.‚w uÝB]·´¿P×-Ôu uÝB]·P×-Ôu uÁù…º~¡®_¨ë—îêú…º~¡®_¨ëêÎßœýxçn¥ú/ ýÃBÿ°Ð?,ôKÿú‡…þa¡¨T½ç¿#¯+yÿéƒ~p·´±Ð9z Cê‹v»nÑíº‚Çž'vŠ^1Pÿ„¼bãñST\(S*VŠRµguÚ³:íYö¬N{V§=«ÓÎÒigé´³tÚ;:íÝzi™žõU?´L-AŸpaê½¢儼âMè÷b… ¡R¨bnùg)gþY£æµ÷:`÷:`÷:`÷:`÷:`÷ÏRˆü³ª¥Ãy¯Ãy¯Ãy¯]œKtŠ){)û¸´%¾±V¯jõªV¯jõªQ·ºmÕ´]˜ªÏ[µ¼e³“±Vã…cUk§~í4àºÝ-ÜjêìÕ«½zµW¯ö ·R’ Í3mû¼¶}^§^['¯­“×ÖÉkëä+­+•¶É™WjÝ)zÅ…ßQ±P,+E©;kUs½Ps­C­ÌnÁ~ÁA½wŠ^qa9*Š¥b¥h˨ e£ÃØ s°Z¢S¤ÆA[°ðYÈAÛ– mKKËA‘i´å Úòmy‚¶7øL)y8c#ÿŒ³ çÙ5o?gÙ¿3^˜Ï&HΦ„nz»Ê&SE@îl_Vk àûm;þW–qJÿ¼‡Öû²5ØI–ÏOÏøºæ¼‡6¶›ý#Û„dóBšâr†/ÃùjÞ]›Y€³çŽ5£cÍèX3:|†—àd7@<™ÝÁ÷ûð jSÔ¾§9Û»YÆ œLPûš¾2K^y(bqgüî­˜xB XÁºà1à Ž`½Ä%Ug¥(´&…’´^‘%'$!à`P& o>{ô-Qÿ„é4w ö ê½SôŠ ËQ±P,+ŵ šµ UFM›…©*Ù¨’’šýS+´ډýºwb÷ d½åe>úW–LjÈvtŒÊ“,ÇË-&î¸.Ôš ÏBjæ„"=ñ„@k¡$ˆJÖ^ì»Û/ÃÅZ…˵Gï8ѳ"cÂzÁÍ‚ÛoÕ;§èÕö|êóƒkµÕ¸XX/ÖKÅJq-è4ÞNSÅ©ÞÎ+ŨX(ªVNµr ­6еäœjá5^cà5~áVcà5¡ý"¡}Q/¸QçEìÏ=P³É¯%RªIÐHTÐHTXx¥Ù4[‚ê4[‚fKT­¢jU«¨ZEÕ*ªVQµŠªUÔ”ŒëÍ‚5e£–ž¸0m$Ý5àBcXh a¡1,4†…ưX¤1,4Ý M÷òYâ[>× nÜ.x»àÝ‚÷ʫ͂á-Z¿rnýÞÕuj¼hÞÊEóVjB•šP¥&T© U.Js¾ÔvCVš¨Õ³jUiÖWA¼’`Û•x•pÉ«ÛTýÁvýïÇõÂEXp\8ˆKå‚«…ƒõ2H­Díj¡ó2Žø‚î?Üÿ|ÿÁÏ×ÄÛ/îÓ/áÓ/ñÓ/ŧ_ÊO¿¬¿„9ô¿í—çÏ?ý/¶ÜçŸüçŸÂçŸâ矊Ï?•Ÿª>ÿô9>ŸÕrŸãã>ÇÇý/?ÇÇ}Žû÷9>îs|Üçø¸Ïñù¬ƒÿ¿,CáS‰ ŸJLøTb§žªO¿,uŒŸÊPü\†âç2?—¡ø¹ ÅÏe(~.CñsŠŸËPü\†âç2?•¡ø¹ ÅÏe(~.CñsŠŸËPü\†âç2?—¡ø¹ ÅÏe(~*CñsŠV†ðÓçøøÿůÏññŸãã?ÇÇŽÿÿ9>Ÿ Ÿã>Ç'|ŽOøŸð¿xÿ9>á³òaYWâ§:?Õ¹ø©ÎÅOu.~ªsŧ:W|®sÅç:W|®sÅç:W|®sÅç:W|®sÅç:W|®sÅç:W|ªsÅç:W|®sÅç:W|®sÅç:W|®sÅç:W|®sÅç:W|®sÅ\çì—e‹\|*ŧÒQ|*ŧÒQÌ¥ãcбÕ¬–æ‹1ÌbœåV›å‹a“ó ^Œ»\\p±à…‚né£7 ^D P\ø^-\W‹ÐªF/Rk9âÛ(.LeÚÔÊL¨ÕU„VWZ·°ìƒbTÔÐU„VWZ]Ehue õ:¢õn³`°.´^K‚_äœ_ Àkíbí ]¬´^³Ö/²v±xÐKXÄ%,â¢+mи„E\Â".!ª®º„ÐêB*u¼^x¾(uAK®ðɨÕ->o¬~é‚D« ­.H´º Ñê‚DµbÇb’fW\dW\ÔÄXi½_¬`´¶‚ñˆ¶&°.J´…æ}±Èûb‘÷ºJÑê*E««m±Y³VW)ÚBV°Zµ[ªÒ¥f.´¥×RPª’ºBÐê A[.V%KUR +URçüm¥JV~³`MèJ•®TéJ•®´U‹T- PµhÊ+•¶{kª¯u9'±ê½Öj²Öò²ÖX­µF®ÍÜzQOÖš7kMþµ}ÓxéìCëKÿbžö/rú*?Ðãž‘m™£b)èÕ4¨[.x&œKí¿âóÜ ›Œjá[ÝD p`$JT&œEÊìéÍ–°#ì v}èe¤Š¼4ù2RÃqO\ÀzáÙ+}~íwfk¾ +É7xu[=ÄÄ^Y¯¬WÖÇ+ëã•õñÊúxe¼ZÌaZÿ‘ä§ë{Q¿1œ¹bdƒ9B. £ÝøG‰ÿ2à,TgKðV„¹øk»ïŸöÛCÃ|ëM£‰vèm¾^1‰•‰V;Û‘MAn÷Ìä…‚u]ÕbX"œÈ€©Ü„t¸Çƒ™Ä›@°=† Ò¤ ‚xR˜gjy¹mhëLEImÔ tˆÈåÖµB[q¸S. tŠ^1(Fįo`Ö7'¦*{·y"`B¸g”ÓÑÓO…b©X)®ûq£aa²>¡†ã–ƒbTQ..¬BV¡ «Ð‡Åº+߯éð`õƒœ=ÁEŠ P„¯ :»üºÃÑÛ³±®;1÷ÕBygïÛ¦ˆ÷f«çÇ™œ"»þ“KGW=>¿ÊT“œ˜95k„Z¡­ÐNu½Ç V ÐHö˜)òM½ Ž@î(<ýwmfR3TýóØŽà PoäkÜà s7"•Æšõ=‘ B¨ã‰M"'„ˆÃ°²Õ‘n¼»¹€üýŽr¬»ûcò¯“-üê[ë)~ #Zä³§¾Æ¸½ØžoôôÍ£Ÿ¾ékܓ޷¼Qd"ÎÌNÈ6†&’Ï„ú-ŸVÊd9ÙÛ©ùïðÔfoųßñ>û~o`¿çË™¬k¨COìNÅþh¢Í zûì¤?[_Õãñã k@¤IQJk’úŽNÐ¥%p(Ûõ0°gÜ`p³†x¾0ÙÁ\µçë^xõÇ2ÐO?xB Døn³>¼ú×ÏBjæèLÀ! BI¨Hl狀ÏQ°Ç•ÿÊ2¨™,Mç:ü¯$b˜ƒ×&ðÓ??ðe°ÃÅwöJZ–ù;¼²ûØ“Awl/7 ¸ÊnèáQï![ó–dÆ£GUJên,µËäaÄÅÌ ÁÁ¦”¤¤ ¯¨.°¬—d«Ê p°}ÀýƒÃ ¡ÞB ƒ¹€\B¶õ…ßí%ÙžäLD.æñíÏ,?ÇÃî£Ùø6Œ~ÏO©&tŠ^1(FEÛÖ RôË0Âr¡á÷ç/öªýòÙŽÿôKøôKüô‹-—Œ6qK™åNèˆW|µ8!’Ï8ŒÕpÄZ„NÑ+ŨhMʸÁè#ÐqÓÀ qØÓýžÖpGæNF§¸°Œ„ØœáéÜ”ÿ•a^èýþ •é³aõ-¾Œ˜ÐV*ˆLûkúÉ#ÐD—“˜¢´d’ABþ% B¥P%´FlFFmd¢ÌÌfàÙ—L5-²DŒÀ+Czµ~4ƒ´ncÕo[¨È2Ro»ÁÆÂDµªU/d딣m¥G›áGôú#o·ù<Ýø‚åÒP(ÁÜàNfÈž—U¹ªi¹ó‚Õ–Ö˜Ê%ÅâÅ»P-ÔЙø ¡¢Õ‰Fkhd%’¬ú2/$§‡gLBÇ3nóOà ¨Ã׳©s=cè‘É Á ›îþg‚§ý¸s¬éŒWÏÍñŠNuìØJuøÄlÄ·JÿÊT*Úk7B5-¢ÌôµõØã<+Éò–˜Pý%Ûàãˆ/A ÀW6Úܹ 2rd´íÆOðté¶Ò^rÿcääxcé¾á“åñ†O–G\•qMè4 ØNŪ:Äpñµ{ó¨ÙøÖ{G«¯>Oàž6Î|}óëÃJÑΆ¼¾÷Œ—Œ@þ`û(–EÞæ®2Ë5dë&ß¶tp&óuø}´Ûïacv§Á½¶Ú{o°ŠœáD#G°òro.0@õ¿óQ× ô e÷ÞbÙÿÎIïsþîvÉýÜÙë‰wé;ŠôEú~±½À$÷sÂflx]ëPôBÝ.L{Äk‚/e,a¯ä„¼P€Ÿÿ0謭ʀO¿M?Ì]ùÞñ©¹Z?šÓà ßæŠ¿&pð*ã?/sý˜@†]÷Ë|CgÊ +¡wvÖ +³ë¿³üÔÖ—§Oî,¥# ÄÄ<Á:Ö 'EBA(¡µAÂt÷>FÈHâ‘þT׌I3ž‘#r ¨þ†!ퟙ?Ø,úÿþ¿ÿ?ÿÏJ(}(úÿš‘ƽã1#xB$„Š0Ý1qÿÊy{’½É ì4ü=˜§¶e:#@E{q:C/@7s´¾%ðÂܸ±W,þÊ`Sž‰jZ„®;eK­ˆ‰#xB$l5¡!´„´AJï¨%Rtgëq z¤OÈå]Aƒ% *ÈkXšW7{û}oó’óµSMà„“—ÞäÊÏ .NíYy>äÄ¥@z]^Ìàú²"8”é @K½Í=Á F#TãÛ¥!}[#}lÇ 5_B–å–º˜$ê_ ©™¹Ùæ·=+zÅ X(®íJÄ Õ'¯áxÕb^1xǵø¤Jõ)¨Ov{ÃU‹ù㊇ÇQ £z\htJ¡JõÁÎf¤ú0š­±½¬„œÔLóÚn¥èÍË?sPõf´F¬nVvÅ̃ìsŽw®<¡ì½bPŒŠ…b©¸55;°ò@„=rþÁµZW-jéTK§ZÚçM\+Ö¢´†ãUi¯JyMØù…íwÜ+~L¤þ¯vi u¸…çNÂÛËÁïE¿ ¤f¥ÆºÒhj¬­+©íÌ$ó÷ØÉ’lÒBž7س|‚Á‹Év%ÉØüëÓêfŠ%èÅìn^ØÈ4ÉVkÐÖr>Ð×~/ÌÖ XþÊ a ÷Žî}vPÌ´’LUæcYæñ†ÄÖÒÕ·ëI°×8ë™›Íye}Oƒ¼ÙÚч Ž`½K[]È ©Í … ¡R¨"ÙDðAÔ¬¦Îµ˜P“Ú×Bô1Ñ †V*¾=Ⱥþ†ƒÀ†ã¾k²<ÁŠà -[0ðkv2R)ÜVBTíÏì]É,cÄÕlŒÓYš†± ¬-hælKò~]üuÔñ$[›ád)ÉÑæŠfxðVsšªŽÛaÞHËpcïù`·`äÇx¡OŒÝx±F§µÑp»·CÑ Goçý¤±½šê-FŸ-FŸ­ÍÿšàYH,zB$„’° ×ÛþeÞ™·¸Ÿ5ƒ#x¼¹0n­ŸØ6†«™,ÚÛ¦7÷M /Xݶ­½”:·…“_»³ýlÃÿí˸"8‚'Øh"C'-9·'dÛv.?²üÔ´/ðò‚91V “líîÖN“%Э­ž~›àHG£Eu°Ÿø5`Ö“Àšæí`Ÿß%7#eÄŒisC±Ë°¢‘€£={œy¢š!¬óÜÞè³7Ä39Ba¹€ûàÓJ ÚU„5À¾6ËÀÄðôÀG¨ûáþF+–»ùLÁ_YÆq—¦™¡Z¨j…l€µ³Ýêõê p[Íý6ÆE»¶pëv[Ê5äÆd´÷;,`ìvÖîö•£µîÉÒ|Eõ¿² ×Ýh2šÝ\yþgœoß÷­U‰ýΚ‘ýÎ6u&°»c3:‚'ÌÏ£f@[–É yúßûù¹ð qJdÜwÞüw‚§Æ=_ûæ7ù×ÓMÑÂ{,(ìϲ‡ GÈdU쯶p“Læõ?v"b<`Dt°]ë (çž…V´èž‘P>tþ1W¸óaM«kBj[‡;ÔôþnœÀ,MöeG–#©´=­mœà8t{t°h²y0øË‹¸dzăÝxB$„€.ì`G$ÇCo­X’Ñbzkóý`í÷{~lr ÜÁ‹qþŠ<%Ê+nÇ~G§Eî[Nã3#×›á,`•þؘу,‘[ŠF)ÉÁãÉ’À°¦]·rBž)JˆÕF t>¯z‹~ž¹ûxæîcZ»Š5D$¿t#TÓbA°&ùŒÚ&øÈÚï¶@fLÎ[³-º† áCOð´è»Òoa Ew,!Û¦©çíÙ. xÇ•âÂrPŒH„ó…8ÿþ`Þ_óþ[½àF½,+EÆë¼R]çüøï;>_[ z·¤1ÀNÉ„…¢*cwÈMè°…óàZ¬; ›!jÚ¹báY±ðLUqš.ØÉè5O½f.{çzÁÍ‚ÛoÕ{˜×öšÂ^SØk<¼Æ#h<‚&hÐpƒ†4Ü ég7¯=P;h™ [‰\ä{|®¬égÏ~°†Uñ¨ŠGM°¨ 5ÁŠg ©X„\Ì!ÿûƒyöõñ›¦j¡ÊZj‹r@©Q+TÛB«o)nËE²–‹êTªž¥êYªž¥êY.jW¹¨]åB•ja½ZX׆ ´ì&ÖHWZˆ+†Ý³ö@¿Y°–­*,ÌÃÒ\Ë^ö£Æ¤ÒÒUi-™oZûï;>½Ö[÷¶’Øj \k \/J Ý¿öÁZÕÖšëEt×‹ŠºVõוÚ^dÛÚÖ JHîYK_âzÁ¢¨Ó~Òi?éž½bPŒŠ…b©X)Jr;íÝJÕX©Ú÷9íûœö}Nû>§…Úi®;÷¬¨Z9ÕJ;B§¡sëÍ‚%ömÎkP^ƒÒ®Éi×ä´krÚ59¯  =•ÓžÊiOå´§rAµÒžÊiO傪¡— ªFÕ©OQµ˜¯}Ø-„$ÿ¼Q¬:õÒx/…4JÑÊê×jªM¬&wXmÕ®D;ˆ~sNü|в7´ÛaßQ}.…8?KNDMO0L£$ æRuu¤U¹¨ÊÍã†?è©ÿݶꛨ¯#‰¸>ч­2‰Â…îÂokE):E’ÂRHù,D×¢’:PŠª¥¨:dýóA²ñ”‘ôµ·Z†L%ÁTâM%)REI‘ªTÓR¬¤¶W•ªB!µiûŒ‰ÄÙZ4_Ká[K†¬% Ö’kõÓVaÎØ_:·f K§Â\ötø°øcY¹;_[Gð,=Ì«ßß³¬þuBëúa°äæ>"ô÷üÃüeïl§]þðÉÛMÆŸ?ÌÏ™~ÿÅ-Ø/­Jf§èƒ*½hÜòO ï ÅRY<Ô8—š‰-QÆšvÃMènI?r…gä ÏÈžgÒÏøÀ1Ön(jóâßßY~jÆË¥¥1–¨æ#[_Æù¸RíXàe·9bmgB§è Åùù¡wœ[ç>¼û?óOCs9²çñÃt»ÈfùC½ü¡YþÐ.~X-ýX-ýpK~iÃÛ¬ãñCXp¹àjÁëo\+ãêƒ#RW¦¼£É¸R\qeË;®™UŸÿ{µå¡ìÝ8(FEkZ3!5³…ðËÑŽÐàåÇ ÁJþ›l\^ÓþeXñ¬gbX<”¥T_l;åÂcþú»\Ž49ЉM2 6—‘ŽF:ìÇ\åëÃøöjÛª¹ô|ß0 ú¦ØÕBv–â‚= »ß-ËÖ]nÈÖO^ñÉÎÕîöÌ2âuµïÇëé„FW,Ú'ù¤ÿÎgÌÕ&:‰¡XõÄ¡Ýû¯Œ‘PJº²Eždvì¨ñ’|Ij†Ì½Ú‰œ j€§ ‘^»Zü»â+Žk–'ýìháõÔ¤gàý¼ˆñeœ?ðýŠ[²ì![qé¢5$I–~(q½DG<®VŠVÃ2ŠÏÇ "ú`GÛó­ô“Wã~¥(~%¬ܨuÛê ‹xW›ÒËž_WÛi$[Ñëœöìx–µÃà ê„ Spt{ŒX>u¨tÀïG+QIfÚWhr;4¹Ý™2ü:#ŸÎ¾[Ã%c®!_FœíÀŽc‡]én>Âø¯,;‚5‚vÇZqÒ¢³³¦?&à½7ÓÈþÅš5»Þ1ÜèãÍÚnÀUC#/:LÐÒdO×Ey\i9í$^’Q°6eôŠQÑæ§œíð ^ó Ìç—¾M`Ïþ>VÛ€C/½}s8ÕŸ l»üaùß,Ûsß<= „H(63LÐR?»2'Á M^¨¹]Ž=Á‰qz§ß\ÄŽÎ:{íýû;>/xiîÔ¹ScgS¼/ƒóŠA1ªoØxp­Ö+Å5¢‰¯ûöŒÀ}{1yk'Àû-Î?õ[¦à7ìL„4Hä;1 biȳÏýö&ðáç—±‡R‡ÖfĤbö€õG½ìµ€#XÓÚOð€G¢2­„¼PŠB6“›Hƒ(¡ ÓøÈcU™ÔLBwº“бD›©ª„ÖTEð¢ŠU¼ÚU¼¨âE/ªxQe^ÿ÷ƒžúÔÝ0ÏL| ¢le±Ý;Q-†ê©èD÷ ºÑÝžü~P­h“Ü ÛNù$±¢Ä2®è0rhb|ܓى©ß¨©Dñ g1ôBA( B¥P%´ÙkrBª9]~àJ1*–‚Ž*¸:QY/ yôôûù¦ò½ζøôz°õïX{ðãƒO´måôxFQ9á¼fG°âˆ« ^qD’iÇb˜d´O™œ¹:_çÙW–QXÏÝ0›\ûžúÛƒjÚed©Y#Ô‚ì‹Y[riæ]Ø 6±Fßcs¢Q ˜?É`߃$Xc°”Éw&üX[ÿò:Ï’øb6^làuùU„u ®ç/[¿Øk!__;Ñí([öw;t¥ ,ÎÝ‹Ÿ@ڀΖh“‡h»zø‚<Ê`í¥½âPÚk7_‹÷õõ—ÝT›äíG&S&Ѽv3 eÂFÉÑêno´y8Ñè׬VtííèÉkŸ¦Âïðï žÎ}78ëJû#¢î펧dpm!Ï{6¯ƒ]ñò:ì(›ÃÁn¥Ï° ?l†³½|®ð™–lz1qO„H(ó—œæ[2¾=Ø)zÅ Õ¯báW©XQ 5ÒtLÇtpbQwŒºàÉPÞhD 5`ªÎ_»þ˜@êeúA€IçqXíTØKÔÞS{ÏŒ³•ù TÞSyz˜| *Ä T P@ ûH"+RÛÖMÀ+0–æ{ë²Ìà×ÌÖõ0w}_^kêl‹à¯×1߈K²E—‰¬Š¬T# ðÈršÀzâ±£l‹öà\’í¦º,·„~V´h½õöÄë›=òýõõfï¯¾ÞæYàÛ[do¸QsGðq %a‘½m.vØƒæ®æm3oKd¹6Ùÿ¿á ‡ö"ñðjÞ9Ïrgòv&ÌÓÞ,ãùèÄ÷,snñ¶¹Q67hÌßp•Ý×ócÞoó%‰óŠYñ´øÛ< INíÀr’­KÏP›ƒ»ýŽm·‹Oa^×kçU½·-.ùÌPƒË8_ 9µh´b°íYÛ?Öc&˜É¿íw³½í¯Màž0øv°=œL>Úø6É–òdzý<¯t~±Gƾ%q3Ìmç¿Ú¥jœ¹™?†y{¹Úçûƒ“S{²d>oœivžŸìMò¿£<]ì™’oö!ãoôÐYž[Ô ÔŒŽæÅ”,_h GómhðÞÓKA»uç Ó¹¦ünwv®,ƒ#|¤Ô ðÝ×d -<éKœ¶‡MåLÀ MþÁ<¡ ”„аذ8C D½ž“)+N<õôbBŸ=}öôÙSéy•ƒ¡ûÀ`ƒ bmî›&8ш˜R6iJ@¥çvÿÇ‹ŠT)R¥(ž0æÕµµ+˜Aƒ)X †Y0Ì‚aâ5#^0®4(©@É0K†Y2Ì’a– ³¯™ØãV1œj^á˜À„gdHóMm?&XdKÅ + š9±f|×ô`M¥ÖŒü|ÇZ*jxÙ:Ù Édt?Ø4ç÷vKÙ¼ÞÙÐß&°ï8÷Ä®„œ§§‚˜DBA¨kSãøòrY)ÎÝào¬!þ>lÎó&í6Ay S4½’!ÃiE3 î8öœdôgÇNÁ<àHkGXÂ_1™gm¿fñ4/OþÆÅ¿qqD’=dë·ìË¿²lçG'š#™V„>8ØËοíˆl0r²A€-ög ó%m•Ô«¢IE“5Mlãw¿±5¦‰JKÕy;‰³ƒk;¾þjÊû÷‚g°±yúèyv>Ú÷-Yî`ïàÛ£Ù³û$~ÿ¶Uêß6¤ûžeŒ²™eùoÛøýQùÒõ{œG?&ààñ†Çjov ç¯Ûf¿µ“€ÕBP+4ïÉÑÈö™3yÂ<пÙpîë­9Q6UíÉÛ/·y/õnó*Ùmo‡õ¿ÞŽöõËíhç–&€­yÁðæóg_o/¶qŸä9B. —+ÈkÈ7Èó*O–çÂu›—Ï’ø‘ÚßnÝ¥³/ßßÑ)š¾vK–ä¹€\BM¶ñä­ÇáÁ!>Bü>ó»¿P†ßv7Â_·Ûýd“šV¨`0Á\øî›­=höõއƒùTü³œ;f9_ïõön²MDïöxá×{ûÏ\)îÛ-ò>hNýûÖ:´ûO g¨ ÐßÜÙßÜÙßd„H(ó^ùýŸíÎIÜ_¬A¾Ÿì»·¿îç-ŽÑÝqܽ۞Áa.t÷¾×Æîö™É_÷ñ`£•9ÒNÌvjfᦾ¿&l {Âð‹0÷Âw;8ŸD+,É`Îú?›ù0Ê¿þlÚyåúËŸÍ‹‰°ÒÍ£àäÖ*W–çy蟺žw9þÔvþŽ0O'à05ÿ‘PXPœŒ¶"1Á³š9¡B¨¤—bqž%þ|W§_ÔvŠBñ4òâ‰W3ñÒ¾­Ÿ¨Z3q$a‚Ä HàAê‹Ä'HQ,ˆbA‹ñÃ6'ª…R%6ín؉l–”q»ÿiÜ¡±/…X+Z ?Ø"ãDtšÐ-°Vl[ñØ ¡(4OC2yB t„dÌTÓbEµlëéû;žèÒ:Ï?M˜Šä²94L›Œ+Å…e¯ ÅRÑJRFõÕ-£R³(T•B ݦGcÓüî~+Y3×ÖÖÜÿi–Žß´@§èƒbT,KÅJq-Ji°víÛUG·°¬:"2z!5‹B…P)4¯!?Ȧ%ÏãÓ?¶'ô=Ëœ0ü±wƒ³™S3{ùïÏncŸ|›•{ÂZìz¡ …¬ÛÚÍïÉϲt#»\Óçâ³;ØŽkOøìÇ£Ò(ÉÏi/;´8 zAkó"p6€vìd+ƒN+Ezhkœ Š@k‘Ö šØê^‚Š&kª4/]ýœà©¹Ìç'c:3ÈÀ(H• R傌+‚ ‚ÔŠ ýJjœø)ݤÄ 5$H Òi¯î$²ÒMé&ƒt“AœÉX5hÚÊX5¨Ò _$¤.… ‹Å(ÁIW¤O …Ø”ª¤zéC!YYŠŸÒCé!ƒô¡”(H2È Rá‚ô]A†µ¡âÜ"T2·•±– ¤îéÖ‚ zƒÔ½ u/HÝ‹2Ò2;‹Ò‹ÅùŸBd¿¨‹BˆZD©¼Qúĸâx;®\-†^(I€XÙÌTmÕW–(Cç(ƒË(õ>J½2<ŽÒ Dé£Tü(U=JåŽR¹£ÔÙ(u6JRg£ÔÙÔOÑZÊx ¢µŒž£Tá%t©ÐQæ¬QFÊQFÊQúÉ8›ÿó §?œvNV¤­ˆÒVDi+¢Œ­£Œ­£tÁQºàXhx¢ Ìœ5&ÒàDipb)ŠIó¥ù‰2@2@š¥(VJ¾IKeeØ¥‹2lˆ:lˆ6lxØÝ*©{x‚nBQNÚ±(íX”ñE”ñE”6.Jµ[3¼BZ¼B¦ï…´X…´X…Læ‹gñSZ³BZ³B¬B¬B†)…4_… L i  ˜Ò\2”/dÐRHSVÌMÙ¿”«×ÂgÑHš·Bš·Bš·Bš·BF$…›Ò„Ò„Ò„Ò„2š(¤A+¤ +¤ +¤™*dB_H£UH£UDN€±@ÒÒìÒìs³óß=í6çÕój#v$`i~ i~ âs‹óŸåì,¤ÎÒ Ò Ò s3ôóA‹irQª¿’þÒ0Ò0Ò0Ò0Ò0Ò0Ò02¼*dº_ȪUCM/NÒ -’MššBššbn\òzçŽÒ”ÏJ\x*Ÿ]'†^(ˆUiƒÖŠ­â^|*„J¡Jˆ‰&e¦”–®\©™(.-])m[)S°RZºRZ ÒIJ9Y{-¥y*¥y*zÊœ/e¼UÊ$¿”ñV)‹¥,üKG]ÊÀ¬”ö¨”V)íQ)Cª2n„Z'^Ê@§”6¦”¡M)­IY¨/¢X!±#-ËZ"¤)¥)5¤Í(5B‹ðØÚ–ºÜXÚrãdWZRZRZRZR&e¥ _JiQJiQJiQ¤9+çéÚÏ-Ír­$ªÊÀ§”V…ù"-f5·*ß&’©„µØBâ)õªdg¢’J]­ØU«Ø‰áGþ÷A¹Z,4V2V©p($S¡VK!&»äk%£Ê³Å¨¼?¥®WR×+©ë•,œHÉ©dÌRÉ(¥ jS‚ œøWÁÉ(6¥U¨d”RÉ`£’ÁF5Wö)„RÓS:âJJn¥Åª’lY?SQšH°"p?;÷ÉÀ¶fÂÎç~L æ`ßv>È y!;«€«DL 'F/xe*Öt+EG«¾îüÒ×ù³þ?v†öÏìA½‰v’¡³+G³láu'»WðO¿¹ÔJ>Hc>~qâÂ2¤·Kõÿú£'#&zV´m…v ë…b%^;1têµSŸÜ²W\ ¢Òëy鏯FÑÂá÷ÑŽ€O䄼PŠB…üò5ysöþÆxé÷ñÔ̲]ìÜÌ­Ý@®!Û.Â}¿Â/ ñ¸ZÊxžõ& ÑîDC–B}{ÛÅ…ÄoúçËÏ]ï²Ï+5j{P·`‹ºÜ¡’CáÞãæ¹âÆý0VPéhé3ÖT:»á¸r|ÂV˜½{ò̤ҧ(.ýsè>?Æå5…¡nY¼0'œ2K¨×ô à?ÑSeurat/tests/testdata/cr3.0/barcodes.tsv.gz0000644000176200001440000000012715063070153020254 0ustar liggesusers‹?Fw[barcodes.tsv%‹Á ÿîâÃ.IEND®B`‚Seurat/tests/testdata/visium_hd/binned_outputs/square_016um/spatial/tissue_positions.parquet0000644000176200001440000013050615063070153032441 0ustar liggesusersPAR1€­Ú³LÀÀÖTTCCTTCAATCCCTACG-1ACATAGG CACC CCG+CCTCTGG,G $CAGCGTTACT,GGTTGAGTZTGCTj CGAA , GTGAAT…ACT nGA?CTCGG CVmA,(TAACTGCCCAA. ,AXGCCGG²AA TGT€ AGTTÈBAªTCATG! ,A“! G, ÅUB ,”CÇCG! nAš„ AGGG1!,!º ,Á!^ßA5CT“CF!® ,C!n!#GT Û )AAT1`CTA×)C1G!­“oG1J!äATTA X%¶!{GC´ nÆ!!6AG ò!ÎAGA!^ AAGT,G!lEC ÆŽ ATCG÷GA„T!F2 BÃA(E&T BEŠToCEj °«!›CG1!`ArAÊ ,!‰!BAzCC,A%TT!‡EÝ ,!îA!U Be(!ÿQe !ŽÜe.ÃDY!®KG1¢TAJ!¦!èyœA¾®GAašA§!†!¬1J!Æ©A .°A‘C!â! BALi>aþBCTAªATY&ÓA( XGAa‚A%y Ôm/ T…2Tv,)!#rG1ä%[…’t,a”A!çaU”!!F%‹QAºH1Á,§&*7C¡i! qÞ%¡eŠ1¸%a'Ûù!Œ%§!6ñ¦eAaˆ µ–=:¥ÇT1äA÷–!½ Æ%D!!vù!-¡¿!ËB%4]!Ìu.i$Átå XÜE«òXfòÁèXeÃAX9Î!ðapòA9&a‹1¢!A!¢Ai{ Ü&!åÒC1A !JàaÌ ,&!Q ùNa~5 ˆ" !0%ž!e"‚ò•Á¡"A¾! !Ñ na›„ H¬ B îé( ÆE¹)` M¡/. ,!–a±X!]ÜaláèaJ!Õ B Ó!e®1ÎQ TA:@ ÁÍ©ÁÖ BÉ–!Ô QìÙAÁ±Uì•a!hA> BB AŒ!0 A½A%bAÙXe­A5!êCõ Ù!e°!0Æá* XAÖ!äÅ¢up¡>…%qpáDZ!FYÀGeS%I-¢AvENanA•¤a¯!ç5Œê aR% AB!å‰!구A~ã! !c Æe¡š)~Q&EA A°"t Aöá_ET±je²ŽòA ¡€%4**©‘!”£ „AöamAW !îE !§CñÒ!*Á†!`A, ,%….ÁÒ54a“E†2ö!t$ ¡vB¦A¼¡†U&áŠaßAòC1+á¶j¡W BÁ¨!v¼ i²¤ÆÁÜXGf ZIN n8rî yœ%)au…)"®…/ÃbQÀX!r AÈ šÌ E•E~qÃI‚!Âði… BÃ-a‚!; ê¡Ø~"V!!! Áø ,A‘Æ!ÿ¡` AÒAþC25%¡¡ÔaÇ.h TeË BMá‚ÁÓ Á! !! ¡Â¡° U&Aó!{Aq ,*š!‰£ e&ÄAƒuDXeG ÕeA=Kuœ tIlU&­åƒñž µaÅ÷!× š!¸aÀ 3Qh¡¦!¸ß ¼ ,Aaa1,A#Ae.Ül%yT– B!ä$!à!5 !óa*Aë¡ !CaÁÁ ñ’v ¥h”á©QìË r!ü!ì ,ð³%Ï‘ŽA‹A¡E!7 ,a%"%du!!üCÑÊA%Å/epµjAaAPaÉ"H A!ûÅwuÞšï!Ô"ø A9ÁáÔCµTA=¥¦ L °!B¡¿!` ©gy AT Ü!eÇ* )´a !8 B¥ A|!hy²A6!%zš!+ˆa›!Ä B¡ A˜î¡Ê a*C‡±Ta¡–!ÐAq ,GjI>AË +ÁA= ,Ë¡ YRÑaAl ,á!¥„!}  Á-E&1äAfáÖJ ,¡Ô-%> Á•éÀ ±(TaÞaùõ¦Áà›AhᆠBAáaÇ!Já EËá5®QìÅöò!ÿ" A¡AÚé‘,aþp!zz Xei!Ï!ÁµT,…tx "Œ Ee‚á [!rA± X…aWÒ "â ÜaŒ"n 6>¡àAð B¬ÁUAÈN , ˜Ž5`\! !#Cš!òaß>GBÿõ!Ó ¿ A§MÄ!­Á°"ü(ßA„!]k¡)" á/ap[a: na…¾Auô¡¥SAÈa ,Á¨ Ø.±Ø,aì¾yp!?êI AŠ BøP%Ö"$ƒ! ,óeBa±(°!ú!ž!® ,Aãá€A— !á%!bABa|amAÁya0mÙà!1á!=U”=lŠ& ¡~á e»Ú!‰E}„TÑàa¯S! 5Jaœ™!KA  ƨE ¸-{ëE.& )A~J .T¿!|&ô!AÓA•ü!JE•LEOa‹a[õ ÆA*C!M BA§A¾AÁ• :Êja’ ,´ ó*""ýs¡–"P Ya•AyXaÈ!KÙr!-aÜaêt ¶ ¶ø *"–æiD!6šaAÁT0"â%¡QA/• %UÁ!ieªaŸµjA-KaQh´ –o,ÎÁ…¨aß-J¡aTØYh-£©´ò{M¦-òÁÜÁˆAÚ XáÐ aä"¨ A¦A=Î=v…HE!T"¾ !±A8I– ÜÁr!†  nÆñ’"îA‘öEx!ôÁ¡qñ¼ÂA½•xM¯z nAxš¡­G‘ òIìAUA3A ¨ AÈ Be!Ía‡Ê ¡'A¸,Yìa‘º!v ,Á¨%¡‰Õö a‚( &Î a‚aõTñ8> A~aG XÙº " (!F%á"P?!e.<Oà¥É X¡zAìaò]Å)=!ê„!‚^°±jAŒE!ŽaÉ X!Øg!t: AR!YAÓ5!0¡P!Já ,…W©éÅ  A§ †a.XAÔXu— PJ54Iú½¡pÑà!‹)³AßQÖÌ Y ¯aº „A©A!Ëõz¾!á!?,F 9 °!án , ,ëy¡ AÓ]u mÝ•b!tq  B eе(efAzž*v e\†å „‰|A¯qD6Á0E nÑ¥U!3BEc¡ áUªiœ Ù2`« $ !5 Xa”¡N¡ôáD óqô!?!ß¡E!| ,¥%Á²Ʊ>e@á÷a¥"¨!jaÞ!äˆ BAiA<…qÀ‚AßõdÄéÚî $áf¢Q~Á\!Ò ¦ n)spx±€aÛ• AÄ1Œ A8EDná»­W[ Xan"Úç!Òg ù !Åà A‚A š!BÅÆóQ~)Je—%c ,)aŠE‰ q A Á6BA^etA«Æa¾R£ B(8%ú1X® %71`(þáÕB!¥åca9 ¡HÁqAX» ñaó!·° !, ˜!HÆ…raqAFiøE— nAÖ!ò!ÀA XÁ”¡Q5`A$AÁ ,!,?üd Ìåª!«õdBAÀEÜ @Aª«¡A BÁ}% aà1`A”…¤¡.Ù0:‚W ±>e½á‰åêqpáB!o)À®A2\¥?5JE!ÅnŽ òáJò¡‡A™ °ið¥ô!? ÆIæa!í ,!EyA<• e%0¾&j!ðÅ"ΡºùÌ!! X!ž¥<ÁF.N ‡%# „!>A¿Ž › BX¡Âà QÀÆ!SuôaíaÈÁýÁ5 BÈAÙâuZáŒE"£µ–L)…èÆa~ÅüU&:Õ p"ê!Ü¡,e·!¸…P }œ!ÆA,=¢¡ÐaZAÖ-!™rá|Æù! ¥A"Èa"¡© !)E¡!…!¤õè¡AÔÁ2 ,…/%M%h I¸!7!¡ ,N)¹E… °=žбA]<Á a®ò!´E¾•Leòe12 šÁÆ¡Ñ! A@ e™oá'"Î ˜+!j,áàaî%¤ ò!n…Ž…Ñrah¡y…PU” ™%Ê„ „>¡aa5 n¡†áÐQhA'¤™L¡¾á¡'"˜Á’añ¡] XÐ i2‘¤a}Åž!‹uÞ!Ã…_)ì-¸bA¡ XAŠ%³aÜu.EÍ1¢Ó¥áù¦aQA’!_• W å¼Aï"èA@%9"²¡ë!¨BJóšáp °A°áfö ÅÀ%Ñ!_ ,™±Áò!¦ ,A!y!=  elaà"° ÿ¥À!? ,!F%¦½Ø#¥ X¨AÐa\a1 a‡0ex±(‚!ÆAÕ&, !ó¡‘A"Ê B )Pp¥Äeµa¤ ¡Ð!r6 –­!"¤ZEé"2 –…9‘  !Ê%GÕFAM¡ö!§ nÑAvå”"v  Á‰€¡ ,á\AþC ò<.&Œ aÁÈi  ,¿…J,upi†á%!б–!ˆ!É!L n¿!Caç"f!úEg¡à•æ!Áñ%ÕX%­e?‚Q”ARc")!ó…‘6êáöA9! šá1¶3 °¡»ÂáV!Á ,¡:¡Æ ,XáC…A@•LØñ.&þÝ¡Ñ!"j&A·=!v" E#EbaÜaÜ©AY&¤ É‹ ÜA¢¾¥ÝÊô%Ìm ò!4!r¥ òA V¸ !EWÁ¨QÀ!ráh\aÑ ,!rè e/5âo a_ ,îAz!va$ am|!©j …™EX na±!á®!) ,üÁUB"N ù Ao54!U?…Ñ1äA"c!O" X¥LA%é.<¬Ñ\ ¿!¹¡ƒ,BEªBñ ° Þ"øaÅ!a$ „!>áa¶uDá E@°U&e.-%ÔyDa!ùt±>EQAÀ™uZAÊé -v!rA&ep54R “a °!ô!H Á´Q#5 ,åà@óõþeì!‰!ù"*a®•AÙA› Bb%e5älÁ w"h AÌE«Nõ¼AÒa—Ñ !ë XkAKË U&E¶A°…d Æå¢AŽaõ&’ ¾AK„ U”!öH nI6aàA®Î !î!!M!þ ,a”!C¥T„!€%úÁ±&  O( 0.ú!Cjš X¡ö %<µ–!ÎaAÄŒ ,ª!x4]~œWâ °¡ ©¯AÁ‘Ža@Á?A*Aõ X4%JÁó"œ!`!è…$ÕÊA¦Áà!hA B‡‡!y¡Æ ,¡TA~† $a±F!ì !°qÒ A/ emAû¡¬µ¡>XØF ,á…eÌÅ "H!š¡¡ÀJ ,!¯ažÇu.A”PA"At ,!…at¬XÃ¬Æ ,AË— EØ‘xA; jg ,aNEþ!v]&¡!ar Q<t ŸA³°!Â%Aô"ì !?AèÁ,AV n!ÎV{q l¡UEíù …DD¡õQ<%` *A.B¡ÂA—Aj nPó™uZ"–Å"’ !j¡}Un X)‰ˆ I ­á¡Ë• Iza1I±€X!à!da_ B}á0Áè %KA°Arò²!á¡™bw –!½–¡§!_%(-¡|aR¡ nTá7!ìÑ´á¸!ðyp p! BMðA•Tñ ¤( n1ŒTE£EAQ”e +½Âe-o –-v) êA›AH „!naq© š%]!a!5J7E!½"òA´Ê\ &€Izaòé „A‹¬¤, „!—aô Åan!c"Æ áöáNAZšÐaÕ.º.Eï „ÄÁ‡\M n!¤…¿^c¯ Ü"< ¼!n)7qÞÕE#q¹Øaíi* A=!ç Qª!>%"!ÿ5`c!NW¿ °…HR°æ)3EhµjA½!³EZ•Ž¡yI!9 XaC¥g‰"6ª!ÁKaa,)H!  !A+ù ¡a«ÜUR!WDA(ýN-A¬aö9Œ”!üqp¡‹ataå' n#!`™bÃ%åA%"š …û!!A|1JA 'aÄyœ¡2èaX! néAA©-¢áó¡:!5AÞ ,¡¡!ýd Á!0ÁR!aI qÈA¢i*…ÄBK¡ò2-¸E|ô Xf|-5n¡U%½IV ,!Ë%‡I 5váA…5&f ‘¥ !7š °•aqX%ÿå(  a_!”"e²…Ãâ éE‰ejA'A/ n%@a™!•uZ%¶!ÿâ™biù¡ š%±¾ÙžcAeÁvò7a¬Á"š !_AÔÁv¡0 ò8!uÂaK — A”! •L…³…¡1ÁA!‡¡á B°!!è ªETaý"(&I!¹IÝ ,Aè!HAÁa )D<5a×yXa'°!_¡ï B!ù"Ð…Fa_!`eaUá§"¬&aÄA:"Æ L% À Æ!®Efå1¸!!»„á‘ š¡bœ Lm€A4EÔ.nõaG¡n,a=Ù Anñ¼½!³%h"ÈA”ÁvAz! „Â6  ž eA"LÆ!­‡ „¡ AŽAN.ü Û ÇuôaßA•u²| ²!‹E „%ÃáËY”Á(!’1`ÜELa"ÄDÔÜ!Ä X)^m!9 n!³aãA. ,ua24a/ E‹E¨Áâñ>!£Ášn AZ¡á BAäA*æ aÒ !J„M¡Pá?BÇá ¡•6AS!½aý5úxárÁæn%‰á`C ò!ó!òRA\ ,)X¶AžQ~á3a-P aº ,W !R!8 !¸ðŠ"²Aàah!1¡ˆ , èAçp "$ ›‰˜"˜4láhå "²!˜'!¦ Xe%6 Aµ¡éá¾ Â!þau Aµµ>qpgÆ!ö!“ ,!à aðC 2 !aÊ¡õ !s¥„A“™xúSh&L%a$¡!AP"Ò¡gA£ž XaN³¥Ê54añ AZÙ , Û!hÁþ A5!áA˜a a—ÃA–!K M¡SFÕˆÜÒ…&lÁ%z!¨õN%XCgõþ…òeàZ‘L!ÉeWŸ"¶ Ia‡,ì !ÒÆa °AèeWIÖ-¸Â…a54¾† ä.b.ßA± XááAª!e  ¡°AÈ"< üá % uÈeD!äK "$ aÿ¡:Ásç ,!òÝ AnQh!ÇeÌÀ"r…¤h¥ÃUÖ…šAþ%%-¸!³!€YA¼n!é!9 „(á!Î( n%Gµ"& !ŒA~QÁ ,òí ´> AöárÁàac …6EzH aÕa!5 ,aƒ…Ha"Ò…[›Á¡5Ρ¼! 2,ìÎ1¸áa’L)"HÑÊ!(!a,ÁXjC5¸…Ž…·!ŒÜa{Ö!A9Ál0! ò­e‹ &‚1!Ñç2BÜ!xÕr‹©a*!¦ XgAv‡ál !¬•ä=v˜ÅXŒ1ah,"lJa.ávùè‘m.„A á¾ „ B=!QMRAÑ!s¡¹ ,b ´ °%D!Ô6 äo ,){a¸Q~A=ö!k ,Ah!t!‹!R a²A~Å9!oª A°Õ»mA"Áé B fax!£ !—!æ FÕÊáZešÁ6Ð)Daµ¯ B­9!8 Æn)9`® !s‰!%ú , ©À!&Æ)DÁœQ”¡â!›´!R Üa&á"…–9v!I ÆE§ATÁ9õ +!r0 B!ñÖ àt alë!žå „AŸT’ õ8A&âÁ° ,!Œa<J¿ ö °0!§IçG E‘†% ,%ARAÅ\ ,& AÒ.!M al!Œ´ Aº€ uœ¡ (!£=`AÐ %1`aþ!u!£,¥faqÙ"à6Ay!ª¡³ „å{¡Y!qD!³Á4ùy.agat›AÚ B ËAŸ Ü!v:AE ,Aý!Ï!d !GÁò!"žÜÅÄñNa l AE B­!±¡Á÷ TGe-]ìA… Aœ ,a†!¦aüC åöaÛa9JÅ­)0A ,)E« !T 6!‹",³!‡ì „7!r!› ,¡xEd%tXAãZÁÈU! )e¡´1vi³!‡ nÅÖåÕö !4 Œ °!ã¡y!©A˜ šA¿!Ao ¡îé&·°aµ":!€”–aI BP®Î!9 B›!"â òP—£ ,aD)^!ë„!1![!ñ òá‹aÄ!£ B ‹ Ü!+†!0aŽ ,… ѱ"Î åÎ!h•¤aN!² ± B'! !å•üai…P!B!*”a"úŽa?¡¡ Xås%E† ÖAìa¸ [Isup‹I«A–шaa±ö! BEÏ—ap°ïAd!A@ ,¡¡!V A#ah¡ …a×a", Á\¥UÆ &æ! E AyZÁ[ ³"Ö j!Nö9` !ŸÁž¡ „Á¾fŸ ¡!!ËÎ EæeúŽ1vdEÛañèaÆÈ!/ BgAÞAp }!Í"á!r!‰Aô ,!%¢54¡ØöE‡š6× E˜mD!H5ò!æE ¥Õ!ÿA"Ã! !Nšþ ¯X: o Ja: ,ëËAØ*ü!qw»BZa!Ê!w Bxó%Ö,¡$A‘¡Sê ,;!wÞ ‰'e- X¦Ä!♺eZ1ä& ÂSÎM!µMáR nAì!Ê!b7 AÂEªõ"i­A¶Qì!CaS! © B¡;aDA¡B º|¡:aø ! ªÒÑ…ÌÖ £-Á"AÕ¾ B¡JUP XA !-ù!­}¡(*bA;@aänA$¡´yi”Ì Ž „–%h"I7eI!? „!œAk‹Y%„Á/3&Öea61v!e÷¡,eÀAõ !š¾!Œô °AíŠòk !»kшÀ¡Öa¶a BAR¡'嘙ü Âaݵ ,ÅaAW ‰ê2 ¡%FÅ]„%˜ñ !y9`¡À¡C"ª%ú!!z" ÁE¯•x© ÞÉK šS›å&UìÒªÁa!Ú ,EËa'A~ùþAJ!Œ!"j¡KÁ4E*"˜ahTeº•Ð|Õ AÙ!ln€¡ A£ -…l Ó^ÅÝ"¸p eqa7õd!ÙÁ.\AL!^Ä¡¹a‡!„!4!y!ÀU&;a_!š­!è!´A BEN“,"ª  !¼E½µÂ?Ai¬ B!˜“Çqp%n!¢aÆYª o` ùþÔÁ*ß"RbF!G"ØAEp•¤…ƒ»a39v aµaF  a!ˆ!è„E¹A›ål Qô6ñN6 …/´qZx…&Ì…²á1ä!HaÄAká= n@ ÇAiAþËšAtåäA˜Q<‡ VeX&  !ÐE!*ðþ%œö1Îéš!Œ š!ÆaŠ!Ó/ !Â!ˆi2qZA7ƒ¡¾!6 ,ÿ!A¾ a*“!ÐÕ\)¢©Ù ,ÓijA³ ARIãž aÖ¡š( k› ÉH I ô+ a… • !qa¶kÁ8 X¡åI9¡H1vA<)!ÿX¡S-E? B­ !^"p!€3 +1ä!ðA!Oñ Ba ¥ïC"r'…©a¢5¢ÆÓWA\ BÁ'\%dUÀƒ™-%`A¹!¨•baôAÃXÕžÁ 3 4AD n%ä!KA$BOP Åz5¤(¶ú B!Ρkñ!í Ã!aö ä, !vY Á ™üáIÉK­ ,1%§UìAÕ!$".BÁØ–A BbÈ %ÿ"ú A¦AAmò ,e@sAž1v!ráv6A¬ ,C AjaýÑ=! AÁY ,Asa‚Á¼w ÉSeïÉ A8!¡A ¿Q!]¡ó à!!ì&züF%`UÀ!3¡9A¯p BÜ!¼Å½Ø!3aú1Aî up!Ú¡#a&B!Í÷!ÊA[ nA‘a!xÙraqYæµj—-aò"@AúG!F XM (TGAGTAGTT-1þˆ,À6(TTGTTCTAGATACGCT-1AAACAATCTACTAGCA-1¿ ô¾À €@€àH€À€8àˆ€&@ XàÈ€6Àxà F@‚˜à(H VÀ‚¸à0ˆ f@ƒØà8ÈvÀƒøà@‚†@„"áHH‚–À„&8á Pˆ‚¦@…*Xá XÈ‚¶À….xá `ƒÆ@†2˜á hHƒÖÀ†6¸á pˆƒæ@‡:ØáxȃöÀ‡>øá€„ AˆBâˆH„"ÁˆF8∄$&A‰JXâ˜È„&6Á‰Nxâ …(FAŠR˜â¨H…*VÁŠV¸â°ˆ…,fA‹ZØâ¸È….vÁ‹^øâÀ†0†AŒbãÈH†2–ÁŒf8ãЈ†4¦AjXãØÈ†6¶Ánxãà‡8ÆAŽr˜ãèH‡:ÖÁŽv¸ãðˆ‡<æAzØãøÈ‡>öÁ~øã ˆ@B‚ä IˆB†8ä!‰ˆD&B‘ŠXä"ɈF6‘Žxä# ‰HFB’’˜ä$(I‰JVÂ’–¸ä%0‰‰LfB“šØä&8ɉNv“žøä'@ ŠP†B”¢å(HIŠR–”¦8å)P‰ŠT¦B•ªXå*XÉŠV¶Â•®xå+` ‹XÆB–²˜å,hI‹ZÖ–¶¸å-p‰‹\æB—ºØå.xÉ‹^ö—¾øå/€ Œ`C˜Âæ0ˆIŒbØÆ8æ1‰Œd&C™ÊXæ2˜ÉŒf6ÙÎxæ3  hFCšÒ˜æ4¨IjVÚָæ5°‰lfC›ÚØæ6¸ÉnvÃ›Þøæ7À Žp†Cœâç8ÈIŽr–Üæ8ç9ЉŽt¦CêXç:ØÉŽv¶Ãîxç;à xÆCžò˜ç<èIzÖÞö¸ç=ð‰|æCŸúØç>øÉ~ößþøç? €D è@J‚Ä 9èAŠ„&D¡ YèBʆ6Ä¡yèC ‘ˆFD¢™èD(J‘ŠVÄ¢¹èE0Š‘ŒfD£ÙèF8Ê‘ŽvÄ£ùèG@ ’†D¤"éHHJ’’–Ĥ&9éIPŠ’”¦D¥*YéJXÊ’–¶Ä¥.yéK` “˜ÆD¦2™éLhJ“šÖĦ6¹éMpŠ“œæD§:ÙéNxÊ“žöħ>ùéO€ ” E¨BêPˆJ”¢ŨF9êQŠ”¤&E©JYêR˜Ê”¦6Å©NyêS  •¨FEªR™êT¨J•ªVŪV¹êU°Š•¬fE«ZÙêV¸Ê•®vÅ«^ùêWÀ –°†E¬bëXÈJ–²–Ŭf9ëYЊ–´¦E­jYëZØÊ–¶¶Å­nyë[à —¸ÆE®r™ë\èJ—ºÖÅ®v¹ë]ðŠ—¼æE¯zÙë^øÊ—¾öů~ùë_ ˜ÀF°‚ì`K˜Âư†9ìa‹˜Ä&F±ŠYìb˘Æ6ƱŽyìc ™ÈFF²’™ìd(K™ÊVƲ–¹ìe0‹™ÌfF³šÙìf8Ë™ÎvƳžùìg@ šÐ†F´¢íhHKšÒ–Æ´¦9íiP‹šÔ¦FµªYíjX˚ֶƵ®yík` ›ØÆF¶²™ílhK›ÚÖÆ¶¶¹ímp‹›ÜæF·ºÙínxË›ÞöÆ·¾ùío€ œàG¸ÂîpˆKœâǸÆ9îq‹œä&G¹ÊYîr˜Ëœæ6ǹÎyîs  èFGºÒ™ît¨KêVǺֹîu°‹ìfG»ÚÙîv¸ËîvÇ»ÞùîwÀ žð†G¼âïxÈKžò–Ǽæ9ïyЋžô¦G½êYïzØËžö¶Ç½îyï{à ŸøÆG¾ò™ï|èKŸúÖǾö¹ï}=ð‹ŸüæG¿úÙï~øËŸþöÇ¿þùï  HÀð€L ÈÀ:ðŒ 'HÁ Zð‚Ì 7ÈÁzðƒ ¡GHšð„(L¡ WȺð…0Œ¡ gHÃÚð†8Ì¡wÈÃúð‡@ ¢‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈÅ.zñ‹` £ÇHÆ2šñŒhL£×ÈÆ6ºñpŒ£çHÇ:ÚñŽxÌ£÷ÈÇ>úñ€ ¤ IÈBòˆL¤"ÉÈF:ò‘Œ¤$'IÉJZò’˜Ì¤&7ÉÉNzò“  ¥(GIÊRšò”¨L¥*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌbó˜ÈL¦2—ÉÌf:ó™ÐŒ¦4§IÍjZóšØÌ¦6·ÉÍnzó›&Ð 5barcodeÀ¤ÉˆÐ&ˆ´&6(TTGTTCTAGATACGCT-1AAACAATCTACTAGCA-1,LÒÚ,À(©ð¨À†øøX·ã F:c¸ºW]At¶t9áà]ïwRQۇűØ~ Û×ÆÔƒ×ød«T ätòVj­))ÑÕbð TP7àýZ˜,ÖUEBƒ4ƒð]ÄέV¥î aŒ[×4«"jr²} *ü‹'§#YJ’—ªÚì^’•írw?š”®BPmZ¨q½T±£ xžu1QA4bŸ*CkÌê+P{ çù, ²Fåƒú‘[ö3ÝN…#5¿#À¾/õÔÎQ7 Ù¢\“ÐNôvnèa¦­WR‚uý•%œl’Ï¢iym.ÕeÊæ fYÍVg1%üŠlZWIB„FCËrn ~ ÿŽ«,ÞÑ&.R´Å<‘(â} @×<7¤SÇœS)0xH{'=‡ ¥·Ø;Û†v-žðe“h?K/K™|p ©–§¡9‰ût$€ÒE)ñTED\!dXÓ}V5È¡OhGwp¬‹H kgcïšj€0f`2øä™;µY$M"Š'+…‰°ºî¼_M› —ƒ*zŽ˜,À¢(¢‡ ô†À @ €(XÀ ƒ"H˜@¡‚… 2hØÀ¡ƒ‡ Bl1‚D 'P¤P±‚E /`Ä1ƒF 7päÐñb=|üDÈ…!DŠ9‚DB%–8`ÒdÅ'O D‘2…J‚*V®`É¢e —' ˆt¹àå *aÄh01æ™2fΠI£f ›6n´¼ƒ Žsè¤iRÇÎx€°“GF:zö8àà ?4g¡B†!ê‚#‘¢EŒ9zéC$I“(U²t S&Ml6qâÑI…Oˆ> %j©R¦œB•J*«4±j•ÁÕ+X.bY© kÇ,Z]jÙº…‹S®7/t ØÅ«N¯R¾~ùìM„ #VlCYÆÚC&Bƒ(ÉB(St#Í2f‰šíqö,T±:rèØø-š´W ¦Q£Q ’µkŰMà•M[£m¸uóöêÛ-pωG®\ æàHˆt!é|dù NÄRëØ]k÷ÊÝ;xæÅ“WÝ…ªTÙÂE§Ee—3Tä0uePñrQ½øp[U«Srú±ÁêjȆ撼ÂÚ"e›Y‹î,vîÀÆ–"¨hÝà4j·­ìÂ8I’Í=\3¼Úœµ®Xµ"æÕͶ¯Q¯y‹§¶oʽ0–PE¯bÉžAæ,A´²g¼™=‹ög5i±ªE ²ÒZ©Òö ¡öß™)Äb\5‚á]!ªGnXcÈvÅÚš<¶õN·¾  ô¶U{œ²[´´PÂQyŸi™­†z>†¨ôAÏ+l£RºcL(JŒ0Ûy;8iœIMÔ'þ E€¬“Bd±]9„ñ?¾Hg7~%<ŽìăÁ‹×xª3™œø–!›m§ß1{Èj]»1€f+B¢O#6tlQD`„õ‹êa ,)r©ksŠ0¶ugLÓýÊÑ*”  •Ššsw \qГ)ØÌû[š7¼ŽÙ—? ‰DC-µóü‘exu‰|èe‚on"ä_d}•nKSFÕ5hçáÆÝ3ÚY…‚PÒ¸’¡.U2¹ $f®&Å4N…aS XK° ÿúpbŸ(¢zͤ‡³8"Uîo\W˜ë‡M—ˆùG.=5!¿ž~²=ítk^62v_}#:PW@Ãq&'VòF*¥NÇ|JCcÞpŽ˜,À¢(¢‡ ô†À @ €(XÀ ƒ"H˜@¡‚… 2hØÀ¡ƒ‡ BDX b‰ Lœ@‘BÅ -\¼€CÆ 5lÜÀ‘CÇ…}ûø)éçOY¢MÿZ “0 Àp 45È Gi©Á“*:ÈaB…eÔð ·0– ¯5 hšq–Bx‹“p F 2Db•‰JvP¡XÑâÅr3jô¡ ÀFŽÑ2uôøæ#Ht’Bvð&ÒÎH$ ,yåY*“'¹‘9…2eÈa*¹ù[¹‹e( o4ò©Ô²Ã‡._é‚•³ƒžùàÁÈHL™&s¡bb`¦/*G" Y ¢oô> ëG¤ŠÄ˜1N0±‚Í›8_fô’SçNC5'ðŒàëæ•žº|þuD º7RÆae@ÉÏvpƒ'çiÉ‚V‹(€€¡D‹ÊBPϨ2œŽÎPˆ”” ]’ö‘E…Nm{Æí¤”ÃÒ0a®õ‘Ó¦>…ÆU%.Pwè(ø3–p'£*€s 7¹Ä“:uÌ@ªU‡.Ù‚à€Õì ô¹ Ôßµ¢X³jåƒéX¹Ž¨LéVuëG®m®"tÒužW1?9ûùlU$}P°µiF+РX9n0ª‹`MÕØ1r!²BÖ©ŽsŽ‘ 2EެÈð5yH¨4Ç ëHˆ,YŽ;(%R¤êÙ:Šç ¤±^º‘άãIHo¸ª˜›{CÏ3&”¹5 array_colÀ¨0¼0&œ¢&؈¢(¢,€œŠœLÀ€Nôÿ&õ=~¿@’Ö3¯¥¯@r1J+š@º[®Ú¤@©ˆ7xÍ¡Ã@D2$—À@®Ð/m¿@„z&ßÙ»@ï<>iÉ@úZ³òÏ@X¿Šk­@Œ—›i2Ö@œ=Uƒd‹Ö@ž@5ãh´@ ƒ°60µÉ@€ ,OþêÕ@p\LÆcÉ@BP$Å ®@ðβ)ŒåÑ@˜\®Ùê=Å@È´‘[Ñ‘@jë.ÑP•Ò@à·ĸÓ@€u‘5æ¹Æ@ÀSoLáÄš@Œh óT)Ô@¸”œæ(”Ô@¢¹nË]Ñ@@ÑfÉ’ÆÑ@VÒÏ/`Õ@â„6h-Ò@þ!£èÅÕ@i;Cd'N—@oŸn„ò-½@bmâe8wÑ@†R!¹¢@èGžO;Ù¥@ÀfRNl-³@Áø={°@Þð6žcÆ@_óÚ×]Ú„@XÞ7œÔ@'JD¨@Ê@„Žrµä³Ò@P=‘X­Ñ@˜ºùª%(Ô@2Ò®1ÇÝÁ@êiØâëtË@¥3¢c[ @¤{¬žÕÿ·@(¤áϰH×@h(¤ÙY›Ñ@é6E¡ñÄ@æ ‚å6¸@övÐdl(Ÿ@³€—ôÛÄ@¢Ø¡»ŠÖ@<LññÔ@ºïQŽÂ»Î@†tXëHw¸@¦8ü@ @Îâ´œÞ Ð@^ –?Í×@ºx%œÙ½Õ@¹ëHHf±È@·¥ ­Ë@ŽeI¶0­À@ÕÂ'èÊÊ@î|~^Ô@hŸÝC_Ç@J„ÜÓŸÆ@O\)3¨®@9HßÄÀÊ@C,±¼‚‹´@ÁÕä eRÂ@SÊû¾bRÀ@´¾¤Ba¹@œlÿ¢,ÙÑ@"­šƒÕܧ@t—öw2¡@>Bgm4Ò@˜]B¿¸Ù±@”[î%ÅÉ@ðÉ*ÕǾ@áìöÑë/Î@ˆ¿Q‘åæÐ@ÌÅÆÆ]¶±@uƒfÁë·@Ä¬Ñ )ù¬@èÿ\è Ä@(Xx’˜µ×@…Dn—†Î@lÔ¥05Ò@®‡.Æ@é íWÏÏ@Ô«¬ÿ{àÏ@Þ«*‚’xÐ@qê“’Ó@™¼kyÉ@²Yˆ”'׿@<|TË„ßÒ@¦ï$n°îÔ@ÆÜ8€!Ó@<‹h`¬@ªt§2Ð÷³@b¬k3ŒÁÊ@õÉiX™ß˜@à°W@!ÇÆ@‚ ƒ­™LÆ@ÇO‹¼‚@Hϰ Ö@ø2J×tÌ@ED)!ÂÆ@ýëòÄ@Ú}fKvuÒ@Ñp—Âd^‹@ éæ?ak‡@4¶üF×Ö@g0EϨ¬Ä@úÍ_w•KÑ@$jù†!Ñ@™»åƒá¶@Iþ…ÛáÒ@ãëõ’6@BÅ´§3ÉÎ@×ðuSLgÉ@Û¤`¯féË@Hðú Ö@€§Î332—@Ž25v»Ô@åÆHD—ò@;¢“38I‡@¨×©±eùÍ@¤%¥â¨@˜Hïúj°@qÉ‚„ÀÁ@ÿÀh±½Á@¶ÜhÉ"žÌ@Ý·Jþ“Ã@ÂÄ#<,˜@…;ªkŒ”°@âåKd3§@8Ÿ…àÂ|Ñ@‡-lÆúÜÆ@¹{Œï²@”ÀrÁ/Ê@ý¢„²@w”ù‹.ËÉ@Œ‘k¦Ë@h΄ù›Ö@=æ¦*Í@)$}Y è·@ŽØÄ‘Ö@˜.Äø Á@¦…ç«1$£@ñŽ=‘ùSt@ãýOZIP¤@j³šÉ Ô@žQ `;Õ@àé¯;_2Ó@Óg5ÿ5vÀ@èÏof¶@`^©2yî¸@Õ:ÎÛXÂ@Âñª»F™@0dÒîÔ@Ü?m;SQ”@Iéê̈’­@‘¦¶È‘Í@††äweˆÕ@¯ï×KüÕµ@ÎÆ‰RɾÑ@'üí©È@‚·™fñ Å@ìŒ^”„«Õ@Ý÷*íº@pí&ârr@^F°Á×MÓ@"Äã ÞÐ@OÅÿí׽@Z#ivaÅ@¨Q%3­\Ã@r³õáoYÕ@Úa¾pw`×@48®\˜ÕÖ@Ì;œ¸ÞOÑ@pG>ŽË@¦ð”+ñÓ@¢NÊÈ×@ .ÐJ<›Å@Æ,†´¯Ò@›*ùÍ×@.ïcäŽWÐ@gއ•pÂ@˜VVe—Ã@qÐÜ]t @šØeŸŒ°@\ß))ŽÐ@h5·ó1€Ã@ÕÄÂB0¨Í@ê|]n‰íÔ@  Ë*qzÆ@Þ“ç’Ö@„ßÜ"0yÓ@ây /ÏUÐ@`ÍðÅÖÕ@,ÓxªÕŸ¸@Á á]¹²Ã@¶±§××=Æ@Ò\Š}ŸöÉ@4à±›ÐÔÖ@’Wk ½@G$å×DôÉ@d6Z†î4Ô@½ê ÿÍ*Ê@pD‘Õ@Ö–…¹´Ã@®„_ÂGË@- … µŠÇ@ªæR$lÐ@d˜7y%”Ò@ bíSÃ×@vöú3Ð@¥FX§eOÈ@Ûu{²@Ðm6u|™@[$ˆ¬Ô@ªVôx‰„Í@_»®Ÿ*ûÆ@Ù¥;ìMÀÊCÕ‘ÝÓ@Píñ“Ò@Y@ðÀ^Ðy@+ûbÂç ¡@:{ÚÔ°Ï@jÃ2#H²š@3÷a È@øù%÷¯f³@—E¼o°¨@n“pëýÃ@:Ã%™|ïÔ@¢¤EÛ–5Ñ@lªvuôšÑ@>b*»?Ñ@¹ºÍ4†bÅ@î©]cÒ@pÚW9jÀ@Z™•¯ÿ–Ö@’@Â(žÜÖ@&ÚýÝ¥¥@"™“w²i¾@Ü›ªZ`³Ì@ÜÔŸ‰Ì@ߦBÃz]±@D©ÒsVzÑ@Ϻq»<½@îܲnï®×@ª ¾PøÁ@ÞF2œ Ñ@GôèÑK|Â@Ž\–´ä×@q2íÞ«¢@%ÚßPÖÂ@ÚhùÅ‚’@MgÍ@S®Î@ ¯·±@Ìr…Ö¼@³©ð“º—Á@Vdn’Q°@ yƒ™D±@3Zv‰}¨@̧k½¦¯Ö@`Ô;µ´‚²@ДËÄ@:ê> @ªÑ@³¢Ú•bÍÍ@2néÝ6ºÑ@=Ê íÎ@¸o˜iAÕ@¬VÄu£Ö@"ÇL¤G È@ÊÝãç:(Í@Ü"ƒ®w¸@i­ˆXgª@p£ó³ Å@†{œ$£@Ã] ™Ñ@;’D:ù*±@5íµè8Õ@åy¹ Ò$Å@ŒÔ(¬7³@ÿÓ±õÏVž@`h7ô\Ç@¢¥ìë3‘µ@݇e\6u¬@~x̆.‹Ò@,]@ È@\8èô”‘@ê@ÜðeÅ@¢Jl9Õ@̵îÏ”Ð@r“ç òÐÆ@UƒÑnšÁ@!¤¯FíÝÁ@ÃS°Q¬@CUŠ3ΰ@É„høyqÈ@A—¦}:5±@x5 ié@«@ä)3¹8ÎÁ@•T4¿@…g÷¸¹@µ¢õñèÎ@ØŒ`‚¦áÑ@àyןY»@œZdÛºÕ@“ ;Ã@û×Áàµ@7O\xŽÉ@8ÆÿÝÐ@ØL IÁË@˜§ûø¿@2©J¤Õ@xÌ™H´Ö@þñÔïû§¢@ ÿ_ù1¦@Z°Ï®Í@O‚6Þ˜]©@B»PNxÇÒ@D"àŒ¥Ñ@¾”qœ[øÒ@Ô÷žé)Õ@i4£9a´@ØÒ´HSÏ@Í3àR­µ@_ãÌ]Ûµ¹@²Á²•.­µ@’y©XTÐ@!«µ!‘?µ@GΨÀ‡W¯@Ò*5†ÑÂ@˜}^mÔ@ê8òwÈ@¶ '“úÕ@;DSÌ${¦@@õDÅl¨È@+  }É@Ø\ßEFåÖ@Jè„Iã$¸@È~%@„ا@ÂͧptÁ@j^áB:ŸÐ@dY<.ÍÌÑ@ÚRË èã®@s ÷¦í<Á@ÚÄâr«Â@ú©o1Ô@Ùy ÁvÏ@¢A¤¹½ÖÔ@›÷es’@)LýuC¶@¾#maÖ@¥:m"Å@}øbªo6Í@"æ¦ÛÌ@j b±›ÆÓ@½³“Vi{¾@"Ï1Iƒ=»@ÜÄö¼6öÔ@’> <Ö@¾ä :ÕÖ@Œ¹²$qNÆ@ ™±lüÇ@)Ð~¿µDÊ@ÅGíõŸvÃ@†âÂŽGÊ@¶ÕqÅ@á‘çÀ¼@^IìTÄ;Ã@ŠS‰® Ô@ú¼HÙUÿ½@Ì9’îð=§@„#ñÑÅ÷Ã@Ú(ÇG-Ñ@ÐuJðÊFÆ@‰¬Ö¦¹@úéÇ”qº@<¬Ê£ßÝÇ@/©Æˆ‘“@Ú(c#a6Ó@æ’²?KË@úOú(É@cR>óŒCÈ@}a Ê@ÐxŒªÜ­@aTâÅ#Æ@®Ýû.˜„Ô@ü’¤ò±É­@0% ‚?=¹@t„¨ «µ@)–v'ŽÁ@Ù…ýÁ@”k*Ï< y@2 êng*Ó@jsÏ:ªÕ@3s+À@›]J$ÎW±@©tŸó¹@î°6.¾@DÙ¼k´¨™@ #¦_ÀÅ@RÓšusÊ@ÄÎÅ÷û°@.®§òÐ@‚,%%·üÀ@îk.p×@Ç" }a´@Ø( }“áÕ@‹4Vefv¡@œ}agùÓ@×:ÿ«“òÆ@S™¼~–@Ï@Ò%üîl “@½ãVy'µ@Ȇðá«À@ú>¾i1?Ë@)qØÛ¯{Å@´“ Û„¶Ñ@.ó*ýBÓ@R‘Uìc.Ö@0÷»Qã»@‡I™§ôÒ@¤€òLÆÒ@*_6h¯HÅ@€¼ÛZµÿ¶@:´plŽÒ@¡IŽyÕ@3VÚ%Ö@Áù?Ô+—¨@@º³eÈ@ð5±ñäÂ@,ûŒ—€Ð@˜s([,×@¬¡ÇYEÆÌ@ñÃÐÊ@e£]¸Ò@ðX ðšÊ@,Yþƒ¤s²@ìÖ&5°Ç@æƒ6ícÎ@ŸK¨”ºH­@T+˜Ô@b,~'gÔ@ãn»³›E¨@Ìá¢glÔ@§|úÅ3²@ä]qVÿ¡Æ@õ¬÷uæ¼@¨µüØÀ@Þ8]Z7?Ð@:ÃÖ·XÕµ@Æ…9n¤@9¿ŒÐº@o¤Ç"ŸËÍ@LÛ¬’OÄ@fÉ®‘#0Ã@´œ(½Ò@JÑ—‰@[7?†‹Ùœ@ÏÉ >^¼@}>ß(Q¨ª@÷?ã̾@œ‹e±hÍ@|L§ò§6Ô@³¿ksgrË@VSJƒÓ@¸8—Éà–Ö@%N±yº@LËn0ß³@(qL /«@R6ÂÄèÓ@²’Ù/B²@JíWÌé¸@°ˆTÂã}Ë@ñŽBÏS³@œÂ;S`OÄ@ôhб8Ñ@Î=–8±iÈ@KA·_Š6Ì@;”Éi0¿@ƒ8«Nf¾@þ¾êèTIŽ@öP‹k&¹@ÿ–X+úÁ@˜ÜøP¿§@ûf»Ô飯@¾Ñbtà×@“·ŽMÇ@’ǃÝÐ@ΘdmÆÖ@a¼¿¯*ɦ@œƒÇVi‰¬@’TºQëQÔ@öú<”ˆÉ@$аâƒÖ@®m“4<°@X쟅±lÑ@ëæ¯×c@xܹœ×åÒ@Àžè8º‡×@ õ¶ÎyÉ@tz ævÌ@ ÑdN·¤Ó@¨±ö¬-Ó@Öƒ¾*úR¾@’‡”¢5X…@ zûZÒ²@’áýœÐ@d[Joûž@ ªüí¹3Æ@³ièH®rÊ@æ}A „P…@I¶\„µç§@ü?¶âÛÒ@ aûçuœÖ@›Sœ`ŽÌ@!ŽÁ@ŸïPÊMYÍ@ú…Ï:ù’Ô@* +mÓÔ@ð(ðŸàÂ@³«îï3 ¿@ÿ5–âÐ@¹àã?iš@ÎíÕÿ,)¼@t÷hý}W×@ÒÕ·ÔÃ@ ²o´ëÉ@D è2OÑ@ú÷ƒR[ÒÎ@0 fÛdŽÑ@–|…=œÅÕ@È{–øË@™FtîÎ@(ÚÔºD÷Ä@f(¢ç6´@«^á S Å@)åý~³®@´ggïûkÆ@ÀÇ|ª˜­×@‰ÁâE¾°@eƒqQý޲@ÛúÕXhs«@¯ê1d«À@Jã4½qÀ@­¤®ñÒÇ@>²žÜ6œÐ@Ìëä@Êÿ|k‡AË@‡8t£ª£Ç@”wšöµ@ Z`çÀ@ªf…ç%ùÖ@>óÃý¶UÑ@ÅjXºÊ@˜»a¦Í~·@Xк‘šÀ´@Ì—¢,½‘Ô@кpª÷c»@ÆÊ42©XÔ@Á™‘|=²@ ×ࣇÉ@ýà_WVÄ@v8$M5Ó@”mÅÜmâÓ@ ¤¦Ìú@€Ù¥›Îº@è o°Å@Ó@ßxVÈ@ݪ©=ϵ@ü'TOÄéƒ@7y-šÏ@ ’½B'cÇ@=ráäYñ¢@¯èÆåe«@ÒæÒ­Ë{Ò@*2u}NЍ@ß~q7‰Í@éè&|ˆÈ@´¸2ÄW°@)~Ç@áì ”ÚÉ@BùZ焪Í@á)ÛGɯ@vÐD^½@Äå²{†^»@U(¶¿ž@è„캨Õ@9©3ñ]¾@ îQa6ÕÕ@bAD 0È@àUðˆBÖ@îm¤-ÄÒ@:C ؽÖ@:2bëç¯@PågèFÐ@È/ØŠÚX´@ˆ1ny1¬@øô ‚¬W¸@°å¾(¶?¶@êMËÁÎÑ@í‰0ju±@ÛÖ>À£@ ¢xïÁ®Ô@¢e«ˆOÉ@¦Ò ±¡XÐ@ö™j@ ‰Ò@R™ì04À@Ñ/ ³Q"É@iáV¶g¶@F(aç¡«@Ù %T·Ç@ÎÆw’"¡@^»l#JÒ@ÀÑ>M´§Ö@jÌý¶Ö@ï(KØýÆÄ@×Q¿ä÷ã¼@zTQ÷ÁûÒ@tŒïè!¼@¶íááÍÐ@qprþn¹@õ¼Õ…§@:÷ÌÙÕ@8zêø9ÐÔ@]Áí¶Á@.Ôç½ÀÆ@¼¢xepÔ@ø¸.èqƒ@¬th˜\íÈ@F|6ÛÕ@?^Å:(éR@Mr¶ ÆL±@t¢]p¹ÍÕ@R)ìv ¼@#º:ŠÕ@j‡¥kÎÄÍ@kø¡‚ˆÇ¡@0ð¸ZYÆ@Žâ¯0Ý›E@´DĘÕcÑ@¤BýñPµ@DA;‚bHÖ@2߈ßU*@~×DÁíƒÖ@’—û5«Ò@tÔ;ÃÁÆ@*#b厢·@aèÇdìÇ@jSÅP(@×@¤ÿYœ0^Ñ@ DOºÜçÀ@¥EÈIðJÊ@ÈUÅ|DgÓ@Vcÿ[}k×@~_-Ç1Ð@Fz6“êÒ@0õwý³Ð@¹jÒ³ïÁ@Kʇ1F@¢@¨ †ò×ÝÑ@.ÑLࡎÉ@ï ©˜C¹@ãå¸=»É@{€°¦öË@xkr@ÓÓ@”PŠTט¶@ÒTTyó«@¶ ™ò(œ£@"éœIPCÖ@L [¾êŸÑ@ˆû@)’@óD….§@˜q7I‘Ì@„JSgÊÔ@êlj(FÕ@JéQ„”Ð@–Ý(~´@¨™ RJÌ@å&»^*/”@Mè3(ÆÆ@¸"Ð˃ÍÓ@êÔ,_IÓ@Šnw°dï±@XúËbÆáÓ@KxÔS–@x³@b×@Ìv¾K›ŠÒ@<±]ZDÎ×@0ßÛa¼@µ/^œêÏ@DÁñé3 Ñ@¾«¼ƒÒ¨@†šöÊVvÒ@ÐîœSÅ@¨ÀTmÒ@ ¸=!DÒ@¥¦uoÄ@ãì*§ü¹Ì@¾þ“[Ä®×@èuöÓÖ@ða¡K_DÎ@øÜ©ËŽÞÔ@}\~®¨Bª@/f ýßÇ@ÿŽý§À@E(ÐS`l½@Êûl=Ÿ@`ÁzíF¬@"º«Æ/Ï@6a&õ»±@i¼0u‘¹@0C‹ñëÍ@¶®?Nl¦@mk_¾@îÎÚ ¼…Ò@¦)Øö9Ò@}“¼]Ì@Â?¤J×@晋AôÒ@˜’N,EÂ@¿ÇnJ†¤›@ÿ@žP™GÏ@ Ýc ¨fÀ@;Ö_&zÀ@ ÈGLë#À@Ü^üœƒÖ@õÁZÉ]¢@HVØòšüÅ@J£ ´CÏ@oUT4€©Â@J¤àÇ6NÑ@ _ù1;«Ô@}ÈÂÍú°@HdÝ Õ@vz¼½TÃÊ@ ²Ž?YeÂ@ŽóDHbÖ@gÞÚ5‰Á@üûûGŽþÌ@²LÝ(ØÒ@T$G Ñ@8¢E´Ôº@/—Ú¼ç·@–<>ö½ÒÐ@¤FÍC_WÒ@;` “é‘@R¸”™ÿ®²@Œxœ‘ÛÉ@ñƒ¯š ²@Áx jŠeµ@ˆøß97§Ò@DÜbƒªÍ@­.ÿJÄ@¢r‚À>À@„D˜÷˜€Ô@¡!zÔóÃ@öc-ùu×@î=³_jÓ@bâñ­Ò@ÓIxòf¯¾@w×îãÎsÏ@]k(}Ï@[ªùŠQQÂ@ Ð%@Š^¸@úsçùàçÐ@ žFÎ÷«@4‹ÂzWÃ@LÑ>Ÿ§qÐ@b ®|¸Ç@“ÿë'¾Ç@;^ØXÌ@w]«Ó²@äÏñá1Ñ@R·ÙjÓ@ þ Óm¹@èb¶!ωÑ@ä¹ÏÓã×@_i"\Á@¯qÖÁft§@,u†‹¦z¬@È_4à ×@è}ÏnñÂ@Ù‘‚^éÉ@¢)r.øÔ@Ù“×^u´@Ûé ¼XÏ@é3„Žæ®@I`fãy§@ivÜYÈ@Ï@UO.ú`EÃ@°yÀ õÂ@{[”=(Å@±Ù¬§ÍÅ@ÌèŠn <Å@_ÉË^sÄ@O?mÄ>Ç@33~;,Ó@ÒLX±,†È@,·/•¥žÓ@·“SlI@Î@hó-ö¢Ó@ä9Tß9oÒ@Áª{_Å·@TÈæí9~Ö@¬C6Yˆ8Ö@þËÉQƯ@Jê”Ò@ 7²ï„Â@125(Á¥Ç@ÌV#Ša×@„A¾P¶ÓÁ@b~nϺÑ@ï:Xé¾2Ä@ü϶|YéÓ@øæZ/äùÎ@JՙΆHÖ@R¤—D€ö¤@Gxk¤@ä|š|×@ŽÖÞ¿’¹@´Q iÓÍ@Ø&Å5–’Ö@“†±¹*Ë@ØU´G rÕ@¥ïoûn¢Å@/ƒ¢‚ªíÄ@^/ë6æHÕ@p´ó~öÑ@OAõlü=Å@„Ô’Ÿ q½@¸ì|ùnÍ@*b×9³Š±@æ.X sËÔ@¤À ¤lSË@,’1mlÑ@‚_Á÷ƒÔ@ŠÅçguÊ@:í§¦ï¿@ '€Ü(~@™¸1ø^Ï@ZŠŒ¢>Ñ@§ºý.Á@Pθ8¿Ô@H Ö/Ñ@äu¶ÑÌÒ@ ‚ÆBÀ@žq¾ÛÝ'Ò@Ù’_Fçö¼@­âÐ{uÀ@$H‘ú7~Ð@¼ n.rm¤@ôïsa($Ä@`¡cðXæÖ@‚7X–ËÊ­@r‚–øØ´Ö@€©ëé§šÐ@˜bûЏĢ@«@Yƒ]“@ÏcGcë¾@Ý1"SåË@sª\áË@Ùâ@ £?˜@•$‹°ÅGË@Àªý"\´Ð@\¤ª)ZÀ@è«-ŸP°@ßéGðÈ@.…f=g—³@‘¸¾4ÍÁ@:Ú $Å@@»c4—×@Â/[ƒÎ²Î@Š^þÒ@Øjxìñä§@^¡UøÂÎ@v‚RrEþº@WN,ìÈ@NÀÇN»¼@ŽJåNMÌ@Ë¢ä‡e£@[+îdðÅ´@~Æ'æÐ@ÙÚ×sM8³@ælÑÊÜ:Ó@~£gELÆ@—i¨z9£À@£0°.ù˜©@mxÕªÂ}¹@uMÈ•K À@0@RW#Ó@vÉzìÕ@U„Ž¡ÛØ¢@ðSz_Ò@©‰¥´Az¶@¹Ç Ö —@˜?PLHHÑ@3„¹øÒ3Î@,PÁp«Õ@¢]m÷² ¸@ª$)å/ÏÕ@œQ«%ÊyÕ@ïI;€!>³@@9{,BÔ@(kޝ—L×@îAA ?Ó@ ÖǥȲ™@$ó‘Õú•@Æ…j‰~³@K0 æž@"ÔðËÏÓ@qd‚Nô²@Û#8Äv¤@T›GñŽ6Ñ@ì¤pI!Ì@k§­ø†»@£ó ‹CŒÇ@3%‘×»4KÀš©˜¢”Ì©@¬Ò2×™Å@V žG÷•­@³ÁÃg‚Áª@¢Ô·wCº@Ú@FVQh§@ÜÒÉQ¢Ë@zoÄí~¸@Z™»3ê®@2Šaš"Â@b?j1qmÊ@Èc ë6GÖ@¶†…6­Ö@nú—TÈå²@VîBëº<¼@㬭 `»Î@þõÌê<ÞÓ@0¦{ÎdÕ@-¬™©¶ä«@ˆsg£$Ö@çhOŠÀÏ@¬Ù·¡°kÁ@û‡AK®iÏ@†ƒKÁ»3Ñ@I؉܇°Ë@†T ƒˆ‡¡@¿&@•Œm’°Ï@BFîD¤©Ì@úNOVoÕ@ÆšÌÈÁ@l°ôÇŒÖ@IzàòÚÅ@Þ²Ðô2=Õ@ÔùmG§{Å@'M¦bƒÄ@œ¹DfhG©@¡9óºK©@ÌQå}™òÕ@&p°][ÖÓ@·MµžBÚµ@¾#j[×@ªs'~þÁ@y$æÐF¦Ä@ìÎøÙÕ Ñ@@7H±ùŠÍ@ažu)oÓ@¬ Ùq&©Í@t:àÙܶ@3A7®@j¼»ãáìÇ@ÁpØ«Ÿ¸@oâÚÚç£@ŒJ¸ ¿@-mŒç‚@¯Ú¹N, º@”è3ÞÐ×@‰ÓôíÁ@ç1FÁÓÇ@Jëü«QÖ@Mµëƒ…²@ðôô„nI¦@á ž÷Ê@͇!¶³ëÀ@‡*tÛ›åÌ@LÂlä°Â@‘ß‘)ÕÍÁ@”‰¬¤CëÀ@®&ÚÄÏEË@â?ºÌ¾Ñ@†~a ž×@J¸äı@ãd\Žb+¯@.q„_¢@ã#Ïîhù­@ì ØcÌÀ@Õ(Iñ!²È@¦™7•X¹@ö©¹²—îÁ@¼‹ÓÒÓ@ì}%e(É@Ü·*ô½¼Ç@wÉM§ÝM™@´aϺ×@|=Yµk¾Ó@8ON šÐ@~X&ÇLxÖ@R»Û€Æ|×@V$2JmÑ@ú”sþ`qÒ@’¨JDæs¿@èÔlב`È@1_ø–/»®@"¾@¢Ç@·Çu<=àË@¤‹=Ê@b!óÉpx¨@€ÍáÔ@Ðxµ«?¼@¹í¦ì»@@cæ¸]ÿÖ@Š–_HpÂ@:š9Îä|{@D%¿ÖŽ›@’¢»Ñ¿ Ë@€d"CÆÅ@±'lÑ@|öHúÜQPÀ¹§º•I3Ç@GÿÐ=ËãÏ@táó+¢ÿÐ@ôîf ƒ˜Ò@¦+2^°Ñ@ˆ_>JÑ@äÀûqˆÔ@d ÖÏ]Ò@šÐýùkÅ@tFJiÓ@½Œ¥TK"¹@ïEåæ1-s@£Isiž@û·½´“v@üÃ&'Ó@L˜x[¾Ö@Z)ÏâGÎÓ@ìÕו'HÆ@·0ËrË@8·<#¾@£šX¤É@¹Ô³~tóÃ@ûg7Ìv®º@(µÿ2¨Ï@XÖ'¢@F†¶pÛñ@a°ïuf ™@&ÀÈ{üi@´î¬Ú¸@i>¾ÌìÈ@‰Iò[mÃ@ÊÆ'CÖ“Ñ@j”ò[Œ·@âP‰‘‡Ñ@ˆhá_—¯×@WšiKzÍ@–u«0¼@ïKíã±Ì@Dµ§…ŠŒ¼@þ_µ+B¶µ@Î$‹Ð@Š+!⇩@ v¨UšHÊ@›UR>Ê@>åªÉ3'Ô@6l“W-¬@oÔ1Û3žÉ@ð4azªÇ@KSî:ÐÇ@Zvê4×@š¢ àäîÏ@ˆ{öu°³@&Ý´æÁÐ@œŒUDŰ@`­äÀ§@K3KÁÍ@¢à^\Ï@¬,º~1ÞÊ@XwÚƒîhÄ@Œ˜¾¯¯Ð@\*œŽÕÆ@tñ§;¡ŒÎ@ª[Y­C ¦@WC¾ŸR·@wÔÉÌÃ+²@Ƽ]ÊNÂ@‹Sä-&þÁ@‚*Ê´×@úãÅ&ÒÑ@6õ´r”Õ@eFý›˜Ò@—ü—4¡@Õ Š´@ªKÇìæÒ@KpùR¶Ñ@!68lÔwÅ@w € É@*£&X~8Î@²{5ZŸÒ@”3}‡´†´@ŽƒÇRQ<Æ@\‰´‹(Ô@fÏëýòžÑ@ƒª6<€€Ê@ü¯²Ó@l0­±Ö@ÄÖWj‡E°@cü=Ð@É$¬#…%´@ø‡`ŸGèÈ@>.lj”@¸ÉüÞÊÓ@º¨:9̆Â@‚ë7½ÞÒ@ËR¨ÅóÑ@¶7à9}xÃ@8V/·~nÖ@Nj”ÂÙuÕ@2!)(3à”@J™s¶Ð@°)1¸fÒƒ@‹Qò®4ÌÍ@õ qrR@ä¾³¹lÓ@ w5MþÕ@´ô÷È@Ö@¦'§$Ô@† ë´$›Ñ@ܶW*¼@–Ïò-!¿×@³ Õ¤NÂ@îxjÒ_¾Æ@Ô°M¥´@À‘î™\Ë@¼«Ÿ¯@G‹ˆe@½¼@U_·ŒI³Í@òŽ<楣@¢÷,®¦!×@‘z`²dlÂ@XVW\.“Æ@ÖUþWøÑ@yµmÜÕ@ü2˜+Ñ@³ÿ½ø¦@ü!­ÙûÛÍ@­!j‡¦®@âž^ÕÕÖÒ@âë‹oš‘Ò@‚Ú_jŽfÑ@‚ê ãÑ@ÈãÞJ¾Ñ@{%2%ÝÆ@ÈŇ «@‹GÛ•[Ô@ŠôLò@N¢@¿Cˆ²íl½@¸aáÁm°»@lBÍ“bÒ@6b×&Ë@öoô;—·×@ZÐô¿Ò@¡ô|vîÚÀ@èþv:cØÐ@_—ãØë”@´bÙÒË@ëØJ™ÌAÈ@¨ô츮ð˜@º¯¨Ø=ÄÓ@‰&ôýSÀ@d¡Ñ¼ç³@Ì[ÎHº×@ ’³å·Ö@2C6ÚÒ@ê¼/¶:Õ@öa5ŠäÓ@ …ç‘ÅÂÐ@.ùÍk Ð@ƒ0ö ´@(¿Ê?'Á@ó‚[¦(Ó@øá€„ AˆBâˆH„"ÁˆF8∄$&A‰JXâ˜È„&6Á‰Nxâ …(FAŠR˜â¨H…*VÁŠV¸â°ˆ…,fA‹ZØâ¸È….vÁ‹^øâÀ†0†AŒbãÈH†2–ÁŒf8ãЈ†4¦AjXãØÈ†6¶Ánxãà‡8ÆAŽr˜ãèH‡:ÖÁŽv¸ãðˆ‡<æAzØãøÈ‡>öÁ~øã ˆ@B‚ä IˆB†8ä!‰ˆD&B‘ŠXä"ɈF6‘Žxä# ‰HFB’’˜ä$(I‰JVÂ’–¸ä%0‰‰LfB“šØä&8ɉNv“žøä'@ ŠP†B”¢å(HIŠR–”¦8å)P‰ŠT¦B•ªXå*XÉŠV¶Â•®xå+` ‹XÆB–²˜å,hI‹ZÖ–¶¸å-p‰‹\æB—ºØå.xÉ‹^ö—¾øå/€ Œ`C˜Âæ0ˆIŒbØÆ8æ1‰Œd&C™ÊXæ2˜ÉŒf6ÙÎxæ3  hFCšÒ˜æ4¨IjVÚָæ5°‰lfC›ÚØæ6¸ÉnvÃ›Þøæ7À Žp†Cœâç8ÈIŽr–Üæ8ç9ЉŽt¦CêXç:ØÉŽv¶Ãîxç;à xÆCžò˜ç<èIzÖÞö¸ç=ð‰|æCŸúØç>øÉ~ößþøç? €D è@J‚Ä 9èAŠ„&D¡ YèBʆ6Ä¡yèC ‘ˆFD¢™èD(J‘ŠVÄ¢¹èE0Š‘ŒfD£ÙèF8Ê‘ŽvÄ£ùèG@ ’†D¤"éHHJ’’–Ĥ&9éIPŠ’”¦D¥*YéJXÊ’–¶Ä¥.yéK` “˜ÆD¦2™éLhJ“šÖĦ6¹éMpŠ“œæD§:ÙéNxÊ“žöħ>ùéO€ ” E¨BêPˆJ”¢ŨF9êQŠ”¤&E©JYêR˜Ê”¦6Å©NyêS  •¨FEªR™êT¨J•ªVŪV¹êU°Š•¬fE«ZÙêV¸Ê•®vÅ«^ùêWÀ –°†E¬bëXÈJ–²–Ŭf9ëYЊ–´¦E­jYëZØÊ–¶¶Å­nyë[à —¸ÆE®r™ë\èJ—ºÖÅ®v¹ë]ðŠ—¼æE¯zÙë^øÊ—¾öů~ùë_ ˜ÀF°‚ì`K˜Âư†9ìa‹˜Ä&F±ŠYìb˘Æ6ƱŽyìc ™ÈFF²’™ìd(K™ÊVƲ–¹ìe0‹™ÌfF³šÙìf8Ë™ÎvƳžùìg@ šÐ†F´¢íhHKšÒ–Æ´¦9íiP‹šÔ¦FµªYíjX˚ֶƵ®yík` ›ØÆF¶²™ílhK›ÚÖÆ¶¶¹ímp‹›ÜæF·ºÙínxË›ÞöÆ·¾ùío€ œàG¸ÂîpˆKœâǸÆ9îq‹œä&G¹ÊYîr˜Ëœæ6ǹÎyîs  èFGºÒ™ît¨KêVǺֹîu°‹ìfG»ÚÙîv¸ËîvÇ»ÞùîwÀ žð†G¼âïxÈKžò–Ǽæ9ïyЋžô¦G½êYïzØËžö¶Ç½îyï{à ŸøÆG¾ò™ï|èKŸúÖǾö¹ï}=ð‹ŸüæG¿úÙï~øËŸþöÇ¿þùï  HÀð€L ÈÀ:ðŒ 'HÁ Zð‚Ì 7ÈÁzðƒ ¡GHšð„(L¡ WȺð…0Œ¡ gHÃÚð†8Ì¡wÈÃúð‡@ ¢‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈÅ.zñ‹` £ÇHÆ2šñŒhL£×ÈÆ6ºñpŒ£çHÇ:ÚñŽxÌ£÷ÈÇ>úñ€ ¤ IÈBòˆL¤"ÉÈF:ò‘Œ¤$'IÉJZò’˜Ì¤&7ÉÉNzò“  ¥(GIÊRšò”¨L¥*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌbó˜ÈL¦2—ÉÌf:ó™ÐŒ¦4§IÍjZóšØÌ¦6·ÉÍnzó›&þò 5pxl_row_in_fullresÀ¤¸¸¸&öÖ&ƺŽ\–´ä×@|öHúÜQPÀ(Ž\–´ä×@|öHúÜQPÀ,€œŠœLÀ€Nôÿ&˜ÓùT&¨Ê@ÄØE@~›@%ÄôÀ@]û)3ó¸Ï@âç¢M±@z¤£Ò×hÅ@¼½)ùÝã¼@H¬F‰ØÉ@ñ x’ˆøÏ@]sí¥ã´@(§–´µÎ@±²@AŒ˜ Í‘È@|eß@vª@»UÞøš³Å@º¸~&«Ô@Õ²bÏ$ Â@5 ¼¦Ï·­@ŽÎò†¾@nt³ [W«@ì„äÇ“RÁ@«#‡Ixg½@áe¸ãB¿@࿞Ÿìª@Îâà͸ïÒ@„ïÈÕ!‹Ä@Ðæ iÏ^¾@ øüÁ²Ò@š& »§7Ñ@‰X¤…À§1’ ¿×@ í`@ôsŸ7*Ñ@><:ÿ€îÌ@F"ÑÜr®@<×Ìõޱ@´³žÑ¶@ÔäÎ Ge±@kš‚)©@ecp?¸§@xy °/·Œ@Ì Ÿo£ùÓ@aÉ«ZÕ@.Ü5;6º@ðõ6þÍ@:@`ý„Ó@yrê ð½À@n.̲ðÀÞ&Í@lYƒ.ª@ÄZ•ØœCÉ@ìM!0YoÀÝ´F^‚Ñ@÷²»ÒF±È@$Mg”Ñ—Ô@U:p,1’Î@à’­‰Õ°@+bÞ+°@‹ z>sŸ@­r¡cÓ Ô@Ú¨/|Ð@ÿà ¤˜BÓ@ìz|}–«@O³áÌd±@³–‘'f~Ò@Ëb9,NÑ@6eÔ È@_ÞÛº@‘<ùÁ|µÊ@– ¹@J€%Æ@ý²mw‹…Ç@,Çh>›@„³ ’•Õ@™.Æ—§`Àé&HB|±@ *I™ÎÞÆ@§=–‚¹ÁÍ@ý_ ÊX¡@Z ‹œÔÏ@íËé’»@w¨ )Ê@Љ×+<­Â@”yB•bË@)jP kwÀzzjFÇfÑ@NæÛ"³Î@žgÏ~ÐSÄ@3oz<”Ò@Ùm Oôs£@ƒ±ëª@YÄg`µÓ@³Ü×W¦/º@œš"»{ó¼@ç½/}ÓM·@ÕõéÿŸ¢@ABtj•¹@VmÔ^^wÈ@{¶$eú–@@|pЂ½@ÌÔ0èrÊ@@ñ¾~¥@mû®³Ö/Ä@OäZ2a&Î@l[yíïÕ@Ï‹¨IðLÉ@çm³ÚýÄ@—fyñ¾@î÷¯”CÓº@²Jî0ˆÄ@¹} Ú½@( B¤Ç@°)‰ãM½@eëó™34Ç@P|tiLÒ@T§žÑ„@'µ:œÆe@¼ïÞ¿¸@»¾¿Ë«¥Ä@`L™}ZÂ@Ø „õ¡@ebm2ÃJÒ@ܼ‚·ÕzÀÙëeAÉ6Õ@ ¯O6¸†Ö@–„˜ßáf@dé¢d¨«@vÃô*ÁÖ@ÛüÀ?0ÊÖ@ùö ©AÎ@b^ÍÔÐÊ@>ó“¿@Ì·ÅÌ0Å¡@`*¯,Rš¡@$1÷ˆ¾¢Ï@K…U¶Ù¬Ö@(“&kls„Àw¡³æµ@+§—œA˜Á@2&nêÈ@†œËC4Â@.Vli…@h´ÿðBÚ«@g_¾*„ @`橤ÓòÔ@°==1ÓîÏ@íÕÛizÉ@.gé6DXÅ@WzÞ¼Í@RQ£,PÀ@: 쥱†@rLæ‹ Ç@ш›L†—±@ÀôÊ@2‰ `ö´@ÜEñØ;Ó@‹AC 7¾@ÔåÙæÛÃ@ÍfjdäÕ@)µÌ`*¼Ç@ÝùµÐ@ŸŽ„ªÕ@5X¡bš@ÿ0/þ«k´@O[;e/£@¢Í›|‹}º@ʬÂGö²@h‹îhCÐ@â٥ľ¨@¨u¯ZÉøË@»S{ À°£ÕlðÁ@½ƒQàÒ@ò¥Í°)€Æ@…µæ„Ë@¡M³üœŽÅ@†n“åŽÙÆ@ƒ#‘=Æ@ÐLC—R Ï@£¹ýjw-’Ê@{שWPéÍ@SÝz–âº@ªK_z Ñ@;ðe’´@Ùä‹£Ð@)@Ò¤„OÖ@n`ê/IXÏ@Êá1–toÀ˜LÍýÔÿ|À‹jOÖØ¾@;‘ùwFƧ@­ÌóSÒ@*jû¥P¼@gx¦­$ßÉ@ž1õ Ö@¡]ýÑPnÏ@Þ¶¸àb·@-†ÞÔÃ@«Jñûθ@ö!)µÉCÎ@n Â4Ó^ª@¡:] ¹ôÖ@@ü 'ØQÖ@ºŽô´-Á@,œÀ ¾Æ@_+{]jÚ®@<˜~ã.Ó@5Vv¿5¶@Ò¹u”¶@\avÉɇÀ“ú›åÙÔ@|$4m×uÀ)ïžB]%­@m(QœVÆ@¦k]§«…@éo³HùË@¸W"%6Ö@"]}}Ñ@ÚÒO½²íÕ@Å_®H,Ð@Î÷°t½Ê@®fÖ}A;Ç@Åy¹¿Ì­@—]Ç Ð@w7cë_²Ö@ühîH7­@B•Ÿa+5Ò@;)ù-Ô@bG»è)£@˜¼ ¸LÉ@Û.,Ž)÷’@‹ŠðØ óÅ@Ý1µO`¥¹@×y¡ $Æ@ÍÅcrìË@8nѾÓ@o©^MòÖ@á”°4êw½@ÚpåOiÉ@Ó¢ñÀ@Л5UˆÌ@D}!¯HÕÀ@íè`fkëÓ@IO!j,çÓ@ú[¹ÇãìÀ@®„i%fÆ@GgÒÉ$¨@ȇdxÛ³@HQ¯NaÓ@"ÅÕæx vÀÅMËÂŽúÐ@žm±™@k¢ÿÄ@ΠMéκ½@ºáòÞ©*ª@ò~Wüw¾Ñ@*b=8¨@gø»3›G¨@hóL&þÐ@ÑE­®C£@íð³eµ=Æ@›S0¿é#Õ@ƒ&ËëÁ@^ަüeÇ@BG)¯ÿYŒ@GvÇÃålÖ@EX¦ùsõÕ@»Pç ͹±@@ÛžG¾Í¦@­ó+½‰“@ªÐ°C¾±Ì@Ì¢ÊøÇ@F×öûs/‰@3Bº?‚¼@¯û X8©@(Ó–žI²Ñ@|Ž·N'pÐ@%2çG™r¦@yªùÂÃ@Å+lü+>Ê@ôv@cyÀ»É„Á¢@³úkeÎ{À”‚P›Þ1Ë@Kf(Ùû-Í@FMôÜ>Ö@9Ÿ+›bݺ@ù[™},Ö@¼– '¢Ó@߇’½Ô@‘õšŒó·@!Ë<‡Ô@B¯õÿ¿Õ@¸U6ebR¹@Æ„“°«¥µ@Ô½û0%M»@r!ঠÕ@ÞïDÕ@SÓ³‰UÎ@¬AüOÕ@DZ£ø†ÄË@³O©n| @p’ ÄÏeÀ„pxoó&¼@jYðS2 Ö@‘súþôòŸ@K¶Öõ{Ó@0êM­t¥¢@(Ã8q.Ç@qz@w:Î@ùÉÙø îÈ@|úÏÿ¹sÒ@æEòž*´@ôð—¯Ã<Õ@v~õ}O¶@V–¡—US­@¼äýùI @$±q¢ª„¾@uKVšü¶@òfn6 X¶@WDjŽó”´@ 5Šlå¼@¯®ü?ã~Ê@~Æÿ€¹‹Ï@âidÐPÆ@Ì40¯¯gÈ@×0$O1À@Ö]\¯mÖ¹@=*ÒÒ•'Ò@AÐù³äÕ@¥BéÛùÖ@‚ž÷ø‰†@Á…3/”>Ó@’þðv+Â@xʈ«‚Ó@ùN<éë9Õ@ÕU,ñ ¯@šTXŸ]÷Ö@çÓ¿"‰·@DÝeqÈ ½@_faRúÔ@EŒ eÚÎ@‘çŒmÆ@„jçXFˆŽ@Åk¬5kÖ@n»\i×Î@ Rç<ãÔ@BE¦Ã¦@;ÄÇ«ØO±@kgÅóeÑ@Çê¢dÖGÎ@É…mŽ0Ò@°Ï"«Ò@‚ P,–ª@c]‹›…™¶@$ ÉFÏÕÆ@ýœyøràÐ@`ñ%IÃÔÓ@£(ÙÐK<È@àc$ #Ô@ pÌCÿºÊ@Õcµ£ùÈ@x“qÉâ7È@È“F×·@Ì6HÍ ëÁ@{–ÈÌ€)Å@s:G-¢Ç@_lUùž=µ@; ÎðÞÕÐ@‹¤!’dHÇ@ˆÐ´9PÖ@‰çŒ%i¿º@Añr‚ñÒ@V‡È%Þ©ˆÀÇD^Ú¢õ¾@ãb¦p„»@Û}AÏ& Ð@ZŒÝµZwº@‡8 ¸÷Á@¿)ÚÕÓî@[ÿŽì¯Ê@¼;/™‡Ô@·\Ržþ‘Æ@îGýpÕ@*U›ÂgŠÐ@Ë­R2 @ˆG< hÃ@ÂÆFü,Ö@¯Æ²ÿAmÏ@B~ç,¶’Ó@ÁßÉšÁ@Ld§b?Ö@O*ç3Ù8Ì@}3:R\éÒ@Pû:¿q"É@ÀšHÈÀ@¶qd_Ã}Ï@€KaOÓ'Ê@~ 9º_tÐ@ñmDà.¾µ@‚»-•ì«Ò@gXgü"ÍÊ@Ég•’cB¹@Ô„¦`µ@Þì G^ÑÓ@4™*a~|¾@ô Ž„LÇ@AyX*¦Ð@$¾§‚éÞˆÀRΞŠtD@¼ ÁÐX±@ðPt| Ã@ ñù yÏ@“`íÙâðÆ@PôØÈ³$6À^yÈš«@ã¬eOñþ´@¡ÿ¹€.^@E°+É ·Ô@Œ-1å1»@òM 1¤­Ð@ƒŒgâ.ûÇ@ÆXl¬‡Ò@»R§^½@«Z“ Ç@ø4üØ>G–@ϕӱÓ@Š€'“0Ã@6?ôÂ&£@|-y­äÈ@Guå’³éÖ@²Ïa÷Ò²¼@‚C•ŽHÂ@-þ‰ ±Ç@Oñ“3€@ª ¾‹âÀ@°Í u&Àº@¦§ÏÏ@»–l|^é•@äÇ®ÂÅ@¾"Þ›ëd¢@œ=Ä_ ÃÓ@ìx­s¼@n]OÕRÇ@¸pö{)ÖÐ@J#{Ð ÜÕ@€º0.5%Ã@÷.¹šÕ@PZ6pÂÎ@Éi^MÖ@yå4ðž„”@vïï` É@9{zÌÆ@âü¦Mw«@8×ãU/D™@rR:XÕ@#¡…Óv`½@^î©ÎæÐ@ô™éV£Í­@îL—ùK{Õ@P1kˆu$Ï@oÁ§ùØÐ@ë-”¥ÒG›@\?~†ÛË@Êq]\€@YR|16³@1dmª@Ä@®ÈHËPèÄ@€Wh,õª@½huÝÐȯ@§ÞöfÎó­@5ÿ‰âîÎ@mssŠzñ­@;P@zGqÕ@ξí–G!Í@èB;ðÅ|Ô@„ó}žØÒ@š]è§x#¬@ç÷ÝMM“¿@ïÖú¿Í@sºqVFw¦@fÄZ‚7Ö@…FDzÔ´@ä–Þ=fj}@s‚s§Õ@æ,ýoÀ@çÿ  µ@ö“W½@Ó»À¡K¦@1R‹°-µ¬@B1Mã’Ñ@H#u¸TŠÓ@ÙW¨Ë‰Â@ôT¡åäô‡Àkø Ò»©£@64nKýkÀ'š×ÐË@s') éµ@7æs®Œ´@6Aûþ€®Á@Wï#èy@Õ3f“{Ë@XA ì[Î@‰>ÆÎ|Í@>ÛØp·Ê@°ž²ŸRÀ@¨È‰¶½‡@#¤“¢Ë@€â@‹Ë@¬ðšEÐ@+ì¹ HæÏ@Ùo‹Ñ•sÖ@$g»éV¶@ûÓòtæxÀL öëmÕ@"yR©¿@E»þ•j³@=ÐqÂVºÔ@\䱈½¶@ømÜÍÏÀ@€î æ*©Ö@rÚ°i}Ó@]¨˜TqÔ@]úPœÂ@Û·è®ÓÐ@ñ~˜w¾—Ñ@"ÈPÙÈ@O‹Âl»@ÚRoFðeÓ@°zá¡Tb‚@TÃ’ªzêÍ@¸<ÏÎ5Â@H#-ê ×@e;ÜÝ,±@CÀŽO $¤@oéܪ×@]7‹ZKÑ@Â}vß\ã¸@h²§nþÀ@bšÓ }5Á@4™F±[Õ@Ø!)bV¦Ç@vß>(¢)Õ@]c.ôr¿Ð@eh·Uõ¼@œú'+4ÚÅ@ Ò}Ý€t@gÙ*Ö@]«ò_Á@@U˜¢Õ@7!*å]Î@Õ\±ßÔ@OåœTÛÃ@Ô¢[‹ ,Ç@ÔŸºöÁ’ƒ@¾¤îúõÂ@ÛQ1:ád±@”†]`o'Ó@¨V»Õ$¹@-ÂÞ™ÌÙ¬@’Xy@)·@«Æs¦ÒÁ@xf%öû^·@ITÒ²"Ö@J5" ýÑ@¿ѹF©Î@KøTý=RÎ@Ÿ Š-@UÒ@Ú9üàíMÑ@çTò&§>Ï@ŒUÑÀ/|À0:èºÄ0Ô@T^ŽÍ…@¤U¥÷Ð@> OF+EÏ@déÂ>@„b1ÍPÒÃ@¡J™±¨…Ô@*ûLX“@%ümפ°@¬ÏR^ÒEŠ@˜ö¢\…Ƹ@VyZØŸÑ@9”Ð@éî+2úÝÉ@œ«ämÂÙÕ@PÑ4fß²Ô@‰eã·-Ë@¬£¤[Ù¼@ˆ}Ãh*¤Ñ@ýañ=¶É@xB$ˆ¶Â@̲08¶+Ê@T: ±CÆ@pPûVíÊ@Syf|EÔ@õ½@T`bÌ@GóÙ Ì@Áê[¾@Ñ•dˆ±Ä@œ SК@§»„»·@[j^ÏÐ@?vîwîÍ@¤!蘭kÑ@ÀÖLzÂÔ@’Ï×ú[mÀH"‘§°@ Á¥=²@}ÿ\2ʺÐ@²àôsåW‹@©$,vu¤@â½ÕÉ@J°F­áE´@³ZrvðÓ@ÕöCÇÍÒ@ Ÿžÿ½@ç!j“‚”Ö@häI}Ò@"içÈïÐ@Dü !ÃÖ@Â8¤xk@אָ­}©¬@ˆ.‡å‰QÉ@ußâMì»@Èiô °@„åì °@l$Õµ¥¥@tÍ ü½.»@0ô½D–þ?OZ{—Êc¦@õ°‰vÖ@ÕÑ utÖ@O¹ƒ%1xÆ@ó²8u+Ë@`«bKbÍ@¥îšê„gÏ@H‡È/p±@C¼_‘`­@¿Mfá§Ô@s‰FÕ@+"¾`¯¿@ðôV‰Ò@a·c8tã@ !HÿSûÆ@Ì%_™2DÇ@*IJÍE®@9åµÉypÅ@{±Æ„éÔ@Ä'þ¢zü»@•3³Ã@“Rt¿CÒ@$…Ę”À@ï(+ ¯®Ó@ø©ÿâ½@¡AúýÊ@ô@Ö)4Á@ÕÀÚóºDÓ@Ž!ï[P`Æ@ªí-ŸpÒ@â˜X'xÅ@ýû/veMÑ@,SÃê†èÆ@&xã©Á>Ó@V0ÊNÈÐ@뛟Ö"Õ@ÊÑ>`Y¥@)Lß1Ë@ð4Ur jÀi‘H>»@àzF5(,Í@¼\P?„öÑ@T â½÷‰À[^óx#«Ì@;eŒºÐ@ßQ½°@yoj[žÎ@iŽS×¥‡Ö@ÊNñ4#ò³@}[;ýÔ@•q³ìÒ@®œ­ÔŸ@ó„HU Ì@üá_ŠûÇ@1ßöÉÅ@dÝýÚ´Ò@œ tqq¼ˆ@NîÎPà„Ð@3¤ñ÷vË@ Á[ÒTÑ@¾ ×» º@÷çÛ‘¢¡@ì@R«Ô¡@ø´¸—R³Ô@‰/÷ aÔ@ì®ÇJÃÌ@ÉÕ\C^IÕ@Û“Ú^­…’@›öU®‡Ñ@ßA»FÎcÄ@1 Ÿ›!Æ@•ªÑæ,+Ò@Y§*»Õ•Ò@§/3„šAç´@Tâ 2ØÃÅ@%ü|eÚ¶@Ið™‡Všµ@Ϲú­ÀÍ@«È‘ÀH¹@¡b§laRª@Ië« õ Â@>QÐï[ƒ@ŠácdR¨@‰ÃLtÊ‘µ@^ݯ\pÆ@¯îN!„É@(,ɱº@?¬T62‚Ñ@Õù:,®±Ä@ˆ‚51¶±Å@à••ã6Ö@û^¸ Ÿ²@°¶KäõD¬@4y Há’Æ@är4’¼q@ð*€ ïÑ@‹e2}¬Ì@·DŒáÐ@Ý€cª_LÕ@PWŠÎ@wö(‹þµ @ï;£3)Â@žU"=Ü>Á@{Ш#Ê·@©L¾z¥²@N*”ƒ5µ@„„(J¨†@Ô¶ʇµÕ@H{u¬NÂÍ@ö«yz™PÄ@í&ùÐ@Þ9«6mÓ@bw¼ê/”@ÏGõ±@¶@ÎuÞsT²@ç‰^zˆªu@`³€ìª•Õ@+ÜeÓ7ñÕ@?ò~_¦@Y‹Í@²@]5ÍçŸÃ@>šŒ|„z¹@÷œ0ûÔ ¯@“u¨Ï@û]mîhÀL| »lÒ@–¥%ÎÆ@*b62ì9Ó@öØw"rq¿@ߟ)¯Ñ®z@Ç1G¡î¤@s_ƒÔ…¶@´ÍýŽÐ@©;3yJº@ƒè³eÒ@~½î´ä¦@ ‘ýÕø–@Ô‡×ÒRž@ünó‹±@ÕÀ“  ³Ä@ª¾XˆÄ@Nç¼>jkÔ@í+µ Õ@^š Ý2Ã@€œž/QYÊ@ŒÌj¹§@âMïOyÉ@Üu›ô·@ÕìŒýÒ½@×)7Püv@Üøð·—κ@Õ(öŒnÄ@G6§òãÕ@gÃzÆYÁ@†¬f£¶N¡@Ü{{RWtÍ@ znºÏoÐ@]N Þ©°¯@R1tÅ@pf¾ÆÄÇ@MÅpÛð²Ä@ºãfõv¤»@±Ò©}]wÖ@—(¤ÉÐ@:Ë>6ýÑ@%$º†µ@öå7'¹@ß’¯±ô»@njCÓ2Ó@•düÔ@ªPíeƒ©Ö@D¤ã©nÈ@s8gd Õ@ è5)·Ó@þïìJ!Ð@¬= ›ŠÚÅ@»eï¾¹8Â@ ÒêR-à¾@¨„¤ãB‘@ôPP9]Ð@å]Cê‘«Ï@¾ìD8UÔ@flŒ:ºÐ@à—Í/»„ÀÔÄ‘›i§@3«5ŽÔWÑ@UªîxÆ@É®Q?–£@œ‘Î@A];¿Ã@âÑ$÷à@˪Ð7Ð@«¦áZÐ@3¶†»@pi\d»ÿ˜@"9áVƒ`½@źPlv0Ö@§e'd—½@²GypÊÖ@@VIh´€}ÀÁh·&‹µ@Pñ{Z̨@Î¥³¤Þ¦@Ó6͇Ó&Ð@„BR‡ÊÖ@Yp¶vö|Ð@x¨G›8ÏÐ@ŠMDŽ]ï´@в®§\‚Ô@ØÙïÚÒ@äºUËÃ3·@Q¿'LôçÍ@8rÀ‚˜ª@+üïOϪ@ù‘·£˜0¸@/újø©Ö@R`¢¤Å@x cV8¦@Úpiºô»¹@–=ø¯’Ê@/Rk5£@˜üüJžÊ@ïõÕ[Ë@ÓxÈp°Œµ@×ÆÆ•“ÇÌ@@Ó•–eð @¨sp¡Ä@*']S‘±½@Íœ*ëOÔ@õ‡ÉÝtX’@G‘¥{†°@bÕ°‡#•Ô@Ìo«€Wµ—@ŸÀ-äÞÑ@¬D³ÞD²@P`ƒfSÏ»@ ”;d)wÌ@3B T˱@8IŽvÜÔ@øBåtÑÍ@˜?h¦WÐ@C“=ÝÉ‘@ÌÈ:9)“Æ@y½”&¼ŸÍ@Ñ~Š™Û~Ð@1»¦œÜdœ@‡<{ä$®@˜6÷Nc¢@“K©ÑCÖ@ÌéÝøî}Ð@Äã ×6nÖ@I±îr Ô@ûј¨P¾Ò@Å7—HšÉ@ÿ0JtÑÐ@®µ•úÁ(Ñ@•Iྫ§@M*‘)@®@`ïCÍ,¹@ã—$UÂ@¬wÁä°Ö@üâÌHl,Ó@ªÓ=…ÆÂ@¬2¤ÊaëË@çÓ[\(–Ö@Ø¥«ëåªÕ@\vÇ<|ÕÌ@`tù"³ÿÖ@šÓĶ@&2ùÓ@ÅÃÐÔ@éuͦ˭Ô@í¼âzàÅ@§Kë^ûÞÄ@k6 ·> Ô@VGÉ¢¿ìÆ@‹ò@Ë|ÀÆè<ÓxˆÈ@K6·P´›£@˜aaîZ`Á@û—‚ÇgøÖ@¢Š‚µá÷@m GOÍ@÷Ðc2‚Ö@ÚX&¦ãIÒ@‡Qõ{ÆÎ@Õ+¨>ލÍ@ ä^˜èÑ@¤}›ÍwÆ@ÐßP:¶@ͽŽ5Ò@ Âo+·rÑ@÷±‚ÖtDÕ@æïá¾Æ@Hæ^ËåÓ@ÿ¶Ñ¤^ËÔ@ œo™¨Ë@E8rnÑ@¾'ûï5Ã@ë??ºÎ®@²}úÛ»Ô@°*éžëï­@~ ?rjŒ´@f··Lž@¨Ã-d Ö@h,'i¼½§@b-ëoŽÀ@mŠgˆ Â@ðUæ†}Ò@BAÖ>9é½@˜Ú¹CÃOÏ@h«¬cÍ@ND±²ë~½@e)fè[½@Ãà¼` Â@Ui#¬tÕ@©ˆÏý(µ»@¥»xa$›¿@n¥Zg-ÛÂ@çg÷Œ_ ×@ÕÌžóYÒ@]Y–ýL”®@¢Z ܼ@Ñ–¼Lº$Â@øïÚ|Ç@£—ÿ™ÙqÐ@HQ*·Ò@€…AÐ@ª~ñY/Â@yuj ÇÊ@ ­*õÆ@²Œ¨‡Ö@Õ~.šÏ@ %çþ~Å@žŸHg§¢@hÍו‘@‰ýá[µÔ@…Ôä¯ÞSv@/”X°¿¸@5,O™”—@¶<ÕüSkË@3ßX¶„ûÌ@ÞùjºëÆ@çu±Aи@iÖñ!¥@9õ•= þÔ@âÓ™|ê»@ìêê]>Å@CºÌae¿@7(õ¶é¡@R¨Ä8£@º8„¶@GÏôæø†Ì@c˜´—Ë;š@aû/e²¼@ÌpBbE_†À²'³ÖM†ÀÖ%¬†‚m¬@èNWè1ÖÔ@ó=CZv‚Ì@^MIÀX¬Ï@­—²S¤ý¶@¬zÌ(>e­@×kê9î£@>ûµ´ÖåŽ@íeÖ=ì½Â@Ãß¾–±@q[§lÊ@9/e˜ïüÐ@\”ÅoÇ‘@@(¦DiM©@…(s€Ñ@[³JÈl @`9ÕX¸t³@”Î 8ÕbÎ@†<>²ÐÈ@‡åõ‰µ@2Å4˜‰Ó@¿&‡ð¦°@Ê`‡H‡«Ã@3áÄ™õÑ@Þé¤õpÍ@F<•ÿض´@ ’›Ø·e¬@t¾wÖ„¶@¿ÝÁ !˜Æ@Ö ¶r¾@~ᣨù¿Ç@æ¥ëENÔ@©ãB`Ò@ïkëšDÖ@¯¬WPØÂ@7^“%>Ö@Ê¿5Q™@»?pÌÖ¼¢@(šGº@J€žYÔÒÔ@{I¡Fã´@¤-áçÇ¢@”"LeÍÆ@PîÞ†Å_Á@7ÔÎSœÐ@€©Oà˜Ð@ß–4T­¼@¬aÖÓ@\ÿ/jÖ@—328E½@»CÉBžóÐ@;ü¦ˆ™ÀÄ@Bøá€„ AˆBâˆH„"ÁˆF8∄$&A‰JXâ˜È„&6Á‰Nxâ …(FAŠR˜â¨H…*VÁŠV¸â°ˆ…,fA‹ZØâ¸È….vÁ‹^øâÀ†0†AŒbãÈH†2–ÁŒf8ãЈ†4¦AjXãØÈ†6¶Ánxãà‡8ÆAŽr˜ãèH‡:ÖÁŽv¸ãðˆ‡<æAzØãøÈ‡>öÁ~øã ˆ@B‚ä IˆB†8ä!‰ˆD&B‘ŠXä"ɈF6‘Žxä# ‰HFB’’˜ä$(I‰JVÂ’–¸ä%0‰‰LfB“šØä&8ɉNv“žøä'@ ŠP†B”¢å(HIŠR–”¦8å)P‰ŠT¦B•ªXå*XÉŠV¶Â•®xå+` ‹XÆB–²˜å,hI‹ZÖ–¶¸å-p‰‹\æB—ºØå.xÉ‹^ö—¾øå/€ Œ`C˜Âæ0ˆIŒbØÆ8æ1‰Œd&C™ÊXæ2˜ÉŒf6ÙÎxæ3  hFCšÒ˜æ4¨IjVÚָæ5°‰lfC›ÚØæ6¸ÉnvÃ›Þøæ7À Žp†Cœâç8ÈIŽr–Üæ8ç9ЉŽt¦CêXç:ØÉŽv¶Ãîxç;à xÆCžò˜ç<èIzÖÞö¸ç=ð‰|æCŸúØç>øÉ~ößþøç? €D è@J‚Ä 9èAŠ„&D¡ YèBʆ6Ä¡yèC ‘ˆFD¢™èD(J‘ŠVÄ¢¹èE0Š‘ŒfD£ÙèF8Ê‘ŽvÄ£ùèG@ ’†D¤"éHHJ’’–Ĥ&9éIPŠ’”¦D¥*YéJXÊ’–¶Ä¥.yéK` “˜ÆD¦2™éLhJ“šÖĦ6¹éMpŠ“œæD§:ÙéNxÊ“žöħ>ùéO€ ” E¨BêPˆJ”¢ŨF9êQŠ”¤&E©JYêR˜Ê”¦6Å©NyêS  •¨FEªR™êT¨J•ªVŪV¹êU°Š•¬fE«ZÙêV¸Ê•®vÅ«^ùêWÀ –°†E¬bëXÈJ–²–Ŭf9ëYЊ–´¦E­jYëZØÊ–¶¶Å­nyë[à —¸ÆE®r™ë\èJ—ºÖÅ®v¹ë]ðŠ—¼æE¯zÙë^øÊ—¾öů~ùë_ ˜ÀF°‚ì`K˜Âư†9ìa‹˜Ä&F±ŠYìb˘Æ6ƱŽyìc ™ÈFF²’™ìd(K™ÊVƲ–¹ìe0‹™ÌfF³šÙìf8Ë™ÎvƳžùìg@ šÐ†F´¢íhHKšÒ–Æ´¦9íiP‹šÔ¦FµªYíjX˚ֶƵ®yík` ›ØÆF¶²™ílhK›ÚÖÆ¶¶¹ímp‹›ÜæF·ºÙínxË›ÞöÆ·¾ùío€ œàG¸ÂîpˆKœâǸÆ9îq‹œä&G¹ÊYîr˜Ëœæ6ǹÎyîs  èFGºÒ™ît¨KêVǺֹîu°‹ìfG»ÚÙîv¸ËîvÇ»ÞùîwÀ žð†G¼âïxÈKžò–Ǽæ9ïyЋžô¦G½êYïzØËžö¶Ç½îyï{à ŸøÆG¾ò™ï|èKŸúÖǾö¹ï}=ð‹ŸüæG¿úÙï~øËŸþöÇ¿þùï  HÀð€L ÈÀ:ðŒ 'HÁ Zð‚Ì 7ÈÁzðƒ ¡GHšð„(L¡ WȺð…0Œ¡ gHÃÚð†8Ì¡wÈÃúð‡@ ¢‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈÅ.zñ‹` £ÇHÆ2šñŒhL£×ÈÆ6ºñpŒ£çHÇ:ÚñŽxÌ£÷ÈÇ>úñ€ ¤ IÈBòˆL¤"ÉÈF:ò‘Œ¤$'IÉJZò’˜Ì¤&7ÉÉNzò“  ¥(GIÊRšò”¨L¥*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌbó˜ÈL¦2—ÉÌf:ó™ÐŒ¦4§IÍjZóšØÌ¦6·ÉÍnzó›&ž­ 5pxl_col_in_fullresÀ¤¸¸¸&–‘&æôؼT»è×@T â½÷‰À(ؼT»è×@T â½÷‰À,|5schema  %barcode%L% in_tissue% array_row% array_col %pxl_row_in_fullres %pxl_col_in_fullresÀl&Ð 5barcodeÀ¤ÉˆÐ&ˆ´&6(TTGTTCTAGATACGCT-1AAACAATCTACTAGCA-1,&ÈÕ5 in_tissueÀÞê&ŽÒ&ÞÑ(,&¦‡5 array_rowÀ˜0¬0&®ð&úÖ¢(¢,&”¹5 array_colÀ¨0¼0&œ¢&؈¢(¢,&þò 5pxl_row_in_fullresÀ¤¸¸¸&öÖ&ƺŽ\–´ä×@|öHúÜQPÀ(Ž\–´ä×@|öHúÜQPÀ,&ž­ 5pxl_col_in_fullresÀ¤¸¸¸&–‘&æôؼT»è×@T â½÷‰À(ؼT»è×@T â½÷‰À,ŠžÀ&Ê¥ ARROW:schema¸/////6ABAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAYAAABEAQAA9AAAALwAAACEAAAAQAAAAAQAAADk/v//AAABAxAAAAAkAAAABAAAAAAAAAASAAAAcHhsX2NvbF9pbl9mdWxscmVzAADG////AAACABz///8AAAEDEAAAACwAAAAEAAAAAAAAABIAAABweGxfcm93X2luX2Z1bGxyZXMAAAAABgAIAAYABgAAAAAAAgBc////AAABAhAAAAAcAAAABAAAAAAAAAAJAAAAYXJyYXlfY29sAAAAmP///wAAAAEgAAAAkP///wAAAQIQAAAAHAAAAAQAAAAAAAAACQAAAGFycmF5X3JvdwAAAMz///8AAAABIAAAAMT///8AAAECEAAAACQAAAAEAAAAAAAAAAkAAABpbl90aXNzdWUAAAAIAAwACAAHAAgAAAAAAAABIAAAABAAFAAIAAYABwAMAAAAEAAQAAAAAAABBRAAAAAcAAAABAAAAAAAAAAHAAAAYmFyY29kZQAEAAQABAAAAA== parquet-cpp-arrow version 15.0.2l{PAR1Seurat/tests/testdata/visium_hd/binned_outputs/square_016um/spatial/tissue_hires_image.png0000755000176200001440000037640015063070153032001 0ustar liggesusers‰PNG  IHDRpÇsµ§ IDATxœìÁ€þ¯î €Ùƒ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU&ìùM IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUµ³ IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUª3< IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU/rôß IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÙ!$I IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÇbã— IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU*zUT IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU ›#h IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU7)~ IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUðjÙ• IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUèùÚ IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUµ[#£ IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUå\Gm IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUS“ˆ÷ IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUƒµžîIDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU¥=8$ôÿµ#¬°-­ÍC”IEND®B`‚Seurat/tests/testdata/visium_hd/binned_outputs/square_016um/filtered_feature_bc_matrix.h50000644000176200001440000070561315063070153031564 0ustar liggesusers‰HDF  ÿÿÿÿÿÿÿÿ‹‹ÿÿÿÿÿÿÿÿ`ˆ¨ˆ¨TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàHEAPXÈmatrixHHhTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ80HEAPXHˆbarcodesdataindicesindptrshapefeaturesSNOD Hh‡ ÿÿÿÿÿÿÿÿ deflate€ %z‚]PSNOD(°8°6Ø6ø8 ð(0$0p-TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPæwj6ë † GCOLATAACGCCGGAGGGTC-1ATAACGGAGTCCAACG-1ATAACGTTACCTCCAC-1ATAAGGTGGAGAACAT-1ATAAGTAGGATTCAGA-1ATAAGTAGGGCGACTC-1ATAAGTTACCGCGACG-1ATAATAGCTGTTGAAT-1 ATAATCTTGGAGAACC-1 ATAATTAGCTAAGTAG-1 ATACAGGCCCTCCAAT-1 ATACCACGGGCAACTT-1 ATACCGTCATCCATAA-1ATACCTAACCAAGAAA-1ATACGCCGGCGAAACC-1ATACGGAACGTCGTTT-1ATACGGGTTTCGATTG-1ATACGTACTTAGCCAC-1ATACGTCCACTCCTGT-1ATACGTTATGCACGGA-1ATACTACCCGTACCAC-1ATACTAGCATGACCCT-1ATACTGCCTTACACCG-1ATAGACAACGGGACCT-1ATAGACGAAGAGAAAG-1ATAGAGTACTGGGACA-1ATAGAGTTATCAACTT-1ATAGCAACTAGGGAAG-1ATAGCCATAACAGTCA-1ATAGGCGGCTATAGAA-1ATAGGCTAGCTTCGCA-1 ATAGGGATATCCTTGA-1!ATAGGTTGGGCAGATG-1"ATAGTGAAGCGTTCTC-1#ATAGTTCCACCCACTC-1$ATATAAAGCGCTCGTG-1%ATATAAATGTAGCTGC-1&ATATAACACGGGCGCA-1'ATATACATGTATGGTA-1(ATATACGCTCGTGACG-1)ATATAGAGTATTGGTC-1*ATATCAACCTACAGAG-1+ATATCAATTCCAGCCT-1,ATATCGGTAGGGAGAT-1-ATATCGTTCCTCGAAC-1.ATATCTCCCTCGTTAA-1/ATATCTTAGGGCCTTC-10ATATGTCTCCCTAGCC-11ATATTCAGTTAAACCT-12ATATTCCACATAGTGA-13ATATTTAACCCTCAAG-14ATCAAACACTGTTCCA-15ATCAAACGAAGGTTTG-16ATCAATCTGGGCTGCA-17ATCAATGCCGTGGCTG-18ATCACATTAGAATATC-19ATCACGTGCTAATTAA-1:ATCACTTCATCCTCGC-1;ATCAGACGGCACGCCG-1<ATCAGCCTCATGCTGC-1=ATCAGCTCGTCCACTA-1>ATCAGTAGGCAGGGAT-1?ATCATAGCCCTATGTA-1@ATCATCCAATATTTGT-1AATCATTGTACCGCATT-1BATCCAACGCAGTCATA-1CATCCAATGGAGGGTCC-1DATCCACATCGACAGAA-1EATCCAGAGCAACAACC-1FATCCAGGATTCGTGAA-1GATCCCATCCACAGCGC-1HATCCTACCTAAGCTCT-1IATCCTGAATCGCTGCG-1JATCCTGCGTGGAATGG-1KATCGACCCAATACAGA-1LATCGACTCTTTCCGTT-1MATCGCACGCCGGGAGA-1NATCGCCAGTCAACATT-1OATCGCTGCGTGCAGCA-1PATCGGAGACAGACGGC-1QATCGGCAAGCAGTCCA-1RATCGTTAGCTAGCGGA-1SATCTAATATCCTACGG-1TATCTACCATCTGCTCC-1UATCTAGCTTGTGAGGG-1VATCTCCCACGGAATAT-1WATCTCCCTGCAATCTA-1XATCTGCACCTCTGCGA-1YATCTGCTGTTATCGCC-1ZATCTGGGCTGTTCTTG-1[ATCTGGTTAAGACTGT-1\ATCTTATCGCACACCC-1]ATCTTGACCTGCAACG-1^ATCTTGACTTGTCCAA-1_ATGAAGCCAAGGAGCC-1`ATGACGCGTTCTATCC-1aATGACTATGCGACATT-1bATGAGGAGTGTTAATC-1cATGATGCAATGGTACA-1dATGCACGCGCTGTTCA-1eATGCACTACCGCATTG-1fATGCATGATCCAGGAT-1gATGCCAATCGCTCTGC-1hATGCCATTTGCGACCA-1iATGCCGGTCTTGCATA-1jATGCCGGTTGATGGGA-1kATGCGACAATTGGTCC-1lATGCGACAGTCCCATT-1mATGCGAGTCCCACCAC-1nATGCTCTGGCGCGGTA-1oATGCTTAGGAGTTGAT-1pATGGAAATTTAAGGAG-1qATGGAGCAGGCCGTGA-1rATGGATCCGGCGTCCG-1sATGGATTGACCAAACG-1tATGGCAGCATTACGAT-1uATGGGCCTCGGCCTCT-1vATGGTCGCGTGGTTTC-1wATGTAAGGCTGCTCTT-1xATGTACATGCGGTGAG-1yATGTACGATGACGTCG-1zATGTAGCGCGCGTAGG-1{ATGTGAAAGCCTAATG-1|ATGTGCATCCGACGCA-1}ATGTGGACATCTTGAT-1~ATGTTGATTAGAGACT-1ATTAAACATGCGGACC-1€ATTAATACTACGCGGG-1ATTAATGAACCAGTCG-1‚ATTACATGTCAGTCTT-1ƒATTACGCGCTGGCAGG-1„ATTACTTACTGGGCAT-1…ATTAGATTCCTCAGCA-1†ATTAGGCGATGCTTTC-1‡ATTATACTTTGCTCGT-1ˆATTATAGCTACTTTAC-1‰ATTATGCCATAGGGAG-1ŠATTATTATGTCCGTCA-1‹ATTATTCAGAGTCACT-1ŒATTCAACCATTTAAGG-1ATTCACTGATGTTGGA-1ŽATTCAGGACCTATTTC-1ATTCATATACTGTCCA-1ATTCATCGTTGAGGCA-1‘ATTCCCGAAGGTACAG-1’ATTCCTAAGACGTGGA-1“ATTCGACGCCGGGCCT-1”ATTCGCGCCTTGAGAG-1•ATTCGTGCTATCTCTT-1–ATTGAAGATCTTAGTG-1—ATTGACCGGCGATGAC-1˜ATTGATCACCACATTT-1™ATTGATGAGTCCTAAC-1šATTGCCTTTATGTTTG-1›ATTGCGATCAGTAACT-1œATTGCTGCTCCTCCAT-1ATTGGATTACAGCGTA-1žATTGGTTGTGCATTAC-1ŸATTGTACAACTCGGCT-1 ATTGTCGCAATACCTT-1¡ATTGTGACTTCGCTGC-1¢ATTTACAGTTTACTGG-1£ATTTACTAAGTCCATT-1¤ATTTCCGGGTTCTGCG-1¥ATTTGCGCGAGTAGCT-1¦ATTTGGAGATTGCGGT-1§ATTTGTCTTGGGAGCT-1¨ATTTGTTCCAGGGCTC-1©CAAACCCTCCGGCGGG-1ªCAAACGAGTATCGCAG-1«CAAACGGTCGCACTTT-1¬CAAACTCGCGACGCCG-1­CAAAGATTATTGGGCC-1®CAAATCTCTCACAAGG-1¯CAAATGTCCTTCCGTG-1°CAACCTACCGAGCAGT-1±CAACGACCCGTTTACA-1²CAACGTGGTGGAGTCT-1³CAACTATATCGAATGC-1´CAACTGCTCATCCGAT-1µCAAGAGGGCGGAGTAC-1¶CAAGATATTATAACGT-1·CAAGCAACGTCGGAGT-1¸CAAGCACCAAATGCCT-1¹CAAGCGGCACATAATT-1ºCAAGGATCGCATGTTC-1»CAAGGCCAGTGGTGCA-1¼CAAGGTCCTATAGGCT-1½CAAGTGTGGTTGCAAA-1¾CAATAAACCTTGGCCC-1¿CAATACGCTCTGAGGC-1ÀCAATATTCTTGACCTA-1ÁCAATCCCTATACCAGC-1ÂCAATGCGAGAAGTATC-1ÃCAATGGATCTCTACCA-1ÄCAATGTGCCAACCCTT-1ÅCAATTAAGGGTGATGA-1ÆCAATTGGGCCGCACTC-1ÇCAATTTCGTATAAGGG-1ÈCACAAGAAAGATATTA-1ÉCACAATGAGCTGCTAT-1ÊCACACACGCTAACGAG-1ËCACACGCGCTGTCTTA-1ÌCACAGCACCCACGGCA-1ÍCACAGCTAGGGAGTGA-1ÎCACAGGGCCATATAGT-1ÏCACAGGGCCGTTGTCA-1ÐCACAGTCCCGCTTCGC-1ÑCACAGTTCGCTTCCCA-1ÒCACATATTAGCAGGAT-1ÓCACATCTCACCGACGA-1ÔCACATGATTCAGCAAC-1ÕCACATTCTTTCGATGG-1ÖCACATTTCTTGTCAGA-1×CACCAATCATCCGTCT-1ØCACCACGCCACACAGA-1ÙCACCAGTCAGCATGCA-1ÚCACCATGATCGCAAAG-1ÛCACCCAAATCTTATGT-1ÜCACCCACGAGGCAATT-1ÝCACCCGGTTTGTGACT-1ÞCACCCTAACAAGATCT-1ßCACCCTTGGTGAGACC-1àCACCGCCAGAAGGTTT-1áCACCGCGTCCACTCTA-1âCACCGGGCATCACAAG-1ãCACCGTATCCCATCCG-1äCACCGTTAGGGATCAC-1åCACCGTTGCGCGATAT-1æCACCTAATCAGTTTAC-1çCACCTCGATGGTGGAC-1èCACCTTGCGAAACTCG-1éCACCTTGGCGCCTTTG-1êCACGAAAGTTAGTCCC-1ëCACGCACAGCGCAGCT-1ìCACGCAGCGAGGCTTT-1íCACGCGGAACTGTTGC-1îCACGGCGCGCCAAAGG-1ïCACGTCGGCAACCTCT-1ðCACGTTCGTGCTCTAG-1ñCACGTTTCGTACACAC-1òCACTAAAGTTGCCTAT-1óCACTACGGGAGCTGCC-1ôCACTCAAGAGCTATGG-1õCACTCCTATGTAAGAT-1öCACTCCTCTCGGTCGG-1÷CACTCGAGCTGAACAA-1øCACTCTTCTGCTAGCC-1ùCACTGACGATTGTGGA-1úCACTTAATCAGACGGA-1ûCAGAACTTAGCCCTCT-1üCAGAATAACACACGGA-1ýCAGACACCGATCGCTG-1þCAGACCTGTAAGTGTT-1ÿCAGACGAACCTGATAC-1CAGAGACGGTCACCCA-1CAGAGCATGAGCTTGC-1CAGAGGCGATGCATGA-1CAGATAATGGGCGGGT-1CAGATACTAACATAGT-1CAGATCATTTAAAGTC-1CAGATCCTGGTTTGAA-1CAGATGTTTGTCCCAA-1CAGCAGCCCGTTCCTT-1 CAGCAGTCCAGACTAT-1 CAGCAGTCTGTGCTGC-1 CAGCCTCCTGCAGAGG-1 CAGCCTCTCCTCAAGA-1 CAGCGATTCCCTTCAA-1CAGCTCACTGAGACAT-1CAGCTCGACAAGTTAA-1CAGCTGGCGTAACCGT-1CAGCTTAGTAGGTAGC-1CAGGATATATCGTTGT-1CAGGCAGTCTTACCAG-1CAGGCCGTTTGGGTGT-1CAGGCGCACGGTGGTC-1CAGGCGCCATGCTAGG-1CAGTAACTATTTATTG-1CAGTAAGGGACGTCTC-1CAGTACATTCTCTAAA-1CAGTACCAGTTTACGT-1CAGTAGCCCACGCGGT-1CAGTCGAGGATGCAAT-1CAGTCGGCCTAGATAT-1CAGTCTGTATACTGGG-1CAGTGAATAAATGACT-1 CAGTGTCGGCTGGCCC-1!CAGTTCAAATTGACAC-1"CATAACGGACAGTCGT-1#CATAAGAAGCTTGGCT-1$CATAAGCTCTCCGTCT-1%CATACACAAAGTCAGC-1&CATACACGGTTCCCAC-1'CATACCCGTACCCAGT-1(CATACGGCGTCTGGGC-1)CATACTATGTAATTGT-1*CATACTTAGGCAATAC-1+CATAGAGGAGATACTA-1,CATAGCGTTGCCCACC-1-CATAGTACATTGAGAG-1.CATAGTCAAATACATA-1/CATAGTCCACAAGAAC-10CATATACTACTGATAA-11CATATAGGTACAGTCA-12CATATGTCAGGCTACG-13CATCATTACCCTGAGG-14CATCCTCTCAAAGATC-15CATCGGACGGGTTAAT-16CATCTATCCCGTGTCT-17CATCTTACACCACCTC-18CATGACTTCGCTGAAT-19CATGAGATGCACTCTC-1:CATGATGCACAATTCT-1;CATGATGGAAGTTAGC-1<CATGCCAACTCGCAAA-1=CATGCGACCAGTTTAA-1>CATGGATTGTCTTCCG-1?CATGGGTATGCCTTAT-1@CATGGGTCGGGTGTGG-1ACATGGTAAGTAGCGTT-1BCATGGTATTAGTTTGT-1CCATGGTCTAGATACCG-1DCATGGTTTATTAATCA-1ECATGTAAGAGACATTT-1FCATGTAGGAGCGCCAA-1GCATGTCTCATTTATGG-1HCATTACGCAGGAAGGG-1ICATTACGTCGGCCCGT-1JCATTATGCTTGTTGTG-1KCATTGCGGGTCAATTC-1LCATTTAGCGGACCATG-1MCATTTGAGTGGTACGT-1NCCAAACAGAACCCTCG-1OCCAAATAACAAGATTC-1PCCAACGATGCACTGAT-1QCCAAGAAAGTGGGCGA-1RCCAAGACTTCTGCGAA-1SCCAAGCGTAACTCGTA-1TCCAAGGTTGCCCTTTC-1UCCAATAGTGCCGTCGA-1VCCAATCGGTAGATCGA-1WCCAATGTCACAGCAAG-1XCCAATTACGGGTCGAG-1YCCACAATGTACGTCTT-1ZCCACACTGAGATATTA-1[CCACAGTACCCATCCT-1\CCACATGGCTCTTTAT-1]CCACCAACTTTACTGT-1^CCACCCAAGGAAAGTG-1_CCACGAATTTAACCTC-1`CCACGAGAAGAGAATC-1aCCACGGAGCCATAAGA-1bCCACGGTGCCCGGTAG-1cCCACTCAGATCCGCAA-1dCCACTGGTGGCTGGTT-1eCCACTGTTTGGATTAA-1fCCAGAAAGCAACTCAT-1gCCAGATAGTTGAGTGA-1hCCAGCCTGGACCAATA-1iCCAGCTCGAACGCATT-1jCCAGCTGATGGTACTT-1kCCAGGGACGTGGCCTC-1lCCAGTAGTCTGATCCA-1mCCAGTCAAATCTCTTA-1nCCAGTCTAGACGGCGC-1oCCAGTCTTGTCATAGA-1pCCAGTTCGGTAACTCA-1qCCATAACCTGTGCAGT-1rCCATACCTTTACTTGT-1sCCATAGAGGCTGCCAG-1tCCATAGGTTGGCGTGG-1uCCATATGGAAACTATA-1vCCATCGCAGTTAAACT-1wCCATCTCACCAGTGAA-1xCCATGCCCTAGATTTC-1yCCATGCCTGTTTAGTA-1zCCATTAGCGATAATCC-1{CCATTCCCTGCCCACA-1|CCATTTCTACCTATTA-1}CCCAAACATGCTGCTC-1~CCCAACATACGTCGCG-1CCCAAGTCATTACACT-1€CCCAATTTCACAACTT-1CCCACTCCACGGTATC-1‚CCCAGAGGAGGGCGTA-1ƒCCCAGGTCTGAAGGCT-1„CCCAGTAAACTTGGGA-1…CCCAGTTAAGGCGCCG-1†CCCGAAGTTTCGCGAA-1‡CCCGACCATAGTCCGC-1ˆCCCGAGTTTCTCCGTA-1‰CCCGCAGCGCGAACTA-1ŠCCCGGGTCGTTCAGGG-1‹CCCGGTGTATCGGAAT-1ŒCCCGTAAGTCTAGGCC-1CCCGTAGCTGGGAAGA-1ŽCCCGTCAGCGTCTGAC-1CCCGTGAGGGCGGTGA-1CCCGTTTCGCAGATGT-1‘CCCTACTTGAACAATG-1’CCCTAGGCAACAAGAG-1“CCCTATGTAGAGCAGA-1”CCCTCCTCGCTCGTAT-1•CCCTGAAATGAGTTGA-1–CCCTGCCCAATCCGCT-1—CCCTGCGCTACGCATA-1˜CCCTGGCTGTTCCTTC-1™CCCTTTAATGGAGTTC-1šCCCTTTGACAGGTCTT-1›CCGAACACTGGGCCTC-1œCCGAACCTTCCCGGCC-1CCGAAGCATTGACCAA-1žCCGACAATAGGCCGCC-1ŸCCGACGGGCATGAGGT-1 CCGACGTAAACACAAC-1¡CCGAGAAGTCGCATAA-1¢CCGAGCTGTGCTTGTC-1£CCGATCTCAACCTTAT-1¤CCGATTCGAGGGACCC-1¥CCGCACAAAGACCAAC-1¦CCGCACTTGCAATGAC-1§CCGCATGTGGTACGAT-1¨CCGCCGGAACTTCTCG-1©CCGCCTGCGAATTGGT-1ªCCGCCTTGCGATGTCG-1«CCGCGATTTGGTAGGT-1¬CCGCGCAAGATACCCA-1­CCGCGGAATGCGTCAC-1®CCGCGGGTACGAAGAA-1¯CCGCTATCAGCACCAG-1°CCGCTCCAGGGCGATC-1±CCGCTCTTCCGAACTA-1²CCGCTTACCTCACTCT-1³CCGCTTGCTGACATGG-1´CCGGAGCGTACTTTCT-1µCCGGCACGACCGTTTC-1¶CCGGCCGCGAGCATAT-1·CCGGCGTGAGACTCTG-1¸CCGGGCGGTCTCGTCA-1¹CCGGGCTGCTCCATAC-1ºCCGGGTTCGAGGTTAC-1»CCGGTAATGGCTAGTC-1¼CCGGTTTGTAATTGTG-1½CCGTAAGTTGGTCCCA-1¾CCGTAGGAAATCCCTG-1¿CCGTAGGGTTGTTTAC-1ÀCCGTATCTCGTCGTAG-1ÁCCGTATTAGCGCAGTT-1ÂCCGTGGAACGATCCAA-1ÃCCGTGTTAAATTCCAT-1ÄCCGTTACGTTAGAACA-1ÅCCGTTCCGAATCTCGG-1ÆCCTAAAGGCTGACGCT-1ÇCCTAAATTAACGGTTC-1ÈCCTAAATTGTATCCTA-1ÉCCTAACCCAAACAAGT-1ÊCCTAACTAAGGCTCTA-1ËCCTACATTCACAGACG-1ÌCCTACTGCTTACACTT-1ÍCCTAGGCGTAGCGATC-1ÎCCTAGGTAAAGGTAGC-1ÏCCTATAATGAGTGCCC-1ÐCCTATACCGTCCTGTC-1ÑCCTATATCGTGTCACG-1ÒCCTATATTTGTCCTGG-1ÓCCTATCTATATCGGAA-1ÔCCTATGAAGTGGTGCC-1ÕCCTATGGCTCCTAGTG-1ÖCCTATGGGTTACCGTC-1×CCTATGGTCAAAGCTG-1ØCCTATGTCCACTCCAC-1ÙCCTCAACGATCGCTGT-1ÚCCTCACCTGAGGGAGC-1ÛCCTCACCTTAGCATCG-1ÜCCTCCGACAATTCAAG-1ÝCCTCCTGAGCCCACAT-1ÞCCTCCTGTTGTGTCGT-1ßCCTCGCCAGCAAATTA-1àCCTCGCGCGATATAGG-1áCCTCGCGCTGTGCGAT-1âCCTCGGACCGGGATAG-1ãCCTCTAATCTGCCAAG-1äCCTCTATCGATTAGCA-1åCCTCTCTCCCATCTAG-1æCCTCTGGCCTAGACGG-1çCCTCTGTACTATTCTA-1èCCTGAACGATATATTC-1éCCTGAATATTTACATA-1êCCTGACCACCGATGGT-1ëCCTGCTATTTGAGAAG-1ìCCTGGAAACGTTCTGC-1íCCTGGCTAGACCCGCC-1îCCTGGTCGAATGTGGG-1ïCCTGTAAGACATGATA-1ðCCTGTACTCACGCCCA-1ñCCTGTCACCCGGGCTC-1òCCTGTCCCTCACGTTA-1óCCTGTCGCCCGTAAAT-1ôCCTGTTTGAAGACACG-1õCCTTCAGTTAAAGTGA-1öCCTTCGTATAGAATCC-1÷CCTTCTCAGCGTTCCT-1øCCTTCTTGATCCAGTG-1ùCCTTGACCACTTTATT-1úCCTTTAAGGGAGCACT-1ûCCTTTCAATGAAGAAA-1üCCTTTGAATTATGGCT-1ýCGAAACGCAATTCATG-1þCGAACAGTATGGGCGT-1ÿCGAACCCGCATGCGTC-1CGAACGGCCGGACAAC-1ACGATCATACATAGAG-1ACGATCATCTTGTAAA-1ACGATGCATATGTTAT-1ACGCAAACTAATAGAT-1ACGCAATCACTACAGC-1ACGCATACGTTTACTA-1ACGCATTCGTGAGTAC-1ACGCCAGATGATTTCT-1 ACGCCAGTGCGTTTGC-1 ACGCCGCTAGACGACC-1 ACGCGAAGTCAGACGA-1 ACGCGCTACACAGGGT-1 ACGCGGGCCAAGGACA-1ACGCTAGTGATACACT-1ACGCTGTGAGGCGTAG-1ACGGAACACGAGTGCC-1ACGGACTCTCAAAGCG-1ACGGAGCGCAAATTAC-1ACGGATGGTGCGGATA-1ACGGCACTTGCTTGGG-1ACGGCCAACATGGACT-1ACGGCGACGATGGGAA-1ACGGCTGGATGTAGAA-1ACGGGAGTGTCGGCCC-1ACGGTACAGTTCAATG-1ACGTAGATTGCTGATG-1ACGTAGGAGAGTCGCT-1ACGTATTACTCCGATC-1ACGTCTCGTTCCGGGA-1ACGTGACAAAGTAAGT-1ACGTGCGCCTCGTGCA-1 ACGTTAATGTCGAAGA-1!ACGTTAGATTTGCCCG-1"ACGTTCGCAATCAATT-1#ACGTTCGTTCAGGAAA-1$ACGTTCTGTACAAGTC-1%ACTACATCCCGACAAG-1&ACTACCAGCTCTCTGG-1'ACTACGCGTTAGAATT-1(ACTAGTTGCGATCGTC-1)ACTATATGCTGTGTTC-1*ACTATCCAGGGCATGG-1+ACTATCTGCCCGCGTA-1,ACTATTTCCGGGCCCA-1-ACTCAAGTGCAAGGCT-1.ACTCAATAAAGGCACG-1/ACTCCCATTCCTAAAG-10ACTCCCGAATTCGTTT-11ACTCCCTAATGCTAAA-12ACTCCCTAGAATAGTA-13ACTCCGGCCGACCACT-14ACTCGCCGTTCGATAA-15ACTCGTAACCCGTCCT-16ACTCGTCAGTAATCCC-17ACTCTCTGACTTAGGT-18ACTCTGACCTAATAGA-19ACTCTTGTATAGTAAC-1:ACTGAAACGCCGTTAG-1;ACTGAATGGCGAAAGT-1<ACTGCCGTCGTAACTC-1=ACTGCTCGGAAGGATG-1>ACTGTACGATACACAT-1?ACTGTAGCACTTTGGA-1@ACTGTCCAGGATTATA-1AACTGTCTTCTTTAGAA-1BACTTACGCATCCACGC-1CACTTATACTTACCCGG-1DACTTATTAGGATCGGT-1EACTTATTTATGTGCCA-1FACTTCAGGCTGATCCC-1GACTTCCAGTGGAAGCT-1HACTTCCATGCGGGACA-1IACTTCGCCATACGCAC-1JACTTGACTCCCTCTTT-1KACTTGGGACCCGGTGG-1LACTTGTAGTCCCTTCA-1MACTTGTGGATGGAACG-1NACTTTACCCTCATGAA-1OACTTTCCTATAGCTTC-1PACTTTGACTGCATCCT-1QACTTTGGTCGTGCTCC-1RAGAACCCTCAATTGGG-1SAGAACGTGGTACATTC-1TAGAAGAGCGCCGTTCC-1UAGAAGGTACACTTCAC-1VAGAAGGTTGCCGAATT-1WAGAAGGTTGTAGGTCG-1XAGAAGTGATTCGTGAT-1YAGAATGCGGGTTCGGA-1ZAGAATTATGGATTCGA-1[AGACCAAACCACACCT-1\AGACCCACCGCTGATC-1]AGACCCGCCCTCCTCG-1^AGACCGCTCCGCGGTT-1_AGACCGGGAAACCCTG-1`AGACGAAGTGCCGGTC-1aAGACGACGATGCCGCT-1bAGACTAGCCTTCCAGA-1cAGAGAACCGTCTAGGA-1dAGAGAAGGAGTACAAT-1eAGAGATCTCTAAAGCG-1fAGAGCCGCCGAGATTT-1gAGAGGCTTCGGAAACC-1hAGAGTAAACTTCACTA-1iAGATAACTTCAGGGCC-1jAGATACCAATAGAACC-1kAGATACCGGTGTTCAC-1lAGATACTCAAGATCGA-1mAGATATAATACGACTA-1nAGATCGTGCATAAGAT-1oAGATCTCAGGTGTGAT-1pAGATGACTCGCCCACG-1qAGATGAGGGTTGCGAT-1rAGATGATGGAGTCTGG-1sAGATGCAAGACGTGCA-1tAGATGCATCCTGTGTC-1uAGATTATAGGACGTTT-1vAGATTCACAACCGATA-1wAGCAAAGGCCGCTAGT-1xAGCAACATATCTTATT-1yAGCAACCGAAAGTAAT-1zAGCACCAGTACTCACG-1{AGCACTACCTCACCAG-1|AGCACTTAAGGACGCC-1}AGCAGAAGGAGAAAGA-1~AGCAGCCAGATGAATA-1AGCATATCAATATGCT-1€AGCATCATTTCGAAAG-1AGCATCGTCGATAATT-1‚AGCATTACGAGGCAAG-1ƒAGCCAAGCTTTGTGTC-1„AGCCACAGGTTACCCG-1…AGCCACTCCCGTGCTT-1†AGCCCATACATGTAAG-1‡AGCCCGCACTACAATG-1ˆAGCCCGGTAGCCTGTA-1‰AGCCCTTCTAATCCGA-1ŠAGCCGTGGCTAAATGT-1‹AGCCTAATACCCACGT-1ŒAGCGACAGGAACGGTC-1AGCGACCAACGATATT-1ŽAGCGATGCGCCTAATA-1AGCGCATAATGAATCG-1AGCGCGGGTGCCAATG-1‘AGCGGACACTTCGTAG-1’AGCGGCGGTTAGCGGT-1“AGCGGGTCTGACACTC-1”AGCGTGGTATTCTACT-1•AGCTAAGTACGCAGGC-1–AGCTAGAAGCAGAAGT-1—AGCTATTTAATCCAAC-1˜AGCTCCATATATGTTC-1™AGCTCCTTCGCACATC-1šAGCTCTAGACGTTCCA-1›AGCTCTTCCCAGTGCA-1œAGCTCTTCGTAACCTT-1AGCTCTTTACTCAGTT-1žAGCTGAAGTAAACCAA-1ŸAGCTGTAACCTCAATC-1 AGCTTCTTCTCGAGCA-1¡AGCTTGATCTTAACTT-1¢AGGAAGCTGTCCGCCG-1£AGGACAGTCGAATCCC-1¤AGGACGACCCATTAGA-1¥AGGACGCTCGATGTTG-1¦AGGAGGCCTTCGCGCG-1§AGGATAAAGTCGGGAT-1¨AGGATATAGGGATTTA-1©AGGATATCCGACTGCA-1ªAGGATCACGCGATCTG-1«AGGCAGATGCGTAAAC-1¬AGGCAGGGAGCGTACT-1­AGGCATTGTCGTAGGG-1®AGGCCACCCGTTATGA-1¯AGGCCCTAGAACGCCA-1°AGGCCTGAGAATCTCG-1±AGGCGGTTTGTCCCGC-1²AGGCGTCTATGGACGG-1³AGGCTTCCCGAAGAAG-1´AGGGAAACGAGGTACT-1µAGGGACCGGCTGCGTT-1¶AGGGACTCTACGCGAC-1·AGGGAGACATACTTCG-1¸AGGGCGAGCAGCTGAT-1¹AGGGCTGCAGTTACAG-1ºAGGGTCAGTAACCCTA-1»AGGGTCGATGCGAACT-1¼AGGGTGCTCTCGAGGG-1½AGGGTTCCCTTTGGTT-1¾AGGGTTTAGTTCGGGA-1¿AGGTAGGTACAAAGCT-1ÀAGGTATAATTGATAGT-1ÁAGGTCAGGTGAGAGTG-1ÂAGGTCGCGGAGTTACT-1ÃAGGTGCACGTCCACAT-1ÄAGGTGGTGACCTTCGC-1ÅAGGTTACACCATGCCG-1ÆAGGTTGAGGCACGCTT-1ÇAGGTTTCACACACCTT-1ÈAGTAACTATAGCAGCC-1ÉAGTACAGAAGCTTATA-1ÊAGTACATCATTTATCA-1ËAGTACGGGCACCTGGC-1ÌAGTACTCTTATGCCCA-1ÍAGTAGGAAGGAAGTTG-1ÎAGTATGCTGGAGACCA-1ÏAGTATTTGGCACGACC-1ÐAGTCAACACCACCATC-1ÑAGTCAAGATGACACTT-1ÒAGTCACTAGCTCTCGA-1ÓAGTCCATTGGCTGATG-1ÔAGTCCCGCCTTTAATT-1ÕAGTCGACGGTCTCAAG-1ÖAGTCGGCCCAAACGAC-1×AGTCGGCTCAACTTTA-1ØAGTCGGTTGCGTGAGA-1ÙAGTCGTATAAAGCAGA-1ÚAGTCGTCGACCACCAA-1ÛAGTCGTGGGCATTACG-1ÜAGTCTAAAGTATACTC-1ÝAGTCTCACAAGACTAC-1ÞAGTCTTCTCCTCAAAT-1ßAGTCTTTAAAGTGTCC-1àAGTGAACAAACTTCTC-1áAGTGACCTACTTTACG-1âAGTGAGACTTCCAGTA-1ãAGTGAGCCTCGCCGCC-1äAGTGAGTCGAATTAAC-1åAGTGATAACCTGCGCG-1æAGTGATATGAGTAGTT-1çAGTGATTCAAGCAGGA-1èAGTGCACGCTTAAGAA-1éAGTGCGTAGCTCGTAA-1êAGTGCTAAACACAGCA-1ëAGTGCTTGCACGAATA-1ìAGTGGCCCGCAAATGG-1íAGTGGCGGCAATTTGA-1îAGTGGCGTCTGAAGGT-1ïAGTGGCTCCGTCGGCC-1ðAGTGGTGTTACCCGTG-1ñAGTGTATTGCGCATTG-1òAGTTAAACACTTGCGA-1óAGTTAAGCGGTCCCGG-1ôAGTTAAGTCAACCGCT-1õAGTTACTCTATCGTGG-1öAGTTCCTACAGAATTA-1÷AGTTCCTATTTATGTT-1øAGTTGACGGTCCTTGC-1ùAGTTGGCAAGGCTAGA-1úAGTTTGCACCTGCCTC-1ûAGTTTGGCACGGGTTG-1üAGTTTGGCCAGACCTA-1ýATAAACGGACCCGTAA-1þATAAACGTTGCACCAC-1ÿATAAAGGCTCGGTCGT-1ATAAATATTAGCAGCT-1AATAGAATCTGTTTCA-1AATAGCTACCGCGTGC-1AATAGTCCGTCCCGAC-1AATATCCTAGCAAACT-1AATATCGAATCAATGC-1AATATCGAGGGTTCTC-1AATATTGGAGTATTGA-1AATCATGTAAAGACTC-1 AATCGCCTCAGCGCCA-1 AATCGCGCAGAGGACT-1 AATCGGTATAGCCCTC-1 AATCGTGAGCCGAGCA-1 AATCTAGGTTTACTTG-1AATCTATGCCGGAGCC-1AATCTCTACTGTGGTT-1AATCTGCGTTGGGACG-1AATCTGGCTTTCTAGT-1AATGACAGCAATGTCT-1AATGACGTAGGATGTC-1AATGACTGTCAGCCGG-1AATGATGATACGCTAT-1AATGATGCGACTCCTG-1AATGCAACCGGGTACC-1AATGCACCAAGCAATG-1AATGTGCCCGAGGTGT-1AATGTTGTCGTGAGAC-1AATTAAAGGTCGGCGT-1AATTAACGGATTTCCA-1AATTACGAGACCCATC-1AATTAGCGCTGCAGCG-1AATTCATAAGGGATCT-1 AATTCATTGTCATGCA-1!AATTCCAAGCATGTAC-1"AATTCGATTCGAGGAT-1#AATTCTAGAGTTAGGC-1$AATTGAACGCTCTGGT-1%AATTGCAGCAATCGAC-1&AATTTGGGACATAGTA-1'ACAAACCATGCGTCCT-1(ACAAAGAAGGTAGGCC-1)ACAAAGCATGACCTAG-1*ACAAATCGCACCGAAT-1+ACAAATGGTAGTGTTT-1,ACAACAGCATGAGCTA-1-ACAAGCAGTGCCTAGC-1.ACAAGGAAATCCGCCC-1/ACAAGGACAAGAGGTT-10ACAAGGATGCTTTAGG-11ACAAGGGCAGGCTCTG-12ACAATAGTCGTACGTT-13ACAATCCATTTAAACC-14ACAATGAATACGGAGA-15ACAATTGTGTCTCTTT-16ACAATTTGAGCAGTGG-17ACACAAAGACGGGTGG-18ACACACCAGGACCAGT-19ACACATGATCAAATCT-1:ACACCCAGCATGCAGC-1;ACACCTTAAGTAGGGC-1<ACACCTTACTACTTGC-1=ACACGAGACTCCTTCT-1>ACACGGGAACTTAGGG-1?ACACGTAGGCCACAAG-1@ACACTGATCAAGGTGT-1AACAGAACTGAGAACAA-1BACAGCGACATTCTCAT-1CACAGGCACGGATCCTT-1DACAGGCTTGCCCGACT-1EACAGGTGGAGGTGAGG-1FACAGTAATACAACTTG-1GACATAAGTCGTGGTGA-1HACATAATAAGGCGGTG-1IACATCCCGGCCATACG-1JACATCCTGGTAACTGT-1KACATCGATCGTTTACC-1LACATCGGTCAGCCGCG-1MACATCGTATGCAATGG-1NACATGGCGCCAAAGTA-1OACATTAGTTTATATCC-1PACATTTGAAACCTAAC-1QACCAAACACCCAGCGA-1RACCAACACCACACACT-1SACCAACCGCACTCCAC-1TACCAACGCTTATTTAT-1UACCAAGTCATCGGCAG-1VACCAATATGCAAGTTA-1WACCACAAGTTTCTATC-1XACCACCAATGTAACAA-1YACCACGTGCAGCTATA-1ZACCAGACCATAACAAC-1[ACCAGTGCGGGAGACG-1\ACCATATCCGCAATAA-1]ACCATCCGCCAACTAG-1^ACCATCGTATATGGTA-1_ACCCAACGCCCGTGGC-1`ACCCATCTTGAGGGTA-1aACCCATTTGTCCCTCT-1bACCCGGAAACTCCCAG-1cACCCGGATGACGCATC-1dACCCGGTTACACTTCC-1eACCCGTGTCATCAGTA-1fACCCTATGCCATATCG-1gACCCTCCCGTCAGGGC-1hACCCTCCCTTGCTATT-1iACCCTGGTAACGCCCT-1jACCGAAGAGTCTGGTT-1kACCGACACATCTCCCA-1lACCGACTGAGTCCCAC-1mACCGAGTCTCCTTATT-1nACCGATGGTAGCATCG-1oACCGCAATAACTGCCT-1pACCGCGGTGGAAGTCG-1qACCGGGCCTTTGTTGA-1rACCGGTCAGGTACACC-1sACCGTCCACTGGGCCC-1tACCTAAGTACCTTTCA-1uACCTAATCGACTTCCT-1vACCTACAGTATGTGGT-1wACCTACTATAAATCTA-1xACCTCCGCCCTCGCTG-1yACCTCCGTTATTCACC-1zACCTGCGTGTCATGTT-1{ACGAAATGGGCGGCAC-1|ACGACTCTAGGGCCGA-1}ACGAGGATACCACTCT-1~ACGAGGTTTACAACGT-1ACGAGTACGGATGCCC-1€ACGATACATAGAACTA-1AACGCATGATCTGGGT-1‚AACGCGGTCTCCAGCC-1ƒAACGCTGTTGCTGAAA-1„AACGGACGTACGTATA-1…AACGGCCATCTCCGGT-1†AACGTACTGTGGGTAC-1‡AACGTCAGACTAGTGG-1ˆAACGTCGCTGCACTTC-1‰AACGTGCGAAAGTCTC-1ŠAACTACCCGTTTGTCA-1‹AACTAGGCTTGGGTGT-1ŒAACTCAAGTTAATTGC-1AACTCCAGAGCGTGTT-1ŽAACTCCTAATCCCATG-1AACTCTCAATAGAGCG-1AACTCTCAGTGTGCTC-1‘AACTGGGTCCCGACGT-1’AACTTGCCCGTATGCA-1“AAGACATACGTGGTTT-1”AAGACCAAATAACTCA-1•AAGACCCAACTGAACA-1–AAGACTGCAAGCTACT-1—AAGAGCTCTTTATCGG-1˜AAGAGGATGTACGCGA-1™AAGAGGCATGGATCGC-1šAAGAGGCCCTTTGGAA-1›AAGATGGCACCGGACC-1œAAGATTGGCGGAACGT-1AAGCACCCTGCGTATC-1žAAGCATACTCTCCTGA-1ŸAAGCCGAAGCGGTTTA-1 AAGCGCAGGGCTTTGA-1¡AAGCGTCCCTCATCGA-1¢AAGCTAGATCGAGTAA-1£AAGCTCGTGCCAAGTC-1¤AAGCTCTTTCATGGTG-1¥AAGGAGCGGTTGGTGC-1¦AAGGATCGATCGCTTG-1§AAGGATGAGGGACCTC-1¨AAGGCGCGTAAAGCTT-1©AAGGCTGTGCTCATCG-1ªAAGGGAACGACTGGCT-1«AAGGGACAGATTCTGT-1¬AAGGGACTATGCATTC-1­AAGGGTTTGATTTCAG-1®AAGGTATCCTAATATA-1¯AAGGTGATAAACCAGC-1°AAGTAGTGACGCGAGG-1±AAGTCAATTGTCGTCA-1²AAGTCTTCTGTGGCCT-1³AAGTGACGACCGAATT-1´AAGTGAGTCGGGTTTA-1µAAGTGCCTTGACTGTA-1¶AAGTGCGTTAGAATCT-1·AAGTGTTTGGAGACGG-1¸AAGTTCACTCCAAGCT-1¹AAGTTCAGTCTGCGTA-1ºAAGTTCGGCCAACAGG-1»AAGTTGTGATGTTATA-1¼AAGTTTATGGGCCCAA-1½AATAACAACGCTCGGC-1¾AATAACACTAGAACAA-1¿AATACCTGATGTGAAC-1ÀAATAGAACAGAGTGGC-1ÁAAATCGCGGAAGGAGT-1ÂAAATCGTGTACCACAA-1ÃAAATCTAGCCCTGCTA-1ÄAAATGATTCGATCAGC-1ÅAAATGGCCCGTGCCCT-1ÆAAATGGTCAATGTGCC-1ÇAAATTAACGGGTAGCT-1ÈAAATTACACGACTCTG-1ÉAAATTACCTATCGATG-1ÊAAATTCCAGGTCCAAA-1ËAAATTGATAGTCCTTT-1ÌAAATTTGCGGGTGTGG-1ÍAACAACTGGTAGTTGC-1ÎAACACACGCTCGCCGC-1ÏAACACGAGACGCGGCC-1ÐAACAGGATGGGCCGCG-1ÑAACAGGTAGTATGGAT-1ÒAACATATCAACTGGTG-1ÓAACATCGATACGTCTA-1ÔAACATTGTGACTCGAG-1ÕAACCAAGACTTCTCTG-1ÖAACCCATCCCATGATC-1×AACCCGAGCAGAATCG-1ØAACCCTACTGTCAATA-1ÙAACCGAGCTTGGTCAT-1ÚAACCGCTAAGGGATGC-1ÛAACCTCGCTTTAGCCC-1ÜAACCTTTAAATACGGT-1ÝAACCTTTACGACGTCT-1ÞAACGAAAGTCGTCCCA-1ßAACGATAATGCCGTAG-1àAACGATATGTCAACTG-1áAAACTGCTGGCTCCAA-1âAAACTTAATTGCACGC-1ãAAACTTGCAAACGTAT-1äAAAGAATGTGGACTAA-1åAAAGGCTACGGACCAT-1æAAAGGCTCTCGCGCCG-1çAAAGGGATGTAGCAAG-1èAAAGTAGCATTGCTCA-1éAAAGTGTGATTTATCT-1êAAAGTTGACTCCCGTA-1ëAAATAACCATACGGGA-1ìAAATAAGGTAGTGCCC-1íAAATACCTATAAGCAT-1îAAATAGCTTAGACTTT-1ïAAATAGGGTGCTATTG-1ðAAATCCGATACACGCC-1ñAAACCGTTCGTCCAGG-1òAAACCTAAGCAGCCGG-1óAAACGAAGATGGAGTA-1ôAAACGAGACGGTTGAT-1õAAACGGGCGTACGGGT-1öAAACGGTTGCGAACTG-1÷AAACTCGGTTCGCAAT-1øAAACTCGTGATATAAG-1ùAAACAGGGTCTATATT-1úAAACATGGTGAGAGGA-1ûAAACATTTCCCGGATT-1üAAACCGGGTAGGTACC-1ýAAACAGAGCGACTCCT-1þAAACAGCTTTCAGAAG-1ÿAAACACCAATAACTGC-1AAACAAGTATCTCCCA-1GCATTGTAATTCATAT-1GCATTTCCAAGGCTCC-1GCCAACCATTTCCGGA-1GCCAAGAATACTTCTG-1GCCAATAGGGCATCTC-1GCCACAATTTAAGGAC-1GCCACTCAGAGCGCGA-1GCCAGGAGTAACCGAT-1 GCCATATTGCACACAG-1 GCCATCGAGCTGCGTG-1 GCCATCGATGCTGCAT-1 GCCATTAGCCTCAAAC-1 GCCCGACTTCTTCCCG-1GCCCGAGAGTCTAAAT-1GCCCGATCTGTGGTCG-1GCCCGCGCGTAAACGG-1GCCCGTAATACCTTCT-1GCCCTAGCCGTCGCGA-1GCCCTGAGGATGGGCT-1GCCGAAATTCCTACGT-1GCCGATTGGCCAAGCT-1GCCGCTTGTGAGAAAC-1GCCGGGTTAGGGTCGC-1GCCGTGGAAGAAATGT-1GCCTACGTTCTGTGCA-1GCCTATAGTGTCAGGG-1GCCTCATCTGGAAATA-1GCCTCCGACAATTCAC-1GCCTCTATACATAGCA-1GCCTTTGTCAGTGGAC-1GCGAAACGATCGGGAG-1 GCGAAACTTAACTGGA-1!GCGAAGAATCTGACGG-1"GCGAAGCCATACCCGT-1#GCGACATGTAAACATC-1$GCGACGATAGTTGTAC-1%GCGAGAGGCCATGTAA-1&GCGAGAGTTGCGTCCA-1'GCGAGCGCATGCTCCC-1(GCGAGGCCCGAGCAGA-1)GCGAGTTCTGCAAAGA-1*GCGATTGTTAACGTTA-1+GCGCAAATATATTCAA-1,GCGCAAGAGCGCGCTG-1-GCGCATCCAGTCAGCA-1.GCGCCGTTCCACGATA-1/GCGCCTCCCACTCCGA-10GCGCGGTCTAGTAACT-11GCGCGTCATTGGTACA-12GCGCTAATTGAATAGA-13GCGCTATGCCGAGGCA-14GCGCTGATCCAGACTC-15GCGCTGCTTTGCATTT-16GCGCTTAAATAATTGG-17GCGGACCGCGTTGTGG-18GCGGAGAAACTTCGCA-19GCGGAGAGGGAGAACG-1:GCGGATTACTTGTTCT-1;GCGGCAAAGTATTGCC-1<GCGGCTCTGACGTACC-1=GCGGCTTTAGCAAGTT-1>GCGGGCGAGCCTTACC-1?GCGGTCTTGCTTTCAC-1@GCGGTGAACTGCGCTC-1AGCGGTTCCCTATCATG-1BGCGTAAATGGCCATAA-1CGCGTCGAAATGTCGGT-1DGCGTCGCCAGGGTGAT-1EGCGTCTCTGCATTGGG-1FGCGTGGTACTGGGTTA-1GGCGTTCGGAGACCGGG-1HGCTAACTGAAGTCTGA-1IGCTAAGCCCAGTATGC-1JGCTAAGTAGTTTCTCT-1KGCTAATACCGAATGCC-1LGCTACAATCGAGGATA-1MGCTACAGTACGGACCG-1NGCTACGACTTATTGGG-1OGCTACTATAGTAGAGT-1PGCTAGACCGTCTACTG-1QGCTAGAGTAGAGATGT-1RGCTAGCAGGGAGTGGG-1SGCTAGCTTGAATAGCT-1TGCTAGGCACCACGGAG-1UGCTAGTAGAGCTTGTA-1VGCTATACGTCTCGGAC-1WGCTATCATACTCATGG-1XGCTATGCCAGCTTATG-1YGCTCAATCCGTTTATT-1ZGCTCAATGTAATACCG-1[GCTCATTACTGCATGT-1\GCTCCCAGTCGGTCCA-1]GCTCCGCTCGCTTCAG-1^GCTCCTGACATACTGG-1_GCTCGCTCATGTCCAA-1`GCTCGGAATTTAAAGC-1aGCTCTAAACCCTGACG-1bGCTCTATGTTACGTGC-1cGCTCTCGGGTACCGAA-1dGCTCTTTCCGCTAGTG-1eGCTGAATCTTCCAATC-1fGCTGAGGCGTGAGTAT-1gGCTGCACGGTTTCTTA-1hGCTGCTAAGTAGTCGA-1iGCTGCTACTGCGTAGC-1jGCTGCTCTCCGGACAC-1kGCTGGACCCAAAGTGG-1lGCTGGCATATTCACCT-1mGCTGGCGGCGCATGCT-1nGCTGGTGACTCGTAGT-1oGCTGGTTTAGGCCATA-1pGCTGTATTACTGGCCC-1qGCTGTTGCTACCGAAC-1rGCTTAATGTAACTAAC-1sGCTTACGTAGTTAGTA-1tGCTTATGAAGCAGGAA-1uGCTTCCATGTAACCGC-1vGCTTCCGTCCCTAGAC-1wGCTTGAGTGACCTCTG-1xGCTTGGATCGATTAGG-1yGCTTTCAGAGGAGGTG-1zGGAAACCTTGTTGAAT-1{GGAAACTAAATGGGCC-1|GGAAAGTGCCCATGCC-1}GGAACCGTGTAAATTG-1~GGAACCTTGACTCTGC-1GGAACTTTGGCGATTA-1€GGAATGCGCTAGCGTG-1GGACAACCATGAAGCC-1‚GGACACAAGTTTACAC-1ƒGGACCAACAGGATAAC-1„GGACCTACGGTAACGT-1…GGACCTCTAGGCCGCC-1†GGACGTCCATAGTTGG-1‡GGACTCTTTGACTAAG-1ˆGGAGAAGTCATTGGCA-1‰GGAGACCATCTACATA-1ŠGGAGACGACACCTTTG-1‹GGAGCAACATTTCAAG-1ŒGGAGCACCAAGAACTA-1GGAGCGAGGCCTACTT-1ŽGGAGGGCTTGGTTGGC-1GGAGTTGATTCTGTGT-1GGATCAGAGCCATCAG-1‘GGATCATCCCGTACGC-1’GGATCCGGAATATACT-1“GGATCTTGACTCAACC-1”GGATGAAGATCGCTGA-1•GGATGACGCGAGTTTA-1–GGATGGCTTGAAGTAT-1—GGATGTCCTTACCGCA-1˜GGATTAATCATGGACC-1™GGATTCCGCTATACCC-1šGGATTGCTGTGACTCC-1›GGATTTCACTTCTATA-1œGGCAAAGGCGCCAATA-1GGCAAATTACTTTACT-1žGGCAAGCCCATAGTGG-1ŸGGCAAGGCGAAATAGC-1 GGCAATAGTCAATGAG-1¡GGCACGCTGCTACAGT-1¢GGCACTCCACTGGGCA-1£GGCACTGCGGTGGTTT-1¤GGCAGCAAACCTATGC-1¥GGCAGCGGTAATCCTA-1¦GGCATACAGGTAGCGG-1§GGCATATCGGTTCTGC-1¨GGCCAATTGTATAGAC-1©GGCCCAGCTGGTTTGC-1ªGGCCCTCACCCACTTA-1«GGCCGGCGTCTGCTAT-1¬GGCCGTTTGGGTTTCA-1­GGCCTGCTTCTCCCGA-1®GGCGAAATCTAACTTG-1¯GGCGAGCGAAACGGCA-1°GGCGCAGGACATCTTC-1±GGCGCATGAATTGATG-1²GGCGCGGAGATCTTTC-1³GGCGCGTTCGAGTTTA-1´GGCGCTTCATTCCCTG-1µGGCGGAGTAATATTAG-1¶GGCGGTAGGATCATTG-1·GGCGTAGGGAAAGCTG-1¸GGCGTCCTATCCGCTG-1¹GGCTAAAGGGCGGGTC-1ºGGCTAATGATTGAAAT-1»GGCTATTAAGTTGTAT-1¼GGCTCGCGTTGAGGTA-1½GGCTCTGCTCCAACGC-1¾GGCTGAAATAGCAAAG-1¿GGCTTTCAATAAGGGT-1ÀGGGAAAGAATGCCAAC-1ÁGGGAACGGGAGGTTAG-1ÂGGGAAGACGGTCTGTC-1ÃGGGAAGGGCTTTCTCA-1ÄGGGAATGAGCCCTCAC-1ÅGGGACAGAGTTACTCC-1ÆGGGACCCGTATATCTT-1ÇGGGACTGCATAGATAG-1ÈGGGAGAACTCACAGTA-1ÉGGGAGCGACCGTAGTG-1ÊGGGAGGATGCCCGAAA-1ËGGGAGTTAATGAGGCG-1ÌGGGATGGTCGTAACCG-1ÍGGGATTTACCGCACCT-1ÎGGGCAACCGCACGTGC-1ÏGGGCACTATTGACCAT-1ÐGGGCAGACGTCACTGC-1ÑGGGCAGAGCAATCGTT-1ÒGGGCAGTCAACGCCAA-1ÓGGGCCCGTCTTAAACA-1ÔGGGCCGGCCGAAGTAC-1ÕGGGCCTAAATGGGCTA-1ÖGGGCGATATGTGTGAA-1×GGGCGGCAAATGAATT-1ØGGGCGGGTTCCCTACG-1ÙGGGCGTACATTTATAT-1ÚGGGCGTCACCACGTAA-1ÛGGGCGTCCACTGGCTC-1ÜGGGCGTGGTTTCCCAG-1ÝGGGCTACTATTTCGTG-1ÞGGGCTATGATCGATGG-1ßGGGCTCATCGAACCCA-1àGGGCTGCCTAGGGCGA-1áGGGCTGGTTAGTCGCG-1âGGGTACTTCATGAACT-1ãGGGTATGTATGCACTT-1äGGGTATTCTAGCAAAC-1åGGGTCACCGTGACGGT-1æGGGTCAGGAGCTAGAT-1çGGGTCGTGGCAAGTGT-1èGGGTCTATCGCTTTCC-1éGGGTGACACCTTAACT-1êGGGTGCATATGAAAGC-1ëGGGTTAACATTTGAGT-1ìGGGTTTAGGATAGGAT-1íGGTAACCGGGAGGATA-1îGGTACAAACATGCTAT-1ïGGTACCATTAAGACGG-1ðGGTACGTTGCGGCCGG-1ñGGTAGAAGACCGCCTG-1òGGTAGACCGTTGGGCG-1óGGTAGTGCTCGCACCA-1ôGGTATAGTGACACATA-1õGGTATTGCCGAGTTTA-1öGGTCAAGACTACTTCG-1÷GGTCAGTGGGTCCCAC-1øGGTCGGATAAACGGCG-1ùGGTCGGCCAGGAGCTT-1úGGTCGGTCGTCCACAG-1ûGGTCGTAAGCTCGCAC-1üGGTCTCCGTCCAGGTT-1ýGGTCTCTGAATGGACT-1þGGTCTGAGAATCTGGA-1ÿGGTCTTGAGCGCTCTT-1GGTGAAGTACAGGGAT-1GGTGATAAGGAGCAGT-1GGTGCAGAGCCTATCG-1GGTGCTGGTACACATT-1GGTGGACTGCTCTGGC-1GGTGTAAATCGATTGT-1GGTTACCACCCTCGGG-1GGTTAGCTATATGTCT-1GGTTAGGCTTGGAGAA-1 GGTTCGGATTATACTA-1 GGTTCTACTCGTCTGA-1 GGTTTAATTGAGCAGG-1 GGTTTACAATCTCAAT-1 GGTTTAGCCTTTCTTG-1GGTTTCAATCGGTCAG-1GGTTTGACAAGAAGCT-1GGTTTGTGACCTGAGG-1GTAACATCTAAGATAA-1GTAAGCGGGCAGTCAG-1GTAAGTAACAGTCTGG-1GTAAGTAGGGTATACC-1GTAATAAAGGGCTCCC-1GTAATCTGATTCTTCG-1GTACACTTACCTGAAG-1GTACAGAGGCAAGGGT-1GTACGAGATTGCGACA-1GTACGCTTCATTGCAC-1GTACGTCACGTATTAA-1GTACGTTTGCCCGTCA-1GTACTAAGATTTGGAG-1GTACTCCCTTATCGCT-1GTACTCCTGGGTATGC-1 GTACTGGAGTTAGACC-1!GTAGACACGCCTGACT-1"GTAGAGGGAGACAAGT-1#GTAGCCAAACATGGGA-1$GTAGCGGCTATACACT-1%GTAGCTTCCTCTTGTT-1&GTAGGTGATCCGTGTA-1'GTAGTCGCGGGAATCA-1(GTAGTCTACGATATTG-1)GTAGTGAGCAACCTCA-1*GTATAGGACTCAGTAG-1+GTATCAAACGTTAGCT-1,GTATCCTTTGGTAACC-1-GTATCTCAGTCTTGAC-1.GTATCTTTCATAACCA-1/GTATGAAATTTCACTC-10GTATGTGGGTCTAGTT-11GTATTCTGAGAAACGA-12GTCAAAGAAGTGGTGT-13GTCAACCAGGCCTATA-14GTCAAGCGGACTCGGG-15GTCAGAATAGTCTATG-16GTCATGCACCTCCGTT-17GTCATGCGCGAGGGCT-18GTCATGGACATGACTA-19GTCATTAGAGCGAACG-1:GTCCAATATTTAGCCT-1;GTCCATTACTGCTACG-1<GTCCCAACGTAAAGTA-1=GTCCCAATCATCCCGC-1>GTCCCGCGACGTTATG-1?GTCCGGACCTGAAATT-1@GTCCGGCTGAATTGCG-1AGTCCGGGTTCACATTA-1BGTCCTACGAATAGTCT-1CGTCCTACTCTACGGGC-1DGTCGCCGTTGTGTGTT-1EGTCGCGTAACCCGTTG-1FGTCGGAAGGATACCAG-1GGTCGGATATCTCAGAC-1HGTCGGATGTAGCGCGC-1IGTCGGGAACATGGTAG-1JGTCGGGAAGCAGAAAC-1KGTCGTACCATCTCGGG-1LGTCGTACCTACGATTG-1MGTCGTATTGGCGTACA-1NGTCGTGTCTGGTCATC-1OGTCGTTATTCGCTTAT-1PGTCTAGTGAGCCGCTT-1QGTCTATCTGAGTTTCT-1RGTCTATTGCATGCTCG-1SGTCTATTGGTTCCGGT-1TGTCTCAAGGCCCGGCT-1UGTCTCCCGAGTCCCGT-1VGTCTCCTGCCAGTATG-1WGTCTCGACTAAGTTTG-1XGTCTCGATCTGCTTTC-1YGTCTGGGCGGTCGAGA-1ZGTCTTACCACGCCAAG-1[GTCTTGTAGCTATTCA-1\GTGAAACGGCGCCACC-1]GTGAACTCCCATTCGA-1^GTGAAGATTTCAAGTG-1_GTGAAGCCGTATAGTC-1`GTGAAGTCACGACTCG-1aGTGACAGCTTCCCACT-1bGTGACCGCACACTACG-1cGTGACGAGGGTGACCC-1dGTGACGCAGGTTTCAT-1eGTGACTTCAGTAGTGC-1fGTGAGCGTGCTGCACT-1gGTGAGGACACTTAAGG-1hGTGAGGAGCGGTTGAG-1iGTGAGTCGACTAATAG-1jGTGAGTGGTACAACGC-1kGTGATCACTAACGCCT-1lGTGATCATAGATCTGC-1mGTGATCCTTGTCATGA-1nGTGATGCACAACATCT-1oGTGATTCGCCGCTCAA-1pGTGCACCAGCTTCAAC-1qGTGCACGAAAGTGACT-1rGTGCCATCACACGGTG-1sGTGCCCGTTCGGATTC-1tGTGCCGCTTCAAAGGT-1uGTGCCTGAGACCAAAC-1vGTGCGAAATCGAACAC-1wGTGCGACAGGGAGTGT-1xGTGCGGGTCTCCAAAT-1yGTGCGTGTATATGAGC-1zGTGCTCAAGTACTGTC-1{GTGGAACCTACATGCG-1|GTGGACCAACCCGATT-1}GTGGACGCATTTGTCC-1~GTGGAGCGTTTACCGA-1GTGGAGTCGGCGGTTG-1€GTGGCAAACAGCGGCA-1GTGGCGGTCCCAGCGT-1‚GTGGCTGTTTCTGTTC-1ƒGTGGGAAGACTGAATC-1„GTGGGCTTAGACACAC-1…GTGGGTACTGAGCGTA-1†GTGGTATAGTCTGCCG-1‡GTGGTGGCCAAGTGAA-1ˆGTGGTTACTTCTTTCG-1‰GTGGTTTCCGCCTTTC-1ŠGTGTACCTTGGCTACG-1‹GTGTATATCAGCGGGC-1ŒGTGTCGTATAGCGTTC-1GTGTGAATAACTTAGG-1ŽGTGTTACTATGCGTCC-1GTTAAAGTAGGACTGG-1GTTAACATCACTTAAA-1‘GTTAACTATGTTGTCA-1’GTTAAGGGTGCGATGT-1“GTTACAATTGGTGACG-1”GTTACCTACAACTTGC-1•GTTACTTTGGGCCTAG-1–GTTAGCCCATGACATC-1—GTTAGCCGTAAATCAA-1˜GTTAGGCTACCCGTTT-1™GTTATAATACGGTGAA-1šGTTATATCAGGAGCCA-1›GTTATATTATCTCCCT-1œGTTATCAAGCTATCGA-1GTTCACAGGAGTCTAG-1žGTTCATCGTTTGGCTG-1ŸGTTCGCCATAAGTGCC-1 GTTCGCTGAGACGTCT-1¡GTTCGGATCGGGAACA-1¢GTTCGGGCGTACCATT-1£GTTCGTCTAAAGAACT-1¤GTTGAACCGGTTCCAT-1¥GTTGAGTCCCGCCGGT-1¦GTTGCACGGAGTTTCG-1§GTTGGACCGCATCAGG-1¨GTTGGATTCAGTGGCT-1©GTTGGATTGAGAACAC-1ªGTTGGATTTGCGTTGG-1«GTTGGTCATGCTATCC-1¬GTTTACGTTCCATCTG-1­GTTTCAAACGAGTTGT-1®GTTTCATATCGTCGCT-1¯GTTTCCTGGAGGGTGA-1°GTTTCTAGAGGCGCGG-1±GTTTCTGCAGTCTCCC-1²GTTTGACCAAATCCTA-1³GTTTGGCCCAAGTTAT-1´GTTTGGGCTTGTGAGC-1µGTTTGGGTTTCGCCCG-1¶GTTTGGTAGGGTCAAC-1·GTTTGTTAGCCAAGTA-1¸TAAACCCAGGAGGGCA-1¹TAAAGCGGTATTTCCA-1ºTAAAGCGTTAGGAGAA-1»TAAAGCTGCAATAGGG-1¼TAAATGCCGTCTCATG-1½TAACATACAATGTGGG-1¾TAACATACACGCGATC-1¿TAACCTACCGTCCGAG-1ÀTAACCTAGGGAGTCCA-1ÁTAACTATTACGCCAAA-1ÂTAACTCATCCGCGCGG-1ÃTAAGAGGGACAGGGAC-1ÄTAAGCCCTTACGACCA-1ÅTAAGGCAACATAAGAT-1ÆTAAGGCATAACATCAA-1ÇTAAGGCCCGTCACCCT-1ÈTAAGGCTGAATCCCTC-1ÉTAAGGGCCTGTCCGAT-1ÊTAAGTAACATCTTGAC-1ËTAAGTCGCCGAGTATC-1ÌTAAGTTGCGACGTAGG-1ÍTAATAAACAAGGAGAT-1ÎTAATACACAGTAGTAT-1ÏTAATACTAGAACAGAC-1ÐTAATAGAACAGAGTTA-1ÑTAATAGGTCACCAGAA-1ÒTAATAGTGACGACCAG-1ÓTAATCGATCCGTACGT-1ÔTAATTACGTCAGTAGA-1ÕTAATTAGGACATCCGT-1ÖTAATTGGAATCGGGAA-1×TAATTTCCGTCCAGTA-1ØTACAACAGCGCATACA-1ÙTACAACGCACAACTCA-1ÚTACAAGGGCTTCTTTA-1ÛTACAAGTCTCGTGCAT-1ÜTACACAGCCGTGGTGC-1ÝTACACCTCTTCGAATC-1ÞTACAGAAACGGTGGGC-1ßTACATAGGCATACACC-1àTACATCCCTATCCCTG-1áTACATTTCTAACGTGC-1âTACCAAATAGCCCAGA-1ãTACCAATAAAGTACCA-1äTACCAGAAGTAGGTTC-1åTACCGAATAATTGTAA-1æTACCGCGGACTTGCAG-1çTACCGGCTCACTGCCC-1èTACCGGTCGTTTCCAT-1éTACCGTAGGTTAACTA-1êTACCGTGCCTCGGACC-1ëTACCTACTCCCAGTAT-1ìTACCTATCCCTAGAGG-1íTACCTCAGTTGTCTGT-1îTACCTTAAGATTTCCC-1ïTACGAACACGACTTCA-1ðTACGACGCTTGCTGCG-1ñTACGACTGCCTCTTAG-1òTACGAGAACTTCACGT-1óTACGATGTTGATCATC-1ôTACGCAGTTCTTTCCT-1õTACGCCATATTCTAAT-1öTACGCCGAGGGTACCC-1÷TACGCCTCCATTCCGA-1øTACGCTATAGAAACCT-1ùTACGCTCGGTATTGGA-1úTACGGAAGCCAAACCA-1ûTACGGGATGCTAGCAG-1üTACGGGTAATAACATA-1ýTACGTAAAGCGGAGTG-1þTACGTGGGCCCAGGGC-1ÿTACGTTTACCGGCAAT-1TACTACGTGCAATGCG-1CTGGGATAAATAATGG-1CTGGGCCTGCTATATC-1CTGGGTAGGCAGTTAA-1CTGGGTTGAGTTAAAG-1CTGGTAAAGACTTACA-1CTGGTAACACATAGAA-1CTGGTAACGAGCTCTT-1CTGGTTTCGAGCAAGA-1 CTGTACTTCTTAGCAT-1 CTGTAGCCATCTCACT-1 CTGTCAAATGGCTCGG-1 CTGTGCAGGGTAGGTC-1 CTGTGGTCGGGAGATA-1CTGTTACCCAATCTAG-1CTGTTCACTGCCTGTG-1CTTAACTTACAGTATA-1CTTAAGCAGCGAGCCG-1CTTACACGGTATTCCA-1CTTAGCCTTCCACATG-1CTTAGGTATAGACCAG-1CTTAGTAGGCCTACAG-1CTTAGTGTAGTAGCAT-1CTTATGCGCTCAGGGC-1CTTCAACTCCACTTGG-1CTTCAGTGGTCGCCTA-1CTTCAGTTGGACAACG-1CTTCATTGTCAGTGGA-1CTTCCGCTCCGTGAAG-1CTTCGATTGCGCAAGC-1CTTCGGCCAATTGTTT-1CTTCGTAGATAGGTGA-1 CTTCTATGTTGAAGTA-1!CTTCTATTAATGCTAG-1"CTTGAGTTAGGGTAAT-1#CTTGATGACCATCCAG-1$CTTGCAACCGCCTCCT-1%CTTGCCCACCCACGCA-1&CTTGCCCAGGCTCTAC-1'CTTGGCCAAGCTGGGA-1(CTTGTACTTGTTGACT-1)CTTGTCAACATTCGAG-1*CTTGTGCTCACCGATT-1+CTTGTTGCTGAGTCAA-1,CTTTAACTTTCAAAGG-1-CTTTAATATTGGTCGA-1.CTTTACCGAATAGTAG-1/CTTTAGGAACACTGTT-10CTTTAGTGCTATTATT-11CTTTCTGTGCGGGCTT-12CTTTGACGTCGCTTCT-13CTTTGCATCGCTCTTG-14CTTTGGCTTTAGTAAA-15CTTTGTCGAATGCTCC-16GAAACAGATGACCACC-17GAAACATAGGAAACAG-18GAAACCATGGTGCGCT-19GAAACCGAATTACCTT-1:GAAACCTATACAAATG-1;GAAAGAACAGCGTTAT-1<GAAAGCAGTGCACTTT-1=GAAAGCCCTTTGGACC-1>GAAATATCACCATCAG-1?GAAATATGCTTGAATG-1@GAAATCGCGCGCAACT-1AGAAATGGCGGTGTTAG-1BGAAATTAGCACGGATA-1CGAAATTGTCTCTATAA-1DGAACAACTGGGATGAA-1EGAACACACATCAACCA-1FGAACAGATTACTAAAT-1GGAACCCTCTGTGTTCT-1HGAACCTCGACCTACAC-1IGAACCTTTAACGATCC-1JGAACGACCGAATGATA-1KGAACGCGGGTCACACG-1LGAACGTCTCATGGTCG-1MGAACTGTGGAGAGACA-1NGAAGAAACGATATTGT-1OGAAGCCACTGATTATG-1PGAAGCCTGCACATTCC-1QGAAGCGTGAGGAATTT-1RGAAGCTCGGACCCGTC-1SGAAGCTTGCTGACCGC-1TGAAGGAGTCGAGTGCG-1UGAAGTCAGTTGCACTA-1VGAAGTCTCCCTAGCGA-1WGAAGTGATTTATCGTG-1XGAAGTTTCCACTCAAT-1YGAATAGACGCGACCCA-1ZGAATAGCCCTGCGGTC-1[GAATCGACATGGTCAC-1\GAATCTGAACATTCTC-1]GAATGCGAATCGGTTC-1^GAATGGGCTTATCGAC-1_GAATGTATGGCAGGTC-1`GAATGTGGTCCGGATT-1aGAATGTTGGGTAATCT-1bGAATTATAGTGAAAGG-1cGAATTCACCCGGGTGT-1dGAATTTCTCGCTGCAG-1eGACAAACATATGCAGG-1fGACAACGACCATTGAA-1GCOLGACAACGCAGCTTACG-1GACACAAGGGAAGAAA-1GACACAGCCGGGACTG-1GACACTGAGTTCAGTG-1GACACTGGAACCCGAT-1GACACTTCCAATTACC-1GACAGATTTCTGGCTC-1GACAGCCAGACCTGAC-1 GACAGGCACACACTAT-1 GACATCCGTCGAACTG-1 GACATCGATTTATAAC-1 GACCAAACGTTGACTG-1 GACCACACTTCCCTTT-1GACCAGAGCCCTGTAG-1GACCCAATTATGATAC-1GACCGACGTGAAAGCA-1GACCGACTGAAGCGTC-1GACCGCGTCTGACGTG-1GACCGTGCTGACGGTG-1GACCGTTACATGCGAC-1GACCTTCCACGTCTAC-1GACGACGATCCGCGTT-1GACGAGGCTAATAAAC-1GACGCATACCCGTCGG-1GACGCCGTAAAGGCTA-1GACGCTTGCTTCTAAA-1GACGGGTTGGCCCGTA-1GACGGTCAATAGAAGC-1GACGTGTAGGGATTAT-1GACTAAGATCATGCAC-1GACTAAGTAGGCTCAC-1 GACTACAAAGCGGTGG-1!GACTAGGCCGTTAGGT-1"GACTCACCCACGTGAG-1#GACTCCCAGAATAAGG-1$GACTCCTTCCAATTGA-1%GACTCGCGGGAATGAC-1&GACTGCAAATCGAGCT-1'GACTGCACCAGCCCAG-1(GAGAACGGTTCTGACT-1)GAGACCCTGCAACGCC-1*GAGACTGATGGGTAGA-1+GAGACTTCGCGACCGA-1,GAGAGGGCGCGAGGTT-1-GAGAGGTGCATTCTGG-1.GAGATCTGCTTGGCAT-1/GAGATCTGTCACTCCG-10GAGATCTTCCATGACA-11GAGATGGCTTTAATCA-12GAGATGGGAGTCGACA-13GAGCACCTGTGTCCAG-14GAGCCAGCTACCTGTG-15GAGCCGAGCGTTTATT-16GAGCGCAAATACTCCG-17GAGCGCGCACGAGTAG-18GAGCGCTGTTAGGTAA-19GAGCTAAGGGCATATC-1:GAGCTGTCGTCTCGGA-1;GAGGAATGGAGAGGTT-1<GAGGATAAACAGTGCT-1=GAGGCCCGACTCCGCA-1>GAGGCCTGTTGATACA-1?GAGGCTATCAAAGTCG-1@GAGGGCGCAGCTCTGC-1AGAGGTACGCGTGTCCC-1BGAGTAAGGCCACGGGA-1CGAGTAGATACTAGTTG-1DGAGTATGCCCGCCTTG-1EGAGTATGCGCGTGCAT-1FGAGTCAGACCAGAATC-1GGAGTCCGCTTACCGGA-1HGAGTCTTGTAAAGGAC-1IGAGTGTCAACCAGAAA-1JGAGTGTGCGGTACCCA-1KGAGTTCTGTGGGTGCT-1LGAGTTGATGGCAATTT-1MGATAACTCGCACTGTG-1NGATACGATGGGAGTCA-1OGATAGATAGTACAGTC-1PGATAGGTAACGTTGAC-1QGATATCAAGCAGGAGC-1RGATATGAGACACTAAC-1SGATATGCGGTAGCCAA-1TGATATTGAGATTGGCG-1UGATATTTCCTACATGG-1VGATCATTCCAAACATT-1WGATCCCTTTATACTGC-1XGATCCGGGAATTAACA-1YGATCCTAAATCGGGAC-1ZGATCCTCGACACTGGC-1[GATCGACACTATCTGA-1\GATCGCGGGCTCTCCA-1]GATCGCTACCCGATTT-1^GATCGCTATATCTCAG-1_GATCGGATAGAACCAT-1`GATCGGTGGCCATAAC-1aGATCGTGACTGATATC-1bGATCTAACCGTATTCA-1cGATCTGCTATCTAAGG-1dGATCTTGGAGGGCATA-1eGATCTTTGCAGGGTAT-1fGATGACAAGTAGGGCA-1gGATGACGATGATCGCG-1hGATGAGGAACCTTCGG-1iGATGCCTTCTGCGGCA-1jGATGCGTCCTGCATTC-1kGATGCTGTATTTCATC-1lGATGTAACGAACCACC-1mGATGTTCAATCCACGA-1nGATTAACCGAAAGCCC-1oGATTACTGAATTTGGG-1pGATTCCCTTGTCGCAG-1qGATTCCGCGTTTCCGT-1rGATTCGACGGTTCACG-1sGATTGGGAAAGGTTGT-1tGCAAACCCTACATTAT-1uGCAAACCTTGGCCATA-1vGCAAATATTACGCTTT-1wGCAAATGAGGACACTT-1xGCAACACACTAGAACT-1yGCAACAGCAGTATGCG-1zGCAACCACCAGACCGG-1{GCAACCACGGCCGCGT-1|GCAACGGCTAGTTATG-1}GCAAGAATTCCTTGGC-1~GCAAGATGTGTTCGCG-1GCAAGCTGGAAACCGC-1€GCAAGTGCACAGAGAA-1GCACAAACGAGGCGTG-1‚GCACAACCTCGGGCGT-1ƒGCACACACTGGTAGCC-1„GCACCTAGGCGAGTCC-1…GCACGCCGATTCCCGC-1†GCACGCCTACTTAGAT-1‡GCACGTGGTTTACTTA-1ˆGCACTGCCTACCTTTA-1‰GCAGACCCAGCACGTA-1ŠGCAGATCCATAAGACT-1‹GCAGATTAGGGATATC-1ŒGCAGCACACAGCCCAG-1GCAGCCTATATCACAT-1ŽGCAGCTATGGACAGGT-1GCAGCTGTCAACGCAT-1GCAGGAACTTAGATCT-1‘GCAGGACTATAGAATA-1’GCAGGTAGAGTATGGT-1“GCAGTGTGGCTATAGG-1”GCATAGAGCACTCAGG-1•GCATCGGCCGTGTAGG-1–GCATGAGGGACGCGGC-1—GCATGCTAATAACGAT-1˜GCATGGGTACTGACGC-1™GCATTCAAGGCAACGC-1šGCATTGACTTGCGGAA-1›CGTGCATTGTCGACGC-1œCGTGCCCTCCCGAAGA-1CGTGGCCGAATATCTA-1žCGTGTATGGGAGCTGA-1ŸCGTGTCCCATTCGCGA-1 CGTTAAACTAGTTAGG-1¡CGTTAATGTCCCGACG-1¢CGTTAGCTCACAACTG-1£CGTTATCATACTTCCA-1¤CGTTCAGACCCGCGAA-1¥CGTTCATGGTGCGCGT-1¦CGTTCTTCGCACACCT-1§CGTTGAATACCGCGCT-1¨CGTTGAGCGACCGTCG-1©CGTTGAGTAATTGCGT-1ªCGTTGTAAGATTGATT-1«CGTTGTCGGCAATTGA-1¬CGTTGTTTCAATTCCC-1­CGTTTCACTTCGGGCG-1®CGTTTCGCTCATTACA-1¯CGTTTGTGTAGAGGGT-1°CTAAAGAATGCCTACT-1±CTAAAGGGAAATAGGA-1²CTAAATCCTATTCCGG-1³CTAACAGCACAATAAC-1´CTAACCGCGCGCCCGT-1µCTAACGAAACTTGCTG-1¶CTAACTGATAATCGCC-1·CTAACTGGTCCGGTTC-1¸CTAAGGGAATGATTGG-1¹CTAATTCGCACGCGCT-1ºCTAATTCTCAGATATT-1»CTACACTCGCAGATGG-1¼CTACCCTAAGGTCATA-1½CTACGACTAGCTATAA-1¾CTACGCACGGAGTACC-1¿CTACTATCATAGGTTT-1ÀCTACTATCTTTCAGAG-1ÁCTACTCAAGGTATAGT-1ÂCTACTCTAGGCCCGGC-1ÃCTACTGCCACCTGACC-1ÄCTAGATGTGAGTGTAA-1ÅCTAGATTTACGACGGC-1ÆCTAGCATAGTATAATG-1ÇCTAGCCGATGTTATGA-1ÈCTAGGCGCCCTATCAG-1ÉCTAGGTCTGAAGGAAT-1ÊCTAGGTTCGGACGTGA-1ËCTAGTAGAAAGGGATT-1ÌCTAGTCACGTCTTAAG-1ÍCTAGTGAAGGACAGGA-1ÎCTAGTTACAACCCGGT-1ÏCTAGTTGGGCCCGGTA-1ÐCTATAAGAGCCAATCG-1ÑCTATACTTAAAGCGAG-1ÒCTATCGACGAAATACA-1ÓCTATCGGGTCTCAACA-1ÔCTATGCCCGAATGCAA-1ÕCTATGGGAAGCGGAAT-1ÖCTATGTCACTAGCCCA-1×CTATGTGAGTCACGGC-1ØCTATTCATGTGTCCCA-1ÙCTATTGTGTTTGGTCA-1ÚCTATTTGCTTGGAGGA-1ÛCTATTTGGTTACGGAT-1ÜCTCAACTAACCCGGAT-1ÝCTCAAGACATTAGCGC-1ÞCTCACATTTACTAAAT-1ßCTCACTGTGATACTTA-1àCTCACTTGGCTGGTAA-1áCTCAGATTGTGATAAG-1âCTCAGTCACGACAAAT-1ãCTCATAAATGTGTATA-1äCTCATGGTAATTTGCG-1åCTCATTGCTCTAACAA-1æCTCATTTGATGGGCGG-1çCTCCCTCCTTTCGATC-1èCTCCGCCCACATGAGG-1éCTCCGGCCTAATATGC-1êCTCCTCCAGCTCACAC-1ëCTCCTTTACGCAAGTC-1ìCTCGAGACATACGATA-1íCTCGAGGTCGAACAGT-1îCTCGATATTTGCGAGC-1ïCTCGCACCTATATAGT-1ðCTCGCATTGCATAGCC-1ñCTCGCCGAATGTAGGG-1òCTCGCTAGGTAAGCGA-1óCTCGGTACCACTGCTC-1ôCTCGGTTGTCGGCCCT-1õCTCGTCGAGGGCTCAT-1öCTCGTCTGTGCCTTCG-1÷CTCGTTTCTAATGTTT-1øCTCTAATGCATTGATC-1ùCTCTACACTGGCGATT-1úCTCTAGCCCTCGGAAA-1ûCTCTATTTGGCTGCAG-1üCTCTCACAATCGATGA-1ýCTCTCTAACTGCCTAG-1þCTCTGGACGCCTGGTG-1ÿCTCTTCTATTGACTGG-1CTCTTGTCCCGCTTGG-1CTGAAAGAGATCCGAC-1CTGAATCCGAGACCTC-1CTGAATTTATTGCCAG-1CTGACTGCGCAGCTCG-1CTGCAAGCACGTTCCG-1CTGCACAACTACATAT-1CTGCACTCCAGTACAG-1CTGCAGAGAATCAGAG-1 CTGCCAAGGTTGGAAG-1 CTGCCATGCATCACAT-1 CTGCCTTTCTAGTAAA-1 CTGCGACCTCGCCGAA-1 CTGCGTTACGATATAA-1CTGCTGAGGCCACGAA-1CTGCTTGGCGATAGCT-1CTGCTTTATGTCCGCG-1CTGGAAATGGATGCTT-1CTGGAAGACACGGTGG-1CTGGACGCAGTCCGGC-1CTGGATTTACACTTGA-1CTGGCATCCGAATGAG-1CTGGCGACATAAGTCC-1CTGGCGATTTACATGT-1CTGGCGCACAGGTCTG-1CTGGCTGATTCATCCT-1CTGGCTGGTTGTCAGT-1CGCGTTCATGAAATAC-1CGCTACGGGACATTTA-1CGCTAGAGACCGCTGC-1CGCTATTCTTAGGCTC-1CGCTCTCCGTAGATTA-1 CGCTGGTGACTACCCT-1!CGCTGTGACGCCGCAC-1"CGCTGTGTGGATGTTG-1#CGCTTATTCCCGGTCG-1$CGCTTCGGTCTAAGAC-1%CGCTTTCTTGCATTCG-1&CGGAAAGAATCAAACG-1'CGGAACGTAAACATAG-1(CGGACCTTTACGTCCC-1)CGGACGTTACTTGAAG-1*CGGAGCAATTTAATCG-1+CGGAGCATGGCGATCC-1,CGGAGTTTGAGAGACA-1-CGGATCCTCAAGGACT-1.CGGCAAACATCGTGCG-1/CGGCAATAAGATCGCC-10CGGCAGGGTCGGGTTG-11CGGCCACGCACAAAGT-12CGGCCCAACCTGTAGT-13CGGCCCAGGTATATCC-14CGGCGCCATCAATCCC-15CGGCTCTAAAGCTGCA-16CGGGAATATAGTATAC-17CGGGAATTTATGTAAA-18CGGGAGCTTCAGTGTA-19CGGGATCAATGTAAGA-1:CGGGCAGCTAAACCGC-1;CGGGCCTTCTTTGTAA-1<CGGGCGATGGATCACG-1=CGGGTGTACCCATTTA-1>CGGGTTTGTTAGGGCT-1?CGGTACGGCAAACCCA-1@CGGTACTAGAATCAAA-1ACGGTAGAGGTGCAGGT-1BCGGTATAGGTATTAGC-1CCGGTCAAGTGGGAACC-1DCGGTCCGTCGCAAGCC-1ECGGTCTATCAACCCGT-1FCGGTGAAGACTAAAGT-1GCGGTGCAGATAGAACG-1HCGGTGCGCGTTGGTCC-1ICGGTGGGCTCCAGCCT-1JCGGTTATCCAACAGTG-1KCGGTTCAAGTAGGTGT-1LCGGTTGACCTGGCATA-1MCGTACCTGATAGGCCT-1NCGTAGAGAGTAATTAT-1OCGTATTAAGAGATCTA-1PCGTCACGTCCATTGGT-1QCGTCCTCATCGCGTGC-1RCGTCGCATGTGAGCCA-1SCGTCGGATAGTGTTGA-1TCGTCGGGTCTAAGCGC-1UCGTCGTCCTTCGCGAA-1VCGTGAAGTTAATTCAC-1WCGTGACATTGGGTCGT-1XCGTGACCAGTCCTCTG-1YCGTGCACACCACTGTA-1ZCGTGCAGACTGGGACA-1[CGATGTTGTTATCTAC-1\CGATTAAATATCTCCT-1]CGATTCGCCTGGCTGC-1^CGCAAACACGAGTTAC-1_CGCAATTAGGGTAATA-1`CGCACATGTCCACTAC-1aCGCACGTGCGCTATCA-1bCGCAGATCTTCACCCG-1cCGCAGGCGATCCAAAC-1dCGCATGCCGAATGCGT-1eCGCATGGTGCGATGCT-1fCGCATTAGCTAATAGG-1gCGCCACAGGTCGCGAT-1hCGCCATCCGATTATGA-1iCGCCCAGCACGCCTAG-1jCGCCCAGCGTTTCACG-1kCGCCCGCTTCCGTACA-1lCGCCGCCCATGCCTGT-1mCGCCGTTCAGCATAGT-1nCGCCTCCCTCCTCTAT-1oCGCCTGGCCTACGTAA-1pCGCGAAGTGGCATACT-1qCGCGACCGCGACAGAT-1rCGCGAGAGGGACTTGT-1sCGCGAGTCTGCCGGGT-1tCGCGCAAATGTCCAGA-1uCGCGCATGTTTGATTG-1vCGCGCCCGACTTAATA-1wCGCGGCTCAACTTGAA-1xCGCGGGAATTAGGCAG-1yCGCGGGAATTCCTTTC-1zCGCGGTCACAAACCAA-1{CGAGAGCGCGTAGATA-1|CGAGAGCTTTCACTAC-1}CGAGAGGGTAGCCGCG-1~CGAGCTGGGCTTTAGG-1CGAGGCTAAATATGGC-1€CGAGGGACTGCGGTCG-1CGAGGGTATCCAGGTG-1‚CGAGTACTAAAGAGGA-1ƒCGAGTGAAGGTACCAG-1„CGAGTTCTGTCCCACC-1…CGAGTTTATCGGACTG-1†CGATACCTCGCGGACA-1‡CGATAGTCGTACTGCA-1ˆCGATCCGACCCAGTGC-1‰CGATCTGTTGGAGGAC-1ŠCGATGGACCCTACGCC-1‹CGACCCTTAACGCCGG-1ŒCGACCTACTAGACAAT-1CGACGCATCCGTACCT-1ŽCGACTCAGGATGTTAT-1CGACTTTGTATAGCCT-1CGAGACCCTAGAGTGT-1‘CGAGACTACTGCTGCT-1’CGAGAGATGTGAACCT-1“CGAATGACGCATAATG-1”CGACAATTTGATCTAA-1•CGACACGCTCCGACAG-1–CGACAGTTCGCGTTAT-1—CGAATCTGCTCGACGC-1˜CGAATGAAGTCATTGC-1™CGAAGTTGCTCTGTGT-1šCGAAGCTATAAATTCA-1›TGAGAGATTTACCACG-1œTGAGATTAGGCCCTAA-1TGAGCCATACAGTCTC-1žTGAGCGGAAAGTGTTC-1ŸTGAGCTTTAATGACGC-1 TGAGGAGTGCCAGCTT-1¡TGAGGCATGTACTGTG-1¢TGAGTAAATTAGCGTA-1£TGAGTGCCTCTTAAAT-1¤TGAGTGGTCCGTGACG-1¥TGAGTGTAACAACGGG-1¦TGAGTTAAAGACATTC-1§TGATACATTTAGCCGT-1¨TGATCAGGGAACTGCT-1©TGATCCCAGCATTAGT-1ªTGATCGGTTTGACCCT-1«TGATCTACGCTGATCT-1¬TGATCTATCACACTCT-1­TGATCTCCGGCGCCAG-1®TGATGGCTGTTTCTGA-1¯TGATGTCAATTAAGTG-1°TGATTATGGCACGCAG-1±TGATTCAGGTCCCGCG-1²TGATTCCCGGTTACCT-1³TGATTCGTCTATCACT-1´TGATTCTGTCGCCGGT-1µTGATTTATTAGCTGTG-1¶TGCAACCCATCTGCGG-1·TGCAACTACTGGTTGA-1¸TGCAAGAATGACGTAA-1¹TGCAATCTAACACGGT-1ºTGCAATTTGGGCACGG-1»TGCACAGTGAAGTTAT-1¼TGCAGAACTATATCGT-1½TGCAGAGTACCGAGCA-1¾TGCAGATCGTCCTAGG-1¿TGCAGCTACGTACTTC-1ÀTGCAGGATCGGCAAAG-1ÁTGCAGTTTCCTCCCAT-1ÂTGCATATGTCTGTCAC-1ÃTGCATGGATCGGATCT-1ÄTGCATGTGGTAATCTA-1ÅTGCCAAAGTCAGACTT-1ÆTGCCAATGGGTACTCT-1ÇTGCCACACTAGAGGAA-1ÈTGCCACCTGGCGAAAC-1ÉTGCCAGTACGTGGAGA-1ÊTGCCATTACTAAAGAA-1ËTGCCCGATAGTTAGAA-1ÌTGCCCGTACCGTTAAA-1ÍTGCCGTGGATCGTCCT-1ÎTGCCGTGGGACCCAAT-1ÏTGCCGTTCTTAATCGG-1ÐTGCCTAATTGAAGATT-1ÑTGCCTGATCAAACGAT-1ÒTGCCTTGGCCAGGCAA-1ÓTGCGAATATGGGATTT-1ÔTGCGACACCCTAGTGC-1ÕTGCGAGAATATTACCC-1ÖTGCGAGATGGCGGCCA-1×TGCGAGCCCTTCCGCG-1ØTGCGCAAAGCATTTGG-1ÙTGCGCGATTAACGGAG-1ÚTGCGGACTTGACTCCG-1ÛTGCGGAGTAAAGGTGC-1ÜTGCGTAAGAACCTGAT-1ÝTGCGTACGGCTAATTG-1ÞTGCGTCATGACTGAGC-1ßTGCGTTTGTTGACACT-1àTGCTAAGTGTCTATTT-1áTGCTCCACAGTTCTTA-1âTGCTCGGCGAAACCCA-1ãTGCTCGGTGGGTCACC-1äTGCTCTTGAGAGTTTG-1åTGCTGTTGAAGAACTC-1æTGCTTCCCAAGCAGTA-1çTGGAACCACTGACACA-1èTGGAAGAAGGGAACGT-1éTGGAAGGATAAAGATG-1êTGGAATATCCTTGACC-1ëTGGACCAATCTAAGAT-1ìTGGACGCAATCCAGCC-1íTGGACTGTTCGCTCAA-1îTGGAGTGATGCGATGA-1ïTGGCAAACTAAATTAC-1ðTGGCAACTCGCGCGCC-1ñTGGCAAGCACAAGTCG-1òTGGCAATGGGACGGCG-1óTGGCAGATTACGATCA-1ôTGGCAGCAGTAATAGT-1õTGGCATGAAGTTTGGG-1öTGGCCAAACTGAAGTA-1÷TGGCCAATTTGGTACT-1øTGGCCGTATATTGACC-1ùTGGCGACTGCTCCAAA-1úTGGCGATCAAGTTATG-1ûTGGCTACACTCTACCT-1üTGGCTATGTGACATAC-1ýTGGCTCTTGTCGCGTA-1þTGGCTTATGTATAATG-1ÿTGGCTTGTACAAGCTT-1TGGGATGCACTCATTC-1TGGGCAATAGTTGGGT-1TGGGCCACAAGAGCGC-1TGGGCCCATACTAATT-1TGGGCGATACAATAAG-1TGGGTGCACAAGCCAT-1TGGGTGGGATGTCATT-1TGGGTGTAATAGATTT-1TGGTAAGCAGGATTGA-1 TGGTAGAATATATGGG-1 TGGTCCCACGCTACGG-1 TGGTCGTGCAAGGCAA-1 TGGTCTGTTGGGCGTA-1 TGGTTAACTTACATTT-1TGGTTAAGGGCGCTGG-1TGGTTCAACGGGTAAT-1TGGTTCGTAGCAAAGG-1TGGTTTAAACGTGGGT-1TGTACCTACACGAGGG-1TGTACGAACAAATCCG-1TGTACTTCCGGGCATG-1TGTAGCCAATTCCGTT-1TGTAGCCATCCCATTC-1TGTAGGAGAAATTTCC-1TGTAGTGATCTATAAT-1TGTATAACAGATCCTG-1TGTATCAGACTGAAGC-1TGTATGGCGCAGACAG-1TGTCATTTGTTGGGAA-1TGTCCACGGCTCAACT-1TGTCCTAAGTCACCGC-1TGTCGTTATCACATAT-1 TGTGACTACGCCAGTC-1!TGTGACTAGAGTTTGC-1"TGTGAGACTAGCCCAA-1#TGTGCCAGAGGCAAAG-1$TGTGCCGGTGCCGGAA-1%TGTGGCAAAGCGTATG-1&TGTGGCGGGCTTCTGG-1'TGTGTCGAAGTCGAGG-1(TGTGTGACCATGAATC-1)TGTTATTGTATGTGGC-1*TGTTCCGCTTCCATGA-1+TGTTCCGGCCTGAGCT-1,TGTTCGTATTGCGGTG-1-TGTTCTTCCATTGACT-1.TGTTGTCAAGAAGTCT-1/TGTTTCTGAAGCGTGC-10TGTTTGAGATCGTCAG-11TTAAACTCGAATTCAT-12TTAAAGTAAGTCGCCA-13TTAACCAACCCTCCCT-14TTAACGAACAAGCAGT-15TTAACTTCAGGTAGGA-16TTAAGATAGGATTGAC-17TTAAGCGCCTGACCCA-18TTAAGGCCCGTACTTT-19TTAAGTATTGTTATCC-1:TTAATCAGTACGTCAG-1;TTAATGTAGACCAGGT-1<TTAATTGCTTTGGGTG-1=TTAATTTCAGACGCGG-1>TTACAACTACGCATCC-1?TTACACGATCTGCGAC-1@TTACAGACCTAAATGA-1ATTACATGCCACAACTA-1BTTACCATTGATTACCC-1CTTACCCATTGCCGGGT-1DTTACCCTAGGGATTGG-1ETTACGGATGGTTCGAG-1FTTACTAAAGGACTTTA-1GTTACTCCGGCCGGGAA-1HTTACTCTGGTACGTAC-1ITTACTGGGATATTTCA-1JTTACTGTCTAGAGCTC-1KTTAGAAGAACATGACT-1LTTAGAATAAGGGTCGG-1MTTAGACACGATCGTTG-1NTTAGACGAGTCACCTC-1OTTAGAGGGATATACAG-1PTTAGAGTTTAGAAGGA-1QTTAGCTAATACGATCT-1RTTAGCTGATTTGCCGT-1STTAGTAAACCTGCTCT-1TTTAGTAGGGCGGCGGG-1UTTAGTTATTCGTGGCA-1VTTAGTTCAAGTGTTCG-1WTTATAGGTAATTGTCT-1XTTATATACGCTGTCAC-1YTTATATTTGGCAATCC-1ZTTATCCGGGATCTATA-1[TTATCCTCAAGGAATA-1\TTATCTGACATTAGGA-1]TTATCTGTATCATAAC-1^TTATGAATGAAAGGGA-1_TTATGACAAACTGGAT-1`TTATGATCTTAACGAA-1aTTATTAGAGCGTGTTC-1bTTCAAAGTCTCTAGCC-1cTTCAATACTCTGAATC-1dTTCACGAAAGGATCAC-1eTTCACTCGAGCACCTA-1fTTCAGCCCTGGTCCAC-1gTTCAGCTGGCGTGCCC-1hTTCAGGCGTCAAAGCC-1iTTCATGGCGCAACAGG-1jTTCCAATCAGAGCTAG-1kTTCCAATCTGGCTATC-1lTTCCACACAGATTTGA-1mTTCCAGACGAGATTTA-1nTTCCATCATGCGGTGA-1oTTCCATCGACAGCGTG-1pTTCCCGGCGCCAATAG-1qTTCCGCAGAGAAATAT-1rTTCCGCGTGAGGCGAT-1sTTCCGGCCTTGAGGCT-1tTTCCGGCTCGACTTCT-1uTTCCGGTTACCCACTT-1vTTCCTCGAGGGTGTCT-1wTTCCTCGGACTAACCA-1xTTCGACAGAGCCCGTG-1yTTCGACGGGAAGGGCG-1zTTCGCACTCGCGTGCT-1{TTCGCACTGTACGACA-1|TTCGCCGCTCGCGCTA-1}TTCGCGCGCCATACGA-1~TTCGCTATCTGACGTG-1TTCGGCAACCCGCTGA-1€TTCGGGACTAATCGCG-1TTCGGGCGCTAGTCTT-1‚TTCGGTACTGTAGAGG-1ƒTTCGTACTCCAGAACG-1„TTCGTTCAACGAAGTT-1…TTCTAACCGAAGCTTA-1†TTCTAGAAAGTCTTAT-1‡TTCTAGGCCAATTGTG-1ˆTTCTATTAAACGCAGC-1‰TTCTCTTACAGGTGAT-1ŠTTCTGACCGGGCTCAA-1‹TTCTGCCGCGCCTAGA-1ŒTTCTGCGGGTTAGCGG-1TTCTGCTAGACTCCAA-1ŽTTCTTATCCGCTGGGT-1TTCTTGAGCCGCGCTA-1TTCTTGCTAGCATCTC-1‘TTCTTGGACGATCTGC-1’TTCTTGGAGTAATGAG-1“TTCTTTGGTCGCGACG-1”TTGAAAGGTGTAAAGG-1•TTGAACGACGTGCTGA-1–TTGAAGAATTCCCAGG-1—TTGAAGGATGGGCGCC-1˜TTGAATATGGACTTTC-1™TTGAATCGTTGTATAA-1šTTGAATTCACGTGAGG-1›TTGACAGGAGCTCCCG-1œTTGACATGAACGTGGA-1TTGACCAGGAACAACT-1žTTGACCATGTTCTCCG-1ŸTTGACCGTGTTAATGA-1 TTGACGCTCCATGAGC-1¡TTGACTACCATATGGT-1¢TTGACTATTGTCCGGC-1£TTGAGAAGTTTAGCAT-1¤TTGAGAGTACTGCTAA-1¥TTGATAGTCAATACAT-1¦TTGATCTAACTTTGTC-1§TTGATGTGTAGTCCCG-1¨TTGATTAGCTGTTTCT-1©TTGATTATGCAGATGA-1ªTTGCAAGAAGACTCCT-1«TTGCACAATTCAGAAA-1¬TTGCACGGAGCAGCAC-1­TTGCATGCTGATCACG-1®TTGCCAAGCAGAACCC-1¯TTGCCATAGCCCGCTC-1°TTGCCCTGATCACGGG-1±TTGCCGCAGACCTACA-1²TTGCCGCTTTCTAGTA-1³TTGCCTTCTCGCCGGG-1´TTGCGCTTGATCAATA-1µTTGCGGCATCAGAAAG-1¶TTGCGTCGGCCAACCG-1·TTGCGTGAACGCTTAG-1¸TTGCGTGTGTAGGCAT-1¹TTGCTCATAGTACGTG-1ºTTGCTCCCATACCGGA-1»TTGCTGAAGGAACCAC-1¼TTGCTGATCATGTTCG-1½TTGGAAGAATACAGTC-1¾TTGGACATGTGGCTTA-1¿TTGGACCATCTGGCAA-1ÀTTGGACCTATAACAGT-1ÁTTGGATATCGTCTACG-1ÂTTGGCCTAGAATTTCG-1ÃTTGGCTCAATATGTGT-1ÄTTGGGAAGACGAGCCG-1ÅTTGGGACACTGCCCGC-1ÆTTGGGACGTAAGAGTT-1ÇTTGGGCGGCGGTTGCC-1ÈTTGGTCACACTCGTAA-1ÉTTGGTTGCGGTGCGCG-1ÊTTGTAAGGACCTAAGT-1ËTTGTAAGGCCAGTTGG-1ÌTTGTAATCCGTACTCG-1ÍTTGTACACCTCGAACA-1ÎTTGTCACCGCGGTATC-1ÏTTGTCGTTCAGTTACC-1ÐTTGTGAACCTAATCCG-1ÑTTGTGAGGCATGACGC-1ÒTTGTGATCTGTTCAGT-1ÓTTGTGCAGCCACGTCA-1ÔTTGTGCGGAAGCGGAT-1ÕTTGTGGCCCTGACAGT-1ÖTTGTGGTAGGAGGGAT-1×TTGTGGTGGTACTAAG-1ØTTGTGTATGCCACCAA-1ÙTTGTGTTTCCCGAAAG-1ÚTTGTTCAGTGTGCTAC-1ÛTTGTTGTGTGTCAAGA-1ÜTTGTTTCACATCCAGG-1ÝTTGTTTCCATACAACT-1ÞTCCATCAATACTAATC-1ßTCCCAAACAGACAACG-1àTCCCAAAGACGAAGGA-1áTCCCACTCTCTTCCGG-1âTCCCAGCTTTAGTCTG-1ãTCCCAGGCTTAGCTAA-1äTCCCGCGTACTCCTGG-1åTCCCGGGTGTGCTGCT-1æTCCCGTCAGTCCCGCA-1çTCCCGTCGCGTCATAG-1èTCCCGTGTGCAATTTG-1éTCCCTAGATCAATAGG-1êTCCCTGGCGTATTAAC-1ëTCCCTGGCTCGCTGGA-1ìTCCCTTAGATTACTCG-1íTCCGAAGTAGTCACCA-1îTCCGAATGGTCCTGAG-1ïTCCGATAATTGCCATA-1ðTCCGATGACTGAGCTC-1ñTCCGATGGTGCGACAT-1òTCCGATTACATTGCCG-1óTCCGCCTGTCTACAAG-1ôTCCGCGGCAGCATCTG-1õTCCGCGGCCCAATGAA-1öTCCGCTGTCATCCCGG-1÷TCCGCTTATCCCATTA-1øTCCGGAGGAAGGGCTG-1ùTCCGGCCTAGCGTACA-1úTCCGGGCTTGACGGGA-1ûTCCGGTTCGTCCGGTC-1üTCCGTTAAGCTAATAT-1ýTCCGTTTAGCCTTGAA-1þTCCTAAAGATTCAGAC-1ÿTCCTAAATTGGGAAGC-1TCCTAACCGTCGGGCA-1TCCTACATCCACGGCC-1TCCTAGCAAAGAAGCT-1TCCTCCTAAGACATTC-1TCCTCGGGCTGGGCTT-1TCCTCTACGAGATGGC-1TCCTGCCAACTGGAGA-1TCCTGCGTTGATACTC-1TCCTGGCGCTGCCTGG-1 TCCTTACGACGGTCCG-1 TCCTTCAATCCCTACG-1 TCCTTGTCCTTTAATT-1 TCCTTTAAATCCGCTT-1 TCCTTTCTTACGCTTA-1TCGAAATTTAGGACCA-1TCGAAGAACCGAGCAC-1TCGAATATCCCGCAGG-1TCGACAACTGAACCCG-1TCGAGACCAACACCGT-1TCGAGTCTACGATTCG-1TCGCAAAGATGCATTT-1TCGCACCAGGAGGCAG-1TCGCATAAAGGGCGCA-1TCGCCGAAGTTGCGTC-1TCGCCGACATATTCGC-1TCGCCGCACCGCGTGA-1TCGCCGGTCGATCCGT-1TCGCGTAGCAGTGTCC-1TCGCGTCCAGAAGGTC-1TCGCTAAACCGCTATC-1TCGCTACTGGCTTTGA-1TCGCTCGATATATTCC-1 TCGCTCGGCACCAGCG-1!TCGCTGCCAATGCTGT-1"TCGCTGGGCGGATTGT-1#TCGCTTTAAACGTTTG-1$TCGGAATGCGCTCTGA-1%TCGGACGCCCAGCCCA-1&TCGGAGAGTATCGGGA-1'TCGGAGTACATGAGTA-1(TCGGCGAACCCAAACC-1)TCGGCGTACTGCACAA-1*TCGGCTTGTATCGACG-1+TCGGGAACGTGCCTAG-1,TCGGGAGACAGCGTAC-1-TCGGGCCGTCGTGGTA-1.TCGGTCCCGACAATAG-1/TCGGTGACCGCTCCGG-10TCGTAAGACGACATTG-11TCGTAAGCTCCGAGGA-12TCGTACCGACGTCAAG-13TCGTATTACCCATTGC-14TCGTCAAGTACGCGCA-15TCGTCTTAGGCGTTAA-16TCGTGTACTATGGATG-17TCGTGTCACGCTGACA-18TCGTGTTCGACCACAA-19TCGTTAGGAGTCCCTA-1:TCGTTGCTATCCGGTC-1;TCGTTTACGCGACCCT-1<TCTAAAGAACAGTCTC-1=TCTAACCTAGCCTGCG-1>TCTAATACTGCCTCAG-1?TCTACCCAATAGAGAG-1@TCTACCCGCATCATTT-1ATCTACCGTCCACAAGC-1BTCTAGCAATCTCCGCC-1CTCTAGCATCTTCGATG-1DTCTAGCATGCCCAGAA-1ETCTAGGTGGCGACGCT-1FTCTAGTGATATCGTGG-1GTCTAGTTATCAGAAGA-1HTCTATAGGTGGGTAAT-1ITCTATCGGTCGCAACA-1JTCTATGCTATAACGAC-1KTCTATTACTAGAGGAT-1LTCTCAAATCAATCGGG-1MTCTCATGAGATAGGGT-1NTCTCCAACGTAGGTTA-1OTCTCCACAAGTTGAAT-1PTCTCCCTGGGCAGCGT-1QTCTCGAACGAGGTCAC-1RTCTCGACGTATCGCCG-1STCTCGAGGAGGTTCGC-1TTCTCGTGTTACGAGGA-1UTCTCTAATAGCTGGTA-1VTCTGAACTCGTACCCG-1WTCTGAAGCACGTGGTC-1XTCTGAATTCCGTACAA-1YTCTGAGCAATTGACTG-1ZTCTGATGTATTCTGTC-1[TCTGCATACCTTGCTT-1\TCTGCCAGAAACTGCA-1]TCTGGGAACCTTTGAA-1^TCTGGGTAGCGCTCAT-1_TCTGTGCCATCATAGT-1`TCTGTTACCCAGCATA-1aTCTTACCGGAACTCGT-1bTCTTACTTATGCCTCT-1cTCTTAGAGCTCCAATT-1dTCTTAGAGTGAACTCT-1eTCTTCCCATGGGCACA-1fTCTTCGAATAGACGTT-1gTCTTCGATACCAATAA-1hTCTTCTATAACCCGCC-1iTCTTGATGCGTAGCGA-1jTCTTGCTCCCGATACT-1kTCTTGGTAACACCAAA-1lTCTTTAAGACTATGAA-1mTCTTTAGAGTCTAACA-1nTGAAAGGACCTGACTC-1oTGAACTGCTATGACTT-1pTGAATACCGACGCGTA-1qTGAATATGCTATAAAC-1rTGAATGTCAGCCGGCC-1sTGAATTTCACTTGCCT-1tTGACACTTCTCTTTGC-1uTGACAGGACAAGTCCA-1vTGACATATATGACGAT-1wTGACATCGAGCGGACC-1xTGACATGTAACGTGAC-1yTGACCAAATCTTAAAC-1zTGACCCACGTTAGACA-1{TGACGAATATTTCCCT-1|TGACGATGCACTAGAA-1}TGACTATAATCCTTTC-1~TGACTCCGAATCATAC-1TGAGACGTACCTCTCA-1€TATGGGTACGTATCGT-1TATGGTCTGAGTAACA-1‚TATGGTTAGTGGGAGA-1ƒTATGTAGAAACCCGGC-1„TATGTCAAGACCGACT-1…TATGTCTCATTGTGCC-1†TATTAACACCAAAGCA-1‡TATTAACCTGACCGCG-1ˆTATTACCATCCTGCTT-1‰TATTATGTTTGCCTGC-1ŠTATTCAATTCTAATCC-1‹TATTCCACTCAGCTCG-1ŒTATTCCGAGCTGTTAT-1TATTCCTCCGCCCACT-1ŽTATTCGTGCCAGAATA-1TATTGCCGGGCTTGTA-1TATTTAGTCTAGATCG-1‘TATTTATACCGAGTAG-1’TATTTGTTACCCTTTA-1“TCAAACAACCGCGTCG-1”TCAAACTTAGATTGTT-1•TCAAAGAGCTATCTGT-1–TCAAATTGTTGTGCCG-1—TCAAATTTGAGACTCA-1˜TCAACAAAGATAATTC-1™TCAACATAGCGCCCTA-1šTCAACATCGACCGAGA-1›TCAACCATGTTCGGGC-1œTCAACGAGGAGACAAA-1TCAACGCAGGAAATAA-1žTCAACGCGACCGGCAG-1ŸTCAACTGCAGAGTCAG-1 TCAAGAAATACTAGCT-1¡TCAAGCGCGGACGGTA-1¢TCAAGGTTACTACACC-1£TCAATACGCCGTCATG-1¤TCAATCCGGGAAGTTT-1¥TCACAAACCGAGGTAC-1¦TCACAGCAAACTCGAA-1§TCACAGGAGAATAAGA-1¨TCACAGGGAATCGCAA-1©TCACAGGTTATTGGGC-1ªTCACCCTCTTAAGATT-1«TCACCGCTCGGCACTC-1¬TCACGATGTCCGTGGA-1­TCACGCATTGTAGATC-1®TCACGGTCATCGCACA-1¯TCACGTGCCCGATTCA-1°TCACTACGACCAATGC-1±TCACTATCCCTTCGGT-1²TCACTCGTGCAACGGC-1³TCAGAACCTCCACAGG-1´TCAGACGCTATAGAAG-1µTCAGCAAATGCATCTC-1¶TCAGCCAATCCGTAAA-1·TCAGCTTGAGCTTTCG-1¸TCAGGGTGTAACGTAA-1¹TCAGGTTCTTTGAGAA-1ºTCAGTACTGACCCGCG-1»TCAGTAGGGACTATAA-1¼TCAGTGTATACGTCAT-1½TCATATGAGCTTTGTT-1¾TCATCCTCAGCTGCTT-1¿TCATCGACGACCGTCG-1ÀTCATCGATGGTCCCAA-1ÁTCATGCAGGTTCTCAT-1ÂTCATTTAAGTCTCCGA-1ÃTCATTTAGAAGTGTGA-1ÄTCCAACTCAGCTATCT-1ÅTCCAACTTTAAATTCT-1ÆTCCAAGCCTAGACACA-1ÇTCCAATAAAGGCTACC-1ÈTCCACAATGGTTTACG-1ÉTCCACATCGTATATTG-1ÊTCCACCAAGACATAGG-1ËTCCACCTCTAGCCTTT-1ÌTCCACTTTATCTAGGT-1ÍTCCAGAGCACCGGTTC-1ÎTCCAGATGTACGCCAA-1ÏTCCAGGCGAGTACGGT-1ÐTCCAGGGTATATACGA-1ÑTAGGGTGTTTCAAGAG-1ÒTAGGTCGCCGGAACTG-1ÓTAGGTGACGATAACCT-1ÔTAGGTGAGCCCTACTC-1ÕTAGGTGCTCGCCTAGC-1ÖTAGGTGTTCCACAGAT-1×TAGGTTCGAGTTCGTC-1ØTAGTACCACAACTTTC-1ÙTAGTAGCTTATACCAG-1ÚTAGTCCGCAGAGAATG-1ÛTAGTCGATCACGGGTT-1ÜTAGTCTAACAACGAGA-1ÝTAGTCTGTGACGTTGC-1ÞTAGTGCCCTCCAGAGT-1ßTATACACAGACGCCTT-1àTATACGCGTCATCACT-1áTATAGATGGTCGCAGT-1âTATAGCGCACGTTATC-1ãTATATATCGAGAAATG-1äTATATCCCTGGGAGGA-1åTATATTACAAATGTCG-1æTATCACCCAACCGACC-1çTATCACTTCGAGTAAC-1èTATCAGTGGCGTAGTC-1éTATCCAATTGGTTATC-1êTATCCATCTCGGTTAG-1ëTATCCGCACCGTCGGG-1ìTATCGATCTATGCATA-1íTATCGATGATTAAACG-1îTATCTACCACAGCGGG-1ïTATCTGAGCCGATATT-1ðTATCTTGCAATACAAC-1ñTATGAAGAATTAAGGT-1òTATGACCTTGCGCTGG-1óTATGATCCGGCACGCC-1ôTATGATCTTCTCTTTA-1õTATGCTCCCTACTTAC-1öTATGGATGTGCTACGC-1÷TATGGCCCGGCCTCGC-1øTATGGGACCGAGCAGG-1ùTAGATATGGACTGGAA-1úTAGATGGTTCCTTACT-1ûTAGCAGATACTTAGGG-1üTAGCAGTATGACTAAA-1ýTAGCCATTTCAAAGTC-1þTAGCCGGCGGTCAGCG-1ÿTAGCGTCCCTCGATTG-1TAGCGTCCGGTGTGGT-1TAGCGTTGGGTCTTAC-1TAGCTAAGTCCGGGAG-1TAGCTAGAAGGCATGA-1TAGCTAGTGATGATGG-1TAGCTCGCCTGATAAC-1TAGCTGATGTGAAGCG-1TAGGAGGCTCGAGAAC-1TAGGCATGTTACGCCA-1 TAGGCCTATATAGTCT-1 TAGGCGATGAGGTCTC-1 TAGGCTAAAGTGGCAC-1 TAGGGAGCTTGGGATG-1 TACTTTACTGAGCCGG-1TACTTTCCGCACGCCA-1TAGAAAGGTGGCGCTA-1TAGAATAGCCGATGAA-1TAGACGAAACGCCAAT-1TAGACGCCCGTACCGG-1TAGACTACCTAGCGTT-1TAGAGATCATGCAACT-1TAGAGGTTCTACTTGT-1TAGAGTCTAAGCGAAC-1TACTGAGGGAAGAAAG-1TACTGCAATCAATTAC-1TACTGGACAGCTCGGC-1TACTTAAACATGTACA-1TACTTGTTAGTAGTCC-1TACTCTTACTTTACTG-1TACTCTTTCGTCTTCA-1TACTGAACAGATTTAG-1TACTCTCCGAACAAAT-1 TACTCGTTTGAATCAA-1!TACTATGGTTCCTCAG-1"Gene Expression#Gene Expression$Gene Expression%Gene Expression&Gene Expression'Gene Expression(Gene Expression)Gene Expression*Gene Expression+Gene Expression,Gene Expression-Gene Expression.Gene Expression/Gene Expression0Gene Expression1Gene Expression2Gene Expression3Gene Expression4Gene Expression5Gene Expression6Gene Expression7Gene Expression8Gene Expression9Gene Expression:Gene Expression;Gene Expression<Gene Expression=Gene Expression>Gene Expression?Gene Expression@Gene ExpressionAGene ExpressionBGene ExpressionCGene ExpressionDGene ExpressionEGene ExpressionFGene ExpressionGGene ExpressionHGene ExpressionIGene ExpressionJGene ExpressionKGene ExpressionLGene ExpressionMGene ExpressionNGene ExpressionOGene ExpressionPGene ExpressionQGene ExpressionRGene ExpressionSGene ExpressionTGene ExpressionUGene ExpressionVGene ExpressionWGene ExpressionXGene ExpressionYGene ExpressionZGene Expression[Gene Expression\Gene Expression]Gene Expression^Gene Expression_Gene Expression`Gene ExpressionaGene ExpressionbGene ExpressioncGene ExpressiondGene ExpressioneGene ExpressionfGene ExpressiongGene ExpressionhGene ExpressioniGene ExpressionjGene ExpressionkGene ExpressionlGene ExpressionmGene ExpressionnGene ExpressionoGene ExpressionpGene ExpressionqGene ExpressionrGene ExpressionsGene ExpressiontGene ExpressionuGene ExpressionvGene ExpressionwGene ExpressionxGene ExpressionyGene ExpressionzGene Expression{Gene Expression|Gene Expression}Gene Expression~Gene ExpressionGene Expression€Gene ExpressionGene Expression‚Gene ExpressionƒGene Expression„Gene Expression…Gene Expression†mm10‡mm10ˆmm10‰mm10Šmm10‹mm10Œmm10mm10Žmm10mm10mm10‘mm10’mm10“mm10”mm10•mm10–mm10—mm10˜mm10™mm10šmm10›mm10œmm10mm10žmm10Ÿmm10 mm10¡mm10¢mm10£mm10¤mm10¥mm10¦mm10§mm10¨mm10©mm10ªmm10«mm10¬mm10­mm10®mm10¯mm10°mm10±mm10²mm10³mm10´mm10µmm10¶mm10·mm10¸mm10¹mm10ºmm10»mm10¼mm10½mm10¾mm10¿mm10Àmm10Ámm10Âmm10Ãmm10Ämm10Åmm10Æmm10Çmm10Èmm10Émm10Êmm10Ëmm10Ìmm10Ímm10Îmm10Ïmm10Ðmm10Ñmm10Òmm10Ómm10Ômm10Õmm10Ömm10×mm10Ømm10Ùmm10Úmm10Ûmm10Ümm10Ýmm10Þmm10ßmm10àmm10ámm10âmm10ãmm10ämm10åmm10æmm10çmm10èmm10émm10êENSMUSG00000025935ëENSMUSG00000025937ìENSMUSG00000067813íENSMUSG00000025932îENSMUSG00000054493ïENSMUSG00000025930ðENSMUSG00000032769ñENSMUSG00000092083òENSMUSG00000025925óENSMUSG00000032719ôENSMUSG00000067795õENSMUSG00000043716öENSMUSG00000025921÷ENSMUSG00000100868øENSMUSG00000025920ùENSMUSG00000089982úENSMUSG00000025939ûENSMUSG00000079658üENSMUSG00000097744ýENSMUSG00000025940þENSMUSG00000025779ÿENSMUSG00000101640ENSMUSG00000042686ENSMUSG00000100110ENSMUSG00000025777ENSMUSG00000099899ENSMUSG00000067780ENSMUSG00000100053ENSMUSG00000085125ENSMUSG00000025776ENSMUSG00000099895 ENSMUSG00000025774 ENSMUSG00000073735 ENSMUSG00000067773 ENSMUSG00000089787 ENSMUSG00000042596ENSMUSG00000025927ENSMUSG00000100538ENSMUSG00000043760ENSMUSG00000089914ENSMUSG00000099906ENSMUSG00000025929ENSMUSG00000041872ENSMUSG00000041859ENSMUSG00000102121ENSMUSG00000097934ENSMUSG00000025931ENSMUSG00000041809ENSMUSG00000041779ENSMUSG00000099971ENSMUSG00000067879ENSMUSG00000099827ENSMUSG00000025912ENSMUSG00000045210 ENSMUSG00000097893!ENSMUSG00000025915"ENSMUSG00000046101#ENSMUSG00000098234$ENSMUSG00000099032%ENSMUSG00000025916&ENSMUSG00000087199'ENSMUSG00000025917(ENSMUSG00000056763)ENSMUSG00000067851*ENSMUSG00000042501+ENSMUSG00000048960,ENSMUSG00000057715-ENSMUSG00000097171.ENSMUSG00000101314/ENSMUSG000000169180ENSMUSG000000259381ENSMUSG000000994982ENSMUSG000000424143ENSMUSG000000058864ENSMUSG000001014765ENSMUSG000000259056ENSMUSG000000337747ENSMUSG000000259078ENSMUSG000000900319ENSMUSG00000087247:ENSMUSG00000033740;ENSMUSG00000051285<ENSMUSG00000097797=ENSMUSG00000103067>ENSMUSG00000025909?ENSMUSG00000061024@ENSMUSG00000025911AENSMUSG00000025903BENSMUSG00000104217CENSMUSG00000033813DENSMUSG00000002459EENSMUSG00000085623FENSMUSG00000033793GENSMUSG00000025902HENSMUSG00000104328IENSMUSG00000033845JENSMUSG00000102343KENSMUSG00000025900LENSMUSG00000089699MENSMUSG00000051951NTram1OLactb2PXkr9QEya1RGm9947SMscTTrpa1UKcnb2VTerf1WSbsponX 4930444P10RikYRpl7ZRdh10[Gm28095\Stau2]Gm7568^Ube2w_Eloc` D030040B21RikaTmem70bLy96cGm28376dJph1eGm28783fGdap1gGm28784hPi15iGm28154jGm16070kCrispld1lGm28153mCrisp4nDefb18oDefb41pGm15825qTfap2drTfap2bsGm28340tPkhd1u 4930486I03RikvGm28653wIl17axIl17fyMcm3zGm28065{ 6720483E21Rik|Paqr8}Efhc1~Tram2Gm28287€ 3110035E14RikGm29520‚Mybl1ƒVcpip1„ 1700034P13Rik…Sgk3†Mcmdc2‡Snhg6ˆTcf24‰Ppp1r42ŠGm15818‹Cops5ŒCspp1Arfgef1ŽCpa6Prex2 A830018L16Rik‘Gm17644’Gm29663“Sulf1”Slco5a1•Gm29283–Prdm14—Ncoa2˜Gm29570™Oprk1šNpbwr1›Rb1cc1œ 4732440D04RikAlkal1žSt18ŸPcmtd1 Gm26901¡Gm30414¢Sntg1£Rrs1¤Adhfe1¥Lypla1¦Gm37988§Tcea1¨Rgs20©Gm16041ªAtp6v1h«Sox17¬Gm37323­Mrpl15®Gm37381¯Rp1°Gm1992±Xkr4¨+³Äÿÿÿÿÿÿÿÿ  deflateÀ%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð#dýin,s BxÜ(I}Ò0%‚î8÷†ã@å‹HÈÙPÝ•ØX¶š`ŽŸh’¤Æp¡©xg®ã€x³ßˆ[¸ó:½ä˜-ÂÓ Çô¨äË °ØÐÒ¸åÕ À·ÚȳÄÿÿÿÿÿÿÿÿ  deflate%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÂÝŽã¡é•¿îŽ Tô¯(âùÂ0‘ÿ”8SŽ@ç lHu»Pá€Xœl`!ƒhˆ&œp ,7x§1ƒ€Þ6zˆa<„ÛA¼˜_G± M½¨ÌR‚°‰X­¸ ^šÀ¸cȈ ÿÿÿÿÿÿÿÿ  deflate@%%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0 Rg?‚sÿÿÿÿÿÿÿÿ  deflate€.%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%ÁwØ6ø8TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€:(HEAPX09feature_typegenomeidname(dÿÿÿÿÿÿÿÿ deflateÈ;%z‚]PSNODp9øC 8M(xVTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿcdÿÿÿÿÿÿÿÿ deflateE%z‚]PTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýbdÿÿÿÿÿÿÿÿ deflateHN%z‚]PTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿadÿÿÿÿÿÿÿÿ deflateˆW%z‚]PTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿa¸_x^í“ÇRQ‡â¿À†/†d%H"I@É9#9ç$ð† »™^³ìÞuï„;U“‰¢è¹ +zã%DQNŸcÏMøÿسþ{Hø=ò˜÷¿Dþ ó®á7ÈßÂïßž=ø~ìù ?@ý0öLÂP?Æþø)î9üsÌ»À=c˜÷óÆÑ?þIì›B~ófà³Ø?ŸG~¾ˆüîYF~%¤ï_Eÿ|ý¨o·Búýÿпüê…èÿÒï)‚#_ÒÿO)æ—ÁËá˜WÒßë#öW¡¿:¤ß÷ õϘ_ƒz-æ×a=ú¿ ߀ý¨7¡ÞŒý-¨·¢¿ õvxGìy ïDý+îw£¿õ^xòýxß÷þžÈ"?ÿÒßã'úaþ0úGà¿á0oô­(""""""""""""""""""""""""""""ïÊ+üŸþx^íеVCQÑÈÃ-×Á݂ۿò]¸»-¨`jÊ™æ¬Ýž8„pœJ„â_>„÷áxÞ…÷àu8oÀ›ð¼ OÃ3ð,<Ïà ð"¼/Ã+ð*¼·Áípœ†;á œ…»àn¸ÎÁ½pÜÀƒð< À£ð<OÀ“ð|’üëSø >‡/àKø ¾†oà[ø¾‡àGø ~†_àWø ~‡?àO8àï\ÂI8‚‹àb¸.…Ëàr¸®„«àj¸NÁ1\ ×ÁõpÜ7ÁÍp ÜýŒ™™™™™™™™™™™™™™™™™™™™™™™™™™™™ýc_?˜umx^íÇÅR‚a@ÑÏ™ÿ|i[±» »,»»ã-vÎ]»¼gw¢Bª° äýD!Dþâ_øþŽàø#þ„?ã/ø+~‚Ÿâgø9~_âWø5~ƒßâwø=>/à‹ø¾Œ¯à«ø¾Žoà›xÏà[ø6¾ƒïâ{xßÇð~ˆáÇx^Œ—à¥x /ÃËñ ¼¯Â«ñ¼¯Ããx=Þ€7âMx3Þ‚·âmx;Þwâ]x7Þƒ÷â}x?>€âCø0>‚â <‰áãx ŸÀ'ñ)|ŸÁgñ¹|$I’$I’$I’$I’$I’$I’$I’ô¯~Þ]–—x^íÇENPÑOÒ}Ó+àZ(îPÜÝiq)^Üîà ¬È¬YÎl&/BøŠå„Ÿ>#!Dÿø~ƒßágø~…oá;ø~€á'ø>†Oà,| ŸÁçð| _Á×ð <ÏÂsð<¼/ÂKð2œ‚Óð ¼ ¯Áëð¼ oÁÛð¼ gà=x>€á\8· àB¸.†KàR¸ .‡+à8\ WÁ ¸®ká:¸n€á&¸n[á6¸î€;á$ÜwÃ=p/Ü÷Ãð <Ã#ð(<Ãð$<OG~gffffffffffffffffffffffffffffÿØ7ÅsÓx^™é®¤5 ›aß7Þÿ1™]šÒ‘ûŽÄ£$Ž·ØÎòu¿{<ïÞãó÷øä ÆŸfüÙs ñÕÿò9V2Ðäß>[mÀSýò_>H§¿>ý¤}9uT7²»Ö/žôÚ”¿þÿñœWFÝ@ÿ®µ€®¥¶ËóÏãƒo´oùâxã ðMZçvÝõ_}ÊVüøø°¶Í™-|Æ¥²ÀøÔÛµ[`Wë銥<µ%à§.œ“O}ø¡´_¥ŸõQZ}øûñ_˜ÿ>|Ý ú·9­ŸE÷NmvmÕµm×)¾{Òœ_ÝåUòšçÒ‹_ž­uBLWÏêßyÆ/!¼V®ñ1êxÕâ[í´ViOÿªcÑxÔ§ú»ýÚ[9ñÓãÃ:ߊù+¨³gÅΙÿ÷òµ®vŸ©ç‡ð4Fî³òÙ·¥îɾ^qùùI'·î¹ž#ÅÆª¶×wæØöá+O«<­¹Á×(ä×oÆ[7 øäáÔëÙ1y+móAëåÝTך¥·Fwž³¿¼øÐ˜Tï¯Ï±ww׿õÒÌõ,»l€ß2W™ÆK^û¾@k€¸šÃµ ¸{h©ïìµgï\À»–V•ç\dŒœgù®×ÒßwðÛ£çS}Øx¸´)_}þгoívl¿ºõÍzvÍÀøU¦ké½H.vÞX]¹¤¿{»óÀ:q/]kX™Åíâ—ÆY}ñ¼|æ»2­›¾]kîÚûèœãëP·±í°ýªŽæ™1ûI™ò_¶.ì7õÖ•(ýz«×yvn¡nÇ­‡Ú¤oÉßœWVï;ùÖ‡•¯n`nåÛ³`û}7밺ѥŸ½›·ÖÔåc¿¹^ù²¹iJÖí[oœž+;WûW½sÎ(W^ѹßý\ãµGV/h>¥—§ýŸß9¥›;Ûæ[›µ¥m­ëïúd~*Ï»¹Íoe}çÂÓ8î÷7iëKõsöà3rÞÂ-Ms¶¹ß±ñó¬Øyß êýëÙ‡ÿªËûÀØõÛÈu6¿o¡¾ÿŠÚ©ß{oï¼Ø8_v‹W9uÒÕë¾_;…1aîªW¨Ïøåú_y­ƒkìºâ±ý·jOè—ôžçµ#/4c¼ob[¾éSßÞ÷ô×Ðû¾kýÒV^ºöœ¿ò¬L74“¾§û}wA]Í­ü½ó6÷bc¼ó‚ßýëë§Wò¯ö}ÏÐ7€zºß­}§t}—ÎiËÿ1¤í9µ:Û·Ëïÿ1×Û¾`n¿—ê«ç`e®ïZu­þòl½‚ž{­SõÙï»g÷ûúr­Cô÷RÚ+w«kmˆž•]»:7û^[ÄâUŽAããÿ'K/¿ï­ÿƒ=‡l[ÿÀ="ºÓï«Î×Nulìíû»ûž¾¬Ç«§ë¸|¹âxõ—oõmt kÛߨ ÷7Úë}¡Î‹V½€½ºgêêÝ=Pÿ"x^•™çªmEÏ5çŒ("‚ïÿR¸ Š^ýÑÌLç4aíýáíííà >~wô/G†¼²ŒŸ†|22ð8‡·¸õ{àÑQ;OPÝÅ]|ÎÕ_¿Õ£]y¿záÁ•Nù'û;_Dž¹²æ¬ú•‘öøX[ú*½þ7x}Q¦:¡™FmÊ)ÛÑyk»¾0þžÏ_cåª×¼7GÕÏømæŒí³örŸ½h Ð+wѱ£Ns¤Lk¦­âèmý`ýdKÌw¼× «g×Úš?ykzãÚØ¾ úA¿êìXÝ­·ü€òµ¥lõv•G>Æúì™"/~_¹ÿúíßÞ‡/·6•·qþý¢Õí0²þ)üÄñMøk¯¹¬/â»ËgìÚW/ãoÿúLœÆ¸<À·}çzñÍgçÀ{6úbeWÆœšçöô´&W {.´Ø©¬y¶&êwä¼´ní“õ£q®ùJkíô×;ºr¹£º6vcaþ{ÖÍIõ_°zËßÚ6_Ëç|yóº4ã]]Ögy{Æ*×Ô— ·@]œoŽÕ[ÿª“˜ßÛgBëÁ|ébÔÎÓ™»çHßÛ# ­i{¼`ÜûfÐí‹•w¯wŽNÏôÝÿÖÕºë“:=ãYsþ*Ûz•_º÷ÃúÕ=zÝ+W^ È÷]QÛõe{HþÍw³6}s(¿¾˜ m©×{É<¶6æ@½?¿èðö]°þ¯‹Þø„Æg<ô móTùú*4žòÇNß4õç¿ègDw¿›Úo•o.êoYëµ¾~;èï•·÷`cº ´å³O¯~š#ãX2Å÷µoj¢]c¿jпճº€ö•>z]ùl-JÓÆ¯¯¹ûå)áÒe|=.í6¥ù^ß·Kó¡ëË_¡ÓgŒèPWýißv¾=|ÿõ»omyžêÙzÐ'GÚS/V¯ßóO|À“Î9Fk#½¹çŽp½ß{¶vòzg‹ë¹»¶/~Ÿ[çÎ/Ö¨¾•§>Á³ý¾ lu•¶rÜ#Œõá’]ýKo^r×¾€Ï7Ù¥oïêï9Âx½”ñ›Pœo%û°ûã²%®úÛÅ-¨ksйú=Àÿ6²Ìñ•}®Ïû^Z½öèÚ©Þ ÍËÊt½x ïÌ=Ã.ùK—=Á|ûRÞž»Õ¥,ù€Ç¾WßêWeÍeçSÏòסù”Öó `½sßw¢rèõýlÌÀ{gM{y÷XuKÇîõ»@׋ºßÚ×[—K~ýh/æÆ^=Ê.M~uà럯¹çh{|ý‚®ŽÒ}³–·~T~s²{BìeFó©_k»ºÖ¾ó•i9ï»~.;Oë=G/ž+¿¼øÌ¸½W¬Iul¼Ý¿Öñøkÿt_®Ï@ï¡+†ú舵¿'UN¿û ÄÅà.ïåÏÞ;ß>i®ôQÚ¥¡z¼£Ì™ùôþh.ë¿ñ]}²ào+æîÿúº|Íǯõæäš÷l|‚§{BâÈ‹±×vóá772ž# ½":Ê/®cÇ‘‡ï(ýÛ·µÓ.{Ó>å¬ROï+õ@ƒ§93ÎÆˆLßdðïï(3kû®¹S7ôþoáo&æÂ\^½'ŸvÖW/—ÙîUA\k¨ßý¾Ú8[“Ú‘¾þÁïwŒqʧ=æÖ«úñQ?«Sà?Dý÷²gßú¦OÅwÍÞ«üêÛÚ6õѹoœýucÙõê¿è‹{: àûÉkûx^™ÙÎTEFEÀ Â%ïÿ†þ+9+¬|©Óz±SU{žjèӯǫøù¿»Æo®QÜ·×XüÇ N¹•‘õëxüi\צ4ÖèÔÏŸ®yAÈë›~(§ÌñMü×üû‹þË üYækOYÆ7׸9‘Ž­Æ ø5¸ŽÒ×Þû‹`³úªczchüBuihΤ5NiÌÉ£|Îk³2•ëx’±.âZÓæ¡ðOä+³ºö‚q’—Ò æP?7ø¢¬ø­‘4eÕÙ˜Ô¥¬ý³y’î¨ÞÖk}G_èAp[SÖµQßíùÔ6u`T_m¸~›u÷ÄúU€íáÒú¦k`ss'SÁú6‡­[kÆ‚ú(žóкk£9nohký9Ùßzý~ÍÁ±ÍåINÛÂæ†úh_››‚þ»®Ý9rÎ\½ùT÷<<ò­NýðÌ’Oª§úNº„S^òYÙSÁ»ÏJs¿<³³~±î9*Ø£Úk\ö”çOý¨ÝÍ͇kDÆ»õÿBã<Áæ¨÷¸øÖzãe_èÿ)ww¶«›9¹Äö挹>y¬Ïø`Né{ão}8áêgæñnNz9ŸÔQŸ »æì"6b÷þ2Nc·w˜Ó¯æÛ¼io÷‘y—}yâÌ4tÖÏò‚¥o-ýYÀxä×ÜÕ¯ÊY+cò,Ø>v}zûVß\y¤Õæ¾ïtx ‹ÌÉîê[½€÷߉ ¿ÈýžÏü¤fÌÉ;yßóumÕæ½ãµ¹ö„Ö÷T?uí>º³¿o¥×Ïrcë\9FÇ(÷åšËÓ½Óx8õ¡ÿÝ µ+n÷Š<=7”i.Ì»=Ñ\ÊÇÞROc—ß¹6eå)®¹òœ)ïæ]š1š»Æò[æÄ³tààímmÕ÷Ê5Õµ´Â_¡ã³ºkØ}ÈÜ3fm2î¾hožgžã•¯ ùÔq·GN½´ï uœô×Oµ^oõúvܾ³¾ÛKðÙ¯{–ùÛq1·ßú{ ^{výŒ =ž)€¾tʧ^y‹ì!ýkÞ|S1·¥Ÿ|,”¾ß¥Ê£Ýí- ç˜wG}—Ÿñshú©~çÚí™|çOs\Àî߯¶û}DÝõgm­~W[Ûê0Âî““Œï´ú¥MbÁV¿4W›§úÊÜœ£Çߣж…­Ãh·ýÚÞ`^]ëWcôýflå[»ê–iæqeå­¿¥“rdÏjcù\ïw6i›¿žw»ÿW®4u˜“ÂÖ°z|'ï`ý~&×·¡²®7Ï@s+<}ÍØ;Y½ŒÞÙ®9ój«oam9Wwõ·g¶W:/lnúné~wÊGm÷û ßé¬k}P—9ë· úV›èoÞ÷7ÏIØZ•èݲ½gŒàíuãéÝPÛ­ðçãë9Ç;mßÎ'{û~Zí›Êûþž¾}åõî?Ù¯ÒšëÍщ¿zº–§4{Ø>«ÌÆü,­ÃžqåßwGéÞoÞóÖxmÔîêØ»S»+ÛüUŸsßýðl¿”¿5¨'ýÄgl}'žì/Þ|ªÃÎ×øíÇS_®niŒÜ«ÏôÝÛî»ê[~àký:oí-ßêöÛ)?õ±wZãU·öZsÆOרmk\{½/8ËVWõuoœ|¼‹µ'^ùÆ¡“-À;£8¡ùkmèŸî c®\õë«}S]õä8ßÿK+Ou-¾ëýº¹YYý:ù×Z û»îä[õìq}ë{è÷¿›˜x^…™Ùª$G ïxßÇ;ƒßüÿ¿è ¨€à ¾~©Rj—R•ÕýáíííÃ'øì|þà|\>dÊóJÇmÙoŸ•çâ».”®½¥ãÛw¡wŸ½Kÿú^ý°o®~ž=äØ×—êù>¸<Ådå¥mL§qÕÿê°n_>øUÇê®Ï<#'ñ7†KÐ|üùúÝZ_å™õ§×çW½‰~õcó/?úÕÇs}¿pxðoŽ}`chþéGù´-/{ð·xã­ìÆÞø¶ÚU_cV~eÊ¿tàÇ‘ïŠö°g¨óeyÚßÌôÀÏÚ~ U¦°4sZšçVúÖO™«.PN]ÿß~ÖoV þ5ÆË&çQysÝ>)Ýgòè~k _2íSi}^_Ú«×~ëÓ>ÿø¬õ¸j¥®êy•'zgí*Óy¶z€Î>kÅ~{Âú3#º']¹ÚÙ8ꟸ|K8‡Ðw¿q\¶XÍÑÆ²º^åp¾ö":™“Ê;3Éú.½g.ñ¯>+¿ùlÉ èKgÇÂÏž¾:[͇º¤öCó¦}öŒÍ¹uÕ}}šñʰJ—¯à»¼ñ^vvïŠIèŒ4®õsõ5fžywW§¼ÞÑ}ÞØê¿8y5Ê8ÓÔg•oqÖú ®Ú,oç úû®.Ÿú.ßës}¼ì—κ³X0öÖNÙÕ×øë_cÙ¼þ ^”ñ>Ïl¯þžΚ=Bï•o}C¯ºÛ§®î¯<´?ûv:‡ö¼ï¹fÎZ¯ËŽôú±þƒ÷ÞP7d=S«gã8KêÜsVŸŠW÷õΨç^Ý{÷jäqû`ñúé]·þ7îÆ®Ÿµß}ukoû_ü=P§²[{Wße8µÝýÊÛçúÚßÀzäé{hoþê›ï¶ÖU{È<4VeÔïÞÆß½=/@k£ÌÒÚ/ò¿>´ö?ÏÍ«÷'Ï®ôͳúkG8;úÒ»‘r—l}Òž::Ûä1ÏÎ]åÜ3Ÿ«ß¨Cß–WhýXí`kî=µ}·½¥L×΋W¼Ë_»îµ>+»Ïû{[yô›µ=¹¹]Yæ¶ò{VÖ7stÍ—þv¹5¨¼ëÞ‹ôã=9€~µ°Óš¾Â='Õ}õ©¸¿}9ó×y/yÏÞ«¼GÁ¿ßªË¿´æÜýž)í‚ëÇê\]¯žëTyõk ØïªKŸßOì5ÿ彿©6ÀûûOsäsqtYïhÂÚ¾ü•ÆR¦s¨<é´Þê…†¬ý¶_=[ø¡}ólÑ .û}qŒ®ê(°·±ÿ“¾<ú ˆKÕ[»m•ÕŽòË×XÈ£±#ÿ)ÝK—&¾1úvmVÆùêÕoñÓ³-½¾6Οӧ­ï]gQŸ6~ì®Ïö¬Mêk×¹úä«=Ú"Ÿ¨¼0Ö09ßʯŽWôöÿþäwýÓwá¿tv-h•%7Ь3yŒcó~{òÊS=µ±9ZÚ¥{y{†÷xs%½rÆ·v]góÀþ« åZ‡ éìïÆ_K'gÍy× ^åõËZ`Ζ9ÏÕ]+@œòK¿ö»±|¾Ú—Þs³<•m\מÖ¯Ðïå§u®˜Õ%mëhý¿ú¶úÀ1ÆÖÍB9r¢_»¡¿§Ë<¬Ÿ€ý©œy¨Ý•YyÇ=ó*[ðQ¼º—TW×ïð!Ï÷je×·âZÓ½×ìüúÏ=#¬£æ¬÷5}­Nïø¯çh¿5œßõíxë²sШ!¿OÎAkó•®ó¬0Þ÷tšÓ]ËŸòpfÊ‹~¬)æ ³ûÆ í¾Wïå«¶ë7w§úYÞKÞ>û\ÛÐÛªË8ÍËê·ÿçsÜ}TÞå¿æ…w`àݬòt]¡ë‹<=?k‡ø¥í}e±5qé|ch¯=¶ò´ÆgÎôÁý z'Ò—µ úAoãi½éû®>iÇš\p.wÞz^ß6?;Þ‘DyÍÉ%»þ—Ï3Ø8«wm”Î9tñìd× 2;W({Ùæ‘¾ß¬ò/˜³F´¡LkJ^ÚæÄùÊQK´W¬¢ùï™Ì£skkk«o5Ú¾ƒ÷ÍBÛ³‹úéï úÕ¾0¦¥ù¶‘ý­muì¹â}Eì;yQ;×ïÁµ<¯@w}s›óæim{ÖÔÆÕßÖºÛ< mËSyæ¹OéK/“W=׺ëåÊØzvÜúSÿƦŽå/^Å­Žú]¥££¿åyx¥³{E½ÆZ;¶½Kï^½l˜ÿú¡Œ-õmmv?6—ô¹ƒÉÙî:‡²ÕåwZÏ÷]›ú½>ï|kž–z&¿»®ÍC}«^ãûö/¨Gc{Ô¿¥igeÊsô=W ïD»?–ïÍ|h³wsZ_È™sÕ¹þ–¾´õôìmÍécsCß1mkà£{´uQí¬Ï«[úÆá÷§yZ™ ê¿êñz‡¶¿ºõ¿öÍÕò‚þÒ3§9µ妺]£Ýw ï+ïšÖ¼{U=½‹ó±õÑ<ù~Roý†Þvi»Žý&éy{{ûê>{§ÏßéÓ×|ã'/ÚÜkν7úN{Æ1^ÇýðpÆü‹wúR{ØÉhÞo4÷Ù0˜kz!ö!ö¾~à,NæaìËOpðƒ=lÿ=kÇ}¬9/8ìÕËüý§»†±8Œà³œçècßó¿^ç£ù9ˆ[y;"âuatœý?¾ý·.ªöuäü•®:Y½W†ùöocŒgözýÛkà[c[߯šûŽŒüaÏ–áPSõçòÁëî5G=Çwl²í»£Ä þÖ.ȽÅsßð/{Ÿ¾Ù˪¬÷æ7:¯š›mÈ@O:Áx:/¶×›»¾|f½ìÿùâ¯>÷Ëß¿ý›3ç¸ã¨õf\Û0½î=µ­rW×ÄÝqn½8æëÝëÚdŸ×KàmL/œ¾æ…z÷Fëû¶_³{ 6zl[c±ÝŒßf´mÕwÑÓùögŸó@ÎÙsýì/–íž}ÄwÄ<àRG­cb쬆È+Øð7G¶Í>Õæ‹ÊÚïŒîƒ]œ’ýì]_-Y±ÑùËk>ŒæßõÖX?‘χ×|›Ç½Á´~ƒÜµïšqŒÈßèõòU ¨ëQùÀô7Ñϯ5Øð®OlÄÆ¹Ç}¤ûâ#?õ ­£ÙDÏó>²WÔ€÷wët_ÙÜßs®;ëAŽóÚ²8n\¯µLk¯ß ž;Ö¶´w—;òtJOûÄuofy‰ÉFçlçŽ[1á3ž××ÀâÎqæßÖ³Ú_såZ©­Ü…gÃp>ZoÖíþäßsãoŽ·×;ÀÜ{ܱ¾¹ÐpŸj˜óÊÀ6ø–ÇwóW¾Ø®kbTÙ‹ϋʃ­à_o+|Ž‘e/^¯¯ß à‘|ï<Æö7þæŽåFþ0öU ðQ÷`¶þ·¹Ïöþ´z¿Û›[ãÕnË”¸÷Ý¿È|þ–49†Ý¯žòU¦wÁáûÆ{ðÿ¤µs½ÑýßrÈ}d©g®CðFŽïÕ/éu›;¿È^:ÁöûH¿³,'(^©øà‘Çš÷ß²Íúì£yÖ³˜÷oMàòûÝÆ2]ú?ú;Ðè©gâkïùm·OððŽÍw¿—Œ—-è^Íú½*Ÿçã©¿>»â´ýÙÕ~Î]±¬Ï‹ÑõܶÕoh²Ó;¬ÖÒè)ÆÅìý­^óºg96ôÞòCÎÉlåÞõÜïzcÚÖ¾]åiþÖ·ª÷ÒáµyýžX—e¹ëÔºïpó=<îyð=²-Äžsü~ß ô{½oáÉ’ ç—}ä°Œ<~5ô„¿ ‘1/~øžÙÿ‹ŒÝ³äF–ù¿ÿWØÇ[[+³ ÿÚ÷à·Žæ²äß`Æ»j’\^11ï%;ZÝ¡ƒœÏ.ßg¿{ØåßÔ¼±©)æ–·½ö‘:±};§Ïñ& Ëœ±ÞÈoJßÛº¿açd_c{4i½þf¥ß cmî~çÞh>ÿö5¦¶LŸ3G[9oܽ³8¶©÷˜¹qÚSg÷”Ê?ÝǵzðËv³÷ô–AþýR;/~ûöõo;ÁÝØ;fÞ즆‹}É·±Ãø®Üƒ>þ„Ï^¿+³sî£m€jç¥ùþ&¶¹ãv6 ‡¹É±19îO¶’#øxO‹Ç>X=¯Ï—MÓõ~[úx^™Ù’]5Ç`À6»yàÿÿgp3"£¢ÏÀC…tÔ­êE­åÎ|~{{ûðÂ÷ßðÝ«oû1rú+gNeŽŠ Ww9+—ƒo9jãÇÑŸ3]ûr¶•£cà×÷Ægßï_Þþå@ï§è\~™‹f¼úyåà÷Ñ-Ïê.žòY>|«ÌX×'A®7×»ú¼ª_;[3àç×}ò}q›ç²ÆL\Îqͱ£Ê]í®/Ú²Ïú£'öä¦ïÒ†õQ~ýÓoy­qðgúãòi×õI¦­+¶ê,GÛžúµù2Ÿ×b<íårÓw¯Ñ¿|·~k¯¶úý_ñ-vß>aã³%»:¯º…ñ_2¹”µ/Zã=¯ÙcÕµ6±·u§¬5m œòÓãU¶¬ëž=ìç«–j p¹÷Z»—kn*¿jÆ3¤¹rNÛúV{Õ)ê÷QÁ<ÖäšÓþÖî_ÍÑò3ö[Æ*ëwk@¸Ÿ÷\\Ž]ýxÊ7 ¾øþ™sÊU{ý6ß»Ÿ;¿-Übó¤Úì ~ônÜZYžäµ}Åc÷ìÅS ×ó÷Í»6ßkÑó]÷ÄU½õccÛ½xùÿ§\Ž]gÚrÚ'[Èü²|ËStïs¹×o¹—Ï}h­*/~;Þ:Û{pcs¬¼=«~|éÚ¨ã»VžW»¼»ony®;þŠ ðžPÖ·•Ÿøàh¬õ¿>ÐßsÔ¼mþ›Ïþ>íuåû?g9ðwGýYÀ»wŸãö÷¼,Wõ6îêÏæœ6wŽwžr9¼§:NëûÄ9êÕÏÚn¿h|Þ«ùìÚ+·o¬¯cž»Æ]Ç î]ý«½ µ¿2x.yù¼³7îæ´sÙ+k§ó¯õÔNçx†‰Ëÿ¢÷AëÏY{÷ŽîãêmŽ®¹›¯ú°ú…gŸvÔ¥Ý5–ÙÞKÝ~¯Í¯¯¹Ô"5ÐwL¹ æ‹æ”=Í5õa×¹ûÓ½¡?èv>aó©o»^ê­¯ŒS·;þÖ¦k]ƒêíã\ÝþÆì›–q×Þoe­9ô§v'\“êÁsÅÑ|SvýÔÙufl9®|—ßxô³²ÖÔż«;æ¼Þg«ÜWÍuí·¿sä¼t„¹Sg÷¸ð<ñ›sÂ|ßµ¿÷ {«ïžkOí\}[4W¿1‰ú®ÇÌ‘þ´Þ xñ»ï„êÕ—Ž{möj¹ÊSßÊYnï¦ý}²±m×l ¶ìuëòú[‡í•Ó…<ë£óùÞ=º@Ÿjo¹\³'?v®÷´ù7gí#òÍßPè.7pœ[®CÓnýwn[±5Qh£þ\z‹¿_mý½òhÝ€ë<[l^–¯1VϾ>¼÷&_Îõ yëfc³¿g`±k´:|[KåÜåþŽº|_.až;ֳйêìyÕx•­ýåwí;z—ö÷míëÏ“Ûßk¢óë‹<´] åû¿ÊÚè>ý-ö,±õwú{5±o)‡4&Û¾¯z¿òí8ð~¥ïù!ãúãÞÕúÙ÷—ò§VÎú°µ%¶µc[ý]7Ñ=ƒÜ¼ýªØ—x^…™Ù®7 ¯ã,ÎêìÈÿiR@R8à\?’Hêp“ØÝ3ÞÞÞ>üG_=ãÇgü+kyêHdþmt¤¯³×9£¸ÅcýÓ#wo±ÖÎ7á¹_lI d¿>#üïž±¸µ³Ø?F&^å?D¾qI`£v¯9ôéáuoI_Œýæ|ã€~yøÝ™»æQLy›ãõcôÌèGsÒü1§ž®[s1­7äyosM­üõÆAÕéHm«×ü6Žê´^­ùq/:ëï×úé—<÷Ô®Xê‘Ë›ó ^©ºœî¹ìjÇzµVæ ½Úßü±ÆŸÊ õ™Øå‘ÓÍOí5'ÍŸ>[×??k0”­ýb³9(ŸüYë.÷|ªßœ8JÝï^e~õ–ÜWù÷¯>4Vå‹Ë|sR;Õ‘Ïœ{ëº÷E,hýÿ-¼Ë>*ßÞ«/b÷9VÛâ¸n¿„Äcë¼xæó¨ÞÖQ{ëÓê:î93oîk¿w?==ìl-Õuoñ+_Ý’¹0NÈø®º©SÞçgs|¬«[_ÿ’½ùåOi1Åh>å­íâðt﹤¯ŒÍ7<î‡øŒí­Åpmýûî(_Ýæqik];öùëCÏ,8k‡þb¬×}.ç]ß•à5oêÊk^¬ÁÊ”C}Öo=‹£~ñôOû×l{ïœmÖVÇί3^ŒµóÏÛÿýؽOõÉš©§oíÆâ°<³Ä¼¶»ÏXú„Þu¶­ï'«×Ü6øÞwiŸ7èˆÛ÷UùÎÕßÖ‡kyVšŸÅ‘·ò+ÆbWŸyßsö.wn_¾|èºûVNz66[“õAþ¾­ÍîQF7>é:Œ{ûmÅn¸ö—´lû ´÷ú=þ…/õ;xõºî9/ŸÑ^lÙ‰ãl®öª>Šß:Ø+´Ý}ëŸ69sÆ}=7¯÷ëWä»`ûæµ×Xv¿ÔžyáTfL‹µWjoí*«u¬‡:Å»lnÝÌõÚs$_Ö¯>*ß½¯H=úÑöyÉÞÒü)[»ÎÑ>×\]÷¥ß”=SMùöäë>•ôÿÊË®Kô¥Ú®Ý÷{x¹÷³¾Ô¾1•¿yn~Àj-Jè^ߦ|£(ïùÎc¯†W_Ö×å+c¿G‰ã÷ØÖµ¾×gÚuß×ÄßÑû ·9üynÌŸ{ÄÑ/ù¾‡GûÞ=¨ß¢Õi ä·âï7©¾3÷¿|ïYÖNcZùRcú’~í©ûÊü+‡Æ³üæakqÙ½rí{FqÖÇ}î]ù„È>ï3ïv1{ßKÙûÊvùÞ¯â-¶¼ëYê}4¿ûŸƒ²bT¿xÍíú$õÛñU~œ_ÏŸÆ(Ïÿ «ã]ÜgÃê¸æ7´Å½l•Wÿ{÷yåü¢/éšÃýÿfsç»Åoû:µY}dýönÕ.£½Ü=‹Õ3Òýêþ=kílßPî9CÎoÖæ¤çÏ9ÄïgâáK¿áÕ©¼~úmUAj¿ªï¥ú¶|Λòêç…õž¾*ûsäÛ£šë³~1¿î¡Ôý¡6SúGjÜx^™×®dU ïsð@úÿ¿„%¥’{@‰ìècñ€7b\¬ÑgÜæÁ¬]X^ÿ4<—ŽñÌfìÃ~cý 5Ë~)^ûl¿,7j |ßJvXöÃrÌÛ·ú=úFü¬Û&ú³ÍóÆ1nù±ß›bÙž/ž~íiÝ_ðëCé»g}±·ïpwÓ÷üúkÁª¯¶çóƒãµ[¯5YœµŽ›ósùñë!kùbÑ7ÆÅë|¼ç+C-Øï×Êûõkxÿø´ÕïœY§u¬Æ6G- Ë|•حŘ??ò&jÕ¼W±Fõkvc}plwý†ý¶‹ñ%KŸ:¶ÿ¯d¼îü`ÃÆ×¹P>ûtQkË´äþµàVÆr­?ö§ë“3þ•þbÛÞÖ<ðÇuãz~¼»¼fþ^µX_Æ·ó—8L'z³Þë®Õú‰}ÈÚFˆs;9;Á»Î•Úî9û‹=ëÿööîŸè+÷21qNÊk¾õ§Û6ONãúõõó>q0fsîØ3·Öv›×º<Ïš÷“ç¬Û8WÞL?I†XÀo¼ËÓæº×÷fC¿í¨|ãüËӲ篼¶7lkq‡êA·ùba>ð7ï:y…ù~1cÎ:ââµÎ}õ´ö£60æîmÞÈCu47ËÚ½íÖ"_{-Ç|uÁ³Zq=Óx•-ÿ°F¾ˆr¶a¼—x‚qíåW´Z¸ò~ÉvŸš¦—ýS<ÇYÞeæ/câmž­oÿ0g]Ô¶…w&ctSÇ[ëY^[¼f½èF§qvWÀÇ÷¢e±·gëkç/}ߥøãó¼ò&æM`¸öšgÆÎöë­»Ê2F·ïx®¸×GZ÷+óŠê²®%ßyÆ®¿Ø¾–ûÈ<ÆöøÂóß”ì÷êºöÑEØÕù½ 迯ý[‚óBÞ*ç3f¶ë¾ì¹î{äö¦CÏd±¾öáwŒXçwÏÓõ÷ž$‡|w^öƒqunìx4^¶¡sãûãiK¿±Ýš¿Ã{FÀ»½·ñä‰ÕeGmZì¨I¯#?}|^ëgÛp{ó^þÂo,ô!W]³©¿¡¸>zÏ­Ý:óİwRutŽBæjK{ƒâëûÞ“— #dýÛÒ«Ú5–e™#GŽ?cÛä¸{ä{Û11ÙŸµýÞ°m¯j¯x³ë’m.Z³ÛÏ6×B}m.ªËuz‡•«üÛšÏW¾9?×~„Š×š¸xÜá¿ýü·|nü-c]¯tzíÕþ¯üçæÿÑß1ĵµ2âíèZŽyÁµØö§øFøê“sÇ¿ñ¡Ï7•±.ýÄǹÝÜÞðÁÿZ¾oF>Ã̳5ÛÇYaŸÞG=ï!dY¿ì¯Í|/³ç­ÿ•-v÷yð×߳Ϳù÷­E½ø6ßeÌÃ>2¦õ7É0¬Ç6ùÍX=çœaúY—ßÀh]@¶½:Íë·QkÊ8ký½h¾Õ(u‚=—þb÷=‚Ü+ŒÊ/¼ý®·ÇEõ}Î~È{ÃoËK–˜AÎ?qñfDyãú^ìÿH¶Ï6p/Ì×32–­ý½‡ý›ß–1¾ó›^íù;‚X:#æª {]—-¿?-:ÊŽ÷'çkðObl]—aõ‹x^…™Û®7EÏ!ÁSþÿ+9Kê%-m¹‡‡’ír]·Ë—žy~zzz~¡¿®öÕ ½½ú¯´ÈÑ—þy¡?¯¾s´o®öƒŽcí–>\í»ƒ^uhñ¡û•m>Ú« c‰8µuòYÙ—÷yx•5ÞÕ…ÀOÙm¡¿¯Öø”ßX~7f­ìKeè[°¡Ýõï1w·ÖƬ\ÛS ´ÆÊØu<Ù=ùtþ}ÆõGÍ‹!9¬®6[SêÃoŸößð!ìóÚÀ§~¹xò•Uïã% ‘¿üæQ‡5 ýwÉšGã…°)¿g@e–w·f⼺Ë+Öå›gùž'ŸædÜ;·9çþ¬LõV—¼Äpc‘ŒSÝÅ ~œ·>V¾±Ôõ…,ë †{N;}ç83*Ó³§òµVמcy{ìyVk·úÄܽ²öOºúÚùSµ׿´¾âèÞª¼çbI;b¨Íb*ïSôôAתºàÒõçQÞsrq¢~h=ר¿Æ§¼cí§gwyê [ìÖ÷#BvkdI{wX׿õÕÜ žom™óLòÚ:í›ðN¦¼Êq–â^³/ö7ž!Ú“z>Kç÷Ì?µË“Êï[¬rú•çÙqº{ª÷¼¶Å˜þîIez&ô?bhϨ%Ïfäz_4ž¶»¿Këð_ ¬x^…™G®1¿sÎiçûÓn@ iÑ çåÀ!©Ñ³§§§çÿñLãûÛøò†ÍÁd äÌ7íõmþB°Ü­sË1ŽÿYr¯"¿çáÍ?ÙæŒo7Þä¿Jþ£ù=Újíw’Ûó߃þèô¡5üx£¯ÆDß8ÚæËìâ×½Y½ˆÍ1Ì.²õcù‚Mó³ù•­MžÉ ü¸ÎϺ“¿êÅÖxåÞ½¶]_üU§vêý6tëÔVe'ë—ÞU–øL_-Èçô¾R[xØXÌøiý©o}ñþ8lÚ篧³mçjšé¬½áèäϹò.[ßqmܺh>Ãêà½ÄõÄΗÛÈ;wZcùŸdŠÊ|:È ôΰšs‚Gƒ×ƒsià ¬÷®Oë79Çç÷Ãör¥Þ¶KŒØf4¯1yÛàü+lc{ïj÷è.¯±bŒÞ3mà\ãyky#ûòâ¨ÍÚ°_Ç=»ÖåÙ´ùc]CÇ9}—g𩦠W5ñ» Ï{ºãtL›{?;Õ‚5j]Ûl<5Ã^u·&œOmпÆã=¤vwî6žÖí*Wàþ1Ö/sÞËÖ|x§ü6÷ºÝÝ8·>m¿O˜î›;ö˳—»>ø²MÃúh;¬¥é±Qóì{õ5¾ó„U_ïñ]›Äo㩆ømGß^Oün9žÆV­ï•´ÅZ¿£ï™O6±{:'ì§þG«k£wšúò3ñv!7:}ðšwŒèÛ¶×[e~ƒçä‰nõÇGß~,sÒÛ3µ"7ÖKeO6Ñ»'ï¾×Nk>ðžGìU‡ØGcºÇƒæç­ehWö-?ø¼n?‡­ ÖS×´mW¯k ÙÑÙK9ÅG,ô]øî‘ÏPzqŠÏ1a»÷}ÞüÙ'óÆ }ïò½{¿“ýN6®^ŸÐ¯°Ü‘aoÅ®åšKa?¾³Tnx´Çã5ûØ=ŽÚŸëÀsÏ›úô=ÿ^ÍFo},Ë|wæömûŽ{óî¶É{9[ü~sœ­#ùœ¾…ŒFý'W]ìRûÍùv‚¬ímäN7yÛc̓õ¿ÑûšýØîh=ó|Çh=Çó™æ>¶F}—ÎÈodlÂ+Æó˜ê±çõˆ~»'cð¾PtÏ,ÿTbâ÷€åN1tóIä{’Çüß^Wqî'ö6÷÷è~7 hÎ{p}O±Ãë·Ç1˜WÛí!²ì 6¼Ï ‡œé=_®ú>½Þ£·çÚ–ç{ m\¡¹¸^ðögç¿q nÞSëÇß©¯z°ç5S™b2þVà¼6çΊœßkû¨/×°}¾Òi_«Ã^bÚÏȹ–¿osïµ?¸^]k'ì«û7tÍbotöõ¿¶‡Ö–³Œo­Ôâž~kç˜Çšz6×§¶[WW°/¾™Yît6T¯ó®ÕS,öŸÊØ®cfîZ ô»½AÀëýÌw é8wçว—ŒÿèÎÚ~z/1z¶o<Å,Ë]œ¼îéú\´¬,ëÒý¨ÛF÷Ö5@›Ô÷v²;ïèó±/â„ßÑ2¦û7)úŽÝÝoà]õÆv `osÎÃyÖžãrgýñÿo÷>ÍÓñÀçÎܸOýÜœj0ð¶w‘¢±ñÜY×£³ÿnÎïâÖ×v}î@Ÿ|.þÀ³x^™ÉŽA ö}½pàÿÿž˜¡PV‹ƒåLïv:]UÝ·ÛíÉxúˆŸi=x¥ýðø–‡6é×ÿÏÛ¿|z•oœðO>Ù¯®íëö±œ®øƒÖ”u{¯{Ë¿9È9÷õ˜÷ôKs?Á‡ÛßóYn®…ukcþ†§cúIþ^¬Ý³Ð¿…oÝÁ—È7Æ{Àý4`‹^åÞ«ýô‰Ék÷9ûÆî2LŽº¢Ëú”çúlëadÛÈö^aÀVe¡q>ðzîîùçNëè<êk~FƒNí\{רµ…6ÝÑ{Ñëy8žò®`²žÉø¾gão@MkêïZræØ¤vîEôv÷XSë²ï|c ìXKÏ€5ñy^Û–Áq'Ørž Öœ¿Á¹4çµ"n÷ã•ÞU ~vý±ï:~•|mM–y][­Wó­?|èxfýx”w=<;ñáç¨g˜ëfh¬Ø‚î˜{¦;tkcr«6<§,KÎä[{äÐy~’i.Ÿµ¾êb¿³¾uûž=11'š–54Ÿ©{²ÈÓ ð:—K{šžòÌ"–ÞžîCd[—ÑÜo¼Ãl}’ž¼û©2}†~”¼é¶ãºz|ùÓ£æWïèÀ£îµëü –·ÞÎeô«~¥'j¼{g¿î¯“û^cÛ»Eó¶o¯ÍŸžã=ÝåÁîñÒ»£»G‘m=© {¾‰ŽÅú­ ó »⟠ëõKs¡n=æòUÝü ¿µëo9bõ¾ö|F¾»è:ÆáÖ¢6 ØÙú×ãž;ÔØ&CoÍÏîpcq­ìƒwYÏ1Ûµh=k¾MðWÐád*?ðŒ?=‡»¦WÊsŸ×ï€Ü3 4Ÿ5­ÍÆã¸Ð;atZÿöËéù^>¾Õ*c¾õê»ö¼nÏülÜœqž¡÷¡þ <÷™ý[×7tÖ®­kåD®|÷ ôí÷ûÙøôkðdÁ}_j йÊØ»Ð|ͳÛö±qòì²ÏÏäBã²íÚ3¯ßË€ßmÛ>·gþ_Ýåáåͳ²5¶-úÐù8VÀïA~Çpœ›ÄÕf{txõYìß\7÷ÏÉG×õ³»H,ÄÛš×¾ûÇw Ü;á8\³Ñ— u(õbb1oÁÈ:¯+ú0ç<ýS?×úè “2Η³Ù÷*wαþ/œf8`«™ã…¿8ô ´úaö“Ÿ}Öoý—²‚ÓL¸ê/øµq¢_åˆÍöÂâhÿž|ï>{Ž˜o]Óƒ}ÑÈ S—ÞA€Yb±aøm—µ}¢ƒæÀ½ØïØç;ŸŽ³{lyÏÝë¹ü~ëï@p¿1Ñçw0æ ³¥µ˜.gÁóÒq^õ7µAÆõ«¬å­‰ãBÛ¥Æìyw¢Nätò‚>/¦Ç|b ½° øœ×xžwÍѶN±ôb¶ßaÎÓçŸßÅØŸj\àÿ‹Ðéì¢&Ãû“íŸãêsÎ2§¸vÇÑÙ¼¶~¯‡ïõ¢¡ù!¿¸ª×F–œøv¦W-çØŒmºu-Çœô¹Ô€ ~AÞ¿C[·ñ¿sFbx^˜Ù dE[÷]Qýÿït:˜àÝúTÝÊýd­÷Ããñøú#}ñ‘><ÛÏžôy¾éçõ=eW÷"t¾:Æ´ GÇVžöçô¿þ¥Û1ûW¼ß½ÑÃOó§%Öµ±üõ#ï·g™bYºìcoãø!òåµ~´Å_¬6>0pLùµ³´ñ´&ÕGè(·ó°rÄ$.â‡|cTç׌Ëŵºô‰å›g¿xCbýªfÐOOm5NøŒõ[œ¿ž¶êç¯ç7|âÓN}«_LôiŸ¹GÛÜl‹qÏÚÒOeVÎõDÌÚ«ýÊ^T™æR~ÇÁÂ<›We¬cb¹ñïü]ŸµOê&ÞÕ'å©Yë%.âh\Ê3ŒóÕ¾¸¸(Ãx× íÎ]m*g¼­Síþ“¾q¿ÅÙ5ýãã“eŠam-bm.Æo¬Ê³®31ïÆ­ûÔª¾ì‹ù9¶ó¥ñwé|®¼Ü·ÃÚ4IÅC2÷êRÚ§êýÍϘŠkíCì1Ê•'þ•­ýr}‰§öŠE1mÎÎõõ 9gÞÅP[¯¨5þ¿:¥­qIiç@í¬¼ûJñ¿p*ÕþÚÏÝ×^Q}v¬kò"×Ö®ÝÝÛ÷>³k©sŘ+¯]Ç®¹×³²óyãÿ>ãsB>}}þn=ó•Å7>š»9é§9‹ë®Rlw¾k³ü™=jmv !/áßýX^ÏÌÎI¨±ýòø„»wžæ\Æ¿qU¦1xÈ×¶ñ(ûwäÄG¿©wSú­÷ÆÔ{‡±tÍ7¦%äÄÙsºõ©ÝË·ÔõpùóŒØµŽ/ýÿùøTÃú¥fúÝsVûöÕsŽÖ_ãò.©žûÐګήùÎ3ÇJ¼+‘Ùµ[Ž3Ë«MÖFß’ïjrÅ Kåà7ybP,èWv×ÿb_•{5Þ»‘spóƒ®û¾{ØÖ¡ßÞùvMm=× Þÿßôû.s/iÌ |ü˜‡äÿ‡ægÛ³KÚì>{Qó+í k¯¹Öo[ÏD1òMr寽ݟ‘©ïŽ/i[¬ÿOÛâê8¸éÓu¶>à+Ó÷c«CK½º*« ¾Ý³:W+³ñöì_˜+öwÏ€ÀE=±pÎû>ÔouÌ÷U½õ-6ƨþæåzWÇ7üy6ÀkŒÕ1Ÿ‹×o¨wtó_9m­kuöÐW¿»Æ”]Õµ^«']o?õ*'N΃îm­[©5D¯÷«îkõyÝ;®=ð÷§ßºo>ö;¾þ–üÇÿÊ·ºÖǹÀ÷…‘{xöŸMq¡ï;¢ºü7©¿}ÇÈÃ'k‰Ö·_åô£rÞeüÞ\¡î³Êëo©±·ÖÐ…7ã¾e¼¯Ö¿}ÇÅnׯïd–™ƒ1°ÿ7î•ï¿§ækÛÿ º›åx^•™Ù®7E$)³Äÿ',ÑKYÙr_.%Ûåv vwŸóâñx¼üB/.úå ý5Ô}ç?^ceὺƵ!ý~ØAæ§K~å$d ý2¢ã\9æëÆýê«ó”ߥ_ÿéöîlþ|à™è”3ã”Üo Þ\£ëƺöê—‘Z5g‹}s¶9^þ»Ç>ëudÀjÌòŒA>˜jÛyí²n=Ü¿‹÷ìŸdêk©ù|.} |sU2ÿw±ŸpÀû-óöLë‰ s Yõì?æúq­Ü_¯} ŸQl‹k×òð_§üÀ·¶Ê¯Le•¯ÏÓy_LįíÞAÍ:æ³¹#v䊯öÿ¼öá½½äðçݨlë½µ2_ÆØ½£ÇØZ.žÚYœ%ï'ö¹;™‹éd¿òâ¯mδñ>§[çáWV_ÌÁE}Ô}Í3Ä~í³gýÛ÷õQ,­ÍReÁÜ>©Œ½b.7^ˆXÄ\ã§ÇW<ÔHß§ÞaKçêÔ¿¼ÓÈÝÉÜ–öy¶9Ó~mg¶²Ê-Ns ìöYk»rkgå!ÏÒö€2òkÇܯmFä[Úl}‡Ä]nOöükgÎ=Åžç¢1¹oÞÝ_›%yÖP?õuÒ[•9ű{æ„9÷Kq¶^ŒöÉö©8[ol¹·uQ¦5Ý=I½­³²+ß»ÂýƺþzCÍ?zb4Ž>×è‰Æ¼X\û,E>ïsRrm/ú¼¸£ž—Åà\[‹ÜÍMëÀ³Õ¹˜š£}®Ý¥½N²ð·ð׸ ž?ße”9Å/»ÖõÞƒÕãý‚Ø«/žµís§v7Žê0÷ý®üÕiÿjwGuµõ;ÁþÚ¼ÈSîïkÞûÉ3^ûÿ\û¬É=··Nù*5®;õ6Þ•‘O>}§OÜÍgcglÝÄS_ð½g´¡}È{®Ö×ΡڬßÚ›öå­-ˆZ›‹Æ»½$)‹ýúði,ž=õÈñžyÎ"<ðyê£r«§oÆö«r¬µ[›òj_]yæÓ}žùæÇ½S¾šõéweÖïÆØwêžïÅWÒg}<µâï\î1Öâ6®¾ÓCÞu'Õ¡^æžö%ß Nç¯v¤~_ºWíˆÝ}ŸEµ}×÷=~wf«O<‹i}ØKÞ3ö)û›Ëæ~{È}iñœä˜‹ßx˜×¶Xöãèžçû9¾ï¨çzñ™ŸÅ´s×­‰úÚõ;µqo=­ü~ÇÕ~ã¥Ö­gëýT^v¯ïiÚØ;”qŸ7+²¿6̇½Ê|±W·¾êO²Ž•]=Ö§wbçw¾÷9×úÀw_,ÎkÇoøû}¸õ*–Ê0Ö¯=ØßZŠò·ÓÅ©îú‘¼c7ïb[+³}`ÎÖÆRÏ{ëâ>1ìwŽ2•-Æê;·×›ûÎWþDÈ6§Œýÿ²/[·õq¢•1‡»ß)ÎùMŒôH¿u·†s}Kí¥ºÅ&®Ú;ÝÝ_^÷îbgîsnßôUí¿õSâý€±ßnÝ_ýb»#mù{„ÝíŸÚ>ñNk¿WFÂGcØgjm4gê7oæÚüÖf1!ãûäúU¯ý±5d¸O½ÎûŸr}^-É?Ý×Ý×ÿ’rÞûM°vj‹±}²Ö‡z<7÷]Gžòû;Vsù[ˆy*öÆË¼g©vjÏß0ŠkcÒWõJòƒµ½yÒ±k×óÄÜüz×ú»ö|5çÚ¬/çê´Ç2½/êGbý1{ƺ=­ìò–¬$–﹋”µÆ›è3­Kx^™WŽ$7{å½7÷¿©ô€ l(5«Éôަº?¼^¯ÿÂg?kýåÛø…èËÐ>­v¾ Ÿùg^ã«ÀOh¥›X¬ÿm|£9öúÈܾ}¥ymol.zý×_ç ßXÿpÌŽ™¹}j.ç¸_ßæƒù~å_X«ym ðÍö 5~¯¿Ö¼:m“þØè¸Í_pOQ[ÛqÙ¶sõýÛˆìâ¬]×ÿÒSþር±4•s¿ñÇ×ÇÚTc}ùPòg}Î#ëúï51מ°ÏÐ6.·£Ñ§ø`?Ü{êñx†'w͹Á¸íSûç2\±{~ÉÜçÄk—¿Í!±B+/¹!>žöÁÎkÖÓOî±ëZØgl[×àª?sÇb}¿8€ýEý—;zƺÚkWÑ ¾÷Kã¬|a|Í«c¶îú,vì<ÓÖ·ý楧èÊ_8Î=t7ÿäIJž¯Ö•)8'µe]ÔwgQõuýh®‹˜ÜC¾Ÿ ³¦ÿ u26ëª[ÿùúX³ö} ß7_¯”n;›óîØš½m¿ìsq¾wìÓuçØ¶qíçÚ@fãüÃÎo<£õþ[üîû}2p. ¾­²Ô3ƒ3Œµu#Ï›Û>oÌ_›½Ÿ¶^ì肎ÞÖîwñðÖ¶¾ËÇ»ñÚ÷ðð\çÖõ®ÝöImÔöFïÃÒŒ7;Èç?ÉÚoÀúÀyõ¼¼ïÁõþ}êÙá®óhí*ëóbë3Á½e=|#¿œØGØulÂãýpg~Ùþ3^çÈÕûÈÀ_½eûà–_bòcÙ>9/òfÚT÷æÔÈïÅê±-Ç>yÒ»µsá•¿¸÷dlÃïoÛ÷zÂ2Þw¥M‡ß:®¸§üo½û^ò7ؼgsóõtNÐ3Þ{ð]ñ"_=õzëé{ýÒï<#ç=„ è¿½É ;úbö[¬úÿ®dzÇßÓ¿ìÿøfÛüWløîïŒË¾½ÐëÅ{éµ~Þ€Ô>÷¥u8÷WL>gló© ¶UÝè3Þ÷¤í1šw¹.Ÿy/ð÷øÆæÞóöµ\¾Çß9y_írožöñ¥—|Lßbk­ð‰¾vOù»vãd陯b­µœÿŽ§ç øê´çàSPûÀrðž½Áµ¯,sÉÙ·ò±~ÊÙpؼün>9ŸÞ±Ž­¾”ß4ûi]Õ³>hŽÌ‹¼×öŸ¤Ÿàõh¿˜ªï»gìûìøá+ï”ñúíÔ?Ö×Û”ù•ïÆè\]1º—žh†Ñ÷ïWU¶s¿Œo[»̇=p˵{éÒ·ó€šÙ‡Ë—ÆÒ½UŸ ÞC¼;[Ûv>ͳ‘7 ñBwìÖ7|Ïñ'ÝÙ–·-Û©>¿ù¡Ywc¾ÆÁÕÓ@Ï`¿5È+4âéÛºªà LÏÁk\ïLôø7ÿæmÞÉrŸ÷Þä4n€<÷;øýV„Oƒ~¢ß7oÿNÆ6ùÞÀ¦ÏAëß»~#¹íÿwãwÿã¿z‰µ{i¶Ù§ÞÿÖaÙŽµm›À_âóÛÛgHcmküpN}ŸÔfý3LGkÓý`9|Ø|£ë´ï&ðãã­]ßZpµµšüÓ¶îx^…™ÙT7‡„„ Jþÿ;C‰[¢tä;<´l÷æÓíö2w^<C/¿ÒO_é—kLŸöç‹Vÿ÷K§6%eúi áSô~lWx'ZV_̵[kÛ1k$oëbkàÔ–¨ëäžê/¯TL­+î„â0Æ]cö+9D¾gÝ®CÇ_Ý;ŒÜƒÕu7?=óäõž)g×vç¯ÿîI‰ñ—Ç÷;ÕÔû¶ûHŸðöÌì\ô©s1¿gˆzí;ÖÏîm÷âb…¬WýÕoõNüS«ÃÙ«ž1Ô¾ºw~{öʳFó’º'Ÿže¶ÅpÂyÏÃo.½Wlcù­bZŸ¬ïê¤wB ›¿äšu.©o§â-‰Óz•<ß×'Äš›‹Ú‰·ùíÞ¾Õ)õ\Uw鮯;wûÞ§êUç„ai÷ÙÍ —¹«Lû¿®¾û¶~9Nõ¶¾7†Î×u(õ~¬9“w××ý®ýéý_cä|wã^¼Ö~[¿â‘ÌŸ¹ê|µÓ·w›¿°ë=·káüúeÝ”mþåu16WðÜÞõãž\ßÜ͹¸V·cs+¯ýæ©ö‹}öß<É«¬˜Ô)Áw 6ö¶øëì<«'œoÞ7¶‹ËùÊkœäÖ­soçD.¶S èûŸŒ‘÷½ÿ„{ヰs1´U.­Sî9§ô&ÕO}Ñ/vç¶å­Ÿ{]ïªý„çΧw%ý­AñxƬÆ®åž%ʵùÅÑzª¬¸–Šw¿ÖÆþžÿð»ЮosX[¨˜ksŠÛîSL~/h ÎÛXi7ïlƧó¬ó˜+ì{'/æž!~Gú^3»¿õ_ðvŽ“¾x‘Q?Ú™‡=/k³ýåu,fɳ™~ßûë«<ô{º;^;.®Õ—ò­÷;›¾SÍõ~ Ù5xF›·’gƒãÖpeýö·gªï{ÆÌµ>ïrµãê™7I¾¾÷·À)âl}«§OdÝóòÝ/÷ÉŽ=ƒðÕoâ']sEŸü9Þ8:ö»tÏvmlíožõåo|uÛÿ‘mû;gu=×Äzò±gÃê©+–b¢6Nû·µ[ZÞæï”÷;_K›+ß/]ou¬3±ö7²z›Ïú÷Û8rë«Ø{H½Ð3Ï}¯âu(v}¢¿kSÿúx&‡œCŸæÇ¾±¸6ðúVÊ‘çuQÙæCÛS]5?Õ)ß–ëÚ=¾:ún¾º~ËÖx6æÚ÷ÿªÅð,•¯oÞ8ê#kMÀoßù0Oÿf¼sËó7 ýÿ"/ý÷n½Û¯Å ¹½³ øê¸ê¯Øù‡sR×î™î¿Æ¥\{ÿZû’¸Ø»Êhûmcm.;í×Îÿ‘ƒãƶ*x^…™Én1 íìû‚$· ÿÿ™qSH¡ ‰„$Šj6)J??><<¼x’ÇK^=ÉËK¦­ùé6fn²>ëþ\ºõÁaÝÚ7šÇÇ«~ó›³íüÑ·_sFÞ]­çlûõáŸ_°j?ÿÕÏvØ^çõ“ÒC±áB>øøý(ý[­_êÓã÷W‹Ùcƒ}ÛO—Ýúøö¾ƒsòê#æT[û"_`ÃË:dùA¿õ`xÍIðÿùj]Ÿ•»ýC\§ŽíľՃC.|6lGßþ¾Ißù‰kÕg®¬!wæØXÀö9\]6wØS³•óÑ:†x³3·;?Æ‚#Üê›Þäl÷cî78N¦ßZ¸Â ù~éæ»<'Üq“ù*?ü8''×LØúlk^õ»Ö{ŽŽÜ4ÿ^7áŒ{'Ü?`nŽ=býrz:¿Ë'k¨5ûôž—ßéÞZÎñÍþ®ïweqlŒ8~ÄgÏl¹–óÄ5jlæ›ûqþrÙ`o;ô`›¹ímËœš¿Ýä‰wüÐ7GÏ1vL‹yxpªc¹Ã[ÎKûóêSðî9íZó«0G>ÈçĹÆ-zîlœ§ñäßxwžù4îúê˜ÝôØ»_ᎆ¹[†Gì¶Áû‹óö»:¦Ï9c}×:.l¹7 oÚì9çå…mψ} »SØ?rQðÀ>Ýe^g}ïv„Ú®Mm=vìèO<ö]AŸzwLàôý÷Ù]¿gÙ8|›”Ø]gáœ8_>ù~0ëzFX×–9ºåûqöþþ°0׺sŒ×èÚ;¼;1c;'훇¹ ¼ƒÄÐyðÝæ¾q¼Æ6|û­ï3`>›õÔK}ÚÖ÷®ãÜxítþÎ0ξ5¬¿Þ1抮6›ëÝ /öÕ8`¡+7ÄoCó`ÄÝõÖqÇ›ÃÝË ‹ñY/ÖI×}¶ù2¯tÅaÝÎ÷[×B¿=àO}—7ŸÙw÷½o¸5þŠï\¯Eç8éûÞ/?ô«kÇ:ñ}pú;͘æ8ñ»Óûßr‡Ï1†GùøÌ¶¾ÑÕ¿ÅwÑÉ<ót¾ÑÙ¦Ò¸,þÎç»Çç¥ö'¬r27ð‡Ùu¶«¾àVŒIóæBçßylS<æ{OVϘ¸ÛÇÆqtß&«YcznÂúSŽáηŸ9Wîâœø½«~ûf⫹÷™å÷ˆâ±Þsþ–sŒÌ _þ­Àù™½ù°~{16~ï(û<å’9óºû^Óù4WpŠ9Nõ}‡ïïH0À^ëÓv¿¬ÛÙºYk¿w{c|bvÜ«ñÍóÑ߸þ'=·Ž©5É<}Ï›un§?ågâ\ßíÇt>ËõIn‡¶äÿ݆_êÖB¬'ë¯Øã³÷öåo,Ûä”#Æw9rß\N{Âïe=+õu¶Mûv\´õÏx-6ü3?>;Æ+¦ãߨu€0þ-Ý©îŸw®çÊ­¹µ6Œ±ïBb…Ssuçâ3€Î뉽-\Z¿´ÏUÆÆó|…œ€õ?Lp“ÇPÿŽƒØV—Ó37ÿ®7b%ïÎÎQyööƒÝô~kýž—ßÉ7Ï›ÖsyöÛζ§3~÷†0®þdC¿~ïjž=Yœ+ï±xû6v½CŒ…­¹•焜S'>;qm÷¸-6Ô+¼lç=Ý>û.rhù;uýËÆi9q^û-û®x^™ÉÎEÇ`6³ >XH\xÿW„:äàSÕ/©®Ê}«¬žžw¯×ëÝ_d½¸÷Ùõ/|ùìYKc ü^àó”;Ù*þÛ×g½â‘Uø)üØe­LýE^ù á“´µOqß=xän~ýЀo\ùûÜusézóÄ^zc«>àç¬Cžê¿ù°ùh ¨ÉÒ­I}8­íM=õiq€}Uãr}Ó Üê'ßÊ Ôvã¶Ÿd6¯ÖËüQ—Õ]Kû!ôövmUÖþ+øþÁW~y ­÷æµ²ê:é=Ùà UöCŸoõcy{óÏó÷ç ´÷qóß>¨®b÷Ö7âW®|'>ó%ó½úœOúäY«Ú± õñœøþ|èÚ\¿OûÚXOê¤Ý¥­¡ýU>÷ÍŸki=#樺kóÖ®é{óàsuÖõ•Þ>:åžû‰|·Ÿ—çä›°çcùNkžõ•8åÙÜŸl.­{€+qŸ²;÷9[ê°fž§òYgóT>½>Û@Ö»bóᓚ@:«síÕ çMÜÆ}Ê›9Ä+W{=Kédÿ;§*ÛwÑú¡ÍÍ)ଷ÷Í)žÎðúÖýÒN`Ý<ï+§ß¯¡·.úK,Öz{´¼›ëƵ¸Í—8×ú^ÜoY#Û¾¾ÙBž9âÙ!¿êäÙ3e^¼OÚßÕg?ÈïÜSÏß1ô½sßWhMôckОÇÞi6H·xaïÏå5î›|yô­ç hÜ«»ùw½¿ZãöAõé·ýÒóV õMÝêòœwš¿ÔŸçé7¬scmSsx«­{íÔŸÿ  ÇYQ°wúBgcõ»çyªÁÒo:ûëy⋼ëÇÿÅ5O'?šsl²÷Î×ú Ãã|©^ãP‡k÷=×êäî_ôt&¹VÿæO_›{¡ïT'«ge‹¿Ñý¶Ð_ã5Îúº¼ö%àÜ/OcÜÙÓo%…å+T§ïºu©¬ëưzúìÁÆ¿öNï3ë‹sît~Öfý]Þέۜ¹Áé<[Ë•Ú þî3ÞêôÞ>ÝÑ«³wýè¾ï='zÏÚ©o´ÑyÉSO2òRG×›³õ¹°´õ¡ºj¿ß_›¿òpfnýY°–'š°~öü"W»µµ9cßÞj»sçV÷Îß+¥›Ïš½ªмۼ;ÄÛ³ì™臧ßòåÑ_e»^¨_òð› ݽߪ‡à*¿>7v€³~cä¹ß‘û½ÌgÏ׿ù´. ¯gEÞòkK¾ú*›r]·^õe¿ò^^>{´¾¬O¥±¦^ÛÛ[¯¾ÃÞþ[)@·?W_mõ¼7ŽœèÕ±~-?´ÎÄåq­Ž½÷úèt.j¿ßæÙÛs[wöÍ x¿A«ïÆ_ž·òç<öŽªìö×I_ï÷}ÿ­Ÿkã„|Gí·†Õ¹ÏêÓÿêÜž(¯tg%´öweðÉ[o÷ÖâÛÆ½ç è½p¢KkÝO}’O½ÕYŸû¾}²uó¥ïŠðôn¯ì;cõIžöYg—§Ð¸öü–§gl¿ùÕ8k޾õO^õù¾¯pòáýö«­®ÑU}]3G¬Ûúê{‘4ý÷ÚMüx^…˜ÙG /K ²HòÂÿ%iJ”J=7Vo^Žínwϼ|</¾Ó«ïôúêܽTûëµþSÖá)¿ûÖùÛ57=µg¶êúåja|ð¬ÿóÕN÷Úw’_ûV}l0þtÍÁ¾úpÂÖyëþpÃWÝèk\æwuVÖz“÷â'vÈþ)>âktM9l-ÞÆÃ˜üζsa¬'üØ2Fh9±=Û¥o¼µ3,w~ZÞñ¿uwý¿óV½ýu˜ƒð¯¸ Ž¡¹ç ÔöI–¹ù?§§LÝã?Ôsñ9Vµò^Öîjú7ðsœ;xmƒ=lÔAä9›Æ÷ùšC¿×‰]ñBèî>,-ŸkwF‹=:˜ó<;ä= qnŒÞê«NÎÛç|>mÓõ‡:Ïÿ‘ÃÆ['=¯'²õçDÝ«ë;—Õ…Œ‡­õÕО¦=a Ì)÷­ÙÈ:?ôÙg¬›Ÿv¸×¶®øŒ›°áþÚ/W]œòz®kk9só³5ª¶MÃë³þLŽþîvÇØsÔŽÚ²_ãeÎ:&òÈœõ2ç|8ï¶M\àé:Äþ°~¹é Žz}âùí!ì®~2îÖpËvŒÜÞ‘¬o\ží‘“NÓ¿W똺E¿ÛÖììMÉLð×îè¿Kn4±éœzOÕ¦ý³ïË:V{ËÓÝ{‰Øw¾:ñ»9‚xlÞuýðó]¿4Y×%ôCû}ê›–|éuê›ün(ÇÞ·ïÞêô93>ÌW–^û«=ö§{ 1Øx5šñø¼§Oôû%7\~+Y7x×/FóЯåÿ¾Ö;ï±å×ïw`íA«q¬îÜgcâ3ýø^~ð-NðsîÍ_9èTO=öÜ]l]Yó],k=;§úÀZï©“ýÎÓNu’\âCÉy7Q—Á[Ì›7~ûéÖqæð~˜Š›oQã²=úw9;é.¯õœtØ'|Ž÷|fÝyáËbr:#–³ ¶<ï8øí¹¶ºÓæ¿~û¼›{äÓwEu‚yvÇßœÖîèÙ7±óƒoÎ!qfÞß­¬[ØïÞÈÒ/¨wˆmÎŒßv膗üVONïqë-†â‚ðsôU}tÝ{> ü4OiwÌÖœ“ê"è\Ûss‡aï¾µØÀÿñê³môÛw:ŠkgÝöG}³šìŸylËkΟçˆIõXG÷ý݃ìåÅÀzÀ±ø:^§}XÚÞ%Îððÿ£¹áØö}f,¦†åü`µ¾î?æíW××òyÔRîƒvZ¯½çà_зø ·qšÌõkÔzßÉמ›­»ÞµfY–}„Æk¾ÖÍ»}9ò}‚ÝŸÏ¿õŽ_‘ç¿/:îÞN#ÖÈ™ß0Ų–œl­˜Œßò&b³µæßoÛ‘kMóÎþ7ÕÖ³ü—¾÷w³õKãJK.ˆ‡×=Þ7õèÙ{9ƾË×ü56öÃ|í÷œ˜xîeâcYÆ|'2&ÖÆRY¾Ñï½OqÓbkmeüo…uÛÅ2öÙ>´|òjyëÀ7Ïù½7ÄZÎR}uýé{Õ6Ö6ß&¯ÕgxøögÞñ›mêŠûÕ9îadùŸ¹5ßCõÃÿ¶°ßX²æqy ï|©,ä8°ÖýgŸks¼>#Å:Ú÷Hw}æ‰ ;Íÿ©ýëñÂÅq|/îx2mó$ïÆâ·­ñZ<¯å£v<¿ó±~sÁxv½çœÉ­“_Ë#‡úÈ#[~å>]íâĦyºßÚdZ+oËx;®7Û¨s¯ ð¾Zï½s@Ÿïéì<Ãö̾¼Öø½Öz+ƹ9ŸýñÃ'{?;_5Gn«ÿ·ÖáZÎ]ï[üZϮsâvß:lþzÍWfpw_{}kÎñ›_ Ù6g‘±ka`}säÏú“·/îdË…¹ÅY_¯Áûf=û³}w?yžœrÇø®¶çžþrÓZªî°;¿|Ó‘sùÁþg²zÕ\kCyºVNß—­õ–síŸ8ÃÓz^ãîÿÎcêʶ°ƒžÏ!²´È5n£Í½~ÜâÏgŶ›ŸoÛµ¾[®½'‹¾sUÛ¬›o=ä˜ï÷n2|ë7öù·Ïeû¹;C#gÿìÇìpg¶Îç‹\œê¶þàXÌnkcy™îÝï l;§5Æ'ß|s‘ó®%¶ÞŸÃéÛèñx{œ¿Öªm cÀïævŸa»6ëïdÓçŽ{×ë¶g]ó¬Nχm¹oÞìsmî¼â—õƘo-Á‡ö”+ûlÿôα̉ï¶5¹å}pâlÍõw v{N‡®9ì’{rÂx­çÖîMF-<©°oââ˜þ¸y å+2Öm ØŽk„Ø+㜟ޞÈn?<î½vâT»µ‰Ç@îÈ{9¯=wÆÜæd}î}î¿Ç©£áî,ðNÂoUë˜ÏÝ÷Û²pqธÃþIÏ1có¡®ïÍÓÚÅ—÷bu…íÞ!EsR8–Áï—ÊXÖ܃ki­¿e~o"ï·îjœº«ïýVÚ¼sjŸŽŸý4¿ò¢å7’÷bkÖ/xwt4/Î æ»u¾yƒóQ=ó\Üýí¶†MÞbØ£½S¾ÞÅ;§¬÷;ß¼Xß2æfytþÕøTÛÖµ æË£0çÚ·.¹pžœsd«CŸúØ»guì:¤åïð´l8§¶kÙæÚïªS°k¾ö‡mm×ß­»œÔWùÞ°®w£ò§3Ášï\ß';àÙzÿþf»sæÔüÖîÿát¯Zξ«[l=-̸NZ3–ã]Ð< ×¾QyÆì«õ­CQçãD®åLÂËy*—½U7‡ßÖ{¹”§åª·7*œ/ïp¾•¬ñÿ/ËÖö°;šØvvÆ›¸/s›õÎmO›Óî¿•œ[Ö‰¥µ² ÇÞ5¶GÛj¿EØ;ÇoÙŽë>È-­¡œ2&÷Í•}úŽ4Ïrò|ïÒµüÖ©Nõ點œÇjyü¼æ½ãÈÁæ©%ßÁÈúüâ×¹ûré͵h? ù¶×>sä~ãgo¾æ¥ºý{ÎøÚV¹Õù eÝ­¹3Í¿]c×cÏÿŸ³ÖïÞÒYUÝÞÞÞ>ÿH>Ògé“ô©h럵þFû“g^o#kóѵþ°-Wü¯_{£/"Wû¶9ŒÅXÞh<Ûüþµž-ä.]¯Ÿì£7_iŸ¸gÃ>Ú—+¯_fßùÇê#sááÓxËçSîIÎl£ök‹õ·šÏöd± ¶õlÛ6–ö8ÕÅNkgjݶ^ý§‹Þp[#ø=ŸW^œã'_.½Qãµ/¥éΖóh\Ÿ¿Ñw¯}óŒÍœÚàû|bþû‹·¹mƒ ï·¿ÏÁäéµÚÄŽý-5FÓö¨c}·LõL¾ç æþе}¸ñªûwk4²¶·õp½æ<âûõ“½Ñd×C•»i|z›àÕ‡¸è6hg¾û¨9fß1«2gܵ°NkõD>Û–­/O>¢3>÷ùÚ|¹fM.¬óãkNÞd›ev–í6ì´ÞÄVÏ‘ñ½ö}\BÖ:¾FûáxçÃxÃåùpå¸&{Õx|ΫÏðèêIð+clÈ5þUkxWLÃk¯-F|ÜÚgÍ÷¾ÇÉÌzírZÿÙǶig\?åŒbâó%ç¬?äîçÖ¸ØbÍïø›3ȶ|®ë ù»l#»s…Íë 7.úÛXömkÎöƒÊz}ÉM†\{>r|Õu Ý_Yû=”Ø«<ßÄËšØã³âzmô»‹{ö7òܯ}dë'Ôý+/µÉºýc;Æ™/å³®}ƒyíoûZ_|>­Ïz=´ñêa°»_üæÊrÐdžrÈYx¯ï+ÄóÊ2•ÏçïªÇÑjãØ¿¹ï¨ý4òóÔïJÕÓ#gøk9ãnÏ÷bs÷žÍÊ[Ïwˆ÷9‹Ãà¾äÜãøÉ3»uÜ;ú­]eMèÛòÁ»°{'m¤[÷{ÊúÛw½.Ÿ« ñÝ3¾Ï"xððÉsÛù»ÝräóÒõ»gößlm$_m³²`ò½ìoš;ÎÚaÜ=¯?½ý“«öûÊñ…Çh»Üì[î=,÷ÛÕ÷ÿ‡zï]öyŽ!c^×älû>_`“³÷r8=žËOrWÏÚ—úõ´ï{¢üâÛþx®{ÕŸÎâA׿ ×>¼°¸“··z€‰LãòzröÝ¿[Õßòg§ß²ðlÏ¿Yø¼€ë¾ñ{Ðöz׃Ýo,ë=Qù¬Á*ÿ’å}ó=Ù÷hzÎ×FÇR>ÔwõÑ/¯±5DÞù³}¯Ÿöçg²Ë7Ï6îßb\çÐs丳àÓß×s½ënã{wzë¥ÍÉieG=[&|zï\£;ºjÐÞEÎöÈ-s0Ý'ð/?·Ç9èóDZ[wxÔ®XÌ]ÓÆV½' ×u¾ø½æª_}dí:ñì®ìy¿÷7¸Õyâü<^ßÍŒáy¿E¯x‘CÆ5)nŸ OßE&bq.}>ŒÇï@[ãÓd¿õ®<0߈g°w~0ŽçwC߯Þý‹wœý³OÌÿ‹ŒëUzê¿­Û§ö×Ô÷ö&üÖ§8Pïõbë‰öîjt{G=¿ÍYß½:j?á#ñ6gý›Y±ÐiŒìó>0öb± |7&þ¢oŒê“üB¦w­÷7ΗæÁöm>òîŸÍý Õým~ÙÜhýúbÜÖb#ï(ð[› ÓÿX÷/äàQx^˜éŽV7¿@ !@%Rž€÷¨¤[Jåà;Ì–ív/§û.OÇãÕÐÓŒ¥wÙ{=:¿\£$z;üî-igåžÓ)Þ7£[ßûÕù-|¨q4Öò–ÏXòĸ9QV¿>~ôYbg¿öOôå’Ãþ™CÚ‚ô­œqlÌK [oøÌÿºÖï/™â$¾Ú[ÚZAöXãWqˆYŸõ±kó÷ùÒm,õ½¾:W¯¹Y™]rä59r¿ø«[úó’Õù`n^jÇõö;ý-ž•ý™ÿíKy¯9\[æ™ye˜Û/íCi׋£q‹ë¯á3n?@ÿ·ÁþúYŸ;ÒO̱³g òœ)_,Í£#öÄàR|ø1ê¸oìÞ‡kÔŸgrõë‡ùæë%ôÇã?[Û’¼Ú/þÊÚ»ò›³’ûÍ™vÉÙ§¬·ÆâÑO1˜Ïŵx×fÏëò‹cõ zÀ:·?wרÔ.ÄÁx¼v¤“ìê­Tüæjõ×Neœ« Õ&qý¹æomïÜ;÷%²‹Í3S|Ž•]½õ£^÷¹÷VoÇúä ôܯõîpœä˜›Ÿå¯]Kž÷|Ï)óõU;ê)»ûõ×8ÛóÛ¿ò|G‘ÇýPÙöšrÔ¾u+­ýÕõ]²üê1¿Ãê¸~|gš#ûÔZ(ÓÜßÔýv§û¶¾¸7Í£gT?w˜œk·8[Ó•Y[¼»¯^uʳæÔfÏ‹y8õõ©·ÈùžÏꨧ½ö•µß¸8ò<§.öY_mTþNwýœøµ×ú˜Ó“Sþx¯€§îÆé|ñ÷; vOcóT;Ź÷Nß;ÛØðYßÜSNßúç[¹}@tÿ”£Òé^j<}—Ù:6—Žèè“sÁè7ueŠiï‰j«ù<ÉîÞ>WNÔïÚê‹ymîüħv¶ß̃öÙ__Ú³O\/.t¹/Ìñø=ZyÏlëhïõ<ƒóž'FûK;•ïØ~eguÀż5B¯kïUcÒ·=¦\}—ú½Ø*¿¶ŠËøWnýçqöÌVïÃÚVO™æÝû\ÿõã70üâs®Öôô=ËèíûGmo/@>wÔ“o,ÕÙçý¢ýâñŒ¡oüÍŸøÑoõµ©\ï–}?ß®·e}1ïó¥çSÝÓ¹>ÅU=ŸðÛÓ‹÷%„Nÿ‘6ç͉ã~9wÍ¿ÆÖ½57÷®ûì«/ûQ;ícÿÊ;ÕºøôÑ{¿ûõßoÂú3õòýTߕџçfÿƒ çÝÒ»­þ6†Ö’ºŒÆê9ê^{·wXÌ£5Zßå9oïX¹íaI¼í‘âhß´j³ÔçÍ]>«/¯µ–èuüõŒÖ¿6Ê3½g»Ï?æ§;µóõÅZÝÞõÕ½>ï›ó“>ã>ïk¯~ μ¼ò­±ÊgÞïÅbpý}ä+a³øÔÃ_ï”ÓsB{§»§g¤öÕcÏñ[žwyæ¯Nw+Ô÷ºò[ãe}ggãØ~ÍŸ˜åm8W{vŒNd°Ë<œb¶ø]+Ï·á×úòµNšû“OË_]æ¼þ:'ôÇÕ‚eœÍÅúh¿çXÛò¸O›ÇÆ¥¶Õ®úW^ÇæÚ}Uòþƒ–3UÿZÆÆ˜1ÿÏ5fû¥¾n\¿®¯M›ùïdJ›CeŒC±kgçÕÕøÈS]gÝY<¨wïúë¥5åÝ`}{oÿÚ ¾S}A`!vc°òæ»ò`Š[Ùµ±±ØÜWOëc1Œ‹²‹Uù“Õi•¯²¬•û'ûµÙ½EN8¯V¶míw¯0æÎ1§Œµ±Xµâ]bŽ<7Ê¿±Û¼Ù*g]@ž?‹ÇØ,vuWÆ~ï™ÊjãÚÎÝT¾Ö‡~€©\ψò¸o”mL }vMyçö-NùjoÉ7ë¾-¶Ö:6‡â2Ö߯zqîð—ÚȨeÛªW]mWçI¶6¸Fm7f§x+[{¥Ó]¸ãµ¯k•¡Om5ÚѬÜþy6ïûÑxÓùÅ1&ŽÍý¾Ù·kcF-WO±mù&éšo}ó\»îúòÛ:oŸü\ªlul[2Þ¶»¾ùƒô·t§cqÛ×zé™àùÏå'âíþY¿×fú§3öû¯íÎòìbý”£­'ÈœÒï7uóN«öª~Ówïî·ÀêgÞ7Q󨏒KïHßV½ùqþÔWWc#¶vÕçÆB9úØÑs©X§|¶¿ûÌ7CùN²k?ýú]žú°ø®õ7yXëûÔómõ§zÿ­Œãæ}ýì|õwÏã»Üï~]žó7“½iÝ_y”Ùš/ô5ò´èÜ;Š>s`~ºÆÎ{ï—Ö»xã·ù低û»Õ);÷l\÷–ø+'õw¤¾§o|[útеòýÞ,ÖÚ²cy™?á¯ÌÉ?÷ÕiÍ:ª®öÚ-îê¶öŒä^¦ßs®øPßÿ­ùµycAl—×I¾¿äYLó}Ú¡Íòô;|ëX^íªýwwÄÖ—ß›ç¾k{þKõ˹¾ãÚï[g2ÿ^}xúÆ.Äý‚߬yÞë‡òÐú£þÆâÜO½®Y¿Ú'^qÍÛÖDßƨ1álT–ú©]%ãU{íÓšãQ±j<´Wžêu®ºÊ YKòïzqºÖº½£ÆMÿ¶¦ m®íÄTÅÛ½lÜëóÉwyWwyµ­6.ÄûŽ5ë³¼¥ó§˜ö7„µãôݳ<ΟÖ$mÙ5÷ªu&_m·í™d]WoϺÕóŒNç¶viKÏ#Úî eמ®ùæØøŸx7VŽ»ßå%ÿÞç3ínî ã¸çGq%~{kïAõT_[yzþëÚ#yÎko±8KµqýaM»öl^;;^¿Ål»þ.ÆæªÄ¾Òo×·_,ûë_ùýŸgõ‰küœVw>ZêÝßä×ׯyß2ÍÿIwÇæY;Ö~û‹ávÿøêjx^…™É®\EÆ`0£ŒØ±@âÿÿ‘wD‡ å5‹TUå<Õp»?¼½½}x‡ïðÍ;|ûZ3~z‡ï^ãèƒá‡ózôÉüð‡ÿ^st,ûËK~sð[ƒ3üôöŸŸÓ[Ÿí vÌc€ÿÉŽõÌÿóÁ_Ý?~…Çú¾ÚÆæ³3ÚæðÕÇ® Ë­}#G|jÞܬVà]CóÖwó´‡L»t­ÞøæÜàÿÖ{ù±Û„ßòæŽ<Ãg¬—¸è¿†Æ|6¨¡{x95Ïæ‡±û€Ú4@ë…Þæ§ù0­ëÁì¯Nл'/Ëš‡\Ò«Wî*3`OckÌÈõäÇuV|yÑí‹eF7ÎÀÞ4ÏÕgØjzsqép\î#ç ¿|.c‹~²ÌÎéò>¼À½e;Ï‹×ô}m¿IÆõªŒ×›/ÿøàËužVÞ=ŠÃ-Î7xÆúµž¾¹,ßöZý›MèƒÙÌ¡µß®ãìÛo×í)vƒc¬ÏàÌÍ|ßùµ1øãE#×õe´ÅU¿é Ÿg—®äcõªßó™w4ìA· ÷÷æõ;Öo0Þy„Æèí¥«Ö_;}-nÇZjÃwTûdy?(Ï€|üæ×¹ OqÔŽ»²à©gãdý$Ïœw¢mn~ùÿYóÚLW}`œnŸíöÛùc¿Ønó ÌÛ(Ý€>ïûn^¿ûÙK¦_rÌ9º—ˆ©2ÜûÀðžÓÈ‘CÖW¿×®mC·Ž³³Ñ¹FÎë~3 “3½ç <ãŸ.ô9ÖúZùÁöùx]?ûæ]ò¾ÓJ¿pö«9fœkhYçðf_66ÏÈ´—ª×3¨rÕYè;¾¼[óÞ%þÁßâZøÝÕþdoÆÇ;ÞöÑï|ÙŸúvÑ—§á[¯¯ék>}÷ûÉ×Wx¹‹ÚÇöÉú.ÝØ.zp?xë]ºÀóæC^ú7ÖwëÚÚçµñÄ ­qôÖèä ~b¬îêY—o‹æëšón5Î{Åý`yŸ•õ—ÑöÑÙþ"†ž­Ìy_Áƒ®òY—ý7Ý2ø6øëµ®ÞËŸ÷8ýc]£ó¾‚ßìSëØ{Ø6ÉõÖãC—s¶¦‡ÁŸEðcßÀ{i<ÄXü݈­Æ¹‘ý@^/{ægÞþp^.=Íã“,±TéÕíXÏ¥}9C½× ]¶¨›}r [dêëd^tѯÖ{»xç£~v&—^mʇö‚÷é¼!›x:÷wr£]ùhœ¦¡§{¢qÌo~1¾|½“±—n½Îøáxë´ õ¯4ӛ꽹ý†Þ•þ´|î¡Ã±pgÐ#æÛÈû?ë¿{À4Ç·Ñߌè1ß›‹¯8üؼ=bžÚ¦Æ@û9îÓü½ÍyÝè³Ö¼Ø}Ê¥Áßë—¾Á•ƒ øÛ¨ü͉ó y×ð)_['ëòWÇÅã>3~~R?p>Cœt¯‡÷7^ã¾ògû®“ïãˆÚæWlÀÞìÑíëÊ5v¿.>ÿgè~¶,ôžþöoºõìwSjáßøËWÛã·nŸ-ÿ'[ß“Îǯóå¸ÿh‡|Z÷5§O8§ŸòWèïéåwÿ™6ŸÜöúÆ':õ¾ô_yõz°ß= Ñìü «BÇx^í˜ nÃ0 Ý6½ïãÿomð ƒH!‰ç’¢l'§mÛnÏts¦'­ïvÊÚô"ytOÒË{fÖÑk_¡û7ÑãÀkŸû 6ÖmJ®èeݾ&Šnlr× e%1Ñ·OëNyp6c:wèmŸ‰ÓrdÔ˜Ùzæ¥87fë?9fMŽÆm áÅù$&zø³_×äs×3Ö‰ý×}o» kã2‘oû° ½Ô~z?9Ùø¼C}Â{ìÚWzÞ¼ÎÁge¾×‘QÛöå¸ðÒ7ĉmp:WßÁÉkÛ$ÿìý|à]«îøSýðû]2äöáÿæ«}¤ƒÓ÷§sõÞDwÜÉ–yª3sÛº~ŽÛ±Ðíz„ç{Ÿ™{Í<õ×vé»®ã"Ÿ0:f(µŠdÉ.4½kЉz~ÊÓ3ï˜è´ÏÆ}ÄO¬æ½o—ü:§Ì±q_w¾]W(ýÞçÔ:ðÌó\(ù£3É'ŽÉÞ¹â7DMs6¶³¯>Çðû9 ñ¬Œ{gº?Øã?:ÈÍ7ž?Ùƒ}({bg]Çaý£µû ;p€Å¹P/ËÀÙ5:"tí[îz¶ñÙ‚Á¸§šSú-ú!¿?)ëÙ4Ž5O<ž5Æìú€!1áu¶_ð³&VûÄG×ÒyCî#l°Kìöá\:'רÏÉö¹ÔÜu²?pÑ‹Æç}ÖܵØú=k½èðŒí¾n}b€…ß(ÈX#Ï3˜ºùLì»×Ý?¡þŽl"vê=ÿ.¿sp<ÖÓ¹9F?áÁ÷ß};Ôw ,Ô¼¿'l?ùôY¶,~“OfôàCáQÇ~¦²¶­gÿ¾ åÛ}xÙ“G÷ò®q~!缌çY·ýâ}˯8ðòµ®ãL¸Ãë³Í»“39Â?í‹×q2;VˆïKwLxÝ#œ-9‹ëÂ7ºïûžÒ;Æãš„ø?ÇÏ)c°?»ß=­ÓþúþöÝ0nÈ÷¢Ïp5ÖXc5ÖXc5ÖXcãñО ºx^X[‹U¬‡Q¼/(:,jƒ$j”A1ˆ¢ëƒ¯‹£ÿÿGxŠó§¦¦Ï|.œ—Ýéêêêê>3{ÀËí¼ÚΛí¼ÕÎÒÎ'í|ÖÎçí|ßÎÚÎíüÔÎÏíüÚÎÖÎKño Ç¿×·Ûù²oѱ~Àï>&±ÞAÇ{sAÇý›¸ß ãVxÂz{Žo·ó.ö˜Äûƒï×èØäýç:¤Ä'÷ÌAÞžã+Œ<ÄOÜ{蚟xâÊøŠãþ½Äeý¯ap·pÔÀ¹Õ^å¾ê?ëßCt)ß“vžbè.¿dÞ ]åf]̱`ï]áVþ¨¸§>É[ºÓ9®Øãÿ‚žãÃמÇçLZˆ¯¼Àx¯Ñ9¾ŽÎS3+®ÙËÄL 6 Uy4ÏÂþG|úå†.Ïp>çÔ„?Ê›žÑþXpÔǽI¯øÌPó çµhîÕW×Ky<‡t[q¬cÃè+ùÓgHšp†ˆÁ¸ä¥º³oÎÁkܰ÷„c¨®½ÎVÖá5Üa®WzKXpì‰zá{l6³9~gT³–=¿Ö‹ªŽÔÆ5÷3Þ®S…¼Ó¯ôAÅ[¸³ù“§*M¤Çlÿ÷ßèøüaŽÄ¾Ö[Ÿ³Ê?ÌAÞÂO÷…só˜œM÷Á‚ÎA¼|* Æûl/¨k©´Ú°ßË©¹Þ´Ïwæ¹êùõ¾q»Î+GÕË<Ù?Ö,¾‰­º«ü†î¿™÷ª¤É ŽóI§'gûÿOt툯žðç‘;¨ê©çÕŽ]qÜ Â#>Ãß_«[ï.ª;ï=îVÕΞ©æ¬uÃðªjz€ùì [µÍÞgÚæN©jcn¯oÁ±Ÿòã,ïÚ¬¯òfz‡y„_Íc5WâH~¾ô sVyfþ̜ޫôŸïq'–ãƒ\C¿j‡‰ƒžU®ô\ΙÇz?ªÝà}àOåék~>{G¶Ï }D,òRmôHƨ7Ò0ûðÝ%ÖãäßД—µ°ŽJ£Jb¹öââ©1¹ ‹/°÷Dö«ú¾©vðYÿ˜#ñõ®º`ô‡±Ú1ÒëûÞ$?}ƒVܼnßÙû¿°Ï‘{$1‰çu kÃ~2–º)Ο—誶3½å¯¬Ç÷Jê”wô‚½F³ÁÞ W˜Òñzoð8>Ëš¼×ºç¼W öšÎî8çÀÚÒKúN”Þ‰ïõÙLÞ¾óÿÀ±—9 Ú/7Ø×q†»a+mÎúí>öæûHi·¤Fò@â ;ßkVçdÃ^ÿôW¥½s?ÓÝ{LüÊ¿ù!m„û56µ—.•Îr8~µCª™cÜl>ý9å­4«âµc®Å»ß‰C]f}ݰ¿7„·àè?âøûÙŠ£GÒs©gηÏó?¸Äå]^yõj.ä¡îø^Û fî›íã~åßø{ÇóÿQÉ?×záú¥vîMß ù> ̇èzøûóSÌ{í;Èñ}7?÷ÌŠ#× Ã7ì±ï½ÜuÄ_б]OqÒsÄÊ9Ðýâÿ³prf÷‹võ™Õ%ÞÕþ!&1¤±{â†/G]“ƒÏÑ#ÔóÍÜw8bêî$jÜK®»ëã½Ö7KΦs¤Väy¶W•‹9ìû%mÎxHÎbæ­òm8î‹jÿiÖÈûÿô[š§§Ü·ä÷5NÅÉïYƪçäD>³•¦Ä#Žz$mòeÜÙ“Ex^¥YÛŠ%EŒ‡EQ¼±Štµ¯  ʲÞiчyßk÷ÿ?Âú•ÕgÄz:U‘™‘Yuæ<ðd[ë¶~ÝÖoÛjÛzn[/mëÕm=ÜÖëÛzg[˶>ÙÖO—ýÜ÷âe/÷ðó·õ¹í!æ?è¸Ïoë;÷:öGØñ¿ÚÖ×Ûz¼­ï°cý‚Ž÷v¼Ø1‰Á³ŸÙYžYc?c¾±~æ9±nÕüz^Ÿâˆ­œˆÏ<ƒç™×Ûè8 v,rĹKÎè#Í å@­åÍ;Ïj6$'îǬ%¹¿¶ä½Šãs³òkÿç}å3 û*{àëିŒ#ž|®ª¾¬­açsÌçê¥ú¹GŸ ³]>'=¤Ul~îu%_®+q²nÍüÔ©¡×ྫôγâ^\ÈK3 8/ÄQ¥µfÅYœk1Tï‚c/Wµÿ…£7SËjî(WúF^áL¾6ãö\™'qè5yƒŸ±.ÆöXžwΞQýšõòžòô¦ÜO5‹?ñöu­ÄñwÆŠ±FñçydUý•xâËõMM}žyî ù"µô ™s’–™“j¼ÃˆŸsÁÑ{Ž=«Ù=žØ>S¤g…!Þø§>©z$õQ~‰Çœn°ã>CŸOŽSõ†ûî>=Ý0Ö\½ÙäC÷c»N?gÛµ7Š8hè<(_gU÷®÷sgß+wúa¯š«ªÃc2Ö»¹ò;í¬6ã~™i ¾9§áÈuòRõG•ëlÞyž©Ar?ëAñ^ñà>ô~^pœ§é»äAÞs¿åœÉ<üì-º~/«>ååµ Ë9kû_šÊŸ•òdò¢óËe/÷ð3Ÿ3©;ï{åš8³ùàšäý–¾ñ^âù<Ëøª«ÒèÌŸgoDÆÍw⊺iêš0þCt¾¼ç/½¶b޽Gîù:ËÏû‰<ä÷—êlÃx羂㯸Mýª÷YúoÁ~V缇¸÷沿âB³Ro¯Í{€yœý_ ûÓuôþª|$ì'˜{^s®òŠ×’úøŒ#næÝPãÌús¦ÇßgЏK¯òŒbóïZMîÞiùVsÏø õÅjÎê¦Nª£ê冎£™²`Ï+÷Ò‹ÜŸ±y®ò1ª“Žw‚û9ß~O¹î…™ÉI僆±&ŸõÔpÁ|îx=Ž‘œ0¶æzjL ×3ϺGÎæ§øU_?EÇÍû&甸È:ä¯ÌI;N•Sj”óålžú»²ª3qôù‘ï’*'ÖJÏøLU¯¦+?Ww†°fßш¥;XܩΙ¶Ì÷Oìóªaì½ç+û}Ò0j¬^ÐqTsöÞŠ9—Ù‡®ô­°Y»î÷câ«^ÏKYq䬡×Zå$iý!ŽõS'å&mVÔõóÏ5ñ·Oåç#Æ5³WÄ#sãŒÿuŽê΃Ùƒ®“|:ãÀ½åžôYɽÏ0Ö—÷wΩÿËÕ‚^<—˜ž¿ã KÜä;kÖk #ϯáèÝÄ’GÈ5ßä>»ˆë9ªüžKÞr¾To€k\fÎÉâx/³W¾ÅÜ+×b¦~•'Sß]þK,éêõøŒ'žzþì7×ãF½«·`UËYÞÄ%Öìâ¢úMgV{õbÁï>w§f]Uã#Œ¼Îðæ>Èü|&I÷1âjÞÝáØ‹Ò>gCz˜ú“x•®åYõEÎ׸җš>×ýü-ößÙ+ÿi.dÏþ ¼O4x^X[«E¬Q/AÅ(&º¯ BPNäCQÄ}ßNòÿ„S¬ÅÖÖvïùýœêêêêž9y àéŒ3.3~žñëŒ1ãõoÌxsÆ[3ÞžñÞŒf|4ã“ËŒ/f|9ã«_ÏøfÆw3Ïx†=ö/XñŸñÇŒ¿±æRæ ¾°‰ù-V¼ï±b>AI¼Žó‡X1Ìøo⓯rŸØ?¡Æ'žp¬~VõêœêØsK-ïc«ùöš_u?ŸñÃŒÑkÀ^;ñÉ—XÄP¿«ïkX9 ëlœSƒäÚõ}`ÅÍ³Ò û#îÄs]‹<ßÅÊõ}l¸Ù{çLlêzƒž÷KsIçNܪþôB…ã3Enwù} ö¼÷ªê“4>ù²þ.OrýûùÔ9¹3®ùT½uo^Ðû’õ¦öäãž$¶ï¢wàØ‹Ä\°q¥^9Îq`?ÄÒîY°õ@Ú'ÆYOs_°ÖÏÐ÷–u3GW»ruyrÆ…{†¥‘˜â˜ä|—Ç_aÅàÏSçÓËüŽçèÁõ|ò'öX~”~<ŸtOÉ+òÈ‚-oê¬ï=ëgÝeÚÕ.®üžú¹‡º³ª·:Ïz哪û}íþHÍš´`mÕ=õ猰žçïù²¿¾O…/ÍYå3Ýõ9¿ÂàNðçÚ“kM½¬çù­4érËçòÕ‚ú®é<“ý#fµß:ïûÖÀæÿŠoîMá©wŽ£¿Ÿa=ÄÑÕÞôzs¿wØé9q­0‰G¯ 1ù.Ð çgõJ=¶x¾Dï¿ëùz¯röC½›‰MKçuFªfíæ"7ú’ÿÆzn°í¨äïÜ¥‹üëºTo÷nÎQ§óYÿÔ·k|àsÕùLÚªÞ{èw™óâù£ª71kŽ8ù\ŠÏÀOXz3|ŠZ3ÕË{DØ•ˆG3Gê™Ü½Ïz jNˆ§3üÖgð. ޵úÌлg|RÓìÑ‚ýNÎ÷R5“îkêñ·N§­ôºàXÇ¿Xs¼Bÿ{˜vXæQMª§›SáÉoy_J÷–øÝbÓ y©ŸÂ{ˆ#&5Èßç+ÍÏ|¬|òLÞWùfá7Þsê“w&Ï ìóñ¼´ößÕ™—5iW¨ŸÌ?Ps–>Õ}ž~¯z–¦ó!k{Ž»÷à@Í3{™>îf§óšr1Oæ¨ð‰- „# ÍCêZáˆ'ß}âéooõþZïyÓ 6îÊWåº`_“ï%þÜëâϲ&מcŸ«8jÔí&êDÎ×ø³Ÿþó=´ ög\+ˆïõ9µOÍ•#ïkz| öwçmÍNWÿÀ†§·˜ö—¾ã7üSqwßT; 5«8°.iuV[b÷¬·+Ï“›ÏF7sîÝÜï~gWùXÃÀŠ«Æïø3îÛåÿ¿ó{~˼¹?Õ7oøÜ:_í›{X1r¦œs7O¾¿Îæ)19§Ý¾îüª§òªkM|άvL‡[yP8°Ýaô=k'Wõý‚Ú#•®yGúLI¯_}Í™wüüLbÊgê·ê<ó¨æ|A=gšyÖÎ;ó½žëŸ.W5ßé éí~«ô®ú—s­Ztç×=!\bÞâ|6º½AlâRõ0ylx©·<šòLçw¾IÏîXõË÷ÔG¿_5Vý`/äù Öó¾›ræÉgÁ^ûkv´O<ù3wš×YaJsúÞu#Nbø¬ˆ‡æ%9Pï™×¦÷djýös‘žÍ•Cúå žÕ«~ú¬³ê±º7ÇÀ¦A5 öóêZtï\í³£ù¦–üß½­<ÚE×äéf9§“.8jK-G\ŸúTi qJ>Ý,s¿ø.>›%¯Ûï†{ø›0uÓ ˆgůòÓõšçùÿÍu¯²vÕÝù~àè%í¡3¼n–Ü;ÿÈŸHdx^•XÛŠdEŒ‡EQ¼,*^P´¯°‚dUViQpß|¬õÿ? N'*NÖ™q¡`驊ŒŒŒÌªîžëű^ëÕ±^ë½±ÚXõéX?uë×±~ëf¬?ƺ«õæóoŒõæXoõŽx_ŒõÕXߌõx¬°Çø{ÆèØð_ÀCø î'ذ?ësl1asWŒ±Å!¾ør?ÿÎÏ©“8xü÷±ÇVLÆãÙŸqŒ—y¼]#b5ÌùH«»ø‹£jÙPçŸç”WzÀ9©nÔ•xßbÎ/1ÅExéaŠ›çUá$¿Äk˜9J3ò¼¯nYÇuoUš^pŽ+î/cÇwþàØçŽ#¦ãÉK 3o×äÌ›¿ãØÏÒú]̸îõ±a&×JÛ‡XÏú‚Z4ÌüÉû;Ôšs5'\kéâýUé’yÛçñ]óªg}}‰ ÿlÎuœ×µêC÷áJ×¥ÂÍþ!nö¶ðn0kA®Êûù7×ßç4õÏùæúK#ŸŒ¹Â$wžW½|¯ïÓŒyrݧ\ž^÷ºæ¯\ÏUºÈƒÙóÂËžO­+<泃:ñ3þßù¥ž {½äòJÿGuëØy‰Oö˜êγÜÏØ¯]÷JgùõöÚÈ£ÄËœVyT:‹‹÷dj=/UÿpÖø\L*žî5éwÁº2†òð¹å~I––}¬gØÞ¥~>õSÝÅËgTòJ/{î©åª/ÉÙçu5'cd„§Z]PÏ®[Ìœ³t¿4̽|]—äªÕünØç­0‰ãò•|š=¥š“[•ëÓëÙ*?{Ƀՙ9ÓµËþ¹O½ƒï‹³:w¬g0ï“oÆXájF%¦ôlظj~ŸùQõùG=„É7iÞ ³îŠ£Þ¿ ölG­‰{‚s\qRÝí«8Š‘QoaH Í÷¦÷N•«ÏïŸêá\ªZ¹¦ uŒ|ûul|…CŒ†¹WõŸÌµaÖfuG¦¦ÄP½”Kê%Nš/5b?v¬ûÜõQ÷ÌoGõšãH'½ïμêXù­áÈyÓߣ®‡ú¯cÓÖk*LÝYÃʳÞ7 ûYÕ“X«üVõÔýq6c;Ž>ÉZæ¬~Œú"GbèlÎ÷—ÇÎ9[õ™×H³Üµr:jÍU«|ç:v¥“ænÇ^ƒÔjõ>'>g ¼±ê«Žc¼v¼Š«cÝ¢Æ#׆ãÌë™sb‰_êÉ|Ùë^£U¾g¸«~%wiª¹’~¨â±o]Û¬“ûó‚ºO’/ïB÷{C]§ÕïÒÙk–1Î4¹Ë»É˜òÎËܯ½ŠïóMy)Žö?‹3ÒE¼ó¼sÏÜ틇Øuh˜u¦Vù—˜ª»ß sýÉ­ò‘f?Ïëog9gˆ¯y¬þàÍ8äëZг+=4/ùæc<÷ƒÞOPψŽ5®tÖÕ0÷_~¹`í·Ä®ü ÿ ïÿÌHçK›šŸ}ÏèØ1å÷†ûËçMå‘jn®f ±ˆsŒÌWþâwªê·fy€œ•ûטçPÆSbç{Z|+®âÉZ“Ÿÿ¶G>îéížÎÞ‘§½GS;ϼ˜“ûCø÷÷1ô¨z¸ÒWxâ)¼7±çK­ÉyÃà,l×6uÇÊNU#÷ña®¡ûÊëfïWøä÷ççðŒ+Lð¬<ç1¦‡å]ê ž¥Æ<ó)¦Ö<‡Þâ³ü]r๮·úésrÂÄo<µÇõå>ùV{µœx¶Î} Sã÷0ý©óåMec¥ÿ«Þ§‡ˆ™œäñ; îS=Ê õ•:sò,yä’&O0jù 纪–ô‡8){„§ÌɼQ]ϰÏÉ ×ùz¶é bÿ€c¯eV3Tér©†¶Ï÷†ér&Žö7¬sQ{Ùß*WF®æ¬È«•^¬%ý•Ùì5øÜå´pOØÏ¡°‰«~j~ä_õît¿Oºº?ÒÙ'ñHÞŸªïÔÊëÚ0ßmê}5 ä¨÷¼ëçÚ‘'±ˆq‹Cüøü†Ù'i"ÅÑýÃ߯¼S½£\'æŒêÒÌ“™Õ0jr½äG÷ûH¼Ô)uÏùõÞ§&Úã5é|Ï‚GØg±ûÐß É%uò;“°2ÓO˜ýÊLÏ™ÉLYõš­î ~ÎØû—Øšï ûÚÕqVFˆŸ×ù|†ÿçz\aÎ{5•ÖÔh5®•߃…MLîÏÔÒsp5|®ªž{OÜÇ®au¯¦s¢w¼—«ó+¸Æ™ÕÉgåCÿ¬¡s2³›¸º»$.3WXâÉýÎKµ®úuéž!½èŸQëœØÒÍýéØG9}if_¶7¨ÏÉ3ß5û@-ª÷;ñ„%M7ìgX϶ûgÓëU®±ÏJϹ¬'ýë=`å½Àu£f~GV¯òŽþk8×.ó“½öwªs®Þ‡ÕýÎóìE´h¨õH|÷ºf,kn¨½¨w]ÎÐÊ«¬jØ{Pó³abdTõ¦Ž+ý¼Ï^Ãy­Ä”w6ŒzV3,_ð§Ò­š1å–xõ£ªùH{ÎîÔw„†Úƒº· '=w‰kõyp>Â"'ÇJN•öU¬oÕKrú5f•£U›¸žÑ°ž³ ;{{Â9ß0ß•Þe™ôLžêMâ5ìó65ä~ßÇ=|–g¦¶Ž{‡=G¯™ß‘<ƾæÕ»(ï^®¥gLÕip”ŽÏš¸>Ì÷ÿ_ýL«lO¸†+ ÏË|©'Ô}|ŽÁ±ÂvTå ŸPŸÁ?#sA}ØPë ïÓVù(ìÔ„¸üžN˜žÙ+ö´aÝ/i¼šéô³<"^ªÏ©ŸäÇç¼Kóê}ãç­<™~¯|’zyEØÔ&=BÜÄZiò§ÒWX«ï$œ£2¤òÃ*K+¿eîˉ™úVü+ÎêqÝÇþöËôO¹utÎ3ì3Ü}çglØ÷”º_šù†ã*/+ëª;Àö9îXù7b^cjw”Ô¡¡þÜߟ§?^än ï­æÐ1]× —Þó»±23¼Ú“ýåùš¥›ûý'œ×Ô°×(5ϳ}_å}^Hï爇û”9ìE¹N/åþ†ÑõA—•'ÚÇ=¼7e þ·Í}f‰×³úþÜ3%Ïp/®ðWy’=S­Ù7Íô-öu7óaÍUÎ]šgòÒ¼%îê>F\ÿ|UÕëZz¶­jÈŒ{„ý#m³ŽŠ{êQñm8ÇÊÞ»Æ/éZÕ{…óšzG¿þ´µG`x^X]«%5¬‡EQ\?P4ˆŸ  ʲ¬®rP¼ˆ"û¢¾]ˆþÿá9ÅÔT:sÄ yºIuuuu'sžø~[?në§mý¼­¾­ç¶õü¶^ØÖKÛze[¯oëím½³­÷¶õѶ>ÙÖWÛz„CŒŽqþÅâ,Ï5ìg¿¸žû{ü_·uÃøÂyˆËq>ÞÖç<ˆuÁ1âõm=À9¯pÌI¼.ØñëLŸ÷qäHÜÏ0r&þרcTœ3Î[¨õ¤ÄÿÇÉ¿Â|÷iýçz¯<äøâMžß`Ç–c°nÄ OñÜwŠ'ÞÅ^[å±âÞ1bãe ŒÔÁu½`œûǼå1ž»®Ž%=Ý·®á3Ì9yx­vÌO±k³ê‰Žñ'lò%¶ø¦·¤ó–v·jž}+ÏV:8_ÆàË|5ÓæXª×*?±çàøò‘j(žÔýUqs f?jV¼˜•3=^á¬|íµQzo¦^ôïÕ§šŸÇy¢ºsžd¾Â^õsMLïkêéor%ǧ˜1‰÷ž÷tug3_žW^®çR³ÊËÌç[ϧ&<ç|9ëªxÙCšÍ©çõ55à¼ì˜u}ßqsFdí³V•¯Ò÷ GÎÒꂽN3??4ìüT+¯sÇüPü¼s}ÿ*–k ü«¾'Ö=æšÏk×0ø³Ï=ÿ³\OÇȹ&ž~W_0×ʱ+?kå#Þ YëäUaøyòp§ö«·¨rUŽU¯3Æö\ÿÁè)õ¬×ŸÿÏþöÞÎØÒØ=p¦-µy {N©óÙ¬w}Ä‹}ºÒ:ë->ÊO3¯á¨å*~DZ/4w+m仪7¤‡ãTZx]Ó3ÎÇ5á;Ý=Ó¶õ!ŽóË¿‡ô¾¸`oåƒü†8Ãë8b[ÃñœjÅØÜ›žc,ÇÖ¾Ô:fÈë9›¨?ëê5uÎUMåÿ|Ï1½OvꛣâÜ1û£açæÚ1.cº7åKõŠpŸ]÷‹'ñ[gt_8·ŽY?ÍÝ; {-¼®ÊE{©µf‚ö9¯ô•ë˜ï©†Ù«:ýº¿óÞK\úÀõgéÁ³'ïãJSá—ê˜Þ¹uG1çì¥{Œ<Óç‰×0ceoR»;ìµ$fÃî-σÿ÷Zgêá=«X©‰ú¶c¾›Ü9ˤ·{ÿ‚™cú8kŸXÔålhư¿:n•¿üÎ=ž“~ ñZ¸¶êÝŠ7uà|¬¼A­ÏÞWƒ§óÊÞ` õ9ïå¬'cqÆç=Xùˆ%÷¤ç ìÄè½’8>c}Tù3÷¿qœƒ·z#1”jN>Äh×3Êÿ¯ëÿÅÙcq¯sÍ~ÊY¸š3<›ý(~uMÝŸ©ûª2çn¥cöÓê=±:jßgœÌÁ{Àïñÿ§ò±…«w”ãvìs]u÷ù¢¾qÿ-²â',õ~ê,/匽àèÿŽ9_¿ŽZ“’Æ ÏóðÚð¯êé|{HòɺHKá(?åä5ñžKœŽõŒ!–¾KvLiN,é!ŸHóô¬4•7øv-é{¯™Îéþ¨_>¨µV7OÐÖL¿àzžÂDð»ò!zù/=ï=ðäwÎMÝ?Åa6vš¤oßU ®0…¥zt½åx5÷?­ÝwÅPçÜÜ»Kmxž‹÷e­óÜ×]x5Ö^¯î>”¦®Þš9è5¹ãÍԖꂘ‡]=RGàÀ5ë 3ä¥(6~S^Ô>9R›Î_ôÑý:»'³©á¹Ô‹ûNõéâÛµ±Ô~^ûS³ÎA÷T¾U–ê=3›'î¯aâe>–øy}Rïà0ßoêx߉˟uΓZs/+ߥv=$yÍzÇŒ8èb6·¼V:Cô1ÄUw…×îêŽXëìsŸµ]üŽG[òάÇkõøªã•fËuÈ=ÓÊ]³z­í{µO÷>¥„7óQêøJ{êÅFöCsWxô’÷šÎ27»³®7ú9{/g?;~G1è­×‹Y°ÔŽ+,ÍTÎ_qÌÙ¹Ô¹§ð”Þf^!V~×êb^Ý¹Š‡wfúöÞ ›^¹†µ—ÜÙÇ\IÓ}êýE9+uÞç®÷ó®{†ú×k!LjŽÏéçMõ5_ëÈ3½Ðéíª—ÂÌžÍtLÞôªã‰&\¼žðM~â¦ÿ½¯âÉýãXŽÓͤ™?Ð\¤ }Ïì0¨ÚÒ]à¾ZêˆuŸYÛy†Y’^%Çì¥k-ï…³§ëç3º>»³^[áø¼¢.þÞïµäô¤Žš×¿uî_Îjå^ežýTç^$ÿ×ýà3Ìc0W¨Ólž¥‡·Øô¼|WÀùßê9Ïü+fUÖÛë : ÞQCc¯ö¥'ñƒÏ7ÕÈsñ<O½Ìz?¼=ëê´â\fuH Î<Ÿµ¶ü»þ“¼º ãYí8/<îzM=q'dÎ]¿,M­h¸$å¥Zƒö³7çˆöÂõÃÚg%3³ä«sÌhqŸ(7éÐë×åÄ™sѽ¢º¥WÀ¾ëûp7Gü÷ÁôÜý^Íþ§ÇÁÆKí½ÕYÏ×¹äÜÑ9xÌršÕîêmJ>]/<×Dj¨ó^w]tç™ÛKí½Lo ã>žšåè}»OÏ|&i®ù Á›ÒÖ£:×l­ë\›°¸©U×ÇÔ…ÿ.°Ôqn|]óûb­£?ýw~oèÞ9›ÒWõä=8ÓýÏxÄòûï¦Î9IŠÑibö›y‡»»Àñÿ­»{É5ëü\9¿:¯tq©g»¼.:çú¥¿:«ýìÑçêƒf‘øk†ºîžÔyîû Ͼ\q_ëØ´–y u3Mxkm<¼fú\w=wzêÞk9 ò=!þOë<—éaâ?¬ÝÏ'„é^îx.užW³Y%~×q¦·ÜÛWµp?ÏbŸ¾íæ-XWžZëìWǃ'uuÍÍjrŸß"²wKñ}®]ñOìÄ£–žÿ1ÌM\x^Y]«\E¬‡`Pü"Štj"ˆ"¢$aQ\$ ñA|[<øÿ„Sœ-¦Nž³7^˜—{gª«««{f÷¾ðz_oöõV_ïõõa_÷õ°¯Ö×ç}}Ù××}}Û×w}ýÜ׳¾N}ýÒׯ}ýÖ×ï}½èkéëµ¾îc࿃ŸØÂ|Ü×}ý„OXÄy[œ÷ûú[Ž_aåù × ›¸—¾îaËÓcPâK‹Ï0b}Ñ×÷¨u ¶0už{–ëïGz7lù?ÁŠÍ3•3¾â)~ª±Ž4žÕ,õV. [¾î‡çXñ…}ÆÐC?žá^rX°þ¸Fò¥<ù)öž¤^¬u•›çUåôö~®0•SjæZÉ×Þ3^ƒÿËÏý'LÇ"΂q¾êãÔLz±n3N3>®Wöê9ù,½pä1qži(Î3/˜Ï›ìãÔCõqìÔ¢âëøÉ›¸Ä¬æƒk‘ú:–Ïç©™v [¾dÍ|ÿ~¹îqߤßf:U1oÍåÖ0ê:Ã;cà¥`häþà"gÝØcÎú,=÷Ûú%ÎQ®YÇôﺬ!ñ«Ú%Oáf]ˆw«'2ßj¦Ìú âF¼†õ¬fˆëüòº¯òAåó†}-Å…õ¬¸Ð#®UúlæaÇ&wásVÍê›úI7yn6GìÏ¿‹½?仼Y ]‰Ù°rQÚ«}wñ¥ë‘1«ÙZÕòèä1¨7çÖSÔÞ—wîa?kÙûU¼†mÏ*×ã.uå{r†­Þ}‚­w|+Îk b~‚Z;¿?2‡Êÿ³»”?ÔÊcxmª\¼ÏŽ|F®Ì—¹òýèõʘU^ùNÈþv¿3Or¹u§ý‹}ÌŒ—zJË Wž ïf¸¼?«y’ùõÐÌw®×«Æ¨Þ¥'ý0ÓG˜þ†¯ð„•÷¸û‚û¹—ùUw–ç“:ñ¬z‡çÅ•ûôwùNø³œ¤}«÷€r:cäå5÷zk4¬xê{Çñy¢ó<ã\T+?Ãýé×Éç§{·ª·ë¡9¦žÏ÷£÷Ï“Ë?õåyíg¾^×ÊGé¯Ó‚ùý£z17éZõ½ô幆½ž•×]ÎóY?ylŸo' m…K¼·±Ï¡a‹I,Ÿ§•O¤‰ûͿà ¯ì'žãŸÚŸú»GÔÚd‰WÝ > *¬ G÷—ð‹3wA­‰ð„¥·VÕKÌûÓãŒç¼ù3ë—†mgsüŒZSõ°z¯òœf¸ûŽÚ<žv©¹sv¼'NØßm®mUû†­Æš7³š)÷䑵"'ÎÝ ç‚13UƒÊ?ŸöœÔy²ÿuw7¬¸‰á糦äåwAr¼Õ÷Ëu~aO¸¹O¾d|ñoãšž°¯÷Ì/pÜóÒYßÊ“'lµús½Ò[òù Ÿ¹Íúwã^õ—zÊgÎ ûÙ·>‡+m܇ĦFUéÇ™>ÕwŽŒ¥³~&6qtV³Ž{ÒG³ØU\é—³é(G½qÃ{%}ïùͰg>˜}?¨ºûý\³·ˆå÷¹{ÊõxŒíÌ–·ª8gŒù(½©EÃþ^ÒÕ)kãyùœ¨¼åó³]Ï‘3Ϲ'Ò·>ÞÒtÁW«é}’1ŸØ®ñ„Áóέª•>ÏWßiJ_ÿ+ßOɯÒ8ãÉgÊy§'Ò›šo +?ñQÿþ‰1OÜÏÿR¿Jx^YM«E¬E0(&´?!BPTLTŇèº{0ñÿÿ»˜[tMÍé¹Oô&wººNªÓsožh}}Þ×}ýÔ×Ï}ýÖ×Ú×}½wùl¹|Æ¥¯û}½Ú×k}½Þ׃¾^ö¼Ù×[}½‹mÿlç|Ô×'}}†íÌg}}Ù×W}}qŽxü‚Á…gòá&&±œ'÷®—=þŸñ:XŸ!ob¿ƒ³öˆë Ìù GZœÕ®šgXÔ•0øÌ°ÈëÛ¾¾Ç†÷#ö˜Ò®ê•zëXÉ)ë’FäÓ°íý£§¬í»¾žcÏÇû‘\ˆé5¶¾>Ä›üžbèÇs¼ßª5±É·Òν—u»ïîaè ¼ÇØ{„xŸbã8ëíŠ}nÄOZfͬõ žÌ‡×ì=®ú${Ý©gj™þ‘Ä$OeÌëð3ݳԈg€ãùÒJõyfæažÓ°aŠWòæ¾Jõ°¡Ö%µ§Gœã‚ú,÷JæEž¡&ïãèÅ3\ÕÊg]£¬M¹>›?™£Ôí¦¯_±Ízˆïü…ãR†*î•çÉïmŒÜÏ´Q_Ü+™ýÙ™UÏ¥ Ïþ™ïoq«aú6׉ãû=Ÿé‡*› æŠsŸeîˆÉÌåeß8Wx‡T礦äÉgäó̤ÉóåÞËÌëÜìcêæži8ÎNÏð]r«ZxFr'ž{|Áãw ñäûOöŸ{ô¹×ReÓ35{b6WsEmäka9ïÔ˜XÞ?÷²xè|>?ë·{¹¡ž3ÞƒŠGÕoŸe³w ö[zUZ%nò–‡|$w÷é‚;û  6ó§ÞzÞ¼·Â­ø’gæ:9žé[ÍŠ†}í³{ÁëUòJjÏ稉žSÿ2WÔD9õy絓®Ç#ßoª¾¥Æ®¯sSæÅ+kçóüsJdzy'o&—ÔõÛ÷0Πÿ‰M<Ö¤žpß †é3?ËûAìY~½⸎³9TùA8™Íô“öÍø¨·ª©z×7’0ÓçUŸÜƒwég}òÕühØóa¬¨ß‡ª'~yo{FŒ3r&©/ ƒïzùÈ9¹÷˜/îS/U“4RªŒ‡çò·Õ•ú¨õqÁ±éœúäw/¯Å÷‘ƒß!ÿwÖe¿Ýç Gj–©7ªI¿æûôkÃà<›õ³>V:TøÎÿš§äÛ»ðUf“|}Wšˆ3ߥ’wÎZs6«þ¼ì‘ÞÊ12ûÜ—õrÏž›Ùœ}_—ÇÞdï+ÙÏUãŠI<îõ¹)Ÿs_öÕù¤¾y¶pä½ì§ð4¼ {½5Gì9ñÏq®yM3{é—z7Û§ž¯Øk¡su^ê"}³–ì 3é¾&nòwÍg×wÅ~¦{–gZT\Ôç¡ýYSÕëÄZ±ïSÎGŸð™¿`¯ëªòà^TÜÇ©szYwÐL£Ì…ãÉÏ·³Æ† Ù¨îcáTúpŸ|§3Ò{³™Ç½«ˆ;ñ¸GÞ”—ćžç†ÏÈoÉ]žËœyÈï8•w˜ ï™Ïå†Ñïj®ß`鼓¬­ÊçŠãÝãw£R­ž¼‡…G>ÿ ÎD5·\·¼7òޝô«ü®ó”iÕþ_zá¼õ;]ÅÿZŽÔ£®üÜ0ú¢=ÒÏŠKÎêåzËëÜ“}T ÕoηÂÒg┹L/¨O•¯´çšvìÑl†d¿•]÷zÞOò–ÎPÿÏüDßW÷gö¥Ê\UßrîWç²&âð™ô_âj¾ÌðøGŽgäö Ž`ðÉïÊ»þ:J›¿/û¼?Ê`öጻÎw¯ùYøUßäi÷O5Óϲ]a/¹Ípªú+í+ŸWkü|/˜×]ayn<ÏOQß7Îï%6މ9›“ÒÀß­Î2ñ†~F…í¸=%¾ÄP½Üó/ÏÝK&x^•Y[‹E¬‡ (^/âðáB‚ŠI”AqEò"¾-ŽþÿaóSSsºg ôK¶»Î9uªN÷ì>ð¤­ÚZÚz½­7Úz»­wÛz¿­ÚzØÖÔÖ¥­OÚú´­ÏÚú ÛùŸÛú¥­ßÚú+Þk¨1?hëC¬ØVLâ}ÙÖc¬x?aÃü+î+m½Š#®çH,á|kÆXK[pÄ{+æ;Xóö#løªÿ ¬±Èã}ƒ:ó‰5fUƒÇ™päCÿˆ=vÖáœ0â ‹¹ŠÛ{ žW^Ù/ïUÅqâ‰ß;lõf¿ˆ;aÌå ±¥ƒ[ÎÄö¾Ý`¯3å-Èå¨OÂ'væìXêËÓ¶ž¡î1ÔýöÜ&ìûDÔóGn¬ç仿±ÅÈ|'ìõD~¿Ã–óŒß±ØÏÓ{ÆúÅ'qtžù0úFÚs»þÈ‹kÂ÷Î×}ž›÷ç\ŸžŸêýÇy˜®'ï{…ëõ°þÿ\ÎÿK8¾Ïæ,lr{6Ç39qlטj~¥_Åà?Æ‘n'g‹pxÆ{4Êé‚ g4Ol:ÑLrMŽÎU}u?÷øqnf±½>Ý™—4ó9öó͵3â]º¬´ÃxyG»×çl>9G½£YÕó±4‹¹?÷z özqÏñ\úLçôÎðÜ3歹ögÔ¼ á9†´ª3Ιô9]÷²ö]=¨âT~yµF½×SUÇ-Ž÷š¸rž˜ï(†óŸ½“F+í¤nÜ~çkFë~f_^`¯[çì/l|Ñâ›1ä5÷ñüÎ#–sBœÌ÷‚/±’ç—9é^ä¾;ÔÞâ{å-çâ„ãÊxä ×Óœ ½÷[Þ|ô¼Ð‹åµÜ'¦ôTÅáŸùÙu”:{çŒâøêaj¿fCÆbr#Ìô¯°è[ž¡·z\'¿>›þOÝ©ÝašÄ”gñTWâ¨_Þ{Öës7±þD¦ôîºì°Ïî;y¾š×Äsýô0˜[ö#ßUnŽ·`«Só†<%ßÏ#¯¥/±¥×¾¿e7õÚ›äçìûØÓZ¾'¥aÏû>ï¿ÓÄ¡ûÉ÷%w<Ï;©ªQšwœ¼?ÅÖ0ã˜SöUù|Œ=/îŸÒ¥ðªųkÃë[°Ï+û%¬ V¼Š'Þ ŽùT³+}ç\Ý¢ž[Âô™˜ù »7lÔ½ü[õ¼?ÇQWâH~™°žzÝ;ãØ£åzF;?|÷î:æRñ­zÓù©¾Á*=TsïìÀ7Øú[õU÷HO» ö˜ÉƒðäÍ^_‰u‡#^¥“ô­z<£ž•^ïn’gõ¾Õ;«š=~忊 é²ÂKß«wo8^¥­ÄaýÄQ9C¼Ÿ®{5?&¬ñä#î®8õ}Ôfæ“Í}kä\q¿8×9OÎ2™¾w~glØÒ÷H—Õç­ÎhNQÜ;âÖuŸÜ¦Ïzyܢ֪ߕԻÑwK寬Eü¹/ظ×Çù»Ã±'ÉQå r“Ú;óF/ÿ¼#zßw®ñJÛU/2VõæÏ¹ý¢K|x^X]«\E¬‡ (~¡¢EGñ+p1„ DY/¢H^Ä·‹“üÿá³Å©S§g÷.ÌC²Ó5ÕÕÕ=³÷€›±¾뇱õóX§±~ë·±~«õ`¬WÆzm¬7Æz{¬÷Æz8Ö'c}:VëKlxÖŸ˜8¯bÃzÞc}ˆ‰ÙÆúj¬¯Çú·Â¼Ãüïuìù«â(ÌG˜¸OÆú 5þ˜¼Çý®UÇ<ó#lg5ûž8ü\Ê›qcãùö\ÉSµZÕI<;êZ¹ [úJÖíDZžažñ .Ÿ#½‰O\¯}zÈóWœkð>&G×1kFžÊ?}ձϛ˜ÄjØâÝ—KÚGM´OùVÜWž%yV= íþÂ^“Ä#ï¬S•÷-jnï`ÓtUs÷¿¸VõNm3ž! t–û7Ï»Ögóãµ”O”×}|¢~¡Ÿ«óªY”5uÿ0å lõËJ;åô|¬ÿp¿>XååõÒy<çÅù{þÿ]å¤Ú´ó^ÕÄsP]”Gꔵ{_‘ŸëœÞÉœs.5lõ«r=á¨kÇ–gúÜ}]ùJ<¼Þ®;=œþõ;Èõy€‰+LÖÐsáýâ5»EÍÁÏ÷³¥Å}¼Ö±Ÿ+òSÃqþùÞU¤®âô î?;^âzý/õðjftL\×Q|+ÍÐöï°iA,ñb|ãû+ïÉ¿ÔFµ?aÆË+©¹ó¦ÆîÆVºV8>ûsN6Ô¾ÒûϹæyœaGþÒ^3LM‹UéÙÊ×|˜9¬¼’ç8g÷ájîVæJÕÃ{»õê9LþO±ÎAzeÝ«wTêÅsT Í‘Žï â;6ýóÝ9Ž1Ü_i©{Fo¨F«s;Ž>Rí5 É¿Š%çê>uðY ÒŠSL;ïå>晘9cäá*Æ=¬ýÕ,—Ÿ¤}ÅŸû³öÉ©Ù~ïÔNš¹g…Õ°_i–\TϳšŸŒç~ÏKù S~P-ä#ö‡çÒ-Æõ éáÞÉØ»UÏò}#->ÇQÓUvìûÂë¿zÛix/gdUûüû9{νy /}¤È9PyI<;Ž3xy·ßàúÛÙëSÍUï éGŽùžMŽž»crîÓï0婿ŽK¾•šËy‡åû cÆŠ‹4ÒwÔ‚zòÿò¬œäN|÷U¥qåÕ<–p*/ISá4½Ä¹@¬g¸Ì-ët‰ŸîÐkxÙ;ÉQ½sÉëŽWqËþVÞþªðÒ¿ô#ûg•kÖ„9Û®½ «¼o±aó“þsM5ãWHWâ>ÇÞƒ©¥¿eª¿‹©NÞó'õÐïﬓxzîŽC Ͷ—Øî ×’Xʵêµê}âµeg¶ê*m²ŽŠÓɹºªã]ϪöîÏêw@zžy(bÝX }âÞãý'¾îƒÕ›Pçä\’ÖòDú‹òÍALjÐqôkê!=ÅQ>ÍûéÚ¼Oï[qÔÝ,®Ð<ªrYiÊ|^`ÎEï¿»<ùžþ\Ýûãø·¯òTù]Óp¬«z!{ؽ”úeª™BŒœ>¯VýïÜ.éz‡ºgWu&¶cVù®<˜p_+ÿŠç-&Þ¿Øsõ^ñùÚ°÷U5û;Ž}'×Oy*.Ïf>ú-ê:{h¿fˆ<š=#?æ•^ ûz_ª³ôû{|yÚ{==‘wcriØ´–ßèaj¾z'Uþð:xM¥—ò佦YágÛqÓÏÄÔßÈ6Þªur–O|>8¿ô¯4·¬¯ë*^oaÃk8rr=—ê*Ϥ†Äã¼Ïé½QÕ¦ªßA û<Õ[«Ë:ÿvÉHwx^•XK‹&EŒƒ(Š«¢âD QWAAwñI£8È‚xoƒíüÿamPQÑY=ã@žæ«¨ÈÈÈÌî~`ïñB—z¼ÜãÕoôx»Ç»=Þëñ~Ö㣟ôø´Çg=¾ìñUo{üØã§[Ÿ{üÒãWøÏã¸ãEw$~ÃÀ&±üüÆyñ$Æ[8pÃù­xÝôx†Á/sçü…-Ü 3&ñˆEžÄz#ÏÖãcqà|ËõK¼½Çs¸É³ÒPù?E¿ðRSÇuLñ.käØÄÜ1çþ:,éØ0ø¹w*wÌù>¹6ñåwøv•wê©zïk̘U­*ÜŠ«tdí+LyÉû抧jDÜÏ1|Ua;_¿ƒý¤z¥ot†ÞQ~ükÄ3~ÇÍgv̺¨oyÞuQÄZÕîq–ÒÉ…gïó|jJõ憹6;ήq>Àœ›xmX¿a®…c‡9噜 ÊÉûƒºêÞÕ¼Ú1Î{«äÙÿã©ì߆Q«œj<æé5SOy~Ž¡óҶꡬ5ùp.W;m¥™0Ó;ò±f¼f‡{²ÒJù¹^ôT5?äsõú•~ª¯×µá<‹ÄQ}ï8ÿ`Ößsæùìžq?ËWy·ÏWù*÷ÕÕ,q­ªy(ä5ß9©“ׂ¸Ò¿šQÒ]xÉyå»ôŠÏ†ä·ÊßySZ’“|{å3Õƒ¹U\\7÷ņÚ_üÓÎg~ óïCÖîÌ^w}\÷‡x]óÐïÈçâ\ùlGݓαâ'Ý’§cû¬&5&gm>ìrÝqÎU;C¼œòeWçÈ#µâù•¿s¾KO}䩪~Âq>ù ÊóÕYéúÎ÷}Vñ¹Ò8÷rê%\÷‚|¸©ñò™ÖuWo¨gÀŠp\oÖ¿šë·˜½žõS>ôŽfgʼn|„å8Õžýg/¬ru­ª^ä»UÕ‡Òþ)®Ÿ³¾•^“ô®óÔÜq~še鑆¡ú¼â˜Ü2ÿÜ%©«ïÓ 5®ðèEö¿0ɹaøY<ÓC9VWû1ÆŒ"g¯Ù}~¨|–;>sP/$öŸ˜çrz—xz–«<»£®•soªVäUá’›úëçgþÔ:9Sãê>¯eÕœ§;ê|ÜsÂwìpÎ#{®âïå ΠꙜ>kZ«öžxQ×ô¯z"{Ló°ê¯Ìó¾Z5Œ¹H-ɵz÷%¹å^”þêOÕíêÞ†ù¬zĽø j?®z±ê{ïÉ|®<É{9·«;¥éï˜ë¯;sƒgyF¿kûYÿßQëÄý"űšÎ#ßÛr‡xÎîI×9±É-{$ýM<¯›r»ò¢×k57Výò<Í"Ç“¾OTæ»òÔŽ3ŽÞ ˆ•³Ý=äs}Ãy×e¾ÌUÏ7ÒõÈóâUõ’fºs©Î³o1ôr¯T}ÒpÎÏ{D}¹š=;νá~Ì{ÿ»'uÏj–S[å•uã¯aÞ}™ï]yØ©wî‡Ôæ Ë}J<žõ} ¯0Ÿ¿ã·îêåÉs«=ª{¥ s¨öfbJsÏaÇà•³à!¾y‚ó·Çv½«o*ÄåÞ#¿‡jí=§y ïY _z/ë—^&7žõ<¥×мsæºÎ®ÅŠÿŽ“x«¹èúúŒtœJƒì÷†áe÷ÀÕ÷ qäÿ«šUžXåOüô¬ð…•}rß3Ü*?iÅýÎZ_Í/é¦ïúÙ+Ù{WºkÎæûXÕ3ÌUûsÃàµcî»UŽ9xöó.OnÂôgתfßã~O¬r¿ê‰ÔsÃŒMþªy•Cro¨ïpm¸¾CžRÝT+iì:CçxF¿å¬ò¾Ô\JÏ^}sô$oÞy‹ó¾•æÄr¾Î>Ïzå\o¨g1ÝÿÖ~P¾œ¿ùì_§~Ix^•XíŠU,0(JÄ5J4(:ø Á`‚¢rQ\į<ÁÂèû?„§˜[LMM÷Ü›Àù¡;]]]]Ýçì>ðÓ8§q~ç·qîóú8osœ·Ç™Æy2Îçã|9η÷ ÖØK,ãŒóÞ8b‰ýªˆÑ÷oŒó&¶9ßÁ6/ã™÷ö8ÌýV¼Ä"Gã|<Î'Xq¿ç›qžŽójÜ«&âI\ò#îXjþ„û3,¼¿À¢sÿ÷¨s‘ÿK,ù˜'µHîÔC˜Þ댿ÁÚ‡Ž#ù=ÇÂ-yIÛ?±rs}Ïù¨âáú{nÕ¡¼®yæ’ªÇõPâPiì>‘¦Óù»J;Ï÷K¯Yc²z©óÑŒ½/…ÛõÄ1Ÿ¡ïÍïXjª2WW‡viæÕlTµUùR·K¾®rVõåÒ=Äú|NXëÓüTØ®]5ëÝ®bžÇXr°Ž£¹<âi_±7¼KåÍñ%LÍx7¯—R‹Äõy˜°j¬þéQé0£ö&5MOª_É+ûÓy-=@]ÂSmŠc_GýÉÇ÷\ú'yÉ7•ÿ…›sv¾aÏ3}ÉÄϽ$î¹£‰?cíoêXiHW}QÅõÇÞÉ9JMÔ#éLu3¥<•ÞÇÖ öót­ö3êZrf?±ä glÞ{GwÞŒýnªtÍ»$g_uw5W»°ª[y>ÂÞ×^ƒp0ÒgεÛÙäx‡­*ün¸&—î#äµ£9ë®´NÎïÒ¾®f¹Û=ÚÝ®NÌ#¯Ñö»G{§«¹ê[îíâüˆ'ëN¾«ÈÏ÷arñzSÃôPê'ßh†R;Çã?iè÷úà3É~tý•׳ÒL<'ì½wäqb¿Äªcú»«Ÿ;TÜ;Þ·X÷‰óÏ~¹§¼ŸO¾}ª¾¯„MÜÄb,ãø-ÿÛïrbT¼Ä)ß|ö^ï¼à®ëê8^g…sÄÑùù½" Ù§WÑ0sÜ Þw™+ýFýÝzÂÞÛ3¶y½®JsÖÒáÉËÄáÏ»z¤Ù5¿‡²ÿu¹]ÇªŽ ûžH'׈½¯4º‡}z÷MØö@Ø•—œ+õ!ž°\oߌcÌŒåã¼ÆXwî„UCq8a¿oXOöç¨ïê…ïðJ§ô’ã+1ûöñG3z¹oŽú{Âv®õ÷¿Ìwi÷h_è^<¡×#±«;ƒ˜Üë~WVœ{:ë=V.búÎáÏflÿþH.ªëñ9†<ãyÔË|ä¿Òž3Ûi$O/ßnô›|Âoªý”ªÿÊÏÜÝï0·ØöHýñ¾S›îmL|a»Ÿfl=ì CuU=ý÷GÔWw“ߙй;ÇäÌIΊjy•yqÝN¨yæþðœ]>æÊ;ê.ûœ9Ôïƒþ.ãgc^;Ç¥&zÿÉc¾§•{ÆÒ‡ÿ°æâwüY…—uJWßá'ÔµiÓ×ÂÕû^󩹨4ëÞÒ.ûBoW¾N=:LÝ;Ùó ®tKžœ=b¨æõå7ÌÅo|.‰íó˜^Ê<Ú1Ò8ñÄY½£Ývo¨þ¬W:&Ÿm×P\¸Wµw*U½9a[çߨýžóÇÙÖ>V|ŧ»s^ÓÖŸýô·Fî~ÇeÝGû²ÒÓqÅ“ü´kºûÈ1“ë öóÞiAÎùæPŽ;¬»3µÈûL~ôþWs/ŸÏØóÎVZWœÓ»•ÎÄw¾z§w¿ë‹õÏØó“¦ÖÚ¯½’ÓÿmUDÁx^Y˪%EŒ…(Šâø@G-/>AAŸ/¢ˆ.Ü­ÿÿVP7è8ÑYÕg‘«©ŠŒŒŒÌê{æ1€÷z|ÒãÓßõ¸ôø±ÇO=~îñK'{<ÕãéÏôx¶Ç£/õxµÇk=ÞèÑz¼ƒùAz|Þãëßbà‘ãóüÚã÷FNÏ÷\ç1r>îñ&ö|ïbäü£Õá9ˆ¿õx£b ‹Ü܉%î‰',iò"®kç]Öžº:Ÿ¬Oµ½‚kM«:ůÂ%7iø/FÕJlÞ'Þá9‘Æêå—爫ZyŽ8üwròÅa³³Âd=º#þg½ïSãô›kãº÷³_¡Æ—ß6ŒÄ–÷žwýÏW³¼ŽœÒ®÷ŠxôfÃÀzûL}Œ%ŽÔú¥Ç|†^Æž#y»ÏVžåñôJ•£Òæ–~1—çpÜ;ùˬøÕ<+dž½¿®™f§á8ãêý¦wA­Sú&ûQõ€}'wöZúT;”{Üݓ䜺 Wü«ÞVZkßW˜ÒZ'ž<.]µw‡¼Òk®ßo8ΟêL¬ô—pÙ£Š[µoX¯fº¡Ön†KÌ{\{ʱ¥#ñ«=Æžg×5y«÷+U;3çDùXvKå5æÕ“s¯=M?gO”/{ :\ß}ä§úyþÔšúμ{¸ësÄ9¯>KéÑœ!ò×Þõ÷Êy‹ËL‡ô‘<¤Þ:Ÿ jN^«¾Yöúˆ¥ý3ëÙ†škÎPåç»ÚCv/º÷²ÿÕù•wÆL§œá™çU qôTuèÍ‘ÏÝâå{†þÈ=@¬ÙlæÈY.¹j'V<½¯UŽÄ¾CÝ×3]+|iü:¾x§O.8z„8Ò aŸs÷™Ïšûß=á5T¹ØGö@ùäsÖÏ;gßP©§ú%œ†k_­°f³—=òþ¸&³o—Ä'6ù¹~<—ï¦êðùŽôï­úOþ/`ß“­ÇÛ¨ýÅÙ˜ù¡â‹6î•/°ÆNÞÄmxÄáüªvÝç]ο×îÚùn!'Gõ]¸šâŸíå˜Õ}ö·µê'fµÝgÉ1ûâܪž8¯[æJ½å}žåþÛJÜ—¹ÛÕƒ³üÒ]=Õ{;x…±â¹â(ô^¨o3üªþê›×{éžö]êuø÷©|­=N¬ÙNÕ­™h˜óÑ\ønb½Þ‹JÆcUgŸ3v¶¥e~[¬z”x9«¸ª~~{&g}ó‘ó78æ!ïj÷T³Çš½ Çw@Ö,=åÅKÜS®kRU¾ ǽ¦Üôor—6–÷.ý–~u¬Š[å[÷BÎõy ÇÚ½Úí«Ý›:¤÷ª¬cå?é+¼G¸~—ÞL‹Š[j˜o{Ùß8úgõwŒò‘cÃÞ{¯‘ÿî3¥Bfo–ò¯úÀ=·ªwÖÿ†c>驜ÕÎñ\ »g\qã¹ô†÷’\®çüì›BXªC¼ýÏo¿Wþt½Ùgõ¸Ê«zÿþ+m}®®µÕ{-¼ÙÓé×äǹq/ç¾a`Ëc+ [ï ñ|¦y_z+¥Ñê·Ò[|ç^çÿ¥xÚ7·¾sÔ,çFoOC½gÅᯇó9Ëê~É“^KN¹SÝÒo†ëuÎðf{A|S»|Ó+lXcçŒkf3N¾+ÿK¼*7ìœü~åÿÔoõ»à†Á‹zI×ê{‰¹È[»æÌãjmýMŸÍuµÓ]+åºÇÈõg¿1Ï©\^õŸ½‘ª­ò¢Ïúâû„¼…¹ú k6+®½vœë>ãUí.ï¥ë*M«þïµtÌ~_¡¦šãUÍÞâ¨Fÿ»P³”½LéÑœ{ösö Ÿ=`ŽÙ P»Ù>Ö|ÇyºNä¦{©«Ï·úô?°”I‚x^™[«]E„ûAÅKŒâE¶A…¢ˆ(Q6ŠAÉ‹¯åÿÿN1~¬Zµ{Ö9æ%™®®®®îY'y\UOÆùzœ§ã|;Îwãü<Î/ã\ÇùmœßÇùcœ¿ÆÙÆyuœ÷ÆùhœOǹŒóù8_Œó¸&ÎuÄÆ6Îëã¼9ÎÃÚc‰ƒÃOÕs ¿âßçãšñܯ×jæxÃî)WòUÎ/kæýªöÚ•;óR»ð÷ÚS5ÇëV|rŸjbˆ—ã<ªŸ¸©?gü¶:â¿5ÎÛµçîg5±»š¿¯[Ì?kâ¾RG]áÿ~ÝÖ.Üojï¡0­[\ú(ìÄM-À…¯cº¶ŠW­Äª^Å¢ÝÊS[Íjôþ¬xtu‰µ½¨‰K?VXh•}u¯w~¦§—Ú±˜c×ÿYÝÖ‹—½¯Â}·öI®òŒ°5Óÿr7€)2£âè{Fž[a #ýLÝÝÌÑŸ“Uœ'¾q|°ÕŽ ïkë¾þ·ŽøÎ=wã«wér°Rßk9Û‰Ao:?i¥®à‰ßjO¸¦7úu©c½¾#®uÄóà½ÑÎç'uäzßþ?¯žoǯ®ÞÄ­¦¦Š§·—:jG¼¼»µ«Q8ÔåZ‘:O{o»º:o€Óù–XÅøý.5\,ÿø~Ë™I¬ôû\=9ÃzYM—£»ú{a¢GêÉŽ<ãu©½ÏÌGç;´íæ/çNxø®úµÕŽ›}H\yÒçd5è¸ÕÄ®îuüWó™y»š¼žŸ^þS·»zU=v½V}Øjâ<¨}âÅ«ÝUn¯=뾋 sßñéޕƼÑwåcW¯úKο«÷š¨_xšxÝGr»?¹#¬‡uœ9ý9±Ô ¿ƒÞk¾]u—9Ö·HW›Ï„c\jç›ïƒbŸ×íÜçLuoomçå­&–÷ò¬¾C®µ®K¼ÄGúvxâ$/äï_ªq«©qÖæ;MX®¹óÃ[÷y‹ÒÇž‡ïÌ.¸+ß›÷å †»4Õ}qìæ ]gj²úÆò]ßõ¼Û¿÷¢&§Ì§ztw«ùƒG;þ93äd޽GÌ£ÇùœœÍ™Ï ÒŽï åõ¤ØôGú¢ÓÚ{é~¸Ö‘“üöé=×FoTæÈ7JßâgýÝ꼆Kõ¸¹+½ï[õÜ7ž\q×ì0§šÑÔßù«þ¦e äXñï4¹‹÷YÑ\ÜwæI¾+\aJNƒ­æ”ŠU}ò:{œÚ/Þ“ô:eŸé»G»ËëH_úÎÉZžÔÄÖ³Zë²Õ¾o¤ù¥v|ß\ëv‡nuÜY^ßê­êÞ¼œ4£>¼ \a¹ÖÄPÃjŽòZÕå>÷Ú²]}ôìZ»/û•~OaPW7gÜ÷ýܽq¹oÈ›{Ÿx_ÀØjþÐiáóž¬æºzøž£~¼ïñÛÿ±ÒL=%w^þÛ߯ïL+Ͷ×Úí·¬Ùw;(¿¡ÈáÞv_³‹.u‹ o×"9 Ë÷®÷Ayñ²¿‘?kr_eÒéáU¹»Þç ¤n>CÝ÷ Îû#So…gß%þö—ºÍážÏÿsîtRN÷ïjç3Éø;V§³à;þZ·ót¦«0ºÞtu%5ÁCzÁã?ÇGUx^­XÛŠ%EŒQW×U\EÑF¼Â ¢x_¥YqEöÍ'ÿÿ#¬ 7è¨è¬:gÀz늌ŒŒÌ¬3OüÚÎóí¼ÐÎKí¼ÜΫí¼ÞÎÃvÞnç½v–v>lçãvµóE;_·óS;k;OÚù;ÞïØñ^Äyî»8ð>ÂŽI¼/qà9Ö†3žó#^rü &y~šë v|ià1È÷MqôŒ¸>‡1žò'ßäúvÌŸqæé:‹œ\¿O±ßÕi$Þú†±T?j£˜+Ž»ŠUå ̪†Â'ö˜ã¦.÷±c/8t!ëVaI“[œ¹óÆþ%Ç™/è çêþ½”{…'®â¨œßB%œì…Ô/k⾎cŒüD}ÈÁsòžÉø>+¤³÷µ°\o×Ç}7êÇiÂ;©óxãž­tUü¿Ðë›ÞÕ^ž¯´NÏS:I“ŠïŒæˆf_Ö®âÄþþó>zŠ3GßÄg-}†|‹:âÿ†~6*†4¥Õ’é9qãlöü?@ïrüGŸ+rÌú¤—”»ûÙ5õþÈ<9“È™wÄG¾KÏmϾ­òËWsŒ|fµuí}ÇK¿Y yIuþãç|sÝıâ—ýQõ³ïù;·Üe£ü‰ÿw;ÿbÿ«´æ®`œª>Aÿ–¸”‡zÖsq¿¦§Ò³ô«zJ±Fzÿƒzä,¬Þ³Ýàe#*¦6Gj±`Ç#Fö•ûJ5óü¨i5Ék´Ã6œk$hÞ-8p¼öêý ù}/»nŽ]íHÕE^VݳÞμ5«¼—œw°“ûµÞM}ÕÔÅçêŠÚ£ÄÍÚ;ïgytäÏÔ"wµeÞ®¡î(~#}øû¢òþkÏv­¾šâìx¹c¥/gwx¥GÕ[Þ÷ úùRiKœ ç÷†ó¬f°0«wÀŠ>ÿ‘®3lq­<æúÞ ÷Dö_ê<Ó¥z¦ßWþMîÒ%gbúâµöÂà=}Ïïf:Žf¡|~iî{žŽK/ wÁŽ)½4«VìXþÞ˜qMŽ^ïÇèó¾“xž¯zòRM/÷§æjzGqü-ÂýíºŒtÖ¾PÝ3÷jr'Fò¾ô^ºÆç9«äubúÂ}ÉÚKUrЯçïWµÈ:TûLXÄIÿÍð\Ÿìaó-£Z2FþvXqÖkc6o¤EÅ?{qæOÿ TÅñ\ïÒ,ÝpÖN1{®£{‹º©Wô1¼Ÿ=†÷Û(§k¼[i–µõ†úW9Tï½kc¥Ç2–÷ÃȬciN¨'sN,èç¨÷Wò­ê*ís‡HŸuä]qeŒ§8×Õ}ã{Dõ¬ÞéþžN¬*ïœÅ×ô—Þ¦©í+{|Áï.±6Ôyäÿ0ˆ]黡çøgånJ~z› Ïóv^ÂÌ™;{‡m8c‰ãˆŸpGºqN'ßUÙCéyÞß°ÿ‘Û¨O«}™~ÒïrjøÆœYë?qè›ñ*/ÍòYÑcûï‡Äà}êy­ÝOÄS½4ƒG5óùx×®÷;èsH fø¾C<Æ‚#÷8qt_~Õý çúè·´øem\[Ö'ÿW!ÜìŸY¹ÏFØêÕóóÙ=Ú›éåä,¥‡´È9ò-¹kor><Æ™{å‰Ì!ñÅÛõõņKó1²ß/Õ@ú¸ß¢Ÿãä-ÎâK,i‘óˆúÞ5w×öڞμƒ5¬rg é6Ârœê E¾ì9ç7Ó.sO¿z?°Ïª~ ö j¾Cs­ÚµÙÿ§ÞÞ7©»{š¹åœÅšÕ"c¨¶ŒQ½±þ±zEìx^•X]«]5œ‡bQ¬ŠŠXtSü b©biå TDÑ냯cÿÿ0Ãfس'+9UȃÞÉZ³f&9>ð[_­¯;}½Ò×ݾ^ïë;Þé냾î÷µõõi_Ÿ÷õU_ûú¦¯oûú¡¯g}]úú©¯ŸûzŽûUœ±?D½ÂšÕH¬ ;Îg8°X㬾?°c¾À¹Æ×°ãßÃ~ƬNb?FÝpÔš}¿‡óKÔ8¿âÜ»×—<~Œ‘â²Ö¯qÌëvNž >SçùYªû}|ëLñÁ3V¸ #¿Ä%¦ó‘õ~9&ù!/âã]ìx₵‹8Üÿ2}æl4kap¿æ2›qjÒgA¬ªÕC=Îp³6qÏÚž¢Æe­ £~ïì˜0j¼Â¼ÁŽ©Ó3š«keCÍ…49›±¹Ÿç¿;7éiiå…*·òÌäßû’ÆV3&þ,tFæâJ7îÕx™‹âbÃy¦î%b4ŒÚÈüw>‰3ó£ó·ÒëòÙ°?Þ)×0‰õ6æ^ð¼“_/˜ãe¿žkF/¸fÒcÂU_<_<Ýb­[jªºkgþãYbÔjÅwÅ“8’¦Vóüós\³:#ýÆsÒg/PãyÝŽëZÑ,x/÷GÔuÿŽ:£üÖ]áú!vz$g<˿˪ šé'}#nå_îuÏë[ÕÁó勼Ÿ7Ì羪‡šý×ýœó¯¼øósˆÇ}êÑ9ÐaÕ“Îa/+7캛éa6;žñæ÷¡ëB¸Ä‘®*ýóÛÌëäP}1Wsj8´ ¼ê™}ð~ºÆ™<äZ›q¶á\·ëlv6Œ³à¬7ÔÈ}Ü“z”>\«7߬—Ìb]óIÃÈr"<GV¹E-5œóuÃŽ¡¹e_UvÌæ£ž4ÿï°çèµþøÏÔ: þ†c^œûŠ3ùe¥}õ¨=·Ïwͼ…‡÷hb±&é‘^òÚª°¶ªÏä33"çsÁˆÛp®]˜žeÌÊ•_\k3Ÿ§g½’׆ƒ[ÏtõèuU÷¢÷¥¼–¸5¨ÖÀóuîËðœ~¬Þ,¬ÅsX^p$î†ÃWÙ[Îí/ì¸Äâ=K ÖÄÞô-ÿ^iS|zhöìc6;翪)5븳¬u¾kr´áà7÷ò{Ëoøwþwb(Òÿž]âßivžÊ¿Ó²·ÔUÕcÃÙß¾}ÍòEû’ge ß✽ÌôžØ™ƒìÓyO/Wû¹oU›4¾âJ]qæ5Rúÿ¶â‹ßè|Íó?HÊx^X[‹E¬‡ D¼Ä F‰˜!DQPEE2²ˆ/û"yraüÿÂ.æ+¦¦æœù6Ð’îê:UuNÏîcŸõåX¿5õçX/Çz5Ö2Öc=ë­±Þëñ>½œ{ŽõìWc}=ÖwXqþÀ믱þ문ÂÞ„O<Ç}~ÿÛ—ý_΃Î}#—ïÇú='òYp¼Cu>Æy­ÄÿµvžcMØj%ÆÏ8bP¯¬û¬ç?dž!NÄI çA¬ª¶ {ý¾Áƫ“ î§W‡# Ö¤=¯/ÿ&?[\Å“ºËÛ6qÓOr©ö=°½º‹Ùªê.º3k¹ÃÊýMlx©É„½ÖÌ‘ëýãX¿âÈUwdÏt˜žûÇžæñ”FäIœÌ’ÎQ'¯íìëc&ŸbŸKõI×ÌÒ‚ÍÇ—ïòƒ9QÍ™ïGjØÕ®ìÞâxo•µÄ÷^χ{ùÿü?áføìòþeÈ[þWz)Ûé]öß„:gš,è=𜠯šYÂQ¿IÇûG§÷u¥A••GØæcfƒº&&q²Fϱüö^Ì>öìƒÄȾԛqV×™Êÿ„½^¬í[ìs_q^°ê晩zI¸âK|bw˜äêž’'ñˆ¡¼y™….[Ù®Q—}ö•°„ãózF­wæ)}õ¼:WâW3;ñãGØ¿aÂð\äyiF^>Ÿœ ýÒœ­j”æÜŸ¾džÏ²ìÙà}™¹*×9_\cùvm¾{™÷ìͬ™ß˜¼‡˜Âp}ÅCþVuê¾*?]=9 &ìkP^:Ÿ\×dŠãoÏuÙõœœõ·óIïÈIÊX•yî½Ãžïwîy¯¿Õ®…ëš3PýSyå¸Wÿá˜õª—„'ßÓ§[ì¿;ï«,{ß3[Òá'g·ß{ƒZ›ô›½ä}4¡ö]÷*K3úž­îâ{«¹xvŸßUÝsv±©<¡^Âɬæ¼to«YRå„/Xÿ#{1qò<ï÷lQŸk3ôš.ÔÁû?¹s—dzž©üQÞ+m=ÝÌaþßDZ§žaï¡øû[ç8Ù?6Îä«ù_õçr9Ç3žuî}qÙ?Ûþª§¤ò­9œ\Tø¸†3Žó'õRïhF(ÊyÕ›òØý­´r­5gù½^ñ;ÓA$v5CªÜ÷_ì6Î|v?oŸœ»™¸ ×C3é 6LŸîY÷í–Zø›Zeáì J©A¾ÌÏgoT<ÜŸ‘ÊOÎ\ÇÊzôf¨&ùëÞvu˽;Óáû³™…k߀¬-1}6yf‡ò™çÒ_Ÿa䙙ߤŽó[Zë;fFŸQ¯õö?ÏIsiÆó Žïypozâûô{yZqÎó9£\ b<Æã™â™¬Ïç…zCµ)S®—sðLu³Í1YK÷†.ؾù*…ÏßY¥â©yYÍ6Ïó&¾rSiŸssÆÑ bÍeäæ²Áùœ¸ö]èuWœ²Öì¿«ëßü½œò£zøw÷JXä&^é¯sxýŒæÔ¾û9Õësý”bùï63ƒ÷ñtÁ>'Ê6qªsÚ6×¶ãÒeWµª7ò›•wpþå»@ŸýnV ÷¾Þ,8òžpœOÉQzߢ於X³óéð¬5 Ëq2wgù_°Ïšôò™¤ɉ8Ô(}u^ô#ëìæ\õ]”x™™ÊWÏò<ã|V “^úŒºö­#]Ïî`)—šù¾å¼ ~5O‰ç8¸ö-Džôê7Ô™v;}W¶»o©µÍ^ì²~­oÔxùLØøêgˆ.óäJLb¹çòB¼ªógœô}×Íg×2q3ŸÿuøHx^•XÛª$EŒYQ\=®â*Šö.ÞDï2(DV΋ì›Xëÿ„ô•Õ3ÔËLWdfddTõÜðR_/÷õJ_÷ûz­¯7úZúú°¯ûú´¯Ïúú¢¯Ÿú:õõk_w}5ì1´ÿa_ïôõ6,b|Õ×רp~ÁŠõG_÷°âƒû߯ŠñÖ<ÿKÛË}¿÷6¬ûgõ(—°åCÜ'Xóú+þscŒÛ¾~Çë¬ñ^Ä3ySΟ`Åý+îÏënX1˜³j^°ñOÎ~ÀXw;ïá÷üîÙù»kû¡Ú½¯Ê‹µ¶¾žc«5qo0Ç–n£Â§^…ý6lñê<¨/ cŽêû‚-'åây0õ1y»T—ô<ëï‘>‰Ï~ ?±Xÿ æ+±\ƒÂd¯«>(?×ßûØ×<Ó‰tËYs-,¨ýÃçW9SêŸý¾x^ÏV=sݨ–ìß‘&«WéKÄMžˆÍ¼¥‡æš'vUC¥;×ñ©9q3ÓÜ_˜ÇÉ~U¼¤âzÞ°â-Øëϱ¸_¹ÌêUÿ3vò–œy-ÙâUçŽ|”xþ<}[üúsŒí1åK©íä*ù_ÒjêjÁÈ¡bÐs*»Ã¼ßÊ÷Mlñë1ÆÙƨãj½6Ÿ×—×Xõ$5}m,“/¾\?ÄhØë•ûróQ3.?Î+1^ÅÜó2¾¼¥¡îKö=ùI¬[ìç!5¹ ÆIæL-ç=ò/7Gš:š¹K}•ß>Å6'Â~û3í6l÷¿ögC•ç̳Õ{ú“Ï×·X±+omØß‹2žß;ýzõlûùèw‰j®Æys‘'õ>qå”®…ãs‘Úó™PíòֺȜÈ÷Ì›'9V~ê§ßë=†÷Õ=³aìçy6Cª4ç½!¬Ýý@¾¢¹'ëšÍ¯4Âø|G©z(,ê1kfåQĬðÄ»z[áU³”Z¾ÔÛÔsöØã‘Ó£óµ¤G&Çî‘ï¦vN˜çOî3cÜ`CX0Æ þ7XgÞßñ² ›ßwÁºŸÜrîK^='×CrI½eÝÂLŒäNÚn˜÷S±Ý=~r¤Õ¨^[êÃëÐ>Ïkv>T:Йày#Lù¤z˜ZpÎ<·–¸rMã£Ïª^qÃç…ýd.Ú—=L­æfæžOžîÂ|Œ±ŸÂo'ŒýxŽ:wå]½{1fêçèP-œ™Œ“gpžíªC^WáWçLÖ1Ó˜û„ótmîägÁžæKœÔׯžV<ä3yþdÞ'•~f±ò¼É˜©)Þ³|.«y?ŠÏ¸ù.Ï>ïÞbU8Þ[Ý¥ìýÃó­ôãý­f-ýnÁ¾—z N|¯áö¹ ;¹Hì#ÌJGÙËÊ[Oã´¾þÅvV ?'+]æýèÿä]qN|å™zöŸ}<û˜ÚÎ|Oqj_Y°â¸Ï27ßß0æâÿÛ/ØÎ„ô¡*z6?™ËìÎzNöÚ—GÜ`ß“jÜÄcUƒû´÷Þµ¯ó–yñyÿƒ¿ËW¶{„úðèüŒòºF×âÿ¥p‰•>¢ºŽtw¤çÙ» qÅÕ¥ÿª…ï½Ñ;_ziÕóĽņ›9WÊ^ËOůråü=ëëoŒþO|ÍŸc&îÍö1'¿W«¶äJ{Èýì÷KäïÓ FNg^áÏÚ«9]0rá¾\Å þƬAç‰â¸ïÏ´@¼ì?óPlaüd<×ãL‹•vŽþÇsþÄz©gô{zòÌ×ï-×u£ßþAGix^•XÛª$EŒQ/«+^P´ÿÿVÐ'è¨è¬žõ@½ìLGFFDf×Î àÙ~žïçÅ~^éça?ïõóa?÷óU??õ³ôók?ôó‚}ÿµ~Þìçí~š=÷Y?_c{ö—ûgëçwlk?wý<‡­¾c>ÀÆãõ~Þ†ý.6^ c qóÂWoŽM\áµ~>†õ)6<öûM?ߢÆvþÄbïäèüç{Œ8ÄX±ý¹ö/aïýUìš÷}l¸7{ÿ[êÌZ?¢æ|‹óŸý\0jã>²Ÿ70ÖnØk~‚]'¯í=VÈcÕò•§ÄVOÂþǾTãÔ9Ê 5ë¸~¬õj Y#ó$ÿ]'æÉ{¨°Èû1v}œoÃÈQü„ã}gÏÌŽ|œyHÿ¾CÍ‹XÌ¡çÚg/ý‘/|žœÜëô!±ÆÙSŸ³¹SÏ>+ê•Ø {‰#Œ¿0êæX®=ù°ÇYÔk•çÌBú˜û@˜Â#ï#¿Ë略™mñ÷ÝüÿŦup-‰¥ WÏóΟã÷ÝK=“û€Ï/kð;ꋟ]î?ÏÙr_f»B9äìºWê“ûnņëÞH#q Ì„ô—ŸžY>çžr>¯g{Pz»†•æž9b¤ÿÕ»Â3$m´C+nÕwÿ¬÷™÷Ü·âã<þƨ?ñrO6ÔÞó 3³àØäªû@ÃŽ«^+×k–Ͼzfî+¬ÜÅ™7qÓ,Îò±¢Þ7Õ;ÕïO§[œóâÌ óŒï åÎç-kð^FlbªÇ¼ÇúœV™Õ<87åŒYÓ}Wª)ÏÉ™rUë1ê9aÝœ;eS¾_ËÑì=¬™¦Æ £>3]üÎëy?ÃÏ!ïÈ{ö^UÎìõn:«‘Ù¨æÁ¿+ ù=ïOõr7h^fÚ c¦MúÉ|h¿(Úƒ jìÿ“íiÕàž•þªã54?¦<$OÞ+ž™‘äI r9®Ï¦óºÅ†í¸ÂÌ=¤œU;B:ò^e®Ôól&ÜìQ|ô¼?ÙŸi3»sH#zÉÞÎæ_Z­8Ö¹VÃw8=>›Õ§ñººóWýTw~ß9ü“_Äæ»[8ÄÆä‘ï–¼/¨Oé˜u³7aé½7Ãòì.8â宿ôƒ˜¼H¿+kűOùš:çpž ŽWŒ÷˜œ‰†ãÜWwpúÈÜÌt§ÿ`××3ãü³Fr_×@ÿ”nÚw¾ç˜é­wÞ‚c†ù®y×gÓ5öL'_×ø»‡93һᨵgV¸·ç½ÂoÏñ¤QrM<Çšqs²_Ï<5¥®i¥§ru-¯Ú?ÄnØ|È;?§&¬ÉÕÌò{ëýwù=ÞåÔë Fý.·à˜ñ㌦™!bÏ2ã{Ð1…÷çù$ßîŠ];b$'Ï´ßS|®}¹`ôÆu³ZªQéKì'3åóZéK窱j–ª:ž¯ Sœ…“y;óKÙª¼ò]’¸®ÁŠZ[Õà| ÷ŒØ|·xŽée¥Á-Æ>ª 7ìóäºV¼søžÒï©ïì}%éê;.1Ô¯g—xÎ+{%®ö0qf<ø¬?C.ô6=õÍ:zïó;ÒMØü\=©ŸÌ†ô•Ìëósÿwþñ³ô-5’ožáÙî‘gÕÎÉ9›ÍÅ,»>Ã×~S­öÅ#{`Í ¶½QÕ<ÓÅñåå}5ã©MÃq×}‰ã{hÁÈ]w%eÌy ÛçpÎÊÝ‚óŒ³ó½Áˆëï€jr†*_u‡ö»ˆï£®÷L>Þ›êy/ {^ÈY;ÎsÈç2×<Ó{£â¹bŽ×0bGwåÛóÙCÅÁ÷ÄŠ:Óž¿ Ãû¨îÈÕÜ'7Ï^Ãùl Áèiþ6›5òÿ™ñ™â/LâñX݃ŗ;PzxVˆ%^ò$yx;Ô>U»®áè¹é7DßYkÅõ:®çHáx^XM‹dEŒÃ¢(®.*~àW±¨«  .²*« Šƒxñ"Þjýÿ? Þ/^¼Ìn±¡.=U‘™‘QÕ3|ºÖgk}¾Ök}¹Ö·ký°Öóµ~Zëf­_Öúu­ßÖú}­?Öšk½Xë=l8<ÿ ¶ó<ÇýÚ÷`­—Öze­×Öz¸Ök½µÖ;k½¿Ö‡k}¼ÖÀ†Çœ˜sÉ<<a¿Œ ÿUcûløGlqý{ ñ$¾ð˜'qT/ž{zF9Mì90¾øñÜÀ1nòòàYžó3ÜÏœnqä¨ïb¯¡÷ô+l=ùn­g8sõ¾zUÕ+5PkHqY§kñþÁ9c‰ ñˆÅü;ï¿×…Úìr}‚-ϯ±á{/=?j<ëÝéõ¿rîê)¾Ì«Âîùýÿá,ž7¨óâçÒ,¹ÖÆZq½ÿœ“Š‹ô,NŠ+.oc¯OÖ:ã)VåŒ3q®U5/î]^Õ!gmà8תïÏèyNÔ5~[^Öz{/G1¨×äx ·Ó«k¢òÁÌ?cTó0°×#µ@tý¹TÆ`=ÜG•{jøº·Øƒý™Ø9Ë~ÿ ì¾)-Ü`Ïó»G«Wâ¯Þ+Öƒû½®»jŽºº)~ò¸V/å–>ðçò>ö&ûâ3I<ÍJΚחòÎ\È—óì=¬4Rå0±ßI©çZˉÓÕL¹ l8ž‡ŸU|çäýË{@^ªp:-¸Æ‰Õ½Q&Îw@by­Õoާݼ—ZŸèõÕÅ!~7çÇ^v8âî9Wxâϼ\[:ÃwOž«ÞŽ·äEÌĪôYùÊ'8×èÚ;áOëO¤N8×Ǿ‹\S#}ÿä]îļ6“^wÕ¯ÂÏ løÄ“§¹.º^(ÏjFÈŸyÊÇò»æü0ްsV*/QnžKjžû:>|ËhF;>ûÂWÍÓû9OÄOÝ9ÞÄYÃ>SÊ1¹fm©[åÓÝwÌAÜtžg'¶÷v¥)iÓ½0u$ ž×œpŸ¾S˜Gz¶|±ª7kí¹øoKá¨Æ>7™ßÄyf¼Þ•6Ò «ü\ÓÂ’4sÜ/=æŒ*nõ>t©8ÝâøV¾Þ³Î‹ø©÷JGœ8ö-uMœ<ϳÇ:û|ä½í\5Ž©Ys~ész§§Ï‹£ÿƼÁyfœk…Ï·“sÏ>]škiWµâ÷óþ»Ô3c%y`—sê9sÏzìõy‚³çuw¢k‚Ÿ.¦îþÏgàÜ ÅªbLÔ¾Mõ{‚{ó`Ü#<âÈs<ÏAû²vêyöÛùÐoèÇ]ÝÔ«äTý_'çËãùýZÅa zÿŽsËŽ­¤®¤S¯9Ï œ»T³”ÚÈzòýtIYWÝ—øNôþä^'m;–ëZš«zC¼³Ž+̬…p]Sw⊳k)ïiš˜î«îŽë:çYžI>ԯϿk‚zú»¦^`ï«{£ô•o*qrÌäÐÍDu “9gÿž'1å®~Ï8Òbâû¬eO»¼½öŽÅß1”Kj-ùÒ£‰UéÌç€ZSNé%žWzqnq¬“û1¼.Ò|çwžOõÆæÀ1/ÝEù[â9Îqòήâ0FÎlzh5_ŽÍ=šaש<5gI˜]=*÷ÅKþCÆS,Ÿ§ã\ʪ:$NÅ=ýFy—ó÷=ν#¶ëMÞMA¼kZun®ÑŠqŸáì?Y¯ÄëüÌûziÆÅÙõý6Ïe☃4ªzòïôqî!oâqOõÛÀ}°ò.j7¹UõJ¿öóZW9“¿úÜÕÑï±ê­8qö^y·ógÎê…ç[õ–¹ð­›ïŒÞ",iO¹To˜ô¯gêdbŸ)öEç”÷3v5CŠ+šžífè5ŸKâ:áºÞ½ÎMæ8°c¯«¹×›œ•Û#g³Ò•׽ŸØq¯4¤>¹Gkÿ¿ŠÙIkx^¥YYËE¬‡ D<âŠÎƒ¨Ä‹E1ˆyß>\óÿ„SlŠ©©íÙD |3ÕÕÕÕ=³_nx®¯çûz©¯Wûz£¯·úz§¯Ö×û}}Ü×§}}ß×Ö×}ýÔ×Ï}ýÚ׎ñ&Žó­¯Ïûºã÷k/cr±?ÄÀ×ÞPÇà^îûæñ¾íñßÜóL_·1çò:.oãÈç]œc^åDÌgqàJ'â*?b}€÷ æÓâ9×J{Ç'65ý¢¯/ûú‡f®GÆ}ˆ#ö-ÌñûñYשahus~Œíq3æ ÎùɉÿŽœˆ¹ÊãÔ9d ×M¼‰/Ý*®;/ß—±®rQP“ïŸß0â𬼘µ%?¯í“´M.Ä\ÕËý-Œ˜ýè:®ü§}‹ÑËÞo/`ðy ×8Î+k,^~Nõ`ƒ?ã¿q¯j”š¤\cÕ(}PyJ¹(ÇIm…“þ¼ƒy5œ5aͯ¼ïz{ŽY{×Xâ<ÝpöÒŽë~ª<Ë÷pà†1*þUŒÔv…ý¹;nòÆê,yù=&nª{•ëÊGì1{³¡®W…ë}Á|…›9®<¹c>'/3&÷¯tfLî—~™}§z„ó,¡çy·¸–9˜¿ß-ªý•§\ç[žò¼rîñ\y…ÜfMRÃÌÍçîí¼æÙÃü˜S…­zz?Èo¹Ÿ¹ÿ…#žÓÏéI|è¹UÍw¬óæ{¨ñ6 ¬Ä^ÚŸ~õúòûÜkÄó«s;Ö³ÆgYÅŸ|øžªp¥ ±äiùM>æ½íµÒràþ+îÒÊù^ÕP÷qâè¾ðج97Œ³ô"Ïr?ãj.¹çäKù)=¤·À†#þßw_úF¹4Ìš©ßÔÊãó¬É¹ÉóÙä›^[½CTsõ¥c‰ƒk(<åîµ®|r õ¼‘¬GUã†Ù“Î/gµâîñÒCîÇ%–Þ@Îü+î•/æz<'ÅÓ5q,åÌ» sU§¾ê±ô¨úºÒÍç…óѼqí4/ȼܳj87bÊëÕ7Žæù•îÎI½Cîcä¶áÌ%uò»ëiüWyoùOG|sF¯ê1ž«j¹âçõUWl˜sO¥!õ×ë^C÷nÃܯé£ä”|æ|‰Ãš_åê3@;kŸÞQ<£šòŒræÏ®x®úR|”gúC:;ŸJÛJ+Çq/{ç¬jΤîò-﵊ߎ™“¿”›0òì*7rÑüÈ\Ò?Ù“Ù+ò³÷‹0ùîQNÉé!/ïAjÔ0§÷òþôûˆ|«oæÌ_˜Ì¿ºC„WaùÙqæ,üêwÚÂwΫï×YØž?Ïðç•nÉAuU\ÎIÿ½*GÖ†ø`Ô'=çºûÛzùÅ'59ñ¬úg²n/ãü^¯ª·\GaKÃqÞ½éû¥«ëɸzï7Œø|s¬<žs,1óåù\aU}’ïÀ|«m8cq–‘ñ4Voaaé;fÃ<Ãv ,÷â¿T»GÒx^•YëŠ^E¬bP4†D¼‘1x1ˆF¢Q!¾€0æýÂ)NŠ©¯NÏùvó'{¦¦ººº{f÷€÷Çúp¬Æjc}:Ögc}>Ö—c}=Ö·c}7ÖÓ±~kë·±~ëϱÞëͱÞëþXïŒõ;îc\bó+ì˜Äû;æ/ØqÅŽMÜ>Öë˜øÂm¸äù&.y>ÃäI¦OÄQ9ñ:uopsö±Š;ó¶ªìgÕ9ÄOOùl«0;Ö¼ÅÙuIÌÔ:{Öj^Tš‹óŠ+q+5My-eÜ/qî‡6Ö'8êÉysÖcÿÂŒ?5%~åÎv÷yóy!ÏèXç=a•·³º«rÕ°ï_í;ããçk¯ö¨?æÎÏ«cHïm«Ù/NŠ%±¨ñVµæ¾àþ‡˜ºVùSMS…ױςì“ĽÖײÖ75$ߪç<Áí¼ ýÈUu!×Î{cbt¬çjÖ˜û+ïDêÙ˜«^ LbU÷«ŽºO)× “Ÿ|—¼¤×ß8⹯³¯VžT®]ל7GÎÄô7HbIÏÄXq¬ü“¹—®AÇÑ7 —ž¾V»7˜XUÍxÍ™}­7wã¾MÌ^/ꕟœwuÆ~öÈŽ¯¾å7vM®a罂~ZÍki’9ÓþJOíá÷º»J›•&™ËœãÒƒwÍ»æ‘8zÃQ é@ß1†ê.L¬JËœÓÊϪ¿Ó³ši³÷­bm8zKyJŽ:ãlf[±¿ºWñŒŠ¿ë©Úõ^àïð†KLŸ{·yǺ¾ÂK?ò;þSœ®Îæ}ÉûˆûÎÏ“NÚO¼GÇ}‘ÜS›JwŸg®u5+Ò#é_¿¿ý }¼¿ÊCù|ú¹?äkqõn8æïÖÞ~€º¥Ç¥1q+Mý÷jg^öš©Þº™GÕ¨ê'ÏU.‡çtu~žÍþZå‹gþƒ9y®ÿþ„¸>·*îgÕfÞÉï¬WUž^Uã^kìËŒñ9α…ù;nú¹¿•ôÐs+Ï­pr(&æÏ}s¦¿ã{Mù› }B¾©QÇ%Gy aßG>ºå?W¹J]¥‘ûP8Þ{„'¼?Vw«ª—¹.ê ÂRy¯!¯3_vÌÝéù†éæ°ÂR¬þ§æoõ¦“?å¬ë*þ*?~ŸLßÿˆ/s”^Î;zæÉ=@þwy+ûy<‹½ø¶½Ðs{í?cõÞw<¯Í ÓË}¬ÿpÔÉs+îù÷å‚g$¶s~U+ŽïØÔÅýãµ,ŸËËÜ+ =ÞJ?ÕXú,,¬Õ,¿AóŒÏýKýæ×î ë÷ÿªîä'Ÿ3įúqÇì7Ä[½©•‡UÏ!×ä§ø+s”Xë“::?r[å;{AæÝ{uñwU<³Þ3nÍë³{œßVø^ãâÛpìÄòø‰Avìû¹WóŸß¬òO®íÕwÒ`•+Åÿ;†Ç/=Å/{DÆÙqì›ÄIÝxß –úñ*çÂ\y²Ê ñü ´áˆ—õ'Œ*¦UÝæß¼5×™O×û)ÎcKlÕHÖ…z熃4ÿäÓäá³Oûÿô*EÌx^Y˪%EŒÅ (>†Q| h >ÁQtðI£8ˆ›q!îÖüÿOXAß £¢³úz¡63U‘‘‘‘YuÎÙü:Öocý>ÖŸcõ±^륱^ë±Þëý±>«õñX_ŒõõXßõ3Ö8/Žõ2v¬×±ã½5ÖÛ8pvÌOÆút¬Ï±ã5Ö“±~ÀcÃã_ÌqÄYqòŒöÏ;˜óP îåžGØ1œyùÞín?±o˜y(çW±ÎûØÊ›93Æ·c}#Nê«^Ÿ†³ŽÄR^<Û1×WܪzCú$qp žý{|ÅþëÌÙSiý&ŽÜ²o”›{VØOqøH¤®4_ùç›çý÷ßîöVõV¯2¶´äÙªÏ`­Cú†üǹ?ÃQ[ïŸk ;óaU³R:T¾ó¼Tky.½¦äù¨7½~®£ö†r¸êsam8óèø÷]Ñ›øqÖ¯p+®Þ£ÎµÒ,½œøµÇˆ[Í“ªç;vŸ§âx¥«÷3ù>ÆÜ æX`'Mr~ð¯òºÏÇH+ÝÕœ¼ªg›rl˜ûqUWæ°ÒÞñªù$ªO½¿’sÇ1‡Ý—š^¯õ}¾Þgª{õþvÃÙónÇŽC Õƒ{TÛŒ#¹fO9­ü¤â~QŸúíÿ—ô:ß2äá=ã1=ÇÔÊgzÃÌŸõH=Ü—Î_XUïº]sùa¥ÏTý í²ÇÉã¾¾î8c‘KÃŽ‘~¬øxºãæ>¯z'{^˜émרï‹ÊsŒ¥ðö8UÝV3ŠX¬ùªö®{ðι»W=(_¸©kÎ(ñÌ9.m+ŸK¿ä¥>I¿ç3Ìw×Ê/É­ÊU9ÞwÞµ{ óg¿üÌ+^fj¦™ë9çŒbÎÙ›Éó†õìó¼«ÙQé)?¥ïŸâìýÊWò@ÖÎñ™Ïênb>3~5ˉKÞ†¸ªÈWwÏës 1ª¹Çóg]•_ÖH=¢óõl¨j" ŸÅÞsÊ+ý“3§ª³æLö°p*^ ³GVžö7CΨ÷p®ýÕ[ŸXÒyf~ù=IæÊ~‡¬¼% é‹«úä›´¡žW}ÙQkäÞó>Tý=Ö­zSÿŠòf yk¥8Wx gŸÊšf¼Žº²† ³‰M¾üÎD÷䆚·{&uH ªºç/ß®ü×pàéþѬLN<Ÿ^UžÕÝEv¹¸^ÙÛy)öŠ71r&KÄPŸÇÊWÌCZj¾äáµIOUŸ©“—ÞH©“ú7}•x>_³·è­œýηòíʳþ^J-³WSƒä*Lïý 3žpbæäÚ=ÁY7õåjn¬¾‡P?J·ÕÛXün8÷dúQuj˜ç ü˜˜ëyêù§Ÿuï{ ¹·ªs“—7Ì}ùó}ËÏŽ%×ÙŽ¹î•ßýî¯æBΔ*Ÿô8s¹Âq-f=T[žÑþ8êɘò+crö±•¯×‡^ªú¤c~£Ñ‹>¯\›û|¬3òƒ´¨ætú“=Ù0×&g…ôÌœ…µê'¯5uð;ÍkÃý®ÿç+3ÿ>1ßî³ÊçÎuS½\ÃÜGÄ÷ºêß+~ÒåjNWoVÅtß*Ï|oJß«y‡x_^}Çâ½¹z?éÎì8pé'÷ßቛ˜Ž§Þ«îªÖÉ[sM¿=m8ß Ä¶ê“ïqÍÚˆ'ÿ<÷GØ9:ëRq †sXݹä¡§žNœŽú· é•o)饯ðt>ùh?÷Þpíû|ó4œëUé›ý–ø~¯úïWÉ•1¼O7œg™pÿVÂH²x^íWËŠÃ(Êú@ÅŠ6âDQPViñ²= ­ÿÿfPTLtuÏ®ç*ÈÓNFEFFfõEÄŒÛw3îg<È2g<Íx‘ñ:ã]ƧŒÏcÆ—Œ¯ß2v?2¦Œ‹Gw¢bëI¼gÏ£`y'sîùŒ Qò¯I.~‡;ðüýÒür×»†9GïC /£Üù& Þû5ÿ¹(<®FÁ¢jAÎÐàûü{ðaÍ—ç¼ëQ¹)'êù6Ú¦¨x¬‘˜ÀÛªš²WÀÿñ1Ú÷°VjM|úà^,y˜Ž\;Õ„ØÎ›˜è¼ÕÂV®ÀU]\jAoQb:žúXÊO}ïüÈMy!yÈá}øôð{Ô³Èá]ô%°͹®¥ûK9Ó®¡öGkEŽz÷£ÆãXbx”“ú¥µ;ˆ»¶;”ŸckÝ3[½¥WtGP+ç¨ûáU¬ûܽ£±«´z‡Î'xs&ÝGÞoö‰<™O O½¥{âVT¢æs¶¼¬š‡þÔ|Þ>ª.Sl÷Žº¨Ô|ÞÇRo÷D«—Cì룘|¯Æ¨˜?£j žì™úŠú¶üäs¬Ôà3ÈÞþ‰~úé§Ÿ~úé§Ÿ~úé§Ÿ~¶Î?"ÔÄ5x^-Ùux×Õð/-u ñZצ‘.5ºCr°*Œ5BéÁ®Ähé )Á!0ÆE¤¥J+péæ:á~|ÿøü·óœó}Ïû¾çý= ‚ ÈI^> ]ÄÖ²ƒ®’&M¼IYšA1Ìfû¹ÀSr¦ ‚7(FušÒýo#™Ç"¾c;§yD®tAŸâÔ¤íˆf< ,c3‰ìåwÉ’>^§ •hF;¢™Äb¶qŒ¤Ë¯òe¨K8]ÁD¾`%»9Á9®ñ€lƒàŠR™0:Íx¾d5[8À‘J¶LAð¨H#:ò1ý‰á æ°–üÈ“ñ1æ_” 5hN7†Ï×$‘Â2e‚×(HyšÑ1Lã+²Š-ìãOÉE¼ÈO9êÓžÄ2›U$sš›¤ÏoB}:3„ Ìa ;ÙÃynóÜÙ‚ !Ôå#zòoæ°žÿp„;¤Ë9x—²Ô¢‘ e,sÙÀ.Žs—4ÿ‚RŒJ´¢ #ù’ù¬çGR¸K†ö¡2-éÁP¦±„mâ2ɤÐÞ¥ gc˜Ã:~âWî’%W¼LQªÑ’Hbˆg%«Hä'Nq'dÎo‘—âÔ¤1]Ì&±„Ds•Çü4/Ú›‚T¡!ù”©Lg›8Ä5ž“3O¦<µiM/b˜Íjör+<á/É*ЈVô!–ñ,`)_³™Ÿ¸ÂS²ÿÓ7RšÆtc8ñ,à;~äîòœo oSš4'’¡Ä³Š#…³Ü!c~9E)êÒÁLa [9Âî’¡@¼H~ÊS“vô#†Ö±—³Ü$cA½—‚T¤1]NËÙÈn~à8×xNžBÎF]ÚIâH` ?r’›<#Oa¹AeêÓ–HFÏ26³‹“\å99Šˆ!©N+º2˜q|Åjvs’‹ÜàYß7_BcÂèD41Œg ›ÙÇ9J΢AÊÔ¦9]éI,ÓYF"ÉâÉU,ŠJsº0œV“Ä R¸EPÜý‘ЖNŒdsù†]á"÷ÉTÂlHaªÐ–hb™Éb¶‘D HWR~QˆJÔ¢3€ñÌg+G8Í]Ò– ‚w(KujÒ€OÂçÌa Iå*7Iå¥ÒòªÒ„Žôfø’Mä$¿ó'¹Êˆ!4¤éËh¾d9›9Èï¤++ï(DijÒŠn a:sYÁöq‰T2–Só£ MéÆgÄ1Ÿíœàµ¼5¼MA*Ò˜ôd8ñ¬&™SÜ%/S˜PZA±|Åb9ÄE‚9ŸÒÔ£#ƒÉt–ó=‡ù'd±%©KQ bÊR›D2”É,%‘C\åÒ×ÕyŸPÚÑQÌd-{Há6÷ÉTO\y—bÔ -ô#ŽV‘Èa®‘®¾u¼G)êÑœOÆ4¾!™ã¤pì |ÕhIÝÁ4–±ƒÃ\âiêK”¦2Mø˜Œå+V“ÌQÎsGähä ¡!]ÂD¾bkIæWî‘­±3R‘&t¢/ã˜Å&r™<%GµGêFú3™¥lã÷ÈÚÔ»GiÒœp1•Ùlbû¹À=²}(—©F{¢H³XÏ6ŽqžÇ¤mfÞ¤µøöôe‹ÙÎ1n“©¹÷м”£& #’^Œb*óYÊ’9ÉMÒ´0ŸQ˜PZÑ…^ôe4ñ¬d;Gù§älioªÐ˜öô`“ù’lã(ÿåOr´’“¼I *S—ôcñ¬`ǸNÐZ­S€2„ÒˆÎôf,sYÇnRø/iÂà5ŠP–tg8ñ,c;ǹJš6òŸ×)F%šÒ‰>Ä0ƒ•$r ülmÕ6ŨI½Â4f³‘8Çž‘;\,)C}ÚÓ‹âYA2G¹Æs^ŒðVR‹D1Žy¬e§¹Ácr¶3Bu>¤+C™ÂbÙÇY‘»½xBmÂèÉh¦³‚uüÀIns‡LìG~ÊÒ€pú3%l`+G9Ï2ttǼCYêÉ@&2“eì`7g¸Oú¬¡E©I¢Å<¶r‚[düØýR’:´¦ØÎJ’Há>é?q.JR“p¢™ÀÖ³—3Ü"m'uEQjÓŽ.ô$–é¬á'Îs‘ ³=(LyêÑÞLd‰ì`?sƒ‡d‹ôŽQ‚J´¡?1|A_³“\ã.é»ÈW P…†tfSXÎŽsT²tõ÷T¦)øŒQÄ‘Àrvr€Kös…´ÑÎÉ˼A~ÊS›6D1‚6’ÄI~ãA{óåhJgF25ìdçxHúrž|„Иpz2”ÉÌe[8ÄnòœìíGUhM3™,b+ǸÊ3² ²Ž’„F{úÇ<¶qˆóÜ'í§bó·"Ô Q b,sÙÀ^Îr‹à3ç$Å©M8]‰e+ÙÅI.’JžÁî‘J´¤Ÿ3›•ìà87I?D¥•©EÑÄ2‹MüÄ%n’q¨ØS”j|DoÆ0Ålá(×È4L_§Òƒa$°‚dÎrƒ`¸óSˆˆb$3YO'¸IúfÊPžÆD0€±Ìa#G¸Aº‘æŠRƒ0z2–9¬'™#üN*¹bôsŠQ‡Žôg4 ¬"‰œåÙFéå„ЄÎô!Ž…,e;Ç9Ï}²ŽöÛ€âT¥9]èOóYÅ~åébÅ‹w(O#ZÉP&3ƒÕlãçyHú‹E¨DcÚÍXf±ŠíìåIÞ—Ô"‚®Œd&sYÍ·ìç É!”V|DƲˆDŽqƒ§d‹×Ó)E(-éÂ`Æ0‹õ$s‚ëüIºér‘w¡QŒfë8Â%þTD0x^íÕûwÏuÀñ÷œb«TB÷ë!GI™ 5§Ô1gèµQÇåÔ\Ž24§'vBÑ1´²¡\›fÌ=ÙÜbŽ\ʽ¹¤ •R-JêñCÿDç|žç<~üœïù¾ß¯Ïëóׇ!ÔBcÚ‘ÊÆ‘Í"J8À ª¸Äµ9!4à1ºò2CÎT øœÍ§Š¿‰É ázî£5]èÃf°œ Nð3WÍ¡My‚gI#L²˜Å<Ö±‰#ü@™!ÜJcéJ_†3‘¼N YÏ.r¸¹!Ô§ OÒ‰^ cù¬ Œ}œåOêÌó;cg¨Qd—Ñ'™Ä¦’Ïj*ØÍqª‰[ê^iEºó™d1—%”ó5UüÅMËì'éÆ@2É¥˜-ìå;.Sì>¸‡x’éA:o3“U|A%¿Rk¹¹¡%y‘Œa2sYË.*ùØ!ÜÉ£´§'CGKYÅvös’jbW†p-èHéŒa Yɾâ{®Z垈§=½È(²™O1[8Ä9γ:„Ûx˜ŽôeSYÀr¶QI5±kìhâiO/óïËÊØÉ).Ps­=AsÚОçÂ[Le‹)a3ßð#1Ÿy–ûiEgz3‘LaÅlà+ÎPc¹ç¥/ñ&ÓX@!å|I%¿Pãsï9 I ™>d0‰\Š)ãç¨UbvIà)º0€‘¼Ë,f³–=Tq…:ëí!ÚÒ•> &“l>¡”}œæêlp4'‰çèÏÆ‘E¬£‚cœ¢ŠPê»É4â1ž%ÑL&elfßs…ú MI¢+ýË|J){8Èi.S»Ìs´¤3i åm²)`;¨äWâÊ) $Ó“t2ÏG,a9ÇOÔÜäMSÚ’B:ãɧRvs–ˆÛì¿Ñ˜DRÊ;Ìd>+ˆŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠúö/÷`x^íÁA 0±{£s^°Ž%m_µð±¿töx^]ÙÓ†Ð4v[m›mÛ¶m7¶mÛ¶mÛvîdîK»ÎËÞëöœX>Àÿ/p€þå_þëø'þ‚¿âoø;~ƒßâwø=þ€?âOø3¾ƒïâ{ø>~€âGø1~‚Ÿâgø9~_âWø5Þƒ÷â}x?>€âCø0>‚âcø8>OâSø4>ƒÏâsø<¾€/âKø2¾‚¯âkø:¾oâ[ø6î‹ûáþxˆáÁxЇááx‰GáÑx þÅãðx<OÄ“ðd<OÅÓðt<Ïijðl<ÏÅóð|¼/Ä‹ðb¼/ÅËðr¼¯Ä«ðj¼¯Åëðz¼oÄ›ðf¼oÅÛðv¼ïÄ»ðnüˆáÀ8Šƒáà8‰CáÐ8 ‹Ãá?qxGÄ‘pdGÅÑptÇıplÇÅñp|üN€âD81N‚“âd89NSâT85NƒÓât8=΀3âL83΂³âl8;Îsâ\87΃óâ|8?.€ âB¸0þÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Áü¯â@80‚ƒâ`88CâP84ƒÃâpøOGÀq$GÁQq4ÇÀ1q,ÇÁqq<ÿ…à„8NŒ“à¤8NŽSà”8NÓà´8N3àŒ8ÎŒ³à¬8ÎŽsàœ8Îóà¼8Î à‚¸.ŒÿÆEpQ\ Ç%pI\ —ÆepY\—ÇpE\ WÆUpU\ WÇ5pM\ ׯup]\×Ç pCÜ7ÆMpSÜ 7Ç-pKÜ ·Æmp[Ü·ÇpGÜ wÆ]pWÜ wÇ=pOÜ ÷Æ}p_Ü÷Çð@<ÆCðP< Ç#ðH< Æcð?x,‡Çã x"ž„'ã)x*ž†§ãx&ž…gã9x.ž‡çãx!^„ã%x)^†—ãx%^…Wã5x-^‡×ã x#Þ„7ã-x+Þ†·ãx'Þ…wã=x/Þ‡÷ãø >„ã#ø(>†ãø$>…Oã3ø,>‡Ïã ø"¾„/ã+ø*¾†¯ãø&¾…oã;ø.¾‡ïãø!~„ã'ø)~†Ÿãø%~…_ã7ø-~‡ßãø#þ„?ã/ø+þ†¿ãø'þ…¸ÿü×q ÁAq0‡À!q(‡Áaq8ü'þÿöïþoGÄ‘pdGÅÑptÇıplÇÅñp|üN€âD81N‚“âd89NSâT85NƒÓât8=΀3âL83΂³âl8;Îsâ\87΃óâ|8?.€ âB¸0þÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Á}q?ÜÀñ <ÁCñ0<À#ñ(<Áÿà±x'à‰xžŒ§à©xžŽgà™xžçà¹xžà…x^Œ—à¥x^ŽWà•x^×àµx^7àxÞŒ·à­xÞŽwàxÞ÷à½xÞàƒø>Œà£ø>ŽOà“ø>Ïà³ø>/à‹ø¾Œ¯à«ø¾Žoà›ø¾ïà»ø¾à‡ø~ŒŸà§ø~Ž_à—ø~ßà·ø~?àøþŒ¿à¯øþŽàŸøþ=øÿí?p@ÆApP Ç!pH ‡ÆapXÿ‰Ãã8"Ž„#ã(8*ކ£ã8&Ž…cã88.އãã¿pœ'‰qœ'ÃÉq œ§Â©qœ§Ãéqœg™qœgÃÙqœç¹qœçÃùq\Â…ñ߸.Š‹áâ¸.‰KáÒ¸ .‹Ëáò¸®ˆ+áʸ ®Š«á긮‰káÚ¸®‹ëáú¸nˆáƸ nŠ›áæ¸n‰[áÖ¸ n‹Ûáö¸îˆ;áθ áî¸î‰{áÞ¸î‹ûáþxˆáÁxЇááx‰GáÑx þÅãðx<OÄ“ðd<OÅÓðt<Ïijðl<ÏÅóð|¼/Ä‹ðb¼/ÅËðr¼¯Ä«ðj¼¯Åëðz¼oÄ›ðf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ðm|ßÅ÷ð}ü?Äðcü?ÅÏðsü¿Ä¯ðkü¿Åïð{üÄŸðgüÅßðwüÿÄ¿ðïÿÿ8xPPx^]ÚC´†ÐÛ¶mÛ¶mÛ¶m›mÒÆjcÛ6Ú¤6NÛô¿þsr’;‹™¹ÛÙÌb&j@@Àú(AcîÿJÔ¯<ϳñ4<ÏÀ3ñ8<OÀñ$<OÁSq?ÜÀñ <ÁCñ0<À#ñ(<Ácq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Á}q<'À q"œ'ÁIq2œ§À)q*œ§Áiq:œgÀq&œgÁYq6œçÀ9q.œçÁyq>œÀq!\ÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuñ¼€o=/À ñ"¼/ÁKñwø{¼ /Ç?àñ ¼¯Â«ñ¼¯Ãëñ¼oÂ?áŸñf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ð/øW|ßÁ¿áßñ]|ßÇðCü?ÆOðSü ?Ç/ðKü ÿÿįñü¿ÃïñüÂá¿ñ?ø3ò­ƒà 8ŽCà8Ãà°8#àˆ8ŽŒË×ŽŠ£áè8މcáØ8ŽûÅÿ1 HÈoÃÁq‡Â¡q‡ÃáqG‘qGÃÑq DZqÇÃñqœ'‰qœ'ÃÉq œ§Â©qœ§Ãéqœg™qœgÃÙqœç¹qœçÃùq\Â…q\ÃÅq \—Â¥q\—Ãåq\W•q\WÃÕq \×µq\×ÃõqÜ7ÂqÜ7ÃÍq Üò‹ÿ¿oó׊ƒáà8‰CáÐ8 ‹Ãáð8Žˆ#áÈ8p,_;°ÿÚÑptÇıplÇÅñp|œ'ĉpbœ'ÅÉprœ§Ä©pjœ§ÅépzœgÄ™pfœgÅÙpvœçĹpnœçÅùp~\Ä…pa\ÅÅpq\—Ä¥pi\—Ååpy\WÄ•pe\WÅÕpu\×ĵpm\×Åõp}Ü7ÄpcÜ7ÅÍpsÜ·Ä­pkÜ·Åíp{ÜwÄpgÜwÅÝpwÜ÷ĽpoÜ÷Åýp<ăð`<ÅÃðp<Ä£ðh<Åãðx<OÄ“ðd<OÅÓðt<Ïijðl<Ïýâÿ$ø·Šƒáà8‰CáÐ8 ‹Ãáð8Žˆ#áÈ8 ŽŠ£áè8މcáØ8Ž‹ãáø8NˆáÄ8 NŠ“áä8N‰SáÔ8 N‹Óáô8Έ3áÌ8 Ί³áì8ΉsáÜ8΋óáü¸.ˆ á¸.Š‹áâ¸.‰KáÒ¸ .‹Ëáò¸®ˆ+áʸ ®Š«á긮‰káÚ¸®‹ëáú¸nˆáƸ nŠ›áæ¸n‰[áÖ¸ n‹Ûáö¸îˆ;áθ áî¸î‰{áÞ¸î‹ûáþxˆáÁxЇááx‰GáÑx ‹Çáñxžˆ'áÉx žŠ§áéxž‰gáÙxž‹çáùx^ˆáÅx ^Š¿Ãßãex9þÿˆWà•x^×àµx^7àxþ ÿŒ7ã-x+Þ†·ãx'Þ…wã=x/Þ‡÷ãø >„ã#ø(>†ãø$>…Oã3ø,>‡Ïã ø"¾„/ã+ø*¾†¯ãø&¾…Á¿âÛøþ ÿŽïâ{ø>~€âGø1~‚Ÿâgø9~_âWøü'~ßà·ø~?àøþ ÿÿÁŸqàAåkÁAq0‡À!q(‡Áaq8GÀq$GÁQq4ÇÀ1q,ÇÁqq<'À q"œ'ÁIq2œ§À)q*œ§Áiq:œgÀq&œgÁYq6œçÀ9q.œçÁyq>œÀq!\ÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Á}q?ÜÀñ <ÁCñ0<À#ñ(<Ácñ8<OÀñ$<OÁSñ4<ÏÀ3ñ,<ÏÁsñ<</À ñ"¼/ÁKñwø{¼ /Ç?àñ ¼¯Â«ñ¼¯Ãëñ¼oÂ?áŸñf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ð/øW|ßÁ¿áßñ]|ßÇðCü?ÆOðSü ?Ç/ðKü ÿÿįñü¿ÃïñüÂá¿ñ?ø3| üú¹‹x^í×E°—eÀáÿ½tÃ¥;”APRQJ:•TQBIéF°Pº»»»»»»»ÛÑ•<{wßosæY93ïæ…B³„…þ)}äP(â?N‡ÓâT85Nƒ“âd89NSâ88.އãã8'ĉpbœ?‰ôºŸâgø9~_âW8Äþ0Ž#áÈ8 ŽŠ£áè8މcáØx÷íÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ðm|ßÅ÷ð}ü?ÄðcÜwÁ]q7Ü÷À=q/Ü÷Á}q?ÜÀ?ãxþÿŠÿã?ð`ü'þ ÁCñ0<À#ñ(<Ácñ8<OÀñ$<OÁSñ4<ÏÀ3ñ,<ÏÁsñ<</À ñ"¼/ÁKñ2¼¯À+ñ*¼¯Ákñ:¼oÀñ&¼oÁ[ñ6¼ïÀ;ñ.¼Ÿ ݧði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ðm|ßÅ÷ð}ü?Äðcü?ÅÏðsü¿Ä¯pˆ÷†Ãq$GÁQq4ÇÀ1q,ÇÁqq<'À8!N„ã$8)N†“ã8%N…Sã48-N‡Óã ø ü&Έ3áÌ8 ~ gÅÙpvœçĹpnœçÅùðÛ8?.€ âwp!\¿‹‹à¢ø=ü>.†‹ã¸$.…Kãpü!þ—Åãrøü).+àŠ¸®Œ?ÃUpU\ WÇ5pM\ ׯup]\×ÇŸã/pÜ7Âq܉¿Â_ãføü-nŽ[à–¸þ·Æßãpü#n‹Ûáö¸îˆ;áŸð°°×=À#ñ(<Ácñ8<OÀñ$<OÁSñ4<ÏÀ3ñ,<ÏÁsñ<</À ñ"¼/ÁKñ2¼¯À+ñ*¼¯Ákñ:¼oÀñ&¼oÁ[ñ6¼ïÀ;ñ.¼ïÁ{ñ>¼Àñ!|ÁGñ1|ŸÀ'ñ)|ŸÁgñ9|_Àñ%|_ÁWñ5|ßÀ7ñ-|ßÁwñ=|?Àñ#ü?ÁOñ3ü¿À/ñ+â†Ãq$GÁQq4ÇÀ1q,ÇÁqq<'À8!N„ã$8)N†“ã8%N…Sã48-N‡Óã ø ü&Έ3áÌ8 ~ gÅÙpvœçĹpnœçÅùðÛ8?.€ âwp!\¿‹‹à¢ø=ü>.†‹ã¸$.…Kãpü!þ—Åãrøü).+àŠ¸®Œ?ÃUpU\ WÇ5pM\ ׯup]\×ÇŸã/pÜ7Âq܉¿Â_ãføü-nŽ[à–¸þ·Æßãpü#n‹Ûáö¸îˆ;áŸpgÜwÅÝpwÜ÷ĽpoÜ÷Åýp<ÿŒâAøü+þ ÿŽÿÀƒñŸø/<ÅÃðp<Ä£ðh<Åãðx<OÄ“ðd<OÅÓðt<Ïijðl<ÏÅóð|¼/Ä‹ðb¼/ÅËðr¼¯Ä«ðj¼¯Åëðz¼oÄ›ðf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|"üßô?÷7ùoùSeurat/tests/testdata/visium_hd/binned_outputs/square_008um/0000755000176200001440000000000015063070153023752 5ustar liggesusersSeurat/tests/testdata/visium_hd/binned_outputs/square_008um/spatial/0000755000176200001440000000000015063070153025407 5ustar liggesusersSeurat/tests/testdata/visium_hd/binned_outputs/square_008um/spatial/scalefactors_json.json0000755000176200001440000000045115063070153032007 0ustar liggesusers{ "spot_diameter_fullres": 29.22254153479092, "bin_size_um": 8.0, "microns_per_pixel": 0.27376126715315274, "regist_target_img_scalef": 0.25404352, "tissue_lowres_scalef": 0.025404353, "fiducial_diameter_fullres": 1205.4298383101254, "tissue_hires_scalef": 0.25404352 }Seurat/tests/testdata/visium_hd/binned_outputs/square_008um/spatial/tissue_lowres_image.png0000755000176200001440000000254215063070153032174 0ustar liggesusers‰PNG  IHDRX.cv)IDATxœíÁ  ÷OmÀ³ršl ]>IEND®B`‚Seurat/tests/testdata/visium_hd/binned_outputs/square_008um/spatial/tissue_positions.parquet0000644000176200001440000051004315063070153032440 0ustar liggesusersPAR1€´ ´ÍL€N€Ú0ACGCCTGAC GCT-1$TACCGATCCAT ³Î šGlCCF TA!5GTTCA ,A!BrAT ,C)2GTGñT š!*G²A) ,T#%#„ B«!TGTCAG1ŒTA¬AG à14CT!!%j nšÊ!RT1J)·CC!_ô „!4GGm BG%£šGA!© ,%‹›A>„TGpCA ,ACI>CG%= Aì)AY~A£E—!– „ê!/%4Uh!Y!"™T1ÁATT ‹TUAŠðCAžT š!ÄA­A¨Aš!üm¡ XAA™u!–a/!!K BAAGa/!“ nA"A ACU÷ ,A)VA<5ΛA5B"Ì a<%5ÅÉQì!á£!Xaò!qDÅEnµÂARaÅ!º!© Báµ!ô!A eìTIi ,ņTÑ0¡åaAÌ BAdA4AAÄ ï!†A‡µ>)ö!DX!¬¨!øA˜ BA áJ/ ¡$A¦aú Ivz I ÜA¨¥á,! ázq²¥¨Aõ¦aÞx¡EA= B.Aä€ .(!W!Þ¡1¢Áá´a ` B!!KÙ=%]‘x!€a²ÁpÁÍ B¡jU!z/ e§ABa=e†ä GÕ\?åᬰçŠE XAˆü a Uh¡ãT‰‘ a+!‹!”Ùö!€!5Ja: X!Æa˜ F : ¡Nò¡ ê!oÁX}È!¥X! Æ%óô¶ „Á-%eXa‰‹ aÚÁÇ!¦!Á „e]!ÁUÖA÷Ù*AÅ ,aÁ! AAG ] ¡gA € Á“î A9`Es!£ šArp¡Ô… B!UÁÞj8 …,ß á¯5䤑ð!; ,!wa!µ"l%úáAöURÁUeß!¥1úØ‘7„ X­ˆeý¼%_á~ ,!Xa2ùa6 eU}Aq"ZÓ :%· ,ÅÜIW°% •aO-¢eëAV‘ A]eq»µÂ-­I! šAå!8a¹ !aÌAð g‡!wAñ a¼e !£".%eÌ¡;µ(a8iÞ‘æ!àö©‚ nØ\ÁÎ n!0A{A'A ôžw¤ âE E'X!Ÿ…µ   ,eÀ•aúqZº¼ …£ š…·a_AG Ü-ãAá ,̾Á!¿ n=¬!»¡t ¡úAú%#ùd!ðåx„eÉ!:[-ŒaSˆ!öA( XP!Ê*P !àaÛ—Y+!s#!Ä ,E%#!fn%µáaÜAqY!áÜ¡:áxµØaVÁš…¤"Œ Ž!`!O „AÓà%Ó,Á+ŠIׄa‰aL-€%¼Emup…ŸA" ! ò!Õò…,—¡QUìA2 ha QÖáEìaù"çʼnÏ -`¥EæAžUªoy áÛ5úE!¤!¶"4 €!³XU”!›¡¼“TAv!X–!@1`gaJ QÀ!°aL ,EÔ! ˜&„ "á¡Ex¨Éyôeìÿ¡'QÖ-%ztÆA0%Z‰~ °)!æZq²!àa†¥09¢Ç!ÝžX…ú¡lé±j€ka]"š !Á¬ñÕˆ–=0 ,^f!ÿˆ-4!½ !¼Õˆár!äa]q ,EÞ!Áò!+ ´à5ŒœAeaÝ5:O ^ Xèa!x XAÅ Aœ !sFÎa_ =eO  Ie¡q.bô.à ,AE¼ëyZ” laÏq²!œA»¢•xe¡QKu.Aù,Uh!u!£uáþ!¢a™æçáRA°)[a·AyDÅ…ý-á-’„!¤ò!‰ )B élòAD¡^1ä!²Ù Ù¡R Jqpa8aóaCa „½RAð*ª %ι-Ρ|!ËAø B!Ye°"–A_ÞŒ ,a*A’ßòa0!c®EGAìm»‰o"HÑ ÊoÁý Xá ¡Å!Haâ S å "Ú!FM'Á °“ ao?"VåaÀAó!cXé 2XŽÏAéß ,A†e£UÀaU%8C9äªAçA­ B2I!¶1¢k ‡!0r nAwA@"Œ AË1¡¹aãUh!°©Ö!$š!„EÀ ÷ n‡ …2e7Xå A…Š-¢á"©šåQªjAçmŽ,ã ¡©µ °.LAhP „Ae!wÁ· !X5Œ"¢ö “A.!a ,Ay!èA= !GÅ Üa-!GEÆ5ú !M¡ž!• B² bepõ¦…6Ì=`f!LD1äaYæ/ X!Äá ¡ÆA ¬!!;AÈ @ ¡›T1`Ü©! Ë ,¡¥ ƒ•æÅ0 a76¡`%Ë!1và&Öˆº ,%k!‰!û& ®PÁq š¡4!F­¡—°…!Š !,ásA"!U a yœ‘!Ya ,…Š%Du!k-a3uÈaÁÁ¡G !% -¡~!7P!"še¡“¡í °a.á6!2 ,AŠ¡ý!€ YAÔi·X!­A¨ =JÙhæ9úÒmÑ náD!Gj¡™ n¥ !Á•La¨¡ AÄ!h ,A AP! að¡jÁÒ!Ú e­) ÐMaìÆE#"| e!C¡á"ðE{ !½µ)Z~aÇ•üaËŒ1¢»EÄ- šaV£\u EA¡"` ¥dáÏå"1`ð P•"Î AŸA ¹Y~á¡ÖÅ,A!ó£ Æ‹AAh"â aè T8 °sÁqÉöòA]ˆv"¦EïÇ•¤¥ê!º!bõ8!JaD¡÷,BÁ÷E®"…Ð=E‚ÜaÖAf| "6š€!‘რơ^!¢XA¦a›Ahw ,ÁÙ!!x!¥ ¡·Ž!Îû !™a-!¼a1 AËEa L°¶Eò+j6"¤EyA&%½QÖ·ÜÁ¡õ n>!vM! ¥ì!IóÑ´!†ÇURÁ}%è-‘ B‰¡ÃLá$ F}ü5Îaì)!¡AÞ ,-ÁFŠ M At jÕ )3‘ÐA¥!IaI ,á¦!ò!&9Œ¡¬'AU¹ ,¥ga…—"¶a'Ãgñþj!š+!N BA !¸. á|A» × ¥‚!Ayz ! ,—C F áNÁ5aŒupc!--,š![A‰ B%äÐ"ü Ê A=U?a %ÿ"aÿe.¶,TEÕ a1`ÒE,¡š !qoX F °!\ZAœáh »!‡!h!ð !Ý[ÞU!´aômI,RábI B¡ Ù>*| ÁV!7A*`Aºa‰  B ¡Ü%úÕFm!aA+ ,å‹…Ky!va²™¤á]!Èe qœ6!d¡¡n X%ZA!½"Ü %cá("œa¿Á®!° Bf!áþ!z ég!Ó> !µWA™™x'Aû5õ¼!!ÆeŠÜý!þ+!Ò X!1‘-¢ ¡aW!× ,¨ap!“A2 AK] AA A ©#ÅXó‚!Ñ&Äa>!÷AòyôÁÝÁo¥Ñ´|õ .²A6Ø„åæ~eä Æ%÷b"öà rAgš Af!‰.†AuÁžY nâ ?µ2¾ !z¡•!)IèZ† !\!{5äòa²¾ B!ŠA¯ša²ÁÚa¶a³ , A~¡ˆ ÁÔÁ­Al- fAÏAn"¸ Å ARaø! ,)Z!†EE-ç%ž¡QU”“AD B![A!šY¢aP BfùÁ…U<çáµ(×A¸py!(aVpqô%-)UÀA0}naL „r E­aÛ•6™Á²!ü&~¬f"Ê¡!½ XaaG !£ …aÌX‘.áeaâ ,)oÁÎç-vÈfá¡F ,E¦ÁäQÕàø Áå &äxa`A,UÀ±c  ,¥¤e-‘t i’ê‡ä AI%vÅ^ á![òA1ä %š Ù=œÝ ÜEª!m"¸¡ Å-¡î"öPAME§õ¦a“QI"R Ó÷a&f!U!áÁ^"L%a8Aé;½îíH¬!Ò °%±åf¿Ü²µ Ao14!! AÞAÅ B¡w!:"ì9RA; ,É æ %&u²…u¡–¡“uœ2A~!* BxàCá' §a\a´* Uaƒ9J˜­á1úA *áÏy!I®%æ „!ž_DZ „A ˜ a!5¢Árá‘mAC ,!—$!öÁ¼ pëˆA  §¡­EE1Œ!!r¸| ,60!x5`e/%§±>!ñ¡Óas¡´ BÁ‡¡þ !F}c"E£¡Ñ¡²uœAéAªas` B› ¤!¶.^A!!Eá ,Á„A&%1".$A”!ŸÁþáU ,Aäƒ Á` …ÁEá®1価 µ š![,©B,AìÏ AYÏ XæAdalÁ9 ÁÙÁáFn%œ¡…Á’1¸ÁE&!šA¼ý¼c!¤ÁÇ5`AR¬aç „!È!±mÑ\Ɉ!Â"˜a1"„,Ü¡¼Ag XAF!ÁÆa! á"EÉ„ %È”! &®“¡|¡î"À!?aÇo XÁAԹؓá«A("R Ö Áµ¡, Ba&A¼!7¨ !]!š-"ð¥x[`.eʦ !¾BáœpAÑàARÞŽAð ,E”©!$upA#A&a¡A® ,!89! ¿%F)Ò ,°tYRÁ¬e†QÀ, ’a`a X¡ý!ú¥'"zÃ…t¡Þ5ÎáXAA”á­ Be–À¸Õ0!ö¡¿=ú)̉"¸!,|A® XA\¨!GA‡ òA¾ž!ª ¡…f"¼¬A½…euÁ•5 ¡! BA#Af!; Ð_apÁ: ¡QÃ"Æ AdAÚ‰Ô ,!¯Aw%Ë"$ saA!”aæ ,aR!û)¦"¸ %ÏM,&Ü !)/ óuÈ%2!.…9 °!òaY"ú"¡wjy†s A' .Œ ¡«+» °!õ½Š … ò!=•ÐaN!ˆ´!? BÁ=Q!÷5 AäáÊ!_ò!—a²!ì!a ,%€¡-v@AÒa³ˆ , á”!”a …p!ÎAmyô¡QÅ5· ÑEK!."° U!ˆÁÝá. X!T BÛ"*õ)FµÂAªÕA¦f BïnE*&î’hÁ†* af!¹Eà-J?ç A™áR n"A!® AQÅa†‡¡x!\%– a&aFa&ÎÉá-' ,ÁSeG!zUÖ…óç¡Çu.aíàÁ¡f B!ø$Ið´ °ANa  A· e™ VôaÌÕö%2A>EEq† S1!« „Xa2aä AÐQíÿ-4eÕËk°máåA…°† -¦%“Xî!!³ a½ï"Š AGF £ ,Aá¢!½¡, ¡w!7¡š î%xÆEâa[ãÕÊŽ!\ß B¡Aþ ]”8dÁZ&, AAy…ï °!TážT : X­¡'!ÒAl ade@!#uÞÅ©…a7"el(S"ºAäÜ>¥ Xa;ªÙ""¦!¼aŠ! ,X!/aÚÁ& !,)µ¡u† Æš Üú?) B!ƨ  Xበaˆ¡4 ,ÿ°AÚ!Q !—AÂ!ÁÆ!A¬X!0‹ Aîq!k>Åqpîê!&| a@A`Åy.!i( š!ÙAªÌ »I’M-aöAÒy ,!Á¯¡×™xAÒá¡'n„˜5Œ!ƒá½Á^Aô X¡¤oa3a ¡SÍ]—!Ée/!!5 . °8 á A+¹TA[áA‚ næ>$¡4 n¡!Õ¡G AsAVÁÞ™æ¤eH¹5¸a„-F!¢-v ûÑ Xœ%žVuZ°aÈ!ºò…AÁá ú šÅ•Á ""@Áë`AÉnÅœ«AB”a3AFu.ÁôCùdA{±k•ºÁka^‹".$!«/J „ a@Áú „ï 1vZ ,¾ UÞ ÆnEÚ¢"< ¡Í;!7a BÁÇAl?ô Æ;%NÆu¾A¼aM ,!ËTåd5,!³!2AH ,Ä„¡]&¡IÝ " E ¥"¶:)EAk1Œ®¡­Ë n¡f…PÇ.&A)aÚAÕ ÆÁ©»‘a BENÁ¹¡s"ðiô‘aš AÒᣠB!FAaÊ"š!4EME˜BAžÖÅ·&t )aA˜qÈTQÖù¼B´Á\A[ „xa<Ê&Ì ¡Ñq ï"î¡ ‰LA[Q~AãAœ!= XîaH!ÿE AÊåv!cuw !ßAd ,… !©& A ­AEURk JuZ!v!¢ XAÊ%!¢ùè†%]á, E5: ¥Çª :¡B!v Xa{ÁYAÆšA5†ï™æ‘enQª9¡7aßQ XÅ­o!O"º§E+ Þ ,€ A»!é"b!r|A×a2 ,ÝÁaѱj2 i^!wñd¥©AE$ÑöA}jAÿÙ´…%¢!бjƒ !Ÿ!NYR!4àç&ð¡uÁÌ!bnáôa2ã ÆAü ž%i-A”!JAha£ ,¨!ã½ÙžUáae "ê ¡‘¡ Ñ B!ä*Aî"ÚA¡náU ,aal !A~¶qD%±%Ùˆa½> pµj!¸!oIEX!öA"®UÀ!ö!‹a2› „A¦!`iù1ú%áºáî"` A¼ÁɈ!w BeÅ; A§•æ!·%KaW"š La4” B!I%Î)&ø E|!PáUh!Œ A'&, I!!Î ÜØ!3A…Yh!,!÷Aÿyœ)‰¡ÓaÇyôd~H °aN!¸» A ÆV!Ô "®F |%¡"ÖBA@ Bœa”Áx!' !v\-"^@Á¾â: Ë ,áJ%dÙý!²µÂA‰a,ß Bq!c!¢0 .Ü¡„Ea\ap&ü¡¡V^9¸E•Ra`QÀaa~nu !M…ê"Ì Æ=!¡A¯ š%³ô%üqD–-Ar1Î!™‰QÞ B'ûÅQ<áåe3&@A§¥KÝ!3AÑácQ&AŽK½ n!ËÁmÅcš@ ¥f.B<aæ• Eá!Ý?"$ Õ! °-Χ!{á#Õà- „¡à£ šP¡{AV¡ A-’ 1¸* ae›"–ÅÉa•MS B!0©!{Õ©ý_!w1v… …Mâ"¨ IS!^¡Â Üú!ž!ã´ n’a[FŒ aô…yYh!BLá"€¡¶i!eÖap¡Ùeù¦$A=Añ¼Äu å "âš!þáªA[ šß !ŸuÞaef%e5¡»!d 31æÆ!3¡/ XaI<  %D!e_9ÎÍÛav"å£Í‰•Ð… aa!Ž X!ÁT!ˆè AÒBð raÁ¡<X¡AÈ¢ ,!1áhÙ,+!’CÑ´Ì!wß4 ,N±q!q ¡À‘6Aa.ÁMAï BA}AŽ!¡!æ¡JaÑž!rYa[a‰ ,é\´!1¸©€%E ,Å©a„ÇyZסաÃ"€¥„aW&ê+)w!ÍÊ-4!±)õxòAªaL „ç!cA At !î!FL!è Ÿ!šÙ 0 aUoɘAF?á™uôyê !Î"/2%3¡C9`˜.7Ü%io „aamAz¡¡¤ar!u5¸ae­`ÕžaÙ!dE²"Jƒ«a$ XE£¬..Ø1`,šAÅ ,Aa-a ¼ INjü Aó¡îá ,¡a²aÈa$ IHM°Uªj !n °QÖŽ¿? B!?j !1"Va²Œ9ú¡jA8^aè Bÿaîª h ¾AØ. ÁV!! Æ!eV™ŽA]A!«•ºX A8r! nAÁ‚Ÿ A ï ì o AÓeœac"ê AäÜj8 ,%ÜC!¦5ä,aY.ˆAN…•s B>.!<à !eÈA+5…1Ejø AJí !a"H Ùa™¸!£ Xð!þA=ƒ Á€!nAª!ÜÁÜ!• ,Areݨ !vA&!A× ,¡%!´` "¬AAU ,¡r-~ BŽõ ,ªAÂ0 QÀ¯–¡…2 ,aÀja³Õ´¡ !rűµåNa‡ÁY"„ aڈ᩠X¢%§)f -øÉK‚¡;AW!‘ ,A¢e@É" ÁSaƒ!žá‚ ,eašã1!ÜAΗ5`!÷YaÍ BÃÅŰ,!¸u%¼¹T-6!ÿ Ba¼!!Í!@ Ar™5J!ÎAΡ ,AŠ¥}‹ 9 -!!¦ ,!aZ¡}a A¹EB1úŽA'%h"îaV±Á[9vAdo° X%kE"A×*¢ !Aýv „!)Î!u†¥aØ­ X Ô !’‚ëA»!’ ,¡ á °¦ ÁÄeWbUR!Úä£ ,!VE=V*,h¡h[ XÀ eaH™6åOEÜÝ Æ­!‰¡RÆ¡2!C%Ò"~¤aÛ!z¡Ç š¡!Aa¥ "t Å …q! Ü!Œ¡EÈ"Ì (y»¡á Xa»¼ ÜeÄ)§ ò%à×?ÙF麬A B¡¶A@Á_a1 ea\%•1ÎD!¥¡%" ,ÁÁ¬ !i A %ÉAÛ"âA´¥79J…0™a`1¸ !Ðc X| !ÊK X“!ÁÒ áœ!Ï"d‡ e®aZ5A\¥Ta3"(!š%~5!±áAîa‹np@!øuôC¿!]"àA¤s=JB!xõè­ ¥’aY"R „!¤ùUÀ¡%ráP, ¥…aÉ‘L¡(!àP !5 Æ!Ge/¡V,!ø† a°"A½!ò%÷YìÁµEOa¢‘baNA@d!< n©»!ê±î%ªÁ°!û ,¡TEzÁ‡ò!0¥Å"˜)AMA»AháC BA9x AÕ!³:!e^t.: È% °î A,N ,!Âfáß !ÊA+ÿ A#%öšòe[a!uÁà!`ˆ B¥yáø8 ‘æºe¡ð5`eQ(¡+%¸È y&°!ù!`A«"H AsÁ·EUµÂ…aÞ &¸ `¬a"‘¤éDÖ ¤¡€¡D Üa×…Ñ "v !V¡/"ðÁ¥iD‘6añc !¸"<¡(aÀ ˆ n!]X!"ì Pe„"h#CÏ A•AA Beÿán"ÄÁ¯ CaX™x!V!Ha̱(aôAŒ¡F X!Œ!3¡lµ(òáa†D ,Ár"t !>AÎA˜!,ðaF AÌ'A(šPÔaßAt ,A·!0»W nÁö…͵–š!¸ ,©j…‹\-úAàv ) qpA3¹kUh……A§AA°Ì A|–n»!ú!ï-!eø Ë eIÍ1!ƒ_ n õNZGaù nªô%JÑàÙAaõ"®{%\Ë&á›k÷¡:|‰XAŸô˜qZAK!,-¡ šeôá•a^"¾ ¾a­) ,TåNaup!a!úA˜ ,!È<FµîAMQPA— ,AŒ-eEuÞa™%a7õ8!Îq²BÓaå¡+M<LÐ!4Á ,UAÐ%uU&mHA B‰ I%Êqá'5v%l%ÎbQªI¸%æ „AªE¦[ šEŸEd¶QhÕáØÜ!kaö%H°!ÊÅ¢ ³ X±Aå¡´œ nA\ådaøÕ0dâ,!" , •að« œ>…ùÙ¨áËÁ "lEhjá§UÀ!AVE±¹¬A]à®ÙžÁoA IõÒÁØ!‹!ˆŽ š!AÎAœ‹%Ç!]ƒ1äóA6eu4 æA`íh ,á3‡!d X’!5á95Jã !ß…¤"xÿa¡ªÕƒ!s!«u² ? a no„!ä¡ a§ Áä! !Aáèð¦ Ð)!â"~Ž:A!} ,¬!„n! A½!þ¯=`%F!3^ ‘æ¥e?äq!AÕÎ! XIeÅv7 a9A8E'"Œ Aúåã!fn¡>!›d BA`ARä áiC õ Ó,Œ !,,EœÆ„ Àìò!Gºë¡J X–áÖA{` Á’Ø-"˜aN”V&ÄÖA(‘LæÁ¯Á! Xx aZ%½µ¬  EÿA"Á,¥)nAuE&%`ÕFÒJ幨;a“ µ¬¡ga®—rš ¿EZ"$ ¡Ša³!øA ,aA{%ä"t*EN©Y1 ,!>a†- ‘k aü"ì,ahA± ,!µ!O ± XÁ¨%…J1a‚!àÁ B¡ ¿¥±*rÁ·+!Ö X¡©!IA ! B“!•"Ì%ˆ]!h&þ!AW "ª ø š!J¡4 X!¯TAÖ!" A8EU" *È Mõ,e©! !·¡ã¡òõ"ÄA%á!\„ ›`Xâ áA)X¡6a‡AlA¶ ,¥!"ˆAQANY&^ ÈàÐ Bn!¢ÍUÖaè¡, ,¡Ì« %gyp%¹¡Á¡jÁ‰ B2Y !ü !à%Ýõ"˜aœ%ä"Š 6|¬aã BAPa¯  %È ‰8 APâ"Î!÷–A©a^ BA1ESVA!Catáð ,$ai· ˜ !X!"—& Ù&ŠÕà!`šA.áZ Bºi‚Åön]a´‘ü¡5!Ç Bú A{áµ–7 ¡%bMR¾²Aq B¡á I" aÁaƒe\1Î-äÁ7 šÛq  &VÛa!½"†½4Œ „ó¡Ý›&\!—A•Aé"´¡ûÀ …¨u†AcT! XeÀQÇ5¢J M9¢…´á òEêa÷ X!!á¤aŠ náÆ¡NAªa aeÁ?"ò>…4a±Ñž…x¡¥!1õèAé Aÿ"üXŠ !ÊaP nQ òaA˜ðac ,¡#!!½§ ¡ú˜qu²)A„!ÐQªÑ ÁvEÃÆ!T!¸áhšÔ!| aFn!¯A˜1` am%7 °Aª’!3aa BeÓo? upA 1¥ ,ESEJ BA·/!#AŠ ,b¥Ôiv °”¡Å VðAN%CWµÖ!vr A‰ X¥á "ŽAãA5Fl ,@áÒõÜA»­…"¢-%·A'%•šaDÇA‡"ø !Î!è¡)! n¡s!Õ´& œ7 , a²)\ n!ᇠ!ò…^ }È-á?"t d °Aù B!!wI E¼I ¥ß ,Aù!ÁBaê !ùAé)¢uÇéw¢,IOÁ¢¡? |Ála X%+œaä&*AÒË%IQ”åEa€a["` 9¡Ð¡y.ŬA=¡óBe,&˜"l>Å@ŶQÖAûB&h áüAAõÒñáì!ýab Üæ¡Æ°!Ò AŒAN¡oò!K…uAÆ"ÔI9¥ò! BÅ\ÇG X’…¡] ,eÈÆQÖe®•á§&Œ—” !j]&á Á^a… „Aeá *‘xAž%KÅœnÜ0ARg šá!AN!uù ¡“a-¹Âh¡¤u†!E!` B|!¦ „ ÅlA}QR!!á¡XAH ,!¬AWn  !q©!a FåR.°:çÁ4 ,¡Ñ“¥î1°!±i1¡ …üõ Ba­A@ aã !rAÁI9å0íÁçX­A¾%ê BaW0 š Õž!šAï3 ¡ä ,ÁÜá¾&à'orý¦!xE°AsnØÛÉa X9g!5"Ü aÃ!š`a ,!áAq•ŽAã²^Ád ,O+¡ï™ E½ 2t ©Aê!ª Ba²Awa["na›AÀ!Œ!Ñ,!ŠAÿÜõz!ÝAfÝraà!p¥W-!]î!ê"˜Aá%`þ "ØÅ;Y!5¸A ”4šÆ:uD¡½a”aE&¢ AhÔaE!V B õõ °6E;­µ–M Y¡óÒ Ba9A)³=`)Ú´ °AÊ!´!1 B¾áû×qÈÆÁY¼ – ,©$@è9ä¥×Ð%à ,¨A5&Æ %!çaYBAsÁÞ!O&@·A"}upiÈaƒå n%ôA)!"€A a¡!Ö šÖEºÁ 1vAb¿¯aÉ ,6E‘AYµî¡j¹ a ,ž¡s áaµa‚!½ %!4ÑAA@¡1 , ARA2 âEaöu!ôA`!&!R , aò&Ü Aí€aE&  !)5A& ÜfÁ-aÞu£  "š !ÅÁqAd!8 „!®AÑá¡Ü aN(d á{Èß & €EgA„ B°à %ª&ê QAÒšÿ! s nñÁö!Ê!l Ac!!ˆö ÍgaQ<¡¶% áþµ>ŽB…¹"°áäÌr X!ža™Iœq†ºa¡?€ ,Áð! "D éaŠ!9la@Å!~! BûÅsÏ1`![Ûà!E¡N­ÆPIé!î1Œ…Þ| ¡àµ¡æÊA.[ „A#“ax£ a“¡í!žz !T:!Oáô ….aCw°f%û!^1ü¡Ð¡aº B¡?…àAÇ,iWáS% ,a%!äaŠa: PEØ!¿BÒšK1`A7¸A B%óAe!áUì…/!b? "bAüîöA™ B¡¼!ýv 5 ®A‚ ,¡H%B aE ,¡(ʃ] i €¡«A A3%Jaœ&6y;a»°%àsµ–Eì…“ š!Ü!7ÁÆY%1!!‰á$ B¡;i]VAâ!zaøA† ,/}™"î&’ ¡$“ ¡¢ ,!mA¸!g l !ö  ¡]ÙöQ!d°}±!H…4‘¤(–5ä!õ¥¨!¹µ€ÆaÚA½"®x%á ,O!° !Ú °t !»…Ò-JA!É%" ï¡ÙA B¡M œa{ z¡ÿeå" Á,/E­"$C!ÊAX m!{AD !ma!& " j!àa1Aèá"-Î a´á554¡–žaaãBÁ°%a Ü)!Ç^"œ$ Lp54¡Qî¡,¡/ XÅlAMÉL!@Á´J( ,%.!$Eg Ü¡¤Ž ¡¸ ,!š!X¡W9v!­!ò!¹!O ,A¦~!¤U&A~ ÂÁžu†FM®P BVAî">Ae¶•Lù Awiõ™ü!ða81ì!!aƒÔ nEç’!æ"nÁóÇo9Œ!ïÁZaæ BÒ!Uˆ PüA ç Vañ!Á" üA{UÀ¥_ VaG Bba¶a®i ƒÁ€ÁˆL As!Ç%d5AF!þr9¸I3a\!¶UÖÚ!Eï"ž‰À‡9Έ u²AG!taX**%L„á¿M<üÁ AÂ!~ ƨ¾Á÷! Ô/Å"l!Ãf°5`mÞÁŽò B%F…&Œ ï©×"Ð)!³)°Ð%¢EX±jAÀ-EÔ °‰†!¥dn†à!£‡, ”Á…  AvœT Áf¡òõ"aÔ’Õ¡ ,¾Qe[1|ß ÁæÜ)W!‹ÁcrþA~n XóAå˜"®Ñ©!¹õz+A6¡ö!® B(!yACa6 aÆaªA– g;A+UÖÁEû"ÞalAÚA¡u BÓašÃ5Œi×óª eÓí.vº 3 XAÕ¬Ë"Š ¡PÇaÆ"†a§áœ": ¬AþA€Á X!Ás5¸aY!à![ ,¥ï ã q†( @ C„ ,µ Áe_QÀׯAi"60Až!¼ naÖES›U&!ÃAü!£ n ¡ ,&üAÓ­"f ¥%²a3Uª;ißÅú X!CÁWAôa¤ ¾a) U!U‚ ÁR ,ÁʰA3 A'!!Ô&Î Ò!sË&¾ !a¶Æ*¶!ÌaVÅ‘n(%( n%†n™x¤ !H!çQ”$%ó&â ‹½ ¬UÖ¡_ÅÆe·qÞe²!骰 Å0AP¶ a†¡xÁH)¥IØŽÜ!C"!’"` 8 m y"¶ !…2!ëXAÙæy ‘W)¹9r\°H æ!%¤ XÈe†ÈÜa%eW!‘&R#áAh!•"((¡ïAÛ!¥ Xª³ Jq&aáÄ„ ša%5ä!›i·,!A‰– DXT X!wª!Ð9¢eÁAá9*(¹ F™ºªáØQ!µAÄ7 Ï B!!Øa_ ¡ %EÔq†!J:1¼ ,!!!‘U<­-¡oy|Aþi/X{3A¨"¢ !YžÁ#õdEJõ"ôe˜« "4 …û­¡Ç"NIEøAl†5Œ jA* Ü!Îa!ä!¿lAºâñN%a^EÜ"¬¡a!á&B%é¤1:!ä!IÉ n‰¨åg „!vÁTá7áë ,>a@‡ ìa)$1úšÆ!P‘ a+ iF XAsP=A­ X!J¡{rÕF!CAÖ!8 ,ƒA¢A†Á Ã!òAì¹(•AUw "š Açá„A® BA{A¹A¯õ8á´a~o!ç ,¡2™=ä!AW²µîa ¬A~åB<¡þe5¸!Ü¿Á…õdØEð%6±€ë!‹× Xá!÷¸"v"¡T iSñdE¸iAöñ¼!]ÁßGq X§È!£"ê )á9ìQª!jö áÕy.Á›Á[á¦!! X— ö° …W L " !ÎmÅ"LQö”µÂ¡ø!àÁAq X!ó!„1a !†ádja» !uÎ!! !saE!• Ð ¥ƒÌ"ÚÑA!c! ,ýAðem5ÎaÇîa§ ,! àò%qAê©p ,æávA® ¤AwÒ Î »AAa²Õ\Aª„!&¡n,!Ž ³¹/áú©-º! BýA"œ‘6%4A$kõ"!ä%F‰©°!^Ç"æ!YÅv ᪠n!2é'…Ô Å,Á²!&ZAL]¡±™ !ð!Ï%¤A£ÞE#µ€Aé=  náÎA¿Êa5 a€A@Ye¡¨€A« ,¡¬AÎ!öA™ Áž(!Ó a›a”  ÉnaA!‹qÞAR:¡nY ,¾Aé‰AÚ ­!8¡,Ao %Ü¡“aã•6.Þ ‘ÐÔ%õ%«ÑgŸ‚ 5`& Cˆ"h a¦P åñ"= Æ4Ÿ šA >!x1¸AÖÅ EZ"6¥!‰%‘"¦) A«&, o ỉ ‘æk!-žat „ÉF¡Çp5á¢!ÇÅL1aNáN+!z BÁFíØ ÞE !_5Þ%Œa"Laô¡áú¡ñ BA"­A®Á AsšiŠš…\ÁZÑr!¬A!ùAœ BÉóAç·áw­Áç•6!¸:©…шæ¡„%y54 !¢¡Pá na! A,! !é ])""¬wB¥ AÜWBå!I‚‘ºAŒaÛA.¾ nAÒ!wIž a×gLþ %ûÎ ÒðÕa¥±&¨ %w¡pe òxAU!J\ X¡HBa %›ÅGa¢Ü ¨Waê ,EèaîZqD!>!Í‚!@ ,¡$%¸!x"Ü a|Á¦ ,Ö!½A$"@¡(E>9ú9A$ U”!äQ a"–á!‰!Óû n!úeZAßu!€óåÄ"  ¡Qa?4ý¼! áë.1ú%\! ¥h5J;8 a]‘¤Iéž…c-`'E a.Ž< !¿d Æ!ú) ¡«xaÝ%D òEw=4½>. ! !&¾&ÁôáÛq²A§¡ÔaÐa X % EÝ-ú!Ü!) qÈ2 ! A*B!xaG.ä ¡l_aç ,E&¡©&î¨á! 5!Ü ൖMe†•º-2aU”!† a"¸ ¡¤¡˜÷5¢IO¡è.V%Ë!Q" ¡g!‹aÈ!# Üq á~Å!¹ á >E5Œc¡¥"ˆTÁlÁ÷ Bðr`&1>Aåo•baR¨%R54- ¡ XA$¾‰5•xl!\u :rC Ba‘ëÍ™¤%÷A áaÕ¿!ao",Üj X PAýA °aes¹îE×Áø¡G1`‰ !"(&: !‰i},eC!-ò!Ï!a" < A—¡%A- °eje b aea2…üµ–n!tŸ& € â!üYhÁôG!¹A¼¡“eu1¸e^UÖ‘ah…NµÂ9!w °A”a×–A …̉ŸF Š%ÍE•x™š!!1Ja|ñÏ"Š Á´en † X!ÝÜ!5Áá ÁPo4at ÂE®¹5»T!85AhØ!’™6¹ZÁs"vÓIro nañE 7õ¼!j¯Eay , ávA#°!Æ1‘æ!Æ…s!i}.¯!Ða¶"f !2 AY n¾ÊaA „aNT%NUhB!%‹ù¡¡åvE­¬I!“ÄL Qªµî Å{ Baô!!Öi š¡Ãá õN!se¬!ÁURA’Aÿá *ä ¡%¡­ XÐ%äÅúñdaVD…c"æ¡6Â" š e‚΄U%´lµ€AŒa+Á„² BePA:±1¢ÃA§[.ÀÁ'GA-¸Þ!uà X!ÜAœÁ# !Œ 9Î…L%2AQ Ü a®ì¡ B!rAÁédµj÷ Àµ"r¤aÝK&²…IfA> °A¦!·ž… nš!!¶Aø À ‰!!Óñ¦7aâaEN , ´õaâ áGa]%v ÞA-AÊYö BaA\aWA !!Xö ¹Âz!Ÿ!˵jI‚ï‰ ABQª!at½ØŽ%ÞE­ „Ø« ɵ š“!ŒÕ áí Í/A„! B!!ê9¸ºóå u.AÔ‰ë Bæ !£ADAí n­ á&ÄI½`Y•L¦! !¾Q&ÁnA Ì X!›LBê%ÒAÁ"Ì õ!°g A B%‰!xÁ{&t !È!KeXQìXÛa³1¢8 Û …·•¤? al4!½ nS[A«"D!EPaÜž ,a‚E~Áá½T…£E›¡4 ,a<> 2¢"\!8A ,a!BÁùÁŒ á’¡^Ü !k©½ò!0Åa^ X%„aòE[U”aªaÍ'"2 %¡Æ…"aìÁŒA– š!TãEœµØMÏÁqQ~Á;¶AVUaA”¡Ç· X!ß%% ÕˆaÛke†Æt!5aÁá&ÅÆ!! ÜÚ~)÷2Òa”" ¤ ša‚¡O,• ƒ¥8A™•Le˜ïÁ.š¿ AÙ BÁ«¾a!ç %+a=ž,!? Ç1 ,Ü!d^1va%"ª } a B!(Af!Ïy XA4 "xÁ˜aA}aÌ ,Ú’‘6AªÅŒ­U~å^A$!×"æ-AÁraû š€A*¡ˆYh!ÜV aM „…Ž›! 5…¡RaŠUìq!š!cú B姉-vÁQáæEœ" Æ!´!&!¥ BARQIùda:a‡!÷"Œ ¾«i[nEÿa>ë nArrÎ!w n®Aeaò9ä%ÈôÍ , c 0±>ç P šA‘ÂuQRš!\a…!Ú X?ãáV ¡a¡š!Ó øÁW¢Á }Áa[ö …!LA+" !Eá~A8A³ ,Å´a¬H"~ …¡¿!w™x¦­!wL¡ª!pa8ò!V@AfµT…aò¼•L)Ë‹ä šê©¡°Á¥ !5¿ A[.¸á8!<-!n!†“!¼ BøA¥³"ŠÅ•Dl"¦(%J%º!qœ!k‡%NõNn!3| nA EUA‡"^!äaŠó!g ,ë¡L¡X*tanw5JæëA a^ Bx´! ó !ŠéÀA1ŒAÒ%¡Ùˆae!†%é5¢%™{ %! XÃÆa Áv á AØ": !W ú!< ,!V%ýŠnaÜ]Ù7!žˆup!!ÆF! X!µa‹AgX¥Õ¡(!Šñþ?e©o š!šA­JX5Î' %¡%!‰"ŽÐA‘ž&` !aA­a "–¤A‚¡faŠ X!JX)Ó5Œ]©—A ,ÁÜêå  a“La!— ,!>!XaG!c ªAxI´ ¨U ¡SÈ °!na 5äÛt!è+ ,!œ–!Ô• ¡ý!µ©"ŒA7AŒ…5ÕáÁ)ö { XE*Ùuœ¥%é8 °QI”%’ B !!ŸB!-¤ B!Ú n!p-X!]ÖeJ X¡#aaœã BU Æañq Áš!Áe Aª)AX%= ]ш%vk%O naÃõ…P&X!Èâ°QìÎ ÁG!^&òE¡.å'šÉ !΢µ€IðaÉ| åE®Á¾š«ˆ ÆMÀÅsä"ÄaìA€a* ¡d¡×!B!Ya=„ ¹–AéasAÙ)`%ÎaÛAÓ5`EiIКX¬eáB¡Vh%j-¯˜!¦AA ,“ÅA!ÁUìEMî¥ÈÑ\ª ¥sÑÊéN á£"žUT‰• ÜÂ!`Aa3 „ªEƒ´ 2 ŽA ©B¡6ÖÁYá­ BA¼aÌ{¡Ü XK5Å %‰ ,!%[%$MªQ¡¢± X%!Œ¯"ÄAèAÃ=A² ,%¢aðAé*J"aÊÅ!ú«A ¡ B© lA\ VÛE " 1 a@%Ï54Áë’ ® . q ¥UR‘5 Ù"P ã!X! šAûa\ðX¥G aÞ!% ,…IA Ð"v ~ !q!8 ,aa )þQ~­ ¡î!ÿ ,ÂAëÁ‘ I9ÁH£1Îa×ÜÁ¦· ,¥ Gáš XEwa×!N&t ±eô‚‘ü!° UsuÁ‰¡®A••x!T¡cÅp5¢Ez\1¸ ÁX! ú °eBÁÚ! ‘Ð!°…ŵUÖèHA–&& -÷AÚ XA~fiâq.x!Nà"O Ta„Q<)›F K „%naqA&"A0a·ê„a‡˜ Qª¡ü¡Æ} ; ,!‡aB*Œ !ž!s&`A:º aãXaסÓAn54 TaÝX X âAd !ð Á¿ ,!ˆ!Á"¡ž ,aA*!§Î »o!e.Xñeð×XÅÄEé"° ÁÆ!E'"lç!`A¼as n¾Á*%R"° æÁ‰A;# ,¡e ›QhÐÊÁ* V¡× ,!²¬aEq!q!…ŒUh­„@!' „áâAÚ!¼Aø !¡šÇA µ aàe ‚U†‚.°lH!?-`Á\!V!@ X%åE¨â ©ÁÂA½áÈ ,Aø!óA=Ak M*Z"  %?A”%&êi $¡: BLA<Y\ ÅYK ‹ æîA°•LaYƒADòÁ”¡l£Qhåaã !ÎuôPAN„A® ná‰eq¡.±jc1  &¶ $aÄA± BAi4AÛ X¶¡:áSa| aþA¥U”îBᑎ!–Â!1aO BÁpAíaº b AS · ¾¡–aøAÇ AúAv!ú> !1"!l !ÂøAD!= —a)Ô ¥­"& !k!„¡Éà ,aÛAÞA^  aÌŸŠ ¥ÑF a1äÁ«!ã Q‰s EAt BAø!Az á.a˜a²2  ¡xÚùzÁA `U”e!§Š &ô_ %õ3„%I‡ aá1¢, 'a m%¸ÁÕö…¼A¯„¡$!X!¹ ÆAä,‰¤X^!>&˜…!aQ~!±!AÄK XcA'!ý&ò a‰áM ,ali¾! Á«A•A'¢ êœkÙö%¶âó š‘ö%N BrÁr5v!Ã%9a& AÁŒ¡1°ÊaDú X¡¬!ÌÄAÌ !ÄAa&ì )ö%Ô ,AÀ!áð¦ Рẅ !ÛA§iã±Øj!+õþÒ!1Ð AÞ X%ž ]¥ÍkI&l!“Aà ,Aä%à!9¹ý!J…7°eÅáç!¹jÅ!ôŽ5¸ÅÝé 9`!õ' AQ EÁÁ"f AK!ƒ!ÿ °A£á4!& a—!5yD!õÃe ñ衊ùú BMC Ç Iª*AÃB!lA¸¡ÜYáóA—!l BèáíÅIõ?AyA;¾ Ã!QÊ B!m¡aA9aƒ!Æeá&Ö!Ã.1•ÐA4¡ÀAl!Ž X> ¡h³" )A’p°A;ÁÚ‚’ ü)Áf1Îr!‡e6yœ›!xE „AìÁ­["þa‚͉-á!‹L !lÆð‰e¤ Õaß"Ì !0!zo¡s ,) 9 % šI7 y ,©|áùQ~ÁÖ! !n¡ã> ÆU<ê€!í XÁ AxaÚ AaÁ8á' iA½X ‘ Á,A#“ XEKa_":A!G! Ç ,E¹%‘!ÔQª!Î%-%Ž5a¿áê%,Áš!Nî Xa…É0a_U<¡’ !ÍX!ƒA‘¡: Bú aDA;!ê @ %Ôƒ ÕáàB!— aÈAÎ!w9ŒA£Å)eQÀä a†xÁä BAvaÖau Ah!C!|"x%a(!w!& ,AÀá|Îuô ! AÇî , !ß9 „e!w!¶u²Á¾0¬A‚ B¡ù/ "âe©¡Ø!íYì}A¹!s5ú¬%v!Ë5¢±!Ž !9 nÆ'¦ õ¼å!5!ãO ,ap!Ú"%-‰Á£"¼Ága‰¡. B#P\\ Aý!/ n:A×e`ш¡2¼a[.ráºA7Eí X!†%`2"ÈêÃeüõ8!¢a.Aiè šEK)v!Q-¢eé%ÿ µ ,A’Ý1qZa@…§á§YhÅ* ", ðÁB–aa Xše(EnAKA-‘Ðò'/„ B,o ¡Ô9¸ÁAv!FA2 ,Þa=Á‡Áù AåaŸZ!/!â±îÕ¾!à! ,ÁAk! ¥6åwÁôÁÁ!¢Al ,A”åú,Ù¡Ž! ‡ ,ÞÁÛA""Æ$ °)a¥ñB!]¡-!Žâ A%Òa+Ùád""H A’! !¡A Xa)&x !Ëaa"Š la´œ"J AFA®ˆ BÅaÚ¶!& eÕAÓÛu²e)EÛa_ A8!°µ† BA¸a†!¹! ™Üe›"¶ Áž¡j!dK ,iX%;Aq!Í eËÆ!©ž"(…tAÓÊ"öA<¥“¥‘ amAÒ\„!€¡êASq ‰w š<åJa³X![„ Ü¡xA¢A^ B¿!±AÖ"F2!›¡!5!¼,ÚA…¥ XUQ5`[ A–Áˆ!? BeCÛ‘ %VìI+ ,%A“aM9J-±auA XA”A!~™ŽAAç%N&ÐÕ%‰e nME§aÝ&”AO¡‚!U”A AJ!~!c „çAháÚô ÁA£", Sa…¬uÞ •éP!ë B)+ÁvaŒqpá/E#AÂÕ%Ý/ A%õÒ%ž!ŽÌQÀ!ùÉsı–ºAÙ  „¥ª•Ñ´|%Q&¬;/•ba¾a.A> XñáxáA„Mc ÉUÖ¡ç©—!ÌjAç™!Ì XåZñ,"–b)1!VL A95ŒiÝaW¶xA¹n!l nʼneFÁˆ-¸² AÄ!a½ ,A!i ,1ôAì¡ ,­àËò…¤AÓ¡oÕ\kAðv! B,Á´?5Œ%`E§A…"Ä!‰%µáƨaœ…S•º X!¢ynaRÅÚ!%Q& ¡¿É š%ˆa¥1ÎA! v9ÎAå !8Ê B!¢Å‡á¯µ€Ø …$a‹u!œ¡Ž4 ! BadaÄ ñ€²Ahš5`e ©-ÎÁ…A¼!z­ XÁ;á´&Ô !!ra u†¦ åL• A#Y…xõNE]!5Î6%Ii"X aÄA%!N™Ð!!¦!·÷ ° !nF!® ÞT!Ia÷¸ ±>üA{± ,eX _Q<X!4¡J ,ûÁ²!w!h !YÞ€"¨ mÙ)á* ,!JŽaŽ! Bá¦at!é! ›Y"T%,ô)w ,Áa-yaA–‰ ,A %!áÕàÁ­!ÙUªa:A¸mA šj!"A%¡I =a× 4 A¿ 9Œ¡P¡-!‰U<Á !-Án& Á×ÁFA!O XaióÖX >!0A¼Ak ‰Š¡h!KÑžTAìAdaq ,à aŠ!IåI¬ao e~)º <Ã@"Ê!Âr!‚ ,!n¾^"š£ WÅ£-¸ß! Èõþ%A!'" UD¡BY”A¨aT”*® ;EqÕr!Ëá Q<ÁmE¡("D®! Ü<!!Fá§ ÁÚT?"Ø&ÆAaÔ ,+ A!AÞ¡õ ¡¦%_W-veÃ`"Âò u.s ‰A‘"h.áþáˆA²± n!ÅARt´ ÅšÕï"P g§ !K , aqÁZa’ AG: (!× æÆGA2 !ØÈ¢u !,_ %9"H iÝA© Ba!ˆá¸ˆ BAž!ý!!¹ Á¾‰ÏQa'M ˆ ,A A} Œñd!XÖ  ,ùÁŒkþ ¡(Ahaðᘠ!YAq9¢!Z!)µAM¥+ÁouDa"¡$!OÁ X…ºá1\• Õ…_ Vz!\ B!nÕa¯"Ì5¡§¡Üp !l ,I£aot ÇÁ6ÚÁ/±yœa®å z õþ?!üt5úAGAè‰$¶  Š "xEíû˜ °¡ºaîA#9¸Ð!C‚9viðÃE›BÁÝ!ˆAò"f!?ˆ‰&Ü,EŽt‘æ%¢!ÏÕ"Aa²Ü!» °!ra”=¦ ¡ =a›; šE-N E!¦AZ&º!Gu BANT MR¡PYa/AŠ ,PI!wÕöAû!AèA ,¥åAN Ï .a  ,!ñ!"%"ná¸Á¼!“ ,*“Eð"¾ a”a*Æ¡J ,g!¦ Aø Á!au A˜ !ñ¡%Aa» aÁA5!'u†kaõaý.0!A”a{ B AP!Êž Xð!ËȈ ¥auAEU<áó!ÒµÝ ,!„Œ!ü"| !0Aè¡ÊY”b!4a]¡E Bþ!å!‘"b„R!úA† ,!(É1!Hq²Ñ]¡ÊÆ ,a*aZá a‚!Ë5B )( "âÌApò ,!…Á?% "¨aDÁØ · ,AÍAð!FaH©ò A½C¹(A‰!9¬"R ¬!ÞÅJ™æBASÕ\E~!å!x"è/ará „eÁ]µ!>:´! ,mm E¯"\!Ø€ ,AúÇ ó¹€Az ^µjávIh%e-Aa Œ7 X%Ÿg!ÏÕÊÿ!½ažn!±a¯á"t ¨¿I(1¢aeÁœ!&â-ÁGï9ú!ž¡“ ›MÖýAå´af °¡|%É¡luÈÜ !õ8)óE¡È B Á¯!#aw AèÉÜ!¬÷ž¡Ü ,6aa®A¶ AŸaï!\A. ­8‡&ˆ%!a%P X¦ú!Æ¡Q!M€ a X8p!_! I«Å_!h !á|"Ž!p %Î" EãAÅuaR®Z XÔA~Aú aþA~©DQ~„¡>Å"6A‘!³áÁ4 B!\|¡Â.,A’.qX Ad¬að¶ B!La˜¡, a;"Ö & WeEQ<…È!a¡‰™Ð%aAŽ!¤,™%ÉAOUÖU 0A¬ ÜA”! 4@ š!AO !µÚÁ‹u†A£!‰å×"‚ýa®¡¿¡— Bm!òU xÏA ¡xPiæ AQ(a/.îSs %d Bá¢i¹ XÁ•A*€A= ,%òÅ,eö !)Adä ,y!õAð A‘!þ!! ýá A€"p!žƒb "Ì aÆ)§…= B>Œ5 XAÚA, I"AºAB14 A@¥´µ–!µÁ!' Bb\ÛA  (Á¼ a†)xa8õ¼aƒ.6¹!|µ–!Ïg""š,,!KAA¬ n)ÄaË¡=14aìàaða2 , A½áO"ð![!,Áö!! ,‚„eã"f d $[Ž24" A,TCGGCCAACAGGT-1CCGCTTACCTCACTCT A(GTGCTAATTAA 8GGTGAAGTACAGGGA ,GCTGT&CTGGCCC ,AACATCTCCGG ,T?ATGA ,TTCGŒs B€GTAGCT yGG CCG ,GT}Gi CGAG ,CGG‡TArA ,(TGCGACACCCTc BC%GÝ TCGC,CtCTA9hTA TCAT X!CT 2TGXG)K CCAT¸ nLG%w BC!_!/AG%‘ ,TA°!¦!j,G!™ÆG!— X Ý!¶1ÎTØ1AG!K X!r ‡14!ECGT%GTTT ,AØ!!ìCC%5­W )œð!¹G ÜòTG!ëQÁ9-AûB&ø cA{-"& !ÜÏ aÇ!§XPÐ ¡QÀ-¡Á01JÑaA¢ AQÀaáa_– X !Ü…9yôïÍaŸAÆ¡`y͸ B!µA¥E'&t házAñ š…‡…E˜Uìè!è‰T"‚8% Þ „ !¯A oÜ(,òqZaAy!z¡ ò”ðA/n (5[±Âa©!]÷XðAL%H,Õ¡<¡.C„ÕE„1J!_!ÜE¹îu A:)"14!Œ!‹IyœA )_"¨ )I!D/„AÀeDAm• EΡ’ uœA;aAeI".wAaA \ )JAÀ5 J=OÆb ,a*j AV!b BA¢¡B!! )EïI ªAha´ Í m9`W¡r,®%üÁÕ X!rÁ³U7 XáÒ!à!R°A!á"!RÁë ,AŽÁzÕ ÁáùA! EuEg¡l5äA!ŒAi"¨ aª^ ¡¨¡Í B¡O­ •¤é8gAÜT%¡gµ¬eªÁF¡™ !·aa7"¶ A"!ÏD „¡¨è A*a^ ë¡:! A² Eáêa¸Ü !Me ,!kAv!©t B2 ¡€ÀA• A‰å‘!61䤡—!IAï BA~a˜ ! ¡åŠáÓa á8WØ!@ARA=a[„!ÊG2¹(Á0!Ç!duZ¥:¡ !? nLA< 5¸¿Aaÿ=!þÁ~ n©!ÐÛ QÖ!)E'A:ù !‰A¼f Ù´%]A„Ñ ", …ýYA¨Xoar"Œ a/…ÕõNA !IØ °%ïE(@ÜÙ¡9‚!S ,!E!š!â4 Le+!¾„a$(!x ,E‰á]! "Œ X)vºòA}oû9‚kï, !HH ne®aíXÕžxaô.!Ú š¥!!Ê[ !Ý!š!‹‡ $!N)`QR!aÖžÁ ,¡6Aéf v AÊT…f": gŲßMRe.Navµ>&aÛB¡Ë XAAy!µ!é :A Y &< ¡c% Aˆ5ú!ü%¹‘L!àaI›òa|a1XYR„N Eg ò!ÂR¥C" í©5Ja…^a‘L}!±JÑžaR×ÁE¾ ò!¬a,©QRÛ!£; ,áÐA!e¡"üba% Õàæa€í Ù]±!c™ X!ó%¦-"V!Î…A "¾ %Û.¡©õ¼á\M!v½j3 ð™¤áüÁóAƒ°aÂAéAQ•üÅTa‡!5úa¼-K³Q<ÅŸ%Š¡/-4!,!ÁòA> òµAé!ð ¥ Ãaý"¢ )Ç!ŽA¬Ñz!ša c B¡NAd!\yÈœ àÁqÁN ,‰ !¨µ€$P]A÷ ,-!up!0a·E[%r˜!Ü!æÖ¤ aÜ!áAf5ú!¬ÁI!ùÏ „,AçAô! TEqp‡A ,‰Š!øñ Á!r¡ž!@ ,Á´ÁAN Å[I@A1ä!Ǫ!K"4 aÀAc "ÌØerAŰ¡R¡Ç ÝmœdP !IõE\ šA“an&f‹ )dÿ ,AHaDAðÁÍ B… !K6ÎAºAÚ!‰ùÒA!I¿ n™Á°| AàˆA/Ænað%e5Œa !B ¡+!¹‘Ðì!ÅC&ÐE5%Ž]&Á‰(Ak òá5A!§a´ ÁË ïEp íeÌwñ8EÑ| ÁoÕe*œa_q%¡?"ö!J!œ›ÕàÉBaXeþ š!G¡X!÷!@ ša¦a³qAm Ô\E.U”!!D¥-•æ­¾ïòÁ, !¢Á& XeTpA1¸aØÔatq ,-*Áû ‚!§ß &Ö…Ia°ñ ¾A%%vÙ#Ie" XëEMÈ.Ž!¡…ª; ,¡Ìaø< A@ êàEr-J!0!oeæ„AçENÁÿ"ò 8aaŠAC XAa¡Óam*ºkAwáÛ•Žl!"AÇ B¤!!RÁá AÖø AœAj ¡z!òaÌ¿!nØø !äAðšypå{APD•xÁ®Á!’õN…ŠÅVæ‘bië!†!¾!™ _aÎ „—AëAÒ°8x rB¥½ai%5Õr¡šbÕ\!â!±auÕ´aª!„¡~¿ „A½A@6 ¡áG à‘Ð!–!Î…_µ!+!…! BAì>al!Ö Á´A¥'™ÐE Ù•qZ>!aBu.AzÁu!1Õ X!ÙÇv á1ÁÙ)Ñ AK¨¡/ ,%sA&v %‰Ûe naÀ!Xk ¿B!yA™&^ ¾ÁÅÎÖ ,!Îa.¡ AŸ‰ ‚n AhÝY1ú)J †` Bf gETBašA+UÀ!)at%÷"Ž!Üa^‡!Ú X¡áçe"  !/![óA^ ,Ðe«ažu!û¥)uZaÄE¿"„ á0Ä ý,a«¡Aõz¡(õM Gµ>!÷!¼A§UÀ!µ€ A‘"È&!aŒ!" Æa;¾5 ž%úu!a@!yaã BAÕAí"4 %G¡!·"¸ JYáëa  BA0øe·&2 A9GÁsBA‰µD&¬%˜%ÍAÆ ÜiÛaF!:±î¥–½aÜ ¡Qeø!S5úa“Ç /a| °ãÇÅÓqp~aìá•8 ,a«A{!å? !³´ !°!ÇaJ™æyjA³5äa¶eÞõè)ˆRŠ¦Ž áGI˜qÞ!‹ypà”Â1på<Á{¿8  AU”,A¹ý"2 ¡%Î"Hº!ã!R!1%3AR§ -ÎA"A*%ú• ÀAaóᘠBAw¡ç%½µØ Aï!Ñ-vÁX!O) B!0AìeÐÕžxAÿ¡ó , A¦ÇAÅ ¡!w½¬A   U윓Î!® B“Á*1z ­E:aF1¸!?rsA˜ ,Á:ÿ%RqÁB!‡!ãa ,2¬a·URa!1Ë]~!Ü%öa‡¾ %4)"Ö¡b¯!RáW n¡" U<Áa¶A×d ,!]E—aÌ" !‰Åo!>Qª½Á¥C‘ aæ´p XÁAS¥U• A AüaÄZ ,ÓA¡o& “!wBÅ@ÉŠ°aãaæ*Œ×ì!©ÑÊÅX!½".jÝ Ý¥¿¡&!Ákõ ý¡é&Q‘Ó®i òE ¥} ¬A*áÒ9Î rAª BA<!F,‰²I(aM ,!ÉD½5 a9H A×!¼ a!N!4õ"!ˆˆalõ ,?´¥}"¾ 2 R ÷,ÿ!©K Bá1ÂAÆ"”ÑAïJ B¡A!÷ a2AÇ! !al?aü !A@eŒ1¢A¼!õAg! ,A!ޏ"V)AHa®äAY,![ö A‘6:!‹ Á2 ,!õ“A®U<±¡AÀ ,…q¥\14AÀÈA!d ,;u…vµ–Aé1)î ,AöaRa¡0 3( ß ,eV¡¼JuœA !!Áe BEú1å"| a…°á!a ,O!ý!:… ckE‡u²}AÕÆÜ AžAzAO  B!ܼ Ü9Œ!²Áq!wqp¿C !û!º B!0G"ºA3aóò!h ,ÁÅ+þ"ØŽ!Ç]õ"A1A‚­14! áÖA["îEìEÿ!çòê$!ª!8 „2…Pa¹(á±áÍuœÛE8%h±ÂA! ¡. X š¡•Á a°ó@eÊ¡—±>…CaD!Á"|{!s µ(Ea'c ÁŠ n!žº!{v áFWu!oáÖJ ,Òš!á.¬B¡œA)Q Œ Š&t !a1e¦-A¥!\A¡ó nAL &0*aÅí õd:!3u X¡ ! XáÊå&Éb Ü­aøTAÜ ,P m)> A¥ý! "$ aÒ!ûA<¡Ü ,%!…A”Uç A,,EH©‚¡á ,aj¡ AÞ&â `i3aF-`!–;ax¥ B%-O A©!0a: i!¦¡!Ä E{!cð!aÀ!HG ,!à´n":EŸñAO*ð¡Mý ‘æÁ0¾! „ciÙa´â AèAea®4„…F…û½îAt!.a¤•b!¸ÖáÏ"|  %±á ÆÁ}!]A!º na™‰ uuZf¡çÅÎÕʉ_!bq†¤Ô N Á` X¶ASeY&Ê!—!åá"ˆ¼ añ¡"A&aœ!éF X(ÅFA• A&2 _Æ > á=a B!ò¡,Ap! %ó½ÈjÀ aÙ5vAAaøaG Be@ ETñzaÄ¡±!@ ,ÂõA?*Œ a˜!þa¼¦A^¡c¥k&¨ +aŸÁŽnAOaª¡’!À n!B¡„!ŸaÐ !UAKa"(ƒEÙò2´¡u ! BT!!2 !Æ¥Ã!‰*’N ,eq† °%š A³"Aùa2!ÖY!¼"0Ah!BçAŠ ÆERA#au.áE¹!f"Œ aèAà r B|ï&•x “ I0 ,!ú+eq]aÊ…Nº ,¡ª"®Ü'á÷¯Æ ,e˜e‘6ÁA!q_ ,!âĸQÖåEÜ &œ?A¦A‡5Œeaßw XAì_›¬ –á¸!Œ E8ÁY ÖaA&Qª%™ B!ÊE<&F!˜ Ý"° AQÊ€’ „%5IëÁ ¡g·¸A[ A5aí AH Æ!¥Á…!! A´>Á£¡ö !µˆ&25…uS¶yDeÅAP- X¡‹¡ÇAZyD­A½ái"X !Æ—óa9 „AìF Á³AU  ¡6ΡB T%£Õ1M …KõáIçx"léAîA½5Œ!Ta²ER5äE !f!>‘ —ଠšÖ˜ ^ !ÜŸ áAl ,¡7A%^"蘄ѹ ,kÅP BÁ|!1A-,á^ö!g°¥Á÷ µ–!òEk!¦"¤ÑA9Y‘ºÁF%8)ù nAþ¡¼©ˆQŠ¥¬âBá¢ÁnÍAF °Áí¡óÍ"^  kû "¬!›A—Éñ¦²!°E™ e¶)y n!­aj%¹X A`E¼!GU&%ÄeÉü B!VE© XAh! ^!& , eâ {,' Ÿ!5"Ž0UEî "& a&’eb5ÎeRE§ac1äAFxG¦ „áeÁG!§Xa®I v"Ì D!½U&ááRá X;Áî©A? Am5"vh á%85!¡OŽ !— B!ë!P•Ž”!û- ÜI3AýV.0¡Ùá&E Xîamc!HøA­„…ÜÇàQ&¡^…c:™6QÀ!9"¦­…ÔA•,á3ê!r!þ „¡'e´&Îý p!cÑrÁU족a B Å…A},(ARE©u†a+?ÁÐN B½!oA‘& ØABÁ’QÀ¡ýV¡± BóaÝ1Œ ¡B°• , °!w „A­A8Š ,h¦ -Îaè!Œ. AE ,!„³Apaâ d%5  AÌÜÁ¼&Z$%ÏKa®!ž}ao£ X›:Áa —A Ë"~ %A!&jG A5ð"` c! ¡,' X…ba_!§Ba¡ee6"C :  BD ¡ÚÁÿ1JÁ¸#; ,A‘aXY!K aOár¡A= !rA×A† iö!u g!ñ“ IªáüEypA¿AægBA¥ „ B#a‰xß X4 !!!þ !Ja‡!ª!& !5A'Aqµ(!Taä ,!zïá’ ¡x ²Ú1`b×¥)‘ºAžìr&ŠxÕA9uD…õ!‘?"²eë†"ð–!r]j š­!ÊA> Æa®Bê&ò Axa¬a‡U&áEÁˆmA XR!W"ú ¡Ra]¡”¹j,a_AA°aÄa<ý! X!¹; &8> !ûáÕ¡¢î!d¡È BðaataÓ %Ã!½Ü  Á¡A®É ,AK ÈXa›Á†¡Aò AG€¡ªAÆ Báþa±´, YÁr"Þ%µá Q&iEÁuA¡ÅB¥.¹–m¸^ n!,aÖò!l ¨%o!w"r¡>!á%n0 ¡‚!Qyœ!Þ!/éX¡ %|=vaYaHax]ì!Ü u.A´! X§7¡Á1 % aqp"aÞ!þá~ ,'ÁvAÚ× Ah>&| IAÇÅ» ,Aÿ"AReiÏõz!¸!.!RG BeUa„"n ¨ð¡gÙr¡zá¹"€Ñ%噤E½0õþ!!ÁO=ä!Ï]Á\-J!\!n)çBa=e®\"@Øåeá&"$ bm¡öA òa!`Y•ü Ô!–$%)ò4": šÊ !i5v÷…JD nÃW¯! a+á½á!• fIõþi+e°Aª-¸Ü¡½àó BAá9AÓA£. aR“AØ"¸ eT¿!Ô5`A YA© °!!G¶ „Å}³ ¸1ÎÜ%q!Nn¡H!F¿ "Œ-V´8 X! (%¤&¦‘ A2 B¨aõAÿUh…Éeƒô M<åúeID1¢']ý X!E8a¯")!iÊ … %^ð!.Ù „y ÁÜa!µ>ê %¼.Àx iÈqp¼Ê(Aj °§!\A. aX!±]Æg!C¡iÙF-È ø$ A!° XP!ñ y‰ !)Mì ¡!#"@!ßCA¾&“Áåa"2 AROó nÁXêtu aaKñþAcሢ"€!Ü ÁW BeªEéð1ÎA\aÉå*YÖ;²Áý±Â…2î o14±+ÃU~!B%ËÇ ½¬ ¯)õ¦iØ!$– °!å¡–•æ&ná|šA#!ùE–&|aXã!Ð&” å¯a1þ ±ú !å)4aâÀaü ˜o² AÄ å¡¡áƒu.ÁV!à°aË ,!k- úu.$ᦀ9JZ/A!k BAÀAÙ; a Üï á”Uh¤ÞaF•Ž Q…º!ê B!­A Z-d!Afyô¥¹Ä!k š¬Awá !î Xn¥!Á´"t  !"©1ŒGÁ(Õ A@ Bao%ªup?QAup!îAë!ŸA® B!já¦áX !ja2A†I  A8Eš¥Û!Ô‘LAžAçúuD¡4Á4¹ X ÙA>!îuDÌAéaZ"ÈŽ%³Aq„AåEÙ!ÿÕÊ>AÑr¥P¥ƒñÒA½!È!Fó šA]Án…P"ö5ÞÌõþ– -´M~Ah0ä!S XaÅA  nÁ°Æâµ¬°ª ²& "ª ná ¡­!Ð.báý%è¡3 „áÉ!\!@ ‰†aÙ@U~§a°…ŒñdjUäA* B!r!` E XEKxè • A!.Að=Î%AòÂBnˆAË n0 ! Áša· ô Ee -`$ÚŽ!Ò ,† a˜q2 ÖÝÌf ½àåUý8!oaÅAÊ5Œ„åA| ¡–+’S nc ÅJ1"œÞañ%v&¶ÁCa„!è"’ c! BµØu!,a†¡± n¥–q‹up%v¡lÁb"< ¡‘A5u Bü¡:!"AÚ ŽA[AÑaÎ!¿ B³Ÿ!2!> ,ÕÉs X¡ ²!{5,laAQªÁòx¡ ,AAßÙ\A Ae°1¸Ê%F¡ouÞ!J!!ª¯XAº!2V!\a\!Ð ,Žajaa‰ A~¡$û !­œa r nDe…ø Aà:6a ,A5á1á]Ã"@–$J94ü%ÿ"^ a9%sa¹(õ !I*6eÊ!!?1vIá“-t/Eê™Ð…“!µ"dÁÝAåÜ Aâ ò!náŠe" EeÌõò¡"!{ B!¯q­A* …É!‘a[„üA'¥5: \ aä­ BŒ –Eš naèAhaÍab ,ðÁ?©AÇ *¾)Uª±I a*>e÷ÁÍ B'N!½!@ Â% q": A`!o"#!·AÙ Á BU×> E`A5U‰%^å1`fÁ! ,cÁ!`ˆ X ‰Õ A1á:•LYAaÔ ,›j¡k"æ!JaÛeã9Î!1aÚ) nÁQóIAÜ XaeÅE*µ(eXtE ,%K!]¹î!÷a³í}p!AÙÒ!¸aŠ!L!cXí‡Åù À :ŒA) !‚Û%¸n!B%vá$"^  !ÊÇ_ B:A‰ A® ¡6—¨5ŒÔá©…©"„ )AA14)vE,! XamIØÆ BØl UÀ%Ìa¬ °aóá4Æ×!çD -¢ A¡©!a ÜAx…e "¾ AMx¡¬H ,>ˆ ÁÊAÉ aíðI•EH!İy¡XÁ-"ÂE%ÁE«14hŽ T naA`‰A² !¢r!"v A"•»°¬•A— B%®Á*!vùz<¥˜áü ÚÉ!4Aø B!,D !¤` ¡Øf ô ÃAW¢ ;!£¡v Ar!v!8! ï!(‰‘&!ÂQh–2 !G¡4 ,a“A9UF AŠ!Yˆ"At[AS,' š Âa@a cº •¤EÀŶ!ŽQª£a!û>Báä Æ¡×¡¥E?"Ö a RA 2š¡¹}à BAòø 4 °%l oA !ˆ;¹! áŒ!å!ŠYÖó_áÔuZaÚ1Ì B…³( ]„%¶‰A©1ÎAª…Ðã"ˆ…b¡š…9¸‰"a Xå1+%:q²ARÁAÛ! šai!µ¼ qÈEì àuÞ~Ž‘ºÁ°á7‡"” A%lXaœ‹: AE „áA 0¹Â!ËÁ± ƒÜ» aÁar"\A_AéIWf |Ápò"ì !ÊAèÁÁÍ„‘µ%Ø RaSAeÆaèÁJ%s"ø '%ÌA¿*„ÚIAaÍ X£ !3„!åAå_Õ!òTE¬" ¡¾%¡Ä"„ —…–•æ!ŒAAèX²VAS„…ug1nä! È-×- atq.åp¥²%) òœ Aç!Ö5 ˜ )a6 !jaf‹ Ã…ÁÓ": ÁøaÚA² ,!,Za± .:Aþ j ¡AÁ!’  àJ¡l Iaø!R ‰³A¯q dž«1¬0 !Ön ,!Êa…\5ú6! "XI %ø¡· nÁ€9 X¡d Ð, aØ¡ƒq.RA ! ,!ù îa| ¡Ô)!ùÙˆz)‘, š–e×õ>Á?%ÊB¿%ó!b&œ%BÁAö~ | áûw,‹!"™¡Ã °!\¤i^Œ 5A`A½Ý´eA¬!S"²Å;%á¿™ü)³ˆºï¡Ýˆ&ˆ%]…a-Œv +E"ôAú%÷Y1äAža‚á Ü®a@AzÑ Wˆe6òAåAûß"VEarHõd,\ ™üA;¼5!¢aó\!× „¡g!]aã! Å?…Ò!3¢ ej†±î©AR?!®B¡ÑAŽUÀ’apA="l!€á‰Í!” BM!C¡!’ ¥êIW¡Ä ,AÌ-¡ ÆÁAvE’"`-AÖ%Œaß9v¥ªaúŸ1ÎiA! ÜÁ¨%£¡%ùè!Ýß!w&¢ E=AƒÞ B!vA ýa Ü"H ÌaJ á!Ç› 5ÎAŸÉ‡æ°½A4x B¡%AÚ%ÒYª›Ö!éø X…a‹=4!îùÆá·!÷ßaÐ nA\ alÁh Ñ¡Ý*Ì¡%!ã1ÎaÅ7Õà!œaüÜ!4!Æá n¡^º¡X! a'Á]Gé !å¡ç!]U&E»AM "Î %Ãá•5v!¤ aÊ"hŒ A¬A] nØ!1!}F œ‹aÉy.&]!45¸fÆg BZ !ô‘º!!ž\A ,!AÔá`Aƒ Áá²ó*2 Õ¬25ú!!Ca`uE !=54î¬A;¡Ü nñÐ A"p9$µ# ,ÆA!– PEÚ)Ô ÜÁm;e6u†ê·5 B!µA€‡ù a²¡ÃióM&AJÁn’  ,)Ä!ñN¬a(aE5 ,! ñ"éKÚ ù ,áè¤/ aV¥ß5Œ{œÕžaÞaõá»a¹ Bï!o!Žõ8: !FàA˜ ,E&!L°AΡr,eÛh5ű‰!‚ Xá!Ë™LAwa+UÀ!´A!èA  B)™EíãM!rAÁþ· ,!*Á·  )¡ÁÉaû a®sÅN" e%aZµ(¡$_ åQ~Ű;kUI½¼ !",)õ2eˆ ÜÅ! Å÷õz$ H+Ý °EÁˆ&h a¥—A™1¢ÅÅAüe.¹î„!¨…d„¡ៅ"°Acu!&Ä!Þ¬I¯Ñˆá…amÁÝA‚ °ÿ±! &Œ"›Ÿ ÕTA¸©–"@A÷AåU"ˆ«¡òaJ n@!ÝÀy ‹²a&ØaÓÅé9®A}ð14:Að¥VE ¡Ç%a‚aWž£„_œešd !Ëa¡„!ô,a+uôa†!]•a XA¡ÁEÉ8Xa“!¹äÕž!—!´XAè!”URáda7 ! nëaE¡"ò a‘ÅŒÅN"2 ¡ë!¦ , aÐ t ´)!Ô¡a¹ •eA¾=` ž ÁÜÅ8 Bé…’!"Ô !·AÄ¡ØÁ ,¥áÖ¯"Ì áÊÁVb ,%Z `qÈ!õ¡U!JÁù ,!ÏAÿ!ÓU<„Á›JAÈ ,AáN.Ö”?‡"J aðA£A°µ–ï Ü/ X!s¡’!s!© iAªaµ@!ˆ!F!^9Œa&År!"Ìáš‚ ‰išÁ¡ëAO"t òÞeLÙ´I=$ü °Ac!KAô§ °!C‰ ‘6Az!þ!$5 ,AÕœ °9 !+%AÀ• â aUXÁý ,!u%á!Ð"š !ÆAÕáQ ,$aI… ‚a*!òaæ , !%Ìy²ÁÁ²Až%Òa»*2 Ö0!a54Á!÷%§‘x!>êalŒ „¡_~ÅœÕÂeÆM ,Ü¥B£"ý黌4 ¡P%¸yœØ!]K*.I¾% uDš!ÏH!U „ÁÜò EÓuD;!4¡i# ,¼á‹÷ A9A¹· YÀ!âA€•üý!å"*!ÇáH!8 Xɶ ›J 6Aìab!! ^ ¥C•b)'–B5a URaÚ žA¨,7e>áÕ š!Óa¼¹(Ù!Ì%ü šÐ > QO!]¡Æ ,EÄs"ú i=ÁËeˆ X…ßÑ!ÁYA«%Ë! Qªa†áI¡ÃA n!ah%v"Í! \¡F ,2 ¦! ÆaðA!vY&!JÁ¢AhA' BAžA ! °%±!¼ "š ,¥kÁ\.˜!úAà Æ|A !a¸ n%AåÅÿuDY…a¡1J¡7ÜA!y B»ï µjE¼E–¥œ Ü!ä!`¡g³ B%)9E„ A¼Ah!v¹ eaa\•¤A%ÒaÅ"DA4!Óö Bè!Ï€,eõE…§ ,!-„…–õ¼+Ah÷54!áa&˜¡ª¿!O"†ÄmÁÊ"V¡ê·£ °a– E‚&2 ã át¡ò ¼árA8Áä Ba‚Ü_,A0’-A  ,!0 AZ iJ M1În!…Cõþ¥b!õ Õ0Á¡ÎAt XAyál !WA;!â ![O ¡…z !s)J áŒ!0%c"¢ ÁCANIAÝ ,„Aý!8 ¡°!Ž5¢¨aSAac ,!A¢!a zAî!ñ}áé!h[ , $t!¤ AµÀA  ,Ô!Í¡, !aœI*1¢VƒN ,)ÁHeDqÞ!¢áÌ%NUìARÙ±"€A"%d®Ü!Ba61 n_¡†" iĦ åì-¸jÉ " Aÿ%váûµ¬¡H!on n±…P4õèÁÂ!-¡ä ,!Ãe%c BÙAUá4» ,!­î!!Ð AÒEìÁà"< !nA½E«"V¥)!^YA2Aï¤&H þaTÞ °!*¡ËU”a¦EaùB&dB #a` ò¡^ ±!è ܵÜá a¤qñAYñþ ›!#5¢…³%.Amnaéi ᥠXa!F$ A— a•!Ü!_aº “G!Ë"¼!¢EÿeÑö»U%ØB-W/ XêáA~ !DEÏEØòÉ›Áô*Qaª!  nÁ­a0e5Œë¡Y!i&ÆÁ>{¥µUhAáe!»BAu[EeBê!dE» „è-A„ !(A“!0 c!´!è ½Õ S!è aèiC qÈ™I±.N8AAGTGCATCTACA-1„Ž,€N6(TTGTTTGTGTAAATTC-1AAACAACGAATAGTTC-1Â?ôÁ€N  €@ €8 (€À€x H€ @*€¸ h€ À:€ø ˆ€@J€ 8( ¨€ÀZ€ x0 È€@j€ ¸8 è€Àz€ø@ !@Š€8H (%Àš€xP H)@ª€¸X h-Àº€ø` ˆ1@Ê€8h ¨5ÀÚ€xp È9@ꀸx è=Àú€ø€ ‚A@ !8ˆ (‚EÀ#x H‚I@ *%¸˜ h‚MÀ :'ø  ˆ‚Q@ J)8¨ ¨‚UÀ Z+x° È‚Y@ j-¸¸ è‚]À z/øÀ ƒa@ Š18È (ƒeÀ š3xÐ Hƒi@ ª5¸Ø hƒmÀ º7øà ˆƒq@Ê98è ¨ƒuÀÚ;xð ȃy@ê=¸ø èƒ}Àú?ø! „@ ‚A8!!(„…À‚Cx!"H„‰@*‚E¸!#h„À:‚Gø !$ˆ„‘@J‚I8 (!%¨„•ÀZ‚Kx 0!&È„™@j‚M¸ 8!'è„Àz‚Oø @!(…¡@Š‚Q8 H!)(…¥Àš‚Sx P!*H…©@ª‚U¸ X!+h…­Àº‚Wø `!,ˆ…±@Ê‚Y8 h!-¨…µÀÚ‚[x p!.È…¹@ê‚]¸ x!/è…½Àú‚_ø €!0†Á@ ƒa8 ˆ!1(†ÅÀƒcx !2H†É@*ƒe¸ ˜!3h†ÍÀ:ƒgø  !4ˆ†Ñ@Jƒi8 ¨!5¨†ÕÀZƒkx °!6ȆÙ@jƒm¸ ¸!7è†ÝÀzƒoø À!8‡á@Šƒq8È!9(‡åÀšƒsxÐ!:H‡é@ªƒu¸Ø!;h‡íÀºƒwøà!<ˆ‡ñ@ʃy8è!=¨‡õÀÚƒ{xð!>ȇù@êƒ}¸ø!?è‡ýÀúƒø"@ˆA „8"A(ˆÁ „ƒx"BHˆ A!*„…¸"Chˆ Á!:„‡ø "DˆˆA"J„‰8("E¨ˆÁ"Z„‹x0"FȈA#j„¸8"GèˆÁ#z„ø@"H‰!A$Š„‘8H"I(‰%Á$š„“xP"JH‰)A%ª„•¸X"Kh‰-Á%º„—ø`"Lˆ‰1A&Ê„™8h"M¨‰5Á&Ú„›xp"Nȉ9A'ꄸx"Oè‰=Á'ú„Ÿø€"PŠAA( …¡8ˆ"Q(ŠEÁ(…£x"RHŠIA)*…¥¸˜"ShŠMÁ):…§ø "TˆŠQA*J…©8¨"U¨ŠUÁ*Z…«x°"VÈŠYA+j…­¸¸"WèŠ]Á+z…¯øÀ"X‹aA,Š…±8È"Y(‹eÁ,š…³xÐ"ZH‹iA-ª…µ¸Ø"[h‹mÁ-º…·øà"\ˆ‹qA.Ê…¹8è"]¨‹uÁ.Ú…»xð"^È‹yA/ê…½¸ø"_è‹}Á/ú…¿ø#`ŒA0 †Á8#a(Œ…Á0†Ãx#bHŒ‰A1*†Å¸#chŒÁ1:†Çø #dˆŒ‘A2J†É8(#e¨Œ•Á2Z†Ëx0#fÈŒ™A3j†Í¸8#gèŒÁ3z†Ïø@#h¡A4ІÑ8H#i(¥Á4š†ÓxP#jH©A5ª†Õ¸X#kh­Á5º†×ø`#lˆ±A6ʆÙ8h#m¨µÁ6Ú†Ûxp#nȹA7ê†Ý¸x#oè½Á7ú†ßø€#pŽÁA8 ‡á8ˆ#q(ŽÅÁ8‡ãx#rHŽÉA9*‡å¸˜#shŽÍÁ9:‡çø #tˆŽÑA:J‡é8¨#u¨ŽÕÁ:Z‡ëx°#vÈŽÙA;j‡í¸¸#wèŽÝÁ;z‡ïøÀ#xáA<Їñ8È#y(åÁ<š‡óxÐ#zHéA=ª‡õ¸Ø#{híÁ=º‡÷øà#|ˆñA>ʇù8è#}¨õÁ>Ú‡ûxð#~ÈùA?ê‡ý¸ø#èýÁ?ú‡ÿø$€B@ ˆ9 $(Â@ˆy $‚H BA*ˆ¹ $ƒh ÂA:ˆù $„ˆBBJˆ 9!($…¨ÂBZˆ y!0$†ÈBCjˆ ¹!8$‡èÂCzˆù!@$ˆ‘!BDŠˆ9"H$‰(‘%ÂDšˆy"P$ŠH‘)BEªˆ¹"X$‹h‘-ÂEºˆù"`$Œˆ‘1BFʈ9#h$¨‘5ÂFÚˆy#p$ŽÈ‘9BGꈹ#x$è‘=ÂGúˆù#€$’ABH ‰!9$ˆ$‘(’EÂH‰#y$$’H’IBI*‰%¹$˜$“h’MÂI:‰'ù$ $”ˆ’QBJJ‰)9%¨$•¨’UÂJZ‰+y%°$–È’YBKj‰-¹%¸$—è’]ÂKz‰/ù%À$˜“aBLЉ19&È$™(“eÂLš‰3y&Ð$šH“iBMª‰5¹&Ø$›h“mÂMº‰7ù&à$œˆ“qBNʉ99'è$¨“uÂNÚ‰;y'ð$žÈ“yBOê‰=¹'ø$Ÿè“}ÂOú‰?ù'% ”BP ŠA9(%¡(”…ÂPŠCy(%¢H”‰BQ*ŠE¹(%£h”ÂQ:ŠGù( %¤ˆ”‘BRJŠI9)(%¥¨”•ÂRZŠKy)0%¦È”™BSjŠM¹)8%§è”ÂSzŠOù)@%¨•¡BTŠŠQ9*H%©(•¥ÂTšŠSy*P%ªH•©BUªŠU¹*X%«h•­ÂUºŠWù*`%¬ˆ•±BVÊŠY9+h%­¨•µÂVÚŠ[y+p%®È•¹BWêŠ]¹+x%¯è•½ÂWúŠ_ù+€%°–ÁBX ‹a9,ˆ%±(–ÅÂX‹cy,%²H–ÉBY*‹e¹,˜%³h–ÍÂY:‹gù, %´ˆ–ÑBZJ‹i9-¨%µ¨–ÕÂZZ‹ky-°%¶È–ÙB[j‹m¹-¸%·è–ÝÂ[z‹où-À%¸—áB\Š‹q9.È%¹(—åÂ\š‹sy.Ð%ºH—éB]ª‹u¹.Ø%»h—íÂ]º‹wù.à%¼ˆ—ñB^Ê‹y9/è%½¨—õÂ^Ú‹{y/ð%¾È—ùB_ê‹}¹/ø%¿è—ýÂ_ú‹ù/&À˜C` Œ90&Á(˜Ã`Œƒy0&ÂH˜ Ca*Œ…¹0&Ãh˜ Ãa:Œ‡ù0 &Ĉ˜CbJŒ‰91(&Ũ˜ÃbZŒ‹y10&ÆÈ˜CcjŒ¹18&Çè˜ÃczŒù1@&È™!CdŠŒ‘92H&É(™%ÃdšŒ“y2P&ÊH™)CeªŒ•¹2X&Ëh™-ÃeºŒ—ù2`&̈™1CfÊŒ™93h&ͨ™5ÃfÚŒ›y3p&ÎÈ™9Cgꌹ3x&Ïè™=ÃgúŒŸù3€&КACh ¡94ˆ&Ñ(šEÃh£y4&ÒHšICi*¥¹4˜&ÓhšMÃi:§ù4 &ÔˆšQCjJ©95¨&Õ¨šUÃjZ«y5°&ÖÈšYCkj­¹5¸&×èš]Ãkz¯ù5À&Ø›aClб96È&Ù(›eÃlš³y6Ð&ÚH›iCmªµ¹6Ø&Ûh›mÃmº·ù6à&܈›qCnʹ97è&ݨ›uÃnÚ»y7ð&ÞÈ›yCoê½¹7ø&ßè›}Ãoú¿ù7'àœCp ŽÁ98'á(œ…ÃpŽÃy8'âHœ‰Cq*ŽÅ¹8'ãhœÃq:ŽÇù8 '䈜‘CrJŽÉ99('娜•ÃrZŽËy90'æÈœ™CsjŽÍ¹98'çèœÃszŽÏù9@'è¡CtŠŽÑ9:H'é(¥ÃtšŽÓy:P'êH©CuªŽÕ¹:X'ëh­ÃuºŽ×ù:`'숱CvÊŽÙ9;h'í¨µÃvÚŽÛy;p'îȹCwêŽÝ¹;x'ïè½ÃwúŽßù;€'ðžÁCx á9<ˆ'ñ(žÅÃxãy<'òHžÉCy*å¹<˜'óhžÍÃy:çù< 'ôˆžÑCzJé9=¨'õ¨žÕÃzZëy=°'öÈžÙC{jí¹=¸'÷èžÝÃ{zïù=À'øŸáC|Šñ9>È'ù(ŸåÃ|šóy>Ð'úHŸéC}ªõ¹>Ø'ûhŸíÃ}º÷ù>à'üˆŸñC~Êù9?è'ý¨ŸõÃ~Úûy?ð'þÈŸùCêý¹?ø'ÿèŸýÃúÿù?(  D€ :@() Ä€z@(I  D*º@(i  Ä:ú@ (‰ D‚J :A((© Ä‚Z zA0(É Dƒj ºA8(é ăzúA@( ¡!D„Š:BH( )¡%Ä„šzBP( I¡)D…ªºBX( i¡-Ä…ºúB`( ‰¡1D†Ê:Ch( ©¡5ĆÚzCp(É¡9D‡êºCx(é¡=ćúúC€( ¢ADˆ ‘!:Dˆ()¢EĈ‘#zD(I¢ID‰*‘%ºD˜(i¢Mĉ:‘'úD (‰¢QDŠJ‘):E¨(©¢UÄŠZ‘+zE°(É¢YD‹j‘-ºE¸(é¢]Ä‹z‘/úEÀ( £aDŒŠ‘1:FÈ()£eÄŒš‘3zFÐ(I£iDª‘5ºFØ(i£mĺ‘7úFà(‰£qDŽÊ‘9:Gè(©£uÄŽÚ‘;zGð(É£yDê‘=ºGø(é£}Äú‘?úG) ¤D ’A:H)!)¤…Ä’CzH)"I¤‰D‘*’EºH)#i¤Ä‘:’GúH )$‰¤‘D’J’I:I()%©¤•Ä’Z’KzI0)&ɤ™D“j’MºI8)'é¤Ä“z’OúI@)( ¥¡D”Š’Q:JH)))¥¥Ä”š’SzJP)*I¥©D•ª’UºJX)+i¥­Ä•º’WúJ`),‰¥±D–Ê’Y:Kh)-©¥µÄ–Ú’[zKp).É¥¹D—ê’]ºKx)/饽ėú’_úK€)0 ¦ÁD˜ “a:Lˆ)1)¦ÅĘ“czL)2I¦ÉD™*“eºL˜)3i¦ÍÄ™:“gúL )4‰¦ÑDšJ“i:M¨)5©¦ÕÄšZ“kzM°)6ɦÙD›j“mºM¸)7é¦ÝÄ›z“oúMÀ)8 §áDœŠ“q:NÈ)9)§åÄœš“szNÐ):I§éDª“uºNØ);i§íĺ“wúNà)<‰§ñDžÊ“y:Oè)=©§õÄžÚ“{zOð)>ɧùDŸê“}ºOø)?é§ýÄŸú“úO*@ ¨E  ”:P*A)¨Å ”ƒzP*BI¨ E¡*”…ºP*Ci¨ Å¡:”‡úP *D‰¨E¢J”‰:Q(*E©¨Å¢Z”‹zQ0*FɨE£j”ºQ8*Gé¨Å£z”úQ@*H ©!E¤Š”‘:RH*I)©%Ťš”“zRP*JI©)E¥ª”•ºRX*Ki©-Å¥º”—úR`*L‰©1E¦Ê”™:Sh*M©©5Ŧڔ›zSp*NÉ©9E§ê”ºSx*Oé©=ŧú”ŸúS€*P ªAE¨ •¡:Tˆ*Q)ªEŨ•£zT*RIªIE©*•¥ºT˜*SiªMÅ©:•§úT *T‰ªQEªJ•©:U¨*U©ªUŪZ•«zU°*VɪYE«j•­ºU¸*Wéª]Å«z•¯úUÀ*X «aE¬Š•±:VÈ*Y)«eŬš•³zVÐ*ZI«iE­ª•µºVØ*[i«mÅ­º•·úVà*\‰«qE®Ê•¹:Wè*]©«uŮڕ»zWð*^É«yE¯ê•½ºWø*_é«}ůú•¿úW+` ¬E° –Á:X+a)¬…Ű–ÃzX+bI¬‰E±*–źX+ci¬Å±:–ÇúX +d‰¬‘E²J–É:Y(+e©¬•ŲZ–ËzY0+fɬ™E³j–ͺY8+gé¬Å³z–ÏúY@+h ­¡E´Š–Ñ:ZH+i)­¥Å´š–ÓzZP+jI­©Eµª–ÕºZX+ki­­Åµº–×úZ`+l‰­±E¶Ê–Ù:[h+m©­µÅ¶Ú–Ûz[p+nÉ­¹E·ê–ݺ[x+o魽ŷú–ßú[€+p ®ÁE¸ —á:\ˆ+q)®ÅŸ—ãz\+rI®ÉE¹*—åº\˜+si®ÍŹ:—çú\ +t‰®ÑEºJ—é:]¨+u©®ÕźZ—ëz]°+vÉ®ÙE»j—íº]¸+wé®ÝÅ»z—ïú]À+x ¯áE¼Š—ñ:^È+y)¯åżš—óz^Ð+zI¯éE½ª—õº^Ø+{i¯íŽº—÷ú^à+|‰¯ñE¾Ê—ù:_è+}©¯õžڗûz_ð+~ɯùE¿ê—ýº_ø+é¯ýÅ¿ú—ÿú_,€ °FÀ ˜;`,)°ÆÀ˜{`,‚I° FÁ*˜»`,ƒi° ÆÁ:˜û` ,„‰°FÂJ˜ ;a(,…©°ÆÂZ˜ {a0,†É°FÃj˜ »a8,‡é°ÆÃz˜ûa@,ˆ ±!FÄŠ˜;bH,‰)±%ÆÄš˜{bP,ŠI±)FŪ˜»bX,‹i±-ÆÅº˜ûb`,Œ‰±1FÆÊ˜;ch,©±5ÆÆÚ˜{cp,ŽÉ±9FÇ꘻cx,é±=ÆÇú˜ûc€, ²AFÈ ™!;dˆ,‘)²EÆÈ™#{d,’I²IFÉ*™%»d˜,“i²MÆÉ:™'ûd ,”‰²QFÊJ™);e¨,•©²UÆÊZ™+{e°,–ɲYFËj™-»e¸,—é²]ÆËz™/ûeÀ,˜ ³aFÌŠ™1;fÈ,™)³eÆÌš™3{fÐ,šI³iFͪ™5»fØ,›i³mÆÍº™7ûfà,œ‰³qFÎÊ™9;gè,©³uÆÎÚ™;{gð,žÉ³yFÏê™=»gø,Ÿé³}ÆÏú™?ûg-  ´FÐ šA;h-¡)´…ÆÐšC{h-¢I´‰FÑ*šE»h-£i´ÆÑ:šGûh -¤‰´‘FÒJšI;i(-¥©´•ÆÒZšK{i0-¦É´™FÓjšM»i8-§é´ÆÓzšOûi@-¨ µ¡FÔŠšQ;jH-©)µ¥ÆÔššS{jP-ªIµ©FÕªšU»jX-«iµ­ÆÕºšWûj`-¬‰µ±FÖÊšY;kh-­©µµÆÖÚš[{kp-®Éµ¹F×êš]»kx-¯éµ½Æ×úš_ûk€-° ¶ÁFØ ›a;lˆ-±)¶ÅÆØ›c{l-²I¶ÉFÙ*›e»l˜-³i¶ÍÆÙ:›gûl -´‰¶ÑFÚJ›i;m¨-µ©¶ÕÆÚZ›k{m°-¶É¶ÙFÛj›m»m¸-·é¶ÝÆÛz›oûmÀ-¸ ·áFÜŠ›q;nÈ-¹)·åÆÜš›s{nÐ-ºI·éFݪ›u»nØ-»i·íÆÝº›wûnà-¼‰·ñFÞÊ›y;oè-½©·õÆÞÚ›{{oð-¾É·ùFßê›}»oø-¿é·ýÆßú›ûo.À ¸Gà œ;p.Á)¸Çàœƒ{p.ÂI¸ Gá*œ…»p.Ãi¸ Çá:œ‡ûp .ĉ¸GâJœ‰;q(.Å©¸ÇâZœ‹{q0.ÆÉ¸Gãjœ»q8.Çé¸Çãzœûq@.È ¹!G䊜‘;rH.É)¹%Çäšœ“{rP.ÊI¹)G媜•»rX.Ëi¹-Ç府—ûr`.̉¹1GæÊœ™;sh.Í©¹5ÇæÚœ›{sp.Îɹ9Gçꜻsx.Ïé¹=ÇçúœŸûs€.Ð ºAGè ¡;tˆ.Ñ)ºEÇè£{t.ÒIºIGé*¥»t˜.ÓiºMÇé:§ût .Ô‰ºQGêJ©;u¨.Õ©ºUÇêZ«{u°.ÖɺYGëj­»u¸.×éº]Çëz¯ûuÀ.Ø »aG슱;vÈ.Ù)»eÇìš³{vÐ.ÚI»iGíªµ»vØ.Ûi»mÇíº·ûvà.܉»qGîʹ;wè.Ý©»uÇîÚ»{wð.ÞÉ»yGïê½»wø.ßé»}Çïú¿ûw/à ¼Gð žÁ;x/á)¼…ÇðžÃ{x/âI¼‰Gñ*žÅ»x/ãi¼Çñ:žÇûx /䉼‘GòJžÉ;y(/婼•ÇòZžË{y0/æÉ¼™GójžÍ»y8/çé¼ÇózžÏûy@/è ½¡GôŠžÑ;zH/é)½¥ÇôšžÓ{zP/êI½©GõªžÕ»zX/ëi½­Çõºž×ûz`/쉽±GöÊžÙ;{h/í©½µÇöÚžÛ{{p/îɽ¹G÷êžÝ»{x/ïé½½Ç÷úžßû{€/ð ¾ÁGø Ÿá;|ˆ/ñ)¾ÅÇøŸã{|/òI¾ÉGù*Ÿå»|˜/ói¾ÍÇù:Ÿçû| /ô‰¾ÑGúJŸé;}¨/õ©¾ÕÇúZŸë{}°/öɾÙGûjŸí»}¸/÷é¾ÝÇûzŸïû}À/ø ¿áGüŠŸñ;~È/ù)¿åÇüšŸó{~Ð/úI¿éGýªŸõ»~Ø/ûi¿íÇýºŸ÷û~à/ü‰¿ñGþÊŸù;è/ý©¿õÇþÚŸû{ð/þÉ¿ùGÿêŸý»ø/ÿé¿ýÇÿúŸÿû0 ÀH  <€0*ÀÈ |€0JÀ H+ ¼€0jÀ È; ü€ 0ŠÀHK  <(0ªÀÈ[  |00ÊÀHk  ¼80êÀÈ{ ü@0 Á!H‹ <‚H0 *Á%È› |‚P0 JÁ)H« ¼‚X0 jÁ-È» ü‚`0 ŠÁ1HË <ƒh0 ªÁ5ÈÛ |ƒp0ÊÁ9Hë ¼ƒx0êÁ=Èû üƒ€0 ÂAH ¡!<„ˆ0*ÂEÈ¡#|„0JÂIH +¡%¼„˜0jÂMÈ ;¡'ü„ 0ŠÂQH K¡)<…¨0ªÂUÈ [¡+|…°0ÊÂYH k¡-¼…¸0êÂ]È {¡/ü…À0 ÃaH ‹¡1<†È0*ÃeÈ ›¡3|†Ð0JÃiH «¡5¼†Ø0jÃmÈ »¡7ü†à0ŠÃqHË¡9<‡è0ªÃuÈÛ¡;|‡ð0ÊÃyHë¡=¼‡ø0êÃ}Èû¡?ü‡1 ÄH ¢A<ˆ1!*Ä…È¢C|ˆ1"JĉH+¢E¼ˆ1#jÄÈ;¢Güˆ 1$ŠÄ‘HK¢I<‰(1%ªÄ•È[¢K|‰01&ÊÄ™Hk¢M¼‰81'êÄÈ{¢Oü‰@1( Å¡H‹¢Q<ŠH1)*ťț¢S|ŠP1*JÅ©H«¢U¼ŠX1+jÅ­È»¢WüŠ`1,ŠÅ±HË¢Y<‹h1-ªÅµÈÛ¢[|‹p1.ÊŹHë¢]¼‹x1/êŽÈû¢_ü‹€10 ÆÁH £a<Œˆ11*ÆÅÈ£c|Œ12JÆÉH+£e¼Œ˜13jÆÍÈ;£güŒ 14ŠÆÑHK£i<¨15ªÆÕÈ[£k|°16ÊÆÙHk£m¼s¸17êÆÝÈ{£oüÀ18 ÇáH‹£q<ŽÈ19*ÇåÈ›£s|ŽÐ1:JÇéH«£u¼ŽØ1;jÇíÈ»£wüŽà1<ŠÇñHË£y<è1=ªÇõÈÛ£{|ð1>ÊÇùHë£}¼ø1?êÇýÈû£ü2@ ÈI ¤<2A*ÈÉ ¤ƒ|2BJÈ I!+¤…¼2CjÈ É!;¤‡ü 2DŠÈI"K¤‰<‘(2EªÈÉ"[¤‹|‘02FÊÈI#k¤¼‘82GêÈÉ#{¤ü‘@2H É!I$‹¤‘<’H2I*É%É$›¤“|’P2JJÉ)I%«¤•¼’X2KjÉ-É%»¤—ü’`2LŠÉ1I&ˤ™<“h2MªÉ5É&Û¤›|“p2NÊÉ9I'뤼“x2OêÉ=É'û¤Ÿü“€2P ÊAI( ¥¡<”ˆ2Q*ÊEÉ(¥£|”2RJÊII)+¥¥¼”˜2SjÊMÉ);¥§ü” 2TŠÊQI*K¥©<•¨2UªÊUÉ*[¥«|•°2VÊÊYI+k¥­¼•¸2WêÊ]É+{¥¯ü•À2X ËaI,‹¥±<–È2Y*ËeÉ,›¥³|–Ð2ZJËiI-«¥µ¼–Ø2[jËmÉ-»¥·ü–à2\ŠËqI.Ë¥¹<—è2]ªËuÉ.Û¥»|—ð2^ÊËyI/륽¼—ø2_êË}É/û¥¿ü—3` ÌI0 ¦Á<˜3a*Ì…É0¦Ã|˜3bJ̉I1+¦Å¼˜3cjÌÉ1;¦Çü˜ 3dŠÌ‘I2K¦É<™(3eªÌ•É2[¦Ë|™03fÊÌ™I3k¦Í¼™83gêÌÉ3{¦Ïü™@3h Í¡I4‹¦Ñ<šH3i*Í¥É4›¦Ó|šP3jJÍ©I5«¦Õ¼šX3kjÍ­É5»¦×üš`3lŠÍ±I6˦Ù<›h3mªÍµÉ6Û¦Û|›p3nÊ͹I7ë¦Ý¼›x3oêͽÉ7û¦ßü›&ðÍ 5barcode€Nª´èÍ&âÍ&6(TTGTTTGTGTAAATTC-1AAACAACGAATAGTTC-1,Lž ¨ ,€N(ôŽ€NH6¢ÎÎi]Ôy bZØO·Yn¤G~cÙ¤›‰[{¤9cV£÷_nØËà À½~/7Å^<ö3°»‹×NI·ŸíJ<Ì’ã!Ò¸“RA^$@…)œW¤>E¿vUÑyîJG{ì¢_ؤµ;˜M5:;Öø†JïÄètß—HØæ"›Ãt×Åj¾ŸTì;ì½jhÀî¨â„-…cä[¥YØÔåOçJÆs¢òÓ¼d§ ðu¬iÙ‰»2j„HÆÎÂMie«Ä£zC€†é¯¸‹´èx ™‹Ó9…oOCW%u‹ª—}–Cxí6$Ù^ŒXÚË#q t}¹¥Gå”;îXˆjÛ…Ý Z~«çx~VùT¡¼q5>¬ò’구V;{Æüˆ¹áÊ¥‹Ô×-Æ‚Êv=“L¾:"˜•W>áYmYu5‚G‚Üo¹×´=‹ƒÖmë°æ†_6zö÷H‘ü5uí‚ð"¦,ah÷ŠãM¾c‚ZÂ`D8R8Tã}¿ ‰ˆa øOŽàÊO?{œNKZ\Ïoš)в2‡Öl·K¹do€Ÿy¢Í `2 iSÖ‹*wZ-¶œCçAá÷Rp! BèmøsÊ ân;"«%>ž’"jý„ìí¶ÓJ¤âáš@®DœœC>Ó“åAqÆôx#[Õñxabëß,W#3‹nÝâñœ2&öÚ5 in_tissue€Nª ¸ &îÏ&¾Ï(,˜ LÆŒ Ðï›eAEs<V%(ð[΃PÏv‹øàj u-A·?9Ô}´_Dô+v™?H êY˜²S„‡ó¤Üq'n‡ˆ hx“b»T’ ©r8t4IŸ\Z"Oikc×C½“^_S; iQd@†B^O&,mF |¢ú‘¡›9>ȰºíŽF5TÇR#!Ýn2…Y‚E{ާ-0ñˆÄ;,(Q¥R\û3`KäÁ–6 užDŒÓØ.œa5g&ÛçI±âbëÚ%0Þ š•Z„H$ÿŠM¬< ËzW¦L~6/c pmG7]É+l” 8@"]¡™žroNÀ}=jÂ#Öùœ®a˜þýxJz‰¹p ü2!BÍ*Œy š—¶=£$(‚d`³gfLGhDŸy÷ª­Ñ¿…¢11ãÅ[”ÐU[îX3 Wlt'k+{Ê«Ùsò€¾:w•ÉÒì|q†’*V߃K.oŒðµ)/:‘NôwåÕX¼CöÆP¯è€Ìéf¸õ–>æŠU¨)ð~á7JM—„XŽX,€N¢(¢‚,ô€N @ €(XÀ ƒ"H˜@¡‚… 2hØ`a‡>€!b‰&N H¡b…-\¼ #†Œ4jظ#‡ŽÑ+ÛF+ZŠwTE´*Hs4 Ðò ¸¤Ý’~S‘GéGù\ ‘íØRCL7¬b‡áOS^ByÚÔZÕÜA•Ôà]5@"æH U4ꎤRL¥2‰Õª’’X•qµ)œ ’ÁšU’>eH¨ $ I›Öa ·9Ú¨Ó# ¸L¦ì4IM¢¨Ã ǵkÔ—/zåøËÖÒ|®½/ÀĦo`2£Hq„ePìX3‚Èšä§,Žž%%BŒg6‹9(>‹ðiLÎYb+®Ez÷ï#Ú´cÕú»–K™YM|#x0Û‚ÝÚFsK‡ÍÛ7¤à’ìÐÃ4°zú˜×AÏ[r)ÌÍç@š78дõ¶kí~¡>õIÕÏ,‘çèjËqÊS•øÉáY30´ }QE¥¨î1dÊÐ. / k’üYZ¶5\hеíÍ]¼fÜ ÆPà½3GIRËDwtožÉ»]0SuÕÓ»—ï[bxÚçvϳt+~9IwwÖÙ3†ŽPaÑÔ*Pæ6;Á¤= 3õmÈó\‡B.˜È 5%ù]£VÖ_½A¤ S+b†ÁIGjO\‚‹Þ Ω€SD¦, ˜¥Éôp´£)Êqj »*l–­¬²ˆ9;Ë+O¤ »š¦•R by¶XÇ0šÃJ,4‹xdU§^%ø•B5K5hå¾áîK+ìË]Wµ0„E“<&~R¼èSÀ‰üzé+s'j>®`—dq“XïLÄÇ8 Î7i2üªgS@CQ}n÷s,Û}´Ù-ô¨ ¡·¬f%s0Ç”¦½R`ÅX(GM`¸(µk¥<<’ Ã[7’Á£(b¤Pénãmýh+3j^£°ñ¬Åéø¦ «ø4nMôXä©£ò*%X¥Æª"p*’Ë1r?–tøù„ ÛСsÆ6Ü@u}ͳñÊ´ l´’œìèÆ+Ää1h°1Û­Û6y[eÕµD ÖñP¢–+C“ý±0£`߀Ò(çMáN ·,ÖJäú1–ˆ‹®òíW¹h˱OÎÈÅå8%O3:LÆìºÛê¼÷¯ŽÐ,ÕtœÐ™cw³üÅ/„<'äúA\G˜N’šËcpW8ºs$úàÉÒ™E“Ñpªy Öƒ‘tßòô²år¥‘ÆÊ¡Ë ãÓH|HI£„Ù‡&*ßDl™9ç"ÈZÅÀs2]pL@´ÉŠ6C”ˆÞÖ…ŽÂ‘£)Ѹ¸Ð1³åfšñÅе..£ø„|Xx÷X“ íx !€ Ë®#¡ úÜų€CÖ˜¥ÕÂC‘mA§¡•#8ç* ú `¥xˆCBéêÁíÌ©a‡x$ê¬Â7bdö*¥©ã~e°>•©H¬0MW´¿„KŠk†ß1'òè8´ìÎ$Q¨½:5Q² Eí²Éq–V&ß°Úº5Ö96»l3&Ê_áC=“JJ‘TÑP¬¶ûTt,e)eæ­zõƒ›Ç¸B‰Ø¨ˆ¢º–:IË0g¨äÊ äöÛÄ£Ú¿›,AäÀâLnFË}M”yÎâ5Cb•á‡ÉE—²Ü8A·fFDW,ß:ˆhœ#8®Þ]Àyë,WK.›¶ \²ÈS¬ì}Cìø2?ÑØ)°æÅ JûNŠSÝW( Ͼ¤•TÀJ‚µŒ„$¥"•h– 7’óO+{ªI²Û© þÖº¦±NÃfÙhس€±ŸšM C”â>KQDŠÆ³XÕH¼JVIëˆLC³¶cAå‘™Mu®ëiŽãK®Ki·Á ¸Î+*Ô*!bzÔ¶P´ˆnŠÕ…JÔéٕщCúQœ%Lc‰Yò¤)÷ÑcM\›|«ª.Å>Kg=꫈#ÃpšÔp1Äè.‹—|üÈmD‚Aâ-ê˜&+¸caãXŽËˆÆµÄ¥Únôsf•‹-PòÜdæ»d²\eÅj«5úˆðs'òв5ŽËI43/Z¼ ÊÀ…aT…4#œÊä8ÙC1*8µR¬vÔY)P:Ã\(°nú^̰@jû­1¨ÉΙ¥*±ΠSÎyb*Qybi {ѼeÔ€æoÆ´}nQr†¿Cµ)ÍÖF)‘L-Ì‹U±òH?@R †éÂþcó˜áÇÈpFÆ+µ§mCu9`´I‘áÁð&®-–,È:‹ºÐ–—Û•NPA”0Eq;¸€xù´¨M9D¦¼"ñè)_ɵŒ²;UÑLiÕàà,1…¬%@‰mðÒÖ^{‘¬Ñ´W³„1¬¦×É Æš5¸³ÉËÂ2,ÇÀÕ(Œ¢A”Á%,,ìˆ –êõÕæÒ˜ °ŒËQ£>68>: ÁÌ”P’D 9°‡CnÇ A`ƒÄ_à7Ò"°•ì‘Õp@9½Ð³3Q–Q|G}ÎÆ™Ãöž5wDœ˜¦è˜å¥ü„i´Î‚A‘7‹j<–NÖp{G=±JlÑb癆'C°1…Ø…‰ßåZóùÊã_¡iÍA àe“#"qƳ,)ƒ|(!(H4°è‘)*/àŠ€±"¨ñÁ…‡Î”ìðJ^ªY$cíå¼3×Â2Q¥Y±Ä#XS{p¾ÄQ Ò€ìza<õh—X²¶™ K„›Ê <¡y|*î3…þüqÓ’†S´n"=s£°h(Vd™à¹†®Ø¡Œ§ÈáÕI–'lÍ;™s¾µÃ0—u¢õÆš5F~6ô‘çhÖeóÖ¡M/Ÿ€h‚@¶HÍZad1k†-ëÏÁãVv l¸˜Å!˜M)ZŠ¡KˆIè…„êHª²Ÿ|”z›œRL@ÑZTc%ÞÜTÙB%Ÿ"Z‚1ǯA ›”ÄY²ƒÞÃqY*1Ʋ¨¸2‰yÜ'IºdY:à Eè£ct× —j YÆ?±Â¥|ÌáÖ*”Õ¹L4WäRÿ€8šmˆcub:ÒÔêQ,ðv< "…Q5; yX· ÐAæ¸H(ϘÔÐÁ3'¢K#¨j!z¨Ô«˜ô <Î¥¢hZ5kC§£²9¸½ú©­lñªð[™”^¡%œk1²CÙ(Ìòj:›Ž­A÷$ijˮ' ¾º²òHÕ³‘d¥¨h°Ú8Î>38EìÁD©;7%tƒ²B–bÔÚׯ®Q?Y²°Œ@—™­Ã…’>HœÄºÍso„œÆÐø}@wEW@A´âmë—ŒT@jÁ*“PfkqŒ46‘Ý6ñ*Κµm0ƒ0l„Û •«½qޏ¸éL¬ˆ0çz†ÁCS^t! ÏÛ•†O"é~ªB*„^)>)ÈY&¯Xƒ©¤M€±"/Q >8Öpå Wm&)x fÜ>¬çlg-fóy‚)ç‡x´abF×V1@¢¤qœD>Ø‘("ãÃb¿4€J¢6x¹~>#/S?]-@´BWᎱhÈ„DˆÎWY@÷²¨È9Ëžm„’hP;Uì‰p1û‘TM_:6¥dÚu’Óõ°3T£Ì‚P7á!X ÏŸ|S,Õd¶Ò#¸{@³iÆ—›5‘Zûû–”Ö¹`»tEf"L’ª Þl!ØI\œ¡Ë:àUæ_±'û¢ø£3`ÈÜ&5°0G³dèÎÂu»ì <öìsq°/y¹é Tt@ÑÏõˆ`ÚhòM$˲ù]›çüˆV›5ݬ‡¤¨IñàYâ¿B´ØMñ,ÝšÊZ{¬LÎÜðÑ_i?Ra2iäEMÊ lõG ÍzkwÕ¥‹bJ*_ë.ûÂq+2/ <)«Ö{c±y©U¥ÌƒŽÂ:æÈj¦Ó4P0è(>9€þ\¸FHâ#NÄúéô–İa_ÀÂÇQ–JX”R™ 7¯nøáà|sê%G‹DÜS¼+´œ±:ºÔ¤((wž¶âœ” 6n¸¨ 4mÖ0ƒI’ –Î…!9&~3‡2e ŸÒ ›p¯–€= éÚáÒ[šBé„QäÚ„o)ŽòÚ»£Â}Î"ÍÝÁyò|ŒlYÝ‹?TåR€c„ÉdŒö( ‰'Í…ÃÆ!h9­raåWÞ&íÎe‚Q%%OÍ~r)¯­Ì|íûQÖV s¸¬ÕݧÂL0ft¸ R!‹`ä*"¼¥]ÂÒcÄé‡3 ‚‘¡U_[ +e ºÂ¯º>¶áHÒ¥ŒP‡:±Ƥ• ÖÂÑ!VöìÆÀ¾ÊMv䮟1ýòæw*Ö9¼v4ùƒï9ÐZY…5k¨c”(üÃÆÔÞ°4[áÖúnŽE%$˜}òc•T1£vóm*wl„å*–¿'Esµ€!®Î¬ –d)uÎ6\qôŠ—Jo±娪Å.qÎ*ÖªÂ#e¡Œü¯”›O7wªÓj\¶J¼A…É×äM5z2Ëz”Ô*˜ê‚Ûˆªð}â˜rѰÙ׊;eüö`S E.c,œCá„ Aªcq”E…5Fô„eôÙ@…'†°‘ÔüÑ1–V«1¡²ÖKqFÉâ „-]æÕè L-Zè#šS ·Á¹qVüÃÊ"%%¹¬i@ÑU¦“!‘fx.èIJs„®®KVU …9_B™Ó¤B&L°¢Zž‰fðÐ׳‰ýnpÙ9™"ΤkP°âÈ%M>kŠý|ü’‚‰ÆAen´99Ö4X-a’D’Ô5Úµ«9.Ç)c©¢'pÄ™hYÑñ£,x‹‡ŠÛºW&C5‘CvdJ§6‡ad9Ö”·±ËŽV>Tu꺹Zü‚:'b›?v0R²IäÂY¶YL[·ãR‘¼¬j¯guh©dÕDR-³7gÊšL6÷« ,ºMÀ^J*ÎSA€Ô ŠT,ë×£ø¡Éái ”“^ã @è‚ϯh¯8(çh`¡¯òdü@`!ˆk}P,*•ÀƒšðöŒÜÐ…H0ÍÕ„™×E+E^5ñŤÆÊÁ4aaœ‹L:'¥¶VªÌÓFlãÆdÓ}2–‡ªB´Æ;ÏfV{3É”ê|©' \œ« %f³s2O…d¤íž±bëÄÄ ËÕCˆ°±`Ía±$>"ècHƒ8f ¤«UVŽ)­­úB2  òaP¢é”kí|ê<ÄN¡wšp°D@E`˜:‘ã4%®U)eÂ1ëˆeäÙ#š,¢¡3ÆÇAÞªj·Ó•ÆÅxåÛ íT#¡ª19úƒ3'h– (`L˜Æ.Š×&{Ô9‡îПU0+Ë2t†Þ¯Qävtz¢é1g·»BD‹*¥ì– F Q¡‚bZLɘrAfn›z‰uæG1¾§“ÂrÔ÷lJp)U>ñæž&Þ¥5ždÇtõ€ÔÆ«ݘ€(‘¸¨Š%ùF“è˜W½æŒ–Êjà)ºo(n쀢§âJùÒíTŠb¥:Ô&‚Î^.¡ (³±:oû…UM2munQŒà#6 Ü™!SeOI” 4ÈUÈ2l›”Ù[ÙVÖjUÓÕÔ›ác\:@ø1ÝÜ)KC'¶A(RÉn ö“ºŠÊ 2_&uóiY‹‘ò€‡4³F`üX\q°'kXJ˜ìPåBªZŒ½wB PpøXÙ;+‹EL”L '®“œãŽ'Τ Ørë‰Zc™Z™Å·ìt4AÙäd : ê…bɨÏÐa’Ü$¥ ×&ØÏ5 array_row€Nžs°s&êö&¨Ü¢(¢,˜¤LÆŒ ô¬ʆºAÀKœYZ€85à?‚t°?v,ÕtAZл9EÌ*\¹2õ3why¸; ScF¾jjE¬–z&å/²^Š›-DB,Lš”(ö òª:“`s Ó4ù'=.W—­ÒNÍ„)1â66I•û¢‰T~”%¢}–+ 1‹†ÙoŸšq$¼ÛþÆ…@Q‰LzvwáýOJ«}4-dÈX[y¨x£.aÁ¿A€ôÚn± µOs÷GI´ f[€³fM ™iÿ#ðMdk^k—Ÿ>KoŒ3RÞ‹äÚˆŽ(½{VÑX7R"è#ŠHlÔ" …ã+0œØ*~UeNppŒËCß¡ÜÖˆú“%SbHr_¡>cF¶ n’ηƒVu¤!§mg`mŽ’)@=qJÅ_ô‡¯Y‘˜PCæUñT$W Ã: ©îøï0ìÝlë˜é7{ó®hiBb›/P‘Ä]]'2ux;| • Gü¦Âê<‚Q‡ É95|ÇeÏ™ƒíמ\gçž<&a„¥r!D„XŽX,€N¢(¢‚,ô€N @ €(XÀ ƒ"H˜@¡‚… 2hØÀ¡ƒ‡@„1‚D 'P¤Pa‹.^À€!†Œ4jظ#‡;x0(ÑÃÇ A„ !RÄÈ$IP(Y¤‰“'P¢H™B¥J+N\Á’EË.3ºxù&Œ˜1dʘ9ƒ&š5lÚ¸y'Žœ sèÔ±s‡ žyôìáÓÇÏ@Uj #hBAp24å¢\)ZĨ‘G@Š$i¥JE,Mªr S&M[^lâÔÉÓ§HU@…%iÅŠ£š*uÈ”;§P…Ñ” Ñ*ª4¬R'F Cxp¶ÆÍ3hѪԉ&Ë“4Ó¨e¨öl¡Cµ¹°v-lÙ´ÀÀlD˜mܺ)µÉ[–`?Ü|k.œ¸qÖ8 WΠQçA—* uëØµ“`"…;SïàÅ“7O=C¬VØ©gˆÆ7{Çî-Á—Oƒ}xÁ1ůŸ?kÒýË0 B)Ö”4`®Wí8f0&TÉ LÈHáÂN °t…͆ Ð8|1¢ÄV“þLüÅl‰BFc(fèP±€™J®ÌX¼ØcÆb@ùÑÀ ‘*=¸!ÎÇ Z:ëäÇãÇE‘@†ÄBF䳑.‘,i’D‰“Å"…r¡ž”œT²'‹$•,-±ÈÐÒ%¬z/aŠº·O®bî9s¡²”4Ö©!@“^M›,«ÜÜã'\ý6Ñ’óφL:è¡M ;üîítQ’gOŸ’)Ìr˜+íW*ø!;„ñ@*“-J ÎMÜ ½á;O)Kz™P›ÙgêÄ‚°êE騛aÊQ̙Üc’4U cÏåfrëZqçF „_¯ÔAyÉJœ¶Z{æ’$OÉ9+3«uͲCt€?> 2šÙˆˆÍm•ŸTݺO¡ –²À9™¶B«e@Ռ͑,šE¸r”†ˆ¹³7þiÄ1ZÎTçÔ¢¨bî1P Ú}óIò¥ nà2ù˜Úh%µ6—­ÃzQePM-)bÖRˆ=D,!¸‚©70¸$Ø´s<‹jŠè'XX©nnîq¹®TâwjÇš6"ÓšOìµ ’\¡.W: kX#(JÌ=ßlàP%s×#}|"F™ß’$5ã}€rÝæš:f@x˜£r qPâMã‡YT’žñH´ˆ)´O9F$ÌäÙK+)‹x” ÉK¹IœQä•q ;”ý)axãäâbÕc cB`–RÜöA@«@¿Ü=«ÚµÓÊ.,<½Òø%g›CÜ÷Ì!‡:02-ºsÅQuf` èí\—!DÙ{‚C W½èvoÜdïb„ÕÊ`F%e4K¤ê—/g?- uæ¸Ó˜–`/øˆô—¯›ìõýÅã0µÌË$Q¡$eðž¼SK´i†ã_r¶œýÛ‡GÌn>dEqâÌ6óÜò 6O0¶8UwR!ßüݹ‰*-åVÐmQÓ×1–0GÑÐ$F4S˜û5†»ù/·Z#´yt5gî°n@†ˆŸÖhýEÁ3ŒPÃrƒ*”;JRE›]±4^Hr"ׯ¤P¾Í0ÍJ$ÉV2Ã뺬=)±ó†S]ÉÃIÒÜq•Ì+—-ê`=[F¦Ç´æ e±l1œEApÑ*ØÓÝN–*I@Àkâð‹KÕâ± ÑR ÁŽ€0IK}L.ƒzf\e–Ȱœ÷‰HLË%sqÁÊBãN›c¦ œ3´DüÎi*³ˆ…À«O][E©Òç͈(=á.cÃ:¶ev€²ˆ(. ‘Bʨšœæ¾^cFÃâ|ü è£×’m»šò⎃šlEÔU¸¹->¡6ƃ@*b”ÊnÐK ˜Ò¦ÌÇ—s»w9“‹8²ÞQ“÷ÖOc-ƒN‡…’tiS1$ôÆÈs'·òcæð#oó%I‘Ñe #Pp yaÑ*bTÍà)â…§,ì‚Ë¥®Y! &—©¸Df+2²pHl*Ûc$u',{Ù§Ú8úEõeMœÆdRó<*H¾Ä,lÔ ×çO²‰ŽÕ3kV‚•îâìF­[J*¦ùZÏцftëÅÖÉ" éêÜA»ÁHs]ݵúƒ09t”ãÞühð‰¬r)ø‹2’VÆ ’9Îóöì)LÔ`îu¤•±® .UÀgÏÂ`–$‰±$1ªW}q Ø\5B°ƒûÂÚ@ÄXÉ%6„1*‚¡«²Fþ äYîCD±È‚šÃ˒辈G¶Å,åÚ˜9#LsO²5 ¹ m›¯¦¤Zû|7 ?—RRƒ2'.eŒ5ÊÜ ‘ßE¶BLjM„uLn€’¨oå—Ap.¿ øD ‡éìm6—$+3 ÔŒ”G5Ôe¤o=ÎÁÙÔÈà¨Æ’ÌjǹšSÉg1r\ŒT%}wbêìÄ‹ ašWN8AÊöê§i‰ÉE!Åf@”‹V¸ö0a­.•‚l+÷fΗ8eè"I ¨"c ¥ÇÀU­ÕªI*>¶}Ũ• šY@g òQæG†·{¶Z!ÓÔœÊa7¤8å2óòYʹGô:$xçSuÃ6F!è9 ÉøÂªPJÓ[ºVÔ†-#£2Å©ºô}j\æŽK†)à4¡Ù{¼hÖ2É “K»KqÁ”*I ÀÄdÒ²&ze3SCÇŒJR¬Õ†ÑˆW#qÉ.•0œÉ¯Ìž‹imqsõr @Ì"LØS­WÜa°2Gg˜Ñ„&v´yåˆ&j–„Õ/šfF˜üæÙÜeÜ1bÉgÃuxiÀXà„ŽpG#[-ð˜¿BòuB+QdÔx “ñá×j‚U]9àåG½)ƒ„î+–¬¶Rˆ*ùtàJV{1€ÝÓ²›BHyâÊ Ó1:­jwñ}G7Æ©( n0Y]ÑgSư1WM¾n±l¡{1\ɹPl¶¶Qk @Ì*‘倌á-Øh%¼ _Ñ‚pľ´,U8'’Íêói¯¢…¼ #´sÈ=¢üåúøÈZo >7d j®¼·¿âòÕ„Ç¥¢Z bâàæ²¼Íò îsŽ.æPúäÆÙ'—œ ŸªŠEˆ¬¬-HúmNœn N™Í²Z¥Ÿ)ŠšÒí½÷ÔÃÍb5KÂÜ8sÆ%ˆ’³5â仞¿*f–í-•Omª5V{V&¡ú¨,³p­Õw/Ä´´wA… –([}pFš‘'°m—aE‚Œ,:Ò½´áÛµ»@¤›)g/Eèòò3ÃZ :ýÓo-V;ž(¸EFçn^ÊÌ*É¢ Ö¬˜Ã—Yb& «05H¤-²îIÌf/j¶äYabò#£`iÙqò’Û@vá…âKC2ɺ·´¤`€žX`èÖÄèÙ oPçWc¥<^ïîj•cºÈ¾ÀõDà(ô£bl8$D"ƒSX2b\°JPoNL>úƒ,ʛՎÁ,ÖaÔëá „*Ài´s =«XÛ CR1[6$Qöè› ²‚&(ç‘ ¾aòˆ•øó”'~6œâ±¥Ók¦¨^±6­ôá^°íÈI] \d7zŠº‰ Ó V¯BttúÏ–* ªú'®N–Bä–h·Ã%xLú€†³Û×%â ß$÷òdËÀ* WÖ:J¶ø(²RÄ ó—PUš‹ú¨ûGE^c®PÚºY‘qPÅÕ Ì–¡AjÕ‡ƒPØgŒ/aÌÜ•49ĪDC~e+§b|‰âè«'d §+$sK†ùlá“n2é¡kP©+tÙq@c²Ô96*WŒMD¥9ü¼nEI©è"…ôöI¬×"Ý 4 Z©€¹™¤@1á•›žŠÏÆÞ83œžÛ¸`ï_Iuº\ʽ|å1jÀqOa_Žq$f¸ìT1WR4$ÜÊaðªèŒ"2‘-(Raô(7£ôæè4´ŒÖTÜàL~f¯_D³ø“ çc…T ¯]ée‡‘$‚G‡µ’¸¯Ù2v§x+‡ 2Žq“Œ“²›ÀÄ(Šö¡â ¾“Dx#£óªb‹eÆb²G8½ÀÂc-ñçÖŠ“â,„^á@»ÜÞÂa àBL\Ä2Ç=Û%”¬0£„bzíqÂq‹§Þ€8­ØO¯Ó>"@!ir`GD[{¦sZIÍÙ»î Ë“»Ð$µ±PÄÂMûþ¥2³—´j…Ý!UXÔ ©PA–Ç :¶BÔzƒSXJ{lß|ÍpC•èºxMùg5 Ê`ˆTü–¶$§Ç.¤)v„X›v´ŠdÍXoj+uAšua& W-o@s…¸ªð<«îPÄÔÛÌìÅh G±zƒxZ…,õ 8 îk+†j†2(ÛÙ27läûW¡Zý¢¢¦‹Èt7@^[6žŒË6¿ÂcÈ`J:.’p‰òíÈ.²¢•CñãF=²r›ôó݈˜äòÅÃêyA©S‰]¥`0³¶þxÁã ‰¤¾ÖAžºôHß]liƒ©2 €^VlVõgOwxûÃÕåbβ©#â—\6x 4|K¼©‰D=´¬Â‹”j 3«@Ðf®jŠÀñó©€³`s3: cAgâ­Ü«#7¶UTÒîÄ·•ââZñŠU>#ùÒÒ¤»]hIM `X³¸Î]o¯IÄð2UEl¸å !|G ‹¸t–¿e…Fä¶F…- o‘øŠÊªÅ k|«ëÝ¢éÖ©‘x£#<é ƒg‘­¤[µ…h6®ÅYhã¶5À9nÏ'<)§#9A…]]¼˜lÌ’QGmn¹’s(ÛѲ öú4¬2“î£u¦ÎK’Ï•¡r((¯"Ðý9Ÿ‡Í\9äu ‘Ull…·—¯¨\Â) á‚’! +%Ñ"gš‹íþm Fϳ_{±DŠ ‹¯lû¦Âèp ‚ÈÑb…c„'`‰j"³U4¥†Ôm3²`NE~Iò‚€Œágqh2$¨0TC,йQÍÐ"§›Û=òÊë¬C‹ß>™ŠÎe¿¸Q|%ákç­ÇüFGç¹ ²úp晄žÈ‰í‘êy"iÙ¹uuQ «ÙÉÇÄ·¼Ö똸¨´; t¢äÓÓ#Iq¹ 4>2•!ÝÑq[V„ûúÂ Š´QZ"öz»ˆêã+ {9Êê·NVúH"0Œœš­ä§ BWS.5ïjTr´‰[O0† ÁµXî¤û§ÜR Ò°Bƒ!*¦cvœì¦ë_N3AMašæŒ¸s–)cäp) 8J®™!é' ÝõS%vÞ³ \ØÊô* ¶zƒn`‰Gãɘœö½á°9ʸ±IºJAœl–ÙiBžÐu¢1rë6­ë„y3õšl§.–¡VŒ¥ØBÊ FRn¬]ñJ, Ää¼eJtë=òf’pÒS‡¦Ö&qâP 8å #³‚&‚Zh¡£±‡"uM›¸±(FƒÙFª8RÉeÄÖv¸kˆÛå#ÄtÙPW¸Qò F*Õ£(A|1,½ƒî‚¥¦x€MÖeŠP;(œ©ºu—Í9Ù)%5æGk&¾Ä5 array_col€Nžs´s&Ðë&ŠÑ¢(¢,€ðŒðL€N€¸ôÿ›²áš?œ<À@÷÷ØÃ‚Ä@;Ö_&zÀ@áìöÑë/Î@žq¾ÛÝ'Ò@Œh óT)Ô@ä$c[áÓ@† ”ñ À@ÎÏ Ï%¥@†“=ZcÔ@'£ã…8¯±@%\Rã²´¼@³~_¬ÅO”@,T™EmÌÖ@ è—+Òç«@;!w¾¦TÈ@帑Qyp›@8Ï­¿°<Ó@üO¢Šr!È@ú÷XN¥¡Á@ô¡qc*Ñ@ålÞÚ5–@x5cŽxlÃ@ŽVlo:7Æ@ŽîÝÝÙÑ@V¹±I×@z CÞ&¥@p¿¤£*º@Ѷ0‡qÃ@õqXÁ—ÔÁ@߯¡ú¶@B²Ü!ÙÊ@âS~@!GÔ@5{Û‰E¸@– 긟Ç@v“ 윽Ð@ÝÂï—ÀNË@K0 æž@ãd\Žb+¯@bþ n¡×@à}å&ÀÏ@,j±a®£@I7opIÎ@çw+JYà¶@È/ØŠÚX´@œ‹e±hÍ@£sƒ,\U¬@œ¬ØéÄ@6ZAÖ¾×@‰ÁâE¾°@ËúV™ýCÎ@7c1ÊÂ9®@•$‹°ÅGË@Á™‘|=²@¾ä :ÕÖ@¦Ò ±¡XÐ@I᳡ˆ˜@ñ¼\´ñÃ@ªf…ç%ùÖ@ ÂÔé(Í@öoô;—·×@æiƒæ~Ð@ûf»Ô飯@D©ÒsVzÑ@Ž(ðg,¼@x2y¤§@‰Á8Ð@RjÇ¢‚ì×@Îâ´œÞ Ð@3WÕýÀ@äáñ> ̪@õÁ²q£@‡ n<Í@ò+Åê,ÔÀ@¥:m"Å@ÀWÒ@<ÛPP—QÊ@tŸž¬)Ó@,‘ìéÎ@ j 1Ó0Á@8¿-¿6`Ì@úÍ_w•KÑ@?&­0¸@û×Áàµ@¯Š„ó¥@G¼ëî7¹@F(aç¡«@i4£9a´@ЂZàqyÍ@솬Á‚Ò@Êž”!â³Ò@oŸn„ò-½@Ýr¦hþ²@0\£ÒDÖ@l0­±Ö@ÕþÁöª@}–€ª*©@,ûŒ—€Ð@¤H$waš¬@êa)JÉYÇ@‘KÚõµ@ v¨UšHÊ@b—B„?Ó@üoÑä%ÿÎ@ïY¡¬¹@øöÙòŠÑ@l‡‘< é¹@téþô™@äu¶ÑÌÒ@wÄ]¥ôaœ@¢òò,!µ@l†ÀƒhÒ@‹4Vefv¡@þŽÌW¥Á@˜/‚wÏ@¢’÷M˜Ì@&Ei[Õ@HdÝ Õ@MˆÄD°-Ä@Czù”½@.곓=Ô@À%«"—@\#Æ¥`É@AµXæå°@ü¿¸S}²À@ÞµÔø±·@ @þKÖ@blÂø$ »@‚*Ê´×@ò׫ô"¼@RÜö §`Ó@Ö{Ó—¤FÓ@~X&ÇLxÖ@§üj‡é°½@ȳTyq·@µÎ#ßR¥@Lr^ç©'Ó@Ì[ÎHº×@@þRPòÀ@ 4ŠöîÌ@´aϺ×@žæ”šÏ@wÔÉÌÃ+²@>“Uä”ç¯@è}ÏnñÂ@§œ æÔ@̧k½¦¯Ö@niBcÒ@òLa² (Ó@NÉr}¦„Ó@B»PNxÇÒ@ê–Þ΋@ü¡éàS!Ñ@R™†è¤¸Å@w”ù‹.ËÉ@•ìæE†@ìAÆIÖÔ@6ø–ã8Î@Ðm6u|™@jÌý¶Ö@r]b™<Ñ@Ú åš³k@¿úß(Q¨ª@À8y½G¸Ó@äy“ð×üÔ@$nŠ ÷Û¬@ÞŠIMŒPÐ@(³Ž²Ñ®Ï@¾Ë¸¢¨ Å@zÊ,õ†ûÆ@ıœ=ÅÕ@JR—jɹ@PÚÀ XÆ@^»l#JÒ@‰ÓôíÁ@pOòWlC×@ò»¿n;µ@¥EoLçÖ@DÜbƒªÍ@~/Æ@ '€Ü(~@Šã€{%nÄ@5þ{„o›Î@Àžè8º‡×@Áx}”@§‚òÏæ·°@™Ê‘TÑaÄ@lm‚€àv@Ldí<,Ã×@¬ Ùq&©Í@ÅØ‘'¦â›@Z>nŠx»@l¶‘G9Ó@•þsŽÄϵ@m²æÝŒ»»@ aûçuœÖ@¬:º¢”»Ó@‹ÌÔ±{¶@{û£~-½@!ì%ï Ï@ý+öÕÉ@…®òqÖï¬@ Z`çÀ@ ²ÜγÂ@w]«Ó²@*dâ-HÕ@_—ãØë”@k„°*®W³@j"Õ‰·Ÿ×@Ú(c#a6Ó@Èc ë6GÖ@" ÓI¼$Ô@¬°Dl’4Ì@fpýžUÏ@¥ÒX!°‘@×÷ÐA_}·@#̹@^g“uÞà»@Úa¾pw`×@é: ï Â@ÃCÌë%Ó@ Ô6ï±ÀÄ@ìþ@ –É@+AŽwŸÊ@ö§SJš×@/Ø„M!ŽÈ@£ÑàŽ¿ÿ¢@6C9N©…Ö@úÆ‚ ]¸Ï@ÂóÕŸÈ{±@¨ân1ªÌ¹@µ/^œêÏ@‡*tÛ›åÌ@ò ] sÏ@x5 ié@«@x’¾}Ó@tÛ` ‹vÒ@×kF¨ @ˆÈ˨ ÄÏ@›d¤¡°»¸@pD‘Õ@¹í¦ì»@0@RW#Ó@@·ì ¡;Ò@˜s([,×@bµž>h×@rj:"Ñ@¦^ÖÄÔ—Ñ@zà *|Í@M‚‡—’Ã@\LøM™)Ð@®l{³‡×@ ‚=Rº@¬RsA©BÔ@ bH9=Á@©tŸó¹@ÃÎç €Â@hÈuܮɴ@&5åJÍ@ú|´§Ô@!{ e°@ÈähF»ÐÈ@àyןY»@¯ûš®iÆ@ãç-,Û¸@•˜"¥7y¨@}ºç î—@eªL,ƒ¸@¼§ÌVþ‚Ó@¥Ç-QøÌ@ü|VHèŠ@ÚCÃê–@‚Ö[!ñø£@s°h>[Á@³ì°¡Ô@µZ¼¥ìL¶@ˆû霒fÖ@(ÚÔºD÷Ä@˜§ûø¿@(Ht_³@Lù¹BŒñÕ@¾Œä3`.Ñ@!z؇Ò@ücŽî>×@&Í¿›øÍ À«,ÿÏ‚@@7H±ùŠÍ@X+í ˆ‘À@;DSÌ${¦@òÖÄeY@LD¯*Ò@N/ÔðoÑ@°Ê_ ö Ó@iñc{³@+J¦ÄËž·@2>!P-9Í@Ù‘‚^éÉ@JéQ„”Ð@ƒÙ~9  @û«Ä\€+À@æ9Ã0©K‹@µÖ©8*W¶@ØÑe¯Â·@ÿ¸ ÇÌ@°Y¥€n³Ö@Cäå}¦¶Æ@ŠE˼‰dÔ@pµ6½Ö@w € É@ÏûÀ9‘%©@ª$LýÙp¯@&$[oE…Ö@ õ¶ÎyÉ@#öl¯+w@´Ôé1cÑÑ@i(œ½@¬C6Yˆ8Ö@aèÇdìÇ@31CQ;²@O?mÄ>Ç@ö\¾ stÊ@=?å¶wÃ@¦Q%(ÑÅ@´òÌv¨ÑÍ@u¸ƒ,4êÍ@âŸx~®×@Gh*VľË@°Ùö _'Ò@ ²Ž?YeÂ@ÞC95Åõ@å>”Ó@Ö˜Ù>½8­@a„bêõ‚@PÝ8r>Ò@à•£pªÓ@¨ °¬=ÅÄ@Š Ñ§Ê™Â@¦<—39Õ@âÅÿÏùÖ@âë‹oš‘Ò@;”Éi0¿@³¡sÒ@<ó_¥Õ@†È$…ÿœÔ@å1‘ýÄÂ@6SÂÇè]Ò@d–Fj¸Ø²@‰•ä-¥Â@ltTLEÃ@˜ç!wj!Á@h-iìú•Ñ@€<(c%ðÐ@‹Ä›7Ä@àUðˆBÖ@Ïï_uõ©¾@°®üB“ÑÑ@ªt§2Ð÷³@q´ OÔ‹@F›<ÉÝÄ@$eº^ÀèÐ@"L…™®[Ó@§Ÿ%éì1Ç@Ë«k®1˜@5—nm¶@ÅjXºÊ@— JYêª@#+ÿoX§@ÛD;XgÇ@Æ…j‰~³@Ð&øh>×@߀³ß"ÍÅ@·†Ð¼t Ã@>WœUúÕ@^0øNýÔ@Á–RLœ½@&ÖÞî8çµ@V$2JmÑ@´š¤¨Ÿ`Ö@Æt€œlÈ@vèºJiÕ@žo–£_=¸@% [ÊÿÒ”@ŠôLò@N¢@åÚ¹„o²@L•ÒÓØÑ½@é—y9õ;»@F°÷2v\Ó@ïEåæ1-s@ ¤”‚zFÖ@*£&X~8Î@Uwq–~Ê@nå·ö»Â@¤xª©(t…@zѦ0AÕÊ@oÔ1Û3žÉ@~z:“š×@»™;K…—@J‹I>Ã@ˆu""µ¿@‡t©"HqÁ@E(ÐS`l½@äCV”Ú·ª@¦ð”+ñÓ@~JÉÚRq†@xS•ÒÓ@ö:DC<+·@x‘º–H'×@h)Ö ÄÖ@Y›gѲÆ@¯æYO¸mª@ºá9þ¨”@@8ëÙÖ@Lâ³×ƒ0Â@VêL0¡×Õ@ 4fÁXÀÏ@Sä˜CÎ@#2¼)ôïÁ@}øbªo6Í@ú烯ÎÁÕ@÷Ü”Â]Ê@äh–å‚Õ@p\Ι³‚Ð@Õ*PëÓ@È9»ñ¬@RºWIE@_+qh鶴@§Š{A¥Í@kO·Ó5 Ä@¤â·‹Å@î @’ßÊ@)(üÙ¼=Ê@1Ž=¯«@æõÅ r:Ð@Q°“¸í›§@R'º=iË@¦Û5ËòÑ@Š^þÒ@³åœÄùî³@ù¹Í@¼À@xkr@ÓÓ@pðÆœgÒ@¸ì|ùnÍ@¦ȉëÔ@Ò’g;çÕ@¬,º~1ÞÊ@¾“~_&n@ØÑqÖ@ŒÔ(¬7³@Âñ‡±@GôèÑK|Â@#ÉTa4ê²@Yñ¶QòÂ@¸$;tã½@+¥S¶g´°@öÙ‹½Ñ£˜@<Í¡/Í@¤ÛlÊÉ@IY²Ô@]Ñ/k „Ä@Ï%Ä…5-Â@ì¼ÌœùÐ@Ð,xÖæ Õ@K‘7K‰Ì@²QóB`Å@‹Sä-&þÁ@ݪ©=ϵ@„w Ï÷T´@ºx%œÙ½Õ@ìo·1E·Ì@¹&óYÑÅ@ÏŠQ%‹À@E>ЩË@¶ÕqÅ@Á á]¹²Ã@ O)JtÓ@ØŒ`‚¦áÑ@*½@ü¹ò6?Í@⥲¾'àÊ@„D˜÷˜€Ô@(œ°R"çÈ@»¡a°Ô@`Ei ¼xÌ@e/[HÌ@GTŸ©ç¤Á@gx¶m¥ûÇ@Ò\Š}ŸöÉ@H!(|ÑÕ@ƒx–×È@¦ÃH`DÐ@¢]m÷² ¸@3%‘×»4KÀ[ªùŠQQÂ@WN,ìÈ@ê¼/¶:Õ@ø‡`ŸGèÈ@qprþn¹@ž½”u“@%$kc€ÓÌ@Pc¡¿ÆË@…ÿã¹Å@Ôä C„Õ@&mƒ:%±Í@N?ÛybÏ@ 4Îzã^É@M$ y5·@òŽ<楣@\‰´‹(Ô@ȦáeB¸Î@b¬k3ŒÁÊ@Ùy ÁvÏ@™•؉fOÁ@÷ƒ¸>‰È@•1El·x´@–%¡à›Ö@¥4ËU³@¨±ö¬-Ó@ âŒØUÐ@À4ÑÖ@ü2˜+Ñ@sX,šÕ®@¦™7•X¹@´o.ç…~Ó@Vdn’Q°@`s"&WªÏ@*@›áh°@hÓàê)¥Ì@Îg§#쌴@°C‘DSÍ@$¡äöS~Ä@C±_äº@·[I¶›Æ@¾Ñbtà×@`®LÎñÒ…@/9¯èßÉÍ@Kßf«¡Ç@§ûöRq·@«^á S Å@â*qw Ÿ@ŠDöi׸@¬ISðÊÅÒ@\A8·³º@VSJƒÓ@3¸öc¯@äÔ MÑ×Ñ@YCÔÀ” É@´¾¤Ba¹@¬VÄu£Ö@ž@5ãh´@ÂͧptÁ@Ú²} t?´@âž^ÕÕÖÒ@ƒl$²Ø‘¹@iL•Qx³@±§Í½gzÍ@ èÌ’²˜@RÅÖ:–@ÎlS›–#»@@mîDÇÑ@2C6ÚÒ@ìÆW;ÐÖ@iE¨¢eò¨@€5g“u•@l»É¼…©Ë@A‰òË@Ä5$A‘ÂJ@àM5tà³@éTÆAÔ¸»@*¬p•™Ò@‡© (IÏ@^’ûët[Ñ@è«-ŸP°@˜?PLHHÑ@@Y’̵’@FêÌošÕ@Ϻq»<½@Ö…%f©œ@Œ—›i2Ö@ÎÆ‰RɾÑ@¨…„¹9UÕ@¶äp%•ÆÒ@ïÈØÔOêÎ@¨Ô2¢ìéÐ@4¶üF×Ö@@õDÅl¨È@Z¼“ŽíÓ@¥Ûì»þÌ@ÅGíõŸvÃ@b'þHM¡@hŸÝC_Ç@úË»û.äÑ@"æ¦ÛÌ@†1;$KÇ@pc¢“ÍÅÒ@Œ’[ZQ¹Í@¢Ô·wCº@¸¨Ö’ Ó@|²Ðyн@Äÿ¼ÇÍ@ö;¹Q Ò@š7pÙºÒ@ÌV#Ša×@h÷°C?\Ñ@–S°ðÒÖ@Û¤`¯féË@ ¹»3!Ä@IÒDÓà Ž@3÷a È@wÝ3’ûÕ@ç÷ ²T·@âP‰‘‡Ñ@Í!²«Ã@`9^f>Õ@vßj÷«»¾@°Ñ%ÚñÓÕ@h)V•±·@–ú„ð“sž@˜»GÊÊæÀ@ ÆÁi-É@Ûé ¼XÏ@pw_IîîÖ@rÄšS$þ¿@¢©V…ø¢Ê@³÷ĺV @GÞ6m @râxŸþÉ@¤è%Ï@*wÿÑ@Î=–8±iÈ@Œ·.ä-×@Ç zIc¨·@vüQO†hÈ@Kʇ1F@¢@XA/SEª@é6E¡ñÄ@ã0=Éé±@ÓÌæ­Ó@¸L~4*Ò@˜meD£@ÇO‹¼‚@åŠeu ¡@H­06îÕ@öàó«bÖ@þÕÎdWÓ@æƒ6ícÎ@òwð<ª|ˆ@¶7à9}xÃ@S™¼~–@Ï@´Q iÓÍ@„ÂW{C©@šÒ°¯Õ@^¡UøÂÎ@NM‰öÓ@î]¨ÙwÄ×@×ðuSLgÉ@RíR°¡ÓÕ@üooüF[Ô@r‰äThÐ@/f ýßÇ@ˆhÂ*ª…²@b?j1qmÊ@eØNç‹À@ªÉŒ3àÓ@U(¶¿ž@˜’N,EÂ@½|pÓöÛÄ@;#HÏÂ×@%ÓSx%òÉ@¦¿Üf0×@Z¼2»h´@ZŠŒ¢>Ñ@qI¼¤-BÁ@ ªdD%¡@¾«¼ƒÒ¨@8ì-Ú{×@if®•ÔM´@ây /ÏUÐ@ì ØcÌÀ@$Dé ÏVÔ@¾‚ç(}Ò@ffŽÐuBÅ@½ãVy'µ@ý$@„¦@Œ‘k¦Ë@ªVôx‰„Í@ú €ó&Ì@D%¿ÖŽ›@ÈeÖ†õ>¨@6^G’sžÐ@Ë¢ä‡e£@¼}h%Ð@Ñp—Âd^‹@ÕWv±„âÇ@Ý–z9»@³ Õ¤NÂ@|›žÇ@Û™"yq¾@wÖ¬cÁµ@øÐå`BÖ@–Ïò-!¿×@_uX×ÚÇ@È3ž#€ÉÏ@BFîD¤©Ì@áì ”ÚÉ@ø)«žWÃ@m:+{ûÀ@Fz6“êÒ@S~纽@ÛAË m‰Ï@~£gELÆ@œ=Uƒd‹Ö@êv ƒïPÐ@œ=û-iGr@j³šÉ Ô@Ô°M¥´@N°ÈSf¤Õ@ß²W\öÌ@úéÇ”qº@ŽeI¶0­À@Ú@FVQh§@ö/Ö­:Å@ý¢„²@|”K4ÓÂ@mk_¾@èQ}µDÖ@Œxœ‘ÛÉ@¦J„? Ð@ÁAŸ Y¶@j¢¥ÿ›ÝÊ@%ù~î~@d¡Ñ¼ç³@å¿rüµÉ@2ÉMÔÔ@T$G Ñ@sª\áË@ýîÜÊeÔ}@©º,aŸÓ«@¸"Ð˃ÍÓ@ÁÕä eRÂ@^Y?Ëê @å7Vš ©@G§àÛ§ “@‚â¡z×@èÆü(¬ÆÂ@‚,%%·üÀ@¬0äÁ ñÓ@P^öA Ó@Îö4½WÖ@˜ŸÓScµš@zÁ/kµ#»@&ÝŸÆp@d+ì ØÑ@˶èB¿@Œsè/Á@ô‘x—›À@3vG8ÿñ¾@éÖô2¼@Ò¬Õ[zÅ@ï^eA:Õ@~k”J¶ÍÉ@JœÈÿˆË@]%®¡“Ç@>%ÚßPÖÂ@2 êng*Ó@\âUí¥Ã@¸ý„ÒÛw@D~2Z FÑ@}a Ê@xéR¢:4Õ@í‰0ju±@ºþw"¶Ò@áf½×%áÌ@ü–ž´wÕ@°£u iM @ø›YÃwsÁ@R™ì04À@ëlÅ$Ã@{~© uQÉ@ApŠ}ï¾@êKä‡}²¶@ .kls$À@ |"°7(m@ì`õÓîÀÆ@Yºdò„Ï@‘Ãa·Ð@RbûŒÈÕ@ì‚™Éw@\L™—•Ö¢@¼„KË@bmâe8wÑ@'¹í>}¹@Ü“ôHÅ"Í@ Ò’ e2Õ@¸aáÁm°»@=WV6u1Ê@ÊP Í'Ù…@Pθ8¿Ô@ÚçnÄI¡@øÖmjýÒ@È8Õ/Zq@VÞ’ÃÍÄ@²D;-³@ýÁ©†Ë@û9.mĬÎ@Š—pÑ@`<#:ÎÖ@JªóÑ»·@iP²ÿ!êÇ@0÷»Qã»@õ}xuŽöÌ@°®t_€ƒÃ@7¶§Ù7n†@ü/æ¼@”ôê¶;Ñ@?-‚¯ï¼„@ª3ÈÕÒhÕ@_i"\Á@*#b厢·@:ê> @ªÑ@fÙž×@ו2¡‘¡@ÞF2œ Ñ@ZfâgãÕ@d¬¥õ«@FÉ9¾—“@ w5MþÕ@®ïÏ'—Ñ@:š9Îä|{@¸8—Éà–Ö@É×+?ÉÄ@ªæR$lÐ@ª[Y­C ¦@‚GáÊ€Ô@ô]Üåg»Ö@èL6‚º@ðôô„nI¦@r‚%|ߌ@ç7× ¦Ó@cÔS.oŒ®@qÐÜ]t @«¾a城…@¡59§Ï@ܘ‰žÈÑ@”²€gÉ@‡sÛ{Ö@îÚw~öÓ@°^&Ûæ<“@ß9ûÙneˆ@>óÃý¶UÑ@SÊû¾bRÀ@Ûý ˜Íí@"Ï1Iƒ=»@)z[±7ŸË@Ôõ¸2žë½@ûg7Ìv®º@ Sƒ:RÔ@*ªô4mÞÐ@h(¤ÙY›Ñ@/Þpº²Â@ú÷ƒR[ÒÎ@ü»¥—×@ÂL†à&¼Ó@qÉ‚„ÀÁ@t„¨ «µ@•׎Â@!¿JZÐ@ã#Ïîhù­@³üêB•‘Í@Áø={°@¢à^\Ï@}¡zu•.Å@ Ð%@Š^¸@˜UœKŠBÑ@V0ãªÕ÷¨@ƒ“jà¿@’Wk ½@àu5¹A3í?Ú‡ÒnÐ@¿€hó¾@Ù‰ î7º@ÁÆ2Á£‚™@,½ÎYcÇ@ ³ƒÈ@·“SlI@Î@WÖDÕѳ@$áý^cÒ@} Ú'Ñ@¡KËÃØt¡@þ¾êèTIŽ@dTJ~­\È@u©ý~È@˜Ù†`Úg³@Ó@ßxVÈ@âJ×@¶B€[JÖ@”žJ }ŒÖ@fZÁ²øX¶@ŽÉAóŠÖ@—+\4yÉ@Ø0ð¾@û ÙJÞÏ@ûC];`6¾@9gOΊyÃ@åy¹ Ò$Å@P@ËcÌLÀ@æê^àãÊÖ@–<>ö½ÒÐ@æ>»è!c@«p†]’½@æ‡R›öÃ@aë£ÓëÈ@™~Úô§¹«@.›ÍÒ@ÕÂ'èÊÊ@.m‡lœÕ@š4RÌ,Ö@‘ß‘)ÕÍÁ@Ða t¤Ä@hh$™É@jÉÂN޳@¹Ô³~tóÃ@ ¨ü8ÞžÓ@͇!¶³ëÀ@Å^;Ô&̺@GBœ&ðÎ@ælÑÊÜ:Ó@ä9²gGøÔ@cR>óŒCÈ@ Ì{{ºÑÃ@œ`@®w3Ó@sê2Â@Þìdz†Ï@à°W@!ÇÆ@·z­iGÂ@/—MWJ»@¾«hè¥@¯™FGà ·@QKFŒÎÍ@ô±ÞüñÍ@®åF䦿•@|éÇ-‡Ñ@öÌ MCÕ@&ÜS4ºÎ@¶Ä˜.óÒ@ÌiØñ¤E @y&ÊU±&ª@þõÌê<ÞÓ@Òöî ] Ñ@‚ŒäésXÒ@†røÆïœ£@;‡nÍ@¶Å›ƒ¶@I^HgÖ¥£@â9WÀøýÌ@ÌÛ‰Ç=@4à±›ÐÔÖ@z#z–ÏæÖ@ ƒ°60µÉ@ºïQŽÂ»Î@ª$)å/ÏÕ@#~(ˆÕÇ@Í3àR­µ@†ÁŨ¶Ö@a‡ø‹£qË@Ž AªÔ@ÚhùÅ‚’@6/hF/ÆÖ@EÙf{„ϵ@i\dñŽ ·@ÓÔ›æ Ç@¨b —–•Ð@›Ovéd}È@pF¯ÙÅò—@ÄÎÅ÷û°@¸D93ê Ó@Fýçr£åÐ@ãÀâܰ@;¼@¸ŒÂ@Ñ/ ³Q"É@âäEÜ_ÚÖ@[$ˆ¬Ô@)bfW<¼@c|ð×@Í>”¢¨„@’£Ö³i€@L;@•R‰Ô@¨¿ePÁ;Õ@ä¨ûYÿ…Å@Zò\±Ò@}{ŠÞ­@•“2G£Ç@g=åæ™5¹@TÑ]JÒ@¢)r.øÔ@5íµè8Õ@WS"/Å@qúwAÑ@”wšöµ@¦ö ^Ö@p´ó~öÑ@Š t žÁ@[1쨱‘@á˜ÜTÖÉ@ðβ)ŒåÑ@æ#x˜ ¡@ Ü2™´ð×@@»UþCuÕ@í€T„¤e§@Þð6žcÆ@Ý1"SåË@þCôÛ<À@}…àƒe×§@ .,º[ Ñ@âÚMœ!Ð@®l0¶‹Õ@ÀSoLáÄš@póõ\š Ï@–Âuj@IÓô=`Å@;^ØXÌ@”êoHÂ@&pƒÛÑ@è o°Å@Üçèpe´@Ì.ðA¨×@{m73™Ï@š¢ àäîÏ@¼«Ÿ¯@Àð;“ÝÖ@>.lj”@¢¹nË]Ñ@(< Ö”ïÇ@‘Ã’]/r«@íàœÏË@Bž×vAŸ@z_!`Ý·@ÛóÅ:œç¸@0.2)?cÕ@Üào‚ÙÒ@&ÚýÝ¥¥@€y–jç°@Ì‹Üf T×@Su™$IÍ@¹§º•I3Ç@8zêø9ÐÔ@ËÙ{Aÿ @¡IŽyÕ@?^Å:(éR@‚˃¨,´@`4Xy Ð@ºyzOîÇ@Ÿßõ*¬@bš>Ž âÎ@9‡ÿpÀ§@K a‚®‘¾@TÈæí9~Ö@JÑi¾•Ã@F‡3)6µÀ@^nR9ñÑ@»À9¸Š@|L§ò§6Ô@¦)Øö9Ò@ul>ªoi¢@NS+ÙyÕ@l´]gñû³@­¤®ñÒÇ@×Ò_×Î@  Ô±.Ç@ÌÅÆÆ]¶±@DFÖ—¯K¡@ü'TOÄéƒ@Iéê̈’­@¦Q–¬"1×@z×fêÑ@hÈþgÕ@mxÕªÂ}¹@xJsGîÂ@¾”qœ[øÒ@JÌhF«š@à "NÔ@‘žÌÌ@dØ8tÀÓ@l™Ò{µ@ÊÐÓ‚R­Ì@>xêlÔ@)LýuC¶@h>|TþN¸@6õ´r”Õ@Š£Š¿K°Õ@}‹™!¾@1_ø–/»®@vÇyõvø»@ø2J×tÌ@³½eª È½@²è åóÁÊ@%Ô0%Ñ@”[î%ÅÉ@‡1ÛiÚ±@À—ä‰K&Ï@€¼ÛZµÿ¶@úÄdƦ‘×@Lݹ½§=Í@Ì["€Ó@ª1ØPÑ@êL·RcÇ@HË/.€Ò@_»®Ÿ*ûÆ@¶ô9ÞGÐ@¢·Q!#×@A™Vý»©Í@<àßM~¾@{4K|ƒ À@cÓQ¾à³@ i¸À¼ÀÏ@¶¥Žÿø×@ήq—Ñ@úãÅ&ÒÑ@Õ?ªcJÊ@ x…üÈ@F1§N•ãÍ@@ÄÑ®.Ö@ÜÛ+žPÊ@û‘mq§Ã@“†±¹*Ë@›]J$ÎW±@¦+2^°Ñ@z´{+IÈ@6Ri¦iÔ@¢Üëœ|¡@A#<‘4Á@`Ô;µ´‚²@‹ùÃFÏ,Î@Õ™½…×?´@Œ"¦?Ê@ yñDù5Ô@˜vŠñëXÐ@8šíoéÑ@,PÁp«Õ@av"¼[lÉ@‘”’„Ý¢@ïò“@˜Î—Öi=É@ý²-fºÎ@f~Â7âàÓ@Ì[ÝÔ‰NÔ@‘â˶$DÊ@0C‹ñëÍ@>ö ¤µ<²@Äå²{†^»@ZûÏõ·@Ú""‡§Ò@ÏpW‡h…¹@QtVkÅ-Å@´€‚s³@Jëü«QÖ@@q¯ò5Ì@48‚gÝÒ@Jê”Ò@ŽÖÞ¿’¹@÷IŠºÁ@ËŸ4Xʲ@fÏD WýÖ@œƒÇVi‰¬@˜í`0>Ö@x&¨`rÞÒ@R»Û€Æ|×@4(yÎ0Ö@ƒOB&•Ç@8Ù:Ò»›@)–v'ŽÁ@C?Pã)Ê@þËÉQƯ@"Z¶°Ø  @ÄÖWj‡E°@¼³G«2Õ@>t¾ MÐ@Þ‘Tær Ö@L󕺄Á@C¤@Ö§ÞÞbÍ@XVW\.“Æ@· êC±@ZÀrV?NÆ@4‹ÂzWÃ@&¡U5¶@JÈ ]QÓ@TŸn¬ûÔ@:r&—e‘@Tùµ¸Ô@œIH|ø$Ã@èþv:cØÐ@¹ú'ÃKŠÎ@ôŽéƒ½©À@Ú(ÇG-Ñ@ôîf ƒ˜Ò@Tûüu¤Ë@ì{[EÖÔ@ˆ¿Q‘åæÐ@týÁuÈ@ê,'̺ƒÂ@Lt3ÒxHÑ@Ì;œ¸ÞOÑ@n@!}5ÈÌ@«þeÄ|Ï@,ÓxªÕŸ¸@ wùB-Ä@ü¢d9K:Ä@†ƒKÁ»3Ñ@pTı×jÑ@¾f»n±#Ô@B9vV°ÑÔ@ù/ŸöΫ@¦ŠG¹xÈ@ŸK¨”ºH­@33~;,Ó@ñÖXR¸É@d…·ÄúÓ@ Ëtàœ±@z«z'ÒÉ@u OÂs°@R¶qÓÓ@ÄËtýÙÅ@¨ù‘×À–@=IÞý#÷Ì@ŽwF¼Ò@â`¼šåš»@l£>ÄíÊ@B%qáêÞÐ@EÉÎ%žÍÈ@k§­ø†»@ºÛþºÒ@¦—ÚÝÇ@g+0ÇZ¶@v¦T0H÷¹@F|6ÛÕ@Z)ÏâGÎÓ@ÿ–X+úÁ@qF¬ãuÕ@,]@ È@PÞDëË·@Î=NÉ»dÓ@=í=äË «@,'ß6Õ@Ðr—h£»@B¼(=i/Ë@oˆ¾ÒÓµ@ô|´ßYÂ@"ð +Ë)Ð@<øƒIÓ@´Üa8•º@‰¢ZV zÏ@Ü~-Í·@æïOÑ2³Ó@v¶êš#×@e¬‘þÐg@ü!­ÙûÛÍ@%y“ÂÎ@H²ŸœŒÅ@•a{Hžä“@¸®ö~ØÔ@øù%÷¯f³@É|G¹$™@èàŽ»5¼@¬héÖ¸•@žò…i§Ð@ Ýc ¨fÀ@Wè™s¶@¬@"¾@¢Ç@$H‘ú7~Ð@9b•¦ð©@‰ÃÉ00Î@0dÒîÔ@¦ï$n°îÔ@ïœkEòìÏ@Œ¬¼øé¤×@\¾¢t“Ð@ÚùÅ“IÖ@&š¢žËÂ@Ü"061tÓ@½õA{팦@Eè– $Ì@¨½èžÔ¦¸@Ìá¢glÔ@'઀l­@U_·ŒI³Í@.r‡¹Ö@L† $A4Â@ßcGàKÑ@䞥'K×@e_j» 6Ë@VŒ0 ž¶p@ÈUÅ|DgÓ@‰ý,Ã;&¥@ÂBfÛU®Ñ@”š“,!mÖ@ض| Ò@”ø qÿÔ@B(6ó’’@L˜x[¾Ö@,Ç{ccëÏ@¾» Ç@ý¦*À£3Ã@X_¯baX‘@¢Jl9Õ@Û²§³ÚrÆ@^ÿO JÕ@NÓ‹õ‘o…@*2u}NЍ@OX¼çÞ Æ@¥7•­›¡Ã@ìÖ&5°Ç@a¼¿¯*ɦ@›¢‹<—ž@w×îãÎsÏ@ú>¾i1?Ë@Ý›êSö¹@1­'’®É@îLDSbÇ@t1n#×@1ª•›zÁ@F†¶pÛñ@ÙCAYН@€d"CÆÅ@lÎÆ•ÜÕ@sJ­I¯Ì@T~€Í“²@Ö\ÀüÄ@Ï¥x¸³î±@0]󜑋Ñ@}“¼]Ì@Z™•¯ÿ–Ö@€‹'Ñ3È@]Jí²×=Í@Ö@¦'§$Ô@&ÄØÅ”š@…Dn—†Î@¨YU¿Ä@r‘#¿sÇ@XwÚƒîhÄ@¾þ“[Ä®×@]X¼”|qœ@`­äÀ§@·p묙œ³@ )­Œ´@¶ ™ò(œ£@}^%Çk­´@Ì>o_”(€@¿g{eAÚ¦@LJûÑ@%pfÂkµ@šØeŸŒ°@Ȇðá«À@¶pìużÖ@—]RL¾º¡@¸)ŠÊ@…Òä Lã @/j¥¢ôø­@Œu)c=š@®·åRÙvÓ@ÓR,\½@Û“¤‘fµ@ ¸‰êÀ@ðÛM0¢@Œ$¸ ÞëÓ@$0D»c×@VÎËÞÁIÒ@ëÐ3~;†@³ç´k2'¿@|öHúÜQPÀ²~¸ßTHÖ@æ C+_Ä@zn1¸¡Ë@aNÿ³(Ï@Z°Ï®Í@­.ÿJÄ@÷¶V²¶Î@.ïcäŽWÐ@hxÅpk¤Õ@âõ|áTu¼@±'lÑ@¯Ú¹N, º@™¸1ø^Ï@a°ïuf ™@ìÖ@)ä•È@»>Ö}üË@k‚Š«‹Ã@"J§ª¡@* 4×…Ô@4ÙºN7"Ô@Ýx³MÕÂ@3__e´Ê@æJr0Ô@QK÷ú4+­@–nö6HÐ@ ¤¦Ìú@´EüÉÈz@!¤¯FíÝÁ@”L.Æ·x@N½ˆCn¤É@@cæ¸]ÿÖ@·Çu<=àË@h9„¦zpÀ@}¾ý(0yŸ@>EÊýÎ@ ÖǥȲ™@ ´ëqÍšÖ@ ʬ•ËÇ@IzàòÚÅ@ðþ¿kÕ@­¼½öHš@€Ù¥›Îº@¤{¬žÕÿ·@ú6o ŒÎ@ [µÑ¡Õ@Áx jŠeµ@'JD¨@Ê@z$ÙÇÓ@`wC7®¸@èNÑm£Â@ú¿ùXÇ@®k˵Æ@7®yjÅ@.9—æ/Ê@ïF„4Í@u|fnÊ@.kdcöÑ@a{fÖ‘&¹@±ÒIõË@öÍú"|¨Ô@†–•éÉ@¶ª,)q×@ëÉ?8§8È@xä¶`yþÑ@/{Á‚NŸ@.®§òÐ@cw=[²þ±@<ñGF×@J÷Áª`'Õ@9¿ŒÐº@(l¸°¾²@Ú“Ý-„Ó@> ¶ºµÐ@¾¾±ú‚Í@ÜÑ©ô·Ë@º¨:9̆Â@< r´?Ñ@M¹šÁâôÇ@®Ýû.˜„Ô@'€gï# ³@ k á·hÖ@ÚÄâr«Â@¥9 G$Ç@Ø7à(¯—–@I`fãy§@† ë´$›Ñ@$¶`«Œ­Ò@¶€%%éÐ@ #òž®@¹jÒ³ïÁ@ åCŒr#µ@ILºŒ¾v@°KEaÆÔ@" œ2ÅÕ@àÕ°פ¥@bãݬ@=¿@&‚a²$À@_FvmÎ@Í)N‘ÛÂ@Ë lßÎ Â@Ço—áË@ÕìQuÄ‹©@ó‚[¦(Ó@hâáfãMÈ@¢— 3º`´@òŸÿ×õ¨@2¢µã²4Í@×jã:+×¾@(%Ôgš×@âø-@«J£@Ì,hµ5U”@g× k@^/ë6æHÕ@ÂÄ#<,˜@}›\ïÐþË@Î?è.6RÔ@É$¬#…%´@lBÍ“bÒ@Œ†ñ)º@$ó‘Õú•@—Âë9¬wÀ@1ààf6Ÿ@%{å„Â@‘Ÿÿ7Ñ@nLSGg‘×@N_ü-)Ó@ùXrnÚ?È@}%Gm‚@¯'V~ @†Ô'ö+NÄ@àâÈ˧À@4N àéìµ@%«öKâ¸@Ø( }“áÕ@B]Ÿ ®@J\Áó¬!Å@¨ÀTmÒ@Hϰ Ö@4Uv=Ð@‘*[ <Ç@‘¿3:ýS£@q2íÞ«¢@4DKö”iÑ@táó+¢ÿÐ@Æ•ÃÁÀ˜É@(¿Ê?'Á@ÔL¥m@Á@æÝPã¾@„Í™)vÕ@.¿Içðó¾@ùÕO×ÛÆ@ kxeW‰Ó@¨· 4…ÉÄ@1*DwhÉ@¡n „`ö§@8ÆÿÝÐ@aMl«§@ö'§ŒæÕ@Âñª»F™@C}UÌ@ìcެ§×@íU;lr²@jm¹ËØ>Æ@øÕ@½µ@Ù¤½’ÎÂ@ŒˆL€-×@5øºGÒ@qd‚Nô²@ÂÖ­;,×@‚BKʬ×@;?lßÎ@ã¤~"‘@Fç|%Æ@FRRü±öÕ@OÅÿí׽@?ø,ìÓ»@ NPù@Ž‹°ÕÑ@Š+!⇩@*µä@ÿšÈ@0áƒBVµÅ@é40.ÉÅ@Äþ:%Ð Ä@p7ƒ›¹#Â@¡ô|vîÚÀ@K3KÁÍ@ –2*Ž@0 fÛdŽÑ@“Z©>Vj»@<êZË#Â@=0ÄC¦Ö@”«ªiй@ ÉЉœš@šÐýùkÅ@ªt<¸sRÖ@¤‹=Ê@¸%GÏÉ@±äfbþÑ@ÿÀh±½Á@cü=Ð@ì#€ÐhÓ@ÁZ1É$¦Ç@ˆ=œ0)NÖ@ÏhÖ2 ׺@!±†ZË@45©œ²Î@IÕ/wœ´@"ÔðËÏÓ@ #¦_ÀÅ@hB„ö@šzÝÙ¾iÁ@\äϤ ÛÓ@5&̘åSÈ@gއ•pÂ@ºÂ»0ÂMÔ@$[„YlßÅ@þ3 ËH"½@ºn¸M¥Ã@ÌGËzÙPÑ@ÈP€#N¢Â@x‘Äiä>À@1‡HÿŽ»@ú¿•»’Ö@™ŒºO!å¦@†tÛ\îˆÒ@°ZùŒ>Î@e)Åê§7È@:›‘m¾ËÑ@Úž™8œÕ@€m²’(PÐ@ÀÃx¬Çr×@ÒÉÄ—Ü»@[]‚~$¨ˆ@Pwè<ÁgÓ@ÀÇ|ª˜­×@`h7ô\Ç@n` ë0Å@<¬Ê£ßÝÇ@ñŠjâuÅ@ÔHæ?AÍÖ@ü™MÊÐCÔ@ºq =4.»@èvg³@DÙ¼k´¨™@fóÊ·kÇ@£·]0UÄ@§2´”Šˆ@,Uv‹íkÃ@ÖUþWøÑ@Mµëƒ…²@hÐÿ&[I¡@z2˜>µ¬@ü;JX.ÕÖ@Ùd÷–Ó@È䤻1Ç@¨:‹MVÁ@|w%ˆ"¿@3PÏÍ@`Ä_ ™_³@ü%9 Á@”ó*\„Õ@ÛÖ>À£@övÐdl(Ÿ@—¥eóKÄ@•oßYõÕ@Ù C œ‘È@0åªÉ3'Ô@’‚íˆW©«@á°˜nÊi€@-~u|6j¢@Ö–…¹´Ã@ðt²KíUÕ@÷_¥¡d…@s ÷¦í<Á@öbÓ}xy²@ú…Ï:ù’Ô@BÞ>™LÆ@€ú9¿JDÓ@§Ë´ü¹@Õ9zn4º@Ðêˆ?§vÉ@:‰xrœÇ@`ÍðÅÖÕ@޳zWõ™@ž_štX?Ó@h5·ó1€Ã@ ‚ÆBÀ@uҴ郋@b²¬×ìÐ@Ü@FÃÌ™Ó@˜¡€/*¦Ó@ œ°¹YÐ@“¬j¾ÑÀ@ /1%‰½@1yŠˆ¿Î@ì¤pI!Ì@tÔ;ÃÁÆ@XS)í±.Ã@”¦ Æ@P­ÜãYÆ@tAŽø3Ö@þ-ˆ"LaÐ@,1î=öxÐ@° ªAh¨¤@þõkü õÔ@v CÿÑ@Ãç6;)È@îm¤-ÄÒ@©&ª­ÐË@±£3ÓаÈ@ôx–cº@KxÔS–@°„^«¦'Ð@:{ÚÔ°Ï@—â°ƒݺ@ Jˆ†©½@ÒæÒ­Ë{Ò@Hj Ÿê-×@r>¨yPA’@á)ÛGɯ@Mr¶ ÆL±@± ¬ýÁĸ@­!j‡¦®@fÏëýòžÑ@‡I™§ôÒ@„A¾P¶ÓÁ@©GCÔ»¼Î@•Œm’°Ï@y;3WôÊÎ@4źfÖ ¯@≾H«6Ã@ü‚C “ÿ²@˜0“€U’@¬)¼åÑ@¨Q?™¢µÓ@QK—¥õ–@è¯Å mÕ@2îÃgaÃ@Zõÿ¼@!ŽÁ@nú—TÈå²@Z¡À…!Ñ@lý»˜Ç@:1‰Ûb…×@Ð[9ÕáîÖ@h»ž,NÐ@¨AUËÉÝÖ@Ðû2r¿èÑ@)¦Ék€Ç@º4cdûÃ@\šÚwÖ@c01ðfš@.…f=g—³@,çmñÔ@ugÉ?0p¦@õ¼Õ…§@LÛ¬’OÄ@"ÇL¤G È@U'Gâ9lÁ@¦•£¾È@"Äã ÞÐ@“ku3žÀ¾@¡ëø/ݸ@œ£6麷@ªÛ7vÒ@Ö@Ó¨¤õTÞÂ@ Yê û±@¢Ýê‹PÄ@€Ñš:üÈ@Üø»^AÏÖ@@žµ§8Ã@P[BÞžº–@¼®ªû!Ï@V žG÷•­@˜¤t[NÖ@îÔ*t¥¬@{žÃ$aÁ@`É’`ĺ@¾ÇË:½@j b±›ÆÓ@ñË*É#É•@“·ŽMÇ@^›7xV+Í@ÕS– uÅ@9Á³ß9XÊ@2]m%ÎË@p d€Ô@,·/•¥žÓ@Ã2¶OP‡Ê@Dâ+I%±@ˆ1ny1¬@0qySPÆ@uMÈ•K À@(Xx’˜µ×@Èáwl×@,È|f×.Ë@g÷×ÖK­@„M©RòÖ@î$˜.ˆ‰@h¯¥CíÕ@mUÀ lÊ@YÍÑöÔ@Zf‡½þ/Ë@hMµïÍÓ@G]øÞÃ@o¤Ç"ŸËÍ@"{wìÔ@ºU3LÏ×@§ä¨Ó¢@p$Èyb}Á@&Ý´æÁÐ@¦èv_M×@¥x…¯@¬ƒzç÷Å@0-$Cç÷Ê@‡w•¶QŠ@•Þ"›œÇ¹@„º¬ Äv¬@¦q{€ëÕ@Äuɸ×@â…¸àÔ@††äweˆÕ@ĵ0h@¾×@ÐxŒªÜ­@ާܯh•Ç@¼¡AâÓÏ@/5çQ¹@±±z¦ï¶@Žâ¯0Ý›E@Õ¢a!Ç@þ!£èÅÕ@Úô¤ŸÁÓ@f3µlÒõš@¬óóÙŽ_Ä@p8«½Z˜Ç@œZdÛºÕ@èb¶!ωÑ@²s,VÚèÐ@TeæÁýáŸ@šm—…Õ@p\LÆcÉ@jyÒæo}Î@/ŽÖ›÷Ü{@IÁ@ùÙq§tÉ@_1†üܨ@l°ôÇŒÖ@…„Ð òÁ@Àq{Ò%ŠÖ@>®7±¸@C2fÉÝÆ@Á 3ŠCÁ@­ÄHgXWË@bâñ­Ò@š6ÎI2^Ä@HøeE·ÛÖ@˜i6“ØÃ@A=¾… -¦@„ÉÈÿu×@x¹/9fÊ@-àGðót¸@Ì—¢,½‘Ô@¤Ã(íÿ@¹@D"àŒ¥Ñ@ø:×@,¤ìNª¾Á@¡k“?)ж@`^©2yî¸@$”žiOëÒ@¦S’”Ž Ö@˜ÞªI·Ð@pY–Y¬Þ°@ÌCPSŽÝÄ@º#ÑR8’´@ _ù1;«Ô@‘z`²dlÂ@ÒÌ"œÔÑ@‹Ø™:‘WÁ@É€¦Ë˜æ«@º[®Ú¤@„JSgÊÔ@oâÚÚç£@æ¸fYæsÐ@¨™ RJÌ@Í-+i¼@ øÇ2d‚¿@Öf6Ð@¢’-&ŒÁ@Ù %T·Ç@„M#ùlš@àé¯;_2Ó@¸l昇Ç@!ñ uÁ@”3ΘCÒ@¶ÑñWÀÂ@•r¸Dú¶@z-ôxÆÂÐ@‚·™fñ Å@ô0Îq­Ð@Âeµ›§Ò@’¢»Ñ¿ Ë@H•j•Ù×@Ê@e£]¸Ò@úô81& Õ@XÞ¯ Æ@³¯6Z“á®@\f¦Nÿ@Z›B>BÖÑ@­[1DÀ@¥Âó'Ô@cí¿hù @بÐÑ@*¡ îUÓ@ÿŽý§À@~_-Ç1Ð@tƒ £µ@ÏÉ >^¼@PùØIØ Ì@Hp©vaÚÕ@GΨÀ‡W¯@PLž[Ó@¬Œ®Ã‡Î@\`Àm}.¾@ÄÆ&EpšÊ@DÁñé3 Ñ@Å©w Œ“¡@v8$M5Ó@.ýZbçÇ@vÉzìÕ@8M%f4Ì@^IìTÄ;Ã@8:ÅîÊ@Áü‡ˆëËÇ@³¢Ú•bÍÍ@(£–ô×NÖ@J£ ´CÏ@lë ×ÄÓ@ˆsg£$Ö@WŸ_´«Ï@ÙÅ —õ»@OAõlü=Å@gˆU¯‘¹@†Ö4ÆCÝÕ@¨¡AVÕ@6”ïŽ[7¯@ãn»³›E¨@þÄBØvÒ@E¢´{ªqÏ@êXÉâŸÓ@ÆÜ8€!Ó@þùl¿×@>xA¼Ë@Xz´4þŽÔ@—ÄŽ)|Ï@>²žÜ6œÐ@r£¤ÿ°Õ@j¼»ãáìÇ@ Qý)ÌHÊ@T›GñŽ6Ñ@U4¢ÚðPf@N½¢Ø‹È@øj †×Ï@VÑæÚÍÀ@˜ý$[<&Š@kø¡‚ˆÇ¡@Š¿Û‘_—Õ@þ:05²@nTHh~åÖ@¼áš¹ïaÖ@@9{,BÔ@­›‚[ò"«@“.^BÜ(Ã@òrµ,§@¾[T¾Ý8°@´ÌÂ@ ²o´ëÉ@G$å×DôÉ@GZ;Á¢@KY¸ƒ ö¬@YåA½ðÎ@ïìN€}Ë@(; TˆÁ@ŒÍ(PÔ@Z.¼ôk»µ@UKu °IÀ@¤`u‡,Ó@ Bìl8Ò@ Ë[üáêÌ@˜}^mÔ@ù¶« ‘‡Î@™Ü¹UÍ,´@_Jz3‹âÇ@ÉÎF¿×@—‚ Æ@¨f0» `Ó@f‘{Â@Ž{³Ô)žÑ@Aª˜¿@©m¥7#²@z²ðÛ×@†C(À@Cݧ *»Ì@ÀAÚåÑ@ (ļy5Ð@ ¼ÉrÏÇ@q®¶H7·@wn””0Î@@z½Í¬©@¼p>ç”ÎÆ@K7ç⚤Ã@ªpèòò\Ó@Óûޏ@eFý›˜Ò@žnBíb»@"Šó õÇÒ@ÂËñ[]»@D:ãxóš@$hoó>/Ð@SOC°]úÍ@* +mÓÔ@fGÂ~8CÀ@¨»ðJÙÊ´@Ù@¢æ)®@Ù“×^u´@’—û5«Ò@q˽)ˆ@‚¹¢8¶J @b~nϺÑ@tŒïè!¼@}_zIÃ@ÅÍÊ蔆}@3xRxÕ@N,¯§bçÕ@ƒª6<€€Ê@=ráäYñ¢@6ÌY"ži€@$œx8ÃÙ¤@.wߊ®DÓ@®&>[ÃÀ@û‡AK®iÏ@RN­v­Ó@ß™eO¹@“~Ñ•Ã@™¼kyÉ@6U¯]¨WÐ@Ð~ÕÁà¿@'`­8âÐ@zmÏÓ’¹@ÅäÌ,­Ç@JՙΆHÖ@0¡8¢‚ÓÌ@MÙ€‹ È@fúÄ@>ª[~x_Ó@Ž9»Žy[Ó@ºE1}¡œÃ@©QºzLýÄ@0”G1 §@œ¹DfhG©@?ÔtÅG ª@4ëKOhÐ@w7˜&Æ@É{7jäù½@aeªÁ@QØžFuÁ@¤FÍC_WÒ@ìŒ^”„«Õ@6}RÀ@ëèî¢x¢@gxÕ®ÆÕ@˜VVe—Ã@F¿ÁV8Í@Ѹ†%S9Ë@USÏâjrË@çd•ß9º@]k(}Ï@ZA©ÖpYÔ@tˆ°CšÎ@D2$—À@ÜFu4Ë@e¡¨g_`’@éè&|ˆÈ@b,~'gÔ@ ¢xïÁ®Ô@ºDû(¯1Ö@„ñ vy:×@Ûâ0Yã%Á@{®sÑiÀ@XúËbÆáÓ@{Ó€Y…È@ð(ðŸàÂ@5L=`ÐP¾@"éœIPCÖ@ü¸ 7ÁÎ@Ñ”ù/•ÏÁ@úlS[ç˜Ô@WšiKzÍ@Ò‘ýÅ¿ÉÁ@ˆÈ d!,Ñ@®ëŽ Õ@pG>ŽË@ Ýb2¡ÄÆ@F¤^ÐþÛÐ@y0ü* B¾@î|~^Ô@C,±¼‚‹´@emŒº@uˆ…ÖÎ@§§­»ÛÇ@‰ÅZ\¬@ª ó#gÐ@S~ÂSÀ@õ=~¿@x Ý×oËÐ@6]ÊÂcäÁ@¦FRÓ†xÆ@:è´DÕ@/S”íü @´²Ó@„l^åK½@¼NkÝ*Ð@Þ8]Z7?Ð@)Ð~¿µDÊ@D~I ·@ Ú¶`Öº@[²vÁ_Õ@ßUK0Â@:ÃÖ·XÕµ@#æqk±@æ4> ´@’,yaWÁ@nP·iÍsÓ@ÿÄDðÂ@pcâûÿÉ@–lâ6öí¼@ø°A—Ï@â½v¿Ó@{íOXV¹Ï@lLOê½ïÌ@6ô½m*”¬@‚Dkty’Ð@_å'”þ§@ºÙüg¢Ò@¿çWxÌË@¨AkmÄ?×@t‘ežðTµ@‰¡º±%®@)|$k ¦@ï:Xé¾2Ä@"²¬I¯@곫ÎõÖ@Gxk¤@£Isiž@lôÀ ]&Ê@-±¼°=¿@r“ç òÐÆ@Ì9’îð=§@ì[Hêd}Ö@M‹7}¾É@æâJ™Æ@`åSÝmÖ@=?Í)qÇ@u{Ìi@«±@9“µôUöÈ@°ˆTÂã}Ë@¬A(B§}×@Õ Š´@,c+ç•Ö@§ºý.Á@ÀfRNl-³@z¨¬¥2ÙÅ@’Ö3¯¥¯@þk¬¬Œ4×@–u«0¼@pBb¯³ßÑ@ï<>iÉ@æÁFGŽ @˼¥=ƒˆ¬@”Q7F°•Ð@˜äÛÓ@^ F÷Ó@=8ùi?Y¿@Ìd„¶·Ä@nÄ^øÊÇ@— ÕÖ5NÀ@ÞzaîíÀ@D7‹§®Í@î/¹©Üº@8ON šÐ@Æ,†´¯Ò@-}“<¯ÿ¼@@F ÐMÅÇ@NÀ¦ÃÄ@´DĘÕcÑ@ÊäMKSpÖ@'~t5–Û@>1ѵ€Ö@°å¾(¶?¶@+wC‡ZÖÏ@–¦½©Â@w9n œNÏ@ÞÌâ«ÝäÓ@ÄQfêù<Ð@´œ(½Ò@`e™ò¢º@O°%â‹­@ŽƒÇRQ<Æ@@Ûc*2/Õ@b âz„½@ßSÓ¿x ³@;Æ4%÷ã´@b!óÉpx¨@¸”œæ(”Ô@-¬™©¶ä«@äVÒRT@猘¿ž©@ìØØ×ŠöÅ@Ã@Ô„øÃ@(CöÙÿÓ@,Ƶ–ÃøÉ@ ÒUkÁÐ@½³“Vi{¾@áyâ¿iÃ@êlj(FÕ@©#‰Ï½±Ï@¿S_Ò@Âi$ÒÃqÁ@y$æÐF¦Ä@wÉM§ÝM™@JÏÉmBÎ@uã àØÆ@‰ì1  ³@vÀ¹‘HÕ@KãEƒ@ÏcGcë¾@èâeê^Ö@‰´Q€$¬³@<LññÔ@îTõ^(Õ@lU™9G^Ð@KÉ|³& Á@¹ëHHf±È@³ÿ½ø¦@få„£"Æ@-mŒç‚@À•w<À@r’æwÁ@—³VþÏÄ@²Ô>ÿKé¤@;iš±Ê@£šX¤É@ìÌì…äxÕ@èuöÓÖ@\EçñÞLÖ@´ggïûkÆ@Zê‰æXV×@î_ûÿÐ@û¡ñ€²@Þ“ç’Ö@þÎË(¹O@*Ž&÷Ã@ÕÄÂB0¨Í@VîBëº<¼@dI# Ý­Ô@˜\®Ùê=Å@Q_^‚Õ ª@’5Ó=òèÐ@Ü›ªZ`³Ì@Z|°Ô;«¾@4ÁÀçTy@Œë`ZDXÕ@5Å51&!ª@Ó1sÛ•×—@Û­f„¶Ã@ÙËmЬ´@Êð®áKÓ@6~ð¤gêÆ@VÇiÞSÔ@<“›I0Å@Ƽ]ÊNÂ@ŽóDHbÖ@6BŪ­×@JÄ‹qQÔ@~Q¨s¸@{[”=(Å@˜Ês5¶@0ßÛa¼@`òòÑ$ –@r™ Ö’F·@å&»^*/”@%C‹ªøê­@¤€òLÆÒ@<8Å£×@Ý·Jþ“Ã@î=³_jÓ@vÐD^½@äºMʯÁ@7O\xŽÉ@ñ¹ÈhÆ@¢Ø¡»ŠÖ@…ØZ8—œ@Ú™u‹·@!ݧ+Ó•Ç@¶ íÖkez@(µÿ2¨Ï@¾„¬^@Š^›oÓ(Ï@6úuõÄ5Ð@[7?†‹Ùœ@–Ó¥²Õ@2Ò®1ÇÝÁ@ÎÎX:Ô@å]8¯\+±@ ÈGLë#À@Vcÿ[}k×@ $‚[^á¿@!6°ëVÃ@J«É¼Ÿ@ð5±ñäÂ@3YY 0aÁ@¹mŒ~N¬Ä@d¡¾åÉÚÖ@ zûZÒ²@Z¤RI’Ö@•T4¿@tn:Àµ@¼îžìÁÒ@ÉÌ»”éÄ@|°‘våÒ@¶j@jµñÐ@"™“w²i¾@[Ò‡)pÁ@©oš¨ [„@b ®|¸Ç@(†¶ˆ@VµŠ²&Ò@è¾]ÆWdÃ@}ÈÂÍú°@WC¾ŸR·@ ꃬÔ@$iÙEA6²@FU¸•ÌÈ@Øe`EXÔ@Öûzå=Ö@Lƒ|J˜e@.ùÍk Ð@ ™±lüÇ@hðÀê®™@5þ‹‰Õ@ÿ5–âÐ@x`:_ïóÍ@€©ëé§šÐ@n¯¡áº¹Ò@ís¥«Iµ@ý?(`È@Úäåk|iÏ@ø*»$/ù¤@ƒ ŒO*ÿ¨@ÜÞ’^K¹@晋AôÒ@MgÍ@S®Î@iáV¶g¶@/‚ÏSø¶@ä.Ð97ýÔ@Da,—]ŽÌ@BÌr¼ˆò@_5›ò &¾@`¡cðXæÖ@W‡ÃiÌ@ X¸²¬Ä@ssUGêl¥@6ÌŠøõWÑ@ך}•îÌ@>Bgm4Ò@à³#Ô@º7INõýÃ@ÆhçkJÃ@š>Þ.nêÃ@fQ×fUİ@{+¦ñ¿Í@lªvuôšÑ@ïYWDÆ@4bFí{ŸÖ@AW÷¤ öÇ@l9j#ºªÔ@+ÚÏÐßy·@ ¾D¦!±@SG(j¸öÊ@ä9Tß9oÒ@³ÁÃg‚Áª@ªS튗8Ð@ÒPØ0{€¹@J™s¶Ð@´$pIIÄ@å’ôó1…@žÂ“Í¢À@Hðv$ûÓÀ@;`!ã?i@ÏÌgš Ï@f‡j˜Ó@ 2ªƒUl@ò- A:×@°Ç)GCV|@¾@êý@cÏ@x¤rrÿÆ@žÖ—øü7@Bôä•ë¿@6ø‹›É.Õ@Î$‹Ð@Áª{_Å·@ÀùI„4†Ç@*·kGšÆÃ@ƒ,P<Àv²@þ6î/qÒ@Ýxm¬*Å@oÁç!ÈÐ@8ïY=tÃÒ@69Ã0°Ò@¨YlIÇÊÕ@tñ§;¡ŒÎ@pü]8e°Ò@%Àz‘í¸@™#Ø×³Ì@ÛS6–³@Z™»3ê®@žò<fw¿@ þ Óm¹@€ÍáÔ@¿ÇªÁ…Ê@ø™g’Ö@n=QÈÄ@{Ëíu¨ìº@¤A³u2Ð@"c*TÊÖ@p-—$@MÑ@ñz£©nsÃ@[¥´FLh¢@!«µ!‘?µ@`â5²@nZ‹WÑ@‚ƒ^@dúÖ@¦SÉ ÌÝ—@÷’°ðKž@û¬e´Ó@êÔ,_IÓ@qü¢¾ŒÈ@#&¸ì›@ÎïÁPj×@"ã/·Õ@.¬½‡v_À@è„캨Õ@îܲnï®×@")±Æ©Õ@Âë2QÅgÔ@5y΄ ËÀ@aTâÅ#Æ@LÀõ·%®@N‚Ãê iÇ@„Ÿ­ûÉÐ@•ýPnb@”JD%Ö@²Š6)AÇ@bAD 0È@i;Cd'N—@§*ÅÁ@β£Ûô9¨@O¶0}Ì@z A‰gÑ@¨ðáR-vÖ@ýŒâÌ“PÃ@›Rͪ,Ã@˜ÜøP¿§@8èî©j¬@¼. ,+Ó@- … µŠÇ@¯âG–_Á@²uŽ”sÐ@ŠÍÚ¿e1Ó@,’1mlÑ@N¢[y2Õ@VÙ‰ºD0Õ@B¹'üjwÔ@]J¶Ü@—i¨z9£À@Öƒ¾*úR¾@H_ï)«É¾@lØ zÕ@>߬åižÀ@`ÁzíF¬@ΓÀ÷oÁ@oõ×ßüêÍ@Õ¶jÒ7¬@}`èH=‹¶@—E¼o°¨@ªÕÐÞÃÖ@¢¤EÛ–5Ñ@ØÛ‘Š(Tm@ë‘ë ÿÊÅ@ì´†úLw@’ƒHåò´Î@Vj›÷ÆÔ@R°™°Ö@¯ç²ŽûÈ@ßÖFƒ@÷ Ï]ïüž@ ö.Q^Ä@ äp‚Uã¹@œØäÃ@r‚–øØ´Ö@züõ°Ð@]"ÐtµÖ@@¡´á68Ñ@9 d“˜ú @yµmÜÕ@ žFÎ÷«@@uC+ ¶@žTï,Ç@êþ Fö¡Õ@}”¬|âD½@š™Òëeº¶@8 ~Àô@^̼2Ë@Ú®ÿ$É@6b×&Ë@ùǦmH…w@q^Ýë$¥Ê@†ÍÞˆC²@’áýœÐ@R/™ä)Ð@  Ë*qzÆ@Ò/C,bÐ@dZ±©¯œ@²ÀÞ—¥Ó@& áEwoÇ@à6G hÅ@±«ÈÃu @‚¡$ˆpèË@ôNq¸7Õ@KM lÊ@‰¬Ö¦¹@hY¡]²ßÐ@Ÿä­L¦È@ï©~³E¾´@p£ó³ Å@ÌuÐTdÓ@|%½‹‚Õ@“‡âI!À@…Á—ëcÓË@ÄABWðÐ@>b*»?Ñ@ÎR¤w,…Ö@,Ád‹Fül@ñÃÐÊ@d6Z†î4Ô@¸ük úÊ@xÌ™H´Ö@.mk5¾Æ@ÇDY—ÔÏ@´%³!¾¸@Dò§ÅÖ@^jfNþÓ@LɆKCu@\ðÞ€ÄÀÆ@œiÞôÅ@ÒšäþAæÀ@ܶW*¼@rùMŠÆ@bÈð¢NÕ@º]*x ÉÀ@ë¡Ú^2t@§¡Fž@Ï@Ûuh˜c@®÷1´ÔÖ@éVù a™@ïKíã±Ì@žHAË sŸ@â?ºÌ¾Ñ@<‹h`¬@ì}%e(É@6a&õ»±@‘ÒeuÊ”@žwA e³Ñ@RDWÈÈ@V¸µãhoÌ@Ê2u À@È~%@„ا@ljñœAÊ@:÷ÌÙÕ@Êÿ|k‡AË@\!çn !Ó@Jôd0^ŒÖ@0º8§+Ñ@Z˜§¤ð¶É@Y@ðÀ^Ðy@†šöÊVvÒ@pí&ârr@“rØö3×@¬wMÏøÕÕ@0Ëž0pàÄ@î•Ûdc%£@?2mßr¶@zç6ˆXÐ@¶¸ ¡’È@GËæiëº@ß-T¡q×É@¤BýñPµ@‚´[ì§s·@!4Ó˜_Á@~3.³@È&U8ÏÑ@r!÷µ`Ð@Hx 4°@ò}â%eÖ@~ÇskÌÓ@þU Ûœ“Ì@ĤHʈ¿@¼zd—ZÄ@h¡’U²Ò@ç¾ë:½*Ë@’‡”¢5X…@vz¼½TÃÊ@ýëòÄ@ß~q7‰Í@jû^¨°L×@­vwÚjãÁ@Ë)ÜÞQÄ@Åóû1 ¦@RQéÒ6×@‘wûÒ@–c xIÇ@J„ÜÓŸÆ@d˜7y%”Ò@@÷­5  È@€ÝÆÁh8Ñ@ÍÿÔMÏ@0&x6•ÝÔ@T+˜Ô@¦GÎñIDÖ@ãýOZIP¤@ž”ZED¿Ñ@. ™’(<¤@æ}A „P…@žIõò3Ö@°¤AÛí›Ñ@ÂQ{:RlÒ@¦–&xu°@´íåù´ƒ@îYp%³Æ@A”8b¶Bs@6Žq-ø¶@oZ{íÊ@!ZäùSÇ@ÅÜmݯ–@jW[ÕåAÕ@sB¦ ¿@d(¥þ^9Ð@š–¬`O×@¬Ù·¡°kÁ@¹{Œï²@\œ ;Ô@Þ³=.T×Ï@/kKË"²@‰Iò[mÃ@Jã4½qÀ@ñƒ¯š ²@Œy—iÄË@ažu)oÓ@¾9X%Í@¹á%yÄ •@N·dá0©@-hƯçÅ@ˆ_>JÑ@,u†‹¦z¬@P¡Â5áÂÏ@´ËšN¦@ñŽBÏS³@8ºmòº@BÅ´§3ÉÎ@6µ?ÐOWÔ@‡ÉåqA4B@-숕IáÄ@Ìëä@\ Z7³‡Ã@§@(¤áϰH×@Ê»ËжÔ@Ȉ®ÙÝ.Õ@à“ì^h!Í@‚ ƒ­M´§Ö@KSî:ÐÇ@}û®Ã—£Ã@:Ú $Å@Œ˜¾¯¯Ð@¿KøMgÂ@ ÑdN·¤Ó@ ôz¬ÊbÖ@ŒÆb_äÓÊ@&S+®¡°@tz ævÌ@Á帬Ðí»@ ælP”Lz@ØC®ÎTì¢@‹wk£@Á«-òeS©@Gø{ZÀ@2óé]6Ô@pÚW9jÀ@j^áB:ŸÐ@.Ðé#K¬@“l!L¡@ø¸.èqƒ@\vÝ'š<Ô@}\~®¨Bª@¶p/Z6jÇ@<|TË„ßÒ@PßUŽwN¿@ß@<:¶Â@ÃâråÏ@t÷hý}W×@VÒÏ/`Õ@°5}¨ï>×@ÌHOÕ@Ü·*ô½¼Ç@HVØòšüÅ@ÊÇ2tÌw™@±Y(¯"Ð@àE5îÎsÏ@RÀ⧃‘@7[Î%xÊ@¥Ýà[¸½@†÷H à>Õ@çþå´@QV§$S±@.=w.§èÕ@‘d4xÒ­@‡Õ‚›ò%È@nyËnkÑ@Jf}¹É@ƒ8«Nf¾@Z´ÞøÐ@ˆÿ}´°É@òñ§Ð@Ùùä[ž¯@48®\˜ÕÖ@2néÝ6ºÑ@ì»9ÛÙÑ@°6ÿQuÑ@Œ¯¶J×@´G.µt‹@uEU¯18{@7SúV@…;ªkŒ”°@¸¹Šä¢Ë@Þ•)Mšýˆ@2߈ßU*@¬ÊÁÏÐÛÒ@­ Š!]"Â@P]§a$Ê@•Û¼£tÃ@ I Ñ@’> <Ö@#º:ŠÕ@ö¡¼‡v}Â@¤¡¿ŠÌ{Ñ@‡8t£ª£Ç@.„Èí´)Ô@‚ê ãÑ@+ûbÂç ¡@g0EϨ¬Ä@Ò%üîl “@ÕÅ›¾Qt@´˜Ráñ5¤@@¤!À†l@<ŸÒ(Õ@R y×Á Ä@¾-NrüëÄ@¾Ûø”Ê@ýb!2t›¿@HE·õš¨@œ!€KФÔ@Þdê kÈ@m[¨¬*¤“@ "•Õ Ï@k©²á5¤@yM'³8»@Ò7KÒÕ@0”s½Ð@Æ…9n¤@¡Óœe5§@”Yd/»•º@ÈãÞJ¾Ñ@ü’¤ò±É­@zz{ÇÍ×@ lþa°@ûh‹q®ÜÀ@’ǃÝÐ@Ðû›¯µ½×@¨0œ§Æ@ 9BÏSÁ˜@ q–è8ÁÕ@fË ô9ßÒ@ÓMyÔ Ê@&ÀÈ{üi@3ùsÅâœÁ@ê-ªÏÊ8Ó@[ï>¤‹À@êè²slP±@ú€k>`¯@Ed1 ¹@èÿ\è Ä@¾FÞ‡CÖ@b¸?äh¼@Ú4´Õª»@aèf<)@À@÷±RZ ‰@³í M`À¥@¹ºÍ4†bÅ@Ç\_ PŠ@«mg†y³@ÆÊ42©XÔ@ÍGºŽÕ#€@¬bøW¹Ò@WZÂxÏ@Ò ÛÍw`@*< $—\×@Æõ¶ðLlÐ@ÏÛùç •@°)Á!‚Ó@²{5ZŸÒ@¾aªÐ@RȯÎäTÈ@Ž25v»Ô@á-ÎÛÿ0|@MÁ>ö„ïÁ@ÆW¯#9Ô@ä¾³¹lÓ@›$#æ´¾š@†{œ$£@üÃ&'Ó@|µÜBü¹³@$jù†!Ñ@«þeS´@ó2扻èÌ@ø¶þÔ³aÑ@´bÙÒË@;¢“38I‡@=¸NˆÊ@ôìÑJæÉ@×:ÿ«“òÆ@é íWÏÏ@ꃼ€ Ó@"º«Æ/Ï@úY»`Õ@õ¬÷uæ¼@¸£üVüUÂ@OòŽ›0À@RwÜö×@ÌîTê°@ã â—6”¤@˜÷>@ò¦@•Ú¸ø©Ã@FL¦@ ï?‚d¡º@ôO Ó™wÐ@ÎÚ]IbÆ@2©J¤Õ@ê­<—n®@Â?¥éHàÓ@$•·×8¼@(Ÿ7XŒÔ@“6Þ¿¦Ÿ¦@Ñ„ÚBX®°@ÊÆƒ¦_gÃ@hã²·4±×@‹GÛ•[Ô@¬Q§ÑªèÓ@6—aêöÁ@`¸ê2$ï¡@žŸn­ ÃÆ@´)©3µ@`-˜ …ºÒ@¨×©±eùÍ@,”aãϺÒ@LVù'½G¸@ŒJ¸ ¿@ Û->ØxÄ@Pm¹Ê×<Ë@Å]‘PçÒ@ .lJ\èÕ@¾þn™h"Â@9;ƒŠ®@ýà_WVÄ@KyIòÊ@°Š¸¦q~Å@—»YHJ­@éa¼ÿ®©@¾#maÖ@¡9óºK©@¶dP•0ôÊ@z1ãméÐ@VnÌ\Ú„Ñ@«å=±²+Â@{‘’w¡Î@‡g¡´*»@D5¼yÑãÆ@@»c4—×@;TL½ôžÂ@ƒ‘cCæÂ@ôYXâ@ÎÌ@¯ œ-Û€Â@òa‘ÖB¦Ò@Jôs¿CUÔ@]Ä• Æ@È8Å×dYÊ@¢vg‡ ³@ŒV¢QÑ@®Rm °åª@’”9@„½F,EøÖ@Üœø~¤—Ó@-$(´V—@\î,P)y¦@”€pIïÕ@ UÖìÀj@¿ϯ º@p¦ ƒ#íÕ@gÕ“kË@1º*Ã4C¾@+  }É@ÿ@žP™GÏ@MU4ýÛÍ@.ëŸÍ w×@.‘òBhúÓ@ MÄŠ(Ö@2Šaš"Â@™¡òHwg»@sT´}Ò­Â@ «`oœœÑ@SU«,ŠÆ¿@zæË47u¼@zå!t‹@LyEØ£@¿Cˆ²íl½@J¤àÇ6NÑ@ô’‚œ@wÕ5×Lo„@ªõ\/.×@ÓíÈ!]¸“@hTuFY¸@ž /3×@ÔjN¸o¦Ö@Œw3É‹É@W¯áÈ@ÂË*nP§Ö@P=‘X­Ñ@:í§¦ï¿@«5ÀVOb¾@øÜ©ËŽÞÔ@%N±yº@Nj”ÂÙuÕ@?#¹Û#Î@p5œˆ¦Ò@غְ+—Ö@ã½ê¬I¼@ð&<¯Ô@/ó\Zı@~Æ'æÐ@ DOºÜçÀ@ëØJ™ÌAÈ@™ŒE}½?Ä@‡-lÆúÜÆ@òšÀnßÜÎ@ØýP‹vÃ@‚_Á÷ƒÔ@Ðu¨¨«@¢®½6Î@6þ22Uª@¢–ÿßÂÌ@äBÄ¢TUÑ@ ìƒ>»×@R*º|ÀÃ@ V¡p$Ñ@ºDd`^,Ô@ðSz_Ò@øå«ÛLÑ@„+§Õ@Hn-H]ÃÓ@¨Q%3­\Ã@¦¢&n1|Æ@º¸²Ÿ‹ŸÉ@1°¶ÈIÅ@𰦀UÈ@Y²Ý·Å@"98kððÑ@B.Þâ£Á@Ë–L}s6Í@¾5Pª2y°@ö0Öýv'Ô@ðbQñÖ&]@Ü4[ÃÈ@ξԕ Ð@{žî…®Ñ©@>QÔ XÛÇ@ Y°†ÁÓ@üûûGŽþÌ@¢f)D²_Õ@dÌ*Fl0Ï@FÑØ\îíÖ@N€ÎÉ«AÔ@ôÖ?²ì…Ñ@Œ·®Ñ@`•}\GÕÔ@Œ¹²$qNÆ@ƒ0ö ´@xØ c}×@©^,¦¿@Ê ‘ÀpÓ@2þKÂËÓ@¼ÏîTÊ·@‘¦¶È‘Í@ƒö—姀@Îw>²@ãå¸=»É@”ƒRûÖ@ž.ELý ³@¬rOo§@äŽ]ŸŠÓ@”ï'—å½Å@"sZ¯Õ@Èd©kN_Õ@žÝ¿êÎ@D‡š¨?Í@AhA· Ï@Ž=|ò©Ô@,×ÕŒÇÖ@°D×” ¹Ñ@˜bûЏĢ@†tXëHw¸@ñ ØÜÆÎ@¶[™rìÔ@-’æP‚°Ç@ˆ˜Þ|ŽËÇ@ +þ+>Ò@èsIfÆÓ@Ø\ßEFåÖ@Ë܈ÈaH @X‚ÕiÇ@[÷^me³@h™º ¢rÕ@Ûu{²@=3º½ ÏÎ@T}臬·@§Ìæ%Ò@™»åƒá¶@Øï½-Ñ@oÁcá´@GŽ07Œó@@ɧH£I7¼@žôc¯©@t½Ë 5Õ@œ½Ï;^i @î\ë‰×@jSÅP(@×@:îq·Ü[Ô@¯ï×KüÕµ@÷f>ÖŽ›@ß©ÂÉêßÁ@麷ôšÅ@jÚ¼¤¯WÔ@sŒ&B K—@€§Î332—@S]Ê·¸›@ÿº#‰Ðe³@Þr·M‰XÐ@V} ˜ÊÄ@i ŸTDÇ@‚n·†¡×@’Ð_¤´Ø×@Ìä·ÀŵÖ@2« |Á@ÊCÕ‘ÝÓ@Ûõ!FOŒ@ $áùݸÉ@E]d‡‘¤@Ù’_Fçö¼@Bµ äÖ-Ç@šßA×Ã@fågxG»@m.P»|‡¼@þI‘Œ/Õ@ߎ5_«@ÜŒù¥š@(qL /«@˜YHÉ_–@u³¢1Ž ž@€<ž`»³Æ@õÉiX™ß˜@L4Õ+™¿@Î/†Ä|×@­ÙRŒTÆ¿@l¯«{µ!Ð@Z¤³øŽÌ¤@\¤ª)ZÀ@ô¬)ü±@«ç!—zÏÄ@Fç´ÒçÇ@¶güûO—[@[+îdðÅ´@Å3´zœË@§D…-DÿÈ@ìÕו'HÆ@);|  Ì@/©Æˆ‘“@{+‹&XY´@z’,[“Ñ@þXU+m†±@©‘%—ߘ¤@pOïáÐ@ž³ÁjÂ@ìQ×l]«·@LËn0ß³@O\)3¨®@Vêýô ¸@8‰gβ‡@ ×ࣇÉ@vº ÿlÕ@êiØâëtË@„<¿rîÄ@“J,†!Ó@7¬pYaö¹@v-¹-bÒ@“D?Í7ùº@ºV\xˆ†Ã@tdhaäÒ@‰ÐB´É@”øç×Ü+¿@úxIàÀ°@‘³Õ9–É@˜\T&i×@þñÔïû§¢@Þ²Ðô2=Õ@mÇ×#ï&’@ráHñfˆ´@,íì ‚oÄ@…g÷¸¹@-bbÀ²žŽ@È;o³ÄìÆ@¾%×7‡YÄ@Þ¾sòÒ@ÌèŠn <Å@ZÐô¿Ò@:ÝòJ‡È@ ñÙ—MÐ@sr„fãv@­éTVm Æ@Øl?zù¢@\ß))ŽÐ@`¥eò÷Ð@¶¨«,™ÈÌ@Œ€@ª–V×@¹‘機EÍ@ îQa6ÕÕ@–ä>6c¶@ÌÂ/³iYÐ@ôÌš×%µÓ@r‰'æ=´@æà™­éüÓ@ éæ?ak‡@x³@b×@á ž÷Ê@?›'>¡«@Æ@FÉϳ­@!68lÔwÅ@¾có/AÔ@})™g £@Æðˆ4¤öÉ@Jõœ{c+Ê@øÝ@®Î@*m‰@úŸ@¨t1_›Ç@N0Õ=Ä@¤©—mJ¼@õ VÏÍÓË@‹ƒ»v€Ë@xGðeÌÀ@Á!õMï5Ì@³©ð“º—Á@º­UèÌ@_ËÞ¢"¶@+’ØÈ@ü:%Øo-Ö@méAÁÄ@κ63÷mÑ@ñb=Ϋ–•@aÿEÊÍ@Ý+9Ú?‡¥@,ÃR1MŽÈ@È{–øË@¬´3²CÐ@Wx Õ'Á@®À•³z¿Ó@v‚RrEþº@ê£L¹7Ã@Êôö;”Û±@à¯w~YfÍ@ÈA'¼NÍ@õÁZÉ]¢@´Ü’ÖÆÃ@â£Ñ,6Ð@ŠŽ–í¬µ@tðžü"Ò@ú£Ã)í“@ãºÌÅ@uƒfÁë·@œQ«%ÊyÕ@ Å?kÈ@ð;¹%‘DÎ@­âÐ{uÀ@Pâ]®;Å@[hÎc„ÈÍ@*îÚ¨¼Õ@¬/R‘ÝËÖ@—Ù±¶²TÁ@¿ÇnJ†¤›@xÌZ"Ñ@Üë¹PiÔ@çhOŠÀÏ@të(ºà¸@ãëõ’6@ù¯‹Þi¡Ê@Ž%Ҙġ@ mšþdÏ@©‰¥´Az¶@uPÙ•{™¹@ 骬#×@hÉ»Bp>Ñ@¶š¢51èÔ@Îà¡l¬o‘@"Æ9`døÂ@b)jç¡×@¢G`¤Ö@XÞ7œÔ@ëµ­ÿ1¯@"…;ÐWÑ@…Êîf§¶È@‚Ú_jŽfÑ@~§Ð" Õ@ã”^›yË@ïI;€!>³@Àõ>"¤ï»@ÞJ³Z²˜µ@’AܽtMÖ@?c¥†ÇÆ€@Ô+_‚œÍ×@/dw¤NßÀ@´´ãhÿÐ@Ngè”E›¤@ìú­æÓôÒ@Þ÷\ù+Ö@„#ñÑÅ÷Ã@Â?¤J×@%m(–¼@krÖˆü¥@Þ¬·´Ð×@ÓIxòf¯¾@ @5’F3e@ÂÞÌ+ Ä@žQ `;Õ@£É£&1Ë@õ*2D˜Á@qÖM² €Ä@hi¹ p±@ ìÆŠ:Ñ@ÿ…`—»@dïAËw#»@œ}agùÓ@€¼iAcÑ@'Y¶‰OÃ@ªL-¬BÕ@÷?ã̾@NÀÇN»¼@ÎËPÔË¡@& ¾Ø–Í@¯èÆåe«@Bq«„uíÂ@Øn¿5WñÀ@“ ;Ã@« ¤«ö¨Ä@¨Óº<„@ñàxîZ‡¾@L†p/,‰@õdcÙ­ @¥EÈIðJÊ@ÿCˆá¡É@>æg—Ñ`Ö@ãF¸Ge“@Nà&¯± Á@aÚ^3WÁ@"ìûìå·@ª×õ=Ò@µ€2”s4±@ÙœÒ|Å@ªtQ=Ë@œ{“Ë@ÖQŠƒ„JÑ@j‡¥kÎÄÍ@Ž´*º_Æ@E\Ò È@Þ«*‚’xÐ@ÊbIæYÔÖ@”#ÕÓ@$TLºÁ%Õ@ÏúÍ:Í@öQÀ´ì&Ö@;¼îòwµ@PÂÏÛ‹ž×@hzO?¶;Ð@Ý éÜÓ‘È@F3y‚ϲ×@øæZ/äùÎ@”ÀrÁ/Ê@˜-|»ëCÖ@#êS?ÖÅ@c,¸Ò¾@÷¿Þ9 áË@…ýÁ@8·<#¾@¢r‚À>À@âñÊcîáÀ@˜½)DÚ·@¥ˆéåóÉ@Ø3ñåÕR×@)~Ç@ƒ¦•N¸È@+÷‰·…Í@Z›fŠÓ@âo³äÿÒ@MRÙôÀý´@ƒ–¿v¿áÂ@ÈŠN±Ó@É\;òñ4¶@h÷(ÚðÔ@hpIˆ°Ô@Ö1È‹=_Ì@BùZ焪Í@´î¬Ú¸@‚ë7½ÞÒ@$s»LBÉ@¤À ¤lSË@0ø3·ÆÂ@Oß'¶z4~@oÞ[·X¤@9HßÄÀÊ@•¨ }nvÁ@xÑLˆ½ØÖ@…ðgáAÇ@\ ÷T¦Ì@Å€ 52È@Á[$ö’Ö–@t:àÙܶ@–•¬¡ËÓ@%I‡;67Ë@’ÿ¬ÂA²@4E!†MÌ@3s+À@LÑ>Ÿ§qÐ@ï$Y©ºÕ´@ é‹wîhÊ@2“D’øË@ˆå70ñË@¿õjÌ·½@bý"´@û†üÁ+Å@ÃZÐolÙÇ@‘¥%Å@‚ŽÏŽ`5”@R×¹º"Ÿ˜@2]å.vXÒ@cb/>0»}@)æüaÉ@LÐHèÕ@Î3Åp9`¸@¦¬ì%ŽøÓ@™'ˆå••@)x¼ó¹@*Ô_›)©¸@"IùIáŽÏ@؉‹œÏÊ@•uØKÄ@âTÂýë4£@{G´WÅ@í«¡–ª@ºFå-™É@M“Ñ )E½@ñVwéc—@L+Ø×NÑ@ à'oËŽ@†G¾ÊOÓ@ê@ÜðeÅ@p<è‹ù^Ñ@ÚS¯å´øÃ@~«¬]@áŸ@{%2%ÝÆ@®Ð/m¿@=æ¦*Í@÷OzZ½ôÄ@’ Q®@:é>}ÎßÑ@"Ï{°‚×Í@BP$Å ®@$Œ¸WË@„roßwý¿@²z2•„Ö@ÌQå}™òÕ@³€—ôÛÄ@<…϶Ë@Z¹J)=Õ@ bíSÃ×@JËÏF…¯×@ñSo¯u»Í@úOú(É@KA·_Š6Ì@ôÌÓ—°Ò@I"×s…g¢@¿l³wÝ8À@š©˜¢”Ì©@†R!¹¢@U?£ux¿@:W¥¤‹šË@©C` qU«@@ÑfÉ’ÆÑ@Ž\–´ä×@»ÛÞ“a(·@ðOQÂ@J&Ç0@ÓÒ@‹ÄÏ@)-íeÆ¡±@XÛœ»]Ä@{«zk¯Î@€ö¥C–¿Ò@ÞÚÖ{ƒÓ@\ãD5qÈ@¾‰f=­@RlKÀ Ž×@hûïÍ™¾Ö@êMËÁÎÑ@i>¾ÌìÈ@œÂ;S`OÄ@2Oðžƒ!Ð@y*Î1 7Ï@ÚgmQV3Æ@9cnáË@i­ˆXgª@nÊ™Y±Á@Í!ÈÅà@>dÀSócÒ@½ê ÿÍ*Ê@–ä Íq’Ì@ ¦‚ ‡…Ó@¹Ç Ö —@Ëo>ùñ»@3ÀƒóŽÌ@ŒÔ³î¿€@¤ôß9ËË@˜»±«ÎÓ@¥]që ­¼@Bˆ‰N»QÑ@úPÝÊ@‹÷¦k^Ê@µìÏ%2´É@ðX ðšÊ@w™n±[K»@ç1FÁÓÇ@Úóqh É@H³2ݸ\Ð@ªs'~þÁ@Àx4­‹À@ÂKQ’¶×@ ±ZBYÆ@GÿÐ=ËãÏ@¥FX§eOÈ@é4n‘OX³@–J£|Í@¢¥ìë3‘µ@j#PÀü…Á@ŸÐã¶%Â@Öôäw^—@©ˆ7xÍ¡Ã@®m“4<°@¤1ˆ™@9NzûGOÎ@–ד”Å@É„høyqÈ@Lö5vªµ@9©3ñ]¾@O¢Ôæß@õÇ_©èÏ@jÃ2#H²š@&51UÆ@Ù¥;ìMÀÙ?,Xq¬@q0žðÒ@®£“h˜1Ñ@úZ³òÏ@èÔlב`È@_ãÌ]Ûµ¹@¸ÉüÞÊÓ@URײµ@²E½Ï$ôÐ@]àFJÂ@ërÕ–"Ñ@vÞfC¥¼@èGžO;Ù¥@¨àˆå0Ì@–Y*ƒhÏ@<íy¾ú@Ò@J+š;ÄSÑ@òhùÜ‚4Ï@œ„¯{ÏÒ@VåuEÑ@è†aÑ|±£@\vàÇ'Ä@àƒm{êÈ@qs¥ÃñåÈ@½Ïƒƒe@ÔÐu?Õ@ì(½Ð”Ð@A|ðmÏOÈ@:òá ÆÒ@ï- ÷°êÇ@Ê][*;½@çÎËt§ò@I¤AtFµ@¤%¥â¨@wO$úk~Ç@¼¢xepÔ@û€žŒô²@ž_±Q Õ@¯: ‘b¡µ@:VµC?Ö@S  qr­Æ@€ã­››è×@Ìv¾K›ŠÒ@ñŽ=‘ùSt@,†Õ+ Ý‹@P¡¤Fê)Å@³x:aÔ÷Í@lÿX±_¸@ÿh»òÄ@Zú ˜ÆíÃ@ £)á0ÆÓ@3·”ž€@”‰¬¤CëÀ@iÖâ¶Ã@\(qªAAÎ@ó>Ê@Bá¨s]¹@9PAZ°°@{€°¦öË@˜¯/˯[×@’…‰›Ó¾@úNOVoÕ@³¿ksgrË@’VÕúÓZ©@6úó:ðÄ@íÔY ¹@ M¯›c¼@XÖ'¢@®§¢ {ÕÇ@…×»¢jÆ@C7{AwÈ@('ùìrYÅ@¿:'TAá±@F<¨lÚ_Õ@üúÚªÕ@øéÕ p¦Ô@±âù‚±Ë@xñ¤Âr¬@3VÚ%Ö@€'éC×@2–TÑ@Gé7¿wË@V lg·²È@êüe\RÕÉ@—ÇÚýG¯@ޏfQr&À@mn7Ú³Ã@ÓöÞGµ@α;°ýÐ@JÑ—‰@#íüšŠe°@•i gÎ@Þ»‡º¼@#_MÌ˨@Ei$Ò~È@ ÊînŽV¦@öÿ°²vç@ÓP&÷ð—º@Þ/VDjÕ@r1J+š@©æ«¹ƒÀÆ@¸šþa’Ò@;` “é‘@ÊîAI­!®@í,Â@Ö¾Å@ ~0›/tÆ@p8çY[Õ@ôÓìž+ƪ@˜Hïúj°@¨ðÒp¼Ð@1°æ/ªžµ@h2%2.“Õ@aáåÕžÀÅ@ÕŒ¼ b¸@|zèÃÒ@•Áµ.°Ï@—ü—4¡@MOÒ|À@R&± žâÑ@HÜ͈”?¹@5‹óÇ@t¢]p¹ÍÕ@nöÑÈmÒ@ØÒ´HSÏ@"ýCÑàÉ@ü?¶âÛÒ@·¥ ­Ë@–Ý(~´@©¡8xJË@†جçŠÖ@$wdAň@Y¸òs±Ñ@ªí†Œ˜@‚^¸l³Æ@BŽƒêüÒ@ãì*§ü¹Ì@´¸2ÄW°@šñg¢ËŸ@úí€y{HÖ@Ö(‰ø”ܼ@ÎÆw’"¡@LÂlä°Â@×Q¿ä÷ã¼@‡å)ûçÁ@”3}‡´†´@;H)Äu½Æ@ŸcJ/'æÆ@)~EÀÑ£@´ô÷È@Õ¿‡ ¥@p¡HîTvÑ@ 9ïßIÔ@¬¯,YˆÐ@j2ˆxª €¾Ô@¤KX†rÛÖ@a°´UЪÇ@.ùP“D‹¯@|eU&(¿@–ê—/»½@ÐîœSÅ@:ko;Å@\ÊÜ/Ê*¦@æ ‚å6¸@žˆùñy Ô@^F°Á×MÓ@  N„T%Õ@CUŠ3ΰ@"ãî¤hxÔ@Ž JÿlÑ@ʵ>…`Ð@ñf}J”J°@•u)pÅÂ@nr reé½@¡º_YÒû¸@æÝ'ZiòÔ@WEyèl»@õ¥%ü§¼@ƒ ܨ@Õ(Iñ!²È@2Ô¿Zõ¡@˜[_×ÿJÑ@R_€£l@˜@°æ³àŸ+Ã@‹Qò®4ÌÍ@^0*‰•óÓ@M?@b¨»@¥ïoûn¢Å@:]+ Ô@:Ã%™|ïÔ@2!)(3à”@€ÑÝ1X‰Ö@ÎQØ€‰ZÈ@€&Õ/ÙƒÁ@âåKd3§@{DCoÜã»@–%;»@ÿ!ÖüËZÀ@™FtîÎ@FÈ ¬è²Ò@ÿæC¨Œ¼@¢÷,®¦!×@N4*ÛÊÐ@é3„Žæ®@¸I2gØ­Ï@%‡ ?W¨@ÅžyvÔ@ºªÖ­AÒÔ@Ü?m;SQ”@«Då/¿@m€²–«@]9Öa »À@öQEÙ»@œÔÒ‚Ô@¸o˜iAÕ@u`Ð{GÀ@£«¿ÇÁP¡@|žþ"¨ÃÓ@•õ‹Iù2Ã@3úE;[LÎ@¡QUßÕ@îjQô©P×@jë.ÑP•Ò@A—¦}:5±@ògÐ@?²é²àöÏ@ {”J¾Ð@Qž–ª³@I؉܇°Ë@0É ¼m¢@©CŒvŠª@9ƒÅ”È@BµÃúY6Î@¦…ç«1$£@mbbïÍŠ@öó¦MQçÄ@DcX’«}Ç@G‹ˆe@½¼@éµËoPš@[ÈXDÃ(É@5/ÅñûÏ@ÚRË èã®@„æqâ£@ ÿ_ù1¦@¯ê1d«À@ÇÇü¼¸@öY „sy¤@öP‹k&¹@Þ.ÃÕV×@ˆ—ÂÍ×@¥¦uoÄ@"¦¢¨™×@(´<³ºÏ@¥Šôt@®Ä@ùù¨!ÂOª@6å–שÀ×@XjÐäeÆÒ@ ’½B'cÇ@£$rTch³@~07¾ç‘Ó@ÅW^„˜®@¯ÐbtÞñÊ@VtáÛ_Ô@d—•Yº$Ð@Ȥ'mäb–@×dî2‚öÈ@EÄkX+~@‚¢ãÑ@]£0·Á@~Èmô\Ä@‘E€[Ýî·@Çr-Æ s@ ÒèÚÃÕ@î°6.¾@ÊÝãç:(Í@âøB»@ Oëµ²Ð@U„Ž¡ÛØ¢@ùãÿû?Í@¦¸µnëîÓ@üÚ'‚Žt¨@Š[ÀˆŸaÄ@^ –?Í×@Yàe(X&Å@€Ïz!¢‘@¼Eµá³"Ò@mÇæÁŽ´´@ÑÂÕÔ²@\*œŽÕÆ@ÒK@BÕ@™YtHxµ·@ ¸=!DÒ@¢e«ˆOÉ@ÞºdÌ)Ä@7y-šÏ@ªRW\±pÖ@Ùâ@ £?˜@&•k%£¦Æ@˜q7I‘Ì@ºA,űæÂ@{œ§aÿøª@AÚ\¸¸Á@Ÿ…o÷™Ã³@•p‚WoÒ@ªôÊòÈ@<EtÒ®Á@(4óØšˆ@šW=¸…¯½@Dו×ù5Å@?—ôÈåÊ@ÅL!8Ö@Äq72fÀ~@²!­•Ä@8¢E´Ôº@ò£’-9Ð@–:,î§Õ@lÔ¥05Ò@„z&ßÙ»@?ÿÜáE–@¤ÿYœ0^Ñ@ÎðÈ@ —ªý=Û×@e ¹„‹¿@Ô±yÒ@õkõ¥<Ë@!ëÜi·@.ó*ýBÓ@ã0gèË@:C ؽÖ@Z^”­Š¡@dó—öÔ@àîà×@ä]qVÿ¡Æ@b[m~·`È@ž2:’ò¿@Á‡1Êú±Á@çû0l<ù¼@›NÀmÔ¯@Ï[ÈZ„…Í@“an8úÊ·@ýt–,½‡¸@œŒü‹§Ô@3Öòõ•Î@XW‡^ÕÐ@ôÉ1áŒjÑ@KpùR¶Ñ@„éȱæ±@ßéGðÈ@¢+žúZŸÓ@²LÝ(ØÒ@)qØÛ¯{Å@áOÈš›r@÷ !:µ¹@^/üÜ6Ò@~×DÁíƒÖ@xÈ"ÎÁ×@Ü^üœƒÖ@|÷s_2Ò@Ì~;øZÑ@j”ò[Œ·@Û`Ÿq¹@D7êPÄ@.ÑJ«@¦hõv×¢¿@†˜B›`Ð@OØÇÙÔ@0õwý³Ð@h΄ù›Ö@¨¶z×TÏ@7Ûs•Ò@/ƒ¢‚ªíÄ@þÀåUÇ@¶±§××=Æ@㬭 `»Î@ˆû@)’@¾îJO²Mµ@ÛMÕKË@Xк‘šÀ´@œcͪàü—@b ‹ 9‹@&I!ó3@Õ@»µ ½Õ@ªKÇìæÒ@CÀ¡ô¢6¶@125(Á¥Ç@pl vÝÑ@¿«m Ë@dÑ~Ý“Ò@Òe\hµE§@ÐZ¨~Õ¿@ùT;×ê¡Ë@ v ¥b[É@ZŽÛÚ_àÎ@ÂF ¤Â@ØL IÁË@xN$öT^@Œl×Â6öÒ@Âq>à€ž@öú<”ˆÉ@E³B‘g:È@F‘¹ŽK•Í@=šnŠ.§@†Íß’e§@„ˆµ ºÐÕ@~Z½Ù¸zÓ@ö _ÓÐÕ@,Çz¢¤Õ@´šãÙÌ Ñ@»êo8Ë@ÎKÖBÅÕ@€wBÜ¢Ò@ôïsa($Ä@¡!zÔóÃ@ñ±3X’éÅ@³]þÙ\õÈ@Ø&Å5–’Ö@:U3¶íÖ@ªBo“uj¶@^œ0ýaÖ@¿¥ò.‡Î@žsŽžš,Å@jsÏ:ªÕ@»Rkí˜Æ@Øjxìñä§@{Ð9h:R¹@÷ £NÊ@·0ËrË@*zjK˜ÂÔ@D;˜îè1Ô@\··Ò–Ï@ØëŽÈÅOÑ@û9¨‚xvÇ@<û/*Š×@œ—Ë B ×@„Žrµä³Ò@Ç" }a´@€Í 1ºTÌ@>ZòD_ëÍ@Å’WâhÂ@$аâƒÖ@ ”ŠØPÅÒ@óÿõê½Â‘@Q:šEkâÄ@/—Ú¼ç·@’¨JDæs¿@ÌDßùp\×@µ¢õñèÎ@ƆDåÓœ²@>ZËTÁׯ@öç=-iöÓ@ªmò^ÜÕÒ@Ã] ™Ñ@£7ôÑÌ@þëä-SÎ@e`¾^öÌ@Ëžýê\Ñ@Ý[;ö—ˆ@ñŠØ;ø²Å@ìÎøÙÕ Ñ@ÜÀR_¥'Í@xܹœ×åÒ@”¦Lÿ‡¸@leUF›²@Ðxµ«?¼@Oî˜y{@ÅzvìÙi¢@Ýe›U²@Éê…¶@ä”ÒG½¾×@öÔË‚@º@œ 0ñÐÑ@ÄF8â–ŠÖ@ ¯·±@Ú}fKvuÒ@èR6Ð;Ó@Òroì.ãË@›à­Êíª@®&ÚÄÏEË@f(¢ç6´@ŸÖ¿ÑÊ¿@.ÑLࡎÉ@º¯¨Ø=ÄÓ@'üí©È@ûÒ&h­~@Ð¥f¹üXn@ ®¯â³@§³9CJ0³@Àªý"\´Ð@ÒSÕ$&†Ö@ú‰Û¡º–@xÜä?uÒ@ºíšÊ,¼@èÔ66ÐÑ@þË5¡@Æ@ÜÔŸ‰Ì@8V/·~nÖ@æ’²?KË@PÒ? jÌÐ@µ°ÓlsÒ@{Â.+ÿ±°@ñO/>^Ê@›*ùÍ×@¨oÛ”†Þ¼@†T ƒˆ‡¡@gÞÚ5‰Á@Ð@‡† ×@ÔÚxèÒwÔ@Iþ…ÛáÒ@œÕs™sñ¹@ÖWt¦øÒ@áÌJ¯@úšÓÄ@¾#ÊôWe@ºÛêgFSÐ@ èc¥KŒË@ŸÖ"Ä™½@Bˆâ±ú©Ó@ED)!ÂÆ@ˆ³éõ[×@@º³eÈ@²Ø@yœ@кpª÷c»@g¸oŸó°@„Õ¨ˆ¹Ä@M߾ͦÈÉ@uÏöGÏ‚³@¡b¼Ï@@Úèqb–@Þœ—hVÒ@i¼0u‘¹@ߦBÃz]±@[lÑ©Ã@Ë` ü¯ÊÄ@·MµžBÚµ@ΘdmÆÖ@ˆ wYh¬@ˆ_Â05Î@—æ²O £@ä|š|×@~#¤­®Ë@î¥Sa¬Ò@[_EÉ @@?œØ“mÓ@†~a ž×@F'wÜàÖ@APÕ/©“@4 ž¥)ñš@H¦.Zc ×@ åšËêÍ@6ü‚«GOÐ@O΂K›oÇ@1¯éºËi³@¸n¯0û-Ñ@ õ|r}’Ó@©u½@’y©XTÐ@’h±6ÐÑ@s Á_˜Ã®@d[Joûž@V<—õ¿Ï@jiUo"7Ð@wò=J°¹@p ÿŽQÆ@PÚàwÓ@óD….§@_*þšÍ²Ã@fÉ®‘#0Ã@Xk IKÑ@¼‡wCaÀ@ø¤ØæÔoÓ@²ŒtL¯×@ö¦Ð(„²Ó@t—öw2¡@Þɹƒ¡YÒ@ ]Ä‘Ÿ‡Ë@<±]ZDÎ×@C±ûÌ_Å@¾)£ZŽÊ@‘¸¾4ÍÁ@.Ôç½ÀÆ@ï ©˜C¹@m.ˆ¯]Ú@îÔƒßÏJ¬@{UOX½3È@Ûò/›>Â@ðÉ*ÕǾ@J8ø÷ý†Õ@A±Ÿ@õœ­@ k!5ºÑ@h>K$QÑ@§H•2À@KŒ›åÔÇ@BøÇIO†Ò@>WÔÀPÒ@èÍäyÏœ@Ü"ƒ®w¸@>07#jÃ@áLÕYaš´@ˆhá_—¯×@pvó‡3Ð@Ö®}„j~Ð@0¦{ÎdÕ@û#Cd¾œ@»5· úº¯@R‘Uìc.Ö@R axÝ#Ñ@ ^§é ÐÅ@±’y¨tâÃ@ .ÐJ<›Å@lò¢XÉ@ËR¨ÅóÑ@\8èô”‘@w¿”¾¦Ú¸@Œ"»ÐÜÊ@ŇTY´ÝÇ@äzõ‚ÆÔ@¯ ,‹Î@ ÜÎéÚ|Ð@¦'Ô(ÅIÃ@TµJ?¬TÖ@­Lo[¿@¬¡ÇYEÆÌ@ŠS‰® Ô@Úò9|Í=Õ@¹?`z ª@)åý~³®@ˆ:R—!Ä@P¥¯Ç'ÿ£@‡¾N[•·Ï@ð4azªÇ@˜ÃÉàÒ@û29ЛgÃ@„Ô’Ÿ q½@£0°.ù˜©@ˆ{öu°³@*t€ìó#¢@ Œè¤@©ÎQܸ ¯@Mè3(ÆÆ@ØŠ¥mbï·@Öåh7Í@JíWÌé¸@¡£õÔ¶@­SP\Áy‘@ôzç&ô»Ð@ °Öb·Ñ@‹{؆½Ñ@¬ÄÝL“¿@åV[Ói´@Ž:׈Ï@Â/[ƒÎ²Î@Æ:›ý£TÐ@0?Ü•€Ó@`¨=e2Ó@=Ê íÎ@(Ÿ=`À@#|öH Í@γçS´eÒ@‹_Ø'Ú¥@8¤em®¹Ÿ@Šnw°dï±@„Ž,€Nd “Íð×@|öHúÜQPÀ(d “Íð×@|öHúÜQPÀÂ?ôÁ€N  €@ €8 (€À€x H€ @*€¸ h€ À:€ø ˆ€@J€ 8( ¨€ÀZ€ x0 È€@j€ ¸8 è€Àz€ø@ !@Š€8H (%Àš€xP H)@ª€¸X h-Àº€ø` ˆ1@Ê€8h ¨5ÀÚ€xp È9@ꀸx è=Àú€ø€ ‚A@ !8ˆ (‚EÀ#x H‚I@ *%¸˜ h‚MÀ :'ø  ˆ‚Q@ J)8¨ ¨‚UÀ Z+x° È‚Y@ j-¸¸ è‚]À z/øÀ ƒa@ Š18È (ƒeÀ š3xÐ Hƒi@ ª5¸Ø hƒmÀ º7øà ˆƒq@Ê98è ¨ƒuÀÚ;xð ȃy@ê=¸ø èƒ}Àú?ø! „@ ‚A8!!(„…À‚Cx!"H„‰@*‚E¸!#h„À:‚Gø !$ˆ„‘@J‚I8 (!%¨„•ÀZ‚Kx 0!&È„™@j‚M¸ 8!'è„Àz‚Oø @!(…¡@Š‚Q8 H!)(…¥Àš‚Sx P!*H…©@ª‚U¸ X!+h…­Àº‚Wø `!,ˆ…±@Ê‚Y8 h!-¨…µÀÚ‚[x p!.È…¹@ê‚]¸ x!/è…½Àú‚_ø €!0†Á@ ƒa8 ˆ!1(†ÅÀƒcx !2H†É@*ƒe¸ ˜!3h†ÍÀ:ƒgø  !4ˆ†Ñ@Jƒi8 ¨!5¨†ÕÀZƒkx °!6ȆÙ@jƒm¸ ¸!7è†ÝÀzƒoø À!8‡á@Šƒq8È!9(‡åÀšƒsxÐ!:H‡é@ªƒu¸Ø!;h‡íÀºƒwøà!<ˆ‡ñ@ʃy8è!=¨‡õÀÚƒ{xð!>ȇù@êƒ}¸ø!?è‡ýÀúƒø"@ˆA „8"A(ˆÁ „ƒx"BHˆ A!*„…¸"Chˆ Á!:„‡ø "DˆˆA"J„‰8("E¨ˆÁ"Z„‹x0"FȈA#j„¸8"GèˆÁ#z„ø@"H‰!A$Š„‘8H"I(‰%Á$š„“xP"JH‰)A%ª„•¸X"Kh‰-Á%º„—ø`"Lˆ‰1A&Ê„™8h"M¨‰5Á&Ú„›xp"Nȉ9A'ꄸx"Oè‰=Á'ú„Ÿø€"PŠAA( …¡8ˆ"Q(ŠEÁ(…£x"RHŠIA)*…¥¸˜"ShŠMÁ):…§ø "TˆŠQA*J…©8¨"U¨ŠUÁ*Z…«x°"VÈŠYA+j…­¸¸"WèŠ]Á+z…¯øÀ"X‹aA,Š…±8È"Y(‹eÁ,š…³xÐ"ZH‹iA-ª…µ¸Ø"[h‹mÁ-º…·øà"\ˆ‹qA.Ê…¹8è"]¨‹uÁ.Ú…»xð"^È‹yA/ê…½¸ø"_è‹}Á/ú…¿ø#`ŒA0 †Á8#a(Œ…Á0†Ãx#bHŒ‰A1*†Å¸#chŒÁ1:†Çø #dˆŒ‘A2J†É8(#e¨Œ•Á2Z†Ëx0#fÈŒ™A3j†Í¸8#gèŒÁ3z†Ïø@#h¡A4ІÑ8H#i(¥Á4š†ÓxP#jH©A5ª†Õ¸X#kh­Á5º†×ø`#lˆ±A6ʆÙ8h#m¨µÁ6Ú†Ûxp#nȹA7ê†Ý¸x#oè½Á7ú†ßø€#pŽÁA8 ‡á8ˆ#q(ŽÅÁ8‡ãx#rHŽÉA9*‡å¸˜#shŽÍÁ9:‡çø #tˆŽÑA:J‡é8¨#u¨ŽÕÁ:Z‡ëx°#vÈŽÙA;j‡í¸¸#wèŽÝÁ;z‡ïøÀ#xáA<Їñ8È#y(åÁ<š‡óxÐ#zHéA=ª‡õ¸Ø#{híÁ=º‡÷øà#|ˆñA>ʇù8è#}¨õÁ>Ú‡ûxð#~ÈùA?ê‡ý¸ø#èýÁ?ú‡ÿø$€B@ ˆ9 $(Â@ˆy $‚H BA*ˆ¹ $ƒh ÂA:ˆù $„ˆBBJˆ 9!($…¨ÂBZˆ y!0$†ÈBCjˆ ¹!8$‡èÂCzˆù!@$ˆ‘!BDŠˆ9"H$‰(‘%ÂDšˆy"P$ŠH‘)BEªˆ¹"X$‹h‘-ÂEºˆù"`$Œˆ‘1BFʈ9#h$¨‘5ÂFÚˆy#p$ŽÈ‘9BGꈹ#x$è‘=ÂGúˆù#€$’ABH ‰!9$ˆ$‘(’EÂH‰#y$$’H’IBI*‰%¹$˜$“h’MÂI:‰'ù$ $”ˆ’QBJJ‰)9%¨$•¨’UÂJZ‰+y%°$–È’YBKj‰-¹%¸$—è’]ÂKz‰/ù%À$˜“aBLЉ19&È$™(“eÂLš‰3y&Ð$šH“iBMª‰5¹&Ø$›h“mÂMº‰7ù&à$œˆ“qBNʉ99'è$¨“uÂNÚ‰;y'ð$žÈ“yBOê‰=¹'ø$Ÿè“}ÂOú‰?ù'% ”BP ŠA9(%¡(”…ÂPŠCy(%¢H”‰BQ*ŠE¹(%£h”ÂQ:ŠGù( %¤ˆ”‘BRJŠI9)(%¥¨”•ÂRZŠKy)0%¦È”™BSjŠM¹)8%§è”ÂSzŠOù)@%¨•¡BTŠŠQ9*H%©(•¥ÂTšŠSy*P%ªH•©BUªŠU¹*X%«h•­ÂUºŠWù*`%¬ˆ•±BVÊŠY9+h%­¨•µÂVÚŠ[y+p%®È•¹BWêŠ]¹+x%¯è•½ÂWúŠ_ù+€%°–ÁBX ‹a9,ˆ%±(–ÅÂX‹cy,%²H–ÉBY*‹e¹,˜%³h–ÍÂY:‹gù, %´ˆ–ÑBZJ‹i9-¨%µ¨–ÕÂZZ‹ky-°%¶È–ÙB[j‹m¹-¸%·è–ÝÂ[z‹où-À%¸—áB\Š‹q9.È%¹(—åÂ\š‹sy.Ð%ºH—éB]ª‹u¹.Ø%»h—íÂ]º‹wù.à%¼ˆ—ñB^Ê‹y9/è%½¨—õÂ^Ú‹{y/ð%¾È—ùB_ê‹}¹/ø%¿è—ýÂ_ú‹ù/&À˜C` Œ90&Á(˜Ã`Œƒy0&ÂH˜ Ca*Œ…¹0&Ãh˜ Ãa:Œ‡ù0 &Ĉ˜CbJŒ‰91(&Ũ˜ÃbZŒ‹y10&ÆÈ˜CcjŒ¹18&Çè˜ÃczŒù1@&È™!CdŠŒ‘92H&É(™%ÃdšŒ“y2P&ÊH™)CeªŒ•¹2X&Ëh™-ÃeºŒ—ù2`&̈™1CfÊŒ™93h&ͨ™5ÃfÚŒ›y3p&ÎÈ™9Cgꌹ3x&Ïè™=ÃgúŒŸù3€&КACh ¡94ˆ&Ñ(šEÃh£y4&ÒHšICi*¥¹4˜&ÓhšMÃi:§ù4 &ÔˆšQCjJ©95¨&Õ¨šUÃjZ«y5°&ÖÈšYCkj­¹5¸&×èš]Ãkz¯ù5À&Ø›aClб96È&Ù(›eÃlš³y6Ð&ÚH›iCmªµ¹6Ø&Ûh›mÃmº·ù6à&܈›qCnʹ97è&ݨ›uÃnÚ»y7ð&ÞÈ›yCoê½¹7ø&ßè›}Ãoú¿ù7'àœCp ŽÁ98'á(œ…ÃpŽÃy8'âHœ‰Cq*ŽÅ¹8'ãhœÃq:ŽÇù8 '䈜‘CrJŽÉ99('娜•ÃrZŽËy90'æÈœ™CsjŽÍ¹98'çèœÃszŽÏù9@'è¡CtŠŽÑ9:H'é(¥ÃtšŽÓy:P'êH©CuªŽÕ¹:X'ëh­ÃuºŽ×ù:`'숱CvÊŽÙ9;h'í¨µÃvÚŽÛy;p'îȹCwêŽÝ¹;x'ïè½ÃwúŽßù;€'ðžÁCx á9<ˆ'ñ(žÅÃxãy<'òHžÉCy*å¹<˜'óhžÍÃy:çù< 'ôˆžÑCzJé9=¨'õ¨žÕÃzZëy=°'öÈžÙC{jí¹=¸'÷èžÝÃ{zïù=À'øŸáC|Šñ9>È'ù(ŸåÃ|šóy>Ð'úHŸéC}ªõ¹>Ø'ûhŸíÃ}º÷ù>à'üˆŸñC~Êù9?è'ý¨ŸõÃ~Úûy?ð'þÈŸùCêý¹?ø'ÿèŸýÃúÿù?(  D€ :@() Ä€z@(I  D*º@(i  Ä:ú@ (‰ D‚J :A((© Ä‚Z zA0(É Dƒj ºA8(é ăzúA@( ¡!D„Š:BH( )¡%Ä„šzBP( I¡)D…ªºBX( i¡-Ä…ºúB`( ‰¡1D†Ê:Ch( ©¡5ĆÚzCp(É¡9D‡êºCx(é¡=ćúúC€( ¢ADˆ ‘!:Dˆ()¢EĈ‘#zD(I¢ID‰*‘%ºD˜(i¢Mĉ:‘'úD (‰¢QDŠJ‘):E¨(©¢UÄŠZ‘+zE°(É¢YD‹j‘-ºE¸(é¢]Ä‹z‘/úEÀ( £aDŒŠ‘1:FÈ()£eÄŒš‘3zFÐ(I£iDª‘5ºFØ(i£mĺ‘7úFà(‰£qDŽÊ‘9:Gè(©£uÄŽÚ‘;zGð(É£yDê‘=ºGø(é£}Äú‘?úG) ¤D ’A:H)!)¤…Ä’CzH)"I¤‰D‘*’EºH)#i¤Ä‘:’GúH )$‰¤‘D’J’I:I()%©¤•Ä’Z’KzI0)&ɤ™D“j’MºI8)'é¤Ä“z’OúI@)( ¥¡D”Š’Q:JH)))¥¥Ä”š’SzJP)*I¥©D•ª’UºJX)+i¥­Ä•º’WúJ`),‰¥±D–Ê’Y:Kh)-©¥µÄ–Ú’[zKp).É¥¹D—ê’]ºKx)/饽ėú’_úK€)0 ¦ÁD˜ “a:Lˆ)1)¦ÅĘ“czL)2I¦ÉD™*“eºL˜)3i¦ÍÄ™:“gúL )4‰¦ÑDšJ“i:M¨)5©¦ÕÄšZ“kzM°)6ɦÙD›j“mºM¸)7é¦ÝÄ›z“oúMÀ)8 §áDœŠ“q:NÈ)9)§åÄœš“szNÐ):I§éDª“uºNØ);i§íĺ“wúNà)<‰§ñDžÊ“y:Oè)=©§õÄžÚ“{zOð)>ɧùDŸê“}ºOø)?é§ýÄŸú“úO*@ ¨E  ”:P*A)¨Å ”ƒzP*BI¨ E¡*”…ºP*Ci¨ Å¡:”‡úP *D‰¨E¢J”‰:Q(*E©¨Å¢Z”‹zQ0*FɨE£j”ºQ8*Gé¨Å£z”úQ@*H ©!E¤Š”‘:RH*I)©%Ťš”“zRP*JI©)E¥ª”•ºRX*Ki©-Å¥º”—úR`*L‰©1E¦Ê”™:Sh*M©©5Ŧڔ›zSp*NÉ©9E§ê”ºSx*Oé©=ŧú”ŸúS€*P ªAE¨ •¡:Tˆ*Q)ªEŨ•£zT*RIªIE©*•¥ºT˜*SiªMÅ©:•§úT *T‰ªQEªJ•©:U¨*U©ªUŪZ•«zU°*VɪYE«j•­ºU¸*Wéª]Å«z•¯úUÀ*X «aE¬Š•±:VÈ*Y)«eŬš•³zVÐ*ZI«iE­ª•µºVØ*[i«mÅ­º•·úVà*\‰«qE®Ê•¹:Wè*]©«uŮڕ»zWð*^É«yE¯ê•½ºWø*_é«}ůú•¿úW+` ¬E° –Á:X+a)¬…Ű–ÃzX+bI¬‰E±*–źX+ci¬Å±:–ÇúX +d‰¬‘E²J–É:Y(+e©¬•ŲZ–ËzY0+fɬ™E³j–ͺY8+gé¬Å³z–ÏúY@+h ­¡E´Š–Ñ:ZH+i)­¥Å´š–ÓzZP+jI­©Eµª–ÕºZX+ki­­Åµº–×úZ`+l‰­±E¶Ê–Ù:[h+m©­µÅ¶Ú–Ûz[p+nÉ­¹E·ê–ݺ[x+o魽ŷú–ßú[€+p ®ÁE¸ —á:\ˆ+q)®ÅŸ—ãz\+rI®ÉE¹*—åº\˜+si®ÍŹ:—çú\ +t‰®ÑEºJ—é:]¨+u©®ÕźZ—ëz]°+vÉ®ÙE»j—íº]¸+wé®ÝÅ»z—ïú]À+x ¯áE¼Š—ñ:^È+y)¯åżš—óz^Ð+zI¯éE½ª—õº^Ø+{i¯íŽº—÷ú^à+|‰¯ñE¾Ê—ù:_è+}©¯õžڗûz_ð+~ɯùE¿ê—ýº_ø+é¯ýÅ¿ú—ÿú_,€ °FÀ ˜;`,)°ÆÀ˜{`,‚I° FÁ*˜»`,ƒi° ÆÁ:˜û` ,„‰°FÂJ˜ ;a(,…©°ÆÂZ˜ {a0,†É°FÃj˜ »a8,‡é°ÆÃz˜ûa@,ˆ ±!FÄŠ˜;bH,‰)±%ÆÄš˜{bP,ŠI±)FŪ˜»bX,‹i±-ÆÅº˜ûb`,Œ‰±1FÆÊ˜;ch,©±5ÆÆÚ˜{cp,ŽÉ±9FÇ꘻cx,é±=ÆÇú˜ûc€, ²AFÈ ™!;dˆ,‘)²EÆÈ™#{d,’I²IFÉ*™%»d˜,“i²MÆÉ:™'ûd ,”‰²QFÊJ™);e¨,•©²UÆÊZ™+{e°,–ɲYFËj™-»e¸,—é²]ÆËz™/ûeÀ,˜ ³aFÌŠ™1;fÈ,™)³eÆÌš™3{fÐ,šI³iFͪ™5»fØ,›i³mÆÍº™7ûfà,œ‰³qFÎÊ™9;gè,©³uÆÎÚ™;{gð,žÉ³yFÏê™=»gø,Ÿé³}ÆÏú™?ûg-  ´FÐ šA;h-¡)´…ÆÐšC{h-¢I´‰FÑ*šE»h-£i´ÆÑ:šGûh -¤‰´‘FÒJšI;i(-¥©´•ÆÒZšK{i0-¦É´™FÓjšM»i8-§é´ÆÓzšOûi@-¨ µ¡FÔŠšQ;jH-©)µ¥ÆÔššS{jP-ªIµ©FÕªšU»jX-«iµ­ÆÕºšWûj`-¬‰µ±FÖÊšY;kh-­©µµÆÖÚš[{kp-®Éµ¹F×êš]»kx-¯éµ½Æ×úš_ûk€-° ¶ÁFØ ›a;lˆ-±)¶ÅÆØ›c{l-²I¶ÉFÙ*›e»l˜-³i¶ÍÆÙ:›gûl -´‰¶ÑFÚJ›i;m¨-µ©¶ÕÆÚZ›k{m°-¶É¶ÙFÛj›m»m¸-·é¶ÝÆÛz›oûmÀ-¸ ·áFÜŠ›q;nÈ-¹)·åÆÜš›s{nÐ-ºI·éFݪ›u»nØ-»i·íÆÝº›wûnà-¼‰·ñFÞÊ›y;oè-½©·õÆÞÚ›{{oð-¾É·ùFßê›}»oø-¿é·ýÆßú›ûo.À ¸Gà œ;p.Á)¸Çàœƒ{p.ÂI¸ Gá*œ…»p.Ãi¸ Çá:œ‡ûp .ĉ¸GâJœ‰;q(.Å©¸ÇâZœ‹{q0.ÆÉ¸Gãjœ»q8.Çé¸Çãzœûq@.È ¹!G䊜‘;rH.É)¹%Çäšœ“{rP.ÊI¹)G媜•»rX.Ëi¹-Ç府—ûr`.̉¹1GæÊœ™;sh.Í©¹5ÇæÚœ›{sp.Îɹ9Gçꜻsx.Ïé¹=ÇçúœŸûs€.Ð ºAGè ¡;tˆ.Ñ)ºEÇè£{t.ÒIºIGé*¥»t˜.ÓiºMÇé:§ût .Ô‰ºQGêJ©;u¨.Õ©ºUÇêZ«{u°.ÖɺYGëj­»u¸.×éº]Çëz¯ûuÀ.Ø »aG슱;vÈ.Ù)»eÇìš³{vÐ.ÚI»iGíªµ»vØ.Ûi»mÇíº·ûvà.܉»qGîʹ;wè.Ý©»uÇîÚ»{wð.ÞÉ»yGïê½»wø.ßé»}Çïú¿ûw/à ¼Gð žÁ;x/á)¼…ÇðžÃ{x/âI¼‰Gñ*žÅ»x/ãi¼Çñ:žÇûx /䉼‘GòJžÉ;y(/婼•ÇòZžË{y0/æÉ¼™GójžÍ»y8/çé¼ÇózžÏûy@/è ½¡GôŠžÑ;zH/é)½¥ÇôšžÓ{zP/êI½©GõªžÕ»zX/ëi½­Çõºž×ûz`/쉽±GöÊžÙ;{h/í©½µÇöÚžÛ{{p/îɽ¹G÷êžÝ»{x/ïé½½Ç÷úžßû{€/ð ¾ÁGø Ÿá;|ˆ/ñ)¾ÅÇøŸã{|/òI¾ÉGù*Ÿå»|˜/ói¾ÍÇù:Ÿçû| /ô‰¾ÑGúJŸé;}¨/õ©¾ÕÇúZŸë{}°/öɾÙGûjŸí»}¸/÷é¾ÝÇûzŸïû}À/ø ¿áGüŠŸñ;~È/ù)¿åÇüšŸó{~Ð/úI¿éGýªŸõ»~Ø/ûi¿íÇýºŸ÷û~à/ü‰¿ñGþÊŸù;è/ý©¿õÇþÚŸû{ð/þÉ¿ùGÿêŸý»ø/ÿé¿ýÇÿúŸÿû0 ÀH  <€0*ÀÈ |€0JÀ H+ ¼€0jÀ È; ü€ 0ŠÀHK  <(0ªÀÈ[  |00ÊÀHk  ¼80êÀÈ{ ü@0 Á!H‹ <‚H0 *Á%È› |‚P0 JÁ)H« ¼‚X0 jÁ-È» ü‚`0 ŠÁ1HË <ƒh0 ªÁ5ÈÛ |ƒp0ÊÁ9Hë ¼ƒx0êÁ=Èû üƒ€0 ÂAH ¡!<„ˆ0*ÂEÈ¡#|„0JÂIH +¡%¼„˜0jÂMÈ ;¡'ü„ 0ŠÂQH K¡)<…¨0ªÂUÈ [¡+|…°0ÊÂYH k¡-¼…¸0êÂ]È {¡/ü…À0 ÃaH ‹¡1<†È0*ÃeÈ ›¡3|†Ð0JÃiH «¡5¼†Ø0jÃmÈ »¡7ü†à0ŠÃqHË¡9<‡è0ªÃuÈÛ¡;|‡ð0ÊÃyHë¡=¼‡ø0êÃ}Èû¡?ü‡1 ÄH ¢A<ˆ1!*Ä…È¢C|ˆ1"JĉH+¢E¼ˆ1#jÄÈ;¢Güˆ 1$ŠÄ‘HK¢I<‰(1%ªÄ•È[¢K|‰01&ÊÄ™Hk¢M¼‰81'êÄÈ{¢Oü‰@1( Å¡H‹¢Q<ŠH1)*ťț¢S|ŠP1*JÅ©H«¢U¼ŠX1+jÅ­È»¢WüŠ`1,ŠÅ±HË¢Y<‹h1-ªÅµÈÛ¢[|‹p1.ÊŹHë¢]¼‹x1/êŽÈû¢_ü‹€10 ÆÁH £a<Œˆ11*ÆÅÈ£c|Œ12JÆÉH+£e¼Œ˜13jÆÍÈ;£güŒ 14ŠÆÑHK£i<¨15ªÆÕÈ[£k|°16ÊÆÙHk£m¼s¸17êÆÝÈ{£oüÀ18 ÇáH‹£q<ŽÈ19*ÇåÈ›£s|ŽÐ1:JÇéH«£u¼ŽØ1;jÇíÈ»£wüŽà1<ŠÇñHË£y<è1=ªÇõÈÛ£{|ð1>ÊÇùHë£}¼ø1?êÇýÈû£ü2@ ÈI ¤<2A*ÈÉ ¤ƒ|2BJÈ I!+¤…¼2CjÈ É!;¤‡ü 2DŠÈI"K¤‰<‘(2EªÈÉ"[¤‹|‘02FÊÈI#k¤¼‘82GêÈÉ#{¤ü‘@2H É!I$‹¤‘<’H2I*É%É$›¤“|’P2JJÉ)I%«¤•¼’X2KjÉ-É%»¤—ü’`2LŠÉ1I&ˤ™<“h2MªÉ5É&Û¤›|“p2NÊÉ9I'뤼“x2OêÉ=É'û¤Ÿü“€2P ÊAI( ¥¡<”ˆ2Q*ÊEÉ(¥£|”2RJÊII)+¥¥¼”˜2SjÊMÉ);¥§ü” 2TŠÊQI*K¥©<•¨2UªÊUÉ*[¥«|•°2VÊÊYI+k¥­¼•¸2WêÊ]É+{¥¯ü•À2X ËaI,‹¥±<–È2Y*ËeÉ,›¥³|–Ð2ZJËiI-«¥µ¼–Ø2[jËmÉ-»¥·ü–à2\ŠËqI.Ë¥¹<—è2]ªËuÉ.Û¥»|—ð2^ÊËyI/륽¼—ø2_êË}É/û¥¿ü—3` ÌI0 ¦Á<˜3a*Ì…É0¦Ã|˜3bJ̉I1+¦Å¼˜3cjÌÉ1;¦Çü˜ 3dŠÌ‘I2K¦É<™(3eªÌ•É2[¦Ë|™03fÊÌ™I3k¦Í¼™83gêÌÉ3{¦Ïü™@3h Í¡I4‹¦Ñ<šH3i*Í¥É4›¦Ó|šP3jJÍ©I5«¦Õ¼šX3kjÍ­É5»¦×üš`3lŠÍ±I6˦Ù<›h3mªÍµÉ6Û¦Û|›p3nÊ͹I7ë¦Ý¼›x3oêͽÉ7û¦ßü›&°¶ 5pxl_row_in_fullres€NªðÀð&¢¶ &ðÅd “Íð×@|öHúÜQPÀ(d “Íð×@|öHúÜQPÀ,€ðŒðL€N€¸ôÿ›Æø<ª@†Å@ÈZn¡•»@•3³Ã@DK6aÿ¡a@ŠácdR¨@„ïÈÕ!‹Ä@ãp3Ò@9ަöEÀ@Ù$¥†ÃâÒ@ΨòtŠÓ@#éYÝÎ+z@%«ûD"º@¥¨ëJÝ£@i9ÊH)÷Ð@‘ÙœI=ùÇ@Ñ݇jÅÛ¦@ÔFP8Õ@¨a‰Ô@«ªáLœÂ@ÆjB1tqÑ@üG§ZÙ¸@¶Û68›@>4ÈÍÆ@ñ˜'X©½@©Ú2©­·@nö Þí¦Ñ@æž\ÐyV±@m4§Ã®0Æ@M ‹xÕÃ@ør©§+ò£@•^ÇxÃÑ@¸ÿí³ÃÒÅ@d h×;ÜÃ@nA±‚{ä™@S(« ²@Ý!ª/ö²Ã@øÏþÒ¡@€œž/QYÊ@@Ó•–eð @0û¨~ƒ¸@}I‡ø_ÔÓ@M?éçµÔ@5:Õ+MÃ@bF®Z@°¤@]¨˜TqÔ@¯Æ²ÿAmÏ@C÷JÙ^‡¯@PÕc# ‚Ó@S_!»ý«ª@1dmª@Ä@62ÈöSðÓ@œòÝÓ@Ý€cª_LÕ@çÿ  µ@ºáòÞ©*ª@¸<ÏÎ5Â@Úu4fÌ@tˆª5VÎ@ç÷ÝMM“¿@Ò!01©õ¸@7ÔÎSœÐ@¾|‰á ·È@ðPt| Ã@a²Hí¬Ÿ@Ï$¦dÅÂ@S³evÉÍ@à«y3á£@—Ò†œü¢@ÿà ¤˜BÓ@`wh&Ì@5­aAP¼@ÞÀï®À@ŒG¿ÈXœ@•gŒ‹Ï¹Ñ@GgÒÉ$¨@¸‚ü¼(‘@×òQ/KcÐ@Ìf;·@Ò@#Y'u ®Ö@ù‹z_¼¾@֪ǜ*Ð@ЧaãÏÔ@q±Œ·„Ê@¡:] ¹ôÖ@õž2Ê@óÏkU$ÙÁ@]7‹ZKÑ@¸W"%6Ö@¬G”]Ó@£ÍTÜ›yÔ@?¾S©~9Î@><:ÿ€îÌ@½ û×·Æ@å?Îi>`¢@âÓ™|ê»@¤§T×ÒÊ@1žºøÇ@`ñ%IÃÔÓ@T¸£ò Ð@"3âã…À ÖŠÜ–¥@f··Lž@§Ÿ®ÇáÒ@4×ÂÀš¿@·¿cg Â@ÄáƒB¥'Â@ÌÈ:9)“Æ@¡‘}Ò^Ò@’òx੉@¨½•×ßÅ@ *ªpÕ@ìù[·š@ÉUtÊ” @ ±NÝQÈ@ÒN°ˆ £@Ê“´MÑ@¢~k}Ò@ÇD^Ú¢õ¾@ƒH£Ë@½U$¿Á@cQ`áúÕ@~•h¶Ò@áxÄànº@±6ÞpEÖ@$¬À"í Ð@“{ZJ¬ ×@‚Ï”Iâe¹@»R§^½@I?³¼YÖ@ lï`ÍZÐ@ËûˆÑËAÍ@ÝùµÐ@\^kCÛÈÕ@[³JÈl @AnÐ'ŠÕ@Ãà¼` Â@n]OÕRÇ@k6 ·> Ô@`tù"³ÿÖ@³ SÏuÀ"qÆ;5À@ul<&e\Ô@Û|¨”@¹w0ø‹ðÃ@1{º¿õÚ¡@- f§8cÎ@( B¤Ç@ÉEúïÉÅÅ@ý&ÃtÝË@ baä"Å@ªî)q‡šˆ@J$‚yrÕ@Oiv$œ@«¦áZÐ@B1Mã’Ñ@‰¤Ã¢ î@ð("ÊäÌ@Ït÷#¼@ööüä˜4¬@p;÷9á¦@bÉ4 ´¿@`:=øòÌÔ@ŒŒÔ“o@º¸~&«Ô@ã©䑬Ô@s>N0È@HUЪJ Ã@KI÷µÿQË@ 1-”jÒ@äK¯œ‹T@·—2èÒ@Ië« õ Â@ïjÆÛ+ïÔ@Y½H‘ÁÊÐ@¼;&ÝÔzÐ@xʈ«‚Ó@Ž}}ê[Ð@é~«®ÞÎ@mxÚÐ@ŒâÅS¢@â˜X'xÅ@=žrpálÍ@†Äû–ù„ÀÓ@Y±< Ï@ö¹ƒÃÒ@Wpx:7Ä@±Ö¥Ô„ì°@¹:ê­ Ó@<ùâq€¸@ž ƪñbÎ@ ¦ yD Á@ª~ñY/Â@5¦É!¡@6`|Éë–€À „ñH¡¸@øBåtÑÍ@YFÂ;ÅøÔ@.“t¹(OÏ@vÜlÓHDÏ@g @gg|Ï@^­c<8ˆs@ˆr°ˆàÁ@Ë6Ht(Á@ ”;d)wÌ@è°]i¼@£—ÿ™ÙqÐ@ü=…»Ì@\ðkrÂÈÕ@Ê…o©vÓ@A†@K$vxÀŽˆÓäÆ@FZ&ŒÏ@^AŠ*Õ@)ïžB]%­@¢xËÕ §@!Éç«Æ@1Dûˆ¦ˆÄ@Õëá“–œ±@ƒúÔõš+Ä@ùÝ ϰ¨@t¹%W‹CÍ@2‰ `ö´@Ø!)bV¦Ç@„…å¡X¯@}äFW#ÀÍ@~gRñá Ñ@WŸÂH1úµ@TMZ¤#l@Æ3½¹iÒ@WÞÂ׬и@ÂÄsSÆÂ@J5" ýÑ@D¸ƒü ¿@5ppuZ‘@&(üŒ¼ÓƒÀ±Ú|þ^Ã@F€eC¦·@÷Ú}ùµ®@§Zï‚)ŽÃ@uKVšü¶@£ Pc‘Ñ@¥Íºö´ËÊ@´¹5yNnÄ@qèZd°úÑ@ßz‚7g±@€Wh,õª@ë??ºÎ®@ÿÔ7Ö&íÂ@ðpóNÈYÀ­3AÒØUÖ@]Z=×m @t€Ñà<®Ó@3B T˱@ ¦•+‚±@6“ýáÄ>Õ@ŽÆÁCÍÍ@áe¸ãB¿@-­ÐkßÃ@WH[+éíÔ@+û0Ê%Ã@öàR˜´@ÏˇUpV­@ƒž“6sÀPÏVlÔ@ˆG< hÃ@ñ©t\4À@ƒIKˬ¸@mô?#!ÎÓ@=þû6Ÿ®Ë@V6”Â?YÐ@ÍÂûšS@½ÉÜÜ„”@8ý3$$Á@õ,$ÖàÕ@Ï3ù ÉÍ@bšÓ }5Á@äºUËÃ3·@6Ý'¼+mÏ@Ý ¦˜æÒÉ@OÄ›ëUÒ@ÊNñ4#ò³@¼¥¨úбÎ@Tâ 2ØÃÅ@¶|ÛœãÉ@îËfÔ9ÿÓ@ø4üØ>G–@'±jûÚ6²@îÏŠ<£@¸`Ï?‚Àé|=¦Å@E cc…âÑ@Áh·&‹µ@E22ÒÚßÀ@ííoª¹@…ðóˆÖ@½¸µÚ”À@e„íÛ¤_Ñ@¾"Þ›ëd¢@d{“GSÍ@ѹrli]Ñ@aˆp‡æ­@ ƒ³MÕKÎ@÷¬ì–uÀœ­î;†Ã@š]è§x#¬@v~õ}O¶@›öU®‡Ñ@畸¨nëÕ@\ÿ/jÖ@ Ÿè_œÎ@ƒØÔé(‰Õ@3Bº?‚¼@:Ë>6ýÑ@LÔï ?ƒÕ@L8·FM(ª@øˆÐÍÐ@Ü^„äyÒ@ö&b •µ@Oµc–zÕ@’ÒªÊÇ@°)‰ãM½@¥¢)ÎìÈ@»:{9çkÀ@u0¼É§z·@uŸ)hõúÓ@ÅÎGº%ü @iùÌÆ@Ü?âgÇ@ÈÒi³‰À˜ìµˆ-^¼@±¹yÅ%ù³@ì£V…˃À‹nàµû°@ Ÿžÿ½@x cV8¦@úѹ°•À@*jû¥P¼@˜·jࣺ@mH©‡È†À@ã\.¿ÊÁ@q½4™@÷ûØÄ@`橤ÓòÔ@ûј¨P¾Ò@L| »lÒ@~CÝAÁ@£(ÙÐK<È@]öƒ܆Æ@ŒSì ŸN~ÀßäEÚ’íÒ@‰˜9ªÌÄ@Ç#O/µk@?ðnk£@õZÙQçÃ@±“7Ú²¯œ@A©3ÿÈö¯@¬AüOÕ@~Æÿ€¹‹Ï@ŽãqÁÔ@Cü7¡ÊèÈ@Ûò™ã´ÄÏ@Í;¿ 'ÍÕ@¨Ó1ˆª@ñ¾Ó?Â@«Jñûθ@¹BØÔá‚Ã@jÖy ÈŠµ@çîxSoÐ@Ñ»Ü Ú“Æ@¹k‰7˜’@..·Ú"Ö@(sjÆŒÌÌ@®§$wø»@ƒ‰`ÑÔ@ù†°y2wÎ@iÙØÃã®@ضº=KÑ@ÁUÎ)0NÏ@ŒçÞ ¼Ð@P1kˆu$Ï@_+{]jÚ®@,ŽT›JqÌ@ñ‘µ¦’À@¡êˈÈ@žK Æ ]Ï@%´£œ@mµkZkëÖ@# {Á.Éž@²GypÊÖ@JÊ7ÀØÇ@bG»è)£@b›¢‡0Ð@½ƒŸË ÕÃ@Œ¢ÆÝÍ@<²¡ Ð@2y=rÐ@Ë ¡|'w@Ÿí1˜Õ@#òÂÒx°@[j^ÏÐ@ûQiJÒ@{+Ãe)‘Ï@a™ú$'ͳ@w*}ºÖ@]²ÖÆ_­@ð6oƒµFÔ@-èbÁη@r,QtÕ@ì^W1¢Ã@m5L§r'Á@…Ôä¯ÞSv@/†—ñÔ@9»Ï`îd¶@w¶í=åG½@ϕӱÓ@¹¨¹n§GÄ@K{þ<…ÄÅ@.ôCøAÄ@ʪê=!ùÂ@> OF+EÏ@0[ØYÇÖ@KS¥k3Ï@“>wÍ@ô+ê¡–þ}À½§–ž¨@ÑßJA @pß ÙÈ@U¬Õ¼4 Á@lÆ"ƬÔ@5 Ç“U¶Ç@,SÃê†èÆ@ôkp`Ìd¸@Bm…«}ݸ@9ùðÖ “Õ@;¨5}#™Ã@ê9çÎ@OÙ1S%Ð@”–1¹­Õ@g½kÿwÈÕ@“õ?6B-Ë@Êér˜˜š›@©ãB`Ò@4™*a~|¾@Eº«2¦–@n])Qm«Ò@aZ_¢È„Ó@Ô0¸¤ãõÑ@y4¨©•R¶@æSÉÉÐ@‘°Ëþ”@Ø@V[»·@[³áfÁ­@wäîÔ@p¤3×@]·KíšÇ@=ÐqÂVºÔ@ŒgÃTi&™@³[òÐ5TÓ@ŸÏTŽ*ˆÑ@¥ÕDñE„£@«—È ×@…1jU €Ä@Ýn37"£@È8 +¬’Ó@Œ[ûñºñk@`TRŠ_f¢@sºqVFw¦@&bbóli³@”üØKyª@wüÀÜÑ@^š Ý2Ã@*»÷¡•Ä@‘i\ïdÕ@šó‘C‘¯‚ÀÂã §6bÔ@!ˆV:Í@,"›ë*‚»@æmŠ5º$“@±óC¹¾Á@˜ËÞm+Î@ƒj o Ê@ÕÕÞÏÔQ¡@Ô­‹]Z±µ@¹ K¼ØÕ@ÝÂL:ŽÔ@C3d8Ó“@éløQÏÍ@ßM—ÄÅÓ@[šŠ¾üÆ@+ýœã.Ô@ȇdxÛ³@ …\Ïy Ó@þEHÑòÔ@B¯õÿ¿Õ@/ÆS[.™@Ødt‡“®@N<>½ßi‘@[š({ªÓÇ@Ô%¢DÊêÕ@¾Ô~Sº@ ¬›;ÌÎ@I9ðøkæ¯@I"!k‡–Ñ@é J65Ö@ Vï÷&Ð@¿05ÄØ‘@utÞXÓ Ï@Ø£¯Ë¬e§@‰çsÄcÑ@H{u¬NÂÍ@ž•ð:–°š@*5¾ì=Ð@xB$ˆ¶Â@¨ùIf`Àžõ-¹û¦@ž0&Èt¼·@­òvö·@n¥Zg-ÛÂ@Ò¿&™f>«@–ñ“û$Å@†n“åŽÙÆ@Y@¥Þª³@ÔÝ1?â²@¨÷)%çpÌ@nôíh­±Ï@Q”ú/¦Ë@/ßÛedX§@v_^•@íð³eµ=Æ@(“&kls„À‚NS;]1Ö@-†ÞÔÃ@¥ÛÎú+Ô@ò– 9ÇNÓ@Ü‚G'µjÑ@®œ­ÔŸ@«•ö›Æ@c*˜i$¹Ð@C Å‰îµz@ЛUÖ|¨›@Í^þ¦§¿@!ìLKx ª@+§—œA˜Á@׿ÁåÒ@IÎ\1Q±Ñ@LFÊÔÈ@ƒè³eÒ@G6§òãÕ@ Á[ÒTÑ@bw¼ê/”@E€5×L¿@R¨Ä8£@gÙ*Ö@!kVß@ôžzS!À@¥÷bŠ2UÒ@lsN¶Ò@D‘fdóÔ@åõˆ[E*Ô@€—Ul{Ê@=‚Î>@ž@ö¬OD(ãÇ@’ôÄwëÅ@­—²S¤ý¶@”ŸÝO¼e°@ äW>SÐÂ@N‡ÂŸpÀxtöR%ÎÂ@¼—“™ÕäÃ@ v¬ EÅÕ@9{zÌÆ@^î©ÎæÐ@\‰ »6oË@࿞Ÿìª@¦ð*ù÷úÏ@)žô›¦Ï@¿&‡ð¦°@ÞùjºëÆ@Zðj‰Ô@nsçoM†@D}!¯HÕÀ@ýµ;¿#½@!46øÆÄ@8r‡Ï@9É]O"¥@w-ŸV§Ã@|-y­äÈ@î ûjCÝÅ@-"íÖVÌ@t¾wÖ„¶@4NG‘/eÀG‘¥{†°@Í(4 ¤3Ð@1ÛW´Á@ņŒ¥4Â@~7ζµ@N|¸-¥Õ@GSê=ã—É@?l }|ÜÊ@`È…ñ—ÄÐ@O;rvK¸@°×'4­@ ñù yÏ@ëÐ5(‡Ë@-¶!"UÖÉ@I×Dšzƒ¯@„pxoó&¼@ë-”¥ÒG›@ñ½Ü¾¿žÕ@Æ.É-Í@ºÀMÇX»Õ@Om,¿¤Ê@Ld§b?Ö@eybŸAÎ@…}Ô°x¼@bÆEÜF“@ *I™ÎÞÆ@ê-ú?ö¬Ð@|eß@vª@ÍÅcrìË@!ŒfÂ9/Ï@æ¥ëENÔ@€§p¡À5±@ˆpOÅ@¾SbŸ@/E.Ñ6QÉ@wÅKs?vÆ@i¢{jÒåË@DMç_ö@sÀØÉÈ… M@UÇÜúzÍ@—EU"&"¾@æßUlÎ]Ð@(Ô‹Ã@p¬š·ÈÔ@"³! hÖ@Ág”T5Õ@–råÅÑ@Ñô{¯{õÕ@ ‚ÿÊÇ@í´¤ýRÔ@ï;£3)Â@s_ƒÔ…¶@ØóÄ~sÑ@¼Û5ý±ºÐ@3¹¼‚(Ô@øÐ )Ö%.kÂ@]N Þ©°¯@7ðÔžxAÐ@(?£ÌÂSŒ@E¤ÊÖ@'ºØºÓ@0T žÊÓ@ h^Δº@)²Ó±¨ð£@‡ÑiŸ³Õ@9à;¼2ZÀ@ë°"5œÃ@-“úaótk@¢Í›|‹}º@$ï‚íïÅ@Å'3{éÑÓ@Hæ^ËåÓ@Ÿg.4 ÉÒ@´ÌœGTÓ@/L  œ³@{–ÈÌ€)Å@³Ù Ü$Ã@²'³ÖM†ÀšTXŸ]÷Ö@¤ÃøG&Öš@cÄ»¶§Ö@W‚?+9.Õ@í&ùÐ@òyA|3È|@Vùöó*Á@: Ö°VŽÐ@Väñ¿‹>Ñ@µhŽyÎ@æøó'Ò'¦@OZ{—Êc¦@9 Œ:{¥Ç@—(¤ÉÐ@‘è‡ðãÕ@…«ìÛ_§Ä@$g»éV¶@*IJÍE®@îäxLZù@åEKy˜Ã@˜Ñæb38Ä@:x·ý4¯@È’Ùƒë}@Ið™‡Všµ@›1©‚TÆ@`l4á¡âÐ@häI}Ò@~]uÁ:TjÀCœ–FöÊ@`*¯,Rš¡@Íœ*ëOÔ@bZHT›Â@M (“âÉ@MëLŠa9Ó@DÝeqÈ ½@ë¸ç}_Ò@¹q%ãì¡@‹AC 7¾@<'ƒ½@•Iྫ§@gp%à¶Ô@v³?êÝúÅ@ç‰^zˆªu@ž{þëÿÕ@òB‘ºÈÕ@è§Ç“t @=½hPÓ@…(s€Ñ@ÉUM3`$Ö@ü¯Z½6””@b¶ù˜ÒÍÄ@‰ÄÐxèÈ@@(¦DiM©@’¦Ðéu@;Y=Ñ@¾ìD8UÔ@#¤“¢Ë@¶ÏiužäÁ@‰pÅ¿Í@VyZØŸÑ@æ0 íbãÂ@€UÊø¥¾Ò@]5ÍçŸÃ@AŒ˜ Í‘È@ù[™},Ö@{MƒrÊ@NæÛ"³Î@`9ÕX¸t³@.ÙØ~=Ó@C¨ ¤¹@ªÐ°C¾±Ì@6eÔ È@R1tÅ@§Ñ*ЩÕ@о$ ²@§ þS Ë@s‰FÕ@ÍŠ+Hnݘ@;eŒºÐ@ý¤ÙòvÐ@÷¢èz¯@‘õšŒó·@“Š1ªå`Æ@¼]MßUƒ»@+‰4ÂRÃ@Ó^jË@’Xy@)·@Éí ¸K%˜@Ó+Ò—KÒ@Q8¢(éÒ@¹®©6­È@á6m»ü›¤@Ùäþ%¯@6}ÞL7l²@ó}â”Ô@xNbß…Ë@}ë´‡òjÂ@3šÖ{­@,æîÄ9³Ô@Ú9üàíMÑ@?ò~_¦@"öÏÀ¯»@o–ª‹Ò@÷îrÞüaÌ@¢I–$ÿÊ@BR9S¢†š@ó94²tf¬@QIÕšÄëÄ@j©Âc©Ò@‘õ¦A\»@Ò:¾Å ßD@rLæ‹ Ç@9[Æ^i‘Ó@¢´ m"Ð@I5ÉâÑ@KNCØC°@?¥2Í‘XÐ@ˆ‚51¶±Å@iWÐ{èÂ@À|éki£¾@ï©4û'Ñ@¸%Þzê Ì@Éi^MÖ@ä)Ë^\Õ@:6 ¡âÍ@Åå¸7kÚÌ@OXn)YEÐ@lõ Ñ7µ@*_RÃ`Ã@ºA:P¢Ç@™<3”«@¨sp¡Ä@F¦í)“£­@®ÈHËPèÄ@®ž¡+§À@Xóß'zÊ@²Jî0ˆÄ@xy °/·Œ@ñ=ŠqV¨@-úM×Å­Ñ@.[û©™Ç@jO¡ÊvÑ@À€#; [Í@ô@Ö)4Á@ëÕÏ”»@Oeh`¶Æ@Õ(öŒnÄ@èš^Äø¤Ê@l[yíïÕ@òm_Û×@-*Ûj·±@°1%2]Ë@dIÏ97Ñ@¬9³úæáÕ@ì„äÇ“RÁ@[²RÖCÎ@¼†FE[€@BoŠŸÂ@šÓĶ@~é xù3Õ@u-ŽÔÕ@â٥ľ¨@,UÐˆÊÆ@&j:ÓâðÒ@·Jñ2¨Ä@$q{œ¢z²@‰çŒ%i¿º@98Ñ·˜‡Ó@úì¶vTÿÔ@×N듬ƒÖ@nhN¯óÂ@Ußå'œÒ@ÌŠ±«šaÉ@º™.æ‚ô‚@ý«TB‡¤´@Òâv#]3­@I~v&FáÓ@ ¿¿ÓH}Ã@°áò/žI±@­Z²t»³º@§1’ ¿×@„BR‡ÊÖ@¨­q’Ž·@€¢6: ؤ@ Ò}Ý€t@„†q;Ñ@ÉãTÛòÔ@U¿ ß›]«@“>ÄÇiÂ@ÏË(ÕzÓ@7ÓȆÊ@kgÅóeÑ@™ï–¦¶Ò@GÝÍÌuº@svÓÛ3y’@eº­_«Ì@èžA3³@PÑ4fß²Ô@‡og“J\Í@\” $…øÐ@èXÌ]»Ñ@ó×â<þÌ@ÆXl¬‡Ò@¨þª#mõÊ@(¨ÖL˜ÁÌ@5I›B4¢¿@ª ¾‹âÀ@RZÊ8Õ@ƒÎ±J[ÿÖ@œÝ] ¼Ì@HÍ¡h™Ñ@L¾3Z{ÑE@¥BéÛùÖ@#Ê#¢Â@™P·žÕ@–9Ð>-Þ¾@0êM­t¥¢@n¤Ói‚Ö@ a¦”½À@•Ö!¤²Ç@ùNþe`Ö@G«È<-wÀ>â|K B@HÅܪ2{ÀSÐMVÀsÈr™w÷Ó@z¸”…Õ@é¯0äøI­@ âé\I|Å@Fvömb€ÀØcêaš1É@òfn6 X¶@Ñ;{}•ת@4š¦’.SÀ#¶ífº@%2çG™r¦@p² …–Ð@O‹Âl»@ÄêWö´@±@/d„0Õ@7›ÔyªÀÓ@’éóî$Ï@¢§+fÿ±Ë@e;ÜÝ,±@1\ÁˆºæÎ@"¼+”ÌO·@Øóa÷Ñ@–(|‚£Â@^6¹vŽÂ@Û×®SÊ@(—aIå½Ã@:âæôáþÆ@ó†²Ë@Ð}9PÔ©»@È.&àEÑ@•îvÅ¡@Üþ)Î÷ Ò@F"ÑÜr®@þQhô›N½@ĶîC& Å@fy‹é Â@¤-áçÇ¢@—(2ÏM>Ñ@&ï›õÊÊ@«È‘ÀH¹@«É?)hÌ@“£Ú¹@³í™kÓ™½@æËfŒb6Å@¬öäÜé–Ò@8¦2ÝÚÆ@Üq“¥dÖÍ@ÁÇÅÀ>Ð@p®¶t G£@ÒJžT„Ê@dnF¾?ÈÀ@ Rç<ãÔ@X ¤ß!j¹@pçe‡>ÉÕ@Üçñ¦ÂOÅ@s{‰èÐ@‚~® òœÐ@¯ÒíTvŸÊ@A§NÁûÁÌ@[fíøføÈ@Õšjƒ†–Ò@ïÖú¿Í@é&HB|±@ã“7¦¸Æ@žm±™@û¬ÄE[Õ@7©*±"¶È@÷Ðc2‚Ö@φ@Ô™Ô@%îèªcLÐ@ìM!0YoÀ1më ×@rR:XÕ@dÝÎh¶Ñ@¬,/!áÖ@0÷a3=3hÀ”‚P›Þ1Ë@‡|æÐœA´@{l¿ñÁ*{À*']S‘±½@ëÅ͋ح@kš‚)©@¥»xa$›¿@KÐUÉ#|Ð@¾ ×» º@¹³C’|@L.þ8!‰¼@5¾¢r)L¯@†œËC4Â@ZIzØŒÕ@ÿXq1oÓ@%Š&Þë¹@FMôÜ>Ö@ŠÄaŸ+×Ê@ mlàsË@“‡öÔ@$¹¬Mqä„@ꀂGZ¤Á@aü {äøW@… t¥²@¢='¸ÃÊÕ@¡´ÐÌfÐ@œÃ­ú÷³@Mª7ÃÎ@SÓ³‰UÎ@éo³HùË@¯ßû¸l”Ô@B–WXBÔ@vüWâ”@ƒÞÚ´]HÕ@ÐX1ó×¹@P õ(àÓ¨@0x<üé”Á@ª™)8ž„ÀœS¨ÖFgtÀºpyþ‘É@Û›Ö4Ç@Aªm0˜Â@”ìÕ¶Ý=}@÷çÛ‘¢¡@èd¥ÚÇ@§=–‚¹ÁÍ@Ë5ŒäíÖ@OÈHbÀ@iŽS×¥‡Ö@éuͦ˭Ô@¿õ ›6¼@Yf>Ó³³@«?žÊ³L§@VëÁìÄ@¶ãˆ(&Ó@Ϻ|¿'@;ü¦ˆ™ÀÄ@`SôH›½@™aÅ™ÄÏ@”Î 8ÕbÎ@6 ZUIÏ@È“F×·@.¡r\#µ@h»+û¸¬´@¸BW@ôñÔ@.£òå†Í@QŠu?¥î¤@ÊH—ÔäÔ@‘súþôòŸ@Ì·ÅÌ0Å¡@1+¡†wÌ@gwhN=0Ö@ÿ×a”Q´@$öy'À@«Ù©díÈ@¿Œ¢U‡Ê·@nWàÊÉt·@ü‚ªQ¼¾@1ÿÿáŸÓ@AyX*¦Ð@BK£Ñ@‹þ\Ga›Æ@€82Īe±@kø Ò»©£@ÅŸqdÔ@¢ýL|j¾@Ô$Ë/Ȩ@DZ£ø†ÄË@µ0O]à¶@§\¿kïœÆ@¯í]ÿÚÖ@¹@'[ÞÎ@€ dÃKëÃ@øÞ$F #Ð@¡M³üœŽÅ@jpsÝØ+Í@_”Ÿjn£Â@àzF5(,Í@ºp§È,ŠÀ·Äû%x›À@‚¾»QMÖ@“Î^Ô—~Ò@rø‹à,»@¡{5‡æÁ@_ÞÛº@ÆoA¸Î@1/ÔõnÃ@–=ø¯’Ê@#R•V¶@t“¹&Å@r l-qÀ@m GOÍ@î|òÞD·@R`¢¤Å@ÍúÛ"ZÔ@@Uåá­@Y‹Í@²@ÎISýc¡r@|Ž·N'pÐ@»Ù‡Ê+¡½@1 ®ðýßq@NÆ{î¿tÂ@¢5zWó÷Å@Üøi Ex€À™Ù¥EEÓ@ÙDëHtÀQ 1+˜ˆÈ@a£~ÙÒ@(Ã8q.Ç@* ‘/ ’@Ë­ùýr²@‹Ö8 Ô@ÓÏ)‰¿ùÕ@®ž¨ð–öÅ@j¶Â€Ž…È@ì`Ì›Š$Ð@¹ø?õr @•düÔ@ì.¥`òÌ@Z²ãËSÁ@¬[óÐÊ@`d}ŒÍĵ@¨™ Xß¡¹@›Öòß•VÕ@ëË•ôÓMÕ@ª•¬À§¬@2&nêÈ@vTõ[ôžÒ@»UÞøš³Å@‹ z>sŸ@~½î´ä¦@1žsm¬ÿÖ@ÚÒO½²íÕ@åv”ú&¥±@Œ‹¢—Ñ@ÿ £@u„Ç@Ê~6¨UÓ@ñXƒÿÔ@[±ïCèÐ@9ô $ìEÖ@eðÖ^—Ê@wö“°.Ð@5 ›T+œÐ@s–Zµ4<Æ@=*ÒÒ•'Ò@1|×y²@³NE÷í!¬@íC)¸Ö@ŸÖ%Êú Ñ@CÀŽO $¤@+^õ±œÁ@ÜEñØ;Ó@_!{ /¼@'%Žw¤Ð@>)`lûì„@dÕ1ª+'G@z¢ƒËÌj°@³úkeÎ{À³Ü×W¦/º@õºðgINÃ@ÁÚË7/ª¢@9úžU9½Â@2Àlýa¬@Э a*@€L‘Âð»@üá_ŠûÇ@Ìo«€Wµ—@¨Ð7Ö@Õ\±ßÔ@̲08¶+Ê@EYá4;Ð@ùã.\âÅÇ@ HíihË@•‹£ '$Ö@Ž•~Æ­@W”r!î™@X‰THl5Ñ@’üÌsЬ@–þ™ŒCÏ@Ég•’cB¹@]äª:³@ȤkÆ Ä@*–MWÈÕ@£ÂC¾viÍ@¡}J=|Ö@ô•±%]¬@;JaPï¿@‘˳À@„éÔãúÑ@'÷»ü™Ô@è<{oˆÂ@tЩ Ó@™$HHv@…µæ„Ë@<¶l¿@<ÊÎF ‘@„ó}žØÒ@pEq숌²@L  ¹@qñµ®¯ž•@Y²½sâ“@×ðÝð[5È@ŽÎò†¾@ÄØkÝ}WÑ@ ˆFfðiÀ¬!ÉãÕ-Õ@FÏ¿€š¶¢@ecp?¸§@ð*€ ïÑ@žp6S¸CÓ@çèd/׊¤@>mvƪ@l ¥éåTÏ@¾o°\ €ÀÎâà͸ïÒ@¹ëf)«@N`yò…HÀ@CÉ•m¡ÀÈ@Û“Ú^­…’@:\¦iT'§@OÐ`-§–Ë@ôT¡åäô‡À&-?÷„ö—@$v­‰^€Àá$Xò>Ì@h«¬cÍ@†<>²ÐÈ@9žâç Ö@º8„¶@ øüÁ²Ò@4¡²|r,»@G²àŸBÈ@Uc…­.ÂÏ@ŠÔYÄíúÈ@N¸Â´"éÐ@èÄT%òy¬@ýª-ù,×@DÑùU´@S^Âw'@ÓÁñùpÐ@7Ç×@~OÑeÐ@üâÌHl,Ó@7!*å]Î@—ŒúH ¤@°Ï"«Ò@”†]`o'Ó@ݴЋÃ@"'§n¿×@±ï»äÿ¼@—„2GÏ@7÷ÄŽè†À Ñ!öÁ@§«üúIÖ@›ƒ¾ÖüÓ@ñ Š_Ös¿@cK]½-=Ò@Ìýrù:çÑ@Mu_¾öÄgÀB~ç,¶’Ó@ðôV‰Ò@ËnN “ÓÒ@a$¼PÒ@èåiƒ°À@5ÿ‰âîÎ@K¶Öõ{Ó@ŸùœwPÔ@öœµDÄ¿@Ktæñ¦Ö@'š×ÐË@ABtj•¹@TûÀöʤÂ@ªßì©úÖ@ŠÃõF÷DÐ@“u¨Ï@aE&Ô˜FÌ@¦k]§«…@ï _oo”Æ@vU§&ÃÌ@MPíÊÒ@Ôj7÷žÇ@‘wöúdù«@ÃɆ- ¡@ö¸¬° H‚Àú[¹ÇãìÀ@m>ÞîÁ@ ­*õÆ@±Þé¹âŽÈ@—ÿü a ¶@1»¦œÜdœ@»\‘Ð7bÀDtEýï˜@Kaˆb»}Ñ@2³sèHÂ@†ÔÕô Ð@+I]§ð¯¸@‚攕ÏÓ@„ÄF%Ë@Çê¢dÖGÎ@O¤z؆°@´‘vY¢ÃÓ@1(”+Û“Î@ ÄŠWºÑ@{XµPÖ@ôH_%íXÆ@ÔåÙæÛÃ@U‰tCg¢@~Òt€Á@3qÈÜÛ´@4šÿÄ‘ Ö@ÜÝZdˆ À@¥Èz•­È@§“8ÎÄ2Æ@(ø ûÌ_­@é/á\(Ó@yuj ÇÊ@¢ZáÁÒ@µÙCó”Á@ê'”©Ü\“@Л5UˆÌ@c=f7¹É@@ÛžG¾Í¦@ÚûÛý,ÏÓ@DÙžqLªÏ@JeVjìÃi@µ³ßu>7Ê@ôqÅîæž@X:Nš^þÁ@ôð—¯Ã<Õ@I²ƒ£¤–@×I£ÆÈ@»–l|^é•@ú)í: ~Ó@{ѪéÔ@~¨›„DÓ@cÌœ:Ö@Ôc‹LA³@Üm¬E¹Õ¾@@YXîm>Ô@»ƒ¡âöÓ@1K?"‘`É@t½Šª»Ã@õêUâÕ@Ô<F|Ö@”dUܲÎ@ r4¨ÜÔ@ºuºýÇ“Ô@Î÷°t½Ê@b-ëoŽÀ@éÞƒuªµÁ@ãù£áS¶@îÍ/Dk¾@:@`ý„Ó@¼«fÝ 3¹@|¼B°{LÊ@ÌßW˜Ö@Ä^å¼Y”@Þg꙲Î@Bû³’¶öÕ@l$Õµ¥¥@Ou!YœÃ@p:5Ù[Ò@Þv∗¼@G¼G§Ò¿@Î¥³¤Þ¦@×ÆÆ•“ÇÌ@(ð˜”CÐ@ Òò$¼§@Dn5É¥òÐ@„jçXFˆŽ@å±ô´@Xn„dcäË@ð…ÅÎ@ë¶™[T¬Ð@€äÛ:]¥@cWа}°@¯®ü?ã~Ê@Ø¥«ëåªÕ@øÌï4Oå¸@[Þ3»4м@JYÄEÏ Ó@ÞÛÅRŒQÎ@³ÁÎÖÔ@“^av8Ã@ª•ÉÃÏ@nŒÚÖÊ@î釤õøÓ@ö—–C~Ñ@x§FÑË@©;3yJº@[Ä4%Î@Ö¿TYGâÒ@»| ¢ÁÖ@ÝäÒ iÇ@šàŸø_ÙÅ@úæXßÚÃ@ŽDÙÒ_¶@6ª„ªˆÇ@C¼_‘`­@+fw }µ@Ùo‹Ñ•sÖ@Oœ#£ÔýÓ@¼ƒ3móõ´@¥UŽaŽƒ¸@Š— ¸NÀ@”²¬l¥@8rÀ‚˜ª@p4MËÜÆ@éWèÛm§Ð@äJÏÿz#Ð@ߞܭò~É@7™*×Á§@¬É˜AæÒ@høâÕµ@¡ÿ¹€.^@‰;jô[µ¸@z°ztü.½@˜?h¦WÐ@ÈjP ¨Ö@7¿‡‡¼—¾@°+nk>ºÃ@Kf(Ùû-Í@ Ÿv9íÓ@(:îçÌ´…ÀÞÒñN‰Ô@ìêê]>Å@·yG“LiÑ@±ájnVÊÏ@:DÒ\c[Ó@Ÿ¢•Ôj@'š…öÍ@Óiö¹*0Â@Þé¤õpÍ@âûç¼5Ô@€F:kÍÑ@ø´¸—R³Ô@­Ñ³n>àÀ@xö™¢5^ÀTÊæDói»@˜J 7Õ@RrÍ/K}Ô@~ø>†<§º@¬aÖÓ@õÑ~uÐ@Wi6æÿšÕ@»Pç ͹±@çÓ[\(–Ö@ÃõejƒÆ@ E³ÅœJÇ@7s†BºäÓ@æè¼¥˜v›@§®rn9Æ@“k”4È&Ì@P|tiLÒ@Ð4§É¿Æ@«;‰óVµ@K…U¶Ù¬Ö@Ьöz¹¹@c,ˬ£@»eï¾¹8Â@‹‘—ÜœÓ@W F[´@4 >Ø®§Ì@(…g¶ Ë@©*é°½úÑ@s:G-¢Ç@ø9zÑÏžÕ@ñ#±EÒ@›ämmÔ@œ=ÇYXDÔ@:HZÞK†Ó@)^à1o¥®@Äñ9N9(@p5îKÂ]Â@Èn;4!™Ë@¡?Y׺¸@.[™ãTš@ésß–¥*Ö@F2ëís³@¦vˆN§Ð½@Uõ–š¯pÄ@Üøð·—κ@Š*Š6í¤@ löø¹<­@ä[5Ãè'´@DÀ¼\JÎ@ÛQ1:ád±@Æè<ÓxˆÈ@RΞŠtD@õNFؾ­@{שWPéÍ@ÎOí\­—Ó@ÑÓ#”¶@ž“ „V=Á@¦˜Á9ÔÎ@…&rÖå÷Ô@r­‰ïÙŸÆ@Ïj¡»ËdÐ@,æ™Î@‘ž´Ñ´¢@ž0ÆîFýÖ@ÂûÎx6@©þ‹0åbÍ@}›Lu ¡@þ ´Ö‘Ó@Úk=cÁ@L-›;S¢@Ö ¶r¾@ ¯e`$@À¹o7_¬,¸@ñúL >J¹@ÊKX äÒ@ʬÂGö²@Ó»ˆÄ©_Àu®œ9À@Ñü0ËÄÍ@ Èü 1ö¶@Ä'þ¢zü»@œ°±§-Ì@‡<{ä$®@¯îN!„É@¬Ms[8Í@åà^_Ã{Ó@ç½/}ÓM·@Ö Ë`×@åI&ÆÐ‡Î@ÇÏf!µçÃ@e¡‹ r·i@®CeÄõÀ@äåZÌixÏ@ŸØœø?Ö@9)£È_BÒ@Ý8M_=À@–Ën?ì¥Õ@ˆÐ´9PÖ@ºG_øÎÑ@2Å4˜‰Ó@w—†ÄyÓ@+ŸƒÐmÁ@(7ÅÎK£Ô@Æ |o+¥@8¡H4¤ÂÑ@% ½Á·HÀ@%ümפ°@ö݉Ä@[ÏmÖ3ý¶@¬r\Æh±@qïfø(ÓÇ@ö Þ¾ÖÔÊ@Öq'Ÿd^™@‹ò@Ë|ÀΟ¡‡qÏ@HµÝ™¨FË@Ð< ¬«€Ó@¾©a9Ê@;ðe’´@Ÿ2ó¶2DÏ@8òqçÕÔ@Ucœi«Î@XA ì[Î@û¥CýÎlÔ@Óއ±@Ì6HÍ ëÁ@ã¬eOñþ´@ŒÝ¿{WÑ@NîÎPà„Ð@EŒ eÚÎ@Ϭ¦9pÕ@¿=Tè”É@e¤v¾Ì@!´P#Ïo@I<Ùóü£@Õ+¨>ލÍ@èè§?äÔ@`ïCÍ,¹@Œï/×Ô@@³¬­Ò@m¯†TÒ@—jkÔ@ ñ‹'ª@zoëzYÑ@3«5ŽÔWÑ@Î&ÉzˆÃ@åX 9T§Ð@ÙW¨Ë‰Â@lYƒ.ª@)=ljäÏ@·Æï+?°@yoj[žÎ@aÉ«ZÕ@g¶ÃNÐ@%xÁ#cÔ@T´éˆúœ@p’ ÄÏeÀÚ+”´Ê@°²?¢«Å@‹˜ü3)³Ñ@¥W-ĵ@ÊaõÅ¿@þiã‚+1º@®kRß Ô@~{wÏ‚‚Ê@Ž‹ðhLXÕ@“ ªò¦=É@“Lýƒ¸@¼– '¢Ó@à DPIÄ@ˆt™Ò6Å@AÐù³äÕ@!E)J×@go¹nQ»Ö@sÄM!ñÎ@‡8 ¸÷Á@u¹U\èd¬@¬7q·ÛÈÉ@©Âõ¸ß¥·@1 “ëFÀ@­HòÃS«Ö@c˜´—Ë;š@&Ø&¾6Ó@Љø%_Ö@ôv@cyÀ”úȉ‘@UTþfõÎ@Ó¢ñÀ@xØåÎ@fº’á¸Î@bwPˆñ3@9/e˜ïüÐ@ÌxAö3ÒÒ@­°Òe—@ET^8<й@éî+2úÝÉ@~e@‡À5¬¯_þ¹Ó@×V ·>òÔ@ÕûWEæÐÁ@J\„íúŽ@Ó<×¹¶@ õ8ñÕÇÑ@šìI—ŽçÃ@Ï7Í·ÌÆ@ x¿’O×Ì@b¡õÛ @¡þÖAh³@!•bZÆsº@¤Æ…ó"ùÕ@”¬Ä¡@ûÝw–²ºÏ@¸*·„cÖ@‘"2|W¬@½]-Ì™€Ö@ZÓ«V¹:¢@#ž)»"ŒÅ@øUq—ª}¹@½Í .j›±@ +š;Â@I´Ægdž@ êŠÂ8‹Ô@7(õ¶é¡@”"LeÍÆ@ʦ%þÕ@í+µ Õ@q®³&Ó@¸éjZÔ@Üúw*$ŠÅ@¼<ì––Ð@ëž)>]Õ@ÜvÂìgãÍ@{7w—°…Ñ@ûzcOžžÈ@Þ׊JaôÇ@ÁÖÛ?í»´@@èYð-Ö@äoà¤\ °@ƒjªŽÖÉ@’þðv+Â@¯TèÈ€Ó@ï%sC©@Â8¤xk@œ«ÆQ­@÷)$wÐ@žÿÞû›Ð@T…Mù±€™@P Mpµ@Ô\uÅ—–Ç@¬2¤ÊaëË@mÀ,>Å@ÓîV‚¸¹ž@G kq[Ç@0s„&KÁ@T<Èw6È@ÐÆ¿Sº†Àï%…^†Ó@,Œœ²}¼Ã@o²é½kÔ@ÁïF²6Ð@Ì„†)vÑ@ºŽô´-Á@{†œ6oùÑ@ûâõ³¸@œš"»{ó¼@,Tµ þ1Ë@svðË.jÀÕÚ [×Ò@tsa[ºË@'Œ÷âÍ–Ó@ØY\a‡Ò@gQ¬þÓ@z((¬ß“@âMïOyÉ@jUõëã»Ô@ujé®ÇË@”7"×@ÆÎª§º@E)ù<™ÊÅ@’5õ¤¤Ë@î÷¯”CÓº@àù–ÆŒà´@³› agoÁ@T‰ù[FÑ@~ ?rjŒ´@ÙhòL Ð@]ÕµNyÆ@"¿ƒ¶ªµ@ýÃ'B£ÖÃ@Ä#bá!Ë@ß–4T­¼@©ˆÏý(µ»@aíP®™-F@#¡…Óv`½@]¯X„‚¬@ß½‡´´@]—nvTOË@5³hèÙÔ@ïÉK×Ió©@&2ùÓ@ì—Ó ñ¦@“K©ÑCÖ@žïÌ9Le¶@up=ž@š@Ó`Þ»1ÉÑ@CºÌae¿@ʬÔfeÇ@éî"¥¥@]]!¦»ƒµ@$áåxÀ¸Œ[¸žÞÏ@r¶k&#ÄÕ@§GëGÅ@ŒÌj¹§@×0$O1À@û´$éPÍ@[æ±]³Ð@‡H,°*³@A£ÄºGJÇ@ܼ‚·ÕzÀçÖc9C3¸@ôÒJFÝÐ@d y-Ð@ࢸbª@*žRTVÂ@îÖãmÅ@káP(I˜@GÚa`Í »@œ8%,¦»À¿ëÉŽ©@Æ×ŽÓ (×@2ªÂ2†P®@d ú¸Æ@l7ºõ‰¶@UêϪØÕ@DÄz#Ì@hñ3j_g´@𸙠É@—C`׋Á@ÏbE®`¯@YR|16³@ÐLC—R Ï@¥»¤´™Ï@Ì¢ÊøÇ@3K:ßmGÕ@zä‚‚ƒÀÙÕr²†½Ç@ -²1´÷Ô@ç$ F ±@Ì40¯¯gÈ@Ÿù¥@ªID¨@À®\ý C‡@öš3ñŠ!Ô@F<•ÿض´@+üïOϪ@ñÛë>ãÑÖ@Ó©¾L»íµ@«cÔ@ešŸ;U%£@#ñÕ“G¡Ó@M(¸@s%‰êî @e¢ ÷ÓÔ@Y!߈‡IÂ@AÀÃãÀº@7âãÉ„ù½@Ú “®Á§Ô@ε@ïÐ@ò¥Í°)€Æ@Z¥ëC†XÕ@9YÝP*Ô@MÅpÛð²Ä@*FÓJæ§Ñ@UòûweÎ@rÚ°i}Ó@±%j€Ìµ½@Õ¼þ¤£Ð@c‚—t˜°@×ô¨™…”È@ÚÄK~Ç@ã«ô»ÿË@+"¾`¯¿@`v¡*ZÁ@ö-c-1Ó@ÊíøÇºÑ@0a°Ï0.€@+|TQ•ÞÖ@~.ô†Ü:È@~°5b§¢@ ½¥0ŠÁË@†¬f£¶N¡@Á’Ö9Á@\°d@Ü’_Ï ž@vÃô*ÁÖ@>QÐï[ƒ@å‚%uÀb¯@ ÐíH j¿@š·Xd›‘Á@ÓÓ½1Ä@A¬“÷&À@Ϻ™? ª”@•Ëux‡;Ò@óg‹ïS¶»@×)7Püv@T^ŽÍ…@ÀALS^{®@å5¦^a2Ô@QÛLù¬E·@c¤iÛ@߬@î›È,É@r%*¥£½@•²UàXƒÓ@Y¥w•HÈÄ@émol—~±@fžažò¼@\䱈½¶@y›íHg#¼@Ig8ªÒ@ñJ¼fÐ@©$,vu¤@{7ÁX©Œ¬@ÿ0/þ«k´@1¤hRÏ@€ÝNÖ@Õ3f“{Ë@g¥Ò*ÞhÆ@ó°6²@¬ðšEÐ@¨V»Õ$¹@Å*ï*AÑ@~ᣨù¿Ç@çu±Aи@BE¦Ã¦@^c­ÁåÓ@›°•ZŸâš@å]Cê‘«Ï@ÿ]ŸöƒDÍ@µ—›jB¿Õ@¤H¦Bø‡—@™;´‹*Æ@fm¤<ë|®@¯FB\µÐ@"·UŒª$Ò@Ô²–à+ð©@åÛ 1zv@¾Át¾+¢Ä@©Â´ÛnGÉ@ìx­s¼@öå7'¹@7V¡yqÆ@J¹9X•¯@òùE¦@CDN´qÖ@ láÔzŒÂ@–»_½]<»@còLÞÖ@fÅ$~AÖ@•™åºõ ®@HZég|Àé)i&è™Ë@{Ш#Ê·@"/ ©°@¬©¾Ø^Ô@]«ò_Á@[ÿŽì¯Ê@§qµ‘^KÃ@3pCkÿ˜½@W§`æâÈ@—fyñ¾@W5Ú®I»@,«q1,´@^z"…@³@½ý‚Á‹²@ù7 ÑÒ@¼;ÑŒ" Î@‹TÙÊ@„b2¿,Ë@SÜ«ŸÎ@þ­´f\ëÂ@‚Èõ2–Ö@^-T†?¶@Ü{{RWtÍ@>{œßµ@qyå¾ZÖÐ@e øKÄMÅ@Ĭ5‡t‹¡@V“Ö¯œAÕ@"ÅÕæx vÀx§W#ßÖ@“`íÙâðÆ@êöi}±À@Õerɱ@½Äf6Î×@xRk„ *Ð@*‹(Ù‹tµ@4Ÿ††Á ×@J‡UA¿s„@XÕÐ Ñ*€À]úPœÂ@êsðœÊÜK@û]mîhÀ:)zs"þh@ZP¶-Ãp@õªŽcì Ô@›¿µßP-Ç@¼ÙÈe©ÆÇ@ïHˆ­w³@³~YŒmТ@†0žâÓpQ@f6zÕ0Z’@.­èú4HÆ@L@í"ª‚Õ@ŸcM—Cš@¿)ÚÕÓî@˜ë%MþÈ@¥ÎÔŠm¢@:~$è!Æ@ìÔ•[ àÅ@e)fè[½@C׊ˆSÉÃ@V,÷툓Õ@²r€y„r@.3·{=éÄ@/™”iÃ!Ò@Ç#¢ÌQó³@½u© kÌ—@n€èÜò¥Ç@ºë ë&©Ï@š؅ÿÌ@{¶$eú–@¡©„&i­@yªùÂÃ@‰¯Ù)à"¾@*ɶ5{[À*3 dÖ@ kP‚ü´Í@¿ѹF©Î@B¿Æ€¾{€@ í`@R ü&ý?Æ@Ä*jÁ@“ð(®Z9Ñ@d‡ÿs£yÎ@ö!)µÉCÎ@Y§*»Õ•Ò@Ôø£þ"š@[)S½\Ö@‚u¾œ¾@Õ²bÏ$ Â@ñeØ1MÙ¨@(¯µ&¿¾@†Ãr¶››@m¯täÈ@cŒÙ(ɰÑ@ÔÄ‘›i§@°7ÀþÅ@SžåiÞ±@¸4e0ˆè§@v'9-t‹Ò@'»¤ˆÅ@h{nÏ»Ð@dÝýÚ´Ò@|@Êh)M¥³@ =I ©Ô@]û)3ó¸Ï@œ SК@Yp¶vö|Ð@5©á>›@¤!蘭kÑ@¸½ïÈ@÷ɶâ”BÕ@àßã]ÉÏ@õ¼À6hÊ@Â}vß\ã¸@ªjË Da„À3oz<”Ò@ŤÆb´+Ç@‹£Ù RóÕ@’*“`\Ò@‘î«Å@fžã3ØàÏ@Ô½û0%M»@mû®³Ö/Ä@Án-ERÓ@å<ƒ8MÖ@M*‘)@®@ÔK ¤Ê@MÔY€Ü`¾@Ks…‹ÈÅÏ@y¯ÆD†OÈ@¶’|äÑX@Ÿó³+PÒÒ@Û·è®ÓÐ@‘®{Ñ@˜LÍýÔÿ|ÀTh­ÅÉ_£@ç†\€P€@o×ÔuË@mw²ÖÁ@[^óx#«Ì@ rÌš_›Ç@Z-›ùº@ø_$rW¤@ jd]_PÀ,jÈò/EÃ@Vµhi‡fÖ@«‹“Út±@D“³ÉÉ@;jœv2'Ò@˜è0!E¶¡@,§K·MÉ@}6þÅ>™Í@ò;±ÔrÐ@ܸ›:W·@>°°˜üüª@f¿ŸÑPÔ@—óXàæÕ@¨Ã-d Ö@Õcµ£ùÈ@Pܦ¾x‡²@»+}ÛÑ@:ja5'¾@V‹1žîÖ@ûýž¦ÈÀ@q(ÜÁ@«J2³8¡Ó@šŠWÚ Ç@é Í¿ÕÕ@²ju~~·@õ°‰vÖ@˜ö¢\…Ƹ@«´Z™´Í@Ë­R2 @ÿF±‘g¹@°ãý²@—]Ç Ð@WуJÚÓ@ ú…b3Ñ@¢Jq TT¤@5ÿÿ츹Ô@ç!j“‚”Ö@;S©h´Á@1R‹°-µ¬@ª†À ,„@–¥%ÎÆ@¯‰ rÔ@ƒ&ËëÁ@M·eÖT²Õ@¦¸ÍvÎ]@dËgsÔ@àž¯x¹ê³@¡AúýÊ@¦±¶rè{Â@s8gd Õ@ê­%Ò5Db@° +YnÑ@h7FX‰Ô@¢¡u‘ª±@‰å\¨—'Ô@§¯{¢Ë@Ï-Y0k¤Ã@‹¤!’dHÇ@?=£dÈê}À߈ž¤.}<@ãäÏ~œeÑ@ÖÜÏŒnÀ»9)ÂÔî§@;µÇmÇh±@y‚—ÈÇ;Å@<û­—ݼ@mssŠzñ­@˜ yðª@Ó6͇Ó&Ð@JREþb@ÕìŒýÒ½@’e)~5Õ@k"7‡¿Ç@Hã/} ÷É@•qæJv£@ vðFDîÒ@ITÒ²"Ö@‡.s%‰Ã@–~Göž£Ë@ƒ§OEÑh¢@î™wɩ֢@ünó‹±@u–ÒÝÑ@iΆ\ž¶@¾,ªÍÁ@<, CÕ@$$ÅL˜‰zÀâü¦Mw«@.Vli…@¥æŒºj®@÷RåœÂ@6²ÓÌ®Ô@Ș¬U 3¶@y¤»ßf2¿@ŒEù±_ó²@@äM–¥@”–WHÿÎ@² OÇcÃ@qÍ]¿í@n Öì*VÒ@ühîH7­@µô›eÁ@¤8ÎûÃTÒ@XÚÙ…¢;Å@»ÁXôŽÇ@¸U6ebR¹@+Í^²™Ð@·”3e1²@­°ò³;pÎ@§¢V—@ã….<6³Ñ@iqSÙõ¬@`nèèÖ´{@RðÔ)eÎ@R[ìÒe¢@V…¨rê$Õ@‰rʃ˜¾@ª`!m!ì»@·xI“‹½¤@8ꌶŒ±@¹¶7hFßÌ@¯uM3¥Ô@mªµ{ fš@Ý"wü¦@²Œ¨‡Ö@îL•…ãѲ@µ‡Vݪ@ZFb hŸÖ@j €9Ñ@÷uàû³µ¾@-U…½@J#{Ð ÜÕ@5|®ï¤Á@hzn%‘È@Lx·ÉîãÈ@µèÅŒ'ˆË@0:èºÄ0Ô@–¡UdZ[Ô@Å Œk*¼¼@³ ­ ’Ï@œú'+4ÚÅ@€u—Z¾sÊ@5_÷ìq»È@³O©n| @\IN™ÇÖ@iÖñ!¥@6Aûþ€®Á@€ˆUV9l²@ ~׸ë4½@T,mp8·Ï@=`÷p¶@¬= ›ŠÚÅ@ÍàÁÌ@ ;%$­Ö@f†Xo¡Ï€À–AO.AìÓ@·Ý@»ôYÃ@bŸzØÁ³@¯í_Û¡Ö@r!ঠÕ@<ë÷§CÂ@Æ|Çix`@ ºAÛŸÐ@¨õB‡Î@ºpzgœ|˜@GΘ9sÁ@OxÚÙi!Æ@¸mÜ‚üÖ@2¸9ΚË@d’—R]ƒy@A];¿Ã@ÒaïµVø¯@h€€Œ£ôÀ@%NÝós+Ó@Ã¥=h0õš@EÐf@ÀÍ@=™HqO¤²@¼\P?„öÑ@OäZ2a&Î@]¦^ƒu£@(- h†ÀËå¤~!FÐ@ÙëeAÉ6Õ@… w%¸É@·'Çr{'dÀØKô•\Ñ@c›µz åË@3¤ñ÷vË@åaÍÅŠ ¿@#h3›fÇ@z¤£Ò×hÅ@Ô/{6N”@|î/RÞJ«@>ÛØp·Ê@; ÎðÞÕÐ@°zá¡Tb‚@jYðS2 Ö@XòèÃÎÈ@È¢y玢@Ð+‘AIÍ@²àôsåW‹@«jÆT6ض@€º0.5%Ã@ë‘‹MQ¸@Syf|EÔ@FP=ÛÚÁ@“Á›£É@¹ÌÞàDêÕ@ œo™¨Ë@Î=ÇwÌ@ÿ}YáÖ@DÃß±â{Î@T§žÑ„@30œ4Ï’Á@ª†‡öÅTÂ@ ¿~pÖ~À@‘<ùÁ|µÊ@„³ ’•Õ@¦XïÄ@p³›¡¼Ô@P`Ên':É@r<»‹˜k«@.ôËʸÑ@‡„e¬QÕ@˜ÓùT&¨Ê@üøÈ›ÝÒ@3[;¹¹@«d븧‰Ö@ ˆƒåk»@´4Uîàh¥@®óeW¹·@|$Âü`_Ä@ÏÕ8søš@ãb¦p„»@gø»3›G¨@õ9{OÒÓ@¶ü~nÓÓ@gðû6³«Ð@:qØÒS ¹@Û}AÏ& Ð@@ ’úQ~µ@¤Ò[$V·@¾7d·LåÊ@f!ßezÖ@#}˜Òf Ö@=*å…[<Í@ Úõ´Ñº@|Õ”±Ëø@”€>r Ô@UX¿þÔ²@QXû!˜³À@|b¡Î~Ð@ã¢ñßåÂ@á…aü|ŒÀ@_¹3‡»@«aúzúÝÀþ¥=riˆ@ÆRŒF0‚@Íªé‡ø®°@ò¨OcÓ@}÷ŸLLuÊ@Ñfˆ÷;É@1ÌŸdÒ@ÀR3J ÏÎ@§Kë^ûÞÄ@Duè~Ô@ÈA)j{ÛÖ@)@Ò¤„OÖ@GvÇÃålÖ@й0fµ«@Lн•—¶Î@Y!Ïþs’Ñ@’2Û©Õ@ÖØÌåÙs@¿!÷Wà'Ò@:rÆœÓÎ@ñmDà.¾µ@Áœ`¨Ï@ %çþ~Å@)$o.ý\Í@Ϲú­ÀÍ@ÔäÎ Ge±@PÒ|KÛÑ@ÄØE@~›@˜xláL½@E8rnÑ@Û Ò[Æ@ñ x’ˆøÏ@w3f¾.Á¡@Ê2kÿêYÑ@Ê׺C‘C¾@Î)HéÕ@¡@EØË@‹ È+™@\$´G¦PÀ¸ös@‰¿Ñ@R•‹{Ù¾Ö@Ú“ÍÎØŽ¸@4+zŬ¯@H,«…¬Ï@8IŽvÜÔ@`L™}ZÂ@dšñ݃AÕ@šÓ3;Ìs @4n\ߎ%Ë@KøTý=RÎ@ ¯6޲Æ@Ì©*(Ã@k¡xÃæ—@ñ~˜w¾—Ñ@'nRâÕ@Õà¯Ñ@}7I!ü˜Ä@U¤š¶%Ð@jÀV ûaÀ@·\Ržþ‘Æ@ÎŽ~ÓÔf¼@ k¡Y Ï@3ßX¶„ûÌ@ô3«§KÆ¢@©¦¶ØÐêÒ@ì:˜_ˆ@W˜éW.@ÌéÝøî}Ð@Ðæ iÏ^¾@D¤ã©nÈ@H¹,Ì@w›¢–{È@þÃ<ãoÊ…@1‰5Ì’Ê@ä€àçeÍÁ@„LaÿãVÀ@j¨ý·_ Ð@ÅMËÂŽúÐ@n4vfÈ@§»„»·@]µÇ»»@Øòž/l•³@–Ÿ½Á£ëÖ@źPlv0Ö@P`ƒfSÏ»@~—8F¬Ç@b3úäêÒ@~k䷉π@X³¡^±Õ@¢ ®ò»DoÀär4’¼q@ÿOŸÚjÑ@¶Ùf…)÷Æ@+bÞ+°@¸íO@]¹@0Áç¾µÌ@¦ûç‡&Õ@³–‘'f~Ò@¿ÝÁ !˜Æ@’òâ²EË@ŠMDŽ]ï´@ìaÍ1ï`Ó@t™®ŠhÔ@ß0pkúZš@çfZ—J¤¸@O:÷ÙòÞË@¢Š‚µá÷@û_âevÅ@„åì °@vT‡\Í@Êq]\€@ ¿øë'“²@tȳÅû³@_ži< µ@>ó“¿@Ó®±òïé©@”(˜³2$Ë@ÛüÀ?0ÊÖ@ß’¯±ô»@Íg?²…KÃ@nt³ [W«@ÇGpœ¯@…fžEÄ@²nÞzÑ@Í–U¯ëÃ@B;­ÓȹÌ@&|_£“É@è[ǹ¡Ó@·oèA´Ô@¼ +ù(d@U2cô»Ð@žb¬ÑÕ1Ô@³Ø*u¹@1KøÕç’Ó@án½/öÃ@HQ*·Ò@&xã©Á>Ó@*ºý²ÁÀÊ@n["£û˜®@­&—9.È@ÿíd a @#é´xÛ%Å@ÕöCÇÍÒ@˜‹ ë·Ç@!J¤œ'¡Ê@ÀÖLzÂÔ@®(`,Ñ@;ÄÇ«ØO±@š_*)‚Ÿ @ˆsh!ÛÀÀ@1ßöÉÅ@+ì¹ HæÏ@ؼϠ@‡Ð@@ü 'ØQÖ@†JaÎpš@à’­‰Õ°@×¥ ¨`ÁÄ@jüÁ©Ç@œ7Õ@mõÏ@5r.4ºÓ@ÚX&¦ãIÒ@8‡ŸÑ·@Ì0mcšÿ°@|šx ßÓÈ@*U›ÂgŠÐ@•0’BÃ@yrê ð½À@6È5\x“Ñ@Q4–òbÆ@“Rt¿CÒ@¬ÏR^ÒEŠ@I®á3ËÏ@j¹UýŠ@F“ߥ9º@ýœyøràÐ@D¸K86Ó@·Æt¥kÔ@OWx~ Í2@‚C•ŽHÂ@ßÍÄ‚²À@ž1õ Ö@Ía‚:€Ô@ÖØ—ež½@ƒ©NøY’£@# €©@®öÞ¯Ë@qxak£@ÊÉAþ¥¢Í@²pÚÿBå©@ì®ÇJÃÌ@ÈU/zkRÀô}ôŒ§‘­@Xì¤7[Ö@ªí-ŸpÒ@øïÚ|Ç@¿‹dÉ0ž@>\¦=æÎÍ@3îó¿gZÅ@¦‚¤ÙäÀ@øDã¥d¹@2-rã¿Ö@ôs¶„çõ„À*b=8¨@BÝ6ÓòÇ@¼lú&ŸÂ@PZ6pÂÎ@*n—`Þý‚@û^¸ Ÿ²@#Â÷t¢`Ç@²k:ªœí¡@‰‡hˆ¼À@`*Ö1e£@›ˆþdY(Ë@ßÖ4X\Î@äòQ¼H¸@Ì%_™2DÇ@Þr”­ìÌ@oéܪ×@ªŽQ‰u9Ð@Ì©x{èÿÌ@LÑÍ1ÁgÆ@ð,×úæ·@ZrT¶È@Õù:,®±Ä@àÀìîÕ@ZêÒ~@zÔ@BlC¦zN´@w•¸èE´@.mÛ¢@Ñ@íLœWÔ@ ¾îäv!·@4­$ËS=É@N„³é5è¡@¿ãàÕ@ znºÏoÐ@NÖ|…~QÓ@a}8 ÜÎ@^MIÀX¬Ï@AIè!«º@2—ÜKÕZš@ôˆ$±x•Ð@(7õþjÈÑ@@D¹ÐgVÂ@Ãñ9§ƒÔ@âÜ5™Ð@pýúJWDÌ@PÓuª Õ@|ÀýRÎ@.¿¾ŸžÉ@š«ÄXÁ@³9÷ÔT"Ã@à¿×¡üøÖ@ 6ÖbÙDÆ@°*éžëï­@m?-KÆ@ˆ¢Jžðf«@¯3ù`Í @µq4Oºµ@›—ÍÆ@/WÀä®Ñ@=.7tô~­@ؼT»è×@UncžGqÁ@~ë³EÁË@¢Z ܼ@Þ*cbH@!_4ÖņÆ@rÑ[×#ºÁ@è#Bú/•@ºãfõv¤»@âµ'P͘Ì@•ªÑæ,+Ò@Äã ×6nÖ@îÆ$®‡‘@i8‡åÅöÐ@ò–")ghÈ@ *‰±ÞÊ@ÎßZ‚-·@Ž›ë]¢‘@f–gVSÃ¥@f.Xº,‰@]ÈXˆé¥Ä@Åy¹¿Ì­@MÄ™ïd Ó@‡²Þïù&Ì@HÏ\/3lÏ@_ZÞÔyÔ@{’ Ç@¦þJÖBœ@ Á¥=²@@B¶Z­W¬@`2=ì…§Ð@B¼ØtÒ@žÚo¯À@^¹„57Â@ûÓòtæxÀ…—ùDÉ@°ìÊ%ÁƒÀj àQ¨„Ààò†YhÔ@Å+lü+>Ê@èð|–ôÌ@'מ}]_Ô@‚}ʘ–Ò¤@‘ò*ê 2Á@V–¡—US­@(edv >Î@E»þ•j³@ôsŸ7*Ñ@x‘8zÿ¨Î@5úIŸþÈ@7Lé·æâ¾@“ –àüÉ@~XV0§k¾@A0Xp‡£@7gë%1‚Ì@¼ ÁÐX±@#v6ëÅ@÷_±`Ë@.gé6DXÅ@ÌG¾|7Æ@¸G×j~À@#1Iþ¥˜Ò@ÌÆêF:¼Ä@¶ï Rƒ†Ñ@˼³—¦›@ wPL»Ï@Oê”l;äÄ@>šŒ|„z¹@Guå’³éÖ@#Sh'\#Ì@|IübÒ@/¾Ó [Ð@ó²8u+Ë@P‹$õÜ¿Í@ä0÷&IVÔ@½e€ Â@èX/õ;*Î@h‹îhCÐ@ÑÅˬÜÚÊ@»S{ ÀÈ9À;Õ@Xx¯gœÖ@ÜR+H.Γ@}PŠÆÚÕ@Lå°ššÔ@VÈ¿ÉË¿@ÛSp£Ñ@èXúi¯Â@·Ñá0Ò0Ö@ëz^Zç¡|@•?ÔóàýÂ@ÇäðKY @à••ã6Ö@>ØaÐ`ÿb@lì¸K= Ê@¯0°Þ­ñ¹@™tÖxǦ@ ’›Ø·e¬@ì@R«Ô¡@…„÷à’Ñ@{’µ &Ð@a»‚`ªªÔ@Ó€Œ>Ò2Æ@ ù‚Ô¼Ð@€‰ ˆrÙÊ@hmEmÈæÒ@¼äýùI @PîÞ†Å_Á@Ìãk±ŽæÑ@ì¼Z»U–Ñ@¾xBÿÍ Ê@-þ‰ ±Ç@˜—–0Ø ¢@b^ÍÔÐÊ@ +9Ǭ@(÷.¤õŒ@¤AŸ%¹ž@÷ºå3'©Ò@½)?KÛ|¤@@F*ìÝsÓ@~:3ÍTÑ@úÆZÕÜ×@«.?«cAÁ@­ó+½‰“@™Þ¾6ý»@Àó1¦‡óÂ@:)Êû3¶@æÓ’“V«@QJQAÝÌ@¸)˜ip³@-— š@óÜûGB¸@#¦FáüêÖ@½ƒQàFÈçVÅ@å„ÉQøÔ@hs^·oÇ@ðøæaGMÕ@Ñ’ÓÏ ”@ž¸°Ú¸@{Çê¿|Ò@§‰ð¢·„Ì@Í$‹§ÖÈ@\”ÅoÇ‘@#õ.TmtÁ@w?÷qr0Ã@î ¶Ð~È@‰¬LlÁ@U.;V¸@Æt~ªÀé¼@¬¬×vq·Å@–áü¤h!Ô@¾'ûï5Ã@JÏ!±…@ïõÕ[Ë@ ÇsîAÊ@ŸÀ-äÞÑ@¥îšê„gÏ@žb=yÎ@€ò-Ù­Æ@Íø÷œ©@  kFÔ@|Ë‚Âν@×y¡ $Æ@HjyGÎÉ@@U˜¢Õ@ξí–G!Í@ÿCÃyŸÓ@8‚¨mÇ@³<<›A&µ@) é㫬Ä@ŸŽ„ªÕ@"içÈïÐ@Ï‹¨IðLÉ@kB$«¾@ë!*Oõ¿Ï@©òÅcqƒ´@_™Äž´@À“3f˜@‡¼)9±¸Ñ@û®)£(óÒ@çÅSË@úq˜cÛ‰@Ÿ Š-@UÒ@¡J);]Ⱥ@^œŠõ`Õ@õôö(¿@[¹ ¿¾@(&]Ù|Õ@Éý¼x³`Ê@ʹíÁÃ¥Ñ@½¿¦t»Ö@½»¦¿£‘@‚>P.€^©@Pˆ0µ@á@7—ݽ@ù]‚(]É@²Ïa÷Ò²¼@ýû/veMÑ@¯/ ¼¸rÀ‰>ÆÎ|Í@­v½¾Ó•Ä@9Ÿ+›bݺ@Kvi¼e°@Õò’ÇÓ@4l†ÜóÔÍ@íoÀŸ¤½@ ÊÙ§eVÉ@J€%Æ@RQ£,PÀ@)êÒÎ@(nž¬Ñ|¹@;6Tÿ {Ÿ@ê¿» w½@_lUùž=µ@©oÖ½j³Ó@zzjFÇfÑ@sí±,Õ@4çÓÎEW›@¦§ÏÏ@ɸÏ4VÈ@¾ä)Ï”ã¿@ÖÌ:ÕǶ@[çSÈ@??\fÁÍ@‘V£]MÒÖ@aFîl'4¡@Ô".»¼Ð@:Œ!ÊCÖ@ Âo+·rÑ@§ÞöfÎó­@ßQ½°@Qí·g{Ó@@VIh´€}À‘ˆÎJ$qÃ@êôÒ±~·¼@¬áYÇ@w»\œË@\vÇ<|ÕÌ@þÕ Æ;“@Ž×-hñÄ@¬18±Ò¶@‚»-•ì«Ò@3«²å7^Ó@§ ÞqKÎ@“š#rQ}@ä+ÚÄÛö¾@Ö<ìâÕÖ@;P@zGqÕ@þ]âܪK«@›õ n6#Ö@ÊÖUà,µ@à—Í/»„ÀíÕÛizÉ@ŠA|æÄ´@ÄZ•ØœCÉ@>p@'êÉ@Íï¢÷¢Ó@ÐOû'§ÖÅ@ö¿b®®Iš@f×eÏŠ¦¿@@­zBÖ!Ä@.F  Sÿª@ùcâÈmÆ@ã„÷œuÌ@)|P*iUº@y8óå±·Ç@ƒ#‘=Æ@ÙYÿ»d`´@‘ÔItÏϹ@”ò¾y"Ô@;ƒ PÛÀ@Ý1µO`¥¹@ ·}4‘†Ô@q|TÝgq¬@ñ×^÷£@OÄ‘7ð<Ê@Ò÷u¯¥Ñ@Љ×+<­Â@Óp¸‹Ô/²@1 Ÿ›!Æ@ „™t“¾@Ë”Eª.Ï@+aþp®•@aŽös®lÀ@‘#SÍEº@?C>ïåËœ@ÌGs©Åœ@ûÊç”4I­@;)ù-Ô@yå4ðž„”@ˆ Ïy‡‚À¨À&™ƒefÀäµ/÷¸@á•·ÂÎ@¼ïÞ¿¸@Aüa®­@îr\Úž0…Àó:q×ÁÔ@Š%ò9ªwÑ@V:]ûÀ@¶Oä*ë¬Ó@!¤y€ß1¡@Ѭ—ìÍ@ÿ0JtÑÐ@Ÿ»ßC’ÄÅ@ûÍVY Ò@Ɇt…¸“@IO!j,çÓ@ðôJ@êÃ@£_GZÇ@‚ž÷ø‰†@Þ&Í@´@VÛsHƒÀ,¶)B…Ã@¹Ä†Ò(©@æ§þ\‚jÒ@§¦ÕT#Ð@÷:èÂ!¾@°Í u&Àº@n šHfÒ@=ñ;ÚU!£@, ÓhH@É…mŽ0Ò@ßA»FÎcÄ@s+:O÷g·@MÙ€y‚"Ð@‹á=1ŽÔ@’cZìbË@ŽˆÆ3FÒ@(á/£OÕ@ZzÀÄ@gx¦­$ßÉ@õ½@T`bÌ@&êáG¤@ÉÄI;žhÕ@QñœU/¯@šH›ÍÆ\°@î°ÃgÃ@k¢ÿÄ@2»ÅøÓ@ß$î^—²@bÕ°‡#•Ô@µ,5¥9À@ùÉÙø îÈ@R:¬€è³@ ZÄrÄ¢Æ@Њ% ÔÌ@.CÉ*„É@X'’xÂ@ãDDyªÂ@­¹OÎÇÓ@ï2•Yã«@Ü*ámœÂ@ç'>;×@ÿd×–ËÏË@S=CÓ@5PPêÓ@%$º†µ@žXx@=ïÔ@tª‚AT7Î@x„•ú÷î¥@߇’½Ô@Za²¾²”Õ@÷Í9é½@¤N´Ÿ¾È@N*”ƒ5µ@ÕÌžóYÒ@üAŠ—áÅ@6?ôÂ&£@÷\D %ÍÄ@s÷|óÕ@ª'˜GÕÖ@Š€'“0Ã@NO~’Ò@ø­”…ôÓ@&ës¥sóƒ@°ßFDÁ;º@Q²«“Ñ@ã °/Öp£@òš<ˆ¾Ó@•¬·ÌÂvÔ@8nѾÓ@è|ÛbäÛÕ@ÃG©)mÒ@ÔŸºöÁ’ƒ@€ÆãR°Ð@0ô½D–þ?è;ÍI‹3Ô@Ü=B¬º@´ÇïuÇ@úéJgþÖ@9@{¨+pÏ@vïï` É@‰X¤…Àœ< £€VÒ@žsQ7§šÎ@¬D³ÞD²@ø©ÿâ½@Æ„“°«¥µ@_8ëWHê¹@¦þ– 2ƒÀ<óÎx!Ô@Ãdžº|LË@Ás'9&¦@¢æ·5ƒ›@ÕùÇé$ïÉ@ÅåÓÖwÝË@­6»A¶ Ö@‰îŽÄ@æ>-WEÐ@wØjýƒkÅ@~߸W0»@ô Ž„LÇ@ƵLJÔ@Qe×zr’Í@›ÂcåS_®@kx§KRäÈ@eëó™34Ç@b£¢¼¡a½@„!&Œ9õÌ@ü²¿)œÈ@þVïS2þÓ@Ï6zX‰Õ°@F¬*pf‰ƒ@›? ÜNÏzÀ£X+î•c¾@ƒ¦e…®:©@ªbp…•Ï@çTò&§>Ï@_ú÷J¬Á@ê~Æ—íË@ˆ±†ž”¯@DâØWÂ@dZø-ÍŸº@ΠMéκ½@«Æs¦ÒÁ@Î!Þ¨ƒ±@.Ýífû‘@èB;ðÅ|Ô@ßÌ6LšÒ@¯¬WPØÂ@5X¡bš@r÷æS}~Ç@çÓ¿"‰·@NœXƒÀ@ŽˆÂR¡@eqízÏË@ÆöÞx,•Å@rqXâùˆÀàFráÒ@~±T‡Ë@ã¯ÉÄ\¨{@@åMgŠÖ@U©\-”¹@¡Þ-Ä;ùÕ@Ã~ÖH/Z@¿Â0æÊ@N+£mWÓ@œ€OmÓ@ŠàyX&Ö@ë³Áì6d¿@ZŒÝµZwº@çTa{“ ×@qÀÁ`½Â@7^“%>Ö@»É„Á¢@âÊ©9Ô@Ý§ŠŸ º@ÕlgsŸº@PôØÈ³$6À’k’ €Õ@ºt UfuÁ@\™”: :¬@\þåxÓ@à;\>Œ[»@ÊìúJ0´Å@¤}›ÍwÆ@snk“ ›@NΖ”¦ÑÖ@?"dgt@W£ù©Ì@Ï€K››Ô@ Œýˆ!Y²@™#­Ô”»@pŽføA2Ç@3+´ø¨Ñ@Ô V<ÁÓÓ@• EÔeKÒ@¯o^@© Ï@)$?±l¾@P< T°þ“@ÛU£á·Å@ÁÌàËÄ@æ,ýoÀ@ê {qšôÌ@¢;G~ÕÇ@³6‘è ‡Î@2–½-Ó@rÓ˜½@E½Êß9eÍ@{åÉc°@dž »[.Ì@5,O™”—@n >Ò@ê§ßåHëÓ@›^rƒæÍ@{Q êGÏ@còÓyÇ@ò/Ñ@>ûµ´ÖåŽ@}¸ËˆÐŸ@WHÔ(ˆL´@VGÉ¢¿ìÆ@Ö¬Ÿ¥Í‹@¥ƒÃA L¥@íô½<Ö ½@˜³ö¹TÏÄ@¼{ãñx~†À—328E½@;S7-qÎ@_×$roÖ@pp±zP&Ö@ÕU,ñ ¯@É^È ÂÎ@õ šSmÎÊ@`«bKbÍ@Ì J`¡Ð@V‡È%Þ©ˆÀ1Ú“²~ìÏ@ ~]v÷ÛÖ@GÛ®eÖ@Q`&kiSÈ@-øÑ"ÿÔ@€Ø‚žfÓ@BÇgýÜž@ß\©…~·@“!µŽzÀT: ±CÆ@`‘§dj¬@ø=>Èz Ð@(,ɱº@ƒH)6 œ@eã·*‡$Õ@ \Ôc'ŒÇ@lÁÌd Ò@´ÍýŽÐ@¾¤îúõÂ@ 3?°­Ð@E°+É ·Ô@` ùzªÕ@§/3„1W@ÄR“ähÓ@eÖtŸÝqÈ@÷±‚ÖtDÕ@(Å€(ßÌ@XÊœÃ@à×Jû €½@ Ú’k¬Ó @òo3ˆ5Ö@éâø…Ö@@MÖ©‹Ö@Ó»À¡K¦@VAN¯UÈ@¾M Õ·ÄÒ@bÁ ¿gÇ@†â1VòÊ@®„i%fÆ@âÑ$÷à@>NÙ|k×§@úàÙ\òhÒ@0:Ò!µ±@¼!p9GsÆ@l5"Ñ¿‘@g€”ü*{Õ@ɯÄ¡ÆÐ@„„(J¨†@3MÒ”ý¨@vÀYÚî«¿@®¨Ý?*Ò@!Ë<‡Ô@ßµŠí·@Õ ÙÀŠ€š@{ð¿wL‚Ã@>àü *ªÖ@ì¿Ò"UŸ@ƒ<÷çH È@ŠL È´@ìPjEwÙÏ@T»´•ÐÀ@ c]ÙS™Ò@PÈ,<‡À@ù+ q­@Æ@X©EÑûøº@Cõ+Èo™½@Ë+Ê5tØÅ@I&¦ ÍiÓ@xê¾Íþ†Õ@ Uå 1'À@Û.,Ž)÷’@{±Æ„éÔ@åfÜß+Ð@å(Â% LÆ@‰ç_L¬@òLåØÒ@±Ò©}]wÖ@"íêHŸ#Õ@ë ÍãÜÏÏ@sÿ ’J¾@VªÉ(€ÕÓ@KË£ò<½@ÐíazbÕ@¢œÀhÙ”¶@{I¡Fã´@ÕÀÚóºDÓ@ˆt±k¼Ó@d7õ•èÆ@8AþVÁ—Ó@îýAo‰Ð@—c©L½@ÜÛ “€\À@æªê&”Ö@)Ìœê»×@RгúÍÉ@,RU–Õ@ðõ6þÍ@e>šAç´@Ñh‰È¬@tÍ ü½.»@}3:R\éÒ@èNWè1ÖÔ@X+MÃÕ@¸2$åíÖ@Åë£È4áË@`^ ¸TË@ ìØº£…Ñ@pÝ’Ï—Œ·@+ÜeÓ7ñÕ@¡J™±¨…Ô@»CÉBžóÐ@`P˘‹@¾ýšÆ@ ŸZ±‚ýÄ@òŽRçÁÃ@%{覙wÀZó‰DàÕ@*ø‚@WA¨@[ÔvAêÓ@$cö}ܸÕ@³ëòÀ Á@€z÷Ô@½5uC*rÀ*ð!a•tÉ@B=4]Æ@뛟Ö"Õ@W¤Ð§yÀpU4›$Ó@8šó\LéÌ@´©&Ü=@Ê@?IUåñý­@Ÿ¬ù'˯@±M‡…ÆÔ@ò~Wüw¾Ñ@§¦ÓÌ@}ÊÙ^ý@X*Ä9èÏ@ZxFј¾@HJ€™Ç¹@j†­@ä´Ó@VmÔ^^wÈ@W¤½o¤Ô@-’éãCÖ@ˆ}Ãh*¤Ñ@)€u‹G¥Ñ@ö^ ³¸@Ã4מmÄ@H Ôò#‚@L1ãì×sÁ@‡†³b[É@á½T)ÔdÀb½² Í@æEòž*´@9I¦œcÉ@mÉ\2}Ô@ù ¥à€ÑÓ@¼–eÀ@°¶KäõD¬@­r¡cÓ Ô@-Gp>½@p‹[M ŒÀ@Ñ»üC´¸Ð@ê4ˆh”Á@®ƒ×QòÓ@„ï y¨À@‹ŠðØ óÅ@YôwÂuk½@„µÏ¿¦ ¿@ûƒ!(ÞÕ@¥-…7¸Ö@ÀôÊ@œì8Ã+³@I)]\z²»@8mEÕ@åeí¨Q£@ää¥J¶@ú {K©òÁ@ø\Jñ7³Ð@~nÙº&¿@µ›o-³@¸Õͳ½@Y›ì0 Ë@ô€¾Ù2Ñ@déÂ>@nÑË;EÊÍ@@|pЂ½@rµå’£@梞#ù¾@; ð ¬9Ó@½æ€É"”Á@”E8¸GÑ@Õs%p1Ò@܈šÀ¬ôÃ@ϓ⺃ÏÕ@âdç&ºHƒ@ÝAà¯ë?Ô@*ÏI€hˆÌ@¡ç[ìJ«@èž’Q «Ë@§#'qT²@æL”…Ö@)µÌ`*¼Ç@)Ç—ú:ŒÁ@ 5Ga7P“@ë}…>7É@‰ÃLtÊ‘µ@?©» kÅÔ@Ï‚ço?ȶ@‰¯´<Ï@Ê[»âÇ&¹@|ä¢Õ|Ô@<]ÜèßÄ@o©^MòÖ@Ôü9é©@<>Ëé’»@¢/&W¼@ŽI׬¬Ñ@Œ".U™{”@÷.¹šÕ@Ùm Oôs£@[ZV/÷Â@œ=Ä_ ÃÓ@r!ÌbQÐ@_“æ¡Ã-Ð@k ¤mþÇ@>jw-’Ê@4áO£8Ð@{ÛWàÎÓ@P‘<¹J@Fæ`ö,Á@†¾I–¡KÂ@ôéO én®@—(¼RKxÑ@n.̲ðÀDÑÕzcÕ@ÆÊÅòpVÓ@ºq¥Ìº@ ‚<™H0Ô@ëSã\+Ô@W¬'â×®@Öª‡ˆÊ¿È@' Õ÷äbÆ@1*ÐèÏÐ@dm˜´©ªÒ@=:w.XºÆ@å0ˆ†¡@Ò¹u”¶@UªîxÆ@ÙÇßÈí²Ö@wòým Ö@š³5çÉ@¡]ýÑPnÏ@ú0$B—÷¹@æ§“leMÌ@x E.-þÒ@»°Ôçͳ@›f jÕ@€©Oà˜Ð@ÎÕoâMRÄ@S¹>»³*@»òkÌ©¡@›¿]½ó÷Ó@NÑøÅiÔÐ@dé¢d¨«@ÄÖÈ*ï“•@…±µ[…Æ@vDk#H—Õ@å¯$ÐË“s@"yR©¿@ºŒ…ïªõÔ@ÚV'ykÍV@3ji³mÒ@:•„¹¤Ï@¥uRX,Ó@àÎR€Ï/Í@â½ÕÉ@/újø©Ö@ð"ïu§@ÐÁö#JÕ@‰ýá[µÔ@ÍQ’ PÒÊ@æ˜ð;&Ï@®ÙøR[Ñ@Üš(Kž@»V´‚ïbÀóÀ|7¡ÇÉ@åq8µÏ4À@Æ` ôÃ@hp«¦~ §@SËl¬×@8pµ_'Œ²@+ÚÚÔ@ˆ¢£Dö¦@BqgckZÔ@¯Q-ÌLZŸ@ù‰Œ¼èÐ@×`^šPÖÂ@­µ Gkº½@ÃæT8´Õ”@t¶3åîsÂ@žñ^`#Ð@á² ]Õ@è«Ä PÔ@>y}ǰ¨@ô™éV£Í­@§ÆËÚ·Õ@ƒŠê)Šü›@¯åcÕ´ÂÈ@Þ9«6mÓ@ÁE ¤ëMÒ@ˆà×7ãÓ@ös‹ðßZ¿@ÿ…ÂáFñÍ@ï(+ ¯®Ó@hV.Ž¢4Å@6€‡\Ã@‚Ǭ-c‰z@È.fSûØÌ@ôE° 1Í@¸~Ø7HÒÔ@àJS™Í@ ‘ýÕø–@ZÚæ-î0³@³ÉÊ/Ù0¥@^ݯ\pÆ@Ç=߸Î@µ |X“àÕ@¢}Ù/Ë@Ù?Ð#ê²¾Ë@p¹eç”Ë@Û•¦ôÐ@ïkëšDÖ@ßì BÖ@WÐýX§Ãº@Ô‡×ÒRž@Ä:€}tÃ@D“­V· ‰Àð[Å»¬Ì@îÌôáƒ&§@v7Ô&Ç@û»0~^×@ o.ê¦Ê@3ô¾ëžtª@¨/7·œÙÓ@=ª¼îm“À@EX¦ùsõÕ@ !HÿSûÆ@Sð&q©VÖ@Í“èÜ¢dÇ@G KƒÒ@œ tqq¼ˆ@ŸBô§u…Ö@‘Éq°U]Ï@žgÏ~ÐSÄ@€‚ýÄé¡@Ó3!ö¨@ Œöº¨Ç¾@DåHrþDÒ@¡JñÙ0<Ö@7hÍ`°óÍ@ä¹ñ¬Žµ@ùN<éë9Õ@uZg}IÆ»@ݹäs…À@IEïdŸìÅ@ÂÆFü,Ö@ÏGõ±@¶@bÑç¼²wÊ@©qPOÉÅ@Wï#èy@¨Þ¤þ9·@ù@+eUÂ@n Â4Ó^ª@ûÅ_’©É@·bÿÅÖ@eâ7šº@ ýÆ¡KßÍ@Ùxö_†Æ@*ûLX“@>è…l-уÀÜ‚©ÂÛÔ@:ñÍÆ@ƒ—Eç÷/Å@‰§‚Ò¦-Ö@Ð&ŒOÏ@N|ȸNÊÑ@A­¸pÒ@gØ,Ù @PTH!Úš¯@\‰ú›ÁxÓ@lk›–GÁÉ@xf%öû^·@àå'g¿l°@22,%Ø´Î@pŒï[¾@(ÚírgF®@-P‰`‚Ó@&w³T‹°…À ëžC6 Á@;¬zµ¥@˜Þ«@>¼—p8Ö@%¨Â aéw@ü¦Ð.Í<Å@“YÆXéÒ@à KœEÒ@r\žË¼Â@0TÔ~f½Æ@Ú.;jNÄ@D×åPÕ@~÷<=”Ó@@µL¾@û{ ˆÍ@wmG÷ÅP@wû]fõ±@4y Há’Æ@©jQ«¼Q¨@ážÑ¢VÓÀ@ÑðJä†Ï@F½üË™Ï@ÝEzù*Ë@"~CýÑ@ò82¡Ù¸@´ZÛ9Õ@²}úÛ»Ô@ðD%rºÖ@D%‡§ nÒ@MõåÁwÎ@íè`fkëÓ@—…¬[E”@9/hg²ý¥@ )äL£¯Ô@íYf\›€@×kê9î£@€KaOÓ'Ê@¿â KžÈ@J¼B;\²@¯ºƒbãK²@*rÜ9í×Ò@Ç] •Ó@ÎuÞsT²@=Üò–‚À@Tn”ØÒ@ßáØ`yÇ@0ú ÚÐ@SòjRH±@ØÙïÚÒ@vÞ/îëÖ@´?ÇÖÄÁ@d_©3âÕ@U&àFA³@BìêeJô¬@ì‰9o¿ÐÒ@Ø—™N•+¨@ùg{Š·aÁ@òÜ1‰OÓ@•#—qÒ›@vß>(¢)Õ@Û€¢QÃ@¡b§laRª@Ýçê|¥DÄ@¼féFÂèÖ@:l ïϧÍ@ÏàU“§óÎ@}4¸› …½@8?íj©VË@ ­X>¦Ò@ŸæÈSvþÂ@¶Æ}À@ w*à_Ð@|$4m×uÀ޼yn–°@¿Mfá§Ô@n`ê/IXÏ@²¯¡fÑ@þœA6=Ƽ@6ëÔ_…á@´I%DÜ´@Ùä‹£Ð@w7cë_²Ö@Ø‚˜­³@%^ºÍÙÎ@ûÙϪ#ǵ@bÁ­’þ„¹@pi\d»ÿ˜@E‘–Äeµ@ÑÍåòÈ@à+ÓGeÆ@ùÓ­‰V¿@äE-‘@< ÆX×@ÑE­®C£@2ËF0(SÈ@O¹ƒ%1xÆ@»?pÌÖ¼¢@w¨ )Ê@6Ŷ÷\ôÀém Õ Sµ@±ºøŸÃ@‡’ï È@©z•÷BË@k:Tð¤Ò@eb| ð™@*vÙ߽ʞ@aÎXŠ'ÞÑ@€[Ó§Yj@­«Æ ÆÁ@oÙr6xÊ@U«ö4†Ó@ûæ¹Ü˜vÀp9¿J4¿@>•gR<³@ƒ±ëª@Ãÿé¬Û\´@­´Hui3±@¼þ zé¿@¢Ö*§Î@œØ”–©@coÄÄíÓ@c)— ­@¨«=äÊüÖ@p´Ûñ€§Ç@<>õ^ß¹@„y˜^Ó¤@žŒAš&¡|ÀVŽýHÛÖƒÀ _¶B8f´@eh·Uõ¼@e$²L7>Ð@Šön5äÌ@å¹oé Ä@OéÃÐSçÑ@$±q¢ª„¾@û—‚ÇgøÖ@•q³ìÒ@:ä Ðu´@Œ}v~þ]Ñ@`sP*D1Ã@dKŸÊº@¨È‰¶½‡@*Ï·»¯@Ƨ¢V<Ëš@=îûÌÑ@L¾Õ 8Ñ@ÒËÒ®Ø;³@ÌÉÔß8v…@ê@Jm¶Ï@?òF @û¦@¡É_Ê@H„÷¼#C‚@Aì²î¥sÐ@€â@‹Ë@ÐßP:¶@aû/e²¼@PA«Ò†ÖÒ@Ô¿Þ{0ˆ@|çaåZ4Á@åAßi‰Å@DBˆvÀ,Çh>›@ó§7Õ@üDÖ¬^w“@=™¢ÄÄÉÍ@»D^‰MÕ@J¯êÉ@ÞïDÕ@Pñ{Z̨@÷‹ånïÔ@yVÈòÑ–Ñ@¯~<»à‡²@.(ôDã¤Õ@ 5Šlå¼@‰/÷ aÔ@â&_Å@žcU½Ve@ ”'$9,¯@3(Y/“·@ £cIÅÆ@ˆ‰'€GÐ@çý߇hÚ¸@îíˆÛÕ@¦Ô°äyý®@‡Õä8 ˆÔ@ÖR%¶¶õÕ@¢LÅn·k@EjÝÉWª@ì|YÄaÒ@8ГFµ@êµö»í¶Í@b¼ÄA-|²@–MèƒP¾@’—Ö€Ì@~•u¶GNÕ@>*äá<@÷gå¹MDÖ@2¨6ÜOÍ@¯é’ì¯@³o#«3Ð@Tö4ÏÉ¥£@ô×PGô“Õ@¾TáXÜ£@$¹”3å‰Àv:TVSÓ@@¥åŠ©Â@íºÈ´Â@ªK_z Ñ@Œœœ¢Œ@;ÊùÖz:Ê@¶žš‘›Ë@Ê¿5Q™@¼½)ùÝã¼@à‹$ªyÀ@hA̹PÐ@ŽŸ£1ÎÖ@2ˆââÏ‚£@ë„Ö{Ñ@5 ¼¦Ï·­@Õ<‹•ËÀ@ЬÔYÔ@¤¯Uña€Ò@˪Ð7Ð@U:p,1’Î@;Qn4ÖÌ·@^´­ß!KÓ@: 쥱†@i÷°•È@¡:ºæÐ)Á@(Ó–žI²Ñ@Þì G^ÑÓ@Ž"|&QÀ$Œ® ÃÄ@µ³XKª@gÃzÆYÁ@<×Ìõޱ@šXâ+^E¶@•’PÖ¹Ö@TsI8OÌ@š& »§7Ñ@›Šàn_C»@ÂîØS$Û‚@8tΡÃ@ã7œŒ1µ@ÿ¬:Œ5Ï@'œ)´yîÅ@$ºéÐP˃@³3­8ÁÒÀ@ÅÍÙ†ãÖrÀv[áÒÙÕ@?ÝàJ«£@:}4h;Õ@.ý7¾ø¸@|ëw5‚Ð@"ÈPÙÈ@ͽŽ5Ò@gXgü"ÍÊ@+Ü[ÃrÏ@»çáZIÁ@Œü½æùÁ@¨qÖ£/Ó@"²¾E΄·@|â  ±@²1½ëéÎ@J;ýËW @g_¾*„ @Æâv—@û3Lë§Ô@Ç1G¡î¤@˜†"Û2ÅÂ@ãŸõAÆ@rïÖ?Ç@ÛÍaô;Ñ@4£AIÈ@ëûyØâ;Ð@5W<.¬uX@<í.8Ï_“@¸WUVó?°@U­ µÏœ¤@x“qÉâ7È@/+¶‰)°Ð@Q¿'LôçÍ@áJû‘¤Ã@"WîmÕº@"9áVƒ`½@»Zoc늳@뜽ÓxÀE›ÎÏÉëº@ªÓ=…ÆÂ@ш›L†—±@Ke톺@‘W,£üo¾@£¹ýeuy²@ÍfjdäÕ@W+É!v@™„òmÎþ@™£öçœ@]sí¥ã´@Ñ~Š™Û~Ð@Å_®H,Ð@GÏôæø†Ì@“'9Ä2!Õ@Kf:†Àõ¶î,Õ|›@¥Àsù³¨@˜«â˜þË@<Ûœwà–@'Ã-6³¸~ÀÒNPʯÉ@D…ù´Ä±@/µü[i½uÀ6jŠ2 É@Èâ„ß…À@Bðv¥ßÓ@7[)«9Í@žqü5µÔ¶@Ô¢[‹ ,Ç@SÆND){°@K27ZÒ¹Ð@á‚Ðôº@݆ç¢2¶@Þ¢7ã¼@ª2ô0"²@J°F­áE´@)jP kwÀ• µ»­%¢@.rÈÃ·Ê «@·`UBß#É@fTî¤Ã@=N€Ý^¯@Oü‹¶ßµ@b_*&ØË@qz@w:Î@ußâMì»@°ž²ŸRÀ@°gïÆ> Á@õ΂R?Ñ@äèÃüÔÑ@h²§nþÀ@Úpiºô»¹@]c.ôr¿Ð@¢äˆBÇ…Ö@¶<ÕüSkË@öh¬uÓ@HhhXÐ@l¯u®z Ã@Ãß¾–±@ZNÍŒ½Ã@Òi=ApÕ@Vc—k mÀV[é––K»@tNÃË@L`ìXÞW¹@H#-ê ×@?$ù{„ô˜@fÄZ‚7Ö@c]‹›…™¶@¼2•ÀŸáÓ@×'‰Ä{Ô@pf¾ÆÄÇ@¶*§‚!ÌÓ@r Ÿþ¯ÇÂ@y×òùÓëº@¥Ž7‰“%Ó@Eìm¾AÀÂ@ùš ýàŸ™@Š£~ðFÔ@â_þ¡‚Õ@¶qd_Ã}Ï@lÞ¾æÝÐ@É®Q?–£@ÅÃÐÔ@œýﲚÖ@ÉÕ\C^IÕ@¸‰ùöŠÓÌ@&.ÙvVÍ@«±0v„Î@ÐQ,TϬÉ@€ôꬿëÔ@^š™sÕÄ@)¡N;ÎÃ@­».‡¨Ï @‰Yw>öÓ@«‹p5èÂ@õÚÂ?B—Ñ@ÿ¼®hŸXÎ@DÐÑÞÌÆ@ñ`êdkÒ@IýÏ…ì¼@òºOº= Ç@e­@´¿Ñ€ ¾@ã wte8Ç@¦±^¶lÀ@¿Â;bø¿Ñ@¨u¯ZÉøË@ó=CZv‚Ì@­ÿv‰L÷Ê@=šö­CÒ@Ò³-Ñ@`KãÓ0@b«$· §@iÇ9ÖªÓ@¤¹j_ôÄ@îL—ùK{Õ@ þç¢]Ï@:s‚4/ÒÈ@Ê`‡H‡«Ã@7 Í)LÅ@å½ÎÊ‚Ï@–ñ‹ÙH¢Ð@¼å—ÐÎ@G MüÕ…À‹ûÉ©T‹Ö@ÕõéÿŸ¢@8šˆë±Ò@s‰µ«#¹Â@?¦¼ö†Ð@¦8U÷Ê@šêÂÒ8aÂ@8}hb3n@RñCäeD¾@øã³¡9aË@mªžg|Ò@£Éjëbp¤@ËnžØrw@ò[G eËÄ@¡Ü‰÷-ƒÐ@«#‡Ixg½@­ÌóSÒ@±JÕCoÂ@ùæ´êÔ@ãžýhÒ@C ÖÞlÇ@ ÒêR-à¾@ãE›sgÙÃ@ @À~ª@pª{RÒ@°'RÛA»@”yB•bË@:±ç0î²Ï@Ñøeƒ@Ô@•…Æ´§ýÌ@‡åõ‰µ@Y‚œ-Ï(¸@­h [fcÂ@МöQnÓ@á”°4êw½@©ßˆ&b̾@\avÉɇÀ½huÝÐȯ@6ÚÍ7PeÒ@*~׈*ÁÌ@$¾§‚éÞˆÀõÉjÅo±@7žä#Â@ˆ.‡å‰QÉ@c’›s`À&—èk¼É@É{›ù’ÙÓ@!W àH5Ð@™=áÒOžÅ@Øñèƒj±@7æs®Œ´@V«[Ž!´É@u.O?ûÏÊ@Î3bÛ»„Õ@Ûô8ýårÈ@ª˺|É@„ȵ ®Ë@1Ç  é¼G@Þ™×Zó/»@E3¥¡&qÓ@zO_€~É@ÆŠnìÔ@ì+ "‹@ó¦>›¯Ì@Ô9ÏZèÆ@”àP»íÑ@âidÐPÆ@ÁE¤tA{Ñ@sóÍð)Å@۲ͣ4¹¾@*b62ì9Ó@p> X Å@‚ÉPÎY_›@EÎ vøÆÐ@ÐÎ+Sʹ€Àìz|}–«@ÖÙ ¶3œ@ˆëÁ@º±Áw$¸@*FHKÙç»@ CÛæÛ[Ñ@]Y–ýL”®@ y¨S×Ð@õ•ÀPr¶@אָ­}©¬@TÃ’ªzêÍ@±·ÊO#§Ð@Á&›ôÀêeÀ0å<%g²@¡@‹'L¹@@ Œæ"É@Ú¨/|Ð@ÕÀ“  ³Ä@Y#­µ¸Ö@$ýNànÒ@.˜{ò׿Š@ä¯Ï°YÊÉ@Ö]\¯mÖ¹@ã ©-,µÏ@s') éµ@þ¡ã.\Ó@·DŒáÐ@m¥¾¬yÂ@Ñ•dˆ±Ä@0ƒ Ûû\Ð@¶âàâñÔ@è·T»@³ ZžÐ@txZþh¯@ö-ƒ?Z·…Àöp^*­´@2—„(uC|@s"H›°@ôQÅQ ¢Ì@…¾€›”ϼ@O•rº7f“@eÙwß’Ò@§’ÖtYèÑ@ð4Ur jÀXvà[ÕÄ@Y@¿Z÷@Á@!1ùeFßÔ@H¬F‰ØÉ@Æ„È@„b1ÍPÒÃ@4¸`R(®@•“]7|³È@äì³CR¡¦@qî‘¥d»@Ng xº½@Jë‚®ÙCÅ@Åk¬5kÖ@V«Œ5¤Õ@ømÜÍÏÀ@$c³9’‚Ó@ÔË©ÂlÖ@Wÿ ©Ô­@Añr‚ñÒ@À[õ ôÆ…ÀAÚ”Ô÷âÊ@þÕáßLÉ@Ô2543´@D³ø{Ë;Õ@pÙqá§Ï@*†§ðÆ@l×måá~@CUÛ$0³@3AãÿSÇ@K|¸‹/¡²@Ùj¤ùbÈÓ@hÍו‘@ÖúÛÙÂ@žU"=Ü>Á@(ÿv—¸ ¶@ÊÑ>`Y¥@‘çŒmÆ@0’V²€‡­@õÇ¡Ÿç7¯@ê4ШD¦@ŒUÑÀ/|Àäm€öÞ#Ó@$…Ę”À@@•c/vïË@lDZÑ[ZÔ@æïá¾Æ@@¹ã:à&@¶gÄs²@!FÔ:èÍ@æîÄ$‚Ý„Àiôt™øÉ@ ŒÔ!ä.Ã@9”Ð@µS 9­¤@ÌÜÚòÀ@«J^0DÐ@n²šsø“@å»ÃD}@w¡³æµ@njCÓ2Ó@GóÙ Ì@Guø³ÉuÄ@ê{#ýÁÙ§@…FDzÔ´@†…ië…D¡@²~šôxÖ@ vM{ Ò@ŒFÓ‡&ºÊ@žŸHg§¢@Ï:â ÿ°Ä@úÃÃ^í¥@q[øJ¼È@I63Ã@héƒvÀ•VshÓÚÕ@yLƒU@¡£zÍý‚«@JÈ4»¥W§@žêöåiÀ€w¬“)ÑÐ@,œÀ ¾Æ@Þ@-!°@tä‡Ü¼ëž@è¿w­\Q@Œ-1å1»@ ø _°Ó@ oKÖìÃÓ@Ýã _²Î@ÒOú(I‚Àƒ*ïC3ËÄ@GV¯PmÒ@¸‡]ü­Ä@;wf½] @%V²z´@::ÓHÀBÁ@}Ú!÷¶È&@Lð)î’‚À?¬T62‚Ñ@ó„HU Ì@ÊÔø€uŸÕ@ŒH=F¯eÏ@VCʪ!ŸÐ@•¢Ãªû ×@Û_ðvÙ¡Æ@š@ر“jÓ@/ñÇÂ4_Ñ@ƒNØ•þÀ@WDjŽó”´@àÄ`˜Dð²@ö«yz™PÄ@˵¨ÜH8Ö@©æ˜‡~ó_@˜aaîZ`Á@ËfÇ69Í@Ƥwµ@§ê'`Î@¹‰7×[Ò@ Éì®K›Ð@¸~Æ¥yAÀZ ¥2<‡°@.Ü5;6º@Á…3/”>Ó@•ïM%nˆÓ@ó/òÎSÇ@˱  ô¹@òM 1¤­Ð@ЏÁyêÊ@:WAˆÔ®ƒ@ ¶çË<Ê@i‘H>»@y½”&¼ŸÍ@£vCà*Ò@Þ¶¸àb·@ ªïáÛ€dÀ¥9*öEPÔ@@w£·@³ïhpWàÔ@3ïqBJ>Ò@ohƒyEÁ@©˜W;·»@Žæ“¸±ðÍ@VDzh86Ó@®7ҖάÑ@§.b*œåª@§e'd—½@¾NV²§Ñ@«Z“ Ç@0à+綘Ñ@¬ŽLÿlQ@I±îr Ô@+Óïî3Á@‹!ò:{kÄ@Ä1ÛöHEÒ@’`ëýÏ@ϺôßÙ «@Øý*ÅŸÔ@J¿-öòÕ@‡ÈIäLÕ@îBgêpTÐ@, Tq?sÑ@\':× Õ@ÊYp¹Ò@BuŠ^^Ê@˜üüJžÊ@oÁ§ùØÐ@ãÚcÒ4Ó@‰eã·-Ë@BQO1€@tc»Fhûª@ZâŸý“!Â@r>OzèÊ@uW™Ä|È@+ÄQ*i“@ØJ(ÊBÉÏ@Þc˪†ÀÆDïÒ@´"lõ°È@$ ÉFÏÕÆ@›‚8ïÔ@s‚s§Õ@”˜†wÓ@C+>Ö[ŠÐ@ÐïD0”´@þÿ€~ñÁ@Ù¡CrëïÈ@±ÐËŒSÁ@{KãÖòÃ@H‡È/p±@âT‹¨®@ Áïº9Å@átÔ@3¶†»@^yÈš«@Ë)¥o¢’¤@hpì_œ;¶@^y {%»@°n ¤r°¶@ß9$±óÇ¿@]c–d|Ó@üüЩŽÅ@4foŽ’Ñ@ÓxÈp°Œµ@—]>h÷Ö@íœÊ±%¸@ÄZ½qÁ@¾(Ö‰÷Î@—”ˆädÔ@¦=êWY$×@¼y6©Á—@_ê0‚A°@ù‡­Y Õ@¡cÕ² Ê@ç-‚qÓ@®fÖ}A;Ç@Mg¨²ë=Ô@ÆÈ]ºRÒ@Oñ“3€@”Ñ3´$¦@'aµ°q¨@D,Ͷ—ÒÀ@J?}÷ÀÔÐ@%·`AѧÐ@Áê[¾@XBŸºàzÐ@¼;/™‡Ô@ •6>0Ð@镦Y'Ñ@@Çâ˾@ÃAĘ0÷Ô@îcœ1øÓ@Z ‹œÔÏ@Î8C÷}À‰ÛÖ H©¤@³ZrvðÓ@¸lo³mc @x'{:ghÏ@©L¾z¥²@OåœTÛÃ@¬£¤[Ù¼@cF-_X@^{èa™Ê@ÐþÜ_‡¯@„—_cÜÌ@¿41åéÖ@à%îàƒZÓ@Ù7ýgmÌ@Î2"1ÏÏ@¦ã¸\¯þÁ@.{OܯË@DáÌu4¸@Ç®•%b#Ð@Aè„€Ó@®¤9ž¥À@ËäF›ãr§@ j¤+È@¡`j Fë¡@ÿ¶Ñ¤^ËÔ@Èȃƪ´@ƒH+3‹V°@ªPíeƒ©Ö@ʪ’^ýæÁ@-Å¢…yÁ@n»\i×Î@9FðTã®”@?~%Ô‰Ô@q#3¤@»¾¿Ë«¥Ä@¥·z¶M¯@ÌpBbE_†ÀSÝz–âº@~!?WžÖ@PLÔòˆI”@§ja.šÔ@x´N[*®@l½gf;Ð@Žõõ!Ë@o#AÑÀ±@¶5Ëà:Ä@úž“Àjj@àc$ #Ô@^ަüeÇ@œ2y/Ç¢@nø Œß¤@\?~†ÛË@IîâÇaÃ@ì²”'zÍ@?…ŠpÚË@ðUæ†}Ò@øÿ R«´·@Ü*`$o§É@Í@¡<,ÅÕ@÷œ0ûÔ ¯@ND±²ë~½@'•5­Ù°Î@8{Ü)¬É@wp=9vÕ@’Ï×ú[mÀá%¸aØÖ@!ãs;´â±@~ 9º_tÐ@ÞÉR¸jÕ@ÑB =\`ª@_x‘cù`Ó@ßX¤¾åÓ@sÆ!ÆŸµ@ÁÒìä‰~Ä@¬`ó5ùÂ@öE«–¶Ä@Ô¶ʇµÕ@HúçV©§@¹eD.ÒÆ¹@"ý?¬ê@…íXÈTÄÕ@lð°–XÂÁ@Åä<}rå§@–É*ì’@@a=‚/—¶@ •šä­º@}ÿ\2ʺÐ@„Ž,€Nýª-ù,×@ºp§È,ŠÀ(ýª-ù,×@ºp§È,ŠÀÂ?ôÁ€N  €@ €8 (€À€x H€ @*€¸ h€ À:€ø ˆ€@J€ 8( ¨€ÀZ€ x0 È€@j€ ¸8 è€Àz€ø@ !@Š€8H (%Àš€xP H)@ª€¸X h-Àº€ø` ˆ1@Ê€8h ¨5ÀÚ€xp È9@ꀸx è=Àú€ø€ ‚A@ !8ˆ (‚EÀ#x H‚I@ *%¸˜ h‚MÀ :'ø  ˆ‚Q@ J)8¨ ¨‚UÀ Z+x° È‚Y@ j-¸¸ è‚]À z/øÀ ƒa@ Š18È (ƒeÀ š3xÐ Hƒi@ ª5¸Ø hƒmÀ º7øà ˆƒq@Ê98è ¨ƒuÀÚ;xð ȃy@ê=¸ø èƒ}Àú?ø! „@ ‚A8!!(„…À‚Cx!"H„‰@*‚E¸!#h„À:‚Gø !$ˆ„‘@J‚I8 (!%¨„•ÀZ‚Kx 0!&È„™@j‚M¸ 8!'è„Àz‚Oø @!(…¡@Š‚Q8 H!)(…¥Àš‚Sx P!*H…©@ª‚U¸ X!+h…­Àº‚Wø `!,ˆ…±@Ê‚Y8 h!-¨…µÀÚ‚[x p!.È…¹@ê‚]¸ x!/è…½Àú‚_ø €!0†Á@ ƒa8 ˆ!1(†ÅÀƒcx !2H†É@*ƒe¸ ˜!3h†ÍÀ:ƒgø  !4ˆ†Ñ@Jƒi8 ¨!5¨†ÕÀZƒkx °!6ȆÙ@jƒm¸ ¸!7è†ÝÀzƒoø À!8‡á@Šƒq8È!9(‡åÀšƒsxÐ!:H‡é@ªƒu¸Ø!;h‡íÀºƒwøà!<ˆ‡ñ@ʃy8è!=¨‡õÀÚƒ{xð!>ȇù@êƒ}¸ø!?è‡ýÀúƒø"@ˆA „8"A(ˆÁ „ƒx"BHˆ A!*„…¸"Chˆ Á!:„‡ø "DˆˆA"J„‰8("E¨ˆÁ"Z„‹x0"FȈA#j„¸8"GèˆÁ#z„ø@"H‰!A$Š„‘8H"I(‰%Á$š„“xP"JH‰)A%ª„•¸X"Kh‰-Á%º„—ø`"Lˆ‰1A&Ê„™8h"M¨‰5Á&Ú„›xp"Nȉ9A'ꄸx"Oè‰=Á'ú„Ÿø€"PŠAA( …¡8ˆ"Q(ŠEÁ(…£x"RHŠIA)*…¥¸˜"ShŠMÁ):…§ø "TˆŠQA*J…©8¨"U¨ŠUÁ*Z…«x°"VÈŠYA+j…­¸¸"WèŠ]Á+z…¯øÀ"X‹aA,Š…±8È"Y(‹eÁ,š…³xÐ"ZH‹iA-ª…µ¸Ø"[h‹mÁ-º…·øà"\ˆ‹qA.Ê…¹8è"]¨‹uÁ.Ú…»xð"^È‹yA/ê…½¸ø"_è‹}Á/ú…¿ø#`ŒA0 †Á8#a(Œ…Á0†Ãx#bHŒ‰A1*†Å¸#chŒÁ1:†Çø #dˆŒ‘A2J†É8(#e¨Œ•Á2Z†Ëx0#fÈŒ™A3j†Í¸8#gèŒÁ3z†Ïø@#h¡A4ІÑ8H#i(¥Á4š†ÓxP#jH©A5ª†Õ¸X#kh­Á5º†×ø`#lˆ±A6ʆÙ8h#m¨µÁ6Ú†Ûxp#nȹA7ê†Ý¸x#oè½Á7ú†ßø€#pŽÁA8 ‡á8ˆ#q(ŽÅÁ8‡ãx#rHŽÉA9*‡å¸˜#shŽÍÁ9:‡çø #tˆŽÑA:J‡é8¨#u¨ŽÕÁ:Z‡ëx°#vÈŽÙA;j‡í¸¸#wèŽÝÁ;z‡ïøÀ#xáA<Їñ8È#y(åÁ<š‡óxÐ#zHéA=ª‡õ¸Ø#{híÁ=º‡÷øà#|ˆñA>ʇù8è#}¨õÁ>Ú‡ûxð#~ÈùA?ê‡ý¸ø#èýÁ?ú‡ÿø$€B@ ˆ9 $(Â@ˆy $‚H BA*ˆ¹ $ƒh ÂA:ˆù $„ˆBBJˆ 9!($…¨ÂBZˆ y!0$†ÈBCjˆ ¹!8$‡èÂCzˆù!@$ˆ‘!BDŠˆ9"H$‰(‘%ÂDšˆy"P$ŠH‘)BEªˆ¹"X$‹h‘-ÂEºˆù"`$Œˆ‘1BFʈ9#h$¨‘5ÂFÚˆy#p$ŽÈ‘9BGꈹ#x$è‘=ÂGúˆù#€$’ABH ‰!9$ˆ$‘(’EÂH‰#y$$’H’IBI*‰%¹$˜$“h’MÂI:‰'ù$ $”ˆ’QBJJ‰)9%¨$•¨’UÂJZ‰+y%°$–È’YBKj‰-¹%¸$—è’]ÂKz‰/ù%À$˜“aBLЉ19&È$™(“eÂLš‰3y&Ð$šH“iBMª‰5¹&Ø$›h“mÂMº‰7ù&à$œˆ“qBNʉ99'è$¨“uÂNÚ‰;y'ð$žÈ“yBOê‰=¹'ø$Ÿè“}ÂOú‰?ù'% ”BP ŠA9(%¡(”…ÂPŠCy(%¢H”‰BQ*ŠE¹(%£h”ÂQ:ŠGù( %¤ˆ”‘BRJŠI9)(%¥¨”•ÂRZŠKy)0%¦È”™BSjŠM¹)8%§è”ÂSzŠOù)@%¨•¡BTŠŠQ9*H%©(•¥ÂTšŠSy*P%ªH•©BUªŠU¹*X%«h•­ÂUºŠWù*`%¬ˆ•±BVÊŠY9+h%­¨•µÂVÚŠ[y+p%®È•¹BWêŠ]¹+x%¯è•½ÂWúŠ_ù+€%°–ÁBX ‹a9,ˆ%±(–ÅÂX‹cy,%²H–ÉBY*‹e¹,˜%³h–ÍÂY:‹gù, %´ˆ–ÑBZJ‹i9-¨%µ¨–ÕÂZZ‹ky-°%¶È–ÙB[j‹m¹-¸%·è–ÝÂ[z‹où-À%¸—áB\Š‹q9.È%¹(—åÂ\š‹sy.Ð%ºH—éB]ª‹u¹.Ø%»h—íÂ]º‹wù.à%¼ˆ—ñB^Ê‹y9/è%½¨—õÂ^Ú‹{y/ð%¾È—ùB_ê‹}¹/ø%¿è—ýÂ_ú‹ù/&À˜C` Œ90&Á(˜Ã`Œƒy0&ÂH˜ Ca*Œ…¹0&Ãh˜ Ãa:Œ‡ù0 &Ĉ˜CbJŒ‰91(&Ũ˜ÃbZŒ‹y10&ÆÈ˜CcjŒ¹18&Çè˜ÃczŒù1@&È™!CdŠŒ‘92H&É(™%ÃdšŒ“y2P&ÊH™)CeªŒ•¹2X&Ëh™-ÃeºŒ—ù2`&̈™1CfÊŒ™93h&ͨ™5ÃfÚŒ›y3p&ÎÈ™9Cgꌹ3x&Ïè™=ÃgúŒŸù3€&КACh ¡94ˆ&Ñ(šEÃh£y4&ÒHšICi*¥¹4˜&ÓhšMÃi:§ù4 &ÔˆšQCjJ©95¨&Õ¨šUÃjZ«y5°&ÖÈšYCkj­¹5¸&×èš]Ãkz¯ù5À&Ø›aClб96È&Ù(›eÃlš³y6Ð&ÚH›iCmªµ¹6Ø&Ûh›mÃmº·ù6à&܈›qCnʹ97è&ݨ›uÃnÚ»y7ð&ÞÈ›yCoê½¹7ø&ßè›}Ãoú¿ù7'àœCp ŽÁ98'á(œ…ÃpŽÃy8'âHœ‰Cq*ŽÅ¹8'ãhœÃq:ŽÇù8 '䈜‘CrJŽÉ99('娜•ÃrZŽËy90'æÈœ™CsjŽÍ¹98'çèœÃszŽÏù9@'è¡CtŠŽÑ9:H'é(¥ÃtšŽÓy:P'êH©CuªŽÕ¹:X'ëh­ÃuºŽ×ù:`'숱CvÊŽÙ9;h'í¨µÃvÚŽÛy;p'îȹCwêŽÝ¹;x'ïè½ÃwúŽßù;€'ðžÁCx á9<ˆ'ñ(žÅÃxãy<'òHžÉCy*å¹<˜'óhžÍÃy:çù< 'ôˆžÑCzJé9=¨'õ¨žÕÃzZëy=°'öÈžÙC{jí¹=¸'÷èžÝÃ{zïù=À'øŸáC|Šñ9>È'ù(ŸåÃ|šóy>Ð'úHŸéC}ªõ¹>Ø'ûhŸíÃ}º÷ù>à'üˆŸñC~Êù9?è'ý¨ŸõÃ~Úûy?ð'þÈŸùCêý¹?ø'ÿèŸýÃúÿù?(  D€ :@() Ä€z@(I  D*º@(i  Ä:ú@ (‰ D‚J :A((© Ä‚Z zA0(É Dƒj ºA8(é ăzúA@( ¡!D„Š:BH( )¡%Ä„šzBP( I¡)D…ªºBX( i¡-Ä…ºúB`( ‰¡1D†Ê:Ch( ©¡5ĆÚzCp(É¡9D‡êºCx(é¡=ćúúC€( ¢ADˆ ‘!:Dˆ()¢EĈ‘#zD(I¢ID‰*‘%ºD˜(i¢Mĉ:‘'úD (‰¢QDŠJ‘):E¨(©¢UÄŠZ‘+zE°(É¢YD‹j‘-ºE¸(é¢]Ä‹z‘/úEÀ( £aDŒŠ‘1:FÈ()£eÄŒš‘3zFÐ(I£iDª‘5ºFØ(i£mĺ‘7úFà(‰£qDŽÊ‘9:Gè(©£uÄŽÚ‘;zGð(É£yDê‘=ºGø(é£}Äú‘?úG) ¤D ’A:H)!)¤…Ä’CzH)"I¤‰D‘*’EºH)#i¤Ä‘:’GúH )$‰¤‘D’J’I:I()%©¤•Ä’Z’KzI0)&ɤ™D“j’MºI8)'é¤Ä“z’OúI@)( ¥¡D”Š’Q:JH)))¥¥Ä”š’SzJP)*I¥©D•ª’UºJX)+i¥­Ä•º’WúJ`),‰¥±D–Ê’Y:Kh)-©¥µÄ–Ú’[zKp).É¥¹D—ê’]ºKx)/饽ėú’_úK€)0 ¦ÁD˜ “a:Lˆ)1)¦ÅĘ“czL)2I¦ÉD™*“eºL˜)3i¦ÍÄ™:“gúL )4‰¦ÑDšJ“i:M¨)5©¦ÕÄšZ“kzM°)6ɦÙD›j“mºM¸)7é¦ÝÄ›z“oúMÀ)8 §áDœŠ“q:NÈ)9)§åÄœš“szNÐ):I§éDª“uºNØ);i§íĺ“wúNà)<‰§ñDžÊ“y:Oè)=©§õÄžÚ“{zOð)>ɧùDŸê“}ºOø)?é§ýÄŸú“úO*@ ¨E  ”:P*A)¨Å ”ƒzP*BI¨ E¡*”…ºP*Ci¨ Å¡:”‡úP *D‰¨E¢J”‰:Q(*E©¨Å¢Z”‹zQ0*FɨE£j”ºQ8*Gé¨Å£z”úQ@*H ©!E¤Š”‘:RH*I)©%Ťš”“zRP*JI©)E¥ª”•ºRX*Ki©-Å¥º”—úR`*L‰©1E¦Ê”™:Sh*M©©5Ŧڔ›zSp*NÉ©9E§ê”ºSx*Oé©=ŧú”ŸúS€*P ªAE¨ •¡:Tˆ*Q)ªEŨ•£zT*RIªIE©*•¥ºT˜*SiªMÅ©:•§úT *T‰ªQEªJ•©:U¨*U©ªUŪZ•«zU°*VɪYE«j•­ºU¸*Wéª]Å«z•¯úUÀ*X «aE¬Š•±:VÈ*Y)«eŬš•³zVÐ*ZI«iE­ª•µºVØ*[i«mÅ­º•·úVà*\‰«qE®Ê•¹:Wè*]©«uŮڕ»zWð*^É«yE¯ê•½ºWø*_é«}ůú•¿úW+` ¬E° –Á:X+a)¬…Ű–ÃzX+bI¬‰E±*–źX+ci¬Å±:–ÇúX +d‰¬‘E²J–É:Y(+e©¬•ŲZ–ËzY0+fɬ™E³j–ͺY8+gé¬Å³z–ÏúY@+h ­¡E´Š–Ñ:ZH+i)­¥Å´š–ÓzZP+jI­©Eµª–ÕºZX+ki­­Åµº–×úZ`+l‰­±E¶Ê–Ù:[h+m©­µÅ¶Ú–Ûz[p+nÉ­¹E·ê–ݺ[x+o魽ŷú–ßú[€+p ®ÁE¸ —á:\ˆ+q)®ÅŸ—ãz\+rI®ÉE¹*—åº\˜+si®ÍŹ:—çú\ +t‰®ÑEºJ—é:]¨+u©®ÕźZ—ëz]°+vÉ®ÙE»j—íº]¸+wé®ÝÅ»z—ïú]À+x ¯áE¼Š—ñ:^È+y)¯åżš—óz^Ð+zI¯éE½ª—õº^Ø+{i¯íŽº—÷ú^à+|‰¯ñE¾Ê—ù:_è+}©¯õžڗûz_ð+~ɯùE¿ê—ýº_ø+é¯ýÅ¿ú—ÿú_,€ °FÀ ˜;`,)°ÆÀ˜{`,‚I° FÁ*˜»`,ƒi° ÆÁ:˜û` ,„‰°FÂJ˜ ;a(,…©°ÆÂZ˜ {a0,†É°FÃj˜ »a8,‡é°ÆÃz˜ûa@,ˆ ±!FÄŠ˜;bH,‰)±%ÆÄš˜{bP,ŠI±)FŪ˜»bX,‹i±-ÆÅº˜ûb`,Œ‰±1FÆÊ˜;ch,©±5ÆÆÚ˜{cp,ŽÉ±9FÇ꘻cx,é±=ÆÇú˜ûc€, ²AFÈ ™!;dˆ,‘)²EÆÈ™#{d,’I²IFÉ*™%»d˜,“i²MÆÉ:™'ûd ,”‰²QFÊJ™);e¨,•©²UÆÊZ™+{e°,–ɲYFËj™-»e¸,—é²]ÆËz™/ûeÀ,˜ ³aFÌŠ™1;fÈ,™)³eÆÌš™3{fÐ,šI³iFͪ™5»fØ,›i³mÆÍº™7ûfà,œ‰³qFÎÊ™9;gè,©³uÆÎÚ™;{gð,žÉ³yFÏê™=»gø,Ÿé³}ÆÏú™?ûg-  ´FÐ šA;h-¡)´…ÆÐšC{h-¢I´‰FÑ*šE»h-£i´ÆÑ:šGûh -¤‰´‘FÒJšI;i(-¥©´•ÆÒZšK{i0-¦É´™FÓjšM»i8-§é´ÆÓzšOûi@-¨ µ¡FÔŠšQ;jH-©)µ¥ÆÔššS{jP-ªIµ©FÕªšU»jX-«iµ­ÆÕºšWûj`-¬‰µ±FÖÊšY;kh-­©µµÆÖÚš[{kp-®Éµ¹F×êš]»kx-¯éµ½Æ×úš_ûk€-° ¶ÁFØ ›a;lˆ-±)¶ÅÆØ›c{l-²I¶ÉFÙ*›e»l˜-³i¶ÍÆÙ:›gûl -´‰¶ÑFÚJ›i;m¨-µ©¶ÕÆÚZ›k{m°-¶É¶ÙFÛj›m»m¸-·é¶ÝÆÛz›oûmÀ-¸ ·áFÜŠ›q;nÈ-¹)·åÆÜš›s{nÐ-ºI·éFݪ›u»nØ-»i·íÆÝº›wûnà-¼‰·ñFÞÊ›y;oè-½©·õÆÞÚ›{{oð-¾É·ùFßê›}»oø-¿é·ýÆßú›ûo.À ¸Gà œ;p.Á)¸Çàœƒ{p.ÂI¸ Gá*œ…»p.Ãi¸ Çá:œ‡ûp .ĉ¸GâJœ‰;q(.Å©¸ÇâZœ‹{q0.ÆÉ¸Gãjœ»q8.Çé¸Çãzœûq@.È ¹!G䊜‘;rH.É)¹%Çäšœ“{rP.ÊI¹)G媜•»rX.Ëi¹-Ç府—ûr`.̉¹1GæÊœ™;sh.Í©¹5ÇæÚœ›{sp.Îɹ9Gçꜻsx.Ïé¹=ÇçúœŸûs€.Ð ºAGè ¡;tˆ.Ñ)ºEÇè£{t.ÒIºIGé*¥»t˜.ÓiºMÇé:§ût .Ô‰ºQGêJ©;u¨.Õ©ºUÇêZ«{u°.ÖɺYGëj­»u¸.×éº]Çëz¯ûuÀ.Ø »aG슱;vÈ.Ù)»eÇìš³{vÐ.ÚI»iGíªµ»vØ.Ûi»mÇíº·ûvà.܉»qGîʹ;wè.Ý©»uÇîÚ»{wð.ÞÉ»yGïê½»wø.ßé»}Çïú¿ûw/à ¼Gð žÁ;x/á)¼…ÇðžÃ{x/âI¼‰Gñ*žÅ»x/ãi¼Çñ:žÇûx /䉼‘GòJžÉ;y(/婼•ÇòZžË{y0/æÉ¼™GójžÍ»y8/çé¼ÇózžÏûy@/è ½¡GôŠžÑ;zH/é)½¥ÇôšžÓ{zP/êI½©GõªžÕ»zX/ëi½­Çõºž×ûz`/쉽±GöÊžÙ;{h/í©½µÇöÚžÛ{{p/îɽ¹G÷êžÝ»{x/ïé½½Ç÷úžßû{€/ð ¾ÁGø Ÿá;|ˆ/ñ)¾ÅÇøŸã{|/òI¾ÉGù*Ÿå»|˜/ói¾ÍÇù:Ÿçû| /ô‰¾ÑGúJŸé;}¨/õ©¾ÕÇúZŸë{}°/öɾÙGûjŸí»}¸/÷é¾ÝÇûzŸïû}À/ø ¿áGüŠŸñ;~È/ù)¿åÇüšŸó{~Ð/úI¿éGýªŸõ»~Ø/ûi¿íÇýºŸ÷û~à/ü‰¿ñGþÊŸù;è/ý©¿õÇþÚŸû{ð/þÉ¿ùGÿêŸý»ø/ÿé¿ýÇÿúŸÿû0 ÀH  <€0*ÀÈ |€0JÀ H+ ¼€0jÀ È; ü€ 0ŠÀHK  <(0ªÀÈ[  |00ÊÀHk  ¼80êÀÈ{ ü@0 Á!H‹ <‚H0 *Á%È› |‚P0 JÁ)H« ¼‚X0 jÁ-È» ü‚`0 ŠÁ1HË <ƒh0 ªÁ5ÈÛ |ƒp0ÊÁ9Hë ¼ƒx0êÁ=Èû üƒ€0 ÂAH ¡!<„ˆ0*ÂEÈ¡#|„0JÂIH +¡%¼„˜0jÂMÈ ;¡'ü„ 0ŠÂQH K¡)<…¨0ªÂUÈ [¡+|…°0ÊÂYH k¡-¼…¸0êÂ]È {¡/ü…À0 ÃaH ‹¡1<†È0*ÃeÈ ›¡3|†Ð0JÃiH «¡5¼†Ø0jÃmÈ »¡7ü†à0ŠÃqHË¡9<‡è0ªÃuÈÛ¡;|‡ð0ÊÃyHë¡=¼‡ø0êÃ}Èû¡?ü‡1 ÄH ¢A<ˆ1!*Ä…È¢C|ˆ1"JĉH+¢E¼ˆ1#jÄÈ;¢Güˆ 1$ŠÄ‘HK¢I<‰(1%ªÄ•È[¢K|‰01&ÊÄ™Hk¢M¼‰81'êÄÈ{¢Oü‰@1( Å¡H‹¢Q<ŠH1)*ťț¢S|ŠP1*JÅ©H«¢U¼ŠX1+jÅ­È»¢WüŠ`1,ŠÅ±HË¢Y<‹h1-ªÅµÈÛ¢[|‹p1.ÊŹHë¢]¼‹x1/êŽÈû¢_ü‹€10 ÆÁH £a<Œˆ11*ÆÅÈ£c|Œ12JÆÉH+£e¼Œ˜13jÆÍÈ;£güŒ 14ŠÆÑHK£i<¨15ªÆÕÈ[£k|°16ÊÆÙHk£m¼s¸17êÆÝÈ{£oüÀ18 ÇáH‹£q<ŽÈ19*ÇåÈ›£s|ŽÐ1:JÇéH«£u¼ŽØ1;jÇíÈ»£wüŽà1<ŠÇñHË£y<è1=ªÇõÈÛ£{|ð1>ÊÇùHë£}¼ø1?êÇýÈû£ü2@ ÈI ¤<2A*ÈÉ ¤ƒ|2BJÈ I!+¤…¼2CjÈ É!;¤‡ü 2DŠÈI"K¤‰<‘(2EªÈÉ"[¤‹|‘02FÊÈI#k¤¼‘82GêÈÉ#{¤ü‘@2H É!I$‹¤‘<’H2I*É%É$›¤“|’P2JJÉ)I%«¤•¼’X2KjÉ-É%»¤—ü’`2LŠÉ1I&ˤ™<“h2MªÉ5É&Û¤›|“p2NÊÉ9I'뤼“x2OêÉ=É'û¤Ÿü“€2P ÊAI( ¥¡<”ˆ2Q*ÊEÉ(¥£|”2RJÊII)+¥¥¼”˜2SjÊMÉ);¥§ü” 2TŠÊQI*K¥©<•¨2UªÊUÉ*[¥«|•°2VÊÊYI+k¥­¼•¸2WêÊ]É+{¥¯ü•À2X ËaI,‹¥±<–È2Y*ËeÉ,›¥³|–Ð2ZJËiI-«¥µ¼–Ø2[jËmÉ-»¥·ü–à2\ŠËqI.Ë¥¹<—è2]ªËuÉ.Û¥»|—ð2^ÊËyI/륽¼—ø2_êË}É/û¥¿ü—3` ÌI0 ¦Á<˜3a*Ì…É0¦Ã|˜3bJ̉I1+¦Å¼˜3cjÌÉ1;¦Çü˜ 3dŠÌ‘I2K¦É<™(3eªÌ•É2[¦Ë|™03fÊÌ™I3k¦Í¼™83gêÌÉ3{¦Ïü™@3h Í¡I4‹¦Ñ<šH3i*Í¥É4›¦Ó|šP3jJÍ©I5«¦Õ¼šX3kjÍ­É5»¦×üš`3lŠÍ±I6˦Ù<›h3mªÍµÉ6Û¦Û|›p3nÊ͹I7ë¦Ý¼›x3oêͽÉ7û¦ßü›&ب 5pxl_col_in_fullres€NªðÀð&ʨ&˜¸ýª-ù,×@ºp§È,ŠÀ(ýª-ù,×@ºp§È,ŠÀ,|5schema  %barcode%L% in_tissue% array_row% array_col %pxl_row_in_fullres %pxl_col_in_fullres€Nl&ðÍ 5barcode€Nª´èÍ&âÍ&6(TTGTTTGTGTAAATTC-1AAACAACGAATAGTTC-1,&öÚ5 in_tissue€Nª ¸ &îÏ&¾Ï(,&ØÏ5 array_row€Nžs°s&êö&¨Ü¢(¢,&¾Ä5 array_col€Nžs´s&Ðë&ŠÑ¢(¢,&°¶ 5pxl_row_in_fullres€NªðÀð&¢¶ &ðÅd “Íð×@|öHúÜQPÀ(d “Íð×@|öHúÜQPÀ,&ب 5pxl_col_in_fullres€NªðÀð&ʨ&˜¸ýª-ù,×@ºp§È,ŠÀ(ýª-ù,×@ºp§È,ŠÀ,䆀N&„¡ ARROW:schema¸/////6ABAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAYAAABEAQAA9AAAALwAAACEAAAAQAAAAAQAAADk/v//AAABAxAAAAAkAAAABAAAAAAAAAASAAAAcHhsX2NvbF9pbl9mdWxscmVzAADG////AAACABz///8AAAEDEAAAACwAAAAEAAAAAAAAABIAAABweGxfcm93X2luX2Z1bGxyZXMAAAAABgAIAAYABgAAAAAAAgBc////AAABAhAAAAAcAAAABAAAAAAAAAAJAAAAYXJyYXlfY29sAAAAmP///wAAAAEgAAAAkP///wAAAQIQAAAAHAAAAAQAAAAAAAAACQAAAGFycmF5X3JvdwAAAMz///8AAAABIAAAAMT///8AAAECEAAAACQAAAAEAAAAAAAAAAkAAABpbl90aXNzdWUAAAAIAAwACAAHAAgAAAAAAAABIAAAABAAFAAIAAYABwAMAAAAEAAQAAAAAAABBRAAAAAcAAAABAAAAAAAAAAHAAAAYmFyY29kZQAEAAQABAAAAA== parquet-cpp-arrow version 15.0.2l{PAR1Seurat/tests/testdata/visium_hd/binned_outputs/square_008um/spatial/tissue_hires_image.png0000755000176200001440000037640015063070153032002 0ustar liggesusers‰PNG  IHDRpÇsµ§ IDATxœìÁ€þ¯î €Ùƒ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU&ìùM IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUµ³ IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUª3< IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU/rôß IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÙ!$I IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÇbã— IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU*zUT IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU ›#h IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU7)~ IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUðjÙ• IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUèùÚ IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUµ[#£ IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUå\Gm IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUS“ˆ÷ IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUƒµžîIDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU¥=8$ôÿµ#¬°-­ÍC”IEND®B`‚Seurat/tests/testdata/visium_hd/binned_outputs/square_008um/filtered_feature_bc_matrix.h50000644000176200001440000070561315063070153031565 0ustar liggesusers‰HDF  ÿÿÿÿÿÿÿÿ‹‹ÿÿÿÿÿÿÿÿ`ˆ¨ˆ¨TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàHEAPXÈmatrixHHhTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ80HEAPXHˆbarcodesdataindicesindptrshapefeaturesSNOD Hh‡ ÿÿÿÿÿÿÿÿ deflate€ %z‚]PSNOD(°8°6Ø6ø8 ð(0$0p-TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPæwj6ë † GCOLATAACGCCGGAGGGTC-1ATAACGGAGTCCAACG-1ATAACGTTACCTCCAC-1ATAAGGTGGAGAACAT-1ATAAGTAGGATTCAGA-1ATAAGTAGGGCGACTC-1ATAAGTTACCGCGACG-1ATAATAGCTGTTGAAT-1 ATAATCTTGGAGAACC-1 ATAATTAGCTAAGTAG-1 ATACAGGCCCTCCAAT-1 ATACCACGGGCAACTT-1 ATACCGTCATCCATAA-1ATACCTAACCAAGAAA-1ATACGCCGGCGAAACC-1ATACGGAACGTCGTTT-1ATACGGGTTTCGATTG-1ATACGTACTTAGCCAC-1ATACGTCCACTCCTGT-1ATACGTTATGCACGGA-1ATACTACCCGTACCAC-1ATACTAGCATGACCCT-1ATACTGCCTTACACCG-1ATAGACAACGGGACCT-1ATAGACGAAGAGAAAG-1ATAGAGTACTGGGACA-1ATAGAGTTATCAACTT-1ATAGCAACTAGGGAAG-1ATAGCCATAACAGTCA-1ATAGGCGGCTATAGAA-1ATAGGCTAGCTTCGCA-1 ATAGGGATATCCTTGA-1!ATAGGTTGGGCAGATG-1"ATAGTGAAGCGTTCTC-1#ATAGTTCCACCCACTC-1$ATATAAAGCGCTCGTG-1%ATATAAATGTAGCTGC-1&ATATAACACGGGCGCA-1'ATATACATGTATGGTA-1(ATATACGCTCGTGACG-1)ATATAGAGTATTGGTC-1*ATATCAACCTACAGAG-1+ATATCAATTCCAGCCT-1,ATATCGGTAGGGAGAT-1-ATATCGTTCCTCGAAC-1.ATATCTCCCTCGTTAA-1/ATATCTTAGGGCCTTC-10ATATGTCTCCCTAGCC-11ATATTCAGTTAAACCT-12ATATTCCACATAGTGA-13ATATTTAACCCTCAAG-14ATCAAACACTGTTCCA-15ATCAAACGAAGGTTTG-16ATCAATCTGGGCTGCA-17ATCAATGCCGTGGCTG-18ATCACATTAGAATATC-19ATCACGTGCTAATTAA-1:ATCACTTCATCCTCGC-1;ATCAGACGGCACGCCG-1<ATCAGCCTCATGCTGC-1=ATCAGCTCGTCCACTA-1>ATCAGTAGGCAGGGAT-1?ATCATAGCCCTATGTA-1@ATCATCCAATATTTGT-1AATCATTGTACCGCATT-1BATCCAACGCAGTCATA-1CATCCAATGGAGGGTCC-1DATCCACATCGACAGAA-1EATCCAGAGCAACAACC-1FATCCAGGATTCGTGAA-1GATCCCATCCACAGCGC-1HATCCTACCTAAGCTCT-1IATCCTGAATCGCTGCG-1JATCCTGCGTGGAATGG-1KATCGACCCAATACAGA-1LATCGACTCTTTCCGTT-1MATCGCACGCCGGGAGA-1NATCGCCAGTCAACATT-1OATCGCTGCGTGCAGCA-1PATCGGAGACAGACGGC-1QATCGGCAAGCAGTCCA-1RATCGTTAGCTAGCGGA-1SATCTAATATCCTACGG-1TATCTACCATCTGCTCC-1UATCTAGCTTGTGAGGG-1VATCTCCCACGGAATAT-1WATCTCCCTGCAATCTA-1XATCTGCACCTCTGCGA-1YATCTGCTGTTATCGCC-1ZATCTGGGCTGTTCTTG-1[ATCTGGTTAAGACTGT-1\ATCTTATCGCACACCC-1]ATCTTGACCTGCAACG-1^ATCTTGACTTGTCCAA-1_ATGAAGCCAAGGAGCC-1`ATGACGCGTTCTATCC-1aATGACTATGCGACATT-1bATGAGGAGTGTTAATC-1cATGATGCAATGGTACA-1dATGCACGCGCTGTTCA-1eATGCACTACCGCATTG-1fATGCATGATCCAGGAT-1gATGCCAATCGCTCTGC-1hATGCCATTTGCGACCA-1iATGCCGGTCTTGCATA-1jATGCCGGTTGATGGGA-1kATGCGACAATTGGTCC-1lATGCGACAGTCCCATT-1mATGCGAGTCCCACCAC-1nATGCTCTGGCGCGGTA-1oATGCTTAGGAGTTGAT-1pATGGAAATTTAAGGAG-1qATGGAGCAGGCCGTGA-1rATGGATCCGGCGTCCG-1sATGGATTGACCAAACG-1tATGGCAGCATTACGAT-1uATGGGCCTCGGCCTCT-1vATGGTCGCGTGGTTTC-1wATGTAAGGCTGCTCTT-1xATGTACATGCGGTGAG-1yATGTACGATGACGTCG-1zATGTAGCGCGCGTAGG-1{ATGTGAAAGCCTAATG-1|ATGTGCATCCGACGCA-1}ATGTGGACATCTTGAT-1~ATGTTGATTAGAGACT-1ATTAAACATGCGGACC-1€ATTAATACTACGCGGG-1ATTAATGAACCAGTCG-1‚ATTACATGTCAGTCTT-1ƒATTACGCGCTGGCAGG-1„ATTACTTACTGGGCAT-1…ATTAGATTCCTCAGCA-1†ATTAGGCGATGCTTTC-1‡ATTATACTTTGCTCGT-1ˆATTATAGCTACTTTAC-1‰ATTATGCCATAGGGAG-1ŠATTATTATGTCCGTCA-1‹ATTATTCAGAGTCACT-1ŒATTCAACCATTTAAGG-1ATTCACTGATGTTGGA-1ŽATTCAGGACCTATTTC-1ATTCATATACTGTCCA-1ATTCATCGTTGAGGCA-1‘ATTCCCGAAGGTACAG-1’ATTCCTAAGACGTGGA-1“ATTCGACGCCGGGCCT-1”ATTCGCGCCTTGAGAG-1•ATTCGTGCTATCTCTT-1–ATTGAAGATCTTAGTG-1—ATTGACCGGCGATGAC-1˜ATTGATCACCACATTT-1™ATTGATGAGTCCTAAC-1šATTGCCTTTATGTTTG-1›ATTGCGATCAGTAACT-1œATTGCTGCTCCTCCAT-1ATTGGATTACAGCGTA-1žATTGGTTGTGCATTAC-1ŸATTGTACAACTCGGCT-1 ATTGTCGCAATACCTT-1¡ATTGTGACTTCGCTGC-1¢ATTTACAGTTTACTGG-1£ATTTACTAAGTCCATT-1¤ATTTCCGGGTTCTGCG-1¥ATTTGCGCGAGTAGCT-1¦ATTTGGAGATTGCGGT-1§ATTTGTCTTGGGAGCT-1¨ATTTGTTCCAGGGCTC-1©CAAACCCTCCGGCGGG-1ªCAAACGAGTATCGCAG-1«CAAACGGTCGCACTTT-1¬CAAACTCGCGACGCCG-1­CAAAGATTATTGGGCC-1®CAAATCTCTCACAAGG-1¯CAAATGTCCTTCCGTG-1°CAACCTACCGAGCAGT-1±CAACGACCCGTTTACA-1²CAACGTGGTGGAGTCT-1³CAACTATATCGAATGC-1´CAACTGCTCATCCGAT-1µCAAGAGGGCGGAGTAC-1¶CAAGATATTATAACGT-1·CAAGCAACGTCGGAGT-1¸CAAGCACCAAATGCCT-1¹CAAGCGGCACATAATT-1ºCAAGGATCGCATGTTC-1»CAAGGCCAGTGGTGCA-1¼CAAGGTCCTATAGGCT-1½CAAGTGTGGTTGCAAA-1¾CAATAAACCTTGGCCC-1¿CAATACGCTCTGAGGC-1ÀCAATATTCTTGACCTA-1ÁCAATCCCTATACCAGC-1ÂCAATGCGAGAAGTATC-1ÃCAATGGATCTCTACCA-1ÄCAATGTGCCAACCCTT-1ÅCAATTAAGGGTGATGA-1ÆCAATTGGGCCGCACTC-1ÇCAATTTCGTATAAGGG-1ÈCACAAGAAAGATATTA-1ÉCACAATGAGCTGCTAT-1ÊCACACACGCTAACGAG-1ËCACACGCGCTGTCTTA-1ÌCACAGCACCCACGGCA-1ÍCACAGCTAGGGAGTGA-1ÎCACAGGGCCATATAGT-1ÏCACAGGGCCGTTGTCA-1ÐCACAGTCCCGCTTCGC-1ÑCACAGTTCGCTTCCCA-1ÒCACATATTAGCAGGAT-1ÓCACATCTCACCGACGA-1ÔCACATGATTCAGCAAC-1ÕCACATTCTTTCGATGG-1ÖCACATTTCTTGTCAGA-1×CACCAATCATCCGTCT-1ØCACCACGCCACACAGA-1ÙCACCAGTCAGCATGCA-1ÚCACCATGATCGCAAAG-1ÛCACCCAAATCTTATGT-1ÜCACCCACGAGGCAATT-1ÝCACCCGGTTTGTGACT-1ÞCACCCTAACAAGATCT-1ßCACCCTTGGTGAGACC-1àCACCGCCAGAAGGTTT-1áCACCGCGTCCACTCTA-1âCACCGGGCATCACAAG-1ãCACCGTATCCCATCCG-1äCACCGTTAGGGATCAC-1åCACCGTTGCGCGATAT-1æCACCTAATCAGTTTAC-1çCACCTCGATGGTGGAC-1èCACCTTGCGAAACTCG-1éCACCTTGGCGCCTTTG-1êCACGAAAGTTAGTCCC-1ëCACGCACAGCGCAGCT-1ìCACGCAGCGAGGCTTT-1íCACGCGGAACTGTTGC-1îCACGGCGCGCCAAAGG-1ïCACGTCGGCAACCTCT-1ðCACGTTCGTGCTCTAG-1ñCACGTTTCGTACACAC-1òCACTAAAGTTGCCTAT-1óCACTACGGGAGCTGCC-1ôCACTCAAGAGCTATGG-1õCACTCCTATGTAAGAT-1öCACTCCTCTCGGTCGG-1÷CACTCGAGCTGAACAA-1øCACTCTTCTGCTAGCC-1ùCACTGACGATTGTGGA-1úCACTTAATCAGACGGA-1ûCAGAACTTAGCCCTCT-1üCAGAATAACACACGGA-1ýCAGACACCGATCGCTG-1þCAGACCTGTAAGTGTT-1ÿCAGACGAACCTGATAC-1CAGAGACGGTCACCCA-1CAGAGCATGAGCTTGC-1CAGAGGCGATGCATGA-1CAGATAATGGGCGGGT-1CAGATACTAACATAGT-1CAGATCATTTAAAGTC-1CAGATCCTGGTTTGAA-1CAGATGTTTGTCCCAA-1CAGCAGCCCGTTCCTT-1 CAGCAGTCCAGACTAT-1 CAGCAGTCTGTGCTGC-1 CAGCCTCCTGCAGAGG-1 CAGCCTCTCCTCAAGA-1 CAGCGATTCCCTTCAA-1CAGCTCACTGAGACAT-1CAGCTCGACAAGTTAA-1CAGCTGGCGTAACCGT-1CAGCTTAGTAGGTAGC-1CAGGATATATCGTTGT-1CAGGCAGTCTTACCAG-1CAGGCCGTTTGGGTGT-1CAGGCGCACGGTGGTC-1CAGGCGCCATGCTAGG-1CAGTAACTATTTATTG-1CAGTAAGGGACGTCTC-1CAGTACATTCTCTAAA-1CAGTACCAGTTTACGT-1CAGTAGCCCACGCGGT-1CAGTCGAGGATGCAAT-1CAGTCGGCCTAGATAT-1CAGTCTGTATACTGGG-1CAGTGAATAAATGACT-1 CAGTGTCGGCTGGCCC-1!CAGTTCAAATTGACAC-1"CATAACGGACAGTCGT-1#CATAAGAAGCTTGGCT-1$CATAAGCTCTCCGTCT-1%CATACACAAAGTCAGC-1&CATACACGGTTCCCAC-1'CATACCCGTACCCAGT-1(CATACGGCGTCTGGGC-1)CATACTATGTAATTGT-1*CATACTTAGGCAATAC-1+CATAGAGGAGATACTA-1,CATAGCGTTGCCCACC-1-CATAGTACATTGAGAG-1.CATAGTCAAATACATA-1/CATAGTCCACAAGAAC-10CATATACTACTGATAA-11CATATAGGTACAGTCA-12CATATGTCAGGCTACG-13CATCATTACCCTGAGG-14CATCCTCTCAAAGATC-15CATCGGACGGGTTAAT-16CATCTATCCCGTGTCT-17CATCTTACACCACCTC-18CATGACTTCGCTGAAT-19CATGAGATGCACTCTC-1:CATGATGCACAATTCT-1;CATGATGGAAGTTAGC-1<CATGCCAACTCGCAAA-1=CATGCGACCAGTTTAA-1>CATGGATTGTCTTCCG-1?CATGGGTATGCCTTAT-1@CATGGGTCGGGTGTGG-1ACATGGTAAGTAGCGTT-1BCATGGTATTAGTTTGT-1CCATGGTCTAGATACCG-1DCATGGTTTATTAATCA-1ECATGTAAGAGACATTT-1FCATGTAGGAGCGCCAA-1GCATGTCTCATTTATGG-1HCATTACGCAGGAAGGG-1ICATTACGTCGGCCCGT-1JCATTATGCTTGTTGTG-1KCATTGCGGGTCAATTC-1LCATTTAGCGGACCATG-1MCATTTGAGTGGTACGT-1NCCAAACAGAACCCTCG-1OCCAAATAACAAGATTC-1PCCAACGATGCACTGAT-1QCCAAGAAAGTGGGCGA-1RCCAAGACTTCTGCGAA-1SCCAAGCGTAACTCGTA-1TCCAAGGTTGCCCTTTC-1UCCAATAGTGCCGTCGA-1VCCAATCGGTAGATCGA-1WCCAATGTCACAGCAAG-1XCCAATTACGGGTCGAG-1YCCACAATGTACGTCTT-1ZCCACACTGAGATATTA-1[CCACAGTACCCATCCT-1\CCACATGGCTCTTTAT-1]CCACCAACTTTACTGT-1^CCACCCAAGGAAAGTG-1_CCACGAATTTAACCTC-1`CCACGAGAAGAGAATC-1aCCACGGAGCCATAAGA-1bCCACGGTGCCCGGTAG-1cCCACTCAGATCCGCAA-1dCCACTGGTGGCTGGTT-1eCCACTGTTTGGATTAA-1fCCAGAAAGCAACTCAT-1gCCAGATAGTTGAGTGA-1hCCAGCCTGGACCAATA-1iCCAGCTCGAACGCATT-1jCCAGCTGATGGTACTT-1kCCAGGGACGTGGCCTC-1lCCAGTAGTCTGATCCA-1mCCAGTCAAATCTCTTA-1nCCAGTCTAGACGGCGC-1oCCAGTCTTGTCATAGA-1pCCAGTTCGGTAACTCA-1qCCATAACCTGTGCAGT-1rCCATACCTTTACTTGT-1sCCATAGAGGCTGCCAG-1tCCATAGGTTGGCGTGG-1uCCATATGGAAACTATA-1vCCATCGCAGTTAAACT-1wCCATCTCACCAGTGAA-1xCCATGCCCTAGATTTC-1yCCATGCCTGTTTAGTA-1zCCATTAGCGATAATCC-1{CCATTCCCTGCCCACA-1|CCATTTCTACCTATTA-1}CCCAAACATGCTGCTC-1~CCCAACATACGTCGCG-1CCCAAGTCATTACACT-1€CCCAATTTCACAACTT-1CCCACTCCACGGTATC-1‚CCCAGAGGAGGGCGTA-1ƒCCCAGGTCTGAAGGCT-1„CCCAGTAAACTTGGGA-1…CCCAGTTAAGGCGCCG-1†CCCGAAGTTTCGCGAA-1‡CCCGACCATAGTCCGC-1ˆCCCGAGTTTCTCCGTA-1‰CCCGCAGCGCGAACTA-1ŠCCCGGGTCGTTCAGGG-1‹CCCGGTGTATCGGAAT-1ŒCCCGTAAGTCTAGGCC-1CCCGTAGCTGGGAAGA-1ŽCCCGTCAGCGTCTGAC-1CCCGTGAGGGCGGTGA-1CCCGTTTCGCAGATGT-1‘CCCTACTTGAACAATG-1’CCCTAGGCAACAAGAG-1“CCCTATGTAGAGCAGA-1”CCCTCCTCGCTCGTAT-1•CCCTGAAATGAGTTGA-1–CCCTGCCCAATCCGCT-1—CCCTGCGCTACGCATA-1˜CCCTGGCTGTTCCTTC-1™CCCTTTAATGGAGTTC-1šCCCTTTGACAGGTCTT-1›CCGAACACTGGGCCTC-1œCCGAACCTTCCCGGCC-1CCGAAGCATTGACCAA-1žCCGACAATAGGCCGCC-1ŸCCGACGGGCATGAGGT-1 CCGACGTAAACACAAC-1¡CCGAGAAGTCGCATAA-1¢CCGAGCTGTGCTTGTC-1£CCGATCTCAACCTTAT-1¤CCGATTCGAGGGACCC-1¥CCGCACAAAGACCAAC-1¦CCGCACTTGCAATGAC-1§CCGCATGTGGTACGAT-1¨CCGCCGGAACTTCTCG-1©CCGCCTGCGAATTGGT-1ªCCGCCTTGCGATGTCG-1«CCGCGATTTGGTAGGT-1¬CCGCGCAAGATACCCA-1­CCGCGGAATGCGTCAC-1®CCGCGGGTACGAAGAA-1¯CCGCTATCAGCACCAG-1°CCGCTCCAGGGCGATC-1±CCGCTCTTCCGAACTA-1²CCGCTTACCTCACTCT-1³CCGCTTGCTGACATGG-1´CCGGAGCGTACTTTCT-1µCCGGCACGACCGTTTC-1¶CCGGCCGCGAGCATAT-1·CCGGCGTGAGACTCTG-1¸CCGGGCGGTCTCGTCA-1¹CCGGGCTGCTCCATAC-1ºCCGGGTTCGAGGTTAC-1»CCGGTAATGGCTAGTC-1¼CCGGTTTGTAATTGTG-1½CCGTAAGTTGGTCCCA-1¾CCGTAGGAAATCCCTG-1¿CCGTAGGGTTGTTTAC-1ÀCCGTATCTCGTCGTAG-1ÁCCGTATTAGCGCAGTT-1ÂCCGTGGAACGATCCAA-1ÃCCGTGTTAAATTCCAT-1ÄCCGTTACGTTAGAACA-1ÅCCGTTCCGAATCTCGG-1ÆCCTAAAGGCTGACGCT-1ÇCCTAAATTAACGGTTC-1ÈCCTAAATTGTATCCTA-1ÉCCTAACCCAAACAAGT-1ÊCCTAACTAAGGCTCTA-1ËCCTACATTCACAGACG-1ÌCCTACTGCTTACACTT-1ÍCCTAGGCGTAGCGATC-1ÎCCTAGGTAAAGGTAGC-1ÏCCTATAATGAGTGCCC-1ÐCCTATACCGTCCTGTC-1ÑCCTATATCGTGTCACG-1ÒCCTATATTTGTCCTGG-1ÓCCTATCTATATCGGAA-1ÔCCTATGAAGTGGTGCC-1ÕCCTATGGCTCCTAGTG-1ÖCCTATGGGTTACCGTC-1×CCTATGGTCAAAGCTG-1ØCCTATGTCCACTCCAC-1ÙCCTCAACGATCGCTGT-1ÚCCTCACCTGAGGGAGC-1ÛCCTCACCTTAGCATCG-1ÜCCTCCGACAATTCAAG-1ÝCCTCCTGAGCCCACAT-1ÞCCTCCTGTTGTGTCGT-1ßCCTCGCCAGCAAATTA-1àCCTCGCGCGATATAGG-1áCCTCGCGCTGTGCGAT-1âCCTCGGACCGGGATAG-1ãCCTCTAATCTGCCAAG-1äCCTCTATCGATTAGCA-1åCCTCTCTCCCATCTAG-1æCCTCTGGCCTAGACGG-1çCCTCTGTACTATTCTA-1èCCTGAACGATATATTC-1éCCTGAATATTTACATA-1êCCTGACCACCGATGGT-1ëCCTGCTATTTGAGAAG-1ìCCTGGAAACGTTCTGC-1íCCTGGCTAGACCCGCC-1îCCTGGTCGAATGTGGG-1ïCCTGTAAGACATGATA-1ðCCTGTACTCACGCCCA-1ñCCTGTCACCCGGGCTC-1òCCTGTCCCTCACGTTA-1óCCTGTCGCCCGTAAAT-1ôCCTGTTTGAAGACACG-1õCCTTCAGTTAAAGTGA-1öCCTTCGTATAGAATCC-1÷CCTTCTCAGCGTTCCT-1øCCTTCTTGATCCAGTG-1ùCCTTGACCACTTTATT-1úCCTTTAAGGGAGCACT-1ûCCTTTCAATGAAGAAA-1üCCTTTGAATTATGGCT-1ýCGAAACGCAATTCATG-1þCGAACAGTATGGGCGT-1ÿCGAACCCGCATGCGTC-1CGAACGGCCGGACAAC-1ACGATCATACATAGAG-1ACGATCATCTTGTAAA-1ACGATGCATATGTTAT-1ACGCAAACTAATAGAT-1ACGCAATCACTACAGC-1ACGCATACGTTTACTA-1ACGCATTCGTGAGTAC-1ACGCCAGATGATTTCT-1 ACGCCAGTGCGTTTGC-1 ACGCCGCTAGACGACC-1 ACGCGAAGTCAGACGA-1 ACGCGCTACACAGGGT-1 ACGCGGGCCAAGGACA-1ACGCTAGTGATACACT-1ACGCTGTGAGGCGTAG-1ACGGAACACGAGTGCC-1ACGGACTCTCAAAGCG-1ACGGAGCGCAAATTAC-1ACGGATGGTGCGGATA-1ACGGCACTTGCTTGGG-1ACGGCCAACATGGACT-1ACGGCGACGATGGGAA-1ACGGCTGGATGTAGAA-1ACGGGAGTGTCGGCCC-1ACGGTACAGTTCAATG-1ACGTAGATTGCTGATG-1ACGTAGGAGAGTCGCT-1ACGTATTACTCCGATC-1ACGTCTCGTTCCGGGA-1ACGTGACAAAGTAAGT-1ACGTGCGCCTCGTGCA-1 ACGTTAATGTCGAAGA-1!ACGTTAGATTTGCCCG-1"ACGTTCGCAATCAATT-1#ACGTTCGTTCAGGAAA-1$ACGTTCTGTACAAGTC-1%ACTACATCCCGACAAG-1&ACTACCAGCTCTCTGG-1'ACTACGCGTTAGAATT-1(ACTAGTTGCGATCGTC-1)ACTATATGCTGTGTTC-1*ACTATCCAGGGCATGG-1+ACTATCTGCCCGCGTA-1,ACTATTTCCGGGCCCA-1-ACTCAAGTGCAAGGCT-1.ACTCAATAAAGGCACG-1/ACTCCCATTCCTAAAG-10ACTCCCGAATTCGTTT-11ACTCCCTAATGCTAAA-12ACTCCCTAGAATAGTA-13ACTCCGGCCGACCACT-14ACTCGCCGTTCGATAA-15ACTCGTAACCCGTCCT-16ACTCGTCAGTAATCCC-17ACTCTCTGACTTAGGT-18ACTCTGACCTAATAGA-19ACTCTTGTATAGTAAC-1:ACTGAAACGCCGTTAG-1;ACTGAATGGCGAAAGT-1<ACTGCCGTCGTAACTC-1=ACTGCTCGGAAGGATG-1>ACTGTACGATACACAT-1?ACTGTAGCACTTTGGA-1@ACTGTCCAGGATTATA-1AACTGTCTTCTTTAGAA-1BACTTACGCATCCACGC-1CACTTATACTTACCCGG-1DACTTATTAGGATCGGT-1EACTTATTTATGTGCCA-1FACTTCAGGCTGATCCC-1GACTTCCAGTGGAAGCT-1HACTTCCATGCGGGACA-1IACTTCGCCATACGCAC-1JACTTGACTCCCTCTTT-1KACTTGGGACCCGGTGG-1LACTTGTAGTCCCTTCA-1MACTTGTGGATGGAACG-1NACTTTACCCTCATGAA-1OACTTTCCTATAGCTTC-1PACTTTGACTGCATCCT-1QACTTTGGTCGTGCTCC-1RAGAACCCTCAATTGGG-1SAGAACGTGGTACATTC-1TAGAAGAGCGCCGTTCC-1UAGAAGGTACACTTCAC-1VAGAAGGTTGCCGAATT-1WAGAAGGTTGTAGGTCG-1XAGAAGTGATTCGTGAT-1YAGAATGCGGGTTCGGA-1ZAGAATTATGGATTCGA-1[AGACCAAACCACACCT-1\AGACCCACCGCTGATC-1]AGACCCGCCCTCCTCG-1^AGACCGCTCCGCGGTT-1_AGACCGGGAAACCCTG-1`AGACGAAGTGCCGGTC-1aAGACGACGATGCCGCT-1bAGACTAGCCTTCCAGA-1cAGAGAACCGTCTAGGA-1dAGAGAAGGAGTACAAT-1eAGAGATCTCTAAAGCG-1fAGAGCCGCCGAGATTT-1gAGAGGCTTCGGAAACC-1hAGAGTAAACTTCACTA-1iAGATAACTTCAGGGCC-1jAGATACCAATAGAACC-1kAGATACCGGTGTTCAC-1lAGATACTCAAGATCGA-1mAGATATAATACGACTA-1nAGATCGTGCATAAGAT-1oAGATCTCAGGTGTGAT-1pAGATGACTCGCCCACG-1qAGATGAGGGTTGCGAT-1rAGATGATGGAGTCTGG-1sAGATGCAAGACGTGCA-1tAGATGCATCCTGTGTC-1uAGATTATAGGACGTTT-1vAGATTCACAACCGATA-1wAGCAAAGGCCGCTAGT-1xAGCAACATATCTTATT-1yAGCAACCGAAAGTAAT-1zAGCACCAGTACTCACG-1{AGCACTACCTCACCAG-1|AGCACTTAAGGACGCC-1}AGCAGAAGGAGAAAGA-1~AGCAGCCAGATGAATA-1AGCATATCAATATGCT-1€AGCATCATTTCGAAAG-1AGCATCGTCGATAATT-1‚AGCATTACGAGGCAAG-1ƒAGCCAAGCTTTGTGTC-1„AGCCACAGGTTACCCG-1…AGCCACTCCCGTGCTT-1†AGCCCATACATGTAAG-1‡AGCCCGCACTACAATG-1ˆAGCCCGGTAGCCTGTA-1‰AGCCCTTCTAATCCGA-1ŠAGCCGTGGCTAAATGT-1‹AGCCTAATACCCACGT-1ŒAGCGACAGGAACGGTC-1AGCGACCAACGATATT-1ŽAGCGATGCGCCTAATA-1AGCGCATAATGAATCG-1AGCGCGGGTGCCAATG-1‘AGCGGACACTTCGTAG-1’AGCGGCGGTTAGCGGT-1“AGCGGGTCTGACACTC-1”AGCGTGGTATTCTACT-1•AGCTAAGTACGCAGGC-1–AGCTAGAAGCAGAAGT-1—AGCTATTTAATCCAAC-1˜AGCTCCATATATGTTC-1™AGCTCCTTCGCACATC-1šAGCTCTAGACGTTCCA-1›AGCTCTTCCCAGTGCA-1œAGCTCTTCGTAACCTT-1AGCTCTTTACTCAGTT-1žAGCTGAAGTAAACCAA-1ŸAGCTGTAACCTCAATC-1 AGCTTCTTCTCGAGCA-1¡AGCTTGATCTTAACTT-1¢AGGAAGCTGTCCGCCG-1£AGGACAGTCGAATCCC-1¤AGGACGACCCATTAGA-1¥AGGACGCTCGATGTTG-1¦AGGAGGCCTTCGCGCG-1§AGGATAAAGTCGGGAT-1¨AGGATATAGGGATTTA-1©AGGATATCCGACTGCA-1ªAGGATCACGCGATCTG-1«AGGCAGATGCGTAAAC-1¬AGGCAGGGAGCGTACT-1­AGGCATTGTCGTAGGG-1®AGGCCACCCGTTATGA-1¯AGGCCCTAGAACGCCA-1°AGGCCTGAGAATCTCG-1±AGGCGGTTTGTCCCGC-1²AGGCGTCTATGGACGG-1³AGGCTTCCCGAAGAAG-1´AGGGAAACGAGGTACT-1µAGGGACCGGCTGCGTT-1¶AGGGACTCTACGCGAC-1·AGGGAGACATACTTCG-1¸AGGGCGAGCAGCTGAT-1¹AGGGCTGCAGTTACAG-1ºAGGGTCAGTAACCCTA-1»AGGGTCGATGCGAACT-1¼AGGGTGCTCTCGAGGG-1½AGGGTTCCCTTTGGTT-1¾AGGGTTTAGTTCGGGA-1¿AGGTAGGTACAAAGCT-1ÀAGGTATAATTGATAGT-1ÁAGGTCAGGTGAGAGTG-1ÂAGGTCGCGGAGTTACT-1ÃAGGTGCACGTCCACAT-1ÄAGGTGGTGACCTTCGC-1ÅAGGTTACACCATGCCG-1ÆAGGTTGAGGCACGCTT-1ÇAGGTTTCACACACCTT-1ÈAGTAACTATAGCAGCC-1ÉAGTACAGAAGCTTATA-1ÊAGTACATCATTTATCA-1ËAGTACGGGCACCTGGC-1ÌAGTACTCTTATGCCCA-1ÍAGTAGGAAGGAAGTTG-1ÎAGTATGCTGGAGACCA-1ÏAGTATTTGGCACGACC-1ÐAGTCAACACCACCATC-1ÑAGTCAAGATGACACTT-1ÒAGTCACTAGCTCTCGA-1ÓAGTCCATTGGCTGATG-1ÔAGTCCCGCCTTTAATT-1ÕAGTCGACGGTCTCAAG-1ÖAGTCGGCCCAAACGAC-1×AGTCGGCTCAACTTTA-1ØAGTCGGTTGCGTGAGA-1ÙAGTCGTATAAAGCAGA-1ÚAGTCGTCGACCACCAA-1ÛAGTCGTGGGCATTACG-1ÜAGTCTAAAGTATACTC-1ÝAGTCTCACAAGACTAC-1ÞAGTCTTCTCCTCAAAT-1ßAGTCTTTAAAGTGTCC-1àAGTGAACAAACTTCTC-1áAGTGACCTACTTTACG-1âAGTGAGACTTCCAGTA-1ãAGTGAGCCTCGCCGCC-1äAGTGAGTCGAATTAAC-1åAGTGATAACCTGCGCG-1æAGTGATATGAGTAGTT-1çAGTGATTCAAGCAGGA-1èAGTGCACGCTTAAGAA-1éAGTGCGTAGCTCGTAA-1êAGTGCTAAACACAGCA-1ëAGTGCTTGCACGAATA-1ìAGTGGCCCGCAAATGG-1íAGTGGCGGCAATTTGA-1îAGTGGCGTCTGAAGGT-1ïAGTGGCTCCGTCGGCC-1ðAGTGGTGTTACCCGTG-1ñAGTGTATTGCGCATTG-1òAGTTAAACACTTGCGA-1óAGTTAAGCGGTCCCGG-1ôAGTTAAGTCAACCGCT-1õAGTTACTCTATCGTGG-1öAGTTCCTACAGAATTA-1÷AGTTCCTATTTATGTT-1øAGTTGACGGTCCTTGC-1ùAGTTGGCAAGGCTAGA-1úAGTTTGCACCTGCCTC-1ûAGTTTGGCACGGGTTG-1üAGTTTGGCCAGACCTA-1ýATAAACGGACCCGTAA-1þATAAACGTTGCACCAC-1ÿATAAAGGCTCGGTCGT-1ATAAATATTAGCAGCT-1AATAGAATCTGTTTCA-1AATAGCTACCGCGTGC-1AATAGTCCGTCCCGAC-1AATATCCTAGCAAACT-1AATATCGAATCAATGC-1AATATCGAGGGTTCTC-1AATATTGGAGTATTGA-1AATCATGTAAAGACTC-1 AATCGCCTCAGCGCCA-1 AATCGCGCAGAGGACT-1 AATCGGTATAGCCCTC-1 AATCGTGAGCCGAGCA-1 AATCTAGGTTTACTTG-1AATCTATGCCGGAGCC-1AATCTCTACTGTGGTT-1AATCTGCGTTGGGACG-1AATCTGGCTTTCTAGT-1AATGACAGCAATGTCT-1AATGACGTAGGATGTC-1AATGACTGTCAGCCGG-1AATGATGATACGCTAT-1AATGATGCGACTCCTG-1AATGCAACCGGGTACC-1AATGCACCAAGCAATG-1AATGTGCCCGAGGTGT-1AATGTTGTCGTGAGAC-1AATTAAAGGTCGGCGT-1AATTAACGGATTTCCA-1AATTACGAGACCCATC-1AATTAGCGCTGCAGCG-1AATTCATAAGGGATCT-1 AATTCATTGTCATGCA-1!AATTCCAAGCATGTAC-1"AATTCGATTCGAGGAT-1#AATTCTAGAGTTAGGC-1$AATTGAACGCTCTGGT-1%AATTGCAGCAATCGAC-1&AATTTGGGACATAGTA-1'ACAAACCATGCGTCCT-1(ACAAAGAAGGTAGGCC-1)ACAAAGCATGACCTAG-1*ACAAATCGCACCGAAT-1+ACAAATGGTAGTGTTT-1,ACAACAGCATGAGCTA-1-ACAAGCAGTGCCTAGC-1.ACAAGGAAATCCGCCC-1/ACAAGGACAAGAGGTT-10ACAAGGATGCTTTAGG-11ACAAGGGCAGGCTCTG-12ACAATAGTCGTACGTT-13ACAATCCATTTAAACC-14ACAATGAATACGGAGA-15ACAATTGTGTCTCTTT-16ACAATTTGAGCAGTGG-17ACACAAAGACGGGTGG-18ACACACCAGGACCAGT-19ACACATGATCAAATCT-1:ACACCCAGCATGCAGC-1;ACACCTTAAGTAGGGC-1<ACACCTTACTACTTGC-1=ACACGAGACTCCTTCT-1>ACACGGGAACTTAGGG-1?ACACGTAGGCCACAAG-1@ACACTGATCAAGGTGT-1AACAGAACTGAGAACAA-1BACAGCGACATTCTCAT-1CACAGGCACGGATCCTT-1DACAGGCTTGCCCGACT-1EACAGGTGGAGGTGAGG-1FACAGTAATACAACTTG-1GACATAAGTCGTGGTGA-1HACATAATAAGGCGGTG-1IACATCCCGGCCATACG-1JACATCCTGGTAACTGT-1KACATCGATCGTTTACC-1LACATCGGTCAGCCGCG-1MACATCGTATGCAATGG-1NACATGGCGCCAAAGTA-1OACATTAGTTTATATCC-1PACATTTGAAACCTAAC-1QACCAAACACCCAGCGA-1RACCAACACCACACACT-1SACCAACCGCACTCCAC-1TACCAACGCTTATTTAT-1UACCAAGTCATCGGCAG-1VACCAATATGCAAGTTA-1WACCACAAGTTTCTATC-1XACCACCAATGTAACAA-1YACCACGTGCAGCTATA-1ZACCAGACCATAACAAC-1[ACCAGTGCGGGAGACG-1\ACCATATCCGCAATAA-1]ACCATCCGCCAACTAG-1^ACCATCGTATATGGTA-1_ACCCAACGCCCGTGGC-1`ACCCATCTTGAGGGTA-1aACCCATTTGTCCCTCT-1bACCCGGAAACTCCCAG-1cACCCGGATGACGCATC-1dACCCGGTTACACTTCC-1eACCCGTGTCATCAGTA-1fACCCTATGCCATATCG-1gACCCTCCCGTCAGGGC-1hACCCTCCCTTGCTATT-1iACCCTGGTAACGCCCT-1jACCGAAGAGTCTGGTT-1kACCGACACATCTCCCA-1lACCGACTGAGTCCCAC-1mACCGAGTCTCCTTATT-1nACCGATGGTAGCATCG-1oACCGCAATAACTGCCT-1pACCGCGGTGGAAGTCG-1qACCGGGCCTTTGTTGA-1rACCGGTCAGGTACACC-1sACCGTCCACTGGGCCC-1tACCTAAGTACCTTTCA-1uACCTAATCGACTTCCT-1vACCTACAGTATGTGGT-1wACCTACTATAAATCTA-1xACCTCCGCCCTCGCTG-1yACCTCCGTTATTCACC-1zACCTGCGTGTCATGTT-1{ACGAAATGGGCGGCAC-1|ACGACTCTAGGGCCGA-1}ACGAGGATACCACTCT-1~ACGAGGTTTACAACGT-1ACGAGTACGGATGCCC-1€ACGATACATAGAACTA-1AACGCATGATCTGGGT-1‚AACGCGGTCTCCAGCC-1ƒAACGCTGTTGCTGAAA-1„AACGGACGTACGTATA-1…AACGGCCATCTCCGGT-1†AACGTACTGTGGGTAC-1‡AACGTCAGACTAGTGG-1ˆAACGTCGCTGCACTTC-1‰AACGTGCGAAAGTCTC-1ŠAACTACCCGTTTGTCA-1‹AACTAGGCTTGGGTGT-1ŒAACTCAAGTTAATTGC-1AACTCCAGAGCGTGTT-1ŽAACTCCTAATCCCATG-1AACTCTCAATAGAGCG-1AACTCTCAGTGTGCTC-1‘AACTGGGTCCCGACGT-1’AACTTGCCCGTATGCA-1“AAGACATACGTGGTTT-1”AAGACCAAATAACTCA-1•AAGACCCAACTGAACA-1–AAGACTGCAAGCTACT-1—AAGAGCTCTTTATCGG-1˜AAGAGGATGTACGCGA-1™AAGAGGCATGGATCGC-1šAAGAGGCCCTTTGGAA-1›AAGATGGCACCGGACC-1œAAGATTGGCGGAACGT-1AAGCACCCTGCGTATC-1žAAGCATACTCTCCTGA-1ŸAAGCCGAAGCGGTTTA-1 AAGCGCAGGGCTTTGA-1¡AAGCGTCCCTCATCGA-1¢AAGCTAGATCGAGTAA-1£AAGCTCGTGCCAAGTC-1¤AAGCTCTTTCATGGTG-1¥AAGGAGCGGTTGGTGC-1¦AAGGATCGATCGCTTG-1§AAGGATGAGGGACCTC-1¨AAGGCGCGTAAAGCTT-1©AAGGCTGTGCTCATCG-1ªAAGGGAACGACTGGCT-1«AAGGGACAGATTCTGT-1¬AAGGGACTATGCATTC-1­AAGGGTTTGATTTCAG-1®AAGGTATCCTAATATA-1¯AAGGTGATAAACCAGC-1°AAGTAGTGACGCGAGG-1±AAGTCAATTGTCGTCA-1²AAGTCTTCTGTGGCCT-1³AAGTGACGACCGAATT-1´AAGTGAGTCGGGTTTA-1µAAGTGCCTTGACTGTA-1¶AAGTGCGTTAGAATCT-1·AAGTGTTTGGAGACGG-1¸AAGTTCACTCCAAGCT-1¹AAGTTCAGTCTGCGTA-1ºAAGTTCGGCCAACAGG-1»AAGTTGTGATGTTATA-1¼AAGTTTATGGGCCCAA-1½AATAACAACGCTCGGC-1¾AATAACACTAGAACAA-1¿AATACCTGATGTGAAC-1ÀAATAGAACAGAGTGGC-1ÁAAATCGCGGAAGGAGT-1ÂAAATCGTGTACCACAA-1ÃAAATCTAGCCCTGCTA-1ÄAAATGATTCGATCAGC-1ÅAAATGGCCCGTGCCCT-1ÆAAATGGTCAATGTGCC-1ÇAAATTAACGGGTAGCT-1ÈAAATTACACGACTCTG-1ÉAAATTACCTATCGATG-1ÊAAATTCCAGGTCCAAA-1ËAAATTGATAGTCCTTT-1ÌAAATTTGCGGGTGTGG-1ÍAACAACTGGTAGTTGC-1ÎAACACACGCTCGCCGC-1ÏAACACGAGACGCGGCC-1ÐAACAGGATGGGCCGCG-1ÑAACAGGTAGTATGGAT-1ÒAACATATCAACTGGTG-1ÓAACATCGATACGTCTA-1ÔAACATTGTGACTCGAG-1ÕAACCAAGACTTCTCTG-1ÖAACCCATCCCATGATC-1×AACCCGAGCAGAATCG-1ØAACCCTACTGTCAATA-1ÙAACCGAGCTTGGTCAT-1ÚAACCGCTAAGGGATGC-1ÛAACCTCGCTTTAGCCC-1ÜAACCTTTAAATACGGT-1ÝAACCTTTACGACGTCT-1ÞAACGAAAGTCGTCCCA-1ßAACGATAATGCCGTAG-1àAACGATATGTCAACTG-1áAAACTGCTGGCTCCAA-1âAAACTTAATTGCACGC-1ãAAACTTGCAAACGTAT-1äAAAGAATGTGGACTAA-1åAAAGGCTACGGACCAT-1æAAAGGCTCTCGCGCCG-1çAAAGGGATGTAGCAAG-1èAAAGTAGCATTGCTCA-1éAAAGTGTGATTTATCT-1êAAAGTTGACTCCCGTA-1ëAAATAACCATACGGGA-1ìAAATAAGGTAGTGCCC-1íAAATACCTATAAGCAT-1îAAATAGCTTAGACTTT-1ïAAATAGGGTGCTATTG-1ðAAATCCGATACACGCC-1ñAAACCGTTCGTCCAGG-1òAAACCTAAGCAGCCGG-1óAAACGAAGATGGAGTA-1ôAAACGAGACGGTTGAT-1õAAACGGGCGTACGGGT-1öAAACGGTTGCGAACTG-1÷AAACTCGGTTCGCAAT-1øAAACTCGTGATATAAG-1ùAAACAGGGTCTATATT-1úAAACATGGTGAGAGGA-1ûAAACATTTCCCGGATT-1üAAACCGGGTAGGTACC-1ýAAACAGAGCGACTCCT-1þAAACAGCTTTCAGAAG-1ÿAAACACCAATAACTGC-1AAACAAGTATCTCCCA-1GCATTGTAATTCATAT-1GCATTTCCAAGGCTCC-1GCCAACCATTTCCGGA-1GCCAAGAATACTTCTG-1GCCAATAGGGCATCTC-1GCCACAATTTAAGGAC-1GCCACTCAGAGCGCGA-1GCCAGGAGTAACCGAT-1 GCCATATTGCACACAG-1 GCCATCGAGCTGCGTG-1 GCCATCGATGCTGCAT-1 GCCATTAGCCTCAAAC-1 GCCCGACTTCTTCCCG-1GCCCGAGAGTCTAAAT-1GCCCGATCTGTGGTCG-1GCCCGCGCGTAAACGG-1GCCCGTAATACCTTCT-1GCCCTAGCCGTCGCGA-1GCCCTGAGGATGGGCT-1GCCGAAATTCCTACGT-1GCCGATTGGCCAAGCT-1GCCGCTTGTGAGAAAC-1GCCGGGTTAGGGTCGC-1GCCGTGGAAGAAATGT-1GCCTACGTTCTGTGCA-1GCCTATAGTGTCAGGG-1GCCTCATCTGGAAATA-1GCCTCCGACAATTCAC-1GCCTCTATACATAGCA-1GCCTTTGTCAGTGGAC-1GCGAAACGATCGGGAG-1 GCGAAACTTAACTGGA-1!GCGAAGAATCTGACGG-1"GCGAAGCCATACCCGT-1#GCGACATGTAAACATC-1$GCGACGATAGTTGTAC-1%GCGAGAGGCCATGTAA-1&GCGAGAGTTGCGTCCA-1'GCGAGCGCATGCTCCC-1(GCGAGGCCCGAGCAGA-1)GCGAGTTCTGCAAAGA-1*GCGATTGTTAACGTTA-1+GCGCAAATATATTCAA-1,GCGCAAGAGCGCGCTG-1-GCGCATCCAGTCAGCA-1.GCGCCGTTCCACGATA-1/GCGCCTCCCACTCCGA-10GCGCGGTCTAGTAACT-11GCGCGTCATTGGTACA-12GCGCTAATTGAATAGA-13GCGCTATGCCGAGGCA-14GCGCTGATCCAGACTC-15GCGCTGCTTTGCATTT-16GCGCTTAAATAATTGG-17GCGGACCGCGTTGTGG-18GCGGAGAAACTTCGCA-19GCGGAGAGGGAGAACG-1:GCGGATTACTTGTTCT-1;GCGGCAAAGTATTGCC-1<GCGGCTCTGACGTACC-1=GCGGCTTTAGCAAGTT-1>GCGGGCGAGCCTTACC-1?GCGGTCTTGCTTTCAC-1@GCGGTGAACTGCGCTC-1AGCGGTTCCCTATCATG-1BGCGTAAATGGCCATAA-1CGCGTCGAAATGTCGGT-1DGCGTCGCCAGGGTGAT-1EGCGTCTCTGCATTGGG-1FGCGTGGTACTGGGTTA-1GGCGTTCGGAGACCGGG-1HGCTAACTGAAGTCTGA-1IGCTAAGCCCAGTATGC-1JGCTAAGTAGTTTCTCT-1KGCTAATACCGAATGCC-1LGCTACAATCGAGGATA-1MGCTACAGTACGGACCG-1NGCTACGACTTATTGGG-1OGCTACTATAGTAGAGT-1PGCTAGACCGTCTACTG-1QGCTAGAGTAGAGATGT-1RGCTAGCAGGGAGTGGG-1SGCTAGCTTGAATAGCT-1TGCTAGGCACCACGGAG-1UGCTAGTAGAGCTTGTA-1VGCTATACGTCTCGGAC-1WGCTATCATACTCATGG-1XGCTATGCCAGCTTATG-1YGCTCAATCCGTTTATT-1ZGCTCAATGTAATACCG-1[GCTCATTACTGCATGT-1\GCTCCCAGTCGGTCCA-1]GCTCCGCTCGCTTCAG-1^GCTCCTGACATACTGG-1_GCTCGCTCATGTCCAA-1`GCTCGGAATTTAAAGC-1aGCTCTAAACCCTGACG-1bGCTCTATGTTACGTGC-1cGCTCTCGGGTACCGAA-1dGCTCTTTCCGCTAGTG-1eGCTGAATCTTCCAATC-1fGCTGAGGCGTGAGTAT-1gGCTGCACGGTTTCTTA-1hGCTGCTAAGTAGTCGA-1iGCTGCTACTGCGTAGC-1jGCTGCTCTCCGGACAC-1kGCTGGACCCAAAGTGG-1lGCTGGCATATTCACCT-1mGCTGGCGGCGCATGCT-1nGCTGGTGACTCGTAGT-1oGCTGGTTTAGGCCATA-1pGCTGTATTACTGGCCC-1qGCTGTTGCTACCGAAC-1rGCTTAATGTAACTAAC-1sGCTTACGTAGTTAGTA-1tGCTTATGAAGCAGGAA-1uGCTTCCATGTAACCGC-1vGCTTCCGTCCCTAGAC-1wGCTTGAGTGACCTCTG-1xGCTTGGATCGATTAGG-1yGCTTTCAGAGGAGGTG-1zGGAAACCTTGTTGAAT-1{GGAAACTAAATGGGCC-1|GGAAAGTGCCCATGCC-1}GGAACCGTGTAAATTG-1~GGAACCTTGACTCTGC-1GGAACTTTGGCGATTA-1€GGAATGCGCTAGCGTG-1GGACAACCATGAAGCC-1‚GGACACAAGTTTACAC-1ƒGGACCAACAGGATAAC-1„GGACCTACGGTAACGT-1…GGACCTCTAGGCCGCC-1†GGACGTCCATAGTTGG-1‡GGACTCTTTGACTAAG-1ˆGGAGAAGTCATTGGCA-1‰GGAGACCATCTACATA-1ŠGGAGACGACACCTTTG-1‹GGAGCAACATTTCAAG-1ŒGGAGCACCAAGAACTA-1GGAGCGAGGCCTACTT-1ŽGGAGGGCTTGGTTGGC-1GGAGTTGATTCTGTGT-1GGATCAGAGCCATCAG-1‘GGATCATCCCGTACGC-1’GGATCCGGAATATACT-1“GGATCTTGACTCAACC-1”GGATGAAGATCGCTGA-1•GGATGACGCGAGTTTA-1–GGATGGCTTGAAGTAT-1—GGATGTCCTTACCGCA-1˜GGATTAATCATGGACC-1™GGATTCCGCTATACCC-1šGGATTGCTGTGACTCC-1›GGATTTCACTTCTATA-1œGGCAAAGGCGCCAATA-1GGCAAATTACTTTACT-1žGGCAAGCCCATAGTGG-1ŸGGCAAGGCGAAATAGC-1 GGCAATAGTCAATGAG-1¡GGCACGCTGCTACAGT-1¢GGCACTCCACTGGGCA-1£GGCACTGCGGTGGTTT-1¤GGCAGCAAACCTATGC-1¥GGCAGCGGTAATCCTA-1¦GGCATACAGGTAGCGG-1§GGCATATCGGTTCTGC-1¨GGCCAATTGTATAGAC-1©GGCCCAGCTGGTTTGC-1ªGGCCCTCACCCACTTA-1«GGCCGGCGTCTGCTAT-1¬GGCCGTTTGGGTTTCA-1­GGCCTGCTTCTCCCGA-1®GGCGAAATCTAACTTG-1¯GGCGAGCGAAACGGCA-1°GGCGCAGGACATCTTC-1±GGCGCATGAATTGATG-1²GGCGCGGAGATCTTTC-1³GGCGCGTTCGAGTTTA-1´GGCGCTTCATTCCCTG-1µGGCGGAGTAATATTAG-1¶GGCGGTAGGATCATTG-1·GGCGTAGGGAAAGCTG-1¸GGCGTCCTATCCGCTG-1¹GGCTAAAGGGCGGGTC-1ºGGCTAATGATTGAAAT-1»GGCTATTAAGTTGTAT-1¼GGCTCGCGTTGAGGTA-1½GGCTCTGCTCCAACGC-1¾GGCTGAAATAGCAAAG-1¿GGCTTTCAATAAGGGT-1ÀGGGAAAGAATGCCAAC-1ÁGGGAACGGGAGGTTAG-1ÂGGGAAGACGGTCTGTC-1ÃGGGAAGGGCTTTCTCA-1ÄGGGAATGAGCCCTCAC-1ÅGGGACAGAGTTACTCC-1ÆGGGACCCGTATATCTT-1ÇGGGACTGCATAGATAG-1ÈGGGAGAACTCACAGTA-1ÉGGGAGCGACCGTAGTG-1ÊGGGAGGATGCCCGAAA-1ËGGGAGTTAATGAGGCG-1ÌGGGATGGTCGTAACCG-1ÍGGGATTTACCGCACCT-1ÎGGGCAACCGCACGTGC-1ÏGGGCACTATTGACCAT-1ÐGGGCAGACGTCACTGC-1ÑGGGCAGAGCAATCGTT-1ÒGGGCAGTCAACGCCAA-1ÓGGGCCCGTCTTAAACA-1ÔGGGCCGGCCGAAGTAC-1ÕGGGCCTAAATGGGCTA-1ÖGGGCGATATGTGTGAA-1×GGGCGGCAAATGAATT-1ØGGGCGGGTTCCCTACG-1ÙGGGCGTACATTTATAT-1ÚGGGCGTCACCACGTAA-1ÛGGGCGTCCACTGGCTC-1ÜGGGCGTGGTTTCCCAG-1ÝGGGCTACTATTTCGTG-1ÞGGGCTATGATCGATGG-1ßGGGCTCATCGAACCCA-1àGGGCTGCCTAGGGCGA-1áGGGCTGGTTAGTCGCG-1âGGGTACTTCATGAACT-1ãGGGTATGTATGCACTT-1äGGGTATTCTAGCAAAC-1åGGGTCACCGTGACGGT-1æGGGTCAGGAGCTAGAT-1çGGGTCGTGGCAAGTGT-1èGGGTCTATCGCTTTCC-1éGGGTGACACCTTAACT-1êGGGTGCATATGAAAGC-1ëGGGTTAACATTTGAGT-1ìGGGTTTAGGATAGGAT-1íGGTAACCGGGAGGATA-1îGGTACAAACATGCTAT-1ïGGTACCATTAAGACGG-1ðGGTACGTTGCGGCCGG-1ñGGTAGAAGACCGCCTG-1òGGTAGACCGTTGGGCG-1óGGTAGTGCTCGCACCA-1ôGGTATAGTGACACATA-1õGGTATTGCCGAGTTTA-1öGGTCAAGACTACTTCG-1÷GGTCAGTGGGTCCCAC-1øGGTCGGATAAACGGCG-1ùGGTCGGCCAGGAGCTT-1úGGTCGGTCGTCCACAG-1ûGGTCGTAAGCTCGCAC-1üGGTCTCCGTCCAGGTT-1ýGGTCTCTGAATGGACT-1þGGTCTGAGAATCTGGA-1ÿGGTCTTGAGCGCTCTT-1GGTGAAGTACAGGGAT-1GGTGATAAGGAGCAGT-1GGTGCAGAGCCTATCG-1GGTGCTGGTACACATT-1GGTGGACTGCTCTGGC-1GGTGTAAATCGATTGT-1GGTTACCACCCTCGGG-1GGTTAGCTATATGTCT-1GGTTAGGCTTGGAGAA-1 GGTTCGGATTATACTA-1 GGTTCTACTCGTCTGA-1 GGTTTAATTGAGCAGG-1 GGTTTACAATCTCAAT-1 GGTTTAGCCTTTCTTG-1GGTTTCAATCGGTCAG-1GGTTTGACAAGAAGCT-1GGTTTGTGACCTGAGG-1GTAACATCTAAGATAA-1GTAAGCGGGCAGTCAG-1GTAAGTAACAGTCTGG-1GTAAGTAGGGTATACC-1GTAATAAAGGGCTCCC-1GTAATCTGATTCTTCG-1GTACACTTACCTGAAG-1GTACAGAGGCAAGGGT-1GTACGAGATTGCGACA-1GTACGCTTCATTGCAC-1GTACGTCACGTATTAA-1GTACGTTTGCCCGTCA-1GTACTAAGATTTGGAG-1GTACTCCCTTATCGCT-1GTACTCCTGGGTATGC-1 GTACTGGAGTTAGACC-1!GTAGACACGCCTGACT-1"GTAGAGGGAGACAAGT-1#GTAGCCAAACATGGGA-1$GTAGCGGCTATACACT-1%GTAGCTTCCTCTTGTT-1&GTAGGTGATCCGTGTA-1'GTAGTCGCGGGAATCA-1(GTAGTCTACGATATTG-1)GTAGTGAGCAACCTCA-1*GTATAGGACTCAGTAG-1+GTATCAAACGTTAGCT-1,GTATCCTTTGGTAACC-1-GTATCTCAGTCTTGAC-1.GTATCTTTCATAACCA-1/GTATGAAATTTCACTC-10GTATGTGGGTCTAGTT-11GTATTCTGAGAAACGA-12GTCAAAGAAGTGGTGT-13GTCAACCAGGCCTATA-14GTCAAGCGGACTCGGG-15GTCAGAATAGTCTATG-16GTCATGCACCTCCGTT-17GTCATGCGCGAGGGCT-18GTCATGGACATGACTA-19GTCATTAGAGCGAACG-1:GTCCAATATTTAGCCT-1;GTCCATTACTGCTACG-1<GTCCCAACGTAAAGTA-1=GTCCCAATCATCCCGC-1>GTCCCGCGACGTTATG-1?GTCCGGACCTGAAATT-1@GTCCGGCTGAATTGCG-1AGTCCGGGTTCACATTA-1BGTCCTACGAATAGTCT-1CGTCCTACTCTACGGGC-1DGTCGCCGTTGTGTGTT-1EGTCGCGTAACCCGTTG-1FGTCGGAAGGATACCAG-1GGTCGGATATCTCAGAC-1HGTCGGATGTAGCGCGC-1IGTCGGGAACATGGTAG-1JGTCGGGAAGCAGAAAC-1KGTCGTACCATCTCGGG-1LGTCGTACCTACGATTG-1MGTCGTATTGGCGTACA-1NGTCGTGTCTGGTCATC-1OGTCGTTATTCGCTTAT-1PGTCTAGTGAGCCGCTT-1QGTCTATCTGAGTTTCT-1RGTCTATTGCATGCTCG-1SGTCTATTGGTTCCGGT-1TGTCTCAAGGCCCGGCT-1UGTCTCCCGAGTCCCGT-1VGTCTCCTGCCAGTATG-1WGTCTCGACTAAGTTTG-1XGTCTCGATCTGCTTTC-1YGTCTGGGCGGTCGAGA-1ZGTCTTACCACGCCAAG-1[GTCTTGTAGCTATTCA-1\GTGAAACGGCGCCACC-1]GTGAACTCCCATTCGA-1^GTGAAGATTTCAAGTG-1_GTGAAGCCGTATAGTC-1`GTGAAGTCACGACTCG-1aGTGACAGCTTCCCACT-1bGTGACCGCACACTACG-1cGTGACGAGGGTGACCC-1dGTGACGCAGGTTTCAT-1eGTGACTTCAGTAGTGC-1fGTGAGCGTGCTGCACT-1gGTGAGGACACTTAAGG-1hGTGAGGAGCGGTTGAG-1iGTGAGTCGACTAATAG-1jGTGAGTGGTACAACGC-1kGTGATCACTAACGCCT-1lGTGATCATAGATCTGC-1mGTGATCCTTGTCATGA-1nGTGATGCACAACATCT-1oGTGATTCGCCGCTCAA-1pGTGCACCAGCTTCAAC-1qGTGCACGAAAGTGACT-1rGTGCCATCACACGGTG-1sGTGCCCGTTCGGATTC-1tGTGCCGCTTCAAAGGT-1uGTGCCTGAGACCAAAC-1vGTGCGAAATCGAACAC-1wGTGCGACAGGGAGTGT-1xGTGCGGGTCTCCAAAT-1yGTGCGTGTATATGAGC-1zGTGCTCAAGTACTGTC-1{GTGGAACCTACATGCG-1|GTGGACCAACCCGATT-1}GTGGACGCATTTGTCC-1~GTGGAGCGTTTACCGA-1GTGGAGTCGGCGGTTG-1€GTGGCAAACAGCGGCA-1GTGGCGGTCCCAGCGT-1‚GTGGCTGTTTCTGTTC-1ƒGTGGGAAGACTGAATC-1„GTGGGCTTAGACACAC-1…GTGGGTACTGAGCGTA-1†GTGGTATAGTCTGCCG-1‡GTGGTGGCCAAGTGAA-1ˆGTGGTTACTTCTTTCG-1‰GTGGTTTCCGCCTTTC-1ŠGTGTACCTTGGCTACG-1‹GTGTATATCAGCGGGC-1ŒGTGTCGTATAGCGTTC-1GTGTGAATAACTTAGG-1ŽGTGTTACTATGCGTCC-1GTTAAAGTAGGACTGG-1GTTAACATCACTTAAA-1‘GTTAACTATGTTGTCA-1’GTTAAGGGTGCGATGT-1“GTTACAATTGGTGACG-1”GTTACCTACAACTTGC-1•GTTACTTTGGGCCTAG-1–GTTAGCCCATGACATC-1—GTTAGCCGTAAATCAA-1˜GTTAGGCTACCCGTTT-1™GTTATAATACGGTGAA-1šGTTATATCAGGAGCCA-1›GTTATATTATCTCCCT-1œGTTATCAAGCTATCGA-1GTTCACAGGAGTCTAG-1žGTTCATCGTTTGGCTG-1ŸGTTCGCCATAAGTGCC-1 GTTCGCTGAGACGTCT-1¡GTTCGGATCGGGAACA-1¢GTTCGGGCGTACCATT-1£GTTCGTCTAAAGAACT-1¤GTTGAACCGGTTCCAT-1¥GTTGAGTCCCGCCGGT-1¦GTTGCACGGAGTTTCG-1§GTTGGACCGCATCAGG-1¨GTTGGATTCAGTGGCT-1©GTTGGATTGAGAACAC-1ªGTTGGATTTGCGTTGG-1«GTTGGTCATGCTATCC-1¬GTTTACGTTCCATCTG-1­GTTTCAAACGAGTTGT-1®GTTTCATATCGTCGCT-1¯GTTTCCTGGAGGGTGA-1°GTTTCTAGAGGCGCGG-1±GTTTCTGCAGTCTCCC-1²GTTTGACCAAATCCTA-1³GTTTGGCCCAAGTTAT-1´GTTTGGGCTTGTGAGC-1µGTTTGGGTTTCGCCCG-1¶GTTTGGTAGGGTCAAC-1·GTTTGTTAGCCAAGTA-1¸TAAACCCAGGAGGGCA-1¹TAAAGCGGTATTTCCA-1ºTAAAGCGTTAGGAGAA-1»TAAAGCTGCAATAGGG-1¼TAAATGCCGTCTCATG-1½TAACATACAATGTGGG-1¾TAACATACACGCGATC-1¿TAACCTACCGTCCGAG-1ÀTAACCTAGGGAGTCCA-1ÁTAACTATTACGCCAAA-1ÂTAACTCATCCGCGCGG-1ÃTAAGAGGGACAGGGAC-1ÄTAAGCCCTTACGACCA-1ÅTAAGGCAACATAAGAT-1ÆTAAGGCATAACATCAA-1ÇTAAGGCCCGTCACCCT-1ÈTAAGGCTGAATCCCTC-1ÉTAAGGGCCTGTCCGAT-1ÊTAAGTAACATCTTGAC-1ËTAAGTCGCCGAGTATC-1ÌTAAGTTGCGACGTAGG-1ÍTAATAAACAAGGAGAT-1ÎTAATACACAGTAGTAT-1ÏTAATACTAGAACAGAC-1ÐTAATAGAACAGAGTTA-1ÑTAATAGGTCACCAGAA-1ÒTAATAGTGACGACCAG-1ÓTAATCGATCCGTACGT-1ÔTAATTACGTCAGTAGA-1ÕTAATTAGGACATCCGT-1ÖTAATTGGAATCGGGAA-1×TAATTTCCGTCCAGTA-1ØTACAACAGCGCATACA-1ÙTACAACGCACAACTCA-1ÚTACAAGGGCTTCTTTA-1ÛTACAAGTCTCGTGCAT-1ÜTACACAGCCGTGGTGC-1ÝTACACCTCTTCGAATC-1ÞTACAGAAACGGTGGGC-1ßTACATAGGCATACACC-1àTACATCCCTATCCCTG-1áTACATTTCTAACGTGC-1âTACCAAATAGCCCAGA-1ãTACCAATAAAGTACCA-1äTACCAGAAGTAGGTTC-1åTACCGAATAATTGTAA-1æTACCGCGGACTTGCAG-1çTACCGGCTCACTGCCC-1èTACCGGTCGTTTCCAT-1éTACCGTAGGTTAACTA-1êTACCGTGCCTCGGACC-1ëTACCTACTCCCAGTAT-1ìTACCTATCCCTAGAGG-1íTACCTCAGTTGTCTGT-1îTACCTTAAGATTTCCC-1ïTACGAACACGACTTCA-1ðTACGACGCTTGCTGCG-1ñTACGACTGCCTCTTAG-1òTACGAGAACTTCACGT-1óTACGATGTTGATCATC-1ôTACGCAGTTCTTTCCT-1õTACGCCATATTCTAAT-1öTACGCCGAGGGTACCC-1÷TACGCCTCCATTCCGA-1øTACGCTATAGAAACCT-1ùTACGCTCGGTATTGGA-1úTACGGAAGCCAAACCA-1ûTACGGGATGCTAGCAG-1üTACGGGTAATAACATA-1ýTACGTAAAGCGGAGTG-1þTACGTGGGCCCAGGGC-1ÿTACGTTTACCGGCAAT-1TACTACGTGCAATGCG-1CTGGGATAAATAATGG-1CTGGGCCTGCTATATC-1CTGGGTAGGCAGTTAA-1CTGGGTTGAGTTAAAG-1CTGGTAAAGACTTACA-1CTGGTAACACATAGAA-1CTGGTAACGAGCTCTT-1CTGGTTTCGAGCAAGA-1 CTGTACTTCTTAGCAT-1 CTGTAGCCATCTCACT-1 CTGTCAAATGGCTCGG-1 CTGTGCAGGGTAGGTC-1 CTGTGGTCGGGAGATA-1CTGTTACCCAATCTAG-1CTGTTCACTGCCTGTG-1CTTAACTTACAGTATA-1CTTAAGCAGCGAGCCG-1CTTACACGGTATTCCA-1CTTAGCCTTCCACATG-1CTTAGGTATAGACCAG-1CTTAGTAGGCCTACAG-1CTTAGTGTAGTAGCAT-1CTTATGCGCTCAGGGC-1CTTCAACTCCACTTGG-1CTTCAGTGGTCGCCTA-1CTTCAGTTGGACAACG-1CTTCATTGTCAGTGGA-1CTTCCGCTCCGTGAAG-1CTTCGATTGCGCAAGC-1CTTCGGCCAATTGTTT-1CTTCGTAGATAGGTGA-1 CTTCTATGTTGAAGTA-1!CTTCTATTAATGCTAG-1"CTTGAGTTAGGGTAAT-1#CTTGATGACCATCCAG-1$CTTGCAACCGCCTCCT-1%CTTGCCCACCCACGCA-1&CTTGCCCAGGCTCTAC-1'CTTGGCCAAGCTGGGA-1(CTTGTACTTGTTGACT-1)CTTGTCAACATTCGAG-1*CTTGTGCTCACCGATT-1+CTTGTTGCTGAGTCAA-1,CTTTAACTTTCAAAGG-1-CTTTAATATTGGTCGA-1.CTTTACCGAATAGTAG-1/CTTTAGGAACACTGTT-10CTTTAGTGCTATTATT-11CTTTCTGTGCGGGCTT-12CTTTGACGTCGCTTCT-13CTTTGCATCGCTCTTG-14CTTTGGCTTTAGTAAA-15CTTTGTCGAATGCTCC-16GAAACAGATGACCACC-17GAAACATAGGAAACAG-18GAAACCATGGTGCGCT-19GAAACCGAATTACCTT-1:GAAACCTATACAAATG-1;GAAAGAACAGCGTTAT-1<GAAAGCAGTGCACTTT-1=GAAAGCCCTTTGGACC-1>GAAATATCACCATCAG-1?GAAATATGCTTGAATG-1@GAAATCGCGCGCAACT-1AGAAATGGCGGTGTTAG-1BGAAATTAGCACGGATA-1CGAAATTGTCTCTATAA-1DGAACAACTGGGATGAA-1EGAACACACATCAACCA-1FGAACAGATTACTAAAT-1GGAACCCTCTGTGTTCT-1HGAACCTCGACCTACAC-1IGAACCTTTAACGATCC-1JGAACGACCGAATGATA-1KGAACGCGGGTCACACG-1LGAACGTCTCATGGTCG-1MGAACTGTGGAGAGACA-1NGAAGAAACGATATTGT-1OGAAGCCACTGATTATG-1PGAAGCCTGCACATTCC-1QGAAGCGTGAGGAATTT-1RGAAGCTCGGACCCGTC-1SGAAGCTTGCTGACCGC-1TGAAGGAGTCGAGTGCG-1UGAAGTCAGTTGCACTA-1VGAAGTCTCCCTAGCGA-1WGAAGTGATTTATCGTG-1XGAAGTTTCCACTCAAT-1YGAATAGACGCGACCCA-1ZGAATAGCCCTGCGGTC-1[GAATCGACATGGTCAC-1\GAATCTGAACATTCTC-1]GAATGCGAATCGGTTC-1^GAATGGGCTTATCGAC-1_GAATGTATGGCAGGTC-1`GAATGTGGTCCGGATT-1aGAATGTTGGGTAATCT-1bGAATTATAGTGAAAGG-1cGAATTCACCCGGGTGT-1dGAATTTCTCGCTGCAG-1eGACAAACATATGCAGG-1fGACAACGACCATTGAA-1GCOLGACAACGCAGCTTACG-1GACACAAGGGAAGAAA-1GACACAGCCGGGACTG-1GACACTGAGTTCAGTG-1GACACTGGAACCCGAT-1GACACTTCCAATTACC-1GACAGATTTCTGGCTC-1GACAGCCAGACCTGAC-1 GACAGGCACACACTAT-1 GACATCCGTCGAACTG-1 GACATCGATTTATAAC-1 GACCAAACGTTGACTG-1 GACCACACTTCCCTTT-1GACCAGAGCCCTGTAG-1GACCCAATTATGATAC-1GACCGACGTGAAAGCA-1GACCGACTGAAGCGTC-1GACCGCGTCTGACGTG-1GACCGTGCTGACGGTG-1GACCGTTACATGCGAC-1GACCTTCCACGTCTAC-1GACGACGATCCGCGTT-1GACGAGGCTAATAAAC-1GACGCATACCCGTCGG-1GACGCCGTAAAGGCTA-1GACGCTTGCTTCTAAA-1GACGGGTTGGCCCGTA-1GACGGTCAATAGAAGC-1GACGTGTAGGGATTAT-1GACTAAGATCATGCAC-1GACTAAGTAGGCTCAC-1 GACTACAAAGCGGTGG-1!GACTAGGCCGTTAGGT-1"GACTCACCCACGTGAG-1#GACTCCCAGAATAAGG-1$GACTCCTTCCAATTGA-1%GACTCGCGGGAATGAC-1&GACTGCAAATCGAGCT-1'GACTGCACCAGCCCAG-1(GAGAACGGTTCTGACT-1)GAGACCCTGCAACGCC-1*GAGACTGATGGGTAGA-1+GAGACTTCGCGACCGA-1,GAGAGGGCGCGAGGTT-1-GAGAGGTGCATTCTGG-1.GAGATCTGCTTGGCAT-1/GAGATCTGTCACTCCG-10GAGATCTTCCATGACA-11GAGATGGCTTTAATCA-12GAGATGGGAGTCGACA-13GAGCACCTGTGTCCAG-14GAGCCAGCTACCTGTG-15GAGCCGAGCGTTTATT-16GAGCGCAAATACTCCG-17GAGCGCGCACGAGTAG-18GAGCGCTGTTAGGTAA-19GAGCTAAGGGCATATC-1:GAGCTGTCGTCTCGGA-1;GAGGAATGGAGAGGTT-1<GAGGATAAACAGTGCT-1=GAGGCCCGACTCCGCA-1>GAGGCCTGTTGATACA-1?GAGGCTATCAAAGTCG-1@GAGGGCGCAGCTCTGC-1AGAGGTACGCGTGTCCC-1BGAGTAAGGCCACGGGA-1CGAGTAGATACTAGTTG-1DGAGTATGCCCGCCTTG-1EGAGTATGCGCGTGCAT-1FGAGTCAGACCAGAATC-1GGAGTCCGCTTACCGGA-1HGAGTCTTGTAAAGGAC-1IGAGTGTCAACCAGAAA-1JGAGTGTGCGGTACCCA-1KGAGTTCTGTGGGTGCT-1LGAGTTGATGGCAATTT-1MGATAACTCGCACTGTG-1NGATACGATGGGAGTCA-1OGATAGATAGTACAGTC-1PGATAGGTAACGTTGAC-1QGATATCAAGCAGGAGC-1RGATATGAGACACTAAC-1SGATATGCGGTAGCCAA-1TGATATTGAGATTGGCG-1UGATATTTCCTACATGG-1VGATCATTCCAAACATT-1WGATCCCTTTATACTGC-1XGATCCGGGAATTAACA-1YGATCCTAAATCGGGAC-1ZGATCCTCGACACTGGC-1[GATCGACACTATCTGA-1\GATCGCGGGCTCTCCA-1]GATCGCTACCCGATTT-1^GATCGCTATATCTCAG-1_GATCGGATAGAACCAT-1`GATCGGTGGCCATAAC-1aGATCGTGACTGATATC-1bGATCTAACCGTATTCA-1cGATCTGCTATCTAAGG-1dGATCTTGGAGGGCATA-1eGATCTTTGCAGGGTAT-1fGATGACAAGTAGGGCA-1gGATGACGATGATCGCG-1hGATGAGGAACCTTCGG-1iGATGCCTTCTGCGGCA-1jGATGCGTCCTGCATTC-1kGATGCTGTATTTCATC-1lGATGTAACGAACCACC-1mGATGTTCAATCCACGA-1nGATTAACCGAAAGCCC-1oGATTACTGAATTTGGG-1pGATTCCCTTGTCGCAG-1qGATTCCGCGTTTCCGT-1rGATTCGACGGTTCACG-1sGATTGGGAAAGGTTGT-1tGCAAACCCTACATTAT-1uGCAAACCTTGGCCATA-1vGCAAATATTACGCTTT-1wGCAAATGAGGACACTT-1xGCAACACACTAGAACT-1yGCAACAGCAGTATGCG-1zGCAACCACCAGACCGG-1{GCAACCACGGCCGCGT-1|GCAACGGCTAGTTATG-1}GCAAGAATTCCTTGGC-1~GCAAGATGTGTTCGCG-1GCAAGCTGGAAACCGC-1€GCAAGTGCACAGAGAA-1GCACAAACGAGGCGTG-1‚GCACAACCTCGGGCGT-1ƒGCACACACTGGTAGCC-1„GCACCTAGGCGAGTCC-1…GCACGCCGATTCCCGC-1†GCACGCCTACTTAGAT-1‡GCACGTGGTTTACTTA-1ˆGCACTGCCTACCTTTA-1‰GCAGACCCAGCACGTA-1ŠGCAGATCCATAAGACT-1‹GCAGATTAGGGATATC-1ŒGCAGCACACAGCCCAG-1GCAGCCTATATCACAT-1ŽGCAGCTATGGACAGGT-1GCAGCTGTCAACGCAT-1GCAGGAACTTAGATCT-1‘GCAGGACTATAGAATA-1’GCAGGTAGAGTATGGT-1“GCAGTGTGGCTATAGG-1”GCATAGAGCACTCAGG-1•GCATCGGCCGTGTAGG-1–GCATGAGGGACGCGGC-1—GCATGCTAATAACGAT-1˜GCATGGGTACTGACGC-1™GCATTCAAGGCAACGC-1šGCATTGACTTGCGGAA-1›CGTGCATTGTCGACGC-1œCGTGCCCTCCCGAAGA-1CGTGGCCGAATATCTA-1žCGTGTATGGGAGCTGA-1ŸCGTGTCCCATTCGCGA-1 CGTTAAACTAGTTAGG-1¡CGTTAATGTCCCGACG-1¢CGTTAGCTCACAACTG-1£CGTTATCATACTTCCA-1¤CGTTCAGACCCGCGAA-1¥CGTTCATGGTGCGCGT-1¦CGTTCTTCGCACACCT-1§CGTTGAATACCGCGCT-1¨CGTTGAGCGACCGTCG-1©CGTTGAGTAATTGCGT-1ªCGTTGTAAGATTGATT-1«CGTTGTCGGCAATTGA-1¬CGTTGTTTCAATTCCC-1­CGTTTCACTTCGGGCG-1®CGTTTCGCTCATTACA-1¯CGTTTGTGTAGAGGGT-1°CTAAAGAATGCCTACT-1±CTAAAGGGAAATAGGA-1²CTAAATCCTATTCCGG-1³CTAACAGCACAATAAC-1´CTAACCGCGCGCCCGT-1µCTAACGAAACTTGCTG-1¶CTAACTGATAATCGCC-1·CTAACTGGTCCGGTTC-1¸CTAAGGGAATGATTGG-1¹CTAATTCGCACGCGCT-1ºCTAATTCTCAGATATT-1»CTACACTCGCAGATGG-1¼CTACCCTAAGGTCATA-1½CTACGACTAGCTATAA-1¾CTACGCACGGAGTACC-1¿CTACTATCATAGGTTT-1ÀCTACTATCTTTCAGAG-1ÁCTACTCAAGGTATAGT-1ÂCTACTCTAGGCCCGGC-1ÃCTACTGCCACCTGACC-1ÄCTAGATGTGAGTGTAA-1ÅCTAGATTTACGACGGC-1ÆCTAGCATAGTATAATG-1ÇCTAGCCGATGTTATGA-1ÈCTAGGCGCCCTATCAG-1ÉCTAGGTCTGAAGGAAT-1ÊCTAGGTTCGGACGTGA-1ËCTAGTAGAAAGGGATT-1ÌCTAGTCACGTCTTAAG-1ÍCTAGTGAAGGACAGGA-1ÎCTAGTTACAACCCGGT-1ÏCTAGTTGGGCCCGGTA-1ÐCTATAAGAGCCAATCG-1ÑCTATACTTAAAGCGAG-1ÒCTATCGACGAAATACA-1ÓCTATCGGGTCTCAACA-1ÔCTATGCCCGAATGCAA-1ÕCTATGGGAAGCGGAAT-1ÖCTATGTCACTAGCCCA-1×CTATGTGAGTCACGGC-1ØCTATTCATGTGTCCCA-1ÙCTATTGTGTTTGGTCA-1ÚCTATTTGCTTGGAGGA-1ÛCTATTTGGTTACGGAT-1ÜCTCAACTAACCCGGAT-1ÝCTCAAGACATTAGCGC-1ÞCTCACATTTACTAAAT-1ßCTCACTGTGATACTTA-1àCTCACTTGGCTGGTAA-1áCTCAGATTGTGATAAG-1âCTCAGTCACGACAAAT-1ãCTCATAAATGTGTATA-1äCTCATGGTAATTTGCG-1åCTCATTGCTCTAACAA-1æCTCATTTGATGGGCGG-1çCTCCCTCCTTTCGATC-1èCTCCGCCCACATGAGG-1éCTCCGGCCTAATATGC-1êCTCCTCCAGCTCACAC-1ëCTCCTTTACGCAAGTC-1ìCTCGAGACATACGATA-1íCTCGAGGTCGAACAGT-1îCTCGATATTTGCGAGC-1ïCTCGCACCTATATAGT-1ðCTCGCATTGCATAGCC-1ñCTCGCCGAATGTAGGG-1òCTCGCTAGGTAAGCGA-1óCTCGGTACCACTGCTC-1ôCTCGGTTGTCGGCCCT-1õCTCGTCGAGGGCTCAT-1öCTCGTCTGTGCCTTCG-1÷CTCGTTTCTAATGTTT-1øCTCTAATGCATTGATC-1ùCTCTACACTGGCGATT-1úCTCTAGCCCTCGGAAA-1ûCTCTATTTGGCTGCAG-1üCTCTCACAATCGATGA-1ýCTCTCTAACTGCCTAG-1þCTCTGGACGCCTGGTG-1ÿCTCTTCTATTGACTGG-1CTCTTGTCCCGCTTGG-1CTGAAAGAGATCCGAC-1CTGAATCCGAGACCTC-1CTGAATTTATTGCCAG-1CTGACTGCGCAGCTCG-1CTGCAAGCACGTTCCG-1CTGCACAACTACATAT-1CTGCACTCCAGTACAG-1CTGCAGAGAATCAGAG-1 CTGCCAAGGTTGGAAG-1 CTGCCATGCATCACAT-1 CTGCCTTTCTAGTAAA-1 CTGCGACCTCGCCGAA-1 CTGCGTTACGATATAA-1CTGCTGAGGCCACGAA-1CTGCTTGGCGATAGCT-1CTGCTTTATGTCCGCG-1CTGGAAATGGATGCTT-1CTGGAAGACACGGTGG-1CTGGACGCAGTCCGGC-1CTGGATTTACACTTGA-1CTGGCATCCGAATGAG-1CTGGCGACATAAGTCC-1CTGGCGATTTACATGT-1CTGGCGCACAGGTCTG-1CTGGCTGATTCATCCT-1CTGGCTGGTTGTCAGT-1CGCGTTCATGAAATAC-1CGCTACGGGACATTTA-1CGCTAGAGACCGCTGC-1CGCTATTCTTAGGCTC-1CGCTCTCCGTAGATTA-1 CGCTGGTGACTACCCT-1!CGCTGTGACGCCGCAC-1"CGCTGTGTGGATGTTG-1#CGCTTATTCCCGGTCG-1$CGCTTCGGTCTAAGAC-1%CGCTTTCTTGCATTCG-1&CGGAAAGAATCAAACG-1'CGGAACGTAAACATAG-1(CGGACCTTTACGTCCC-1)CGGACGTTACTTGAAG-1*CGGAGCAATTTAATCG-1+CGGAGCATGGCGATCC-1,CGGAGTTTGAGAGACA-1-CGGATCCTCAAGGACT-1.CGGCAAACATCGTGCG-1/CGGCAATAAGATCGCC-10CGGCAGGGTCGGGTTG-11CGGCCACGCACAAAGT-12CGGCCCAACCTGTAGT-13CGGCCCAGGTATATCC-14CGGCGCCATCAATCCC-15CGGCTCTAAAGCTGCA-16CGGGAATATAGTATAC-17CGGGAATTTATGTAAA-18CGGGAGCTTCAGTGTA-19CGGGATCAATGTAAGA-1:CGGGCAGCTAAACCGC-1;CGGGCCTTCTTTGTAA-1<CGGGCGATGGATCACG-1=CGGGTGTACCCATTTA-1>CGGGTTTGTTAGGGCT-1?CGGTACGGCAAACCCA-1@CGGTACTAGAATCAAA-1ACGGTAGAGGTGCAGGT-1BCGGTATAGGTATTAGC-1CCGGTCAAGTGGGAACC-1DCGGTCCGTCGCAAGCC-1ECGGTCTATCAACCCGT-1FCGGTGAAGACTAAAGT-1GCGGTGCAGATAGAACG-1HCGGTGCGCGTTGGTCC-1ICGGTGGGCTCCAGCCT-1JCGGTTATCCAACAGTG-1KCGGTTCAAGTAGGTGT-1LCGGTTGACCTGGCATA-1MCGTACCTGATAGGCCT-1NCGTAGAGAGTAATTAT-1OCGTATTAAGAGATCTA-1PCGTCACGTCCATTGGT-1QCGTCCTCATCGCGTGC-1RCGTCGCATGTGAGCCA-1SCGTCGGATAGTGTTGA-1TCGTCGGGTCTAAGCGC-1UCGTCGTCCTTCGCGAA-1VCGTGAAGTTAATTCAC-1WCGTGACATTGGGTCGT-1XCGTGACCAGTCCTCTG-1YCGTGCACACCACTGTA-1ZCGTGCAGACTGGGACA-1[CGATGTTGTTATCTAC-1\CGATTAAATATCTCCT-1]CGATTCGCCTGGCTGC-1^CGCAAACACGAGTTAC-1_CGCAATTAGGGTAATA-1`CGCACATGTCCACTAC-1aCGCACGTGCGCTATCA-1bCGCAGATCTTCACCCG-1cCGCAGGCGATCCAAAC-1dCGCATGCCGAATGCGT-1eCGCATGGTGCGATGCT-1fCGCATTAGCTAATAGG-1gCGCCACAGGTCGCGAT-1hCGCCATCCGATTATGA-1iCGCCCAGCACGCCTAG-1jCGCCCAGCGTTTCACG-1kCGCCCGCTTCCGTACA-1lCGCCGCCCATGCCTGT-1mCGCCGTTCAGCATAGT-1nCGCCTCCCTCCTCTAT-1oCGCCTGGCCTACGTAA-1pCGCGAAGTGGCATACT-1qCGCGACCGCGACAGAT-1rCGCGAGAGGGACTTGT-1sCGCGAGTCTGCCGGGT-1tCGCGCAAATGTCCAGA-1uCGCGCATGTTTGATTG-1vCGCGCCCGACTTAATA-1wCGCGGCTCAACTTGAA-1xCGCGGGAATTAGGCAG-1yCGCGGGAATTCCTTTC-1zCGCGGTCACAAACCAA-1{CGAGAGCGCGTAGATA-1|CGAGAGCTTTCACTAC-1}CGAGAGGGTAGCCGCG-1~CGAGCTGGGCTTTAGG-1CGAGGCTAAATATGGC-1€CGAGGGACTGCGGTCG-1CGAGGGTATCCAGGTG-1‚CGAGTACTAAAGAGGA-1ƒCGAGTGAAGGTACCAG-1„CGAGTTCTGTCCCACC-1…CGAGTTTATCGGACTG-1†CGATACCTCGCGGACA-1‡CGATAGTCGTACTGCA-1ˆCGATCCGACCCAGTGC-1‰CGATCTGTTGGAGGAC-1ŠCGATGGACCCTACGCC-1‹CGACCCTTAACGCCGG-1ŒCGACCTACTAGACAAT-1CGACGCATCCGTACCT-1ŽCGACTCAGGATGTTAT-1CGACTTTGTATAGCCT-1CGAGACCCTAGAGTGT-1‘CGAGACTACTGCTGCT-1’CGAGAGATGTGAACCT-1“CGAATGACGCATAATG-1”CGACAATTTGATCTAA-1•CGACACGCTCCGACAG-1–CGACAGTTCGCGTTAT-1—CGAATCTGCTCGACGC-1˜CGAATGAAGTCATTGC-1™CGAAGTTGCTCTGTGT-1šCGAAGCTATAAATTCA-1›TGAGAGATTTACCACG-1œTGAGATTAGGCCCTAA-1TGAGCCATACAGTCTC-1žTGAGCGGAAAGTGTTC-1ŸTGAGCTTTAATGACGC-1 TGAGGAGTGCCAGCTT-1¡TGAGGCATGTACTGTG-1¢TGAGTAAATTAGCGTA-1£TGAGTGCCTCTTAAAT-1¤TGAGTGGTCCGTGACG-1¥TGAGTGTAACAACGGG-1¦TGAGTTAAAGACATTC-1§TGATACATTTAGCCGT-1¨TGATCAGGGAACTGCT-1©TGATCCCAGCATTAGT-1ªTGATCGGTTTGACCCT-1«TGATCTACGCTGATCT-1¬TGATCTATCACACTCT-1­TGATCTCCGGCGCCAG-1®TGATGGCTGTTTCTGA-1¯TGATGTCAATTAAGTG-1°TGATTATGGCACGCAG-1±TGATTCAGGTCCCGCG-1²TGATTCCCGGTTACCT-1³TGATTCGTCTATCACT-1´TGATTCTGTCGCCGGT-1µTGATTTATTAGCTGTG-1¶TGCAACCCATCTGCGG-1·TGCAACTACTGGTTGA-1¸TGCAAGAATGACGTAA-1¹TGCAATCTAACACGGT-1ºTGCAATTTGGGCACGG-1»TGCACAGTGAAGTTAT-1¼TGCAGAACTATATCGT-1½TGCAGAGTACCGAGCA-1¾TGCAGATCGTCCTAGG-1¿TGCAGCTACGTACTTC-1ÀTGCAGGATCGGCAAAG-1ÁTGCAGTTTCCTCCCAT-1ÂTGCATATGTCTGTCAC-1ÃTGCATGGATCGGATCT-1ÄTGCATGTGGTAATCTA-1ÅTGCCAAAGTCAGACTT-1ÆTGCCAATGGGTACTCT-1ÇTGCCACACTAGAGGAA-1ÈTGCCACCTGGCGAAAC-1ÉTGCCAGTACGTGGAGA-1ÊTGCCATTACTAAAGAA-1ËTGCCCGATAGTTAGAA-1ÌTGCCCGTACCGTTAAA-1ÍTGCCGTGGATCGTCCT-1ÎTGCCGTGGGACCCAAT-1ÏTGCCGTTCTTAATCGG-1ÐTGCCTAATTGAAGATT-1ÑTGCCTGATCAAACGAT-1ÒTGCCTTGGCCAGGCAA-1ÓTGCGAATATGGGATTT-1ÔTGCGACACCCTAGTGC-1ÕTGCGAGAATATTACCC-1ÖTGCGAGATGGCGGCCA-1×TGCGAGCCCTTCCGCG-1ØTGCGCAAAGCATTTGG-1ÙTGCGCGATTAACGGAG-1ÚTGCGGACTTGACTCCG-1ÛTGCGGAGTAAAGGTGC-1ÜTGCGTAAGAACCTGAT-1ÝTGCGTACGGCTAATTG-1ÞTGCGTCATGACTGAGC-1ßTGCGTTTGTTGACACT-1àTGCTAAGTGTCTATTT-1áTGCTCCACAGTTCTTA-1âTGCTCGGCGAAACCCA-1ãTGCTCGGTGGGTCACC-1äTGCTCTTGAGAGTTTG-1åTGCTGTTGAAGAACTC-1æTGCTTCCCAAGCAGTA-1çTGGAACCACTGACACA-1èTGGAAGAAGGGAACGT-1éTGGAAGGATAAAGATG-1êTGGAATATCCTTGACC-1ëTGGACCAATCTAAGAT-1ìTGGACGCAATCCAGCC-1íTGGACTGTTCGCTCAA-1îTGGAGTGATGCGATGA-1ïTGGCAAACTAAATTAC-1ðTGGCAACTCGCGCGCC-1ñTGGCAAGCACAAGTCG-1òTGGCAATGGGACGGCG-1óTGGCAGATTACGATCA-1ôTGGCAGCAGTAATAGT-1õTGGCATGAAGTTTGGG-1öTGGCCAAACTGAAGTA-1÷TGGCCAATTTGGTACT-1øTGGCCGTATATTGACC-1ùTGGCGACTGCTCCAAA-1úTGGCGATCAAGTTATG-1ûTGGCTACACTCTACCT-1üTGGCTATGTGACATAC-1ýTGGCTCTTGTCGCGTA-1þTGGCTTATGTATAATG-1ÿTGGCTTGTACAAGCTT-1TGGGATGCACTCATTC-1TGGGCAATAGTTGGGT-1TGGGCCACAAGAGCGC-1TGGGCCCATACTAATT-1TGGGCGATACAATAAG-1TGGGTGCACAAGCCAT-1TGGGTGGGATGTCATT-1TGGGTGTAATAGATTT-1TGGTAAGCAGGATTGA-1 TGGTAGAATATATGGG-1 TGGTCCCACGCTACGG-1 TGGTCGTGCAAGGCAA-1 TGGTCTGTTGGGCGTA-1 TGGTTAACTTACATTT-1TGGTTAAGGGCGCTGG-1TGGTTCAACGGGTAAT-1TGGTTCGTAGCAAAGG-1TGGTTTAAACGTGGGT-1TGTACCTACACGAGGG-1TGTACGAACAAATCCG-1TGTACTTCCGGGCATG-1TGTAGCCAATTCCGTT-1TGTAGCCATCCCATTC-1TGTAGGAGAAATTTCC-1TGTAGTGATCTATAAT-1TGTATAACAGATCCTG-1TGTATCAGACTGAAGC-1TGTATGGCGCAGACAG-1TGTCATTTGTTGGGAA-1TGTCCACGGCTCAACT-1TGTCCTAAGTCACCGC-1TGTCGTTATCACATAT-1 TGTGACTACGCCAGTC-1!TGTGACTAGAGTTTGC-1"TGTGAGACTAGCCCAA-1#TGTGCCAGAGGCAAAG-1$TGTGCCGGTGCCGGAA-1%TGTGGCAAAGCGTATG-1&TGTGGCGGGCTTCTGG-1'TGTGTCGAAGTCGAGG-1(TGTGTGACCATGAATC-1)TGTTATTGTATGTGGC-1*TGTTCCGCTTCCATGA-1+TGTTCCGGCCTGAGCT-1,TGTTCGTATTGCGGTG-1-TGTTCTTCCATTGACT-1.TGTTGTCAAGAAGTCT-1/TGTTTCTGAAGCGTGC-10TGTTTGAGATCGTCAG-11TTAAACTCGAATTCAT-12TTAAAGTAAGTCGCCA-13TTAACCAACCCTCCCT-14TTAACGAACAAGCAGT-15TTAACTTCAGGTAGGA-16TTAAGATAGGATTGAC-17TTAAGCGCCTGACCCA-18TTAAGGCCCGTACTTT-19TTAAGTATTGTTATCC-1:TTAATCAGTACGTCAG-1;TTAATGTAGACCAGGT-1<TTAATTGCTTTGGGTG-1=TTAATTTCAGACGCGG-1>TTACAACTACGCATCC-1?TTACACGATCTGCGAC-1@TTACAGACCTAAATGA-1ATTACATGCCACAACTA-1BTTACCATTGATTACCC-1CTTACCCATTGCCGGGT-1DTTACCCTAGGGATTGG-1ETTACGGATGGTTCGAG-1FTTACTAAAGGACTTTA-1GTTACTCCGGCCGGGAA-1HTTACTCTGGTACGTAC-1ITTACTGGGATATTTCA-1JTTACTGTCTAGAGCTC-1KTTAGAAGAACATGACT-1LTTAGAATAAGGGTCGG-1MTTAGACACGATCGTTG-1NTTAGACGAGTCACCTC-1OTTAGAGGGATATACAG-1PTTAGAGTTTAGAAGGA-1QTTAGCTAATACGATCT-1RTTAGCTGATTTGCCGT-1STTAGTAAACCTGCTCT-1TTTAGTAGGGCGGCGGG-1UTTAGTTATTCGTGGCA-1VTTAGTTCAAGTGTTCG-1WTTATAGGTAATTGTCT-1XTTATATACGCTGTCAC-1YTTATATTTGGCAATCC-1ZTTATCCGGGATCTATA-1[TTATCCTCAAGGAATA-1\TTATCTGACATTAGGA-1]TTATCTGTATCATAAC-1^TTATGAATGAAAGGGA-1_TTATGACAAACTGGAT-1`TTATGATCTTAACGAA-1aTTATTAGAGCGTGTTC-1bTTCAAAGTCTCTAGCC-1cTTCAATACTCTGAATC-1dTTCACGAAAGGATCAC-1eTTCACTCGAGCACCTA-1fTTCAGCCCTGGTCCAC-1gTTCAGCTGGCGTGCCC-1hTTCAGGCGTCAAAGCC-1iTTCATGGCGCAACAGG-1jTTCCAATCAGAGCTAG-1kTTCCAATCTGGCTATC-1lTTCCACACAGATTTGA-1mTTCCAGACGAGATTTA-1nTTCCATCATGCGGTGA-1oTTCCATCGACAGCGTG-1pTTCCCGGCGCCAATAG-1qTTCCGCAGAGAAATAT-1rTTCCGCGTGAGGCGAT-1sTTCCGGCCTTGAGGCT-1tTTCCGGCTCGACTTCT-1uTTCCGGTTACCCACTT-1vTTCCTCGAGGGTGTCT-1wTTCCTCGGACTAACCA-1xTTCGACAGAGCCCGTG-1yTTCGACGGGAAGGGCG-1zTTCGCACTCGCGTGCT-1{TTCGCACTGTACGACA-1|TTCGCCGCTCGCGCTA-1}TTCGCGCGCCATACGA-1~TTCGCTATCTGACGTG-1TTCGGCAACCCGCTGA-1€TTCGGGACTAATCGCG-1TTCGGGCGCTAGTCTT-1‚TTCGGTACTGTAGAGG-1ƒTTCGTACTCCAGAACG-1„TTCGTTCAACGAAGTT-1…TTCTAACCGAAGCTTA-1†TTCTAGAAAGTCTTAT-1‡TTCTAGGCCAATTGTG-1ˆTTCTATTAAACGCAGC-1‰TTCTCTTACAGGTGAT-1ŠTTCTGACCGGGCTCAA-1‹TTCTGCCGCGCCTAGA-1ŒTTCTGCGGGTTAGCGG-1TTCTGCTAGACTCCAA-1ŽTTCTTATCCGCTGGGT-1TTCTTGAGCCGCGCTA-1TTCTTGCTAGCATCTC-1‘TTCTTGGACGATCTGC-1’TTCTTGGAGTAATGAG-1“TTCTTTGGTCGCGACG-1”TTGAAAGGTGTAAAGG-1•TTGAACGACGTGCTGA-1–TTGAAGAATTCCCAGG-1—TTGAAGGATGGGCGCC-1˜TTGAATATGGACTTTC-1™TTGAATCGTTGTATAA-1šTTGAATTCACGTGAGG-1›TTGACAGGAGCTCCCG-1œTTGACATGAACGTGGA-1TTGACCAGGAACAACT-1žTTGACCATGTTCTCCG-1ŸTTGACCGTGTTAATGA-1 TTGACGCTCCATGAGC-1¡TTGACTACCATATGGT-1¢TTGACTATTGTCCGGC-1£TTGAGAAGTTTAGCAT-1¤TTGAGAGTACTGCTAA-1¥TTGATAGTCAATACAT-1¦TTGATCTAACTTTGTC-1§TTGATGTGTAGTCCCG-1¨TTGATTAGCTGTTTCT-1©TTGATTATGCAGATGA-1ªTTGCAAGAAGACTCCT-1«TTGCACAATTCAGAAA-1¬TTGCACGGAGCAGCAC-1­TTGCATGCTGATCACG-1®TTGCCAAGCAGAACCC-1¯TTGCCATAGCCCGCTC-1°TTGCCCTGATCACGGG-1±TTGCCGCAGACCTACA-1²TTGCCGCTTTCTAGTA-1³TTGCCTTCTCGCCGGG-1´TTGCGCTTGATCAATA-1µTTGCGGCATCAGAAAG-1¶TTGCGTCGGCCAACCG-1·TTGCGTGAACGCTTAG-1¸TTGCGTGTGTAGGCAT-1¹TTGCTCATAGTACGTG-1ºTTGCTCCCATACCGGA-1»TTGCTGAAGGAACCAC-1¼TTGCTGATCATGTTCG-1½TTGGAAGAATACAGTC-1¾TTGGACATGTGGCTTA-1¿TTGGACCATCTGGCAA-1ÀTTGGACCTATAACAGT-1ÁTTGGATATCGTCTACG-1ÂTTGGCCTAGAATTTCG-1ÃTTGGCTCAATATGTGT-1ÄTTGGGAAGACGAGCCG-1ÅTTGGGACACTGCCCGC-1ÆTTGGGACGTAAGAGTT-1ÇTTGGGCGGCGGTTGCC-1ÈTTGGTCACACTCGTAA-1ÉTTGGTTGCGGTGCGCG-1ÊTTGTAAGGACCTAAGT-1ËTTGTAAGGCCAGTTGG-1ÌTTGTAATCCGTACTCG-1ÍTTGTACACCTCGAACA-1ÎTTGTCACCGCGGTATC-1ÏTTGTCGTTCAGTTACC-1ÐTTGTGAACCTAATCCG-1ÑTTGTGAGGCATGACGC-1ÒTTGTGATCTGTTCAGT-1ÓTTGTGCAGCCACGTCA-1ÔTTGTGCGGAAGCGGAT-1ÕTTGTGGCCCTGACAGT-1ÖTTGTGGTAGGAGGGAT-1×TTGTGGTGGTACTAAG-1ØTTGTGTATGCCACCAA-1ÙTTGTGTTTCCCGAAAG-1ÚTTGTTCAGTGTGCTAC-1ÛTTGTTGTGTGTCAAGA-1ÜTTGTTTCACATCCAGG-1ÝTTGTTTCCATACAACT-1ÞTCCATCAATACTAATC-1ßTCCCAAACAGACAACG-1àTCCCAAAGACGAAGGA-1áTCCCACTCTCTTCCGG-1âTCCCAGCTTTAGTCTG-1ãTCCCAGGCTTAGCTAA-1äTCCCGCGTACTCCTGG-1åTCCCGGGTGTGCTGCT-1æTCCCGTCAGTCCCGCA-1çTCCCGTCGCGTCATAG-1èTCCCGTGTGCAATTTG-1éTCCCTAGATCAATAGG-1êTCCCTGGCGTATTAAC-1ëTCCCTGGCTCGCTGGA-1ìTCCCTTAGATTACTCG-1íTCCGAAGTAGTCACCA-1îTCCGAATGGTCCTGAG-1ïTCCGATAATTGCCATA-1ðTCCGATGACTGAGCTC-1ñTCCGATGGTGCGACAT-1òTCCGATTACATTGCCG-1óTCCGCCTGTCTACAAG-1ôTCCGCGGCAGCATCTG-1õTCCGCGGCCCAATGAA-1öTCCGCTGTCATCCCGG-1÷TCCGCTTATCCCATTA-1øTCCGGAGGAAGGGCTG-1ùTCCGGCCTAGCGTACA-1úTCCGGGCTTGACGGGA-1ûTCCGGTTCGTCCGGTC-1üTCCGTTAAGCTAATAT-1ýTCCGTTTAGCCTTGAA-1þTCCTAAAGATTCAGAC-1ÿTCCTAAATTGGGAAGC-1TCCTAACCGTCGGGCA-1TCCTACATCCACGGCC-1TCCTAGCAAAGAAGCT-1TCCTCCTAAGACATTC-1TCCTCGGGCTGGGCTT-1TCCTCTACGAGATGGC-1TCCTGCCAACTGGAGA-1TCCTGCGTTGATACTC-1TCCTGGCGCTGCCTGG-1 TCCTTACGACGGTCCG-1 TCCTTCAATCCCTACG-1 TCCTTGTCCTTTAATT-1 TCCTTTAAATCCGCTT-1 TCCTTTCTTACGCTTA-1TCGAAATTTAGGACCA-1TCGAAGAACCGAGCAC-1TCGAATATCCCGCAGG-1TCGACAACTGAACCCG-1TCGAGACCAACACCGT-1TCGAGTCTACGATTCG-1TCGCAAAGATGCATTT-1TCGCACCAGGAGGCAG-1TCGCATAAAGGGCGCA-1TCGCCGAAGTTGCGTC-1TCGCCGACATATTCGC-1TCGCCGCACCGCGTGA-1TCGCCGGTCGATCCGT-1TCGCGTAGCAGTGTCC-1TCGCGTCCAGAAGGTC-1TCGCTAAACCGCTATC-1TCGCTACTGGCTTTGA-1TCGCTCGATATATTCC-1 TCGCTCGGCACCAGCG-1!TCGCTGCCAATGCTGT-1"TCGCTGGGCGGATTGT-1#TCGCTTTAAACGTTTG-1$TCGGAATGCGCTCTGA-1%TCGGACGCCCAGCCCA-1&TCGGAGAGTATCGGGA-1'TCGGAGTACATGAGTA-1(TCGGCGAACCCAAACC-1)TCGGCGTACTGCACAA-1*TCGGCTTGTATCGACG-1+TCGGGAACGTGCCTAG-1,TCGGGAGACAGCGTAC-1-TCGGGCCGTCGTGGTA-1.TCGGTCCCGACAATAG-1/TCGGTGACCGCTCCGG-10TCGTAAGACGACATTG-11TCGTAAGCTCCGAGGA-12TCGTACCGACGTCAAG-13TCGTATTACCCATTGC-14TCGTCAAGTACGCGCA-15TCGTCTTAGGCGTTAA-16TCGTGTACTATGGATG-17TCGTGTCACGCTGACA-18TCGTGTTCGACCACAA-19TCGTTAGGAGTCCCTA-1:TCGTTGCTATCCGGTC-1;TCGTTTACGCGACCCT-1<TCTAAAGAACAGTCTC-1=TCTAACCTAGCCTGCG-1>TCTAATACTGCCTCAG-1?TCTACCCAATAGAGAG-1@TCTACCCGCATCATTT-1ATCTACCGTCCACAAGC-1BTCTAGCAATCTCCGCC-1CTCTAGCATCTTCGATG-1DTCTAGCATGCCCAGAA-1ETCTAGGTGGCGACGCT-1FTCTAGTGATATCGTGG-1GTCTAGTTATCAGAAGA-1HTCTATAGGTGGGTAAT-1ITCTATCGGTCGCAACA-1JTCTATGCTATAACGAC-1KTCTATTACTAGAGGAT-1LTCTCAAATCAATCGGG-1MTCTCATGAGATAGGGT-1NTCTCCAACGTAGGTTA-1OTCTCCACAAGTTGAAT-1PTCTCCCTGGGCAGCGT-1QTCTCGAACGAGGTCAC-1RTCTCGACGTATCGCCG-1STCTCGAGGAGGTTCGC-1TTCTCGTGTTACGAGGA-1UTCTCTAATAGCTGGTA-1VTCTGAACTCGTACCCG-1WTCTGAAGCACGTGGTC-1XTCTGAATTCCGTACAA-1YTCTGAGCAATTGACTG-1ZTCTGATGTATTCTGTC-1[TCTGCATACCTTGCTT-1\TCTGCCAGAAACTGCA-1]TCTGGGAACCTTTGAA-1^TCTGGGTAGCGCTCAT-1_TCTGTGCCATCATAGT-1`TCTGTTACCCAGCATA-1aTCTTACCGGAACTCGT-1bTCTTACTTATGCCTCT-1cTCTTAGAGCTCCAATT-1dTCTTAGAGTGAACTCT-1eTCTTCCCATGGGCACA-1fTCTTCGAATAGACGTT-1gTCTTCGATACCAATAA-1hTCTTCTATAACCCGCC-1iTCTTGATGCGTAGCGA-1jTCTTGCTCCCGATACT-1kTCTTGGTAACACCAAA-1lTCTTTAAGACTATGAA-1mTCTTTAGAGTCTAACA-1nTGAAAGGACCTGACTC-1oTGAACTGCTATGACTT-1pTGAATACCGACGCGTA-1qTGAATATGCTATAAAC-1rTGAATGTCAGCCGGCC-1sTGAATTTCACTTGCCT-1tTGACACTTCTCTTTGC-1uTGACAGGACAAGTCCA-1vTGACATATATGACGAT-1wTGACATCGAGCGGACC-1xTGACATGTAACGTGAC-1yTGACCAAATCTTAAAC-1zTGACCCACGTTAGACA-1{TGACGAATATTTCCCT-1|TGACGATGCACTAGAA-1}TGACTATAATCCTTTC-1~TGACTCCGAATCATAC-1TGAGACGTACCTCTCA-1€TATGGGTACGTATCGT-1TATGGTCTGAGTAACA-1‚TATGGTTAGTGGGAGA-1ƒTATGTAGAAACCCGGC-1„TATGTCAAGACCGACT-1…TATGTCTCATTGTGCC-1†TATTAACACCAAAGCA-1‡TATTAACCTGACCGCG-1ˆTATTACCATCCTGCTT-1‰TATTATGTTTGCCTGC-1ŠTATTCAATTCTAATCC-1‹TATTCCACTCAGCTCG-1ŒTATTCCGAGCTGTTAT-1TATTCCTCCGCCCACT-1ŽTATTCGTGCCAGAATA-1TATTGCCGGGCTTGTA-1TATTTAGTCTAGATCG-1‘TATTTATACCGAGTAG-1’TATTTGTTACCCTTTA-1“TCAAACAACCGCGTCG-1”TCAAACTTAGATTGTT-1•TCAAAGAGCTATCTGT-1–TCAAATTGTTGTGCCG-1—TCAAATTTGAGACTCA-1˜TCAACAAAGATAATTC-1™TCAACATAGCGCCCTA-1šTCAACATCGACCGAGA-1›TCAACCATGTTCGGGC-1œTCAACGAGGAGACAAA-1TCAACGCAGGAAATAA-1žTCAACGCGACCGGCAG-1ŸTCAACTGCAGAGTCAG-1 TCAAGAAATACTAGCT-1¡TCAAGCGCGGACGGTA-1¢TCAAGGTTACTACACC-1£TCAATACGCCGTCATG-1¤TCAATCCGGGAAGTTT-1¥TCACAAACCGAGGTAC-1¦TCACAGCAAACTCGAA-1§TCACAGGAGAATAAGA-1¨TCACAGGGAATCGCAA-1©TCACAGGTTATTGGGC-1ªTCACCCTCTTAAGATT-1«TCACCGCTCGGCACTC-1¬TCACGATGTCCGTGGA-1­TCACGCATTGTAGATC-1®TCACGGTCATCGCACA-1¯TCACGTGCCCGATTCA-1°TCACTACGACCAATGC-1±TCACTATCCCTTCGGT-1²TCACTCGTGCAACGGC-1³TCAGAACCTCCACAGG-1´TCAGACGCTATAGAAG-1µTCAGCAAATGCATCTC-1¶TCAGCCAATCCGTAAA-1·TCAGCTTGAGCTTTCG-1¸TCAGGGTGTAACGTAA-1¹TCAGGTTCTTTGAGAA-1ºTCAGTACTGACCCGCG-1»TCAGTAGGGACTATAA-1¼TCAGTGTATACGTCAT-1½TCATATGAGCTTTGTT-1¾TCATCCTCAGCTGCTT-1¿TCATCGACGACCGTCG-1ÀTCATCGATGGTCCCAA-1ÁTCATGCAGGTTCTCAT-1ÂTCATTTAAGTCTCCGA-1ÃTCATTTAGAAGTGTGA-1ÄTCCAACTCAGCTATCT-1ÅTCCAACTTTAAATTCT-1ÆTCCAAGCCTAGACACA-1ÇTCCAATAAAGGCTACC-1ÈTCCACAATGGTTTACG-1ÉTCCACATCGTATATTG-1ÊTCCACCAAGACATAGG-1ËTCCACCTCTAGCCTTT-1ÌTCCACTTTATCTAGGT-1ÍTCCAGAGCACCGGTTC-1ÎTCCAGATGTACGCCAA-1ÏTCCAGGCGAGTACGGT-1ÐTCCAGGGTATATACGA-1ÑTAGGGTGTTTCAAGAG-1ÒTAGGTCGCCGGAACTG-1ÓTAGGTGACGATAACCT-1ÔTAGGTGAGCCCTACTC-1ÕTAGGTGCTCGCCTAGC-1ÖTAGGTGTTCCACAGAT-1×TAGGTTCGAGTTCGTC-1ØTAGTACCACAACTTTC-1ÙTAGTAGCTTATACCAG-1ÚTAGTCCGCAGAGAATG-1ÛTAGTCGATCACGGGTT-1ÜTAGTCTAACAACGAGA-1ÝTAGTCTGTGACGTTGC-1ÞTAGTGCCCTCCAGAGT-1ßTATACACAGACGCCTT-1àTATACGCGTCATCACT-1áTATAGATGGTCGCAGT-1âTATAGCGCACGTTATC-1ãTATATATCGAGAAATG-1äTATATCCCTGGGAGGA-1åTATATTACAAATGTCG-1æTATCACCCAACCGACC-1çTATCACTTCGAGTAAC-1èTATCAGTGGCGTAGTC-1éTATCCAATTGGTTATC-1êTATCCATCTCGGTTAG-1ëTATCCGCACCGTCGGG-1ìTATCGATCTATGCATA-1íTATCGATGATTAAACG-1îTATCTACCACAGCGGG-1ïTATCTGAGCCGATATT-1ðTATCTTGCAATACAAC-1ñTATGAAGAATTAAGGT-1òTATGACCTTGCGCTGG-1óTATGATCCGGCACGCC-1ôTATGATCTTCTCTTTA-1õTATGCTCCCTACTTAC-1öTATGGATGTGCTACGC-1÷TATGGCCCGGCCTCGC-1øTATGGGACCGAGCAGG-1ùTAGATATGGACTGGAA-1úTAGATGGTTCCTTACT-1ûTAGCAGATACTTAGGG-1üTAGCAGTATGACTAAA-1ýTAGCCATTTCAAAGTC-1þTAGCCGGCGGTCAGCG-1ÿTAGCGTCCCTCGATTG-1TAGCGTCCGGTGTGGT-1TAGCGTTGGGTCTTAC-1TAGCTAAGTCCGGGAG-1TAGCTAGAAGGCATGA-1TAGCTAGTGATGATGG-1TAGCTCGCCTGATAAC-1TAGCTGATGTGAAGCG-1TAGGAGGCTCGAGAAC-1TAGGCATGTTACGCCA-1 TAGGCCTATATAGTCT-1 TAGGCGATGAGGTCTC-1 TAGGCTAAAGTGGCAC-1 TAGGGAGCTTGGGATG-1 TACTTTACTGAGCCGG-1TACTTTCCGCACGCCA-1TAGAAAGGTGGCGCTA-1TAGAATAGCCGATGAA-1TAGACGAAACGCCAAT-1TAGACGCCCGTACCGG-1TAGACTACCTAGCGTT-1TAGAGATCATGCAACT-1TAGAGGTTCTACTTGT-1TAGAGTCTAAGCGAAC-1TACTGAGGGAAGAAAG-1TACTGCAATCAATTAC-1TACTGGACAGCTCGGC-1TACTTAAACATGTACA-1TACTTGTTAGTAGTCC-1TACTCTTACTTTACTG-1TACTCTTTCGTCTTCA-1TACTGAACAGATTTAG-1TACTCTCCGAACAAAT-1 TACTCGTTTGAATCAA-1!TACTATGGTTCCTCAG-1"Gene Expression#Gene Expression$Gene Expression%Gene Expression&Gene Expression'Gene Expression(Gene Expression)Gene Expression*Gene Expression+Gene Expression,Gene Expression-Gene Expression.Gene Expression/Gene Expression0Gene Expression1Gene Expression2Gene Expression3Gene Expression4Gene Expression5Gene Expression6Gene Expression7Gene Expression8Gene Expression9Gene Expression:Gene Expression;Gene Expression<Gene Expression=Gene Expression>Gene Expression?Gene Expression@Gene ExpressionAGene ExpressionBGene ExpressionCGene ExpressionDGene ExpressionEGene ExpressionFGene ExpressionGGene ExpressionHGene ExpressionIGene ExpressionJGene ExpressionKGene ExpressionLGene ExpressionMGene ExpressionNGene ExpressionOGene ExpressionPGene ExpressionQGene ExpressionRGene ExpressionSGene ExpressionTGene ExpressionUGene ExpressionVGene ExpressionWGene ExpressionXGene ExpressionYGene ExpressionZGene Expression[Gene Expression\Gene Expression]Gene Expression^Gene Expression_Gene Expression`Gene ExpressionaGene ExpressionbGene ExpressioncGene ExpressiondGene ExpressioneGene ExpressionfGene ExpressiongGene ExpressionhGene ExpressioniGene ExpressionjGene ExpressionkGene ExpressionlGene ExpressionmGene ExpressionnGene ExpressionoGene ExpressionpGene ExpressionqGene ExpressionrGene ExpressionsGene ExpressiontGene ExpressionuGene ExpressionvGene ExpressionwGene ExpressionxGene ExpressionyGene ExpressionzGene Expression{Gene Expression|Gene Expression}Gene Expression~Gene ExpressionGene Expression€Gene ExpressionGene Expression‚Gene ExpressionƒGene Expression„Gene Expression…Gene Expression†mm10‡mm10ˆmm10‰mm10Šmm10‹mm10Œmm10mm10Žmm10mm10mm10‘mm10’mm10“mm10”mm10•mm10–mm10—mm10˜mm10™mm10šmm10›mm10œmm10mm10žmm10Ÿmm10 mm10¡mm10¢mm10£mm10¤mm10¥mm10¦mm10§mm10¨mm10©mm10ªmm10«mm10¬mm10­mm10®mm10¯mm10°mm10±mm10²mm10³mm10´mm10µmm10¶mm10·mm10¸mm10¹mm10ºmm10»mm10¼mm10½mm10¾mm10¿mm10Àmm10Ámm10Âmm10Ãmm10Ämm10Åmm10Æmm10Çmm10Èmm10Émm10Êmm10Ëmm10Ìmm10Ímm10Îmm10Ïmm10Ðmm10Ñmm10Òmm10Ómm10Ômm10Õmm10Ömm10×mm10Ømm10Ùmm10Úmm10Ûmm10Ümm10Ýmm10Þmm10ßmm10àmm10ámm10âmm10ãmm10ämm10åmm10æmm10çmm10èmm10émm10êENSMUSG00000025935ëENSMUSG00000025937ìENSMUSG00000067813íENSMUSG00000025932îENSMUSG00000054493ïENSMUSG00000025930ðENSMUSG00000032769ñENSMUSG00000092083òENSMUSG00000025925óENSMUSG00000032719ôENSMUSG00000067795õENSMUSG00000043716öENSMUSG00000025921÷ENSMUSG00000100868øENSMUSG00000025920ùENSMUSG00000089982úENSMUSG00000025939ûENSMUSG00000079658üENSMUSG00000097744ýENSMUSG00000025940þENSMUSG00000025779ÿENSMUSG00000101640ENSMUSG00000042686ENSMUSG00000100110ENSMUSG00000025777ENSMUSG00000099899ENSMUSG00000067780ENSMUSG00000100053ENSMUSG00000085125ENSMUSG00000025776ENSMUSG00000099895 ENSMUSG00000025774 ENSMUSG00000073735 ENSMUSG00000067773 ENSMUSG00000089787 ENSMUSG00000042596ENSMUSG00000025927ENSMUSG00000100538ENSMUSG00000043760ENSMUSG00000089914ENSMUSG00000099906ENSMUSG00000025929ENSMUSG00000041872ENSMUSG00000041859ENSMUSG00000102121ENSMUSG00000097934ENSMUSG00000025931ENSMUSG00000041809ENSMUSG00000041779ENSMUSG00000099971ENSMUSG00000067879ENSMUSG00000099827ENSMUSG00000025912ENSMUSG00000045210 ENSMUSG00000097893!ENSMUSG00000025915"ENSMUSG00000046101#ENSMUSG00000098234$ENSMUSG00000099032%ENSMUSG00000025916&ENSMUSG00000087199'ENSMUSG00000025917(ENSMUSG00000056763)ENSMUSG00000067851*ENSMUSG00000042501+ENSMUSG00000048960,ENSMUSG00000057715-ENSMUSG00000097171.ENSMUSG00000101314/ENSMUSG000000169180ENSMUSG000000259381ENSMUSG000000994982ENSMUSG000000424143ENSMUSG000000058864ENSMUSG000001014765ENSMUSG000000259056ENSMUSG000000337747ENSMUSG000000259078ENSMUSG000000900319ENSMUSG00000087247:ENSMUSG00000033740;ENSMUSG00000051285<ENSMUSG00000097797=ENSMUSG00000103067>ENSMUSG00000025909?ENSMUSG00000061024@ENSMUSG00000025911AENSMUSG00000025903BENSMUSG00000104217CENSMUSG00000033813DENSMUSG00000002459EENSMUSG00000085623FENSMUSG00000033793GENSMUSG00000025902HENSMUSG00000104328IENSMUSG00000033845JENSMUSG00000102343KENSMUSG00000025900LENSMUSG00000089699MENSMUSG00000051951NTram1OLactb2PXkr9QEya1RGm9947SMscTTrpa1UKcnb2VTerf1WSbsponX 4930444P10RikYRpl7ZRdh10[Gm28095\Stau2]Gm7568^Ube2w_Eloc` D030040B21RikaTmem70bLy96cGm28376dJph1eGm28783fGdap1gGm28784hPi15iGm28154jGm16070kCrispld1lGm28153mCrisp4nDefb18oDefb41pGm15825qTfap2drTfap2bsGm28340tPkhd1u 4930486I03RikvGm28653wIl17axIl17fyMcm3zGm28065{ 6720483E21Rik|Paqr8}Efhc1~Tram2Gm28287€ 3110035E14RikGm29520‚Mybl1ƒVcpip1„ 1700034P13Rik…Sgk3†Mcmdc2‡Snhg6ˆTcf24‰Ppp1r42ŠGm15818‹Cops5ŒCspp1Arfgef1ŽCpa6Prex2 A830018L16Rik‘Gm17644’Gm29663“Sulf1”Slco5a1•Gm29283–Prdm14—Ncoa2˜Gm29570™Oprk1šNpbwr1›Rb1cc1œ 4732440D04RikAlkal1žSt18ŸPcmtd1 Gm26901¡Gm30414¢Sntg1£Rrs1¤Adhfe1¥Lypla1¦Gm37988§Tcea1¨Rgs20©Gm16041ªAtp6v1h«Sox17¬Gm37323­Mrpl15®Gm37381¯Rp1°Gm1992±Xkr4¨+³Äÿÿÿÿÿÿÿÿ  deflateÀ%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð#dýin,s BxÜ(I}Ò0%‚î8÷†ã@å‹HÈÙPÝ•ØX¶š`ŽŸh’¤Æp¡©xg®ã€x³ßˆ[¸ó:½ä˜-ÂÓ Çô¨äË °ØÐÒ¸åÕ À·ÚȳÄÿÿÿÿÿÿÿÿ  deflate%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÂÝŽã¡é•¿îŽ Tô¯(âùÂ0‘ÿ”8SŽ@ç lHu»Pá€Xœl`!ƒhˆ&œp ,7x§1ƒ€Þ6zˆa<„ÛA¼˜_G± M½¨ÌR‚°‰X­¸ ^šÀ¸cȈ ÿÿÿÿÿÿÿÿ  deflate@%%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0 Rg?‚sÿÿÿÿÿÿÿÿ  deflate€.%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%ÁwØ6ø8TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€:(HEAPX09feature_typegenomeidname(dÿÿÿÿÿÿÿÿ deflateÈ;%z‚]PSNODp9øC 8M(xVTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿcdÿÿÿÿÿÿÿÿ deflateE%z‚]PTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýbdÿÿÿÿÿÿÿÿ deflateHN%z‚]PTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿadÿÿÿÿÿÿÿÿ deflateˆW%z‚]PTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿa¸_x^í“ÇRQ‡â¿À†/†d%H"I@É9#9ç$ð† »™^³ìÞuï„;U“‰¢è¹ +zã%DQNŸcÏMøÿسþ{Hø=ò˜÷¿Dþ ó®á7ÈßÂïßž=ø~ìù ?@ý0öLÂP?Æþø)î9üsÌ»À=c˜÷óÆÑ?þIì›B~ófà³Ø?ŸG~¾ˆüîYF~%¤ï_Eÿ|ý¨o·Búýÿпüê…èÿÒï)‚#_ÒÿO)æ—ÁËá˜WÒßë#öW¡¿:¤ß÷ õϘ_ƒz-æ×a=ú¿ ߀ý¨7¡ÞŒý-¨·¢¿ õvxGìy ïDý+îw£¿õ^xòýxß÷þžÈ"?ÿÒßã'úaþ0úGà¿á0oô­(""""""""""""""""""""""""""""ïÊ+üŸþx^íеVCQÑÈÃ-×Á݂ۿò]¸»-¨`jÊ™æ¬Ýž8„pœJ„â_>„÷áxÞ…÷àu8oÀ›ð¼ OÃ3ð,<Ïà ð"¼/Ã+ð*¼·Áípœ†;á œ…»àn¸ÎÁ½pÜÀƒð< À£ð<OÀ“ð|’üëSø >‡/àKø ¾†oà[ø¾‡àGø ~†_àWø ~‡?àO8àï\ÂI8‚‹àb¸.…Ëàr¸®„«àj¸NÁ1\ ×ÁõpÜ7ÁÍp ÜýŒ™™™™™™™™™™™™™™™™™™™™™™™™™™™™ýc_?˜umx^íÇÅR‚a@ÑÏ™ÿ|i[±» »,»»ã-vÎ]»¼gw¢Bª° äýD!Dþâ_øþŽàø#þ„?ã/ø+~‚Ÿâgø9~_âWø5~ƒßâwø=>/à‹ø¾Œ¯à«ø¾Žoà›xÏà[ø6¾ƒïâ{xßÇð~ˆáÇx^Œ—à¥x /ÃËñ ¼¯Â«ñ¼¯Ããx=Þ€7âMx3Þ‚·âmx;Þwâ]x7Þƒ÷â}x?>€âCø0>‚â <‰áãx ŸÀ'ñ)|ŸÁgñ¹|$I’$I’$I’$I’$I’$I’$I’ô¯~Þ]–—x^íÇENPÑOÒ}Ó+àZ(îPÜÝiq)^Üîà ¬È¬YÎl&/BøŠå„Ÿ>#!Dÿø~ƒßágø~…oá;ø~€á'ø>†Oà,| ŸÁçð| _Á×ð <ÏÂsð<¼/ÂKð2œ‚Óð ¼ ¯Áëð¼ oÁÛð¼ gà=x>€á\8· àB¸.†KàR¸ .‡+à8\ WÁ ¸®ká:¸n€á&¸n[á6¸î€;á$ÜwÃ=p/Ü÷Ãð <Ã#ð(<Ãð$<OG~gffffffffffffffffffffffffffffÿØ7ÅsÓx^™é®¤5 ›aß7Þÿ1™]šÒ‘ûŽÄ£$Ž·ØÎòu¿{<ïÞãó÷øä ÆŸfüÙs ñÕÿò9V2Ðäß>[mÀSýò_>H§¿>ý¤}9uT7²»Ö/žôÚ”¿þÿñœWFÝ@ÿ®µ€®¥¶ËóÏãƒo´oùâxã ðMZçvÝõ_}ÊVüøø°¶Í™-|Æ¥²ÀøÔÛµ[`Wë銥<µ%à§.œ“O}ø¡´_¥ŸõQZ}øûñ_˜ÿ>|Ý ú·9­ŸE÷NmvmÕµm×)¾{Òœ_ÝåUòšçÒ‹_ž­uBLWÏêßyÆ/!¼V®ñ1êxÕâ[í´ViOÿªcÑxÔ§ú»ýÚ[9ñÓãÃ:ߊù+¨³gÅΙÿ÷òµ®vŸ©ç‡ð4Fî³òÙ·¥îɾ^qùùI'·î¹ž#ÅÆª¶×wæØöá+O«<­¹Á×(ä×oÆ[7 øäáÔëÙ1y+móAëåÝTך¥·Fwž³¿¼øÐ˜Tï¯Ï±ww׿õÒÌõ,»l€ß2W™ÆK^û¾@k€¸šÃµ ¸{h©ïìµgï\À»–V•ç\dŒœgù®×ÒßwðÛ£çS}Øx¸´)_}þгoívl¿ºõÍzvÍÀøU¦ké½H.vÞX]¹¤¿{»óÀ:q/]kX™Åíâ—ÆY}ñ¼|æ»2­›¾]kîÚûèœãëP·±í°ýªŽæ™1ûI™ò_¶.ì7õÖ•(ýz«×yvn¡nÇ­‡Ú¤oÉßœWVï;ùÖ‡•¯n`nåÛ³`û}7밺ѥŸ½›·ÖÔåc¿¹^ù²¹iJÖí[oœž+;WûW½sÎ(W^ѹßý\ãµGV/h>¥—§ýŸß9¥›;Ûæ[›µ¥m­ëïúd~*Ï»¹Íoe}çÂÓ8î÷7iëKõsöà3rÞÂ-Ms¶¹ß±ñó¬Øyß êýëÙ‡ÿªËûÀØõÛÈu6¿o¡¾ÿŠÚ©ß{oï¼Ø8_v‹W9uÒÕë¾_;…1aîªW¨Ïøåú_y­ƒkìºâ±ý·jOè—ôžçµ#/4c¼ob[¾éSßÞ÷ô×Ðû¾kýÒV^ºöœ¿ò¬L74“¾§û}wA]Í­ü½ó6÷bc¼ó‚ßýëë§Wò¯ö}ÏÐ7€zºß­}§t}—ÎiËÿ1¤í9µ:Û·Ëïÿ1×Û¾`n¿—ê«ç`e®ïZu­þòl½‚ž{­SõÙï»g÷ûúr­Cô÷RÚ+w«kmˆž•]»:7û^[ÄâUŽAããÿ'K/¿ï­ÿƒ=‡l[ÿÀ="ºÓï«Î×Nulìíû»ûž¾¬Ç«§ë¸|¹âxõ—oõmt kÛߨ ÷7Úë}¡Î‹V½€½ºgêêÝ=Pÿ"x^•™çªmEÏ5çŒ("‚ïÿR¸ Š^ýÑÌLç4aíýáíííà >~wô/G†¼²ŒŸ†|22ð8‡·¸õ{àÑQ;OPÝÅ]|ÎÕ_¿Õ£]y¿záÁ•Nù'û;_Dž¹²æ¬ú•‘öøX[ú*½þ7x}Q¦:¡™FmÊ)ÛÑyk»¾0þžÏ_cåª×¼7GÕÏømæŒí³örŸ½h Ð+wѱ£Ns¤Lk¦­âèmý`ýdKÌw¼× «g×Úš?ykzãÚØ¾ úA¿êìXÝ­·ü€òµ¥lõv•G>Æúì™"/~_¹ÿúíßÞ‡/·6•·qþý¢Õí0²þ)üÄñMøk¯¹¬/â»ËgìÚW/ãoÿúLœÆ¸<À·}çzñÍgçÀ{6úbeWÆœšçöô´&W {.´Ø©¬y¶&êwä¼´ní“õ£q®ùJkíô×;ºr¹£º6vcaþ{ÖÍIõ_°zËßÚ6_Ëç|yóº4ã]]Ögy{Æ*×Ô— ·@]œoŽÕ[ÿª“˜ßÛgBëÁ|ébÔÎÓ™»çHßÛ# ­i{¼`ÜûfÐí‹•w¯wŽNÏôÝÿÖÕºë“:=ãYsþ*Ûz•_º÷ÃúÕ=zÝ+W^ È÷]QÛõe{HþÍw³6}s(¿¾˜ m©×{É<¶6æ@½?¿èðö]°þ¯‹Þø„Æg<ô móTùú*4žòÇNß4õç¿ègDw¿›Úo•o.êoYëµ¾~;èï•·÷`cº ´å³O¯~š#ãX2Å÷µoj¢]c¿jпճº€ö•>z]ùl-JÓÆ¯¯¹ûå)áÒe|=.í6¥ù^ß·Kó¡ëË_¡ÓgŒèPWýißv¾=|ÿõ»omyžêÙzÐ'GÚS/V¯ßóO|À“Î9Fk#½¹çŽp½ß{¶vòzg‹ë¹»¶/~Ÿ[çÎ/Ö¨¾•§>Á³ý¾ lu•¶rÜ#Œõá’]ýKo^r×¾€Ï7Ù¥oïêï9Âx½”ñ›Pœo%û°ûã²%®úÛÅ-¨ksйú=Àÿ6²Ìñ•}®Ïû^Z½öèÚ©Þ ÍËÊt½x ïÌ=Ã.ùK—=Á|ûRÞž»Õ¥,ù€Ç¾WßêWeÍeçSÏòסù”Öó `½sßw¢rèõýlÌÀ{gM{y÷XuKÇîõ»@׋ºßÚ×[—K~ýh/æÆ^=Ê.M~uà럯¹çh{|ý‚®ŽÒ}³–·~T~s²{BìeFó©_k»ºÖ¾ó•i9ï»~.;Oë=G/ž+¿¼øÌ¸½W¬Iul¼Ý¿Öñøkÿt_®Ï@ï¡+†ú舵¿'UN¿û ÄÅà.ïåÏÞ;ß>i®ôQÚ¥¡z¼£Ì™ùôþh.ë¿ñ]}²ào+æîÿúº|Íǯõæäš÷l|‚§{BâÈ‹±×vóá772ž# ½":Ê/®cÇ‘‡ï(ýÛ·µÓ.{Ó>å¬ROï+õ@ƒ§93ÎÆˆLßdðïï(3kû®¹S7ôþoáo&æÂ\^½'ŸvÖW/—ÙîUA\k¨ßý¾Ú8[“Ú‘¾þÁïwŒqʧ=æÖ«úñQ?«Sà?Dý÷²gßú¦OÅwÍÞ«üêÛÚ6õѹoœýucÙõê¿è‹{: àûÉkûx^™ÙÎTEFEÀ Â%ïÿ†þ+9+¬|©Óz±SU{žjèӯǫøù¿»Æo®QÜ·×XüÇ N¹•‘õëxüi\צ4ÖèÔÏŸ®yAÈë›~(§ÌñMü×üû‹þË üYækOYÆ7׸9‘Ž­Æ ø5¸ŽÒ×Þû‹`³úªczchüBuihΤ5NiÌÉ£|Îk³2•ëx’±.âZÓæ¡ðOä+³ºö‚q’—Ò æP?7ø¢¬ø­‘4eÕÙ˜Ô¥¬ý³y’î¨ÞÖk}G_èAp[SÖµQßíùÔ6u`T_m¸~›u÷ÄúU€íáÒú¦k`ss'SÁú6‡­[kÆ‚ú(žóкk£9nohký9Ùßzý~ÍÁ±ÍåINÛÂæ†úh_››‚þ»®Ý9rÎ\½ùT÷<<ò­NýðÌ’Oª§úNº„S^òYÙSÁ»ÏJs¿<³³~±î9*Ø£Úk\ö”çOý¨ÝÍ͇kDÆ»õÿBã<Áæ¨÷¸øÖzãe_èÿ)ww¶«›9¹Äö挹>y¬Ïø`Né{ão}8áêgæñnNz9ŸÔQŸ »æì"6b÷þ2Nc·w˜Ó¯æÛ¼io÷‘y—}yâÌ4tÖÏò‚¥o-ýYÀxä×ÜÕ¯ÊY+cò,Ø>v}zûVß\y¤Õæ¾ïtx ‹ÌÉîê[½€÷߉ ¿ÈýžÏü¤fÌÉ;yßóumÕæ½ãµ¹ö„Ö÷T?uí>º³¿o¥×Ïrcë\9FÇ(÷åšËÓ½Óx8õ¡ÿÝ µ+n÷Š<=7”i.Ì»=Ñ\ÊÇÞROc—ß¹6eå)®¹òœ)ïæ]š1š»Æò[æÄ³tààímmÕ÷Ê5Õµ´Â_¡ã³ºkØ}ÈÜ3fm2î¾hožgžã•¯ ùÔq·GN½´ï uœô×Oµ^oõúvܾ³¾ÛKðÙ¯{–ùÛq1·ßú{ ^{výŒ =ž)€¾tʧ^y‹ì!ýkÞ|S1·¥Ÿ|,”¾ß¥Ê£Ýí- ç˜wG}—Ÿñshú©~çÚí™|çOs\Àî߯¶û}DÝõgm­~W[Ûê0Âî““Œï´ú¥MbÁV¿4W›§úÊÜœ£Çߣж…­Ãh·ýÚÞ`^]ëWcôýflå[»ê–iæqeå­¿¥“rdÏjcù\ïw6i›¿žw»ÿW®4u˜“ÂÖ°z|'ï`ý~&×·¡²®7Ï@s+<}ÍØ;Y½ŒÞÙ®9ój«oam9Wwõ·g¶W:/lnúné~wÊGm÷û ßé¬k}P—9ë· úV›èoÞ÷7ÏIØZ•èݲ½gŒàíuãéÝPÛ­ðçãë9Ç;mßÎ'{û~Zí›Êûþž¾}åõî?Ù¯ÒšëÍщ¿zº–§4{Ø>«ÌÆü,­ÃžqåßwGéÞoÞóÖxmÔîêØ»S»+ÛüUŸsßýðl¿”¿5¨'ýÄgl}'žì/Þ|ªÃÎ×øíÇS_®niŒÜ«ÏôÝÛî»ê[~àký:oí-ßêöÛ)?õ±wZãU·öZsÆOרmk\{½/8ËVWõuoœ|¼‹µ'^ùÆ¡“-À;£8¡ùkmèŸî c®\õë«}S]õä8ßÿK+Ou-¾ëýº¹YYý:ù×Z û»îä[õìq}ë{è÷¿›˜x^…™Ùª$G ïxßÇ;ƒßüÿ¿è ¨€à ¾~©Rj—R•ÕýáíííÃ'øì|þà|\>dÊóJÇmÙoŸ•çâ».”®½¥ãÛw¡wŸ½Kÿú^ý°o®~ž=äØ×—êù>¸<Ådå¥mL§qÕÿê°n_>øUÇê®Ï<#'ñ7†KÐ|üùúÝZ_å™õ§×çW½‰~õcó/?úÕÇs}¿pxðoŽ}`chþéGù´-/{ð·xã­ìÆÞø¶ÚU_cV~eÊ¿tàÇ‘ïŠö°g¨óeyÚßÌôÀÏÚ~ U¦°4sZšçVúÖO™«.PN]ÿß~ÖoV þ5ÆË&çQysÝ>)Ýgòè~k _2íSi}^_Ú«×~ëÓ>ÿø¬õ¸j¥®êy•'zgí*Óy¶z€Î>kÅ~{Âú3#º']¹ÚÙ8ꟸ|K8‡Ðw¿q\¶XÍÑÆ²º^åp¾ö":™“Ê;3Éú.½g.ñ¯>+¿ùlÉ èKgÇÂÏž¾:[͇º¤öCó¦}öŒÍ¹uÕ}}šñʰJ—¯à»¼ñ^vvïŠIèŒ4®õsõ5fžywW§¼ÞÑ}ÞØê¿8y5Ê8ÓÔg•oqÖú ®Ú,oç úû®.Ÿú.ßës}¼ì—κ³X0öÖNÙÕ×øë_cÙ¼þ ^”ñ>Ïl¯þžΚ=Bï•o}C¯ºÛ§®î¯<´?ûv:‡ö¼ï¹fÎZ¯ËŽôú±þƒ÷ÞP7d=S«gã8KêÜsVŸŠW÷õΨç^Ý{÷jäqû`ñúé]·þ7îÆ®Ÿµß}ukoû_ü=P§²[{Wße8µÝýÊÛçúÚßÀzäé{hoþê›ï¶ÖU{È<4VeÔïÞÆß½=/@k£ÌÒÚ/ò¿>´ö?ÏÍ«÷'Ï®ôͳúkG8;úÒ»‘r—l}Òž::Ûä1ÏÎ]åÜ3Ÿ«ß¨Cß–WhýXí`kî=µ}·½¥L×΋W¼Ë_»îµ>+»Ïû{[yô›µ=¹¹]Yæ¶ò{VÖ7stÍ—þv¹5¨¼ëÞ‹ôã=9€~µ°Óš¾Â='Õ}õ©¸¿}9ó×y/yÏÞ«¼GÁ¿ßªË¿´æÜýž)í‚ëÇê\]¯žëTyõk ØïªKŸßOì5ÿ彿©6ÀûûOsäsqtYïhÂÚ¾ü•ÆR¦s¨<é´Þê…†¬ý¶_=[ø¡}ólÑ .û}qŒ®ê(°·±ÿ“¾<ú ˆKÕ[»m•ÕŽòË×XÈ£±#ÿ)ÝK—&¾1úvmVÆùêÕoñÓ³-½¾6Οӧ­ï]gQŸ6~ì®Ïö¬Mêk×¹úä«=Ú"Ÿ¨¼0Ö09ßʯŽWôöÿþäwýÓwá¿tv-h•%7Ь3yŒcó~{òÊS=µ±9ZÚ¥{y{†÷xs%½rÆ·v]góÀþ« åZ‡ éìïÆ_K'gÍy× ^åõËZ`Ζ9ÏÕ]+@œòK¿ö»±|¾Ú—Þs³<•m\מÖ¯Ðïå§u®˜Õ%mëhý¿ú¶úÀ1ÆÖÍB9r¢_»¡¿§Ë<¬Ÿ€ý©œy¨Ý•YyÇ=ó*[ðQ¼º—TW×ïð!Ï÷je×·âZÓ½×ìüúÏ=#¬£æ¬÷5}­Nïø¯çh¿5œßõíxë²sШ!¿OÎAkó•®ó¬0Þ÷tšÓ]ËŸòpfÊ‹~¬)æ ³ûÆ í¾Wïå«¶ë7w§úYÞKÞ>û\ÛÐÛªË8ÍËê·ÿçsÜ}TÞå¿æ…w`àݬòt]¡ë‹<=?k‡ø¥í}e±5qé|ch¯=¶ò´ÆgÎôÁý z'Ò—µ úAoãi½éû®>iÇš\p.wÞz^ß6?;Þ‘DyÍÉ%»þ—Ï3Ø8«wm”Î9tñìd× 2;W({Ùæ‘¾ß¬ò/˜³F´¡LkJ^ÚæÄùÊQK´W¬¢ùï™Ì£skkk«o5Ú¾ƒ÷ÍBÛ³‹úéï úÕ¾0¦¥ù¶‘ý­muì¹â}Eì;yQ;×ïÁµ<¯@w}s›óæim{ÖÔÆÕßÖºÛ< mËSyæ¹OéK/“W=׺ëåÊØzvÜúSÿƦŽå/^Å­Žú]¥££¿åyx¥³{E½ÆZ;¶½Kï^½l˜ÿú¡Œ-õmmv?6—ô¹ƒÉÙî:‡²ÕåwZÏ÷]›ú½>ï|kž–z&¿»®ÍC}«^ãûö/¨Gc{Ô¿¥igeÊsô=W ïD»?–ïÍ|h³wsZ_È™sÕ¹þ–¾´õôìmÍécsCß1mkà£{´uQí¬Ï«[úÆá÷§yZ™ ê¿êñz‡¶¿ºõ¿öÍÕò‚þÒ3§9µ妺]£Ýw ï+ïšÖ¼{U=½‹ó±õÑ<ù~Roý†Þvi»Žý&éy{{ûê>{§ÏßéÓ×|ã'/ÚÜkν7úN{Æ1^ÇýðpÆü‹wúR{ØÉhÞo4÷Ù0˜kz!ö!ö¾~à,NæaìËOpðƒ=lÿ=kÇ}¬9/8ìÕËüý§»†±8Œà³œçècßó¿^ç£ù9ˆ[y;"âuatœý?¾ý·.ªöuäü•®:Y½W†ùöocŒgözýÛkà[c[߯šûŽŒüaÏ–áPSõçòÁëî5G=Çwl²í»£Ä þÖ.ȽÅsßð/{Ÿ¾Ù˪¬÷æ7:¯š›mÈ@O:Áx:/¶×›»¾|f½ìÿùâ¯>÷Ëß¿ý›3ç¸ã¨õf\Û0½î=µ­rW×ÄÝqn½8æëÝëÚdŸ×KàmL/œ¾æ…z÷Fëû¶_³{ 6zl[c±ÝŒßf´mÕwÑÓùögŸó@ÎÙsýì/–íž}ÄwÄ<àRG­cb쬆È+Øð7G¶Í>Õæ‹ÊÚïŒîƒ]œ’ýì]_-Y±ÑùËk>ŒæßõÖX?‘χ×|›Ç½Á´~ƒÜµïšqŒÈßèõòU ¨ëQùÀô7Ñϯ5Øð®OlÄÆ¹Ç}¤ûâ#?õ ­£ÙDÏó>²WÔ€÷wët_ÙÜßs®;ëAŽóÚ²8n\¯µLk¯ß ž;Ö¶´w—;òtJOûÄuofy‰ÉFçlçŽ[1á3ž××ÀâÎqæßÖ³Ú_såZ©­Ü…gÃp>ZoÖíþäßsãoŽ·×;ÀÜ{ܱ¾¹ÐpŸj˜óÊÀ6ø–ÇwóW¾Ø®kbTÙ‹ϋʃ­à_o+|Ž‘e/^¯¯ß à‘|ï<Æö7þæŽåFþ0öU ðQ÷`¶þ·¹Ïöþ´z¿Û›[ãÕnË”¸÷Ý¿È|þ–49†Ý¯žòU¦wÁáûÆ{ðÿ¤µs½ÑýßrÈ}d©g®CðFŽïÕ/éu›;¿È^:ÁöûH¿³,'(^©øà‘Çš÷ß²Íúì£yÖ³˜÷oMàòûÝÆ2]ú?ú;Ðè©gâkïùm·OððŽÍw¿—Œ—-è^Íú½*Ÿçã©¿>»â´ýÙÕ~Î]±¬Ï‹ÑõܶÕoh²Ó;¬ÖÒè)ÆÅìý­^óºg96ôÞòCÎÉlåÞõÜïzcÚÖ¾]åiþÖ·ª÷ÒáµyýžX—e¹ëÔºïpó=<îyð=²-Äžsü~ß ô{½oáÉ’ ç—}ä°Œ<~5ô„¿ ‘1/~øžÙÿ‹ŒÝ³äF–ù¿ÿWØÇ[[+³ ÿÚ÷à·Žæ²äß`Æ»j’\^11ï%;ZÝ¡ƒœÏ.ßg¿{ØåßÔ¼±©)æ–·½ö‘:±};§Ïñ& Ëœ±ÞÈoJßÛº¿açd_c{4i½þf¥ß cmî~çÞh>ÿö5¦¶LŸ3G[9oܽ³8¶©÷˜¹qÚSg÷”Ê?ÝǵzðËv³÷ô–AþýR;/~ûöõo;ÁÝØ;fÞ즆‹}É·±Ãø®Üƒ>þ„Ï^¿+³sî£m€jç¥ùþ&¶¹ãv6 ‡¹É±19îO¶’#øxO‹Ç>X=¯Ï—MÓõ~[úx^™Ù’]5Ç`À6»yàÿÿgp3"£¢ÏÀC…tÔ­êE­åÎ|~{{ûðÂ÷ßðÝ«oû1rú+gNeŽŠ Ww9+—ƒo9jãÇÑŸ3]ûr¶•£cà×÷Ægßï_Þþå@ï§è\~™‹f¼úyåà÷Ñ-Ïê.žòY>|«ÌX×'A®7×»ú¼ª_;[3àç×}ò}q›ç²ÆL\Îqͱ£Ê]í®/Ú²Ïú£'öä¦ïÒ†õQ~ýÓoy­qðgúãòi×õI¦­+¶ê,GÛžúµù2Ÿ×b<íårÓw¯Ñ¿|·~k¯¶úý_ñ-vß>aã³%»:¯º…ñ_2¹”µ/Zã=¯ÙcÕµ6±·u§¬5m œòÓãU¶¬ëž=ìç«–j p¹÷Z»—kn*¿jÆ3¤¹rNÛúV{Õ)ê÷QÁ<ÖäšÓþÖî_ÍÑò3ö[Æ*ëwk@¸Ÿ÷\\Ž]ýxÊ7 ¾øþ™sÊU{ý6ß»Ÿ;¿-Übó¤Úì ~ônÜZYžäµ}Åc÷ìÅS ×ó÷Í»6ßkÑó]÷ÄU½õccÛ½xùÿ§\Ž]gÚrÚ'[Èü²|ËStïs¹×o¹—Ï}h­*/~;Þ:Û{pcs¬¼=«~|éÚ¨ã»VžW»¼»ony®;þŠ ðžPÖ·•Ÿøàh¬õ¿>ÐßsÔ¼mþ›Ïþ>íuåû?g9ðwGýYÀ»wŸãö÷¼,Wõ6îêÏæœ6wŽwžr9¼§:NëûÄ9êÕÏÚn¿h|Þ«ùìÚ+·o¬¯cž»Æ]Ç î]ý«½ µ¿2x.yù¼³7îæ´sÙ+k§ó¯õÔNçx†‰Ëÿ¢÷AëÏY{÷ŽîãêmŽ®¹›¯ú°ú…gŸvÔ¥Ý5–ÙÞKÝ~¯Í¯¯¹Ô"5ÐwL¹ æ‹æ”=Í5õa×¹ûÓ½¡?èv>aó©o»^ê­¯ŒS·;þÖ¦k]ƒêíã\ÝþÆì›–q×Þoe­9ô§v'\“êÁsÅÑ|SvýÔÙufl9®|—ßxô³²ÖÔż«;æ¼Þg«ÜWÍuí·¿sä¼t„¹Sg÷¸ð<ñ›sÂ|ßµ¿÷ {«ïžkOí\}[4W¿1‰ú®ÇÌ‘þ´Þ xñ»ï„êÕ—Ž{möj¹ÊSßÊYnï¦ý}²±m×l ¶ìuëòú[‡í•Ó…<ë£óùÞ=º@Ÿjo¹\³'?v®÷´ù7gí#òÍßPè.7pœ[®CÓnýwn[±5Qh£þ\z‹¿_mý½òhÝ€ë<[l^–¯1VϾ>¼÷&_Îõ yëfc³¿g`±k´:|[KåÜåþŽº|_.až;ֳйêìyÕx•­ýåwí;z—ö÷míëÏ“Ûßk¢óë‹<´] åû¿ÊÚè>ý-ö,±õwú{5±o)‡4&Û¾¯z¿òí8ð~¥ïù!ãúãÞÕúÙ÷—ò§VÎú°µ%¶µc[ý]7Ñ=ƒÜ¼ýªØ—x^…™Ù®7 ¯ã,ÎêìÈÿiR@R8à\?’Hêp“ØÝ3ÞÞÞ>üG_=ãÇgü+kyêHdþmt¤¯³×9£¸ÅcýÓ#wo±ÖÎ7á¹_lI d¿>#üïž±¸µ³Ø?F&^å?D¾qI`£v¯9ôéáuoI_Œýæ|ã€~yøÝ™»æQLy›ãõcôÌèGsÒü1§ž®[s1­7äyosM­üõÆAÕéHm«×ü6Žê´^­ùq/:ëï×úé—<÷Ô®Xê‘Ë›ó ^©ºœî¹ìjÇzµVæ ½Úßü±ÆŸÊ õ™Øå‘ÓÍOí5'ÍŸ>[×??k0”­ýb³9(ŸüYë.÷|ªßœ8JÝï^e~õ–ÜWù÷¯>4Vå‹Ë|sR;Õ‘Ïœ{ëº÷E,hýÿ-¼Ë>*ßÞ«/b÷9VÛâ¸n¿„Äcë¼xæó¨ÞÖQ{ëÓê:î93oîk¿w?==ìl-Õuoñ+_Ý’¹0NÈø®º©SÞçgs|¬«[_ÿ’½ùåOi1Åh>å­íâðt﹤¯ŒÍ7<î‡øŒí­Åpmýûî(_Ýæqik];öùëCÏ,8k‡þb¬×}.ç]ß•à5oêÊk^¬ÁÊ”C}Öo=‹£~ñôOû×l{ïœmÖVÇί3^ŒµóÏÛÿýؽOõÉš©§oíÆâ°<³Ä¼¶»ÏXú„Þu¶­ï'«×Ü6øÞwiŸ7èˆÛ÷UùÎÕßÖ‡kyVšŸÅ‘·ò+ÆbWŸyßsö.wn_¾|èºûVNz66[“õAþ¾­ÍîQF7>é:Œ{ûmÅn¸ö—´lû ´÷ú=þ…/õ;xõºî9/ŸÑ^lÙ‰ãl®öª>Šß:Ø+´Ý}ëŸ69sÆ}=7¯÷ëWä»`ûæµ×Xv¿ÔžyáTfL‹µWjoí*«u¬‡:Å»lnÝÌõÚs$_Ö¯>*ß½¯H=úÑöyÉÞÒü)[»ÎÑ>×\]÷¥ß”=SMùöäë>•ôÿÊË®Kô¥Ú®Ý÷{x¹÷³¾Ô¾1•¿yn~Àj-Jè^ߦ|£(ïùÎc¯†W_Ö×å+c¿G‰ã÷ØÖµ¾×gÚuß×ÄßÑû ·9üynÌŸ{ÄÑ/ù¾‡GûÞ=¨ß¢Õi ä·âï7©¾3÷¿|ïYÖNcZùRcú’~í©ûÊü+‡Æ³üæakqÙ½rí{FqÖÇ}î]ù„È>ï3ïv1{ßKÙûÊvùÞ¯â-¶¼ëYê}4¿ûŸƒ²bT¿xÍíú$õÛñU~œ_ÏŸÆ(Ïÿ «ã]ÜgÃê¸æ7´Å½l•Wÿ{÷yåü¢/éšÃýÿfsç»Åoû:µY}dýönÕ.£½Ü=‹Õ3Òýêþ=kílßPî9CÎoÖæ¤çÏ9ÄïgâáK¿áÕ©¼~úmUAj¿ªï¥ú¶|Λòêç…õž¾*ûsäÛ£šë³~1¿î¡Ôý¡6SúGjÜx^™×®dU ïsð@úÿ¿„%¥’{@‰ìècñ€7b\¬ÑgÜæÁ¬]X^ÿ4<—ŽñÌfìÃ~cý 5Ë~)^ûl¿,7j |ßJvXöÃrÌÛ·ú=úFü¬Û&ú³ÍóÆ1nù±ß›bÙž/ž~íiÝ_ðëCé»g}±·ïpwÓ÷üúkÁª¯¶çóƒãµ[¯5YœµŽ›ósùñë!kùbÑ7ÆÅë|¼ç+C-Øï×Êûõkxÿø´ÕïœY§u¬Æ6G- Ë|•حŘ??ò&jÕ¼W±Fõkvc}plwý†ý¶‹ñ%KŸ:¶ÿ¯d¼îü`ÃÆ×¹P>ûtQkË´äþµàVÆr­?ö§ë“3þ•þbÛÞÖ<ðÇuãz~¼»¼fþ^µX_Æ·ó—8L'z³Þë®Õú‰}ÈÚFˆs;9;Á»Î•Úî9û‹=ëÿööîŸè+÷21qNÊk¾õ§Û6ONãúõõó>q0fsîØ3·Öv›×º<Ïš÷“ç¬Û8WÞL?I†XÀo¼ËÓæº×÷fC¿í¨|ãüËӲ篼¶7lkq‡êA·ùba>ð7ï:y…ù~1cÎ:ââµÎ}õ´ö£60æîmÞÈCu47ËÚ½íÖ"_{-Ç|uÁ³Zq=Óx•-ÿ°F¾ˆr¶a¼—x‚qíåW´Z¸ò~ÉvŸš¦—ýS<ÇYÞeæ/câmž­oÿ0g]Ô¶…w&ctSÇ[ëY^[¼f½èF§qvWÀÇ÷¢e±·gëkç/}ߥøãó¼ò&æM`¸öšgÆÎöë­»Ê2F·ïx®¸×GZ÷+óŠê²®%ßyÆ®¿Ø¾–ûÈ<ÆöøÂóß”ì÷êºöÑEØÕù½ 迯ý[‚óBÞ*ç3f¶ë¾ì¹î{äö¦CÏd±¾öáwŒXçwÏÓõ÷ž$‡|w^öƒqunìx4^¶¡sãûãiK¿±Ýš¿Ã{FÀ»½·ñä‰ÕeGmZì¨I¯#?}|^ëgÛp{ó^þÂo,ô!W]³©¿¡¸>zÏ­Ý:óİwRutŽBæjK{ƒâëûÞ“— #dýÛÒ«Ú5–e™#GŽ?cÛä¸{ä{Û11ÙŸµýÞ°m¯j¯x³ë’m.Z³ÛÏ6×B}m.ªËuz‡•«üÛšÏW¾9?×~„Š×š¸xÜá¿ýü·|nü-c]¯tzíÕþ¯üçæÿÑß1ĵµ2âíèZŽyÁµØö§øFøê“sÇ¿ñ¡Ï7•±.ýÄǹÝÜÞðÁÿZ¾oF>Ã̳5ÛÇYaŸÞG=ï!dY¿ì¯Í|/³ç­ÿ•-v÷yð×߳Ϳù÷­E½ø6ßeÌÃ>2¦õ7É0¬Ç6ùÍX=çœaúY—ßÀh]@¶½:Íë·QkÊ8ký½h¾Õ(u‚=—þb÷=‚Ü+ŒÊ/¼ý®·ÇEõ}Î~È{ÃoËK–˜AÎ?qñfDyãú^ìÿH¶Ï6p/Ì×32–­ý½‡ý›ß–1¾ó›^íù;‚X:#æª {]—-¿?-:ÊŽ÷'çkðObl]—aõ‹x^…™Û®7EÏ!ÁSþÿ+9Kê%-m¹‡‡’ír]·Ë—žy~zzz~¡¿®öÕ ½½ú¯´ÈÑ—þy¡?¯¾s´o®öƒŽcí–>\í»ƒ^uhñ¡û•m>Ú« c‰8µuòYÙ—÷yx•5ÞÕ…ÀOÙm¡¿¯Öø”ßX~7f­ìKeè[°¡Ýõï1w·ÖƬ\ÛS ´ÆÊØu<Ù=ùtþ}ÆõGÍ‹!9¬®6[SêÃoŸößð!ìóÚÀ§~¹xò•Uïã% ‘¿üæQ‡5 ýwÉšGã…°)¿g@e–w·f⼺Ë+Öå›gùž'ŸædÜ;·9çþ¬LõV—¼Äpc‘ŒSÝÅ ~œ·>V¾±Ôõ…,ë †{N;}ç83*Ó³§òµVמcy{ìyVk·úÄܽ²öOºúÚùSµ׿´¾âèÞª¼çbI;b¨Íb*ïSôôAתºàÒõçQÞsrq¢~h=ר¿Æ§¼cí§gwyê [ìÖ÷#BvkdI{wX׿õÕÜ žom™óLòÚ:í›ðN¦¼Êq–â^³/ö7ž!Ú“z>Kç÷Ì?µË“Êï[¬rú•çÙqº{ª÷¼¶Å˜þîIez&ô?bhϨ%Ïfäz_4ž¶»¿Këð_ ¬x^…™G®1¿sÎiçûÓn@ iÑ çåÀ!©Ñ³§§§çÿñLãûÛøò†ÍÁd äÌ7íõmþB°Ü­sË1ŽÿYr¯"¿çáÍ?ÙæŒo7Þä¿Jþ£ù=Újíw’Ûó߃þèô¡5üx£¯ÆDß8ÚæËìâ×½Y½ˆÍ1Ì.²õcù‚Mó³ù•­MžÉ ü¸ÎϺ“¿êÅÖxåÞ½¶]_üU§vêý6tëÔVe'ë—ÞU–øL_-Èçô¾R[xØXÌøiý©o}ñþ8lÚ篧³mçjšé¬½áèäϹò.[ßqmܺh>Ãêà½ÄõÄΗÛÈ;wZcùŸdŠÊ|:È ôΰšs‚Gƒ×ƒsià ¬÷®Oë79Çç÷Ãör¥Þ¶KŒØf4¯1yÛàü+lc{ïj÷è.¯±bŒÞ3mà\ãyky#ûòâ¨ÍÚ°_Ç=»ÖåÙ´ùc]CÇ9}—g𩦠W5ñ» Ï{ºãtL›{?;Õ‚5j]Ûl<5Ã^u·&œOmпÆã=¤vwî6žÖí*Wàþ1Ö/sÞËÖ|x§ü6÷ºÝÝ8·>m¿O˜î›;ö˳—»>ø²MÃúh;¬¥é±Qóì{õ5¾ó„U_ïñ]›Äo㩆ømGß^Oün9žÆV­ï•´ÅZ¿£ï™O6±{:'ì§þG«k£wšúò3ñv!7:}ðšwŒèÛ¶×[e~ƒçä‰nõÇGß~,sÒÛ3µ"7ÖKeO6Ñ»'ï¾×Nk>ðžGìU‡ØGcºÇƒæç­ehWö-?ø¼n?‡­ ÖS×´mW¯k ÙÑÙK9ÅG,ô]øî‘ÏPzqŠÏ1a»÷}ÞüÙ'óÆ }ïò½{¿“ýN6®^ŸÐ¯°Ü‘aoÅ®åšKa?¾³Tnx´Çã5ûØ=ŽÚŸëÀsÏ›úô=ÿ^ÍFo},Ë|wæömûŽ{óî¶É{9[ü~sœ­#ùœ¾…ŒFý'W]ìRûÍùv‚¬ímäN7yÛc̓õ¿ÑûšýØîh=ó|Çh=Çó™æ>¶F}—ÎÈodlÂ+Æó˜ê±çõˆ~»'cð¾PtÏ,ÿTbâ÷€åN1tóIä{’Çüß^Wqî'ö6÷÷è~7 hÎ{p}O±Ãë·Ç1˜WÛí!²ì 6¼Ï ‡œé=_®ú>½Þ£·çÚ–ç{ m\¡¹¸^ðögç¿q nÞSëÇß©¯z°ç5S™b2þVà¼6çΊœßkû¨/×°}¾Òi_«Ã^bÚÏȹ–¿osïµ?¸^]k'ì«û7tÍbotöõ¿¶‡Ö–³Œo­Ôâž~kç˜Çšz6×§¶[WW°/¾™Yît6T¯ó®ÕS,öŸÊØ®cfîZ ô»½AÀëýÌw é8wçว—ŒÿèÎÚ~z/1z¶o<Å,Ë]œ¼îéú\´¬,ëÒý¨ÛF÷Ö5@›Ô÷v²;ïèó±/â„ßÑ2¦û7)úŽÝÝoà]õÆv `osÎÃyÖžãrgýñÿo÷>ÍÓñÀçÎܸOýÜœj0ð¶w‘¢±ñÜY×£³ÿnÎïâÖ×v}î@Ÿ|.þÀ³x^™ÉŽA ö}½pàÿÿž˜¡PV‹ƒåLïv:]UÝ·ÛíÉxúˆŸi=x¥ýðø–‡6é×ÿÏÛ¿|z•oœðO>Ù¯®íëö±œ®øƒÖ”u{¯{Ë¿9È9÷õ˜÷ôKs?Á‡ÛßóYn®…ukcþ†§cúIþ^¬Ý³Ð¿…oÝÁ—È7Æ{Àý4`‹^åÞ«ýô‰Ék÷9ûÆî2LŽº¢Ëú”çúlëadÛÈö^aÀVe¡q>ðzîîùçNëè<êk~FƒNí\{רµ…6ÝÑ{Ñëy8žò®`²žÉø¾gão@MkêïZræØ¤vîEôv÷XSë²ï|c ìXKÏ€5ñy^Û–Áq'Ørž Öœ¿Á¹4çµ"n÷ã•ÞU ~vý±ï:~•|mM–y][­Wó­?|èxfýx”w=<;ñáç¨g˜ëfh¬Ø‚î˜{¦;tkcr«6<§,KÎä[{äÐy~’i.Ÿµ¾êb¿³¾uûž=11'š–54Ÿ©{²ÈÓ ð:—K{šžòÌ"–ÞžîCd[—ÑÜo¼Ãl}’ž¼û©2}†~”¼é¶ãºz|ùÓ£æWïèÀ£îµëü –·ÞÎeô«~¥'j¼{g¿î¯“û^cÛ»Eó¶o¯ÍŸžã=ÝåÁîñÒ»£»G‘m=© {¾‰ŽÅú­ ó »⟠ëõKs¡n=æòUÝü ¿µëo9bõ¾ö|F¾»è:ÆáÖ¢6 ØÙú×ãž;ÔØ&CoÍÏîpcq­ìƒwYÏ1Ûµh=k¾MðWÐád*?ðŒ?=‡»¦WÊsŸ×ï€Ü3 4Ÿ5­ÍÆã¸Ð;atZÿöËéù^>¾Õ*c¾õê»ö¼nÏülÜœqž¡÷¡þ <÷™ý[×7tÖ®­kåD®|÷ ôí÷ûÙøôkðdÁ}_j йÊØ»Ð|ͳÛö±qòì²ÏÏäBã²íÚ3¯ßË€ßmÛ>·gþ_Ýåáåͳ²5¶-úÐù8VÀïA~Çpœ›ÄÕf{txõYìß\7÷ÏÉG×õ³»H,ÄÛš×¾ûÇw Ü;á8\³Ñ— u(õbb1oÁÈ:¯+ú0ç<ýS?×úè “2Η³Ù÷*wαþ/œf8`«™ã…¿8ô ´úaö“Ÿ}Öoý—²‚ÓL¸ê/øµq¢_åˆÍöÂâhÿž|ï>{Ž˜o]Óƒ}ÑÈ S—ÞA€Yb±aøm—µ}¢ƒæÀ½ØïØç;ŸŽ³{lyÏÝë¹ü~ëï@p¿1Ñçw0æ ³¥µ˜.gÁóÒq^õ7µAÆõ«¬å­‰ãBÛ¥Æìyw¢Nätò‚>/¦Ç|b ½° øœ×xžwÍѶN±ôb¶ßaÎÓçŸßÅØŸj\àÿ‹Ðéì¢&Ãû“íŸãêsÎ2§¸vÇÑÙ¼¶~¯‡ïõ¢¡ù!¿¸ª×F–œøv¦W-çØŒmºu-Çœô¹Ô€ ~AÞ¿C[·ñ¿sFbx^˜Ù dE[÷]Qýÿït:˜àÝúTÝÊýd­÷Ããñøú#}ñ‘><ÛÏžôy¾éçõ=eW÷"t¾:Æ´ GÇVžöçô¿þ¥Û1ûW¼ß½ÑÃOó§%Öµ±üõ#ï·g™bYºìcoãø!òåµ~´Å_¬6>0pLùµ³´ñ´&ÕGè(·ó°rÄ$.â‡|cTç׌Ëŵºô‰å›g¿xCbýªfÐOOm5NøŒõ[œ¿ž¶êç¯ç7|âÓN}«_LôiŸ¹GÛÜl‹qÏÚÒOeVÎõDÌÚ«ýÊ^T™æR~ÇÁÂ<›We¬cb¹ñïü]ŸµOê&ÞÕ'å©Yë%.âh\Ê3ŒóÕ¾¸¸(Ãx× íÎ]m*g¼­Síþ“¾q¿ÅÙ5ýãã“eŠam-bm.Æo¬Ê³®31ïÆ­ûÔª¾ì‹ù9¶ó¥ñwé|®¼Ü·ÃÚ4IÅC2÷êRÚ§êýÍϘŠkíCì1Ê•'þ•­ýr}‰§öŠE1mÎÎõõ 9gÞÅP[¯¨5þ¿:¥­qIiç@í¬¼ûJñ¿p*ÕþÚÏÝ×^Q}v¬kò"×Ö®ÝÝÛ÷>³k©sŘ+¯]Ç®¹×³²óyãÿ>ãsB>}}þn=ó•Å7>š»9é§9‹ë®Rlw¾k³ü™=jmv !/áßýX^ÏÌÎI¨±ýòø„»wžæ\Æ¿qU¦1xÈ×¶ñ(ûwäÄG¿©wSú­÷ÆÔ{‡±tÍ7¦%äÄÙsºõ©ÝË·ÔõpùóŒØµŽ/ýÿùøTÃú¥fúÝsVûöÕsŽÖ_ãò.©žûÐګήùÎ3ÇJ¼+‘Ùµ[Ž3Ë«MÖFß’ïjrÅ Kåà7ybP,èWv×ÿb_•{5Þ»‘spóƒ®û¾{ØÖ¡ßÞùvMm=× Þÿßôû.s/iÌ |ü˜‡äÿ‡ægÛ³KÚì>{Qó+í k¯¹Öo[ÏD1òMr寽ݟ‘©ïŽ/i[¬ÿOÛâê8¸éÓu¶>à+Ó÷c«CK½º*« ¾Ý³:W+³ñöì_˜+öwÏ€ÀE=±pÎû>ÔouÌ÷U½õ-6ƨþæåzWÇ7üy6ÀkŒÕ1Ÿ‹×o¨wtó_9m­kuöÐW¿»Æ”]Õµ^«']o?õ*'N΃îm­[©5D¯÷«îkõyÝ;®=ð÷§ßºo>ö;¾þ–üÇÿÊ·ºÖǹÀ÷…‘{xöŸMq¡ï;¢ºü7©¿}ÇÈÃ'k‰Ö·_åô£rÞeüÞ\¡î³Êëo©±·ÖÐ…7ã¾e¼¯Ö¿}ÇÅnׯïd–™ƒ1°ÿ7î•ï¿§ækÛÿ º›åx^•™Ù®7E$)³Äÿ',ÑKYÙr_.%Ûåv vwŸóâñx¼üB/.úå ý5Ô}ç?^ceὺƵ!ý~ØAæ§K~å$d ý2¢ã\9æëÆýê«ó”ߥ_ÿéöîlþ|à™è”3ã”Üo Þ\£ëƺöê—‘Z5g‹}s¶9^þ»Ç>ëudÀjÌòŒA>˜jÛyí²n=Ü¿‹÷ìŸdêk©ù|.} |sU2ÿw±ŸpÀû-óöLë‰ s Yõì?æúq­Ü_¯} ŸQl‹k×òð_§üÀ·¶Ê¯Le•¯ÏÓy_LįíÞAÍ:æ³¹#v䊯öÿ¼öá½½äðçݨlë½µ2_ÆØ½£ÇØZ.žÚYœ%ï'ö¹;™‹éd¿òâ¯mδñ>§[çáWV_ÌÁE}Ô}Í3Ä~í³gýÛ÷õQ,­ÍReÁÜ>©Œ½b.7^ˆXÄ\ã§ÇW<ÔHß§ÞaKçêÔ¿¼ÓÈÝÉÜ–öy¶9Ó~mg¶²Ê-Ns ìöYk»rkgå!ÏÒö€2òkÇܯmFä[Úl}‡Ä]nOöükgÎ=Åžç¢1¹oÞÝ_›%yÖP?õuÒ[•9ű{æ„9÷Kq¶^ŒöÉö©8[ol¹·uQ¦5Ý=I½­³²+ß»ÂýƺþzCÍ?zb4Ž>×è‰Æ¼X\û,E>ïsRrm/ú¼¸£ž—Åà\[‹ÜÍMëÀ³Õ¹˜š£}®Ý¥½N²ð·ð׸ ž?ße”9Å/»ÖõÞƒÕãý‚Ø«/žµís§v7Žê0÷ý®üÕiÿjwGuµõ;ÁþÚ¼ÈSîïkÞûÉ3^ûÿ\û¬É=··Nù*5®;õ6Þ•‘O>}§OÜÍgcglÝÄS_ð½g´¡}È{®Ö×ΡڬßÚ›öå­-ˆZ›‹Æ»½$)‹ýúði,ž=õÈñžyÎ"<ðyê£r«§oÆö«r¬µ[›òj_]yæÓ}žùæÇ½S¾šõéweÖïÆØwêžïÅWÒg}<µâï\î1Öâ6®¾ÓCÞu'Õ¡^æžö%ß Nç¯v¤~_ºWíˆÝ}ŸEµ}×÷=~wf«O<‹i}ØKÞ3ö)û›Ëæ~{È}iñœä˜‹ßx˜×¶Xöãèžçû9¾ï¨çzñ™ŸÅ´s×­‰úÚõ;µqo=­ü~ÇÕ~ã¥Ö­gëýT^v¯ïiÚØ;”qŸ7+²¿6̇½Ê|±W·¾êO²Ž•]=Ö§wbçw¾÷9×úÀw_,ÎkÇoøû}¸õ*–Ê0Ö¯=ØßZŠò·ÓÅ©îú‘¼c7ïb[+³}`ÎÖÆRÏ{ëâ>1ìwŽ2•-Æê;·×›ûÎWþDÈ6§Œýÿ²/[·õq¢•1‡»ß)ÎùMŒôH¿u·†s}Kí¥ºÅ&®Ú;ÝÝ_^÷îbgîsnßôUí¿õSâý€±ßnÝ_ýb»#mù{„ÝíŸÚ>ñNk¿WFÂGcØgjm4gê7oæÚüÖf1!ãûäúU¯ý±5d¸O½ÎûŸr}^-É?Ý×Ý×ÿ’rÞûM°vj‹±}²Ö‡z<7÷]Gžòû;Vsù[ˆy*öÆË¼g©vjÏß0ŠkcÒWõJòƒµ½yÒ±k×óÄÜüz×ú»ö|5çÚ¬/çê´Ç2½/êGbý1{ƺ=­ìò–¬$–﹋”µÆ›è3­Kx^™WŽ$7{å½7÷¿©ô€ l(5«Éôަº?¼^¯ÿÂg?kýåÛø…èËÐ>­v¾ Ÿùg^ã«ÀOh¥›X¬ÿm|£9öúÈܾ}¥ymol.zý×_ç ßXÿpÌŽ™¹}j.ç¸_ßæƒù~å_X«ym ðÍö 5~¯¿Ö¼:m“þØè¸Í_pOQ[ÛqÙ¶sõýÛˆìâ¬]×ÿÒSþር±4•s¿ñÇ×ÇÚTc}ùPòg}Î#ëúï51מ°ÏÐ6.·£Ñ§ø`?Ü{êñx†'w͹Á¸íSûç2\±{~ÉÜçÄk—¿Í!±B+/¹!>žöÁÎkÖÓOî±ëZØgl[×àª?sÇb}¿8€ýEý—;zƺÚkWÑ ¾÷Kã¬|a|Í«c¶îú,vì<ÓÖ·ý楧èÊ_8Î=t7ÿäIJž¯Ö•)8'µe]ÔwgQõuýh®‹˜ÜC¾Ÿ ³¦ÿ u26ëª[ÿùúX³ö} ß7_¯”n;›óîØš½m¿ìsq¾wìÓuçØ¶qíçÚ@fãüÃÎo<£õþ[üîû}2p. ¾­²Ô3ƒ3Œµu#Ï›Û>oÌ_›½Ÿ¶^ì肎ÞÖîwñðÖ¶¾ËÇ»ñÚ÷ðð\çÖõ®ÝöImÔöFïÃÒŒ7;Èç?ÉÚoÀúÀyõ¼¼ïÁõþ}êÙá®óhí*ëóbë3Á½e=|#¿œØGØulÂãýpg~Ùþ3^çÈÕûÈÀ_½eûà–_bòcÙ>9/òfÚT÷æÔÈïÅê±-Ç>yÒ»µsá•¿¸÷dlÃïoÛ÷zÂ2Þw¥M‡ß:®¸§üo½û^ò7ؼgsóõtNÐ3Þ{ð]ñ"_=õzëé{ýÒï<#ç=„ è¿½É ;úbö[¬úÿ®dzÇßÓ¿ìÿøfÛüWløîïŒË¾½ÐëÅ{éµ~Þ€Ô>÷¥u8÷WL>gló© ¶UÝè3Þ÷¤í1šw¹.Ÿy/ð÷øÆæÞóöµ\¾Çß9y_írožöñ¥—|Lßbk­ð‰¾vOù»vãd陯b­µœÿŽ§ç øê´çàSPûÀrðž½Áµ¯,sÉÙ·ò±~ÊÙpؼün>9ŸÞ±Ž­¾”ß4ûi]Õ³>hŽÌ‹¼×öŸ¤Ÿàõh¿˜ªï»gìûìøá+ï”ñúíÔ?Ö×Û”ù•ïÆè\]1º—žh†Ñ÷ïWU¶s¿Œo[»̇=p˵{éÒ·ó€šÙ‡Ë—ÆÒ½UŸ ÞC¼;[Ûv>ͳ‘7 ñBwìÖ7|Ïñ'ÝÙ–·-Û©>¿ù¡Ywc¾ÆÁÕÓ@Ï`¿5È+4âéÛºªà LÏÁk\ïLôø7ÿæmÞÉrŸ÷Þä4n€<÷;øýV„Oƒ~¢ß7oÿNÆ6ùÞÀ¦ÏAëß»~#¹íÿwãwÿã¿z‰µ{i¶Ù§ÞÿÖaÙŽµm›À_âóÛÛgHcmküpN}ŸÔfý3LGkÓý`9|Ø|£ë´ï&ðãã­]ßZpµµšüÓ¶îx^…™ÙT7‡„„ Jþÿ;C‰[¢tä;<´l÷æÓíö2w^<C/¿ÒO_é—kLŸöç‹Vÿ÷K§6%eúi áSô~lWx'ZV_̵[kÛ1k$oëbkàÔ–¨ëäžê/¯TL­+î„â0Æ]cö+9D¾gÝ®CÇ_Ý;ŒÜƒÕu7?=óäõž)g×vç¯ÿîI‰ñ—Ç÷;ÕÔû¶ûHŸðöÌì\ô©s1¿gˆzí;ÖÏîm÷âb…¬WýÕoõNüS«ÃÙ«ž1Ô¾ºw~{öʳFó’º'Ÿže¶ÅpÂyÏÃo.½Wlcù­bZŸ¬ïê¤wB ›¿äšu.©o§â-‰Óz•<ß×'Äš›‹Ú‰·ùíÞ¾Õ)õ\Uw鮯;wûÞ§êUç„ai÷ÙÍ —¹«Lû¿®¾û¶~9Nõ¶¾7†Î×u(õ~¬9“w××ý®ýéý_cä|wã^¼Ö~[¿â‘ÌŸ¹ê|µÓ·w›¿°ë=·káüúeÝ”mþåu16WðÜÞõãž\ßÜ͹¸V·cs+¯ýæ©ö‹}öß<É«¬˜Ô)Áw 6ö¶øëì<«'œoÞ7¶‹ËùÊkœäÖ­soçD.¶S èûŸŒ‘÷½ÿ„{ヰs1´U.­Sî9§ô&ÕO}Ñ/vç¶å­Ÿ{]ïªý„çΧw%ý­AñxƬÆ®åž%ʵùÅÑzª¬¸–Šw¿ÖÆþžÿð»ЮosX[¨˜ksŠÛîSL~/h ÎÛXi7ïlƧó¬ó˜+ì{'/æž!~Gú^3»¿õ_ðvŽ“¾x‘Q?Ú™‡=/k³ýåu,fɳ™~ßûë«<ô{º;^;.®Õ—ò­÷;›¾SÍõ~ Ù5xF›·’gƒãÖpeýö·gªï{ÆÌµ>ïrµãê™7I¾¾÷·À)âl}«§OdÝóòÝ/÷ÉŽ=ƒðÕoâ']sEŸü9Þ8:ö»tÏvmlíožõåo|uÛÿ‘mû;gu=×Äzò±gÃê©+–b¢6Nû·µ[ZÞæï”÷;_K›+ß/]ou¬3±ö7²z›Ïú÷Û8rë«Ø{H½Ð3Ï}¯âu(v}¢¿kSÿúx&‡œCŸæÇ¾±¸6ðúVÊ‘çuQÙæCÛS]5?Õ)ß–ëÚ=¾:ún¾º~ËÖx6æÚ÷ÿªÅð,•¯oÞ8ê#kMÀoßù0Oÿf¼sËó7 ýÿ"/ý÷n½Û¯Å ¹½³ øê¸ê¯Øù‡sR×î™î¿Æ¥\{ÿZû’¸Ø»Êhûmcm.;í×Îÿ‘ƒãƶ*x^…™Én1 íìû‚$· ÿÿ™qSH¡ ‰„$Šj6)J??><<¼x’ÇK^=ÉËK¦­ùé6fn²>ëþ\ºõÁaÝÚ7šÇÇ«~ó›³íüÑ·_sFÞ]­çlûõáŸ_°j?ÿÕÏvØ^çõ“ÒC±áB>øøý(ý[­_êÓã÷W‹Ùcƒ}ÛO—Ýúøö¾ƒsòê#æT[û"_`ÃË:dùA¿õ`xÍIðÿùj]Ÿ•»ýC\§ŽíľՃC.|6lGßþ¾Ißù‰kÕg®¬!wæØXÀö9\]6wØS³•óÑ:†x³3·;?Æ‚#Üê›Þäl÷cî78N¦ßZ¸Â ù~éæ»<'Üq“ù*?ü8''×LØúlk^õ»Ö{ŽŽÜ4ÿ^7áŒ{'Ü?`nŽ=býrz:¿Ë'k¨5ûôž—ßéÞZÎñÍþ®ïweqlŒ8~ÄgÏl¹–óÄ5jlæ›ûqþrÙ`o;ô`›¹ímËœš¿Ýä‰wüÐ7GÏ1vL‹yxpªc¹Ã[ÎKûóêSðî9íZó«0G>ÈçĹÆ-zîlœ§ñäßxwžù4îúê˜ÝôØ»_ᎆ¹[†Gì¶Áû‹óö»:¦Ï9c}×:.l¹7 oÚì9çå…mψ} »SØ?rQðÀ>Ýe^g}ïv„Ú®Mm=vìèO<ö]AŸzwLàôý÷Ù]¿gÙ8|›”Ø]gáœ8_>ù~0ëzFX×–9ºåûqöþþ°0׺sŒ×èÚ;¼;1c;'훇¹ ¼ƒÄÐyðÝæ¾q¼Æ6|û­ï3`>›õÔK}ÚÖ÷®ãÜxítþÎ0ξ5¬¿Þ1抮6›ëÝ /öÕ8`¡+7ÄoCó`ÄÝõÖqÇ›ÃÝË ‹ñY/ÖI×}¶ù2¯tÅaÝÎ÷[×B¿=àO}—7ŸÙw÷½o¸5þŠï\¯Eç8éûÞ/?ô«kÇ:ñ}pú;͘æ8ñ»Óûßr‡Ï1†GùøÌ¶¾ÑÕ¿ÅwÑÉ<ót¾ÑÙ¦Ò¸,þÎç»Çç¥ö'¬r27ð‡Ùu¶«¾àVŒIóæBçßylS<æ{OVϘ¸ÛÇÆqtß&«YcznÂúSŽáηŸ9Wîâœø½«~ûf⫹÷™å÷ˆâ±Þsþ–sŒÌ _þ­Àù™½ù°~{16~ï(û<å’9óºû^Óù4WpŠ9Nõ}‡ïïH0À^ëÓv¿¬ÛÙºYk¿w{c|bvÜ«ñÍóÑ߸þ'=·Ž©5É<}Ï›un§?ågâ\ßíÇt>ËõIn‡¶äÿ݆_êÖB¬'ë¯Øã³÷öåo,Ûä”#Æw9rß\N{Âïe=+õu¶Mûv\´õÏx-6ü3?>;Æ+¦ãߨu€0þ-Ý©îŸw®çÊ­¹µ6Œ±ïBb…Ssuçâ3€Î뉽-\Z¿´ÏUÆÆó|…œ€õ?Lp“ÇPÿŽƒØV—Ó37ÿ®7b%ïÎÎQyööƒÝô~kýž—ßÉ7Ï›ÖsyöÛζ§3~÷†0®þdC¿~ïjž=Yœ+ï±xû6v½CŒ…­¹•焜S'>;qm÷¸-6Ô+¼lç=Ý>û.rhù;uýËÆi9q^û-û®x^™ÉÎEÇ`6³ >XH\xÿW„:äàSÕ/©®Ê}«¬žžw¯×ëÝ_d½¸÷Ùõ/|ùìYKc ü^àó”;Ù*þÛ×g½â‘Uø)üØe­LýE^ù á“´µOqß=xän~ýЀo\ùûÜusézóÄ^zc«>àç¬Cžê¿ù°ùh ¨ÉÒ­I}8­íM=õiq€}Uãr}Ó Üê'ßÊ Ôvã¶Ÿd6¯ÖËüQ—Õ]Kû!ôövmUÖþ+øþÁW~y ­÷æµ²ê:é=Ùà UöCŸoõcy{óÏó÷ç ´÷qóß>¨®b÷Ö7âW®|'>ó%ó½úœOúäY«Ú± õñœøþ|èÚ\¿OûÚXOê¤Ý¥­¡ýU>÷ÍŸki=#樺kóÖ®é{óàsuÖõ•Þ>:åžû‰|·Ÿ—çä›°çcùNkžõ•8åÙÜŸl.­{€+qŸ²;÷9[ê°fž§òYgóT>½>Û@Ö»bóᓚ@:«síÕ çMÜÆ}Ê›9Ä+W{=Kédÿ;§*ÛwÑú¡ÍÍ)ଷ÷Í)žÎðúÖýÒN`Ý<ï+§ß¯¡·.úK,Öz{´¼›ëƵ¸Í—8×ú^ÜoY#Û¾¾ÙBž9âÙ!¿êäÙ3e^¼OÚßÕg?ÈïÜSÏß1ô½sßWhMôckОÇÞi6H·xaïÏå5î›|yô­ç hÜ«»ùw½¿ZãöAõé·ýÒóV õMÝêòœwš¿ÔŸçé7¬scmSsx«­{íÔŸÿ  ÇYQ°wúBgcõ»çyªÁÒo:ûëy⋼ëÇÿÅ5O'?šsl²÷Î×ú Ãã|©^ãP‡k÷=×êäî_ôt&¹VÿæO_›{¡ïT'«ge‹¿Ñý¶Ð_ã5Îúº¼ö%àÜ/OcÜÙÓo%…å+T§ïºu©¬ëưzúìÁÆ¿öNï3ë‹sît~Öfý]Þέۜ¹Áé<[Ë•Ú þî3ÞêôÞ>ÝÑ«³wýè¾ï='zÏÚ©o´ÑyÉSO2òRG×›³õ¹°´õ¡ºj¿ß_›¿òpfnýY°–'š°~öü"W»µµ9cßÞj»sçV÷Îß+¥›Ïš½ªмۼ;ÄÛ³ì™臧ßòåÑ_e»^¨_òð› ݽߪ‡à*¿>7v€³~cä¹ß‘û½ÌgÏ׿ù´. ¯gEÞòkK¾ú*›r]·^õe¿ò^^>{´¾¬O¥±¦^ÛÛ[¯¾ÃÞþ[)@·?W_mõ¼7ŽœèÕ±~-?´ÎÄåq­Ž½÷úèt.j¿ßæÙÛs[wöÍ x¿A«ïÆ_ž·òç<öŽªìö×I_ï÷}ÿ­Ÿkã„|Gí·†Õ¹ÏêÓÿêÜž(¯tg%´öweðÉ[o÷ÖâÛÆ½ç è½p¢KkÝO}’O½ÕYŸû¾}²uó¥ïŠðôn¯ì;cõIžöYg—§Ð¸öü–§gl¿ùÕ8k޾õO^õù¾¯pòáýö«­®ÑU}]3G¬Ûúê{‘4ý÷ÚMüx^…˜ÙG /K ²HòÂÿ%iJ”J=7Vo^Žínwϼ|</¾Ó«ïôúêܽTûëµþSÖá)¿ûÖùÛ57=µg¶êúåja|ð¬ÿóÕN÷Úw’_ûV}l0þtÍÁ¾úpÂÖyëþpÃWÝèk\æwuVÖz“÷â'vÈþ)>âktM9l-ÞÆÃ˜üζsa¬'üØ2Fh9±=Û¥o¼µ3,w~ZÞñ¿uwý¿óV½ýu˜ƒð¯¸ Ž¡¹ç ÔöI–¹ù?§§LÝã?Ôsñ9Vµò^Öîjú7ðsœ;xmƒ=lÔAä9›Æ÷ùšC¿×‰]ñBèî>,-ŸkwF‹=:˜ó<;ä= qnŒÞê«NÎÛç|>mÓõ‡:Ïÿ‘ÃÆ['=¯'²õçDÝ«ë;—Õ…Œ‡­õÕО¦=a Ì)÷­ÙÈ:?ôÙg¬›Ÿv¸×¶®øŒ›°áþÚ/W]œòz®kk9só³5ª¶MÃë³þLŽþîvÇØsÔŽÚ²_ãeÎ:&òÈœõ2ç|8ï¶M\àé:Äþ°~¹é Žz}âùí!ì®~2îÖpËvŒÜÞ‘¬o\ží‘“NÓ¿W똺E¿ÛÖììMÉLð×îè¿Kn4±éœzOÕ¦ý³ïË:V{ËÓÝ{‰Øw¾:ñ»9‚xlÞuýðó]¿4Y×%ôCû}ê›–|éuê›ün(ÇÞ·ïÞêô93>ÌW–^û«=ö§{ 1Øx5šñø¼§Oôû%7\~+Y7x×/FóЯåÿ¾Ö;ï±å×ïw`íA«q¬îÜgcâ3ýø^~ð-NðsîÍ_9èTO=öÜ]l]Yó],k=;§úÀZï©“ýÎÓNu’\âCÉy7Q—Á[Ì›7~ûéÖqæð~˜Š›oQã²=úw9;é.¯õœtØ'|Ž÷|fÝyáËbr:#–³ ¶<ï8øí¹¶ºÓæ¿~û¼›{äÓwEu‚yvÇßœÖîèÙ7±óƒoÎ!qfÞß­¬[ØïÞÈÒ/¨wˆmÎŒßv膗üVONïqë-†â‚ðsôU}tÝ{> ü4OiwÌÖœ“ê"è\Ûss‡aï¾µØÀÿñê³môÛw:ŠkgÝöG}³šìŸylËkΟçˆIõXG÷ý݃ìåÅÀzÀ±ø:^§}XÚÞ%Îððÿ£¹áØö}f,¦†åü`µ¾î?æíW××òyÔRîƒvZ¯½çà_зø ·qšÌõkÔzßÉמ›­»ÞµfY–}„Æk¾ÖÍ»}9ò}‚ÝŸÏ¿õŽ_‘ç¿/:îÞN#ÖÈ™ß0Ų–œl­˜Œßò&b³µæßoÛ‘kMóÎþ7ÕÖ³ü—¾÷w³õKãJK.ˆ‡×=Þ7õèÙ{9ƾË×ü56öÃ|í÷œ˜xîeâcYÆ|'2&ÖÆRY¾Ñï½OqÓbkmeüo…uÛÅ2öÙ>´|òjyëÀ7Ïù½7ÄZÎR}uýé{Õ6Ö6ß&¯ÕgxøögÞñ›mêŠûÕ9îadùŸ¹5ßCõÃÿ¶°ßX²æqy ï|©,ä8°ÖýgŸks¼>#Å:Ú÷Hw}æ‰ ;Íÿ©ýëñÂÅq|/îx2mó$ïÆâ·­ñZ<¯å£v<¿ó±~sÁxv½çœÉ­“_Ë#‡úÈ#[~å>]íâĦyºßÚdZ+oËx;®7Û¨s¯ ð¾Zï½s@Ÿïéì<Ãö̾¼Öø½Öz+ƹ9ŸýñÃ'{?;_5Gn«ÿ·ÖáZÎ]ï[üZϮsâvß:lþzÍWfpw_{}kÎñ›_ Ù6g‘±ka`}säÏú“·/îdË…¹ÅY_¯Áûf=û³}w?yžœrÇø®¶çžþrÓZªî°;¿|Ó‘sùÁþg²zÕ\kCyºVNß—­õ–síŸ8ÃÓz^ãîÿÎcêʶ°ƒžÏ!²´È5n£Í½~ÜâÏgŶ›ŸoÛµ¾[®½'‹¾sUÛ¬›o=ä˜ï÷n2|ë7öù·Ïeû¹;C#gÿìÇìpg¶Îç‹\œê¶þàXÌnkcy™îÝï l;§5Æ'ß|s‘ó®%¶ÞŸÃéÛèñx{œ¿Öªm cÀïævŸa»6ëïdÓçŽ{×ë¶g]ó¬Nχm¹oÞìsmî¼â—õƘo-Á‡ö”+ûlÿôα̉ï¶5¹å}pâlÍõw v{N‡®9ì’{rÂx­çÖîMF-<©°oââ˜þ¸y å+2Öm ØŽk„Ø+㜟ޞÈn?<î½vâT»µ‰Ç@îÈ{9¯=wÆÜæd}î}î¿Ç©£áî,ðNÂoUë˜ÏÝ÷Û²pqธÃþIÏ1có¡®ïÍÓÚÅ—÷bu…íÞ!EsR8–Áï—ÊXÖ܃ki­¿e~o"ï·îjœº«ïýVÚ¼sjŸŽŸý4¿ò¢å7’÷bkÖ/xwt4/Î æ»u¾yƒóQ=ó\Üýí¶†MÞbØ£½S¾ÞÅ;§¬÷;ß¼Xß2æfytþÕøTÛÖµ æË£0çÚ·.¹pžœsd«CŸúØ»guì:¤åïð´l8§¶kÙæÚïªS°k¾ö‡mm×ß­»œÔWùÞ°®w£ò§3Ášï\ß';àÙzÿþf»sæÔüÖîÿát¯Zξ«[l=-̸NZ3–ã]Ð< ×¾QyÆì«õ­CQçãD®åLÂËy*—½U7‡ßÖ{¹”§åª·7*œ/ïp¾•¬ñÿ/ËÖö°;šØvvÆ›¸/s›õÎmO›Óî¿•œ[Ö‰¥µ² ÇÞ5¶GÛj¿EØ;ÇoÙŽë>È-­¡œ2&÷Í•}úŽ4Ïrò|ïÒµüÖ©Nõ點œÇjyü¼æ½ãÈÁæ©%ßÁÈúüâ×¹ûré͵h? ù¶×>sä~ãgo¾æ¥ºý{ÎøÚV¹Õù eÝ­¹3Í¿]c×cÏÿŸ³ÖïÞÒYUÝÞÞÞ>ÿH>Ògé“ô©h럵þFû“g^o#kóѵþ°-Wü¯_{£/"Wû¶9ŒÅXÞh<Ûüþµž-ä.]¯Ÿì£7_iŸ¸gÃ>Ú—+¯_fßùÇê#sááÓxËçSîIÎl£ök‹õ·šÏöd± ¶õlÛ6–ö8ÕÅNkgjݶ^ý§‹Þp[#ø=ŸW^œã'_.½Qãµ/¥éΖóh\Ÿ¿Ñw¯}óŒÍœÚàû|bþû‹·¹mƒ ï·¿ÏÁäéµÚÄŽý-5FÓö¨c}·LõL¾ç æþе}¸ñªûwk4²¶·õp½æ<âûõ“½Ñd×C•»i|z›àÕ‡¸è6hg¾û¨9fß1«2gܵ°NkõD>Û–­/O>¢3>÷ùÚ|¹fM.¬óãkNÞd›ev–í6ì´ÞÄVÏ‘ñ½ö}\BÖ:¾FûáxçÃxÃåùpå¸&{Õx|ΫÏðèêIð+clÈ5þUkxWLÃk¯-F|ÜÚgÍ÷¾ÇÉÌzírZÿÙǶig\?åŒbâó%ç¬?äîçÖ¸ØbÍïø›3ȶ|®ë ù»l#»s…Íë 7.úÛXömkÎöƒÊz}ÉM†\{>r|Õu Ý_Yû=”Ø«<ßÄËšØã³âzmô»‹{ö7òܯ}dë'Ôý+/µÉºýc;Æ™/å³®}ƒyíoûZ_|>­Ïz=´ñêa°»_üæÊrÐdžrÈYx¯ï+ÄóÊ2•ÏçïªÇÑjãØ¿¹ï¨ý4òóÔïJÕÓ#gøk9ãnÏ÷bs÷žÍÊ[Ïwˆ÷9‹Ãà¾äÜãøÉ3»uÜ;ú­]eMèÛòÁ»°{'m¤[÷{ÊúÛw½.Ÿ« ñÝ3¾Ï"xððÉsÛù»ÝräóÒõ»gößlm$_m³²`ò½ìoš;ÎÚaÜ=¯?½ý“«öûÊñ…Çh»Üì[î=,÷ÛÕ÷ÿ‡zï]öyŽ!c^×älû>_`“³÷r8=žËOrWÏÚ—úõ´ï{¢üâÛþx®{ÕŸÎâA׿ ×>¼°¸“··z€‰LãòzröÝ¿[Õßòg§ß²ðlÏ¿Yø¼€ë¾ñ{Ðöz׃Ýo,ë=Qù¬Á*ÿ’å}ó=Ù÷hzÎ×FÇR>ÔwõÑ/¯±5DÞù³}¯Ÿöçg²Ë7Ï6îßb\çÐs丳àÓß×s½ënã{wzë¥ÍÉieG=[&|zï\£;ºjÐÞEÎöÈ-s0Ý'ð/?·Ç9èóDZ[wxÔ®XÌ]ÓÆV½' ×u¾ø½æª_}dí:ñì®ìy¿÷7¸Õyâü<^ßÍŒáy¿E¯x‘CÆ5)nŸ OßE&bq.}>ŒÇï@[ãÓd¿õ®<0߈g°w~0ŽçwC߯Þý‹wœý³OÌÿ‹ŒëUzê¿­Û§ö×Ô÷ö&üÖ§8Pïõbë‰öîjt{G=¿ÍYß½:j?á#ñ6gý›Y±ÐiŒìó>0öb± |7&þ¢oŒê“üB¦w­÷7ΗæÁöm>òîŸÍý Õým~ÙÜhýúbÜÖb#ï(ð[› ÓÿX÷/äàQx^˜éŽV7¿@ !@%Rž€÷¨¤[Jåà;Ì–ív/§û.OÇãÕÐÓŒ¥wÙ{=:¿\£$z;üî-igåžÓ)Þ7£[ßûÕù-|¨q4Öò–ÏXòĸ9QV¿>~ôYbg¿öOôå’Ãþ™CÚ‚ô­œqlÌK [oøÌÿºÖï/™â$¾Ú[ÚZAöXãWqˆYŸõ±kó÷ùÒm,õ½¾:W¯¹Y™]rä59r¿ø«[úó’Õù`n^jÇõö;ý-ž•ý™ÿíKy¯9\[æ™ye˜Û/íCi׋£q‹ë¯á3n?@ÿ·ÁþúYŸ;ÒO̱³g òœ)_,Í£#öÄàR|ø1ê¸oìÞ‡kÔŸgrõë‡ùæë%ôÇã?[Û’¼Ú/þÊÚ»ò›³’ûÍ™vÉÙ§¬·ÆâÑO1˜Ïŵx×fÏëò‹cõ zÀ:·?wרÔ.ÄÁx¼v¤“ìê­Tüæjõ×Neœ« Õ&qý¹æomïÜ;÷%²‹Í3S|Ž•]½õ£^÷¹÷VoÇúä ôܯõîpœä˜›Ÿå¯]Kž÷|Ï)óõU;ê)»ûõ×8ÛóÛ¿ò|G‘ÇýPÙöšrÔ¾u+­ýÕõ]²üê1¿Ãê¸~|gš#ûÔZ(ÓÜßÔýv§û¶¾¸7Í£gT?w˜œk·8[Ó•Y[¼»¯^uʳæÔfÏ‹y8õõ©·ÈùžÏꨧ½ö•µß¸8ò<§.öY_mTþNwýœøµ×ú˜Ó“Sþx¯€§îÆé|ñ÷; vOcóT;Ź÷Nß;ÛØðYßÜSNßúç[¹}@tÿ”£Òé^j<}—Ù:6—Žèè“sÁè7ueŠiï‰j«ù<ÉîÞ>WNÔïÚê‹ymîüħv¶ß̃öÙ__Ú³O\/.t¹/Ìñø=ZyÏlëhïõ<ƒóž'FûK;•ïØ~eguÀż5B¯kïUcÒ·=¦\}—ú½Ø*¿¶ŠËøWnýçqöÌVïÃÚVO™æÝû\ÿõã70üâs®Öôô=ËèíûGmo/@>wÔ“o,ÕÙçý¢ýâñŒ¡oüÍŸøÑoõµ©\ï–}?ß®·e}1ïó¥çSÝÓ¹>ÅU=ŸðÛÓ‹÷%„Nÿ‘6ç͉ã~9wÍ¿ÆÖ½57÷®ûì«/ûQ;ícÿÊ;ÕºøôÑ{¿ûõßoÂú3õòýTߕџçfÿƒ çÝÒ»­þ6†Ö’ºŒÆê9ê^{·wXÌ£5Zßå9oïX¹íaI¼í‘âhß´j³ÔçÍ]>«/¯µ–èuüõŒÖ¿6Ê3½g»Ï?æ§;µóõÅZÝÞõÕ½>ï›ó“>ã>ïk¯~ μ¼ò­±ÊgÞïÅbpý}ä+a³øÔÃ_ï”ÓsB{§»§g¤öÕcÏñ[žwyæ¯Nw+Ô÷ºò[ãe}ggãØ~ÍŸ˜åm8W{vŒNd°Ë<œb¶ø]+Ï·á×úòµNšû“OË_]æ¼þ:'ôÇÕ‚eœÍÅúh¿çXÛò¸O›ÇÆ¥¶Õ®úW^ÇæÚ}Uòþƒ–3UÿZÆÆ˜1ÿÏ5fû¥¾n\¿®¯M›ùïdJ›CeŒC±kgçÕÕøÈS]gÝY<¨wïúë¥5åÝ`}{oÿÚ ¾S}A`!vc°òæ»ò`Š[Ùµ±±ØÜWOëc1Œ‹²‹Uù“Õi•¯²¬•û'ûµÙ½EN8¯V¶míw¯0æÎ1§Œµ±Xµâ]bŽ<7Ê¿±Û¼Ù*g]@ž?‹ÇØ,vuWÆ~ï™ÊjãÚÎÝT¾Ö‡~€©\ψò¸o”mL }vMyçö-NùjoÉ7ë¾-¶Ö:6‡â2Ö߯zqîð—ÚȨeÛªW]mWçI¶6¸Fm7f§x+[{¥Ó]¸ãµ¯k•¡Om5ÚѬÜþy6ïûÑxÓùÅ1&ŽÍý¾Ù·kcF-WO±mù&éšo}ó\»îúòÛ:oŸü\ªlul[2Þ¶»¾ùƒô·t§cqÛ×zé™àùÏå'âíþY¿×fú§3öû¯íÎòìbý”£­'ÈœÒï7uóN«öª~Ówïî·ÀêgÞ7Q󨏒KïHßV½ùqþÔWWc#¶vÕçÆB9úØÑs©X§|¶¿ûÌ7CùN²k?ýú]žú°ø®õ7yXëûÔómõ§zÿ­Œãæ}ýì|õwÏã»Üï~]žó7“½iÝ_y”Ùš/ô5ò´èÜ;Š>s`~ºÆÎ{ï—Ö»xã·ù低û»Õ);÷l\÷–ø+'õw¤¾§o|[útеòýÞ,ÖÚ²cy™?á¯ÌÉ?÷ÕiÍ:ª®öÚ-îê¶öŒä^¦ßs®øPßÿ­ùµycAl—×I¾¿äYLó}Ú¡Íòô;|ëX^íªýwwÄÖ—ß›ç¾k{þKõ˹¾ãÚï[g2ÿ^}xúÆ.Äý‚߬yÞë‡òÐú£þÆâÜO½®Y¿Ú'^qÍÛÖDßƨ1álT–ú©]%ãU{íÓšãQ±j<´Wžêu®ºÊ YKòïzqºÖº½£ÆMÿ¶¦ m®íÄTÅÛ½lÜëóÉwyWwyµ­6.ÄûŽ5ë³¼¥ó§˜ö7„µãôݳ<ΟÖ$mÙ5÷ªu&_m·í™d]WoϺÕóŒNç¶viKÏ#Úî eמ®ùæØøŸx7VŽ»ßå%ÿÞç3ínî ã¸çGq%~{kïAõT_[yzþëÚ#yÎko±8KµqýaM»öl^;;^¿Ål»þ.ÆæªÄ¾Òo×·_,ûë_ùýŸgõ‰küœVw>ZêÝßä×ׯyß2ÍÿIwÇæY;Ö~û‹ávÿøêjx^…™É®\EÆ`0£ŒØ±@âÿÿ‘wD‡ å5‹TUå<Õp»?¼½½}x‡ïðÍ;|ûZ3~z‡ï^ãèƒá‡ózôÉüð‡ÿ^st,ûËK~sð[ƒ3üôöŸŸÓ[Ÿí vÌc€ÿÉŽõÌÿóÁ_Ý?~…Çú¾ÚÆæ³3ÚæðÕÇ® Ë­}#G|jÞܬVà]CóÖwó´‡L»t­ÞøæÜàÿÖ{ù±Û„ßòæŽ<Ãg¬—¸è¿†Æ|6¨¡{x95Ïæ‡±û€Ú4@ë…Þæ§ù0­ëÁì¯Nл'/Ëš‡\Ò«Wî*3`OckÌÈõäÇuV|yÑí‹eF7ÎÀÞ4ÏÕgØjzsqép\î#ç ¿|.c‹~²ÌÎéò>¼À½e;Ï‹×ô}m¿IÆõªŒ×›/ÿøàËužVÞ=ŠÃ-Î7xÆúµž¾¹,ßöZý›MèƒÙÌ¡µß®ãìÛo×í)vƒc¬ÏàÌÍ|ßùµ1øãE#×õe´ÅU¿é Ÿg—®äcõªßó™w4ìA· ÷÷æõ;Öo0Þy„Æèí¥«Ö_;}-nÇZjÃwTûdy?(Ï€|üæ×¹ OqÔŽ»²à©gãdý$Ïœw¢mn~ùÿYóÚLW}`œnŸíöÛùc¿Ønó ÌÛ(Ý€>ïûn^¿ûÙK¦_rÌ9º—ˆ©2ÜûÀðžÓÈ‘CÖW¿×®mC·Ž³³Ñ¹FÎë~3 “3½ç <ãŸ.ô9ÖúZùÁöùx]?ûæ]ò¾ÓJ¿pö«9fœkhYçðf_66ÏÈ´—ª×3¨rÕYè;¾¼[óÞ%þÁßâZøÝÕþdoÆÇ;ÞöÑï|ÙŸúvÑ—§á[¯¯ék>}÷ûÉ×Wx¹‹ÚÇöÉú.ÝØ.zp?xë]ºÀóæC^ú7ÖwëÚÚçµñÄ ­qôÖèä ~b¬îêY—o‹æëšón5Î{Åý`yŸ•õ—ÑöÑÙþ"†ž­Ìy_Áƒ®òY—ý7Ý2ø6øëµ®ÞËŸ÷8ýc]£ó¾‚ßìSëØ{Ø6ÉõÖãC—s¶¦‡ÁŸEðcßÀ{i<ÄXü݈­Æ¹‘ý@^/{ægÞþp^.=Íã“,±TéÕíXÏ¥}9C½× ]¶¨›}r [dêëd^tѯÖ{»xç£~v&—^mʇö‚÷é¼!›x:÷wr£]ùhœ¦¡§{¢qÌo~1¾|½“±—n½Îøáxë´ õ¯4ӛ꽹ý†Þ•þ´|î¡Ã±pgÐ#æÛÈû?ë¿{À4Ç·Ñߌè1ß›‹¯8üؼ=bžÚ¦Æ@û9îÓü½ÍyÝè³Ö¼Ø}Ê¥Áßë—¾Á•ƒ øÛ¨ü͉ó y×ð)_['ëòWÇÅã>3~~R?p>Cœt¯‡÷7^ã¾ògû®“ïãˆÚæWlÀÞìÑíëÊ5v¿.>ÿgè~¶,ôžþöoºõìwSjáßøËWÛã·nŸ-ÿ'[ß“Îǯóå¸ÿh‡|Z÷5§O8§ŸòWèïéåwÿ™6ŸÜöúÆ':õ¾ô_yõz°ß= Ñìü «BÇx^í˜ nÃ0 Ý6½ïãÿomð ƒH!‰ç’¢l'§mÛnÏts¦'­ïvÊÚô"ytOÒË{fÖÑk_¡û7ÑãÀkŸû 6ÖmJ®èeݾ&Šnlr× e%1Ñ·OëNyp6c:wèmŸ‰ÓrdÔ˜Ùzæ¥87fë?9fMŽÆm áÅù$&zø³_×äs×3Ö‰ý×}o» kã2‘oû° ½Ô~z?9Ùø¼C}Â{ìÚWzÞ¼ÎÁge¾×‘QÛöå¸ðÒ7ĉmp:WßÁÉkÛ$ÿìý|à]«îøSýðû]2äöáÿæ«}¤ƒÓ÷§sõÞDwÜÉ–yª3sÛº~ŽÛ±Ðíz„ç{Ÿ™{Í<õ×vé»®ã"Ÿ0:f(µŠdÉ.4½kЉz~ÊÓ3ï˜è´ÏÆ}ÄO¬æ½o—ü:§Ì±q_w¾]W(ýÞçÔ:ðÌó\(ù£3É'ŽÉÞ¹â7DMs6¶³¯>Çðû9 ñ¬Œ{gº?Øã?:ÈÍ7ž?Ùƒ}({bg]Çaý£µû ;p€Å¹P/ËÀÙ5:"tí[îz¶ñÙ‚Á¸§šSú-ú!¿?)ëÙ4Ž5O<ž5Æìú€!1áu¶_ð³&VûÄG×ÒyCî#l°Kìöá\:'רÏÉö¹ÔÜu²?pÑ‹Æç}ÖܵØú=k½èðŒí¾n}b€…ß(ÈX#Ï3˜ºùLì»×Ý?¡þŽl"vê=ÿ.¿sp<ÖÓ¹9F?áÁ÷ß};Ôw ,Ô¼¿'l?ùôY¶,~“OfôàCáQÇ~¦²¶­gÿ¾ åÛ}xÙ“G÷ò®q~!缌çY·ýâ}˯8ðòµ®ãL¸Ãë³Í»“39Â?í‹×q2;VˆïKwLxÝ#œ-9‹ëÂ7ºïûžÒ;Æãš„ø?ÇÏ)c°?»ß=­ÓþúþöÝ0nÈ÷¢Ïp5ÖXc5ÖXc5ÖXcãñО ºx^X[‹U¬‡Q¼/(:,jƒ$j”A1ˆ¢ëƒ¯‹£ÿÿGxŠó§¦¦Ï|.œ—Ýéêêêê>3{ÀËí¼ÚΛí¼ÕÎÒÎ'í|ÖÎçí|ßÎÚÎíüÔÎÏíüÚÎÖÎKño Ç¿×·Ûù²oѱ~Àï>&±ÞAÇ{sAÇý›¸ß ãVxÂz{Žo·ó.ö˜Äûƒï×èØäýç:¤Ä'÷ÌAÞžã+Œ<ÄOÜ{蚟xâÊøŠãþ½Äeý¯ap·pÔÀ¹Õ^å¾ê?ëßCt)ß“vžbè.¿dÞ ]åf]̱`ï]áVþ¨¸§>É[ºÓ9®Øãÿ‚žãÃמÇçLZˆ¯¼Àx¯Ñ9¾ŽÎS3+®ÙËÄL 6 Uy4ÏÂþG|úå†.Ïp>çÔ„?Ê›žÑþXpÔǽI¯øÌPó çµhîÕW×Ky<‡t[q¬cÃè+ùÓgHšp†ˆÁ¸ä¥º³oÎÁkܰ÷„c¨®½ÎVÖá5Üa®WzKXpì‰zá{l6³9~gT³–=¿Ö‹ªŽÔÆ5÷3Þ®S…¼Ó¯ôAÅ[¸³ù“§*M¤Çlÿ÷ßèøüaŽÄ¾Ö[Ÿ³Ê?ÌAÞÂO÷…só˜œM÷Á‚ÎA¼|* Æûl/¨k©´Ú°ßË©¹Þ´Ïwæ¹êùõ¾q»Î+GÕË<Ù?Ö,¾‰­º«ü†î¿™÷ª¤É ŽóI§'gûÿOt툯žðç‘;¨ê©çÕŽ]qÜ Â#>Ãß_«[ï.ª;ï=îVÕΞ©æ¬uÃðªjz€ùì [µÍÞgÚæN©jcn¯oÁ±Ÿòã,ïÚ¬¯òfz‡y„_Íc5WâH~¾ô sVyfþ̜ޫôŸïq'–ãƒ\C¿j‡‰ƒžU®ô\ΙÇz?ªÝà}àOåék~>{G¶Ï }D,òRmôHƨ7Ò0ûðÝ%ÖãäßД—µ°ŽJ£Jb¹öââ©1¹ ‹/°÷Dö«ú¾©vðYÿ˜#ñõ®º`ô‡±Ú1ÒëûÞ$?}ƒVܼnßÙû¿°Ï‘{$1‰çu kÃ~2–º)Ο—誶3½å¯¬Ç÷Jê”wô‚½F³ÁÞ W˜Òñzoð8>Ëš¼×ºç¼W öšÎî8çÀÚÒKúN”Þ‰ïõÙLÞ¾óÿÀ±—9 Ú/7Ø×q†»a+mÎúí>öæûHi·¤Fò@â ;ßkVçdÃ^ÿôW¥½s?ÓÝ{LüÊ¿ù!m„û56µ—.•Îr8~µCª™cÜl>ý9å­4«âµc®Å»ß‰C]f}ݰ¿7„·àè?âøûÙŠ£GÒs©gηÏó?¸Äå]^yõj.ä¡îø^Û fî›íã~åßø{ÇóÿQÉ?×záú¥vîMß ù> ̇èzøûóSÌ{í;Èñ}7?÷ÌŠ#× Ã7ì±ï½ÜuÄ_б]OqÒsÄÊ9Ðýâÿ³prf÷‹võ™Õ%ÞÕþ!&1¤±{â†/G]“ƒÏÑ#ÔóÍÜw8bêî$jÜK®»ëã½Ö7KΦs¤Väy¶W•‹9ìû%mÎxHÎbæ­òm8î‹jÿiÖÈûÿô[š§§Ü·ä÷5NÅÉïYƪçäD>³•¦Ä#Žz$mòeÜÙ“Ex^¥YÛŠ%EŒ‡EQ¼±Štµ¯  ʲÞiчyßk÷ÿ?Âú•ÕgÄz:U‘™‘Yuæ<ðd[ë¶~ÝÖoÛjÛzn[/mëÕm=ÜÖëÛzg[˶>ÙÖO—ýÜ÷âe/÷ðó·õ¹í!æ?è¸Ïoë;÷:öGØñ¿ÚÖ×Ûz¼­ï°cý‚Ž÷v¼Ø1‰Á³ŸÙYžYc?c¾±~æ9±nÕüz^Ÿâˆ­œˆÏ<ƒç™×Ûè8 v,rĹKÎè#Í å@­åÍ;Ïj6$'îǬ%¹¿¶ä½Šãs³òkÿç}å3 û*{àëିŒ#ž|®ª¾¬­açsÌçê¥ú¹GŸ ³]>'=¤Ul~îu%_®+q²nÍüÔ©¡×ྫôγâ^\ÈK3 8/ÄQ¥µfÅYœk1Tï‚c/Wµÿ…£7SËjî(WúF^áL¾6ãö\™'qè5yƒŸ±.ÆöXžwΞQýšõòžòô¦ÜO5‹?ñöu­ÄñwÆŠ±FñçydUý•xâËõMM}žyî ù"µô ™s’–™“j¼ÃˆŸsÁÑ{Ž=«Ù=žØ>S¤g…!Þø§>©z$õQ~‰Çœn°ã>CŸOŽSõ†ûî>=Ý0Ö\½ÙäC÷c»N?gÛµ7Š8hè<(_gU÷®÷sgß+wúa¯š«ªÃc2Ö»¹ò;í¬6ã~™i ¾9§áÈuòRõG•ëlÞyž©Ar?ëAñ^ñà>ô~^pœ§é»äAÞs¿åœÉ<üì-º~/«>ååµ Ë9kû_šÊŸ•òdò¢óËe/÷ð3Ÿ3©;ï{åš8³ùàšäý–¾ñ^âù<Ëøª«ÒèÌŸgoDÆÍw⊺iêš0þCt¾¼ç/½¶b޽Gîù:ËÏû‰<ä÷—êlÃx羂㯸Mýª÷YúoÁ~V缇¸÷沿âB³Ro¯Í{€yœý_ ûÓuôþª|$ì'˜{^s®òŠ×’úøŒ#næÝPãÌús¦ÇßgЏK¯òŒbóïZMîÞiùVsÏø õÅjÎê¦Nª£ê冎£™²`Ï+÷Ò‹ÜŸ±y®ò1ª“Žw‚û9ß~O¹î…™ÉI僆±&ŸõÔpÁ|îx=Ž‘œ0¶æzjL ×3ϺGÎæ§øU_?EÇÍû&甸È:ä¯ÌI;N•Sj”óålžú»²ª3qôù‘ï’*'ÖJÏøLU¯¦+?Ww†°fßш¥;XܩΙ¶Ì÷Oìóªaì½ç+û}Ò0j¬^ÐqTsöÞŠ9—Ù‡®ô­°Y»î÷câ«^ÏKYq䬡×Zå$iý!ŽõS'å&mVÔõóÏ5ñ·Oåç#Æ5³WÄ#sãŒÿuŽê΃Ùƒ®“|:ãÀ½åžôYɽÏ0Ö—÷wΩÿËÕ‚^<—˜ž¿ã KÜä;kÖk #ϯáèÝÄ’GÈ5ßä>»ˆë9ªüžKÞr¾To€k\fÎÉâx/³W¾ÅÜ+×b¦~•'Sß]þK,éêõøŒ'žzþì7×ãF½«·`UËYÞÄ%Öìâ¢úMgV{õbÁï>w§f]Uã#Œ¼Îðæ>Èü|&I÷1âjÞÝáØ‹Ò>gCz˜ú“x•®åYõEÎ׸җš>×ýü-ößÙ+ÿi.dÏþ ¼O4x^X[«E¬Q/AÅ(&º¯ BPNäCQÄ}ßNòÿ„S¬ÅÖÖvïùýœêêêêž9y àéŒ3.3~žñëŒ1ãõoÌxsÆ[3ÞžñÞŒf|4ã“ËŒ/f|9ã«_ÏøfÆw3Ïx†=ö/XñŸñÇŒ¿±æRæ ¾°‰ù-V¼ï±b>AI¼Žó‡X1Ìøo⓯rŸØ?¡Æ'žp¬~VõêœêØsK-ïc«ùöš_u?ŸñÃŒÑkÀ^;ñÉ—XÄP¿«ïkX9 ëlœSƒäÚõ}`ÅÍ³Ò û#îÄs]‹<ßÅÊõ}l¸Ù{çLlêzƒž÷KsIçNܪþôB…ã3Enwù} ö¼÷ªê“4>ù²þ.OrýûùÔ9¹3®ùT½uo^Ðû’õ¦öäãž$¶ï¢wàØ‹Ä\°q¥^9Îq`?ÄÒîY°õ@Ú'ÆYOs_°ÖÏÐ÷–u3GW»ruyrÆ…{†¥‘˜â˜ä|—Ç_aÅàÏSçÓËüŽçèÁõ|ò'öX~”~<ŸtOÉ+òÈ‚-oê¬ï=ëgÝeÚÕ.®üžú¹‡º³ª·:Ïz哪û}íþHÍš´`mÕ=õ猰žçïù²¿¾O…/ÍYå3Ýõ9¿ÂàNðçÚ“kM½¬çù­4érËçòÕ‚ú®é<“ý#fµß:ïûÖÀæÿŠoîMá©wŽ£¿Ÿa=ÄÑÕÞôzs¿wØé9q­0‰G¯ 1ù.Ð çgõJ=¶x¾Dï¿ëùz¯röC½›‰MKçuFªfíæ"7ú’ÿÆzn°í¨äïÜ¥‹üëºTo÷nÎQ§óYÿÔ·k|àsÕùLÚªÞ{èw™óâù£ª71kŽ8ù\ŠÏÀOXz3|ŠZ3ÕË{DØ•ˆG3Gê™Ü½Ïz jNˆ§3üÖgð. ޵úÌлg|RÓìÑ‚ýNÎ÷R5“îkêñ·N§­ôºàXÇ¿Xs¼Bÿ{˜vXæQMª§›SáÉoy_J÷–øÝbÓ y©ŸÂ{ˆ#&5Èßç+ÍÏ|¬|òLÞWùfá7Þsê“w&Ï ìóñ¼´ößÕ™—5iW¨ŸÌ?Ps–>Õ}ž~¯z–¦ó!k{Ž»÷à@Í3{™>îf§óšr1Oæ¨ð‰- „# ÍCêZáˆ'ß}âéooõþZïyÓ 6îÊWåº`_“ï%þÜëâϲ&מcŸ«8jÔí&êDÎ×ø³Ÿþó=´ ög\+ˆïõ9µOÍ•#ïkz| öwçmÍNWÿÀ†§·˜ö—¾ã7üSqwßT; 5«8°.iuV[b÷¬·+Ï“›ÏF7sîÝÜï~gWùXÃÀŠ«Æïø3îÛåÿ¿ó{~˼¹?Õ7oøÜ:_í›{X1r¦œs7O¾¿Îæ)19§Ý¾îüª§òªkM|άvL‡[yP8°Ýaô=k'Wõý‚Ú#•®yGúLI¯_}Í™wüüLbÊgê·ê<ó¨æ|A=gšyÖÎ;ó½žëŸ.W5ßé éí~«ô®ú—s­Ztç×=!\bÞâ|6º½AlâRõ0ylx©·<šòLçw¾IÏîXõË÷ÔG¿_5Vý`/äù Öó¾›ræÉgÁ^ûkv´O<ù3wš×YaJsúÞu#Nbø¬ˆ‡æ%9Pï™×¦÷djýös‘žÍ•Cúå žÕ«~ú¬³ê±º7ÇÀ¦A5 öóêZtï\í³£ù¦–üß½­<ÚE×äéf9§“.8jK-G\ŸúTi qJ>Ý,s¿ø.>›%¯Ûï†{ø›0uÓ ˆgůòÓõšçùÿÍu¯²vÕÝù~àè%í¡3¼n–Ü;ÿÈŸHdx^•XÛŠdEŒ‡EQ¼,*^P´¯°‚dUViQpß|¬õÿ? N'*NÖ™q¡`驊ŒŒŒÌªîžëű^ëÕ±^ë½±ÚXõéX?uë×±~ëf¬?ƺ«õæóoŒõæXoõŽx_ŒõÕXߌõx¬°Çø{ÆèØð_ÀCø î'ذ?ësl1asWŒ±Å!¾ør?ÿÎÏ©“8xü÷±ÇVLÆãÙŸqŒ—y¼]#b5ÌùH«»ø‹£jÙPçŸç”WzÀ9©nÔ•xßbÎ/1ÅExéaŠ›çUá$¿Äk˜9J3ò¼¯nYÇuoUš^pŽ+î/cÇwþàØçŽ#¦ãÉK 3o×äÌ›¿ãØÏÒú]̸îõ±a&×JÛ‡XÏú‚Z4ÌüÉû;Ôšs5'\kéâýUé’yÛçñ]óªg}}‰ ÿlÎuœ×µêC÷áJ×¥ÂÍþ!nö¶ðn0kA®Êûù7×ßç4õÏùæúK#ŸŒ¹Â$wžW½|¯ïÓŒyrݧ\ž^÷ºæ¯\ÏUºÈƒÙóÂËžO­+<泃:ñ3þßù¥ž {½äòJÿGuëØy‰Oö˜êγÜÏØ¯]÷JgùõöÚÈ£ÄËœVyT:‹‹÷dj=/UÿpÖø\L*žî5éwÁº2†òð¹å~I––}¬gØÞ¥~>õSÝÅËgTòJ/{î©åª/ÉÙçu5'cd„§Z]PÏ®[Ìœ³t¿4̽|]—äªÕünØç­0‰ãò•|š=¥š“[•ëÓëÙ*?{Ƀՙ9ÓµËþ¹O½ƒï‹³:w¬g0ï“oÆXájF%¦ôlظj~ŸùQõùG=„É7iÞ ³îŠ£Þ¿ ölG­‰{‚s\qRÝí«8Š‘QoaH Í÷¦÷N•«ÏïŸêá\ªZ¹¦ uŒ|ûul|…CŒ†¹WõŸÌµaÖfuG¦¦ÄP½”Kê%Nš/5b?v¬ûÜõQ÷ÌoGõšãH'½ïμêXù­áÈyÓߣ®‡ú¯cÓÖk*LÝYÃʳÞ7 ûYÕ“X«üVõÔýq6c;Ž>ÉZæ¬~Œú"GbèlÎ÷—ÇÎ9[õ™×H³Üµr:jÍU«|ç:v¥“ænÇ^ƒÔjõ>'>g ¼±ê«Žc¼v¼Š«cÝ¢Æ#׆ãÌë™sb‰_êÉ|Ùë^£U¾g¸«~%wiª¹’~¨â±o]Û¬“ûó‚ºO’/ïB÷{C]§ÕïÒÙk–1Î4¹Ë»É˜òÎËܯ½ŠïóMy)Žö?‹3ÒE¼ó¼sÏÜ틇Øuh˜u¦Vù—˜ª»ß sýÉ­ò‘f?Ïëog9gˆ¯y¬þàÍ8äëZг+=4/ùæc<÷ƒÞOPψŽ5®tÖÕ0÷_~¹`í·Ä®ü ÿ ïÿÌHçK›šŸ}ÏèØ1å÷†ûËçMå‘jn®f ±ˆsŒÌWþâwªê·fy€œ•ûטçPÆSbç{Z|+®âÉZ“Ÿÿ¶G>îéížÎÞ‘§½GS;ϼ˜“ûCø÷÷1ô¨z¸ÒWxâ)¼7±çK­ÉyÃà,l×6uÇÊNU#÷ña®¡ûÊëfïWøä÷ççðŒ+Lð¬<ç1¦‡å]ê ž¥Æ<ó)¦Ö<‡Þâ³ü]r๮·úésrÂÄo<µÇõå>ùV{µœx¶Î} Sã÷0ý©óåMec¥ÿ«Þ§‡ˆ™œäñ; îS=Ê õ•:sò,yä’&O0jù 纪–ô‡8){„§ÌɼQ]ϰÏÉ ×ùz¶é bÿ€c¯eV3Tér©†¶Ï÷†ér&Žö7¬sQ{Ùß*WF®æ¬È«•^¬%ý•Ùì5øÜå´pOØÏ¡°‰«~j~ä_õît¿Oºº?ÒÙ'ñHÞŸªïÔÊëÚ0ßmê}5 ä¨÷¼ëçÚ‘'±ˆq‹Cüøü†Ù'i"ÅÑýÃ߯¼S½£\'æŒêÒÌ“™Õ0jr½äG÷ûH¼Ô)uÏùõÞ§&Úã5é|Ï‚GØg±ûÐß É%uò;“°2ÓO˜ýÊLÏ™ÉLYõš­î ~ÎØû—Øšï ûÚÕqVFˆŸ×ù|†ÿçz\aÎ{5•ÖÔh5®•߃…MLîÏÔÒsp5|®ªž{OÜÇ®au¯¦s¢w¼—«ó+¸Æ™ÕÉgåCÿ¬¡s2³›¸º»$.3WXâÉýÎKµ®úuéž!½èŸQëœØÒÍýéØG9}if_¶7¨ÏÉ3ß5û@-ª÷;ñ„%M7ìgX϶ûgÓëU®±ÏJϹ¬'ýë=`å½Àu£f~GV¯òŽþk8×.ó“½öwªs®Þ‡ÕýÎóìE´h¨õH|÷ºf,kn¨½¨w]ÎÐÊ«¬jØ{Pó³abdTõ¦Ž+ý¼Ï^Ãy­Ä”w6ŒzV3,_ð§Ò­š1å–xõ£ªùH{ÎîÔw„†Úƒº· '=w‰kõyp>Â"'ÇJN•öU¬oÕKrú5f•£U›¸žÑ°ž³ ;{{Â9ß0ß•Þe™ôLžêMâ5ìó65ä~ßÇ=|–g¦¶Ž{‡=G¯™ß‘<ƾæÕ»(ï^®¥gLÕip”ŽÏš¸>Ì÷ÿ_ýL«lO¸†+ ÏË|©'Ô}|ŽÁ±ÂvTå ŸPŸÁ?#sA}ØPë ïÓVù(ìÔ„¸üžN˜žÙ+ö´aÝ/i¼šéô³<"^ªÏ©ŸäÇç¼Kóê}ãç­<™~¯|’zyEØÔ&=BÜÄZiò§ÒWX«ï$œ£2¤òÃ*K+¿eîˉ™úVü+ÎêqÝÇþöËôO¹utÎ3ì3Ü}çglØ÷”º_šù†ã*/+ëª;Àö9îXù7b^cjw”Ô¡¡þÜߟ§?^än ï­æÐ1]× —Þó»±23¼Ú“ýåùš¥›ûý'œ×Ô°×(5ϳ}_å}^Hï爇û”9ìE¹N/åþ†ÑõA—•'ÚÇ=¼7e þ·Í}f‰×³úþÜ3%Ïp/®ðWy’=S­Ù7Íô-öu7óaÍUÎ]šgòÒ¼%îê>F\ÿ|UÕëZz¶­jÈŒ{„ý#m³ŽŠ{êQñm8ÇÊÞ»Æ/éZÕ{…óšzG¿þ´µG`x^X]«%5¬‡EQ\?P4ˆŸ  ʲ¬®rP¼ˆ"û¢¾]ˆþÿá9ÅÔT:sÄ yºIuuuu'sžø~[?në§mý¼­¾­ç¶õü¶^ØÖKÛze[¯oëím½³­÷¶õѶ>ÙÖWÛz„CŒŽqþÅâ,Ï5ìg¿¸žû{ü_·uÃøÂyˆËq>ÞÖç<ˆuÁ1âõm=À9¯pÌI¼.ØñëLŸ÷qäHÜÏ0r&þרcTœ3Î[¨õ¤ÄÿÇÉ¿Â|÷iýçz¯<äøâMžß`Ç–c°nÄ OñÜwŠ'ÞÅ^[å±âÞ1bãe ŒÔÁu½`œûǼå1ž»®Ž%=Ý·®á3Ì9yx­vÌO±k³ê‰Žñ'lò%¶ø¦·¤ó–v·jž}+ÏV:8_ÆàË|5ÓæXª×*?±çàøò‘j(žÔýUqs f?jV¼˜•3=^á¬|íµQzo¦^ôïÕ§šŸÇy¢ºsžd¾Â^õsMLïkêéor%ǧ˜1‰÷ž÷tug3_žW^®çR³ÊËÌç[ϧ&<ç|9ëªxÙCšÍ©çõ55à¼ì˜u}ßqsFdí³V•¯Ò÷ GÎÒꂽN3??4ìüT+¯sÇüPü¼s}ÿ*–k ü«¾'Ö=æšÏk×0ø³Ï=ÿ³\OÇȹ&ž~W_0×ʱ+?kå#Þ YëäUaøyòp§ö«·¨rUŽU¯3Æö\ÿÁè)õ¬×ŸÿÏþöÞÎØÒØ=p¦-µy {N©óÙ¬w}Ä‹}ºÒ:ë->ÊO3¯á¨å*~DZ/4w+m仪7¤‡ãTZx]Ó3ÎÇ5á;Ý=Ó¶õ!ŽóË¿‡ô¾¸`oåƒü†8Ãë8b[ÃñœjÅØÜ›žc,ÇÖ¾Ô:fÈë9›¨?ëê5uÎUMåÿ|Ï1½OvꛣâÜ1û£açæÚ1.cº7åKõŠpŸ]÷‹'ñ[gt_8·ŽY?ÍÝ; {-¼®ÊE{©µf‚ö9¯ô•ë˜ï©†Ù«:ýº¿óÞK\úÀõgéÁ³'ïãJSá—ê˜Þ¹uG1çì¥{Œ<Óç‰×0ceoR»;ìµ$fÃî-σÿ÷Zgêá=«X©‰ú¶c¾›Ü9ˤ·{ÿ‚™cú8kŸXÔålhư¿:n•¿üÎ=ž“~ ñZ¸¶êÝŠ7uà|¬¼A­ÏÞWƒ§óÊÞ` õ9ïå¬'cqÆç=Xùˆ%÷¤ç ìÄè½’8>c}Tù3÷¿qœƒ·z#1”jN>Äh×3Êÿ¯ëÿÅÙcq¯sÍ~ÊY¸š3<›ý(~uMÝŸ©ûª2çn¥cöÓê=±:jßgœÌÁ{Àïñÿ§ò±…«w”ãvìs]u÷ù¢¾qÿ-²â',õ~ê,/匽àèÿŽ9_¿ŽZ“’Æ ÏóðÚð¯êé|{HòɺHKá(?åä5ñžKœŽõŒ!–¾KvLiN,é!ŸHóô¬4•7øv-é{¯™Îéþ¨_>¨µV7OÐÖL¿àzžÂDð»ò!zù/=ï=ðäwÎMÝ?Åa6vš¤oßU ®0…¥zt½åx5÷?­ÝwÅPçÜÜ»Kmxž‹÷e­óÜ×]x5Ö^¯î>”¦®Þš9è5¹ãÍԖꂘ‡]=RGàÀ5ë 3ä¥(6~S^Ô>9R›Î_ôÑý:»'³©á¹Ô‹ûNõéâÛµ±Ô~^ûS³ÎA÷T¾U–ê=3›'î¯aâe>–øy}Rïà0ßoêx߉˟uΓZs/+ߥv=$yÍzÇŒ8èb6·¼V:Cô1ÄUw…×îêŽXëìsŸµ]üŽG[òάÇkõøªã•fËuÈ=ÓÊ]³z­í{µO÷>¥„7óQêøJ{êÅFöCsWxô’÷šÎ27»³®7ú9{/g?;~G1è­×‹Y°ÔŽ+,ÍTÎ_qÌÙ¹Ô¹§ð”Þf^!V~×êb^Ý¹Š‡wfúöÞ ›^¹†µ—ÜÙÇ\IÓ}êýE9+uÞç®÷ó®{†ú×k!LjŽÏéçMõ5_ëÈ3½Ðéíª—ÂÌžÍtLÞôªã‰&\¼žðM~â¦ÿ½¯âÉýãXŽÓͤ™?Ð\¤ }Ïì0¨ÚÒ]à¾ZêˆuŸYÛy†Y’^%Çì¥k-ï…³§ëç3º>»³^[áø¼¢.þÞïµäô¤Žš×¿uî_Îjå^ežýTç^$ÿ×ýà3Ìc0W¨Ólž¥‡·Øô¼|WÀùßê9Ïü+fUÖÛë : ÞQCc¯ö¥'ñƒÏ7ÕÈsñ<O½Ìz?¼=ëê´â\fuH Î<Ÿµ¶ü»þ“¼º ãYí8/<îzM=q'dÎ]¿,M­h¸$å¥Zƒö³7çˆöÂõÃÚg%3³ä«sÌhqŸ(7éÐë×åÄ™sѽ¢º¥WÀ¾ëûp7Gü÷ÁôÜý^Íþ§ÇÁÆKí½ÕYÏ×¹äÜÑ9xÌršÕîêmJ>]/<×Dj¨ó^w]tç™ÛKí½Lo ã>žšåè}»OÏ|&i®ù Á›ÒÖ£:×l­ë\›°¸©U×ÇÔ…ÿ.°Ôqn|]óûb­£?ýw~oèÞ9›ÒWõä=8ÓýÏxÄòûï¦Î9IŠÑibö›y‡»»Àñÿ­»{É5ëü\9¿:¯tq©g»¼.:çú¥¿:«ýìÑçêƒf‘øk†ºîžÔyîû Ͼ\q_ëØ´–y u3Mxkm<¼fú\w=wzêÞk9 ò=!þOë<—éaâ?¬ÝÏ'„é^îx.užW³Y%~×q¦·ÜÛWµp?ÏbŸ¾íæ-XWžZëìWǃ'uuÍÍjrŸß"²wKñ}®]ñOìÄ£–žÿ1ÌM\x^Y]«\E¬‡`Pü"Štj"ˆ"¢$aQ\$ ñA|[<øÿ„Sœ-¦Nž³7^˜—{gª«««{f÷¾ðz_oöõV_ïõõa_÷õ°¯Ö×ç}}Ù××}}Û×w}ýÜ׳¾N}ýÒׯ}ýÖ×ï}½èkéëµ¾îc࿃ŸØÂ|Ü×}ý„OXÄy[œ÷ûú[Ž_aåù × ›¸—¾îaËÓcPâK‹Ï0b}Ñ×÷¨u ¶0už{–ëïGz7lù?ÁŠÍ3•3¾â)~ª±Ž4žÕ,õV. [¾î‡çXñ…}ÆÐC?žá^rX°þ¸Fò¥<ù)öž¤^¬u•›çUåôö~®0•SjæZÉ×Þ3^ƒÿËÏý'LÇ"΂q¾êãÔLz±n3N3>®Wöê9ù,½pä1qži(Î3/˜Ï›ìãÔCõqìÔ¢âëøÉ›¸Ä¬æƒk‘ú:–Ïç©™v [¾dÍ|ÿ~¹îqߤßf:U1oÍåÖ0ê:Ã;cà¥`häþà"gÝØcÎú,=÷Ûú%ÎQ®YÇôﺬ!ñ«Ú%Oáf]ˆw«'2ßj¦Ìú âF¼†õ¬fˆëüòº¯òAåó†}-Å…õ¬¸Ð#®UúlæaÇ&wásVÍê›úI7yn6GìÏ¿‹½?仼Y ]‰Ù°rQÚ«}wñ¥ë‘1«ÙZÕòèä1¨7çÖSÔÞ—wîa?kÙûU¼†mÏ*×ã.uå{r†­Þ}‚­w|+Îk b~‚Z;¿?2‡Êÿ³»”?ÔÊcxmª\¼ÏŽ|F®Ì—¹òýèõʘU^ùNÈþv¿3Or¹u§ý‹}ÌŒ—zJË Wž ïf¸¼?«y’ùõÐÌw®×«Æ¨Þ¥'ý0ÓG˜þ†¯ð„•÷¸û‚û¹—ùUw–ç“:ñ¬z‡çÅ•ûôwùNø³œ¤}«÷€r:cäå5÷zk4¬xê{Çñy¢ó<ã\T+?Ãýé×Éç§{·ª·ë¡9¦žÏ÷£÷Ï“Ë?õåyíg¾^×ÊGé¯Ó‚ùý£z17éZõ½ô幆½ž•×]ÎóY?ylŸo' m…K¼·±Ï¡a‹I,Ÿ§•O¤‰ûͿà ¯ì'žãŸÚŸú»GÔÚd‰WÝ > *¬ G÷—ð‹3wA­‰ð„¥·VÕKÌûÓãŒç¼ù3ë—†mgsüŒZSõ°z¯òœf¸ûŽÚ<žv©¹sv¼'NØßm®mUû†­Æš7³š)÷䑵"'ÎÝ ç‚13UƒÊ?ŸöœÔy²ÿuw7¬¸‰á糦äåwAr¼Õ÷Ëu~aO¸¹O¾d|ñoãšž°¯÷Ì/pÜóÒYßÊ“'lµús½Ò[òù Ÿ¹Íúwã^õ—zÊgÎ ûÙ·>‡+m܇ĦFUéÇ™>ÕwŽŒ¥³~&6qtV³Ž{ÒG³ØU\é—³é(G½qÃ{%}ïùͰg>˜}?¨ºûý\³·ˆå÷¹{ÊõxŒíÌ–·ª8gŒù(½©EÃþ^ÒÕ)kãyùœ¨¼åó³]Ï‘3Ϲ'Ò·>ÞÒtÁW«é}’1ŸØ®ñ„Áóέª•>ÏWßiJ_ÿ+ßOɯÒ8ãÉgÊy§'Ò›šo +?ñQÿþ‰1OÜÏÿR¿Jx^YM«E¬E0(&´?!BPTLTŇèº{0ñÿÿ»˜[tMÍé¹Oô&wººNªÓsožh}}Þ×}ýÔ×Ï}ýÖ×Ú×}½wùl¹|Æ¥¯û}½Ú×k}½Þ׃¾^ö¼Ù×[}½‹mÿlç|Ô×'}}†íÌg}}Ù×W}}qŽxü‚Á…gòá&&±œ'÷®—=þŸñ:XŸ!ob¿ƒ³öˆë Ìù GZœÕ®šgXÔ•0øÌ°ÈëÛ¾¾Ç†÷#ö˜Ò®ê•zëXÉ)ë’FäÓ°íý£§¬í»¾žcÏÇû‘\ˆé5¶¾>Ä›üžbèÇs¼ßª5±É·Òν—u»ïîaè ¼ÇØ{„xŸbã8ëíŠ}nÄOZfͬõ žÌ‡×ì=®ú${Ý©gj™þ‘Ä$OeÌëð3ݳԈg€ãùÒJõyfæažÓ°aŠWòæ¾Jõ°¡Ö%µ§Gœã‚ú,÷JæEž¡&ïãèÅ3\ÕÊg]£¬M¹>›?™£Ôí¦¯_±Ízˆïü…ãR†*î•çÉïmŒÜÏ´Q_Ü+™ýÙ™UÏ¥ Ïþ™ïoq«aú6׉ãû=Ÿé‡*› æŠsŸeîˆÉÌåeß8Wx‡T礦äÉgäó̤ÉóåÞËÌëÜìcêæži8ÎNÏð]r«ZxFr'ž{|Áãw ñäûOöŸ{ô¹×ReÓ35{b6WsEmäka9ïÔ˜XÞ?÷²xè|>?ë·{¹¡ž3ÞƒŠGÕoŸe³w ö[zUZ%nò–‡|$w÷é‚;û  6ó§ÞzÞ¼·Â­ø’gæ:9žé[ÍŠ†}í³{ÁëUòJjÏ稉žSÿ2WÔD9õy絓®Ç#ßoª¾¥Æ®¯sSæÅ+kçóüsJdzy'o&—ÔõÛ÷0Πÿ‰M<Ö¤žpß †é3?ËûAìY~½⸎³9TùA8™Íô“öÍø¨·ª©z×7’0ÓçUŸÜƒwég}òÕühØóa¬¨ß‡ª'~yo{FŒ3r&©/ ƒïzùÈ9¹÷˜/îS/U“4RªŒ‡çò·Õ•ú¨õqÁ±éœúäw/¯Å÷‘ƒß!ÿwÖe¿Ýç Gj–©7ªI¿æûôkÃà<›õ³>V:TøÎÿš§äÛ»ðUf“|}Wšˆ3ߥ’wÎZs6«þ¼ì‘ÞÊ12ûÜ—õrÏž›Ùœ}_—ÇÞdï+ÙÏUãŠI<îõ¹)Ÿs_öÕù¤¾y¶pä½ì§ð4¼ {½5Gì9ñÏq®yM3{é—z7Û§ž¯Øk¡su^ê"}³–ì 3é¾&nòwÍg×wÅ~¦{–gZT\Ôç¡ýYSÕëÄZ±ïSÎGŸð™¿`¯ëªòà^TÜÇ©szYwÐL£Ì…ãÉÏ·³Æ† Ù¨îcáTúpŸ|§3Ò{³™Ç½«ˆ;ñ¸GÞ”—ćžç†ÏÈoÉ]žËœyÈï8•w˜ ï™Ïå†Ñïj®ß`鼓¬­ÊçŠãÝãw£R­ž¼‡…G>ÿ ÎD5·\·¼7òޝô«ü®ó”iÕþ_zá¼õ;]ÅÿZŽÔ£®üÜ0ú¢=ÒÏŠKÎêåzËëÜ“}T ÕoηÂÒg┹L/¨O•¯´çšvìÑl†d¿•]÷zÞOò–ÎPÿÏüDßW÷gö¥Ê\UßrîWç²&âð™ô_âj¾ÌðøGŽgäö Ž`ðÉïÊ»þ:J›¿/û¼?Ê`öጻÎw¯ùYøUßäi÷O5Óϲ]a/¹Ípªú+í+ŸWkü|/˜×]ayn<ÏOQß7Îï%6މ9›“ÒÀß­Î2ñ†~F…í¸=%¾ÄP½Üó/ÏÝK&x^•Y[‹E¬‡ (^/âðáB‚ŠI”AqEò"¾-ŽþÿaóSSsºg ôK¶»Î9uªN÷ì>ð¤­ÚZÚz½­7Úz»­wÛz¿­ÚzØÖÔÖ¥­OÚú´­ÏÚú ÛùŸÛú¥­ßÚú+Þk¨1?hëC¬ØVLâ}ÙÖc¬x?aÃü+î+m½Š#®çH,á|kÆXK[pÄ{+æ;Xóö#løªÿ ¬±Èã}ƒ:ó‰5fUƒÇ™päCÿˆ=vÖáœ0â ‹¹ŠÛ{ žW^Ù/ïUÅqâ‰ß;lõf¿ˆ;aÌå ±¥ƒ[ÎÄö¾Ý`¯3å-Èå¨OÂ'væìXêËÓ¶ž¡î1ÔýöÜ&ìûDÔóGn¬ç仿±ÅÈ|'ìõD~¿Ã–óŒß±ØÏÓ{ÆúÅ'qtžù0úFÚs»þÈ‹kÂ÷Î×}ž›÷ç\ŸžŸêýÇy˜®'ï{…ëõ°þÿ\ÎÿK8¾Ïæ,lr{6Ç39qlטj~¥_Åà?Æ‘n'g‹pxÆ{4Êé‚ g4Ol:ÑLrMŽÎU}u?÷øqnf±½>Ý™—4ó9öó͵3â]º¬´ÃxyG»×çl>9G½£YÕó±4‹¹?÷z özqÏñ\úLçôÎðÜ3歹ögÔ¼ á9†´ª3Ιô9]÷²ö]=¨âT~yµF½×SUÇ-Ž÷š¸rž˜ï(†óŸ½“F+í¤nÜ~çkFë~f_^`¯[çì/l|Ñâ›1ä5÷ñüÎ#–sBœÌ÷‚/±’ç—9é^ä¾;ÔÞâ{å-çâ„ãÊxä ×Óœ ½÷[Þ|ô¼Ð‹åµÜ'¦ôTÅáŸùÙu”:{çŒâøêaj¿fCÆbr#Ìô¯°è[ž¡·z\'¿>›þOÝ©ÝašÄ”gñTWâ¨_Þ{Öës7±þD¦ôîºì°Ïî;y¾š×Äsýô0˜[ö#ßUnŽ·`«Só†<%ßÏ#¯¥/±¥×¾¿e7õÚ›äçìûØÓZ¾'¥aÏû>ï¿ÓÄ¡ûÉ÷%w<Ï;©ªQšwœ¼?ÅÖ0ã˜SöUù|Œ=/îŸÒ¥ðªųkÃë[°Ï+û%¬ V¼Š'Þ ŽùT³+}ç\Ý¢ž[Âô™˜ù »7lÔ½ü[õ¼?ÇQWâH~™°žzÝ;ãØ£åzF;?|÷î:æRñ­zÓù©¾Á*=TsïìÀ7Øú[õU÷HO» ö˜ÉƒðäÍ^_‰u‡#^¥“ô­z<£ž•^ïn’gõ¾Õ;«š=~忊 é²ÂKß«wo8^¥­ÄaýÄQ9C¼Ÿ®{5?&¬ñä#î®8õ}Ôfæ“Í}kä\q¿8×9OÎ2™¾w~glØÒ÷H—Õç­ÎhNQÜ;âÖuŸÜ¦Ïzyܢ֪ߕԻÑwK寬Eü¹/ظ×Çù»Ã±'ÉQå r“Ú;óF/ÿ¼#zßw®ñJÛU/2VõæÏ¹ý¢K|x^X]«\E¬‡ (~¡¢EGñ+p1„ DY/¢H^Ä·‹“üÿá³Å©S§g÷.ÌC²Ó5ÕÕÕ=³÷€›±¾뇱õóX§±~ë·±~«õ`¬WÆzm¬7Æz{¬÷Æz8Ö'c}:VëKlxÖŸ˜8¯bÃzÞc}ˆ‰ÙÆúj¬¯Çú·Â¼Ãüïuìù«â(ÌG˜¸OÆú 5þ˜¼Çý®UÇ<ó#lg5ûž8ü\Ê›qcãùö\ÉSµZÕI<;êZ¹ [úJÖíDZžažñ .Ÿ#½‰O\¯}zÈóWœkð>&G×1kFžÊ?}ձϛ˜ÄjØâÝ—KÚGM´OùVÜWž%yV= íþÂ^“Ä#ï¬S•÷-jnï`ÓtUs÷¿¸VõNm3ž! t–û7Ï»Ögóãµ”O”×}|¢~¡Ÿ«óªY”5uÿ0å lõËJ;åô|¬ÿp¿>XååõÒy<çÅù{þÿ]å¤Ú´ó^ÕÄsP]”Gꔵ{_‘ŸëœÞÉœs.5lõ«r=á¨kÇ–gúÜ}]ùJ<¼Þ®;=œþõ;Èõy€‰+LÖÐsáýâ5»EÍÁÏ÷³¥Å}¼Ö±Ÿ+òSÃqþùÞU¤®âô î?;^âzý/õðjftL\×Q|+ÍÐöï°iA,ñb|ãû+ïÉ¿ÔFµ?aÆË+©¹ó¦ÆîÆVºV8>ûsN6Ô¾ÒûϹæyœaGþÒ^3LM‹UéÙÊ×|˜9¬¼’ç8g÷ájîVæJÕÃ{»õê9LþO±ÎAzeÝ«wTêÅsT Í‘Žï â;6ýóÝ9Ž1Ü_i©{Fo¨F«s;Ž>Rí5 É¿Š%çê>uðY ÒŠSL;ïå>晘9cäá*Æ=¬ýÕ,—Ÿ¤}ÅŸû³öÉ©Ù~ïÔNš¹g…Õ°_i–\TϳšŸŒç~ÏKù S~P-ä#ö‡çÒ-Æõ éáÞÉØ»UÏò}#->ÇQÓUvìûÂë¿zÛix/gdUûüû9{νy /}¤È9PyI<;Ž3xy·ßàúÛÙëSÍUï éGŽùžMŽž»crîÓï0婿ŽK¾•šËy‡åû cÆŠ‹4ÒwÔ‚zòÿò¬œäN|÷U¥qåÕ<–p*/ISá4½Ä¹@¬g¸Ì-ët‰ŸîÐkxÙ;ÉQ½sÉëŽWqËþVÞþªðÒ¿ô#ûg•kÖ„9Û®½ «¼o±aó“þsM5ãWHWâ>ÇÞƒ©¥¿eª¿‹©NÞó'õÐïﬓxzîŽC Ͷ—Øî ×’Xʵêµê}âµeg¶ê*m²ŽŠÓɹºªã]ϪöîÏêw@zžy(bÝX }âÞãý'¾îƒÕ›Pçä\’ÖòDú‹òÍALjÐqôkê!=ÅQ>ÍûéÚ¼Oï[qÔÝ,®Ð<ªrYiÊ|^`ÎEï¿»<ùžþ\Ýûãø·¯òTù]Óp¬«z!{ؽ”úeª™BŒœ>¯VýïÜ.éz‡ºgWu&¶cVù®<˜p_+ÿŠç-&Þ¿Øsõ^ñùÚ°÷U5û;Ž}'×Oy*.Ïf>ú-ê:{h¿fˆ<š=#?æ•^ ûz_ª³ôû{|yÚ{==‘wcriØ´–ßèaj¾z'Uþð:xM¥—ò佦YágÛqÓÏÄÔßÈ6Þªur–O|>8¿ô¯4·¬¯ë*^oaÃk8rr=—ê*Ϥ†Äã¼Ïé½QÕ¦ªßA û<Õ[«Ë:ÿvÉHwx^•XK‹&EŒƒ(Š«¢âD QWAAwñI£8È‚xoƒíüÿamPQÑY=ã@žæ«¨ÈÈÈÌî~`ïñB—z¼ÜãÕoôx»Ç»=Þëñ~Ö㣟ôø´Çg=¾ìñUo{üØã§[Ÿ{üÒãWøÏã¸ãEw$~ÃÀ&±üüÆyñ$Æ[8pÃù­xÝôx†Á/sçü…-Ü 3&ñˆEžÄz#ÏÖãcqà|ËõK¼½Çs¸É³ÒPù?E¿ðRSÇuLñ.käØÄÜ1çþ:,éØ0ø¹w*wÌù>¹6ñåwøv•wê©zïk̘U­*ÜŠ«tdí+LyÉû抧jDÜÏ1|Ua;_¿ƒý¤z¥ot†ÞQ~ükÄ3~ÇÍgv̺¨oyÞuQÄZÕîq–ÒÉ…gïó|jJõ憹6;ήq>Àœ›xmX¿a®…c‡9噜 ÊÉûƒºêÞÕ¼Ú1Î{«äÙÿã©ì߆Q«œj<æé5SOy~Ž¡óҶꡬ5ùp.W;m¥™0Ó;ò±f¼f‡{²ÒJù¹^ôT5?äsõú•~ª¯×µá<‹ÄQ}ï8ÿ`Ößsæùìžq?ËWy·ÏWù*÷ÕÕ,q­ªy(ä5ß9©“ׂ¸Ò¿šQÒ]xÉyå»ôŠÏ†ä·ÊßySZ’“|{å3Õƒ¹U\\7÷ņÚ_üÓÎg~ óïCÖîÌ^w}\÷‡x]óÐïÈçâ\ùlGݓαâ'Ý’§cû¬&5&gm>ìrÝqÎU;C¼œòeWçÈ#µâù•¿s¾KO}䩪~Âq>ù ÊóÕYéúÎ÷}Vñ¹Ò8÷rê%\÷‚|¸©ñò™ÖuWo¨gÀŠp\oÖ¿šë·˜½žõS>ôŽfgʼn|„å8Õžýg/¬ru­ª^ä»UÕ‡Òþ)®Ÿ³¾•^“ô®óÔÜq~še鑆¡ú¼â˜Ü2ÿÜ%©«ïÓ 5®ðèEö¿0ɹaøY<ÓC9VWû1ÆŒ"g¯Ù}~¨|–;>sP/$öŸ˜çrz—xz–«<»£®•soªVäUá’›úëçgþÔ:9Sãê>¯eÕœ§;ê|ÜsÂwìpÎ#{®âïå ΠꙜ>kZ«öžxQ×ô¯z"{Ló°ê¯Ìó¾Z5Œ¹H-ɵz÷%¹å^”þêOÕíêÞ†ù¬zĽø j?®z±ê{ïÉ|®<É{9·«;¥éï˜ë¯;sƒgyF¿kûYÿßQëÄý"űšÎ#ßÛr‡xÎîI×9±É-{$ýM<¯›r»ò¢×k57Výò<Í"Ç“¾OTæ»òÔŽ3ŽÞ ˆ•³Ý=äs}Ãy×e¾ÌUÏ7ÒõÈóâUõ’fºs©Î³o1ôr¯T}ÒpÎÏ{D}¹š=;νá~Ì{ÿ»'uÏj–S[å•uã¯aÞ}™ï]yØ©wî‡Ôæ Ë}J<žõ} ¯0Ÿ¿ã·îêåÉs«=ª{¥ s¨öfbJsÏaÇà•³à!¾y‚ó·Çv½«o*ÄåÞ#¿‡jí=§y ïY _z/ë—^&7žõ<¥×мsæºÎ®ÅŠÿŽ“x«¹èúúŒtœJƒì÷†áe÷ÀÕ÷ qäÿ«šUžXåOüô¬ð…•}rß3Ü*?iÅýÎZ_Í/é¦ïúÙ+Ù{WºkÎæûXÕ3ÌUûsÃàµcî»UŽ9xöó.OnÂôgתfßã~O¬r¿ê‰ÔsÃŒMþªy•Cro¨ïpm¸¾CžRÝT+iì:CçxF¿å¬ò¾Ô\JÏ^}sô$oÞy‹ó¾•æÄr¾Î>Ïzå\o¨g1ÝÿÖ~P¾œ¿ùì_§~Ix^•XíŠU,0(JÄ5J4(:ø Á`‚¢rQ\į<ÁÂèû?„§˜[LMM÷Ü›Àù¡;]]]]Ýçì>ðÓ8§q~ç·qîóú8osœ·Ç™Æy2Îçã|9η÷ ÖØK,ãŒóÞ8b‰ýªˆÑ÷oŒó&¶9ßÁ6/ã™÷ö8ÌýV¼Ä"Gã|<Î'Xq¿ç›qžŽójÜ«&âI\ò#îXjþ„û3,¼¿À¢sÿ÷¨s‘ÿK,ù˜'µHîÔC˜Þ댿ÁÚ‡Ž#ù=ÇÂ-yIÛ?±rs}Ïù¨âáú{nÕ¡¼®yæ’ªÇõPâPiì>‘¦Óù»J;Ï÷K¯Yc²z©óÑŒ½/…ÛõÄ1Ÿ¡ïÍïXjª2WW‡viæÕlTµUùR·K¾®rVõåÒ=Äú|NXëÓüTØ®]5ëÝ®bžÇXr°Ž£¹<âi_±7¼KåÍñ%LÍx7¯—R‹Äõy˜°j¬þéQé0£ö&5MOª_É+ûÓy-=@]ÂSmŠc_GýÉÇ÷\ú'yÉ7•ÿ…›sv¾aÏ3}ÉÄϽ$î¹£‰?cíoêXiHW}QÅõÇÞÉ9JMÔ#éLu3¥<•ÞÇÖ öót­ö3êZrf?±ä glÞ{GwÞŒýnªtÍ»$g_uw5W»°ª[y>ÂÞ×^ƒp0ÒgεÛÙäx‡­*ün¸&—î#äµ£9ë®´NÎïÒ¾®f¹Û=ÚÝ®NÌ#¯Ñö»G{§«¹ê[îíâüˆ'ëN¾«ÈÏ÷arñzSÃôPê'ßh†R;Çã?iè÷úà3É~tý•׳ÒL<'ì½wäqb¿Äªcú»«Ÿ;TÜ;Þ·X÷‰óÏ~¹§¼ŸO¾}ª¾¯„MÜÄb,ãø-ÿÛïrbT¼Ä)ß|ö^ï¼à®ëê8^g…sÄÑùù½" Ù§WÑ0sÜ Þw™+ýFýÝzÂÞÛ3¶y½®JsÖÒáÉËÄáÏ»z¤Ù5¿‡²ÿu¹]ÇªŽ ûžH'׈½¯4º‡}z÷MØö@Ø•—œ+õ!ž°\oߌcÌŒåã¼ÆXwî„UCq8a¿oXOöç¨ïê…ïðJ§ô’ã+1ûöñG3z¹oŽú{Âv®õ÷¿Ìwi÷h_è^<¡×#±«;ƒ˜Üë~WVœ{:ë=V.búÎáÏflÿþH.ªëñ9†<ãyÔË|ä¿Òž3Ûi$O/ßnô›|Âoªý”ªÿÊÏÜÝï0·ØöHýñ¾S›îmL|a»Ÿfl=ì CuU=ý÷GÔWw“ߙй;ÇäÌIΊjy•yqÝN¨yæþðœ]>æÊ;ê.ûœ9Ôïƒþ.ãgc^;Ç¥&zÿÉc¾§•{ÆÒ‡ÿ°æâwüY…—uJWßá'ÔµiÓ×ÂÕû^󩹨4ëÞÒ.ûBoW¾N=:LÝ;Ùó ®tKžœ=b¨æõå7ÌÅo|.‰íó˜^Ê<Ú1Ò8ñÄY½£Ývo¨þ¬W:&Ÿm×P\¸Wµw*U½9a[çߨýžóÇÙÖ>V|ŧ»s^ÓÖŸýô·Fî~ÇeÝGû²ÒÓqÅ“ü´kºûÈ1“ë öóÞiAÎùæPŽ;¬»3µÈûL~ôþWs/ŸÏØóÎVZWœÓ»•ÎÄw¾z§w¿ë‹õÏØó“¦ÖÚ¯½’ÓÿmUDÁx^Y˪%EŒ…(Šâø@G-/>AAŸ/¢ˆ.Ü­ÿÿVP7è8ÑYÕg‘«©ŠŒŒŒÌê{æ1€÷z|ÒãÓßõ¸ôø±ÇO=~îñK'{<ÕãéÏôx¶Ç£/õxµÇk=ÞèÑz¼ƒùAz|Þãëßbà‘ãóüÚã÷FNÏ÷\ç1r>îñ&ö|ïbäü£Õá9ˆ¿õx£b ‹Ü܉%î‰',iò"®kç]Öžº:Ÿ¬Oµ½‚kM«:ůÂ%7iø/FÕJlÞ'Þá9‘Æêå—爫ZyŽ8üwròÅa³³Âd=º#þg½ïSãô›kãº÷³_¡Æ—ß6ŒÄ–÷žwýÏW³¼ŽœÒ®÷ŠxôfÃÀzûL}Œ%ŽÔú¥Ç|†^Æž#y»ÏVžåñôJ•£Òæ–~1—çpÜ;ùˬøÕ<+dž½¿®™f§á8ãêý¦wA­Sú&ûQõ€}'wöZúT;”{Üݓ䜺 Wü«ÞVZkßW˜ÒZ'ž<.]µw‡¼Òk®ßo8ΟêL¬ô—pÙ£Š[µoX¯fº¡Ön†KÌ{\{ʱ¥#ñ«=Æžg×5y«÷+U;3çDùXvKå5æÕ“s¯=M?gO”/{ :\ß}ä§úyþÔšúμ{¸ësÄ9¯>KéÑœ!ò×Þõ÷Êy‹ËL‡ô‘<¤Þ:Ÿ jN^«¾Yöúˆ¥ý3ëÙ†škÎPåç»ÚCv/º÷²ÿÕù•wÆL§œá™çU qôTuèÍ‘ÏÝâå{†þÈ=@¬ÙlæÈY.¹j'V<½¯UŽÄ¾CÝ×3]+|iü:¾x§O.8z„8Ò aŸs÷™Ïšûß=á5T¹ØGö@ùäsÖÏ;gßP©§ú%œ†k_­°f³—=òþ¸&³o—Ä'6ù¹~<—ï¦êðùŽôï­úOþ/`ß“­ÇÛ¨ýÅÙ˜ù¡â‹6î•/°ÆNÞÄmxÄáüªvÝç]ο×îÚùn!'Gõ]¸šâŸíå˜Õ}ö·µê'fµÝgÉ1ûâܪž8¯[æJ½å}žåþÛJÜ—¹ÛÕƒ³üÒ]=Õ{;x…±â¹â(ô^¨o3üªþê›×{éžö]êuø÷©|­=N¬ÙNÕ­™h˜óÑ\ønb½Þ‹JÆcUgŸ3v¶¥e~[¬z”x9«¸ª~~{&g}ó‘ó78æ!ïj÷T³Çš½ Çw@Ö,=åÅKÜS®kRU¾ ǽ¦Üôor—6–÷.ý–~u¬Š[å[÷BÎõy ÇÚ½Úí«Ý›:¤÷ª¬cå?é+¼G¸~—ÞL‹Š[j˜o{Ùß8úgõwŒò‘cÃÞ{¯‘ÿî3¥Bfo–ò¯úÀ=·ªwÖÿ†c>驜ÕÎñ\ »g\qã¹ô†÷’\®çüì›BXªC¼ýÏo¿Wþt½Ùgõ¸Ê«zÿþ+m}®®µÕ{-¼ÙÓé×äǹq/ç¾a`Ëc+ [ï ñ|¦y_z+¥Ñê·Ò[|ç^çÿ¥xÚ7·¾sÔ,çFoOC½gÅᯇó9Ëê~É“^KN¹SÝÒo†ëuÎðf{A|S»|Ó+lXcçŒkf3N¾+ÿK¼*7ìœü~åÿÔoõ»à†Á‹zI×ê{‰¹È[»æÌãjmýMŸÍuµÓ]+åºÇÈõg¿1Ï©\^õŸ½‘ª­ò¢Ïúâû„¼…¹ú k6+®½vœë>ãUí.ï¥ë*M«þïµtÌ~_¡¦šãUÍÞâ¨Fÿ»P³”½LéÑœ{ösö Ÿ=`ŽÙ P»Ù>Ö|ÇyºNä¦{©«Ï·úô?°”I‚x^™[«]E„ûAÅKŒâE¶A…¢ˆ(Q6ŠAÉ‹¯åÿÿN1~¬Zµ{Ö9æ%™®®®®îY'y\UOÆùzœ§ã|;Îwãü<Î/ã\ÇùmœßÇùcœ¿ÆÙÆyuœ÷ÆùhœOǹŒóù8_Œó¸&ÎuÄÆ6Îëã¼9ÎÃÚc‰ƒÃOÕs ¿âßçãšñܯ×jæxÃî)WòUÎ/kæýªöÚ•;óR»ð÷ÚS5ÇëV|rŸjbˆ—ã<ªŸ¸©?gü¶:â¿5ÎÛµçîg5±»š¿¯[Ì?kâ¾RG]áÿ~ÝÖ.Üojï¡0­[\ú(ìÄM-À…¯cº¶ŠW­Äª^Å¢ÝÊS[Íjôþ¬xtu‰µ½¨‰K?VXh•}u¯w~¦§—Ú±˜c×ÿYÝÖ‹—½¯Â}·öI®òŒ°5Óÿr7€)2£âè{Fž[a #ýLÝÝÌÑŸ“Uœ'¾q|°ÕŽ ïkë¾þ·ŽøÎ=wã«wér°Rßk9Û‰Ao:?i¥®à‰ßjO¸¦7úu©c½¾#®uÄóà½ÑÎç'uäzßþ?¯žoǯ®ÞÄ­¦¦Š§·—:jG¼¼»µ«Q8ÔåZ‘:O{o»º:o€Óù–XÅøý.5\,ÿø~Ë™I¬ôû\=9ÃzYM—£»ú{a¢GêÉŽ<ãu©½ÏÌGç;´íæ/çNxø®úµÕŽ›}H\yÒçd5è¸ÕÄ®îuüWó™y»š¼žŸ^þS·»zU=v½V}Øjâ<¨}âÅ«ÝUn¯=뾋 sßñéޕƼÑwåcW¯úKο«÷š¨_xšxÝGr»?¹#¬‡uœ9ý9±Ô ¿ƒÞk¾]u—9Ö·HW›Ï„c\jç›ïƒbŸ×íÜçLuoomçå­&–÷ò¬¾C®µ®K¼ÄGúvxâ$/äï_ªq«©qÖæ;MX®¹óÃ[÷y‹ÒÇž‡ïÌ.¸+ß›÷å †»4Õ}qìæ ]gj²úÆò]ßõ¼Û¿÷¢&§Ì§ztw«ùƒG;þ93äd޽GÌ£ÇùœœÍ™Ï ÒŽï åõ¤ØôGú¢ÓÚ{é~¸Ö‘“üöé=×FoTæÈ7JßâgýÝ꼆Kõ¸¹+½ï[õÜ7ž\q×ì0§šÑÔßù«þ¦e äXñï4¹‹÷YÑ\ÜwæI¾+\aJNƒ­æ”ŠU}ò:{œÚ/Þ“ô:eŸé»G»ËëH_úÎÉZžÔÄÖ³Zë²Õ¾o¤ù¥v|ß\ëv‡nuÜY^ßê­êÞ¼œ4£>¼ \a¹ÖÄPÃjŽòZÕå>÷Ú²]}ôìZ»/û•~OaPW7gÜ÷ýܽq¹oÈ›{Ÿx_ÀØjþÐiáóž¬æºzøž£~¼ïñÛÿ±ÒL=%w^þÛ߯ïL+Ͷ×Úí·¬Ùw;(¿¡ÈáÞv_³‹.u‹ o×"9 Ë÷®÷Ayñ²¿‘?kr_eÒéáU¹»Þç ¤n>CÝ÷ Îû#So…gß%þö—ºÍážÏÿsîtRN÷ïjç3Éø;V§³à;þZ·ót¦«0ºÞtu%5ÁCzÁã?ÇGUx^­XÛŠ%EŒQW×U\EÑF¼Â ¢x_¥YqEöÍ'ÿÿ#¬ 7è¨è¬:gÀz늌ŒŒÌ¬3OüÚÎóí¼ÐÎKí¼ÜΫí¼ÞÎÃvÞnç½v–v>lçãvµóE;_·óS;k;OÚù;ÞïØñ^Äyî»8ð>ÂŽI¼/qà9Ö†3žó#^rü &y~šë v|ià1È÷MqôŒ¸>‡1žò'ßäúvÌŸqæé:‹œ\¿O±ßÕi$Þú†±T?j£˜+Ž»ŠUå ̪†Â'ö˜ã¦.÷±c/8t!ëVaI“[œ¹óÆþ%Ç™/è çêþ½”{…'®â¨œßB%œì…Ô/k⾎cŒüD}ÈÁsòžÉø>+¤³÷µ°\o×Ç}7êÇiÂ;©óxãž­tUü¿Ðë›ÞÕ^ž¯´NÏS:I“ŠïŒæˆf_Ö®âÄþþó>zŠ3GßÄg-}†|‹:âÿ†~6*†4¥Õ’é9qãlöü?@ïrüGŸ+rÌú¤—”»ûÙ5õþÈ<9“È™wÄG¾KÏmϾ­òËWsŒ|fµuí}ÇK¿Y yIuþãç|sÝıâ—ýQõ³ïù;·Üe£ü‰ÿw;ÿbÿ«´æ®`œª>Aÿ–¸”‡zÖsq¿¦§Ò³ô«zJ±Fzÿƒzä,¬Þ³Ýàe#*¦6Gj±`Ç#Fö•ûJ5óü¨i5Ék´Ã6œk$hÞ-8p¼öêý ù}/»nŽ]íHÕE^VݳÞμ5«¼—œw°“ûµÞM}ÕÔÅçêŠÚ£ÄÍÚ;ïgytäÏÔ"wµeÞ®¡î(~#}øû¢òþkÏv­¾šâìx¹c¥/gwx¥GÕ[Þ÷ úùRiKœ ç÷†ó¬f°0«wÀŠ>ÿ‘®3lq­<æúÞ ÷Dö_ê<Ó¥z¦ßWþMîÒ%gbúâµöÂà=}Ïïf:Žf¡|~iî{žŽK/ wÁŽ)½4«VìXþÞ˜qMŽ^ïÇèó¾“xž¯zòRM/÷§æjzGqü-ÂýíºŒtÖ¾PÝ3÷jr'Fò¾ô^ºÆç9«äubúÂ}ÉÚKUrЯçïWµÈ:TûLXÄIÿÍð\Ÿìaó-£Z2FþvXqÖkc6o¤EÅ?{qæOÿ TÅñ\ïÒ,ÝpÖN1{®£{‹º©Wô1¼Ÿ=†÷Û(§k¼[i–µõ†úW9Tï½kc¥Ç2–÷ÃȬciN¨'sN,èç¨÷Wò­ê*ís‡HŸuä]qeŒ§8×Õ}ã{Dõ¬ÞéþžN¬*ïœÅ×ô—Þ¦©í+{|Áï.±6Ôyäÿ0ˆ]黡çøgånJ~z› Ïóv^ÂÌ™;{‡m8c‰ãˆŸpGºqN'ßUÙCéyÞß°ÿ‘Û¨O«}™~ÒïrjøÆœYë?qè›ñ*/ÍòYÑcûï‡Äà}êy­ÝOÄS½4ƒG5óùx×®÷;èsH fø¾C<Æ‚#÷8qt_~Õý çúè·´øem\[Ö'ÿW!ÜìŸY¹ÏFØêÕóóÙ=Ú›éåä,¥‡´È9ò-¹kor><Æ™{å‰Ì!ñÅÛõõņKó1²ß/Õ@ú¸ß¢Ÿãä-ÎâK,i‘óˆúÞ5w×öڞμƒ5¬rg é6Ârœê E¾ì9ç7Ó.sO¿z?°Ïª~ ö j¾Cs­ÚµÙÿ§ÞÞ7©»{š¹åœÅšÕ"c¨¶ŒQ½±þ±zEìx^•X]«]5œ‡bQ¬ŠŠXtSü b©biå TDÑ냯cÿÿ0Ãfس'+9UȃÞÉZ³f&9>ð[_­¯;}½Ò×ݾ^ïë;Þé냾î÷µõõi_Ÿ÷õU_ûú¦¯oûú¡¯g}]úú©¯ŸûzŽûUœ±?D½ÂšÕH¬ ;Îg8°X㬾?°c¾À¹Æ×°ãßÃ~ƬNb?FÝpÔš}¿‡óKÔ8¿âÜ»×—<~Œ‘â²Ö¯qÌëvNž >SçùYªû}|ëLñÁ3V¸ #¿Ä%¦ó‘õ~9&ù!/âã]ìx₵‹8Üÿ2}æl4kap¿æ2›qjÒgA¬ªÕC=Îp³6qÏÚž¢Æe­ £~ïì˜0j¼Â¼ÁŽ©Ó3š«keCÍ…49›±¹Ÿç¿;7éiiå…*·òÌäßû’ÆV3&þ,tFæâJ7îÕx™‹âbÃy¦î%b4ŒÚÈüw>‰3ó£ó·ÒëòÙ°?Þ)×0‰õ6æ^ð¼“_/˜ãe¿žkF/¸fÒcÂU_<_<Ýb­[jªºkgþãYbÔjÅwÅ“8’¦Vóüós\³:#ýÆsÒg/PãyÝŽëZÑ,x/÷GÔuÿŽ:£üÖ]áú!vz$g<˿˪ šé'}#nå_îuÏë[ÕÁó勼Ÿ7Ì羪‡šý×ýœó¯¼øósˆÇ}êÑ9ÐaÕ“Îa/+7캛éa6;žñæ÷¡ëB¸Ä‘®*ýóÛÌëäP}1Wsj8´ ¼ê™}ð~ºÆ™<äZ›q¶á\·ëlv6Œ³à¬7ÔÈ}Ü“z”>\«7߬—Ìb]óIÃÈr"<GV¹E-5œóuÃŽ¡¹e_UvÌæ£ž4ÿï°çèµþøÏÔ: þ†c^œûŠ3ùe¥}õ¨=·Ïwͼ…‡÷hb±&é‘^òÚª°¶ªÏä33"çsÁˆÛp®]˜žeÌÊ•_\k3Ÿ§g½’׆ƒ[ÏtõèuU÷¢÷¥¼–¸5¨ÖÀóuîËðœ~¬Þ,¬ÅsX^p$î†ÃWÙ[Îí/ì¸Äâ=K ÖÄÞô-ÿ^iS|zhöìc6;翪)5븳¬u¾kr´áà7÷ò{Ëoøwþwb(Òÿž]âßivžÊ¿Ó²·ÔUÕcÃÙß¾}ÍòEû’ge ß✽ÌôžØ™ƒìÓyO/Wû¹oU›4¾âJ]qæ5Rúÿ¶â‹ßè|Íó?HÊx^X[‹E¬‡ D¼Ä F‰˜!DQPEE2²ˆ/û"yraüÿÂ.æ+¦¦æœù6Ð’îê:UuNÏîcŸõåX¿5õçX/Çz5Ö2Öc=ë­±Þëñ>½œ{ŽõìWc}=ÖwXqþÀ믱þ문ÂÞ„O<Ç}~ÿÛ—ý_΃Î}#—ïÇú='òYp¼Cu>Æy­ÄÿµvžcMØj%ÆÏ8bP¯¬û¬ç?dž!NÄI çA¬ª¶ {ý¾Áƫ“ î§W‡# Ö¤=¯/ÿ&?[\Å“ºËÛ6qÓOr©ö=°½º‹Ùªê.º3k¹ÃÊýMlx©É„½ÖÌ‘ëýãX¿âÈUwdÏt˜žûÇžæñ”FäIœÌ’ÎQ'¯íìëc&ŸbŸKõI×ÌÒ‚ÍÇ—ïòƒ9QÍ™ïGjØÕ®ìÞâxo•µÄ÷^χ{ùÿü?áføìòþeÈ[þWz)Ûé]öß„:gš,è=𜠯šYÂQ¿IÇûG§÷u¥A••GØæcfƒº&&q²Fϱüö^Ì>öìƒÄȾԛqV×™Êÿ„½^¬í[ìs_q^°ê晩zI¸âK|bw˜äêž’'ñˆ¡¼y™….[Ù®Q—}ö•°„ãózF­wæ)}õ¼:WâW3;ñãGØ¿aÂð\äyiF^>Ÿœ ýÒœ­j”æÜŸ¾džÏ²ìÙà}™¹*×9_\cùvm¾{™÷ìͬ™ß˜¼‡˜Âp}ÅCþVuê¾*?]=9 &ìkP^:Ÿ\×dŠãoÏuÙõœœõ·óIïÈIÊX•yî½Ãžïwîy¯¿Õ®…ëš3PýSyå¸Wÿá˜õª—„'ßÓ§[ì¿;ï«,{ß3[Òá'g·ß{ƒZ›ô›½ä}4¡ö]÷*K3úž­îâ{«¹xvŸßUÝsv±©<¡^Âɬæ¼to«YRå„/Xÿ#{1qò<ï÷lQŸk3ôš.ÔÁû?¹s—dzž©üQÞ+m=ÝÌaþßDZ§žaï¡øû[ç8Ù?6Îä«ù_õçr9Ç3žuî}qÙ?Ûþª§¤ò­9œ\Tø¸†3Žó'õRïhF(ÊyÕ›òØý­´r­5gù½^ñ;ÓA$v5CªÜ÷_ì6Î|v?oŸœ»™¸ ×C3é 6LŸîY÷í–Zø›Zeáì J©A¾ÌÏgoT<ÜŸ‘ÊOÎ\ÇÊzôf¨&ùëÞvu˽;Óáû³™…k߀¬-1}6yf‡ò™çÒ_Ÿa䙙ߤŽó[Zë;fFŸQ¯õö?ÏIsiÆó Žïypozâûô{yZqÎó9£\ b<Æã™â™¬Ïç…zCµ)S®—sðLu³Í1YK÷†.ؾù*…ÏßY¥â©yYÍ6Ïó&¾rSiŸssÆÑ bÍeäæ²Áùœ¸ö]èuWœ²Öì¿«ëßü½œò£zøw÷JXä&^é¯sxýŒæÔ¾û9Õësý”bùï63ƒ÷ñtÁ>'Ê6qªsÚ6×¶ãÒeWµª7ò›•wpþå»@ŸýnV ÷¾Þ,8òžpœOÉQzߢ於X³óéð¬5 Ëq2wgù_°Ïšôò™¤ɉ8Ô(}u^ô#ëìæ\õ]”x™™ÊWÏò<ã|V “^úŒºö­#]Ïî`)—šù¾å¼ ~5O‰ç8¸ö-Džôê7Ô™v;}W¶»o©µÍ^ì²~­oÔxùLØøêgˆ.óäJLb¹çòB¼ªógœô}×Íg×2q3ŸÿuøHx^•XÛª$EŒYQ\=®â*Šö.ÞDï2(DV΋ì›Xëÿ„ô•Õ3ÔËLWdfddTõÜðR_/÷õJ_÷ûz­¯7úZúú°¯ûú´¯Ïúú¢¯Ÿú:õõk_w}5ì1´ÿa_ïôõ6,b|Õ×רp~ÁŠõG_÷°âƒû߯ŠñÖ<ÿKÛË}¿÷6¬ûgõ(—°åCÜ'Xóú+þscŒÛ¾~Çë¬ñ^Ä3ySΟ`Åý+îÏënX1˜³j^°ñOÎ~ÀXw;ïá÷üîÙù»kû¡Ú½¯Ê‹µ¶¾žc«5qo0Ç–n£Â§^…ý6lñê<¨/ cŽêû‚-'åây0õ1y»T—ô<ëï‘>‰Ï~ ?±Xÿ æ+±\ƒÂd¯«>(?×ßûØ×<Ó‰tËYs-,¨ýÃçW9SêŸý¾x^ÏV=sݨ–ìß‘&«WéKÄMžˆÍ¼¥‡æš'vUC¥;×ñ©9q3ÓÜ_˜ÇÉ~U¼¤âzÞ°â-Øëϱ¸_¹ÌêUÿ3vò–œy-ÙâUçŽ|”xþ<}[üúsŒí1åK©íä*ù_ÒjêjÁÈ¡bÐs*»Ã¼ßÊ÷Mlñë1ÆÙƨãj½6Ÿ×—×Xõ$5}m,“/¾\?ÄhØë•ûróQ3.?Î+1^ÅÜó2¾¼¥¡îKö=ùI¬[ìç!5¹ ÆIæL-ç=ò/7Gš:š¹K}•ß>Å6'Â~û3í6l÷¿ögC•ç̳Õ{ú“Ï×·X±+omØß‹2žß;ýzõlûùèw‰j®Æys‘'õ>qå”®…ãs‘Úó™PíòֺȜÈ÷Ì›'9V~ê§ßë=†÷Õ=³aìçy6Cª4ç½!¬Ýý@¾¢¹'ëšÍ¯4Âø|G©z(,ê1kfåQĬðÄ»z[áU³”Z¾ÔÛÔsöØã‘Ó£óµ¤G&Çî‘ï¦vN˜çOî3cÜ`CX0Æ þ7XgÞßñ² ›ßwÁºŸÜrîK^='×CrI½eÝÂLŒäNÚn˜÷S±Ý=~r¤Õ¨^[êÃëÐ>Ïkv>T:Йày#Lù¤z˜ZpÎ<·–¸rMã£Ïª^qÃç…ýd.Ú—=L­æfæžOžîÂ|Œ±ŸÂo'ŒýxŽ:wå]½{1fêçèP-œ™Œ“gpžíªC^WáWçLÖ1Ó˜û„ótmîägÁžæKœÔׯžV<ä3yþdÞ'•~f±ò¼É˜©)Þ³|.«y?ŠÏ¸ù.Ï>ïÞbU8Þ[Ý¥ìýÃó­ôãý­f-ýnÁ¾—z N|¯áö¹ ;¹Hì#ÌJGÙËÊ[Oã´¾þÅvV ?'+]æýèÿä]qN|å™zöŸ}<û˜ÚÎ|Oqj_Y°â¸Ï27ßß0æâÿÛ/ØÎ„ô¡*z6?™ËìÎzNöÚ—GÜ`ß“jÜÄcUƒû´÷Þµ¯ó–yñyÿƒ¿ËW¶{„úðèüŒòºF×âÿ¥p‰•>¢ºŽtw¤çÙ» qÅÕ¥ÿª…ï½Ñ;_ziÕóĽņ›9WÊ^ËOůråü=ëëoŒþO|ÍŸc&îÍö1'¿W«¶äJ{Èýì÷KäïÓ FNg^áÏÚ«9]0rá¾\Å þƬAç‰â¸ïÏ´@¼ì?óPlaüd<×ãL‹•vŽþÇsþÄz©gô{zòÌ×ï-×u£ßþAGix^•XÛª$EŒQ/«+^P´ÿÿVÐ'è¨è¬žõ@½ìLGFFDf×Î àÙ~žïçÅ~^éça?ïõóa?÷óU??õ³ôók?ôó‚}ÿµ~Þìçí~š=÷Y?_c{ö—ûgëçwlk?wý<‡­¾c>ÀÆãõ~Þ†ý.6^ c qóÂWoŽM\áµ~>†õ)6<öûM?ߢÆvþÄbïäèüç{Œ8ÄX±ý¹ö/aïýUìš÷}l¸7{ÿ[êÌZ?¢æ|‹óŸý\0jã>²Ÿ70ÖnØk~‚]'¯í=VÈcÕò•§ÄVOÂþǾTãÔ9Ê 5ë¸~¬õj Y#ó$ÿ]'æÉ{¨°Èû1v}œoÃÈQü„ã}gÏÌŽ|œyHÿ¾CÍ‹XÌ¡çÚg/ý‘/|žœÜëô!±ÆÙSŸ³¹SÏ>+ê•Ø {‰#Œ¿0êæX®=ù°ÇYÔk•çÌBú˜û@˜Â#ï#¿Ë略™mñ÷ÝüÿŦup-‰¥ WÏóΟã÷ÝK=“û€Ï/kð;ꋟ]î?ÏÙr_f»B9äìºWê“ûnņëÞH#q Ì„ô—ŸžY>çžr>¯g{Pz»†•æž9b¤ÿÕ»Â3$m´C+nÕwÿ¬÷™÷Ü·âã<þƨ?ñrO6ÔÞó 3³àØäªû@ÃŽ«^+×k–Ͼzfî+¬ÜÅ™7qÓ,Îò±¢Þ7Õ;ÕïO§[œóâÌ óŒï åÎç-kð^FlbªÇ¼ÇúœV™Õ<87åŒYÓ}Wª)ÏÉ™rUë1ê9aÝœ;eS¾_ËÑì=¬™¦Æ £>3]üÎëy?ÃÏ!ïÈ{ö^UÎìõn:«‘Ù¨æÁ¿+ ù=ïOõr7h^fÚ c¦MúÉ|h¿(Úƒ jìÿ“íiÕàž•þªã54?¦<$OÞ+ž™‘äI r9®Ï¦óºÅ†í¸ÂÌ=¤œU;B:ò^e®Ôól&ÜìQ|ô¼?ÙŸi3»sH#zÉÞÎæ_Z­8Ö¹VÃw8=>›Õ§ñººóWýTw~ß9ü“_Äæ»[8ÄÆä‘ï–¼/¨Oé˜u³7aé½7Ãòì.8â宿ôƒ˜¼H¿+kűOùš:çpž ŽWŒ÷˜œ‰†ãÜWwpúÈÜÌt§ÿ`××3ãü³Fr_×@ÿ”nÚw¾ç˜é­wÞ‚c†ù®y×gÓ5öL'_×ø»‡93һᨵgV¸·ç½ÂoÏñ¤QrM<Çšqs²_Ï<5¥®i¥§ru-¯Ú?ÄnØ|È;?§&¬ÉÕÌò{ëýwù=ÞåÔë Fý.·à˜ñ㌦™!bÏ2ã{Ð1…÷çù$ßîŠ];b$'Ï´ßS|®}¹`ôÆu³ZªQéKì'3åóZéK窱j–ª:ž¯ Sœ…“y;óKÙª¼ò]’¸®ÁŠZ[Õà| ÷ŒØ|·xŽée¥Á-Æ>ª 7ìóäºV¼søžÒï©ïì}%éê;.1Ô¯g—xÎ+{%®ö0qf<ø¬?C.ô6=õÍ:zïó;ÒMØü\=©ŸÌ†ô•Ìëósÿwþñ³ô-5’ožáÙî‘gÕÎÉ9›ÍÅ,»>Ã×~S­öÅ#{`Í ¶½QÕ<ÓÅñåå}5ã©MÃq×}‰ã{hÁÈ]w%eÌy ÛçpÎÊÝ‚óŒ³ó½Áˆëï€jr†*_u‡ö»ˆï£®÷L>Þ›êy/ {^ÈY;ÎsÈç2×<Ó{£â¹bŽ×0bGwåÛóÙCÅÁ÷ÄŠ:Óž¿ Ãû¨îÈÕÜ'7Ï^Ãùl Áèiþ6›5òÿ™ñ™â/LâñX݃ŗ;PzxVˆ%^ò$yx;Ô>U»®áè¹é7DßYkÅõ:®çHáx^XM‹dEŒÃ¢(®.*~àW±¨«  .²*« Šƒxñ"Þjýÿ? Þ/^¼Ìn±¡.=U‘™‘QÕ3|ºÖgk}¾Ök}¹Ö·ký°Öóµ~Zëf­_Öúu­ßÖú}­?Öšk½Xë=l8<ÿ ¶ó<ÇýÚ÷`­—Öze­×Öz¸Ök½µÖ;k½¿Ö‡k}¼ÖÀ†Çœ˜sÉ<<a¿Œ ÿUcûløGlqý{ ñ$¾ð˜'qT/ž{zF9Mì90¾øñÜÀ1nòòàYžó3ÜÏœnqä¨ïb¯¡÷ô+l=ùn­g8sõ¾zUÕ+5PkHqY§kñþÁ9c‰ ñˆÅü;ï¿×…Úìr}‚-ϯ±á{/=?j<ëÝéõ¿rîê)¾Ì«Âîùýÿá,ž7¨óâçÒ,¹ÖÆZq½ÿœ“Š‹ô,NŠ+.oc¯OÖ:ã)VåŒ3q®U5/î]^Õ!gmà8תïÏèyNÔ5~[^Öz{/G1¨×äx ·Ó«k¢òÁÌ?cTó0°×#µ@tý¹TÆ`=ÜG•{jøº·Øƒý™Ø9Ë~ÿ ì¾)-Ü`Ïó»G«Wâ¯Þ+Öƒû½®»jŽºº)~ò¸V/å–>ðçò>ö&ûâ3I<ÍJΚחòÎ\È—óì=¬4Rå0±ßI©çZˉÓÕL¹ l8ž‡ŸU|çäýË{@^ªp:-¸Æ‰Õ½Q&Îw@by­Õoާݼ—ZŸèõÕÅ!~7çÇ^v8âî9Wxâϼ\[:ÃwOž«ÞŽ·äEÌĪôYùÊ'8×èÚ;áOëO¤N8×Ǿ‹\S#}ÿä]îļ6“^wÕ¯ÂÏ løÄ“§¹.º^(ÏjFÈŸyÊÇò»æü0ްsV*/QnžKjžû:>|ËhF;>ûÂWÍÓû9OÄOÝ9ÞÄYÃ>SÊ1¹fm©[åÓÝwÌAÜtžg'¶÷v¥)iÓ½0u$ ž×œpŸ¾S˜Gz¶|±ª7kí¹øoKá¨Æ>7™ßÄyf¼Þ•6Ò «ü\ÓÂ’4sÜ/=æŒ*nõ>t©8ÝâøV¾Þ³Î‹ø©÷JGœ8ö-uMœ<ϳÇ:û|ä½í\5Ž©Ys~ész§§Ï‹£ÿƼÁyfœk…Ï·“sÏ>]škiWµâ÷óþ»Ô3c%y`—sê9sÏzìõy‚³çuw¢k‚Ÿ.¦îþÏgàÜ ÅªbLÔ¾Mõ{‚{ó`Ü#<âÈs<ÏAû²vêyöÛùÐoèÇ]ÝÔ«äTý_'çËãùýZÅa zÿŽsËŽ­¤®¤S¯9Ï œ»T³”ÚÈzòýtIYWÝ—øNôþä^'m;–ëZš«zC¼³Ž+̬…p]Sw⊳k)ïiš˜î«îŽë:çYžI>ԯϿk‚zú»¦^`ï«{£ô•o*qrÌäÐÍDu “9gÿž'1å®~Ï8Òbâû¬eO»¼½öŽÅß1”Kj-ùÒ£‰UéÌç€ZSNé%žWzqnq¬“û1¼.Ò|çwžOõÆæÀ1/ÝEù[â9Îqòήâ0FÎlzh5_ŽÍ=šaש<5gI˜]=*÷ÅKþCÆS,Ÿ§ã\ʪ:$NÅ=ýFy—ó÷=ν#¶ëMÞMA¼kZun®ÑŠqŸáì?Y¯ÄëüÌûziÆÅÙõý6Ïe☃4ªzòïôqî!oâqOõÛÀ}°ò.j7¹UõJ¿öóZW9“¿úÜÕÑï±ê­8qö^y·ógÎê…ç[õ–¹ð­›ïŒÞ",iO¹To˜ô¯gêdbŸ)öEç”÷3v5CŠ+šžífè5ŸKâ:áºÞ½ÎMæ8°c¯«¹×›œ•Û#g³Ò•׽ŸØq¯4¤>¹Gkÿ¿ŠÙIkx^¥YYËE¬‡ D<âŠÎƒ¨Ä‹E1ˆyß>\óÿ„SlŠ©©íÙD |3ÕÕÕÕ=³_nx®¯çûz©¯Wûz£¯·úz§¯Ö×û}}Ü×§}}ß×Ö×}ýÔ×Ï}ýÚ׎ñ&Žó­¯Ïûºã÷k/cr±?ÄÀ×ÞPÇà^îûæñ¾íñßÜóL_·1çò:.oãÈç]œc^åDÌgqàJ'â*?b}€÷ æÓâ9×J{Ç'65ý¢¯/ûú‡f®GÆ}ˆ#ö-ÌñûñYשahus~Œíq3æ ÎùɉÿŽœˆ¹ÊãÔ9d ×M¼‰/Ý*®;/ß—±®rQP“ïŸß0â𬼘µ%?¯í“´M.Ä\ÕËý-Œ˜ýè:®ü§}‹ÑËÞo/`ðy ×8Î+k,^~Nõ`ƒ?ã¿q¯j”š¤\cÕ(}PyJ¹(ÇIm…“þ¼ƒy5œ5aͯ¼ïz{ŽY{×Xâ<ÝpöÒŽë~ª<Ë÷pà†1*þUŒÔv…ý¹;nòÆê,yù=&nª{•ëÊGì1{³¡®W…ë}Á|…›9®<¹c>'/3&÷¯tfLî—~™}§z„ó,¡çy·¸–9˜¿ß-ªý•§\ç[žò¼rîñ\y…ÜfMRÃÌÍçîí¼æÙÃü˜S…­zz?Èo¹Ÿ¹ÿ…#žÓÏéI|è¹UÍw¬óæ{¨ñ6 ¬Ä^ÚŸ~õúòûÜkÄó«s;Ö³ÆgYÅŸ|øžªp¥ ±äiùM>æ½íµÒràþ+îÒÊù^ÕP÷qâè¾ðج97Œ³ô"Ïr?ãj.¹çäKù)=¤·À†#þßw_úF¹4Ìš©ßÔÊãó¬É¹ÉóÙä›^[½CTsõ¥c‰ƒk(<åîµ®|r õ¼‘¬GUã†Ù“Î/gµâîñÒCîÇ%–Þ@Îü+î•/æz<'ÅÓ5q,åÌ» sU§¾ê±ô¨úºÒÍç…óѼqí4/ȼܳj87bÊëÕ7Žæù•îÎI½Cîcä¶áÌ%uò»ëiüWyoùOG|sF¯ê1ž«j¹âçõUWl˜sO¥!õ×ë^C÷nÃܯé£ä”|æ|‰Ãš_åê3@;kŸÞQ<£šòŒræÏ®x®úR|”gúC:;ŸJÛJ+Çq/{ç¬jΤîò-﵊ߎ™“¿”›0òì*7rÑüÈ\Ò?Ù“Ù+ò³÷‹0ùîQNÉé!/ïAjÔ0§÷òþôûˆ|«oæÌ_˜Ì¿ºC„WaùÙqæ,üêwÚÂwΫï×YØž?Ïðç•nÉAuU\ÎIÿ½*GÖ†ø`Ô'=çºûÛzùÅ'59ñ¬úg²n/ãü^¯ª·\GaKÃqÞ½éû¥«ëɸzï7Œø|s¬<žs,1óåù\aU}’ïÀ|«m8cq–‘ñ4Voaaé;fÃ<Ãv ,÷â¿T»GÒx^•YëŠ^E¬bP4†D¼‘1x1ˆF¢Q!¾€0æýÂ)NŠ©¯NÏùvó'{¦¦ººº{f÷€÷Çúp¬Æjc}:Ögc}>Ö—c}=Ö·c}7ÖÓ±~kë·±~ëϱÞëͱÞëþXïŒõ;îc\bó+ì˜Äû;æ/ØqÅŽMÜ>Öë˜øÂm¸äù&.y>ÃäI¦OÄQ9ñ:uopsö±Š;ó¶ªìgÕ9ÄOOùl«0;Ö¼ÅÙuIÌÔ:{Öj^Tš‹óŠ+q+5My-eÜ/qî‡6Ö'8êÉysÖcÿÂŒ?5%~åÎv÷yóy!ÏèXç=a•·³º«rÕ°ï_í;ããçk¯ö¨?æÎÏ«cHïm«Ù/NŠ%±¨ñVµæ¾àþ‡˜ºVùSMS…ױςì“ĽÖײÖ75$ߪç<Áí¼ ýÈUu!×Î{cbt¬çjÖ˜û+ïDêÙ˜«^ LbU÷«ŽºO)× “Ÿ|—¼¤×ß8⹯³¯VžT®]ל7GÎÄô7HbIÏÄXq¬ü“¹—®AÇÑ7 —ž¾V»7˜XUÍxÍ™}­7wã¾MÌ^/ꕟœwuÆ~öÈŽ¯¾å7vM®a罂~ZÍki’9ÓþJOíá÷º»J›•&™ËœãÒƒwÍ»æ‘8zÃQ é@ß1†ê.L¬JËœÓÊϪ¿Ó³ši³÷­bm8zKyJŽ:ãlf[±¿ºWñŒŠ¿ë©Úõ^àïð†KLŸ{·yǺ¾ÂK?ò;þSœ®Îæ}ÉûˆûÎÏ“NÚO¼GÇ}‘ÜS›JwŸg®u5+Ò#é_¿¿ý }¼¿ÊCù|ú¹?äkqõn8æïÖÞ~€º¥Ç¥1q+Mý÷jg^öš©Þº™GÕ¨ê'ÏU.‡çtu~žÍþZå‹gþƒ9y®ÿþ„¸>·*îgÕfÞÉï¬WUž^Uã^kìËŒñ9α…ù;nú¹¿•ôÐs+Ï­pr(&æÏ}s¦¿ã{Mù› }B¾©QÇ%Gy aßG>ºå?W¹J]¥‘ûP8Þ{„'¼?Vw«ª—¹.ê ÂRy¯!¯3_vÌÝéù†éæ°ÂR¬þ§æoõ¦“?å¬ë*þ*?~ŸLßÿˆ/s”^Î;zæÉ=@þwy+ûy<‹½ø¶½Ðs{í?cõÞw<¯Í ÓË}¬ÿpÔÉs+îù÷å‚g$¶s~U+ŽïØÔÅýãµ,ŸËËÜ+ =ÞJ?ÕXú,,¬Õ,¿AóŒÏýKýæ×î ë÷ÿªîä'Ÿ3įúqÇì7Ä[½©•‡UÏ!×ä§ø+s”Xë“::?r[å;{AæÝ{uñwU<³Þ3nÍë³{œßVø^ãâÛpìÄòø‰Avìû¹WóŸß¬òO®íÕwÒ`•+Åÿ;†Ç/=Å/{DÆÙqì›ÄIÝxß –úñ*çÂ\y²Ê ñü ´áˆ—õ'Œ*¦UÝæß¼5×™O×û)ÎcKlÕHÖ…z熃4ÿäÓäá³Oûÿô*EÌx^Y˪%EŒÅ (>†Q| h >ÁQtðI£8ˆ›q!îÖüÿOXAß £¢³úz¡63U‘‘‘‘YuÎÙü:Öocý>ÖŸcõ±^륱^ë±Þëý±>«õñX_ŒõõXßõ3Ö8/Žõ2v¬×±ã½5ÖÛ8pvÌOÆút¬Ï±ã5Ö“±~ÀcÃã_ÌqÄYqòŒöÏ;˜óP îåžGØ1œyùÞín?±o˜y(çW±ÎûØÊ›93Æ·c}#Nê«^Ÿ†³ŽÄR^<Û1×WܪzCú$qp žý{|ÅþëÌÙSiý&ŽÜ²o”›{VØOqøH¤®4_ùç›çý÷ßîöVõV¯2¶´äÙªÏ`­Cú†üǹ?ÃQ[ïŸk ;óaU³R:T¾ó¼Tky.½¦äù¨7½~®£ö†r¸êsam8óèø÷]Ñ›øqÖ¯p+®Þ£ÎµÒ,½œøµÇˆ[Í“ªç;vŸ§âx¥«÷3ù>ÆÜ æX`'Mr~ð¯òºÏÇH+ÝÕœ¼ªg›rl˜ûqUWæ°ÒÞñªù$ªO½¿’sÇ1‡Ý—š^¯õ}¾Þgª{õþvÃÙónÇŽC Õƒ{TÛŒ#¹fO9­ü¤â~QŸúíÿ—ô:ß2äá=ã1=ÇÔÊgzÃÌŸõH=Ü—Î_XUïº]sùa¥ÏTý í²ÇÉã¾¾î8c‘KÃŽ‘~¬øxºãæ>¯z'{^˜émרï‹ÊsŒ¥ðö8UÝV3ŠX¬ùªö®{ðι»W=(_¸©kÎ(ñÌ9.m+ŸK¿ä¥>I¿ç3Ìw×Ê/É­ÊU9ÞwÞµ{ óg¿üÌ+^fj¦™ë9çŒbÎÙ›Éó†õìó¼«ÙQé)?¥ïŸâìýÊWò@ÖÎñ™Ïênb>3~5ˉKÞ†¸ªÈWwÏës 1ª¹Çóg]•_ÖH=¢óõl¨j" ŸÅÞsÊ+ý“3§ª³æLö°p*^ ³GVžö7CΨ÷p®ýÕ[ŸXÒyf~ù=IæÊ~‡¬¼% é‹«úä›´¡žW}ÙQkäÞó>Tý=Ö­zSÿŠòf yk¥8Wx gŸÊšf¼Žº²† ³‰M¾üÎD÷䆚·{&uH ªºç/ß®ü×pàéþѬLN<Ÿ^UžÕÝEv¹¸^ÙÛy)öŠ71r&KÄPŸÇÊWÌCZj¾äáµIOUŸ©“—ÞH©“ú7}•x>_³·è­œýηòíʳþ^J-³WSƒä*Lïý 3žpbæäÚ=ÁY7õåjn¬¾‡P?J·ÕÛXün8÷dúQuj˜ç ü˜˜ëyêù§Ÿuï{ ¹·ªs“—7Ì}ùó}ËÏŽ%×ÙŽ¹î•ßýî¯æBΔ*Ÿô8s¹Âq-f=T[žÑþ8êɘò+crö±•¯×‡^ªú¤c~£Ñ‹>¯\›û|¬3òƒ´¨ætú“=Ù0×&g…ôÌœ…µê'¯5uð;ÍkÃý®ÿç+3ÿ>1ßî³ÊçÎuS½\ÃÜGÄ÷ºêß+~ÒåjNWoVÅtß*Ï|oJß«y‡x_^}Çâ½¹z?éÎì8pé'÷ßቛ˜Ž§Þ«îªÖÉ[sM¿=m8ß Ä¶ê“ïqÍÚˆ'ÿ<÷GØ9:ëRq †sXݹä¡§žNœŽú· é•o)饯ðt>ùh?÷Þpíû|ó4œëUé›ý–ø~¯úïWÉ•1¼O7œg™pÿVÂH²x^íWËŠÃ(Êú@ÅŠ6âDQPViñ²= ­ÿÿfPTLtuÏ®ç*ÈÓNFEFFfõEÄŒÛw3îg<È2g<Íx‘ñ:ã]ƧŒÏcÆ—Œ¯ß2v?2¦Œ‹Gw¢bëI¼gÏ£`y'sîùŒ Qò¯I.~‡;ðüýÒür×»†9GïC /£Üù& Þû5ÿ¹(<®FÁ¢jAÎÐàûü{ðaÍ—ç¼ëQ¹)'êù6Ú¦¨x¬‘˜ÀÛªš²WÀÿñ1Ú÷°VjM|úà^,y˜Ž\;Õ„ØÎ›˜è¼ÕÂV®ÀU]\jAoQb:žúXÊO}ïüÈMy!yÈá}øôð{Ô³Èá]ô%°͹®¥ûK9Ó®¡öGkEŽz÷£ÆãXbx”“ú¥µ;ˆ»¶;”ŸckÝ3[½¥WtGP+ç¨ûáU¬ûܽ£±«´z‡Î'xs&ÝGÞoö‰<™O O½¥{âVT¢æs¶¼¬š‡þÔ|Þ>ª.Sl÷Žº¨Ô|ÞÇRo÷D«—Cì룘|¯Æ¨˜?£j žì™úŠú¶üäs¬Ôà3ÈÞþ‰~úé§Ÿ~úé§Ÿ~úé§Ÿ~¶Î?"ÔÄ5x^-Ùux×Õð/-u ñZצ‘.5ºCr°*Œ5BéÁ®Ähé )Á!0ÆE¤¥J+péæ:á~|ÿøü·óœó}Ïû¾çý= ‚ ÈI^> ]ÄÖ²ƒ®’&M¼IYšA1Ìfû¹ÀSr¦ ‚7(FušÒýo#™Ç"¾c;§yD®tAŸâÔ¤íˆf< ,c3‰ìåwÉ’>^§ •hF;¢™Äb¶qŒ¤Ë¯òe¨K8]ÁD¾`%»9Á9®ñ€lƒàŠR™0:Íx¾d5[8À‘J¶LAð¨H#:ò1ý‰á æ°–üÈ“ñ1æ_” 5hN7†Ï×$‘Â2e‚×(HyšÑ1Lã+²Š-ìãOÉE¼ÈO9êÓžÄ2›U$sš›¤ÏoB}:3„ Ìa ;ÙÃynóÜÙ‚ !Ôå#zòoæ°žÿp„;¤Ë9x—²Ô¢‘ e,sÙÀ.Žs—4ÿ‚RŒJ´¢ #ù’ù¬çGR¸K†ö¡2-éÁP¦±„mâ2ɤÐÞ¥ gc˜Ã:~âWî’%W¼LQªÑ’Hbˆg%«Hä'Nq'dÎo‘—âÔ¤1]Ì&±„Ds•Çü4/Ú›‚T¡!ù”©Lg›8Ä5ž“3O¦<µiM/b˜Íjör+<á/É*ЈVô!–ñ,`)_³™Ÿ¸ÂS²ÿÓ7RšÆtc8ñ,à;~äîòœo oSš4'’¡Ä³Š#…³Ü!c~9E)êÒÁLa [9Âî’¡@¼H~ÊS“vô#†Ö±—³Ü$cA½—‚T¤1]NËÙÈn~à8×xNžBÎF]ÚIâH` ?r’›<#Oa¹AeêÓ–HFÏ26³‹“\å99Šˆ!©N+º2˜q|Åjvs’‹ÜàYß7_BcÂèD41Œg ›ÙÇ9J΢AÊÔ¦9]éI,ÓYF"ÉâÉU,ŠJsº0œV“Ä R¸EPÜý‘ЖNŒdsù†]á"÷ÉTÂlHaªÐ–hb™Éb¶‘D HWR~QˆJÔ¢3€ñÌg+G8Í]Ò– ‚w(KujÒ€OÂçÌa Iå*7Iå¥ÒòªÒ„Žôfø’Mä$¿ó'¹Êˆ!4¤éËh¾d9›9Èï¤++ï(DijÒŠn a:sYÁöq‰T2–Só£ MéÆgÄ1Ÿíœàµ¼5¼MA*Ò˜ôd8ñ¬&™SÜ%/S˜PZA±|Åb9ÄE‚9ŸÒÔ£#ƒÉt–ó=‡ù'd±%©KQ bÊR›D2”É,%‘C\åÒ×ÕyŸPÚÑQÌd-{Há6÷ÉTO\y—bÔ -ô#ŽV‘Èa®‘®¾u¼G)êÑœOÆ4¾!™ã¤pì |ÕhIÝÁ4–±ƒÃ\âiêK”¦2Mø˜Œå+V“ÌQÎsGähä ¡!]ÂD¾bkIæWî‘­±3R‘&t¢/ã˜Å&r™<%GµGêFú3™¥lã÷ÈÚÔ»GiÒœp1•Ùlbû¹À=²}(—©F{¢H³XÏ6ŽqžÇ¤mfÞ¤µøöôe‹ÙÎ1n“©¹÷м”£& #’^Œb*óYÊ’9ÉMÒ´0ŸQ˜PZÑ…^ôe4ñ¬d;Gù§älioªÐ˜öô`“ù’lã(ÿåOr´’“¼I *S—ôcñ¬`ǸNÐZ­S€2„ÒˆÎôf,sYÇnRø/iÂà5ŠP–tg8ñ,c;ǹJš6òŸ×)F%šÒ‰>Ä0ƒ•$r ülmÕ6ŨI½Â4f³‘8Çž‘;\,)C}ÚÓ‹âYA2G¹Æs^ŒðVR‹D1Žy¬e§¹Ácr¶3Bu>¤+C™ÂbÙÇY‘»½xBmÂèÉh¦³‚uüÀIns‡LìG~ÊÒ€pú3%l`+G9Ï2ttǼCYêÉ@&2“eì`7g¸Oú¬¡E©I¢Å<¶r‚[düØýR’:´¦ØÎJ’Há>é?q.JR“p¢™ÀÖ³—3Ü"m'uEQjÓŽ.ô$–é¬á'Îs‘ ³=(LyêÑÞLd‰ì`?sƒ‡d‹ôŽQ‚J´¡?1|A_³“\ã.é»ÈW P…†tfSXÎŽsT²tõ÷T¦)øŒQÄ‘Àrvr€Kös…´ÑÎÉ˼A~ÊS›6D1‚6’ÄI~ãA{óåhJgF25ìdçxHúrž|„Иpz2”ÉÌe[8ÄnòœìíGUhM3™,b+ǸÊ3² ²Ž’„F{úÇ<¶qˆóÜ'í§bó·"Ô Q b,sÙÀ^Îr‹à3ç$Å©M8]‰e+ÙÅI.’JžÁî‘J´¤Ÿ3›•ìà87I?D¥•©EÑÄ2‹MüÄ%n’q¨ØS”j|DoÆ0Ålá(×È4L_§Òƒa$°‚dÎrƒ`¸óSˆˆb$3YO'¸IúfÊPžÆD0€±Ìa#G¸Aº‘æŠRƒ0z2–9¬'™#üN*¹bôsŠQ‡Žôg4 ¬"‰œåÙFéå„ЄÎô!Ž…,e;Ç9Ï}²ŽöÛ€âT¥9]èOóYÅ~åébÅ‹w(O#ZÉP&3ƒÕlãçyHú‹E¨DcÚÍXf±ŠíìåIÞ—Ô"‚®Œd&sYÍ·ìç É!”V|DƲˆDŽqƒ§d‹×Ó)E(-éÂ`Æ0‹õ$s‚ëüIºér‘w¡QŒfë8Â%þTD0x^íÕûwÏuÀñ÷œb«TB÷ë!GI™ 5§Ô1gèµQÇåÔ\Ž24§'vBÑ1´²¡\›fÌ=ÙÜbŽ\ʽ¹¤ •R-JêñCÿDç|žç<~üœïù¾ß¯Ïëóׇ!ÔBcÚ‘ÊÆ‘Í"J8À ª¸Äµ9!4à1ºò2CÎT øœÍ§Š¿‰É ázî£5]èÃf°œ Nð3WÍ¡My‚gI#L²˜Å<Ö±‰#ü@™!ÜJcéJ_†3‘¼N YÏ.r¸¹!Ô§ OÒ‰^ cù¬ Œ}œåOêÌó;cg¨Qd—Ñ'™Ä¦’Ïj*ØÍqª‰[ê^iEºó™d1—%”ó5UüÅMËì'éÆ@2É¥˜-ìå;.Sì>¸‡x’éA:o3“U|A%¿Rk¹¹¡%y‘Œa2sYË.*ùØ!ÜÉ£´§'CGKYÅvös’jbW†p-èHéŒa Yɾâ{®Z垈§=½È(²™O1[8Ä9γ:„Ûx˜ŽôeSYÀr¶QI5±kìhâiO/óïËÊØÉ).Ps­=AsÚОçÂ[Le‹)a3ßð#1Ÿy–ûiEgz3‘LaÅlà+ÎPc¹ç¥/ñ&ÓX@!å|I%¿Pãsï9 I ™>d0‰\Š)ãç¨UbvIà)º0€‘¼Ë,f³–=Tq…:ëí!ÚÒ•> &“l>¡”}œæêlp4'‰çèÏÆ‘E¬£‚cœ¢ŠPê»É4â1ž%ÑL&elfßs…ú MI¢+ýË|J){8Èi.S»Ìs´¤3i åm²)`;¨äWâÊ) $Ó“t2ÏG,a9ÇOÔÜäMSÚ’B:ãɧRvs–ˆÛì¿Ñ˜DRÊ;Ìd>+ˆŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠúö/÷`x^íÁA 0±{£s^°Ž%m_µð±¿töx^]ÙÓ†Ð4v[m›mÛ¶m7¶mÛ¶mÛvîdîK»ÎËÞëöœX>Àÿ/p€þå_þëø'þ‚¿âoø;~ƒßâwø=þ€?âOø3¾ƒïâ{ø>~€âGø1~‚Ÿâgø9~_âWø5Þƒ÷â}x?>€âCø0>‚âcø8>OâSø4>ƒÏâsø<¾€/âKø2¾‚¯âkø:¾oâ[ø6î‹ûáþxˆáÁxЇááx‰GáÑx þÅãðx<OÄ“ðd<OÅÓðt<Ïijðl<ÏÅóð|¼/Ä‹ðb¼/ÅËðr¼¯Ä«ðj¼¯Åëðz¼oÄ›ðf¼oÅÛðv¼ïÄ»ðnüˆáÀ8Šƒáà8‰CáÐ8 ‹Ãá?qxGÄ‘pdGÅÑptÇıplÇÅñp|üN€âD81N‚“âd89NSâT85NƒÓât8=΀3âL83΂³âl8;Îsâ\87΃óâ|8?.€ âB¸0þÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Áü¯â@80‚ƒâ`88CâP84ƒÃâpøOGÀq$GÁQq4ÇÀ1q,ÇÁqq<ÿ…à„8NŒ“à¤8NŽSà”8NÓà´8N3àŒ8ÎŒ³à¬8ÎŽsàœ8Îóà¼8Î à‚¸.ŒÿÆEpQ\ Ç%pI\ —ÆepY\—ÇpE\ WÆUpU\ WÇ5pM\ ׯup]\×Ç pCÜ7ÆMpSÜ 7Ç-pKÜ ·Æmp[Ü·ÇpGÜ wÆ]pWÜ wÇ=pOÜ ÷Æ}p_Ü÷Çð@<ÆCðP< Ç#ðH< Æcð?x,‡Çã x"ž„'ã)x*ž†§ãx&ž…gã9x.ž‡çãx!^„ã%x)^†—ãx%^…Wã5x-^‡×ã x#Þ„7ã-x+Þ†·ãx'Þ…wã=x/Þ‡÷ãø >„ã#ø(>†ãø$>…Oã3ø,>‡Ïã ø"¾„/ã+ø*¾†¯ãø&¾…oã;ø.¾‡ïãø!~„ã'ø)~†Ÿãø%~…_ã7ø-~‡ßãø#þ„?ã/ø+þ†¿ãø'þ…¸ÿü×q ÁAq0‡À!q(‡Áaq8ü'þÿöïþoGÄ‘pdGÅÑptÇıplÇÅñp|üN€âD81N‚“âd89NSâT85NƒÓât8=΀3âL83΂³âl8;Îsâ\87΃óâ|8?.€ âB¸0þÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Á}q?ÜÀñ <ÁCñ0<À#ñ(<Áÿà±x'à‰xžŒ§à©xžŽgà™xžçà¹xžà…x^Œ—à¥x^ŽWà•x^×àµx^7àxÞŒ·à­xÞŽwàxÞ÷à½xÞàƒø>Œà£ø>ŽOà“ø>Ïà³ø>/à‹ø¾Œ¯à«ø¾Žoà›ø¾ïà»ø¾à‡ø~ŒŸà§ø~Ž_à—ø~ßà·ø~?àøþŒ¿à¯øþŽàŸøþ=øÿí?p@ÆApP Ç!pH ‡ÆapXÿ‰Ãã8"Ž„#ã(8*ކ£ã8&Ž…cã88.އãã¿pœ'‰qœ'ÃÉq œ§Â©qœ§Ãéqœg™qœgÃÙqœç¹qœçÃùq\Â…ñ߸.Š‹áâ¸.‰KáÒ¸ .‹Ëáò¸®ˆ+áʸ ®Š«á긮‰káÚ¸®‹ëáú¸nˆáƸ nŠ›áæ¸n‰[áÖ¸ n‹Ûáö¸îˆ;áθ áî¸î‰{áÞ¸î‹ûáþxˆáÁxЇááx‰GáÑx þÅãðx<OÄ“ðd<OÅÓðt<Ïijðl<ÏÅóð|¼/Ä‹ðb¼/ÅËðr¼¯Ä«ðj¼¯Åëðz¼oÄ›ðf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ðm|ßÅ÷ð}ü?Äðcü?ÅÏðsü¿Ä¯ðkü¿Åïð{üÄŸðgüÅßðwüÿÄ¿ðïÿÿ8xPPx^]ÚC´†ÐÛ¶mÛ¶mÛ¶m›mÒÆjcÛ6Ú¤6NÛô¿þsr’;‹™¹ÛÙÌb&j@@Àú(AcîÿJÔ¯<ϳñ4<ÏÀ3ñ8<OÀñ$<OÁSq?ÜÀñ <ÁCñ0<À#ñ(<Ácq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Á}q<'À q"œ'ÁIq2œ§À)q*œ§Áiq:œgÀq&œgÁYq6œçÀ9q.œçÁyq>œÀq!\ÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuñ¼€o=/À ñ"¼/ÁKñwø{¼ /Ç?àñ ¼¯Â«ñ¼¯Ãëñ¼oÂ?áŸñf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ð/øW|ßÁ¿áßñ]|ßÇðCü?ÆOðSü ?Ç/ðKü ÿÿįñü¿ÃïñüÂá¿ñ?ø3ò­ƒà 8ŽCà8Ãà°8#àˆ8ŽŒË×ŽŠ£áè8މcáØ8ŽûÅÿ1 HÈoÃÁq‡Â¡q‡ÃáqG‘qGÃÑq DZqÇÃñqœ'‰qœ'ÃÉq œ§Â©qœ§Ãéqœg™qœgÃÙqœç¹qœçÃùq\Â…q\ÃÅq \—Â¥q\—Ãåq\W•q\WÃÕq \×µq\×ÃõqÜ7ÂqÜ7ÃÍq Üò‹ÿ¿oó׊ƒáà8‰CáÐ8 ‹Ãáð8Žˆ#áÈ8p,_;°ÿÚÑptÇıplÇÅñp|œ'ĉpbœ'ÅÉprœ§Ä©pjœ§ÅépzœgÄ™pfœgÅÙpvœçĹpnœçÅùp~\Ä…pa\ÅÅpq\—Ä¥pi\—Ååpy\WÄ•pe\WÅÕpu\×ĵpm\×Åõp}Ü7ÄpcÜ7ÅÍpsÜ·Ä­pkÜ·Åíp{ÜwÄpgÜwÅÝpwÜ÷ĽpoÜ÷Åýp<ăð`<ÅÃðp<Ä£ðh<Åãðx<OÄ“ðd<OÅÓðt<Ïijðl<Ïýâÿ$ø·Šƒáà8‰CáÐ8 ‹Ãáð8Žˆ#áÈ8 ŽŠ£áè8މcáØ8Ž‹ãáø8NˆáÄ8 NŠ“áä8N‰SáÔ8 N‹Óáô8Έ3áÌ8 Ί³áì8ΉsáÜ8΋óáü¸.ˆ á¸.Š‹áâ¸.‰KáÒ¸ .‹Ëáò¸®ˆ+áʸ ®Š«á긮‰káÚ¸®‹ëáú¸nˆáƸ nŠ›áæ¸n‰[áÖ¸ n‹Ûáö¸îˆ;áθ áî¸î‰{áÞ¸î‹ûáþxˆáÁxЇááx‰GáÑx ‹Çáñxžˆ'áÉx žŠ§áéxž‰gáÙxž‹çáùx^ˆáÅx ^Š¿Ãßãex9þÿˆWà•x^×àµx^7àxþ ÿŒ7ã-x+Þ†·ãx'Þ…wã=x/Þ‡÷ãø >„ã#ø(>†ãø$>…Oã3ø,>‡Ïã ø"¾„/ã+ø*¾†¯ãø&¾…Á¿âÛøþ ÿŽïâ{ø>~€âGø1~‚Ÿâgø9~_âWøü'~ßà·ø~?àøþ ÿÿÁŸqàAåkÁAq0‡À!q(‡Áaq8GÀq$GÁQq4ÇÀ1q,ÇÁqq<'À q"œ'ÁIq2œ§À)q*œ§Áiq:œgÀq&œgÁYq6œçÀ9q.œçÁyq>œÀq!\ÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Á}q?ÜÀñ <ÁCñ0<À#ñ(<Ácñ8<OÀñ$<OÁSñ4<ÏÀ3ñ,<ÏÁsñ<</À ñ"¼/ÁKñwø{¼ /Ç?àñ ¼¯Â«ñ¼¯Ãëñ¼oÂ?áŸñf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ð/øW|ßÁ¿áßñ]|ßÇðCü?ÆOðSü ?Ç/ðKü ÿÿįñü¿ÃïñüÂá¿ñ?ø3| üú¹‹x^í×E°—eÀáÿ½tÃ¥;”APRQJ:•TQBIéF°Pº»»»»»»»ÛÑ•<{wßosæY93ïæ…B³„…þ)}äP(â?N‡ÓâT85Nƒ“âd89NSâ88.އãã8'ĉpbœ?‰ôºŸâgø9~_âW8Äþ0Ž#áÈ8 ŽŠ£áè8މcáØx÷íÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ðm|ßÅ÷ð}ü?ÄðcÜwÁ]q7Ü÷À=q/Ü÷Á}q?ÜÀ?ãxþÿŠÿã?ð`ü'þ ÁCñ0<À#ñ(<Ácñ8<OÀñ$<OÁSñ4<ÏÀ3ñ,<ÏÁsñ<</À ñ"¼/ÁKñ2¼¯À+ñ*¼¯Ákñ:¼oÀñ&¼oÁ[ñ6¼ïÀ;ñ.¼Ÿ ݧði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ðm|ßÅ÷ð}ü?Äðcü?ÅÏðsü¿Ä¯pˆ÷†Ãq$GÁQq4ÇÀ1q,ÇÁqq<'À8!N„ã$8)N†“ã8%N…Sã48-N‡Óã ø ü&Έ3áÌ8 ~ gÅÙpvœçĹpnœçÅùðÛ8?.€ âwp!\¿‹‹à¢ø=ü>.†‹ã¸$.…Kãpü!þ—Åãrøü).+àŠ¸®Œ?ÃUpU\ WÇ5pM\ ׯup]\×ÇŸã/pÜ7Âq܉¿Â_ãføü-nŽ[à–¸þ·Æßãpü#n‹Ûáö¸îˆ;áŸð°°×=À#ñ(<Ácñ8<OÀñ$<OÁSñ4<ÏÀ3ñ,<ÏÁsñ<</À ñ"¼/ÁKñ2¼¯À+ñ*¼¯Ákñ:¼oÀñ&¼oÁ[ñ6¼ïÀ;ñ.¼ïÁ{ñ>¼Àñ!|ÁGñ1|ŸÀ'ñ)|ŸÁgñ9|_Àñ%|_ÁWñ5|ßÀ7ñ-|ßÁwñ=|?Àñ#ü?ÁOñ3ü¿À/ñ+â†Ãq$GÁQq4ÇÀ1q,ÇÁqq<'À8!N„ã$8)N†“ã8%N…Sã48-N‡Óã ø ü&Έ3áÌ8 ~ gÅÙpvœçĹpnœçÅùðÛ8?.€ âwp!\¿‹‹à¢ø=ü>.†‹ã¸$.…Kãpü!þ—Åãrøü).+àŠ¸®Œ?ÃUpU\ WÇ5pM\ ׯup]\×ÇŸã/pÜ7Âq܉¿Â_ãføü-nŽ[à–¸þ·Æßãpü#n‹Ûáö¸îˆ;áŸpgÜwÅÝpwÜ÷ĽpoÜ÷Åýp<ÿŒâAøü+þ ÿŽÿÀƒñŸø/<ÅÃðp<Ä£ðh<Åãðx<OÄ“ðd<OÅÓðt<Ïijðl<ÏÅóð|¼/Ä‹ðb¼/ÅËðr¼¯Ä«ðj¼¯Åëðz¼oÄ›ðf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|"üßô?÷7ùoùSeurat/tests/testdata/barcodes.tsv0000644000176200001440000000252015063070153017007 0ustar liggesusersATGCCAGAACGACT-1 CATGGCCTGTGCAT-1 GAACCTGATGAACC-1 TGACTGGATTCTCA-1 AGTCAGACTGCACA-1 TCTGATACACGTGT-1 TGGTATCTAAACAG-1 GCAGCTCTGTTTCT-1 GATATAACACGCAT-1 AATGTTGACAGTCA-1 AGGTCATGAGTGTC-1 AGAGATGATCTCGC-1 GGGTAACTCTAGTG-1 CATGAGACACGGGA-1 TACGCCACTCCGAA-1 CTAAACCTGTGCAT-1 GTAAGCACTCATTC-1 TTGGTACTGAATCC-1 CATCATACGGAGCA-1 TACATCACGCTAAC-1 TTACCATGAATCGC-1 ATAGGAGAAACAGA-1 GCGCACGACTTTAC-1 ACTCGCACGAAAGT-1 ATTACCTGCCTTAT-1 CCCAACTGCAATCG-1 AAATTCGAATCACG-1 CCATCCGATTCGCC-1 TCCACTCTGAGCTT-1 CATCAGGATGCACA-1 CTAAACCTCTGACA-1 GATAGAGAAGGGTG-1 CTAACGGAACCGAT-1 AGATATACCCGTAA-1 TACTCTGAATCGAC-1 GCGCATCTTGCTCC-1 GTTGACGATATCGG-1 ACAGGTACTGGTGT-1 GGCATATGCTTATC-1 CATTACACCAACTG-1 TAGGGACTGAACTC-1 GCTCCATGAGAAGT-1 TACAATGATGCTAG-1 CTTCATGACCGAAT-1 CTGCCAACAGGAGC-1 TTGCATTGAGCTAC-1 AAGCAAGAGCTTAG-1 CGGCACGAACTCAG-1 GGTGGAGATTACTC-1 GGCCGATGTACTCT-1 CGTAGCCTGTATGC-1 TGAGCTGAATGCTG-1 CCTATAACGAGACG-1 ATAAGTTGGTACGT-1 AAGCGACTTTGACG-1 ACCAGTGAATACCG-1 ATTGCACTTGCTTT-1 CTAGGTGATGGTTG-1 GCACTAGACCTTTA-1 CATGCGCTAGTCAC-1 TTGAGGACTACGCA-1 ATACCACTCTAAGC-1 CATATAGACTAAGC-1 TTTAGCTGTACTCT-1 GACATTCTCCACCT-1 ACGTGATGCCATGA-1 ATTGTAGATTCCCG-1 GATAGAGATCACGA-1 AATGCGTGGACGGA-1 GCGTAAACACGGTT-1 ATTCAGCTCATTGG-1 GGCATATGGGGAGT-1 ATCATCTGACACCA-1 GTCATACTTCGCCT-1 TTACGTACGTTCAG-1 GAGTTGTGGTAGCT-1 GACGCTCTCTCTCG-1 AGTCTTACTTCGGA-1 GGAACACTTCAGAC-1 CTTGATTGATCTTC-1 Seurat/tests/testdata/visium/0000755000176200001440000000000015117462442016012 5ustar liggesusersSeurat/tests/testdata/visium/spatial/0000755000176200001440000000000015063070153017441 5ustar liggesusersSeurat/tests/testdata/visium/spatial/scalefactors_json.json0000644000176200001440000000024415063070153024036 0ustar liggesusers{"tissue_hires_scalef": 0.17211704, "tissue_lowres_scalef": 0.051635113, "fiducial_diameter_fullres": 144.5324756763478, "spot_diameter_fullres": 89.47248494250101}Seurat/tests/testdata/visium/spatial/tissue_lowres_image.png0000644000176200001440000000270115063070153024220 0ustar liggesusers‰PNG  IHDRXWO0* ˆIDATxœíÁ1 õOm / àfó2ÅÛ=ìIEND®B`‚Seurat/tests/testdata/visium/spatial/tissue_hires_image.png0000644000176200001440000003640415063070153024026 0ustar liggesusers‰PNG  IHDRÐΣ䧒 IDATxœìÁ€þ¯î €Ùƒ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU&ìùM¿IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU¥=8$ôÿµÌ|û‹{IEND®B`‚Seurat/tests/testdata/visium/spatial/tissue_positions_list.csv0000644000176200001440000055173215063070153024651 0ustar liggesusersACGCCTGACACGCGCT-1,0,0,0,1487,1480 TACCGATCCAACACTT-1,0,1,1,1607,1549 ATTAAAGCGGACGAGC-1,0,0,2,1487,1617 GATAAGGGACGATTAG-1,0,1,3,1607,1686 GTGCAAATCACCAATA-1,0,0,4,1487,1755 TGTTGGCTGGCGGAAG-1,0,1,5,1607,1824 GCATCCTCTCCTATTA-1,0,0,6,1487,1893 GCGAGGGACTGCTAGA-1,0,1,7,1607,1962 TGGTACCGGCACAGCC-1,0,0,8,1487,2030 GCGCGTTTAAATCGTA-1,0,1,9,1607,2099 TGCCTTGCCCTTACGG-1,0,0,10,1487,2168 GACGACTTTCCAAGAA-1,0,1,11,1607,2237 CCAGTGAGCTCCTTGT-1,0,0,12,1487,2306 ATACCCTGGCTCAAAT-1,0,1,13,1607,2375 GGGTTTCCGGCTTCCA-1,0,0,14,1487,2443 TAACCGTCCAGTTCAT-1,0,1,15,1607,2512 AAACAACGAATAGTTC-1,0,0,16,1487,2581 CAAGGGAGTGTATTTG-1,0,1,17,1607,2650 CCAAGCTTGATCTCCT-1,0,0,18,1487,2719 TTATTTCATCCCAAAC-1,0,1,19,1607,2788 GAGCGCTATGTCAGGC-1,0,0,20,1487,2856 TATGGCAGACTTTCGA-1,0,1,21,1607,2925 CTTCGTGCCCGCATCG-1,0,0,22,1487,2994 AAACGGGTTGGTATCC-1,0,1,23,1607,3063 TGCAAACCCACATCAA-1,0,0,24,1487,3132 GACGGGATGTCTTATG-1,0,1,25,1607,3200 GGCGAGCATCGAGGAC-1,0,0,26,1487,3269 CGCGTGCTATCAACGA-1,0,1,27,1607,3338 TGAAACCTCAACTCAC-1,0,0,28,1487,3407 CACATAAGGCGACCGT-1,0,1,29,1607,3476 TGACCCAACTCACATT-1,0,0,30,1487,3545 ATACGCCGATCTACCG-1,0,1,31,1607,3613 ACTTATCTGATCTATA-1,0,0,32,1487,3682 GTGTGAGCCGAGGTGC-1,0,1,33,1607,3751 GATGATTTGAAACTGG-1,0,0,34,1487,3820 GGGAACCACCTGTTTC-1,0,1,35,1607,3889 GTTCGTTGCGGACCAG-1,0,0,36,1487,3958 TGAGGTTGATCCCAAG-1,0,1,37,1607,4026 GATGCCACACTACAGC-1,0,0,38,1487,4095 AGGCAAAGAGGAATCA-1,0,1,39,1607,4164 AAGTAAGCTTCCAAAC-1,0,0,40,1487,4233 AACGTAGTCTACCCAT-1,0,1,41,1607,4302 GTTTGAGCGGTTATGT-1,0,0,42,1487,4371 GAAGCAAGGCAATGTT-1,0,1,43,1607,4439 TCACTCAGCGCATTAG-1,0,0,44,1487,4508 TACAATGAAACCAGCA-1,0,1,45,1607,4577 GTGCGCTTACAAATGA-1,0,0,46,1487,4646 GCACTCCCACAGTCCC-1,0,1,47,1607,4715 CGAAGACTGCCCGGGA-1,0,0,48,1487,4784 CAGGATCCGCCCGACC-1,0,1,49,1607,4852 CACGATTGGTCGTTAA-1,0,0,50,1487,4921 GGTTGTATCGTGAAAT-1,0,1,51,1607,4990 TCTTATGGGTAGTACC-1,0,0,52,1487,5059 TACAAGCTGTTCACTG-1,0,1,53,1607,5128 GTATCTTGTTGCTCAC-1,0,0,54,1487,5197 ATACCAGGTGAGCGAT-1,0,1,55,1607,5265 CCTAAACAGGGTCCGT-1,0,0,56,1487,5334 ATGGTGCTCAAAGCCA-1,0,1,57,1607,5403 CAAATGCGGAGTGTTC-1,0,0,58,1487,5472 CGTGCCCGACATTTGT-1,0,1,59,1607,5541 GTATCTCCCTAACTGT-1,0,0,60,1487,5610 ATTTGCCTAGTTACGA-1,0,1,61,1607,5678 ACGTCCTAAACGAGAT-1,0,0,62,1487,5747 CTGGGATCGCCCAGAT-1,0,1,63,1607,5816 CTGCAAATGGGCTCCA-1,0,0,64,1487,5885 CATTATAACAGGGTCC-1,0,1,65,1607,5954 ACCTTTCCTTTAGAAG-1,0,0,66,1487,6022 ATAGATTTGCAGTCGG-1,0,1,67,1607,6091 CTCGGGCATCGTCGGG-1,0,0,68,1487,6160 GTGGCGGGCCGTAGCT-1,0,1,69,1607,6229 CAACAGTGCCAAACGG-1,0,0,70,1487,6298 TGCGGGTATTGGGATC-1,0,1,71,1607,6367 GTCTCGCCAACACGCC-1,0,0,72,1487,6435 CTGGGCGGCCAAATGT-1,0,1,73,1607,6504 TAAAGGAGAAACTAGT-1,0,0,74,1487,6573 TCCCACGGAGGGAGCT-1,0,1,75,1607,6642 AGCTTCAATACTTTGA-1,0,0,76,1487,6711 TTCCACATTTCTCGTC-1,0,1,77,1607,6780 ACAAACCGACAAGGCG-1,0,0,78,1487,6848 AGACGGGATTGGTATA-1,0,1,79,1607,6917 AACCTAAAGCCGTCCG-1,0,0,80,1487,6986 TACAAATTGCGGAGGT-1,0,1,81,1607,7055 CCCGCTAGAGGGTTAA-1,0,0,82,1487,7124 CATTGCAAAGCATAAT-1,0,1,83,1607,7193 TGTACGCTATCAGCTT-1,0,0,84,1487,7261 TTCTTCGCAATAGAGC-1,0,1,85,1607,7330 TGTGATTCCAGCGCTT-1,0,0,86,1487,7399 ATTCAGGATCGCCTCT-1,0,1,87,1607,7468 GCCCATGGGTGCAATG-1,0,0,88,1487,7537 TTCCCGACGCTTCACT-1,0,1,89,1607,7606 AGCGGTTGAGATGTAC-1,0,0,90,1487,7674 GCTGTCTGTGATCGAC-1,0,1,91,1607,7743 AAAGACATGAAGTTTA-1,0,0,92,1487,7812 CAACAGAATAACGCTA-1,0,1,93,1607,7881 TGCGGTCTACGAGTAA-1,0,0,94,1487,7950 AAGACTCACGCCCACT-1,0,1,95,1607,8019 CTTTGAAACATATTCC-1,0,0,96,1487,8087 CTGGGCACTAGTCGGA-1,0,1,97,1607,8156 CGCCCTTACATCCACC-1,0,0,98,1487,8225 CACGACCACAGACTTT-1,0,1,99,1607,8294 CAATCCATTATCCGTT-1,0,0,100,1487,8363 GTGGCGTGCACCAGAG-1,0,1,101,1607,8432 CGGAGTCCTAACCTGG-1,0,0,102,1487,8500 GGTCCCATAACATAGA-1,0,1,103,1607,8569 ATCTCATAAACCTACC-1,0,0,104,1487,8638 TGCATGGCAGTCTTGC-1,0,1,105,1607,8707 TTGCAGGTCATGAAGT-1,0,0,106,1487,8776 AGCTGCATTTGAGGTG-1,0,1,107,1607,8844 TAATCAGGAATGCTGC-1,0,0,108,1487,8913 CCATCATAAGAACAGG-1,0,1,109,1607,8982 TCGTATCACCAAGCTA-1,0,0,110,1487,9051 ATTCAGATGAATCCCT-1,0,1,111,1607,9120 AAAGGTCAACGACATG-1,0,0,112,1487,9189 AGCTGCTGTGCCGAAT-1,0,1,113,1607,9257 CTAGCGCCAATCCTAC-1,0,0,114,1487,9326 GCTCGACCGAACTGAA-1,0,1,115,1607,9395 ACAGTGCAGCGCATTT-1,0,0,116,1487,9464 CGGCTGAAGGTTACGC-1,0,1,117,1607,9533 CACCTCTACGAGTGTG-1,0,0,118,1487,9602 ATACGACAGATGGGTA-1,0,1,119,1607,9670 ACTTCCTGTCGTGCGA-1,0,0,120,1487,9739 CGTAACGGAACGATCA-1,0,1,121,1607,9808 AAATCACTCCTAAACG-1,0,0,122,1487,9877 CTCCGAGTAAATCCGC-1,0,1,123,1607,9946 ACGCTAGTATCAGTGC-1,0,0,124,1487,10015 AGAGTGAACAGACACC-1,0,1,125,1607,10083 ACACCCGTAAATCTGT-1,0,0,126,1487,10152 GCTTTGCTGCCGGGTA-1,0,1,127,1607,10221 ACAGGAGGCGCAGCCG-1,0,2,0,1727,1480 AGGCAATACGGAGGAC-1,0,3,1,1847,1549 TGGTGTGACAGACGAT-1,0,2,2,1727,1617 ATCTATCGATGATCAA-1,0,3,3,1847,1686 CGGTAACAAGATACAT-1,0,2,4,1727,1755 TCGCCGGAGAGTCTTA-1,0,3,5,1847,1824 GGAGGAGTGTGTTTAT-1,0,2,6,1727,1893 TTAGGTGTGACTGGTC-1,0,3,7,1847,1962 CAGGGCTAACGAAACC-1,0,2,8,1727,2030 CCCGTGGGTTAATTGA-1,0,3,9,1847,2099 GACCGACCGCTAATAT-1,0,2,10,1727,2168 GGTATCAAGCATAGAA-1,0,3,11,1847,2237 TGCATGAGTAGATTCG-1,0,2,12,1727,2306 AATTCCAACTTGGTGA-1,0,3,13,1847,2375 TGCCGATGTCATCAAT-1,0,2,14,1727,2443 GCTGGGTCCGCTGTTA-1,0,3,15,1847,2512 TGAACACCCGAAGCAG-1,0,2,16,1727,2581 AACATTGGTCAGCCGT-1,0,3,17,1847,2650 GTGGGTCTTCTTTGCG-1,0,2,18,1727,2719 CATCGAATGGATCTCT-1,0,3,19,1847,2788 GCTACACTGTCCGAAC-1,0,2,20,1727,2856 CGGGTTGTAGCTTTGG-1,0,3,21,1847,2925 CCTAAGTGTCTAACCG-1,0,2,22,1727,2994 TCTGTGACTGACCGTT-1,0,3,23,1847,3063 TTATCATACTCGCAAA-1,0,2,24,1727,3132 AGCGTAGCGCTAGACC-1,0,3,25,1847,3201 TCCCTCCGAAATCGTT-1,0,2,26,1727,3269 AGGTCGCCACTTCGGT-1,0,3,27,1847,3338 CTAGCAACTAATTTAC-1,0,2,28,1727,3407 TTGCTAGCTACCAATC-1,0,3,29,1847,3476 GCCGGTTTGGGCGGAT-1,0,2,30,1727,3545 TGTAACTTGTCAACCT-1,0,3,31,1847,3613 CGAGATGTTGCCTATA-1,0,2,32,1727,3682 GTTACGAAATCCACGC-1,0,3,33,1847,3751 CTTGTCGTACGTGTCA-1,0,2,34,1727,3820 GCGTCCAGCTCGTGGC-1,0,3,35,1847,3889 CCCTTCTCGTACGCGA-1,0,2,36,1727,3958 CCAAAGTCCCGCTAAC-1,0,3,37,1847,4026 CCGCTTCGCGGTTAAC-1,0,2,38,1727,4095 GTTACGGCCCGACTGC-1,0,3,39,1847,4164 CCCGCTTGCCCTCGTC-1,0,2,40,1727,4233 TAGTGAGAAGTGGTTG-1,0,3,41,1847,4302 CGCTACCGCCCTATGA-1,0,2,42,1727,4371 AAACAATCTACTAGCA-1,0,3,43,1847,4439 GCGCGATGGGTCAAGT-1,0,2,44,1727,4508 ATAAACCATTGGACGG-1,0,3,45,1847,4577 TCGGGCACTTCTGGAT-1,0,2,46,1727,4646 TCTGTGGCTACATTTC-1,0,3,47,1847,4715 CTCTGTGCCTGCTATG-1,0,2,48,1727,4784 CACGACTAAAGTTCTG-1,0,3,49,1847,4852 GAGGAGTAATTCCTAC-1,0,2,50,1727,4921 AGAGGTATCTCGGTCC-1,0,3,51,1847,4990 GGCGTACCCTATATAA-1,0,2,52,1727,5059 GCCGGAAACACATCTT-1,0,3,53,1847,5128 AAATGTGGGTGCTCCT-1,0,2,54,1727,5197 ACCAGGAGTGTGATCT-1,0,3,55,1847,5265 TGTGGAGGAAGCTTAA-1,0,2,56,1727,5334 AAGGAGAACTTATAAG-1,0,3,57,1847,5403 CCCTCGGGAGCCTTGT-1,0,2,58,1727,5472 ACTGTTTAGTGTAGGC-1,0,3,59,1847,5541 CGTCAGTTTATCGTCT-1,0,2,60,1727,5610 GCGTGTATGTCGTATT-1,0,3,61,1847,5678 ACAATCGATCTTTATA-1,0,2,62,1727,5747 CAGCCCTCACAGGCAG-1,0,3,63,1847,5816 CGCGTCATATTAAACC-1,0,2,64,1727,5885 GAAGACTTCAATGCCG-1,0,3,65,1847,5954 TTGCGGCGACTCATGC-1,0,2,66,1727,6022 ACCAAACTAGAAATCC-1,0,3,67,1847,6091 TTACTGTTTCTCTACG-1,0,2,68,1727,6160 GACCAGGTCATTCATA-1,0,3,69,1847,6229 TTCTTCCCTTTGATAT-1,0,2,70,1727,6298 ACGCCCAGCTGTCGAT-1,0,3,71,1847,6367 AGTAGCGTGAACGAAC-1,0,2,72,1727,6435 CCTCGACCCACTGCCT-1,0,3,73,1847,6504 AGTTATTGAAAGGTAA-1,0,2,74,1727,6573 TCAGTTACGGAATGAT-1,0,3,75,1847,6642 GAATCTATACTCGGAC-1,0,2,76,1727,6711 TCGGCTAACTTCCCTT-1,0,3,77,1847,6780 ACGTGGTCGAATGTGC-1,0,2,78,1727,6848 ATATCGTGCCAGACCC-1,0,3,79,1847,6917 GTAGCTAGTAAGCGCG-1,0,2,80,1727,6986 ACGCTTAGTGTCTCTC-1,0,3,81,1847,7055 TCCGGCCTGCATCGAT-1,0,2,82,1727,7124 TAGTGGAACTCATACA-1,0,3,83,1847,7193 ATCATCTGCCCAGTGT-1,0,2,84,1727,7261 GTTATTAAATACGACC-1,0,3,85,1847,7330 GCGCTAAGTATGCATG-1,0,2,86,1727,7399 CCTGACGCAACCTTTA-1,0,3,87,1846,7468 CCCAAGAATGCACGGT-1,0,2,88,1727,7537 AACTGGGTTCGAGCCG-1,0,3,89,1846,7606 GGTTCCACCCGCTTCT-1,0,2,90,1727,7674 CATGCACGTGTTACTG-1,0,3,91,1846,7743 AGCGTTCCGATTTAAA-1,0,2,92,1727,7812 CCTACGCGACCTTACA-1,0,3,93,1846,7881 CGAATTACATGGTGTT-1,0,2,94,1727,7950 GAGGTCTTAGTGGGTC-1,0,3,95,1846,8019 GCCGCTAGATACGCAG-1,0,2,96,1727,8087 GTCACCTGTCTATGTC-1,0,3,97,1846,8156 CCGATTGGTCAATGAA-1,0,2,98,1727,8225 CCTGTGCGGATTGTAA-1,0,3,99,1846,8294 TTACGTAGCGCGTGCT-1,0,2,100,1727,8363 GGAGGCGAAGAACCGC-1,0,3,101,1846,8432 GGGTCACGTGCTTATG-1,0,2,102,1727,8500 GCTCCGGACGTTGATA-1,0,3,103,1846,8569 ATGTTTGTAAGATCAT-1,0,2,104,1727,8638 TGACCCAGCATTCCCG-1,0,3,105,1846,8707 TGGTCGTTTGATAGAT-1,0,2,106,1727,8776 TGTAATGCCTTCGGAC-1,0,3,107,1846,8844 TGCTCACACAACAACC-1,0,2,108,1727,8913 TACGATCCAAGCCACT-1,0,3,109,1846,8982 TTGTAACTTCATAGCG-1,0,2,110,1727,9051 AGATTCAAGCGGGTCG-1,0,3,111,1846,9120 CTCAGCAGACTGCCGA-1,0,2,112,1727,9189 GTAACATCAGCTCATC-1,0,3,113,1846,9257 ATGGAACAGAATAAAC-1,0,2,114,1727,9326 GGGCCTATACAACCGG-1,0,3,115,1846,9395 TCAAACAATTAGGACA-1,0,2,116,1727,9464 AAACCACTACACAGAT-1,0,3,117,1846,9533 AAACGACAGTCTTGCC-1,0,2,118,1727,9602 TTGAGGGTCGAACGCG-1,0,3,119,1846,9670 TGTTGATCACTGTTTA-1,0,2,120,1727,9739 AGGGTGTGCTACACGC-1,0,3,121,1846,9808 GTAGTTAGACAATATA-1,0,2,122,1727,9877 AATGGCCGCCAATGCG-1,0,3,123,1846,9946 TCGGCGGTATTAGATT-1,0,2,124,1727,10015 GGGTCACTGAGTAGTG-1,0,3,125,1846,10083 GAATTATGCAACCTAC-1,0,2,126,1727,10152 GATCTTAGTGAACGTG-1,0,3,127,1846,10221 CTAATGCGCCCAACAA-1,0,4,0,1966,1480 GCCACCCATTCCACTT-1,0,5,1,2086,1549 TACTCACAACGTAGTA-1,0,4,2,1966,1617 GTTCGGTGTGGATTTA-1,0,5,3,2086,1686 TCTTTCGGCGGGACAC-1,0,4,4,1966,1755 GGAGACATTCACGGGC-1,0,5,5,2086,1824 GGGATTATCTCACAAC-1,0,4,6,1966,1893 TAGAACGCCAGTAACG-1,0,5,7,2086,1962 ACGAGTCGCCGGCGTT-1,0,4,8,1966,2030 TGATGGGACTAAGTCA-1,0,5,9,2086,2099 TGCGAGAAACGTTACG-1,0,4,10,1966,2168 TCGCCTCGACCTGTTG-1,0,5,11,2086,2237 AACTCGATAAACACGT-1,0,4,12,1966,2306 AGGAAAGCCTCTGATG-1,0,5,13,2086,2375 GAAGGACTAAATTGAA-1,0,4,14,1966,2443 GTATCGGGACGAGCTG-1,0,5,15,2086,2512 CCTGTGCATAGGAGAC-1,0,4,16,1966,2581 CATACGGGTGCATGAT-1,0,5,17,2086,2650 CCACTAAACTGAATCG-1,0,4,18,1966,2719 AAATTGCGGCGGTTCT-1,0,5,19,2086,2788 AGTCCAGCGGGTACGT-1,0,4,20,1966,2856 CATTCAGGTCAGTGCG-1,0,5,21,2086,2925 CTAAAGTCCGAAGCTA-1,0,4,22,1966,2994 AATCAGACTGCAGGAC-1,0,5,23,2086,3063 AGTATCCATAATAACG-1,0,4,24,1966,3132 CTGGCTGCTAACGTAA-1,0,5,25,2086,3201 GTTCCAAGACAGCGAC-1,0,4,26,1966,3269 AAGACTAACCCGTTGT-1,0,5,27,2086,3338 GATTAATCCTGGCTCA-1,0,4,28,1966,3407 CGCGCAAGGAACTACA-1,0,5,29,2086,3476 CAGTAGCGAGGTAGTA-1,0,4,30,1966,3545 ACGGCGGGTTGCCCTG-1,0,5,31,2086,3613 CTAGGCGGCAGAGAAT-1,0,4,32,1966,3682 GTGCGCAGCTTGCTCC-1,0,5,33,2086,3751 TCACTATCGTGCAATC-1,0,4,34,1966,3820 TATGATTCTGCTTGGT-1,0,5,35,2086,3889 TAAGATTTAGCGGGAG-1,0,4,36,1966,3958 TTACGGTGTCACCGAG-1,0,5,37,2086,4026 CTACACTAGCTTGTTC-1,0,4,38,1966,4095 TGAGCAGTCGTGAAGT-1,0,5,39,2086,4164 CGCTGAGGACGTCCAA-1,0,4,40,1966,4233 GTGTATGACTTTAAAG-1,0,5,41,2086,4302 CTAAACGGGTGTAATC-1,0,4,42,1966,4371 TGTACTGTGCCAAAGT-1,0,5,43,2086,4439 GGCCACAAGCGATGGC-1,0,4,44,1966,4508 GTCAATTGTACTGAAG-1,0,5,45,2086,4577 AGGGACAGCACGGCGG-1,0,4,46,1966,4646 AGCTTATAGAGACCTG-1,0,5,47,2086,4715 AACTAGCGTATCGCAC-1,0,4,48,1966,4784 AACTTTAGCTGCTGAG-1,0,5,49,2086,4852 CCCAAGACAGAGTATG-1,0,4,50,1966,4921 GGCATCAACGAGCACG-1,0,5,51,2086,4990 ATGCATTCCGTGATGG-1,0,4,52,1966,5059 TTATAGATGCACATTA-1,0,5,53,2086,5128 GAACCATCTGGGAGAC-1,0,4,54,1966,5197 TGCTATACAAACGGAC-1,0,5,55,2086,5265 ACTTGCCATATTGTAC-1,0,4,56,1966,5334 TATTCCGGCAGTCCTA-1,0,5,57,2086,5403 GACGGACCGCGTTCCT-1,0,4,58,1966,5472 ATGTGTAGTTTAGTCA-1,0,5,59,2086,5541 ATACCAGCAAATTGCT-1,0,4,60,1966,5610 AAGTTTACTAATGGCA-1,0,5,61,2086,5678 CTCTCGATGTGCGCCT-1,0,4,62,1966,5747 GATTGACACTCTGCTC-1,0,5,63,2086,5816 TATCACAGCACGGGCA-1,0,4,64,1966,5885 ACCGTTCCCGCTCTGA-1,0,5,65,2086,5954 CCGCCACCACAATCCA-1,0,4,66,1966,6023 CATTCACTGACAGCTA-1,0,5,67,2086,6091 CGGCTGCAAGATTAAG-1,0,4,68,1966,6160 CATGAACCTCTTATCA-1,0,5,69,2086,6229 TTAATGCGAGGTAACT-1,0,4,70,1966,6298 AATAAGTCCTCGAGAC-1,0,5,71,2086,6367 ACCAGCCCGGTCTTTG-1,0,4,72,1966,6435 CTACGAACTAGGTCGA-1,0,5,73,2086,6504 ACATCTCAACGCGTAA-1,0,4,74,1966,6573 CACTACTCAGTTCTGT-1,0,5,75,2086,6642 CCGACTCGCATAGTCT-1,0,4,76,1966,6711 CATTTATCGTTCAAGA-1,0,5,77,2086,6780 CAAACGTGGTCTTGCG-1,0,4,78,1966,6848 TAGAAACCACTAAGTA-1,0,5,79,2086,6917 ACTGATTTAGTGATTC-1,0,4,80,1966,6986 TCGTATTTCGTCCGGA-1,0,5,81,2086,7055 CGGAAATTTCACATCC-1,0,4,82,1966,7124 ATCCACGCTAAATGTT-1,0,5,83,2086,7193 GTTCAATCTATGTCAA-1,0,4,84,1966,7261 ATAAAGGTCAAGTACG-1,0,5,85,2086,7330 CAACTCCAACGTTTAG-1,0,4,86,1966,7399 TAGGAACAGCCTCCAG-1,0,5,87,2086,7468 ATGGGAACGGAAGCGG-1,0,4,88,1966,7537 CACACGTTTCAATGGG-1,0,5,89,2086,7606 GGTGTTCTGTTTCTAC-1,0,4,90,1966,7674 AGTAACGTTCATCCTG-1,0,5,91,2086,7743 GTATAGTGGCCCATGT-1,0,4,92,1966,7812 TCTACACGTTCATGCA-1,0,5,93,2086,7881 AATCTGGGTAGACCCT-1,0,4,94,1966,7950 TCGGTTAGCCATGTAG-1,0,5,95,2086,8019 TGCCATGGCTTATAAG-1,0,4,96,1966,8087 TAAGTAAATGTGCCGC-1,0,5,97,2086,8156 GTGTCCGATAAGGCAT-1,0,4,98,1966,8225 TGGCACGAGCTCGAGT-1,0,5,99,2086,8294 ACCGGTCTGAGTACGG-1,0,4,100,1966,8363 GAACTTAGCGCCCGGT-1,0,5,101,2086,8432 AGTAGCTAGACGCCGA-1,0,4,102,1966,8500 ATAGGAATCTAAGCTT-1,0,5,103,2086,8569 CTTCCTGCATATTTAC-1,0,4,104,1966,8638 CAATATGTAGATTTAC-1,0,5,105,2086,8707 ACAAGGCCTACCAGCC-1,0,4,106,1966,8776 TTATAGTCCAAGGTGC-1,0,5,107,2086,8845 AAACGCCCGAGATCGG-1,0,4,108,1966,8913 CCTCGTTACGCCTGTT-1,0,5,109,2086,8982 GAACGGTGTAAAGCAG-1,0,4,110,1966,9051 ACGCATAAATGACATG-1,0,5,111,2086,9120 GGTTCGATGCTGAGTT-1,0,4,112,1966,9189 CTTTGGCAGACAGAGT-1,0,5,113,2086,9257 TTCGTGGGCTGGAAGC-1,0,4,114,1966,9326 CAAAGGTTAAATTCAG-1,0,5,115,2086,9395 GTTTGGCGTCAGGCAC-1,0,4,116,1966,9464 GCTTTCTATCTCAACT-1,0,5,117,2086,9533 TGCATCTCCGGATCTT-1,0,4,118,1966,9602 CTGAAACGGCCCTCAG-1,0,5,119,2086,9670 TAGCAGTAAATACGCG-1,0,4,120,1966,9739 CGGGCTACTTAAATTG-1,0,5,121,2086,9808 ATTATGCTCAGTATTG-1,0,4,122,1966,9877 TGATGCTCACGTAGTC-1,0,5,123,2086,9946 GTCTAAGATGCCCAGC-1,0,4,124,1966,10015 AACCCGATAGGGCTTC-1,0,5,125,2086,10083 CGCTATCGTGGCTTTA-1,0,4,126,1966,10152 CGTCTCTCGCCGAGGC-1,0,5,127,2086,10221 AGTGGGAGTATACACG-1,0,6,0,2206,1480 GGTCTTGGTGTTAACT-1,0,7,1,2326,1549 GGCTGGCAGCTTTATG-1,0,6,2,2206,1617 CGCCAATTATTGCGTT-1,0,7,3,2326,1686 GGTAACCGGCAAAGGT-1,0,6,4,2206,1755 TGGGACCATTGGGAGT-1,0,7,5,2326,1824 CTGCAGGTGCTCGGCC-1,0,6,6,2206,1893 CCGGTGCGAGTGATAG-1,0,7,7,2326,1962 GGGTACACTCTGGAGG-1,0,6,8,2206,2030 TAGCCAGAGGGTCCGG-1,0,7,9,2326,2099 CTTGTGAGGACAGCGG-1,0,6,10,2206,2168 GAAGGGCATAACCATG-1,0,7,11,2326,2237 CAACATGGCCTGATAA-1,0,6,12,2206,2306 CAATTTGACCGGGAAG-1,0,7,13,2326,2375 TCTGACTGTAATGGTT-1,0,6,14,2206,2443 TTCATAGCCTTGTAAC-1,0,7,15,2326,2512 TGGAAACGGAGTGAAC-1,0,6,16,2206,2581 ATCGCACGATTGTTCA-1,0,7,17,2326,2650 CGCCACCCGCATTAAC-1,0,6,18,2206,2719 TGGACCACGGCGTTGA-1,0,7,19,2326,2788 GTATATGTTACGGCGG-1,0,6,20,2206,2856 GTATTCTTACCGTGCT-1,0,7,21,2326,2925 TTCAGAGTAACCTGAC-1,0,6,22,2206,2994 GCGGTAACCCAAATGA-1,0,7,23,2326,3063 CTACGTGTTGCCACCA-1,0,6,24,2206,3132 CTAGATAAACTCCTCG-1,0,7,25,2326,3201 TCCATTAGTTGGATAG-1,0,6,26,2206,3269 CTGGCTCCTGCGGGAT-1,0,7,27,2326,3338 CAGTCTCTCGGCTAAT-1,0,6,28,2206,3407 GTATGACGTGGGAAAC-1,0,7,29,2326,3476 AGTCACTCCGCCTCAT-1,0,6,30,2206,3545 GCAGCGGTGGGCATTA-1,0,7,31,2326,3614 TATGGAGTTTCTCGTT-1,0,6,32,2206,3682 ACTCAACGAATGTATT-1,0,7,33,2326,3751 AACACGCGGCCGCGAA-1,0,6,34,2206,3820 CGATATTAGCCGCAGG-1,0,7,35,2326,3889 AGCGTCTGAACCCGCA-1,0,6,36,2206,3958 GATGTCCGGATCACAT-1,0,7,37,2326,4026 GGTCACGTTAGATTCA-1,0,6,38,2206,4095 TTAAGGATACGGAGGT-1,0,7,39,2326,4164 GTGCGGGACCATCGGC-1,0,6,40,2206,4233 CCATCTTGTTCACAAT-1,0,7,41,2326,4302 TCCGAGAAGGCTAAGC-1,0,6,42,2206,4371 TGGCGGTGTGCGATTG-1,0,7,43,2326,4439 ATCCTGCTGCAGATAG-1,0,6,44,2206,4508 TTATGCGTCCCGGTCC-1,0,7,45,2326,4577 CATAATGAGCGGGCGA-1,0,6,46,2206,4646 AGACATAGATCCTTCC-1,0,7,47,2326,4715 GGTGAAACCGGGAATG-1,0,6,48,2206,4784 AACTGGTGTGGGCCTT-1,0,7,49,2326,4852 GTAGCGCTGTTGTAGT-1,0,6,50,2206,4921 TTGTTTGTGTAAATTC-1,0,7,51,2326,4990 GGATCAAAGGACGAGG-1,0,6,52,2206,5059 CGTAGCGCCGACGTTG-1,0,7,53,2326,5128 CAAGTGAACTTTGGTT-1,0,6,54,2206,5197 GTAGACAACCGATGAA-1,0,7,55,2326,5265 CAATGGTCGGCCTGGG-1,0,6,56,2206,5334 ACAGATTAGGTTAGTG-1,0,7,57,2326,5403 GTTATCACCTTCTGAA-1,0,6,58,2206,5472 TGGTATCGGTCTGTAT-1,0,7,59,2326,5541 GGAATAACCTCAAGAA-1,0,6,60,2206,5610 ATTATCTCGACAGATC-1,0,7,61,2326,5678 CCGAGGGATGTTAGGC-1,0,6,62,2206,5747 TGAGATCAAATACTCA-1,0,7,63,2326,5816 AAACGAAGAACATACC-1,0,6,64,2206,5885 CTGGTCCTAACTTGGC-1,0,7,65,2326,5954 TGCACGAGTCGGCAGC-1,0,6,66,2206,6023 ATAGTCTTTGACGTGC-1,0,7,67,2326,6091 TGGAGCTAAAGTTCCC-1,0,6,68,2206,6160 GGGTGGTCCAGCCTGT-1,0,7,69,2326,6229 CATGCATGGAGACCCT-1,0,6,70,2206,6298 ACACGGCACTATGCAT-1,0,7,71,2326,6367 CCCTGGTATGGGCGGC-1,0,6,72,2206,6435 GGAGGATTGAAAGGAG-1,0,7,73,2326,6504 CCGCTGGTGCCATTCA-1,0,6,74,2206,6573 GTTAGAGTGTGCCGCT-1,0,7,75,2326,6642 TCGGAATGACCATCAA-1,0,6,76,2206,6711 TTCAATTAGCCATAAT-1,0,7,77,2326,6780 GATGTGTTGTCACAAG-1,0,6,78,2206,6848 TCTTTCTCTTAAGGAG-1,0,7,79,2326,6917 ACCCTTTAGTTCTCCA-1,0,6,80,2206,6986 ACCACAACTCAGAACA-1,0,7,81,2326,7055 TATGATAAATCTAACG-1,0,6,82,2206,7124 GATCCTCTTGCGCTTA-1,0,7,83,2326,7193 TTCTACCTTTATGTTG-1,0,6,84,2206,7261 GAAATACCTGCTGGCT-1,0,7,85,2326,7330 ATTCTGAGTATGAACT-1,0,6,86,2206,7399 GGATTAAGCTAAGGTC-1,0,7,87,2326,7468 AGTACGTGGCCTGTCT-1,0,6,88,2206,7537 TCAGGGTGCACGAAAC-1,0,7,89,2326,7606 AAATTTACCGAAATCC-1,0,6,90,2206,7674 TTGAGGCATTTAACTC-1,0,7,91,2326,7743 AACCAGTATCACTCTT-1,0,6,92,2206,7812 CACCGGAGATATCTCC-1,0,7,93,2326,7881 GACTGGGCGCCGCAAC-1,0,6,94,2206,7950 CACGTCTATGATGTGG-1,0,7,95,2326,8019 TTAAGACGAACGAACC-1,0,6,96,2206,8087 TGACCAGCTTCAAAGT-1,0,7,97,2326,8156 AGAGTTAGAGACCGAT-1,0,6,98,2206,8225 TTCGGACTGATGCCTT-1,0,7,99,2326,8294 CTCGAATGGAACGTAT-1,0,6,100,2206,8363 GGACGGCTTGCGCAAC-1,0,7,101,2326,8432 CTAAGTACAGGGCTAC-1,0,6,102,2206,8500 ACAAATTCAGATCTGA-1,0,7,103,2326,8569 CATGGAAATGGGACCA-1,0,6,104,2206,8638 GGTGGACCACGTGTTA-1,0,7,105,2326,8707 CACGACGTAATAGTAA-1,0,6,106,2206,8776 CGGGTTCGGCACGTAT-1,0,7,107,2325,8845 CTGGGCTATCCTTTGG-1,0,6,108,2206,8913 GTATTAGGGTTCGCGT-1,0,7,109,2325,8982 TCATTCGTATAATTTG-1,0,6,110,2206,9051 AATAGCAAGCCTCCTG-1,0,7,111,2325,9120 CATCTACCCGAGAACG-1,0,6,112,2206,9189 GCTTCAGTGGGATTAC-1,0,7,113,2325,9257 TCTGTGATGGAGGTTG-1,0,6,114,2206,9326 ATCCACTTTCAGACTA-1,0,7,115,2325,9395 ATGGTTACGAAACATG-1,0,6,116,2206,9464 GGCCCAATCTAGAGGG-1,0,7,117,2325,9533 GATGGTGAAATAACCC-1,0,6,118,2206,9602 AGAGGGACAATTGTCC-1,0,7,119,2325,9670 CGCGTACATTCTGGAA-1,0,6,120,2206,9739 CAAGAAACCCTAAACT-1,0,7,121,2325,9808 TTGGTGCGGTGTTGAA-1,0,6,122,2206,9877 GGTTCCCTAGTGTCTC-1,0,7,123,2325,9946 CGATAACCAATTTGAG-1,0,6,124,2206,10015 GCCCACTGGTCCACAA-1,0,7,125,2325,10083 GAGGGCCGGCAGAGTC-1,0,6,126,2206,10152 CGACACGGATGCCCAC-1,0,7,127,2325,10221 CTGTCTGTGGCTGGCT-1,0,8,0,2446,1480 ATATTATCCCGTATTT-1,0,9,1,2565,1549 GCGCTGGCGGAAAGTC-1,0,8,2,2446,1617 ATCTAACGTCCCTATG-1,0,9,3,2565,1686 GTCAGACAGCGTTGGA-1,0,8,4,2446,1755 GCCAGGCTTAGTGGTA-1,0,9,5,2565,1824 ATTCAAAGTACCTGTT-1,0,8,6,2446,1893 TGGACGTAGGCGAATC-1,0,9,7,2565,1962 ACACATTGACGCAACA-1,0,8,8,2446,2030 GATATCAGTATGTATC-1,0,9,9,2565,2099 TGGGCCTTGCCTGCAT-1,0,8,10,2446,2168 CAAAGTCAGGTTAGCT-1,0,9,11,2565,2237 GGATCCCTACCAGCTA-1,0,8,12,2446,2306 ATCGTCCAATCGAGTC-1,0,9,13,2565,2375 ACATGGCTCAATTTAG-1,0,8,14,2445,2443 AGGCCCAGTGACTGGT-1,0,9,15,2565,2512 GCTTCCAGCTTAGATT-1,0,8,16,2445,2581 TGCTTGAAACCATGCA-1,0,9,17,2565,2650 CAATATTGGACTAGTG-1,0,8,18,2445,2719 CGTGCTGGCCTAGTCG-1,0,9,19,2565,2788 CCTGCGATAGAACTGT-1,0,8,20,2445,2856 GGGTAATGCTGTGTTT-1,0,9,21,2565,2925 AACGCGAACGGCAACA-1,0,8,22,2445,2994 TGTCGGCATGGTGGAA-1,0,9,23,2565,3063 AGCGTACGAGAGCTAG-1,0,8,24,2445,3132 ATACTCTCGCCACTCT-1,0,9,25,2565,3201 AATCCATGCAAGGGTG-1,0,8,26,2445,3269 TTAAACAGAGTCCCGC-1,0,9,27,2565,3338 CCACAGCTGAAATCAT-1,0,8,28,2445,3407 CGGTTCCGGCTTCTTG-1,0,9,29,2565,3476 GACGTGAGACTCCATG-1,0,8,30,2445,3545 TCGTTGGCTCGTCAAT-1,0,9,31,2565,3614 GGTGAACGGGCTAGCC-1,0,8,32,2445,3682 GCACTGTGCAAATGTA-1,0,9,33,2565,3751 ACGAGAACCCATCACG-1,0,8,34,2445,3820 CCAGCTACGCCTCATA-1,0,9,35,2565,3889 TCCCGGTCAGGAATTT-1,0,8,36,2445,3958 TCGCATTCAATGACTT-1,0,9,37,2565,4026 CTGGTTCAACGCATCA-1,0,8,38,2445,4095 GGTGATTTCATCTTGT-1,0,9,39,2565,4164 CACCCTTTCCTCGCTC-1,0,8,40,2445,4233 CAACTTGTAGTGGGCA-1,0,9,41,2565,4302 AATATCAAGGTCGGAT-1,0,8,42,2445,4371 ACTCAGACCTGCTTCT-1,0,9,43,2565,4439 TTGGAGTCTCCCTTCT-1,0,8,44,2445,4508 GGATACTCATGAATTG-1,0,9,45,2565,4577 TGGGCACAAACAGAAC-1,0,8,46,2445,4646 GAGCCACGGTAGTAGG-1,0,9,47,2565,4715 TCGATAGGCTAGTCGC-1,0,8,48,2445,4784 TAACCGCCCGCAGTGC-1,0,9,49,2565,4852 GCCTATTTGCTACACA-1,0,8,50,2445,4921 TTGACGATTCAGCACG-1,0,9,51,2565,4990 TTAAACCGGTAGCGAC-1,0,8,52,2445,5059 ACCGAAAGGGCCCTGC-1,0,9,53,2565,5128 ACGTTCCGCGCTCCGT-1,0,8,54,2445,5197 ATACCAGGCTAATAGA-1,0,9,55,2565,5265 CGGCTTTGTATGATAA-1,0,8,56,2445,5334 CTTGACCCGAAAGATA-1,0,9,57,2565,5403 CGCAGAAACATTTGCG-1,0,8,58,2445,5472 GACCCGTCGCCGGCTA-1,0,9,59,2565,5541 AATCGGGACACTACGA-1,0,8,60,2445,5610 GTCACAAAGTTTCCAA-1,0,9,61,2565,5678 TATATTCGCGTCGATA-1,0,8,62,2445,5747 CCTCCCGACAATCCCT-1,0,9,63,2565,5816 CGACATGCGATCTTCT-1,0,8,64,2445,5885 AACACGACTGTACTGA-1,0,9,65,2565,5954 CCCAACCACACTAACA-1,0,8,66,2445,6023 CACCGCCGACCAGCGA-1,0,9,67,2565,6091 TGGTATCGCATCCCAA-1,0,8,68,2445,6160 CAGAGTGATTTAACGT-1,0,9,69,2565,6229 AACCCTGGTGGAACCA-1,0,8,70,2445,6298 GTCAGTTGTGCTCGTT-1,0,9,71,2565,6367 ATTGACGTAACTCGGT-1,0,8,72,2445,6435 GATGTCGGTCAACTGC-1,0,9,73,2565,6504 AGGGCAGCGGCGTGGT-1,0,8,74,2445,6573 ACATCGTTAACCTAGT-1,0,9,75,2565,6642 TCCATTGTGACCTCGT-1,0,8,76,2445,6711 TGTTTAATACTTCATC-1,0,9,77,2565,6780 TTGCTGGCCGGGCTTC-1,0,8,78,2445,6848 CATATTATTTGCCCTA-1,0,9,79,2565,6917 CTGCCTAGCCACCAAG-1,0,8,80,2445,6986 ACGAGATATTTGCTTA-1,0,9,81,2565,7055 GACTACAATTGCTCGT-1,0,8,82,2445,7124 AACGTGATGAAGGACA-1,0,9,83,2565,7193 ACTCTCTTATACACGA-1,0,8,84,2445,7261 CGCATCATGGCTTCAG-1,0,9,85,2565,7330 CGGCTCTTCGTCGAAC-1,0,8,86,2445,7399 ATTCTTCGTACTTATG-1,0,9,87,2565,7468 AGTGAGGGTTTCTGAC-1,0,8,88,2445,7537 GCCAGGCGTTCGCATG-1,0,9,89,2565,7606 GACTAACACAGCACCT-1,0,8,90,2445,7674 CAATGGAATCTACATA-1,0,9,91,2565,7743 GTGGTCAGCGAAGTAT-1,0,8,92,2445,7812 ATGGCTGGAAATGGCC-1,0,9,93,2565,7881 ATCAGGTCGCCATTGC-1,0,8,94,2445,7950 TATCACCATGTAAAGT-1,0,9,95,2565,8019 AGCGCTTATGGGCAAG-1,0,8,96,2445,8087 AAGCGGCGTCATGGGT-1,0,9,97,2565,8156 ACTAATACGTCAGGCG-1,0,8,98,2445,8225 GGCTGAGCATCGTAAG-1,0,9,99,2565,8294 CGGTTGGGTTCAAGTT-1,0,8,100,2445,8363 GACTGATTGGTCACAA-1,0,9,101,2565,8432 AGACGGGCCGATTTAA-1,0,8,102,2445,8500 ACCAGTGCCCGGTCAA-1,0,9,103,2565,8569 GTCCTTTAATGACTTC-1,0,8,104,2445,8638 CCTACAAGTCCGGAAT-1,0,9,105,2565,8707 GCCTGCTACACTGAGA-1,0,8,106,2445,8776 GACTCGGTCGGCGGAT-1,0,9,107,2565,8845 CTAGACATATATGTAG-1,0,8,108,2445,8913 TCGCCCAACTGACTCC-1,0,9,109,2565,8982 AAACTAACGTGGCGAC-1,0,8,110,2445,9051 AACTGAGGTCAGCGTC-1,0,9,111,2565,9120 ACAATGATTCTTCTAC-1,0,8,112,2445,9189 ATAAGTACCCGATTGT-1,0,9,113,2565,9257 ATTGGGAGTTCTGTAA-1,0,8,114,2445,9326 CGAACATAGTCAGAAA-1,0,9,115,2565,9395 TAGCTCAGATCCTAGT-1,0,8,116,2445,9464 GTGTCGTATTCACCTT-1,0,9,117,2565,9533 CTCACCGATCCAAACT-1,0,8,118,2445,9602 ATATGTGCACAAACCA-1,0,9,119,2565,9670 CAGTCCAACGCCTTCT-1,0,8,120,2445,9739 TCGTCCGGGTACACTC-1,0,9,121,2565,9808 GCAGAAACGTAATCCA-1,0,8,122,2445,9877 TTCGAGCCGGCGCTAC-1,0,9,123,2565,9946 GGAAGATAAGACTGTA-1,0,8,124,2445,10015 ATAAGCAAACACCGAG-1,0,9,125,2565,10083 GCATAAATTGAACGCC-1,0,8,126,2445,10152 CGCCGGTGTCGCAGTA-1,0,9,127,2565,10221 GACCTGGTCTGGGCGT-1,0,10,0,2685,1480 AGCCGCTTGATTAGCG-1,0,11,1,2805,1549 CCCGGCTAGGTGAGAA-1,0,10,2,2685,1617 CGAGCCGAGCACTCGA-1,0,11,3,2805,1686 TAGTGCTTGAATCCTT-1,0,10,4,2685,1755 CAACCGCACCTAGACA-1,0,11,5,2805,1824 ACCACTGTTCAAGAAG-1,0,10,6,2685,1893 AGATGCTATAACGAGC-1,0,11,7,2805,1962 AATTACTCGTACGCTC-1,0,10,8,2685,2030 CGTCAATCTTTAACAT-1,0,11,9,2805,2099 CCAAAGCAGTTGGTTG-1,0,10,10,2685,2168 CCATATTGGATCATGA-1,0,11,11,2805,2237 CGTACCGAAAGTCTAG-1,0,10,12,2685,2306 CTCGAGATCCAAAGCA-1,0,11,13,2805,2375 TGGATAGAGTAACAGA-1,0,10,14,2685,2443 TCACAGATCCTCAAAC-1,0,11,15,2805,2512 AGAGCTACGAAAGCAT-1,0,10,16,2685,2581 TGCGTGATTGGGTGTC-1,0,11,17,2805,2650 CACATGTTTGGACATG-1,0,10,18,2685,2719 TTCGCATCCGGAAGCA-1,0,11,19,2805,2788 CCCTAGTGTCAGGTGT-1,0,10,20,2685,2856 TTACCGCCTTAGGGAA-1,0,11,21,2805,2925 CCAGTCCATTATTCGA-1,0,10,22,2685,2994 CGTAAACGCTTGAGTG-1,0,11,23,2805,3063 ATTCCTTCCAGGCGGT-1,0,10,24,2685,3132 TTCCTTTCTGTGTTGC-1,0,11,25,2805,3201 AGTTGACATCGGCTGG-1,0,10,26,2685,3269 AACTCGATGGCGCAGT-1,0,11,27,2805,3338 GATAAGGCAGATGCAA-1,0,10,28,2685,3407 GGCTGGCTAGCTTAAA-1,0,11,29,2805,3476 CCTCATGCAGCTACGA-1,0,10,30,2685,3545 GACGCCTGTTGCAGGG-1,0,11,31,2805,3614 TAATTAGATGGATATG-1,0,10,32,2685,3682 GAGGGCATCGCGTATC-1,0,11,33,2805,3751 CTTGTGAGTCTTTGAC-1,0,10,34,2685,3820 TCAACACATTGGGTAA-1,0,11,35,2805,3889 ACTGTATACGCGAGCA-1,0,10,36,2685,3958 GTGAAACGTGCTCCAC-1,0,11,37,2805,4026 CGAGTGCTATAGTTCG-1,0,10,38,2685,4095 GTACTGCATGAAGCGT-1,0,11,39,2805,4164 GTAACTTGCGGCAGTC-1,0,10,40,2685,4233 GAATCGCCGGACACGG-1,0,11,41,2805,4302 GGGAGTAATGGCTGGC-1,0,10,42,2685,4371 CATGAACCGACATTTG-1,0,11,43,2805,4439 TCTGTCATACAAGAGC-1,0,10,44,2685,4508 GTCGTCAATTATAAGG-1,0,11,45,2805,4577 TAAAGAGCCCGAAACC-1,0,10,46,2685,4646 GTACTGAGGTCGTAAC-1,0,11,47,2805,4715 AAAGACCCAAGTCGCG-1,0,10,48,2685,4784 CGTCAGTGCGCACAAG-1,0,11,49,2805,4852 TGTATCCTTATTCCAT-1,0,10,50,2685,4921 ATTCTCGTCTCTTTAG-1,0,11,51,2805,4990 AAAGTCACTGATGTAA-1,0,10,52,2685,5059 TGTCTACAGTTTCTGT-1,0,11,53,2805,5128 TTAACGTCGCAAGACC-1,0,10,54,2685,5197 CTATGTCTATTGAAAC-1,0,11,55,2805,5265 TCGGGTGAAACTGCTA-1,0,10,56,2685,5334 TGTCCCGACATAGCAC-1,0,11,57,2805,5403 ACAGCATAGAGCCAGT-1,0,10,58,2685,5472 ATATTCCCACAGGTCA-1,0,11,59,2805,5541 TTGGATCGACTTCTGG-1,0,10,60,2685,5610 CACCATCGGAGGAGAC-1,0,11,61,2805,5678 TCGTTCGTTATTATGT-1,0,10,62,2685,5747 CTTAACTTCGAAGTAC-1,0,11,63,2805,5816 GCACAAGTGTCGGAAG-1,0,10,64,2685,5885 TACCAGCTAGGTTTAA-1,0,11,65,2805,5954 ACGTACAGATTTCTCT-1,0,10,66,2685,6023 AATTTGGTTCCAAAGA-1,0,11,67,2805,6091 GTAAGGATTTGTCGGA-1,0,10,68,2685,6160 CATCATCTACCCGGAC-1,0,11,69,2805,6229 ACGATGGATCCGATGC-1,0,10,70,2685,6298 CACTCAGCTCTTGAGG-1,0,11,71,2805,6367 TAGATCCGAAGTCGCA-1,0,10,72,2685,6436 TGAAACTTATGCAAGC-1,0,11,73,2805,6504 GCGATTCTGGAAGCAG-1,0,10,74,2685,6573 CAAACTATTGAGCTTC-1,0,11,75,2805,6642 TAGAATTAAGGGCAAC-1,0,10,76,2685,6711 CGAAACATAGATGGCA-1,0,11,77,2805,6780 GATGGTGCCCTAGGCA-1,0,10,78,2685,6848 CCCGCAGGGCCCAAAG-1,0,11,79,2805,6917 ACAGCGCACCCGCAGC-1,0,10,80,2685,6986 GGTAAATGTGCGTTAC-1,0,11,81,2805,7055 GTCCTTCTAGTGGGTT-1,0,10,82,2685,7124 GGAAGCTCGCTTACAG-1,0,11,83,2805,7193 CACCGATACACCGAGC-1,0,10,84,2685,7261 CAGCCGGGCCCTCTAT-1,0,11,85,2805,7330 CGGAGCTTATAACACC-1,0,10,86,2685,7399 ATTACAACTACCGGCC-1,0,11,87,2805,7468 TCCTCTGGCCCATTAG-1,0,10,88,2685,7537 CGGCACCGTTAGCGCC-1,0,11,89,2805,7606 TCGGTCCCTGACTCCA-1,0,10,90,2685,7674 TGGTTGGAGGATCCTG-1,0,11,91,2805,7743 CTGCGGTAGTCACGTG-1,0,10,92,2685,7812 GTGCCTCAGTGTACGG-1,0,11,93,2805,7881 ATCGTTCACTTTCGCC-1,0,10,94,2685,7950 ACTTACCGGGCGCGCA-1,0,11,95,2805,8019 CTAGACTGCATTTCGT-1,0,10,96,2685,8087 TTGCCGGTGATCCCTC-1,0,11,97,2805,8156 CTGTCACGCCAGGCGC-1,0,10,98,2685,8225 CGGTATAGGTATTAGC-1,1,11,99,2805,8294 CCAACGCTTGCCAGGG-1,0,10,100,2685,8363 CGTTGAGTAATTGCGT-1,1,11,101,2805,8432 TGTATTTACCTAATGC-1,0,10,102,2685,8500 TAAATGCCGTCTCATG-1,1,11,103,2805,8569 CGGTTTATGAAGGAAC-1,0,10,104,2685,8638 GCAAGATGTGTTCGCG-1,1,11,105,2805,8707 AAAGGTAAGCTGTACC-1,0,10,106,2685,8776 GTACGTCACGTATTAA-1,1,11,107,2805,8845 AGTACCTTCGAGTGCT-1,0,10,108,2685,8913 ATTGTGACTTCGCTGC-1,1,11,109,2805,8982 TGTATCAGACTGAAGC-1,1,10,110,2685,9051 GAGACCCTGCAACGCC-1,1,11,111,2805,9120 TGGGTGGGATGTCATT-1,1,10,112,2685,9189 GGCTAATGATTGAAAT-1,1,11,113,2805,9258 ATAACGTTACCTCCAC-1,1,10,114,2685,9326 TGCGAGATGGCGGCCA-1,1,11,115,2805,9395 CACACTTGTATTGCGA-1,0,10,116,2685,9464 GCTGGTGACTCGTAGT-1,1,11,117,2805,9533 CGACACCGCTTAAGGA-1,0,10,118,2685,9602 GTAACAACTGACCTTG-1,0,11,119,2805,9670 CAACTGAGGGTATGAC-1,0,10,120,2685,9739 CTAATTATGAAGCGTA-1,0,11,121,2805,9808 CCGATCTTAAGAGGCT-1,0,10,122,2685,9877 CGACTCGGTACACGGT-1,0,11,123,2805,9946 TGCTGCGTCAGAGTTA-1,0,10,124,2685,10015 AGAGTTGCAGGCCTCC-1,0,11,125,2805,10083 ACTGGCGAACCTGCGT-1,0,10,126,2685,10152 ACTAAGGACGCACACC-1,0,11,127,2804,10221 CGTCCAGATGGCTCCA-1,0,12,0,2925,1480 ACTATCGCCGGCTAAA-1,0,13,1,3044,1549 GATAGCGTACCACGCG-1,0,12,2,2925,1617 AGGACTTATAGGAGAA-1,0,13,3,3044,1686 TAGTCGGGATTCTTCG-1,0,12,4,2925,1755 ACCATTAAGGGTGTCA-1,0,13,5,3044,1824 TTAATGTGTTTGCAGG-1,0,12,6,2925,1893 TCCGCAGCCACCTAGC-1,0,13,7,3044,1962 GAGGAGATCCTCATGC-1,0,12,8,2925,2030 GGTCCTTCATACGACT-1,0,13,9,3044,2099 CCCTGTTGGCAAAGAC-1,0,12,10,2925,2168 GTGCCTAGCTATGCTT-1,0,13,11,3044,2237 GTCATCTCCTACAGCT-1,0,12,12,2925,2306 GCGAGAAACGGGAGTT-1,0,13,13,3044,2375 CGTCGCGGCGGGATTT-1,0,12,14,2925,2443 CATTGTGTGCTAGATC-1,0,13,15,3044,2512 CGCGGCAGTATTACGG-1,0,12,16,2925,2581 GAAATGGGATGTAAAC-1,0,13,17,3044,2650 CATTCCCTAAGTACAA-1,0,12,18,2925,2719 AGTTCTGCGTTGTATC-1,0,13,19,3044,2788 ACCCTATAGGACTGAG-1,0,12,20,2925,2856 TTAGATAGGTCGATAC-1,0,13,21,3044,2925 ATTGATAGCAACGAGA-1,0,12,22,2925,2994 TCTCGGCTCCAGGACT-1,0,13,23,3044,3063 CTTGAGGTTATCCCGA-1,0,12,24,2925,3132 AAGAAGGATCAGTTAG-1,0,13,25,3044,3201 GTACGACGGCGCTGCG-1,0,12,26,2925,3269 CTTATGTTGACTACCA-1,0,13,27,3044,3338 CGGCACTCAAGAAAGT-1,0,12,28,2925,3407 GTCAAAGTTTACATAG-1,0,13,29,3044,3476 CTCCTAAGTTATGTCT-1,0,12,30,2925,3545 ACTGTGCTAGTAGATC-1,0,13,31,3044,3614 GTTTGGCCGCTCAGCG-1,0,12,32,2925,3682 TTATCCAATCGAACTC-1,0,13,33,3044,3751 CCGTACCCAAGCGCCA-1,0,12,34,2924,3820 CATACAAAGCCGAACC-1,0,13,35,3044,3889 GGTCGGTAATTAGACA-1,0,12,36,2924,3958 AGCGGGAAGGGTCCAT-1,0,13,37,3044,4027 GCCCACCAAGGCTGTC-1,0,12,38,2924,4095 GTAGACGTCGTTACAT-1,0,13,39,3044,4164 GAGCATCATCCCTGGG-1,0,12,40,2924,4233 AGGTAACCTCCTATTC-1,0,13,41,3044,4302 GGTTTGAGTGCTGGAA-1,0,12,42,2924,4371 GCACTAGTCGCGCTAT-1,0,13,43,3044,4439 GGTAACTATGTATCTG-1,0,12,44,2924,4508 GCGGTCCCTAGACGCA-1,0,13,45,3044,4577 CGAGCGTTGATCAGCC-1,0,12,46,2924,4646 AATCCAAGGGCCTGAG-1,0,13,47,3044,4715 CCGTGCCCATGACGGC-1,0,12,48,2924,4784 GAAATTCACATCGCTG-1,0,13,49,3044,4852 CTCTGCGAAGCAAGCA-1,0,12,50,2924,4921 AGTAGGTAACATACAT-1,0,13,51,3044,4990 ATTGGGAATATCTTGG-1,0,12,52,2924,5059 TAGAGCTACGAAGAAC-1,0,13,53,3044,5128 TGCGGCATAGTTCAAC-1,0,12,54,2924,5197 CCGCCGGTCAACACAC-1,0,13,55,3044,5265 TCGTATAGTGCAATTA-1,0,12,56,2924,5334 TAGTTTATTCTTGCTT-1,0,13,57,3044,5403 GATATCTCATGCAATA-1,0,12,58,2924,5472 CGTTTAAGCGGAGCAC-1,0,13,59,3044,5541 CATGCTGGCTCCAATT-1,0,12,60,2924,5610 GAAACAGCCATGCAGT-1,0,13,61,3044,5678 AGTTTCGCAGGTCGGA-1,0,12,62,2924,5747 CTCATGGCTCACAATC-1,0,13,63,3044,5816 AACCGTTGTGTTTGCT-1,0,12,64,2924,5885 ACCCTTCATCTGCGAA-1,0,13,65,3044,5954 TGCGGTGAAATTTCAT-1,0,12,66,2924,6023 CAAATTGTCAGCAAGC-1,0,13,67,3044,6091 GAGGTACATCCATCTT-1,0,12,68,2924,6160 AAATGGCATGTCTTGT-1,0,13,69,3044,6229 TCATCCCAGAGGGTGG-1,0,12,70,2924,6298 CGTAGCGAATTGTCAG-1,0,13,71,3044,6367 CCTAGTTAGTCGCATG-1,0,12,72,2924,6436 GAAACTCTAATGAAGG-1,0,13,73,3044,6504 TTGTATCACACAGAAT-1,0,12,74,2924,6573 TTCAAGCCGAGCTGAG-1,0,13,75,3044,6642 AGGTACGATATTGCCA-1,0,12,76,2924,6711 TTAAGCCGACAACTTC-1,0,13,77,3044,6780 GTCTTAGTACAGCCGG-1,0,12,78,2924,6848 TGGGTAAGGTTCCCGC-1,0,13,79,3044,6917 CTACGCCATTTCCGAT-1,0,12,80,2924,6986 GACCGTCAGGTCGTGA-1,0,13,81,3044,7055 TAGTTAAGATAGGATA-1,0,12,82,2924,7124 GAATATTCGGAGTCCC-1,0,13,83,3044,7193 CAAACTACGATAGAGA-1,0,12,84,2924,7261 CAGGAAGACTTTATAT-1,0,13,85,3044,7330 TTCGTAATCCCAGCGG-1,0,12,86,2924,7399 GTGAGGAGCGGTTGAG-1,1,13,87,3044,7468 CAATCCCTATACCAGC-1,1,12,88,2924,7537 AGGGAAACGAGGTACT-1,1,13,89,3044,7606 TCCTGCCAACTGGAGA-1,1,12,90,2924,7674 AATTTGGGACATAGTA-1,1,13,91,3044,7743 AACTCCTAATCCCATG-1,1,12,92,2924,7812 GCTCATTACTGCATGT-1,1,13,93,3044,7881 TCTCGAACGAGGTCAC-1,1,12,94,2924,7950 TCACTACGACCAATGC-1,1,13,95,3044,8019 GTGATGCACAACATCT-1,1,12,96,2924,8087 CCGACGTAAACACAAC-1,1,13,97,3044,8156 TGGGATGCACTCATTC-1,1,12,98,2924,8225 TTCCATCATGCGGTGA-1,1,13,99,3044,8294 TGCACAGTGAAGTTAT-1,1,12,100,2924,8363 CTATTGTGTTTGGTCA-1,1,13,101,3044,8432 TGCGAGCCCTTCCGCG-1,1,12,102,2924,8500 TTGAAAGGTGTAAAGG-1,1,13,103,3044,8569 GGTGCAGAGCCTATCG-1,1,12,104,2924,8638 ACTATATGCTGTGTTC-1,1,13,105,3044,8707 TCCTGGCGCTGCCTGG-1,1,12,106,2924,8776 GAGCCGAGCGTTTATT-1,1,13,107,3044,8845 AGAATGCGGGTTCGGA-1,1,12,108,2924,8913 ATGCGACAATTGGTCC-1,1,13,109,3044,8982 TTCCGGCTCGACTTCT-1,1,12,110,2924,9051 TGATTATGGCACGCAG-1,1,13,111,3044,9120 GGTTTGACAAGAAGCT-1,1,12,112,2924,9189 GCAGCTATGGACAGGT-1,1,13,113,3044,9258 CACCATGATCGCAAAG-1,1,12,114,2924,9326 GTCGGAAGGATACCAG-1,1,13,115,3044,9395 GGCCCAGTTATCAGCA-1,0,12,116,2924,9464 GGGCCTATTTAAGTAT-1,0,13,117,3044,9533 GTTGTTACATTGCGCT-1,0,12,118,2924,9602 CAACTCCGTAACTTGC-1,0,13,119,3044,9670 GATCTTTGCTCAAAGA-1,0,12,120,2924,9739 TCGCTTAATTACGAAG-1,0,13,121,3044,9808 CGATCATTAGAGGCAC-1,0,12,122,2924,9877 TGTTCTCTACTCCCTA-1,0,13,123,3044,9946 GCTTAGGGAAGCGGTA-1,0,12,124,2924,10015 CAGGTTTAGTACTACA-1,0,13,125,3044,10083 AAGCGGAGTGCGCGCA-1,0,12,126,2924,10152 TCAGATGGAGACGTAG-1,0,13,127,3044,10221 TCGCACTAACGTTTGT-1,0,14,0,3164,1480 CACGTCGGGTTCTAGA-1,0,15,1,3284,1549 GGAGTACACATGAGCT-1,0,14,2,3164,1617 GTGTGTCGACGTCGCT-1,0,15,3,3284,1686 GAAGCTCTTTGCTTAG-1,0,14,4,3164,1755 ACACCGAGCGCTCTTT-1,0,15,5,3284,1824 CGTAATAATTACGAGT-1,0,14,6,3164,1893 CATCAACACCTACTAA-1,0,15,7,3284,1962 CCAAGTTTCTACAGAT-1,0,14,8,3164,2030 ACGGGTCATGTGACTT-1,0,15,9,3284,2099 AGTGTGCTAAGATCGC-1,0,14,10,3164,2168 GGCGGTTTGCCGGTGC-1,0,15,11,3284,2237 GTATAATCTCCCGGAT-1,0,14,12,3164,2306 TAGTCCGTATGCATAA-1,0,15,13,3284,2375 CACTTCGTCTTATCTC-1,0,14,14,3164,2443 CATCCGCAGGCCCGAA-1,0,15,15,3284,2512 CCCTGATGTAACTCGT-1,0,14,16,3164,2581 CCATAGTCAGTAACCC-1,0,15,17,3284,2650 CGGGCCATAGCCGCAC-1,0,14,18,3164,2719 CTCCGGCTTGTAGACA-1,0,15,19,3284,2788 AACTTGCGTTCTCGCG-1,0,14,20,3164,2856 AATGAGTTCGCATATG-1,0,15,21,3284,2925 CGAGGCCAGGCATTGG-1,0,14,22,3164,2994 TCTGCGTCCGGTTTCT-1,0,15,23,3284,3063 CAATCCTGCCGTGGAG-1,0,14,24,3164,3132 CTGAGCAAGTAACAAG-1,0,15,25,3284,3201 GGGTACCCACGGTCCT-1,0,14,26,3164,3269 ACGGAATTTAGCAAAT-1,0,15,27,3284,3338 GGGCGGTCCTATTGTC-1,0,14,28,3164,3407 ATGTTACGAGCAATAC-1,0,15,29,3284,3476 AACCATGGGATCGCTA-1,0,14,30,3164,3545 TCGCATCCCTAAGTGT-1,0,15,31,3284,3614 ACTTAGTACGACAAGA-1,0,14,32,3164,3682 GAGCTCTCGGACCTAA-1,0,15,33,3284,3751 TCTATTACGCTGGCGA-1,0,14,34,3164,3820 AGATACGACTTCATAT-1,0,15,35,3284,3889 CGCTATACCGCCCACT-1,0,14,36,3164,3958 CAGTGTCCGCAGAATG-1,0,15,37,3284,4027 CCATCCATACCAAGTC-1,0,14,38,3164,4095 AACCCAGAGACGGAGA-1,0,15,39,3284,4164 GAAGAACGGTGCAGGT-1,0,14,40,3164,4233 GATAAATCGGTGGATG-1,0,15,41,3284,4302 CAGCTCGTGCTTGTGT-1,0,14,42,3164,4371 GAGTACGGGTATACAA-1,0,15,43,3284,4439 CATCGCCCGCGGCCAA-1,0,14,44,3164,4508 TCTTACAGAGGTACCG-1,0,15,45,3284,4577 TGGAAGACGAACACCA-1,0,14,46,3164,4646 GTTGTCGTGTTAGTTG-1,0,15,47,3284,4715 CCAAGGAACAGAGAGG-1,0,14,48,3164,4784 CTGCACCTGGAACCGC-1,0,15,49,3284,4852 CGCTTTCATACCGGTG-1,0,14,50,3164,4921 GTTCTTCCCTCGATGT-1,0,15,51,3284,4990 ATTTAACTCGTATTAC-1,0,14,52,3164,5059 AACGATAGAAGGGCCG-1,0,15,53,3284,5128 TATCCTGCATGGGAAT-1,0,14,54,3164,5197 AGGCCCATTGTACAGG-1,0,15,55,3284,5265 CCGGCGCATATTGGAT-1,0,14,56,3164,5334 ATCTGTAATTGTACCC-1,0,15,57,3284,5403 GAGCGAGGGAGTACCG-1,0,14,58,3164,5472 TTATTAGGGAAGCATC-1,0,15,59,3284,5541 CTTCTTACGTCGTATA-1,0,14,60,3164,5610 GAAGTGCTGGATAGCT-1,0,15,61,3284,5678 GTGCAACAAATGTGGC-1,0,14,62,3164,5747 CATGCGTTAGACAGAA-1,0,15,63,3284,5816 ACACACTTTCTACACG-1,0,14,64,3164,5885 AGCCCTAAGCGAAGTT-1,0,15,65,3284,5954 ATTAATTCGGTCACTC-1,0,14,66,3164,6023 AACAGGAAATCGAATA-1,0,15,67,3284,6091 ACGTTTAGTTGTGATC-1,0,14,68,3164,6160 TCCTTCAGTGGTCGAA-1,0,15,69,3284,6229 CGAACGCCCAGTGCCG-1,0,14,70,3164,6298 CCTCGAAGTGGACGGG-1,0,15,71,3284,6367 CTCTGTTTGAGGATTC-1,0,14,72,3164,6436 TGGGCACGTTCTATGG-1,0,15,73,3284,6504 ACTATTCGTCCGTGGT-1,0,14,74,3164,6573 CCTCTGGCCTAGACGG-1,1,15,75,3284,6642 CCATAAACAACCCGAC-1,0,14,76,3164,6711 CATAGTACATTGAGAG-1,1,15,77,3284,6780 ATTTCATTATTTCGCG-1,0,14,78,3164,6848 CAACTATATCGAATGC-1,1,15,79,3284,6917 CTAGTATTCGGAATTA-1,0,14,80,3164,6986 GTGGAACCTACATGCG-1,1,15,81,3284,7055 CCTAAAGGCTGACGCT-1,1,14,82,3164,7124 CGTGACATTGGGTCGT-1,1,15,83,3284,7193 CCAATCGGTAGATCGA-1,1,14,84,3164,7261 ATTGTCGCAATACCTT-1,1,15,85,3284,7330 AAATTACACGACTCTG-1,1,14,86,3164,7399 CACTCCTCTCGGTCGG-1,1,15,87,3284,7468 AAATAACCATACGGGA-1,1,14,88,3164,7537 AGTTACTCTATCGTGG-1,1,15,89,3284,7606 CGTTAGCTCACAACTG-1,1,14,90,3164,7674 GAATGTATGGCAGGTC-1,1,15,91,3284,7743 GCAACCACCAGACCGG-1,1,14,92,3164,7812 TCACTCGTGCAACGGC-1,1,15,93,3284,7881 AAACAGAGCGACTCCT-1,1,14,94,3164,7950 CAGCCTCTCCTCAAGA-1,1,15,95,3284,8019 TTGCGTGAACGCTTAG-1,1,14,96,3164,8087 CCGCCTGCGAATTGGT-1,1,15,97,3284,8156 AGATGAGGGTTGCGAT-1,1,14,98,3164,8225 CGGTGGGCTCCAGCCT-1,1,15,99,3284,8294 GGCAGCGGTAATCCTA-1,1,14,100,3164,8363 GCTAGCAGGGAGTGGG-1,1,15,101,3284,8432 CTCAAGACATTAGCGC-1,1,14,102,3164,8500 CACGGCGCGCCAAAGG-1,1,15,103,3284,8569 TGCAATTTGGGCACGG-1,1,14,104,3164,8638 ATGCCAATCGCTCTGC-1,1,15,105,3284,8707 GCTGGACCCAAAGTGG-1,1,14,106,3164,8776 ATTCCTAAGACGTGGA-1,1,15,107,3284,8845 TCCGGAGGAAGGGCTG-1,1,14,108,3164,8913 TCGGTGACCGCTCCGG-1,1,15,109,3284,8982 TCCGAAGTAGTCACCA-1,1,14,110,3164,9051 CATGTAGGAGCGCCAA-1,1,15,111,3284,9120 CACAAGAAAGATATTA-1,1,14,112,3164,9189 AGGGTCAGTAACCCTA-1,1,15,113,3284,9258 TAAGCCCTTACGACCA-1,1,14,114,3164,9326 ATACCGTCATCCATAA-1,1,15,115,3284,9395 GGACGTCCATAGTTGG-1,1,14,116,3164,9464 CATCAAACTGGCGCCC-1,0,15,117,3284,9533 AAACGTGTTCGCCCTA-1,0,14,118,3164,9602 AAATTGGTGAGAAGCA-1,0,15,119,3284,9670 GGTCATTGTAGTCATA-1,0,14,120,3164,9739 TGCAGTGAGGCTCGGG-1,0,15,121,3284,9808 GAACATTAGTATGTTA-1,0,14,122,3164,9877 GGTTTGCGAACACGTA-1,0,15,123,3284,9946 ACACAAATATTCCTAG-1,0,14,124,3164,10015 TTGGGTTTATTCAGCG-1,0,15,125,3284,10083 ATTCGCAGAGGACACT-1,0,14,126,3164,10152 GATTTAGTGCGTACTG-1,0,15,127,3284,10221 TAGAAACACAATAGTG-1,0,16,0,3404,1480 CAGTAGATGATGTCCG-1,0,17,1,3523,1549 TCTTAACTCGGATGTA-1,0,16,2,3404,1617 TACATCTTGTTTCTTG-1,0,17,3,3523,1686 TTCATAGGGTGTCCAT-1,0,16,4,3404,1755 TGAAGTAGCTTACGGA-1,0,17,5,3523,1824 GCACAAGTGGATCATA-1,0,16,6,3404,1893 GGGCGAATTTCTCCAC-1,0,17,7,3523,1962 ATGTTCCTGCCCACCT-1,0,16,8,3404,2030 GCTCAACCTCTTAGAG-1,0,17,9,3523,2099 ATAGCTGCTCTTGTTA-1,0,16,10,3404,2168 CGTCAGCTATTTACTC-1,0,17,11,3523,2237 ATCTGATAGTGTCTTA-1,0,16,12,3404,2306 TGCACTATGTGAGTGC-1,0,17,13,3523,2375 CCGACAAACACATGAG-1,0,16,14,3404,2443 GCCTTGTATATGCAGT-1,0,17,15,3523,2512 ATAATACCGTTAGCCG-1,0,16,16,3404,2581 ACACTCCAATGTCACT-1,0,17,17,3523,2650 AGTTGCTGACTGATAT-1,0,16,18,3404,2719 GGCGCTCCTCATCAAT-1,0,17,19,3523,2788 TGCCTGACATCGGTCA-1,0,16,20,3404,2856 TTGGCCATCTTGCGCT-1,0,17,21,3523,2925 CAGTGGTTGCACATGA-1,0,16,22,3404,2994 AGAATTGTTTGACATA-1,0,17,23,3523,3063 AAATGCTCGTTACGTT-1,0,16,24,3404,3132 CACCTAATAGAGTCGT-1,0,17,25,3523,3201 CATTTCTAGCAGACTA-1,0,16,26,3404,3269 CCGAAAGTGGTGAGCA-1,0,17,27,3523,3338 AGTCAGCCACCGCCTG-1,0,16,28,3404,3407 TCATCACTCGAGCTCG-1,0,17,29,3523,3476 CTCAGGACTCACCTGT-1,0,16,30,3404,3545 CGGTGTACTTGATCCC-1,0,17,31,3523,3614 CCTACGGCTCAGTCGA-1,0,16,32,3404,3682 GTACTTGGGCACTTCT-1,0,17,33,3523,3751 TGATTTCCTCCTGACG-1,0,16,34,3404,3820 CCTCACCAATCTTGAC-1,0,17,35,3523,3889 GGTGAGATGCAGATAA-1,0,16,36,3404,3958 GCTAGTTTCATTGAGG-1,0,17,37,3523,4027 AGGACATCGCACGTCG-1,0,16,38,3404,4095 GTGGACGTGCTGAGAC-1,0,17,39,3523,4164 TAAGGAACTTGTGGGA-1,0,16,40,3404,4233 TCGCTGTGCGTAAATC-1,0,17,41,3523,4302 GCATCCCTAACTTTGA-1,0,16,42,3404,4371 CACCCACACGTCACCC-1,0,17,43,3523,4439 CCCTCATTCTGGAATT-1,0,16,44,3404,4508 AGGGCGTGATCGGCTA-1,0,17,45,3523,4577 GGTGCGGATAAGTGGC-1,0,16,46,3404,4646 TAATATTGAAATTCGC-1,0,17,47,3523,4715 CTTACACTGGGAAATA-1,0,16,48,3404,4784 ACCAAGAACGCGTGTC-1,0,17,49,3523,4852 GCCTTCAGCCCTACCG-1,0,16,50,3404,4921 GATGCTACAAGCGCCT-1,0,17,51,3523,4990 CCGGGACCCGCAGAGA-1,0,16,52,3404,5059 GTTCCAGTCTGACCAT-1,0,17,53,3523,5128 ATGATCGGGAATAGAC-1,0,16,54,3403,5197 TTGGATTGGGTACCAC-1,0,17,55,3523,5265 TACCTCACGCTTGTAC-1,0,16,56,3403,5334 CATGGCAGGAAGATCG-1,0,17,57,3523,5403 ATGACGCCGGCTCTAA-1,0,16,58,3403,5472 AGCGACATCCCATTCA-1,0,17,59,3523,5541 AGTAATGTCTTGCCGC-1,0,16,60,3403,5610 TTCTTAGTGGCTCAGA-1,0,17,61,3523,5678 CGTCTGGAAGGGCCCG-1,0,16,62,3403,5747 ACGTGCGCCTCGTGCA-1,1,17,63,3523,5816 AGAGCGGGCTAATCAT-1,0,16,64,3403,5885 GCGTCGAAATGTCGGT-1,1,17,65,3523,5954 AACTGATATTAGGCCT-1,0,16,66,3403,6023 CGAGCTGGGCTTTAGG-1,1,17,67,3523,6091 GGGTGTTTCAGCTATG-1,0,16,68,3403,6160 TTAATTTCAGACGCGG-1,1,17,69,3523,6229 ACTGCCGTCGTAACTC-1,1,16,70,3403,6298 GTGCACGAAAGTGACT-1,1,17,71,3523,6367 ATCTCCCTGCAATCTA-1,1,16,72,3403,6436 ACGCCAGATGATTTCT-1,1,17,73,3523,6504 AGCTATTTAATCCAAC-1,1,16,74,3403,6573 CCACGAGAAGAGAATC-1,1,17,75,3523,6642 GATTCCGCGTTTCCGT-1,1,16,76,3403,6711 GTCGGATGTAGCGCGC-1,1,17,77,3523,6780 TATTTATACCGAGTAG-1,1,16,78,3403,6849 GTAGGTGATCCGTGTA-1,1,17,79,3523,6917 AGTTAAGCGGTCCCGG-1,1,16,80,3403,6986 CTGGCGACATAAGTCC-1,1,17,81,3523,7055 TTGGCCTAGAATTTCG-1,1,16,82,3403,7124 GGCATATCGGTTCTGC-1,1,17,83,3523,7193 GGGCGTCCACTGGCTC-1,1,16,84,3403,7261 TTACCCATTGCCGGGT-1,1,17,85,3523,7330 TTAGACACGATCGTTG-1,1,16,86,3403,7399 GCGCTGATCCAGACTC-1,1,17,87,3523,7468 TTCGGCAACCCGCTGA-1,1,16,88,3403,7537 GATATTTCCTACATGG-1,1,17,89,3523,7606 CTGCGTTACGATATAA-1,1,16,90,3403,7674 TAATAAACAAGGAGAT-1,1,17,91,3523,7743 AACCTTTACGACGTCT-1,1,16,92,3403,7812 AGTCCCGCCTTTAATT-1,1,17,93,3523,7881 TGAGATTAGGCCCTAA-1,1,16,94,3403,7950 AGTGTATTGCGCATTG-1,1,17,95,3523,8019 GTTGGATTCAGTGGCT-1,1,16,96,3403,8087 TAAAGCTGCAATAGGG-1,1,17,97,3523,8156 AGTAGGAAGGAAGTTG-1,1,16,98,3403,8225 TATCACTTCGAGTAAC-1,1,17,99,3523,8294 TGATCTACGCTGATCT-1,1,16,100,3403,8363 GGATCATCCCGTACGC-1,1,17,101,3523,8432 TGACACTTCTCTTTGC-1,1,16,102,3403,8500 AGCCCTTCTAATCCGA-1,1,17,103,3523,8569 CACCGCGTCCACTCTA-1,1,16,104,3403,8638 TAATTGGAATCGGGAA-1,1,17,105,3523,8707 TCGTAAGCTCCGAGGA-1,1,16,106,3403,8776 TATATTACAAATGTCG-1,1,17,107,3523,8845 CGCGAGAGGGACTTGT-1,1,16,108,3403,8913 GGACCTACGGTAACGT-1,1,17,109,3523,8982 GAAATATGCTTGAATG-1,1,16,110,3403,9051 CCGTATTAGCGCAGTT-1,1,17,111,3523,9120 AGGCGTCTATGGACGG-1,1,16,112,3403,9189 AACATCGATACGTCTA-1,1,17,113,3523,9258 TGAATATGCTATAAAC-1,1,16,114,3403,9326 ACCAAACACCCAGCGA-1,1,17,115,3523,9395 TGGCTTGTACAAGCTT-1,1,16,116,3403,9464 GAATGAAGGTCTTCAG-1,0,17,117,3523,9533 AGATACCAGCACTTCA-1,0,16,118,3403,9602 GCGGTCCCGGTGAAGG-1,0,17,119,3523,9671 GAGGCATTTGCAGCAG-1,0,16,120,3403,9739 GGCAAGCCAGGGATAG-1,0,17,121,3523,9808 TCTACGGGCTCAGTTG-1,0,16,122,3403,9877 TCTGCGAATCGTTCGC-1,0,17,123,3523,9946 AGCTCGTTGATGGAAA-1,0,16,124,3403,10015 TGAATGAGATACAGCA-1,0,17,125,3523,10083 ACCCTTGCCTGGGTCG-1,0,16,126,3403,10152 GGCGAACCGTTCTGAT-1,0,17,127,3523,10221 GCGATGTCTGTGCTTG-1,0,18,0,3643,1480 ATTAACACCTGAGATA-1,0,19,1,3763,1549 GAAATCTGACCAAGTT-1,0,18,2,3643,1618 CCTGACAAACTCGCGC-1,0,19,3,3763,1686 ATGTCATTTCCCATTG-1,0,18,4,3643,1755 GCGGTGCGGAGCATCG-1,0,19,5,3763,1824 CGGAAAGCAAATGTGC-1,0,18,6,3643,1893 GCTGAGCAACGGTTCT-1,0,19,7,3763,1962 TCACTCTTCGTCTGTC-1,0,18,8,3643,2030 GATCTTCATTGTCCTC-1,0,19,9,3763,2099 ACTCGATGTATTTCAT-1,0,18,10,3643,2168 TGAAGAGCGGTCCTAG-1,0,19,11,3763,2237 TAAACGTCGTCAATGA-1,0,18,12,3643,2306 ACGTTATTGGTCACTC-1,0,19,13,3763,2375 ATAGCCTCAGTACCCA-1,0,18,14,3643,2443 CGGGAGTATACCGCCG-1,0,19,15,3763,2512 GTCCTACAGGCGGCTC-1,0,18,16,3643,2581 CGGATAAGCGGACATG-1,0,19,17,3763,2650 AACTTCTGCGTCTATC-1,0,18,18,3643,2719 GGGTTCAGACGAACAA-1,0,19,19,3763,2788 AGTCTGGACATCCTTG-1,0,18,20,3643,2856 TTGAACGAATCCTTTG-1,0,19,21,3763,2925 GAAATACTAAACGTTT-1,0,18,22,3643,2994 CCCGCGCAATGCACCC-1,0,19,23,3763,3063 TTCGGCTAGAGATGGT-1,0,18,24,3643,3132 GACACGAGTTAGAGGA-1,0,19,25,3763,3201 GAGGTCCCAAAGATCT-1,0,18,26,3643,3269 TAACTCCATGGAGGCT-1,0,19,27,3763,3338 CTTGTTTATGTAGCCA-1,0,18,28,3643,3407 GATGGCGCACACATTA-1,0,19,29,3763,3476 ATAATAGTGTAGGGAC-1,0,18,30,3643,3545 CGCTATTCAATGTATG-1,0,19,31,3763,3614 ATATTGCTGTCAAAGT-1,0,18,32,3643,3682 GGATTCAGTACGGTGG-1,0,19,33,3763,3751 TTCTTAGTGAACGGTG-1,0,18,34,3643,3820 AATGGTTCTCACAAGC-1,0,19,35,3763,3889 TATACACGCAAAGTAT-1,0,18,36,3643,3958 CTTCATAGCTCAAGAA-1,0,19,37,3763,4027 CAACGGTTCTTGATAC-1,0,18,38,3643,4095 ACACCCGAGAAATCCG-1,0,19,39,3763,4164 TCTATCATGCAGTTAC-1,0,18,40,3643,4233 CCCGCCATGCTCCCGT-1,0,19,41,3763,4302 CGCTTCCACTGAAATC-1,0,18,42,3643,4371 CACTGTCCAAGTGAGA-1,0,19,43,3763,4440 ATTACTAGCCTCTTGC-1,0,18,44,3643,4508 CATAGTAGCATAGTAG-1,0,19,45,3763,4577 CAACTCCTTGATCCCG-1,0,18,46,3643,4646 AAGTAGAAGACCGGGT-1,0,19,47,3763,4715 GCGGGAACCAGGCCCT-1,0,18,48,3643,4784 ATTAGATTGATAGCGG-1,0,19,49,3763,4852 CTCGGTCCGTAGCCTG-1,0,18,50,3643,4921 TGGCTTTGGGTAGACA-1,0,19,51,3763,4990 TATCCATATCATGCGA-1,0,18,52,3643,5059 GGAGTGCCGCCCTGGA-1,0,19,53,3763,5128 TGAGAATGCTTTACCG-1,0,18,54,3643,5197 TTAACCAACCCTCCCT-1,1,19,55,3763,5265 TGTTTCGGTACTTCTC-1,0,18,56,3643,5334 TTGCTGAAGGAACCAC-1,1,19,57,3763,5403 TATTTAGTCTAGATCG-1,1,18,58,3643,5472 CTCCGGCCTAATATGC-1,1,19,59,3763,5541 TTGTGGCCCTGACAGT-1,1,18,60,3643,5610 TCGCCGGTCGATCCGT-1,1,19,61,3763,5678 CCATAGGTTGGCGTGG-1,1,18,62,3643,5747 GAACGACCGAATGATA-1,1,19,63,3763,5816 TCCGATAATTGCCATA-1,1,18,64,3643,5885 CATTACGTCGGCCCGT-1,1,19,65,3763,5954 CAAGCACCAAATGCCT-1,1,18,66,3643,6023 TGCATGGATCGGATCT-1,1,19,67,3763,6091 GAAATCGCGCGCAACT-1,1,18,68,3643,6160 CTGAAAGAGATCCGAC-1,1,19,69,3763,6229 CACCTCGATGGTGGAC-1,1,18,70,3643,6298 ATTTGTTCCAGGGCTC-1,1,19,71,3763,6367 TGGGCCACAAGAGCGC-1,1,18,72,3643,6436 CCTTCTTGATCCAGTG-1,1,19,73,3763,6504 CCTCGCCAGCAAATTA-1,1,18,74,3643,6573 TTCATGGCGCAACAGG-1,1,19,75,3763,6642 TTAATCAGTACGTCAG-1,1,18,76,3643,6711 CCTATCTATATCGGAA-1,1,19,77,3763,6780 ATTATACTTTGCTCGT-1,1,18,78,3643,6849 ATGGATCCGGCGTCCG-1,1,19,79,3763,6917 CGCCCGCTTCCGTACA-1,1,18,80,3643,6986 GGATTCCGCTATACCC-1,1,19,81,3763,7055 CGGTCTATCAACCCGT-1,1,18,82,3643,7124 ATGCCGGTTGATGGGA-1,1,19,83,3763,7193 TCATGCAGGTTCTCAT-1,1,18,84,3643,7261 TGAGCTTTAATGACGC-1,1,19,85,3763,7330 TCCCTTAGATTACTCG-1,1,18,86,3643,7399 ATATCTCCCTCGTTAA-1,1,19,87,3763,7468 AGCTCTTCCCAGTGCA-1,1,18,88,3643,7537 TCGCTAAACCGCTATC-1,1,19,89,3763,7606 CACATTCTTTCGATGG-1,1,18,90,3643,7674 GATATGCGGTAGCCAA-1,1,19,91,3763,7743 CGTTTCACTTCGGGCG-1,1,18,92,3643,7812 CCAATTACGGGTCGAG-1,1,19,93,3763,7881 GCAGGTAGAGTATGGT-1,1,18,94,3643,7950 GTCGTATTGGCGTACA-1,1,19,95,3763,8019 GAAATTAGCACGGATA-1,1,18,96,3643,8087 AATGCACCAAGCAATG-1,1,19,97,3763,8156 AGGACGCTCGATGTTG-1,1,18,98,3643,8225 GGCTAAAGGGCGGGTC-1,1,19,99,3763,8294 CATCTATCCCGTGTCT-1,1,18,100,3643,8363 CAGTAACTATTTATTG-1,1,19,101,3763,8432 CATATACTACTGATAA-1,1,18,102,3643,8500 GCGTTCGGAGACCGGG-1,1,19,103,3763,8569 AAGTTCAGTCTGCGTA-1,1,18,104,3643,8638 CGAAGCTATAAATTCA-1,1,19,105,3763,8707 CGCGGTCACAAACCAA-1,1,18,106,3643,8776 GGGAATGAGCCCTCAC-1,1,19,107,3763,8845 ACGGAGCGCAAATTAC-1,1,18,108,3643,8913 CGTTCTTCGCACACCT-1,1,19,109,3763,8982 GAATAGCCCTGCGGTC-1,1,18,110,3643,9051 AATAGCTACCGCGTGC-1,1,19,111,3763,9120 CCGAGCTGTGCTTGTC-1,1,18,112,3643,9189 GATGACGATGATCGCG-1,1,19,113,3763,9258 GCCTATGCTGGGCCTT-1,0,18,114,3643,9326 TTACTGTCTAGAGCTC-1,1,19,115,3763,9395 AGCGGTTGCCGCTCTG-1,0,18,116,3643,9464 GCTTGCAGCACAATTG-1,0,19,117,3763,9533 CCGGAGGTCTTATGGT-1,0,18,118,3643,9602 ACAGTATACCGTGGGA-1,0,19,119,3763,9671 GGGATCCCAATACAAA-1,0,18,120,3643,9739 ATTACGACTCCACAGT-1,0,19,121,3763,9808 CTCACACGCAAGCCTA-1,0,18,122,3643,9877 CCAGATGTAAATGGGT-1,0,19,123,3763,9946 GAACTTGTGCACGGGA-1,0,18,124,3643,10015 AAGCCGCTTTACCTTG-1,0,19,125,3763,10083 TCCATTCCCACTAGAG-1,0,18,126,3643,10152 AGAGCGCTTGTAACGG-1,0,19,127,3763,10221 TGGGTTCCCGGACGGA-1,0,20,0,3883,1480 GCTGCGCCTCCCACGT-1,0,21,1,4002,1549 CTGTTGGCTCTTCTGA-1,0,20,2,3883,1618 TTGTTCTAGATACGCT-1,0,21,3,4002,1686 CCCTCAAGCTCTTAGT-1,0,20,4,3883,1755 TGGTCTAGCTTACATG-1,0,21,5,4002,1824 ATGCACCTTCCTTAAT-1,0,20,6,3883,1893 GGGATACGGTAATAAT-1,0,21,7,4002,1962 AGTTCACCGGTTGGAC-1,0,20,8,3883,2030 GACATACTGTCGCAGA-1,0,21,9,4002,2099 TGGACACCGTTGCTTG-1,0,20,10,3883,2168 TGCGATGCTAATGGCT-1,0,21,11,4002,2237 TTCTGTTTCCTGTCGC-1,0,20,12,3883,2306 CGTTGTAAACGTCAGG-1,0,21,13,4002,2375 GATCGGCGATAAGTCG-1,0,20,14,3883,2443 AGCCTTAAAGCGGAAG-1,0,21,15,4002,2512 TCCGTAACCACAATCC-1,0,20,16,3883,2581 GAATGCCGAAATGACC-1,0,21,17,4002,2650 TATACTCATGCGGCAA-1,0,20,18,3883,2719 TAGTGTCAGAAACGGC-1,0,21,19,4002,2788 CGTCATACCATATCCA-1,0,20,20,3883,2856 TAGTACCTTAGTGGTC-1,0,21,21,4002,2925 CTGGCGGGAATAAGTA-1,0,20,22,3883,2994 AGTGTGGTCTATTGTG-1,0,21,23,4002,3063 GCTATCGCGGCGCAAC-1,0,20,24,3883,3132 CAGTAATCCCTCCCAG-1,0,21,25,4002,3201 GTATTAAGGCGTCTAA-1,0,20,26,3883,3269 CTAATTTCAACAACAC-1,0,21,27,4002,3338 TTAGCAACATGGATGT-1,0,20,28,3883,3407 ATGCTCAGTGTTGCAT-1,0,21,29,4002,3476 GATGTTTGTGCGAGAT-1,0,20,30,3883,3545 CACTTCGCCACAGGCT-1,0,21,31,4002,3614 CTGTATGGTGTAGAAA-1,0,20,32,3883,3682 TACGTGCACTATGCTG-1,0,21,33,4002,3751 GTATCAGCTTGGGTTC-1,0,20,34,3883,3820 TAACAAAGGGAGAAGC-1,0,21,35,4002,3889 TTACATCGTGGCCTGG-1,0,20,36,3883,3958 TCTGAACCGGTCGGCT-1,0,21,37,4002,4027 GGCTCGTGCCACCAGC-1,0,20,38,3883,4095 TATAAGTGAGGATAGC-1,0,21,39,4002,4164 GCCCGCGCGTTTGACA-1,0,20,40,3883,4233 TGCTGGTTGGACAATT-1,0,21,41,4002,4302 GCCTAGCGATCTGACC-1,0,20,42,3883,4371 CCATGCTCTGCAGGAA-1,0,21,43,4002,4440 TATAAATCCACAAGCT-1,0,20,44,3883,4508 CGCTCGACATAATGAT-1,0,21,45,4002,4577 CCAATTGAATGTTAAT-1,0,20,46,3883,4646 GCTAATACCGAATGCC-1,1,21,47,4002,4715 TTCAACGACCCGACCG-1,0,20,48,3883,4784 TTCCTCGAGGGTGTCT-1,1,21,49,4002,4852 CAACGACCCGTTTACA-1,1,20,50,3883,4921 CTTGTACTTGTTGACT-1,1,21,51,4002,4990 TCTCTAATAGCTGGTA-1,1,20,52,3883,5059 ATTATGCCATAGGGAG-1,1,21,53,4002,5128 GACAACGCAGCTTACG-1,1,20,54,3883,5197 AGATGACTCGCCCACG-1,1,21,55,4002,5265 GTGCGGGTCTCCAAAT-1,1,20,56,3883,5334 GTACGAGATTGCGACA-1,1,21,57,4002,5403 GTATAGGACTCAGTAG-1,1,20,58,3883,5472 TTGCACGGAGCAGCAC-1,1,21,59,4002,5541 CACAGCTAGGGAGTGA-1,1,20,60,3883,5610 ATACTAGCATGACCCT-1,1,21,61,4002,5678 CCAAGACTTCTGCGAA-1,1,20,62,3883,5747 ACATAATAAGGCGGTG-1,1,21,63,4002,5816 TAATACACAGTAGTAT-1,1,20,64,3883,5885 TCTTGGTAACACCAAA-1,1,21,65,4002,5954 AACTGGGTCCCGACGT-1,1,20,66,3883,6023 ATCACTTCATCCTCGC-1,1,21,67,4002,6091 TGGAAGGATAAAGATG-1,1,20,68,3883,6160 CATGATGCACAATTCT-1,1,21,69,4002,6229 TGCCTGATCAAACGAT-1,1,20,70,3883,6298 ATAGGGATATCCTTGA-1,1,21,71,4002,6367 CACCTAATCAGTTTAC-1,1,20,72,3883,6436 TGTGACTACGCCAGTC-1,1,21,73,4002,6504 CCCGACCATAGTCCGC-1,1,20,74,3882,6573 CGCGCCCGACTTAATA-1,1,21,75,4002,6642 TGCCACCTGGCGAAAC-1,1,20,76,3882,6711 CTGCCAAGGTTGGAAG-1,1,21,77,4002,6780 TCTCCAACGTAGGTTA-1,1,20,78,3882,6849 TTCTTGGAGTAATGAG-1,1,21,79,4002,6917 GTCTCGATCTGCTTTC-1,1,20,80,3882,6986 TACTCTCCGAACAAAT-1,1,21,81,4002,7055 ATCACATTAGAATATC-1,1,20,82,3882,7124 TACGGGATGCTAGCAG-1,1,21,83,4002,7193 AGCTGAAGTAAACCAA-1,1,20,84,3882,7261 CATGGGTCGGGTGTGG-1,1,21,85,4002,7330 CACCCACGAGGCAATT-1,1,20,86,3882,7399 TGCCATTACTAAAGAA-1,1,21,87,4002,7468 CCGTTACGTTAGAACA-1,1,20,88,3882,7537 GCCAGGAGTAACCGAT-1,1,21,89,4002,7606 GGAAAGTGCCCATGCC-1,1,20,90,3882,7674 TCTTACCGGAACTCGT-1,1,21,91,4002,7743 TATGTCAAGACCGACT-1,1,20,92,3882,7812 CCTAACTAAGGCTCTA-1,1,21,93,4002,7881 GCGGTGAACTGCGCTC-1,1,20,94,3882,7950 CCTCGCGCGATATAGG-1,1,21,95,4002,8019 ATCGGCAAGCAGTCCA-1,1,20,96,3882,8087 AGATCGTGCATAAGAT-1,1,21,97,4002,8156 ATTCAGGACCTATTTC-1,1,20,98,3882,8225 AGCTAGAAGCAGAAGT-1,1,21,99,4002,8294 TTCGCTATCTGACGTG-1,1,20,100,3882,8363 TTCCGCAGAGAAATAT-1,1,21,101,4002,8432 CAGTACATTCTCTAAA-1,1,20,102,3882,8500 GTGAAGATTTCAAGTG-1,1,21,103,4002,8569 AACGCATGATCTGGGT-1,1,20,104,3882,8638 CCCAGAGGAGGGCGTA-1,1,21,105,4002,8707 GGAAACCTTGTTGAAT-1,1,20,106,3882,8776 GTGAAGCCGTATAGTC-1,1,21,107,4002,8845 GAGCTGTCGTCTCGGA-1,1,20,108,3882,8913 TGTCATTTGTTGGGAA-1,1,21,109,4002,8982 ACCAACACCACACACT-1,1,20,110,3882,9051 AAATGATTCGATCAGC-1,1,21,111,4002,9120 CTGCTTTATGTCCGCG-1,1,20,112,3882,9189 GCGAGAGGCCATGTAA-1,1,21,113,4002,9258 ATTGACCGGCGATGAC-1,1,20,114,3882,9326 ACCCTGGTAACGCCCT-1,1,21,115,4002,9395 GTTGGACCGCATCAGG-1,1,20,116,3882,9464 CGTTTACAAGGCAGCT-1,0,21,117,4002,9533 CGGTCCATGAGACTCC-1,0,20,118,3882,9602 GTTCGTCTGGGTCCCT-1,0,21,119,4002,9671 TGTACTACTCTCACGG-1,0,20,120,3882,9739 AGTGAAGATGGTGTCC-1,0,21,121,4002,9808 GAGGGCCATAATATTA-1,0,20,122,3882,9877 ACTCCCGTAGACTAGG-1,0,21,123,4002,9946 CGTCAAATGGTCGCAG-1,0,20,124,3882,10015 AAGTCTAGTAGCTGCC-1,0,21,125,4002,10083 AAGAAATCACCAGATT-1,0,20,126,3882,10152 GAGTGCACGGACAACA-1,0,21,127,4002,10221 GTTCAAATCAGATGTC-1,0,22,0,4122,1480 CATGGCTCCCTATGTC-1,0,23,1,4242,1549 GGCCACACGAAAGCCT-1,0,22,2,4122,1618 GAAGCCGGGTAAGCTC-1,0,23,3,4242,1686 TTGCGCTCTCTCGCTT-1,0,22,4,4122,1755 TACATGACCTTATCCG-1,0,23,5,4242,1824 GTCCTTCTACAACCCA-1,0,22,6,4122,1893 TATATGCTGGGTTGCC-1,0,23,7,4242,1962 GTTTATGGGATTTAGA-1,0,22,8,4122,2030 GGAACCCGAACAAGAA-1,0,23,9,4242,2099 AACGTTATCAGCACCT-1,0,22,10,4122,2168 CATCGTCCGGTTACTA-1,0,23,11,4242,2237 AGACAGCTCAGAATCC-1,0,22,12,4122,2306 GCAGATCCTCGCAAAT-1,0,23,13,4242,2375 GGGTCATGCGTACCAT-1,0,22,14,4122,2443 CTGGTCATTCCAATCC-1,0,23,15,4242,2512 TCAGGGCGCAAACTCG-1,0,22,16,4122,2581 GATGCCAGCAGAAGGC-1,0,23,17,4242,2650 GTTATTAACGTGGGAG-1,0,22,18,4122,2719 AATACAATGTTTCAGG-1,0,23,19,4242,2788 TTGCTGCACCTATCCA-1,0,22,20,4122,2856 CCAGAGACAAAGCCGG-1,0,23,21,4242,2925 CCGAAGTATATTGTTC-1,0,22,22,4122,2994 GCTAAACCTGAGGTGA-1,0,23,23,4242,3063 TCATACTTACAGATCC-1,0,22,24,4122,3132 CGAGCACTTCAAGTTT-1,0,23,25,4242,3201 TAGCAACCTGTCACAA-1,0,22,26,4122,3269 TGGGAAATGCCTTTCC-1,0,23,27,4242,3338 AGACCATGGGATACAA-1,0,22,28,4122,3407 TAAATGAATCCGTTTC-1,0,23,29,4242,3476 ACAACGGTCCCTGCGA-1,0,22,30,4122,3545 GTCACTCTCCAAATCT-1,0,23,31,4242,3614 TTCTACTTGCGAGGGC-1,0,22,32,4122,3682 CGCAATTACTTTCGGT-1,0,23,33,4242,3751 CTGTTCATCTCACGGG-1,0,22,34,4122,3820 TTCTTGTAACCTAATG-1,0,23,35,4242,3889 GCTTGATGATAATCAG-1,0,22,36,4122,3958 TTGGCTCGCATGAGAC-1,0,23,37,4242,4027 GCCCAGTTGGTATGCC-1,0,22,38,4122,4095 ATTCCTCCGCCAGTGC-1,0,23,39,4242,4164 TCGTCCGCTGGCGTCT-1,0,22,40,4122,4233 GGAGAAGTCATTGGCA-1,1,23,41,4242,4302 TTGTTAGCAAATTCGA-1,0,22,42,4122,4371 TCTAGCATCTTCGATG-1,1,23,43,4242,4440 TTCTAGGCCAATTGTG-1,1,22,44,4122,4508 TCACGGTCATCGCACA-1,1,23,45,4242,4577 ATGAAGCCAAGGAGCC-1,1,22,46,4122,4646 AATGACTGTCAGCCGG-1,1,23,47,4242,4715 CCAAACAGAACCCTCG-1,1,22,48,4122,4784 TATCGATGATTAAACG-1,1,23,49,4242,4852 GAACACACATCAACCA-1,1,22,50,4122,4921 CCCGTCAGCGTCTGAC-1,1,23,51,4242,4990 AGCATCGTCGATAATT-1,1,22,52,4122,5059 GACTAAGATCATGCAC-1,1,23,53,4242,5128 TAGGGTGTTTCAAGAG-1,1,22,54,4122,5197 TGGTTCGTAGCAAAGG-1,1,23,55,4242,5265 CTGTTCACTGCCTGTG-1,1,22,56,4122,5334 ATGTGCATCCGACGCA-1,1,23,57,4242,5403 TTGTCGTTCAGTTACC-1,1,22,58,4122,5472 CGGGATCAATGTAAGA-1,1,23,59,4242,5541 TTATCTGTATCATAAC-1,1,22,60,4122,5610 ATCGACTCTTTCCGTT-1,1,23,61,4242,5678 CTCATTTGATGGGCGG-1,1,22,62,4122,5747 GTAAGCGGGCAGTCAG-1,1,23,63,4242,5816 TCTATCGGTCGCAACA-1,1,22,64,4122,5885 AACGCGGTCTCCAGCC-1,1,23,65,4242,5954 ATTAATACTACGCGGG-1,1,22,66,4122,6023 CTTTAACTTTCAAAGG-1,1,23,67,4242,6091 CGTACCTGATAGGCCT-1,1,22,68,4122,6160 GAATGTTGGGTAATCT-1,1,23,69,4242,6229 TGCGGAGTAAAGGTGC-1,1,22,70,4122,6298 CCTGAATATTTACATA-1,1,23,71,4242,6367 TTGCTCCCATACCGGA-1,1,22,72,4122,6436 CCTCTAATCTGCCAAG-1,1,23,73,4242,6504 AGGTTGAGGCACGCTT-1,1,22,74,4122,6573 TCCCGTCAGTCCCGCA-1,1,23,75,4242,6642 TCCGATGACTGAGCTC-1,1,22,76,4122,6711 CAGCCTCCTGCAGAGG-1,1,23,77,4242,6780 CTTAGCCTTCCACATG-1,1,22,78,4122,6849 ATTAATGAACCAGTCG-1,1,23,79,4242,6917 ACGATACATAGAACTA-1,1,22,80,4122,6986 AGCCACTCCCGTGCTT-1,1,23,81,4242,7055 ATACGGGTTTCGATTG-1,1,22,82,4122,7124 CTGTCAAATGGCTCGG-1,1,23,83,4242,7193 GCTCGGAATTTAAAGC-1,1,22,84,4122,7262 TAGGCATGTTACGCCA-1,1,23,85,4242,7330 TGGCAACTCGCGCGCC-1,1,22,86,4122,7399 ATCAGTAGGCAGGGAT-1,1,23,87,4242,7468 TATCGATCTATGCATA-1,1,22,88,4122,7537 CGACTCAGGATGTTAT-1,1,23,89,4242,7606 GCCATATTGCACACAG-1,1,22,90,4122,7674 AATTCATAAGGGATCT-1,1,23,91,4242,7743 CGGTAGAGGTGCAGGT-1,1,22,92,4122,7812 AATGATGATACGCTAT-1,1,23,93,4242,7881 CTTGTGCTCACCGATT-1,1,22,94,4122,7950 TTCCAATCAGAGCTAG-1,1,23,95,4242,8019 CGATGGACCCTACGCC-1,1,22,96,4122,8087 GGTCGGATAAACGGCG-1,1,23,97,4242,8156 TTAGCTAATACGATCT-1,1,22,98,4122,8225 CTCGATATTTGCGAGC-1,1,23,99,4242,8294 ATTACTTACTGGGCAT-1,1,22,100,4122,8363 CTAGCCGATGTTATGA-1,1,23,101,4242,8432 TACTGCAATCAATTAC-1,1,22,102,4122,8500 TAGTCTGTGACGTTGC-1,1,23,103,4242,8569 CTCGTTTCTAATGTTT-1,1,22,104,4122,8638 TTCGTTCAACGAAGTT-1,1,23,105,4242,8707 CTGAATTTATTGCCAG-1,1,22,106,4122,8776 TGGAATATCCTTGACC-1,1,23,107,4242,8845 CAGATCATTTAAAGTC-1,1,22,108,4122,8913 CTCCTTTACGCAAGTC-1,1,23,109,4242,8982 TCCCAAACAGACAACG-1,1,22,110,4122,9051 ATCGCTGCGTGCAGCA-1,1,23,111,4242,9120 TTAGTTCAAGTGTTCG-1,1,22,112,4122,9189 AAACTCGTGATATAAG-1,1,23,113,4242,9258 TTAACGAACAAGCAGT-1,1,22,114,4122,9326 GTTATATCAGGAGCCA-1,1,23,115,4242,9395 CAAATTGGATTATGCC-1,0,22,116,4122,9464 CGAGGAGCTTCCATAT-1,0,23,117,4242,9533 GGAGACCAATGTGCTT-1,0,22,118,4122,9602 CATTGATGAACACGCC-1,0,23,119,4242,9671 GTCAATGCTATAATTT-1,0,22,120,4122,9739 ACCACCCTCTCTTCTA-1,0,23,121,4242,9808 TGGAGGGAAACACCTC-1,0,22,122,4122,9877 CACGGACGTGGATGGC-1,0,23,123,4242,9946 AACTTTCTCGATCATG-1,0,22,124,4122,10015 CGTATTGTTTCCTAAT-1,0,23,125,4242,10084 CCTACTGCGGCGGCCA-1,0,22,126,4122,10152 CTTAGGTCCCAATCGT-1,0,23,127,4242,10221 CGCAATCGATCATTAG-1,0,24,0,4362,1480 TGGTTATGCTTGCGGT-1,0,25,1,4481,1549 GGCTTGGCTCTCACCT-1,0,24,2,4362,1618 ATTGGTAGGATCCGCT-1,0,25,3,4481,1686 TCAGGGCGACTTCCTT-1,0,24,4,4362,1755 TCTGCAGATTCGAGTC-1,0,25,5,4481,1824 CTCTCGCTGTACTATG-1,0,24,6,4362,1893 AATAGTCGCGAGTCGG-1,0,25,7,4481,1962 AGTTACCCTTAAGACT-1,0,24,8,4362,2031 CTTAAATAAGACCCAT-1,0,25,9,4481,2099 GGTTGTGCTCTTGTCC-1,0,24,10,4362,2168 GTGAGTCTAAGACGGA-1,0,25,11,4481,2237 CGCGACACTGCGCAGC-1,0,24,12,4362,2306 GCTCGCGGTTCCGCTC-1,0,25,13,4481,2375 TTAACTCACGCGTGGA-1,0,24,14,4362,2443 GGAACGGCCTGCAGCC-1,0,25,15,4481,2512 GTAGAAACGGGTGGAG-1,0,24,16,4362,2581 TAATGAAAGACCCTTG-1,0,25,17,4481,2650 AGGCTTGCTAGACACC-1,0,24,18,4362,2719 TTGCGTAGTTTGAGGA-1,0,25,19,4481,2788 CGCCCTTGAAGGCTGA-1,0,24,20,4362,2856 CCCGGTGGAAGAACCT-1,0,25,21,4481,2925 TTAACACCTCGAACAT-1,0,24,22,4362,2994 GATTCCTATACGGCGC-1,0,25,23,4481,3063 TTACCCTAACAGTCCT-1,0,24,24,4362,3132 ACCCACCTACATGCTC-1,0,25,25,4481,3201 AAAGGGCAGCTTGAAT-1,0,24,26,4362,3269 CACACAGGGATAGATT-1,0,25,27,4481,3338 AGAGCGTACAAGCTCG-1,0,24,28,4362,3407 TCTTACGGCATCCGAC-1,0,25,29,4481,3476 GCCTATTCCGATATAG-1,0,24,30,4362,3545 GAAAGTGACTAACTGC-1,0,25,31,4481,3614 CCGGAATGGTTTCAGT-1,0,24,32,4362,3682 AGTATAATACTAGGCA-1,0,25,33,4481,3751 TAACTATCGAAGGTCC-1,0,24,34,4362,3820 ATGAGGAGTGTTAATC-1,1,25,35,4481,3889 TGTGTCGCGAGTTGCA-1,0,24,36,4362,3958 ATCCAACGCAGTCATA-1,1,25,37,4481,4027 AAGGCGCGTAAAGCTT-1,1,24,38,4362,4095 AGTCGGCCCAAACGAC-1,1,25,39,4481,4164 AACGTCAGACTAGTGG-1,1,24,40,4362,4233 ACTACCAGCTCTCTGG-1,1,25,41,4481,4302 GCAAGTGCACAGAGAA-1,1,24,42,4362,4371 ACACCTTAAGTAGGGC-1,1,25,43,4481,4440 TTCGACGGGAAGGGCG-1,1,24,44,4362,4508 TTCGCACTCGCGTGCT-1,1,25,45,4481,4577 TATTTGTTACCCTTTA-1,1,24,46,4362,4646 CGCTGTGACGCCGCAC-1,1,25,47,4481,4715 GTTGCACGGAGTTTCG-1,1,24,48,4362,4784 GTTTCCTGGAGGGTGA-1,1,25,49,4481,4853 ACACCCAGCATGCAGC-1,1,24,50,4362,4921 TCAACCATGTTCGGGC-1,1,25,51,4481,4990 TTACAACTACGCATCC-1,1,24,52,4362,5059 TCCGATGGTGCGACAT-1,1,25,53,4481,5128 GGGCGTACATTTATAT-1,1,24,54,4362,5197 AGCGACCAACGATATT-1,1,25,55,4481,5265 ACACAAAGACGGGTGG-1,1,24,56,4362,5334 ATCGCACGCCGGGAGA-1,1,25,57,4481,5403 GCTCTAAACCCTGACG-1,1,24,58,4362,5472 AATGCAACCGGGTACC-1,1,25,59,4481,5541 TCAAACAACCGCGTCG-1,1,24,60,4362,5610 TATGCTCCCTACTTAC-1,1,25,61,4481,5678 AAAGGGATGTAGCAAG-1,1,24,62,4362,5747 ACGATCATACATAGAG-1,1,25,63,4481,5816 TTGTTCAGTGTGCTAC-1,1,24,64,4362,5885 ATGCATGATCCAGGAT-1,1,25,65,4481,5954 AGTCTTCTCCTCAAAT-1,1,24,66,4362,6023 GATTCCCTTGTCGCAG-1,1,25,67,4481,6091 CTCGCACCTATATAGT-1,1,24,68,4362,6160 ACTCAATAAAGGCACG-1,1,25,69,4481,6229 AACCGAGCTTGGTCAT-1,1,24,70,4362,6298 TAAGGCAACATAAGAT-1,1,25,71,4481,6367 CACGCACAGCGCAGCT-1,1,24,72,4362,6436 GGTTTACAATCTCAAT-1,1,25,73,4481,6504 TGCAGGATCGGCAAAG-1,1,24,74,4362,6573 ATAACGGAGTCCAACG-1,1,25,75,4481,6642 AACGATATGTCAACTG-1,1,24,76,4362,6711 GACAACGACCATTGAA-1,1,25,77,4481,6780 TTGACCATGTTCTCCG-1,1,24,78,4362,6849 AGTACGGGCACCTGGC-1,1,25,79,4481,6917 CGCCATCCGATTATGA-1,1,24,80,4362,6986 AAGGTATCCTAATATA-1,1,25,81,4481,7055 TGTTGTCAAGAAGTCT-1,1,24,82,4362,7124 CAGTGAATAAATGACT-1,1,25,83,4481,7193 CACCTTGCGAAACTCG-1,1,24,84,4362,7262 CATTTAGCGGACCATG-1,1,25,85,4481,7330 CCAGTCTAGACGGCGC-1,1,24,86,4362,7399 TCGCTTTAAACGTTTG-1,1,25,87,4481,7468 GTGAAACGGCGCCACC-1,1,24,88,4362,7537 GGGCTCATCGAACCCA-1,1,25,89,4481,7606 TTGATGTGTAGTCCCG-1,1,24,90,4362,7674 CAGTAGCCCACGCGGT-1,1,25,91,4481,7743 AGCGCGGGTGCCAATG-1,1,24,92,4362,7812 TAATCGATCCGTACGT-1,1,25,93,4481,7881 AGTGGCGGCAATTTGA-1,1,24,94,4361,7950 CCTTTCAATGAAGAAA-1,1,25,95,4481,8019 CTCAGTCACGACAAAT-1,1,24,96,4361,8087 ATAGGCTAGCTTCGCA-1,1,25,97,4481,8156 CGGTTCAAGTAGGTGT-1,1,24,98,4361,8225 CAGTCGAGGATGCAAT-1,1,25,99,4481,8294 TATCACCCAACCGACC-1,1,24,100,4361,8363 AATGATGCGACTCCTG-1,1,25,101,4481,8432 TGGAACCACTGACACA-1,1,24,102,4361,8500 GCCAATAGGGCATCTC-1,1,25,103,4481,8569 TTCTTTGGTCGCGACG-1,1,24,104,4361,8638 ATTAGATTCCTCAGCA-1,1,25,105,4481,8707 CCGTGGAACGATCCAA-1,1,24,106,4361,8776 GGGTCGTGGCAAGTGT-1,1,25,107,4481,8845 TCGCTCGGCACCAGCG-1,1,24,108,4361,8913 ACGCAATCACTACAGC-1,1,25,109,4481,8982 CTCTAATGCATTGATC-1,1,24,110,4361,9051 GTCTCGACTAAGTTTG-1,1,25,111,4481,9120 TGGTTTAAACGTGGGT-1,1,24,112,4361,9189 CGCAGATCTTCACCCG-1,1,25,113,4481,9258 TCCAGATGTACGCCAA-1,1,24,114,4361,9326 CATTGCGGGTCAATTC-1,1,25,115,4481,9395 GACGTTCGTAAATACA-1,0,24,116,4361,9464 TACACCGTCGTTAGTC-1,0,25,117,4481,9533 ACGGGCGTATGCGACA-1,0,24,118,4361,9602 GAAGGCTACCATTGTT-1,0,25,119,4481,9671 TAAATCTTTACACCTC-1,0,24,120,4361,9739 AGTTTATGTAAAGACA-1,0,25,121,4481,9808 AGGAGACATCCACAGT-1,0,24,122,4361,9877 CAACCTGAACCTGCCA-1,0,25,123,4481,9946 AGTCCCTCGCAGAAAG-1,0,24,124,4361,10015 TGTATACGGATGATGA-1,0,25,125,4481,10084 TTGTGGTATAGGTATG-1,0,24,126,4361,10152 TCTGCACCATTAGTAA-1,0,25,127,4481,10221 AAATGTATCTTATCCC-1,0,26,0,4601,1480 ACTCTAAACCTGGGAT-1,0,27,1,4721,1549 GCTGGCAGGTGCCGTG-1,0,26,2,4601,1618 CTCATTCGTGAACATC-1,0,27,3,4721,1686 TCGCCGGATGGGCAAG-1,0,26,4,4601,1755 GGACTAAGTCAGGAGT-1,0,27,5,4721,1824 TATCAAAGGTCTGTAA-1,0,26,6,4601,1893 TTCAGTTTGTGGCAGC-1,0,27,7,4721,1962 TGTTCATAAATGTGCT-1,0,26,8,4601,2031 CTTAGCCCGGATAGTG-1,0,27,9,4721,2099 GATGCGAATGGTATTA-1,0,26,10,4601,2168 TCTAACTGTATGTAAA-1,0,27,11,4721,2237 TTAAACCTGGTTCCTT-1,0,26,12,4601,2306 GCTAAGTAAAGGCGAT-1,0,27,13,4721,2375 AGTTACCGCACATGGT-1,0,26,14,4601,2443 GACTGCGGCACGTGTA-1,0,27,15,4721,2512 TGGTGATCGTATTTGT-1,0,26,16,4601,2581 TTATCGCCTGCGAAGC-1,0,27,17,4721,2650 TGGAATTAGACGCTTT-1,0,26,18,4601,2719 TCGTCACACTGTTAGC-1,0,27,19,4721,2788 TTATGTTTGCGATAGA-1,0,26,20,4601,2856 GGTGCTGATCACAAAG-1,0,27,21,4721,2925 CATAGCCGCCCGGGAT-1,0,26,22,4601,2994 GGTTAGTTACGGCGCC-1,0,27,23,4721,3063 ATTCCCACATAAACAA-1,0,26,24,4601,3132 ATTCAGTAGCAGGGTC-1,0,27,25,4721,3201 CAGTTCCGCGGGTCGA-1,0,26,26,4601,3269 AAGAGATGAATCGGTA-1,0,27,27,4721,3338 CGCAATTCTACAATAA-1,0,26,28,4601,3407 TAACGCTTTGAGAGCG-1,0,27,29,4721,3476 AGGCTATGGTTAGCTT-1,0,26,30,4601,3545 GAGGAATGGAGAGGTT-1,1,27,31,4721,3614 TCCTCTACGAGATGGC-1,1,26,32,4601,3682 TTGATTATGCAGATGA-1,1,27,33,4721,3751 TCAGTACTGACCCGCG-1,1,26,34,4601,3820 TTATGACAAACTGGAT-1,1,27,35,4721,3889 GTAAGTAGGGTATACC-1,1,26,36,4601,3958 CGCAAACACGAGTTAC-1,1,27,37,4721,4027 TGGCCGTATATTGACC-1,1,26,38,4601,4095 ACTGTAGCACTTTGGA-1,1,27,39,4721,4164 GCTCTATGTTACGTGC-1,1,26,40,4601,4233 TGCGCGATTAACGGAG-1,1,27,41,4721,4302 GAATCGACATGGTCAC-1,1,26,42,4601,4371 GACTAAGTAGGCTCAC-1,1,27,43,4721,4440 ATCTTGACCTGCAACG-1,1,26,44,4601,4508 ATGCACTACCGCATTG-1,1,27,45,4721,4577 CAGATACTAACATAGT-1,1,26,46,4601,4646 GATCGACACTATCTGA-1,1,27,47,4721,4715 ATAGAGTACTGGGACA-1,1,26,48,4601,4784 CCTACTGCTTACACTT-1,1,27,49,4721,4853 CCTGCTATTTGAGAAG-1,1,26,50,4601,4921 CGCGTTCATGAAATAC-1,1,27,51,4721,4990 CATTATGCTTGTTGTG-1,1,26,52,4601,5059 CCAGGGACGTGGCCTC-1,1,27,53,4721,5128 TATGGATGTGCTACGC-1,1,26,54,4601,5197 GTACTAAGATTTGGAG-1,1,27,55,4721,5265 AGACCCGCCCTCCTCG-1,1,26,56,4601,5334 CGCATTAGCTAATAGG-1,1,27,57,4721,5403 GCTCTCGGGTACCGAA-1,1,26,58,4601,5472 CACCGCCAGAAGGTTT-1,1,27,59,4721,5541 TCCCAAAGACGAAGGA-1,1,26,60,4601,5610 ATGGATTGACCAAACG-1,1,27,61,4721,5678 GTCATGGACATGACTA-1,1,26,62,4601,5747 CTACTGCCACCTGACC-1,1,27,63,4721,5816 TTATATTTGGCAATCC-1,1,26,64,4601,5885 AGCACCAGTACTCACG-1,1,27,65,4721,5954 CATGGTCTAGATACCG-1,1,26,66,4601,6023 TCTACCGTCCACAAGC-1,1,27,67,4721,6091 CTAGTTGGGCCCGGTA-1,1,26,68,4601,6160 TCCCGCGTACTCCTGG-1,1,27,69,4721,6229 CAGAGCATGAGCTTGC-1,1,26,70,4601,6298 ACACGGGAACTTAGGG-1,1,27,71,4721,6367 GGCTCTGCTCCAACGC-1,1,26,72,4601,6436 AGAACGTGGTACATTC-1,1,27,73,4721,6504 CAATAAACCTTGGCCC-1,1,26,74,4601,6573 ACTTCGCCATACGCAC-1,1,27,75,4721,6642 ATCTGGTTAAGACTGT-1,1,26,76,4601,6711 TCGTAAGACGACATTG-1,1,27,77,4721,6780 GTGTACCTTGGCTACG-1,1,26,78,4601,6849 GCCCGTAATACCTTCT-1,1,27,79,4721,6917 CGGTCAAGTGGGAACC-1,1,26,80,4601,6986 TTGTAAGGCCAGTTGG-1,1,27,81,4721,7055 GGAGCACCAAGAACTA-1,1,26,82,4601,7124 TAATAGTGACGACCAG-1,1,27,83,4721,7193 CTAAATCCTATTCCGG-1,1,26,84,4601,7262 CGAGTTCTGTCCCACC-1,1,27,85,4721,7330 AGGCAGATGCGTAAAC-1,1,26,86,4601,7399 AAGGATGAGGGACCTC-1,1,27,87,4721,7468 AGAGAACCGTCTAGGA-1,1,26,88,4601,7537 GAGGGCGCAGCTCTGC-1,1,27,89,4721,7606 AAGATTGGCGGAACGT-1,1,26,90,4601,7674 CCAGTAGTCTGATCCA-1,1,27,91,4721,7743 AAGGGACAGATTCTGT-1,1,26,92,4601,7812 ATAGAGTTATCAACTT-1,1,27,93,4721,7881 AAATTACCTATCGATG-1,1,26,94,4601,7950 GATCCTAAATCGGGAC-1,1,27,95,4721,8019 TTACAGACCTAAATGA-1,1,26,96,4601,8087 CCTCACCTTAGCATCG-1,1,27,97,4721,8156 CATGCGACCAGTTTAA-1,1,26,98,4601,8225 AACATATCAACTGGTG-1,1,27,99,4721,8294 CTATAAGAGCCAATCG-1,1,26,100,4601,8363 AATATCGAGGGTTCTC-1,1,27,101,4721,8432 GTACTCCTGGGTATGC-1,1,26,102,4601,8500 ATAAGTAGGATTCAGA-1,1,27,103,4721,8569 AGGTCGCGGAGTTACT-1,1,26,104,4601,8638 CTAATTCTCAGATATT-1,1,27,105,4721,8707 GCCAACCATTTCCGGA-1,1,26,106,4601,8776 TGATCCCAGCATTAGT-1,1,27,107,4721,8845 CGTTGTAAGATTGATT-1,1,26,108,4601,8913 GAAACCATGGTGCGCT-1,1,27,109,4721,8982 AATCTATGCCGGAGCC-1,1,26,110,4601,9051 GACTCCCAGAATAAGG-1,1,27,111,4721,9120 TATGATCCGGCACGCC-1,1,26,112,4601,9189 CCGCTTGCTGACATGG-1,1,27,113,4721,9258 TGGTTAAGGGCGCTGG-1,1,26,114,4601,9326 TTGATAGTCAATACAT-1,1,27,115,4721,9395 GGTTTAATTGAGCAGG-1,1,26,116,4601,9464 CATTACATAGATTGTG-1,0,27,117,4721,9533 GGTACACCAGATTTAT-1,0,26,118,4601,9602 GGCCCGTATACCATGC-1,0,27,119,4721,9671 ATCTTTCGTATAACCA-1,0,26,120,4601,9739 GAGATGACAATCCTTA-1,0,27,121,4721,9808 AAAGCTTGCCTACATA-1,0,26,122,4601,9877 GAACGATAAGTTAAAG-1,0,27,123,4721,9946 TAATAGCTAAATGATG-1,0,26,124,4601,10015 TATGGCTAGGCTAATT-1,0,27,125,4721,10084 AGGAGAGTCTGGCTAC-1,0,26,126,4601,10152 TGCTCTGCCGGTTCAC-1,0,27,127,4721,10221 CCAATAGATTTCATCT-1,0,28,0,4841,1480 GGGCACGAATTGGCCG-1,0,29,1,4961,1549 TCGTTGACAGGGTCCC-1,0,28,2,4841,1618 ATCGTATTCCGAGAAC-1,0,29,3,4961,1686 GGGAATTCTGTCCAGT-1,0,28,4,4841,1755 ACGCGTTTCTTAAGAG-1,0,29,5,4961,1824 GAGAGCGCAGTCCCTG-1,0,28,6,4841,1893 GTCCTATTGTTGTGGT-1,0,29,7,4961,1962 CATCTGCAGGATCATT-1,0,28,8,4841,2031 GAGTCGACAGACCCTC-1,0,29,9,4961,2099 AAGTGCAAAGGTAGAC-1,0,28,10,4841,2168 AGGGTGGATAGTGCAT-1,0,29,11,4961,2237 TGATAGCGGGATTCTA-1,0,28,12,4841,2306 GTCAGTTTGGTAGTCG-1,0,29,13,4961,2375 GCATTCGAAATGAACA-1,0,28,14,4841,2443 AAAGACTGGGCGCTTT-1,0,29,15,4961,2512 TAACAATATTTGTTGC-1,0,28,16,4841,2581 CCAGCTTCCGCCCGCA-1,0,29,17,4961,2650 GATATGGATTACGCGG-1,0,28,18,4841,2719 AGAGCAGTTATGAGAC-1,0,29,19,4960,2788 TCACATCTTATCTGAT-1,0,28,20,4841,2856 TATGAAGACAGGTGCG-1,0,29,21,4960,2925 TACCTGCTGCACTGTG-1,0,28,22,4841,2994 TAGGTCCAAGTAAGGA-1,0,29,23,4960,3063 GAAACTCGTGCGATGC-1,0,28,24,4841,3132 AACAATTACTCTACGC-1,0,29,25,4960,3201 CCGCACGTGACCTCGG-1,0,28,26,4841,3269 AACTTGCCCGTATGCA-1,1,29,27,4960,3338 GGGTATGTATGCACTT-1,1,28,28,4841,3407 TTCGTACTCCAGAACG-1,1,29,29,4960,3476 GAATTTCTCGCTGCAG-1,1,28,30,4841,3545 AACAGGATGGGCCGCG-1,1,29,31,4960,3614 GACGTGTAGGGATTAT-1,1,28,32,4841,3682 TAGGTGAGCCCTACTC-1,1,29,33,4960,3751 CTAATTCGCACGCGCT-1,1,28,34,4841,3820 GAAGCTTGCTGACCGC-1,1,29,35,4960,3889 GGTTAGGCTTGGAGAA-1,1,28,36,4841,3958 ACAAGGACAAGAGGTT-1,1,29,37,4960,4027 AGGCCACCCGTTATGA-1,1,28,38,4841,4095 GTGGGCTTAGACACAC-1,1,29,39,4960,4164 CGTGTCCCATTCGCGA-1,1,28,40,4841,4233 TGGAGTGATGCGATGA-1,1,29,41,4960,4302 AACAACTGGTAGTTGC-1,1,28,42,4841,4371 CCTGGCTAGACCCGCC-1,1,29,43,4960,4440 CGCAATTAGGGTAATA-1,1,28,44,4841,4508 TCGAAATTTAGGACCA-1,1,29,45,4960,4577 AGACTAGCCTTCCAGA-1,1,28,46,4841,4646 TTGATCTAACTTTGTC-1,1,29,47,4960,4715 AAGGAGCGGTTGGTGC-1,1,28,48,4841,4784 ACTTGGGACCCGGTGG-1,1,29,49,4960,4853 TGATCTCCGGCGCCAG-1,1,28,50,4841,4921 CAGTTCAAATTGACAC-1,1,29,51,4960,4990 GTCCGGCTGAATTGCG-1,1,28,52,4841,5059 CTGGAAATGGATGCTT-1,1,29,53,4960,5128 TGATCGGTTTGACCCT-1,1,28,54,4841,5197 TAGAGTCTAAGCGAAC-1,1,29,55,4960,5265 GAGACTGATGGGTAGA-1,1,28,56,4841,5334 TAGCTAAGTCCGGGAG-1,1,29,57,4960,5403 GGGCGATATGTGTGAA-1,1,28,58,4841,5472 CTCGAGGTCGAACAGT-1,1,29,59,4960,5541 GATCCCTTTATACTGC-1,1,28,60,4841,5610 GTCATGCACCTCCGTT-1,1,29,61,4960,5678 ACTTTCCTATAGCTTC-1,1,28,62,4841,5747 TCGCTCGATATATTCC-1,1,29,63,4960,5816 ATAGGTTGGGCAGATG-1,1,28,64,4841,5885 CAATTAAGGGTGATGA-1,1,29,65,4960,5954 ACCGACTGAGTCCCAC-1,1,28,66,4841,6023 CCTGTCACCCGGGCTC-1,1,29,67,4960,6091 GATCGGTGGCCATAAC-1,1,28,68,4841,6160 CCTATGGGTTACCGTC-1,1,29,69,4960,6229 TTGGGACACTGCCCGC-1,1,28,70,4841,6298 CGAGGCTAAATATGGC-1,1,29,71,4960,6367 TCAGGGTGTAACGTAA-1,1,28,72,4841,6436 CGAGAGATGTGAACCT-1,1,29,73,4960,6504 TCGCTGGGCGGATTGT-1,1,28,74,4841,6573 AGATCTCAGGTGTGAT-1,1,29,75,4960,6642 TGGCCAAACTGAAGTA-1,1,28,76,4841,6711 GCTTCCGTCCCTAGAC-1,1,29,77,4960,6780 CAGCAGCCCGTTCCTT-1,1,28,78,4841,6849 TGTATAACAGATCCTG-1,1,29,79,4960,6917 CGCGGGAATTAGGCAG-1,1,28,80,4841,6986 TGCATGTGGTAATCTA-1,1,29,81,4960,7055 ACAATTTGAGCAGTGG-1,1,28,82,4841,7124 GAGCTAAGGGCATATC-1,1,29,83,4960,7193 CCAGATAGTTGAGTGA-1,1,28,84,4841,7262 CCACAATGTACGTCTT-1,1,29,85,4960,7330 CAATGGATCTCTACCA-1,1,28,86,4841,7399 TGTGGCAAAGCGTATG-1,1,29,87,4960,7468 TAAAGCGTTAGGAGAA-1,1,28,88,4841,7537 TCCGTTTAGCCTTGAA-1,1,29,89,4960,7606 CAGCTCGACAAGTTAA-1,1,28,90,4841,7675 GCCTATAGTGTCAGGG-1,1,29,91,4960,7743 ATAGACAACGGGACCT-1,1,28,92,4841,7812 CTACTATCTTTCAGAG-1,1,29,93,4960,7881 GCGCTGCTTTGCATTT-1,1,28,94,4841,7950 GCGCATCCAGTCAGCA-1,1,29,95,4960,8019 GACTCGCGGGAATGAC-1,1,28,96,4841,8087 CTGGTAACGAGCTCTT-1,1,29,97,4960,8156 TCCGGCCTAGCGTACA-1,1,28,98,4841,8225 TCTAGGTGGCGACGCT-1,1,29,99,4960,8294 ACGCTAGTGATACACT-1,1,28,100,4841,8363 ATCTGCACCTCTGCGA-1,1,29,101,4960,8432 CCTCACCTGAGGGAGC-1,1,28,102,4841,8500 AGTGAGCCTCGCCGCC-1,1,29,103,4960,8569 ACGAGTACGGATGCCC-1,1,28,104,4841,8638 GGTACCATTAAGACGG-1,1,29,105,4960,8707 TTCTGCTAGACTCCAA-1,1,28,106,4841,8776 TAACTATTACGCCAAA-1,1,29,107,4960,8845 GCATTCAAGGCAACGC-1,1,28,108,4841,8913 AGTACATCATTTATCA-1,1,29,109,4960,8982 GTCGTGTCTGGTCATC-1,1,28,110,4841,9051 AGTCTAAAGTATACTC-1,1,29,111,4960,9120 CGGCCCAACCTGTAGT-1,1,28,112,4841,9189 AGGGAGACATACTTCG-1,1,29,113,4960,9258 TCCCTAGATCAATAGG-1,1,28,114,4840,9326 TCCCGTCGCGTCATAG-1,1,29,115,4960,9395 CGCATCCATCAGCCAG-1,0,28,116,4840,9464 CTGCACCTAGTCCACA-1,0,29,117,4960,9533 CGAGGATCGGGAACGA-1,0,28,118,4840,9602 CAATGAGGTTCGACTA-1,0,29,119,4960,9671 TCTGACGGGCTAACCC-1,0,28,120,4840,9739 TTCTATGCCTTTCGCA-1,0,29,121,4960,9808 AGAGTATAGTGTTACG-1,0,28,122,4840,9877 CCATTGTTTCCTCCAT-1,0,29,123,4960,9946 CTCATCACTTAGTGAT-1,0,28,124,4840,10015 CCGAAGGGCGTACCGC-1,0,29,125,4960,10084 TCAAGCTGCCTTGAAA-1,0,28,126,4840,10152 CTCATTAACGTTGCCC-1,0,29,127,4960,10221 GTCTTCCTCACCTAAG-1,0,30,0,5080,1480 GGTGATGAAGGAAGTG-1,0,31,1,5200,1549 TCAATACAATTGCTGC-1,0,30,2,5080,1618 GCAACCCAAGTTGTTT-1,0,31,3,5200,1686 ATGAAGTGGACCCAGC-1,0,30,4,5080,1755 GAGAATCTCACGATCA-1,0,31,5,5200,1824 TATATCATTGATCAGT-1,0,30,6,5080,1893 AACTTTACGGGAGCTT-1,0,31,7,5200,1962 TTCTTGTGTCCATCAG-1,0,30,8,5080,2031 ACAATTTAGGAGGCTC-1,0,31,9,5200,2099 ATACTTGTTCTCGAGC-1,0,30,10,5080,2168 CACGGGATTGAGGGTT-1,0,31,11,5200,2237 GTTAATGTCTATCTTA-1,0,30,12,5080,2306 GCGTTATATTTGGAAC-1,0,31,13,5200,2375 CGTCAAGGCTATAAAT-1,0,30,14,5080,2444 TTAGCTCTGTAATCCG-1,0,31,15,5200,2512 AATGGTCCACCGTTCA-1,0,30,16,5080,2581 GTCATTGCATTGACCC-1,0,31,17,5200,2650 TGTCCGTGGCGCCTTT-1,0,30,18,5080,2719 TCAACTAACGTATAAC-1,0,31,19,5200,2788 TCCTCTCCAGTTGTCC-1,0,30,20,5080,2856 TGTGTTCGTATCCAAG-1,0,31,21,5200,2925 CCGCGTAGGTAAGGGC-1,0,30,22,5080,2994 CTGCGGGTGAAATGTT-1,0,31,23,5200,3063 TATCTACAGAGGTAAT-1,0,30,24,5080,3132 CTACTCTAGGCCCGGC-1,1,31,25,5200,3201 ACAAGCAGTGCCTAGC-1,1,30,26,5080,3269 TACAAGTCTCGTGCAT-1,1,31,27,5200,3338 TCGGAATGCGCTCTGA-1,1,30,28,5080,3407 TCGCGTCCAGAAGGTC-1,1,31,29,5200,3476 TATGGCCCGGCCTCGC-1,1,30,30,5080,3545 GCTGGCATATTCACCT-1,1,31,31,5200,3614 GTCAGAATAGTCTATG-1,1,30,32,5080,3682 GGCGTCCTATCCGCTG-1,1,31,33,5200,3751 CGGAGTTTGAGAGACA-1,1,30,34,5080,3820 AGCACTTAAGGACGCC-1,1,31,35,5200,3889 TCCACAATGGTTTACG-1,1,30,36,5080,3958 CCAACGATGCACTGAT-1,1,31,37,5200,4027 ATTTACAGTTTACTGG-1,1,30,38,5080,4095 CCCTGAAATGAGTTGA-1,1,31,39,5200,4164 CAAACGGTCGCACTTT-1,1,30,40,5080,4233 TGATTCGTCTATCACT-1,1,31,41,5200,4302 TCAGGTTCTTTGAGAA-1,1,30,42,5080,4371 CACGCAGCGAGGCTTT-1,1,31,43,5200,4440 TTAAGCGCCTGACCCA-1,1,30,44,5080,4508 CTTACACGGTATTCCA-1,1,31,45,5200,4577 AAGGCTGTGCTCATCG-1,1,30,46,5080,4646 GACCAGAGCCCTGTAG-1,1,31,47,5200,4715 TCCCAGGCTTAGCTAA-1,1,30,48,5080,4784 ATTGAAGATCTTAGTG-1,1,31,49,5200,4853 AGTTCCTACAGAATTA-1,1,30,50,5080,4921 GGGCTGGTTAGTCGCG-1,1,31,51,5200,4990 GAAATGGCGGTGTTAG-1,1,30,52,5080,5059 TACGAACACGACTTCA-1,1,31,53,5200,5128 ACCACAAGTTTCTATC-1,1,30,54,5080,5197 ATATTTAACCCTCAAG-1,1,31,55,5200,5266 GATCATTCCAAACATT-1,1,30,56,5080,5334 TCCAGGCGAGTACGGT-1,1,31,57,5200,5403 GTTTGACCAAATCCTA-1,1,30,58,5080,5472 CACAGCACCCACGGCA-1,1,31,59,5200,5541 TGCAAGAATGACGTAA-1,1,30,60,5080,5610 GCGAAGCCATACCCGT-1,1,31,61,5200,5678 TCCTTTCTTACGCTTA-1,1,30,62,5080,5747 GCTGCTCTCCGGACAC-1,1,31,63,5200,5816 ACTGTCTTCTTTAGAA-1,1,30,64,5080,5885 TCAAACTTAGATTGTT-1,1,31,65,5200,5954 CTATGTCACTAGCCCA-1,1,30,66,5080,6023 TGCGCAAAGCATTTGG-1,1,31,67,5200,6091 TTAATGTAGACCAGGT-1,1,30,68,5080,6160 GGCGGTAGGATCATTG-1,1,31,69,5200,6229 GGCAATAGTCAATGAG-1,1,30,70,5080,6298 ACACGAGACTCCTTCT-1,1,31,71,5200,6367 GACACAAGGGAAGAAA-1,1,30,72,5080,6436 TCAGCAAATGCATCTC-1,1,31,73,5200,6504 GAGATCTGTCACTCCG-1,1,30,74,5080,6573 ATGCCGGTCTTGCATA-1,1,31,75,5200,6642 TTGGGCGGCGGTTGCC-1,1,30,76,5080,6711 TTGTTGTGTGTCAAGA-1,1,31,77,5200,6780 ACTGTACGATACACAT-1,1,30,78,5080,6849 TCCACTTTATCTAGGT-1,1,31,79,5200,6917 GGTCTGAGAATCTGGA-1,1,30,80,5080,6986 TAGAAAGGTGGCGCTA-1,1,31,81,5200,7055 TATGTCTCATTGTGCC-1,1,30,82,5080,7124 GGATTTCACTTCTATA-1,1,31,83,5200,7193 TGAGTGGTCCGTGACG-1,1,30,84,5080,7262 CGCTTTCTTGCATTCG-1,1,31,85,5200,7330 ACCCAACGCCCGTGGC-1,1,30,86,5080,7399 GAACGTCTCATGGTCG-1,1,31,87,5200,7468 AGGGTTCCCTTTGGTT-1,1,30,88,5080,7537 GTAGCTTCCTCTTGTT-1,1,31,89,5200,7606 GCATGAGGGACGCGGC-1,1,30,90,5080,7675 CTACCCTAAGGTCATA-1,1,31,91,5200,7743 TCACCGCTCGGCACTC-1,1,30,92,5080,7812 GGCTCGCGTTGAGGTA-1,1,31,93,5200,7881 CTAACGAAACTTGCTG-1,1,30,94,5080,7950 TTAAACTCGAATTCAT-1,1,31,95,5200,8019 TACTTTACTGAGCCGG-1,1,30,96,5080,8087 GCTTGGATCGATTAGG-1,1,31,97,5200,8156 CGGTTATCCAACAGTG-1,1,30,98,5080,8225 CAGACCTGTAAGTGTT-1,1,31,99,5200,8294 GACGGTCAATAGAAGC-1,1,30,100,5080,8363 CTGACTGCGCAGCTCG-1,1,31,101,5200,8432 CCATACCTTTACTTGT-1,1,30,102,5080,8500 GTAATAAAGGGCTCCC-1,1,31,103,5200,8569 GTGAACTCCCATTCGA-1,1,30,104,5080,8638 GTGGTTACTTCTTTCG-1,1,31,105,5200,8707 TCAGAACCTCCACAGG-1,1,30,106,5080,8776 TCCCACTCTCTTCCGG-1,1,31,107,5200,8845 ATCTTGACTTGTCCAA-1,1,30,108,5080,8913 TCGGGAACGTGCCTAG-1,1,31,109,5200,8982 GTTAGCCGTAAATCAA-1,1,30,110,5080,9051 ATTTACTAAGTCCATT-1,1,31,111,5200,9120 GGGTGCATATGAAAGC-1,1,30,112,5080,9189 TCCGAATGGTCCTGAG-1,1,31,113,5200,9258 TGATGGCTGTTTCTGA-1,1,30,114,5080,9326 AAATAAGGTAGTGCCC-1,1,31,115,5200,9395 CCACTATCCGGGTCAC-1,0,30,116,5080,9464 ACACCACATAATTAGC-1,0,31,117,5200,9533 CGCGGTAAGTCTAGCT-1,0,30,118,5080,9602 GCGGGCATTACGATGC-1,0,31,119,5200,9671 AGGATTGCTTACGACA-1,0,30,120,5080,9739 CTCGGGATAACACCTA-1,0,31,121,5200,9808 GTCGTCTGGTTGGCTA-1,0,30,122,5080,9877 GCAATTAGTCGCACCG-1,0,31,123,5200,9946 GTGACCTAAAGAATAA-1,0,30,124,5080,10015 CTGAGCGAGACTTATT-1,0,31,125,5200,10084 CAAGACTCAGAAGCGC-1,0,30,126,5080,10152 ACTTCGCTAGCGAGTG-1,0,31,127,5200,10221 CCATACTCGCCTCTCC-1,0,32,0,5320,1480 ACGATACCTATCCTGA-1,0,33,1,5440,1549 CTCACCAGTACAAGTG-1,0,32,2,5320,1618 CGAAGACGGTGAGTGC-1,0,33,3,5440,1686 AAATTAATAAGCGCGA-1,0,32,4,5320,1755 GGGCCCTTATCTATAC-1,0,33,5,5440,1824 CTGCCCACGAAGCGTT-1,0,32,6,5320,1893 GGACAAGTTGCAGTGA-1,0,33,7,5440,1962 GTCCGAGAGCAATCAT-1,0,32,8,5320,2031 ATGGCAGCCGAGAAAC-1,0,33,9,5440,2099 CCTCGGATGCTACCTG-1,0,32,10,5320,2168 ATACGGTGAAGATGCA-1,0,33,11,5440,2237 ACATCAGCTGGGACGC-1,0,32,12,5320,2306 GGTTGTGTAGCCTGGC-1,0,33,13,5440,2375 CCTGCGTTCTACGCTT-1,0,32,14,5320,2444 GAACGTTAGGAAGACG-1,0,33,15,5440,2512 CTGATAGTGTATCTCA-1,0,32,16,5320,2581 TTCTGCGAGCGCCCTT-1,0,33,17,5440,2650 CTTTGGCGCTTTATAC-1,0,32,18,5320,2719 TCCGAACTTGGCTTAC-1,0,33,19,5440,2788 TAGATTCCTGGTTATT-1,0,32,20,5320,2856 CCGACAAAGGGAGTGC-1,0,33,21,5440,2925 CCATGGCCCTTGTACC-1,0,32,22,5320,2994 GAAATATCACCATCAG-1,1,33,23,5440,3063 ACGAAATGGGCGGCAC-1,1,32,24,5320,3132 GTGAGCGTGCTGCACT-1,1,33,25,5440,3201 CCGCGGGTACGAAGAA-1,1,32,26,5320,3269 TCCCTGGCTCGCTGGA-1,1,33,27,5440,3338 CAGCTTAGTAGGTAGC-1,1,32,28,5320,3407 CACGAAAGTTAGTCCC-1,1,33,29,5440,3476 ACCTAATCGACTTCCT-1,1,32,30,5320,3545 AAGTAGTGACGCGAGG-1,1,33,31,5440,3614 TCCGATTACATTGCCG-1,1,32,32,5320,3682 CCTCCGACAATTCAAG-1,1,33,33,5440,3751 GTTCACAGGAGTCTAG-1,1,32,34,5320,3820 CGAAGTTGCTCTGTGT-1,1,33,35,5440,3889 GTCGGATATCTCAGAC-1,1,32,36,5320,3958 CGCTCTCCGTAGATTA-1,1,33,37,5440,4027 CAAGCAACGTCGGAGT-1,1,32,38,5320,4095 CCATTCCCTGCCCACA-1,1,33,39,5439,4164 CTTTGGCTTTAGTAAA-1,1,32,40,5320,4233 GGCTATTAAGTTGTAT-1,1,33,41,5439,4302 CCATTAGCGATAATCC-1,1,32,42,5320,4371 TGTTCTTCCATTGACT-1,1,33,43,5439,4440 AGATAACTTCAGGGCC-1,1,32,44,5320,4508 ATAGACGAAGAGAAAG-1,1,33,45,5439,4577 GGCGGAGTAATATTAG-1,1,32,46,5320,4646 TGACCCACGTTAGACA-1,1,33,47,5439,4715 TCACAGGTTATTGGGC-1,1,32,48,5320,4784 TCACGCATTGTAGATC-1,1,33,49,5439,4853 TTGAAGAATTCCCAGG-1,1,32,50,5320,4921 AAATGGTCAATGTGCC-1,1,33,51,5439,4990 TAGTGCCCTCCAGAGT-1,1,32,52,5320,5059 GGTATTGCCGAGTTTA-1,1,33,53,5439,5128 CGTATTAAGAGATCTA-1,1,32,54,5320,5197 ACTGTCCAGGATTATA-1,1,33,55,5439,5266 CGGGCAGCTAAACCGC-1,1,32,56,5320,5334 TTGCTGATCATGTTCG-1,1,33,57,5439,5403 TATGGGTACGTATCGT-1,1,32,58,5320,5472 CAGCTCACTGAGACAT-1,1,33,59,5439,5541 GGGACTGCATAGATAG-1,1,32,60,5320,5610 ACGCATTCGTGAGTAC-1,1,33,61,5439,5678 CTCTGGACGCCTGGTG-1,1,32,62,5320,5747 AGGGTTTAGTTCGGGA-1,1,33,63,5439,5816 GGGAGAACTCACAGTA-1,1,32,64,5320,5885 ATCAATCTGGGCTGCA-1,1,33,65,5439,5954 TCTTCGATACCAATAA-1,1,32,66,5320,6023 ACGTAGATTGCTGATG-1,1,33,67,5439,6091 TCTTGATGCGTAGCGA-1,1,32,68,5320,6160 GGGCTGCCTAGGGCGA-1,1,33,69,5439,6229 CTCTCACAATCGATGA-1,1,32,70,5320,6298 CCAAGCGTAACTCGTA-1,1,33,71,5439,6367 ACAACAGCATGAGCTA-1,1,32,72,5320,6436 GTCCCAACGTAAAGTA-1,1,33,73,5439,6504 TCGGAGTACATGAGTA-1,1,32,74,5320,6573 GGGAGTTAATGAGGCG-1,1,33,75,5439,6642 CCGGGCGGTCTCGTCA-1,1,32,76,5320,6711 CCGTAAGTTGGTCCCA-1,1,33,77,5439,6780 GGAGGGCTTGGTTGGC-1,1,32,78,5320,6849 TCGGACGCCCAGCCCA-1,1,33,79,5439,6917 TCTGTGCCATCATAGT-1,1,32,80,5320,6986 GTACTGGAGTTAGACC-1,1,33,81,5439,7055 GGAATGCGCTAGCGTG-1,1,32,82,5320,7124 GTGTGAATAACTTAGG-1,1,33,83,5439,7193 GGTCGGCCAGGAGCTT-1,1,32,84,5320,7262 TAGCCGGCGGTCAGCG-1,1,33,85,5439,7330 CGGGTGTACCCATTTA-1,1,32,86,5320,7399 AGTGATTCAAGCAGGA-1,1,33,87,5439,7468 GTTGGATTGAGAACAC-1,1,32,88,5320,7537 CACACGCGCTGTCTTA-1,1,33,89,5439,7606 TAGACGCCCGTACCGG-1,1,32,90,5320,7675 GGTTTCAATCGGTCAG-1,1,33,91,5439,7743 AATCTGCGTTGGGACG-1,1,32,92,5320,7812 TTACGGATGGTTCGAG-1,1,33,93,5439,7881 CGGCAGGGTCGGGTTG-1,1,32,94,5320,7950 GCTTTCAGAGGAGGTG-1,1,33,95,5439,8019 TCTTCCCATGGGCACA-1,1,32,96,5320,8088 TACCGCGGACTTGCAG-1,1,33,97,5439,8156 AGAATTATGGATTCGA-1,1,32,98,5320,8225 ATTGATGAGTCCTAAC-1,1,33,99,5439,8294 TAGGTCGCCGGAACTG-1,1,32,100,5320,8363 TAACCTACCGTCCGAG-1,1,33,101,5439,8432 CTTAGTAGGCCTACAG-1,1,32,102,5320,8500 CTAGATGTGAGTGTAA-1,1,33,103,5439,8569 ACTCCCGAATTCGTTT-1,1,32,104,5320,8638 GTTCATCGTTTGGCTG-1,1,33,105,5439,8707 ACTTTACCCTCATGAA-1,1,32,106,5320,8776 GCGAGAGTTGCGTCCA-1,1,33,107,5439,8845 GTTCGGGCGTACCATT-1,1,32,108,5320,8913 CGACTTTGTATAGCCT-1,1,33,109,5439,8982 GCCATCGATGCTGCAT-1,1,32,110,5320,9051 GCATTTCCAAGGCTCC-1,1,33,111,5439,9120 ATGTAAGGCTGCTCTT-1,1,32,112,5320,9189 ACGTTCGCAATCAATT-1,1,33,113,5439,9258 GTGACGAGGGTGACCC-1,1,32,114,5320,9326 ATTATAGCTACTTTAC-1,1,33,115,5439,9395 CGTGTGTTAAACCCTG-1,0,32,116,5320,9464 TTGGTATGGCTTGTGT-1,0,33,117,5439,9533 CATTCCCATTCCGTCG-1,0,32,118,5320,9602 TGCCGAAAGCGTATTC-1,0,33,119,5439,9671 CAACACATCTCCTGCC-1,0,32,120,5320,9739 CTGCCTCATATGCAAC-1,0,33,121,5439,9808 TCCCGCCTATGTGCGT-1,0,32,122,5320,9877 GGTTACCCGACACTTT-1,0,33,123,5439,9946 CCAGCGGGATCACCAG-1,0,32,124,5320,10015 ATGTTTCGGCCCGGAG-1,0,33,125,5439,10084 GCGTCTAACCTCCTAA-1,0,32,126,5320,10152 ATCAGGTAGCTGACAG-1,0,33,127,5439,10221 GGTATGAAAGAACTGA-1,0,34,0,5559,1480 GTGGCCTAATATCATT-1,0,35,1,5679,1549 CCTGTGAAACCGTAAC-1,0,34,2,5559,1618 GGCAGAGAGATCGGGA-1,0,35,3,5679,1686 TAGCGTCGAATATTGA-1,0,34,4,5559,1755 CGCCGACTATTCGCTA-1,0,35,5,5679,1824 TCTGGCGCAAGCCGGG-1,0,34,6,5559,1893 AGTGGTTGCGTATAGG-1,0,35,7,5679,1962 ATCGGTTACCTAGTAA-1,0,34,8,5559,2031 CCTGCCCGTTGTCTAG-1,0,35,9,5679,2099 GCACACGCCCATGGTC-1,0,34,10,5559,2168 AGTACGGCCCGTATCG-1,0,35,11,5679,2237 TATCTAGCCTAAAGGA-1,0,34,12,5559,2306 CACTCGGTTAGGAGGA-1,0,35,13,5679,2375 ATGTTCGTCGACCCAC-1,0,34,14,5559,2444 TTCCTCTGCCCGAATA-1,0,35,15,5679,2512 TTACTATCGGCTTCTC-1,0,34,16,5559,2581 GCCGCATTAGTCCGGC-1,0,35,17,5679,2650 TAAGGGCTGGGAGAGG-1,0,34,18,5559,2719 TAAGCAGGCGACACGC-1,0,35,19,5679,2788 AGCACTACCGGCCTGT-1,0,34,20,5559,2856 GAAAGCCCTTTGGACC-1,1,35,21,5679,2925 GACCGACTGAAGCGTC-1,1,34,22,5559,2994 CGGTGAAGACTAAAGT-1,1,35,23,5679,3063 CCCTGCGCTACGCATA-1,1,34,24,5559,3132 TACTGGACAGCTCGGC-1,1,35,25,5679,3201 TTAGTAGGGCGGCGGG-1,1,34,26,5559,3269 GAGGCTATCAAAGTCG-1,1,35,27,5679,3338 TTACCATTGATTACCC-1,1,34,28,5559,3407 ATACCACGGGCAACTT-1,1,35,29,5679,3476 TGTCCTAAGTCACCGC-1,1,34,30,5559,3545 AGGTAGGTACAAAGCT-1,1,35,31,5679,3614 GGCATACAGGTAGCGG-1,1,34,32,5559,3682 TGTAGTGATCTATAAT-1,1,35,33,5679,3751 TCCCGGGTGTGCTGCT-1,1,34,34,5559,3820 TACGATGTTGATCATC-1,1,35,35,5679,3889 CCTCTCTCCCATCTAG-1,1,34,36,5559,3958 GCAGGACTATAGAATA-1,1,35,37,5679,4027 CTAGTGAAGGACAGGA-1,1,34,38,5559,4095 TACGAGAACTTCACGT-1,1,35,39,5679,4164 CGTTGTTTCAATTCCC-1,1,34,40,5559,4233 GCAAATATTACGCTTT-1,1,35,41,5679,4302 CCAATAGTGCCGTCGA-1,1,34,42,5559,4371 ATTGCTGCTCCTCCAT-1,1,35,43,5679,4440 GAGATCTGCTTGGCAT-1,1,34,44,5559,4508 GCCGAAATTCCTACGT-1,1,35,45,5679,4577 GGCACTCCACTGGGCA-1,1,34,46,5559,4646 GGGTCACCGTGACGGT-1,1,35,47,5679,4715 CACTTAATCAGACGGA-1,1,34,48,5559,4784 CGTTTCGCTCATTACA-1,1,35,49,5679,4853 ATAAAGGCTCGGTCGT-1,1,34,50,5559,4921 CACTAAAGTTGCCTAT-1,1,35,51,5679,4990 GTGCTCAAGTACTGTC-1,1,34,52,5559,5059 CCATGCCTGTTTAGTA-1,1,35,53,5679,5128 TCTAGTTATCAGAAGA-1,1,34,54,5559,5197 TTGTAATCCGTACTCG-1,1,35,55,5679,5266 TCCCAGCTTTAGTCTG-1,1,34,56,5559,5334 CTACGCACGGAGTACC-1,1,35,57,5679,5403 AAATTAACGGGTAGCT-1,1,34,58,5559,5472 CGGCCACGCACAAAGT-1,1,35,59,5679,5541 GAAGCGTGAGGAATTT-1,1,34,60,5559,5610 ATATCTTAGGGCCTTC-1,1,35,61,5679,5678 ACGCGGGCCAAGGACA-1,1,34,62,5559,5747 GCGAGTTCTGCAAAGA-1,1,35,63,5679,5816 TATTCGTGCCAGAATA-1,1,34,64,5559,5885 AGGGCTGCAGTTACAG-1,1,35,65,5679,5954 CTAGCATAGTATAATG-1,1,34,66,5559,6023 TAGGTTCGAGTTCGTC-1,1,35,67,5679,6091 GAATTATAGTGAAAGG-1,1,34,68,5559,6160 CTATCGGGTCTCAACA-1,1,35,69,5679,6229 GCGCTAATTGAATAGA-1,1,34,70,5559,6298 ATGCGACAGTCCCATT-1,1,35,71,5679,6367 GGTAGTGCTCGCACCA-1,1,34,72,5559,6436 AAGCTCGTGCCAAGTC-1,1,35,73,5679,6504 TATTCAATTCTAATCC-1,1,34,74,5559,6573 TTCAAAGTCTCTAGCC-1,1,35,75,5679,6642 TTGAATATGGACTTTC-1,1,34,76,5559,6711 AAGAGCTCTTTATCGG-1,1,35,77,5679,6780 TTACTCCGGCCGGGAA-1,1,34,78,5559,6849 AAACGAGACGGTTGAT-1,1,35,79,5679,6917 GCTAAGTAGTTTCTCT-1,1,34,80,5559,6986 ATAACGCCGGAGGGTC-1,1,35,81,5679,7055 GGATCCGGAATATACT-1,1,34,82,5559,7124 TGAAAGGACCTGACTC-1,1,35,83,5679,7193 TCCGCGGCAGCATCTG-1,1,34,84,5559,7262 TGCATATGTCTGTCAC-1,1,35,85,5679,7330 TGTAGGAGAAATTTCC-1,1,34,86,5559,7399 AGTGAGACTTCCAGTA-1,1,35,87,5679,7468 CCCAAACATGCTGCTC-1,1,34,88,5559,7537 GCTTATGAAGCAGGAA-1,1,35,89,5679,7606 TTCTAACCGAAGCTTA-1,1,34,90,5559,7675 GGATGTCCTTACCGCA-1,1,35,91,5679,7743 AGGGTGCTCTCGAGGG-1,1,34,92,5559,7812 AACTCTCAATAGAGCG-1,1,35,93,5679,7881 TCTGAATTCCGTACAA-1,1,34,94,5559,7950 GCGTGGTACTGGGTTA-1,1,35,95,5679,8019 CGTCGGATAGTGTTGA-1,1,34,96,5559,8088 ATATGTCTCCCTAGCC-1,1,35,97,5679,8156 TCTTTAAGACTATGAA-1,1,34,98,5559,8225 TCATTTAAGTCTCCGA-1,1,35,99,5679,8294 GATATTGAGATTGGCG-1,1,34,100,5559,8363 TGACATCGAGCGGACC-1,1,35,101,5679,8432 GCGTAAATGGCCATAA-1,1,34,102,5559,8500 ATTGTACAACTCGGCT-1,1,35,103,5679,8569 TACGCTATAGAAACCT-1,1,34,104,5559,8638 CACCCAAATCTTATGT-1,1,35,105,5679,8707 AGATGATGGAGTCTGG-1,1,34,106,5559,8776 CCACGGTGCCCGGTAG-1,1,35,107,5679,8845 TCAAGAAATACTAGCT-1,1,34,108,5559,8913 AGGTATAATTGATAGT-1,1,35,109,5679,8982 CAAGGTCCTATAGGCT-1,1,34,110,5559,9051 CCGGCACGACCGTTTC-1,1,35,111,5679,9120 ACCTCCGTTATTCACC-1,1,34,112,5559,9189 GCAGCCTATATCACAT-1,1,35,113,5679,9258 GGTATAGTGACACATA-1,1,34,114,5559,9326 AAATTCCAGGTCCAAA-1,1,35,115,5679,9395 TCTTTAGCAGGCGAAC-1,0,34,116,5559,9464 TATTGACATTTCTGCC-1,0,35,117,5679,9533 TCTGATCGGGTGCTAG-1,0,34,118,5559,9602 GGCCCGGAGCATGTCT-1,0,35,119,5679,9671 GGGCGCAGCGTTACTC-1,0,34,120,5559,9739 TTGGCGATCCGAATAT-1,0,35,121,5679,9808 CCACGTAAATTAGACT-1,0,34,122,5559,9877 TCTGATTGGAAATGGA-1,0,35,123,5679,9946 ATGGCGGAATAGTCGC-1,0,34,124,5559,10015 ATCGCTTTACGTCTCA-1,0,35,125,5679,10084 TACGTGCAAGGTTCCT-1,0,34,126,5559,10152 CAGGACAGCTGCCCTT-1,0,35,127,5679,10221 CAAACCAGGTCTGCAT-1,0,36,0,5799,1480 ACAAGCTATATGGAAG-1,0,37,1,5919,1549 TCGCCCACTGCGAGAG-1,0,36,2,5799,1618 AGCCGCAAATTCAAAT-1,0,37,3,5919,1686 TTAACGTTAAAGCCTG-1,0,36,4,5799,1755 CAGCGCCAACACGATA-1,0,37,5,5919,1824 ATCCAATGGTACCGAA-1,0,36,6,5799,1893 GTGCTGCAGATAAGGA-1,0,37,7,5919,1962 GGCCTTTGCAACTGGC-1,0,36,8,5799,2031 GTCGTACCTACGATTG-1,1,37,9,5919,2099 TAGAAATTCACGTATA-1,0,36,10,5799,2168 AGAATAAATCTTCAGG-1,0,37,11,5919,2237 CATTGCGAAATGGGCG-1,0,36,12,5799,2306 GTCTACTCAATTACAA-1,0,37,13,5919,2375 TGTAATGACCACAATA-1,0,36,14,5799,2444 AAAGTCGACCCTCAGT-1,0,37,15,5919,2512 TACTCGGCACGCCGGG-1,0,36,16,5799,2581 AGGTGTATCGCCATGA-1,0,37,17,5919,2650 TGTGCTTTACGTAAGA-1,0,36,18,5799,2719 AAACCTCATGAAGTTG-1,0,37,19,5919,2788 TATAGGGTACTCATGA-1,0,36,20,5799,2857 CCAGCTGATGGTACTT-1,1,37,21,5919,2925 AATATTGGAGTATTGA-1,1,36,22,5799,2994 GGCCCTCACCCACTTA-1,1,37,23,5919,3063 AACCAAGACTTCTCTG-1,1,36,24,5799,3132 TCGTATTACCCATTGC-1,1,37,25,5919,3201 ATTCGACGCCGGGCCT-1,1,36,26,5799,3269 GGCGCAGGACATCTTC-1,1,37,27,5919,3338 GTACTCCCTTATCGCT-1,1,36,28,5799,3407 TGGTCTGTTGGGCGTA-1,1,37,29,5919,3476 AATAACAACGCTCGGC-1,1,36,30,5799,3545 CATACCCGTACCCAGT-1,1,37,31,5919,3614 ACAATCCATTTAAACC-1,1,36,32,5799,3682 GTTACAATTGGTGACG-1,1,37,33,5919,3751 TTGCCCTGATCACGGG-1,1,36,34,5799,3820 CTAACCGCGCGCCCGT-1,1,37,35,5919,3889 CTAAAGAATGCCTACT-1,1,36,36,5799,3958 ACCCATCTTGAGGGTA-1,1,37,37,5919,4027 GATCTTTGCAGGGTAT-1,1,36,38,5799,4095 GGGTACTTCATGAACT-1,1,37,39,5919,4164 GCCGCTTGTGAGAAAC-1,1,36,40,5799,4233 CCTGTAAGACATGATA-1,1,37,41,5919,4302 CGACAGTTCGCGTTAT-1,1,36,42,5799,4371 ACGATGCATATGTTAT-1,1,37,43,5919,4440 TGTTCCGCTTCCATGA-1,1,36,44,5799,4508 GGATGACGCGAGTTTA-1,1,37,45,5919,4577 GAAGTTTCCACTCAAT-1,1,36,46,5799,4646 GCGAGGCCCGAGCAGA-1,1,37,47,5919,4715 CATACTATGTAATTGT-1,1,36,48,5799,4784 CCAATGTCACAGCAAG-1,1,37,49,5919,4853 GTTGGATTTGCGTTGG-1,1,36,50,5799,4921 GGGAGGATGCCCGAAA-1,1,37,51,5919,4990 GATCGCGGGCTCTCCA-1,1,36,52,5799,5059 GTTCGCCATAAGTGCC-1,1,37,53,5919,5128 AGATTATAGGACGTTT-1,1,36,54,5799,5197 TCGAGACCAACACCGT-1,1,37,55,5919,5266 TATGGGACCGAGCAGG-1,1,36,56,5799,5334 GATGCGTCCTGCATTC-1,1,37,57,5919,5403 TATGGTCTGAGTAACA-1,1,36,58,5799,5472 GCATAGAGCACTCAGG-1,1,37,59,5918,5541 CTTCATTGTCAGTGGA-1,1,36,60,5799,5610 GCAGATTAGGGATATC-1,1,37,61,5918,5679 CCTGTCGCCCGTAAAT-1,1,36,62,5799,5747 CAATTTCGTATAAGGG-1,1,37,63,5918,5816 GTACACTTACCTGAAG-1,1,36,64,5799,5885 CCAGCCTGGACCAATA-1,1,37,65,5918,5954 ATGGAGCAGGCCGTGA-1,1,36,66,5799,6023 GTCATTAGAGCGAACG-1,1,37,67,5918,6091 AAGACTGCAAGCTACT-1,1,36,68,5799,6160 CTAGTCACGTCTTAAG-1,1,37,69,5918,6229 ACTCTTGTATAGTAAC-1,1,36,70,5799,6298 ATTAGGCGATGCTTTC-1,1,37,71,5918,6367 TTCGGGACTAATCGCG-1,1,36,72,5799,6436 TGGACTGTTCGCTCAA-1,1,37,73,5918,6504 AACGTGCGAAAGTCTC-1,1,36,74,5799,6573 CCACCCAAGGAAAGTG-1,1,37,75,5918,6642 CCGCACAAAGACCAAC-1,1,36,76,5799,6711 GCGATTGTTAACGTTA-1,1,37,77,5918,6780 ACTCGTCAGTAATCCC-1,1,36,78,5799,6849 GGTGATAAGGAGCAGT-1,1,37,79,5918,6917 AAGAGGCATGGATCGC-1,1,36,80,5799,6986 CACGTTCGTGCTCTAG-1,1,37,81,5918,7055 CTATTTGGTTACGGAT-1,1,36,82,5799,7124 GTACAGAGGCAAGGGT-1,1,37,83,5918,7193 GGGCCGGCCGAAGTAC-1,1,36,84,5799,7262 CCTGAACGATATATTC-1,1,37,85,5918,7330 CCGGGCTGCTCCATAC-1,1,36,86,5799,7399 TACTTGTTAGTAGTCC-1,1,37,87,5918,7468 CCTAGGCGTAGCGATC-1,1,36,88,5799,7537 CTGGCGCACAGGTCTG-1,1,37,89,5918,7606 ACTTATACTTACCCGG-1,1,36,90,5799,7675 GAAGTCTCCCTAGCGA-1,1,37,91,5918,7743 ACCGATGGTAGCATCG-1,1,36,92,5799,7812 CGAGTTTATCGGACTG-1,1,37,93,5918,7881 CATAACGGACAGTCGT-1,1,36,94,5799,7950 TGACGATGCACTAGAA-1,1,37,95,5918,8019 TAGGGAGCTTGGGATG-1,1,36,96,5799,8088 AGGGTCGATGCGAACT-1,1,37,97,5918,8156 TATATCCCTGGGAGGA-1,1,36,98,5799,8225 CATCTTACACCACCTC-1,1,37,99,5918,8294 GTGCGACAGGGAGTGT-1,1,36,100,5799,8363 CCGATCTCAACCTTAT-1,1,37,101,5918,8432 ACGATCATCTTGTAAA-1,1,36,102,5799,8500 GAAAGAACAGCGTTAT-1,1,37,103,5918,8569 CTAGGTCTGAAGGAAT-1,1,36,104,5799,8638 ATATCAACCTACAGAG-1,1,37,105,5918,8707 AAATAGCTTAGACTTT-1,1,36,106,5799,8776 GCGACATGTAAACATC-1,1,37,107,5918,8845 ATAAGTAGGGCGACTC-1,1,36,108,5799,8913 GCGAGCGCATGCTCCC-1,1,37,109,5918,8982 AGGGACCGGCTGCGTT-1,1,36,110,5799,9051 CCTATGAAGTGGTGCC-1,1,37,111,5918,9120 GCTTACGTAGTTAGTA-1,1,36,112,5799,9189 CATACTTAGGCAATAC-1,1,37,113,5918,9258 CCTGTCCCTCACGTTA-1,1,36,114,5799,9326 CAATGTGCCAACCCTT-1,1,37,115,5918,9395 GTTAAGTTAGAGTGGG-1,0,36,116,5799,9464 CTGGGATACGCTACCC-1,0,37,117,5918,9533 AACCTGTCACGGAATT-1,0,36,118,5799,9602 ACTGCGGACACACCGT-1,0,37,119,5918,9671 CCGTGAGGCATTCATG-1,0,36,120,5799,9739 GCCCAGATGCTGGAGA-1,0,37,121,5918,9808 TCTGGCCGTTCAAGTT-1,0,36,122,5799,9877 ATACGAAGGCTTTCCA-1,0,37,123,5918,9946 GATCCGAATATAAGTG-1,0,36,124,5799,10015 GTGGAGCATGTCGGCC-1,0,37,125,5918,10084 ACTCTTCAGCTCCCGC-1,0,36,126,5799,10152 CCCGATAGCCTCGCCT-1,0,37,127,5918,10221 ACAGGTGTGTTGTTGC-1,0,38,0,6038,1480 TGAACTGCTATGACTT-1,1,39,1,6158,1549 TGACATATATGACGAT-1,1,38,2,6038,1618 AAGTCTTCTGTGGCCT-1,1,39,3,6158,1686 ACCAGACCATAACAAC-1,1,38,4,6038,1755 TGAGACGTACCTCTCA-1,1,39,5,6158,1824 GACCGTTACATGCGAC-1,1,38,6,6038,1893 GGTTCGGATTATACTA-1,1,39,7,6158,1962 CCTCCTGAGCCCACAT-1,1,38,8,6038,2031 CCGCGATTTGGTAGGT-1,1,39,9,6158,2099 AATCTCTACTGTGGTT-1,1,38,10,6038,2168 ACTTTGACTGCATCCT-1,1,39,11,6158,2237 CCCTGACTAACAAATT-1,0,38,12,6038,2306 ACGCTGTGAGGCGTAG-1,1,39,13,6158,2375 GCATACGAGGTCTTTA-1,0,38,14,6038,2444 TCGGGATTCAAACATA-1,0,39,15,6158,2512 GGGCCCTACGAAAGGG-1,0,38,16,6038,2581 CGCCAAGAAGCCGAGT-1,0,39,17,6158,2650 GGTACATCTGGGACGA-1,0,38,18,6038,2719 GGATGCTGGCGTTCCT-1,0,39,19,6158,2788 CCGATTCGAGGGACCC-1,1,38,20,6038,2857 CCACTGGTGGCTGGTT-1,1,39,21,6158,2925 GACAGGCACACACTAT-1,1,38,22,6038,2994 TCAACGCGACCGGCAG-1,1,39,23,6158,3063 CTACGACTAGCTATAA-1,1,38,24,6038,3132 CGGTTGACCTGGCATA-1,1,39,25,6158,3201 ATCCTGAATCGCTGCG-1,1,38,26,6038,3269 GTTTCATATCGTCGCT-1,1,39,27,6158,3338 ATAAATATTAGCAGCT-1,1,38,28,6038,3407 AAGAGGATGTACGCGA-1,1,39,29,6158,3476 TCCTGCGTTGATACTC-1,1,38,30,6038,3545 CGTGCATTGTCGACGC-1,1,39,31,6158,3614 CCGGGTTCGAGGTTAC-1,1,38,32,6038,3682 CCCAATTTCACAACTT-1,1,39,33,6158,3751 TGATTTATTAGCTGTG-1,1,38,34,6038,3820 TGGAAGAAGGGAACGT-1,1,39,35,6158,3889 GACGCTTGCTTCTAAA-1,1,38,36,6038,3958 GGGAACGGGAGGTTAG-1,1,39,37,6158,4027 GCGGCTCTGACGTACC-1,1,38,38,6038,4095 ACGTTAGATTTGCCCG-1,1,39,39,6158,4164 GAGAGGGCGCGAGGTT-1,1,38,40,6038,4233 GCGTCTCTGCATTGGG-1,1,39,41,6158,4302 GCAGCACACAGCCCAG-1,1,38,42,6038,4371 CAGGCCGTTTGGGTGT-1,1,39,43,6158,4440 AACTCAAGTTAATTGC-1,1,38,44,6038,4508 CTTCGTAGATAGGTGA-1,1,39,45,6158,4577 TGCAGAGTACCGAGCA-1,1,38,46,6038,4646 GAAGTGATTTATCGTG-1,1,39,47,6158,4715 CGCTACGGGACATTTA-1,1,38,48,6038,4784 CCACACTGAGATATTA-1,1,39,49,6158,4853 CGATCCGACCCAGTGC-1,1,38,50,6038,4921 CTGTACTTCTTAGCAT-1,1,39,51,6158,4990 ACTTATTAGGATCGGT-1,1,38,52,6038,5059 TAGTCCGCAGAGAATG-1,1,39,53,6158,5128 TTCACGAAAGGATCAC-1,1,38,54,6038,5197 TACATTTCTAACGTGC-1,1,39,55,6158,5266 ACCATATCCGCAATAA-1,1,38,56,6038,5334 CACTCAAGAGCTATGG-1,1,39,57,6158,5403 TGTACGAACAAATCCG-1,1,38,58,6038,5472 ATCATCCAATATTTGT-1,1,39,59,6158,5541 CGCTATTCTTAGGCTC-1,1,38,60,6038,5610 TGGCAGCAGTAATAGT-1,1,39,61,6158,5679 TCACGTGCCCGATTCA-1,1,38,62,6038,5747 CATACGGCGTCTGGGC-1,1,39,63,6158,5816 CACATGATTCAGCAAC-1,1,38,64,6038,5885 GCTAGTAGAGCTTGTA-1,1,39,65,6158,5954 TGCTGTTGAAGAACTC-1,1,38,66,6038,6023 CGGAGCATGGCGATCC-1,1,39,67,6158,6091 TAGCGTTGGGTCTTAC-1,1,38,68,6038,6160 GTAGCGGCTATACACT-1,1,39,69,6158,6229 TAACATACAATGTGGG-1,1,38,70,6038,6298 TCTTCGAATAGACGTT-1,1,39,71,6158,6367 GATCGTGACTGATATC-1,1,38,72,6038,6436 GATCCGGGAATTAACA-1,1,39,73,6158,6504 TTATATACGCTGTCAC-1,1,38,74,6038,6573 GTCGCGTAACCCGTTG-1,1,39,75,6158,6642 AGCTCTAGACGTTCCA-1,1,38,76,6038,6711 GTCAAGCGGACTCGGG-1,1,39,77,6158,6780 CGAGGGACTGCGGTCG-1,1,38,78,6038,6849 AATCGCCTCAGCGCCA-1,1,39,79,6158,6917 CTTGTTGCTGAGTCAA-1,1,38,80,6038,6986 GATATGAGACACTAAC-1,1,39,81,6158,7055 TTATGATCTTAACGAA-1,1,38,82,6038,7124 CGCCGCCCATGCCTGT-1,1,39,83,6158,7193 CTGGGATAAATAATGG-1,1,38,84,6038,7262 GTGCCCGTTCGGATTC-1,1,39,85,6158,7330 TTCAATACTCTGAATC-1,1,38,86,6038,7399 CGCACATGTCCACTAC-1,1,39,87,6158,7468 AGAAGAGCGCCGTTCC-1,1,38,88,6038,7537 GATAACTCGCACTGTG-1,1,39,89,6158,7606 AGTCGACGGTCTCAAG-1,1,38,90,6038,7675 GTGACCGCACACTACG-1,1,39,91,6158,7743 GTATGTGGGTCTAGTT-1,1,38,92,6038,7812 CTTGAGTTAGGGTAAT-1,1,39,93,6158,7881 TTAGCTGATTTGCCGT-1,1,38,94,6038,7950 GCTGTTGCTACCGAAC-1,1,39,95,6158,8019 TATTACCATCCTGCTT-1,1,38,96,6038,8088 TTGAATTCACGTGAGG-1,1,39,97,6158,8156 CCATCTCACCAGTGAA-1,1,38,98,6038,8225 CGCACGTGCGCTATCA-1,1,39,99,6158,8294 ACCCGGATGACGCATC-1,1,38,100,6038,8363 CGCTAGAGACCGCTGC-1,1,39,101,6158,8432 ATAGTTCCACCCACTC-1,1,38,102,6038,8501 GCAGACCCAGCACGTA-1,1,39,103,6158,8569 TAGACTACCTAGCGTT-1,1,38,104,6038,8638 GGTTCTACTCGTCTGA-1,1,39,105,6158,8707 GACTCACCCACGTGAG-1,1,38,106,6038,8776 AGCTCTTCGTAACCTT-1,1,39,107,6158,8845 ACTATCCAGGGCATGG-1,1,38,108,6038,8913 AAGGATCGATCGCTTG-1,1,39,109,6158,8982 ATATCGGTAGGGAGAT-1,1,38,110,6038,9051 TTCCAGACGAGATTTA-1,1,39,111,6158,9120 GACCGACGTGAAAGCA-1,1,38,112,6038,9189 CCTGGAAACGTTCTGC-1,1,39,113,6158,9258 CCGGTAATGGCTAGTC-1,1,38,114,6038,9326 GCCGTGGAAGAAATGT-1,1,39,115,6158,9395 GTCTTGAGGAGCAGTG-1,0,38,116,6038,9464 TCCCAAAGCCCTAAAT-1,0,39,117,6158,9533 TTGAGCGCCACGTGAT-1,0,38,118,6038,9602 TTGAGTCCCGCTGCTG-1,0,39,119,6158,9671 ATGGAACCTTTGCACA-1,0,38,120,6038,9739 GCTAGCACCTGGGCCA-1,0,39,121,6158,9808 CGCCGTCTACCCATCG-1,0,38,122,6038,9877 GATAGGTGTCCCGGGC-1,0,39,123,6158,9946 AGGTATGCGGACATTA-1,0,38,124,6038,10015 TTGGTTCGCTCAAAGG-1,0,39,125,6158,10084 TCTGGAGCGTAAGAGT-1,0,38,126,6038,10152 TGCCTAAATTTAATAG-1,0,39,127,6158,10221 TAATTTCCGTCCAGTA-1,1,40,0,6278,1480 TCCTTCAATCCCTACG-1,1,41,1,6398,1549 TACCTATCCCTAGAGG-1,1,40,2,6278,1618 GCATGGGTACTGACGC-1,1,41,3,6398,1686 GTCGGGAACATGGTAG-1,1,40,4,6278,1755 GCAAATGAGGACACTT-1,1,41,5,6398,1824 GAATGGGCTTATCGAC-1,1,40,6,6278,1893 TGGTCGTGCAAGGCAA-1,1,41,7,6398,1962 CACCACGCCACACAGA-1,1,40,8,6278,2031 GAACCTCGACCTACAC-1,1,41,9,6398,2099 CAATACGCTCTGAGGC-1,1,40,10,6278,2168 TGGTAAGCAGGATTGA-1,1,41,11,6398,2237 AGTGGCTCCGTCGGCC-1,1,40,12,6278,2306 GATCGGATAGAACCAT-1,1,41,13,6398,2375 GCTACAGTACGGACCG-1,1,40,14,6278,2444 TCTATTACTAGAGGAT-1,1,41,15,6398,2512 TTCAGGCGTCAAAGCC-1,1,40,16,6278,2581 AGACCGGGAAACCCTG-1,1,41,17,6398,2650 AGAGATCTCTAAAGCG-1,1,40,18,6278,2719 CCCTGCCCAATCCGCT-1,1,41,19,6398,2788 GTGGCGGTCCCAGCGT-1,1,40,20,6278,2857 GCATTGTAATTCATAT-1,1,41,21,6398,2925 CCGTTCCGAATCTCGG-1,1,40,22,6278,2994 AGCTTGATCTTAACTT-1,1,41,23,6398,3063 CCTGTACTCACGCCCA-1,1,40,24,6278,3132 AAGTGACGACCGAATT-1,1,41,25,6398,3201 CTCACTTGGCTGGTAA-1,1,40,26,6278,3270 CGCCTGGCCTACGTAA-1,1,41,27,6398,3338 CCCGTAAGTCTAGGCC-1,1,40,28,6278,3407 TTGGACATGTGGCTTA-1,1,41,29,6398,3476 ATTACGCGCTGGCAGG-1,1,40,30,6278,3545 ACGCGCTACACAGGGT-1,1,41,31,6398,3614 TACGTTTACCGGCAAT-1,1,40,32,6278,3682 CGAAACGCAATTCATG-1,1,41,33,6398,3751 TAGTCTAACAACGAGA-1,1,40,34,6278,3820 TTGCATGCTGATCACG-1,1,41,35,6398,3889 TCTGGGTAGCGCTCAT-1,1,40,36,6278,3958 ACATCGGTCAGCCGCG-1,1,41,37,6398,4027 AGATACCGGTGTTCAC-1,1,40,38,6278,4095 GATTACTGAATTTGGG-1,1,41,39,6398,4164 TCCAACTTTAAATTCT-1,1,40,40,6278,4233 TCCTAGCAAAGAAGCT-1,1,41,41,6398,4302 GTCTATCTGAGTTTCT-1,1,40,42,6278,4371 GATGTTCAATCCACGA-1,1,41,43,6398,4440 AGTTAAACACTTGCGA-1,1,40,44,6278,4508 AGCTCTTTACTCAGTT-1,1,41,45,6398,4577 ATCCAGGATTCGTGAA-1,1,40,46,6278,4646 AGTCAACACCACCATC-1,1,41,47,6398,4715 CGATACCTCGCGGACA-1,1,40,48,6278,4784 TACAACGCACAACTCA-1,1,41,49,6398,4853 AATTAAAGGTCGGCGT-1,1,40,50,6278,4921 TACGCAGTTCTTTCCT-1,1,41,51,6398,4990 GACCGTGCTGACGGTG-1,1,40,52,6278,5059 GGCAAATTACTTTACT-1,1,41,53,6398,5128 GGTACAAACATGCTAT-1,1,40,54,6278,5197 CGGGCCTTCTTTGTAA-1,1,41,55,6398,5266 CGTGAAGTTAATTCAC-1,1,40,56,6278,5334 ATAGTGAAGCGTTCTC-1,1,41,57,6398,5403 TACGCCATATTCTAAT-1,1,40,58,6278,5472 GCCGGGTTAGGGTCGC-1,1,41,59,6398,5541 TACATAGGCATACACC-1,1,40,60,6278,5610 GCCGATTGGCCAAGCT-1,1,41,61,6398,5679 CTGCCATGCATCACAT-1,1,40,62,6278,5747 TTATGAATGAAAGGGA-1,1,41,63,6398,5816 GCTGAGGCGTGAGTAT-1,1,40,64,6278,5885 GCGCCGTTCCACGATA-1,1,41,65,6398,5954 CGCATGGTGCGATGCT-1,1,40,66,6278,6023 AGGTTTCACACACCTT-1,1,41,67,6398,6091 CAAGGATCGCATGTTC-1,1,40,68,6278,6160 ACGTTAATGTCGAAGA-1,1,41,69,6398,6229 TCCAGAGCACCGGTTC-1,1,40,70,6278,6298 GATTCGACGGTTCACG-1,1,41,71,6398,6367 GTTTCTGCAGTCTCCC-1,1,40,72,6278,6436 GCTGCACGGTTTCTTA-1,1,41,73,6398,6504 CGTGCAGACTGGGACA-1,1,40,74,6278,6573 GTGTTACTATGCGTCC-1,1,41,75,6398,6642 TCCTCGGGCTGGGCTT-1,1,40,76,6278,6711 GTGAGGACACTTAAGG-1,1,41,77,6398,6780 ATACGCCGGCGAAACC-1,1,40,78,6278,6849 TCTGCCAGAAACTGCA-1,1,41,79,6397,6917 TTCTGCGGGTTAGCGG-1,1,40,80,6278,6986 CTCGGTACCACTGCTC-1,1,41,81,6397,7055 GTAAGTAACAGTCTGG-1,1,40,82,6278,7124 GTGCGTGTATATGAGC-1,1,41,83,6397,7193 ATTTGTCTTGGGAGCT-1,1,40,84,6278,7262 CCTCGGACCGGGATAG-1,1,41,85,6397,7330 TAGGTGCTCGCCTAGC-1,1,40,86,6278,7399 CTTTAGGAACACTGTT-1,1,41,87,6397,7468 TCGGGCCGTCGTGGTA-1,1,40,88,6278,7537 AGTGCTTGCACGAATA-1,1,41,89,6397,7606 TGCAGTTTCCTCCCAT-1,1,40,90,6278,7675 TGAGAGATTTACCACG-1,1,41,91,6397,7743 GAAACAGATGACCACC-1,1,40,92,6278,7812 AGCAACATATCTTATT-1,1,41,93,6397,7881 CAAGTGTGGTTGCAAA-1,1,40,94,6278,7950 GCCTCATCTGGAAATA-1,1,41,95,6397,8019 AACCCTACTGTCAATA-1,1,40,96,6278,8088 ACGTATTACTCCGATC-1,1,41,97,6397,8156 TCTGGGAACCTTTGAA-1,1,40,98,6278,8225 GCTCGCTCATGTCCAA-1,1,41,99,6397,8294 GCGCAAGAGCGCGCTG-1,1,40,100,6278,8363 TTGACGCTCCATGAGC-1,1,41,101,6397,8432 TATAGATGGTCGCAGT-1,1,40,102,6278,8501 TTACATGCCACAACTA-1,1,41,103,6397,8569 ACATGGCGCCAAAGTA-1,1,40,104,6278,8638 TATGGTTAGTGGGAGA-1,1,41,105,6397,8707 CATGACTTCGCTGAAT-1,1,40,106,6278,8776 ACCACCAATGTAACAA-1,1,41,107,6397,8845 TCTTAGAGCTCCAATT-1,1,40,108,6278,8913 CCACGAATTTAACCTC-1,1,41,109,6397,8982 TTCTTGCTAGCATCTC-1,1,40,110,6278,9051 ACACCTTACTACTTGC-1,1,41,111,6397,9120 AGTCGGTTGCGTGAGA-1,1,40,112,6278,9189 ACCTACAGTATGTGGT-1,1,41,113,6397,9258 GAGGATAAACAGTGCT-1,1,40,114,6278,9326 TTCCGGTATCTGTGTC-1,0,41,115,6397,9395 GGAGGCCGAAGTCGTC-1,0,40,116,6278,9464 TTCGCTAGGAAGTTGT-1,0,41,117,6397,9533 TAAAGACAACCCTTTA-1,0,40,118,6278,9602 GTTGCGCTAACATTAC-1,0,41,119,6397,9671 GCTGAACTCTCCAGGG-1,0,40,120,6278,9739 AGCCCTGTCGCACCGT-1,0,41,121,6397,9808 AGCGCTAGAGCGATGT-1,0,40,122,6278,9877 TGCGCCGTTAATAACG-1,0,41,123,6397,9946 TGACAACGCATGTCGC-1,0,40,124,6278,10015 CGTCTTGAGTGTGACG-1,0,41,125,6397,10084 GATAGGATTAATTACA-1,0,40,126,6278,10152 GATACCGTGTCGGAGT-1,0,41,127,6397,10221 TGTGTCGAAGTCGAGG-1,1,42,0,6517,1480 GGATCAGAGCCATCAG-1,1,43,1,6637,1549 GTCCCAATCATCCCGC-1,1,42,2,6517,1618 TGCCACACTAGAGGAA-1,1,43,3,6637,1686 TGAATTTCACTTGCCT-1,1,42,4,6517,1755 CTCAGATTGTGATAAG-1,1,43,5,6637,1824 CGGACGTTACTTGAAG-1,1,42,6,6517,1893 CCGCCTTGCGATGTCG-1,1,43,7,6637,1962 CCAGTCAAATCTCTTA-1,1,42,8,6517,2031 AAACAGCTTTCAGAAG-1,1,43,9,6637,2099 TAGCTGATGTGAAGCG-1,1,42,10,6517,2168 CTTATGCGCTCAGGGC-1,1,43,11,6637,2237 TGGCTCTTGTCGCGTA-1,1,42,12,6517,2306 TTGTGAGGCATGACGC-1,1,43,13,6637,2375 CATAAGCTCTCCGTCT-1,1,42,14,6517,2444 CCTTCTCAGCGTTCCT-1,1,43,15,6637,2512 TGCAGCTACGTACTTC-1,1,42,16,6517,2581 CTCTACACTGGCGATT-1,1,43,17,6637,2650 TGCAGATCGTCCTAGG-1,1,42,18,6517,2719 TGCCAAAGTCAGACTT-1,1,43,19,6637,2788 ACAATAGTCGTACGTT-1,1,42,20,6517,2857 CATGCCAACTCGCAAA-1,1,43,21,6637,2925 TGCAGAACTATATCGT-1,1,42,22,6517,2994 TCGTGTCACGCTGACA-1,1,43,23,6637,3063 TGATCAGGGAACTGCT-1,1,42,24,6517,3132 CTTGCAACCGCCTCCT-1,1,43,25,6637,3201 AGCCCATACATGTAAG-1,1,42,26,6517,3270 ATCCAATGGAGGGTCC-1,1,43,27,6637,3338 AAACCGGGTAGGTACC-1,1,42,28,6517,3407 GCAACCACGGCCGCGT-1,1,43,29,6637,3476 CGCTTATTCCCGGTCG-1,1,42,30,6517,3545 TTACTCTGGTACGTAC-1,1,43,31,6637,3614 GTGGTTTCCGCCTTTC-1,1,42,32,6517,3682 ATAGGCGGCTATAGAA-1,1,43,33,6637,3751 GTGCCATCACACGGTG-1,1,42,34,6517,3820 CCCAACATACGTCGCG-1,1,43,35,6637,3889 CGGTGCAGATAGAACG-1,1,42,36,6517,3958 GGGCGGGTTCCCTACG-1,1,43,37,6637,4027 TGAGCCATACAGTCTC-1,1,42,38,6517,4095 CTCCGCCCACATGAGG-1,1,43,39,6637,4164 GTTGAACCGGTTCCAT-1,1,42,40,6517,4233 TTGACTACCATATGGT-1,1,43,41,6637,4302 ACCATCGTATATGGTA-1,1,42,42,6517,4371 TGCGTAAGAACCTGAT-1,1,43,43,6637,4440 AGAAGGTTGCCGAATT-1,1,42,44,6517,4508 AGGACGACCCATTAGA-1,1,43,45,6637,4577 GGTGCTGGTACACATT-1,1,42,46,6517,4646 GCGCTATGCCGAGGCA-1,1,43,47,6637,4715 ACCCGGTTACACTTCC-1,1,42,48,6517,4784 TAACTCATCCGCGCGG-1,1,43,49,6637,4853 CACAATGAGCTGCTAT-1,1,42,50,6517,4921 GTTACTTTGGGCCTAG-1,1,43,51,6637,4990 GGGCCCGTCTTAAACA-1,1,42,52,6517,5059 GAAATTGTCTCTATAA-1,1,43,53,6637,5128 GGCGCATGAATTGATG-1,1,42,54,6517,5197 CATATAGGTACAGTCA-1,1,43,55,6637,5266 TCAACGAGGAGACAAA-1,1,42,56,6517,5334 TTGCACAATTCAGAAA-1,1,43,57,6637,5403 CATCGGACGGGTTAAT-1,1,42,58,6517,5472 ATTAAACATGCGGACC-1,1,43,59,6637,5541 TATCTACCACAGCGGG-1,1,42,60,6517,5610 CGAGACCCTAGAGTGT-1,1,43,61,6637,5679 ACATCGATCGTTTACC-1,1,42,62,6517,5747 ATCGACCCAATACAGA-1,1,43,63,6637,5816 GAATCTGAACATTCTC-1,1,42,64,6517,5885 AGTTCCTATTTATGTT-1,1,43,65,6637,5954 CAGTCTGTATACTGGG-1,1,42,66,6517,6023 GGAGACGACACCTTTG-1,1,43,67,6637,6092 CCTAAATTAACGGTTC-1,1,42,68,6517,6160 GCTACGACTTATTGGG-1,1,43,69,6637,6229 CTGTGCAGGGTAGGTC-1,1,42,70,6517,6298 ACGCCGCTAGACGACC-1,1,43,71,6637,6367 ACTTGACTCCCTCTTT-1,1,42,72,6517,6436 CGCCTCCCTCCTCTAT-1,1,43,73,6637,6504 CTAGATTTACGACGGC-1,1,42,74,6517,6573 GATGCTGTATTTCATC-1,1,43,75,6637,6642 TGCGTTTGTTGACACT-1,1,42,76,6517,6711 CGTGCCCTCCCGAAGA-1,1,43,77,6637,6780 ACTCTCTGACTTAGGT-1,1,42,78,6517,6849 CTGGGTAGGCAGTTAA-1,1,43,79,6637,6917 GTTTGGCCCAAGTTAT-1,1,42,80,6517,6986 GAATGTGGTCCGGATT-1,1,43,81,6637,7055 CCCAGTTAAGGCGCCG-1,1,42,82,6517,7124 CGGTACTAGAATCAAA-1,1,43,83,6637,7193 GCTTAATGTAACTAAC-1,1,42,84,6517,7262 AGGACAGTCGAATCCC-1,1,43,85,6637,7330 GACAGCCAGACCTGAC-1,1,42,86,6517,7399 GGCGAAATCTAACTTG-1,1,43,87,6637,7468 CTGGTAACACATAGAA-1,1,42,88,6517,7537 TAGCCATTTCAAAGTC-1,1,43,89,6637,7606 GGGATTTACCGCACCT-1,1,42,90,6517,7675 ATGCCATTTGCGACCA-1,1,43,91,6637,7743 GAATAGACGCGACCCA-1,1,42,92,6517,7812 TGTATGGCGCAGACAG-1,1,43,93,6637,7881 GGATGAAGATCGCTGA-1,1,42,94,6517,7950 CGACAATTTGATCTAA-1,1,43,95,6637,8019 AAAGTTGACTCCCGTA-1,1,42,96,6517,8088 CGCGGCTCAACTTGAA-1,1,43,97,6637,8156 CACGCGGAACTGTTGC-1,1,42,98,6517,8225 TCTTAGAGTGAACTCT-1,1,43,99,6637,8294 AGTCCATTGGCTGATG-1,1,42,100,6517,8363 TTAAGATAGGATTGAC-1,1,43,101,6637,8432 ACATCCTGGTAACTGT-1,1,42,102,6517,8501 CACCTTGGCGCCTTTG-1,1,43,103,6637,8569 GCTAGACCGTCTACTG-1,1,42,104,6517,8638 CGGCCCAGGTATATCC-1,1,43,105,6637,8707 GTCCATTACTGCTACG-1,1,42,106,6517,8776 GGGTTTAGGATAGGAT-1,1,43,107,6637,8845 TAATTAGGACATCCGT-1,1,42,108,6517,8913 GCTCCCAGTCGGTCCA-1,1,43,109,6637,8982 ATTCGTGCTATCTCTT-1,1,42,110,6517,9051 GTTAACTATGTTGTCA-1,1,43,111,6637,9120 GCTCCGCTCGCTTCAG-1,1,42,112,6517,9189 GCAACGGCTAGTTATG-1,1,43,113,6637,9258 AATCGCGCAGAGGACT-1,1,42,114,6517,9326 AGGTTACACCATGCCG-1,1,43,115,6637,9395 CGAGATTTCGCTCGGG-1,0,42,116,6517,9464 CGATAATACTCAGGTT-1,0,43,117,6637,9533 AAGGCAGGCTGTCTCC-1,0,42,118,6517,9602 GTAAGTCCACACTCTA-1,0,43,119,6637,9671 ATGAGGGCAGCGGCTA-1,0,42,120,6517,9739 GCCGCACTCCGTTTCA-1,0,43,121,6637,9808 GAGCACGGCGCCTCTT-1,0,42,122,6517,9877 ACAATTTGGCCATATT-1,0,43,123,6637,9946 CTGGTTCGCGAGCTAC-1,0,42,124,6517,10015 GACGGTCCTAGGGTGT-1,0,43,125,6637,10084 ACTCGCGATCTGACGC-1,0,42,126,6517,10152 GTGTACGAACCGTTCC-1,0,43,127,6637,10221 CTTTGACGTCGCTTCT-1,1,44,0,6757,1480 CGTTATCATACTTCCA-1,1,45,1,6877,1549 GCTATGCCAGCTTATG-1,1,44,2,6757,1618 CAGTCGGCCTAGATAT-1,1,45,3,6877,1686 CCCGTGAGGGCGGTGA-1,1,44,4,6757,1755 TCTCGTGTTACGAGGA-1,1,45,5,6877,1824 ACGTCTCGTTCCGGGA-1,1,44,6,6757,1893 CGAGAGCGCGTAGATA-1,1,45,7,6877,1962 GACAGATTTCTGGCTC-1,1,44,8,6757,2031 GGGCCTAAATGGGCTA-1,1,45,9,6877,2099 ACTTGTAGTCCCTTCA-1,1,44,10,6757,2168 CCCGAAGTTTCGCGAA-1,1,45,11,6877,2237 ACCATCCGCCAACTAG-1,1,44,12,6757,2306 TGCGAATATGGGATTT-1,1,45,13,6877,2375 TACATCCCTATCCCTG-1,1,44,14,6757,2444 GTGGGAAGACTGAATC-1,1,45,15,6877,2512 TCAACATCGACCGAGA-1,1,44,16,6757,2581 CTATGTGAGTCACGGC-1,1,45,17,6877,2650 CCGAACACTGGGCCTC-1,1,44,18,6757,2719 AAACTTGCAAACGTAT-1,1,45,19,6877,2788 AGGGCGAGCAGCTGAT-1,1,44,20,6757,2857 AACACGAGACGCGGCC-1,1,45,21,6877,2925 TGACGAATATTTCCCT-1,1,44,22,6757,2994 TCGGAGAGTATCGGGA-1,1,45,23,6877,3063 CAAATCTCTCACAAGG-1,1,44,24,6757,3132 AGGCCCTAGAACGCCA-1,1,45,25,6877,3201 TAGAGATCATGCAACT-1,1,44,26,6757,3270 TTGTTTCCATACAACT-1,1,45,27,6877,3338 GAGAGGTGCATTCTGG-1,1,44,28,6757,3407 GTGGACCAACCCGATT-1,1,45,29,6877,3476 CTGGGCCTGCTATATC-1,1,44,30,6757,3545 CATAGTCCACAAGAAC-1,1,45,31,6877,3614 TTGACATGAACGTGGA-1,1,44,32,6757,3682 GGTTACCACCCTCGGG-1,1,45,33,6877,3751 TACCGGTCGTTTCCAT-1,1,44,34,6757,3820 CGAGTACTAAAGAGGA-1,1,45,35,6877,3889 GCAAGAATTCCTTGGC-1,1,44,36,6757,3958 TCGCCGAAGTTGCGTC-1,1,45,37,6877,4027 TTGAGAGTACTGCTAA-1,1,44,38,6757,4095 GCCACAATTTAAGGAC-1,1,45,39,6877,4164 ATATTCAGTTAAACCT-1,1,44,40,6757,4233 TGAGTGCCTCTTAAAT-1,1,45,41,6877,4302 ATCAGACGGCACGCCG-1,1,44,42,6757,4371 GTGCGAAATCGAACAC-1,1,45,43,6877,4440 GTGCCGCTTCAAAGGT-1,1,44,44,6757,4508 GATACGATGGGAGTCA-1,1,45,45,6877,4577 GACACTGAGTTCAGTG-1,1,44,46,6757,4646 ATCCTGCGTGGAATGG-1,1,45,47,6877,4715 ATCCTACCTAAGCTCT-1,1,44,48,6757,4784 AGTGATATGAGTAGTT-1,1,45,49,6877,4853 ATGATGCAATGGTACA-1,1,44,50,6757,4921 GAAACCGAATTACCTT-1,1,45,51,6877,4990 AGTGACCTACTTTACG-1,1,44,52,6757,5059 CAAATGTCCTTCCGTG-1,1,45,53,6877,5128 TTACTGGGATATTTCA-1,1,44,54,6757,5197 CTTGCCCAGGCTCTAC-1,1,45,55,6877,5266 AAATCGTGTACCACAA-1,1,44,56,6757,5334 GTGATCATAGATCTGC-1,1,45,57,6877,5403 TGGCAGATTACGATCA-1,1,44,58,6757,5472 TCACCCTCTTAAGATT-1,1,45,59,6877,5541 CAGGATATATCGTTGT-1,1,44,60,6757,5610 CCTGACCACCGATGGT-1,1,45,61,6877,5679 CTAAAGGGAAATAGGA-1,1,44,62,6757,5747 CCGCTATCAGCACCAG-1,1,45,63,6877,5816 CTTTAGTGCTATTATT-1,1,44,64,6757,5885 CGGGAATTTATGTAAA-1,1,45,65,6877,5954 TACGACTGCCTCTTAG-1,1,44,66,6757,6023 AAACTGCTGGCTCCAA-1,1,45,67,6877,6092 GTACGTTTGCCCGTCA-1,1,44,68,6757,6160 GGCAAGGCGAAATAGC-1,1,45,69,6877,6229 GATCTTGGAGGGCATA-1,1,44,70,6757,6298 AGCGTGGTATTCTACT-1,1,45,71,6877,6367 CTAAGGGAATGATTGG-1,1,44,72,6757,6436 CATGGTAAGTAGCGTT-1,1,45,73,6877,6504 CGTTGAGCGACCGTCG-1,1,44,74,6757,6573 TGCCCGTACCGTTAAA-1,1,45,75,6877,6642 ACAAGGGCAGGCTCTG-1,1,44,76,6757,6711 GAGATCTTCCATGACA-1,1,45,77,6877,6780 AATGACGTAGGATGTC-1,1,44,78,6757,6849 GTGGTGGCCAAGTGAA-1,1,45,79,6877,6917 TCCCGTGTGCAATTTG-1,1,44,80,6757,6986 ACATCGTATGCAATGG-1,1,45,81,6877,7055 GCGAAACTTAACTGGA-1,1,44,82,6757,7124 AATTGAACGCTCTGGT-1,1,45,83,6877,7193 ACAAATGGTAGTGTTT-1,1,44,84,6757,7262 ATGGTCGCGTGGTTTC-1,1,45,85,6877,7330 TGTTATTGTATGTGGC-1,1,44,86,6757,7399 TTCCGGTTACCCACTT-1,1,45,87,6877,7468 GAGTGTGCGGTACCCA-1,1,44,88,6757,7537 CAAGATATTATAACGT-1,1,45,89,6877,7606 ACACACCAGGACCAGT-1,1,44,90,6757,7675 ATGGGCCTCGGCCTCT-1,1,45,91,6877,7743 AAGGTGATAAACCAGC-1,1,44,92,6757,7812 TCTTACTTATGCCTCT-1,1,45,93,6877,7881 AAAGTGTGATTTATCT-1,1,44,94,6757,7950 TGCTCCACAGTTCTTA-1,1,45,95,6877,8019 CTGGCTGATTCATCCT-1,1,44,96,6757,8088 TAAGGCTGAATCCCTC-1,1,45,97,6877,8156 TCTAGTGATATCGTGG-1,1,44,98,6757,8225 TCGAAGAACCGAGCAC-1,1,45,99,6876,8294 GACAAACATATGCAGG-1,1,44,100,6757,8363 AAGTCAATTGTCGTCA-1,1,45,101,6876,8432 AGTGAACAAACTTCTC-1,1,44,102,6757,8501 CATGATGGAAGTTAGC-1,1,45,103,6876,8569 AAGTGCCTTGACTGTA-1,1,44,104,6757,8638 ATCGCCAGTCAACATT-1,1,45,105,6876,8707 ACCGCGGTGGAAGTCG-1,1,44,106,6757,8776 TCTTCTATAACCCGCC-1,1,45,107,6876,8845 CACATTTCTTGTCAGA-1,1,44,108,6757,8914 TAGCGTCCCTCGATTG-1,1,45,109,6876,8982 GTTCGGATCGGGAACA-1,1,44,110,6757,9051 CAAACTCGCGACGCCG-1,1,45,111,6876,9120 GTCTTGTAGCTATTCA-1,1,44,112,6757,9189 TCTCGACGTATCGCCG-1,1,45,113,6876,9258 TTGCCAAGCAGAACCC-1,1,44,114,6757,9326 AAACCCGAACGAAATC-1,0,45,115,6876,9395 TTGAGCAGCCCACGGT-1,0,44,116,6757,9464 CGCCTTTAGCATGCTC-1,0,45,117,6876,9533 TGTGGCTCCCACCAAC-1,0,44,118,6757,9602 CCGCCGTTGAGGATAA-1,0,45,119,6876,9671 CAATACGAGAGTCTGA-1,0,44,120,6757,9739 CATCTAGTGAAGGGAA-1,0,45,121,6876,9808 GGTGGAGGTTGATACG-1,0,44,122,6757,9877 CCGCACACGAACGTGT-1,0,45,123,6876,9946 AGAACCCAGCGTGACA-1,0,44,124,6757,10015 GCGCTCGATCACCTGT-1,0,45,125,6876,10084 ATCATGGACTACCGAC-1,0,44,126,6757,10152 TACGCCGCCTCAGAAG-1,0,45,127,6876,10221 CGACCTACTAGACAAT-1,1,46,0,6997,1480 GAGTCTTGTAAAGGAC-1,1,47,1,7116,1549 AATATCCTAGCAAACT-1,1,46,2,6997,1618 CCCTAGGCAACAAGAG-1,1,47,3,7116,1686 ACAAAGAAGGTAGGCC-1,1,46,4,6997,1755 CCCTGGCTGTTCCTTC-1,1,47,5,7116,1824 TCGCCGCACCGCGTGA-1,1,46,6,6996,1893 TATAGCGCACGTTATC-1,1,47,7,7116,1962 TTATCTGACATTAGGA-1,1,46,8,6996,2031 AGTGGTGTTACCCGTG-1,1,47,9,7116,2099 GCCAAGAATACTTCTG-1,1,46,10,6996,2168 CCGGCGTGAGACTCTG-1,1,47,11,7116,2237 TTCCCGGCGCCAATAG-1,1,46,12,6996,2306 AAACAGGGTCTATATT-1,1,47,13,7116,2375 ACAGTAATACAACTTG-1,1,46,14,6996,2444 CGAACGGCCGGACAAC-1,1,47,15,7116,2512 GCAACACACTAGAACT-1,1,46,16,6996,2581 ACTCCCATTCCTAAAG-1,1,47,17,7116,2650 ACCTGCGTGTCATGTT-1,1,46,18,6996,2719 TACTTTCCGCACGCCA-1,1,47,19,7116,2788 AGGTCAGGTGAGAGTG-1,1,46,20,6996,2857 TCCTCCTAAGACATTC-1,1,47,21,7116,2925 ATGTGAAAGCCTAATG-1,1,46,22,6996,2994 AGTCGGCTCAACTTTA-1,1,47,23,7116,3063 CGATCTGTTGGAGGAC-1,1,46,24,6996,3132 ACGGGAGTGTCGGCCC-1,1,47,25,7116,3201 TTAACTTCAGGTAGGA-1,1,46,26,6996,3270 CCACGGAGCCATAAGA-1,1,47,27,7116,3338 CTTCTATGTTGAAGTA-1,1,46,28,6996,3407 CACCGTTGCGCGATAT-1,1,47,29,7116,3476 TCTAGCAATCTCCGCC-1,1,46,30,6996,3545 AGTTTGGCCAGACCTA-1,1,47,31,7116,3614 TTGTAAGGACCTAAGT-1,1,46,32,6996,3683 AAATTTGCGGGTGTGG-1,1,47,33,7116,3751 AAGTTCGGCCAACAGG-1,1,46,34,6996,3820 CCGCTTACCTCACTCT-1,1,47,35,7116,3889 ATCACGTGCTAATTAA-1,1,46,36,6996,3958 GGTGAAGTACAGGGAT-1,1,47,37,7116,4027 GCTGTATTACTGGCCC-1,1,46,38,6996,4095 AACGGCCATCTCCGGT-1,1,47,39,7116,4164 TAAGTAACATCTTGAC-1,1,46,40,6996,4233 TTCTTGAGCCGCGCTA-1,1,47,41,7116,4302 AGTGCGTAGCTCGTAA-1,1,46,42,6996,4371 GGGATGGTCGTAACCG-1,1,47,43,7116,4440 GTCTGGGCGGTCGAGA-1,1,46,44,6996,4508 CGGAACGTAAACATAG-1,1,47,45,7116,4577 TGCGACACCCTAGTGC-1,1,46,46,6996,4646 CAAACGAGTATCGCAG-1,1,47,47,7116,4715 TCAGTAGGGACTATAA-1,1,46,48,6996,4784 GCGGTTCCCTATCATG-1,1,47,49,7116,4853 GTGACTTCAGTAGTGC-1,1,46,50,6996,4921 CGTCACGTCCATTGGT-1,1,47,51,7116,4990 ATAAGTTACCGCGACG-1,1,46,52,6996,5059 CTGAATCCGAGACCTC-1,1,47,53,7116,5128 TACGACGCTTGCTGCG-1,1,46,54,6996,5197 GAATTCACCCGGGTGT-1,1,47,55,7116,5266 GGGTGACACCTTAACT-1,1,46,56,6996,5334 TGAGTAAATTAGCGTA-1,1,47,57,7116,5403 GAGTCCGCTTACCGGA-1,1,46,58,6996,5472 GGCGCGTTCGAGTTTA-1,1,47,59,7116,5541 ATTCATATACTGTCCA-1,1,46,60,6996,5610 ATAAACGGACCCGTAA-1,1,47,61,7116,5679 GTCGTACCATCTCGGG-1,1,46,62,6996,5747 ATAATAGCTGTTGAAT-1,1,47,63,7116,5816 TTCCGCGTGAGGCGAT-1,1,46,64,6996,5885 TACCGGCTCACTGCCC-1,1,47,65,7116,5954 GTATCTTTCATAACCA-1,1,46,66,6996,6023 GTTACCTACAACTTGC-1,1,47,67,7116,6092 TGACTATAATCCTTTC-1,1,46,68,6996,6160 AAATACCTATAAGCAT-1,1,47,69,7116,6229 TTATTAGAGCGTGTTC-1,1,46,70,6996,6298 ATGTGGACATCTTGAT-1,1,47,71,7116,6367 GTACGCTTCATTGCAC-1,1,46,72,6996,6436 CACATATTAGCAGGAT-1,1,47,73,7116,6504 CAAGAGGGCGGAGTAC-1,1,46,74,6996,6573 TCGCAAAGATGCATTT-1,1,47,75,7116,6642 GTCGTTATTCGCTTAT-1,1,46,76,6996,6711 TCGTGTACTATGGATG-1,1,47,77,7116,6780 GCGGAGAGGGAGAACG-1,1,46,78,6996,6849 TCACAGGGAATCGCAA-1,1,47,79,7116,6917 GACTGCACCAGCCCAG-1,1,46,80,6996,6986 TCCGCTGTCATCCCGG-1,1,47,81,7116,7055 AGATACTCAAGATCGA-1,1,46,82,6996,7124 ACTGAATGGCGAAAGT-1,1,47,83,7116,7193 TCCTACATCCACGGCC-1,1,46,84,6996,7262 TTCAGCCCTGGTCCAC-1,1,47,85,7116,7330 TTAGAGTTTAGAAGGA-1,1,46,86,6996,7399 GGTTAGCTATATGTCT-1,1,47,87,7116,7468 CTGGTTTCGAGCAAGA-1,1,46,88,6996,7537 TGGGCCCATACTAATT-1,1,47,89,7116,7606 ACTTATTTATGTGCCA-1,1,46,90,6996,7675 TTAGTTATTCGTGGCA-1,1,47,91,7116,7743 AACCGCTAAGGGATGC-1,1,46,92,6996,7812 ATACGTCCACTCCTGT-1,1,47,93,7116,7881 CGACACGCTCCGACAG-1,1,46,94,6996,7950 TCTGAACTCGTACCCG-1,1,47,95,7116,8019 AGGATATAGGGATTTA-1,1,46,96,6996,8088 GTGATCACTAACGCCT-1,1,47,97,7116,8156 ACCGGGCCTTTGTTGA-1,1,46,98,6996,8225 TTGACAGGAGCTCCCG-1,1,47,99,7116,8294 CTCTTCTATTGACTGG-1,1,46,100,6996,8363 CGTGGCCGAATATCTA-1,1,47,101,7116,8432 GGTTTAGCCTTTCTTG-1,1,46,102,6996,8501 TCAAGGTTACTACACC-1,1,47,103,7116,8569 TTGACTATTGTCCGGC-1,1,46,104,6996,8638 CGGGAATATAGTATAC-1,1,47,105,7116,8707 GCAACAGCAGTATGCG-1,1,46,106,6996,8776 ATCAAACACTGTTCCA-1,1,47,107,7116,8845 TGGGCAATAGTTGGGT-1,1,46,108,6996,8914 TGAATGTCAGCCGGCC-1,1,47,109,7116,8982 CGGCTCTAAAGCTGCA-1,1,46,110,6996,9051 GGACACAAGTTTACAC-1,1,47,111,7116,9120 CCGAGAAGTCGCATAA-1,1,46,112,6996,9189 AACTACCCGTTTGTCA-1,1,47,113,7116,9258 GCACAAACGAGGCGTG-1,1,46,114,6996,9326 CACACAGCTTGCGCTC-1,0,47,115,7116,9395 GTGCTTACATCAGCGC-1,0,46,116,6996,9464 GCAAACGTCGCCAGGT-1,0,47,117,7116,9533 GAATAGCATTTAGGGT-1,0,46,118,6996,9602 TACTGTTTCTCTGGTA-1,0,47,119,7116,9671 TCCTATCATAGGTAAC-1,0,46,120,6996,9739 TTCGGTGGAGACGCCC-1,0,47,121,7116,9808 TGTTGCCGTCGTCCCA-1,0,46,122,6996,9877 CCAACTTGATAGATCC-1,0,47,123,7116,9946 CAAAGGTCATCTGAAA-1,0,46,124,6996,10015 CTAGCTTAATGGTCCC-1,0,47,125,7116,10084 AGGCCACATTGGTTAC-1,0,46,126,6996,10152 TTAGGATGGGAGGGTA-1,0,47,127,7116,10221 TATGACCTTGCGCTGG-1,1,48,0,7236,1480 ATATACATGTATGGTA-1,1,49,1,7356,1549 TGTGTGACCATGAATC-1,1,48,2,7236,1618 CCCACTCCACGGTATC-1,1,49,3,7356,1686 GGGCAGACGTCACTGC-1,1,48,4,7236,1755 TCAAAGAGCTATCTGT-1,1,49,5,7356,1824 AGATGCATCCTGTGTC-1,1,48,6,7236,1893 GTGAAGTCACGACTCG-1,1,49,7,7356,1962 TGATTCAGGTCCCGCG-1,1,48,8,7236,2031 CGCCACAGGTCGCGAT-1,1,49,9,7356,2099 TTGAATCGTTGTATAA-1,1,48,10,7236,2168 TGGCCAATTTGGTACT-1,1,49,11,7356,2237 CGACCCTTAACGCCGG-1,1,48,12,7236,2306 TCGGCGTACTGCACAA-1,1,49,13,7356,2375 GAGTAAGGCCACGGGA-1,1,48,14,7236,2444 ATCAGCTCGTCCACTA-1,1,49,15,7356,2512 AGGATCACGCGATCTG-1,1,48,16,7236,2581 AAATGGCCCGTGCCCT-1,1,49,17,7356,2650 CAGTACCAGTTTACGT-1,1,48,18,7236,2719 GGTCGTAAGCTCGCAC-1,1,49,19,7356,2788 CGTTCATGGTGCGCGT-1,1,48,20,7236,2857 GACTACAAAGCGGTGG-1,1,49,21,7356,2925 CAGCTGGCGTAACCGT-1,1,48,22,7236,2994 ACTCGTAACCCGTCCT-1,1,49,23,7356,3063 CATATGTCAGGCTACG-1,1,48,24,7236,3132 GCCCGACTTCTTCCCG-1,1,49,25,7356,3201 CTGGCATCCGAATGAG-1,1,48,26,7236,3270 AAGTGCGTTAGAATCT-1,1,49,27,7356,3338 AGAAGTGATTCGTGAT-1,1,48,28,7236,3407 TACCTTAAGATTTCCC-1,1,49,29,7356,3476 AATGACAGCAATGTCT-1,1,48,30,7236,3545 TCAACGCAGGAAATAA-1,1,49,31,7356,3614 TATTCCTCCGCCCACT-1,1,48,32,7236,3683 ATCAAACGAAGGTTTG-1,1,49,33,7356,3751 TTGATTAGCTGTTTCT-1,1,48,34,7236,3820 CTGCTGAGGCCACGAA-1,1,49,35,7356,3889 CCGTGTTAAATTCCAT-1,1,48,36,7236,3958 CACGTCGGCAACCTCT-1,1,49,37,7356,4027 GTATTCTGAGAAACGA-1,1,48,38,7236,4095 CGGTGCGCGTTGGTCC-1,1,49,39,7356,4164 GTGATTCGCCGCTCAA-1,1,48,40,7236,4233 GCCCGCGCGTAAACGG-1,1,49,41,7356,4302 AACGTACTGTGGGTAC-1,1,48,42,7236,4371 GAGTATGCCCGCCTTG-1,1,49,43,7356,4440 TGATTCTGTCGCCGGT-1,1,48,44,7236,4508 GGGCGGCAAATGAATT-1,1,49,45,7356,4577 TTCCAATCTGGCTATC-1,1,48,46,7236,4646 GGAACCGTGTAAATTG-1,1,49,47,7356,4715 TTGGTCACACTCGTAA-1,1,48,48,7236,4784 CGAACCCGCATGCGTC-1,1,49,49,7356,4853 GGGCGTCACCACGTAA-1,1,48,50,7236,4921 TACCAGAAGTAGGTTC-1,1,49,51,7356,4990 TTGGATATCGTCTACG-1,1,48,52,7236,5059 TAGATATGGACTGGAA-1,1,49,53,7356,5128 GCGACGATAGTTGTAC-1,1,48,54,7236,5197 CTGGATTTACACTTGA-1,1,49,55,7356,5266 GTTATATTATCTCCCT-1,1,48,56,7236,5334 TATTCCACTCAGCTCG-1,1,49,57,7356,5403 CTGTTACCCAATCTAG-1,1,48,58,7236,5472 ACGCGAAGTCAGACGA-1,1,49,59,7356,5541 GATAGGTAACGTTGAC-1,1,48,60,7236,5610 TGTTCGTATTGCGGTG-1,1,49,61,7356,5679 GGTCAGTGGGTCCCAC-1,1,48,62,7236,5747 AATTCTAGAGTTAGGC-1,1,49,63,7356,5816 GTTTACGTTCCATCTG-1,1,48,64,7236,5885 AGACCCACCGCTGATC-1,1,49,65,7356,5954 TCTAGCATGCCCAGAA-1,1,48,66,7236,6023 CCCGCAGCGCGAACTA-1,1,49,67,7356,6092 CTCTATTTGGCTGCAG-1,1,48,68,7236,6160 TTCTGCCGCGCCTAGA-1,1,49,69,7356,6229 ACTCCCTAGAATAGTA-1,1,48,70,7236,6298 CCGAACCTTCCCGGCC-1,1,49,71,7356,6367 TCAGACGCTATAGAAG-1,1,48,72,7236,6436 CAGGCGCCATGCTAGG-1,1,49,73,7356,6505 CACTCGAGCTGAACAA-1,1,48,74,7236,6573 ACAAGGAAATCCGCCC-1,1,49,75,7356,6642 ACCACGTGCAGCTATA-1,1,48,76,7236,6711 ACGGCGACGATGGGAA-1,1,49,77,7356,6780 TTACTAAAGGACTTTA-1,1,48,78,7236,6849 GGCTGAAATAGCAAAG-1,1,49,79,7356,6917 TTAGACGAGTCACCTC-1,1,48,80,7236,6986 GTAGTCGCGGGAATCA-1,1,49,81,7356,7055 GCAAACCCTACATTAT-1,1,48,82,7236,7124 GTTAAAGTAGGACTGG-1,1,49,83,7356,7193 ACCCTCCCTTGCTATT-1,1,48,84,7236,7262 CATGTCTCATTTATGG-1,1,49,85,7356,7330 AATAGAATCTGTTTCA-1,1,48,86,7236,7399 TCTCATGAGATAGGGT-1,1,49,87,7356,7468 ATGACTATGCGACATT-1,1,48,88,7236,7537 CCTAACCCAAACAAGT-1,1,49,89,7356,7606 AGTCAAGATGACACTT-1,1,48,90,7236,7675 CGGGAGCTTCAGTGTA-1,1,49,91,7356,7743 CCACAGTACCCATCCT-1,1,48,92,7236,7812 GAGCGCGCACGAGTAG-1,1,49,93,7356,7881 ACCAGTGCGGGAGACG-1,1,48,94,7236,7950 TCCTTACGACGGTCCG-1,1,49,95,7356,8019 TAGTCGATCACGGGTT-1,1,48,96,7236,8088 AGACGAAGTGCCGGTC-1,1,49,97,7356,8156 CGCTGGTGACTACCCT-1,1,48,98,7236,8225 AGGCATTGTCGTAGGG-1,1,49,99,7356,8294 TGGTAGAATATATGGG-1,1,48,100,7236,8363 TTCTTATCCGCTGGGT-1,1,49,101,7356,8432 AGTTTGGCACGGGTTG-1,1,48,102,7236,8501 GCATCGGCCGTGTAGG-1,1,49,103,7356,8569 ATGCGAGTCCCACCAC-1,1,48,104,7236,8638 TCGGCGAACCCAAACC-1,1,49,105,7356,8707 AGAGTAAACTTCACTA-1,1,48,106,7236,8776 AAGCCGAAGCGGTTTA-1,1,49,107,7356,8845 CCCGAGTTTCTCCGTA-1,1,48,108,7236,8914 AATATCGAATCAATGC-1,1,49,109,7356,8982 GCGCCTCCCACTCCGA-1,1,48,110,7236,9051 CGTTAAACTAGTTAGG-1,1,49,111,7356,9120 TGAGTTAAAGACATTC-1,1,48,112,7236,9189 AACAGGTAGTATGGAT-1,1,49,113,7356,9258 GAACGCGGGTCACACG-1,1,48,114,7236,9326 TGTTTGAGATCGTCAG-1,1,49,115,7356,9395 ATCTCGTGAGCGAAAC-1,0,48,116,7236,9464 CTGAGAAAGTTCGGCG-1,0,49,117,7356,9533 ATTACCACACTGCCTG-1,0,48,118,7236,9602 CTGCTGTCTAACGAGC-1,0,49,119,7355,9671 CGTGGAAGCCTCGTAC-1,0,48,120,7236,9739 GGACTCACAAATTAGG-1,0,49,121,7355,9808 CTTTGCTGTCATGGAT-1,0,48,122,7236,9877 GGTGTTGGGCGTCTTA-1,0,49,123,7355,9946 TACCATGTATTGATTT-1,0,48,124,7236,10015 GGTCTCCAAGTAGTGC-1,0,49,125,7355,10084 ATCCTTCTGAAAGAAC-1,0,48,126,7236,10152 CCGGAAGTTATCAGTC-1,0,49,127,7355,10221 TTAGAGGGATATACAG-1,1,50,0,7476,1480 TTGTACACCTCGAACA-1,1,51,1,7595,1549 GTGGGTACTGAGCGTA-1,1,50,2,7476,1618 CTTAAGCAGCGAGCCG-1,1,51,3,7595,1686 GCATTGACTTGCGGAA-1,1,50,4,7476,1755 CCATAACCTGTGCAGT-1,1,51,5,7595,1824 GGGCTACTATTTCGTG-1,1,50,6,7476,1893 GGCGAGCGAAACGGCA-1,1,51,7,7595,1962 GGAGACCATCTACATA-1,1,50,8,7476,2031 AGACCAAACCACACCT-1,1,51,9,7595,2099 CGACGCATCCGTACCT-1,1,50,10,7476,2168 CCTAGGTAAAGGTAGC-1,1,51,11,7595,2237 AGCGGCGGTTAGCGGT-1,1,50,12,7476,2306 CTGGACGCAGTCCGGC-1,1,51,13,7595,2375 AGCCTAATACCCACGT-1,1,50,14,7476,2444 AATCTGGCTTTCTAGT-1,1,51,15,7595,2512 CACCCTTGGTGAGACC-1,1,50,16,7476,2581 GGATCTTGACTCAACC-1,1,51,17,7595,2650 ACGAGGATACCACTCT-1,1,50,18,7476,2719 GAGTTGATGGCAATTT-1,1,51,19,7595,2788 GTGGCAAACAGCGGCA-1,1,50,20,7476,2857 GATGTAACGAACCACC-1,1,51,21,7595,2925 AGCCGTGGCTAAATGT-1,1,50,22,7476,2994 CTCCCTCCTTTCGATC-1,1,51,23,7595,3063 TTGGAAGAATACAGTC-1,1,50,24,7476,3132 AGTTAAGTCAACCGCT-1,1,51,25,7595,3201 CTCATGGTAATTTGCG-1,1,50,26,7475,3270 AAAGTAGCATTGCTCA-1,1,51,27,7595,3338 TTGTGGTAGGAGGGAT-1,1,50,28,7475,3407 AGTCGTGGGCATTACG-1,1,51,29,7595,3476 ACCTAAGTACCTTTCA-1,1,50,30,7475,3545 GTAGAGGGAGACAAGT-1,1,51,31,7595,3614 GATCCTCGACACTGGC-1,1,50,32,7475,3683 CCTACATTCACAGACG-1,1,51,33,7595,3751 TTGACCGTGTTAATGA-1,1,50,34,7475,3820 TCTGTTACCCAGCATA-1,1,51,35,7595,3889 CTAACTGGTCCGGTTC-1,1,50,36,7475,3958 AGCGACAGGAACGGTC-1,1,51,37,7595,4027 TAATAGAACAGAGTTA-1,1,50,38,7475,4095 ACAGGTGGAGGTGAGG-1,1,51,39,7595,4164 TGCGAGAATATTACCC-1,1,50,40,7475,4233 TTGCGTCGGCCAACCG-1,1,51,41,7595,4302 AGGCTTCCCGAAGAAG-1,1,50,42,7475,4371 GCGGACCGCGTTGTGG-1,1,51,43,7595,4440 GTAATCTGATTCTTCG-1,1,50,44,7475,4508 CCGCGGAATGCGTCAC-1,1,51,45,7595,4577 TTCCACACAGATTTGA-1,1,50,46,7475,4646 CTTCTATTAATGCTAG-1,1,51,47,7595,4715 CATTTGAGTGGTACGT-1,1,50,48,7475,4784 TCACAGCAAACTCGAA-1,1,51,49,7595,4853 CAGACGAACCTGATAC-1,1,50,50,7475,4921 TAGCTAGAAGGCATGA-1,1,51,51,7595,4990 ATCCAGAGCAACAACC-1,1,50,52,7475,5059 TCCGGTTCGTCCGGTC-1,1,51,53,7595,5128 CGCGCATGTTTGATTG-1,1,50,54,7475,5197 TGGCGATCAAGTTATG-1,1,51,55,7595,5266 CCCTTTGACAGGTCTT-1,1,50,56,7475,5334 CAGAGACGGTCACCCA-1,1,51,57,7595,5403 TAGCTCGCCTGATAAC-1,1,50,58,7475,5472 TTGTGTTTCCCGAAAG-1,1,51,59,7595,5541 TATACACAGACGCCTT-1,1,50,60,7475,5610 ACATTAGTTTATATCC-1,1,51,61,7595,5679 CCATCGCAGTTAAACT-1,1,50,62,7475,5747 AATTAGCGCTGCAGCG-1,1,51,63,7595,5816 TCCGCTTATCCCATTA-1,1,50,64,7475,5885 GTTTGGGCTTGTGAGC-1,1,51,65,7595,5954 CTTGTCAACATTCGAG-1,1,50,66,7475,6023 GGACCAACAGGATAAC-1,1,51,67,7595,6092 AAGCTAGATCGAGTAA-1,1,50,68,7475,6160 TACCGTGCCTCGGACC-1,1,51,69,7595,6229 GTAGCCAAACATGGGA-1,1,50,70,7475,6298 TGCCAGTACGTGGAGA-1,1,51,71,7595,6367 ATAAGGTGGAGAACAT-1,1,50,72,7475,6436 CTTTAATATTGGTCGA-1,1,51,73,7595,6505 TGGTTCAACGGGTAAT-1,1,50,74,7475,6573 GCTGCTACTGCGTAGC-1,1,51,75,7595,6642 CTGCACAACTACATAT-1,1,50,76,7475,6711 ATATTCCACATAGTGA-1,1,51,77,7595,6780 TGGCAAACTAAATTAC-1,1,50,78,7475,6849 ACCGCAATAACTGCCT-1,1,51,79,7595,6917 TCGCACCAGGAGGCAG-1,1,50,80,7475,6986 ACTTCAGGCTGATCCC-1,1,51,81,7595,7055 ACAAATCGCACCGAAT-1,1,50,82,7475,7124 TCTGATGTATTCTGTC-1,1,51,83,7595,7193 CTTTACCGAATAGTAG-1,1,50,84,7475,7262 GCAGATCCATAAGACT-1,1,51,85,7595,7330 TTCCTCGGACTAACCA-1,1,50,86,7475,7399 TTATCCGGGATCTATA-1,1,51,87,7595,7468 CTGGAAGACACGGTGG-1,1,50,88,7475,7537 GTTCGTCTAAAGAACT-1,1,51,89,7595,7606 GTCTATTGGTTCCGGT-1,1,50,90,7475,7675 CTAGGCGCCCTATCAG-1,1,51,91,7595,7743 AACGGACGTACGTATA-1,1,50,92,7475,7812 AACACACGCTCGCCGC-1,1,51,93,7595,7881 GCTACTATAGTAGAGT-1,1,50,94,7475,7950 AGCATATCAATATGCT-1,1,51,95,7595,8019 CGAACAGTATGGGCGT-1,1,50,96,7475,8088 ACAATTGTGTCTCTTT-1,1,51,97,7595,8156 GATCGCTACCCGATTT-1,1,50,98,7475,8225 ATTGCGATCAGTAACT-1,1,51,99,7595,8294 CAGCAGTCCAGACTAT-1,1,50,100,7475,8363 AGAGGCTTCGGAAACC-1,1,51,101,7595,8432 AAACAAGTATCTCCCA-1,1,50,102,7475,8501 GGCAGCAAACCTATGC-1,1,51,103,7595,8569 ACTAGTTGCGATCGTC-1,1,50,104,7475,8638 TTGGACCATCTGGCAA-1,1,51,105,7595,8707 CCCTCCTCGCTCGTAT-1,1,50,106,7475,8776 GAGCGCAAATACTCCG-1,1,51,107,7595,8845 ATTACATGTCAGTCTT-1,1,50,108,7475,8914 TTGGGACGTAAGAGTT-1,1,51,109,7595,8982 CTTCGGCCAATTGTTT-1,1,50,110,7475,9051 AGACCGCTCCGCGGTT-1,1,51,111,7595,9120 GACCGCGTCTGACGTG-1,1,50,112,7475,9189 CCAAATAACAAGATTC-1,1,51,113,7595,9258 TCTTTAGAGTCTAACA-1,1,50,114,7475,9327 CTCCCAATGAGTCGCG-1,0,51,115,7595,9395 TAGTCTTTCCGAATTG-1,0,50,116,7475,9464 GAGTAAACCGGAAAGT-1,0,51,117,7595,9533 GATCTCGACGCTGTGG-1,0,50,118,7475,9602 CTGACATAGAAATAGA-1,0,51,119,7595,9671 TATACCGAGTGCCACA-1,0,50,120,7475,9739 TCCGAACGTTGCCGCT-1,0,51,121,7595,9808 GCAGAAGGTAATCTCC-1,0,50,122,7475,9877 GGTACTAAGTGCTTTG-1,0,51,123,7595,9946 CAGAATATTCGTTATC-1,0,50,124,7475,10015 TAATCAACCAAATGGG-1,0,51,125,7595,10084 TCTGCTTAGAACAAGC-1,0,50,126,7475,10152 AACTGAGTTATACTGA-1,0,51,127,7595,10221 CCTCAACGATCGCTGT-1,1,52,0,7715,1480 CGGTACGGCAAACCCA-1,1,53,1,7835,1549 CAGATGTTTGTCCCAA-1,1,52,2,7715,1618 GTTTGTTAGCCAAGTA-1,1,53,3,7835,1686 ACGTGACAAAGTAAGT-1,1,52,4,7715,1755 TTGTCACCGCGGTATC-1,1,53,5,7835,1824 GATCTAACCGTATTCA-1,1,52,6,7715,1893 ATGGAAATTTAAGGAG-1,1,53,7,7835,1962 ATTGATCACCACATTT-1,1,52,8,7715,2031 ACTGCTCGGAAGGATG-1,1,53,9,7835,2099 TCTAAAGAACAGTCTC-1,1,52,10,7715,2168 CTGGGTTGAGTTAAAG-1,1,53,11,7835,2237 CCCAGTAAACTTGGGA-1,1,52,12,7715,2306 AGATTCACAACCGATA-1,1,53,13,7835,2375 AGAAGGTACACTTCAC-1,1,52,14,7715,2444 GCAGGAACTTAGATCT-1,1,53,15,7835,2512 AATCTAGGTTTACTTG-1,1,52,16,7715,2581 CCCGGTGTATCGGAAT-1,1,53,17,7835,2650 TTATCCTCAAGGAATA-1,1,52,18,7715,2719 AGCATCATTTCGAAAG-1,1,53,19,7835,2788 CGCGAGTCTGCCGGGT-1,1,52,20,7715,2857 TGCGTCATGACTGAGC-1,1,53,21,7835,2925 GTATGAAATTTCACTC-1,1,52,22,7715,2994 TTGGTTGCGGTGCGCG-1,1,53,23,7835,3063 ACAGAACTGAGAACAA-1,1,52,24,7715,3132 CTACTATCATAGGTTT-1,1,53,25,7835,3201 CCTCTATCGATTAGCA-1,1,52,26,7715,3270 CCGTATCTCGTCGTAG-1,1,53,27,7835,3338 TCACGATGTCCGTGGA-1,1,52,28,7715,3407 TCAACAAAGATAATTC-1,1,53,29,7835,3476 ATGACGCGTTCTATCC-1,1,52,30,7715,3545 ATTTGCGCGAGTAGCT-1,1,53,31,7835,3614 TTCTTGGACGATCTGC-1,1,52,32,7715,3683 AGACGACGATGCCGCT-1,1,53,33,7835,3751 GGTCTCTGAATGGACT-1,1,52,34,7715,3820 GCTCAATCCGTTTATT-1,1,53,35,7835,3889 CCAGAAAGCAACTCAT-1,1,52,36,7715,3958 CACCGTTAGGGATCAC-1,1,53,37,7835,4027 AATAACACTAGAACAA-1,1,52,38,7715,4096 CACCCGGTTTGTGACT-1,1,53,39,7835,4164 CCACCAACTTTACTGT-1,1,52,40,7715,4233 AACTCTCAGTGTGCTC-1,1,53,41,7835,4302 AAACCGTTCGTCCAGG-1,1,52,42,7715,4371 CAGCGATTCCCTTCAA-1,1,53,43,7835,4440 GCTAGCTTGAATAGCT-1,1,52,44,7715,4508 TTGCGGCATCAGAAAG-1,1,53,45,7835,4577 AATAGAACAGAGTGGC-1,1,52,46,7715,4646 GCCATCGAGCTGCGTG-1,1,53,47,7835,4715 ACACTGATCAAGGTGT-1,1,52,48,7715,4784 ACCAACGCTTATTTAT-1,1,53,49,7835,4853 GACATCGATTTATAAC-1,1,52,50,7715,4921 CAGACACCGATCGCTG-1,1,53,51,7835,4990 CCAAGAAAGTGGGCGA-1,1,52,52,7715,5059 GGTAGACCGTTGGGCG-1,1,53,53,7835,5128 TCGTTAGGAGTCCCTA-1,1,52,54,7715,5197 ACGGCCAACATGGACT-1,1,53,55,7835,5266 GTGAGTGGTACAACGC-1,1,52,56,7715,5334 GAGACTTCGCGACCGA-1,1,53,57,7835,5403 GAAGTCAGTTGCACTA-1,1,52,58,7715,5472 GTTTGGTAGGGTCAAC-1,1,53,59,7835,5541 ACGGCACTTGCTTGGG-1,1,52,60,7715,5610 CCTCTGTACTATTCTA-1,1,53,61,7835,5679 CTATTCATGTGTCCCA-1,1,52,62,7715,5747 GCCCGATCTGTGGTCG-1,1,53,63,7835,5816 TTAGAAGAACATGACT-1,1,52,64,7715,5885 AGGATAAAGTCGGGAT-1,1,53,65,7835,5954 CGGCAAACATCGTGCG-1,1,52,66,7715,6023 CTAGTTACAACCCGGT-1,1,53,67,7835,6092 TTCGACAGAGCCCGTG-1,1,52,68,7715,6160 AAGCATACTCTCCTGA-1,1,53,69,7835,6229 GACGACGATCCGCGTT-1,1,52,70,7715,6298 GGTAGAAGACCGCCTG-1,1,53,71,7835,6367 GAGATGGGAGTCGACA-1,1,52,72,7715,6436 AACGATAATGCCGTAG-1,1,53,73,7835,6505 TGGTCCCACGCTACGG-1,1,52,74,7715,6573 CTGCTTGGCGATAGCT-1,1,53,75,7835,6642 ATCGGAGACAGACGGC-1,1,52,76,7715,6711 TAGCGTCCGGTGTGGT-1,1,53,77,7835,6780 GTTGAGTCCCGCCGGT-1,1,52,78,7715,6849 AAATAGGGTGCTATTG-1,1,53,79,7835,6917 AAGTGTTTGGAGACGG-1,1,52,80,7715,6986 AGCACTACCTCACCAG-1,1,53,81,7835,7055 TGCCTTGGCCAGGCAA-1,1,52,82,7715,7124 TCGTCTTAGGCGTTAA-1,1,53,83,7835,7193 TTCTGACCGGGCTCAA-1,1,52,84,7715,7262 CAGAACTTAGCCCTCT-1,1,53,85,7835,7330 AGCTCCTTCGCACATC-1,1,52,86,7715,7399 ACAGGCTTGCCCGACT-1,1,53,87,7835,7468 GCTATACGTCTCGGAC-1,1,52,88,7715,7537 GAGCCAGCTACCTGTG-1,1,53,89,7835,7606 TGCTAAGTGTCTATTT-1,1,52,90,7715,7675 GTCCTACGAATAGTCT-1,1,53,91,7835,7743 CAGTGTCGGCTGGCCC-1,1,52,92,7715,7812 CTATCGACGAAATACA-1,1,53,93,7835,7881 CATCATTACCCTGAGG-1,1,52,94,7715,7950 TAAGTTGCGACGTAGG-1,1,53,95,7835,8019 AGTGCACGCTTAAGAA-1,1,52,96,7715,8088 TGTGCCGGTGCCGGAA-1,1,53,97,7835,8156 AGGAGGCCTTCGCGCG-1,1,52,98,7715,8225 TCCGCGGCCCAATGAA-1,1,53,99,7835,8294 TCCGTTAAGCTAATAT-1,1,52,100,7715,8363 AAATCTAGCCCTGCTA-1,1,53,101,7835,8432 CGCAGGCGATCCAAAC-1,1,52,102,7715,8501 CCATATGGAAACTATA-1,1,53,103,7835,8569 CACCGTATCCCATCCG-1,1,52,104,7715,8638 GGTCAAGACTACTTCG-1,1,53,105,7835,8707 CCCGTTTCGCAGATGT-1,1,52,106,7715,8776 GTTATAATACGGTGAA-1,1,53,107,7835,8845 ACTTGTGGATGGAACG-1,1,52,108,7715,8914 GTTCGCTGAGACGTCT-1,1,53,109,7835,8982 GACACTGGAACCCGAT-1,1,52,110,7715,9051 CCCAGGTCTGAAGGCT-1,1,53,111,7835,9120 TCTCGAGGAGGTTCGC-1,1,52,112,7715,9189 ACTATCTGCCCGCGTA-1,1,53,113,7835,9258 CCTAAATTGTATCCTA-1,1,52,114,7715,9327 AGAAATTATGACTCGC-1,0,53,115,7835,9395 TCCAGCGCTATAAGCG-1,0,52,116,7715,9464 TCGTGTATTGGTCACG-1,0,53,117,7835,9533 CCACATACTGCACCCA-1,0,52,118,7715,9602 GTTGCGGACGGTCAGG-1,0,53,119,7835,9671 GTATTTAATGGCATAA-1,0,52,120,7715,9739 GTCGATAGGTGACTTT-1,0,53,121,7835,9808 AATAATCTTCGTATCG-1,0,52,122,7715,9877 ATTGTTCAACGATCCG-1,0,53,123,7835,9946 GTGCAGCGTAGAGTAG-1,0,52,124,7715,10015 TGTGGTAGGGTGCCTT-1,0,53,125,7835,10084 TGTGGACTATCTACGT-1,0,52,126,7715,10152 GGCGGGCTCTAAGAGT-1,0,53,127,7835,10221 TGTGCCAGAGGCAAAG-1,1,54,0,7955,1480 TGGCTTATGTATAATG-1,1,55,1,8074,1549 GCAAGCTGGAAACCGC-1,1,54,2,7955,1618 GATATCAAGCAGGAGC-1,1,55,3,8074,1686 CACCAATCATCCGTCT-1,1,54,4,7955,1755 CCACATGGCTCTTTAT-1,1,55,5,8074,1824 GTCCTACTCTACGGGC-1,1,54,6,7955,1893 CTCGAGACATACGATA-1,1,55,7,8074,1962 TATCAGTGGCGTAGTC-1,1,54,8,7955,2031 TGACAGGACAAGTCCA-1,1,55,9,8074,2099 TATTAACACCAAAGCA-1,1,54,10,7955,2168 TAGGCGATGAGGTCTC-1,1,55,11,8074,2237 CCGCCGGAACTTCTCG-1,1,54,12,7955,2306 GCCATTAGCCTCAAAC-1,1,55,13,8074,2375 GTTAGGCTACCCGTTT-1,1,54,14,7955,2444 GGGTATTCTAGCAAAC-1,1,55,15,8074,2512 GCCCTAGCCGTCGCGA-1,1,54,16,7955,2581 CAGATCCTGGTTTGAA-1,1,55,17,8074,2650 CTTCAGTGGTCGCCTA-1,1,54,18,7955,2719 GGGCAACCGCACGTGC-1,1,55,19,8074,2788 GACCCAATTATGATAC-1,1,54,20,7955,2857 GAAGCTCGGACCCGTC-1,1,55,21,8074,2925 CGTCGGGTCTAAGCGC-1,1,54,22,7955,2994 GAGGCCCGACTCCGCA-1,1,55,23,8074,3063 TTGCCATAGCCCGCTC-1,1,54,24,7955,3132 TAACATACACGCGATC-1,1,55,25,8074,3201 CCGACGGGCATGAGGT-1,1,54,26,7955,3270 AATGTGCCCGAGGTGT-1,1,55,27,8074,3338 AGCTGTAACCTCAATC-1,1,54,28,7955,3407 CGAGTGAAGGTACCAG-1,1,55,29,8074,3476 AGTCTCACAAGACTAC-1,1,54,30,7955,3545 AAATTGATAGTCCTTT-1,1,55,31,8074,3614 TAAGTCGCCGAGTATC-1,1,54,32,7955,3683 GCGGAGAAACTTCGCA-1,1,55,33,8074,3751 GGCAAAGGCGCCAATA-1,1,54,34,7955,3820 ATTTCCGGGTTCTGCG-1,1,55,35,8074,3889 TAAACCCAGGAGGGCA-1,1,54,36,7955,3958 TTCGGGCGCTAGTCTT-1,1,55,37,8074,4027 GTGGAGTCGGCGGTTG-1,1,54,38,7955,4096 GCACGCCTACTTAGAT-1,1,55,39,8074,4164 CAATATTCTTGACCTA-1,1,54,40,7955,4233 CGTTTGTGTAGAGGGT-1,1,55,41,8074,4302 CATAGCGTTGCCCACC-1,1,54,42,7955,4371 TGATACATTTAGCCGT-1,1,55,43,8074,4440 TTCCGGCCTTGAGGCT-1,1,54,44,7955,4508 CCTATACCGTCCTGTC-1,1,55,45,8074,4577 TCGTTGCTATCCGGTC-1,1,54,46,7954,4646 TGGCGACTGCTCCAAA-1,1,55,47,8074,4715 CAGAGGCGATGCATGA-1,1,54,48,7954,4784 TCACAGGAGAATAAGA-1,1,55,49,8074,4853 GGGTTAACATTTGAGT-1,1,54,50,7954,4921 GCGGGCGAGCCTTACC-1,1,55,51,8074,4990 TGCCAATGGGTACTCT-1,1,54,52,7954,5059 AGGGACTCTACGCGAC-1,1,55,53,8074,5128 GACGCCGTAAAGGCTA-1,1,54,54,7954,5197 AAAGGCTCTCGCGCCG-1,1,55,55,8074,5266 CTGGCTGGTTGTCAGT-1,1,54,56,7954,5334 ACATCCCGGCCATACG-1,1,55,57,8074,5403 CTCTTGTCCCGCTTGG-1,1,54,58,7954,5472 TACGCCTCCATTCCGA-1,1,55,59,8074,5541 CGGAGCAATTTAATCG-1,1,54,60,7954,5610 AACTAGGCTTGGGTGT-1,1,55,61,8074,5679 GCGTCGCCAGGGTGAT-1,1,54,62,7954,5747 GTTGGTCATGCTATCC-1,1,55,63,8074,5816 GCTGGCGGCGCATGCT-1,1,54,64,7954,5885 TGAGCGGAAAGTGTTC-1,1,55,65,8074,5954 CTTTCTGTGCGGGCTT-1,1,54,66,7954,6023 ATCTAATATCCTACGG-1,1,55,67,8074,6092 AACCTTTAAATACGGT-1,1,54,68,7954,6160 TTCACTCGAGCACCTA-1,1,55,69,8074,6229 CTGCACTCCAGTACAG-1,1,54,70,7954,6298 CCATTTCTACCTATTA-1,1,55,71,8074,6367 CAAGCGGCACATAATT-1,1,54,72,7954,6436 GTTAACATCACTTAAA-1,1,55,73,8074,6505 ATATAAATGTAGCTGC-1,1,54,74,7954,6573 GCCTCTATACATAGCA-1,1,55,75,8074,6642 GTGTCGTATAGCGTTC-1,1,54,76,7954,6711 ATACGTACTTAGCCAC-1,1,55,77,8074,6780 GCTATCATACTCATGG-1,1,54,78,7954,6849 TATCCAATTGGTTATC-1,1,55,79,8074,6918 TCTCCCTGGGCAGCGT-1,1,54,80,7954,6986 CCTATAATGAGTGCCC-1,1,55,81,8074,7055 CAATGCGAGAAGTATC-1,1,54,82,7954,7124 TACCAATAAAGTACCA-1,1,55,83,8074,7193 GCTAGGCACCACGGAG-1,1,54,84,7954,7262 GGTGGACTGCTCTGGC-1,1,55,85,8074,7330 TATTCCGAGCTGTTAT-1,1,54,86,7954,7399 TTGAGAAGTTTAGCAT-1,1,55,87,8074,7468 GTCCGGACCTGAAATT-1,1,54,88,7954,7537 CTGTGGTCGGGAGATA-1,1,55,89,8074,7606 CATGTAAGAGACATTT-1,1,54,90,7954,7675 CACGTTTCGTACACAC-1,1,55,91,8074,7743 CATCCTCTCAAAGATC-1,1,54,92,7954,7812 GATTAACCGAAAGCCC-1,1,55,93,8074,7881 AACGCTGTTGCTGAAA-1,1,54,94,7954,7950 TTCAGCTGGCGTGCCC-1,1,55,95,8074,8019 TAGAGGTTCTACTTGT-1,1,54,96,7954,8088 GTATCAAACGTTAGCT-1,1,55,97,8074,8156 AATCATGTAAAGACTC-1,1,54,98,7954,8225 AGTCACTAGCTCTCGA-1,1,55,99,8074,8294 GCGAAACGATCGGGAG-1,1,54,100,7954,8363 CATGGATTGTCTTCCG-1,1,55,101,8074,8432 ATTGGATTACAGCGTA-1,1,54,102,7954,8501 CACACACGCTAACGAG-1,1,55,103,8074,8569 CTATGGGAAGCGGAAT-1,1,54,104,7954,8638 TGCCTAATTGAAGATT-1,1,55,105,8074,8707 TGGCAATGGGACGGCG-1,1,54,106,7954,8776 ACCTCCGCCCTCGCTG-1,1,55,107,8074,8845 CGGCAATAAGATCGCC-1,1,54,108,7954,8914 CCTTGACCACTTTATT-1,1,55,109,8074,8982 TCATTTAGAAGTGTGA-1,1,54,110,7954,9051 CAGAATAACACACGGA-1,1,55,111,8074,9120 TCTGAGCAATTGACTG-1,1,54,112,7954,9189 CAACGTGGTGGAGTCT-1,1,55,113,8074,9258 CACAGTTCGCTTCCCA-1,1,54,114,7954,9327 TCTCTCGCCGCACATA-1,0,55,115,8074,9395 TGGGCAGGCCACCGCA-1,0,54,116,7954,9464 CTCCTGTTCAAGGCAG-1,0,55,117,8074,9533 TATTTGATTTGCACAG-1,0,54,118,7954,9602 GCCACTCCTTACGGTA-1,0,55,119,8074,9671 ACCGATATTTAATCAT-1,0,54,120,7954,9739 TTATTATCTGGAAGGC-1,0,55,121,8074,9808 TACATGCCGGAATTGT-1,0,54,122,7954,9877 GGCACTCAGCCGACCC-1,0,55,123,8074,9946 AAACCGGAAATGTTAA-1,0,54,124,7954,10015 AGACAGGCATCTCAGC-1,0,55,125,8074,10084 GTGGTGATGGTTTGTG-1,0,54,126,7954,10152 CCGATATGACGTAAGG-1,0,55,127,8074,10221 CATACACAAAGTCAGC-1,1,56,0,8194,1480 TGCCGTTCTTAATCGG-1,1,57,1,8314,1549 TCGAGTCTACGATTCG-1,1,56,2,8194,1618 ACTTCCAGTGGAAGCT-1,1,57,3,8314,1687 CAATTGGGCCGCACTC-1,1,56,4,8194,1755 AAATCGCGGAAGGAGT-1,1,57,5,8314,1824 ATATCAATTCCAGCCT-1,1,56,6,8194,1893 CTTTGTCGAATGCTCC-1,1,57,7,8314,1962 TGAGGCATGTACTGTG-1,1,56,8,8194,2031 TTCGCCGCTCGCGCTA-1,1,57,9,8314,2099 GACTCCTTCCAATTGA-1,1,56,10,8194,2168 ACCGAAGAGTCTGGTT-1,1,57,11,8314,2237 TGGCATGAAGTTTGGG-1,1,56,12,8194,2306 ACGAGGTTTACAACGT-1,1,57,13,8314,2375 AACCCATCCCATGATC-1,1,56,14,8194,2444 TCGACAACTGAACCCG-1,1,57,15,8314,2512 TATCTTGCAATACAAC-1,1,56,16,8194,2581 TATTATGTTTGCCTGC-1,1,57,17,8314,2650 GTCAAAGAAGTGGTGT-1,1,56,18,8194,2719 GGGACAGAGTTACTCC-1,1,57,19,8314,2788 AGCAACCGAAAGTAAT-1,1,56,20,8194,2857 CTCTCTAACTGCCTAG-1,1,57,21,8314,2925 ATACGGAACGTCGTTT-1,1,56,22,8194,2994 TCGGTCCCGACAATAG-1,1,57,23,8314,3063 CGCGCAAATGTCCAGA-1,1,56,24,8194,3132 TCTAATACTGCCTCAG-1,1,57,25,8314,3201 CTCGGTTGTCGGCCCT-1,1,56,26,8194,3270 GGTAACCGGGAGGATA-1,1,57,27,8314,3338 CAGGCGCACGGTGGTC-1,1,56,28,8194,3407 TCATCGATGGTCCCAA-1,1,57,29,8314,3476 CAAAGATTATTGGGCC-1,1,56,30,8194,3545 ACAATGAATACGGAGA-1,1,57,31,8314,3614 GCTCCTGACATACTGG-1,1,56,32,8194,3683 GATGACAAGTAGGGCA-1,1,57,33,8314,3751 TACGCCGAGGGTACCC-1,1,56,34,8194,3820 AAGCGTCCCTCATCGA-1,1,57,35,8314,3889 CACTCCTATGTAAGAT-1,1,56,36,8194,3958 TCGAGCCAGGCAGGCC-1,0,57,37,8314,4027 TCGTCAAGTACGCGCA-1,1,56,38,8194,4096 CCCGTAGCTGGGAAGA-1,1,57,39,8314,4164 ACCCTATGCCATATCG-1,1,56,40,8194,4233 GTGGTATAGTCTGCCG-1,1,57,41,8314,4302 CCGGTTTGTAATTGTG-1,1,56,42,8194,4371 GTCGCCGTTGTGTGTT-1,1,57,43,8314,4440 TACTGAACAGATTTAG-1,1,56,44,8194,4508 TATTAACCTGACCGCG-1,1,57,45,8314,4577 CTGTAGCCATCTCACT-1,1,56,46,8194,4646 TACTATGGTTCCTCAG-1,1,57,47,8314,4715 GAGTCAGACCAGAATC-1,1,56,48,8194,4784 TAAGGCATAACATCAA-1,1,57,49,8314,4853 CTTCCGCTCCGTGAAG-1,1,56,50,8194,4921 GGGCTATGATCGATGG-1,1,57,51,8314,4990 GGTCGGTCGTCCACAG-1,1,56,52,8194,5059 GGGACCCGTATATCTT-1,1,57,53,8314,5128 GAAAGCAGTGCACTTT-1,1,56,54,8194,5197 AGCGCATAATGAATCG-1,1,57,55,8314,5266 GCTGCTAAGTAGTCGA-1,1,56,56,8194,5334 AATAGTCCGTCCCGAC-1,1,57,57,8314,5403 AGCAGCCAGATGAATA-1,1,56,58,8194,5472 CCTCGCGCTGTGCGAT-1,1,57,59,8314,5541 TTGTGTATGCCACCAA-1,1,56,60,8194,5610 TGCTCGGCGAAACCCA-1,1,57,61,8314,5679 CGATTAAATATCTCCT-1,1,56,62,8194,5747 TGCCGTGGATCGTCCT-1,1,57,63,8314,5816 GTGGACGCATTTGTCC-1,1,56,64,8194,5885 ACCCGGAAACTCCCAG-1,1,57,65,8314,5954 CCGCATGTGGTACGAT-1,1,56,66,8194,6023 GCAAACCTTGGCCATA-1,1,57,67,8314,6092 ATTCACTGATGTTGGA-1,1,56,68,8194,6160 ACTCCCTAATGCTAAA-1,1,57,69,8314,6229 TCCTAAATTGGGAAGC-1,1,56,70,8194,6298 GAACAGATTACTAAAT-1,1,57,71,8314,6367 ATACAGGCCCTCCAAT-1,1,56,72,8194,6436 CGATTCGCCTGGCTGC-1,1,57,73,8314,6505 TCCGCCTGTCTACAAG-1,1,56,74,8194,6573 CACATCTCACCGACGA-1,1,57,75,8314,6642 CGTCGTCCTTCGCGAA-1,1,56,76,8194,6711 CGTTGAATACCGCGCT-1,1,57,77,8314,6780 ACCAATATGCAAGTTA-1,1,56,78,8194,6849 ACGGATGGTGCGGATA-1,1,57,79,8314,6918 CACCCTAACAAGATCT-1,1,56,80,8194,6986 AAGCTCTTTCATGGTG-1,1,57,81,8314,7055 CATGGGTATGCCTTAT-1,1,56,82,8194,7124 GCGCGTCATTGGTACA-1,1,57,83,8314,7193 TCTGAAGCACGTGGTC-1,1,56,84,8194,7262 AAGTTCACTCCAAGCT-1,1,57,85,8314,7330 TTGGACCTATAACAGT-1,1,56,86,8194,7399 ATCAGCCTCATGCTGC-1,1,57,87,8314,7468 AGTACTCTTATGCCCA-1,1,56,88,8194,7537 GCGCTTAAATAATTGG-1,1,57,89,8314,7606 TTGTGAACCTAATCCG-1,1,56,90,8194,7675 AGTCGTCGACCACCAA-1,1,57,91,8314,7743 TCCTTTAAATCCGCTT-1,1,56,92,8194,7812 ACTGAAACGCCGTTAG-1,1,57,93,8314,7881 GCACACACTGGTAGCC-1,1,56,94,8194,7950 TAAGGGCCTGTCCGAT-1,1,57,95,8314,8019 GCTAGAGTAGAGATGT-1,1,56,96,8194,8088 CACAGGGCCATATAGT-1,1,57,97,8314,8156 CCATGCCCTAGATTTC-1,1,56,98,8194,8225 TCGCGTAGCAGTGTCC-1,1,57,99,8314,8294 GACGAGGCTAATAAAC-1,1,56,100,8194,8363 CTACACTCGCAGATGG-1,1,57,101,8314,8432 ACGCATACGTTTACTA-1,1,56,102,8194,8501 GGAGCAACATTTCAAG-1,1,57,103,8314,8569 CGAGAGGGTAGCCGCG-1,1,56,104,8194,8638 TCGTGTTCGACCACAA-1,1,57,105,8314,8707 TCTACCCAATAGAGAG-1,1,56,106,8194,8776 ATAAACGTTGCACCAC-1,1,57,107,8314,8845 TCAACTGCAGAGTCAG-1,1,56,108,8194,8914 AGCTCCATATATGTTC-1,1,57,109,8314,8982 GTAACATCTAAGATAA-1,1,56,110,8194,9051 CCGACAATAGGCCGCC-1,1,57,111,8314,9120 ATGCTTAGGAGTTGAT-1,1,56,112,8194,9189 AACCCGAGCAGAATCG-1,1,57,113,8314,9258 CGGGTTTGTTAGGGCT-1,1,56,114,8194,9327 AGGCACGTGACTGTCC-1,0,57,115,8314,9395 GACAAGAGATGAGATT-1,0,56,116,8194,9464 AGCCCTTGGACATCCC-1,0,57,117,8314,9533 GCAGTTCGATCCGAGC-1,0,56,118,8194,9602 TCGAGGGCAACAGACG-1,0,57,119,8314,9671 ACTTTGTCGACGCACT-1,0,56,120,8194,9740 GAGTATCAAAGTTACA-1,0,57,121,8314,9808 CCAGGCTGGCGTCTGA-1,0,56,122,8194,9877 GGACTCTTCCGGTTGA-1,0,57,123,8314,9946 TCCCAGCACACGACAT-1,0,56,124,8194,10015 GCTCCATGAGTGCAGA-1,0,57,125,8314,10084 GCAGTGCGGGCGGATG-1,0,56,126,8194,10152 GCGTTCTGACTAAGCG-1,0,57,127,8314,10221 ATTTGGAGATTGCGGT-1,1,58,0,8434,1480 AAGGGTTTGATTTCAG-1,1,59,1,8553,1549 CCGGCCGCGAGCATAT-1,1,58,2,8434,1618 GAGTTCTGTGGGTGCT-1,1,59,3,8553,1687 AAACGAAGATGGAGTA-1,1,58,4,8434,1755 AATTACGAGACCCATC-1,1,59,5,8553,1824 CCTTTGAATTATGGCT-1,1,58,6,8434,1893 CATGGTATTAGTTTGT-1,1,59,7,8553,1962 AACGAAAGTCGTCCCA-1,1,58,8,8434,2031 ACATAAGTCGTGGTGA-1,1,59,9,8553,2099 GCACAACCTCGGGCGT-1,1,58,10,8434,2168 ATGCACGCGCTGTTCA-1,1,59,11,8553,2237 CGATGTTGTTATCTAC-1,1,58,12,8434,2306 GTCTCCTGCCAGTATG-1,1,59,13,8553,2375 GATGCCTTCTGCGGCA-1,1,58,14,8434,2444 ACCGGTCAGGTACACC-1,1,59,15,8553,2512 GTGGAGCGTTTACCGA-1,1,58,16,8434,2581 AGGCGGTTTGTCCCGC-1,1,59,17,8553,2650 TCCCTGGCGTATTAAC-1,1,58,18,8434,2719 AAACACCAATAACTGC-1,1,59,19,8553,2788 TGGACGCAATCCAGCC-1,1,58,20,8434,2857 GGAACCTTGACTCTGC-1,1,59,21,8553,2925 GTATCTCAGTCTTGAC-1,1,58,22,8434,2994 GCTGAATCTTCCAATC-1,1,59,23,8553,3063 AGATGCAAGACGTGCA-1,1,58,24,8434,3132 TTAAGGCCCGTACTTT-1,1,59,25,8553,3201 AGTATGCTGGAGACCA-1,1,58,26,8434,3270 GCGGCAAAGTATTGCC-1,1,59,27,8553,3338 GCGCAAATATATTCAA-1,1,58,28,8434,3407 GAAGAAACGATATTGT-1,1,59,29,8553,3476 GGACCTCTAGGCCGCC-1,1,58,30,8434,3545 AACAGCTGTGTGGCAA-1,0,59,31,8553,3614 TCGAATATCCCGCAGG-1,1,58,32,8434,3683 GCGACCCAACCATCTG-1,0,59,33,8553,3751 AGAGAAGGAGTACAAT-1,1,58,34,8434,3820 GGCTCCTCCACCTGTT-1,0,59,35,8553,3889 TCAGTGTATACGTCAT-1,1,58,36,8434,3958 ATTATTATGTCCGTCA-1,1,59,37,8553,4027 TTAGGTCATAACCGAC-1,0,58,38,8434,4096 AAGATGGCACCGGACC-1,1,59,39,8553,4164 CTACAAGAAATAACCC-1,0,58,40,8434,4233 ACTATTTCCGGGCCCA-1,1,59,41,8553,4302 TTGTTTCACATCCAGG-1,1,58,42,8434,4371 CGCTGTGTGGATGTTG-1,1,59,43,8553,4440 TCAACATAGCGCCCTA-1,1,58,44,8434,4509 GGCCGTTTGGGTTTCA-1,1,59,45,8553,4577 TACTCTTTCGTCTTCA-1,1,58,46,8434,4646 TTCGCGCGCCATACGA-1,1,59,47,8553,4715 CGGAAAGAATCAAACG-1,1,58,48,8434,4784 AGGCAGGGAGCGTACT-1,1,59,49,8553,4853 CCTTTAAGGGAGCACT-1,1,58,50,8434,4921 CGCCCAGCACGCCTAG-1,1,59,51,8553,4990 AGTATTTGGCACGACC-1,1,58,52,8434,5059 TATCCGCACCGTCGGG-1,1,59,53,8553,5128 ACCCGTGTCATCAGTA-1,1,58,54,8434,5197 CAACTGCTCATCCGAT-1,1,59,55,8553,5266 CCGGAGCGTACTTTCT-1,1,58,56,8434,5334 TACCGTAGGTTAACTA-1,1,59,57,8553,5403 TGAGGAGTGCCAGCTT-1,1,58,58,8434,5472 CCAGTCTTGTCATAGA-1,1,59,59,8553,5541 GGGCAGAGCAATCGTT-1,1,58,60,8434,5610 TACCAAATAGCCCAGA-1,1,59,61,8553,5679 TACCTACTCCCAGTAT-1,1,58,62,8434,5747 TGTGAGACTAGCCCAA-1,1,59,63,8553,5816 ATACCTAACCAAGAAA-1,1,58,64,8434,5885 GTCGGGAAGCAGAAAC-1,1,59,65,8553,5954 AATTAACGGATTTCCA-1,1,58,66,8433,6023 GAACCCTCTGTGTTCT-1,1,59,67,8553,6092 ATATAAAGCGCTCGTG-1,1,58,68,8433,6160 CCTGGTCGAATGTGGG-1,1,59,69,8553,6229 CTAGGTTCGGACGTGA-1,1,58,70,8433,6298 TCGGGAGACAGCGTAC-1,1,59,71,8553,6367 CATAAGAAGCTTGGCT-1,1,58,72,8433,6436 AAGCACCCTGCGTATC-1,1,59,73,8553,6505 AGTTTGCACCTGCCTC-1,1,58,74,8433,6573 GACTGCAAATCGAGCT-1,1,59,75,8553,6642 GTGTATATCAGCGGGC-1,1,58,76,8433,6711 CTTCAACTCCACTTGG-1,1,59,77,8553,6780 ACTTACGCATCCACGC-1,1,58,78,8433,6849 CATGAGATGCACTCTC-1,1,59,79,8553,6918 GAGCACCTGTGTCCAG-1,1,58,80,8433,6986 CGCGACCGCGACAGAT-1,1,59,81,8553,7055 GTCCCGCGACGTTATG-1,1,58,82,8433,7124 GCAGTGTGGCTATAGG-1,1,59,83,8553,7193 ATACTGCCTTACACCG-1,1,58,84,8433,7262 TACAGAAACGGTGGGC-1,1,59,85,8553,7330 GGCGCGGAGATCTTTC-1,1,58,86,8433,7399 CGTTAATGTCCCGACG-1,1,59,87,8553,7468 GCTAACTGAAGTCTGA-1,1,58,88,8433,7537 AGTGATAACCTGCGCG-1,1,59,89,8553,7606 TATGATCTTCTCTTTA-1,1,58,90,8433,7675 TGTACCTACACGAGGG-1,1,59,91,8553,7743 ATATCGTTCCTCGAAC-1,1,58,92,8433,7812 CGGCGCCATCAATCCC-1,1,59,93,8553,7881 CCTGTTTGAAGACACG-1,1,58,94,8433,7950 GCCACTCAGAGCGCGA-1,1,59,95,8553,8019 TCGGCTTGTATCGACG-1,1,58,96,8433,8088 TAGATGGTTCCTTACT-1,1,59,97,8553,8156 ATCGTTAGCTAGCGGA-1,1,58,98,8433,8225 ACAGCGACATTCTCAT-1,1,59,99,8553,8294 ATTCAACCATTTAAGG-1,1,58,100,8433,8363 CACTCTTCTGCTAGCC-1,1,59,101,8553,8432 CTAACTGATAATCGCC-1,1,58,102,8433,8501 TGATGTCAATTAAGTG-1,1,59,103,8553,8569 CGCCGTTCAGCATAGT-1,1,58,104,8433,8638 ATACTACCCGTACCAC-1,1,59,105,8553,8707 CCACTGTTTGGATTAA-1,1,58,106,8433,8776 CACTACGGGAGCTGCC-1,1,59,107,8553,8845 GACCAAACGTTGACTG-1,1,58,108,8433,8914 AAGAGGCCCTTTGGAA-1,1,59,109,8553,8982 ACACGTAGGCCACAAG-1,1,58,110,8433,9051 TACTCTTACTTTACTG-1,1,59,111,8553,9120 AGAGCCGCCGAGATTT-1,1,58,112,8433,9189 GGCCTGCTTCTCCCGA-1,1,59,113,8553,9258 TCAAGCGCGGACGGTA-1,1,58,114,8433,9327 ACACTGGGACAGTCGT-1,0,59,115,8553,9395 TGTGTAGTAGCACGTG-1,0,58,116,8433,9464 CTAGCCACAGGCGAGC-1,0,59,117,8553,9533 CTATCGCGTAGAGAAC-1,0,58,118,8433,9602 GTTCCCGTAAACATAT-1,0,59,119,8553,9671 TCTTTCCTTCGAGATA-1,0,58,120,8433,9740 ATATTGGAGAGGCCTT-1,0,59,121,8553,9808 AGGCGATAACTGGCGT-1,0,58,122,8433,9877 ACCCGGAGCACCACAA-1,0,59,123,8553,9946 TGAGCTCAACTGTATA-1,0,58,124,8433,10015 ACGACCCATGAGTTGC-1,0,59,125,8553,10084 CGGTCAGTCCATATTT-1,0,58,126,8433,10152 TCCGGCTGTCGGGTCG-1,0,59,127,8553,10221 ATTCCCGAAGGTACAG-1,1,60,0,8673,1480 CTAACAGCACAATAAC-1,1,61,1,8793,1549 TTGTGCGGAAGCGGAT-1,1,60,2,8673,1618 GGGCACTATTGACCAT-1,1,61,3,8793,1687 CCATAGAGGCTGCCAG-1,1,60,4,8673,1755 CCGAAGCATTGACCAA-1,1,61,5,8793,1824 TACTGAGGGAAGAAAG-1,1,60,6,8673,1893 TATGTAGAAACCCGGC-1,1,61,7,8793,1962 TGGTTAACTTACATTT-1,1,60,8,8673,2031 AGAACCCTCAATTGGG-1,1,61,9,8793,2099 CCTATATCGTGTCACG-1,1,60,10,8673,2168 ACGGCTGGATGTAGAA-1,1,61,11,8793,2237 CTCGCATTGCATAGCC-1,1,60,12,8673,2306 ACTTTGGTCGTGCTCC-1,1,61,13,8793,2375 GCTGGTTTAGGCCATA-1,1,60,14,8673,2444 TGTCGTTATCACATAT-1,1,61,15,8793,2512 ACACATGATCAAATCT-1,1,60,16,8673,2581 TATCCATCTCGGTTAG-1,1,61,17,8793,2650 CTCGTCGAGGGCTCAT-1,1,60,18,8673,2719 ATCAATGCCGTGGCTG-1,1,61,19,8793,2788 GAAACATAGGAAACAG-1,1,60,20,8673,2857 TAATAGGTCACCAGAA-1,1,61,21,8793,2925 CACCAGTCAGCATGCA-1,1,60,22,8673,2994 GAGCGCTGTTAGGTAA-1,1,61,23,8793,3063 CCCTATGTAGAGCAGA-1,1,60,24,8673,3132 GATCGCTATATCTCAG-1,1,61,25,8793,3201 AAGGGACTATGCATTC-1,1,60,26,8673,3270 CTCGGGTTCTCTGGCC-1,0,61,27,8793,3338 TATATATCGAGAAATG-1,1,60,28,8673,3407 ACCCGAGCGAAATTAC-1,0,61,29,8793,3476 TTGTTTCATTAGTCTA-1,0,60,30,8673,3545 ATGGGACCTGCTGAAC-1,0,61,31,8793,3614 TGCGACGGCCGAACGT-1,0,60,32,8673,3683 AGCTAACAAGCAATGT-1,0,61,33,8793,3751 CGTGTCTCGTTACGAC-1,0,60,34,8673,3820 CTAAATCCGGTGTACA-1,0,61,35,8793,3889 GAATAGTGCTCGATTA-1,0,60,36,8673,3958 AACAATACATTGTCGA-1,0,61,37,8793,4027 CACATCGTGCACGCGC-1,0,60,38,8673,4096 ACCGTGACCACGTGGG-1,0,61,39,8793,4164 CCCAATGAGATTTGCA-1,0,60,40,8673,4233 TCAGCAGTAGGCCCTG-1,0,61,41,8793,4302 CTACTCAAGGTATAGT-1,1,60,42,8673,4371 TAGTAGCTTATACCAG-1,1,61,43,8793,4440 ACGTTCGTTCAGGAAA-1,1,60,44,8673,4509 TTAGAATAAGGGTCGG-1,1,61,45,8793,4577 TTCTAGAAAGTCTTAT-1,1,60,46,8673,4646 CCTTCAGTTAAAGTGA-1,1,61,47,8793,4715 TAGCTAGTGATGATGG-1,1,60,48,8673,4784 AGCCCGGTAGCCTGTA-1,1,61,49,8793,4853 TACCTCAGTTGTCTGT-1,1,60,50,8673,4921 GACGGGTTGGCCCGTA-1,1,61,51,8793,4990 GAAACCTATACAAATG-1,1,60,52,8673,5059 TCCACCTCTAGCCTTT-1,1,61,53,8793,5128 AAGACCCAACTGAACA-1,1,60,54,8673,5197 CATACACGGTTCCCAC-1,1,61,55,8793,5266 ACTACGCGTTAGAATT-1,1,60,56,8673,5334 CTTGGCCAAGCTGGGA-1,1,61,57,8793,5403 TTACCCTAGGGATTGG-1,1,60,58,8673,5472 TTCGCACTGTACGACA-1,1,61,59,8793,5541 TAGGTGTTCCACAGAT-1,1,60,60,8673,5610 GAAGCCTGCACATTCC-1,1,61,61,8793,5679 GGCTTTCAATAAGGGT-1,1,60,62,8673,5747 TCCAGGGTATATACGA-1,1,61,63,8793,5816 CTCGCCGAATGTAGGG-1,1,60,64,8673,5885 AGGAAGCTGTCCGCCG-1,1,61,65,8793,5954 GTCTCAAGGCCCGGCT-1,1,60,66,8673,6023 ACCGACACATCTCCCA-1,1,61,67,8793,6092 TATACGCGTCATCACT-1,1,60,68,8673,6160 ATCTGGGCTGTTCTTG-1,1,61,69,8793,6229 TCAAATTTGAGACTCA-1,1,60,70,8673,6298 GTTAAGGGTGCGATGT-1,1,61,71,8793,6367 AGCAAAGGCCGCTAGT-1,1,60,72,8673,6436 TTATAGGTAATTGTCT-1,1,61,73,8793,6505 TTGTGCAGCCACGTCA-1,1,60,74,8673,6573 ACGGACTCTCAAAGCG-1,1,61,75,8793,6642 ATGCTCTGGCGCGGTA-1,1,60,76,8673,6711 ATAATCTTGGAGAACC-1,1,61,77,8793,6780 CTCATTGCTCTAACAA-1,1,60,78,8673,6849 TAGGTGACGATAACCT-1,1,61,79,8793,6918 CGGATCCTCAAGGACT-1,1,60,80,8673,6986 GGGCGTGGTTTCCCAG-1,1,61,81,8793,7055 TGGCTATGTGACATAC-1,1,60,82,8673,7124 CTTAGTGTAGTAGCAT-1,1,61,83,8793,7193 GGATTGCTGTGACTCC-1,1,60,84,8673,7262 ACTTCCATGCGGGACA-1,1,61,85,8793,7331 ACTCAAGTGCAAGGCT-1,1,60,86,8673,7399 ACAAGGATGCTTTAGG-1,1,61,87,8793,7468 TTGAACGACGTGCTGA-1,1,60,88,8673,7537 ATTCATCGTTGAGGCA-1,1,61,89,8793,7606 TGCAACCCATCTGCGG-1,1,60,90,8673,7675 AGTGCTAAACACAGCA-1,1,61,91,8793,7743 AACTCCAGAGCGTGTT-1,1,60,92,8673,7812 TCTCCACAAGTTGAAT-1,1,61,93,8793,7881 CTTTGCATCGCTCTTG-1,1,60,94,8673,7950 TCACAAACCGAGGTAC-1,1,61,95,8793,8019 CCGTAGGAAATCCCTG-1,1,60,96,8673,8088 AAACATTTCCCGGATT-1,1,61,97,8793,8156 GCCTCCGACAATTCAC-1,1,60,98,8673,8225 TCTGCATACCTTGCTT-1,1,61,99,8793,8294 ACCCATTTGTCCCTCT-1,1,60,100,8673,8363 CTGCAGAGAATCAGAG-1,1,61,101,8793,8432 GGAAACTAAATGGGCC-1,1,60,102,8673,8501 CAACCTACCGAGCAGT-1,1,61,103,8793,8569 CCGTAGGGTTGTTTAC-1,1,60,104,8673,8638 GGTTTGTGACCTGAGG-1,1,61,105,8793,8707 TAACCTAGGGAGTCCA-1,1,60,106,8673,8776 TTCCATCGACAGCGTG-1,1,61,107,8793,8845 ATCTCCCACGGAATAT-1,1,60,108,8673,8914 GTTTCAAACGAGTTGT-1,1,61,109,8793,8982 GGAACTTTGGCGATTA-1,1,60,110,8673,9051 CTGCAAGCACGTTCCG-1,1,61,111,8793,9120 CACAGTCCCGCTTCGC-1,1,60,112,8673,9189 TACGCTCGGTATTGGA-1,1,61,113,8793,9258 CTGGTAAAGTGTGGGC-1,0,60,114,8673,9327 CAACCAGTGGCCTACC-1,0,61,115,8793,9395 TCTTCGCGGTGAGAGG-1,0,60,116,8673,9464 TTCGGGTTGCCACGGG-1,0,61,117,8793,9533 ACCGATAGGCATAACC-1,0,60,118,8673,9602 CTTATAGATGGCTGTT-1,0,61,119,8793,9671 AGACGCCCACTTCGCC-1,0,60,120,8673,9740 AGGTCGCCTCCCAACA-1,0,61,121,8793,9808 CCTCACGTCAGCTAAT-1,0,60,122,8673,9877 CCACCTGTATGGAATA-1,0,61,123,8793,9946 GGACTCGAAGCTTTCA-1,0,60,124,8673,10015 AAGCCGGAGAGCAGGA-1,0,61,125,8793,10084 GCCTATCAGGTAAGAT-1,0,60,126,8673,10152 TCAGAGTGTGAGCATG-1,0,61,127,8793,10221 AAACATGGTGAGAGGA-1,1,62,0,8913,1480 ATCATTGTACCGCATT-1,1,63,1,9032,1549 TCAGCTTGAGCTTTCG-1,1,62,2,8913,1618 CCGCGCAAGATACCCA-1,1,63,3,9032,1687 CTATACTTAAAGCGAG-1,1,62,4,8913,1755 ACCGTCCACTGGGCCC-1,1,63,5,9032,1824 AAGACCAAATAACTCA-1,1,62,6,8913,1893 TGTTTCTGAAGCGTGC-1,1,63,7,9032,1962 TTCTCTTACAGGTGAT-1,1,62,8,8913,2031 AATTCATTGTCATGCA-1,1,63,9,9032,2100 GCCCGAGAGTCTAAAT-1,1,62,10,8913,2168 ATATAGAGTATTGGTC-1,1,63,11,9032,2237 TTGAAGGATGGGCGCC-1,1,62,12,8913,2306 TAGTACCACAACTTTC-1,1,63,13,9032,2375 ATCCCATCCACAGCGC-1,1,62,14,8913,2444 CTTAGGTATAGACCAG-1,1,63,15,9032,2512 TGACTCCGAATCATAC-1,1,62,16,8913,2581 ACTACATCCCGACAAG-1,1,63,17,9032,2650 TTGCCGCAGACCTACA-1,1,62,18,8913,2719 TAAGAGGGACAGGGAC-1,1,63,19,9032,2788 CGAATGAAGTCATTGC-1,1,62,20,8913,2857 AAGGGAACGACTGGCT-1,1,63,21,9032,2925 CGAATCTGCTCGACGC-1,1,62,22,8913,2994 ATCGTGGAAAGTCTGG-1,0,63,23,9032,3063 CCTATGGCTCCTAGTG-1,1,62,24,8913,3132 CGTCGCTTGGTTATAC-1,0,63,25,9032,3201 TGCTTAGAGAGAATGC-1,0,62,26,8913,3270 GATTGCTCCAGTTGCA-1,0,63,27,9032,3338 CGTGCTTCTACCTAAA-1,0,62,28,8913,3407 ACTCCAATATCATCAT-1,0,63,29,9032,3476 GCCGACCCACGACTGC-1,0,62,30,8913,3545 GAGGGTAGTAACAAAG-1,0,63,31,9032,3614 GGCCGAGACTCTGGTG-1,0,62,32,8913,3683 TATATAGGGCTTTACG-1,0,63,33,9032,3751 TGCCGGATGTACGAGC-1,0,62,34,8913,3820 AGGTAGATCGAGATAT-1,0,63,35,9032,3889 GATCAACATAAAGGGA-1,0,62,36,8913,3958 TAACAGCGTTTGTGCT-1,0,63,37,9032,4027 CTATAGGCGTTGATGT-1,0,62,38,8913,4096 GGTTTAATTACCATCG-1,0,63,39,9032,4164 CTCTTCTGGAAGTTAG-1,0,62,40,8913,4233 ATCTGACATGGAAGGA-1,0,63,41,9032,4302 TACGTACTAGTGCTGA-1,0,62,42,8913,4371 ATGACTATCAGCTGTG-1,0,63,43,9032,4440 CTTTGGGATTGTTGCA-1,0,62,44,8913,4509 AGACTGTTACCGGGTC-1,0,63,45,9032,4577 TCCTAACCGTCGGGCA-1,1,62,46,8913,4646 ACGCAAACTAATAGAT-1,1,63,47,9032,4715 AAGTGAGTCGGGTTTA-1,1,62,48,8913,4784 TAAAGCGGTATTTCCA-1,1,63,49,9032,4853 CTCCTCCAGCTCACAC-1,1,62,50,8913,4921 CGGTCCGTCGCAAGCC-1,1,63,51,9032,4990 CCTATATTTGTCCTGG-1,1,62,52,8913,5059 TCCAATAAAGGCTACC-1,1,63,53,9032,5128 AAAGGCTACGGACCAT-1,1,62,54,8913,5197 CGTGACCAGTCCTCTG-1,1,63,55,9032,5266 GATCTGCTATCTAAGG-1,1,62,56,8913,5334 CGAATGACGCATAATG-1,1,63,57,9032,5403 GCTCAATGTAATACCG-1,1,62,58,8913,5472 CTATGCCCGAATGCAA-1,1,63,59,9032,5541 CACAGGGCCGTTGTCA-1,1,62,60,8913,5610 TCAATACGCCGTCATG-1,1,63,61,9032,5679 AGCGGACACTTCGTAG-1,1,62,62,8913,5747 ATACGTTATGCACGGA-1,1,63,63,9032,5816 GAGTAGATACTAGTTG-1,1,62,64,8913,5885 CCAGCTCGAACGCATT-1,1,63,65,9032,5954 TGCTTCCCAAGCAGTA-1,1,62,66,8913,6023 GTAGACACGCCTGACT-1,1,63,67,9032,6092 CTCACATTTACTAAAT-1,1,62,68,8913,6160 GAATGCGAATCGGTTC-1,1,63,69,9032,6229 TAAGGCCCGTCACCCT-1,1,62,70,8913,6298 GAGTATGCGCGTGCAT-1,1,63,71,9032,6367 ATCCACATCGACAGAA-1,1,62,72,8913,6436 TAGACGAAACGCCAAT-1,1,63,73,9032,6505 CAGCAGTCTGTGCTGC-1,1,62,74,8913,6573 CTCACTGTGATACTTA-1,1,63,75,9032,6642 TTAATTGCTTTGGGTG-1,1,62,76,8913,6711 GTAGTCTACGATATTG-1,1,63,77,9032,6780 TTGCCGCTTTCTAGTA-1,1,62,78,8913,6849 GAACCTTTAACGATCC-1,1,63,79,9032,6918 TGGACCAATCTAAGAT-1,1,62,80,8913,6986 CTAGTAGAAAGGGATT-1,1,63,81,9032,7055 AACCTCGCTTTAGCCC-1,1,62,82,8913,7124 GAGTGTCAACCAGAAA-1,1,63,83,9032,7193 GTGATCCTTGTCATGA-1,1,62,84,8913,7262 CTCAACTAACCCGGAT-1,1,63,85,9032,7331 AGTGGCGTCTGAAGGT-1,1,62,86,8912,7399 GGGAAGGGCTTTCTCA-1,1,63,87,9032,7468 AGGCCTGAGAATCTCG-1,1,62,88,8912,7537 AGCCACAGGTTACCCG-1,1,63,89,9032,7606 TGCAATCTAACACGGT-1,1,62,90,8912,7675 GTTTGGGTTTCGCCCG-1,1,63,91,9032,7743 CCTATGTCCACTCCAC-1,1,62,92,8912,7812 CTGCCTTTCTAGTAAA-1,1,63,93,9032,7881 TTAGTAAACCTGCTCT-1,1,62,94,8912,7950 TTGTGGTGGTACTAAG-1,1,63,95,9032,8019 CCTCCTGTTGTGTCGT-1,1,62,96,8912,8088 ACAAAGCATGACCTAG-1,1,63,97,9032,8156 ATAGCAACTAGGGAAG-1,1,62,98,8912,8225 CCGCTCTTCCGAACTA-1,1,63,99,9032,8294 TAGAATAGCCGATGAA-1,1,62,100,8912,8363 GGTCTCCGTCCAGGTT-1,1,63,101,9032,8432 TAATTACGTCAGTAGA-1,1,62,102,8912,8501 TACGTAAAGCGGAGTG-1,1,63,103,9032,8569 GCTACAATCGAGGATA-1,1,62,104,8912,8638 TCAGCCAATCCGTAAA-1,1,63,105,9032,8707 ATCATAGCCCTATGTA-1,1,62,106,8912,8776 GAGGCCTGTTGATACA-1,1,63,107,9032,8845 ATATACGCTCGTGACG-1,1,62,108,8912,8914 CCCTTTAATGGAGTTC-1,1,63,109,9032,8982 TTACACGATCTGCGAC-1,1,62,110,8912,9051 TCGCATAAAGGGCGCA-1,1,63,111,9032,9120 TGTAGCCATCCCATTC-1,1,62,112,8912,9189 GGGTCTATCGCTTTCC-1,1,63,113,9032,9258 GGAGGGTCAAGTAAGA-1,0,62,114,8912,9327 TACGGCATGGACGCTA-1,0,63,115,9032,9395 CACGTCAATCAATGGA-1,0,62,116,8912,9464 CGCTTGGACGGATAGA-1,0,63,117,9032,9533 CGCGGTACGGTATACA-1,0,62,118,8912,9602 CCTACTCAACACGATT-1,0,63,119,9032,9671 CGTTTGGTGTTGTGGG-1,0,62,120,8912,9740 GTTGTTGCAAGATGGC-1,0,63,121,9032,9808 CATTCGTCGTAGCGGT-1,0,62,122,8912,9877 CAGCCTCGATAGCGGT-1,0,63,123,9032,9946 TCATAAGTCCAAGAAG-1,0,62,124,8912,10015 AAAGTGCCATCAATTA-1,0,63,125,9032,10084 GTTGCAGTCGACAACA-1,0,62,126,8912,10153 TAAATGGGCTACTGAG-1,0,63,127,9032,10221 GGACAAGCCATGATCG-1,0,64,0,9152,1480 TCCAATGCGTCGCCGC-1,0,65,1,9272,1549 AAAGAATGACCTTAGA-1,0,64,2,9152,1618 CCTATTATTCCGGCCG-1,0,65,3,9272,1687 CAGTAAGGGACGTCTC-1,1,64,4,9152,1755 GGGATGGACCCGCGTC-1,0,65,5,9272,1824 GACGCATACCCGTCGG-1,1,64,6,9152,1893 GGGCAGGATTTCTGTG-1,0,65,7,9272,1962 TATCTGAGCCGATATT-1,1,64,8,9152,2031 AATGTATGGCACTGTA-1,0,65,9,9272,2100 GCCTTTGTCAGTGGAC-1,1,64,10,9152,2168 AACCATAGGGTTGAAC-1,0,65,11,9272,2237 AAACTTAATTGCACGC-1,1,64,12,9152,2306 TAGGCGGCTGCAAAGA-1,0,65,13,9272,2375 TCCATCAATACTAATC-1,1,64,14,9152,2444 ACCTCGAACTTATGCT-1,0,65,15,9272,2512 ACAAACCATGCGTCCT-1,1,64,16,9152,2581 ACACCGGTCTGACCGC-1,0,65,17,9272,2650 ATGGCAGCATTACGAT-1,1,64,18,9152,2719 CTGGTGAATGGGCCTA-1,0,65,19,9272,2788 CACAGAGACGAGGACG-1,0,64,20,9152,2857 GCACAAACCCTAGATG-1,0,65,21,9272,2925 ACTATGTCCAGCTGCC-1,0,64,22,9152,2994 AAGCCGCCGTGAAATC-1,0,65,23,9272,3063 ATGGGTGTATACCTCC-1,0,64,24,9152,3132 TAAGCGCGAATCAAAT-1,0,65,25,9272,3201 AGCCCGGCATTAGAGG-1,0,64,26,9152,3270 GTGATCAAGCGTGCAC-1,0,65,27,9272,3338 CTGCCTTTAATACCTT-1,0,64,28,9152,3407 TACCTCCACACCAATG-1,0,65,29,9272,3476 GAGCATCAACAACTTG-1,0,64,30,9152,3545 CATACGAACTAGCTGG-1,0,65,31,9272,3614 GGGAACGGTTTCAGAT-1,0,64,32,9152,3683 AGGGTGCCGTTCTTTA-1,0,65,33,9272,3751 ACGACTGGTCATACTC-1,0,64,34,9152,3820 GGATCTTACTGCCCTT-1,0,65,35,9272,3889 TACTCCTCTAGTTGAC-1,0,64,36,9152,3958 GTAGCTCCGGGAGGCT-1,0,65,37,9272,4027 GGACTCGTGAGTGGTC-1,0,64,38,9152,4096 GTAGTTCGAAGGCGAA-1,0,65,39,9272,4164 CTCAAACCACTGCCCG-1,0,64,40,9152,4233 GAGGGAGTCAGATCGC-1,0,65,41,9272,4302 GCGTCCCTAAGACATA-1,0,64,42,9152,4371 TCTCTTACCGCGAACC-1,0,65,43,9272,4440 GGCTACTATACACTCC-1,0,64,44,9152,4509 CGTTGCCCGCGTGGGA-1,0,65,45,9272,4577 TATAGAGTCGCTTGAA-1,0,64,46,9152,4646 ATGTTGTAGTCTGTTT-1,0,65,47,9272,4715 AGTATACACAGCGACA-1,0,64,48,9152,4784 TGTGGTTGCTAAAGCT-1,0,65,49,9272,4853 TGATTCCCGGTTACCT-1,1,64,50,9152,4922 CACTGACGATTGTGGA-1,1,65,51,9272,4990 AACATTGTGACTCGAG-1,1,64,52,9152,5059 GTCCAATATTTAGCCT-1,1,65,53,9272,5128 GCTCTTTCCGCTAGTG-1,1,64,54,9152,5197 GGGTCAGGAGCTAGAT-1,1,65,55,9272,5266 AGGTGGTGACCTTCGC-1,1,64,56,9152,5334 CCCGGGTCGTTCAGGG-1,1,65,57,9272,5403 AGCCAAGCTTTGTGTC-1,1,64,58,9152,5472 TGTGGCGGGCTTCTGG-1,1,65,59,9272,5541 CGAGGGTATCCAGGTG-1,1,64,60,9152,5610 CGTTCAGACCCGCGAA-1,1,65,61,9272,5679 TCATATGAGCTTTGTT-1,1,64,62,9152,5747 AGTTGACGGTCCTTGC-1,1,65,63,9272,5816 ATAATTAGCTAAGTAG-1,1,64,64,9152,5885 GGTCTTGAGCGCTCTT-1,1,65,65,9272,5954 CGTTGTCGGCAATTGA-1,1,64,66,9152,6023 TCTTGCTCCCGATACT-1,1,65,67,9272,6092 AGCAGAAGGAGAAAGA-1,1,64,68,9152,6160 GAAGCCACTGATTATG-1,1,65,69,9272,6229 TGCTCTTGAGAGTTTG-1,1,64,70,9152,6298 GACATCCGTCGAACTG-1,1,65,71,9272,6367 AGATATAATACGACTA-1,1,64,72,9152,6436 TCGCTACTGGCTTTGA-1,1,65,73,9272,6505 GTGACAGCTTCCCACT-1,1,64,74,9152,6573 GTGACGCAGGTTTCAT-1,1,65,75,9272,6642 GGGAAGACGGTCTGTC-1,1,64,76,9152,6711 CGTCGCATGTGAGCCA-1,1,65,77,9272,6780 AGAAGGTTGTAGGTCG-1,1,64,78,9152,6849 GGCCGGCGTCTGCTAT-1,1,65,79,9272,6918 TTGACCAGGAACAACT-1,1,64,80,9152,6986 AGTCGTATAAAGCAGA-1,1,65,81,9272,7055 GGCGTAGGGAAAGCTG-1,1,64,82,9152,7124 AAACCTAAGCAGCCGG-1,1,65,83,9272,7193 ATTGCCTTTATGTTTG-1,1,64,84,9152,7262 CAGGCAGTCTTACCAG-1,1,65,85,9272,7331 AGCTAAGTACGCAGGC-1,1,64,86,9152,7399 AAATCCGATACACGCC-1,1,65,87,9272,7468 CGAGAGCTTTCACTAC-1,1,64,88,9152,7537 CGCCCAGCGTTTCACG-1,1,65,89,9272,7606 TTAAGTATTGTTATCC-1,1,64,90,9152,7675 AAACGGGCGTACGGGT-1,1,65,91,9272,7744 GTATCCTTTGGTAACC-1,1,64,92,9152,7812 CATAGTCAAATACATA-1,1,65,93,9272,7881 TCTATGCTATAACGAC-1,1,64,94,9152,7950 ACGTTCTGTACAAGTC-1,1,65,95,9272,8019 CGCGAAGTGGCATACT-1,1,64,96,9152,8088 ACCAACCGCACTCCAC-1,1,65,97,9272,8156 GTCATGCGCGAGGGCT-1,1,64,98,9152,8225 TAGGCTAAAGTGGCAC-1,1,65,99,9272,8294 TGGCTACACTCTACCT-1,1,64,100,9152,8363 TGTCCACGGCTCAACT-1,1,65,101,9272,8432 AATTGCAGCAATCGAC-1,1,64,102,9152,8501 GTCAACCAGGCCTATA-1,1,65,103,9272,8569 ATCTTATCGCACACCC-1,1,64,104,9152,8638 GTCTATTGCATGCTCG-1,1,65,105,9272,8707 GCACGTGGTTTACTTA-1,1,64,106,9152,8776 ATTCGCGCCTTGAGAG-1,1,65,107,9272,8845 AGCGATGCGCCTAATA-1,1,64,108,9152,8914 TCTATAGGTGGGTAAT-1,1,65,109,9272,8982 AGATACCAATAGAACC-1,1,64,110,9152,9051 CGTGTATGGGAGCTGA-1,1,65,111,9272,9120 ATGTACATGCGGTGAG-1,1,64,112,9152,9189 TTGGCTCAATATGTGT-1,1,65,113,9272,9258 GTTCGGAGCACTCAAC-1,0,64,114,9152,9327 TCCCTCTTCTCAAGGG-1,0,65,115,9272,9395 TTACGTATCTATGACA-1,0,64,116,9152,9464 CCCATATAGGTCGATT-1,0,65,117,9272,9533 GTCCACGTCGCATTCG-1,0,64,118,9152,9602 AATTGTGGTTGCCAAA-1,0,65,119,9272,9671 AGGAACGAACGACTTC-1,0,64,120,9152,9740 TAATTCCAATGCTTCA-1,0,65,121,9272,9808 AGGGCCCTAATGTTCT-1,0,64,122,9152,9877 AGGTGTTGCCGACCAC-1,0,65,123,9272,9946 CTGAGAGTAGAAATAC-1,0,64,124,9152,10015 TAGAAGAAGGGTTACA-1,0,65,125,9272,10084 GGTGACTGATAGAGAG-1,0,64,126,9152,10153 TACCCTCGGTAACCCT-1,0,65,127,9272,10221 TGTAAGACTGATAAGA-1,0,66,0,9392,1480 GTCACTCATGAGCGAT-1,0,67,1,9512,1549 CGGTTTACTGAACATT-1,0,66,2,9392,1618 GAGATCGATCTTACTC-1,0,67,3,9512,1687 TCTTTCATCCGTCCTT-1,0,66,4,9392,1755 TCGGATCTGGATGACC-1,0,67,5,9512,1824 GTCCTAGGATACCTTA-1,0,66,6,9392,1893 TGTACCCGACCCTAAT-1,0,67,7,9512,1962 AGGTTCTCCTTTCCGG-1,0,66,8,9392,2031 AATTGCGTGGATTACA-1,0,67,9,9512,2100 CGATAGCGATACAGTG-1,0,66,10,9392,2168 CGCCCTAATTGTTCAA-1,0,67,11,9511,2237 ATTATGAGACCCAATT-1,0,66,12,9392,2306 CCTCCTAGCTAGAGTC-1,0,67,13,9511,2375 CGAAGGGTTTCAGATT-1,0,66,14,9392,2444 CACAAGCTAAGAAAGG-1,0,67,15,9511,2512 CACCGGTAGAGACATT-1,0,66,16,9392,2581 ACTCATGGCAGCCTTC-1,0,67,17,9511,2650 CATCCAATATAGTTTG-1,0,66,18,9392,2719 CAGATATGAAGATGAC-1,0,67,19,9511,2788 GCAAAGGGCGTTAGCC-1,0,66,20,9392,2857 CTGTTGTTCAGTCGTA-1,0,67,21,9511,2925 AAAGGCCCTATAATAC-1,0,66,22,9392,2994 AACATTGAAGTTGATC-1,0,67,23,9511,3063 GCTAGCGATAGGTCTT-1,0,66,24,9392,3132 ATTGCCTATTAGACCG-1,0,67,25,9511,3201 GGGCGTTTACATTCAT-1,0,66,26,9392,3270 CCTCTACAAGGATTGG-1,0,67,27,9511,3338 AGTGACTGTGACACAA-1,0,66,28,9392,3407 AGCCCTCCCTGGTGGC-1,0,67,29,9511,3476 CGGTTGAGTATCCTTC-1,0,66,30,9392,3545 CATTATCCCATTAACG-1,0,67,31,9511,3614 AATGTGCTAATCTGAG-1,0,66,32,9392,3683 CTTAGTTGAGGAATCG-1,0,67,33,9511,3751 CTTCTGGGCGTACCTA-1,0,66,34,9392,3820 AGTCAAATGATGTGAT-1,0,67,35,9511,3889 TGAACAAGCAGGGACT-1,0,66,36,9392,3958 AATACCGGAGGGCTGT-1,0,67,37,9511,4027 GTTTGGTGATCGGTGC-1,0,66,38,9392,4096 GACTGCTGGTGAGAAA-1,0,67,39,9511,4164 CGATCCTCGCAACATA-1,0,66,40,9392,4233 CCAACCTTATGTAACT-1,0,67,41,9511,4302 CGTGGTACCCAAAGGC-1,0,66,42,9392,4371 AACCCGACAACCCGTG-1,0,67,43,9511,4440 TATGTAAAGTGCTTAA-1,0,66,44,9392,4509 GCAAGTGTAAAGCATG-1,0,67,45,9511,4577 GTAACTGCCCAAGGAG-1,0,66,46,9392,4646 GGTGCATAAATGATTA-1,0,67,47,9511,4715 TAGTCCCGGAGACCAC-1,0,66,48,9392,4784 CGGCCAGAGCGACCAT-1,0,67,49,9511,4853 TGAATGAGTGTTTCCC-1,0,66,50,9392,4922 TTCACTTCCTAGAACG-1,0,67,51,9511,4990 CGCTTAGTATTGATAC-1,0,66,52,9392,5059 AACGCGACCTTGGGCG-1,0,67,53,9511,5128 GTGCACCAGCTTCAAC-1,1,66,54,9392,5197 TTCTATTAAACGCAGC-1,1,67,55,9511,5266 TGGCAAGCACAAGTCG-1,1,66,56,9392,5334 ATCTGCTGTTATCGCC-1,1,67,57,9511,5403 AATTCCAAGCATGTAC-1,1,66,58,9392,5472 AAACGGTTGCGAACTG-1,1,67,59,9511,5541 GAAGGAGTCGAGTGCG-1,1,66,60,9392,5610 GGCAAGCCCATAGTGG-1,1,67,61,9511,5679 TGACCAAATCTTAAAC-1,1,66,62,9392,5747 TTCGGTACTGTAGAGG-1,1,67,63,9511,5816 ATGTACGATGACGTCG-1,1,66,64,9392,5885 ATCTAGCTTGTGAGGG-1,1,67,65,9511,5954 AGCGGGTCTGACACTC-1,1,66,66,9392,6023 GAGGTACGCGTGTCCC-1,1,67,67,9511,6092 GCACTGCCTACCTTTA-1,1,66,68,9392,6160 GGAGCGAGGCCTACTT-1,1,67,69,9511,6229 AAACTCGGTTCGCAAT-1,1,66,70,9392,6298 GGCGCTTCATTCCCTG-1,1,67,71,9511,6367 TGCTCGGTGGGTCACC-1,1,66,72,9392,6436 AAGCGCAGGGCTTTGA-1,1,67,73,9511,6505 GACCTTCCACGTCTAC-1,1,66,74,9392,6573 GTTAGCCCATGACATC-1,1,67,75,9511,6642 AATTCGATTCGAGGAT-1,1,66,76,9392,6711 AGTCTTTAAAGTGTCC-1,1,67,77,9511,6780 GACTAGGCCGTTAGGT-1,1,66,78,9392,6849 TCCAAGCCTAGACACA-1,1,67,79,9511,6918 GATTGGGAAAGGTTGT-1,1,66,80,9392,6986 GATGAGGAACCTTCGG-1,1,67,81,9511,7055 TGAATACCGACGCGTA-1,1,66,82,9392,7124 AATCGTGAGCCGAGCA-1,1,67,83,9511,7193 GCGAAGAATCTGACGG-1,1,66,84,9392,7262 GAACAACTGGGATGAA-1,1,67,85,9511,7331 TCGCCGACATATTCGC-1,1,66,86,9392,7399 CGTAGAGAGTAATTAT-1,1,67,87,9511,7468 CGATAGTCGTACTGCA-1,1,66,88,9392,7537 CGCATGCCGAATGCGT-1,1,67,89,9511,7606 CTCTAGCCCTCGGAAA-1,1,66,90,9392,7675 TCCAACTCAGCTATCT-1,1,67,91,9511,7744 GTCTAGTGAGCCGCTT-1,1,66,92,9392,7812 TACCGAATAATTGTAA-1,1,67,93,9511,7881 ATATAACACGGGCGCA-1,1,66,94,9392,7950 GCATGCTAATAACGAT-1,1,67,95,9511,8019 TCCGGGCTTGACGGGA-1,1,66,96,9392,8088 ATTATTCAGAGTCACT-1,1,67,97,9511,8156 TAGCAGTATGACTAAA-1,1,66,98,9392,8225 TATGAAGAATTAAGGT-1,1,67,99,9511,8294 CAAGGCCAGTGGTGCA-1,1,66,100,9392,8363 TGCGTACGGCTAATTG-1,1,67,101,9511,8432 CAGATAATGGGCGGGT-1,1,66,102,9392,8501 GAGAACGGTTCTGACT-1,1,67,103,9511,8569 CGCTTCGGTCTAAGAC-1,1,66,104,9392,8638 AGCATTACGAGGCAAG-1,1,67,105,9511,8707 AAGTTGTGATGTTATA-1,1,66,106,9391,8776 TTGCTCATAGTACGTG-1,1,67,107,9511,8845 TACTTAAACATGTACA-1,1,66,108,9391,8914 AGTGAGTCGAATTAAC-1,1,67,109,9511,8982 TAGGCCTATATAGTCT-1,1,66,110,9391,9051 ACTCGCCGTTCGATAA-1,1,67,111,9511,9120 GGTACGTTGCGGCCGG-1,1,66,112,9391,9189 TATTGCCGGGCTTGTA-1,1,67,113,9511,9258 GGTAAACTCTGCGCTG-1,0,66,114,9391,9327 TCCCTTGTCTGAAACT-1,0,67,115,9511,9395 CATGATCGCTTTGAGA-1,0,66,116,9391,9464 GGACGGGCGACCAACC-1,0,67,117,9511,9533 GAGAGGCCTATGTGTA-1,0,66,118,9391,9602 TCGTAACTCCCAAGAC-1,0,67,119,9511,9671 CGTATCTAGAACTAAG-1,0,66,120,9391,9740 GCACCTTCCCGAAGGT-1,0,67,121,9511,9808 TACCTCTTTACCATCC-1,0,66,122,9391,9877 TGACTCTAACTGGTAA-1,0,67,123,9511,9946 GAGAAACTGGATCCCA-1,0,66,124,9391,10015 ATCCGGACCAGCCTGA-1,0,67,125,9511,10084 TTATTTAGGTTCCTTA-1,0,66,126,9391,10153 CGAATTCCCGGTTCAA-1,0,67,127,9511,10221 TAGTTTGATCGGTCGC-1,0,68,0,9631,1480 AGTCGAAACGATTCAG-1,0,69,1,9751,1549 ACGTCGGGCAACTCGG-1,0,68,2,9631,1618 ACTTGCTCTATCTACC-1,0,69,3,9751,1687 ATTACGGGCTACGGTT-1,0,68,4,9631,1755 GCAAACGTAAGCGACC-1,0,69,5,9751,1824 TTCGGACTGGGCATGG-1,0,68,6,9631,1893 GGGCCATTCGTGCTGG-1,0,69,7,9751,1962 GAGTTGTCACCAGTCT-1,0,68,8,9631,2031 AGTAATTTGCAAGCGT-1,0,69,9,9751,2100 GTGGCCGGTTTCTCGG-1,0,68,10,9631,2168 ATCTTAGGGCATTAAT-1,0,69,11,9751,2237 CTACATATCGCGGGAC-1,0,68,12,9631,2306 ATGGTATTTACTGATT-1,0,69,13,9751,2375 CCGTCAACCTCTGGCG-1,0,68,14,9631,2444 GCTTCGACGTTCAATC-1,0,69,15,9751,2513 GACCGATTAAATATGT-1,0,68,16,9631,2581 GTCGAATTTGGGCGCT-1,0,69,17,9751,2650 TCACGGCCCAAGAGAG-1,0,68,18,9631,2719 CTACGATCCTATCCTA-1,0,69,19,9751,2788 TGCAGTGGTAGGGAAC-1,0,68,20,9631,2857 TTGCCTAATCCAAAGT-1,0,69,21,9751,2925 AGCGAGACGTGAAGGC-1,0,68,22,9631,2994 TTCTACCTCAATCGGT-1,0,69,23,9751,3063 TACGCTGCTGTGTTAA-1,0,68,24,9631,3132 TAGTCCTGCACTAAGC-1,0,69,25,9751,3201 AGCACACGTTTAGACT-1,0,68,26,9631,3270 GTTCGACAATTGTATA-1,0,69,27,9751,3338 CCATGTTCATCTATAT-1,0,68,28,9631,3407 CCCTCGATAATACACA-1,0,69,29,9751,3476 ACTGCCCGCCATTCTC-1,0,68,30,9631,3545 CTATATCCAGCCTGGC-1,0,69,31,9751,3614 CGCACGTCTGTTTATG-1,0,68,32,9631,3683 AATCAGGTTTCATTTA-1,0,69,33,9751,3751 AGAGAAACACCAGAAA-1,0,68,34,9631,3820 ACCCGATTGGTTCCGA-1,0,69,35,9751,3889 TACCAGGAATCCCGTC-1,0,68,36,9631,3958 AAGTGCTTCTCTATTG-1,0,69,37,9751,4027 TGCATGTGACCCATAG-1,0,68,38,9631,4096 TAGATTCAAAGTGCGG-1,0,69,39,9751,4164 AGGGTCAGAGCACTCG-1,0,68,40,9631,4233 GTGAGATAACCTTATA-1,0,69,41,9751,4302 GTGTCAGTGTACGTGG-1,0,68,42,9631,4371 CTGTAGTGAGGATCGA-1,0,69,43,9751,4440 GATAGTGCGAGTAAGT-1,0,68,44,9631,4509 AGGGTTCAGACGGTCC-1,0,69,45,9751,4577 GGACTCGACAGCGCAT-1,0,68,46,9631,4646 CACTCTCAAGCATCGA-1,0,69,47,9751,4715 GAGCGGAATGCGGTGT-1,0,68,48,9631,4784 CAGTTCGAGGACCCGA-1,0,69,49,9751,4853 CGTAACTTCGACACTT-1,0,68,50,9631,4922 TGATCACCACACTGAC-1,0,69,51,9751,4990 CATACTTCTTTCTCCG-1,0,68,52,9631,5059 CAAGTAAGTGATAGAC-1,0,69,53,9751,5128 AGCCCGCAACAAGCAG-1,0,68,54,9631,5197 GCTCCATGCAAAGCAA-1,0,69,55,9751,5266 TCGTACCGACGTCAAG-1,1,68,56,9631,5334 ATTATCGGAATGTACG-1,0,69,57,9751,5403 ACCTACTATAAATCTA-1,1,68,58,9631,5472 TATCCTATCAACTGGT-1,0,69,59,9751,5541 GCGCGGTCTAGTAACT-1,1,68,60,9631,5610 CCTTCGTATAGAATCC-1,1,69,61,9751,5679 TGGGCGATACAATAAG-1,1,68,62,9631,5747 TGACATGTAACGTGAC-1,1,69,63,9751,5816 TTGGGAAGACGAGCCG-1,1,68,64,9631,5885 GGTGTAAATCGATTGT-1,1,69,65,9751,5954 GAACTGTGGAGAGACA-1,1,68,66,9631,6023 TCCACATCGTATATTG-1,1,69,67,9751,6092 CCTATGGTCAAAGCTG-1,1,68,68,9631,6160 TCCTTGTCCTTTAATT-1,1,69,69,9751,6229 AAGTTTATGGGCCCAA-1,1,68,70,9631,6298 GTCCGGGTTCACATTA-1,1,69,71,9751,6367 ATGTAGCGCGCGTAGG-1,1,68,72,9631,6436 TACGGAAGCCAAACCA-1,1,69,73,9751,6505 GCCCTGAGGATGGGCT-1,1,68,74,9631,6573 CGGGCGATGGATCACG-1,1,69,75,9751,6642 TGCGGACTTGACTCCG-1,1,68,76,9631,6711 TAATACTAGAACAGAC-1,1,69,77,9751,6780 TCAAATTGTTGTGCCG-1,1,68,78,9631,6849 GGGCAGTCAACGCCAA-1,1,69,79,9751,6918 TCGCTGCCAATGCTGT-1,1,68,80,9631,6986 TACGTGGGCCCAGGGC-1,1,69,81,9751,7055 GCCTACGTTCTGTGCA-1,1,68,82,9631,7124 TTGCGTGTGTAGGCAT-1,1,69,83,9751,7193 TCCTAAAGATTCAGAC-1,1,68,84,9631,7262 TGGGTGCACAAGCCAT-1,1,69,85,9751,7331 GGGAGCGACCGTAGTG-1,1,68,86,9631,7399 CATAGAGGAGATACTA-1,1,69,87,9751,7468 CTTCGATTGCGCAAGC-1,1,68,88,9631,7537 GTGCCTGAGACCAAAC-1,1,69,89,9751,7606 TCATCCTCAGCTGCTT-1,1,68,90,9631,7675 TGCAACTACTGGTTGA-1,1,69,91,9751,7744 ATGTTGATTAGAGACT-1,1,68,92,9631,7812 GTTTCTAGAGGCGCGG-1,1,69,93,9751,7881 TACAAGGGCTTCTTTA-1,1,68,94,9631,7950 ACAGGCACGGATCCTT-1,1,69,95,9751,8019 CCCAAGTCATTACACT-1,1,68,96,9631,8088 ACTCTGACCTAATAGA-1,1,69,97,9751,8156 GGATGGCTTGAAGTAT-1,1,68,98,9631,8225 ACCCTCCCGTCAGGGC-1,1,69,99,9751,8294 AGCTTCTTCTCGAGCA-1,1,68,100,9631,8363 TTGCGCTTGATCAATA-1,1,69,101,9751,8432 TGGGTGTAATAGATTT-1,1,68,102,9631,8501 CATGGTTTATTAATCA-1,1,69,103,9751,8569 TTGCCTTCTCGCCGGG-1,1,68,104,9631,8638 TTAAAGTAAGTCGCCA-1,1,69,105,9751,8707 AGTTGGCAAGGCTAGA-1,1,68,106,9631,8776 CCGCACTTGCAATGAC-1,1,69,107,9751,8845 AATGTTGTCGTGAGAC-1,1,68,108,9631,8914 CCAAGGTTGCCCTTTC-1,1,69,109,9751,8982 TGTGACTAGAGTTTGC-1,1,68,110,9631,9051 TTGTGATCTGTTCAGT-1,1,69,111,9751,9120 GGAGTTGATTCTGTGT-1,1,68,112,9631,9189 GTAGTGAGCAACCTCA-1,1,69,113,9751,9258 AAGACATACGTGGTTT-1,1,68,114,9631,9327 CATCCCGAGATTCATA-1,0,69,115,9751,9395 GGCCGCAGGAACCGCA-1,0,68,116,9631,9464 CCAGAAACTGATGCGA-1,0,69,117,9751,9533 ACCCGTAGTCTAGTTG-1,0,68,118,9631,9602 AGGGTCTGGACGCAGT-1,0,69,119,9751,9671 TTGAAACCCTCATTCC-1,0,68,120,9631,9740 TCAATCCCGCGCCAAA-1,0,69,121,9751,9808 AGGACATCGGCACACT-1,0,68,122,9631,9877 GACAAGACGCCCGTGC-1,0,69,123,9751,9946 GAGTAAATTAAGAACC-1,0,68,124,9631,10015 TAAGTCGGTGAGCTAG-1,0,69,125,9751,10084 CTTACTGACTCCTCTG-1,0,68,126,9631,10153 TTAACTGATCGTTTGG-1,0,69,127,9751,10221 GGGCGATCCATAGGCC-1,0,70,0,9871,1480 CGTATTGTTTGGCGCC-1,0,71,1,9991,1549 CGCGTGGGCCTGTGTT-1,0,70,2,9871,1618 AAATCTGCCCGCGTCC-1,0,71,3,9991,1687 GCTGAAGGGTTCTTGG-1,0,70,4,9871,1755 TAATTGCGCTGATTAC-1,0,71,5,9991,1824 TCGCGCGTTTACATGA-1,0,70,6,9871,1893 TAACTGAAATACGCCT-1,0,71,7,9991,1962 CCTGTCGTGTATGAAG-1,0,70,8,9871,2031 CGGGAACGCCCTGCAT-1,0,71,9,9991,2100 AGTTGCGGTCCTCAAC-1,0,70,10,9871,2168 GGGTCCTTGGAAGAAG-1,0,71,11,9991,2237 CGGGAAGTACCGTGGC-1,0,70,12,9871,2306 ACGGTCACCGAGAACA-1,0,71,13,9991,2375 TAGACTCAGTTGGCCT-1,0,70,14,9871,2444 CCTTCCGCAACGCTGC-1,0,71,15,9991,2513 CAGTGTTAATCTCTCA-1,0,70,16,9871,2581 CAGGCCAGTACCACCT-1,0,71,17,9991,2650 GATCGCTGTGGTGCGT-1,0,70,18,9871,2719 GTATCTCGGGCGCTTT-1,0,71,19,9991,2788 CCGGGCTAAGAATTTC-1,0,70,20,9871,2857 CTTCACGCCCTGGTAC-1,0,71,21,9991,2925 CGGATGAATGCTGTGA-1,0,70,22,9871,2994 CTCTGCAGGCATTCTT-1,0,71,23,9991,3063 TCAAAGTCACGGCGTC-1,0,70,24,9871,3132 TGGGTTTCGGGCGTAC-1,0,71,25,9991,3201 TGCTATGGCAAAGGGA-1,0,70,26,9871,3270 TTCACGGTCGTCACGT-1,0,71,27,9991,3338 CGTAAAGCAAGAAATC-1,0,70,28,9871,3407 CTGATCCCTTTATGCA-1,0,71,29,9991,3476 GAGTATACCCTAATCA-1,0,70,30,9871,3545 CCACGGCAGGTGTAGG-1,0,71,31,9990,3614 ACGTACTTTGGCACGG-1,0,70,32,9871,3683 CCTGAGAATAAATGCA-1,0,71,33,9990,3751 TTGATGCCGCTCGTCG-1,0,70,34,9871,3820 GCCAGGAAAGAACACT-1,0,71,35,9990,3889 TCCGACCGCTAATCAA-1,0,70,36,9871,3958 TATATCAAAGTGATCT-1,0,71,37,9990,4027 CCTCGGTTTCCTTGCC-1,0,70,38,9871,4096 TAAATTTAGTAACACC-1,0,71,39,9990,4164 CTCGTTACGGCTACCA-1,0,70,40,9871,4233 GCCGTCGGTTTCGGGC-1,0,71,41,9990,4302 GTTCCGTCCGCCTGCA-1,0,70,42,9871,4371 CTAGGGATAGGGACAA-1,0,71,43,9990,4440 GTCCAGGCACGTGTGC-1,0,70,44,9871,4509 GAGGAATATCTCTTTG-1,0,71,45,9990,4577 CGTTCAAGGAAACGGA-1,0,70,46,9871,4646 GTGGGAACAAACCGGG-1,0,71,47,9990,4715 GGGCACGTAGTACTGT-1,0,70,48,9871,4784 ACTACAAAGAGAGGTG-1,0,71,49,9990,4853 GGTGTAGGTAAGTAAA-1,0,70,50,9871,4922 CCTGTTCAACCTCGGG-1,0,71,51,9990,4990 TGAGGTGTGTGGCGGA-1,0,70,52,9871,5059 ATTGTCTGTTTCATGT-1,0,71,53,9990,5128 GCCGGTCGTATCTCTC-1,0,70,54,9871,5197 ATATGGGATAGCAACT-1,0,71,55,9990,5266 GATAGAACCCGCTAGG-1,0,70,56,9871,5335 ATCCCATTTCCGTGGG-1,0,71,57,9990,5403 GATGCTACCTTCGATG-1,0,70,58,9871,5472 TGCAAAGTTCGTCTGT-1,0,71,59,9990,5541 GTTCAGTCGCCAAATG-1,0,70,60,9871,5610 GTCTCCGCCTCAATAC-1,0,71,61,9990,5679 AGTAGAAGGCGCCTCA-1,0,70,62,9871,5747 GTTGTAGATTTATGAG-1,0,71,63,9990,5816 CTATTTGCTTGGAGGA-1,1,70,64,9871,5885 AGCCATATAGTATGTG-1,0,71,65,9990,5954 TGTTCCGGCCTGAGCT-1,1,70,66,9871,6023 TGCCGTGGGACCCAAT-1,1,71,67,9990,6092 TTGCAAGAAGACTCCT-1,1,70,68,9871,6160 CCGCTCCAGGGCGATC-1,1,71,69,9990,6229 CAAACCCTCCGGCGGG-1,1,70,70,9871,6298 CGGACCTTTACGTCCC-1,1,71,71,9990,6367 ACGTAGGAGAGTCGCT-1,1,70,72,9871,6436 CTGCGACCTCGCCGAA-1,1,71,73,9990,6505 GGCCCAGCTGGTTTGC-1,1,70,74,9871,6573 GGATTAATCATGGACC-1,1,71,75,9990,6642 GAGATGGCTTTAATCA-1,1,70,76,9871,6711 AGTACAGAAGCTTATA-1,1,71,77,9990,6780 GCGGCTTTAGCAAGTT-1,1,70,78,9871,6849 ACCGAGTCTCCTTATT-1,1,71,79,9990,6918 GACCACACTTCCCTTT-1,1,70,80,9871,6986 TGTAGCCAATTCCGTT-1,1,71,81,9990,7055 CTCGTCTGTGCCTTCG-1,1,70,82,9871,7124 GGACTCTTTGACTAAG-1,1,71,83,9990,7193 TCATCGACGACCGTCG-1,1,70,84,9871,7262 TACTACGTGCAATGCG-1,1,71,85,9990,7331 CCCTACTTGAACAATG-1,1,70,86,9871,7399 GCAGCTGTCAACGCAT-1,1,71,87,9990,7468 ATCTACCATCTGCTCC-1,1,70,88,9871,7537 TCTCAAATCAATCGGG-1,1,71,89,9990,7606 ACTCCGGCCGACCACT-1,1,70,90,9871,7675 TACACCTCTTCGAATC-1,1,71,91,9990,7744 GTGGCTGTTTCTGTTC-1,1,70,92,9871,7812 ACGACTCTAGGGCCGA-1,1,71,93,9990,7881 TCGTTTACGCGACCCT-1,1,70,94,9871,7950 AGGATATCCGACTGCA-1,1,71,95,9990,8019 GACACTTCCAATTACC-1,1,70,96,9871,8088 ACGGTACAGTTCAATG-1,1,71,97,9990,8157 CTTGATGACCATCCAG-1,1,70,98,9871,8225 CTGGTAAAGACTTACA-1,1,71,99,9990,8294 CTTGCCCACCCACGCA-1,1,70,100,9871,8363 CATTACGCAGGAAGGG-1,1,71,101,9990,8432 GGACAACCATGAAGCC-1,1,70,102,9871,8501 GTTATCAAGCTATCGA-1,1,71,103,9990,8569 AGGTGCACGTCCACAT-1,1,70,104,9871,8638 AAAGAATGTGGACTAA-1,1,71,105,9990,8707 ACCAAGTCATCGGCAG-1,1,70,106,9871,8776 AGTAACTATAGCAGCC-1,1,71,107,9990,8845 GGGAAAGAATGCCAAC-1,1,70,108,9871,8914 AATCGGTATAGCCCTC-1,1,71,109,9990,8982 GGCACTGCGGTGGTTT-1,1,70,110,9871,9051 CGTCCTCATCGCGTGC-1,1,71,111,9990,9120 CTTAACTTACAGTATA-1,1,70,112,9871,9189 GTGAGTCGACTAATAG-1,1,71,113,9990,9258 TGTACTTCCGGGCATG-1,1,70,114,9871,9327 CACAAACCGCAGAACT-1,0,71,115,9990,9395 GCTTTACACAACTGGG-1,0,70,116,9871,9464 CACCGATGATGGGTAC-1,0,71,117,9990,9533 TCAATATACAGGAGGC-1,0,70,118,9871,9602 AACGACCTCCTAGCCG-1,0,71,119,9990,9671 GTTACCAAGGCGTACG-1,0,70,120,9871,9740 TAGCTCACTGTGTTTG-1,0,71,121,9990,9808 TCGGCAGGGTTAAGGG-1,0,70,122,9871,9877 TGTTAACAAAGTGACT-1,0,71,123,9990,9946 CAGAGCGATGGATGCT-1,0,70,124,9871,10015 CATAGTGGGCACGCCT-1,0,71,125,9990,10084 AAACGCTGGGCACGAC-1,0,70,126,9870,10153 TGTTCTCATACTATAG-1,0,71,127,9990,10221 TCCGCTGGGTCGATCG-1,0,72,0,10110,1480 TTAGCATCCCTCACGT-1,0,73,1,10230,1549 AGCCTTGTCACTGATA-1,0,72,2,10110,1618 GTTTCTTGTTAGAGCT-1,0,73,3,10230,1687 TCGGAGTCCTGGTTGC-1,0,72,4,10110,1755 ACGGGTTGTGACCTGT-1,0,73,5,10230,1824 TGACAGAAATCTTGCT-1,0,72,6,10110,1893 TAGCCATGATTGCCTA-1,0,73,7,10230,1962 CGAAGCCACAGCATGG-1,0,72,8,10110,2031 ACCCGTAGCAGAGAAT-1,0,73,9,10230,2100 AGCTTGATCAGGGTAG-1,0,72,10,10110,2168 CTATAAGTAGGGTTTG-1,0,73,11,10230,2237 TATAGTTAGGTGTACT-1,0,72,12,10110,2306 TACGCTGATAGTTGTA-1,0,73,13,10230,2375 TTCTCAATTGCTACAA-1,0,72,14,10110,2444 GTTGCCCTAACGGGTG-1,0,73,15,10230,2513 GACATTTCGCCCAGCC-1,0,72,16,10110,2581 GTAACTACGTAGACCT-1,0,73,17,10230,2650 CCAGTGTACAGACCGA-1,0,72,18,10110,2719 GCCCGATGCCCAGTTC-1,0,73,19,10230,2788 CGAACCTCTTTCCTAG-1,0,72,20,10110,2857 CATGCACATGAGAGGC-1,0,73,21,10230,2925 CCAAATCAAAGGGCAA-1,0,72,22,10110,2994 GTAGTTTAAGCACACG-1,0,73,23,10230,3063 TAAGTGAATAGTCTAC-1,0,72,24,10110,3132 GGTCCACGTCTATTTG-1,0,73,25,10230,3201 CCCTCAGATCGAGAAC-1,0,72,26,10110,3270 ACATTCGCGCGGAATA-1,0,73,27,10230,3338 CTATGAACACCTTGCC-1,0,72,28,10110,3407 CGAATGGTAGGTCGTC-1,0,73,29,10230,3476 TCGACATAGCGTAGCG-1,0,72,30,10110,3545 GACGTTGCTCGGCGGC-1,0,73,31,10230,3614 CTCGAGGCAAGTTTCA-1,0,72,32,10110,3683 GCTGGGAGCGCGTCAA-1,0,73,33,10230,3751 GACGATATCACTGGGT-1,0,72,34,10110,3820 CAGCTCTGGGCTCACT-1,0,73,35,10230,3889 TAGTCTGCGGCACATT-1,0,72,36,10110,3958 TGGTCGATATACCTCT-1,0,73,37,10230,4027 TTCAGTTCAAGAGGAG-1,0,72,38,10110,4096 GTCTGTAGGTTGAACA-1,0,73,39,10230,4164 GAGAGTCTCGGGAGAG-1,0,72,40,10110,4233 TTGTTTGTATTACACG-1,0,73,41,10230,4302 GCACAGCACGGGCCGA-1,0,72,42,10110,4371 AAACAGTGTTCCTGGG-1,0,73,43,10230,4440 TGGAGAATAATCGTCC-1,0,72,44,10110,4509 CGCCGCGTTCTGAACG-1,0,73,45,10230,4577 CATGCGTTGAGAGGAG-1,0,72,46,10110,4646 TACGCTCCTAGAACTG-1,0,73,47,10230,4715 CCTTGTGAACGTGGTT-1,0,72,48,10110,4784 TTAAAGGCGATGCTCG-1,0,73,49,10230,4853 TAAAGTGCACGTCTCG-1,0,72,50,10110,4922 TGTCCGCAAACAATTC-1,0,73,51,10230,4990 AGGCCTATCATACCAA-1,0,72,52,10110,5059 ACTGGGATGCCAGTGC-1,0,73,53,10230,5128 CGATCCACCATTGTTG-1,0,72,54,10110,5197 GGGCATGCATGTCGAG-1,0,73,55,10230,5266 TCCAGGCAGGACGATC-1,0,72,56,10110,5335 CAATGACCCTTAATTT-1,0,73,57,10230,5403 ATCAAGATCCCAGGAC-1,0,72,58,10110,5472 CTCAGAGCTAATGTCG-1,0,73,59,10230,5541 CTGCGATTTCGAGATT-1,0,72,60,10110,5610 ATGGTATTGGGAACCG-1,0,73,61,10230,5679 TAGGTTCTGCTGAGAA-1,0,72,62,10110,5747 GCCTGTCCCGGTGCAT-1,0,73,63,10230,5816 GGCCTGCTCTGATGTT-1,0,72,64,10110,5885 TAGAGGGAGTTTATCT-1,0,73,65,10230,5954 CTCTACATCCTGCGTG-1,0,72,66,10110,6023 ACACATTTCCGTAGAC-1,0,73,67,10230,6092 TGGGTGTTAAGTAGAA-1,0,72,68,10110,6160 GAGCTCAACATGAGCG-1,0,73,69,10230,6229 GCACACAGCTATTACC-1,0,72,70,10110,6298 GCGACGGTAGTCTCCT-1,0,73,71,10230,6367 GTATCAAGGTACTTCC-1,0,72,72,10110,6436 GGAAAGGGAATTGAGC-1,0,73,73,10230,6505 TACACAGCCGTGGTGC-1,1,72,74,10110,6573 CGGTTGGGCAGGGTCC-1,0,73,75,10230,6642 GCACGCCGATTCCCGC-1,1,72,76,10110,6711 CGCTTTCCGCCAAGGT-1,0,73,77,10230,6780 TGCCCGATAGTTAGAA-1,1,72,78,10110,6849 TCAGAACGGCGGTAAT-1,0,73,79,10230,6918 CCACTCAGATCCGCAA-1,1,72,80,10110,6986 GAAGGGTCATTAAGAC-1,0,73,81,10230,7055 GCGGTCTTGCTTTCAC-1,1,72,82,10110,7124 GGAAGGACACCGTATA-1,0,73,83,10230,7193 CGCGGGAATTCCTTTC-1,1,72,84,10110,7262 TCTATCCGATTGCACA-1,0,73,85,10230,7331 TACTCGTTTGAATCAA-1,1,72,86,10110,7399 GTCTGCCGACTCGACG-1,0,73,87,10230,7468 TACGGGTAATAACATA-1,1,72,88,10110,7537 CCAGTTCGGTAACTCA-1,1,73,89,10230,7606 CGTGCACACCACTGTA-1,1,72,90,10110,7675 CTTCAGTTGGACAACG-1,1,73,91,10230,7744 TGATCTATCACACTCT-1,1,72,92,10110,7812 TAGCAGATACTTAGGG-1,1,73,93,10230,7881 CACCGGGCATCACAAG-1,1,72,94,10110,7950 AGTGGCCCGCAAATGG-1,1,73,95,10230,8019 CTCGCTAGGTAAGCGA-1,1,72,96,10110,8088 GATAGATAGTACAGTC-1,1,73,97,10230,8157 CGAGACTACTGCTGCT-1,1,72,98,10110,8225 ACATTTGAAACCTAAC-1,1,73,99,10230,8294 GACACAGCCGGGACTG-1,1,72,100,10110,8363 ACGGAACACGAGTGCC-1,1,73,101,10230,8432 ACGCCAGTGCGTTTGC-1,1,72,102,10110,8501 GCACCTAGGCGAGTCC-1,1,73,103,10230,8569 TCACTATCCCTTCGGT-1,1,72,104,10110,8638 TGAGTGTAACAACGGG-1,1,73,105,10230,8707 ATTGGTTGTGCATTAC-1,1,72,106,10110,8776 CTGGCGATTTACATGT-1,1,73,107,10230,8845 TCCACCAAGACATAGG-1,1,72,108,10110,8914 AACGTCGCTGCACTTC-1,1,73,109,10230,8982 GTCTCCCGAGTCCCGT-1,1,72,110,10110,9051 AGCCCGCACTACAATG-1,1,73,111,10230,9120 GGCACGCTGCTACAGT-1,1,72,112,10110,9189 GCTTGAGTGACCTCTG-1,1,73,113,10230,9258 ATAGCCATAACAGTCA-1,1,72,114,10110,9327 TAGGAGGCTCGAGAAC-1,1,73,115,10230,9395 GTCGGGTGAAGTACCG-1,0,72,116,10110,9464 CACCCGCGTTTGACAC-1,0,73,117,10230,9533 TCTCAGGCTACTCGCT-1,0,72,118,10110,9602 TAGATTCTCTAGCAAA-1,0,73,119,10230,9671 CCCATTATTGTATCCT-1,0,72,120,10110,9740 GTTAATAGCGTCATTA-1,0,73,121,10230,9808 TACTCATTGACGCATC-1,0,72,122,10110,9877 TAGTGACAAGCTCTAC-1,0,73,123,10230,9946 ATCGCCGTGGTTCATG-1,0,72,124,10110,10015 CTGCTCTCAACACACC-1,0,73,125,10230,10084 GCATGACACAAAGGAA-1,0,72,126,10110,10153 CAACGATCGATCCAAT-1,0,73,127,10230,10221 ATACAGCGTCCACTGA-1,0,74,0,10350,1480 TCACGATTAATACGTT-1,0,75,1,10470,1549 CGTGAACTGACCCGAT-1,0,74,2,10350,1618 TCGATGTTACGGCCGT-1,0,75,3,10470,1687 GACCGGTGATACTCTC-1,0,74,4,10350,1755 TCTGTTTAGATTGTTC-1,0,75,5,10470,1824 GCTACTCGGACGCAGA-1,0,74,6,10350,1893 AAGAAAGTTTGATGGG-1,0,75,7,10470,1962 CGCCAGTAGTACCTTG-1,0,74,8,10350,2031 CTCCCTTGTATCAAGG-1,0,75,9,10470,2100 ACTTTATACACCACTT-1,0,74,10,10350,2168 AGATCTGGAGAGGATA-1,0,75,11,10470,2237 TCATCCATCTGATCAC-1,0,74,12,10350,2306 AGAACACGGCGATGGT-1,0,75,13,10470,2375 CCGCTCCGGATAAGCT-1,0,74,14,10350,2444 TGGTCGGGTACAGGGC-1,0,75,15,10470,2513 ACGGACGCAGCGACAA-1,0,74,16,10350,2581 ACATGCTTACGGCAGC-1,0,75,17,10470,2650 CAGGGAGATAGGCCAG-1,0,74,18,10350,2719 TCGCCACCCGGATTAC-1,0,75,19,10470,2788 TCTTGGTCAATGATAC-1,0,74,20,10350,2857 CATAGGGACACTTGTG-1,0,75,21,10470,2926 CACGAGCAAACCAGAC-1,0,74,22,10350,2994 GGGATATTGATCGCCA-1,0,75,23,10470,3063 TAATGTCGGTTCATGG-1,0,74,24,10350,3132 CGATTTGTCATTAATG-1,0,75,25,10470,3201 TTAAGATACCCAGAGA-1,0,74,26,10350,3270 CGACCGTTGGTATTCG-1,0,75,27,10470,3338 ACTACCATCCGAGGGC-1,0,74,28,10350,3407 TCTACGCACGATCTCC-1,0,75,29,10470,3476 AAGCCACTTGCAGGTA-1,0,74,30,10350,3545 ACGTTGTCGTTGAAAG-1,0,75,31,10470,3614 ACCGCTAGTCATTGGT-1,0,74,32,10350,3683 CATGAGTCCATCACGG-1,0,75,33,10470,3751 ATGTCTTGTTTGACTC-1,0,74,34,10350,3820 TCCCAAACATCCTCTA-1,0,75,35,10470,3889 CAACGCGATGAGCCAA-1,0,74,36,10350,3958 GACACCCAAAGACGCG-1,0,75,37,10470,4027 ACGTTCACTATGCCGC-1,0,74,38,10350,4096 ATGGACTGCTTAGTTG-1,0,75,39,10470,4164 CCATGGCAAACGCTCA-1,0,74,40,10350,4233 TTGTCTCGGCAAGATG-1,0,75,41,10470,4302 TTCGAACGAAACATGC-1,0,74,42,10350,4371 GGAAAGTCTTGATTGT-1,0,75,43,10470,4440 ATCATAGATCGACGAG-1,0,74,44,10350,4509 GATTAGAAACAAGCGT-1,0,75,45,10470,4577 GCTGCGAAGAATTATT-1,0,74,46,10350,4646 TTCCAGTGGGTTTCGT-1,0,75,47,10470,4715 GCTCATTGATCATATC-1,0,74,48,10350,4784 ATACGAGGTTTGTAAG-1,0,75,49,10470,4853 GTCTATACACGCATGG-1,0,74,50,10350,4922 GATTTGCGCTAACACC-1,0,75,51,10469,4990 TGGTGCCCTGCCTTAC-1,0,74,52,10350,5059 TCGAATCGCAGGGTAG-1,0,75,53,10469,5128 GGTAGGCCAATATCAC-1,0,74,54,10350,5197 CGTAAATAACAAAGGG-1,0,75,55,10469,5266 GACTCTAGAGTTCCAA-1,0,74,56,10350,5335 ACTTGTTACCGGATCA-1,0,75,57,10469,5403 GGCATTGAACATCTCA-1,0,74,58,10350,5472 AACCCGCTGTATTCCA-1,0,75,59,10469,5541 TAACAGGTTCCCTTAG-1,0,74,60,10350,5610 GTTCTTGTAACTCAAT-1,0,75,61,10469,5679 GATTCTGTTAATGAGT-1,0,74,62,10350,5747 GGACACCTCGGTGTTG-1,0,75,63,10469,5816 CGATCGAGAAGCACCA-1,0,74,64,10350,5885 CTGCTCTGACGGCAAA-1,0,75,65,10469,5954 CCCAGGAAGAATTCGA-1,0,74,66,10350,6023 TGTCGTGGGTATAGGC-1,0,75,67,10469,6092 ATATGTCTAGAGCGTG-1,0,74,68,10350,6160 GCGGGCAGACGGGTGA-1,0,75,69,10469,6229 CGAAGATCAGTTTCAT-1,0,74,70,10350,6298 ACGCCACTCGAAACAG-1,0,75,71,10469,6367 CTTAGATGTTTCATCC-1,0,74,72,10350,6436 GCGAATGGACTAGCGA-1,0,75,73,10469,6505 TAAATTGTGGGTAAAG-1,0,74,74,10350,6573 ATTTATACTGGTAAAG-1,0,75,75,10469,6642 GCGTCGTAACATGGTC-1,0,74,76,10350,6711 CGGTATGGGCACTCTG-1,0,75,77,10469,6780 CTATCACAACGCTGGA-1,0,74,78,10350,6849 ACCACACGGTTGATGG-1,0,75,79,10469,6918 TCAGCGCACGCCGTTT-1,0,74,80,10350,6986 AATGTTAAGACCCTGA-1,0,75,81,10469,7055 CTTACATAGATTTCTT-1,0,74,82,10350,7124 AACATAGCGTGTATCG-1,0,75,83,10469,7193 AGCAGTCGAAGCATGC-1,0,74,84,10350,7262 GTACTACGGCCTCGTT-1,0,75,85,10469,7331 TTGGCCAAATTGTATC-1,0,74,86,10350,7399 TCAGAGGACGCGTTAG-1,0,75,87,10469,7468 AGTAATCTAAGGGTGG-1,0,74,88,10350,7537 AATTATACCCAGCAAG-1,0,75,89,10469,7606 CCCTACCCACACCCAG-1,0,74,90,10350,7675 CTCTGTCCATGCACCA-1,0,75,91,10469,7744 TCGCCTCCTTCGGCTC-1,0,74,92,10350,7812 CCTGATTCGCGAAGAA-1,0,75,93,10469,7881 GACTTCAACGCATCAA-1,0,74,94,10350,7950 GCTTCCCGTAAGCTCC-1,0,75,95,10469,8019 AGAACTGTACTTTGTA-1,0,74,96,10350,8088 CCTTAAGTACGCAATT-1,0,75,97,10469,8157 GGCCAATTGTATAGAC-1,1,74,98,10350,8225 AGAATACAGGCTATCC-1,0,75,99,10469,8294 AATACCTGATGTGAAC-1,1,74,100,10350,8363 TAGAGTGTTCCGGGTA-1,0,75,101,10469,8432 GCTTCCATGTAACCGC-1,1,74,102,10350,8501 GGTTCGCATTTGCCGT-1,0,75,103,10469,8569 TCAATCCGGGAAGTTT-1,1,74,104,10350,8638 CCGGAAGTGCAATATG-1,0,75,105,10469,8707 CTCATAAATGTGTATA-1,1,74,106,10350,8776 GACGGGCATCGAATTT-1,0,75,107,10469,8845 GCTAAGCCCAGTATGC-1,1,74,108,10350,8914 GCTATAAGGGCCAGGA-1,0,75,109,10469,8982 GCGGATTACTTGTTCT-1,1,74,110,10350,9051 TACAACAGCGCATACA-1,1,75,111,10469,9120 TCTAACCTAGCCTGCG-1,1,74,112,10350,9189 TCTACCCGCATCATTT-1,1,75,113,10469,9258 GTCTTACCACGCCAAG-1,1,74,114,10350,9327 AATAACGTCGCGCCCA-1,0,75,115,10469,9395 CGTTTCGGTTATATGC-1,0,74,116,10350,9464 TACGCTGCACGGTCGT-1,0,75,117,10469,9533 CGTTAAATACGACCAG-1,0,74,118,10350,9602 TCGACTGACGATGGCT-1,0,75,119,10469,9671 ACGCTACTGAATGGGC-1,0,74,120,10350,9740 AAGGGTTAGCCATGCG-1,0,75,121,10469,9808 ACGTTTCGGTGCACTT-1,0,74,122,10350,9877 TTAACCCGAGGCGTGT-1,0,75,123,10469,9946 GCCCGTCAAGCCCAAT-1,0,74,124,10350,10015 ATTCGTCCCGAGGTTA-1,0,75,125,10469,10084 TCAAATTATGTTCGAC-1,0,74,126,10350,10153 AACGTTCTACCATTGT-1,0,75,127,10469,10221 CTGTCCTGCGCACTAC-1,0,76,0,10589,1480 GCCCAGCGACACAAAG-1,0,77,1,10709,1549 TATAGCTATTATCTCT-1,0,76,2,10589,1618 AAGCTATGGATTGACC-1,0,77,3,10709,1687 CCGAAACACGACCTCT-1,0,76,4,10589,1755 ATCAGAAGCTGGTTGC-1,0,77,5,10709,1824 TGAACCTGAATGTGAG-1,0,76,6,10589,1893 TCAGAGCATGTCAACG-1,0,77,7,10709,1962 ATACCCTCCCGGCCAA-1,0,76,8,10589,2031 GCCACCTTATTCGCGA-1,0,77,9,10709,2100 CAACGAGCTTATTATG-1,0,76,10,10589,2168 GATCCAACCTTTAAAC-1,0,77,11,10709,2237 TTGTGGAGACAGCCGG-1,0,76,12,10589,2306 AGATAATCACACCTAT-1,0,77,13,10709,2375 GGTTAGGGATGCTAAT-1,0,76,14,10589,2444 TCATGAAGCGCTGCAT-1,0,77,15,10709,2513 CCAGGCGAGATGGTCT-1,0,76,16,10589,2581 CGACTTGCCGGGAAAT-1,0,77,17,10709,2650 GTGCCAAACGTTTCGA-1,0,76,18,10589,2719 TGCTCAAAGGATGCAC-1,0,77,19,10709,2788 GCCTCAGGTACCGGTC-1,0,76,20,10589,2857 ACAAGTAATTGTAAGG-1,0,77,21,10709,2926 TTAGAGTATTGTCGAG-1,0,76,22,10589,2994 GTCATCCCAAACTCAC-1,0,77,23,10709,3063 CTCCTAGTAATCGTGA-1,0,76,24,10589,3132 CCCTCATCACAGAGTA-1,0,77,25,10709,3201 GGAAACAGAGCTTGGG-1,0,76,26,10589,3270 ACATCGCAATATTCGG-1,0,77,27,10709,3338 TTAGCCATAGGGCTCG-1,0,76,28,10589,3407 CGGATTCTGCCTTATG-1,0,77,29,10709,3476 TTGTTGGCAATGACTG-1,0,76,30,10589,3545 GGATCTACCGTTCGTC-1,0,77,31,10709,3614 GGTGGGATTAGGTCCC-1,0,76,32,10589,3683 AATAGGCACGACCCTT-1,0,77,33,10709,3751 GAGGTCCGTTCGCTGT-1,0,76,34,10589,3820 TGACAACTTAAAGGTG-1,0,77,35,10709,3889 AGCTAAGCTCCGTCCG-1,0,76,36,10589,3958 CTAGCCCGGGAGACGA-1,0,77,37,10709,4027 CCCAGATTCCCGTGAC-1,0,76,38,10589,4096 GCCCGTTCACACAATT-1,0,77,39,10709,4164 ACAAACTCCATCAGAG-1,0,76,40,10589,4233 GGTTCCGTACGACTAA-1,0,77,41,10709,4302 TTGCGGAAAGCTGCCC-1,0,76,42,10589,4371 GGAACTCGTGAATACG-1,0,77,43,10709,4440 GGTTACCGCTCCCTAC-1,0,76,44,10589,4509 AGCGACTTTGAAGACA-1,0,77,45,10709,4577 CCGTTTCCTTTCCGTG-1,0,76,46,10589,4646 TGGATGGCATCTTGGA-1,0,77,47,10709,4715 CAAGTCGTTGAAATCT-1,0,76,48,10589,4784 TGCAAACGTACTAGTT-1,0,77,49,10709,4853 GGCTGTCCTACTGCGG-1,0,76,50,10589,4922 TACTGCATGATTAAAT-1,0,77,51,10709,4990 CGGACCTCTGTAGTTA-1,0,76,52,10589,5059 CCCTAGCTCTAAGGTC-1,0,77,53,10709,5128 GTAACAGGTTAACGGC-1,0,76,54,10589,5197 CCCGCAAATAATCATC-1,0,77,55,10709,5266 AATCCCGCTCAGAGCC-1,0,76,56,10589,5335 AACGTCATCCGGCTTG-1,0,77,57,10709,5403 CTCGTGGCACTGAAAG-1,0,76,58,10589,5472 CTTTATCCGACGCATG-1,0,77,59,10709,5541 AAATGACTGATCAAAC-1,0,76,60,10589,5610 TTCGTGCATGTTATAG-1,0,77,61,10709,5679 ATCAAAGAGCCGTGGT-1,0,76,62,10589,5748 ATGTCATAATAAACGA-1,0,77,63,10709,5816 CTTAATCGACTTAGTA-1,0,76,64,10589,5885 CTAAAGGATGAGATAC-1,0,77,65,10709,5954 GTGCTATCCAGCTGGA-1,0,76,66,10589,6023 GACAGAGGTCTTCAGT-1,0,77,67,10709,6092 TCGATTTACGAAACGA-1,0,76,68,10589,6160 AGGCTTAAGTTGCACA-1,0,77,69,10709,6229 TAGGATCTTAACCGCA-1,0,76,70,10589,6298 GACTTTCGAGCGGTTC-1,0,77,71,10709,6367 CCCTGGGAGGGATCCT-1,0,76,72,10589,6436 TAGTAGTTGCCGGACA-1,0,77,73,10709,6505 GCCCTAAGTGCAGGAT-1,0,76,74,10589,6573 ACTTGGGCTTTCGCCA-1,0,77,75,10709,6642 CATGATACGGTGAAAC-1,0,76,76,10589,6711 TCCTGCAGCCGCCAAT-1,0,77,77,10709,6780 GTCCGTTAGAGGGCCT-1,0,76,78,10589,6849 GCTTTATTAAGTTACC-1,0,77,79,10709,6918 AATCGAGGTCTCAAGG-1,0,76,80,10589,6986 GTGCTGTTAGAACATA-1,0,77,81,10709,7055 GGCTTCTCGTGGGTGG-1,0,76,82,10589,7124 CCTACAGTTGAGGGAG-1,0,77,83,10709,7193 TATCCCTCGATCTGCA-1,0,76,84,10589,7262 CCGGTATCTGGCGACT-1,0,77,85,10709,7331 CTCTAACACCGGCAGC-1,0,76,86,10589,7399 CTTCATCACCAGGGCT-1,0,77,87,10709,7468 GGCTGGCAATCCCACG-1,0,76,88,10589,7537 CAAACCATAAGCGTAT-1,0,77,89,10709,7606 CATGTGGGCTCATCAC-1,0,76,90,10589,7675 CCCGTGACAGTGCCTT-1,0,77,91,10709,7744 GATTATCTTGCATTAT-1,0,76,92,10589,7812 GAGTCCACCAGGTTTA-1,0,77,93,10709,7881 TGTACTATCGCTCGTT-1,0,76,94,10589,7950 TTAGCGAATAGATAGG-1,0,77,95,10709,8019 ACATACAATCAAGCGG-1,0,76,96,10589,8088 ATTCGTGTACCCATTC-1,0,77,97,10709,8157 GCTAGCAACGCACCTA-1,0,76,98,10589,8225 ACCTCAGCGAGGCGCA-1,0,77,99,10709,8294 TCCGGGCCACTAACGG-1,0,76,100,10589,8363 TCCCAATATCGACGAC-1,0,77,101,10709,8432 GGATTGAAGTAGCCTC-1,0,76,102,10589,8501 GGCGCACAGTTTACCT-1,0,77,103,10709,8570 CCCGGCACGTGTCAGG-1,0,76,104,10589,8638 AGTAAGGGACAGAATC-1,0,77,105,10709,8707 TTGCGCACAACCACGT-1,0,76,106,10589,8776 CCTGCTACAACCATAC-1,0,77,107,10709,8845 CTGGGCTACTGGAGAG-1,0,76,108,10589,8914 AGCTACGAATGGTGGT-1,0,77,109,10709,8982 ATTCGTTTATCGTATT-1,0,76,110,10589,9051 GGCATTCCCTCCCTCG-1,0,77,111,10709,9120 AGTTATTCAGACTGTG-1,0,76,112,10589,9189 CCACTTTCCTTCTAGG-1,0,77,113,10709,9258 CGCAGTTCTATCTTTC-1,0,76,114,10589,9327 AGGAGCGTTTATTATC-1,0,77,115,10709,9395 GACAGGTAATCCGTGT-1,0,76,116,10589,9464 TTCCCAAAGTACTGAT-1,0,77,117,10709,9533 CTGCAGGGTGACGCTC-1,0,76,118,10589,9602 TCATGGAGGCCTTTGT-1,0,77,119,10709,9671 ATGGCCCGAAAGGTTA-1,0,76,120,10589,9740 CGTAATATGGCCCTTG-1,0,77,121,10709,9808 AGAGTCTTAATGAAAG-1,0,76,122,10589,9877 GAACGTTTGTATCCAC-1,0,77,123,10709,9946 ATTGAATTCCCTGTAG-1,0,76,124,10589,10015 TACCTCACCAATTGTA-1,0,77,125,10709,10084 AGTCGAATTAGCGTAA-1,0,76,126,10589,10153 TTGAAGTGCATCTACA-1,0,77,127,10709,10221 Seurat/tests/testdata/visium/filtered_feature_bc_matrix.h50000644000176200001440000070561315063070153023617 0ustar liggesusers‰HDF  ÿÿÿÿÿÿÿÿ‹‹ÿÿÿÿÿÿÿÿ`ˆ¨ˆ¨TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàHEAPXÈmatrixHHhTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ80HEAPXHˆbarcodesdataindicesindptrshapefeaturesSNOD Hh‡ ÿÿÿÿÿÿÿÿ deflate€ %z‚]PSNOD(°8°6Ø6ø8 ð(0$0p-TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPæwj6ë † GCOLATAACGCCGGAGGGTC-1ATAACGGAGTCCAACG-1ATAACGTTACCTCCAC-1ATAAGGTGGAGAACAT-1ATAAGTAGGATTCAGA-1ATAAGTAGGGCGACTC-1ATAAGTTACCGCGACG-1ATAATAGCTGTTGAAT-1 ATAATCTTGGAGAACC-1 ATAATTAGCTAAGTAG-1 ATACAGGCCCTCCAAT-1 ATACCACGGGCAACTT-1 ATACCGTCATCCATAA-1ATACCTAACCAAGAAA-1ATACGCCGGCGAAACC-1ATACGGAACGTCGTTT-1ATACGGGTTTCGATTG-1ATACGTACTTAGCCAC-1ATACGTCCACTCCTGT-1ATACGTTATGCACGGA-1ATACTACCCGTACCAC-1ATACTAGCATGACCCT-1ATACTGCCTTACACCG-1ATAGACAACGGGACCT-1ATAGACGAAGAGAAAG-1ATAGAGTACTGGGACA-1ATAGAGTTATCAACTT-1ATAGCAACTAGGGAAG-1ATAGCCATAACAGTCA-1ATAGGCGGCTATAGAA-1ATAGGCTAGCTTCGCA-1 ATAGGGATATCCTTGA-1!ATAGGTTGGGCAGATG-1"ATAGTGAAGCGTTCTC-1#ATAGTTCCACCCACTC-1$ATATAAAGCGCTCGTG-1%ATATAAATGTAGCTGC-1&ATATAACACGGGCGCA-1'ATATACATGTATGGTA-1(ATATACGCTCGTGACG-1)ATATAGAGTATTGGTC-1*ATATCAACCTACAGAG-1+ATATCAATTCCAGCCT-1,ATATCGGTAGGGAGAT-1-ATATCGTTCCTCGAAC-1.ATATCTCCCTCGTTAA-1/ATATCTTAGGGCCTTC-10ATATGTCTCCCTAGCC-11ATATTCAGTTAAACCT-12ATATTCCACATAGTGA-13ATATTTAACCCTCAAG-14ATCAAACACTGTTCCA-15ATCAAACGAAGGTTTG-16ATCAATCTGGGCTGCA-17ATCAATGCCGTGGCTG-18ATCACATTAGAATATC-19ATCACGTGCTAATTAA-1:ATCACTTCATCCTCGC-1;ATCAGACGGCACGCCG-1<ATCAGCCTCATGCTGC-1=ATCAGCTCGTCCACTA-1>ATCAGTAGGCAGGGAT-1?ATCATAGCCCTATGTA-1@ATCATCCAATATTTGT-1AATCATTGTACCGCATT-1BATCCAACGCAGTCATA-1CATCCAATGGAGGGTCC-1DATCCACATCGACAGAA-1EATCCAGAGCAACAACC-1FATCCAGGATTCGTGAA-1GATCCCATCCACAGCGC-1HATCCTACCTAAGCTCT-1IATCCTGAATCGCTGCG-1JATCCTGCGTGGAATGG-1KATCGACCCAATACAGA-1LATCGACTCTTTCCGTT-1MATCGCACGCCGGGAGA-1NATCGCCAGTCAACATT-1OATCGCTGCGTGCAGCA-1PATCGGAGACAGACGGC-1QATCGGCAAGCAGTCCA-1RATCGTTAGCTAGCGGA-1SATCTAATATCCTACGG-1TATCTACCATCTGCTCC-1UATCTAGCTTGTGAGGG-1VATCTCCCACGGAATAT-1WATCTCCCTGCAATCTA-1XATCTGCACCTCTGCGA-1YATCTGCTGTTATCGCC-1ZATCTGGGCTGTTCTTG-1[ATCTGGTTAAGACTGT-1\ATCTTATCGCACACCC-1]ATCTTGACCTGCAACG-1^ATCTTGACTTGTCCAA-1_ATGAAGCCAAGGAGCC-1`ATGACGCGTTCTATCC-1aATGACTATGCGACATT-1bATGAGGAGTGTTAATC-1cATGATGCAATGGTACA-1dATGCACGCGCTGTTCA-1eATGCACTACCGCATTG-1fATGCATGATCCAGGAT-1gATGCCAATCGCTCTGC-1hATGCCATTTGCGACCA-1iATGCCGGTCTTGCATA-1jATGCCGGTTGATGGGA-1kATGCGACAATTGGTCC-1lATGCGACAGTCCCATT-1mATGCGAGTCCCACCAC-1nATGCTCTGGCGCGGTA-1oATGCTTAGGAGTTGAT-1pATGGAAATTTAAGGAG-1qATGGAGCAGGCCGTGA-1rATGGATCCGGCGTCCG-1sATGGATTGACCAAACG-1tATGGCAGCATTACGAT-1uATGGGCCTCGGCCTCT-1vATGGTCGCGTGGTTTC-1wATGTAAGGCTGCTCTT-1xATGTACATGCGGTGAG-1yATGTACGATGACGTCG-1zATGTAGCGCGCGTAGG-1{ATGTGAAAGCCTAATG-1|ATGTGCATCCGACGCA-1}ATGTGGACATCTTGAT-1~ATGTTGATTAGAGACT-1ATTAAACATGCGGACC-1€ATTAATACTACGCGGG-1ATTAATGAACCAGTCG-1‚ATTACATGTCAGTCTT-1ƒATTACGCGCTGGCAGG-1„ATTACTTACTGGGCAT-1…ATTAGATTCCTCAGCA-1†ATTAGGCGATGCTTTC-1‡ATTATACTTTGCTCGT-1ˆATTATAGCTACTTTAC-1‰ATTATGCCATAGGGAG-1ŠATTATTATGTCCGTCA-1‹ATTATTCAGAGTCACT-1ŒATTCAACCATTTAAGG-1ATTCACTGATGTTGGA-1ŽATTCAGGACCTATTTC-1ATTCATATACTGTCCA-1ATTCATCGTTGAGGCA-1‘ATTCCCGAAGGTACAG-1’ATTCCTAAGACGTGGA-1“ATTCGACGCCGGGCCT-1”ATTCGCGCCTTGAGAG-1•ATTCGTGCTATCTCTT-1–ATTGAAGATCTTAGTG-1—ATTGACCGGCGATGAC-1˜ATTGATCACCACATTT-1™ATTGATGAGTCCTAAC-1šATTGCCTTTATGTTTG-1›ATTGCGATCAGTAACT-1œATTGCTGCTCCTCCAT-1ATTGGATTACAGCGTA-1žATTGGTTGTGCATTAC-1ŸATTGTACAACTCGGCT-1 ATTGTCGCAATACCTT-1¡ATTGTGACTTCGCTGC-1¢ATTTACAGTTTACTGG-1£ATTTACTAAGTCCATT-1¤ATTTCCGGGTTCTGCG-1¥ATTTGCGCGAGTAGCT-1¦ATTTGGAGATTGCGGT-1§ATTTGTCTTGGGAGCT-1¨ATTTGTTCCAGGGCTC-1©CAAACCCTCCGGCGGG-1ªCAAACGAGTATCGCAG-1«CAAACGGTCGCACTTT-1¬CAAACTCGCGACGCCG-1­CAAAGATTATTGGGCC-1®CAAATCTCTCACAAGG-1¯CAAATGTCCTTCCGTG-1°CAACCTACCGAGCAGT-1±CAACGACCCGTTTACA-1²CAACGTGGTGGAGTCT-1³CAACTATATCGAATGC-1´CAACTGCTCATCCGAT-1µCAAGAGGGCGGAGTAC-1¶CAAGATATTATAACGT-1·CAAGCAACGTCGGAGT-1¸CAAGCACCAAATGCCT-1¹CAAGCGGCACATAATT-1ºCAAGGATCGCATGTTC-1»CAAGGCCAGTGGTGCA-1¼CAAGGTCCTATAGGCT-1½CAAGTGTGGTTGCAAA-1¾CAATAAACCTTGGCCC-1¿CAATACGCTCTGAGGC-1ÀCAATATTCTTGACCTA-1ÁCAATCCCTATACCAGC-1ÂCAATGCGAGAAGTATC-1ÃCAATGGATCTCTACCA-1ÄCAATGTGCCAACCCTT-1ÅCAATTAAGGGTGATGA-1ÆCAATTGGGCCGCACTC-1ÇCAATTTCGTATAAGGG-1ÈCACAAGAAAGATATTA-1ÉCACAATGAGCTGCTAT-1ÊCACACACGCTAACGAG-1ËCACACGCGCTGTCTTA-1ÌCACAGCACCCACGGCA-1ÍCACAGCTAGGGAGTGA-1ÎCACAGGGCCATATAGT-1ÏCACAGGGCCGTTGTCA-1ÐCACAGTCCCGCTTCGC-1ÑCACAGTTCGCTTCCCA-1ÒCACATATTAGCAGGAT-1ÓCACATCTCACCGACGA-1ÔCACATGATTCAGCAAC-1ÕCACATTCTTTCGATGG-1ÖCACATTTCTTGTCAGA-1×CACCAATCATCCGTCT-1ØCACCACGCCACACAGA-1ÙCACCAGTCAGCATGCA-1ÚCACCATGATCGCAAAG-1ÛCACCCAAATCTTATGT-1ÜCACCCACGAGGCAATT-1ÝCACCCGGTTTGTGACT-1ÞCACCCTAACAAGATCT-1ßCACCCTTGGTGAGACC-1àCACCGCCAGAAGGTTT-1áCACCGCGTCCACTCTA-1âCACCGGGCATCACAAG-1ãCACCGTATCCCATCCG-1äCACCGTTAGGGATCAC-1åCACCGTTGCGCGATAT-1æCACCTAATCAGTTTAC-1çCACCTCGATGGTGGAC-1èCACCTTGCGAAACTCG-1éCACCTTGGCGCCTTTG-1êCACGAAAGTTAGTCCC-1ëCACGCACAGCGCAGCT-1ìCACGCAGCGAGGCTTT-1íCACGCGGAACTGTTGC-1îCACGGCGCGCCAAAGG-1ïCACGTCGGCAACCTCT-1ðCACGTTCGTGCTCTAG-1ñCACGTTTCGTACACAC-1òCACTAAAGTTGCCTAT-1óCACTACGGGAGCTGCC-1ôCACTCAAGAGCTATGG-1õCACTCCTATGTAAGAT-1öCACTCCTCTCGGTCGG-1÷CACTCGAGCTGAACAA-1øCACTCTTCTGCTAGCC-1ùCACTGACGATTGTGGA-1úCACTTAATCAGACGGA-1ûCAGAACTTAGCCCTCT-1üCAGAATAACACACGGA-1ýCAGACACCGATCGCTG-1þCAGACCTGTAAGTGTT-1ÿCAGACGAACCTGATAC-1CAGAGACGGTCACCCA-1CAGAGCATGAGCTTGC-1CAGAGGCGATGCATGA-1CAGATAATGGGCGGGT-1CAGATACTAACATAGT-1CAGATCATTTAAAGTC-1CAGATCCTGGTTTGAA-1CAGATGTTTGTCCCAA-1CAGCAGCCCGTTCCTT-1 CAGCAGTCCAGACTAT-1 CAGCAGTCTGTGCTGC-1 CAGCCTCCTGCAGAGG-1 CAGCCTCTCCTCAAGA-1 CAGCGATTCCCTTCAA-1CAGCTCACTGAGACAT-1CAGCTCGACAAGTTAA-1CAGCTGGCGTAACCGT-1CAGCTTAGTAGGTAGC-1CAGGATATATCGTTGT-1CAGGCAGTCTTACCAG-1CAGGCCGTTTGGGTGT-1CAGGCGCACGGTGGTC-1CAGGCGCCATGCTAGG-1CAGTAACTATTTATTG-1CAGTAAGGGACGTCTC-1CAGTACATTCTCTAAA-1CAGTACCAGTTTACGT-1CAGTAGCCCACGCGGT-1CAGTCGAGGATGCAAT-1CAGTCGGCCTAGATAT-1CAGTCTGTATACTGGG-1CAGTGAATAAATGACT-1 CAGTGTCGGCTGGCCC-1!CAGTTCAAATTGACAC-1"CATAACGGACAGTCGT-1#CATAAGAAGCTTGGCT-1$CATAAGCTCTCCGTCT-1%CATACACAAAGTCAGC-1&CATACACGGTTCCCAC-1'CATACCCGTACCCAGT-1(CATACGGCGTCTGGGC-1)CATACTATGTAATTGT-1*CATACTTAGGCAATAC-1+CATAGAGGAGATACTA-1,CATAGCGTTGCCCACC-1-CATAGTACATTGAGAG-1.CATAGTCAAATACATA-1/CATAGTCCACAAGAAC-10CATATACTACTGATAA-11CATATAGGTACAGTCA-12CATATGTCAGGCTACG-13CATCATTACCCTGAGG-14CATCCTCTCAAAGATC-15CATCGGACGGGTTAAT-16CATCTATCCCGTGTCT-17CATCTTACACCACCTC-18CATGACTTCGCTGAAT-19CATGAGATGCACTCTC-1:CATGATGCACAATTCT-1;CATGATGGAAGTTAGC-1<CATGCCAACTCGCAAA-1=CATGCGACCAGTTTAA-1>CATGGATTGTCTTCCG-1?CATGGGTATGCCTTAT-1@CATGGGTCGGGTGTGG-1ACATGGTAAGTAGCGTT-1BCATGGTATTAGTTTGT-1CCATGGTCTAGATACCG-1DCATGGTTTATTAATCA-1ECATGTAAGAGACATTT-1FCATGTAGGAGCGCCAA-1GCATGTCTCATTTATGG-1HCATTACGCAGGAAGGG-1ICATTACGTCGGCCCGT-1JCATTATGCTTGTTGTG-1KCATTGCGGGTCAATTC-1LCATTTAGCGGACCATG-1MCATTTGAGTGGTACGT-1NCCAAACAGAACCCTCG-1OCCAAATAACAAGATTC-1PCCAACGATGCACTGAT-1QCCAAGAAAGTGGGCGA-1RCCAAGACTTCTGCGAA-1SCCAAGCGTAACTCGTA-1TCCAAGGTTGCCCTTTC-1UCCAATAGTGCCGTCGA-1VCCAATCGGTAGATCGA-1WCCAATGTCACAGCAAG-1XCCAATTACGGGTCGAG-1YCCACAATGTACGTCTT-1ZCCACACTGAGATATTA-1[CCACAGTACCCATCCT-1\CCACATGGCTCTTTAT-1]CCACCAACTTTACTGT-1^CCACCCAAGGAAAGTG-1_CCACGAATTTAACCTC-1`CCACGAGAAGAGAATC-1aCCACGGAGCCATAAGA-1bCCACGGTGCCCGGTAG-1cCCACTCAGATCCGCAA-1dCCACTGGTGGCTGGTT-1eCCACTGTTTGGATTAA-1fCCAGAAAGCAACTCAT-1gCCAGATAGTTGAGTGA-1hCCAGCCTGGACCAATA-1iCCAGCTCGAACGCATT-1jCCAGCTGATGGTACTT-1kCCAGGGACGTGGCCTC-1lCCAGTAGTCTGATCCA-1mCCAGTCAAATCTCTTA-1nCCAGTCTAGACGGCGC-1oCCAGTCTTGTCATAGA-1pCCAGTTCGGTAACTCA-1qCCATAACCTGTGCAGT-1rCCATACCTTTACTTGT-1sCCATAGAGGCTGCCAG-1tCCATAGGTTGGCGTGG-1uCCATATGGAAACTATA-1vCCATCGCAGTTAAACT-1wCCATCTCACCAGTGAA-1xCCATGCCCTAGATTTC-1yCCATGCCTGTTTAGTA-1zCCATTAGCGATAATCC-1{CCATTCCCTGCCCACA-1|CCATTTCTACCTATTA-1}CCCAAACATGCTGCTC-1~CCCAACATACGTCGCG-1CCCAAGTCATTACACT-1€CCCAATTTCACAACTT-1CCCACTCCACGGTATC-1‚CCCAGAGGAGGGCGTA-1ƒCCCAGGTCTGAAGGCT-1„CCCAGTAAACTTGGGA-1…CCCAGTTAAGGCGCCG-1†CCCGAAGTTTCGCGAA-1‡CCCGACCATAGTCCGC-1ˆCCCGAGTTTCTCCGTA-1‰CCCGCAGCGCGAACTA-1ŠCCCGGGTCGTTCAGGG-1‹CCCGGTGTATCGGAAT-1ŒCCCGTAAGTCTAGGCC-1CCCGTAGCTGGGAAGA-1ŽCCCGTCAGCGTCTGAC-1CCCGTGAGGGCGGTGA-1CCCGTTTCGCAGATGT-1‘CCCTACTTGAACAATG-1’CCCTAGGCAACAAGAG-1“CCCTATGTAGAGCAGA-1”CCCTCCTCGCTCGTAT-1•CCCTGAAATGAGTTGA-1–CCCTGCCCAATCCGCT-1—CCCTGCGCTACGCATA-1˜CCCTGGCTGTTCCTTC-1™CCCTTTAATGGAGTTC-1šCCCTTTGACAGGTCTT-1›CCGAACACTGGGCCTC-1œCCGAACCTTCCCGGCC-1CCGAAGCATTGACCAA-1žCCGACAATAGGCCGCC-1ŸCCGACGGGCATGAGGT-1 CCGACGTAAACACAAC-1¡CCGAGAAGTCGCATAA-1¢CCGAGCTGTGCTTGTC-1£CCGATCTCAACCTTAT-1¤CCGATTCGAGGGACCC-1¥CCGCACAAAGACCAAC-1¦CCGCACTTGCAATGAC-1§CCGCATGTGGTACGAT-1¨CCGCCGGAACTTCTCG-1©CCGCCTGCGAATTGGT-1ªCCGCCTTGCGATGTCG-1«CCGCGATTTGGTAGGT-1¬CCGCGCAAGATACCCA-1­CCGCGGAATGCGTCAC-1®CCGCGGGTACGAAGAA-1¯CCGCTATCAGCACCAG-1°CCGCTCCAGGGCGATC-1±CCGCTCTTCCGAACTA-1²CCGCTTACCTCACTCT-1³CCGCTTGCTGACATGG-1´CCGGAGCGTACTTTCT-1µCCGGCACGACCGTTTC-1¶CCGGCCGCGAGCATAT-1·CCGGCGTGAGACTCTG-1¸CCGGGCGGTCTCGTCA-1¹CCGGGCTGCTCCATAC-1ºCCGGGTTCGAGGTTAC-1»CCGGTAATGGCTAGTC-1¼CCGGTTTGTAATTGTG-1½CCGTAAGTTGGTCCCA-1¾CCGTAGGAAATCCCTG-1¿CCGTAGGGTTGTTTAC-1ÀCCGTATCTCGTCGTAG-1ÁCCGTATTAGCGCAGTT-1ÂCCGTGGAACGATCCAA-1ÃCCGTGTTAAATTCCAT-1ÄCCGTTACGTTAGAACA-1ÅCCGTTCCGAATCTCGG-1ÆCCTAAAGGCTGACGCT-1ÇCCTAAATTAACGGTTC-1ÈCCTAAATTGTATCCTA-1ÉCCTAACCCAAACAAGT-1ÊCCTAACTAAGGCTCTA-1ËCCTACATTCACAGACG-1ÌCCTACTGCTTACACTT-1ÍCCTAGGCGTAGCGATC-1ÎCCTAGGTAAAGGTAGC-1ÏCCTATAATGAGTGCCC-1ÐCCTATACCGTCCTGTC-1ÑCCTATATCGTGTCACG-1ÒCCTATATTTGTCCTGG-1ÓCCTATCTATATCGGAA-1ÔCCTATGAAGTGGTGCC-1ÕCCTATGGCTCCTAGTG-1ÖCCTATGGGTTACCGTC-1×CCTATGGTCAAAGCTG-1ØCCTATGTCCACTCCAC-1ÙCCTCAACGATCGCTGT-1ÚCCTCACCTGAGGGAGC-1ÛCCTCACCTTAGCATCG-1ÜCCTCCGACAATTCAAG-1ÝCCTCCTGAGCCCACAT-1ÞCCTCCTGTTGTGTCGT-1ßCCTCGCCAGCAAATTA-1àCCTCGCGCGATATAGG-1áCCTCGCGCTGTGCGAT-1âCCTCGGACCGGGATAG-1ãCCTCTAATCTGCCAAG-1äCCTCTATCGATTAGCA-1åCCTCTCTCCCATCTAG-1æCCTCTGGCCTAGACGG-1çCCTCTGTACTATTCTA-1èCCTGAACGATATATTC-1éCCTGAATATTTACATA-1êCCTGACCACCGATGGT-1ëCCTGCTATTTGAGAAG-1ìCCTGGAAACGTTCTGC-1íCCTGGCTAGACCCGCC-1îCCTGGTCGAATGTGGG-1ïCCTGTAAGACATGATA-1ðCCTGTACTCACGCCCA-1ñCCTGTCACCCGGGCTC-1òCCTGTCCCTCACGTTA-1óCCTGTCGCCCGTAAAT-1ôCCTGTTTGAAGACACG-1õCCTTCAGTTAAAGTGA-1öCCTTCGTATAGAATCC-1÷CCTTCTCAGCGTTCCT-1øCCTTCTTGATCCAGTG-1ùCCTTGACCACTTTATT-1úCCTTTAAGGGAGCACT-1ûCCTTTCAATGAAGAAA-1üCCTTTGAATTATGGCT-1ýCGAAACGCAATTCATG-1þCGAACAGTATGGGCGT-1ÿCGAACCCGCATGCGTC-1CGAACGGCCGGACAAC-1ACGATCATACATAGAG-1ACGATCATCTTGTAAA-1ACGATGCATATGTTAT-1ACGCAAACTAATAGAT-1ACGCAATCACTACAGC-1ACGCATACGTTTACTA-1ACGCATTCGTGAGTAC-1ACGCCAGATGATTTCT-1 ACGCCAGTGCGTTTGC-1 ACGCCGCTAGACGACC-1 ACGCGAAGTCAGACGA-1 ACGCGCTACACAGGGT-1 ACGCGGGCCAAGGACA-1ACGCTAGTGATACACT-1ACGCTGTGAGGCGTAG-1ACGGAACACGAGTGCC-1ACGGACTCTCAAAGCG-1ACGGAGCGCAAATTAC-1ACGGATGGTGCGGATA-1ACGGCACTTGCTTGGG-1ACGGCCAACATGGACT-1ACGGCGACGATGGGAA-1ACGGCTGGATGTAGAA-1ACGGGAGTGTCGGCCC-1ACGGTACAGTTCAATG-1ACGTAGATTGCTGATG-1ACGTAGGAGAGTCGCT-1ACGTATTACTCCGATC-1ACGTCTCGTTCCGGGA-1ACGTGACAAAGTAAGT-1ACGTGCGCCTCGTGCA-1 ACGTTAATGTCGAAGA-1!ACGTTAGATTTGCCCG-1"ACGTTCGCAATCAATT-1#ACGTTCGTTCAGGAAA-1$ACGTTCTGTACAAGTC-1%ACTACATCCCGACAAG-1&ACTACCAGCTCTCTGG-1'ACTACGCGTTAGAATT-1(ACTAGTTGCGATCGTC-1)ACTATATGCTGTGTTC-1*ACTATCCAGGGCATGG-1+ACTATCTGCCCGCGTA-1,ACTATTTCCGGGCCCA-1-ACTCAAGTGCAAGGCT-1.ACTCAATAAAGGCACG-1/ACTCCCATTCCTAAAG-10ACTCCCGAATTCGTTT-11ACTCCCTAATGCTAAA-12ACTCCCTAGAATAGTA-13ACTCCGGCCGACCACT-14ACTCGCCGTTCGATAA-15ACTCGTAACCCGTCCT-16ACTCGTCAGTAATCCC-17ACTCTCTGACTTAGGT-18ACTCTGACCTAATAGA-19ACTCTTGTATAGTAAC-1:ACTGAAACGCCGTTAG-1;ACTGAATGGCGAAAGT-1<ACTGCCGTCGTAACTC-1=ACTGCTCGGAAGGATG-1>ACTGTACGATACACAT-1?ACTGTAGCACTTTGGA-1@ACTGTCCAGGATTATA-1AACTGTCTTCTTTAGAA-1BACTTACGCATCCACGC-1CACTTATACTTACCCGG-1DACTTATTAGGATCGGT-1EACTTATTTATGTGCCA-1FACTTCAGGCTGATCCC-1GACTTCCAGTGGAAGCT-1HACTTCCATGCGGGACA-1IACTTCGCCATACGCAC-1JACTTGACTCCCTCTTT-1KACTTGGGACCCGGTGG-1LACTTGTAGTCCCTTCA-1MACTTGTGGATGGAACG-1NACTTTACCCTCATGAA-1OACTTTCCTATAGCTTC-1PACTTTGACTGCATCCT-1QACTTTGGTCGTGCTCC-1RAGAACCCTCAATTGGG-1SAGAACGTGGTACATTC-1TAGAAGAGCGCCGTTCC-1UAGAAGGTACACTTCAC-1VAGAAGGTTGCCGAATT-1WAGAAGGTTGTAGGTCG-1XAGAAGTGATTCGTGAT-1YAGAATGCGGGTTCGGA-1ZAGAATTATGGATTCGA-1[AGACCAAACCACACCT-1\AGACCCACCGCTGATC-1]AGACCCGCCCTCCTCG-1^AGACCGCTCCGCGGTT-1_AGACCGGGAAACCCTG-1`AGACGAAGTGCCGGTC-1aAGACGACGATGCCGCT-1bAGACTAGCCTTCCAGA-1cAGAGAACCGTCTAGGA-1dAGAGAAGGAGTACAAT-1eAGAGATCTCTAAAGCG-1fAGAGCCGCCGAGATTT-1gAGAGGCTTCGGAAACC-1hAGAGTAAACTTCACTA-1iAGATAACTTCAGGGCC-1jAGATACCAATAGAACC-1kAGATACCGGTGTTCAC-1lAGATACTCAAGATCGA-1mAGATATAATACGACTA-1nAGATCGTGCATAAGAT-1oAGATCTCAGGTGTGAT-1pAGATGACTCGCCCACG-1qAGATGAGGGTTGCGAT-1rAGATGATGGAGTCTGG-1sAGATGCAAGACGTGCA-1tAGATGCATCCTGTGTC-1uAGATTATAGGACGTTT-1vAGATTCACAACCGATA-1wAGCAAAGGCCGCTAGT-1xAGCAACATATCTTATT-1yAGCAACCGAAAGTAAT-1zAGCACCAGTACTCACG-1{AGCACTACCTCACCAG-1|AGCACTTAAGGACGCC-1}AGCAGAAGGAGAAAGA-1~AGCAGCCAGATGAATA-1AGCATATCAATATGCT-1€AGCATCATTTCGAAAG-1AGCATCGTCGATAATT-1‚AGCATTACGAGGCAAG-1ƒAGCCAAGCTTTGTGTC-1„AGCCACAGGTTACCCG-1…AGCCACTCCCGTGCTT-1†AGCCCATACATGTAAG-1‡AGCCCGCACTACAATG-1ˆAGCCCGGTAGCCTGTA-1‰AGCCCTTCTAATCCGA-1ŠAGCCGTGGCTAAATGT-1‹AGCCTAATACCCACGT-1ŒAGCGACAGGAACGGTC-1AGCGACCAACGATATT-1ŽAGCGATGCGCCTAATA-1AGCGCATAATGAATCG-1AGCGCGGGTGCCAATG-1‘AGCGGACACTTCGTAG-1’AGCGGCGGTTAGCGGT-1“AGCGGGTCTGACACTC-1”AGCGTGGTATTCTACT-1•AGCTAAGTACGCAGGC-1–AGCTAGAAGCAGAAGT-1—AGCTATTTAATCCAAC-1˜AGCTCCATATATGTTC-1™AGCTCCTTCGCACATC-1šAGCTCTAGACGTTCCA-1›AGCTCTTCCCAGTGCA-1œAGCTCTTCGTAACCTT-1AGCTCTTTACTCAGTT-1žAGCTGAAGTAAACCAA-1ŸAGCTGTAACCTCAATC-1 AGCTTCTTCTCGAGCA-1¡AGCTTGATCTTAACTT-1¢AGGAAGCTGTCCGCCG-1£AGGACAGTCGAATCCC-1¤AGGACGACCCATTAGA-1¥AGGACGCTCGATGTTG-1¦AGGAGGCCTTCGCGCG-1§AGGATAAAGTCGGGAT-1¨AGGATATAGGGATTTA-1©AGGATATCCGACTGCA-1ªAGGATCACGCGATCTG-1«AGGCAGATGCGTAAAC-1¬AGGCAGGGAGCGTACT-1­AGGCATTGTCGTAGGG-1®AGGCCACCCGTTATGA-1¯AGGCCCTAGAACGCCA-1°AGGCCTGAGAATCTCG-1±AGGCGGTTTGTCCCGC-1²AGGCGTCTATGGACGG-1³AGGCTTCCCGAAGAAG-1´AGGGAAACGAGGTACT-1µAGGGACCGGCTGCGTT-1¶AGGGACTCTACGCGAC-1·AGGGAGACATACTTCG-1¸AGGGCGAGCAGCTGAT-1¹AGGGCTGCAGTTACAG-1ºAGGGTCAGTAACCCTA-1»AGGGTCGATGCGAACT-1¼AGGGTGCTCTCGAGGG-1½AGGGTTCCCTTTGGTT-1¾AGGGTTTAGTTCGGGA-1¿AGGTAGGTACAAAGCT-1ÀAGGTATAATTGATAGT-1ÁAGGTCAGGTGAGAGTG-1ÂAGGTCGCGGAGTTACT-1ÃAGGTGCACGTCCACAT-1ÄAGGTGGTGACCTTCGC-1ÅAGGTTACACCATGCCG-1ÆAGGTTGAGGCACGCTT-1ÇAGGTTTCACACACCTT-1ÈAGTAACTATAGCAGCC-1ÉAGTACAGAAGCTTATA-1ÊAGTACATCATTTATCA-1ËAGTACGGGCACCTGGC-1ÌAGTACTCTTATGCCCA-1ÍAGTAGGAAGGAAGTTG-1ÎAGTATGCTGGAGACCA-1ÏAGTATTTGGCACGACC-1ÐAGTCAACACCACCATC-1ÑAGTCAAGATGACACTT-1ÒAGTCACTAGCTCTCGA-1ÓAGTCCATTGGCTGATG-1ÔAGTCCCGCCTTTAATT-1ÕAGTCGACGGTCTCAAG-1ÖAGTCGGCCCAAACGAC-1×AGTCGGCTCAACTTTA-1ØAGTCGGTTGCGTGAGA-1ÙAGTCGTATAAAGCAGA-1ÚAGTCGTCGACCACCAA-1ÛAGTCGTGGGCATTACG-1ÜAGTCTAAAGTATACTC-1ÝAGTCTCACAAGACTAC-1ÞAGTCTTCTCCTCAAAT-1ßAGTCTTTAAAGTGTCC-1àAGTGAACAAACTTCTC-1áAGTGACCTACTTTACG-1âAGTGAGACTTCCAGTA-1ãAGTGAGCCTCGCCGCC-1äAGTGAGTCGAATTAAC-1åAGTGATAACCTGCGCG-1æAGTGATATGAGTAGTT-1çAGTGATTCAAGCAGGA-1èAGTGCACGCTTAAGAA-1éAGTGCGTAGCTCGTAA-1êAGTGCTAAACACAGCA-1ëAGTGCTTGCACGAATA-1ìAGTGGCCCGCAAATGG-1íAGTGGCGGCAATTTGA-1îAGTGGCGTCTGAAGGT-1ïAGTGGCTCCGTCGGCC-1ðAGTGGTGTTACCCGTG-1ñAGTGTATTGCGCATTG-1òAGTTAAACACTTGCGA-1óAGTTAAGCGGTCCCGG-1ôAGTTAAGTCAACCGCT-1õAGTTACTCTATCGTGG-1öAGTTCCTACAGAATTA-1÷AGTTCCTATTTATGTT-1øAGTTGACGGTCCTTGC-1ùAGTTGGCAAGGCTAGA-1úAGTTTGCACCTGCCTC-1ûAGTTTGGCACGGGTTG-1üAGTTTGGCCAGACCTA-1ýATAAACGGACCCGTAA-1þATAAACGTTGCACCAC-1ÿATAAAGGCTCGGTCGT-1ATAAATATTAGCAGCT-1AATAGAATCTGTTTCA-1AATAGCTACCGCGTGC-1AATAGTCCGTCCCGAC-1AATATCCTAGCAAACT-1AATATCGAATCAATGC-1AATATCGAGGGTTCTC-1AATATTGGAGTATTGA-1AATCATGTAAAGACTC-1 AATCGCCTCAGCGCCA-1 AATCGCGCAGAGGACT-1 AATCGGTATAGCCCTC-1 AATCGTGAGCCGAGCA-1 AATCTAGGTTTACTTG-1AATCTATGCCGGAGCC-1AATCTCTACTGTGGTT-1AATCTGCGTTGGGACG-1AATCTGGCTTTCTAGT-1AATGACAGCAATGTCT-1AATGACGTAGGATGTC-1AATGACTGTCAGCCGG-1AATGATGATACGCTAT-1AATGATGCGACTCCTG-1AATGCAACCGGGTACC-1AATGCACCAAGCAATG-1AATGTGCCCGAGGTGT-1AATGTTGTCGTGAGAC-1AATTAAAGGTCGGCGT-1AATTAACGGATTTCCA-1AATTACGAGACCCATC-1AATTAGCGCTGCAGCG-1AATTCATAAGGGATCT-1 AATTCATTGTCATGCA-1!AATTCCAAGCATGTAC-1"AATTCGATTCGAGGAT-1#AATTCTAGAGTTAGGC-1$AATTGAACGCTCTGGT-1%AATTGCAGCAATCGAC-1&AATTTGGGACATAGTA-1'ACAAACCATGCGTCCT-1(ACAAAGAAGGTAGGCC-1)ACAAAGCATGACCTAG-1*ACAAATCGCACCGAAT-1+ACAAATGGTAGTGTTT-1,ACAACAGCATGAGCTA-1-ACAAGCAGTGCCTAGC-1.ACAAGGAAATCCGCCC-1/ACAAGGACAAGAGGTT-10ACAAGGATGCTTTAGG-11ACAAGGGCAGGCTCTG-12ACAATAGTCGTACGTT-13ACAATCCATTTAAACC-14ACAATGAATACGGAGA-15ACAATTGTGTCTCTTT-16ACAATTTGAGCAGTGG-17ACACAAAGACGGGTGG-18ACACACCAGGACCAGT-19ACACATGATCAAATCT-1:ACACCCAGCATGCAGC-1;ACACCTTAAGTAGGGC-1<ACACCTTACTACTTGC-1=ACACGAGACTCCTTCT-1>ACACGGGAACTTAGGG-1?ACACGTAGGCCACAAG-1@ACACTGATCAAGGTGT-1AACAGAACTGAGAACAA-1BACAGCGACATTCTCAT-1CACAGGCACGGATCCTT-1DACAGGCTTGCCCGACT-1EACAGGTGGAGGTGAGG-1FACAGTAATACAACTTG-1GACATAAGTCGTGGTGA-1HACATAATAAGGCGGTG-1IACATCCCGGCCATACG-1JACATCCTGGTAACTGT-1KACATCGATCGTTTACC-1LACATCGGTCAGCCGCG-1MACATCGTATGCAATGG-1NACATGGCGCCAAAGTA-1OACATTAGTTTATATCC-1PACATTTGAAACCTAAC-1QACCAAACACCCAGCGA-1RACCAACACCACACACT-1SACCAACCGCACTCCAC-1TACCAACGCTTATTTAT-1UACCAAGTCATCGGCAG-1VACCAATATGCAAGTTA-1WACCACAAGTTTCTATC-1XACCACCAATGTAACAA-1YACCACGTGCAGCTATA-1ZACCAGACCATAACAAC-1[ACCAGTGCGGGAGACG-1\ACCATATCCGCAATAA-1]ACCATCCGCCAACTAG-1^ACCATCGTATATGGTA-1_ACCCAACGCCCGTGGC-1`ACCCATCTTGAGGGTA-1aACCCATTTGTCCCTCT-1bACCCGGAAACTCCCAG-1cACCCGGATGACGCATC-1dACCCGGTTACACTTCC-1eACCCGTGTCATCAGTA-1fACCCTATGCCATATCG-1gACCCTCCCGTCAGGGC-1hACCCTCCCTTGCTATT-1iACCCTGGTAACGCCCT-1jACCGAAGAGTCTGGTT-1kACCGACACATCTCCCA-1lACCGACTGAGTCCCAC-1mACCGAGTCTCCTTATT-1nACCGATGGTAGCATCG-1oACCGCAATAACTGCCT-1pACCGCGGTGGAAGTCG-1qACCGGGCCTTTGTTGA-1rACCGGTCAGGTACACC-1sACCGTCCACTGGGCCC-1tACCTAAGTACCTTTCA-1uACCTAATCGACTTCCT-1vACCTACAGTATGTGGT-1wACCTACTATAAATCTA-1xACCTCCGCCCTCGCTG-1yACCTCCGTTATTCACC-1zACCTGCGTGTCATGTT-1{ACGAAATGGGCGGCAC-1|ACGACTCTAGGGCCGA-1}ACGAGGATACCACTCT-1~ACGAGGTTTACAACGT-1ACGAGTACGGATGCCC-1€ACGATACATAGAACTA-1AACGCATGATCTGGGT-1‚AACGCGGTCTCCAGCC-1ƒAACGCTGTTGCTGAAA-1„AACGGACGTACGTATA-1…AACGGCCATCTCCGGT-1†AACGTACTGTGGGTAC-1‡AACGTCAGACTAGTGG-1ˆAACGTCGCTGCACTTC-1‰AACGTGCGAAAGTCTC-1ŠAACTACCCGTTTGTCA-1‹AACTAGGCTTGGGTGT-1ŒAACTCAAGTTAATTGC-1AACTCCAGAGCGTGTT-1ŽAACTCCTAATCCCATG-1AACTCTCAATAGAGCG-1AACTCTCAGTGTGCTC-1‘AACTGGGTCCCGACGT-1’AACTTGCCCGTATGCA-1“AAGACATACGTGGTTT-1”AAGACCAAATAACTCA-1•AAGACCCAACTGAACA-1–AAGACTGCAAGCTACT-1—AAGAGCTCTTTATCGG-1˜AAGAGGATGTACGCGA-1™AAGAGGCATGGATCGC-1šAAGAGGCCCTTTGGAA-1›AAGATGGCACCGGACC-1œAAGATTGGCGGAACGT-1AAGCACCCTGCGTATC-1žAAGCATACTCTCCTGA-1ŸAAGCCGAAGCGGTTTA-1 AAGCGCAGGGCTTTGA-1¡AAGCGTCCCTCATCGA-1¢AAGCTAGATCGAGTAA-1£AAGCTCGTGCCAAGTC-1¤AAGCTCTTTCATGGTG-1¥AAGGAGCGGTTGGTGC-1¦AAGGATCGATCGCTTG-1§AAGGATGAGGGACCTC-1¨AAGGCGCGTAAAGCTT-1©AAGGCTGTGCTCATCG-1ªAAGGGAACGACTGGCT-1«AAGGGACAGATTCTGT-1¬AAGGGACTATGCATTC-1­AAGGGTTTGATTTCAG-1®AAGGTATCCTAATATA-1¯AAGGTGATAAACCAGC-1°AAGTAGTGACGCGAGG-1±AAGTCAATTGTCGTCA-1²AAGTCTTCTGTGGCCT-1³AAGTGACGACCGAATT-1´AAGTGAGTCGGGTTTA-1µAAGTGCCTTGACTGTA-1¶AAGTGCGTTAGAATCT-1·AAGTGTTTGGAGACGG-1¸AAGTTCACTCCAAGCT-1¹AAGTTCAGTCTGCGTA-1ºAAGTTCGGCCAACAGG-1»AAGTTGTGATGTTATA-1¼AAGTTTATGGGCCCAA-1½AATAACAACGCTCGGC-1¾AATAACACTAGAACAA-1¿AATACCTGATGTGAAC-1ÀAATAGAACAGAGTGGC-1ÁAAATCGCGGAAGGAGT-1ÂAAATCGTGTACCACAA-1ÃAAATCTAGCCCTGCTA-1ÄAAATGATTCGATCAGC-1ÅAAATGGCCCGTGCCCT-1ÆAAATGGTCAATGTGCC-1ÇAAATTAACGGGTAGCT-1ÈAAATTACACGACTCTG-1ÉAAATTACCTATCGATG-1ÊAAATTCCAGGTCCAAA-1ËAAATTGATAGTCCTTT-1ÌAAATTTGCGGGTGTGG-1ÍAACAACTGGTAGTTGC-1ÎAACACACGCTCGCCGC-1ÏAACACGAGACGCGGCC-1ÐAACAGGATGGGCCGCG-1ÑAACAGGTAGTATGGAT-1ÒAACATATCAACTGGTG-1ÓAACATCGATACGTCTA-1ÔAACATTGTGACTCGAG-1ÕAACCAAGACTTCTCTG-1ÖAACCCATCCCATGATC-1×AACCCGAGCAGAATCG-1ØAACCCTACTGTCAATA-1ÙAACCGAGCTTGGTCAT-1ÚAACCGCTAAGGGATGC-1ÛAACCTCGCTTTAGCCC-1ÜAACCTTTAAATACGGT-1ÝAACCTTTACGACGTCT-1ÞAACGAAAGTCGTCCCA-1ßAACGATAATGCCGTAG-1àAACGATATGTCAACTG-1áAAACTGCTGGCTCCAA-1âAAACTTAATTGCACGC-1ãAAACTTGCAAACGTAT-1äAAAGAATGTGGACTAA-1åAAAGGCTACGGACCAT-1æAAAGGCTCTCGCGCCG-1çAAAGGGATGTAGCAAG-1èAAAGTAGCATTGCTCA-1éAAAGTGTGATTTATCT-1êAAAGTTGACTCCCGTA-1ëAAATAACCATACGGGA-1ìAAATAAGGTAGTGCCC-1íAAATACCTATAAGCAT-1îAAATAGCTTAGACTTT-1ïAAATAGGGTGCTATTG-1ðAAATCCGATACACGCC-1ñAAACCGTTCGTCCAGG-1òAAACCTAAGCAGCCGG-1óAAACGAAGATGGAGTA-1ôAAACGAGACGGTTGAT-1õAAACGGGCGTACGGGT-1öAAACGGTTGCGAACTG-1÷AAACTCGGTTCGCAAT-1øAAACTCGTGATATAAG-1ùAAACAGGGTCTATATT-1úAAACATGGTGAGAGGA-1ûAAACATTTCCCGGATT-1üAAACCGGGTAGGTACC-1ýAAACAGAGCGACTCCT-1þAAACAGCTTTCAGAAG-1ÿAAACACCAATAACTGC-1AAACAAGTATCTCCCA-1GCATTGTAATTCATAT-1GCATTTCCAAGGCTCC-1GCCAACCATTTCCGGA-1GCCAAGAATACTTCTG-1GCCAATAGGGCATCTC-1GCCACAATTTAAGGAC-1GCCACTCAGAGCGCGA-1GCCAGGAGTAACCGAT-1 GCCATATTGCACACAG-1 GCCATCGAGCTGCGTG-1 GCCATCGATGCTGCAT-1 GCCATTAGCCTCAAAC-1 GCCCGACTTCTTCCCG-1GCCCGAGAGTCTAAAT-1GCCCGATCTGTGGTCG-1GCCCGCGCGTAAACGG-1GCCCGTAATACCTTCT-1GCCCTAGCCGTCGCGA-1GCCCTGAGGATGGGCT-1GCCGAAATTCCTACGT-1GCCGATTGGCCAAGCT-1GCCGCTTGTGAGAAAC-1GCCGGGTTAGGGTCGC-1GCCGTGGAAGAAATGT-1GCCTACGTTCTGTGCA-1GCCTATAGTGTCAGGG-1GCCTCATCTGGAAATA-1GCCTCCGACAATTCAC-1GCCTCTATACATAGCA-1GCCTTTGTCAGTGGAC-1GCGAAACGATCGGGAG-1 GCGAAACTTAACTGGA-1!GCGAAGAATCTGACGG-1"GCGAAGCCATACCCGT-1#GCGACATGTAAACATC-1$GCGACGATAGTTGTAC-1%GCGAGAGGCCATGTAA-1&GCGAGAGTTGCGTCCA-1'GCGAGCGCATGCTCCC-1(GCGAGGCCCGAGCAGA-1)GCGAGTTCTGCAAAGA-1*GCGATTGTTAACGTTA-1+GCGCAAATATATTCAA-1,GCGCAAGAGCGCGCTG-1-GCGCATCCAGTCAGCA-1.GCGCCGTTCCACGATA-1/GCGCCTCCCACTCCGA-10GCGCGGTCTAGTAACT-11GCGCGTCATTGGTACA-12GCGCTAATTGAATAGA-13GCGCTATGCCGAGGCA-14GCGCTGATCCAGACTC-15GCGCTGCTTTGCATTT-16GCGCTTAAATAATTGG-17GCGGACCGCGTTGTGG-18GCGGAGAAACTTCGCA-19GCGGAGAGGGAGAACG-1:GCGGATTACTTGTTCT-1;GCGGCAAAGTATTGCC-1<GCGGCTCTGACGTACC-1=GCGGCTTTAGCAAGTT-1>GCGGGCGAGCCTTACC-1?GCGGTCTTGCTTTCAC-1@GCGGTGAACTGCGCTC-1AGCGGTTCCCTATCATG-1BGCGTAAATGGCCATAA-1CGCGTCGAAATGTCGGT-1DGCGTCGCCAGGGTGAT-1EGCGTCTCTGCATTGGG-1FGCGTGGTACTGGGTTA-1GGCGTTCGGAGACCGGG-1HGCTAACTGAAGTCTGA-1IGCTAAGCCCAGTATGC-1JGCTAAGTAGTTTCTCT-1KGCTAATACCGAATGCC-1LGCTACAATCGAGGATA-1MGCTACAGTACGGACCG-1NGCTACGACTTATTGGG-1OGCTACTATAGTAGAGT-1PGCTAGACCGTCTACTG-1QGCTAGAGTAGAGATGT-1RGCTAGCAGGGAGTGGG-1SGCTAGCTTGAATAGCT-1TGCTAGGCACCACGGAG-1UGCTAGTAGAGCTTGTA-1VGCTATACGTCTCGGAC-1WGCTATCATACTCATGG-1XGCTATGCCAGCTTATG-1YGCTCAATCCGTTTATT-1ZGCTCAATGTAATACCG-1[GCTCATTACTGCATGT-1\GCTCCCAGTCGGTCCA-1]GCTCCGCTCGCTTCAG-1^GCTCCTGACATACTGG-1_GCTCGCTCATGTCCAA-1`GCTCGGAATTTAAAGC-1aGCTCTAAACCCTGACG-1bGCTCTATGTTACGTGC-1cGCTCTCGGGTACCGAA-1dGCTCTTTCCGCTAGTG-1eGCTGAATCTTCCAATC-1fGCTGAGGCGTGAGTAT-1gGCTGCACGGTTTCTTA-1hGCTGCTAAGTAGTCGA-1iGCTGCTACTGCGTAGC-1jGCTGCTCTCCGGACAC-1kGCTGGACCCAAAGTGG-1lGCTGGCATATTCACCT-1mGCTGGCGGCGCATGCT-1nGCTGGTGACTCGTAGT-1oGCTGGTTTAGGCCATA-1pGCTGTATTACTGGCCC-1qGCTGTTGCTACCGAAC-1rGCTTAATGTAACTAAC-1sGCTTACGTAGTTAGTA-1tGCTTATGAAGCAGGAA-1uGCTTCCATGTAACCGC-1vGCTTCCGTCCCTAGAC-1wGCTTGAGTGACCTCTG-1xGCTTGGATCGATTAGG-1yGCTTTCAGAGGAGGTG-1zGGAAACCTTGTTGAAT-1{GGAAACTAAATGGGCC-1|GGAAAGTGCCCATGCC-1}GGAACCGTGTAAATTG-1~GGAACCTTGACTCTGC-1GGAACTTTGGCGATTA-1€GGAATGCGCTAGCGTG-1GGACAACCATGAAGCC-1‚GGACACAAGTTTACAC-1ƒGGACCAACAGGATAAC-1„GGACCTACGGTAACGT-1…GGACCTCTAGGCCGCC-1†GGACGTCCATAGTTGG-1‡GGACTCTTTGACTAAG-1ˆGGAGAAGTCATTGGCA-1‰GGAGACCATCTACATA-1ŠGGAGACGACACCTTTG-1‹GGAGCAACATTTCAAG-1ŒGGAGCACCAAGAACTA-1GGAGCGAGGCCTACTT-1ŽGGAGGGCTTGGTTGGC-1GGAGTTGATTCTGTGT-1GGATCAGAGCCATCAG-1‘GGATCATCCCGTACGC-1’GGATCCGGAATATACT-1“GGATCTTGACTCAACC-1”GGATGAAGATCGCTGA-1•GGATGACGCGAGTTTA-1–GGATGGCTTGAAGTAT-1—GGATGTCCTTACCGCA-1˜GGATTAATCATGGACC-1™GGATTCCGCTATACCC-1šGGATTGCTGTGACTCC-1›GGATTTCACTTCTATA-1œGGCAAAGGCGCCAATA-1GGCAAATTACTTTACT-1žGGCAAGCCCATAGTGG-1ŸGGCAAGGCGAAATAGC-1 GGCAATAGTCAATGAG-1¡GGCACGCTGCTACAGT-1¢GGCACTCCACTGGGCA-1£GGCACTGCGGTGGTTT-1¤GGCAGCAAACCTATGC-1¥GGCAGCGGTAATCCTA-1¦GGCATACAGGTAGCGG-1§GGCATATCGGTTCTGC-1¨GGCCAATTGTATAGAC-1©GGCCCAGCTGGTTTGC-1ªGGCCCTCACCCACTTA-1«GGCCGGCGTCTGCTAT-1¬GGCCGTTTGGGTTTCA-1­GGCCTGCTTCTCCCGA-1®GGCGAAATCTAACTTG-1¯GGCGAGCGAAACGGCA-1°GGCGCAGGACATCTTC-1±GGCGCATGAATTGATG-1²GGCGCGGAGATCTTTC-1³GGCGCGTTCGAGTTTA-1´GGCGCTTCATTCCCTG-1µGGCGGAGTAATATTAG-1¶GGCGGTAGGATCATTG-1·GGCGTAGGGAAAGCTG-1¸GGCGTCCTATCCGCTG-1¹GGCTAAAGGGCGGGTC-1ºGGCTAATGATTGAAAT-1»GGCTATTAAGTTGTAT-1¼GGCTCGCGTTGAGGTA-1½GGCTCTGCTCCAACGC-1¾GGCTGAAATAGCAAAG-1¿GGCTTTCAATAAGGGT-1ÀGGGAAAGAATGCCAAC-1ÁGGGAACGGGAGGTTAG-1ÂGGGAAGACGGTCTGTC-1ÃGGGAAGGGCTTTCTCA-1ÄGGGAATGAGCCCTCAC-1ÅGGGACAGAGTTACTCC-1ÆGGGACCCGTATATCTT-1ÇGGGACTGCATAGATAG-1ÈGGGAGAACTCACAGTA-1ÉGGGAGCGACCGTAGTG-1ÊGGGAGGATGCCCGAAA-1ËGGGAGTTAATGAGGCG-1ÌGGGATGGTCGTAACCG-1ÍGGGATTTACCGCACCT-1ÎGGGCAACCGCACGTGC-1ÏGGGCACTATTGACCAT-1ÐGGGCAGACGTCACTGC-1ÑGGGCAGAGCAATCGTT-1ÒGGGCAGTCAACGCCAA-1ÓGGGCCCGTCTTAAACA-1ÔGGGCCGGCCGAAGTAC-1ÕGGGCCTAAATGGGCTA-1ÖGGGCGATATGTGTGAA-1×GGGCGGCAAATGAATT-1ØGGGCGGGTTCCCTACG-1ÙGGGCGTACATTTATAT-1ÚGGGCGTCACCACGTAA-1ÛGGGCGTCCACTGGCTC-1ÜGGGCGTGGTTTCCCAG-1ÝGGGCTACTATTTCGTG-1ÞGGGCTATGATCGATGG-1ßGGGCTCATCGAACCCA-1àGGGCTGCCTAGGGCGA-1áGGGCTGGTTAGTCGCG-1âGGGTACTTCATGAACT-1ãGGGTATGTATGCACTT-1äGGGTATTCTAGCAAAC-1åGGGTCACCGTGACGGT-1æGGGTCAGGAGCTAGAT-1çGGGTCGTGGCAAGTGT-1èGGGTCTATCGCTTTCC-1éGGGTGACACCTTAACT-1êGGGTGCATATGAAAGC-1ëGGGTTAACATTTGAGT-1ìGGGTTTAGGATAGGAT-1íGGTAACCGGGAGGATA-1îGGTACAAACATGCTAT-1ïGGTACCATTAAGACGG-1ðGGTACGTTGCGGCCGG-1ñGGTAGAAGACCGCCTG-1òGGTAGACCGTTGGGCG-1óGGTAGTGCTCGCACCA-1ôGGTATAGTGACACATA-1õGGTATTGCCGAGTTTA-1öGGTCAAGACTACTTCG-1÷GGTCAGTGGGTCCCAC-1øGGTCGGATAAACGGCG-1ùGGTCGGCCAGGAGCTT-1úGGTCGGTCGTCCACAG-1ûGGTCGTAAGCTCGCAC-1üGGTCTCCGTCCAGGTT-1ýGGTCTCTGAATGGACT-1þGGTCTGAGAATCTGGA-1ÿGGTCTTGAGCGCTCTT-1GGTGAAGTACAGGGAT-1GGTGATAAGGAGCAGT-1GGTGCAGAGCCTATCG-1GGTGCTGGTACACATT-1GGTGGACTGCTCTGGC-1GGTGTAAATCGATTGT-1GGTTACCACCCTCGGG-1GGTTAGCTATATGTCT-1GGTTAGGCTTGGAGAA-1 GGTTCGGATTATACTA-1 GGTTCTACTCGTCTGA-1 GGTTTAATTGAGCAGG-1 GGTTTACAATCTCAAT-1 GGTTTAGCCTTTCTTG-1GGTTTCAATCGGTCAG-1GGTTTGACAAGAAGCT-1GGTTTGTGACCTGAGG-1GTAACATCTAAGATAA-1GTAAGCGGGCAGTCAG-1GTAAGTAACAGTCTGG-1GTAAGTAGGGTATACC-1GTAATAAAGGGCTCCC-1GTAATCTGATTCTTCG-1GTACACTTACCTGAAG-1GTACAGAGGCAAGGGT-1GTACGAGATTGCGACA-1GTACGCTTCATTGCAC-1GTACGTCACGTATTAA-1GTACGTTTGCCCGTCA-1GTACTAAGATTTGGAG-1GTACTCCCTTATCGCT-1GTACTCCTGGGTATGC-1 GTACTGGAGTTAGACC-1!GTAGACACGCCTGACT-1"GTAGAGGGAGACAAGT-1#GTAGCCAAACATGGGA-1$GTAGCGGCTATACACT-1%GTAGCTTCCTCTTGTT-1&GTAGGTGATCCGTGTA-1'GTAGTCGCGGGAATCA-1(GTAGTCTACGATATTG-1)GTAGTGAGCAACCTCA-1*GTATAGGACTCAGTAG-1+GTATCAAACGTTAGCT-1,GTATCCTTTGGTAACC-1-GTATCTCAGTCTTGAC-1.GTATCTTTCATAACCA-1/GTATGAAATTTCACTC-10GTATGTGGGTCTAGTT-11GTATTCTGAGAAACGA-12GTCAAAGAAGTGGTGT-13GTCAACCAGGCCTATA-14GTCAAGCGGACTCGGG-15GTCAGAATAGTCTATG-16GTCATGCACCTCCGTT-17GTCATGCGCGAGGGCT-18GTCATGGACATGACTA-19GTCATTAGAGCGAACG-1:GTCCAATATTTAGCCT-1;GTCCATTACTGCTACG-1<GTCCCAACGTAAAGTA-1=GTCCCAATCATCCCGC-1>GTCCCGCGACGTTATG-1?GTCCGGACCTGAAATT-1@GTCCGGCTGAATTGCG-1AGTCCGGGTTCACATTA-1BGTCCTACGAATAGTCT-1CGTCCTACTCTACGGGC-1DGTCGCCGTTGTGTGTT-1EGTCGCGTAACCCGTTG-1FGTCGGAAGGATACCAG-1GGTCGGATATCTCAGAC-1HGTCGGATGTAGCGCGC-1IGTCGGGAACATGGTAG-1JGTCGGGAAGCAGAAAC-1KGTCGTACCATCTCGGG-1LGTCGTACCTACGATTG-1MGTCGTATTGGCGTACA-1NGTCGTGTCTGGTCATC-1OGTCGTTATTCGCTTAT-1PGTCTAGTGAGCCGCTT-1QGTCTATCTGAGTTTCT-1RGTCTATTGCATGCTCG-1SGTCTATTGGTTCCGGT-1TGTCTCAAGGCCCGGCT-1UGTCTCCCGAGTCCCGT-1VGTCTCCTGCCAGTATG-1WGTCTCGACTAAGTTTG-1XGTCTCGATCTGCTTTC-1YGTCTGGGCGGTCGAGA-1ZGTCTTACCACGCCAAG-1[GTCTTGTAGCTATTCA-1\GTGAAACGGCGCCACC-1]GTGAACTCCCATTCGA-1^GTGAAGATTTCAAGTG-1_GTGAAGCCGTATAGTC-1`GTGAAGTCACGACTCG-1aGTGACAGCTTCCCACT-1bGTGACCGCACACTACG-1cGTGACGAGGGTGACCC-1dGTGACGCAGGTTTCAT-1eGTGACTTCAGTAGTGC-1fGTGAGCGTGCTGCACT-1gGTGAGGACACTTAAGG-1hGTGAGGAGCGGTTGAG-1iGTGAGTCGACTAATAG-1jGTGAGTGGTACAACGC-1kGTGATCACTAACGCCT-1lGTGATCATAGATCTGC-1mGTGATCCTTGTCATGA-1nGTGATGCACAACATCT-1oGTGATTCGCCGCTCAA-1pGTGCACCAGCTTCAAC-1qGTGCACGAAAGTGACT-1rGTGCCATCACACGGTG-1sGTGCCCGTTCGGATTC-1tGTGCCGCTTCAAAGGT-1uGTGCCTGAGACCAAAC-1vGTGCGAAATCGAACAC-1wGTGCGACAGGGAGTGT-1xGTGCGGGTCTCCAAAT-1yGTGCGTGTATATGAGC-1zGTGCTCAAGTACTGTC-1{GTGGAACCTACATGCG-1|GTGGACCAACCCGATT-1}GTGGACGCATTTGTCC-1~GTGGAGCGTTTACCGA-1GTGGAGTCGGCGGTTG-1€GTGGCAAACAGCGGCA-1GTGGCGGTCCCAGCGT-1‚GTGGCTGTTTCTGTTC-1ƒGTGGGAAGACTGAATC-1„GTGGGCTTAGACACAC-1…GTGGGTACTGAGCGTA-1†GTGGTATAGTCTGCCG-1‡GTGGTGGCCAAGTGAA-1ˆGTGGTTACTTCTTTCG-1‰GTGGTTTCCGCCTTTC-1ŠGTGTACCTTGGCTACG-1‹GTGTATATCAGCGGGC-1ŒGTGTCGTATAGCGTTC-1GTGTGAATAACTTAGG-1ŽGTGTTACTATGCGTCC-1GTTAAAGTAGGACTGG-1GTTAACATCACTTAAA-1‘GTTAACTATGTTGTCA-1’GTTAAGGGTGCGATGT-1“GTTACAATTGGTGACG-1”GTTACCTACAACTTGC-1•GTTACTTTGGGCCTAG-1–GTTAGCCCATGACATC-1—GTTAGCCGTAAATCAA-1˜GTTAGGCTACCCGTTT-1™GTTATAATACGGTGAA-1šGTTATATCAGGAGCCA-1›GTTATATTATCTCCCT-1œGTTATCAAGCTATCGA-1GTTCACAGGAGTCTAG-1žGTTCATCGTTTGGCTG-1ŸGTTCGCCATAAGTGCC-1 GTTCGCTGAGACGTCT-1¡GTTCGGATCGGGAACA-1¢GTTCGGGCGTACCATT-1£GTTCGTCTAAAGAACT-1¤GTTGAACCGGTTCCAT-1¥GTTGAGTCCCGCCGGT-1¦GTTGCACGGAGTTTCG-1§GTTGGACCGCATCAGG-1¨GTTGGATTCAGTGGCT-1©GTTGGATTGAGAACAC-1ªGTTGGATTTGCGTTGG-1«GTTGGTCATGCTATCC-1¬GTTTACGTTCCATCTG-1­GTTTCAAACGAGTTGT-1®GTTTCATATCGTCGCT-1¯GTTTCCTGGAGGGTGA-1°GTTTCTAGAGGCGCGG-1±GTTTCTGCAGTCTCCC-1²GTTTGACCAAATCCTA-1³GTTTGGCCCAAGTTAT-1´GTTTGGGCTTGTGAGC-1µGTTTGGGTTTCGCCCG-1¶GTTTGGTAGGGTCAAC-1·GTTTGTTAGCCAAGTA-1¸TAAACCCAGGAGGGCA-1¹TAAAGCGGTATTTCCA-1ºTAAAGCGTTAGGAGAA-1»TAAAGCTGCAATAGGG-1¼TAAATGCCGTCTCATG-1½TAACATACAATGTGGG-1¾TAACATACACGCGATC-1¿TAACCTACCGTCCGAG-1ÀTAACCTAGGGAGTCCA-1ÁTAACTATTACGCCAAA-1ÂTAACTCATCCGCGCGG-1ÃTAAGAGGGACAGGGAC-1ÄTAAGCCCTTACGACCA-1ÅTAAGGCAACATAAGAT-1ÆTAAGGCATAACATCAA-1ÇTAAGGCCCGTCACCCT-1ÈTAAGGCTGAATCCCTC-1ÉTAAGGGCCTGTCCGAT-1ÊTAAGTAACATCTTGAC-1ËTAAGTCGCCGAGTATC-1ÌTAAGTTGCGACGTAGG-1ÍTAATAAACAAGGAGAT-1ÎTAATACACAGTAGTAT-1ÏTAATACTAGAACAGAC-1ÐTAATAGAACAGAGTTA-1ÑTAATAGGTCACCAGAA-1ÒTAATAGTGACGACCAG-1ÓTAATCGATCCGTACGT-1ÔTAATTACGTCAGTAGA-1ÕTAATTAGGACATCCGT-1ÖTAATTGGAATCGGGAA-1×TAATTTCCGTCCAGTA-1ØTACAACAGCGCATACA-1ÙTACAACGCACAACTCA-1ÚTACAAGGGCTTCTTTA-1ÛTACAAGTCTCGTGCAT-1ÜTACACAGCCGTGGTGC-1ÝTACACCTCTTCGAATC-1ÞTACAGAAACGGTGGGC-1ßTACATAGGCATACACC-1àTACATCCCTATCCCTG-1áTACATTTCTAACGTGC-1âTACCAAATAGCCCAGA-1ãTACCAATAAAGTACCA-1äTACCAGAAGTAGGTTC-1åTACCGAATAATTGTAA-1æTACCGCGGACTTGCAG-1çTACCGGCTCACTGCCC-1èTACCGGTCGTTTCCAT-1éTACCGTAGGTTAACTA-1êTACCGTGCCTCGGACC-1ëTACCTACTCCCAGTAT-1ìTACCTATCCCTAGAGG-1íTACCTCAGTTGTCTGT-1îTACCTTAAGATTTCCC-1ïTACGAACACGACTTCA-1ðTACGACGCTTGCTGCG-1ñTACGACTGCCTCTTAG-1òTACGAGAACTTCACGT-1óTACGATGTTGATCATC-1ôTACGCAGTTCTTTCCT-1õTACGCCATATTCTAAT-1öTACGCCGAGGGTACCC-1÷TACGCCTCCATTCCGA-1øTACGCTATAGAAACCT-1ùTACGCTCGGTATTGGA-1úTACGGAAGCCAAACCA-1ûTACGGGATGCTAGCAG-1üTACGGGTAATAACATA-1ýTACGTAAAGCGGAGTG-1þTACGTGGGCCCAGGGC-1ÿTACGTTTACCGGCAAT-1TACTACGTGCAATGCG-1CTGGGATAAATAATGG-1CTGGGCCTGCTATATC-1CTGGGTAGGCAGTTAA-1CTGGGTTGAGTTAAAG-1CTGGTAAAGACTTACA-1CTGGTAACACATAGAA-1CTGGTAACGAGCTCTT-1CTGGTTTCGAGCAAGA-1 CTGTACTTCTTAGCAT-1 CTGTAGCCATCTCACT-1 CTGTCAAATGGCTCGG-1 CTGTGCAGGGTAGGTC-1 CTGTGGTCGGGAGATA-1CTGTTACCCAATCTAG-1CTGTTCACTGCCTGTG-1CTTAACTTACAGTATA-1CTTAAGCAGCGAGCCG-1CTTACACGGTATTCCA-1CTTAGCCTTCCACATG-1CTTAGGTATAGACCAG-1CTTAGTAGGCCTACAG-1CTTAGTGTAGTAGCAT-1CTTATGCGCTCAGGGC-1CTTCAACTCCACTTGG-1CTTCAGTGGTCGCCTA-1CTTCAGTTGGACAACG-1CTTCATTGTCAGTGGA-1CTTCCGCTCCGTGAAG-1CTTCGATTGCGCAAGC-1CTTCGGCCAATTGTTT-1CTTCGTAGATAGGTGA-1 CTTCTATGTTGAAGTA-1!CTTCTATTAATGCTAG-1"CTTGAGTTAGGGTAAT-1#CTTGATGACCATCCAG-1$CTTGCAACCGCCTCCT-1%CTTGCCCACCCACGCA-1&CTTGCCCAGGCTCTAC-1'CTTGGCCAAGCTGGGA-1(CTTGTACTTGTTGACT-1)CTTGTCAACATTCGAG-1*CTTGTGCTCACCGATT-1+CTTGTTGCTGAGTCAA-1,CTTTAACTTTCAAAGG-1-CTTTAATATTGGTCGA-1.CTTTACCGAATAGTAG-1/CTTTAGGAACACTGTT-10CTTTAGTGCTATTATT-11CTTTCTGTGCGGGCTT-12CTTTGACGTCGCTTCT-13CTTTGCATCGCTCTTG-14CTTTGGCTTTAGTAAA-15CTTTGTCGAATGCTCC-16GAAACAGATGACCACC-17GAAACATAGGAAACAG-18GAAACCATGGTGCGCT-19GAAACCGAATTACCTT-1:GAAACCTATACAAATG-1;GAAAGAACAGCGTTAT-1<GAAAGCAGTGCACTTT-1=GAAAGCCCTTTGGACC-1>GAAATATCACCATCAG-1?GAAATATGCTTGAATG-1@GAAATCGCGCGCAACT-1AGAAATGGCGGTGTTAG-1BGAAATTAGCACGGATA-1CGAAATTGTCTCTATAA-1DGAACAACTGGGATGAA-1EGAACACACATCAACCA-1FGAACAGATTACTAAAT-1GGAACCCTCTGTGTTCT-1HGAACCTCGACCTACAC-1IGAACCTTTAACGATCC-1JGAACGACCGAATGATA-1KGAACGCGGGTCACACG-1LGAACGTCTCATGGTCG-1MGAACTGTGGAGAGACA-1NGAAGAAACGATATTGT-1OGAAGCCACTGATTATG-1PGAAGCCTGCACATTCC-1QGAAGCGTGAGGAATTT-1RGAAGCTCGGACCCGTC-1SGAAGCTTGCTGACCGC-1TGAAGGAGTCGAGTGCG-1UGAAGTCAGTTGCACTA-1VGAAGTCTCCCTAGCGA-1WGAAGTGATTTATCGTG-1XGAAGTTTCCACTCAAT-1YGAATAGACGCGACCCA-1ZGAATAGCCCTGCGGTC-1[GAATCGACATGGTCAC-1\GAATCTGAACATTCTC-1]GAATGCGAATCGGTTC-1^GAATGGGCTTATCGAC-1_GAATGTATGGCAGGTC-1`GAATGTGGTCCGGATT-1aGAATGTTGGGTAATCT-1bGAATTATAGTGAAAGG-1cGAATTCACCCGGGTGT-1dGAATTTCTCGCTGCAG-1eGACAAACATATGCAGG-1fGACAACGACCATTGAA-1GCOLGACAACGCAGCTTACG-1GACACAAGGGAAGAAA-1GACACAGCCGGGACTG-1GACACTGAGTTCAGTG-1GACACTGGAACCCGAT-1GACACTTCCAATTACC-1GACAGATTTCTGGCTC-1GACAGCCAGACCTGAC-1 GACAGGCACACACTAT-1 GACATCCGTCGAACTG-1 GACATCGATTTATAAC-1 GACCAAACGTTGACTG-1 GACCACACTTCCCTTT-1GACCAGAGCCCTGTAG-1GACCCAATTATGATAC-1GACCGACGTGAAAGCA-1GACCGACTGAAGCGTC-1GACCGCGTCTGACGTG-1GACCGTGCTGACGGTG-1GACCGTTACATGCGAC-1GACCTTCCACGTCTAC-1GACGACGATCCGCGTT-1GACGAGGCTAATAAAC-1GACGCATACCCGTCGG-1GACGCCGTAAAGGCTA-1GACGCTTGCTTCTAAA-1GACGGGTTGGCCCGTA-1GACGGTCAATAGAAGC-1GACGTGTAGGGATTAT-1GACTAAGATCATGCAC-1GACTAAGTAGGCTCAC-1 GACTACAAAGCGGTGG-1!GACTAGGCCGTTAGGT-1"GACTCACCCACGTGAG-1#GACTCCCAGAATAAGG-1$GACTCCTTCCAATTGA-1%GACTCGCGGGAATGAC-1&GACTGCAAATCGAGCT-1'GACTGCACCAGCCCAG-1(GAGAACGGTTCTGACT-1)GAGACCCTGCAACGCC-1*GAGACTGATGGGTAGA-1+GAGACTTCGCGACCGA-1,GAGAGGGCGCGAGGTT-1-GAGAGGTGCATTCTGG-1.GAGATCTGCTTGGCAT-1/GAGATCTGTCACTCCG-10GAGATCTTCCATGACA-11GAGATGGCTTTAATCA-12GAGATGGGAGTCGACA-13GAGCACCTGTGTCCAG-14GAGCCAGCTACCTGTG-15GAGCCGAGCGTTTATT-16GAGCGCAAATACTCCG-17GAGCGCGCACGAGTAG-18GAGCGCTGTTAGGTAA-19GAGCTAAGGGCATATC-1:GAGCTGTCGTCTCGGA-1;GAGGAATGGAGAGGTT-1<GAGGATAAACAGTGCT-1=GAGGCCCGACTCCGCA-1>GAGGCCTGTTGATACA-1?GAGGCTATCAAAGTCG-1@GAGGGCGCAGCTCTGC-1AGAGGTACGCGTGTCCC-1BGAGTAAGGCCACGGGA-1CGAGTAGATACTAGTTG-1DGAGTATGCCCGCCTTG-1EGAGTATGCGCGTGCAT-1FGAGTCAGACCAGAATC-1GGAGTCCGCTTACCGGA-1HGAGTCTTGTAAAGGAC-1IGAGTGTCAACCAGAAA-1JGAGTGTGCGGTACCCA-1KGAGTTCTGTGGGTGCT-1LGAGTTGATGGCAATTT-1MGATAACTCGCACTGTG-1NGATACGATGGGAGTCA-1OGATAGATAGTACAGTC-1PGATAGGTAACGTTGAC-1QGATATCAAGCAGGAGC-1RGATATGAGACACTAAC-1SGATATGCGGTAGCCAA-1TGATATTGAGATTGGCG-1UGATATTTCCTACATGG-1VGATCATTCCAAACATT-1WGATCCCTTTATACTGC-1XGATCCGGGAATTAACA-1YGATCCTAAATCGGGAC-1ZGATCCTCGACACTGGC-1[GATCGACACTATCTGA-1\GATCGCGGGCTCTCCA-1]GATCGCTACCCGATTT-1^GATCGCTATATCTCAG-1_GATCGGATAGAACCAT-1`GATCGGTGGCCATAAC-1aGATCGTGACTGATATC-1bGATCTAACCGTATTCA-1cGATCTGCTATCTAAGG-1dGATCTTGGAGGGCATA-1eGATCTTTGCAGGGTAT-1fGATGACAAGTAGGGCA-1gGATGACGATGATCGCG-1hGATGAGGAACCTTCGG-1iGATGCCTTCTGCGGCA-1jGATGCGTCCTGCATTC-1kGATGCTGTATTTCATC-1lGATGTAACGAACCACC-1mGATGTTCAATCCACGA-1nGATTAACCGAAAGCCC-1oGATTACTGAATTTGGG-1pGATTCCCTTGTCGCAG-1qGATTCCGCGTTTCCGT-1rGATTCGACGGTTCACG-1sGATTGGGAAAGGTTGT-1tGCAAACCCTACATTAT-1uGCAAACCTTGGCCATA-1vGCAAATATTACGCTTT-1wGCAAATGAGGACACTT-1xGCAACACACTAGAACT-1yGCAACAGCAGTATGCG-1zGCAACCACCAGACCGG-1{GCAACCACGGCCGCGT-1|GCAACGGCTAGTTATG-1}GCAAGAATTCCTTGGC-1~GCAAGATGTGTTCGCG-1GCAAGCTGGAAACCGC-1€GCAAGTGCACAGAGAA-1GCACAAACGAGGCGTG-1‚GCACAACCTCGGGCGT-1ƒGCACACACTGGTAGCC-1„GCACCTAGGCGAGTCC-1…GCACGCCGATTCCCGC-1†GCACGCCTACTTAGAT-1‡GCACGTGGTTTACTTA-1ˆGCACTGCCTACCTTTA-1‰GCAGACCCAGCACGTA-1ŠGCAGATCCATAAGACT-1‹GCAGATTAGGGATATC-1ŒGCAGCACACAGCCCAG-1GCAGCCTATATCACAT-1ŽGCAGCTATGGACAGGT-1GCAGCTGTCAACGCAT-1GCAGGAACTTAGATCT-1‘GCAGGACTATAGAATA-1’GCAGGTAGAGTATGGT-1“GCAGTGTGGCTATAGG-1”GCATAGAGCACTCAGG-1•GCATCGGCCGTGTAGG-1–GCATGAGGGACGCGGC-1—GCATGCTAATAACGAT-1˜GCATGGGTACTGACGC-1™GCATTCAAGGCAACGC-1šGCATTGACTTGCGGAA-1›CGTGCATTGTCGACGC-1œCGTGCCCTCCCGAAGA-1CGTGGCCGAATATCTA-1žCGTGTATGGGAGCTGA-1ŸCGTGTCCCATTCGCGA-1 CGTTAAACTAGTTAGG-1¡CGTTAATGTCCCGACG-1¢CGTTAGCTCACAACTG-1£CGTTATCATACTTCCA-1¤CGTTCAGACCCGCGAA-1¥CGTTCATGGTGCGCGT-1¦CGTTCTTCGCACACCT-1§CGTTGAATACCGCGCT-1¨CGTTGAGCGACCGTCG-1©CGTTGAGTAATTGCGT-1ªCGTTGTAAGATTGATT-1«CGTTGTCGGCAATTGA-1¬CGTTGTTTCAATTCCC-1­CGTTTCACTTCGGGCG-1®CGTTTCGCTCATTACA-1¯CGTTTGTGTAGAGGGT-1°CTAAAGAATGCCTACT-1±CTAAAGGGAAATAGGA-1²CTAAATCCTATTCCGG-1³CTAACAGCACAATAAC-1´CTAACCGCGCGCCCGT-1µCTAACGAAACTTGCTG-1¶CTAACTGATAATCGCC-1·CTAACTGGTCCGGTTC-1¸CTAAGGGAATGATTGG-1¹CTAATTCGCACGCGCT-1ºCTAATTCTCAGATATT-1»CTACACTCGCAGATGG-1¼CTACCCTAAGGTCATA-1½CTACGACTAGCTATAA-1¾CTACGCACGGAGTACC-1¿CTACTATCATAGGTTT-1ÀCTACTATCTTTCAGAG-1ÁCTACTCAAGGTATAGT-1ÂCTACTCTAGGCCCGGC-1ÃCTACTGCCACCTGACC-1ÄCTAGATGTGAGTGTAA-1ÅCTAGATTTACGACGGC-1ÆCTAGCATAGTATAATG-1ÇCTAGCCGATGTTATGA-1ÈCTAGGCGCCCTATCAG-1ÉCTAGGTCTGAAGGAAT-1ÊCTAGGTTCGGACGTGA-1ËCTAGTAGAAAGGGATT-1ÌCTAGTCACGTCTTAAG-1ÍCTAGTGAAGGACAGGA-1ÎCTAGTTACAACCCGGT-1ÏCTAGTTGGGCCCGGTA-1ÐCTATAAGAGCCAATCG-1ÑCTATACTTAAAGCGAG-1ÒCTATCGACGAAATACA-1ÓCTATCGGGTCTCAACA-1ÔCTATGCCCGAATGCAA-1ÕCTATGGGAAGCGGAAT-1ÖCTATGTCACTAGCCCA-1×CTATGTGAGTCACGGC-1ØCTATTCATGTGTCCCA-1ÙCTATTGTGTTTGGTCA-1ÚCTATTTGCTTGGAGGA-1ÛCTATTTGGTTACGGAT-1ÜCTCAACTAACCCGGAT-1ÝCTCAAGACATTAGCGC-1ÞCTCACATTTACTAAAT-1ßCTCACTGTGATACTTA-1àCTCACTTGGCTGGTAA-1áCTCAGATTGTGATAAG-1âCTCAGTCACGACAAAT-1ãCTCATAAATGTGTATA-1äCTCATGGTAATTTGCG-1åCTCATTGCTCTAACAA-1æCTCATTTGATGGGCGG-1çCTCCCTCCTTTCGATC-1èCTCCGCCCACATGAGG-1éCTCCGGCCTAATATGC-1êCTCCTCCAGCTCACAC-1ëCTCCTTTACGCAAGTC-1ìCTCGAGACATACGATA-1íCTCGAGGTCGAACAGT-1îCTCGATATTTGCGAGC-1ïCTCGCACCTATATAGT-1ðCTCGCATTGCATAGCC-1ñCTCGCCGAATGTAGGG-1òCTCGCTAGGTAAGCGA-1óCTCGGTACCACTGCTC-1ôCTCGGTTGTCGGCCCT-1õCTCGTCGAGGGCTCAT-1öCTCGTCTGTGCCTTCG-1÷CTCGTTTCTAATGTTT-1øCTCTAATGCATTGATC-1ùCTCTACACTGGCGATT-1úCTCTAGCCCTCGGAAA-1ûCTCTATTTGGCTGCAG-1üCTCTCACAATCGATGA-1ýCTCTCTAACTGCCTAG-1þCTCTGGACGCCTGGTG-1ÿCTCTTCTATTGACTGG-1CTCTTGTCCCGCTTGG-1CTGAAAGAGATCCGAC-1CTGAATCCGAGACCTC-1CTGAATTTATTGCCAG-1CTGACTGCGCAGCTCG-1CTGCAAGCACGTTCCG-1CTGCACAACTACATAT-1CTGCACTCCAGTACAG-1CTGCAGAGAATCAGAG-1 CTGCCAAGGTTGGAAG-1 CTGCCATGCATCACAT-1 CTGCCTTTCTAGTAAA-1 CTGCGACCTCGCCGAA-1 CTGCGTTACGATATAA-1CTGCTGAGGCCACGAA-1CTGCTTGGCGATAGCT-1CTGCTTTATGTCCGCG-1CTGGAAATGGATGCTT-1CTGGAAGACACGGTGG-1CTGGACGCAGTCCGGC-1CTGGATTTACACTTGA-1CTGGCATCCGAATGAG-1CTGGCGACATAAGTCC-1CTGGCGATTTACATGT-1CTGGCGCACAGGTCTG-1CTGGCTGATTCATCCT-1CTGGCTGGTTGTCAGT-1CGCGTTCATGAAATAC-1CGCTACGGGACATTTA-1CGCTAGAGACCGCTGC-1CGCTATTCTTAGGCTC-1CGCTCTCCGTAGATTA-1 CGCTGGTGACTACCCT-1!CGCTGTGACGCCGCAC-1"CGCTGTGTGGATGTTG-1#CGCTTATTCCCGGTCG-1$CGCTTCGGTCTAAGAC-1%CGCTTTCTTGCATTCG-1&CGGAAAGAATCAAACG-1'CGGAACGTAAACATAG-1(CGGACCTTTACGTCCC-1)CGGACGTTACTTGAAG-1*CGGAGCAATTTAATCG-1+CGGAGCATGGCGATCC-1,CGGAGTTTGAGAGACA-1-CGGATCCTCAAGGACT-1.CGGCAAACATCGTGCG-1/CGGCAATAAGATCGCC-10CGGCAGGGTCGGGTTG-11CGGCCACGCACAAAGT-12CGGCCCAACCTGTAGT-13CGGCCCAGGTATATCC-14CGGCGCCATCAATCCC-15CGGCTCTAAAGCTGCA-16CGGGAATATAGTATAC-17CGGGAATTTATGTAAA-18CGGGAGCTTCAGTGTA-19CGGGATCAATGTAAGA-1:CGGGCAGCTAAACCGC-1;CGGGCCTTCTTTGTAA-1<CGGGCGATGGATCACG-1=CGGGTGTACCCATTTA-1>CGGGTTTGTTAGGGCT-1?CGGTACGGCAAACCCA-1@CGGTACTAGAATCAAA-1ACGGTAGAGGTGCAGGT-1BCGGTATAGGTATTAGC-1CCGGTCAAGTGGGAACC-1DCGGTCCGTCGCAAGCC-1ECGGTCTATCAACCCGT-1FCGGTGAAGACTAAAGT-1GCGGTGCAGATAGAACG-1HCGGTGCGCGTTGGTCC-1ICGGTGGGCTCCAGCCT-1JCGGTTATCCAACAGTG-1KCGGTTCAAGTAGGTGT-1LCGGTTGACCTGGCATA-1MCGTACCTGATAGGCCT-1NCGTAGAGAGTAATTAT-1OCGTATTAAGAGATCTA-1PCGTCACGTCCATTGGT-1QCGTCCTCATCGCGTGC-1RCGTCGCATGTGAGCCA-1SCGTCGGATAGTGTTGA-1TCGTCGGGTCTAAGCGC-1UCGTCGTCCTTCGCGAA-1VCGTGAAGTTAATTCAC-1WCGTGACATTGGGTCGT-1XCGTGACCAGTCCTCTG-1YCGTGCACACCACTGTA-1ZCGTGCAGACTGGGACA-1[CGATGTTGTTATCTAC-1\CGATTAAATATCTCCT-1]CGATTCGCCTGGCTGC-1^CGCAAACACGAGTTAC-1_CGCAATTAGGGTAATA-1`CGCACATGTCCACTAC-1aCGCACGTGCGCTATCA-1bCGCAGATCTTCACCCG-1cCGCAGGCGATCCAAAC-1dCGCATGCCGAATGCGT-1eCGCATGGTGCGATGCT-1fCGCATTAGCTAATAGG-1gCGCCACAGGTCGCGAT-1hCGCCATCCGATTATGA-1iCGCCCAGCACGCCTAG-1jCGCCCAGCGTTTCACG-1kCGCCCGCTTCCGTACA-1lCGCCGCCCATGCCTGT-1mCGCCGTTCAGCATAGT-1nCGCCTCCCTCCTCTAT-1oCGCCTGGCCTACGTAA-1pCGCGAAGTGGCATACT-1qCGCGACCGCGACAGAT-1rCGCGAGAGGGACTTGT-1sCGCGAGTCTGCCGGGT-1tCGCGCAAATGTCCAGA-1uCGCGCATGTTTGATTG-1vCGCGCCCGACTTAATA-1wCGCGGCTCAACTTGAA-1xCGCGGGAATTAGGCAG-1yCGCGGGAATTCCTTTC-1zCGCGGTCACAAACCAA-1{CGAGAGCGCGTAGATA-1|CGAGAGCTTTCACTAC-1}CGAGAGGGTAGCCGCG-1~CGAGCTGGGCTTTAGG-1CGAGGCTAAATATGGC-1€CGAGGGACTGCGGTCG-1CGAGGGTATCCAGGTG-1‚CGAGTACTAAAGAGGA-1ƒCGAGTGAAGGTACCAG-1„CGAGTTCTGTCCCACC-1…CGAGTTTATCGGACTG-1†CGATACCTCGCGGACA-1‡CGATAGTCGTACTGCA-1ˆCGATCCGACCCAGTGC-1‰CGATCTGTTGGAGGAC-1ŠCGATGGACCCTACGCC-1‹CGACCCTTAACGCCGG-1ŒCGACCTACTAGACAAT-1CGACGCATCCGTACCT-1ŽCGACTCAGGATGTTAT-1CGACTTTGTATAGCCT-1CGAGACCCTAGAGTGT-1‘CGAGACTACTGCTGCT-1’CGAGAGATGTGAACCT-1“CGAATGACGCATAATG-1”CGACAATTTGATCTAA-1•CGACACGCTCCGACAG-1–CGACAGTTCGCGTTAT-1—CGAATCTGCTCGACGC-1˜CGAATGAAGTCATTGC-1™CGAAGTTGCTCTGTGT-1šCGAAGCTATAAATTCA-1›TGAGAGATTTACCACG-1œTGAGATTAGGCCCTAA-1TGAGCCATACAGTCTC-1žTGAGCGGAAAGTGTTC-1ŸTGAGCTTTAATGACGC-1 TGAGGAGTGCCAGCTT-1¡TGAGGCATGTACTGTG-1¢TGAGTAAATTAGCGTA-1£TGAGTGCCTCTTAAAT-1¤TGAGTGGTCCGTGACG-1¥TGAGTGTAACAACGGG-1¦TGAGTTAAAGACATTC-1§TGATACATTTAGCCGT-1¨TGATCAGGGAACTGCT-1©TGATCCCAGCATTAGT-1ªTGATCGGTTTGACCCT-1«TGATCTACGCTGATCT-1¬TGATCTATCACACTCT-1­TGATCTCCGGCGCCAG-1®TGATGGCTGTTTCTGA-1¯TGATGTCAATTAAGTG-1°TGATTATGGCACGCAG-1±TGATTCAGGTCCCGCG-1²TGATTCCCGGTTACCT-1³TGATTCGTCTATCACT-1´TGATTCTGTCGCCGGT-1µTGATTTATTAGCTGTG-1¶TGCAACCCATCTGCGG-1·TGCAACTACTGGTTGA-1¸TGCAAGAATGACGTAA-1¹TGCAATCTAACACGGT-1ºTGCAATTTGGGCACGG-1»TGCACAGTGAAGTTAT-1¼TGCAGAACTATATCGT-1½TGCAGAGTACCGAGCA-1¾TGCAGATCGTCCTAGG-1¿TGCAGCTACGTACTTC-1ÀTGCAGGATCGGCAAAG-1ÁTGCAGTTTCCTCCCAT-1ÂTGCATATGTCTGTCAC-1ÃTGCATGGATCGGATCT-1ÄTGCATGTGGTAATCTA-1ÅTGCCAAAGTCAGACTT-1ÆTGCCAATGGGTACTCT-1ÇTGCCACACTAGAGGAA-1ÈTGCCACCTGGCGAAAC-1ÉTGCCAGTACGTGGAGA-1ÊTGCCATTACTAAAGAA-1ËTGCCCGATAGTTAGAA-1ÌTGCCCGTACCGTTAAA-1ÍTGCCGTGGATCGTCCT-1ÎTGCCGTGGGACCCAAT-1ÏTGCCGTTCTTAATCGG-1ÐTGCCTAATTGAAGATT-1ÑTGCCTGATCAAACGAT-1ÒTGCCTTGGCCAGGCAA-1ÓTGCGAATATGGGATTT-1ÔTGCGACACCCTAGTGC-1ÕTGCGAGAATATTACCC-1ÖTGCGAGATGGCGGCCA-1×TGCGAGCCCTTCCGCG-1ØTGCGCAAAGCATTTGG-1ÙTGCGCGATTAACGGAG-1ÚTGCGGACTTGACTCCG-1ÛTGCGGAGTAAAGGTGC-1ÜTGCGTAAGAACCTGAT-1ÝTGCGTACGGCTAATTG-1ÞTGCGTCATGACTGAGC-1ßTGCGTTTGTTGACACT-1àTGCTAAGTGTCTATTT-1áTGCTCCACAGTTCTTA-1âTGCTCGGCGAAACCCA-1ãTGCTCGGTGGGTCACC-1äTGCTCTTGAGAGTTTG-1åTGCTGTTGAAGAACTC-1æTGCTTCCCAAGCAGTA-1çTGGAACCACTGACACA-1èTGGAAGAAGGGAACGT-1éTGGAAGGATAAAGATG-1êTGGAATATCCTTGACC-1ëTGGACCAATCTAAGAT-1ìTGGACGCAATCCAGCC-1íTGGACTGTTCGCTCAA-1îTGGAGTGATGCGATGA-1ïTGGCAAACTAAATTAC-1ðTGGCAACTCGCGCGCC-1ñTGGCAAGCACAAGTCG-1òTGGCAATGGGACGGCG-1óTGGCAGATTACGATCA-1ôTGGCAGCAGTAATAGT-1õTGGCATGAAGTTTGGG-1öTGGCCAAACTGAAGTA-1÷TGGCCAATTTGGTACT-1øTGGCCGTATATTGACC-1ùTGGCGACTGCTCCAAA-1úTGGCGATCAAGTTATG-1ûTGGCTACACTCTACCT-1üTGGCTATGTGACATAC-1ýTGGCTCTTGTCGCGTA-1þTGGCTTATGTATAATG-1ÿTGGCTTGTACAAGCTT-1TGGGATGCACTCATTC-1TGGGCAATAGTTGGGT-1TGGGCCACAAGAGCGC-1TGGGCCCATACTAATT-1TGGGCGATACAATAAG-1TGGGTGCACAAGCCAT-1TGGGTGGGATGTCATT-1TGGGTGTAATAGATTT-1TGGTAAGCAGGATTGA-1 TGGTAGAATATATGGG-1 TGGTCCCACGCTACGG-1 TGGTCGTGCAAGGCAA-1 TGGTCTGTTGGGCGTA-1 TGGTTAACTTACATTT-1TGGTTAAGGGCGCTGG-1TGGTTCAACGGGTAAT-1TGGTTCGTAGCAAAGG-1TGGTTTAAACGTGGGT-1TGTACCTACACGAGGG-1TGTACGAACAAATCCG-1TGTACTTCCGGGCATG-1TGTAGCCAATTCCGTT-1TGTAGCCATCCCATTC-1TGTAGGAGAAATTTCC-1TGTAGTGATCTATAAT-1TGTATAACAGATCCTG-1TGTATCAGACTGAAGC-1TGTATGGCGCAGACAG-1TGTCATTTGTTGGGAA-1TGTCCACGGCTCAACT-1TGTCCTAAGTCACCGC-1TGTCGTTATCACATAT-1 TGTGACTACGCCAGTC-1!TGTGACTAGAGTTTGC-1"TGTGAGACTAGCCCAA-1#TGTGCCAGAGGCAAAG-1$TGTGCCGGTGCCGGAA-1%TGTGGCAAAGCGTATG-1&TGTGGCGGGCTTCTGG-1'TGTGTCGAAGTCGAGG-1(TGTGTGACCATGAATC-1)TGTTATTGTATGTGGC-1*TGTTCCGCTTCCATGA-1+TGTTCCGGCCTGAGCT-1,TGTTCGTATTGCGGTG-1-TGTTCTTCCATTGACT-1.TGTTGTCAAGAAGTCT-1/TGTTTCTGAAGCGTGC-10TGTTTGAGATCGTCAG-11TTAAACTCGAATTCAT-12TTAAAGTAAGTCGCCA-13TTAACCAACCCTCCCT-14TTAACGAACAAGCAGT-15TTAACTTCAGGTAGGA-16TTAAGATAGGATTGAC-17TTAAGCGCCTGACCCA-18TTAAGGCCCGTACTTT-19TTAAGTATTGTTATCC-1:TTAATCAGTACGTCAG-1;TTAATGTAGACCAGGT-1<TTAATTGCTTTGGGTG-1=TTAATTTCAGACGCGG-1>TTACAACTACGCATCC-1?TTACACGATCTGCGAC-1@TTACAGACCTAAATGA-1ATTACATGCCACAACTA-1BTTACCATTGATTACCC-1CTTACCCATTGCCGGGT-1DTTACCCTAGGGATTGG-1ETTACGGATGGTTCGAG-1FTTACTAAAGGACTTTA-1GTTACTCCGGCCGGGAA-1HTTACTCTGGTACGTAC-1ITTACTGGGATATTTCA-1JTTACTGTCTAGAGCTC-1KTTAGAAGAACATGACT-1LTTAGAATAAGGGTCGG-1MTTAGACACGATCGTTG-1NTTAGACGAGTCACCTC-1OTTAGAGGGATATACAG-1PTTAGAGTTTAGAAGGA-1QTTAGCTAATACGATCT-1RTTAGCTGATTTGCCGT-1STTAGTAAACCTGCTCT-1TTTAGTAGGGCGGCGGG-1UTTAGTTATTCGTGGCA-1VTTAGTTCAAGTGTTCG-1WTTATAGGTAATTGTCT-1XTTATATACGCTGTCAC-1YTTATATTTGGCAATCC-1ZTTATCCGGGATCTATA-1[TTATCCTCAAGGAATA-1\TTATCTGACATTAGGA-1]TTATCTGTATCATAAC-1^TTATGAATGAAAGGGA-1_TTATGACAAACTGGAT-1`TTATGATCTTAACGAA-1aTTATTAGAGCGTGTTC-1bTTCAAAGTCTCTAGCC-1cTTCAATACTCTGAATC-1dTTCACGAAAGGATCAC-1eTTCACTCGAGCACCTA-1fTTCAGCCCTGGTCCAC-1gTTCAGCTGGCGTGCCC-1hTTCAGGCGTCAAAGCC-1iTTCATGGCGCAACAGG-1jTTCCAATCAGAGCTAG-1kTTCCAATCTGGCTATC-1lTTCCACACAGATTTGA-1mTTCCAGACGAGATTTA-1nTTCCATCATGCGGTGA-1oTTCCATCGACAGCGTG-1pTTCCCGGCGCCAATAG-1qTTCCGCAGAGAAATAT-1rTTCCGCGTGAGGCGAT-1sTTCCGGCCTTGAGGCT-1tTTCCGGCTCGACTTCT-1uTTCCGGTTACCCACTT-1vTTCCTCGAGGGTGTCT-1wTTCCTCGGACTAACCA-1xTTCGACAGAGCCCGTG-1yTTCGACGGGAAGGGCG-1zTTCGCACTCGCGTGCT-1{TTCGCACTGTACGACA-1|TTCGCCGCTCGCGCTA-1}TTCGCGCGCCATACGA-1~TTCGCTATCTGACGTG-1TTCGGCAACCCGCTGA-1€TTCGGGACTAATCGCG-1TTCGGGCGCTAGTCTT-1‚TTCGGTACTGTAGAGG-1ƒTTCGTACTCCAGAACG-1„TTCGTTCAACGAAGTT-1…TTCTAACCGAAGCTTA-1†TTCTAGAAAGTCTTAT-1‡TTCTAGGCCAATTGTG-1ˆTTCTATTAAACGCAGC-1‰TTCTCTTACAGGTGAT-1ŠTTCTGACCGGGCTCAA-1‹TTCTGCCGCGCCTAGA-1ŒTTCTGCGGGTTAGCGG-1TTCTGCTAGACTCCAA-1ŽTTCTTATCCGCTGGGT-1TTCTTGAGCCGCGCTA-1TTCTTGCTAGCATCTC-1‘TTCTTGGACGATCTGC-1’TTCTTGGAGTAATGAG-1“TTCTTTGGTCGCGACG-1”TTGAAAGGTGTAAAGG-1•TTGAACGACGTGCTGA-1–TTGAAGAATTCCCAGG-1—TTGAAGGATGGGCGCC-1˜TTGAATATGGACTTTC-1™TTGAATCGTTGTATAA-1šTTGAATTCACGTGAGG-1›TTGACAGGAGCTCCCG-1œTTGACATGAACGTGGA-1TTGACCAGGAACAACT-1žTTGACCATGTTCTCCG-1ŸTTGACCGTGTTAATGA-1 TTGACGCTCCATGAGC-1¡TTGACTACCATATGGT-1¢TTGACTATTGTCCGGC-1£TTGAGAAGTTTAGCAT-1¤TTGAGAGTACTGCTAA-1¥TTGATAGTCAATACAT-1¦TTGATCTAACTTTGTC-1§TTGATGTGTAGTCCCG-1¨TTGATTAGCTGTTTCT-1©TTGATTATGCAGATGA-1ªTTGCAAGAAGACTCCT-1«TTGCACAATTCAGAAA-1¬TTGCACGGAGCAGCAC-1­TTGCATGCTGATCACG-1®TTGCCAAGCAGAACCC-1¯TTGCCATAGCCCGCTC-1°TTGCCCTGATCACGGG-1±TTGCCGCAGACCTACA-1²TTGCCGCTTTCTAGTA-1³TTGCCTTCTCGCCGGG-1´TTGCGCTTGATCAATA-1µTTGCGGCATCAGAAAG-1¶TTGCGTCGGCCAACCG-1·TTGCGTGAACGCTTAG-1¸TTGCGTGTGTAGGCAT-1¹TTGCTCATAGTACGTG-1ºTTGCTCCCATACCGGA-1»TTGCTGAAGGAACCAC-1¼TTGCTGATCATGTTCG-1½TTGGAAGAATACAGTC-1¾TTGGACATGTGGCTTA-1¿TTGGACCATCTGGCAA-1ÀTTGGACCTATAACAGT-1ÁTTGGATATCGTCTACG-1ÂTTGGCCTAGAATTTCG-1ÃTTGGCTCAATATGTGT-1ÄTTGGGAAGACGAGCCG-1ÅTTGGGACACTGCCCGC-1ÆTTGGGACGTAAGAGTT-1ÇTTGGGCGGCGGTTGCC-1ÈTTGGTCACACTCGTAA-1ÉTTGGTTGCGGTGCGCG-1ÊTTGTAAGGACCTAAGT-1ËTTGTAAGGCCAGTTGG-1ÌTTGTAATCCGTACTCG-1ÍTTGTACACCTCGAACA-1ÎTTGTCACCGCGGTATC-1ÏTTGTCGTTCAGTTACC-1ÐTTGTGAACCTAATCCG-1ÑTTGTGAGGCATGACGC-1ÒTTGTGATCTGTTCAGT-1ÓTTGTGCAGCCACGTCA-1ÔTTGTGCGGAAGCGGAT-1ÕTTGTGGCCCTGACAGT-1ÖTTGTGGTAGGAGGGAT-1×TTGTGGTGGTACTAAG-1ØTTGTGTATGCCACCAA-1ÙTTGTGTTTCCCGAAAG-1ÚTTGTTCAGTGTGCTAC-1ÛTTGTTGTGTGTCAAGA-1ÜTTGTTTCACATCCAGG-1ÝTTGTTTCCATACAACT-1ÞTCCATCAATACTAATC-1ßTCCCAAACAGACAACG-1àTCCCAAAGACGAAGGA-1áTCCCACTCTCTTCCGG-1âTCCCAGCTTTAGTCTG-1ãTCCCAGGCTTAGCTAA-1äTCCCGCGTACTCCTGG-1åTCCCGGGTGTGCTGCT-1æTCCCGTCAGTCCCGCA-1çTCCCGTCGCGTCATAG-1èTCCCGTGTGCAATTTG-1éTCCCTAGATCAATAGG-1êTCCCTGGCGTATTAAC-1ëTCCCTGGCTCGCTGGA-1ìTCCCTTAGATTACTCG-1íTCCGAAGTAGTCACCA-1îTCCGAATGGTCCTGAG-1ïTCCGATAATTGCCATA-1ðTCCGATGACTGAGCTC-1ñTCCGATGGTGCGACAT-1òTCCGATTACATTGCCG-1óTCCGCCTGTCTACAAG-1ôTCCGCGGCAGCATCTG-1õTCCGCGGCCCAATGAA-1öTCCGCTGTCATCCCGG-1÷TCCGCTTATCCCATTA-1øTCCGGAGGAAGGGCTG-1ùTCCGGCCTAGCGTACA-1úTCCGGGCTTGACGGGA-1ûTCCGGTTCGTCCGGTC-1üTCCGTTAAGCTAATAT-1ýTCCGTTTAGCCTTGAA-1þTCCTAAAGATTCAGAC-1ÿTCCTAAATTGGGAAGC-1TCCTAACCGTCGGGCA-1TCCTACATCCACGGCC-1TCCTAGCAAAGAAGCT-1TCCTCCTAAGACATTC-1TCCTCGGGCTGGGCTT-1TCCTCTACGAGATGGC-1TCCTGCCAACTGGAGA-1TCCTGCGTTGATACTC-1TCCTGGCGCTGCCTGG-1 TCCTTACGACGGTCCG-1 TCCTTCAATCCCTACG-1 TCCTTGTCCTTTAATT-1 TCCTTTAAATCCGCTT-1 TCCTTTCTTACGCTTA-1TCGAAATTTAGGACCA-1TCGAAGAACCGAGCAC-1TCGAATATCCCGCAGG-1TCGACAACTGAACCCG-1TCGAGACCAACACCGT-1TCGAGTCTACGATTCG-1TCGCAAAGATGCATTT-1TCGCACCAGGAGGCAG-1TCGCATAAAGGGCGCA-1TCGCCGAAGTTGCGTC-1TCGCCGACATATTCGC-1TCGCCGCACCGCGTGA-1TCGCCGGTCGATCCGT-1TCGCGTAGCAGTGTCC-1TCGCGTCCAGAAGGTC-1TCGCTAAACCGCTATC-1TCGCTACTGGCTTTGA-1TCGCTCGATATATTCC-1 TCGCTCGGCACCAGCG-1!TCGCTGCCAATGCTGT-1"TCGCTGGGCGGATTGT-1#TCGCTTTAAACGTTTG-1$TCGGAATGCGCTCTGA-1%TCGGACGCCCAGCCCA-1&TCGGAGAGTATCGGGA-1'TCGGAGTACATGAGTA-1(TCGGCGAACCCAAACC-1)TCGGCGTACTGCACAA-1*TCGGCTTGTATCGACG-1+TCGGGAACGTGCCTAG-1,TCGGGAGACAGCGTAC-1-TCGGGCCGTCGTGGTA-1.TCGGTCCCGACAATAG-1/TCGGTGACCGCTCCGG-10TCGTAAGACGACATTG-11TCGTAAGCTCCGAGGA-12TCGTACCGACGTCAAG-13TCGTATTACCCATTGC-14TCGTCAAGTACGCGCA-15TCGTCTTAGGCGTTAA-16TCGTGTACTATGGATG-17TCGTGTCACGCTGACA-18TCGTGTTCGACCACAA-19TCGTTAGGAGTCCCTA-1:TCGTTGCTATCCGGTC-1;TCGTTTACGCGACCCT-1<TCTAAAGAACAGTCTC-1=TCTAACCTAGCCTGCG-1>TCTAATACTGCCTCAG-1?TCTACCCAATAGAGAG-1@TCTACCCGCATCATTT-1ATCTACCGTCCACAAGC-1BTCTAGCAATCTCCGCC-1CTCTAGCATCTTCGATG-1DTCTAGCATGCCCAGAA-1ETCTAGGTGGCGACGCT-1FTCTAGTGATATCGTGG-1GTCTAGTTATCAGAAGA-1HTCTATAGGTGGGTAAT-1ITCTATCGGTCGCAACA-1JTCTATGCTATAACGAC-1KTCTATTACTAGAGGAT-1LTCTCAAATCAATCGGG-1MTCTCATGAGATAGGGT-1NTCTCCAACGTAGGTTA-1OTCTCCACAAGTTGAAT-1PTCTCCCTGGGCAGCGT-1QTCTCGAACGAGGTCAC-1RTCTCGACGTATCGCCG-1STCTCGAGGAGGTTCGC-1TTCTCGTGTTACGAGGA-1UTCTCTAATAGCTGGTA-1VTCTGAACTCGTACCCG-1WTCTGAAGCACGTGGTC-1XTCTGAATTCCGTACAA-1YTCTGAGCAATTGACTG-1ZTCTGATGTATTCTGTC-1[TCTGCATACCTTGCTT-1\TCTGCCAGAAACTGCA-1]TCTGGGAACCTTTGAA-1^TCTGGGTAGCGCTCAT-1_TCTGTGCCATCATAGT-1`TCTGTTACCCAGCATA-1aTCTTACCGGAACTCGT-1bTCTTACTTATGCCTCT-1cTCTTAGAGCTCCAATT-1dTCTTAGAGTGAACTCT-1eTCTTCCCATGGGCACA-1fTCTTCGAATAGACGTT-1gTCTTCGATACCAATAA-1hTCTTCTATAACCCGCC-1iTCTTGATGCGTAGCGA-1jTCTTGCTCCCGATACT-1kTCTTGGTAACACCAAA-1lTCTTTAAGACTATGAA-1mTCTTTAGAGTCTAACA-1nTGAAAGGACCTGACTC-1oTGAACTGCTATGACTT-1pTGAATACCGACGCGTA-1qTGAATATGCTATAAAC-1rTGAATGTCAGCCGGCC-1sTGAATTTCACTTGCCT-1tTGACACTTCTCTTTGC-1uTGACAGGACAAGTCCA-1vTGACATATATGACGAT-1wTGACATCGAGCGGACC-1xTGACATGTAACGTGAC-1yTGACCAAATCTTAAAC-1zTGACCCACGTTAGACA-1{TGACGAATATTTCCCT-1|TGACGATGCACTAGAA-1}TGACTATAATCCTTTC-1~TGACTCCGAATCATAC-1TGAGACGTACCTCTCA-1€TATGGGTACGTATCGT-1TATGGTCTGAGTAACA-1‚TATGGTTAGTGGGAGA-1ƒTATGTAGAAACCCGGC-1„TATGTCAAGACCGACT-1…TATGTCTCATTGTGCC-1†TATTAACACCAAAGCA-1‡TATTAACCTGACCGCG-1ˆTATTACCATCCTGCTT-1‰TATTATGTTTGCCTGC-1ŠTATTCAATTCTAATCC-1‹TATTCCACTCAGCTCG-1ŒTATTCCGAGCTGTTAT-1TATTCCTCCGCCCACT-1ŽTATTCGTGCCAGAATA-1TATTGCCGGGCTTGTA-1TATTTAGTCTAGATCG-1‘TATTTATACCGAGTAG-1’TATTTGTTACCCTTTA-1“TCAAACAACCGCGTCG-1”TCAAACTTAGATTGTT-1•TCAAAGAGCTATCTGT-1–TCAAATTGTTGTGCCG-1—TCAAATTTGAGACTCA-1˜TCAACAAAGATAATTC-1™TCAACATAGCGCCCTA-1šTCAACATCGACCGAGA-1›TCAACCATGTTCGGGC-1œTCAACGAGGAGACAAA-1TCAACGCAGGAAATAA-1žTCAACGCGACCGGCAG-1ŸTCAACTGCAGAGTCAG-1 TCAAGAAATACTAGCT-1¡TCAAGCGCGGACGGTA-1¢TCAAGGTTACTACACC-1£TCAATACGCCGTCATG-1¤TCAATCCGGGAAGTTT-1¥TCACAAACCGAGGTAC-1¦TCACAGCAAACTCGAA-1§TCACAGGAGAATAAGA-1¨TCACAGGGAATCGCAA-1©TCACAGGTTATTGGGC-1ªTCACCCTCTTAAGATT-1«TCACCGCTCGGCACTC-1¬TCACGATGTCCGTGGA-1­TCACGCATTGTAGATC-1®TCACGGTCATCGCACA-1¯TCACGTGCCCGATTCA-1°TCACTACGACCAATGC-1±TCACTATCCCTTCGGT-1²TCACTCGTGCAACGGC-1³TCAGAACCTCCACAGG-1´TCAGACGCTATAGAAG-1µTCAGCAAATGCATCTC-1¶TCAGCCAATCCGTAAA-1·TCAGCTTGAGCTTTCG-1¸TCAGGGTGTAACGTAA-1¹TCAGGTTCTTTGAGAA-1ºTCAGTACTGACCCGCG-1»TCAGTAGGGACTATAA-1¼TCAGTGTATACGTCAT-1½TCATATGAGCTTTGTT-1¾TCATCCTCAGCTGCTT-1¿TCATCGACGACCGTCG-1ÀTCATCGATGGTCCCAA-1ÁTCATGCAGGTTCTCAT-1ÂTCATTTAAGTCTCCGA-1ÃTCATTTAGAAGTGTGA-1ÄTCCAACTCAGCTATCT-1ÅTCCAACTTTAAATTCT-1ÆTCCAAGCCTAGACACA-1ÇTCCAATAAAGGCTACC-1ÈTCCACAATGGTTTACG-1ÉTCCACATCGTATATTG-1ÊTCCACCAAGACATAGG-1ËTCCACCTCTAGCCTTT-1ÌTCCACTTTATCTAGGT-1ÍTCCAGAGCACCGGTTC-1ÎTCCAGATGTACGCCAA-1ÏTCCAGGCGAGTACGGT-1ÐTCCAGGGTATATACGA-1ÑTAGGGTGTTTCAAGAG-1ÒTAGGTCGCCGGAACTG-1ÓTAGGTGACGATAACCT-1ÔTAGGTGAGCCCTACTC-1ÕTAGGTGCTCGCCTAGC-1ÖTAGGTGTTCCACAGAT-1×TAGGTTCGAGTTCGTC-1ØTAGTACCACAACTTTC-1ÙTAGTAGCTTATACCAG-1ÚTAGTCCGCAGAGAATG-1ÛTAGTCGATCACGGGTT-1ÜTAGTCTAACAACGAGA-1ÝTAGTCTGTGACGTTGC-1ÞTAGTGCCCTCCAGAGT-1ßTATACACAGACGCCTT-1àTATACGCGTCATCACT-1áTATAGATGGTCGCAGT-1âTATAGCGCACGTTATC-1ãTATATATCGAGAAATG-1äTATATCCCTGGGAGGA-1åTATATTACAAATGTCG-1æTATCACCCAACCGACC-1çTATCACTTCGAGTAAC-1èTATCAGTGGCGTAGTC-1éTATCCAATTGGTTATC-1êTATCCATCTCGGTTAG-1ëTATCCGCACCGTCGGG-1ìTATCGATCTATGCATA-1íTATCGATGATTAAACG-1îTATCTACCACAGCGGG-1ïTATCTGAGCCGATATT-1ðTATCTTGCAATACAAC-1ñTATGAAGAATTAAGGT-1òTATGACCTTGCGCTGG-1óTATGATCCGGCACGCC-1ôTATGATCTTCTCTTTA-1õTATGCTCCCTACTTAC-1öTATGGATGTGCTACGC-1÷TATGGCCCGGCCTCGC-1øTATGGGACCGAGCAGG-1ùTAGATATGGACTGGAA-1úTAGATGGTTCCTTACT-1ûTAGCAGATACTTAGGG-1üTAGCAGTATGACTAAA-1ýTAGCCATTTCAAAGTC-1þTAGCCGGCGGTCAGCG-1ÿTAGCGTCCCTCGATTG-1TAGCGTCCGGTGTGGT-1TAGCGTTGGGTCTTAC-1TAGCTAAGTCCGGGAG-1TAGCTAGAAGGCATGA-1TAGCTAGTGATGATGG-1TAGCTCGCCTGATAAC-1TAGCTGATGTGAAGCG-1TAGGAGGCTCGAGAAC-1TAGGCATGTTACGCCA-1 TAGGCCTATATAGTCT-1 TAGGCGATGAGGTCTC-1 TAGGCTAAAGTGGCAC-1 TAGGGAGCTTGGGATG-1 TACTTTACTGAGCCGG-1TACTTTCCGCACGCCA-1TAGAAAGGTGGCGCTA-1TAGAATAGCCGATGAA-1TAGACGAAACGCCAAT-1TAGACGCCCGTACCGG-1TAGACTACCTAGCGTT-1TAGAGATCATGCAACT-1TAGAGGTTCTACTTGT-1TAGAGTCTAAGCGAAC-1TACTGAGGGAAGAAAG-1TACTGCAATCAATTAC-1TACTGGACAGCTCGGC-1TACTTAAACATGTACA-1TACTTGTTAGTAGTCC-1TACTCTTACTTTACTG-1TACTCTTTCGTCTTCA-1TACTGAACAGATTTAG-1TACTCTCCGAACAAAT-1 TACTCGTTTGAATCAA-1!TACTATGGTTCCTCAG-1"Gene Expression#Gene Expression$Gene Expression%Gene Expression&Gene Expression'Gene Expression(Gene Expression)Gene Expression*Gene Expression+Gene Expression,Gene Expression-Gene Expression.Gene Expression/Gene Expression0Gene Expression1Gene Expression2Gene Expression3Gene Expression4Gene Expression5Gene Expression6Gene Expression7Gene Expression8Gene Expression9Gene Expression:Gene Expression;Gene Expression<Gene Expression=Gene Expression>Gene Expression?Gene Expression@Gene ExpressionAGene ExpressionBGene ExpressionCGene ExpressionDGene ExpressionEGene ExpressionFGene ExpressionGGene ExpressionHGene ExpressionIGene ExpressionJGene ExpressionKGene ExpressionLGene ExpressionMGene ExpressionNGene ExpressionOGene ExpressionPGene ExpressionQGene ExpressionRGene ExpressionSGene ExpressionTGene ExpressionUGene ExpressionVGene ExpressionWGene ExpressionXGene ExpressionYGene ExpressionZGene Expression[Gene Expression\Gene Expression]Gene Expression^Gene Expression_Gene Expression`Gene ExpressionaGene ExpressionbGene ExpressioncGene ExpressiondGene ExpressioneGene ExpressionfGene ExpressiongGene ExpressionhGene ExpressioniGene ExpressionjGene ExpressionkGene ExpressionlGene ExpressionmGene ExpressionnGene ExpressionoGene ExpressionpGene ExpressionqGene ExpressionrGene ExpressionsGene ExpressiontGene ExpressionuGene ExpressionvGene ExpressionwGene ExpressionxGene ExpressionyGene ExpressionzGene Expression{Gene Expression|Gene Expression}Gene Expression~Gene ExpressionGene Expression€Gene ExpressionGene Expression‚Gene ExpressionƒGene Expression„Gene Expression…Gene Expression†mm10‡mm10ˆmm10‰mm10Šmm10‹mm10Œmm10mm10Žmm10mm10mm10‘mm10’mm10“mm10”mm10•mm10–mm10—mm10˜mm10™mm10šmm10›mm10œmm10mm10žmm10Ÿmm10 mm10¡mm10¢mm10£mm10¤mm10¥mm10¦mm10§mm10¨mm10©mm10ªmm10«mm10¬mm10­mm10®mm10¯mm10°mm10±mm10²mm10³mm10´mm10µmm10¶mm10·mm10¸mm10¹mm10ºmm10»mm10¼mm10½mm10¾mm10¿mm10Àmm10Ámm10Âmm10Ãmm10Ämm10Åmm10Æmm10Çmm10Èmm10Émm10Êmm10Ëmm10Ìmm10Ímm10Îmm10Ïmm10Ðmm10Ñmm10Òmm10Ómm10Ômm10Õmm10Ömm10×mm10Ømm10Ùmm10Úmm10Ûmm10Ümm10Ýmm10Þmm10ßmm10àmm10ámm10âmm10ãmm10ämm10åmm10æmm10çmm10èmm10émm10êENSMUSG00000025935ëENSMUSG00000025937ìENSMUSG00000067813íENSMUSG00000025932îENSMUSG00000054493ïENSMUSG00000025930ðENSMUSG00000032769ñENSMUSG00000092083òENSMUSG00000025925óENSMUSG00000032719ôENSMUSG00000067795õENSMUSG00000043716öENSMUSG00000025921÷ENSMUSG00000100868øENSMUSG00000025920ùENSMUSG00000089982úENSMUSG00000025939ûENSMUSG00000079658üENSMUSG00000097744ýENSMUSG00000025940þENSMUSG00000025779ÿENSMUSG00000101640ENSMUSG00000042686ENSMUSG00000100110ENSMUSG00000025777ENSMUSG00000099899ENSMUSG00000067780ENSMUSG00000100053ENSMUSG00000085125ENSMUSG00000025776ENSMUSG00000099895 ENSMUSG00000025774 ENSMUSG00000073735 ENSMUSG00000067773 ENSMUSG00000089787 ENSMUSG00000042596ENSMUSG00000025927ENSMUSG00000100538ENSMUSG00000043760ENSMUSG00000089914ENSMUSG00000099906ENSMUSG00000025929ENSMUSG00000041872ENSMUSG00000041859ENSMUSG00000102121ENSMUSG00000097934ENSMUSG00000025931ENSMUSG00000041809ENSMUSG00000041779ENSMUSG00000099971ENSMUSG00000067879ENSMUSG00000099827ENSMUSG00000025912ENSMUSG00000045210 ENSMUSG00000097893!ENSMUSG00000025915"ENSMUSG00000046101#ENSMUSG00000098234$ENSMUSG00000099032%ENSMUSG00000025916&ENSMUSG00000087199'ENSMUSG00000025917(ENSMUSG00000056763)ENSMUSG00000067851*ENSMUSG00000042501+ENSMUSG00000048960,ENSMUSG00000057715-ENSMUSG00000097171.ENSMUSG00000101314/ENSMUSG000000169180ENSMUSG000000259381ENSMUSG000000994982ENSMUSG000000424143ENSMUSG000000058864ENSMUSG000001014765ENSMUSG000000259056ENSMUSG000000337747ENSMUSG000000259078ENSMUSG000000900319ENSMUSG00000087247:ENSMUSG00000033740;ENSMUSG00000051285<ENSMUSG00000097797=ENSMUSG00000103067>ENSMUSG00000025909?ENSMUSG00000061024@ENSMUSG00000025911AENSMUSG00000025903BENSMUSG00000104217CENSMUSG00000033813DENSMUSG00000002459EENSMUSG00000085623FENSMUSG00000033793GENSMUSG00000025902HENSMUSG00000104328IENSMUSG00000033845JENSMUSG00000102343KENSMUSG00000025900LENSMUSG00000089699MENSMUSG00000051951NTram1OLactb2PXkr9QEya1RGm9947SMscTTrpa1UKcnb2VTerf1WSbsponX 4930444P10RikYRpl7ZRdh10[Gm28095\Stau2]Gm7568^Ube2w_Eloc` D030040B21RikaTmem70bLy96cGm28376dJph1eGm28783fGdap1gGm28784hPi15iGm28154jGm16070kCrispld1lGm28153mCrisp4nDefb18oDefb41pGm15825qTfap2drTfap2bsGm28340tPkhd1u 4930486I03RikvGm28653wIl17axIl17fyMcm3zGm28065{ 6720483E21Rik|Paqr8}Efhc1~Tram2Gm28287€ 3110035E14RikGm29520‚Mybl1ƒVcpip1„ 1700034P13Rik…Sgk3†Mcmdc2‡Snhg6ˆTcf24‰Ppp1r42ŠGm15818‹Cops5ŒCspp1Arfgef1ŽCpa6Prex2 A830018L16Rik‘Gm17644’Gm29663“Sulf1”Slco5a1•Gm29283–Prdm14—Ncoa2˜Gm29570™Oprk1šNpbwr1›Rb1cc1œ 4732440D04RikAlkal1žSt18ŸPcmtd1 Gm26901¡Gm30414¢Sntg1£Rrs1¤Adhfe1¥Lypla1¦Gm37988§Tcea1¨Rgs20©Gm16041ªAtp6v1h«Sox17¬Gm37323­Mrpl15®Gm37381¯Rp1°Gm1992±Xkr4¨+³Äÿÿÿÿÿÿÿÿ  deflateÀ%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð#dýin,s BxÜ(I}Ò0%‚î8÷†ã@å‹HÈÙPÝ•ØX¶š`ŽŸh’¤Æp¡©xg®ã€x³ßˆ[¸ó:½ä˜-ÂÓ Çô¨äË °ØÐÒ¸åÕ À·ÚȳÄÿÿÿÿÿÿÿÿ  deflate%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÂÝŽã¡é•¿îŽ Tô¯(âùÂ0‘ÿ”8SŽ@ç lHu»Pá€Xœl`!ƒhˆ&œp ,7x§1ƒ€Þ6zˆa<„ÛA¼˜_G± M½¨ÌR‚°‰X­¸ ^šÀ¸cȈ ÿÿÿÿÿÿÿÿ  deflate@%%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0 Rg?‚sÿÿÿÿÿÿÿÿ  deflate€.%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%ÁwØ6ø8TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€:(HEAPX09feature_typegenomeidname(dÿÿÿÿÿÿÿÿ deflateÈ;%z‚]PSNODp9øC 8M(xVTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿcdÿÿÿÿÿÿÿÿ deflateE%z‚]PTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýbdÿÿÿÿÿÿÿÿ deflateHN%z‚]PTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿadÿÿÿÿÿÿÿÿ deflateˆW%z‚]PTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿa¸_x^í“ÇRQ‡â¿À†/†d%H"I@É9#9ç$ð† »™^³ìÞuï„;U“‰¢è¹ +zã%DQNŸcÏMøÿسþ{Hø=ò˜÷¿Dþ ó®á7ÈßÂïßž=ø~ìù ?@ý0öLÂP?Æþø)î9üsÌ»À=c˜÷óÆÑ?þIì›B~ófà³Ø?ŸG~¾ˆüîYF~%¤ï_Eÿ|ý¨o·Búýÿпüê…èÿÒï)‚#_ÒÿO)æ—ÁËá˜WÒßë#öW¡¿:¤ß÷ õϘ_ƒz-æ×a=ú¿ ߀ý¨7¡ÞŒý-¨·¢¿ õvxGìy ïDý+îw£¿õ^xòýxß÷þžÈ"?ÿÒßã'úaþ0úGà¿á0oô­(""""""""""""""""""""""""""""ïÊ+üŸþx^íеVCQÑÈÃ-×Á݂ۿò]¸»-¨`jÊ™æ¬Ýž8„pœJ„â_>„÷áxÞ…÷àu8oÀ›ð¼ OÃ3ð,<Ïà ð"¼/Ã+ð*¼·Áípœ†;á œ…»àn¸ÎÁ½pÜÀƒð< À£ð<OÀ“ð|’üëSø >‡/àKø ¾†oà[ø¾‡àGø ~†_àWø ~‡?àO8àï\ÂI8‚‹àb¸.…Ëàr¸®„«àj¸NÁ1\ ×ÁõpÜ7ÁÍp ÜýŒ™™™™™™™™™™™™™™™™™™™™™™™™™™™™ýc_?˜umx^íÇÅR‚a@ÑÏ™ÿ|i[±» »,»»ã-vÎ]»¼gw¢Bª° äýD!Dþâ_øþŽàø#þ„?ã/ø+~‚Ÿâgø9~_âWø5~ƒßâwø=>/à‹ø¾Œ¯à«ø¾Žoà›xÏà[ø6¾ƒïâ{xßÇð~ˆáÇx^Œ—à¥x /ÃËñ ¼¯Â«ñ¼¯Ããx=Þ€7âMx3Þ‚·âmx;Þwâ]x7Þƒ÷â}x?>€âCø0>‚â <‰áãx ŸÀ'ñ)|ŸÁgñ¹|$I’$I’$I’$I’$I’$I’$I’ô¯~Þ]–—x^íÇENPÑOÒ}Ó+àZ(îPÜÝiq)^Üîà ¬È¬YÎl&/BøŠå„Ÿ>#!Dÿø~ƒßágø~…oá;ø~€á'ø>†Oà,| ŸÁçð| _Á×ð <ÏÂsð<¼/ÂKð2œ‚Óð ¼ ¯Áëð¼ oÁÛð¼ gà=x>€á\8· àB¸.†KàR¸ .‡+à8\ WÁ ¸®ká:¸n€á&¸n[á6¸î€;á$ÜwÃ=p/Ü÷Ãð <Ã#ð(<Ãð$<OG~gffffffffffffffffffffffffffffÿØ7ÅsÓx^™é®¤5 ›aß7Þÿ1™]šÒ‘ûŽÄ£$Ž·ØÎòu¿{<ïÞãó÷øä ÆŸfüÙs ñÕÿò9V2Ðäß>[mÀSýò_>H§¿>ý¤}9uT7²»Ö/žôÚ”¿þÿñœWFÝ@ÿ®µ€®¥¶ËóÏãƒo´oùâxã ðMZçvÝõ_}ÊVüøø°¶Í™-|Æ¥²ÀøÔÛµ[`Wë銥<µ%à§.œ“O}ø¡´_¥ŸõQZ}øûñ_˜ÿ>|Ý ú·9­ŸE÷NmvmÕµm×)¾{Òœ_ÝåUòšçÒ‹_ž­uBLWÏêßyÆ/!¼V®ñ1êxÕâ[í´ViOÿªcÑxÔ§ú»ýÚ[9ñÓãÃ:ߊù+¨³gÅΙÿ÷òµ®vŸ©ç‡ð4Fî³òÙ·¥îɾ^qùùI'·î¹ž#ÅÆª¶×wæØöá+O«<­¹Á×(ä×oÆ[7 øäáÔëÙ1y+móAëåÝTך¥·Fwž³¿¼øÐ˜Tï¯Ï±ww׿õÒÌõ,»l€ß2W™ÆK^û¾@k€¸šÃµ ¸{h©ïìµgï\À»–V•ç\dŒœgù®×ÒßwðÛ£çS}Øx¸´)_}þгoívl¿ºõÍzvÍÀøU¦ké½H.vÞX]¹¤¿{»óÀ:q/]kX™Åíâ—ÆY}ñ¼|æ»2­›¾]kîÚûèœãëP·±í°ýªŽæ™1ûI™ò_¶.ì7õÖ•(ýz«×yvn¡nÇ­‡Ú¤oÉßœWVï;ùÖ‡•¯n`nåÛ³`û}7밺ѥŸ½›·ÖÔåc¿¹^ù²¹iJÖí[oœž+;WûW½sÎ(W^ѹßý\ãµGV/h>¥—§ýŸß9¥›;Ûæ[›µ¥m­ëïúd~*Ï»¹Íoe}çÂÓ8î÷7iëKõsöà3rÞÂ-Ms¶¹ß±ñó¬Øyß êýëÙ‡ÿªËûÀØõÛÈu6¿o¡¾ÿŠÚ©ß{oï¼Ø8_v‹W9uÒÕë¾_;…1aîªW¨Ïøåú_y­ƒkìºâ±ý·jOè—ôžçµ#/4c¼ob[¾éSßÞ÷ô×Ðû¾kýÒV^ºöœ¿ò¬L74“¾§û}wA]Í­ü½ó6÷bc¼ó‚ßýëë§Wò¯ö}ÏÐ7€zºß­}§t}—ÎiËÿ1¤í9µ:Û·Ëïÿ1×Û¾`n¿—ê«ç`e®ïZu­þòl½‚ž{­SõÙï»g÷ûúr­Cô÷RÚ+w«kmˆž•]»:7û^[ÄâUŽAããÿ'K/¿ï­ÿƒ=‡l[ÿÀ="ºÓï«Î×Nulìíû»ûž¾¬Ç«§ë¸|¹âxõ—oõmt kÛߨ ÷7Úë}¡Î‹V½€½ºgêêÝ=Pÿ"x^•™çªmEÏ5çŒ("‚ïÿR¸ Š^ýÑÌLç4aíýáíííà >~wô/G†¼²ŒŸ†|22ð8‡·¸õ{àÑQ;OPÝÅ]|ÎÕ_¿Õ£]y¿záÁ•Nù'û;_Dž¹²æ¬ú•‘öøX[ú*½þ7x}Q¦:¡™FmÊ)ÛÑyk»¾0þžÏ_cåª×¼7GÕÏømæŒí³örŸ½h Ð+wѱ£Ns¤Lk¦­âèmý`ýdKÌw¼× «g×Úš?ykzãÚØ¾ úA¿êìXÝ­·ü€òµ¥lõv•G>Æúì™"/~_¹ÿúíßÞ‡/·6•·qþý¢Õí0²þ)üÄñMøk¯¹¬/â»ËgìÚW/ãoÿúLœÆ¸<À·}çzñÍgçÀ{6úbeWÆœšçöô´&W {.´Ø©¬y¶&êwä¼´ní“õ£q®ùJkíô×;ºr¹£º6vcaþ{ÖÍIõ_°zËßÚ6_Ëç|yóº4ã]]Ögy{Æ*×Ô— ·@]œoŽÕ[ÿª“˜ßÛgBëÁ|ébÔÎÓ™»çHßÛ# ­i{¼`ÜûfÐí‹•w¯wŽNÏôÝÿÖÕºë“:=ãYsþ*Ûz•_º÷ÃúÕ=zÝ+W^ È÷]QÛõe{HþÍw³6}s(¿¾˜ m©×{É<¶6æ@½?¿èðö]°þ¯‹Þø„Æg<ô móTùú*4žòÇNß4õç¿ègDw¿›Úo•o.êoYëµ¾~;èï•·÷`cº ´å³O¯~š#ãX2Å÷µoj¢]c¿jпճº€ö•>z]ùl-JÓÆ¯¯¹ûå)áÒe|=.í6¥ù^ß·Kó¡ëË_¡ÓgŒèPWýißv¾=|ÿõ»omyžêÙzÐ'GÚS/V¯ßóO|À“Î9Fk#½¹çŽp½ß{¶vòzg‹ë¹»¶/~Ÿ[çÎ/Ö¨¾•§>Á³ý¾ lu•¶rÜ#Œõá’]ýKo^r×¾€Ï7Ù¥oïêï9Âx½”ñ›Pœo%û°ûã²%®úÛÅ-¨ksйú=Àÿ6²Ìñ•}®Ïû^Z½öèÚ©Þ ÍËÊt½x ïÌ=Ã.ùK—=Á|ûRÞž»Õ¥,ù€Ç¾WßêWeÍeçSÏòסù”Öó `½sßw¢rèõýlÌÀ{gM{y÷XuKÇîõ»@׋ºßÚ×[—K~ýh/æÆ^=Ê.M~uà럯¹çh{|ý‚®ŽÒ}³–·~T~s²{BìeFó©_k»ºÖ¾ó•i9ï»~.;Oë=G/ž+¿¼øÌ¸½W¬Iul¼Ý¿Öñøkÿt_®Ï@ï¡+†ú舵¿'UN¿û ÄÅà.ïåÏÞ;ß>i®ôQÚ¥¡z¼£Ì™ùôþh.ë¿ñ]}²ào+æîÿúº|Íǯõæäš÷l|‚§{BâÈ‹±×vóá772ž# ½":Ê/®cÇ‘‡ï(ýÛ·µÓ.{Ó>å¬ROï+õ@ƒ§93ÎÆˆLßdðïï(3kû®¹S7ôþoáo&æÂ\^½'ŸvÖW/—ÙîUA\k¨ßý¾Ú8[“Ú‘¾þÁïwŒqʧ=æÖ«úñQ?«Sà?Dý÷²gßú¦OÅwÍÞ«üêÛÚ6õѹoœýucÙõê¿è‹{: àûÉkûx^™ÙÎTEFEÀ Â%ïÿ†þ+9+¬|©Óz±SU{žjèӯǫøù¿»Æo®QÜ·×XüÇ N¹•‘õëxüi\צ4ÖèÔÏŸ®yAÈë›~(§ÌñMü×üû‹þË üYækOYÆ7׸9‘Ž­Æ ø5¸ŽÒ×Þû‹`³úªczchüBuihΤ5NiÌÉ£|Îk³2•ëx’±.âZÓæ¡ðOä+³ºö‚q’—Ò æP?7ø¢¬ø­‘4eÕÙ˜Ô¥¬ý³y’î¨ÞÖk}G_èAp[SÖµQßíùÔ6u`T_m¸~›u÷ÄúU€íáÒú¦k`ss'SÁú6‡­[kÆ‚ú(žóкk£9nohký9Ùßzý~ÍÁ±ÍåINÛÂæ†úh_››‚þ»®Ý9rÎ\½ùT÷<<ò­NýðÌ’Oª§úNº„S^òYÙSÁ»ÏJs¿<³³~±î9*Ø£Úk\ö”çOý¨ÝÍ͇kDÆ»õÿBã<Áæ¨÷¸øÖzãe_èÿ)ww¶«›9¹Äö挹>y¬Ïø`Né{ão}8áêgæñnNz9ŸÔQŸ »æì"6b÷þ2Nc·w˜Ó¯æÛ¼io÷‘y—}yâÌ4tÖÏò‚¥o-ýYÀxä×ÜÕ¯ÊY+cò,Ø>v}zûVß\y¤Õæ¾ïtx ‹ÌÉîê[½€÷߉ ¿ÈýžÏü¤fÌÉ;yßóumÕæ½ãµ¹ö„Ö÷T?uí>º³¿o¥×Ïrcë\9FÇ(÷åšËÓ½Óx8õ¡ÿÝ µ+n÷Š<=7”i.Ì»=Ñ\ÊÇÞROc—ß¹6eå)®¹òœ)ïæ]š1š»Æò[æÄ³tààímmÕ÷Ê5Õµ´Â_¡ã³ºkØ}ÈÜ3fm2î¾hožgžã•¯ ùÔq·GN½´ï uœô×Oµ^oõúvܾ³¾ÛKðÙ¯{–ùÛq1·ßú{ ^{výŒ =ž)€¾tʧ^y‹ì!ýkÞ|S1·¥Ÿ|,”¾ß¥Ê£Ýí- ç˜wG}—Ÿñshú©~çÚí™|çOs\Àî߯¶û}DÝõgm­~W[Ûê0Âî““Œï´ú¥MbÁV¿4W›§úÊÜœ£Çߣж…­Ãh·ýÚÞ`^]ëWcôýflå[»ê–iæqeå­¿¥“rdÏjcù\ïw6i›¿žw»ÿW®4u˜“ÂÖ°z|'ï`ý~&×·¡²®7Ï@s+<}ÍØ;Y½ŒÞÙ®9ój«oam9Wwõ·g¶W:/lnúné~wÊGm÷û ßé¬k}P—9ë· úV›èoÞ÷7ÏIØZ•èݲ½gŒàíuãéÝPÛ­ðçãë9Ç;mßÎ'{û~Zí›Êûþž¾}åõî?Ù¯ÒšëÍщ¿zº–§4{Ø>«ÌÆü,­ÃžqåßwGéÞoÞóÖxmÔîêØ»S»+ÛüUŸsßýðl¿”¿5¨'ýÄgl}'žì/Þ|ªÃÎ×øíÇS_®niŒÜ«ÏôÝÛî»ê[~àký:oí-ßêöÛ)?õ±wZãU·öZsÆOרmk\{½/8ËVWõuoœ|¼‹µ'^ùÆ¡“-À;£8¡ùkmèŸî c®\õë«}S]õä8ßÿK+Ou-¾ëýº¹YYý:ù×Z û»îä[õìq}ë{è÷¿›˜x^…™Ùª$G ïxßÇ;ƒßüÿ¿è ¨€à ¾~©Rj—R•ÕýáíííÃ'øì|þà|\>dÊóJÇmÙoŸ•çâ».”®½¥ãÛw¡wŸ½Kÿú^ý°o®~ž=äØ×—êù>¸<Ådå¥mL§qÕÿê°n_>øUÇê®Ï<#'ñ7†KÐ|üùúÝZ_å™õ§×çW½‰~õcó/?úÕÇs}¿pxðoŽ}`chþéGù´-/{ð·xã­ìÆÞø¶ÚU_cV~eÊ¿tàÇ‘ïŠö°g¨óeyÚßÌôÀÏÚ~ U¦°4sZšçVúÖO™«.PN]ÿß~ÖoV þ5ÆË&çQysÝ>)Ýgòè~k _2íSi}^_Ú«×~ëÓ>ÿø¬õ¸j¥®êy•'zgí*Óy¶z€Î>kÅ~{Âú3#º']¹ÚÙ8ꟸ|K8‡Ðw¿q\¶XÍÑÆ²º^åp¾ö":™“Ê;3Éú.½g.ñ¯>+¿ùlÉ èKgÇÂÏž¾:[͇º¤öCó¦}öŒÍ¹uÕ}}šñʰJ—¯à»¼ñ^vvïŠIèŒ4®õsõ5fžywW§¼ÞÑ}ÞØê¿8y5Ê8ÓÔg•oqÖú ®Ú,oç úû®.Ÿú.ßës}¼ì—κ³X0öÖNÙÕ×øë_cÙ¼þ ^”ñ>Ïl¯þžΚ=Bï•o}C¯ºÛ§®î¯<´?ûv:‡ö¼ï¹fÎZ¯ËŽôú±þƒ÷ÞP7d=S«gã8KêÜsVŸŠW÷õΨç^Ý{÷jäqû`ñúé]·þ7îÆ®Ÿµß}ukoû_ü=P§²[{Wße8µÝýÊÛçúÚßÀzäé{hoþê›ï¶ÖU{È<4VeÔïÞÆß½=/@k£ÌÒÚ/ò¿>´ö?ÏÍ«÷'Ï®ôͳúkG8;úÒ»‘r—l}Òž::Ûä1ÏÎ]åÜ3Ÿ«ß¨Cß–WhýXí`kî=µ}·½¥L×΋W¼Ë_»îµ>+»Ïû{[yô›µ=¹¹]Yæ¶ò{VÖ7stÍ—þv¹5¨¼ëÞ‹ôã=9€~µ°Óš¾Â='Õ}õ©¸¿}9ó×y/yÏÞ«¼GÁ¿ßªË¿´æÜýž)í‚ëÇê\]¯žëTyõk ØïªKŸßOì5ÿ彿©6ÀûûOsäsqtYïhÂÚ¾ü•ÆR¦s¨<é´Þê…†¬ý¶_=[ø¡}ólÑ .û}qŒ®ê(°·±ÿ“¾<ú ˆKÕ[»m•ÕŽòË×XÈ£±#ÿ)ÝK—&¾1úvmVÆùêÕoñÓ³-½¾6Οӧ­ï]gQŸ6~ì®Ïö¬Mêk×¹úä«=Ú"Ÿ¨¼0Ö09ßʯŽWôöÿþäwýÓwá¿tv-h•%7Ь3yŒcó~{òÊS=µ±9ZÚ¥{y{†÷xs%½rÆ·v]góÀþ« åZ‡ éìïÆ_K'gÍy× ^åõËZ`Ζ9ÏÕ]+@œòK¿ö»±|¾Ú—Þs³<•m\מÖ¯Ðïå§u®˜Õ%mëhý¿ú¶úÀ1ÆÖÍB9r¢_»¡¿§Ë<¬Ÿ€ý©œy¨Ý•YyÇ=ó*[ðQ¼º—TW×ïð!Ï÷je×·âZÓ½×ìüúÏ=#¬£æ¬÷5}­Nïø¯çh¿5œßõíxë²sШ!¿OÎAkó•®ó¬0Þ÷tšÓ]ËŸòpfÊ‹~¬)æ ³ûÆ í¾Wïå«¶ë7w§úYÞKÞ>û\ÛÐÛªË8ÍËê·ÿçsÜ}TÞå¿æ…w`àݬòt]¡ë‹<=?k‡ø¥í}e±5qé|ch¯=¶ò´ÆgÎôÁý z'Ò—µ úAoãi½éû®>iÇš\p.wÞz^ß6?;Þ‘DyÍÉ%»þ—Ï3Ø8«wm”Î9tñìd× 2;W({Ùæ‘¾ß¬ò/˜³F´¡LkJ^ÚæÄùÊQK´W¬¢ùï™Ì£skkk«o5Ú¾ƒ÷ÍBÛ³‹úéï úÕ¾0¦¥ù¶‘ý­muì¹â}Eì;yQ;×ïÁµ<¯@w}s›óæim{ÖÔÆÕßÖºÛ< mËSyæ¹OéK/“W=׺ëåÊØzvÜúSÿƦŽå/^Å­Žú]¥££¿åyx¥³{E½ÆZ;¶½Kï^½l˜ÿú¡Œ-õmmv?6—ô¹ƒÉÙî:‡²ÕåwZÏ÷]›ú½>ï|kž–z&¿»®ÍC}«^ãûö/¨Gc{Ô¿¥igeÊsô=W ïD»?–ïÍ|h³wsZ_È™sÕ¹þ–¾´õôìmÍécsCß1mkà£{´uQí¬Ï«[úÆá÷§yZ™ ê¿êñz‡¶¿ºõ¿öÍÕò‚þÒ3§9µ妺]£Ýw ï+ïšÖ¼{U=½‹ó±õÑ<ù~Roý†Þvi»Žý&éy{{ûê>{§ÏßéÓ×|ã'/ÚÜkν7úN{Æ1^ÇýðpÆü‹wúR{ØÉhÞo4÷Ù0˜kz!ö!ö¾~à,NæaìËOpðƒ=lÿ=kÇ}¬9/8ìÕËüý§»†±8Œà³œçècßó¿^ç£ù9ˆ[y;"âuatœý?¾ý·.ªöuäü•®:Y½W†ùöocŒgözýÛkà[c[߯šûŽŒüaÏ–áPSõçòÁëî5G=Çwl²í»£Ä þÖ.ȽÅsßð/{Ÿ¾Ù˪¬÷æ7:¯š›mÈ@O:Áx:/¶×›»¾|f½ìÿùâ¯>÷Ëß¿ý›3ç¸ã¨õf\Û0½î=µ­rW×ÄÝqn½8æëÝëÚdŸ×KàmL/œ¾æ…z÷Fëû¶_³{ 6zl[c±ÝŒßf´mÕwÑÓùögŸó@ÎÙsýì/–íž}ÄwÄ<àRG­cb쬆È+Øð7G¶Í>Õæ‹ÊÚïŒîƒ]œ’ýì]_-Y±ÑùËk>ŒæßõÖX?‘χ×|›Ç½Á´~ƒÜµïšqŒÈßèõòU ¨ëQùÀô7Ñϯ5Øð®OlÄÆ¹Ç}¤ûâ#?õ ­£ÙDÏó>²WÔ€÷wët_ÙÜßs®;ëAŽóÚ²8n\¯µLk¯ß ž;Ö¶´w—;òtJOûÄuofy‰ÉFçlçŽ[1á3ž××ÀâÎqæßÖ³Ú_såZ©­Ü…gÃp>ZoÖíþäßsãoŽ·×;ÀÜ{ܱ¾¹ÐpŸj˜óÊÀ6ø–ÇwóW¾Ø®kbTÙ‹ϋʃ­à_o+|Ž‘e/^¯¯ß à‘|ï<Æö7þæŽåFþ0öU ðQ÷`¶þ·¹Ïöþ´z¿Û›[ãÕnË”¸÷Ý¿È|þ–49†Ý¯žòU¦wÁáûÆ{ðÿ¤µs½ÑýßrÈ}d©g®CðFŽïÕ/éu›;¿È^:ÁöûH¿³,'(^©øà‘Çš÷ß²Íúì£yÖ³˜÷oMàòûÝÆ2]ú?ú;Ðè©gâkïùm·OððŽÍw¿—Œ—-è^Íú½*Ÿçã©¿>»â´ýÙÕ~Î]±¬Ï‹ÑõܶÕoh²Ó;¬ÖÒè)ÆÅìý­^óºg96ôÞòCÎÉlåÞõÜïzcÚÖ¾]åiþÖ·ª÷ÒáµyýžX—e¹ëÔºïpó=<îyð=²-Äžsü~ß ô{½oáÉ’ ç—}ä°Œ<~5ô„¿ ‘1/~øžÙÿ‹ŒÝ³äF–ù¿ÿWØÇ[[+³ ÿÚ÷à·Žæ²äß`Æ»j’\^11ï%;ZÝ¡ƒœÏ.ßg¿{ØåßÔ¼±©)æ–·½ö‘:±};§Ïñ& Ëœ±ÞÈoJßÛº¿açd_c{4i½þf¥ß cmî~çÞh>ÿö5¦¶LŸ3G[9oܽ³8¶©÷˜¹qÚSg÷”Ê?ÝǵzðËv³÷ô–AþýR;/~ûöõo;ÁÝØ;fÞ즆‹}É·±Ãø®Üƒ>þ„Ï^¿+³sî£m€jç¥ùþ&¶¹ãv6 ‡¹É±19îO¶’#øxO‹Ç>X=¯Ï—MÓõ~[úx^™Ù’]5Ç`À6»yàÿÿgp3"£¢ÏÀC…tÔ­êE­åÎ|~{{ûðÂ÷ßðÝ«oû1rú+gNeŽŠ Ww9+—ƒo9jãÇÑŸ3]ûr¶•£cà×÷Ægßï_Þþå@ï§è\~™‹f¼úyåà÷Ñ-Ïê.žòY>|«ÌX×'A®7×»ú¼ª_;[3àç×}ò}q›ç²ÆL\Îqͱ£Ê]í®/Ú²Ïú£'öä¦ïÒ†õQ~ýÓoy­qðgúãòi×õI¦­+¶ê,GÛžúµù2Ÿ×b<íårÓw¯Ñ¿|·~k¯¶úý_ñ-vß>aã³%»:¯º…ñ_2¹”µ/Zã=¯ÙcÕµ6±·u§¬5m œòÓãU¶¬ëž=ìç«–j p¹÷Z»—kn*¿jÆ3¤¹rNÛúV{Õ)ê÷QÁ<ÖäšÓþÖî_ÍÑò3ö[Æ*ëwk@¸Ÿ÷\\Ž]ýxÊ7 ¾øþ™sÊU{ý6ß»Ÿ;¿-Übó¤Úì ~ônÜZYžäµ}Åc÷ìÅS ×ó÷Í»6ßkÑó]÷ÄU½õccÛ½xùÿ§\Ž]gÚrÚ'[Èü²|ËStïs¹×o¹—Ï}h­*/~;Þ:Û{pcs¬¼=«~|éÚ¨ã»VžW»¼»ony®;þŠ ðžPÖ·•Ÿøàh¬õ¿>ÐßsÔ¼mþ›Ïþ>íuåû?g9ðwGýYÀ»wŸãö÷¼,Wõ6îêÏæœ6wŽwžr9¼§:NëûÄ9êÕÏÚn¿h|Þ«ùìÚ+·o¬¯cž»Æ]Ç î]ý«½ µ¿2x.yù¼³7îæ´sÙ+k§ó¯õÔNçx†‰Ëÿ¢÷AëÏY{÷ŽîãêmŽ®¹›¯ú°ú…gŸvÔ¥Ý5–ÙÞKÝ~¯Í¯¯¹Ô"5ÐwL¹ æ‹æ”=Í5õa×¹ûÓ½¡?èv>aó©o»^ê­¯ŒS·;þÖ¦k]ƒêíã\ÝþÆì›–q×Þoe­9ô§v'\“êÁsÅÑ|SvýÔÙufl9®|—ßxô³²ÖÔż«;æ¼Þg«ÜWÍuí·¿sä¼t„¹Sg÷¸ð<ñ›sÂ|ßµ¿÷ {«ïžkOí\}[4W¿1‰ú®ÇÌ‘þ´Þ xñ»ï„êÕ—Ž{möj¹ÊSßÊYnï¦ý}²±m×l ¶ìuëòú[‡í•Ó…<ë£óùÞ=º@Ÿjo¹\³'?v®÷´ù7gí#òÍßPè.7pœ[®CÓnýwn[±5Qh£þ\z‹¿_mý½òhÝ€ë<[l^–¯1VϾ>¼÷&_Îõ yëfc³¿g`±k´:|[KåÜåþŽº|_.až;ֳйêìyÕx•­ýåwí;z—ö÷míëÏ“Ûßk¢óë‹<´] åû¿ÊÚè>ý-ö,±õwú{5±o)‡4&Û¾¯z¿òí8ð~¥ïù!ãúãÞÕúÙ÷—ò§VÎú°µ%¶µc[ý]7Ñ=ƒÜ¼ýªØ—x^…™Ù®7 ¯ã,ÎêìÈÿiR@R8à\?’Hêp“ØÝ3ÞÞÞ>üG_=ãÇgü+kyêHdþmt¤¯³×9£¸ÅcýÓ#wo±ÖÎ7á¹_lI d¿>#üïž±¸µ³Ø?F&^å?D¾qI`£v¯9ôéáuoI_Œýæ|ã€~yøÝ™»æQLy›ãõcôÌèGsÒü1§ž®[s1­7äyosM­üõÆAÕéHm«×ü6Žê´^­ùq/:ëï×úé—<÷Ô®Xê‘Ë›ó ^©ºœî¹ìjÇzµVæ ½Úßü±ÆŸÊ õ™Øå‘ÓÍOí5'ÍŸ>[×??k0”­ýb³9(ŸüYë.÷|ªßœ8JÝï^e~õ–ÜWù÷¯>4Vå‹Ë|sR;Õ‘Ïœ{ëº÷E,hýÿ-¼Ë>*ßÞ«/b÷9VÛâ¸n¿„Äcë¼xæó¨ÞÖQ{ëÓê:î93oîk¿w?==ìl-Õuoñ+_Ý’¹0NÈø®º©SÞçgs|¬«[_ÿ’½ùåOi1Åh>å­íâðt﹤¯ŒÍ7<î‡øŒí­Åpmýûî(_Ýæqik];öùëCÏ,8k‡þb¬×}.ç]ß•à5oêÊk^¬ÁÊ”C}Öo=‹£~ñôOû×l{ïœmÖVÇί3^ŒµóÏÛÿýؽOõÉš©§oíÆâ°<³Ä¼¶»ÏXú„Þu¶­ï'«×Ü6øÞwiŸ7èˆÛ÷UùÎÕßÖ‡kyVšŸÅ‘·ò+ÆbWŸyßsö.wn_¾|èºûVNz66[“õAþ¾­ÍîQF7>é:Œ{ûmÅn¸ö—´lû ´÷ú=þ…/õ;xõºî9/ŸÑ^lÙ‰ãl®öª>Šß:Ø+´Ý}ëŸ69sÆ}=7¯÷ëWä»`ûæµ×Xv¿ÔžyáTfL‹µWjoí*«u¬‡:Å»lnÝÌõÚs$_Ö¯>*ß½¯H=úÑöyÉÞÒü)[»ÎÑ>×\]÷¥ß”=SMùöäë>•ôÿÊË®Kô¥Ú®Ý÷{x¹÷³¾Ô¾1•¿yn~Àj-Jè^ߦ|£(ïùÎc¯†W_Ö×å+c¿G‰ã÷ØÖµ¾×gÚuß×ÄßÑû ·9üynÌŸ{ÄÑ/ù¾‡GûÞ=¨ß¢Õi ä·âï7©¾3÷¿|ïYÖNcZùRcú’~í©ûÊü+‡Æ³üæakqÙ½rí{FqÖÇ}î]ù„È>ï3ïv1{ßKÙûÊvùÞ¯â-¶¼ëYê}4¿ûŸƒ²bT¿xÍíú$õÛñU~œ_ÏŸÆ(Ïÿ «ã]ÜgÃê¸æ7´Å½l•Wÿ{÷yåü¢/éšÃýÿfsç»Åoû:µY}dýönÕ.£½Ü=‹Õ3Òýêþ=kílßPî9CÎoÖæ¤çÏ9ÄïgâáK¿áÕ©¼~úmUAj¿ªï¥ú¶|Λòêç…õž¾*ûsäÛ£šë³~1¿î¡Ôý¡6SúGjÜx^™×®dU ïsð@úÿ¿„%¥’{@‰ìècñ€7b\¬ÑgÜæÁ¬]X^ÿ4<—ŽñÌfìÃ~cý 5Ë~)^ûl¿,7j |ßJvXöÃrÌÛ·ú=úFü¬Û&ú³ÍóÆ1nù±ß›bÙž/ž~íiÝ_ðëCé»g}±·ïpwÓ÷üúkÁª¯¶çóƒãµ[¯5YœµŽ›ósùñë!kùbÑ7ÆÅë|¼ç+C-Øï×Êûõkxÿø´ÕïœY§u¬Æ6G- Ë|•حŘ??ò&jÕ¼W±Fõkvc}plwý†ý¶‹ñ%KŸ:¶ÿ¯d¼îü`ÃÆ×¹P>ûtQkË´äþµàVÆr­?ö§ë“3þ•þbÛÞÖ<ðÇuãz~¼»¼fþ^µX_Æ·ó—8L'z³Þë®Õú‰}ÈÚFˆs;9;Á»Î•Úî9û‹=ëÿööîŸè+÷21qNÊk¾õ§Û6ONãúõõó>q0fsîØ3·Öv›×º<Ïš÷“ç¬Û8WÞL?I†XÀo¼ËÓæº×÷fC¿í¨|ãüËӲ篼¶7lkq‡êA·ùba>ð7ï:y…ù~1cÎ:ââµÎ}õ´ö£60æîmÞÈCu47ËÚ½íÖ"_{-Ç|uÁ³Zq=Óx•-ÿ°F¾ˆr¶a¼—x‚qíåW´Z¸ò~ÉvŸš¦—ýS<ÇYÞeæ/câmž­oÿ0g]Ô¶…w&ctSÇ[ëY^[¼f½èF§qvWÀÇ÷¢e±·gëkç/}ߥøãó¼ò&æM`¸öšgÆÎöë­»Ê2F·ïx®¸×GZ÷+óŠê²®%ßyÆ®¿Ø¾–ûÈ<ÆöøÂóß”ì÷êºöÑEØÕù½ 迯ý[‚óBÞ*ç3f¶ë¾ì¹î{äö¦CÏd±¾öáwŒXçwÏÓõ÷ž$‡|w^öƒqunìx4^¶¡sãûãiK¿±Ýš¿Ã{FÀ»½·ñä‰ÕeGmZì¨I¯#?}|^ëgÛp{ó^þÂo,ô!W]³©¿¡¸>zÏ­Ý:óİwRutŽBæjK{ƒâëûÞ“— #dýÛÒ«Ú5–e™#GŽ?cÛä¸{ä{Û11ÙŸµýÞ°m¯j¯x³ë’m.Z³ÛÏ6×B}m.ªËuz‡•«üÛšÏW¾9?×~„Š×š¸xÜá¿ýü·|nü-c]¯tzíÕþ¯üçæÿÑß1ĵµ2âíèZŽyÁµØö§øFøê“sÇ¿ñ¡Ï7•±.ýÄǹÝÜÞðÁÿZ¾oF>Ã̳5ÛÇYaŸÞG=ï!dY¿ì¯Í|/³ç­ÿ•-v÷yð×߳Ϳù÷­E½ø6ßeÌÃ>2¦õ7É0¬Ç6ùÍX=çœaúY—ßÀh]@¶½:Íë·QkÊ8ký½h¾Õ(u‚=—þb÷=‚Ü+ŒÊ/¼ý®·ÇEõ}Î~È{ÃoËK–˜AÎ?qñfDyãú^ìÿH¶Ï6p/Ì×32–­ý½‡ý›ß–1¾ó›^íù;‚X:#æª {]—-¿?-:ÊŽ÷'çkðObl]—aõ‹x^…™Û®7EÏ!ÁSþÿ+9Kê%-m¹‡‡’ír]·Ë—žy~zzz~¡¿®öÕ ½½ú¯´ÈÑ—þy¡?¯¾s´o®öƒŽcí–>\í»ƒ^uhñ¡û•m>Ú« c‰8µuòYÙ—÷yx•5ÞÕ…ÀOÙm¡¿¯Öø”ßX~7f­ìKeè[°¡Ýõï1w·ÖƬ\ÛS ´ÆÊØu<Ù=ùtþ}ÆõGÍ‹!9¬®6[SêÃoŸößð!ìóÚÀ§~¹xò•Uïã% ‘¿üæQ‡5 ýwÉšGã…°)¿g@e–w·f⼺Ë+Öå›gùž'ŸædÜ;·9çþ¬LõV—¼Äpc‘ŒSÝÅ ~œ·>V¾±Ôõ…,ë †{N;}ç83*Ó³§òµVמcy{ìyVk·úÄܽ²öOºúÚùSµ׿´¾âèÞª¼çbI;b¨Íb*ïSôôAתºàÒõçQÞsrq¢~h=ר¿Æ§¼cí§gwyê [ìÖ÷#BvkdI{wX׿õÕÜ žom™óLòÚ:í›ðN¦¼Êq–â^³/ö7ž!Ú“z>Kç÷Ì?µË“Êï[¬rú•çÙqº{ª÷¼¶Å˜þîIez&ô?bhϨ%Ïfäz_4ž¶»¿Këð_ ¬x^…™G®1¿sÎiçûÓn@ iÑ çåÀ!©Ñ³§§§çÿñLãûÛøò†ÍÁd äÌ7íõmþB°Ü­sË1ŽÿYr¯"¿çáÍ?ÙæŒo7Þä¿Jþ£ù=Újíw’Ûó߃þèô¡5üx£¯ÆDß8ÚæËìâ×½Y½ˆÍ1Ì.²õcù‚Mó³ù•­MžÉ ü¸ÎϺ“¿êÅÖxåÞ½¶]_üU§vêý6tëÔVe'ë—ÞU–øL_-Èçô¾R[xØXÌøiý©o}ñþ8lÚ篧³mçjšé¬½áèäϹò.[ßqmܺh>Ãêà½ÄõÄΗÛÈ;wZcùŸdŠÊ|:È ôΰšs‚Gƒ×ƒsià ¬÷®Oë79Çç÷Ãör¥Þ¶KŒØf4¯1yÛàü+lc{ïj÷è.¯±bŒÞ3mà\ãyky#ûòâ¨ÍÚ°_Ç=»ÖåÙ´ùc]CÇ9}—g𩦠W5ñ» Ï{ºãtL›{?;Õ‚5j]Ûl<5Ã^u·&œOmпÆã=¤vwî6žÖí*Wàþ1Ö/sÞËÖ|x§ü6÷ºÝÝ8·>m¿O˜î›;ö˳—»>ø²MÃúh;¬¥é±Qóì{õ5¾ó„U_ïñ]›Äo㩆ømGß^Oün9žÆV­ï•´ÅZ¿£ï™O6±{:'ì§þG«k£wšúò3ñv!7:}ðšwŒèÛ¶×[e~ƒçä‰nõÇGß~,sÒÛ3µ"7ÖKeO6Ñ»'ï¾×Nk>ðžGìU‡ØGcºÇƒæç­ehWö-?ø¼n?‡­ ÖS×´mW¯k ÙÑÙK9ÅG,ô]øî‘ÏPzqŠÏ1a»÷}ÞüÙ'óÆ }ïò½{¿“ýN6®^ŸÐ¯°Ü‘aoÅ®åšKa?¾³Tnx´Çã5ûØ=ŽÚŸëÀsÏ›úô=ÿ^ÍFo},Ë|wæömûŽ{óî¶É{9[ü~sœ­#ùœ¾…ŒFý'W]ìRûÍùv‚¬ímäN7yÛc̓õ¿ÑûšýØîh=ó|Çh=Çó™æ>¶F}—ÎÈodlÂ+Æó˜ê±çõˆ~»'cð¾PtÏ,ÿTbâ÷€åN1tóIä{’Çüß^Wqî'ö6÷÷è~7 hÎ{p}O±Ãë·Ç1˜WÛí!²ì 6¼Ï ‡œé=_®ú>½Þ£·çÚ–ç{ m\¡¹¸^ðögç¿q nÞSëÇß©¯z°ç5S™b2þVà¼6çΊœßkû¨/×°}¾Òi_«Ã^bÚÏȹ–¿osïµ?¸^]k'ì«û7tÍbotöõ¿¶‡Ö–³Œo­Ôâž~kç˜Çšz6×§¶[WW°/¾™Yît6T¯ó®ÕS,öŸÊØ®cfîZ ô»½AÀëýÌw é8wçว—ŒÿèÎÚ~z/1z¶o<Å,Ë]œ¼îéú\´¬,ëÒý¨ÛF÷Ö5@›Ô÷v²;ïèó±/â„ßÑ2¦û7)úŽÝÝoà]õÆv `osÎÃyÖžãrgýñÿo÷>ÍÓñÀçÎܸOýÜœj0ð¶w‘¢±ñÜY×£³ÿnÎïâÖ×v}î@Ÿ|.þÀ³x^™ÉŽA ö}½pàÿÿž˜¡PV‹ƒåLïv:]UÝ·ÛíÉxúˆŸi=x¥ýðø–‡6é×ÿÏÛ¿|z•oœðO>Ù¯®íëö±œ®øƒÖ”u{¯{Ë¿9È9÷õ˜÷ôKs?Á‡ÛßóYn®…ukcþ†§cúIþ^¬Ý³Ð¿…oÝÁ—È7Æ{Àý4`‹^åÞ«ýô‰Ék÷9ûÆî2LŽº¢Ëú”çúlëadÛÈö^aÀVe¡q>ðzîîùçNëè<êk~FƒNí\{רµ…6ÝÑ{Ñëy8žò®`²žÉø¾gão@MkêïZræØ¤vîEôv÷XSë²ï|c ìXKÏ€5ñy^Û–Áq'Ørž Öœ¿Á¹4çµ"n÷ã•ÞU ~vý±ï:~•|mM–y][­Wó­?|èxfýx”w=<;ñáç¨g˜ëfh¬Ø‚î˜{¦;tkcr«6<§,KÎä[{äÐy~’i.Ÿµ¾êb¿³¾uûž=11'š–54Ÿ©{²ÈÓ ð:—K{šžòÌ"–ÞžîCd[—ÑÜo¼Ãl}’ž¼û©2}†~”¼é¶ãºz|ùÓ£æWïèÀ£îµëü –·ÞÎeô«~¥'j¼{g¿î¯“û^cÛ»Eó¶o¯ÍŸžã=ÝåÁîñÒ»£»G‘m=© {¾‰ŽÅú­ ó »⟠ëõKs¡n=æòUÝü ¿µëo9bõ¾ö|F¾»è:ÆáÖ¢6 ØÙú×ãž;ÔØ&CoÍÏîpcq­ìƒwYÏ1Ûµh=k¾MðWÐád*?ðŒ?=‡»¦WÊsŸ×ï€Ü3 4Ÿ5­ÍÆã¸Ð;atZÿöËéù^>¾Õ*c¾õê»ö¼nÏülÜœqž¡÷¡þ <÷™ý[×7tÖ®­kåD®|÷ ôí÷ûÙøôkðdÁ}_j йÊØ»Ð|ͳÛö±qòì²ÏÏäBã²íÚ3¯ßË€ßmÛ>·gþ_Ýåáåͳ²5¶-úÐù8VÀïA~Çpœ›ÄÕf{txõYìß\7÷ÏÉG×õ³»H,ÄÛš×¾ûÇw Ü;á8\³Ñ— u(õbb1oÁÈ:¯+ú0ç<ýS?×úè “2Η³Ù÷*wαþ/œf8`«™ã…¿8ô ´úaö“Ÿ}Öoý—²‚ÓL¸ê/øµq¢_åˆÍöÂâhÿž|ï>{Ž˜o]Óƒ}ÑÈ S—ÞA€Yb±aøm—µ}¢ƒæÀ½ØïØç;ŸŽ³{lyÏÝë¹ü~ëï@p¿1Ñçw0æ ³¥µ˜.gÁóÒq^õ7µAÆõ«¬å­‰ãBÛ¥Æìyw¢Nätò‚>/¦Ç|b ½° øœ×xžwÍѶN±ôb¶ßaÎÓçŸßÅØŸj\àÿ‹Ðéì¢&Ãû“íŸãêsÎ2§¸vÇÑÙ¼¶~¯‡ïõ¢¡ù!¿¸ª×F–œøv¦W-çØŒmºu-Çœô¹Ô€ ~AÞ¿C[·ñ¿sFbx^˜Ù dE[÷]Qýÿït:˜àÝúTÝÊýd­÷Ããñøú#}ñ‘><ÛÏžôy¾éçõ=eW÷"t¾:Æ´ GÇVžöçô¿þ¥Û1ûW¼ß½ÑÃOó§%Öµ±üõ#ï·g™bYºìcoãø!òåµ~´Å_¬6>0pLùµ³´ñ´&ÕGè(·ó°rÄ$.â‡|cTç׌Ëŵºô‰å›g¿xCbýªfÐOOm5NøŒõ[œ¿ž¶êç¯ç7|âÓN}«_LôiŸ¹GÛÜl‹qÏÚÒOeVÎõDÌÚ«ýÊ^T™æR~ÇÁÂ<›We¬cb¹ñïü]ŸµOê&ÞÕ'å©Yë%.âh\Ê3ŒóÕ¾¸¸(Ãx× íÎ]m*g¼­Síþ“¾q¿ÅÙ5ýãã“eŠam-bm.Æo¬Ê³®31ïÆ­ûÔª¾ì‹ù9¶ó¥ñwé|®¼Ü·ÃÚ4IÅC2÷êRÚ§êýÍϘŠkíCì1Ê•'þ•­ýr}‰§öŠE1mÎÎõõ 9gÞÅP[¯¨5þ¿:¥­qIiç@í¬¼ûJñ¿p*ÕþÚÏÝ×^Q}v¬kò"×Ö®ÝÝÛ÷>³k©sŘ+¯]Ç®¹×³²óyãÿ>ãsB>}}þn=ó•Å7>š»9é§9‹ë®Rlw¾k³ü™=jmv !/áßýX^ÏÌÎI¨±ýòø„»wžæ\Æ¿qU¦1xÈ×¶ñ(ûwäÄG¿©wSú­÷ÆÔ{‡±tÍ7¦%äÄÙsºõ©ÝË·ÔõpùóŒØµŽ/ýÿùøTÃú¥fúÝsVûöÕsŽÖ_ãò.©žûÐګήùÎ3ÇJ¼+‘Ùµ[Ž3Ë«MÖFß’ïjrÅ Kåà7ybP,èWv×ÿb_•{5Þ»‘spóƒ®û¾{ØÖ¡ßÞùvMm=× Þÿßôû.s/iÌ |ü˜‡äÿ‡ægÛ³KÚì>{Qó+í k¯¹Öo[ÏD1òMr寽ݟ‘©ïŽ/i[¬ÿOÛâê8¸éÓu¶>à+Ó÷c«CK½º*« ¾Ý³:W+³ñöì_˜+öwÏ€ÀE=±pÎû>ÔouÌ÷U½õ-6ƨþæåzWÇ7üy6ÀkŒÕ1Ÿ‹×o¨wtó_9m­kuöÐW¿»Æ”]Õµ^«']o?õ*'N΃îm­[©5D¯÷«îkõyÝ;®=ð÷§ßºo>ö;¾þ–üÇÿÊ·ºÖǹÀ÷…‘{xöŸMq¡ï;¢ºü7©¿}ÇÈÃ'k‰Ö·_åô£rÞeüÞ\¡î³Êëo©±·ÖÐ…7ã¾e¼¯Ö¿}ÇÅnׯïd–™ƒ1°ÿ7î•ï¿§ækÛÿ º›åx^•™Ù®7E$)³Äÿ',ÑKYÙr_.%Ûåv vwŸóâñx¼üB/.úå ý5Ô}ç?^ceὺƵ!ý~ØAæ§K~å$d ý2¢ã\9æëÆýê«ó”ߥ_ÿéöîlþ|à™è”3ã”Üo Þ\£ëƺöê—‘Z5g‹}s¶9^þ»Ç>ëudÀjÌòŒA>˜jÛyí²n=Ü¿‹÷ìŸdêk©ù|.} |sU2ÿw±ŸpÀû-óöLë‰ s Yõì?æúq­Ü_¯} ŸQl‹k×òð_§üÀ·¶Ê¯Le•¯ÏÓy_LįíÞAÍ:æ³¹#v䊯öÿ¼öá½½äðçݨlë½µ2_ÆØ½£ÇØZ.žÚYœ%ï'ö¹;™‹éd¿òâ¯mδñ>§[çáWV_ÌÁE}Ô}Í3Ä~í³gýÛ÷õQ,­ÍReÁÜ>©Œ½b.7^ˆXÄ\ã§ÇW<ÔHß§ÞaKçêÔ¿¼ÓÈÝÉÜ–öy¶9Ó~mg¶²Ê-Ns ìöYk»rkgå!ÏÒö€2òkÇܯmFä[Úl}‡Ä]nOöükgÎ=Åžç¢1¹oÞÝ_›%yÖP?õuÒ[•9ű{æ„9÷Kq¶^ŒöÉö©8[ol¹·uQ¦5Ý=I½­³²+ß»ÂýƺþzCÍ?zb4Ž>×è‰Æ¼X\û,E>ïsRrm/ú¼¸£ž—Åà\[‹ÜÍMëÀ³Õ¹˜š£}®Ý¥½N²ð·ð׸ ž?ße”9Å/»ÖõÞƒÕãý‚Ø«/žµís§v7Žê0÷ý®üÕiÿjwGuµõ;ÁþÚ¼ÈSîïkÞûÉ3^ûÿ\û¬É=··Nù*5®;õ6Þ•‘O>}§OÜÍgcglÝÄS_ð½g´¡}È{®Ö×ΡڬßÚ›öå­-ˆZ›‹Æ»½$)‹ýúði,ž=õÈñžyÎ"<ðyê£r«§oÆö«r¬µ[›òj_]yæÓ}žùæÇ½S¾šõéweÖïÆØwêžïÅWÒg}<µâï\î1Öâ6®¾ÓCÞu'Õ¡^æžö%ß Nç¯v¤~_ºWíˆÝ}ŸEµ}×÷=~wf«O<‹i}ØKÞ3ö)û›Ëæ~{È}iñœä˜‹ßx˜×¶Xöãèžçû9¾ï¨çzñ™ŸÅ´s×­‰úÚõ;µqo=­ü~ÇÕ~ã¥Ö­gëýT^v¯ïiÚØ;”qŸ7+²¿6̇½Ê|±W·¾êO²Ž•]=Ö§wbçw¾÷9×úÀw_,ÎkÇoøû}¸õ*–Ê0Ö¯=ØßZŠò·ÓÅ©îú‘¼c7ïb[+³}`ÎÖÆRÏ{ëâ>1ìwŽ2•-Æê;·×›ûÎWþDÈ6§Œýÿ²/[·õq¢•1‡»ß)ÎùMŒôH¿u·†s}Kí¥ºÅ&®Ú;ÝÝ_^÷îbgîsnßôUí¿õSâý€±ßnÝ_ýb»#mù{„ÝíŸÚ>ñNk¿WFÂGcØgjm4gê7oæÚüÖf1!ãûäúU¯ý±5d¸O½ÎûŸr}^-É?Ý×Ý×ÿ’rÞûM°vj‹±}²Ö‡z<7÷]Gžòû;Vsù[ˆy*öÆË¼g©vjÏß0ŠkcÒWõJòƒµ½yÒ±k×óÄÜüz×ú»ö|5çÚ¬/çê´Ç2½/êGbý1{ƺ=­ìò–¬$–﹋”µÆ›è3­Kx^™WŽ$7{å½7÷¿©ô€ l(5«Éôަº?¼^¯ÿÂg?kýåÛø…èËÐ>­v¾ Ÿùg^ã«ÀOh¥›X¬ÿm|£9öúÈܾ}¥ymol.zý×_ç ßXÿpÌŽ™¹}j.ç¸_ßæƒù~å_X«ym ðÍö 5~¯¿Ö¼:m“þØè¸Í_pOQ[ÛqÙ¶sõýÛˆìâ¬]×ÿÒSþር±4•s¿ñÇ×ÇÚTc}ùPòg}Î#ëúï51מ°ÏÐ6.·£Ñ§ø`?Ü{êñx†'w͹Á¸íSûç2\±{~ÉÜçÄk—¿Í!±B+/¹!>žöÁÎkÖÓOî±ëZØgl[×àª?sÇb}¿8€ýEý—;zƺÚkWÑ ¾÷Kã¬|a|Í«c¶îú,vì<ÓÖ·ý楧èÊ_8Î=t7ÿäIJž¯Ö•)8'µe]ÔwgQõuýh®‹˜ÜC¾Ÿ ³¦ÿ u26ëª[ÿùúX³ö} ß7_¯”n;›óîØš½m¿ìsq¾wìÓuçØ¶qíçÚ@fãüÃÎo<£õþ[üîû}2p. ¾­²Ô3ƒ3Œµu#Ï›Û>oÌ_›½Ÿ¶^ì肎ÞÖîwñðÖ¶¾ËÇ»ñÚ÷ðð\çÖõ®ÝöImÔöFïÃÒŒ7;Èç?ÉÚoÀúÀyõ¼¼ïÁõþ}êÙá®óhí*ëóbë3Á½e=|#¿œØGØulÂãýpg~Ùþ3^çÈÕûÈÀ_½eûà–_bòcÙ>9/òfÚT÷æÔÈïÅê±-Ç>yÒ»µsá•¿¸÷dlÃïoÛ÷zÂ2Þw¥M‡ß:®¸§üo½û^ò7ؼgsóõtNÐ3Þ{ð]ñ"_=õzëé{ýÒï<#ç=„ è¿½É ;úbö[¬úÿ®dzÇßÓ¿ìÿøfÛüWløîïŒË¾½ÐëÅ{éµ~Þ€Ô>÷¥u8÷WL>gló© ¶UÝè3Þ÷¤í1šw¹.Ÿy/ð÷øÆæÞóöµ\¾Çß9y_írožöñ¥—|Lßbk­ð‰¾vOù»vãd陯b­µœÿŽ§ç øê´çàSPûÀrðž½Áµ¯,sÉÙ·ò±~ÊÙpؼün>9ŸÞ±Ž­¾”ß4ûi]Õ³>hŽÌ‹¼×öŸ¤Ÿàõh¿˜ªï»gìûìøá+ï”ñúíÔ?Ö×Û”ù•ïÆè\]1º—žh†Ñ÷ïWU¶s¿Œo[»̇=p˵{éÒ·ó€šÙ‡Ë—ÆÒ½UŸ ÞC¼;[Ûv>ͳ‘7 ñBwìÖ7|Ïñ'ÝÙ–·-Û©>¿ù¡Ywc¾ÆÁÕÓ@Ï`¿5È+4âéÛºªà LÏÁk\ïLôø7ÿæmÞÉrŸ÷Þä4n€<÷;øýV„Oƒ~¢ß7oÿNÆ6ùÞÀ¦ÏAëß»~#¹íÿwãwÿã¿z‰µ{i¶Ù§ÞÿÖaÙŽµm›À_âóÛÛgHcmküpN}ŸÔfý3LGkÓý`9|Ø|£ë´ï&ðãã­]ßZpµµšüÓ¶îx^…™ÙT7‡„„ Jþÿ;C‰[¢tä;<´l÷æÓíö2w^<C/¿ÒO_é—kLŸöç‹Vÿ÷K§6%eúi áSô~lWx'ZV_̵[kÛ1k$oëbkàÔ–¨ëäžê/¯TL­+î„â0Æ]cö+9D¾gÝ®CÇ_Ý;ŒÜƒÕu7?=óäõž)g×vç¯ÿîI‰ñ—Ç÷;ÕÔû¶ûHŸðöÌì\ô©s1¿gˆzí;ÖÏîm÷âb…¬WýÕoõNüS«ÃÙ«ž1Ô¾ºw~{öʳFó’º'Ÿže¶ÅpÂyÏÃo.½Wlcù­bZŸ¬ïê¤wB ›¿äšu.©o§â-‰Óz•<ß×'Äš›‹Ú‰·ùíÞ¾Õ)õ\Uw鮯;wûÞ§êUç„ai÷ÙÍ —¹«Lû¿®¾û¶~9Nõ¶¾7†Î×u(õ~¬9“w××ý®ýéý_cä|wã^¼Ö~[¿â‘ÌŸ¹ê|µÓ·w›¿°ë=·káüúeÝ”mþåu16WðÜÞõãž\ßÜ͹¸V·cs+¯ýæ©ö‹}öß<É«¬˜Ô)Áw 6ö¶øëì<«'œoÞ7¶‹ËùÊkœäÖ­soçD.¶S èûŸŒ‘÷½ÿ„{ヰs1´U.­Sî9§ô&ÕO}Ñ/vç¶å­Ÿ{]ïªý„çΧw%ý­AñxƬÆ®åž%ʵùÅÑzª¬¸–Šw¿ÖÆþžÿð»ЮosX[¨˜ksŠÛîSL~/h ÎÛXi7ïlƧó¬ó˜+ì{'/æž!~Gú^3»¿õ_ðvŽ“¾x‘Q?Ú™‡=/k³ýåu,fɳ™~ßûë«<ô{º;^;.®Õ—ò­÷;›¾SÍõ~ Ù5xF›·’gƒãÖpeýö·gªï{ÆÌµ>ïrµãê™7I¾¾÷·À)âl}«§OdÝóòÝ/÷ÉŽ=ƒðÕoâ']sEŸü9Þ8:ö»tÏvmlíožõåo|uÛÿ‘mû;gu=×Äzò±gÃê©+–b¢6Nû·µ[ZÞæï”÷;_K›+ß/]ou¬3±ö7²z›Ïú÷Û8rë«Ø{H½Ð3Ï}¯âu(v}¢¿kSÿúx&‡œCŸæÇ¾±¸6ðúVÊ‘çuQÙæCÛS]5?Õ)ß–ëÚ=¾:ún¾º~ËÖx6æÚ÷ÿªÅð,•¯oÞ8ê#kMÀoßù0Oÿf¼sËó7 ýÿ"/ý÷n½Û¯Å ¹½³ øê¸ê¯Øù‡sR×î™î¿Æ¥\{ÿZû’¸Ø»Êhûmcm.;í×Îÿ‘ƒãƶ*x^…™Én1 íìû‚$· ÿÿ™qSH¡ ‰„$Šj6)J??><<¼x’ÇK^=ÉËK¦­ùé6fn²>ëþ\ºõÁaÝÚ7šÇÇ«~ó›³íüÑ·_sFÞ]­çlûõáŸ_°j?ÿÕÏvØ^çõ“ÒC±áB>øøý(ý[­_êÓã÷W‹Ùcƒ}ÛO—Ýúøö¾ƒsòê#æT[û"_`ÃË:dùA¿õ`xÍIðÿùj]Ÿ•»ýC\§ŽíľՃC.|6lGßþ¾Ißù‰kÕg®¬!wæØXÀö9\]6wØS³•óÑ:†x³3·;?Æ‚#Üê›Þäl÷cî78N¦ßZ¸Â ù~éæ»<'Üq“ù*?ü8''×LØúlk^õ»Ö{ŽŽÜ4ÿ^7áŒ{'Ü?`nŽ=býrz:¿Ë'k¨5ûôž—ßéÞZÎñÍþ®ïweqlŒ8~ÄgÏl¹–óÄ5jlæ›ûqþrÙ`o;ô`›¹ímËœš¿Ýä‰wüÐ7GÏ1vL‹yxpªc¹Ã[ÎKûóêSðî9íZó«0G>ÈçĹÆ-zîlœ§ñäßxwžù4îúê˜ÝôØ»_ᎆ¹[†Gì¶Áû‹óö»:¦Ï9c}×:.l¹7 oÚì9çå…mψ} »SØ?rQðÀ>Ýe^g}ïv„Ú®Mm=vìèO<ö]AŸzwLàôý÷Ù]¿gÙ8|›”Ø]gáœ8_>ù~0ëzFX×–9ºåûqöþþ°0׺sŒ×èÚ;¼;1c;'훇¹ ¼ƒÄÐyðÝæ¾q¼Æ6|û­ï3`>›õÔK}ÚÖ÷®ãÜxítþÎ0ξ5¬¿Þ1抮6›ëÝ /öÕ8`¡+7ÄoCó`ÄÝõÖqÇ›ÃÝË ‹ñY/ÖI×}¶ù2¯tÅaÝÎ÷[×B¿=àO}—7ŸÙw÷½o¸5þŠï\¯Eç8éûÞ/?ô«kÇ:ñ}pú;͘æ8ñ»Óûßr‡Ï1†GùøÌ¶¾ÑÕ¿ÅwÑÉ<ót¾ÑÙ¦Ò¸,þÎç»Çç¥ö'¬r27ð‡Ùu¶«¾àVŒIóæBçßylS<æ{OVϘ¸ÛÇÆqtß&«YcznÂúSŽáηŸ9Wîâœø½«~ûf⫹÷™å÷ˆâ±Þsþ–sŒÌ _þ­Àù™½ù°~{16~ï(û<å’9óºû^Óù4WpŠ9Nõ}‡ïïH0À^ëÓv¿¬ÛÙºYk¿w{c|bvÜ«ñÍóÑ߸þ'=·Ž©5É<}Ï›un§?ågâ\ßíÇt>ËõIn‡¶äÿ݆_êÖB¬'ë¯Øã³÷öåo,Ûä”#Æw9rß\N{Âïe=+õu¶Mûv\´õÏx-6ü3?>;Æ+¦ãߨu€0þ-Ý©îŸw®çÊ­¹µ6Œ±ïBb…Ssuçâ3€Î뉽-\Z¿´ÏUÆÆó|…œ€õ?Lp“ÇPÿŽƒØV—Ó37ÿ®7b%ïÎÎQyööƒÝô~kýž—ßÉ7Ï›ÖsyöÛζ§3~÷†0®þdC¿~ïjž=Yœ+ï±xû6v½CŒ…­¹•焜S'>;qm÷¸-6Ô+¼lç=Ý>û.rhù;uýËÆi9q^û-û®x^™ÉÎEÇ`6³ >XH\xÿW„:äàSÕ/©®Ê}«¬žžw¯×ëÝ_d½¸÷Ùõ/|ùìYKc ü^àó”;Ù*þÛ×g½â‘Uø)üØe­LýE^ù á“´µOqß=xän~ýЀo\ùûÜusézóÄ^zc«>àç¬Cžê¿ù°ùh ¨ÉÒ­I}8­íM=õiq€}Uãr}Ó Üê'ßÊ Ôvã¶Ÿd6¯ÖËüQ—Õ]Kû!ôövmUÖþ+øþÁW~y ­÷æµ²ê:é=Ùà UöCŸoõcy{óÏó÷ç ´÷qóß>¨®b÷Ö7âW®|'>ó%ó½úœOúäY«Ú± õñœøþ|èÚ\¿OûÚXOê¤Ý¥­¡ýU>÷ÍŸki=#樺kóÖ®é{óàsuÖõ•Þ>:åžû‰|·Ÿ—çä›°çcùNkžõ•8åÙÜŸl.­{€+qŸ²;÷9[ê°fž§òYgóT>½>Û@Ö»bóᓚ@:«síÕ çMÜÆ}Ê›9Ä+W{=Kédÿ;§*ÛwÑú¡ÍÍ)ଷ÷Í)žÎðúÖýÒN`Ý<ï+§ß¯¡·.úK,Öz{´¼›ëƵ¸Í—8×ú^ÜoY#Û¾¾ÙBž9âÙ!¿êäÙ3e^¼OÚßÕg?ÈïÜSÏß1ô½sßWhMôckОÇÞi6H·xaïÏå5î›|yô­ç hÜ«»ùw½¿ZãöAõé·ýÒóV õMÝêòœwš¿ÔŸçé7¬scmSsx«­{íÔŸÿ  ÇYQ°wúBgcõ»çyªÁÒo:ûëy⋼ëÇÿÅ5O'?šsl²÷Î×ú Ãã|©^ãP‡k÷=×êäî_ôt&¹VÿæO_›{¡ïT'«ge‹¿Ñý¶Ð_ã5Îúº¼ö%àÜ/OcÜÙÓo%…å+T§ïºu©¬ëưzúìÁÆ¿öNï3ë‹sît~Öfý]Þέۜ¹Áé<[Ë•Ú þî3ÞêôÞ>ÝÑ«³wýè¾ï='zÏÚ©o´ÑyÉSO2òRG×›³õ¹°´õ¡ºj¿ß_›¿òpfnýY°–'š°~öü"W»µµ9cßÞj»sçV÷Îß+¥›Ïš½ªмۼ;ÄÛ³ì™臧ßòåÑ_e»^¨_òð› ݽߪ‡à*¿>7v€³~cä¹ß‘û½ÌgÏ׿ù´. ¯gEÞòkK¾ú*›r]·^õe¿ò^^>{´¾¬O¥±¦^ÛÛ[¯¾ÃÞþ[)@·?W_mõ¼7ŽœèÕ±~-?´ÎÄåq­Ž½÷úèt.j¿ßæÙÛs[wöÍ x¿A«ïÆ_ž·òç<öŽªìö×I_ï÷}ÿ­Ÿkã„|Gí·†Õ¹ÏêÓÿêÜž(¯tg%´öweðÉ[o÷ÖâÛÆ½ç è½p¢KkÝO}’O½ÕYŸû¾}²uó¥ïŠðôn¯ì;cõIžöYg—§Ð¸öü–§gl¿ùÕ8k޾õO^õù¾¯pòáýö«­®ÑU}]3G¬Ûúê{‘4ý÷ÚMüx^…˜ÙG /K ²HòÂÿ%iJ”J=7Vo^Žínwϼ|</¾Ó«ïôúêܽTûëµþSÖá)¿ûÖùÛ57=µg¶êúåja|ð¬ÿóÕN÷Úw’_ûV}l0þtÍÁ¾úpÂÖyëþpÃWÝèk\æwuVÖz“÷â'vÈþ)>âktM9l-ÞÆÃ˜üζsa¬'üØ2Fh9±=Û¥o¼µ3,w~ZÞñ¿uwý¿óV½ýu˜ƒð¯¸ Ž¡¹ç ÔöI–¹ù?§§LÝã?Ôsñ9Vµò^Öîjú7ðsœ;xmƒ=lÔAä9›Æ÷ùšC¿×‰]ñBèî>,-ŸkwF‹=:˜ó<;ä= qnŒÞê«NÎÛç|>mÓõ‡:Ïÿ‘ÃÆ['=¯'²õçDÝ«ë;—Õ…Œ‡­õÕО¦=a Ì)÷­ÙÈ:?ôÙg¬›Ÿv¸×¶®øŒ›°áþÚ/W]œòz®kk9só³5ª¶MÃë³þLŽþîvÇØsÔŽÚ²_ãeÎ:&òÈœõ2ç|8ï¶M\àé:Äþ°~¹é Žz}âùí!ì®~2îÖpËvŒÜÞ‘¬o\ží‘“NÓ¿W똺E¿ÛÖììMÉLð×îè¿Kn4±éœzOÕ¦ý³ïË:V{ËÓÝ{‰Øw¾:ñ»9‚xlÞuýðó]¿4Y×%ôCû}ê›–|éuê›ün(ÇÞ·ïÞêô93>ÌW–^û«=ö§{ 1Øx5šñø¼§Oôû%7\~+Y7x×/FóЯåÿ¾Ö;ï±å×ïw`íA«q¬îÜgcâ3ýø^~ð-NðsîÍ_9èTO=öÜ]l]Yó],k=;§úÀZï©“ýÎÓNu’\âCÉy7Q—Á[Ì›7~ûéÖqæð~˜Š›oQã²=úw9;é.¯õœtØ'|Ž÷|fÝyáËbr:#–³ ¶<ï8øí¹¶ºÓæ¿~û¼›{äÓwEu‚yvÇßœÖîèÙ7±óƒoÎ!qfÞß­¬[ØïÞÈÒ/¨wˆmÎŒßv膗üVONïqë-†â‚ðsôU}tÝ{> ü4OiwÌÖœ“ê"è\Ûss‡aï¾µØÀÿñê³môÛw:ŠkgÝöG}³šìŸylËkΟçˆIõXG÷ý݃ìåÅÀzÀ±ø:^§}XÚÞ%Îððÿ£¹áØö}f,¦†åü`µ¾î?æíW××òyÔRîƒvZ¯½çà_зø ·qšÌõkÔzßÉמ›­»ÞµfY–}„Æk¾ÖÍ»}9ò}‚ÝŸÏ¿õŽ_‘ç¿/:îÞN#ÖÈ™ß0Ų–œl­˜Œßò&b³µæßoÛ‘kMóÎþ7ÕÖ³ü—¾÷w³õKãJK.ˆ‡×=Þ7õèÙ{9ƾË×ü56öÃ|í÷œ˜xîeâcYÆ|'2&ÖÆRY¾Ñï½OqÓbkmeüo…uÛÅ2öÙ>´|òjyëÀ7Ïù½7ÄZÎR}uýé{Õ6Ö6ß&¯ÕgxøögÞñ›mêŠûÕ9îadùŸ¹5ßCõÃÿ¶°ßX²æqy ï|©,ä8°ÖýgŸks¼>#Å:Ú÷Hw}æ‰ ;Íÿ©ýëñÂÅq|/îx2mó$ïÆâ·­ñZ<¯å£v<¿ó±~sÁxv½çœÉ­“_Ë#‡úÈ#[~å>]íâĦyºßÚdZ+oËx;®7Û¨s¯ ð¾Zï½s@Ÿïéì<Ãö̾¼Öø½Öz+ƹ9ŸýñÃ'{?;_5Gn«ÿ·ÖáZÎ]ï[üZϮsâvß:lþzÍWfpw_{}kÎñ›_ Ù6g‘±ka`}säÏú“·/îdË…¹ÅY_¯Áûf=û³}w?yžœrÇø®¶çžþrÓZªî°;¿|Ó‘sùÁþg²zÕ\kCyºVNß—­õ–síŸ8ÃÓz^ãîÿÎcêʶ°ƒžÏ!²´È5n£Í½~ÜâÏgŶ›ŸoÛµ¾[®½'‹¾sUÛ¬›o=ä˜ï÷n2|ë7öù·Ïeû¹;C#gÿìÇìpg¶Îç‹\œê¶þàXÌnkcy™îÝï l;§5Æ'ß|s‘ó®%¶ÞŸÃéÛèñx{œ¿Öªm cÀïævŸa»6ëïdÓçŽ{×ë¶g]ó¬Nχm¹oÞìsmî¼â—õƘo-Á‡ö”+ûlÿôα̉ï¶5¹å}pâlÍõw v{N‡®9ì’{rÂx­çÖîMF-<©°oââ˜þ¸y å+2Öm ØŽk„Ø+㜟ޞÈn?<î½vâT»µ‰Ç@îÈ{9¯=wÆÜæd}î}î¿Ç©£áî,ðNÂoUë˜ÏÝ÷Û²pqธÃþIÏ1có¡®ïÍÓÚÅ—÷bu…íÞ!EsR8–Áï—ÊXÖ܃ki­¿e~o"ï·îjœº«ïýVÚ¼sjŸŽŸý4¿ò¢å7’÷bkÖ/xwt4/Î æ»u¾yƒóQ=ó\Üýí¶†MÞbØ£½S¾ÞÅ;§¬÷;ß¼Xß2æfytþÕøTÛÖµ æË£0çÚ·.¹pžœsd«CŸúØ»guì:¤åïð´l8§¶kÙæÚïªS°k¾ö‡mm×ß­»œÔWùÞ°®w£ò§3Ášï\ß';àÙzÿþf»sæÔüÖîÿát¯Zξ«[l=-̸NZ3–ã]Ð< ×¾QyÆì«õ­CQçãD®åLÂËy*—½U7‡ßÖ{¹”§åª·7*œ/ïp¾•¬ñÿ/ËÖö°;šØvvÆ›¸/s›õÎmO›Óî¿•œ[Ö‰¥µ² ÇÞ5¶GÛj¿EØ;ÇoÙŽë>È-­¡œ2&÷Í•}úŽ4Ïrò|ïÒµüÖ©Nõ點œÇjyü¼æ½ãÈÁæ©%ßÁÈúüâ×¹ûré͵h? ù¶×>sä~ãgo¾æ¥ºý{ÎøÚV¹Õù eÝ­¹3Í¿]c×cÏÿŸ³ÖïÞÒYUÝÞÞÞ>ÿH>Ògé“ô©h럵þFû“g^o#kóѵþ°-Wü¯_{£/"Wû¶9ŒÅXÞh<Ûüþµž-ä.]¯Ÿì£7_iŸ¸gÃ>Ú—+¯_fßùÇê#sááÓxËçSîIÎl£ök‹õ·šÏöd± ¶õlÛ6–ö8ÕÅNkgjݶ^ý§‹Þp[#ø=ŸW^œã'_.½Qãµ/¥éΖóh\Ÿ¿Ñw¯}óŒÍœÚàû|bþû‹·¹mƒ ï·¿ÏÁäéµÚÄŽý-5FÓö¨c}·LõL¾ç æþе}¸ñªûwk4²¶·õp½æ<âûõ“½Ñd×C•»i|z›àÕ‡¸è6hg¾û¨9fß1«2gܵ°NkõD>Û–­/O>¢3>÷ùÚ|¹fM.¬óãkNÞd›ev–í6ì´ÞÄVÏ‘ñ½ö}\BÖ:¾FûáxçÃxÃåùpå¸&{Õx|ΫÏðèêIð+clÈ5þUkxWLÃk¯-F|ÜÚgÍ÷¾ÇÉÌzírZÿÙǶig\?åŒbâó%ç¬?äîçÖ¸ØbÍïø›3ȶ|®ë ù»l#»s…Íë 7.úÛXömkÎöƒÊz}ÉM†\{>r|Õu Ý_Yû=”Ø«<ßÄËšØã³âzmô»‹{ö7òܯ}dë'Ôý+/µÉºýc;Æ™/å³®}ƒyíoûZ_|>­Ïz=´ñêa°»_üæÊrÐdžrÈYx¯ï+ÄóÊ2•ÏçïªÇÑjãØ¿¹ï¨ý4òóÔïJÕÓ#gøk9ãnÏ÷bs÷žÍÊ[Ïwˆ÷9‹Ãà¾äÜãøÉ3»uÜ;ú­]eMèÛòÁ»°{'m¤[÷{ÊúÛw½.Ÿ« ñÝ3¾Ï"xððÉsÛù»ÝräóÒõ»gößlm$_m³²`ò½ìoš;ÎÚaÜ=¯?½ý“«öûÊñ…Çh»Üì[î=,÷ÛÕ÷ÿ‡zï]öyŽ!c^×älû>_`“³÷r8=žËOrWÏÚ—úõ´ï{¢üâÛþx®{ÕŸÎâA׿ ×>¼°¸“··z€‰LãòzröÝ¿[Õßòg§ß²ðlÏ¿Yø¼€ë¾ñ{Ðöz׃Ýo,ë=Qù¬Á*ÿ’å}ó=Ù÷hzÎ×FÇR>ÔwõÑ/¯±5DÞù³}¯Ÿöçg²Ë7Ï6îßb\çÐs丳àÓß×s½ënã{wzë¥ÍÉieG=[&|zï\£;ºjÐÞEÎöÈ-s0Ý'ð/?·Ç9èóDZ[wxÔ®XÌ]ÓÆV½' ×u¾ø½æª_}dí:ñì®ìy¿÷7¸Õyâü<^ßÍŒáy¿E¯x‘CÆ5)nŸ OßE&bq.}>ŒÇï@[ãÓd¿õ®<0߈g°w~0ŽçwC߯Þý‹wœý³OÌÿ‹ŒëUzê¿­Û§ö×Ô÷ö&üÖ§8Pïõbë‰öîjt{G=¿ÍYß½:j?á#ñ6gý›Y±ÐiŒìó>0öb± |7&þ¢oŒê“üB¦w­÷7ΗæÁöm>òîŸÍý Õým~ÙÜhýúbÜÖb#ï(ð[› ÓÿX÷/äàQx^˜éŽV7¿@ !@%Rž€÷¨¤[Jåà;Ì–ív/§û.OÇãÕÐÓŒ¥wÙ{=:¿\£$z;üî-igåžÓ)Þ7£[ßûÕù-|¨q4Öò–ÏXòĸ9QV¿>~ôYbg¿öOôå’Ãþ™CÚ‚ô­œqlÌK [oøÌÿºÖï/™â$¾Ú[ÚZAöXãWqˆYŸõ±kó÷ùÒm,õ½¾:W¯¹Y™]rä59r¿ø«[úó’Õù`n^jÇõö;ý-ž•ý™ÿíKy¯9\[æ™ye˜Û/íCi׋£q‹ë¯á3n?@ÿ·ÁþúYŸ;ÒO̱³g òœ)_,Í£#öÄàR|ø1ê¸oìÞ‡kÔŸgrõë‡ùæë%ôÇã?[Û’¼Ú/þÊÚ»ò›³’ûÍ™vÉÙ§¬·ÆâÑO1˜Ïŵx×fÏëò‹cõ zÀ:·?wרÔ.ÄÁx¼v¤“ìê­Tüæjõ×Neœ« Õ&qý¹æomïÜ;÷%²‹Í3S|Ž•]½õ£^÷¹÷VoÇúä ôܯõîpœä˜›Ÿå¯]Kž÷|Ï)óõU;ê)»ûõ×8ÛóÛ¿ò|G‘ÇýPÙöšrÔ¾u+­ýÕõ]²üê1¿Ãê¸~|gš#ûÔZ(ÓÜßÔýv§û¶¾¸7Í£gT?w˜œk·8[Ó•Y[¼»¯^uʳæÔfÏ‹y8õõ©·ÈùžÏꨧ½ö•µß¸8ò<§.öY_mTþNwýœøµ×ú˜Ó“Sþx¯€§îÆé|ñ÷; vOcóT;Ź÷Nß;ÛØðYßÜSNßúç[¹}@tÿ”£Òé^j<}—Ù:6—Žèè“sÁè7ueŠiï‰j«ù<ÉîÞ>WNÔïÚê‹ymîüħv¶ß̃öÙ__Ú³O\/.t¹/Ìñø=ZyÏlëhïõ<ƒóž'FûK;•ïØ~eguÀż5B¯kïUcÒ·=¦\}—ú½Ø*¿¶ŠËøWnýçqöÌVïÃÚVO™æÝû\ÿõã70üâs®Öôô=ËèíûGmo/@>wÔ“o,ÕÙçý¢ýâñŒ¡oüÍŸøÑoõµ©\ï–}?ß®·e}1ïó¥çSÝÓ¹>ÅU=ŸðÛÓ‹÷%„Nÿ‘6ç͉ã~9wÍ¿ÆÖ½57÷®ûì«/ûQ;ícÿÊ;ÕºøôÑ{¿ûõßoÂú3õòýTߕџçfÿƒ çÝÒ»­þ6†Ö’ºŒÆê9ê^{·wXÌ£5Zßå9oïX¹íaI¼í‘âhß´j³ÔçÍ]>«/¯µ–èuüõŒÖ¿6Ê3½g»Ï?æ§;µóõÅZÝÞõÕ½>ï›ó“>ã>ïk¯~ μ¼ò­±ÊgÞïÅbpý}ä+a³øÔÃ_ï”ÓsB{§»§g¤öÕcÏñ[žwyæ¯Nw+Ô÷ºò[ãe}ggãØ~ÍŸ˜åm8W{vŒNd°Ë<œb¶ø]+Ï·á×úòµNšû“OË_]æ¼þ:'ôÇÕ‚eœÍÅúh¿çXÛò¸O›ÇÆ¥¶Õ®úW^ÇæÚ}Uòþƒ–3UÿZÆÆ˜1ÿÏ5fû¥¾n\¿®¯M›ùïdJ›CeŒC±kgçÕÕøÈS]gÝY<¨wïúë¥5åÝ`}{oÿÚ ¾S}A`!vc°òæ»ò`Š[Ùµ±±ØÜWOëc1Œ‹²‹Uù“Õi•¯²¬•û'ûµÙ½EN8¯V¶míw¯0æÎ1§Œµ±Xµâ]bŽ<7Ê¿±Û¼Ù*g]@ž?‹ÇØ,vuWÆ~ï™ÊjãÚÎÝT¾Ö‡~€©\ψò¸o”mL }vMyçö-NùjoÉ7ë¾-¶Ö:6‡â2Ö߯zqîð—ÚȨeÛªW]mWçI¶6¸Fm7f§x+[{¥Ó]¸ãµ¯k•¡Om5ÚѬÜþy6ïûÑxÓùÅ1&ŽÍý¾Ù·kcF-WO±mù&éšo}ó\»îúòÛ:oŸü\ªlul[2Þ¶»¾ùƒô·t§cqÛ×zé™àùÏå'âíþY¿×fú§3öû¯íÎòìbý”£­'ÈœÒï7uóN«öª~Ówïî·ÀêgÞ7Q󨏒KïHßV½ùqþÔWWc#¶vÕçÆB9úØÑs©X§|¶¿ûÌ7CùN²k?ýú]žú°ø®õ7yXëûÔómõ§zÿ­Œãæ}ýì|õwÏã»Üï~]žó7“½iÝ_y”Ùš/ô5ò´èÜ;Š>s`~ºÆÎ{ï—Ö»xã·ù低û»Õ);÷l\÷–ø+'õw¤¾§o|[útеòýÞ,ÖÚ²cy™?á¯ÌÉ?÷ÕiÍ:ª®öÚ-îê¶öŒä^¦ßs®øPßÿ­ùµycAl—×I¾¿äYLó}Ú¡Íòô;|ëX^íªýwwÄÖ—ß›ç¾k{þKõ˹¾ãÚï[g2ÿ^}xúÆ.Äý‚߬yÞë‡òÐú£þÆâÜO½®Y¿Ú'^qÍÛÖDßƨ1álT–ú©]%ãU{íÓšãQ±j<´Wžêu®ºÊ YKòïzqºÖº½£ÆMÿ¶¦ m®íÄTÅÛ½lÜëóÉwyWwyµ­6.ÄûŽ5ë³¼¥ó§˜ö7„µãôݳ<ΟÖ$mÙ5÷ªu&_m·í™d]WoϺÕóŒNç¶viKÏ#Úî eמ®ùæØøŸx7VŽ»ßå%ÿÞç3ínî ã¸çGq%~{kïAõT_[yzþëÚ#yÎko±8KµqýaM»öl^;;^¿Ål»þ.ÆæªÄ¾Òo×·_,ûë_ùýŸgõ‰küœVw>ZêÝßä×ׯyß2ÍÿIwÇæY;Ö~û‹ávÿøêjx^…™É®\EÆ`0£ŒØ±@âÿÿ‘wD‡ å5‹TUå<Õp»?¼½½}x‡ïðÍ;|ûZ3~z‡ï^ãèƒá‡ózôÉüð‡ÿ^st,ûËK~sð[ƒ3üôöŸŸÓ[Ÿí vÌc€ÿÉŽõÌÿóÁ_Ý?~…Çú¾ÚÆæ³3ÚæðÕÇ® Ë­}#G|jÞܬVà]CóÖwó´‡L»t­ÞøæÜàÿÖ{ù±Û„ßòæŽ<Ãg¬—¸è¿†Æ|6¨¡{x95Ïæ‡±û€Ú4@ë…Þæ§ù0­ëÁì¯Nл'/Ëš‡\Ò«Wî*3`OckÌÈõäÇuV|yÑí‹eF7ÎÀÞ4ÏÕgØjzsqép\î#ç ¿|.c‹~²ÌÎéò>¼À½e;Ï‹×ô}m¿IÆõªŒ×›/ÿøàËužVÞ=ŠÃ-Î7xÆúµž¾¹,ßöZý›MèƒÙÌ¡µß®ãìÛo×í)vƒc¬ÏàÌÍ|ßùµ1øãE#×õe´ÅU¿é Ÿg—®äcõªßó™w4ìA· ÷÷æõ;Öo0Þy„Æèí¥«Ö_;}-nÇZjÃwTûdy?(Ï€|üæ×¹ OqÔŽ»²à©gãdý$Ïœw¢mn~ùÿYóÚLW}`œnŸíöÛùc¿Ønó ÌÛ(Ý€>ïûn^¿ûÙK¦_rÌ9º—ˆ©2ÜûÀðžÓÈ‘CÖW¿×®mC·Ž³³Ñ¹FÎë~3 “3½ç <ãŸ.ô9ÖúZùÁöùx]?ûæ]ò¾ÓJ¿pö«9fœkhYçðf_66ÏÈ´—ª×3¨rÕYè;¾¼[óÞ%þÁßâZøÝÕþdoÆÇ;ÞöÑï|ÙŸúvÑ—§á[¯¯ék>}÷ûÉ×Wx¹‹ÚÇöÉú.ÝØ.zp?xë]ºÀóæC^ú7ÖwëÚÚçµñÄ ­qôÖèä ~b¬îêY—o‹æëšón5Î{Åý`yŸ•õ—ÑöÑÙþ"†ž­Ìy_Áƒ®òY—ý7Ý2ø6øëµ®ÞËŸ÷8ýc]£ó¾‚ßìSëØ{Ø6ÉõÖãC—s¶¦‡ÁŸEðcßÀ{i<ÄXü݈­Æ¹‘ý@^/{ægÞþp^.=Íã“,±TéÕíXÏ¥}9C½× ]¶¨›}r [dêëd^tѯÖ{»xç£~v&—^mʇö‚÷é¼!›x:÷wr£]ùhœ¦¡§{¢qÌo~1¾|½“±—n½Îøáxë´ õ¯4ӛ꽹ý†Þ•þ´|î¡Ã±pgÐ#æÛÈû?ë¿{À4Ç·Ñߌè1ß›‹¯8üؼ=bžÚ¦Æ@û9îÓü½ÍyÝè³Ö¼Ø}Ê¥Áßë—¾Á•ƒ øÛ¨ü͉ó y×ð)_['ëòWÇÅã>3~~R?p>Cœt¯‡÷7^ã¾ògû®“ïãˆÚæWlÀÞìÑíëÊ5v¿.>ÿgè~¶,ôžþöoºõìwSjáßøËWÛã·nŸ-ÿ'[ß“Îǯóå¸ÿh‡|Z÷5§O8§ŸòWèïéåwÿ™6ŸÜöúÆ':õ¾ô_yõz°ß= Ñìü «BÇx^í˜ nÃ0 Ý6½ïãÿomð ƒH!‰ç’¢l'§mÛnÏts¦'­ïvÊÚô"ytOÒË{fÖÑk_¡û7ÑãÀkŸû 6ÖmJ®èeݾ&Šnlr× e%1Ñ·OëNyp6c:wèmŸ‰ÓrdÔ˜Ùzæ¥87fë?9fMŽÆm áÅù$&zø³_×äs×3Ö‰ý×}o» kã2‘oû° ½Ô~z?9Ùø¼C}Â{ìÚWzÞ¼ÎÁge¾×‘QÛöå¸ðÒ7ĉmp:WßÁÉkÛ$ÿìý|à]«îøSýðû]2äöáÿæ«}¤ƒÓ÷§sõÞDwÜÉ–yª3sÛº~ŽÛ±Ðíz„ç{Ÿ™{Í<õ×vé»®ã"Ÿ0:f(µŠdÉ.4½kЉz~ÊÓ3ï˜è´ÏÆ}ÄO¬æ½o—ü:§Ì±q_w¾]W(ýÞçÔ:ðÌó\(ù£3É'ŽÉÞ¹â7DMs6¶³¯>Çðû9 ñ¬Œ{gº?Øã?:ÈÍ7ž?Ùƒ}({bg]Çaý£µû ;p€Å¹P/ËÀÙ5:"tí[îz¶ñÙ‚Á¸§šSú-ú!¿?)ëÙ4Ž5O<ž5Æìú€!1áu¶_ð³&VûÄG×ÒyCî#l°Kìöá\:'רÏÉö¹ÔÜu²?pÑ‹Æç}ÖܵØú=k½èðŒí¾n}b€…ß(ÈX#Ï3˜ºùLì»×Ý?¡þŽl"vê=ÿ.¿sp<ÖÓ¹9F?áÁ÷ß};Ôw ,Ô¼¿'l?ùôY¶,~“OfôàCáQÇ~¦²¶­gÿ¾ åÛ}xÙ“G÷ò®q~!缌çY·ýâ}˯8ðòµ®ãL¸Ãë³Í»“39Â?í‹×q2;VˆïKwLxÝ#œ-9‹ëÂ7ºïûžÒ;Æãš„ø?ÇÏ)c°?»ß=­ÓþúþöÝ0nÈ÷¢Ïp5ÖXc5ÖXc5ÖXcãñО ºx^X[‹U¬‡Q¼/(:,jƒ$j”A1ˆ¢ëƒ¯‹£ÿÿGxŠó§¦¦Ï|.œ—Ýéêêêê>3{ÀËí¼ÚΛí¼ÕÎÒÎ'í|ÖÎçí|ßÎÚÎíüÔÎÏíüÚÎÖÎKño Ç¿×·Ûù²oѱ~Àï>&±ÞAÇ{sAÇý›¸ß ãVxÂz{Žo·ó.ö˜Äûƒï×èØäýç:¤Ä'÷ÌAÞžã+Œ<ÄOÜ{蚟xâÊøŠãþ½Äeý¯ap·pÔÀ¹Õ^å¾ê?ëßCt)ß“vžbè.¿dÞ ]åf]̱`ï]áVþ¨¸§>É[ºÓ9®Øãÿ‚žãÃמÇçLZˆ¯¼Àx¯Ñ9¾ŽÎS3+®ÙËÄL 6 Uy4ÏÂþG|úå†.Ïp>çÔ„?Ê›žÑþXpÔǽI¯øÌPó çµhîÕW×Ky<‡t[q¬cÃè+ùÓgHšp†ˆÁ¸ä¥º³oÎÁkܰ÷„c¨®½ÎVÖá5Üa®WzKXpì‰zá{l6³9~gT³–=¿Ö‹ªŽÔÆ5÷3Þ®S…¼Ó¯ôAÅ[¸³ù“§*M¤Çlÿ÷ßèøüaŽÄ¾Ö[Ÿ³Ê?ÌAÞÂO÷…só˜œM÷Á‚ÎA¼|* Æûl/¨k©´Ú°ßË©¹Þ´Ïwæ¹êùõ¾q»Î+GÕË<Ù?Ö,¾‰­º«ü†î¿™÷ª¤É ŽóI§'gûÿOt툯žðç‘;¨ê©çÕŽ]qÜ Â#>Ãß_«[ï.ª;ï=îVÕΞ©æ¬uÃðªjz€ùì [µÍÞgÚæN©jcn¯oÁ±Ÿòã,ïÚ¬¯òfz‡y„_Íc5WâH~¾ô sVyfþ̜ޫôŸïq'–ãƒ\C¿j‡‰ƒžU®ô\ΙÇz?ªÝà}àOåék~>{G¶Ï }D,òRmôHƨ7Ò0ûðÝ%ÖãäßД—µ°ŽJ£Jb¹öââ©1¹ ‹/°÷Dö«ú¾©vðYÿ˜#ñõ®º`ô‡±Ú1ÒëûÞ$?}ƒVܼnßÙû¿°Ï‘{$1‰çu kÃ~2–º)Ο—誶3½å¯¬Ç÷Jê”wô‚½F³ÁÞ W˜Òñzoð8>Ëš¼×ºç¼W öšÎî8çÀÚÒKúN”Þ‰ïõÙLÞ¾óÿÀ±—9 Ú/7Ø×q†»a+mÎúí>öæûHi·¤Fò@â ;ßkVçdÃ^ÿôW¥½s?ÓÝ{LüÊ¿ù!m„û56µ—.•Îr8~µCª™cÜl>ý9å­4«âµc®Å»ß‰C]f}ݰ¿7„·àè?âøûÙŠ£GÒs©gηÏó?¸Äå]^yõj.ä¡îø^Û fî›íã~åßø{ÇóÿQÉ?×záú¥vîMß ù> ̇èzøûóSÌ{í;Èñ}7?÷ÌŠ#× Ã7ì±ï½ÜuÄ_б]OqÒsÄÊ9Ðýâÿ³prf÷‹võ™Õ%ÞÕþ!&1¤±{â†/G]“ƒÏÑ#ÔóÍÜw8bêî$jÜK®»ëã½Ö7KΦs¤Väy¶W•‹9ìû%mÎxHÎbæ­òm8î‹jÿiÖÈûÿô[š§§Ü·ä÷5NÅÉïYƪçäD>³•¦Ä#Žz$mòeÜÙ“Ex^¥YÛŠ%EŒ‡EQ¼±Štµ¯  ʲÞiчyßk÷ÿ?Âú•ÕgÄz:U‘™‘Yuæ<ðd[ë¶~ÝÖoÛjÛzn[/mëÕm=ÜÖëÛzg[˶>ÙÖO—ýÜ÷âe/÷ðó·õ¹í!æ?è¸Ïoë;÷:öGØñ¿ÚÖ×Ûz¼­ï°cý‚Ž÷v¼Ø1‰Á³ŸÙYžYc?c¾±~æ9±nÕüz^Ÿâˆ­œˆÏ<ƒç™×Ûè8 v,rĹKÎè#Í å@­åÍ;Ïj6$'îǬ%¹¿¶ä½Šãs³òkÿç}å3 û*{àëିŒ#ž|®ª¾¬­açsÌçê¥ú¹GŸ ³]>'=¤Ul~îu%_®+q²nÍüÔ©¡×ྫôγâ^\ÈK3 8/ÄQ¥µfÅYœk1Tï‚c/Wµÿ…£7SËjî(WúF^áL¾6ãö\™'qè5yƒŸ±.ÆöXžwΞQýšõòžòô¦ÜO5‹?ñöu­ÄñwÆŠ±FñçydUý•xâËõMM}žyî ù"µô ™s’–™“j¼ÃˆŸsÁÑ{Ž=«Ù=žØ>S¤g…!Þø§>©z$õQ~‰Çœn°ã>CŸOŽSõ†ûî>=Ý0Ö\½ÙäC÷c»N?gÛµ7Š8hè<(_gU÷®÷sgß+wúa¯š«ªÃc2Ö»¹ò;í¬6ã~™i ¾9§áÈuòRõG•ëlÞyž©Ar?ëAñ^ñà>ô~^pœ§é»äAÞs¿åœÉ<üì-º~/«>ååµ Ë9kû_šÊŸ•òdò¢óËe/÷ð3Ÿ3©;ï{åš8³ùàšäý–¾ñ^âù<Ëøª«ÒèÌŸgoDÆÍw⊺iêš0þCt¾¼ç/½¶b޽Gîù:ËÏû‰<ä÷—êlÃx羂㯸Mýª÷YúoÁ~V缇¸÷沿âB³Ro¯Í{€yœý_ ûÓuôþª|$ì'˜{^s®òŠ×’úøŒ#næÝPãÌús¦ÇßgЏK¯òŒbóïZMîÞiùVsÏø õÅjÎê¦Nª£ê冎£™²`Ï+÷Ò‹ÜŸ±y®ò1ª“Žw‚û9ß~O¹î…™ÉI僆±&ŸõÔpÁ|îx=Ž‘œ0¶æzjL ×3ϺGÎæ§øU_?EÇÍû&甸È:ä¯ÌI;N•Sj”óålžú»²ª3qôù‘ï’*'ÖJÏøLU¯¦+?Ww†°fßш¥;XܩΙ¶Ì÷Oìóªaì½ç+û}Ò0j¬^ÐqTsöÞŠ9—Ù‡®ô­°Y»î÷câ«^ÏKYq䬡×Zå$iý!ŽõS'å&mVÔõóÏ5ñ·Oåç#Æ5³WÄ#sãŒÿuŽê΃Ùƒ®“|:ãÀ½åžôYɽÏ0Ö—÷wΩÿËÕ‚^<—˜ž¿ã KÜä;kÖk #ϯáèÝÄ’GÈ5ßä>»ˆë9ªüžKÞr¾To€k\fÎÉâx/³W¾ÅÜ+×b¦~•'Sß]þK,éêõøŒ'žzþì7×ãF½«·`UËYÞÄ%Öìâ¢úMgV{õbÁï>w§f]Uã#Œ¼Îðæ>Èü|&I÷1âjÞÝáØ‹Ò>gCz˜ú“x•®åYõEÎ׸җš>×ýü-ößÙ+ÿi.dÏþ ¼O4x^X[«E¬Q/AÅ(&º¯ BPNäCQÄ}ßNòÿ„S¬ÅÖÖvïùýœêêêêž9y àéŒ3.3~žñëŒ1ãõoÌxsÆ[3ÞžñÞŒf|4ã“ËŒ/f|9ã«_ÏøfÆw3Ïx†=ö/XñŸñÇŒ¿±æRæ ¾°‰ù-V¼ï±b>AI¼Žó‡X1Ìøo⓯rŸØ?¡Æ'žp¬~VõêœêØsK-ïc«ùöš_u?ŸñÃŒÑkÀ^;ñÉ—XÄP¿«ïkX9 ëlœSƒäÚõ}`ÅÍ³Ò û#îÄs]‹<ßÅÊõ}l¸Ù{çLlêzƒž÷KsIçNܪþôB…ã3Enwù} ö¼÷ªê“4>ù²þ.OrýûùÔ9¹3®ùT½uo^Ðû’õ¦öäãž$¶ï¢wàØ‹Ä\°q¥^9Îq`?ÄÒîY°õ@Ú'ÆYOs_°ÖÏÐ÷–u3GW»ruyrÆ…{†¥‘˜â˜ä|—Ç_aÅàÏSçÓËüŽçèÁõ|ò'öX~”~<ŸtOÉ+òÈ‚-oê¬ï=ëgÝeÚÕ.®üžú¹‡º³ª·:Ïz哪û}íþHÍš´`mÕ=õ猰žçïù²¿¾O…/ÍYå3Ýõ9¿ÂàNðçÚ“kM½¬çù­4érËçòÕ‚ú®é<“ý#fµß:ïûÖÀæÿŠoîMá©wŽ£¿Ÿa=ÄÑÕÞôzs¿wØé9q­0‰G¯ 1ù.Ð çgõJ=¶x¾Dï¿ëùz¯röC½›‰MKçuFªfíæ"7ú’ÿÆzn°í¨äïÜ¥‹üëºTo÷nÎQ§óYÿÔ·k|àsÕùLÚªÞ{èw™óâù£ª71kŽ8ù\ŠÏÀOXz3|ŠZ3ÕË{DØ•ˆG3Gê™Ü½Ïz jNˆ§3üÖgð. ޵úÌлg|RÓìÑ‚ýNÎ÷R5“îkêñ·N§­ôºàXÇ¿Xs¼Bÿ{˜vXæQMª§›SáÉoy_J÷–øÝbÓ y©ŸÂ{ˆ#&5Èßç+ÍÏ|¬|òLÞWùfá7Þsê“w&Ï ìóñ¼´ößÕ™—5iW¨ŸÌ?Ps–>Õ}ž~¯z–¦ó!k{Ž»÷à@Í3{™>îf§óšr1Oæ¨ð‰- „# ÍCêZáˆ'ß}âéooõþZïyÓ 6îÊWåº`_“ï%þÜëâϲ&מcŸ«8jÔí&êDÎ×ø³Ÿþó=´ ög\+ˆïõ9µOÍ•#ïkz| öwçmÍNWÿÀ†§·˜ö—¾ã7üSqwßT; 5«8°.iuV[b÷¬·+Ï“›ÏF7sîÝÜï~gWùXÃÀŠ«Æïø3îÛåÿ¿ó{~˼¹?Õ7oøÜ:_í›{X1r¦œs7O¾¿Îæ)19§Ý¾îüª§òªkM|άvL‡[yP8°Ýaô=k'Wõý‚Ú#•®yGúLI¯_}Í™wüüLbÊgê·ê<ó¨æ|A=gšyÖÎ;ó½žëŸ.W5ßé éí~«ô®ú—s­Ztç×=!\bÞâ|6º½AlâRõ0ylx©·<šòLçw¾IÏîXõË÷ÔG¿_5Vý`/äù Öó¾›ræÉgÁ^ûkv´O<ù3wš×YaJsúÞu#Nbø¬ˆ‡æ%9Pï™×¦÷djýös‘žÍ•Cúå žÕ«~ú¬³ê±º7ÇÀ¦A5 öóêZtï\í³£ù¦–üß½­<ÚE×äéf9§“.8jK-G\ŸúTi qJ>Ý,s¿ø.>›%¯Ûï†{ø›0uÓ ˆgůòÓõšçùÿÍu¯²vÕÝù~àè%í¡3¼n–Ü;ÿÈŸHdx^•XÛŠdEŒ‡EQ¼,*^P´¯°‚dUViQpß|¬õÿ? N'*NÖ™q¡`驊ŒŒŒÌªîžëű^ëÕ±^ë½±ÚXõéX?uë×±~ëf¬?ƺ«õæóoŒõæXoõŽx_ŒõÕXߌõx¬°Çø{ÆèØð_ÀCø î'ذ?ësl1asWŒ±Å!¾ør?ÿÎÏ©“8xü÷±ÇVLÆãÙŸqŒ—y¼]#b5ÌùH«»ø‹£jÙPçŸç”WzÀ9©nÔ•xßbÎ/1ÅExéaŠ›çUá$¿Äk˜9J3ò¼¯nYÇuoUš^pŽ+î/cÇwþàØçŽ#¦ãÉK 3o×äÌ›¿ãØÏÒú]̸îõ±a&×JÛ‡XÏú‚Z4ÌüÉû;Ôšs5'\kéâýUé’yÛçñ]óªg}}‰ ÿlÎuœ×µêC÷áJ×¥ÂÍþ!nö¶ðn0kA®Êûù7×ßç4õÏùæúK#ŸŒ¹Â$wžW½|¯ïÓŒyrݧ\ž^÷ºæ¯\ÏUºÈƒÙóÂËžO­+<泃:ñ3þßù¥ž {½äòJÿGuëØy‰Oö˜êγÜÏØ¯]÷JgùõöÚÈ£ÄËœVyT:‹‹÷dj=/UÿpÖø\L*žî5éwÁº2†òð¹å~I––}¬gØÞ¥~>õSÝÅËgTòJ/{î©åª/ÉÙçu5'cd„§Z]PÏ®[Ìœ³t¿4̽|]—äªÕünØç­0‰ãò•|š=¥š“[•ëÓëÙ*?{Ƀՙ9ÓµËþ¹O½ƒï‹³:w¬g0ï“oÆXájF%¦ôlظj~ŸùQõùG=„É7iÞ ³îŠ£Þ¿ ölG­‰{‚s\qRÝí«8Š‘QoaH Í÷¦÷N•«ÏïŸêá\ªZ¹¦ uŒ|ûul|…CŒ†¹WõŸÌµaÖfuG¦¦ÄP½”Kê%Nš/5b?v¬ûÜõQ÷ÌoGõšãH'½ïμêXù­áÈyÓߣ®‡ú¯cÓÖk*LÝYÃʳÞ7 ûYÕ“X«üVõÔýq6c;Ž>ÉZæ¬~Œú"GbèlÎ÷—ÇÎ9[õ™×H³Üµr:jÍU«|ç:v¥“ænÇ^ƒÔjõ>'>g ¼±ê«Žc¼v¼Š«cÝ¢Æ#׆ãÌë™sb‰_êÉ|Ùë^£U¾g¸«~%wiª¹’~¨â±o]Û¬“ûó‚ºO’/ïB÷{C]§ÕïÒÙk–1Î4¹Ë»É˜òÎËܯ½ŠïóMy)Žö?‹3ÒE¼ó¼sÏÜ틇Øuh˜u¦Vù—˜ª»ß sýÉ­ò‘f?Ïëog9gˆ¯y¬þàÍ8äëZг+=4/ùæc<÷ƒÞOPψŽ5®tÖÕ0÷_~¹`í·Ä®ü ÿ ïÿÌHçK›šŸ}ÏèØ1å÷†ûËçMå‘jn®f ±ˆsŒÌWþâwªê·fy€œ•ûטçPÆSbç{Z|+®âÉZ“Ÿÿ¶G>îéížÎÞ‘§½GS;ϼ˜“ûCø÷÷1ô¨z¸ÒWxâ)¼7±çK­ÉyÃà,l×6uÇÊNU#÷ña®¡ûÊëfïWøä÷ççðŒ+Lð¬<ç1¦‡å]ê ž¥Æ<ó)¦Ö<‡Þâ³ü]r๮·úésrÂÄo<µÇõå>ùV{µœx¶Î} Sã÷0ý©óåMec¥ÿ«Þ§‡ˆ™œäñ; îS=Ê õ•:sò,yä’&O0jù 纪–ô‡8){„§ÌɼQ]ϰÏÉ ×ùz¶é bÿ€c¯eV3Tér©†¶Ï÷†ér&Žö7¬sQ{Ùß*WF®æ¬È«•^¬%ý•Ùì5øÜå´pOØÏ¡°‰«~j~ä_õît¿Oºº?ÒÙ'ñHÞŸªïÔÊëÚ0ßmê}5 ä¨÷¼ëçÚ‘'±ˆq‹Cüøü†Ù'i"ÅÑýÃ߯¼S½£\'æŒêÒÌ“™Õ0jr½äG÷ûH¼Ô)uÏùõÞ§&Úã5é|Ï‚GØg±ûÐß É%uò;“°2ÓO˜ýÊLÏ™ÉLYõš­î ~ÎØû—Øšï ûÚÕqVFˆŸ×ù|†ÿçz\aÎ{5•ÖÔh5®•߃…MLîÏÔÒsp5|®ªž{OÜÇ®au¯¦s¢w¼—«ó+¸Æ™ÕÉgåCÿ¬¡s2³›¸º»$.3WXâÉýÎKµ®úuéž!½èŸQëœØÒÍýéØG9}if_¶7¨ÏÉ3ß5û@-ª÷;ñ„%M7ìgX϶ûgÓëU®±ÏJϹ¬'ýë=`å½Àu£f~GV¯òŽþk8×.ó“½öwªs®Þ‡ÕýÎóìE´h¨õH|÷ºf,kn¨½¨w]ÎÐÊ«¬jØ{Pó³abdTõ¦Ž+ý¼Ï^Ãy­Ä”w6ŒzV3,_ð§Ò­š1å–xõ£ªùH{ÎîÔw„†Úƒº· '=w‰kõyp>Â"'ÇJN•öU¬oÕKrú5f•£U›¸žÑ°ž³ ;{{Â9ß0ß•Þe™ôLžêMâ5ìó65ä~ßÇ=|–g¦¶Ž{‡=G¯™ß‘<ƾæÕ»(ï^®¥gLÕip”ŽÏš¸>Ì÷ÿ_ýL«lO¸†+ ÏË|©'Ô}|ŽÁ±ÂvTå ŸPŸÁ?#sA}ØPë ïÓVù(ìÔ„¸üžN˜žÙ+ö´aÝ/i¼šéô³<"^ªÏ©ŸäÇç¼Kóê}ãç­<™~¯|’zyEØÔ&=BÜÄZiò§ÒWX«ï$œ£2¤òÃ*K+¿eîˉ™úVü+ÎêqÝÇþöËôO¹utÎ3ì3Ü}çglØ÷”º_šù†ã*/+ëª;Àö9îXù7b^cjw”Ô¡¡þÜߟ§?^än ï­æÐ1]× —Þó»±23¼Ú“ýåùš¥›ûý'œ×Ô°×(5ϳ}_å}^Hï爇û”9ìE¹N/åþ†ÑõA—•'ÚÇ=¼7e þ·Í}f‰×³úþÜ3%Ïp/®ðWy’=S­Ù7Íô-öu7óaÍUÎ]šgòÒ¼%îê>F\ÿ|UÕëZz¶­jÈŒ{„ý#m³ŽŠ{êQñm8ÇÊÞ»Æ/éZÕ{…óšzG¿þ´µG`x^X]«%5¬‡EQ\?P4ˆŸ  ʲ¬®rP¼ˆ"û¢¾]ˆþÿá9ÅÔT:sÄ yºIuuuu'sžø~[?në§mý¼­¾­ç¶õü¶^ØÖKÛze[¯oëím½³­÷¶õѶ>ÙÖWÛz„CŒŽqþÅâ,Ï5ìg¿¸žû{ü_·uÃøÂyˆËq>ÞÖç<ˆuÁ1âõm=À9¯pÌI¼.ØñëLŸ÷qäHÜÏ0r&þרcTœ3Î[¨õ¤ÄÿÇÉ¿Â|÷iýçz¯<äøâMžß`Ç–c°nÄ OñÜwŠ'ÞÅ^[å±âÞ1bãe ŒÔÁu½`œûǼå1ž»®Ž%=Ý·®á3Ì9yx­vÌO±k³ê‰Žñ'lò%¶ø¦·¤ó–v·jž}+ÏV:8_ÆàË|5ÓæXª×*?±çàøò‘j(žÔýUqs f?jV¼˜•3=^á¬|íµQzo¦^ôïÕ§šŸÇy¢ºsžd¾Â^õsMLïkêéor%ǧ˜1‰÷ž÷tug3_žW^®çR³ÊËÌç[ϧ&<ç|9ëªxÙCšÍ©çõ55à¼ì˜u}ßqsFdí³V•¯Ò÷ GÎÒꂽN3??4ìüT+¯sÇüPü¼s}ÿ*–k ü«¾'Ö=æšÏk×0ø³Ï=ÿ³\OÇȹ&ž~W_0×ʱ+?kå#Þ YëäUaøyòp§ö«·¨rUŽU¯3Æö\ÿÁè)õ¬×ŸÿÏþöÞÎØÒØ=p¦-µy {N©óÙ¬w}Ä‹}ºÒ:ë->ÊO3¯á¨å*~DZ/4w+m仪7¤‡ãTZx]Ó3ÎÇ5á;Ý=Ó¶õ!ŽóË¿‡ô¾¸`oåƒü†8Ãë8b[ÃñœjÅØÜ›žc,ÇÖ¾Ô:fÈë9›¨?ëê5uÎUMåÿ|Ï1½OvꛣâÜ1û£açæÚ1.cº7åKõŠpŸ]÷‹'ñ[gt_8·ŽY?ÍÝ; {-¼®ÊE{©µf‚ö9¯ô•ë˜ï©†Ù«:ýº¿óÞK\úÀõgéÁ³'ïãJSá—ê˜Þ¹uG1çì¥{Œ<Óç‰×0ceoR»;ìµ$fÃî-σÿ÷Zgêá=«X©‰ú¶c¾›Ü9ˤ·{ÿ‚™cú8kŸXÔålhư¿:n•¿üÎ=ž“~ ñZ¸¶êÝŠ7uà|¬¼A­ÏÞWƒ§óÊÞ` õ9ïå¬'cqÆç=Xùˆ%÷¤ç ìÄè½’8>c}Tù3÷¿qœƒ·z#1”jN>Äh×3Êÿ¯ëÿÅÙcq¯sÍ~ÊY¸š3<›ý(~uMÝŸ©ûª2çn¥cöÓê=±:jßgœÌÁ{Àïñÿ§ò±…«w”ãvìs]u÷ù¢¾qÿ-²â',õ~ê,/匽àèÿŽ9_¿ŽZ“’Æ ÏóðÚð¯êé|{HòɺHKá(?åä5ñžKœŽõŒ!–¾KvLiN,é!ŸHóô¬4•7øv-é{¯™Îéþ¨_>¨µV7OÐÖL¿àzžÂDð»ò!zù/=ï=ðäwÎMÝ?Åa6vš¤oßU ®0…¥zt½åx5÷?­ÝwÅPçÜÜ»Kmxž‹÷e­óÜ×]x5Ö^¯î>”¦®Þš9è5¹ãÍԖꂘ‡]=RGàÀ5ë 3ä¥(6~S^Ô>9R›Î_ôÑý:»'³©á¹Ô‹ûNõéâÛµ±Ô~^ûS³ÎA÷T¾U–ê=3›'î¯aâe>–øy}Rïà0ßoêx߉˟uΓZs/+ߥv=$yÍzÇŒ8èb6·¼V:Cô1ÄUw…×îêŽXëìsŸµ]üŽG[òάÇkõøªã•fËuÈ=ÓÊ]³z­í{µO÷>¥„7óQêøJ{êÅFöCsWxô’÷šÎ27»³®7ú9{/g?;~G1è­×‹Y°ÔŽ+,ÍTÎ_qÌÙ¹Ô¹§ð”Þf^!V~×êb^Ý¹Š‡wfúöÞ ›^¹†µ—ÜÙÇ\IÓ}êýE9+uÞç®÷ó®{†ú×k!LjŽÏéçMõ5_ëÈ3½Ðéíª—ÂÌžÍtLÞôªã‰&\¼žðM~â¦ÿ½¯âÉýãXŽÓͤ™?Ð\¤ }Ïì0¨ÚÒ]à¾ZêˆuŸYÛy†Y’^%Çì¥k-ï…³§ëç3º>»³^[áø¼¢.þÞïµäô¤Žš×¿uî_Îjå^ežýTç^$ÿ×ýà3Ìc0W¨Ólž¥‡·Øô¼|WÀùßê9Ïü+fUÖÛë : ÞQCc¯ö¥'ñƒÏ7ÕÈsñ<O½Ìz?¼=ëê´â\fuH Î<Ÿµ¶ü»þ“¼º ãYí8/<îzM=q'dÎ]¿,M­h¸$å¥Zƒö³7çˆöÂõÃÚg%3³ä«sÌhqŸ(7éÐë×åÄ™sѽ¢º¥WÀ¾ëûp7Gü÷ÁôÜý^Íþ§ÇÁÆKí½ÕYÏ×¹äÜÑ9xÌršÕîêmJ>]/<×Dj¨ó^w]tç™ÛKí½Lo ã>žšåè}»OÏ|&i®ù Á›ÒÖ£:×l­ë\›°¸©U×ÇÔ…ÿ.°Ôqn|]óûb­£?ýw~oèÞ9›ÒWõä=8ÓýÏxÄòûï¦Î9IŠÑibö›y‡»»Àñÿ­»{É5ëü\9¿:¯tq©g»¼.:çú¥¿:«ýìÑçêƒf‘øk†ºîžÔyîû Ͼ\q_ëØ´–y u3Mxkm<¼fú\w=wzêÞk9 ò=!þOë<—éaâ?¬ÝÏ'„é^îx.užW³Y%~×q¦·ÜÛWµp?ÏbŸ¾íæ-XWžZëìWǃ'uuÍÍjrŸß"²wKñ}®]ñOìÄ£–žÿ1ÌM\x^Y]«\E¬‡`Pü"Štj"ˆ"¢$aQ\$ ñA|[<øÿ„Sœ-¦Nž³7^˜—{gª«««{f÷¾ðz_oöõV_ïõõa_÷õ°¯Ö×ç}}Ù××}}Û×w}ýÜ׳¾N}ýÒׯ}ýÖ×ï}½èkéëµ¾îc࿃ŸØÂ|Ü×}ý„OXÄy[œ÷ûú[Ž_aåù × ›¸—¾îaËÓcPâK‹Ï0b}Ñ×÷¨u ¶0už{–ëïGz7lù?ÁŠÍ3•3¾â)~ª±Ž4žÕ,õV. [¾î‡çXñ…}ÆÐC?žá^rX°þ¸Fò¥<ù)öž¤^¬u•›çUåôö~®0•SjæZÉ×Þ3^ƒÿËÏý'LÇ"΂q¾êãÔLz±n3N3>®Wöê9ù,½pä1qži(Î3/˜Ï›ìãÔCõqìÔ¢âëøÉ›¸Ä¬æƒk‘ú:–Ïç©™v [¾dÍ|ÿ~¹îqߤßf:U1oÍåÖ0ê:Ã;cà¥`häþà"gÝØcÎú,=÷Ûú%ÎQ®YÇôﺬ!ñ«Ú%Oáf]ˆw«'2ßj¦Ìú âF¼†õ¬fˆëüòº¯òAåó†}-Å…õ¬¸Ð#®UúlæaÇ&wásVÍê›úI7yn6GìÏ¿‹½?仼Y ]‰Ù°rQÚ«}wñ¥ë‘1«ÙZÕòèä1¨7çÖSÔÞ—wîa?kÙûU¼†mÏ*×ã.uå{r†­Þ}‚­w|+Îk b~‚Z;¿?2‡Êÿ³»”?ÔÊcxmª\¼ÏŽ|F®Ì—¹òýèõʘU^ùNÈþv¿3Or¹u§ý‹}ÌŒ—zJË Wž ïf¸¼?«y’ùõÐÌw®×«Æ¨Þ¥'ý0ÓG˜þ†¯ð„•÷¸û‚û¹—ùUw–ç“:ñ¬z‡çÅ•ûôwùNø³œ¤}«÷€r:cäå5÷zk4¬xê{Çñy¢ó<ã\T+?Ãýé×Éç§{·ª·ë¡9¦žÏ÷£÷Ï“Ë?õåyíg¾^×ÊGé¯Ó‚ùý£z17éZõ½ô幆½ž•×]ÎóY?ylŸo' m…K¼·±Ï¡a‹I,Ÿ§•O¤‰ûͿà ¯ì'žãŸÚŸú»GÔÚd‰WÝ > *¬ G÷—ð‹3wA­‰ð„¥·VÕKÌûÓãŒç¼ù3ë—†mgsüŒZSõ°z¯òœf¸ûŽÚ<žv©¹sv¼'NØßm®mUû†­Æš7³š)÷䑵"'ÎÝ ç‚13UƒÊ?ŸöœÔy²ÿuw7¬¸‰á糦äåwAr¼Õ÷Ëu~aO¸¹O¾d|ñoãšž°¯÷Ì/pÜóÒYßÊ“'lµús½Ò[òù Ÿ¹Íúwã^õ—zÊgÎ ûÙ·>‡+m܇ĦFUéÇ™>ÕwŽŒ¥³~&6qtV³Ž{ÒG³ØU\é—³é(G½qÃ{%}ïùͰg>˜}?¨ºûý\³·ˆå÷¹{ÊõxŒíÌ–·ª8gŒù(½©EÃþ^ÒÕ)kãyùœ¨¼åó³]Ï‘3Ϲ'Ò·>ÞÒtÁW«é}’1ŸØ®ñ„Áóέª•>ÏWßiJ_ÿ+ßOɯÒ8ãÉgÊy§'Ò›šo +?ñQÿþ‰1OÜÏÿR¿Jx^YM«E¬E0(&´?!BPTLTŇèº{0ñÿÿ»˜[tMÍé¹Oô&wººNªÓsožh}}Þ×}ýÔ×Ï}ýÖ×Ú×}½wùl¹|Æ¥¯û}½Ú×k}½Þ׃¾^ö¼Ù×[}½‹mÿlç|Ô×'}}†íÌg}}Ù×W}}qŽxü‚Á…gòá&&±œ'÷®—=þŸñ:XŸ!ob¿ƒ³öˆë Ìù GZœÕ®šgXÔ•0øÌ°ÈëÛ¾¾Ç†÷#ö˜Ò®ê•zëXÉ)ë’FäÓ°íý£§¬í»¾žcÏÇû‘\ˆé5¶¾>Ä›üžbèÇs¼ßª5±É·Òν—u»ïîaè ¼ÇØ{„xŸbã8ëíŠ}nÄOZfͬõ žÌ‡×ì=®ú${Ý©gj™þ‘Ä$OeÌëð3ݳԈg€ãùÒJõyfæažÓ°aŠWòæ¾Jõ°¡Ö%µ§Gœã‚ú,÷JæEž¡&ïãèÅ3\ÕÊg]£¬M¹>›?™£Ôí¦¯_±Ízˆïü…ãR†*î•çÉïmŒÜÏ´Q_Ü+™ýÙ™UÏ¥ Ïþ™ïoq«aú6׉ãû=Ÿé‡*› æŠsŸeîˆÉÌåeß8Wx‡T礦äÉgäó̤ÉóåÞËÌëÜìcêæži8ÎNÏð]r«ZxFr'ž{|Áãw ñäûOöŸ{ô¹×ReÓ35{b6WsEmäka9ïÔ˜XÞ?÷²xè|>?ë·{¹¡ž3ÞƒŠGÕoŸe³w ö[zUZ%nò–‡|$w÷é‚;û  6ó§ÞzÞ¼·Â­ø’gæ:9žé[ÍŠ†}í³{ÁëUòJjÏ稉žSÿ2WÔD9õy絓®Ç#ßoª¾¥Æ®¯sSæÅ+kçóüsJdzy'o&—ÔõÛ÷0Πÿ‰M<Ö¤žpß †é3?ËûAìY~½⸎³9TùA8™Íô“öÍø¨·ª©z×7’0ÓçUŸÜƒwég}òÕühØóa¬¨ß‡ª'~yo{FŒ3r&©/ ƒïzùÈ9¹÷˜/îS/U“4RªŒ‡çò·Õ•ú¨õqÁ±éœúäw/¯Å÷‘ƒß!ÿwÖe¿Ýç Gj–©7ªI¿æûôkÃà<›õ³>V:TøÎÿš§äÛ»ðUf“|}Wšˆ3ߥ’wÎZs6«þ¼ì‘ÞÊ12ûÜ—õrÏž›Ùœ}_—ÇÞdï+ÙÏUãŠI<îõ¹)Ÿs_öÕù¤¾y¶pä½ì§ð4¼ {½5Gì9ñÏq®yM3{é—z7Û§ž¯Øk¡su^ê"}³–ì 3é¾&nòwÍg×wÅ~¦{–gZT\Ôç¡ýYSÕëÄZ±ïSÎGŸð™¿`¯ëªòà^TÜÇ©szYwÐL£Ì…ãÉÏ·³Æ† Ù¨îcáTúpŸ|§3Ò{³™Ç½«ˆ;ñ¸GÞ”—ćžç†ÏÈoÉ]žËœyÈï8•w˜ ï™Ïå†Ñïj®ß`鼓¬­ÊçŠãÝãw£R­ž¼‡…G>ÿ ÎD5·\·¼7òޝô«ü®ó”iÕþ_zá¼õ;]ÅÿZŽÔ£®üÜ0ú¢=ÒÏŠKÎêåzËëÜ“}T ÕoηÂÒg┹L/¨O•¯´çšvìÑl†d¿•]÷zÞOò–ÎPÿÏüDßW÷gö¥Ê\UßrîWç²&âð™ô_âj¾ÌðøGŽgäö Ž`ðÉïÊ»þ:J›¿/û¼?Ê`öጻÎw¯ùYøUßäi÷O5Óϲ]a/¹Ípªú+í+ŸWkü|/˜×]ayn<ÏOQß7Îï%6މ9›“ÒÀß­Î2ñ†~F…í¸=%¾ÄP½Üó/ÏÝK&x^•Y[‹E¬‡ (^/âðáB‚ŠI”AqEò"¾-ŽþÿaóSSsºg ôK¶»Î9uªN÷ì>ð¤­ÚZÚz½­7Úz»­wÛz¿­ÚzØÖÔÖ¥­OÚú´­ÏÚú ÛùŸÛú¥­ßÚú+Þk¨1?hëC¬ØVLâ}ÙÖc¬x?aÃü+î+m½Š#®çH,á|kÆXK[pÄ{+æ;Xóö#løªÿ ¬±Èã}ƒ:ó‰5fUƒÇ™päCÿˆ=vÖáœ0â ‹¹ŠÛ{ žW^Ù/ïUÅqâ‰ß;lõf¿ˆ;aÌå ±¥ƒ[ÎÄö¾Ý`¯3å-Èå¨OÂ'væìXêËÓ¶ž¡î1ÔýöÜ&ìûDÔóGn¬ç仿±ÅÈ|'ìõD~¿Ã–óŒß±ØÏÓ{ÆúÅ'qtžù0úFÚs»þÈ‹kÂ÷Î×}ž›÷ç\ŸžŸêýÇy˜®'ï{…ëõ°þÿ\ÎÿK8¾Ïæ,lr{6Ç39qlטj~¥_Åà?Æ‘n'g‹pxÆ{4Êé‚ g4Ol:ÑLrMŽÎU}u?÷øqnf±½>Ý™—4ó9öó͵3â]º¬´ÃxyG»×çl>9G½£YÕó±4‹¹?÷z özqÏñ\úLçôÎðÜ3歹ögÔ¼ á9†´ª3Ιô9]÷²ö]=¨âT~yµF½×SUÇ-Ž÷š¸rž˜ï(†óŸ½“F+í¤nÜ~çkFë~f_^`¯[çì/l|Ñâ›1ä5÷ñüÎ#–sBœÌ÷‚/±’ç—9é^ä¾;ÔÞâ{å-çâ„ãÊxä ×Óœ ½÷[Þ|ô¼Ð‹åµÜ'¦ôTÅáŸùÙu”:{çŒâøêaj¿fCÆbr#Ìô¯°è[ž¡·z\'¿>›þOÝ©ÝašÄ”gñTWâ¨_Þ{Öës7±þD¦ôîºì°Ïî;y¾š×Äsýô0˜[ö#ßUnŽ·`«Só†<%ßÏ#¯¥/±¥×¾¿e7õÚ›äçìûØÓZ¾'¥aÏû>ï¿ÓÄ¡ûÉ÷%w<Ï;©ªQšwœ¼?ÅÖ0ã˜SöUù|Œ=/îŸÒ¥ðªųkÃë[°Ï+û%¬ V¼Š'Þ ŽùT³+}ç\Ý¢ž[Âô™˜ù »7lÔ½ü[õ¼?ÇQWâH~™°žzÝ;ãØ£åzF;?|÷î:æRñ­zÓù©¾Á*=TsïìÀ7Øú[õU÷HO» ö˜ÉƒðäÍ^_‰u‡#^¥“ô­z<£ž•^ïn’gõ¾Õ;«š=~忊 é²ÂKß«wo8^¥­ÄaýÄQ9C¼Ÿ®{5?&¬ñä#î®8õ}Ôfæ“Í}kä\q¿8×9OÎ2™¾w~glØÒ÷H—Õç­ÎhNQÜ;âÖuŸÜ¦Ïzyܢ֪ߕԻÑwK寬Eü¹/ظ×Çù»Ã±'ÉQå r“Ú;óF/ÿ¼#zßw®ñJÛU/2VõæÏ¹ý¢K|x^X]«\E¬‡ (~¡¢EGñ+p1„ DY/¢H^Ä·‹“üÿá³Å©S§g÷.ÌC²Ó5ÕÕÕ=³÷€›±¾뇱õóX§±~ë·±~«õ`¬WÆzm¬7Æz{¬÷Æz8Ö'c}:VëKlxÖŸ˜8¯bÃzÞc}ˆ‰ÙÆúj¬¯Çú·Â¼Ãüïuìù«â(ÌG˜¸OÆú 5þ˜¼Çý®UÇ<ó#lg5ûž8ü\Ê›qcãùö\ÉSµZÕI<;êZ¹ [úJÖíDZžažñ .Ÿ#½‰O\¯}zÈóWœkð>&G×1kFžÊ?}ձϛ˜ÄjØâÝ—KÚGM´OùVÜWž%yV= íþÂ^“Ä#ï¬S•÷-jnï`ÓtUs÷¿¸VõNm3ž! t–û7Ï»Ögóãµ”O”×}|¢~¡Ÿ«óªY”5uÿ0å lõËJ;åô|¬ÿp¿>XååõÒy<çÅù{þÿ]å¤Ú´ó^ÕÄsP]”Gꔵ{_‘ŸëœÞÉœs.5lõ«r=á¨kÇ–gúÜ}]ùJ<¼Þ®;=œþõ;Èõy€‰+LÖÐsáýâ5»EÍÁÏ÷³¥Å}¼Ö±Ÿ+òSÃqþùÞU¤®âô î?;^âzý/õðjftL\×Q|+ÍÐöï°iA,ñb|ãû+ïÉ¿ÔFµ?aÆË+©¹ó¦ÆîÆVºV8>ûsN6Ô¾ÒûϹæyœaGþÒ^3LM‹UéÙÊ×|˜9¬¼’ç8g÷ájîVæJÕÃ{»õê9LþO±ÎAzeÝ«wTêÅsT Í‘Žï â;6ýóÝ9Ž1Ü_i©{Fo¨F«s;Ž>Rí5 É¿Š%çê>uðY ÒŠSL;ïå>晘9cäá*Æ=¬ýÕ,—Ÿ¤}ÅŸû³öÉ©Ù~ïÔNš¹g…Õ°_i–\TϳšŸŒç~ÏKù S~P-ä#ö‡çÒ-Æõ éáÞÉØ»UÏò}#->ÇQÓUvìûÂë¿zÛix/gdUûüû9{νy /}¤È9PyI<;Ž3xy·ßàúÛÙëSÍUï éGŽùžMŽž»crîÓï0婿ŽK¾•šËy‡åû cÆŠ‹4ÒwÔ‚zòÿò¬œäN|÷U¥qåÕ<–p*/ISá4½Ä¹@¬g¸Ì-ët‰ŸîÐkxÙ;ÉQ½sÉëŽWqËþVÞþªðÒ¿ô#ûg•kÖ„9Û®½ «¼o±aó“þsM5ãWHWâ>ÇÞƒ©¥¿eª¿‹©NÞó'õÐïﬓxzîŽC Ͷ—Øî ×’Xʵêµê}âµeg¶ê*m²ŽŠÓɹºªã]ϪöîÏêw@zžy(bÝX }âÞãý'¾îƒÕ›Pçä\’ÖòDú‹òÍALjÐqôkê!=ÅQ>ÍûéÚ¼Oï[qÔÝ,®Ð<ªrYiÊ|^`ÎEï¿»<ùžþ\Ýûãø·¯òTù]Óp¬«z!{ؽ”úeª™BŒœ>¯VýïÜ.éz‡ºgWu&¶cVù®<˜p_+ÿŠç-&Þ¿Øsõ^ñùÚ°÷U5û;Ž}'×Oy*.Ïf>ú-ê:{h¿fˆ<š=#?æ•^ ûz_ª³ôû{|yÚ{==‘wcriØ´–ßèaj¾z'Uþð:xM¥—ò佦YágÛqÓÏÄÔßÈ6Þªur–O|>8¿ô¯4·¬¯ë*^oaÃk8rr=—ê*Ϥ†Äã¼Ïé½QÕ¦ªßA û<Õ[«Ë:ÿvÉHwx^•XK‹&EŒƒ(Š«¢âD QWAAwñI£8È‚xoƒíüÿamPQÑY=ã@žæ«¨ÈÈÈÌî~`ïñB—z¼ÜãÕoôx»Ç»=Þëñ~Ö㣟ôø´Çg=¾ìñUo{üØã§[Ÿ{üÒãWøÏã¸ãEw$~ÃÀ&±üüÆyñ$Æ[8pÃù­xÝôx†Á/sçü…-Ü 3&ñˆEžÄz#ÏÖãcqà|ËõK¼½Çs¸É³ÒPù?E¿ðRSÇuLñ.käØÄÜ1çþ:,éØ0ø¹w*wÌù>¹6ñåwøv•wê©zïk̘U­*ÜŠ«tdí+LyÉû抧jDÜÏ1|Ua;_¿ƒý¤z¥ot†ÞQ~ükÄ3~ÇÍgv̺¨oyÞuQÄZÕîq–ÒÉ…gïó|jJõ憹6;ήq>Àœ›xmX¿a®…c‡9噜 ÊÉûƒºêÞÕ¼Ú1Î{«äÙÿã©ì߆Q«œj<æé5SOy~Ž¡óҶꡬ5ùp.W;m¥™0Ó;ò±f¼f‡{²ÒJù¹^ôT5?äsõú•~ª¯×µá<‹ÄQ}ï8ÿ`Ößsæùìžq?ËWy·ÏWù*÷ÕÕ,q­ªy(ä5ß9©“ׂ¸Ò¿šQÒ]xÉyå»ôŠÏ†ä·ÊßySZ’“|{å3Õƒ¹U\\7÷ņÚ_üÓÎg~ óïCÖîÌ^w}\÷‡x]óÐïÈçâ\ùlGݓαâ'Ý’§cû¬&5&gm>ìrÝqÎU;C¼œòeWçÈ#µâù•¿s¾KO}䩪~Âq>ù ÊóÕYéúÎ÷}Vñ¹Ò8÷rê%\÷‚|¸©ñò™ÖuWo¨gÀŠp\oÖ¿šë·˜½žõS>ôŽfgʼn|„å8Õžýg/¬ru­ª^ä»UÕ‡Òþ)®Ÿ³¾•^“ô®óÔÜq~še鑆¡ú¼â˜Ü2ÿÜ%©«ïÓ 5®ðèEö¿0ɹaøY<ÓC9VWû1ÆŒ"g¯Ù}~¨|–;>sP/$öŸ˜çrz—xz–«<»£®•soªVäUá’›úëçgþÔ:9Sãê>¯eÕœ§;ê|ÜsÂwìpÎ#{®âïå ΠꙜ>kZ«öžxQ×ô¯z"{Ló°ê¯Ìó¾Z5Œ¹H-ɵz÷%¹å^”þêOÕíêÞ†ù¬zĽø j?®z±ê{ïÉ|®<É{9·«;¥éï˜ë¯;sƒgyF¿kûYÿßQëÄý"űšÎ#ßÛr‡xÎîI×9±É-{$ýM<¯›r»ò¢×k57Výò<Í"Ç“¾OTæ»òÔŽ3ŽÞ ˆ•³Ý=äs}Ãy×e¾ÌUÏ7ÒõÈóâUõ’fºs©Î³o1ôr¯T}ÒpÎÏ{D}¹š=;νá~Ì{ÿ»'uÏj–S[å•uã¯aÞ}™ï]yØ©wî‡Ôæ Ë}J<žõ} ¯0Ÿ¿ã·îêåÉs«=ª{¥ s¨öfbJsÏaÇà•³à!¾y‚ó·Çv½«o*ÄåÞ#¿‡jí=§y ïY _z/ë—^&7žõ<¥×мsæºÎ®ÅŠÿŽ“x«¹èúúŒtœJƒì÷†áe÷ÀÕ÷ qäÿ«šUžXåOüô¬ð…•}rß3Ü*?iÅýÎZ_Í/é¦ïúÙ+Ù{WºkÎæûXÕ3ÌUûsÃàµcî»UŽ9xöó.OnÂôgתfßã~O¬r¿ê‰ÔsÃŒMþªy•Cro¨ïpm¸¾CžRÝT+iì:CçxF¿å¬ò¾Ô\JÏ^}sô$oÞy‹ó¾•æÄr¾Î>Ïzå\o¨g1ÝÿÖ~P¾œ¿ùì_§~Ix^•XíŠU,0(JÄ5J4(:ø Á`‚¢rQ\į<ÁÂèû?„§˜[LMM÷Ü›Àù¡;]]]]Ýçì>ðÓ8§q~ç·qîóú8osœ·Ç™Æy2Îçã|9η÷ ÖØK,ãŒóÞ8b‰ýªˆÑ÷oŒó&¶9ßÁ6/ã™÷ö8ÌýV¼Ä"Gã|<Î'Xq¿ç›qžŽójÜ«&âI\ò#îXjþ„û3,¼¿À¢sÿ÷¨s‘ÿK,ù˜'µHîÔC˜Þ댿ÁÚ‡Ž#ù=ÇÂ-yIÛ?±rs}Ïù¨âáú{nÕ¡¼®yæ’ªÇõPâPiì>‘¦Óù»J;Ï÷K¯Yc²z©óÑŒ½/…ÛõÄ1Ÿ¡ïÍïXjª2WW‡viæÕlTµUùR·K¾®rVõåÒ=Äú|NXëÓüTØ®]5ëÝ®bžÇXr°Ž£¹<âi_±7¼KåÍñ%LÍx7¯—R‹Äõy˜°j¬þéQé0£ö&5MOª_É+ûÓy-=@]ÂSmŠc_GýÉÇ÷\ú'yÉ7•ÿ…›sv¾aÏ3}ÉÄϽ$î¹£‰?cíoêXiHW}QÅõÇÞÉ9JMÔ#éLu3¥<•ÞÇÖ öót­ö3êZrf?±ä glÞ{GwÞŒýnªtÍ»$g_uw5W»°ª[y>ÂÞ×^ƒp0ÒgεÛÙäx‡­*ün¸&—î#äµ£9ë®´NÎïÒ¾®f¹Û=ÚÝ®NÌ#¯Ñö»G{§«¹ê[îíâüˆ'ëN¾«ÈÏ÷arñzSÃôPê'ßh†R;Çã?iè÷úà3É~tý•׳ÒL<'ì½wäqb¿Äªcú»«Ÿ;TÜ;Þ·X÷‰óÏ~¹§¼ŸO¾}ª¾¯„MÜÄb,ãø-ÿÛïrbT¼Ä)ß|ö^ï¼à®ëê8^g…sÄÑùù½" Ù§WÑ0sÜ Þw™+ýFýÝzÂÞÛ3¶y½®JsÖÒáÉËÄáÏ»z¤Ù5¿‡²ÿu¹]ÇªŽ ûžH'׈½¯4º‡}z÷MØö@Ø•—œ+õ!ž°\oߌcÌŒåã¼ÆXwî„UCq8a¿oXOöç¨ïê…ïðJ§ô’ã+1ûöñG3z¹oŽú{Âv®õ÷¿Ìwi÷h_è^<¡×#±«;ƒ˜Üë~WVœ{:ë=V.búÎáÏflÿþH.ªëñ9†<ãyÔË|ä¿Òž3Ûi$O/ßnô›|Âoªý”ªÿÊÏÜÝï0·ØöHýñ¾S›îmL|a»Ÿfl=ì CuU=ý÷GÔWw“ߙй;ÇäÌIΊjy•yqÝN¨yæþðœ]>æÊ;ê.ûœ9Ôïƒþ.ãgc^;Ç¥&zÿÉc¾§•{ÆÒ‡ÿ°æâwüY…—uJWßá'ÔµiÓ×ÂÕû^󩹨4ëÞÒ.ûBoW¾N=:LÝ;Ùó ®tKžœ=b¨æõå7ÌÅo|.‰íó˜^Ê<Ú1Ò8ñÄY½£Ývo¨þ¬W:&Ÿm×P\¸Wµw*U½9a[çߨýžóÇÙÖ>V|ŧ»s^ÓÖŸýô·Fî~ÇeÝGû²ÒÓqÅ“ü´kºûÈ1“ë öóÞiAÎùæPŽ;¬»3µÈûL~ôþWs/ŸÏØóÎVZWœÓ»•ÎÄw¾z§w¿ë‹õÏØó“¦ÖÚ¯½’ÓÿmUDÁx^Y˪%EŒ…(Šâø@G-/>AAŸ/¢ˆ.Ü­ÿÿVP7è8ÑYÕg‘«©ŠŒŒŒÌê{æ1€÷z|ÒãÓßõ¸ôø±ÇO=~îñK'{<ÕãéÏôx¶Ç£/õxµÇk=ÞèÑz¼ƒùAz|Þãëßbà‘ãóüÚã÷FNÏ÷\ç1r>îñ&ö|ïbäü£Õá9ˆ¿õx£b ‹Ü܉%î‰',iò"®kç]Öžº:Ÿ¬Oµ½‚kM«:ůÂ%7iø/FÕJlÞ'Þá9‘Æêå—爫ZyŽ8üwròÅa³³Âd=º#þg½ïSãô›kãº÷³_¡Æ—ß6ŒÄ–÷žwýÏW³¼ŽœÒ®÷ŠxôfÃÀzûL}Œ%ŽÔú¥Ç|†^Æž#y»ÏVžåñôJ•£Òæ–~1—çpÜ;ùˬøÕ<+dž½¿®™f§á8ãêý¦wA­Sú&ûQõ€}'wöZúT;”{Üݓ䜺 Wü«ÞVZkßW˜ÒZ'ž<.]µw‡¼Òk®ßo8ΟêL¬ô—pÙ£Š[µoX¯fº¡Ön†KÌ{\{ʱ¥#ñ«=Æžg×5y«÷+U;3çDùXvKå5æÕ“s¯=M?gO”/{ :\ß}ä§úyþÔšúμ{¸ësÄ9¯>KéÑœ!ò×Þõ÷Êy‹ËL‡ô‘<¤Þ:Ÿ jN^«¾Yöúˆ¥ý3ëÙ†škÎPåç»ÚCv/º÷²ÿÕù•wÆL§œá™çU qôTuèÍ‘ÏÝâå{†þÈ=@¬ÙlæÈY.¹j'V<½¯UŽÄ¾CÝ×3]+|iü:¾x§O.8z„8Ò aŸs÷™Ïšûß=á5T¹ØGö@ùäsÖÏ;gßP©§ú%œ†k_­°f³—=òþ¸&³o—Ä'6ù¹~<—ï¦êðùŽôï­úOþ/`ß“­ÇÛ¨ýÅÙ˜ù¡â‹6î•/°ÆNÞÄmxÄáüªvÝç]ο×îÚùn!'Gõ]¸šâŸíå˜Õ}ö·µê'fµÝgÉ1ûâܪž8¯[æJ½å}žåþÛJÜ—¹ÛÕƒ³üÒ]=Õ{;x…±â¹â(ô^¨o3üªþê›×{éžö]êuø÷©|­=N¬ÙNÕ­™h˜óÑ\ønb½Þ‹JÆcUgŸ3v¶¥e~[¬z”x9«¸ª~~{&g}ó‘ó78æ!ïj÷T³Çš½ Çw@Ö,=åÅKÜS®kRU¾ ǽ¦Üôor—6–÷.ý–~u¬Š[å[÷BÎõy ÇÚ½Úí«Ý›:¤÷ª¬cå?é+¼G¸~—ÞL‹Š[j˜o{Ùß8úgõwŒò‘cÃÞ{¯‘ÿî3¥Bfo–ò¯úÀ=·ªwÖÿ†c>驜ÕÎñ\ »g\qã¹ô†÷’\®çüì›BXªC¼ýÏo¿Wþt½Ùgõ¸Ê«zÿþ+m}®®µÕ{-¼ÙÓé×äǹq/ç¾a`Ëc+ [ï ñ|¦y_z+¥Ñê·Ò[|ç^çÿ¥xÚ7·¾sÔ,çFoOC½gÅᯇó9Ëê~É“^KN¹SÝÒo†ëuÎðf{A|S»|Ó+lXcçŒkf3N¾+ÿK¼*7ìœü~åÿÔoõ»à†Á‹zI×ê{‰¹È[»æÌãjmýMŸÍuµÓ]+åºÇÈõg¿1Ï©\^õŸ½‘ª­ò¢Ïúâû„¼…¹ú k6+®½vœë>ãUí.ï¥ë*M«þïµtÌ~_¡¦šãUÍÞâ¨Fÿ»P³”½LéÑœ{ösö Ÿ=`ŽÙ P»Ù>Ö|ÇyºNä¦{©«Ï·úô?°”I‚x^™[«]E„ûAÅKŒâE¶A…¢ˆ(Q6ŠAÉ‹¯åÿÿN1~¬Zµ{Ö9æ%™®®®®îY'y\UOÆùzœ§ã|;Îwãü<Î/ã\ÇùmœßÇùcœ¿ÆÙÆyuœ÷ÆùhœOǹŒóù8_Œó¸&ÎuÄÆ6Îëã¼9ÎÃÚc‰ƒÃOÕs ¿âßçãšñܯ×jæxÃî)WòUÎ/kæýªöÚ•;óR»ð÷ÚS5ÇëV|rŸjbˆ—ã<ªŸ¸©?gü¶:â¿5ÎÛµçîg5±»š¿¯[Ì?kâ¾RG]áÿ~ÝÖ.Üojï¡0­[\ú(ìÄM-À…¯cº¶ŠW­Äª^Å¢ÝÊS[Íjôþ¬xtu‰µ½¨‰K?VXh•}u¯w~¦§—Ú±˜c×ÿYÝÖ‹—½¯Â}·öI®òŒ°5Óÿr7€)2£âè{Fž[a #ýLÝÝÌÑŸ“Uœ'¾q|°ÕŽ ïkë¾þ·ŽøÎ=wã«wér°Rßk9Û‰Ao:?i¥®à‰ßjO¸¦7úu©c½¾#®uÄóà½ÑÎç'uäzßþ?¯žoǯ®ÞÄ­¦¦Š§·—:jG¼¼»µ«Q8ÔåZ‘:O{o»º:o€Óù–XÅøý.5\,ÿø~Ë™I¬ôû\=9ÃzYM—£»ú{a¢GêÉŽ<ãu©½ÏÌGç;´íæ/çNxø®úµÕŽ›}H\yÒçd5è¸ÕÄ®îuüWó™y»š¼žŸ^þS·»zU=v½V}Øjâ<¨}âÅ«ÝUn¯=뾋 sßñéޕƼÑwåcW¯úKο«÷š¨_xšxÝGr»?¹#¬‡uœ9ý9±Ô ¿ƒÞk¾]u—9Ö·HW›Ï„c\jç›ïƒbŸ×íÜçLuoomçå­&–÷ò¬¾C®µ®K¼ÄGúvxâ$/äï_ªq«©qÖæ;MX®¹óÃ[÷y‹ÒÇž‡ïÌ.¸+ß›÷å †»4Õ}qìæ ]gj²úÆò]ßõ¼Û¿÷¢&§Ì§ztw«ùƒG;þ93äd޽GÌ£ÇùœœÍ™Ï ÒŽï åõ¤ØôGú¢ÓÚ{é~¸Ö‘“üöé=×FoTæÈ7JßâgýÝ꼆Kõ¸¹+½ï[õÜ7ž\q×ì0§šÑÔßù«þ¦e äXñï4¹‹÷YÑ\ÜwæI¾+\aJNƒ­æ”ŠU}ò:{œÚ/Þ“ô:eŸé»G»ËëH_úÎÉZžÔÄÖ³Zë²Õ¾o¤ù¥v|ß\ëv‡nuÜY^ßê­êÞ¼œ4£>¼ \a¹ÖÄPÃjŽòZÕå>÷Ú²]}ôìZ»/û•~OaPW7gÜ÷ýܽq¹oÈ›{Ÿx_ÀØjþÐiáóž¬æºzøž£~¼ïñÛÿ±ÒL=%w^þÛ߯ïL+Ͷ×Úí·¬Ùw;(¿¡ÈáÞv_³‹.u‹ o×"9 Ë÷®÷Ayñ²¿‘?kr_eÒéáU¹»Þç ¤n>CÝ÷ Îû#So…gß%þö—ºÍážÏÿsîtRN÷ïjç3Éø;V§³à;þZ·ót¦«0ºÞtu%5ÁCzÁã?ÇGUx^­XÛŠ%EŒQW×U\EÑF¼Â ¢x_¥YqEöÍ'ÿÿ#¬ 7è¨è¬:gÀz늌ŒŒÌ¬3OüÚÎóí¼ÐÎKí¼ÜΫí¼ÞÎÃvÞnç½v–v>lçãvµóE;_·óS;k;OÚù;ÞïØñ^Äyî»8ð>ÂŽI¼/qà9Ö†3žó#^rü &y~šë v|ià1È÷MqôŒ¸>‡1žò'ßäúvÌŸqæé:‹œ\¿O±ßÕi$Þú†±T?j£˜+Ž»ŠUå ̪†Â'ö˜ã¦.÷±c/8t!ëVaI“[œ¹óÆþ%Ç™/è çêþ½”{…'®â¨œßB%œì…Ô/k⾎cŒüD}ÈÁsòžÉø>+¤³÷µ°\o×Ç}7êÇiÂ;©óxãž­tUü¿Ðë›ÞÕ^ž¯´NÏS:I“ŠïŒæˆf_Ö®âÄþþó>zŠ3GßÄg-}†|‹:âÿ†~6*†4¥Õ’é9qãlöü?@ïrüGŸ+rÌú¤—”»ûÙ5õþÈ<9“È™wÄG¾KÏmϾ­òËWsŒ|fµuí}ÇK¿Y yIuþãç|sÝıâ—ýQõ³ïù;·Üe£ü‰ÿw;ÿbÿ«´æ®`œª>Aÿ–¸”‡zÖsq¿¦§Ò³ô«zJ±Fzÿƒzä,¬Þ³Ýàe#*¦6Gj±`Ç#Fö•ûJ5óü¨i5Ék´Ã6œk$hÞ-8p¼öêý ù}/»nŽ]íHÕE^VݳÞμ5«¼—œw°“ûµÞM}ÕÔÅçêŠÚ£ÄÍÚ;ïgytäÏÔ"wµeÞ®¡î(~#}øû¢òþkÏv­¾šâìx¹c¥/gwx¥GÕ[Þ÷ úùRiKœ ç÷†ó¬f°0«wÀŠ>ÿ‘®3lq­<æúÞ ÷Dö_ê<Ó¥z¦ßWþMîÒ%gbúâµöÂà=}Ïïf:Žf¡|~iî{žŽK/ wÁŽ)½4«VìXþÞ˜qMŽ^ïÇèó¾“xž¯zòRM/÷§æjzGqü-ÂýíºŒtÖ¾PÝ3÷jr'Fò¾ô^ºÆç9«äubúÂ}ÉÚKUrЯçïWµÈ:TûLXÄIÿÍð\Ÿìaó-£Z2FþvXqÖkc6o¤EÅ?{qæOÿ TÅñ\ïÒ,ÝpÖN1{®£{‹º©Wô1¼Ÿ=†÷Û(§k¼[i–µõ†úW9Tï½kc¥Ç2–÷ÃȬciN¨'sN,èç¨÷Wò­ê*ís‡HŸuä]qeŒ§8×Õ}ã{Dõ¬ÞéþžN¬*ïœÅ×ô—Þ¦©í+{|Áï.±6Ôyäÿ0ˆ]黡çøgånJ~z› Ïóv^ÂÌ™;{‡m8c‰ãˆŸpGºqN'ßUÙCéyÞß°ÿ‘Û¨O«}™~ÒïrjøÆœYë?qè›ñ*/ÍòYÑcûï‡Äà}êy­ÝOÄS½4ƒG5óùx×®÷;èsH fø¾C<Æ‚#÷8qt_~Õý çúè·´øem\[Ö'ÿW!ÜìŸY¹ÏFØêÕóóÙ=Ú›éåä,¥‡´È9ò-¹kor><Æ™{å‰Ì!ñÅÛõõņKó1²ß/Õ@ú¸ß¢Ÿãä-ÎâK,i‘óˆúÞ5w×öڞμƒ5¬rg é6Ârœê E¾ì9ç7Ó.sO¿z?°Ïª~ ö j¾Cs­ÚµÙÿ§ÞÞ7©»{š¹åœÅšÕ"c¨¶ŒQ½±þ±zEìx^•X]«]5œ‡bQ¬ŠŠXtSü b©biå TDÑ냯cÿÿ0Ãfس'+9UȃÞÉZ³f&9>ð[_­¯;}½Ò×ݾ^ïë;Þé냾î÷µõõi_Ÿ÷õU_ûú¦¯oûú¡¯g}]úú©¯ŸûzŽûUœ±?D½ÂšÕH¬ ;Îg8°X㬾?°c¾À¹Æ×°ãßÃ~ƬNb?FÝpÔš}¿‡óKÔ8¿âÜ»×—<~Œ‘â²Ö¯qÌëvNž >SçùYªû}|ëLñÁ3V¸ #¿Ä%¦ó‘õ~9&ù!/âã]ìx₵‹8Üÿ2}æl4kap¿æ2›qjÒgA¬ªÕC=Îp³6qÏÚž¢Æe­ £~ïì˜0j¼Â¼ÁŽ©Ó3š«keCÍ…49›±¹Ÿç¿;7éiiå…*·òÌäßû’ÆV3&þ,tFæâJ7îÕx™‹âbÃy¦î%b4ŒÚÈüw>‰3ó£ó·ÒëòÙ°?Þ)×0‰õ6æ^ð¼“_/˜ãe¿žkF/¸fÒcÂU_<_<Ýb­[jªºkgþãYbÔjÅwÅ“8’¦Vóüós\³:#ýÆsÒg/PãyÝŽëZÑ,x/÷GÔuÿŽ:£üÖ]áú!vz$g<˿˪ šé'}#nå_îuÏë[ÕÁó勼Ÿ7Ì羪‡šý×ýœó¯¼øósˆÇ}êÑ9ÐaÕ“Îa/+7캛éa6;žñæ÷¡ëB¸Ä‘®*ýóÛÌëäP}1Wsj8´ ¼ê™}ð~ºÆ™<äZ›q¶á\·ëlv6Œ³à¬7ÔÈ}Ü“z”>\«7߬—Ìb]óIÃÈr"<GV¹E-5œóuÃŽ¡¹e_UvÌæ£ž4ÿï°çèµþøÏÔ: þ†c^œûŠ3ùe¥}õ¨=·Ïwͼ…‡÷hb±&é‘^òÚª°¶ªÏä33"çsÁˆÛp®]˜žeÌÊ•_\k3Ÿ§g½’׆ƒ[ÏtõèuU÷¢÷¥¼–¸5¨ÖÀóuîËðœ~¬Þ,¬ÅsX^p$î†ÃWÙ[Îí/ì¸Äâ=K ÖÄÞô-ÿ^iS|zhöìc6;翪)5븳¬u¾kr´áà7÷ò{Ëoøwþwb(Òÿž]âßivžÊ¿Ó²·ÔUÕcÃÙß¾}ÍòEû’ge ß✽ÌôžØ™ƒìÓyO/Wû¹oU›4¾âJ]qæ5Rúÿ¶â‹ßè|Íó?HÊx^X[‹E¬‡ D¼Ä F‰˜!DQPEE2²ˆ/û"yraüÿÂ.æ+¦¦æœù6Ð’îê:UuNÏîcŸõåX¿5õçX/Çz5Ö2Öc=ë­±Þëñ>½œ{ŽõìWc}=ÖwXqþÀ믱þ문ÂÞ„O<Ç}~ÿÛ—ý_΃Î}#—ïÇú='òYp¼Cu>Æy­ÄÿµvžcMØj%ÆÏ8bP¯¬û¬ç?dž!NÄI çA¬ª¶ {ý¾Áƫ“ î§W‡# Ö¤=¯/ÿ&?[\Å“ºËÛ6qÓOr©ö=°½º‹Ùªê.º3k¹ÃÊýMlx©É„½ÖÌ‘ëýãX¿âÈUwdÏt˜žûÇžæñ”FäIœÌ’ÎQ'¯íìëc&ŸbŸKõI×ÌÒ‚ÍÇ—ïòƒ9QÍ™ïGjØÕ®ìÞâxo•µÄ÷^χ{ùÿü?áføìòþeÈ[þWz)Ûé]öß„:gš,è=𜠯šYÂQ¿IÇûG§÷u¥A••GØæcfƒº&&q²Fϱüö^Ì>öìƒÄȾԛqV×™Êÿ„½^¬í[ìs_q^°ê晩zI¸âK|bw˜äêž’'ñˆ¡¼y™….[Ù®Q—}ö•°„ãózF­wæ)}õ¼:WâW3;ñãGØ¿aÂð\äyiF^>Ÿœ ýÒœ­j”æÜŸ¾džÏ²ìÙà}™¹*×9_\cùvm¾{™÷ìͬ™ß˜¼‡˜Âp}ÅCþVuê¾*?]=9 &ìkP^:Ÿ\×dŠãoÏuÙõœœõ·óIïÈIÊX•yî½Ãžïwîy¯¿Õ®…ëš3PýSyå¸Wÿá˜õª—„'ßÓ§[ì¿;ï«,{ß3[Òá'g·ß{ƒZ›ô›½ä}4¡ö]÷*K3úž­îâ{«¹xvŸßUÝsv±©<¡^Âɬæ¼to«YRå„/Xÿ#{1qò<ï÷lQŸk3ôš.ÔÁû?¹s—dzž©üQÞ+m=ÝÌaþßDZ§žaï¡øû[ç8Ù?6Îä«ù_õçr9Ç3žuî}qÙ?Ûþª§¤ò­9œ\Tø¸†3Žó'õRïhF(ÊyÕ›òØý­´r­5gù½^ñ;ÓA$v5CªÜ÷_ì6Î|v?oŸœ»™¸ ×C3é 6LŸîY÷í–Zø›Zeáì J©A¾ÌÏgoT<ÜŸ‘ÊOÎ\ÇÊzôf¨&ùëÞvu˽;Óáû³™…k߀¬-1}6yf‡ò™çÒ_Ÿa䙙ߤŽó[Zë;fFŸQ¯õö?ÏIsiÆó Žïypozâûô{yZqÎó9£\ b<Æã™â™¬Ïç…zCµ)S®—sðLu³Í1YK÷†.ؾù*…ÏßY¥â©yYÍ6Ïó&¾rSiŸssÆÑ bÍeäæ²Áùœ¸ö]èuWœ²Öì¿«ëßü½œò£zøw÷JXä&^é¯sxýŒæÔ¾û9Õësý”bùï63ƒ÷ñtÁ>'Ê6qªsÚ6×¶ãÒeWµª7ò›•wpþå»@ŸýnV ÷¾Þ,8òžpœOÉQzߢ於X³óéð¬5 Ëq2wgù_°Ïšôò™¤ɉ8Ô(}u^ô#ëìæ\õ]”x™™ÊWÏò<ã|V “^úŒºö­#]Ïî`)—šù¾å¼ ~5O‰ç8¸ö-Džôê7Ô™v;}W¶»o©µÍ^ì²~­oÔxùLØøêgˆ.óäJLb¹çòB¼ªógœô}×Íg×2q3ŸÿuøHx^•XÛª$EŒYQ\=®â*Šö.ÞDï2(DV΋ì›Xëÿ„ô•Õ3ÔËLWdfddTõÜðR_/÷õJ_÷ûz­¯7úZúú°¯ûú´¯Ïúú¢¯Ÿú:õõk_w}5ì1´ÿa_ïôõ6,b|Õ×רp~ÁŠõG_÷°âƒû߯ŠñÖ<ÿKÛË}¿÷6¬ûgõ(—°åCÜ'Xóú+þscŒÛ¾~Çë¬ñ^Ä3ySΟ`Åý+îÏënX1˜³j^°ñOÎ~ÀXw;ïá÷üîÙù»kû¡Ú½¯Ê‹µ¶¾žc«5qo0Ç–n£Â§^…ý6lñê<¨/ cŽêû‚-'åây0õ1y»T—ô<ëï‘>‰Ï~ ?±Xÿ æ+±\ƒÂd¯«>(?×ßûØ×<Ó‰tËYs-,¨ýÃçW9SêŸý¾x^ÏV=sݨ–ìß‘&«WéKÄMžˆÍ¼¥‡æš'vUC¥;×ñ©9q3ÓÜ_˜ÇÉ~U¼¤âzÞ°â-Øëϱ¸_¹ÌêUÿ3vò–œy-ÙâUçŽ|”xþ<}[üúsŒí1åK©íä*ù_ÒjêjÁÈ¡bÐs*»Ã¼ßÊ÷Mlñë1ÆÙƨãj½6Ÿ×—×Xõ$5}m,“/¾\?ÄhØë•ûróQ3.?Î+1^ÅÜó2¾¼¥¡îKö=ùI¬[ìç!5¹ ÆIæL-ç=ò/7Gš:š¹K}•ß>Å6'Â~û3í6l÷¿ögC•ç̳Õ{ú“Ï×·X±+omØß‹2žß;ýzõlûùèw‰j®Æys‘'õ>qå”®…ãs‘Úó™PíòֺȜÈ÷Ì›'9V~ê§ßë=†÷Õ=³aìçy6Cª4ç½!¬Ýý@¾¢¹'ëšÍ¯4Âø|G©z(,ê1kfåQĬðÄ»z[áU³”Z¾ÔÛÔsöØã‘Ó£óµ¤G&Çî‘ï¦vN˜çOî3cÜ`CX0Æ þ7XgÞßñ² ›ßwÁºŸÜrîK^='×CrI½eÝÂLŒäNÚn˜÷S±Ý=~r¤Õ¨^[êÃëÐ>Ïkv>T:Йày#Lù¤z˜ZpÎ<·–¸rMã£Ïª^qÃç…ýd.Ú—=L­æfæžOžîÂ|Œ±ŸÂo'ŒýxŽ:wå]½{1fêçèP-œ™Œ“gpžíªC^WáWçLÖ1Ó˜û„ótmîägÁžæKœÔׯžV<ä3yþdÞ'•~f±ò¼É˜©)Þ³|.«y?ŠÏ¸ù.Ï>ïÞbU8Þ[Ý¥ìýÃó­ôãý­f-ýnÁ¾—z N|¯áö¹ ;¹Hì#ÌJGÙËÊ[Oã´¾þÅvV ?'+]æýèÿä]qN|å™zöŸ}<û˜ÚÎ|Oqj_Y°â¸Ï27ßß0æâÿÛ/ØÎ„ô¡*z6?™ËìÎzNöÚ—GÜ`ß“jÜÄcUƒû´÷Þµ¯ó–yñyÿƒ¿ËW¶{„úðèüŒòºF×âÿ¥p‰•>¢ºŽtw¤çÙ» qÅÕ¥ÿª…ï½Ñ;_ziÕóĽņ›9WÊ^ËOůråü=ëëoŒþO|ÍŸc&îÍö1'¿W«¶äJ{Èýì÷KäïÓ FNg^áÏÚ«9]0rá¾\Å þƬAç‰â¸ïÏ´@¼ì?óPlaüd<×ãL‹•vŽþÇsþÄz©gô{zòÌ×ï-×u£ßþAGix^•XÛª$EŒQ/«+^P´ÿÿVÐ'è¨è¬žõ@½ìLGFFDf×Î àÙ~žïçÅ~^éça?ïõóa?÷óU??õ³ôók?ôó‚}ÿµ~Þìçí~š=÷Y?_c{ö—ûgëçwlk?wý<‡­¾c>ÀÆãõ~Þ†ý.6^ c qóÂWoŽM\áµ~>†õ)6<öûM?ߢÆvþÄbïäèüç{Œ8ÄX±ý¹ö/aïýUìš÷}l¸7{ÿ[êÌZ?¢æ|‹óŸý\0jã>²Ÿ70ÖnØk~‚]'¯í=VÈcÕò•§ÄVOÂþǾTãÔ9Ê 5ë¸~¬õj Y#ó$ÿ]'æÉ{¨°Èû1v}œoÃÈQü„ã}gÏÌŽ|œyHÿ¾CÍ‹XÌ¡çÚg/ý‘/|žœÜëô!±ÆÙSŸ³¹SÏ>+ê•Ø {‰#Œ¿0êæX®=ù°ÇYÔk•çÌBú˜û@˜Â#ï#¿Ë略™mñ÷ÝüÿŦup-‰¥ WÏóΟã÷ÝK=“û€Ï/kð;ꋟ]î?ÏÙr_f»B9äìºWê“ûnņëÞH#q Ì„ô—ŸžY>çžr>¯g{Pz»†•æž9b¤ÿÕ»Â3$m´C+nÕwÿ¬÷™÷Ü·âã<þƨ?ñrO6ÔÞó 3³àØäªû@ÃŽ«^+×k–Ͼzfî+¬ÜÅ™7qÓ,Îò±¢Þ7Õ;ÕïO§[œóâÌ óŒï åÎç-kð^FlbªÇ¼ÇúœV™Õ<87åŒYÓ}Wª)ÏÉ™rUë1ê9aÝœ;eS¾_ËÑì=¬™¦Æ £>3]üÎëy?ÃÏ!ïÈ{ö^UÎìõn:«‘Ù¨æÁ¿+ ù=ïOõr7h^fÚ c¦MúÉ|h¿(Úƒ jìÿ“íiÕàž•þªã54?¦<$OÞ+ž™‘äI r9®Ï¦óºÅ†í¸ÂÌ=¤œU;B:ò^e®Ôól&ÜìQ|ô¼?ÙŸi3»sH#zÉÞÎæ_Z­8Ö¹VÃw8=>›Õ§ñººóWýTw~ß9ü“_Äæ»[8ÄÆä‘ï–¼/¨Oé˜u³7aé½7Ãòì.8â宿ôƒ˜¼H¿+kűOùš:çpž ŽWŒ÷˜œ‰†ãÜWwpúÈÜÌt§ÿ`××3ãü³Fr_×@ÿ”nÚw¾ç˜é­wÞ‚c†ù®y×gÓ5öL'_×ø»‡93һᨵgV¸·ç½ÂoÏñ¤QrM<Çšqs²_Ï<5¥®i¥§ru-¯Ú?ÄnØ|È;?§&¬ÉÕÌò{ëýwù=ÞåÔë Fý.·à˜ñ㌦™!bÏ2ã{Ð1…÷çù$ßîŠ];b$'Ï´ßS|®}¹`ôÆu³ZªQéKì'3åóZéK窱j–ª:ž¯ Sœ…“y;óKÙª¼ò]’¸®ÁŠZ[Õà| ÷ŒØ|·xŽée¥Á-Æ>ª 7ìóäºV¼søžÒï©ïì}%éê;.1Ô¯g—xÎ+{%®ö0qf<ø¬?C.ô6=õÍ:zïó;ÒMØü\=©ŸÌ†ô•Ìëósÿwþñ³ô-5’ožáÙî‘gÕÎÉ9›ÍÅ,»>Ã×~S­öÅ#{`Í ¶½QÕ<ÓÅñåå}5ã©MÃq×}‰ã{hÁÈ]w%eÌy ÛçpÎÊÝ‚óŒ³ó½Áˆëï€jr†*_u‡ö»ˆï£®÷L>Þ›êy/ {^ÈY;ÎsÈç2×<Ó{£â¹bŽ×0bGwåÛóÙCÅÁ÷ÄŠ:Óž¿ Ãû¨îÈÕÜ'7Ï^Ãùl Áèiþ6›5òÿ™ñ™â/LâñX݃ŗ;PzxVˆ%^ò$yx;Ô>U»®áè¹é7DßYkÅõ:®çHáx^XM‹dEŒÃ¢(®.*~àW±¨«  .²*« Šƒxñ"Þjýÿ? Þ/^¼Ìn±¡.=U‘™‘QÕ3|ºÖgk}¾Ök}¹Ö·ký°Öóµ~Zëf­_Öúu­ßÖú}­?Öšk½Xë=l8<ÿ ¶ó<ÇýÚ÷`­—Öze­×Öz¸Ök½µÖ;k½¿Ö‡k}¼ÖÀ†Çœ˜sÉ<<a¿Œ ÿUcûløGlqý{ ñ$¾ð˜'qT/ž{zF9Mì90¾øñÜÀ1nòòàYžó3ÜÏœnqä¨ïb¯¡÷ô+l=ùn­g8sõ¾zUÕ+5PkHqY§kñþÁ9c‰ ñˆÅü;ï¿×…Úìr}‚-ϯ±á{/=?j<ëÝéõ¿rîê)¾Ì«Âîùýÿá,ž7¨óâçÒ,¹ÖÆZq½ÿœ“Š‹ô,NŠ+.oc¯OÖ:ã)VåŒ3q®U5/î]^Õ!gmà8תïÏèyNÔ5~[^Öz{/G1¨×äx ·Ó«k¢òÁÌ?cTó0°×#µ@tý¹TÆ`=ÜG•{jøº·Øƒý™Ø9Ë~ÿ ì¾)-Ü`Ïó»G«Wâ¯Þ+Öƒû½®»jŽºº)~ò¸V/å–>ðçò>ö&ûâ3I<ÍJΚחòÎ\È—óì=¬4Rå0±ßI©çZˉÓÕL¹ l8ž‡ŸU|çäýË{@^ªp:-¸Æ‰Õ½Q&Îw@by­Õoާݼ—ZŸèõÕÅ!~7çÇ^v8âî9Wxâϼ\[:ÃwOž«ÞŽ·äEÌĪôYùÊ'8×èÚ;áOëO¤N8×Ǿ‹\S#}ÿä]îļ6“^wÕ¯ÂÏ løÄ“§¹.º^(ÏjFÈŸyÊÇò»æü0ްsV*/QnžKjžû:>|ËhF;>ûÂWÍÓû9OÄOÝ9ÞÄYÃ>SÊ1¹fm©[åÓÝwÌAÜtžg'¶÷v¥)iÓ½0u$ ž×œpŸ¾S˜Gz¶|±ª7kí¹øoKá¨Æ>7™ßÄyf¼Þ•6Ò «ü\ÓÂ’4sÜ/=æŒ*nõ>t©8ÝâøV¾Þ³Î‹ø©÷JGœ8ö-uMœ<ϳÇ:û|ä½í\5Ž©Ys~ész§§Ï‹£ÿƼÁyfœk…Ï·“sÏ>]škiWµâ÷óþ»Ô3c%y`—sê9sÏzìõy‚³çuw¢k‚Ÿ.¦îþÏgàÜ ÅªbLÔ¾Mõ{‚{ó`Ü#<âÈs<ÏAû²vêyöÛùÐoèÇ]ÝÔ«äTý_'çËãùýZÅa zÿŽsËŽ­¤®¤S¯9Ï œ»T³”ÚÈzòýtIYWÝ—øNôþä^'m;–ëZš«zC¼³Ž+̬…p]Sw⊳k)ïiš˜î«îŽë:çYžI>ԯϿk‚zú»¦^`ï«{£ô•o*qrÌäÐÍDu “9gÿž'1å®~Ï8Òbâû¬eO»¼½öŽÅß1”Kj-ùÒ£‰UéÌç€ZSNé%žWzqnq¬“û1¼.Ò|çwžOõÆæÀ1/ÝEù[â9Îqòήâ0FÎlzh5_ŽÍ=šaש<5gI˜]=*÷ÅKþCÆS,Ÿ§ã\ʪ:$NÅ=ýFy—ó÷=ν#¶ëMÞMA¼kZun®ÑŠqŸáì?Y¯ÄëüÌûziÆÅÙõý6Ïe☃4ªzòïôqî!oâqOõÛÀ}°ò.j7¹UõJ¿öóZW9“¿úÜÕÑï±ê­8qö^y·ógÎê…ç[õ–¹ð­›ïŒÞ",iO¹To˜ô¯gêdbŸ)öEç”÷3v5CŠ+šžífè5ŸKâ:áºÞ½ÎMæ8°c¯«¹×›œ•Û#g³Ò•׽ŸØq¯4¤>¹Gkÿ¿ŠÙIkx^¥YYËE¬‡ D<âŠÎƒ¨Ä‹E1ˆyß>\óÿ„SlŠ©©íÙD |3ÕÕÕÕ=³_nx®¯çûz©¯Wûz£¯·úz§¯Ö×û}}Ü×§}}ß×Ö×}ýÔ×Ï}ýÚ׎ñ&Žó­¯Ïûºã÷k/cr±?ÄÀ×ÞPÇà^îûæñ¾íñßÜóL_·1çò:.oãÈç]œc^åDÌgqàJ'â*?b}€÷ æÓâ9×J{Ç'65ý¢¯/ûú‡f®GÆ}ˆ#ö-ÌñûñYשahus~Œíq3æ ÎùɉÿŽœˆ¹ÊãÔ9d ×M¼‰/Ý*®;/ß—±®rQP“ïŸß0â𬼘µ%?¯í“´M.Ä\ÕËý-Œ˜ýè:®ü§}‹ÑËÞo/`ðy ×8Î+k,^~Nõ`ƒ?ã¿q¯j”š¤\cÕ(}PyJ¹(ÇIm…“þ¼ƒy5œ5aͯ¼ïz{ŽY{×Xâ<ÝpöÒŽë~ª<Ë÷pà†1*þUŒÔv…ý¹;nòÆê,yù=&nª{•ëÊGì1{³¡®W…ë}Á|…›9®<¹c>'/3&÷¯tfLî—~™}§z„ó,¡çy·¸–9˜¿ß-ªý•§\ç[žò¼rîñ\y…ÜfMRÃÌÍçîí¼æÙÃü˜S…­zz?Èo¹Ÿ¹ÿ…#žÓÏéI|è¹UÍw¬óæ{¨ñ6 ¬Ä^ÚŸ~õúòûÜkÄó«s;Ö³ÆgYÅŸ|øžªp¥ ±äiùM>æ½íµÒràþ+îÒÊù^ÕP÷qâè¾ðج97Œ³ô"Ïr?ãj.¹çäKù)=¤·À†#þßw_úF¹4Ìš©ßÔÊãó¬É¹ÉóÙä›^[½CTsõ¥c‰ƒk(<åîµ®|r õ¼‘¬GUã†Ù“Î/gµâîñÒCîÇ%–Þ@Îü+î•/æz<'ÅÓ5q,åÌ» sU§¾ê±ô¨úºÒÍç…óѼqí4/ȼܳj87bÊëÕ7Žæù•îÎI½Cîcä¶áÌ%uò»ëiüWyoùOG|sF¯ê1ž«j¹âçõUWl˜sO¥!õ×ë^C÷nÃܯé£ä”|æ|‰Ãš_åê3@;kŸÞQ<£šòŒræÏ®x®úR|”gúC:;ŸJÛJ+Çq/{ç¬jΤîò-﵊ߎ™“¿”›0òì*7rÑüÈ\Ò?Ù“Ù+ò³÷‹0ùîQNÉé!/ïAjÔ0§÷òþôûˆ|«oæÌ_˜Ì¿ºC„WaùÙqæ,üêwÚÂwΫï×YØž?Ïðç•nÉAuU\ÎIÿ½*GÖ†ø`Ô'=çºûÛzùÅ'59ñ¬úg²n/ãü^¯ª·\GaKÃqÞ½éû¥«ëɸzï7Œø|s¬<žs,1óåù\aU}’ïÀ|«m8cq–‘ñ4Voaaé;fÃ<Ãv ,÷â¿T»GÒx^•YëŠ^E¬bP4†D¼‘1x1ˆF¢Q!¾€0æýÂ)NŠ©¯NÏùvó'{¦¦ººº{f÷€÷Çúp¬Æjc}:Ögc}>Ö—c}=Ö·c}7ÖÓ±~kë·±~ëϱÞëͱÞëþXïŒõ;îc\bó+ì˜Äû;æ/ØqÅŽMÜ>Öë˜øÂm¸äù&.y>ÃäI¦OÄQ9ñ:uopsö±Š;ó¶ªìgÕ9ÄOOùl«0;Ö¼ÅÙuIÌÔ:{Öj^Tš‹óŠ+q+5My-eÜ/qî‡6Ö'8êÉysÖcÿÂŒ?5%~åÎv÷yóy!ÏèXç=a•·³º«rÕ°ï_í;ããçk¯ö¨?æÎÏ«cHïm«Ù/NŠ%±¨ñVµæ¾àþ‡˜ºVùSMS…ױςì“ĽÖײÖ75$ߪç<Áí¼ ýÈUu!×Î{cbt¬çjÖ˜û+ïDêÙ˜«^ LbU÷«ŽºO)× “Ÿ|—¼¤×ß8⹯³¯VžT®]ל7GÎÄô7HbIÏÄXq¬ü“¹—®AÇÑ7 —ž¾V»7˜XUÍxÍ™}­7wã¾MÌ^/ꕟœwuÆ~öÈŽ¯¾å7vM®a罂~ZÍki’9ÓþJOíá÷º»J›•&™ËœãÒƒwÍ»æ‘8zÃQ é@ß1†ê.L¬JËœÓÊϪ¿Ó³ši³÷­bm8zKyJŽ:ãlf[±¿ºWñŒŠ¿ë©Úõ^àïð†KLŸ{·yǺ¾ÂK?ò;þSœ®Îæ}ÉûˆûÎÏ“NÚO¼GÇ}‘ÜS›JwŸg®u5+Ò#é_¿¿ý }¼¿ÊCù|ú¹?äkqõn8æïÖÞ~€º¥Ç¥1q+Mý÷jg^öš©Þº™GÕ¨ê'ÏU.‡çtu~žÍþZå‹gþƒ9y®ÿþ„¸>·*îgÕfÞÉï¬WUž^Uã^kìËŒñ9α…ù;nú¹¿•ôÐs+Ï­pr(&æÏ}s¦¿ã{Mù› }B¾©QÇ%Gy aßG>ºå?W¹J]¥‘ûP8Þ{„'¼?Vw«ª—¹.ê ÂRy¯!¯3_vÌÝéù†éæ°ÂR¬þ§æoõ¦“?å¬ë*þ*?~ŸLßÿˆ/s”^Î;zæÉ=@þwy+ûy<‹½ø¶½Ðs{í?cõÞw<¯Í ÓË}¬ÿpÔÉs+îù÷å‚g$¶s~U+ŽïØÔÅýãµ,ŸËËÜ+ =ÞJ?ÕXú,,¬Õ,¿AóŒÏýKýæ×î ë÷ÿªîä'Ÿ3įúqÇì7Ä[½©•‡UÏ!×ä§ø+s”Xë“::?r[å;{AæÝ{uñwU<³Þ3nÍë³{œßVø^ãâÛpìÄòø‰Avìû¹WóŸß¬òO®íÕwÒ`•+Åÿ;†Ç/=Å/{DÆÙqì›ÄIÝxß –úñ*çÂ\y²Ê ñü ´áˆ—õ'Œ*¦UÝæß¼5×™O×û)ÎcKlÕHÖ…z熃4ÿäÓäá³Oûÿô*EÌx^Y˪%EŒÅ (>†Q| h >ÁQtðI£8ˆ›q!îÖüÿOXAß £¢³úz¡63U‘‘‘‘YuÎÙü:Öocý>ÖŸcõ±^륱^ë±Þëý±>«õñX_ŒõõXßõ3Ö8/Žõ2v¬×±ã½5ÖÛ8pvÌOÆút¬Ï±ã5Ö“±~ÀcÃã_ÌqÄYqòŒöÏ;˜óP îåžGØ1œyùÞín?±o˜y(çW±ÎûØÊ›93Æ·c}#Nê«^Ÿ†³ŽÄR^<Û1×WܪzCú$qp žý{|ÅþëÌÙSiý&ŽÜ²o”›{VØOqøH¤®4_ùç›çý÷ßîöVõV¯2¶´äÙªÏ`­Cú†üǹ?ÃQ[ïŸk ;óaU³R:T¾ó¼Tky.½¦äù¨7½~®£ö†r¸êsam8óèø÷]Ñ›øqÖ¯p+®Þ£ÎµÒ,½œøµÇˆ[Í“ªç;vŸ§âx¥«÷3ù>ÆÜ æX`'Mr~ð¯òºÏÇH+ÝÕœ¼ªg›rl˜ûqUWæ°ÒÞñªù$ªO½¿’sÇ1‡Ý—š^¯õ}¾Þgª{õþvÃÙónÇŽC Õƒ{TÛŒ#¹fO9­ü¤â~QŸúíÿ—ô:ß2äá=ã1=ÇÔÊgzÃÌŸõH=Ü—Î_XUïº]sùa¥ÏTý í²ÇÉã¾¾î8c‘KÃŽ‘~¬øxºãæ>¯z'{^˜émרï‹ÊsŒ¥ðö8UÝV3ŠX¬ùªö®{ðι»W=(_¸©kÎ(ñÌ9.m+ŸK¿ä¥>I¿ç3Ìw×Ê/É­ÊU9ÞwÞµ{ óg¿üÌ+^fj¦™ë9çŒbÎÙ›Éó†õìó¼«ÙQé)?¥ïŸâìýÊWò@ÖÎñ™Ïênb>3~5ˉKÞ†¸ªÈWwÏës 1ª¹Çóg]•_ÖH=¢óõl¨j" ŸÅÞsÊ+ý“3§ª³æLö°p*^ ³GVžö7CΨ÷p®ýÕ[ŸXÒyf~ù=IæÊ~‡¬¼% é‹«úä›´¡žW}ÙQkäÞó>Tý=Ö­zSÿŠòf yk¥8Wx gŸÊšf¼Žº²† ³‰M¾üÎD÷䆚·{&uH ªºç/ß®ü×pàéþѬLN<Ÿ^UžÕÝEv¹¸^ÙÛy)öŠ71r&KÄPŸÇÊWÌCZj¾äáµIOUŸ©“—ÞH©“ú7}•x>_³·è­œýηòíʳþ^J-³WSƒä*Lïý 3žpbæäÚ=ÁY7õåjn¬¾‡P?J·ÕÛXün8÷dúQuj˜ç ü˜˜ëyêù§Ÿuï{ ¹·ªs“—7Ì}ùó}ËÏŽ%×ÙŽ¹î•ßýî¯æBΔ*Ÿô8s¹Âq-f=T[žÑþ8êɘò+crö±•¯×‡^ªú¤c~£Ñ‹>¯\›û|¬3òƒ´¨ætú“=Ù0×&g…ôÌœ…µê'¯5uð;ÍkÃý®ÿç+3ÿ>1ßî³ÊçÎuS½\ÃÜGÄ÷ºêß+~ÒåjNWoVÅtß*Ï|oJß«y‡x_^}Çâ½¹z?éÎì8pé'÷ßቛ˜Ž§Þ«îªÖÉ[sM¿=m8ß Ä¶ê“ïqÍÚˆ'ÿ<÷GØ9:ëRq †sXݹä¡§žNœŽú· é•o)饯ðt>ùh?÷Þpíû|ó4œëUé›ý–ø~¯úïWÉ•1¼O7œg™pÿVÂH²x^íWËŠÃ(Êú@ÅŠ6âDQPViñ²= ­ÿÿfPTLtuÏ®ç*ÈÓNFEFFfõEÄŒÛw3îg<È2g<Íx‘ñ:ã]ƧŒÏcÆ—Œ¯ß2v?2¦Œ‹Gw¢bëI¼gÏ£`y'sîùŒ Qò¯I.~‡;ðüýÒür×»†9GïC /£Üù& Þû5ÿ¹(<®FÁ¢jAÎÐàûü{ðaÍ—ç¼ëQ¹)'êù6Ú¦¨x¬‘˜ÀÛªš²WÀÿñ1Ú÷°VjM|úà^,y˜Ž\;Õ„ØÎ›˜è¼ÕÂV®ÀU]\jAoQb:žúXÊO}ïüÈMy!yÈá}øôð{Ô³Èá]ô%°͹®¥ûK9Ó®¡öGkEŽz÷£ÆãXbx”“ú¥µ;ˆ»¶;”ŸckÝ3[½¥WtGP+ç¨ûáU¬ûܽ£±«´z‡Î'xs&ÝGÞoö‰<™O O½¥{âVT¢æs¶¼¬š‡þÔ|Þ>ª.Sl÷Žº¨Ô|ÞÇRo÷D«—Cì룘|¯Æ¨˜?£j žì™úŠú¶üäs¬Ôà3ÈÞþ‰~úé§Ÿ~úé§Ÿ~úé§Ÿ~¶Î?"ÔÄ5x^-Ùux×Õð/-u ñZצ‘.5ºCr°*Œ5BéÁ®Ähé )Á!0ÆE¤¥J+péæ:á~|ÿøü·óœó}Ïû¾çý= ‚ ÈI^> ]ÄÖ²ƒ®’&M¼IYšA1Ìfû¹ÀSr¦ ‚7(FušÒýo#™Ç"¾c;§yD®tAŸâÔ¤íˆf< ,c3‰ìåwÉ’>^§ •hF;¢™Äb¶qŒ¤Ë¯òe¨K8]ÁD¾`%»9Á9®ñ€lƒàŠR™0:Íx¾d5[8À‘J¶LAð¨H#:ò1ý‰á æ°–üÈ“ñ1æ_” 5hN7†Ï×$‘Â2e‚×(HyšÑ1Lã+²Š-ìãOÉE¼ÈO9êÓžÄ2›U$sš›¤ÏoB}:3„ Ìa ;ÙÃynóÜÙ‚ !Ôå#zòoæ°žÿp„;¤Ë9x—²Ô¢‘ e,sÙÀ.Žs—4ÿ‚RŒJ´¢ #ù’ù¬çGR¸K†ö¡2-éÁP¦±„mâ2ɤÐÞ¥ gc˜Ã:~âWî’%W¼LQªÑ’Hbˆg%«Hä'Nq'dÎo‘—âÔ¤1]Ì&±„Ds•Çü4/Ú›‚T¡!ù”©Lg›8Ä5ž“3O¦<µiM/b˜Íjör+<á/É*ЈVô!–ñ,`)_³™Ÿ¸ÂS²ÿÓ7RšÆtc8ñ,à;~äîòœo oSš4'’¡Ä³Š#…³Ü!c~9E)êÒÁLa [9Âî’¡@¼H~ÊS“vô#†Ö±—³Ü$cA½—‚T¤1]NËÙÈn~à8×xNžBÎF]ÚIâH` ?r’›<#Oa¹AeêÓ–HFÏ26³‹“\å99Šˆ!©N+º2˜q|Åjvs’‹ÜàYß7_BcÂèD41Œg ›ÙÇ9J΢AÊÔ¦9]éI,ÓYF"ÉâÉU,ŠJsº0œV“Ä R¸EPÜý‘ЖNŒdsù†]á"÷ÉTÂlHaªÐ–hb™Éb¶‘D HWR~QˆJÔ¢3€ñÌg+G8Í]Ò– ‚w(KujÒ€OÂçÌa Iå*7Iå¥ÒòªÒ„Žôfø’Mä$¿ó'¹Êˆ!4¤éËh¾d9›9Èï¤++ï(DijÒŠn a:sYÁöq‰T2–Só£ MéÆgÄ1Ÿíœàµ¼5¼MA*Ò˜ôd8ñ¬&™SÜ%/S˜PZA±|Åb9ÄE‚9ŸÒÔ£#ƒÉt–ó=‡ù'd±%©KQ bÊR›D2”É,%‘C\åÒ×ÕyŸPÚÑQÌd-{Há6÷ÉTO\y—bÔ -ô#ŽV‘Èa®‘®¾u¼G)êÑœOÆ4¾!™ã¤pì |ÕhIÝÁ4–±ƒÃ\âiêK”¦2Mø˜Œå+V“ÌQÎsGähä ¡!]ÂD¾bkIæWî‘­±3R‘&t¢/ã˜Å&r™<%GµGêFú3™¥lã÷ÈÚÔ»GiÒœp1•Ùlbû¹À=²}(—©F{¢H³XÏ6ŽqžÇ¤mfÞ¤µøöôe‹ÙÎ1n“©¹÷м”£& #’^Œb*óYÊ’9ÉMÒ´0ŸQ˜PZÑ…^ôe4ñ¬d;Gù§älioªÐ˜öô`“ù’lã(ÿåOr´’“¼I *S—ôcñ¬`ǸNÐZ­S€2„ÒˆÎôf,sYÇnRø/iÂà5ŠP–tg8ñ,c;ǹJš6òŸ×)F%šÒ‰>Ä0ƒ•$r ülmÕ6ŨI½Â4f³‘8Çž‘;\,)C}ÚÓ‹âYA2G¹Æs^ŒðVR‹D1Žy¬e§¹Ácr¶3Bu>¤+C™ÂbÙÇY‘»½xBmÂèÉh¦³‚uüÀIns‡LìG~ÊÒ€pú3%l`+G9Ï2ttǼCYêÉ@&2“eì`7g¸Oú¬¡E©I¢Å<¶r‚[düØýR’:´¦ØÎJ’Há>é?q.JR“p¢™ÀÖ³—3Ü"m'uEQjÓŽ.ô$–é¬á'Îs‘ ³=(LyêÑÞLd‰ì`?sƒ‡d‹ôŽQ‚J´¡?1|A_³“\ã.é»ÈW P…†tfSXÎŽsT²tõ÷T¦)øŒQÄ‘Àrvr€Kös…´ÑÎÉ˼A~ÊS›6D1‚6’ÄI~ãA{óåhJgF25ìdçxHúrž|„Иpz2”ÉÌe[8ÄnòœìíGUhM3™,b+ǸÊ3² ²Ž’„F{úÇ<¶qˆóÜ'í§bó·"Ô Q b,sÙÀ^Îr‹à3ç$Å©M8]‰e+ÙÅI.’JžÁî‘J´¤Ÿ3›•ìà87I?D¥•©EÑÄ2‹MüÄ%n’q¨ØS”j|DoÆ0Ålá(×È4L_§Òƒa$°‚dÎrƒ`¸óSˆˆb$3YO'¸IúfÊPžÆD0€±Ìa#G¸Aº‘æŠRƒ0z2–9¬'™#üN*¹bôsŠQ‡Žôg4 ¬"‰œåÙFéå„ЄÎô!Ž…,e;Ç9Ï}²ŽöÛ€âT¥9]èOóYÅ~åébÅ‹w(O#ZÉP&3ƒÕlãçyHú‹E¨DcÚÍXf±ŠíìåIÞ—Ô"‚®Œd&sYÍ·ìç É!”V|DƲˆDŽqƒ§d‹×Ó)E(-éÂ`Æ0‹õ$s‚ëüIºér‘w¡QŒfë8Â%þTD0x^íÕûwÏuÀñ÷œb«TB÷ë!GI™ 5§Ô1gèµQÇåÔ\Ž24§'vBÑ1´²¡\›fÌ=ÙÜbŽ\ʽ¹¤ •R-JêñCÿDç|žç<~üœïù¾ß¯Ïëóׇ!ÔBcÚ‘ÊÆ‘Í"J8À ª¸Äµ9!4à1ºò2CÎT øœÍ§Š¿‰É ázî£5]èÃf°œ Nð3WÍ¡My‚gI#L²˜Å<Ö±‰#ü@™!ÜJcéJ_†3‘¼N YÏ.r¸¹!Ô§ OÒ‰^ cù¬ Œ}œåOêÌó;cg¨Qd—Ñ'™Ä¦’Ïj*ØÍqª‰[ê^iEºó™d1—%”ó5UüÅMËì'éÆ@2É¥˜-ìå;.Sì>¸‡x’éA:o3“U|A%¿Rk¹¹¡%y‘Œa2sYË.*ùØ!ÜÉ£´§'CGKYÅvös’jbW†p-èHéŒa Yɾâ{®Z垈§=½È(²™O1[8Ä9γ:„Ûx˜ŽôeSYÀr¶QI5±kìhâiO/óïËÊØÉ).Ps­=AsÚОçÂ[Le‹)a3ßð#1Ÿy–ûiEgz3‘LaÅlà+ÎPc¹ç¥/ñ&ÓX@!å|I%¿Pãsï9 I ™>d0‰\Š)ãç¨UbvIà)º0€‘¼Ë,f³–=Tq…:ëí!ÚÒ•> &“l>¡”}œæêlp4'‰çèÏÆ‘E¬£‚cœ¢ŠPê»É4â1ž%ÑL&elfßs…ú MI¢+ýË|J){8Èi.S»Ìs´¤3i åm²)`;¨äWâÊ) $Ó“t2ÏG,a9ÇOÔÜäMSÚ’B:ãɧRvs–ˆÛì¿Ñ˜DRÊ;Ìd>+ˆŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠúö/÷`x^íÁA 0±{£s^°Ž%m_µð±¿töx^]ÙÓ†Ð4v[m›mÛ¶m7¶mÛ¶mÛvîdîK»ÎËÞëöœX>Àÿ/p€þå_þëø'þ‚¿âoø;~ƒßâwø=þ€?âOø3¾ƒïâ{ø>~€âGø1~‚Ÿâgø9~_âWø5Þƒ÷â}x?>€âCø0>‚âcø8>OâSø4>ƒÏâsø<¾€/âKø2¾‚¯âkø:¾oâ[ø6î‹ûáþxˆáÁxЇááx‰GáÑx þÅãðx<OÄ“ðd<OÅÓðt<Ïijðl<ÏÅóð|¼/Ä‹ðb¼/ÅËðr¼¯Ä«ðj¼¯Åëðz¼oÄ›ðf¼oÅÛðv¼ïÄ»ðnüˆáÀ8Šƒáà8‰CáÐ8 ‹Ãá?qxGÄ‘pdGÅÑptÇıplÇÅñp|üN€âD81N‚“âd89NSâT85NƒÓât8=΀3âL83΂³âl8;Îsâ\87΃óâ|8?.€ âB¸0þÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Áü¯â@80‚ƒâ`88CâP84ƒÃâpøOGÀq$GÁQq4ÇÀ1q,ÇÁqq<ÿ…à„8NŒ“à¤8NŽSà”8NÓà´8N3àŒ8ÎŒ³à¬8ÎŽsàœ8Îóà¼8Î à‚¸.ŒÿÆEpQ\ Ç%pI\ —ÆepY\—ÇpE\ WÆUpU\ WÇ5pM\ ׯup]\×Ç pCÜ7ÆMpSÜ 7Ç-pKÜ ·Æmp[Ü·ÇpGÜ wÆ]pWÜ wÇ=pOÜ ÷Æ}p_Ü÷Çð@<ÆCðP< Ç#ðH< Æcð?x,‡Çã x"ž„'ã)x*ž†§ãx&ž…gã9x.ž‡çãx!^„ã%x)^†—ãx%^…Wã5x-^‡×ã x#Þ„7ã-x+Þ†·ãx'Þ…wã=x/Þ‡÷ãø >„ã#ø(>†ãø$>…Oã3ø,>‡Ïã ø"¾„/ã+ø*¾†¯ãø&¾…oã;ø.¾‡ïãø!~„ã'ø)~†Ÿãø%~…_ã7ø-~‡ßãø#þ„?ã/ø+þ†¿ãø'þ…¸ÿü×q ÁAq0‡À!q(‡Áaq8ü'þÿöïþoGÄ‘pdGÅÑptÇıplÇÅñp|üN€âD81N‚“âd89NSâT85NƒÓât8=΀3âL83΂³âl8;Îsâ\87΃óâ|8?.€ âB¸0þÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Á}q?ÜÀñ <ÁCñ0<À#ñ(<Áÿà±x'à‰xžŒ§à©xžŽgà™xžçà¹xžà…x^Œ—à¥x^ŽWà•x^×àµx^7àxÞŒ·à­xÞŽwàxÞ÷à½xÞàƒø>Œà£ø>ŽOà“ø>Ïà³ø>/à‹ø¾Œ¯à«ø¾Žoà›ø¾ïà»ø¾à‡ø~ŒŸà§ø~Ž_à—ø~ßà·ø~?àøþŒ¿à¯øþŽàŸøþ=øÿí?p@ÆApP Ç!pH ‡ÆapXÿ‰Ãã8"Ž„#ã(8*ކ£ã8&Ž…cã88.އãã¿pœ'‰qœ'ÃÉq œ§Â©qœ§Ãéqœg™qœgÃÙqœç¹qœçÃùq\Â…ñ߸.Š‹áâ¸.‰KáÒ¸ .‹Ëáò¸®ˆ+áʸ ®Š«á긮‰káÚ¸®‹ëáú¸nˆáƸ nŠ›áæ¸n‰[áÖ¸ n‹Ûáö¸îˆ;áθ áî¸î‰{áÞ¸î‹ûáþxˆáÁxЇááx‰GáÑx þÅãðx<OÄ“ðd<OÅÓðt<Ïijðl<ÏÅóð|¼/Ä‹ðb¼/ÅËðr¼¯Ä«ðj¼¯Åëðz¼oÄ›ðf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ðm|ßÅ÷ð}ü?Äðcü?ÅÏðsü¿Ä¯ðkü¿Åïð{üÄŸðgüÅßðwüÿÄ¿ðïÿÿ8xPPx^]ÚC´†ÐÛ¶mÛ¶mÛ¶m›mÒÆjcÛ6Ú¤6NÛô¿þsr’;‹™¹ÛÙÌb&j@@Àú(AcîÿJÔ¯<ϳñ4<ÏÀ3ñ8<OÀñ$<OÁSq?ÜÀñ <ÁCñ0<À#ñ(<Ácq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Á}q<'À q"œ'ÁIq2œ§À)q*œ§Áiq:œgÀq&œgÁYq6œçÀ9q.œçÁyq>œÀq!\ÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuñ¼€o=/À ñ"¼/ÁKñwø{¼ /Ç?àñ ¼¯Â«ñ¼¯Ãëñ¼oÂ?áŸñf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ð/øW|ßÁ¿áßñ]|ßÇðCü?ÆOðSü ?Ç/ðKü ÿÿįñü¿ÃïñüÂá¿ñ?ø3ò­ƒà 8ŽCà8Ãà°8#àˆ8ŽŒË×ŽŠ£áè8މcáØ8ŽûÅÿ1 HÈoÃÁq‡Â¡q‡ÃáqG‘qGÃÑq DZqÇÃñqœ'‰qœ'ÃÉq œ§Â©qœ§Ãéqœg™qœgÃÙqœç¹qœçÃùq\Â…q\ÃÅq \—Â¥q\—Ãåq\W•q\WÃÕq \×µq\×ÃõqÜ7ÂqÜ7ÃÍq Üò‹ÿ¿oó׊ƒáà8‰CáÐ8 ‹Ãáð8Žˆ#áÈ8p,_;°ÿÚÑptÇıplÇÅñp|œ'ĉpbœ'ÅÉprœ§Ä©pjœ§ÅépzœgÄ™pfœgÅÙpvœçĹpnœçÅùp~\Ä…pa\ÅÅpq\—Ä¥pi\—Ååpy\WÄ•pe\WÅÕpu\×ĵpm\×Åõp}Ü7ÄpcÜ7ÅÍpsÜ·Ä­pkÜ·Åíp{ÜwÄpgÜwÅÝpwÜ÷ĽpoÜ÷Åýp<ăð`<ÅÃðp<Ä£ðh<Åãðx<OÄ“ðd<OÅÓðt<Ïijðl<Ïýâÿ$ø·Šƒáà8‰CáÐ8 ‹Ãáð8Žˆ#áÈ8 ŽŠ£áè8މcáØ8Ž‹ãáø8NˆáÄ8 NŠ“áä8N‰SáÔ8 N‹Óáô8Έ3áÌ8 Ί³áì8ΉsáÜ8΋óáü¸.ˆ á¸.Š‹áâ¸.‰KáÒ¸ .‹Ëáò¸®ˆ+áʸ ®Š«á긮‰káÚ¸®‹ëáú¸nˆáƸ nŠ›áæ¸n‰[áÖ¸ n‹Ûáö¸îˆ;áθ áî¸î‰{áÞ¸î‹ûáþxˆáÁxЇááx‰GáÑx ‹Çáñxžˆ'áÉx žŠ§áéxž‰gáÙxž‹çáùx^ˆáÅx ^Š¿Ãßãex9þÿˆWà•x^×àµx^7àxþ ÿŒ7ã-x+Þ†·ãx'Þ…wã=x/Þ‡÷ãø >„ã#ø(>†ãø$>…Oã3ø,>‡Ïã ø"¾„/ã+ø*¾†¯ãø&¾…Á¿âÛøþ ÿŽïâ{ø>~€âGø1~‚Ÿâgø9~_âWøü'~ßà·ø~?àøþ ÿÿÁŸqàAåkÁAq0‡À!q(‡Áaq8GÀq$GÁQq4ÇÀ1q,ÇÁqq<'À q"œ'ÁIq2œ§À)q*œ§Áiq:œgÀq&œgÁYq6œçÀ9q.œçÁyq>œÀq!\ÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Á}q?ÜÀñ <ÁCñ0<À#ñ(<Ácñ8<OÀñ$<OÁSñ4<ÏÀ3ñ,<ÏÁsñ<</À ñ"¼/ÁKñwø{¼ /Ç?àñ ¼¯Â«ñ¼¯Ãëñ¼oÂ?áŸñf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ð/øW|ßÁ¿áßñ]|ßÇðCü?ÆOðSü ?Ç/ðKü ÿÿįñü¿ÃïñüÂá¿ñ?ø3| üú¹‹x^í×E°—eÀáÿ½tÃ¥;”APRQJ:•TQBIéF°Pº»»»»»»»ÛÑ•<{wßosæY93ïæ…B³„…þ)}äP(â?N‡ÓâT85Nƒ“âd89NSâ88.އãã8'ĉpbœ?‰ôºŸâgø9~_âW8Äþ0Ž#áÈ8 ŽŠ£áè8މcáØx÷íÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ðm|ßÅ÷ð}ü?ÄðcÜwÁ]q7Ü÷À=q/Ü÷Á}q?ÜÀ?ãxþÿŠÿã?ð`ü'þ ÁCñ0<À#ñ(<Ácñ8<OÀñ$<OÁSñ4<ÏÀ3ñ,<ÏÁsñ<</À ñ"¼/ÁKñ2¼¯À+ñ*¼¯Ákñ:¼oÀñ&¼oÁ[ñ6¼ïÀ;ñ.¼Ÿ ݧði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ðm|ßÅ÷ð}ü?Äðcü?ÅÏðsü¿Ä¯pˆ÷†Ãq$GÁQq4ÇÀ1q,ÇÁqq<'À8!N„ã$8)N†“ã8%N…Sã48-N‡Óã ø ü&Έ3áÌ8 ~ gÅÙpvœçĹpnœçÅùðÛ8?.€ âwp!\¿‹‹à¢ø=ü>.†‹ã¸$.…Kãpü!þ—Åãrøü).+àŠ¸®Œ?ÃUpU\ WÇ5pM\ ׯup]\×ÇŸã/pÜ7Âq܉¿Â_ãføü-nŽ[à–¸þ·Æßãpü#n‹Ûáö¸îˆ;áŸð°°×=À#ñ(<Ácñ8<OÀñ$<OÁSñ4<ÏÀ3ñ,<ÏÁsñ<</À ñ"¼/ÁKñ2¼¯À+ñ*¼¯Ákñ:¼oÀñ&¼oÁ[ñ6¼ïÀ;ñ.¼ïÁ{ñ>¼Àñ!|ÁGñ1|ŸÀ'ñ)|ŸÁgñ9|_Àñ%|_ÁWñ5|ßÀ7ñ-|ßÁwñ=|?Àñ#ü?ÁOñ3ü¿À/ñ+â†Ãq$GÁQq4ÇÀ1q,ÇÁqq<'À8!N„ã$8)N†“ã8%N…Sã48-N‡Óã ø ü&Έ3áÌ8 ~ gÅÙpvœçĹpnœçÅùðÛ8?.€ âwp!\¿‹‹à¢ø=ü>.†‹ã¸$.…Kãpü!þ—Åãrøü).+àŠ¸®Œ?ÃUpU\ WÇ5pM\ ׯup]\×ÇŸã/pÜ7Âq܉¿Â_ãføü-nŽ[à–¸þ·Æßãpü#n‹Ûáö¸îˆ;áŸpgÜwÅÝpwÜ÷ĽpoÜ÷Åýp<ÿŒâAøü+þ ÿŽÿÀƒñŸø/<ÅÃðp<Ä£ðh<Åãðx<OÄ“ðd<OÅÓðt<Ïijðl<ÏÅóð|¼/Ä‹ðb¼/ÅËðr¼¯Ä«ðj¼¯Åëðz¼oÄ›ðf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|"üßô?÷7ùoùSeurat/tests/testdata/matrix.mtx0000644000176200001440000012076215063070153016536 0ustar liggesusers%%MatrixMarket matrix coordinate integer general 240 80 4814 2 1 1 6 1 1 9 1 3 12 1 1 23 1 1 31 1 4 33 1 3 35 1 1 36 1 5 38 1 1 40 1 1 44 1 3 45 1 3 47 1 1 48 1 3 50 1 1 51 1 1 52 1 1 53 1 1 54 1 2 56 1 1 57 1 2 58 1 1 59 1 2 60 1 1 65 1 1 78 1 4 80 1 1 84 1 1 93 1 1 95 1 1 100 1 1 104 1 1 109 1 1 120 1 1 126 1 1 133 1 1 141 1 1 149 1 2 152 1 2 159 1 1 163 1 2 166 1 3 167 1 1 177 1 1 194 1 1 198 1 1 208 1 1 222 1 1 233 1 1 236 1 1 238 1 1 4 2 1 9 2 7 22 2 1 23 2 1 25 2 2 27 2 1 31 2 4 32 2 3 33 2 7 34 2 1 36 2 2 38 2 1 39 2 1 40 2 1 41 2 5 42 2 2 43 2 2 44 2 2 45 2 3 48 2 1 49 2 2 52 2 2 56 2 3 57 2 2 58 2 1 67 2 1 69 2 3 72 2 2 74 2 2 77 2 1 78 2 4 80 2 2 92 2 1 93 2 1 95 2 1 100 2 1 111 2 1 115 2 1 116 2 1 117 2 1 126 2 1 128 2 1 141 2 1 147 2 1 156 2 1 159 2 1 177 2 1 191 2 1 193 2 1 197 2 1 198 2 2 219 2 1 223 2 1 228 2 1 231 2 1 232 2 1 239 2 1 9 3 11 12 3 1 24 3 1 31 3 4 32 3 2 33 3 11 35 3 2 36 3 1 37 3 1 39 3 1 42 3 1 44 3 1 47 3 1 48 3 2 49 3 1 51 3 2 54 3 1 55 3 1 56 3 2 57 3 2 58 3 1 65 3 9 67 3 1 69 3 2 72 3 2 78 3 4 80 3 2 89 3 1 92 3 1 93 3 1 98 3 1 104 3 1 107 3 1 124 3 1 126 3 1 140 3 1 141 3 1 144 3 1 149 3 1 152 3 1 153 3 2 155 3 2 157 3 1 160 3 1 163 3 1 164 3 1 166 3 3 172 3 4 175 3 1 179 3 1 181 3 1 222 3 1 232 3 1 9 4 13 12 4 1 23 4 6 31 4 5 32 4 2 33 4 13 34 4 1 35 4 2 36 4 2 39 4 1 40 4 1 42 4 1 43 4 2 44 4 6 45 4 4 46 4 2 48 4 5 49 4 4 54 4 1 55 4 2 56 4 3 57 4 3 58 4 1 59 4 2 60 4 1 65 4 8 67 4 1 70 4 2 72 4 4 76 4 1 78 4 5 81 4 1 88 4 1 90 4 1 96 4 2 98 4 1 104 4 2 112 4 1 130 4 1 141 4 1 142 4 3 149 4 2 151 4 3 154 4 1 155 4 1 157 4 1 163 4 2 166 4 3 169 4 1 172 4 2 173 4 1 176 4 1 180 4 1 182 4 1 210 4 1 214 4 1 222 4 1 236 4 3 4 5 1 9 5 3 31 5 4 32 5 3 33 5 3 36 5 2 39 5 36 41 5 2 43 5 1 44 5 5 45 5 2 48 5 2 49 5 3 51 5 2 52 5 1 54 5 54 56 5 2 57 5 2 64 5 1 65 5 1 67 5 3 68 5 1 69 5 1 72 5 1 75 5 1 78 5 4 89 5 1 90 5 2 99 5 1 100 5 1 101 5 1 104 5 1 128 5 1 131 5 1 137 5 1 140 5 1 141 5 2 144 5 1 146 5 1 149 5 3 151 5 2 153 5 3 154 5 1 159 5 1 161 5 1 163 5 1 166 5 1 172 5 1 176 5 1 180 5 1 182 5 1 183 5 1 198 5 2 211 5 1 217 5 1 222 5 2 223 5 1 232 5 2 233 5 1 4 6 1 9 6 4 14 6 1 23 6 2 24 6 1 31 6 4 32 6 1 33 6 4 34 6 1 35 6 1 37 6 2 42 6 2 43 6 2 44 6 3 45 6 1 46 6 1 47 6 1 48 6 4 49 6 1 50 6 1 54 6 2 55 6 1 57 6 1 60 6 1 66 6 1 69 6 1 72 6 1 78 6 4 80 6 1 81 6 1 93 6 1 100 6 2 101 6 1 126 6 1 128 6 1 135 6 1 144 6 1 146 6 1 149 6 2 151 6 1 153 6 2 155 6 1 156 6 1 159 6 2 166 6 3 172 6 2 182 6 1 194 6 1 200 6 1 223 6 1 231 6 1 232 6 1 236 6 1 9 7 6 23 7 4 31 7 3 32 7 1 33 7 6 34 7 1 36 7 1 37 7 3 38 7 1 41 7 1 42 7 1 44 7 4 45 7 1 48 7 3 49 7 3 50 7 1 54 7 1 55 7 2 59 7 2 60 7 1 65 7 3 69 7 2 70 7 1 78 7 3 96 7 1 101 7 1 113 7 1 125 7 1 127 7 1 132 7 1 149 7 2 152 7 2 156 7 1 166 7 3 179 7 1 210 7 1 213 7 1 236 7 1 238 7 1 4 8 1 9 8 4 23 8 1 24 8 1 31 8 2 32 8 3 33 8 4 35 8 1 36 8 12 37 8 2 38 8 1 40 8 1 41 8 1 43 8 2 45 8 2 46 8 1 47 8 1 48 8 2 49 8 4 50 8 1 53 8 1 54 8 1 55 8 2 58 8 1 59 8 1 65 8 3 71 8 1 74 8 1 78 8 2 81 8 1 85 8 1 92 8 1 100 8 1 120 8 1 128 8 1 141 8 1 149 8 1 152 8 1 154 8 1 156 8 1 159 8 1 161 8 1 163 8 1 166 8 1 172 8 1 182 8 1 183 8 1 222 8 1 233 8 1 9 9 2 31 9 2 32 9 2 33 9 2 35 9 2 37 9 3 38 9 1 42 9 1 43 9 3 44 9 1 45 9 1 47 9 1 48 9 3 49 9 2 51 9 1 54 9 1 56 9 1 57 9 3 58 9 2 59 9 1 78 9 2 80 9 2 81 9 2 83 9 1 89 9 1 93 9 1 95 9 1 96 9 1 100 9 1 112 9 1 126 9 1 142 9 1 148 9 1 156 9 1 159 9 1 163 9 1 172 9 1 179 9 1 191 9 1 236 9 1 2 10 1 9 10 21 12 10 1 23 10 4 25 10 1 31 10 2 32 10 1 33 10 21 34 10 1 35 10 1 36 10 9 38 10 1 40 10 1 41 10 1 43 10 1 44 10 6 45 10 1 47 10 1 53 10 1 54 10 3 55 10 1 59 10 1 65 10 3 69 10 2 72 10 6 74 10 2 78 10 2 80 10 1 98 10 4 100 10 1 101 10 1 115 10 1 141 10 2 146 10 1 149 10 3 150 10 1 154 10 1 156 10 2 159 10 1 166 10 3 172 10 3 182 10 1 210 10 1 231 10 1 1 11 2 2 11 2 4 11 14 5 11 3 6 11 1 7 11 3 9 11 2 13 11 1 15 11 3 20 11 1 21 11 1 22 11 1 23 11 2 24 11 2 26 11 2 28 11 1 29 11 1 30 11 1 33 11 2 43 11 1 54 11 1 86 11 1 90 11 1 93 11 1 95 11 1 100 11 1 121 11 3 126 11 1 128 11 14 129 11 4 132 11 1 133 11 1 134 11 2 143 11 1 159 11 1 233 11 1 1 12 2 2 12 4 3 12 5 4 12 28 6 12 6 7 12 1 8 12 4 9 12 9 10 12 2 11 12 1 12 12 3 14 12 1 16 12 3 17 12 1 18 12 1 25 12 1 26 12 2 27 12 4 33 12 9 43 12 1 44 12 1 45 12 1 48 12 2 54 12 2 55 12 1 57 12 1 68 12 1 72 12 1 75 12 2 81 12 2 84 12 1 89 12 1 90 12 1 93 12 4 98 12 1 101 12 1 107 12 1 112 12 1 121 12 8 124 12 1 126 12 4 128 12 28 129 12 10 130 12 4 132 12 4 133 12 6 134 12 10 138 12 2 141 12 1 143 12 1 146 12 1 155 12 1 156 12 1 161 12 1 163 12 1 165 12 1 166 12 1 169 12 2 172 12 2 180 12 1 181 12 1 182 12 1 210 12 29 217 12 1 222 12 1 236 12 2 1 13 4 2 13 3 3 13 2 4 13 18 5 13 2 6 13 2 8 13 1 9 13 2 11 13 1 12 13 2 13 13 1 15 13 1 21 13 1 23 13 4 25 13 1 26 13 1 28 13 15 33 13 2 37 13 1 45 13 1 48 13 1 66 13 1 81 13 1 82 13 1 98 13 1 100 13 1 108 13 1 121 13 2 128 13 18 129 13 4 130 13 4 132 13 3 133 13 2 134 13 6 142 13 1 146 13 1 149 13 1 154 13 2 155 13 1 159 13 1 166 13 2 182 13 1 215 13 1 230 13 1 231 13 1 1 14 4 2 14 3 3 14 2 4 14 7 5 14 4 6 14 2 8 14 1 9 14 4 10 14 1 14 14 1 16 14 1 17 14 2 21 14 1 23 14 1 29 14 1 33 14 4 48 14 1 54 14 1 64 14 2 93 14 1 121 14 2 126 14 1 128 14 7 129 14 4 130 14 1 133 14 2 134 14 1 143 14 1 178 14 1 180 14 1 211 14 2 1 15 2 2 15 2 3 15 5 4 15 15 6 15 2 7 15 2 8 15 2 9 15 4 10 15 1 12 15 1 15 15 1 18 15 1 22 15 2 24 15 2 25 15 2 27 15 1 33 15 4 36 15 1 47 15 1 48 15 5 56 15 1 61 15 1 72 15 1 81 15 1 84 15 1 98 15 1 121 15 5 128 15 15 129 15 8 132 15 4 133 15 2 134 15 5 138 15 1 142 15 2 144 15 1 152 15 1 153 15 2 154 15 1 155 15 1 156 15 2 166 15 1 182 15 1 194 15 1 196 15 1 198 15 1 222 15 1 231 15 1 236 15 1 1 16 3 2 16 3 3 16 8 4 16 28 6 16 8 8 16 2 10 16 1 12 16 2 14 16 3 15 16 1 17 16 1 19 16 1 20 16 1 25 16 3 27 16 1 30 16 1 32 16 2 37 16 1 47 16 1 56 16 1 61 16 1 71 16 1 72 16 1 79 16 1 101 16 1 121 16 9 124 16 4 128 16 28 129 16 23 130 16 8 132 16 8 133 16 8 134 16 16 140 16 3 141 16 2 146 16 1 149 16 2 156 16 5 158 16 1 164 16 1 172 16 1 176 16 1 194 16 1 198 16 2 228 16 1 233 16 2 1 17 3 2 17 1 3 17 1 4 17 7 5 17 3 6 17 2 7 17 2 8 17 1 9 17 3 11 17 1 12 17 2 13 17 1 19 17 2 20 17 1 23 17 4 26 17 1 30 17 1 33 17 3 44 17 2 45 17 1 58 17 1 67 17 2 100 17 1 101 17 1 107 17 1 124 17 1 128 17 7 129 17 7 130 17 1 132 17 1 133 17 2 134 17 5 138 17 1 149 17 4 159 17 1 182 17 1 233 17 1 1 18 4 2 18 2 3 18 5 4 18 26 5 18 3 6 18 2 7 18 1 8 18 2 9 18 6 11 18 1 13 18 2 16 18 1 18 18 1 19 18 1 20 18 1 22 18 2 23 18 2 25 18 1 27 18 1 28 18 23 29 18 1 33 18 6 45 18 3 48 18 1 49 18 1 61 18 1 64 18 1 66 18 1 72 18 1 81 18 1 93 18 1 100 18 2 121 18 5 124 18 1 126 18 1 128 18 26 130 18 5 132 18 2 133 18 2 134 18 11 138 18 1 140 18 1 143 18 2 154 18 1 159 18 2 172 18 1 175 18 1 183 18 1 190 18 1 211 18 1 229 18 1 1 19 2 2 19 2 3 19 5 4 19 10 5 19 3 6 19 1 7 19 1 9 19 5 10 19 1 12 19 1 13 19 2 14 19 1 17 19 1 21 19 1 22 19 1 23 19 6 24 19 1 26 19 1 33 19 5 36 19 1 44 19 1 45 19 1 47 19 1 49 19 1 56 19 1 62 19 1 63 19 1 90 19 1 93 19 1 98 19 1 102 19 1 121 19 1 126 19 1 128 19 10 129 19 4 132 19 2 133 19 1 134 19 5 135 19 1 143 19 1 151 19 1 154 19 1 166 19 2 180 19 1 221 19 1 228 19 1 231 19 1 233 19 1 1 20 3 2 20 5 3 20 12 4 20 16 5 20 2 6 20 2 7 20 2 8 20 1 9 20 7 11 20 1 16 20 2 18 20 3 19 20 1 23 20 2 24 20 1 25 20 1 26 20 1 30 20 1 33 20 7 37 20 1 41 20 1 45 20 1 49 20 1 56 20 1 75 20 1 80 20 2 81 20 1 98 20 1 100 20 2 121 20 5 124 20 1 128 20 16 129 20 6 130 20 1 132 20 4 133 20 2 134 20 8 135 20 1 143 20 1 144 20 1 149 20 1 152 20 1 159 20 2 166 20 3 196 20 1 4 21 7 7 21 1 9 21 1 23 21 3 33 21 1 36 21 1 44 21 1 49 21 1 50 21 1 64 21 2 68 21 1 81 21 1 90 21 2 91 21 18 92 21 30 93 21 50 94 21 1 95 21 10 96 21 14 97 21 3 98 21 3 99 21 4 100 21 15 101 21 1 104 21 2 105 21 1 107 21 1 108 21 1 109 21 2 110 21 1 111 21 3 112 21 5 113 21 12 115 21 2 119 21 1 120 21 5 125 21 12 126 21 50 128 21 7 130 21 1 134 21 2 135 21 13 136 21 4 140 21 2 146 21 1 147 21 4 151 21 3 152 21 5 153 21 6 154 21 1 156 21 4 157 21 3 158 21 6 159 21 15 160 21 1 161 21 1 163 21 2 164 21 6 166 21 6 170 21 1 172 21 6 173 21 1 177 21 2 178 21 1 182 21 4 186 21 1 198 21 1 211 21 2 212 21 1 217 21 1 218 21 1 222 21 1 4 22 22 6 22 3 8 22 1 32 22 2 44 22 2 54 22 2 64 22 1 70 22 1 74 22 1 76 22 1 82 22 1 91 22 5 92 22 12 93 22 29 94 22 2 95 22 6 96 22 13 97 22 2 98 22 13 99 22 7 100 22 9 101 22 2 103 22 1 104 22 14 105 22 1 106 22 1 107 22 3 108 22 1 109 22 27 110 22 1 111 22 4 112 22 1 113 22 6 116 22 4 118 22 1 120 22 3 121 22 13 124 22 4 125 22 6 126 22 29 128 22 22 129 22 18 130 22 5 131 22 1 132 22 8 133 22 3 134 22 12 135 22 28 138 22 2 140 22 3 144 22 1 146 22 3 147 22 1 148 22 7 151 22 6 152 22 7 153 22 5 155 22 1 156 22 15 158 22 4 159 22 9 160 22 5 161 22 1 163 22 10 164 22 3 165 22 1 166 22 4 167 22 2 170 22 1 171 22 1 172 22 15 173 22 1 174 22 2 176 22 1 177 22 1 180 22 1 182 22 5 198 22 1 211 22 1 231 22 2 3 23 1 7 23 1 12 23 1 13 23 1 74 23 1 75 23 1 91 23 25 92 23 51 93 23 25 94 23 2 95 23 5 96 23 3 98 23 5 99 23 1 100 23 1 101 23 6 102 23 1 104 23 10 105 23 1 107 23 1 111 23 2 113 23 2 114 23 1 118 23 1 121 23 2 124 23 1 125 23 2 126 23 25 129 23 1 132 23 1 134 23 1 135 23 15 137 23 1 140 23 1 141 23 1 147 23 1 148 23 1 151 23 1 152 23 6 153 23 1 155 23 1 156 23 8 159 23 1 163 23 4 164 23 4 172 23 2 174 23 4 177 23 1 180 23 1 182 23 3 198 23 2 4 24 10 8 24 1 9 24 1 24 24 1 33 24 1 44 24 2 74 24 1 91 24 5 92 24 22 93 24 49 94 24 4 95 24 9 96 24 10 99 24 6 100 24 5 103 24 4 104 24 8 107 24 2 108 24 1 109 24 1 110 24 2 111 24 1 113 24 1 114 24 1 115 24 1 116 24 4 121 24 1 124 24 1 125 24 1 126 24 49 128 24 10 129 24 2 132 24 1 134 24 5 135 24 11 140 24 6 142 24 1 146 24 3 148 24 1 151 24 4 152 24 5 153 24 5 154 24 1 156 24 5 158 24 2 159 24 5 163 24 2 164 24 6 172 24 4 177 24 1 182 24 5 195 24 3 198 24 3 237 24 1 1 25 1 4 25 6 9 25 1 13 25 1 31 25 1 32 25 1 33 25 1 42 25 1 44 25 1 45 25 3 48 25 1 54 25 1 56 25 1 58 25 1 61 25 1 66 25 1 72 25 3 74 25 1 78 25 1 81 25 1 91 25 25 92 25 85 93 25 98 94 25 1 95 25 7 96 25 16 97 25 1 98 25 11 99 25 5 100 25 7 101 25 36 102 25 2 103 25 1 104 25 11 105 25 1 106 25 1 108 25 1 109 25 1 110 25 1 111 25 1 112 25 1 113 25 6 114 25 2 115 25 14 116 25 4 117 25 1 119 25 1 120 25 3 125 25 6 126 25 98 128 25 6 131 25 2 134 25 1 135 25 13 140 25 5 141 25 2 142 25 2 143 25 2 146 25 1 147 25 1 148 25 1 151 25 8 152 25 4 153 25 3 154 25 2 156 25 4 157 25 3 159 25 7 163 25 2 164 25 1 165 25 1 166 25 1 168 25 1 169 25 2 172 25 7 177 25 1 181 25 1 182 25 12 183 25 1 198 25 5 210 25 1 212 25 1 239 25 1 36 26 1 91 26 6 92 26 3 93 26 11 95 26 1 96 26 4 99 26 1 100 26 3 101 26 1 102 26 1 103 26 1 104 26 4 105 26 1 107 26 1 108 26 1 109 26 1 112 26 1 114 26 2 115 26 1 116 26 1 117 26 1 119 26 1 121 26 1 126 26 11 129 26 3 135 26 7 136 26 1 140 26 1 146 26 1 151 26 3 152 26 3 153 26 2 156 26 2 159 26 3 160 26 2 163 26 2 164 26 2 166 26 1 172 26 3 177 26 1 182 26 1 191 26 1 198 26 1 237 26 1 4 27 4 6 27 1 23 27 1 38 27 1 44 27 1 48 27 1 58 27 1 64 27 1 72 27 1 82 27 1 91 27 24 92 27 54 93 27 59 94 27 1 95 27 1 96 27 13 97 27 1 98 27 2 99 27 6 100 27 4 101 27 5 102 27 4 103 27 7 104 27 6 105 27 1 106 27 1 110 27 1 114 27 1 115 27 2 116 27 3 117 27 3 119 27 1 120 27 1 126 27 59 128 27 4 133 27 1 134 27 3 135 27 37 140 27 3 142 27 1 146 27 1 147 27 5 148 27 2 151 27 5 152 27 1 153 27 1 156 27 8 157 27 1 158 27 1 159 27 4 160 27 4 163 27 1 164 27 4 171 27 1 172 27 6 174 27 3 177 27 1 180 27 1 182 27 15 183 27 1 198 27 2 206 27 1 211 27 1 215 27 1 225 27 1 228 27 1 236 27 1 3 28 1 4 28 3 24 28 1 48 28 1 56 28 1 58 28 1 91 28 40 92 28 55 93 28 28 94 28 1 95 28 2 96 28 12 98 28 3 99 28 4 100 28 4 102 28 1 103 28 1 104 28 7 105 28 1 106 28 2 107 28 1 111 28 2 114 28 3 117 28 2 118 28 2 120 28 5 126 28 28 128 28 3 129 28 1 131 28 1 135 28 5 140 28 1 141 28 1 142 28 1 147 28 1 152 28 2 153 28 1 154 28 1 156 28 2 157 28 1 159 28 4 160 28 1 163 28 6 164 28 4 166 28 1 168 28 2 170 28 1 178 28 1 182 28 2 193 28 1 228 28 1 231 28 1 233 28 1 4 29 7 6 29 1 8 29 2 39 29 1 43 29 1 59 29 1 61 29 1 72 29 1 79 29 1 80 29 1 91 29 16 92 29 35 93 29 34 94 29 3 95 29 8 96 29 19 97 29 1 98 29 5 99 29 5 100 29 11 101 29 3 102 29 1 103 29 1 104 29 22 107 29 1 108 29 2 109 29 1 110 29 2 111 29 15 112 29 2 113 29 5 115 29 1 116 29 2 117 29 1 121 29 7 124 29 1 125 29 5 126 29 34 128 29 7 129 29 7 131 29 1 132 29 4 133 29 1 134 29 5 135 29 20 136 29 2 137 29 1 140 29 4 141 29 2 142 29 1 143 29 1 146 29 2 148 29 2 149 29 3 151 29 7 152 29 10 153 29 6 154 29 2 155 29 2 156 29 11 157 29 1 158 29 3 159 29 11 160 29 2 162 29 1 163 29 5 164 29 9 166 29 3 167 29 1 170 29 1 171 29 3 172 29 4 174 29 1 175 29 2 182 29 3 191 29 1 193 29 1 198 29 3 225 29 1 227 29 1 228 29 1 2 30 1 4 30 13 9 30 1 13 30 1 25 30 1 33 30 1 36 30 1 37 30 1 45 30 1 48 30 1 51 30 1 54 30 3 64 30 1 70 30 1 81 30 1 84 30 1 88 30 1 91 30 11 92 30 17 93 30 16 95 30 7 96 30 12 98 30 10 99 30 1 100 30 7 101 30 5 103 30 2 104 30 37 106 30 1 107 30 3 108 30 1 109 30 1 110 30 1 111 30 2 112 30 1 113 30 2 114 30 1 115 30 2 118 30 5 120 30 4 121 30 6 124 30 2 125 30 2 126 30 16 128 30 13 129 30 7 130 30 1 132 30 1 134 30 3 135 30 18 136 30 3 140 30 2 141 30 1 146 30 3 147 30 2 148 30 1 149 30 3 151 30 13 152 30 12 153 30 4 156 30 18 157 30 1 158 30 3 159 30 7 160 30 7 161 30 1 163 30 6 164 30 8 166 30 6 168 30 2 172 30 20 174 30 3 175 30 1 176 30 1 177 30 2 180 30 1 182 30 1 186 30 2 187 30 1 198 30 2 203 30 1 206 30 1 210 30 1 211 30 1 232 30 1 237 30 2 2 31 1 9 31 1 22 31 1 32 31 1 33 31 1 36 31 2 39 31 1 47 31 1 48 31 2 54 31 1 57 31 3 61 31 1 62 31 1 64 31 35 68 31 4 80 31 1 84 31 1 91 31 1 96 31 3 101 31 1 104 31 3 129 31 2 135 31 1 140 31 1 141 31 3 146 31 1 149 31 1 152 31 1 154 31 2 155 31 1 156 31 3 161 31 6 163 31 6 164 31 8 166 31 8 176 31 2 183 31 2 193 31 1 201 31 1 211 31 35 212 31 27 213 31 2 214 31 35 215 31 5 216 31 7 217 31 4 218 31 5 219 31 14 221 31 1 222 31 1 225 31 4 226 31 2 227 31 1 228 31 1 229 31 1 230 31 3 231 31 2 232 31 3 233 31 3 235 31 4 236 31 7 237 31 1 239 31 3 4 32 1 24 32 1 31 32 7 35 32 2 48 32 2 49 32 1 62 32 3 64 32 14 65 32 2 68 32 4 69 32 1 70 32 2 72 32 2 78 32 7 80 32 1 84 32 1 87 32 1 98 32 1 104 32 4 121 32 1 128 32 1 129 32 4 132 32 1 134 32 2 140 32 2 145 32 1 149 32 4 153 32 1 157 32 1 161 32 2 166 32 2 172 32 1 174 32 1 177 32 2 182 32 1 183 32 1 211 32 14 212 32 2 213 32 5 215 32 3 217 32 4 218 32 3 219 32 1 220 32 3 221 32 3 222 32 1 223 32 4 224 32 1 226 32 1 228 32 1 231 32 2 232 32 1 234 32 1 235 32 1 236 32 3 239 32 5 2 33 2 26 33 1 32 33 1 54 33 1 57 33 1 62 33 2 64 33 12 68 33 2 70 33 5 74 33 1 77 33 1 82 33 1 84 33 1 87 33 1 93 33 1 96 33 4 100 33 1 104 33 9 126 33 1 141 33 1 142 33 1 149 33 5 153 33 2 154 33 1 155 33 1 159 33 1 161 33 2 164 33 3 166 33 3 172 33 1 177 33 1 179 33 1 211 33 12 212 33 1 213 33 3 214 33 15 215 33 9 216 33 1 217 33 2 218 33 1 219 33 4 220 33 5 221 33 2 222 33 2 223 33 2 224 33 1 226 33 1 227 33 1 228 33 1 230 33 4 231 33 1 232 33 1 233 33 2 234 33 3 236 33 2 237 33 58 238 33 1 239 33 1 9 34 1 24 34 1 32 34 1 33 34 1 44 34 2 48 34 2 49 34 1 54 34 15 55 34 1 56 34 1 57 34 1 59 34 1 62 34 3 64 34 30 65 34 5 68 34 7 69 34 2 70 34 14 71 34 1 74 34 1 80 34 1 87 34 1 90 34 2 92 34 1 96 34 3 98 34 1 99 34 2 104 34 6 107 34 1 121 34 2 134 34 1 140 34 1 142 34 1 146 34 4 149 34 1 154 34 1 161 34 1 164 34 1 166 34 5 173 34 1 176 34 1 211 34 30 212 34 10 213 34 4 214 34 3 215 34 2 216 34 1 217 34 7 219 34 9 220 34 7 221 34 3 222 34 2 223 34 1 224 34 1 225 34 3 226 34 1 227 34 1 228 34 1 231 34 1 232 34 3 233 34 1 234 34 2 235 34 1 238 34 2 239 34 3 4 35 1 12 35 1 26 35 1 39 35 1 44 35 2 57 35 1 62 35 2 64 35 20 65 35 4 68 35 2 69 35 1 72 35 1 80 35 1 83 35 2 90 35 2 92 35 1 93 35 2 96 35 6 104 35 1 120 35 1 124 35 1 126 35 2 128 35 1 140 35 2 141 35 3 142 35 1 146 35 1 148 35 1 149 35 1 153 35 1 164 35 2 166 35 2 173 35 1 211 35 20 212 35 8 213 35 10 214 35 29 215 35 6 217 35 2 218 35 3 219 35 7 220 35 1 221 35 2 222 35 4 223 35 1 228 35 1 229 35 2 230 35 1 231 35 1 233 35 1 236 35 1 238 35 1 240 35 10 12 36 1 14 36 1 23 36 1 42 36 1 51 36 1 57 36 3 62 36 4 64 36 27 67 36 2 68 36 4 69 36 1 70 36 29 74 36 2 75 36 1 81 36 1 90 36 1 91 36 1 96 36 7 98 36 1 104 36 3 116 36 1 151 36 1 154 36 1 161 36 1 164 36 5 166 36 1 176 36 1 186 36 1 211 36 27 212 36 5 213 36 8 214 36 11 215 36 3 216 36 1 217 36 4 218 36 1 219 36 10 221 36 4 222 36 1 223 36 2 225 36 1 227 36 1 229 36 1 230 36 2 231 36 1 232 36 2 233 36 3 236 36 3 237 36 1 238 36 3 4 37 1 31 37 1 44 37 1 51 37 1 56 37 1 57 37 4 59 37 2 61 37 1 62 37 8 64 37 28 68 37 3 69 37 1 70 37 1 72 37 1 78 37 1 81 37 1 88 37 2 90 37 1 92 37 1 96 37 3 100 37 1 101 37 1 103 37 1 104 37 14 120 37 1 121 37 1 128 37 1 135 37 1 140 37 1 142 37 1 146 37 4 149 37 1 153 37 1 156 37 1 158 37 1 159 37 1 161 37 2 163 37 1 164 37 6 165 37 1 166 37 5 172 37 1 176 37 3 179 37 1 182 37 2 183 37 1 210 37 2 211 37 28 212 37 10 213 37 12 214 37 22 215 37 6 216 37 5 217 37 3 218 37 1 219 37 10 220 37 3 221 37 8 223 37 3 224 37 1 225 37 7 226 37 1 227 37 2 228 37 1 229 37 1 230 37 3 231 37 3 232 37 2 233 37 1 235 37 4 236 37 3 238 37 2 239 37 1 4 38 1 25 38 1 32 38 2 38 38 1 48 38 1 55 38 1 57 38 2 61 38 1 62 38 6 64 38 10 68 38 3 69 38 2 70 38 7 74 38 1 80 38 1 81 38 1 83 38 3 90 38 1 93 38 1 95 38 1 96 38 4 101 38 1 104 38 2 109 38 1 120 38 1 126 38 1 128 38 1 135 38 1 140 38 2 141 38 1 142 38 1 146 38 1 153 38 1 154 38 1 161 38 1 163 38 1 164 38 6 166 38 1 176 38 1 183 38 1 193 38 1 211 38 10 212 38 7 213 38 10 214 38 15 215 38 8 216 38 4 217 38 3 218 38 2 219 38 2 220 38 1 221 38 6 222 38 2 223 38 2 225 38 4 227 38 2 229 38 1 233 38 2 235 38 2 236 38 5 237 38 2 238 38 1 239 38 2 240 38 1 14 39 1 23 39 4 31 39 1 48 39 3 49 39 1 57 39 1 61 39 1 62 39 1 64 39 25 67 39 1 68 39 2 69 39 1 70 39 5 72 39 1 74 39 1 78 39 1 81 39 2 90 39 1 96 39 5 101 39 1 104 39 1 120 39 2 134 39 1 142 39 1 155 39 1 156 39 1 161 39 2 164 39 1 165 39 1 166 39 3 176 39 1 182 39 1 183 39 1 211 39 25 212 39 4 213 39 3 214 39 18 215 39 2 216 39 1 217 39 2 218 39 1 219 39 4 221 39 1 222 39 1 223 39 2 224 39 1 226 39 1 227 39 1 228 39 1 230 39 1 231 39 3 232 39 1 233 39 1 234 39 1 235 39 1 237 39 1 238 39 2 26 40 1 35 40 2 47 40 1 48 40 1 54 40 1 55 40 1 57 40 1 62 40 11 64 40 27 65 40 7 67 40 1 68 40 5 70 40 25 72 40 2 74 40 1 75 40 1 80 40 1 81 40 1 83 40 2 84 40 2 89 40 1 96 40 15 99 40 1 100 40 4 104 40 4 137 40 1 140 40 1 141 40 3 142 40 1 146 40 1 154 40 2 155 40 1 156 40 1 159 40 4 161 40 6 164 40 6 166 40 2 176 40 2 179 40 3 196 40 1 198 40 2 210 40 1 211 40 27 212 40 11 213 40 13 214 40 18 215 40 5 216 40 1 217 40 5 218 40 1 219 40 7 220 40 2 221 40 11 222 40 3 223 40 6 224 40 51 225 40 3 226 40 1 228 40 25 229 40 3 231 40 1 232 40 1 233 40 2 234 40 2 235 40 2 236 40 1 238 40 1 239 40 2 240 40 1 23 41 7 32 41 1 44 41 2 45 41 2 48 41 1 49 41 1 50 41 1 54 41 2 57 41 2 62 41 1 63 41 1 64 41 31 65 41 8 68 41 2 69 41 1 71 41 1 72 41 1 73 41 1 74 41 1 75 41 1 76 41 1 81 41 1 84 41 1 85 41 1 87 41 1 90 41 2 96 41 2 98 41 5 100 41 1 101 41 1 104 41 1 122 41 1 140 41 2 141 41 1 145 41 1 153 41 3 155 41 1 157 41 1 159 41 1 161 41 2 163 41 1 164 41 3 166 41 7 172 41 1 198 41 1 210 41 1 211 41 31 212 41 3 213 41 1 214 41 10 215 41 4 217 41 2 218 41 3 219 41 6 220 41 6 221 41 1 222 41 1 223 41 2 225 41 1 226 41 1 227 41 1 228 41 1 232 41 2 239 41 3 9 42 1 23 42 1 31 42 2 33 42 1 36 42 1 44 42 1 45 42 2 54 42 1 57 42 1 59 42 1 61 42 1 62 42 4 64 42 22 65 42 5 66 42 1 67 42 1 68 42 3 69 42 1 70 42 14 72 42 2 75 42 2 78 42 2 79 42 1 80 42 1 81 42 2 82 42 1 83 42 1 84 42 1 85 42 1 88 42 1 90 42 1 93 42 1 98 42 1 100 42 1 101 42 1 104 42 3 111 42 1 126 42 1 129 42 4 130 42 1 138 42 1 141 42 1 144 42 1 153 42 1 154 42 1 155 42 1 156 42 1 159 42 1 166 42 4 172 42 2 179 42 1 193 42 1 206 42 1 211 42 22 213 42 8 215 42 1 217 42 3 219 42 13 221 42 4 223 42 1 231 42 1 232 42 1 233 42 2 234 42 1 235 42 1 236 42 2 237 42 1 238 42 1 9 43 1 23 43 3 31 43 3 33 43 1 36 43 3 44 43 4 49 43 2 54 43 3 55 43 1 56 43 1 57 43 4 61 43 1 62 43 1 63 43 2 64 43 7 65 43 5 67 43 1 68 43 1 69 43 2 70 43 27 71 43 1 72 43 1 74 43 2 77 43 3 78 43 3 80 43 3 81 43 1 85 43 1 86 43 1 89 43 1 90 43 2 93 43 1 96 43 1 98 43 1 107 43 1 113 43 1 125 43 1 126 43 1 137 43 1 146 43 1 154 43 1 156 43 3 157 43 1 166 43 2 211 43 7 213 43 2 217 43 1 221 43 1 227 43 1 231 43 2 236 43 1 9 44 1 22 44 1 33 44 1 36 44 1 45 44 1 48 44 1 54 44 1 61 44 1 62 44 2 63 44 1 64 44 2 67 44 2 68 44 1 70 44 3 72 44 1 74 44 1 75 44 1 81 44 1 82 44 1 84 44 1 86 44 1 88 44 1 89 44 1 96 44 1 149 44 2 166 44 2 180 44 1 182 44 1 193 44 1 211 44 2 213 44 1 214 44 3 217 44 1 221 44 2 236 44 1 238 44 1 9 45 7 12 45 1 23 45 6 24 45 1 25 45 1 31 45 3 33 45 7 36 45 1 42 45 1 44 45 4 46 45 1 48 45 2 49 45 1 57 45 2 62 45 1 63 45 2 64 45 4 65 45 7 67 45 47 69 45 1 70 45 13 72 45 1 73 45 1 75 45 1 76 45 1 77 45 1 78 45 3 80 45 1 81 45 1 84 45 1 86 45 1 87 45 2 88 45 1 89 45 2 90 45 2 100 45 1 101 45 2 121 45 1 129 45 1 152 45 2 153 45 1 155 45 1 159 45 1 163 45 1 166 45 5 167 45 1 172 45 5 182 45 1 211 45 4 221 45 1 223 45 1 224 45 1 4 46 1 9 46 1 23 46 1 26 46 3 31 46 15 33 46 1 36 46 1 43 46 1 44 46 4 49 46 2 54 46 1 58 46 2 62 46 2 64 46 14 65 46 1 68 46 2 69 46 2 70 46 17 71 46 1 72 46 2 75 46 1 77 46 3 78 46 15 82 46 1 84 46 1 86 46 2 87 46 1 90 46 1 121 46 3 128 46 1 129 46 2 132 46 1 134 46 3 149 46 1 154 46 1 155 46 1 163 46 1 166 46 1 172 46 1 177 46 1 211 46 14 215 46 2 217 46 2 221 46 2 231 46 1 236 46 2 4 47 1 31 47 1 32 47 1 35 47 2 43 47 1 48 47 2 54 47 1 61 47 1 62 47 2 64 47 16 65 47 6 66 47 1 67 47 1 68 47 8 69 47 1 70 47 7 72 47 4 74 47 1 76 47 1 77 47 3 78 47 1 81 47 1 83 47 1 84 47 1 95 47 1 98 47 1 101 47 1 104 47 1 128 47 1 141 47 2 146 47 1 154 47 2 157 47 1 161 47 1 166 47 1 176 47 1 177 47 1 182 47 1 211 47 16 212 47 6 214 47 4 215 47 9 217 47 8 219 47 6 220 47 10 221 47 2 222 47 1 223 47 3 232 47 1 236 47 2 237 47 1 238 47 1 239 47 3 4 48 1 9 48 1 14 48 1 23 48 1 31 48 3 33 48 1 36 48 2 37 48 1 42 48 1 45 48 1 48 48 3 49 48 1 54 48 1 62 48 1 63 48 2 64 48 4 65 48 7 66 48 1 67 48 1 68 48 4 69 48 1 70 48 3 71 48 1 72 48 1 74 48 1 75 48 1 78 48 3 79 48 1 80 48 7 81 48 2 82 48 1 83 48 4 87 48 1 88 48 1 90 48 1 93 48 1 107 48 1 116 48 1 126 48 1 128 48 1 135 48 1 141 48 1 144 48 1 146 48 1 149 48 1 153 48 1 154 48 2 163 48 1 166 48 4 176 48 1 182 48 2 211 48 4 213 48 3 214 48 1 217 48 4 221 48 1 222 48 1 223 48 2 229 48 1 233 48 1 238 48 2 239 48 1 9 49 5 31 49 6 33 49 5 39 49 2 49 49 5 61 49 39 62 49 5 64 49 29 65 49 6 66 49 1 67 49 1 68 49 5 69 49 1 70 49 16 71 49 1 72 49 2 73 49 1 74 49 17 75 49 1 78 49 6 79 49 1 82 49 1 83 49 1 84 49 1 88 49 1 90 49 2 98 49 1 103 49 1 104 49 1 120 49 1 121 49 1 140 49 1 141 49 1 149 49 3 153 49 2 154 49 1 155 49 1 156 49 2 166 49 1 172 49 2 179 49 1 198 49 1 210 49 1 211 49 29 212 49 2 213 49 3 214 49 3 215 49 3 217 49 5 219 49 5 220 49 9 221 49 5 227 49 1 232 49 1 234 49 1 236 49 1 239 49 3 9 50 3 23 50 1 31 50 4 32 50 1 33 50 3 36 50 2 37 50 1 44 50 2 48 50 1 49 50 2 54 50 1 55 50 3 57 50 1 59 50 1 60 50 1 62 50 1 63 50 3 64 50 8 65 50 1 66 50 1 67 50 1 68 50 2 69 50 1 70 50 12 72 50 4 73 50 1 78 50 4 79 50 2 80 50 1 81 50 2 83 50 1 85 50 13 89 50 1 95 50 2 141 50 1 146 50 2 153 50 1 154 50 1 156 50 1 166 50 2 167 50 1 211 50 8 213 50 2 217 50 2 219 50 3 221 50 1 223 50 1 235 50 1 236 50 1 238 50 1 2 51 1 4 51 10 9 51 1 15 51 1 24 51 1 33 51 1 38 51 1 42 51 1 45 51 1 50 51 1 56 51 1 59 51 1 64 51 5 70 51 3 72 51 2 75 51 1 91 51 2 92 51 20 93 51 41 95 51 13 96 51 11 98 51 2 99 51 6 100 51 8 101 51 2 102 51 1 103 51 4 104 51 5 109 51 1 111 51 4 113 51 3 115 51 3 116 51 2 118 51 1 119 51 1 121 51 12 124 51 1 125 51 3 126 51 41 128 51 10 129 51 8 132 51 4 134 51 8 135 51 16 140 51 4 141 51 3 142 51 1 146 51 9 147 51 2 148 51 2 149 51 3 151 51 15 152 51 7 153 51 8 154 51 2 156 51 21 157 51 2 158 51 2 159 51 8 160 51 5 162 51 1 163 51 17 164 51 12 166 51 5 168 51 3 170 51 2 171 51 1 172 51 9 173 51 2 174 51 6 176 51 1 177 51 2 178 51 1 182 51 5 183 51 2 193 51 1 194 51 1 198 51 1 211 51 5 225 51 1 228 51 2 4 52 10 6 52 1 9 52 2 23 52 1 32 52 2 33 52 2 40 52 1 45 52 1 48 52 2 51 52 1 54 52 1 58 52 1 59 52 1 64 52 3 67 52 2 70 52 1 72 52 1 81 52 1 87 52 1 90 52 1 91 52 2 92 52 6 93 52 4 95 52 7 96 52 21 98 52 2 99 52 5 100 52 8 101 52 4 104 52 12 109 52 1 110 52 1 111 52 5 115 52 2 116 52 2 120 52 2 121 52 4 126 52 4 128 52 10 129 52 3 130 52 2 132 52 5 133 52 1 134 52 4 135 52 32 140 52 1 141 52 3 142 52 1 146 52 3 148 52 1 149 52 1 151 52 17 152 52 12 153 52 8 154 52 2 155 52 1 156 52 25 157 52 3 158 52 1 159 52 8 160 52 3 161 52 5 162 52 1 163 52 13 164 52 12 165 52 2 166 52 10 167 52 2 168 52 3 169 52 5 170 52 4 171 52 2 172 52 20 173 52 3 174 52 4 175 52 5 176 52 6 177 52 2 179 52 26 182 52 3 193 52 1 196 52 1 198 52 2 210 52 1 211 52 3 212 52 1 230 52 1 237 52 1 238 52 1 2 53 1 4 53 4 6 53 1 38 53 1 44 53 1 59 53 1 74 53 1 92 53 1 93 53 3 95 53 5 96 53 2 98 53 2 99 53 1 100 53 7 103 53 1 104 53 4 109 53 1 110 53 1 111 53 2 114 53 1 121 53 2 126 53 3 128 53 4 129 53 5 133 53 1 135 53 7 140 53 2 146 53 1 147 53 1 148 53 3 151 53 8 152 53 7 153 53 6 154 53 1 156 53 6 157 53 16 158 53 1 159 53 7 160 53 4 161 53 1 162 53 3 163 53 1 164 53 2 165 53 1 166 53 1 167 53 2 169 53 1 170 53 2 172 53 9 174 53 1 178 53 1 180 53 1 191 53 1 228 53 1 2 54 1 4 54 1 8 54 1 23 54 1 45 54 1 91 54 4 93 54 3 95 54 1 96 54 5 99 54 1 100 54 3 101 54 1 104 54 2 115 54 1 120 54 1 121 54 1 126 54 3 128 54 1 129 54 2 131 54 1 135 54 9 141 54 1 142 54 1 147 54 1 151 54 11 152 54 6 153 54 2 156 54 10 158 54 1 159 54 3 160 54 1 161 54 2 163 54 2 164 54 4 166 54 4 167 54 1 168 54 1 170 54 1 171 54 1 172 54 3 176 54 1 177 54 2 180 54 1 215 54 1 225 54 1 2 55 2 4 55 6 6 55 2 8 55 1 9 55 1 12 55 1 15 55 1 22 55 1 33 55 1 37 55 1 45 55 1 48 55 2 72 55 2 74 55 1 91 55 3 92 55 10 93 55 14 95 55 4 96 55 21 98 55 2 99 55 6 100 55 10 101 55 2 103 55 1 104 55 16 105 55 2 106 55 1 107 55 2 109 55 3 110 55 1 112 55 1 115 55 3 116 55 4 117 55 2 118 55 1 120 55 1 121 55 5 126 55 14 128 55 6 129 55 3 132 55 3 133 55 2 134 55 7 135 55 11 140 55 1 141 55 2 146 55 4 147 55 2 151 55 18 152 55 32 153 55 9 154 55 50 155 55 3 156 55 26 157 55 1 158 55 3 159 55 10 160 55 11 161 55 14 163 55 9 164 55 35 165 55 3 166 55 17 167 55 1 168 55 2 169 55 2 170 55 1 172 55 6 173 55 6 174 55 4 175 55 4 176 55 1 177 55 2 178 55 1 179 55 2 180 55 2 182 55 1 193 55 1 226 55 1 233 55 1 236 55 2 237 55 2 2 56 2 4 56 28 7 56 1 9 56 1 22 56 1 32 56 1 33 56 1 43 56 2 44 56 2 47 56 2 54 56 1 56 56 1 87 56 1 90 56 2 92 56 4 93 56 17 94 56 1 95 56 3 96 56 13 98 56 1 99 56 4 100 56 15 101 56 3 104 56 10 107 56 2 109 56 6 110 56 2 111 56 5 115 56 1 116 56 2 118 56 1 120 56 3 121 56 5 124 56 4 126 56 17 128 56 28 129 56 7 130 56 1 132 56 3 134 56 7 135 56 17 140 56 5 141 56 2 144 56 1 146 56 2 147 56 3 148 56 1 149 56 1 151 56 13 152 56 33 153 56 9 154 56 1 155 56 3 156 56 26 157 56 11 158 56 4 159 56 15 160 56 9 161 56 4 162 56 1 163 56 12 164 56 16 165 56 4 166 56 8 168 56 1 169 56 4 170 56 3 171 56 3 172 56 9 174 56 3 176 56 2 177 56 1 178 56 6 179 56 2 180 56 25 182 56 1 198 56 2 206 56 1 228 56 3 4 57 10 9 57 1 12 57 1 22 57 1 32 57 1 33 57 1 39 57 1 43 57 3 48 57 1 51 57 1 59 57 1 61 57 1 64 57 5 65 57 1 66 57 1 67 57 2 69 57 1 72 57 3 74 57 1 81 57 1 90 57 1 91 57 1 92 57 8 93 57 7 95 57 1 96 57 16 98 57 1 99 57 3 100 57 18 101 57 6 103 57 3 104 57 6 105 57 1 107 57 5 108 57 1 109 57 1 110 57 1 111 57 2 115 57 1 117 57 1 120 57 1 121 57 7 126 57 7 128 57 10 129 57 6 130 57 1 131 57 1 132 57 6 134 57 13 135 57 33 137 57 2 138 57 1 146 57 3 148 57 1 151 57 36 152 57 12 153 57 10 154 57 1 155 57 1 156 57 16 157 57 3 158 57 5 159 57 18 160 57 2 161 57 18 162 57 1 163 57 14 164 57 24 165 57 1 166 57 33 167 57 3 168 57 6 169 57 3 171 57 1 172 57 91 175 57 5 176 57 7 178 57 4 179 57 1 191 57 1 194 57 1 198 57 2 211 57 5 214 57 1 228 57 2 237 57 1 4 58 13 6 58 1 8 58 1 9 58 1 13 58 1 22 58 1 24 58 1 33 58 1 44 58 1 50 58 1 54 58 3 65 58 1 72 58 1 81 58 1 90 58 1 91 58 1 92 58 6 93 58 6 95 58 1 96 58 9 98 58 1 99 58 2 100 58 19 101 58 4 104 58 2 107 58 1 109 58 2 110 58 1 111 58 3 112 58 1 116 58 2 117 58 2 120 58 3 121 58 14 126 58 6 128 58 13 129 58 5 130 58 2 131 58 1 132 58 3 133 58 1 134 58 6 135 58 10 137 58 1 138 58 2 141 58 1 142 58 2 143 58 2 146 58 2 147 58 1 151 58 17 152 58 19 153 58 8 154 58 1 155 58 27 156 58 15 157 58 5 158 58 5 159 58 19 160 58 5 161 58 9 163 58 8 164 58 9 165 58 2 166 58 8 167 58 1 168 58 1 169 58 1 170 58 1 171 58 2 172 58 11 173 58 3 174 58 4 175 58 2 176 58 2 177 58 6 178 58 1 180 58 1 182 58 1 198 58 2 228 58 1 2 59 3 4 59 5 6 59 1 7 59 1 9 59 2 23 59 1 33 59 2 39 59 1 48 59 2 54 59 1 67 59 1 72 59 3 74 59 2 84 59 2 91 59 2 93 59 9 95 59 2 96 59 16 98 59 2 99 59 4 100 59 4 101 59 2 104 59 12 105 59 2 107 59 2 109 59 2 111 59 2 112 59 3 115 59 1 116 59 1 118 59 1 121 59 5 126 59 9 128 59 5 129 59 9 131 59 2 132 59 6 133 59 1 134 59 6 135 59 15 136 59 1 140 59 1 141 59 2 142 59 3 147 59 1 148 59 3 149 59 1 151 59 12 152 59 18 153 59 5 154 59 3 155 59 1 156 59 11 157 59 4 158 59 3 159 59 4 160 59 7 161 59 5 162 59 1 163 59 7 164 59 9 165 59 1 166 59 14 167 59 1 168 59 5 171 59 3 172 59 18 174 59 2 175 59 1 176 59 6 177 59 3 182 59 1 198 59 1 213 59 1 219 59 1 225 59 1 4 60 8 8 60 1 9 60 1 23 60 2 25 60 1 33 60 1 43 60 1 44 60 1 45 60 1 47 60 1 48 60 1 56 60 1 59 60 1 61 60 2 66 60 1 72 60 1 81 60 1 89 60 1 90 60 1 93 60 6 96 60 17 98 60 9 99 60 5 100 60 17 101 60 5 103 60 2 104 60 16 105 60 1 106 60 1 109 60 4 111 60 3 112 60 1 115 60 1 118 60 2 120 60 2 121 60 11 126 60 6 128 60 8 129 60 4 131 60 2 132 60 2 134 60 4 135 60 25 140 60 1 146 60 6 147 60 3 148 60 2 149 60 1 151 60 27 152 60 29 153 60 10 154 60 1 155 60 1 156 60 22 157 60 6 158 60 6 159 60 17 160 60 10 161 60 11 162 60 1 163 60 13 164 60 30 165 60 1 166 60 19 167 60 2 168 60 6 169 60 2 171 60 5 172 60 18 173 60 3 174 60 8 175 60 4 176 60 3 177 60 6 178 60 2 179 60 1 182 60 2 183 60 1 191 60 2 193 60 2 198 60 2 210 60 2 214 60 1 225 60 1 238 60 3 4 61 108 6 61 21 8 61 3 12 61 1 15 61 1 22 61 2 23 61 12 26 61 1 32 61 1 36 61 1 39 61 1 42 61 1 44 61 2 46 61 1 48 61 4 49 61 1 61 61 3 71 61 2 74 61 1 75 61 1 82 61 1 84 61 1 85 61 1 88 61 1 89 61 1 90 61 1 93 61 76 96 61 2 98 61 2 99 61 1 100 61 5 101 61 1 103 61 1 104 61 8 107 61 1 109 61 2 112 61 2 113 61 3 114 61 4 115 61 3 121 61 75 122 61 16 124 61 6 125 61 3 126 61 76 127 61 3 128 61 108 129 61 102 130 61 25 131 61 2 132 61 11 133 61 21 134 61 50 135 61 61 136 61 1 138 61 7 139 61 2 140 61 9 141 61 1 142 61 4 143 61 2 145 61 2 146 61 5 147 61 6 148 61 4 149 61 3 151 61 12 152 61 6 153 61 1 154 61 5 156 61 10 157 61 8 158 61 1 159 61 5 163 61 5 164 61 8 166 61 4 168 61 6 172 61 18 176 61 2 177 61 1 182 61 6 183 61 1 191 61 1 196 61 1 198 61 1 210 61 1 222 61 1 223 61 1 228 61 1 235 61 1 237 61 2 239 61 1 4 62 93 6 62 21 8 62 2 9 62 1 23 62 3 25 62 2 32 62 1 33 62 1 36 62 1 50 62 1 54 62 2 56 62 1 58 62 1 59 62 2 64 62 1 70 62 1 72 62 2 91 62 2 93 62 20 96 62 8 98 62 2 99 62 3 100 62 3 103 62 1 104 62 13 109 62 2 112 62 1 113 62 10 114 62 1 115 62 1 116 62 5 120 62 4 121 62 52 122 62 1 123 62 5 124 62 6 125 62 10 126 62 20 127 62 3 128 62 93 129 62 78 130 62 39 131 62 2 132 62 26 133 62 21 134 62 53 135 62 31 136 62 8 137 62 1 138 62 9 139 62 5 140 62 4 142 62 3 146 62 1 147 62 1 149 62 1 150 62 4 151 62 7 152 62 7 153 62 2 156 62 5 157 62 1 158 62 1 159 62 3 160 62 12 163 62 4 164 62 8 166 62 7 171 62 1 172 62 2 178 62 1 182 62 7 191 62 1 211 62 1 236 62 1 239 62 1 4 63 41 6 63 3 8 63 1 23 63 1 25 63 1 26 63 1 36 63 1 43 63 1 54 63 1 56 63 1 62 63 1 72 63 3 80 63 1 81 63 1 84 63 1 92 63 1 93 63 24 95 63 3 96 63 6 99 63 2 100 63 1 104 63 21 107 63 1 108 63 1 109 63 2 112 63 1 113 63 1 116 63 1 117 63 1 118 63 2 121 63 11 122 63 2 123 63 2 124 63 5 125 63 1 126 63 24 127 63 1 128 63 41 129 63 23 130 63 5 132 63 5 133 63 3 134 63 10 135 63 25 137 63 1 138 63 1 140 63 5 141 63 1 143 63 3 146 63 5 148 63 2 150 63 1 151 63 7 152 63 1 153 63 1 156 63 5 157 63 1 159 63 1 160 63 2 163 63 5 164 63 3 166 63 4 168 63 3 169 63 1 172 63 9 173 63 1 176 63 1 178 63 1 182 63 2 184 63 1 214 63 1 219 63 1 221 63 1 228 63 1 2 64 4 3 64 8 4 64 42 5 64 4 6 64 5 8 64 4 9 64 5 12 64 3 16 64 1 21 64 1 23 64 3 25 64 1 26 64 1 30 64 2 33 64 5 43 64 1 44 64 5 45 64 2 48 64 4 54 64 1 59 64 2 61 64 2 66 64 1 74 64 1 75 64 1 81 64 1 91 64 2 92 64 10 93 64 79 94 64 2 95 64 1 96 64 9 97 64 1 98 64 1 99 64 5 100 64 5 101 64 4 103 64 2 104 64 9 109 64 2 113 64 2 114 64 7 115 64 2 117 64 1 120 64 2 121 64 19 122 64 4 123 64 4 124 64 4 125 64 2 126 64 79 127 64 3 128 64 42 129 64 25 130 64 2 131 64 1 132 64 2 133 64 5 134 64 9 135 64 14 136 64 3 137 64 33 140 64 7 141 64 2 142 64 1 143 64 2 144 64 1 146 64 1 147 64 2 149 64 2 151 64 4 152 64 3 153 64 6 156 64 16 158 64 3 159 64 5 160 64 1 163 64 3 164 64 3 166 64 3 168 64 1 170 64 1 172 64 11 173 64 1 177 64 1 179 64 1 182 64 6 193 64 2 198 64 1 222 64 1 225 64 1 228 64 1 2 65 1 4 65 138 6 65 11 8 65 5 12 65 1 15 65 1 26 65 1 35 65 2 36 65 1 39 65 1 43 65 1 44 65 2 45 65 3 48 65 2 54 65 3 55 65 1 56 65 4 62 65 1 64 65 1 65 65 1 68 65 1 70 65 1 71 65 1 72 65 1 74 65 1 75 65 2 84 65 1 87 65 1 90 65 1 91 65 1 93 65 53 94 65 2 95 65 2 96 65 11 98 65 1 99 65 14 101 65 2 104 65 20 108 65 2 111 65 1 112 65 3 113 65 3 114 65 7 115 65 2 116 65 6 118 65 1 120 65 6 121 65 54 122 65 8 123 65 2 124 65 6 125 65 3 126 65 53 128 65 138 129 65 69 130 65 16 131 65 1 132 65 31 133 65 11 134 65 68 135 65 58 136 65 1 138 65 6 139 65 3 140 65 2 141 65 1 143 65 3 144 65 1 146 65 22 147 65 5 148 65 1 149 65 64 150 65 1 151 65 8 152 65 11 153 65 6 154 65 2 156 65 2 160 65 3 163 65 11 164 65 13 166 65 2 168 65 1 171 65 1 172 65 12 174 65 1 176 65 2 177 65 2 179 65 1 182 65 24 183 65 1 191 65 1 194 65 2 198 65 3 211 65 1 217 65 1 221 65 1 225 65 3 228 65 1 231 65 1 233 65 1 236 65 2 237 65 4 4 66 77 6 66 11 8 66 2 22 66 1 23 66 1 32 66 1 35 66 1 43 66 1 44 66 2 45 66 1 48 66 4 51 66 1 59 66 1 64 66 3 66 66 1 67 66 1 68 66 1 70 66 1 72 66 3 75 66 2 82 66 1 90 66 4 91 66 9 92 66 41 93 66 53 94 66 1 95 66 4 96 66 14 97 66 1 98 66 6 99 66 11 100 66 3 101 66 5 103 66 2 104 66 10 105 66 2 108 66 1 111 66 2 112 66 1 113 66 4 115 66 3 116 66 2 117 66 1 120 66 2 121 66 23 122 66 5 123 66 3 124 66 5 125 66 4 126 66 53 127 66 1 128 66 77 129 66 24 130 66 6 131 66 1 132 66 21 133 66 11 134 66 36 135 66 112 136 66 2 138 66 1 139 66 3 140 66 5 142 66 1 143 66 1 146 66 10 147 66 4 148 66 39 149 66 2 151 66 10 152 66 7 153 66 4 154 66 5 156 66 3 158 66 1 159 66 3 160 66 4 163 66 9 164 66 8 165 66 1 166 66 2 167 66 2 168 66 3 171 66 1 172 66 11 173 66 1 174 66 1 177 66 1 179 66 1 182 66 16 183 66 2 186 66 2 198 66 1 211 66 3 217 66 1 225 66 2 228 66 2 231 66 1 233 66 1 236 66 1 237 66 2 4 67 76 6 67 10 8 67 1 15 67 1 23 67 2 39 67 1 48 67 1 54 67 1 56 67 2 61 67 1 72 67 2 81 67 2 82 67 1 89 67 1 91 67 1 92 67 11 93 67 87 94 67 1 95 67 6 96 67 10 98 67 1 99 67 3 100 67 6 101 67 10 103 67 2 104 67 23 105 67 1 107 67 1 109 67 3 112 67 1 113 67 4 114 67 2 115 67 3 116 67 7 120 67 5 121 67 45 122 67 8 123 67 6 124 67 6 125 67 4 126 67 87 127 67 3 128 67 76 129 67 43 130 67 11 131 67 6 132 67 21 133 67 10 134 67 49 135 67 37 136 67 3 138 67 4 140 67 12 141 67 1 142 67 38 143 67 2 144 67 21 146 67 9 147 67 8 148 67 1 149 67 3 151 67 4 152 67 9 153 67 4 154 67 4 155 67 2 156 67 16 157 67 1 159 67 6 160 67 4 161 67 1 163 67 9 164 67 7 167 67 1 168 67 3 172 67 7 178 67 1 179 67 1 182 67 28 183 67 1 193 67 1 194 67 1 198 67 3 222 67 2 228 67 4 235 67 1 236 67 1 237 67 1 238 67 1 1 68 1 4 68 15 6 68 1 8 68 1 32 68 1 36 68 1 43 68 1 44 68 1 54 68 5 64 68 1 74 68 1 90 68 1 91 68 23 92 68 32 93 68 76 94 68 1 95 68 1 96 68 10 98 68 3 99 68 4 100 68 2 101 68 6 103 68 1 104 68 5 108 68 1 109 68 1 110 68 1 112 68 1 113 68 1 114 68 1 115 68 1 116 68 2 117 68 1 120 68 1 121 68 10 122 68 4 123 68 4 124 68 5 125 68 1 126 68 76 128 68 15 129 68 8 130 68 3 131 68 3 132 68 2 133 68 1 134 68 3 135 68 18 136 68 6 138 68 1 140 68 7 141 68 1 145 68 1 146 68 1 147 68 2 148 68 3 149 68 1 150 68 1 151 68 2 152 68 4 153 68 2 155 68 2 156 68 3 157 68 1 159 68 2 163 68 4 164 68 5 166 68 1 172 68 5 173 68 1 177 68 1 178 68 1 182 68 3 198 68 1 202 68 1 211 68 1 228 68 1 239 68 1 3 69 1 4 69 19 6 69 2 8 69 1 9 69 1 26 69 1 27 69 1 33 69 1 44 69 2 54 69 13 59 69 1 62 69 1 72 69 4 91 69 4 92 69 17 93 69 42 96 69 6 97 69 1 98 69 2 99 69 8 101 69 4 104 69 28 112 69 1 113 69 3 114 69 2 115 69 4 116 69 2 121 69 23 122 69 7 123 69 2 124 69 3 125 69 3 126 69 42 127 69 1 128 69 19 129 69 10 130 69 4 131 69 5 132 69 3 133 69 2 134 69 9 135 69 29 136 69 1 137 69 1 140 69 10 141 69 3 143 69 1 144 69 1 145 69 32 146 69 3 147 69 4 148 69 5 149 69 1 151 69 6 152 69 1 153 69 2 154 69 1 155 69 1 156 69 4 157 69 1 161 69 1 163 69 5 164 69 8 166 69 6 167 69 1 168 69 1 169 69 1 171 69 1 172 69 4 173 69 1 179 69 1 180 69 1 182 69 6 183 69 1 198 69 1 221 69 1 225 69 1 233 69 1 237 69 3 4 70 104 6 70 11 8 70 5 9 70 4 12 70 1 23 70 2 31 70 1 32 70 1 33 70 4 39 70 2 48 70 1 49 70 1 54 70 2 57 70 1 63 70 1 64 70 1 68 70 1 72 70 2 77 70 1 78 70 1 80 70 2 90 70 2 93 70 114 96 70 7 97 70 1 98 70 4 99 70 4 100 70 3 101 70 2 104 70 13 109 70 2 112 70 1 113 70 6 115 70 3 121 70 37 123 70 1 124 70 5 125 70 6 126 70 114 127 70 2 128 70 104 129 70 50 130 70 9 131 70 1 132 70 10 133 70 11 134 70 26 135 70 125 137 70 3 138 70 5 139 70 1 140 70 18 141 70 43 142 70 1 143 70 8 146 70 3 147 70 5 148 70 1 149 70 1 151 70 6 152 70 4 153 70 7 154 70 3 155 70 2 156 70 5 157 70 2 158 70 1 159 70 3 160 70 1 163 70 2 164 70 3 165 70 2 166 70 4 168 70 4 169 70 1 171 70 4 172 70 25 173 70 1 174 70 1 177 70 1 178 70 2 182 70 3 183 70 1 185 70 1 193 70 1 198 70 2 211 70 1 214 70 1 215 70 1 217 70 1 231 70 1 237 70 1 4 71 1 44 71 1 70 71 8 92 71 3 93 71 3 100 71 1 126 71 3 128 71 1 129 71 1 135 71 5 143 71 1 156 71 3 159 71 1 172 71 1 181 71 43 182 71 18 183 71 4 184 71 14 185 71 11 186 71 1 187 71 8 188 71 6 189 71 14 190 71 5 191 71 8 192 71 1 193 71 2 194 71 3 195 71 6 196 71 3 197 71 4 198 71 2 199 71 3 200 71 4 201 71 4 202 71 3 203 71 5 204 71 4 206 71 5 207 71 2 208 71 1 70 72 5 91 72 1 93 72 1 126 72 1 135 72 1 147 72 1 156 72 4 172 72 2 181 72 41 182 72 8 183 72 4 184 72 11 185 72 3 186 72 5 187 72 3 188 72 5 189 72 5 190 72 3 191 72 2 192 72 3 193 72 5 195 72 4 196 72 3 197 72 3 200 72 1 201 72 1 202 72 1 203 72 1 206 72 4 210 72 41 9 73 1 33 73 1 67 73 1 70 73 4 84 73 1 93 73 1 126 73 1 136 73 1 142 73 1 153 73 1 156 73 2 181 73 36 182 73 12 183 73 2 184 73 14 185 73 13 186 73 3 187 73 2 188 73 9 189 73 8 190 73 5 192 73 3 193 73 4 194 73 1 195 73 4 196 73 2 197 73 5 198 73 1 199 73 2 200 73 2 202 73 4 203 73 4 204 73 3 205 73 3 206 73 1 207 73 4 208 73 1 209 73 6 236 73 1 70 74 10 88 74 1 153 74 1 156 74 6 164 74 1 172 74 3 181 74 55 182 74 18 183 74 2 184 74 18 185 74 8 186 74 3 187 74 2 188 74 10 189 74 11 190 74 5 191 74 12 192 74 2 193 74 4 194 74 2 195 74 3 196 74 3 197 74 2 198 74 2 199 74 7 201 74 4 202 74 1 203 74 2 204 74 4 205 74 1 206 74 4 209 74 1 235 74 2 4 75 2 70 75 11 93 75 1 103 75 1 104 75 1 126 75 1 128 75 2 135 75 5 140 75 1 152 75 1 153 75 1 156 75 3 166 75 1 174 75 1 181 75 58 182 75 18 183 75 2 184 75 23 185 75 8 186 75 2 187 75 3 188 75 7 189 75 15 190 75 2 191 75 8 192 75 3 193 75 1 194 75 1 195 75 4 196 75 2 197 75 14 198 75 1 199 75 4 200 75 2 201 75 2 202 75 3 203 75 4 204 75 8 205 75 1 210 75 2 219 75 1 4 76 1 25 76 1 27 76 1 36 76 1 44 76 1 70 76 30 91 76 1 101 76 2 108 76 1 116 76 1 128 76 1 135 76 1 142 76 2 156 76 17 166 76 1 172 76 2 181 76 54 182 76 28 183 76 15 184 76 62 185 76 29 186 76 7 187 76 9 188 76 23 189 76 6 190 76 42 191 76 7 192 76 11 193 76 6 194 76 14 195 76 3 196 76 9 197 76 32 198 76 10 200 76 3 201 76 6 202 76 8 203 76 1 204 76 1 205 76 2 207 76 20 208 76 25 209 76 26 210 76 1 224 76 1 228 76 1 236 76 1 238 76 1 4 77 1 70 77 8 128 77 1 135 77 3 156 77 3 172 77 3 181 77 66 182 77 11 183 77 2 184 77 9 185 77 3 186 77 3 187 77 3 188 77 12 189 77 4 190 77 2 191 77 3 192 77 6 194 77 2 195 77 4 197 77 2 198 77 37 199 77 1 200 77 1 201 77 2 203 77 4 204 77 2 205 77 1 206 77 1 207 77 2 209 77 1 45 78 1 70 78 5 156 78 6 164 78 1 174 78 1 176 78 1 181 78 34 182 78 13 183 78 1 184 78 14 185 78 6 186 78 1 187 78 3 188 78 6 189 78 3 190 78 1 191 78 2 192 78 5 193 78 4 195 78 20 199 78 3 200 78 2 201 78 2 202 78 13 203 78 1 205 78 2 207 78 2 208 78 3 210 78 1 4 79 2 49 79 1 70 79 9 128 79 2 156 79 4 172 79 4 174 79 1 181 79 30 182 79 16 183 79 3 184 79 6 185 79 5 186 79 1 187 79 4 188 79 11 189 79 5 190 79 2 191 79 6 192 79 3 194 79 4 195 79 5 196 79 1 197 79 8 198 79 2 199 79 5 200 79 4 202 79 2 205 79 3 207 79 1 208 79 1 210 79 1 4 80 7 6 80 1 13 80 1 26 80 1 43 80 1 44 80 1 45 80 1 60 80 1 65 80 1 70 80 2 91 80 2 92 80 7 93 80 22 96 80 14 98 80 6 99 80 2 100 80 3 101 80 3 103 80 1 104 80 10 111 80 3 112 80 1 113 80 3 114 80 1 115 80 2 116 80 1 117 80 1 120 80 4 121 80 5 123 80 1 124 80 1 125 80 3 126 80 22 128 80 7 129 80 5 132 80 1 133 80 1 134 80 4 135 80 16 136 80 5 140 80 4 141 80 3 142 80 2 146 80 4 148 80 1 151 80 7 152 80 5 153 80 1 154 80 1 155 80 1 156 80 3 158 80 2 159 80 3 160 80 1 163 80 1 164 80 4 166 80 1 168 80 1 171 80 1 172 80 7 174 80 1 178 80 1 179 80 1 181 80 6 182 80 9 183 80 2 185 80 2 186 80 2 187 80 2 188 80 1 189 80 2 190 80 1 193 80 1 194 80 1 198 80 3 199 80 2 204 80 1 208 80 1 209 80 1 210 80 1 231 80 1 Seurat/MD50000644000176200001440000004620015117462442012035 0ustar liggesusers3dea8ac5ece047dc4261c5c1bd559732 *DESCRIPTION c2ef7c6f9278eb1816e1c98c41ea726b *LICENSE 4798a09d6f5b8cc9099076f6c10509c9 *NAMESPACE 96e5397dabc634ee63e3416999d1b006 *NEWS.md 2dc8d94314ead6f77537d1fe0fc272bc *R/RcppExports.R feec04c3097a68090b3fbeb6490a8631 *R/clustering.R 062e59aa91205edb6ca15231586bdd71 *R/convenience.R 55bbe147c86b593b947677f8dda65cbf *R/data.R 02f485be2ff80937e2adf67e5fb64ddc *R/differential_expression.R bcc25b883d8ebee8ee071183d5ca279a *R/dimensional_reduction.R e68d382c468c8281e46b148a7597e40c *R/generics.R 276f7aab08a5e8bb1084dac63a61d0d5 *R/integration.R 0c3fa9431a5345409242b61d85f153ab *R/integration5.R d8c58d75b284291cde543253790b9a26 *R/mixscape.R a4d80dc1d7afbd55dc3f47f80a9d4a69 *R/objects.R c8b91882f498deff9de78a36fe23d23a *R/preprocessing.R 1cd4dbfe1b8d4a4fb5517c9e00f03720 *R/preprocessing5.R 64823909fe4edb0b99ac631a15740dd5 *R/reexports.R 1e0677c7f50b69a8ad847506a648c92a *R/roxygen.R 7c2308e234a2674302bef657b70f0d2f *R/sketching.R 2f3eab7c0723d8777ead1b6e5858b6f8 *R/tree.R 1a0dc6731165d9c9f275324f9429d5fd *R/utilities.R fdaedc86064f50a5ae15402d39a3fbe4 *R/visualization.R 4d96c6883317c3166df96ae60e15ca9c *R/zzz.R b4eb3b6ec42eaae70de18d2591d39309 *README.md ad8376533cf010e30bfa98e076f2ccb7 *build/Seurat.pdf 06ab5528a1a732d6ea44d55d9fb4b106 *build/stage23.rdb e84661f995a9f29d1a09ebcdc27d3a82 *data/cc.genes.rda 55d7e35793436d5e91646d774d9f86c4 *data/cc.genes.updated.2019.rda fb89a5cc1f14ad979196d34e85b6f11f *inst/CITATION d07fe4eee5c09cc44e96c17e683cb10e *inst/extdata/pbmc_raw.txt 6e5c9a9138e4310b9b33bcad55c577dd *man/AddAzimuthResults.Rd f18c489b5a66400bcf43793a921cfc91 *man/AddAzimuthScores.Rd 58af0963e5081b520829f61e65f110e4 *man/AddModuleScore.Rd 48b523dc136d6dd1676c4147cee2d0fd *man/AggregateExpression.Rd c7c2526a6664941b2d78b8b75944cb0c *man/AnchorSet-class.Rd 07c839ccf3fffc7a95d5035d3e294d11 *man/AnnotateAnchors.Rd 52233895af88c8e1697dd981c73667fe *man/Assay-class.Rd 66351cc0e0184ccc08cd3ec15b070079 *man/AugmentPlot.Rd d40f4485b82201107f8fcc38465cdc63 *man/AutoPointSize.Rd e5aad845e1519f9ac5bff2171f7d1d37 *man/AverageExpression.Rd 6d0a647c45a8644742532a34e84cd28d *man/BGTextColor.Rd 7c84e2390af0071f75b8d66ebefe06d0 *man/BarcodeInflectionsPlot.Rd d3f89f8ad58e4eca215e33bd084e9f54 *man/BridgeCellsRepresentation.Rd a9d8f8eb55ba2cd2f47363b1e299da0d *man/BridgeReferenceSet-class.Rd 4a1f3a9759254be52773278fdeed71a6 *man/BuildClusterTree.Rd fb9f1dbd05c7e783bd9f7d5ab3a42de9 *man/BuildNicheAssay.Rd 4701772b9d7fa2d8d6e1d4353029e9b9 *man/CCAIntegration.Rd 61123dad772d46f5e62e9ccd1e43d6de *man/CalcDispersion.Rd 33f13558c1c1be298a623aca4b19504b *man/CalcPerturbSig.Rd b760f432b53c9d0d33a39d1ea0e0320a *man/CalculateBarcodeInflections.Rd 3550bef6cb5f40f4540f5dc70e80598d *man/CaseMatch.Rd b9abf47109862ea85c36ec6c511ac787 *man/CellCycleScoring.Rd 3aec17d0cae2627d1450ff2ea9732957 *man/CellScatter.Rd 9da9ef92375a1ad85e84fc0037a48784 *man/CellSelector.Rd ac4f0d73efb473049e346eec12d1efe6 *man/Cells.Rd b69d54dd6c77c9efcf83830aef8a0423 *man/CellsByImage.Rd 5600133820f9f0343d5edcff87c533c9 *man/CollapseEmbeddingOutliers.Rd 27a6b0d8531b5c59861ebca821ded6e9 *man/CollapseSpeciesExpressionMatrix.Rd 7544bd81e0614a52e58bf04b1d236f91 *man/ColorDimSplit.Rd 9eeec370a2aad6836e8b9027d654812a *man/CombinePlots.Rd bacad93f3b0331b61765356a0666bda1 *man/CountSketch.Rd 37d43700f94e05d8266fede6df05a1c3 *man/CreateCategoryMatrix.Rd c534f9d624c27c9e4af6ea54e026dfab *man/CreateSCTAssayObject.Rd f968f04db1e0bb575af930242cb1df92 *man/CustomDistance.Rd 8ab923c6ef1bb0a548e140f45bf97ed5 *man/CustomPalette.Rd 9b67340cc5e93ee7b5d91854318812c5 *man/DEenrichRPlot.Rd 37d6cf4959bb8244720283cb8ce0041c *man/DISP.Rd ef9edd0671f22ca5ae5f67ed063cdc05 *man/DietSeurat.Rd d9cb5fcbd90eea8518965240e031c80a *man/DimHeatmap.Rd e1b56e04f63caa13e10c587b26a8c214 *man/DimPlot.Rd 6e505cdb81626e425958657f99813304 *man/DimReduc-class.Rd 66090a5a18ad242bb22df22a9e6e5c11 *man/DiscretePalette.Rd 5d03d4926234e9a2850913e65c9467df *man/DoHeatmap.Rd 684b1193880b1242c0e95ae7a71a517f *man/DotPlot.Rd 93448d7ad049632784186f00f0e825b8 *man/ElbowPlot.Rd 152070beaee889ad0c57d824c6b890b7 *man/ExpMean.Rd 8e2d2db070c229523b03d9841df4b089 *man/ExpSD.Rd 497e0fc0845d50baae3cff33fc98f9c7 *man/ExpVar.Rd 5e07a914df88487050ccbcddae08a583 *man/FastRPCAIntegration.Rd 8b154c79dcd203853c3984baf37684c4 *man/FastRowScale.Rd cc81cdafe35eff72b54b0553fa73ea6a *man/FeaturePlot.Rd e51e95312c85f753680da91578312ca0 *man/FeatureScatter.Rd 07edd5bde3e669e80c8068fe7678ba9c *man/FetchResidualSCTModel.Rd c435659d66095b6821b142805b82b34f *man/FetchResiduals.Rd 51fd971521a57b3f55e92e59777ac5fc *man/FetchResiduals_reference.Rd 8baf10ef47e718c9fc4aef521df50b64 *man/FilterSlideSeq.Rd 95b918a5458d3f214dc0e6895da61493 *man/FindAllMarkers.Rd acdecd02ba45c7fb086f66ee98909043 *man/FindBridgeAnchor.Rd 3057ce351332b8e0561af8e4baf8149e *man/FindBridgeIntegrationAnchors.Rd 479320971531d4745622df8a61536b72 *man/FindBridgeTransferAnchors.Rd 267cc362ad7179c424a9c8ca34e19c09 *man/FindClusters.Rd c40fde8064238cd34ea6fa773ed7ccf4 *man/FindConservedMarkers.Rd 419942228ca9f888ba141f0c4594e2f0 *man/FindIntegrationAnchors.Rd d1252b2ad3252d295391d1da545d6da4 *man/FindMarkers.Rd 21881fce274bec77239e6df4ffe53f1b *man/FindMultiModalNeighbors.Rd 11eff7618184ecbea4372bb25b0bc932 *man/FindNeighbors.Rd 7b68529090d3464a67b0e02fc574751a *man/FindSpatiallyVariableFeatures.Rd 62c13da804f1993d910c8a9f6f914c9c *man/FindSubCluster.Rd 1a806724c802144aa72a309a483fc12e *man/FindTransferAnchors.Rd 3e7b26503a7d83ca0b2f4f06a165d7fe *man/FindVariableFeatures.Rd 497bfbcf879355d83a84b6db7708f325 *man/FoldChange.Rd 41a67fe0f33e17120d39479e7383a432 *man/Format10X_GeoJson_CellID.Rd 1e4769fd88901ef7efdede58f3fff32d *man/GaussianSketch.Rd b666afaab9ed8ac708a81e141ec4683b *man/GetAssay.Rd c58b07efc50b282829f73857bda22145 *man/GetImage.Rd 55c7a101f7dffe9d50f12da10aff9b2e *man/GetIntegrationData.Rd 66e88036c1539122d770234caff96198 *man/GetResidual.Rd 447c1f96ee5effaff565da6e9089c5b1 *man/GetTissueCoordinates.Rd 35761ade67ea12a72c813f24130029fd *man/GetTransferPredictions.Rd c4adc0a85fc90e4e43d074460a06648c *man/Graph-class.Rd a8befbd8423c290c19261556acd8ff08 *man/GroupCorrelation.Rd 885bb61fa2d0a622b047dd56fa254a91 *man/GroupCorrelationPlot.Rd 4fe184e4b4c0eb3f87bef21123e29fe2 *man/HTODemux.Rd 72111f313e6e7fd80db16c58aeef7794 *man/HTOHeatmap.Rd a06211e14b256631fd037636964abd09 *man/HVFInfo.SCTAssay.Rd 400b2f7ea5aa4dc29ec8a9d407d7214b *man/HarmonyIntegration.Rd ed1b839f07cf7f7ae24be300628ac47c *man/HoverLocator.Rd f7f6b58d2fc988ab8530ee9742f84b6f *man/IFeaturePlot.Rd 245660405f21e9f08cf87a0fc268f9f1 *man/ISpatialDimPlot.Rd 06b2116bebfabe1863bdfedeac25889a *man/ISpatialFeaturePlot.Rd 40d9e6bedb735b6ad3b4cd14d565bcfc *man/ImageDimPlot.Rd bf56b569fdf5a968ea05db10cd3e6bf1 *man/ImageFeaturePlot.Rd cd0058a57302e32d5f02fb3587fcbbad *man/IntegrateData.Rd 7d1e03b3e2308dce80cdfc732467839d *man/IntegrateEmbeddings.Rd 1c073484f3d7a96092704885f8b7c337 *man/IntegrateLayers.Rd 4ee5eb07563971a104e4cbab9e3d5919 *man/IntegrationAnchorSet-class.Rd d69da6ee725f4978305025b6de6df811 *man/IntegrationData-class.Rd 71084359014aa8d4fcb9d2beb9bc3996 *man/InteractiveSpatialPlot.Rd afb332ec2e1c9534fe930e55f52a62d6 *man/JackStraw.Rd 19f4c49e6346b73f981cc2878d0cf8a0 *man/JackStrawData-class.Rd 2e3257c67d4b09ef94eb2052b532c42f *man/JackStrawPlot.Rd f014b591290fcd228bcc5a4795a0b5bf *man/JointPCAIntegration.Rd 3fe0920d29478f95724b9f0206055b25 *man/L2CCA.Rd 86eeddaaa3e6f0e51059523a23f627a3 *man/L2Dim.Rd 40c09a3566db9e1528716be9317cf882 *man/LabelClusters.Rd c7876bf181dd49fbfe1d6490c4fc5b0f *man/LabelPoints.Rd ed8fd3e74d955318e925863c34289e6d *man/LeverageScore.Rd b2cfce1bc6ee8e280747545dc7edd4bc *man/LinkedPlots.Rd 71471fc71df11e96628ba8d52acc11ac *man/Load10X_Spatial.Rd 9250526a506c24545de8856006893c67 *man/LoadAnnoyIndex.Rd 5e8bff4d2743728091f64aa30461c1d2 *man/LoadCurioSeeker.Rd af949a6114516b3ab62bb2f4b53a0e34 *man/LoadSTARmap.Rd 95af3201e2ef04e32b9d0ffd3f0feb85 *man/LocalStruct.Rd 2199b13323996da83ac09c496d2663c7 *man/LogNormalize.Rd 39eac70a16e242177b7840ae51d2071d *man/LogVMR.Rd 1c1bdbcee8586463d19692649d8e379e *man/MULTIseqDemux.Rd ce90d9d73f17ae6f81dc95d1268d0643 *man/MVP.Rd dd438d9a34737502d9a84c3abe14c423 *man/MapQuery.Rd 1ed6848f442b000f162577967509cba9 *man/MappingScore.Rd 1b9c655f92a327b11582498272a88d1a *man/MetaFeature.Rd 3c9c2bbec11d6e88c372d87d08d2dbd9 *man/MinMax.Rd 90a4c3d5498f3ccf368e0825c755134f *man/MixingMetric.Rd 2e941833263c5ad991bd52277eeae915 *man/MixscapeHeatmap.Rd 2a3cff7805169dad570c396cfc3aa27e *man/MixscapeLDA.Rd 8f87e82e16bc30af62cd4fd1df7d39e0 *man/ModalityWeights-class.Rd 9f02beb76ddcc55da09b8d379e3927c7 *man/NNPlot.Rd a122663331400363d32c08e6fa8966ac *man/NNtoGraph.Rd efabeb1b41ce7efcf7be4662c3bd0b99 *man/Neighbor-class.Rd 85eeac1a67419c8575bdc55bfe52b498 *man/NormalizeData.Rd c3d6d895a2930a0c7d2ce6346a07a84f *man/PCASigGenes.Rd fe0087f1c4031926afee79c4a6e6a0d9 *man/PercentAbove.Rd 41b1017edf7a418ba6e5a3e806a60f37 *man/PercentageFeatureSet.Rd a9cd2601cb56b434cfdf53c0334124eb *man/PlotClusterTree.Rd 9133ec5810b07a6e4336db5eda6463ba *man/PlotPerturbScore.Rd 60eef96f3631b33a83817398d092b40f *man/PolyDimPlot.Rd c0cb6074ed23a579c3d0839f95a1c85f *man/PolyFeaturePlot.Rd 680ad8e1c1fd03b8c1c95b09d1d3e2b8 *man/PredictAssay.Rd 863adfeb427b293aa46f16c88619c44b *man/PrepLDA.Rd fcf5bfeea3b9649160d2d98fdca56d85 *man/PrepSCTFindMarkers.Rd 0882d2985bf5f8b61052b3d11c7845d5 *man/PrepSCTIntegration.Rd bb637251aefe1cfd5ba5b454d785d26f *man/PrepareBridgeReference.Rd 054cbc9c1f39942e5f05539f586b442a *man/ProjectCellEmbeddings.Rd 5025d48c65f3df298ce8e572c0576586 *man/ProjectData.Rd 1d0938398a47900183cd49d7203f73c1 *man/ProjectDim.Rd ddd5a2e0375e35c76e4753b7315de25f *man/ProjectDimReduc.Rd 43a43097e05f8a858631eff31b46b308 *man/ProjectIntegration.Rd e030ec03f24899c203327c87662904d2 *man/ProjectUMAP.Rd f354fc0514f3ccfad1cd89a908d25c24 *man/PseudobulkExpression.Rd dd05bd259974221a406480428424035d *man/RPCAIntegration.Rd 7b681d97d1154e8e8cee001ce1cbeccd *man/Radius.Rd 39cd8326812aa77d6afefdb44020eb99 *man/Read10X.Rd 09b09eaa6f6cc0f3484943409e771458 *man/Read10X_Coordinates.Rd 849737248745f26b5c4738f102ec17f8 *man/Read10X_HD_GeoJson.Rd b9f317389a75ca0c5e2e97b4b1df508d *man/Read10X_Image.Rd 394219a27312ba45db01aeac42affad5 *man/Read10X_ScaleFactors.Rd a9cb171412dc9a288dd5176b185eed89 *man/Read10X_Segmentations.Rd 265cea6403e2bbdc809197a2622cfd07 *man/Read10X_h5.Rd 1f1872a17343dde7503b61fb6dfcca29 *man/Read10X_probe_metadata.Rd 7c6d72bd2606c4f86119f20cfb815308 *man/ReadAkoya.Rd 5762e9f4a7845230cd51bc15ed3b566a *man/ReadMtx.Rd 1831964cc27981d8cb0aec88a79ce13d *man/ReadNanostring.Rd 66132a3df08e866a8cf5b3ca6dfde0b1 *man/ReadParseBio.Rd f1ad11d0fca856124de5a51b74030208 *man/ReadSTARsolo.Rd d1890cac6fdd515b30b1d531860a91cc *man/ReadSlideSeq.Rd 5d289b2c9db248a4b9645923d49a2937 *man/ReadVitessce.Rd 91752a9652775645cb435a7974ff6eab *man/ReadVizgen.Rd 78aabcd2d008c147ab98482b2841a20d *man/ReadXenium.Rd 1c547a95ca73f0797b3e5f5d1eedc121 *man/RegroupIdents.Rd 6b79dfaedf538506e893999f5883b60f *man/RelativeCounts.Rd a646d1b292f533da84baa95481c60e07 *man/RenameCells.Rd 8da502d67406e0764ece573bac13d4c1 *man/RidgePlot.Rd a16944fe961d7a83223e2b6d0f545ace *man/RunCCA.Rd f44a0003476d96e76ddc024e9b45d92e *man/RunGraphLaplacian.Rd c0a21072ffe54ca38f9845b3371995b1 *man/RunICA.Rd dd27a4ffc07fc03a6cfb15314a83bfb9 *man/RunLDA.Rd fcc393194935022ef945b6d33af880af *man/RunLeiden.Rd 2cc88e408cf01a584c6ce9cbcc624eb5 *man/RunMarkVario.Rd d13af12c16f6994b7cfbe5162cac3520 *man/RunMixscape.Rd d4f90f5829c8313f3993d969b0dd4fd3 *man/RunMoransI.Rd 73c91ebf79ada8153c5f7358245d5aa3 *man/RunPCA.Rd dd2cefb6fd4e3f6ea986c78c93ef6394 *man/RunSLSI.Rd 0f18a7e8a15d996d74b0b33c55bd0980 *man/RunSPCA.Rd 37ce5f6f467602c4a96801a1c87bb64e *man/RunTSNE.Rd 5be674ed2e7bbcab2afa99591a1dac02 *man/RunUMAP.Rd ef9507637bb6cfbf79532658a15b5ded *man/SCTAssay-class.Rd 2d3d4cb04473bbca3bc30cf424121383 *man/SCTResults.Rd e0fc72d562fce5be3c58852c34d9ba91 *man/SCTransform.Rd 0d280670c42fa9f59e98c7c7c3506fb7 *man/STARmap-class.Rd 469b1cb6a408643be169d9cd7fcee72e *man/SampleUMI.Rd f693b40dd329878965a9fde4d8f715da *man/SaveAnnoyIndex.Rd 836946b268469e87061ac24443e98514 *man/ScaleData.Rd e3b7a17297a4ad75815d6e4352d84668 *man/ScaleFactors.Rd 6a5a8f3d33c62a3302c03ddd7ae9aa1a *man/ScoreJackStraw.Rd 6a5621426e2d0a21126d7db9a6b71730 *man/SelectIntegrationFeatures.Rd 52c3b86087f1060248e80a594a5f5617 *man/SelectIntegrationFeatures5.Rd e0a6c38a913e13e4970c7c164ccb7e22 *man/SelectSCTIntegrationFeatures.Rd b9d1869d6d91a923a32b44a53ded7928 *man/SetIntegrationData.Rd 36ac188e2049ee2afd46f86d72a519db *man/SetQuantile.Rd 303755316142cecedbbb571101e68308 *man/Seurat-class.Rd 7b1869c6866989fa6b0fc2786cec2179 *man/Seurat-package.Rd 25019aff00c3dba933466df65a45aaa7 *man/SeuratCommand-class.Rd c75bfcb240a635f5d043b11ff2ba4945 *man/SeuratTheme.Rd e35dd5cfbea354439a7473e47fdeb249 *man/SingleCorPlot.Rd 29bdd5bb6c41a9b01f373fdd41f6d772 *man/SingleDimPlot.Rd 0c911aed67cd115db68f1929abeed7c5 *man/SingleExIPlot.Rd 66ac79ddf7b86556f61db2a84af6ab52 *man/SingleImageMap.Rd dad89dff350e297d95f9128dd2739645 *man/SingleImagePlot.Rd f7634526d44a43bb62510bbbdd583797 *man/SingleRasterMap.Rd dbc6766525ed40a6b8ce08943dbc1804 *man/SingleSpatialPlot.Rd b5e401adf45e86d85828ae64682cb546 *man/SketchData.Rd 63e9ab377b0aff03d7623d0aef3b57a7 *man/SlideSeq-class.Rd 2cf1ea98315c627fdb61cebb8f833dc2 *man/SpatialImage-class.Rd b611199e772f0e32ef305f7dc2ed5f82 *man/SpatialPlot.Rd 693a850d4184b4e4ff54f1be3def8789 *man/SplitObject.Rd d78c8fa1d9543389a777500aae7f4633 *man/SubsetByBarcodeInflections.Rd 01f9df5bf0a798d91c7ced43f6d56052 *man/TopCells.Rd 98af7163f68d50deaf0a5247ce59e3d8 *man/TopFeatures.Rd c3a76377a0901f107b57f74555ec5800 *man/TopNeighbors.Rd 8ad4830f4b6516cc43e67c068450f52f *man/TransferAnchorSet-class.Rd 89a7a5eccc8311a00f36db28689faf94 *man/TransferData.Rd bab02c58b20b35d82cb881d6b11ae83b *man/TransferSketchLabels.Rd aef77da39c1d23b5a4ec7ab2cc242e3e *man/UnSketchEmbeddings.Rd e217e168b9ad9c8fa569d039f2c7560b *man/UpdateSCTAssays.Rd 93c5b0322467bbbf7d21fde062ffb97f *man/UpdateSymbolList.Rd 43aecf42dc587407071dd24fc6ffe21c *man/VST.Rd 89b553d2c34a6f93573ec8586df7ecf2 *man/VariableFeaturePlot.Rd 78cac046284771a0c0bc42e2e7b28a71 *man/VisiumV1-class.Rd 1d14ba9357df9b2248127324263c8a3c *man/VisiumV2-class.Rd 84589eec66838181a13f4c26d850c6da *man/VizDimLoadings.Rd 99d11aa2341424c5377971f618f49728 *man/VlnPlot.Rd 4c05321384fe1f6619592fa1eaf1f228 *man/as.CellDataSet.Rd 03a3609f7132baaa37f738f6eacdb26b *man/as.Seurat.Rd 683d625a693896729e469f149c286fd7 *man/as.SingleCellExperiment.Rd f853c089d07c84e3f320d41951bd37b6 *man/as.sparse.Rd ff15a3ab67d91214bb1547466ab90869 *man/cc.genes.Rd 00ef5ac77ad830720810aa97270d772b *man/cc.genes.updated.2019.Rd d843eff800711487e12a102038e5e7d4 *man/contrast-theory.Rd d33c2ae968af1bc5e97491bbc4afd9b4 *man/fortify-Spatial.Rd 5ac13a66d32c56c822f9a83c0c85a2b8 *man/merge.SCTAssay.Rd 89081dae347cc3c901be6d84a787a54a *man/reexports.Rd 24034598a79b8f1461b1647f2ce82b3b *man/roxygen/templates/note-reqdpkg.R 47d96c85155d705c5782b78087dafe8e *man/roxygen/templates/param-dotsi.R ef420f43ac9d0dfa1267c2c79c8cd5fe *man/roxygen/templates/param-dotsm.R 84d7260dd254c3dbeff57c77049aa163 *man/roxygen/templates/section-future.R 63706c0d94ca152a0f9c6c88cd5c5da6 *man/roxygen/templates/section-progressr.R c734e303b87cac72c78065f539f8c63c *man/roxygen/templates/seealso-methods.R 660b46a409867f33a33a2c74cd70aba3 *man/subset.AnchorSet.Rd 627f40da0df56c5cd99e97c842805fe8 *man/writing-integration.Rd daf246d2559a7df53698b1714f020b7a *src/Makevars d3bfefbd9ecbdd96dce901d0d0193668 *src/ModularityOptimizer.cpp 92e4aaaaf2d6921d718999c5bd9e9913 *src/ModularityOptimizer.h 24a6ab7279d09348f254732fd5ce2b8f *src/RModularityOptimizer.cpp d3a792f8147b4cc85d4174d9f1945f64 *src/RcppExports.cpp eeb4b89f57a28c13b7d353eac4f0f67a *src/data_manipulation.cpp 531a0da4cef6f8521d98bac8b9160e1e *src/data_manipulation.h cee56bd61191250ef5ae907838891d4a *src/fast_NN_dist.cpp c8f85a446cb1a8373fb3e2d0fdbb944c *src/integration.cpp 91debeffa7ebcac8c26af5d56d94ee0a *src/integration.h c86d8ffb7b0af9bd0ffe54222f0553f5 *src/snn.cpp 694a8ab034ccab2c5f7c35bf47b3469e *src/snn.h 1114ed8c2f704fd1d41de74d80f35ecc *src/stats.cpp f33c09d14c160d9f29a89251fd91a036 *src/valid_pointer.c 1d5009992bb3e703bb3f2482f9b8ddd2 *tests/testdata/barcodes.tsv d2554fb8e4d5af543605d0a729e36109 *tests/testdata/cr3.0/barcodes.tsv.gz 70e1ed4c347e2563a90fd2144f375a26 *tests/testdata/cr3.0/features.tsv.gz 75dc5f8ba97f4c3bc30ceb7926c5759b *tests/testdata/cr3.0/matrix.mtx.gz 91aa47aeda59ef6d82105100a09d1497 *tests/testdata/genes.tsv 6693f4ae1a15e0985ed513ee83fad927 *tests/testdata/matrix.mtx 646ac9cb85813dbe838d804f78f717a4 *tests/testdata/nbt_small.Rdata 0231c122b953c71d602ca29437c61d53 *tests/testdata/visium/filtered_feature_bc_matrix.h5 f246397b028c44c054bfbda1b5999233 *tests/testdata/visium/spatial/scalefactors_json.json 0dfb2701504a0aa4a0a41a2c2ae31988 *tests/testdata/visium/spatial/tissue_hires_image.png a18f94708c8b15bc938cddfc184fd899 *tests/testdata/visium/spatial/tissue_lowres_image.png e940f8084d865f7121e2b29418a773b0 *tests/testdata/visium/spatial/tissue_positions_list.csv 0231c122b953c71d602ca29437c61d53 *tests/testdata/visium_hd/binned_outputs/square_008um/filtered_feature_bc_matrix.h5 076f48401d1c803170ca04d84f3fbb64 *tests/testdata/visium_hd/binned_outputs/square_008um/spatial/scalefactors_json.json cf4892986d44b0ceaa17b6f92dc1d913 *tests/testdata/visium_hd/binned_outputs/square_008um/spatial/tissue_hires_image.png 716ffb696277fb030a35d40be7cf62c6 *tests/testdata/visium_hd/binned_outputs/square_008um/spatial/tissue_lowres_image.png 0f9f9471030d4a462d0e4a792885a401 *tests/testdata/visium_hd/binned_outputs/square_008um/spatial/tissue_positions.parquet 0231c122b953c71d602ca29437c61d53 *tests/testdata/visium_hd/binned_outputs/square_016um/filtered_feature_bc_matrix.h5 909c8933e3d507824a44dd890e0f04ba *tests/testdata/visium_hd/binned_outputs/square_016um/spatial/scalefactors_json.json cf4892986d44b0ceaa17b6f92dc1d913 *tests/testdata/visium_hd/binned_outputs/square_016um/spatial/tissue_hires_image.png 716ffb696277fb030a35d40be7cf62c6 *tests/testdata/visium_hd/binned_outputs/square_016um/spatial/tissue_lowres_image.png e16227edb3b0969510ffddeeed44ee13 *tests/testdata/visium_hd/binned_outputs/square_016um/spatial/tissue_positions.parquet 3dcbffe8e9b7dd575e70f9f5cc8b77df *tests/testthat.R 0a75db145a45197a2262cb1b83938124 *tests/testthat/test_data_manipulation.R d9939462b62edc9f86d9407408e06ef0 *tests/testthat/test_differential_expression.R 4242689b570b8a2279eb6dc561ba57b9 *tests/testthat/test_dimensional_reduction.R fbbe95d8c341d606a3001bab122c82fe *tests/testthat/test_find_clusters.R 7e5d7eb8a146b55f92f046c3cf503636 *tests/testthat/test_integratedata.R bec688a07dbe26b4e991c1651a72c3ec *tests/testthat/test_integration.R fcf04aab9317ad572cb3fd95f13438f3 *tests/testthat/test_integration5.R 71c63bd5acc7a78ed88a467631e62a96 *tests/testthat/test_load_10X.R e096ae1c8e0ea82b43c0e5ff4c5ba116 *tests/testthat/test_modularity_optimizer.R 33597bae1ade792062ad2eb6817e7247 *tests/testthat/test_objects.R df36775c5dcc81b09f392c3d1b1bc4ac *tests/testthat/test_preprocessing.R 15b04caab86ff143642bf529068a7692 *tests/testthat/test_sketching.R 57f934ba52343f5c9404cc888ace329a *tests/testthat/test_spatial.R a8e682e9926fec147ac70519ad3cd80b *tests/testthat/test_transferdata.R c9b3f10afd1c72c04363722488c7603e *tests/testthat/test_tree.R 90bfea04f36786c761f2a8ed825a8967 *tests/testthat/test_utilities.R 5124c1daa2609472441694d6ad91a26d *tests/testthat/test_visualization.R Seurat/R/0000755000176200001440000000000015117330550011716 5ustar liggesusersSeurat/R/objects.R0000644000176200001440000031262715117056271013512 0ustar liggesusers#' @include reexports.R #' @include generics.R #' @importFrom Rcpp evalCpp #' @importFrom Matrix colSums rowSums colMeans rowMeans #' @importFrom methods setClass setOldClass setClassUnion slot #' slot<- setMethod new signature slotNames is setAs setValidity .hasSlot #' @importClassesFrom Matrix dgCMatrix #' @useDynLib Seurat #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Class definitions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% setOldClass(Classes = 'package_version') #' The AnchorSet Class #' #' The AnchorSet class is an intermediate data storage class that stores the anchors and other #' related information needed for performing downstream analyses - namely data integration #' (\code{\link{IntegrateData}}) and data transfer (\code{\link{TransferData}}). #' #' @slot object.list List of objects used to create anchors #' @slot reference.cells List of cell names in the reference dataset - needed when performing data #' transfer. #' @slot reference.objects Position of reference object/s in object.list #' @slot query.cells List of cell names in the query dataset - needed when performing data transfer #' @slot anchors The anchor matrix. This contains the cell indices of both anchor pair cells, the #' anchor score, and the index of the original dataset in the object.list for cell1 and cell2 of #' the anchor. #' @slot offsets The offsets used to enable cell look up in downstream functions #' @slot weight.reduction The weight dimensional reduction used to calculate weight matrix #' @slot anchor.features The features used when performing anchor finding. #' @slot neighbors List containing Neighbor objects for reuse later (e.g. mapping) #' @slot command Store log of parameters that were used #' #' @name AnchorSet-class #' @rdname AnchorSet-class #' @concept objects #' @exportClass AnchorSet #' AnchorSet <- setClass( Class = "AnchorSet", contains = 'VIRTUAL', slots = list( object.list = "list", reference.cells = "vector", reference.objects = "vector", query.cells = "vector", anchors = "ANY", offsets = "ANY", weight.reduction = "DimReduc", anchor.features = "ANY", neighbors = "list", command = "ANY" ) ) #' The TransferAnchorSet Class #' #' Inherits from the Anchorset class. Implemented mainly for method dispatch #' purposes. See \code{\link{AnchorSet}} for slot details. #' #' @name TransferAnchorSet-class #' @rdname TransferAnchorSet-class #' @concept objects #' @exportClass TransferAnchorSet #' TransferAnchorSet <- setClass( Class = "TransferAnchorSet", contains = "AnchorSet" ) #' The IntegrationAnchorSet Class #' #' Inherits from the Anchorset class. Implemented mainly for method dispatch #' purposes. See \code{\link{AnchorSet}} for slot details. #' #' @name IntegrationAnchorSet-class #' @rdname IntegrationAnchorSet-class #' @concept objects #' @exportClass IntegrationAnchorSet #' IntegrationAnchorSet <- setClass( Class = "IntegrationAnchorSet", contains = "AnchorSet" ) #' The ModalityWeights Class #' #' The ModalityWeights class is an intermediate data storage class that stores the modality weight and other #' related information needed for performing downstream analyses - namely data integration #' (\code{FindModalityWeights}) and data transfer (\code{\link{FindMultiModalNeighbors}}). #' #' @slot modality.weight.list A list of modality weights value from all modalities #' @slot modality.assay Names of assays for the list of dimensional reductions #' @slot params A list of parameters used in the FindModalityWeights #' @slot score.matrix a list of score matrices representing cross and within-modality prediction #' score, and kernel value #' @slot command Store log of parameters that were used #' #' @name ModalityWeights-class #' @rdname ModalityWeights-class #' @concept objects #' @exportClass ModalityWeights #' ModalityWeights <- setClass( Class = "ModalityWeights", slots = list( modality.weight.list = "list", modality.assay = "vector", params = "list", score.matrix = "list", command = "ANY" ) ) #' The BridgeReferenceSet Class #' The BridgeReferenceSet is an output from PrepareBridgeReference #' @slot bridge The multi-omic object #' @slot reference The Reference object only containing bridge representation assay #' @slot params A list of parameters used in the PrepareBridgeReference #' @slot command Store log of parameters that were used #' #' @name BridgeReferenceSet-class #' @rdname BridgeReferenceSet-class #' @concept objects #' @exportClass BridgeReferenceSet #' BridgeReferenceSet <- setClass( Class = "BridgeReferenceSet", slots = list( bridge = "ANY", reference = "ANY", params = "list", command = "ANY" ) ) #' The IntegrationData Class #' #' The IntegrationData object is an intermediate storage container used internally throughout the #' integration procedure to hold bits of data that are useful downstream. #' #' @slot neighbors List of neighborhood information for cells (outputs of \code{RANN::nn2}) #' @slot weights Anchor weight matrix #' @slot integration.matrix Integration matrix #' @slot anchors Anchor matrix #' @slot offsets The offsets used to enable cell look up in downstream functions #' @slot objects.ncell Number of cells in each object in the object.list #' @slot sample.tree Sample tree used for ordering multi-dataset integration #' #' @name IntegrationData-class #' @rdname IntegrationData-class #' @concept objects #' @exportClass IntegrationData #' IntegrationData <- setClass( Class = "IntegrationData", slots = list( neighbors = "ANY", weights = "ANY", integration.matrix = "ANY", anchors = "ANY", offsets = "ANY", objects.ncell = "ANY", sample.tree = "ANY" ) ) #' The SCTModel Class #' #' The SCTModel object is a model and parameters storage from SCTransform. #' It can be used to calculate Pearson residuals for new genes. #' #' @slot feature.attributes A data.frame with feature attributes in SCTransform #' @slot cell.attributes A data.frame with cell attributes in SCTransform #' @slot clips A list of two numeric of length two specifying the min and max #' values the Pearson residual will be clipped to. One for vst and one for #' SCTransform #' @slot umi.assay Name of the assay of the seurat object containing UMI matrix #' and the default is RNA #' @slot model A formula used in SCTransform #' @slot arguments other information used in SCTransform #' @slot median_umi Median UMI (or scale factor) used to calculate corrected counts #' #' @seealso \code{\link[SeuratObject]{Assay}} #' #' @name SCTAssay-class #' @rdname SCTAssay-class #' @concept objects #' #' @examples #' \dontrun{ #' # SCTAssay objects are generated from SCTransform #' pbmc_small <- SCTransform(pbmc_small) #' } #' SCTModel <- setClass( Class = 'SCTModel', slots = c( feature.attributes = 'data.frame', cell.attributes = 'data.frame', clips = 'list', umi.assay = 'character', model = 'character', arguments = 'list', median_umi = 'numeric' ) ) #' The SCTAssay Class #' #' The SCTAssay object contains all the information found in an \code{\link[SeuratObject]{Assay}} #' object, with extra information from the results of \code{\link{SCTransform}} #' #' @slot SCTModel.list A list containing SCT models #' #' @seealso \code{\link[SeuratObject]{Assay}} #' #' @name SCTAssay-class #' @rdname SCTAssay-class #' @concept objects #' #' @examples #' \dontrun{ #' # SCTAssay objects are generated from SCTransform #' pbmc_small <- SCTransform(pbmc_small) #' pbmc_small[["SCT"]] #' } #' SCTAssay <- setClass( Class = 'SCTAssay', contains = 'Assay', slots = c( SCTModel.list = 'list' ) ) #' @note \code{scalefactors} objects can be created with \code{scalefactors()} #' #' @param spot Spot full resolution scale factor #' @param fiducial Fiducial full resolution scale factor #' @param hires High resolutoin scale factor #' @param lowres Low resolution scale factor #' #' @rdname ScaleFactors #' @concept objects #' @concept spatial #' @export #' scalefactors <- function(spot = 1, fiducial = 1, hires = 1, lowres = 1) { object <- list( spot = spot, fiducial = fiducial, hires = hires, lowres = lowres ) object <- sapply(X = object, FUN = as.numeric, simplify = FALSE, USE.NAMES = TRUE) return(structure(.Data = object, class = 'scalefactors')) } setOldClass(Classes = c('scalefactors')) #' The SlideSeq class #' #' The SlideSeq class represents spatial information from the Slide-seq platform #' #' @inheritSection SeuratObject::SpatialImage Slots #' @slot coordinates ... #' @concept spatial #' SlideSeq <- setClass( Class = 'SlideSeq', contains = 'SpatialImage', slots = list( 'coordinates' = 'data.frame' ) ) #' The STARmap class #' #' #' @inheritSection SeuratObject::SpatialImage Slots #' @concept objects #' @concept spatial #' STARmap <- setClass( Class = 'STARmap', contains = 'SpatialImage', slots = list( 'coordinates' = 'data.frame', 'qhulls' = 'data.frame' ) ) #' The VisiumV1 class #' #' The VisiumV1 class represents spatial information from the 10X Genomics Visium #' platform #' #' @slot image A three-dimensional array with PNG image data, see #' \code{\link[png]{readPNG}} for more details #' @slot scale.factors An object of class \code{\link{scalefactors}}; see #' \code{\link{scalefactors}} for more information #' @slot coordinates A data frame with tissue coordinate information #' @slot spot.radius Single numeric value giving the radius of the spots #' #' @name VisiumV1-class #' @rdname VisiumV1-class #' @concept objects #' @concept spatial #' @exportClass VisiumV1 #' VisiumV1 <- setClass( Class = 'VisiumV1', contains = 'SpatialImage', slots = list( 'image' = 'array', 'scale.factors' = 'scalefactors', 'coordinates' = 'data.frame', 'spot.radius' = 'numeric' ) ) #' The VisiumV2 class #' #' The VisiumV2 class represents spatial information from the 10X Genomics #' Visium HD platform - it can also accomodate data from the standard #' Visium platform #' #' @slot image A three-dimensional array with PNG image data, see #' \code{\link[png]{readPNG}} for more details #' @slot scale.factors An object of class \code{\link{scalefactors}}; see #' \code{\link{scalefactors}} for more information #' #' @importClassesFrom SeuratObject FOV #' @name VisiumV2-class #' #' @concept objects #' @concept spatial #' @exportClass VisiumV2 VisiumV2 <- setClass( Class = "VisiumV2", contains = "FOV", slots = list( image = "array", scale.factors = "scalefactors" ) ) setClass(Class = 'SliceImage', contains = 'VisiumV1') #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Get a vector of cell names associated with an image (or set of images) #' #' @param object Seurat object #' @param images Vector of image names #' @param unlist Return as a single vector of cell names as opposed to a list, #' named by image name. #' #' @return A vector of cell names #' #' @examples #' \dontrun{ #' CellsByImage(object = object, images = "slice1") #' } #' #' @keywords internal #' CellsByImage <- function(object, images = NULL, unlist = FALSE) { images <- images %||% Images(object = object) cells <- sapply( X = images, FUN = function(x) { Cells(x = object[[x]]) }, simplify = FALSE, USE.NAMES = TRUE ) if (unlist) { cells <- unname(obj = unlist(x = cells)) } return(cells) } #' Create a SCT Assay object #' #' Create a SCT object from a feature (e.g. gene) expression matrix and a list of SCTModels. #' The expected format of the input matrix is features x cells. #' #' Non-unique cell or feature names are not allowed. Please make unique before #' calling this function. #' @param scale.data a residual matrix #' @param SCTModel.list list of SCTModels #' @param umi.assay The UMI assay name. Default is RNA #' @inheritParams SeuratObject::CreateAssayObject #' #' @importFrom methods as #' @importFrom Matrix colSums rowSums #' #' @export #' @concept objects #' CreateSCTAssayObject <- function( counts, data, scale.data = NULL, umi.assay = "RNA", min.cells = 0, min.features = 0, SCTModel.list = NULL ) { assay <- CreateAssayObject( counts = counts, data = data, min.cells = min.cells, min.features = min.features ) if (!is.null(scale.data)) { assay <- SetAssayData(object = assay, layer = "scale.data", new.data = scale.data) } slot(object = assay, name = "assay.orig") <- umi.assay #checking SCTModel.list format if (is.null(x = SCTModel.list)) { SCTModel.type <- "none" warning("An empty SCTModel will be generated due to no SCTModel input") } else { if (inherits(x = SCTModel.list, what = "SCTModel")) { SCTModel.list <- list(model1 = SCTModel.list) SCTModel.type <- "SCTModel.list" } else if (inherits(x = SCTModel.list, what = "list")) { if (inherits(x = SCTModel.list[[1]], what = "SCTModel")){ SCTModel.type <- "SCTModel.list" } else if (IsVSTout(vst.out = SCTModel.list)){ SCTModel.type <- "vst.out" } else if (IsVSTout(SCTModel.list[[1]])) { SCTModel.type <- "vst.set" } else { stop("SCTModel input is not a correct format") } } } model.list <- switch( EXPR = SCTModel.type, "none" = { list() }, "SCTModel.list" = { SCTModel.list <- lapply(X = SCTModel.list, FUN = function(model) { select.cell <- intersect(x = Cells(x = model), Cells(x = assay)) if (length(x = select.cell) == 0) { stop("Cells in SCTModel.list don't match Cells in assay") } else { model@cell.attributes <- model@cell.attributes[select.cell, , drop = FALSE] } return(model) }) SCTModel.list }, "vst.out" = { SCTModel.list$umi.assay <- umi.assay SCTModel.list <- PrepVSTResults( vst.res = SCTModel.list, cell.names = Cells(x = assay) ) list(model1 = SCTModel.list) }, "vst.set" = { new.model <- lapply( X = SCTModel.list, FUN = function(vst.res) { vst.res$umi.assay <- umi.assay return(PrepVSTResults(vst.res = vst.res, cell.names = colnames(x = assay))) } ) names(x = new.model) <- paste0("model", 1:length(x = new.model)) new.model } ) assay <- new( Class = "SCTAssay", assay, SCTModel.list = model.list ) return(assay) } #' Slim down a Seurat object #' #' Keep only certain aspects of the Seurat object. Can be useful in functions #' that utilize merge as it reduces the amount of data in the merge #' #' @param object A \code{\link[SeuratObject]{Seurat}} object #' @param layers A vector or named list of layers to keep #' @param features Only keep a subset of features, defaults to all features #' @param assays Only keep a subset of assays specified here #' @param dimreducs Only keep a subset of DimReducs specified here (if #' \code{NULL}, remove all DimReducs) #' @param graphs Only keep a subset of Graphs specified here (if \code{NULL}, #' remove all Graphs) #' @param misc Preserve the \code{misc} slot; default is \code{TRUE} #' @param counts Preserve the count matrices for the assays specified #' @param data Preserve the data matrices for the assays specified #' @param scale.data Preserve the scale data matrices for the assays specified #' @param ... Ignored #' #' @return \code{object} with only the sub-object specified retained #' #' @importFrom SeuratObject .FilterObjects .PropagateList Assays #' Layers UpdateSlots #' #' @export #' #' @concept objects #' DietSeurat <- function( object, layers = NULL, features = NULL, assays = NULL, dimreducs = NULL, graphs = NULL, misc = TRUE, counts = deprecated(), data = deprecated(), scale.data = deprecated(), ... ) { CheckDots(...) dep.args <- c(counts = counts, data = data, scale.data = scale.data) for (lyr in names(x = dep.args)) { if (is_present(arg = dep.args[[lyr]])) { if (is.null(x = layers)) { layers <- unique(x = unlist(x = lapply( X = Assays(object = object), FUN = function(x) { return(Layers(object = object[[x]])) } ))) } deprecate_soft( when = '5.0.0', what = paste0('DietSeurat(', lyr, ' = )'), with = 'DietSeurat(layers = )' ) layers <- if (isTRUE(x = dep.args[[lyr]])) { c(layers, lyr) } else { Filter(f = function(x) x != lyr, x = layers) } } } object <- UpdateSlots(object = object) assays <- assays %||% Assays(object = object) assays <- intersect(x = assays, y = Assays(object = object)) if (!length(x = assays)) { abort(message = "No assays provided were found in the Seurat object") } if (!DefaultAssay(object = object) %in% assays) { abort( message = "The default assay is slated to be removed, please change the default assay" ) } layers <- layers %||% assays layers <- .PropagateList(x = layers, names = assays) for (assay in names(x = layers)) { layers[[assay]] <- tryCatch( expr = Layers(object = object[[assay]], search = layers[[assay]]), error = function(...) { return(character(length = 0L)) } ) } layers <- Filter(f = length, x = layers) if (!length(x = layers)) { abort(message = "None of the requested layers found") } for (assay in Assays(object = object)) { if (!(assay %in% assays)) { object[[assay]] <- NULL next } layers.rm <- setdiff( x = Layers(object = object[[assay]]), y = layers[[assay]] ) if (length(x = layers.rm)) { if (inherits(x = object[[assay]], what = 'Assay') && all(c('counts', 'data') %in% layers.rm)) { abort(message = "Cannot remove both 'counts' and 'data' from v3 Assays") } for (lyr in layers.rm) { suppressWarnings(object <- tryCatch(expr = { object[[assay]][lyr] <- NULL object }, error = function(e) { if (lyr == "data"){ object[[assay]][lyr] <- sparseMatrix(i = 1, j = 1, x = 1, dims = dim(object[[assay]][lyr]), dimnames = dimnames(object[[assay]][lyr])) } else{ slot(object = object[[assay]], name = lyr) <- new(Class = "dgCMatrix") } message("Converting layer ", lyr, " in assay ", assay, " to empty dgCMatrix") object })) } } if (!is.null(x = features)) { features.assay <- intersect( x = features, y = rownames(x = object[[assay]]) ) if (!length(x = features.assay)) { warn(message = paste0( 'No features found in assay ', sQuote(x = assay), ', removing...' )) object[[assay]] <- NULL next } suppressWarnings(object[[assay]] <- subset(x = object[[assay]], features = features.assay)) } } # remove misc when desired if (!isTRUE(x = misc)) { slot(object = object, name = "misc") <- list() } # remove unspecified DimReducs and Graphs all.objects <- .FilterObjects( object = object, classes.keep = c('DimReduc', 'Graph') ) objects.to.remove <- all.objects[!all.objects %in% c(dimreducs, graphs)] for (ob in objects.to.remove) { object[[ob]] <- NULL } cells.keep <- list() for (assay in Assays(object = object)) { cells.keep[[assay]] <- colnames(x = object[[assay]] ) } cells.keep <- intersect(colnames(x = object), unlist(cells.keep)) if (length(cells.keep) < ncol(x = object)) { object <- subset(object, cells = cells.keep) } return(object) } #' Filter stray beads from Slide-seq puck #' #' This function is useful for removing stray beads that fall outside the main #' Slide-seq puck area. Essentially, it's a circular filter where you set a #' center and radius defining a circle of beads to keep. If the center is not #' set, it will be estimated from the bead coordinates (removing the 1st and #' 99th quantile to avoid skewing the center by the stray beads). By default, #' this function will display a \code{\link{SpatialDimPlot}} showing which cells #' were removed for easy adjustment of the center and/or radius. #' #' @param object Seurat object with slide-seq data #' @param image Name of the image where the coordinates are stored #' @param center Vector specifying the x and y coordinates for the center of the #' inclusion circle #' @param radius Radius of the circle of inclusion #' @param do.plot Display a \code{\link{SpatialDimPlot}} with the cells being #' removed labeled. #' #' @return Returns a Seurat object with only the subset of cells that pass the #' circular filter #' #' @concept objects #' @concept spatial #' @examples #' \dontrun{ #' # This example uses the ssHippo dataset which you can download #' # using the SeuratData package. #' library(SeuratData) #' data('ssHippo') #' # perform filtering of beads #' ssHippo.filtered <- FilterSlideSeq(ssHippo, radius = 2300) #' # This radius looks to small so increase and repeat until satisfied #' } #' @export #' FilterSlideSeq <- function( object, image = "image", center = NULL, radius = NULL, do.plot = TRUE ) { if (!inherits(x = object[[image]], what = "SlideSeq")) { warning( "This fxn is intended for filtering SlideSeq data and is untested ", "outside of that context." ) } dat <- GetTissueCoordinates(object[[image]]) if (is.null(x = center)) { # heuristic for determining center of puck center <- c() x.vals <- dat[, 1] center[1] <- mean( x = x.vals[x.vals < quantile(x = x.vals, probs = 0.99) & x.vals > quantile(x = x.vals, probs = 0.01)] ) y.vals <- dat[, 2] center[2] <- mean( x = y.vals[y.vals < quantile(x = y.vals, probs = 0.99) & y.vals > quantile(x = y.vals, probs = 0.01)] ) } if (is.null(x = radius)) { stop("Please provide a radius.") } dists <- apply(X = dat, MARGIN = 1, FUN = function(x) { as.numeric(dist(rbind(x[c(1, 2)], center))) }) cells.to.remove <- names(x = which(x = (dists > radius))) if (do.plot) { Idents(object) <- "keep" object <- SetIdent(object = object, cells = cells.to.remove, value = "remove") print(SpatialDimPlot(object = object)) } return(subset(x = object, cells = cells.to.remove, invert = TRUE)) } #' Get integration data #' #' @param object Seurat object #' @param integration.name Name of integration object #' @param slot Which slot in integration object to get #' #' @return Returns data from the requested slot within the integrated object #' #' @export #' @concept objects #' GetIntegrationData <- function(object, integration.name, slot) { tools <- slot(object = object, name = 'tools') if (!(integration.name %in% names(tools))) { stop('Requested integration key does not exist') } int.data <- tools[[integration.name]] return(slot(object = int.data, name = slot)) } #' Set integration data #' #' @param object Seurat object #' @param integration.name Name of integration object #' @param slot Which slot in integration object to set #' @param new.data New data to insert #' #' @return Returns a \code{\link{Seurat}} object #' #' @export #' @concept objects #' SetIntegrationData <- function(object, integration.name, slot, new.data) { tools <- slot(object = object, name = 'tools') if (!(integration.name %in% names(tools))) { new.integrated <- new(Class = 'IntegrationData') slot(object = new.integrated, name = slot) <- new.data tools[[integration.name]] <- new.integrated slot(object = object, name = 'tools') <- tools return(object) } int.data <- tools[[integration.name]] slot(object = int.data, name = slot) <- new.data tools[[integration.name]] <- int.data slot(object = object, name = 'tools') <- tools return(object) } #' Splits object into a list of subsetted objects. #' #' Splits object based on a single attribute into a list of subsetted objects, #' one for each level of the attribute. For example, useful for taking an object #' that contains cells from many patients, and subdividing it into #' patient-specific objects. #' #' @param object Seurat object #' @param split.by Attribute for splitting. Default is "ident". Currently #' only supported for class-level (i.e. non-quantitative) attributes. #' #' @return A named list of Seurat objects, each containing a subset of cells #' from the original object. #' #' @export #' @concept objects #' #' @examples #' data("pbmc_small") #' # Assign the test object a three level attribute #' groups <- sample(c("group1", "group2", "group3"), size = 80, replace = TRUE) #' names(groups) <- colnames(pbmc_small) #' pbmc_small <- AddMetaData(object = pbmc_small, metadata = groups, col.name = "group") #' obj.list <- SplitObject(pbmc_small, split.by = "group") #' SplitObject <- function(object, split.by = "ident") { if (split.by == 'ident') { groupings <- Idents(object = object) } else { groupings <- FetchData(object = object, vars = split.by)[, 1] } groupings <- unique(x = as.character(x = groupings)) obj.list <- list() for (i in groupings) { if (split.by == "ident") { obj.list[[i]] <- subset(x = object, idents = i) } else { cells <- which(x = object[[split.by, drop = TRUE]] == i) cells <- colnames(x = object)[cells] obj.list[[i]] <- subset(x = object, cells = cells) } } return(obj.list) } #' Find features with highest scores for a given dimensional reduction technique #' #' Return a list of features with the strongest contribution to a set of components #' #' @param object DimReduc object #' @param dim Dimension to use #' @param nfeatures Number of features to return #' @param projected Use the projected feature loadings #' @param balanced Return an equal number of features with both + and - scores. #' @param ... Extra parameters passed to \code{\link{Loadings}} #' #' @return Returns a vector of features #' #' @export #' @concept objects #' #' @examples #' data("pbmc_small") #' pbmc_small #' TopFeatures(object = pbmc_small[["pca"]], dim = 1) #' # After projection: #' TopFeatures(object = pbmc_small[["pca"]], dim = 1, projected = TRUE) #' TopFeatures <- function( object, dim = 1, nfeatures = 20, projected = FALSE, balanced = FALSE, ... ) { loadings <- Loadings(object = object, projected = projected, ...)[, dim, drop = FALSE] return(Top( data = loadings, num = nfeatures, balanced = balanced )) } #' Find cells with highest scores for a given dimensional reduction technique #' #' Return a list of genes with the strongest contribution to a set of components #' #' @param object DimReduc object #' @param dim Dimension to use #' @param ncells Number of cells to return #' @param balanced Return an equal number of cells with both + and - scores. #' @param ... Extra parameters passed to \code{\link{Embeddings}} #' #' @return Returns a vector of cells #' #' @export #' @concept objects #' #' @examples #' data("pbmc_small") #' pbmc_small #' head(TopCells(object = pbmc_small[["pca"]])) #' # Can specify which dimension and how many cells to return #' TopCells(object = pbmc_small[["pca"]], dim = 2, ncells = 5) #' TopCells <- function(object, dim = 1, ncells = 20, balanced = FALSE, ...) { embeddings <- Embeddings(object = object, ...)[, dim, drop = FALSE] return(Top( data = embeddings, num = ncells, balanced = balanced )) } #' Get nearest neighbors for given cell #' #' Return a vector of cell names of the nearest n cells. #' #' @param object \code{\link[SeuratObject]{Neighbor}} object #' @param cell Cell of interest #' @param n Number of neighbors to return #' #' @return Returns a vector of cell names #' #' @export #' @concept objects #' TopNeighbors <- function(object, cell, n = 5) { indices <- Indices(object = object)[cell, 1:n] return(Cells(x = object)[indices]) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @param assay Assay to convert #' @param reduction Name of DimReduc to set to main reducedDim in cds #' #' @rdname as.CellDataSet #' @concept objects #' @export #' @method as.CellDataSet Seurat #' as.CellDataSet.Seurat <- function(x, assay = NULL, reduction = NULL, ...) { CheckDots(...) if (isFALSE(x = requireNamespace('monocle', quietly = TRUE))) { stop("Please install monocle from Bioconductor before converting to a CellDataSet object") } else if (packageVersion(pkg = 'monocle') >= package_version(x = '2.99.0')) { stop("Seurat can only convert to/from Monocle v2.X objects") } assay <- assay %||% DefaultAssay(object = x) # make variables, then run `newCellDataSet` # create cellData counts counts <- GetAssayData(object = x, assay = assay, layer = "counts") # metadata cell.metadata <- x[[]] feature.metadata <- x[[assay]][[]] if (!"gene_short_name" %in% colnames(x = feature.metadata)) { feature.metadata$gene_short_name <- rownames(x = feature.metadata) } pd <- new(Class = "AnnotatedDataFrame", data = cell.metadata) fd <- new(Class = "AnnotatedDataFrame", data = feature.metadata) # Now, determine the expressionFamily if ("monocle" %in% names(x = Misc(object = x))) { expressionFamily <- Misc(object = x, slot = "monocle")[["expressionFamily"]] } else { if (all(counts == floor(x = counts))) { expressionFamily <- VGAM::negbinomial.size() } else if (any(counts < 0)) { expressionFamily <- VGAM::uninormal() } else { expressionFamily <- VGAM::tobit() } } cds <- monocle::newCellDataSet( cellData = counts, phenoData = pd, featureData = fd, expressionFamily = expressionFamily ) if ("monocle" %in% names(x = Misc(object = x))) { monocle::cellPairwiseDistances(cds = cds) <- Misc(object = x, slot = "monocle")[["cellPairwiseDistances"]] monocle::minSpanningTree(cds = cds) <- Misc(object = x, slot = "monocle")[["minSpanningTree"]] Biobase::experimentData(cds = cds) <- Misc(object = x, slot = "monocle")[["experimentData"]] Biobase::protocolData(cds = cds) <- Misc(object = x, slot = "monocle")[["protocolData"]] Biobase::classVersion(cds = cds) <- Misc(object = x, slot = "monocle")[["classVersion"]] # no setter methods found for following slots slot(object = cds, name = "lowerDetectionLimit") <- Misc(object = x, slot = "monocle")[["lowerDetectionLimit"]] slot(object = cds, name = "dispFitInfo") <- Misc(object = x, slot = "monocle")[["dispFitInfo"]] slot(object = cds, name = "auxOrderingData") <- Misc(object = x, slot = "monocle")[["auxOrderingData"]] slot(object = cds, name = "auxClusteringData") <- Misc(object = x, slot = "monocle")[["auxClusteringData"]] } # adding dimensionality reduction data to the CDS dr.slots <- c("reducedDimS", "reducedDimK", "reducedDimW", "reducedDimA") reduction <- reduction %||% DefaultDimReduc(object = x, assay = assay) if (!is.null(x = reduction)) { if (grepl(pattern = 'tsne', x = tolower(x = reduction))) { slot(object = cds, name = "dim_reduce_type") <- "tSNE" monocle::reducedDimA(cds = cds) <- t(x = Embeddings(object = x[[reduction]])) } else { slot(object = cds, name = "dim_reduce_type") <- reduction monocle::reducedDimA(cds = cds) <- Loadings(object = x[[reduction]]) slot(object = cds, name = "reducedDimS") <- Embeddings(object = x[[reduction]]) } for (ii in dr.slots) { if (ii %in% names(x = slot(object = x[[reduction]], name = "misc"))) { slot(object = cds, name = ii) <- slot(object = x[[reduction]], name = "misc")[[ii]] } } } return(cds) } #' Convert objects to \code{Seurat} objects #' #' @inheritParams SeuratObject::as.Seurat #' @param slot Slot to store expression data as #' @param verbose Show progress updates #' #' @return A \code{Seurat} object generated from \code{x} #' #' @importFrom utils packageVersion #' #' @rdname as.Seurat #' @concept objects #' @export #' @method as.Seurat CellDataSet #' #' @seealso \code{\link[SeuratObject:as.Seurat]{SeuratObject::as.Seurat}} #' as.Seurat.CellDataSet <- function( x, slot = 'counts', assay = 'RNA', verbose = TRUE, ... ) { CheckDots(...) if (isFALSE(x = requireNamespace('monocle', quietly = TRUE))) { stop("Please install monocle from Bioconductor before converting to a CellDataSet object") } else if (packageVersion(pkg = 'monocle') >= package_version(x = '2.99.0')) { stop("Seurat can only convert to/from Monocle v2.X objects") } slot <- match.arg(arg = slot, choices = c('counts', 'data')) if (verbose) { message("Pulling expression data") } expr <- Biobase::exprs(object = x) if (IsMatrixEmpty(x = expr)) { stop("No data provided in this CellDataSet object", call. = FALSE) } meta.data <- as.data.frame(x = Biobase::pData(object = x)) # if cell names are NULL, fill with cell_X if (is.null(x = colnames(x = expr))) { warning( "The column names of the 'counts' and 'data' matrices are NULL. Setting cell names to cell_columnidx (e.g 'cell_1').", call. = FALSE, immediate. = TRUE ) rownames(x = meta.data) <- colnames(x = expr) <- paste0("cell_", 1:ncol(x = expr)) } # Creating the object if (verbose) { message("Building Seurat object") } if (slot == 'data') { assays <- list(CreateAssayObject(data = expr)) names(x = assays) <- assay Key(object = assays[[assay]]) <- suppressWarnings(expr = UpdateKey(key = assay)) object <- new( Class = 'Seurat', assays = assays, meta.data = meta.data, version = packageVersion(pkg = 'Seurat'), project.name = 'SeuratProject' ) DefaultAssay(object = object) <- assay } else { object <- CreateSeuratObject( counts = expr, meta.data = meta.data, assay = assay ) } # feature metadata if (verbose) { message("Adding feature-level metadata") } feature.metadata <- Biobase::fData(object = x) object[[assay]][[names(x = feature.metadata)]] <- feature.metadata # mean/dispersion values disp.table <- tryCatch( expr = suppressWarnings(expr = monocle::dispersionTable(cds = x)), error = function(...) { return(NULL) } ) if (!is.null(x = disp.table)) { if (verbose) { message("Adding dispersion information") } rownames(x = disp.table) <- disp.table[, 1] disp.table[, 1] <- NULL colnames(x = disp.table) <- paste0('monocle_', colnames(x = disp.table)) object[[assay]][[names(x = disp.table)]] <- disp.table } else if (verbose) { message("No dispersion information in CellDataSet object") } # variable features if ("use_for_ordering" %in% colnames(x = feature.metadata)) { if (verbose) { message("Setting variable features") } VariableFeatures(object = object, assay = assay) <- rownames(x = feature.metadata)[which(x = feature.metadata[, "use_for_ordering"])] } else if (verbose) { message("No variable features present") } # add dim reduction dr.name <- slot(object = x, name = "dim_reduce_type") if (length(x = dr.name) > 0) { if (verbose) { message("Adding ", dr.name, " dimensional reduction") } reduced.A <- t(x = slot(object = x, name = 'reducedDimA')) reduced.S <- t(x = slot(object = x, name = 'reducedDimS')) if (IsMatrixEmpty(x = reduced.S)) { embeddings <- reduced.A loadings <- new(Class = 'matrix') } else { embeddings <- reduced.S loadings <- t(x = reduced.A) } rownames(x = embeddings) <- colnames(x = object) misc.dr <- list( reducedDimS = slot(object = x, name = "reducedDimS"), reducedDimK = slot(object = x, name = "reducedDimK"), reducedDimW = slot(object = x, name = "reducedDimW"), reducedDimA = slot(object = x, name = "reducedDimA") ) dr <- suppressWarnings(expr = CreateDimReducObject( embeddings = embeddings, loadings = loadings, assay = assay, key = UpdateKey(key = tolower(x = dr.name)), misc = misc.dr )) object[[dr.name]] <- dr } else if (verbose) { message("No dimensional reduction information found") } monocle.specific.info <- list( expressionFamily = slot(object = x, name = "expressionFamily"), lowerDetectionLimit = slot(object = x, name = "lowerDetectionLimit"), dispFitInfo = slot(object = x, name = "dispFitInfo"), cellPairwiseDistances = slot(object = x, name = "cellPairwiseDistances"), minSpanningTree = slot(object = x, name = "minSpanningTree"), auxOrderingData = slot(object = x, name = "auxOrderingData"), auxClusteringData = slot(object = x, name = "auxClusteringData"), experimentData = slot(object = x, name = "experimentData"), protocolData = slot(object = x, name = "protocolData"), classVersion = slot(object = x, name = ".__classVersion__") ) Misc(object = object, slot = "monocle") <- monocle.specific.info return(object) } #' @param counts name of the SingleCellExperiment assay to store as \code{counts}; #' set to \code{NULL} if only normalized data are present #' @param data name of the SingleCellExperiment assay to slot as \code{data}. #' Set to NULL if only counts are present #' @param assay Name of assays to convert; set to \code{NULL} for all assays to be converted #' @param project Project name for new Seurat object #' #' @rdname as.Seurat #' @concept objects #' @export #' @method as.Seurat SingleCellExperiment #' as.Seurat.SingleCellExperiment <- function( x, counts = 'counts', data = 'logcounts', assay = NULL, project = 'SingleCellExperiment', ... ) { CheckDots(...) if (isFALSE(x = requireNamespace('SingleCellExperiment', quietly = TRUE))) { stop( "Please install SingleCellExperiment from Bioconductor before converting to a SingleCellExperiment object.", "\nhttps://bioconductor.org/packages/SingleCellExperiment/", call. = FALSE ) } meta.data <- as.data.frame(x = SummarizedExperiment::colData(x = x)) if (packageVersion(pkg = "SingleCellExperiment") >= "1.14.0") { orig.exp <- SingleCellExperiment::mainExpName(x = x) %||% "originalexp" } else { orig.exp <- "originalexp" } if (!is.null(SingleCellExperiment::altExpNames(x = x))) { assayn <- assay %||% SingleCellExperiment::altExpNames(x = x) if (!all(assay %in% SingleCellExperiment::altExpNames(x = x))) { stop("One or more of the assays you are trying to convert is not in the SingleCellExperiment object") } assayn <- c(orig.exp, assayn) } else { assayn <- orig.exp } for (assay in assayn) { if (assay != orig.exp) { x <- SingleCellExperiment::swapAltExp(x = x, name = assay, saved = NULL) } # Pull matrices mats <- list(counts = counts, data = data) mats <- Filter(f = Negate(f = is.null), x = mats) if (length(x = mats) == 0) { stop("Cannot pass 'NULL' to both 'counts' and 'data'") } for (m in 1:length(x = mats)) { mats[[m]] <- tryCatch( expr = SummarizedExperiment::assay(x = x, i = mats[[m]]), error = function(e) { stop("No data in provided assay - ", mats[[m]], call. = FALSE) } ) # if cell names are NULL, fill with cell_X if (is.null(x = colnames(x = mats[[m]]))) { warning( "The column names of the ", names(x = mats)[m], " matrix is NULL. Setting cell names to cell_columnidx (e.g 'cell_1').", call. = FALSE, immediate. = TRUE ) cell.names <- paste0("cell_", 1:ncol(x = mats[[m]])) colnames(x = mats[[m]]) <- cell.names rownames(x = meta.data) <- cell.names } } assays <- if (is.null(x = mats$counts)) { list(CreateAssayObject(data = mats$data)) } else if (is.null(x = mats$data)) { list(CreateAssayObject(counts = mats$counts)) } else { a <- CreateAssayObject(counts = mats$counts) a <- SetAssayData(object = a, layer = 'data', new.data = mats$data) list(a) } names(x = assays) <- assay Key(object = assays[[assay]]) <- paste0(tolower(x = assay), '_') # Create the Seurat object if (!exists(x = "object")) { object <- CreateSeuratObject( counts = assays[[assay]], Class = 'Seurat', assay = assay, meta.data = meta.data, version = packageVersion(pkg = 'Seurat'), project.name = project ) } else { object[[assay]] <- assays[[assay]] } DefaultAssay(object = object) <- assay # add feature level meta data md <- SingleCellExperiment::rowData(x = x) if (ncol(x = md) > 0) { # replace underscores rownames(x = md) <- gsub(pattern = "_", replacement = "-", x = rownames(x = md)) md <- as.data.frame(x = md) # ensure order same as data md <- md[rownames(x = object[[assay]]), , drop = FALSE] object[[assay]] <- AddMetaData( object = object[[assay]], metadata = md ) } Idents(object = object) <- project # Get DimReduc information, add underscores if needed and pull from different alt EXP if (length(x = SingleCellExperiment::reducedDimNames(x = x)) > 0) { for (dr in SingleCellExperiment::reducedDimNames(x = x)) { embeddings <- as.matrix(x = SingleCellExperiment::reducedDim(x = x, type = dr)) if (is.null(x = rownames(x = embeddings))) { rownames(x = embeddings) <- cell.names } else { rownames(x = embeddings) <- make.unique(names = rownames(x = embeddings)) } if (isTRUE(x = !grepl('_$', gsub(pattern = "[[:digit:]]", replacement = "_", x = colnames(x = SingleCellExperiment::reducedDim(x = x, type = dr))[1] )))) { key <- gsub( pattern = "[[:digit:]]", replacement = "_", x = colnames(x = SingleCellExperiment::reducedDim(x = x, type = dr))[1] ) } else { key <- gsub( pattern = "[[:digit:]]", replacement = "", x = colnames(x = SingleCellExperiment::reducedDim(x = x, type = dr))[1] ) } if (length(x = key) == 0) { key <- paste0(dr, "_") } colnames(x = embeddings) <- paste0(key, 1:ncol(x = embeddings)) object[[dr]] <- CreateDimReducObject( embeddings = embeddings, key = key, assay = DefaultAssay(object = object) ) } } } return(object) } #' @param assay Assays to convert #' #' @rdname as.SingleCellExperiment #' @concept objects #' @export #' @method as.SingleCellExperiment Seurat #' @importFrom SeuratObject .FilterObjects #' as.SingleCellExperiment.Seurat <- function(x, assay = NULL, ...) { CheckDots(...) if (isFALSE(x = requireNamespace('SingleCellExperiment', quietly = TRUE))) { stop("Please install SingleCellExperiment from Bioconductor before converting to a SingleCellExperiment object") } assay <- assay %||% Assays(object = x) if (!all(assay %in% Assays(object = x))) { stop("One or more of the assays you are trying to convert is not in the Seurat object") } if (DefaultAssay(object = x) %in% assay) { assay <- union(DefaultAssay(object = x), assay) } experiments <- list() for (assayn in assay) { assays <- list( counts = GetAssayData(object = x, assay = assayn, layer = "counts"), logcounts = GetAssayData(object = x, assay = assayn, layer = "data") ) scaledata_a <- GetAssayData(object = x, assay = assayn, layer = "scale.data") if (isTRUE(x = all.equal( target = dim(x = assays[["counts"]]), current = dim(x = scaledata_a)) )) { assays[["scaledata"]] <- scaledata_a } assays <- assays[sapply(X = assays, FUN = nrow) != 0] sume <- SummarizedExperiment::SummarizedExperiment(assays = assays) experiments[[assayn]] <- sume } # create one single cell experiment sce <- as(object = experiments[[1]], Class = "SingleCellExperiment") orig.exp.name <- names(x = experiments[1]) if (packageVersion(pkg = "SingleCellExperiment") >= "1.14.0") { SingleCellExperiment::mainExpName(sce) <- names(x = experiments[1]) } if (length(x = experiments) > 1) { sce <- SingleCellExperiment::SingleCellExperiment(sce, altExps = experiments) sce <- SingleCellExperiment::swapAltExp( x = sce, name = orig.exp.name, saved = NULL ) } metadata <- x[[]] metadata$ident <- Idents(object = x) SummarizedExperiment::colData(x = sce) <- S4Vectors::DataFrame(metadata) for (assayn in assay) { if (assayn != orig.exp.name) { sce <- SingleCellExperiment::swapAltExp( x = sce, name = assayn, saved = orig.exp.name ) SummarizedExperiment::rowData(x = sce) <- S4Vectors::DataFrame(x[[assayn]][[]]) sce <- SingleCellExperiment::swapAltExp( x = sce, name = orig.exp.name, saved = assayn ) } } for (dr in .FilterObjects(object = x, classes.keep = "DimReduc")) { assay.used <- DefaultAssay(object = x[[dr]]) swap.exp <- assay.used %in% SingleCellExperiment::altExpNames(x = sce) & assay.used != orig.exp.name if (swap.exp) { sce <- SingleCellExperiment::swapAltExp( x = sce, name = assay.used, saved = orig.exp.name ) } SingleCellExperiment::reducedDim(x = sce, type = toupper(x = dr)) <- Embeddings(object = x[[dr]]) if (swap.exp) { sce <- SingleCellExperiment::swapAltExp( x = sce, name = orig.exp.name, saved = assay.used ) } } return(sce) } #' Cast to Sparse #' #' @inheritParams SeuratObject::as.sparse #' #' @importFrom methods is #' @importFrom Matrix sparseMatrix #' #' @rdname as.sparse #' @concept objects #' @export #' @method as.sparse H5Group #' #' #' @seealso \code{\link[SeuratObject:as.sparse]{SeuratObject::as.sparse}} #' as.sparse.H5Group <- function(x, ...) { CheckDots(...) for (i in c('data', 'indices', 'indptr')) { if (!x$exists(name = i) || !is(object = x[[i]], class2 = 'H5D')) { stop("Invalid H5Group specification for a sparse matrix, missing dataset ", i) } } if ('h5sparse_shape' %in% hdf5r::h5attr_names(x = x)) { return(sparseMatrix( i = x[['indices']][] + 1, p = x[['indptr']][], x = x[['data']][], dims = rev(x = hdf5r::h5attr(x = x, which = 'h5sparse_shape')) )) } return(sparseMatrix( i = x[['indices']][] + 1, p = x[['indptr']][], x = x[['data']][] )) } #' @method as.sparse IterableMatrix #' @export #' as.sparse.IterableMatrix <- function(x, ...) { return(as(object = x, Class = 'dgCMatrix')) } #' Get Cell Names #' #' @inheritParams SeuratObject::Cells #' #' @rdname Cells #' @concept objects #' @method Cells SCTModel #' @export #' Cells.SCTModel <- function(x, ...) { return(rownames(x = slot(object = x, name = "cell.attributes"))) } #' @method Cells SCTAssay #' @export #' Cells.SCTAssay <- function(x, layer = NA, ...) { # If `layer` is `NA` return all cells in the assay via `colnames`. if (rlang::is_na(layer)) { return(colnames(x)) } # If `layer` is `NULL` take the name of the first model in the # assay's `SCTModel.list`. layer <- layer %||% levels(x)[1L] # If `layer` is one of the standard layer names, use the underlying matrix # to get the requested cell names. if (layer %in% Layers(x)) { data <- LayerData(x, layer=layer) cells <- colnames(data) } else { # Otherwise, assume that `layer` is the name of an element in `SCTModel.list`. cells <- Cells(components(x, model = layer)) } return(cells) } #' @rdname Cells #' @concept objects #' @concept spatial #' @method Cells SlideSeq #' @export #' #' @seealso \code{\link[SeuratObject:Cells]{SeuratObject::Cells}} #' Cells.SlideSeq <- function(x, ...) { return(rownames(x = GetTissueCoordinates(object = x))) } #' @rdname Cells #' @concept objects #' @concept spatial #' @method Cells STARmap #' @export #' Cells.STARmap <- function(x, ...) { return(rownames(x = GetTissueCoordinates(object = x))) } #' @rdname Cells #' @concept objects #' @method Cells VisiumV1 #' @export #' Cells.VisiumV1 <- function(x, ...) { return(rownames(x = GetTissueCoordinates(object = x, scale = NULL))) } #' @importFrom SeuratObject DefaultLayer Layers #' #' @method Features SCTAssay #' @export #' Features.SCTAssay <- function(x, layer = NA, ...) { layer <- layer %||% DefaultLayer(object = x) if (rlang::is_na(x = layer)) { return(rownames(x = x)) } layer <- rlang::arg_match( arg = layer, values = c(Layers(object = x), levels(x = x))) if (layer %in% levels(x = x)) { return(Features(x = components(object = x, model = layer))) } return(NextMethod()) } #' @method Features SCTModel #' @export #' Features.SCTModel <- function(x, ...) { return(rownames(x = SCTResults(object = x, slot = 'feature.attributes'))) } #' @param assay Assay to get #' #' @rdname GetAssay #' @concept objects #' @export #' @method GetAssay Seurat #' #' @examples #' data("pbmc_small") #' GetAssay(object = pbmc_small, assay = "RNA") #' GetAssay.Seurat <- function(object, assay = NULL, ...) { CheckDots(...) assay <- assay %||% DefaultAssay(object = object) object.assays <- FilterObjects( object = object, classes.keep = c('Assay', 'Assay5')) if (!assay %in% object.assays) { stop(paste0( assay, " is not an assay present in the given object. Available assays are: ", paste(object.assays, collapse = ", ") )) } return(slot(object = object, name = 'assays')[[assay]]) } #' Get Image Data #' #' @inheritParams SeuratObject::GetImage #' #' @rdname GetImage #' @method GetImage SlideSeq #' @concept objects #' @concept spatial #' @export #' #' @seealso \code{\link[SeuratObject:GetImage]{SeuratObject::GetImage}} #' GetImage.SlideSeq <- function( object, mode = c('grob', 'raster', 'plotly', 'raw'), ... ) { mode <- match.arg(arg = mode) return(NullImage(mode = mode)) } #' @rdname GetImage #' @method GetImage STARmap #' @concept objects #' @concept spatial #' @export #' GetImage.STARmap <- function( object, mode = c('grob', 'raster', 'plotly', 'raw'), ... ) { mode <- match.arg(arg = mode) return(NullImage(mode = mode)) } #' @importFrom plotly raster2uri #' @importFrom grDevices as.raster #' @importFrom grid rasterGrob unit #' #' @rdname GetImage #' @concept objects #' @concept spatial #' @method GetImage VisiumV1 #' @export #' GetImage.VisiumV1 <- function( object, mode = c('grob', 'raster', 'plotly', 'raw'), ... ) { mode <- match.arg(arg = mode) image <- slot(object = object, name = 'image') image <- switch( EXPR = mode, 'grob' = rasterGrob( image = image, width = unit(x = 1, units = 'npc'), height = unit(x = 1, units = 'npc') ), 'raster' = as.raster(x = image), 'plotly' = list( source = raster2uri(GetImage(object, mode = 'raster')), xref = 'x', yref = 'y', sizex = ncol(x = object), sizey = nrow(x = object), sizing = 'stretch', opacity = 1, layer = 'below' ), 'raw' = image, stop("Unknown image mode: ", mode, call. = FALSE) ) return(image) } #' #' @rdname GetImage #' @concept objects #' @concept spatial #' @method GetImage VisiumV2 #' @export #' GetImage.VisiumV2 <- GetImage.VisiumV1 #' Get Tissue Coordinates #' #' @inheritParams SeuratObject::GetTissueCoordinates #' #' @rdname GetTissueCoordinates #' @method GetTissueCoordinates SlideSeq #' @concept objects #' @concept spatial #' @export #' #' @seealso \code{\link[SeuratObject:GetTissueCoordinates]{SeuratObject::GetTissueCoordinates}} #' GetTissueCoordinates.SlideSeq <- function(object, ...) { coords <- slot(object = object, name = 'coordinates') colnames(x = coords) <- c('x', 'y') # coords$y <- -rev(x = coords$y) + 1 # coords$y <- FlipCoords(x = coords$y) coords$cells <- rownames(x = coords) return(coords) } #' @param qhulls return qhulls instead of centroids #' #' @rdname GetTissueCoordinates #' @method GetTissueCoordinates STARmap #' @concept objects #' @concept spatial #' @export #' GetTissueCoordinates.STARmap <- function(object, qhulls = FALSE, ...) { if (qhulls) { return(slot(object = object, name = 'qhulls')) } return(slot(object = object, name = 'coordinates')) } #' @param scale A factor to scale the coordinates by; choose from: 'tissue', #' 'fiducial', 'hires', 'lowres', or \code{NULL} for no scaling #' @param cols Columns of tissue coordinates data.frame to pull #' #' @rdname GetTissueCoordinates #' @method GetTissueCoordinates VisiumV1 #' @concept objects #' @concept spatial #' @export #' GetTissueCoordinates.VisiumV1 <- function( object, scale = 'lowres', cols = c('imagerow', 'imagecol'), ... ) { cols <- cols %||% colnames(x = slot(object = object, name = 'coordinates')) if (!is.null(x = scale)) { coordinates <- slot( object = object, name = 'coordinates')[, c('imagerow', 'imagecol')] scale <- match.arg( arg = scale, choices = c('spot', 'fiducial', 'hires', 'lowres')) scale.use <- ScaleFactors(object = object)[[scale]] coordinates <- coordinates * scale.use } else { coordinates <- slot(object = object, name = 'coordinates')[, cols] } return(coordinates) } #' @rdname GetTissueCoordinates #' @method GetTissueCoordinates VisiumV2 #' @export #' GetTissueCoordinates.VisiumV2 <- function( object, scale = NULL, ... ) { # make call to GetTissueCoordinates.FOV coordinates <- NextMethod(object, ...) dots <- list(...) which <- dots$which %||% DefaultBoundary(object = object) which <- match.arg(arg = which, choices = names(x = object)) # do some cleanup of the resulting data.frame to make it play nice # with `SpatialPlot` - namely set rownames and re-order the columns so # that the actual position values appear first # avoid extra processing for Segmentation objects, # otherwise "duplicate 'row.names' are not allowed" error occurs if (!(inherits(object[[which]], "Segmentation"))) { rownames(coordinates) <- coordinates[["cell"]] } coordinates <- coordinates[, c("x", "y", "cell")] if (!is.null(scale)) { # scale the coordinates by the specified factor scale <- match.arg(scale, choices = c("lowres", "hires")) scale.factor <- ScaleFactors(object)[[scale]] coordinates[, c("x", "y")] <- coordinates[, c("x", "y")] * scale.factor } return (coordinates) } #' Get Variable Feature Information #' #' Get variable feature information from \code{\link{SCTAssay}} objects #' #' @inheritParams SeuratObject::HVFInfo #' @param method method to determine variable features #' #' @export #' @concept objects #' @method HVFInfo SCTAssay #' #' @seealso \code{\link[SeuratObject]{HVFInfo}} #' #' @examples #' \dontrun{ #' # Get the HVF info directly from an SCTAssay object #' pbmc_small <- SCTransform(pbmc_small) #' HVFInfo(pbmc_small[["SCT"]], method = 'sct')[1:5, ] #' } #' HVFInfo.SCTAssay <- function(object, method, status = FALSE, ...) { CheckDots(...) disp.methods <- c('mean.var.plot', 'dispersion', 'disp') if (tolower(x = method) %in% disp.methods) { method <- 'mvp' } method <- switch( EXPR = tolower(x = method), 'sctransform' = 'sct', method ) vars <- c('gmean', 'variance', 'residual_variance') hvf.info <- SCTResults(object = object, slot = "feature.attributes")[,vars] if (status) { hvf.info$variable <- FALSE hvf.info[VariableFeatures(object = object), "variable"] <- TRUE } return(hvf.info) } #' Get Spot Radius #' #' @inheritParams SeuratObject::Radius #' #' @rdname Radius #' @concept objects #' @concept spatial #' @method Radius SlideSeq #' @export #' #' @seealso \code{\link[SeuratObject:Radius]{SeuratObject::Radius}} #' Radius.SlideSeq <- function(object, ...) { return(0.005) } #' @rdname Radius #' @concept objects #' @concept spatial #' @method Radius STARmap #' @export #' Radius.STARmap <- function(object, ...) { return(NULL) } #' #' @param scale A factor to scale the radius by; one of: "hires", #' "lowres", or \code{NULL} for the unscaled value. #' #' @rdname Radius #' @concept objects #' @concept spatial #' @method Radius VisiumV1 #' @export #' Radius.VisiumV1 <- function(object, scale = "lowres", ...) { scale.factors <- ScaleFactors(object = object) spot.size <- scale.factors[["spot"]] scale.factor <- scale.factors[[ match.arg(scale, choices = c("hires", "lowres")) ]] image.size <- max(dim(GetImage(object, resolution=scale)$raster)) return ((spot.size * scale.factor) / image.size) } #' @rdname Radius #' @concept objects #' @concept spatial #' @method Radius VisiumV1 #' @export #' Radius.VisiumV2 <- Radius.VisiumV1 #' @rdname RenameCells #' @export #' @concept objects #' @method RenameCells SCTAssay #' RenameCells.SCTAssay <- function(object, new.names = NULL, ...) { CheckDots(...) old.names <- Cells(x = object) names(x = new.names) <- old.names cell.attributes <- SCTResults(object = object, slot = "cell.attributes") if (length(x = cell.attributes) > 0) { if (is.data.frame(x = cell.attributes)) { old.names <- rownames(x = cell.attributes) rownames(x = cell.attributes) <- unname(obj = new.names[old.names]) } else { cell.attributes <- lapply( X = cell.attributes, FUN = function(x) { old.names <- rownames(x = x) rownames(x = x) <- unname(obj = new.names[old.names]) return(x) } ) } SCTResults(object = object, slot = "cell.attributes") <- cell.attributes } new.names <- unname(obj = new.names) object <- NextMethod() return(object) } #' Rename Cells in an Object #' #' @inheritParams SeuratObject::RenameCells #' #' @rdname RenameCells #' @concept objects #' @method RenameCells SlideSeq #' @export #' #' @seealso \code{\link[SeuratObject:RenameCells]{SeuratObject::RenameCells}} #' RenameCells.SlideSeq <- function(object, new.names = NULL, ...) { return(RenameCells.VisiumV1(object = object, new.names = new.names)) } #' @rdname RenameCells #' @concept objects #' @method RenameCells STARmap #' @export #' RenameCells.STARmap <- function(object, new.names = NULL, ...) { names(x = new.names) <- Cells(x = object) object <- RenameCells.VisiumV1(object = object, new.names = new.names) qhulls <- GetTissueCoordinates(object = object, qhull = TRUE) qhulls$cell <- new.names[qhulls$cell] slot(object = object, name = "qhulls") <- qhulls return(object) } #' @rdname RenameCells #' @concept objects #' @method RenameCells VisiumV1 #' @export #' RenameCells.VisiumV1 <- function(object, new.names = NULL, ...) { if (is.null(x = new.names)) { return(object) } else if (length(x = new.names) != length(x = Cells(x = object))) { stop("Wrong number of cell/spot names", call. = FALSE) } names(x = new.names) <- Cells(x = object) coordinates <- GetTissueCoordinates(object = object, scale = NULL, cols = NULL) rownames(x = coordinates) <- new.names[rownames(x = coordinates)] slot(object = object, name = 'coordinates') <- coordinates return(object) } #' @rdname SCTResults #' @export #' @method SCTResults SCTModel #' SCTResults.SCTModel <- function(object, slot, ...) { CheckDots(...) slots.use <- c('feature.attributes', 'cell.attributes', 'clips','umi.assay', 'model', 'arguments', 'median_umi') if (!slot %in% slots.use) { stop( "'slot' must be one of ", paste(slots.use, collapse = ', '), call. = FALSE ) } return(slot(object = object, name = slot)) } #' @rdname SCTResults #' @concept objects #' @export #' @method SCTResults<- SCTModel #' "SCTResults<-.SCTModel" <- function(object, slot, ..., value) { slots.use <- c('feature.attributes', 'cell.attributes', 'clips','umi.assay', 'model', 'arguments', 'median_umi') if (!slot %in% slots.use) { stop( "'slot' must be one of ", paste(slots.use, collapse = ', '), call. = FALSE ) } slot(object = object, name = slot) <- value return(object) } #' @param slot Which slot to pull the SCT results from #' @param model Name of SCModel to pull result from. Available names can be #' retrieved with \code{levels}. #' #' @return Returns the value present in the requested slot for the requested #' group. If group is not specified, returns a list of slot results for each #' group unless there is only one group present (in which case it just returns #' the slot directly). #' #' @rdname SCTResults #' @concept objects #' @export #' @method SCTResults SCTAssay #' SCTResults.SCTAssay <- function(object, slot, model = NULL, ...) { CheckDots(...) slots.use <- c('feature.attributes', 'cell.attributes', 'clips', 'umi.assay', 'model', 'arguments', 'median_umi') if (!slot %in% slots.use) { stop( "'slot' must be one of ", paste(slots.use, collapse = ', '), call. = FALSE ) } model <- model %||% levels(x = object) model.list <- slot(object = object, name = "SCTModel.list")[model] results.list <- lapply(X = model.list, FUN = function(x) SCTResults(object = x, slot = slot)) if (length(x = results.list) == 1) { results.list <- results.list[[1]] } return(results.list) } #' @rdname SCTResults #' @concept objects #' @export #' @method SCTResults<- SCTAssay #' "SCTResults<-.SCTAssay" <- function(object, slot, model = NULL, ..., value) { slots.use <- c('feature.attributes', 'cell.attributes', 'clips','umi.assay', 'model', 'arguments', 'median_umi') if (!slot %in% slots.use) { stop( "'slot' must be one of ", paste(slots.use, collapse = ', '), call. = FALSE ) } model <- model %||% levels(x = object) model.list <- slot(object = object, name = "SCTModel.list")[model] if (!is.list(x = value) | is.data.frame(x = value)) { value <- list(value) } model.names <- names(x = model.list) model.list <- lapply( X = 1:length(x = model.list), FUN = function(x) { SCTResults(object = model.list[[x]], slot = slot) <- value[[x]] return(model.list[[x]]) } ) names(x = model.list) <- model.names slot(object = object, name = "SCTModel.list")[model.names] <- model.list return(object) } #' @param assay Assay in the Seurat object to pull from #' #' @rdname SCTResults #' @export #' @concept objects #' @method SCTResults Seurat #' SCTResults.Seurat <- function(object, assay = "SCT", slot, model = NULL, ...) { CheckDots(...) return(SCTResults(object = object[[assay]], slot = slot, model = model, ...)) } #' @importFrom utils head #' @method VariableFeatures SCTModel #' @export #' VariableFeatures.SCTModel <- function(object, method = NULL, nfeatures = 3000, ...) { if (!is_scalar_integerish(x = nfeatures) || (!is_na(x = nfeatures < 1L) && nfeatures < 1L)) { abort(message = "'nfeatures' must be a single positive integer") } feature.attr <- SCTResults(object = object, slot = 'feature.attributes') feature.variance <- feature.attr[, 'residual_variance'] names(x = feature.variance) <- row.names(x = feature.attr) feature.variance <- sort(x = feature.variance, decreasing = TRUE) if (is_na(x = nfeatures)) { return(names(x = feature.variance)) } return(head(x = names(x = feature.variance), n = nfeatures)) } #' @importFrom utils head #' @method VariableFeatures SCTAssay #' @export #' VariableFeatures.SCTAssay <- function( object, method = NULL, layer = NULL, nfeatures = NULL, simplify = TRUE, use.var.features = TRUE, ... ) { # Is the information already in var.features? var.features.existing <- slot(object = object, name = "var.features") nfeatures <- nfeatures %||% length(x = var.features.existing) %||% 3000 if (is.null(x = layer) || anyNA(layer)) { layer <- levels(x = object) } if (simplify == TRUE & use.var.features == TRUE & length(var.features.existing) >= nfeatures){ return(head(x = var.features.existing, n = nfeatures)) } layer <- match.arg(arg = layer, choices = levels(x = object), several.ok = TRUE) # run variable features on each model vf.list <- sapply( X = layer, FUN = function(lyr) { return(VariableFeatures( object = components(object = object, model = lyr), nfeatures = nfeatures, ... )) }, simplify = FALSE, USE.NAMES = TRUE ) if (isFALSE(x = simplify)){ return(vf.list) } var.features <- sort( x = table(unlist(x = vf.list, use.names = FALSE)), decreasing = TRUE ) if (length(x = var.features) == 0) { return(NULL) } tie.val <- var.features[min(nfeatures, length(x = var.features))] features <- names(x = var.features[which(x = var.features > tie.val)]) if (length(x = features) > 0) { feature.ranks <- sapply(X = features, FUN = function(x) { ranks <- sapply(X = vf.list, FUN = function(vf) { if (x %in% vf) { return(which(x = x == vf)) } return(NULL) }) median(x = unlist(x = ranks)) }) features <- names(x = sort(x = feature.ranks)) } features.tie <- var.features[which(x = var.features == tie.val)] tie.ranks <- sapply(X = names(x = features.tie), FUN = function(x) { ranks <- sapply(X = vf.list, FUN = function(vf) { if (x %in% vf) { return(which(x = x == vf)) } return(NULL) }) median(x = unlist(x = ranks)) }) features <- c( features, names(x = head(x = sort(x = tie.ranks), nfeatures - length(x = features))) ) return(features) } #' @rdname ScaleFactors #' @method ScaleFactors SlideSeq #' @export #' @concept spatial #' ScaleFactors.SlideSeq <- function(object, ...) { # The concept of image scale factors comes from the 10x Visium platform. # Although SlideSeq has no equivalent, we still want to provide the generic # so that the all of our concrete `SpatialImage` classes implement the same # interface, so we'll return an S3 `scalefactors` object with all values set # to 1. return(scalefactors()) } #' @rdname ScaleFactors #' @method ScaleFactors STARmap #' @export #' @concept spatial #' ScaleFactors.STARmap <- function(object, ...) { # The concept of image scale factors comes from the 10x Visium platform. # Although STARmap has no equivalent, we still want to provide the generic # so that the all of our concrete `SpatialImage` classes implement the same # interface, so we'll return an S3 `scalefactors` object with all values set # to 1. return(scalefactors()) } #' @rdname ScaleFactors #' @method ScaleFactors VisiumV1 #' @export #' @concept spatial #' ScaleFactors.VisiumV1 <- function(object, ...) { return(slot(object = object, name = 'scale.factors')) } #' @rdname ScaleFactors #' @method ScaleFactors VisiumV2 #' @export #' @concept spatial #' ScaleFactors.VisiumV2 <- ScaleFactors.VisiumV1 #' @method FetchData VisiumV1 #' @export #' @concept spatial #' FetchData.VisiumV1 <- function( object, vars, cells = NULL, ... ) { if (is.numeric(x = cells)) { cells <- Cells(x = object)[cells] } else if (is.null(x = cells)) { cells <- Cells(x = object) } vars.unkeyed <- gsub(pattern = paste0('^', Key(object)), replacement = '', x = vars) coords <- GetTissueCoordinates(object = object)[cells, vars.unkeyed, drop = FALSE] colnames(x = coords) <- vars return(coords) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for R-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @method [ SlideSeq #' @concept objects #' @export #' "[.SlideSeq" <- function(x, i, ...) { return(subset(x = x, cells = i, ...)) } #' @method [ VisiumV1 #' @export #' "[.VisiumV1" <- function(x, i, ...) { return(subset(x = x, cells = i)) } #' @method components SCTAssay #' @export #' components.SCTAssay <- function(object, model, ...) { model <- rlang::arg_match(arg = model, values = levels(x = object)) return(slot(object = object, name = 'SCTModel.list')[[model]]) } #' @method dim SlideSeq #' @concept objects #' @export #' dim.SlideSeq <- function(x) { # return(dim(x = GetImage(object = x, mode = 'raw'))) return(c(599, 600)) } #' @method dim STARmap #' @concept objects #' @export #' dim.STARmap <- function(x) { coords <- GetTissueCoordinates(object = x) return(c( max(coords[, 1]) - min(coords[, 1]), max(coords[, 2]) - min(coords[, 2]) )) } #' @method dim VisiumV1 #' @concept objects #' @export #' dim.VisiumV1 <- function(x) { return(dim(x = GetImage(object = x)$raster)) } #' @method dim VisiumV2 #' @concept objects #' @export #' dim.VisiumV2 <- dim.VisiumV1 #' @rdname SCTAssay-class #' @name SCTAssay-class #' #' @section Get and set SCT model names: #' SCT results are named by initial run of \code{\link{SCTransform}} in order #' to keep SCT parameters straight between runs. When working with merged #' \code{SCTAssay} objects, these model names are important. \code{levels} #' allows querying the models present. \code{levels<-} allows the changing of #' the names of the models present, useful when merging \code{SCTAssay} objects. #' Note: unlike normal \code{\link[base]{levels<-}}, \code{levels<-.SCTAssay} #' allows complete changing of model names, not reordering. #' #' @param x An \code{SCTAssay} object #' #' @return \code{levels}: SCT model names #' #' @export #' @concept objects #' @method levels SCTAssay #' #' @examples #' \dontrun{ #' # Query and change SCT model names #' levels(pbmc_small[['SCT']]) #' levels(pbmc_small[['SCT']]) <- '3' #' levels(pbmc_small[['SCT']]) #' } #' levels.SCTAssay <- function(x) { return(names(x = slot(object = x, name = "SCTModel.list"))) } #' @rdname SCTAssay-class #' @name SCTAssay-class #' #' @param value New levels, must be in the same order as the levels present #' #' @return \code{levels<-}: \code{x} with updated SCT model names #' #' @export #' @concept objects #' @method levels<- SCTAssay #' "levels<-.SCTAssay" <- function(x, value) { value <- sapply(X = value, FUN = function(v) { if (suppressWarnings(expr = !is.na(x = as.numeric(x = v)))) { warning("SCTModel groups cannot be number, group is added in front of ", v) v <- paste0("group", v) } return (v) }) # Get current levels levels <- levels(x = x) if (length(x = value) != length(x = levels)) { stop("Must provide a vector of length ", length(x = levels), " as new levels.", call. = FALSE) } names(x = slot(object = x, name = "SCTModel.list")) <- value return(x) } #' Merge SCTAssay objects #' #' @inheritParams SeuratObject::merge #' @param x A \code{\link[SeuratObject]{Seurat}} object #' @param na.rm If na.rm = TRUE, this will only preserve residuals that are #' present in all SCTAssays being merged. Otherwise, missing residuals will be #' populated with NAs. #' @export #' @method merge SCTAssay #' @concept objects #' merge.SCTAssay <- function( x = NULL, y = NULL, add.cell.ids = NULL, merge.data = TRUE, na.rm = TRUE, ... ) { assays <- c(x, y) if (any(sapply( X = assays, FUN = function(assay.i) inherits(x = assay.i, what = "Assay5") ))) { return(merge(x = as(x, "Assay5"), y, ...)) } parent.call <- grep(pattern = "merge.Seurat", x = sys.calls()) if (length(x = parent.call) > 0) { # Try and fill in missing residuals if called in the context of merge.Seurat all.features <- unique( x = unlist( x = lapply( X = assays, FUN = function(assay) { if (inherits(x = assay, what = "SCTAssay")) { return(rownames(x = GetAssayData(object = assay, layer= "scale.data"))) } }) ) ) if (!is.null(all.features)) { assays <- lapply(X = 1:length(x = assays), FUN = function(assay) { if (inherits(x = assays[[assay]], what = "SCTAssay")) { parent.environ <- sys.frame(which = parent.call[1]) seurat.object <- parent.environ$objects[[assay]] residuals <- suppressWarnings(expr = FetchResiduals(object = seurat.object, features = all.features, assay = parent.environ$assay, verbose = FALSE)) seurat.object <- SetAssayData( object = seurat.object, assay = parent.environ$assay, layer = "scale.data", new.data = residuals ) return(seurat.object[[parent.environ$assay]]) } return(assays[[assay]]) }) } } sct.check <- sapply(X = assays, FUN = function(x) inherits(x = x, what = "SCTAssay")) if (any(!sct.check)) { warning("Attempting to merge an SCTAssay with another Assay type \n", "Converting all to standard Assay objects.", call. = FALSE) assays <- lapply(1:length(x = assays), FUN = function(x) { if (sct.check[x]) { assays[[x]] <- as(object = assays[[x]], Class = "Assay") } return(assays[[x]]) }) combined.assay <- merge( x = assays[[1]], y = assays[2:length(x = assays)], add.cell.ids = add.cell.ids, merge.data = merge.data ) return(combined.assay) } combined.assay <- NextMethod() all.levels <- unlist(x = lapply(X = assays, FUN = levels)) while (anyDuplicated(x = all.levels)) { levels.duplicate <- which(x = duplicated(x = all.levels)) all.levels <- sapply(X = 1:length(x = all.levels), FUN = function(l) { if (l %in% levels.duplicate) { return(tryCatch( expr = as.numeric(x = all.levels[l]) + 1, warning = function(...) { make.unique(names = all.levels)[l] }, error = function(...){ make.unique(names = all.levels)[l] } )) } else { return(all.levels[l]) } }) } scale.data <- lapply(X = assays, FUN = function(x) { dat <- GetAssayData(object = x, layer = "scale.data") if (ncol(x = dat) == 0) { dat <- matrix(ncol = ncol(x = x)) } return(dat) }) all.features <- lapply(X = scale.data, FUN = rownames) if (na.rm) { # merge intersection of possible residuals scaled.features <- names(x = which(x = table(x = unlist(x = all.features)) == length(x = assays))) if (length(x = scaled.features) == 0) { scale.data <- list(new(Class = "matrix")) } else { scale.data <- lapply(X = scale.data, FUN = function(x) x[scaled.features, ]) } } else { scaled.features <- unique(x = unlist(x = all.features)) scale.data <- lapply(X = 1:length(x = scale.data), FUN = function(x) { na.features <- setdiff(x = scaled.features, y = rownames(x = scale.data[[x]])) na.mat <- matrix( data = NA, nrow = length(x = na.features), ncol = ncol(x = assays[[x]]), dimnames = list(na.features, colnames(x = assays[[x]])) ) return(rbind(scale.data[[x]], na.mat)[scaled.features, ]) }) } scale.data <- do.call(what = cbind, args = scale.data) combined.assay <- SetAssayData(object = combined.assay, layer= "scale.data", new.data = scale.data) model.list <- unlist(x = lapply( X = assays, FUN = slot, name = "SCTModel.list" )) names(x = model.list) <- all.levels model.list <- model.list %||% list() combined.assay <- new( Class = "SCTAssay", combined.assay, SCTModel.list = model.list ) features <- VariableFeatures(object = combined.assay) VariableFeatures(object = combined.assay) <- features return(combined.assay) } #' Subset an AnchorSet object #' #' @inheritParams base::subset #' @param score.threshold Only anchor pairs with scores greater than this value #' are retained. #' @param disallowed.dataset.pairs Remove any anchors formed between the #' provided pairs. E.g. \code{list(c(1, 5), c(1, 2))} filters out any anchors between #' datasets 1 and 5 and datasets 1 and 2. #' @param dataset.matrix Provide a binary matrix specifying whether a dataset #' pair is allowable (1) or not (0). Should be a dataset x dataset matrix. #' @param group.by Grouping variable to determine allowable ident pairs #' @param disallowed.ident.pairs Remove any anchors formed between provided #' ident pairs. E.g. \code{list(c("CD4", "CD8"), c("B-cell", "T-cell"))} #' @param ident.matrix Provide a binary matrix specifying whether an ident pair #' is allowable (1) or not (0). Should be an ident x ident symmetric matrix #' #' @return Returns an \code{\link{AnchorSet}} object with specified anchors #' filtered out #' #' @export #' @method subset AnchorSet #' @concept objects #' subset.AnchorSet <- function( x, score.threshold = NULL, disallowed.dataset.pairs = NULL, dataset.matrix = NULL, group.by = NULL, disallowed.ident.pairs = NULL, ident.matrix = NULL, ... ) { if (!is.null(x = disallowed.dataset.pairs) && !is.null(x = dataset.matrix)) { stop("Please use either disallowed.dataset.pairs OR dataset.matrix, not both.") } # Filter based on scores if (!is.null(x = score.threshold)) { if (score.threshold > 1 | score.threshold < 0) { stop( "Anchors are scored on a scale between 0 and 1. Please provide a value", " in that range to score.threshold." ) } anchors <- slot(object = x, name = "anchors") anchors <- anchors[anchors[, 'score'] > score.threshold, , drop = FALSE] slot(object = x, name = "anchors") <- anchors } object.names <- names(x = slot(object = x, name = "object.list")) num.obs <- length(x = object.names) # Filter based on dataset pairings if (!is.null(x = disallowed.dataset.pairs)) { dataset.matrix <- matrix(data = 1, nrow = num.obs, ncol = num.obs) for(i in 1:length(x = disallowed.dataset.pairs)) { pair <- disallowed.dataset.pairs[[i]] if (length(x = pair) != 2) { stop("Please ensure all list items in disallowed.dataset.pairs are of length 2.") } if (any(pair %in% object.names)) { pair[which(pair %in% object.names)] <- sapply( X = pair[which(pair %in% object.names)], FUN = function(x) { which(object.names == x) }) } pair <- as.numeric(x = pair) dataset.matrix[pair[1], pair[2]] <- 0 } } if (!is.null(x = dataset.matrix)) { if (any(dim(x = dataset.matrix) != c(num.obs, num.obs))){ stop("Please provide a dataset.matrix that is ", num.obs, " x ", num.obs, ".") } anchors <- slot(object = x, name = "anchors") pairs <- which(dataset.matrix == 0, arr.ind = TRUE) for (i in 1:nrow(x = pairs)) { anchors <- anchors[-which(x = anchors$dataset1 == pairs[i, 1] & anchors$dataset2 == pairs[i, 2]), ] anchors <- anchors[-which(x = anchors$dataset1 == pairs[i, 2] & anchors$dataset2 == pairs[i, 1]), ] } slot(object = x, name = "anchors") <- anchors } # Filter based on ident pairings if (!is.null(x = group.by)) { anchors <- AnnotateAnchors(anchors = x, vars = group.by) if (!is.null(x = disallowed.ident.pairs) && !is.null(x = ident.matrix)) { stop("Please use either disallowed.ident.pairs OR ident.matrix, not both.") } unique.ids <- unique(x = c( as.character(x = anchors[, paste0("cell1.", group.by)]), as.character(x = anchors[, paste0("cell2.", group.by)])) ) unique.ids <- unique.ids[!is.na(x = unique.ids)] num.ids <- length(x = unique.ids) if (!is.null(x = disallowed.ident.pairs)) { ident.matrix <- matrix(data = 1, nrow = num.ids, ncol = num.ids) rownames(x = ident.matrix) <- unique.ids colnames(x = ident.matrix) <- unique.ids for(i in 1:length(x = disallowed.ident.pairs)) { pair <- disallowed.ident.pairs[[i]] if (length(x = pair) != 2) { stop("Please ensure all list items in disallowed.dataset.pairs are of length 2.") } ident.matrix[pair[1], pair[2]] <- 0 } } if (!is.null(x = ident.matrix)) { if (any(dim(x = ident.matrix) != c(num.ids, num.ids))){ stop("Please provide a dataset.matrix that is ", num.ids, " x ", num.ids, ".") } to.remove <- c() pairs <- which(ident.matrix == 0, arr.ind = TRUE) for (i in 1:nrow(x = pairs)) { id1 <- rownames(x = ident.matrix)[pairs[i, 1]] id2 <- colnames(x = ident.matrix)[pairs[i, 2]] to.remove <- c(to.remove, which(x = anchors[, paste0("cell1.", group.by)] == id1 & anchors[, paste0("cell2.", group.by)] == id2)) to.remove <- c(to.remove, which(x = anchors[, paste0("cell1.", group.by)] == id2 & anchors[, paste0("cell2.", group.by)] == id1)) } anchors <- slot(object = x, name = "anchors") anchors <- anchors[-to.remove, ] slot(object = x, name = "anchors") <- anchors } } return(x) } #' @export #' @method subset SCTAssay #' @concept objects #' subset.SCTAssay <- function(x, cells = NULL, features = NULL, ...) { x <- NextMethod() models <- levels(x = x) for (m in models) { attr <- SCTResults(object = x, slot = "cell.attributes", model = m) attr <- attr[intersect(x = rownames(x = attr), y = Cells(x = x)), , drop = FALSE] SCTResults(object = x, slot = "cell.attributes", model = m) <- attr if (nrow(x = attr) == 0) { slot(object = x, name = 'SCTModel.list')[[m]] <- NULL } } return(x) } #' @method subset SlideSeq #' @concept objects #' @export #' subset.SlideSeq <- function(x, cells, ...) { x <- subset.VisiumV1(x = x, cells = cells, ...) return(x) } #' @method subset STARmap #' @concept objects #' @export #' subset.STARmap <- function(x, cells, ...) { x <- subset.VisiumV1(x = x, cells = cells, ...) qhulls <- GetTissueCoordinates(object = x, qhulls = TRUE) qhulls <- qhulls[qhulls$cell %in% cells, ] slot(object = x, name = 'qhulls') <- qhulls return(x) } #' @method subset VisiumV1 #' @concept objects #' @export #' subset.VisiumV1 <- function(x, cells, ...) { coordinates <- GetTissueCoordinates(object = x, scale = NULL, cols = NULL) cells <- cells[cells %in% rownames(x = coordinates)] coordinates <- coordinates[cells, ] slot(object = x, name = 'coordinates') <- coordinates return(x) } #' Update pre-V4 Assays generated with SCTransform in the Seurat to the new #' SCTAssay class # #' @param object A Seurat object #' @export #' @concept objects #' @return A Seurat object with updated SCTAssays #' UpdateSCTAssays <- function(object) { assays <- Assays(object = object) for (assay in assays) { if (IsSCT(assay = object[[assay]]) && !inherits(x = object[[assay]], what = "SCTAssay")) { object[[assay]] <- as(object = object[[assay]], Class = "SCTAssay") } } return(object) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # S4 methods #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @rdname SCTAssay-class #' @name SCTAssay-class #' #' @section Creating an \code{SCTAssay} from an \code{Assay}: #' Conversion from an \code{Assay} object to an \code{SCTAssay} object by #' is done by adding the additional slots to the object. If \code{from} has #' results generated by \code{\link{SCTransform}} from Seurat v3.0.0 to v3.1.1, #' the conversion will automagically fill the new slots with the data #' setAs( from = 'Assay', to = 'SCTAssay', def = function(from) { object.list <- sapply( X = slotNames(x = from), FUN = slot, object = from, simplify = FALSE, USE.NAMES = TRUE ) object.list <- c( list('Class' = 'SCTAssay'), object.list ) if (IsSCT(assay = from)) { vst.slots <- c('vst.set', 'vst.out') vst.use <- vst.slots[vst.slots %in% names(x = Misc(object = from))][1] vst.res <- Misc(object = from, slot = vst.use) umi.assay <- Misc(object = from, slot = "umi.assay") if (vst.use == 'vst.out') { vst.res <- list(vst.res) umi.assay <- list(umi.assay) } if (length(x = vst.res) == 0) { vst.res <- list() } else if (length(x = vst.res) > 0) { vst.res <- lapply( X = 1:length(x = vst.res), FUN = function(i) { vst.res[[i]]$umi.assay <- umi.assay[[i]] return(PrepVSTResults( vst.res = vst.res[[i]], cell.names = colnames(x = from) )) } ) names(x = vst.res) <- paste0("model", 1:length(x = vst.res)) } object.list$misc[[vst.use]] <- NULL object.list$SCTModel.list <- vst.res } return(do.call(what = 'new', args = object.list)) } ) setMethod( f = 'show', signature = 'TransferAnchorSet', definition = function(object) { cat('An AnchorSet object containing', nrow(x = slot(object = object, name = "anchors")), "anchors between the reference and query Seurat objects. \n", "This can be used as input to TransferData.\n") } ) setMethod( f = 'show', signature = 'IntegrationAnchorSet', definition = function(object) { cat('An AnchorSet object containing', nrow(x = slot(object = object, name = "anchors")), "anchors between", length(x = slot(object = object, name = "object.list")), "Seurat objects \n", "This can be used as input to IntegrateData.\n") } ) setMethod( f = 'show', signature = 'ModalityWeights', definition = function(object) { cat( 'A ModalityWeights object containing modality weights between', paste(slot(object = object, name = "modality.assay"), collapse = " and "), "assays \n", "This can be used as input to FindMultiModelNeighbors.\n") } ) setMethod( f = 'show', signature = 'BridgeReferenceSet', definition = function(object) { cat( 'A BridgeReferenceSet object has a bridge object with ', ncol(slot(object = object, name = 'bridge')), 'cells and a reference object with ', ncol(slot(object = object, name = 'reference')), 'cells. \n','The bridge query reduction is ', slot(object = object, name = 'params')$bridge.query.reduction %||% slot(object = object, name = 'params')$supervised.reduction, "\n This can be used as input to FindBridgeTransferAnchors and FindBridgeIntegrationAnchors") } ) setMethod( f = 'show', signature = 'SCTModel', definition = function(object) { cat( "An sctransform model.\n", " Model formula: ", slot(object = object, name = "model"), "\n Parameters stored for", nrow(x = SCTResults(object = object, slot = "feature.attributes")), "features,", nrow(x = SCTResults(object = object, slot = "cell.attributes")), "cells.\n") } ) #' @importFrom utils head # setMethod( f = 'show', signature = 'SCTAssay', definition = function(object) { cat('SCTAssay data with', nrow(x = object), 'features for', ncol(x = object), 'cells, and', length(x = levels(x = object)) , 'SCTModel(s) \n') if (length(x = VariableFeatures(object = object)) > 0) { top.ten <- head(x = VariableFeatures(object = object), n = 10L) top <- 'Top' variable <- 'variable' } else { top.ten <- head(x = rownames(x = object), n = 10L) top <- 'First' variable <- '' } features <- paste0( variable, ' feature', if (length(x = top.ten) != 1) {'s'}, ":\n" ) features <- gsub(pattern = '^\\s+', replacement = '', x = features) cat( top, length(x = top.ten), features, paste(strwrap(x = paste(top.ten, collapse = ', ')), collapse = '\n'), '\n' ) } ) #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal AddMetaData defintion # # @param object An object # @param metadata A vector, list, or data.frame with metadata to add # @param col.name A name for meta data if not a named list or data.frame # # @return object with metadata added # .AddMetaData <- function(object, metadata, col.name = NULL) { object <- UpdateSlots(object = object) if (is.null(x = col.name) && is.atomic(x = metadata)) { stop("'col.name' must be provided for atomic metadata types (eg. vectors)") } if (inherits(x = metadata, what = c('matrix', 'Matrix'))) { metadata <- as.data.frame(x = metadata) } col.name <- col.name %||% names(x = metadata) %||% colnames(x = metadata) if (is.null(x = col.name)) { stop("No metadata name provided and could not infer it from metadata object") } object[[col.name]] <- metadata # if (class(x = metadata) == "data.frame") { # for (ii in 1:ncol(x = metadata)) { # object[[colnames(x = metadata)[ii]]] <- metadata[, ii, drop = FALSE] # } # } else { # object[[col.name]] <- metadata # } return(object) } # Find the names of collections in an object # # @return A vector with the names of slots that are a list # Collections <- function(object) { collections <- vapply( X = slotNames(x = object), FUN = function(x) { return(any(grepl(pattern = 'list', x = class(x = slot(object = object, name = x))))) }, FUN.VALUE = logical(length = 1L) ) collections <- Filter(f = isTRUE, x = collections) return(names(x = collections)) } # Get the default image of an object # # Attempts to find all images associated with the default assay of the object. # If none present, finds all images present in the object. Returns the name of # the first image # # @param object A Seurat object # # @return The name of the default image # DefaultImage <- function(object) { object <- UpdateSlots(object = object) images <- Images(object = object, assay = DefaultAssay(object = object)) if (length(x = images) < 1) { images <- Images(object = object) } return(images[[1]]) } # Get the names of objects within a Seurat object that are of a certain class # # @param object A Seurat object # @param classes.keep A vector of names of classes to get # # @return A vector with the names of objects within the Seurat object that are of class \code{classes.keep} # #' @importFrom stats na.omit # FilterObjects <- function(object, classes.keep = c('Assay', 'DimReduc')) { object <- UpdateSlots(object = object) slots <- na.omit(object = Filter( f = function(x) { sobj <- slot(object = object, name = x) return(is.list(x = sobj) && !is.data.frame(x = sobj) && !is.package_version(x = sobj)) }, x = slotNames(x = object) )) slots <- grep(pattern = 'tools', x = slots, value = TRUE, invert = TRUE) slots <- grep(pattern = 'misc', x = slots, value = TRUE, invert = TRUE) slots.objects <- unlist( x = lapply( X = slots, FUN = function(x) { return(names(x = slot(object = object, name = x))) } ), use.names = FALSE ) object.classes <- sapply( X = slots.objects, FUN = function(i) { return(inherits(x = object[[i]], what = classes.keep)) } ) object.classes <- which(x = object.classes, useNames = TRUE) return(names(x = object.classes)) } # Find the collection of an object within a Seurat object # # @param object A Seurat object # @param name Name of object to find # # @return The collection (slot) of the object # FindObject <- function(object, name) { collections <- c( 'assays', 'graphs', 'neighbors', 'reductions', 'commands', 'images' ) object.names <- lapply( X = collections, FUN = function(x) { return(names(x = slot(object = object, name = x))) } ) names(x = object.names) <- collections object.names <- Filter(f = Negate(f = is.null), x = object.names) for (i in names(x = object.names)) { if (name %in% names(x = slot(object = object, name = i))) { return(i) } } return(NULL) } # Prepare VST results for use with SCTAssay objects # # @param vst.res Results from sctransform::vst # @param cell.names Vector of valid cell names still in object # # @return An SCTModel object. # # PrepVSTResults <- function(vst.res, cell.names) { # Prepare cell attribute information cell.attrs <- vst.res$cell_attr cell.names <- intersect(x = cell.names, y = rownames(x = cell.attrs)) cell.cols <- c( 'umi', 'gene', 'log_umi', 'log_gene', 'umi_per_gene', 'log_umi_per_gene' ) cell.cols <- intersect(x = cell.cols, y = colnames(x = cell.attrs)) cell.attrs <- cell.attrs[cell.names, cell.cols, drop = FALSE] colnames(x = cell.attrs) <- gsub( pattern = 'gene', replacement = 'feature', x = colnames(x = cell.attrs) ) if (!is.null(x = vst.res$cells_step1)) { cell.attrs[, "cells_step1"] <- FALSE cells_step1 <- intersect(x = vst.res$cells_step1, y = rownames(x = cell.attrs)) cell.attrs[cells_step1, "cells_step1"] <- TRUE } # Prepare feature attribute information feature.attrs <- vst.res$gene_attr feature.cols <- c( 'detection_rate', 'gmean', 'variance', 'residual_mean', 'residual_variance' ) feature.cols <- intersect(x = feature.cols, y = colnames(x = feature.attrs)) feature.attrs <- feature.attrs[, feature.cols, drop = FALSE] feature.attrs <- cbind(feature.attrs, vst.res$model_pars_fit[rownames(feature.attrs), , drop = FALSE]) if (!is.null(x = vst.res$genes_log_gmean_step1)) { feature.attrs[,"genes_log_gmean_step1"] <- FALSE genes_step1 <- intersect( x = names(vst.res$genes_log_gmean_step1), y = rownames(feature.attrs) ) feature.attrs[genes_step1,"genes_log_gmean_step1"] <- TRUE # add parameters from step1 feature.attrs[, paste0("step1_", colnames(vst.res$model_pars))] <- NA feature.attrs[genes_step1, paste0("step1_", colnames(vst.res$model_pars))] <- vst.res$model_pars[genes_step1,] } # Prepare clipping information clips <- list( 'vst' = vst.res$arguments$res_clip_range, 'sct' = vst.res$arguments$sct.clip.range ) median_umi <- NA # check if a custom scale_factor was provided to vst() if ("scale_factor" %in% names(vst.res$arguments)){ median_umi <- vst.res$arguments$scale_factor } if (is.na(median_umi)) { if ("umi" %in% colnames(x = cell.attrs)) { median_umi <- median(cell.attrs$umi) } else if ("log_umi" %in% colnames(x = cell.attrs)) { median_umi <- median(10 ^ cell.attrs$log_umi) } } vst.res.SCTModel <- SCTModel( feature.attributes = feature.attrs, cell.attributes = cell.attrs, clips = clips, umi.assay = vst.res$umi.assay %||% "RNA", model = vst.res$model_str, arguments = vst.res$arguments, median_umi = median_umi ) return(vst.res.SCTModel) } # Return a null image # # @param mode Image representation to return # see \code{\link{GetImage}} for more details # #' @importFrom grid nullGrob #' @importFrom grDevices as.raster # NullImage <- function(mode) { image <- switch( EXPR = mode, 'grob' = nullGrob(), 'raster' = as.raster(x = new(Class = 'matrix')), 'plotly' = list('visible' = FALSE), 'raw' = NULL, stop("Unknown image mode: ", mode, call. = FALSE) ) return(image) } # Check to see if projected loadings have been set # # @param object a DimReduc object # # @return TRUE if proejcted loadings have been set, else FALSE # Projected <- function(object) { projected.dims <- dim(x = slot(object = object, name = 'feature.loadings.projected')) if (all(projected.dims == 1)) { return(!all(is.na(x = slot(object = object, name = 'feature.loadings.projected')))) } return(!all(projected.dims == 0)) } # Subset cells in vst data # @param sct.info A vst.out list # @param cells vector of cells to retain # @param features vector of features to retain SubsetVST <- function(sct.info, cells, features) { cells.keep <- intersect(x = cells, y = rownames(x = sct.info$cell_attr)) sct.info$cell_attr <- sct.info$cell_attr[cells.keep, ] # find which subset of features are in the SCT assay feat.keep <- intersect(x = features, y = rownames(x = sct.info$gene_attr)) sct.info$gene_attr <- sct.info$gene_attr[feat.keep, ] return(sct.info) } # Get the top # # @param data Data to pull the top from # @param num Pull top \code{num} # @param balanced Pull even amounts of from positive and negative values # # @return The top \code{num} # @seealso \{code{\link{TopCells}}} \{code{\link{TopFeatures}}} # #' @importFrom utils head tail # Top <- function(data, num, balanced) { nr <- nrow(x = data) if (num > nr) { warning("Requested number is larger than the number of available items (", nr, "). Setting to ", nr , ".", call. = FALSE) num <- nr } if (num == 1) { balanced <- FALSE } top <- if (balanced) { num <- round(x = num / 2) data <- data[order(data, decreasing = TRUE), , drop = FALSE] positive <- head(x = rownames(x = data), n = num) negative <- rev(x = tail(x = rownames(x = data), n = num)) # remove duplicates if (positive[num] == negative[num]) { negative <- negative[-num] } list(positive = positive, negative = negative) } else { data <- data[rev(x = order(abs(x = data))), , drop = FALSE] top <- head(x = rownames(x = data), n = num) top[order(data[top, ])] } return(top) } # Update Seurat assay # # @param old.assay Seurat2 assay # @param assay Name to store for assay in new object # UpdateAssay <- function(old.assay, assay){ cells <- colnames(x = old.assay@data) counts <- old.assay@raw.data data <- old.assay@data if (!inherits(x = counts, what = 'dgCMatrix')) { counts <- as.sparse(x = as.matrix(x = counts)) } if (!inherits(x = data, what = 'dgCMatrix')) { data <- as.sparse(x = as.matrix(x = data)) } new.assay <- new( Class = 'Assay', counts = counts[, cells], data = data, scale.data = old.assay@scale.data %||% new(Class = 'matrix'), meta.features = data.frame(row.names = rownames(x = counts)), var.features = old.assay@var.genes, key = paste0(assay, "_") ) return(new.assay) } # Update dimension reduction # # @param old.dr Seurat2 dimension reduction slot # @param assay.used Name of assay used to compute dimension reduction # UpdateDimReduction <- function(old.dr, assay) { new.dr <- list() for (i in names(x = old.dr)) { cell.embeddings <- old.dr[[i]]@cell.embeddings %||% new(Class = 'matrix') feature.loadings <- old.dr[[i]]@gene.loadings %||% new(Class = 'matrix') stdev <- old.dr[[i]]@sdev %||% numeric() misc <- old.dr[[i]]@misc %||% list() new.jackstraw <- UpdateJackstraw(old.jackstraw = old.dr[[i]]@jackstraw) old.key <- old.dr[[i]]@key if (length(x = old.key) == 0) { old.key <- gsub(pattern = "(.+?)(([0-9]+).*)", replacement = "\\1", x = colnames(cell.embeddings)[[1]]) if (length(x = old.key) == 0) { old.key <- i } } new.key <- suppressWarnings(expr = UpdateKey(key = old.key)) colnames(x = cell.embeddings) <- gsub( pattern = old.key, replacement = new.key, x = colnames(x = cell.embeddings) ) colnames(x = feature.loadings) <- gsub( pattern = old.key, replacement = new.key, x = colnames(x = feature.loadings) ) new.dr[[i]] <- new( Class = 'DimReduc', cell.embeddings = as(object = cell.embeddings, Class = 'matrix'), feature.loadings = as(object = feature.loadings, Class = 'matrix'), assay.used = assay, stdev = as(object = stdev, Class = 'numeric'), key = as(object = new.key, Class = 'character'), jackstraw = new.jackstraw, misc = as(object = misc, Class = 'list') ) } return(new.dr) } # Update jackstraw # # @param old.jackstraw # UpdateJackstraw <- function(old.jackstraw) { if (is.null(x = old.jackstraw)) { new.jackstraw <- new( Class = 'JackStrawData', empirical.p.values = new(Class = 'matrix'), fake.reduction.scores = new(Class = 'matrix'), empirical.p.values.full = new(Class = 'matrix'), overall.p.values = new(Class = 'matrix') ) } else { if (.hasSlot(object = old.jackstraw, name = 'overall.p.values')) { overall.p <- old.jackstraw@overall.p.values %||% new(Class = 'matrix') } else { overall.p <- new(Class = 'matrix') } new.jackstraw <- new( Class = 'JackStrawData', empirical.p.values = old.jackstraw@emperical.p.value %||% new(Class = 'matrix'), fake.reduction.scores = old.jackstraw@fake.pc.scores %||% new(Class = 'matrix'), empirical.p.values.full = old.jackstraw@emperical.p.value.full %||% new(Class = 'matrix'), overall.p.values = overall.p ) } return(new.jackstraw) } # Update a Key # # @param key A character to become a Seurat Key # # @return An updated Key that's valid for Seurat # UpdateKey <- function(key) { if (grepl(pattern = '^[[:alnum:]]+_$', x = key)) { return(key) } else { new.key <- regmatches( x = key, m = gregexpr(pattern = '[[:alnum:]]+', text = key) ) new.key <- paste0(paste(unlist(x = new.key), collapse = ''), '_') if (new.key == '_') { new.key <- paste0(RandomName(length = 3), '_') } warning( "Keys should be one or more alphanumeric characters followed by an underscore, setting key from ", key, " to ", new.key, call. = FALSE, immediate. = TRUE ) return(new.key) } } # Update slots in an object # # @param object An object to update # # @return \code{object} with the latest slot definitions # #' @importFrom rlang exec !!! UpdateSlots <- function(object) { object.list <- sapply( X = slotNames(x = object), FUN = function(x) { return(tryCatch( expr = slot(object = object, name = x), error = function(...) { return(NULL) } )) }, simplify = FALSE, USE.NAMES = TRUE ) object.list <- Filter(f = Negate(f = is.null), x = object.list) object.list <- c('Class' = class(x = object)[1], object.list) object <- exec( .fn = new, !!! object.list ) for (x in setdiff(x = slotNames(x = object), y = names(x = object.list))) { xobj <- slot(object = object, name = x) if (is.vector(x = xobj) && !is.list(x = xobj) && length(x = xobj) == 0) { slot(object = object, name = x) <- vector(mode = class(x = xobj), length = 1L) } } return(object) } # Pulls the proper data matrix for merging assay data. If the slot is empty, will return an empty # matrix with the proper dimensions from one of the remaining data slots. # # @param assay Assay to pull data from # @param slot Slot to pull from # # @return Returns the data matrix if present (i.e.) not 0x0. Otherwise, returns an # appropriately sized empty sparse matrix # #' @importFrom Matrix Matrix # ValidateDataForMerge <- function(assay, slot) { mat <- GetAssayData(object = assay, layer = slot) if (any(dim(x = mat) == c(0, 0))) { slots.to.check <- setdiff(x = c("counts", "data", "scale.data"), y = slot) for (ss in slots.to.check) { data.dims <- dim(x = GetAssayData(object = assay, layer = ss)) data.slot <- ss if (!any(data.dims == c(0, 0))) { break } } if (any(data.dims == c(0, 0))) { stop("The counts, data, and scale.data slots are all empty for the provided assay.") } mat <- Matrix( data = 0, nrow = data.dims[1], ncol = data.dims[2], dimnames = dimnames(x = GetAssayData(object = assay, layer= data.slot)) ) mat <- as.sparse(x = mat) } return(mat) } Seurat/R/convenience.R0000644000176200001440000003272015104403544014341 0ustar liggesusers#' @include generics.R #' @include visualization.R #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @param fov Name to store FOV as #' @param assay Name to store expression matrix as #' @param ... Ignored #' #' @return \code{LoadAkoya}: A \code{\link[SeuratObject]{Seurat}} object #' #' @importFrom SeuratObject Cells CreateFOV CreateSeuratObject #' #' @export #' #' @rdname ReadAkoya #' LoadAkoya <- function( filename, type = c('inform', 'processor', 'qupath'), fov, assay = 'Akoya', ... ) { # read in matrix and centroids data <- ReadAkoya(filename = filename, type = type) # convert centroids into coords object coords <- suppressWarnings(expr = CreateFOV( coords = data$centroids, type = 'centroids', key = 'fov', assay = assay )) colnames(x = data$metadata) <- suppressWarnings( expr = make.names(names = colnames(x = data$metadata)) ) # build Seurat object from matrix obj <- CreateSeuratObject( counts = data$matrix, assay = assay, meta.data = data$metadata ) # make sure coords only contain cells in seurat object coords <- subset(x = coords, cells = Cells(x = obj)) suppressWarnings(expr = obj[[fov]] <- coords) # add image to seurat object # Add additional assays for (i in setdiff(x = names(x = data), y = c('matrix', 'centroids', 'metadata'))) { suppressWarnings(expr = obj[[i]] <- CreateAssayObject(counts = data[[i]])) } return(obj) } #' @inheritParams ReadAkoya #' @param data.dir Path to a directory containing Vitessce cells #' and clusters JSONs #' #' @return \code{LoadHuBMAPCODEX}: A \code{\link[SeuratObject]{Seurat}} object #' #' @importFrom SeuratObject Cells CreateFOV CreateSeuratObject #' #' @export #' #' @rdname ReadVitessce #' LoadHuBMAPCODEX <- function(data.dir, fov, assay = 'CODEX') { data <- ReadVitessce( counts = file.path(data.dir, "reg1_stitched_expressions.clusters.json"), coords = file.path(data.dir, "reg1_stitched_expressions.cells.json"), type = "segmentations" ) # Create spatial and Seurat objects coords <- CreateFOV( coords = data$segmentations, molecules = data$molecules, assay = assay ) obj <- CreateSeuratObject(counts = data$counts, assay = assay) # make sure spatial coords only contain cells in seurat object coords <- subset(x = coords, cells = Cells(x = obj)) obj[[fov]] <- coords return(obj) } #' @inheritParams ReadAkoya #' @param data.dir Path to folder containing Nanostring SMI outputs #' #' @return \code{LoadNanostring}: A \code{\link[SeuratObject]{Seurat}} object #' #' @importFrom SeuratObject Cells CreateCentroids CreateFOV #' CreateSegmentation CreateSeuratObject #' #' @export #' #' @rdname ReadNanostring #' LoadNanostring <- function(data.dir, fov, assay = 'Nanostring') { data <- ReadNanostring( data.dir = data.dir, type = c("centroids", "segmentations") ) segs <- CreateSegmentation(data$segmentations) cents <- CreateCentroids(data$centroids) segmentations.data <- list( "centroids" = cents, "segmentation" = segs ) coords <- CreateFOV( coords = segmentations.data, type = c("segmentation", "centroids"), molecules = data$pixels, assay = assay ) obj <- CreateSeuratObject(counts = data$matrix, assay = assay) # subset both object and coords based on the cells shared by both cells <- intersect( Cells(x = coords, boundary = "segmentation"), Cells(x = coords, boundary = "centroids") ) cells <- intersect(Cells(obj), cells) coords <- subset(x = coords, cells = cells) obj[[fov]] <- coords return(obj) } #' @return \code{LoadVizgen}: A \code{\link[SeuratObject]{Seurat}} object #' #' @importFrom SeuratObject Cells CreateCentroids CreateFOV #' CreateSegmentation CreateSeuratObject #' #' @export #' #' @rdname ReadVizgen #' LoadVizgen <- function(data.dir, fov, assay = 'Vizgen', z = 3L) { data <- ReadVizgen( data.dir = data.dir, filter = "^Blank-", type = c("centroids", "segmentations"), z = z ) segs <- CreateSegmentation(data$segmentations) cents <- CreateCentroids(data$centroids) segmentations.data <- list( "centroids" = cents, "segmentation" = segs ) coords <- CreateFOV( coords = segmentations.data, type = c("segmentation", "centroids"), molecules = data$microns, assay = assay ) obj <- CreateSeuratObject(counts = data$transcripts, assay = assay) # only consider the cells we have counts and a segmentation for # Cells which don't have a segmentation are probably found in other z slices. coords <- subset( x = coords, cells = intersect( x = Cells(x = coords[["segmentation"]]), y = Cells(x = obj) ) ) # add coords to seurat object obj[[fov]] <- coords return(obj) } #' @return \code{LoadXenium}: A \code{\link[SeuratObject]{Seurat}} object #' #' @param data.dir Path to folder containing Xenium outputs #' @param fov FOV name #' @param assay Assay name #' @param mols.qv.threshold Remove transcript molecules with #' a QV less than this threshold. QV >= 20 is the standard threshold #' used to construct the cell x gene count matrix. #' @param cell.centroids Whether or not to load cell centroids #' @param molecule.coordinates Whether or not to load molecule pixel coordinates #' @param segmentations One of "cell", "nucleus" or NULL (to load either cell #' segmentations, nucleus segmentations or neither) #' @param flip.xy Whether or not to flip the x/y coordinates of the Xenium outputs #' to match what is displayed in Xenium Explorer, or fit on your screen better. #' #' @importFrom SeuratObject Cells CreateCentroids CreateFOV #' CreateSegmentation CreateSeuratObject CreateMolecules #' #' @export #' #' @rdname ReadXenium #' LoadXenium <- function( data.dir, fov = 'fov', assay = 'Xenium', mols.qv.threshold = 20, cell.centroids = TRUE, molecule.coordinates = TRUE, segmentations = NULL, flip.xy = FALSE ) { if(!is.null(segmentations) && !(segmentations %in% c('nucleus', 'cell'))) { stop('segmentations must be NULL or one of "nucleus", "cell"') } if(!cell.centroids && is.null(segmentations)) { stop( "Must load either centroids or cell/nucleus segmentations" ) } data <- ReadXenium( data.dir = data.dir, type = c("centroids", "segmentations", "nucleus_segmentations")[ c(cell.centroids, isTRUE(segmentations == 'cell'), isTRUE(segmentations == 'nucleus')) ], outs = c("segmentation_method", "matrix", "microns")[ c(cell.centroids || isTRUE(segmentations != 'nucleus'), TRUE, molecule.coordinates && (cell.centroids || !is.null(segmentations))) ], mols.qv.threshold = mols.qv.threshold, flip.xy = flip.xy ) segmentations <- intersect(c("segmentations", "nucleus_segmentations"), names(data)) segmentations.data <- Filter(Negate(is.null), list( centroids = if(is.null(data$centroids)) { NULL } else { CreateCentroids(data$centroids) }, segmentations = if(length(segmentations) > 0) { CreateSegmentation( data[[segmentations]] ) } else { NULL } )) coords <- if(length(segmentations.data) > 0) { CreateFOV( segmentations.data, assay = assay, molecules = if(is.null(data$microns)) { NULL } else { CreateMolecules(data$microns) } ) } else { NULL } slot.map <- c( `Blank Codeword` = 'BlankCodeword', `Unassigned Codeword` = 'BlankCodeword', `Negative Control Codeword` = 'ControlCodeword', `Negative Control Probe` = 'ControlProbe', `Genomic Control` = 'GenomicControl', `Protein Expression` = 'ProteinExpression' ) xenium.obj <- CreateSeuratObject(counts = data$matrix[["Gene Expression"]], assay = assay) if(!is.null(data$metadata)) { Misc(xenium.obj, 'run_metadata') <- data$metadata } if(!is.null(data$segmentation_method)) { xenium.obj <- AddMetaData(xenium.obj, data$segmentation_method) } for(name in intersect(names(slot.map), names(data$matrix))) { xenium.obj[[slot.map[name]]] <- CreateAssayObject(counts = data$matrix[[name]]) } xenium.obj[[fov]] <- coords return(xenium.obj) } #' @param ... Extra parameters passed to \code{DimHeatmap} #' #' @rdname DimHeatmap #' @concept convenience #' @export #' PCHeatmap <- function(object, ...) { args <- list('object' = object) args <- c(args, list(...)) args$reduction <- "pca" return(do.call(what = 'DimHeatmap', args = args)) } #' @param ... Extra parameters passed to \code{DimPlot} #' #' @rdname DimPlot #' @concept convenience #' @export #' PCAPlot <- function(object, ...) { return(SpecificDimPlot(object = object, ...)) } #' @rdname SpatialPlot #' @concept convenience #' @concept spatial #' @export #' SpatialDimPlot <- function( object, group.by = NULL, images = NULL, cols = NULL, crop = TRUE, cells.highlight = NULL, cols.highlight = c('#DE2D26', 'grey50'), facet.highlight = FALSE, label = FALSE, label.size = 7, label.color = 'white', repel = FALSE, ncol = NULL, combine = TRUE, pt.size.factor = 1.6, alpha = c(1, 1), image.alpha = 1, image.scale = "lowres", shape = 21, stroke = NA, label.box = TRUE, interactive = FALSE, information = NULL, plot_segmentations = FALSE ) { return(SpatialPlot( object = object, group.by = group.by, images = images, cols = cols, crop = crop, cells.highlight = cells.highlight, cols.highlight = cols.highlight, facet.highlight = facet.highlight, label = label, label.size = label.size, label.color = label.color, repel = repel, ncol = ncol, combine = combine, pt.size.factor = pt.size.factor, alpha = alpha, image.alpha = image.alpha, image.scale = image.scale, shape = shape, stroke = stroke, label.box = label.box, interactive = interactive, information = information, plot_segmentations = plot_segmentations )) } #' @rdname SpatialPlot #' @concept convenience #' @concept spatial #' @export #' SpatialFeaturePlot <- function( object, features, images = NULL, crop = TRUE, slot = 'data', keep.scale = "feature", min.cutoff = NA, max.cutoff = NA, ncol = NULL, combine = TRUE, pt.size.factor = 1.6, alpha = c(1, 1), image.alpha = 1, image.scale = "lowres", shape = 21, stroke = NA, interactive = FALSE, information = NULL, plot_segmentations = FALSE ) { return(SpatialPlot( object = object, features = features, images = images, crop = crop, slot = slot, keep.scale = keep.scale, min.cutoff = min.cutoff, max.cutoff = max.cutoff, ncol = ncol, combine = combine, pt.size.factor = pt.size.factor, alpha = alpha, image.alpha = image.alpha, image.scale = image.scale, shape = shape, stroke = stroke, interactive = interactive, information = information, plot_segmentations = plot_segmentations )) } #' @rdname DimPlot #' @concept convenience #' @export #' TSNEPlot <- function(object, ...) { return(SpecificDimPlot(object = object, ...)) } #' @rdname DimPlot #' @concept convenience #' @export #' UMAPPlot <- function(object, ...) { return(SpecificDimPlot(object = object, ...)) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for R-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # @rdname DimPlot # SpecificDimPlot <- function(object, ...) { funs <- sys.calls() name <- as.character(x = funs[[length(x = funs) - 1]])[1] name <- tolower(x = gsub(pattern = 'Plot', replacement = '', x = name)) args <- list('object' = object) args <- c(args, list(...)) reduc <- grep( pattern = name, x = names(x = object), value = TRUE, ignore.case = TRUE ) reduc <- grep(pattern = DefaultAssay(object = object), x = reduc, value = TRUE) args$reduction <- ifelse(test = length(x = reduc) == 1, yes = reduc, no = name) tryCatch( expr = return(do.call(what = 'DimPlot', args = args)), error = function(e) { stop(e) } ) } #' Read output from Parse Biosciences #' #' @param data.dir Directory containing the data files #' @param ... Extra parameters passed to \code{\link{ReadMtx}} #' @concept convenience #' @export #' ReadParseBio <- function(data.dir, ...) { file.dir <- list.files(path = data.dir, pattern = ".mtx") mtx <- file.path(data.dir, file.dir) cells <- file.path(data.dir, "cell_metadata.csv") features <- file.path(data.dir, "all_genes.csv") return(ReadMtx( mtx = mtx, cells = cells, features = features, cell.column = 1, feature.column = 2, cell.sep = ",", feature.sep = ",", skip.cell = 1, skip.feature = 1, mtx.transpose = TRUE )) } #' Read output from STARsolo #' #' @param data.dir Directory containing the data files #' @param ... Extra parameters passed to \code{\link{ReadMtx}} #' #' @rdname ReadSTARsolo #' @concept convenience #' @export #' ReadSTARsolo <- function(data.dir, ... ) { mtx <- file.path(data.dir, "matrix.mtx") cells <- file.path(data.dir, "barcodes.tsv") features <- file.path(data.dir, "features.tsv") return(ReadMtx(mtx = mtx, cells = cells, features = features, ...)) } Seurat/R/RcppExports.R0000644000176200001440000001174415117057662014353 0ustar liggesusers# Generated by using Rcpp::compileAttributes() -> do not edit by hand # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 RunModularityClusteringCpp <- function(SNN, modularityFunction, resolution, algorithm, nRandomStarts, nIterations, randomSeed, printOutput, edgefilename) { .Call('_Seurat_RunModularityClusteringCpp', PACKAGE = 'Seurat', SNN, modularityFunction, resolution, algorithm, nRandomStarts, nIterations, randomSeed, printOutput, edgefilename) } RunUMISampling <- function(data, sample_val, upsample = FALSE, display_progress = TRUE) { .Call('_Seurat_RunUMISampling', PACKAGE = 'Seurat', data, sample_val, upsample, display_progress) } RunUMISamplingPerCell <- function(data, sample_val, upsample = FALSE, display_progress = TRUE) { .Call('_Seurat_RunUMISamplingPerCell', PACKAGE = 'Seurat', data, sample_val, upsample, display_progress) } RowMergeMatrices <- function(mat1, mat2, mat1_rownames, mat2_rownames, all_rownames) { .Call('_Seurat_RowMergeMatrices', PACKAGE = 'Seurat', mat1, mat2, mat1_rownames, mat2_rownames, all_rownames) } LogNorm <- function(data, scale_factor, display_progress = TRUE) { .Call('_Seurat_LogNorm', PACKAGE = 'Seurat', data, scale_factor, display_progress) } Standardize <- function(mat, display_progress = TRUE) { .Call('_Seurat_Standardize', PACKAGE = 'Seurat', mat, display_progress) } FastSparseRowScale <- function(mat, scale = TRUE, center = TRUE, scale_max = 10, display_progress = TRUE) { .Call('_Seurat_FastSparseRowScale', PACKAGE = 'Seurat', mat, scale, center, scale_max, display_progress) } FastSparseRowScaleWithKnownStats <- function(mat, mu, sigma, scale = TRUE, center = TRUE, scale_max = 10, display_progress = TRUE) { .Call('_Seurat_FastSparseRowScaleWithKnownStats', PACKAGE = 'Seurat', mat, mu, sigma, scale, center, scale_max, display_progress) } FastCov <- function(mat, center = TRUE) { .Call('_Seurat_FastCov', PACKAGE = 'Seurat', mat, center) } FastCovMats <- function(mat1, mat2, center = TRUE) { .Call('_Seurat_FastCovMats', PACKAGE = 'Seurat', mat1, mat2, center) } FastRBind <- function(mat1, mat2) { .Call('_Seurat_FastRBind', PACKAGE = 'Seurat', mat1, mat2) } FastExpMean <- function(mat, display_progress) { .Call('_Seurat_FastExpMean', PACKAGE = 'Seurat', mat, display_progress) } SparseRowVar2 <- function(mat, mu, display_progress) { .Call('_Seurat_SparseRowVar2', PACKAGE = 'Seurat', mat, mu, display_progress) } SparseRowVarStd <- function(mat, mu, sd, vmax, display_progress) { .Call('_Seurat_SparseRowVarStd', PACKAGE = 'Seurat', mat, mu, sd, vmax, display_progress) } FastLogVMR <- function(mat, display_progress) { .Call('_Seurat_FastLogVMR', PACKAGE = 'Seurat', mat, display_progress) } RowVar <- function(x) { .Call('_Seurat_RowVar', PACKAGE = 'Seurat', x) } SparseRowVar <- function(mat, display_progress) { .Call('_Seurat_SparseRowVar', PACKAGE = 'Seurat', mat, display_progress) } ReplaceColsC <- function(mat, col_idx, replacement) { .Call('_Seurat_ReplaceColsC', PACKAGE = 'Seurat', mat, col_idx, replacement) } GraphToNeighborHelper <- function(mat) { .Call('_Seurat_GraphToNeighborHelper', PACKAGE = 'Seurat', mat) } fast_dist <- function(x, y, n) { .Call('_Seurat_fast_dist', PACKAGE = 'Seurat', x, y, n) } FindWeightsC <- function(cells2, distances, anchor_cells2, integration_matrix_rownames, cell_index, anchor_score, min_dist, sd, display_progress) { .Call('_Seurat_FindWeightsC', PACKAGE = 'Seurat', cells2, distances, anchor_cells2, integration_matrix_rownames, cell_index, anchor_score, min_dist, sd, display_progress) } IntegrateDataC <- function(integration_matrix, weights, expression_cells2) { .Call('_Seurat_IntegrateDataC', PACKAGE = 'Seurat', integration_matrix, weights, expression_cells2) } ScoreHelper <- function(snn, query_pca, query_dists, corrected_nns, k_snn, subtract_first_nn, display_progress) { .Call('_Seurat_ScoreHelper', PACKAGE = 'Seurat', snn, query_pca, query_dists, corrected_nns, k_snn, subtract_first_nn, display_progress) } ComputeSNN <- function(nn_ranked, prune) { .Call('_Seurat_ComputeSNN', PACKAGE = 'Seurat', nn_ranked, prune) } WriteEdgeFile <- function(snn, filename, display_progress) { invisible(.Call('_Seurat_WriteEdgeFile', PACKAGE = 'Seurat', snn, filename, display_progress)) } DirectSNNToFile <- function(nn_ranked, prune, display_progress, filename) { .Call('_Seurat_DirectSNNToFile', PACKAGE = 'Seurat', nn_ranked, prune, display_progress, filename) } SNN_SmallestNonzero_Dist <- function(snn, mat, n, nearest_dist) { .Call('_Seurat_SNN_SmallestNonzero_Dist', PACKAGE = 'Seurat', snn, mat, n, nearest_dist) } row_sum_dgcmatrix <- function(x, i, rows, cols) { .Call('_Seurat_row_sum_dgcmatrix', PACKAGE = 'Seurat', x, i, rows, cols) } row_mean_dgcmatrix <- function(x, i, rows, cols) { .Call('_Seurat_row_mean_dgcmatrix', PACKAGE = 'Seurat', x, i, rows, cols) } row_var_dgcmatrix <- function(x, i, rows, cols) { .Call('_Seurat_row_var_dgcmatrix', PACKAGE = 'Seurat', x, i, rows, cols) } Seurat/R/generics.R0000644000176200001440000006703615056057544013667 0ustar liggesusers#' @include reexports.R #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Calculate module scores for feature expression programs in single cells #' #' Calculate the average expression levels of each program (cluster) on single #' cell level, subtracted by the aggregated expression of control feature sets. #' All analyzed features are binned based on averaged expression, and the #' control features are randomly selected from each bin. #' #' @param object An object #' @param ... Arguments passed to other methods #' #' @return Returns a Seurat object with module scores added to object meta data; #' each module is stored as \code{name#} for each module program present in #' \code{features} #' #' @references Tirosh et al, Science (2016) #' #' @export #' @concept utilities #' AddModuleScore <- function(object, ...) { UseMethod(generic = 'AddModuleScore', object = object) } #' Add info to anchor matrix #' #' @param anchors An \code{\link{AnchorSet}} object #' @param vars Variables to pull for each object via FetchData #' @param slot Slot to pull feature data for #' @param assay Specify the Assay per object if annotating with expression data #' @param ... Arguments passed to other methods # #' @return Returns the anchor dataframe with additional columns for annotation #' metadata #' #' @export #' AnnotateAnchors <- function(anchors, vars, slot, ...) { UseMethod(generic = 'AnnotateAnchors', object = anchors) } #' Convert objects to CellDataSet objects #' #' @param x An object to convert to class \code{CellDataSet} #' @param ... Arguments passed to other methods #' #' @rdname as.CellDataSet #' @export as.CellDataSet #' as.CellDataSet <- function(x, ...) { UseMethod(generic = 'as.CellDataSet', object = x) } #' Convert objects to SingleCellExperiment objects #' #' @param x An object to convert to class \code{SingleCellExperiment} #' @param ... Arguments passed to other methods #' #' @rdname as.SingleCellExperiment #' @export as.SingleCellExperiment #' as.SingleCellExperiment <- function(x, ...) { UseMethod(generic = 'as.SingleCellExperiment', object = x) } #' Cluster Determination #' #' Identify clusters of cells by a shared nearest neighbor (SNN) modularity #' optimization based clustering algorithm. First calculate k-nearest neighbors #' and construct the SNN graph. Then optimize the modularity function to #' determine clusters. For a full description of the algorithms, see Waltman and #' van Eck (2013) \emph{The European Physical Journal B}. Thanks to Nigel #' Delaney (evolvedmicrobe@github) for the rewrite of the Java modularity #' optimizer code in Rcpp! #' #' To run Leiden algorithm, you must first install the leidenalg python #' package (e.g. via pip install leidenalg), see Traag et al (2018). #' #' @param object An object #' @param ... Arguments passed to other methods #' #' @return Returns a Seurat object where the idents have been updated with new cluster info; #' latest clustering results will be stored in object metadata under 'seurat_clusters'. #' Note that 'seurat_clusters' will be overwritten everytime FindClusters is run #' #' @export #' #' @rdname FindClusters #' @export FindClusters #' FindClusters <- function(object, ...) { UseMethod(generic = 'FindClusters', object = object) } #' Gene expression markers of identity classes #' #' Finds markers (differentially expressed genes) for identity classes #' #' @param object An object #' @param ... Arguments passed to other methods and to specific DE methods #' @return data.frame with a ranked list of putative markers as rows, and associated #' statistics as columns (p-values, ROC score, etc., depending on the test used (\code{test.use})). The following columns are always present: #' \itemize{ #' \item \code{avg_logFC}: log fold-chage of the average expression between the two groups. Positive values indicate that the gene is more highly expressed in the first group #' \item \code{pct.1}: The percentage of cells where the gene is detected in the first group #' \item \code{pct.2}: The percentage of cells where the gene is detected in the second group #' \item \code{p_val_adj}: Adjusted p-value, based on bonferroni correction using all genes in the dataset #' } #' #' @details p-value adjustment is performed using bonferroni correction based on #' the total number of genes in the dataset. Other correction methods are not #' recommended, as Seurat pre-filters genes using the arguments above, reducing #' the number of tests performed. Lastly, as Aaron Lun has pointed out, p-values #' should be interpreted cautiously, as the genes used for clustering are the #' same genes tested for differential expression. #' #' @references McDavid A, Finak G, Chattopadyay PK, et al. Data exploration, #' quality control and testing in single-cell qPCR-based gene expression experiments. #' Bioinformatics. 2013;29(4):461-467. doi:10.1093/bioinformatics/bts714 #' @references Trapnell C, et al. The dynamics and regulators of cell fate #' decisions are revealed by pseudotemporal ordering of single cells. Nature #' Biotechnology volume 32, pages 381-386 (2014) #' @references Andrew McDavid, Greg Finak and Masanao Yajima (2017). MAST: Model-based #' Analysis of Single Cell Transcriptomics. R package version 1.2.1. #' https://github.com/RGLab/MAST/ #' @references Love MI, Huber W and Anders S (2014). "Moderated estimation of #' fold change and dispersion for RNA-seq data with DESeq2." Genome Biology. #' https://bioconductor.org/packages/release/bioc/html/DESeq2.html #' #' @export #' #' @examples #' \dontrun{ #' data("pbmc_small") #' # Find markers for cluster 2 #' markers <- FindMarkers(object = pbmc_small, ident.1 = 2) #' head(x = markers) #' #' # Take all cells in cluster 2, and find markers that separate cells in the 'g1' group (metadata #' # variable 'group') #' markers <- FindMarkers(pbmc_small, ident.1 = "g1", group.by = 'groups', subset.ident = "2") #' head(x = markers) #' #' # Pass 'clustertree' or an object of class phylo to ident.1 and #' # a node to ident.2 as a replacement for FindMarkersNode #' if (requireNamespace("ape", quietly = TRUE)) { #' pbmc_small <- BuildClusterTree(object = pbmc_small) #' markers <- FindMarkers(object = pbmc_small, ident.1 = 'clustertree', ident.2 = 5) #' head(x = markers) #' } #' } #' #' @rdname FindMarkers #' @export FindMarkers #' #' @aliases FindMarkersNode #' @seealso \code{FoldChange} #' FindMarkers <- function(object, ...) { UseMethod(generic = 'FindMarkers', object = object) } #' (Shared) Nearest-neighbor graph construction #' #' Computes the \code{k.param} nearest neighbors for a given dataset. Can also #' optionally (via \code{compute.SNN}), construct a shared nearest neighbor #' graph by calculating the neighborhood overlap (Jaccard index) between every #' cell and its \code{k.param} nearest neighbors. #' #' @param object An object #' @param ... Arguments passed to other methods #' #' @return This function can either return a \code{\link[SeuratObject]{Neighbor}} object #' with the KNN information or a list of \code{\link[SeuratObject]{Graph}} objects with #' the KNN and SNN depending on the settings of \code{return.neighbor} and #' \code{compute.SNN}. When running on a \code{\link[SeuratObject]{Seurat}} object, this #' returns the \code{\link[SeuratObject]{Seurat}} object with the Graphs or Neighbor objects #' stored in their respective slots. Names of the Graph or Neighbor object can #' be found with \code{\link[SeuratObject]{Graphs}} or \code{\link[SeuratObject]{Neighbors}}. #' #' @examples #' data("pbmc_small") #' pbmc_small #' # Compute an SNN on the gene expression level #' pbmc_small <- FindNeighbors(pbmc_small, features = VariableFeatures(object = pbmc_small)) #' #' # More commonly, we build the SNN on a dimensionally reduced form of the data #' # such as the first 10 principle components. #' #' pbmc_small <- FindNeighbors(pbmc_small, reduction = "pca", dims = 1:10) #' #' @rdname FindNeighbors #' @export FindNeighbors #' FindNeighbors <- function(object, ...) { UseMethod(generic = 'FindNeighbors', object = object) } #' Find variable features #' #' Identifies features that are outliers on a 'mean variability plot'. #' #' For the mean.var.plot method: #' Exact parameter settings may vary empirically from dataset to dataset, and #' based on visual inspection of the plot. Setting the y.cutoff parameter to 2 #' identifies features that are more than two standard deviations away from the #' average dispersion within a bin. The default X-axis function is the mean #' expression level, and for Y-axis it is the log(Variance/mean). All mean/variance #' calculations are not performed in log-space, but the results are reported in #' log-space - see relevant functions for exact details. #' #' @param object An object #' @param ... Arguments passed to other methods #' #' @rdname FindVariableFeatures #' @export FindVariableFeatures #' #' @aliases FindVariableGenes #' FindVariableFeatures <- function(object, ...) { UseMethod(generic = 'FindVariableFeatures', object = object) } #' Find spatially variable features #' #' Identify features whose variability in expression can be explained to some #' degree by spatial location. #' #' @param object An object #' @param ... Arguments passed to other methods #' #' @rdname FindSpatiallyVariableFeatures #' @export FindSpatiallyVariableFeatures #' FindSpatiallyVariableFeatures <- function(object, ...) { UseMethod(generic = 'FindSpatiallyVariableFeatures', object = object) } #' Fold Change #' #' Calculate log fold change and percentage of cells expressing each feature #' for different identity classes. #' #' If the slot is \code{scale.data} or a reduction is specified, average difference #' is returned instead of log fold change and the column is named "avg_diff". #' Otherwise, log2 fold change is returned with column named "avg_log2_FC". #' #' @examples #' \dontrun{ #' data("pbmc_small") #' FoldChange(pbmc_small, ident.1 = 1) #' } #' #' @param object A Seurat object #' @param ... Arguments passed to other methods #' @rdname FoldChange #' @export FoldChange #' @return Returns a data.frame #' @seealso \code{FindMarkers} FoldChange <- function(object, ...) { UseMethod(generic = 'FoldChange', object = object) } #' Get an Assay object from a given Seurat object. #' #' @param object An object #' @param ... Arguments passed to other methods #' #' @return Returns an Assay object #' #' @rdname GetAssay #' @export GetAssay #' GetAssay <- function(object, ...) { UseMethod(generic = 'GetAssay', object = object) } #' Integrate low dimensional embeddings #' #' Perform dataset integration using a pre-computed Anchorset of specified low #' dimensional representations. #' #' The main steps of this procedure are identical to \code{\link{IntegrateData}} #' with one key distinction. When computing the weights matrix, the distance #' calculations are performed in the full space of integrated embeddings when #' integrating more than two datasets, as opposed to a reduced PCA space which #' is the default behavior in \code{\link{IntegrateData}}. #' #' @param anchorset An AnchorSet object #' @param new.reduction.name Name for new integrated dimensional reduction. #' @param reductions Name of reductions to be integrated. For a #' TransferAnchorSet, this should be the name of a reduction present in the #' anchorset object (for example, "pcaproject"). For an IntegrationAnchorSet, #' this should be a \code{\link[SeuratObject]{DimReduc}} object containing all cells present #' in the anchorset object. #' @param dims.to.integrate Number of dimensions to return integrated values for #' @param weight.reduction Dimension reduction to use when calculating anchor #' weights. This can be one of: #' \itemize{ #' \item{A string, specifying the name of a dimension reduction present in #' all objects to be integrated} #' \item{A vector of strings, specifying the name of a dimension reduction to #' use for each object to be integrated} #' \item{A vector of \code{\link[SeuratObject]{DimReduc}} objects, specifying the object to #' use for each object in the integration} #' \item{NULL, in which case the full corrected space is used for computing #' anchor weights.} #' } #' @param ... Reserved for internal use #' #' @return When called on a TransferAnchorSet (from FindTransferAnchors), this #' will return the query object with the integrated embeddings stored in a new #' reduction. When called on an IntegrationAnchorSet (from IntegrateData), this #' will return a merged object with the integrated reduction stored. #' #' @rdname IntegrateEmbeddings #' @export IntegrateEmbeddings #' IntegrateEmbeddings <- function(anchorset, ...) { UseMethod(generic = "IntegrateEmbeddings", object = anchorset) } #' Leverage Score Calculation #' #' This function computes the leverage scores for a given object #' It uses the concept of sketching and random projections. The function provides an approximation #' to the leverage scores using a scalable method suitable for large matrices. #' #' @param object A matrix-like object #' @param ... Arguments passed to other methods #' #' @references Clarkson, K. L. & Woodruff, D. P. #' Low-rank approximation and regression in input sparsity time. #' JACM 63, 1–45 (2017). \doi{10.1145/3019134}; #' #' @export #' LeverageScore <- function(object, ...) { UseMethod(generic = 'LeverageScore', object = object) } #' Normalize Raw Data #' #' @param data Matrix with the raw count data #' @param scale.factor Scale the data; default is \code{1e4} #' @param margin Margin to normalize over #' @param verbose Print progress #' #' @return A matrix with the normalized and log-transformed data #' #' @template param-dotsm #' #' @export #' @concept preprocessing #' #' @examples #' mat <- matrix(data = rbinom(n = 25, size = 5, prob = 0.2), nrow = 5) #' mat #' mat_norm <- LogNormalize(data = mat) #' mat_norm #' LogNormalize <- function( data, scale.factor = 1e4, margin = 2L, verbose = TRUE, ... ) { UseMethod(generic = 'LogNormalize', object = data) } #' Metric for evaluating mapping success #' #' This metric was designed to help identify query cells that aren't well #' represented in the reference dataset. The intuition for the score is that we #' are going to project the query cells into a reference-defined space and then #' project them back onto the query. By comparing the neighborhoods before and #' after projection, we identify cells who's local neighborhoods are the most #' affected by this transformation. This could be because there is a population #' of query cells that aren't present in the reference or the state of the cells #' in the query is significantly different from the equivalent cell type in the #' reference. #' #' @param anchors Set of anchors #' @param ... Arguments passed to other methods #' #' @rdname MappingScore #' @export MappingScore #' MappingScore <- function(anchors, ...) { UseMethod(generic = "MappingScore", object = anchors) } #' Normalize Data #' #' Normalize the count data present in a given assay. #' #' @param object An object #' @param ... Arguments passed to other methods #' #' @return Returns object after normalization #' #' @rdname NormalizeData #' @export NormalizeData #' NormalizeData <- function(object, ...) { UseMethod(generic = 'NormalizeData', object = object) } #' Project query data to the reference dimensional reduction #' #' #' @param query An object for query cells #' @param reference An object for reference cells #' @param query.assay Assay name for query object #' @param reference.assay Assay name for reference object #' @param reduction Name of dimensional reduction from reference object #' @param dims Dimensions used for reference dimensional reduction #' @param scale Determine if scale query data based on reference data variance #' @param verbose Print progress #' @param feature.mean Mean of features in reference #' @param feature.sd Standard variance of features in reference #' #' @return A matrix with projected cell embeddings #' #' @rdname ProjectCellEmbeddings #' @export ProjectCellEmbeddings #' #' @keywords internal #' ProjectCellEmbeddings <- function( query, ... ) { UseMethod(generic = 'ProjectCellEmbeddings', object = query) } #' Project query into UMAP coordinates of a reference #' #' This function will take a query dataset and project it into the coordinates #' of a provided reference UMAP. This is essentially a wrapper around two steps: #' \itemize{ #' \item{FindNeighbors - Find the nearest reference cell neighbors and their #' distances for each query cell.} #' \item{RunUMAP - Perform umap projection by providing the neighbor set #' calculated above and the umap model previously computed in the reference.} #' } #' #' @param query Query dataset #' #' @rdname ProjectUMAP #' @export ProjectUMAP #' ProjectUMAP <- function(query, ...) { UseMethod(generic = "ProjectUMAP", object = query) } #' Pseudobulk Expression #' #' Normalize the count data present in a given assay. #' #' @param object An assay #' @param ... Arguments passed to other methods #' #' @return Returns object after normalization #' #' @rdname PseudobulkExpression #' @export PseudobulkExpression #' @concept utilities #' PseudobulkExpression <- function(object, ...) { UseMethod(generic = "PseudobulkExpression", object = object) } #' Perform Canonical Correlation Analysis #' #' Runs a canonical correlation analysis using a diagonal implementation of CCA. #' For details about stored CCA calculation parameters, see #' \code{PrintCCAParams}. #' @param object1 First Seurat object #' @param object2 Second Seurat object. # @param ... Arguments passed to other methods #' #' @return Returns a combined Seurat object with the CCA results stored. #' #' @seealso \code{\link[SeuratObject]{merge.Seurat}} #' #' @examples #' \dontrun{ #' data("pbmc_small") #' pbmc_small #' # As CCA requires two datasets, we will split our test object into two just for this example #' pbmc1 <- subset(pbmc_small, cells = colnames(pbmc_small)[1:40]) #' pbmc2 <- subset(pbmc_small, cells = colnames(x = pbmc_small)[41:80]) #' pbmc1[["group"]] <- "group1" #' pbmc2[["group"]] <- "group2" #' pbmc_cca <- RunCCA(object1 = pbmc1, object2 = pbmc2) #' # Print results #' print(x = pbmc_cca[["cca"]]) #' } #' #' @rdname RunCCA #' @export RunCCA #' RunCCA <- function(object1, object2, ...) { UseMethod(generic = 'RunCCA', object = object1) } #' Run Graph Laplacian Eigendecomposition #' #' Run a graph laplacian dimensionality reduction. It is used as a low #' dimensional representation for a cell-cell graph. The input graph #' should be symmetric #' #' @param object A Seurat object #' @param ... Arguments passed to #' \code{\link[RSpectra:eigs_sym]{RSpectra::eigs_sym}} #' #' @return Returns Seurat object with the Graph laplacian eigenvector #' calculation stored in the reductions slot #' #' @rdname RunGraphLaplacian #' @export RunGraphLaplacian #' RunGraphLaplacian <- function(object, ...) { UseMethod(generic = 'RunGraphLaplacian', object = object) } #' Run Independent Component Analysis on gene expression #' #' Run fastica algorithm from the ica package for ICA dimensionality reduction. #' For details about stored ICA calculation parameters, see #' \code{PrintICAParams}. #' #' @param object Seurat object #' #' @rdname RunICA #' @export RunICA #' RunICA <- function(object, ...) { UseMethod(generic = "RunICA", object = object) } #' Run Linear Discriminant Analysis #' #' #' @param object An object #' @param ... Arguments passed to other methods #' #' @rdname RunLDA #' @export RunLDA #' #' @aliases RunLDA #' RunLDA <- function(object, ...) { UseMethod(generic = 'RunLDA', object = object) } #' Run Principal Component Analysis #' #' Run a PCA dimensionality reduction. For details about stored PCA calculation #' parameters, see \code{PrintPCAParams}. #' #' @param object An object #' @param ... Arguments passed to other methods and IRLBA #' #' @return Returns Seurat object with the PCA calculation stored in the reductions slot #' #' @export #' #' @rdname RunPCA #' @export RunPCA #' RunPCA <- function(object, ...) { UseMethod(generic = 'RunPCA', object = object) } #' Run Supervised Latent Semantic Indexing #' #' Run a supervised LSI (SLSI) dimensionality reduction supervised by a #' cell-cell kernel. SLSI is used to capture a linear transformation of peaks #' that maximizes its dependency to the given cell-cell kernel. #' #' @param object An object #' @param ... Arguments passed to IRLBA irlba #' #' @return Returns Seurat object with the SLSI calculation stored in the #' reductions slot #' #' @export #' #' @rdname RunSLSI #' @export RunSLSI #' RunSLSI <- function(object, ...) { UseMethod(generic = 'RunSLSI', object = object) } #' Run Supervised Principal Component Analysis #' #' Run a supervised PCA (SPCA) dimensionality reduction supervised by a cell-cell kernel. #' SPCA is used to capture a linear transformation which maximizes its dependency to #' the given cell-cell kernel. We use SNN graph as the kernel to supervise the linear #' matrix factorization. #' #' @param object An object #' @param ... Arguments passed to other methods and IRLBA #' #' @return Returns Seurat object with the SPCA calculation stored in the reductions slot #' @references Barshan E, Ghodsi A, Azimifar Z, Jahromi MZ. #' Supervised principal component analysis: Visualization, classification and #' regression on subspaces and submanifolds. #' Pattern Recognition. 2011 Jul 1;44(7):1357-71. \url{doi:10.1016/j.patcog.2010.12.015}; #' @export #' #' @rdname RunSPCA #' @export RunSPCA #' RunSPCA <- function(object, ...) { UseMethod(generic = 'RunSPCA', object = object) } #' Run t-distributed Stochastic Neighbor Embedding #' #' Run t-SNE dimensionality reduction on selected features. Has the option of #' running in a reduced dimensional space (i.e. spectral tSNE, recommended), #' or running based on a set of genes. For details about stored TSNE calculation #' parameters, see \code{PrintTSNEParams}. #' #' @param object Seurat object #' @param ... Arguments passed to other methods and to t-SNE call (most commonly used is perplexity) #' #' @rdname RunTSNE #' @export RunTSNE #' RunTSNE <- function(object, ...) { UseMethod(generic = 'RunTSNE', object = object) } #' Run UMAP #' #' Runs the Uniform Manifold Approximation and Projection (UMAP) dimensional #' reduction technique. To run using \code{umap.method="umap-learn"}, you must #' first install the umap-learn python package (e.g. via #' \code{pip install umap-learn}). Details on this package can be #' found here: \url{https://github.com/lmcinnes/umap}. For a more in depth #' discussion of the mathematics underlying UMAP, see the ArXiv paper here: #' \url{https://arxiv.org/abs/1802.03426}. #' #' @param object An object #' @param ... Arguments passed to other methods and UMAP #' #' @return Returns a Seurat object containing a UMAP representation #' #' @references McInnes, L, Healy, J, UMAP: Uniform Manifold Approximation and #' Projection for Dimension Reduction, ArXiv e-prints 1802.03426, 2018 #' #' @export #' #' @examples #' \dontrun{ #' data("pbmc_small") #' pbmc_small #' # Run UMAP map on first 5 PCs #' pbmc_small <- RunUMAP(object = pbmc_small, dims = 1:5) #' # Plot results #' DimPlot(object = pbmc_small, reduction = 'umap') #' } #' #' @rdname RunUMAP #' @export RunUMAP #' RunUMAP <- function(object, ...) { UseMethod(generic = 'RunUMAP', object = object) } #' Scale and center the data. #' #' Scales and centers features in the dataset. If variables are provided in vars.to.regress, #' they are individually regressed against each feature, and the resulting residuals are #' then scaled and centered. #' #' ScaleData now incorporates the functionality of the function formerly known #' as RegressOut (which regressed out given the effects of provided variables #' and then scaled the residuals). To make use of the regression functionality, #' simply pass the variables you want to remove to the vars.to.regress parameter. #' #' Setting center to TRUE will center the expression for each feature by subtracting #' the average expression for that feature. Setting scale to TRUE will scale the #' expression level for each feature by dividing the centered feature expression #' levels by their standard deviations if center is TRUE and by their root mean #' square otherwise. #' #' @param object An object #' @param ... Arguments passed to other methods #' #' @rdname ScaleData #' @export ScaleData #' ScaleData <- function(object, ...) { UseMethod(generic = 'ScaleData', object = object) } #' Get image scale factors #' #' @param object An object to get scale factors from #' @param ... Arguments passed to other methods #' #' @return An object of class \code{scalefactors} #' #' @rdname ScaleFactors #' @export ScaleFactors #' ScaleFactors <- function(object, ...) { UseMethod(generic = 'ScaleFactors', object = object) } #' Compute Jackstraw scores significance. #' #' Significant PCs should show a p-value distribution that is #' strongly skewed to the left compared to the null distribution. #' The p-value for each PC is based on a proportion test comparing the number #' of features with a p-value below a particular threshold (score.thresh), compared with the #' proportion of features expected under a uniform distribution of p-values. #' #' @param object An object #' @param ... Arguments passed to other methods #' #' @return Returns a Seurat object #' #' @author Omri Wurtzel #' @seealso \code{\link{JackStrawPlot}} #' #' @rdname ScoreJackStraw #' @export ScoreJackStraw #' ScoreJackStraw <- function(object, ...) { UseMethod(generic = 'ScoreJackStraw', object = object) } #' Perform sctransform-based normalization #' @param object An object #' @param ... Arguments passed to other methods (not used) #' #' @rdname SCTransform #' @export SCTransform #' SCTransform <- function(object, ...) { UseMethod(generic = 'SCTransform', object = object) } #' Get SCT results from an Assay #' #' Pull the \code{\link{SCTResults}} information from an \code{\link{SCTAssay}} #' object. #' #' @param object An object #' @param ... Arguments passed to other methods (not used) #' #' @rdname SCTResults #' @export SCTResults #' SCTResults <- function(object, ...) { UseMethod(generic = 'SCTResults', object = object) } #' Get the Pearson residuals from an sctransform-normalized dataset. #' #' @param object An object #' @param ... Arguments passed to other methods (not used) #' #' @rdname FetchResiduals #' @export FetchResiduals #' FetchResiduals <- function(object, ...) { UseMethod(generic = 'FetchResiduals', object = object) } #' @param value new data to set #' #' @rdname SCTResults #' @export SCTResults<- #' "SCTResults<-" <- function(object, ..., value) { UseMethod(generic = 'SCTResults<-', object = object) } #' Variance Stabilizing Transformation #' #' Apply variance stabilizing transformation for selection of variable features #' #' @inheritParams stats::loess #' @param data A matrix-like object #' @param margin Unused #' @param nselect Number of of features to select #' @param clip Upper bound for values post-standardization; defaults to the #' square root of the number of cells #' @param verbose ... #' #' @template param-dotsm #' #' @return A data frame with the following columns: #' \itemize{ #' \item \dQuote{\code{mean}}: ... #' \item \dQuote{\code{variance}}: ... #' \item \dQuote{\code{variance.expected}}: ... #' \item \dQuote{\code{variance.standardized}}: ... #' \item \dQuote{\code{variable}}: \code{TRUE} if the feature selected as #' variable, otherwise \code{FALSE} #' \item \dQuote{\code{rank}}: If the feature is selected as variable, then how #' it compares to other variable features with lower ranks as more variable; #' otherwise, \code{NA} #' } #' #' @rdname VST #' @export VST #' #' @keywords internal #' VST <- function( data, margin = 1L, nselect = 2000L, span = 0.3, clip = NULL, ... ) { UseMethod(generic = 'VST', object = data) } Seurat/R/integration.R0000644000176200001440000107270115070750476014407 0ustar liggesusers#' @include generics.R #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Find integration anchors #' #' Find a set of anchors between a list of \code{\link{Seurat}} objects. #' These anchors can later be used to integrate the objects using the #' \code{\link{IntegrateData}} function. #' #' The main steps of this procedure are outlined below. For a more detailed #' description of the methodology, please see Stuart, Butler, et al Cell 2019: #' \doi{10.1016/j.cell.2019.05.031}; \doi{10.1101/460147} #' #' First, determine anchor.features if not explicitly specified using #' \code{\link{SelectIntegrationFeatures}}. Then for all pairwise combinations #' of reference and query datasets: #' #' \itemize{ #' \item{Perform dimensional reduction on the dataset pair as specified via #' the \code{reduction} parameter. If \code{l2.norm} is set to \code{TRUE}, #' perform L2 normalization of the embedding vectors.} #' \item{Identify anchors - pairs of cells from each dataset #' that are contained within each other's neighborhoods (also known as mutual #' nearest neighbors).} #' \item{Filter low confidence anchors to ensure anchors in the low dimension #' space are in broad agreement with the high dimensional measurements. This #' is done by looking at the neighbors of each query cell in the reference #' dataset using \code{max.features} to define this space. If the reference #' cell isn't found within the first \code{k.filter} neighbors, remove the #' anchor.} #' \item{Assign each remaining anchor a score. For each anchor cell, determine #' the nearest \code{k.score} anchors within its own dataset and within its #' pair's dataset. Based on these neighborhoods, construct an overall neighbor #' graph and then compute the shared neighbor overlap between anchor and query #' cells (analogous to an SNN graph). We use the 0.01 and 0.90 quantiles on #' these scores to dampen outlier effects and rescale to range between 0-1.} #' } #' #' @param object.list A list of \code{\link{Seurat}} objects between which to #' find anchors for downstream integration. #' @param assay A vector of assay names specifying which assay to use when #' constructing anchors. If NULL, the current default assay for each object is #' used. #' @param reference A vector specifying the object/s to be used as a reference #' during integration. If NULL (default), all pairwise anchors are found (no #' reference/s). If not NULL, the corresponding objects in \code{object.list} #' will be used as references. When using a set of specified references, anchors #' are first found between each query and each reference. The references are #' then integrated through pairwise integration. Each query is then mapped to #' the integrated reference. #' @param anchor.features Can be either: #' \itemize{ #' \item{A numeric value. This will call \code{\link{SelectIntegrationFeatures}} #' to select the provided number of features to be used in anchor finding} #' \item{A vector of features to be used as input to the anchor finding process} #' } #' @param scale Whether or not to scale the features provided. Only set to FALSE #' if you have previously scaled the features you want to use for each object in #' the object.list #' @param normalization.method Name of normalization method used: LogNormalize #' or SCT #' @param sct.clip.range Numeric of length two specifying the min and max values #' the Pearson residual will be clipped to #' @param reduction Dimensional reduction to perform when finding anchors. Can #' be one of: #' \itemize{ #' \item{cca: Canonical correlation analysis} #' \item{rpca: Reciprocal PCA} #' \item{jpca: Joint PCA} #' \item{rlsi: Reciprocal LSI} #' } #' @param l2.norm Perform L2 normalization on the CCA cell embeddings after #' dimensional reduction #' @param dims Which dimensions to use from the CCA to specify the neighbor #' search space #' @param k.anchor How many neighbors (k) to use when picking anchors #' @param k.filter How many neighbors (k) to use when filtering anchors #' @param k.score How many neighbors (k) to use when scoring anchors #' @param max.features The maximum number of features to use when specifying the #' neighborhood search space in the anchor filtering #' @param nn.method Method for nearest neighbor finding. Options include: rann, #' annoy #' @param n.trees More trees gives higher precision when using annoy approximate #' nearest neighbor search #' @param eps Error bound on the neighbor finding algorithm (from RANN/Annoy) #' @param verbose Print progress bars and output #' #' @return Returns an \code{\link{AnchorSet}} object that can be used as input to #' \code{\link{IntegrateData}}. #' #' @references Stuart T, Butler A, et al. Comprehensive Integration of #' Single-Cell Data. Cell. 2019;177:1888-1902 \doi{10.1016/j.cell.2019.05.031} #' #' @importFrom pbapply pblapply #' @importFrom future.apply future_lapply #' @importFrom future nbrOfWorkers #' #' @export #' @concept integration #' #' @examples #' \dontrun{ #' # to install the SeuratData package see https://github.com/satijalab/seurat-data #' library(SeuratData) #' data("panc8") #' #' # panc8 is a merged Seurat object containing 8 separate pancreas datasets #' # split the object by dataset #' pancreas.list <- SplitObject(panc8, split.by = "tech") #' #' # perform standard preprocessing on each object #' for (i in 1:length(pancreas.list)) { #' pancreas.list[[i]] <- NormalizeData(pancreas.list[[i]], verbose = FALSE) #' pancreas.list[[i]] <- FindVariableFeatures( #' pancreas.list[[i]], selection.method = "vst", #' nfeatures = 2000, verbose = FALSE #' ) #' } #' #' # find anchors #' anchors <- FindIntegrationAnchors(object.list = pancreas.list) #' #' # integrate data #' integrated <- IntegrateData(anchorset = anchors) #' } #' FindIntegrationAnchors <- function( object.list = NULL, assay = NULL, reference = NULL, anchor.features = 2000, scale = TRUE, normalization.method = c("LogNormalize", "SCT"), sct.clip.range = NULL, reduction = c("cca", "rpca", "jpca", "rlsi"), l2.norm = TRUE, dims = 1:30, k.anchor = 5, k.filter = 200, k.score = 30, max.features = 200, nn.method = "annoy", n.trees = 50, eps = 0, verbose = TRUE ) { normalization.method <- match.arg(arg = normalization.method) reduction <- match.arg(arg = reduction) if (reduction == "rpca") { reduction <- "pca" } if (reduction == "rlsi") { reduction <- "lsi" if (normalization.method == "SCT") { warning("Requested normalization method 'SCT' is not applicable for LSI") normalization.method <- "LogNormalize" } scale <- FALSE k.filter <- NA } my.lapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pblapply, no = future_lapply ) object.ncells <- sapply(X = object.list, FUN = function(x) dim(x = x)[2]) if (any(object.ncells <= max(dims))) { bad.obs <- which(x = object.ncells <= max(dims)) stop("Max dimension too large: objects ", paste(bad.obs, collapse = ", "), " contain fewer than ", max(dims), " cells. \n Please specify a", " maximum dimensions that is less than the number of cells in any ", "object (", min(object.ncells), ").") } if (!is.null(x = assay)) { if (length(x = assay) != length(x = object.list)) { stop("If specifying the assay, please specify one assay per object in the object.list") } object.list <- sapply( X = 1:length(x = object.list), FUN = function(x) { DefaultAssay(object = object.list[[x]]) <- assay[x] return(object.list[[x]]) } ) } else { assay <- sapply(X = object.list, FUN = DefaultAssay) } # check tool object.list <- lapply( X = object.list, FUN = function (obj) { slot(object = obj, name = "tools")$Integration <- NULL return(obj) }) object.list <- CheckDuplicateCellNames(object.list = object.list) slot <- "data" if (reduction == "lsi") { all.rownames <- lapply(X = object.list, FUN = rownames) anchor.features <- Reduce(f = intersect, x = all.rownames) } if (normalization.method == "SCT") { slot <- "scale.data" scale <- FALSE if (is.numeric(x = anchor.features)) { stop("Please specify the anchor.features to be used. The expected ", "workflow for integrating assays produced by SCTransform is ", "SelectIntegrationFeatures -> PrepSCTIntegration -> ", "FindIntegrationAnchors.") } sct.check <- sapply( X = 1:length(x = object.list), FUN = function(x) { sct.cmd <- grep( pattern = 'PrepSCTIntegration', x = Command(object = object.list[[x]]), value = TRUE ) # check assay has gone through PrepSCTIntegration if (!any(grepl(pattern = "PrepSCTIntegration", x = Command(object = object.list[[x]]))) || Command(object = object.list[[x]], command = sct.cmd, value = "assay") != assay[x]) { stop("Object ", x, " assay - ", assay[x], " has not been processed ", "by PrepSCTIntegration. Please run PrepSCTIntegration prior to ", "FindIntegrationAnchors if using assays generated by SCTransform.", call. = FALSE) } # check that the correct features are being used if (all(Command(object = object.list[[x]], command = sct.cmd, value = "anchor.features") != anchor.features)) { stop("Object ", x, " assay - ", assay[x], " was processed using a ", "different feature set than in PrepSCTIntegration. Please rerun ", "PrepSCTIntegration with the same anchor.features for all objects in ", "the object.list.", call. = FALSE) } } ) } if (is.numeric(x = anchor.features) && normalization.method != "SCT") { if (verbose) { message("Computing ", anchor.features, " integration features") } anchor.features <- SelectIntegrationFeatures( object.list = object.list, nfeatures = anchor.features, assay = assay ) } if (scale) { if (verbose) { message("Scaling features for provided objects") } object.list <- my.lapply( X = object.list, FUN = function(object) { ScaleData(object = object, features = anchor.features, verbose = FALSE) } ) } nn.reduction <- reduction # if using pca or lsi, only need to compute the internal neighborhood structure once # for each dataset internal.neighbors <- list() if (nn.reduction %in% c("pca", "lsi","jpca")) { if (nn.reduction == 'jpca') { nn.reduction <- 'joint.pca' reduction <- 'joint.pca' } k.filter <- NA if (verbose) { message("Computing within dataset neighborhoods") } k.neighbor <- max(k.anchor, k.score) internal.neighbors <- my.lapply( X = 1:length(x = object.list), FUN = function(x) { NNHelper( data = Embeddings(object = object.list[[x]][[nn.reduction]])[, dims], k = k.neighbor + 1, method = nn.method, n.trees = n.trees, eps = eps ) } ) } # determine pairwise combinations combinations <- expand.grid(1:length(x = object.list), 1:length(x = object.list)) combinations <- combinations[combinations$Var1 < combinations$Var2, , drop = FALSE] # determine the proper offsets for indexing anchors objects.ncell <- sapply(X = object.list, FUN = ncol) offsets <- as.vector(x = cumsum(x = c(0, objects.ncell)))[1:length(x = object.list)] if (is.null(x = reference)) { # case for all pairwise, leave the combinations matrix the same if (verbose) { message("Finding all pairwise anchors") } } else { reference <- unique(x = sort(x = reference)) if (max(reference) > length(x = object.list)) { stop('Error: requested reference object ', max(reference), " but only ", length(x = object.list), " objects provided") } # modify the combinations matrix to retain only R-R and R-Q comparisons if (verbose) { message("Finding anchors between all query and reference datasets") ok.rows <- (combinations$Var1 %in% reference) | (combinations$Var2 %in% reference) combinations <- combinations[ok.rows, ] } } # determine all anchors anchoring.fxn <- function(row) { i <- combinations[row, 1] j <- combinations[row, 2] object.1 <- DietSeurat( object = object.list[[i]], assays = assay[i], features = anchor.features, counts = FALSE, scale.data = TRUE, dimreducs = reduction ) object.2 <- DietSeurat( object = object.list[[j]], assays = assay[j], features = anchor.features, counts = FALSE, scale.data = TRUE, dimreducs = reduction ) # suppress key duplication warning suppressWarnings(object.1[["ToIntegrate"]] <- object.1[[assay[i]]]) DefaultAssay(object = object.1) <- "ToIntegrate" if (reduction %in% Reductions(object = object.1)) { slot(object = object.1[[reduction]], name = "assay.used") <- "ToIntegrate" } object.1 <- DietSeurat(object = object.1, assays = "ToIntegrate", scale.data = TRUE, dimreducs = reduction) suppressWarnings(object.2[["ToIntegrate"]] <- object.2[[assay[j]]]) DefaultAssay(object = object.2) <- "ToIntegrate" if (reduction %in% Reductions(object = object.2)) { slot(object = object.2[[reduction]], name = "assay.used") <- "ToIntegrate" } object.2 <- DietSeurat(object = object.2, assays = "ToIntegrate", scale.data = TRUE, dimreducs = reduction) object.pair <- switch( EXPR = reduction, 'cca' = { object.pair <- RunCCA( object1 = object.1, object2 = object.2, assay1 = "ToIntegrate", assay2 = "ToIntegrate", features = anchor.features, num.cc = max(dims), renormalize = FALSE, rescale = FALSE, verbose = verbose ) if (l2.norm){ object.pair <- L2Dim(object = object.pair, reduction = reduction) reduction <- paste0(reduction, ".l2") nn.reduction <- reduction } reduction.2 <- character() object.pair }, 'pca' = { object.pair <- ReciprocalProject( object.1 = object.1, object.2 = object.2, reduction = 'pca', projected.name = 'projectedpca', features = anchor.features, do.scale = FALSE, do.center = FALSE, slot = 'scale.data', l2.norm = l2.norm, verbose = verbose ) reduction <- "projectedpca.ref" reduction.2 <- "projectedpca.query" if (l2.norm) { reduction <- paste0(reduction, ".l2") reduction.2 <- paste0(reduction.2, ".l2") } object.pair }, 'lsi' = { object.pair <- ReciprocalProject( object.1 = object.1, object.2 = object.2, reduction = 'lsi', projected.name = 'projectedlsi', features = anchor.features, do.center = TRUE, do.scale = FALSE, slot = 'data', l2.norm = l2.norm, verbose = verbose ) reduction <- "projectedlsi.ref" reduction.2 <- "projectedlsi.query" if (l2.norm) { reduction <- paste0(reduction, ".l2") reduction.2 <- paste0(reduction.2, ".l2") } object.pair }, 'joint.pca' = { object.pair <- merge(x = object.1, y = object.2) reduction.2 <- "joint.pca" object.pair[['joint.pca']] <- CreateDimReducObject( embeddings = rbind(Embeddings(object.1[['joint.pca']]), Embeddings(object.2[['joint.pca']])), loadings = Loadings(object.1[['joint.pca']]), key = 'Joint_', assay = 'ToIntegrate') if (l2.norm) { object.pair <- L2Dim(object = object.pair, reduction = 'joint.pca', new.dr = 'joint.pca.l2', new.key = 'Jl2_' ) reduction <- paste0(reduction, ".l2") reduction.2 <- paste0(reduction.2, ".l2") } object.pair }, stop("Invalid reduction parameter. Please choose either cca, rpca, or rlsi") ) internal.neighbors <- internal.neighbors[c(i, j)] anchors <- FindAnchors( object.pair = object.pair, assay = c("ToIntegrate", "ToIntegrate"), slot = slot, cells1 = colnames(x = object.1), cells2 = colnames(x = object.2), internal.neighbors = internal.neighbors, reduction = reduction, reduction.2 = reduction.2, nn.reduction = nn.reduction, dims = dims, k.anchor = k.anchor, k.filter = k.filter, k.score = k.score, max.features = max.features, nn.method = nn.method, n.trees = n.trees, eps = eps, verbose = verbose ) anchors[, 1] <- anchors[, 1] + offsets[i] anchors[, 2] <- anchors[, 2] + offsets[j] return(anchors) } if (nbrOfWorkers() == 1) { all.anchors <- pblapply( X = 1:nrow(x = combinations), FUN = anchoring.fxn ) } else { all.anchors <- future_lapply( X = 1:nrow(x = combinations), FUN = anchoring.fxn, future.seed = TRUE ) } all.anchors <- do.call(what = 'rbind', args = all.anchors) all.anchors <- rbind(all.anchors, all.anchors[, c(2, 1, 3)]) all.anchors <- AddDatasetID(anchor.df = all.anchors, offsets = offsets, obj.lengths = objects.ncell) command <- LogSeuratCommand(object = object.list[[1]], return.command = TRUE) anchor.set <- new(Class = "IntegrationAnchorSet", object.list = object.list, reference.objects = reference %||% seq_along(object.list), anchors = all.anchors, offsets = offsets, anchor.features = anchor.features, command = command ) return(anchor.set) } # Merge dataset and perform reciprocal SVD projection, adding new dimreducs # for each projection and the merged original SVDs. # # @param object.1 First Seurat object to merge # @param object.2 Second Seurat object to merge # @param reduction Name of DimReduc to use. Must be an SVD-based DimReduc (eg, PCA or LSI) # so that the loadings can be used to project new embeddings. Must be present # in both input objects, with a substantial overlap in the features use to construct # the SVDs. # @param dims dimensions used for rpca # @param projected.name Name to store projected SVDs under (eg, "projectedpca") # @param features Features to use. Will subset the SVD loadings to use these features # before performing projection. Typically uses the anchor.features for integration. # @param do.center Center projected values (subtract mean) # @param do.scale Scale projected values (divide by SD) # @param slot Name of slot to pull data from. Should be scale.data for PCA and data for LSI # @param verbose Display messages # @return Returns a merged Seurat object with two projected SVDs (object.1 -> object.2, object.2 -> object.1) # and a merged SVD (needed for within-dataset neighbors) ReciprocalProject <- function( object.1, object.2, reduction, dims, projected.name, features, do.scale, do.center, slot, l2.norm, verbose = TRUE ) { common.features <- intersect( x = rownames(x = Loadings(object = object.1[[reduction]])), y = rownames(x = Loadings(object = object.2[[reduction]])) ) common.features <- intersect( x = common.features, y = features ) object.pair <- merge(x = object.1, y = object.2, merge.data = TRUE) data.1 <- GetAssayData( object = object.1, layer = slot ) data.2 <- GetAssayData( object = object.2, layer = slot ) proj.1 <- ProjectSVD( reduction = object.2[[reduction]], data = data.1, mode = reduction, features = common.features, do.scale = do.scale, do.center = do.center, use.original.stats = FALSE, verbose = verbose ) proj.2 <- ProjectSVD( reduction = object.1[[reduction]], data = data.2, mode = reduction, features = common.features, do.scale = do.scale, do.center = do.center, use.original.stats = FALSE, verbose = verbose ) # object.1 is ref, and object.2 is query reduction.dr.name.1 <- paste0(projected.name, ".ref") reduction.dr.name.2 <- paste0(projected.name, ".query") object.pair[[reduction.dr.name.1]] <- CreateDimReducObject( embeddings = rbind(Embeddings(object = object.1[[reduction]]), proj.2)[,dims], loadings = Loadings(object = object.1[[reduction]])[,dims], assay = DefaultAssay(object = object.1), key = paste0(projected.name, "ref_") ) object.pair[[reduction.dr.name.2]] <- CreateDimReducObject( embeddings = rbind(proj.1, Embeddings(object = object.2[[reduction]]))[,dims], loadings = Loadings(object = object.2[[reduction]])[,dims], assay = DefaultAssay(object = object.2), key = paste0(projected.name, "query_") ) object.pair[[reduction]] <- CreateDimReducObject( embeddings = rbind( Embeddings(object = object.1[[reduction]]), Embeddings(object = object.2[[reduction]]))[,dims], loadings = Loadings(object = object.1[[reduction]])[,dims], assay = DefaultAssay(object = object.1), key = paste0(projected.name, "_") ) if (l2.norm) { slot(object = object.pair[[reduction.dr.name.1]], name = "cell.embeddings") <- Sweep( x = Embeddings(object = object.pair[[reduction.dr.name.1]]), MARGIN = 2, STATS = apply(X = Embeddings(object = object.pair[[reduction.dr.name.1]]), MARGIN = 2, FUN = sd), FUN = "/" ) slot(object = object.pair[[reduction.dr.name.2]], name = "cell.embeddings") <- Sweep( x = Embeddings(object = object.pair[[reduction.dr.name.2]]), MARGIN = 2, STATS = apply(X = Embeddings(object = object.pair[[reduction.dr.name.2]]), MARGIN = 2, FUN = sd), FUN = "/" ) object.pair <- L2Dim(object = object.pair, reduction = reduction.dr.name.1) object.pair <- L2Dim(object = object.pair, reduction = reduction.dr.name.2) } return(object.pair) } #' Find transfer anchors #' #' Find a set of anchors between a reference and query object. These #' anchors can later be used to transfer data from the reference to #' query object using the \code{\link{TransferData}} object. #' #' The main steps of this procedure are outlined below. For a more detailed #' description of the methodology, please see Stuart, Butler, et al Cell 2019. #' \doi{10.1016/j.cell.2019.05.031}; \doi{10.1101/460147} #' #' \itemize{ #' #' \item{Perform dimensional reduction. Exactly what is done here depends on #' the values set for the \code{reduction} and \code{project.query} #' parameters. If \code{reduction = "pcaproject"}, a PCA is performed on #' either the reference (if \code{project.query = FALSE}) or the query (if #' \code{project.query = TRUE}), using the \code{features} specified. The data #' from the other dataset is then projected onto this learned PCA structure. #' If \code{reduction = "cca"}, then CCA is performed on the reference and #' query for this dimensional reduction step. If #' \code{reduction = "lsiproject"}, the stored LSI dimension reduction in the #' reference object is used to project the query dataset onto the reference. #' If \code{l2.norm} is set to \code{TRUE}, perform L2 normalization of the #' embedding vectors.} #' \item{Identify anchors between the reference and query - pairs of cells #' from each dataset that are contained within each other's neighborhoods #' (also known as mutual nearest neighbors).} #' \item{Filter low confidence anchors to ensure anchors in the low dimension #' space are in broad agreement with the high dimensional measurements. This #' is done by looking at the neighbors of each query cell in the reference #' dataset using \code{max.features} to define this space. If the reference #' cell isn't found within the first \code{k.filter} neighbors, remove the #' anchor.} #' \item{Assign each remaining anchor a score. For each anchor cell, determine #' the nearest \code{k.score} anchors within its own dataset and within its #' pair's dataset. Based on these neighborhoods, construct an overall neighbor #' graph and then compute the shared neighbor overlap between anchor and query #' cells (analogous to an SNN graph). We use the 0.01 and 0.90 quantiles on #' these scores to dampen outlier effects and rescale to range between 0-1.} #' } #' #' @param reference \code{\link[SeuratObject]{Seurat}} object to use as the reference #' @param query \code{\link[SeuratObject]{Seurat}} object to use as the query #' @param reference.assay Name of the Assay to use from reference #' @param reference.neighbors Name of the Neighbor to use from the reference. #' Optionally enables reuse of precomputed neighbors. #' @param query.assay Name of the Assay to use from query #' @param reduction Dimensional reduction to perform when finding anchors. #' Options are: #' \itemize{ #' \item{pcaproject: Project the PCA from the reference onto the query. We #' recommend using PCA when reference and query datasets are from scRNA-seq} #' \item{lsiproject: Project the LSI from the reference onto the query. We #' recommend using LSI when reference and query datasets are from scATAC-seq. #' This requires that LSI has been computed for the reference dataset, and the #' same features (eg, peaks or genome bins) are present in both the reference #' and query. See \code{\link[Signac]{RunTFIDF}} and #' \code{\link[Signac]{RunSVD}}} #' \item{rpca: Project the PCA from the reference onto the query, and the PCA #' from the query onto the reference (reciprocal PCA projection).} #' \item{cca: Run a CCA on the reference and query } #' } #' @param reference.reduction Name of dimensional reduction to use from the #' reference if running the pcaproject workflow. Optionally enables reuse of #' precomputed reference dimensional reduction. If NULL (default), use a PCA #' computed on the reference object. #' @param project.query Project the PCA from the query dataset onto the #' reference. Use only in rare cases where the query dataset has a much larger #' cell number, but the reference dataset has a unique assay for transfer. In #' this case, the default features will be set to the variable features of the #' query object that are alos present in the reference. #' @param features Features to use for dimensional reduction. If not specified, #' set as variable features of the reference object which are also present in #' the query. #' @param scale Scale query data. #' @param normalization.method Name of normalization method used: LogNormalize #' or SCT. #' @param recompute.residuals If using SCT as a normalization method, compute #' query Pearson residuals using the reference SCT model parameters. #' @param npcs Number of PCs to compute on reference if reference.reduction is #' not provided. #' @param l2.norm Perform L2 normalization on the cell embeddings after #' dimensional reduction #' @param dims Which dimensions to use from the reduction to specify the #' neighbor search space #' @param k.anchor How many neighbors (k) to use when finding anchors #' @param k.filter How many neighbors (k) to use when filtering anchors. Set to #' NA to turn off filtering. #' @param k.score How many neighbors (k) to use when scoring anchors #' @param max.features The maximum number of features to use when specifying the #' neighborhood search space in the anchor filtering #' @param nn.method Method for nearest neighbor finding. Options include: rann, #' annoy #' @param n.trees More trees gives higher precision when using annoy approximate #' nearest neighbor search #' @param eps Error bound on the neighbor finding algorithm (from #' \code{\link[RANN]{RANN}} or \code{\link[RcppAnnoy]{RcppAnnoy}}) #' @param approx.pca Use truncated singular value decomposition to approximate #' PCA #' @param mapping.score.k Compute and store nearest k query neighbors in the #' AnchorSet object that is returned. You can optionally set this if you plan #' on computing the mapping score and want to enable reuse of some downstream #' neighbor calculations to make the mapping score function more efficient. #' @param verbose Print progress bars and output #' #' @return Returns an \code{AnchorSet} object that can be used as input to #' \code{\link{TransferData}}, \code{\link{IntegrateEmbeddings}} and #' \code{\link{MapQuery}}. The dimension reduction used for finding anchors is #' stored in the \code{AnchorSet} object and can be used for computing anchor #' weights in downstream functions. Note that only the requested dimensions are #' stored in the dimension reduction object in the \code{AnchorSet}. This means #' that if \code{dims=2:20} is used, for example, the dimension of the stored #' reduction is \code{1:19}. #' #' @references Stuart T, Butler A, et al. Comprehensive Integration of #' Single-Cell Data. Cell. 2019;177:1888-1902 \doi{10.1016/j.cell.2019.05.031}; #' #' @export #' @importFrom methods slot slot<- #' @importFrom SeuratObject JoinLayers RenameAssays #' @concept integration #' @examples #' \dontrun{ #' # to install the SeuratData package see https://github.com/satijalab/seurat-data #' library(SeuratData) #' data("pbmc3k") #' #' # for demonstration, split the object into reference and query #' pbmc.reference <- pbmc3k[, 1:1350] #' pbmc.query <- pbmc3k[, 1351:2700] #' #' # perform standard preprocessing on each object #' pbmc.reference <- NormalizeData(pbmc.reference) #' pbmc.reference <- FindVariableFeatures(pbmc.reference) #' pbmc.reference <- ScaleData(pbmc.reference) #' #' pbmc.query <- NormalizeData(pbmc.query) #' pbmc.query <- FindVariableFeatures(pbmc.query) #' pbmc.query <- ScaleData(pbmc.query) #' #' # find anchors #' anchors <- FindTransferAnchors(reference = pbmc.reference, query = pbmc.query) #' #' # transfer labels #' predictions <- TransferData( #' anchorset = anchors, #' refdata = pbmc.reference$seurat_annotations #' ) #' pbmc.query <- AddMetaData(object = pbmc.query, metadata = predictions) #' } #' FindTransferAnchors <- function( reference, query, normalization.method = "LogNormalize", recompute.residuals = TRUE, reference.assay = NULL, reference.neighbors = NULL, query.assay = NULL, reduction = "pcaproject", reference.reduction = NULL, project.query = FALSE, features = NULL, scale = TRUE, npcs = 30, l2.norm = TRUE, dims = 1:30, k.anchor = 5, k.filter = NA, k.score = 30, max.features = 200, nn.method = "annoy", n.trees = 50, eps = 0, approx.pca = TRUE, mapping.score.k = NULL, verbose = TRUE ) { op <- options(Seurat.object.assay.calcn = FALSE) on.exit(expr = options(op), add = TRUE) # input validation ValidateParams_FindTransferAnchors( reference = reference, query = query, normalization.method = normalization.method, recompute.residuals = recompute.residuals, reference.assay = reference.assay, reference.neighbors = reference.neighbors, query.assay = query.assay, reduction = reduction, reference.reduction = reference.reduction, project.query = project.query, features = features, scale = scale, npcs = npcs, l2.norm = l2.norm, dims = dims, k.anchor = k.anchor, k.filter = k.filter, k.score = k.score, max.features = max.features, nn.method = nn.method, n.trees = n.trees, eps = eps, approx.pca = approx.pca, mapping.score.k = mapping.score.k, verbose = verbose ) projected <- ifelse(test = reduction == "pcaproject", yes = TRUE, no = FALSE) reduction.2 <- character() feature.mean <- NULL reference.reduction.init <- reference.reduction if (inherits(x = reference[[reference.assay]], what = 'Assay5')) { if (length(Layers(reference, search = "data")) > 1) { reference[[reference.assay]] <- JoinLayers( reference[[reference.assay]], layers = "data", new = "data") } } if (normalization.method == "SCT") { if (is.null(x = reference.reduction)) { reference <- suppressWarnings(expr = GetResidual( object = reference, assay = reference.assay, features = features, verbose = FALSE )) features <- intersect( x = features, y = rownames(reference[[reference.assay]]$scale.data) ) VariableFeatures(reference) <- features } if (IsSCT(assay = query[[query.assay]])) { query <- suppressWarnings(expr = GetResidual( object = query, assay = query.assay, features = features, verbose = FALSE )) } } # Rename query assay w same name as reference assay if (query.assay != reference.assay) { suppressWarnings(expr = query <- RenameAssays( object = query, assay.name = query.assay, new.assay.name = reference.assay, verbose = FALSE )) DefaultAssay(query) <- reference.assay } # only keep necessary info from objects suppressWarnings( query <- DietSeurat( object = query, assays = reference.assay, dimreducs = reference.reduction, features = features, scale.data = TRUE ) ) # check assay in the reference.reduction if (!is.null(reference.reduction) && slot(object = reference[[reference.reduction]], name = "assay.used") != reference.assay) { warnings("reference assay is diffrent from the assay.used in", reference.reduction) slot(object = reference[[reference.reduction]], name = "assay.used") <- reference.assay } suppressWarnings( reference <- DietSeurat( object = reference, assays = reference.assay, dimreducs = reference.reduction, features = features, scale.data = TRUE ) ) # append query and reference to cell names - mainly to avoid name conflicts query <- RenameCells( object = query, new.names = paste0(Cells(x = query), "_", "query") ) reference <- RenameCells( object = reference, new.names = paste0(Cells(x = reference), "_", "reference") ) # Select one SCT model based on max num of cells if multiple detected in the ref if (normalization.method == "SCT"){ model_list <- reference[[reference.assay]]@SCTModel.list if (length(x = model_list) > 1) { model_cell_counts <- sapply( X = model_list, FUN = function(model) { length(x = Cells(x = model)) } ) best_model_index <- which.max(model_cell_counts) chosen_model <- model_list[[best_model_index]] reference[["SCT"]] <- CreateSCTAssayObject( data = GetAssayData(object = reference[["SCT"]], layer = "data"), scale.data = GetAssayData(object = reference[["SCT"]], layer = "scale.data"), SCTModel.list = chosen_model ) message("Selected the SCT model fitted on the most cells.") } else { message("Only one SCT model detected; no need to select.") } } # Perform PCA projection if (reduction == 'pcaproject') { if (project.query) { if (is.null(x = reference.reduction)) { reference.reduction <- "pca" if (verbose) { message( "Performing PCA on the provided query using ", length(x = features), " features as input.") } if (normalization.method == "LogNormalize") { query <- ScaleData( object = query, features = features, do.scale = scale, verbose = FALSE ) } query <- RunPCA( object = query, npcs = npcs, reduction.name = reference.reduction, verbose = FALSE, features = features, approx = approx.pca ) } projected.pca <- ProjectCellEmbeddings( reference = query, reduction = reference.reduction, query = reference, scale = scale, dims = dims, feature.mean = feature.mean, verbose = verbose, normalization.method = normalization.method ) orig.embeddings <- Embeddings(object = query[[reference.reduction]])[, dims] orig.loadings <- Loadings(object = query[[reference.reduction]]) } else { if (is.null(x = reference.reduction)) { reference.reduction <- "pca" if (verbose) { message("Performing PCA on the provided reference using ", length(x = features), " features as input.") } if (normalization.method == "LogNormalize") { reference <- ScaleData(object = reference, features = features, do.scale = scale, verbose = FALSE) } reference <- RunPCA( object = reference, npcs = npcs, verbose = FALSE, features = features, approx = approx.pca ) } if (paste0("nCount_", query.assay) %in% colnames(query[[]])) { query_nCount_UMI <- query[[]][, paste0("nCount_", query.assay)] names(x = query_nCount_UMI) <- colnames(x = query) } else { query_nCount_UMI <- NULL } projected.pca <- ProjectCellEmbeddings( reference = reference, reduction = reference.reduction, normalization.method = normalization.method, query = query, scale = scale, dims = dims, nCount_UMI = query_nCount_UMI, feature.mean = feature.mean, verbose = verbose ) orig.embeddings <- Embeddings(object = reference[[reference.reduction]])[, dims] orig.loadings <- Loadings(object = reference[[reference.reduction]]) } combined.pca <- CreateDimReducObject( embeddings = as.matrix(x = rbind(orig.embeddings, projected.pca)), key = "ProjectPC_", assay = reference.assay ) # combined.ob <- suppressWarnings(expr = merge( # x = DietSeurat(object = reference, counts = FALSE), # y = DietSeurat(object = query, counts = FALSE), # )) ref.diet <- DietSeurat(object = reference, counts = FALSE) query.diet <- DietSeurat(object = query, counts = FALSE) counts.list <- list(reference = LayerData(ref.diet[[reference.assay]], layer = "data")) query.data.list <- list() for (i in Layers(object = query.diet[[reference.assay]], search = "data")) { data.layer.name <- gsub(pattern = "data.", replacement = "", x = i) counts.list[[data.layer.name]] <- LayerData(object = query[[reference.assay]], layer = i) } combined.ob <- CreateSeuratObject(counts = counts.list, assay = reference.assay) for (i in Layers(object = combined.ob[[reference.assay]], search = "counts")){ data.layer.name <- gsub(pattern = "counts.", replacement = "data.", x = i) # replace counts. to data. layer.data <- LayerData(object = combined.ob, layer = i) LayerData(object = combined.ob, layer = data.layer.name) <- layer.data # set layer data } colnames(x = orig.loadings) <- paste0("ProjectPC_", 1:ncol(x = orig.loadings)) combined.ob[["pcaproject"]] <- combined.pca Loadings(object = combined.ob[["pcaproject"]], projected = FALSE) <- orig.loadings[, dims] Loadings(object = combined.ob[["pcaproject"]]) <- orig.loadings[, dims] } # Use reciprocal PCA projection in anchor finding if (reduction == "rpca") { # Run PCA on reference and query if (is.null(x = reference.reduction)) { reference.reduction <- "pca" if (verbose) { message("Performing PCA on the provided reference using ", length(x = features), " features as input.") } if (normalization.method == "LogNormalize") { reference <- ScaleData( object = reference, features = features, do.scale = scale, verbose = verbose ) } reference <- RunPCA( object = reference, npcs = npcs, verbose = FALSE, features = features, approx = approx.pca ) } if (verbose) { message("Performing PCA on the provided query using ", length(x = features), " features as input.") } if (normalization.method == "LogNormalize") { query <- ScaleData( object = query, features = features, do.scale = scale, verbose = verbose ) } query <- RunPCA( object = query, npcs = ncol(x = reference[[reference.reduction]]), reduction.name = reference.reduction, verbose = FALSE, features = features, approx = approx.pca ) combined.ob <- ReciprocalProject( object.1 = reference, object.2 = query, reduction = reference.reduction, dims = dims, projected.name = reduction, features = features, do.scale = FALSE, do.center = FALSE, slot = 'scale.data', l2.norm = l2.norm, verbose = verbose ) # pcaproject is used as the weight.matrix in MapQuery projected.pca <- ProjectCellEmbeddings( reference = reference, reduction = reference.reduction, query = query, scale = scale, normalization.method = normalization.method, dims = dims, feature.mean = feature.mean, verbose = verbose ) orig.embeddings <- Embeddings(object = reference[[reference.reduction]])[, dims] orig.loadings <- Loadings(object = reference[[reference.reduction]]) combined.pca <- CreateDimReducObject( embeddings = as.matrix(x = rbind(orig.embeddings, projected.pca)), key = "ProjectPC_", assay = reference.assay ) combined.ob[["pcaproject"]] <- combined.pca colnames(x = orig.loadings) <- paste0("ProjectPC_", 1:ncol(x = orig.loadings)) Loadings(object = combined.ob[["pcaproject"]]) <- orig.loadings[, dims] if (l2.norm) { # L2 norm is done on each projected PCA in ReciprocalProject, so turn it off here # avoids later error as we now have two reductions (rpca.ref and rpca.query) l2.norm <- FALSE reduction <- "rpca.ref.l2" reduction.2 <- "rpca.query.l2" } else { reduction <- "rpca.ref" reduction.2 <- "rpca.query" } if (project.query) { reduction <- gsub(".ref", ".query", reduction) reduction.2 <- gsub(".query", ".ref", reduction.2) } } # Run CCA as dimension reduction to be used in anchor finding if (reduction == 'cca') { if (normalization.method == "LogNormalize") { reference <- ScaleData(object = reference, features = features, do.scale = scale, verbose = FALSE) query <- ScaleData(object = query, features = features, do.scale = scale, verbose = FALSE) } combined.ob <- RunCCA( object1 = reference, object2 = query, features = features, num.cc = max(dims), renormalize = FALSE, rescale = FALSE, verbose = verbose ) slot(object = combined.ob[["cca"]], name = "cell.embeddings") <- Embeddings(combined.ob[["cca"]])[, dims] slot(object = combined.ob[["cca"]], name = "feature.loadings") <- Loadings(combined.ob[["cca"]])[, dims] slot(object = combined.ob[["cca"]], name = "feature.loadings.projected") <- Loadings(object = combined.ob[["cca"]], projected = TRUE)[, dims] } if (reduction == "lsiproject") { if (project.query) { projected.lsi <- ProjectSVD( reduction = query[[reference.reduction]], data = GetAssayData(object = reference, assay = reference.assay, layer = "data"), mode = "lsi", do.center = FALSE, do.scale = FALSE, use.original.stats = FALSE, verbose = verbose ) orig.embeddings <- Embeddings(object = query[[reference.reduction]]) orig.loadings <- Loadings(object = query[[reference.reduction]]) } else { projected.lsi <- ProjectSVD( reduction = reference[[reference.reduction]], data = GetAssayData(object = query, assay = reference.assay, layer = "data"), mode = "lsi", do.center = FALSE, do.scale = FALSE, use.original.stats = FALSE, verbose = verbose ) orig.embeddings <- Embeddings(object = reference[[reference.reduction]]) orig.loadings <- Loadings(object = reference[[reference.reduction]]) } combined.lsi <- CreateDimReducObject( embeddings = as.matrix(x = rbind(orig.embeddings, projected.lsi))[,dims], key = "ProjectLSI_", assay = reference.assay ) combined.ob <- merge( x = DietSeurat(object = reference), y = DietSeurat(object = query) ) combined.ob[["lsiproject"]] <- combined.lsi colnames(x = orig.loadings) <- paste0("ProjectLSI_", 1:ncol(x = orig.loadings)) Loadings(object = combined.ob[["lsiproject"]]) <- orig.loadings[,dims] } if (l2.norm) { combined.ob <- L2Dim(object = combined.ob, reduction = reduction) reduction <- paste0(reduction, ".l2") } precomputed.neighbors <- list(ref.neighbors = NULL, query.neighbors = NULL) nn.idx1 <- NULL nn.idx2 <- NULL # if computing the mapping score later, compute large enough query # neighborhood here to reuse # when mapping.score.k is set, neighbors are pre-computed if (!is.null(x = mapping.score.k)) { if (verbose) { message("Finding query neighbors") } k.nn <- max(k.score, k.anchor) # Enable processing query.neighbors as a list for multi-layered query objects query.layers <- Layers(query, search = 'data') query.neighbors.list <- vector("list", length(query.layers)) query.neighbors.sub.list <- vector("list", length(query.layers)) nn.idx2.list <- vector("list", length(query.layers)) for (layer in seq_along(query.layers)) { cells2.i <- Cells( x = query, layer = query.layers[layer] ) query.subset <- subset( x = query, cells = cells2.i ) layer_embeddings <- Embeddings(object = combined.ob[[reduction]])[colnames(x = query.subset), ] # query.neighbors is a neighbors object that maps query cell indices to # its k nearest neighbors. This will be computed per each query layer. query.neighbors <- NNHelper( data = layer_embeddings, k = max(mapping.score.k, k.nn + 1), method = nn.method, n.trees = n.trees, cache.index = TRUE ) query.neighbors.sub <- query.neighbors slot(object = query.neighbors.sub, name = "nn.idx") <- slot( object = query.neighbors.sub, name = "nn.idx")[, 1:(k.nn + 1)] slot(object = query.neighbors.sub, name = "nn.dist") <- slot( object = query.neighbors.sub, name = "nn.dist")[, 1:(k.nn + 1)] # Adding neighbors to list query.neighbors.list[[layer]] <- query.neighbors query.neighbors.sub.list[[layer]] <- query.neighbors.sub nn.idx2.list[[layer]] <- Index(object = query.neighbors.sub) } precomputed.neighbors[["query.neighbors"]] <- query.neighbors.sub.list nn.idx2 <- nn.idx2.list } if (!is.null(x = reference.neighbors)) { precomputed.neighbors[["ref.neighbors"]] <- reference[[reference.neighbors]] } else { precomputed.neighbors[["ref.neighbors"]] <- NNHelper( data = Embeddings(combined.ob[[reduction]])[ colnames(x = reference), 1:length(x = dims) ], k = max(k.score, k.anchor) + 1, method = nn.method, cache.index = TRUE ) } nn.idx1 <- Index(object = precomputed.neighbors[["ref.neighbors"]]) anchors <- FindAnchors( object.pair = combined.ob, assay = c(reference.assay, reference.assay), slot = "data", cells1 = colnames(x = reference), cells2 = colnames(x = query), reduction = reduction, reduction.2 = reduction.2, internal.neighbors = precomputed.neighbors, dims = 1:length(x = dims), k.anchor = k.anchor, k.filter = k.filter, k.score = k.score, max.features = max.features, nn.method = nn.method, n.trees = n.trees, nn.idx1 = nn.idx1, nn.idx2 = nn.idx2, eps = eps, projected = projected, verbose = verbose ) reductions <- slot(object = combined.ob, name = "reductions") for (i in unique(x = c(reference.assay))) { dummy.assay <- paste0(i, "DUMMY") suppressWarnings( expr = combined.ob[[dummy.assay]] <- CreateDummyAssay(assay = combined.ob[[i]]) ) DefaultAssay(combined.ob) <- dummy.assay combined.ob[[i]] <- NULL suppressWarnings( expr = combined.ob[[i]] <- combined.ob[[dummy.assay]] ) DefaultAssay(combined.ob) <- i combined.ob[[dummy.assay]] <- NULL } slot(object = combined.ob, name = "reductions") <- reductions command <- LogSeuratCommand(object = combined.ob, return.command = TRUE) slot(command, name = 'params')$reference.reduction <- reference.reduction.init anchor.set <- new( Class = "TransferAnchorSet", object.list = list(combined.ob), reference.cells = colnames(x = reference), query.cells = colnames(x = query), anchors = anchors, anchor.features = features, command = command ) if (!is.null(x = precomputed.neighbors[["query.neighbors"]])) { slot(object = anchor.set, name = "neighbors") <- list( # return list of neighbors in anchor.set object query.neighbors = query.neighbors.list) } return(anchor.set) } #' Get the predicted identity #' #' Utility function to easily pull out the name of the class with the maximum #' prediction. This is useful if you've set \code{prediction.assay = TRUE} in #' \code{\link{TransferData}} and want to have a vector with the predicted class. #' #' @param object Seurat object #' @param assay Name of the assay holding the predictions #' @param slot Slot of the assay in which the prediction scores are stored #' @param score.filter Return "Unassigned" for any cell with a score less than #' this value #' #' @return Returns a vector of predicted class names #' #' @examples #' \dontrun{ #' prediction.assay <- TransferData(anchorset = anchors, refdata = reference$class) #' query[["predictions"]] <- prediction.assay #' query$predicted.id <- GetTransferPredictions(query) #' } #' @export #' @concept integration #' GetTransferPredictions <- function(object, assay = "predictions", slot = "data", score.filter = 0.75) { dat <- GetAssayData(object[[assay]], layer = slot) predictions <- apply( X = dat, MARGIN = 2, FUN = function(x){ if (x['max'] < score.filter) { "Unassigned" } else { x <- x[-which(x = names(x = x) == "max")] names(x = which.max(x = x)) } } ) return(predictions) } #' Integrate data #' #' Perform dataset integration using a pre-computed \code{\link{AnchorSet}}. #' #' The main steps of this procedure are outlined below. For a more detailed #' description of the methodology, please see Stuart, Butler, et al Cell 2019. #' \doi{10.1016/j.cell.2019.05.031}; \doi{10.1101/460147} #' #' For pairwise integration: #' #' \itemize{ #' \item{Construct a weights matrix that defines the association between each #' query cell and each anchor. These weights are computed as 1 - the distance #' between the query cell and the anchor divided by the distance of the query #' cell to the \code{k.weight}th anchor multiplied by the anchor score #' computed in \code{\link{FindIntegrationAnchors}}. We then apply a Gaussian #' kernel width a bandwidth defined by \code{sd.weight} and normalize across #' all \code{k.weight} anchors.} #' \item{Compute the anchor integration matrix as the difference between the #' two expression matrices for every pair of anchor cells} #' \item{Compute the transformation matrix as the product of the integration #' matrix and the weights matrix.} #' \item{Subtract the transformation matrix from the original expression #' matrix.} #' } #' #' For multiple dataset integration, we perform iterative pairwise integration. #' To determine the order of integration (if not specified via #' \code{sample.tree}), we #' \itemize{ #' \item{Define a distance between datasets as the total number of cells in #' the smaller dataset divided by the total number of anchors between the two #' datasets.} #' \item{Compute all pairwise distances between datasets} #' \item{Cluster this distance matrix to determine a guide tree} #' } #' #' #' @param anchorset An \code{\link{AnchorSet}} object generated by #' \code{\link{FindIntegrationAnchors}} #' @param new.assay.name Name for the new assay containing the integrated data #' @param normalization.method Name of normalization method used: LogNormalize #' or SCT #' @param features Vector of features to use when computing the PCA to determine #' the weights. Only set if you want a different set from those used in the #' anchor finding process #' @param features.to.integrate Vector of features to integrate. By default, #' will use the features used in anchor finding. #' @param dims Number of dimensions to use in the anchor weighting procedure #' @param k.weight Number of neighbors to consider when weighting anchors #' @param weight.reduction Dimension reduction to use when calculating anchor #' weights. This can be one of: #' \itemize{ #' \item{A string, specifying the name of a dimension reduction present in #' all objects to be integrated} #' \item{A vector of strings, specifying the name of a dimension reduction to #' use for each object to be integrated} #' \item{A vector of \code{\link[SeuratObject]{DimReduc}} objects, #' specifying the object to use for each object in the integration} #' \item{NULL, in which case a new PCA will be calculated and used to #' calculate anchor weights} #' } #' Note that, if specified, the requested dimension reduction will only be used #' for calculating anchor weights in the first merge between reference and #' query, as the merged object will subsequently contain more cells than was in #' query, and weights will need to be calculated for all cells in the object. #' @param sd.weight Controls the bandwidth of the Gaussian kernel for weighting #' @param sample.tree Specify the order of integration. Order of integration #' should be encoded in a matrix, where each row represents one of the pairwise #' integration steps. Negative numbers specify a dataset, positive numbers #' specify the integration results from a given row (the format of the merge #' matrix included in the \code{\link{hclust}} function output). For example: #' `matrix(c(-2, 1, -3, -1), ncol = 2)` gives: #' #' ``` #' [,1] [,2] #' [1,] -2 -3 #' [2,] 1 -1 #' ``` #' #' Which would cause dataset 2 and 3 to be integrated first, then the resulting #' object integrated with dataset 1. #' #' If NULL, the sample tree will be computed automatically. #' @param preserve.order Do not reorder objects based on size for each pairwise #' integration. #' @param eps Error bound on the neighbor finding algorithm (from #' \code{\link[RANN]{RANN}}) #' @param verbose Print progress bars and output #' #' @return Returns a \code{\link[SeuratObject]{Seurat}} object with a new integrated #' \code{\link[SeuratObject]{Assay}}. If \code{normalization.method = "LogNormalize"}, the #' integrated data is returned to the \code{data} slot and can be treated as #' log-normalized, corrected data. If \code{normalization.method = "SCT"}, the #' integrated data is returned to the \code{scale.data} slot and can be treated #' as centered, corrected Pearson residuals. #' #' @references Stuart T, Butler A, et al. Comprehensive Integration of #' Single-Cell Data. Cell. 2019;177:1888-1902 \doi{10.1016/j.cell.2019.05.031} #' #' @export #' @concept integration #' @md #' @examples #' \dontrun{ #' # to install the SeuratData package see https://github.com/satijalab/seurat-data #' library(SeuratData) #' data("panc8") #' #' # panc8 is a merged Seurat object containing 8 separate pancreas datasets #' # split the object by dataset #' pancreas.list <- SplitObject(panc8, split.by = "tech") #' #' # perform standard preprocessing on each object #' for (i in 1:length(pancreas.list)) { #' pancreas.list[[i]] <- NormalizeData(pancreas.list[[i]], verbose = FALSE) #' pancreas.list[[i]] <- FindVariableFeatures( #' pancreas.list[[i]], selection.method = "vst", #' nfeatures = 2000, verbose = FALSE #' ) #' } #' #' # find anchors #' anchors <- FindIntegrationAnchors(object.list = pancreas.list) #' #' # integrate data #' integrated <- IntegrateData(anchorset = anchors) #' } #' IntegrateData <- function( anchorset, new.assay.name = "integrated", normalization.method = c("LogNormalize", "SCT"), features = NULL, features.to.integrate = NULL, dims = 1:30, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, eps = 0, verbose = TRUE ) { normalization.method <- match.arg(arg = normalization.method) reference.datasets <- slot(object = anchorset, name = 'reference.objects') object.list <- slot(object = anchorset, name = 'object.list') anchors <- slot(object = anchorset, name = 'anchors') ref <- object.list[reference.datasets] features <- features %||% slot(object = anchorset, name = "anchor.features") unintegrated <- suppressWarnings(expr = merge( x = object.list[[1]], y = object.list[2:length(x = object.list)] )) if (!is.null(x = features.to.integrate)) { features.to.integrate <- intersect( x = features.to.integrate, y = Reduce( f = intersect, x = lapply( X = object.list, FUN = rownames ) ) ) } if (normalization.method == "SCT") { model.list <- list() for (i in 1:length(x = object.list)) { assay <- DefaultAssay(object = object.list[[i]]) if (length(x = setdiff(x = features.to.integrate, y = features)) != 0) { object.list[[i]] <- GetResidual( object = object.list[[i]], features = setdiff(x = features.to.integrate, y = features), verbose = verbose ) } print(i) model.list[[i]] <- slot(object = object.list[[i]][[assay]], name = "SCTModel.list") object.list[[i]][[assay]] <- suppressWarnings(expr = CreateSCTAssayObject( data = GetAssayData( object = object.list[[i]], assay = assay, layer = "scale.data") ) ) } model.list <- unlist(x = model.list) slot(object = anchorset, name = "object.list") <- object.list } # perform pairwise integration of reference objects reference.integrated <- PairwiseIntegrateReference( anchorset = anchorset, new.assay.name = new.assay.name, normalization.method = normalization.method, features = features, features.to.integrate = features.to.integrate, dims = dims, k.weight = k.weight, weight.reduction = weight.reduction, sd.weight = sd.weight, sample.tree = sample.tree, preserve.order = preserve.order, eps = eps, verbose = verbose ) # set SCT model if (normalization.method == "SCT") { if (is.null(x = Tool(object = reference.integrated, slot = "Integration"))) { reference.sample <- slot(object = anchorset, name = "reference.objects") } else { reference.sample <- SampleIntegrationOrder( tree = slot( object = reference.integrated, name = "tools" )$Integration@sample.tree )[1] } reference.cells <- Cells(x = object.list[[reference.sample]]) reference.model <- NULL if (length(x = model.list) > 0) { reference.model <- sapply(X = model.list, FUN = function(model) { reference.check <- FALSE model.cells <- Cells(x = model) if (length(x = model.cells) > 0 & length(x = setdiff(x = model.cells, y = reference.cells)) == 0) { reference.check <- TRUE } return(reference.check) } ) reference.model <- model.list[[which(reference.model)]] } } if (length(x = reference.datasets) == length(x = object.list)) { if (normalization.method == "SCT") { reference.integrated[[new.assay.name]] <- CreateSCTAssayObject( data = GetAssayData(object = reference.integrated, assay = new.assay.name, layer = "data"), scale.data = ScaleData( object = GetAssayData(object = reference.integrated, assay = new.assay.name, layer = "scale.data"), do.scale = FALSE, do.center = TRUE, verbose = FALSE), SCTModel.list = reference.model ) levels(x = reference.integrated[[new.assay.name]]) <- "refmodel" reference.integrated[[assay]] <- unintegrated[[assay]] } DefaultAssay(object = reference.integrated) <- new.assay.name VariableFeatures(object = reference.integrated) <- features reference.integrated[["FindIntegrationAnchors"]] <- slot(object = anchorset, name = "command") reference.integrated <- suppressWarnings(LogSeuratCommand(object = reference.integrated)) return(reference.integrated) } else { active.assay <- DefaultAssay(object = ref[[1]]) reference.integrated[[active.assay]] <- NULL reference.integrated[[active.assay]] <- CreateAssayObject( data = GetAssayData( object = reference.integrated[[new.assay.name]], layer = 'data' ), check.matrix = FALSE ) DefaultAssay(object = reference.integrated) <- active.assay reference.integrated[[new.assay.name]] <- NULL VariableFeatures(object = reference.integrated) <- features # Extract the query objects (if any) and map to reference integrated.data <- MapQueryData( anchorset = anchorset, reference = reference.integrated, new.assay.name = new.assay.name, normalization.method = normalization.method, features = features, features.to.integrate = features.to.integrate, dims = dims, k.weight = k.weight, weight.reduction = weight.reduction, sd.weight = sd.weight, preserve.order = preserve.order, eps = eps, verbose = verbose ) # Construct final assay object integrated.assay <- CreateAssayObject( data = integrated.data, check.matrix = FALSE ) if (normalization.method == "SCT") { integrated.assay <- CreateSCTAssayObject( data = integrated.data, scale.data = ScaleData( object = integrated.data, do.scale = FALSE, do.center = TRUE, verbose = FALSE), SCTModel.list = reference.model ) levels(x = integrated.assay) <- "refmodel" } unintegrated[[new.assay.name]] <- integrated.assay unintegrated <- SetIntegrationData( object = unintegrated, integration.name = "Integration", slot = "anchors", new.data = anchors ) if (!is.null(x = Tool(object = reference.integrated, slot = "Integration"))) { sample.tree <- GetIntegrationData( object = reference.integrated, integration.name = "Integration", slot = "sample.tree" ) } unintegrated <- SetIntegrationData( object = unintegrated, integration.name = "Integration", slot = "sample.tree", new.data = sample.tree ) DefaultAssay(object = unintegrated) <- new.assay.name VariableFeatures(object = unintegrated) <- features unintegrated[["FindIntegrationAnchors"]] <- slot(object = anchorset, name = "command") unintegrated <- suppressWarnings(LogSeuratCommand(object = unintegrated)) return(unintegrated) } } #' @inheritParams IntegrateData #' #' @rdname IntegrateEmbeddings #' @concept integration #' @export #' @method IntegrateEmbeddings IntegrationAnchorSet #' IntegrateEmbeddings.IntegrationAnchorSet <- function( anchorset, new.reduction.name = "integrated_dr", reductions = NULL, dims.to.integrate = NULL, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, verbose = TRUE, ... ) { CheckDots(...) reference.datasets <- slot(object = anchorset, name = 'reference.objects') object.list <- slot(object = anchorset, name = 'object.list') anchors <- slot(object = anchorset, name = 'anchors') reductions <- reductions %||% slot( object = anchorset, name = 'weight.reduction' ) ValidateParams_IntegrateEmbeddings_IntegrationAnchors( anchorset = anchorset, object.list = object.list, reductions = reductions, dims.to.integrate = dims.to.integrate, k.weight = k.weight, weight.reduction = weight.reduction, sample.tree = sample.tree ) unintegrated <- merge( x = object.list[[1]], y = object.list[2:length(x = object.list)] ) # make DimReducs into Assays temporarily intdr.assay <- DefaultAssay(object = reductions) int.assay <- DefaultAssay(object = object.list[[1]]) dims.names <- paste0("drtointegrate-", dims.to.integrate) # cell.names.map <- Cells(x = unintegrated) cell.names.map <- colnames(x = unintegrated) names(x = cell.names.map) <- make.unique(names = unname(obj = do.call( what = c, args = lapply(X = object.list, FUN = colnames))) ) for (i in 1:length(x = object.list)) { embeddings <- t(x = Embeddings(object = reductions)[cell.names.map[Cells(x = object.list[[i]])], dims.to.integrate]) rownames(x = embeddings) <- dims.names fake.assay <- suppressWarnings( expr = CreateAssayObject( data = embeddings, check.matrix = FALSE ) ) object.list[[i]][['drtointegrate']] <- fake.assay DefaultAssay(object = object.list[[i]]) <- "drtointegrate" } slot(object = anchorset, name = "object.list") <- object.list new.reduction.name.safe <- gsub(pattern = "_", replacement = "", x = new.reduction.name) new.reduction.name.safe <- gsub(pattern = "[.]", replacement = "", x = new.reduction.name.safe) reference.integrated <- PairwiseIntegrateReference( anchorset = anchorset, new.assay.name = new.reduction.name.safe, normalization.method = "LogNormalize", features = dims.names, features.to.integrate = dims.names, dims = NULL, k.weight = k.weight, weight.reduction = weight.reduction, sd.weight = sd.weight, sample.tree = sample.tree, preserve.order = preserve.order, verbose = verbose ) if (length(x = reference.datasets) == length(x = object.list)) { reference.dr <- CreateDimReducObject( embeddings = as.matrix(x = t(GetAssayData( object = reference.integrated[[new.reduction.name.safe]] ))), assay = intdr.assay, loadings = Loadings(object = reductions)[,dims.to.integrate], key = paste0(new.reduction.name.safe, "_") ) DefaultAssay(object = reference.integrated) <- int.assay reference.integrated[["drtointegrate"]] <- NULL reference.integrated[[new.reduction.name.safe]] <- NULL reference.integrated[[new.reduction.name]] <- reference.dr return(reference.integrated) } active.assay <- DefaultAssay(object = object.list[reference.datasets][[1]]) reference.integrated[[active.assay]] <- NULL reference.integrated[[active.assay]] <- CreateAssayObject( data = GetAssayData( object = reference.integrated[[new.reduction.name.safe]], layer = 'data' ) ) DefaultAssay(object = reference.integrated) <- active.assay reference.integrated[[new.reduction.name.safe]] <- NULL VariableFeatures(object = reference.integrated) <- dims.names # Extract the query objects (if any) and map to reference integrated.data <- MapQueryData( anchorset = anchorset, reference = reference.integrated, new.assay.name = new.reduction.name.safe, normalization.method = "LogNormalize", features = dims.names, features.to.integrate = dims.names, dims = NULL, k.weight = k.weight, weight.reduction = weight.reduction, sd.weight = sd.weight, preserve.order = preserve.order, verbose = verbose ) suppressWarnings(expr = unintegrated[[new.reduction.name]] <- CreateDimReducObject( embeddings = as.matrix(x = t(x = integrated.data)), assay = intdr.assay, loadings = Loadings(object = reductions), key = paste0(new.reduction.name.safe, "_") )) unintegrated <- SetIntegrationData( object = unintegrated, integration.name = "Integration", slot = "anchors", new.data = anchors ) if (!is.null(x = Tool(object = reference.integrated, slot = "Integration"))) { sample.tree <- GetIntegrationData( object = reference.integrated, integration.name = "Integration", slot = "sample.tree" ) } unintegrated <- SetIntegrationData( object = unintegrated, integration.name = "Integration", slot = "sample.tree", new.data = sample.tree ) unintegrated[["FindIntegrationAnchors"]] <- slot(object = anchorset, name = "command") suppressWarnings(unintegrated <- LogSeuratCommand(object = unintegrated)) return(unintegrated) } #' @param reference Reference object used in anchorset construction #' @param query Query object used in anchorset construction #' @param query.assay Name of the Assay to use from query #' @param reuse.weights.matrix Can be used in conjunction with the store.weights #' parameter in TransferData to reuse a precomputed weights matrix. #' #' @rdname IntegrateEmbeddings #' @concept integration #' @export #' @method IntegrateEmbeddings TransferAnchorSet #' IntegrateEmbeddings.TransferAnchorSet <- function( anchorset, reference, query, query.assay = NULL, new.reduction.name = "integrated_dr", reductions = 'pcaproject', dims.to.integrate = NULL, k.weight = 100, weight.reduction = NULL, reuse.weights.matrix = TRUE, sd.weight = 1, preserve.order = FALSE, verbose = TRUE, ... ) { CheckDots(...) combined.object <- slot(object = anchorset, name = 'object.list')[[1]] anchors <- slot(object = anchorset, name = 'anchors') weights.matrix <- NULL query.assay <- query.assay %||% DefaultAssay(query) ValidateParams_IntegrateEmbeddings_TransferAnchors( anchorset = anchorset, combined.object = combined.object, reference = reference, query = query, query.assay = query.assay, reductions = reductions, dims.to.integrate = dims.to.integrate, k.weight = k.weight, weight.reduction = weight.reduction, reuse.weights.matrix = reuse.weights.matrix ) object.list <- list(reference, query) # make DimReducs into Assays temporarily intdr.assay <- DefaultAssay(object = object.list[[1]][[reductions[[1]]]]) int.assay <- DefaultAssay(object = object.list[[1]]) dims.names <- paste0("drtointegrate-", dims.to.integrate) for (i in 1:length(x = object.list)) { embeddings <- t(x = Embeddings( object = object.list[[i]], reduction = reductions[[i]] )[ , dims.to.integrate]) rownames(x = embeddings) <- dims.names fake.assay <- suppressWarnings( expr = CreateAssayObject( data = embeddings, check.matrix = FALSE ) ) object.list[[i]][['drtointegrate']] <- fake.assay DefaultAssay(object = object.list[[i]]) <- "drtointegrate" object.list[[i]] <- DietSeurat(object = object.list[[i]], assays = "drtointegrate") } slot(object = anchorset, name = "object.list") <- object.list new.reduction.name.safe <- gsub(pattern = "_", replacement = "", x = new.reduction.name) new.reduction.name.safe <- gsub(pattern = "[.]", replacement = "", x = new.reduction.name) slot(object = anchorset, name = "reference.objects") <- 1 anchors <- as.data.frame(x = anchors) anchors$dataset1 <- 1 anchors$dataset2 <- 2 slot(object = anchorset, name = "anchors") <- anchors integrated.embeddings <- MapQueryData( anchorset = anchorset, reference = object.list[[1]], new.assay.name = new.reduction.name.safe, normalization.method = "LogNormalize", features = dims.names, features.to.integrate = dims.names, dims = NULL, k.weight = k.weight, weight.reduction = weight.reduction, weights.matrix = weights.matrix, no.offset = TRUE, sd.weight = sd.weight, preserve.order = preserve.order, verbose = verbose ) integrated.embeddings <- as.matrix(x = integrated.embeddings) query[[new.reduction.name]] <- CreateDimReducObject( embeddings = t(x = integrated.embeddings[, Cells(x = query[[query.assay]])]), assay = DefaultAssay(object = query[[reductions[1]]]), key = paste0(new.reduction.name.safe, "_") ) query <- RenameCells( object = query, new.names = gsub(pattern = "_query$", replacement = "", x = Cells(x = query)) ) query[[reductions[[1]]]] <- NULL return(query) } #' Integrate embeddings from the integrated sketched.assay #' #' The main steps of this procedure are outlined below. For a more detailed #' description of the methodology, please see Hao, et al Biorxiv 2022: #' \doi{10.1101/2022.02.24.481684} #' #' First learn a atom dictionary representation to reconstruct each cell. #' Then, using this dictionary representation, #' reconstruct the embeddings of each cell from the integrated atoms. #' #' @param object A Seurat object with all cells for one dataset #' @param sketched.assay Assay name for sketched-cell expression (default is 'sketch') #' @param assay Assay name for original expression (default is 'RNA') #' @param features Features used for atomic sketch integration #' @param reduction Dimensional reduction name for batch-corrected embeddings #' in the sketched object (default is 'integrated_dr') #' @param method Methods to construct sketch-cell representation #' for all cells (default is 'sketch'). Can be one of: #' \itemize{ #' \item \dQuote{\code{sketch}}: Use random sketched data slot #' \item \dQuote{\code{data}}: Use data slot #' } #' @param ratio Sketch ratio of data slot when \code{dictionary.method} is set #' to \dQuote{\code{sketch}}; defaults to 0.8 #' @param reduction.name Name to save new reduction as; defaults to #' \code{paste0(reduction, '.orig')} #' @param reduction.key Key for new dimensional reduction; defaults to creating #' one from \code{reduction.name} #' @param layers Names of layers for correction. #' @param sketched.layers Names of sketched layers, defaults to all #' layers of \dQuote{\code{object[[assay]]}} #' @param seed A positive integer. The seed for the random number generator, defaults to 123. #' @param verbose Print progress and message #' #' @return Returns a Seurat object with an integrated dimensional reduction #' #' @importFrom MASS ginv #' @importFrom Matrix t #' #' @export #' @concept integration #' ProjectIntegration <- function( object, sketched.assay = 'sketch', # DefaultAssay(object) assay = 'RNA', reduction = 'integrated_dr', # harmony; rerun UMAP on this features = NULL, # VF from object[[atom.assay]] layers = 'data', reduction.name = NULL, reduction.key = NULL, method = c('sketch', 'data'), ratio = 0.8, sketched.layers = NULL, seed = 123, verbose = TRUE ) { layers <- Layers(object = object[[assay]], search = layers) # Check input and output dimensional reductions sketched.layers <- sketched.layers %||% layers reduction <- match.arg(arg = reduction, choices = Reductions(object = object)) reduction.name <- reduction.name %||% paste0(reduction, '.full') reduction.key <- reduction.key %||% Key(object = reduction.name, quiet = TRUE) if (reduction.name %in% Reductions(object = object)) { warning( "'", reduction.name, "' already exists, overwriting", call. = FALSE, immediate. = TRUE ) } # Check the method being used method <- method[1L] method <- match.arg(arg = method) # Check our layers sketched.assay <- match.arg(arg = sketched.assay, choices = Assays(object = object)) assay <- match.arg(arg = assay, choices = Assays(object = object)) layer.full <- layers layers <- layers %||% intersect( x = DefaultLayer(object[[sketched.assay]]), y = Layers(object[[assay]]) ) if (is.null(x = layer.full)) { sketched.assay.missing <- setdiff(x = layers, DefaultLayer(object = object[[sketched.assay]])) if (length(x = sketched.assay.missing) == length(x = layers)) { stop("None of the requested layers are present in the sketched.assay") } else if (length(x = sketched.assay.missing)) { warning( length(x = sketched.assay.missing), " layers missing from the sketched.assay", call. = FALSE, immediate. = TRUE ) layers <- intersect(x = layers, y = DefaultLayer(object = object[[sketched.assay]])) } } # check layers layers.missing <- setdiff(layers, Layers(object = object[[assay]])) if (length(x = layers.missing)) { stop('layer ', layers.missing[1L], ' are not present in ', assay, " assay") } # check features features <- features %||% VariableFeatures(object = object[[sketched.assay]]) # TODO: see if we can handle missing features with `union` features.atom <- Reduce( f = intersect, x = lapply( X = sketched.layers, FUN = function(lyr) { return(Features(x = object[[sketched.assay]], layer = lyr)) } ) ) features <- intersect(x = features, y = features.atom) if (length(x = features) == 0) { stop('Features are not found. Please check VariableFeatures(object[[sketched.assay]]) ', 'or set features in ProjectIntegration') } ncells <- c( 0, sapply( X = layers, FUN = function(lyr) { return(length(x = Cells(x = object[[assay]], layer = lyr))) } ) ) if (length(sketched.layers) == 1) { sketched.layers <- rep(sketched.layers, length(layers)) } sketch.matrix <- switch( EXPR = method, data = { R = as.sparse( x = diag( x = length( x = features) ) ) R }, sketch = { R <- FeatureSketch(features = features, ratio = ratio, seed = seed ) R } ) emb.list <- list() cells.list <- list() for (i in seq_along(along.with = layers)) { if (length(unique(sketched.layers)) == length(layers)) { cells.sketch <- Cells(x = object[[sketched.assay]], layer = sketched.layers[i]) } else if (length(unique(sketched.layers)) == 1) { cells.sketch <- intersect(Cells(x = object[[sketched.assay]][[sketched.layers[[1]]]]), Cells(object[[assay]][[layers[i] ]] )) } if (isTRUE(x = verbose)) { message( length(x = cells.sketch), ' atomic cells identified in the sketched.assay' ) message("Correcting embeddings") } emb <- UnSketchEmbeddings( atom.data = LayerData( object = object[[sketched.assay]], layer = layers[i], features = features ), atom.cells = cells.sketch, orig.data = LayerData( object = object[[assay]], layer = layers[i], features = features ), embeddings = Embeddings(object = object[[reduction]]), sketch.matrix = sketch.matrix) emb.list[[i]] <- emb cells.list[[i]] <- colnames(x = emb) } emb.all <- t(x = matrix( data = unlist(emb.list), nrow = ncol(x = object[[reduction]]), ncol = length(unlist(cells.list)))) rownames(emb.all) <- unlist(cells.list) emb.all <- emb.all[colnames(object[[assay]]), ] object[[reduction.name]] <- CreateDimReducObject( embeddings = emb.all, loadings = Loadings(object = object[[reduction]]), key = reduction.key, assay = assay ) CheckGC() return(object) } #' Calculate the local structure preservation metric #' #' Calculates a metric that describes how well the local structure of each group #' prior to integration is preserved after integration. This procedure works as #' follows: For each group, compute a PCA, compute the top num.neighbors in pca #' space, compute the top num.neighbors in corrected pca space, compute the #' size of the intersection of those two sets of neighbors. #' Return the average over all groups. #' #' @param object Seurat object #' @param grouping.var Grouping variable #' @param idents Optionally specify a set of idents to compute metric for #' @param neighbors Number of neighbors to compute in pca/corrected pca space #' @param reduction Dimensional reduction to use for corrected space #' @param reduced.dims Number of reduced dimensions to use #' @param orig.dims Number of PCs to use in original space #' @param verbose Display progress bar #' #' @return Returns the average preservation metric #' #' @importFrom RANN nn2 #' @importFrom utils txtProgressBar setTxtProgressBar #' #' @export #' @concept integration #' LocalStruct <- function( object, grouping.var, idents = NULL, neighbors = 100, reduction = "pca", reduced.dims = 1:10, orig.dims = 1:10, verbose = TRUE ) { if (is.null(x = idents)) { cells.use <- colnames(x = object) } else { cells.use <- WhichCells(object = object, idents = idents) } Idents(object = object) <- grouping.var local.struct <- list() ob.list <- SplitObject(object = object, split.by = grouping.var) if (verbose) { pb <- txtProgressBar( min = 1, max = length(x = ob.list), style = 3, file = stderr() ) } embeddings <- Embeddings(object = object[[reduction]])[, reduced.dims] for (i in 1:length(x = ob.list)) { ob <- ob.list[[i]] ob <- FindVariableFeatures( object = ob, verbose = FALSE, selection.method = "dispersion", nfeatures = 2000 ) ob <- ScaleData( object = ob, features = VariableFeatures(object = ob), verbose = FALSE ) ob <- RunPCA( object = ob, features = VariableFeatures(object = ob), verbose = FALSE, npcs = max(orig.dims) ) ob.cells <- intersect(x = cells.use, y = colnames(x = ob)) if (length(x = ob.cells) == 0) next nn.corrected <- nn2( data = embeddings[colnames(x = ob), ], query = embeddings[ob.cells, ], k = neighbors )$nn.idx nn.orig <- nn2( data = Embeddings(object = ob[["pca"]])[, orig.dims], query = Embeddings(object = ob[["pca"]])[ob.cells, orig.dims], k = neighbors )$nn.idx local.struct[[i]] <- sapply(X = 1:nrow(x = nn.orig), FUN = function(x) { length(x = intersect(x = nn.orig[x, ], y = nn.corrected[x, ])) / neighbors }) if (verbose) { setTxtProgressBar(pb = pb, value = i) } } names(x = local.struct) <- names(x = ob.list) return(local.struct) } #' Map query cells to a reference #' #' This is a convenience wrapper function around the following three functions #' that are often run together when mapping query data to a reference: #' \code{\link{TransferData}}, \code{\link{IntegrateEmbeddings}}, #' \code{\link{ProjectUMAP}}. Note that by default, the \code{weight.reduction} #' parameter for all functions will be set to the dimension reduction method #' used in the \code{\link{FindTransferAnchors}} function call used to construct #' the anchor object, and the \code{dims} parameter will be the same dimensions #' used to find anchors. #' #' @inheritParams IntegrateEmbeddings #' @inheritParams TransferData #' @inheritParams ProjectUMAP #' @param store.weights Determine if the weight and anchor matrices are stored. #' @param transferdata.args A named list of additional arguments to #' \code{\link{TransferData}} #' @param integrateembeddings.args A named list of additional arguments to #' \code{\link{IntegrateEmbeddings}} #' @param projectumap.args A named list of additional arguments to #' \code{\link{ProjectUMAP}} #' #' @return Returns a modified query Seurat object containing:#' #' \itemize{ #' \item{New Assays corresponding to the features transferred and/or their #' corresponding prediction scores from \code{\link{TransferData}}} #' \item{An integrated reduction from \code{\link{IntegrateEmbeddings}}} #' \item{A projected UMAP reduction of the query cells projected into the #' reference UMAP using \code{\link{ProjectUMAP}}} #' } #' #' @importFrom rlang exec #' #' @export #' @concept integration #' MapQuery <- function( anchorset, query, reference, refdata = NULL, new.reduction.name = NULL, reference.reduction = NULL, reference.dims = NULL, query.dims = NULL, store.weights = FALSE, reduction.model = NULL, transferdata.args = list(), integrateembeddings.args = list(), projectumap.args = list(), verbose = TRUE ) { transfer.reduction <- slot(object = anchorset, name = "command")$reduction if (DefaultAssay(anchorset@object.list[[1]]) %in% Assays(reference)) { DefaultAssay(reference) <- DefaultAssay(anchorset@object.list[[1]]) } else { stop('The assay used to create the anchorset does not match any', 'of the assays in the reference object.') } # determine anchor type if (grepl(pattern = "pca", x = transfer.reduction)) { anchor.reduction <- "pcaproject" # check if the anchorset can be used for mapping if (is.null(x = slot(object = anchorset, name = "command")$reference.reduction)) { stop('The reference.reduction parameter was not set when running ', 'FindTransferAnchors, so the resulting AnchorSet object cannot be used ', 'in the MapQuery function.') } } else if (grepl(pattern = "cca", x = transfer.reduction)) { anchor.reduction <- "cca" ref.cca.embedding <- Embeddings( slot(object = anchorset, name = "object.list")[[1]][["cca"]] )[slot(object = anchorset, name = "reference.cells"), ] rownames(x = ref.cca.embedding) <- gsub( pattern = "_reference", replacement = "", x = rownames(x = ref.cca.embedding) ) query.cca.embedding <- Embeddings( slot(object = anchorset, name = "object.list")[[1]][["cca"]] )[slot(object = anchorset, name = "query.cells"), ] rownames(x = query.cca.embedding) <- gsub( pattern = "_query", replacement = "", x = rownames(x = query.cca.embedding) ) reference[["cca"]] <- CreateDimReducObject( embeddings = ref.cca.embedding, key = "CCA_", assay = DefaultAssay(reference) ) query[["cca"]] <- CreateDimReducObject( embeddings = query.cca.embedding, key = "CCA_", assay = DefaultAssay(query) ) reference.reduction <- new.reduction.name <- "cca" reference.dims <- query.dims <- 1:ncol(x = ref.cca.embedding) } else if (grepl(pattern = "lsi", x = transfer.reduction)) { anchor.reduction <- "lsiproject" } else if (grepl(pattern = "direct", x = transfer.reduction)) { anchor.reduction <- paste0( slot(object = anchorset, name = "command")$bridge.assay.name, ".reduc" ) ref.reduction.emb <- Embeddings( object = slot( object = anchorset, name = "object.list" )[[1]][[anchor.reduction]])[ slot(object = anchorset, name = "reference.cells"),] rownames(ref.reduction.emb) <- gsub( pattern = "_reference", replacement = "", x = rownames(ref.reduction.emb) ) reference[[anchor.reduction]] <- CreateDimReducObject( embeddings = ref.reduction.emb, key = "L_", assay = DefaultAssay(reference) ) } else { stop("unkown type of anchors") } reference.reduction <- reference.reduction %||% slot(object = anchorset, name = "command")$reference.reduction %||% anchor.reduction new.reduction.name <- new.reduction.name %||% paste0("ref.", reference.reduction) # checking TransferData parameters td.badargs <- names(x = transferdata.args)[!names(x = transferdata.args) %in% names(x = formals(fun = TransferData))] if (length(x = td.badargs) > 0) { warning("The following arguments in transferdata.args are not valid: ", paste(td.badargs, collapse = ", "), immediate. = TRUE, call. = FALSE) } transferdata.args <- transferdata.args[names(x = transferdata.args) %in% names(x = formals(fun = TransferData))] transferdata.args$weight.reduction <- transferdata.args$weight.reduction %||% anchor.reduction # checking IntegrateEmbeddings parameters ie.badargs <- names(x = integrateembeddings.args)[!names(x = integrateembeddings.args) %in% names(x = formals(fun = IntegrateEmbeddings.TransferAnchorSet))] if (length(x = ie.badargs) > 0) { warning("The following arguments in integrateembeddings.args are not valid: ", paste(ie.badargs, collapse = ", "), immediate. = TRUE, call. = FALSE) } integrateembeddings.args <- integrateembeddings.args[names(x = integrateembeddings.args) %in% names(x = formals(fun = IntegrateEmbeddings.TransferAnchorSet))] integrateembeddings.args$reductions <- integrateembeddings.args$reductions %||% anchor.reduction integrateembeddings.args$weight.reduction <- integrateembeddings.args$weight.reduction %||% anchor.reduction slot(object = query, name = "tools")$TransferData <- NULL reuse.weights.matrix <- FALSE td.allarguments <- c(list(anchorset = anchorset, reference = reference, query = query, refdata = refdata, store.weights = TRUE, only.weights = is.null(x = refdata), verbose = verbose), transferdata.args) query <- exec("TransferData",!!!td.allarguments) if (inherits(x = transferdata.args$weight.reduction , "character") && transferdata.args$weight.reduction == integrateembeddings.args$weight.reduction) { reuse.weights.matrix <- TRUE } if (anchor.reduction != "cca") { ie.allarguments <- c(list( anchorset = anchorset, reference = reference, query = query, new.reduction.name = new.reduction.name, reuse.weights.matrix = reuse.weights.matrix, verbose = verbose ), integrateembeddings.args ) query <- exec("IntegrateEmbeddings",!!!ie.allarguments) Misc( object = query[[new.reduction.name]], slot = 'ref.dims' ) <- slot(object = anchorset, name = "command")$dims } slot(object = query, name = "tools")$MapQuery <- NULL if (store.weights) { slot(object = query, name = "tools")$MapQuery <- slot( object = query, name = "tools" )$TransferData slot(object = query, name = "tools")$MapQuery$anchor <- slot( object = anchorset, name = "anchors" ) } slot(object = query, name = "tools")$TransferData <- NULL if (!is.null(x = reduction.model)) { reference.dims <- reference.dims %||% slot(object = anchorset, name = "command")$dims query.dims <- query.dims %||% 1:ncol(x = query[[new.reduction.name]]) if (length(x = query.dims) != length(x = reference.dims)) { message("Query and reference dimensions are not equal, proceeding with reference dimensions.") query.dims <- reference.dims } ref_nn.num <- Misc(object = reference[[reduction.model]], slot = "model")$n_neighbors pu.allarguments <- c(list( query = query, query.reduction = new.reduction.name, query.dims = query.dims, reference = reference, reference.dims = reference.dims, reference.reduction = reference.reduction, reduction.model = reduction.model, k.param = ref_nn.num ), projectumap.args ) query <- exec("ProjectUMAP",!!!pu.allarguments) } return(query) } #' @param anchors AnchorSet object or just anchor matrix from the #' Anchorset object returned from FindTransferAnchors #' @param combined.object Combined object (ref + query) from the #' Anchorset object returned #' @param query.neighbors Neighbors object computed on query cells #' @param ref.embeddings Reference embeddings matrix #' @param query.embeddings Query embeddings matrix #' @param kanchors Number of anchors to use in projection steps when computing #' weights #' @param ndim Number of dimensions to use when working with low dimensional #' projections of the data #' @param ksmooth Number of cells to average over when computing transition #' probabilities #' @param ksnn Number of cells to average over when determining the kernel #' bandwidth from the SNN graph #' @param snn.prune Amount of pruning to apply to edges in SNN graph #' @param subtract.first.nn Option to the scoring function when computing #' distances to subtract the distance to the first nearest neighbor #' @param nn.method Nearest neighbor method to use (annoy or RANN) #' @param n.trees More trees gives higher precision when using annoy approximate #' nearest neighbor search #' @param query.weights Query weights matrix for reuse #' @param verbose Display messages/progress #' @param ... Reserved for internal use #' #' @return Returns a vector of cell scores #' #' @importClassesFrom SeuratObject Neighbor #' #' @rdname MappingScore #' @concept integration #' @export #' MappingScore.default <- function( anchors, combined.object, query.neighbors, ref.embeddings, query.embeddings, kanchors = 50, ndim = 50, ksmooth = 100, ksnn = 20, snn.prune = 0, subtract.first.nn = TRUE, nn.method = "annoy", n.trees = 50, query.weights = NULL, verbose = TRUE, ... ) { CheckDots(...) # Input checks start.time <- Sys.time() if (is.null(x = query.neighbors) || ncol(x = query.neighbors) < ksmooth) { message("Recomputing query neighborhoods.\nSetting mapping.score.k in ", "FindTransferAnchors to the ksmooth \nvalue here (", ksmooth, "), can bypass this calculation in future runs.") query.neighbors <- FindNeighbors( object = query.embeddings, k.param = ksmooth, nn.method = nn.method, n.trees = n.trees, cache.index = TRUE, return.neighbor = TRUE, verbose = FALSE ) } ref.cells <- rownames(x = ref.embeddings) query.cells <- rownames(query.embeddings) # Project reference values onto query if (verbose) { message("Projecting reference PCA onto query") } ## Need to set up an IntegrationData object to use FindWeights here int.mat <- matrix(data = NA, nrow = nrow(x = anchors), ncol = 0) rownames(x = int.mat) <- query.cells[anchors[, "cell2"]] slot(object = combined.object, name = 'tools')[["IT1"]] <- new( Class = "IntegrationData", anchors = anchors, neighbors = list(cells1 = ref.cells, cells2 = query.cells), integration.matrix = int.mat ) ## Finding weights of anchors in query pca space ref.pca.orig <- ref.embeddings[, 1:ndim] query.pca.orig <- query.embeddings[, 1:ndim] dr.weights <- suppressWarnings(expr = CreateDimReducObject( embeddings = rbind(query.pca.orig, ref.pca.orig) )) if (!is.null(x = query.weights)) { weights.matrix <- query.weights } else { combined.object <- FindWeights( object = combined.object, integration.name = "IT1", reduction = dr.weights, dims = 1:ncol(x = dr.weights), k = kanchors, sd.weight = 1, eps = 0, nn.method = nn.method, n.trees = n.trees, verbose = verbose ) weights.matrix <- GetIntegrationData( object = combined.object, integration.name = "IT1", slot = "weights" ) } ## Perform projection of ref pca values using weights matrix ref.pca <- ref.embeddings[ref.cells[anchors[, 1]], 1:ndim] rownames(x = ref.pca) <- paste0(rownames(x = ref.pca), "_reference") query.cells.projected <- Matrix::crossprod( x = as.sparse(x = ref.pca), y = weights.matrix ) colnames(x = query.cells.projected) <- query.cells rownames(x = query.cells.projected) <- colnames(x = ref.pca) # Re-project the query cells back onto query if (verbose) { message("Projecting back the query cells into original PCA space") } ## Compute new weights dr.weights <- suppressWarnings(CreateDimReducObject( embeddings = rbind( t(x = as.matrix(x = query.cells.projected)), ref.pca.orig[ref.cells, ] ), )) combined.object <- FindWeights( object = combined.object, integration.name = "IT1", reduction = dr.weights, dims = 1:ndim, k = kanchors, sd.weight = 1, eps = 0, nn.method = nn.method, n.trees = n.trees, reverse = TRUE, verbose = verbose ) weights.matrix <- GetIntegrationData( object = combined.object, integration.name = "IT1", slot = "weights" ) ## Project back onto query orig.pca <- query.embeddings[query.cells[anchors[, 2]], ] query.cells.back.corrected <- Matrix::t( x = Matrix::crossprod( x = as.sparse(x = orig.pca), y = weights.matrix)[1:ndim, ] ) query.cells.back.corrected <- as.matrix(x = query.cells.back.corrected) rownames(x = query.cells.back.corrected) <- query.cells query.cells.pca <- query.embeddings[query.cells, 1:ndim] if (verbose) { message("Computing scores:") message(" Finding neighbors of original query cells") } ## Compute original neighborhood of query cells if (is.null(x = query.neighbors)) { query.neighbors <- NNHelper( data = query.cells.pca, query = query.cells.pca, k = max(ksmooth, ksnn), method = nn.method, n.trees = n.trees, cache.index = TRUE ) } if (verbose) { message(" Finding neighbors of transformed query cells") } ## Compute new neighborhood of query cells after projections if (nn.method == "annoy") { if (is.null(x = Index(object = query.neighbors))) { corrected.neighbors <- NNHelper( data = query.cells.pca, query = query.cells.back.corrected, k = max(ksmooth, ksnn), method = nn.method, n.treees = n.trees, cache.index = TRUE ) } else { corrected.neighbors <- AnnoySearch( index = Index(object = query.neighbors), query = query.cells.back.corrected, k = max(ksmooth, ksnn) ) corrected.neighbors <- new( Class = 'Neighbor', nn.idx = corrected.neighbors$nn.idx, nn.dist = corrected.neighbors$nn.dists ) } } if (verbose) { message(" Computing query SNN") } snn <- ComputeSNN( nn_ranked = Indices(query.neighbors)[, 1:ksnn], prune = snn.prune ) query.cells.pca <- t(x = query.cells.pca) if (verbose) { message(" Determining bandwidth and computing transition probabilities") } scores <- ScoreHelper( snn = snn, query_pca = query.cells.pca, query_dists = Distances(object = query.neighbors), corrected_nns = Indices(object = corrected.neighbors), k_snn = ksnn, subtract_first_nn = subtract.first.nn, display_progress = verbose ) scores[scores > 1] <- 1 names(x = scores) <- query.cells end.time <- Sys.time() if (verbose) { message("Total elapsed time: ", end.time - start.time) } return(scores) } #' @rdname MappingScore #' @export #' @concept integration #' @method MappingScore AnchorSet #' MappingScore.AnchorSet <- function( anchors, kanchors = 50, ndim = 50, ksmooth = 100, ksnn = 20, snn.prune = 0, subtract.first.nn = TRUE, nn.method = "annoy", n.trees = 50, query.weights = NULL, verbose = TRUE, ... ) { CheckDots(...) combined.object <- slot(object = anchors, name = "object.list")[[1]] combined.object <- RenameCells( object = combined.object, new.names = unname(obj = make.unique(sapply( X = Cells(x = combined.object), FUN = RemoveLastField ))) ) query.cells <- make.unique(sapply( X = slot(object = anchors, name = "query.cells"), FUN = RemoveLastField )) ref.cells <- make.unique(sapply( X = slot(object = anchors, name = "reference.cells"), FUN = RemoveLastField )) query.embeddings <- Embeddings(object = subset( x = combined.object[["pcaproject.l2"]], cells = query.cells )) ref.embeddings <- Embeddings(object = subset( x = combined.object[["pcaproject.l2"]], cells = ref.cells )) # reduce size of anchorset combined object combined.object <- DietSeurat(object = combined.object) combined.object <- subset( x = combined.object, features = c(rownames(x = combined.object)[1]) ) for (i in colnames(x = combined.object[[]])) { combined.object[[i]] <- NULL } query.neighbors <- slot(object = anchors, name = "neighbors")[["query.neighbors"]] if (inherits(query.neighbors, "Neighbor") || is.null(query.neighbors)) { mapping_scores_list <- MappingScore( anchors = slot(object = anchors, name = "anchors"), combined.object = combined.object, query.neighbors = query.neighbors, ref.embeddings = ref.embeddings, query.embeddings = query.embeddings, kanchors = kanchors, ndim = ndim, ksmooth = ksmooth, ksnn = ksnn, snn.prune = snn.prune, subtract.first.nn = subtract.first.nn, nn.method = nn.method, n.trees = n.trees, query.weights = query.weights, verbose = verbose ) return(unlist(mapping_scores_list)) } query.neighbors.list <- query.neighbors mapping_scores_list <- list() original_anchors_data <- slot(object = anchors, name = "anchors") for (i in seq_along(query.neighbors.list)) { query.neighbors.i <- query.neighbors.list[[i]] # query cells in neighbors obj have suffix _query, strip to match query.cells.i <- gsub(pattern = "_query$", replacement = "", x = Cells(query.neighbors.i)) query.embeddings.i <- query.embeddings[rownames(query.embeddings) %in% query.cells.i, ] # subset anchors to query specific anchors_data <- original_anchors_data anchors_data_df <- as.data.frame(anchors_data) # indices of current query layer where query cells are in anchors, should < anchors obj query.indices.i <- which(query.cells.i %in% query.cells[anchors_data_df$cell2]) anchors_subset_df <- anchors_data_df[anchors_data_df$cell2 %in% query.indices.i, ] anchors_subset <- as.matrix(anchors_subset_df) slot(anchors, "anchors") <- anchors_subset mapping_scores_list[[i]] <- MappingScore( # input subset of layer-specific anchors anchors = slot(object = anchors, name = "anchors"), combined.object = combined.object, query.neighbors = query.neighbors.i, ref.embeddings = ref.embeddings, query.embeddings = query.embeddings.i, kanchors = kanchors, ndim = ndim, ksmooth = ksmooth, ksnn = ksnn, snn.prune = snn.prune, subtract.first.nn = subtract.first.nn, nn.method = nn.method, n.trees = n.trees, query.weights = query.weights, verbose = verbose ) slot(anchors, "anchors") <- original_anchors_data } return(unlist(mapping_scores_list)) } #' Calculates a mixing metric #' #' Here we compute a measure of how well mixed a composite dataset is. To #' compute, we first examine the local neighborhood for each cell (looking at #' max.k neighbors) and determine for each group (could be the dataset after #' integration) the k nearest neighbor and what rank that neighbor was in the #' overall neighborhood. We then take the median across all groups as the mixing #' metric per cell. #' #' @param object Seurat object #' @param grouping.var Grouping variable for dataset #' @param reduction Which dimensionally reduced space to use #' @param dims Dimensions to use #' @param k Neighbor number to examine per group #' @param max.k Maximum size of local neighborhood to compute #' @param eps Error bound on the neighbor finding algorithm (from RANN) #' @param verbose Displays progress bar #' #' @return Returns a vector of values of the mixing metric for each cell #' #' @importFrom RANN nn2 #' @importFrom pbapply pbsapply #' @importFrom future.apply future_sapply #' @importFrom future nbrOfWorkers #' @export #' @concept integration #' MixingMetric <- function( object, grouping.var, reduction = "pca", dims = 1:2, k = 5, max.k = 300, eps = 0, verbose = TRUE ) { my.sapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pbsapply, no = future_sapply ) embeddings <- Embeddings(object = object[[reduction]])[, dims] nn <- nn2( data = embeddings, k = max.k, eps = eps ) group.info <- object[[grouping.var, drop = TRUE]] groups <- unique(x = group.info) mixing <- my.sapply( X = 1:ncol(x = object), FUN = function(x) { sapply(X = groups, FUN = function(y) { which(x = group.info[nn$nn.idx[x, ]] == y)[k] }) } ) mixing[is.na(x = mixing)] <- max.k mixing <- apply( X = mixing, MARGIN = 2, FUN = median ) return(mixing) } #' Prepare an object list normalized with sctransform for integration. #' #' This function takes in a list of objects that have been normalized with the #' \code{\link{SCTransform}} method and performs the following steps: #' \itemize{ #' \item{If anchor.features is a numeric value, calls \code{\link{SelectIntegrationFeatures}} #' to determine the features to use in the downstream integration procedure.} #' \item{Ensures that the sctransform residuals for the features specified #' to anchor.features are present in each object in the list. This is #' necessary because the default behavior of \code{\link{SCTransform}} is to #' only store the residuals for the features determined to be variable. #' Residuals are recomputed for missing features using the stored model #' parameters via the \code{\link{GetResidual}} function.} #' \item{Subsets the \code{scale.data} slot to only contain the residuals for #' anchor.features for efficiency in downstream processing. } #' } #' #' @param object.list A list of \code{\link[SeuratObject]{Seurat}} objects to prepare for integration #' @param assay The name of the \code{\link[SeuratObject]{Assay}} to use for integration. This can be a #' single name if all the assays to be integrated have the same name, or a character vector #' containing the name of each \code{\link[SeuratObject]{Assay}} in each object to be integrated. The #' specified assays must have been normalized using \code{\link{SCTransform}}. #' If NULL (default), the current default assay for each object is used. #' @param anchor.features Can be either: #' \itemize{ #' \item{A numeric value. This will call \code{\link{SelectIntegrationFeatures}} #' to select the provided number of features to be used in anchor finding} #' \item{A vector of features to be used as input to the anchor finding #' process} #' } #' @param sct.clip.range Numeric of length two specifying the min and max values #' the Pearson residual will be clipped to #' @param verbose Display output/messages #' #' @return A list of \code{\link[SeuratObject]{Seurat}} objects with the appropriate \code{scale.data} slots #' containing only the required \code{anchor.features}. #' #' @importFrom pbapply pblapply #' @importFrom methods slot slot<- #' @importFrom future nbrOfWorkers #' @importFrom future.apply future_lapply #' #' @export #' @concept integration #' @examples #' \dontrun{ #' # to install the SeuratData package see https://github.com/satijalab/seurat-data #' library(SeuratData) #' data("panc8") #' #' # panc8 is a merged Seurat object containing 8 separate pancreas datasets #' # split the object by dataset and take the first 2 to integrate #' pancreas.list <- SplitObject(panc8, split.by = "tech")[1:2] #' #' # perform SCTransform normalization #' pancreas.list <- lapply(X = pancreas.list, FUN = SCTransform) #' #' # select integration features and prep step #' features <- SelectIntegrationFeatures(pancreas.list) #' pancreas.list <- PrepSCTIntegration( #' pancreas.list, #' anchor.features = features #' ) #' #' # downstream integration steps #' anchors <- FindIntegrationAnchors( #' pancreas.list, #' normalization.method = "SCT", #' anchor.features = features #' ) #' pancreas.integrated <- IntegrateData(anchors, normalization.method = "SCT") #' } #' PrepSCTIntegration <- function( object.list, assay = NULL, anchor.features = 2000, sct.clip.range = NULL, verbose = TRUE ) { my.lapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pblapply, no = future_lapply ) assay <- assay %||% sapply(X = object.list, FUN = DefaultAssay) assay <- rep_len(x = assay, length.out = length(x = object.list)) objects.names <- names(x = object.list) object.list <- lapply( X = 1:length(x = object.list), FUN = function(i) { DefaultAssay(object = object.list[[i]]) <- assay[i] object.list[[i]][[assay[i]]] <- as(object = object.list[[i]][[assay[i]]], Class = "SCTAssay") return(object.list[[i]]) } ) sct.check <- vapply( X = 1:length(x = object.list), FUN = function(i) { sct.check <- IsSCT(assay = object.list[[i]][[assay[i]]]) if (!sct.check) { if ("FindIntegrationAnchors" %in% Command(object = object.list[[i]]) && Command(object = object.list[[i]], command = "FindIntegrationAnchors", value = "normalization.method") == "SCT") { sct.check <- TRUE } } return(sct.check) }, FUN.VALUE = logical(length = 1L), USE.NAMES = FALSE ) if (!all(sct.check)) { stop( "The following assays have not been processed with SCTransform:\n", paste( ' object:', which(x = !sct.check, useNames = FALSE), '- assay:', assay[!sct.check], collapse = '\n' ), call. = FALSE ) } if (is.numeric(x = anchor.features)) { anchor.features <- SelectIntegrationFeatures( object.list = object.list, nfeatures = anchor.features, verbose = verbose ) } object.list <- my.lapply( X = 1:length(x = object.list), FUN = function(i) { obj <- GetResidual( object = object.list[[i]], assay = assay[i], features = anchor.features, replace.value = ifelse(test = is.null(x = sct.clip.range), yes = FALSE, no = TRUE), clip.range = sct.clip.range, verbose = FALSE ) scale.data <- GetAssayData( object = obj, assay = assay[i], layer = 'scale.data' ) obj <- SetAssayData( object = obj, layer = 'scale.data', new.data = scale.data[anchor.features, ], assay = assay[i] ) return(obj) } ) assays.used <- assay for (i in 1:length(x = object.list)) { assay <- as.character(x = assays.used[i]) object.list[[i]] <- LogSeuratCommand(object = object.list[[i]]) } names(x = object.list) <- objects.names return(object.list) } #' Select integration features #' #' Choose the features to use when integrating multiple datasets. This function #' ranks features by the number of datasets they are deemed variable in, #' breaking ties by the median variable feature rank across datasets. It returns #' the top scoring features by this ranking. #' #' If for any assay in the list, \code{\link{FindVariableFeatures}} hasn't been #' run, this method will try to run it using the \code{fvf.nfeatures} parameter #' and any additional ones specified through the \dots. #' #' @param object.list List of seurat objects #' @param nfeatures Number of features to return #' @param assay Name or vector of assay names (one for each object) from which #' to pull the variable features. #' @param verbose Print messages #' @param fvf.nfeatures nfeatures for \code{\link{FindVariableFeatures}}. Used #' if \code{VariableFeatures} have not been set for any object in #' \code{object.list}. #' @param ... Additional parameters to \code{\link{FindVariableFeatures}} #' #' @return A vector of selected features #' #' @importFrom utils head #' #' @export #' @concept integration #' #' @examples #' \dontrun{ #' # to install the SeuratData package see https://github.com/satijalab/seurat-data #' library(SeuratData) #' data("panc8") #' #' # panc8 is a merged Seurat object containing 8 separate pancreas datasets #' # split the object by dataset and take the first 2 #' pancreas.list <- SplitObject(panc8, split.by = "tech")[1:2] #' #' # perform SCTransform normalization #' pancreas.list <- lapply(X = pancreas.list, FUN = SCTransform) #' #' # select integration features #' features <- SelectIntegrationFeatures(pancreas.list) #' } #' SelectIntegrationFeatures <- function( object.list, nfeatures = 2000, assay = NULL, verbose = TRUE, fvf.nfeatures = 2000, ... ) { if (!is.null(x = assay)) { if (length(x = assay) != length(x = object.list)) { stop("If specifying the assay, please specify one assay per object in the object.list") } for (ii in length(x = object.list)) { DefaultAssay(object = object.list[[ii]]) <- assay[ii] } } else { assay <- sapply(X = object.list, FUN = DefaultAssay) } for (ii in 1:length(x = object.list)) { if (length(x = VariableFeatures(object = object.list[[ii]])) == 0) { if (verbose) { message(paste0("No variable features found for object", ii, " in the object.list. Running FindVariableFeatures ...")) } object.list[[ii]] <- FindVariableFeatures(object = object.list[[ii]], nfeatures = fvf.nfeatures, verbose = verbose, ...) } } var.features <- unname(obj = unlist(x = lapply( X = 1:length(x = object.list), FUN = function(x) VariableFeatures(object = object.list[[x]], assay = assay[x])) )) var.features <- sort(x = table(var.features), decreasing = TRUE) for (i in 1:length(x = object.list)) { var.features <- var.features[names(x = var.features) %in% rownames(x = object.list[[i]][[assay[i]]])] } tie.val <- var.features[min(nfeatures, length(x = var.features))] features <- names(x = var.features[which(x = var.features > tie.val)]) vf.list <- lapply(X = object.list, FUN = VariableFeatures) if (length(x = features) > 0) { feature.ranks <- sapply(X = features, FUN = function(x) { ranks <- sapply(X = vf.list, FUN = function(vf) { if (x %in% vf) { return(which(x = x == vf)) } return(NULL) }) median(x = unlist(x = ranks)) }) features <- names(x = sort(x = feature.ranks)) } features.tie <- var.features[which(x = var.features == tie.val)] tie.ranks <- sapply(X = names(x = features.tie), FUN = function(x) { ranks <- sapply(X = vf.list, FUN = function(vf) { if (x %in% vf) { return(which(x = x == vf)) } return(NULL) }) median(x = unlist(x = ranks)) }) features <- c( features, names(x = head(x = sort(x = tie.ranks), nfeatures - length(x = features))) ) return(features) } .FeatureRank <- function(features, flist, ranks = FALSE) { franks <- vapply( X = features, FUN = function(x) { return(median(x = unlist(x = lapply( X = flist, FUN = function(fl) { if (x %in% fl) { return(which(x = x == fl)) } return(NULL) } )))) }, FUN.VALUE = numeric(length = 1L) ) franks <- sort(x = franks) if (!isTRUE(x = ranks)) { franks <- names(x = franks) } return(franks) } #' Select integration features #' #' @param object Seurat object #' @param nfeatures Number of features to return for integration #' @param assay Name of assay to use for integration feature selection #' @param method Which method to pull. For \code{HVFInfo} and #' \code{VariableFeatures}, choose one from one of the #' following: #' \itemize{ #' \item \dQuote{vst} #' \item \dQuote{sctransform} or \dQuote{sct} #' \item \dQuote{mean.var.plot}, \dQuote{dispersion}, \dQuote{mvp}, or #' \dQuote{disp} #' } #' @param layers Name of layers to use for integration feature selection #' @param verbose Print messages #' @param ... Arguments passed on to \code{method} #' #' @export #' @concept integration #' SelectIntegrationFeatures5 <- function( object, nfeatures = 2000, assay = NULL, method = NULL, layers = NULL, verbose = TRUE, ... ) { assay <- assay %||% DefaultAssay(object = object) layers <- Layers(object = object[[assay]], search = layers) var.features <- VariableFeatures( object = object, assay = assay, nfeatures = nfeatures, method = method, layer = layers, simplify = TRUE ) return(var.features) } #' Select SCT integration features #' #' @param object Seurat object #' @param nfeatures Number of features to return for integration #' @param assay Name of assay to use for integration feature selection #' @param verbose Print messages #' @param ... Arguments passed on to \code{method} #' #' @export #' @concept integration #' SelectSCTIntegrationFeatures <- function( object, nfeatures = 3000, assay = NULL, verbose = TRUE, ... ) { assay <- assay %||% DefaultAssay(object = object) if (!inherits(x = object[[assay]], what = 'SCTAssay')) { abort(message = "'assay' must be an SCTAssay") } models <- levels(x = object[[assay]]) vf.list <- VariableFeatures( object = object[[assay]], layer = models, nfeatures = nfeatures, simplify = FALSE ) var.features <- sort( x = table(unlist(x = vf.list, use.names = FALSE)), decreasing = TRUE ) for (i in 1:length(x = models)) { vst_out <- SCTModel_to_vst(SCTModel = slot(object = object[[assay]], name = "SCTModel.list")[[models[[i]]]]) var.features <- var.features[names(x = var.features) %in% rownames(x = vst_out$gene_attr)] } tie.val <- var.features[min(nfeatures, length(x = var.features))] features <- names(x = var.features[which(x = var.features > tie.val)]) if (length(x = features) > 0) { feature.ranks <- sapply(X = features, FUN = function(x) { ranks <- sapply(X = vf.list, FUN = function(vf) { if (x %in% vf) { return(which(x = x == vf)) } return(NULL) }) median(x = unlist(x = ranks)) }) features <- names(x = sort(x = feature.ranks)) } features.tie <- var.features[which(x = var.features == tie.val)] tie.ranks <- sapply(X = names(x = features.tie), FUN = function(x) { ranks <- sapply(X = vf.list, FUN = function(vf) { if (x %in% vf) { return(which(x = x == vf)) } return(NULL) }) median(x = unlist(x = ranks)) }) features <- c( features, names(x = head(x = sort(x = tie.ranks), nfeatures - length(x = features))) ) return(features) } #' Transfer data #' #' Transfer categorical or continuous data across single-cell datasets. For #' transferring categorical information, pass a vector from the reference #' dataset (e.g. \code{refdata = reference$celltype}). For transferring #' continuous information, pass a matrix from the reference dataset (e.g. #' \code{refdata = GetAssayData(reference[['RNA']])}). #' #' The main steps of this procedure are outlined below. For a more detailed #' description of the methodology, please see Stuart, Butler, et al Cell 2019. #' \doi{10.1016/j.cell.2019.05.031}; \doi{10.1101/460147} #' #' For both transferring discrete labels and also feature imputation, we first #' compute the weights matrix. #' #' \itemize{ #' \item{Construct a weights matrix that defines the association between each #' query cell and each anchor. These weights are computed as 1 - the distance #' between the query cell and the anchor divided by the distance of the query #' cell to the \code{k.weight}th anchor multiplied by the anchor score #' computed in \code{\link{FindIntegrationAnchors}}. We then apply a Gaussian #' kernel width a bandwidth defined by \code{sd.weight} and normalize across #' all \code{k.weight} anchors.} #' } #' #' The main difference between label transfer (classification) and feature #' imputation is what gets multiplied by the weights matrix. For label transfer, #' we perform the following steps: #' #' \itemize{ #' \item{Create a binary classification matrix, the rows corresponding to each #' possible class and the columns corresponding to the anchors. If the #' reference cell in the anchor pair is a member of a certain class, that #' matrix entry is filled with a 1, otherwise 0.} #' \item{Multiply this classification matrix by the transpose of weights #' matrix to compute a prediction score for each class for each cell in the #' query dataset.} #' } #' #' For feature imputation, we perform the following step: #' \itemize{ #' \item{Multiply the expression matrix for the reference anchor cells by the #' weights matrix. This returns a predicted expression matrix for the #' specified features for each cell in the query dataset.} #' } #' #' #' @param anchorset An \code{\link{AnchorSet}} object generated by #' \code{\link{FindTransferAnchors}} #' @param refdata Data to transfer. This can be specified in one of two ways: #' \itemize{ #' \item{The reference data itself as either a vector where the names #' correspond to the reference cells, or a matrix, where the column names #' correspond to the reference cells.} #' \item{The name of the metadata field or assay from the reference object #' provided. This requires the reference parameter to be specified. If pulling #' assay data in this manner, it will pull the data from the data slot. To #' transfer data from other slots, please pull the data explicitly with #' \code{\link{GetAssayData}} and provide that matrix here.} #' } #' @param reference Reference object from which to pull data to transfer #' @param query Query object into which the data will be transferred. #' @param query.assay Name of the Assay to use from query #' @param weight.reduction Dimensional reduction to use for the weighting #' anchors. Options are: #' \itemize{ #' \item{pcaproject: Use the projected PCA used for anchor building} #' \item{lsiproject: Use the projected LSI used for anchor building} #' \item{pca: Use an internal PCA on the query only} #' \item{cca: Use the CCA used for anchor building} #' \item{custom DimReduc: User provided \code{\[SeuratObject]{DimReduc}} object #' computed on the query cells} #' } #' @param l2.norm Perform L2 normalization on the cell embeddings after #' dimensional reduction #' @param dims Set of dimensions to use in the anchor weighting procedure. If #' NULL, the same dimensions that were used to find anchors will be used for #' weighting. #' @param k.weight Number of neighbors to consider when weighting anchors #' @param sd.weight Controls the bandwidth of the Gaussian kernel for weighting #' @param eps Error bound on the neighbor finding algorithm (from #' \code{\link[RANN]{RANN}}) #' @param n.trees More trees gives higher precision when using annoy approximate #' nearest neighbor search #' @param verbose Print progress bars and output #' @param slot Slot to store the imputed data. Must be either "data" (default) #' or "counts" #' @param prediction.assay Return an \code{Assay} object with the prediction #' scores for each class stored in the \code{data} slot. #' @param only.weights Only return weights matrix #' @param store.weights Optionally store the weights matrix used for predictions #' in the returned query object. #' #' @return #' If \code{query} is not provided, for the categorical data in \code{refdata}, #' returns a data.frame with label predictions. If \code{refdata} is a matrix, #' returns an Assay object where the imputed data has been stored in the #' provided slot. #' #' If \code{query} is provided, a modified query object is returned. For #' the categorical data in refdata, prediction scores are stored as Assays #' (prediction.score.NAME) and two additional metadata fields: predicted.NAME #' and predicted.NAME.score which contain the class prediction and the score for #' that predicted class. For continuous data, an Assay called NAME is returned. #' NAME here corresponds to the name of the element in the refdata list. #' #' #' @references Stuart T, Butler A, et al. Comprehensive Integration of #' Single-Cell Data. Cell. 2019;177:1888-1902 \doi{10.1016/j.cell.2019.05.031} #' #' @importFrom Matrix t #' #' @export #' #' @concept integration #' #' @examples #' \dontrun{ #' # to install the SeuratData package see https://github.com/satijalab/seurat-data #' library(SeuratData) #' data("pbmc3k") #' #' # for demonstration, split the object into reference and query #' pbmc.reference <- pbmc3k[, 1:1350] #' pbmc.query <- pbmc3k[, 1351:2700] #' #' # perform standard preprocessing on each object #' pbmc.reference <- NormalizeData(pbmc.reference) #' pbmc.reference <- FindVariableFeatures(pbmc.reference) #' pbmc.reference <- ScaleData(pbmc.reference) #' #' pbmc.query <- NormalizeData(pbmc.query) #' pbmc.query <- FindVariableFeatures(pbmc.query) #' pbmc.query <- ScaleData(pbmc.query) #' #' # find anchors #' anchors <- FindTransferAnchors(reference = pbmc.reference, query = pbmc.query) #' #' # transfer labels #' predictions <- TransferData(anchorset = anchors, refdata = pbmc.reference$seurat_annotations) #' pbmc.query <- AddMetaData(object = pbmc.query, metadata = predictions) #' } #' TransferData <- function( anchorset, refdata, reference = NULL, query = NULL, query.assay = NULL, weight.reduction = 'pcaproject', l2.norm = FALSE, dims = NULL, k.weight = 50, sd.weight = 1, eps = 0, n.trees = 50, verbose = TRUE, slot = "data", prediction.assay = FALSE, only.weights = FALSE, store.weights = TRUE ) { combined.ob <- slot(object = anchorset, name = "object.list")[[1]] anchors <- slot(object = anchorset, name = "anchors") reference.cells <- slot(object = anchorset, name = "reference.cells") query.cells <- slot(object = anchorset, name = "query.cells") if (!is.null(query)) { query.assay <- query.assay %||% DefaultAssay(query) } label.transfer <- list() ValidateParams_TransferData( anchorset = anchorset, combined.ob = combined.ob, anchors = anchors, reference.cells = reference.cells, query.cells = query.cells, refdata = refdata, reference = reference, query = query, query.assay = query.assay, weight.reduction = weight.reduction, l2.norm = l2.norm, dims = dims, k.weight = k.weight, sd.weight = sd.weight, eps = eps, n.trees = n.trees, verbose = verbose, only.weights = only.weights, slot = slot, prediction.assay = prediction.assay, label.transfer = label.transfer ) if (!inherits(x = weight.reduction, what = "DimReduc") && weight.reduction == 'pca') { if (verbose) { message("Running PCA on query dataset") } features <- slot(object = anchorset, name = "anchor.features") query.ob <- query DefaultAssay(query.ob) <- query.assay query.ob <- ScaleData(object = query.ob, features = features, verbose = FALSE) query.ob <- RunPCA(object = query.ob, npcs = max(dims), features = features, verbose = FALSE) query.pca <- Embeddings(query.ob[['pca']]) rownames(x = query.pca) <- paste0(rownames(x = query.pca), "_query") #fill with 0s ref.pca <- matrix( data = 0, nrow = length(x = reference.cells), ncol = ncol(x = query.pca), dimnames = list(reference.cells, colnames(x = query.pca)) ) rm(query.ob) combined.pca.embeddings <- rbind(ref.pca, query.pca)[colnames(x = combined.ob), ] combined.pca <- CreateDimReducObject( embeddings = combined.pca.embeddings, key = "PC_", assay = DefaultAssay(object = combined.ob) ) combined.ob[["pca"]] <- combined.pca if (l2.norm) { combined.ob <- L2Dim(object = combined.ob, reduction = 'pca') } } if (!inherits(x = weight.reduction, what = "DimReduc") && weight.reduction == "lsi") { if (!("lsi" %in% Reductions(object = query))) { stop("Requested lsi for weight.reduction, but lsi not stored in query object.") } else { weight.reduction <- query[["lsi"]] } } if (inherits(x = weight.reduction, what = "DimReduc")) { weight.reduction <- RenameCells( object = weight.reduction, new.names = paste0(Cells(x = weight.reduction), "_query") ) } else { if (l2.norm) { weight.reduction.l2 <- paste0(weight.reduction, ".l2") if (weight.reduction.l2 %in% Reductions(object = combined.ob)) { combined.ob <- L2Dim(object = combined.ob, reduction = weight.reduction) } weight.reduction <- weight.reduction.l2 } weight.reduction <- combined.ob[[weight.reduction]] } dims <- dims %||% seq_len(length.out = ncol(x = weight.reduction)) if (max(dims) > ncol(x = weight.reduction)) { stop("dims is larger than the number of available dimensions in ", "weight.reduction (", ncol(x = weight.reduction), ").", call. = FALSE) } combined.ob <- SetIntegrationData( object = combined.ob, integration.name = "integrated", slot = 'anchors', new.data = anchors ) combined.ob <- SetIntegrationData( object = combined.ob, integration.name = "integrated", slot = 'neighbors', new.data = list('cells1' = reference.cells, 'cells2' = query.cells) ) combined.ob <- FindIntegrationMatrix( object = combined.ob, verbose = verbose ) combined.ob <- FindWeights( object = combined.ob, reduction = weight.reduction, dims = dims, k = k.weight, sd.weight = sd.weight, eps = eps, n.trees = n.trees, verbose = verbose ) weights <- GetIntegrationData( object = combined.ob, integration.name = "integrated", slot = 'weights' ) if (only.weights) { if (is.null(x = query)) { return(weights) } else { slot(object = query, name = "tools")[["TransferData"]] <- list(weights.matrix = weights) return(query) } } anchors <- as.data.frame(x = anchors) query.cells <- unname(obj = sapply( X = query.cells, FUN = function(x) gsub(pattern = "_query", replacement = "", x = x) )) transfer.results <- list() for (rd in 1:length(x = refdata)) { if (isFALSE(x = refdata[[rd]])) { transfer.results[[rd]] <- NULL next } rd.name <- names(x = refdata)[rd] # case for projection if (label.transfer[[rd]]) { anchors$id1 <- refdata[[rd]][anchors[, "cell1"]] reference.ids <- factor(x = anchors$id1, levels = unique(x = refdata[[rd]])) possible.ids <- levels(x = reference.ids) prediction.mat <- matrix( nrow = nrow(x = anchors), ncol = length(x = possible.ids), data = 0 ) for (i in 1:length(x = possible.ids)) { prediction.mat[which(reference.ids == possible.ids[i]), i] = 1 } if (verbose) { message("Predicting cell labels") } prediction.scores <- t(x = weights) %*% prediction.mat colnames(x = prediction.scores) <- possible.ids rownames(x = prediction.scores) <- query.cells if ("bridge.sets" %in% names(anchorset@weight.reduction@misc)) { bridge.weight <- anchorset@weight.reduction@misc$bridge.sets bridge.prediction.matrix <- as.sparse( x = dummy_cols( refdata[[rd]][ bridge.weight$bridge.ref_anchor ] )[, -1] ) colnames(bridge.prediction.matrix) <- gsub( pattern = ".data_", replacement = "", x = colnames(bridge.prediction.matrix) ) extra.id <- setdiff(possible.ids, colnames(bridge.prediction.matrix)) if (length(extra.id) > 0) { extra.prediction <- as.sparse(x = matrix( data = 0, nrow = nrow(bridge.prediction.matrix), ncol = length(extra.id) )) colnames(extra.prediction) <- extra.id bridge.prediction.matrix <- cbind( bridge.prediction.matrix, extra.prediction ) } bridge.prediction.matrix <- bridge.prediction.matrix[,possible.ids, drop = FALSE] bridge.prediction.scores <- t(bridge.weight$query.weights) %*% (t(bridge.weight$bridge.weights) %*% bridge.prediction.matrix)[bridge.weight$query.ref_anchor,] prediction.scores <- (prediction.scores + bridge.prediction.scores)/2 prediction.scores <- as.matrix(x = prediction.scores) } prediction.ids <- possible.ids[apply(X = prediction.scores, MARGIN = 1, FUN = which.max)] prediction.ids <- as.character(prediction.ids) prediction.max <- apply(X = prediction.scores, MARGIN = 1, FUN = max) if (is.null(x = query)) { prediction.scores <- cbind(prediction.scores, max = prediction.max) } predictions <- data.frame( predicted.id = prediction.ids, prediction.score = as.matrix(prediction.scores), row.names = query.cells, stringsAsFactors = FALSE ) if (prediction.assay || !is.null(x = query)) { predictions <- CreateAssayObject( data = t(x = as.matrix(x = prediction.scores)), check.matrix = FALSE ) Key(object = predictions) <- Key(paste0("predictionscore", rd.name), quiet = TRUE) } if (is.null(x = query)) { transfer.results[[rd]] <- predictions } else { query <- AddMetaData(object = query, metadata = prediction.max, col.name = paste0("predicted.", rd.name, ".score")) query <- AddMetaData(object = query, metadata = prediction.ids, col.name = paste0("predicted.", rd.name)) query[[paste0("prediction.score.", rd.name)]] <- predictions } } else { # case for transferring features reference.cell.indices <- reference.cells[anchors$cell1] refdata.anchors <- refdata[[rd]][, reference.cell.indices] nfeatures <- nrow(x = refdata[[rd]]) if (verbose) { message(paste0("Transfering ", nfeatures, " features onto reference data")) } new.data <- refdata.anchors %*% weights rownames(x = new.data) <- rownames(x = refdata[[rd]]) colnames(x = new.data) <- query.cells if (inherits(x = new.data, what = "Matrix")) { new.data <- as.sparse(x = new.data) } if (slot == "counts") { new.assay <- CreateAssayObject(counts = new.data, check.matrix = FALSE) } else if (slot == "data") { new.assay <- CreateAssayObject(data = new.data, check.matrix = FALSE) } Key(object = new.assay) <- Key(rd.name, quiet = TRUE) if (is.null(x = query)) { transfer.results[[rd]] <- new.assay } else { if (rd.name %in% Assays(object = query)) { message( rd.name, " already present in query. ", "Storing as ", paste0("predicted_", rd.name) ) rd.name <- paste0("predicted_", rd.name) } query[[rd.name]] <- new.assay } } } if (is.null(x = query)) { names(x = transfer.results) <- names(x = refdata) if (length(x = transfer.results) == 1) { transfer.results <- transfer.results[[1]] } return(transfer.results) } else { if (store.weights) { slot(object = query, name = "tools")[["TransferData"]] <- list(weights.matrix = weights) } return(query) } } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @param object.list List of Seurat objects #' @rdname AnnotateAnchors #' @export #' @method AnnotateAnchors default #' @concept integration #' AnnotateAnchors.default <- function( anchors, vars = NULL, slot = NULL, object.list, assay = NULL, ... ) { # reorder columns anchors <- anchors[, c("cell1", "dataset1", "cell2", "dataset2", "score")] colnames(x = anchors)[5] <- "anchor.score" cell.names <- lapply(X = object.list, FUN = Cells) cell1.names <- character(length = nrow(x = anchors)) for (dataset in unique(x = anchors$dataset1)) { dataset.cells <- which(x = anchors$dataset1 == dataset) cell1.names[dataset.cells] <- cell.names[[dataset]][anchors[dataset.cells, "cell1"]] } anchors$cell1 <- cell1.names cell2.names <- character(length(x = nrow(x = anchors))) for (dataset in unique(x = anchors$dataset2)) { dataset.cells <- which(x = anchors$dataset2 == dataset) cell2.names[dataset.cells] <- cell.names[[dataset]][anchors[dataset.cells, "cell2"]] } anchors$cell2 <- cell2.names slot <- slot %||% "data" assay <- assay %||% sapply(X = object.list, FUN = DefaultAssay) if (length(x = assay) == 1) { assay <- rep(x = assay, times = length(x = object.list)) } if (length(x = assay) != length(x = object.list)) { stop("Number of assays provided should either be one or the length of object.list") } for (ob in 1:length(x = object.list)) { DefaultAssay(object = object.list[[ob]]) <- assay[ob] } if (length(x = slot) == 1) { slot <- rep(x = slot, times = length(x = vars)) } if (length(x = vars) > 0) { for(v in 1:length(x = vars)) { var <- vars[v] var.list <- lapply(X = object.list, FUN = function(x) { tryCatch( expr = FetchData(object = x, vars = var, layer = slot[v]), error = function(e) { data.fetched <- as.data.frame( x = rep(x = NA, times = ncol(x = x)), row.names = Cells(x = x), stringsAsFactors = FALSE ) colnames(x = data.fetched) <- var return(data.fetched) } ) }) if (all(unlist(x = lapply(X = var.list, FUN = isFALSE)))) { warning( var, " not found in all objects", call. = FALSE, immediate. = TRUE ) next } if (any(unlist(x = lapply(X = var.list, FUN = isFALSE)))) { warning( var, " not in all objects. Filling missing objects with NA", call. = FALSE, immediate. = TRUE ) } if (is.null(x = names(x = object.list))) { names(x = var.list) <- 1:length(x = object.list) } else { names(x = var.list) <- names(x = object.list) } for(i in c(1, 2)) { cell <- paste0("cell", i) if (is.factor(x = anchors[, cell])) { anchors[, cell] <- as.character(x = anchors[, cell]) } for (j in unique(x = anchors[, paste0("dataset", i)])) { var.df <- var.list[[j]] dataset.cells <- which(x = anchors[, paste0("dataset", i)] == j) anchors[dataset.cells, paste0(cell, ".", var)] <- var.df[anchors[, cell][dataset.cells], ] } } # column specifying whether the annotation matches across pair of datasets anchors[, paste0(var, ".match")] <- anchors[, paste0("cell1.", var)] == anchors[, paste0("cell2.", var)] } } return(anchors) } #' @rdname AnnotateAnchors #' @export #' @method AnnotateAnchors IntegrationAnchorSet #' AnnotateAnchors.IntegrationAnchorSet <- function( anchors, vars = NULL, slot = NULL, object.list = NULL, assay = NULL, ... ) { anchor.df <- slot(object = anchors, name = 'anchors') object.list <- object.list %||% slot(object = anchors, name = 'object.list') anchor.df <- as.data.frame(x = anchor.df) anchor.df <- AnnotateAnchors( anchors = anchor.df, vars = vars, slot = slot, object.list = object.list, assay = assay ) return(anchor.df) } #' @param reference Reference object used in \code{\link{FindTransferAnchors}} #' @param query Query object used in \code{\link{FindTransferAnchors}} #' @rdname AnnotateAnchors #' @export #' @method AnnotateAnchors TransferAnchorSet #' AnnotateAnchors.TransferAnchorSet <- function( anchors, vars = NULL, slot = NULL, reference = NULL, query = NULL, assay = NULL, ... ) { anchor.df <- slot(object = anchors, name = 'anchors') if (class(x = reference) != class(x = query)) { stop("If setting reference/query, please set both parameters.") } if (is.null(x = reference)) { object.list <- slot(object = anchors, name = 'object.list')[[1]] reference.cells <- slot(object = anchors, name = "reference.cells") reference <- subset(x = object.list, cells = reference.cells, recompute = FALSE) reference <- RenameCells( object = reference, new.names = gsub(pattern = "_reference$", replacement = "", x = reference.cells) ) query.cells <- slot(object = anchors, name = "query.cells") query <- subset(x = object.list, cells = query.cells, recompute = FALSE) query <- RenameCells( object = query, new.names = gsub(pattern = "_query$", replacement = "", x = query.cells) ) } object.list <- list(reference = reference, query = query) anchor.df <- as.data.frame(x = anchor.df) anchor.df$dataset1 <- "reference" anchor.df$dataset2 <- "query" anchor.df <- AnnotateAnchors( anchors = anchor.df, vars = vars, slot = slot, object.list = object.list, assay = assay ) return(anchor.df) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Add dataset number and remove cell offset # # Record which dataset number in the original list of Seurat objects # each anchor cell came from, and correct the cell index so it corresponds to # the position of the anchor cell in its own dataset # # @param anchor.df Dataframe of anchors # @param offsets size of each dataset in anchor dataframe # @param obj.length Vector of object lengths # # @return Anchor dataframe with additional columns corresponding to the dataset # of each cell AddDatasetID <- function( anchor.df, offsets, obj.lengths ) { ndataset <- length(x = offsets) total.cells <- sum(obj.lengths) offsets <- c(offsets, total.cells) row.offset <- rep.int(x = offsets[1:ndataset], times = obj.lengths) dataset <- rep.int(x = 1:ndataset, times = obj.lengths) anchor.df <- data.frame( 'cell1' = anchor.df[, 1] - row.offset[anchor.df[, 1]], 'cell2' = anchor.df[, 2] - row.offset[anchor.df[, 2]], 'score' = anchor.df[, 3], 'dataset1' = dataset[anchor.df[, 1]], 'dataset2' = dataset[anchor.df[, 2]] ) return(anchor.df) } # Adjust sample tree to only include given reference objects # # @param x A sample tree # @param reference.objects a sorted list of reference object IDs # AdjustSampleTree <- function(x, reference.objects) { for (i in 1:nrow(x = x)) { obj.id <- -(x[i, ]) if (obj.id[[1]] > 0) { x[i, 1] <- -(reference.objects[[obj.id[[1]]]]) } if (obj.id[[2]] > 0) { x[i, 2] <- -(reference.objects[[obj.id[[2]]]]) } } return(x) } # Build tree of datasets based on cell similarity # # @param similarity.matrix Dataset similarity matrix # # @return Returns a heirarchical clustering of datasets # #' @importFrom stats hclust # BuildSampleTree <- function(similarity.matrix) { dist.mat <- as.dist(m = 1 / similarity.matrix) clusters <- hclust(d = dist.mat) return(clusters$merge) } # Construct nearest neighbor matrix from nn.idx # # @param nn.idx Nearest neighbor index matrix (nn.idx from RANN) # @param offset1 Offsets for the first neighbor # @param offset2 Offsets for the second neighbor # # @return returns a sparse matrix representing the NN matrix # ConstructNNMat <- function(nn.idx, offset1, offset2, dims) { k <- ncol(x = nn.idx) j <- as.numeric(x = t(x = nn.idx)) + offset2 i <- ((1:length(x = j)) - 1) %/% k + 1 + offset1 nn.mat <- sparseMatrix(i = i, j = j, x = 1, dims = dims) return(nn.mat) } # Count anchors between all datasets # # Counts anchors between each dataset and scales based on total number of cells # in the datasets # # @param anchor.df Matrix of anchors # @param offsets Dataset sizes in anchor matrix. Used to identify boundaries of # each dataset in matrix, so that total pairwise anchors between all datasets # can be counted # # @return Returns a similarity matrix # CountAnchors <- function( anchor.df, offsets, obj.lengths ) { similarity.matrix <- matrix(data = 0, ncol = length(x = offsets), nrow = length(x = offsets)) similarity.matrix[upper.tri(x = similarity.matrix, diag = TRUE)] <- NA total.cells <- sum(obj.lengths) offsets <- c(offsets, total.cells) for (i in 1:nrow(x = similarity.matrix)){ for (j in 1:ncol(x = similarity.matrix)){ if (!is.na(x = similarity.matrix[i, j])){ relevant.rows <- anchor.df[(anchor.df$dataset1 %in% c(i, j)) & (anchor.df$dataset2 %in% c(i, j)), ] score <- nrow(x = relevant.rows) ncell <- min(obj.lengths[[i]], obj.lengths[[j]]) similarity.matrix[i, j] <- score / ncell } } } return(similarity.matrix) } FilterAnchors <- function( object, assay = NULL, slot = "data", integration.name = 'integrated', features = NULL, k.filter = 200, nn.method = "annoy", n.trees = 50, eps = 0, verbose = TRUE ) { if (verbose) { message("Filtering anchors") } assay <- assay %||% DefaultAssay(object = object) features <- features %||% VariableFeatures(object = object) if (length(x = features) == 0) { stop("No features provided and no VariableFeatures computed.") } features <- unique(x = features) neighbors <- GetIntegrationData(object = object, integration.name = integration.name, slot = 'neighbors') nn.cells1 <- neighbors$cells1 nn.cells2 <- neighbors$cells2 if (min(length(x = nn.cells1), length(x = nn.cells2)) < k.filter) { warning("Number of anchor cells is less than k.filter. Retaining all anchors.") k.filter <- min(length(x = nn.cells1), length(x = nn.cells2)) anchors <- GetIntegrationData(object = object, integration.name = integration.name, slot = "anchors") } else { cn.data1 <- L2Norm( mat = as.matrix(x = t(x = GetAssayData( object = object[[assay[1]]], layer = slot)[features, nn.cells1])), MARGIN = 1) cn.data2 <- L2Norm( mat = as.matrix(x = t(x = GetAssayData( object = object[[assay[2]]], layer = slot)[features, nn.cells2])), MARGIN = 1) nn <- NNHelper( data = cn.data2[nn.cells2, ], query = cn.data1[nn.cells1, ], k = k.filter, method = nn.method, n.trees = n.trees, eps = eps ) anchors <- GetIntegrationData(object = object, integration.name = integration.name, slot = "anchors") position <- sapply(X = 1:nrow(x = anchors), FUN = function(x) { which(x = anchors[x, "cell2"] == Indices(object = nn)[anchors[x, "cell1"], ])[1] }) anchors <- anchors[!is.na(x = position), ] if (verbose) { message("\tRetained ", nrow(x = anchors), " anchors") } } object <- SetIntegrationData( object = object, integration.name = integration.name, slot = "anchors", new.data = anchors ) return(object) } FindAnchors_v3 <- function( object.pair, assay, slot, cells1, cells2, internal.neighbors, reduction, reduction.2 = character(), nn.reduction = reduction, dims = 1:10, k.anchor = 5, k.filter = 200, k.score = 30, max.features = 200, nn.method = "annoy", n.trees = 50, nn.idx1 = NULL, nn.idx2 = NULL, eps = 0, projected = FALSE, verbose = TRUE ) { # compute local neighborhoods, use max of k.anchor and k.score if also scoring to avoid # recomputing neighborhoods k.neighbor <- k.anchor if (!is.na(x = k.score)) { k.neighbor <- max(k.anchor, k.score) } object.pair <- FindNN( object = object.pair, cells1 = cells1, cells2 = cells2, internal.neighbors = internal.neighbors, dims = dims, reduction = reduction, reduction.2 = reduction.2, nn.reduction = nn.reduction, k = k.neighbor, nn.method = nn.method, n.trees = n.trees, nn.idx1 = nn.idx1, nn.idx2 = nn.idx2, eps = eps, verbose = verbose ) object.pair <- FindAnchorPairs( object = object.pair, integration.name = "integrated", k.anchor = k.anchor, verbose = verbose ) if (!is.na(x = k.filter)) { top.features <- TopDimFeatures( object = object.pair, reduction = reduction, dims = dims, features.per.dim = 100, max.features = max.features, projected = projected ) if(length(top.features) == 2){ top.features <- intersect(top.features[[1]], top.features[[2]]) } else{ top.features <- as.vector(top.features) } top.features <- top.features[top.features %in% rownames(x = object.pair)] object.pair <- FilterAnchors( object = object.pair, assay = assay, slot = slot, integration.name = 'integrated', features = top.features, k.filter = k.filter, nn.method = nn.method, n.trees = n.trees, eps = eps, verbose = verbose ) } if (!is.na(x = k.score)) { object.pair = ScoreAnchors( object = object.pair, assay = DefaultAssay(object = object.pair), integration.name = "integrated", verbose = verbose, k.score = k.score ) } anchors <- GetIntegrationData( object = object.pair, integration.name = 'integrated', slot = 'anchors' ) return(anchors) } FindAnchors_v5 <- function( object.pair, assay, slot, cells1, cells2, internal.neighbors, reduction, reduction.2 = character(), nn.reduction = reduction, dims = 1:10, k.anchor = 5, k.filter = 200, k.score = 30, max.features = 200, nn.method = "annoy", n.trees = 50, nn.idx1 = NULL, nn.idx2 = NULL, eps = 0, projected = FALSE, verbose = TRUE ) { ref.assay <- assay[1] query.assay <- assay[2] reference.layers <- Layers(object.pair[[ref.assay]], search = 'data')[1] query.layers <- setdiff(Layers(object.pair[[query.assay]], search = 'data'), reference.layers) anchor.list <- list() # Enable compatibility with multi-layer query for (i in seq_along(query.layers)) { cells2.i <- Cells( x = object.pair[[query.assay]], layer = query.layers[i] ) object.pair.i <- subset( x = object.pair, cells = c(cells1, cells2.i) ) object.pair.i <- JoinLayers(object.pair.i) # Extract the neighbors for the current query layer from the neighbors list query.neighbors.sub <- internal.neighbors[["query.neighbors"]][[i]] nn.idx2.i <- nn.idx2[[i]] anchor.list[[i]] <- FindAnchors_v3( object.pair = object.pair.i, assay = assay, slot = slot, cells1 = cells1, cells2 = cells2.i, internal.neighbors = list( "ref.neighbors" = internal.neighbors[["ref.neighbors"]], "query.neighbors" = query.neighbors.sub # neighbors for current layer ), reduction = reduction, reduction.2 = reduction.2, nn.reduction = nn.reduction, dims = dims, k.anchor = k.anchor, k.filter = k.filter, k.score = k.score, max.features = max.features, nn.method = nn.method, n.trees = n.trees, nn.idx1 = nn.idx1, nn.idx2 = nn.idx2.i, #select the layer specific nn.idx2 eps = eps, projected = projected, verbose = verbose ) anchor.list[[i]][,2] <- match(x = cells2.i, table = cells2)[anchor.list[[i]][,2]] anchor.list[[i]] <- t(anchor.list[[i]]) } anchors <- t(x = matrix( data = unlist(x = anchor.list), nrow = 3, ncol = sum( sapply(X = anchor.list, FUN = function(x) ncol(x)) ) ) ) colnames(anchors) <- c('cell1', 'cell2', 'score') return(anchors) } FindAnchors <- function( object.pair, assay, slot, cells1, cells2, internal.neighbors, reduction, reduction.2 = character(), nn.reduction = reduction, dims = 1:10, k.anchor = 5, k.filter = 200, k.score = 30, max.features = 200, nn.method = "annoy", n.trees = 50, nn.idx1 = NULL, nn.idx2 = NULL, eps = 0, projected = FALSE, verbose = TRUE ) { if (inherits(x = object.pair[[assay[1]]], what = 'Assay')) { FindAnchors.function <- FindAnchors_v3 } else if (inherits(x = object.pair[[assay[1]]], what = 'Assay5')) { FindAnchors.function <- FindAnchors_v5 } anchors <- FindAnchors.function( object.pair = object.pair, assay = assay, slot = slot, cells1 = cells1, cells2 = cells2, internal.neighbors = internal.neighbors, reduction = reduction, reduction.2 = reduction.2, nn.reduction = nn.reduction, dims = dims, k.anchor = k.anchor, k.filter = k.filter, k.score = k.score, max.features = max.features, nn.method = nn.method, n.trees = n.trees, nn.idx1 = nn.idx1, nn.idx2 = nn.idx2, eps = eps, projected = projected, verbose = verbose ) return(anchors) } # Find Anchor pairs # FindAnchorPairs <- function( object, integration.name = 'integrated', k.anchor = 5, verbose = TRUE ) { neighbors <- GetIntegrationData(object = object, integration.name = integration.name, slot = 'neighbors') max.nn <- c(ncol(x = neighbors$nnab), ncol(x = neighbors$nnba)) if (any(k.anchor > max.nn)) { message(paste0('warning: requested k.anchor = ', k.anchor, ', only ', min(max.nn), ' in dataset')) k.anchor <- min(max.nn) } if (verbose) { message("Finding anchors") } # convert cell name to neighbor index nn.cells1 <- neighbors$cells1 nn.cells2 <- neighbors$cells2 cell1.index <- suppressWarnings(which(colnames(x = object) == nn.cells1, arr.ind = TRUE)) ncell <- 1:nrow(x = neighbors$nnab) ncell <- ncell[ncell %in% cell1.index] anchors <- list() # pre allocate vector anchors$cell1 <- rep(x = 0, length(x = ncell) * 5) anchors$cell2 <- anchors$cell1 anchors$score <- anchors$cell1 + 1 idx <- 0 indices.ab <- Indices(object = neighbors$nnab) indices.ba <- Indices(object = neighbors$nnba) for (cell in ncell) { neighbors.ab <- indices.ab[cell, 1:k.anchor] mutual.neighbors <- which( x = indices.ba[neighbors.ab, 1:k.anchor, drop = FALSE] == cell, arr.ind = TRUE )[, 1] for (i in neighbors.ab[mutual.neighbors]){ idx <- idx + 1 anchors$cell1[idx] <- cell anchors$cell2[idx] <- i anchors$score[idx] <- 1 } } anchors$cell1 <- anchors$cell1[1:idx] anchors$cell2 <- anchors$cell2[1:idx] anchors$score <- anchors$score[1:idx] anchors <- t(x = do.call(what = rbind, args = anchors)) anchors <- as.matrix(x = anchors) object <- SetIntegrationData( object = object, integration.name = integration.name, slot = 'anchors', new.data = anchors ) if (verbose) { message(paste0("\tFound ", nrow(x = anchors), " anchors")) } return(object) } FindIntegrationMatrix <- function( object, assay = NULL, integration.name = 'integrated', features.integrate = NULL, verbose = TRUE ) { assay <- assay %||% DefaultAssay(object = object) neighbors <- GetIntegrationData(object = object, integration.name = integration.name, slot = 'neighbors') nn.cells1 <- neighbors$cells1 nn.cells2 <- neighbors$cells2 if (inherits(x = object[[assay[1]]], what = 'Assay5')) { object <- JoinLayers(object) } anchors <- GetIntegrationData( object = object, integration.name = integration.name, slot = 'anchors' ) if (verbose) { message("Finding integration vectors") } features.integrate <- features.integrate %||% rownames( x = GetAssayData(object = object, assay = assay, layer = "data") ) data.use1 <- t(x = GetAssayData( object = object, assay = assay, layer = "data")[features.integrate, nn.cells1] ) data.use2 <- t(x = GetAssayData( object = object, assay = assay, layer = "data")[features.integrate, nn.cells2] ) anchors1 <- nn.cells1[anchors[, "cell1"]] anchors2 <- nn.cells2[anchors[, "cell2"]] data.use1 <- data.use1[anchors1, ] data.use2 <- data.use2[anchors2, ] integration.matrix <- data.use2 - data.use1 object <- SetIntegrationData( object = object, integration.name = integration.name, slot = 'integration.matrix', new.data = integration.matrix ) return(object) } # Find nearest neighbors # FindNN <- function( object, cells1 = NULL, cells2 = NULL, internal.neighbors, grouping.var = NULL, dims = 1:10, reduction = "cca.l2", reduction.2 = character(), nn.dims = dims, nn.reduction = reduction, k = 300, nn.method = "annoy", n.trees = 50, nn.idx1 = NULL, nn.idx2 = NULL, eps = 0, integration.name = 'integrated', verbose = TRUE ) { if (xor(x = is.null(x = cells1), y = is.null(x = cells2))) { stop("cells1 and cells2 must both be specified") } if (!is.null(x = cells1) && !is.null(x = cells2) && !is.null(x = grouping.var)) { stop("Specify EITHER grouping.var or cells1/2.") } if (is.null(x = cells1) && is.null(x = cells2) && is.null(x = grouping.var)) { stop("Please set either cells1/2 or grouping.var") } if (!is.null(x = grouping.var)) { if (nrow(x = unique(x = object[[grouping.var]])) != 2) { stop("Number of groups in grouping.var not equal to 2.") } groups <- names(x = sort(x = table(object[[grouping.var]]), decreasing = TRUE)) cells1 <- colnames(x = object)[object[[grouping.var]] == groups[[1]]] cells2 <- colnames(x = object)[object[[grouping.var]] == groups[[2]]] } if (verbose) { message("Finding neighborhoods") } dim.data.self <- Embeddings(object = object[[nn.reduction]])[, nn.dims] if (!is.null(x = internal.neighbors[[1]])) { nnaa <- internal.neighbors[[1]] } else { dims.cells1.self <- dim.data.self[cells1, ] nnaa <- NNHelper( data = dims.cells1.self, k = k + 1, method = nn.method, n.trees = n.trees, eps = eps, cache.index = TRUE, index = nn.idx1 ) nn.idx1 <- Index(object = nnaa) } if (!is.null(x = internal.neighbors[[2]])) { nnbb <- internal.neighbors[[2]] } else { dims.cells2.self <- dim.data.self[cells2, ] nnbb <- NNHelper( data = dims.cells2.self, k = k + 1, method = nn.method, n.trees = n.trees, eps = eps, cache.index = TRUE ) nn.idx2 <- Index(object = nnbb) } if (length(x = reduction.2) > 0) { nnab <- NNHelper( data = Embeddings(object = object[[reduction.2]])[cells2, nn.dims], query = Embeddings(object = object[[reduction.2]])[cells1, nn.dims], k = k, method = nn.method, n.trees = n.trees, eps = eps, index = if (reduction.2 == nn.reduction) nn.idx2 else NULL ) nnba <- NNHelper( data = Embeddings(object = object[[reduction]])[cells1, nn.dims], query = Embeddings(object = object[[reduction]])[cells2, nn.dims], k = k, method = nn.method, n.trees = n.trees, eps = eps, index = if (reduction == nn.reduction) nn.idx1 else NULL ) } else { dim.data.opposite <- Embeddings(object = object[[reduction]])[ ,dims] dims.cells1.opposite <- dim.data.opposite[cells1, ] dims.cells2.opposite <- dim.data.opposite[cells2, ] nnab <- NNHelper( data = dims.cells2.opposite, query = dims.cells1.opposite, k = k, method = nn.method, n.trees = n.trees, eps = eps, index = if (reduction == nn.reduction) nn.idx2 else NULL ) nnba <- NNHelper( data = dims.cells1.opposite, query = dims.cells2.opposite, k = k, method = nn.method, n.trees = n.trees, eps = eps, index = if (reduction == nn.reduction) nn.idx1 else NULL ) } object <- SetIntegrationData( object = object, integration.name = integration.name, slot = 'neighbors', new.data = list('nnaa' = nnaa, 'nnab' = nnab, 'nnba' = nnba, 'nnbb' = nnbb, 'cells1' = cells1, 'cells2' = cells2) ) return(object) } # @param reduction a DimReduc object containing cells in the query object # @param reverse Compute weights matrix for reference anchors that are nearest # to query cells. Used in mapping metric to perform projection of query cells # back from reference space. FindWeights <- function( object, reduction = NULL, assay = NULL, integration.name = 'integrated', dims = 1:10, features = NULL, k = 300, sd.weight = 1, nn.method = "annoy", n.trees = 50, eps = 0, reverse = FALSE, verbose = TRUE ) { if (verbose) { message("Finding integration vector weights") } if (is.null(x = reduction) & is.null(x = features)) { stop("Need to specify either dimension reduction object or a set of features") } assay <- assay %||% DefaultAssay(object = object) neighbors <- GetIntegrationData(object = object, integration.name = integration.name, slot = 'neighbors') nn.cells1 <- neighbors$cells1 nn.cells2 <- neighbors$cells2 anchors <- GetIntegrationData( object = object, integration.name = integration.name, slot = 'anchors' ) if (reverse) { anchors.cells2 <- nn.cells2[anchors[, "cell2"]] anchors.cells1 <- nn.cells1[anchors[, "cell1"]] to.keep <- !duplicated(x = anchors.cells1) anchors.cells1 <- anchors.cells1[to.keep] anchors.cells2 <- anchors.cells2[to.keep] if (length(anchors.cells1) < k || length(anchors.cells2) < k) { stop("Number of anchor cells is less than k.weight. Consider lowering k.weight to less than ", min(length(anchors.cells1), length(anchors.cells2)), " or increase k.anchor.") } if (is.null(x = features)) { data.use <- Embeddings(object = reduction)[nn.cells1, dims] data.use.query <- Embeddings(object = reduction)[nn.cells2, dims] } else { data.use <- t(x = GetAssayData( object = object, layer = 'data', assay = assay)[features, nn.cells1] ) data.use.query <- t(x = GetAssayData( object = object, layer = 'data', assay = assay)[features, nn.cells2] ) } knn_2_2 <- NNHelper( data = data.use[anchors.cells1, ], query = data.use.query, k = k, method = nn.method, n.trees = n.trees, eps = eps ) } else { anchors.cells2 <- unique(x = nn.cells2[anchors[, "cell2"]]) if (length(anchors.cells2) < k) { stop("Number of anchor cells is less than k.weight. Consider lowering k.weight to less than ", length(anchors.cells2), " or increase k.anchor.") } if (is.null(x = features)) { data.use <- Embeddings(reduction)[nn.cells2, dims] } else { data.use <- t(x = GetAssayData(object = object, layer = 'data', assay = assay)[features, nn.cells2]) } knn_2_2 <- NNHelper( data = data.use[anchors.cells2, ], query = data.use, k = k, method = nn.method, n.trees = n.trees, eps = eps ) } distances <- Distances(object = knn_2_2) distances <- 1 - (distances / distances[, ncol(x = distances)]) cell.index <- Indices(object = knn_2_2) integration.matrix <- GetIntegrationData( object = object, integration.name = integration.name, slot = "integration.matrix" ) weights <- FindWeightsC( cells2 = 0:(length(x = nn.cells2) - 1), distances = as.matrix(x = distances), anchor_cells2 = anchors.cells2, integration_matrix_rownames = rownames(x = integration.matrix), cell_index = cell.index, anchor_score = anchors[, "score"], min_dist = 0, sd = sd.weight, display_progress = verbose ) object <- SetIntegrationData( object = object, integration.name = integration.name, slot = 'weights', new.data = weights ) return(object) } # Find weight matrix between query and reference cells from a neighbor object # # FindWeightsNN <- function( nn.obj, query.cells, reference.cells, verbose = TRUE ) { distances <- Distances(object = nn.obj) distances <- 1 - (distances / distances[, ncol(x = distances)]) cell.index <- Indices(object = nn.obj) weights <- FindWeightsC( cells2 = 0:(length(query.cells) - 1), distances = as.matrix(x = distances), anchor_cells2 = reference.cells, integration_matrix_rownames = reference.cells, cell_index = cell.index, anchor_score = rep(1, length(reference.cells)), min_dist = 0, sd = 1, display_progress = verbose ) colnames(weights) <- query.cells return(weights) } # Work out the anchor cell offsets for given set of cells in anchor list # # @param anchors A dataframe of anchors, from AnchorSet object # @param dataset Dataset number (1 or 2) # @param cell Cell number (1 or 2) # @param cellnames.list List of cell names in all objects # @param cellnames list of cell names for only the object in question # # @return Returns a list of offsets # GetCellOffsets <- function(anchors, dataset, cell, cellnames.list, cellnames) { cell.id <- sapply(X = 1:nrow(x = anchors), FUN = function(x) { cellnames.list[[anchors[, dataset+3][x]]][anchors[, cell][x]] }) cell.offset <- sapply( X = 1:length(x = cell.id), FUN = function(x) { return(which(x = cellnames == cell.id[x])) } ) return(cell.offset) } # Map queries to reference # # Map query objects onto assembled reference dataset # # @param anchorset Anchorset found by FindIntegrationAnchors # @param reference Pre-integrated reference dataset to map query datasets to # @param new.assay.name Name for the new assay containing the integrated data # @param normalization.method Name of normalization method used: LogNormalize # or SCT # @param features Vector of features to use when computing the PCA to determine the weights. Only set # if you want a different set from those used in the anchor finding process # @param features.to.integrate Vector of features to integrate. By default, will use the features # used in anchor finding. # @param dims Number of PCs to use in the weighting procedure # @param k.weight Number of neighbors to consider when weighting # @param weight.reduction Dimension reduction to use when calculating anchor weights. # This can be either: # \itemize{ # \item{A string, specifying the name of a dimension reduction present in all objects to be integrated} # \item{A vector of strings, specifying the name of a dimension reduction to use for each object to be integrated} # \item{NULL, in which case a new PCA will be calculated and used to calculate anchor weights} # } # Note that, if specified, the requested dimension reduction will only be used for calculating anchor weights in the # first merge between reference and query, as the merged object will subsequently contain more cells than was in # query, and weights will need to be calculated for all cells in the object. # @param sd.weight Controls the bandwidth of the Gaussian kernel for weighting # @param preserve.order Do not reorder objects based on size for each pairwise integration. # @param eps Error bound on the neighbor finding algorithm (from \code{\link[RANN]{RANN}}) # @param verbose Print progress bars and output # # @return Returns an integrated matrix # MapQueryData <- function( anchorset, reference, new.assay.name = "integrated", normalization.method = c("LogNormalize", "SCT"), features = NULL, features.to.integrate = NULL, dims = 1:30, k.weight = 100, weight.reduction = NULL, weights.matrix = NULL, no.offset = FALSE, sd.weight = 1, preserve.order = FALSE, eps = 0, verbose = TRUE ) { normalization.method <- match.arg(arg = normalization.method) reference.datasets <- slot(object = anchorset, name = 'reference.objects') object.list <- slot(object = anchorset, name = 'object.list') anchors <- slot(object = anchorset, name = 'anchors') features <- features %||% slot(object = anchorset, name = "anchor.features") features.to.integrate <- features.to.integrate %||% features cellnames.list <- list() for (ii in 1:length(x = object.list)) { cellnames.list[[ii]] <- colnames(x = object.list[[ii]]) } if (length(x = reference.datasets) == length(x = object.list)) { query.datasets <- NULL } else { query.datasets <- setdiff(x = seq_along(along.with = object.list), y = reference.datasets) } my.lapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pblapply, no = future_lapply ) query.corrected <- my.lapply( X = query.datasets, FUN = function(dataset1) { if (verbose) { message("\nIntegrating dataset ", dataset1, " with reference dataset") } filtered.anchors <- anchors[anchors$dataset1 %in% reference.datasets & anchors$dataset2 == dataset1, ] integrated <- RunIntegration( filtered.anchors = filtered.anchors, reference = reference, query = object.list[[dataset1]], new.assay.name = new.assay.name, normalization.method = normalization.method, cellnames.list = cellnames.list, features.to.integrate = features.to.integrate, weight.reduction = weight.reduction, weights.matrix = weights.matrix, no.offset = no.offset, features = features, dims = dims, k.weight = k.weight, sd.weight = sd.weight, eps = eps, verbose = verbose ) return(integrated) } ) reference.integrated <- GetAssayData( object = reference, layer = 'data' )[features.to.integrate, ] query.corrected[[length(x = query.corrected) + 1]] <- reference.integrated all.integrated <- do.call(cbind, query.corrected) return(all.integrated) } # Convert nearest neighbor information to a sparse matrix # # @param idx Nearest neighbor index # @param distance Nearest neighbor distance # @param k Number of nearest neighbors # NNtoMatrix <- function(idx, distance, k) { nn <- list() x <- 1 for (i in 1:nrow(x = idx)) { for (j in 2:k) { nn.idx <- idx[i, j] nn.dist <- distance[i, j] nn[[x]] <- c('i' = i, 'j' = nn.idx, 'x' = 1/nn.dist) x <- x + 1 } } nn <- do.call(what = rbind, args = nn) nn.matrix <- new( Class = 'dgTMatrix', i = as.integer(x = nn[, 1] - 1), j = as.integer(x = nn[, 2] - 1), x = as.numeric(x = nn[, 3]), Dim = as.integer(x = c(nrow(idx), nrow(x = idx))) ) nn.matrix <- as.sparse(x = nn.matrix) return(nn.matrix) } # Pairwise dataset integration # # Used for reference construction # # @param anchorset Results from FindIntegrationAnchors # @param new.assay.name Name for the new assay containing the integrated data # @param normalization.method Name of normalization method used: LogNormalize # or SCT # @param features Vector of features to use when computing the PCA to determine # the weights. Only set if you want a different set from those used in the # anchor finding process # @param features.to.integrate Vector of features to integrate. By default, # will use the features used in anchor finding. # @param dims Number of PCs to use in the weighting procedure # @param k.weight Number of neighbors to consider when weighting # @param weight.reduction Dimension reduction to use when calculating anchor # weights. This can be either: # \itemize{ # \item{A string, specifying the name of a dimension reduction present in # all objects to be integrated} # \item{A vector of strings, specifying the name of a dimension reduction to # use for each object to be integrated} # \item{NULL, in which case a new PCA will be calculated and used to # calculate anchor weights} # } # Note that, if specified, the requested dimension reduction will only be used # for calculating anchor weights in the first merge between reference and # query, as the merged object will subsequently contain more cells than was in # query, and weights will need to be calculated for all cells in the object. # @param sd.weight Controls the bandwidth of the Gaussian kernel for weighting # @param sample.tree Specify the order of integration. If NULL, will compute # automatically. # @param preserve.order Do not reorder objects based on size for each pairwise # integration. # @param eps Error bound on the neighbor finding algorithm (from # \code{\link[RANN]{RANN}}) # @param verbose Print progress bars and output # # @return Returns a Seurat object with a new integrated Assay # PairwiseIntegrateReference <- function( anchorset, new.assay.name = "integrated", normalization.method = c("LogNormalize", "SCT"), features = NULL, features.to.integrate = NULL, dims = 1:30, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, eps = 0, verbose = TRUE ) { object.list <- slot(object = anchorset, name = "object.list") reference.objects <- slot(object = anchorset, name = "reference.objects") features <- features %||% slot(object = anchorset, name = "anchor.features") features.to.integrate <- features.to.integrate %||% features if (length(x = reference.objects) == 1) { ref.obj <- object.list[[reference.objects]] ref.obj[[new.assay.name]] <- CreateAssayObject( data = GetAssayData(ref.obj, layer = 'data')[features.to.integrate, ], check.matrix = FALSE ) DefaultAssay(object = ref.obj) <- new.assay.name return(ref.obj) } anchors <- slot(object = anchorset, name = "anchors") offsets <- slot(object = anchorset, name = "offsets") objects.ncell <- sapply(X = object.list, FUN = ncol) if (!is.null(x = weight.reduction)) { if (length(x = weight.reduction) == 1 | inherits(x = weight.reduction, what = "DimReduc")) { if (length(x = object.list) == 2) { weight.reduction <- list(NULL, weight.reduction) } else if (inherits(x = weight.reduction, what = "character")) { weight.reduction <- as.list(x = rep(x = weight.reduction, times = length(x = object.list))) } else { stop("Invalid input for weight.reduction. Please specify either the names of the dimension", "reduction for each object in the list or provide DimReduc objects.") } } if (length(x = weight.reduction) != length(x = object.list)) { stop("Please specify a dimension reduction for each object, or one dimension reduction to be used for all objects") } if (inherits(x = weight.reduction, what = "character")) { weight.reduction <- as.list(x = weight.reduction) } available.reductions <- lapply(X = object.list, FUN = FilterObjects, classes.keep = 'DimReduc') for (ii in 1:length(x = weight.reduction)) { if (ii == 1 & is.null(x = weight.reduction[[ii]])) next if (!inherits(x = weight.reduction[[ii]], what = "DimReduc")) { if (!weight.reduction[[ii]] %in% available.reductions[[ii]]) { stop("Requested dimension reduction (", weight.reduction[[ii]], ") is not present in object ", ii) } weight.reduction[[ii]] <- object.list[[ii]][[weight.reduction[[ii]]]] } } } if (is.null(x = sample.tree)) { similarity.matrix <- CountAnchors( anchor.df = anchors, offsets = offsets, obj.lengths = objects.ncell ) similarity.matrix <- similarity.matrix[reference.objects, reference.objects] sample.tree <- BuildSampleTree(similarity.matrix = similarity.matrix) sample.tree <- AdjustSampleTree(x = sample.tree, reference.objects = reference.objects) } cellnames.list <- list() for (ii in 1:length(x = object.list)) { cellnames.list[[ii]] <- colnames(x = object.list[[ii]]) } unintegrated <- suppressWarnings(expr = merge( x = object.list[[reference.objects[[1]]]], y = object.list[reference.objects[2:length(x = reference.objects)]] )) names(x = object.list) <- as.character(-(1:length(x = object.list))) if (!is.null(x = weight.reduction)) { names(x = weight.reduction) <- names(x = object.list) } if (verbose & (length(x = reference.objects) != length(x = object.list))) { message("Building integrated reference") } for (ii in 1:nrow(x = sample.tree)) { merge.pair <- as.character(x = sample.tree[ii, ]) length1 <- ncol(x = object.list[[merge.pair[1]]]) length2 <- ncol(x = object.list[[merge.pair[2]]]) if (!(preserve.order) & (length2 > length1)) { merge.pair <- rev(x = merge.pair) sample.tree[ii, ] <- as.numeric(merge.pair) } if (!is.null(x = weight.reduction)) { # extract the correct dimreduc objects, in the correct order weight.pair <- weight.reduction[merge.pair] } else { weight.pair <- NULL } object.1 <- DietSeurat( object = object.list[[merge.pair[1]]], assays = DefaultAssay(object = object.list[[merge.pair[1]]]), counts = FALSE ) object.2 <- DietSeurat( object = object.list[[merge.pair[2]]], assays = DefaultAssay(object = object.list[[merge.pair[2]]]), counts = FALSE ) # suppress key duplication warning suppressWarnings(object.1[["ToIntegrate"]] <- object.1[[DefaultAssay(object = object.1)]]) DefaultAssay(object = object.1) <- "ToIntegrate" object.1 <- DietSeurat(object = object.1, assays = "ToIntegrate") suppressWarnings(object.2[["ToIntegrate"]] <- object.2[[DefaultAssay(object = object.2)]]) DefaultAssay(object = object.2) <- "ToIntegrate" object.2 <- DietSeurat(object = object.2, assays = "ToIntegrate") datasets <- ParseMergePair(sample.tree, ii) if (verbose) { message( "Merging dataset ", paste(datasets$object2, collapse = " "), " into ", paste(datasets$object1, collapse = " ") ) } merged.obj <- merge(x = object.1, y = object.2, merge.data = TRUE) if (verbose) { message("Extracting anchors for merged samples") } filtered.anchors <- anchors[anchors$dataset1 %in% datasets$object1 & anchors$dataset2 %in% datasets$object2, ] integrated.matrix <- RunIntegration( filtered.anchors = filtered.anchors, normalization.method = normalization.method, reference = object.1, query = object.2, cellnames.list = cellnames.list, new.assay.name = new.assay.name, features.to.integrate = features.to.integrate, features = features, dims = dims, weight.reduction = weight.reduction, k.weight = k.weight, sd.weight = sd.weight, eps = eps, verbose = verbose ) integrated.matrix <- cbind(integrated.matrix, GetAssayData(object = object.1, layer = 'data')[features.to.integrate, ]) merged.obj[[new.assay.name]] <- CreateAssayObject(data = integrated.matrix, check.matrix = FALSE) DefaultAssay(object = merged.obj) <- new.assay.name object.list[[as.character(x = ii)]] <- merged.obj object.list[[merge.pair[[1]]]] <- NULL object.list[[merge.pair[[2]]]] <- NULL invisible(x = CheckGC()) } integrated.data <- GetAssayData( object = object.list[[as.character(x = ii)]], assay = new.assay.name, layer = 'data' ) integrated.data <- integrated.data[, colnames(x = unintegrated)] new.assay <- new( Class = 'Assay', counts = new(Class = "dgCMatrix"), data = integrated.data, scale.data = matrix(), var.features = vector(), meta.features = data.frame(row.names = rownames(x = integrated.data)), misc = NULL, key = paste0(new.assay.name, "_") ) unintegrated[[new.assay.name]] <- new.assay # "unintegrated" now contains the integrated assay DefaultAssay(object = unintegrated) <- new.assay.name VariableFeatures(object = unintegrated) <- features if (normalization.method == "SCT"){ unintegrated[[new.assay.name]] <- SetAssayData( object = unintegrated[[new.assay.name]], layer = "scale.data", new.data = as.matrix(x = GetAssayData(object = unintegrated[[new.assay.name]], layer = "data")) ) } unintegrated <- SetIntegrationData( object = unintegrated, integration.name = "Integration", slot = "anchors", new.data = anchors ) unintegrated <- SetIntegrationData( object = unintegrated, integration.name = "Integration", slot = "sample.tree", new.data = sample.tree ) unintegrated[["FindIntegrationAnchors"]] <- slot(object = anchorset, name = "command") suppressWarnings(expr = unintegrated <- LogSeuratCommand(object = unintegrated)) return(unintegrated) } # Parse merge information from dataset clustering # # @param clustering clustering dataframe from hclust ($merge). # Gives the order of merging datasets to get to the root of the tree. # @param i current row in clustering dataframe # ParseMergePair <- function(clustering, i){ # return 2-element list of datasets in first and second object datasets <- list('object1' = clustering[i, 1], 'object2' = clustering[i, 2]) if (datasets$object1 > 0) { datasets$object1 <- ParseRow(clustering, datasets$object1) } if (datasets$object2 > 0) { datasets$object2 <- ParseRow(clustering, datasets$object2) } datasets$object1 <- abs(x = datasets$object1) datasets$object2 <- abs(x = datasets$object2) return(datasets) } # Parse row of clustering order # # Used recursively to work out the dataset composition of a merged object # # @param clustering clustering dataframe from hclust ($merge). # Gives the order of merging datasets to get to the root of the tree. # @param i current row in clustering dataframe # ParseRow <- function(clustering, i){ # returns vector of datasets datasets <- as.list(x = clustering[i, ]) if (datasets[[1]] > 0) { datasets[[1]] <- ParseRow(clustering = clustering, i = datasets[[1]]) } if (datasets[[2]] > 0) { datasets[[2]] <- ParseRow(clustering = clustering, i = datasets[[2]]) } return(unlist(datasets)) } #' @rdname ProjectCellEmbeddings #' @method ProjectCellEmbeddings Seurat #' @export #' #' ProjectCellEmbeddings.Seurat <- function( query, reference, query.assay = NULL, reference.assay = NULL, reduction = "pca", dims = 1:50, normalization.method = c("LogNormalize", "SCT"), scale = TRUE, verbose = TRUE, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, ... ) { if (verbose) { message("Projecting cell embeddings") } normalization.method <- match.arg(arg = normalization.method) query.assay <- query.assay %||% DefaultAssay(object = query) reference.assay <- reference.assay %||% DefaultAssay(object = reference) if (normalization.method == 'SCT') { if (!IsSCT(assay = reference[[reference.assay]])) { stop('reference in ', reference.assay, ' assay does not have a SCT model' ) } reference.model.num <- length(slot(object = reference[[reference.assay]], name = "SCTModel.list")) if (reference.model.num > 1) { stop("Given reference assay (", reference.assay, ") has ", reference.model.num , " reference sct models. Please provide a reference assay with a ", " single reference sct model.", call. = FALSE) } else if (reference.model.num == 0) { stop("Given reference assay (", reference.assay, ") doesn't contain a reference SCT model.") } } proj.pca <- ProjectCellEmbeddings( query = query[[query.assay]], reference = reference, reference.assay = reference.assay, reduction = reduction, dims = dims, scale = scale, normalization.method = normalization.method, verbose = verbose, nCount_UMI = nCount_UMI, feature.mean = feature.mean, feature.sd = feature.sd ) return(proj.pca) } #' @rdname ProjectCellEmbeddings #' @method ProjectCellEmbeddings Assay #' @export #' ProjectCellEmbeddings.Assay <- function( query, reference, reference.assay = NULL, reduction = "pca", dims = 1:50, scale = TRUE, normalization.method = NULL, verbose = TRUE, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, ... ) { features <- Reduce( f = intersect, x = list( rownames(x = Loadings(object = reference[[reduction]])), rownames(x = reference[[reference.assay]]), rownames(x = query) ) ) if (normalization.method == 'SCT') { slot <- 'counts' } else { slot <- 'data' } proj.pca <- ProjectCellEmbeddings( query = GetAssayData( object = query, layer= slot), reference = reference, reference.assay = reference.assay, reduction = reduction, dims = dims, scale = scale, normalization.method = normalization.method, verbose = verbose, features = features, nCount_UMI = nCount_UMI, feature.mean = feature.mean, feature.sd = feature.sd ) return(proj.pca) } #' @rdname ProjectCellEmbeddings #' @method ProjectCellEmbeddings SCTAssay #' @export #' ProjectCellEmbeddings.SCTAssay <- function( query, reference, reference.assay = NULL, reduction = "pca", dims = 1:50, scale = TRUE, normalization.method = NULL, verbose = TRUE, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, ... ) { if (normalization.method != 'SCT') { warning('Query data is SCT normalized, but normalization.method is set to LogNormalize') } features <- Reduce( f = intersect, x = list( rownames(x = Loadings(object = reference[[reduction]])), rownames(x = reference[[reference.assay]]), rownames(x = query$scale.data) ) ) query.data <- GetAssayData( object = query, layer = "scale.data")[features,] ref.feature.loadings <- Loadings(object = reference[[reduction]])[features, dims] proj.pca <- t(crossprod(x = ref.feature.loadings, y = query.data)) return(proj.pca) } #' @rdname ProjectCellEmbeddings #' @method ProjectCellEmbeddings StdAssay #' @export #' ProjectCellEmbeddings.StdAssay <- function( query, reference, reference.assay = NULL, reduction = "pca", dims = 1:50, scale = TRUE, normalization.method = NULL, verbose = TRUE, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, ... ) { reference.assay <- reference.assay %||% DefaultAssay(object = reference) features <- Reduce( f = intersect, x = list( rownames(x = Loadings(object = reference[[reduction]])), rownames(x = reference[[reference.assay]]) ) ) if (normalization.method == 'SCT') { layers.set <- Layers(object = query, search = 'counts') } else { layers.set <- Layers(object = query, search = 'data') } proj.pca.list <- list() cell.list <- list() for (i in seq_along(layers.set)) { proj.pca.list[[i]] <- t(ProjectCellEmbeddings( query = LayerData(object = query, layer = layers.set[i]), reference = reference, reference.assay = reference.assay, reduction = reduction, dims = dims, scale = scale, normalization.method = normalization.method, verbose = verbose, features = features, nCount_UMI = nCount_UMI[Cells(x = query, layer = layers.set[i])], feature.mean = feature.mean, feature.sd = feature.sd )) cell.list[[i]] <- colnames(proj.pca.list[[i]]) } proj.pca <- matrix( data = unlist(proj.pca.list), nrow = nrow(proj.pca.list[[1]]), ncol = ncol(query) ) rownames(proj.pca) <- rownames(proj.pca.list[[1]]) colnames(proj.pca) <- unlist(cell.list) proj.pca <- t(proj.pca) proj.pca <- proj.pca[colnames(query),] return(proj.pca) } #' @rdname ProjectCellEmbeddings #' @method ProjectCellEmbeddings default #' @export #' ProjectCellEmbeddings.default <- function( query, reference, reference.assay = NULL, reduction = "pca", dims = 1:50, scale = TRUE, normalization.method = NULL, verbose = TRUE, features = NULL, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, ... ){ features <- features %||% rownames(x = Loadings(object = reference[[reduction]])) if (normalization.method == 'SCT') { reference.SCT.model <- slot(object = reference[[reference.assay]], name = "SCTModel.list")[[1]] query <- FetchResiduals_reference( object = query, reference.SCT.model = reference.SCT.model, features = features, nCount_UMI = nCount_UMI) } else { query <- query[features,] if(inherits(x = reference[[reference.assay]], what = "Assay5")){ reference.data.list <- c() for (i in Layers(object = reference[[reference.assay]], search = "data")) { reference.data.list[[i]] <- LayerData( object = reference[[reference.assay]], layer = i )[features, ] } reference.data <- do.call(cbind, reference.data.list) } else { reference.data <- GetAssayData( object = reference, assay = reference.assay, layer = "data")[features, ] } if (is.null(x = feature.mean)) { if (inherits(x = reference.data, what = 'dgCMatrix')) { feature.mean <- RowMeanSparse(mat = reference.data) } else if (inherits(x = reference.data, what = "IterableMatrix")) { bp.stats <- BPCells::matrix_stats(matrix = reference.data, row_stats = "variance") feature.mean <- bp.stats$row_stats["mean",] } else { feature.mean <- rowMeans2(x = reference.data) } if (scale) { if (inherits(x = reference.data, what = "IterableMatrix")) { feature.sd <- sqrt(bp.stats$row_stats["variance",]) } else { feature.sd <- sqrt(x = RowVarSparse(mat = as.sparse(reference.data))) } feature.sd[is.na(x = feature.sd)] <- 1 feature.sd[feature.sd==0] <- 1 } else { feature.sd <- rep(x = 1, nrow(x = reference.data)) } feature.mean[is.na(x = feature.mean)] <- 1 } store.names <- dimnames(x = query) if (is.numeric(x = feature.mean)) { query <- FastSparseRowScaleWithKnownStats( mat = as.sparse(x = query), mu = feature.mean, sigma = feature.sd, display_progress = FALSE ) } dimnames(x = query) <- store.names } ref.feature.loadings <- Loadings(object = reference[[reduction]])[features, dims] proj.pca <- t(crossprod(x = ref.feature.loadings, y = query)) return(proj.pca) } #' @rdname ProjectCellEmbeddings #' @method ProjectCellEmbeddings IterableMatrix #' @export #' #' ProjectCellEmbeddings.IterableMatrix <- function( query, reference, reference.assay = NULL, reduction = "pca", dims = 1:50, scale = TRUE, normalization.method = NULL, verbose = TRUE, features = features, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, block.size = 10000, ... ) { features <- features %||% rownames(x = Loadings(object = reference[[reduction]])) features <- intersect(x = features, y = rownames(query)) if (normalization.method == 'SCT') { reference.SCT.model <- slot(object = reference[[reference.assay]], name = "SCTModel.list")[[1]] cells.grid <- split( x = 1:ncol(query), f = ceiling(seq_along(along.with = 1:ncol(query)) / block.size)) proj.list <- list() for (i in seq_along(along.with = cells.grid)) { query.i <- FetchResiduals_reference( object = as.sparse(query[,cells.grid[[i]]]), reference.SCT.model = reference.SCT.model, features = features, nCount_UMI = nCount_UMI[colnames(query)[cells.grid[[i]]]]) proj.list[[i]] <- t(Loadings(object = reference[[reduction]])[features, dims]) %*% query.i } proj.pca <- t(matrix( data = unlist(x = proj.list), nrow = length(x = dims), ncol = ncol(x = query), dimnames = list( colnames(x = Embeddings(object = reference[[reduction]]))[dims], colnames(x = query)) )) } else { query <- query[features,] reference.data.list <- c() for (i in Layers(object = reference[[reference.assay]], search = "data")) { reference.data.list[[i]] <- LayerData(object = reference[[reference.assay]], layer = i)[features, ] } reference.data <- do.call(cbind, reference.data.list) if (is.null(x = feature.mean)) { if (inherits(x = reference.data, what = 'dgCMatrix')) { feature.mean <- RowMeanSparse(mat = reference.data) } else if (inherits(x = reference.data, what = "IterableMatrix")) { bp.stats <- BPCells::matrix_stats( matrix = reference.data, row_stats = "variance") feature.mean <- bp.stats$row_stats["mean",] } else { feature.mean <- rowMeans(mat = reference.data) } if (scale) { if (inherits(x = reference.data, what = "IterableMatrix")) { feature.sd <- sqrt(x = bp.stats$row_stats["variance",]) } else { feature.sd <- sqrt( x = RowVarSparse( mat = as.sparse(x = reference.data) ) ) } feature.sd[is.na(x = feature.sd)] <- 1 feature.sd[feature.sd==0] <- 1 } else { feature.sd <- rep(x = 1, nrow(x = reference.data)) } feature.mean[is.na(x = feature.mean)] <- 1 } query.scale <- BPCells::min_by_row(mat = query, vals = 10 * feature.sd + feature.mean) query.scale <- (query.scale - feature.mean) / feature.sd proj.pca <- t(query.scale) %*% Loadings(object = reference[[reduction]])[features,dims] rownames(x = proj.pca) <- colnames(x = query) colnames(x = proj.pca) <- colnames(x = Embeddings(object = reference[[reduction]]))[dims] } return(proj.pca) } # Project new data onto SVD (LSI or PCA) # # A = U∑V SVD # U' = VA'/∑ LSI projection # # Note that because in LSI we don't multiply by ∑ to get the embeddings (it's just U), # we need to divide by ∑ in the projection to get the equivalent. Therefore need # the singular values, which (in Signac RunLSI) we store in the DimReduc misc slot. # # @param reduction A \code{DimReduc} object containing the SVD dimension # reduction. Assumes original irlba output is stored in the misc slot of the dimreduc. # @param data A data matrix to project onto the SVD. Must contain the same # features used to construct the original SVD. # @param mode "pca" or "lsi". Determines if we divide projected values by singular values. # @param features Features to use. If NULL, use all common features between # the dimreduc and the data matrix. # @param do.center Center the projected cell embeddings (subtract mean across cells) # @param do.scale Scale the projected cell embeddings (divide by standard deviation across cells) # @param use.original.stats When standardizing the vectors, use the mean and standard deviation # of the original vectors from the SVD, rather than the mean and standard deviation of the # projected vectors. # @param dims A vector containing the dimensions to use in the projection. If NULL (default), # project to all dimensions in the input SVD. # @param verbose Display messages # # @return Returns a matrix #' @importFrom Matrix crossprod # @export ProjectSVD <- function( reduction, data, mode = "pca", features = NULL, do.center = FALSE, do.scale = FALSE, use.original.stats = FALSE, dims = NULL, verbose = TRUE ) { vt <- Loadings(object = reduction) dims <- dims %||% seq_len(length.out = ncol(x = vt)) features <- features %||% rownames(x = vt) features <- intersect(x = features, y = rownames(x = data)) vt <- vt[features, dims] data <- data[features, ] if (verbose) { message("Projecting new data onto SVD") } projected.u <- as.matrix(t(vt) %*% data) if (mode == "lsi") { components <- slot(object = reduction, name = 'misc') sigma <- components$d projected.u <- projected.u / sigma[dims] } if (do.center) { if (use.original.stats) { components <- slot(object = reduction, name = 'misc') if ("u" %in% names(x = components)) { # preferentially use original irlba output stored in misc # signac scales and centers embeddings by default embed.mean <- apply(X = components$u, MARGIN = 2, FUN = mean) } else { # raw irlba output not stored, fall back to the reference embeddings ref.emb <- Embeddings(object = reduction) embed.mean <- apply(X = ref.emb, MARGIN = 2, FUN = mean) } } else { # projected.u is transposed so use MARGIN = 1 embed.mean <- apply(X = projected.u, MARGIN = 1, FUN = mean) } projected.u <- projected.u - embed.mean } if (do.scale) { if (use.original.stats) { components <- slot(object = reduction, name = 'misc') if ("u" %in% names(x = components)) { embed.sd <- apply(X = components$u, MARGIN = 2, FUN = sd) } else { ref.emb <- Embeddings(object = reduction) embed.sd <- apply(X = ref.emb, MARGIN = 2, FUN = sd) } } else { embed.sd <- apply(X = projected.u, MARGIN = 1, FUN = sd) } projected.u <- projected.u / embed.sd } return(t(x = projected.u)) } # Calculate position along a defined reference range for a given vector of # numerics. Will range from 0 to 1. # # @param x Vector of numeric type # @param lower Lower end of reference range # @param upper Upper end of reference range # #' @importFrom stats quantile # # @return Returns a vector that describes the position of each element in # x along the defined reference range # ReferenceRange <- function(x, lower = 0.025, upper = 0.975) { return((x - quantile(x = x, probs = lower)) / (quantile(x = x, probs = upper) - quantile(x = x, probs = lower))) } # Run integration between a reference and query object # # Should only be called from within another function # # @param filtered.anchors A dataframe containing only anchors between reference and query # @param reference A reference object # @param query A query object # @param cellnames.list List of all cell names in all objects to be integrated # @param new.assay.name Name for the new assay containing the integrated data # @param features Vector of features to use when computing the PCA to determine the weights. Only set # if you want a different set from those used in the anchor finding process # @param features.to.integrate Vector of features to integrate. By default, will use the features # used in anchor finding. # @param dims Number of PCs to use in the weighting procedure # @param k.weight Number of neighbors to consider when weighting # @param weight.reduction Dimension reduction to use when calculating anchor weights. # This can be either: # \itemize{ # \item{A string, specifying the name of a dimension reduction present in all objects to be integrated} # \item{A vector of strings, specifying the name of a dimension reduction to use for each object to be integrated} # \item{NULL, in which case a new PCA will be calculated and used to calculate anchor weights} # } # Note that, if specified, the requested dimension reduction will only be used for calculating anchor weights in the # first merge between reference and query, as the merged object will subsequently contain more cells than was in # query, and weights will need to be calculated for all cells in the object. # @param sd.weight Controls the bandwidth of the Gaussian kernel for weighting # @param sample.tree Specify the order of integration. If NULL, will compute automatically. # @param eps Error bound on the neighbor finding algorithm (from \code{\link[RANN]{RANN}}) # @param verbose Print progress bars and output # RunIntegration <- function( filtered.anchors, normalization.method, reference, query, cellnames.list, new.assay.name, features.to.integrate, weight.reduction, weights.matrix = NULL, no.offset = FALSE, features, dims, k.weight, sd.weight, eps, verbose ) { cells1 <- colnames(x = reference) cells2 <- colnames(x = query) if (nrow(x = filtered.anchors) < k.weight) { warning("Number of anchors is less than k.weight. Lowering k.weight for sample pair.") k.weight <- nrow(x = filtered.anchors) } merged.obj <- merge(x = reference, y = query, merge.data = TRUE) if (no.offset) { cell1.offset <- filtered.anchors[, 1] cell2.offset <- filtered.anchors[, 2] } else { cell1.offset <- GetCellOffsets( anchors = filtered.anchors, dataset = 1, cell = 1, cellnames.list = cellnames.list, cellnames = cells1 ) cell2.offset <- GetCellOffsets( anchors = filtered.anchors, dataset = 2, cell = 2, cellnames.list = cellnames.list, cellnames = cells2 ) } filtered.anchors[, 1] <- cell1.offset filtered.anchors[, 2] <- cell2.offset integration.name <- "integrated" merged.obj <- SetIntegrationData( object = merged.obj, integration.name = integration.name, slot = 'anchors', new.data = filtered.anchors ) merged.obj <- SetIntegrationData( object = merged.obj, integration.name = integration.name, slot = 'neighbors', new.data = list('cells1' = cells1, 'cells2' = cells2) ) merged.obj <- FindIntegrationMatrix( object = merged.obj, integration.name = integration.name, features.integrate = features.to.integrate, verbose = verbose ) assay <- DefaultAssay(object = merged.obj) if (is.null(x = weights.matrix)) { if (is.null(x = weight.reduction) && !is.null(x = dims)) { if (normalization.method == "SCT"){ # recenter residuals centered.resids <- ScaleData( object = GetAssayData(object = merged.obj, assay = assay, layer = "data"), do.scale = FALSE, do.center = TRUE, verbose = FALSE ) merged.obj[["pca"]] <- RunPCA( object = centered.resids[features, ], assay = assay, npcs = max(dims), verbose = FALSE, features = features ) } else { merged.obj <- ScaleData( object = merged.obj, features = features, verbose = FALSE ) merged.obj <- RunPCA( object = merged.obj, npcs = max(dims), verbose = FALSE, features = features ) } dr.weights <- merged.obj[['pca']] } else if(is.null(x = weight.reduction) && is.null(x = dims)) { dr.weights <- CreateDimReducObject( embeddings = as.matrix(x = t(x = GetAssayData(object = merged.obj))), key = "int_", assay = "ToIntegrate" ) dims <- 1:ncol(x = dr.weights) } else { # need to match order of objects dr <- weight.reduction[[2]] if (!all(cells2 %in% rownames(x = dr))) { stop("Query cells not present in supplied DimReduc object. Set weight.reduction to a DimReduc object containing the query cells.") } if (inherits(x = dr, what = "DimReduc")) { dr.weights <- dr } else { dr.weights <- query[[dr]] } dims <- 1:ncol(x = dr.weights) } merged.obj <- FindWeights( object = merged.obj, integration.name = integration.name, reduction = dr.weights, dims = dims, k = k.weight, sd.weight = sd.weight, eps = eps, verbose = verbose ) } else { merged.obj <- SetIntegrationData( object = merged.obj, integration.name = "integrated", slot = "weights", new.data = weights.matrix ) } merged.obj <- TransformDataMatrix( object = merged.obj, new.assay.name = new.assay.name, features.to.integrate = features.to.integrate, integration.name = integration.name, verbose = verbose ) integrated.matrix <- GetAssayData( object = merged.obj, assay = new.assay.name, layer = 'data' ) return(integrated.matrix[, cells2]) } # order samples based on sample tree # the first sample is reference sample SampleIntegrationOrder <- function(tree) { order <- tree[nrow(x = tree), ] while (sum(order > 0) != 0) { replace.idx <- which(x = order > 0)[1] replace <- tree[order[replace.idx], ] if (replace.idx == 1) { left <- vector() right <- order[(replace.idx + 1):length(x = order)] replace <- tree[order[replace.idx], ] order <- c(left, replace, right) } else if (replace.idx == length(x = order)) { left <- order[1:(replace.idx - 1)] right <- vector() } else { left <- order[1:(replace.idx - 1)] right <- order[(replace.idx + 1):length(x = order)] } order <- c(left, replace, right) } order <- order * (-1) return(order) } ScoreAnchors <- function( object, assay = NULL, integration.name = 'integrated', verbose = TRUE, k.score = 30 ) { assay <- assay %||% DefaultAssay(object = object) anchor.df <- as.data.frame(x = GetIntegrationData(object = object, integration.name = integration.name, slot = 'anchors')) neighbors <- GetIntegrationData(object = object, integration.name = integration.name, slot = "neighbors") offset <- length(x = neighbors$cells1) indices.aa <- Indices(object = neighbors$nnaa) indices.bb <- Indices(object = neighbors$nnbb) indices.ab <- Indices(object = neighbors$nnab) indices.ba <- Indices(object = neighbors$nnba) nbrsetA <- function(x) c(indices.aa[x, 1:k.score], indices.ab[x, 1:k.score] + offset) nbrsetB <- function(x) c(indices.ba[x, 1:k.score], indices.bb[x, 1:k.score] + offset) # score = number of shared neighbors anchor.new <- data.frame( 'cell1' = anchor.df[, 1], 'cell2' = anchor.df[, 2], 'score' = mapply( FUN = function(x, y) { length(x = intersect(x = nbrsetA(x = x), nbrsetB(x = y)))}, anchor.df[, 1], anchor.df[, 2] ) ) # normalize the score max.score <- quantile(anchor.new$score, 0.9) min.score <- quantile(anchor.new$score, 0.01) anchor.new$score <- anchor.new$score - min.score anchor.new$score <- anchor.new$score / (max.score - min.score) anchor.new$score[anchor.new$score > 1] <- 1 anchor.new$score[anchor.new$score < 0] <- 0 anchor.new <- as.matrix(x = anchor.new) object <- SetIntegrationData( object = object, integration.name = integration.name, slot = 'anchors', new.data = anchor.new ) return(object) } # Get top n features across given set of dimensions # # @param object Seurat object # @param reduction Which dimension reduction to use # @param dims Which dimensions to use # @param features.per.dim How many features to consider per dimension # @param max.features Number of features to return at most # @param projected Use projected loadings # TopDimFeatures <- function( object, reduction, dims = 1:10, features.per.dim = 100, max.features = 200, projected = FALSE ) { dim.reduction <- object[[reduction]] max.features <- max(length(x = dims) * 2, max.features) num.features <- sapply(X = 1:features.per.dim, FUN = function(y) { length(x = unique(x = as.vector(x = sapply(X = dims, FUN = function(x) { unlist(x = TopFeatures(object = dim.reduction, dim = x, nfeatures = y, balanced = TRUE, projected = projected)) })))) }) max.per.pc <- which.max(x = num.features[num.features < max.features]) features <- unique(x = as.vector(x = sapply(X = dims, FUN = function(x) { unlist(x = TopFeatures(object = dim.reduction, dim = x, nfeatures = max.per.pc, balanced = TRUE, projected = projected)) }))) features <- unique(x = features) return(features) } TransformDataMatrix <- function( object, assay = NULL, new.assay.name = 'integrated', integration.name = 'integrated', features.to.integrate = NULL, reduction = "cca", verbose = TRUE ) { if(verbose) { message("Integrating data") } assay <- assay %||% DefaultAssay(object = object) weights <- GetIntegrationData( object = object, integration.name = integration.name, slot = 'weights' ) integration.matrix <- GetIntegrationData( object = object, integration.name = integration.name, slot = 'integration.matrix' ) neighbors <- GetIntegrationData(object = object, integration.name = integration.name, slot = 'neighbors') nn.cells1 <- neighbors$cells1 nn.cells2 <- neighbors$cells2 data.use1 <- t(x = GetAssayData( object = object, assay = assay, layer = "data")[features.to.integrate, nn.cells1] ) data.use2 <- t(x = GetAssayData( object = object, assay = assay, layer = "data")[features.to.integrate, nn.cells2] ) integrated <- IntegrateDataC(integration_matrix = as.sparse(x = integration.matrix), weights = as.sparse(x = weights), expression_cells2 = as.sparse(x = data.use2)) dimnames(integrated) <- dimnames(data.use2) new.expression <- t(rbind(data.use1, integrated)) new.expression <- new.expression[, colnames(object)] new.assay <- new( Class = 'Assay', # key = paste0(new.assay.name,"_"), counts = new(Class = "dgCMatrix"), data = new.expression, scale.data = matrix(), var.features = vector(), meta.features = data.frame(row.names = rownames(x = new.expression)), misc = NULL, # key = paste0(new.assay.name, "_") key = Key(object = new.assay.name, quiet = TRUE) ) object[[new.assay.name]] <- new.assay return(object) } # Helper function to validate parameters for FindTransferAnchors # ValidateParams_FindTransferAnchors <- function( reference, query, normalization.method, recompute.residuals, reference.assay, reference.neighbors, query.assay, reduction, reference.reduction, project.query, features, scale, npcs, l2.norm, dims, k.anchor, k.filter, k.score, max.features, nn.method, n.trees, eps, approx.pca, mapping.score.k, verbose ) { reference.assay <- reference.assay %||% DefaultAssay(object = reference) ModifyParam(param = "reference.assay", value = reference.assay) query.assay <- query.assay %||% DefaultAssay(object = query) ModifyParam(param = "query.assay", value = query.assay) DefaultAssay(object = reference) <- reference.assay ModifyParam(param = "reference", value = reference) DefaultAssay(object = query) <- query.assay ModifyParam(param = "query", value = query) if (!is.logical(x = scale)) { stop("Scale should be TRUE or FALSE") } if (length(x = reference) > 1 | length(x = query) > 1) { stop("We currently only support transfer between a single query and reference", call. = FALSE) } if (!reduction %in% c("pcaproject", "cca", "lsiproject", "rpca")) { stop("Please select either pcaproject, rpca, cca, or lsiproject for the reduction parameter.", call. = FALSE) } if (reduction == "cca" && !is.null(x = reference.reduction)) { stop("Specifying a reference reduction is only compatible with reduction = 'pcaproject'", call. = FALSE) } if (!normalization.method %in% c("LogNormalize", "SCT")) { stop("Please select either LogNormalize or SCT, for the normalization.method parameter.", call. = FALSE) } if (normalization.method == "SCT") { ModifyParam(param = "k.filter", value = NA) } if (reduction == "lsiproject") { ModifyParam(param = "k.filter", value = NA) } # commented out to enable filter anchors for v5 assay # if (inherits(x = reference[[reference.assay]], what = 'Assay5') || # inherits(x = query[[query.assay]], what = 'Assay5')) { # # current filter anchors not support for v5 assay # ModifyParam(param = "k.filter", value = NA) # } if (!is.na(x = k.filter) && k.filter > ncol(x = query)) { warning("k.filter is larger than the number of cells present in the query.\n", "Continuing without anchor filtering.", immediate. = TRUE, call. = FALSE) ModifyParam(param = "k.filter", value = NA) } if ((k.anchor + 1) > min(ncol(x = query), ncol(x = reference))) { stop("Please set k.anchor to be smaller than the number of cells in query (", ncol(x = query), ") and reference (", ncol(x = reference), ") objects.", call. = FALSE) } if ((k.score + 1) > min(ncol(x = query), ncol(x = reference))) { stop("Please set k.score to be smaller than the number of cells in query (", ncol(x = query), ") and reference (", ncol(x = reference), ") objects.", call. = FALSE) } if (reduction == "cca" && isTRUE(x = project.query)) { stop("The project.query workflow is not compatible with reduction = 'cca'", call. = FALSE) } if (normalization.method == "SCT" && isTRUE(x = project.query) && !IsSCT(query[[query.assay]])) { stop("In the project.query workflow, normalization is SCT, but query is not SCT normalized", call. = FALSE) } if (IsSCT(assay = query[[query.assay]]) && IsSCT(assay = reference[[reference.assay]]) && normalization.method != "SCT") { warning("Both reference and query assays have been processed with SCTransform.", "Setting normalization.method = 'SCT' and continuing.") normalization.method <- "SCT" ModifyParam(param = "normalization.method", value = "SCT") } if (IsSCT(assay = query[[query.assay]]) && normalization.method == "LogNormalize") { stop("An SCT assay (", query.assay, ") was provided for query.assay but ", "normalization.method was set as LogNormalize", call. = FALSE) } if (IsSCT(assay = query[[query.assay]]) && !inherits(x = query[[query.assay]], what = "SCTAssay")) { query[[query.assay]] <- as(object = query[[query.assay]], Class = "SCTAssay") ModifyParam(param = "query", value = query) } if (IsSCT(assay = reference[[reference.assay]]) && !inherits(x = reference[[reference.assay]], what = "SCTAssay")) { reference[[reference.assay]] <- as(object = reference[[reference.assay]], Class = "SCTAssay") ModifyParam(param = "reference", value = reference) } if (normalization.method != "SCT") { recompute.residuals <- FALSE ModifyParam(param = "recompute.residuals", value = recompute.residuals) } if (recompute.residuals) { # recompute.residuals only happens in ProjectCellEmbeddings, so k.filter set to NA. ModifyParam(param = "k.filter", value = NA) reference.model.num <- length(x = slot(object = reference[[reference.assay]], name = "SCTModel.list")) if (reference.model.num > 1) { # Enable compatibility with integrated reference with mutliple SCT models print("Given reference assay has multiple sct models, selecting model with most cells for finding transfer anchors") # stop("Given reference assay (", reference.assay, ") has ", reference.model.num , # " reference sct models. Please provide a reference assay with a ", # " single reference sct model.", call. = FALSE) } else if (reference.model.num == 0) { if (IsSCT(query[[query.assay]])) { stop("Given reference assay (", reference.assay, ") doesn't contain a reference SCT model.\n", "Query assay is a SCTAssay. ", "You can set recompute.residuals to FALSE ", "to use Query residuals to continue the analysis", call. = FALSE) } stop("Given reference assay (", reference.assay, ") doesn't contain a reference SCT model. ", call. = FALSE) } else if (reference.model.num == 1) { new.sct.assay <- reference.assay if (verbose) { message("Normalizing query using reference SCT model") } } query.umi.assay <- query.assay if (IsSCT(assay = query[[query.assay]])) { query.sct.models <- slot(object = query[[query.assay]], name = "SCTModel.list") query.umi.assay <- unique(x = unname(obj = unlist(x = lapply(X = query.sct.models, FUN = slot, name = "umi.assay")))) if (length(x = query.umi.assay) > 1) { stop("Query assay provided is an SCTAssay with multiple different original umi assays", call = FALSE) } if (!query.umi.assay %in% Assays(object = query)) { stop("Query assay provided is an SCTAssay based on an orignal UMI assay", " that is no longer present in the query Seurat object. Unable to", " recompute residuals based on the reference SCT model.\n", "If you want to use Query SCTAssay residuals to continue the analysis, ", "you can set recompute.residuals to FALSE", call. = FALSE) } } if (reduction %in% c('cca', 'rpca')) { query <- SCTransform( object = query, reference.SCT.model = slot(object = reference[[reference.assay]], name = "SCTModel.list")[[1]], residual.features = features, assay = query.umi.assay, new.assay.name = new.sct.assay, verbose = FALSE ) } else { new.sct.assay <- query.umi.assay } DefaultAssay(query) <- new.sct.assay ModifyParam(param = "query.assay", value = new.sct.assay) ModifyParam(param = "query", value = query) ModifyParam(param = "reference", value = reference) } if (IsSCT(assay = reference[[reference.assay]]) && normalization.method == "LogNormalize") { stop("An SCT assay (", reference.assay, ") was provided for reference.assay but ", "normalization.method was set as LogNormalize.", call. = FALSE) } if (!IsSCT(assay = reference[[reference.assay]]) && normalization.method == "SCT") { stop("Given reference.assay (", reference.assay, ") has not been processed with ", "SCTransform. Please either run SCTransform or set normalization.method = 'LogNormalize'.", call. = FALSE) } # Make data slot if DNE if (inherits(x = query[[query.assay]], what = "Assay5")){ if (is.null( tryCatch(expr = Layers(object = query[[query.assay]], search = 'data'), error = function (e) return(NULL)) ) ) { LayerData( object = query[[query.assay]], layer = "data") <- sparseMatrix( i = 1, j = 1, x = 1, dims = c(nrow(x = query[[query.assay]]), ncol(x = query[[query.assay]]) ) ) ModifyParam(param = "query", value = query) } } # features must be in both reference and query query.assay.check <- query.assay reference.assay.check <- reference.assay ref.features <- rownames(x = reference[[reference.assay.check]]) query.features <- rownames(x = query[[query.assay.check]]) if (normalization.method == "SCT") { if (IsSCT(query[[query.assay.check]])) { query.features <- rownames(x = query[[query.assay.check]]$scale.data) } query.model.features <- rownames(x = Misc(object = query[[query.assay]])$vst.out$gene_attr) query.features <- unique(c(query.features, query.model.features)) ref.model.features <- rownames(x = Misc(object = reference[[reference.assay]])$vst.out$gene_attr) ref.features <- unique(c(ref.features, ref.model.features)) } if (!is.null(x = features)) { if (project.query) { features.new <- intersect(x = features, y = ref.features) } else { features.new <- intersect(x = features, y = query.features) } if (length(x = features.new) != length(x = features)) { warning(length(x = features) - length(x = features.new), " features of ", "the features specified were not present in both the reference ", "query assays. \nContinuing with remaining ", length(x = features.new), " features.", immediate. = TRUE, call. = FALSE) features <- features.new } } else { if (project.query) { features <- intersect( x = VariableFeatures(object = query[[query.assay]]), y = ref.features ) } else { features <- intersect( x = VariableFeatures(object = reference[[reference.assay]]), y = query.features ) } } if (length(x = features) == 0) { stop("No features to use in finding transfer anchors. To troubleshoot, try ", "explicitly providing features to the features parameter and ensure that ", "they are present in both reference and query assays.", call. = FALSE) } ModifyParam(param = "features", value = features) if (!is.null(x = reference.reduction)) { if (project.query) { if (!reference.reduction %in% Reductions(object = query)){ stop("reference.reduction (", reference.reduction, ") is not present in ", "the provided query object (Note: project.query was set to TRUE).", call. = FALSE) } if (ncol(x = reference[[reference.reduction]]) < max(dims)) { stop("reference.reduction (", reference.reduction, ") does not contain ", "all the dimensions required by the dims parameter (Note: ", "project.query was set to TRUE).", call. = FALSE) } } else { if (!reference.reduction %in% Reductions(object = reference)){ stop("reference.reduction (", reference.reduction, ") is not present in ", "the provided reference object.", call. = FALSE) } if (ncol(x = reference[[reference.reduction]]) < max(dims)) { stop("reference.reduction (", reference.reduction, ") does not contain ", "all the dimensions required by the dims parameter.", call. = FALSE) } } } else { if (reduction == "lsiproject") { stop("Must supply a reference reduction if reduction='lsiproject'") } mdim <- max(dims) if (npcs < mdim) { warning("npcs is smaller than the largest value requested by the dims ", "parameter.\nSetting npcs to ", mdim, " and continuing.", immediate. = TRUE, call. = FALSE) ModifyParam(param = "npcs", value = mdim) if (mdim >= length(x = features)) { stop("npcs (", npcs, ") must be smaller than the number of features (", length(x = features), "). Please either lower the npcs and/or dims ", "parameter settings or increase the size of the feature set.", call. = FALSE) } } } if (!is.null(x = reference.neighbors)) { if (!reference.neighbors %in% Neighbors(object = reference)) { stop("Specified reference.neighbors (", reference.neighbors, ") is not ", "available in the provided reference object.", call. = FALSE) } k.nn <- max(k.score, k.anchor) if (ncol(x = Indices(reference[[reference.neighbors]])) < (k.nn + 1)){ stop("k.score or k.anchor is larger than the number of neighbors ", "contained in reference.nn. Recompute reference.nn using ", "FindNeighbors with k > k.score and k > k.anchor", call. = FALSE) } } } # Helper function to validate parameters for TransferData # ValidateParams_TransferData <- function( anchorset, combined.ob, anchors, reference.cells, query.cells, reference, query, query.assay, refdata, weight.reduction, l2.norm, dims, k.weight, sd.weight, eps, n.trees, verbose, slot, only.weights, prediction.assay, label.transfer ) { ## check refdata if (is.null(refdata)) { if (!only.weights) { stop("refdata is NULL and only.weights is FALSE") } } else { if (!inherits(x = refdata, what = "list")) { refdata <- list(id = refdata) } for (i in 1:length(x = refdata)) { if (inherits(x = refdata[[i]], what = c("character", "factor"))) { # check is it's in the reference object if (length(x = refdata[[i]]) == 1) { if (is.null(x = reference)) { warning("If providing a single string to refdata element number ", i, ", please provide the reference object. Skipping element ", i, ".", call. = FALSE, immediate. = TRUE) refdata[[i]] <- FALSE next } if (refdata[[i]] %in% Assays(object = reference)) { refdata[[i]] <- GetAssayData(object = reference, assay = refdata[[i]]) colnames(x = refdata[[i]]) <- paste0(colnames(x = refdata[[i]]), "_reference") label.transfer[[i]] <- FALSE next } else if (refdata[[i]] %in% colnames(x = reference[[]])) { refdata[[i]] <- reference[[refdata[[i]]]][, 1] } else { warning("Element number ", i, " provided to refdata does not exist in ", "the provided reference object.", call. = FALSE, immediate. = TRUE) refdata[[i]] <- FALSE next } } else if (length(x = refdata[[i]]) != length(x = reference.cells)) { warning("Please provide a vector that is the same length as the number ", "of reference cells used in anchor finding.\n", "Length of vector provided: ", length(x = refdata[[i]]), "\n", "Length of vector required: ", length(x = reference.cells), "\nSkipping element ", i, ".", call. = FALSE, immediate. = TRUE) refdata[[i]] <- FALSE } label.transfer[[i]] <- TRUE } else if (inherits(x = refdata[[i]], what = c("dgCMatrix", "matrix"))) { if (ncol(x = refdata[[i]]) != length(x = reference.cells)) { warning("Please provide a matrix that has the same number of columns as ", "the number of reference cells used in anchor finding.\n", "Number of columns in provided matrix : ", ncol(x = refdata[[i]]), "\n", "Number of columns required : ", length(x = reference.cells), "\nSkipping element ", i, ".", call. = FALSE, immediate. = TRUE) refdata[[i]] <- FALSE } else { colnames(x = refdata[[i]]) <- paste0(colnames(x = refdata[[i]]), "_reference") if (any(!colnames(x = refdata[[i]]) == reference.cells)) { if (any(!colnames(x = refdata[[i]]) %in% reference.cells) || any(!reference.cells %in% colnames(x = refdata[[i]]))) { warning("Some (or all) of the column names of the provided refdata ", "don't match the reference cells used in anchor finding ", "\nSkipping element", i, ".", call. = FALSE, immediate. = TRUE) refdata[[i]] <- FALSE } else { refdata[[i]] <- refdata[[i]][, reference.cells] } } } if (!slot %in% c("counts", "data")) { stop("Please specify slot as either 'counts' or 'data'.") } label.transfer[[i]] <- FALSE } else { warning("Please provide either a vector (character or factor) for label ", "transfer or a matrix for feature transfer. \nType provided: ", class(x = refdata[[i]])) refdata[[i]] <- FALSE } if (names(x = refdata)[i] == "") { possible.names <- make.unique(names = c(names(x = refdata), paste0("e", i))) names(x = refdata)[i] <- possible.names[length(x = possible.names)] if (verbose) { message("refdata element ", i, " is not named. Setting name as ", names(x = refdata)[i]) } } } ModifyParam(param = "label.transfer", value = label.transfer) if (all(unlist(x = lapply(X = refdata, FUN = isFALSE)))) { stop("None of the provided refdata elements are valid.", call. = FALSE) } ModifyParam(param = "refdata", value = refdata) } object.reduction <- Reductions(object = slot(object = anchorset, name = "object.list")[[1]]) valid.weight.reduction <- c("pcaproject", "pca", "cca", "rpca.ref","lsiproject", "lsi", object.reduction) if (!inherits(x = weight.reduction, "DimReduc")) { if (!weight.reduction %in% valid.weight.reduction) { stop("Please provide one of ", paste(valid.weight.reduction, collapse = ", "), " or a custom DimReduc to ", "the weight.reduction parameter.", call. = FALSE) } if (weight.reduction %in% c("pcaproject", "cca", "rpca.ref", "lsiproject") && !weight.reduction %in% Reductions(object = combined.ob)) { stop("Specified weight.reduction (", weight.reduction, ") is not present ", "in the provided anchorset.", call. = FALSE) } if (weight.reduction %in% c("pca", "lsi") && is.null(x = query)) { stop("To use an internal PCA on the query only for weight.reduction, ", "please provide the query object.", call. = FALSE) } } if (inherits(x = weight.reduction, "DimReduc")) { if (is.null(x = dims)) { stop("Please specify dims", call. = FALSE) } if (max(dims) > ncol(x = weight.reduction)) { stop("The max of dims specified (", max(dims), ") is greater than the ", "number of dimensions in the given DimReduc (", ncol(x = weight.reduction), ").", call. = FALSE) } } else { if (is.null(x = dims) && !is.null(x = slot(object = anchorset, name = "command")$dims)) { ModifyParam(param = "dims", value = 1:length(x = slot(object = anchorset, name = "command")$dims)) } } if (!is.null(x = query)) { if (!isTRUE(x = all.equal( target = gsub(pattern = "_query", replacement = "", x = query.cells), current = colnames(x = query[[query.assay]]), check.attributes = FALSE) )) { stop("Query object provided contains a different set of cells from the ", "query used to construct the AnchorSet provided.", call. = FALSE) } } if(k.weight > nrow(x = anchors)) { stop("Please set k.weight to be smaller than the number of anchors (", nrow(x = anchors), ").", call. = FALSE) } } # Internal function to validate the parameters for IntegrateEmbeddings run on # an IntegrationAnchorSet object # ValidateParams_IntegrateEmbeddings_IntegrationAnchors <- function( anchorset, object.list, reductions, dims.to.integrate, k.weight, weight.reduction, sample.tree ) { nobs <- length(x = object.list) if (is.null(x = reductions)) { stop("Must supply reductions to integrate") } if (!inherits(x = reductions, what = "DimReduc")) { stop("Please provide a single pre-computed DimReduc object to the ", "reductions parameter", call. = FALSE) } else { all.cells <- make.unique(names = unname(obj = do.call( what = c, args = lapply(X = object.list, FUN = Cells))) ) if (nrow(x = reductions) != length(x = all.cells)) { stop("The number of cells in the reduction provided (", nrow(x = reductions), ") doesn't match the number of cells in the objects used to build the ", "AnchorSet (", length(x = all.cells), ").", call. = FALSE) } if (!all(Cells(x = reductions) %in% all.cells)) { stop("The cell names in the reduction provided don't match the cell names ", "present in the objects used to build the AnchorSet", call. = FALSE) } dims.to.integrate <- dims.to.integrate %||% 1:ncol(x = reductions) if (max(dims.to.integrate) > ncol(x = reductions)) { warning("Max dims.to.integrate is larger than the number of dimensions in ", "the provided reduction. Setting dims.to.integrate to 1:", ncol(x = reductions), " and continuing.", immediate. = TRUE, call. = FALSE) dims.to.integrate <- 1:ncol(x = reductions) } ModifyParam(param = 'dims.to.integrate', value = dims.to.integrate) } if (!is.null(x = weight.reduction)) { if (inherits(x = weight.reduction, what = "character")) { if (length(x = weight.reduction) == 1) { weight.reduction <- as.list(x = rep(x = weight.reduction, times = nobs)) } ModifyParam(param = 'weight.reduction', value = weight.reduction) for (i in 1:nobs) { if (!weight.reduction[[i]] %in% Reductions(object = object.list[[i]])) { stop("weight.reduction (", weight.reduction[[i]], ") is not present ", "in object number ", i, ".", call. = FALSE) } } } if (inherits(x = weight.reduction[[1]], what = "DimReduc")) { if (length(x = weight.reduction) != nobs) { stop("Please provide one weight.reduction for each object. ", length(x = weight.reduction), " provided, ", nobs, " required.", call. = FALSE) } for (i in 1:nobs) { if (!isTRUE(all.equal( target = Cells(x = weight.reduction[[i]]), current = Cells(x = object.list[[i]]), check.attributes = FALSE )) ) { stop("Cell names in the provided weight.reduction ", i, " don't ", "match with the cell names in object ", i, ".", call. = FALSE) } } } } min.object.size <- min(sapply(X = object.list, FUN = ncol)) if (k.weight > min.object.size) { stop("k.weight (", k.weight, ") is set larger than the number of cells in ", "the smallest object (", min.object.size, "). Please choose a smaller ", "k.weight.", call. = FALSE) } if (!is.null(x = sample.tree)) { if (ncol(x = sample.tree) != 2) { stop("Invalid sample tree. Please provide a two column matrix specifying the order of integration.") } if (min(sample.tree) < (-1 * nobs)) { stop("Invalid sample tree. Dataset index greater than the number of ", "objects was provided.") } } } # Internal function to validate the parameters for IntegrateEmbeddings run on # a TransferAnchorSet object # ValidateParams_IntegrateEmbeddings_TransferAnchors <- function( anchorset, combined.object , reference, query, query.assay, reductions, dims.to.integrate, k.weight, weight.reduction, reuse.weights.matrix ) { if (missing(x = reference)) { stop("Please provide the reference object.", call. = FALSE) } if (missing(x = query)) { stop("Please provide the query object.", call. = FALSE) } reference.cells <- slot(object = anchorset, name = "reference.cells") reference.cells <- gsub(pattern = "_reference", replacement = "", x = reference.cells) if (!isTRUE(x = all.equal(target = reference.cells, current = Cells(x = reference), check.attributes = FALSE))) { stop("The set of cells used as a reference in the AnchorSet does not match ", "the set of cells provided in the reference object.") } query.cells <- slot(object = anchorset, name = "query.cells") query.cells <- gsub(pattern = "_query", replacement = "", x = query.cells) if (!isTRUE(x = all.equal(target = query.cells, current = colnames(x = query[[query.assay]]), check.attributes = FALSE))) { stop("The set of cells used as a query in the AnchorSet does not match ", "the set of cells provided in the query object.") } if (length(x = reductions) != 1) { stop("Please provide a single reduction name to reductions that is present ", "in the anchorset.", call. = FALSE) } if (!reductions %in% Reductions(object = combined.object)) { stop("Please specify a reduction that is present in the anchorset: ", paste(Reductions(object = combined.object), collapse = ", "), call. = FALSE) } reference <- RenameCells(object = reference, new.names = paste0(Cells(x = reference), "_reference")) reference.embeddings <- Embeddings(object = combined.object[[reductions]])[Cells(x = reference), ] reference[[reductions]] <- CreateDimReducObject(embeddings = reference.embeddings, assay = DefaultAssay(object = reference)) ModifyParam(param = "reference", value = reference) query <- RenameCells(object = query, new.names = paste0(Cells(x = query), "_query")) query.embeddings <- Embeddings(object = combined.object[[reductions]])[Cells(x = query[[query.assay]]), ] query[[reductions]] <- CreateDimReducObject(embeddings = query.embeddings, assay = DefaultAssay(object = query)) ModifyParam(param = "query", value = query) ModifyParam(param = "reductions", value = c(reductions, reductions)) min.ndim <- min(ncol(x = query[[reductions[2]]]), ncol(x = reference[[reductions[1]]])) if (is.null(x = dims.to.integrate)) { dims.to.integrate <- 1:min.ndim } else { if (max(dims.to.integrate) > min.ndim) { dims.to.integrate <- dims.to.integrate[dims.to.integrate <= min.ndim] warning("Max dims.to.integrate is larger than the max dims for at least ", "one of the reductions specified. Setting dims.to.integrate to ", paste(dims.to.integrate, collapse = ","), " and continuing.", immediate. = TRUE, call. = FALSE) } } ModifyParam(param = "dims.to.integrate", value = dims.to.integrate) if (isTRUE(x = reuse.weights.matrix)) { weights.matrix <- Tool(object = query, slot = "TransferData")$weights.matrix if (is.null(x = weights.matrix)) { message("Requested to reuse weights matrix, but no weights found. Computing new weights.") reuse.weights.matrix <- FALSE } else if (nrow(x = weights.matrix) != nrow(x = slot(object = anchorset, name = "anchors"))) { stop("The number of anchors in the weights matrix stored in the query (", nrow(x = weights.matrix), ") doesn't match the number of anchors ", "in the anchorset (", nrow(x = slot(object = anchorset, name = "anchors")), ").", call. = FALSE) } else { ModifyParam(param = 'weights.matrix', value = weights.matrix) } } # check T/F again due to possible modification in above if (isFALSE(x = reuse.weights.matrix)) { if (k.weight > ncol(x = query)) { stop("k.weight (", k.weight, ") is set larger than the number of cells in ", "the query object (", ncol(x = query), "). Please choose a smaller ", "k.weight.", call. = FALSE) } if (inherits(x = weight.reduction, what = "list")) { if (length(x = weight.reduction) > 2) { stop("Supplied too many dimension reduction objects for weight.reduction. ", "Should supply a single DimReduc object.") } if (length(x = weight.reduction) == 2) { # take the second element as the dimreduc to use for query weight.reduction <- weight.reduction[[2]] } } if (inherits(x = weight.reduction, what = "character")) { if (length(x = weight.reduction) > 2) { stop("Supplied too many dimension reduction names for weight.reduction. ", "Should supply the name of a single DimReduc present in the query.") } if (length(x = weight.reduction) == 2) { # take the second element as the dimreduc to use for query weight.reduction <- weight.reduction[[2]] } if (!weight.reduction %in% Reductions(object = query)) { stop("The weight.reduction ", weight.reduction, " is not present in the ", "query object.", call. = FALSE) } ModifyParam(param = 'weight.reduction', value = list(NULL, query[[weight.reduction]])) } if (inherits(x = weight.reduction, what = "DimReduc")) { weight.reduction <- RenameCells(object = weight.reduction, new.names = paste0(Cells(x = weight.reduction), "_query")) if (!isTRUE(all.equal( target = Cells(x = weight.reduction), current = Cells(x = query), check.attributes = FALSE ))) { stop("Cell names in the provided weight.reduction don't ", "match with the cell names in the query object.", call. = FALSE) } ModifyParam(param = 'weight.reduction', value = list(NULL, weight.reduction)) } } } #' Convert Neighbor class to an asymmetrical Graph class #' #' #' @param nn.object A neighbor class object #' @param col.cells Cells names of the neighbors, cell names in nn.object is used by default #' @param weighted Determine if use distance in the Graph #' #' @return Returns a Graph object #' #' @importFrom Matrix sparseMatrix #' #' @export #' @concept integration #' NNtoGraph <- function( nn.object, col.cells = NULL, weighted = FALSE ) { select_nn <- Indices(object = nn.object) col.cells <- col.cells %||% Cells(x = nn.object) ncol.nn <- length(x = col.cells) k.nn <- ncol(x = select_nn) j <- as.numeric(x = t(x = select_nn)) i <- ((1:length(x = j)) - 1) %/% k.nn + 1 if (weighted) { select_nn_dist <- Distances(object = nn.object) dist.element <- as.numeric(x = t(x = select_nn_dist)) nn.matrix <- sparseMatrix( i = i, j = j, x = dist.element, dims = c(nrow(x = select_nn), ncol.nn) ) } else { nn.matrix <- sparseMatrix( i = i, j = j, x = 1, dims = c(nrow(x = select_nn), ncol.nn) ) } rownames(x = nn.matrix) <- Cells(x = nn.object) colnames(x = nn.matrix) <- col.cells nn.matrix <- as.Graph(x = nn.matrix) return(nn.matrix) } # Find Anchor directly from assay # # # @return Returns a TranserAnchor or Integration set FindAssayAnchor <- function( object.list, reference = NULL, anchor.type = c("Transfer", "Integration"), assay = "Bridge", slot = "data", reduction = NULL, k.anchor = 20, k.score = 50, verbose = TRUE ) { anchor.type <- match.arg(arg = anchor.type) reduction.name <- reduction %||% paste0(assay, ".reduc") if ( is.null(x = reduction) || !reduction %in% Reductions(object.list[[1]])) { object.list <- lapply(object.list, function(x) { if (is.null(reduction)) { x[[reduction.name]] <- CreateDimReducObject( embeddings = t(GetAssayData( object = x, layer = slot, assay = assay )), key = "L_", assay = assay ) } DefaultAssay(x) <- assay x <- DietSeurat(x, assays = assay, dimreducs = reduction.name) return(x) } ) } object.both <- merge(object.list[[1]], object.list[[2]], merge.dr = reduction.name) objects.ncell <- sapply(X = object.list, FUN = function(x) dim(x = x)[2]) offsets <- as.vector(x = cumsum(x = c(0, objects.ncell)))[1:length(x = object.list)] if (verbose) { message("Finding ", anchor.type," anchors from assay ", assay) } anchors <- FindAnchors(object.pair = object.both, assay = c(DefaultAssay(object.both), DefaultAssay(object.both)), slot = 'data', cells1 = colnames(object.list[[1]]), cells2 = colnames(object.list[[2]]), internal.neighbors = NULL, reduction = reduction.name, k.anchor = k.anchor, k.score = k.score, dims = 1:ncol(object.both[[reduction.name]]), k.filter = NA, verbose = verbose ) inte.anchors <- anchors inte.anchors[, 1] <- inte.anchors[, 1] + offsets[1] inte.anchors[, 2] <- inte.anchors[, 2] + offsets[2] # determine all anchors inte.anchors <- rbind(inte.anchors, inte.anchors[, c(2, 1, 3)]) inte.anchors <- AddDatasetID( anchor.df = inte.anchors, offsets = offsets, obj.lengths = objects.ncell ) command <- LogSeuratCommand(object = object.list[[1]], return.command = TRUE) anchor.features <- rownames(object.both) if (anchor.type == "Integration") { anchor.set <- new(Class = "IntegrationAnchorSet", object.list = object.list, reference.objects = reference %||% seq_along(object.list), anchors = inte.anchors, weight.reduction = object.both[[reduction.name]], offsets = offsets, anchor.features = anchor.features, command = command ) } else if (anchor.type == "Transfer") { reference.index <- reference reference <- object.list[[reference.index]] query <- object.list[[setdiff(c(1,2), reference.index)]] query <- RenameCells( object = query, new.names = paste0(Cells(x = query), "_", "query") ) reference <- RenameCells( object = reference, new.names = paste0(Cells(x = reference), "_", "reference") ) combined.ob <- suppressWarnings(expr = merge( x = reference, y = query, merge.dr = reduction.name )) anchor.set <- new( Class = "TransferAnchorSet", object.list = list(combined.ob), reference.cells = colnames(x = reference), query.cells = colnames(x = query), anchors = anchors, anchor.features = anchor.features, command = command ) } return(anchor.set) } #' Construct a dictionary representation for each unimodal dataset #' #' #' @param object.list A list of Seurat objects #' @param bridge.object A multi-omic bridge Seurat which is used as the basis to #' represent unimodal datasets #' @param object.reduction A list of dimensional reductions from object.list used #' to be reconstructed by bridge.object #' @param bridge.reduction A list of dimensional reductions from bridge.object used #' to reconstruct object.reduction #' @param laplacian.reduction Name of bridge graph laplacian dimensional reduction #' @param laplacian.dims Dimensions used for bridge graph laplacian dimensional reduction #' @param bridge.assay.name Assay name used for bridge object reconstruction value (default is 'Bridge') #' @param return.all.assays Whether to return all assays in the object.list. #' Only bridge assay is returned by default. #' @param l2.norm Whether to l2 normalize the dictionary representation #' @param verbose Print messages and progress #' #' @importFrom MASS ginv #' @return Returns a object list in which each object has a bridge cell derived assay #' #' @export #' @concept integration #' BridgeCellsRepresentation <- function(object.list, bridge.object, object.reduction, bridge.reduction, laplacian.reduction = 'lap', laplacian.dims = 1:50, bridge.assay.name = "Bridge", return.all.assays = FALSE, l2.norm = TRUE, verbose = TRUE ) { my.lapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pblapply, no = future_lapply ) if (verbose) { message("Constructing Bridge-cells representation") } single.object = FALSE if (length(x = object.list) == 1 & inherits(x = object.list, what = 'Seurat') ) { object.list <- list(object.list) single.object = TRUE } dims.list <- list() for (i in 1:length(object.reduction)) { ref.dims <- list( object= Misc(object.list[[i]][[object.reduction[[i]]]], slot = 'ref.dims'), bridge = Misc( bridge.object[[bridge.reduction[[i]]]], slot = 'ref.dims') ) all.dims <- list( object = 1:ncol(object.list[[i]][[object.reduction[[i]]]]), bridge = 1:ncol( bridge.object[[bridge.reduction[[i]] ]]) ) projected.dims.index <- which(sapply(ref.dims, function(x) !is.null(x))) if (length(projected.dims.index) == 0) { warning('No reference dims found in the dimensional reduction,', ' all dims in the dimensional reduction will be used.') if (all.dims[[1]] == all.dims[[2]]) { dims.list[[i]] <- all.dims } else { stop( 'The number of dimensions in the object.list ', object.reduction[[i]], ' (', length(all.dims[[1]]), ') ', ' and the number of dimensions in the bridge object ', bridge.reduction[[i]], ' (', length(all.dims[[2]]), ') ', ' is different.') } } else { reference.dims.index <- setdiff(c(1:2), projected.dims.index) dims.list[[i]] <- list() dims.list[[i]][[reference.dims.index]] <- ref.dims[[projected.dims.index ]] dims.list[[i]][[projected.dims.index]] <- all.dims[[projected.dims.index]] names(dims.list[[i]]) <- c('object', 'bridge') } } object.list <- my.lapply( X = 1:length(x = object.list), FUN = function(x) { SA.inv <- ginv( X = Embeddings( object = bridge.object, reduction = bridge.reduction[[x]] )[ ,dims.list[[x]]$bridge] ) if (!is.null(laplacian.reduction)) { lap.vector <- Embeddings(bridge.object[[laplacian.reduction]])[,laplacian.dims] X <- Embeddings( object = object.list[[x]], reduction = object.reduction[[x]] )[, dims.list[[x]]$object] %*% (SA.inv %*% lap.vector) } else { X <- Embeddings( object = object.list[[x]], reduction = object.reduction[[x]] )[, dims.list[[x]]$object] %*% SA.inv colnames(X) <- Cells(bridge.object) } if (l2.norm) { X <- L2Norm(mat = X, MARGIN = 1) } colnames(x = X) <- paste0('bridge_', colnames(x = X)) suppressWarnings( object.list[[x]][[bridge.assay.name]] <- CreateAssayObject(data = t(X)) ) object.list[[x]][[bridge.assay.name]]@misc$SA.inv <- SA.inv DefaultAssay(object.list[[x]]) <- bridge.assay.name VariableFeatures(object = object.list[[x]]) <- rownames(object.list[[x]]) return (object.list[[x]]) } ) if (!return.all.assays) { object.list <- my.lapply( X = object.list, FUN = function(x) { x <- DietSeurat(object = x, assays = bridge.assay.name, scale.data = TRUE) return(x) } ) } if (single.object) { object.list <- object.list[[1]] } return(object.list) } #' Find bridge anchors between two unimodal datasets #' #' First, bridge object is used to reconstruct two single-modality profiles and #' then project those cells into bridage graph laplacian space. #' Next, find a set of anchors between two single-modality objects. These #' anchors can later be used to integrate embeddings or transfer data from the reference to #' query object using the \code{\link{MapQuery}} object. #' #' \itemize{ #' \item{ Bridge cells reconstruction #' } #' \item{ Find anchors between objects. It can be either IntegrationAnchors or TransferAnchor. #' } #' } #' #' @inheritParams BridgeCellsRepresentation #' @param anchor.type The type of anchors. Can #' be one of: #' \itemize{ #' \item{Integration: Generate IntegrationAnchors for integration} #' \item{Transfer: Generate TransferAnchors for transfering data} #' } #' @param reference A vector specifying the object/s to be used as a reference #' during integration or transfer data. #' @param reduction Dimensional reduction to perform when finding anchors. Can #' be one of: #' \itemize{ #' \item{cca: Canonical correlation analysis} #' \item{direct: Use assay data as a dimensional reduction} #' } #' @param reference.bridge.stored If refernece has stored the bridge dictionary representation #' @param k.anchor How many neighbors (k) to use when picking anchors #' @param k.score How many neighbors (k) to use when scoring anchors #' @param verbose Print messages and progress #' @param ... Additional parameters passed to \code{FindIntegrationAnchors} or #' \code{FindTransferAnchors} #' #' #' @return Returns an \code{\link{AnchorSet}} object that can be used as input to #' \code{\link{IntegrateEmbeddings}}.or \code{\link{MapQuery}} #' #' @keywords internal #' FindBridgeAnchor <- function(object.list, bridge.object, object.reduction, bridge.reduction, anchor.type = c("Transfer", "Integration"), reference = NULL, laplacian.reduction = "lap", laplacian.dims = 1:50, reduction = c("direct", "cca"), bridge.assay.name = "Bridge", reference.bridge.stored = FALSE, k.anchor = 20, k.score = 50, verbose = TRUE, ... ) { anchor.type <- match.arg(arg = anchor.type) reduction <- match.arg(arg = reduction) if (!is.null(laplacian.reduction)) { bridge.method <- "bridge graph" } else { bridge.method <- "bridge cells" } if (verbose) { message("Finding ", anchor.type," anchors") switch( EXPR = bridge.method, "bridge graph" = { message('Transform cells to bridge graph laplacian space') }, "bridge cells" = { message('Transform cells to bridge cells space') } ) } reference <- reference %||% c(1) query <- setdiff(c(1,2), reference) if (anchor.type == "Transfer") { stored.bridge.weights <- FALSE # check weight matrix if (is.null(bridge.object@tools$MapQuery)) { warning("No weights stored between reference and bridge obejcts.", "Please set store.weights to TRUE in MapQuery") } else if (is.null(object.list[[query]]@tools$MapQuery)) { warning("No weights stored between query and bridge obejcts.", "Please set store.weights to TRUE in MapQuery") } else { stored.bridge.weights <- TRUE } } if (reference.bridge.stored) { object.list[[query]] <- BridgeCellsRepresentation( object.list = object.list[[query]] , bridge.object = bridge.object, object.reduction = object.reduction[[query]] , bridge.reduction = bridge.reduction[[query]] , bridge.assay.name = bridge.assay.name, laplacian.reduction = laplacian.reduction, laplacian.dims = laplacian.dims, verbose = verbose ) } else { object.list <- BridgeCellsRepresentation( object.list = object.list , bridge.object = bridge.object, object.reduction = object.reduction, bridge.reduction = bridge.reduction, bridge.assay.name = bridge.assay.name, laplacian.reduction = laplacian.reduction, laplacian.dims = laplacian.dims, verbose = verbose ) } if (reduction == "direct") { anchor <- FindAssayAnchor( object.list = object.list , reference = reference, slot = "data", anchor.type = anchor.type, assay = bridge.assay.name, k.anchor = k.anchor, k.score = k.score, verbose = verbose ) } else if (reduction == "cca") { # set data slot to scale.data slot object.list <- lapply( X = object.list, FUN = function(x) { x <- SetAssayData( object = x, layer = "scale.data", new.data = as.matrix( x = GetAssayData(object = x, layer = "data") )) return(x) } ) anchor <- switch(EXPR = anchor.type, "Integration" = { anchor <- FindIntegrationAnchors( object.list = object.list, k.filter = NA, reference = reference, reduction = "cca", scale = FALSE, k.anchor = k.anchor, k.score = k.score, verbose = verbose, ...) object.merge <- merge(x = object.list[[1]], y = object.list[2:length(object.list)] ) slot( object = anchor, name = "weight.reduction" ) <- CreateDimReducObject( embeddings = t(GetAssayData( object = object.merge, layer = 'data' )), key = "L_", assay = bridge.assay.name ) anchor }, "Transfer" = { anchor <- FindTransferAnchors( reference = object.list[[reference]], query = object.list[[query]], reduction = "cca", scale = FALSE, k.filter = NA, k.anchor = k.anchor, k.score = k.score, verbose = verbose, ... ) } ) } if (anchor.type == "Transfer") { if (stored.bridge.weights) { slot( object = anchor,name = "weight.reduction" )@misc$bridge.sets <- list( bridge.weights = slot(object = bridge.object, name = "tools" )$MapQuery_PrepareBridgeReference$weights.matrix, bridge.ref_anchor = slot(object = bridge.object, name = "tools" )$MapQuery_PrepareBridgeReference$anchor[,1], query.weights = slot(object = object.list[[query]], name = "tools" )$MapQuery$weights.matrix, query.ref_anchor = slot(object = object.list[[query]], name = "tools" )$MapQuery$anchor[,1] ) } } slot(object = anchor, name = "command") <- LogSeuratCommand( object = object.list[[1]], return.command = TRUE ) return(anchor) } # Helper function to transfer labels based on neighbors object # @param nn.object the query neighbors object # @param reference.object the reference seurat object # @param group.by A vector of variables to group cells by # @param weight.matrix A reference x query cell weight matrix # @return Returns a list for predicted labels, prediction score and matrix #' @importFrom Matrix sparseMatrix #' @importFrom fastDummies dummy_cols #' @importFrom Matrix rowMeans t #' TransferLablesNN <- function( nn.object = NULL, weight.matrix = NULL, reference.labels ){ reference.labels.matrix <- CreateCategoryMatrix(labels = as.character(reference.labels)) if (!is.null(x = weight.matrix) & !is.null(x = nn.object)) { warning('both nn.object and weight matrix are set. Only weight matrix is used for label transfer') } if (is.null(x = weight.matrix)) { select_nn <- Indices(nn.object) k.nn <- ncol(select_nn) j <- as.numeric(x = t(x = select_nn )) i <- ((1:length(x = j)) - 1) %/% k.nn + 1 nn.matrix <- sparseMatrix( i = i, j = j, x = 1, dims = c(nrow(select_nn), nrow(reference.labels.matrix)) ) rownames(nn.matrix) <- Cells(nn.object) } else if (nrow(weight.matrix) == nrow(reference.labels.matrix)) { nn.matrix <- t(weight.matrix) k.nn <- 1 } else if (ncol(weight.matrix) == nrow(reference.labels.matrix)) { nn.matrix <- weight.matrix k.nn <- 1 } else { stop('wrong weights matrix input') } query.label.mat <- nn.matrix %*% reference.labels.matrix query.label.mat <- query.label.mat/k.nn prediction.max <- apply(X = query.label.mat, MARGIN = 1, FUN = which.max) query.label <- colnames(x = query.label.mat)[prediction.max] query.label.score <- apply(X = query.label.mat, MARGIN = 1, FUN = max) names(query.label) <- names(query.label.score) <- rownames(query.label.mat) if (is.factor(reference.labels)) { levels(query.label) <- levels(reference.labels) } output.list <- list(labels = query.label, scores = query.label.score, prediction.mat = query.label.mat ) return(output.list) } # transfer continuous value based on neighbors # TransferExpressionNN<- function( nn.object, reference.object, var.name = NULL ) { nn.matrix <- NNtoGraph(nn.object = nn.object, col.cells = Cells(reference.object) ) reference.exp.matrix <- FetchData(object = reference.object, vars = var.name) # remove NA reference.exp.matrix <- reference.exp.matrix[complete.cases(reference.exp.matrix), ,drop= F] nn.matrix <- nn.matrix[, rownames(reference.exp.matrix)] # remove NO neighbor query nn.sum <- RowSumSparse(mat = nn.matrix) nn.matrix <- nn.matrix[nn.sum > 2, ] nn.sum <- nn.sum[nn.sum>2] # transfer data reference.exp.matrix <- as.matrix(reference.exp.matrix) query.exp.mat <- nn.matrix %*% reference.exp.matrix query.exp.mat <- sweep(x = query.exp.mat, MARGIN = 1, STATS = nn.sum, FUN = "/") # set output for all query cells query.exp.all <- data.frame(row.names = Cells(nn.object)) query.exp.all[rownames(query.exp.mat),1] <- query.exp.mat[,1] colnames(query.exp.all) <- var.name return(query.exp.all) } #' @param reduction.name dimensional reduction name, lap by default #' @param graph The name of graph #' @rdname RunGraphLaplacian #' @concept dimensional_reduction #' @export #' @method RunGraphLaplacian Seurat #' RunGraphLaplacian.Seurat <- function( object, graph, reduction.name = "lap", reduction.key ="LAP_", n = 50, verbose = TRUE, ... ) { lap_dir <- RunGraphLaplacian(object = object[[graph]], n = n, reduction.key = reduction.key , verbose = verbose, ... ) object[[reduction.name]] <- lap_dir return(object) } #' @param n Total Number of Eigenvectors to compute and store (50 by default) #' @param reduction.key dimensional reduction key, specifies the string before #' the number for the dimension names. LAP by default #' @param verbose Print message and process #' @param ... Arguments passed to eigs_sym #' #' #' @concept dimensional_reduction #' @rdname RunGraphLaplacian #' @export #' #' @importFrom Matrix diag t rowSums #' @importFrom RSpectra eigs_sym RunGraphLaplacian.default <- function(object, n = 50, reduction.key ="LAP_", verbose = TRUE, ... ) { if (!all( slot(object = t(x = object), name = "x") == slot(object = object, name = "x") )) { stop("Input graph is not symmetric") } if (verbose) { message("Generating normalized laplacian graph") } D_half <- sqrt(x = rowSums(x = object)) L <- -1 * (t(object / D_half) / D_half) diag(L) <- 1 + diag(L) if (verbose) { message("Performing eigendecomposition of the normalized laplacian graph") } L_eigen <- eigs_sym(L, k = n + 1, which = "SM", ...) #delete the first eigen vector new_order <- n:1 lap_output <- list(eigen_vector = Re(L_eigen$vectors[, new_order]), eigen_value = L_eigen$values[new_order] ) rownames(lap_output$eigen_vector) <- colnames(object) colnames(lap_output$eigen_vector) <- paste0(reduction.key, 1:n ) lap_dir <- CreateDimReducObject(embeddings = lap_output$eigen_vector, key = reduction.key, assay = DefaultAssay(object), stdev = lap_output$eigen_value ) return(lap_dir) } # Check if the var.name already existed in the meta.data # CheckMetaVarName <- function(object, var.name) { if (var.name %in% colnames(x = object[[]])) { var.name.exist <- var.name var.name <- rev( x = make.unique( names = c(colnames(object[[]]), var.name.exist) ) )[1] warning(var.name.exist, " is already existed in the meta.data. ", var.name, " will store leverage score value") } return(var.name) } # Run hnsw to find neighbors # # @param data Data to build the index with # @param query A set of data to be queried against data # @param metric Distance metric; can be one of "euclidean", "cosine", "manhattan", # "hamming" # @param k Number of neighbors # @param ef_construction A larger value means a better quality index, but increases build time. # @param ef Higher values lead to improved recall at the expense of longer search time. # @param n_threads Maximum number of threads to use. # @param index optional index object, will be recomputed if not provided #' @importFrom RcppHNSW hnsw_build hnsw_search # HnswNN <- function(data, query = data, metric = "euclidean", k, ef_construction = 200, ef = 10, index = NULL, n_threads = 0 ) { idx <- index %||% hnsw_build( X = data, distance = metric, ef = ef_construction, n_threads = n_threads ) nn <- hnsw_search( X = query, ann = idx, k = k, ef = ef, n_threads = n_threads ) names(nn) <- c("nn.idx", "nn.dists") nn$idx <- idx nn$alg.info <- list(metric = metric, ndim = ncol(x = data)) return(nn) } # Calculate reference index from the integrated object # IntegrationReferenceIndex <- function(object) { if (is.null(object@tools$Integration@sample.tree)) { reference.index <- object@commands$FindIntegrationAnchors$reference if (length(x = reference.index) > 1) { stop('the number of the reference is bigger than 1') } } else { reference.index <- SampleIntegrationOrder(tree = object@tools$Integration@sample.tree)[1] } return(reference.index) } # Calculate mean and sd # SparseMeanSd <- function(object, assay = NULL, slot = 'data', features = NULL, eps = 1e-8 ){ assay <- assay%||% DefaultAssay(object) features <- features %||% rownames(object[[assay]]) assay <- assay %||% DefaultAssay(object = object) mat <- GetAssayData(object = object[[assay]], layer = slot)[features,] if (class(mat)[1] !='dgCMatrix'){ stop('Matrix is not sparse') } mat.mean <- RowMeanSparse(mat) mat.sd <- sqrt(RowVarSparse(mat)) names(mat.mean) <- names(mat.sd) <- rownames(mat) mat.sd <- MinMax(data = mat.sd, min = eps, max = max(mat.sd)) output <- list(mean = mat.mean, sd = mat.sd) return(output) } # Run PCA on sparse matrix # #' @importFrom Matrix t #' @importFrom rlang exec #' @importFrom irlba irlba # # RunPCA_Sparse <- function( object, features = NULL, reduction.key = "PCsp_", reduction.name = "pca.sparse", npcs = 50, do.scale = TRUE, verbose = TRUE ) { features <- features %||% VariableFeatures(object) data <- GetAssayData(object = object, layer = "data")[features,] n <- npcs args <- list(A = t(data), nv = n) args$center <- RowMeanSparse(data) feature.var <- RowVarSparse(data) args$totalvar <- sum(feature.var) if (do.scale) { args$scale <- sqrt(feature.var) args$scale <- MinMax(args$scale, min = 1e-8, max = max(args$scale)) } else { args$scale <- FALSE } if (verbose) { message("Running PCA") } pca.irlba <- exec(.fn = irlba, !!!args) sdev <- pca.irlba$d/sqrt(max(1, ncol(data) - 1)) feture.loadings <- pca.irlba$v rownames(feture.loadings) <- rownames(data) embeddings <- sweep(x = pca.irlba$u, MARGIN = 2, STATS = pca.irlba$d, FUN = "*") rownames(embeddings) <- colnames(data) colnames(feture.loadings) <- colnames(embeddings) <- paste0(reduction.key, 1:npcs) object[[reduction.name]] <- CreateDimReducObject( embeddings = embeddings, loadings = feture.loadings, stdev = sdev, key = reduction.key, assay = DefaultAssay(object), misc = list(d = pca.irlba$d) ) return(object) } # Smoothing labels based on the clusters # @param labels the original labels # @param clusters the clusters that are used to smooth labels # SmoothLabels <- function(labels, clusters) { cluster.set <- unique(clusters) smooth.labels <- labels for (c in cluster.set) { cell.c <- which(clusters == c) smooth.labels[cell.c] <- names(sort(table(labels[cell.c]), decreasing = T)[1]) } return(smooth.labels) } #' Project query data to reference dimensional reduction #' #' @param query Query object #' @param reference Reference object #' @param mode Projection mode name for projection #' \itemize{ #' \item{pcaproject: PCA projection} #' \item{lsiproject: LSI projection} #' } #' @param reference.reduction Name of dimensional reduction in the reference object #' @param combine Determine if query and reference objects are combined #' @param query.assay Assay used for query object #' @param reference.assay Assay used for reference object #' @param features Features used for projection #' @param do.scale Determine if scale expression matrix in the pcaproject mode #' @param reduction.name dimensional reduction name, reference.reduction is used by default #' @param reduction.key dimensional reduction key, the key in reference.reduction #' is used by default #' @param verbose Print progress and message #' #' @return Returns a query-only or query-reference combined seurat object #' #' @export #' @concept integration #' ProjectDimReduc <- function(query, reference, mode = c('pcaproject', 'lsiproject'), reference.reduction, combine = FALSE, query.assay = NULL, reference.assay = NULL, features = NULL, do.scale = TRUE, reduction.name = NULL, reduction.key= NULL, verbose = TRUE ) { query.assay <- query.assay %||% DefaultAssay(object = query) reference.assay <- reference.assay %||% DefaultAssay(object = reference) DefaultAssay(object = query) <- query.assay DefaultAssay(object = reference) <- reference.assay reduction.name <- reduction.name %||% reference.reduction reduction.key <- reduction.key %||% Key(object = reference[[reference.reduction]]) if (reduction.name %in% Reductions(object = query)) { warning(reduction.name, ' already exists in the query object. It will be overwritten.' ) } features <- features %||% rownames(x = Loadings(object = reference[[reference.reduction]])) features <- intersect(x = features, y = rownames(x = query)) if (mode == 'lsiproject') { if (verbose) { message('LSI projection to ', reference.reduction) } projected.embeddings <- ProjectSVD( reduction = reference[[reference.reduction]], data = GetAssayData(object = query, assay = query.assay, layer = "data"), mode = "lsi", do.center = FALSE, do.scale = FALSE, features = features, use.original.stats = FALSE, verbose = verbose ) } else if (mode == 'pcaproject') { if (inherits(query[[query.assay]], what = 'SCTAssay')) { if (verbose) { message('PCA projection to ', reference.reduction, ' in SCT assay') } query <- suppressWarnings( expr = GetResidual(object = query, assay = query.assay, features = features, verbose = FALSE) ) query.mat <- GetAssayData(object = query, layer = 'scale.data')[features,] projected.embeddings <- t( crossprod(x = Loadings( object = reference[[reference.reduction]])[features, ], y = query.mat ) ) } else { if (verbose) { message('PCA projection to ', reference.reduction) } projected.embeddings <- ProjectCellEmbeddings( reference = reference, reduction = reference.reduction, query = query, scale = do.scale, dims = 1:ncol(reference[[reference.reduction]]), feature.mean = NULL, verbose = verbose ) } } query[[reduction.name]] <- CreateDimReducObject( embeddings = projected.embeddings, loadings = Loadings(reference[[reference.reduction]])[features,], assay = query.assay, key = reduction.key, misc = Misc(reference[[reference.reduction]]) ) if (combine) { query <- DietSeurat(object = query, dimreducs = reduction.name, features = features, assays = query.assay ) reference <- DietSeurat(object = reference, dimreducs = reference.reduction, features = features, assays = reference.assay) suppressWarnings( combine.obj <- merge(query, reference, merge.dr = c(reduction.name, reference.reduction) ) ) Idents(combine.obj) <- c(rep(x = 'query', times = ncol(query)), rep(x = 'reference', times = ncol(reference)) ) return(combine.obj) } else { return(query) } } #' Prepare the bridge and reference datasets #' #' Preprocess the multi-omic bridge and unimodal reference datasets into #' an extended reference. #' This function performs the following three steps: #' 1. Performs within-modality harmonization between bridge and reference #' 2. Performs dimensional reduction on the SNN graph of bridge datasets via #' Laplacian Eigendecomposition #' 3. Constructs a bridge dictionary representation for unimodal reference cells #' #' @param reference A reference Seurat object #' @param bridge A multi-omic bridge Seurat object #' @param reference.reduction Name of dimensional reduction of the reference object (default is 'pca') #' @param reference.dims Number of dimensions used for the reference.reduction (default is 50) #' @param normalization.method Name of normalization method used: LogNormalize #' or SCT #' @param reference.assay Assay name for reference (default is \code{\link{DefaultAssay}}) #' @param bridge.ref.assay Assay name for bridge used for reference mapping. RNA by default #' @param bridge.query.assay Assay name for bridge used for query mapping. ATAC by default #' @param supervised.reduction Type of supervised dimensional reduction to be performed #' for integrating the bridge and query. #' Options are: #' \itemize{ #' \item{slsi: Perform supervised LSI as the dimensional reduction for #' the bridge-query integration} #' \item{spca: Perform supervised PCA as the dimensional reduction for #' the bridge-query integration} #' \item{NULL: no supervised dimensional reduction will be calculated. #' bridge.query.reduction is used for the bridge-query integration} #' } #' @param bridge.query.reduction Name of dimensions used for the bridge-query harmonization. #' 'bridge.query.reduction' and 'supervised.reduction' cannot be NULL together. #' @param bridge.query.features Features used for bridge query dimensional reduction #' (default is NULL which uses VariableFeatures from the bridge object) #' @param laplacian.reduction.name Name of dimensional reduction name of graph laplacian eigenspace (default is 'lap') #' @param laplacian.reduction.key Dimensional reduction key (default is 'lap_') #' @param laplacian.reduction.dims Number of dimensions used for graph laplacian eigenspace (default is 50) #' @param verbose Print progress and message (default is TRUE) #' #' @return Returns a \code{BridgeReferenceSet} that can be used as input to #' \code{\link{FindBridgeTransferAnchors}}. #' The parameters used are stored in the \code{BridgeReferenceSet} as well #' #' @export #' @concept integration #' PrepareBridgeReference <- function ( reference, bridge, reference.reduction = 'pca', reference.dims = 1:50, normalization.method = c('SCT', 'LogNormalize'), reference.assay = NULL, bridge.ref.assay = 'RNA', bridge.query.assay = 'ATAC', supervised.reduction = c('slsi', 'spca', NULL), bridge.query.reduction = NULL, bridge.query.features = NULL, laplacian.reduction.name = 'lap', laplacian.reduction.key = 'lap_', laplacian.reduction.dims = 1:50, verbose = TRUE ) { ## checking if (!is.null(supervised.reduction)) { supervised.reduction <- match.arg(arg = supervised.reduction) } if (!is.null(x = bridge.query.reduction) & !is.null(x = supervised.reduction)) { stop('bridge.query.reduction and supervised.reduction can only set one.', 'If you want to set bridge.query.reduction, supervised.reduction should set to NULL') } if (is.null(x = bridge.query.reduction) & is.null(x = supervised.reduction)) { stop('Both bridge.query.reduction and supervised.reduction are NULL. One of them needs to be set') } bridge.query.features <- bridge.query.features %||% VariableFeatures(object = bridge[[bridge.query.assay]]) if (length(x = bridge.query.features) == 0) { stop('bridge object ', bridge.query.assay, ' assay has no variable genes and bridge.query.features has no input') } # modality harmonization reference.assay <- reference.assay %||% DefaultAssay(reference) DefaultAssay(reference) <- reference.assay DefaultAssay(bridge) <- bridge.ref.assay ref.anchor <- FindTransferAnchors( reference = reference, reference.reduction = reference.reduction, normalization.method = normalization.method, dims = reference.dims, query = bridge, recompute.residuals = TRUE, features = rownames(reference[[reference.reduction]]@feature.loadings), k.filter = NA, verbose = verbose ) bridge <- MapQuery(anchorset = ref.anchor, reference = reference, query = bridge, store.weights = TRUE, verbose = verbose ) bridge.ref.reduction <- paste0('ref.', reference.reduction) bridge <- FindNeighbors(object = bridge, reduction = bridge.ref.reduction, dims = 1:ncol(x = bridge[[bridge.ref.reduction]]), return.neighbor = FALSE, graph.name = c('bridge.ref.nn', 'bridge.ref.snn'), prune.SNN = 0) bridge <- RunGraphLaplacian(object = bridge, graph = "bridge.ref.snn", reduction.name = laplacian.reduction.name, reduction.key = laplacian.reduction.key, verbose = verbose) DefaultAssay(object = bridge) <- bridge.query.assay if (!is.null(supervised.reduction)) { bridge <- switch(EXPR = supervised.reduction, 'slsi' = { bridge.reduc <- RunSLSI(object = bridge, features = VariableFeatures(bridge), graph = 'bridge.ref.nn', assay = bridge.query.assay ) bridge.reduc }, 'spca' = { bridge.reduc <- RunSPCA(object = bridge, features = VariableFeatures(bridge), graph = 'bridge.ref.snn', assay = bridge.query.assay ) bridge.reduc } ) } # bridge representation reference.bridge <- BridgeCellsRepresentation( object.list = reference, bridge.object = bridge, object.reduction = c(reference.reduction), bridge.reduction = c(bridge.ref.reduction), laplacian.reduction = laplacian.reduction.name, laplacian.dims = laplacian.reduction.dims ) reference[['Bridge']] <- reference.bridge[['Bridge']] reference <- merge(x = reference, y = bridge, merge.dr = NA) reference@tools$MapQuery_PrepareBridgeReference <- bridge@tools$MapQuery command <- LogSeuratCommand(object = reference, return.command = TRUE) slot(object = command, name = "params")$bridge.query.features <- NULL command.name <- slot(object = command, name = "name") reference[[command.name]] <- command return(reference) } #' Find bridge anchors between query and extended bridge-reference #' #' Find a set of anchors between unimodal query and the other unimodal reference #' using a pre-computed \code{\link{BridgeReferenceSet}}. #' This function performs three steps: #' 1. Harmonize the bridge and query cells in the bridge query reduction space #' 2. Construct the bridge dictionary representations for query cells #' 3. Find a set of anchors between query and reference in the bridge graph laplacian eigenspace #' These anchors can later be used to integrate embeddings or transfer data from the reference to #' query object using the \code{\link{MapQuery}} object. #' @param extended.reference BridgeReferenceSet object generated from #' \code{\link{PrepareBridgeReference}} #' @param query A query Seurat object #' @param query.assay Assay name for query-bridge integration #' @param scale Determine if scale the query data for projection #' @param dims Number of dimensions for query-bridge integration #' @param reduction Dimensional reduction to perform when finding anchors. #' Options are: #' \itemize{ #' \item{pcaproject: Project the PCA from the bridge onto the query. We #' recommend using PCA when bridge and query datasets are from scRNA-seq} #' \item{lsiproject: Project the LSI from the bridge onto the query. We #' recommend using LSI when bridge and query datasets are from scATAC-seq or scCUT&TAG data. #' This requires that LSI or supervised LSI has been computed for the bridge dataset, and the #' same features (eg, peaks or genome bins) are present in both the bridge #' and query. #' } #' } #' @param bridge.reduction Dimensional reduction to perform when finding anchors. Can #' be one of: #' \itemize{ #' \item{cca: Canonical correlation analysis} #' \item{direct: Use assay data as a dimensional reduction} #' } #' @param verbose Print messages and progress #' #' @return Returns an \code{AnchorSet} object that can be used as input to #' \code{\link{TransferData}}, \code{\link{IntegrateEmbeddings}} and #' \code{\link{MapQuery}}. #' #' @export #' @concept integration #' FindBridgeTransferAnchors <- function( extended.reference, query, query.assay = NULL, dims = 1:30, scale = FALSE, reduction = c('lsiproject', 'pcaproject'), bridge.reduction = c('direct', 'cca'), verbose = TRUE ) { bridge.reduction <- match.arg(arg = bridge.reduction) reduction <- match.arg(arg = reduction) query.assay <- query.assay %||% DefaultAssay(query) DefaultAssay(query) <- query.assay command.name <- grep(pattern = 'PrepareBridgeReference', x = names(slot(object = extended.reference, name = 'commands')), value = TRUE) params <- Command(object = extended.reference, command = command.name) bridge.query.assay <- params$bridge.query.assay bridge.query.reduction <- params$bridge.query.reduction %||% params$supervised.reduction reference.reduction <- params$reference.reduction bridge.ref.reduction <- paste0('ref.', reference.reduction) DefaultAssay(extended.reference) <- bridge.query.assay extended.reference.bridge <- DietSeurat( object = extended.reference, assays = bridge.query.assay, dimreducs = c(bridge.ref.reduction, bridge.query.reduction, params$laplacian.reduction.name) ) query.anchor <- FindTransferAnchors( reference = extended.reference.bridge, reference.reduction = bridge.query.reduction, dims = dims, query = query, reduction = reduction, scale = scale, features = rownames(Loadings(extended.reference[[bridge.query.reduction]])), k.filter = NA, verbose = verbose ) query <- MapQuery(anchorset = query.anchor, reference = extended.reference.bridge, query = query, store.weights = TRUE ) DefaultAssay(extended.reference) <- 'Bridge' bridge_anchor <- FindBridgeAnchor( object.list = list(DietSeurat(object = extended.reference, assays = 'Bridge'), query), bridge.object = extended.reference.bridge, object.reduction = c(reference.reduction, paste0('ref.', bridge.query.reduction)), bridge.reduction = c(bridge.ref.reduction, bridge.query.reduction), anchor.type = "Transfer", reduction = bridge.reduction, reference.bridge.stored = TRUE, verbose = verbose ) return(bridge_anchor) } #' Find integration bridge anchors between query and extended bridge-reference #' #' Find a set of anchors between unimodal query and the other unimodal reference #' using a pre-computed \code{\link{BridgeReferenceSet}}. #' These integration anchors can later be used to integrate query and reference #' using the \code{\link{IntegrateEmbeddings}} object. #' #' @inheritParams FindBridgeTransferAnchors #' @param integration.reduction Dimensional reduction to perform when finding anchors #' between query and reference. #' Options are: #' \itemize{ #' \item{direct: find anchors directly on the bridge representation space} #' \item{cca: perform cca on the on the bridge representation space and then find anchors #' } #' } #' #' @return Returns an \code{AnchorSet} object that can be used as input to #' \code{\link{IntegrateEmbeddings}}. #' #' @export #' @concept integration #' FindBridgeIntegrationAnchors <- function( extended.reference, query, query.assay = NULL, dims = 1:30, scale = FALSE, reduction = c('lsiproject', 'pcaproject'), integration.reduction = c('direct', 'cca'), verbose = TRUE ) { reduction <- match.arg(arg = reduction) integration.reduction <- match.arg(arg = integration.reduction) query.assay <- query.assay %||% DefaultAssay(query) DefaultAssay(query) <- query.assay command.name <- grep(pattern = 'PrepareBridgeReference', x = names(slot(object = extended.reference, name = 'commands')), value = TRUE) params <- Command(object = extended.reference, command = command.name) bridge.query.assay <- params$bridge.query.assay bridge.query.reduction <- params$bridge.query.reduction %||% params$supervised.reduction reference.reduction <- params$reference.reduction bridge.ref.reduction <- paste0( 'ref.', params$bridge.ref.reduction) DefaultAssay(extended.reference) <- bridge.query.assay extended.reference.bridge <- DietSeurat( object = extended.reference, assays = bridge.query.assay, dimreducs = c(bridge.query.reduction, bridge.ref.reduction, params$laplacian.reduction.name) ) query.anchor <- FindTransferAnchors( reference = extended.reference.bridge, reference.reduction = bridge.query.reduction, dims = dims, query = query, reduction = reduction, scale = scale, features = rownames(Loadings(extended.reference.bridge[[bridge.query.reduction]])), k.filter = NA, verbose = verbose ) query <- MapQuery(anchorset = query.anchor, reference = extended.reference.bridge, query = query, store.weights = TRUE ) DefaultAssay(extended.reference) <- 'Bridge' bridge_anchor <- FindBridgeAnchor( object.list = list(DietSeurat(object = extended.reference, assays = 'Bridge'), query), bridge.object = extended.reference.bridge, reduction = integration.reduction, object.reduction = c(reference.reduction, paste0('ref.', bridge.query.reduction)), bridge.reduction = c(bridge.ref.reduction, bridge.query.reduction), anchor.type = "Integration", reference.bridge.stored = TRUE, verbose = verbose ) return(bridge_anchor) } #' Perform integration on the joint PCA cell embeddings. #' #' This is a convenience wrapper function around the following three functions #' that are often run together when perform integration. #' \code{\link{FindIntegrationAnchors}}, \code{\link{RunPCA}}, #' \code{\link{IntegrateEmbeddings}}. #' #' @inheritParams FindIntegrationAnchors #' @param new.reduction.name Name of integrated dimensional reduction #' @param npcs Total Number of PCs to compute and store (50 by default) #' @param findintegrationanchors.args A named list of additional arguments to #' \code{\link{FindIntegrationAnchors}} #' @param verbose Print messages and progress #' #' @importFrom rlang exec #' @return Returns a Seurat object with integrated dimensional reduction #' @export #' @concept integration #' FastRPCAIntegration <- function( object.list, reference = NULL, anchor.features = 2000, k.anchor = 20, dims = 1:30, scale = TRUE, normalization.method = c("LogNormalize", "SCT"), new.reduction.name = 'integrated_dr', npcs = 50, findintegrationanchors.args = list(), verbose = TRUE ) { npcs <- max(npcs, dims) my.lapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pblapply, no = future_lapply ) reduction <- 'rpca' if (is.numeric(x = anchor.features)) { anchor.features <- SelectIntegrationFeatures( object.list = object.list, nfeatures = anchor.features, verbose = FALSE ) } if (normalization.method == 'SCT') { scale <- FALSE object.list <- PrepSCTIntegration(object.list = object.list, anchor.features = anchor.features ) } if (verbose) { message('Performing PCA for each object') } object.list <- my.lapply(X = object.list, FUN = function(x) { if (normalization.method != 'SCT') { x <- ScaleData(x, features = anchor.features, do.scale = scale, verbose = FALSE) } x <- RunPCA(x, features = anchor.features, verbose = FALSE, npcs = npcs) return(x) } ) fia.allarguments <- c(list( object.list = object.list, reference = reference, anchor.features = anchor.features, reduction = reduction, normalization.method = normalization.method, scale = scale, k.anchor = k.anchor, dims = dims, verbose = verbose ), findintegrationanchors.args ) anchor <- exec("FindIntegrationAnchors",!!!fia.allarguments) object_merged <- merge(x = object.list[[1]], y = object.list[2:length(object.list)] ) anchor.feature <- slot(object = anchor, name = 'anchor.features') if (normalization.method != 'SCT') { object_merged <- ScaleData(object = object_merged, features = anchor.feature, do.scale = scale, verbose = FALSE ) } object_merged <- RunPCA(object_merged, features = anchor.feature, verbose = FALSE, npcs = npcs ) temp <- object_merged[["pca"]] object_merged <- IntegrateEmbeddings( anchorset = anchor, reductions = object_merged[['pca']], new.reduction.name = new.reduction.name, verbose = verbose) object_merged[['pca']] <- temp VariableFeatures(object = object_merged) <- anchor.feature return(object_merged) } #' Transfer embeddings from sketched cells to the full data #' #' @param atom.data Atom data #' @param atom.cells Atom cells #' @param orig.data Original data #' @param embeddings Embeddings of atom cells #' @param sketch.matrix Sketch matrix #' #' @importFrom MASS ginv #' @importFrom Matrix t #' #' @export #' @concept integration #' UnSketchEmbeddings <- function( atom.data, atom.cells = NULL, orig.data, embeddings, sketch.matrix = NULL ) { if(!all(rownames(atom.data) == rownames(orig.data))) { stop('features in atom.data and orig.data are not identical') } else { features = rownames(atom.data) } atom.cells <- atom.cells %||% colnames(x = atom.data) if (inherits(x = orig.data, what = 'DelayedMatrix') ) { stop("PseudobulkExpression does not support DelayedMatrix objects") } else if(inherits(x = orig.data, what = 'IterableMatrix')) { matrix.prod.function <- crossprod_BPCells } else { matrix.prod.function <- crossprod } sketch.matrix <- sketch.matrix %||% as.sparse(diag(length(features))) atom.data <- atom.data[, atom.cells] embeddings <- embeddings[atom.cells,] exp.mat <- as.matrix(x = t(x = atom.data) %*% sketch.matrix) sketch.transform <- ginv(X = exp.mat) %*% embeddings emb <- matrix.prod.function( x = as.matrix(sketch.matrix %*% sketch.transform), y = orig.data ) emb <- as.matrix(x = emb) return(emb) } FeatureSketch <- function(features, ratio = 0.8, seed = 123) { sketch.R <- t(x = CountSketch( nsketch = round(x = ratio * length(x = features)), ncells = length(x = features), seed = seed) ) return(sketch.R) } Seurat/R/roxygen.R0000644000176200001440000000276015056057544013554 0ustar liggesusers#' @include zzz.R #' NULL #' @importFrom utils lsf.str #' @importFrom rlang is_scalar_character #' .rd_methods <- function(method = 'integration') { methods <- sapply( X = grep(pattern = '^package:', x = search(), value = TRUE), FUN = function(x) { fxns <- as.character(x = lsf.str(pos = x)) attrs <- vector(mode = 'logical', length = length(x = fxns)) for (i in seq_along(along.with = fxns)) { mthd <- attr(x = get(x = fxns[i], pos = x), which = 'Seurat.method') attrs[i] <- is_scalar_character(x = mthd) && isTRUE(x = mthd == method) } return(fxns[attrs]) }, simplify = FALSE, USE.NAMES = TRUE ) methods <- Filter(f = length, x = methods) names(x = methods) <- gsub( pattern = '^package:', replacement = '', x = names(x = methods) ) if (!length(x = methods)) { return('') } ret <- vector( mode = 'character', length = sum(vapply( X = methods, FUN = length, FUN.VALUE = integer(length = 1L) )) ) j <- 1L for (pkg in names(x = methods)) { for (fxn in methods[[pkg]]) { ret[j] <- ifelse( test = pkg == 'Seurat', yes = paste0('\\item \\code{\\link{', fxn, '}}'), no = paste0( '\\item \\code{\\link[', pkg, ':', fxn, ']{', pkg, '::', fxn, '}}' ) ) j <- j + 1L } } return(paste('\\itemize{', paste0(' ', ret, collapse = '\n'), '}', sep = '\n')) } Seurat/R/mixscape.R0000644000176200001440000014131415074241310013653 0ustar liggesusers#' @include generics.R #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Calculate a perturbation Signature #' #' Function to calculate perturbation signature for pooled CRISPR screen datasets. #' For each target cell (expressing one target gRNA), we identified 20 cells #' from the control pool (non-targeting cells) with the most similar mRNA #' expression profiles. The perturbation signature is calculated by subtracting the #' averaged mRNA expression profile of the non-targeting neighbors from the mRNA #' expression profile of the target cell. #' #' @param object An object of class Seurat. #' @param assay Name of Assay PRTB signature is being calculated on. #' @param features Features to compute PRTB signature for. Defaults to the #' variable features set in the assay specified. #' @param slot Data slot to use for PRTB signature calculation. #' @param gd.class Metadata column containing target gene classification. #' @param nt.cell.class Non-targeting gRNA cell classification identity. #' @param split.by Provide metadata column if multiple biological replicates #' exist to calculate PRTB signature for every replicate separately. #' @param num.neighbors Number of nearest neighbors to consider. #' @param ndims Number of dimensions to use from dimensionality reduction method. #' @param reduction Reduction method used to calculate nearest neighbors. #' @param new.assay.name Name for the new assay. #' @param verbose Display progress + messages #' @return Returns a Seurat object with a new assay added containing the #' perturbation signature for all cells in the data slot. #' #' @importFrom RANN nn2 #' @export #' @concept mixscape #' CalcPerturbSig <- function( object, assay = NULL, features = NULL, slot = "data", gd.class = "guide_ID", nt.cell.class = "NT", split.by = NULL, num.neighbors = NULL, reduction = "pca", ndims = 15, new.assay.name = "PRTB", verbose = TRUE ) { assay <- assay %||% DefaultAssay(object = object ) if (is.null(x = reduction)) { stop('Please provide dimensionality reduction name.') } if (is.null(x = num.neighbors)) { stop("Please specify number of nearest neighbors to consider") } if (is.null(x = ndims)) { stop("Please provide number of ", reduction, " dimensions to consider") } features <- features %||% VariableFeatures(object = object[[assay]]) if (length(x = features) == 0) { features <- rownames(x = GetAssayData(object = object[[assay]], layer= slot)) } if (! is.null(x = split.by)) { Idents(object = object) <- split.by } else { Idents(object = object) <- "rep1" } replicate <- unique(x = Idents(object = object)) all_diff <- list() all_nt_cells <- Cells(x = object)[which(x = object[[]][gd.class] == nt.cell.class)] all_neighbors <- list() for (r in replicate) { if (verbose) { message("Processing ", r) } all_cells <- WhichCells(object = object, idents = r) nt_cells <- intersect(x = all_nt_cells, all_cells) # get pca cell embeddings all_mtx <- Embeddings(object = object, reduction = reduction)[all_cells, ] nt_mtx <- Embeddings(object = object, reduction = reduction)[nt_cells, ] # run nn2 to find the 20 nearest NT neighbors for all cells. Use the same # number of PCs as the ones you used for umap neighbors <- NNHelper( data = nt_mtx[, 1:ndims], query = all_mtx[, 1:ndims], k = num.neighbors, method = "rann" ) diff <- PerturbDiff( object = object, assay = assay, slot = slot, all_cells = all_cells, nt_cells = nt_cells, features = features, neighbors = neighbors, verbose = verbose ) all_diff[[r]] <- diff all_neighbors[[make.names(names = paste0(new.assay.name, "_", r))]] <- neighbors } slot(object = object, name = "tools")[[paste("CalcPerturbSig", assay, reduction, sep = ".")]] <- all_neighbors all_diff <- do.call(what = cbind, args = all_diff) prtb.assay <- suppressWarnings( expr = CreateAssayObject( data = all_diff[, colnames(x = object)], min.cells = -Inf, min.features = -Inf, check.matrix = FALSE ) ) object[[new.assay.name]] <- prtb.assay object <- LogSeuratCommand(object = object) return(object) } #' DE and EnrichR pathway visualization barplot #' #' @inheritParams FindMarkers #' @param object Name of object class Seurat. #' @param ident.1 Cell class identity 1. #' @param ident.2 Cell class identity 2. #' @param balanced Option to display pathway enrichments for both negative and #' positive DE genes.If false, only positive DE gene will be displayed. #' @param max.genes Maximum number of genes to use as input to enrichR. #' @param logfc.threshold Limit testing to genes which show, on average, at least #' X-fold difference (log-scale) between the two groups of cells. Default is 0.25. #' Increasing logfc.threshold speeds up the function, but can miss weaker signals. #' @param p.val.cutoff Cutoff to select DE genes. #' @param cols A list of colors to use for barplots. #' @param enrich.database Database to use from enrichR. #' @param num.pathway Number of pathways to display in barplot. #' @param return.gene.list Return list of DE genes #' #' @return Returns one (only enriched) or two (both enriched and depleted) #' barplots with the top enriched/depleted GO terms from EnrichR. #' #' @importFrom ggplot2 ggplot geom_bar geom_density coord_flip scale_fill_manual #' ylab ggtitle theme_classic theme element_text #' @importFrom patchwork wrap_plots #' #' @export #' @concept mixscape DEenrichRPlot <- function( object, ident.1 = NULL, ident.2 = NULL, balanced = TRUE, logfc.threshold = 0.25, assay = NULL, max.genes, test.use = 'wilcox', p.val.cutoff = 0.05, cols = NULL, enrich.database = NULL, num.pathway = 10, return.gene.list = FALSE, ... ) { enrichr.installed <- requireNamespace('enrichR', quietly = TRUE) if (isFALSE(x = enrichr.installed)) { stop( "Please install the enrichR package to use DEenrichRPlot", "\nThis can be accomplished with the following command: ", "\n----------------------------------------", "\ninstall.packages('enrichR')", "\n----------------------------------------", call. = FALSE ) } if (is.null(x = enrich.database)) { stop("Please specify the name of enrichR database to use") } if (!is.numeric(x = max.genes)) { stop("please set max.genes") } assay <- assay %||% DefaultAssay(object = object) DefaultAssay(object = object) <- assay all.markers <- FindMarkers( object = object, ident.1 = ident.1, ident.2 = ident.2, only.pos = FALSE, logfc.threshold = logfc.threshold, test.use = test.use, assay = assay ) pos.markers <- all.markers[all.markers[, 2] > logfc.threshold & all.markers[, 1] < p.val.cutoff, , drop = FALSE] if(nrow(pos.markers) == 0){ message("No positive markers pass the logfc.thershold") pos.er <- c() } else{ pos.markers.list <- rownames(x = pos.markers)[1:min(max.genes, nrow(x = pos.markers))] pos.er <- enrichR::enrichr(genes = pos.markers.list, databases = enrich.database) pos.er <- do.call(what = cbind, args = pos.er) pos.er$log10pval <- -log10(x = pos.er[, paste(enrich.database, sep = ".", "P.value")]) pos.er$term <- pos.er[, paste(enrich.database, sep = ".", "Term")] pos.er <- pos.er[1:num.pathway, ] pos.er$term <- factor(x = pos.er$term, levels = pos.er$term[order(pos.er$log10pval)]) gene.list <- list(pos = pos.er) } if (isTRUE(x = balanced)) { neg.markers <- all.markers[all.markers[, 2] < -logfc.threshold & all.markers[, 1] < p.val.cutoff, , drop = FALSE] neg.markers.list <- rownames(x = neg.markers)[1:min(max.genes, nrow(x = neg.markers))] Sys.sleep(1) neg.er <- enrichR::enrichr(genes = neg.markers.list, databases = enrich.database) neg.er <- do.call(what = cbind, args = neg.er) neg.er$log10pval <- -log10(x = neg.er[, paste(enrich.database, sep = ".", "P.value")]) neg.er$term <- neg.er[, paste(enrich.database, sep = ".", "Term")] neg.er <- neg.er[1:num.pathway, ] neg.er$term <- factor(x = neg.er$term, levels = neg.er$term[order(neg.er$log10pval)]) if(isTRUE(length(neg.er$term) == 0) & isTRUE(length(pos.er == 0))){ stop("No positive or negative marker genes identified") } else{ if(isTRUE(length(neg.er$term) == 0)){ gene.list <- list(pos = pos.er) } else{ gene.list <- list(pos = pos.er, neg = neg.er) } } } if (return.gene.list) { return(gene.list) } if(nrow(pos.markers) == 0){ message("No positive markers to plot") if (isTRUE(x = balanced)) { p2 <- ggplot(data = neg.er, aes(x = .data[["term"]], y = .data[["log10pval"]])) + geom_bar(stat = "identity", fill = "indianred2") + coord_flip() + xlab("Pathway") + scale_fill_manual(values = cols, drop = FALSE) + ylab("-log10(pval)") + ggtitle(paste(enrich.database, ident.1, sep = "_", "negative markers")) + theme_classic() + geom_text(aes(label = .data[["term"]], y = 0), size = 5, color = "black", position = position_dodge(1), hjust = 0)+ theme(axis.title.y= element_blank(), axis.text.y = element_blank(), axis.ticks.y = element_blank()) p <- p2 } else{ stop("Nothing to plot") } } else { p <- ggplot(data = pos.er, aes(x = .data[["term"]], y = .data[["log10pval"]])) + geom_bar(stat = "identity", fill = "dodgerblue") + coord_flip() + xlab("Pathway") + scale_fill_manual(values = cols, drop = FALSE) + ylab("-log10(pval)") + ggtitle(paste(enrich.database, ident.1, sep = "_", "positive markers")) + theme_classic() + geom_text(aes(label = .data[["term"]], y = 0), size = 5, color = "black", position = position_dodge(1), hjust = 0)+ theme(axis.title.y= element_blank(), axis.text.y = element_blank(), axis.ticks.y = element_blank()) if (isTRUE(x = balanced)) { p2 <- ggplot(data = neg.er, aes(x = .data[["term"]], y = .data[["log10pval"]])) + geom_bar(stat = "identity", fill = "indianred2") + coord_flip() + xlab("Pathway") + scale_fill_manual(values = cols, drop = FALSE) + ylab("-log10(pval)") + ggtitle(paste(enrich.database, ident.1, sep = "_", "negative markers")) + theme_classic() + geom_text(aes(label = .data[["term"]], y = 0), size = 5, color = "black", position = position_dodge(1), hjust = 0)+ theme(axis.title.y= element_blank(), axis.text.y = element_blank(), axis.ticks.y = element_blank()) p <- p+p2 } } return(p) } #' Linear discriminant analysis on pooled CRISPR screen data. #' #' This function performs unsupervised PCA on each mixscape class separately and projects each subspace onto all #' cells in the data. Finally, it uses the first 10 principle components from each projection as input to lda in MASS package together with mixscape class labels. #' #' @inheritParams PrepLDA #' @inheritParams RunLDA #' #' @return Returns a Seurat object with LDA added in the reduction slot. #' #' @export #' @concept mixscape #' MixscapeLDA <- function( object, assay = NULL, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "LDA_", seed = 42, pc.assay = "PRTB", labels = "gene", nt.label = "NT", npcs = 10, verbose = TRUE, logfc.threshold = 0.25 ) { projected_pcs <- PrepLDA( object = object, de.assay = assay, pc.assay = pc.assay, labels = labels, nt.label = nt.label, npcs = npcs , verbose = verbose ) lda.lables <- object[[labels]][,] object_lda <- RunLDA( object = projected_pcs, labels = lda.lables, assay = assay, verbose = verbose ) object[["lda"]] <- object_lda return(object) } #' Function to prepare data for Linear Discriminant Analysis. #' #' This function performs unsupervised PCA on each mixscape class separately and projects each subspace onto all #' cells in the data. #' #' @param object An object of class Seurat. #' @param de.assay Assay to use for selection of DE genes. #' @param pc.assay Assay to use for running Principle components analysis. #' @param labels Meta data column with target gene class labels. #' @param nt.label Name of non-targeting cell class. #' @param npcs Number of principle components to use. #' @param verbose Print progress bar. #' @param logfc.threshold Limit testing to genes which show, on average, at least #' X-fold difference (log-scale) between the two groups of cells. Default is 0.25. #' Increasing logfc.threshold speeds up the function, but can miss weaker signals. #' @return Returns a list of the first 10 PCs from each projection. #' #' @export #' @concept mixscape #' PrepLDA <- function( object, de.assay = "RNA", pc.assay = "PRTB", labels = "gene", nt.label = "NT", npcs = 10, verbose = TRUE, logfc.threshold = 0.25 ) { projected_pcs <- list() gene_list <- setdiff(x = unique(x = object[[labels]][, 1]), y = nt.label) Idents(object = object) <- labels DefaultAssay(object = object) <- pc.assay all_genes <- list() nt.cells <- WhichCells(object = object, idents = nt.label) for (g in gene_list) { if (verbose) { message(g) } gd.cells <- WhichCells(object = object, idents = g) gene_set <- TopDEGenesMixscape( object = object, ident.1 = gd.cells, ident.2 = nt.cells, de.assay = de.assay, logfc.threshold = logfc.threshold, labels = labels, verbose = verbose ) if (length(x = gene_set) < (npcs + 1)) { all_genes[[g]] <- character() next } all_genes[[g]] <- gene_set } all_markers <- unique(x = unlist(x = all_genes)) missing_genes <- all_markers[!all_markers %in% rownames(x = object[[pc.assay]])] object <- GetMissingPerturb(object = object, assay = pc.assay, features = missing_genes, verbose = verbose) for (g in gene_list) { if (verbose) { message(g) } gene_subset <- subset(x = object, idents = c(g, nt.label)) gene_set <- all_genes[[g]] if (length(x = gene_set) == 0) { next } gene_subset <- ScaleData( object = gene_subset, features = gene_set, verbose = FALSE ) gene_subset <- RunPCA( object = gene_subset, features = gene_set, npcs = npcs, verbose = FALSE ) project_pca <- ProjectCellEmbeddings( reference = gene_subset, query = object, dims = 1:npcs, verbose = FALSE ) colnames(x = project_pca) <- paste(g, colnames(x = project_pca), sep = "_") projected_pcs[[g]] <- project_pca } return(projected_pcs) } #' @param object Input values for LDA (numeric), with observations as rows #' @param labels Observation labels for LDA #' @param assay Name of Assay LDA is being run on #' @param ndims.print PCs to print genes for #' @param nfeatures.print Number of genes to print for each PC #' @param reduction.key dimensional reduction key, specifies the string before #' the number for the dimension names. LDA by default #' @param seed Set a random seed. By default, sets the seed to 42. Setting #' NULL will not set a seed. #' #' @importFrom MASS lda #' @importFrom stats predict #' #' @rdname RunLDA #' @concept mixscape #' @export #' @method RunLDA default #' RunLDA.default <- function( object, labels, assay = NULL, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "LDA_", seed = 42, ... ) { if (!is.null(x = seed)) { set.seed(seed = seed) } object <- data.frame(object) var_names <- colnames(x = object) object$lda_cluster_label <- labels lda_results <- lda(formula = lda_cluster_label ~ ., data = object) lda_predictions <- predict(object = lda_results, newdata = object) lda_cv <-lda( formula = lda_cluster_label ~ ., data = object, CV = TRUE )$posterior feature.loadings <- lda_results$scaling cell.embeddings <- lda_predictions$x lda.assignments <- lda_predictions$class lda.posterior <- lda_predictions$posterior colnames(x = lda.posterior) <- paste0("LDAP_", colnames(x = lda.posterior)) rownames(x = feature.loadings) <- var_names colnames(x = feature.loadings) <- paste0(reduction.key, 1:ncol(x = cell.embeddings)) rownames(x = cell.embeddings) <- rownames(x = object) colnames(x = cell.embeddings) <- colnames(x = feature.loadings) reduction.data <- CreateDimReducObject( embeddings = cell.embeddings, loadings = feature.loadings, assay = assay, key = reduction.key, misc = list( assignments = lda.assignments, posterior = lda.posterior, model = lda_results, cv = lda_cv ) ) if (verbose) { print(x = reduction.data, dims = ndims.print, nfeatures = nfeatures.print) } return(reduction.data) } #' Function to perform Linear Discriminant Analysis. #' #' @param ndims.print Number of LDA dimensions to print. #' @param nfeatures.print Number of features to print for each LDA component. #' @param reduction.key Reduction key name. #' #' @rdname RunLDA #' @concept mixscape #' @export #' @method RunLDA Assay #' RunLDA.Assay <- function( object, assay = NULL, labels, features = NULL, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "LDA_", seed = 42, ... ) { data.use <- PrepDR( object = object, features = features, verbose = verbose ) reduction.data <- RunLDA( object = t(x = data.use), assay = assay, labels = labels, verbose = verbose, ndims.print = ndims.print, nfeatures.print = nfeatures.print, reduction.key = reduction.key, seed = seed, ... ) return(reduction.data) } #' @param object An object of class Seurat. #' @param assay Assay to use for performing Linear Discriminant Analysis (LDA). #' @param labels Meta data column with target gene class labels. #' @param features Features to compute LDA on #' @param reduction.name dimensional reduction name, lda by default #' @param reduction.key Reduction key name. #' @param seed Value for random seed #' @param verbose Print the top genes associated with high/low loadings for #' the PCs #' @param ndims.print Number of LDA dimensions to print. #' @param nfeatures.print Number of features to print for each LDA component. #' #' @rdname RunLDA #' @concept mixscape #' @export #' @method RunLDA Seurat #' RunLDA.Seurat <- function( object, assay = NULL, labels, features = NULL, reduction.name = "lda", reduction.key = "LDA_", seed = 42, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, ... ) { assay <- assay %||% DefaultAssay(object = object) reduction.data <- RunLDA( object = object[[assay]], assay = assay, labels = labels, features = features, verbose = verbose, ndims.print = ndims.print, nfeatures.print = nfeatures.print, reduction.key = reduction.key, seed = seed, ... ) object[[reduction.name]] <- reduction.data object$lda.assignments <- slot(object = object[[reduction.name]], name = "misc")[["assignments"]] object <- AddMetaData( object = object, metadata = as.data.frame( x = slot(object = object[[reduction.name]], name = "misc")[["posterior"]] ) ) object <- LogSeuratCommand(object = object) object <- ProjectDim( object = object, reduction = reduction.name, assay = assay, verbose = verbose, dims.print = ndims.print, nfeatures.print = nfeatures.print ) Loadings(object = object[[reduction.name]]) <- Loadings( object = object[[reduction.name]], projected = TRUE ) return(object) } #' Run Mixscape #' #' Function to identify perturbed and non-perturbed gRNA expressing cells that #' accounts for multiple treatments/conditions/chemical perturbations. #' #' @importFrom ggplot2 geom_density position_dodge #' @param object An object of class Seurat. #' @param assay Assay to use for mixscape classification. #' @param slot Assay data slot to use. #' @param labels metadata column with target gene labels. #' @param nt.class.name Classification name of non-targeting gRNA cells. #' @param new.class.name Name of mixscape classification to be stored in #' metadata. #' @param min.de.genes Required number of genes that are differentially #' expressed for method to separate perturbed and non-perturbed cells. #' @param min.cells Minimum number of cells in target gene class. If fewer than #' this many cells are assigned to a target gene class during classification, #' all are assigned NP. #' @param de.assay Assay to use when performing differential expression analysis. #' Usually RNA. #' @param logfc.threshold Limit testing to genes which show, on average, #' at least X-fold difference (log-scale) between the two groups of cells. #' Default is 0.25 Increasing logfc.threshold speeds up the function, but can miss #' weaker signals. #' @param iter.num Number of normalmixEM iterations to run if convergence does #' not occur. #' @param verbose Display messages #' @param split.by metadata column with experimental condition/cell type #' classification information. This is meant to be used to account for cases a #' perturbation is condition/cell type -specific. #' @param fine.mode When this is equal to TRUE, DE genes for each target gene #' class will be calculated for each gRNA separately and pooled into one DE list #' for calculating the perturbation score of every cell and their subsequent #' classification. #' @param fine.mode.labels metadata column with gRNA ID labels. #' @param prtb.type specify type of CRISPR perturbation expected for labeling mixscape classifications. Default is KO. #' @return Returns Seurat object with with the following information in the #' meta data and tools slots: #' \describe{ #' \item{mixscape_class}{Classification result with cells being either #' classified as perturbed (KO, by default) or non-perturbed (NP) based on their target #' gene class.} #' \item{mixscape_class.global}{Global classification result (perturbed, NP or NT)} #' \item{p_ko}{Posterior probabilities used to determine if a cell is KO (default). Name of this item will change to match prtb.type parameter setting. #' (>0.5) or NP} #' \item{perturbation score}{Perturbation scores for every cell calculated in #' the first iteration of the function.} #' } #' #' @export #' @concept mixscape #' RunMixscape <- function( object, assay = "PRTB", slot = "scale.data", labels = "gene", nt.class.name = "NT", new.class.name = "mixscape_class", min.de.genes = 5, min.cells = 5, de.assay = "RNA", logfc.threshold = 0.25, iter.num = 10, verbose = FALSE, split.by = NULL, fine.mode = FALSE, fine.mode.labels = "guide_ID", prtb.type = "KO" ) { mixtools.installed <- requireNamespace('mixtools', quietly = TRUE) if (isFALSE(x = mixtools.installed)) { stop("Please install the mixtools package to use RunMixscape", "\nThis can be accomplished with the following command: ", "\n----------------------------------------", "\ninstall.packages('mixtools')", "\n----------------------------------------", call. = FALSE) } assay <- assay %||% DefaultAssay(object = object) if (is.null(x = labels)) { stop("Please specify target gene class metadata name") } prtb_markers <- list() object[[new.class.name]] <- object[[labels]] object[[new.class.name]][, 1] <- as.character(x = object[[new.class.name]][, 1]) object[[paste0(new.class.name, "_p_", tolower(x = prtb.type))]] <- 0 #create list to store perturbation scores. gv.list <- list() if (is.null(x = split.by)) { split.by <- splits <- "con1" } else { splits <- as.character(x = unique(x = object[[split.by]][, 1])) } # determine gene sets across all splits/groups cells.s.list <- list() for (s in splits) { Idents(object = object) <- split.by cells.s <- WhichCells(object = object, idents = s) cells.s.list[[s]] <- cells.s genes <- setdiff(x = unique(x = object[[labels]][cells.s, 1]), y = nt.class.name) Idents(object = object) <- labels for (gene in genes) { if (isTRUE(x = verbose)) { message("Processing ", gene) } orig.guide.cells <- intersect(x = WhichCells(object = object, idents = gene), y = cells.s) nt.cells <- intersect(x = WhichCells(object = object, idents = nt.class.name), y = cells.s) if (isTRUE(x = fine.mode)) { guides <- setdiff(x = unique(x = object[[fine.mode.labels]][orig.guide.cells, 1]), y = nt.class.name) all.de.genes <- c() for (gd in guides) { gd.cells <- rownames(x = object[[]][orig.guide.cells, ])[which(x = object[[]][orig.guide.cells, fine.mode.labels] == gd)] de.genes <- TopDEGenesMixscape( object = object, ident.1 = gd.cells, ident.2 = nt.cells, de.assay = de.assay, logfc.threshold = logfc.threshold, labels = fine.mode.labels, verbose = verbose ) all.de.genes <- c(all.de.genes, de.genes) } all.de.genes <- unique(all.de.genes) } else { all.de.genes <- TopDEGenesMixscape( object = object, ident.1 = orig.guide.cells, ident.2 = nt.cells, de.assay = de.assay, logfc.threshold = logfc.threshold, labels = labels, verbose = verbose ) } prtb_markers[[s]][[gene]] <- all.de.genes if (length(x = all.de.genes) < min.de.genes) { prtb_markers[[s]][[gene]] <- character() } } } all_markers <- unique(x = unlist(x = prtb_markers)) missing_genes <- all_markers[!all_markers %in% rownames(x = object[[assay]])] object <- GetMissingPerturb(object = object, assay = assay, features = missing_genes, verbose = verbose) for (s in splits) { cells.s <- cells.s.list[[s]] genes <- setdiff(x = unique(x = object[[labels]][cells.s, 1]), y = nt.class.name) if (verbose) { message("Classifying cells for: ") } for (gene in genes) { Idents(object = object) <- labels post.prob <- 0 orig.guide.cells <- intersect(x = WhichCells(object = object, idents = gene), y = cells.s) nt.cells <- intersect(x = WhichCells(object = object, idents = nt.class.name), y = cells.s) all.cells <- c(orig.guide.cells, nt.cells) if (length(x = prtb_markers[[s]][[gene]]) == 0) { if (verbose) { message(" Fewer than ", min.de.genes, " DE genes for ", gene, ". Assigning cells as NP.") } object[[new.class.name]][orig.guide.cells, 1] <- paste0(gene, " NP") } else { if (verbose) { message(" ", gene) } de.genes <- prtb_markers[[s]][[gene]] dat <- GetAssayData(object = object[[assay]], layer = "data")[de.genes, all.cells, drop = FALSE] if (slot == "scale.data") { dat <- ScaleData(object = dat, features = de.genes, verbose = FALSE) } converged <- FALSE n.iter <- 0 old.classes <- object[[new.class.name]][all.cells, ] while (!converged && n.iter < iter.num) { Idents(object = object) <- new.class.name guide.cells <- intersect(x = WhichCells(object = object, idents = gene), y = cells.s) vec <- rowMeans2(x = dat[, guide.cells, drop = FALSE]) - rowMeans2(x = dat[, nt.cells, drop = FALSE]) pvec <- apply(X = dat, MARGIN = 2, FUN = ProjectVec, v2 = vec) if (n.iter == 0){ #store pvec gv <- as.data.frame(x = pvec) gv[, labels] <- nt.class.name gv[intersect(x = rownames(x = gv), y = guide.cells), labels] <- gene gv.list[[gene]][[s]] <- gv } guide.norm <- DefineNormalMixscape(pvec[guide.cells]) nt.norm <- DefineNormalMixscape(pvec[nt.cells]) mm <- mixtools::normalmixEM( x = pvec, mu = c(nt.norm$mu, guide.norm$mu), sigma = c(nt.norm$sd, guide.norm$sd), k = 2, mean.constr = c(nt.norm$mu, NA), sd.constr = c(nt.norm$sd, NA), verb = FALSE, maxit = 5000, maxrestarts = 100 ) lik.ratio <- dnorm(x = pvec[orig.guide.cells], mean = mm$mu[1], sd = mm$sigma[1]) / dnorm(x = pvec[orig.guide.cells], mean = mm$mu[2], sd = mm$sigma[2]) post.prob <- 1/(1 + lik.ratio) object[[new.class.name]][names(x = which(post.prob > 0.5)), 1] <- gene object[[new.class.name]][names(x = which(post.prob < 0.5)), 1] <- paste(gene, " NP", sep = "") if (length(x = which(x = object[[new.class.name]] == gene & Cells(x = object) %in% cells.s)) < min.de.genes) { if (verbose) { message("Fewer than ", min.cells, " cells assigned as ", gene, "Assigning all to NP.") } object[[new.class.name]][guide.cells, 1] <- "NP" converged <- TRUE } if (all(object[[new.class.name]][all.cells, ] == old.classes)) { converged <- TRUE } old.classes <- object[[new.class.name]][all.cells, ] n.iter <- n.iter + 1 } object[[new.class.name]][which(x = object[[new.class.name]] == gene & Cells(x = object) %in% cells.s), 1] <- paste(gene, prtb.type, sep = " ") } object[[paste0(new.class.name, ".global")]] <- as.character(x = sapply(X = as.character(x = object[[new.class.name]][, 1]), FUN = function(x) {strsplit(x = x, split = " (?=[^ ]+$)", perl = TRUE)[[1]][2]})) object[[paste0(new.class.name, ".global")]][which(x = is.na(x = object[[paste0(new.class.name, ".global")]])), 1] <- nt.class.name object[[paste0(new.class.name,"_p_", tolower(prtb.type))]][names(x = post.prob), 1] <- post.prob } } Tool(object = object) <- gv.list Idents(object = object) <- new.class.name return(object) } #' Differential expression heatmap for mixscape #' #' Draws a heatmap of single cell feature expression with cells ordered by their #' mixscape ko probabilities. #' #' @inheritParams FindMarkers #' @inheritParams DoHeatmap #' @param max.cells.group Number of cells per identity to plot. #' @param max.genes Total number of DE genes to plot. #' @param balanced Plot an equal number of genes with both groups of cells. #' @param logfc.threshold Limit testing to genes which show, on average, at least #' X-fold difference (log-scale) between the two groups of cells. Default is 0.25. #' Increasing logfc.threshold speeds up the function, but can miss weaker signals. #' @param order.by.prob Order cells on heatmap based on their mixscape knockout #' probability from highest to lowest score. #' @param group.by (Deprecated) Option to split densities based on mixscape #' classification. Please use mixscape.class instead #' @param mixscape.class metadata column with mixscape classifications. #' @param prtb.type specify type of CRISPR perturbation expected for labeling #' mixscape classifications. Default is KO. #' @param fc.name Name of the fold change, average difference, or custom #' function column in the output data.frame. Default is avg_log2FC #' @param pval.cutoff P-value cut-off for selection of significantly DE genes. #' @return A ggplot object. #' #' @importFrom stats median #' @importFrom scales hue_pal #' @importFrom ggplot2 annotation_raster coord_cartesian ggplot_build #' @export #' @concept mixscape #' MixscapeHeatmap <- function( object, ident.1 = NULL, ident.2 = NULL, balanced = TRUE, logfc.threshold = 0.25, assay = "RNA", max.genes = 100, test.use ='wilcox', max.cells.group = NULL, order.by.prob = TRUE, group.by = NULL, mixscape.class = "mixscape_class", prtb.type = "KO", fc.name = "avg_log2FC", pval.cutoff = 5e-2, ... ) { if (!is.null(x = group.by)) { message("The group.by parameter is being deprecated. Please use ", "mixscape.class instead. Setting mixscape.class = ", group.by, " and continuing.") mixscape.class <- group.by } DefaultAssay(object = object) <- assay if (is.numeric(x = max.genes)) { all.markers <- FindMarkers( object = object, ident.1 = ident.1, ident.2 = ident.2, only.pos = FALSE, logfc.threshold = logfc.threshold, test.use = test.use ) if (balanced) { pos.markers <- all.markers[which(x = all.markers[,fc.name] > (logfc.threshold)), ] neg.markers <- all.markers[which(x = all.markers[,fc.name] < (-logfc.threshold)), ] if (length(x = rownames(x = subset(x = pos.markers, p_val < pval.cutoff))) < max.genes ) { marker.list <- c(rownames(x = subset(x = pos.markers, p_val < pval.cutoff))) if (length(x = rownames(x = subset(x = neg.markers, p_val < pval.cutoff))) < max.genes){ marker.list <- c(marker.list, rownames(x = subset(x = neg.markers, p_val < pval.cutoff))) } else { marker.list <- c(marker.list, rownames(x = subset(x = neg.markers, p_val < pval.cutoff))[1:max.genes]) } } else { marker.list <- c(rownames(x = subset(x = pos.markers, p_val < pval.cutoff))[1:max.genes]) if (length(x = rownames(x = subset(x = neg.markers, p_val < pval.cutoff))) < max.genes) { marker.list <- c(marker.list, rownames(x = subset(x = neg.markers, p_val < pval.cutoff))) } else { marker.list <- c(marker.list, rownames(x = subset(x = neg.markers, p_val < pval.cutoff))[1:max.genes]) } } } else { pos.markers <- all.markers[which(x = all.markers[, fc.name] > (logfc.threshold)),] if (length(x = rownames(x = subset(x = pos.markers, p_val < pval.cutoff))) < max.genes ){ marker.list <- c(rownames(x = subset(x = pos.markers, p_val < pval.cutoff))) } else { marker.list <- c(rownames(x = subset(x = pos.markers, p_val < pval.cutoff))[1:max.genes]) } } if (is.null(x = max.cells.group)) { if (is.null(x = group.by)) { sub2 <- subset(x = object, idents = c(ident.1, ident.2)) } else{ sub2 <- subset(x = object, idents = c(ident.1, ident.2)) Idents(object = sub2) <- group.by } } else { if (is.null(x = group.by)) { sub2 <- subset(x = object, idents = c(ident.1, ident.2), downsample = max.cells.group) } else { sub <- subset(x = object, idents = c(ident.1, ident.2)) Idents(object = sub) <- group.by sub2 <- subset(x = sub, downsample = max.cells.group) } } sub2 <- ScaleData(object = sub2, features = marker.list, assay = assay) if (isTRUE(x = order.by.prob)) { p_ko <- sub2[[paste0(mixscape.class, "_p_", tolower(x = prtb.type) )]][, 1, drop = FALSE] ordered.cells <- rownames(x = p_ko)[order(p_ko[,1], decreasing = TRUE)] p <- DoHeatmap(object = sub2, features = marker.list, label = TRUE, cells = ordered.cells, assay = assay, ...) } else{ p <- DoHeatmap(object = sub2, features = marker.list, label = TRUE, cells = sample(x = Cells(x = sub2)), assay = assay, ...) } return(p) } } #' Function to plot perturbation score distributions. #' #' Density plots to visualize perturbation scores calculated from RunMixscape #' function. #' #' @param object An object of class Seurat. #' @param target.gene.ident Target gene name to visualize perturbation scores for. #' @param target.gene.class meta data column specifying all target gene names in the experiment. #' @param before.mixscape Option to split densities based on mixscape classification (default) or original target gene classification. #' Default is set to NULL and plots cells by original class ID. #' @param col Specify color of target gene class or knockout cell class. For #' control non-targeting and non-perturbed cells, colors are set to different #' shades of grey. #' @param mixscape.class meta data column specifying mixscape classifications. #' @param prtb.type specify type of CRISPR perturbation expected for labeling mixscape classifications. Default is KO. #' @param split.by For datasets with more than one cell type. Set equal TRUE to visualize perturbation scores for each cell type separately. #' @return A ggplot object. #' #' @importFrom stats median #' @importFrom scales hue_pal #' @importFrom ggplot2 annotation_raster coord_cartesian ggplot_build #' geom_density theme_classic #' @export #' @concept mixscape #' PlotPerturbScore <- function( object, target.gene.class = "gene", target.gene.ident = NULL, mixscape.class = "mixscape_class", col = "orange2", split.by = NULL, before.mixscape = FALSE, prtb.type = "KO" ){ if(is.null(target.gene.ident) == TRUE){ message("Please provide name of target gene class to plot") } prtb_score_list <- Tool(object = object, slot = "RunMixscape")[[target.gene.ident]] for (nm in names(prtb_score_list)){ prtb_score_list[[nm]]['name'] <- nm } prtb_score <- do.call(rbind, prtb_score_list) prtb_score[, 2] <- as.factor(x = prtb_score[, 2]) gd <- setdiff(x = unique(x = prtb_score[, target.gene.class]), y = target.gene.ident) colnames(x = prtb_score)[2] <- "gene" prtb_score$cell.bc <- sapply(rownames(prtb_score), FUN = function(x) substring(x, regexpr("[.]", x) + 1)) if (isTRUE(x = before.mixscape)) { cols <- setNames( object = c("grey49", col), nm = c(gd, target.gene.ident) ) p <- ggplot(data = prtb_score, mapping = aes(x = .data[["pvec"]], color = .data[["gene"]])) + geom_density() + theme_classic() top_r <- ggplot_build(p)$layout$panel_params[[1]]$y.range[2] prtb_score$y.jitter <- prtb_score$pvec prtb_score$y.jitter[prtb_score[, "gene"] == gd] <- runif( n = prtb_score$y.jitter[prtb_score[, "gene"] == gd], min = 0.001, max = top_r / 10 ) prtb_score$y.jitter[prtb_score[,"gene"] == target.gene.ident] <- runif( n = prtb_score$y.jitter[prtb_score[, "gene"] == target.gene.ident], min = -top_r / 10, max = 0 ) if(is.null(split.by)==FALSE) { prtb_score$split <- as.character(object[[split.by]][prtb_score$cell.bc,1]) p2 <- p + scale_color_manual(values = cols, drop = FALSE) + geom_density(size = 1.5) + geom_point(data = prtb_score, aes(x = .data[["pvec"]], y = .data[["y.jitter"]]), size = 0.1) + theme(axis.text = element_text(size = 18), axis.title = element_text(size = 20)) + ylab("Cell density") + xlab("perturbation score") + theme(legend.key.size = unit(1, "cm"), legend.text = element_text(colour = "black", size = 14), legend.title = element_blank(), plot.title = element_text(size = 16, face = "bold"))+ facet_wrap(vars(split)) } else{ p2 <- p + scale_color_manual(values = cols, drop = FALSE) + geom_density(size = 1.5) + geom_point(data = prtb_score, aes(x = .data[["pvec"]], y = .data[["y.jitter"]]), size = 0.1) + theme(axis.text = element_text(size = 18), axis.title = element_text(size = 20)) + ylab("Cell density") + xlab("perturbation score") + theme(legend.key.size = unit(1, "cm"), legend.text = element_text(colour = "black", size = 14), legend.title = element_blank(), plot.title = element_text(size = 16, face = "bold")) } } else { cols <- setNames( object = c("grey49", "grey79", col), nm = c(gd, paste0(target.gene.ident, " NP"), paste(target.gene.ident, prtb.type, sep = " ")) ) #add mixscape identities prtb_score$mix <- object[[mixscape.class]][prtb_score$cell.bc,] p <- ggplot(data = prtb_score, aes(x = .data[["pvec"]], color = .data[["mix"]])) + geom_density() + theme_classic() top_r <- ggplot_build(p)$layout$panel_params[[1]]$y.range[2] prtb_score$y.jitter <- prtb_score$pvec gd2 <- setdiff( x = unique(x = prtb_score[, "mix"]), y = c(paste0(target.gene.ident, " NP"), paste(target.gene.ident, prtb.type, sep = " ")) ) prtb_score$y.jitter[prtb_score[, "mix"] == gd2] <- runif( n = prtb_score$y.jitter[prtb_score[, "mix"] == gd2], min = 0.001, max = top_r / 10 ) prtb_score$y.jitter[prtb_score$mix == paste(target.gene.ident, prtb.type, sep = " ")] <- runif( n = prtb_score$y.jitter[prtb_score[, "mix"] == paste(target.gene.ident, prtb.type, sep = " ")], min = -top_r / 10, max = 0 ) prtb_score$y.jitter[prtb_score$mix == paste0(target.gene.ident, " NP")] <- runif( n = prtb_score$y.jitter[prtb_score[, "mix"] == paste0(target.gene.ident, " NP")], min = -top_r / 10, max = 0 ) prtb_score[, "mix"] <- as.factor(x = prtb_score[,"mix"]) if(is.null(split.by) == FALSE){ prtb_score$split <- as.character(object[[split.by]][prtb_score$cell.bc,1]) p2 <- ggplot(data = prtb_score, aes(x = .data[["pvec"]], color = .data[["mix"]])) + scale_color_manual(values = cols, drop = FALSE) + geom_density(size = 1.5) + geom_point(aes(x = .data[["pvec"]], y = .data[["y.jitter"]]), size = 0.1) + theme_classic() + theme(axis.text = element_text(size = 18), axis.title = element_text(size = 20)) + ylab("Cell density") + xlab("perturbation score") + theme(legend.key.size = unit(1, "cm"), legend.text = element_text(colour ="black", size = 14), legend.title = element_blank(), plot.title = element_text(size = 16, face = "bold"))+ facet_wrap(vars(split)) } else{ p2 <- p + scale_color_manual(values = cols, drop = FALSE) + geom_density(size = 1.5) + geom_point(data = prtb_score, aes(x = .data[["pvec"]], y = .data[["y.jitter"]]), size = 0.1) + theme(axis.text = element_text(size = 18), axis.title = element_text(size = 20)) + ylab("Cell density") + xlab("perturbation score") + theme(legend.key.size = unit(1, "cm"), legend.text = element_text(colour ="black", size = 14), legend.title = element_blank(), plot.title = element_text(size = 16, face = "bold")) } } return(p2) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Function to define Normal distribution - # returns list with mu (mean) and sd (standard deviation) DefineNormalMixscape <- function(x) { mu <- mean(x) sd <- sd(x) return(list(mu = mu, sd = sd)) } # Get missing perturbation signature for missing features # # @param object Seurat object # @param assay Perturbation signature assay name # @param features vector of features to compute for # @param verbose display progress # @return Returns Seurat object with assay updated with new features # GetMissingPerturb <- function(object, assay, features, verbose = TRUE) { if (length(x = features) == 0) { return(object) } if (verbose) { message("Computing perturbation signature for missing features.") } command <- grep(pattern = "CalcPerturbSig", x = Command(object = object), value = TRUE) command.match <- sapply(X = command, FUN = function(x) { Command(object = object, command = x, value = "new.assay.name") == assay }) if (length(x = which(x = command.match)) > 1) { stop("Ambiguous command log.") } if(length(x = which(x = command.match)) == 0) { stop("Cannot find previously run CalcPertubSig command. Please make sure you've run CalcPerturbSig to create the provided assay.") } command <- names(x = command.match) if ("split.by" %in% names(x = slot(object = Command(object = object, command = command), name ="params"))) { split.by <- Command(object = object, command = command, value = "split.by") } else { split.by <- NULL } gd.class <- Command(object = object, command = command, value = "gd.class") nt.cell.class <- Command(object = object, command = command, value = "nt.cell.class") slot <- Command(object = object, command = command, value = "slot") assay.orig <- Command(object = object, command = command, value = "assay") old.idents <- Idents(object = object) if (! is.null(x = split.by)) { Idents(object = object) <- split.by } else { Idents(object = object) <- "rep1" } replicate <- unique(x = Idents(object = object)) all_diff <- list() all_nt_cells <- Cells(x = object)[which(x = object[[]][gd.class] == nt.cell.class)] features <- setdiff(x = features, y = rownames(x = object[[assay]])) for (r in replicate) { # isolate nt cells all_cells <- WhichCells(object = object, idents = r) nt_cells <- intersect(x = all_nt_cells, all_cells) # pull previously computed neighbors neighbors <- Tool(object = object, slot = command)[[make.names(names = paste0(assay, "_", r))]] diff <- PerturbDiff( object = object, assay = assay.orig, slot = slot, all_cells = all_cells, nt_cells = nt_cells, features = features, neighbors = neighbors, verbose = verbose ) all_diff[[r]] <- diff } all_diff <- do.call(what = cbind, args = all_diff) all_diff <- all_diff[, colnames(x = object[[assay]]), drop = FALSE] new.assay <- CreateAssayObject( data = rbind( GetAssayData(object = object[[assay]], layer = "data"), all_diff ), min.cells = 0, min.features = 0, check.matrix = FALSE ) new.assay <- SetAssayData( object = new.assay, layer = "scale.data", new.data = GetAssayData(object = object[[assay]], layer= "scale.data") ) object[[assay]] <- new.assay Idents(object = object) <- old.idents return(object) } # Helper function to compute the perturbation differences - enables reuse in # GetMissingPerturb # # @param object Seurat object # @param assay assay to use # @param slot slot to use # @param all_cells vector of cell names to compute difference for # @param nt_cells vector of nt cell names # @param features vector of features to compute for # @param neighbors Neighbor object containing indices of nearest NT cells # @param verbose display progress bar # @return returns matrix of perturbation differences # #' @importFrom matrixStats rowMeans2 #' @importFrom Matrix sparseMatrix colSums #' PerturbDiff <- function(object, assay, slot, all_cells, nt_cells, features, neighbors, verbose) { nt_data <- as.matrix(x = expm1(x = GetAssayData(object = object, assay = assay, layer= slot)[features, nt_cells, drop = FALSE])) mysapply <- ifelse(test = verbose, yes = pbsapply, no = sapply) # new_expr <- mysapply(X = all_cells, FUN = function(i) { # index <- Indices(object = neighbors)[i, ] # nt_cells20 <- nt_cells[index] # avg_nt <- rowMeans2(x = nt_data[, nt_cells20, drop = FALSE]) # avg_nt <- as.matrix(x = avg_nt) # colnames(x = avg_nt) <- i # return(avg_nt) # }) idx <- Indices(object = neighbors)[all_cells,] model.matrix <- sparseMatrix(i = as.vector(idx), j = rep(1:nrow(x = idx), times = ncol(x = idx)), x = 1, dims = c(length(x = nt_cells), nrow(x = idx))) model.matrix <- model.matrix/rep(colSums(model.matrix), each = nrow(x = model.matrix)) new_expr <- nt_data %*% model.matrix new_expr <- matrix(data = new_expr, nrow = length(x = features)) new_expr <- log1p(x = new_expr) rownames(x = new_expr) <- rownames(x = nt_data) colnames(x = new_expr) <- all_cells diff <- new_expr - as.matrix(GetAssayData(object = object, layer = slot, assay = assay)[features, colnames(x = new_expr), drop = FALSE]) return(diff) } # Helper function to project cells onto the perturbation vector # @param v1 vector 1 # @param v2 vector 2 # ProjectVec <- function(v1, v2) { return(as.vector(x = (v1 %*% v2) / (v2 %*% v2))) } # Function to find top DE genes that pass some p value cutoff between cells # with targeting and non-targeting gRNAs. # # @param object An object of class Seurat. # @param ident.1 Target gene class or cells to find DE genes for. # @param ident.2 Non-targetting class or cells # @param labels metadata column with target gene classification. # @param de.assay Name of Assay DE is performed on. # @param test.use Denotes which test to use. See all available tests on # FindMarkers documentation. # @param pval.cutoff P-value cut-off for selection of significantly DE genes. # @param logfc.threshold Limit testing to genes which show, on average, at # least X-fold difference (log-scale) between the two groups of cells. Default # is 0.25 Increasing logfc.threshold speeds up the function, but can miss # weaker signals. # @param verbose Display messages # @return # TopDEGenesMixscape <- function( object, ident.1, ident.2 = NULL, labels = 'gene', de.assay = "RNA", test.use = "wilcox", pval.cutoff = 5e-2, logfc.threshold = 0.25, verbose = TRUE ) { if (verbose) { message("Finding new perturbation gene set") } de.genes <- data.frame() tryCatch( expr = { de.genes <- FindMarkers( object = object, ident.1 = ident.1, ident.2 = ident.2, group.by = labels, assay = de.assay, test.use = test.use, logfc.threshold = logfc.threshold, verbose = verbose, min.pct = 0.1 ) de.genes <- de.genes[de.genes$p_val_adj < pval.cutoff, ] }, error = function(e) {} ) return(rownames(x = de.genes)) } Seurat/R/utilities.R0000644000176200001440000027071415117056271014074 0ustar liggesusers#' @include generics.R #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Add Azimuth Results #' #' Add mapping and prediction scores, UMAP embeddings, and imputed assay (if #' available) #' from Azimuth to an existing or new \code{\link[SeuratObject]{Seurat}} object #' #' @param object A \code{\link[SeuratObject]{Seurat}} object #' @param filename Path to Azimuth mapping scores file #' #' @return \code{object} with Azimuth results added #' #' @export #' @concept utilities #' #' @examples #' \dontrun{ #' object <- AddAzimuthResults(object, filename = "azimuth_results.Rds") #' } #' AddAzimuthResults <- function(object = NULL, filename) { if (is.null(x = filename)) { stop("No Azimuth results provided.") } azimuth_results <- readRDS(file = filename) if (!is.list(x = azimuth_results) || any(!(c('umap', 'pred.df') %in% names(x = azimuth_results)))) { stop("Expected following format for azimuth_results: `list(umap = , pred.df = [, impADT = ])`") } if (is.null(x = object)) { message("No existing Seurat object provided. Creating new one.") object <- CreateSeuratObject( counts = matrix( nrow = 1, ncol = nrow(x = azimuth_results$umap), dimnames = list( row.names = 'Dummy.feature', col.names = rownames(x = azimuth_results$umap)) ), assay = 'Dummy' ) } else { overlap.cells <- intersect( x = Cells(x = object), y = rownames(x = azimuth_results$umap) ) if (!(all(overlap.cells %in% Cells(x = object)))) { stop("Cells in object do not match cells in download") } else if (length(x = overlap.cells) < length(x = Cells(x = object))) { warning(paste0("Subsetting out ", length(x = Cells(x = object)) - length(x = overlap.cells), " cells that are absent in downloaded results (perhaps filtered by Azimuth)")) object <- subset(x = object, cells = overlap.cells) } } azimuth_results$pred.df$cell <- NULL object <- AddMetaData(object = object, metadata = azimuth_results$pred.df) object[['umap.proj']] <- azimuth_results$umap if ('impADT' %in% names(x = azimuth_results)) { object[['impADT']] <- azimuth_results$impADT if ('Dummy' %in% Assays(object = object)) { DefaultAssay(object = object) <- 'impADT' object[['Dummy']] <- NULL } } return(object) } #' Add Azimuth Scores #' #' Add mapping and prediction scores from Azimuth to a #' \code{\link[SeuratObject]{Seurat}} object #' #' @param object A \code{\link[SeuratObject]{Seurat}} object #' @param filename Path to Azimuth mapping scores file #' #' @return \code{object} with the mapping scores added #' #' @keywords internal #' #' @examples #' \dontrun{ #' object <- AddAzimuthScores(object, filename = "azimuth_pred.tsv") #' } #' AddAzimuthScores <- function(object, filename) { if (!file.exists(filename)) { stop("Cannot find Azimuth scores file ", filename, call. = FALSE) } object <- AddMetaData( object = object, metadata = read.delim(file = filename, row.names = 1) ) return(object) } #' Calculate module scores for feature expression programs in single cells #' #' Calculate the average expression levels of each program (cluster) on single #' cell level, subtracted by the aggregated expression of control feature sets. #' All analyzed features are binned based on averaged expression, and the #' control features are randomly selected from each bin. #' #' @param object Seurat object #' @param features A list of vectors of features for expression programs; each #' entry should be a vector of feature names #' @param pool List of features to check expression levels against, defaults to #' \code{rownames(x = object)} #' @param nbin Number of bins of aggregate expression levels for all #' analyzed features #' @param ctrl Number of control features selected from the same bin per #' analyzed feature #' @param k Use feature clusters returned from DoKMeans #' @param assay Name of assay to use #' @param name Name for the expression programs; will append a number to the #' end for each entry in \code{features} (eg. if \code{features} has three #' programs, the results will be stored as \code{name1}, \code{name2}, #' \code{name3}, respectively) #' @param seed Set a random seed. If NULL, seed is not set. #' @param search Search for symbol synonyms for features in \code{features} that #' don't match features in \code{object}? Searches the HGNC's gene names #' database; see \code{\link{UpdateSymbolList}} for more details #' @param slot Slot to calculate score values off of. Defaults to data slot (i.e log-normalized counts) #' @param ... Extra parameters passed to \code{\link{UpdateSymbolList}} #' #' @return Returns a Seurat object with module scores added to object meta data; #' each module is stored as \code{name#} for each module program present in #' \code{features} #' #' @references Tirosh et al, Science (2016) #' #' @export #' @concept utilities #' @rdname AddModuleScore #' @method AddModuleScore Seurat #' #' @examples #' \dontrun{ #' data("pbmc_small") #' cd_features <- list(c( #' 'CD79B', #' 'CD79A', #' 'CD19', #' 'CD180', #' 'CD200', #' 'CD3D', #' 'CD2', #' 'CD3E', #' 'CD7', #' 'CD8A', #' 'CD14', #' 'CD1C', #' 'CD68', #' 'CD9', #' 'CD247' #' )) #' pbmc_small <- AddModuleScore( #' object = pbmc_small, #' features = cd_features, #' ctrl = 5, #' name = 'CD_Features' #' ) #' head(x = pbmc_small[]) #' } #' AddModuleScore.Seurat <- function( object, features, pool = NULL, nbin = 24, ctrl = 100, k = FALSE, assay = NULL, name = 'Cluster', seed = 1, search = FALSE, slot = 'data', ... ) { if (!is.null(x = seed)) { set.seed(seed = seed) } assay.old <- DefaultAssay(object = object) assay <- assay %||% assay.old DefaultAssay(object = object) <- assay features.scores.use <- AddModuleScore(object = object[[assay]], features = features, kmeans.obj = object@kmeans.obj, pool = pool, nbin = nbin, ctrl = ctrl, k = k, name = name, seed = seed, search = search, slot = slot, ...) object[[colnames(x = features.scores.use)]] <- features.scores.use CheckGC() DefaultAssay(object = object) <- assay.old return(object) } #' @export #' @concept utilities #' @rdname AddModuleScore #' @method AddModuleScore StdAssay #' #' @references Tirosh et al, Science (2016) #' AddModuleScore.StdAssay <- function( object, features, kmeans.obj, pool = NULL, nbin = 24, ctrl = 100, k = FALSE, name = 'Cluster', seed = 1, search = FALSE, slot = 'data', ... ) { layer_names <- Layers(object, search = slot) input_list <- lapply( layer_names, function(layer_name) { layer_data <- LayerData(object, layer = layer_name) layer_object <- CreateAssayObject(layer_data) return (layer_object) } ) output_list <- lapply( input_list, function(input) { AddModuleScore(object = input, features = features, kmeans.obj = kmeans.obj, pool = pool, nbin = nbin, ctrl = ctrl, k = k, name = name, seed = seed, search = search, slot = slot, ...) } ) features.scores.use <- do.call(rbind,output_list) return(features.scores.use) } #' #' @param kmeans.obj A \code{DoKMeans} output used to define feature clusters #' when \code{k = TRUE}; ignored if \code{k = FALSE}. #' @export #' @concept utilities #' @rdname AddModuleScore #' @method AddModuleScore Assay #' #' @importFrom ggplot2 cut_number #' AddModuleScore.Assay <- function( object, features, kmeans.obj, pool = NULL, nbin = 24, ctrl = 100, k = FALSE, name = 'Cluster', seed = 1, search = FALSE, slot = 'data', ... ) { assay.data <- GetAssayData(object = object, layer = slot) features.old <- features if (k) { .NotYetUsed(arg = 'k') features <- list() for (i in as.numeric(x = names(x = table(kmeans.obj[[1]]$cluster)))) { features[[i]] <- names(x = which(x = kmeans.obj[[1]]$cluster == i)) } cluster.length <- length(x = features) } else { if (is.null(x = features)) { stop("Missing input feature list") } features <- lapply( X = features, FUN = function(x) { missing.features <- setdiff(x = x, y = rownames(x = object)) if (length(x = missing.features) > 0) { warning( "The following features are not present in the object: ", paste(missing.features, collapse = ", "), ifelse( test = search, yes = ", attempting to find updated synonyms", no = ", not searching for symbol synonyms" ), call. = FALSE, immediate. = TRUE ) if (search) { tryCatch( expr = { updated.features <- UpdateSymbolList(symbols = missing.features, ...) names(x = updated.features) <- missing.features for (miss in names(x = updated.features)) { index <- which(x == miss) x[index] <- updated.features[miss] } }, error = function(...) { warning( "Could not reach HGNC's gene names database", call. = FALSE, immediate. = TRUE ) } ) missing.features <- setdiff(x = x, y = rownames(x = object)) if (length(x = missing.features) > 0) { warning( "The following features are still not present in the object: ", paste(missing.features, collapse = ", "), call. = FALSE, immediate. = TRUE ) } } } return(intersect(x = x, y = rownames(x = object))) } ) cluster.length <- length(x = features) } if (!all(LengthCheck(values = features))) { warning(paste( 'Could not find enough features in the object from the following feature lists:', paste(names(x = which(x = !LengthCheck(values = features)))), 'Attempting to match case...' )) features <- lapply( X = features.old, FUN = CaseMatch, match = rownames(x = object) ) } if (!all(LengthCheck(values = features))) { stop(paste( 'The following feature lists do not have enough features present in the object:', paste(names(x = which(x = !LengthCheck(values = features)))), 'exiting...' )) } pool <- pool %||% rownames(x = object) data.avg <- Matrix::rowMeans(x = assay.data[pool, ]) data.avg <- data.avg[order(data.avg)] data.cut <- cut_number(x = data.avg + rnorm(n = length(data.avg))/1e30, n = nbin, labels = FALSE, right = FALSE) #data.cut <- as.numeric(x = Hmisc::cut2(x = data.avg, m = round(x = length(x = data.avg) / (nbin + 1)))) names(x = data.cut) <- names(x = data.avg) ctrl.use <- vector(mode = "list", length = cluster.length) for (i in 1:cluster.length) { features.use <- features[[i]] for (j in 1:length(x = features.use)) { ctrl.use[[i]] <- c( ctrl.use[[i]], names(x = sample( x = data.cut[which(x = data.cut == data.cut[features.use[j]])], size = ctrl, replace = FALSE )) ) } } ctrl.use <- lapply(X = ctrl.use, FUN = unique) ctrl.scores <- matrix( data = numeric(length = 1L), nrow = length(x = ctrl.use), ncol = ncol(x = object) ) for (i in 1:length(ctrl.use)) { features.use <- ctrl.use[[i]] ctrl.scores[i, ] <- Matrix::colMeans(x = assay.data[features.use, ]) } features.scores <- matrix( data = numeric(length = 1L), nrow = cluster.length, ncol = ncol(x = object) ) for (i in 1:cluster.length) { features.use <- features[[i]] data.use <- assay.data[features.use, , drop = FALSE] features.scores[i, ] <- Matrix::colMeans(x = data.use) } features.scores.use <- features.scores - ctrl.scores rownames(x = features.scores.use) <- paste0(name, 1:cluster.length) features.scores.use <- as.data.frame(x = t(x = features.scores.use)) rownames(x = features.scores.use) <- colnames(x = object) return(features.scores.use) } #' Aggregated feature expression by identity class #' #' Returns summed counts ("pseudobulk") for each identity class. #' #' If \code{return.seurat = TRUE}, aggregated values are placed in the 'counts' #' layer of the returned object. The data is then normalized by running \code{\link{NormalizeData}} #' on the aggregated counts. \code{\link{ScaleData}} is then run on the default assay #' before returning the object. #' #' @param object Seurat object #' @param assays Which assays to use. Default is all assays #' @param features Features to analyze. Default is all features in the assay #' @param return.seurat Whether to return the data as a Seurat object. Default is FALSE #' @param group.by Category (or vector of categories) for grouping (e.g, ident, replicate, celltype); 'ident' by default #' To use multiple categories, specify a vector, such as c('ident', 'replicate', 'celltype') #' @param add.ident (Deprecated). Place an additional label on each cell prior to pseudobulking #' @param normalization.method Method for normalization, see \code{\link{NormalizeData}} #' @param scale.factor Scale factor for normalization, see \code{\link{NormalizeData}} #' @param margin Margin to perform CLR normalization, see \code{\link{NormalizeData}} #' @param verbose Print messages and show progress bar #' @param ... Arguments to be passed to methods such as \code{\link{CreateSeuratObject}} #' #' @return Returns a matrix with genes as rows, identity classes as columns. #' If return.seurat is TRUE, returns an object of class \code{\link{Seurat}}. #' @export #' @concept utilities #' #' @examples #' \dontrun{ #' data("pbmc_small") #' head(AggregateExpression(object = pbmc_small)$RNA) #' head(AggregateExpression(object = pbmc_small, group.by = c('ident', 'groups'))$RNA) #' } #' AggregateExpression <- function( object, assays = NULL, features = NULL, return.seurat = FALSE, group.by = 'ident', add.ident = NULL, normalization.method = "LogNormalize", scale.factor = 10000, margin = 1, verbose = TRUE, ... ) { return( PseudobulkExpression( object = object, assays = assays, features = features, return.seurat = return.seurat, group.by = group.by, add.ident = add.ident, layer = 'counts', method = 'aggregate', normalization.method = normalization.method, scale.factor = scale.factor, margin = margin, verbose = verbose, ... ) ) } #' Averaged feature expression by identity class #' #' Returns averaged expression values for each identity class. #' #' If layer is set to 'data', this function assumes that the data has been log #' normalized and therefore feature values are exponentiated prior to averaging #' so that averaging is done in non-log space. Otherwise, if layer is set to #' either 'counts' or 'scale.data', no exponentiation is performed prior to averaging. #' If \code{return.seurat = TRUE} and layer is not 'scale.data', averaged values #' are placed in the 'counts' layer of the returned object and 'log1p' #' is run on the averaged counts and placed in the 'data' layer \code{\link{ScaleData}} #' is then run on the default assay before returning the object. #' If \code{return.seurat = TRUE} and layer is 'scale.data', the 'counts' layer contains #' average counts and 'scale.data' is set to the averaged values of 'scale.data'. #' #' @param object Seurat object #' @param assays Which assays to use. Default is all assays #' @param features Features to analyze. Default is all features in the assay #' @param return.seurat Whether to return the data as a Seurat object. Default is FALSE #' @param group.by Category (or vector of categories) for grouping (e.g, ident, replicate, celltype); 'ident' by default #' To use multiple categories, specify a vector, such as c('ident', 'replicate', 'celltype') #' @param add.ident (Deprecated). Place an additional label on each cell prior to pseudobulking #' @param layer Layer(s) to use; if multiple layers are given, assumed to follow #' the order of 'assays' (if specified) or object's assays #' @param slot (Deprecated). Slots(s) to use #' @param verbose Print messages and show progress bar #' @param ... Arguments to be passed to methods such as \code{\link{CreateSeuratObject}} #' #' @return Returns a matrix with genes as rows, identity classes as columns. #' If return.seurat is TRUE, returns an object of class \code{\link{Seurat}}. #' @export #' @concept utilities #' @importFrom SeuratObject .FilterObjects #' #' @examples #' data("pbmc_small") #' head(AverageExpression(object = pbmc_small)$RNA) #' head(AverageExpression(object = pbmc_small, group.by = c('ident', 'groups'))$RNA) #' AverageExpression <- function( object, assays = NULL, features = NULL, return.seurat = FALSE, group.by = 'ident', add.ident = NULL, layer = 'data', slot = deprecated(), verbose = TRUE, ... ) { return( PseudobulkExpression( object = object, assays = assays, features = features, return.seurat = return.seurat, group.by = group.by, add.ident = add.ident, layer = layer, slot = slot, method = 'average', verbose = verbose, ... ) ) } #' Match the case of character vectors #' #' @param search A vector of search terms #' @param match A vector of characters whose case should be matched #' #' @return Values from search present in match with the case of match #' #' @export #' @concept utilities #' #' @examples #' data("pbmc_small") #' cd_genes <- c('Cd79b', 'Cd19', 'Cd200') #' CaseMatch(search = cd_genes, match = rownames(x = pbmc_small)) #' CaseMatch <- function(search, match) { search.match <- sapply( X = search, FUN = function(s) { return(grep( pattern = paste0('^', s, '$'), x = match, ignore.case = TRUE, perl = TRUE, value = TRUE )) } ) return(unlist(x = search.match)) } #' Score cell cycle phases #' #' @param object A Seurat object #' @param s.features A vector of features associated with S phase #' @param g2m.features A vector of features associated with G2M phase #' @param ctrl Number of control features selected from the same bin per #' analyzed feature supplied to \code{\link{AddModuleScore}}. #' Defaults to value equivalent to minimum number of features #' present in 's.features' and 'g2m.features'. #' @param set.ident If true, sets identity to phase assignments #' Stashes old identities in 'old.ident' #' @param ... Arguments to be passed to \code{\link{AddModuleScore}} #' #' @return A Seurat object with the following columns added to object meta data: S.Score, G2M.Score, and Phase #' #' @seealso \code{AddModuleScore} #' #' @export #' @concept utilities #' #' @examples #' \dontrun{ #' data("pbmc_small") #' # pbmc_small doesn't have any cell-cycle genes #' # To run CellCycleScoring, please use a dataset with cell-cycle genes #' # An example is available at http://satijalab.org/seurat/cell_cycle_vignette.html #' pbmc_small <- CellCycleScoring( #' object = pbmc_small, #' g2m.features = cc.genes$g2m.genes, #' s.features = cc.genes$s.genes #' ) #' head(x = pbmc_small@meta.data) #' } #' CellCycleScoring <- function( object, s.features, g2m.features, ctrl = NULL, set.ident = FALSE, ... ) { name <- 'Cell.Cycle' features <- list('S.Score' = s.features, 'G2M.Score' = g2m.features) if (is.null(x = ctrl)) { ctrl <- min(vapply(X = features, FUN = length, FUN.VALUE = numeric(length = 1))) } object.cc <- AddModuleScore( object = object, features = features, name = name, ctrl = ctrl, ... ) cc.columns <- grep(pattern = name, x = colnames(x = object.cc[[]]), value = TRUE) cc.scores <- object.cc[[cc.columns]] rm(object.cc) CheckGC() assignments <- apply( X = cc.scores, MARGIN = 1, FUN = function(scores, first = 'S', second = 'G2M', null = 'G1') { if (all(scores < 0)) { return(null) } else { if (length(which(x = scores == max(scores))) > 1) { return('Undecided') } else { return(c(first, second)[which(x = scores == max(scores))]) } } } ) cc.scores <- merge(x = cc.scores, y = data.frame(assignments), by = 0) colnames(x = cc.scores) <- c('rownames', 'S.Score', 'G2M.Score', 'Phase') rownames(x = cc.scores) <- cc.scores$rownames cc.scores <- cc.scores[, c('S.Score', 'G2M.Score', 'Phase')] object[[colnames(x = cc.scores)]] <- cc.scores if (set.ident) { object[['old.ident']] <- Idents(object = object) Idents(object = object) <- 'Phase' } return(object) } #' Slim down a multi-species expression matrix, when only one species is primarily of interenst. #' #' Valuable for CITE-seq analyses, where we typically spike in rare populations of 'negative control' cells from a different species. #' #' @param object A UMI count matrix. Should contain rownames that start with #' the ensuing arguments prefix.1 or prefix.2 #' @param prefix The prefix denoting rownames for the species of interest. #' Default is "HUMAN_". These rownames will have this prefix removed in the returned matrix. #' @param controls The prefix denoting rownames for the species of 'negative #' control' cells. Default is "MOUSE_". #' @param ncontrols How many of the most highly expressed (average) negative #' control features (by default, 100 mouse genes), should be kept? All other #' rownames starting with prefix.2 are discarded. #' #' @return A UMI count matrix. Rownames that started with \code{prefix} have this #' prefix discarded. For rownames starting with \code{controls}, only the #' \code{ncontrols} most highly expressed features are kept, and the #' prefix is kept. All other rows are retained. #' #' @importFrom utils head #' @importFrom Matrix rowSums #' #' @export #' @concept utilities #' #' @examples #' \dontrun{ #' cbmc.rna.collapsed <- CollapseSpeciesExpressionMatrix(cbmc.rna) #' } #' CollapseSpeciesExpressionMatrix <- function( object, prefix = "HUMAN_", controls = "MOUSE_", ncontrols = 100 ) { features <- grep(pattern = prefix, x = rownames(x = object), value = TRUE) controls <- grep(pattern = controls, x = rownames(x = object), value = TRUE) others <- setdiff(x = rownames(x = object), y = c(features, controls)) controls <- rowSums(x = object[controls, ]) controls <- names(x = head( x = sort(x = controls, decreasing = TRUE), n = ncontrols )) object <- object[c(features, controls, others), ] rownames(x = object) <- gsub( pattern = prefix, replacement = '', x = rownames(x = object) ) return(object) } # Create an Annoy index # # @note Function exists because it's not exported from \pkg{uwot} # # @param name Distance metric name # @param ndim Number of dimensions # # @return An nn index object # #' @importFrom methods new #' @importFrom RcppAnnoy AnnoyAngular AnnoyManhattan AnnoyEuclidean AnnoyHamming # CreateAnn <- function(name, ndim) { return(switch( EXPR = name, cosine = new(Class = AnnoyAngular, ndim), manhattan = new(Class = AnnoyManhattan, ndim), euclidean = new(Class = AnnoyEuclidean, ndim), hamming = new(Class = AnnoyHamming, ndim), stop("BUG: unknown Annoy metric '", name, "'") )) } #' Run a custom distance function on an input data matrix #' #' @author Jean Fan #' #' @param my.mat A matrix to calculate distance on #' @param my.function A function to calculate distance #' @param ... Extra parameters to my.function #' #' @return A distance matrix #' #' @importFrom stats as.dist #' #' @export #' @concept utilities #' #' @examples #' data("pbmc_small") #' # Define custom distance matrix #' manhattan.distance <- function(x, y) return(sum(abs(x-y))) #' #' input.data <- GetAssayData(pbmc_small, assay.type = "RNA", layer = "scale.data") #' cell.manhattan.dist <- CustomDistance(input.data, manhattan.distance) #' CustomDistance <- function(my.mat, my.function, ...) { CheckDots(..., fxns = my.function) n <- ncol(x = my.mat) mat <- matrix(data = 0, ncol = n, nrow = n) colnames(x = mat) <- rownames(x = mat) <- colnames(x = my.mat) for (i in 1:nrow(x = mat)) { for (j in 1:ncol(x = mat)) { mat[i,j] <- my.function(my.mat[, i], my.mat[, j], ...) } } return(as.dist(m = mat)) } #' Calculate the mean of logged values #' #' Calculate mean of logged values in non-log space (return answer in log-space) #' #' @param x A vector of values #' @param ... Other arguments (not used) #' #' @return Returns the mean in log-space #' #' @export #' @concept utilities #' #' @examples #' ExpMean(x = c(1, 2, 3)) #' ExpMean <- function(x, ...) { if (inherits(x = x, what = 'AnyMatrix')) { return(apply(X = x, FUN = function(i) {log(x = mean(x = exp(x = i) - 1) + 1)}, MARGIN = 1)) } else { return(log(x = mean(x = exp(x = x) - 1) + 1)) } } #' Calculate the standard deviation of logged values #' #' Calculate SD of logged values in non-log space (return answer in log-space) #' #' @param x A vector of values #' #' @return Returns the standard deviation in log-space #' #' @importFrom stats sd #' #' @export #' @concept utilities #' #' @examples #' ExpSD(x = c(1, 2, 3)) #' ExpSD <- function(x) { return(log1p(x = sd(x = expm1(x = x)))) } #' Calculate the variance of logged values #' #' Calculate variance of logged values in non-log space (return answer in #' log-space) #' #' @param x A vector of values #' #' @return Returns the variance in log-space #' #' @importFrom stats var #' #' @export #' @concept utilities #' #' @examples #' ExpVar(x = c(1, 2, 3)) #' ExpVar <- function(x) { return(log1p(x = var(x = expm1(x = x)))) } #' Scale and/or center matrix rowwise #' #' Performs row scaling and/or centering. Equivalent to using t(scale(t(mat))) #' in R except in the case of NA values. #' #' @param mat A matrix #' @param center a logical value indicating whether to center the rows #' @param scale a logical value indicating whether to scale the rows #' @param scale_max clip all values greater than scale_max to scale_max. Don't #' clip if Inf. #' @return Returns the center/scaled matrix #' #' @importFrom matrixStats rowMeans2 rowSds rowSums2 #' #' @export #' @concept utilities #' FastRowScale <- function( mat, center = TRUE, scale = TRUE, scale_max = 10 ) { # inspired by https://www.r-bloggers.com/a-faster-scale-function/ if (center) { rm <- rowMeans2(x = mat, na.rm = TRUE) } if (scale) { if (center) { rsd <- rowSds(mat, center = rm) } else { rsd <- sqrt(x = rowSums2(x = mat^2)/(ncol(x = mat) - 1)) } } if (center) { mat <- mat - rm } if (scale) { mat <- mat / rsd } if (scale_max != Inf) { mat[mat > scale_max] <- scale_max } return(mat) } #' Get updated synonyms for gene symbols #' #' Find current gene symbols based on old or alias symbols using the gene #' names database from the HUGO Gene Nomenclature Committee (HGNC) #' #' @details For each symbol passed, we query the HGNC gene names database for #' current symbols that have the provided symbol as either an alias #' (\code{alias_symbol}) or old (\code{prev_symbol}) symbol. All other queries #' are \strong{not} supported. #' #' @note This function requires internet access #' #' @param symbols A vector of gene symbols #' @param timeout Time to wait before canceling query in seconds #' @param several.ok Allow several current gene symbols for each #' provided symbol #' @param search.types Type of query to perform: #' \describe{ #' \item{\dQuote{\code{alias_symbol}}}{Find alternate symbols for the genes #' described by \code{symbols}} #' \item{\dQuote{\code{prev_symbol}}}{Find new new symbols for the genes #' described by \code{symbols}} #' } #' This parameter accepts multiple options and short-hand options #' (eg. \dQuote{\code{prev}} for \dQuote{\code{prev_symbol}}) #' @param verbose Show a progress bar depicting search progress #' @param ... Extra parameters passed to \code{\link[httr]{GET}} #' #' @return \code{GeneSymbolThesarus}:, if \code{several.ok}, a named list #' where each entry is the current symbol found for each symbol provided and #' the names are the provided symbols. Otherwise, a named vector with the #' same information. #' #' @source \url{https://www.genenames.org/} \url{https://www.genenames.org/help/rest/} #' #' @importFrom utils txtProgressBar setTxtProgressBar #' @importFrom httr GET accept_json timeout status_code content #' #' @rdname UpdateSymbolList #' @name UpdateSymbolList #' #' @export #' @concept utilities #' #' @seealso \code{\link[httr]{GET}} #' #' @examples #' \dontrun{ #' GeneSybmolThesarus(symbols = c("FAM64A")) #' } #' GeneSymbolThesarus <- function( symbols, timeout = 10, several.ok = FALSE, search.types = c('alias_symbol', 'prev_symbol'), verbose = TRUE, ... ) { db.url <- 'http://rest.genenames.org/fetch' # search.types <- c('alias_symbol', 'prev_symbol') search.types <- match.arg(arg = search.types, several.ok = TRUE) synonyms <- vector(mode = 'list', length = length(x = symbols)) not.found <- vector(mode = 'logical', length = length(x = symbols)) multiple.found <- vector(mode = 'logical', length = length(x = symbols)) names(x = multiple.found) <- names(x = not.found) <- names(x = synonyms) <- symbols if (verbose) { pb <- txtProgressBar(max = length(x = symbols), style = 3, file = stderr()) } for (symbol in symbols) { sym.syn <- character() for (type in search.types) { response <- GET( url = paste(db.url, type, symbol, sep = '/'), config = c(accept_json(), timeout(seconds = timeout)), ... ) if (!identical(x = status_code(x = response), y = 200L)) { next } response <- content(x = response) if (response$response$numFound != 1) { if (response$response$numFound > 1) { warning( "Multiple hits found for ", symbol, " as ", type, ", skipping", call. = FALSE, immediate. = TRUE ) } next } sym.syn <- c(sym.syn, response$response$docs[[1]]$symbol) } not.found[symbol] <- length(x = sym.syn) < 1 multiple.found[symbol] <- length(x = sym.syn) > 1 if (length(x = sym.syn) == 1 || (length(x = sym.syn) > 1 && several.ok)) { synonyms[[symbol]] <- sym.syn } if (verbose) { setTxtProgressBar(pb = pb, value = pb$getVal() + 1) } } if (verbose) { close(con = pb) } if (sum(not.found) > 0) { warning( "The following symbols had no synonyms: ", paste(names(x = which(x = not.found)), collapse = ', '), call. = FALSE, immediate. = TRUE ) } if (sum(multiple.found) > 0) { msg <- paste( "The following symbols had multiple synonyms:", paste(names(x = which(x = multiple.found)), sep = ', ') ) if (several.ok) { message(msg) message("Including anyways") } else { warning(msg, call. = FALSE, immediate. = TRUE) } } synonyms <- Filter(f = Negate(f = is.null), x = synonyms) if (!several.ok) { synonyms <- unlist(x = synonyms) } return(synonyms) } #' Compute the correlation of features broken down by groups with another #' covariate #' #' @param object Seurat object #' @param assay Assay to pull the data from #' @param slot Slot in the assay to pull feature expression data from (counts, #' data, or scale.data) #' @param var Variable with which to correlate the features #' @param group.assay Compute the gene groups based off the data in this assay. #' @param min.cells Only compute for genes in at least this many cells #' @param ngroups Number of groups to split into #' @param do.plot Display the group correlation boxplot (via #' \code{GroupCorrelationPlot}) #' #' @return A Seurat object with the correlation stored in metafeatures #' #' @export #' @concept utilities #' GroupCorrelation <- function( object, assay = NULL, slot = "scale.data", var = NULL, group.assay = NULL, min.cells = 5, ngroups = 6, do.plot = TRUE ) { assay <- assay %||% DefaultAssay(object = object) group.assay <- group.assay %||% assay var <- var %||% paste0("nCount_", group.assay) gene.grp <- GetFeatureGroups( object = object, assay = group.assay, min.cells = min.cells, ngroups = ngroups ) data <- as.matrix(x = GetAssayData(object = object[[assay]], layer = slot)) data <- data[rowMeans(x = data) != 0, ] grp.cors <- apply( X = data, MARGIN = 1, FUN = function(x) { cor(x = x, y = object[[var]]) } ) grp.cors <- grp.cors[names(x = gene.grp)] grp.cors <- as.data.frame(x = grp.cors[which(x = !is.na(x = grp.cors))]) grp.cors$gene_grp <- gene.grp[rownames(x = grp.cors)] colnames(x = grp.cors) <- c(paste0(var, "_cor"), "feature.grp") object[[assay]] <- AddMetaData(object[[assay]], grp.cors) if (isTRUE(x = do.plot)) { print(GroupCorrelationPlot( object = object, assay = assay, feature.group = "feature.grp", cor = paste0(var, "_cor") )) } return(object) } #' Load the Annoy index file #' #' @param object Neighbor object #' @param file Path to file with annoy index #' #' @return Returns the Neighbor object with the index stored #' @export #' @concept utilities #' LoadAnnoyIndex <- function(object, file){ metric <- slot(object = object, name = "alg.info")$metric ndim <- slot(object = object, name = "alg.info")$ndim if (is.null(x = metric)) { stop("Provided Neighbor object wasn't generated with annoy") } annoy.idx <- CreateAnn(name = metric, ndim = ndim) annoy.idx$load(path.expand(path = file)) Index(object = object) <- annoy.idx return(object) } #' Calculate the variance to mean ratio of logged values #' #' Calculate the variance to mean ratio (VMR) in non-logspace (return answer in #' log-space) #' #' @param x A vector of values #' @param ... Other arguments (not used) #' #' @return Returns the VMR in log-space #' #' @importFrom stats var #' #' @export #' @concept utilities #' #' @examples #' LogVMR(x = c(1, 2, 3)) #' LogVMR <- function(x, ...) { if (inherits(x = x, what = 'AnyMatrix')) { return(apply(X = x, FUN = function(i) {log(x = var(x = exp(x = i) - 1) / mean(x = exp(x = i) - 1))}, MARGIN = 1)) } else { return(log(x = var(x = exp(x = x) - 1) / mean(x = exp(x = x) - 1))) } } #' Aggregate expression of multiple features into a single feature #' #' Calculates relative contribution of each feature to each cell #' for given set of features. #' #' @param object A Seurat object #' @param features List of features to aggregate #' @param meta.name Name of column in metadata to store metafeature #' @param cells List of cells to use (default all cells) #' @param assay Which assay to use #' @param slot Which slot to take data from (default data) #' #' @return Returns a \code{Seurat} object with metafeature stored in objct metadata #' #' @importFrom Matrix rowSums colMeans #' #' @export #' @concept utilities #' #' @examples #' data("pbmc_small") #' pbmc_small <- MetaFeature( #' object = pbmc_small, #' features = c("LTB", "EAF2"), #' meta.name = 'var.aggregate' #' ) #' head(pbmc_small[[]]) #' MetaFeature <- function( object, features, meta.name = 'metafeature', cells = NULL, assay = NULL, slot = 'data' ) { cells <- cells %||% colnames(x = object) assay <- assay %||% DefaultAssay(object = object) newmat <- GetAssayData(object = object, assay = assay, layer = slot) newmat <- newmat[features, cells] if (slot == 'scale.data') { newdata <- Matrix::colMeans(newmat) } else { rowtotals <- Matrix::rowSums(newmat) newmat <- newmat / rowtotals newdata <- Matrix::colMeans(newmat) } object[[meta.name]] <- newdata return(object) } #' Apply a ceiling and floor to all values in a matrix #' #' @param data Matrix or data frame #' @param min all values below this min value will be replaced with min #' @param max all values above this max value will be replaced with max #' @return Returns matrix after performing these floor and ceil operations #' @export #' @concept utilities #' #' @examples #' mat <- matrix(data = rbinom(n = 25, size = 20, prob = 0.2 ), nrow = 5) #' mat #' MinMax(data = mat, min = 4, max = 5) #' MinMax <- function(data, min, max) { data2 <- data data2[data2 > max] <- max data2[data2 < min] <- min return(data2) } #' Calculate the percentage of a vector above some threshold #' #' @param x Vector of values #' @param threshold Threshold to use when calculating percentage #' #' @return Returns the percentage of \code{x} values above the given threshold #' #' @export #' @concept utilities #' #' @examples #' set.seed(42) #' PercentAbove(sample(1:100, 10), 75) #' PercentAbove <- function(x, threshold) { return (sum(x > threshold, na.rm = T) / length(x)) } #' Calculate the percentage of all counts that belong to a given set of features #' #' This function enables you to easily calculate the percentage of all the counts belonging to a #' subset of the possible features for each cell. This is useful when trying to compute the percentage #' of transcripts that map to mitochondrial genes for example. The calculation here is simply the #' column sum of the matrix present in the counts slot for features belonging to the set divided by #' the column sum for all features times 100. #' #' @param object A Seurat object #' @param pattern A regex pattern to match features against #' @param features A defined feature set. If features provided, will ignore the pattern matching #' @param col.name Name in meta.data column to assign. If this is not null, returns a Seurat object #' with the proportion of the feature set stored in metadata. #' @param assay Assay to use #' #' @return Returns a vector with the proportion of the feature set or if md.name is set, returns a #' Seurat object with the proportion of the feature set stored in metadata. #' @importFrom Matrix colSums #' @export #' @concept utilities #' #' @examples #' data("pbmc_small") #' # Calculate the proportion of transcripts mapping to mitochondrial genes #' # NOTE: The pattern provided works for human gene names. You may need to adjust depending on your #' # system of interest #' pbmc_small[["percent.mt"]] <- PercentageFeatureSet(object = pbmc_small, pattern = "^MT-") #' PercentageFeatureSet <- function( object, pattern = NULL, features = NULL, col.name = NULL, assay = NULL ) { assay <- assay %||% DefaultAssay(object = object) if (!is.null(x = features)) { if (!is.null(x = pattern)) { warning( paste( "Both `features` and `pattern` were provided;", "`pattern` will be ignored." ) ) } available_features <- Features(object[[assay]]) missing_features <- setdiff(features, available_features) if (length(missing_features) > 0) { warning( paste( "The following features are not found in the", paste0("'", assay, "'"), "assay:", paste(paste0("'", missing_features, "'"), collapse = ", ") ) ) } } percent.featureset <- list() layers <- Layers(object = object, assay = assay, search = "counts") for (i in seq_along(along.with = layers)) { layer <- layers[i] features.layer <- features %||% grep( pattern = pattern, x = rownames(x = object[[assay]][layer]), value = TRUE) layer.data <- LayerData(object = object, assay = assay, layer = layer) features.layer <- intersect(features.layer, rownames(layer.data)) layer.sums <- colSums(x = layer.data[features.layer, , drop = FALSE]) layer.perc <- layer.sums / object[[]][colnames(layer.data), paste0("nCount_", assay)] * 100 percent.featureset[[i]] <- layer.perc } percent.featureset <- unlist(percent.featureset) if (!is.null(x = col.name)) { object <- AddMetaData(object = object, metadata = percent.featureset, col.name = col.name) return(object) } return(percent.featureset) } #' Pseudobulk feature expression by identity class #' #' Returns a representative expression value for each identity class #' #' @param object Seurat object #' @param method Whether to 'average' (default) or 'aggregate' expression levels #' @param assay The name of the passed assay - used primarily for warning/error messages #' @param category.matrix A matrix defining groupings for pseudobulk expression #' calculations; each column represents an identity class, and each row a sample #' @param features Features to analyze. Default is all features in the assay #' @param layer Layer(s) to user; if multiple are given, assumed to follow #' the order of 'assays' (if specified) or object's assays #' @param slot (Deprecated) See \code{layer} #' @param verbose Print messages and show progress bar #' @param ... Arguments to be passed to methods such as \code{\link{CreateSeuratObject}} # #' @return Returns a matrix with genes as rows, identity classes as columns. #' If return.seurat is TRUE, returns an object of class \code{\link{Seurat}}. #' @method PseudobulkExpression Assay #' @rdname PseudobulkExpression #' @export #' @concept utilities #' PseudobulkExpression.Assay <- function( object, assay, category.matrix, features = NULL, layer = 'data', slot = deprecated(), verbose = TRUE, ... ) { if (is_present(arg = slot)) { deprecate_soft( when = '5.0.0', what = 'GetAssayData(slot = )', with = 'GetAssayData(layer = )' ) layer <- slot } data.use <- GetAssayData( object = object, layer = layer ) features.to.avg <- features %||% rownames(x = data.use) if (IsMatrixEmpty(x = data.use)) { warning( "The ", layer, " layer for the ", assay, " assay is empty. Skipping assay.", immediate. = TRUE, call. = FALSE) return(NULL) } bad.features <- setdiff(x = features.to.avg, y = rownames(x = data.use)) if (length(x = bad.features) > 0) { warning( "The following ", length(x = bad.features), " features were not found in the ", assay, " assay: ", paste(bad.features, collapse = ", "), call. = FALSE, immediate. = TRUE) } features.assay <- intersect(x = features.to.avg, y = rownames(x = data.use)) if (length(x = features.assay) > 0) { data.use <- data.use[features.assay, ] } else { warning("None of the features specified were found in the ", assay, " assay.", call. = FALSE, immediate. = TRUE) return(NULL) } if (layer == 'data') { data.use <- expm1(x = data.use) if (any(data.use == Inf)) { warning("Exponentiation yielded infinite values. `data` may not be log-normed.") } } data.return <- data.use %*% category.matrix return(data.return) } #' @method PseudobulkExpression StdAssay #' @rdname PseudobulkExpression #' @export #' @concept utilities #' PseudobulkExpression.StdAssay <- function( object, assay, category.matrix, features = NULL, layer = 'data', slot = deprecated(), verbose = TRUE, ... ) { if (is_present(arg = slot)) { deprecate_soft( when = '5.0.0', what = 'GetAssayData(slot = )', with = 'GetAssayData(layer = )' ) layer <- slot } layers.set <- Layers(object = object, search = layer) features.to.avg <- features %||% rownames(x = object) bad.features <- setdiff(x = features.to.avg, y = rownames(x = object)) if (length(x = bad.features) > 0) { warning( "The following ", length(x = bad.features), " features were not found in the ", assay, " assay: ", paste(bad.features, collapse = ", "), call. = FALSE, immediate. = TRUE) } features.assay <- Reduce( f = intersect, x = c(list(features.to.avg), lapply(X = layers.set, FUN = function(l) rownames(object[l])) ) ) if (length(x = features.assay) == 0) { warning("None of the features specified were found in the ", assay, " assay.", call. = FALSE, immediate. = TRUE) return(NULL) } data.return <- as.sparse( x = matrix( data = 0, nrow = length(x = features.assay), ncol = ncol(x = category.matrix) ) ) for (i in seq_along(layers.set)) { data.i <- LayerData(object = object, layer = layers.set[i], features = features.assay ) if (layers.set[i] == "data") { data.use.i <- expm1(x = data.i) if (any(data.use.i == Inf)) { warning("Exponentiation yielded infinite values. `data` may not be log-normed.") } } else { data.use.i <- data.i } category.matrix.i <- category.matrix[colnames(x = data.i),] if (inherits(x = data.i, what = 'DelayedArray')) { stop("PseudobulkExpression does not support DelayedArray objects") } else { data.return.i <- as.sparse(x = data.use.i %*% category.matrix.i) } data.return <- data.return + data.return.i } return(data.return) } #' @param assays Which assays to use. Default is all assays #' @param return.seurat Whether to return the data as a Seurat object. Default is FALSE #' @param group.by Categories for grouping (e.g, "ident", "replicate", #' "celltype"); "ident" by default #' @param add.ident (Deprecated) See group.by #' @param method The method used for calculating pseudobulk expression; one of: #' "average" or "aggregate" #' @param normalization.method Method for normalization, see \code{\link{NormalizeData}} #' @param scale.factor Scale factor for normalization, see \code{\link{NormalizeData}} #' @param margin Margin to perform CLR normalization, see \code{\link{NormalizeData}} #' #' @method PseudobulkExpression Seurat #' @rdname PseudobulkExpression #' @export #' @concept utilities #' PseudobulkExpression.Seurat <- function( object, assays = NULL, features = NULL, return.seurat = FALSE, group.by = 'ident', add.ident = NULL, layer = 'data', slot = deprecated(), method = 'average', normalization.method = "LogNormalize", scale.factor = 10000, margin = 1, verbose = TRUE, ... ) { CheckDots(..., fxns = 'CreateSeuratObject') if (!is.null(x = add.ident)) { .Deprecated(msg = "'add.ident' is a deprecated argument. Please see documentation to see how to pass a vector to the 'group.by' argument to specify multiple grouping variables") group.by <- c('ident', add.ident) } if (!(method %in% c('average', 'aggregate'))) { stop("'method' must be either 'average' or 'aggregate'") } if (is_present(arg = slot)) { deprecate_soft( when = '5.0.0', what = 'AverageExpression(slot = )', with = 'AverageExpression(layer = )' ) layer <- slot } if (method == "average") { inform( message = "As of Seurat v5, we recommend using AggregateExpression to perform pseudo-bulk analysis.", .frequency = "once", .frequency_id = "AverageExpression" ) } object.assays <- .FilterObjects(object = object, classes.keep = c('Assay', 'Assay5')) assays <- assays %||% object.assays # `features` is expected to be a 2D array - one vector per assay # in the case the `features` a vector, duplicate it for each assay if (!inherits(features, what = "list")) { features <- rep(list(features), times = length(assays)) } if (!all(assays %in% object.assays)) { assays <- assays[assays %in% object.assays] if (length(x = assays) == 0) { stop("None of the requested assays are present in the object") } else { warning("Requested assays that do not exist in object. Proceeding with existing assays only.") } } if (length(x = layer) == 1) { layer <- rep_len(x = layer, length.out = length(x = assays)) } else if (length(x = layer) != length(x = assays)) { stop("Number of layers provided does not match number of assays") } data <- FetchData(object = object, vars = rev(x = group.by)) #only keep meta-data columns that are in object group.by <- intersect(group.by, colnames(data)) data <- data[which(rowSums(x = is.na(x = data)) == 0), , drop = F] if (nrow(x = data) < ncol(x = object)) { inform("Removing cells with NA for 1 or more grouping variables") object <- subset(x = object, cells = rownames(x = data)) } for (i in 1:ncol(x = data)) { data[, i] <- as.factor(x = data[, i]) } num.levels <- sapply( X = 1:ncol(x = data), FUN = function(i) { length(x = levels(x = data[, i])) } ) if (any(num.levels == 1)) { message( paste0( "The following grouping variables have 1 value and will be ignored: ", paste0(colnames(x = data)[which(num.levels <= 1)], collapse = ", ") ) ) group.by <- rev(colnames(x = data)[which(num.levels > 1)]) data <- data[, which(num.levels > 1), drop = F] } data.return <- list() for (i in 1:length(x = assays)) { data_sub <- data[intersect(rownames(data),Cells(object[[assays[i]]])),,drop=FALSE] category.matrix <- CreateCategoryMatrix(labels = data_sub, method = method) #check if column names are numeric col.names <- colnames(category.matrix) if (any(!(grepl("^[a-zA-Z]|^\\.[^0-9]", col.names)))) { col.names <- ifelse( !(grepl("^[a-zA-Z]|^\\.[^0-9]", col.names)), paste0("g", col.names), col.names ) colnames(category.matrix) <- col.names inform( message = paste0("First group.by variable `", group.by[1], "` starts with a number, appending `g` to ensure valid variable names"), .frequency = "regularly", .frequency_id = "PseudobulkExpression" ) } data.return[[assays[i]]] <- PseudobulkExpression( object = object[[assays[i]]], assay = assays[i], category.matrix = category.matrix, features = features[[i]], layer = layer[i], verbose = verbose, ... ) } if (return.seurat) { op <- options(Seurat.object.assay.version = "v5", Seurat.object.assay.calcn = FALSE) on.exit(expr = options(op), add = TRUE) if (layer[1] == 'scale.data') { na.matrix <- as.matrix(x = data.return[[1]]) na.matrix[1:length(x = na.matrix)] <- NA #sum up counts to make seurat object summed.counts <- PseudobulkExpression( object = object[[assays[1]]], assay = assays[1], category.matrix = category.matrix, features = features[[1]], layer = "counts" ) toRet <- CreateSeuratObject( counts = summed.counts, project = if (method == "average") "Average" else "Aggregate", assay = names(x = data.return)[1], ... ) LayerData( object = toRet, layer = "scale.data", assay = names(x = data.return)[i] ) <- data.return[[1]] } else { toRet <- CreateSeuratObject( counts = data.return[[1]], project = if (method == "average") "Average" else "Aggregate", assay = names(x = data.return)[1], ... ) if (method == "aggregate") { LayerData( object = toRet, layer = "data", assay = names(x = data.return)[1] ) <- NormalizeData( as.matrix(x = data.return[[1]]), normalization.method = normalization.method, scale.factor = scale.factor, margin = margin, verbose = verbose ) } else { LayerData(object = toRet, layer = "data", assay = names(x = data.return)[1] ) <- log1p(x = as.matrix(x = data.return[[1]])) } } #for multimodal data if (length(x = data.return) > 1) { for (i in 2:length(x = data.return)) { if (layer[i] == 'scale.data') { summed.counts <- PseudobulkExpression( object = object[[assays[i]]], assay = assays[i], category.matrix = category.matrix, features = features[[i]], layer = "counts" ) toRet[[names(x = data.return)[i]]] <- CreateAssayObject(counts = summed.counts) LayerData( object = toRet, layer = "scale.data", assay = names(x = data.return)[i] ) <- data.return[[i]] } else { toRet[[names(x = data.return)[i]]] <- CreateAssayObject( counts = data.return[[i]], check.matrix = FALSE ) if (method == "aggregate") { LayerData( object = toRet, layer = "data", assay = names(x = data.return)[i] ) <- NormalizeData( as.matrix(x = data.return[[i]]), normalization.method = normalization.method, scale.factor = scale.factor, margin = margin, verbose = verbose ) } else { LayerData( object = toRet, layer = "data", assay = names(x = data.return)[i] ) <- log1p(x = as.matrix(x = data.return[[i]])) } } } } if (DefaultAssay(object = object) %in% names(x = data.return)) { DefaultAssay(object = toRet) <- DefaultAssay(object = object) if (layer[which(DefaultAssay(object = object) %in% names(x = data.return))[1]] != 'scale.data') { toRet <- ScaleData(object = toRet, verbose = verbose) } } #add meta-data based on group.by variables cells <- Cells(toRet) for (i in 1:length(group.by)) { if (group.by[i] != "ident") { v <- sapply( strsplit(cells, "_"), function(x) {return(x[i])} ) names(v) <- cells toRet <- AddMetaData(toRet, metadata = v, col.name = group.by[i] ) } } #set idents to pseudobulk variables Idents(toRet) <- cells #make orig.ident variable #orig.ident = ident if group.by includes `ident` #if not, orig.ident is equal to pseudobulk cell names if(any(group.by == "ident")) { i = which(group.by == "ident") v <- sapply( strsplit(cells, "_"), function(x) {return(x[i])} ) names(v) <- cells toRet <- AddMetaData(toRet, metadata = v, col.name = "orig.ident" ) } else { toRet$orig.ident <- cells } return(toRet) } else { return(data.return) } } #' Regroup idents based on meta.data info #' #' For cells in each ident, set a new identity based on the most common value #' of a specified metadata column. #' #' @param object Seurat object #' @param metadata Name of metadata column #' @return A Seurat object with the active idents regrouped #' #' @export #' @concept utilities #' #' @examples #' data("pbmc_small") #' pbmc_small <- RegroupIdents(pbmc_small, metadata = "groups") #' RegroupIdents <- function(object, metadata) { for (ii in levels(x = object)) { ident.cells <- WhichCells(object = object, idents = ii) if (length(x = ident.cells) == 0) { next } new.ident <- names(x = which.max(x = table(object[[metadata]][ident.cells, ]))) if (is.null(x = new.ident)) { stop("Cluster ", ii, " contains only cells with NA values in the '", metadata, "' metadata column.") } Idents(object = object, cells = ident.cells) <- new.ident } return(object) } #' Save the Annoy index #' #' @param object A Neighbor object with the annoy index stored #' @param file Path to file to write index to #' #' @export #' @concept utilities #' SaveAnnoyIndex <- function( object, file ) { index <- Index(object = object) if (is.null(x = index)) { stop("Index for provided Neighbor object is NULL") } index$save(path.expand(path = file)) } #' Find the Quantile of Data #' #' Converts a quantile in character form to a number regarding some data. #' String form for a quantile is represented as a number prefixed with #' \dQuote{q}; for example, 10th quantile is \dQuote{q10} while 2nd quantile is #' \dQuote{q2}. Will only take a quantile of non-zero data values #' #' @param cutoff The cutoff to turn into a quantile #' @param data The data to turn find the quantile of #' #' @return The numerical representation of the quantile #' #' @importFrom stats quantile #' #' @export #' @concept utilities #' #' @examples #' set.seed(42) #' SetQuantile('q10', sample(1:100, 10)) #' SetQuantile <- function(cutoff, data) { if (grepl(pattern = '^q[0-9]{1,2}$', x = as.character(x = cutoff), perl = TRUE)) { this.quantile <- as.numeric(x = sub( pattern = 'q', replacement = '', x = as.character(x = cutoff) )) / 100 data <- unlist(x = data) data <- data[data > 0] cutoff <- quantile(x = data, probs = this.quantile) } return(as.numeric(x = cutoff)) } #' @rdname UpdateSymbolList #' #' @return \code{UpdateSymbolList}: \code{symbols} with updated symbols from #' HGNC's gene names database #' #' @export #' @concept utilities #' #' @examples #' \dontrun{ #' UpdateSymbolList(symbols = cc.genes$s.genes) #' } #' UpdateSymbolList <- function( symbols, timeout = 10, several.ok = FALSE, verbose = TRUE, ... ) { new.symbols <- suppressWarnings(expr = GeneSymbolThesarus( symbols = symbols, timeout = timeout, several.ok = several.ok, search.types = 'prev_symbol', verbose = verbose, ... )) if (length(x = new.symbols) < 1) { warning("No updated symbols found", call. = FALSE, immediate. = TRUE) } else { if (verbose) { message("Found updated symbols for ", length(x = new.symbols), " symbols") x <- sapply(X = new.symbols, FUN = paste, collapse = ', ') message(paste(names(x = x), x, sep = ' -> ', collapse = '\n')) } for (sym in names(x = new.symbols)) { index <- which(x = symbols == sym) symbols <- append( x = symbols[-index], values = new.symbols[[sym]], after = index - 1 ) } } return(symbols) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for R-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @inheritParams base::as.data.frame #' #' @return \code{as.data.frame.Matrix}: A data frame representation of the S4 Matrix #' #' @importFrom Matrix as.matrix #' #' @rdname as.sparse #' @concept utilities #' @export #' @method as.data.frame Matrix #' as.data.frame.Matrix <- function( x, row.names = NULL, optional = FALSE, ..., stringsAsFactors = getOption(x = "stringsAsFactors", default = FALSE) ) { return(as.data.frame( x = as.matrix(x = x), row.names = row.names, optional = optional, stringsAsFactors = stringsAsFactors, ... )) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Create Abbreviations #' #' @param x A character vector #' @param digits Include digits in the abbreviation #' #' @return Abbreviated versions of \code{x} #' #' @keywords internal #' #' @examples #' .Abbrv(c('HelloWorld, 'LetsGo3', 'tomato')) #' .Abbrv(c('HelloWorld, 'LetsGo3', 'tomato'), digits = FALSE) #' .Abbrv('Wow3', digits = FALSE) #' #' @noRd #' .Abbrv <- function(x, digits = TRUE) { pattern <- ifelse(test = isTRUE(x = digits), yes = '[A-Z0-9]+', no = '[A-Z]+') y <- vapply( X = regmatches(x = x, m = gregexec(pattern = pattern, text = x)), FUN = paste, FUN.VALUE = character(length = 1L), collapse = '' ) na <- nchar(x = y) <= 1L y[na] <- x[na] return(tolower(x = y)) } .AsList <- function(x) { x <- as.list(x = x) return(sapply( X = unique(x = names(x = x)), FUN = function(i) { return(unlist( x = x[which(x = names(x = x) == i)], recursive = FALSE, use.names = FALSE )) }, simplify = FALSE, USE.NAMES = TRUE )) } #' @importFrom ggplot2 cut_number #' .Cut <- function(min, max, n) { breaks <- levels(x = cut_number(x = c(min, max), n = n)) breaks <- gsub(pattern = '.*,', replacement = '', x = breaks) breaks <- gsub(pattern = ']$', replacement = '', x = breaks) as.numeric(x = breaks) } .FindE <- function(x) { x <- as.character(x = x) if (grepl(pattern = 'e', x = x)) { return(as.integer(x = gsub(pattern = '.*e', replacement = '', x = x))) } else if (grepl(pattern = '^0\\.', x = x)) { x <- unlist(x = strsplit( x = gsub(pattern = '.*\\.', replacement = '', x = x), split = '' )) idx <- which(x = x != '0') return(-idx) } stop("Invalid format") } #' @importFrom SeuratObject Boundaries #' .BoundariesByImage <- function(object, fov, boundaries) { if (!is.list(x = boundaries)) { if (is.null(x = names(x = boundaries))) { boundaries <- rep_len(x = list(boundaries), length.out = length(x = fov)) names(x = boundaries) <- fov } else { boundaries <- .AsList(x = boundaries) } } if (any(!nchar(x = names(x = boundaries)))) { missing <- setdiff(x = fov, y = names(x = boundaries)) idx <- which(x = !nchar(x = names(x = boundaries))) boundaries <- c( boundaries[intersect(x = names(x = boundaries), y = fov)], rep_len(x = boundaries[idx], length.out = length(x = missing)) ) names(x = boundaries)[!nchar(x = names(x = boundaries))] <- missing } if (any(!fov %in% names(x = boundaries))) { for (i in setdiff(x = fov, y = names(x = boundaries))) { boundaries[[i]] <- Boundaries(object = object[[i]])[1L] } } fov <- union(x = fov, y = names(x = boundaries)) if (length(x = boundaries) != length(x = fov)) { fov <- intersect(x = fov, y = names(x = boundaries)) } boundaries <- boundaries[fov] for (i in fov) { boundaries[[i]] <- Filter( f = function(x) { return(x %in% Boundaries(object = object[[i]]) || is_na(x = x)) }, x = boundaries[[i]] ) } boundaries <- Filter(f = length, x = boundaries) return(boundaries) } # Generate chunk points # # @param dsize How big is the data being chunked # @param csize How big should each chunk be # # @return A matrix where each column is a chunk, row 1 is start points, row 2 is end points # ChunkPoints <- function(dsize, csize) { return(vapply( X = 1L:ceiling(x = dsize / csize), FUN = function(i) { return(c( start = (csize * (i - 1L)) + 1L, end = min(csize * i, dsize) )) }, FUN.VALUE = numeric(length = 2L) )) } # L2 normalize the columns (or rows) of a given matrix # @param mat Matrix to cosine normalize # @param MARGIN Perform normalization over rows (1) or columns (2) # # # @return returns l2-normalized matrix # # L2Norm <- function(mat, MARGIN = 1){ normalized <- Sweep( x = mat, MARGIN = MARGIN, STATS = apply( X = mat, MARGIN = MARGIN, FUN = function(x){ sqrt(x = sum(x ^ 2)) } ), FUN = "/" ) normalized[!is.finite(x = normalized)] <- 0 return(normalized) } # Check the use of ... # # @param ... Arguments passed to a function that fall under ... # @param fxns A list/vector of functions or function names # # @return ... # # @importFrom utils argsAnywhere getAnywhere #' @importFrom utils isS3stdGeneric methods argsAnywhere isS3method # # @examples # CheckDots <- function(..., fxns = NULL) { args.names <- names(x = list(...)) if (length(x = list(...)) == 0) { return(invisible(x = NULL)) } if (is.null(x = args.names)) { stop("No named arguments passed") } if (length(x = fxns) == 1) { fxns <- list(fxns) } for (f in fxns) { if (!(is.character(x = f) || is.function(x = f))) { stop("CheckDots only works on characters or functions, not ", class(x = f)) } } fxn.args <- suppressWarnings(expr = sapply( X = fxns, FUN = function(x) { x <- tryCatch( expr = if (isS3stdGeneric(f = x)) { as.character(x = methods(generic.function = x)) } else { x }, error = function(...) { return(x) } ) x <- if (is.character(x = x)) { sapply(X = x, FUN = argsAnywhere, simplify = FALSE, USE.NAMES = TRUE) } else if (length(x = x) <= 1) { list(x) } return(sapply( X = x, FUN = function(f) { return(names(x = formals(fun = f))) }, simplify = FALSE, USE.NAMES = TRUE )) }, simplify = FALSE, USE.NAMES = TRUE )) fxn.args <- unlist(x = fxn.args, recursive = FALSE) fxn.null <- vapply(X = fxn.args, FUN = is.null, FUN.VALUE = logical(length = 1L)) if (all(fxn.null) && !is.null(x = fxns)) { stop("None of the functions passed could be found") } else if (any(fxn.null)) { warning( "The following functions passed could not be found: ", paste(names(x = which(x = fxn.null)), collapse = ', '), call. = FALSE, immediate. = TRUE ) fxn.args <- Filter(f = Negate(f = is.null), x = fxn.args) } dfxns <- vector(mode = 'logical', length = length(x = fxn.args)) names(x = dfxns) <- names(x = fxn.args) for (i in 1:length(x = fxn.args)) { dfxns[i] <- any(grepl(pattern = '...', x = fxn.args[[i]], fixed = TRUE)) } if (any(dfxns)) { dfxns <- names(x = which(x = dfxns)) if (any(nchar(x = dfxns) > 0)) { fx <- vapply( X = Filter(f = nchar, x = dfxns), FUN = function(x) { if (isS3method(method = x)) { x <- unlist(x = strsplit(x = x, split = '\\.')) x <- x[length(x = x) - 1L] } return(x) }, FUN.VALUE = character(length = 1L) ) message( "The following functions and any applicable methods accept the dots: ", paste(unique(x = fx), collapse = ', ') ) if (any(nchar(x = dfxns) < 1)) { message( "In addition, there is/are ", length(x = Filter(f = Negate(f = nchar), x = dfxns)), " other function(s) that accept(s) the dots" ) } } else { message("There is/are ", length(x = dfxns), 'function(s) that accept(s) the dots') } } else { unused <- Filter( f = function(x) { return(!x %in% unlist(x = fxn.args)) }, x = args.names ) if (length(x = unused) > 0) { msg <- paste0( "The following arguments are not used: ", paste(unused, collapse = ', ') ) switch( EXPR = getOption(x = "Seurat.checkdots"), "warn" = warning(msg, call. = FALSE, immediate. = TRUE), "stop" = stop(msg), "silent" = NULL, stop("Invalid Seurat.checkdots option. Please choose one of warn, stop, silent") ) unused.hints <- sapply(X = unused, FUN = OldParamHints) names(x = unused.hints) <- unused unused.hints <- na.omit(object = unused.hints) if (length(x = unused.hints) > 0) { message( "Suggested parameter: ", paste(unused.hints, "instead of", names(x = unused.hints), collapse = '; '), "\n" ) } } } } # Call gc() to perform garbage collection # CheckGC <- function() { if (getOption(x = "Seurat.memsafe")) { gc(verbose = FALSE) } } # Check a list of objects for duplicate cell names # # @param object.list List of Seurat objects # @param verbose Print message about renaming # @param stop Error out if any duplicate names exist # # @return Returns list of objects with duplicate cells renamed to be unique # # @keywords internal # # @noRd # CheckDuplicateCellNames <- function(object.list, verbose = TRUE, stop = FALSE) { cell.names <- unlist(x = lapply(X = object.list, FUN = colnames)) if (any(duplicated(x = cell.names))) { if (stop) { stop("Duplicate cell names present across objects provided.") } if (verbose) { warning("Some cell names are duplicated across objects provided. Renaming to enforce unique cell names.") } object.list <- lapply( X = 1:length(x = object.list), FUN = function(x) { return(RenameCells( object = object.list[[x]], new.names = paste0(Cells(x = object.list[[x]]), "_", x) )) } ) } return(object.list) } # Create an empty dummy assay to replace existing assay #' @importFrom Matrix sparseMatrix CreateDummyAssay <- function(assay) { cm <- sparseMatrix( i = {}, j = {}, dims = c(nrow(x = assay), ncol(x = assay)) ) cm <- as.sparse(x = cm) rownames(x = cm) <- rownames(x = assay) colnames(x = cm) <- colnames(x = assay) return(CreateAssayObject( counts = cm, check.matrix = FALSE )) } # Extract delimiter information from a string. # # Parses a string (usually a cell name) and extracts fields based on a delimiter # # @param string String to parse. # @param field Integer(s) indicating which field(s) to extract. Can be a vector multiple numbers. # @param delim Delimiter to use, set to underscore by default. # # @return A new string, that parses out the requested fields, and (if multiple), rejoins them with the same delimiter # # @export # # @examples # ExtractField(string = 'Hello World', field = 1, delim = '_') # ExtractField <- function(string, field = 1, delim = "_") { fields <- as.numeric(x = unlist(x = strsplit(x = as.character(x = field), split = ","))) if (length(x = fields) == 1) { return(strsplit(x = string, split = delim)[[1]][field]) } return(paste(strsplit(x = string, split = delim)[[1]][fields], collapse = delim)) } # Resize GenomicRanges upstream and or downstream # from https://support.bioconductor.org/p/78652/ # Extend <- function(x, upstream = 0, downstream = 0) { if (any(GenomicRanges::strand(x = x) == "*")) { warning("'*' ranges were treated as '+'") } on_plus <- GenomicRanges::strand(x = x) == "+" | GenomicRanges::strand(x = x) == "*" new_start <- GenomicRanges::start(x = x) - ifelse(test = on_plus, yes = upstream, no = downstream) new_end <- GenomicRanges::end(x = x) + ifelse(test = on_plus, yes = downstream, no = upstream) IRanges::ranges(x = x) <- IRanges::IRanges(start = new_start, end = new_end) x <- GenomicRanges::trim(x = x) return(x) } # Interleave vectors together # # @param ... Vectors to be interleaved # # @return A vector with the values from each vector in ... interleaved # Interleave <- function(...) { return(as.vector(x = t(x = as.data.frame(x = list(...))))) } # Check if a matrix is empty # # Takes a matrix and asks if it's empty (either 0x0 or 1x1 with a value of NA) # # @param x A matrix # # @return Whether or not \code{x} is empty # IsMatrixEmpty <- function(x) { matrix.dims <- dim(x = x) matrix.na <- all(matrix.dims == 1) && all(is.na(x = x)) return(all(matrix.dims == 0) || matrix.na) } # Check if externalptr is null # From https://stackoverflow.com/questions/26666614/how-do-i-check-if-an-externalptr-is-null-from-within-r # is.null.externalptr <- function(pointer) { stopifnot(is(pointer, "externalptr")) .Call("isnull", pointer) } # Check whether an assay has been processed by sctransform # # @param assay assay to check # # @return Boolean # IsSCT <- function(assay) { if (is.list(x = assay)) { sct.check <- lapply(X = assay, FUN = function(x) { return(!is.null(x = Misc(object = x, slot = 'vst.out')) | !is.null(x = Misc(object = x, slot = 'vst.set')) | inherits(x = x, what = "SCTAssay")) }) return(unlist(x = sct.check)) } return(!is.null(x = Misc(object = assay, slot = 'vst.out')) | !is.null(x = Misc(object = assay, slot = 'vst.set')) | inherits(x = assay, what = "SCTAssay")) } # Check whether a vst.out is from sctransform # # @param vst.out a sct model from sctransform # # @return Boolean # IsVSTout <- function(vst.out) { vst.element <- c("model_str", "model_pars_fit", "cell_attr" ) vst.check <- setdiff(x = vst.element, y = names(x = vst.out)) if (length(x = setdiff(x = vst.element, y = names(x = vst.out))) == 0) { vst.check <- TRUE } else { vst.check <- FALSE } return(vst.check) } # Calculate euclidean distance the x and y, # and subtract the nearest neighbors of x distance to keep local connectivity # It is used in FindModalityWeights to calculate the with and cross modality distance impute_dist <- function(x, y, nearest.dist) { dist <- sqrt(x = rowSums(x = (x - y)**2)) - nearest.dist dist <- ReLu(x = dist) return(dist) } # Check the length of components of a list # # @param values A list whose components should be checked # @param cutoff A minimum value to check for # # @return a vector of logicals # LengthCheck <- function(values, cutoff = 0) { return(vapply( X = values, FUN = function(x) { return(length(x = x) > cutoff) }, FUN.VALUE = logical(1) )) } # Function to map values in a vector `v` as defined in `from`` to the values # defined in `to`. # # @param v vector of values to map # @param from vector of original values # @param to vector of values to map original values to (should be of equal # length as from) # @return returns vector of mapped values # MapVals <- function(v, from, to) { if (length(x = from) != length(x = to)) { stop("from and to vectors are not the equal length.") } vals.to.match <- match(x = v, table = from) vals.to.match.idx <- !is.na(x = vals.to.match) v[vals.to.match.idx] <- to[vals.to.match[vals.to.match.idx]] return(v) } # Independently shuffle values within each row of a matrix # # Creates a matrix where correlation structure has been removed, but overall values are the same # # @param x Matrix to shuffle # # @return Returns a scrambled matrix, where each row is shuffled independently # #' @importFrom stats runif # # @export # # @examples # mat <- matrix(data = rbinom(n = 25, size = 20, prob = 0.2 ), nrow = 5) # mat # MatrixRowShuffle(x = mat) # MatrixRowShuffle <- function(x) { x2 <- x x2 <- t(x = x) ind <- order(c(col(x = x2)), runif(n = length(x = x2))) x2 <- matrix( data = x2[ind], nrow = nrow(x = x), ncol = ncol(x = x), byrow = TRUE ) return(x2) } # Reverse the vector x and return the value at the Nth index. If N is larger # than the length of the vector, return the last value in the reversed vector. # # @param x vector of interest # @param N index in reversed vector # # @return returns element at given index # MaxN <- function(x, N = 2){ len <- length(x) if (N > len) { warning('N greater than length(x). Setting N=length(x)') N <- length(x) } sort(x, partial = len - N + 1)[len - N + 1] } # Given a range from cut, compute the mean # # @x range from cut as a string (e.g. (10, 20] ) # @return returns a numeric with the mean of the range # MeanRange <- function(x) { left <- gsub(pattern = "\\]", replacement = "", x = sub(pattern = "\\([[:digit:]\\.e+]*,", x = x, replacement = "")) right <- gsub(pattern = "\\(", replacement = "", x = sub(pattern = ",[[:digit:]\\.e+]*]", x = x, replacement = "")) return(mean(c(as.numeric(x = left), as.numeric(x = right)))) } # Melt a data frame # # @param x A data frame # # @return A molten data frame # Melt <- function(x) { if (!is.data.frame(x = x)) { x <- as.data.frame(x = x) } return(data.frame( rows = rep.int(x = rownames(x = x), times = ncol(x = x)), cols = unlist(x = lapply(X = colnames(x = x), FUN = rep.int, times = nrow(x = x))), vals = unlist(x = x, use.names = FALSE) )) } # Modify parameters in calling environment # # Used exclusively for helper parameter validation functions # # @param param name of parameter to change # @param value new value for parameter # ModifyParam <- function(param, value) { # modify in original function environment env1 <- sys.frame(which = length(x = sys.frames()) - 2) env1[[param]] <- value # also modify in validation function environment env2 <- sys.frame(which = length(x = sys.frames()) - 1) env2[[param]] <- value } # Give hints for old parameters and their newer counterparts # # This is a non-exhaustive list. If your function isn't working properly based # on the parameters you give it, please read the documentation for your function # # @param param A vector of parameters to get hints for # # @return Parameter hints for the specified parameters # OldParamHints <- function(param) { param.conversion <- c( 'raw.data' = 'counts', 'min.genes' = 'min.features', 'features.plot' = 'features', 'pc.genes' = 'features', 'do.print' = 'verbose', 'genes.print' = 'nfeatures.print', 'pcs.print' = 'ndims.print', 'pcs.use' = 'dims', 'reduction.use' = 'reduction', 'cells.use' = 'cells', 'do.balanced' = 'balanced', 'display.progress' = 'verbose', 'print.output' = 'verbose', 'dims.use' = 'dims', 'reduction.type' = 'reduction', 'y.log' = 'log', 'cols.use' = 'cols', 'assay.use' = 'assay' ) return(param.conversion[param]) } # Restore previous seed when needed in `RunLeiden` # # @param seed old seed # # @author Benjamin Parks # @references from BPCells package # https://github.com/bnprks/BPCells/blob/f2026c3509f5e2542f7624bdaf75669d5d45d78b/r/R/utils.R#L18 # restore_seed <- function(seed) { if (is.null(seed)) { rm(".Random.seed", envir = globalenv(), inherits = FALSE) } else { assign(".Random.seed", seed, envir = globalenv(), inherits = FALSE) } } # Get current seed when needed in `RunLeiden` # # @param seed current seed # # @author Benjamin Parks # @references from BPCells package # https://github.com/bnprks/BPCells/blob/f2026c3509f5e2542f7624bdaf75669d5d45d78b/r/R/utils.R#L10 # get_seed <- function() { if (exists(".Random.seed", globalenv(), mode = "integer", inherits = FALSE)) { return(get(".Random.seed", globalenv(), mode = "integer", inherits = FALSE)) } else { return(NULL) } } # Check if a web resource is available # # @param url A URL # @param strict Perform a strict web availability test # @param seconds Timeout in seconds # # @return \code{TRUE} if \url{is available} otherwise \code{FALSE} # #' @importFrom httr GET status_code timeout # # @keywords internal # Online <- function(url, strict = FALSE, seconds = 5L) { if (isTRUE(x = strict)) { code <- 200L comp <- identical } else { code <- 404L comp <- Negate(f = identical) } request <- tryCatch( expr = GET(url = url, timeout(seconds = seconds)), error = function(err) { code <- if (grepl(pattern = '^Timeout was reached', x = err$message)) { 408L } else { 404L } return(code) } ) return(comp(x = status_code(x = request), y = code)) } # Parenting parameters from one environment to the next # # This function allows one to modify a parameter in a parent environment # The primary use of this is to ensure logging functions store correct parameters # if they've been modified by a child function or method # # @param parent.find Regex pattern of name of parent function call to modify. # For example, this can be the class name for a method that was dispatched previously # @param ... Parameter names and values to parent; both name and value must be supplied # in the standard \code{name = value} format; any number of name/value pairs can be specified # # @return No return, modifies parent environment directly # # @examples # Parenting(parent.find = 'Seurat', features = features[features > 7]) # Parenting <- function(parent.find = 'Seurat', ...) { calls <- as.character(x = sys.calls()) calls <- lapply( X = strsplit(x = calls, split = '(', fixed = TRUE), FUN = '[', 1 ) parent.index <- grep(pattern = parent.find, x = calls) if (length(x = parent.index) != 1) { warning( "Cannot find a parent environment called ", parent.find, immediate. = TRUE, call. = FALSE ) } else { to.parent <- list(...) if (length(x = to.parent) == 0) { warning("Nothing to parent", immediate. = TRUE, call. = FALSE) } else if (is.null(x = names(x = to.parent))) { stop("All input must be in a key = value pair") } else if (length(x = Filter(f = nchar, x = names(x = to.parent))) != length(x = to.parent)) { stop("All inputs must be named") } else { parent.environ <- sys.frame(which = parent.index) for (i in 1:length(x = to.parent)) { parent.environ[[names(x = to.parent)[i]]] <- to.parent[[i]] } } } } # Generate a random name # # Make a name from randomly sampled lowercase letters, # pasted together with no spaces or other characters # # @param length How long should the name be # @param ... Extra parameters passed to sample # # @return A character with nchar == length of randomly sampled letters # # @seealso \code{\link{sample}} # RandomName <- function(length = 5L, ...) { CheckDots(..., fxns = 'sample') return(paste(sample(x = letters, size = length, ...), collapse = '')) } # Rectified linear units function. Calculate positive part of its argument # The input can be a vector and a matrix ReLu <- function(x) { x[x < 0] <- 0 return(x) } # Remove the last field from a string # # Parses a string (usually a cell name) and removes the last field based on a delimter # # @param string String to parse # @param delim Delimiter to use, set to underscore by default. # # @return A new string sans the last field # RemoveLastField <- function(string, delim = "_") { ss <- strsplit(x = string, split = delim)[[1]] if (length(x = ss) == 1) { return(string) } else { return(paste(ss[1:(length(x = ss)-1)], collapse = delim)) } } # Calculate row mean of a sparse matrix # @param mat sparse matrix # @return A vector of row mean # RowMeanSparse <- function(mat) { mat <- RowSparseCheck(mat = mat) output <- row_mean_dgcmatrix( x = slot(object = mat, name = "x"), i = slot(object = mat, name = "i"), rows = nrow(x = mat), cols = ncol(x = mat) ) names(x = output) <- rownames(x = mat) return(output) } # Calculate row sum of a sparse matrix # # @param mat sparse matrix # @return A vector of row sum # RowSumSparse <- function(mat) { mat <- RowSparseCheck(mat = mat) output <- row_sum_dgcmatrix( x = slot(object = mat, name = "x"), i = slot(object = mat, name = "i"), rows = nrow(x = mat), cols = ncol(x = mat) ) names(x = output) <- rownames(x = mat) return(output) } # Calculate row variance of a sparse matrix # # @param mat sparse matrix # @return A vector of row variance # RowVarSparse <- function(mat) { mat <- RowSparseCheck(mat = mat) output <- row_var_dgcmatrix( x = slot(object = mat, name = "x"), i = slot(object = mat, name = "i"), rows = nrow(x = mat), cols = ncol(x = mat) ) names(x = output) <- rownames(x = mat) return(output) } # Check if the input matrix is dgCMatrix # # @param mat sparse matrix # @return A dgCMatrix # RowSparseCheck <- function(mat) { if (!inherits(x = mat, what = "sparseMatrix")) { stop("Input should be sparse matrix") } else if (!is(object = mat, class2 = "dgCMatrix")) { warning("Input matrix is converted to dgCMatrix.") mat <- as.sparse(x = mat) } return(mat) } # Sweep out array summaries # # Reimplmentation of \code{\link[base]{sweep}} to maintain compatability with # both R 3.X and 4.X # # @inheritParams base::sweep # @param x an array. # # @seealso \code{\link[base]{sweep}} # Sweep <- function(x, MARGIN, STATS, FUN = '-', check.margin = TRUE, ...) { if (any(grepl(pattern = 'X', x = names(x = formals(fun = sweep))))) { return(sweep( X = x, MARGIN = MARGIN, STATS = STATS, FUN = FUN, check.margin = check.margin, ... )) } else { return(sweep( x = x, MARGIN = MARGIN, STATS = STATS, FUN = FUN, check.margin = check.margin, ... )) } } # Get program paths in a system-agnostic way # # @param progs A vector of program names # @param error Throw an error if any programs are not found # @param add.exe Add '.exe' extension to program names that don't have it # # @return A named vector of program paths; missing programs are returned as # \code{NA} if \code{error = FALSE} # #' @importFrom tools file_ext # SysExec <- function( progs, error = ifelse(test = length(x = progs) == 1, yes = TRUE, no = FALSE), add.exe = .Platform$OS.type == 'windows' ) { cmd <- ifelse( test = .Platform$OS.type == 'windows', yes = 'where.exe', no = 'which' ) if (add.exe) { missing.exe <- file_ext(x = progs) != 'exe' progs[missing.exe] <- paste0(progs[missing.exe], '.exe') } paths <- sapply( X = progs, FUN = function(x) { return(tryCatch( expr = system2(command = cmd, args = x, stdout = TRUE)[1], warning = function(...) { return(NA_character_) } )) } ) if (error && any(is.na(x = paths))) { stop( "Could not find the following programs: ", paste(names(x = paths[is.na(x = paths)]), collapse = ', '), call. = FALSE ) } return(paths) } # Try to convert x to numeric, if NA's introduced return x as is # ToNumeric <- function(x){ # check for x:y range if (is.numeric(x = x)) { return(x) } if (length(x = unlist(x = strsplit(x = x, split = ":"))) == 2) { num <- unlist(x = strsplit(x = x, split = ":")) return(num[1]:num[2]) } num <- suppressWarnings(expr = as.numeric(x = x)) if (!is.na(x = num)) { return(num) } return(x) } # Merge a list of sparse matrixes #' @importFrom Matrix summary sparseMatrix MergeSparseMatrices <- function(...) { colname.new <- character() rowname.new <- character() x <- vector() i <- numeric() j <- numeric() for (mat in list(...)) { colname.old <- colnames(x = mat) rowname.old <- rownames(x = mat) # does not check if there are overlapping cells colname.new <- union(x = colname.new, y = colname.old) rowname.new <- union(x = rowname.new, y = rowname.old) colindex.new <- match(x = colname.old, table = colname.new) rowindex.new <- match(x = rowname.old, table = rowname.new) ind <- summary(object = mat) # Expand the list of indices and x i <- c(i, rowindex.new[ind[,1]]) j <- c(j, colindex.new[ind[,2]]) x <- c(x, ind[,3]) } merged.mat <- sparseMatrix(i=i, j=j, x=x, dims=c(length(rowname.new), length(colname.new)), dimnames=list(rowname.new, colname.new)) return (merged.mat) } # cross product from delayed array # crossprod_DelayedAssay <- function(x, y, block.size = 1e8) { # perform t(x) %*% y in blocks for y if (!inherits(x = y, 'DelayedMatrix')) { stop('y should a DelayedMatrix') } if (nrow(x) != nrow(y)) { stop('row of x and y should be the same') } sparse <- DelayedArray::is_sparse(x = y) suppressMessages(expr = DelayedArray::setAutoBlockSize(size = block.size)) cells.grid <- DelayedArray::colAutoGrid(x = y) product.list <- list() for (i in seq_len(length.out = length(x = cells.grid))) { vp <- cells.grid[[i]] block <- DelayedArray::read_block(x = y, viewport = vp, as.sparse = sparse) if (sparse) { block <- as(object = block, Class = 'dgCMatrix') } else { block <- as(object = block, Class = 'Matrix') } product.list[[i]] <- as.matrix(t(x) %*% block) } product.mat <- matrix(data = unlist(product.list), nrow = ncol(x) , ncol = ncol(y)) colnames(product.mat) <- colnames(y) rownames(product.mat) <- colnames(x) return(product.mat) } # cross product from BPCells # crossprod_BPCells <- function(x, y) { # perform t(x) %*% y, y is from BPCells product.mat <- t(x) %*% y colnames(product.mat) <- colnames(y) rownames(product.mat) <- colnames(x) return(product.mat) } # nonzero element version of sweep # SweepNonzero <- function( x, MARGIN, STATS, FUN = "/" ) { if (!inherits(x = x, what = 'dgCMatrix')) { stop('input should be dgCMatrix. eg: x <- as(x, "CsparseMatrix")') } if (dim(x = x)[MARGIN] != length(STATS)){ warning("Length of STATS is not equal to dim(x)[MARGIN]") } fun <- match.fun(FUN) if (MARGIN == 1) { idx <- x@i + 1 x@x <- fun(x@x, STATS[idx]) } else if (MARGIN == 2) { x <- as(x, "RsparseMatrix") idx <- x@j + 1 x@x <- fun(x@x, STATS[idx]) x <- as(x, "CsparseMatrix") } return(x) } #' Create one hot matrix for a given label #' #' @param labels A vector of labels #' @param method Method to aggregate cells with the same label. Either 'aggregate' or 'average' #' @param cells.name A vector of cell names #' #' @importFrom Matrix colSums sparse.model.matrix #' @importFrom stats as.formula #' @export #' @concept utilities #' CreateCategoryMatrix <- function( labels, method = c('aggregate', 'average'), cells.name = NULL ) { method <- match.arg(arg = method) if (is.null(dim(labels))) { if (length(x = unique(x = labels)) == 1) { data <- matrix(nrow = length(x = labels), ncol = 0) } else { data <- cbind(labels = labels) } } else { data <- labels } cells.name <- cells.name %||% rownames(data) if (!is.null(cells.name) & length(cells.name) != nrow(data)) { stop('length of cells name should be equal to the length of input labels') } if (ncol(x = data) == 0) { message("All grouping variables have 1 value only. Computing across all cells.") category.matrix <- matrix( data = 1, nrow = nrow(x = data), dimnames = list(cells.name, 'all') ) if (method == 'average') { category.matrix <- category.matrix / sum(category.matrix) } return(category.matrix) } group.by <- colnames(x = data) category.matrix <- sparse.model.matrix(object = as.formula( object = paste0( '~0+', paste0( "data[,", 1:length(x = group.by), "]", collapse = ":" ) ) )) colsums <- colSums(x = category.matrix) category.matrix <- category.matrix[, colsums > 0] colsums <- colsums[colsums > 0] if (method =='average') { category.matrix <- SweepNonzero( x = category.matrix, MARGIN = 2, STATS = colsums, FUN = "/") } if (any(grepl(pattern = "_", x = colnames(x = category.matrix) ))) { inform( message = "Names of identity class contain underscores ('_'), replacing with dashes ('-')", .frequency = "regularly", .frequency_id = "CreateCategoryMatrix" ) colnames(x = category.matrix) <- gsub(pattern = '_', replacement = '-', x = colnames(x = category.matrix) ) } colnames(x = category.matrix) <- unname(sapply( X = colnames(x = category.matrix), FUN = function(name) { name <- gsub(pattern = "data\\[, [1-9]*\\]", replacement = "", x = name) return(paste0(rev(x = unlist(x = strsplit(x = name, split = ":"))), collapse = "_")) })) rownames(category.matrix) <- cells.name return(category.matrix) } #' Construct an assay for spatial niche analysis #' #' This function will construct a new assay where each feature is a #' cell label. The values represent the sum of a particular cell label #' neighboring a given cell. #' #' @param object A Seurat object #' @param fov FOV object to gather cell positions from #' @param group.by Cell classifications to count in spatial neighborhood #' @param assay Name for spatial neighborhoods assay #' @param cluster.name Name of output clusters #' @param neighbors.k Number of neighbors to consider for each cell #' @param niches.k Number of niche clusters to construct #' @param ... Extra parameters passed to \code{\link{kmeans}} #' #' @importFrom stats kmeans #' @return Seurat object containing a new assay #' @concept clustering #' @export #' BuildNicheAssay <- function( object, fov, group.by, assay = "niche", cluster.name = "niches", neighbors.k = 20, niches.k = 4, ... ) { # initialize an empty cells x groups binary matrix cells <- Cells(object[[fov]]) group.labels <- unlist(object[[group.by]][cells, ]) groups <- sort(unique(group.labels)) cell.type.mtx <- matrix( data = 0, nrow = length(cells), ncol = length(groups) ) rownames(cell.type.mtx) <- cells colnames(cell.type.mtx) <- groups # populate the binary matrix cells.idx <- seq_along(cells) group.idx <- match(group.labels, groups) cell.type.mtx[cbind(cells.idx, group.idx)] <- 1 # find neighbors based on tissue position coords <- GetTissueCoordinates(object[[fov]], which = "centroids") rownames(coords) <- coords[["cell"]] coords <- as.matrix(coords[ , c("x", "y")]) neighbors <- FindNeighbors(coords, k.param = neighbors.k, compute.SNN = FALSE) # create niche assay sum.mtx <- as.matrix(neighbors[["nn"]] %*% cell.type.mtx) niche.assay <- CreateAssayObject(counts = t(sum.mtx)) object[[assay]] <- niche.assay DefaultAssay(object) <- assay # cluster niche assay object <- ScaleData(object) results <- kmeans( x = t(object[[assay]]@scale.data), centers = niches.k, nstart = 30, ... ) object[[cluster.name]] <- results[["cluster"]] return(object) } Seurat/R/zzz.R0000644000176200001440000000611715113655025012706 0ustar liggesusers#' @importFrom progressr progressor #' @importFrom methods slot slot<- #' @importFrom lifecycle deprecated deprecate_soft deprecate_stop #' deprecate_warn is_present #' @importFrom rlang !!! .data #' abort #' data_sym #' data_syms #' arg_match #' arg_match0 #' as_name #' caller_env #' check_installed #' enquo #' inform #' is_integerish #' is_na #' is_quosure #' is_scalar_integerish #' quo_get_env #' quo_get_expr #' warn #' NULL #' @section Package options: #' #' Seurat uses the following [options()] to configure behaviour: #' #' \describe{ #' \item{\code{Seurat.memsafe}}{global option to call gc() after many operations. #' This can be helpful in cleaning up the memory status of the R session and #' prevent use of swap space. However, it does add to the computational overhead #' and setting to FALSE can speed things up if you're working in an environment #' where RAM availability is not a concern.} #' \item{\code{Seurat.warn.umap.uwot}}{Show warning about the default backend #' for \code{\link{RunUMAP}} changing from Python UMAP via reticulate to UWOT} #' \item{\code{Seurat.checkdots}}{For functions that have ... as a parameter, #' this controls the behavior when an item isn't used. Can be one of warn, #' stop, or silent.} #' \item{\code{Seurat.limma.wilcox.msg}}{{Show message about more efficient #' Wilcoxon Rank Sum test available via the limma package}} #' \item{\code{Seurat.Rfast2.msg}}{{Show message about more efficient #' Moran's I function available via the Rfast2 package}} #' \item{\code{Seurat.warn.vlnplot.split}}{Show message about changes to #' default behavior of split/multi violin plots} #' } #' #' @docType package #' @rdname Seurat-package #' @name Seurat-package #' "_PACKAGE" #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Options #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% seurat_default_options <- list( Seurat.memsafe = FALSE, Seurat.warn.umap.uwot = TRUE, Seurat.checkdots = "warn", Seurat.presto.wilcox.msg = TRUE, #CHANGE Seurat.Rfast2.msg = TRUE, Seurat.warn.vlnplot.split = TRUE, Seurat.object.assay.version = "v5" ) #' @importFrom methods setClassUnion #' @importClassesFrom Matrix dgCMatrix #' NULL setClassUnion(name = 'V3Matrix', members = c('matrix', 'dgCMatrix')) AttachDeps <- function(deps) { for (d in deps) { if (!paste0('package:', d) %in% search()) { packageStartupMessage("Attaching ", d) attachNamespace(ns = d) } } } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Hooks #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @importFrom SeuratObject AttachDeps #' .onAttach <- function(libname, pkgname) { AttachDeps(deps = c('SeuratObject')) return(invisible(x = NULL)) } .onLoad <- function(libname, pkgname) { toset <- setdiff( x = names(x = seurat_default_options), y = names(x = options()) ) # toset <- names(x = seurat_default_options) if (length(x = toset)) { options(seurat_default_options[toset]) } return(invisible(x = NULL)) } Seurat/R/visualization.R0000644000176200001440000114126715117062041014753 0ustar liggesusers#' @importFrom utils globalVariables #' @importFrom ggplot2 fortify GeomViolin ggproto #' @importFrom SeuratObject DefaultDimReduc #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @importFrom methods setGeneric #' setGeneric( name = '.PrepImageData', def = function(data, cells, ...) { standardGeneric(f = '.PrepImageData') } ) #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Heatmaps #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Dimensional reduction heatmap #' #' Draws a heatmap focusing on a principal component. Both cells and genes are sorted by their #' principal component scores. Allows for nice visualization of sources of heterogeneity in the dataset. #' #' @inheritParams DoHeatmap #' @param dims Dimensions to plot #' @param nfeatures Number of genes to plot #' @param cells A list of cells to plot. If numeric, just plots the top cells. #' @param reduction Which dimensional reduction to use #' @param balanced Plot an equal number of genes with both + and - scores. #' @param projected Use the full projected dimensional reduction #' @param ncol Number of columns to plot #' @param fast If true, use \code{image} to generate plots; faster than using ggplot2, but not customizable #' @param assays A vector of assays to pull data from #' @param combine Combine plots into a single \code{\link[patchwork]{patchwork}ed} #' ggplot object. If \code{FALSE}, return a list of ggplot objects #' #' @return No return value by default. If using fast = FALSE, will return a #' \code{\link[patchwork]{patchwork}ed} ggplot object if combine = TRUE, otherwise #' returns a list of ggplot objects #' #' @importFrom patchwork wrap_plots #' @export #' @concept visualization #' #' @seealso \code{\link[graphics]{image}} \code{\link[ggplot2]{geom_raster}} #' #' @examples #' data("pbmc_small") #' DimHeatmap(object = pbmc_small) #' DimHeatmap <- function( object, dims = 1, nfeatures = 30, cells = NULL, reduction = 'pca', disp.min = -2.5, disp.max = NULL, balanced = TRUE, projected = FALSE, ncol = NULL, fast = TRUE, raster = TRUE, slot = 'scale.data', assays = NULL, combine = TRUE ) { ncol <- ncol %||% ifelse(test = length(x = dims) > 2, yes = 3, no = length(x = dims)) plots <- vector(mode = 'list', length = length(x = dims)) assays <- assays %||% DefaultAssay(object = object) disp.max <- disp.max %||% ifelse( test = slot == 'scale.data', yes = 2.5, no = 6 ) if (!DefaultAssay(object = object[[reduction]]) %in% assays) { warning("The original assay that the reduction was computed on is different than the assay specified") } cells <- cells %||% ncol(x = object) if (is.numeric(x = cells)) { cells <- lapply( X = dims, FUN = function(x) { cells <- TopCells( object = object[[reduction]], dim = x, ncells = cells, balanced = balanced ) if (balanced) { cells$negative <- rev(x = cells$negative) } cells <- unlist(x = unname(obj = cells)) return(cells) } ) } if (!is.list(x = cells)) { cells <- lapply(X = 1:length(x = dims), FUN = function(x) {return(cells)}) } features <- lapply( X = dims, FUN = TopFeatures, object = object[[reduction]], nfeatures = nfeatures, balanced = balanced, projected = projected ) features.all <- unique(x = unlist(x = features)) if (length(x = assays) > 1) { features.keyed <- lapply( X = assays, FUN = function(assay) { features <- features.all[features.all %in% rownames(x = object[[assay]])] if (length(x = features) > 0) { return(paste0(Key(object = object[[assay]]), features)) } } ) features.keyed <- Filter(f = Negate(f = is.null), x = features.keyed) features.keyed <- unlist(x = features.keyed) } else { features.keyed <- features.all DefaultAssay(object = object) <- assays } data.all <- FetchData( object = object, vars = features.keyed, cells = unique(x = unlist(x = cells)), layer = slot ) data.all <- MinMax(data = data.all, min = disp.min, max = disp.max) data.limits <- c(min(data.all), max(data.all)) # if (check.plot && any(c(length(x = features.keyed), length(x = cells[[1]])) > 700)) { # choice <- menu(c("Continue with plotting", "Quit"), title = "Plot(s) requested will likely take a while to plot.") # if (choice != 1) { # return(invisible(x = NULL)) # } # } if (fast) { nrow <- floor(x = length(x = dims) / 3.01) + 1 orig.par <- par()$mfrow par(mfrow = c(nrow, ncol)) } for (i in 1:length(x = dims)) { dim.features <- c(features[[i]][[2]], rev(x = features[[i]][[1]])) dim.features <- rev(x = unlist(x = lapply( X = dim.features, FUN = function(feat) { return(grep(pattern = paste0(feat, '$'), x = features.keyed, value = TRUE)) } ))) dim.cells <- cells[[i]] data.plot <- data.all[dim.cells, dim.features] if (fast) { SingleImageMap( data = data.plot, title = paste0(Key(object = object[[reduction]]), dims[i]), order = dim.cells ) } else { plots[[i]] <- SingleRasterMap( data = data.plot, raster = raster, limits = data.limits, cell.order = dim.cells, feature.order = dim.features ) } } if (fast) { par(mfrow = orig.par) return(invisible(x = NULL)) } if (combine) { plots <- wrap_plots(plots, ncol = ncol, guides = "collect") } return(plots) } #' Feature expression heatmap #' #' Draws a heatmap of single cell feature expression. #' #' @param object Seurat object #' @param features A vector of features to plot, defaults to \code{VariableFeatures(object = object)} #' @param cells A vector of cells to plot #' @param disp.min Minimum display value (all values below are clipped) #' @param disp.max Maximum display value (all values above are clipped); defaults to 2.5 #' if \code{slot} is 'scale.data', 6 otherwise #' @param group.by A vector of variables to group cells by; pass 'ident' to group by cell identity classes #' @param group.bar Add a color bar showing group status for cells #' @param group.colors Colors to use for the color bar #' @param slot Data slot to use, choose from 'raw.data', 'data', or 'scale.data' #' @param assay Assay to pull from # @param check.plot Check that plotting will finish in a reasonable amount of time #' @param label Label the cell identies above the color bar #' @param size Size of text above color bar #' @param hjust Horizontal justification of text above color bar #' @param vjust Vertical justification of text above color bar #' @param angle Angle of text above color bar #' @param raster If true, plot with geom_raster, else use geom_tile. geom_raster may look blurry on #' some viewing applications such as Preview due to how the raster is interpolated. Set this to FALSE #' if you are encountering that issue (note that plots may take longer to produce/render). #' @param draw.lines Include white lines to separate the groups #' @param lines.width Integer number to adjust the width of the separating white lines. #' Corresponds to the number of "cells" between each group. #' @param group.bar.height Scale the height of the color bar #' @param combine Combine plots into a single \code{\link[patchwork]{patchwork}ed} #' ggplot object. If \code{FALSE}, return a list of ggplot objects #' #' @return A \code{\link[patchwork]{patchwork}ed} ggplot object if #' \code{combine = TRUE}; otherwise, a list of ggplot objects #' #' @importFrom stats median #' @importFrom scales hue_pal #' @importFrom ggplot2 annotation_raster coord_cartesian scale_color_manual #' ggplot_build geom_text #' @importFrom patchwork wrap_plots #' @export #' @concept visualization #' #' @examples #' data("pbmc_small") #' DoHeatmap(object = pbmc_small) #' DoHeatmap <- function( object, features = NULL, cells = NULL, group.by = 'ident', group.bar = TRUE, group.colors = NULL, disp.min = -2.5, disp.max = NULL, slot = 'scale.data', assay = NULL, label = TRUE, size = 5.5, hjust = 0, vjust = 0, angle = 45, raster = TRUE, draw.lines = TRUE, lines.width = NULL, group.bar.height = 0.02, combine = TRUE ) { assay <- assay %||% DefaultAssay(object = object) DefaultAssay(object = object) <- assay cells <- cells %||% colnames(x = object[[assay]]) if (is.numeric(x = cells)) { cells <- colnames(x = object)[cells] } features <- features %||% VariableFeatures(object = object) features <- rev(x = unique(x = features)) disp.max <- disp.max %||% ifelse( test = slot == 'scale.data', yes = 2.5, no = 6 ) # make sure features are present possible.features <- Features(object,layer = slot) if (any(!features %in% possible.features)) { bad.features <- features[!features %in% possible.features] features <- features[features %in% possible.features] if(length(x = features) == 0) { stop("No requested features found in the ", slot, " layer for the ", assay, " assay.") } warning("The following features were omitted as they were not found in the ", slot, " layer for the ", assay, " assay: ", paste(bad.features, collapse = ", ")) } data <- as.data.frame(x = as.matrix(x = t(x = GetAssayData( object = object, layer = slot)[features, cells, drop = FALSE]))) object <- suppressMessages(expr = StashIdent(object = object, save.name = 'ident')) group.by <- group.by %||% 'ident' groups.use <- object[[group.by]][cells, , drop = FALSE] # group.use <- switch( # EXPR = group.by, # 'ident' = Idents(object = object), # object[[group.by, drop = TRUE]] # ) # group.use <- factor(x = group.use[cells]) plots <- vector(mode = 'list', length = ncol(x = groups.use)) for (i in 1:ncol(x = groups.use)) { data.group <- data group.use <- groups.use[, i, drop = TRUE] if (!is.factor(x = group.use)) { group.use <- factor(x = group.use) } names(x = group.use) <- cells if (draw.lines) { # create fake cells to serve as the white lines, fill with NAs lines.width <- lines.width %||% ceiling(x = nrow(x = data.group) * 0.0025) placeholder.cells <- sapply( X = 1:(length(x = levels(x = group.use)) * lines.width), FUN = function(x) { return(RandomName(length = 20)) } ) placeholder.groups <- rep(x = levels(x = group.use), times = lines.width) group.levels <- levels(x = group.use) names(x = placeholder.groups) <- placeholder.cells group.use <- as.vector(x = group.use) names(x = group.use) <- cells group.use <- factor(x = c(group.use, placeholder.groups), levels = group.levels) na.data.group <- matrix( data = NA, nrow = length(x = placeholder.cells), ncol = ncol(x = data.group), dimnames = list(placeholder.cells, colnames(x = data.group)) ) data.group <- rbind(data.group, na.data.group) } lgroup <- length(levels(group.use)) plot <- SingleRasterMap( data = data.group, raster = raster, disp.min = disp.min, disp.max = disp.max, feature.order = features, cell.order = names(x = sort(x = group.use)), group.by = group.use ) if (group.bar) { # TODO: Change group.bar to annotation.bar default.colors <- c(hue_pal()(length(x = levels(x = group.use)))) if (!is.null(x = names(x = group.colors))) { cols <- unname(obj = group.colors[levels(x = group.use)]) } else { cols <- group.colors[1:length(x = levels(x = group.use))] %||% default.colors } if (any(is.na(x = cols))) { cols[is.na(x = cols)] <- default.colors[is.na(x = cols)] cols <- Col2Hex(cols) col.dups <- sort(x = unique(x = which(x = duplicated(x = substr( x = cols, start = 1, stop = 7 ))))) through <- length(x = default.colors) while (length(x = col.dups) > 0) { pal.max <- length(x = col.dups) + through cols.extra <- hue_pal()(pal.max)[(through + 1):pal.max] cols[col.dups] <- cols.extra col.dups <- sort(x = unique(x = which(x = duplicated(x = substr( x = cols, start = 1, stop = 7 ))))) } } group.use2 <- sort(x = group.use) if (draw.lines) { na.group <- RandomName(length = 20) levels(x = group.use2) <- c(levels(x = group.use2), na.group) group.use2[placeholder.cells] <- na.group cols <- c(cols, "#FFFFFF") } pbuild <- ggplot_build(plot = plot) names(x = cols) <- levels(x = group.use2) # scale the height of the bar y.range <- diff(x = pbuild$layout$panel_params[[1]]$y.range) y.pos <- max(pbuild$layout$panel_params[[1]]$y.range) + y.range * 0.015 y.max <- y.pos + group.bar.height * y.range x.min <- min(pbuild$layout$panel_params[[1]]$x.range) + 0.1 x.max <- max(pbuild$layout$panel_params[[1]]$x.range) - 0.1 plot <- plot + annotation_raster( raster = t(x = cols[group.use2]), xmin = x.min, xmax = x.max, ymin = y.pos, ymax = y.max ) + coord_cartesian(ylim = c(0, y.max), clip = 'off') + scale_color_manual( values = cols[-length(x = cols)], name = "Identity", na.translate = FALSE ) if (label) { x.max <- max(pbuild$layout$panel_params[[1]]$x.range) # Attempt to pull xdivs from x.major in ggplot2 < 3.3.0; if NULL, pull from the >= 3.3.0 slot x.divs <- pbuild$layout$panel_params[[1]]$x.major %||% attr(x = pbuild$layout$panel_params[[1]]$x$get_breaks(), which = "pos") x <- data.frame(group = sort(x = group.use), x = x.divs) label.x.pos <- tapply(X = x$x, INDEX = x$group, FUN = function(y) { if (isTRUE(x = draw.lines)) { mean(x = y[-length(x = y)]) } else { mean(x = y) } }) label.x.pos <- data.frame(group = names(x = label.x.pos), label.x.pos) plot <- plot + geom_text( stat = "identity", data = label.x.pos, aes(label = .data[['group']], x = .data[['label.x.pos']]), y = y.max + y.max * 0.03 * 0.5 + vjust, angle = angle, hjust = hjust, size = size ) plot <- suppressMessages(plot + coord_cartesian( ylim = c(0, y.max + y.max * 0.002 * max(nchar(x = levels(x = group.use))) * size), clip = 'off') ) } } plot <- plot + theme(line = element_blank()) plots[[i]] <- plot } if (combine) { plots <- wrap_plots(plots) } return(plots) } #' Hashtag oligo heatmap #' #' Draws a heatmap of hashtag oligo signals across singlets/doublets/negative cells. Allows for the visualization of HTO demultiplexing results. #' #' @param object Seurat object. Assumes that the hash tag oligo (HTO) data has been added and normalized, and demultiplexing has been run with HTODemux(). #' @param classification The naming for metadata column with classification result from HTODemux(). #' @param global.classification The slot for metadata column specifying a cell as singlet/doublet/negative. #' @param assay Hashtag assay name. #' @param ncells Number of cells to plot. Default is to choose 5000 cells by random subsampling, to avoid having to draw exceptionally large heatmaps. #' @param singlet.names Namings for the singlets. Default is to use the same names as HTOs. #' @param raster If true, plot with geom_raster, else use geom_tile. geom_raster may look blurry on #' some viewing applications such as Preview due to how the raster is interpolated. Set this to FALSE #' if you are encountering that issue (note that plots may take longer to produce/render). #' @return Returns a ggplot2 plot object. #' #' @importFrom ggplot2 guides #' @export #' @concept visualization #' #' @seealso \code{\link{HTODemux}} #' #' @examples #' \dontrun{ #' object <- HTODemux(object) #' HTOHeatmap(object) #' } #' HTOHeatmap <- function( object, assay = 'HTO', classification = paste0(assay, '_classification'), global.classification = paste0(assay, '_classification.global'), ncells = 5000, singlet.names = NULL, raster = TRUE ) { DefaultAssay(object = object) <- assay Idents(object = object) <- object[[classification, drop = TRUE]] if (ncells > ncol(x = object)) { warning("ncells (", ncells, ") is larger than the number of cells present in the provided object (", ncol(x = object), "). Plotting heatmap for all cells.") } else { object <- subset( x = object, cells = sample(x = colnames(x = object), size = ncells) ) } classification <- object[[classification]] singlets <- which(x = object[[global.classification]] == 'Singlet') singlet.ids <- sort(x = unique(x = as.character(x = classification[singlets, ]))) doublets <- which(object[[global.classification]] == 'Doublet') doublet.ids <- sort(x = unique(x = as.character(x = classification[doublets, ]))) heatmap.levels <- c(singlet.ids, doublet.ids, 'Negative') object <- ScaleData(object = object, assay = assay, verbose = FALSE) data <- FetchData(object = object, vars = singlet.ids) Idents(object = object) <- factor(x = classification[, 1], levels = heatmap.levels) plot <- SingleRasterMap( data = data, raster = raster, feature.order = rev(x = singlet.ids), cell.order = names(x = sort(x = Idents(object = object))), group.by = Idents(object = object) ) + guides(color = "none") return(plot) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Expression by identity plots #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Single cell ridge plot #' #' Draws a ridge plot of single cell data (gene expression, metrics, PC #' scores, etc.) #' #' @param object Seurat object #' @param features Features to plot (gene expression, metrics, PC scores, #' anything that can be retreived by FetchData) #' @param cols Colors to use for plotting #' @param idents Which classes to include in the plot (default is all) #' @param sort Sort identity classes (on the x-axis) by the average #' expression of the attribute being potted, can also pass 'increasing' or 'decreasing' to change sort direction #' @param assay Name of assay to use, defaults to the active assay #' @param group.by Group (color) cells in different ways (for example, orig.ident) #' @param y.max Maximum y axis value #' @param same.y.lims Set all the y-axis limits to the same values #' @param log plot the feature axis on log scale #' @param ncol Number of columns if multiple plots are displayed #' @param slot Slot to pull expression data from (e.g. "counts" or "data") #' @param layer Layer to pull expression data from (e.g. "counts" or "data") #' @param stack Horizontally stack plots for each feature #' @param combine Combine plots into a single \code{\link[patchwork]{patchwork}ed} #' ggplot object. If \code{FALSE}, return a list of ggplot #' @param fill.by Color violins/ridges based on either 'feature' or 'ident' #' #' @return A \code{\link[patchwork]{patchwork}ed} ggplot object if #' \code{combine = TRUE}; otherwise, a list of ggplot objects #' #' @export #' @concept visualization #' #' @examples #' data("pbmc_small") #' RidgePlot(object = pbmc_small, features = 'PC_1') #' RidgePlot <- function( object, features, cols = NULL, idents = NULL, sort = FALSE, assay = NULL, group.by = NULL, y.max = NULL, same.y.lims = FALSE, log = FALSE, ncol = NULL, slot = deprecated(), layer = 'data', stack = FALSE, combine = TRUE, fill.by = 'feature' ) { if (is_present(arg = slot)) { deprecate_soft( when = '5.0.0', what = 'RidgePlot(slot = )', with = 'RidgePlot(layer = )' ) layer <- slot %||% layer } return(ExIPlot( object = object, type = 'ridge', features = features, idents = idents, ncol = ncol, sort = sort, assay = assay, y.max = y.max, same.y.lims = same.y.lims, cols = cols, group.by = group.by, log = log, layer = layer, stack = stack, combine = combine, fill.by = fill.by )) } #' Single cell violin plot #' #' Draws a violin plot of single cell data (gene expression, metrics, PC #' scores, etc.) #' #' @inheritParams RidgePlot #' @param pt.size Point size for points #' @param alpha Alpha value for points #' @param split.by A factor in object metadata to split the plot by, pass 'ident' #' to split by cell identity #' @param split.plot plot each group of the split violin plots by multiple or #' single violin shapes. #' @param adjust Adjust parameter for geom_violin #' @param flip flip plot orientation (identities on x-axis) #' @param add.noise determine if adding a small noise for plotting #' @param raster Convert points to raster format. Requires 'ggrastr' to be installed. # default is \code{NULL} which automatically rasterizes if ggrastr is installed and # number of points exceed 100,000. #' @param raster.dpi the dpi for raster layer, default is 300. #' See \code{\link[ggrastr]{rasterize}} for more info. #' #' @return A \code{\link[patchwork]{patchwork}ed} ggplot object if #' \code{combine = TRUE}; otherwise, a list of ggplot objects #' #' @export #' @concept visualization #' #' @seealso \code{\link{FetchData}} #' #' @examples #' data("pbmc_small") #' VlnPlot(object = pbmc_small, features = 'PC_1') #' VlnPlot(object = pbmc_small, features = 'LYZ', split.by = 'groups') #' VlnPlot <- function( object, features, cols = NULL, pt.size = NULL, alpha = 1, idents = NULL, sort = FALSE, assay = NULL, group.by = NULL, split.by = NULL, adjust = 1, y.max = NULL, same.y.lims = FALSE, log = FALSE, ncol = NULL, slot = deprecated(), layer = NULL, split.plot = FALSE, stack = FALSE, combine = TRUE, fill.by = 'feature', flip = FALSE, add.noise = TRUE, raster = NULL, raster.dpi = 300 ) { if (is_present(arg = slot)) { deprecate_soft( when = '5.0.0', what = 'VlnPlot(slot = )', with = 'VlnPlot(layer = )' ) layer <- slot %||% layer } layer.set <- suppressWarnings( Layers( object = object, search = layer %||% 'data' ) ) if (is.null(layer) && length(layer.set) == 1 && layer.set == 'scale.data'){ warning('Default search for "data" layer yielded no results; utilizing "scale.data" layer instead.') } assay.name <- assay %||% DefaultAssay(object = object) if (is.null(layer.set) & is.null(layer) ) { warning('Default search for "data" layer in "', assay.name, '" assay yielded no results; utilizing "counts" layer instead.', call. = FALSE, immediate. = TRUE) layer.set <- Layers( object = object, search = 'counts' ) } if (is.null(layer.set)) { stop('layer "', layer,'" is not found in assay: "', assay.name, '"') } else { layer <- layer.set } if ( !is.null(x = split.by) & getOption(x = 'Seurat.warn.vlnplot.split', default = TRUE) ) { message( "The default behaviour of split.by has changed.\n", "Separate violin plots are now plotted side-by-side.\n", "To restore the old behaviour of a single split violin,\n", "set split.plot = TRUE. \nThis message will be shown once per session." ) options(Seurat.warn.vlnplot.split = FALSE) } return(ExIPlot( object = object, type = ifelse(test = split.plot, yes = 'splitViolin', no = 'violin'), features = features, idents = idents, ncol = ncol, sort = sort, assay = assay, y.max = y.max, same.y.lims = same.y.lims, adjust = adjust, pt.size = pt.size, alpha = alpha, cols = cols, group.by = group.by, split.by = split.by, log = log, layer = layer, stack = stack, combine = combine, fill.by = fill.by, flip = flip, add.noise = add.noise, raster = raster, raster.dpi = raster.dpi )) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Dimensional reduction plots #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Color dimensional reduction plot by tree split #' #' Returns a DimPlot colored based on whether the cells fall in clusters #' to the left or to the right of a node split in the cluster tree. #' #' @param object Seurat object #' @param node Node in cluster tree on which to base the split #' @param left.color Color for the left side of the split #' @param right.color Color for the right side of the split #' @param other.color Color for all other cells #' @inheritDotParams DimPlot -object #' #' @return Returns a DimPlot #' #' @export #' @concept visualization #' #' @seealso \code{\link{DimPlot}} #' #' @examples #' \dontrun{ #' if (requireNamespace("ape", quietly = TRUE)) { #' data("pbmc_small") #' pbmc_small <- BuildClusterTree(object = pbmc_small, verbose = FALSE) #' PlotClusterTree(pbmc_small) #' ColorDimSplit(pbmc_small, node = 5) #' } #' } #' ColorDimSplit <- function( object, node, left.color = 'red', right.color = 'blue', other.color = 'grey50', ... ) { CheckDots(..., fxns = 'DimPlot') tree <- Tool(object = object, slot = "BuildClusterTree") split <- tree$edge[which(x = tree$edge[, 1] == node), ][, 2] all.children <- sort(x = tree$edge[, 2][!tree$edge[, 2] %in% tree$edge[, 1]]) left.group <- DFT(tree = tree, node = split[1], only.children = TRUE) right.group <- DFT(tree = tree, node = split[2], only.children = TRUE) if (any(is.na(x = left.group))) { left.group <- split[1] } if (any(is.na(x = right.group))) { right.group <- split[2] } left.group <- MapVals(v = left.group, from = all.children, to = tree$tip.label) right.group <- MapVals(v = right.group, from = all.children, to = tree$tip.label) remaining.group <- setdiff(x = tree$tip.label, y = c(left.group, right.group)) left.cells <- WhichCells(object = object, ident = left.group) right.cells <- WhichCells(object = object, ident = right.group) remaining.cells <- WhichCells(object = object, ident = remaining.group) object <- SetIdent( object = object, cells = left.cells, value = "Left Split" ) object <- SetIdent( object = object, cells = right.cells, value = "Right Split" ) object <- SetIdent( object = object, cells = remaining.cells, value = "Not in Split" ) levels(x = object) <- c("Left Split", "Right Split", "Not in Split") colors.use = c(left.color, right.color, other.color) return(DimPlot(object = object, cols = colors.use, ...)) } #' Dimensional reduction plot #' #' Graphs the output of a dimensional reduction technique on a 2D scatter plot where each point is a #' cell and it's positioned based on the cell embeddings determined by the reduction technique. By #' default, cells are colored by their identity class (can be changed with the group.by parameter). #' #' @param object Seurat object #' @param dims Dimensions to plot, must be a two-length numeric vector specifying x- and y-dimensions #' @param cells Vector of cells to plot (default is all cells) #' @param cols Vector of colors, each color corresponds to an identity class. This may also be a single character #' or numeric value corresponding to a palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}. #' By default, ggplot2 assigns colors. We also include a number of palettes from the pals package. #' See \code{\link{DiscretePalette}} for details. #' @param pt.size Adjust point size for plotting #' @param reduction Which dimensionality reduction to use. If not specified, first searches for umap, then tsne, then pca #' @param group.by Name of one or more metadata columns to group (color) cells by #' (for example, orig.ident); pass 'ident' to group by identity class #' @param split.by A factor in object metadata to split the plot by, pass 'ident' #' to split by cell identity #' @param shape.by If NULL, all points are circles (default). You can specify any #' cell attribute (that can be pulled with FetchData) allowing for both #' different colors and different shapes on cells. Only applicable if \code{raster = FALSE}. #' @param order Specify the order of plotting for the idents. This can be #' useful for crowded plots if points of interest are being buried. Provide #' either a full list of valid idents or a subset to be plotted last (on top) #' @param shuffle Whether to randomly shuffle the order of points. This can be #' useful for crowded plots if points of interest are being buried. (default is FALSE) #' @param seed Sets the seed if randomly shuffling the order of points. #' @param label Whether to label the clusters #' @param label.size Sets size of labels #' @param label.color Sets the color of the label text #' @param label.box Whether to put a box around the label text (geom_text vs #' geom_label) #' @param alpha Alpha value for plotting (default is 1) #' @param repel Repel labels #' @param stroke.size Adjust stroke (outline) size of points #' @param cells.highlight A list of character or numeric vectors of cells to #' highlight. If only one group of cells desired, can simply #' pass a vector instead of a list. If set, colors selected cells to the color(s) #' in \code{cols.highlight} and other cells black (white if dark.theme = TRUE); #' will also resize to the size(s) passed to \code{sizes.highlight} #' @param cols.highlight A vector of colors to highlight the cells as; will #' repeat to the length groups in cells.highlight #' @param sizes.highlight Size of highlighted cells; will repeat to the length #' groups in cells.highlight. If \code{sizes.highlight = TRUE} size of all #' points will be this value. #' @param na.value Color value for NA points when using custom scale #' @param ncol Number of columns for display when combining plots #' @param combine Combine plots into a single \code{\link[patchwork]{patchwork}ed} #' ggplot object. If \code{FALSE}, return a list of ggplot objects #' @param raster Convert points to raster format, default is \code{NULL} which #' automatically rasterizes if plotting more than 100,000 cells #' @param raster.dpi Pixel resolution for rasterized plots, passed to geom_scattermore(). Default is c(512, 512). #' @param label.size.cutoff Clusters with fewer cells than the cutoff are not labeled (replaced with ' ' label) #' #' @return A \code{\link[patchwork]{patchwork}ed} ggplot object if #' \code{combine = TRUE}; otherwise, a list of ggplot objects #' #' @importFrom rlang !! #' @importFrom ggplot2 facet_wrap vars sym labs #' @importFrom patchwork wrap_plots #' #' @export #' @concept visualization #' #' @note For the old \code{do.hover} and \code{do.identify} functionality, please see #' \code{HoverLocator} and \code{CellSelector}, respectively. #' #' @aliases TSNEPlot PCAPlot ICAPlot #' @seealso \code{\link{FeaturePlot}} \code{\link{HoverLocator}} #' \code{\link{CellSelector}} \code{\link{FetchData}} #' #' @examples #' data("pbmc_small") #' DimPlot(object = pbmc_small) #' DimPlot(object = pbmc_small, split.by = 'letter.idents') #' DimPlot <- function( object, dims = c(1, 2), cells = NULL, cols = NULL, pt.size = NULL, reduction = NULL, group.by = NULL, split.by = NULL, shape.by = NULL, order = NULL, shuffle = FALSE, seed = 1, label = FALSE, label.size = 4, label.color = 'black', label.box = FALSE, repel = FALSE, alpha = 1, stroke.size = NULL, cells.highlight = NULL, cols.highlight = '#DE2D26', sizes.highlight = 1, na.value = 'grey50', ncol = NULL, combine = TRUE, raster = NULL, raster.dpi = c(512, 512), label.size.cutoff = 0 ) { if (!is_integerish(x = dims, n = 2L, finite = TRUE) || !all(dims > 0L)) { abort(message = "'dims' must be a two-length integer vector") } reduction <- reduction %||% DefaultDimReduc(object = object) # cells <- cells %||% colnames(x = object) ##### Cells for all cells in the assay. #### Cells function should not only get default layer cells <- cells %||% Cells( x = object, assay = DefaultAssay(object = object[[reduction]]) ) # data <- Embeddings(object = object[[reduction]])[cells, dims] # data <- as.data.frame(x = data) dims <- paste0(Key(object = object[[reduction]]), dims) orig.groups <- group.by group.by <- group.by %||% 'ident' if (label & (label.size.cutoff > 0)) { labels <- FetchData(object, group.by) for(i in seq_along(group.by)) { grouping_var <- group.by[i] label_table <- table(labels[,grouping_var]) invalid_labels <- names(which(label_table < label.size.cutoff)) labels[, i] <- as.character(labels[,i]) labels[which(labels[,grouping_var] %in% invalid_labels),grouping_var] <- ' ' colnames(labels)[i] <- paste0(colnames(labels)[i], "_filtered") } object <- AddMetaData(object,labels) group.by <- colnames(labels) } # check for overlap between colnames of dim reduc embeddings and metadata metadata_cols <- names(object[[]]) colname_overlap <- intersect(dims, metadata_cols) if (length(colname_overlap) > 0) { warning("Found metadata columns with the same names as requested reduction columns: ", paste(colname_overlap, collapse = ", "), ". Consider renaming these metadata column(s) to avoid conflicts with dimensionality reduction embeddings.", call. = FALSE) } data <- FetchData( object = object, vars = c(dims, group.by), cells = cells, clean = 'project' ) # cells <- rownames(x = object) # object[['ident']] <- Idents(object = object) # orig.groups <- group.by # group.by <- group.by %||% 'ident' # data <- cbind(data, object[[group.by]][cells, , drop = FALSE]) group.by <- colnames(x = data)[3:ncol(x = data)] for (group in group.by) { if (!is.factor(x = data[, group])) { data[, group] <- factor(x = data[, group]) } } if (!is.null(x = shape.by)) { data[, shape.by] <- object[[shape.by, drop = TRUE]] } if (!is.null(x = split.by)) { split <- FetchData(object = object, vars = split.by, clean=TRUE)[split.by] data <- data[rownames(split),] data[, split.by] <- split } if (isTRUE(x = shuffle)) { set.seed(seed = seed) data <- data[sample(x = 1:nrow(x = data)), ] } plots <- lapply( X = group.by, FUN = function(x) { plot <- SingleDimPlot( data = data[, c(dims, x, split.by, shape.by)], dims = dims, col.by = x, cols = cols, pt.size = pt.size, shape.by = shape.by, order = order, alpha = alpha, stroke.size = stroke.size, label = FALSE, cells.highlight = cells.highlight, cols.highlight = cols.highlight, sizes.highlight = sizes.highlight, na.value = na.value, raster = raster, raster.dpi = raster.dpi ) if (label) { plot <- LabelClusters( plot = plot, id = x, repel = repel, size = label.size, split.by = split.by, box = label.box, color = label.color ) } if (!is.null(x = split.by)) { plot <- plot + FacetTheme() + facet_wrap( facets = vars(!!sym(x = split.by)), ncol = if (length(x = group.by) > 1 || is.null(x = ncol)) { length(x = unique(x = data[, split.by])) } else { ncol } ) } plot <- if (is.null(x = orig.groups)) { plot + labs(title = NULL) } else { plot + CenterTitle() } } ) if (!is.null(x = split.by)) { ncol <- 1 } if (combine) { plots <- wrap_plots(plots, ncol = orig.groups %iff% ncol) } return(plots) } #' Visualize 'features' on a dimensional reduction plot #' #' Colors single cells on a dimensional reduction plot according to a 'feature' #' (i.e. gene expression, PC scores, number of genes detected, etc.) #' #' @inheritParams DimPlot #' @param order Boolean determining whether to plot cells in order of expression. Can be useful if #' cells expressing given feature are getting buried. #' @param features Vector of features to plot. Features can come from: #' \itemize{ #' \item An \code{Assay} feature (e.g. a gene name - "MS4A1") #' \item A column name from meta.data (e.g. mitochondrial percentage - #' "percent.mito") #' \item A column name from a \code{DimReduc} object corresponding to the #' cell embedding values (e.g. the PC 1 scores - "PC_1") #' } #' @param cols The two colors to form the gradient over. Provide as string vector with #' the first color corresponding to low values, the second to high. Also accepts a Brewer #' color scale or vector of colors. Note: this will bin the data into number of colors provided. #' When blend is \code{TRUE}, takes anywhere from 1-3 colors: #' \describe{ #' \item{1 color:}{Treated as color for double-negatives, will use default colors 2 and 3 for per-feature expression} #' \item{2 colors:}{Treated as colors for per-feature expression, will use default color 1 for double-negatives} #' \item{3+ colors:}{First color used for double-negatives, colors 2 and 3 used for per-feature expression, all others ignored} #' } #' @param min.cutoff,max.cutoff Vector of minimum and maximum cutoff values for each feature, #' may specify quantile in the form of 'q##' where '##' is the quantile (eg, 'q1', 'q10') #' @param stroke.size Adjust stroke (outline) size of points #' @param split.by A factor in object metadata to split the plot by, pass 'ident' #' to split by cell identity #' @param keep.scale How to handle the color scale across multiple plots. Options are: #' \itemize{ #' \item \dQuote{feature} (default; by row/feature scaling): The plots for #' each individual feature are scaled to the maximum expression of the #' feature across the conditions provided to \code{split.by} #' \item \dQuote{all} (universal scaling): The plots for all features and #' conditions are scaled to the maximum expression value for the feature #' with the highest overall expression #' \item \code{NULL} (no scaling): Each individual plot is scaled to the #' maximum expression value of the feature in the condition provided to #' \code{split.by}. Be aware setting \code{NULL} will result in color #' scales that are not comparable between plots #' } #' @param slot Which slot to pull expression data from? #' @param blend Scale and blend expression values to visualize coexpression of two features #' @param blend.threshold The color cutoff from weak signal to strong signal; ranges from 0 to 1. #' @param ncol Number of columns to combine multiple feature plots to, ignored if \code{split.by} is not \code{NULL} #' @param coord.fixed Plot cartesian coordinates with fixed aspect ratio #' @param by.col If splitting by a factor, plot the splits per column with the features as rows; ignored if \code{blend = TRUE} #' @param sort.cell Redundant with \code{order}. This argument is being #' deprecated. Please use \code{order} instead. #' @param interactive Launch an interactive \code{\link[Seurat:IFeaturePlot]{FeaturePlot}} #' @param combine Combine plots into a single \code{\link[patchwork]{patchwork}ed} #' ggplot object. If \code{FALSE}, return a list of ggplot objects #' #' @return A \code{\link[patchwork]{patchwork}ed} ggplot object if #' \code{combine = TRUE}; otherwise, a list of ggplot objects #' #' @importFrom grDevices rgb #' @importFrom patchwork wrap_plots #' @importFrom cowplot theme_cowplot #' @importFrom RColorBrewer brewer.pal.info #' @importFrom ggplot2 labs scale_x_continuous scale_y_continuous theme element_rect #' dup_axis guides element_blank element_text margin scale_color_brewer scale_color_gradientn #' scale_color_manual coord_fixed ggtitle #' #' @export #' @concept visualization #' #' @note For the old \code{do.hover} and \code{do.identify} functionality, please see #' \code{HoverLocator} and \code{CellSelector}, respectively. #' #' @aliases FeatureHeatmap #' @seealso \code{\link{DimPlot}} \code{\link{HoverLocator}} #' \code{\link{CellSelector}} #' #' @examples #' data("pbmc_small") #' FeaturePlot(object = pbmc_small, features = 'PC_1') #' FeaturePlot <- function( object, features, dims = c(1, 2), cells = NULL, cols = if (blend) { c('lightgrey', '#ff0000', '#00ff00') } else { c('lightgrey', 'blue') }, pt.size = NULL, alpha = 1, stroke.size = NULL, order = FALSE, min.cutoff = NA, max.cutoff = NA, reduction = NULL, split.by = NULL, keep.scale = "feature", shape.by = NULL, slot = 'data', blend = FALSE, blend.threshold = 0.5, label = FALSE, label.size = 4, label.color = "black", repel = FALSE, ncol = NULL, coord.fixed = FALSE, by.col = TRUE, sort.cell = deprecated(), interactive = FALSE, combine = TRUE, raster = NULL, raster.dpi = c(512, 512) ) { # TODO: deprecate fully on 3.2.0 if (is_present(arg = sort.cell)) { deprecate_stop( when = '4.9.0', what = 'FeaturePlot(sort.cell = )', with = 'FeaturePlot(order = )' ) } if (isTRUE(x = interactive)) { return(IFeaturePlot( object = object, feature = features[1], dims = dims, reduction = reduction, slot = slot )) } # Check keep.scale param for valid entries if (!is.null(x = keep.scale)) { keep.scale <- arg_match0(arg = keep.scale, values = c('feature', 'all')) } # Set a theme to remove right-hand Y axis lines # Also sets right-hand Y axis text label formatting no.right <- theme( axis.line.y.right = element_blank(), axis.ticks.y.right = element_blank(), axis.text.y.right = element_blank(), axis.title.y.right = element_text( face = "bold", size = 14, margin = margin(r = 7) ) ) # Get the DimReduc to use reduction <- reduction %||% DefaultDimReduc(object = object) if (!is_integerish(x = dims, n = 2L, finite = TRUE) && !all(dims > 0L)) { abort(message = "'dims' must be a two-length integer vector") } # Figure out blending stuff if (isTRUE(x = blend) && length(x = features) != 2) { abort(message = "Blending feature plots only works with two features") } # Set color scheme for blended FeaturePlots if (isTRUE(x = blend)) { default.colors <- eval(expr = formals(fun = FeaturePlot)$cols) cols <- switch( EXPR = as.character(x = length(x = cols)), '0' = { warn(message = "No colors provided, using default colors") default.colors }, '1' = { warn(message = paste( "Only one color provided, assuming", sQuote(x = cols), "is double-negative and augmenting with default colors" )) c(cols, default.colors[2:3]) }, '2' = { warn(message = paste( "Only two colors provided, assuming specified are for features and agumenting with", sQuote(default.colors[1]), "for double-negatives", )) c(default.colors[1], cols) }, '3' = cols, { warn(message = "More than three colors provided, using only first three") cols[1:3] } ) } if (isTRUE(x = blend) && length(x = cols) != 3) { abort("Blending feature plots only works with three colors; first one for negative cells") } # Name the reductions dims <- paste0(Key(object = object[[reduction]]), dims) cells <- cells %||% Cells(x = object[[reduction]]) # Get plotting data data <- FetchData( object = object, vars = c(dims, 'ident', features), cells = cells, layer = slot ) # Check presence of features/dimensions if (ncol(x = data) < 4) { abort(message = paste( "None of the requested features were found:", paste(features, collapse = ', '), "in slot ", slot )) } else if (!all(dims %in% colnames(x = data))) { abort(message = "The dimensions requested were not found") } features <- setdiff(x = names(x = data), y = c(dims, 'ident')) # Determine cutoffs min.cutoff <- mapply( FUN = function(cutoff, feature) { return(ifelse( test = is.na(x = cutoff), yes = min(data[, feature]), no = cutoff )) }, cutoff = min.cutoff, feature = features ) max.cutoff <- mapply( FUN = function(cutoff, feature) { return(ifelse( test = is.na(x = cutoff), yes = max(data[, feature]), no = cutoff )) }, cutoff = max.cutoff, feature = features ) check.lengths <- unique(x = vapply( X = list(features, min.cutoff, max.cutoff), FUN = length, FUN.VALUE = numeric(length = 1) )) if (length(x = check.lengths) != 1) { abort( message = "There must be the same number of minimum and maximum cuttoffs as there are features" ) } names(x = min.cutoff) <- names(x = max.cutoff) <- features brewer.gran <- ifelse( test = length(x = cols) == 1, yes = brewer.pal.info[cols, ]$maxcolors, no = length(x = cols) ) # Apply cutoffs for (i in seq_along(along.with = features)) { f <- features[i] data.feature <- data[[f]] min.use <- SetQuantile(cutoff = min.cutoff[f], data = data.feature) max.use <- SetQuantile(cutoff = max.cutoff[f], data = data.feature) data.feature[data.feature < min.use] <- min.use data.feature[data.feature > max.use] <- max.use if (brewer.gran != 2) { data.feature <- if (all(data.feature == 0)) { rep_len(x = 0, length.out = length(x = data.feature)) } else { as.numeric(x = as.factor(x = cut( x = as.numeric(x = data.feature), breaks = 2 ))) } } data[[f]] <- data.feature } # Figure out splits (FeatureHeatmap) data$split <- if (is.null(x = split.by)) { RandomName() } else { switch( EXPR = split.by, ident = Idents(object = object)[cells, drop = TRUE], object[[split.by, drop = TRUE]][cells, drop = TRUE] ) } if (!is.factor(x = data$split)) { data$split <- factor(x = data$split) } # Set shaping variable if (!is.null(x = shape.by)) { data[, shape.by] <- object[[shape.by, drop = TRUE]] } # Make list of plots plots <- vector( mode = "list", length = ifelse( test = blend, yes = 4, no = length(x = features) * length(x = levels(x = data$split)) ) ) # Apply common limits xlims <- c(floor(x = min(data[, dims[1]])), ceiling(x = max(data[, dims[1]]))) ylims <- c(floor(min(data[, dims[2]])), ceiling(x = max(data[, dims[2]]))) # Set blended colors if (blend) { ncol <- 4 color.matrix <- BlendMatrix( two.colors = cols[2:3], col.threshold = blend.threshold, negative.color = cols[1] ) cols <- cols[2:3] colors <- list( color.matrix[, 1], color.matrix[1, ], as.vector(x = color.matrix) ) } # Make the plots for (i in 1:length(x = levels(x = data$split))) { # Figure out which split we're working with ident <- levels(x = data$split)[i] data.plot <- data[as.character(x = data$split) == ident, , drop = FALSE] # Blend expression values if (isTRUE(x = blend)) { features <- features[1:2] no.expression <- features[colMeans(x = data.plot[, features]) == 0] if (length(x = no.expression) != 0) { abort(message = paste( "The following features have no value:", paste(no.expression, collapse = ', ') )) } data.plot <- cbind(data.plot[, c(dims, 'ident')], BlendExpression(data = data.plot[, features[1:2]])) features <- colnames(x = data.plot)[4:ncol(x = data.plot)] } # Make per-feature plots for (j in 1:length(x = features)) { feature <- features[j] # Get blended colors if (isTRUE(x = blend)) { cols.use <- as.numeric(x = as.character(x = data.plot[, feature])) + 1 cols.use <- colors[[j]][sort(x = unique(x = cols.use))] } else { cols.use <- NULL } data.single <- data.plot[, c(dims, 'ident', feature, shape.by)] # Make the plot plot <- SingleDimPlot( data = data.single, dims = dims, col.by = feature, order = order, pt.size = pt.size, alpha = alpha, stroke.size = stroke.size, cols = cols.use, shape.by = shape.by, label = FALSE, raster = raster, raster.dpi = raster.dpi ) + scale_x_continuous(limits = xlims) + scale_y_continuous(limits = ylims) + theme_cowplot() + CenterTitle() # theme(plot.title = element_text(hjust = 0.5)) # Add labels if (isTRUE(x = label)) { plot <- LabelClusters( plot = plot, id = 'ident', repel = repel, size = label.size, color = label.color ) } # Make FeatureHeatmaps look nice(ish) if (length(x = levels(x = data$split)) > 1) { plot <- plot + theme(panel.border = element_rect(fill = NA, colour = 'black')) # Add title plot <- plot + if (i == 1) { labs(title = feature) } else { labs(title = NULL) } # Add second axis if (j == length(x = features) && !blend) { suppressMessages( expr = plot <- plot + scale_y_continuous( sec.axis = dup_axis(name = ident), limits = ylims ) + no.right ) } # Remove left Y axis if (j != 1) { plot <- plot + theme( axis.line.y = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(), axis.title.y.left = element_blank() ) } # Remove bottom X axis if (i != length(x = levels(x = data$split))) { plot <- plot + theme( axis.line.x = element_blank(), axis.ticks.x = element_blank(), axis.text.x = element_blank(), axis.title.x = element_blank() ) } } else { plot <- plot + labs(title = feature) } # Add colors scale for normal FeaturePlots if (!blend) { plot <- plot + guides(color = NULL) cols.grad <- cols if (length(x = cols) == 1) { plot <- plot + scale_color_brewer(palette = cols) } else if (length(x = cols) > 1) { unique.feature.exp <- unique(data.plot[, feature]) if (length(unique.feature.exp) == 1) { warn(message = paste0( "All cells have the same value (", unique.feature.exp, ") of ", dQuote(x = feature) )) if (unique.feature.exp == 0) { cols.grad <- cols[1] } else{ cols.grad <- cols } } plot <- suppressMessages( expr = plot + scale_color_gradientn( colors = cols.grad, guide = "colorbar" ) ) } } if (!(is.null(x = keep.scale)) && keep.scale == "feature" && !blend) { max.feature.value <- max(data[, feature]) min.feature.value <- min(data[, feature]) plot <- suppressMessages(plot & scale_color_gradientn(colors = cols, limits = c(min.feature.value, max.feature.value))) } # Add coord_fixed if (coord.fixed) { plot <- plot + coord_fixed() } # I'm not sure why, but sometimes the damn thing fails without this # Thanks ggplot2 plot <- plot # Place the plot plots[[(length(x = features) * (i - 1)) + j]] <- plot } } # Add blended color key if (isTRUE(x = blend)) { blend.legend <- BlendMap(color.matrix = color.matrix) for (ii in 1:length(x = levels(x = data$split))) { suppressMessages(expr = plots <- append( x = plots, values = list( blend.legend + scale_y_continuous( sec.axis = dup_axis(name = ifelse( test = length(x = levels(x = data$split)) > 1, yes = levels(x = data$split)[ii], no = '' )), expand = c(0, 0) ) + labs( x = features[1], y = features[2], title = if (ii == 1) { paste('Color threshold:', blend.threshold) } else { NULL } ) + no.right ), after = 4 * ii - 1 )) } } # Remove NULL plots plots <- Filter(f = Negate(f = is.null), x = plots) # Combine the plots if (is.null(x = ncol)) { ncol <- 2 if (length(x = features) == 1) { ncol <- 1 } if (length(x = features) > 6) { ncol <- 3 } if (length(x = features) > 9) { ncol <- 4 } } ncol <- ifelse( test = is.null(x = split.by) || isTRUE(x = blend), yes = ncol, no = length(x = features) ) legend <- if (isTRUE(x = blend)) { 'none' } else { split.by %iff% 'none' } # Transpose the FeatureHeatmap matrix (not applicable for blended FeaturePlots) if (isTRUE(x = combine)) { if (by.col && !is.null(x = split.by) && !blend) { plots <- lapply( X = plots, FUN = function(x) { return(suppressMessages( expr = x + theme_cowplot() + ggtitle("") + scale_y_continuous(sec.axis = dup_axis(name = ""), limits = ylims) + no.right )) } ) nsplits <- length(x = levels(x = data$split)) idx <- 1 for (i in (length(x = features) * (nsplits - 1) + 1):(length(x = features) * nsplits)) { plots[[i]] <- suppressMessages( expr = plots[[i]] + scale_y_continuous( sec.axis = dup_axis(name = features[[idx]]), limits = ylims ) + no.right ) idx <- idx + 1 } idx <- 1 for (i in which(x = 1:length(x = plots) %% length(x = features) == 1)) { plots[[i]] <- plots[[i]] + ggtitle(levels(x = data$split)[[idx]]) + theme(plot.title = element_text(hjust = 0.5)) idx <- idx + 1 } idx <- 1 if (length(x = features) == 1) { for (i in 1:length(x = plots)) { plots[[i]] <- plots[[i]] + ggtitle(levels(x = data$split)[[idx]]) + theme(plot.title = element_text(hjust = 0.5)) idx <- idx + 1 } ncol <- 1 nrow <- nsplits } else { nrow <- split.by %iff% length(x = levels(x = data$split)) } plots <- plots[c(do.call( what = rbind, args = split( x = 1:length(x = plots), f = ceiling(x = seq_along(along.with = 1:length(x = plots)) / length(x = features)) ) ))] # Set ncol to number of splits (nrow) and nrow to number of features (ncol) plots <- wrap_plots(plots, ncol = nrow, nrow = ncol) if (!is.null(x = legend) && legend == 'none') { plots <- plots & NoLegend() } } else { plots <- wrap_plots(plots, ncol = ncol, nrow = split.by %iff% length(x = levels(x = data$split))) } if (!is.null(x = legend) && legend == 'none') { plots <- plots & NoLegend() } if (!(is.null(x = keep.scale)) && keep.scale == "all" && !blend) { max.feature.value <- max(data[, features]) min.feature.value <- min(data[, features]) plots <- suppressMessages(plots & scale_color_gradientn(colors = cols, limits = c(min.feature.value, max.feature.value))) } } return(plots) } #' Visualize features in dimensional reduction space interactively #' #' @inheritParams FeaturePlot #' @param feature Feature to plot #' #' @return Returns the final plot as a ggplot object #' #' @importFrom cowplot theme_cowplot #' @importFrom ggplot2 theme element_text guides scale_color_gradientn #' @importFrom miniUI miniPage miniButtonBlock miniTitleBarButton miniContentPanel #' @importFrom shiny fillRow sidebarPanel selectInput plotOutput reactiveValues #' observeEvent stopApp observe updateSelectInput renderPlot runGadget #' #' @export #' @concept visualization #' IFeaturePlot <- function(object, feature, dims = c(1, 2), reduction = NULL, slot = 'data') { # Set initial data values feature.label <- 'Feature to visualize' assay.keys <- Key(object = object)[Assays(object = object)] keyed <- sapply(X = assay.keys, FUN = grepl, x = feature) assay <- if (any(keyed)) { names(x = which(x = keyed))[1] } else { DefaultAssay(object = object) } features <- sort(x = rownames(x = GetAssayData( object = object, layer = slot, assay = assay ))) assays.use <- vapply( X = Assays(object = object), FUN = function(x) { return(!IsMatrixEmpty(x = GetAssayData( object = object, layer = slot, assay = x ))) }, FUN.VALUE = logical(length = 1L) ) assays.use <- sort(x = Assays(object = object)[assays.use]) reduction <- reduction %||% DefaultDimReduc(object = object) dims.reduc <- gsub( pattern = Key(object = object[[reduction]]), replacement = '', x = colnames(x = object[[reduction]]) ) # Set up the gadget UI ui <- miniPage( miniButtonBlock(miniTitleBarButton( inputId = 'done', label = 'Done', primary = TRUE )), miniContentPanel( fillRow( sidebarPanel( selectInput( inputId = 'assay', label = 'Assay', choices = assays.use, selected = assay, selectize = FALSE, width = '100%' ), selectInput( inputId = 'feature', label = feature.label, choices = features, selected = feature, selectize = FALSE, width = '100%' ), selectInput( inputId = 'reduction', label = 'Dimensional reduction', choices = Reductions(object = object), selected = reduction, selectize = FALSE, width = '100%' ), selectInput( inputId = 'xdim', label = 'X dimension', choices = dims.reduc, selected = as.character(x = dims[1]), selectize = FALSE, width = '100%' ), selectInput( inputId = 'ydim', label = 'Y dimension', choices = dims.reduc, selected = as.character(x = dims[2]), selectize = FALSE, width = '100%' ), selectInput( inputId = 'palette', label = 'Color scheme', choices = names(x = FeaturePalettes), selected = 'Seurat', selectize = FALSE, width = '100%' ), width = '100%' ), plotOutput(outputId = 'plot', height = '100%'), flex = c(1, 4) ) ) ) # Prepare plotting data dims <- paste0(Key(object = object[[reduction]]), dims) plot.data <- FetchData(object = object, vars = c(dims, feature), layer = slot) # Shiny server server <- function(input, output, session) { plot.env <- reactiveValues( data = plot.data, dims = paste0(Key(object = object[[reduction]]), dims), feature = feature, palette = 'Seurat' ) # Observe events observeEvent( eventExpr = input$done, handlerExpr = stopApp(returnValue = plot.env$plot) ) observe(x = { assay <- input$assay feature.use <- input$feature features.assay <- sort(x = rownames(x = GetAssayData( object = object, layer = slot, assay = assay ))) feature.use <- ifelse( test = feature.use %in% features.assay, yes = feature.use, no = features.assay[1] ) reduc <- input$reduction dims.reduc <- gsub( pattern = Key(object = object[[reduc]]), replacement = '', x = colnames(x = object[[reduc]]) ) dims <- c(input$xdim, input$ydim) for (i in seq_along(along.with = dims)) { if (!dims[i] %in% dims.reduc) { dims[i] <- dims.reduc[i] } } updateSelectInput( session = session, inputId = 'xdim', label = 'X dimension', choices = dims.reduc, selected = as.character(x = dims[1]) ) updateSelectInput( session = session, inputId = 'ydim', label = 'Y dimension', choices = dims.reduc, selected = as.character(x = dims[2]) ) updateSelectInput( session = session, inputId = 'feature', label = feature.label, choices = features.assay, selected = feature.use ) }) observe(x = { feature.use <- input$feature feature.keyed <- paste0(Key(object = object[[input$assay]]), feature.use) reduc <- input$reduction dims <- c(input$xdim, input$ydim) dims <- paste0(Key(object = object[[reduc]]), dims) plot.data <- tryCatch( expr = FetchData( object = object, vars = c(dims, feature.keyed), layer = slot ), warning = function(...) { return(plot.env$data) }, error = function(...) { return(plot.env$data) } ) dims <- colnames(x = plot.data)[1:2] colnames(x = plot.data) <- c(dims, feature.use) plot.env$data <- plot.data plot.env$feature <- feature.use plot.env$dims <- dims }) observe(x = { plot.env$palette <- input$palette }) # Create the plot output$plot <- renderPlot(expr = { plot.env$plot <- SingleDimPlot( data = plot.env$data, dims = plot.env$dims, col.by = plot.env$feature, label = FALSE ) + theme_cowplot() + theme(plot.title = element_text(hjust = 0.5)) + guides(color = NULL) + scale_color_gradientn( colors = FeaturePalettes[[plot.env$palette]], guide = 'colorbar' ) plot.env$plot }) } runGadget(app = ui, server = server) } #' Highlight Neighbors in DimPlot #' #' It will color the query cells and the neighbors of the query cells in the #' DimPlot #' #' @inheritParams DimPlot #' @param nn.idx the neighbor index of all cells #' @param query.cells cells used to find their neighbors #' @param show.all.cells Show all cells or only query and neighbor cells #' #' @inherit DimPlot return #' #' @export #' @concept visualization #' NNPlot <- function( object, reduction, nn.idx, query.cells, dims = 1:2, label = FALSE, label.size = 4, repel = FALSE, sizes.highlight = 2, pt.size = 1, cols.highlight = c("#377eb8", "#e41a1c"), na.value = "#bdbdbd", order = c("self", "neighbors", "other"), show.all.cells = TRUE, ... ) { if (inherits(x = nn.idx, what = 'Neighbor')) { rownames(x = slot(object = nn.idx, name = 'nn.idx')) <- Cells(x = nn.idx) nn.idx <- Indices(object = nn.idx) } if (length(x = query.cells) > 1) { neighbor.cells <- apply( X = nn.idx[query.cells, -1], MARGIN = 2, FUN = function(x) { return(Cells(x = object)[x]) } ) } else { neighbor.cells <- Cells(x = object)[nn.idx[query.cells , -1]] } neighbor.cells <- as.vector(x = neighbor.cells) neighbor.cells <- neighbor.cells[!is.na(x = neighbor.cells)] object[["nn.col"]] <- "other" object[["nn.col"]][neighbor.cells, ] <- "neighbors" object[["nn.col"]][query.cells, ] <- "self" object$nn.col <- factor( x = object$nn.col, levels = c("self", "neighbors", "other") ) if (!show.all.cells) { object <- subset( x = object, cells = Cells(x = object)[which(x = object[["nn.col"]] != "other")] ) nn.cols <- c(rev(x = cols.highlight)) nn.pt.size <- sizes.highlight } else { highlight.info <- SetHighlight( cells.highlight = c(query.cells, neighbor.cells), cells.all = Cells(x = object), sizes.highlight = sizes.highlight, pt.size = pt.size, cols.highlight = "red" ) nn.cols <- c(na.value, rev(x = cols.highlight)) nn.pt.size <- highlight.info$size } NN.plot <- DimPlot( object = object, reduction = reduction, dims = dims, group.by = "nn.col", cols = nn.cols, label = label, order = order, pt.size = nn.pt.size , label.size = label.size, repel = repel ) return(NN.plot) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Scatter plots #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Cell-cell scatter plot #' #' Creates a plot of scatter plot of features across two single cells. Pearson #' correlation between the two cells is displayed above the plot. #' #' @inheritParams FeatureScatter #' @inheritParams DimPlot #' @param cell1 Cell 1 name #' @param cell2 Cell 2 name #' @param features Features to plot (default, all features) #' @param highlight Features to highlight #' @return A ggplot object #' #' @export #' @concept visualization #' #' @aliases CellPlot #' #' @examples #' data("pbmc_small") #' CellScatter(object = pbmc_small, cell1 = 'ATAGGAGAAACAGA', cell2 = 'CATCAGGATGCACA') #' CellScatter <- function( object, cell1, cell2, features = NULL, highlight = NULL, cols = NULL, pt.size = 1, smooth = FALSE, raster = NULL, raster.dpi = c(512, 512) ) { features <- features %||% rownames(x = object) data <- FetchData( object = object, vars = features, cells = c(cell1, cell2) ) data <- as.data.frame(x = t(x = data)) plot <- SingleCorPlot( data = data, cols = cols, pt.size = pt.size, rows.highlight = highlight, smooth = smooth, raster = raster, raster.dpi = raster.dpi ) return(plot) } #' Scatter plot of single cell data #' #' Creates a scatter plot of two features (typically feature expression), across a #' set of single cells. Cells are colored by their identity class. Pearson #' correlation between the two features is displayed above the plot. #' #' @param object Seurat object #' @param feature1 First feature to plot. Typically feature expression but can also #' be metrics, PC scores, etc. - anything that can be retreived with FetchData #' @param feature2 Second feature to plot. #' @param cells Cells to include on the scatter plot. #' @param shuffle Whether to randomly shuffle the order of points. This can be #' useful for crowded plots if points of interest are being buried. (default is FALSE) #' @param seed Sets the seed if randomly shuffling the order of points. #' @param group.by Name of one or more metadata columns to group (color) cells by #' (for example, orig.ident); pass 'ident' to group by identity class #' @param cols Colors to use for identity class plotting. #' @param pt.size Size of the points on the plot #' @param shape.by Ignored for now #' @param split.by A factor in object metadata to split the feature plot by, pass 'ident' #' to split by cell identity #' @param span Spline span in loess function call, if \code{NULL}, no spline added #' @param smooth Smooth the graph (similar to smoothScatter) #' @param slot Slot to pull data from, should be one of 'counts', 'data', or 'scale.data' #' @param combine Combine plots into a single \code{\link[patchwork]{patchwork}ed} #' @param plot.cor Display correlation in plot title #' @param ncol Number of columns if plotting multiple plots #' @param raster Convert points to raster format, default is \code{NULL} #' which will automatically use raster if the number of points plotted is greater than #' 100,000 #' @param raster.dpi Pixel resolution for rasterized plots, passed to geom_scattermore(). #' Default is c(512, 512). #' @param jitter Jitter for easier visualization of crowded points (default is FALSE) #' @param log Plot features on the log scale (default is FALSE) #' #' @return A ggplot object #' #' @importFrom ggplot2 geom_smooth facet_wrap vars sym labs #' @importFrom patchwork wrap_plots #' #' @export #' @concept visualization #' #' @aliases GenePlot #' #' @examples #' data("pbmc_small") #' FeatureScatter(object = pbmc_small, feature1 = 'CD9', feature2 = 'CD3E') #' FeatureScatter <- function( object, feature1, feature2, cells = NULL, shuffle = FALSE, seed = 1, group.by = NULL, split.by = NULL, cols = NULL, pt.size = 1, shape.by = NULL, span = NULL, smooth = FALSE, combine = TRUE, slot = 'data', plot.cor = TRUE, ncol = NULL, raster = NULL, raster.dpi = c(512, 512), jitter = FALSE, log = FALSE ) { cells <- cells %||% colnames(x = object) if (isTRUE(x = shuffle)) { set.seed(seed = seed) cells <- sample(x = cells) } group.by <- group.by %||% 'ident' data <- FetchData( object = object, vars = c(feature1, feature2, group.by), cells = cells, layer = slot ) if (!grepl(pattern = feature1, x = names(x = data)[1], fixed = TRUE)) { abort(message = paste("Feature 1", sQuote(x = feature1), "not found")) } if (!grepl(pattern = feature2, x = names(x = data)[2], fixed = TRUE)) { abort(message = paste("Feature 2", sQuote(x = feature2), "not found")) } feature1 <- names(x = data)[1] feature2 <- names(x = data)[2] group.by <- intersect(x = group.by, y = names(x = data)[3:ncol(x = data)]) for (group in group.by) { if (!is.factor(x = data[, group])) { data[, group] <- factor(x = data[, group]) } } if (!is.null(x = split.by)) { split <- FetchData(object = object, vars = split.by, clean=TRUE)[split.by] data <- data[rownames(split),] data[, split.by] <- split } plots <- lapply( X = group.by, FUN = function(x) { plot <- SingleCorPlot( data = data[,c(feature1, feature2, split.by)], col.by = data[, x], cols = cols, pt.size = pt.size, smooth = smooth, legend.title = 'Identity', span = span, plot.cor = plot.cor, raster = raster, raster.dpi = raster.dpi, jitter = jitter ) if (!is.null(x = split.by)) { plot <- plot + FacetTheme() + facet_wrap( facets = vars(!!sym(x = split.by)), ncol = if (length(x = group.by) > 1 || is.null(x = ncol)) { length(x = unique(x = data[, split.by])) } else { ncol } ) } if (log) { plot <- plot + scale_x_log10() + scale_y_log10() } plot } ) if (isTRUE(x = length(x = plots) == 1)) { return(plots[[1]]) } if (isTRUE(x = combine)) { plots <- wrap_plots(plots, ncol = length(x = group.by)) } return(plots) } #' View variable features #' #' @inheritParams FeatureScatter #' @inheritParams SeuratObject::HVFInfo #' @param cols Colors to specify non-variable/variable status #' @param assay Assay to pull variable features from #' @param log Plot the x-axis in log scale #' @param raster Convert points to raster format, default is \code{NULL} #' which will automatically use raster if the number of points plotted is greater than #' 100,000 #' #' @return A ggplot object #' #' @importFrom ggplot2 labs scale_color_manual scale_x_log10 #' @export #' @concept visualization #' #' @aliases VariableGenePlot MeanVarPlot #' #' @seealso \code{\link{FindVariableFeatures}} #' #' @examples #' data("pbmc_small") #' VariableFeaturePlot(object = pbmc_small) #' VariableFeaturePlot <- function( object, cols = c('black', 'red'), pt.size = 1, log = NULL, selection.method = NULL, assay = NULL, raster = NULL, raster.dpi = c(512, 512) ) { if (length(x = cols) != 2) { stop("'cols' must be of length 2") } hvf.info <- HVFInfo( object = object, assay = assay, method = selection.method, status = TRUE ) status.col <- colnames(hvf.info)[grepl("variable", colnames(hvf.info))][[1]] var.status <- c('no', 'yes')[unlist(hvf.info[[status.col]]) + 1] if (colnames(x = hvf.info)[3] == 'dispersion.scaled') { hvf.info <- hvf.info[, c(1, 2)] } else if (colnames(x = hvf.info)[3] == 'variance.expected') { hvf.info <- hvf.info[, c(1, 4)] } else { hvf.info <- hvf.info[, c(1, 3)] } axis.labels <- switch( EXPR = colnames(x = hvf.info)[2], 'variance.standardized' = c('Average Expression', 'Standardized Variance'), 'dispersion' = c('Average Expression', 'Dispersion'), 'residual_variance' = c('Geometric Mean of Expression', 'Residual Variance') ) log <- log %||% (any(c('variance.standardized', 'residual_variance') %in% colnames(x = hvf.info))) # var.features <- VariableFeatures(object = object, assay = assay) # var.status <- ifelse( # test = rownames(x = hvf.info) %in% var.features, # yes = 'yes', # no = 'no' # ) plot <- SingleCorPlot( data = hvf.info, col.by = var.status, pt.size = pt.size, raster = raster, raster.dpi = raster.dpi ) if (length(x = unique(x = var.status)) == 1) { switch( EXPR = var.status[1], 'yes' = { cols <- cols[2] labels.legend <- 'Variable' }, 'no' = { cols <- cols[1] labels.legend <- 'Non-variable' } ) } else { labels.legend <- c('Non-variable', 'Variable') } plot <- plot + labs(title = NULL, x = axis.labels[1], y = axis.labels[2]) + scale_color_manual( labels = paste(labels.legend, 'count:', table(var.status)), values = cols ) if (log) { plot <- plot + scale_x_log10() } return(plot) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Polygon Plots #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Polygon DimPlot #' #' Plot cells as polygons, rather than single points. Color cells by identity, or a categorical variable #' in metadata #' #' @inheritParams PolyFeaturePlot #' @param group.by A grouping variable present in the metadata. Default is to use the groupings present #' in the current cell identities (\code{Idents(object = object)}) #' #' @return Returns a ggplot object #' #' @export #' @concept visualization #' PolyDimPlot <- function( object, group.by = NULL, cells = NULL, poly.data = 'spatial', flip.coords = FALSE ) { polygons <- Misc(object = object, slot = poly.data) if (is.null(x = polygons)) { stop("Could not find polygon data in misc slot") } group.by <- group.by %||% 'ident' group.data <- FetchData( object = object, vars = group.by, cells = cells ) group.data$cell <- rownames(x = group.data) data <- merge(x = polygons, y = group.data, by = 'cell') if (flip.coords) { coord.x <- data$x data$x <- data$y data$y <- coord.x } plot <- SinglePolyPlot(data = data, group.by = group.by) return(plot) } #' Polygon FeaturePlot #' #' Plot cells as polygons, rather than single points. Color cells by any value #' accessible by \code{\link{FetchData}}. #' #' @inheritParams FeaturePlot #' @param poly.data Name of the polygon dataframe in the misc slot #' @param ncol Number of columns to split the plot into #' @param common.scale ... #' @param flip.coords Flip x and y coordinates #' #' @return Returns a ggplot object #' #' @importFrom ggplot2 scale_fill_viridis_c facet_wrap #' #' @export #' @concept visualization #' @concept spatial #' PolyFeaturePlot <- function( object, features, cells = NULL, poly.data = 'spatial', ncol = ceiling(x = length(x = features) / 2), min.cutoff = 0, max.cutoff = NA, common.scale = TRUE, flip.coords = FALSE ) { polygons <- Misc(object = object, slot = poly.data) if (is.null(x = polygons)) { stop("Could not find polygon data in misc slot") } assay.data <- FetchData( object = object, vars = features, cells = cells ) features <- colnames(x = assay.data) cells <- rownames(x = assay.data) min.cutoff <- mapply( FUN = function(cutoff, feature) { return(ifelse( test = is.na(x = cutoff), yes = min(assay.data[, feature]), no = cutoff )) }, cutoff = min.cutoff, feature = features ) max.cutoff <- mapply( FUN = function(cutoff, feature) { return(ifelse( test = is.na(x = cutoff), yes = max(assay.data[, feature]), no = cutoff )) }, cutoff = max.cutoff, feature = features ) check.lengths <- unique(x = vapply( X = list(features, min.cutoff, max.cutoff), FUN = length, FUN.VALUE = numeric(length = 1) )) if (length(x = check.lengths) != 1) { stop("There must be the same number of minimum and maximum cuttoffs as there are features") } assay.data <- mapply( FUN = function(feature, min, max) { return(ScaleColumn(vec = assay.data[, feature], cutoffs = c(min, max))) }, feature = features, min = min.cutoff, max = max.cutoff ) if (common.scale) { assay.data <- apply( X = assay.data, MARGIN = 2, FUN = function(x) { return(x - min(x)) } ) assay.data <- t( x = t(x = assay.data) / apply(X = assay.data, MARGIN = 2, FUN = max) ) } assay.data <- as.data.frame(x = assay.data) assay.data <- data.frame( cell = as.vector(x = replicate(n = length(x = features), expr = cells)), feature = as.vector(x = t(x = replicate(n = length(x = cells), expr = features))), expression = unlist(x = assay.data, use.names = FALSE) ) data <- merge(x = polygons, y = assay.data, by = 'cell') data$feature <- factor(x = data$feature, levels = features) if (flip.coords) { coord.x <- data$x data$x <- data$y data$y <- coord.x } plot <- SinglePolyPlot(data = data, group.by = 'expression', font_size = 8) + scale_fill_viridis_c() + facet_wrap(facets = 'feature', ncol = ncol) return(plot) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Spatial Plots #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Spatial Cluster Plots #' #' Visualize clusters or other categorical groupings in a spatial context #' #' @inheritParams DimPlot #' @inheritParams SingleImagePlot #' @param object A \code{\link[SeuratObject]{Seurat}} object #' @param fov Name of FOV to plot #' @param boundaries A vector of segmentation boundaries per image to plot; #' can be a character vector, a named character vector, or a named list. #' Names should be the names of FOVs and values should be the names of #' segmentation boundaries #' @param molecules A vector of molecules to plot #' @param nmols Max number of each molecule specified in `molecules` to plot #' @param dark.background Set plot background to black #' @param crop Crop the plots to area with cells only #' @param overlap Overlay boundaries from a single image to create a single #' plot; if \code{TRUE}, then boundaries are stacked in the order they're #' given (first is lowest) #' @param axes Keep axes and panel background #' @param combine Combine plots into a single #' \code{patchwork} ggplot object.If \code{FALSE}, #' return a list of ggplot objects #' @param coord.fixed Plot cartesian coordinates with fixed aspect ratio #' @param flip_xy Flag to flip X and Y axes. Default is FALSE. #' #' @return If \code{combine = TRUE}, a \code{patchwork} #' ggplot object; otherwise, a list of ggplot objects #' #' @importFrom rlang !! is_na sym #' @importFrom patchwork wrap_plots #' @importFrom ggplot2 element_blank facet_wrap vars #' @importFrom SeuratObject DefaultFOV Cells #' DefaultBoundary FetchData Images Overlay #' #' @export #' @concept visualization #' @concept spatial #' ImageDimPlot <- function( object, fov = NULL, boundaries = NULL, group.by = NULL, split.by = NULL, cols = NULL, shuffle.cols = FALSE, size = 0.5, molecules = NULL, mols.size = 0.1, mols.cols = NULL, mols.alpha = 1.0, nmols = 1000, alpha = 1.0, border.color = 'white', border.size = NULL, na.value = 'grey50', dark.background = TRUE, crop = FALSE, cells = NULL, overlap = FALSE, axes = FALSE, combine = TRUE, coord.fixed = TRUE, flip_xy = TRUE ) { cells <- cells %||% Cells(x = object) # Determine FOV to use fov <- fov %||% DefaultFOV(object = object) fov <- Filter( f = function(x) { return( x %in% Images(object = object) && inherits(x = object[[x]], what = 'FOV') ) }, x = fov ) if (!length(x = fov)) { stop("No compatible spatial coordinates present") } # Identify boundaries to use boundaries <- boundaries %||% sapply( X = fov, FUN = function(x) { return(DefaultBoundary(object = object[[x]])) }, simplify = FALSE, USE.NAMES = TRUE ) boundaries <- .BoundariesByImage( object = object, fov = fov, boundaries = boundaries ) fov <- names(x = boundaries) overlap <- rep_len(x = overlap, length.out = length(x = fov)) crop <- rep_len(x = crop, length.out = length(x = fov)) names(x = crop) <- fov # Prepare plotting data group.by <- boundaries %!NA% group.by %||% 'ident' vars <- c(group.by, split.by) md <- if (!is_na(x = vars)) { FetchData( object = object, vars = vars[!is.na(x = vars)], cells = cells ) } else { NULL } pnames <- unlist(x = lapply( X = seq_along(along.with = fov), FUN = function(i) { return(if (isTRUE(x = overlap[i])) { fov[i] } else { paste(fov[i], boundaries[[i]], sep = '_') }) } )) pdata <- vector(mode = 'list', length = length(x = pnames)) names(x = pdata) <- pnames for (i in names(x = pdata)) { ul <- unlist(x = strsplit(x = i, split = '_')) img <- paste(ul[1:length(ul)-1], collapse = '_') # Apply overlap lyr <- ul[length(ul)] if (is.na(x = lyr)) { lyr <- boundaries[[img]] } # TODO: Apply crop pdata[[i]] <- lapply( X = lyr, FUN = function(l) { if (l == 'NA') { return(NA) } df <- fortify(model = object[[img]][[l]]) df <- df[df$cell %in% cells, , drop = FALSE] if (!is.null(x = md)) { df <- merge(x = df, y = md, by.x = 'cell', by.y = 0, all.x = TRUE) } df$cell <- paste(l, df$cell, sep = '_') df$boundary <- l return(df) } ) pdata[[i]] <- if (!is_na(x = pdata[[i]])) { do.call(what = 'rbind', args = pdata[[i]]) } else { unlist(x = pdata[[i]]) } } # Fetch molecule information if (!is.null(x = molecules)) { molecules <- .MolsByFOV( object = object, fov = fov, molecules = molecules ) mdata <- vector(mode = 'list', length = length(x = fov)) names(x = mdata) <- fov for (img in names(x = mdata)) { idata <- object[[img]] if (!img %in% names(x = molecules)) { mdata[[img]] <- NULL next } if (isTRUE(x = crop[img])) { idata <- Overlay(x = idata, y = idata) } imols <- gsub( pattern = paste0('^', Key(object = idata)), replacement = '', x = molecules[[img]] ) mdata[[img]] <- FetchData( object = idata, vars = imols, nmols = nmols ) } } else { mdata <- NULL } # Build the plots plots <- vector( mode = 'list', length = length(x = pdata) * ifelse( test = length(x = group.by), yes = length(x = group.by), no = 1L ) ) idx <- 1L for (group in group.by) { for (i in seq_along(along.with = pdata)) { img <- unlist(x = strsplit(x = names(x = pdata)[i], split = '_'))[1L] p <- SingleImagePlot( data = pdata[[i]], col.by = pdata[[i]] %!NA% group, molecules = mdata[[img]], cols = cols, shuffle.cols = shuffle.cols, size = size, alpha = alpha, mols.size = mols.size, mols.cols = mols.cols, mols.alpha = mols.alpha, border.color = border.color, border.size = border.size, na.value = na.value, dark.background = dark.background ) if (!is.null(x = split.by)) { p <- p + facet_wrap( facets = vars(!!sym(x = split.by)) ) } if (!isTRUE(x = axes)) { p <- p + NoAxes(panel.background = element_blank()) } if (!anyDuplicated(x = pdata[[i]]$cell)) { p <- p + guides(fill = guide_legend(override.aes = list(size=4L, alpha=1))) } if (isTRUE(coord.fixed)) { p <- p + coord_fixed() } if(!isTRUE(flip_xy) && isTRUE(coord.fixed)){ xy_ratio = (max(pdata[[i]]$x) - min(pdata[[i]]$x)) / (max(pdata[[i]]$y) - min(pdata[[i]]$y)) p = p + coord_flip() + theme(aspect.ratio = 1/xy_ratio) } plots[[idx]] <- p idx <- idx + 1L } } if (isTRUE(x = combine)) { plots <- wrap_plots(plots) } return(plots) } #' Spatial Feature Plots #' #' Visualize expression in a spatial context #' #' @inheritParams FeaturePlot #' @inheritParams ImageDimPlot #' @param scale Set color scaling across multiple plots; choose from: #' \itemize{ #' \item \dQuote{\code{feature}}: Plots per-feature are scaled across splits #' \item \dQuote{\code{all}}: Plots per-feature are scaled across all features #' \item \dQuote{\code{none}}: Plots are not scaled; \strong{note}: setting #' \code{scale} to \dQuote{\code{none}} will result in color scales that are #' \emph{not} comparable between plots #' } #' Ignored if \code{blend = TRUE} #' #' @inherit ImageDimPlot return #' #' @importFrom patchwork wrap_plots #' @importFrom cowplot theme_cowplot #' @importFrom ggplot2 dup_axis element_blank element_text facet_wrap guides #' labs margin vars scale_y_continuous theme #' @importFrom SeuratObject DefaultFOV Cells DefaultBoundary #' FetchData Images Overlay #' #' @export #' @concept visualization #' @concept spatial #' ImageFeaturePlot <- function( object, features, fov = NULL, boundaries = NULL, cols = if (isTRUE(x = blend)) { c("lightgrey", "#ff0000", "#00ff00") } else { c("lightgrey", "firebrick1") }, size = 0.5, min.cutoff = NA, max.cutoff = NA, split.by = NULL, molecules = NULL, mols.size = 0.1, mols.cols = NULL, nmols = 1000, alpha = 1.0, border.color = 'white', border.size = NULL, dark.background = TRUE, blend = FALSE, blend.threshold = 0.5, crop = FALSE, cells = NULL, scale = c('feature', 'all', 'none'), overlap = FALSE, axes = FALSE, combine = TRUE, coord.fixed = TRUE ) { cells <- cells %||% Cells(x = object) scale <- scale[[1L]] scale <- match.arg(arg = scale) # Set a theme to remove right-hand Y axis lines # Also sets right-hand Y axis text label formatting no.right <- theme( axis.line.y.right = element_blank(), axis.ticks.y.right = element_blank(), axis.text.y.right = element_blank(), axis.title.y.right = element_text( face = "bold", size = 14, margin = margin(r = 7) ) ) # Determine fov to use fov <- fov %||% DefaultFOV(object = object) fov <- Filter( f = function(x) { return( x %in% Images(object = object) && inherits(x = object[[x]], what = 'FOV') ) }, x = fov ) if (!length(x = fov)) { stop("No compatible spatial coordinates present") } # Identify boundaries to use boundaries <- boundaries %||% sapply( X = fov, FUN = function(x) { return(DefaultBoundary(object = object[[x]])) }, simplify = FALSE, USE.NAMES = TRUE ) boundaries <- .BoundariesByImage( object = object, fov = fov, boundaries = boundaries ) fov <- names(x = boundaries) # Check overlaps/crops if (isTRUE(x = blend) || !is.null(x = split.by)) { type <- ifelse(test = isTRUE(x = 'blend'), yes = 'Blended', no = 'Split') if (length(x = fov) != 1L) { fov <- fov[1L] warning( type, ' image feature plots can only be done on a single image, using "', fov, '"', call. = FALSE, immediate. = TRUE ) } if (any(!overlap) && length(x = boundaries[[fov]]) > 1L) { warning( type, " image feature plots require overlapped segmentations", call. = FALSE, immediate. = TRUE ) } overlap <- TRUE } overlap <- rep_len(x = overlap, length.out = length(x = fov)) crop <- rep_len(x = crop, length.out = length(x = fov)) names(x = crop) <- names(x = overlap) <- fov # Checks for blending if (isTRUE(x = blend)) { if (length(x = features) != 2L) { stop("Blended feature plots only works with two features") } default.colors <- eval(expr = formals(fun = ImageFeaturePlot)$cols) cols <- switch( EXPR = as.character(x = length(x = cols)), '0' = { warning("No colors provided, using default colors", immediate. = TRUE) default.colors }, '1' = { warning( "Only one color provided, assuming specified is double-negative and augmenting with default colors", immediate. = TRUE ) c(cols, default.colors[2:3]) }, '2' = { warning( "Only two colors provided, assuming specified are for features and augmenting with '", default.colors[1], "' for double-negatives", immediate. = TRUE ) c(default.colors[1], cols) }, '3' = cols, { warning( "More than three colors provided, using only first three", immediate. = TRUE ) cols[1:3] } ) } # Get feature, splitting data md <- FetchData( object = object, vars = c(features, split.by[1L]), cells = cells ) split.by <- intersect(x = split.by, y = colnames(x = md)) if (!length(x = split.by)) { split.by <- NULL } imax <- ifelse( test = is.null(x = split.by), yes = ncol(x = md), no = ncol(x = md) - length(x = split.by) ) features <- colnames(x = md)[1:imax] # Determine cutoffs min.cutoff <- mapply( FUN = function(cutoff, feature) { return(ifelse( test = is.na(x = cutoff), yes = min(md[[feature]]), no = cutoff )) }, cutoff = min.cutoff, feature = features ) max.cutoff <- mapply( FUN = function(cutoff, feature) { return(ifelse( test = is.na(x = cutoff), yes = max(md[[feature]]), no = cutoff )) }, cutoff = max.cutoff, feature = features ) check.lengths <- unique(x = vapply( X = list(features, min.cutoff, max.cutoff), FUN = length, FUN.VALUE = numeric(length = 1) )) if (length(x = check.lengths) != 1) { stop("There must be the same number of minimum and maximum cuttoffs as there are features") } brewer.gran <- ifelse( test = length(x = cols) == 1, yes = brewer.pal.info[cols, ]$maxcolors, no = length(x = cols) ) # Apply cutoffs for (i in seq_along(along.with = features)) { f <- features[[i]] data.feature <- md[[f]] min.use <- SetQuantile(cutoff = min.cutoff[i], data = data.feature) max.use <- SetQuantile(cutoff = max.cutoff[i], data = data.feature) data.feature[data.feature < min.use] <- min.use data.feature[data.feature > max.use] <- max.use if (brewer.gran != 2) { data.feature <- if (all(data.feature == 0)) { rep_len(x = 0, length.out = length(x = data.feature)) } else { as.numeric(x = as.factor(x = cut( x = as.numeric(x = data.feature), breaks = brewer.gran ))) } } md[[f]] <- data.feature } # Figure out splits if (is.null(x = split.by)) { split.by <- RandomName() md[[split.by]] <- factor(x = split.by) } if (!is.factor(x = md[[split.by]])) { md[[split.by]] <- factor(x = md[[split.by]]) } # Apply blends if (isTRUE(x = blend)) { md <- lapply( X = levels(x = md[[split.by]]), FUN = function(x) { df <- md[as.character(x = md[[split.by]]) == x, , drop = FALSE] no.expression <- features[colMeans(x = df[, features]) == 0] if (length(x = no.expression)) { stop( "The following features have no value: ", paste(no.expression, collapse = ', ') ) } return(cbind( df[, split.by, drop = FALSE], BlendExpression(data = df[, features]) )) } ) md <- do.call(what = 'rbind', args = md) features <- setdiff(x = colnames(x = md), y = split.by) } # Prepare plotting data pnames <- unlist(x = lapply( X = seq_along(along.with = fov), FUN = function(i) { return(if (isTRUE(x = overlap[i])) { fov[i] } else { paste(fov[i], boundaries[[i]], sep = '_') }) } )) pdata <- vector(mode = 'list', length = length(x = pnames)) names(x = pdata) <- pnames for (i in names(x = pdata)) { ul <- unlist(x = strsplit(x = i, split = '_')) # img <- paste(ul[1:length(ul)-1], collapse = '_') # Apply overlap # lyr <- ul[length(ul)] if(length(ul) > 1) { img <- paste(ul[1:length(ul)-1], collapse = '_') lyr <- ul[length(ul)] } else if (length(ul) == 1) { img <- ul[1] lyr <- "centroids" } else { stop("the length of ul is 0. please check.") } if (is.na(x = lyr)) { lyr <- boundaries[[img]] } pdata[[i]] <- lapply( X = lyr, FUN = function(l) { df <- fortify(model = object[[img]][[l]]) df <- df[df$cell %in% cells, , drop = FALSE] if (!is.null(x = md)) { df <- merge(x = df, y = md, by.x = 'cell', by.y = 0, all.x = TRUE) } df$cell <- paste(l, df$cell, sep = '_') df$boundary <- l return(df) } ) pdata[[i]] <- if (!is_na(x = pdata[[i]])) { do.call(what = 'rbind', args = pdata[[i]]) } else { unlist(x = pdata[[i]]) } } # Fetch molecule information if (!is.null(x = molecules)) { molecules <- .MolsByFOV( object = object, fov = fov, molecules = molecules ) mdata <- vector(mode = 'list', length = length(x = fov)) names(x = mdata) <- fov for (img in names(x = mdata)) { idata <- object[[img]] if (!img %in% names(x = molecules)) { mdata[[img]] <- NULL next } if (isTRUE(x = crop[img])) { idata <- Overlay(x = idata, y = idata) } imols <- gsub( pattern = paste0('^', Key(object = idata)), replacement = '', x = molecules[[img]] ) mdata[[img]] <- FetchData( object = idata, vars = imols, nmols = nmols ) } } else { mdata <- NULL } # Set blended colors if (isTRUE(x = blend)) { ncol <- 4 color.matrix <- BlendMatrix( two.colors = cols[2:3], col.threshold = blend.threshold, negative.color = cols[1] ) cols <- cols[2:3] colors <- list( color.matrix[, 1], color.matrix[1, ], as.vector(x = color.matrix) ) blend.legend <- BlendMap(color.matrix = color.matrix) } limits <- switch( EXPR = scale, 'all' = range(unlist(x = md[, features])), NULL ) # Build the plots plots <- vector( mode = 'list', length = length(x = levels(x = md[[split.by]])) ) names(x = plots) <- levels(x = md[[split.by]]) for (i in seq_along(along.with = levels(x = md[[split.by]]))) { ident <- levels(x = md[[split.by]])[i] plots[[ident]] <- vector(mode = 'list', length = length(x = pdata)) names(x = plots[[ident]]) <- names(x = pdata) if (isTRUE(x = blend)) { blend.key <- suppressMessages( expr = blend.legend + scale_y_continuous( sec.axis = dup_axis(name = ifelse( test = length(x = levels(x = md[[split.by]])) > 1, yes = ident, no = '' )), expand = c(0, 0) ) + labs( x = features[1L], y = features[2L], title = if (i == 1L) { paste('Color threshold:', blend.threshold) } else { NULL } ) + no.right ) } for (j in seq_along(along.with = pdata)) { key <- names(x = pdata)[j] img <- unlist(x = strsplit(x = key, split = '_'))[1L] plots[[ident]][[key]] <- vector( mode = 'list', length = length(x = features) + ifelse( test = isTRUE(x = blend), yes = 1L, no = 0L ) ) data.plot <- pdata[[j]][as.character(x = pdata[[j]][[split.by]]) == ident, , drop = FALSE] for (y in seq_along(along.with = features)) { feature <- features[y] # Get blended colors cols.use <- if (isTRUE(x = blend)) { cc <- as.numeric(x = as.character(x = data.plot[, feature])) + 1 colors[[y]][sort(unique(x = cc))] } else { NULL } colnames(data.plot) <- gsub("-", "_", colnames(data.plot)) p <- SingleImagePlot( data = data.plot, col.by = gsub("-", "_", feature), size = size, col.factor = blend, cols = cols.use, molecules = mdata[[img]], mols.size = mols.size, mols.cols = mols.cols, alpha = alpha, border.color = border.color, border.size = border.size, dark.background = dark.background ) + CenterTitle() + labs(fill=feature) # Remove fill guides for blended plots if (isTRUE(x = blend)) { p <- p + guides(fill = 'none') } if (isTRUE(coord.fixed)) { p <- p + coord_fixed() } # Remove axes if (!isTRUE(x = axes)) { p <- p + NoAxes(panel.background = element_blank()) } else if (isTRUE(x = blend) || length(x = levels(x = md[[split.by]])) > 1L) { if (y != 1L) { p <- p + theme( axis.line.y = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(), axis.title.y.left = element_blank() ) } if (i != length(x = levels(x = md[[split.by]]))) { p <- p + theme( axis.line.x = element_blank(), axis.ticks.x = element_blank(), axis.text.x = element_blank(), axis.title.x = element_blank() ) } } # Add colors for unblended plots if (!isTRUE(x = blend)) { if (length(x = cols) == 1L) { p <- p + scale_fill_brewer(palette = cols) } else { cols.grad <- cols fexp <- data.plot[data.plot[[split.by]] == ident, feature, drop = TRUE] fexp <- unique(x = fexp) if (length(x = fexp) == 1L) { warning( "All cells have the same value (", fexp, ") of ", feature, call. = FALSE, immediate. = TRUE ) if (fexp == 0) { cols.grad <- cols.grad[1L] } } # Check if we're scaling the colorbar across splits if (scale == 'feature') { limits <- range(pdata[[j]][[feature]]) } p <- p + ggplot2::scale_fill_gradientn( colors = cols.grad, guide = 'colorbar', limits = limits ) } } # Add some labels p <- p + if (i == 1L) { ggplot2::labs(title = feature) } else { ggplot2::labs(title = NULL) } plots[[ident]][[key]][[y]] <- p } if (isTRUE(x = blend)) { plots[[ident]][[key]][[length(x = plots[[ident]][[key]])]] <- blend.key } else if (length(x = levels(x = md[[split.by]])) > 1L) { plots[[ident]][[key]][[y]] <- suppressMessages( expr = plots[[ident]][[key]][[y]] + scale_y_continuous(sec.axis = dup_axis(name = ident)) + no.right ) } } plots[[ident]] <- unlist( x = plots[[ident]], recursive = FALSE, use.names = FALSE ) } plots <- unlist(x = plots, recursive = FALSE, use.names = FALSE) if (isTRUE(x = combine)) { if (isTRUE(x = blend) || length(x = levels(x = md[[split.by]])) > 1L) { plots <- wrap_plots( plots, ncol = ifelse( test = isTRUE(x = blend), yes = 4L, no = length(x = features) ), nrow = length(x = levels(x = md[[split.by]])), guides = 'collect' ) } else { plots <- wrap_plots(plots) } } return(plots) } #' Visualize spatial and clustering (dimensional reduction) data in a linked, #' interactive framework #' #' @inheritParams SpatialPlot #' @inheritParams FeaturePlot #' @inheritParams DimPlot #' @param feature Feature to visualize #' @param image Name of the image to use in the plot #' #' @return Returns final plots. If \code{combine}, plots are stiched together #' using \code{\link{CombinePlots}}; otherwise, returns a list of ggplot objects #' #' @rdname LinkedPlots #' @name LinkedPlots #' #' @importFrom scales hue_pal #' @importFrom patchwork wrap_plots #' @importFrom ggplot2 scale_alpha_ordinal guides #' @importFrom miniUI miniPage gadgetTitleBar miniTitleBarButton miniContentPanel #' @importFrom shiny fillRow plotOutput brushOpts clickOpts hoverOpts #' verbatimTextOutput reactiveValues observeEvent stopApp nearPoints #' brushedPoints renderPlot renderPrint runGadget #' #' @aliases LinkedPlot LinkedDimPlot #' #' @export #' @concept visualization #' @concept spatial #' #' @examples #' \dontrun{ #' LinkedDimPlot(seurat.object) #' LinkedFeaturePlot(seurat.object, feature = 'Hpca') #' } #' LinkedDimPlot <- function( object, dims = 1:2, reduction = NULL, image = NULL, image.scale = "lowres", group.by = NULL, alpha = c(0.1, 1), combine = TRUE ) { # Setup gadget UI ui <- miniPage( gadgetTitleBar( title = 'LinkedDimPlot', left = miniTitleBarButton(inputId = 'reset', label = 'Reset') ), miniContentPanel( fillRow( plotOutput( outputId = 'spatialplot', height = '100%', # brush = brushOpts(id = 'brush', delay = 10, clip = TRUE, resetOnNew = FALSE), click = clickOpts(id = 'spclick', clip = TRUE), hover = hoverOpts(id = 'sphover', delay = 10, nullOutside = TRUE) ), plotOutput( outputId = 'dimplot', height = '100%', brush = brushOpts(id = 'brush', delay = 10, clip = TRUE, resetOnNew = FALSE), click = clickOpts(id = 'dimclick', clip = TRUE), hover = hoverOpts(id = 'dimhover', delay = 10, nullOutside = TRUE) ), height = '97%' ), verbatimTextOutput(outputId = 'info') ) ) # Prepare plotting data image <- image %||% DefaultImage(object = object) cells.use <- Cells(x = object[[image]]) reduction <- reduction %||% DefaultDimReduc(object = object) dims <- dims[1:2] dims <- paste0(Key(object = object[[reduction]]), dims) group.by <- group.by %||% 'ident' group.data <- FetchData( object = object, vars = group.by, cells = cells.use ) coords <- GetTissueCoordinates(object = object[[image]], scale = image.scale) embeddings <- Embeddings(object = object[[reduction]])[cells.use, dims] plot.data <- cbind(coords, group.data, embeddings) plot.data$selected_ <- FALSE Idents(object = object) <- group.by # Retrieve coordinates for tissue plot and dim plot seperately sp_x <- colnames(coords)[1] sp_y <- colnames(coords)[2] dp_x <- dims[1] dp_y <- dims[2] sp_y_min <- min(plot.data[[sp_y]]); sp_y_max <- max(plot.data[[sp_y]]) # Add tiny helper function to flip interactive coordinate points flip_y <- function(pt) { pt$y <- sp_y_max - (pt$y - sp_y_min); pt } # Setup the server server <- function(input, output, session) { click <- reactiveValues(pt = NULL, invert = FALSE) plot.env <- reactiveValues(data = plot.data, alpha.by = NULL) # Handle events observeEvent( eventExpr = input$done, handlerExpr = { plots <- list(plot.env$spatialplot, plot.env$dimplot) if (combine) { plots <- wrap_plots(plots, ncol = 2) } stopApp(returnValue = plots) } ) observeEvent( eventExpr = input$reset, handlerExpr = { click$pt <- NULL click$invert <- FALSE session$resetBrush(brushId = 'brush') } ) observeEvent(eventExpr = input$brush, handlerExpr = click$pt <- NULL) observeEvent( eventExpr = input$spclick, handlerExpr = { # Flip coordinates vertically for spatial plot to match tissue image click$pt <- flip_y(input$spclick) click$invert <- TRUE } ) observeEvent( eventExpr = input$dimclick, handlerExpr = { click$pt <- input$dimclick click$invert <- FALSE } ) observeEvent( eventExpr = c(input$brush, input$spclick, input$dimclick), handlerExpr = { plot.env$data <- if (is.null(x = input$brush)) { clicked <- nearPoints( df = plot.data, coordinfo = click$pt, threshold = 10, maxpoints = 1, xvar = if (click$invert) sp_x else dp_x, yvar = if (click$invert) sp_y else dp_y ) if (nrow(x = clicked) == 1) { cell.clicked <- rownames(x = clicked) group.clicked <- plot.data[cell.clicked, group.by, drop = TRUE] idx.group <- which(x = plot.data[[group.by]] == group.clicked) plot.data[idx.group, 'selected_'] <- TRUE plot.data } else { plot.data } } else if (input$brush$outputId == 'dimplot') { brushedPoints(df = plot.data, brush = input$brush, allRows = TRUE) } else if (input$brush$outputId == 'spatialplot') { b <- input$brush b$ymin <- sp_y_max - (b$ymin - sp_y_min) b$ymax <- sp_y_max - (b$ymax - sp_y_min) brushedPoints(df = plot.data, brush = b, allRows = TRUE, xvar = sp_x, yvar = sp_y) } plot.env$alpha.by <- if (any(plot.env$data$selected_)) { 'selected_' } else { NULL } } ) # Set plots output$spatialplot <- renderPlot( expr = { plot.env$spatialplot <- SingleSpatialPlot( data = plot.env$data, image = object[[image]], col.by = group.by, pt.size.factor = 1.6, crop = TRUE, alpha.by = plot.env$alpha.by ) + scale_alpha_ordinal(range = alpha) + NoLegend() plot.env$spatialplot } ) output$dimplot <- renderPlot( expr = { plot.env$dimplot <- SingleDimPlot( data = plot.env$data, dims = dims, col.by = group.by, alpha.by = plot.env$alpha.by ) + scale_alpha_ordinal(range = alpha) + guides(alpha = "none") plot.env$dimplot } ) # Add hover text output$info <- renderPrint( expr = { cell.hover <- rownames(x = nearPoints( df = plot.data, coordinfo = if (is.null(input[['sphover']])) { input$dimhover } else { flip_y(input$sphover) }, threshold = 10, maxpoints = 1, xvar = if (is.null(input$sphover)) dp_x else sp_x, yvar = if (is.null(input$sphover)) dp_y else sp_y )) # if (length(x = cell.hover) == 1) { # palette <- hue_pal()(n = length(x = levels(x = object))) # group <- plot.data[cell.hover, group.by, drop = TRUE] # background <- palette[which(x = levels(x = object) == group)] # text <- unname(obj = BGTextColor(background = background)) # style <- paste0( # paste( # paste('background-color:', background), # paste('color:', text), # sep = '; ' # ), # ';' # ) # info <- paste(cell.hover, paste('Group:', group), sep = '
') # } else { # style <- 'background-color: white; color: black' # info <- NULL # } # HTML(text = paste0("
", info, "
")) # p(HTML(info), style = style) # paste0('
', info, '
') # TODO: Get newlines, extra information, and background color working if (length(x = cell.hover) == 1) { paste(cell.hover, paste('Group:', plot.data[cell.hover, group.by, drop = TRUE]), collapse = '
') } else { NULL } } ) } # Run the thang runGadget(app = ui, server = server) } #' @rdname LinkedPlots #' #' @aliases LinkedFeaturePlot #' #' @importFrom ggplot2 scale_fill_gradientn theme scale_alpha guides #' scale_color_gradientn guide_colorbar #' #' @export #' @concept visualization #' @concept spatial LinkedFeaturePlot <- function( object, feature, dims = 1:2, reduction = NULL, image = NULL, image.scale = "lowres", slot = 'data', alpha = c(0.1, 1), combine = TRUE ) { # Setup gadget UI ui <- miniPage( gadgetTitleBar( title = 'LinkedFeaturePlot', left = NULL ), miniContentPanel( fillRow( plotOutput( outputId = 'spatialplot', height = '100%', hover = hoverOpts(id = 'sphover', delay = 10, nullOutside = TRUE) ), plotOutput( outputId = 'dimplot', height = '100%', hover = hoverOpts(id = 'dimhover', delay = 10, nullOutside = TRUE) ), height = '97%' ), verbatimTextOutput(outputId = 'info') ) ) # Prepare plotting data cols <- SpatialColors(n = 100) image <- image %||% DefaultImage(object = object) cells.use <- Cells(x = object[[image]]) reduction <- reduction %||% DefaultDimReduc(object = object) dims <- dims[1:2] dims <- paste0(Key(object = object[[reduction]]), dims) group.data <- FetchData( object = object, vars = feature, cells = cells.use ) coords <- GetTissueCoordinates(object = object[[image]], scale = image.scale) embeddings <- Embeddings(object = object[[reduction]])[cells.use, dims] plot.data <- cbind(coords, group.data, embeddings) # Setup the server server <- function(input, output, session) { plot.env <- reactiveValues() # Handle events observeEvent( eventExpr = input$done, handlerExpr = { plots <- list(plot.env$spatialplot, plot.env$dimplot) if (combine) { plots <- wrap_plots(plots, ncol = 2) } stopApp(returnValue = plots) } ) # Set plots output$spatialplot <- renderPlot( expr = { plot.env$spatialplot <- SingleSpatialPlot( data = plot.data, image = object[[image]], col.by = feature, pt.size.factor = 1.6, crop = TRUE, alpha.by = feature ) + scale_fill_gradientn(name = feature, colours = cols) + theme(legend.position = 'top') + scale_alpha(range = alpha) + guides(alpha = "none") plot.env$spatialplot } ) output$dimplot <- renderPlot( expr = { plot.env$dimplot <- SingleDimPlot( data = plot.data, dims = dims, col.by = feature ) + scale_color_gradientn(name = feature, colours = cols, guide = 'colorbar') + guides(color = guide_colorbar()) plot.env$dimplot } ) # Add hover text output$info <- renderPrint( expr = { cell.hover <- rownames(x = nearPoints( df = plot.data, coordinfo = if (is.null(x = input[['sphover']])) { input$dimhover } else { InvertCoordinate(x = input$sphover) }, threshold = 10, maxpoints = 1 )) # TODO: Get newlines, extra information, and background color working if (length(x = cell.hover) == 1) { paste(cell.hover, paste('Expression:', plot.data[cell.hover, feature, drop = TRUE]), collapse = '
') } else { NULL } } ) } runGadget(app = ui, server = server) } #' Visualize clusters spatially and interactively #' #' @inheritParams SpatialPlot #' @inheritParams DimPlot #' @inheritParams LinkedPlots #' #' @return Returns final plot as a ggplot object #' #' @importFrom ggplot2 scale_alpha_ordinal #' @importFrom miniUI miniPage miniButtonBlock miniTitleBarButton miniContentPanel #' @importFrom shiny fillRow plotOutput verbatimTextOutput reactiveValues #' observeEvent stopApp nearPoints renderPlot runGadget #' #' @export #' @concept visualization #' @concept spatial #' ISpatialDimPlot <- function( object, image = NULL, image.scale = "lowres", group.by = NULL, alpha = c(0.3, 1) ) { # Setup gadget UI ui <- miniPage( miniButtonBlock(miniTitleBarButton( inputId = 'done', label = 'Done', primary = TRUE )), miniContentPanel( fillRow( plotOutput( outputId = 'plot', height = '100%', click = clickOpts(id = 'click', clip = TRUE), hover = hoverOpts(id = 'hover', delay = 10, nullOutside = TRUE) ), height = '97%' ), verbatimTextOutput(outputId = 'info') ) ) # Get plotting data # Prepare plotting data image <- image %||% DefaultImage(object = object) cells.use <- Cells(x = object[[image]]) group.by <- group.by %||% 'ident' group.data <- FetchData( object = object, vars = group.by, cells = cells.use ) coords <- GetTissueCoordinates(object = object[[image]], scale = image.scale) scale.factor <- ScaleFactors(object[[image]])[[image.scale]] plot.data <- cbind(coords, group.data) plot.data$selected_ <- FALSE Idents(object = object) <- group.by # Set up the server server <- function(input, output, session) { click <- reactiveValues(pt = NULL) plot.env <- reactiveValues(data = plot.data, alpha.by = NULL) # Handle events observeEvent( eventExpr = input$done, handlerExpr = stopApp(returnValue = plot.env$plot) ) observeEvent( eventExpr = input$click, handlerExpr = { clicked <- nearPoints( df = plot.data, coordinfo = InvertCoordinate(x = input$click), threshold = 10, maxpoints = 1, xvar = "y", yvar = "x" ) plot.env$data <- if (nrow(x = clicked) == 1) { cell.clicked <- rownames(x = clicked) cell.clicked <- rownames(x = clicked) group.clicked <- plot.data[cell.clicked, group.by, drop = TRUE] idx.group <- which(x = plot.data[[group.by]] == group.clicked) plot.data[idx.group, 'selected_'] <- TRUE plot.data } else { plot.data } plot.env$alpha.by <- if (any(plot.env$data$selected_)) { 'selected_' } else { NULL } } ) # Set plot output$plot <- renderPlot( expr = { plot.env$plot <- SingleSpatialPlot( data = plot.env$data, image = object[[image]], col.by = group.by, crop = TRUE, alpha.by = plot.env$alpha.by, pt.size.factor = 1.6 ) + scale_alpha_ordinal(range = alpha) + NoLegend() plot.env$plot } ) # Add hover text output$info <- renderPrint( expr = { hovered <- nearPoints( df = plot.data, coordinfo = InvertCoordinate(x = input$hover), threshold = 10, maxpoints = 1, xvar = "y", yvar = "x" ) if (nrow(hovered) == 1) { cell.hover <- rownames(hovered) # SingleSpatialPlot relies on the spatial coordinates appearing # in the first two columns of the returned data.frame - it's kinda # fragile but we're obligated to use the same behaviour here coords.hover <- hovered[1, colnames(coords)[1:2]] / scale.factor group.hover <- hovered[1, group.by] sprintf( "Cell: %s, Group: %s, Coordinates: (%.2f, %.2f)", cell.hover, group.hover, coords.hover[[1]], coords.hover[[2]] ) } else { NULL } } ) } runGadget(app = ui, server = server) } #' Visualize features spatially and interactively #' #' @inheritParams SpatialPlot #' @inheritParams FeaturePlot #' @inheritParams LinkedPlots #' #' @return Returns final plot as a ggplot object #' #' @importFrom ggplot2 scale_fill_gradientn theme scale_alpha guides #' @importFrom miniUI miniPage miniButtonBlock miniTitleBarButton miniContentPanel #' @importFrom shiny fillRow sidebarPanel sliderInput selectInput reactiveValues #' observeEvent stopApp observe updateSelectInput plotOutput renderPlot runGadget #' #' @export #' @concept visualization #' @concept spatial ISpatialFeaturePlot <- function( object, feature, image = NULL, image.scale = "lowres", slot = 'data', alpha = c(0.1, 1) ) { # Set inital data values assay.keys <- Key(object = object)[Assays(object = object)] keyed <- sapply(X = assay.keys, FUN = grepl, x = feature) assay <- if (any(keyed)) { names(x = which(x = keyed))[1] } else { DefaultAssay(object = object) } features <- sort(x = rownames(x = GetAssayData( object = object, layer = slot, assay = assay ))) feature.label <- 'Feature to visualize' assays.use <- vapply( X = Assays(object = object), FUN = function(x) { return(!IsMatrixEmpty(x = GetAssayData( object = object, layer = slot, assay = x ))) }, FUN.VALUE = logical(length = 1L) ) assays.use <- sort(x = Assays(object = object)[assays.use]) # Setup gadget UI ui <- miniPage( miniButtonBlock(miniTitleBarButton( inputId = 'done', label = 'Done', primary = TRUE )), miniContentPanel( fillRow( sidebarPanel( sliderInput( inputId = 'alpha', label = 'Alpha intensity', min = 0, max = max(alpha), value = min(alpha), step = 0.01, width = '100%' ), sliderInput( inputId = 'pt.size', label = 'Point size', min = 0, max = 5, value = 1.6, step = 0.1, width = '100%' ), selectInput( inputId = 'assay', label = 'Assay', choices = assays.use, selected = assay, selectize = FALSE, width = '100%' ), selectInput( inputId = 'feature', label = feature.label, choices = features, selected = feature, selectize = FALSE, width = '100%' ), selectInput( inputId = 'palette', label = 'Color scheme', choices = names(x = FeaturePalettes), selected = 'Spatial', selectize = FALSE, width = '100%' ), width = '100%' ), plotOutput(outputId = 'plot', height = '100%'), flex = c(1, 4) ) ) ) # Prepare plotting data image <- image %||% DefaultImage(object = object) cells.use <- Cells(x = object[[image]]) coords <- GetTissueCoordinates(object = object[[image]], scale = image.scale) feature.data <- FetchData( object = object, vars = feature, cells = cells.use, layer = slot ) plot.data <- cbind(coords, feature.data) server <- function(input, output, session) { plot.env <- reactiveValues( data = plot.data, feature = feature, palette = 'Spatial' ) # Observe events observeEvent( eventExpr = input$done, handlerExpr = stopApp(returnValue = plot.env$plot) ) observe(x = { assay <- input$assay feature.use <- input$feature features.assay <- sort(x = rownames(x = GetAssayData( object = object, layer = slot, assay = assay ))) feature.use <- ifelse( test = feature.use %in% features.assay, yes = feature.use, no = features.assay[1] ) updateSelectInput( session = session, inputId = 'assay', label = 'Assay', choices = assays.use, selected = assay ) updateSelectInput( session = session, inputId = 'feature', label = feature.label, choices = features.assay, selected = feature.use ) }) observe(x = { feature.use <- input$feature try( expr = { feature.data <- FetchData( object = object, vars = paste0(Key(object = object[[input$assay]]), feature.use), cells = cells.use, layer = slot ) colnames(x = feature.data) <- feature.use plot.env$data <- cbind(coords, feature.data) plot.env$feature <- feature.use }, silent = TRUE ) }) observe(x = { plot.env$palette <- input$palette }) # Create plot output$plot <- renderPlot(expr = { plot.env$plot <- SingleSpatialPlot( data = plot.env$data, image = object[[image]], col.by = plot.env$feature, pt.size.factor = input$pt.size, crop = TRUE, alpha.by = plot.env$feature ) + # scale_fill_gradientn(name = plot.env$feature, colours = cols) + scale_fill_gradientn(name = plot.env$feature, colours = FeaturePalettes[[plot.env$palette]]) + theme(legend.position = 'top') + scale_alpha(range = c(input$alpha, 1)) + guides(alpha = "none") plot.env$plot }) } runGadget(app = ui, server = server) } #' Interactive Spatial Cell Selection Tool #' #' Launch an interactive gadget for lasso-based cell selection from a spatial Seurat object. #' Supports Visium, SlideSeq, and Vizgen data. Returns the cell names of the selected subset, #' suitable for downstream subsetting or analysis. #' #' @note This function requires the #' \href{https://cran.r-project.org/package=plotly}{\pkg{plotly}}, #' \href{https://cran.r-project.org/package=magrittr}{\pkg{magrittr}}, #' and \href{https://cran.r-project.org/package=base64enc}{\pkg{base64enc}} packages #' to be installed. It also requires \pkg{shiny} and \pkg{miniUI} for the interactive UI. #' #' @param object A \code{\link[SeuratObject]{Seurat}} object with spatial data. #' @param image Name of the spatial image stored in the object. If \code{NULL}, uses the default image for the object. #' @param image.scale Character. Which image scaling factor to use for spatial coordinate transformation (\code{"lowres"} by default). #' @param group.by Metadata variable (column name) to use for coloring cell points (e.g., cluster assignment). If \code{NULL}, uses \code{"seurat_clusters"} if available, otherwise all cells are grouped together. #' @param alpha Numeric transparency value for cell points (default \code{1.0}). #' @param pt.size.factor Numeric scaling factor for point size (default \code{1.0}). #' @param overlay_image Logical; if \code{TRUE}, overlays the tissue image in the background of the plot (default \code{TRUE}). #' #' @importFrom grDevices png dev.off #' #' @return A character vector of cell names selected via lasso, which can be used to subset the object. #' @export #' #' @examples #' \dontrun{ #' selected_cells <- InteractiveSpatialPlot(object = brain) #' selected_cells <- InteractiveSpatialPlot(object = brain, overlay_image = FALSE) #' } InteractiveSpatialPlot <- function( object, image = NULL, image.scale = "lowres", group.by = NULL, alpha = 1.0, pt.size.factor = 1.0, overlay_image = TRUE ) { # Check for required packages, stop with clear message if missing if (!requireNamespace("plotly", quietly = TRUE)) { stop("The 'plotly' package must be installed to use InteractiveSpatialPlot().") } if (!requireNamespace("magrittr", quietly = TRUE)) { stop("The 'magrittr' package must be installed to use InteractiveSpatialPlot().") } if (!requireNamespace("base64enc", quietly = TRUE)) { stop("The 'base64enc' package must be installed to use InteractiveSpatialPlot().") } # Import magrittr pipe locally `%>%` <- magrittr::`%>%` # Use provided image name or fallback to default image <- image %||% DefaultImage(object) # Sanity check: requested image must exist in the object if (!image %in% names(object@images)) { stop("Image '", image, "' not found. Available image(s): ", paste(names(object@images), collapse = ", ")) } # Retrieve the spatial image object image_obj <- object[[image]] # Determine image technology type (Visium, SlideSeq, or Vizgen) img_class <- class(image_obj)[1] if (img_class %in% c("VisiumV1", "VisiumV2")) { type <- "visium" } else if (img_class == "SlideSeq") { type <- "slideseq" } else if (img_class == "FOV") { type <- "vizgen" } else { stop("Unrecognized image class: ", img_class) } # Extract and scale cell coordinates according to image type if (type == "visium") { # For Visium: coordinates stored in centroids, need scaling if (!"boundaries" %in% slotNames(image_obj)) { stop("Image object does not have a 'boundaries' slot; check if data is truly Visium data") } centroids <- image_obj@boundaries$centroids coords <- setNames(as.data.frame(centroids@coords), c("x", "y")) coords$cell <- centroids@cells # Scale coordinates to match image pixel units scale.factor <- Seurat::ScaleFactors(image_obj)[[image.scale]] if (is.null(scale.factor)) stop("Scale factor for '", image.scale, "' not found") coords$x_raw <- coords$x # Store original, unscaled x coords$y_raw <- coords$y # Store original, unscaled y coords$x <- coords$x * scale.factor coords$y <- coords$y * scale.factor } else if (type == "slideseq") { # For Slide-seq: coordinates are stored directly if (!"coordinates" %in% slotNames(image_obj)) { stop("Image object does not have a 'coordinates' slot; check if data is truly Slide-seq data") } coords <- as.data.frame(image_obj@coordinates) coords$cell <- rownames(coords) colnames(coords)[1:2] <- c("x", "y") coords$x_raw <- coords$x coords$y_raw <- coords$y } else if (type == "vizgen") { # For Vizgen: coordinates in centroids if (!"boundaries" %in% slotNames(image_obj)) { stop("Vizgen FOV missing 'boundaries' slot") } centroids <- image_obj@boundaries$centroids coords <- as.data.frame(centroids@coords) colnames(coords) <- c("x", "y") coords$cell <- centroids@cells coords$x_raw <- coords$x coords$y_raw <- coords$y } # Get cell-level metadata for grouping/labeling meta <- object@meta.data # If group.by not given, use 'seurat_clusters' if available; otherwise group all together if (is.null(group.by)) { group.by <- if ("seurat_clusters" %in% colnames(meta)) "seurat_clusters" else "all" } # Assign group/cluster for coloring the plot if (group.by != "all") { coords$group <- meta[coords$cell, group.by] } else { coords$group <- "all" } # Compose hover text: show cell name, original (x, y) coordinates, rounded for clarity coords$hover <- paste0( "Cell: ", coords$cell, "
x: ", round(coords$x_raw, 1), ", y: ", round(coords$y_raw, 1) ) # Prepare background tissue image as a base64-encoded PNG (if available and enabled) base64_image <- NULL img_width <- NULL img_height <- NULL if (overlay_image) { # Only attempt to overlay image if compatible type and slot present if (type == "visium" && "image" %in% slotNames(image_obj)) { img_raster <- image_obj@image } else if ( type == "vizgen" && "boundaries" %in% slotNames(image_obj) && "centroids" %in% slotNames(image_obj@boundaries) && "image" %in% slotNames(image_obj@boundaries$centroids) ) { img_raster <- image_obj@boundaries$centroids@image } # Convert the raster image array to base64 PNG (for embedding in plotly) if (exists("img_raster")) { img_width <- dim(img_raster)[2] img_height <- dim(img_raster)[1] temp_png <- tempfile(fileext = ".png") png(temp_png, width = img_width, height = img_height) grid::grid.raster(img_raster) dev.off() img_bytes <- readBin(temp_png, "raw", file.info(temp_png)$size) base64_image <- paste0("data:image/png;base64,", base64enc::base64encode(img_bytes)) } } # Calculate custom axis tick positions and labels to show original coordinates # This is necessary as points are downscaled to fit on the tissue image # However, to best retain their original spatial orientation, we plot # the original coordinate scale on the axis create_axis_ticks <- function(scaled_coords, raw_coords, n_ticks = 6) { # Get range of scaled and raw coordinates scaled_range <- range(scaled_coords, na.rm = TRUE) raw_range <- range(raw_coords, na.rm = TRUE) # Create tick positions in the raw coordinate space raw_ticks <- pretty(raw_range, n = n_ticks) # Calculate corresponding scaled positions # Linear interpolation from raw to scaled coordinates scale_factor <- diff(scaled_range) / diff(raw_range) scaled_ticks <- (raw_ticks - raw_range[1]) * scale_factor + scaled_range[1] return(list(tickvals = scaled_ticks, ticktext = as.character(raw_ticks))) } # Create custom axis ticks for both x and y axes x_ticks <- create_axis_ticks(coords$x, coords$x_raw) y_ticks <- create_axis_ticks(coords$y, coords$y_raw) # Set up the gadget UI with a plotly output area ui <- miniPage( gadgetTitleBar("Select a subset of cells"), miniContentPanel( plotly::plotlyOutput("plot", height = "100%") ) ) # Shiny gadget server logic for interactive plot and lasso selection server <- function(input, output, session) { # Render the interactive plotly scattergl plot output$plot <- plotly::renderPlotly({ plt <- plotly::plot_ly( data = coords, x = ~y, # Plot y on x axis to match Seurat/ggplot conventions y = ~x, # Plot x on y axis (this handles flipped axes) color = ~group, # Color by group/cluster if available key = ~cell, # Store cell names for selection retrieval type = "scattergl", # Use WebGL for performance with large datasets mode = "markers", marker = list(size = 2 * pt.size.factor), # Default pt size is 2 text = ~hover, # Show hover info (cellid + coordinates) hoverinfo = "text", alpha = alpha # Global transparency ) # Overlay the tissue image as background if available if (!is.null(base64_image)) { plt <- plt %>% plotly::layout( images = list( list( source = base64_image, xref = "x", yref = "y", # Anchor to data coordinates x = 0, y = 0, sizex = img_width, sizey = img_height, sizing = "stretch", opacity = 0.6, layer = "below" ) ) ) } # Lock axes to same scale and reverse y for image alignment # Set lasso mode and custom axis labels plt <- plt %>% plotly::layout( dragmode = "lasso", yaxis = list( autorange = "reversed", scaleanchor = "x", title = "x", tickvals = x_ticks$tickvals, ticktext = x_ticks$ticktext ), xaxis = list( scaleanchor = "y", title = "y", tickvals = y_ticks$tickvals, ticktext = y_ticks$ticktext ) ) plt }) # When user clicks "Done", retrieve lasso selection and close gadget observeEvent(input$done, { selected <- plotly::event_data("plotly_selected") selected_cells <- selected$key stopApp(selected_cells) }) # When user clicks "Cancel", exit gadget and return NULL observeEvent(input$cancel, { stopApp(NULL) }) } # Launch the interactive gadget runGadget(ui, server) } #' Visualize spatial clustering and expression data. #' #' SpatialPlot plots a feature or discrete grouping (e.g. cluster assignments) as #' spots over the image that was collected. We also provide SpatialFeaturePlot #' and SpatialDimPlot as wrapper functions around SpatialPlot for a consistent #' naming framework. #' #' @inheritParams HoverLocator #' @param object A Seurat object #' @param group.by Name of meta.data column to group the data by #' @param features Name of the feature to visualize. Provide either group.by OR #' features, not both. #' @param images Name of the images to use in the plot(s) #' @param cols Vector of colors, each color corresponds to an identity class. #' This may also be a single character or numeric value corresponding to a #' palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}. By #' default, ggplot2 assigns colors #' @param image.alpha Adjust the opacity of the background images. Set to 0 to #' remove. #' @param image.scale Choose the scale factor ("lowres"/"hires") to apply in #' order to matchthe plot with the specified `image` - defaults to "lowres" #' @param crop Crop the plot in to focus on points plotted. Set to \code{FALSE} to show #' entire background image. #' @param slot If plotting a feature, which data slot to pull from (counts, #' data, or scale.data) #' @param keep.scale How to handle the color scale across multiple plots. Options are: #' \itemize{ #' \item \dQuote{feature} (default; by row/feature scaling): The plots for #' each individual feature are scaled to the maximum expression of the #' feature across the conditions provided to \code{split.by} #' \item \dQuote{all} (universal scaling): The plots for all features and #' conditions are scaled to the maximum expression value for the feature #' with the highest overall expression #' \item \code{NULL} (no scaling): Each individual plot is scaled to the #' maximum expression value of the feature in the condition provided to #' \code{split.by}; be aware setting \code{NULL} will result in color #' scales that are not comparable between plots #' } #' @param min.cutoff,max.cutoff Vector of minimum and maximum cutoff #' values for each feature, may specify quantile in the form of 'q##' where '##' #' is the quantile (eg, 'q1', 'q10') #' @param cells.highlight A list of character or numeric vectors of cells to #' highlight. If only one group of cells desired, can simply pass a vector #' instead of a list. If set, colors selected cells to the color(s) in #' cols.highlight #' @param cols.highlight A vector of colors to highlight the cells as; ordered #' the same as the groups in cells.highlight; last color corresponds to #' unselected cells. #' @param facet.highlight When highlighting certain groups of cells, split each #' group into its own plot #' @param label Whether to label the clusters #' @param label.size Sets the size of the labels #' @param label.color Sets the color of the label text #' @param label.box Whether to put a box around the label text (geom_text vs #' geom_label) #' @param repel Repels the labels to prevent overlap #' @param ncol Number of columns if plotting multiple plots #' @param combine Combine plots into a single gg object; note that if TRUE; #' themeing will not work when plotting multiple features/groupings #' @param pt.size.factor Scale the size of the spots. #' @param alpha Controls opacity of spots. Provide as a vector specifying the #' min and max for SpatialFeaturePlot. For SpatialDimPlot, provide a single #' alpha value for each plot. #' @param shape Control the shape of the spots - same as the ggplot2 parameter. #' The default is 21, which plots circles - use 22 to plot squares. #' @param stroke Control the width of the border around the spots #' @param interactive Launch an interactive SpatialDimPlot or SpatialFeaturePlot #' session, see \code{\link{ISpatialDimPlot}} or #' \code{\link{ISpatialFeaturePlot}} for more details #' @param do.identify,do.hover DEPRECATED in favor of \code{interactive} #' @param identify.ident DEPRECATED #' @param plot_segmentations Define whether plot should plot centroids or segmentations #' #' @return If \code{do.identify}, either a vector of cells selected or the object #' with selected cells set to the value of \code{identify.ident} (if set). Else, #' if \code{do.hover}, a plotly object with interactive graphics. Else, a ggplot #' object #' #' @importFrom ggplot2 scale_fill_gradientn ggtitle theme element_text scale_alpha #' @importFrom patchwork wrap_plots #' @export #' @concept visualization #' @concept spatial #' #' @examples #' \dontrun{ #' # For functionality analagous to FeaturePlot #' SpatialPlot(seurat.object, features = "MS4A1") #' SpatialFeaturePlot(seurat.object, features = "MS4A1") #' #' # For functionality analagous to DimPlot #' SpatialPlot(seurat.object, group.by = "clusters") #' SpatialDimPlot(seurat.object, group.by = "clusters") #' } #' SpatialPlot <- function( object, group.by = NULL, features = NULL, images = NULL, cols = NULL, image.alpha = 1, image.scale = "lowres", crop = TRUE, slot = 'data', keep.scale = "feature", min.cutoff = NA, max.cutoff = NA, cells.highlight = NULL, cols.highlight = c('#DE2D26', 'grey50'), facet.highlight = FALSE, label = FALSE, label.size = 5, label.color = 'white', label.box = TRUE, repel = FALSE, ncol = NULL, combine = TRUE, pt.size.factor = 1.6, alpha = c(1, 1), shape = 21, stroke = NA, interactive = FALSE, do.identify = FALSE, identify.ident = NULL, do.hover = FALSE, information = NULL, plot_segmentations = FALSE ) { if (isTRUE(x = do.hover) || isTRUE(x = do.identify)) { warning( "'do.hover' and 'do.identify' are deprecated as we are removing plotly-based interactive graphics, use 'interactive' instead for Shiny-based interactivity", call. = FALSE, immediate. = TRUE ) interactive <- TRUE } if (!is.null(x = group.by) & !is.null(x = features)) { stop("Please specific either group.by or features, not both.") } images <- images %||% Images(object = object, assay = DefaultAssay(object = object)) if (length(x = images) == 0) { images <- Images(object = object) } if (length(x = images) < 1) { stop("Could not find any spatial image information") } # Check keep.scale param for valid entries if (!(is.null(x = keep.scale)) && !(keep.scale %in% c("feature", "all"))) { stop("`keep.scale` must be set to either `feature`, `all`, or NULL") } cells <- unique(CellsByImage(object, images = images, unlist = TRUE)) if (is.null(x = features)) { if (interactive) { return(ISpatialDimPlot( object = object, image = images[1], image.scale = image.scale, group.by = group.by, alpha = alpha )) } group.by <- group.by %||% 'ident' object[['ident']] <- Idents(object = object) data <- object[[group.by]] data <- data[cells,,drop=F] for (group in group.by) { if (!is.factor(x = data[, group])) { data[, group] <- factor(x = data[, group]) } } } else { if (interactive) { return(ISpatialFeaturePlot( object = object, feature = features[1], image = images[1], image.scale = image.scale, slot = slot, alpha = alpha )) } data <- FetchData( object = object, vars = features, cells = cells, layer = slot, clean = FALSE ) features <- colnames(x = data) # Determine cutoffs min.cutoff <- mapply( FUN = function(cutoff, feature) { return(ifelse( test = is.na(x = cutoff), yes = min(data[, feature]), no = cutoff )) }, cutoff = min.cutoff, feature = features ) max.cutoff <- mapply( FUN = function(cutoff, feature) { return(ifelse( test = is.na(x = cutoff), yes = max(data[, feature]), no = cutoff )) }, cutoff = max.cutoff, feature = features ) check.lengths <- unique(x = vapply( X = list(features, min.cutoff, max.cutoff), FUN = length, FUN.VALUE = numeric(length = 1) )) if (length(x = check.lengths) != 1) { stop("There must be the same number of minimum and maximum cuttoffs as there are features") } # Apply cutoffs data <- sapply( X = 1:ncol(x = data), FUN = function(index) { data.feature <- as.vector(x = data[, index]) min.use <- SetQuantile(cutoff = min.cutoff[index], data.feature) max.use <- SetQuantile(cutoff = max.cutoff[index], data.feature) data.feature[data.feature < min.use] <- min.use data.feature[data.feature > max.use] <- max.use return(data.feature) } ) colnames(x = data) <- features rownames(x = data) <- cells } features <- colnames(x = data) colnames(x = data) <- features rownames(x = data) <- cells facet.highlight <- facet.highlight && (!is.null(x = cells.highlight) && is.list(x = cells.highlight)) if (do.hover) { if (length(x = images) > 1) { images <- images[1] warning( "'do.hover' requires only one image, using image ", images, call. = FALSE, immediate. = TRUE ) } if (length(x = features) > 1) { features <- features[1] type <- ifelse(test = is.null(x = group.by), yes = 'feature', no = 'grouping') warning( "'do.hover' requires only one ", type, ", using ", features, call. = FALSE, immediate. = TRUE ) } if (facet.highlight) { warning( "'do.hover' requires no faceting highlighted cells", call. = FALSE, immediate. = TRUE ) facet.highlight <- FALSE } } if (facet.highlight) { if (length(x = images) > 1) { images <- images[1] warning( "Faceting the highlight only works with a single image, using image ", images, call. = FALSE, immediate. = TRUE ) } ncols <- length(x = cells.highlight) } else { ncols <- length(x = images) } plots <- vector( mode = "list", length = length(x = features) * ncols ) # Get max across all features if (!(is.null(x = keep.scale)) && keep.scale == "all") { max.feature.value <- max(apply(data, 2, function(x) max(x, na.rm = TRUE))) } for (i in 1:ncols) { plot.idx <- i image.idx <- ifelse(test = facet.highlight, yes = 1, no = i) image.use <- object[[images[[image.idx]]]] is_visium <- inherits(image.use, "VisiumV1") || inherits(image.use, "VisiumV2") old_axis_orientation <- (!.hasSlot(image.use, "coords_x_orientation")) || (.hasSlot(image.use, "coords_x_orientation") && (slot(image.use, "coords_x_orientation") != 'horizontal')) if (is_visium && old_axis_orientation) { stop( "Please run `UpdateSeuratObject` on your Seurat object first to ensure that data aligns to the image ", images[[image.idx]], " when plotting.", call. = TRUE ) } coordinates <- GetTissueCoordinates( object = image.use, scale = image.scale ) # if the rownames do not match the cell ids, then dataframe is not created properly rownames(coordinates) <- coordinates$cell highlight.use <- if (facet.highlight) { cells.highlight[i] } else { cells.highlight } for (j in 1:length(x = features)) { cols.unset <- is.factor(x = data[, features[j]]) && is.null(x = cols) if (cols.unset) { cols <- hue_pal()(n = length(x = levels(x = data[, features[j]]))) names(x = cols) <- levels(x = data[, features[j]]) } # Get feature max for individual feature if (!(is.null(x = keep.scale)) && keep.scale == "feature" && !inherits(x = data[, features[j]], what = "factor") ) { max.feature.value <- max(data[, features[j]]) } # Check if object is of type Visium and contains segmentations (attached via Load10X_Spatial) has_visium_segm_data <- (inherits(image.use, "VisiumV2") && !is.null(image.use@boundaries$segmentations) && "sf.data" %in% slotNames(image.use@boundaries$segmentations)) plot <- SingleSpatialPlot( data = cbind( coordinates, data[rownames(x = coordinates), features[j], drop = FALSE] ), image = image.use, image.scale = image.scale, image.alpha = image.alpha, col.by = features[j], cols = cols, alpha.by = if (is.null(x = group.by)) { features[j] } else { NULL }, pt.alpha = if (!is.null(x = group.by)) { alpha[j] } else { NULL }, geom = if (inherits(x = image.use, what = "STARmap")) { "poly_starmap" } else if (has_visium_segm_data) { "poly" } else { "spatial" }, cells.highlight = highlight.use, cols.highlight = cols.highlight, pt.size.factor = pt.size.factor, shape = shape, stroke = stroke, crop = crop, plot_segmentations = plot_segmentations ) if (is.null(x = group.by)) { plot <- plot + scale_fill_gradientn( name = features[j], colours = SpatialColors(n = 100) ) + theme(legend.position = 'top') + scale_alpha(range = alpha) + guides(alpha = "none") } else if (label) { plot <- LabelClusters( plot = plot, id = ifelse( test = is.null(x = cells.highlight), yes = features[j], no = 'highlight' ), geom = if (inherits(x = image.use, what = "STARmap") || (has_visium_segm_data && plot_segmentations)) { 'GeomPolygon' } else if (has_visium_segm_data && !plot_segmentations) { 'GeomPoint' } else { 'GeomSpatial' }, repel = repel, size = label.size, color = label.color, box = label.box, position = "nearest" ) } if (j == 1 && length(x = images) > 1 && !facet.highlight) { plot <- plot + ggtitle(label = images[[image.idx]]) + theme(plot.title = element_text(hjust = 0.5)) } if (facet.highlight) { plot <- plot + ggtitle(label = names(x = cells.highlight)[i]) + theme(plot.title = element_text(hjust = 0.5)) + NoLegend() } if (has_visium_segm_data && plot_segmentations && !is.null(group.by)) { # Add legend guides to show filled squares next to labels when plotting segmentations plot <- plot + guides(fill = guide_legend(override.aes = list(alpha = 1, color = "black", linewidth = 0.2, size = 2))) } # Plot multiple images depending on keep.scale if (!(is.null(x = keep.scale)) && !inherits(x = data[, features[j]], "factor")) { plot <- suppressMessages(plot & scale_fill_gradientn(colors = SpatialColors(n = 100), limits = c(NA, max.feature.value))) } plots[[plot.idx]] <- plot plot.idx <- plot.idx + ncols if (cols.unset) { cols <- NULL } } } if (combine) { if (!is.null(x = ncol)) { return(wrap_plots(plots = plots, ncol = ncol)) } if (length(x = images) > 1) { return(wrap_plots(plots = plots, ncol = length(x = images))) } return(wrap_plots(plots = plots)) } return(plots) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Other plotting functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Plot the Barcode Distribution and Calculated Inflection Points #' #' This function plots the calculated inflection points derived from the barcode-rank #' distribution. #' #' See [CalculateBarcodeInflections()] to calculate inflection points and #' [SubsetByBarcodeInflections()] to subsequently subset the Seurat object. #' #' @param object Seurat object #' #' @return Returns a `ggplot2` object showing the by-group inflection points and provided #' (or default) rank threshold values in grey. #' #' @importFrom methods slot #' @importFrom cowplot theme_cowplot #' @importFrom ggplot2 ggplot geom_line geom_vline #' #' @export #' @concept visualization #' #' @author Robert A. Amezquita, \email{robert.amezquita@fredhutch.org} #' @seealso \code{\link{CalculateBarcodeInflections}} \code{\link{SubsetByBarcodeInflections}} #' #' @examples #' data("pbmc_small") #' pbmc_small <- CalculateBarcodeInflections(pbmc_small, group.column = 'groups') #' BarcodeInflectionsPlot(pbmc_small) #' BarcodeInflectionsPlot <- function(object) { cbi.data <- Tool(object = object, slot = 'CalculateBarcodeInflections') if (is.null(x = cbi.data)) { stop("Barcode inflections not calculated, please run CalculateBarcodeInflections") } ## Extract necessary data frames inflection_points <- cbi.data$inflection_points barcode_distribution <- cbi.data$barcode_distribution threshold_values <- cbi.data$threshold_values # Set a cap to max rank to avoid plot being overextended if (threshold_values$rank[[2]] > max(barcode_distribution$rank, na.rm = TRUE)) { threshold_values$rank[[2]] <- max(barcode_distribution$rank, na.rm = TRUE) } ## Infer the grouping/barcode variables group_var <- colnames(x = barcode_distribution)[1] barcode_var <- colnames(x = barcode_distribution)[2] barcode_distribution[, barcode_var] <- log10(x = barcode_distribution[, barcode_var] + 1) ## Make the plot plot <- ggplot( data = barcode_distribution, mapping = aes( x = .data[['rank']], y = .data[[barcode_var]], group = .data[[group_var]], colour = .data[[group_var]] ) ) + geom_line() + geom_vline( data = threshold_values, aes(xintercept = .data[['rank']]), linetype = "dashed", colour = 'grey60', size = 0.5 ) + geom_vline( data = inflection_points, mapping = aes( xintercept = .data[['rank']], group = .data[[group_var]], colour = .data[[group_var]] ), linetype = "dashed" ) + theme_cowplot() return(plot) } #' Dot plot visualization #' #' Intuitive way of visualizing how feature expression changes across different #' identity classes (clusters). The size of the dot encodes the percentage of #' cells within a class, while the color encodes the AverageExpression level #' across all cells within a class (blue is high). #' #' @param object Seurat object #' @param assay Name of assay to use, defaults to the active assay #' @param features Input vector of features, or named list of feature vectors #' if feature-grouped panels are desired (replicates the functionality of the #' old SplitDotPlotGG) #' @param cols Colors to plot: the name of a palette from #' \code{RColorBrewer::brewer.pal.info}, a pair of colors defining a gradient, #' or 3+ colors defining multiple gradients (if split.by is set) #' @param col.min Minimum scaled average expression threshold (everything #' smaller will be set to this) #' @param col.max Maximum scaled average expression threshold (everything larger #' will be set to this) #' @param dot.min The fraction of cells at which to draw the smallest dot #' (default is 0). All cell groups with less than this expressing the given #' gene will have no dot drawn. #' @param dot.scale Scale the size of the points, similar to cex #' @param idents Identity classes to include in plot (default is all) #' @param group.by Factor to group the cells by #' @param split.by A factor in object metadata to split the plot by, pass 'ident' #' to split by cell identity #' see \code{\link{FetchData}} for more details #' @param cluster.idents Whether to order identities by hierarchical clusters #' based on given features, default is FALSE #' @param scale Determine whether the data is scaled, TRUE for default #' @param scale.by Scale the size of the points by 'size' or by 'radius' #' @param scale.min Set lower limit for scaling, use NA for default #' @param scale.max Set upper limit for scaling, use NA for default #' #' @return A ggplot object #' #' @importFrom grDevices colorRampPalette #' @importFrom cowplot theme_cowplot #' @importFrom ggplot2 ggplot geom_point scale_size scale_radius #' theme element_blank labs scale_color_identity scale_color_distiller #' scale_color_gradient guides guide_legend guide_colorbar #' facet_grid unit #' @importFrom scattermore geom_scattermore #' @importFrom stats dist hclust #' @importFrom RColorBrewer brewer.pal.info #' #' @export #' @concept visualization #' #' @aliases SplitDotPlotGG #' @seealso \code{RColorBrewer::brewer.pal.info} #' #' @examples #' data("pbmc_small") #' cd_genes <- c("CD247", "CD3E", "CD9") #' DotPlot(object = pbmc_small, features = cd_genes) #' pbmc_small[['groups']] <- sample(x = c('g1', 'g2'), size = ncol(x = pbmc_small), replace = TRUE) #' DotPlot(object = pbmc_small, features = cd_genes, split.by = 'groups') #' DotPlot <- function( object, features, assay = NULL, cols = c("lightgrey", "blue"), col.min = -2.5, col.max = 2.5, dot.min = 0, dot.scale = 6, idents = NULL, group.by = NULL, split.by = NULL, cluster.idents = FALSE, scale = TRUE, scale.by = 'radius', scale.min = NA, scale.max = NA ) { assay <- assay %||% DefaultAssay(object = object) DefaultAssay(object = object) <- assay split.colors <- !is.null(x = split.by) && !any(cols %in% rownames(x = brewer.pal.info)) scale.func <- switch( EXPR = scale.by, 'size' = scale_size, 'radius' = scale_radius, stop("'scale.by' must be either 'size' or 'radius'") ) feature.groups <- NULL if (is.list(features) | any(!is.na(names(features)))) { feature.groups <- unlist(x = sapply( X = 1:length(features), FUN = function(x) { return(rep(x = names(x = features)[x], each = length(features[[x]]))) } )) if (any(is.na(x = feature.groups))) { warning( "Some feature groups are unnamed.", call. = FALSE, immediate. = TRUE ) } features <- unlist(x = features) names(x = feature.groups) <- features } cells <- unlist(x = CellsByIdentities(object = object, cells = colnames(object[[assay]]), idents = idents)) data.features <- FetchData(object = object, vars = features, cells = cells) data.features$id <- if (is.null(x = group.by)) { Idents(object = object)[cells, drop = TRUE] } else { object[[group.by, drop = TRUE]][cells, drop = TRUE] } if (!is.factor(x = data.features$id)) { data.features$id <- factor(x = data.features$id) } id.levels <- levels(x = data.features$id) data.features$id <- as.vector(x = data.features$id) if (!is.null(x = split.by)) { splits <- FetchData(object = object, vars = split.by)[cells, split.by] if (split.colors) { if (length(x = unique(x = splits)) > length(x = cols)) { stop(paste0("Need to specify at least ", length(x = unique(x = splits)), " colors using the cols parameter")) } cols <- cols[1:length(x = unique(x = splits))] names(x = cols) <- unique(x = splits) } data.features$id <- paste(data.features$id, splits, sep = '_') unique.splits <- unique(x = splits) id.levels <- paste0(rep(x = id.levels, each = length(x = unique.splits)), "_", rep(x = unique(x = splits), times = length(x = id.levels))) } data.plot <- lapply( X = unique(x = data.features$id), FUN = function(ident) { data.use <- data.features[data.features$id == ident, 1:(ncol(x = data.features) - 1), drop = FALSE] avg.exp <- apply( X = data.use, MARGIN = 2, FUN = function(x) { return(mean(x = expm1(x = x))) } ) pct.exp <- apply(X = data.use, MARGIN = 2, FUN = PercentAbove, threshold = 0) return(list(avg.exp = avg.exp, pct.exp = pct.exp)) } ) names(x = data.plot) <- unique(x = data.features$id) if (cluster.idents) { mat <- do.call( what = rbind, args = lapply(X = data.plot, FUN = unlist) ) mat <- scale(x = mat) id.levels <- id.levels[hclust(d = dist(x = mat))$order] } data.plot <- lapply( X = names(x = data.plot), FUN = function(x) { data.use <- as.data.frame(x = data.plot[[x]]) data.use$features.plot <- rownames(x = data.use) data.use$id <- x return(data.use) } ) data.plot <- do.call(what = 'rbind', args = data.plot) if (!is.null(x = id.levels)) { data.plot$id <- factor(x = data.plot$id, levels = id.levels) } ngroup <- length(x = levels(x = data.plot$id)) if (ngroup == 1) { scale <- FALSE warning( "Only one identity present, the expression values will be not scaled", call. = FALSE, immediate. = TRUE ) } else if (ngroup < 5 & scale) { warning( "Scaling data with a low number of groups may produce misleading results", call. = FALSE, immediate. = TRUE ) } avg.exp.scaled <- sapply( X = unique(x = data.plot$features.plot), FUN = function(x) { data.use <- data.plot[data.plot$features.plot == x, 'avg.exp'] if (scale) { data.use <- scale(x = log1p(data.use)) data.use <- MinMax(data = data.use, min = col.min, max = col.max) } else { data.use <- log1p(x = data.use) } return(data.use) } ) avg.exp.scaled <- as.vector(x = t(x = avg.exp.scaled)) if (split.colors) { avg.exp.scaled <- as.numeric(x = cut(x = avg.exp.scaled, breaks = 20)) } data.plot$avg.exp.scaled <- avg.exp.scaled data.plot$features.plot <- factor( x = data.plot$features.plot, levels = features ) data.plot$pct.exp[data.plot$pct.exp < dot.min] <- NA data.plot$pct.exp <- data.plot$pct.exp * 100 if (split.colors) { splits.use <- unlist(x = lapply( X = data.plot$id, FUN = function(x) sub( paste0(".*_(", paste(sort(unique(x = splits), decreasing = TRUE), collapse = '|' ),")$"), "\\1", x ) ) ) data.plot$colors <- mapply( FUN = function(color, value) { return(colorRampPalette(colors = c('grey', color))(20)[value]) }, color = cols[splits.use], value = avg.exp.scaled ) } color.by <- ifelse(test = split.colors, yes = 'colors', no = 'avg.exp.scaled') if (!is.na(x = scale.min)) { data.plot[data.plot$pct.exp < scale.min, 'pct.exp'] <- scale.min } if (!is.na(x = scale.max)) { data.plot[data.plot$pct.exp > scale.max, 'pct.exp'] <- scale.max } if (!is.null(x = feature.groups)) { data.plot$feature.groups <- factor( x = feature.groups[data.plot$features.plot], levels = unique(x = feature.groups) ) } plot <- ggplot(data = data.plot, mapping = aes(x = .data[["features.plot"]], y = .data[["id"]])) + geom_point(mapping = aes(size = .data[["pct.exp"]], color = .data[[color.by]])) + scale.func(range = c(0, dot.scale), limits = c(scale.min, scale.max)) + theme(axis.title.x = element_blank(), axis.title.y = element_blank()) + guides(size = guide_legend(title = 'Percent Expressed')) + labs( x = 'Features', y = ifelse(test = is.null(x = split.by), yes = 'Identity', no = 'Split Identity') ) + theme_cowplot() if (!is.null(x = feature.groups)) { plot <- plot + facet_grid( rows = ~feature.groups, scales = "free_x", space = "free_x", switch = "y" ) + theme( panel.spacing = unit(x = 1, units = "lines"), strip.background = element_blank() ) } if (split.colors) { plot <- plot + scale_color_identity() } else if (length(x = cols) == 1) { plot <- plot + scale_color_distiller(palette = cols) } else { plot <- plot + scale_color_gradient(low = cols[1], high = cols[2]) } if (!split.colors) { plot <- plot + guides(color = guide_colorbar(title = 'Average Expression')) } return(plot) } #' Quickly Pick Relevant Dimensions #' #' Plots the standard deviations (or approximate singular values if running PCAFast) #' of the principle components for easy identification of an elbow in the graph. #' This elbow often corresponds well with the significant dims and is much faster to run than #' Jackstraw #' #' @param object Seurat object #' @param ndims Number of dimensions to plot standard deviation for #' @param reduction Reduction technique to plot standard deviation for #' #' @return A ggplot object #' #' @importFrom cowplot theme_cowplot #' @importFrom ggplot2 ggplot geom_point labs element_line #' @export #' @concept visualization #' #' @examples #' data("pbmc_small") #' ElbowPlot(object = pbmc_small) #' ElbowPlot <- function(object, ndims = 20, reduction = 'pca') { data.use <- Stdev(object = object, reduction = reduction) if (length(x = data.use) == 0) { stop(paste("No standard deviation info stored for", reduction)) } if (ndims > length(x = data.use)) { warning("The object only has information for ", length(x = data.use), " reductions") ndims <- length(x = data.use) } stdev <- 'Standard Deviation' plot <- ggplot(data = data.frame(dims = 1:ndims, stdev = data.use[1:ndims])) + geom_point(mapping = aes(x = .data[['dims']], y = .data[['stdev']])) + labs( x = gsub( pattern = '_$', replacement = '', x = Key(object = object[[reduction]]) ), y = stdev ) + theme_cowplot() return(plot) } #' Boxplot of correlation of a variable (e.g. number of UMIs) with expression #' data #' #' @param object Seurat object #' @param assay Assay where the feature grouping info and correlations are #' stored #' @param feature.group Name of the column in meta.features where the feature #' grouping info is stored #' @param cor Name of the column in meta.features where correlation info is #' stored #' #' @return Returns a ggplot boxplot of correlations split by group #' #' @importFrom ggplot2 geom_boxplot scale_fill_manual geom_hline #' @importFrom cowplot theme_cowplot #' @importFrom scales brewer_pal #' @importFrom stats complete.cases #' #' @export #' @concept visualization #' GroupCorrelationPlot <- function( object, assay = NULL, feature.group = "feature.grp", cor = "nCount_RNA_cor" ) { assay <- assay %||% DefaultAssay(object = object) data <- object[[assay]][[c(feature.group, cor)]] data <- data[complete.cases(data), ] colnames(x = data) <- c('grp', 'cor') data$grp <- as.character(data$grp) plot <- ggplot(data = data, aes(x = .data[["grp"]], y = .data[["cor"]], fill = .data[["grp"]])) + geom_boxplot() + theme_cowplot() + scale_fill_manual(values = rev(x = brewer_pal(palette = 'YlOrRd')(n = 7))) + ylab(paste( "Correlation with", gsub(x = cor, pattern = "_cor", replacement = "") )) + geom_hline(yintercept = 0) + NoLegend() + theme( axis.line.x = element_blank(), axis.title.x = element_blank(), axis.ticks.x = element_blank(), axis.text.x = element_blank() ) return(plot) } #' JackStraw Plot #' #' Plots the results of the JackStraw analysis for PCA significance. For each #' PC, plots a QQ-plot comparing the distribution of p-values for all genes #' across each PC, compared with a uniform distribution. Also determines a #' p-value for the overall significance of each PC (see Details). #' #' Significant PCs should show a p-value distribution (black curve) that is #' strongly skewed to the left compared to the null distribution (dashed line) #' The p-value for each PC is based on a proportion test comparing the number #' of genes with a p-value below a particular threshold (score.thresh), compared with the #' proportion of genes expected under a uniform distribution of p-values. #' #' @param object Seurat object #' @param dims Dims to plot #' @param cols Vector of colors, each color corresponds to an individual PC. This may also be a single character #' or numeric value corresponding to a palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}. #' By default, ggplot2 assigns colors. We also include a number of palettes from the pals package. #' See \code{\link{DiscretePalette}} for details. #' @param reduction reduction to pull jackstraw info from #' @param xmax X-axis maximum on each QQ plot. #' @param ymax Y-axis maximum on each QQ plot. #' #' @return A ggplot object #' #' @author Omri Wurtzel #' @seealso \code{\link{ScoreJackStraw}} #' #' @importFrom stats qunif #' @importFrom scales hue_pal #' @importFrom ggplot2 ggplot stat_qq labs xlim ylim #' coord_flip geom_abline guides guide_legend #' @importFrom cowplot theme_cowplot #' #' @export #' @concept visualization #' #' @examples #' data("pbmc_small") #' JackStrawPlot(object = pbmc_small) #' JackStrawPlot <- function( object, dims = 1:5, cols = NULL, reduction = 'pca', xmax = 0.1, ymax = 0.3 ) { pAll <- JS(object = object[[reduction]], slot = 'empirical') if (max(dims) > ncol(x = pAll)) { stop("Max dimension is ", ncol(x = pAll)) } pAll <- pAll[, dims, drop = FALSE] pAll <- as.data.frame(x = pAll) data.plot <- Melt(x = pAll) colnames(x = data.plot) <- c("Contig", "PC", "Value") score.df <- JS(object = object[[reduction]], slot = 'overall') if (nrow(x = score.df) < max(dims)) { stop("Jackstraw procedure not scored for all the provided dims. Please run ScoreJackStraw.") } score.df <- score.df[dims, , drop = FALSE] if (nrow(x = score.df) == 0) { stop(paste0("JackStraw hasn't been scored. Please run ScoreJackStraw before plotting.")) } data.plot$PC.Score <- rep( x = paste0("PC ", score.df[ ,"PC"], ": ", sprintf("%1.3g", score.df[ ,"Score"])), each = length(x = unique(x = data.plot$Contig)) ) data.plot$PC.Score <- factor( x = data.plot$PC.Score, levels = paste0("PC ", score.df[, "PC"], ": ", sprintf("%1.3g", score.df[, "Score"])) ) if (is.null(x = cols)) { cols <- hue_pal()(length(x = dims)) } if (length(x = cols) < length(x = dims)) { stop("Not enough colors for the number of dims selected") } gp <- ggplot(data = data.plot, mapping = aes(sample = .data[['Value']], color = .data[['PC.Score']])) + stat_qq(distribution = qunif) + labs(x = "Theoretical [runif(1000)]", y = "Empirical") + scale_color_manual(values = cols) + xlim(0, ymax) + ylim(0, xmax) + coord_flip() + geom_abline(intercept = 0, slope = 1, linetype = "dashed", na.rm = TRUE) + guides(color = guide_legend(title = "PC: p-value")) + theme_cowplot() return(gp) } #' Plot clusters as a tree #' #' Plots previously computed tree (from BuildClusterTree) #' #' @param object Seurat object #' @param direction A character string specifying the direction of the tree (default is downwards) #' Possible options: "rightwards", "leftwards", "upwards", and "downwards". #' @param \dots Additional arguments to #' \code{\link[ape:plot.phylo]{ape::plot.phylo}} #' #' @return Plots dendogram (must be precomputed using BuildClusterTree), returns no value #' #' @export #' @concept visualization #' #' @examples #' \dontrun{ #' if (requireNamespace("ape", quietly = TRUE)) { #' data("pbmc_small") #' pbmc_small <- BuildClusterTree(object = pbmc_small) #' PlotClusterTree(object = pbmc_small) #' } #' } PlotClusterTree <- function(object, direction = "downwards", ...) { if (isFALSE(x = requireNamespace('ape', quietly = TRUE))) { stop(cluster.ape, call. = FALSE) } if (is.null(x = Tool(object = object, slot = "BuildClusterTree"))) { stop("Phylogenetic tree does not exist, build using BuildClusterTree") } data.tree <- Tool(object = object, slot = "BuildClusterTree") ape::plot.phylo(x = data.tree, direction = direction, ...) ape::nodelabels() } #' Visualize Dimensional Reduction genes #' #' Visualize top genes associated with reduction components #' #' @param object Seurat object #' @param reduction Reduction technique to visualize results for #' @param dims Number of dimensions to display #' @param nfeatures Number of genes to display #' @param col Color of points to use #' @param projected Use reduction values for full dataset (i.e. projected #' dimensional reduction values) #' @param balanced Return an equal number of genes with + and - scores. If #' FALSE (default), returns the top genes ranked by the scores absolute values #' @param ncol Number of columns to display #' @param combine Combine plots into a single \code{patchwork} #' ggplot object. If \code{FALSE}, return a list of ggplot objects #' #' @return A \code{patchwork} ggplot object if #' \code{combine = TRUE}; otherwise, a list of ggplot objects #' #' @importFrom patchwork wrap_plots #' @importFrom cowplot theme_cowplot #' @importFrom ggplot2 ggplot geom_point labs #' @export #' @concept visualization #' #' @examples #' data("pbmc_small") #' VizDimLoadings(object = pbmc_small) #' VizDimLoadings <- function( object, dims = 1:5, nfeatures = 30, col = 'blue', reduction = 'pca', projected = FALSE, balanced = FALSE, ncol = NULL, combine = TRUE ) { if (is.null(x = ncol)) { ncol <- 2 if (length(x = dims) == 1) { ncol <- 1 } if (length(x = dims) > 6) { ncol <- 3 } if (length(x = dims) > 9) { ncol <- 4 } } loadings <- Loadings(object = object[[reduction]], projected = projected) features <- lapply( X = dims, FUN = TopFeatures, object = object[[reduction]], nfeatures = nfeatures, projected = projected, balanced = balanced ) features <- lapply( X = features, FUN = unlist, use.names = FALSE ) loadings <- loadings[unlist(x = features), dims, drop = FALSE] names(x = features) <- colnames(x = loadings) <- as.character(x = dims) plots <- lapply( X = as.character(x = dims), FUN = function(i) { data.plot <- as.data.frame(x = loadings[features[[i]], i, drop = FALSE]) colnames(x = data.plot) <- paste0(Key(object = object[[reduction]]), i) data.plot$feature <- factor(x = rownames(x = data.plot), levels = rownames(x = data.plot)) plot <- ggplot( data = data.plot, mapping = aes(x = .data[[paste0(Key(object = object[[reduction]]), i)]], y = .data[['feature']]) ) + geom_point(col = col) + labs(y = NULL) + theme_cowplot() return(plot) } ) if (combine) { plots <- wrap_plots(plots, ncol = ncol) } return(plots) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Exported utility functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Augments ggplot2-based plot with a PNG image. #' #' Creates "vector-friendly" plots. Does this by saving a copy of the plot as a PNG file, #' then adding the PNG image with \code{\link[ggplot2]{annotation_raster}} to a blank plot #' of the same dimensions as \code{plot}. Please note: original legends and axes will be lost #' during augmentation. #' #' @param plot A ggplot object #' @param width,height Width and height of PNG version of plot #' @param dpi Plot resolution #' #' @return A ggplot object #' #' @importFrom png readPNG #' @importFrom ggplot2 ggplot_build ggsave ggplot geom_blank annotation_raster ggtitle #' #' @export #' @concept visualization #' #' @examples #' \dontrun{ #' data("pbmc_small") #' plot <- DimPlot(object = pbmc_small) #' AugmentPlot(plot = plot) #' } #' AugmentPlot <- function(plot, width = 10, height = 10, dpi = 100) { pbuild.params <- ggplot_build(plot = plot)$layout$panel_params[[1]] range.values <- c( pbuild.params$x.range, pbuild.params$y.range ) xyparams <- GetXYAesthetics( plot = plot, geom = class(x = plot$layers[[1]]$geom)[1] ) title <- plot$labels$title tmpfile <- tempfile(fileext = '.png') ggsave( filename = tmpfile, plot = plot + NoLegend() + NoAxes() + theme(plot.title = element_blank()), width = width, height = height, dpi = dpi ) img <- readPNG(source = tmpfile) file.remove(tmpfile) blank <- ggplot( data = plot$data, mapping = aes(x = .data[[xyparams$x]], y = .data[[xyparams$y]]) ) + geom_blank() blank <- blank + plot$theme + ggtitle(label = title) blank <- blank + annotation_raster( raster = img, xmin = range.values[1], xmax = range.values[2], ymin = range.values[3], ymax = range.values[4] ) return(blank) } #' Automagically calculate a point size for ggplot2-based scatter plots #' #' It happens to look good #' #' @param data A data frame being passed to ggplot2 #' @param raster If TRUE, point size is set to 1 #' #' @return The "optimal" point size for visualizing these data #' #' @export #' @concept visualization #' #' @examples #' df <- data.frame(x = rnorm(n = 10000), y = runif(n = 10000)) #' AutoPointSize(data = df) #' AutoPointSize <- function(data, raster = NULL) { return(ifelse( test = isTRUE(x = raster), yes = 1, no = min(1583 / nrow(x = data), 1) )) } #' Determine text color based on background color #' #' @param background A vector of background colors; supports R color names and #' hexadecimal codes #' @param threshold Intensity threshold for light/dark cutoff; intensities #' greater than \code{theshold} yield \code{dark}, others yield \code{light} #' @param w3c Use \href{https://www.w3.org/TR/WCAG20/}{W3C} formula for calculating #' background text color; ignores \code{threshold} #' @param dark Color for dark text #' @param light Color for light text #' #' @return A named vector of either \code{dark} or \code{light}, depending on #' \code{background}; names of vector are \code{background} #' #' @export #' @concept visualization #' #' @source \url{https://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color} #' #' @examples #' BGTextColor(background = c('black', 'white', '#E76BF3')) #' BGTextColor <- function( background, threshold = 186, w3c = FALSE, dark = 'black', light = 'white' ) { if (w3c) { luminance <- Luminance(color = background) threshold <- 179 return(ifelse( test = luminance > sqrt(x = 1.05 * 0.05) - 0.05, yes = dark, no = light )) } return(ifelse( test = Intensity(color = background) > threshold, yes = dark, no = light )) } #' @export #' @concept visualization #' #' @rdname CustomPalette #' @aliases BlackAndWhite #' #' @examples #' df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) #' plot(df, col = BlackAndWhite()) #' BlackAndWhite <- function(mid = NULL, k = 50) { return(CustomPalette(low = "white", high = "black", mid = mid, k = k)) } #' @export #' @concept visualization #' #' @rdname CustomPalette #' @aliases BlueAndRed #' #' @examples #' df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) #' plot(df, col = BlueAndRed()) #' BlueAndRed <- function(k = 50) { return(CustomPalette(low = "#313695" , high = "#A50026", mid = "#FFFFBF", k = k)) } #' Cell Selector #' #' Select points on a scatterplot and get information about them #' #' @param plot A ggplot2 plot #' @param object An optional Seurat object; if passes, will return an object #' with the identities of selected cells set to \code{ident} #' @param ident An optional new identity class to assign the selected cells #' @param ... Ignored #' #' @return If \code{object} is \code{NULL}, the names of the points selected; #' otherwise, a Seurat object with the selected cells identity classes set to #' \code{ident} #' #' @importFrom miniUI miniPage gadgetTitleBar miniTitleBarButton #' miniContentPanel #' @importFrom shiny fillRow plotOutput brushOpts reactiveValues observeEvent #' stopApp brushedPoints renderPlot runGadget #' #' @export #' @concept visualization #' #' @seealso \code{\link{DimPlot}} \code{\link{FeaturePlot}} #' #' @examples #' \dontrun{ #' data("pbmc_small") #' plot <- DimPlot(object = pbmc_small) #' # Follow instructions in the terminal to select points #' cells.located <- CellSelector(plot = plot) #' cells.located #' # Automatically set the identity class of selected cells and return a new Seurat object #' pbmc_small <- CellSelector(plot = plot, object = pbmc_small, ident = 'SelectedCells') #' } #' CellSelector <- function(plot, object = NULL, ident = 'SelectedCells', ...) { # Set up the gadget UI ui <- miniPage( gadgetTitleBar( title = "Cell Selector", left = miniTitleBarButton(inputId = "reset", label = "Reset") ), miniContentPanel( fillRow( plotOutput( outputId = "plot", height = '100%', brush = brushOpts( id = 'brush', delay = 100, delayType = 'debounce', clip = TRUE, resetOnNew = FALSE ) ) ), ) ) # Get some plot information if (inherits(x = plot, what = 'patchwork')) { if (length(x = plot$patches$plots)) { warning( "Multiple plots passed, using last plot", call. = FALSE, immediate. = TRUE ) } class(x = plot) <- grep( pattern = 'patchwork', x = class(x = plot), value = TRUE, invert = TRUE ) } xy.aes <- GetXYAesthetics(plot = plot) dark.theme <- !is.null(x = plot$theme$plot.background$fill) && plot$theme$plot.background$fill == 'black' plot.data <- GGpointToBase(plot = plot, do.plot = FALSE) plot.data$selected_ <- FALSE rownames(x = plot.data) <- rownames(x = plot$data) colnames(x = plot.data) <- gsub( pattern = '-', replacement = '.', x = colnames(x = plot.data) ) # Server function server <- function(input, output, session) { plot.env <- reactiveValues(data = plot.data) # Event handlers observeEvent( eventExpr = input$done, handlerExpr = { PlotBuild(data = plot.env$data, dark.theme = dark.theme) selected <- rownames(x = plot.data)[plot.env$data$selected_] if (inherits(x = object, what = 'Seurat')) { if (!all(selected %in% Cells(x = object))) { stop("Cannot find the selected cells in the Seurat object, please be sure you pass the same object used to generate the plot") } Idents(object = object, cells = selected) <- ident selected <- object } stopApp(returnValue = selected) } ) observeEvent( eventExpr = input$reset, handlerExpr = { plot.env$data <- plot.data session$resetBrush(brushId = 'brush') } ) observeEvent( eventExpr = input$brush, handlerExpr = { plot.env$data <- brushedPoints( df = plot.data, brush = input$brush, xvar = xy.aes$x, yvar = xy.aes$y, allRows = TRUE ) plot.env$data$color <- ifelse( test = plot.env$data$selected_, yes = '#DE2D26', no = '#C3C3C3' ) } ) # Render the plot output$plot <- renderPlot(expr = PlotBuild( data = plot.env$data, dark.theme = dark.theme )) } return(runGadget(app = ui, server = server)) } #' Move outliers towards center on dimension reduction plot #' #' @param object Seurat object #' @param reduction Name of DimReduc to adjust #' @param dims Dimensions to visualize #' @param group.by Group (color) cells in different ways (for example, orig.ident) #' @param outlier.sd Controls the outlier distance #' @param reduction.key Key for DimReduc that is returned #' #' @return Returns a DimReduc object with the modified embeddings #' #' @export #' @concept visualization #' #' @examples #' \dontrun{ #' data("pbmc_small") #' pbmc_small <- FindClusters(pbmc_small, resolution = 1.1) #' pbmc_small <- RunUMAP(pbmc_small, dims = 1:5) #' DimPlot(pbmc_small, reduction = "umap") #' pbmc_small[["umap_new"]] <- CollapseEmbeddingOutliers(pbmc_small, #' reduction = "umap", reduction.key = 'umap_', outlier.sd = 0.5) #' DimPlot(pbmc_small, reduction = "umap_new") #' } #' CollapseEmbeddingOutliers <- function( object, reduction = 'umap', dims = 1:2, group.by = 'ident', outlier.sd = 2, reduction.key = 'UMAP_' ) { embeddings <- Embeddings(object = object[[reduction]])[, dims] idents <- FetchData(object = object, vars = group.by) data.medians <- sapply(X = dims, FUN = function(x) { tapply(X = embeddings[, x], INDEX = idents, FUN = median) }) data.sd <- apply(X = data.medians, MARGIN = 2, FUN = sd) data.medians.scale <- as.matrix(x = scale(x = data.medians, center = TRUE, scale = TRUE)) data.medians.scale[abs(x = data.medians.scale) < outlier.sd] <- 0 data.medians.scale <- sign(x = data.medians.scale) * (abs(x = data.medians.scale) - outlier.sd) data.correct <- Sweep( x = data.medians.scale, MARGIN = 2, STATS = data.sd, FUN = "*" ) data.correct <- data.correct[abs(x = apply(X = data.correct, MARGIN = 1, FUN = min)) > 0, ] new.embeddings <- embeddings for (i in rownames(x = data.correct)) { cells.correct <- rownames(x = idents)[idents[, "ident"] == i] new.embeddings[cells.correct, ] <- Sweep( x = new.embeddings[cells.correct,], MARGIN = 2, STATS = data.correct[i, ], FUN = "-" ) } reduc <- CreateDimReducObject( embeddings = new.embeddings, loadings = Loadings(object = object[[reduction]]), assay = slot(object = object[[reduction]], name = "assay.used"), key = reduction.key ) return(reduc) } #' Combine ggplot2-based plots into a single plot #' #' @param plots A list of gg objects #' @param ncol Number of columns #' @param legend Combine legends into a single legend #' choose from 'right' or 'bottom'; pass 'none' to remove legends, or \code{NULL} #' to leave legends as they are #' @param ... Extra parameters passed to plot_grid #' #' @return A combined plot #' #' @importFrom cowplot plot_grid get_legend #' @export #' @concept visualization #' #' @examples #' data("pbmc_small") #' pbmc_small[['group']] <- sample( #' x = c('g1', 'g2'), #' size = ncol(x = pbmc_small), #' replace = TRUE #' ) #' plot1 <- FeaturePlot( #' object = pbmc_small, #' features = 'MS4A1', #' split.by = 'group' #' ) #' plot2 <- FeaturePlot( #' object = pbmc_small, #' features = 'FCN1', #' split.by = 'group' #' ) #' CombinePlots( #' plots = list(plot1, plot2), #' legend = 'none', #' nrow = length(x = unique(x = pbmc_small[['group', drop = TRUE]])) #' ) #' CombinePlots <- function(plots, ncol = NULL, legend = NULL, ...) { .Deprecated(msg = "CombinePlots is being deprecated. Plots should now be combined using the patchwork system.") plots.combined <- if (length(x = plots) > 1) { if (!is.null(x = legend)) { if (legend != 'none') { plot.legend <- get_legend(plot = plots[[1]] + theme(legend.position = legend)) } plots <- lapply( X = plots, FUN = function(x) { return(x + NoLegend()) } ) } plots.combined <- plot_grid( plotlist = plots, ncol = ncol, align = 'hv', ... ) if (!is.null(x = legend)) { plots.combined <- switch( EXPR = legend, 'bottom' = plot_grid( plots.combined, plot.legend, ncol = 1, rel_heights = c(1, 0.2) ), 'right' = plot_grid( plots.combined, plot.legend, rel_widths = c(3, 0.3) ), plots.combined ) } plots.combined } else { plots[[1]] } return(plots.combined) } #' Create a custom color palette #' #' Creates a custom color palette based on low, middle, and high color values #' #' @param low low color #' @param high high color #' @param mid middle color. Optional. #' @param k number of steps (colors levels) to include between low and high values #' #' @return A color palette for plotting #' #' @importFrom grDevices col2rgb rgb #' @export #' @concept visualization #' #' @rdname CustomPalette #' @examples #' myPalette <- CustomPalette() #' myPalette #' CustomPalette <- function( low = "white", high = "red", mid = NULL, k = 50 ) { low <- col2rgb(col = low) / 255 high <- col2rgb(col = high) / 255 if (is.null(x = mid)) { r <- seq(from = low[1], to = high[1], len = k) g <- seq(from = low[2], to = high[2], len = k) b <- seq(from = low[3], to = high[3], len = k) } else { k2 <- round(x = k / 2) mid <- col2rgb(col = mid) / 255 r <- c( seq(from = low[1], to = mid[1], len = k2), seq(from = mid[1], to = high[1], len = k2) ) g <- c( seq(from = low[2], to = mid[2], len = k2), seq(from = mid[2], to = high[2],len = k2) ) b <- c( seq(from = low[3], to = mid[3], len = k2), seq(from = mid[3], to = high[3], len = k2) ) } return(rgb(red = r, green = g, blue = b)) } #' Discrete colour palettes from pals #' #' These are included here because pals depends on a number of compiled #' packages, and this can lead to increases in run time for Travis, #' and generally should be avoided when possible. #' #' These palettes are a much better default for data with many classes #' than the default ggplot2 palette. #' #' Many thanks to Kevin Wright for writing the pals package. #' #' @param n Number of colours to be generated. #' @param palette Options are #' "alphabet", "alphabet2", "glasbey", "polychrome", "stepped", and "parade". #' Can be omitted and the function will use the one based on the requested n. #' @param shuffle Shuffle the colors in the selected palette. #' #' @return A vector of colors #' #' @details #' Taken from the pals package (Licence: GPL-3). #' \url{https://cran.r-project.org/package=pals} #' Credit: Kevin Wright #' #' @export #' @concept visualization #' DiscretePalette <- function(n, palette = NULL, shuffle = FALSE) { palettes <- list( alphabet = c( "#F0A0FF", "#0075DC", "#993F00", "#4C005C", "#191919", "#005C31", "#2BCE48", "#FFCC99", "#808080", "#94FFB5", "#8F7C00", "#9DCC00", "#C20088", "#003380", "#FFA405", "#FFA8BB", "#426600", "#FF0010", "#5EF1F2", "#00998F", "#E0FF66", "#740AFF", "#990000", "#FFFF80", "#FFE100", "#FF5005" ), alphabet2 = c( "#AA0DFE", "#3283FE", "#85660D", "#782AB6", "#565656", "#1C8356", "#16FF32", "#F7E1A0", "#E2E2E2", "#1CBE4F", "#C4451C", "#DEA0FD", "#FE00FA", "#325A9B", "#FEAF16", "#F8A19F", "#90AD1C", "#F6222E", "#1CFFCE", "#2ED9FF", "#B10DA1", "#C075A6", "#FC1CBF", "#B00068", "#FBE426", "#FA0087" ), glasbey = c( "#0000FF", "#FF0000", "#00FF00", "#000033", "#FF00B6", "#005300", "#FFD300", "#009FFF", "#9A4D42", "#00FFBE", "#783FC1", "#1F9698", "#FFACFD", "#B1CC71", "#F1085C", "#FE8F42", "#DD00FF", "#201A01", "#720055", "#766C95", "#02AD24", "#C8FF00", "#886C00", "#FFB79F", "#858567", "#A10300", "#14F9FF", "#00479E", "#DC5E93", "#93D4FF", "#004CFF", "#F2F318" ), polychrome = c( "#5A5156", "#E4E1E3", "#F6222E", "#FE00FA", "#16FF32", "#3283FE", "#FEAF16", "#B00068", "#1CFFCE", "#90AD1C", "#2ED9FF", "#DEA0FD", "#AA0DFE", "#F8A19F", "#325A9B", "#C4451C", "#1C8356", "#85660D", "#B10DA1", "#FBE426", "#1CBE4F", "#FA0087", "#FC1CBF", "#F7E1A0", "#C075A6", "#782AB6", "#AAF400", "#BDCDFF", "#822E1C", "#B5EFB5", "#7ED7D1", "#1C7F93", "#D85FF7", "#683B79", "#66B0FF", "#3B00FB" ), stepped = c( "#990F26", "#B33E52", "#CC7A88", "#E6B8BF", "#99600F", "#B3823E", "#CCAA7A", "#E6D2B8", "#54990F", "#78B33E", "#A3CC7A", "#CFE6B8", "#0F8299", "#3E9FB3", "#7ABECC", "#B8DEE6", "#3D0F99", "#653EB3", "#967ACC", "#C7B8E6", "#333333", "#666666", "#999999", "#CCCCCC" ), parade = c( '#ff6969', '#9b37ff', '#cd3737', '#69cdff', '#ffff69', '#69cdcd', '#9b379b', '#3737cd', '#ffff9b', '#cdff69', '#ff9b37', '#37ffff', '#9b69ff', '#37cd69', '#ff3769', '#ff3737', '#37ff9b', '#cdcd37', '#3769cd', '#37cdff', '#9b3737', '#ff699b', '#9b9bff', '#cd9b37', '#69ff37', '#cd3769', '#cd69cd', '#cd6937', '#3737ff', '#cdcd69', '#ff9b69', '#cd37cd', '#9bff37', '#cd379b', '#cd6969', '#69ff9b', '#ff379b', '#9bff9b', '#6937ff', '#69cd37', '#cdff37', '#9bff69', '#9b37cd', '#ff37ff', '#ff37cd', '#ffff37', '#37cd9b', '#379bff', '#ffcd37', '#379b37', '#ff9bff', '#379b9b', '#69ffcd', '#379bcd', '#ff69ff', '#ff9b9b', '#37ff69', '#ff6937', '#6969ff', '#699bff', '#ffcd69', '#69ffff', '#37ff37', '#6937cd', '#37cd37', '#3769ff', '#cd69ff', '#6969cd', '#9bcd37', '#69ff69', '#37cdcd', '#cd37ff', '#37379b', '#37ffcd', '#69cd69', '#ff69cd', '#9bffff', '#9b9b37' ) ) if (is.null(x = n)) { return(names(x = palettes)) } if (is.null(x = palette)) { if (n <= 26) { palette <- "alphabet" } else if (n <= 32) { palette <- "glasbey" } else { palette <- "polychrome" } } palette.vec <- palettes[[palette]] if (n > length(x = palette.vec)) { warning("Not enough colours in specified palette") } if (isTRUE(shuffle)) { palette.vec <- sample(palette.vec) } palette <- palette.vec[seq_len(length.out = n)] return(palette) } #' @rdname CellSelector #' @export #' @concept visualization #' FeatureLocator <- function(plot, ...) { .Defunct( new = 'CellSelector', package = 'Seurat', msg = "'FeatureLocator' has been replaced by 'CellSelector'" ) } #' Hover Locator #' #' Get quick information from a scatterplot by hovering over points #' #' @param plot A ggplot2 plot #' @param information An optional dataframe or matrix of extra information to be displayed on hover #' @param dark.theme Plot using a dark theme? #' @param axes Display or hide x- and y-axes #' @param ... Extra parameters to be passed to \code{\link[plotly]{layout}} #' #' @importFrom ggplot2 ggplot_build #' @importFrom plotly plot_ly layout add_annotations #' @export #' @concept visualization #' #' @seealso \code{\link[plotly]{layout}} \code{\link[ggplot2]{ggplot_build}} #' \code{\link{DimPlot}} \code{\link{FeaturePlot}} #' #' @examples #' \dontrun{ #' data("pbmc_small") #' plot <- DimPlot(object = pbmc_small) #' HoverLocator(plot = plot, information = FetchData(object = pbmc_small, vars = 'percent.mito')) #' } #' HoverLocator <- function( plot, information = NULL, axes = TRUE, dark.theme = FALSE, ... ) { # Use GGpointToBase because we already have ggplot objects # with colors (which are annoying in plotly) plot.build <- suppressWarnings(expr = GGpointToPlotlyBuild( plot = plot, information = information, ... )) data <- ggplot_build(plot = plot)$plot$data # Set up axis labels here # Also, a bunch of stuff to get axis lines done properly if (axes) { xaxis <- list( title = names(x = data)[1], showgrid = FALSE, zeroline = FALSE, showline = TRUE ) yaxis <- list( title = names(x = data)[2], showgrid = FALSE, zeroline = FALSE, showline = TRUE ) } else { xaxis <- yaxis <- list(visible = FALSE) } # Check for dark theme if (dark.theme) { title <- list(color = 'white') xaxis <- c(xaxis, color = 'white') yaxis <- c(yaxis, color = 'white') plotbg <- 'black' } else { title = list(color = 'black') plotbg = 'white' } # The `~' means pull from the data passed (this is why we reset the names) # Use I() to get plotly to accept the colors from the data as is # Set hoverinfo to 'text' to override the default hover information # rather than append to it p <- layout( p = plot_ly( data = plot.build, x = ~x, y = ~y, type = 'scatter', mode = 'markers', color = ~I(color), hoverinfo = 'text', text = ~feature ), xaxis = xaxis, yaxis = yaxis, title = plot$labels$title, titlefont = title, paper_bgcolor = plotbg, plot_bgcolor = plotbg, ... ) # Add labels label.layer <- which(x = sapply( X = plot$layers, FUN = function(x) { return(inherits(x = x$geom, what = c('GeomText', 'GeomTextRepel'))) } )) if (length(x = label.layer) == 1) { p <- add_annotations( p = p, x = plot$layers[[label.layer]]$data[, 1], y = plot$layers[[label.layer]]$data[, 2], xref = "x", yref = "y", text = plot$layers[[label.layer]]$data[, 3], xanchor = 'right', showarrow = FALSE, font = list(size = plot$layers[[label.layer]]$aes_params$size * 4) ) } return(p) } #' Get the intensity and/or luminance of a color #' #' @param color A vector of colors #' #' @return A vector of intensities/luminances for each color #' #' @name contrast-theory #' @rdname contrast-theory #' #' @importFrom grDevices col2rgb #' #' @export #' @concept visualization #' #' @source \url{https://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color} #' #' @examples #' Intensity(color = c('black', 'white', '#E76BF3')) #' Intensity <- function(color) { intensities <- apply( X = col2rgb(col = color), MARGIN = 2, FUN = function(col) { col <- rbind(as.vector(x = col), c(0.299, 0.587, 0.114)) return(sum(apply(X = col, MARGIN = 2, FUN = prod))) } ) names(x = intensities) <- color return(intensities) } #' Label clusters on a ggplot2-based scatter plot #' #' @param plot A ggplot2-based scatter plot #' @param id Name of variable used for coloring scatter plot #' @param clusters Vector of cluster ids to label #' @param labels Custom labels for the clusters #' @param split.by Split labels by some grouping label, useful when using #' \code{\link[ggplot2]{facet_wrap}} or \code{\link[ggplot2]{facet_grid}} #' @param repel Use \code{geom_text_repel} to create nicely-repelled labels #' @param geom Name of geom to get X/Y aesthetic names for #' @param box Use geom_label/geom_label_repel (includes a box around the text #' labels) #' @param position How to place the label if repel = FALSE. If "median", place #' the label at the median position. If "nearest" place the label at the #' position of the nearest data point to the median. #' @param ... Extra parameters to \code{\link[ggrepel]{geom_text_repel}}, such as \code{size} #' #' @return A ggplot2-based scatter plot with cluster labels #' #' @importFrom stats median na.omit #' @importFrom ggrepel geom_text_repel geom_label_repel #' @importFrom ggplot2 geom_text geom_label layer_scales #' @importFrom RANN nn2 #' #' @export #' @concept visualization #' #' @seealso \code{\link[ggrepel]{geom_text_repel}} \code{\link[ggplot2]{geom_text}} #' #' @examples #' data("pbmc_small") #' plot <- DimPlot(object = pbmc_small) #' LabelClusters(plot = plot, id = 'ident') #' LabelClusters <- function( plot, id, clusters = NULL, labels = NULL, split.by = NULL, repel = TRUE, box = FALSE, geom = 'GeomPoint', position = "median", ... ) { xynames <- unlist(x = GetXYAesthetics(plot = plot, geom = geom), use.names = TRUE) plot_data <- plot$data data_nested <- FALSE if ((geom == "GeomPolygon") || is.null(plot_data) || (length(plot_data) == 0)) { # When plotting polygons, data is within the layers slot, not the data slot if (!is.null(plot$layers[[2]]$data)) { plot_data <- plot$layers[[2]]$data } data_nested <- TRUE } if (!id %in% colnames(x = plot_data)) { stop("Cannot find variable ", id, " in plotting data") } if (!is.null(x = split.by) && !split.by %in% colnames(x = plot_data)) { warning("Cannot find splitting variable ", split.by, " in plotting data") split.by <- NULL } data <- plot_data[, c(xynames, id, split.by)] id_values <- data[, id] possible.clusters <- as.character(x = na.omit(object = unique(x = id_values))) groups <- clusters %||% possible.clusters if (any(!groups %in% possible.clusters)) { stop("The following clusters were not found: ", paste(groups[!groups %in% possible.clusters], collapse = ",")) } pb <- ggplot_build(plot = plot) if (data_nested || (geom == "GeomSpatial")) { colors_to_plot <- pb$plot$plot_env$cols data$color <- colors_to_plot[as.character(x = data[, id])] } else { # Retrieve colour from built data col_choice <- intersect(c("colour", "color"), names(pb$data[[1]])) if (length(col_choice) > 0) { data <- cbind(data, color = pb$data[[1]][[col_choice[1]]]) } else { data <- cbind(data, color = NA_character_) } } labels.loc <- lapply( X = groups, FUN = function(group) { data.use <- data[data[, id] == group, , drop = FALSE] data.medians <- if (!is.null(x = split.by)) { do.call( what = 'rbind', args = lapply( X = unique(x = data.use[, split.by]), FUN = function(split) { split_by_values <- data.use[, split.by] == split split_data <- data.use[split_by_values == split, , drop = FALSE] # Extract coordinates coord_data <- data.use[data.use[, split.by] == split, xynames, drop = FALSE] medians <- apply( X = coord_data, MARGIN = 2, FUN = median, na.rm = TRUE ) medians <- as.data.frame(x = t(x = medians)) medians[, split.by] <- split return(medians) } ) ) } else { # Extract coordinates coord_data <- data.use[, xynames, drop = FALSE] as.data.frame(x = t(x = apply( X = coord_data, MARGIN = 2, FUN = median, na.rm = TRUE ))) } data.medians[, id] <- group data.medians$color <- data.use$color[1] return(data.medians) } ) if (position == "nearest") { labels.loc <- lapply(X = labels.loc, FUN = function(x) { group.data <- data[as.character(x = data[, id]) == as.character(x[3]), ] coord_matrix <- as.matrix(group.data[, 1:2]) nearest.point <- nn2(data = coord_matrix, query = as.matrix(x = x[c(1,2)]), k = 1)$nn.idx x[1:2] <- coord_matrix[nearest.point, ] return(x) }) } labels.loc <- do.call(what = 'rbind', args = labels.loc) data_levels <- levels(data[, id]) labels.loc[, id] <- factor(x = labels.loc[, id], levels = data_levels) labels <- labels %||% groups if (length(x = unique(x = labels.loc[, id])) != length(x = labels)) { stop("Length of labels (", length(x = labels), ") must be equal to the number of clusters being labeled (", length(x = unique(x = labels.loc[, id])), ").") } names(x = labels) <- groups for (group in groups) { labels.loc[labels.loc[, id] == group, id] <- labels[group] } if (box) { geom.use <- ifelse(test = repel, yes = geom_label_repel, no = geom_label) plot <- plot + geom.use( data = labels.loc, mapping = aes(x = .data[[xynames['x']]], y = .data[[xynames['y']]], label = .data[[id]]), fill = labels.loc$color, show.legend = FALSE, inherit.aes = FALSE, ... ) } else { geom.use <- ifelse(test = repel, yes = geom_text_repel, no = geom_text) plot <- plot + geom.use( data = labels.loc, mapping = aes(x = .data[[xynames['x']]], y = .data[[xynames['y']]], label = .data[[id]]), show.legend = FALSE, inherit.aes = FALSE, ... ) } return(plot) } #' Add text labels to a ggplot2 plot #' #' @param plot A ggplot2 plot with a GeomPoint layer #' @param points A vector of points to label; if \code{NULL}, will use all points in the plot #' @param labels A vector of labels for the points; if \code{NULL}, will use #' rownames of the data provided to the plot at the points selected #' @param repel Use \code{geom_text_repel} to create a nicely-repelled labels; this #' is slow when a lot of points are being plotted. If using \code{repel}, set \code{xnudge} #' and \code{ynudge} to 0 #' @param xnudge,ynudge Amount to nudge X and Y coordinates of labels by #' @param ... Extra parameters passed to \code{geom_text} #' #' @return A ggplot object #' #' @importFrom ggrepel geom_text_repel #' @importFrom ggplot2 geom_text #' @export #' @concept visualization #' #' @aliases Labeler #' @seealso \code{\link[ggplot2]{geom_text}} #' #' @examples #' data("pbmc_small") #' ff <- TopFeatures(object = pbmc_small[['pca']]) #' cc <- TopCells(object = pbmc_small[['pca']]) #' plot <- FeatureScatter(object = pbmc_small, feature1 = ff[1], feature2 = ff[2]) #' LabelPoints(plot = plot, points = cc) #' LabelPoints <- function( plot, points, labels = NULL, repel = FALSE, xnudge = 0.3, ynudge = 0.05, ... ) { xynames <- GetXYAesthetics(plot = plot) points <- points %||% rownames(x = plot$data) if (is.numeric(x = points)) { points <- rownames(x = plot$data) } points <- intersect(x = points, y = rownames(x = plot$data)) if (length(x = points) == 0) { stop("Cannot find points provided") } labels <- labels %||% points labels <- as.character(x = labels) label.data <- plot$data[points, ] label.data$labels <- labels geom.use <- ifelse(test = repel, yes = geom_text_repel, no = geom_text) if (repel) { if (!all(c(xnudge, ynudge) == 0)) { message("When using repel, set xnudge and ynudge to 0 for optimal results") } } plot <- plot + geom.use( mapping = aes(x = .data[[xynames$x]], y = .data[[xynames$y]], label = .data[['labels']]), data = label.data, nudge_x = xnudge, nudge_y = ynudge, ... ) return(plot) } #' @name contrast-theory #' @rdname contrast-theory #' #' @importFrom grDevices col2rgb #' #' @export #' @concept visualization #' #' @examples #' Luminance(color = c('black', 'white', '#E76BF3')) #' Luminance <- function(color) { luminance <- apply( X = col2rgb(col = color), MARGIN = 2, function(col) { col <- as.vector(x = col) / 255 col <- sapply( X = col, FUN = function(x) { return(ifelse( test = x <= 0.03928, yes = x / 12.92, no = ((x + 0.055) / 1.055) ^ 2.4 )) } ) col <- rbind(col, c(0.2126, 0.7152, 0.0722)) return(sum(apply(X = col, MARGIN = 2, FUN = prod))) } ) names(x = luminance) <- color return(luminance) } #' @export #' @concept visualization #' #' @rdname CustomPalette #' @aliases PurpleAndYellow #' #' @examples #' df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) #' plot(df, col = PurpleAndYellow()) #' PurpleAndYellow <- function(k = 50) { return(CustomPalette(low = "magenta", high = "yellow", mid = "black", k = k)) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Seurat themes #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Seurat Themes #' #' Various themes to be applied to ggplot2-based plots #' \describe{ #' \item{\code{SeuratTheme}}{The curated Seurat theme, consists of ...} #' \item{\code{DarkTheme}}{A dark theme, axes and text turn to white, the background becomes black} #' \item{\code{NoAxes}}{Removes axis lines, text, and ticks} #' \item{\code{NoLegend}}{Removes the legend} #' \item{\code{FontSize}}{Sets axis and title font sizes} #' \item{\code{NoGrid}}{Removes grid lines} #' \item{\code{SeuratAxes}}{Set Seurat-style axes} #' \item{\code{SpatialTheme}}{A theme designed for spatial visualizations (eg \code{\link{PolyFeaturePlot}}, \code{\link{PolyDimPlot}})} #' \item{\code{RestoreLegend}}{Restore a legend after removal} #' \item{\code{RotatedAxis}}{Rotate X axis text 45 degrees} #' \item{\code{BoldTitle}}{Enlarges and emphasizes the title} #' } #' #' @param ... Extra parameters to be passed to \code{theme} #' #' @return A ggplot2 theme object #' #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @seealso \code{\link[ggplot2]{theme}} #' @aliases SeuratTheme #' SeuratTheme <- function() { return(DarkTheme() + NoLegend() + NoGrid() + SeuratAxes()) } #' @importFrom ggplot2 theme element_text #' #' @rdname SeuratTheme #' @export #' @concept visualization #' #' @aliases CenterTitle #' CenterTitle <- function(...) { return(theme(plot.title = element_text(hjust = 0.5), validate = TRUE, ...)) } #' @importFrom ggplot2 theme element_rect element_text element_line margin #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases DarkTheme #' #' @examples #' # Generate a plot with a dark theme #' library(ggplot2) #' df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) #' p <- ggplot(data = df, mapping = aes(x = x, y = y)) + geom_point(mapping = aes(color = 'red')) #' p + DarkTheme(legend.position = 'none') #' DarkTheme <- function(...) { # Some constants for easier changing in the future black.background <- element_rect(fill = 'black') black.background.no.border <- element_rect(fill = 'black', linewidth = 0) font.margin <- 4 white.text <- element_text( colour = 'white', margin = margin( t = font.margin, r = font.margin, b = font.margin, l = font.margin ) ) white.line <- element_line(colour = 'white', linewidth = 1) no.line <- element_line(linewidth = 0) # Create the dark theme dark.theme <- theme( # Set background colors plot.background = black.background, panel.background = black.background, legend.background = black.background, legend.box.background = black.background.no.border, legend.key = black.background.no.border, strip.background = element_rect(fill = 'grey50', colour = NA), # Set text colors plot.title = white.text, plot.subtitle = white.text, axis.title = white.text, axis.text = white.text, legend.title = white.text, legend.text = white.text, strip.text = white.text, # Set line colors axis.line.x = white.line, axis.line.y = white.line, panel.grid = no.line, panel.grid.minor = no.line, # Validate the theme validate = TRUE, # Extra parameters ... ) return(dark.theme) } #' @param x.text,y.text X and Y axis text sizes #' @param x.title,y.title X and Y axis title sizes #' @param main Plot title size #' #' @importFrom ggplot2 theme element_text #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases FontSize #' FontSize <- function( x.text = NULL, y.text = NULL, x.title = NULL, y.title = NULL, main = NULL, ... ) { font.size <- theme( # Set font sizes axis.text.x = element_text(size = x.text), axis.text.y = element_text(size = y.text), axis.title.x = element_text(size = x.title), axis.title.y = element_text(size = y.title), plot.title = element_text(size = main), # Validate the theme validate = TRUE, # Extra parameters ... ) } #' @param keep.text Keep axis text #' @param keep.ticks Keep axis ticks #' #' @importFrom ggplot2 theme element_blank #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases NoAxes #' #' @examples #' # Generate a plot with no axes #' library(ggplot2) #' df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) #' p <- ggplot(data = df, mapping = aes(x = x, y = y)) + geom_point(mapping = aes(color = 'red')) #' p + NoAxes() #' NoAxes <- function(..., keep.text = FALSE, keep.ticks = FALSE) { blank <- element_blank() no.axes.theme <- theme( # Remove the axis elements axis.line.x = blank, axis.line.y = blank, # Validate the theme validate = TRUE, ... ) if (!keep.text) { no.axes.theme <- no.axes.theme + theme( axis.text.x = blank, axis.text.y = blank, axis.title.x = blank, axis.title.y = blank, validate = TRUE, ... ) } if (!keep.ticks){ no.axes.theme <- no.axes.theme + theme( axis.ticks.x = blank, axis.ticks.y = blank, validate = TRUE, ... ) } return(no.axes.theme) } #' @importFrom ggplot2 theme #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases NoLegend #' #' @examples #' # Generate a plot with no legend #' library(ggplot2) #' df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) #' p <- ggplot(data = df, mapping = aes(x = x, y = y)) + geom_point(mapping = aes(color = 'red')) #' p + NoLegend() #' NoLegend <- function(...) { no.legend.theme <- theme( # Remove the legend legend.position = 'none', # Validate the theme validate = TRUE, ... ) return(no.legend.theme) } #' @importFrom ggplot2 theme element_blank #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases NoGrid #' #' @examples #' # Generate a plot with no grid lines #' library(ggplot2) #' df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) #' p <- ggplot(data = df, mapping = aes(x = x, y = y)) + geom_point(mapping = aes(color = 'red')) #' p + NoGrid() #' NoGrid <- function(...) { no.grid.theme <- theme( # Set grid lines to blank panel.grid.major = element_blank(), panel.grid.minor = element_blank(), # Validate the theme validate = TRUE, ... ) return(no.grid.theme) } #' @importFrom ggplot2 theme element_text #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases SeuratAxes #' SeuratAxes <- function(...) { axes.theme <- theme( # Set axis things axis.title = element_text(face = 'bold', color = '#990000', size = 16), axis.text = element_text(vjust = 0.5, size = 12), # Validate the theme validate = TRUE, ... ) return(axes.theme) } #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases SpatialTheme #' SpatialTheme <- function(...) { return(DarkTheme() + NoAxes() + NoGrid() + NoLegend(...)) } #' @param position A position to restore the legend to #' #' @importFrom ggplot2 theme #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases RestoreLegend #' RestoreLegend <- function(..., position = 'right') { restored.theme <- theme( # Restore legend position legend.position = 'right', # Validate the theme validate = TRUE, ... ) return(restored.theme) } #' @importFrom ggplot2 theme element_text #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases RotatedAxis #' RotatedAxis <- function(...) { rotated.theme <- theme( # Rotate X axis text axis.text.x = element_text(angle = 45, hjust = 1), # Validate the theme validate = TRUE, ... ) return(rotated.theme) } #' @importFrom ggplot2 theme element_text #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases BoldTitle #' BoldTitle <- function(...) { bold.theme <- theme( # Make the title bold plot.title = element_text(size = 20, face = 'bold'), # Validate the theme validate = TRUE, ... ) return(bold.theme) } #' @importFrom ggplot2 theme element_rect #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases WhiteBackground #' WhiteBackground <- function(...) { white.rect = element_rect(fill = 'white') white.theme <- theme( # Make the plot, panel, and legend key backgrounds white plot.background = white.rect, panel.background = white.rect, legend.key = white.rect, # Validate the theme validate = TRUE, ... ) return(white.theme) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Fortify Methods #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Prepare Coordinates for Spatial Plots #' #' @inheritParams SeuratObject::GetTissueCoordinates #' @param model A \code{\link[SeuratObject:Segmentation-class]{Segmentation}}, #' \code{\link[SeuratObject:Centroids-class]{Centroids}}, #' or \code{\link[SeuratObject:Molecules-class]{Molecules}} object #' @param data Extra data to be used for annotating the cell segmentations; the #' easiest way to pass data is a one-column #' \code{\link[base:data.frame]{data frame}} with the values to color by and #' the cell names are rownames #' @param ... Arguments passed to other methods #' #' @name fortify-Spatial #' @rdname fortify-Spatial #' #' @importFrom SeuratObject GetTissueCoordinates #' #' @keywords internal #' #' @method fortify Centroids #' @export #' #' @aliases fortify #' fortify.Centroids <- function(model, data, ...) { df <- GetTissueCoordinates(object = model, full = FALSE) if (missing(x = data)) { data <- NULL } data <- .PrepImageData(data = data, cells = lengths(x = model), ...) df <- cbind(df, data) return(df) } #' @rdname fortify-Spatial #' @method fortify Molecules #' #' @importFrom SeuratObject FetchData #' #' @export #' fortify.Molecules <- function( model, data, nmols = NULL, seed = NA_integer_, ... ) { return(FetchData(object = model, vars = data, nmols = nmols, seed = seed, ...)) } #' @rdname fortify-Spatial #' @method fortify Segmentation #' @export #' fortify.Segmentation <- function(model, data, ...) { df <- GetTissueCoordinates(object = model, full = TRUE) if (missing(x = data)) { data <- NULL } data <- .PrepImageData(data = data, cells = lengths(x = model), ...) df <- cbind(df, data) return(df) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @importFrom SeuratObject Features Key Keys Molecules #' .MolsByFOV <- function(object, fov, molecules) { keys <- Key(object = object)[fov] keyed.mols <- sapply( X = names(x = keys), FUN = function(img) { if (is.null(x = Molecules(object = object[[img]]))) { return(NULL) } key <- keys[img] mols <- grep(pattern = paste0('^', key), x = molecules, value = TRUE) names(x = mols) <- mols mols <- gsub(pattern = paste0('^', key), replacement = '', x = mols) keyed <- sapply( X = SeuratObject::Keys(object = object[[img]]), FUN = function(x) { return(grep(pattern = paste0('^', x), x = mols, value = TRUE)) } ) keyed <- unlist(x = keyed) names(x = keyed) <- gsub( pattern = '^.*\\.', replacement = '', x = names(x = keyed) ) missing <- mols[!mols %in% keyed] missing <- missing[missing %in% Features(x = object[[img]])] if (length(x = missing)) { # TODO: replace with default molecules default <- Molecules(object = object[[img]])[1L] mn <- names(x = missing) missing <- paste0( SeuratObject::Key(object = object[[img]][[default]]), missing ) names(x = missing) <- mn } return(c(missing, keyed)) }, simplify = FALSE, USE.NAMES = TRUE ) found <- names(x = unlist(x = keyed.mols)) found <- gsub(pattern = '^.*\\.', replacement = '', x = found) missing <- setdiff(x = molecules, y = found) names(x = missing) <- missing for (img in fov) { imissing <- missing for (i in seq_along(along.with = imissing)) { for (lkey in Keys(object = object[[img]])) { imissing[[i]] <- gsub( pattern = paste0('^', lkey), replacement = '', x = imissing[[i]] ) } } imissing <- names(x = imissing[imissing %in% Features(x = object[[img]])]) keyed.mols[[img]] <- c(keyed.mols[[img]], imissing) } keyed.mols <- Filter(f = length, x = keyed.mols) keyed.mols <- sapply(X = keyed.mols, FUN = unname, simplify = FALSE) return(keyed.mols) } # Calculate bandwidth for use in ggplot2-based smooth scatter plots # # Inspired by MASS::bandwidth.nrd and graphics:::.smoothScatterCalcDensity # # @param data A two-column data frame with X and Y coordinates for a plot # # @return The calculated bandwidth # #' @importFrom stats quantile var # Bandwidth <- function(data) { r <- diff(x = apply( X = data, MARGIN = 2, FUN = quantile, probs = c(0.05, 0.95), na.rm = TRUE, names = FALSE )) h <- abs(x = r[2L] - r[1L]) / 1.34 h <- ifelse(test = h == 0, yes = 1, no = h) bandwidth <- 4 * 1.06 * min(sqrt(x = apply(X = data, MARGIN = 2, FUN = var)), h) * nrow(x = data) ^ (-0.2) return(bandwidth) } # Blend expression values together # # @param data A two-column data frame with expression values for two features # # @return A three-column data frame with transformed and blended expression values # BlendExpression <- function(data) { if (ncol(x = data) != 2) { stop("'BlendExpression' only blends two features") } features <- colnames(x = data) data <- as.data.frame(x = apply( X = data, MARGIN = 2, FUN = function(x) { return(round(x = 9 * (x - min(x)) / (max(x) - min(x)))) } )) data[, 3] <- data[, 1] + data[, 2] * 10 colnames(x = data) <- c(features, paste(features, collapse = '_')) for (i in 1:ncol(x = data)) { data[, i] <- factor(x = data[, i]) } return(data) } # Create a heatmap of blended colors # # @param color.matrix A color matrix of blended colors # # @return A ggplot object # #' @importFrom grid unit #' @importFrom cowplot theme_cowplot #' @importFrom ggplot2 ggplot scale_fill_manual geom_raster #' theme scale_y_continuous scale_x_continuous scale_fill_manual # # @seealso \code{\link{BlendMatrix}} # BlendMap <- function(color.matrix) { color.heat <- matrix( data = 1:prod(dim(x = color.matrix)) - 1, nrow = nrow(x = color.matrix), ncol = ncol(x = color.matrix), dimnames = list( 1:nrow(x = color.matrix), 1:ncol(x = color.matrix) ) ) xbreaks <- seq.int(from = 0, to = nrow(x = color.matrix), by = 2) ybreaks <- seq.int(from = 0, to = ncol(x = color.matrix), by = 2) color.heat <- Melt(x = color.heat) color.heat$rows <- as.numeric(x = as.character(x = color.heat$rows)) color.heat$cols <- as.numeric(x = as.character(x = color.heat$cols)) color.heat$vals <- factor(x = color.heat$vals) plot <- ggplot( data = color.heat, mapping = aes(x = .data[['rows']], y = .data[['cols']], fill = .data[['vals']]) ) + geom_raster(show.legend = FALSE) + theme(plot.margin = unit(x = rep.int(x = 0, times = 4), units = 'cm')) + scale_x_continuous(breaks = xbreaks, expand = c(0, 0), labels = xbreaks) + scale_y_continuous(breaks = ybreaks, expand = c(0, 0), labels = ybreaks) + scale_fill_manual(values = as.vector(x = color.matrix)) + theme_cowplot() return(plot) } # Create a color matrix of blended colors # # @param n Dimensions of blended matrix (n x n) # @param col.threshold The color cutoff from weak signal to strong signal; ranges from 0 to 1. # @param two.colors Two colors used for the blend expression. # # @return An n x n matrix of blended colors # #' @importFrom grDevices col2rgb # BlendMatrix <- function( n = 10, col.threshold = 0.5, two.colors = c("#ff0000", "#00ff00"), negative.color = "black" ) { if (0 > col.threshold || col.threshold > 1) { stop("col.threshold must be between 0 and 1") } C0 <- as.vector(col2rgb(negative.color, alpha = TRUE)) C1 <- as.vector(col2rgb(two.colors[1], alpha = TRUE)) C2 <- as.vector(col2rgb(two.colors[2], alpha = TRUE)) blend_alpha <- (C1[4] + C2[4])/2 C0 <- C0[-4] C1 <- C1[-4] C2 <- C2[-4] merge.weight <- min(255 / (C1 + C2 + C0 + 0.01)) sigmoid <- function(x) { return(1 / (1 + exp(-x))) } blend_color <- function( i, j, col.threshold, n, C0, C1, C2, alpha, merge.weight ) { c.min <- sigmoid(5 * (1 / n - col.threshold)) c.max <- sigmoid(5 * (1 - col.threshold)) c1_weight <- sigmoid(5 * (i / n - col.threshold)) c2_weight <- sigmoid(5 * (j / n - col.threshold)) c0_weight <- sigmoid(5 * ((i + j) / (2 * n) - col.threshold)) c1_weight <- (c1_weight - c.min) / (c.max - c.min) c2_weight <- (c2_weight - c.min) / (c.max - c.min) c0_weight <- (c0_weight - c.min) / (c.max - c.min) C1_length <- sqrt(sum((C1 - C0) ** 2)) C2_length <- sqrt(sum((C2 - C0) ** 2)) C1_unit <- (C1 - C0) / C1_length C2_unit <- (C2 - C0) / C2_length C1_weight <- C1_unit * c1_weight C2_weight <- C2_unit * c2_weight C_blend <- C1_weight * (i - 1) * C1_length / (n - 1) + C2_weight * (j - 1) * C2_length / (n - 1) + (i - 1) * (j - 1) * c0_weight * C0 / (n - 1) ** 2 + C0 C_blend[C_blend > 255] <- 255 C_blend[C_blend < 0] <- 0 return(rgb( red = C_blend[1], green = C_blend[2], blue = C_blend[3], alpha = alpha, maxColorValue = 255 )) } blend_matrix <- matrix(nrow = n, ncol = n) for (i in 1:n) { for (j in 1:n) { blend_matrix[i, j] <- blend_color( i = i, j = j, col.threshold = col.threshold, n = n, C0 = C0, C1 = C1, C2 = C2, alpha = blend_alpha, merge.weight = merge.weight ) } } return(blend_matrix) } # Convert R colors to hexadecimal # # @param ... R colors # # @return The hexadecimal representations of input colors # #' @importFrom grDevices rgb col2rgb # Col2Hex <- function(...) { colors <- as.character(x = c(...)) alpha <- rep.int(x = 255, times = length(x = colors)) if (sum(sapply(X = colors, FUN = grepl, pattern = '^#')) != 0) { hex <- colors[which(x = grepl(pattern = '^#', x = colors))] hex.length <- sapply(X = hex, FUN = nchar) if (9 %in% hex.length) { hex.alpha <- hex[which(x = hex.length == 9)] hex.vals <- sapply(X = hex.alpha, FUN = substr, start = 8, stop = 9) dec.vals <- sapply(X = hex.vals, FUN = strtoi, base = 16) alpha[match(x = hex[which(x = hex.length == 9)], table = colors)] <- dec.vals } } colors <- t(x = col2rgb(col = colors)) colors <- mapply( FUN = function(i, alpha) { return(rgb(colors[i, , drop = FALSE], alpha = alpha, maxColorValue = 255)) }, i = 1:nrow(x = colors), alpha = alpha ) return(colors) } # Plot feature expression by identity # # Basically combines the codebase for VlnPlot and RidgePlot # # @param object Seurat object # @param type Plot type, choose from 'ridge', 'violin', or 'splitViolin' # @param features Features to plot (gene expression, metrics, PC scores, # anything that can be retreived by FetchData) # @param idents Which classes to include in the plot (default is all) # @param ncol Number of columns if multiple plots are displayed # @param sort Sort identity classes (on the x-axis) by the average expression of the attribute being potted, # or, if stack is True, sort both identity classes and features by hierarchical clustering # @param y.max Maximum y axis value # @param same.y.lims Set all the y-axis limits to the same values # @param adjust Adjust parameter for geom_violin # @param pt.size Point size for points # @param alpha Alpha value for points # @param cols Colors to use for plotting # @param group.by Group (color) cells in different ways (for example, orig.ident) # @param split.by A variable to split the plot by # @param log plot Y axis on log scale # @param slot Slot to pull expression data from (e.g. "counts" or "data") # @param stack Horizontally stack plots for multiple feature # @param combine Combine plots into a single \code{\link[patchwork]{patchwork}ed} # ggplot object. If \code{FALSE}, return a list of ggplot objects # @param fill.by Color violins/ridges based on either 'feature' or 'ident' # @param flip flip plot orientation (identities on x-axis) # @param add.noise determine if adding a small noise for plotting # @param raster Convert points to raster format, default is \code{NULL} which # automatically rasterizes if plotting more than 100,000 cells # # @return A \code{\link[patchwork]{patchwork}ed} ggplot object if # \code{combine = TRUE}; otherwise, a list of ggplot objects # #' @importFrom scales hue_pal #' @importFrom ggplot2 xlab ylab #' @importFrom patchwork wrap_plots # ExIPlot <- function( object, features, type = 'violin', idents = NULL, ncol = NULL, sort = FALSE, assay = NULL, y.max = NULL, same.y.lims = FALSE, adjust = 1, cols = NULL, pt.size = 0, alpha = 1, group.by = NULL, split.by = NULL, log = FALSE, slot = deprecated(), layer = 'data', stack = FALSE, combine = TRUE, fill.by = NULL, flip = FALSE, add.noise = TRUE, raster = NULL, raster.dpi = NULL ) { if (is_present(arg = slot)) { layer <- layer %||% slot } assay <- assay %||% DefaultAssay(object = object) DefaultAssay(object = object) <- assay cells <- Cells(x = object, assay = NULL) if (isTRUE(x = stack)) { if (!is.null(x = ncol)) { warning( "'ncol' is ignored with 'stack' is TRUE", call. = FALSE, immediate. = TRUE ) } if (!is.null(x = y.max)) { warning( "'y.max' is ignored when 'stack' is TRUE", call. = FALSE, immediate. = TRUE ) } } else { ncol <- ncol %||% ifelse( test = length(x = features) > 9, yes = 4, no = min(length(x = features), 3) ) } if (!is.null(x = idents)) { cells <- intersect( x = names(x = Idents(object = object)[Idents(object = object) %in% idents]), y = cells ) } data <- FetchData(object = object, vars = features, layer = layer, cells = cells) pt.size <- pt.size %||% AutoPointSize(data = object) features <- colnames(x = data) data <- data[cells, , drop = FALSE] idents <- if (is.null(x = group.by)) { Idents(object = object)[cells] } else { object[[group.by, drop = TRUE]][cells] } if (!is.factor(x = idents)) { idents <- factor(x = idents) } if (is.null(x = split.by)) { split <- NULL } else { split <- FetchData(object,split.by)[cells,split.by] if (!is.factor(x = split)) { split <- factor(x = split) } if (is.null(x = cols)) { cols <- hue_pal()(length(x = levels(x = idents))) cols <- Interleave(cols, InvertHex(hexadecimal = cols)) } else if (length(x = cols) == 1 && cols == 'interaction') { split <- interaction(idents, split) cols <- hue_pal()(length(x = levels(x = idents))) } else { cols <- Col2Hex(cols) } if (length(x = cols) < length(x = levels(x = split))) { cols <- Interleave(cols, InvertHex(hexadecimal = cols)) } cols <- rep_len(x = cols, length.out = length(x = levels(x = split))) names(x = cols) <- levels(x = split) if ((length(x = cols) > 2) & (type == "splitViolin")) { warning("Split violin is only supported for <3 groups, using multi-violin.") type <- "violin" } } if (same.y.lims && is.null(x = y.max)) { y.max <- max(data) } if (isTRUE(x = stack)) { return(MultiExIPlot( type = type, data = data, idents = idents, split = split, sort = sort, same.y.lims = same.y.lims, adjust = adjust, cols = cols, pt.size = pt.size, log = log, fill.by = fill.by, add.noise = add.noise, flip = flip )) } plots <- lapply( X = features, FUN = function(x) { return(SingleExIPlot( type = type, data = data[, x, drop = FALSE], idents = idents, split = split, sort = sort, y.max = y.max, adjust = adjust, cols = cols, pt.size = pt.size, alpha = alpha, log = log, add.noise = add.noise, raster = raster, raster.dpi = raster.dpi )) } ) label.fxn <- switch( EXPR = type, 'violin' = if (stack) { xlab } else { ylab }, "splitViolin" = if (stack) { xlab } else { ylab }, 'ridge' = xlab, stop("Unknown ExIPlot type ", type, call. = FALSE) ) for (i in 1:length(x = plots)) { key <- paste0(unlist(x = strsplit(x = features[i], split = '_'))[1], '_') obj <- names(x = which(x = Key(object = object) == key)) if (length(x = obj) == 1) { if (inherits(x = object[[obj]], what = 'DimReduc')) { plots[[i]] <- plots[[i]] + label.fxn(label = 'Embeddings Value') } else if (inherits(x = object[[obj]], what = 'Assay') || inherits(x = object[[obj]], what = 'Assay5')) { next } else { warning("Unknown object type ", class(x = object), immediate. = TRUE, call. = FALSE) plots[[i]] <- plots[[i]] + label.fxn(label = NULL) } } else if (!features[i] %in% rownames(x = object)) { plots[[i]] <- plots[[i]] + label.fxn(label = NULL) } } if (combine) { plots <- wrap_plots(plots, ncol = ncol) if (length(x = features) > 1) { plots <- plots & NoLegend() } } return(plots) } # Make a theme for facet plots # # @inheritParams SeuratTheme # @export # # @rdname SeuratTheme # @aliases FacetTheme # FacetTheme <- function(...) { return(theme( strip.background = element_blank(), strip.text = element_text(face = 'bold'), # Validate the theme validate = TRUE, ... )) } #' @importFrom RColorBrewer brewer.pal #' @importFrom grDevices colorRampPalette #' #' SpatialColors <- colorRampPalette(colors = rev(x = brewer.pal(n = 11, name = "Spectral"))) # Feature plot palettes # FeaturePalettes <- list( 'Spatial' = SpatialColors(n = 100), 'Seurat' = c('lightgrey', 'blue') ) # Splits features into groups based on log expression levels # # @param object Seurat object # @param assay Assay for expression data # @param min.cells Only compute for features in at least this many cells # @param ngroups Number of groups to split into # # @return A Seurat object with the feature group stored as a factor in # metafeatures # #' @importFrom Matrix rowMeans rowSums # GetFeatureGroups <- function(object, assay, min.cells = 5, ngroups = 6) { cm <- GetAssayData(object = object[[assay]], layer = "counts") # subset to keep only genes detected in at least min.cells cells cm <- cm[rowSums(cm > 0) >= min.cells, ] # use the geometric mean of the features to group them # (using the arithmetic mean would usually not change things much) # could use sctransform:::row_gmean here but not exported feature.gmean <- exp(x = rowMeans(log1p(x = cm))) - 1 feature.grp.breaks <- seq( from = min(log10(x = feature.gmean)) - 10*.Machine$double.eps, to = max(log10(x = feature.gmean)), length.out = ngroups + 1 ) feature.grp <- cut( x = log10(x = feature.gmean), breaks = feature.grp.breaks, ordered_result = TRUE ) feature.grp <- factor( x = feature.grp, levels = rev(x = levels(x = feature.grp)), ordered = TRUE ) names(x = feature.grp) <- names(x = feature.gmean) return(feature.grp) } # Get X and Y aesthetics from a plot for a certain geom # # @param plot A ggplot2 object # @param geom Geom class to filter to # @param plot.first Use plot-wide X/Y aesthetics before geom-specific aesthetics # # @return A named list with values 'x' for the name of the x aesthetic and 'y' for the y aesthetic # #' @importFrom rlang as_label # GetXYAesthetics <- function(plot, geom = 'GeomPoint', plot.first = TRUE) { geoms <- sapply( X = plot$layers, FUN = function(layer) { return(class(x = layer$geom)[1]) } ) # handle case where raster is set to True if (geom == "GeomPoint" && "GeomScattermore" %in% geoms){ geom <- "GeomScattermore" } geoms <- which(x = geoms == geom) if (length(x = geoms) == 0) { stop("Cannot find a geom of class ", geom) } geoms <- min(geoms) if (plot.first) { # x <- as.character(x = plot$mapping$x %||% plot$layers[[geoms]]$mapping$x)[2] x <- as_label(x = plot$mapping$x %||% plot$layers[[geoms]]$mapping$x) # y <- as.character(x = plot$mapping$y %||% plot$layers[[geoms]]$mapping$y)[2] y <- as_label(x = plot$mapping$y %||% plot$layers[[geoms]]$mapping$y) } else { x <- as_label(x = plot$layers[[geoms]]$mapping$x %||% plot$mapping$x) y <- as_label(x = plot$layers[[geoms]]$mapping$y %||% plot$mapping$y) } return(list('x' = x, 'y' = y)) } # For plotting the tissue image #' @importFrom ggplot2 ggproto Geom aes ggproto_parent alpha draw_key_point #' @importFrom grid unit gpar editGrob pointsGrob viewport gTree addGrob grobName #' GeomSpatial <- ggproto( "GeomSpatial", Geom, required_aes = c("x", "y"), extra_params = c("na.rm", "image", "image.alpha", "image.scale", "crop"), default_aes = aes( shape = 21, colour = "black", point.size.factor = 1.0, fill = NA, alpha = NA, stroke = NA ), setup_data = function(self, data, params) { data <- ggproto_parent(Geom, self)$setup_data(data, params) data }, draw_key = draw_key_point, draw_panel = function(data, panel_scales, coord, image, image.alpha, image.scale, crop) { img.dim <- dim(image) # This should be in native units, where # Locations and sizes are relative to the x- and yscales for the current viewport. if (!crop) { # needs to be consistent with the origin being in the top-left panel_scales$x$continuous_range <- c(0, img.dim[[1]]) panel_scales$y$continuous_range <- c(-img.dim[[2]], 0) panel_scales$y.range <- c(0, img.dim[[1]]) panel_scales$x.range <- c(-img.dim[[2]], 0) } z <- coord$transform( data.frame(x = c(0, img.dim[[2]]), y = c(0, img.dim[[1]])), panel_scales ) wdth <- z$x[2] - z$x[1] hgth <- z$y[2] - z$y[1] vp <- viewport( x = unit(x = z$x[1], units = "npc"), y = unit(x = z$y[1], units = "npc"), width = unit(x = wdth, units = "npc"), height = unit(x = hgth, units = "npc"), just = c("left", "top") ) spot.size <- Radius(object = image, scale = image.scale) coords <- coord$transform(data, panel_scales) img <- editGrob(grob = GetImage(image), vp = vp) pts <- pointsGrob( x = coords$x, y = coords$y, pch = data$shape, size = unit(spot.size, "npc") * data$point.size.factor, gp = gpar( col = alpha(colour = coords$colour, alpha = coords$alpha), fill = alpha(colour = coords$fill, alpha = coords$alpha), lwd = coords$stroke) ) vp <- viewport() gt <- gTree(vp = vp) if (image.alpha > 0) { if (image.alpha != 1) { img$raster = as.raster( x = matrix( data = alpha(colour = img$raster, alpha = image.alpha), nrow = nrow(x = img$raster), ncol = ncol(x = img$raster), byrow = TRUE) ) } gt <- addGrob(gTree = gt, child = img) } gt <- addGrob(gTree = gt, child = pts) # Replacement for ggname gt$name <- grobName(grob = gt, prefix = 'geom_spatial') return(gt) } ) # influenced by: https://stackoverflow.com/questions/49475201/adding-tables-to-ggplot2-with-facet-wrap-in-r # https://ggplot2.tidyverse.org/articles/extending-ggplot2.html #' @importFrom ggplot2 layer #' #' geom_spatial <- function( mapping = NULL, data = NULL, image = image, image.alpha = image.alpha, image.scale = image.scale, crop = crop, stat = "identity", position = "identity", na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, ... ) { layer( geom = GeomSpatial, mapping = mapping, data = data, stat = stat, position = position, show.legend = show.legend, inherit.aes = inherit.aes, params = list( na.rm = na.rm, image = image, image.alpha = image.alpha, image.scale = image.scale, crop = crop, ... ) ) } #' @importFrom grid viewport editGrob grobName #' @importFrom ggplot2 ggproto Geom ggproto_parent # GeomSpatialInteractive <- ggproto( "GeomSpatialInteractive", Geom, setup_data = function(self, data, params) { data <- ggproto_parent(parent = Geom, self = self)$setup_data(data, params) data }, draw_group = function(data, panel_scales, coord) { vp <- viewport(x = data$x, y = data$y) g <- editGrob(grob = data$grob[[1]], vp = vp) # Replacement for ggname g$name <- grobName(grob = g, prefix = 'geom_spatial_interactive') return(g) # return(ggname(prefix = "geom_spatial", grob = g)) }, required_aes = c("grob","x","y") ) #' @importFrom ggplot2 layer # geom_spatial_interactive <- function( mapping = NULL, data = NULL, stat = "identity", position = "identity", na.rm = FALSE, show.legend = NA, inherit.aes = FALSE, ... ) { layer( geom = GeomSpatialInteractive, mapping = mapping, data = data, stat = stat, position = position, show.legend = show.legend, inherit.aes = inherit.aes, params = list(na.rm = na.rm, ...) ) } # A split violin plot geom # #' @importFrom scales zero_range #' @importFrom ggplot2 GeomPolygon #' @importFrom grid grobTree grobName # # @author jan-glx on StackOverflow # @references \url{https://stackoverflow.com/questions/35717353/split-violin-plot-with-ggplot2} # @seealso \code{\link[ggplot2]{geom_violin}} # GeomSplitViolin <- ggproto( "GeomSplitViolin", GeomViolin, # setup_data = function(data, params) { # data$width <- data$width %||% params$width %||% (resolution(data$x, FALSE) * 0.9) # data <- plyr::ddply(data, "group", transform, xmin = x - width/2, xmax = x + width/2) # e <- globalenv() # name <- paste(sample(x = letters, size = 5), collapse = '') # message("Saving initial data to ", name) # e[[name]] <- data # return(data) # }, draw_group = function(self, data, ..., draw_quantiles = NULL) { data$xminv <- data$x - data$violinwidth * (data$x - data$xmin) data$xmaxv <- data$x + data$violinwidth * (data$xmax - data$x) grp <- data[1, 'group'] if (grp %% 2 == 1) { data$x <- data$xminv data.order <- data$y } else { data$x <- data$xmaxv data.order <- -data$y } newdata <- data[order(data.order), , drop = FALSE] newdata <- rbind( newdata[1, ], newdata, newdata[nrow(x = newdata), ], newdata[1, ] ) newdata[c(1, nrow(x = newdata) - 1, nrow(x = newdata)), 'x'] <- round(x = newdata[1, 'x']) grob <- if (length(x = draw_quantiles) > 0 & !zero_range(x = range(data$y))) { stopifnot(all(draw_quantiles >= 0), all(draw_quantiles <= 1)) quantiles <- QuantileSegments(data = data, draw.quantiles = draw_quantiles) aesthetics <- data[rep.int(x = 1, times = nrow(x = quantiles)), setdiff(x = names(x = data), y = c("x", "y")), drop = FALSE] aesthetics$alpha <- rep.int(x = 1, nrow(x = quantiles)) both <- cbind(quantiles, aesthetics) quantile.grob <- GeomPath$draw_panel(both, ...) grobTree(GeomPolygon$draw_panel(newdata, ...), name = quantile.grob) } else { GeomPolygon$draw_panel(newdata, ...) } grob$name <- grobName(grob = grob, prefix = 'geom_split_violin') return(grob) } ) # Create a split violin plot geom # # @inheritParams ggplot2::geom_violin # #' @importFrom ggplot2 layer # # @author jan-glx on StackOverflow # @references \url{https://stackoverflow.com/questions/35717353/split-violin-plot-with-ggplot2} # @seealso \code{\link[ggplot2]{geom_violin}} # geom_split_violin <- function( mapping = NULL, data = NULL, stat = 'ydensity', position = 'identity', ..., draw_quantiles = NULL, trim = TRUE, scale = 'area', na.rm = FALSE, show.legend = NA, inherit.aes = TRUE ) { return(layer( data = data, mapping = mapping, stat = stat, geom = GeomSplitViolin, position = position, show.legend = show.legend, inherit.aes = inherit.aes, params = list( trim = trim, scale = scale, draw_quantiles = draw_quantiles, na.rm = na.rm, ... ) )) } # Convert a ggplot2 scatterplot to base R graphics # # @param plot A ggplot2 scatterplot # @param do.plot Create the plot with base R graphics # @param cols A named vector of column names to pull. Vector names must be 'x', # 'y', 'colour', 'shape', and/or 'size'; vector values must be the names of # columns in plot data that correspond to these values. May pass only values that # differ from the default (eg. \code{cols = c('size' = 'point.size.factor')}) # @param ... Extra parameters passed to PlotBuild # # @return A dataframe with the data that created the ggplot2 scatterplot # #' @importFrom ggplot2 ggplot_build # GGpointToBase <- function( plot, do.plot = TRUE, cols = c( 'x' = 'x', 'y' = 'y', 'colour' = 'colour', 'shape' = 'shape', 'size' = 'size' ), ... ) { plot.build <- ggplot_build(plot = plot) default.cols <- c( 'x' = 'x', 'y' = 'y', 'colour' = 'colour', 'shape' = 'shape', 'size' = 'size' ) cols <- cols %||% default.cols if (is.null(x = names(x = cols))) { if (length(x = cols) > length(x = default.cols)) { warning( "Too many columns provided, selecting only first ", length(x = default.cols), call. = FALSE, immediate. = TRUE ) cols <- cols[1:length(x = default.cols)] } names(x = cols) <- names(x = default.cols)[1:length(x = cols)] } cols <- c( cols[intersect(x = names(x = default.cols), y = names(x = cols))], default.cols[setdiff(x = names(x = default.cols), y = names(x = cols))] ) cols <- cols[names(x = default.cols)] build.use <- which(x = vapply( X = plot.build$data, FUN = function(dat) { return(all(cols %in% colnames(x = dat))) }, FUN.VALUE = logical(length = 1L) )) if (length(x = build.use) == 0) { stop("GGpointToBase only works on geom_point ggplot objects") } build.data <- plot.build$data[[min(build.use)]] plot.data <- build.data[, cols] names(x = plot.data) <- c( plot.build$plot$labels$x, plot.build$plot$labels$y, 'color', 'pch', 'cex' ) if (do.plot) { PlotBuild(data = plot.data, ...) } return(plot.data) } # Convert a ggplot2 scatterplot to plotly graphics # # @inheritParams GGpointToBase # @param information Extra information for hovering # @param ... Ignored # # @return A dataframe with the data that greated the ggplot2 scatterplot #' @importFrom ggplot2 ggplot_build # GGpointToPlotlyBuild <- function( plot, information = NULL, cols = eval(expr = formals(fun = GGpointToBase)$cols), ... ) { CheckDots(...) plot.build <- GGpointToBase(plot = plot, do.plot = FALSE, cols = cols) data <- ggplot_build(plot = plot)$plot$data rownames(x = plot.build) <- rownames(data) # Reset the names to 'x' and 'y' names(x = plot.build) <- c( 'x', 'y', names(x = plot.build)[3:length(x = plot.build)] ) # Add the hover information we're looking for if (is.null(x = information)) { plot.build$feature <- rownames(x = data) } else { info <- apply( X = information, MARGIN = 1, FUN = function(x, names) { return(paste0(names, ': ', x, collapse = '
')) }, names = colnames(x = information) ) data.info <- data.frame( feature = paste(rownames(x = information), info, sep = '
'), row.names = rownames(x = information) ) plot.build <- merge(x = plot.build, y = data.info, by = 0) rownames(x = plot.build) <- plot.build$Row.names plot.build <- plot.build[, which(x = colnames(x = plot.build) != 'Row.names'), drop = FALSE] } return(plot.build) } #' @importFrom stats quantile #' InvertCoordinate <- function(x, MARGIN = 2) { if (!is.null(x = x)) { switch( EXPR = MARGIN, '1' = { rmin <- 'left' rmax <- 'right' cmin <- 'xmin' cmax <- 'xmax' }, '2' = { rmin <- 'bottom' rmax <- 'top' cmin <- 'ymin' cmax <- 'ymax' }, stop("'MARGIN' must be either 1 or 2", call. = FALSE) ) # Fix the range so that rmin becomes rmax and vice versa # Needed for both points and brushes range <- x$range x$range[[rmin]] <- range[[rmax]] x$range[[rmax]] <- range[[rmin]] # Fix the cmin and cmax values, if provided # These are used for brush boundaries coords <- c(x[[cmin]], x[[cmax]]) if (all(!is.null(x = coords))) { names(x = coords) <- c(cmin, cmax) x[[cmin]] <- quantile( x = x$range[[rmin]]:x$range[[rmax]], probs = 1 - (coords[cmax] / x$range[[rmax]]), names = FALSE ) x[[cmax]] <- quantile( x = x$range[[rmin]]:x$range[[rmax]], probs = 1 - (coords[cmin] / x$range[[rmax]]), names = FALSE ) } } return(x) } # Invert a Hexadecimal color # # @param hexadecimal A character vector of hexadecimal colors # # @return Hexadecimal representations of the inverted color # # @author Matt Lagrandeur # @references \url{http://www.mattlag.com/scripting/hexcolorinverter.php} # InvertHex <- function(hexadecimal) { return(vapply( X = toupper(x = hexadecimal), FUN = function(hex) { hex <- unlist(x = strsplit( x = gsub(pattern = '#', replacement = '', x = hex), split = '' )) key <- toupper(x = as.hexmode(x = 15:0)) if (!all(hex %in% key)) { stop('All hexadecimal colors must be valid hexidecimal numbers from 0-9 and A-F') } if (length(x = hex) == 8) { alpha <- hex[7:8] hex <- hex[1:6] } else if (length(x = hex) == 6) { alpha <- NULL } else { stop("All hexidecimal colors must be either 6 or 8 characters in length, excluding the '#'") } value <- rev(x = key) inv.hex <- vapply( X = hex, FUN = function(x) { return(value[grep(pattern = x, x = key)]) }, FUN.VALUE = character(length = 1L) ) inv.hex <- paste(inv.hex, collapse = '') return(paste0('#', inv.hex, paste(alpha, collapse = ''))) }, FUN.VALUE = character(length = 1L), USE.NAMES = FALSE )) } # Make label information for ggplot2-based scatter plots # # @param data A three-column data frame (accessed with \code{plot$data}) # The first column should be the X axis, the second the Y, and the third should be grouping information # # @return A dataframe with three columns: centers along the X axis, centers along the Y axis, and group information # #' @importFrom stats median na.omit # MakeLabels <- function(data) { groups <- as.character(x = na.omit(object = unique(x = data[, 3]))) labels <- lapply( X = groups, FUN = function(group) { data.use <- data[data[, 3] == group, 1:2] return(apply(X = data.use, MARGIN = 2, FUN = median, na.rm = TRUE)) } ) names(x = labels) <- groups labels <- as.data.frame(x = t(x = as.data.frame(x = labels))) labels[, colnames(x = data)[3]] <- groups return(labels) } # Plot expression of multiple features by identity on a plot # # @param data Data to plot # @param idents Idents to use # @param type Make either a 'ridge' or 'violin' plot # @param sort Sort identity classes and features based on hierarchical clustering # @param same.y.lims Indicates whether to use the same ylim for each feature # @param adjust Adjust parameter for geom_violin # @param cols Colors to use for plotting # @param log plot Y axis on log scale # @param fill.by Color violins/ridges based on either 'feature' or 'ident' # @param seed.use Random seed to use. If NULL, don't set a seed # @param flip flip plot orientation (identities on x-axis) # # @return A ggplot-based Expression-by-Identity plot # #' @importFrom cowplot theme_cowplot #' @importFrom utils globalVariables #' @importFrom stats rnorm dist hclust #' @importFrom ggridges geom_density_ridges theme_ridges #' @importFrom ggplot2 ggplot facet_grid theme labs geom_rect #' geom_violin geom_jitter ylim position_jitterdodge scale_fill_manual #' scale_y_log10 scale_x_log10 scale_y_discrete scale_x_continuous #' scale_y_continuous waiver #' MultiExIPlot <- function( data, idents, split = NULL, type = 'violin', sort = FALSE, same.y.lims = same.y.lims, adjust = 1, pt.size = 0, cols = NULL, seed.use = 42, log = FALSE, fill.by = NULL, add.noise = TRUE, flip = NULL ) { if (!(fill.by %in% c("feature", "ident"))) { stop("`fill.by` must be either `feature` or `ident`") } if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } if (!is.data.frame(x = data) || ncol(x = data) < 2) { stop("MultiExIPlot requires a data frame with >1 column") } data <- Melt(x = data) data <- data.frame( feature = data$cols, expression = data$vals, ident = rep_len(x = idents, length.out = nrow(x = data)) ) if ((is.character(x = sort) && nchar(x = sort) > 0) || sort) { data$feature <- as.vector(x = data$feature) data$ident <- as.vector(x = data$ident) # build matrix of average expression (#-features by #-idents), lexical ordering avgs.matrix <- sapply( X = split(x = data, f = data$ident), FUN = function(df) { return(tapply( X = df$expression, INDEX = df$feature, FUN = mean )) } ) idents.order <- hclust(d = dist(x = t(x = L2Norm(mat = avgs.matrix, MARGIN = 2))))$order avgs.matrix <- avgs.matrix[,idents.order] avgs.matrix <- L2Norm(mat = avgs.matrix, MARGIN = 1) # order feature clusters by position of their "rank-1 idents" position <- apply(X = avgs.matrix, MARGIN = 1, FUN = which.max) mat <- hclust(d = dist(x = avgs.matrix))$merge orderings <- list() for (i in 1:nrow(mat)) { x <- if (mat[i,1] < 0) -mat[i,1] else orderings[[mat[i,1]]] y <- if (mat[i,2] < 0) -mat[i,2] else orderings[[mat[i,2]]] x.pos <- min(x = position[x]) y.pos <- min(x = position[y]) orderings[[i]] <- if (x.pos < y.pos) { c(x, y) } else { c(y, x) } } features.order <- orderings[[length(x = orderings)]] data$feature <- factor( x = data$feature, levels = unique(x = sort(x = data$feature))[features.order] ) data$ident <- factor( x = data$ident, levels = unique(x = sort(x = data$ident))[rev(x = idents.order)] ) } else { data$feature <- factor(x = data$feature, levels = unique(x = data$feature)) } if (log) { noise <- rnorm(n = nrow(x = data)) / 200 data$expression <- data$expression + 1 } else { noise <- rnorm(n = nrow(x = data)) / 100000 } if (!add.noise) { noise <- noise*0 } for (f in unique(x = data$feature)) { if (all(data$expression[(data$feature == f)] == data$expression[(data$feature == f)][1])) { warning( "All cells have the same value of ", f, call. = FALSE, immediate. = TRUE ) } else { data$expression[(data$feature == f)] <- data$expression[(data$feature == f)] + noise[(data$feature == f)] } } if (type == 'violin' && !is.null(x = split)) { data$split <- rep_len(x = split, length.out = nrow(data)) vln.geom <- geom_violin fill.by <- 'split' } else if (type == 'splitViolin' && !is.null(x = split)) { data$split <- rep_len(x = split, length.out = nrow(data)) vln.geom <- geom_split_violin fill.by <- 'split' type <- 'violin' } else { vln.geom <- geom_violin } switch( EXPR = type, 'violin' = { geom <- list(vln.geom(scale = 'width', adjust = adjust, trim = TRUE)) }, 'ridge' = { geom <- list( geom_density_ridges(scale = 4), theme_ridges(), scale_y_discrete(expand = c(0.01, 0)) ) }, stop("Unknown plot type: ", type) ) if (flip) { x <- 'ident' x.label <- 'Identity' y <- 'expression' y.label <- 'Expression Level' } else { y <- 'ident' y.label <- 'Identity' x <- 'expression' x.label <- 'Expression Level' } plot <- ggplot( data = data, mapping = aes(x = .data[[x]], y = .data[[y]], fill = .data[[fill.by]])[c(2, 3, 1)] ) + labs(x = x.label, y = y.label, fill = NULL) + theme_cowplot() plot <- do.call(what = '+', args = list(plot, geom)) if (flip) { plot <- plot + scale_y_continuous( expand = c(0, 0), labels = function(x) c(rep(x = '', times = length(x)-2), x[length(x) - 1], '')) + facet_grid(feature ~ ., scales = (if (same.y.lims) 'fixed' else 'free')) + FacetTheme( panel.spacing = unit(0, 'lines'), panel.background = element_rect(fill = NA, color = "black"), axis.text.y = element_text(size = 7), axis.text.x = element_text(angle = 45, hjust = 1), strip.text.y.right = element_text(angle = 0)) } else { plot <- plot + scale_x_continuous( expand = c(0, 0), labels = function(x) c(rep(x = '', times = length(x)-2), x[length(x) - 1], '')) + facet_grid(. ~ feature, scales = (if (same.y.lims) 'fixed' else 'free')) + FacetTheme( panel.spacing = unit(0, 'lines'), panel.background = element_rect(fill = NA, color = "black"), axis.text.x = element_text(size = 7), strip.text.x = element_text(angle = -90)) } if (log) { plot <- plot + scale_x_log10() } if (!is.null(x = cols)) { if (!is.null(x = split)) { idents <- unique(x = as.vector(x = data$ident)) splits <- unique(x = as.vector(x = data$split)) labels <- if (length(x = splits) == 2) { splits } else { unlist(x = lapply( X = idents, FUN = function(pattern, x) { x.mod <- gsub( pattern = paste0(pattern, '.'), replacement = paste0(pattern, ': '), x = x, fixed = TRUE ) x.keep <- grep(pattern = ': ', x = x.mod, fixed = TRUE) x.return <- x.mod[x.keep] names(x = x.return) <- x[x.keep] return(x.return) }, x = unique(x = as.vector(x = data$split)) )) } if (is.null(x = names(x = labels))) { names(x = labels) <- labels } } else { labels <- levels(x = droplevels(data$ident)) } plot <- plot + scale_fill_manual(values = cols, labels = labels) } return(plot) } # Create a scatterplot with data from a ggplot2 scatterplot # # @param plot.data The original ggplot2 scatterplot data # This is taken from ggplot2::ggplot_build # @param dark.theme Plot using a dark theme # @param smooth Use a smooth scatterplot instead of a standard scatterplot # @param ... Extra parameters passed to graphics::plot or graphics::smoothScatter # #' @importFrom graphics axis plot smoothScatter # PlotBuild <- function(data, dark.theme = FALSE, smooth = FALSE, ...) { # Do we use a smooth scatterplot? # Take advantage of functions as first class objects # to dynamically choose normal vs smooth scatterplot myplot <- ifelse(test = smooth, yes = smoothScatter, no = plot) CheckDots(..., fxns = myplot) if (dark.theme) { par(bg = 'black') axes = FALSE col.lab = 'white' } else { axes = 'TRUE' col.lab = 'black' } myplot( data[, c(1, 2)], col = data$color, pch = data$pch, cex = vapply( X = data$cex, FUN = function(x) { return(max(x / 2, 0.5)) }, FUN.VALUE = numeric(1) ), axes = axes, col.lab = col.lab, col.main = col.lab, ... ) if (dark.theme) { axis( side = 1, at = NULL, labels = TRUE, col.axis = col.lab, col = col.lab ) axis( side = 2, at = NULL, labels = TRUE, col.axis = col.lab, col = col.lab ) } } # Locate points on a plot and return them # # @param plot A ggplot2 plot # @param recolor Do we recolor the plot to highlight selected points? # @param dark.theme Plot using a dark theme # @param ... Exptra parameters to PlotBuild # # @return A dataframe of x and y coordinates for points selected # #' @importFrom graphics locator # @importFrom SDMTools pnt.in.poly # PointLocator <- function(plot, recolor = TRUE, dark.theme = FALSE, ...) { .Defunct(new = "CellSelector") # # Convert the ggplot object to a data.frame # PackageCheck('SDMTools') # plot.data <- GGpointToBase(plot = plot, dark.theme = dark.theme, ...) # npoints <- nrow(x = plot.data) # cat("Click around the cluster of points you wish to select\n") # cat("ie. select the vertecies of a shape around the cluster you\n") # cat("are interested in. Press when finished (right click for R-terminal users)\n\n") # polygon <- locator(n = npoints, type = 'l') # polygon <- data.frame(polygon) # # pnt.in.poly returns a data.frame of points # points.all <- SDMTools::pnt.in.poly( # pnts = plot.data[, c(1, 2)], # poly.pnts = polygon # ) # # Find the located points # points.located <- points.all[which(x = points.all$pip == 1), ] # # If we're recoloring, do the recolor # if (recolor) { # no <- ifelse(test = dark.theme, yes = 'white', no = '#C3C3C3') # points.all$color <- ifelse(test = points.all$pip == 1, yes = '#DE2D26', no = no) # plot.data$color <- points.all$color # PlotBuild(data = plot.data, dark.theme = dark.theme, ...) # } # return(points.located[, c(1, 2)]) } # Create quantile segments for quantiles on violin plots in ggplot2 # # @param data Data being plotted # @param draw.quantiles Quantiles to draw # #' @importFrom stats approxfun # # @author Hadley Wickham (I presume) # @seealso \code{\link[ggplot2]{geom_violin}} # QuantileSegments <- function(data, draw.quantiles) { densities <- cumsum(x = data$density) / sum(data$density) ecdf <- approxfun(x = densities, y = data$y) ys <- ecdf(v = draw.quantiles) violin.xminvs <- approxfun(x = data$y, y = data$xminv)(v = ys) violin.xmaxvs <- approxfun(x = data$y, y = data$xmaxv)(v = ys) return(data.frame( x = as.vector(x = t(x = data.frame(violin.xminvs, violin.xmaxvs))), y = rep(x = ys, each = 2), group = rep(x = ys, each = 2) )) } # Scale vector to min and max cutoff values # # @param vec a vector # @param cutoffs A two-length vector of cutoffs to be passed to \code{\link{SetQuantile}} # # @return Returns a vector # ScaleColumn <- function(vec, cutoffs) { if (!length(x = cutoffs) == 2) { stop("Two cutoffs (a low and high) are needed") } cutoffs <- sapply( X = cutoffs, FUN = SetQuantile, data = vec ) vec[vec < min(cutoffs)] <- min(cutoffs) vec[vec > max(cutoffs)] <- max(cutoffs) return(vec) } # Set highlight information # # @param cells.highlight Cells to highlight # @param cells.all A character vector of all cell names # @param sizes.highlight Sizes of cells to highlight # @param cols.highlight Colors to highlight cells as # @param col.base Base color to use for unselected cells # @param pt.size Size of unselected cells # @param raster Convert points to raster format, default is \code{NULL} which # automatically rasterizes if plotting more than 100,000 cells # # @return A list will cell highlight information # \describe{ # \item{plot.order}{An order to plot cells in} # \item{highlight}{A vector giving group information for each cell} # \item{size}{A vector giving size information for each cell} # \item{color}{Colors for highlighting in the order of plot.order} # } # SetHighlight <- function( cells.highlight, cells.all, sizes.highlight, cols.highlight, col.base = 'black', pt.size = 1, raster = NULL ) { if (is.character(x = cells.highlight)) { cells.highlight <- list(cells.highlight) } else if (is.data.frame(x = cells.highlight) || !is.list(x = cells.highlight)) { cells.highlight <- as.list(x = cells.highlight) } cells.highlight <- lapply( X = cells.highlight, FUN = function(cells) { cells.return <- if (is.character(x = cells)) { cells[cells %in% cells.all] } else { cells <- as.numeric(x = cells) cells <- cells[cells <= length(x = cells.all)] cells.all[cells] } return(cells.return) } ) cells.highlight <- Filter(f = length, x = cells.highlight) names.highlight <- if (is.null(x = names(x = cells.highlight))) { paste0('Group_', 1L:length(x = cells.highlight)) } else { names(x = cells.highlight) } sizes.highlight <- rep_len( x = sizes.highlight, length.out = length(x = cells.highlight) ) cols.highlight <- c( col.base, rep_len(x = cols.highlight, length.out = length(x = cells.highlight)) ) size <- rep_len(x = pt.size, length.out = length(x = cells.all)) highlight <- rep_len(x = NA_character_, length.out = length(x = cells.all)) if (length(x = cells.highlight) > 0) { for (i in 1:length(x = cells.highlight)) { cells.check <- cells.highlight[[i]] index.check <- match(x = cells.check, cells.all) highlight[index.check] <- names.highlight[i] size[index.check] <- sizes.highlight[i] } } # Check for raster if (isTRUE(x = raster)) { size <- sizes.highlight[1] } plot.order <- sort(x = unique(x = highlight), na.last = TRUE) plot.order[is.na(x = plot.order)] <- 'Unselected' highlight[is.na(x = highlight)] <- 'Unselected' highlight <- factor(x = highlight, levels = plot.order) return(list( plot.order = plot.order, highlight = highlight, size = size, color = cols.highlight )) } #' @importFrom shiny brushedPoints # ShinyBrush <- function(plot.data, brush, outputs, inverts = character(length = 0L)) {#}, selected = NULL) { selected <- NULL if (!is.null(x = brush)) { if (brush$outputId %in% outputs) { selected <- rownames(x = brushedPoints(df = plot.data, brush = brush)) } else if (brush$outputId %in% inverts) { selected <- rownames(x = brushedPoints( df = plot.data, brush = InvertCoordinate(x = brush) )) } } return(selected) } globalVariables(names = '..density..', package = 'Seurat') #' A single correlation plot #' #' @param data A data frame with two columns to be plotted #' @param col.by A vector or factor of values to color the plot by #' @param cols An optional vector of colors to use #' @param pt.size Point size for the plot #' @param smooth Make a smoothed scatter plot #' @param rows.highlight A vector of rows to highlight (like cells.highlight in #' \code{\link{SingleDimPlot}}) #' @param legend.title Optional legend title #' @param raster Convert points to raster format, default is \code{NULL} #' which will automatically use raster if the number of points plotted is #' greater than 100,000 #' @param raster.dpi the pixel resolution for rastered plots, passed to geom_scattermore(). #' Default is c(512, 512) #' @param plot.cor ... #' @param jitter Jitter for easier visualization of crowded points #' #' @return A ggplot2 object #' #' @importFrom stats cor #' @importFrom cowplot theme_cowplot #' @importFrom RColorBrewer brewer.pal.info #' @importFrom ggplot2 ggplot geom_point labs scale_color_brewer #' scale_color_manual guides stat_density2d aes scale_fill_continuous #' @importFrom scattermore geom_scattermore #' #' @keywords internal #' #' @export #' SingleCorPlot <- function( data, col.by = NULL, cols = NULL, pt.size = NULL, smooth = FALSE, rows.highlight = NULL, legend.title = NULL, na.value = 'grey50', span = NULL, raster = NULL, raster.dpi = NULL, plot.cor = TRUE, jitter = TRUE ) { pt.size <- pt.size %||% AutoPointSize(data = data, raster = raster) if ((nrow(x = data) > 1e5) & is.null(x = raster)){ message("Rasterizing points since number of points exceeds 100,000.", "\nTo disable this behavior set `raster=FALSE`") } raster <- raster %||% (nrow(x = data) > 1e5) if (!is.null(x = raster.dpi)) { if (!is.numeric(x = raster.dpi) || length(x = raster.dpi) != 2) stop("'raster.dpi' must be a two-length numeric vector") } orig.names <- colnames(x = data) names.plot <- colnames(x = data) <- gsub( pattern = '-', replacement = '.', x = colnames(x = data), fixed = TRUE ) names.plot <- colnames(x = data) <- gsub( pattern = ':', replacement = '.', x = colnames(x = data), fixed = TRUE ) names.plot <- colnames(x = data) <- gsub( pattern = ' ', replacement = '.', x = colnames(x = data), fixed = TRUE ) names.plot <- colnames(x = data) <- gsub( pattern = ')', replacement = '.', x = colnames(x = data), fixed = TRUE ) names.plot <- colnames(x = data) <- gsub( pattern = '(', replacement = '.', x = colnames(x = data), fixed = TRUE ) if (ncol(x = data) < 2) { msg <- "Too few variables passed" if (ncol(x = data) == 1) { msg <- paste0(msg, ', only have ', colnames(x = data)[1]) } stop(msg, call. = FALSE) } plot.cor <- if (isTRUE(x = plot.cor)) { round(x = cor(x = data[, 1], y = data[, 2]), digits = 2) } else( "" ) if (!is.null(x = rows.highlight)) { highlight.info <- SetHighlight( cells.highlight = rows.highlight, cells.all = rownames(x = data), sizes.highlight = pt.size, cols.highlight = 'red', col.base = 'black', pt.size = pt.size, raster = raster ) cols <- highlight.info$color col.by <- factor( x = highlight.info$highlight, levels = rev(x = highlight.info$plot.order) ) plot.order <- order(col.by) data <- data[plot.order, ] col.by <- col.by[plot.order] } if (!is.null(x = col.by)) { data$colors <- col.by } plot <- ggplot( data = data, mapping = aes(x = .data[[names.plot[1]]], y = .data[[names.plot[2]]]) ) + labs( x = orig.names[1], y = orig.names[2], title = plot.cor, color = legend.title ) if (smooth) { # density <- kde2d(x = data[, names.plot[1]], y = data[, names.plot[2]], h = Bandwidth(data = data[, names.plot]), n = 200) # density <- data.frame( # expand.grid( # x = density$x, # y = density$y # ), # density = as.vector(x = density$z) # ) plot <- plot + stat_density2d( mapping = aes(fill = ..density.. ^ 0.25), geom = 'tile', contour = FALSE, n = 200, h = Bandwidth(data = data[, names.plot]) ) + # geom_tile( # mapping = aes_string( # x = 'x', # y = 'y', # fill = 'density' # ), # data = density # ) + scale_fill_continuous(low = 'white', high = 'dodgerblue4') + guides(fill = "none") } position <- NULL if (jitter) { position <- 'jitter' } else { position <- 'identity' } if (!is.null(x = col.by)) { if (raster) { plot <- plot + geom_scattermore( mapping = aes(color = .data[['colors']]), position = position, pointsize = pt.size, pixels = raster.dpi ) } else { plot <- plot + geom_point( mapping = aes(color = .data[['colors']]), position = position, size = pt.size ) } } else { if (raster) { plot <- plot + geom_scattermore(position = position, pointsize = pt.size, pixels = raster.dpi) } else { plot <- plot + geom_point(position = position, size = pt.size) } } if (!is.null(x = cols)) { cols.scale <- if (length(x = cols) == 1 && cols %in% rownames(x = brewer.pal.info)) { scale_color_brewer(palette = cols) } else { scale_color_manual(values = cols, na.value = na.value) } plot <- plot + cols.scale if (!is.null(x = rows.highlight)) { plot <- plot + guides(color = "none") } } plot <- plot + theme_cowplot() + theme(plot.title = element_text(hjust = 0.5)) if (!is.null(x = span)) { plot <- plot + geom_smooth( mapping = aes(x = .data[[names.plot[1]]], y = .data[[names.plot[2]]]), method = 'loess', span = span ) } return(plot) } #' Plot a single dimension #' #' @param data Data to plot #' @param dims A two-length numeric vector with dimensions to use #' @param col.by ... #' @param cols Vector of colors, each color corresponds to an identity class. #' This may also be a single character or numeric value corresponding to a #' palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}.By #' default, ggplot2 assigns colors #' @param pt.size Adjust point size for plotting #' @param shape.by If NULL, all points are circles (default). You can specify #' any cell attribute (that can be pulled with \code{\link{FetchData}}) #' allowing for both different colors and different shapes on cells. #' @param alpha Alpha value for plotting (default is 1) #' @param alpha.by Mapping variable for the point alpha value #' @param stroke.size Adjust stroke (outline) size of points #' @param order Specify the order of plotting for the idents. This can be #' useful for crowded plots if points of interest are being buried. Provide #' either a full list of valid idents or a subset to be plotted last (on top). #' @param label Whether to label the clusters #' @param repel Repel labels #' @param label.size Sets size of labels #' @param cells.highlight A list of character or numeric vectors of cells to #' highlight. If only one group of cells desired, can simply #' pass a vector instead of a list. If set, colors selected cells to the color(s) #' in \code{cols.highlight} and other cells black (white if dark.theme = TRUE); #' will also resize to the size(s) passed to \code{sizes.highlight} #' @param cols.highlight A vector of colors to highlight the cells as; will #' repeat to the length groups in cells.highlight #' @param sizes.highlight Size of highlighted cells; will repeat to the length #' groups in cells.highlight #' @param na.value Color value for NA points when using custom scale. #' @param raster Convert points to raster format, default is \code{NULL} #' which will automatically use raster if the number of points plotted is #' greater than 100,000 #' @param raster.dpi the pixel resolution for rastered plots, passed to geom_scattermore(). #' Default is c(512, 512) #' #' @return A ggplot2 object #' #' @importFrom cowplot theme_cowplot #' @importFrom RColorBrewer brewer.pal.info #' @importFrom ggplot2 ggplot geom_point labs guides scale_color_brewer #' scale_color_manual element_rect guide_legend discrete_scale #' #' @keywords internal #' #' @export #' SingleDimPlot <- function( data, dims, col.by = NULL, cols = NULL, pt.size = NULL, shape.by = NULL, alpha = 1, alpha.by = NULL, stroke.size = NULL, order = NULL, label = FALSE, repel = FALSE, label.size = 4, cells.highlight = NULL, cols.highlight = '#DE2D26', sizes.highlight = 1, na.value = 'grey50', raster = NULL, raster.dpi = NULL ) { if ((nrow(x = data) > 1e5) & is.null(x = raster)){ message("Rasterizing points since number of points exceeds 100,000.", "\nTo disable this behavior set `raster=FALSE`") } raster <- raster %||% (nrow(x = data) > 1e5) pt.size <- pt.size %||% AutoPointSize(data = data, raster = raster) if (is.null(x = stroke.size)) { stroke.size <- 0.600075815011372 } if (!is.null(x = cells.highlight) && pt.size != AutoPointSize(data = data, raster = raster) && sizes.highlight != pt.size && isTRUE(x = raster)) { warning("When `raster = TRUE` highlighted and non-highlighted cells must be the same size. Plot will use the value provided to 'sizes.highlight'.") } if (!is.null(x = raster.dpi)) { if (!is.numeric(x = raster.dpi) || length(x = raster.dpi) != 2) stop("'raster.dpi' must be a two-length numeric vector") } if (length(x = dims) != 2) { stop("'dims' must be a two-length vector") } if (!is.data.frame(x = data)) { data <- as.data.frame(x = data) } if (is.character(x = dims) && !all(dims %in% colnames(x = data))) { stop("Cannot find dimensions to plot in data") } else if (is.numeric(x = dims)) { dims <- colnames(x = data)[dims] } if (!is.null(x = cells.highlight)) { if (inherits(x = cells.highlight, what = "data.frame")) { stop("cells.highlight cannot be a dataframe. ", "Please supply a vector or list") } highlight.info <- SetHighlight( cells.highlight = cells.highlight, cells.all = rownames(x = data), sizes.highlight = sizes.highlight %||% pt.size, cols.highlight = cols.highlight, col.base = cols[1] %||% '#C3C3C3', pt.size = pt.size, raster = raster ) order <- highlight.info$plot.order data$highlight <- highlight.info$highlight col.by <- 'highlight' pt.size <- highlight.info$size cols <- highlight.info$color } if (!is.null(x = order) && !is.null(x = col.by)) { if (typeof(x = order) == "logical") { if (order) { data <- data[order(!is.na(x = data[, col.by]), data[, col.by]), ] } } else { order <- rev(x = c( order, setdiff(x = unique(x = data[, col.by]), y = order) )) data[, col.by] <- factor(x = data[, col.by], levels = order) new.order <- order(x = data[, col.by]) data <- data[new.order, ] if (length(x = pt.size) == length(x = new.order)) { pt.size <- pt.size[new.order] } } } if (!is.null(x = col.by) && !col.by %in% colnames(x = data)) { warning("Cannot find ", col.by, " in plotting data, not coloring plot") col.by <- NULL } else { # col.index <- grep(pattern = col.by, x = colnames(x = data), fixed = TRUE) col.index <- match(x = col.by, table = colnames(x = data)) if (grepl(pattern = '^\\d', x = col.by)) { # Do something for numbers col.by <- paste0('x', col.by) } else if (grepl(pattern = '-', x = col.by)) { # Do something for dashes col.by <- gsub(pattern = '-', replacement = '.', x = col.by) } colnames(x = data)[col.index] <- col.by } if (!is.null(x = shape.by) && !shape.by %in% colnames(x = data)) { warning("Cannot find ", shape.by, " in plotting data, not shaping plot") } if (!is.null(x = alpha.by) && !alpha.by %in% colnames(x = data)) { warning( "Cannot find alpha variable ", alpha.by, " in data, setting to NULL", call. = FALSE, immediate. = TRUE ) alpha.by <- NULL } # Modify optional parameters to work with tidyeval when NULL and safe naming of color/col.by # see https://github.com/tidyverse/ggplot2/issues/6208 # see https://github.com/tidyverse/ggplot2/pull/6215/commits/eaeee6d75cc60118919ca4a06a04cd4549af123c optional <- list(color = col.by, shape = shape.by, alpha = alpha.by) is_symbol <- lengths(optional) > 0 optional <- c(rlang::data_syms(optional[is_symbol]), optional[!is_symbol]) plot <- ggplot(data = data) plot <- if (isTRUE(x = raster)) { plot + geom_scattermore( mapping = aes( x = .data[[dims[1]]], y = .data[[dims[2]]], !!!optional ), pointsize = pt.size, alpha = alpha, pixels = raster.dpi ) } else { plot + geom_point( mapping = aes( x = .data[[dims[1]]], y = .data[[dims[2]]], !!!optional ), size = pt.size, alpha = alpha, stroke = stroke.size ) } plot <- plot + guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) + labs(color = NULL, title = col.by) + CenterTitle() if (label && !is.null(x = col.by)) { plot <- LabelClusters( plot = plot, id = col.by, repel = repel, size = label.size ) } if (!is.null(x = cols)) { if (length(x = cols) == 1 && (is.numeric(x = cols) || cols %in% rownames(x = brewer.pal.info))) { scale <- scale_color_brewer(palette = cols, na.value = na.value) } else if (length(x = cols) == 1 && (cols %in% c('alphabet', 'alphabet2', 'glasbey', 'polychrome', 'stepped'))) { colors <- DiscretePalette(length(unique(data[[col.by]])), palette = cols) scale <- scale_color_manual(values = colors, na.value = na.value) } else { scale <- scale_color_manual(values = cols, na.value = na.value) } plot <- plot + scale } plot <- plot + theme_cowplot() return(plot) } #' Plot a single expression by identity on a plot #' #' @param data Data to plot #' @param idents Idents to use #' @param split Use a split violin plot #' @param type Make either a \dQuote{ridge} or \dQuote{violin} plot #' @param sort Sort identity classes (on the x-axis) by the average #' expression of the attribute being potted #' @param y.max Maximum Y value to plot #' @param adjust Adjust parameter for geom_violin #' @param pt.size Size of points for violin plots #' @param alpha Alpha vlaue for violin plots #' @param cols Colors to use for plotting #' @param seed.use Random seed to use. If NULL, don't set a seed #' @param log plot Y axis on log10 scale #' @param add.noise determine if adding small noise for plotting #' @param raster Convert points to raster format. Requires 'ggrastr' to be installed. #' default is \code{NULL} which automatically rasterizes if ggrastr is installed and #' number of points exceed 100,000. #' @param raster.dpi the dpi for raster layer, default is 300. #' See \code{\link[ggrastr]{rasterize}} for more info. #' #' @return A ggplot-based Expression-by-Identity plot #' #' @importFrom stats rnorm #' @importFrom utils globalVariables #' @importFrom ggridges geom_density_ridges theme_ridges #' @importFrom ggplot2 ggplot theme labs geom_violin geom_jitter #' ylim position_jitterdodge scale_fill_manual scale_y_log10 scale_x_log10 #' scale_y_discrete scale_x_continuous waiver #' @importFrom cowplot theme_cowplot #' #' @keywords internal #' @export #' SingleExIPlot <- function( data, idents, split = NULL, type = 'violin', sort = FALSE, y.max = NULL, adjust = 1, pt.size = 0, alpha = 1, cols = NULL, seed.use = 42, log = FALSE, add.noise = TRUE, raster = NULL, raster.dpi = NULL ) { if (!is.null(x = raster) && isTRUE(x = raster)){ if (isFALSE(x = requireNamespace('ggrastr', quietly = TRUE))) { stop("Please install ggrastr from CRAN to enable rasterization.") } } if (isTRUE(x = requireNamespace('ggrastr', quietly = TRUE))) { # Set rasterization to true if ggrastr is installed and # number of points exceeds 100,000 if ((nrow(x = data) > 1e5) & is.null(x = raster)){ message("Rasterizing points since number of points exceeds 100,000.", "\nTo disable this behavior set `raster=FALSE`") # change raster to TRUE raster <- TRUE } } if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } if (!is.data.frame(x = data) || ncol(x = data) != 1) { stop("'SingleExIPlot requires a data frame with 1 column") } feature <- colnames(x = data) data$ident <- idents if ((is.character(x = sort) && nchar(x = sort) > 0) || sort) { data$ident <- factor( x = data$ident, levels = names(x = rev(x = sort( x = tapply( X = data[, feature], INDEX = data$ident, FUN = mean ), decreasing = grepl(pattern = paste0('^', tolower(x = sort)), x = 'decreasing') ))) ) } if (log) { noise <- rnorm(n = length(x = data[, feature])) / 200 data[, feature] <- data[, feature] + 1 } else { noise <- rnorm(n = length(x = data[, feature])) / 100000 } if (!add.noise) { noise <- noise * 0 } if (all(data[, feature] == data[, feature][1])) { warning(paste0("All cells have the same value of ", feature, ".")) } else{ data[, feature] <- data[, feature] + noise } axis.label <- 'Expression Level' y.max <- y.max %||% max(data[, feature][is.finite(x = data[, feature])]) if (type == 'violin' && !is.null(x = split)) { data$split <- split vln.geom <- geom_violin fill <- 'split' } else if (type == 'splitViolin' && !is.null(x = split )) { data$split <- split vln.geom <- geom_split_violin fill <- 'split' type <- 'violin' } else { vln.geom <- geom_violin fill <- 'ident' } switch( EXPR = type, 'violin' = { x <- data_sym("ident") y <- data_sym(feature) xlab <- 'Identity' ylab <- axis.label geom <- list( vln.geom(scale = 'width', adjust = adjust, trim = TRUE), theme(axis.text.x = element_text(angle = 45, hjust = 1)) ) if (is.null(x = split)) { if (isTRUE(x = raster)) { jitter <- ggrastr::rasterize(geom_jitter(height = 0, size = pt.size, alpha = alpha, show.legend = FALSE), dpi = raster.dpi) } else { jitter <- geom_jitter(height = 0, size = pt.size, alpha = alpha, show.legend = FALSE) } } else { if (isTRUE(x = raster)) { jitter <- ggrastr::rasterize(geom_jitter( position = position_jitterdodge(jitter.width = 0.4, dodge.width = 0.9), size = pt.size, alpha = alpha, show.legend = FALSE ), dpi = raster.dpi) } else { jitter <- geom_jitter( position = position_jitterdodge(jitter.width = 0.4, dodge.width = 0.9), size = pt.size, alpha = alpha, show.legend = FALSE ) } } log.scale <- scale_y_log10() axis.scale <- ylim }, 'ridge' = { x <- data_sym(feature) y <- data_sym("ident") xlab <- axis.label ylab <- 'Identity' geom <- list( geom_density_ridges(scale = 4), theme_ridges(), scale_y_discrete(expand = c(0.01, 0)), scale_x_continuous(expand = c(0, 0)) ) jitter <- geom_jitter(width = 0, size = pt.size, alpha = alpha, show.legend = FALSE) log.scale <- scale_x_log10() axis.scale <- function(...) { invisible(x = NULL) } }, stop("Unknown plot type: ", type) ) plot <- ggplot( data = data, mapping = aes(x = !!x, y = !!y, fill = .data[[fill]])[c(2, 3, 1)] ) + labs(x = xlab, y = ylab, title = feature, fill = NULL) + theme_cowplot() + theme(plot.title = element_text(hjust = 0.5)) plot <- do.call(what = '+', args = list(plot, geom)) plot <- plot + if (log) { log.scale } else { axis.scale(min(data[, feature]), y.max) } if (pt.size > 0) { plot <- plot + jitter } if (!is.null(x = cols)) { if (!is.null(x = split)) { idents <- unique(x = as.vector(x = data$ident)) splits <- unique(x = as.vector(x = data$split)) labels <- if (length(x = splits) == 2) { splits } else { unlist(x = lapply( X = idents, FUN = function(pattern, x) { x.mod <- gsub( pattern = paste0(pattern, '.'), replacement = paste0(pattern, ': '), x = x, fixed = TRUE ) x.keep <- grep(pattern = ': ', x = x.mod, fixed = TRUE) x.return <- x.mod[x.keep] names(x = x.return) <- x[x.keep] return(x.return) }, x = unique(x = as.vector(x = data$split)) )) } if (is.null(x = names(x = labels))) { names(x = labels) <- labels } } else { labels <- levels(x = droplevels(data$ident)) } plot <- plot + scale_fill_manual(values = cols, labels = labels) } return(plot) } #' A single heatmap from base R using \code{\link[graphics]{image}} #' #' @param data matrix of data to plot #' @param order optional vector of cell names to specify order in plot #' @param title Title for plot #' #' @return No return, generates a base-R heatmap using \code{\link[graphics]{image}} #' #' @importFrom graphics axis image par plot.new title #' #' @keywords internal #' #' @export #' SingleImageMap <- function(data, order = NULL, title = NULL) { if (!is.null(x = order)) { data <- data[order, ] } par(mar = c(1, 1, 3, 3)) plot.new() image( x = as.matrix(x = data), axes = FALSE, add = TRUE, col = PurpleAndYellow() ) axis( side = 4, at = seq(from = 0, to = 1, length = ncol(x = data)), labels = colnames(x = data), las = 1, tick = FALSE, mgp = c(0, -0.5, 0), cex.axis = 0.75 ) title(main = title) } #' Single Spatial Plot #' #' @param data A data frame with at least the following columns: #' \itemize{ #' \item \dQuote{\code{x}}: Spatial-resolved \emph{x} coordinates, will be #' plotted on the \emph{y}-axis #' \item \dQuote{\code{y}}: Spatially-resolved \emph{y} coordinates, will be #' plotted on the \emph{x}-axis #' \item \dQuote{\code{cell}}: Cell name #' \item \dQuote{\code{boundary}}: Segmentation boundary label; when plotting #' multiple segmentation layers, the order of boundary transparency is set by #' factor levels for this column #' } #' Can pass \code{NA} to \code{data} suppress segmentation visualization #' @param col.by Name of column in \code{data} to color cell segmentations by; #' pass \code{NA} to suppress coloring #' @param col.factor Are the colors a factor or discrete? #' @param cols Colors for cell segmentations; can be one of the #' following: #' \itemize{ #' \item \code{NULL} for default ggplot2 colors #' \item A numeric value or name of a #' \link[RColorBrewer:RColorBrewer]{color brewer palette} #' \item Name of a palette for \code{\link{DiscretePalette}} #' \item A vector of colors equal to the length of unique levels of #' \code{data$col.by} #' } #' @param shuffle.cols Randomly shuffle colors when a palette or #' vector of colors is provided to \code{cols} #' @param size Point size for cells when plotting centroids #' @param molecules A data frame with spatially-resolved molecule coordinates; #' should have the following columns: #' \itemize{ #' \item \dQuote{\code{x}}: Spatial-resolved \emph{x} coordinates, will be #' plotted on the \emph{y}-axis #' \item \dQuote{\code{y}}: Spatially-resolved \emph{y} coordinates, will be #' plotted on the \emph{x}-axis #' \item \dQuote{\code{molecule}}: Molecule name #' } #' @param mols.size Point size for molecules #' @param mols.cols A vector of color for molecules. The "Set1" palette from #' RColorBrewer is used by default. #' @param mols.alpha Alpha value for molecules, should be between 0 and 1 #' @param alpha Alpha value, should be between 0 and 1; when plotting multiple #' boundaries, \code{alpha} is equivalent to max alpha #' @param border.color Color of cell segmentation border; pass \code{NA} #' to suppress borders for segmentation-based plots #' @param border.size Thickness of cell segmentation borders; pass \code{NA} #' to suppress borders for centroid-based plots #' @param na.value Color value for \code{NA} segmentations when #' using custom scale #' @param ... Ignored #' #' @return A ggplot object #' #' @importFrom rlang is_na #' @importFrom SeuratObject %NA% %!NA% #' @importFrom RColorBrewer brewer.pal.info #' @importFrom ggplot2 geom_point geom_polygon ggplot guides #' guide_legend scale_alpha_manual scale_color_manual scale_fill_brewer #' scale_fill_manual #' #' @keywords internal #' #' @export #' SingleImagePlot <- function( data, col.by = NA, col.factor = TRUE, cols = NULL, shuffle.cols = FALSE, size = 0.1, molecules = NULL, mols.size = 0.1, mols.cols = NULL, mols.alpha = 1.0, alpha = molecules %iff% 0.3 %||% 0.6, border.color = 'white', border.size = NULL, na.value = 'grey50', dark.background = TRUE, ... ) { # Check input data if (!is_na(x = data)) { if (!all(c('x', 'y', 'cell', 'boundary') %in% colnames(x = data))) { stop("Invalid data coordinates") } if (!is_na(x = col.by)) { if (!col.by %in% colnames(x = data)) { warning( "Cannot find 'col.by' ('", col.by, "') in data coordinates", immediate. = TRUE ) col.by <- NA } else if (isTRUE(x = col.factor) && !is.factor(x = data[[col.by]])) { data[[col.by]] <- factor( x = data[[col.by]], levels = unique(x = data[[col.by]]) ) } else if (isFALSE(x = col.factor) && is.factor(x = data[[col.by]])) { data[[col.by]] <- as.vector(x = data[[col.by]]) } } if (is_na(x = col.by) && !is.null(x = cols)) { col.by <- RandomName(length = 7L) data[[col.by]] <- TRUE } if (!is.factor(x = data$boundary)) { data$boundary <- factor( x = data$boundary, levels = unique(x = data$boundary) ) } # Determine alphas if (is.na(x = alpha)) { alpha <- 1L } alpha.min <- ifelse( test = alpha < 1L, yes = 1 * (10 ^ .FindE(x = alpha)), no = 0.1 ) if (alpha.min == alpha) { alpha.min <- 1 * (10 ^ (.FindE(x = alpha) - 1)) } alphas <- .Cut( min = alpha.min, max = alpha, n = length(x = levels(x = data$boundary)) ) } # Normalize the optional column name col_clean <- if (is.null(col.by) || is.na(col.by) || !nzchar(col.by)) NULL else col.by # Build optional aes for fill aes_extra <- if (is.null(col_clean)) list() else list(fill = sym(col_clean)) # Assemble plot plot <- ggplot( data = data, mapping = aes( x = .data[["y"]], y = .data[["x"]], alpha = .data[["boundary"]], !!!aes_extra ) ) if (!is_na(x = data)) { plot <- plot + scale_alpha_manual(values = alphas) + if (anyDuplicated(x = data$cell)) { if (is.null(border.size)) { border.size <- 0.3 } geom_polygon( mapping = aes(group = .data[['cell']]), color = border.color, linewidth = border.size ) } else { # Default to no borders when plotting centroids if (is.null(border.size)) { border.size <- 0.0 } geom_point( shape = 21, color = border.color, stroke = border.size, size = size ) } if (!is.null(x = cols)) { plot <- plot + if (is.numeric(x = cols) || cols[1L] %in% rownames(x = brewer.pal.info)) { palette <- brewer.pal(n = length(x = levels(x = data[[col.by]])), cols) if (length(palette) < length(x = levels(x = data[[col.by]]))) { num.blank <- length(x = levels(x = data[[col.by]])) - length(palette) palette <- c(palette, rep(na.value, num.blank)) } if (isTRUE(shuffle.cols)) { palette <- sample(palette) } scale_fill_manual(values = palette, na.value = na.value) } else if (cols[1] %in% DiscretePalette(n = NULL)) { scale_fill_manual( values = DiscretePalette( n = length(x = levels(x = data[[col.by]])), palette = cols, shuffle = shuffle.cols ), na.value = na.value ) } else { if (isTRUE(shuffle.cols)) { cols <- sample(cols) } scale_fill_manual(values = cols, na.value = na.value) } } if (length(x = levels(x = data$boundary)) == 1L) { plot <- plot + guides(alpha = 'none') } # Adjust guides if (isTRUE(x = col.factor) && length(x = levels(x = data[[col.by]])) <= 1L) { plot <- plot + guides(fill = 'none') } } # Add molecule sets if (is.data.frame(x = molecules)) { if (all(c('x', 'y', 'molecule') %in% colnames(x = molecules))) { if (!is.factor(x = molecules$molecule)) { molecules$molecule <- factor( x = molecules$molecule, levels = unique(x = molecules$molecule) ) } plot <- plot + geom_point( mapping = aes(fill = NULL, alpha = NULL, color = .data[["molecule"]]), data = molecules, size = mols.size, alpha = mols.alpha, show.legend = c(color = TRUE, fill = FALSE, alpha = FALSE) ) + guides(color = guide_legend(override.aes = list(size = 3L))) + scale_color_manual( name = 'Molecules', values = mols.cols %||% brewer.pal( n = length(x = levels(x = molecules$molecule)), name = "Set1" ), guide = guide_legend() ) } else { warning("Invalid molecule coordinates", immediate. = TRUE) } } if (isTRUE(dark.background)) { plot <- plot + DarkTheme() } return(plot) } # A single polygon plot # # @param data Data to plot # @param group.by Grouping variable # @param ... Extra parameters passed to \code{\link[cowplot]{theme_cowplot}} # # @return A ggplot-based plot # #' @importFrom cowplot theme_cowplot #' @importFrom ggplot2 ggplot geom_polygon # # @seealso \code{\link[cowplot]{theme_cowplot}} # SinglePolyPlot <- function(data, group.by, ...) { plot <- ggplot(data = data, mapping = aes(x = .data[['x']], y = .data[['y']])) + geom_polygon(mapping = aes(fill = .data[[group.by]], group = .data[['cell']])) + coord_fixed() + theme_cowplot(...) return(plot) } #' A single heatmap from ggplot2 using geom_raster #' #' @param data A matrix or data frame with data to plot #' @param raster switch between geom_raster and geom_tile #' @param cell.order ... #' @param feature.order ... #' @param colors A vector of colors to use #' @param disp.min Minimum display value (all values below are clipped) #' @param disp.max Maximum display value (all values above are clipped) #' @param limits A two-length numeric vector with the limits for colors on the plot #' @param group.by A vector to group cells by, should be one grouping identity per cell #' #' @return A ggplot2 object # #' @importFrom ggplot2 ggplot geom_raster scale_fill_gradient #' scale_fill_gradientn theme element_blank labs geom_point guides #' guide_legend geom_tile #' #' @keywords internal #' #' @export # SingleRasterMap <- function( data, raster = TRUE, cell.order = NULL, feature.order = NULL, colors = PurpleAndYellow(), disp.min = -2.5, disp.max = 2.5, limits = NULL, group.by = NULL ) { data <- MinMax(data = data, min = disp.min, max = disp.max) data <- Melt(x = t(x = data)) colnames(x = data) <- c('Feature', 'Cell', 'Expression') if (!is.null(x = feature.order)) { data$Feature <- factor(x = data$Feature, levels = unique(x = feature.order)) } if (!is.null(x = group.by)) { data$Identity <- group.by[data$Cell] } if (!is.null(x = cell.order)) { data$Cell <- factor(x = data$Cell, levels = unique(x = cell.order)) } limits <- limits %||% c(min(data$Expression), max(data$Expression)) if (length(x = limits) != 2 || !is.numeric(x = limits)) { stop("limits' must be a two-length numeric vector") } my_geom <- ifelse(test = raster, yes = geom_raster, no = geom_tile) plot <- ggplot(data = data) + my_geom(mapping = aes(x = .data[['Cell']], y = .data[['Feature']], fill = .data[['Expression']])) + theme(axis.text.x = element_blank(), axis.ticks.x = element_blank()) + scale_fill_gradientn(limits = limits, colors = colors, na.value = "white") + labs(x = NULL, y = NULL, fill = group.by %iff% 'Expression') + WhiteBackground() + NoAxes(keep.text = TRUE) if (!is.null(x = group.by)) { plot <- plot + geom_point( mapping = aes(x = .data[['Cell']], y = .data[['Feature']], color = .data[['Identity']]), alpha = 0 ) + guides(color = guide_legend(override.aes = list(alpha = 1))) } return(plot) } #' Base plotting function for all Spatial plots #' #' @param data Data.frame with info to be plotted #' @param image \code{SpatialImage} object to be plotted #' @param cols Vector of colors, each color corresponds to an identity class. #' This may also be a single character #' or numeric value corresponding to a palette as specified by #' \code{\link[RColorBrewer]{brewer.pal.info}}. By default, ggplot2 assigns #' colors #' @param image.alpha Adjust the opacity of the background images. Set to 0 to #' remove. #' @param image.scale Choose the scale factor ("lowres"/"hires") to apply in #' order to matchthe plot with the specified `image` - defaults to "lowres" #' @param pt.alpha Adjust the opacity of the points if plotting a #' \code{SpatialDimPlot} #' @param crop Crop the plot in to focus on points plotted. Set to \code{FALSE} #' to show entire background image. #' @param pt.size.factor Sets the size of the points relative to spot.radius #' @param stroke Control the width of the border around the spots #' @param shape Control the shape of the spots - same as the ggplot2 parameter. #' The default is 21, which plots cirlces - use 22 to plot squares. #' @param col.by Mapping variable for the point color #' @param alpha.by Mapping variable for the point alpha value #' @param cells.highlight A list of character or numeric vectors of cells to #' highlight. If only one group of cells desired, can simply pass a vector #' instead of a list. If set, colors selected cells to the color(s) in #' cols.highlight #' @param cols.highlight A vector of colors to highlight the cells as; ordered #' the same as the groups in cells.highlight; last color corresponds to #' unselected cells. #' @param geom Switch between normal spatial geom and geom to enable hover #' functionality #' @param na.value Color for spots with NA values #' @param plot_segmentations Define whether plot should plot centroids or segmentations #' #' @return A ggplot2 object #' #' @importFrom tibble tibble #' @importFrom ggplot2 ggplot coord_fixed geom_point #' xlim ylim coord_cartesian labs theme_void theme #' scale_fill_brewer scale_y_reverse annotation_custom #' #' @keywords internal #' #' @export #' SingleSpatialPlot <- function( data, image, cols = NULL, image.alpha = 1, image.scale = "lowres", pt.alpha = NULL, crop = TRUE, pt.size.factor = NULL, shape = 21, stroke = NA, col.by = NULL, alpha.by = NULL, cells.highlight = NULL, cols.highlight = c('#DE2D26', 'grey50'), geom = c('spatial', 'interactive', 'poly', 'poly_starmap'), na.value = 'grey50', plot_segmentations = FALSE ) { geom <- match.arg(arg = geom) if (!is.null(col.by) && !col.by %in% colnames(data)) { warning("Cannot find '", col.by, "' in data, not coloring", call. = FALSE, immediate. = TRUE) col.by <- NULL } if (!is.null(x = cells.highlight)) { highlight.info <- SetHighlight( cells.highlight = cells.highlight, cells.all = rownames(x = data), sizes.highlight = pt.size.factor, cols.highlight = cols.highlight[1], col.base = cols.highlight[2] ) order <- highlight.info$plot.order data$highlight <- highlight.info$highlight col.by <- 'highlight' levels(x = data$ident) <- c(order, setdiff(x = levels(x = data$ident), y = order)) data <- data[order(data$ident), ] } col.by.plot <- col.by %iff% data_sym(col.by) #had to create second variable to safely use tidyeval in plotting but not effect subsetting in gsub call later in function col.by <- col.by %iff% paste0("`", col.by, "`") # Store unquoted col.by name for easier access col.by.clean <- gsub("`", "", col.by) alpha.by <- alpha.by %iff% data_sym(alpha.by) plot <- ggplot(data = data, aes( x = .data[[colnames(x = data)[1]]], y = .data[[colnames(x = data)[2]]], fill = !!col.by.plot, alpha = !!alpha.by )) plot <- switch( EXPR = geom, 'spatial' = { if (is.null(x = pt.alpha)) { plot <- plot + geom_spatial( point.size.factor = pt.size.factor, data = data, image = image, image.alpha = image.alpha, image.scale = image.scale, crop = crop, shape = shape, stroke = stroke, ) } else { plot <- plot + geom_spatial( point.size.factor = pt.size.factor, data = data, image = image, image.alpha = image.alpha, image.scale = image.scale, crop = crop, shape = shape, stroke = stroke, alpha = pt.alpha ) } plot + coord_fixed() + scale_y_reverse() }, 'interactive' = { plot + geom_spatial_interactive( data = tibble( grob = list( GetImage( object = image, mode = 'grob' ) ) ), mapping = aes(grob = .data[['grob']]), x = 0.5, y = 0.5 ) + geom_point(mapping = aes(color = .data[[col.by]])) + xlim(0, ncol(x = image)) + ylim(nrow(x = image), 0) + coord_cartesian(expand = FALSE) }, 'poly' = { image_to_plot <- image@image # Apply image transparency if (image.alpha < 1) { # Convert image to RGBA by adding alpha channel rgba_image <- array(data = NA, dim = c(dim(image_to_plot)[1:2], 4)) rgba_image[,,1:3] <- image_to_plot rgba_image[,,4] <- image.alpha image_to_plot <- rgba_image } # Validate image image.grob <- rasterGrob( image_to_plot, width = unit(1, "npc"), height = unit(1, "npc"), interpolate = FALSE ) # Retrieve scale factor from specified image scale ("lowres"/"hires") scale.factor <- ScaleFactors(image)[[image.scale]] if (is.null(scale.factor)) stop("Scale factor for '", image.scale, "' not found") # Retrieve image dimensions for later use image.height <- dim(image@image)[1] image.width <- dim(image@image)[2] # Extract and scale segmentation data segm_data <- image@boundaries$segmentations@sf.data segm_data$x <- segm_data$x * scale.factor segm_data$y <- segm_data$y * scale.factor # Merge segmentation data with expression data and centroid coordinates plot_data <- merge(segm_data, data, by = "cell", suffixes = c("", ".centroid"), sort = FALSE) if (packageVersion("ggplot2") < "4.0.0") { message("Changing image annotation limits to work with ggplot2 < 4.0.0.") image_annotation_layer <- annotation_custom( grob = image.grob, xmin = 0, xmax = image.width, ymin = -image.height, ymax = 0) } else { image_annotation_layer <- annotation_custom( grob = image.grob, xmin = 0, xmax = image.width, ymin = 0, ymax = image.height) } # Create appropriate geom layer based on plot_segmentations if (!plot_segmentations) { #If plot_segmentations FALSE, then plot just the polygon centroids if (is.null(pt.alpha)) { #If pt.alpha not provided, then alpha parameter is derived from group/cluster data #Use alpha.by instead of pt.alpha geom_point_layer <- geom_point( data = plot_data, shape = 21, stroke = stroke, size = pt.size.factor, aes(x = .data[['x.centroid']], y = .data[['y.centroid']], fill = !!col.by.plot, alpha = !!alpha.by) ) } else { geom_point_layer <- geom_point( data = plot_data, shape = 21, stroke = stroke, size = pt.size.factor, aes(x = .data[['x.centroid']], y = .data[['y.centroid']], fill = !!col.by.plot), alpha = pt.alpha ) } ggplot() + image_annotation_layer + geom_point_layer + scale_y_reverse() + xlab("x") + ylab("y") + coord_fixed() + theme_void() } else { if (is.null(pt.alpha)) { # If pt.alpha is not provided, then alpha is derived from group/cluster data # Use alpha.by instead of pt.alpha geom_polygon_layer <- geom_polygon( data = plot_data, aes(x = .data[['x']], y = .data[['y']], fill = !!col.by.plot, alpha = !!alpha.by, group = .data[['cell']]), color = "black", linewidth = stroke ) } else { # If pt.alpha is indeed provided, then use that to define alpha geom_polygon_layer <- geom_polygon( data = plot_data, aes(x = .data[['x']], y = .data[['y']], fill = !!col.by.plot, group = .data[['cell']]), alpha = pt.alpha, color = "black", linewidth = stroke ) } ggplot() + image_annotation_layer + geom_polygon_layer + scale_y_reverse() + xlab("x") + ylab("y") + coord_fixed() + theme_void() } }, 'poly_starmap' = { data$cell <- rownames(x = data) data[, c('x', 'y')] <- NULL data <- merge( x = data, y = GetTissueCoordinates( object = image, qhulls = TRUE, scale = image.scale ), by = "cell" ) plot + geom_polygon( data = data, mapping = aes(fill = !!col.by.plot, group = .data[['cell']]) ) + coord_fixed() + theme_cowplot() }, stop("Unknown geom, choose from 'spatial' or 'interactive'", call. = FALSE) ) if (!is.null(x = cells.highlight)) { plot <- plot + scale_fill_manual(values = cols.highlight) } if (!is.null(x = cols) && is.null(x = cells.highlight)) { if (length(x = cols) == 1 && (is.numeric(x = cols) || cols %in% rownames(x = brewer.pal.info))) { scale <- scale_fill_brewer(palette = cols, na.value = na.value) } else if (length(x = cols) == 1 && (cols %in% c('alphabet', 'alphabet2', 'glasbey', 'polychrome', 'stepped'))) { colors <- DiscretePalette(length(unique(data[[col.by]])), palette = cols) scale <- scale_fill_manual(values = colors, na.value = na.value) } else { data[[col.by.clean]] <- as.character(data[[col.by.clean]]) vals <- unique(as.character(data[[col.by.clean]])) cols <- cols[names(cols) %in% vals] scale <- scale_fill_manual(values = cols, na.value = na.value) } plot <- plot + scale } plot <- plot + NoAxes() + theme(panel.background = element_blank()) return(plot) } # Reimplementation of ggplot2 coord$transform # # @param data A data frame with x-coordinates in the first column and y-coordinates # in the second # @param xlim,ylim X- and Y-limits for the transformation, must be two-length # numeric vectors # # @return \code{data} with transformed coordinates # #' @importFrom ggplot2 transform_position #' @importFrom scales rescale squish_infinite # Transform <- function(data, xlim = c(-Inf, Inf), ylim = c(-Inf, Inf)) { # Quick input argument checking if (!all(sapply(X = list(xlim, ylim), FUN = length) == 2)) { stop("'xlim' and 'ylim' must be two-length numeric vectors", call. = FALSE) } # Save original names df.names <- colnames(x = data) colnames(x = data)[1:2] <- c('x', 'y') # Rescale the X and Y values data <- transform_position( df = data, trans_x = function(df) { return(rescale(x = df, from = xlim)) }, trans_y = function(df) { return(rescale(x = df, from = ylim)) } ) # Something that ggplot2 does data <- transform_position( df = data, trans_x = squish_infinite, trans_y = squish_infinite ) # Restore original names colnames(x = data) <- df.names return(data) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # S4 Methods #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% setMethod( f = '.PrepImageData', signature = c(data = 'data.frame', cells = 'rle'), definition = function(data, cells, ...) { data <- sapply( X = colnames(x = data), FUN = function(x) { j <- data[[x]] names(x = j) <- rownames(x = data) return(.PrepImageData(data = j, cells = cells, name = x)) }, simplify = FALSE, USE.NAMES = TRUE ) return(do.call(what = 'cbind', args = data)) } ) #' @importFrom methods getMethod setMethod( f = '.PrepImageData', signature = c(data = 'factor', cells = 'rle'), definition = function(data, cells, name, ...) { f <- getMethod( f = '.PrepImageData', signature = c(data = 'vector', cells = 'rle') ) return(f(data = data, cells = cells, name = name, ...)) } ) setMethod( f = '.PrepImageData', signature = c(data = 'list', cells = 'rle'), definition = function(data, cells, ...) { .NotYetImplemented() } ) setMethod( f = '.PrepImageData', signature = c(data = 'NULL', cells = 'rle'), definition = function(data, cells, ...) { return(SeuratObject::EmptyDF(n = sum(cells$lengths))) } ) setMethod( f = '.PrepImageData', signature = c(data = 'vector', cells = 'rle'), definition = function(data, cells, name, ...) { name <- as.character(x = name) if (name %in% c('x', 'y', 'cell')) { stop("'name' cannot be 'x', 'y', or 'cell'", call. = FALSE) } cnames <- cells$values if (is.null(x = names(x = data))) { mlen <- min(sapply(X = list(data, cnames), FUN = length)) names(x = data)[1:mlen] <- cnames[1:mlen] } if (anyDuplicated(x = names(x = data))) { dup <- duplicated(x = names(x = data)) warning( sum(dup), ifelse(test = sum(dup) == 1, yes = ' cell', no = ' cells'), ' duplicated, using only the first occurance', call. = FALSE, immediate. = TRUE ) } if (length(x = data) < length(x = cnames)) { mcells <- setdiff(x = cnames, y = names(x = data)) warning( "Missing data for some cells, filling with NA", call. = FALSE, immediate. = TRUE ) data[mcells] <- NA } else if (length(x = data) > length(x = cnames)) { warning( "More cells provided than present", call. = FALSE, immediate. = TRUE ) } data <- data.frame(rep.int(x = data[cnames], times = cells$lengths)) colnames(x = data) <- name return(data) } ) Seurat/R/dimensional_reduction.R0000644000176200001440000026126215074241310016425 0ustar liggesusers#' @include generics.R #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Determine statistical significance of PCA scores. #' #' Randomly permutes a subset of data, and calculates projected PCA scores for #' these 'random' genes. Then compares the PCA scores for the 'random' genes #' with the observed PCA scores to determine statistical significance. End result #' is a p-value for each gene's association with each principal component. #' #' @param object Seurat object #' @param reduction DimReduc to use. ONLY PCA CURRENTLY SUPPORTED. #' @param assay Assay used to calculate reduction. #' @param dims Number of PCs to compute significance for #' @param num.replicate Number of replicate samplings to perform #' @param prop.freq Proportion of the data to randomly permute for each #' replicate #' @param verbose Print progress bar showing the number of replicates #' that have been processed. #' @param maxit maximum number of iterations to be performed by the irlba function of RunPCA #' #' @return Returns a Seurat object where JS(object = object[['pca']], slot = 'empirical') #' represents p-values for each gene in the PCA analysis. If ProjectPCA is #' subsequently run, JS(object = object[['pca']], slot = 'full') then #' represents p-values for all genes. #' #' @importFrom methods new #' @importFrom pbapply pblapply pbsapply #' @importFrom future.apply future_lapply future_sapply #' @importFrom future nbrOfWorkers #' #' @references Inspired by Chung et al, Bioinformatics (2014) #' @concept dimensional_reduction #' #' @export #' #' @examples #' \dontrun{ #' data("pbmc_small") #' pbmc_small = suppressWarnings(JackStraw(pbmc_small)) #' head(JS(object = pbmc_small[['pca']], slot = 'empirical')) #' } #' JackStraw <- function( object, reduction = "pca", assay = NULL, dims = 20, num.replicate = 100, prop.freq = 0.01, verbose = TRUE, maxit = 1000 ) { if (reduction != "pca") { stop("Only pca for reduction is currently supported") } if (verbose && nbrOfWorkers() == 1) { my.lapply <- pblapply my.sapply <- pbsapply } else { my.lapply <- future_lapply my.sapply <- future_sapply } assay <- assay %||% DefaultAssay(object = object) if (IsSCT(assay = object[[assay]])) { stop("JackStraw cannot be run on SCTransform-normalized data. Please supply a non-SCT assay.") } if (dims > length(x = object[[reduction]])) { dims <- length(x = object[[reduction]]) warning("Number of dimensions specified is greater than those available. Setting dims to ", dims, " and continuing", immediate. = TRUE) } if (dims > nrow(x = object)) { dims <- nrow(x = object) warning("Number of dimensions specified is greater than the number of cells. Setting dims to ", dims, " and continuing", immediate. = TRUE) } loadings <- Loadings(object = object[[reduction]], projected = FALSE) reduc.features <- rownames(x = loadings) if (length(x = reduc.features) < 3) { stop("Too few features") } if (length(x = reduc.features) * prop.freq < 3) { warning( "Number of variable genes given ", prop.freq, " as the prop.freq is low. Consider including more variable genes and/or increasing prop.freq. ", "Continuing with 3 genes in every random sampling." ) } data.use <- GetAssayData(object = object, assay = assay, layer = "scale.data")[reduc.features, ] rev.pca <- object[[paste0('RunPCA.', assay)]]$rev.pca weight.by.var <- object[[paste0('RunPCA.', assay)]]$weight.by.var fake.vals.raw <- my.lapply( X = 1:num.replicate, FUN = JackRandom, scaled.data = data.use, prop.use = prop.freq, r1.use = 1, r2.use = dims, rev.pca = rev.pca, weight.by.var = weight.by.var, maxit = maxit ) fake.vals <- sapply( X = 1:dims, FUN = function(x) { return(as.numeric(x = unlist(x = lapply( X = 1:num.replicate, FUN = function(y) { return(fake.vals.raw[[y]][, x]) } )))) } ) fake.vals <- as.matrix(x = fake.vals) jackStraw.empP <- as.matrix( my.sapply( X = 1:dims, FUN = function(x) { return(unlist(x = lapply( X = abs(loadings[, x]), FUN = EmpiricalP, nullval = abs(fake.vals[,x]) ))) } ) ) colnames(x = jackStraw.empP) <- paste0("PC", 1:ncol(x = jackStraw.empP)) jackstraw.obj <- new( Class = "JackStrawData", empirical.p.values = jackStraw.empP, fake.reduction.scores = fake.vals, empirical.p.values.full = matrix() ) JS(object = object[[reduction]]) <- jackstraw.obj object <- LogSeuratCommand(object = object) return(object) } #' L2-normalization #' #' Perform l2 normalization on given dimensional reduction #' #' @param object Seurat object #' @param reduction Dimensional reduction to normalize #' @param new.dr name of new dimensional reduction to store #' (default is olddr.l2) #' @param new.key name of key for new dimensional reduction #' #' @return Returns a \code{\link{Seurat}} object #' @concept dimensional_reduction #' #' @export #' L2Dim <- function(object, reduction, new.dr = NULL, new.key = NULL) { l2.norm <- L2Norm(mat = Embeddings(object[[reduction]])) if(is.null(new.dr)){ new.dr <- paste0(reduction, ".l2") } if(is.null(new.key)){ new.key <- paste0("L2", Key(object[[reduction]])) } colnames(x = l2.norm) <- paste0(new.key, 1:ncol(x = l2.norm)) l2.dr <- CreateDimReducObject( embeddings = l2.norm, loadings = Loadings(object = object[[reduction]], projected = FALSE), projected = Loadings(object = object[[reduction]], projected = TRUE), assay = DefaultAssay(object = object), stdev = slot(object = object[[reduction]], name = 'stdev'), key = new.key, jackstraw = slot(object = object[[reduction]], name = 'jackstraw'), misc = slot(object = object[[reduction]], name = 'misc') ) object[[new.dr]] <- l2.dr return(object) } #' L2-Normalize CCA #' #' Perform l2 normalization on CCs #' #' @param object Seurat object #' @param \dots Additional parameters to L2Dim. #' @concept dimensional_reduction #' #' @export #' L2CCA <- function(object, ...){ CheckDots(..., fxns = 'L2Dim') return(L2Dim(object = object, reduction = "cca", ...)) } #' Significant genes from a PCA #' #' Returns a set of genes, based on the JackStraw analysis, that have #' statistically significant associations with a set of PCs. #' #' @param object Seurat object #' @param pcs.use PCS to use. #' @param pval.cut P-value cutoff #' @param use.full Use the full list of genes (from the projected PCA). Assumes #' that \code{ProjectDim} has been run. Currently, must be set to FALSE. #' @param max.per.pc Maximum number of genes to return per PC. Used to avoid genes from one PC dominating the entire analysis. #' #' @return A vector of genes whose p-values are statistically significant for #' at least one of the given PCs. #' #' @export #' @concept dimensional_reduction #' #' @seealso \code{\link{ProjectDim}} \code{\link{JackStraw}} #' #' @examples #' data("pbmc_small") #' PCASigGenes(pbmc_small, pcs.use = 1:2) #' PCASigGenes <- function( object, pcs.use, pval.cut = 0.1, use.full = FALSE, max.per.pc = NULL ) { # pvals.use <- GetDimReduction(object,reduction.type = "pca",slot = "jackstraw")@empirical.p.values empirical.use <- ifelse(test = use.full, yes = 'full', no = 'empirical') pvals.use <- JS(object = object[['pca']], slot = empirical.use) if (length(x = pcs.use) == 1) { pvals.min <- pvals.use[, pcs.use] } if (length(x = pcs.use) > 1) { pvals.min <- apply(X = pvals.use[, pcs.use], MARGIN = 1, FUN = min) } names(x = pvals.min) <- rownames(x = pvals.use) features <- names(x = pvals.min)[pvals.min < pval.cut] if (!is.null(x = max.per.pc)) { top.features <- TopFeatures( object = object[['pca']], dim = pcs.use, nfeatures = max.per.pc, projected = use.full, balanced = FALSE ) features <- intersect(x = top.features, y = features) } return(features) } #' Project Dimensional reduction onto full dataset #' #' Takes a pre-computed dimensional reduction (typically calculated on a subset #' of genes) and projects this onto the entire dataset (all genes). Note that #' the cell loadings will remain unchanged, but now there are gene loadings for #' all genes. #' #' @param object Seurat object #' @param reduction Reduction to use #' @param assay Assay to use #' @param dims.print Number of dims to print features for #' @param nfeatures.print Number of features with highest/lowest loadings to print for #' each dimension #' @param overwrite Replace the existing data in feature.loadings #' @param do.center Center the dataset prior to projection (should be set to TRUE) #' @param verbose Print top genes associated with the projected dimensions #' #' @return Returns Seurat object with the projected values #' #' @export #' @concept dimensional_reduction #' #' @examples #' data("pbmc_small") #' pbmc_small #' pbmc_small <- ProjectDim(object = pbmc_small, reduction = "pca") #' # Visualize top projected genes in heatmap #' DimHeatmap(object = pbmc_small, reduction = "pca", dims = 1, balanced = TRUE) #' ProjectDim <- function( object, reduction = "pca", assay = NULL, dims.print = 1:5, nfeatures.print = 20, overwrite = FALSE, do.center = FALSE, verbose = TRUE ) { redeuc <- object[[reduction]] assay <- assay %||% DefaultAssay(object = redeuc) data.use <- GetAssayData( object = object[[assay]], layer = "scale.data" ) if (do.center) { data.use <- scale(x = as.matrix(x = data.use), center = TRUE, scale = FALSE) } cell.embeddings <- Embeddings(object = redeuc) new.feature.loadings.full <- data.use %*% cell.embeddings rownames(x = new.feature.loadings.full) <- rownames(x = data.use) colnames(x = new.feature.loadings.full) <- colnames(x = cell.embeddings) Loadings(object = redeuc, projected = TRUE) <- new.feature.loadings.full if (overwrite) { Loadings(object = redeuc, projected = FALSE) <- new.feature.loadings.full } object[[reduction]] <- redeuc if (verbose) { print( x = redeuc, dims = dims.print, nfeatures = nfeatures.print, projected = TRUE ) } object <- LogSeuratCommand(object = object) return(object) } #' @param query.dims Dimensions (columns) to use from query #' @param reference.dims Dimensions (columns) to use from reference #' @param ... Additional parameters to \code{\link{RunUMAP}} #' #' @inheritParams FindNeighbors #' @inheritParams RunUMAP #' #' @rdname ProjectUMAP #' @concept dimensional_reduction #' @export #' ProjectUMAP.default <- function( query, query.dims = NULL, reference, reference.dims = NULL, k.param = 30, nn.method = "annoy", n.trees = 50, annoy.metric = "cosine", l2.norm = FALSE, cache.index = TRUE, index = NULL, neighbor.name = "query_ref.nn", reduction.model, ... ) { query.dims <- query.dims %||% 1:ncol(x = query) reference.dims <- reference.dims %||% query.dims if (length(x = reference.dims) != length(x = query.dims)) { stop("Length of Reference and Query number of dimensions are not equal") } if (any(reference.dims > ncol(x = reference))) { stop("Reference dims is larger than the number of dimensions present.", call. = FALSE) } if (any(query.dims > ncol(x = query))) { stop("Query dims is larger than the number of dimensions present.", call. = FALSE) } if (length(x = Misc(object = reduction.model, slot = 'model')) == 0) { stop( "The provided reduction.model does not have a model stored. Please try ", "running umot-learn on the object first", call. = FALSE ) } query.neighbor <- FindNeighbors( object = reference[, reference.dims], query = query[, query.dims], k.param = k.param, nn.method = nn.method, n.trees = n.trees, annoy.metric = annoy.metric, cache.index = cache.index, index = index, return.neighbor = TRUE, l2.norm = l2.norm ) proj.umap <- RunUMAP(object = query.neighbor, reduction.model = reduction.model, ...) return(list(proj.umap = proj.umap, query.neighbor = query.neighbor)) } #' @rdname ProjectUMAP #' @concept dimensional_reduction #' @export #' @method ProjectUMAP DimReduc #' ProjectUMAP.DimReduc <- function( query, query.dims = NULL, reference, reference.dims = NULL, k.param = 30, nn.method = "annoy", n.trees = 50, annoy.metric = "cosine", l2.norm = FALSE, cache.index = TRUE, index = NULL, neighbor.name = "query_ref.nn", reduction.model, ... ) { proj.umap <- ProjectUMAP( query = Embeddings(object = query), query.dims = query.dims, reference = Embeddings(object = reference), reference.dims = reference.dims, k.param = k.param, nn.method = nn.method, n.trees = 50, annoy.metric = annoy.metric, l2.norm = l2.norm, cache.index = cache.index, index = index, neighbor.name = neighbor.name, reduction.model = reduction.model, ... ) return(proj.umap) } #' @param reference Reference dataset #' @param query.reduction Name of reduction to use from the query for neighbor #' finding #' @param reference.reduction Name of reduction to use from the reference for #' neighbor finding #' @param neighbor.name Name to store neighbor information in the query #' @param reduction.name Name of projected UMAP to store in the query #' @param reduction.key Value for the projected UMAP key #' @rdname ProjectUMAP #' @concept dimensional_reduction #' @export #' @method ProjectUMAP Seurat #' ProjectUMAP.Seurat <- function( query, query.reduction, query.dims = NULL, reference, reference.reduction, reference.dims = NULL, k.param = 30, nn.method = "annoy", n.trees = 50, annoy.metric = "cosine", l2.norm = FALSE, cache.index = TRUE, index = NULL, neighbor.name = "query_ref.nn", reduction.model, reduction.name = "ref.umap", reduction.key = "refUMAP_", ... ) { if (!query.reduction %in% Reductions(object = query)) { stop("The query.reduction (", query.reduction, ") is not present in the ", "provided query", call. = FALSE) } if (!reference.reduction %in% Reductions(object = reference)) { stop("The reference.reduction (", reference.reduction, ") is not present in the ", "provided reference.", call. = FALSE) } if (!reduction.model %in% Reductions(object = reference)) { stop("The reduction.model (", reduction.model, ") is not present in the ", "provided reference.", call. = FALSE) } proj.umap <- ProjectUMAP( query = query[[query.reduction]], query.dims = query.dims, reference = reference[[reference.reduction]], reference.dims = reference.dims, k.param = k.param, nn.method = nn.method, n.trees = n.trees, annoy.metric = annoy.metric, l2.norm = l2.norm, cache.index = cache.index, index = index, neighbor.name = neighbor.name, reduction.model = reference[[reduction.model]], reduction.key = reduction.key, assay = DefaultAssay(query), ... ) query[[reduction.name]] <- proj.umap$proj.umap query[[neighbor.name]] <- proj.umap$query.neighbor return(query) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @param standardize Standardize matrices - scales columns to have unit variance #' and mean 0 #' @param num.cc Number of canonical vectors to calculate #' @param seed.use Random seed to set. If NULL, does not set a seed #' @param verbose Show progress messages #' #' @importFrom irlba irlba #' #' @rdname RunCCA #' @concept dimensional_reduction #' @export #' RunCCA.default <- function( object1, object2, standardize = TRUE, num.cc = 20, seed.use = 42, verbose = FALSE, ... ) { if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } cells1 <- colnames(x = object1) cells2 <- colnames(x = object2) if (standardize) { object1 <- Standardize(mat = object1, display_progress = FALSE) object2 <- Standardize(mat = object2, display_progress = FALSE) } mat3 <- crossprod(x = object1, y = object2) cca.svd <- irlba(A = mat3, nv = num.cc) cca.data <- rbind(cca.svd$u, cca.svd$v) colnames(x = cca.data) <- paste0("CC", 1:num.cc) rownames(cca.data) <- c(cells1, cells2) cca.data <- apply( X = cca.data, MARGIN = 2, FUN = function(x) { if (sign(x[1]) == -1) { x <- x * -1 } return(x) } ) return(list(ccv = cca.data, d = cca.svd$d)) } #' @param assay1,assay2 Assays to pull from in the first and second objects, respectively #' @param features Set of genes to use in CCA. Default is the union of both #' the variable features sets present in both objects. #' @param renormalize Renormalize raw data after merging the objects. If FALSE, #' merge the data matrices also. #' @param rescale Rescale the datasets prior to CCA. If FALSE, uses existing data in the scale data slots. #' @param compute.gene.loadings Also compute the gene loadings. NOTE - this will #' scale every gene in the dataset which may impose a high memory cost. #' @param add.cell.id1,add.cell.id2 Add ... #' @param ... Extra parameters (passed onto MergeSeurat in case with two objects #' passed, passed onto ScaleData in case with single object and rescale.groups #' set to TRUE) #' #' @rdname RunCCA #' @concept dimensional_reduction #' @export #' @method RunCCA Seurat #' RunCCA.Seurat <- function( object1, object2, assay1 = NULL, assay2 = NULL, num.cc = 20, features = NULL, renormalize = FALSE, rescale = FALSE, compute.gene.loadings = TRUE, add.cell.id1 = NULL, add.cell.id2 = NULL, verbose = TRUE, ... ) { op <- options(Seurat.object.assay.version = "v3", Seurat.object.assay.calcn = FALSE) on.exit(expr = options(op), add = TRUE) assay1 <- assay1 %||% DefaultAssay(object = object1) assay2 <- assay2 %||% DefaultAssay(object = object2) if (assay1 != assay2) { warning("Running CCA on different assays") } if (is.null(x = features)) { if (length(x = VariableFeatures(object = object1, assay = assay1)) == 0) { stop(paste0("VariableFeatures not computed for the ", assay1, " assay in object1")) } if (length(x = VariableFeatures(object = object2, assay = assay2)) == 0) { stop(paste0("VariableFeatures not computed for the ", assay2, " assay in object2")) } features <- union(x = VariableFeatures(object = object1), y = VariableFeatures(object = object2)) if (length(x = features) == 0) { stop("Zero features in the union of the VariableFeature sets ") } } nfeatures <- length(x = features) if (!(rescale)) { data.use1 <- GetAssayData(object = object1, assay = assay1, layer = "scale.data") data.use2 <- GetAssayData(object = object2, assay = assay2, layer = "scale.data") features <- CheckFeatures(data.use = data.use1, features = features, object.name = "object1", verbose = FALSE) features <- CheckFeatures(data.use = data.use2, features = features, object.name = "object2", verbose = FALSE) data1 <- data.use1[features, ] data2 <- data.use2[features, ] } if (rescale) { data.use1 <- GetAssayData(object = object1, assay = assay1, layer = "data") data.use2 <- GetAssayData(object = object2, assay = assay2, layer = "data") features <- CheckFeatures(data.use = data.use1, features = features, object.name = "object1", verbose = FALSE) features <- CheckFeatures(data.use = data.use2, features = features, object.name = "object2", verbose = FALSE) data1 <- data.use1[features,] data2 <- data.use2[features,] if (verbose) message("Rescaling groups") data1 <- FastRowScale(as.matrix(data1)) dimnames(data1) <- list(features, colnames(x = object1)) data2 <- FastRowScale(as.matrix(data2)) dimnames(data2) <- list(features, colnames(x = object2)) } if (length(x = features) / nfeatures < 0.1 & verbose) { warning("More than 10% of provided features filtered out. Please check that the given features are present in the scale.data slot for both the assays provided here and that they have non-zero variance.") } if (length(x = features) < 50) { warning("Fewer than 50 features used as input for CCA.") } if (verbose) { message("Running CCA") } cca.results <- RunCCA( object1 = data1, object2 = data2, standardize = TRUE, num.cc = num.cc, verbose = verbose, ) if (verbose) { message("Merging objects") } combined.object <- merge( x = object1, y = object2, merge.data = TRUE, ... ) rownames(x = cca.results$ccv) <- Cells(x = combined.object) colnames(x = data1) <- Cells(x = combined.object)[1:ncol(x = data1)] colnames(x = data2) <- Cells(x = combined.object)[(ncol(x = data1) + 1):length(x = Cells(x = combined.object))] combined.object[['cca']] <- CreateDimReducObject( embeddings = cca.results$ccv[colnames(combined.object), ], assay = assay1, key = "CC_" ) combined.object[['cca']]@assay.used <- DefaultAssay(combined.object) if (ncol(combined.object) != (ncol(object1) + ncol(object2))) { warning("Some cells removed after object merge due to minimum feature count cutoff") } combined.scale <- cbind(data1,data2) combined.object <- SetAssayData(object = combined.object, new.data = combined.scale, layer = "scale.data") ## combined.object@assays$ToIntegrate@scale.data <- combined.scale if (renormalize) { combined.object <- NormalizeData( object = combined.object, assay = assay1, normalization.method = object1[[paste0("NormalizeData.", assay1)]]$normalization.method, scale.factor = object1[[paste0("NormalizeData.", assay1)]]$scale.factor ) } if (compute.gene.loadings) { combined.object <- ProjectDim( object = combined.object, reduction = "cca", verbose = FALSE, overwrite = TRUE) } return(combined.object) } #' @param assay Name of Assay ICA is being run on #' @param nics Number of ICs to compute #' @param rev.ica By default, computes the dimensional reduction on the cell x #' feature matrix. Setting to true will compute it on the transpose (feature x cell #' matrix). #' @param ica.function ICA function from ica package to run (options: icafast, #' icaimax, icajade) #' @param verbose Print the top genes associated with high/low loadings for #' the ICs #' @param ndims.print ICs to print genes for #' @param nfeatures.print Number of genes to print for each IC #' @param reduction.key dimensional reduction key, specifies the string before #' the number for the dimension names. #' @param seed.use Set a random seed. Setting NULL will not set a seed. #' @param \dots Additional arguments to be passed to fastica #' #' @importFrom ica icafast icaimax icajade #' #' @rdname RunICA #' @concept dimensional_reduction #' @export #' @method RunICA default #' RunICA.default <- function( object, assay = NULL, nics = 50, rev.ica = FALSE, ica.function = "icafast", verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.name = "ica", reduction.key = "ica_", seed.use = 42, ... ) { CheckDots(..., fxns = ica.function) if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } nics <- min(nics, ncol(x = object)) ica.fxn <- eval(expr = parse(text = ica.function)) if (rev.ica) { ica.results <- ica.fxn(object, nc = nics,...) cell.embeddings <- ica.results$M } else { ica.results <- ica.fxn(t(x = object), nc = nics,...) cell.embeddings <- ica.results$S } feature.loadings <- (as.matrix(x = object ) %*% as.matrix(x = cell.embeddings)) colnames(x = feature.loadings) <- paste0(reduction.key, 1:ncol(x = feature.loadings)) colnames(x = cell.embeddings) <- paste0(reduction.key, 1:ncol(x = cell.embeddings)) reduction.data <- CreateDimReducObject( embeddings = cell.embeddings, loadings = feature.loadings, assay = assay, key = reduction.key ) if (verbose) { print(x = reduction.data, dims = ndims.print, nfeatures = nfeatures.print) } return(reduction.data) } #' @param features Features to compute ICA on #' #' @rdname RunICA #' @concept dimensional_reduction #' @export #' @method RunICA Assay #' RunICA.Assay <- function( object, assay = NULL, features = NULL, nics = 50, rev.ica = FALSE, ica.function = "icafast", verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.name = "ica", reduction.key = "ica_", seed.use = 42, ... ) { data.use <- PrepDR( object = object, features = features, verbose = verbose ) reduction.data <- RunICA( object = data.use, assay = assay, nics = nics, rev.ica = rev.ica, ica.function = ica.function, verbose = verbose, ndims.print = ndims.print, nfeatures.print = nfeatures.print, reduction.key = reduction.key, seed.use = seed.use, ... ) return(reduction.data) } #' @param layer The layer in `assay` to use when running independant component #' analysis. #' #' @rdname RunICA #' @concept dimensional_reduction #' @export #' @method RunICA StdAssay #' RunICA.StdAssay <- function( object, assay = NULL, features = NULL, layer = 'scale.data', nics = 50, rev.ica = FALSE, ica.function = "icafast", verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.name = "ica", reduction.key = "ica_", seed.use = 42, ... ) { data.use <- PrepDR5( object = object, features = features, layer = layer, verbose = verbose ) reduction.data <- RunICA( object = data.use, assay = assay, nics = nics, rev.ica = rev.ica, ica.function = ica.function, verbose = verbose, ndims.print = ndims.print, nfeatures.print = nfeatures.print, reduction.key = reduction.key, seed.use = seed.use, ... ) return(reduction.data) } #' @param reduction.name dimensional reduction name #' #' @rdname RunICA #' @concept dimensional_reduction #' @method RunICA Seurat #' @export #' RunICA.Seurat <- function( object, assay = NULL, features = NULL, nics = 50, rev.ica = FALSE, ica.function = "icafast", verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.name = "ica", reduction.key = "IC_", seed.use = 42, ... ) { assay <- assay %||% DefaultAssay(object = object) reduction.data <- RunICA( object = object[[assay]], assay = assay, features = features, nics = nics, rev.ica = rev.ica, ica.function = ica.function, verbose = verbose, ndims.print = ndims.print, nfeatures.print = nfeatures.print, reduction.key = reduction.key, seed.use = seed.use, ... ) object[[reduction.name]] <- reduction.data object <- LogSeuratCommand(object = object) return(object) } #' @param assay Name of Assay PCA is being run on #' @param npcs Total Number of PCs to compute and store (50 by default) #' @param rev.pca By default computes the PCA on the cell x gene matrix. Setting #' to true will compute it on gene x cell matrix. #' @param weight.by.var Weight the cell embeddings by the variance of each PC #' (weights the gene loadings if rev.pca is TRUE) #' @param verbose Print the top genes associated with high/low loadings for #' the PCs #' @param ndims.print PCs to print genes for #' @param nfeatures.print Number of genes to print for each PC #' @param reduction.key dimensional reduction key, specifies the string before #' the number for the dimension names. PC by default #' @param seed.use Set a random seed. By default, sets the seed to 42. Setting #' NULL will not set a seed. #' @param approx Use truncated singular value decomposition to approximate PCA #' #' @importFrom irlba irlba #' @importFrom stats prcomp #' @importFrom utils capture.output #' #' @rdname RunPCA #' @concept dimensional_reduction #' @export #' RunPCA.default <- function( object, assay = NULL, npcs = 50, rev.pca = FALSE, weight.by.var = TRUE, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "PC_", seed.use = 42, approx = TRUE, ... ) { if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } if (inherits(x = object, what = 'matrix')) { RowVar.function <- RowVar svd.function <- irlba } else if (inherits(x = object, what = 'dgCMatrix')) { RowVar.function <- RowVarSparse svd.function <- irlba } else if (inherits(x = object, what = 'IterableMatrix')) { RowVar.function <- function(x) { return(BPCells::matrix_stats( matrix = x, row_stats = 'variance' )$row_stats['variance',]) } svd.function <- function(A, nv, ...) BPCells::svds(A=A, k = nv) } if (rev.pca) { npcs <- min(npcs, ncol(x = object) - 1) pca.results <- svd.function(A = object, nv = npcs, ...) total.variance <- sum(RowVar.function(x = t(x = object))) sdev <- pca.results$d/sqrt(max(1, nrow(x = object) - 1)) if (weight.by.var) { feature.loadings <- pca.results$u %*% diag(pca.results$d) } else{ feature.loadings <- pca.results$u } cell.embeddings <- pca.results$v } else { total.variance <- sum(RowVar.function(x = object)) if (approx) { npcs <- min(npcs, nrow(x = object) - 1) pca.results <- svd.function(A = t(x = object), nv = npcs, ...) feature.loadings <- pca.results$v sdev <- pca.results$d/sqrt(max(1, ncol(object) - 1)) if (weight.by.var) { cell.embeddings <- pca.results$u %*% diag(pca.results$d) } else { cell.embeddings <- pca.results$u } } else { npcs <- min(npcs, nrow(x = object)) pca.results <- prcomp(x = t(object), rank. = npcs, ...) feature.loadings <- pca.results$rotation sdev <- pca.results$sdev if (weight.by.var) { cell.embeddings <- pca.results$x } else { cell.embeddings <- pca.results$x / (pca.results$sdev[1:npcs] * sqrt(x = ncol(x = object) - 1)) } } } rownames(x = feature.loadings) <- rownames(x = object) colnames(x = feature.loadings) <- paste0(reduction.key, 1:npcs) rownames(x = cell.embeddings) <- colnames(x = object) colnames(x = cell.embeddings) <- colnames(x = feature.loadings) reduction.data <- CreateDimReducObject( embeddings = cell.embeddings, loadings = feature.loadings, assay = assay, stdev = sdev, key = reduction.key, misc = list(total.variance = total.variance) ) if (verbose) { msg <- capture.output(print( x = reduction.data, dims = ndims.print, nfeatures = nfeatures.print )) message(paste(msg, collapse = '\n')) } return(reduction.data) } #' @param features Features to compute PCA on. If features=NULL, PCA will be run #' using the variable features for the Assay. Note that the features must be present #' in the scaled data. Any requested features that are not scaled or have 0 variance #' will be dropped, and the PCA will be run using the remaining features. #' #' @rdname RunPCA #' @concept dimensional_reduction #' @export #' @method RunPCA Assay #' RunPCA.Assay <- function( object, assay = NULL, features = NULL, npcs = 50, rev.pca = FALSE, weight.by.var = TRUE, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "PC_", seed.use = 42, ... ) { data.use <- PrepDR( object = object, features = features, verbose = verbose ) reduction.data <- RunPCA( object = data.use, assay = assay, npcs = npcs, rev.pca = rev.pca, weight.by.var = weight.by.var, verbose = verbose, ndims.print = ndims.print, nfeatures.print = nfeatures.print, reduction.key = reduction.key, seed.use = seed.use, ... ) return(reduction.data) } #' @method RunPCA StdAssay #' @export #' RunPCA.StdAssay <- function( object, assay = NULL, features = NULL, layer = 'scale.data', npcs = 50, rev.pca = FALSE, weight.by.var = TRUE, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "PC_", seed.use = 42, ... ) { data.use <- PrepDR5( object = object, features = features, layer = layer, verbose = verbose ) return(RunPCA( object = data.use, assay = assay, npcs = npcs, rev.pca = rev.pca, weight.by.var = weight.by.var, verbose = verbose, ndims.print = ndims.print, nfeatures.print = nfeatures.print, reduction.key = reduction.key, seed.use = seed.use, ... )) } #' @param reduction.name dimensional reduction name, pca by default #' #' @rdname RunPCA #' @concept dimensional_reduction #' @export #' @method RunPCA Seurat #' RunPCA.Seurat <- function( object, assay = NULL, features = NULL, npcs = 50, rev.pca = FALSE, weight.by.var = TRUE, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.name = "pca", reduction.key = "PC_", seed.use = 42, ... ) { assay <- assay %||% DefaultAssay(object = object) reduction.data <- RunPCA( object = object[[assay]], assay = assay, features = features, npcs = npcs, rev.pca = rev.pca, weight.by.var = weight.by.var, verbose = verbose, ndims.print = ndims.print, nfeatures.print = nfeatures.print, reduction.key = reduction.key, seed.use = seed.use, ... ) object[[reduction.name]] <- reduction.data object <- LogSeuratCommand(object = object) return(object) } #' @method RunPCA Seurat5 #' @export #' RunPCA.Seurat5 <- function( object, assay = NULL, features = NULL, npcs = 50, rev.pca = FALSE, weight.by.var = TRUE, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.name = "pca", reduction.key = "PC_", seed.use = 42, ... ) { assay <- assay %||% DefaultAssay(object = object) reduction.data <- RunPCA( object = object[[assay]], assay = assay, features = features, npcs = npcs, rev.pca = rev.pca, weight.by.var = weight.by.var, verbose = verbose, ndims.print = ndims.print, nfeatures.print = nfeatures.print, reduction.key = reduction.key, seed.use = seed.use, ... ) object[[reduction.name]] <- reduction.data # object <- LogSeuratCommand(object = object) return(object) } #' @param assay Name of assay that that t-SNE is being run on #' @param seed.use Random seed for the t-SNE. If NULL, does not set the seed #' @param tsne.method Select the method to use to compute the tSNE. Available #' methods are: #' \itemize{ #' \item \dQuote{\code{Rtsne}}: Use the Rtsne package Barnes-Hut #' implementation of tSNE (default) #' \item \dQuote{\code{FIt-SNE}}: Use the FFT-accelerated Interpolation-based #' t-SNE. Based on Kluger Lab code found here: #' \url{https://github.com/KlugerLab/FIt-SNE} #' } #' @param dim.embed The dimensional space of the resulting tSNE embedding #' (default is 2). For example, set to 3 for a 3d tSNE #' @param reduction.key dimensional reduction key, specifies the string before #' the number for the dimension names. \dQuote{\code{tSNE_}} by default #' #' @importFrom Rtsne Rtsne #' #' @rdname RunTSNE #' @concept dimensional_reduction #' @export #' @method RunTSNE matrix #' RunTSNE.matrix <- function( object, assay = NULL, seed.use = 1, tsne.method = "Rtsne", dim.embed = 2, reduction.key = "tSNE_", ... ) { if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } tsne.data <- switch( EXPR = tsne.method, 'Rtsne' = Rtsne( X = object, dims = dim.embed, pca = FALSE, ... # PCA/is_distance )$Y, 'FIt-SNE' = fftRtsne(X = object, dims = dim.embed, rand_seed = seed.use, ...), stop("Invalid tSNE method: please choose from 'Rtsne' or 'FIt-SNE'") ) colnames(x = tsne.data) <- paste0(reduction.key, 1:ncol(x = tsne.data)) rownames(x = tsne.data) <- rownames(x = object) tsne.reduction <- CreateDimReducObject( embeddings = tsne.data, key = reduction.key, assay = assay, global = TRUE ) return(tsne.reduction) } #' @param cells Which cells to analyze (default, all cells) #' @param dims Which dimensions to use as input features #' #' @rdname RunTSNE #' @concept dimensional_reduction #' @export #' @method RunTSNE DimReduc #' RunTSNE.DimReduc <- function( object, cells = NULL, dims = 1:5, seed.use = 1, tsne.method = "Rtsne", dim.embed = 2, reduction.key = "tSNE_", ... ) { args <- as.list(x = sys.frame(which = sys.nframe())) args <- c(args, list(...)) args$object <- args$object[[cells, args$dims]] args$dims <- NULL args$cells <- NULL args$assay <- DefaultAssay(object = object) return(do.call(what = 'RunTSNE', args = args)) } #' @rdname RunTSNE #' @concept dimensional_reduction #' @export #' @method RunTSNE dist #' RunTSNE.dist <- function( object, assay = NULL, seed.use = 1, tsne.method = "Rtsne", dim.embed = 2, reduction.key = "tSNE_", ... ) { args <- as.list(x = sys.frame(which = sys.nframe())) args <- c(args, list(...)) args$object <- as.matrix(x = args$object) args$is_distance <- TRUE return(do.call(what = 'RunTSNE', args = args)) } #' @param reduction Which dimensional reduction (e.g. PCA, ICA) to use for #' the tSNE. Default is PCA #' @param features If set, run the tSNE on this subset of features #' (instead of running on a set of reduced dimensions). Not set (NULL) by default; #' \code{dims} must be NULL to run on features #' @param distance.matrix If set, runs tSNE on the given distance matrix #' instead of data matrix (experimental) #' @param reduction.name dimensional reduction name, specifies the position in the object$dr list. tsne by default #' #' @rdname RunTSNE #' @concept dimensional_reduction #' @export #' @method RunTSNE Seurat #' RunTSNE.Seurat <- function( object, reduction = "pca", cells = NULL, dims = 1:5, features = NULL, seed.use = 1, tsne.method = "Rtsne", dim.embed = 2, distance.matrix = NULL, reduction.name = "tsne", reduction.key = "tSNE_", ... ) { cells <- cells %||% Cells(x = object) tsne.reduction <- if (!is.null(x = distance.matrix)) { RunTSNE( object = distance.matrix, assay = DefaultAssay(object = object), seed.use = seed.use, tsne.method = tsne.method, dim.embed = dim.embed, reduction.key = reduction.key, is_distance = TRUE, ... ) } else if (!is.null(x = dims)) { RunTSNE( object = object[[reduction]], cells = cells, dims = dims, seed.use = seed.use, tsne.method = tsne.method, dim.embed = dim.embed, reduction.key = reduction.key, ... ) } else if (!is.null(x = features)) { RunTSNE( object = t(x = as.matrix(x = GetAssayData(object = object)[features, cells])), assay = DefaultAssay(object = object), seed.use = seed.use, tsne.method = tsne.method, dim.embed = dim.embed, reduction.key = reduction.key, ... ) } else { stop("Unknown way of running tSNE") } object[[reduction.name]] <- tsne.reduction object <- LogSeuratCommand(object = object) return(object) } #' @importFrom reticulate py_module_available py_set_seed import #' @importFrom uwot umap umap2 umap_transform #' @importFrom future nbrOfWorkers #' #' @rdname RunUMAP #' @concept dimensional_reduction #' @method RunUMAP default #' @export #' RunUMAP.default <- function( object, reduction.key = 'UMAP_', assay = NULL, reduction.model = NULL, return.model = FALSE, umap.method = 'uwot', n.neighbors = 30L, n.components = 2L, metric = 'cosine', n.epochs = NULL, learning.rate = 1.0, min.dist = 0.3, spread = 1.0, set.op.mix.ratio = 1.0, local.connectivity = 1L, repulsion.strength = 1, negative.sample.rate = 5, a = NULL, b = NULL, uwot.sgd = FALSE, uwot.approx_pow = FALSE, seed.use = 42, metric.kwds = NULL, angular.rp.forest = FALSE, densmap = FALSE, dens.lambda = 2, dens.frac = 0.3, dens.var.shift = 0.1, verbose = TRUE, ... ) { CheckDots(...) if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } if (umap.method != 'umap-learn' && getOption('Seurat.warn.umap.uwot', TRUE)) { warning( "The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric", "\nTo use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'", "\nThis message will be shown once per session", call. = FALSE, immediate. = TRUE ) options(Seurat.warn.umap.uwot = FALSE) } if (umap.method == 'uwot-learn') { warning("'uwot-learn' is deprecated. Set umap.method = 'uwot' and return.model = TRUE") umap.method <- "uwot" return.model <- TRUE } if (densmap && umap.method != 'umap-learn'){ warning("densmap is only supported by umap-learn method. Method is changed to 'umap-learn'") umap.method <- 'umap-learn' } if (return.model) { if (verbose) { message("UMAP will return its model") } umap.method = "uwot" } if (inherits(x = object, what = "Neighbor")) { object <- list( idx = Indices(object), dist = Distances(object) ) } if (!is.null(x = reduction.model)) { if (verbose) { message("Running UMAP projection") } umap.method <- "uwot-predict" } umap.output <- switch( EXPR = umap.method, 'umap-learn' = { if (!py_module_available(module = 'umap')) { stop("Cannot find UMAP, please install through pip (e.g. pip install umap-learn).") } if (!py_module_available(module = 'sklearn')) { stop("Cannot find sklearn, please install through pip (e.g. pip install scikit-learn).") } if (!is.null(x = seed.use)) { py_set_seed(seed = seed.use) } if (typeof(x = n.epochs) == "double") { n.epochs <- as.integer(x = n.epochs) } umap_import <- import(module = "umap", delay_load = TRUE) sklearn <- import("sklearn", delay_load = TRUE) if (densmap && numeric_version(x = umap_import$`__version__`) < numeric_version(x = "0.5.0")) { stop("densmap is only supported by versions >= 0.5.0 of umap-learn. Upgrade umap-learn (e.g. pip install --upgrade umap-learn).") } random.state <- sklearn$utils$check_random_state(seed = as.integer(x = seed.use)) umap.args <- list( n_neighbors = as.integer(x = n.neighbors), n_components = as.integer(x = n.components), metric = metric, n_epochs = n.epochs, learning_rate = learning.rate, min_dist = min.dist, spread = spread, set_op_mix_ratio = set.op.mix.ratio, local_connectivity = local.connectivity, repulsion_strength = repulsion.strength, negative_sample_rate = negative.sample.rate, random_state = random.state, a = a, b = b, metric_kwds = metric.kwds, angular_rp_forest = angular.rp.forest, verbose = verbose ) if (numeric_version(x = umap_import$`__version__`) >= numeric_version(x = "0.5.0")) { umap.args <- c(umap.args, list( densmap = densmap, dens_lambda = dens.lambda, dens_frac = dens.frac, dens_var_shift = dens.var.shift, output_dens = FALSE )) } umap <- do.call(what = umap_import$UMAP, args = umap.args) umap$fit_transform(as.matrix(x = object)) }, 'uwot' = { if (is.list(x = object)) { umap( X = NULL, nn_method = object, n_threads = nbrOfWorkers(), n_components = as.integer(x = n.components), metric = metric, n_epochs = n.epochs, learning_rate = learning.rate, min_dist = min.dist, spread = spread, set_op_mix_ratio = set.op.mix.ratio, local_connectivity = local.connectivity, repulsion_strength = repulsion.strength, negative_sample_rate = negative.sample.rate, a = a, b = b, fast_sgd = uwot.sgd, approx_pow = uwot.approx_pow, verbose = verbose, ret_model = return.model ) } else { umap( X = object, n_threads = nbrOfWorkers(), n_neighbors = as.integer(x = n.neighbors), n_components = as.integer(x = n.components), metric = metric, n_epochs = n.epochs, learning_rate = learning.rate, min_dist = min.dist, spread = spread, set_op_mix_ratio = set.op.mix.ratio, local_connectivity = local.connectivity, repulsion_strength = repulsion.strength, negative_sample_rate = negative.sample.rate, a = a, b = b, fast_sgd = uwot.sgd, approx_pow = uwot.approx_pow, verbose = verbose, ret_model = return.model ) } }, 'uwot2' = { if (is.list(x = object)) { umap2( X = NULL, nn_method = object, n_threads = nbrOfWorkers(), n_components = as.integer(x = n.components), metric = metric, n_epochs = n.epochs, learning_rate = learning.rate, min_dist = min.dist, spread = spread, set_op_mix_ratio = set.op.mix.ratio, local_connectivity = local.connectivity, repulsion_strength = repulsion.strength, negative_sample_rate = negative.sample.rate, a = a, b = b, fast_sgd = uwot.sgd, verbose = verbose, ret_model = return.model ) } else { umap2( X = object, n_threads = nbrOfWorkers(), n_neighbors = as.integer(x = n.neighbors), n_components = as.integer(x = n.components), metric = metric, n_epochs = n.epochs, learning_rate = learning.rate, min_dist = min.dist, spread = spread, set_op_mix_ratio = set.op.mix.ratio, local_connectivity = local.connectivity, repulsion_strength = repulsion.strength, negative_sample_rate = negative.sample.rate, a = a, b = b, fast_sgd = uwot.sgd, verbose = verbose, ret_model = return.model ) } }, 'uwot-predict' = { if (is.null(x = reduction.model) || !inherits(x = reduction.model, what = 'DimReduc')) { stop( "If running projection UMAP, please pass a DimReduc object with the model stored to reduction.model.", call. = FALSE ) } model <- Misc( object = reduction.model, slot = "model" ) # add num_precomputed_nns to = numeric_version(x = "0.5.0")) { umap.args <- c(umap.args, list( densmap = densmap, densmap_kwds = densmap.kwds, output_dens = FALSE )) } embeddings <- do.call(what = umap$umap_$simplicial_set_embedding, args = umap.args) if (length(x = embeddings) == 2) { embeddings <- embeddings[[1]] } rownames(x = embeddings) <- colnames(x = data) colnames(x = embeddings) <- paste0("UMAP_", 1:n.components) # center the embeddings on zero embeddings <- scale(x = embeddings, scale = FALSE) umap <- CreateDimReducObject( embeddings = embeddings, key = reduction.key, assay = assay, global = TRUE ) return(umap) } #' @rdname RunUMAP #' @concept dimensional_reduction #' @method RunUMAP Neighbor #' @export #' RunUMAP.Neighbor <- function( object, reduction.model, ... ) { neighborlist <- list("idx" = Indices(object), "dist" = Distances(object)) RunUMAP( object = neighborlist, reduction.model = reduction.model, ... ) } #' @param reduction.model \code{DimReduc} object that contains the umap model #' @param dims Which dimensions to use as input features, used only if #' \code{features} is NULL #' @param reduction Which dimensional reduction (PCA or ICA) to use for the #' UMAP input. Default is PCA #' @param features If set, run UMAP on this subset of features (instead of running on a #' set of reduced dimensions). Not set (NULL) by default; \code{dims} must be NULL to run #' on features #' @param graph Name of graph on which to run UMAP #' @param assay Assay to pull data for when using \code{features}, or assay used to construct Graph #' if running UMAP on a Graph #' @param nn.name Name of knn output on which to run UMAP #' @param slot The slot used to pull data for when using \code{features}. data slot is by default. #' @param umap.method UMAP implementation to run. Can be #' \describe{ #' \item{\code{uwot}:}{Runs umap via the uwot R package \code{\link[uwot]{umap}}} #' \item{\code{uwot2}:}{Runs umap2 via the uwot R package \code{\link[uwot]{umap2}}} #' \item{\code{umap-learn}:}{Run the Seurat wrapper of the python umap-learn package} #' } #' @param n.neighbors This determines the number of neighboring points used in #' local approximations of manifold structure. Larger values will result in more #' global structure being preserved at the loss of detailed local structure. In #' general this parameter should often be in the range 5 to 50. #' @param n.components The dimension of the space to embed into. #' @param metric metric: This determines the choice of metric used to measure #' distance in the input space. A wide variety of metrics are already coded, and #' a user defined function can be passed as long as it has been JITd by numba. #' @param n.epochs he number of training epochs to be used in optimizing the low dimensional #' embedding. Larger values result in more accurate embeddings. If NULL is specified, a value will #' be selected based on the size of the input dataset (200 for large datasets, 500 for small). #' @param learning.rate The initial learning rate for the embedding optimization. #' @param min.dist This controls how tightly the embedding is allowed compress points together. #' Larger values ensure embedded points are more evenly distributed, while smaller values allow the #' algorithm to optimize more accurately with regard to local structure. Sensible values are in #' the range 0.001 to 0.5. #' @param spread The effective scale of embedded points. In combination with min.dist this #' determines how clustered/clumped the embedded points are. #' @param set.op.mix.ratio Interpolate between (fuzzy) union and intersection as the set operation #' used to combine local fuzzy simplicial sets to obtain a global fuzzy simplicial sets. Both fuzzy #' set operations use the product t-norm. The value of this parameter should be between 0.0 and #' 1.0; a value of 1.0 will use a pure fuzzy union, while 0.0 will use a pure fuzzy intersection. #' @param local.connectivity The local connectivity required - i.e. the number of nearest neighbors #' that should be assumed to be connected at a local level. The higher this value the more connected #' the manifold becomes locally. In practice this should be not more than the local intrinsic #' dimension of the manifold. #' @param repulsion.strength Weighting applied to negative samples in low dimensional embedding #' optimization. Values higher than one will result in greater weight being given to negative #' samples. #' @param negative.sample.rate The number of negative samples to select per positive sample in the #' optimization process. Increasing this value will result in greater repulsive force being applied, #' greater optimization cost, but slightly more accuracy. #' @param a More specific parameters controlling the embedding. If NULL, these values are set #' automatically as determined by min. dist and spread. Parameter of differentiable approximation of #' right adjoint functor. #' @param b More specific parameters controlling the embedding. If NULL, these values are set #' automatically as determined by min. dist and spread. Parameter of differentiable approximation of #' right adjoint functor. #' @param uwot.sgd Set \code{uwot::umap(fast_sgd = TRUE)}; see \code{\link[uwot]{umap}} for more details #' @param uwot.approx_pow Set \code{uwot::umap(approx_pow = TRUE)}. Default is \code{FALSE}. See #' \code{\link[uwot]{umap}} for more details. #' @param metric.kwds A dictionary of arguments to pass on to the metric, such as the p value for #' Minkowski distance. If NULL then no arguments are passed on. #' @param angular.rp.forest Whether to use an angular random projection forest to initialize the #' approximate nearest neighbor search. This can be faster, but is mostly on useful for metric that #' use an angular style distance such as cosine, correlation etc. In the case of those metrics #' angular forests will be chosen automatically. #' @param densmap Whether to use the density-augmented objective of densMAP. #' Turning on this option generates an embedding where the local densities #' are encouraged to be correlated with those in the original space. #' Parameters below with the prefix ‘dens’ further control the behavior #' of this extension. Default is FALSE. Only compatible with 'umap-learn' method #' and version of umap-learn >= 0.5.0 #' @param densmap.kwds A dictionary of arguments to pass on to the densMAP optimization. #' @param dens.lambda Specific parameter which controls the regularization weight #' of the density correlation term in densMAP. Higher values prioritize density #' preservation over the UMAP objective, and vice versa for values closer to zero. #' Setting this parameter to zero is equivalent to running the original UMAP algorithm. #' Default value is 2. #' @param dens.frac Specific parameter which controls the fraction of epochs #' (between 0 and 1) where the density-augmented objective is used in densMAP. #' The first (1 - dens_frac) fraction of epochs optimize the original UMAP #' objective before introducing the density correlation term. Default is 0.3. #' @param dens.var.shift Specific parameter which specifies a small constant #' added to the variance of local radii in the embedding when calculating #' the density correlation objective to prevent numerical instability from #' dividing by a small number. Default is 0.1. #' @param reduction.name Name to store dimensional reduction under in the Seurat object #' @param reduction.key dimensional reduction key, specifies the string before #' the number for the dimension names. UMAP by default #' @param return.model whether UMAP will return the uwot model #' @param seed.use Set a random seed. By default, sets the seed to 42. Setting #' NULL will not set a seed #' @param verbose Controls verbosity #' #' @rdname RunUMAP #' @concept dimensional_reduction #' @export #' @method RunUMAP Seurat #' RunUMAP.Seurat <- function( object, dims = NULL, reduction = 'pca', features = NULL, graph = NULL, assay = DefaultAssay(object = object), nn.name = NULL, slot = 'data', umap.method = 'uwot', reduction.model = NULL, return.model = FALSE, n.neighbors = 30L, n.components = 2L, metric = 'cosine', n.epochs = NULL, learning.rate = 1, min.dist = 0.3, spread = 1, set.op.mix.ratio = 1, local.connectivity = 1L, repulsion.strength = 1, negative.sample.rate = 5L, a = NULL, b = NULL, uwot.sgd = FALSE, uwot.approx_pow = FALSE, seed.use = 42L, metric.kwds = NULL, angular.rp.forest = FALSE, densmap = FALSE, dens.lambda = 2, dens.frac = 0.3, dens.var.shift = 0.1, verbose = TRUE, reduction.name = 'umap', reduction.key = NULL, ... ) { CheckDots(...) if (sum(c(is.null(x = dims), is.null(x = features), is.null(x = graph))) < 2) { stop("Please specify only one of the following arguments: dims, features, or graph") } if (sum(!is.null(x = dims), !is.null(x = nn.name), !is.null(x = graph), !is.null(x = features)) != 1) { stop("Only one parameter among 'dims', 'nn.name', 'graph', or 'features' ", "should be used at a time to run UMAP") } if (!is.null(x = features)) { data.use <- as.matrix(x = t(x = GetAssayData(object = object, layer = slot, assay = assay)[features, , drop = FALSE])) if (ncol(x = data.use) < n.components) { stop( "Please provide as many or more features than n.components: ", length(x = features), " features provided, ", n.components, " UMAP components requested", call. = FALSE ) } } else if (!is.null(x = dims)) { data.use <- Embeddings(object[[reduction]])[, dims] assay <- DefaultAssay(object = object[[reduction]]) if (length(x = dims) < n.components) { stop( "Please provide as many or more dims than n.components: ", length(x = dims), " dims provided, ", n.components, " UMAP components requested", call. = FALSE ) } } else if (!is.null(x = nn.name)) { if (!inherits(x = object[[nn.name]], what = "Neighbor")) { stop( "Please specify a Neighbor object name, ", "instead of the name of a ", class(object[[nn.name]]), " object", call. = FALSE ) } data.use <- object[[nn.name]] } else if (!is.null(x = graph)) { if (!inherits(x = object[[graph]], what = "Graph")) { stop( "Please specify a Graph object name, ", "instead of the name of a ", class(object[[graph]]), " object", call. = FALSE ) } data.use <- object[[graph]] } else { stop("Please specify one of dims, features, or graph") } object[[reduction.name]] <- RunUMAP( object = data.use, reduction.model = reduction.model, return.model = return.model, assay = assay, umap.method = umap.method, n.neighbors = n.neighbors, n.components = n.components, metric = metric, n.epochs = n.epochs, learning.rate = learning.rate, min.dist = min.dist, spread = spread, set.op.mix.ratio = set.op.mix.ratio, local.connectivity = local.connectivity, repulsion.strength = repulsion.strength, negative.sample.rate = negative.sample.rate, a = a, b = b, uwot.sgd = uwot.sgd, uwot.approx_pow = uwot.approx_pow, seed.use = seed.use, metric.kwds = metric.kwds, angular.rp.forest = angular.rp.forest, densmap = densmap, dens.lambda = dens.lambda, dens.frac = dens.frac, dens.var.shift = dens.var.shift, reduction.key = reduction.key %||% Key(object = reduction.name, quiet = TRUE), verbose = verbose ) object <- LogSeuratCommand(object = object) return(object) } #' @param dims Which dimensions to examine #' @param score.thresh Threshold to use for the proportion test of PC #' significance (see Details) #' #' @importFrom stats prop.test #' #' @rdname ScoreJackStraw #' @concept dimensional_reduction #' @export #' @method ScoreJackStraw JackStrawData #' ScoreJackStraw.JackStrawData <- function( object, dims = 1:5, score.thresh = 1e-5, ... ) { CheckDots(...) pAll <- JS(object = object, slot = "empirical.p.values") pAll <- pAll[, dims, drop = FALSE] pAll <- as.data.frame(pAll) pAll$Contig <- rownames(x = pAll) score.df <- NULL for (i in dims) { pc.score <- suppressWarnings(prop.test( x = c( length(x = which(x = pAll[, i] <= score.thresh)), floor(x = nrow(x = pAll) * score.thresh) ), n = c(nrow(pAll), nrow(pAll)) )$p.val) if (length(x = which(x = pAll[, i] <= score.thresh)) == 0) { pc.score <- 1 } if (is.null(x = score.df)) { score.df <- data.frame(PC = paste0("PC", i), Score = pc.score) } else { score.df <- rbind(score.df, data.frame(PC = paste0("PC", i), Score = pc.score)) } } score.df$PC <- dims score.df <- as.matrix(score.df) JS(object = object, slot = 'overall') <- score.df return(object) } #' @rdname ScoreJackStraw #' @concept dimensional_reduction #' @export #' @method ScoreJackStraw DimReduc #' ScoreJackStraw.DimReduc <- function(object, dims = 1:5, score.thresh = 1e-5, ...) { JS(object = object) <- ScoreJackStraw( object = JS(object = object), dims = dims, score.thresh = score.thresh, ... ) return(object) } #' @param reduction Reduction associated with JackStraw to score #' @param do.plot Show plot. To return ggplot object, use \code{JackStrawPlot} after #' running ScoreJackStraw. #' #' @seealso \code{\link{JackStrawPlot}} #' #' @rdname ScoreJackStraw #' @concept dimensional_reduction #' @export #' @method ScoreJackStraw Seurat #' ScoreJackStraw.Seurat <- function( object, reduction = "pca", dims = 1:5, score.thresh = 1e-5, do.plot = FALSE, ... ) { object[[reduction]] <- ScoreJackStraw( object = object[[reduction]], dims = dims, score.thresh = score.thresh, ... ) if (do.plot) { CheckDots(..., fxns = 'JackStrawPlot') suppressWarnings(expr = print(JackStrawPlot( object = object, reduction = reduction, dims = dims, ... ))) } object <- LogSeuratCommand(object = object) return(object) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for R-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Check that features are present and have non-zero variance # # @param data.use Feature matrix (features are rows) # @param features Features to check # @param object.name Name of object for message printing # @param verbose Print warnings # # @return Returns a vector of features that is the subset of features # that have non-zero variance # CheckFeatures <- function( data.use, features, object.name, verbose = TRUE ) { if (any(!features %in% rownames(x = data.use))) { missing.features <- features[!features %in% rownames(x = data.use)] features <- setdiff(x = features, y = missing.features) if (verbose){ warning( paste0( "The following ", length(x = missing.features), " features are not scaled in ", object.name, ": ", paste0(missing.features, collapse = ", ") )) } } if (inherits(x = data.use, what = 'dgCMatrix')) { features.var <- SparseRowVar(mat = data.use[features, ], display_progress = F) } else if (inherits(x = data.use, what = "IterableMatrix")) { bp.stats <- BPCells::matrix_stats(matrix = data.use, row_stats = "variance") features.var <- bp.stats$row_stats["variance",][features] } else { features.var <- RowVar(x = data.use[features, ]) } no.var.features <- features[features.var == 0] if (length(x = no.var.features) > 0 && verbose) { warning( paste0( "The following features have zero variance in ", object.name, ": ", paste0(no.var.features, collapse = ", ") )) } features <- setdiff(x = features, y = no.var.features) features <- features[!is.na(x = features)] return(features) } #internal EmpiricalP <- function(x, nullval) { return(sum(nullval > x) / length(x = nullval)) } # FIt-SNE helper function for calling fast_tsne from R # # Based on Kluger Lab FIt-SNE v1.2.1 code on https://github.com/KlugerLab/FIt-SNE/blob/master/fast_tsne.R # commit 601608ed42e4be2765970910927da20f0b0bf9b9 on June 25, 2020 # #' @importFrom utils file_test # fftRtsne <- function(X, dims = 2, perplexity = 30, theta = 0.5, max_iter = 750, fft_not_bh = TRUE, ann_not_vptree = TRUE, stop_early_exag_iter = 250, exaggeration_factor = 12.0, no_momentum_during_exag = FALSE, start_late_exag_iter = -1, late_exag_coeff = 1.0, mom_switch_iter = 250, momentum = 0.5, final_momentum = 0.8, learning_rate = 'auto', n_trees = 50, search_k = -1, rand_seed = -1, nterms = 3, intervals_per_integer = 1, min_num_intervals = 50, K = -1, sigma = -30, initialization = 'pca', max_step_norm = 5, data_path = NULL, result_path = NULL, load_affinities = NULL, fast_tsne_path = NULL, nthreads = getOption('mc.cores', default = 1), perplexity_list = NULL, get_costs = FALSE, df = 1.0, ... ) { CheckDots(...) if (is.null(x = data_path)) { data_path <- tempfile(pattern = 'fftRtsne_data_', fileext = '.dat') } if (is.null(x = result_path)) { result_path <- tempfile(pattern = 'fftRtsne_result_', fileext = '.dat') } if (is.null(x = fast_tsne_path)) { # suppressWarnings(expr = fast_tsne_path <- system2(command = 'which', args = 'fast_tsne', stdout = TRUE)) fast_tsne_path <- SysExec(progs = ifelse( test = .Platform$OS.type == 'windows', yes = 'FItSNE.exe', no = 'fast_tsne' )) if (length(x = fast_tsne_path) == 0) { stop("no fast_tsne_path specified and fast_tsne binary is not in the search path") } } fast_tsne_path <- normalizePath(path = fast_tsne_path) if (!file_test(op = '-x', x = fast_tsne_path)) { stop("fast_tsne_path '", fast_tsne_path, "' does not exist or is not executable") } # check fast_tsne version ft.out <- suppressWarnings(expr = system2(command = fast_tsne_path, stdout = TRUE)) version_number <- regmatches(ft.out[1], regexpr('= t-SNE v[0-9.]+', ft.out[1])) if (is.null(version_number)){ message("First line of fast_tsne output is") message(ft.out[1]) stop("Our FIt-SNE wrapper requires FIt-SNE v1.0+, please install the appropriate version from github.com/KlugerLab/FIt-SNE and have fast_tsne_path point to it if it's not in your path") } else { version_number <- gsub('= t-SNE v', '', version_number) } is.wholenumber <- function(x, tol = .Machine$double.eps ^ 0.5) { return(abs(x = x - round(x = x)) < tol) } if (version_number == '1.0.0' && df != 1.0) { stop("This version of FIt-SNE does not support df!=1. Please install the appropriate version from github.com/KlugerLab/FIt-SNE") } if (!is.numeric(x = theta) || (theta < 0.0) || (theta > 1.0) ) { stop("Incorrect theta.") } if (nrow(x = X) - 1 < 3 * perplexity) { stop("Perplexity is too large.") } if (!is.matrix(x = X)) { stop("Input X is not a matrix") } if (!(max_iter > 0)) { stop("Incorrect number of iterations.") } if (!is.wholenumber(x = stop_early_exag_iter) || stop_early_exag_iter < 0) { stop("stop_early_exag_iter should be a positive integer") } if (!is.numeric(x = exaggeration_factor)) { stop("exaggeration_factor should be numeric") } if (!is.numeric(df)) { stop("df should be numeric") } if (!is.wholenumber(x = dims) || dims <= 0) { stop("Incorrect dimensionality.") } if (search_k == -1) { if (perplexity > 0) { search_k <- n_trees * perplexity * 3 } else if (perplexity == 0) { search_k <- n_trees * max(perplexity_list) * 3 } else { search_k <- n_trees * K } } if (is.character(learning_rate) && learning_rate =='auto') { learning_rate = max(200, nrow(X)/exaggeration_factor) } if (is.character(start_late_exag_iter) && start_late_exag_iter =='auto') { if (late_exag_coeff > 0) { start_late_exag_iter = stop_early_exag_iter } else { start_late_exag_iter = -1 } } if (is.character(initialization) && initialization == 'pca') { if (rand_seed != -1) { set.seed(rand_seed) } if (requireNamespace("rsvd", quietly = TRUE)) { message('Using rsvd() to compute the top PCs for initialization.') X_c <- scale(x = X, center = TRUE, scale = FALSE) rsvd_out <- rsvd::rsvd(A = X_c, k = dims) X_top_pcs <- rsvd_out$u %*% diag(x = rsvd_out$d, nrow = dims) } else if (requireNamespace("irlba", quietly = TRUE)) { message('Using irlba() to compute the top PCs for initialization.') X_colmeans <- colMeans(x = X) irlba_out <- irlba::irlba(A = X, nv = dims, center = X_colmeans) X_top_pcs <- irlba_out$u %*% diag(x = irlba_out$d, nrow = dims) } else { stop( "By default, FIt-SNE initializes the embedding with the top PCs. We use either rsvd or irlba for fast computation. To use this functionality, please install the rsvd package with install.packages('rsvd') or the irlba package with install.packages('ilrba'). Otherwise, set initialization to NULL for random initialization, or any N by dims matrix for custom initialization." ) } initialization <- 0.0001*(X_top_pcs/sd(X_top_pcs[,1])) } else if (is.character(x = initialization) && initialization == 'random') { message('Random initialization') initialization = NULL } nbody_algo <- ifelse(test = fft_not_bh, yes = 2, no = 1) if (is.null(load_affinities)) { load_affinities <- 0 } else { if (load_affinities == 'load') { load_affinities <- 1 } else if (load_affinities == 'save') { load_affinities <- 2 } else { load_affinities <- 0 } } knn_algo <- ifelse(test = ann_not_vptree, yes = 1, no = 2) tX <- as.numeric(t(X)) f <- file(description = data_path, open = "wb") n = nrow(x = X) D = ncol(x = X) writeBin(object = as.integer(x = n), con = f, size = 4) writeBin(object = as.integer(x = D), con = f, size = 4) writeBin(object = as.numeric(x = theta), con = f, size = 8) writeBin(object = as.numeric(x = perplexity), con = f, size = 8) if (perplexity == 0) { writeBin(object = as.integer(x = length(x = perplexity_list)), con = f, size = 4) writeBin(object = perplexity_list, con = f) } writeBin(object = as.integer(x = dims), con = f, size = 4) #theta writeBin(object = as.integer(x = max_iter), con = f, size = 4) writeBin(object = as.integer(x = stop_early_exag_iter), con = f, size = 4) writeBin(object = as.integer(x = mom_switch_iter), con = f, size = 4) writeBin(object = as.numeric(x = momentum), con = f, size = 8) writeBin(object = as.numeric(x = final_momentum), con = f, size = 8) writeBin(object = as.numeric(x = learning_rate), con = f, size = 8) if (!(version_number %in% c('1.1.0', '1.0.0'))) { writeBin(object = as.numeric(x = max_step_norm), f, size = 8) } writeBin(object = as.integer(x = K), con = f, size = 4) #K writeBin(object = as.numeric(x = sigma), con = f, size = 8) #sigma writeBin(object = as.integer(x = nbody_algo), con = f, size = 4) #not barnes hut writeBin(object = as.integer(x = knn_algo), con = f, size = 4) writeBin(object = as.numeric(x = exaggeration_factor), con = f, size = 8) #compexag writeBin(object = as.integer(x = no_momentum_during_exag), con = f, size = 4) writeBin(object = as.integer(x = n_trees), con = f, size = 4) writeBin(object = as.integer(x = search_k), con = f, size = 4) writeBin(object = as.integer(x = start_late_exag_iter), con = f, size = 4) writeBin(object = as.numeric(x = late_exag_coeff), con = f, size = 8) writeBin(object = as.integer(x = nterms), con = f, size = 4) writeBin(object = as.numeric(x = intervals_per_integer), con = f, size = 8) writeBin(object = as.integer(x = min_num_intervals), con = f, size = 4) writeBin(object = tX, con = f) writeBin(object = as.integer(x = rand_seed), con = f, size = 4) if (version_number != "1.0.0") { writeBin(object = as.numeric(x = df), con = f, size = 8) } writeBin(object = as.integer(x = load_affinities), con = f, size = 4) if (!is.null(x = initialization)) { writeBin(object = c(t(x = initialization)), con = f) } close(con = f) if (version_number == "1.0.0") { flag <- system2( command = fast_tsne_path, args = c(data_path, result_path, nthreads) ) } else { flag <- system2( command = fast_tsne_path, args = c(version_number, data_path, result_path, nthreads) ) } if (flag != 0) { stop('tsne call failed') } f <- file(description = result_path, open = "rb") n <- readBin(con = f, what = integer(), n = 1, size = 4) d <- readBin(con = f, what = integer(), n = 1, size = 4) Y <- readBin(con = f, what = numeric(), n = n * d) Y <- t(x = matrix(Y, nrow = d)) if (get_costs) { tmp <- readBin(con = f, what = integer(), n = 1, size = 4) costs <- readBin(con = f, what = numeric(), n = max_iter, size = 8) Yout <- list(Y = Y, costs = costs) } else { Yout <- Y } close(con = f) file.remove(data_path) file.remove(result_path) return(Yout) } #internal # JackRandom <- function( scaled.data, prop.use = 0.01, r1.use = 1, r2.use = 5, seed.use = 1, rev.pca = FALSE, weight.by.var = weight.by.var, maxit = 1000 ) { if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } rand.genes <- sample( x = rownames(x = scaled.data), size = nrow(x = scaled.data) * prop.use ) # make sure that rand.genes is at least 3 if (length(x = rand.genes) < 3) { rand.genes <- sample(x = rownames(x = scaled.data), size = 3) } data.mod <- scaled.data data.mod[rand.genes, ] <- MatrixRowShuffle(x = as.matrix(scaled.data[rand.genes, ])) temp.object <- RunPCA( object = data.mod, assay = "temp", npcs = r2.use, features = rownames(x = data.mod), rev.pca = rev.pca, weight.by.var = weight.by.var, verbose = FALSE, maxit = maxit ) return(Loadings(temp.object)[rand.genes, r1.use:r2.use]) } # Calculates the l2-norm of a vector # # Modified from PMA package # @references Witten, Tibshirani, and Hastie, Biostatistics 2009 # @references \url{https://github.com/cran/PMA/blob/master/R/PMD.R} # # @param vec numeric vector # # @return returns the l2-norm. # L2Norm <- function(vec) { a <- sqrt(x = sum(vec ^ 2)) if (a == 0) { a <- .05 } return(a) } # Prep data for dimensional reduction # # Common checks and preparatory steps before running certain dimensional # reduction techniques # # @param object Assay object # @param features Features to use as input for the dimensional reduction technique. # Default is variable features # @ param verbose Print messages and warnings # # PrepDR <- function( object, features = NULL, slot = 'scale.data', verbose = TRUE ) { if (length(x = VariableFeatures(object = object)) == 0 && is.null(x = features)) { stop("Variable features haven't been set. Run FindVariableFeatures() or provide a vector of feature names.") } data.use <- GetAssayData(object = object, layer = slot) if (nrow(x = data.use ) == 0 && slot == "scale.data") { stop("Data has not been scaled. Please run ScaleData and retry") } features <- features %||% VariableFeatures(object = object) features.keep <- unique(x = features[features %in% rownames(x = data.use)]) if (length(x = features.keep) < length(x = features)) { features.exclude <- setdiff(x = features, y = features.keep) if (verbose) { warning(paste0("The following ", length(x = features.exclude), " features requested have not been scaled (running reduction without them): ", paste0(features.exclude, collapse = ", "))) } } features <- features.keep if (inherits(x = data.use, what = 'dgCMatrix')) { features.var <- RowVarSparse(mat = data.use[features, ]) } else { features.var <- RowVar(x = data.use[features, ]) } features.keep <- features[features.var > 0] if (length(x = features.keep) < length(x = features)) { features.exclude <- setdiff(x = features, y = features.keep) if (verbose) { warning(paste0("The following ", length(x = features.exclude), " features requested have zero variance (running reduction without them): ", paste0(features.exclude, collapse = ", "))) } } features <- features.keep features <- features[!is.na(x = features)] data.use <- data.use[features, ] return(data.use) } PrepDR5 <- function(object, features = NULL, layer = 'scale.data', verbose = TRUE) { layer <- layer[1L] olayer <- layer layer <- Layers(object = object, search = layer) if (is.null(layer)) { abort(paste0("No layer matching pattern '", olayer, "' not found. Please run ScaleData and retry")) } data.use <- LayerData(object = object, layer = layer) features <- features %||% VariableFeatures(object = object) if (!length(x = features)) { stop("No variable features, run FindVariableFeatures() or provide a vector of features", call. = FALSE) } if (is(data.use, "IterableMatrix")) { features.var <- BPCells::matrix_stats(matrix=data.use, row_stats="variance")$row_stats["variance",] } else { features.var <- apply(X = data.use, MARGIN = 1L, FUN = var) } features.keep <- features[features.var > 0] if (!length(x = features.keep)) { stop("None of the requested features have any variance", call. = FALSE) } else if (length(x = features.keep) < length(x = features)) { exclude <- setdiff(x = features, y = features.keep) if (isTRUE(x = verbose)) { warning( "The following ", length(x = exclude), " features requested have zero variance; running reduction without them: ", paste(exclude, collapse = ', '), call. = FALSE, immediate. = TRUE ) } } features <- features.keep features <- features[!is.na(x = features)] features.use <- features[features %in% rownames(data.use)] if(!isTRUE(all.equal(features, features.use))) { missing_features <- setdiff(features, features.use) if(length(missing_features) > 0) { warning_message <- paste("The following features were not available: ", paste(missing_features, collapse = ", "), ".", sep = "") warning(warning_message, immediate. = TRUE) } } data.use <- data.use[features.use, ] return(data.use) } #' @param assay Name of Assay SPCA is being run on #' @param npcs Total Number of SPCs to compute and store (50 by default) #' @param verbose Print the top genes associated with high/low loadings for #' the SPCs #' @param reduction.key dimensional reduction key, specifies the string before #' the number for the dimension names. SPC by default #' @param graph Graph used supervised by SPCA #' @param seed.use Set a random seed. By default, sets the seed to 42. Setting #' NULL will not set a seed. #' #' @importFrom irlba irlba #' #' @concept dimensional_reduction #' @rdname RunSPCA #' @export RunSPCA.default <- function( object, assay = NULL, npcs = 50, reduction.key = "SPC_", graph = NULL, verbose = FALSE, seed.use = 42, ... ) { if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } npcs <- min(npcs, nrow(x = object) - 1) if (verbose) { message("Computing sPCA transformation") } HSIC <- object %*% graph %*% t(x = object) pca.results <- irlba(A = HSIC, nv = npcs) feature.loadings <- pca.results$u rownames(x = feature.loadings) <- rownames(x = object) cell.embeddings <- t(object) %*% feature.loadings colnames(x = cell.embeddings) <- colnames(x = feature.loadings) <- paste0(reduction.key, 1:ncol(x = cell.embeddings)) sdev <- pca.results$d / sqrt(max(1, nrow(x = HSIC) - 1)) reduction.data <- CreateDimReducObject( embeddings = cell.embeddings, loadings = feature.loadings, assay = assay, stdev = sdev, key = reduction.key ) return(reduction.data) } #' @param features Features to compute SPCA on. If features=NULL, SPCA will be run #' using the variable features for the Assay. #' #' @rdname RunSPCA #' @concept dimensional_reduction #' @export #' @method RunSPCA Assay #' RunSPCA.Assay <- function( object, assay = NULL, features = NULL, npcs = 50, reduction.key = "SPC_", graph = NULL, verbose = TRUE, seed.use = 42, ... ) { data.use <- PrepDR( object = object, features = features, verbose = verbose ) reduction.data <- RunSPCA( object = data.use, assay = assay, npcs = npcs, reduction.key = reduction.key, graph = graph, verbose = verbose, seed.use = seed.use, ... ) return(reduction.data) } #' @param features Features to compute SPCA on. If features=NULL, SPCA will be run #' using the variable features for the Assay. #' @param layer Layer to run SPCA on #' #' @rdname RunSPCA #' @concept dimensional_reduction #' @export #' @method RunSPCA Assay5 #' RunSPCA.Assay5 <- function( object, assay = NULL, features = NULL, npcs = 50, reduction.key = "SPC_", graph = NULL, verbose = TRUE, seed.use = 42, layer = 'scale.data', ... ) { data.use <- PrepDR5( object = object, features = features, layer = layer, verbose = verbose ) reduction.data <- RunSPCA( object = data.use, assay = assay, npcs = npcs, reduction.key = reduction.key, graph = graph, verbose = verbose, seed.use = seed.use, ... ) return(reduction.data) } #' @param reduction.name dimensional reduction name, spca by default #' @rdname RunSPCA #' @concept dimensional_reduction #' @export #' @method RunSPCA Seurat #' RunSPCA.Seurat <- function( object, assay = NULL, features = NULL, npcs = 50, reduction.name = "spca", reduction.key = "SPC_", graph = NULL, verbose = TRUE, seed.use = 42, ... ) { assay <- assay %||% DefaultAssay(object = object) if (is.null(x = graph)) { stop("Graph is not provided") } else if (is.character(x = graph)) { graph <- object[[graph]] } reduction.data <- RunSPCA( object = object[[assay]], assay = assay, features = features, npcs = npcs, reduction.name = reduction.name, reduction.key = reduction.key, graph = graph, verbose = verbose, seed.use = seed.use, ... ) object[[reduction.name]] <- reduction.data object <- LogSeuratCommand(object = object) return(object) } #' @param assay Name of Assay SLSI is being run on #' @param n Total Number of SLSI components to compute and store #' @param verbose Display messages #' @param reduction.key dimensional reduction key, specifies the string before #' the number for the dimension names #' @param graph Graph used supervised by SLSI #' @param seed.use Set a random seed. Setting NULL will not set a seed. #' #' @importFrom irlba irlba #' @importMethodsFrom Matrix t #' #' @concept dimensional_reduction #' @rdname RunSLSI #' @export RunSLSI.default <- function( object, assay = NULL, n = 50, reduction.key = "SLSI_", graph = NULL, verbose = TRUE, seed.use = 42, ... ) { if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } n <- min(n, nrow(x = object) - 1) if (verbose) { message("Smoothing peaks matrix") } if (inherits(x = object, what = 'IterableMatrix')) { t_object <- t(BPCells::transpose_storage_order(matrix = object)) object.smooth <- t(x = graph) %*% (t_object %*% object) %*% graph } else { object.smooth <- t(x = graph) %*% (t(x = object) %*% object) %*% graph } if (verbose) { message("Performing eigendecomposition") } svd.V <- irlba(A = object.smooth, nv = n, nu = n, ...) sigma <- sqrt(x = svd.V$d) feature.loadings <- object %*% (graph %*% svd.V$u) %*% diag(x = 1/sigma) feature.loadings <- as.matrix(x = feature.loadings) cell.embeddings <- t(x = object) %*% feature.loadings %*% diag(x = 1/sigma) cell.embeddings <- as.matrix(x = cell.embeddings) # construct svd list stored in misc for LSI projection svd.lsi <- svd.V svd.lsi$d <- sigma svd.lsi$u <- feature.loadings svd.lsi$v <- cell.embeddings colnames(x = cell.embeddings) <- paste0(reduction.key, 1:ncol(cell.embeddings)) reduction.data <- CreateDimReducObject( embeddings = cell.embeddings, loadings = feature.loadings, key = reduction.key, assay = assay, misc = svd.lsi ) return(reduction.data) } #' @param features Features to compute SLSI on. If NULL, SLSI will be run #' using the variable features for the Assay. #' #' @rdname RunSLSI #' @concept dimensional_reduction #' @export #' @method RunSLSI Assay #' RunSLSI.Assay <- function( object, assay = NULL, features = NULL, n = 50, reduction.key = "SLSI_", graph = NULL, verbose = TRUE, seed.use = 42, ... ) { data.use <- PrepDR( object = object, features = features, slot = "data", verbose = verbose ) reduction.data <- RunSLSI( object = data.use, assay = assay, n = n, reduction.key = reduction.key, graph = graph, verbose = verbose, seed.use = seed.use, ... ) return(reduction.data) } #' @param features Features to compute SLSI on. If features=NULL, SLSI will be run #' using the variable features for the Assay5. #' @param layer Layer to run SLSI on #' #' @rdname RunSLSI #' @concept dimensional_reduction #' @export #' @method RunSLSI StdAssay #' RunSLSI.StdAssay <- function( object, assay = NULL, features = NULL, n = 50, reduction.key = "SLSI_", graph = NULL, layer = "data", verbose = TRUE, seed.use = 42, ...) { data.use <- PrepDR5( object = object, features = features, layer = layer, verbose = verbose ) reduction.data <- RunSLSI( object = data.use, assay = assay, reduction.key = reduction.key, graph = graph, verbose = verbose, seed.use = seed.use, ... ) return(reduction.data) } #' @param reduction.name dimensional reduction name #' @rdname RunSLSI #' @concept dimensional_reduction #' @export #' @method RunSLSI Seurat #' RunSLSI.Seurat <- function( object, assay = NULL, features = NULL, n = 50, reduction.name = "slsi", reduction.key = "SLSI_", graph = NULL, verbose = TRUE, seed.use = 42, ... ) { assay <- assay %||% DefaultAssay(object = object) assay.data <- GetAssay(object = object, assay = assay) if (is.null(x = graph)) { stop("Graph is not provided") } else if (is.character(x = graph)) { graph <- object[[graph]] } reduction.data <- RunSLSI( object = assay.data, assay = assay, features = features, n = n, reduction.name = reduction.name, reduction.key = reduction.key, graph = graph, verbose = verbose, seed.use = seed.use, ... ) object[[reduction.name]] <- reduction.data object <- LogSeuratCommand(object = object) return(object) } Seurat/R/tree.R0000644000176200001440000003023715056057544013020 0ustar liggesusers#' @include generics.R #' NULL cluster.ape <- paste( "Cluster tree functionality requires 'ape'", "please install with 'install.packages('ape')'" ) #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Phylogenetic Analysis of Identity Classes #' #' Constructs a phylogenetic tree relating the 'aggregate' cell from each #' identity class. Tree is estimated based on a distance matrix constructed in #' either gene expression space or PCA space. #' #' Note that the tree is calculated for an 'aggregate' cell, so gene expression #' or PC scores are summed across all cells in an identity class before the #' tree is constructed. #' #' @param object Seurat object #' @param assay Assay to use for the analysis. #' @param features Genes to use for the analysis. Default is the set of #' variable genes (\code{VariableFeatures(object = object)}) #' @param dims If set, tree is calculated in dimension reduction space; #' overrides \code{features} #' @param reduction Name of dimension reduction to use. Only used if \code{dims} #' is not NULL. #' @param slot slot/layer to use. #' @param graph If graph is passed, build tree based on graph connectivity between #' clusters; overrides \code{dims} and \code{features} #' @param reorder Re-order identity classes (factor ordering), according to #' position on the tree. This groups similar classes together which can be #' helpful, for example, when drawing violin plots. #' @param reorder.numeric Re-order identity classes according to position on #' the tree, assigning a numeric value ('1' is the leftmost node) #' @param verbose Show progress updates #' #' @return A Seurat object where the cluster tree can be accessed with \code{\link{Tool}} #' #' @importFrom pbapply pblapply #' @importFrom stats dist hclust na.omit #' @importFrom utils txtProgressBar setTxtProgressBar #' #' @export #' @concept tree #' #' @examples #' \dontrun{ #' if (requireNamespace("ape", quietly = TRUE)) { #' data("pbmc_small") #' pbmc_small #' pbmc_small <- BuildClusterTree(object = pbmc_small) #' Tool(object = pbmc_small, slot = 'BuildClusterTree') #' } #' } #' BuildClusterTree <- function( object, assay = NULL, features = NULL, dims = NULL, reduction = "pca", graph = NULL, slot = 'data', reorder = FALSE, reorder.numeric = FALSE, verbose = TRUE ) { if (!requireNamespace('ape', quietly = TRUE)) { stop(cluster.ape, call. = FALSE) } assay <- assay %||% DefaultAssay(object = object) if (!is.null(x = graph)) { idents <- levels(x = object) nclusters <- length(x = idents) data.dist <- matrix( data = numeric(length = 1L), nrow = nclusters, ncol = nclusters, dimnames = list(idents, idents) ) graph <- object[[graph]] cxi <- CellsByIdentities(object = object) cpairs <- na.omit(object = unique(x = t(x = apply( X = expand.grid(1:nclusters, 1:nclusters)[, c(2, 1)], MARGIN = 1, FUN = function(x) { if (length(x = x) == length(x = unique(x = x))) { return(sort(x = x)) } return(c(NA, NA)) } )))) if (verbose) { pb <- txtProgressBar(style = 3, file = stderr()) } for (i in 1:nrow(x = cpairs)) { i1 <- cpairs[i, ][1] i2 <- cpairs[i, ][2] graph.sub <- graph[cxi[[idents[i1]]], cxi[[idents[i2]]]] d <- mean(x = graph.sub) if (is.na(x = d)) { d <- 0 } data.dist[i1, i2] <- d if (verbose) { setTxtProgressBar(pb = pb, value = i / nrow(x = cpairs)) } } if (verbose) { close(con = pb) } diag(x = data.dist) <- 1 data.dist <- dist(x = data.dist) } else if (!is.null(x = dims)) { my.lapply <- ifelse(test = verbose, yes = pblapply, no = lapply) embeddings <- Embeddings(object = object, reduction = reduction)[, dims] data.dims <- my.lapply( X = levels(x = object), FUN = function(x) { cells <- WhichCells(object = object, idents = x) if (length(x = cells) == 1) { cells <- c(cells, cells) } temp <- colMeans(x = embeddings[cells, ]) } ) data.dims <- do.call(what = 'cbind', args = data.dims) colnames(x = data.dims) <- levels(x = object) data.dist <- dist(x = t(x = data.dims)) } else { features <- features %||% VariableFeatures(object = object) features <- intersect(x = features, y = rownames(x = object)) # if `slot` is set to "counts" sum the expression of the # ident groups, otherwise average them if(slot == "counts") { # AggregateExpression only operates on a "counts" matrix so `layer` # cannot be specified data.pseudobulk <- AggregateExpression( object, assays = assay, features = features, verbose = verbose )[[1]] } else { data.pseudobulk <- suppressMessages( AverageExpression( object, assays = assay, features = features, # explicitly pass in the value of `slot` in as `layer` layer = slot, verbose = verbose ) )[[1]] } data.dist <- dist(x = t(x = data.pseudobulk[features, ])) } data.tree <- ape::as.phylo(x = hclust(d = data.dist)) Tool(object = object) <- data.tree if (reorder) { if (verbose) { message("Reordering identity classes and rebuilding tree") } old.ident.order <- levels(x = object) data.tree <- Tool(object = object, slot = 'BuildClusterTree') all.desc <- GetDescendants(tree = data.tree, node = (data.tree$Nnode + 2)) all.desc <- old.ident.order[all.desc[all.desc <= (data.tree$Nnode + 1)]] Idents(object = object) <- factor(x = Idents(object = object), levels = all.desc, ordered = TRUE) if (reorder.numeric) { new.levels <- sort(x = unique(x = as.integer(x = Idents(object = object)))) Idents(object = object) <- factor(x = as.integer(x = Idents(object = object)), levels = new.levels) object[['tree.ident']] <- as.integer(x = Idents(object = object)) } object <- BuildClusterTree( object = object, assay = assay, features = features, dims = dims, reduction = reduction, graph = graph, slot = slot, reorder = FALSE, verbose = verbose ) } return(object) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for R-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Depth first traversal path of a given tree # # @param tree Tree object (from ape package) # @param node Internal node in the tree # @param path Path through the tree (for recursion) # @param include.children Include children in the output path # @param only.children Only include children in the output path # @return Returns a vector representing the depth first traversal path # DFT <- function( tree, node, path = NULL, include.children = FALSE, only.children = FALSE ) { if (only.children) { include.children = TRUE } children <- which(x = tree$edge[, 1] == node) child1 <- tree$edge[children[1], 2] child2 <- tree$edge[children[2], 2] if (child1 %in% tree$edge[, 1]) { if (!only.children) { path <- c(path, child1) } path <- DFT( tree = tree, node = child1, path = path, include.children = include.children, only.children = only.children ) } else { if (include.children) { path <- c(path, child1) } } if (child2 %in% tree$edge[, 1]) { if (!only.children) { path <- c(path, child2) } path <- DFT( tree = tree, node = child2, path = path, include.children = include.children, only.children = only.children ) } else { if (include.children) { path <- c(path, child2) } } return(path) } # Function to return all internal (non-terminal) nodes in a given tree # # @param tree Tree object (from ape package) # # @return Returns a vector of all internal nodes for the given tree # GetAllInternalNodes <- function(tree) { return(c(tree$edge[1, 1], DFT(tree = tree, node = tree$edge[1, 1]))) } # Function to get all the descendants on a tree of a given node # # @param tree Tree object (from ape package) # @param node Internal node in the tree # # @return Returns all descendants of the given node # GetDescendants <- function(tree, node, curr = NULL) { if (is.null(x = curr)) { curr <- vector() } daughters <- tree$edge[which(x = tree$edge[, 1] == node), 2] curr <- c(curr, daughters) w <- which(x = daughters >= length(x = tree$tip)) if (length(x = w) > 0) { for (i in 1:length(x = w)) { curr <- GetDescendants(tree = tree, node = daughters[w[i]], curr = curr) } } return(curr) } # Function to get all the descendants on a tree left of a given node # # @param tree Tree object (from ape package) # @param node Internal node in the tree # # @return Returns all descendants left of the given node # GetLeftDescendants <- function(tree, node) { daughters <- tree$edge[which(tree$edge[, 1] == node), 2] if (daughters[1] <= (tree$Nnode + 1)) { return(daughters[1]) } daughter.use <- GetDescendants(tree, daughters[1]) daughter.use <- daughter.use[daughter.use <= (tree$Nnode + 1)] return(daughter.use) } # Function to get all the descendants on a tree right of a given node # # @param tree Tree object (from ape package) # @param node Internal node in the tree # # @return Returns all descendants right of the given node # GetRightDescendants <- function(tree, node) { daughters <- tree$edge[which(x = tree$edge[, 1] == node), 2] if (daughters[2] <= (tree$Nnode + 1)) { return(daughters[2]) } daughter.use <- GetDescendants(tree = tree, node = daughters[2]) daughter.use <- daughter.use[daughter.use <= (tree$Nnode + 1)] return(daughter.use) } # Merge childen of a node # # Merge the childen of a node into a single identity class # # @param object Seurat object # @param node.use Merge children of this node # @param rebuild.tree Rebuild cluster tree after the merge? # @param ... Extra parameters to BuildClusterTree, used only if rebuild.tree = TRUE # # @seealso \code{BuildClusterTree} # # # @examples # data("pbmc_small") # PlotClusterTree(object = pbmc_small) # pbmc_small <- MergeNode(object = pbmc_small, node.use = 7, rebuild.tree = TRUE) # PlotClusterTree(object = pbmc_small) # MergeNode <- function(object, node.use, rebuild.tree = FALSE, ...) { CheckDots(..., fxns = 'BuldClusterTree') object.tree <- object@cluster.tree[[1]] node.children <- DFT( tree = object.tree, node = node.use, include.children = TRUE ) node.children <- intersect(x = node.children, y = levels(x = object@ident)) children.cells <- WhichCells(object = object, ident = node.children) if (length(x = children.cells > 0)) { object <- SetIdent( object = object, cells.use = children.cells, ident.use = min(node.children) ) } if (rebuild.tree) { object <- BuildClusterTree(object = object, ...) } return(object) } # Function to check whether a given node in a tree has a child (leaf node) # # @param tree Tree object (from ape package) # @param node Internal node in the tree # # @return Returns a Boolean of whether the given node is connected to a terminal leaf node NodeHasChild <- function(tree, node) { children <- tree$edge[which(x = tree$edge[, 1] == node), ][, 2] return(any(children %in% tree$edge[, 2] && !children %in% tree$edge[, 1])) } # Function to check whether a given node in a tree has only children(leaf nodes) # # @param tree Tree object (from ape package) # @param node Internal node in the tree # # @return Returns a Boolean of whether the given node is connected to only terminal leaf nodes NodeHasOnlyChildren <- function(tree, node) { children <- tree$edge[which(x = tree$edge[, 1] == node), ][, 2] return(!any(children %in% tree$edge[, 1])) } Seurat/R/preprocessing5.R0000644000176200001440000015534315070750476015037 0ustar liggesusers#' @include generics.R #' @include preprocessing.R #' @importFrom stats loess #' @importFrom methods slot #' @importFrom SeuratObject .MARGIN .SparseSlots #' @importFrom utils txtProgressBar setTxtProgressBar #' NULL hvf.methods <- list() #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @method FindVariableFeatures default #' @export #' FindVariableFeatures.default <- function( object, method = VST, nfeatures = 2000L, verbose = TRUE, selection.method = selection.method, ... ) { if (is_quosure(x = method)) { method <- eval( expr = quo_get_expr(quo = method), envir = quo_get_env(quo = method) ) } if (is.character(x = method)) { method <- get(x = method) } if (!is.function(x = method)) { stop( "'method' must be a function for calculating highly variable features", call. = FALSE ) } var.gene.ouput <- method( data = object, nselect = nfeatures, verbose = verbose, ... ) rownames(x = var.gene.ouput) <- rownames(x = object) return(var.gene.ouput) } #' @importFrom SeuratObject DefaultLayer Features Key Layers #' #' @method FindVariableFeatures StdAssay #' @export #' FindVariableFeatures.StdAssay <- function( object, method = NULL, nfeatures = 2000L, layer = NULL, span = 0.3, clip = NULL, key = NULL, verbose = TRUE, selection.method = 'vst', ... ) { if (selection.method == 'vst') { layer <- layer%||%'counts' method <- VST key <- 'vst' } else if (selection.method %in% c('mean.var.plot', 'mvp')) { layer <- layer%||%'data' method <- MVP key <- 'mvp' } else if (selection.method %in% c('dispersion', 'disp')) { layer <- layer%||%'data' method <- DISP key <- 'disp' } else if (is.null(x = method) || is.null(x = layer)){ stop('Custome functions and layers are both required') } else { key <- NULL } layer <- Layers(object = object, search = layer) if (is.null(x = key)) { false <- function(...) { return(FALSE) } key <- if (tryCatch(expr = is_quosure(x = method), error = false)) { method } else if (is.function(x = method)) { substitute(expr = method) } else if (is.call(x = enquo(arg = method))) { enquo(arg = method) } else if (is.character(x = method)) { method } else { parse(text = method) } key <- .Abbrv(x = as_name(x = key)) } warn.var <- warn.rank <- TRUE for (i in seq_along(along.with = layer)) { if (isTRUE(x = verbose)) { message("Finding variable features for layer ", layer[i]) } data <- LayerData(object = object, layer = layer[i], fast = TRUE) hvf.function <- if (inherits(x = data, what = 'V3Matrix')) { FindVariableFeatures.default } else { FindVariableFeatures } hvf.info <- hvf.function( object = data, method = method, nfeatures = nfeatures, span = span, clip = clip, verbose = verbose, ... ) if (warn.var) { if (!'variable' %in% colnames(x = hvf.info) || !is.logical(x = hvf.info$variable)) { warning( "No variable feature indication in HVF info for method ", key, ", `VariableFeatures` will not work", call. = FALSE, immediate. = TRUE ) warn.var <- FALSE } } else if (warn.rank && !'rank' %in% colnames(x = hvf.info)) { warning( "No variable feature rank in HVF info for method ", key, ", `VariableFeatures` will return variable features in assay order", call. = FALSE, immediate. = TRUE ) warn.rank <- FALSE } colnames(x = hvf.info) <- paste( 'vf', key, layer[i], colnames(x = hvf.info), sep = '_' ) rownames(x = hvf.info) <- Features(x = object, layer = layer[i]) object[["var.features"]] <- NULL object[["var.features.rank"]] <- NULL object[[names(x = hvf.info)]] <- NULL object[[names(x = hvf.info)]] <- hvf.info } VariableFeatures(object) <- VariableFeatures(object, nfeatures=nfeatures,method = key) return(object) } #' @method FindSpatiallyVariableFeatures StdAssay #' @rdname FindSpatiallyVariableFeatures #' @concept preprocessing #' @concept spatial #' @export #' FindSpatiallyVariableFeatures.StdAssay <- FindSpatiallyVariableFeatures.Assay #' @rdname LogNormalize #' @method LogNormalize default #' #' @param margin Margin to normalize over #' @importFrom SeuratObject .CheckFmargin #' #' @export #' LogNormalize.default <- function( data, scale.factor = 1e4, margin = 2L, verbose = TRUE, ... ) { margin <- .CheckFmargin(fmargin = margin) ncells <- dim(x = data)[margin] if (isTRUE(x = verbose)) { pb <- txtProgressBar(file = stderr(), style = 3) } for (i in seq_len(length.out = ncells)) { x <- if (margin == 1L) { data[i, ] } else { data[, i] } xnorm <- log1p(x = x / sum(x) * scale.factor) if (margin == 1L) { data[i, ] <- xnorm } else { data[, i] <- xnorm } if (isTRUE(x = verbose)) { setTxtProgressBar(pb = pb, value = i / ncells) } } if (isTRUE(x = verbose)) { close(con = pb) } return(data) } #' @method LogNormalize IterableMatrix #' @export #' LogNormalize.IterableMatrix <- function( data, scale.factor = 1e4, margin = 2L, verbose = TRUE, ... ) { data <- BPCells::t(BPCells::t(data) / colSums(data)) # Log normalization data <- log1p(data * scale.factor) return(data) } #' @importFrom SeuratObject IsSparse #' #' @method NormalizeData default #' @export #' NormalizeData.default <- function( object, normalization.method = c('LogNormalize', 'CLR', 'RC'), scale.factor = 1e4, cmargin = 2L, margin = 1L, verbose = TRUE, ... ) { normalization.method <- normalization.method[1L] normalization.method <- match.arg(arg = normalization.method) # TODO: enable parallelization via future normalized <- switch( EXPR = normalization.method, 'LogNormalize' = { if (IsSparse(x = object) && .MARGIN(object = object) == cmargin) { .SparseNormalize( data = object, scale.factor = scale.factor, verbose = verbose ) } else { LogNormalize( data = object, scale.factor = scale.factor, margin = cmargin, verbose = verbose, ... ) } }, 'CLR' = { if (inherits(x = object, what = 'dgTMatrix')) { warning('Convert input dgTMatrix into dgCMatrix') object <- as(object = object, Class = 'dgCMatrix') } if (!inherits(x = object, what = 'dgCMatrix') && !inherits(x = object, what = 'matrix')) { stop('CLR normalization is only supported for dense and dgCMatrix') } CustomNormalize( data = object, custom_function = function(x) { return(log1p(x = x/(exp(x = sum(log1p(x = x[x > 0]), na.rm = TRUE)/length(x = x))))) }, margin = margin, verbose = verbose ) }, 'RC' = { if (!inherits(x = object, what = 'dgCMatrix') && !inherits(x = object, what = 'matrix')) { stop('RC normalization is only supported for dense and dgCMatrix') } RelativeCounts(data = object, scale.factor = scale.factor, verbose = verbose) } ) return(normalized) } #' @importFrom SeuratObject Cells DefaultLayer DefaultLayer<- Features #' LayerData LayerData<- #' #' @method NormalizeData StdAssay #' @export #' NormalizeData.StdAssay <- function( object, normalization.method = 'LogNormalize', scale.factor = 1e4, margin = 1L, layer = 'counts', save = 'data', verbose = TRUE, ... ) { olayer <- layer <- unique(x = layer) layer <- Layers(object = object, search = layer) if (length(x = save) != length(x = layer)) { save <- make.unique(names = gsub( pattern = olayer, replacement = save, x = layer )) } for (i in seq_along(along.with = layer)) { l <- layer[i] if (isTRUE(x = verbose)) { message("Normalizing layer: ", l) } LayerData( object = object, layer = save[i], features = Features(x = object, layer = l), cells = Cells(x = object, layer = l) ) <- NormalizeData( object = LayerData(object = object, layer = l, fast = NA), normalization.method = normalization.method, scale.factor = scale.factor, margin = margin, verbose = verbose, ... ) } gc(verbose = FALSE) return(object) } #' @importFrom SeuratObject StitchMatrix #' #' @method ScaleData StdAssay #' @export #' ScaleData.StdAssay <- function( object, features = NULL, layer = 'data', vars.to.regress = NULL, latent.data = NULL, by.layer = FALSE, split.by = NULL, model.use = 'linear', use.umi = FALSE, do.scale= TRUE, do.center = TRUE, scale.max = 10, block.size = 1000, min.cells.to.block = 3000, save = 'scale.data', verbose = TRUE, ... ) { use.umi <- ifelse(test = model.use != 'linear', yes = TRUE, no = use.umi) olayer <- layer <- unique(x = layer) layer <- Layers(object = object, search = layer) if (is.null(layer)) { abort(paste0("No layer matching pattern '", olayer, "' found. Please run NormalizeData and retry")) } if (isTRUE(x = use.umi)) { layer <- "counts" inform( message = "'use.umi' is TRUE, please make sure 'layer' specifies raw counts" ) } features <- features %||% VariableFeatures(object = object) if (!length(x = features)) { features <- Features(x = object, layer = layer) } if (isTRUE(x = by.layer)) { if (length(x = save) != length(x = layer)) { save <- make.unique(names = gsub( pattern = olayer, replacement = save, x = layer )) } for (i in seq_along(along.with = layer)) { lyr <- layer[i] if (isTRUE(x = verbose)) { inform(message = paste("Scaling data for layer", sQuote(x = lyr))) } LayerData(object = object, layer = save[i], ...) <- ScaleData( object = LayerData( object = object, layer = lyr, features = features, fast = NA ), features = features, vars.to.regress = vars.to.regress, latent.data = latent.data, split.by = split.by, model.use = model.use, use.umi = use.umi, do.scale = do.scale, do.center = do.center, scale.max = scale.max, block.size = block.size, min.cells.to.block = min.cells.to.block, verbose = verbose, ... ) } } else { ldata <- if (length(x = layer) > 1L) { StitchMatrix( x = LayerData(object = object, layer = layer[1L], features = features), y = lapply( X = layer[2:length(x = layer)], FUN = LayerData, object = object, features = features ), rowmap = slot(object = object, name = 'features')[features, layer], colmap = slot(object = object, name = 'cells')[, layer] ) } else { LayerData(object = object, layer = layer, features = features) } ldata <- ScaleData( object = ldata, features = features, vars.to.regress = vars.to.regress, latent.data = latent.data, split.by = split.by, model.use = model.use, use.umi = use.umi, do.scale = do.scale, do.center = do.center, scale.max = scale.max, block.size = block.size, min.cells.to.block = min.cells.to.block, verbose = verbose, ... ) LayerData(object = object, layer = save, features = rownames(ldata)) <- ldata } return(object) } #' @rdname VST #' @method VST default #' @export #' VST.default <- function( data, margin = 1L, nselect = 2000L, span = 0.3, clip = NULL, ... ) { .NotYetImplemented() } #' @rdname VST #' @method VST IterableMatrix #' @importFrom SeuratObject EmptyDF #' @export #' VST.IterableMatrix <- function( data, margin = 1L, nselect = 2000L, span = 0.3, clip = NULL, verbose = TRUE, ... ) { nfeatures <- nrow(x = data) hvf.info <- EmptyDF(n = nfeatures) hvf.stats <- BPCells::matrix_stats( matrix = data, row_stats = 'variance')$row_stats # Calculate feature means hvf.info$mean <- hvf.stats['mean', ] # Calculate feature variance hvf.info$variance <- hvf.stats['variance', ] hvf.info$variance.expected <- 0L not.const <- hvf.info$variance > 0 fit <- loess( formula = log10(x = variance) ~ log10(x = mean), data = hvf.info[not.const, , drop = TRUE], span = span ) hvf.info$variance.expected[not.const] <- 10 ^ fit$fitted feature.mean <- hvf.info$mean feature.sd <- sqrt(x = hvf.info$variance.expected) standard.max <- clip %||% sqrt(x = ncol(x = data)) feature.mean[feature.mean == 0] <- 0.1 data <- BPCells::min_by_row(mat = data, vals = standard.max*feature.sd + feature.mean) data.standard <- (data - feature.mean) / feature.sd hvf.info$variance.standardized <- BPCells::matrix_stats( matrix = data.standard, row_stats = 'variance' )$row_stats['variance', ] # Set variable features hvf.info$variable <- FALSE hvf.info$rank <- NA vf <- head( x = order(hvf.info$variance.standardized, decreasing = TRUE), n = nselect ) hvf.info$variable[vf] <- TRUE hvf.info$rank[vf] <- seq_along(along.with = vf) rownames(x = hvf.info) <- rownames(x = data) return(hvf.info) } #' @importFrom Matrix rowMeans #' @importFrom SeuratObject EmptyDF #' #' @rdname VST #' @method VST dgCMatrix #' @export #' VST.dgCMatrix <- function( data, margin = 1L, nselect = 2000L, span = 0.3, clip = NULL, verbose = TRUE, ... ) { nfeatures <- nrow(x = data) hvf.info <- EmptyDF(n = nfeatures) # Calculate feature means hvf.info$mean <- Matrix::rowMeans(x = data) # Calculate feature variance hvf.info$variance <- SparseRowVar2( mat = data, mu = hvf.info$mean, display_progress = verbose ) hvf.info$variance.expected <- 0L not.const <- hvf.info$variance > 0 fit <- loess( formula = log10(x = variance) ~ log10(x = mean), data = hvf.info[not.const, , drop = TRUE], span = span ) hvf.info$variance.expected[not.const] <- 10 ^ fit$fitted hvf.info$variance.standardized <- SparseRowVarStd( mat = data, mu = hvf.info$mean, sd = sqrt(x = hvf.info$variance.expected), vmax = clip %||% sqrt(x = ncol(x = data)), display_progress = verbose ) # Set variable features hvf.info$variable <- FALSE hvf.info$rank <- NA vf <- head( x = order(hvf.info$variance.standardized, decreasing = TRUE), n = nselect ) hvf.info$variable[vf] <- TRUE hvf.info$rank[vf] <- seq_along(along.with = vf) return(hvf.info) } #' @rdname VST #' @method VST matrix #' @export #' VST.matrix <- function( data, margin = 1L, nselect = 2000L, span = 0.3, clip = NULL, ... ) { return(VST( data = as.sparse(x = data), margin = margin, nselect = nselect, span = span, clip = clip, ... )) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for R-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Calculate dispersion of features #' #' @param object Data matrix #' @param mean.function Function to calculate mean #' @param dispersion.function Function to calculate dispersion #' @param num.bin Number of bins to use #' @param binning.method Method to use for binning. Options are 'equal_width' or 'equal_frequency' #' @param verbose Display progress #' @keywords internal #' CalcDispersion <- function( object, mean.function = FastExpMean, dispersion.function = FastLogVMR, num.bin = 20, binning.method = "equal_width", verbose = TRUE, ... ) { if (!inherits(x = object, what = c('dgCMatrix', 'matrix'))) { stop('mean.var.plot and dispersion methods only \ support dense and sparse matrix input') } if (inherits(x = object, what = 'matrix')) { object <- as.sparse(x = object) } feature.mean <- mean.function(object, verbose) feature.dispersion <- dispersion.function(object, verbose) names(x = feature.mean) <- names( x = feature.dispersion) <- rownames(x = object) feature.dispersion[is.na(x = feature.dispersion)] <- 0 feature.mean[is.na(x = feature.mean)] <- 0 data.x.breaks <- switch( EXPR = binning.method, 'equal_width' = num.bin, 'equal_frequency' = c( quantile( x = feature.mean[feature.mean > 0], probs = seq.int(from = 0, to = 1, length.out = num.bin) ) ), stop("Unknown binning method: ", binning.method) ) data.x.bin <- cut(x = feature.mean, breaks = data.x.breaks, include.lowest = TRUE) names(x = data.x.bin) <- names(x = feature.mean) mean.y <- tapply(X = feature.dispersion, INDEX = data.x.bin, FUN = mean) sd.y <- tapply(X = feature.dispersion, INDEX = data.x.bin, FUN = sd) feature.dispersion.scaled <- (feature.dispersion - mean.y[as.numeric(x = data.x.bin)]) / sd.y[as.numeric(x = data.x.bin)] names(x = feature.dispersion.scaled) <- names(x = feature.mean) hvf.info <- data.frame( feature.mean, feature.dispersion, feature.dispersion.scaled) rownames(x = hvf.info) <- rownames(x = object) colnames(x = hvf.info) <- paste0( 'mvp.', c('mean', 'dispersion', 'dispersion.scaled')) return(hvf.info) } #' @importFrom SeuratObject .CalcN #' CalcN <- function(object, ...) { return(.CalcN(object, ...)) } #' @method .CalcN IterableMatrix #' @export #' .CalcN.IterableMatrix <- function(object, ...) { col_stat <- BPCells::matrix_stats(matrix = object, col_stats = 'mean')$col_stats return(list( nCount = round(col_stat['mean', ] * nrow(object)), nFeature = col_stat['nonzero', ] )) } #' Find variable features based on dispersion #' #' @param data Data matrix #' @param nselect Number of top features to select based on dispersion values #' @param verbose Display progress #' @keywords internal #' DISP <- function( data, nselect = 2000L, verbose = TRUE, ... ) { hvf.info <- CalcDispersion(object = data, verbose = verbose, ...) hvf.info$variable <- FALSE hvf.info$rank <- NA vf <- head( x = order(hvf.info$mvp.dispersion, decreasing = TRUE), n = nselect ) hvf.info$variable[vf] <- TRUE hvf.info$rank[vf] <- seq_along(along.with = vf) return(hvf.info) } #' @importFrom SeuratObject .CheckFmargin #' .FeatureVar <- function( data, mu, fmargin = 1L, standardize = FALSE, sd = NULL, clip = NULL, verbose = TRUE ) { fmargin <- .CheckFmargin(fmargin = fmargin) ncells <- dim(x = data)[-fmargin] nfeatures <- dim(x = data)[fmargin] fvars <- vector(mode = 'numeric', length = nfeatures) if (length(x = mu) != nfeatures) { stop("Wrong number of feature means provided") } if (isTRUE(x = standardize)) { clip <- clip %||% sqrt(x = ncells) if (length(x = sd) != nfeatures) { stop("Wrong number of standard deviations") } } if (isTRUE(x = verbose)) { msg <- 'Calculating feature variances' if (isTRUE(x = standardize)) { msg <- paste(msg, 'of standardized and clipped values') } message(msg) pb <- txtProgressBar(style = 3, file = stderr()) } for (i in seq_len(length.out = nfeatures)) { if (isTRUE(x = standardize) && sd[i] == 0) { if (isTRUE(x = verbose)) { setTxtProgressBar(pb = pb, value = i / nfeatures) } next } x <- if (fmargin == 1L) { data[i, , drop = TRUE] } else { data[, i, drop = TRUE] } x <- x - mu[i] if (isTRUE(x = standardize)) { x <- x / sd[i] x[x > clip] <- clip } fvars[i] <- sum(x ^ 2) / (ncells - 1L) if (isTRUE(x = verbose)) { setTxtProgressBar(pb = pb, value = i / nfeatures) } } if (isTRUE(x = verbose)) { close(con = pb) } return(fvars) } .Mean <- function(data, margin = 1L) { nout <- dim(x = data)[margin] nobs <- dim(x = data)[-margin] means <- vector(mode = 'numeric', length = nout) for (i in seq_len(length.out = nout)) { x <- if (margin == 1L) { data[i, , drop = TRUE] } else { data[, i, drop = TRUE] } means[i] <- sum(x) / nobs } return(means) } .SparseNormalize <- function(data, scale.factor = 1e4, verbose = TRUE) { entryname <- .SparseSlots(x = data, type = 'entries') p <- slot(object = data, name = .SparseSlots(x = data, type = 'pointers')) if (p[1L] == 0) { p <- p + 1L } np <- length(x = p) - 1L if (isTRUE(x = verbose)) { pb <- txtProgressBar(style = 3L, file = stderr()) } for (i in seq_len(length.out = np)) { idx <- seq.int(from = p[i], to = p[i + 1] - 1L) xidx <- slot(object = data, name = entryname)[idx] slot(object = data, name = entryname)[idx] <- log1p( x = xidx / sum(xidx) * scale.factor ) if (isTRUE(x = verbose)) { setTxtProgressBar(pb = pb, value = i / np) } } if (isTRUE(x = verbose)) { close(con = pb) } return(data) } #' @param data A sparse matrix #' @param mu A vector of feature means #' @param fmargin Feature margin #' @param standardize Standardize matrix rows prior to calculating variances #' @param sd If standardizing, a vector of standard deviations to #' standardize with #' @param clip Set upper bound for standardized variances; defaults to the #' square root of the number of cells #' @param verbose Show progress updates #' #' @keywords internal #' @importFrom SeuratObject .CheckFmargin #' #' @noRd #' .SparseFeatureVar <- function( data, mu, fmargin = 1L, standardize = FALSE, sd = NULL, clip = NULL, verbose = TRUE ) { fmargin <- .CheckFmargin(fmargin = fmargin) if (fmargin != .MARGIN(object = data)) { data <- t(x = data) fmargin <- .MARGIN(object = data) } entryname <- .SparseSlots(x = data, type = 'entries') p <- slot(object = data, name = .SparseSlots(x = data, type = 'pointers')) if (p[1L] == 0) { p <- p + 1L } np <- length(x = p) - 1L ncells <- dim(x = data)[-fmargin] fvars <- vector(mode = 'numeric', length = np) if (length(x = mu) != np) { stop("Wrong number of feature means provided") } if (isTRUE(x = standardize)) { clip <- clip %||% sqrt(x = ncells) if (length(x = sd) != np) { stop("Wrong number of standard deviations provided") } } if (isTRUE(x = verbose)) { msg <- 'Calculating feature variances' if (isTRUE(x = standardize)) { msg <- paste(msg, 'of standardized and clipped values') } message(msg) pb <- txtProgressBar(style = 3, file = stderr()) } for (i in seq_len(length.out = np)) { if (isTRUE(x = standardize) && sd[i] == 0) { if (isTRUE(x = verbose)) { setTxtProgressBar(pb = pb, value = i / np) } next } idx <- seq.int(from = p[i], to = p[i + 1L] - 1L) xidx <- slot(object = data, name = entryname)[idx] - mu[i] nzero <- ncells - length(x = xidx) csum <- nzero * ifelse( test = isTRUE(x = standardize), yes = ((0 - mu[i]) / sd[i]) ^ 2, no = mu[i] ^ 2 ) if (isTRUE(x = standardize)) { xidx <- xidx / sd[i] xidx[xidx > clip] <- clip } fsum <- sum(xidx ^ 2) + csum fvars[i] <- fsum / (ncells - 1L) if (isTRUE(x = verbose)) { setTxtProgressBar(pb = pb, value = i / np) } } if (isTRUE(x = verbose)) { close(con = pb) } return(fvars) } #' @importFrom SeuratObject .CheckFmargin .SparseMean <- function(data, margin = 1L) { margin <- .CheckFmargin(fmargin = margin) if (margin != .MARGIN(object = data)) { data <- t(x = data) margin <- .MARGIN(object = data) } entryname <- .SparseSlots(x = data, type = 'entries') p <- slot(object = data, name = .SparseSlots(x = data, type = 'pointers')) if (p[1L] == 0) { p <- p + 1L } np <- length(x = p) - 1L nobs <- dim(x = data)[-margin] means <- vector(mode = 'numeric', length = np) for (i in seq_len(length.out = np)) { idx <- seq.int(from = p[i], to = p[i + 1L] - 1L) means[i] <- sum(slot(object = data, name = entryname)[idx]) / nobs } return(means) } #' @inheritParams stats::loess #' @param data A matrix #' @param fmargin Feature margin #' @param nselect Number of features to select #' @param clip After standardization values larger than \code{clip} will be set #' to \code{clip}; default is \code{NULL} which sets this value to the square #' root of the number of cells #' #' @importFrom Matrix rowMeans #' @importFrom SeuratObject .CheckFmargin #' #' @keywords internal #' #' @noRd #' .VST <- function( data, fmargin = 1L, nselect = 2000L, span = 0.3, clip = NULL, verbose = TRUE, ... ) { fmargin <- .CheckFmargin(fmargin = fmargin) nfeatures <- dim(x = data)[fmargin] # TODO: Support transposed matrices # nfeatures <- nrow(x = data) if (IsSparse(x = data)) { mean.func <- .SparseMean var.func <- .SparseFeatureVar } else { mean.func <- .Mean var.func <- .FeatureVar } hvf.info <- SeuratObject::EmptyDF(n = nfeatures) # hvf.info$mean <- mean.func(data = data, margin = fmargin) hvf.info$mean <- rowMeans(x = data) hvf.info$variance <- var.func( data = data, mu = hvf.info$mean, fmargin = fmargin, verbose = verbose ) hvf.info$variance.expected <- 0L not.const <- hvf.info$variance > 0 fit <- loess( formula = log10(x = variance) ~ log10(x = mean), data = hvf.info[not.const, , drop = TRUE], span = span ) hvf.info$variance.expected[not.const] <- 10 ^ fit$fitted hvf.info$variance.standardized <- var.func( data = data, mu = hvf.info$mean, standardize = TRUE, sd = sqrt(x = hvf.info$variance.expected), clip = clip, verbose = verbose ) hvf.info$variable <- FALSE hvf.info$rank <- NA vs <- hvf.info$variance.standardized vs[vs == 0] <- NA vf <- head( x = order(hvf.info$variance.standardized, decreasing = TRUE), n = nselect ) hvf.info$variable[vf] <- TRUE hvf.info$rank[vf] <- seq_along(along.with = vf) # colnames(x = hvf.info) <- paste0('vst.', colnames(x = hvf.info)) return(hvf.info) } # hvf.methods$vst <- VST #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # S4 Methods #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ################################################################################ ################################# SCTransform ################################## ################################################################################ #' @importFrom SeuratObject Cells as.sparse #' #' @method SCTransform IterableMatrix #' @rdname SCTransform #' @concept preprocessing #' @export SCTransform.IterableMatrix <- function( object, cell.attr, reference.SCT.model = NULL, do.correct.umi = TRUE, ncells = 5000, residual.features = NULL, variable.features.n = 3000, variable.features.rv.th = 1.3, vars.to.regress = NULL, latent.data = NULL, do.scale = FALSE, do.center = TRUE, clip.range = c(-sqrt(x = ncol(x = object) / 30), sqrt(x = ncol(x = object) / 30)), vst.flavor = 'v2', conserve.memory = FALSE, return.only.var.genes = TRUE, seed.use = 1448145, verbose = TRUE, ... ) { if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } if (!is.null(reference.SCT.model)){ do.correct.umi <- FALSE do.center <- FALSE } sampled_cells <- sample.int(n = ncol(x = object), size = min(ncells, ncol(x = object))) umi <- as.sparse(x = object[, sampled_cells]) cell.attr <- cell.attr[colnames(x = umi),,drop=FALSE] vst.out <- SCTransform(object = umi, cell.attr = cell.attr, reference.SCT.model = reference.SCT.model, do.correct.umi = do.correct.umi, ncells = ncells, residual.features = residual.features, variable.features.n = variable.features.n, variable.features.rv.th = variable.features.rv.th, vars.to.regress = vars.to.regress, latent.data = latent.data, do.scale = do.scale, do.center = do.center, clip.range = clip.range, vst.flavor = vst.flavor, conserve.memory = conserve.memory, return.only.var.genes = return.only.var.genes, seed.use = seed.use, verbose = verbose, ...) if (!do.correct.umi) { vst.out$umi_corrected <- umi } return(vst.out) } #' @importFrom SeuratObject CreateAssayObject SetAssayData GetAssayData CreateSCTAssay <- function(vst.out, do.correct.umi, residual.type, clip.range){ residual.type <- vst.out[['residual_type']] %||% 'pearson' sct.method <- vst.out[['sct.method']] assay.out <- CreateAssayObject(counts = vst.out$umi_corrected) # set the variable genes VariableFeatures(object = assay.out) <- vst.out$variable_features # put log1p transformed counts in data assay.out <- SetAssayData( object = assay.out, layer = 'data', new.data = log1p(x = GetAssayData(object = assay.out, layer = 'counts')) ) scale.data <- vst.out$y assay.out <- SetAssayData( object = assay.out, layer = 'scale.data', new.data = scale.data ) vst.out$y <- NULL # save clip.range into vst model vst.out$arguments$sct.clip.range <- clip.range vst.out$arguments$sct.method <- sct.method Misc(object = assay.out, slot = 'vst.out') <- vst.out assay.out <- as(object = assay.out, Class = "SCTAssay") return (assay.out) } #' @importFrom SeuratObject Cells DefaultLayer DefaultLayer<- Features #' LayerData LayerData<- as.sparse #' #' @method SCTransform StdAssay #' @export #' SCTransform.StdAssay <- function( object, layer = 'counts', cell.attr = NULL, reference.SCT.model = NULL, do.correct.umi = TRUE, ncells = 5000, residual.features = NULL, variable.features.n = 3000, variable.features.rv.th = 1.3, vars.to.regress = NULL, latent.data = NULL, do.scale = FALSE, do.center = TRUE, clip.range = c(-sqrt(x = ncol(x = object) / 30), sqrt(x = ncol(x = object) / 30)), vst.flavor = 'v2', conserve.memory = FALSE, return.only.var.genes = TRUE, seed.use = 1448145, verbose = TRUE, ... ) { # Extract TK and TK. layer_names <- Layers(object, search = layer) input_list <- lapply( layer_names, function(layer_name) { layer_counts <- LayerData(object, layer = layer_name) layer_object <- CreateAssayObject(layer_counts) return (layer_object) } ) # Apply SCTransform to each assay in `input_list`. output_list <- lapply( input_list, function(input) { .cell.attr <- cell.attr[Cells(input), ] result <- SCTransform( input, cell.attr = .cell.attr, reference.SCT.model = reference.SCT.model, do.correct.umi = do.correct.umi, ncells = ncells, residual.features = residual.features, variable.features.n = variable.features.n, variable.features.rv.th = variable.features.rv.th, vars.to.regress = vars.to.regress, latent.data = latent.data, do.scale = do.scale, do.center = do.center, clip.range = clip.range, vst.flavor = vst.flavor, conserve.memory = conserve.memory, return.only.var.genes = return.only.var.genes, seed.use = seed.use, verbose = verbose, ... ) } ) # Merge output assays into one, or take the single result. if (length(output_list) > 1) { assay_out <- merge( output_list[[1]], output_list[-1] ) } else { assay_out <- output_list[[1]] } # Determine which features to include in the output's scale.data slot. if (return.only.var.genes) { # Take the union of variable features across all output assays/layers. var_features_union <- Reduce( union, lapply( output_list, function(output) { return(VariableFeatures(output)) } ) ) # Take the intersection of all features across all output assays/layers. all_features_intersect <- Reduce( intersect, lapply( output_list, function(output) { return(rownames(output)) } ) ) # Keep features that are variable in at least one output assay/layer but # present in all of them. scale_data_features <- intersect(all_features_intersect, var_features_union) } else { # Use every feature found in any output assay/layer, scale_data_features <- Reduce( union, lapply( output_list, function(output) { return(rownames(output)) } ) ) } # Extract residuals for the selected features and store them in # the outputs scaled.data slot. residuals <- suppressWarnings( FetchResiduals( object = assay_out, umi.object = object, features = scale_data_features, verbose = FALSE ) ) LayerData(assay_out, layer = "scale.data") <- residuals # Set the output's variable features. VariableFeatures(assay_out) <- VariableFeatures( assay_out, use.var.features = FALSE, nfeatures = variable.features.n ) return (assay_out) } #' Get the Pearson residuals from the specified assay and maybe recalculate #' any missing pearson residuals using the specified `umi.assay`. #' #' @param object A Seurat object. #' @param assay Name of the assay to fetch residuals for. #' @param umi.assay Name of the assay of the seurat object containing counts #' matrix to use when recalculating any missing residuals. #' @param layer The name of the layer(s) in `umi.assay` to use when #' recalculating any missing residuals. #' #' @export #' @concept preprocessing #' #' @method FetchResiduals Seurat #' @rdname FetchResiduals #' #' @seealso \code{\link[sctransform]{get_residuals}} #' FetchResiduals.Seurat <- function( object, features, assay = NULL, umi.assay = "RNA", layer = "counts", clip.range = NULL, reference.SCT.model = NULL, replace.value = FALSE, na.rm = TRUE, verbose = TRUE, ... ) { assay <- assay %||% DefaultAssay(object = object) if (IsSCT(assay = object[[assay]])) { object[[assay]] <- as(object[[assay]], 'SCTAssay') } if (!inherits(x = object[[assay]], what = "SCTAssay")) { stop(assay, " assay was not generated by SCTransform") } if (!umi.assay %in% Assays(object) || is.null(Layers(object[[umi.assay]], search = layer))) { return(LayerData(object[[assay]], layer = "scale.data")) } residuals <- FetchResiduals( object[[assay]], umi.object = object[[umi.assay]], features = features, layer = layer, clip.range = clip.range, reference.SCT.model = reference.SCT.model, replace.value = replace.value, na.rm = na.rm, verbose = verbose ) return(residuals) } #' Get the Pearson residuals from the assay and maybe recalculate #' any missing pearson residuals using the passed `umi.object`. #' #' This function calls sctransform::get_residuals. #' #' @param object An SCTAssay object. #' @param umi.object TK. #' @param features Name of features to fetch residuals for. #' @param layer The name of the layer(s) in `umi.assay` to use when #' recalculating any missing residuals. #' @param clip.range Numeric of length two specifying the min and max values the #' Pearson residual will be clipped to. #' @param reference.SCT.model If provided, the reference model will be used #' to recalculate missing residuals instead of the #' @param replace.value Recalculate residuals for all features, even if they are #' already present. Useful if you want to change the clip.range. #' @param na.rm For features where there is no feature model stored, return NA #' for residual value in scale.data when na.rm = FALSE. When na.rm is TRUE, only #' return residuals for features with a model stored for all cells. #' @param verbose Whether to print messages and progress bars #' #' @return A matrix containing the requested pearson residuals. #' #' @export #' @concept preprocessing #' @method FetchResiduals SCTAssay #' @rdname FetchResiduals #' #' @importFrom sctransform get_residuals #' @importFrom matrixStats rowAnyNAs #' FetchResiduals.SCTAssay <- function( object, umi.object, features, layer = "counts", clip.range = NULL, reference.SCT.model = NULL, replace.value = FALSE, na.rm = TRUE, verbose = TRUE, ... ) { sct.models <- levels(x = object) if (length(sct.models) == 1) { sct.models <- list(sct.models) } if (length(x = sct.models) == 0) { warning("SCT model not present in assay", call. = FALSE, immediate. = TRUE) return(LayerData(object, layer = "scale.data")) } possible.features <- Reduce(f = union, x = lapply(X = sct.models, FUN = function(x) { rownames(x = SCTResults(object = object, slot = "feature.attributes", model = x)) })) bad.features <- setdiff(x = features, y = possible.features) if (length(x = bad.features) > 0) { warning("The following requested features are not present in any models: ", paste(bad.features, collapse = ", "), call. = FALSE ) features <- intersect(x = features, y = possible.features) } features.orig <- features if (na.rm) { # only compute residuals when feature model info is present in all features <- names(x = which(x = table(unlist(x = lapply( X = sct.models, FUN = function(x) { rownames(x = SCTResults(object = object, slot = "feature.attributes", model = x)) } ))) == length(x = sct.models))) if (length(x = features) == 0) { return(LayerData(object, layer = "scale.data")) } } features <- intersect(x = features.orig, y = features) if (length(features) < 1){ warning("The following requested features are not present in all the models: ", paste(features.orig, collapse = ", "), call. = FALSE ) return(LayerData(object, layer = "scale.data")) } # Get all (count) layers layers <- Layers(object = umi.object, search = layer) # iterate over layer running sct model for each of the object names new.residuals <- list() total_cells <- 0 all_cells <- c() if (!is.null(x = reference.SCT.model)) { if (inherits(x = reference.SCT.model, what = "SCTModel")) { reference.SCT.model <- SCTModel_to_vst(SCTModel = reference.SCT.model) } if (is.list(x = reference.SCT.model) & inherits(x = reference.SCT.model[[1]], what = "SCTModel")) { stop("reference.SCT.model must be one SCTModel rather than a list of SCTModel") } if (reference.SCT.model$model_str != "y ~ log_umi") { stop("reference.SCT.model must be derived using default SCT regression formula, `y ~ log_umi`") } } for (i in seq_along(along.with = layers)) { l <- layers[i] sct_model <- sct.models[[i]] # these cells belong to this layer layer_cells <- Cells(x = umi.object, layer = l) all_cells <- c(all_cells, layer_cells) total_cells <- total_cells + length(layer_cells) # calculate residual using this model and these cells new.residuals[[i]] <- FetchResidualSCTModel( object = object, umi.object = umi.object, layer = l, layer.cells = layer_cells, SCTModel = sct_model, reference.SCT.model = reference.SCT.model, new_features = features, replace.value = replace.value, clip.range = clip.range, verbose = verbose ) } existing.data <- GetAssayData(object, layer = "scale.data") all.features <- union(x = rownames(x = existing.data), y = features) new.scale <- matrix( data = NA, nrow = length(x = all.features), ncol = total_cells, dimnames = list(all.features, all_cells) ) common_cells <- intersect(colnames(new.scale), colnames(existing.data)) if (nrow(x = existing.data) > 0) { new.scale[rownames(x = existing.data), common_cells] <- existing.data[, common_cells] } if (length(x = new.residuals) == 1 & is.list(x = new.residuals)) { new.residuals <- new.residuals[[1]] } else { new.residuals <- Reduce(cbind, new.residuals) } new.scale[rownames(x = new.residuals), colnames(x = new.residuals)] <- new.residuals if (na.rm) { new.scale <- new.scale[!rowAnyNAs(x = new.scale), ] } return(new.scale[features, ]) } #' Calculate pearson residuals of features not in the scale.data #' This function is the secondary function under FetchResiduals #' #' @param object An SCTAssay object #' @param umi.object The assay to use when recalculating any missing residuals. #' @param layer The name of the layer(s) in `umi.object` to use when #' recalculating any missing residuals. #' @param chunk_size Number of cells to load in memory for calculating #' residuals #' @param layer.cells Vector of cells to calculate the residual for. #' Default is NULL which uses all cells in the layer #' @param SCTModel Which SCTmodel to use from the object for calculating #' the residual. Will be ignored if reference.SCT.model is set #' @param reference.SCT.model If a reference SCT model should be used #' for calculating the residuals. When set to not NULL, ignores the `SCTModel` #' paramater. #' @param new_features A vector of features to calculate the residuals for #' @param clip.range Numeric of length two specifying the min and max values #' the Pearson residual will be clipped to. Useful if you want to change the #' clip.range. #' @param replace.value Whether to replace the value of residuals if it #' already exists #' @param verbose Whether to print messages and progress bars #' #' @return Returns a matrix containing centered pearson residuals of #' added features #' #' @importFrom sctransform get_residuals #' @importFrom Matrix colSums #' #' @keywords internal FetchResidualSCTModel <- function( object, umi.object, layer = "counts", chunk_size = 2000, layer.cells = NULL, SCTModel = NULL, reference.SCT.model = NULL, new_features = NULL, clip.range = NULL, replace.value = FALSE, verbose = FALSE ) { model.cells <- character() model.features <- Features(object) if (is.null(x = reference.SCT.model)){ clip.range <- clip.range %||% SCTResults(object, slot = "clips", model = SCTModel)$sct model.features <- rownames(x = SCTResults(object, slot = "feature.attributes", model = SCTModel)) model.cells <- Cells(x = slot(object, name = "SCTModel.list")[[SCTModel]]) sct.method <- SCTResults(object, slot = "arguments", model = SCTModel)$sct.method %||% "default" } layer.cells <- layer.cells %||% Cells(umi.object, layer = layer) if (!is.null(reference.SCT.model)) { # use reference SCT model sct.method <- "reference" } existing.scale.data <- NULL if (is.null(x=reference.SCT.model)){ existing.scale.data <- suppressWarnings(GetAssayData(object, layer = "scale.data")) } scale.data.cells <- colnames(x = existing.scale.data) scale.data.cells.common <- intersect(scale.data.cells, layer.cells) scale.data.cells <- intersect(x = scale.data.cells, y = scale.data.cells.common) if (length(x = setdiff(x = layer.cells, y = scale.data.cells)) == 0) { existing_features <- rownames(x = existing.scale.data) } else { existing_features <- character() } if (replace.value) { features_to_compute <- new_features } else { features_to_compute <- setdiff(x = new_features, y = existing_features) } if (length(features_to_compute)<1){ return (existing.scale.data[intersect(x = rownames(x = scale.data.cells), y = new_features),,drop=FALSE]) } if (is.null(x = reference.SCT.model) & length(x = setdiff(x = model.cells, y = scale.data.cells)) == 0) { existing_features <- names(x = which(x = ! apply( X = GetAssayData(object, layer = "scale.data")[, model.cells], MARGIN = 1, FUN = anyNA) )) } else { existing_features <- character() } if (sct.method == "reference.model") { if (verbose) { message("sct.model ", SCTModel, " is from reference, so no residuals will be recalculated") } features_to_compute <- character() } # these features do not have feature attriutes diff_features <- setdiff(x = features_to_compute, y = model.features) intersect_features <- intersect(x = features_to_compute, y = model.features) if (sct.method == "reference") { vst_out <- SCTModel_to_vst(SCTModel = reference.SCT.model) # override clip.range clip.range <- vst_out$arguments$sct.clip.range # get rid of the cell attributes vst_out$cell_attr <- NULL all.features <- intersect( x = rownames(x = vst_out$gene_attr), y = features_to_compute ) vst_out$gene_attr <- vst_out$gene_attr[all.features, , drop = FALSE] vst_out$model_pars_fit <- vst_out$model_pars_fit[all.features, , drop = FALSE] } else { vst_out <- SCTModel_to_vst(SCTModel = slot(object, name = "SCTModel.list")[[SCTModel]]) clip.range <- vst_out$arguments$sct.clip.range } clip.max <- max(clip.range) clip.min <- min(clip.range) layer.cells <- layer.cells %||% Cells(umi.object, layer = layer) if (length(x = diff_features) == 0) { counts <- LayerData( umi.object, layer = layer, cells = layer.cells ) cells.vector <- 1:length(x = layer.cells) cells.grid <- split(x = cells.vector, f = ceiling(x = seq_along(along.with = cells.vector)/chunk_size)) new_residuals <- list() for (i in seq_len(length.out = length(x = cells.grid))) { vp <- cells.grid[[i]] block <- counts[,vp, drop=FALSE] umi.all <- as.sparse(x = block) # calculate min_variance for get_residuals # required when vst_out$arguments$min_variance == "umi_median" # only calculated once if (i==1){ nz_median <- median(umi.all@x) min_var_custom <- (nz_median / 5)^2 } umi <- umi.all[features_to_compute, , drop = FALSE] ## Add cell_attr for missing cells cell_attr <- data.frame( umi = colSums(umi.all), log_umi = log10(x = colSums(umi.all)) ) rownames(cell_attr) <- colnames(umi.all) if (sct.method %in% c("reference.model", "reference")) { vst_out$cell_attr <- cell_attr[colnames(umi.all), ,drop=FALSE] } else { cell_attr_existing <- vst_out$cell_attr cells_missing <- setdiff(rownames(cell_attr), rownames(cell_attr_existing)) if (length(cells_missing)>0){ cell_attr_missing <- cell_attr[cells_missing, ,drop=FALSE] missing_cols <- setdiff(x = colnames(x = cell_attr_existing), y = colnames(x = cell_attr_missing)) if (length(x = missing_cols) > 0) { cell_attr_missing[, missing_cols] <- NA } vst_out$cell_attr <- rbind(cell_attr_existing, cell_attr_missing) vst_out$cell_attr <- vst_out$cell_attr[colnames(umi), , drop=FALSE] } } if (verbose) { if (sct.method == "reference.model") { message("using reference sct model") } else { message("sct.model: ", SCTModel, " on ", ncol(x = umi), " cells: ", colnames(x = umi.all)[1], " .. ", colnames(x = umi.all)[ncol(umi.all)]) } } if (vst_out$arguments$min_variance == "umi_median"){ min_var <- min_var_custom } else { min_var <- vst_out$arguments$min_variance } if (nrow(umi)>0){ vst_out.tmp <- vst_out vst_out.tmp$cell_attr <- vst_out.tmp$cell_attr[colnames(x = umi),] new_residual <- get_residuals( vst_out = vst_out.tmp, umi = umi, residual_type = "pearson", min_variance = min_var, res_clip_range = c(clip.min, clip.max), verbosity = as.numeric(x = verbose) * 2 ) } else { return(matrix( data = NA, nrow = length(x = features_to_compute), ncol = length(x = colnames(umi.all)), dimnames = list(features_to_compute, colnames(umi.all)) )) } new_residual <- as.matrix(x = new_residual) new_residuals[[i]] <- new_residual } new_residual <- do.call(what = cbind, args = new_residuals) # centered data if no reference model is provided if (is.null(x = reference.SCT.model)){ new_residual <- new_residual - rowMeans(x = new_residual) } else { # subtract residual mean from reference model if (verbose){ message("Using residual mean from reference for centering") } vst_out <- SCTModel_to_vst(SCTModel = reference.SCT.model) ref.residuals.mean <- vst_out$gene_attr[rownames(x = new_residual),"residual_mean"] new_residual <- sweep( x = new_residual, MARGIN = 1, STATS = ref.residuals.mean, FUN = "-" ) } # return (new_residuals) } else { # Some features do not exist warning( "In the SCTModel ", SCTModel, ", the following ", length(x = diff_features), " features do not exist in the counts slot: ", paste(diff_features, collapse = ", ") ) if (length(x = intersect_features) == 0) { # No features exist return(matrix( data = NA, nrow = length(x = features_to_compute), ncol = length(x = model.cells), dimnames = list(features_to_compute, model.cells) )) } } old.features <- setdiff(x = new_features, y = features_to_compute) if (length(x = old.features) > 0) { old_residuals <- GetAssayData(object, layer = "scale.data")[old.features, model.cells, drop = FALSE] new_residual <- rbind(new_residual, old_residuals)[new_features, ] } return(new_residual) } #' @importFrom sctransform get_residuals GetResidualsChunked <- function(vst_out, layer.counts, residual_type, min_variance, res_clip_range, verbose, chunk_size=5000) { if (inherits(x = layer.counts, what = 'V3Matrix')) { residuals <- get_residuals( vst_out = vst_out, umi = layer.counts, residual_type = residual_type, min_variance = min_variance, res_clip_range = res_clip_range, verbosity = as.numeric(x = verbose) * 2 ) } else if (inherits(x = layer.counts, what = "IterableMatrix")) { cells.vector <- 1:ncol(x = layer.counts) residuals.list <- list() cells.grid <- split(x = cells.vector, f = ceiling(x = seq_along(along.with = cells.vector)/chunk_size)) for (i in seq_len(length.out = length(x = cells.grid))) { vp <- cells.grid[[i]] counts.vp <- as.sparse(x = layer.counts[, vp]) vst.out <- vst_out vst.out$cell_attr <- vst.out$cell_attr[colnames(x = counts.vp),,drop=FALSE] residuals.list[[i]] <- get_residuals( vst_out = vst.out, umi = counts.vp, residual_type = residual_type, min_variance = min_variance, res_clip_range = res_clip_range, verbosity = as.numeric(x = verbose) * 2 ) } residuals <- Reduce(f = cbind, x = residuals.list) } else { stop("Data type not supported") } return (residuals) } #' temporal function to get residuals from reference #' @param object A seurat object #' @param reference.SCT.model a reference SCT model that should be used #' for calculating the residuals #' @param features Names of features to compute #' @param nCount_UMI UMI counts. If not specified, defaults to #' column sums of object #' @param verbose Whether to print messages and progress bars #' @importFrom sctransform get_residuals #' @importFrom Matrix colSums #' #' @keywords internal FetchResiduals_reference <- function(object, reference.SCT.model = NULL, features = NULL, nCount_UMI = NULL, verbose = FALSE) { ## Add cell_attr for missing cells nCount_UMI <- nCount_UMI %||% colSums(object) cell_attr <- data.frame( umi = nCount_UMI, log_umi = log10(x = nCount_UMI) ) features_to_compute <- features features_to_compute <- intersect(features_to_compute, rownames(object)) vst_out <- SCTModel_to_vst(SCTModel = reference.SCT.model) # override clip.range clip.range <- vst_out$arguments$sct.clip.range # get rid of the cell attributes vst_out$cell_attr <- NULL all.features <- intersect( x = rownames(x = vst_out$gene_attr), y = features_to_compute ) vst_out$gene_attr <- vst_out$gene_attr[all.features, , drop = FALSE] vst_out$model_pars_fit <- vst_out$model_pars_fit[all.features, , drop = FALSE] clip.max <- max(clip.range) clip.min <- min(clip.range) umi <- object[features_to_compute, , drop = FALSE] rownames(cell_attr) <- colnames(object) vst_out$cell_attr <- cell_attr if (verbose) { message("using reference sct model") } if (vst_out$arguments$min_variance == "umi_median"){ nz_median <- 1 min_var_custom <- (nz_median / 5)^2 min_var <- min_var_custom } else { min_var <- vst_out$arguments$min_variance } new_residual <- get_residuals( vst_out = vst_out, umi = umi, residual_type = "pearson", min_variance = min_var, verbosity = as.numeric(x = verbose) * 2 ) ref.residuals.mean <- vst_out$gene_attr[rownames(x = new_residual),"residual_mean"] new_residual <- sweep( x = new_residual, MARGIN = 1, STATS = ref.residuals.mean, FUN = "-" ) new_residual <- MinMax(data = new_residual, min = clip.min, max = clip.max) return(new_residual) } #' Find variable features based on mean.var.plot #' #' @param data Data matrix #' @param nselect Number of features to select based on dispersion values #' @param verbose Whether to print messages and progress bars #' @param mean.cutoff Numeric of length two specifying the min and max values #' @param dispersion.cutoff Numeric of length two specifying the min and max values #' #' @keywords internal #' MVP <- function( data, verbose = TRUE, nselect = 2000L, mean.cutoff = c(0.1, 8), dispersion.cutoff = c(1, Inf), ... ) { hvf.info <- DISP(data = data, nselect = nselect, verbose = verbose) hvf.info$variable <- FALSE hvf.info$rank <- NA hvf.info <- hvf.info[order(hvf.info$mvp.dispersion, decreasing = TRUE), , drop = FALSE] means.use <- (hvf.info[, 1] > mean.cutoff[1]) & (hvf.info[, 1] < mean.cutoff[2]) dispersions.use <- (hvf.info[, 3] > dispersion.cutoff[1]) & (hvf.info[, 3] < dispersion.cutoff[2]) hvf.info[which(x = means.use & dispersions.use), 'variable'] <- TRUE rank.rows <- rownames(x = hvf.info)[which(x = means.use & dispersions.use)] selected.indices <- which(rownames(x = hvf.info) %in% rank.rows) hvf.info$rank[selected.indices] <- seq_along(selected.indices) hvf.info <- hvf.info[order(as.numeric(row.names(hvf.info))), ] # hvf.info[hvf.info$variable,'rank'] <- rank(x = hvf.info[hvf.info$variable,'rank']) # hvf.info[!hvf.info$variable,'rank'] <- NA return(hvf.info) } Seurat/R/integration5.R0000644000176200001440000006474215056057544014501 0ustar liggesusers#' @include zzz.R #' @include generics.R #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Harmony Integration #' #' @param object An \code{\link[SeuratObject]{Assay5}} object # @param assay Name of \code{object} in the containing \code{Seurat} object #' @param orig A \link[SeuratObject:DimReduc]{dimensional reduction} to correct #' @param features Ignored #' @param scale.layer Ignored #' @param new.reduction Name of new integrated dimensional reduction #' @param layers Ignored #' @param key Key for Harmony dimensional reduction #' @param npcs If doing PCA on input matrix, number of PCs to compute #' @param theta Diversity clustering penalty parameter #' @param lambda Ridge regression penalty parameter #' @param sigma Width of soft kmeans clusters #' @param nclust Number of clusters in model #' @param tau Protection against overclustering small datasets with large ones #' @param block.size What proportion of cells to update during clustering #' @param max.iter.harmony Maximum number of rounds to run Harmony #' @param max.iter.cluster Maximum number of rounds to run clustering at each round of Harmony #' @param epsilon.cluster Convergence tolerance for clustering round of Harmony #' @param epsilon.harmony Convergence tolerance for Harmony #' @param verbose Whether to print progress messages. TRUE to print, FALSE to suppress #' @param ... Ignored #' #' @return ... #' #' @note This function requires the #' \href{https://cran.r-project.org/package=harmony}{\pkg{harmony}} package #' to be installed #' # @templateVar pkg harmony # @template note-reqdpkg #' #' @examples #' \dontrun{ #' # Preprocessing #' obj <- SeuratData::LoadData("pbmcsca") #' obj[["RNA"]] <- split(obj[["RNA"]], f = obj$Method) #' obj <- NormalizeData(obj) #' obj <- FindVariableFeatures(obj) #' obj <- ScaleData(obj) #' obj <- RunPCA(obj) #' #' # After preprocessing, we integrate layers with added parameters specific to Harmony: #' obj <- IntegrateLayers(object = obj, method = HarmonyIntegration, orig.reduction = "pca", #' new.reduction = 'harmony', verbose = FALSE) #' #' # Modifying Parameters #' # We can also add arguments specific to Harmony such as theta, to give more diverse clusters #' obj <- IntegrateLayers(object = obj, method = HarmonyIntegration, orig.reduction = "pca", #' new.reduction = 'harmony', verbose = FALSE, theta = 3) #' # Integrating SCTransformed data #' obj <- SCTransform(object = obj) #' obj <- IntegrateLayers(object = obj, method = HarmonyIntegration, #' orig.reduction = "pca", new.reduction = 'harmony', #' assay = "SCT", verbose = FALSE) #' } #' #' #' @export #' #' @concept integration #' #' @seealso \code{\link[harmony:HarmonyMatrix]{harmony::HarmonyMatrix}()} #' HarmonyIntegration <- function( object, orig, features = NULL, scale.layer = 'scale.data', new.reduction = 'harmony', layers = NULL, npcs = NULL, key = 'harmony_', theta = NULL, lambda = NULL, sigma = 0.1, nclust = NULL, tau = 0, block.size = 0.05, max.iter.harmony = 10L, max.iter.cluster = 20L, epsilon.cluster = 1e-05, epsilon.harmony = 0.01, verbose = TRUE, ... ) { # If the `features` param has been set, inform the user that is ignored. if (!is.null(features)) { inform( "The `features` argument is ignored by `HarmonyIntegration`.", .frequency = "once", .frequency_id = "HarmonyIntegration@features" ) } # If the `npcs` param has been set, inform the user that is ignored. if (!is.null(npcs)) { inform( "The `npcs` argument is ignored by `HarmonyIntegration`.", .frequency = "once", .frequency_id = "HarmonyIntegration@npcs" ) } check_installed( pkg = "harmony", reason = "for running integration with Harmony" ) if (!inherits(x = object, what = c('StdAssay', 'SCTAssay'))) { abort(message = "'object' must be a v5 or SCT assay") } else if (!inherits(x = orig, what = 'DimReduc')) { abort(message = "'orig' must be a dimensional reduction") } #create grouping variables groups <- CreateIntegrationGroups( object, layers = layers, scale.layer = scale.layer ) # Set up advanced Harmony options. advanced_options <- harmony::harmony_options( tau = tau, block.size = block.size, max.iter.cluster = max.iter.cluster, epsilon.cluster = epsilon.cluster, epsilon.harmony = epsilon.harmony ) # Run Harmony harmony.embed <- harmony::RunHarmony( data_mat = Embeddings(object = orig), meta_data = groups, vars_use = 'group', theta = theta, lambda = lambda, sigma = sigma, nclust = nclust, max_iter = max.iter.harmony, return_object = FALSE, verbose = verbose, .options = advanced_options ) rownames(harmony.embed) <- Cells(orig) # TODO add feature loadings from PCA dr <- suppressWarnings(expr = CreateDimReducObject( embeddings = harmony.embed, key = key, assay = DefaultAssay(object = orig) )) output.list <- list(dr) names(output.list) <- c(new.reduction) return(output.list) } attr(x = HarmonyIntegration, which = 'Seurat.method') <- 'integration' #' Seurat-CCA Integration #' #' @inheritParams RPCAIntegration #' @export #' @concept integration #' #' @examples #' \dontrun{ #' # Preprocessing #' obj <- SeuratData::LoadData("pbmcsca") #' obj[["RNA"]] <- split(obj[["RNA"]], f = obj$Method) #' obj <- NormalizeData(obj) #' obj <- FindVariableFeatures(obj) #' obj <- ScaleData(obj) #' obj <- RunPCA(obj) #' #' # After preprocessing, we integrate layers. #' obj <- IntegrateLayers(object = obj, method = CCAIntegration, #' orig.reduction = "pca", new.reduction = "integrated.cca", #' verbose = FALSE) #' #' # Modifying parameters #' # We can also specify parameters such as `k.anchor` to increase the strength of integration #' obj <- IntegrateLayers(object = obj, method = CCAIntegration, #' orig.reduction = "pca", new.reduction = "integrated.cca", #' k.anchor = 20, verbose = FALSE) #' #' # Integrating SCTransformed data #' obj <- SCTransform(object = obj) #' obj <- IntegrateLayers(object = obj, method = CCAIntegration, #' orig.reduction = "pca", new.reduction = "integrated.cca", #' assay = "SCT", verbose = FALSE) #' } #' CCAIntegration <- function( object = NULL, assay = NULL, layers = NULL, orig = NULL, new.reduction = 'integrated.dr', reference = NULL, features = NULL, normalization.method = c("LogNormalize", "SCT"), dims = 1:30, k.filter = NA, scale.layer = 'scale.data', dims.to.integrate = NULL, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, verbose = TRUE, ... ) { op <- options(Seurat.object.assay.version = "v3", Seurat.object.assay.calcn = FALSE) on.exit(expr = options(op), add = TRUE) normalization.method <- match.arg(arg = normalization.method) features <- features %||% SelectIntegrationFeatures5(object = object) assay <- assay %||% 'RNA' layers <- layers %||% Layers(object, search = 'data') if (normalization.method == 'SCT') { #create grouping variables groups <- CreateIntegrationGroups(object, layers = layers, scale.layer = scale.layer) object.sct <- CreateSeuratObject(counts = object, assay = 'SCT') object.sct$split <- groups[,1] object.list <- SplitObject(object = object.sct,split.by = 'split') object.list <- PrepSCTIntegration(object.list, anchor.features = features) } else { object.list <- list() for (i in seq_along(along.with = layers)) { if (inherits(x = object[layers[i]], what = "IterableMatrix")) { warning("Converting BPCells matrix to dgCMatrix for integration ", "as on-disk CCA Integration is not currently supported", call. = FALSE, immediate. = TRUE) counts <- as(object = object[layers[i]][features, ], Class = "dgCMatrix") } else { counts <- object[layers[i]][features, ] } object.list[[i]] <- CreateSeuratObject(counts = counts) if (inherits(x = object[scale.layer], what = "IterableMatrix")) { scale.data.layer <- as.matrix(object[scale.layer][features, Cells(object.list[[i]])]) object.list[[i]][["RNA"]]$scale.data <- scale.data.layer } else { object.list[[i]][["RNA"]]$scale.data <- object[scale.layer][features, Cells(object.list[[i]])] } object.list[[i]][['RNA']]$counts <- NULL } } anchor <- FindIntegrationAnchors(object.list = object.list, anchor.features = features, scale = FALSE, reduction = 'cca', normalization.method = normalization.method, dims = dims, k.filter = k.filter, reference = reference, verbose = verbose, ... ) suppressWarnings({ anchor@object.list <- lapply(anchor@object.list, function(x) { x <- DietSeurat(x, features = features[1:2]) return(x) }) }, classes = "dimWarning") object_merged <- IntegrateEmbeddings(anchorset = anchor, reductions = orig, new.reduction.name = new.reduction, dims.to.integrate = dims.to.integrate, k.weight = k.weight, weight.reduction = weight.reduction, sd.weight = sd.weight, sample.tree = sample.tree, preserve.order = preserve.order, verbose = verbose ) output.list <- list(object_merged[[new.reduction]]) names(output.list) <- c(new.reduction) return(output.list) } attr(x = CCAIntegration, which = 'Seurat.method') <- 'integration' #' Seurat-RPCA Integration #' #' @param object A \code{Seurat} object #' @param assay Name of \code{Assay} in the \code{Seurat} object #' @param layers Names of layers in \code{assay} #' @param orig A \link[SeuratObject]{DimReduc} to correct #' @param new.reduction Name of new integrated dimensional reduction #' @param reference A reference \code{Seurat} object #' @param features A vector of features to use for integration #' @param normalization.method Name of normalization method used: LogNormalize #' or SCT #' @param dims Dimensions of dimensional reduction to use for integration #' @param k.filter Number of anchors to filter #' @param scale.layer Name of scaled layer in \code{Assay} #' @param verbose Print progress #' @param ... Additional arguments passed to \code{FindIntegrationAnchors} #' #' @examples #' \dontrun{ #' # Preprocessing #' obj <- SeuratData::LoadData("pbmcsca") #' obj[["RNA"]] <- split(obj[["RNA"]], f = obj$Method) #' obj <- NormalizeData(obj) #' obj <- FindVariableFeatures(obj) #' obj <- ScaleData(obj) #' obj <- RunPCA(obj) #' #' # After preprocessing, we run integration #' obj <- IntegrateLayers(object = obj, method = RPCAIntegration, #' orig.reduction = "pca", new.reduction = 'integrated.rpca', #' verbose = FALSE) #' #' # Reference-based Integration #' # Here, we use the first layer as a reference for integraion #' # Thus, we only identify anchors between the reference and the rest of the datasets, #' # saving computational resources #' obj <- IntegrateLayers(object = obj, method = RPCAIntegration, #' orig.reduction = "pca", new.reduction = 'integrated.rpca', #' reference = 1, verbose = FALSE) #' #' # Modifying parameters #' # We can also specify parameters such as `k.anchor` to increase the strength of #' # integration #' obj <- IntegrateLayers(object = obj, method = RPCAIntegration, #' orig.reduction = "pca", new.reduction = 'integrated.rpca', #' k.anchor = 20, verbose = FALSE) #' #' # Integrating SCTransformed data #' obj <- SCTransform(object = obj) #' obj <- IntegrateLayers(object = obj, method = RPCAIntegration, #' orig.reduction = "pca", new.reduction = 'integrated.rpca', #' assay = "SCT", verbose = FALSE) #' } #' #' @inheritParams FindIntegrationAnchors #' @inheritParams IntegrateEmbeddings #' @param ... Arguments passed on to \code{FindIntegrationAnchors} #' @export #' #' @concept utilities #' RPCAIntegration <- function( object = NULL, assay = NULL, layers = NULL, orig = NULL, new.reduction = 'integrated.dr', reference = NULL, features = NULL, normalization.method = c("LogNormalize", "SCT"), dims = 1:30, k.filter = NA, scale.layer = 'scale.data', dims.to.integrate = NULL, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, verbose = TRUE, ... ) { op <- options(Seurat.object.assay.version = "v3", Seurat.object.assay.calcn = FALSE) on.exit(expr = options(op), add = TRUE) normalization.method <- match.arg(arg = normalization.method) features <- features %||% SelectIntegrationFeatures5(object = object) assay <- assay %||% 'RNA' layers <- layers %||% Layers(object = object, search = 'data') #check that there enough cells present ncells <- sapply(X = layers, FUN = function(x) {ncell <- dim(object[x])[2] return(ncell) }) if (min(ncells) < max(dims)) { abort(message = "At least one layer has fewer cells than dimensions specified, please lower 'dims' accordingly.") } if (normalization.method == 'SCT') { #create grouping variables groups <- CreateIntegrationGroups(object, layers = layers, scale.layer = scale.layer) object.sct <- CreateSeuratObject(counts = object, assay = 'SCT') object.sct$split <- groups[,1] object.list <- SplitObject(object = object.sct, split.by = 'split') object.list <- PrepSCTIntegration(object.list = object.list, anchor.features = features) object.list <- lapply(X = object.list, FUN = function(x) { x <- RunPCA(object = x, features = features, verbose = FALSE, npcs = max(dims)) return(x) } ) } else { object.list <- list() for (i in seq_along(along.with = layers)) { object.list[[i]] <- suppressMessages(suppressWarnings( CreateSeuratObject(counts = NULL, data = object[layers[i]][features,]) )) VariableFeatures(object = object.list[[i]]) <- features object.list[[i]] <- suppressWarnings(ScaleData(object = object.list[[i]], verbose = FALSE)) object.list[[i]] <- RunPCA(object = object.list[[i]], verbose = FALSE, npcs=max(dims)) suppressWarnings(object.list[[i]][['RNA']]$counts <- NULL) } } anchor <- FindIntegrationAnchors(object.list = object.list, anchor.features = features, scale = FALSE, reduction = 'rpca', normalization.method = normalization.method, dims = dims, k.filter = k.filter, reference = reference, verbose = verbose, ... ) slot(object = anchor, name = "object.list") <- lapply( X = slot( object = anchor, name = "object.list"), FUN = function(x) { suppressWarnings(expr = x <- DietSeurat(x, features = features[1:2])) return(x) }) object_merged <- IntegrateEmbeddings(anchorset = anchor, reductions = orig, new.reduction.name = new.reduction, dims.to.integrate = dims.to.integrate, k.weight = k.weight, weight.reduction = weight.reduction, sd.weight = sd.weight, sample.tree = sample.tree, preserve.order = preserve.order, verbose = verbose ) output.list <- list(object_merged[[new.reduction]]) names(output.list) <- c(new.reduction) return(output.list) } attr(x = RPCAIntegration, which = 'Seurat.method') <- 'integration' #' Seurat-Joint PCA Integration #' #' @inheritParams RPCAIntegration #' @inheritParams FindIntegrationAnchors #' @inheritParams IntegrateEmbeddings #' @param ... Arguments passed on to \code{FindIntegrationAnchors} #' @export #' @concept integration #' JointPCAIntegration <- function( object = NULL, assay = NULL, layers = NULL, orig = NULL, new.reduction = 'integrated.dr', reference = NULL, features = NULL, normalization.method = c("LogNormalize", "SCT"), dims = 1:30, k.anchor = 20, scale.layer = 'scale.data', dims.to.integrate = NULL, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, verbose = TRUE, ... ) { op <- options(Seurat.object.assay.version = "v3", Seurat.object.assay.calcn = FALSE) on.exit(expr = options(op), add = TRUE) normalization.method <- match.arg(arg = normalization.method) features <- features %||% SelectIntegrationFeatures5(object = object) features.diet <- features[1:2] assay <- assay %||% DefaultAssay(object) layers <- layers %||% Layers(object, search = 'data') if (normalization.method == 'SCT') { #create grouping variables groups <- CreateIntegrationGroups(object, layers = layers, scale.layer = scale.layer) object.sct <- CreateSeuratObject(counts = object, assay = 'SCT') object.sct <- DietSeurat(object = object.sct, features = features.diet) object.sct[['joint.pca']] <- CreateDimReducObject( embeddings = Embeddings(object = orig), assay = 'SCT', loadings = Loadings(orig), key = 'J_' ) object.sct$split <- groups[,1] object.list <- SplitObject(object = object.sct,split.by = 'split') object.list <- PrepSCTIntegration(object.list, anchor.features = features.diet) object.list <- lapply(object.list, function(x) { x[['SCT']]@SCTModel.list <- list() return(x) }) } else { object.list <- list() for (i in seq_along(along.with = layers)) { object.list[[i]] <- CreateSeuratObject(counts = object[layers[i]][features.diet, ] ) object.list[[i]][['RNA']]$counts <- NULL object.list[[i]][['joint.pca']] <- CreateDimReducObject( embeddings = Embeddings(object = orig)[Cells(object.list[[i]]),], assay = 'RNA', loadings = Loadings(orig), key = 'J_' ) } } anchor <- FindIntegrationAnchors(object.list = object.list, anchor.features = features.diet, scale = FALSE, reduction = 'jpca', normalization.method = normalization.method, dims = dims, k.anchor = k.anchor, k.filter = NA, reference = reference, verbose = verbose, ... ) object_merged <- IntegrateEmbeddings(anchorset = anchor, reductions = orig, new.reduction.name = new.reduction, dims.to.integrate = dims.to.integrate, k.weight = k.weight, weight.reduction = weight.reduction, sd.weight = sd.weight, sample.tree = sample.tree, preserve.order = preserve.order, verbose = verbose ) output.list <- list(object_merged[[new.reduction]]) names(output.list) <- c(new.reduction) return(output.list) } attr(x = JointPCAIntegration, which = 'Seurat.method') <- 'integration' #' Integrate Layers #' #' @param object A \code{\link[SeuratObject]{Seurat}} object #' @param method Integration method function #' @param orig.reduction Name of dimensional reduction for correction #' @param assay Name of assay for integration #' @param features A vector of features to use for integration #' @param layers Names of normalized layers in \code{assay} #' @param scale.layer Name(s) of scaled layer(s) in \code{assay} #' @param ... Arguments passed on to \code{method} #' #' @return \code{object} with integration data added to it #' #' @section Integration Method Functions: #' The following integration method functions are available: #' \Sexpr[stage=render,results=rd]{Seurat:::.rd_methods("integration")} #' #' @export #' #' @concept integration #' #' @seealso \link[Seurat:writing-integration]{Writing integration method functions} #' IntegrateLayers <- function( object, method, orig.reduction = 'pca', assay = NULL, features = NULL, layers = NULL, scale.layer = 'scale.data', ... ) { # Get the integration method if (is_quosure(x = method)) { method <- eval( expr = quo_get_expr(quo = method), envir = quo_get_env(quo = method) ) } if (is.character(x = method)) { method <- get(x = method) } if (!is.function(x = method)) { abort(message = "'method' must be a function for integrating layers") } # Check our assay assay <- assay %||% DefaultAssay(object = object) if (inherits(x = object[[assay]], what = 'SCTAssay')) { layers <- 'data' scale.layer <- 'scale.data' features <- features %||% SelectSCTIntegrationFeatures( object = object, assay = assay ) } else if (inherits(x = object[[assay]], what = 'StdAssay')) { layers <- Layers(object = object, assay = assay, search = layers %||% 'data') scale.layer <- Layers(object = object, search = scale.layer) features <- features %||% VariableFeatures( object = object, assay = assay, nfeatures = 2000L ) } else { abort(message = "'assay' must be a v5 or SCT assay") } if (!is.null(scale.layer)) { features <- intersect( x = features, y = Features(x = object, assay = assay, layer = scale.layer) ) } if (!length(x = features)) { abort(message = "None of the features provided are found in this assay") } if (!is.null(orig.reduction)) { # Check our dimensional reduction orig.reduction <- orig.reduction %||% DefaultDimReduc(object = object, assay = assay) if (!orig.reduction %in% Reductions(object = object)) { abort(message = paste(sQuote(x = orig.reduction), 'is not a dimensional reduction')) } obj.orig <- object[[orig.reduction]] if (is.null(x = DefaultAssay(object = obj.orig))) { DefaultAssay(object = obj.orig) <- assay } } # Run the integration method value <- method( object = object[[assay]], assay = assay, orig = obj.orig, layers = layers, scale.layer = scale.layer, features = features, ... ) for (i in names(x = value)) { object[[i]] <- value[[i]] } return(object) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Creates data.frame with cell group assignments for integration # uses SCT models if SCTAssay and layers otherwise CreateIntegrationGroups <- function(object, layers, scale.layer) { groups <- if (inherits(x = object, what = 'SCTAssay')) { df <- SeuratObject::EmptyDF(n = ncol(x = object)) row.names(x = df) <- colnames(x = object) for (model in levels(x = object)) { cc <- Cells(x = object, layer = model) df[cc, "group"] <- model } df } else if (length(x = layers) > 1L) { cmap <- slot(object = object, name = 'cells')[, layers] as.data.frame(x = labels( object = cmap, values = Cells(x = object, layer = scale.layer) )) } names(x = groups) <- 'group' return(groups) } #' Writing Integration Method Functions #' #' Integration method functions can be written by anyone to implement any #' integration method in Seurat. These methods should expect to take a #' \link[SeuratObject:Assay5]{v5 assay} as input and return a named list of #' objects that can be added back to a \code{Seurat} object (eg. a #' \link[SeuratObject:DimReduc]{dimensional reduction} or cell-level meta data) #' #' @section Provided Parameters: #' Every integration method function should expect the following arguments: #' \itemize{ #' \item \dQuote{\code{object}}: an \code{\link[SeuratObject]{Assay5}} object # \item \dQuote{\code{assay}}: name of \code{object} in the original # \code{\link[SeuratObject]{Seurat}} object #' \item \dQuote{\code{orig}}: \link[SeuratObject:DimReduc]{dimensional #' reduction} to correct #' \item \dQuote{\code{layers}}: names of normalized layers in \code{object} #' \item \dQuote{\code{scale.layer}}: name(s) of scaled layer(s) in #' \code{object} #' \item \dQuote{\code{features}}: a vector of features for integration #' \item \dQuote{\code{groups}}: a one-column data frame with the groups for #' each cell in \code{object}; the column name will be \dQuote{group} #' } #' #' @section Method Discovery: #' The documentation for \code{\link{IntegrateLayers}()} will automatically #' link to integration method functions provided by packages in the #' \code{\link[base]{search}()} space. To make an integration method function #' discoverable by the documentation, simply add an attribute named #' \dQuote{\code{Seurat.method}} to the function with a value of #' \dQuote{\code{integration}} #' \preformatted{ #' attr(MyIntegrationFunction, which = "Seurat.method") <- "integration" #' } #' #' @keywords internal #' #' @concept integration #' #' @name writing-integration #' @rdname writing-integration #' #' @seealso \code{\link{IntegrateLayers}()} #' NULL Seurat/R/differential_expression.R0000644000176200001440000023760415070750476017003 0ustar liggesusers#' @include generics.R #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% globalVariables( names = c('myAUC', 'p_val', 'avg_logFC'), package = 'Seurat', add = TRUE ) #' Gene expression markers for all identity classes #' #' Finds markers (differentially expressed genes) for each of the identity classes in a dataset #' #' @inheritParams FindMarkers #' @param node A node to find markers for and all its children; requires #' \code{\link{BuildClusterTree}} to have been run previously; replaces \code{FindAllMarkersNode} #' @param return.thresh Only return markers that have a p-value < return.thresh, or a power > return.thresh (if the test is ROC) #' #' @return Matrix containing a ranked list of putative markers, and associated #' statistics (p-values, ROC score, etc.) #' #' @importFrom stats setNames #' #' @export #' #' @aliases FindAllMarkersNode #' @concept differential_expression #' #' @examples #' data("pbmc_small") #' # Find markers for all clusters #' all.markers <- FindAllMarkers(object = pbmc_small) #' head(x = all.markers) #' \dontrun{ #' # Pass a value to node as a replacement for FindAllMarkersNode #' pbmc_small <- BuildClusterTree(object = pbmc_small) #' all.markers <- FindAllMarkers(object = pbmc_small, node = 4) #' head(x = all.markers) #' } #' FindAllMarkers <- function( object, assay = NULL, features = NULL, group.by = NULL, logfc.threshold = 0.1, test.use = 'wilcox', slot = 'data', min.pct = 0.01, min.diff.pct = -Inf, node = NULL, verbose = TRUE, only.pos = FALSE, max.cells.per.ident = Inf, random.seed = 1, latent.vars = NULL, min.cells.feature = 3, min.cells.group = 3, mean.fxn = NULL, fc.name = NULL, base = 2, return.thresh = 1e-2, densify = FALSE, ... ) { MapVals <- function(vec, from, to) { vec2 <- setNames(object = to, nm = from)[as.character(x = vec)] vec2[is.na(x = vec2)] <- vec[is.na(x = vec2)] return(unname(obj = vec2)) } if ((test.use == "roc") && (return.thresh == 1e-2)) { return.thresh <- 0.7 } if (is.null(x = node)) { if (!is.null(x = group.by) && !identical(x = group.by, y = "ident")) { if (length(x = group.by) == 1 && ! group.by %in% colnames(x = object@meta.data)) { stop("'", group.by, "' not found in object metadata") } Idents(object = object) <- group.by } idents.all <- sort(x = unique(x = Idents(object = object))) } else { if (!requireNamespace("ape", quietly = TRUE)) { stop(cluster.ape, call. = FALSE) } if (!is.null(group.by)) { warning( paste0( "The `group.by` parameter for `FindAllMarkers` ", "is ignored when `node` is set." ) ) } tree <- Tool(object = object, slot = 'BuildClusterTree') if (is.null(x = tree)) { stop("Please run 'BuildClusterTree' before finding markers on nodes") } descendants <- DFT(tree = tree, node = node, include.children = TRUE) all.children <- sort(x = tree$edge[, 2][!tree$edge[, 2] %in% tree$edge[, 1]]) descendants <- MapVals( vec = descendants, from = all.children, to = tree$tip.label ) drop.children <- setdiff(x = tree$tip.label, y = descendants) keep.children <- setdiff(x = tree$tip.label, y = drop.children) orig.nodes <- c( node, as.numeric(x = setdiff(x = descendants, y = keep.children)) ) tree <- ape::drop.tip(phy = tree, tip = drop.children) new.nodes <- unique(x = tree$edge[, 1, drop = TRUE]) idents.all <- (tree$Nnode + 2):max(tree$edge) } genes.de <- list() messages <- list() for (i in 1:length(x = idents.all)) { if (verbose) { message("Calculating cluster ", idents.all[i]) } genes.de[[i]] <- tryCatch( expr = { FindMarkers( object = object, assay = assay, ident.1 = if (is.null(x = node)) { idents.all[i] } else { tree }, ident.2 = if (is.null(x = node)) { NULL } else { idents.all[i] }, features = features, logfc.threshold = logfc.threshold, test.use = test.use, slot = slot, min.pct = min.pct, min.diff.pct = min.diff.pct, verbose = verbose, only.pos = only.pos, max.cells.per.ident = max.cells.per.ident, random.seed = random.seed, latent.vars = latent.vars, min.cells.feature = min.cells.feature, min.cells.group = min.cells.group, mean.fxn = mean.fxn, fc.name = fc.name, base = base, densify = densify, ... ) }, error = function(cond) { return(cond$message) } ) if (is.character(x = genes.de[[i]])) { messages[[i]] <- genes.de[[i]] genes.de[[i]] <- NULL } } gde.all <- data.frame() for (i in 1:length(x = idents.all)) { if (is.null(x = unlist(x = genes.de[i]))) { next } gde <- genes.de[[i]] if (nrow(x = gde) > 0) { if (test.use == "roc") { gde <- subset( x = gde, subset = (myAUC > return.thresh | myAUC < (1 - return.thresh)) ) } else if (is.null(x = node) || test.use %in% c('bimod', 't')) { gde <- gde[order(gde$p_val, -abs(gde$pct.1-gde$pct.2)), ] gde <- subset(x = gde, subset = p_val < return.thresh) } if (nrow(x = gde) > 0) { gde$cluster <- idents.all[i] gde$gene <- rownames(x = gde) } if (nrow(x = gde) > 0) { gde.all <- rbind(gde.all, gde) } } } if ((only.pos) && nrow(x = gde.all) > 0) { return(subset(x = gde.all, subset = gde.all[, 2] > 0)) } rownames(x = gde.all) <- make.unique(names = as.character(x = gde.all$gene)) if (nrow(x = gde.all) == 0) { warning("No DE genes identified", call. = FALSE, immediate. = TRUE) } if (length(x = messages) > 0) { warning("The following tests were not performed: ", call. = FALSE, immediate. = TRUE) for (i in 1:length(x = messages)) { if (!is.null(x = messages[[i]])) { warning("When testing ", idents.all[i], " versus all:\n\t", messages[[i]], call. = FALSE, immediate. = TRUE) } } } if (!is.null(x = node)) { gde.all$cluster <- MapVals( vec = gde.all$cluster, from = new.nodes, to = orig.nodes ) } return(gde.all) } #' Finds markers that are conserved between the groups #' #' @inheritParams FindMarkers #' @param ident.1 Identity class to define markers for #' @param ident.2 A second identity class for comparison. If NULL (default) - #' use all other cells for comparison. #' @param grouping.var grouping variable #' @param assay of assay to fetch data for (default is RNA) #' @param meta.method method for combining p-values. Should be a function from #' the metap package (NOTE: pass the function, not a string) #' @param \dots parameters to pass to FindMarkers #' #' @return data.frame containing a ranked list of putative conserved markers, and #' associated statistics (p-values within each group and a combined p-value #' (such as Fishers combined p-value or others from the metap package), #' percentage of cells expressing the marker, average differences). Name of group is appended to each #' associated output column (e.g. CTRL_p_val). If only one group is tested in the grouping.var, max #' and combined p-values are not returned. #' #' @export #' @concept differential_expression #' #' @examples #' \dontrun{ #' data("pbmc_small") #' pbmc_small #' # Create a simulated grouping variable #' pbmc_small[['groups']] <- sample(x = c('g1', 'g2'), size = ncol(x = pbmc_small), replace = TRUE) #' FindConservedMarkers(pbmc_small, ident.1 = 0, ident.2 = 1, grouping.var = "groups") #' } #' FindConservedMarkers <- function( object, ident.1, ident.2 = NULL, grouping.var, assay = 'RNA', slot = 'data', min.cells.group = 3, meta.method = metap::minimump, verbose = TRUE, ... ) { metap.installed <- requireNamespace("metap", quietly = TRUE) if (!metap.installed[1]) { stop( "Please install the metap package to use FindConservedMarkers.", "\nThis can be accomplished with the following commands: ", "\n----------------------------------------", "\ninstall.packages('BiocManager')", "\nBiocManager::install('multtest')", "\ninstall.packages('metap')", "\n----------------------------------------", call. = FALSE ) } if (!is.function(x = meta.method)) { stop("meta.method should be a function from the metap package. Please see https://cran.r-project.org/web/packages/metap/metap.pdf for a detailed description of the available functions.") } object.var <- FetchData(object = object, vars = grouping.var) object <- SetIdent( object = object, cells = colnames(x = object), value = paste(Idents(object = object), object.var[, 1], sep = "_") ) levels.split <- names(x = sort(x = table(object.var[, 1]))) num.groups <- length(levels.split) cells <- list() for (i in 1:num.groups) { cells[[i]] <- rownames( x = object.var[object.var[, 1] == levels.split[i], , drop = FALSE] ) } marker.test <- list() # do marker tests ident.2.save <- ident.2 for (i in 1:num.groups) { level.use <- levels.split[i] ident.use.1 <- paste(ident.1, level.use, sep = "_") ident.use.1.exists <- ident.use.1 %in% Idents(object = object) if (!all(ident.use.1.exists)) { bad.ids <- ident.1[!ident.use.1.exists] warning( "Identity: ", paste(bad.ids, collapse = ", "), " not present in group ", level.use, ". Skipping ", level.use, call. = FALSE, immediate. = TRUE ) next } ident.2 <- ident.2.save cells.1 <- WhichCells(object = object, idents = ident.use.1) if (length(cells.1) < min.cells.group) { warning( level.use, " has fewer than ", min.cells.group, " cells in Identity: ", paste(ident.1, collapse = ", "), ". Skipping ", level.use, call. = FALSE, immediate. = TRUE ) next } if (is.null(x = ident.2)) { cells.2 <- setdiff(x = cells[[i]], y = cells.1) ident.use.2 <- names(x = which(x = table(Idents(object = object)[cells.2]) > 0)) ident.2 <- gsub(pattern = paste0("_", level.use), replacement = "", x = ident.use.2) if (length(x = ident.use.2) == 0) { stop(paste("Only one identity class present:", ident.1)) } } else { ident.use.2 <- paste(ident.2, level.use, sep = "_") } if (verbose) { message( "Testing group ", level.use, ": (", paste(ident.1, collapse = ", "), ") vs (", paste(ident.2, collapse = ", "), ")" ) } ident.use.2.exists <- ident.use.2 %in% Idents(object = object) if (!all(ident.use.2.exists)) { bad.ids <- ident.2[!ident.use.2.exists] warning( "Identity: ", paste(bad.ids, collapse = ", "), " not present in group ", level.use, ". Skipping ", level.use, call. = FALSE, immediate. = TRUE ) next } marker.test[[i]] <- FindMarkers( object = object, assay = assay, slot = slot, ident.1 = ident.use.1, ident.2 = ident.use.2, verbose = verbose, ... ) names(x = marker.test)[i] <- levels.split[i] } marker.test <- Filter(f = Negate(f = is.null), x = marker.test) genes.conserved <- Reduce( f = intersect, x = lapply( X = marker.test, FUN = function(x) { return(rownames(x = x)) } ) ) markers.conserved <- list() for (i in 1:length(x = marker.test)) { markers.conserved[[i]] <- marker.test[[i]][genes.conserved, ] colnames(x = markers.conserved[[i]]) <- paste( names(x = marker.test)[i], colnames(x = markers.conserved[[i]]), sep = "_" ) } markers.combined <- Reduce(cbind, markers.conserved) pval.codes <- colnames(x = markers.combined)[grepl(pattern = "*_p_val$", x = colnames(x = markers.combined))] if (length(x = pval.codes) > 1) { markers.combined$max_pval <- apply( X = markers.combined[, pval.codes, drop = FALSE], MARGIN = 1, FUN = max ) combined.pval <- data.frame(cp = apply( X = markers.combined[, pval.codes, drop = FALSE], MARGIN = 1, FUN = function(x) { clean_x <- x[!is.na(x) & !is.nan(x)] return(meta.method(clean_x)$p) } )) meta.method.name <- as.character(x = formals()$meta.method) if (length(x = meta.method.name) == 3) { meta.method.name <- meta.method.name[3] } colnames(x = combined.pval) <- paste0(meta.method.name, "_p_val") markers.combined <- cbind(markers.combined, combined.pval) markers.combined <- markers.combined[order(markers.combined[, paste0(meta.method.name, "_p_val")]), ] } else { warning("Only a single group was tested", call. = FALSE, immediate. = TRUE) } return(markers.combined) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @param slot Slot to pull data from; note that if \code{test.use} is #' "negbinom", "poisson", or "DESeq2", \code{slot} will be set to "counts" #' @param cells.1 Vector of cell names belonging to group 1 #' @param cells.2 Vector of cell names belonging to group 2 #' @param features Genes to test. Default is to use all genes #' @param slot Slot to pull data from; note that if \code{test.use} is #' "negbinom", "poisson", or "DESeq2", \code{slot} will be set to "counts" #' @param logfc.threshold Limit testing to genes which show, on average, at least #' X-fold difference (log-scale) between the two groups of cells. Default is 0.1 #' Increasing logfc.threshold speeds up the function, but can miss weaker signals. #' If the \code{slot} parameter is "scale.data" no filtering is performed. #' @param test.use Denotes which test to use. Available options are: #' \itemize{ #' \item{"wilcox"} : Identifies differentially expressed genes between two #' groups of cells using a Wilcoxon Rank Sum test (default); will use a fast #' implementation by Presto if installed #' \item{"wilcox_limma"} : Identifies differentially expressed genes between two #' groups of cells using the limma implementation of the Wilcoxon Rank Sum test; #' set this option to reproduce results from Seurat v4 #' \item{"bimod"} : Likelihood-ratio test for single cell gene expression, #' (McDavid et al., Bioinformatics, 2013) #' \item{"roc"} : Identifies 'markers' of gene expression using ROC analysis. #' For each gene, evaluates (using AUC) a classifier built on that gene alone, #' to classify between two groups of cells. An AUC value of 1 means that #' expression values for this gene alone can perfectly classify the two #' groupings (i.e. Each of the cells in cells.1 exhibit a higher level than #' each of the cells in cells.2). An AUC value of 0 also means there is perfect #' classification, but in the other direction. A value of 0.5 implies that #' the gene has no predictive power to classify the two groups. Returns a #' 'predictive power' (abs(AUC-0.5) * 2) ranked matrix of putative differentially #' expressed genes. #' \item{"t"} : Identify differentially expressed genes between two groups of #' cells using the Student's t-test. #' \item{"negbinom"} : Identifies differentially expressed genes between two #' groups of cells using a negative binomial generalized linear model. #' Use only for UMI-based datasets #' \item{"poisson"} : Identifies differentially expressed genes between two #' groups of cells using a poisson generalized linear model. #' Use only for UMI-based datasets #' \item{"LR"} : Uses a logistic regression framework to determine differentially #' expressed genes. Constructs a logistic regression model predicting group #' membership based on each feature individually and compares this to a null #' model with a likelihood ratio test. #' \item{"MAST"} : Identifies differentially expressed genes between two groups #' of cells using a hurdle model tailored to scRNA-seq data. Utilizes the MAST #' package to run the DE testing. #' \item{"DESeq2"} : Identifies differentially expressed genes between two groups #' of cells based on a model using DESeq2 which uses a negative binomial #' distribution (Love et al, Genome Biology, 2014).This test does not support #' pre-filtering of genes based on average difference (or percent detection rate) #' between cell groups. However, genes may be pre-filtered based on their #' minimum detection rate (min.pct) across both cell groups. To use this method, #' please install DESeq2, using the instructions at #' https://bioconductor.org/packages/release/bioc/html/DESeq2.html #' } #' @param min.pct only test genes that are detected in a minimum fraction of #' min.pct cells in either of the two populations. Meant to speed up the function #' by not testing genes that are very infrequently expressed. Default is 0.01 #' @param min.diff.pct only test genes that show a minimum difference in the #' fraction of detection between the two groups. Set to -Inf by default #' @param verbose Print a progress bar once expression testing begins #' @param only.pos Only return positive markers (FALSE by default) #' @param max.cells.per.ident Down sample each identity class to a max number. #' Default is no downsampling. Not activated by default (set to Inf) #' @param random.seed Random seed for downsampling #' @param latent.vars Variables to test, used only when \code{test.use} is one of #' 'LR', 'negbinom', 'poisson', or 'MAST' #' @param min.cells.feature Minimum number of cells expressing the feature in at least one #' of the two groups, currently only used for poisson and negative binomial tests #' @param min.cells.group Minimum number of cells in one of the groups #' @param fc.results data.frame from FoldChange #' @param densify Convert the sparse matrix to a dense form before running the #' DE test. This can provide speedups but might require higher memory; default is FALSE #' #' #' @importFrom Matrix rowMeans #' @importFrom stats p.adjust #' #' @rdname FindMarkers #' @concept differential_expression #' @export #' @method FindMarkers default #' FindMarkers.default <- function( object, slot = "data", cells.1 = NULL, cells.2 = NULL, features = NULL, logfc.threshold = 0.1, test.use = "wilcox", min.pct = 0.01, min.diff.pct = -Inf, verbose = TRUE, only.pos = FALSE, max.cells.per.ident = Inf, random.seed = 1, latent.vars = NULL, min.cells.feature = 3, min.cells.group = 3, fc.results = NULL, densify = FALSE, ... ) { ValidateCellGroups( object = object, cells.1 = cells.1, cells.2 = cells.2, min.cells.group = min.cells.group ) features <- features %||% rownames(x = object) # reset parameters so no feature filtering is performed if (test.use %in% DEmethods_noprefilter()) { features <- rownames(x = object) min.diff.pct <- -Inf logfc.threshold <- 0 } # feature selection (based on percentages) alpha.min <- pmax(fc.results$pct.1, fc.results$pct.2) names(x = alpha.min) <- rownames(x = fc.results) features <- names(x = which(x = alpha.min >= min.pct)) if (length(x = features) == 0) { warning("No features pass min.pct threshold; returning empty data.frame") return(fc.results[features, ]) } alpha.diff <- alpha.min - pmin(fc.results$pct.1, fc.results$pct.2) features <- names( x = which(x = alpha.min >= min.pct & alpha.diff >= min.diff.pct) ) if (length(x = features) == 0) { warning("No features pass min.diff.pct threshold; returning empty data.frame") return(fc.results[features, ]) } # feature selection (based on logFC) if (slot != "scale.data") { total.diff <- fc.results[, 1] #first column is logFC names(total.diff) <- rownames(fc.results) features.diff <- if (only.pos) { names(x = which(x = total.diff >= logfc.threshold)) } else { names(x = which(x = abs(x = total.diff) >= logfc.threshold)) } features <- intersect(x = features, y = features.diff) if (length(x = features) == 0) { warning("No features pass logfc.threshold threshold; returning empty data.frame") return(fc.results[features, ]) } } # subsample cell groups if they are too large if (max.cells.per.ident < Inf) { set.seed(seed = random.seed) if (length(x = cells.1) > max.cells.per.ident) { cells.1 <- sample(x = cells.1, size = max.cells.per.ident) } if (length(x = cells.2) > max.cells.per.ident) { cells.2 <- sample(x = cells.2, size = max.cells.per.ident) } if (!is.null(x = latent.vars)) { latent.vars <- latent.vars[c(cells.1, cells.2), , drop = FALSE] } } if (inherits(x = object, what = "IterableMatrix")){ if(test.use != "wilcox"){ stop("Differential expression with BPCells currently only supports the 'wilcox' method.", " Please rerun with test.use = 'wilcox'") } data.use <- object[features, c(cells.1, cells.2), drop = FALSE] groups <- c(rep("foreground", length(cells.1)), rep("background", length(cells.2))) de.results <- suppressMessages( BPCells::marker_features(data.use, group = groups, method = "wilcoxon") ) de.results <- subset(de.results, de.results$foreground == "foreground") de.results <- data.frame(feature = de.results$feature, p_val = de.results$p_val_raw) rownames(de.results) <- de.results$feature de.results$feature <- NULL } else { de.results <- PerformDE( object = object, cells.1 = cells.1, cells.2 = cells.2, features = features, test.use = test.use, verbose = verbose, min.cells.feature = min.cells.feature, latent.vars = latent.vars, densify = densify, ... ) } de.results <- cbind(de.results, fc.results[rownames(x = de.results), , drop = FALSE]) if (only.pos) { de.results <- de.results[de.results[, 2] > 0, , drop = FALSE] } if (test.use %in% DEmethods_nocorrect()) { de.results <- de.results[order(-de.results$power, -de.results[, 1]), ] } else { de.results <- de.results[order(de.results$p_val, -abs(de.results$pct.1-de.results$pct.2)), ] de.results$p_val_adj = p.adjust( p = de.results$p_val, method = "bonferroni", n = nrow(x = object) ) } return(de.results) } #' @param fc.slot Slot used to calculate fold-change - will also affect the #' default for \code{mean.fxn}, see below for more details. #' @param pseudocount.use Pseudocount to add to averaged expression values when #' calculating logFC. 1 by default. #' @param norm.method Normalization method for fold change calculation when #' \code{slot} is \dQuote{\code{data}} #' @param mean.fxn Function to use for fold change or average difference calculation. #' The default depends on the the value of \code{fc.slot}: #' \itemize{ #' \item{"counts"} : difference in the log of the mean counts, with pseudocount. #' \item{"data"} : difference in the log of the average exponentiated data, with pseudocount. #' This adjusts for differences in sequencing depth between cells, and assumes that "data" #' has been log-normalized. #' \item{"scale.data"} : difference in the means of scale.data. #' } #' @param fc.name Name of the fold change, average difference, or custom function column #' in the output data.frame. If NULL, the fold change column will be named #' according to the logarithm base (eg, "avg_log2FC"), or if using the scale.data #' slot "avg_diff". #' @param base The base with respect to which logarithms are computed. #' #' @rdname FindMarkers #' @concept differential_expression #' @export #' @method FindMarkers Assay #' FindMarkers.Assay <- function( object, slot = "data", cells.1 = NULL, cells.2 = NULL, features = NULL, test.use = "wilcox", fc.slot = "data", pseudocount.use = 1, norm.method = NULL, mean.fxn = NULL, fc.name = NULL, base = 2, ... ) { data.slot <- ifelse( test = test.use %in% DEmethods_counts(), yes = "counts", no = slot ) if (length(x = Layers(object = object, search = slot)) > 1) { stop(slot, " layers are not joined. Please run JoinLayers") } data.use <- LayerData(object = object, layer = data.slot) fc.results <- FoldChange( object = object, slot = fc.slot, cells.1 = cells.1, cells.2 = cells.2, features = features, pseudocount.use = pseudocount.use, mean.fxn = mean.fxn, fc.name = fc.name, base = base, norm.method = norm.method ) de.results <- FindMarkers( object = data.use, cells.1 = cells.1, cells.2 = cells.2, features = features, test.use = test.use, fc.results = fc.results, ... ) return(de.results) } #' @method FindMarkers StdAssay #' @export #' FindMarkers.StdAssay <- FindMarkers.Assay #' @param recorrect_umi Recalculate corrected UMI counts using minimum of the #' median UMIs when performing DE using multiple SCT objects; default is TRUE #' #' @rdname FindMarkers #' @concept differential_expression #' @export #' @method FindMarkers SCTAssay #' FindMarkers.SCTAssay <- function( object, cells.1 = NULL, cells.2 = NULL, features = NULL, test.use = "wilcox", pseudocount.use = 1, slot = "data", fc.slot = "data", mean.fxn = NULL, fc.name = NULL, base = 2, recorrect_umi = TRUE, ... ) { data.slot <- ifelse( test = test.use %in% DEmethods_counts(), yes = "counts", no = slot ) if (test.use %in% DEmethods_counts()){ # set slot to counts if (slot !="counts") { message(paste0("Setting slot to counts for ", test.use, " (counts based test: ")) slot <- "counts" } } if (recorrect_umi && length(x = levels(x = object)) > 1) { cell_attributes <- SCTResults(object = object, slot = "cell.attributes") observed_median_umis <- lapply( X = cell_attributes, FUN = function(x) median(x[, "umi"]) ) model.list <- slot(object = object, "SCTModel.list") median_umi.status <- lapply(X = model.list, FUN = function(x) { return(tryCatch( expr = slot(object = x, name = 'median_umi'), error = function(...) {return(NULL)}) )}) if (any(is.null(unlist(median_umi.status)))){ stop("SCT assay does not contain median UMI information.", "Run `PrepSCTFindMarkers()` before running `FindMarkers()` or invoke `FindMarkers(recorrect_umi=FALSE)`.") } model_median_umis <- SCTResults(object = object, slot = "median_umi") min_median_umi <- min(unlist(x = observed_median_umis)) if (any(unlist(model_median_umis) != min_median_umi)){ stop("Object contains multiple models with unequal library sizes. Run `PrepSCTFindMarkers()` before running `FindMarkers()`.") } } data.use <- GetAssayData(object = object, layer = data.slot) # Default assumes the input is log1p(corrected counts) default.mean.fxn <- function(x) { return(log(x = (rowSums(x = expm1(x = x)) + pseudocount.use)/NCOL(x), base = base)) } mean.fxn <- mean.fxn %||% switch( EXPR = fc.slot, "counts" = function(x) { return(log(x = (rowSums(x = x) + pseudocount.use)/NCOL(x), base = base)) }, "scale.data" = rowMeans, default.mean.fxn ) fc.results <- FoldChange( object = object, slot = fc.slot, cells.1 = cells.1, cells.2 = cells.2, features = features, pseudocount.use = pseudocount.use, mean.fxn = mean.fxn, fc.name = fc.name, base = base ) de.results <- FindMarkers( object = data.use, cells.1 = cells.1, cells.2 = cells.2, features = features, test.use = test.use, fc.results = fc.results, ... ) return(de.results) } #' @importFrom Matrix rowMeans #' @rdname FindMarkers #' @concept differential_expression #' @export #' @method FindMarkers DimReduc #' FindMarkers.DimReduc <- function( object, cells.1 = NULL, cells.2 = NULL, features = NULL, logfc.threshold = 0.1, test.use = "wilcox", min.pct = 0.01, min.diff.pct = -Inf, verbose = TRUE, only.pos = FALSE, max.cells.per.ident = Inf, random.seed = 1, latent.vars = NULL, min.cells.feature = 3, min.cells.group = 3, densify = FALSE, mean.fxn = rowMeans, fc.name = NULL, ... ) { if (test.use %in% DEmethods_counts()) { stop("The following tests cannot be used for differential expression on a reduction as they assume a count model: ", paste(DEmethods_counts(), collapse=", ")) } data <- t(x = Embeddings(object = object)) ValidateCellGroups( object = data, cells.1 = cells.1, cells.2 = cells.2, min.cells.group = min.cells.group ) features <- features %||% rownames(x = data) # reset parameters so no feature filtering is performed if (test.use %in% DEmethods_noprefilter()) { features <- rownames(x = data) min.diff.pct <- -Inf logfc.threshold <- 0 } fc.results <- FoldChange( object = object, cells.1 = cells.1, cells.2 = cells.2, features = features, mean.fxn = mean.fxn, fc.name = fc.name ) # subsample cell groups if they are too large if (max.cells.per.ident < Inf) { set.seed(seed = random.seed) if (length(x = cells.1) > max.cells.per.ident) { cells.1 <- sample(x = cells.1, size = max.cells.per.ident) } if (length(x = cells.2) > max.cells.per.ident) { cells.2 <- sample(x = cells.2, size = max.cells.per.ident) } if (!is.null(x = latent.vars)) { latent.vars <- latent.vars[c(cells.1, cells.2), , drop = FALSE] } } de.results <- PerformDE( object = data, cells.1 = cells.1, cells.2 = cells.2, features = features, test.use = test.use, verbose = verbose, min.cells.feature = min.cells.feature, latent.vars = latent.vars, densify = densify, ... ) de.results <- cbind(de.results, fc.results) if (only.pos) { de.results <- de.results[de.results$avg_diff > 0, , drop = FALSE] } if (test.use %in% DEmethods_nocorrect()) { de.results <- de.results[order(-de.results$power, -de.results$avg_diff), ] } else { de.results <- de.results[order(de.results$p_val, -de.results$avg_diff), ] de.results$p_val_adj = p.adjust( p = de.results$p_val, method = "bonferroni", n = ncol(x = object) ) } return(de.results) } #' @param ident.1 Identity class to define markers for; pass an object of class #' \code{phylo} or 'clustertree' to find markers for a node in a cluster tree; #' passing 'clustertree' requires \code{\link{BuildClusterTree}} to have been run #' @param ident.2 A second identity class for comparison; if \code{NULL}, #' use all other cells for comparison; if an object of class \code{phylo} or #' 'clustertree' is passed to \code{ident.1}, must pass a node to find markers for #' @param group.by Regroup cells into a different identity class prior to #' performing differential expression (see example); \code{"ident"} to use Idents #' @param subset.ident Subset a particular identity class prior to regrouping. #' Only relevant if group.by is set (see example) #' @param assay Assay to use in differential expression testing #' @param reduction Reduction to use in differential expression testing - will #' test for DE on cell embeddings #' #' @rdname FindMarkers #' @concept differential_expression #' @export #' @method FindMarkers Seurat #' FindMarkers.Seurat <- function( object, ident.1 = NULL, ident.2 = NULL, latent.vars = NULL, group.by = NULL, subset.ident = NULL, assay = NULL, reduction = NULL, ... ) { if (!is.null(x = group.by) && !identical(x = group.by, y = "ident")) { if (!is.null(x = subset.ident)) { object <- subset(x = object, idents = subset.ident) } if (length(x = group.by) == 1 && ! group.by %in% colnames(x = object@meta.data)) { stop("'", group.by, "' not found in object metadata") } Idents(object = object) <- group.by } if (!is.null(x = assay) && !is.null(x = reduction)) { stop("Please only specify either assay or reduction.") } if (length(x = ident.1) == 0) { stop("At least 1 ident must be specified in `ident.1`") } # select which data to use if (is.null(x = reduction)) { assay <- assay %||% DefaultAssay(object = object) data.use <- object[[assay]] cellnames.use <- colnames(x = data.use) } else { data.use <- object[[reduction]] cellnames.use <- rownames(x = data.use) } cells <- IdentsToCells( object = object, ident.1 = ident.1, ident.2 = ident.2, cellnames.use = cellnames.use ) cells <- sapply( X = cells, FUN = intersect, y = cellnames.use, simplify = FALSE, USE.NAMES = TRUE ) if (!all(vapply(X = cells, FUN = length, FUN.VALUE = integer(length = 1L)))) { abort( message = "Cells in one or both identity groups are not present in the data requested" ) } # fetch latent.vars if (!is.null(x = latent.vars)) { latent.vars <- FetchData( object = object, vars = latent.vars, cells = c(cells$cells.1, cells$cells.2) ) } # check normalization method norm.command <- paste0("NormalizeData.", assay) norm.method <- if (norm.command %in% Command(object = object) && is.null(x = reduction)) { Command( object = object, command = norm.command, value = "normalization.method" ) } else if (length(x = intersect(x = c("FindIntegrationAnchors", "FindTransferAnchors"), y = Command(object = object)))) { command <- intersect(x = c("FindIntegrationAnchors", "FindTransferAnchors"), y = Command(object = object))[1] Command( object = object, command = command, value = "normalization.method" ) } else { NULL } de.results <- FindMarkers( object = data.use, latent.vars = latent.vars, cells.1 = cells$cells.1, cells.2 = cells$cells.2, norm.method = norm.method, ... ) return(de.results) } #' @param cells.1 Vector of cell names belonging to group 1 #' @param cells.2 Vector of cell names belonging to group 2 #' @param features Features to calculate fold change for. #' If NULL, use all features #' @importFrom Matrix rowSums #' @rdname FoldChange #' @concept differential_expression #' @export #' @method FoldChange default FoldChange.default <- function( object, cells.1, cells.2, mean.fxn, fc.name, features = NULL, ... ) { features <- features %||% rownames(x = object) # Calculate percent expressed thresh.min <- 0 pct.1 <- round( x = rowSums(x = object[features, cells.1, drop = FALSE] > thresh.min) / length(x = cells.1), digits = 3 ) pct.2 <- round( x = rowSums(x = object[features, cells.2, drop = FALSE] > thresh.min) / length(x = cells.2), digits = 3 ) # Calculate fold change data.1 <- mean.fxn(object[features, cells.1, drop = FALSE]) data.2 <- mean.fxn(object[features, cells.2, drop = FALSE]) fc <- (data.1 - data.2) fc.results <- as.data.frame(x = cbind(fc, pct.1, pct.2)) colnames(fc.results) <- c(fc.name, "pct.1", "pct.2") return(fc.results) } #' @param norm.method Normalization method for mean function selection #' when \code{slot} is \dQuote{\code{data}} #' #' @importFrom Matrix rowMeans #' @importFrom Matrix rowSums #' @rdname FoldChange #' @concept differential_expression #' @export #' @method FoldChange Assay FoldChange.Assay <- function( object, cells.1, cells.2, features = NULL, slot = "data", pseudocount.use = 1, fc.name = NULL, mean.fxn = NULL, base = 2, norm.method = NULL, ... ) { data <- GetAssayData(object = object, layer = slot) # By default run as if LogNormalize is done log1pdata.mean.fxn <- function(x) { # return(log(x = rowMeans(x = expm1(x = x)) + pseudocount.use, base = base)) return(log(x = (rowSums(x = expm1(x = x)) + pseudocount.use)/NCOL(x), base = base)) } scaledata.mean.fxn <- rowMeans counts.mean.fxn <- function(x) { # return(log(x = rowMeans(x = x) + pseudocount.use, base = base)) return(log(x = (rowSums(x = x) + pseudocount.use)/NCOL(x), base = base)) } if (!is.null(x = norm.method)) { # For anything apart from log normalization set to rowMeans if (norm.method!="LogNormalize") { new.mean.fxn <- counts.mean.fxn } else { new.mean.fxn <- counts.mean.fxn if (slot == "data") { new.mean.fxn <- log1pdata.mean.fxn } else if (slot == "scale.data") { new.mean.fxn <- scaledata.mean.fxn } } } else { # If no normalization method is passed use slots to decide mean function new.mean.fxn <- switch( EXPR = slot, 'data' = log1pdata.mean.fxn, 'scale.data' = scaledata.mean.fxn, 'counts' = counts.mean.fxn, log1pdata.mean.fxn ) } mean.fxn <- mean.fxn %||% new.mean.fxn # Omit the decimal value of e from the column name if base == exp(1) base.text <- ifelse( test = base == exp(1), yes = "", no = base ) fc.name <- fc.name %||% ifelse( test = slot == "scale.data", yes = "avg_diff", no = paste0("avg_log", base.text, "FC") ) FoldChange( object = data, cells.1 = cells.1, cells.2 = cells.2, features = features, mean.fxn = mean.fxn, fc.name = fc.name ) } #' @method FoldChange StdAssay #' @export #' FoldChange.StdAssay <- FoldChange.Assay #' @importFrom Matrix rowMeans #' @importFrom Matrix rowSums #' @rdname FoldChange #' @concept differential_expression #' @export #' @method FoldChange SCTAssay FoldChange.SCTAssay <- function( object, cells.1, cells.2, features = NULL, slot = "data", pseudocount.use = 1, fc.name = NULL, mean.fxn = NULL, base = 2, ... ) { pseudocount.use <- pseudocount.use %||% 1 data <- GetAssayData(object = object, layer = slot) default.mean.fxn <- function(x) { # return(log(x = rowMeans(x = expm1(x = x)) + pseudocount.use, base = base)) return(log(x = (rowSums(x = expm1(x = x)) + pseudocount.use)/NCOL(x), base = base)) } mean.fxn <- mean.fxn %||% switch( EXPR = slot, 'data' = default.mean.fxn, 'scale.data' = rowMeans, 'counts' = function(x) { # return(log(x = rowMeans(x = x) + pseudocount.use, base = base)) return(log(x = (rowSums(x = x) + pseudocount.use)/NCOL(x), base = base)) }, default.mean.fxn ) # Omit the decimal value of e from the column name if base == exp(1) base.text <- ifelse( test = base == exp(1), yes = "", no = base ) fc.name <- fc.name %||% ifelse( test = slot == "scale.data", yes = "avg_diff", no = paste0("avg_log", base.text, "FC") ) FoldChange( object = data, cells.1 = cells.1, cells.2 = cells.2, features = features, mean.fxn = mean.fxn, fc.name = fc.name ) } #' @importFrom Matrix rowMeans #' @rdname FoldChange #' @concept differential_expression #' @export #' @method FoldChange DimReduc FoldChange.DimReduc <- function( object, cells.1, cells.2, features = NULL, slot = NULL, pseudocount.use = 1, fc.name = NULL, mean.fxn = NULL, ... ) { mean.fxn <- mean.fxn %||% rowMeans fc.name <- fc.name %||% "avg_diff" data <- t(x = Embeddings(object = object)) features <- features %||% rownames(x = data) # Calculate avg difference data.1 <- mean.fxn(data[features, cells.1, drop = FALSE]) data.2 <- mean.fxn(data[features, cells.2, drop = FALSE]) fc <- (data.1 - data.2) fc.results <- data.frame(fc) colnames(fc.results) <- fc.name return(fc.results) } #' @param ident.1 Identity class to calculate fold change for; pass an object of class #' \code{phylo} or 'clustertree' to calculate fold change for a node in a cluster tree; #' passing 'clustertree' requires \code{\link{BuildClusterTree}} to have been run #' @param ident.2 A second identity class for comparison; if \code{NULL}, #' use all other cells for comparison; if an object of class \code{phylo} or #' 'clustertree' is passed to \code{ident.1}, must pass a node to calculate fold change for #' @param reduction Reduction to use - will calculate average difference on cell embeddings #' @param group.by Regroup cells into a different identity class prior to #' calculating fold change (see example in \code{\link{FindMarkers}}) #' @param subset.ident Subset a particular identity class prior to regrouping. #' Only relevant if group.by is set (see example in \code{\link{FindMarkers}}) #' @param assay Assay to use in fold change calculation #' @param slot Slot to pull data from #' @param pseudocount.use Pseudocount to add to averaged expression values when #' calculating logFC. #' @param mean.fxn Function to use for fold change or average difference calculation #' @param base The base with respect to which logarithms are computed. #' @param fc.name Name of the fold change, average difference, or custom function column #' in the output data.frame #' #' @rdname FoldChange #' @concept differential_expression #' @export #' @method FoldChange Seurat FoldChange.Seurat <- function( object, ident.1 = NULL, ident.2 = NULL, group.by = NULL, subset.ident = NULL, assay = NULL, slot = 'data', reduction = NULL, features = NULL, pseudocount.use = 1, mean.fxn = NULL, base = 2, fc.name = NULL, ... ) { if (!is.null(x = group.by)) { if (!is.null(x = subset.ident)) { object <- subset(x = object, idents = subset.ident) } Idents(object = object) <- group.by } if (!is.null(x = assay) && !is.null(x = reduction)) { stop("Please only specify either assay or reduction.") } # select which data to use if (is.null(x = reduction)) { assay <- assay %||% DefaultAssay(object = object) data.use <- object[[assay]] cellnames.use <- colnames(x = data.use) } else { data.use <- object[[reduction]] cellnames.use <- rownames(data.use) } cells <- IdentsToCells( object = object, ident.1 = ident.1, ident.2 = ident.2, cellnames.use = cellnames.use ) # check normalization method norm.command <- paste0("NormalizeData.", assay) norm.method <- if (norm.command %in% Command(object = object) && is.null(x = reduction)) { Command( object = object, command = norm.command, value = "normalization.method" ) } else if (length(x = intersect(x = c("FindIntegrationAnchors", "FindTransferAnchors"), y = Command(object = object)))) { command <- intersect(x = c("FindIntegrationAnchors", "FindTransferAnchors"), y = Command(object = object))[1] Command( object = object, command = command, value = "normalization.method" ) } else { NULL } fc.results <- FoldChange( object = data.use, cells.1 = cells$cells.1, cells.2 = cells$cells.2, features = features, slot = slot, pseudocount.use = pseudocount.use, mean.fxn = mean.fxn, base = base, fc.name = fc.name, norm.method = norm.method ) return(fc.results) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # internal function to calculate AUC values #' @importFrom pbapply pblapply # AUCMarkerTest <- function(data1, data2, mygenes, print.bar = TRUE) { myAUC <- unlist(x = lapply( X = mygenes, FUN = function(x) { return(DifferentialAUC( x = as.numeric(x = data1[x, ]), y = as.numeric(x = data2[x, ]) )) } )) myAUC[is.na(x = myAUC)] <- 0 iterate.fxn <- ifelse(test = print.bar, yes = pblapply, no = lapply) avg_diff <- unlist(x = iterate.fxn( X = mygenes, FUN = function(x) { return( ExpMean( x = as.numeric(x = data1[x, ]) ) - ExpMean( x = as.numeric(x = data2[x, ]) ) ) } )) toRet <- data.frame(cbind(myAUC, avg_diff), row.names = mygenes) toRet <- toRet[rev(x = order(toRet$myAUC)), ] return(toRet) } #internal function to run mcdavid et al. DE test # #' @importFrom stats sd dnorm # bimodLikData <- function(x, xmin = 0) { x1 <- x[x <= xmin] x2 <- x[x > xmin] xal <- MinMax( data = length(x = x2) / length(x = x), min = 1e-5, max = (1 - 1e-5) ) likA <- length(x = x1) * log(x = 1 - xal) if (length(x = x2) < 2) { mysd <- 1 } else { mysd <- sd(x = x2) } likB <- length(x = x2) * log(x = xal) + sum(dnorm(x = x2, mean = mean(x = x2), sd = mysd, log = TRUE)) return(likA + likB) } # returns tests that do not support feature pre-filtering DEmethods_noprefilter <- function() { c("DESeq2") } # returns tests that support latent variables (latent.vars) DEmethods_latent <- function() { c('negbinom', 'poisson', 'MAST', "LR") } # returns tests that require CheckDots DEmethods_checkdots <- function() { c('wilcox', 'wilcox_limma', 'MAST', 'DESeq2') } # returns tests that do not use Bonferroni correction on the DE results DEmethods_nocorrect <- function() { c('roc') } # returns tests that require count data DEmethods_counts <- function() { c("negbinom", "poisson", "DESeq2") } # Differential expression using DESeq2 # # Identifies differentially expressed genes between two groups of cells using # DESeq2 # # @references Love MI, Huber W and Anders S (2014). "Moderated estimation of # fold change and dispersion for RNA-seq data with DESeq2." Genome Biology. # https://bioconductor.org/packages/release/bioc/html/DESeq2.html # @param data.use Data matrix to test # @param cells.1 Group 1 cells # @param cells.2 Group 2 cells # @param verbose Print a progress bar # @param ... Extra parameters to pass to DESeq2::results # @return Returns a p-value ranked matrix of putative differentially expressed # genes. # # @details # This test does not support pre-filtering of genes based on average difference # (or percent detection rate) between cell groups. However, genes may be # pre-filtered based on their minimum detection rate (min.pct) across both cell # groups. To use this method, please install DESeq2, using the instructions at # https://bioconductor.org/packages/release/bioc/html/DESeq2.html # # @export # # @examples # \dontrun{ # data("pbmc_small") # pbmc_small # DESeq2DETest(pbmc_small, cells.1 = WhichCells(object = pbmc_small, idents = 1), # cells.2 = WhichCells(object = pbmc_small, idents = 2)) # } # DESeq2DETest <- function( data.use, cells.1, cells.2, verbose = TRUE, ... ) { if (!requireNamespace("DESeq2", quietly=TRUE)) { stop("Please install DESeq2 - learn more at https://bioconductor.org/packages/release/bioc/html/DESeq2.html") } CheckDots(..., fxns = 'DESeq2::results') group.info <- data.frame(row.names = c(cells.1, cells.2)) group.info[cells.1, "group"] <- "Group1" group.info[cells.2, "group"] <- "Group2" group.info[, "group"] <- factor(x = group.info[, "group"]) group.info$wellKey <- rownames(x = group.info) dds1 <- DESeq2::DESeqDataSetFromMatrix( countData = data.use, colData = group.info, design = ~ group ) dds1 <- DESeq2::estimateSizeFactors(object = dds1) dds1 <- DESeq2::estimateDispersions(object = dds1, fitType = "local") dds1 <- DESeq2::nbinomWaldTest(object = dds1) res <- DESeq2::results( object = dds1, contrast = c("group", "Group1", "Group2"), alpha = 0.05, ... ) to.return <- data.frame(p_val = res$pvalue, row.names = rownames(res)) return(to.return) } # internal function to calculate AUC values #' @importFrom ROCR prediction performance #' DifferentialAUC <- function(x, y) { prediction.use <- prediction( predictions = c(x, y), labels = c(rep(x = 1, length(x = x)), rep(x = 0, length(x = y))), label.ordering = 0:1 ) perf.use <- performance(prediction.obj = prediction.use, measure = "auc") auc.use <- round(x = perf.use@y.values[[1]], digits = 3) return(auc.use) } #internal function to run mcdavid et al. DE test # #' @importFrom stats pchisq # DifferentialLRT <- function(x, y, xmin = 0) { lrtX <- bimodLikData(x = x) lrtY <- bimodLikData(x = y) lrtZ <- bimodLikData(x = c(x, y)) lrt_diff <- 2 * (lrtX + lrtY - lrtZ) return(pchisq(q = lrt_diff, df = 3, lower.tail = F)) } # Likelihood ratio test for zero-inflated data # # Identifies differentially expressed genes between two groups of cells using # the LRT model proposed in McDavid et al, Bioinformatics, 2013 # # @inheritParams FindMarkers # @param object Seurat object # @param cells.1 Group 1 cells # @param cells.2 Group 2 cells # @param assay.type Type of assay to fetch data for (default is RNA) # @return Returns a p-value ranked matrix of putative differentially expressed # genes. # #' @importFrom pbapply pbsapply #' @importFrom future.apply future_sapply #' @importFrom future nbrOfWorkers # # @export # @examples # data("pbmc_small") # pbmc_small # DiffExpTest(pbmc_small, cells.1 = WhichCells(object = pbmc_small, idents = 1), # cells.2 = WhichCells(object = pbmc_small, idents = 2)) # DiffExpTest <- function( data.use, cells.1, cells.2, verbose = TRUE ) { my.sapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pbsapply, no = future_sapply ) p_val <- unlist( x = my.sapply( X = 1:nrow(x = data.use), FUN = function(x) { return(DifferentialLRT( x = as.numeric(x = data.use[x, cells.1]), y = as.numeric(x = data.use[x, cells.2]) )) } ) ) to.return <- data.frame(p_val, row.names = rownames(x = data.use)) return(to.return) } # Differential expression testing using Student's t-test # # Identify differentially expressed genes between two groups of cells using # the Student's t-test # # @return Returns a p-value ranked matrix of putative differentially expressed # genes. # #' @importFrom stats t.test #' @importFrom pbapply pbsapply #' @importFrom future.apply future_sapply #' @importFrom future nbrOfWorkers # # @export # # @examples # data("pbmc_small") # pbmc_small # DiffTTest(pbmc_small, cells.1 = WhichCells(object = pbmc_small, idents = 1), # cells.2 = WhichCells(object = pbmc_small, idents = 2)) DiffTTest <- function( data.use, cells.1, cells.2, verbose = TRUE ) { my.sapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pbsapply, no = future_sapply ) p_val <- unlist( x = my.sapply( X = 1:nrow(data.use), FUN = function(x) { t.test(x = data.use[x, cells.1], y = data.use[x, cells.2])$p.value } ) ) to.return <- data.frame(p_val,row.names = rownames(x = data.use)) return(to.return) } # Tests for UMI-count based data # # Identifies differentially expressed genes between two groups of cells using # either a negative binomial or poisson generalized linear model # # @param data.use Data to test # @param cells.1 Group 1 cells # @param cells.2 Group 2 cells # @param min.cells Minimum number of cells threshold # @param latent.vars Latent variables to test # @param test.use parameterizes the glm # @param verbose Print progress bar # # @return Returns a p-value ranked matrix of putative differentially expressed # genes. # #' @importFrom MASS glm.nb #' @importFrom pbapply pbsapply #' @importFrom stats var as.formula #' @importFrom future.apply future_sapply #' @importFrom future nbrOfWorkers #' # @export # # @examples # data("pbmc_small") # pbmc_small # # Note, not recommended for particularly small datasets - expect warnings # NegBinomDETest(pbmc_small, cells.1 = WhichCells(object = pbmc_small, idents = 1), # cells.2 = WhichCells(object = pbmc_small, idents = 2)) # GLMDETest <- function( data.use, cells.1, cells.2, min.cells = 3, latent.vars = NULL, test.use = NULL, verbose = TRUE ) { group.info <- data.frame( group = rep( x = c('Group1', 'Group2'), times = c(length(x = cells.1), length(x = cells.2)) ) ) rownames(group.info) <- c(cells.1, cells.2) group.info[, "group"] <- factor(x = group.info[, "group"]) latent.vars <- if (is.null(x = latent.vars)) { group.info } else { cbind(x = group.info, latent.vars) } latent.var.names <- colnames(x = latent.vars) my.sapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pbsapply, no = future_sapply ) p_val <- unlist( x = my.sapply( X = 1:nrow(data.use), FUN = function(x) { latent.vars[, "GENE"] <- as.numeric(x = data.use[x, ]) # check that gene is expressed in specified number of cells in one group if (sum(latent.vars$GENE[latent.vars$group == "Group1"] > 0) < min.cells && sum(latent.vars$GENE[latent.vars$group == "Group2"] > 0) < min.cells) { warning(paste0( "Skipping gene --- ", x, ". Fewer than ", min.cells, " cells in both clusters." )) return(2) } # check that variance between groups is not 0 if (var(x = latent.vars$GENE) == 0) { warning(paste0( "Skipping gene -- ", x, ". No variance in expression between the two clusters." )) return(2) } fmla <- as.formula(object = paste( "GENE ~", paste(latent.var.names, collapse = "+") )) p.estimate <- 2 if (test.use == "negbinom") { try( expr = p.estimate <- summary( object = glm.nb(formula = fmla, data = latent.vars) )$coef[2, 4], silent = TRUE ) return(p.estimate) } else if (test.use == "poisson") { return(summary(object = glm( formula = fmla, data = latent.vars, family = "poisson" ))$coef[2,4]) } } ) ) features.keep <- rownames(data.use) if (length(x = which(x = p_val == 2)) > 0) { features.keep <- features.keep[-which(x = p_val == 2)] p_val <- p_val[!p_val == 2] } to.return <- data.frame(p_val, row.names = features.keep) return(to.return) } # Helper function for FindMarkers.Seurat and FoldChange.Seurat # Convert idents to cells # #' @importFrom methods is # IdentsToCells <- function( object, ident.1, ident.2, cellnames.use ) { # if (is.null(x = ident.1)) { stop("Please provide ident.1") } else if ((length(x = ident.1) == 1 && ident.1[1] == 'clustertree') || is(object = ident.1, class2 = 'phylo')) { if (is.null(x = ident.2)) { stop("Please pass a node to 'ident.2' to run FindMarkers on a tree") } tree <- if (is(object = ident.1, class2 = 'phylo')) { ident.1 } else { Tool(object = object, slot = 'BuildClusterTree') } if (is.null(x = tree)) { stop("Please run 'BuildClusterTree' or pass an object of class 'phylo' as 'ident.1'") } ident.1 <- tree$tip.label[GetLeftDescendants(tree = tree, node = ident.2)] ident.2 <- tree$tip.label[GetRightDescendants(tree = tree, node = ident.2)] } if (length(x = as.vector(x = ident.1)) > 1 && any(as.character(x = ident.1) %in% cellnames.use)) { bad.cells <- cellnames.use[which(x = !as.character(x = ident.1) %in% cellnames.use)] if (length(x = bad.cells) > 0) { stop(paste0("The following cell names provided to ident.1 are not present in the object: ", paste(bad.cells, collapse = ", "))) } } else { ident.1 <- WhichCells(object = object, idents = ident.1) } # if NULL for ident.2, use all other cells if (length(x = as.vector(x = ident.2)) > 1 && any(as.character(x = ident.2) %in% cellnames.use)) { bad.cells <- cellnames.use[which(!as.character(x = ident.2) %in% cellnames.use)] if (length(x = bad.cells) > 0) { stop(paste0("The following cell names provided to ident.2 are not present in the object: ", paste(bad.cells, collapse = ", "))) } } else { if (is.null(x = ident.2)) { ident.2 <- setdiff(x = cellnames.use, y = ident.1) } else { ident.2 <- WhichCells(object = object, idents = ident.2) } } return(list(cells.1 = ident.1, cells.2 = ident.2)) } # Perform differential expression testing using a logistic regression framework # # Constructs a logistic regression model predicting group membership based on a # given feature and compares this to a null model with a likelihood ratio test. # # @param data.use expression matrix # @param cells.1 Vector of cells in group 1 # @param cells2. Vector of cells in group 2 # @param latent.vars Latent variables to include in model # @param verbose Print messages # #' @importFrom lmtest lrtest #' @importFrom pbapply pbsapply #' @importFrom stats as.formula glm #' @importFrom future.apply future_sapply #' @importFrom future nbrOfWorkers # LRDETest <- function( data.use, cells.1, cells.2, latent.vars = NULL, verbose = TRUE ) { group.info <- data.frame(row.names = c(cells.1, cells.2)) group.info[cells.1, "group"] <- "Group1" group.info[cells.2, "group"] <- "Group2" group.info[, "group"] <- factor(x = group.info[, "group"]) data.use <- data.use[, rownames(group.info), drop = FALSE] latent.vars <- latent.vars[rownames(group.info), , drop = FALSE] my.sapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pbsapply, no = future_sapply ) p_val <- my.sapply( X = 1:nrow(x = data.use), FUN = function(x) { if (is.null(x = latent.vars)) { model.data <- cbind(GENE = data.use[x, ], group.info) fmla <- as.formula(object = "group ~ GENE") fmla2 <- as.formula(object = "group ~ 1") } else { model.data <- cbind(GENE = data.use[x, ], group.info, latent.vars) fmla <- as.formula(object = paste( "group ~ GENE +", paste(colnames(x = latent.vars), collapse = "+") )) fmla2 <- as.formula(object = paste( "group ~", paste(colnames(x = latent.vars), collapse = "+") )) } model1 <- glm(formula = fmla, data = model.data, family = "binomial") model2 <- glm(formula = fmla2, data = model.data, family = "binomial") lrtest <- lrtest(model1, model2) return(lrtest$Pr[2]) } ) to.return <- data.frame(p_val, row.names = rownames(data.use)) return(to.return) } # ROC-based marker discovery # # Identifies 'markers' of gene expression using ROC analysis. For each gene, # evaluates (using AUC) a classifier built on that gene alone, to classify # between two groups of cells. # # An AUC value of 1 means that expression values for this gene alone can # perfectly classify the two groupings (i.e. Each of the cells in cells.1 # exhibit a higher level than each of the cells in cells.2). An AUC value of 0 # also means there is perfect classification, but in the other direction. A # value of 0.5 implies that the gene has no predictive power to classify the # two groups. # # @return Returns a 'predictive power' (abs(AUC-0.5) * 2) ranked matrix of # putative differentially expressed genes. # # @export # # @examples # data("pbmc_small") # pbmc_small # MarkerTest(pbmc_small, cells.1 = WhichCells(object = pbmc_small, idents = 1), # cells.2 = WhichCells(object = pbmc_small, idents = 2)) # MarkerTest <- function( data.use, cells.1, cells.2, verbose = TRUE ) { to.return <- AUCMarkerTest( data1 = data.use[, cells.1, drop = FALSE], data2 = data.use[, cells.2, drop = FALSE], mygenes = rownames(x = data.use), print.bar = verbose ) to.return$power <- abs(x = to.return$myAUC - 0.5) * 2 return(to.return) } # Differential expression using MAST # # Identifies differentially expressed genes between two groups of cells using # a hurdle model tailored to scRNA-seq data. Utilizes the MAST package to run # the DE testing. # # @references Andrew McDavid, Greg Finak and Masanao Yajima (2017). MAST: Model-based # Analysis of Single Cell Transcriptomics. R package version 1.2.1. # https://github.com/RGLab/MAST/ # # @param data.use Data to test # @param cells.1 Group 1 cells # @param cells.2 Group 2 cells # @param latent.vars Confounding variables to adjust for in DE test # @param verbose print output # @param \dots Additional parameters to zero-inflated regression (zlm) function # in MAST # @details # To use this method, please install MAST, using instructions at https://github.com/RGLab/MAST/ # # @return Returns a p-value ranked matrix of putative differentially expressed # genes. # #' @importFrom stats relevel MASTDETest <- function( data.use, cells.1, cells.2, latent.vars = NULL, verbose = TRUE, ... ) { # Check for MAST if (!requireNamespace("MAST", quietly = TRUE)) { stop("Please install MAST - learn more at https://github.com/RGLab/MAST") } group.info <- data.frame(row.names = c(cells.1, cells.2)) latent.vars <- latent.vars %||% group.info group.info[cells.1, "group"] <- "Group1" group.info[cells.2, "group"] <- "Group2" group.info[, "group"] <- factor(x = group.info[, "group"]) latent.vars.names <- c("condition", colnames(x = latent.vars)) latent.vars <- cbind(latent.vars, group.info) latent.vars$wellKey <- rownames(x = latent.vars) fdat <- data.frame(rownames(x = data.use)) colnames(x = fdat)[1] <- "primerid" rownames(x = fdat) <- fdat[, 1] sca <- MAST::FromMatrix( exprsArray = as.matrix(x = data.use), check_sanity = FALSE, cData = latent.vars, fData = fdat ) cond <- factor(x = SummarizedExperiment::colData(sca)$group) cond <- relevel(x = cond, ref = "Group1") SummarizedExperiment::colData(sca)$condition <- cond fmla <- as.formula( object = paste0(" ~ ", paste(latent.vars.names, collapse = "+")) ) zlmCond <- MAST::zlm(formula = fmla, sca = sca, ...) summaryCond <- MAST::summary(object = zlmCond, doLRT = 'conditionGroup2') summaryDt <- summaryCond$datatable # fcHurdle <- merge( # summaryDt[contrast=='conditionGroup2' & component=='H', .(primerid, `Pr(>Chisq)`)], #hurdle P values # summaryDt[contrast=='conditionGroup2' & component=='logFC', .(primerid, coef, ci.hi, ci.lo)], by='primerid' # ) #logFC coefficients # fcHurdle[,fdr:=p.adjust(`Pr(>Chisq)`, 'fdr')] p_val <- summaryDt[summaryDt[, "component"] == "H", 4] genes.return <- summaryDt[summaryDt[, "component"] == "H", 1] # p_val <- subset(summaryDt, component == "H")[, 4] # genes.return <- subset(summaryDt, component == "H")[, 1] to.return <- data.frame(p_val, row.names = genes.return) return(to.return) } # compare two negative binomial regression models # model one uses only common factors (com.fac) # model two additionally uses group factor (grp.fac) # #' @importFrom stats glm anova coef # NBModelComparison <- function(y, theta, latent.data, com.fac, grp.fac) { tab <- as.matrix(x = table(y > 0, latent.data[, grp.fac])) freqs <- tab['TRUE', ] / apply(X = tab, MARGIN = 2, FUN = sum) fit2 <- 0 fit4 <- 0 try( expr = fit2 <- glm( formula = y ~ ., data = latent.data[, com.fac, drop = FALSE], family = MASS::negative.binomial(theta = theta) ), silent=TRUE ) try( fit4 <- glm( formula = y ~ ., data = latent.data[, c(com.fac, grp.fac)], family = MASS::negative.binomial(theta = theta) ), silent = TRUE ) if (is.numeric(x = fit2) || is.numeric(x = fit4)) { message('One of the glm.nb calls failed') return(c(rep(x = NA, 5), freqs)) } pval <- anova(fit2, fit4, test = 'Chisq')$'Pr(>Chi)'[2] foi <- 2 + length(x = com.fac) log2.fc <- log2(x = 1 / exp(x = coef(object = fit4)[foi])) ret <- c( fit2$deviance, fit4$deviance, pval, coef(object = fit4)[foi], log2.fc, freqs ) names(x = ret) <- c( 'dev1', 'dev2', 'pval', 'coef', 'log2.fc', 'freq1', 'freq2' ) return(ret) } PerformDE <- function( object, cells.1, cells.2, features, test.use, verbose, min.cells.feature, latent.vars, densify, ... ) { if (!(test.use %in% DEmethods_latent()) && !is.null(x = latent.vars)) { warning( "'latent.vars' is only used for the following tests: ", paste(DEmethods_latent(), collapse=", "), call. = FALSE, immediate. = TRUE ) } if (!test.use %in% DEmethods_checkdots()) { CheckDots(...) } data.use <- object[features, c(cells.1, cells.2), drop = FALSE] if (densify){ data.use <- as.matrix(x = data.use) } de.results <- switch( EXPR = test.use, 'wilcox' = WilcoxDETest( data.use = data.use, cells.1 = cells.1, cells.2 = cells.2, verbose = verbose, ... ), 'wilcox_limma' = WilcoxDETest( data.use = data.use, cells.1 = cells.1, cells.2 = cells.2, verbose = verbose, limma = TRUE, ... ), 'bimod' = DiffExpTest( data.use = data.use, cells.1 = cells.1, cells.2 = cells.2, verbose = verbose ), 'roc' = MarkerTest( data.use = data.use, cells.1 = cells.1, cells.2 = cells.2, verbose = verbose ), 't' = DiffTTest( data.use = data.use, cells.1 = cells.1, cells.2 = cells.2, verbose = verbose ), 'negbinom' = GLMDETest( data.use = data.use, cells.1 = cells.1, cells.2 = cells.2, min.cells = min.cells.feature, latent.vars = latent.vars, test.use = test.use, verbose = verbose ), 'poisson' = GLMDETest( data.use = data.use, cells.1 = cells.1, cells.2 = cells.2, min.cells = min.cells.feature, latent.vars = latent.vars, test.use = test.use, verbose = verbose ), 'MAST' = MASTDETest( data.use = data.use, cells.1 = cells.1, cells.2 = cells.2, latent.vars = latent.vars, verbose = verbose, ... ), "DESeq2" = DESeq2DETest( data.use = data.use, cells.1 = cells.1, cells.2 = cells.2, verbose = verbose, ... ), "LR" = LRDETest( data.use = data.use, cells.1 = cells.1, cells.2 = cells.2, latent.vars = latent.vars, verbose = verbose ), stop("Unknown test: ", test.use) ) return(de.results) } #' Prepare object to run differential expression on SCT assay with multiple models #' #' Given a merged object with multiple SCT models, this function uses minimum #' of the median UMI (calculated using the raw UMI counts) of individual objects #' to reverse the individual SCT regression model using minimum of median UMI #' as the sequencing depth covariate. #' The counts slot of the SCT assay is replaced with recorrected counts and #' the data slot is replaced with log1p of recorrected counts. #' @param object Seurat object with SCT assays #' @param assay Assay name where for SCT objects are stored; Default is 'SCT' #' @param verbose Print messages and progress #' @importFrom Matrix Matrix #' @importFrom SeuratObject SparseEmptyMatrix #' @importFrom pbapply pblapply #' @importFrom future.apply future_lapply #' @importFrom future nbrOfWorkers #' @importFrom sctransform correct_counts #' @importFrom SeuratObject JoinLayers #' #' @return Returns a Seurat object with recorrected counts and data in the SCT assay. #' @export #' #' @concept differential_expression #' @template section-progressr #' @template section-future #' @examples #' data("pbmc_small") #' pbmc_small1 <- SCTransform(object = pbmc_small, variable.features.n = 20, vst.flavor="v1") #' pbmc_small2 <- SCTransform(object = pbmc_small, variable.features.n = 20, vst.flavor="v1") #' pbmc_merged <- merge(x = pbmc_small1, y = pbmc_small2) #' pbmc_merged <- PrepSCTFindMarkers(object = pbmc_merged) #' markers <- FindMarkers( #' object = pbmc_merged, #' ident.1 = "0", #' ident.2 = "1", #' assay = "SCT" #' ) #' pbmc_subset <- subset(pbmc_merged, idents = c("0", "1")) #' markers_subset <- FindMarkers( #' object = pbmc_subset, #' ident.1 = "0", #' ident.2 = "1", #' assay = "SCT", #' recorrect_umi = FALSE #' ) #' PrepSCTFindMarkers <- function(object, assay = "SCT", verbose = TRUE) { if (verbose && nbrOfWorkers() == 1) { my.lapply <- pblapply } else { my.lapply <- future_lapply } if (length(x = levels(x = object[[assay]])) == 1) { if (verbose) { message("Only one SCT model is stored - skipping recalculating corrected counts") } return(object) } observed_median_umis <- lapply( X = SCTResults(object = object[[assay]], slot = "cell.attributes"), FUN = function(x) median(x[, "umi"]) ) model.list <- slot(object = object[[assay]], name = "SCTModel.list") median_umi.status <- lapply(X = model.list, FUN = function(x) { return(tryCatch( expr = slot(object = x, name = 'median_umi'), error = function(...) {return(NULL)}) )}) if (any(is.null(x = unlist(x = median_umi.status)))){ # For old SCT objects median_umi is set to median umi as calculated from obserbed UMIs slot(object = object[[assay]], name = "SCTModel.list") <- lapply(X = model.list, FUN = UpdateSlots) SCTResults(object = object[[assay]], slot = "median_umi") <- observed_median_umis } model_median_umis <- SCTResults(object = object[[assay]], slot = "median_umi") min_median_umi <- min(unlist(x = observed_median_umis), na.rm = TRUE) if (all(unlist(x = model_median_umis) > min_median_umi)){ if (verbose){ message("Minimum UMI unchanged. Skipping re-correction.") } return(object) } if (verbose) { message(paste0("Found ", length(x = levels(x = object[[assay]])), " SCT models.", " Recorrecting SCT counts using minimum median counts: ", min_median_umi)) } umi.assay <- unique( x = unlist( x = SCTResults(object = object[[assay]], slot = "umi.assay") ) ) if (length(x = umi.assay) > 1) { stop("Multiple UMI assays are used for SCTransform: ", paste(umi.assay, collapse = ", ") ) } umi.layers <- Layers(object = object, assay = umi.assay, search = 'counts') if (length(x = umi.layers) > 1) { object[[umi.assay]] <- JoinLayers( object = object[[umi.assay]], layers = "counts", new = "counts") } raw_umi <- GetAssayData(object = object, assay = umi.assay, layer = "counts") corrected_counts <- Matrix( nrow = nrow(x = raw_umi), ncol = ncol(x = raw_umi), data = 0, dimnames = dimnames(x = raw_umi), sparse = TRUE ) cell_attr <- SCTResults(object = object[[assay]], slot = "cell.attributes") model_pars_fit <- lapply( X = SCTResults(object = object[[assay]], slot = "feature.attributes"), FUN = function(x) x[, c("theta", "(Intercept)", "log_umi")] ) arguments <- SCTResults(object = object[[assay]], slot = "arguments") model_str <- SCTResults(object = object[[assay]], slot = "model") set_median_umi <- rep(min_median_umi, length(levels(x = object[[assay]]))) names(set_median_umi) <- levels(x = object[[assay]]) set_median_umi <- as.list(set_median_umi) all_genes <- rownames(x = object[[assay]]) # correct counts my.correct_counts <- function(model_name){ model_genes <- rownames(x = model_pars_fit[[model_name]]) x <- list( model_str = model_str[[model_name]], arguments = arguments[[model_name]], model_pars_fit = as.matrix(x = model_pars_fit[[model_name]]), cell_attr = cell_attr[[model_name]] ) cells <- rownames(x = cell_attr[[model_name]]) umi <- raw_umi[all_genes, cells] umi_corrected <- correct_counts( x = x, umi = umi, verbosity = 0, scale_factor = min_median_umi ) missing_features <- setdiff(x = all_genes, y = rownames(x = umi_corrected)) corrected_counts.list <- NULL gc(verbose = FALSE) empty <- SparseEmptyMatrix(nrow = length(x = missing_features), ncol = ncol(x = umi_corrected)) rownames(x = empty) <- missing_features colnames(x = umi_corrected) <- colnames(x = umi_corrected) umi_corrected <- rbind(umi_corrected, empty)[all_genes,] return(umi_corrected) } corrected_counts.list <- my.lapply(X = levels(x = object[[assay]]), FUN = my.correct_counts) names(x = corrected_counts.list) <- levels(x = object[[assay]]) corrected_counts <- do.call(what = MergeSparseMatrices, args = corrected_counts.list) corrected_counts <- as.sparse(x = corrected_counts) corrected_data <- log1p(x = corrected_counts) suppressWarnings({object <- SetAssayData(object = object, assay = assay, layer = "counts", new.data = corrected_counts)}) suppressWarnings({object <- SetAssayData(object = object, assay = assay, layer = "data", new.data = corrected_data)}) SCTResults(object = object[[assay]], slot = "median_umi") <- set_median_umi return(object) } PrepSCTFindMarkers.V5 <- function(object, assay = "SCT", umi.assay = "RNA", layer = "counts", verbose = TRUE) { layers <- Layers(object = object[[umi.assay]], search = layer) dataset.names <- gsub(pattern = paste0(layer, "."), replacement = "", x = layers) for (i in seq_along(along.with = layers)) { l <- layers[i] counts <- LayerData( object = object[[umi.assay]], layer = l ) } cells.grid <- DelayedArray::colAutoGrid(x = counts, ncol = min(length(Cells(object)), ncol(counts))) } # given a UMI count matrix, estimate NB theta parameter for each gene # and use fit of relationship with mean to assign regularized theta to each gene # #' @importFrom stats glm loess poisson #' @importFrom utils txtProgressBar setTxtProgressBar # RegularizedTheta <- function(cm, latent.data, min.theta = 0.01, bin.size = 128) { genes.regress <- rownames(x = cm) bin.ind <- ceiling(x = 1:length(x = genes.regress) / bin.size) max.bin <- max(bin.ind) message('Running Poisson regression (to get initial mean), and theta estimation per gene') pb <- txtProgressBar(min = 0, max = max.bin, style = 3, file = stderr()) theta.estimate <- c() for (i in 1:max.bin) { genes.bin.regress <- genes.regress[bin.ind == i] bin.theta.estimate <- unlist( x = parallel::mclapply( X = genes.bin.regress, FUN = function(j) { return(as.numeric(x = MASS::theta.ml( y = cm[j, ], mu = glm( formula = cm[j, ] ~ ., data = latent.data, family = poisson )$fitted ))) } ), use.names = FALSE ) theta.estimate <- c(theta.estimate, bin.theta.estimate) setTxtProgressBar(pb = pb, value = i) } close(con = pb) UMI.mean <- apply(X = cm, MARGIN = 1, FUN = mean) var.estimate <- UMI.mean + (UMI.mean ^ 2) / theta.estimate for (span in c(1/3, 1/2, 3/4, 1)) { fit <- loess( formula = log10(x = var.estimate) ~ log10(x = UMI.mean), span = span ) if (! any(is.na(x = fit$fitted))) { message(sprintf( 'Used loess with span %1.2f to fit mean-variance relationship\n', span )) break } } if (any(is.na(x = fit$fitted))) { stop('Problem when fitting NB gene variance in RegularizedTheta - NA values were fitted.') } theta.fit <- (UMI.mean ^ 2) / ((10 ^ fit$fitted) - UMI.mean) names(x = theta.fit) <- genes.regress to.fix <- theta.fit <= min.theta | is.infinite(x = theta.fit) if (any(to.fix)) { message( 'Fitted theta below ', min.theta, ' for ', sum(to.fix), ' genes, setting them to ', min.theta ) theta.fit[to.fix] <- min.theta } return(theta.fit) } # FindMarkers helper function for cell grouping error checking ValidateCellGroups <- function( object, cells.1, cells.2, min.cells.group ) { if (length(x = cells.1) == 0) { stop("Cell group 1 is empty - no cells with identity class ", cells.1) } else if (length(x = cells.2) == 0) { stop("Cell group 2 is empty - no cells with identity class ", cells.2) return(NULL) } else if (length(x = cells.1) < min.cells.group) { stop("Cell group 1 has fewer than ", min.cells.group, " cells") } else if (length(x = cells.2) < min.cells.group) { stop("Cell group 2 has fewer than ", min.cells.group, " cells") } else if (any(!cells.1 %in% colnames(x = object))) { bad.cells <- colnames(x = object)[which(x = !as.character(x = cells.1) %in% colnames(x = object))] stop( "The following cell names provided to cells.1 are not present: ", paste(bad.cells, collapse = ", ") ) } else if (any(!cells.2 %in% colnames(x = object))) { bad.cells <- colnames(x = object)[which(x = !as.character(x = cells.2) %in% colnames(x = object))] stop( "The following cell names provided to cells.2 are not present: ", paste(bad.cells, collapse = ", ") ) } } # Differential expression using Wilcoxon Rank Sum # # Identifies differentially expressed genes between two groups of cells using # a Wilcoxon Rank Sum test. Makes use of presto::wilcoxauc for a more efficient # implementation of the wilcoxon test. If presto is not installed, or if limma # is requested, makes use of limma::rankSumTestWithCorrelation for a # more efficient implementation of the wilcoxon test. Thanks to Yunshun Chen and # Gordon Smyth for suggesting the limma implementation. If limma is also not installed, # uses wilcox.test. # # @param data.use Data matrix to test # @param cells.1 Group 1 cells # @param cells.2 Group 2 cells # @param verbose Print a progress bar # @param limma If limma should be used for testing; default is FALSE # @param ... Extra parameters passed to wilcox.test # # @return Returns a p-value ranked matrix of putative differentially expressed # features # #' @importFrom pbapply pbsapply #' @importFrom stats wilcox.test #' @importFrom future.apply future_sapply #' @importFrom future nbrOfWorkers # # @export # # @examples # data("pbmc_small") # pbmc_small # WilcoxDETest(pbmc_small, cells.1 = WhichCells(object = pbmc_small, idents = 1), # cells.2 = WhichCells(object = pbmc_small, idents = 2)) # WilcoxDETest <- function( data.use, cells.1, cells.2, verbose = TRUE, limma = FALSE, ... ) { data.use <- data.use[, c(cells.1, cells.2), drop = FALSE] j <- seq_len(length.out = length(x = cells.1)) my.sapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pbsapply, no = future_sapply ) overflow.check <- ifelse( test = is.na(x = suppressWarnings(length(x = data.use[1, ]) * length(x = data.use[1, ]))), yes = FALSE, no = TRUE ) presto.check <- requireNamespace("presto", quietly = TRUE) limma.check <- requireNamespace("limma", quietly = TRUE) group.info <- data.frame(row.names = c(cells.1, cells.2)) group.info[cells.1, "group"] <- "Group1" group.info[cells.2, "group"] <- "Group2" group.info[, "group"] <- factor(x = group.info[, "group"]) if (presto.check[1] && (!limma)) { data.use <- data.use[, rownames(group.info), drop = FALSE] res <- presto::wilcoxauc(X = data.use, y = group.info[, "group"]) res <- res[1:(nrow(x = res)/2),] p_val <- res$pval } else { if (getOption('Seurat.presto.wilcox.msg', TRUE) && (!limma)) { message( "For a (much!) faster implementation of the Wilcoxon Rank Sum Test,", "\n(default method for FindMarkers) please install the presto package", "\n--------------------------------------------", "\ninstall.packages('devtools')", "\ndevtools::install_github('immunogenomics/presto')", "\n--------------------------------------------", "\nAfter installation of presto, Seurat will automatically use the more ", "\nefficient implementation (no further action necessary).", "\nThis message will be shown once per session" ) options(Seurat.presto.wilcox.msg = FALSE) } if (limma.check[1] && overflow.check) { p_val <- my.sapply( X = 1:nrow(x = data.use), FUN = function(x) { return(min(2 * min(limma::rankSumTestWithCorrelation(index = j, statistics = data.use[x, ])), 1)) } ) } else { if (limma && overflow.check) { stop( "To use the limma implementation of the Wilcoxon Rank Sum Test, please install the limma package: -------------------------------------------- install.packages('BiocManager') BiocManager::install('limma') --------------------------------------------" ) } else { data.use <- data.use[, rownames(x = group.info), drop = FALSE] p_val <- my.sapply( X = 1:nrow(x = data.use), FUN = function(x) { return(wilcox.test(data.use[x, ] ~ group.info[, "group"], ...)$p.value) } ) } } } return(data.frame(p_val, row.names = rownames(x = data.use))) } Seurat/R/data.R0000644000176200001440000000267315117326655012775 0ustar liggesusers#' Cell cycle genes #' #' A list of genes used in cell-cycle regression #' #' @format A list of two vectors #' \describe{ #' \item{s.genes}{Genes associated with S-phase} #' \item{g2m.genes}{Genes associated with G2M-phase} #' } #' @concept data #' @source `https://doi.org/10.1126/science.aad0501` #' "cc.genes" #' Cell cycle genes: 2019 update #' #' A list of genes used in cell-cycle regression, updated with 2019 symbols #' #' @section Updated symbols: #' The following symbols were updated from \code{\link{cc.genes}} #' \describe{ #' \item{s.genes}{ #' \itemize{ #' \item \emph{MCM2}: \emph{MCM7} #' \item \emph{MLF1IP}: \emph{CENPU} #' \item \emph{RPA2}: \emph{POLR1B} #' \item \emph{BRIP1}: \emph{MRPL36} #' } #' } #' \item{g2m.genes}{ #' \itemize{ #' \item \emph{FAM64A}: \emph{PIMREG} #' \item \emph{HN1}: \emph{JPT1} #' } #' } #' } #' #' @format A list of two vectors #' \describe{ #' \item{s.genes}{Genes associated with S-phase} #' \item{g2m.genes}{Genes associated with G2M-phase} #' } #' @concept data #' @source `https://doi.org/10.1126/science.aad0501` #' #' @seealso \code{\link{cc.genes}} #' #' @examples #' \dontrun{ #' cc.genes.updated.2019 <- cc.genes #' cc.genes.updated.2019$s.genes <- UpdateSymbolList(symbols = cc.genes.updated.2019$s.genes) #' cc.genes.updated.2019$g2m.genes <- UpdateSymbolList(symbols = cc.genes.updated.2019$g2m.genes) #' } #' "cc.genes.updated.2019" Seurat/R/reexports.R0000644000176200001440000002037015056057544014111 0ustar liggesusers #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Classes #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' The Assay Class #' #' The \code{Assay} object is the basic unit of Seurat; for more details, please #' see the documentation in \code{\link[SeuratObject:Assay]{SeuratObject}} #' #' @importClassesFrom SeuratObject Assay #' #' @exportClass Assay #' #' @docType class #' @name Assay-class #' @rdname Assay-class #' #' @seealso \code{\link[SeuratObject:Assay]{SeuratObject::Assay-class}} #' NULL #' The DimReduc Class #' #' The \code{DimReduc} object stores a dimensionality reduction taken out in #' Seurat; for more details, please see the documentation in #' \code{\link[SeuratObject:DimReduc]{SeuratObject}} #' #' @importClassesFrom SeuratObject DimReduc #' #' @exportClass DimReduc #' #' @docType class #' @name DimReduc-class #' @rdname DimReduc-class #' #' @seealso \code{\link[SeuratObject:DimReduc]{SeuratObject::DimReduc-class}} #' NULL #' The Graph Class #' #' For more details, please see the documentation in #' \code{\link[SeuratObject:Graph]{SeuratObject}} #' #' @importClassesFrom SeuratObject Graph #' #' @exportClass Graph #' #' @docType class #' @name Graph-class #' @rdname Graph-class #' #' @seealso \code{\link[SeuratObject:Graph]{SeuratObject::Graph-class}} #' NULL #' The JackStrawData Class #' #' For more details, please see the documentation in #' \code{\link[SeuratObject:JackStrawData]{SeuratObject}} #' #' @importClassesFrom SeuratObject JackStrawData #' #' @exportClass JackStrawData #' #' @docType class #' @name JackStrawData-class #' @rdname JackStrawData-class #' #' @seealso \code{\link[SeuratObject:JackStrawData]{SeuratObject::JackStrawData-class}} #' NULL #' The Neighbor Class #' #' For more details, please see the documentation in #' \code{\link[SeuratObject:Neighbor]{SeuratObject}} #' #' @importClassesFrom SeuratObject Neighbor #' #' @exportClass Neighbor #' #' @docType class #' @name Neighbor-class #' @rdname Neighbor-class #' #' @seealso \code{\link[SeuratObject:Neighbor]{SeuratObject::Neighbor-class}} #' NULL #' The Seurat Class #' #' The Seurat object is a representation of single-cell expression data for R; #' for more details, please see the documentation in #' \code{\link[SeuratObject:Seurat]{SeuratObject}} #' #' @importClassesFrom SeuratObject Seurat #' #' @exportClass Seurat #' #' @docType class #' @name Seurat-class #' @rdname Seurat-class #' #' @seealso \code{\link[SeuratObject:Seurat]{SeuratObject::Seurat-class}} #' NULL #' The SeuratCommand Class #' #' For more details, please see the documentation in #' \code{\link[SeuratObject:SeuratCommand]{SeuratObject}} #' #' @importClassesFrom SeuratObject SeuratCommand #' #' @exportClass SeuratCommand #' #' @docType class #' @name SeuratCommand-class #' @rdname SeuratCommand-class #' #' @seealso \code{\link[SeuratObject:SeuratCommand]{SeuratObject::SeuratCommand-class}} #' NULL #' The SpatialImage Class #' #' For more details, please see the documentation in #' \code{\link[SeuratObject:SpatialImage]{SeuratObject}} #' #' @importClassesFrom SeuratObject SpatialImage #' #' @exportClass SpatialImage #' #' @docType class #' @name SpatialImage-class #' @rdname SpatialImage-class #' #' @seealso \code{\link[SeuratObject:SpatialImage]{SeuratObject::SpatialImage-class}} #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions and Generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @importFrom generics components #' @rdname reexports #' @export #' generics::components #' @importFrom SeuratObject %||% #' @rdname reexports #' @export #' SeuratObject::`%||%` #' @importFrom SeuratObject %iff% #' @rdname reexports #' @export #' SeuratObject::`%iff%` #' @importFrom SeuratObject AddMetaData #' @export #' SeuratObject::AddMetaData #' @importFrom SeuratObject as.Graph #' @export #' SeuratObject::as.Graph #' @importFrom SeuratObject as.Neighbor #' @export #' SeuratObject::as.Neighbor #' @importFrom SeuratObject as.Seurat #' @export #' SeuratObject::as.Seurat #' @importFrom SeuratObject as.sparse #' @export #' SeuratObject::as.sparse #' @importFrom SeuratObject Assays #' @export #' SeuratObject::Assays #' @importFrom SeuratObject Cells #' @export #' SeuratObject::Cells #' @importFrom SeuratObject CellsByIdentities #' @export #' SeuratObject::CellsByIdentities #' @importFrom SeuratObject Command #' @export #' SeuratObject::Command #' @importFrom SeuratObject CreateAssayObject #' @export #' SeuratObject::CreateAssayObject #' @importFrom SeuratObject CreateDimReducObject #' @export #' SeuratObject::CreateDimReducObject #' @importFrom SeuratObject CreateSeuratObject #' @export #' SeuratObject::CreateSeuratObject #' @importFrom SeuratObject DefaultAssay #' @export #' SeuratObject::DefaultAssay #' @importFrom SeuratObject DefaultAssay<- #' @export #' SeuratObject::`DefaultAssay<-` #' @importFrom SeuratObject Distances #' @export #' SeuratObject::Distances #' @importFrom SeuratObject Embeddings #' @export #' SeuratObject::Embeddings #' @importFrom SeuratObject FetchData #' @export #' SeuratObject::FetchData #' @importFrom SeuratObject GetAssayData #' @export #' SeuratObject::GetAssayData #' @importFrom SeuratObject GetImage #' @export #' SeuratObject::GetImage #' @importFrom SeuratObject GetTissueCoordinates #' @export #' SeuratObject::GetTissueCoordinates #' @importFrom SeuratObject HVFInfo #' @export #' SeuratObject::HVFInfo #' @importFrom SeuratObject Idents #' @export #' SeuratObject::Idents #' @importFrom SeuratObject Idents<- #' @export #' SeuratObject::`Idents<-` #' @importFrom SeuratObject Images #' @export #' SeuratObject::Images #' @importFrom SeuratObject Index #' @export #' SeuratObject::Index #' @importFrom SeuratObject Index<- #' @export #' SeuratObject::`Index<-` #' @importFrom SeuratObject Indices #' @export #' SeuratObject::Indices #' @importFrom SeuratObject IsGlobal #' @export #' SeuratObject::IsGlobal #' @importFrom SeuratObject JS #' @export #' SeuratObject::JS #' @importFrom SeuratObject JS<- #' @export #' SeuratObject::`JS<-` #' @importFrom SeuratObject Key #' @export #' SeuratObject::Key #' @importFrom SeuratObject Key<- #' @export #' SeuratObject::`Key<-` #' @importFrom SeuratObject Loadings #' @export #' SeuratObject::Loadings #' @importFrom SeuratObject Loadings<- #' @export #' SeuratObject::`Loadings<-` #' @importFrom SeuratObject LogSeuratCommand #' @export #' SeuratObject::LogSeuratCommand #' @importFrom SeuratObject Misc #' @export #' SeuratObject::Misc #' @importFrom SeuratObject Misc<- #' @export #' SeuratObject::`Misc<-` #' @importFrom SeuratObject Neighbors #' @export #' SeuratObject::Neighbors #' @importFrom SeuratObject Project #' @export #' SeuratObject::Project #' @importFrom SeuratObject Project<- #' @export #' SeuratObject::`Project<-` #' @importFrom SeuratObject Radius #' @export #' SeuratObject::Radius #' @importFrom SeuratObject Reductions #' @export #' SeuratObject::Reductions #' @importFrom SeuratObject RenameCells #' @export #' SeuratObject::RenameCells #' @importFrom SeuratObject RenameIdents #' @export #' SeuratObject::RenameIdents #' @importFrom SeuratObject ReorderIdent #' @export #' SeuratObject::ReorderIdent #' @importFrom SeuratObject RowMergeSparseMatrices #' @export #' SeuratObject::RowMergeSparseMatrices #' @importFrom SeuratObject SetAssayData #' @export #' SeuratObject::SetAssayData #' @importFrom SeuratObject SetIdent #' @export #' SeuratObject::SetIdent #' @importFrom SeuratObject SpatiallyVariableFeatures #' @export #' SeuratObject::SpatiallyVariableFeatures #' @importFrom SeuratObject StashIdent #' @export #' SeuratObject::StashIdent #' @importFrom SeuratObject Stdev #' @export #' SeuratObject::Stdev #' @importFrom SeuratObject SVFInfo #' @export #' SeuratObject::SVFInfo #' @importFrom SeuratObject Tool #' @export #' SeuratObject::Tool #' @importFrom SeuratObject Tool<- #' @export #' SeuratObject::`Tool<-` #' @importFrom SeuratObject UpdateSeuratObject #' @export #' SeuratObject::UpdateSeuratObject #' @importFrom SeuratObject VariableFeatures #' @export #' SeuratObject::VariableFeatures #' @importFrom SeuratObject VariableFeatures<- #' @export #' SeuratObject::`VariableFeatures<-` #' @importFrom SeuratObject WhichCells #' @export #' SeuratObject::WhichCells Seurat/R/preprocessing.R0000644000176200001440000062136015117056271014741 0ustar liggesusers#' @include generics.R #' @importFrom progressr progressor #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% globalVariables( names = c('fov', 'cell_ID', 'qv'), package = 'Seurat', add = TRUE ) #' Calculate the Barcode Distribution Inflection #' #' This function calculates an adaptive inflection point ("knee") of the barcode distribution #' for each sample group. This is useful for determining a threshold for removing #' low-quality samples. #' #' The function operates by calculating the slope of the barcode number vs. rank #' distribution, and then finding the point at which the distribution changes most #' steeply (the "knee"). Of note, this calculation often must be restricted as to the #' range at which it performs, so `threshold` parameters are provided to restrict the #' range of the calculation based on the rank of the barcodes. [BarcodeInflectionsPlot()] #' is provided as a convenience function to visualize and test different thresholds and #' thus provide more sensical end results. #' #' See [BarcodeInflectionsPlot()] to visualize the calculated inflection points and #' [SubsetByBarcodeInflections()] to subsequently subset the Seurat object. #' #' @param object Seurat object #' @param barcode.column Column to use as proxy for barcodes ("nCount_RNA" by default) #' @param group.column Column to group by ("orig.ident" by default) #' @param threshold.high Ignore barcodes of rank above this threshold in inflection calculation #' @param threshold.low Ignore barcodes of rank below this threshold in inflection calculation #' #' @return Returns Seurat object with a new list in the `tools` slot, `CalculateBarcodeInflections` with values: #' #' * `barcode_distribution` - contains the full barcode distribution across the entire dataset #' * `inflection_points` - the calculated inflection points within the thresholds #' * `threshold_values` - the provided (or default) threshold values to search within for inflections #' * `cells_pass` - the cells that pass the inflection point calculation #' #' @importFrom methods slot #' @importFrom stats ave aggregate #' #' @export #' @concept preprocessing #' #' @author Robert A. Amezquita, \email{robert.amezquita@fredhutch.org} #' @seealso \code{\link{BarcodeInflectionsPlot}} \code{\link{SubsetByBarcodeInflections}} #' #' @examples #' data("pbmc_small") #' CalculateBarcodeInflections(pbmc_small, group.column = 'groups') #' CalculateBarcodeInflections <- function( object, barcode.column = "nCount_RNA", group.column = "orig.ident", threshold.low = NULL, threshold.high = NULL ) { ## Check that barcode.column exists in meta.data if (!(barcode.column %in% colnames(x = object[[]]))) { stop("`barcode.column` specified not present in Seurat object provided") } # Calculation of barcode distribution ## Append rank by grouping x umi column # barcode_dist <- as.data.frame(object@meta.data)[, c(group.column, barcode.column)] barcode_dist <- object[[c(group.column, barcode.column)]] barcode_dist <- barcode_dist[do.call(what = order, args = barcode_dist), ] # order by columns left to right barcode_dist$rank <- ave( x = barcode_dist[, barcode.column], barcode_dist[, group.column], FUN = function(x) { return(rev(x = order(x))) } ) barcode_dist <- barcode_dist[order(barcode_dist[, group.column], barcode_dist[, 'rank']), ] ## calculate rawdiff and append per group top <- aggregate( x = barcode_dist[, barcode.column], by = list(barcode_dist[, group.column]), FUN = function(x) { return(c(0, diff(x = log10(x = x + 1)))) })$x bot <- aggregate( x = barcode_dist[, 'rank'], by = list(barcode_dist[, group.column]), FUN = function(x) { return(c(0, diff(x = x))) } )$x barcode_dist$rawdiff <- unlist(x = mapply( FUN = function(x, y) { return(ifelse(test = is.na(x = x / y), yes = 0, no = x / y)) }, x = top, y = bot )) # Calculation of inflection points ## Set thresholds for rank of barcodes to ignore threshold.low <- threshold.low %||% 1 threshold.high <- threshold.high %||% max(barcode_dist$rank) ## Subset the barcode distribution by thresholds barcode_dist_sub <- barcode_dist[barcode_dist$rank > threshold.low & barcode_dist$rank < threshold.high, ] ## Calculate inflection points ## note: if thresholds are s.t. it produces the same length across both groups, ## aggregate will create a data.frame with x.* columns, where * is the length ## using the same combine approach will yield non-symmetrical results! whichmin_list <- aggregate( x = barcode_dist_sub[, 'rawdiff'], by = list(barcode_dist_sub[, group.column]), FUN = function(x) { return(x == min(x)) } )$x ## workaround for aggregate behavior noted above if (is.list(x = whichmin_list)) { # uneven lengths is_inflection <- unlist(x = whichmin_list) } else if (is.matrix(x = whichmin_list)) { # even lengths is_inflection <- as.vector(x = t(x = whichmin_list)) } tmp <- cbind(barcode_dist_sub, is_inflection) # inflections <- tmp[tmp$is_inflection == TRUE, c(group.column, barcode.column, "rank")] inflections <- tmp[which(x = tmp$is_inflection), c(group.column, barcode.column, 'rank')] # Use inflection point for what cells to keep ## use the inflection points to cut the subsetted dist to what to keep ## keep only the barcodes above the inflection points keep <- unlist(x = lapply( X = whichmin_list, FUN = function(x) { keep <- !x if (sum(keep) == length(x = keep)) { return(keep) # prevents bug in case of keeping all cells } # toss <- which(keep == FALSE):length(x = keep) # the end cells below knee toss <- which(x = !keep):length(x = keep) keep[toss] <- FALSE return(keep) } )) barcode_dist_sub_keep <- barcode_dist_sub[keep, ] cells_keep <- rownames(x = barcode_dist_sub_keep) # Bind thresholds to keep track of where they are placed thresholds <- data.frame( threshold = c('threshold.low', 'threshold.high'), rank = c(threshold.low, threshold.high) ) # Combine relevant info together ## Combine Barcode dist, inflection point, and cells to keep into list info <- list( barcode_distribution = barcode_dist, inflection_points = inflections, threshold_values = thresholds, cells_pass = cells_keep ) # save results into object Tool(object = object) <- info return(object) } #' Demultiplex samples based on data from cell 'hashing' #' #' Assign sample-of-origin for each cell, annotate doublets. #' #' @param object Seurat object. Assumes that the hash tag oligo (HTO) data has been added and normalized. #' @param assay Name of the Hashtag assay (HTO by default) #' @param positive.quantile The quantile of inferred 'negative' distribution for each hashtag - over which the cell is considered 'positive'. Default is 0.99 #' @param init Initial number of clusters for hashtags. Default is the # of hashtag oligo names + 1 (to account for negatives) #' @param kfunc Clustering function for initial hashtag grouping. Default is "clara" for fast k-medoids clustering on large applications, also support "kmeans" for kmeans clustering #' @param nsamples Number of samples to be drawn from the dataset used for clustering, for kfunc = "clara" #' @param nstarts nstarts value for k-means clustering (for kfunc = "kmeans"). 100 by default #' @param seed Sets the random seed. If NULL, seed is not set #' @param verbose Prints the output #' #' @return The Seurat object with the following demultiplexed information stored in the meta data: #' \describe{ #' \item{hash.maxID}{Name of hashtag with the highest signal} #' \item{hash.secondID}{Name of hashtag with the second highest signal} #' \item{hash.margin}{The difference between signals for hash.maxID and hash.secondID} #' \item{classification}{Classification result, with doublets/multiplets named by the top two highest hashtags} #' \item{classification.global}{Global classification result (singlet, doublet or negative)} #' \item{hash.ID}{Classification result where doublet IDs are collapsed} #' } #' #' @importFrom cluster clara #' @importFrom Matrix colSums #' @importFrom fitdistrplus fitdist #' @importFrom stats pnbinom kmeans #' #' @export #' @concept preprocessing #' #' @seealso \code{\link{HTOHeatmap}} #' #' @examples #' \dontrun{ #' object <- HTODemux(object) #' } #' HTODemux <- function( object, assay = "HTO", positive.quantile = 0.99, init = NULL, nstarts = 100, kfunc = "clara", nsamples = 100, seed = 42, verbose = TRUE ) { if (!is.null(x = seed)) { set.seed(seed = seed) } #initial clustering assay <- assay %||% DefaultAssay(object = object) data <- GetAssayData(object = object, assay = assay) counts <- GetAssayData( object = object, assay = assay, layer = 'counts' )[, colnames(x = object)] counts <- as.matrix(x = counts) ncenters <- init %||% (nrow(x = data) + 1) switch( EXPR = kfunc, 'kmeans' = { init.clusters <- kmeans( x = t(x = GetAssayData(object = object, assay = assay)), centers = ncenters, nstart = nstarts ) #identify positive and negative signals for all HTO Idents(object = object, cells = names(x = init.clusters$cluster)) <- init.clusters$cluster }, 'clara' = { #use fast k-medoid clustering init.clusters <- clara( x = t(x = GetAssayData(object = object, assay = assay)), k = ncenters, samples = nsamples ) #identify positive and negative signals for all HTO Idents(object = object, cells = names(x = init.clusters$clustering), drop = TRUE) <- init.clusters$clustering }, stop("Unknown k-means function ", kfunc, ", please choose from 'kmeans' or 'clara'") ) #average hto signals per cluster #work around so we don't average all the RNA levels which takes time average.expression <- suppressWarnings( AverageExpression( object = object, assays = assay, verbose = FALSE )[[assay]] ) #checking for any cluster with all zero counts for any barcode if (sum(average.expression == 0) > 0) { stop("Cells with zero counts exist as a cluster.") } #create a matrix to store classification result discrete <- GetAssayData(object = object, assay = assay) discrete[discrete > 0] <- 0 # for each HTO, we will use the minimum cluster for fitting for (iter in rownames(x = data)) { values <- counts[iter, colnames(object)] #commented out if we take all but the top cluster as background #values_negative=values[setdiff(object@cell.names,WhichCells(object,which.max(average.expression[iter,])))] values.use <- values[WhichCells( object = object, idents = levels(x = Idents(object = object))[[which.min(x = average.expression[iter, ])]] )] fit <- suppressWarnings(expr = fitdist(data = values.use, distr = "nbinom")) cutoff <- as.numeric(x = quantile(x = fit, probs = positive.quantile)$quantiles[1]) discrete[iter, names(x = which(x = values > cutoff))] <- 1 if (verbose) { message(paste0("Cutoff for ", iter, " : ", cutoff, " reads")) } } # now assign cells to HTO based on discretized values npositive <- colSums(x = discrete) classification.global <- npositive classification.global[npositive == 0] <- "Negative" classification.global[npositive == 1] <- "Singlet" classification.global[npositive > 1] <- "Doublet" donor.id = rownames(x = data) hash.max <- apply(X = data, MARGIN = 2, FUN = max) hash.maxID <- apply(X = data, MARGIN = 2, FUN = which.max) hash.second <- apply(X = data, MARGIN = 2, FUN = MaxN, N = 2) hash.maxID <- as.character(x = donor.id[sapply( X = 1:ncol(x = data), FUN = function(x) { return(which(x = data[, x] == hash.max[x])[1]) } )]) hash.secondID <- as.character(x = donor.id[sapply( X = 1:ncol(x = data), FUN = function(x) { return(which(x = data[, x] == hash.second[x])[1]) } )]) hash.margin <- hash.max - hash.second doublet_id <- sapply( X = 1:length(x = hash.maxID), FUN = function(x) { return(paste(sort(x = c(hash.maxID[x], hash.secondID[x])), collapse = "_")) } ) # doublet_names <- names(x = table(doublet_id))[-1] # Not used classification <- classification.global classification[classification.global == "Negative"] <- "Negative" classification[classification.global == "Singlet"] <- hash.maxID[which(x = classification.global == "Singlet")] classification[classification.global == "Doublet"] <- doublet_id[which(x = classification.global == "Doublet")] classification.metadata <- data.frame( hash.maxID, hash.secondID, hash.margin, classification, classification.global ) colnames(x = classification.metadata) <- paste( assay, c('maxID', 'secondID', 'margin', 'classification', 'classification.global'), sep = '_' ) object <- AddMetaData(object = object, metadata = classification.metadata) Idents(object) <- paste0(assay, '_classification') # Idents(object, cells = rownames(object@meta.data[object@meta.data$classification.global == "Doublet", ])) <- "Doublet" doublets <- rownames(x = object[[]])[which(object[[paste0(assay, "_classification.global")]] == "Doublet")] Idents(object = object, cells = doublets) <- 'Doublet' # object@meta.data$hash.ID <- Idents(object) object$hash.ID <- Idents(object = object) return(object) } #' Calculate pearson residuals of features not in the scale.data #' #' This function calls sctransform::get_residuals. #' #' @param object A seurat object #' @param features Name of features to add into the scale.data #' @param assay Name of the assay of the seurat object generated by SCTransform #' @param umi.assay Name of the assay of the seurat object containing UMI matrix #' and the default is RNA #' @param clip.range Numeric of length two specifying the min and max values the #' Pearson residual will be clipped to #' @param replace.value Recalculate residuals for all features, even if they are #' already present. Useful if you want to change the clip.range. #' @param na.rm For features where there is no feature model stored, return NA #' for residual value in scale.data when na.rm = FALSE. When na.rm is TRUE, only #' return residuals for features with a model stored for all cells. #' @param verbose Whether to print messages and progress bars #' #' @return Returns a Seurat object containing Pearson residuals of added #' features in its scale.data #' #' @importFrom sctransform get_residuals #' @importFrom matrixStats rowAnyNAs #' #' @export #' @concept preprocessing #' #' @seealso \code{\link[sctransform]{get_residuals}} #' #' @examples #' \dontrun{ #' data("pbmc_small") #' pbmc_small <- SCTransform(object = pbmc_small, variable.features.n = 20) #' pbmc_small <- GetResidual(object = pbmc_small, features = c('MS4A1', 'TCL1A')) #' } #' GetResidual <- function( object, features, assay = NULL, umi.assay = "RNA", clip.range = NULL, replace.value = FALSE, na.rm = TRUE, verbose = TRUE ) { assay <- assay %||% DefaultAssay(object = object) if (IsSCT(assay = object[[assay]])) { object[[assay]] <- as(object[[assay]], 'SCTAssay') } if (!inherits(x = object[[assay]], what = "SCTAssay")) { stop(assay, " assay was not generated by SCTransform") } sct.models <- levels(x = object[[assay]]) if (length(x = sct.models) == 0) { warning("SCT model not present in assay", call. = FALSE, immediate. = TRUE) return(object) } possible.features <- unique(x = unlist(x = lapply(X = sct.models, FUN = function(x) { rownames(x = SCTResults(object = object[[assay]], slot = "feature.attributes", model = x)) } ))) bad.features <- setdiff(x = features, y = possible.features) if (length(x = bad.features) > 0) { warning("The following requested features are not present in any models: ", paste(bad.features, collapse = ", "), call. = FALSE) features <- intersect(x = features, y = possible.features) } features.orig <- features if (na.rm) { # only compute residuals when feature model info is present in all features <- names(x = which(x = table(unlist(x = lapply( X = sct.models, FUN = function(x) { rownames(x = SCTResults(object = object[[assay]], slot = "feature.attributes", model = x)) } ))) == length(x = sct.models))) if (length(x = features) == 0) { return(object) } } features <- intersect(x = features.orig, y = features) if (length(x = sct.models) > 1 && verbose) { message( "This SCTAssay contains multiple SCT models. Computing residuals for cells using different models" ) } if (!umi.assay %in% Assays(object = object) || length(x = Layers(object = object[[umi.assay]], search = 'counts')) == 0) { return(object) } if (inherits(x = object[[umi.assay]], what = 'Assay')) { new.residuals <- lapply( X = sct.models, FUN = function(x) { GetResidualSCTModel( object = object, assay = assay, SCTModel = x, new_features = features, replace.value = replace.value, clip.range = clip.range, verbose = verbose ) } ) } else if (inherits(x = object[[umi.assay]], what = 'Assay5')) { new.residuals <- lapply( X = sct.models, FUN = function(x) { FetchResidualSCTModel(object = object[[assay]], umi.object = object[[umi.assay]], SCTModel = x, new_features = features, replace.value = replace.value, clip.range = clip.range, verbose = verbose) } ) } existing.data <- GetAssayData(object = object, layer = 'scale.data', assay = assay) all.features <- union(x = rownames(x = existing.data), y = features) new.scale <- matrix( data = NA, nrow = length(x = all.features), ncol = ncol(x = object), dimnames = list(all.features, Cells(x = object)) ) if (nrow(x = existing.data) > 0){ new.scale[1:nrow(x = existing.data), ] <- existing.data } if (length(x = new.residuals) == 1 & is.list(x = new.residuals)) { new.residuals <- new.residuals[[1]] } else { new.residuals <- Reduce(cbind, new.residuals) } new.scale[rownames(x = new.residuals), colnames(x = new.residuals)] <- new.residuals if (na.rm) { new.scale <- new.scale[!rowAnyNAs(x = new.scale), ] } object <- SetAssayData( object = object, assay = assay, layer = "scale.data", new.data = new.scale ) if (any(!features.orig %in% rownames(x = new.scale))) { bad.features <- features.orig[which(!features.orig %in% rownames(x = new.scale))] warning("Residuals not computed for the following requested features: ", paste(bad.features, collapse = ", "), call. = FALSE) } return(object) } #' Load a 10x Genomics Visium Spatial Experiment into a \code{Seurat} object #' #' @inheritParams Read10X #' @inheritParams SeuratObject::CreateSeuratObject #' @param data.dir Directory containing the H5 file specified by \code{filename} #' and the image data in a subdirectory called \code{spatial} #' @param filename Name of H5 file containing the feature barcode matrix #' @param slice Name for the stored image of the tissue slice #' @param bin.size Specifies the bin sizes to read in, can include "polygons" to load segmentations. Defaults to c(16, 8) #' @param filter.matrix Only keep spots that have been determined to be over #' tissue #' @param to.upper Converts all feature names to upper case. Can be useful when #' analyses require comparisons between human and mouse gene names for example. #' @param image \code{VisiumV1}/\code{VisiumV2} instance(s) - if a vector is #' passed in it should be co-indexed with \code{`bin.size`} #' @param segmentation.type Which segmentations to load (cell or nucleus) when bin.size includes "polygons". #' Defaults to "cell". #' @param compact Whether to store segmentations in \emph{only} the \code{sf.data} slot #' in the corresponding Segmentation object (default TRUE) to save memory and processing time. #' If FALSE, segmentations are also stored in \code{\link[sp]{sp}} format in addition to the \code{sf.data} slot. #' @param image.name Name of the tissue image to be plotted. Defaults to tissue_lowres_image.png #' @param ... Arguments passed to \code{\link{Read10X_h5}} #' #' @return A \code{Seurat} object #' #' @importFrom png readPNG #' @importFrom jsonlite fromJSON #' @importFrom SeuratObject DefaultBoundary<- #' #' @export #' @concept preprocessing #' #' @examples #' \dontrun{ #' data_dir <- 'path/to/data/directory' #' list.files(data_dir) # Should show filtered_feature_bc_matrix.h5 #' Load10X_Spatial(data.dir = data_dir) #' } #' Load10X_Spatial <- function ( data.dir, filename = "filtered_feature_bc_matrix.h5", assay = "Spatial", slice = "slice1", bin.size = NULL, filter.matrix = TRUE, to.upper = FALSE, image = NULL, image.name = "tissue_lowres_image.png", segmentation.type = NULL, compact = TRUE, ... ) { # if more than one directory is passed in if (length(x = data.dir) > 1) { # party on with the first value data.dir <- data.dir[1] # but also raise a warning warning( paste0( "data.dir expects a single value but received multiple - ", "continuing using the first: '", data.dir, "'." ), immediate. = TRUE, ) } # if the specified directory does not exist if (!file.exists(data.dir)) { # raise an error stop(paste0("No such file or directory: ", "'", data.dir, "'")) } # if bin.size is not set but data.dir points to a folder with binned data if (is.null(bin.size) & file.exists(paste0(data.dir, "/binned_outputs"))) { # point bin.size to the "standard" set - i.e. everything in the default # output except the 2 um binning because it's a memory hog bin.size <- c(16, 8) } # Seurat object to return object <- NULL bin.size.numeric <- bin.size if (!is.null(bin.size)) { # Store numeric bin sizes - these are used to load binned outputs bin.size.numeric <- as.numeric(bin.size[bin.size != "polygons"]) } # Set flag to indicate if segmentations should be loaded load.segmentations <- length(bin.size.numeric) != length(bin.size) # read h5 files if bin.size is NULL (occurs when no /binned_outputs directory exists) or if bin.size contains numeric values load.binned.outputs <- is.null(bin.size) || (!is.null(bin.size.numeric) && length(bin.size.numeric) > 0) # If bin.size is specified and binned outputs need to be loaded if(!is.null(bin.size.numeric) && length(bin.size.numeric) > 0) { # convert bin.size to a character vector and pad values to three digits bin.size.pretty <- paste0(sprintf("%03d", bin.size.numeric), "um") # point data.dirs to the specified binnings data.dirs <- paste0( data.dir, "/binned_outputs/", "square_", bin.size.pretty ) # suffix assay/slice names with each bin size assay.names <- paste0(assay, ".", bin.size.pretty) slice.names <- paste0(slice, ".", bin.size.pretty) } else { # otherwise just hold onto the top-level directory data.dirs <- data.dir # and keep the assay/slice names unchanged assay.names <- assay slice.names <- slice } # read the h5 files in the top-level / binned output directory if(load.binned.outputs) { # read in counts matrices from specified h5 files counts.paths <- lapply(data.dirs, file.path, filename) counts.list <- lapply(counts.paths, Read10X_h5, ...) # maybe convert Cell identifiers to uppercase if (to.upper) { rownames(counts) <- lapply(rownames(counts), toupper) } if (is.null(image)) { # read in the corresponding images and coordinate mappings image.list <- mapply( Read10X_Image, file.path(data.dirs, "spatial"), assay = assay.names, slice = slice.names, image.name = image.name, MoreArgs = list(filter.matrix = filter.matrix) ) } else { # make sure any passed images are in a vector image.list <- c(image) } # check that for each counts matrix there is a corresponding image if (length(image.list) != length(counts.list)) { stop( paste0( "The number of images does not match the number of counts matrices. ", "Ensure each spatial dataset has a corresponding image." ) ) } # for each counts matrix, build a Seurat object object.list <- mapply(CreateSeuratObject, counts.list, assay = assay.names) # associate each counts matrix with its corresponding image object.list <- mapply( function( .object, .image, .assay, .slice ) { # align the image's identifiers with the object's .image <- .image[Cells(.object)] # add the image to the corresponding Seurat instance .object[[.slice]] <- .image return (.object) }, object.list, image.list, assay.names, slice.names ) # merge the Seurat instances - each assay should have unique Cell identifiers object <- merge( object.list[[1]], y = object.list[-1] ) } # read segmentation data if requested if (load.segmentations) { # Check for required packages, stop with clear message if missing if (!requireNamespace("sf", quietly = TRUE)) { stop("The 'sf' package must be installed to load segmentation data.") } segmentation.assay.name <- paste0(assay, ".Polygons") seg.data.dir <- file.path(data.dir, "segmented_outputs") # Check for different possible file formats/names possible.files <- c( "filtered_feature_cell_matrix.h5", "filtered_feature_bc_matrix.h5", "raw_feature_bc_matrix.h5" ) seg.counts.path <- NULL for (pf in possible.files) { test.path <- file.path(seg.data.dir, pf) if (file.exists(test.path)) { seg.counts.path <- test.path break } } if (is.null(seg.counts.path)) { stop("No cell segmentation matrix found. Looked for: ", paste(possible.files, collapse = ", ")) } # Read raw counts matrix segmentation.counts <- Read10X_h5(seg.counts.path, ...) # Holds barcode names segmentation.counts.cell.ids <- colnames(segmentation.counts) # Check segmentation type if (is.null(segmentation.type)) { segmentation.type <- "cell" } else if (length(segmentation.type) != 1 || !(segmentation.type %in% c("cell", "nucleus"))) { stop("segmentation.type must be either 'cell' or 'nucleus'") } # Read the Visium (V2) object with segmentations loaded visium.segmentation <- Read10X_Segmentations( image.dir = file.path(seg.data.dir, "spatial"), data.dir = data.dir, image.name = image.name, segmentation.type = segmentation.type, compact = compact ) # Create a new Seurat object with the raw counts segmentation.object <- CreateSeuratObject( segmentation.counts, assay = segmentation.assay.name ) common_cells <- unique(Cells(visium.segmentation)[Cells(visium.segmentation) %in% Cells(segmentation.object)]) visium.segmentation <- subset( x = visium.segmentation, cells = common_cells ) # Set the default boundary type to centroids for plotting DefaultBoundary(object = visium.segmentation) <- "centroids" # Add the Visium object with segmentations to the Seurat object holding counts segmentation.object[[paste0(slice, ".polygons")]] <- visium.segmentation # Merge segmented outputs into the object containing binned outputs, if it exists if (!is.null(object)) { object <- merge(x = object, y = segmentation.object) } else { object <- segmentation.object } DefaultAssay(object = object) <- segmentation.assay.name } return(object) } #' Read10x Probe Metadata #' #' This function reads the probe metadata from a 10x Genomics probe barcode matrix file in HDF5 format. #' #' @param data.dir The directory where the file is located. #' @param filename The name of the file containing the raw probe barcode matrix in HDF5 format. The default filename is 'raw_probe_bc_matrix.h5'. #' #' @return Returns a data.frame containing the probe metadata. #' #' @export #' @concept preprocessing #' Read10X_probe_metadata <- function( data.dir, filename = 'raw_probe_bc_matrix.h5' ) { if (isFALSE(x = requireNamespace('hdf5r', quietly = TRUE))) { stop("Please install hdf5r to read HDF5 files") } file.path = paste0(data.dir,"/", filename) if (!file.exists(file.path)) { stop("File not found") } infile <- hdf5r::H5File$new(filename = file.path, mode = 'r') if("matrix/features/probe_region" %in% hdf5r::list.objects(infile)) { probe.name <- infile[['matrix/features/name']][] probe.region<- infile[['matrix/features/probe_region']][] meta.data <- data.frame(probe.name, probe.region) return(meta.data) } } #' Load STARmap data #' #' @param data.dir location of data directory that contains the counts matrix, #' gene name, qhull, and centroid files. #' @param counts.file name of file containing the counts matrix (csv) #' @param gene.file name of file containing the gene names (csv) #' @param qhull.file name of file containing the hull coordinates (tsv) #' @param centroid.file name of file containing the centroid positions (tsv) #' @param assay Name of assay to associate spatial data to #' @param image Name of "image" object storing spatial coordinates #' #' @return A \code{\link{Seurat}} object #' #' @importFrom methods new #' @importFrom utils read.csv read.table #' #' @seealso \code{\link{STARmap}} #' #' @export #' @concept preprocessing #' LoadSTARmap <- function( data.dir, counts.file = "cell_barcode_count.csv", gene.file = "genes.csv", qhull.file = "qhulls.tsv", centroid.file = "centroids.tsv", assay = "Spatial", image = "image" ) { if (!dir.exists(paths = data.dir)) { stop("Cannot find directory ", data.dir, call. = FALSE) } counts <- read.csv( file = file.path(data.dir, counts.file), as.is = TRUE, header = FALSE ) gene.names <- read.csv( file = file.path(data.dir, gene.file), as.is = TRUE, header = FALSE ) qhulls <- read.table( file = file.path(data.dir, qhull.file), sep = '\t', col.names = c('cell', 'y', 'x'), as.is = TRUE ) centroids <- read.table( file = file.path(data.dir, centroid.file), sep = '\t', as.is = TRUE, col.names = c('y', 'x') ) colnames(x = counts) <- gene.names[, 1] rownames(x = counts) <- paste0('starmap', seq(1:nrow(x = counts))) counts <- as.matrix(x = counts) rownames(x = centroids) <- rownames(x = counts) qhulls$cell <- paste0('starmap', qhulls$cell) centroids <- as.matrix(x = centroids) starmap <- CreateSeuratObject(counts = t(x = counts), assay = assay) starmap[[image]] <- new( Class = 'STARmap', assay = assay, coordinates = as.data.frame(x = centroids), qhulls = qhulls ) return(starmap) } #' Load Curio Seeker data #' #' @param data.dir location of data directory that contains the counts matrix, #' gene names, barcodes/beads, and barcodes/bead location files. #' @param assay Name of assay to associate spatial data to #' #' @return A \code{\link{Seurat}} object #' #' @importFrom Matrix readMM #' #' @export #' @concept preprocessing #' LoadCurioSeeker <- function(data.dir, assay = "Spatial") { # check and find input files if (length(x = data.dir) > 1) { warning("'LoadCurioSeeker' accepts only one 'data.dir'", immediate. = TRUE) data.dir <- data.dir[1] } mtx.file <- list.files( data.dir, pattern = "*MoleculesPerMatchedBead.mtx", full.names = TRUE) if (length(x = mtx.file) > 1) { warning("Multiple files matched the pattern '*MoleculesPerMatchedBead.mtx'", immediate. = TRUE) } else if (length(x = mtx.file) == 0) { stop("No file matched the pattern '*MoleculesPerMatchedBead.mtx'", call. = FALSE) } mtx.file <- mtx.file[1] barcodes.file <- list.files( data.dir, pattern = "*barcodes.tsv", full.names = TRUE) if (length(x = barcodes.file) > 1) { warning("Multiple files matched the pattern '*barcodes.tsv'", immediate. = TRUE) } else if (length(x = barcodes.file) == 0) { stop("No file matched the pattern '*barcodes.tsv'", call. = FALSE) } barcodes.file <- barcodes.file[1] genes.file <- list.files( data.dir, pattern = "*genes.tsv", full.names = TRUE) if (length(x = genes.file) > 1) { warning("Multiple files matched the pattern '*genes.tsv'", immediate. = TRUE) } else if (length(x = genes.file) == 0) { stop("No file matched the pattern '*genes.tsv'", call. = FALSE) } genes.file <- genes.file[1] coordinates.file <- list.files( data.dir, pattern = "*MatchedBeadLocation.csv", full.names = TRUE) if (length(x = coordinates.file) > 1) { warning("Multiple files matched the pattern '*MatchedBeadLocation.csv'", immediate. = TRUE) } else if (length(x = coordinates.file) == 0) { stop("No file matched the pattern '*MatchedBeadLocation.csv'", call. = FALSE) } coordinates.file <- coordinates.file[1] # load counts matrix and create seurat object mtx <- readMM(mtx.file) mtx <- as.sparse(mtx) barcodes <- read.csv(barcodes.file, header = FALSE) genes <- read.csv(genes.file, header = FALSE) colnames(mtx) <- barcodes$V1 rownames(mtx) <- genes$V1 object <- CreateSeuratObject(counts = mtx, assay = assay) # load positions of each bead and store in a SlideSeq object in images slot coords <- read.csv(coordinates.file) colnames(coords) <- c("cell", "x", "y") coords$y <- -coords$y rownames(coords) <- coords$cell coords$cell <- NULL image <- new(Class = 'SlideSeq', assay = assay, coordinates = coords) object[["Slice"]] <- image return(object) } #' Demultiplex samples based on classification method from MULTI-seq (McGinnis et al., bioRxiv 2018) #' #' Identify singlets, doublets and negative cells from multiplexing experiments. Annotate singlets by tags. #' #' @param object Seurat object. Assumes that the specified assay data has been added #' @param assay Name of the multiplexing assay (HTO by default) #' @param quantile The quantile to use for classification #' @param autoThresh Whether to perform automated threshold finding to define the best quantile. Default is FALSE #' @param maxiter Maximum number of iterations if autoThresh = TRUE. Default is 5 #' @param qrange A range of possible quantile values to try if autoThresh = TRUE #' @param verbose Prints the output #' #' @return A Seurat object with demultiplexing results stored at \code{object$MULTI_ID} #' #' @export #' @concept preprocessing #' #' @references \doi{10.1038/s41592-019-0433-8} #' #' @examples #' \dontrun{ #' object <- MULTIseqDemux(object) #' } #' MULTIseqDemux <- function( object, assay = "HTO", quantile = 0.7, autoThresh = FALSE, maxiter = 5, qrange = seq(from = 0.1, to = 0.9, by = 0.05), verbose = TRUE ) { assay <- assay %||% DefaultAssay(object = object) multi_data_norm <- t(x = GetAssayData( object = object, layer = "data", assay = assay )) if (autoThresh) { iter <- 1 negatives <- c() neg.vector <- c() while (iter <= maxiter) { # Iterate over q values to find ideal barcode thresholding results by maximizing singlet classifications bar.table_sweep.list <- list() n <- 0 for (q in qrange) { n <- n + 1 # Generate list of singlet/doublet/negative classifications across q sweep bar.table_sweep.list[[n]] <- ClassifyCells(data = multi_data_norm, q = q) names(x = bar.table_sweep.list)[n] <- paste0("q=" , q) } # Determine which q values results in the highest pSinglet res_round <- FindThresh(call.list = bar.table_sweep.list)$res res.use <- res_round[res_round$Subset == "pSinglet", ] q.use <- res.use[which.max(res.use$Proportion),"q"] if (verbose) { message("Iteration ", iter) message("Using quantile ", q.use) } round.calls <- ClassifyCells(data = multi_data_norm, q = q.use) #remove negative cells neg.cells <- names(x = round.calls)[which(x = round.calls == "Negative")] neg.vector <- c(neg.vector, rep(x = "Negative", length(x = neg.cells))) negatives <- c(negatives, neg.cells) if (length(x = neg.cells) == 0) { break } multi_data_norm <- multi_data_norm[-which(x = rownames(x = multi_data_norm) %in% neg.cells), ] iter <- iter + 1 } names(x = neg.vector) <- negatives demux_result <- c(round.calls,neg.vector) demux_result <- demux_result[rownames(x = object[[]])] } else{ demux_result <- ClassifyCells(data = multi_data_norm, q = quantile) } demux_result <- demux_result[rownames(x = object[[]])] object[['MULTI_ID']] <- factor(x = demux_result) Idents(object = object) <- "MULTI_ID" bcs <- colnames(x = multi_data_norm) bc.max <- bcs[apply(X = multi_data_norm, MARGIN = 1, FUN = which.max)] bc.second <- bcs[unlist(x = apply( X = multi_data_norm, MARGIN = 1, FUN = function(x) { return(which(x == MaxN(x))) } ))] doublet.names <- unlist(x = lapply( X = 1:length(x = bc.max), FUN = function(x) { return(paste(sort(x = c(bc.max[x], bc.second[x])), collapse = "_")) } )) doublet.id <- which(x = demux_result == "Doublet") MULTI_classification <- as.character(object$MULTI_ID) MULTI_classification[doublet.id] <- doublet.names[doublet.id] object$MULTI_classification <- factor(x = MULTI_classification) return(object) } #' Load in data from 10X #' #' Enables easy loading of sparse data matrices provided by 10X genomics. #' #' @param data.dir Directory containing the matrix.mtx, genes.tsv (or features.tsv), and barcodes.tsv #' files provided by 10X. A vector or named vector can be given in order to load #' several data directories. If a named vector is given, the cell barcode names #' will be prefixed with the name. #' @param gene.column Specify which column of genes.tsv or features.tsv to use for gene names; default is 2 #' @param cell.column Specify which column of barcodes.tsv to use for cell names; default is 1 #' @param unique.features Make feature names unique (default TRUE) #' @param strip.suffix Remove trailing "-1" if present in all cell barcodes. #' #' @return If features.csv indicates the data has multiple data types, a list #' containing a sparse matrix of the data from each type will be returned. #' Otherwise a sparse matrix containing the expression data will be returned. #' #' @importFrom Matrix readMM #' @importFrom utils read.delim #' #' @export #' @concept preprocessing #' #' @examples #' \dontrun{ #' # For output from CellRanger < 3.0 #' data_dir <- 'path/to/data/directory' #' list.files(data_dir) # Should show barcodes.tsv, genes.tsv, and matrix.mtx #' expression_matrix <- Read10X(data.dir = data_dir) #' seurat_object = CreateSeuratObject(counts = expression_matrix) #' #' # For output from CellRanger >= 3.0 with multiple data types #' data_dir <- 'path/to/data/directory' #' list.files(data_dir) # Should show barcodes.tsv.gz, features.tsv.gz, and matrix.mtx.gz #' data <- Read10X(data.dir = data_dir) #' seurat_object = CreateSeuratObject(counts = data$`Gene Expression`) #' seurat_object[['Protein']] = CreateAssayObject(counts = data$`Antibody Capture`) #' } #' Read10X <- function( data.dir, gene.column = 2, cell.column = 1, unique.features = TRUE, strip.suffix = FALSE ) { full.data <- list() has_dt <- requireNamespace("data.table", quietly = TRUE) && requireNamespace("R.utils", quietly = TRUE) for (i in seq_along(along.with = data.dir)) { run <- data.dir[i] if (!dir.exists(paths = run)) { stop("Directory provided does not exist") } barcode.loc <- file.path(run, 'barcodes.tsv') gene.loc <- file.path(run, 'genes.tsv') features.loc <- file.path(run, 'features.tsv.gz') matrix.loc <- file.path(run, 'matrix.mtx') # Flag to indicate if this data is from CellRanger >= 3.0 pre_ver_3 <- file.exists(gene.loc) if (!pre_ver_3) { addgz <- function(s) { return(paste0(s, ".gz")) } barcode.loc <- addgz(s = barcode.loc) matrix.loc <- addgz(s = matrix.loc) } if (!file.exists(barcode.loc)) { stop("Barcode file missing. Expecting ", basename(path = barcode.loc)) } if (!pre_ver_3 && !file.exists(features.loc) ) { stop("Gene name or features file missing. Expecting ", basename(path = features.loc)) } if (!file.exists(matrix.loc)) { stop("Expression matrix file missing. Expecting ", basename(path = matrix.loc)) } data <- readMM(file = matrix.loc) if (has_dt) { cell.barcodes <- as.data.frame(data.table::fread(barcode.loc, header = FALSE)) } else { cell.barcodes <- read.table(file = barcode.loc, header = FALSE, sep = '\t', row.names = NULL) } if (ncol(x = cell.barcodes) > 1) { cell.names <- cell.barcodes[, cell.column] } else { cell.names <- readLines(con = barcode.loc) } if (all(grepl(pattern = "\\-1$", x = cell.names)) & strip.suffix) { cell.names <- as.vector(x = as.character(x = sapply( X = cell.names, FUN = ExtractField, field = 1, delim = "-" ))) } if (is.null(x = names(x = data.dir))) { if (length(x = data.dir) < 2) { colnames(x = data) <- cell.names } else { colnames(x = data) <- paste0(i, "_", cell.names) } } else { colnames(x = data) <- paste0(names(x = data.dir)[i], "_", cell.names) } if (has_dt) { feature.names <- as.data.frame(data.table::fread(ifelse(test = pre_ver_3, yes = gene.loc, no = features.loc), header = FALSE)) } else { feature.names <- read.delim( file = ifelse(test = pre_ver_3, yes = gene.loc, no = features.loc), header = FALSE, stringsAsFactors = FALSE ) } if (any(is.na(x = feature.names[, gene.column]))) { warning( 'Some features names are NA. Replacing NA names with ID from the opposite column requested', call. = FALSE, immediate. = TRUE ) na.features <- which(x = is.na(x = feature.names[, gene.column])) replacement.column <- ifelse(test = gene.column == 2, yes = 1, no = 2) feature.names[na.features, gene.column] <- feature.names[na.features, replacement.column] } if (unique.features) { fcols = ncol(x = feature.names) if (fcols < gene.column) { stop(paste0("gene.column was set to ", gene.column, " but feature.tsv.gz (or genes.tsv) only has ", fcols, " columns.", " Try setting the gene.column argument to a value <= to ", fcols, ".")) } rownames(x = data) <- make.unique(names = feature.names[, gene.column]) } # In cell ranger 3.0, a third column specifying the type of data was added # and we will return each type of data as a separate matrix if (ncol(x = feature.names) > 2) { data_types <- factor(x = feature.names$V3) lvls <- levels(x = data_types) if ("Protein Expression" %in% lvls) { message("Xenium protein expression detected, but no scaling factor", " is supplied with the MEX matrices (vs HDF5). The loaded", " matrix is scaled by a constant from the original values.") } if (length(x = lvls) > 1 && length(x = full.data) == 0) { message("10X data contains more than one type and is being returned as a list containing matrices of each type.") } expr_name <- "Gene Expression" if (expr_name %in% lvls) { # Return Gene Expression first lvls <- c(expr_name, lvls[-which(x = lvls == expr_name)]) } data <- lapply( X = lvls, FUN = function(l) { return(data[data_types == l, , drop = FALSE]) } ) names(x = data) <- lvls } else{ data <- list(data) } full.data[[length(x = full.data) + 1]] <- data } # Combine all the data from different directories into one big matrix, note this # assumes that all data directories essentially have the same features files list_of_data <- list() for (j in 1:length(x = full.data[[1]])) { list_of_data[[j]] <- do.call(cbind, lapply(X = full.data, FUN = `[[`, j)) # Fix for Issue #913 list_of_data[[j]] <- as.sparse(x = list_of_data[[j]]) } names(x = list_of_data) <- names(x = full.data[[1]]) # If multiple features, will return a list, otherwise # a matrix. if (length(x = list_of_data) == 1) { return(list_of_data[[1]]) } else { return(list_of_data) } } #' Read 10X hdf5 file #' #' Read count matrix from 10X CellRanger hdf5 file. #' This can be used to read both scATAC-seq and scRNA-seq matrices. #' #' @param filename Path to h5 file #' @param use.names Label row names with feature names rather than ID numbers. #' @param unique.features Make feature names unique (default TRUE) #' #' @return Returns a sparse matrix with rows and columns labeled. If multiple #' genomes are present, returns a list of sparse matrices (one per genome). #' #' @export #' @concept preprocessing #' Read10X_h5 <- function(filename, use.names = TRUE, unique.features = TRUE) { if (isFALSE(x = requireNamespace('hdf5r', quietly = TRUE))) { stop("Please install hdf5r to read HDF5 files") } if (!file.exists(filename)) { stop("File not found") } infile <- hdf5r::H5File$new(filename = filename, mode = 'r') genomes <- names(x = infile) output <- list() if (hdf5r::existsGroup(infile, 'matrix')) { # cellranger version 3 if (use.names) { feature_slot <- 'features/name' } else { feature_slot <- 'features/id' } } else { if (use.names) { feature_slot <- 'gene_names' } else { feature_slot <- 'genes' } } for (genome in genomes) { counts <- infile[[paste0(genome, '/data')]] indices <- infile[[paste0(genome, '/indices')]] indptr <- infile[[paste0(genome, '/indptr')]] shp <- infile[[paste0(genome, '/shape')]] features <- infile[[paste0(genome, '/', feature_slot)]][] barcodes <- infile[[paste0(genome, '/barcodes')]] sparse.mat <- sparseMatrix( i = indices[] + 1, p = indptr[], x = as.numeric(x = counts[]), dims = shp[], repr = "T" ) if (unique.features) { features <- make.unique(names = features) } rownames(x = sparse.mat) <- features colnames(x = sparse.mat) <- barcodes[] sparse.mat <- as.sparse(x = sparse.mat) # Split v3 multimodal if (infile$exists(name = paste0(genome, '/features'))) { types <- infile[[paste0(genome, '/features/feature_type')]][] types.unique <- unique(x = types) if (length(x = types.unique) > 1) { message( "Genome ", genome, " has multiple modalities, returning a list of matrices for this genome" ) sparse.mat <- sapply( X = types.unique, FUN = function(x) { return(sparse.mat[which(x = types == x), ]) }, simplify = FALSE, USE.NAMES = TRUE ) # Apply scaling factor that was used when serializing. if ("Protein Expression" %in% types.unique) { if ("protein_scaling_factor" %in% hdf5r::h5attr_names(infile)) { apply_scaling_factor <- 1.0 / hdf5r::h5attr(infile, "protein_scaling_factor") message("Scaling 'Protein Expression' by ", apply_scaling_factor) sparse.mat[["Protein Expression"]] <- sparse.mat[["Protein Expression"]] * apply_scaling_factor } } } } output[[genome]] <- sparse.mat } infile$close_all() if (length(x = output) == 1) { return(output[[genome]]) } else{ return(output) } } #' Load a 10X Genomics Visium Image #' #' @param image.dir Path to directory with 10X Genomics visium image data; #' should include files \code{tissue_lowres_image.png}, #' \code{scalefactors_json.json} and \code{tissue_positions_list.csv} #' @param image.name PNG file to read in #' @param assay Name of associated assay #' @param slice Name for the image, used to populate the instance's key #' @param filter.matrix Filter spot/feature matrix to only include spots that #' have been determined to be over tissue #' @param image.type Image type to return, one of: "VisiumV1" or "VisiumV2" #' #' @return A \code{\link{VisiumV2}} object #' #' @seealso \code{\link{VisiumV2}} \code{\link{Load10X_Spatial}} #' #' @export #' @concept preprocessing #' Read10X_Image <- function( image.dir, image.name = "tissue_lowres_image.png", assay = "Spatial", slice = "slice1", filter.matrix = TRUE, image.type = "VisiumV2" ) { # Validate the `image.type` parameter. image.type <- match.arg(image.type, choices = c("VisiumV1", "VisiumV2")) # Read in the H&E stain image. primary.path <- file.path(image.dir, image.name) fallback.path <- file.path(dirname(dirname(dirname(image.dir))), "spatial", image.name) image <- tryCatch({ png::readPNG(primary.path) }, error = function(e) { if (file.exists(fallback.path)) { png::readPNG(fallback.path) } else { stop("Neither primary nor fallback image could be read:\n", primary.path, "\n", fallback.path) } }) # Read in the scale factors. scale.factors <- Read10X_ScaleFactors( filename = file.path(image.dir, "scalefactors_json.json") ) # Read in the tissue coordinates as a data.frame. coordinates <- Read10X_Coordinates( filename = Sys.glob(file.path(image.dir, "*tissue_positions*")), filter.matrix ) # Use the `slice` value to populate a Seurat-style identifier for the image. key <- Key(slice, quiet = TRUE) # Return the specified `image.type`. if (image.type == "VisiumV1") { visium.v1 <- new( Class = image.type, assay = assay, key = key, coordinates = coordinates, scale.factors = scale.factors, image = image ) # As of v5.1.0 `Radius.VisiumV1` no longer returns the value of the # `spot.radius` slot and instead calculates the value on the fly, but we # can populate the static slot in case it's depended on. visium.v1@spot.radius <- Radius(visium.v1) return(visium.v1) } # If `image.type` is not "VisiumV1" then it must be "VisiumV2". stopifnot(image.type == "VisiumV2") # Create an `sp` compatible `FOV` instance. fov <- CreateFOV( coordinates[, c("imagecol", "imagerow")], type = "centroids", radius = scale.factors[["spot"]], assay = assay, key = key ) #### NOTE #### # The Visium coordinate system takes the origin to be in the top-left corner, # where the x-axis is horizontal and associated with the image column. # We mark this with the coords_x_orientation flag. # Older Visium objects in Seurat have a different system (x-axis vertical, etc), # which is updated after checking whether the flag is set (SeuratObject::UpdateSeuratObject). ############### # Build the final `VisiumV2` instance visium.v2 <- new( Class = "VisiumV2", boundaries = fov@boundaries, molecules = fov@molecules, assay = fov@assay, key = fov@key, image = image, scale.factors = scale.factors, coords_x_orientation = "horizontal" ) return(visium.v2) } #' Load 10X Genomics Visium Tissue Positions #' #' @param filename Path to a \code{tissue_positions_list.csv} file #' @param filter.matrix Filter spot/feature matrix to only include spots that #' have been determined to be over tissue #' #' @return A data.frame #' #' @export #' @concept preprocessing #' Read10X_Coordinates <- function(filename, filter.matrix) { # output columns names col.names <- c("barcodes", "tissue", "row", "col", "imagerow", "imagecol") # if the coordinate mappings are in a parquet file if (tools::file_ext(filename) == "parquet") { # `arrow` must be installed to read parquet files if (isFALSE(x = requireNamespace('arrow', quietly = TRUE))) { stop("Please install arrow to read parquet files") } # read in coordinates and conver the resulting tibble into a data.frame coordinates <- as.data.frame(arrow::read_parquet(filename)) # normalize column names for consistency with other datatypes input.col.names <- c( "barcode", "in_tissue", "array_row", "array_col", "pxl_row_in_fullres", "pxl_col_in_fullres" ) col.map <- stats::setNames(col.names, input.col.names) colnames(coordinates) <- ifelse( colnames(coordinates) %in% names(col.map), col.map[colnames(coordinates)], colnames(coordinates) ) # set rownames to "barcodes" then drop the column rownames(coordinates) <- coordinates[["barcodes"]] coordinates[["barcodes"]] <- NULL } else { # the coordinate mappings must be in a CSV - read it in coordinates <- read.csv( file = filename, col.names = col.names, header = ifelse( # assume files calles "tissue_positions.csv" have headers, otherwise # assume they do not (i.e. "tissue_positions_list.csv") test = basename(filename) == "tissue_positions.csv", yes = TRUE, no = FALSE ), as.is = TRUE, row.names = 1 ) } # the `tissue` column should contain a boolean indicating whether or not a # spot sits on top of the the tissue sample - maybe filter spots that do not if (filter.matrix) { coordinates <- coordinates[which(coordinates$tissue == 1), , drop = FALSE] } return (coordinates) } #' Load 10X Genomics Visium Scale Factors #' #' @param filename Path to a \code{scalefactors_json.json} file #' #' @return A scalefactors object #' #' @export #' @concept preprocessing #' Read10X_ScaleFactors <- function(filename) { raw.data <- jsonlite::fromJSON(file.path(filename)) scale.factors <- scalefactors( spot = raw.data$spot_diameter_fullres, fiducial = raw.data$fiducial_diameter_fullres, hires = raw.data$tissue_hires_scalef, lowres = raw.data$tissue_lowres_scalef ) return (scale.factors) } #' Load 10X Genomics Visium Cell Segmentations #' #' @param image.dir Path to directory with 10X Genomics visium image data; #' @param data.dir Directory of the base spaceranger outs #' @param image.name Name of the tissue image to be plotted. tissue_lowres_image.png or tissue_hires_image.png #' @param assay Name of assay to associate segmentations to #' @param slice Name of the slice to associate the segmentations to #' @param segmentation.type Which segmentations to load, cell or nucleus. If using nucleus the full matrix from cells is still used #' @param compact Whether to store segmentations in only the \code{sf.data} slot; see \code{\link{Load10X_Spatial}} for details #' #' #' @return A VisiumV2 object with segmentations #' #' @export #' @concept preprocessing #' Read10X_Segmentations <- function (image.dir, data.dir, image.name = "tissue_lowres_image.png", assay = "Spatial.Polygons", slice = "slice1.polygons", segmentation.type = "cell", compact = TRUE) { sf.obj <- Read10X_HD_GeoJson(data.dir = data.dir, segmentation.type = segmentation.type) # Create a Segmentation object; populate it based on the coordinates from the sf object segmentations <- CreateSegmentation(sf.obj, compact = compact) # Create a Centroids object; populate it based on the centroids from the sf object centroids <- CreateCentroids(sf.obj, nsides = Inf, radius = NULL, theta = 0) # Named list with segmentations and centroids boundaries <- list(segmentations = segmentations, centroids = centroids) # Get image, scale factors, key image <- png::readPNG(source = file.path(image.dir, image.name)) scale.factors <- Read10X_ScaleFactors(filename = file.path(image.dir, "scalefactors_json.json")) key <- Key(slice, quiet = TRUE) # Build VisiumV2 object visium.v2 <- new( Class = "VisiumV2", boundaries = boundaries, assay = assay, key = key, image = image, scale.factors = scale.factors, coords_x_orientation = "horizontal" ) return(visium.v2) } #' Format 10X Genomics GeoJson cell IDs #' #' @param ids Vector of cell IDs to format #' @param prefix Optional prefix string #' @param suffix Optional suffix string #' @param digits Number of digits to zero-pad #' #' A helper function to format cell IDs from the segmentation GeoJson to the same type as in the matrix.h5 #' The GeoJson has cell IDs as integers (eg 1). They need to be in the format cellid_000000001-1 #' #' @return Vector of formatted cell IDs Format10X_GeoJson_CellID <- function(ids, prefix = "cellid_", suffix = "-1", digits = 9) { format_string <- paste0("%0", as.integer(digits), "d") formatted_ids <- sapply(ids, function(id) { numeric_part <- sprintf(format_string, as.integer(id)) paste0(prefix, numeric_part, suffix) }) return(formatted_ids) } #' Load 10X Genomics GeoJson #' #' @param data.dir Path to the directory containing matrix data #' @param segmentation.type Which segmentations to load, cell or nucleus. If using nucleus the full matrix from cells is still used #' #' @return An \code{sf} object containing polygon segmentations from the GeoJSON provided by 10x, formatted for downstream coordinate retrieval #' #' @export #' @concept preprocessing #' Read10X_HD_GeoJson <- function(data.dir, segmentation.type = "cell") { segmentation_polygons <- sf::read_sf(file.path(data.dir,"segmented_outputs", paste0(segmentation.type, "_segmentations.geojson"))) # Restructure sf geometry for downstream compatibility segmentation_polygons$geometry <- sf::st_sfc(lapply( segmentation_polygons$geometry, function(geom) { coords <- geom[[1]] sf::st_polygon(list(coords)) } ), crs = sf::st_crs(NA)) segmentation_polygons$barcodes <- Format10X_GeoJson_CellID(segmentation_polygons$cell_id) segmentation_polygons } #' Read and Load Akoya CODEX data #' #' @param filename Path to matrix generated by upstream processing. #' @param type Specify which type matrix is being provided. #' \itemize{ #' \item \dQuote{\code{processor}}: matrix generated by CODEX Processor #' \item \dQuote{\code{inform}}: matrix generated by inForm #' \item \dQuote{\code{qupath}}: matrix generated by QuPath #' } #' @param filter A pattern to filter features by; pass \code{NA} to #' skip feature filtering #' @param inform.quant When \code{type} is \dQuote{\code{inform}}, the #' quantification level to read in #' #' @return \code{ReadAkoya}: A list with some combination of the following values #' \itemize{ #' \item \dQuote{\code{matrix}}: a #' \link[Matrix:dgCMatrix-class]{sparse matrix} with expression data; cells #' are columns and features are rows #' \item \dQuote{\code{centroids}}: a data frame with cell centroid #' coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} #' \item \dQuote{\code{metadata}}: a data frame with cell-level meta data; #' includes all columns in \code{filename} that aren't in #' \dQuote{\code{matrix}} or \dQuote{\code{centroids}} #' } #' When \code{type} is \dQuote{\code{inform}}, additional expression matrices #' are returned and named using their segmentation type (eg. #' \dQuote{nucleus}, \dQuote{membrane}). The \dQuote{Entire Cell} segmentation #' type is returned in the \dQuote{\code{matrix}} entry of the list #' #' @export #' #' @order 1 #' #' @concept preprocessing #' #' @template section-progressr #' #' @templateVar pkg data.table #' @template note-reqdpkg #' ReadAkoya <- function( filename, type = c('inform', 'processor', 'qupath'), filter = 'DAPI|Blank|Empty', inform.quant = c('mean', 'total', 'min', 'max', 'std') ) { if (isFALSE(x = requireNamespace('data.table', quietly = TRUE))) { stop("Please install 'data.table' for this function") } # Check arguments if (!file.exists(filename)) { stop(paste("Can't file file:", filename)) } type <- tolower(x = type[1L]) type <- match.arg(arg = type) # outs <- list(matrix = NULL, centroids = NULL) ratio <- getOption(x = 'Seurat.input.sparse_ratio', default = 0.4) p <- progressor() # Preload matrix p(message = "Preloading Akoya matrix", class = 'sticky', amount = 0) sep <- switch(EXPR = type, 'inform' = '\t', ',') mtx <- data.table::fread( file = filename, sep = sep, data.table = FALSE, verbose = FALSE ) # Assemble outputs p( message = paste0("Parsing matrix in '", type, "' format"), class = 'sticky', amount = 0 ) outs <- switch( EXPR = type, 'processor' = { # Create centroids data frame p( message = 'Creating centroids coordinates', class = 'sticky', amount = 0 ) centroids <- data.frame( x = mtx[['x:x']], y = mtx[['y:y']], cell = as.character(x = mtx[['cell_id:cell_id']]), stringsAsFactors = FALSE ) rownames(x = mtx) <- as.character(x = mtx[['cell_id:cell_id']]) # Create metadata data frame p(message = 'Creating meta data', class = 'sticky', amount = 0) md <- mtx[, !grepl(pattern = '^cyc', x = colnames(x = mtx)), drop = FALSE] colnames(x = md) <- vapply( X = strsplit(x = colnames(x = md), split = ':'), FUN = '[[', FUN.VALUE = character(length = 1L), 2L ) # Create expression matrix p(message = 'Creating expression matrix', class = 'sticky', amount = 0) mtx <- mtx[, grepl(pattern = '^cyc', x = colnames(x = mtx)), drop = FALSE] colnames(x = mtx) <- vapply( X = strsplit(x = colnames(x = mtx), split = ':'), FUN = '[[', FUN.VALUE = character(length = 1L), 2L ) if (!is.na(x = filter)) { p( message = paste0("Filtering features with pattern '", filter, "'"), class = 'sticky', amount = 0 ) mtx <- mtx[, !grepl(pattern = filter, x = colnames(x = mtx)), drop = FALSE] } mtx <- t(x = mtx) if ((sum(mtx == 0) / length(x = mtx)) > ratio) { p( message = 'Converting expression to sparse matrix', class = 'sticky', amount = 0 ) mtx <- as.sparse(x = mtx) } list(matrix = mtx, centroids = centroids, metadata = md) }, 'inform' = { inform.quant <- tolower(x = inform.quant[1L]) inform.quant <- match.arg(arg = inform.quant) expr.key <- c( mean = 'Mean', total = 'Total', min = 'Min', max = 'Max', std = 'Std Dev' )[inform.quant] expr.pattern <- '\\(Normalized Counts, Total Weighting\\)' rownames(x = mtx) <- mtx[['Cell ID']] mtx <- mtx[, setdiff(x = colnames(x = mtx), y = 'Cell ID'), drop = FALSE] # Create centroids p( message = 'Creating centroids coordinates', class = 'sticky', amount = 0 ) centroids <- data.frame( x = mtx[['Cell X Position']], y = mtx[['Cell Y Position']], cell = rownames(x = mtx), stringsAsFactors = FALSE ) # Create metadata p(message = 'Creating meta data', class = 'sticky', amount = 0) cols <- setdiff( x = grep( pattern = expr.pattern, x = colnames(x = mtx), value = TRUE, invert = TRUE ), y = paste('Cell', c('X', 'Y'), 'Position') ) md <- mtx[, cols, drop = FALSE] # Create expression matrices exprs <- data.frame( cols = grep( pattern = paste(expr.key, expr.pattern), x = colnames(x = mtx), value = TRUE ) ) exprs$feature <- vapply( X = trimws(x = gsub( pattern = paste(expr.key, expr.pattern), replacement = '', x = exprs$cols )), FUN = function(x) { x <- unlist(x = strsplit(x = x, split = ' ')) x <- x[length(x = x)] return(gsub(pattern = '\\(|\\)', replacement = '', x = x)) }, FUN.VALUE = character(length = 1L) ) exprs$class <- tolower(x = vapply( X = strsplit(x = exprs$cols, split = ' '), FUN = '[[', FUN.VALUE = character(length = 1L), 1L )) classes <- unique(x = exprs$class) outs <- vector( mode = 'list', length = length(x = classes) + 2L ) names(x = outs) <- c( 'matrix', 'centroids', 'metadata', setdiff(x = classes, y = 'entire') ) outs$centroids <- centroids outs$metadata <- md # browser() for (i in classes) { p( message = paste( 'Creating', switch(EXPR = i, 'entire' = 'entire cell', i), 'expression matrix' ), class = 'sticky', amount = 0 ) df <- exprs[exprs$class == i, , drop = FALSE] expr <- mtx[, df$cols] colnames(x = expr) <- df$feature if (!is.na(x = filter)) { p( message = paste0("Filtering features with pattern '", filter, "'"), class = 'sticky', amount = 0 ) expr <- expr[, !grepl(pattern = filter, x = colnames(x = expr)), drop = FALSE] } expr <- t(x = expr) if ((sum(expr == 0, na.rm = TRUE) / length(x = expr)) > ratio) { p( message = paste( 'Converting', switch(EXPR = i, 'entire' = 'entire cell', i), 'expression to sparse matrix' ), class = 'sticky', amount = 0 ) expr <- as.sparse(x = expr) } outs[[switch(EXPR = i, 'entire' = 'matrix', i)]] <- expr } outs }, 'qupath' = { rownames(x = mtx) <- as.character(x = seq_len(length.out = nrow(x = mtx))) # Create centroids p( message = 'Creating centroids coordinates', class = 'sticky', amount = 0 ) xpos <- sort( x = grep(pattern = 'Centroid X', x = colnames(x = mtx), value = TRUE), decreasing = TRUE )[1L] ypos <- sort( x = grep(pattern = 'Centroid Y', x = colnames(x = mtx), value = TRUE), decreasing = TRUE )[1L] centroids <- data.frame( x = mtx[[xpos]], y = mtx[[ypos]], cell = rownames(x = mtx), stringsAsFactors = FALSE ) # Create metadata p(message = 'Creating meta data', class = 'sticky', amount = 0) cols <- setdiff( x = grep( pattern = 'Cell: Mean', x = colnames(x = mtx), ignore.case = TRUE, value = TRUE, invert = TRUE ), y = c(xpos, ypos) ) md <- mtx[, cols, drop = FALSE] # Create expression matrix p(message = 'Creating expression matrix', class = 'sticky', amount = 0) idx <- which(x = grepl( pattern = 'Cell: Mean', x = colnames(x = mtx), ignore.case = TRUE )) mtx <- mtx[, idx, drop = FALSE] colnames(x = mtx) <- vapply( X = strsplit(x = colnames(x = mtx), split = ':'), FUN = '[[', FUN.VALUE = character(length = 1L), 1L ) if (!is.na(x = filter)) { p( message = paste0("Filtering features with pattern '", filter, "'"), class = 'sticky', amount = 0 ) mtx <- mtx[, !grepl(pattern = filter, x = colnames(x = mtx)), drop = FALSE] } mtx <- t(x = mtx) if ((sum(mtx == 0) / length(x = mtx)) > ratio) { p( message = 'Converting expression to sparse matrix', class = 'sticky', amount = 0 ) mtx <- as.sparse(x = mtx) } list(matrix = mtx, centroids = centroids, metadata = md) }, stop("Unknown matrix type: ", type) ) return(outs) } #' Load in data from remote or local mtx files #' #' Enables easy loading of sparse data matrices #' #' @param mtx Name or remote URL of the mtx file #' @param cells Name or remote URL of the cells/barcodes file #' @param features Name or remote URL of the features/genes file #' @param cell.column Specify which column of cells file to use for cell names; default is 1 #' @param feature.column Specify which column of features files to use for feature/gene names; default is 2 #' @param cell.sep Specify the delimiter in the cell name file #' @param feature.sep Specify the delimiter in the feature name file #' @param skip.cell Number of lines to skip in the cells file before beginning to read cell names #' @param skip.feature Number of lines to skip in the features file before beginning to gene names #' @param mtx.transpose Transpose the matrix after reading in #' @param unique.features Make feature names unique (default TRUE) #' @param strip.suffix Remove trailing "-1" if present in all cell barcodes. #' #' @return A sparse matrix containing the expression data. #' #' @importFrom Matrix readMM #' @importFrom utils read.delim #' @importFrom httr build_url parse_url #' @importFrom tools file_ext #' #' #' @export #' @concept preprocessing #' #' @examples #' \dontrun{ #' # For local files: #' #' expression_matrix <- ReadMtx( #' mtx = "count_matrix.mtx.gz", features = "features.tsv.gz", #' cells = "barcodes.tsv.gz" #' ) #' seurat_object <- CreateSeuratObject(counts = expression_matrix) #' #' # For remote files: #' #' expression_matrix <- ReadMtx(mtx = "http://localhost/matrix.mtx", #' cells = "http://localhost/barcodes.tsv", #' features = "http://localhost/genes.tsv") #' seurat_object <- CreateSeuratObject(counts = data) #' } #' ReadMtx <- function( mtx, cells, features, cell.column = 1, feature.column = 2, cell.sep = "\t", feature.sep = "\t", skip.cell = 0, skip.feature = 0, mtx.transpose = FALSE, unique.features = TRUE, strip.suffix = FALSE ) { all.files <- list( "expression matrix" = mtx, "barcode list" = cells, "feature list" = features ) for (i in seq_along(along.with = all.files)) { uri <- tryCatch( expr = { con <- url(description = all.files[[i]]) close(con = con) all.files[[i]] }, error = function(...) { return(normalizePath(path = all.files[[i]], winslash = '/')) } ) err <- paste("Cannot find", names(x = all.files)[i], "at", uri) uri <- build_url(url = parse_url(url = uri)) if (grepl(pattern = '^[A-Z]?:///', x = uri)) { uri <- gsub(pattern = '^://', replacement = '', x = uri) if (!file.exists(uri)) { stop(err, call. = FALSE) } } else { if (!Online(url = uri, seconds = 2L)) { stop(err, call. = FALSE) } if (file_ext(uri) == 'gz') { con <- url(description = uri) uri <- gzcon(con = con, text = TRUE) } } all.files[[i]] <- uri } cell.barcodes <- read.table( file = all.files[['barcode list']], header = FALSE, sep = cell.sep, row.names = NULL, skip = skip.cell ) feature.names <- read.table( file = all.files[['feature list']], header = FALSE, sep = feature.sep, row.names = NULL, skip = skip.feature ) # read barcodes bcols <- ncol(x = cell.barcodes) if (bcols < cell.column) { stop( "cell.column was set to ", cell.column, " but ", cells, " only has ", bcols, " columns.", " Try setting the cell.column argument to a value <= to ", bcols, "." ) } cell.names <- cell.barcodes[, cell.column] if (all(grepl(pattern = "\\-1$", x = cell.names)) & strip.suffix) { cell.names <- as.vector(x = as.character(x = sapply( X = cell.names, FUN = ExtractField, field = 1, delim = "-" ))) } # read features fcols <- ncol(x = feature.names) if (fcols < feature.column) { stop( "feature.column was set to ", feature.column, " but ", features, " only has ", fcols, " column(s).", " Try setting the feature.column argument to a value <= to ", fcols, "." ) } if (any(is.na(x = feature.names[, feature.column]))) { na.features <- which(x = is.na(x = feature.names[, feature.column])) replacement.column <- ifelse(test = feature.column == 2, yes = 1, no = 2) if (replacement.column > fcols) { stop( "Some features names are NA in column ", feature.column, ". Try specifiying a different column.", call. = FALSE ) } else { warning( "Some features names are NA in column ", feature.column, ". Replacing NA names with ID from column ", replacement.column, ".", call. = FALSE ) } feature.names[na.features, feature.column] <- feature.names[na.features, replacement.column] } feature.names <- feature.names[, feature.column] if (unique.features) { feature.names <- make.unique(names = feature.names) } data <- readMM(file = all.files[['expression matrix']]) if (mtx.transpose) { data <- t(x = data) } if (length(x = cell.names) != ncol(x = data)) { stop( "Matrix has ", ncol(data), " columns but found ", length(cell.names), " barcodes. ", ifelse( test = length(x = cell.names) > ncol(x = data), yes = "Try increasing `skip.cell`. ", no = "" ), call. = FALSE ) } if (length(x = feature.names) != nrow(x = data)) { stop( "Matrix has ", nrow(data), " rows but found ", length(feature.names), " features. ", ifelse( test = length(x = feature.names) > nrow(x = data), yes = "Try increasing `skip.feature`. ", no = "" ), call. = FALSE ) } colnames(x = data) <- cell.names rownames(x = data) <- feature.names data <- as.sparse(x = data) return(data) } #' Read and Load Nanostring SMI data #' #' @param data.dir Directory containing all Nanostring SMI files with #' default filenames #' @param mtx.file Path to Nanostring cell x gene matrix CSV #' @param metadata.file Contains metadata including cell center, area, #' and stain intensities #' @param molecules.file Path to molecules file #' @param segmentations.file Path to segmentations CSV #' @param type Type of cell spatial coordinate matrices to read; choose one #' or more of: #' \itemize{ #' \item \dQuote{centroids}: cell centroids in pixel coordinate space #' \item \dQuote{segmentations}: cell segmentations in pixel coordinate space #' } #' @param mol.type Type of molecule spatial coordinate matrices to read; #' choose one or more of: #' \itemize{ #' \item \dQuote{pixels}: molecule coordinates in pixel space #' } #' @param metadata Type of available metadata to read; #' choose zero or more of: #' \itemize{ #' \item \dQuote{Area}: number of pixels in cell segmentation #' \item \dQuote{fov}: cell's fov #' \item \dQuote{Mean.MembraneStain}: mean membrane stain intensity #' \item \dQuote{Mean.DAPI}: mean DAPI stain intensity #' \item \dQuote{Mean.G}: mean green channel stain intensity #' \item \dQuote{Mean.Y}: mean yellow channel stain intensity #' \item \dQuote{Mean.R}: mean red channel stain intensity #' \item \dQuote{Max.MembraneStain}: max membrane stain intensity #' \item \dQuote{Max.DAPI}: max DAPI stain intensity #' \item \dQuote{Max.G}: max green channel stain intensity #' \item \dQuote{Max.Y}: max yellow stain intensity #' \item \dQuote{Max.R}: max red stain intensity #' } #' @param mols.filter Filter molecules that match provided string #' @param genes.filter Filter genes from cell x gene matrix that match #' provided string #' @param fov.filter Only load in select FOVs. Nanostring SMI data contains #' 30 total FOVs. #' @param subset.counts.matrix If the counts matrix should be built from #' molecule coordinates for a specific segmentation; One of: #' \itemize{ #' \item \dQuote{Nuclear}: nuclear segmentations #' \item \dQuote{Cytoplasm}: cell cytoplasm segmentations #' \item \dQuote{Membrane}: cell membrane segmentations #' } #' @param cell.mols.only If TRUE, only load molecules within a cell #' #' @return \code{ReadNanostring}: A list with some combination of the #' following values: #' \itemize{ #' \item \dQuote{\code{matrix}}: a #' \link[Matrix:dgCMatrix-class]{sparse matrix} with expression data; cells #' are columns and features are rows #' \item \dQuote{\code{centroids}}: a data frame with cell centroid #' coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} #' \item \dQuote{\code{pixels}}: a data frame with molecule pixel coordinates #' in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{gene} #' } #' #' @importFrom future.apply future_lapply #' #' @export #' #' @order 1 #' #' @concept preprocessing #' #' @template section-progressr #' @template section-future #' #' @templateVar pkg data.table #' @template note-reqdpkg #' ReadNanostring <- function( data.dir, mtx.file = NULL, metadata.file = NULL, molecules.file = NULL, segmentations.file = NULL, type = 'centroids', mol.type = 'pixels', metadata = NULL, mols.filter = NA_character_, genes.filter = NA_character_, fov.filter = NULL, subset.counts.matrix = NULL, cell.mols.only = TRUE ) { if (isFALSE(x = requireNamespace('data.table', quietly = TRUE))) { stop("Please install 'data.table' for this function") } # Argument checking type <- match.arg( arg = type, choices = c('centroids', 'segmentations'), several.ok = TRUE ) mol.type <- match.arg( arg = mol.type, choices = c('pixels'), several.ok = TRUE ) if (!is.null(metadata)) { metadata <- match.arg( arg = metadata, choices = c( "Area", "fov", "Mean.MembraneStain", "Mean.DAPI", "Mean.G", "Mean.Y", "Mean.R", "Max.MembraneStain", "Max.DAPI", "Max.G", "Max.Y", "Max.R" ), several.ok = TRUE ) } use.dir <- all(vapply( X = c(mtx.file, metadata.file, molecules.file), FUN = function(x) { return(is.null(x = x) || is.na(x = x)) }, FUN.VALUE = logical(length = 1L) )) if (use.dir && !dir.exists(paths = data.dir)) { stop("Cannot find Nanostring directory ", data.dir) } # Identify input files files <- c( matrix = mtx.file %||% '[_a-zA-Z0-9]*_exprMat_file.csv', metadata.file = metadata.file %||% '[_a-zA-Z0-9]*_metadata_file.csv', molecules.file = molecules.file %||% '[_a-zA-Z0-9]*_tx_file.csv', segmentations.file = segmentations.file %||% '[_a-zA-Z0-9]*-polygons.csv' ) files <- vapply( X = files, FUN = function(x) { x <- as.character(x = x) if (isTRUE(x = dirname(path = x) == '.')) { fnames <- list.files( path = data.dir, pattern = x, recursive = FALSE, full.names = TRUE ) return(sort(x = fnames, decreasing = TRUE)[1L]) } else { return(x) } }, FUN.VALUE = character(length = 1L), USE.NAMES = TRUE ) files[!file.exists(files)] <- NA_character_ if (all(is.na(x = files))) { stop("Cannot find Nanostring input files in ", data.dir) } # Checking for loading spatial coordinates if (!is.na(x = files[['metadata.file']])) { pprecoord <- progressor() pprecoord( message = "Preloading cell spatial coordinates", class = 'sticky', amount = 0 ) md <- data.table::fread( file = files[['metadata.file']], sep = ',', data.table = FALSE, verbose = FALSE ) # filter metadata file by FOVs if (!is.null(x = fov.filter)) { md <- md[md$fov %in% fov.filter,] } pprecoord(type = 'finish') } if (!is.na(x = files[['segmentations.file']])) { ppresegs <- progressor() ppresegs( message = "Preloading cell segmentation vertices", class = 'sticky', amount = 0 ) segs <- data.table::fread( file = files[['segmentations.file']], sep = ',', data.table = FALSE, verbose = FALSE ) # filter metadata file by FOVs if (!is.null(x = fov.filter)) { segs <- segs[segs$fov %in% fov.filter,] } ppresegs(type = 'finish') } # Check for loading of molecule coordinates if (!is.na(x = files[['molecules.file']])) { ppremol <- progressor() ppremol( message = "Preloading molecule coordinates", class = 'sticky', amount = 0 ) mx <- data.table::fread( file = files[['molecules.file']], sep = ',', verbose = FALSE ) # filter molecules file by FOVs if (!is.null(x = fov.filter)) { mx <- mx[mx$fov %in% fov.filter,] } # Molecules outside of a cell have a cell_ID of 0 if (cell.mols.only) { mx <- mx[mx$cell_ID != 0,] } if (!is.na(x = mols.filter)) { ppremol( message = paste("Filtering molecules with pattern", mols.filter), class = 'sticky', amount = 0 ) mx <- mx[!grepl(pattern = mols.filter, x = mx$target), , drop = FALSE] } ppremol(type = 'finish') mols <- rep_len(x = files[['molecules.file']], length.out = length(x = mol.type)) names(x = mols) <- mol.type files <- c(files, mols) files <- files[setdiff(x = names(x = files), y = 'molecules.file')] } files <- files[!is.na(x = files)] outs <- list("matrix"=NULL, "pixels"=NULL, "centroids"=NULL) if (!is.null(metadata)) { outs <- append(outs, list("metadata" = NULL)) } if ("segmentations" %in% type) { outs <- append(outs, list("segmentations" = NULL)) } for (otype in names(x = outs)) { outs[[otype]] <- switch( EXPR = otype, 'matrix' = { ptx <- progressor() ptx(message = 'Reading counts matrix', class = 'sticky', amount = 0) if (!is.null(subset.counts.matrix)) { tx <- build.cellcomp.matrix(mols.df=mx, class=subset.counts.matrix) } else { tx <- data.table::fread( file = files[[otype]], sep = ',', data.table = FALSE, verbose = FALSE ) # Combination of Cell ID (for non-zero cell_IDs) and FOV are assumed to be unique. Used to create barcodes / rownames. bcs <- paste0(as.character(tx$cell_ID), "_", tx$fov) rownames(x = tx) <- bcs # remove all rows which represent counts of mols not assigned to a cell for each FOV tx <- tx[!tx$cell_ID == 0,] # filter fovs from counts matrix if (!is.null(x = fov.filter)) { tx <- tx[tx$fov %in% fov.filter,] } tx <- subset(tx, select = -c(fov, cell_ID)) } tx <- as.data.frame(t(x = as.matrix(x = tx))) if (!is.na(x = genes.filter)) { ptx( message = paste("Filtering genes with pattern", genes.filter), class = 'sticky', amount = 0 ) tx <- tx[!grepl(pattern = genes.filter, x = rownames(x = tx)), , drop = FALSE] } # only keep cells with counts greater than 0 tx <- tx[, which(colSums(tx) != 0)] ratio <- getOption(x = 'Seurat.input.sparse_ratio', default = 0.4) if ((sum(tx == 0) / length(x = tx)) > ratio) { ptx( message = 'Converting counts to sparse matrix', class = 'sticky', amount = 0 ) tx <- as.sparse(x = tx) } ptx(type = 'finish') tx }, 'centroids' = { pcents <- progressor() pcents( message = 'Creating centroid coordinates', class = 'sticky', amount = 0 ) pcents(type = 'finish') data.frame( x = md$CenterX_global_px, y = md$CenterY_global_px, cell = paste0(as.character(md$cell_ID), "_", md$fov), stringsAsFactors = FALSE ) }, 'segmentations' = { pcents <- progressor() pcents( message = 'Creating segmentation coordinates', class = 'sticky', amount = 0 ) pcents(type = 'finish') data.frame( x = segs$x_global_px, y = segs$y_global_px, cell = paste0(as.character(segs$cellID), "_", segs$fov), # cell_ID column in this file doesn't have an underscore stringsAsFactors = FALSE ) }, 'metadata' = { pmeta <- progressor() pmeta( message = 'Loading metadata', class = 'sticky', amount = 0 ) pmeta(type = 'finish') df <- md[,metadata] df$cell <- paste0(as.character(md$cell_ID), "_", md$fov) df }, 'pixels' = { ppixels <- progressor() ppixels( message = 'Creating pixel-level molecule coordinates', class = 'sticky', amount = 0 ) df <- data.frame( x = mx$x_global_px, y = mx$y_global_px, gene = mx$target, stringsAsFactors = FALSE ) ppixels(type = 'finish') df }, # 'microns' = { # pmicrons <- progressor() # pmicrons( # message = "Creating micron-level molecule coordinates", # class = 'sticky', # amount = 0 # ) # df <- data.frame( # x = mx$global_x, # y = mx$global_y, # gene = mx$gene, # stringsAsFactors = FALSE # ) # pmicrons(type = 'finish') # df # }, stop("Unknown Nanostring input type: ", outs[[otype]]) ) } return(outs) } #' Read and Load 10x Genomics Xenium in-situ data #' #' @param data.dir Directory containing all Xenium output files with #' default filenames #' @param outs Types of molecular outputs to read; choose one or more of: #' \itemize{ #' \item \dQuote{matrix}: the counts matrix #' \item \dQuote{microns}: molecule coordinates #' \item \dQuote{segmentation_method}: cell segmentation method (for runs which #' use multi-modal segmentation) #' } #' @param type Type of cell spatial coordinate matrices to read; choose one #' or more of: #' \itemize{ #' \item \dQuote{centroids}: cell centroids in pixel coordinate space #' \item \dQuote{segmentations}: cell segmentations in pixel coordinate space #' \item \dQuote{nucleus_segmentations}: nucleus segmentations in pixel coordinate space #' } #' @param mols.qv.threshold Remove transcript molecules with #' a QV less than this threshold. QV >= 20 is the standard threshold #' used to construct the cell x gene count matrix. #' #' @return \code{ReadXenium}: A list with some combination of the #' following values: #' \itemize{ #' \item \dQuote{\code{matrix}}: a #' \link[Matrix:dgCMatrix-class]{sparse matrix} with expression data; cells #' are columns and features are rows #' \item \dQuote{\code{centroids}}: a data frame with cell centroid #' coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} #' \item \dQuote{\code{pixels}}: a data frame with molecule pixel coordinates #' in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{gene} #' } #' #' #' @export #' @concept preprocessing #' ReadXenium <- function( data.dir, outs = c("segmentation_method", "matrix", "microns"), type = "centroids", mols.qv.threshold = 20, flip.xy = F ) { # Argument checking type <- match.arg( arg = type, choices = c("centroids", "segmentations", "nucleus_segmentations"), several.ok = TRUE ) outs <- match.arg( arg = outs, choices = c("segmentation_method", "matrix", "microns"), several.ok = TRUE ) outs <- c(outs, type) has_dt <- requireNamespace("data.table", quietly = TRUE) && requireNamespace("R.utils", quietly = TRUE) has_arrow <- requireNamespace("arrow", quietly = TRUE) has_hdf5r <- requireNamespace("hdf5r", quietly = TRUE) binary_to_string <- function(arrow_binary) { if(typeof(arrow_binary) == 'list') { unlist( lapply( arrow_binary, function(x) rawToChar(as.raw(strtoi(x, 16L))) ) ) } else { arrow_binary } } data <- sapply(outs, function(otype) { switch( EXPR = otype, 'matrix' = { pmtx <- progressor() pmtx(message = 'Reading counts matrix', class = 'sticky', amount = 0) for(option in Filter(function(x) x$req, list( list(filename = "cell_feature_matrix.h5", fn = Read10X_h5, req = has_hdf5r), list(filename = "cell_feature_matrix", fn = Read10X, req = TRUE) ))) { matrix <- try(suppressWarnings(option$fn(file.path(data.dir, option$filename)))) if(!inherits(matrix, "try-error")) { break } } if(!exists('matrix') || inherits(matrix, "try-error")) { stop("Xenium outputs were incomplete: missing cell_feature_matrix") } pmtx(type = "finish") matrix }, 'segmentation_method' = { psegs <- progressor() psegs( message = 'Loading cell metadata', class = 'sticky', amount = 0 ) col.use <- c( cell_id = 'cell', segmentation_method = 'segmentation_method' ) for(option in Filter(function(x) x$req, list( list( filename = "cells.parquet", fn = function(x) as.data.frame(arrow::read_parquet(x, col_select = names(col.use))), req = has_arrow ), list( filename = "cells.csv.gz", fn = function(x) data.table::fread(x, data.table = FALSE, stringsAsFactors = FALSE, select = names(col.use)), req = has_dt ), list(filename = "cells.csv.gz", fn = function(x) read.csv(x, stringsAsFactors = FALSE), req = TRUE) ))) { cell_seg <- try(suppressWarnings(option$fn(file.path(data.dir, option$filename))), silent = TRUE) if(!inherits(cell_seg, "try-error")) { break } } if (!exists("cell_seg") || inherits(cell_seg, "try-error")) { warning("cells did not contain a segmentation_method column. Skipping...", call. = FALSE, immediate. = TRUE) NULL } else { #Attempt to add default segmentation_method if nuclei/cell boundary files are provided message("Cell_seg columns: ", paste(colnames(cell_seg), collapse = ", ")) if (!"segmentation_method" %in% colnames(cell_seg)) { message("Adding default segmentation_method = 'cell'") cell_seg$segmentation_method <- "cell" } #Try to detect unique cell identifier if (!"cell_id" %in% colnames(cell_seg)) { stop("Missing required column: cell_id") } cell_seg <- cell_seg[, c("cell_id", "segmentation_method")] colnames(cell_seg) <- c("cell", "segmentation_method") cell_seg$cell <- binary_to_string(cell_seg$cell) psegs(type = "finish") data.frame(segmentation_method = cell_seg$segmentation_method, row.names = cell_seg$cell) } }, 'centroids' = { pcents <- progressor() pcents( message = 'Loading cell centroids', class = 'sticky', amount = 0 ) col.use <- c( x_centroid = letters[24 + flip.xy], y_centroid = letters[25 - flip.xy], cell_id = 'cell' ) for(option in Filter(function(x) x$req, list( list( filename = "cells.parquet", fn = function(x) as.data.frame(arrow::read_parquet(x, col_select = names(col.use))), req = has_arrow ), list( filename = "cells.csv.gz", fn = function(x) data.table::fread(x, data.table = FALSE, stringsAsFactors = FALSE, select = names(col.use)), req = has_dt ), list(filename = "cells.csv.gz", fn = function(x) read.csv(x, stringsAsFactors = FALSE), req = TRUE) ))) { cell_info <- try(suppressWarnings(option$fn(file.path(data.dir, option$filename)))) if(!inherits(cell_info, "try-error")) { break } } if(!exists('cell_info') || inherits(cell_info, "try-error")) { stop("Xenium outputs were incomplete: missing cells") } cell_info$cell_id <- binary_to_string(cell_info$cell_id) cell_info <- cell_info[, names(col.use)] colnames(cell_info) <- col.use pcents(type = 'finish') cell_info }, 'segmentations' = { psegs <- progressor() psegs( message = 'Loading cell segmentations', class = 'sticky', amount = 0 ) for(option in Filter(function(x) x$req, list( list( filename = "cell_boundaries.parquet", fn = function(x) as.data.frame(arrow::read_parquet(x)), req = has_arrow ), list( filename = "cell_boundaries.csv.gz", fn = function(x) data.table::fread(x, data.table = FALSE, stringsAsFactors = FALSE), req = has_dt ), list(filename = "cell_boundaries.csv.gz", fn = function(x) read.csv(x, stringsAsFactors = FALSE), req = TRUE) ))) { cell_boundaries_df <- try(suppressWarnings(option$fn(file.path(data.dir, option$filename)))) if(!inherits(cell_boundaries_df, "try-error")) { break } } if(!exists('cell_boundaries_df') || inherits(cell_boundaries_df, "try-error")) { stop("Xenium outputs were incomplete: missing cell_boundaries") } colnames(cell_boundaries_df) <- c( 'cell', letters[24 + flip.xy], letters[25 - flip.xy] ) cell_boundaries_df$cell <- binary_to_string(cell_boundaries_df$cell) psegs(type = "finish") cell_boundaries_df }, 'nucleus_segmentations' = { psegs <- progressor() psegs( message = 'Loading nucleus segmentations', class = 'sticky', amount = 0 ) for(option in Filter(function(x) x$req, list( list( filename = "nucleus_boundaries.parquet", fn = function(x) as.data.frame(arrow::read_parquet(x)), req = has_arrow ), list( filename = "nucleus_boundaries.csv.gz", fn = function(x) data.table::fread(x, data.table = FALSE, stringsAsFactors = FALSE), req = has_dt ), list(filename = "nucleus_boundaries.csv.gz", fn = function(x) read.csv(x, stringsAsFactors = FALSE), req = TRUE) ))) { nucleus_boundaries_df <- try(suppressWarnings(option$fn(file.path(data.dir, option$filename)))) if(!inherits(nucleus_boundaries_df, "try-error")) { break } } if(!exists('nucleus_boundaries_df') || inherits(nucleus_boundaries_df, "try-error")) { stop("Xenium outputs were incomplete: missing nucleus_boundaries") } colnames(nucleus_boundaries_df) <- c( 'cell', letters[24 + flip.xy], letters[25 - flip.xy] ) nucleus_boundaries_df$cell <- binary_to_string(nucleus_boundaries_df$cell) psegs(type = "finish") nucleus_boundaries_df }, 'microns' = { pmicrons <- progressor() pmicrons( message = "Loading molecule coordinates", class = 'sticky', amount = 0 ) col.use = c( x_location = letters[24+flip.xy], y_location = letters[25-flip.xy], feature_name = 'gene' ) for(option in Filter(function(x) x$req, list( list( filename = "transcripts.parquet", fn = function(x) as.data.frame(arrow::read_parquet(x, col_select = names(col.use))), req = has_arrow ), list( filename = "transcripts.csv.gz", fn = function(x) data.table::fread(x, data.table = FALSE, select = names(col.use), stringsAsFactors = FALSE), req = has_dt ), list(filename = "transcripts.csv.gz", fn = function(x) read.csv(x, stringsAsFactors = FALSE), req = TRUE) ))) { transcripts <- try(suppressWarnings(option$fn(file.path(data.dir, option$filename)))) if(!inherits(transcripts, "try-error")) { break } } if(!exists('transcripts') || inherits(transcripts, "try-error")) { hint <- "" if(file.exists(file.path(data.dir, "transcripts.parquet"))) { hint <- ". Xenium outputs no longer include `transcripts.csv.gz`. Instead, please install `arrow` to read transcripts.parquet" } stop(paste0("Xenium outputs were incomplete: missing transcripts", hint)) } transcripts <- transcripts[, names(col.use)] colnames(transcripts) <- col.use transcripts$gene <- binary_to_string(transcripts$gene) pmicrons(type = 'finish') transcripts }, stop("Unknown Xenium input type: ", otype) ) }, simplify = FALSE, USE.NAMES = TRUE) metadata <- file.path(data.dir, "experiment.xenium") if(file.exists(metadata) && requireNamespace("jsonlite", quietly = TRUE)) { meta <- jsonlite::read_json(metadata) data$metadata <- meta[ intersect( names(meta), c( 'run_start_time', 'preservation_method', 'panel_name', 'panel_organism', 'panel_tissue_type', 'instrument_sw_version', 'segmentation_stain' ) ) ] } return(data) } #' Load Slide-seq spatial data #' #' @param coord.file Path to csv file containing bead coordinate positions #' @param assay Name of assay to associate image to #' #' @return A \code{\link{SlideSeq}} object #' #' @importFrom utils read.csv #' #' @seealso \code{\link{SlideSeq}} #' #' @export #' @concept preprocessing #' ReadSlideSeq <- function(coord.file, assay = 'Spatial') { if (!file.exists(paths = coord.file)) { stop("Cannot find coord file ", coord.file, call. = FALSE) } slide.seq <- new( Class = 'SlideSeq', assay = assay, coordinates = read.csv( file = coord.file, header = TRUE, as.is = TRUE, row.names = 1 ) ) return(slide.seq) } #' Read Data From Vitessce #' #' Read in data from Vitessce-formatted JSON files #' #' @param counts Path or URL to a Vitessce-formatted JSON file with #' expression data; should end in \dQuote{\code{.genes.json}} or #' \dQuote{\code{.clusters.json}}; pass \code{NULL} to skip #' @param coords Path or URL to a Vitessce-formatted JSON file with cell/spot #' spatial coordinates; should end in \dQuote{\code{.cells.json}}; #' pass \code{NULL} to skip #' @param molecules Path or URL to a Vitessce-formatted JSON file with molecule #' spatial coordinates; should end in \dQuote{\code{.molecules.json}}; #' pass \code{NULL} to skip #' @param type Type of cell/spot spatial coordinates to return, #' choose one or more from: #' \itemize{ #' \item \dQuote{segmentations} cell/spot segmentations #' \item \dQuote{centroids} cell/spot centroids #' } #' @param filter A character to filter molecules by, pass \code{NA} to skip #' molecule filtering #' #' @return \code{ReadVitessce}: A list with some combination of the #' following values: #' \itemize{ #' \item \dQuote{\code{counts}}: if \code{counts} is not \code{NULL}, an #' expression matrix with cells as columns and features as rows #' \item \dQuote{\code{centroids}}: if \code{coords} is not \code{NULL} and #' \code{type} is contains\dQuote{centroids}, a data frame with cell centroids #' in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} #' \item \dQuote{\code{segmentations}}: if \code{coords} is not \code{NULL} and #' \code{type} contains \dQuote{centroids}, a data frame with cell #' segmentations in three columns: \dQuote{x}, \dQuote{y} and \dQuote{cell} #' \item \dQuote{\code{molecules}}: if \code{molecules} is not \code{NULL}, a #' data frame with molecule spatial coordinates in three columns: \dQuote{x}, #' \dQuote{y}, and \dQuote{gene} #' } #' #' @importFrom jsonlite read_json #' @importFrom tools file_ext file_path_sans_ext #' #' @export #' #' @order 1 #' #' @concept preprocessing #' #' @template section-progressr #' #' @templateVar pkg jsonlite #' @template note-reqdpkg #' #' @examples #' \dontrun{ #' coords <- ReadVitessce( #' counts = #' "https://s3.amazonaws.com/vitessce-data/0.0.31/master_release/wang/wang.genes.json", #' coords = #' "https://s3.amazonaws.com/vitessce-data/0.0.31/master_release/wang/wang.cells.json", #' molecules = #' "https://s3.amazonaws.com/vitessce-data/0.0.31/master_release/wang/wang.molecules.json" #' ) #' names(coords) #' coords$counts[1:10, 1:10] #' head(coords$centroids) #' head(coords$segmentations) #' head(coords$molecules) #' } #' ReadVitessce <- function( counts = NULL, coords = NULL, molecules = NULL, type = c('segmentations', 'centroids'), filter = NA_character_ ) { if (isFALSE(x = requireNamespace('jsonlite', quietly = TRUE))) { stop("Please install 'jsonlite' for this function") } type <- match.arg(arg = type, several.ok = TRUE) nouts <- c( counts %iff% 'counts', coords %iff% type, molecules %iff% 'molecules' ) outs <- vector(mode = 'list', length = length(x = nouts)) names(x = outs) <- nouts if (!is.null(x = coords)) { ppreload <- progressor() ppreload(message = "Preloading coordinates", class = 'sticky', amount = 0) cells <- read_json(path = coords) ppreload(type = 'finish') } for (i in nouts) { outs[[i]] <- switch( EXPR = i, 'counts' = { counts.type <- file_ext(x = basename(path = file_path_sans_ext( x = counts ))) cts <- switch( EXPR = counts.type, 'clusters' = .ReadVitessceClusters(counts = counts), 'genes' = .ReadVitessceGenes(counts = counts), stop("Unknown Vitessce counts filetype: '", counts.type, "'") ) pcts <- progressor() if (!is.na(x = filter)) { pcts( message = paste("Filtering genes with pattern", filter), class = 'sticky', amount = 0 ) cts <- cts[!grepl(pattern = filter, x = rownames(x = cts)), , drop = FALSE] } ratio <- getOption(x = 'Seurat.input.sparse_ratio', default = 0.4) if ((sum(cts == 0) / length(x = cts)) > ratio) { pcts( message = 'Converting counts to sparse matrix', class = 'sticky', amount = 0 ) cts <- as.sparse(x = cts) } pcts(type = 'finish') cts }, 'centroids' = { pcents <- progressor(steps = length(x = cells)) pcents(message = "Reading centroids", class = 'sticky', amount = 0) centroids <- lapply( X = names(x = cells), FUN = function(x) { cents <- cells[[x]]$xy names(x = cents) <- c('x', 'y') cents <- as.data.frame(x = cents) cents$cell <- x pcents() return(cents) } ) pcents(type = 'finish') do.call(what = 'rbind', args = centroids) }, 'segmentations' = { psegs <- progressor(steps = length(x = cells)) psegs(message = "Reading segmentations", class = 'sticky', amount = 0) segmentations <- lapply( X = names(x = cells), FUN = function(x) { poly <- cells[[x]]$poly poly <- lapply(X = poly, FUN = unlist) poly <- as.data.frame(x = do.call(what = 'rbind', args = poly)) colnames(x = poly) <- c('x', 'y') poly$cell <- x psegs() return(poly) } ) psegs(type = 'finish') do.call(what = 'rbind', args = segmentations) }, 'molecules' = { pmols1 <- progressor() pmols1(message = "Reading molecules", class = 'sticky', amount = 0) pmols1(type = 'finish') mols <- read_json(path = molecules) pmols2 <- progressor(steps = length(x = mols)) mols <- lapply( X = names(x = mols), FUN = function(m) { x <- mols[[m]] x <- lapply(X = x, FUN = unlist) x <- as.data.frame(x = do.call(what = 'rbind', args = x)) colnames(x = x) <- c('x', 'y') x$gene <- m pmols2() return(x) } ) mols <- do.call(what = 'rbind', args = mols) pmols2(type = 'finish') if (!is.na(x = filter)) { pmols3 <- progressor() pmols3( message = paste("Filtering molecules with pattern", filter), class = 'sticky', amount = 0 ) pmols3(type = 'finish') mols <- mols[!grepl(pattern = filter, x = mols$gene), , drop = FALSE] } mols }, stop("Unknown data type: ", i) ) } return(outs) } #' Read and Load MERFISH Input from Vizgen #' #' Read and load in MERFISH data from Vizgen-formatted files #' #' @inheritParams ReadVitessce #' @param data.dir Path to the directory with Vizgen MERFISH files; requires at #' least one of the following files present: #' \itemize{ #' \item \dQuote{\code{cell_by_gene.csv}}: used for reading count matrix #' \item \dQuote{\code{cell_metadata.csv}}: used for reading cell spatial #' coordinate matrices #' \item \dQuote{\code{detected_transcripts.csv}}: used for reading molecule #' spatial coordinate matrices #' } #' @param transcripts Optional file path for counts matrix; pass \code{NA} to #' suppress reading counts matrix #' @param spatial Optional file path for spatial metadata; pass \code{NA} to #' suppress reading spatial coordinates. If \code{spatial} is provided and #' \code{type} is \dQuote{segmentations}, uses \code{dirname(spatial)} instead of #' \code{data.dir} to find HDF5 files #' @param molecules Optional file path for molecule coordinates file; pass #' \code{NA} to suppress reading spatial molecule information #' @param type Type of cell spatial coordinate matrices to read; choose one #' or more of: #' \itemize{ #' \item \dQuote{segmentations}: cell segmentation vertices; requires #' \href{https://cran.r-project.org/package=hdf5r}{\pkg{hdf5r}} to be #' installed and requires a directory \dQuote{\code{cell_boundaries}} within #' \code{data.dir}. Within \dQuote{\code{cell_boundaries}}, there must be #' one or more HDF5 file named \dQuote{\code{feature_data_##.hdf5}} #' \item \dQuote{centroids}: cell centroids in micron coordinate space #' \item \dQuote{boxes}: cell box outlines in micron coordinate space #' } #' @param mol.type Type of molecule spatial coordinate matrices to read; #' choose one or more of: #' \itemize{ #' \item \dQuote{pixels}: molecule coordinates in pixel space #' \item \dQuote{microns}: molecule coordinates in micron space #' } #' @param metadata Type of available metadata to read; #' choose zero or more of: #' \itemize{ #' \item \dQuote{volume}: estimated cell volume #' \item \dQuote{fov}: cell's fov #' } #' @param z Z-index to load; must be between 0 and 6, inclusive #' #' @return \code{ReadVizgen}: A list with some combination of the #' following values: #' \itemize{ #' \item \dQuote{\code{transcripts}}: a #' \link[Matrix:dgCMatrix-class]{sparse matrix} with expression data; cells #' are columns and features are rows #' \item \dQuote{\code{segmentations}}: a data frame with cell polygon outlines in #' three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} #' \item \dQuote{\code{centroids}}: a data frame with cell centroid #' coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} #' \item \dQuote{\code{boxes}}: a data frame with cell box outlines in three #' columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} #' \item \dQuote{\code{microns}}: a data frame with molecule micron #' coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{gene} #' \item \dQuote{\code{pixels}}: a data frame with molecule pixel coordinates #' in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{gene} #' \item \dQuote{\code{metadata}}: a data frame with the cell-level metadata #' requested by \code{metadata} #' } #' #' @importFrom future.apply future_lapply #' #' @export #' #' @order 1 #' #' @concept preprocessing #' #' @template section-progressr #' @template section-future #' #' @templateVar pkg data.table #' @template note-reqdpkg #' ReadVizgen <- function( data.dir, transcripts = NULL, spatial = NULL, molecules = NULL, type = 'segmentations', mol.type = 'microns', metadata = NULL, filter = NA_character_, z = 3L ) { # TODO: handle multiple segmentations per z-plane if (isFALSE(x = requireNamespace('data.table', quietly = TRUE))) { stop("Please install 'data.table' for this function") } # hdf5r is only used for loading polygon boundaries # Not needed for all Vizgen input hdf5 <- requireNamespace("hdf5r", quietly = TRUE) # Argument checking type <- match.arg( arg = type, choices = c('segmentations', 'centroids', 'boxes'), several.ok = TRUE ) mol.type <- match.arg( arg = mol.type, choices = c('pixels', 'microns'), several.ok = TRUE ) if (!is.null(x = metadata)) { metadata <- match.arg( arg = metadata, choices = c("volume", "fov"), several.ok = TRUE ) } if (!z %in% seq.int(from = 0L, to = 6L)) { stop("The z-index must be in the range [0, 6]") } use.dir <- all(vapply( X = c(transcripts, spatial, molecules), FUN = function(x) { return(is.null(x = x) || is.na(x = x)) }, FUN.VALUE = logical(length = 1L) )) if (use.dir && !dir.exists(paths = data.dir)) { stop("Cannot find Vizgen directory ", data.dir) } # Identify input files files <- c( transcripts = transcripts %||% 'cell_by_gene[_a-zA-Z0-9]*.csv', spatial = spatial %||% 'cell_metadata[_a-zA-Z0-9]*.csv', molecules = molecules %||% 'detected_transcripts[_a-zA-Z0-9]*.csv' ) files[is.na(x = files)] <- NA_character_ h5dir <- file.path( ifelse( test = dirname(path = files['spatial']) == '.', yes = data.dir, no = dirname(path = files['spatial']) ), 'cell_boundaries' ) zidx <- paste0('zIndex_', z) files <- vapply( X = files, FUN = function(x) { x <- as.character(x = x) if (isTRUE(x = dirname(path = x) == '.')) { fnames <- list.files( path = data.dir, pattern = x, recursive = FALSE, full.names = TRUE ) return(sort(x = fnames, decreasing = TRUE)[1L]) } else { return(x) } }, FUN.VALUE = character(length = 1L), USE.NAMES = TRUE ) files[!file.exists(files)] <- NA_character_ if (all(is.na(x = files))) { stop("Cannot find Vizgen input files in ", data.dir) } # Checking for loading spatial coordinates if (!is.na(x = files[['spatial']])) { pprecoord <- progressor() pprecoord( message = "Preloading cell spatial coordinates", class = 'sticky', amount = 0 ) sp <- data.table::fread( file = files[['spatial']], sep = ',', data.table = FALSE, verbose = FALSE # showProgress = progressr:::progressr_in_globalenv(action = 'query') # showProgress = verbose ) pprecoord(type = 'finish') rownames(x = sp) <- as.character(x = sp[, 1]) sp <- sp[, -1, drop = FALSE] # Check to see if we should load segmentations if ('segmentations' %in% type) { poly <- if (isFALSE(x = hdf5)) { warning( "Cannot find hdf5r; unable to load segmentation vertices", immediate. = TRUE ) FALSE } else if (!dir.exists(paths = h5dir)) { warning("Cannot find cell boundary H5 files", immediate. = TRUE) FALSE } else { TRUE } if (isFALSE(x = poly)) { type <- setdiff(x = type, y = 'segmentations') } } spatials <- rep_len(x = files[['spatial']], length.out = length(x = type)) names(x = spatials) <- type files <- c(files, spatials) files <- files[setdiff(x = names(x = files), y = 'spatial')] } else if (!is.null(x = metadata)) { warning( "metadata can only be loaded when spatial coordinates are loaded", immediate. = TRUE ) metadata <- NULL } # Check for loading of molecule coordinates if (!is.na(x = files[['molecules']])) { ppremol <- progressor() ppremol( message = "Preloading molecule coordinates", class = 'sticky', amount = 0 ) mx <- data.table::fread( file = files[['molecules']], sep = ',', verbose = FALSE # showProgress = verbose ) mx <- mx[mx$global_z == z, , drop = FALSE] if (!is.na(x = filter)) { ppremol( message = paste("Filtering molecules with pattern", filter), class = 'sticky', amount = 0 ) mx <- mx[!grepl(pattern = filter, x = mx$gene), , drop = FALSE] } ppremol(type = 'finish') mols <- rep_len(x = files[['molecules']], length.out = length(x = mol.type)) names(x = mols) <- mol.type files <- c(files, mols) files <- files[setdiff(x = names(x = files), y = 'molecules')] } files <- files[!is.na(x = files)] # Read input data outs <- vector(mode = 'list', length = length(x = files)) names(x = outs) <- names(x = files) if (!is.null(metadata)) { outs <- c(outs, list(metadata = NULL)) } for (otype in names(x = outs)) { outs[[otype]] <- switch( EXPR = otype, 'transcripts' = { ptx <- progressor() ptx(message = 'Reading counts matrix', class = 'sticky', amount = 0) tx <- data.table::fread( file = files[[otype]], sep = ',', data.table = FALSE, verbose = FALSE ) rownames(x = tx) <- as.character(x = tx[, 1]) tx <- t(x = as.matrix(x = tx[, -1, drop = FALSE])) if (!is.na(x = filter)) { ptx( message = paste("Filtering genes with pattern", filter), class = 'sticky', amount = 0 ) tx <- tx[!grepl(pattern = filter, x = rownames(x = tx)), , drop = FALSE] } ratio <- getOption(x = 'Seurat.input.sparse_ratio', default = 0.4) if ((sum(tx == 0) / length(x = tx)) > ratio) { ptx( message = 'Converting counts to sparse matrix', class = 'sticky', amount = 0 ) tx <- as.sparse(x = tx) } ptx(type = 'finish') tx }, 'centroids' = { pcents <- progressor() pcents( message = 'Creating centroid coordinates', class = 'sticky', amount = 0 ) pcents(type = 'finish') data.frame( x = sp$center_x, y = sp$center_y, cell = rownames(x = sp), stringsAsFactors = FALSE ) }, 'segmentations' = { ppoly <- progressor(steps = length(x = unique(x = sp$fov))) ppoly( message = "Creating polygon coordinates", class = 'sticky', amount = 0 ) pg <- future_lapply( X = unique(x = sp$fov), FUN = function(f, ...) { fname <- file.path(h5dir, paste0('feature_data_', f, '.hdf5')) if (!file.exists(fname)) { warning( "Cannot find HDF5 file for field of view ", f, immediate. = TRUE ) return(NULL) } hfile <- hdf5r::H5File$new(filename = fname, mode = 'r') on.exit(expr = hfile$close_all()) cells <- rownames(x = subset(x = sp, subset = fov == f)) df <- lapply( X = cells, FUN = function(x) { return(tryCatch( expr = { cc <- hfile[['featuredata']][[x]][[zidx]][['p_0']][['coordinates']]$read() cc <- as.data.frame(x = t(x = cc)) colnames(x = cc) <- c('x', 'y') cc$cell <- x cc }, error = function(...) { return(NULL) } )) } ) ppoly() return(do.call(what = 'rbind', args = df)) } ) ppoly(type = 'finish') pg <- do.call(what = 'rbind', args = pg) npg <- length(x = unique(x = pg$cell)) if (npg < nrow(x = sp)) { warning( nrow(x = sp) - npg, " cells missing polygon information", immediate. = TRUE ) } pg }, 'boxes' = { pbox <- progressor(steps = nrow(x = sp)) pbox(message = "Creating box coordinates", class = 'sticky', amount = 0) bx <- future_lapply( X = rownames(x = sp), FUN = function(cell) { row <- sp[cell, ] df <- expand.grid( x = c(row$min_x, row$max_x), y = c(row$min_y, row$max_y), cell = cell, KEEP.OUT.ATTRS = FALSE, stringsAsFactors = FALSE ) df <- df[c(1, 3, 4, 2), , drop = FALSE] pbox() return(df) } ) pbox(type = 'finish') do.call(what = 'rbind', args = bx) }, 'metadata' = { pmeta <- progressor() pmeta( message = 'Loading metadata', class = 'sticky', amount = 0 ) pmeta(type = 'finish') sp[, metadata, drop = FALSE] }, 'pixels' = { ppixels <- progressor() ppixels( message = 'Creating pixel-level molecule coordinates', class = 'sticky', amount = 0 ) df <- data.frame( x = mx$x, y = mx$y, gene = mx$gene, stringsAsFactors = FALSE ) # if (!is.na(x = filter)) { # ppixels( # message = paste("Filtering molecules with pattern", filter), # class = 'sticky', # amount = 0 # ) # df <- df[!grepl(pattern = filter, x = df$gene), , drop = FALSE] # } ppixels(type = 'finish') df }, 'microns' = { pmicrons <- progressor() pmicrons( message = "Creating micron-level molecule coordinates", class = 'sticky', amount = 0 ) df <- data.frame( x = mx$global_x, y = mx$global_y, gene = mx$gene, stringsAsFactors = FALSE ) # if (!is.na(x = filter)) { # pmicrons( # message = paste("Filtering molecules with pattern", filter), # class = 'sticky', # amount = 0 # ) # df <- df[!grepl(pattern = filter, x = df$gene), , drop = FALSE] # } pmicrons(type = 'finish') df }, stop("Unknown MERFISH input type: ", type) ) } return(outs) } #' Normalize raw data to fractions #' #' Normalize count data to relative counts per cell by dividing by the total #' per cell. Optionally use a scale factor, e.g. for counts per million (CPM) #' use \code{scale.factor = 1e6}. #' #' @param data Matrix with the raw count data #' @param scale.factor Scale the result. Default is 1 #' @param verbose Print progress #' @return Returns a matrix with the relative counts #' #' @importFrom methods as #' @importFrom Matrix colSums #' #' @export #' @concept preprocessing #' #' @examples #' mat <- matrix(data = rbinom(n = 25, size = 5, prob = 0.2), nrow = 5) #' mat #' mat_norm <- RelativeCounts(data = mat) #' mat_norm #' RelativeCounts <- function(data, scale.factor = 1, verbose = TRUE) { if (is.data.frame(x = data)) { data <- as.matrix(x = data) } if (!inherits(x = data, what = 'dgCMatrix')) { data <- as.sparse(x = data) } if (verbose) { cat("Performing relative-counts-normalization\n", file = stderr()) } norm.data <- data norm.data@x <- norm.data@x / rep.int(Matrix::colSums(norm.data), diff(norm.data@p)) * scale.factor return(norm.data) } #' Run the mark variogram computation on a given position matrix and expression #' matrix. #' #' Wraps the functionality of markvario from the spatstat package. #' #' @param spatial.location A 2 column matrix giving the spatial locations of #' each of the data points also in data #' @param data Matrix containing the data used as "marks" (e.g. gene expression) #' @param ... Arguments passed to markvario #' #' @importFrom spatstat.explore markvario #' @importFrom spatstat.geom ppp #' #' @export #' @concept preprocessing #' RunMarkVario <- function( spatial.location, data, ... ) { pp <- ppp( x = spatial.location[, 1], y = spatial.location[, 2], xrange = range(spatial.location[, 1]), yrange = range(spatial.location[, 2]) ) if (nbrOfWorkers() > 1) { chunks <- nbrOfWorkers() features <- rownames(x = data) features <- split( x = features, f = ceiling(x = seq_along(along.with = features) / (length(x = features) / chunks)) ) mv <- future_lapply(X = features, FUN = function(x) { pp[["marks"]] <- as.data.frame(x = t(x = data[x, ])) markvario(X = pp, normalise = TRUE, ...) }) mv <- unlist(x = mv, recursive = FALSE) names(x = mv) <- rownames(x = data) } else { pp[["marks"]] <- as.data.frame(x = t(x = data)) mv <- markvario(X = pp, normalise = TRUE, ...) } return(mv) } #' Compute Moran's I value. #' #' Wraps the functionality of the Moran.I function from the ape package. #' Weights are computed as 1/distance. #' #' @param data Expression matrix #' @param pos Position matrix #' @param verbose Display messages/progress #' #' @importFrom stats dist #' #' @export #' @concept preprocessing #' RunMoransI <- function(data, pos, verbose = TRUE) { mysapply <- sapply if (verbose) { message("Computing Moran's I") mysapply <- pbsapply } Rfast2.installed <- requireNamespace('Rfast2', quietly = TRUE) if (isTRUE(x = Rfast2.installed)) { MyMoran <- Rfast2::moranI } else if (isFALSE(x = requireNamespace('ape', quietly = TRUE))) { stop( "'RunMoransI' requires either Rfast2 or ape to be installed", call. = FALSE ) } else { MyMoran <- ape::Moran.I if (getOption('Seurat.Rfast2.msg', TRUE)) { message( "For a more efficient implementation of the Morans I calculation,", "\n(selection.method = 'moransi') please install the Rfast2 package", "\n--------------------------------------------", "\ninstall.packages('Rfast2')", "\n--------------------------------------------", "\nAfter installation of Rfast2, Seurat will automatically use the more ", "\nefficient implementation (no further action necessary).", "\nThis message will be shown once per session" ) options(Seurat.Rfast2.msg = FALSE) } } pos.dist <- dist(x = pos) pos.dist.mat <- as.matrix(x = pos.dist) # weights as 1/dist^2 weights <- 1/pos.dist.mat^2 diag(x = weights) <- 0 results <- mysapply(X = 1:nrow(x = data), FUN = function(x) { tryCatch( expr = MyMoran(data[x, ], weights), error = function(x) c(1,1,1,1) ) }) pcol <- ifelse(test = Rfast2.installed, yes = 2, no = 4) results <- data.frame( observed = unlist(x = results[1, ]), p.value = unlist(x = results[pcol, ]) ) rownames(x = results) <- rownames(x = data) return(results) } #' Sample UMI #' #' Downsample each cell to a specified number of UMIs. Includes #' an option to upsample cells below specified UMI as well. #' #' @param data Matrix with the raw count data #' @param max.umi Number of UMIs to sample to #' @param upsample Upsamples all cells with fewer than max.umi #' @param verbose Display the progress bar #' #' @importFrom methods as #' #' @return Matrix with downsampled data #' #' @export #' @concept preprocessing #' #' @examples #' data("pbmc_small") #' counts = as.matrix(x = GetAssayData(object = pbmc_small, assay = "RNA", layer = "counts")) #' downsampled = SampleUMI(data = counts) #' head(x = downsampled) #' SampleUMI <- function( data, max.umi = 1000, upsample = FALSE, verbose = FALSE ) { data <- as.sparse(x = data) if (length(x = max.umi) == 1) { new_data <- RunUMISampling( data = data, sample_val = max.umi, upsample = upsample, display_progress = verbose ) } else if (length(x = max.umi) != ncol(x = data)) { stop("max.umi vector not equal to number of cells") } else { new_data <- RunUMISamplingPerCell( data = data, sample_val = max.umi, upsample = upsample, display_progress = verbose ) } dimnames(x = new_data) <- dimnames(x = data) return(new_data) } #' SCTransform: Regularized NB regression for UMI count normalization #' #' Perform a varianceâ€stabilizing transformation on UMI counts using #' \code{sctransform::vst} (https://github.com/satijalab/sctransform). This #' replaces the \code{NormalizeData} → \code{FindVariableFeatures} → #' \code{ScaleData} workflow by fitting a regularized negative binomial model #' per gene and returning: #' #' - A new assay (default name “SCTâ€), in which: #' - \code{counts}: depthâ€corrected UMI counts (as if each cell had uniform #' sequencing depth; controlled by \code{do.correct.umi}). #' - \code{data}: \code{log1p} of corrected counts. #' - \code{scale.data}: Pearson residuals from the fitted NB model (optionally #' centered and/or scaled). #' - \code{misc}: intermediate outputs from \code{sctransform::vst}. #' #' When multiple \code{counts} layers exist (e.g. after \code{split()}), #' each layer is modeled independently. A consensus variableâ€feature set is #' then defined by ranking features by how often they’re called “variable†#' across different layers (ties broken by median rank). #' #' By default, \code{sctransform::vst} will drop features expressed in fewer #' than five cells. In the multi-layer case, this can lead to consenus #' variable-features being excluded from the output's \code{scale.data} when #' a feature is "variable" across many layers but sparsely expressed in at #' least one. #' #' @param object A Seurat object or UMI count matrix. #' @param cell.attr Optional metadata frame (cells × attributes). #' @param reference.SCT.model Preâ€fitted SCT model (supports only \code{log_umi} #' as latent variable). If provided, computes residuals via that model. When #' \code{residual.features} is NULL, uses the model’s top #' \code{variable.features.n}; otherwise, sets the assay’s variable features #' to \code{residual.features}. #' @param do.correct.umi Logical; if TRUE (default), stores corrected UMIs in #' \code{counts}. #' @param ncells Integer; number of cells to subsample when fitting NB #' regression (default: 5000). #' @param residual.features Character vector of genes to compute residuals for. #' Default NULL (all genes). If set, these become the assay’s variable #' features. #' @param variable.features.n Integer; when \code{residual.features} is NULL, #' select this many top features by residual variance (default: 3000). #' @param variable.features.rv.th Numeric; if \code{variable.features.n} is NULL, #' select features exceeding this residualâ€variance threshold (default: 1.3). #' @param vars.to.regress Character vector of metadata columns (e.g. #' \code{percent.mito}) to regress out in a second, nonâ€regularized model. #' @param latent.data Numeric matrix (cells × latent covariates) to regress out. #' @param do.scale Logical; if TRUE, scale residuals to unit variance #' (default: FALSE). #' @param do.center Logical; if TRUE, center residuals to mean zero #' (default: TRUE). #' @param clip.range Numeric vector of length 2; range to clip residuals #' (default \code{c(-sqrt(n/30), sqrt(n/30))}, with n = number of cells). #' @param vst.flavor Character; if \code{"v2"}, uses \code{method = "glmGamPoi_offset"}, #' \code{n_cells = 2000}, and \code{exclude_poisson = TRUE} to fit \eqn{\theta} and #' intercept only. #' @param conserve.memory Logical; if TRUE, never builds the full residual #' matrix (slower but memoryâ€efficient; forces \code{return.only.var.genes=TRUE}; #' default: FALSE). #' @param return.only.var.genes Logical; if TRUE (default), \code{scale.data} #' is subset to variable features only. #' @param seed.use Integer; random seed for reproducibility (default: 1448145). #' Set to NULL to skip setting a seed. #' @param verbose Logical; whether to print progress messages (default: TRUE). #' @param ... Additional arguments passed to \code{sctransform::vst}. #' #' @return A Seurat object with a new \code{SCT} assay containing: #' \code{counts} (corrected UMIs), \code{data} (log1p counts), and #' \code{scale.data} (Pearson residuals), plus \code{misc} for intermediate #' \code{vst} outputs. #' #' @importFrom stats setNames #' @importFrom Matrix colSums #' @importFrom SeuratObject as.sparse #' @importFrom sctransform vst get_residual_var get_residuals correct_counts #' #' @seealso \code{\link[sctransform]{vst}}, #' \code{\link[sctransform]{get_residuals}}, #' \code{\link[sctransform]{correct_counts}} #' #' @rdname SCTransform #' @concept preprocessing #' @export #' SCTransform.default <- function( object, cell.attr, reference.SCT.model = NULL, do.correct.umi = TRUE, ncells = 5000, residual.features = NULL, variable.features.n = 3000, variable.features.rv.th = 1.3, vars.to.regress = NULL, latent.data = NULL, do.scale = FALSE, do.center = TRUE, clip.range = c(-sqrt(x = ncol(x = umi) / 30), sqrt(x = ncol(x = umi) / 30)), vst.flavor = 'v2', conserve.memory = FALSE, return.only.var.genes = TRUE, seed.use = 1448145, verbose = TRUE, ... ) { if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } vst.args <- list(...) object <- as.sparse(x = object) umi <- object # check for batch_var in meta data if ('batch_var' %in% names(x = vst.args)) { if (!(vst.args[['batch_var']] %in% colnames(x = cell.attr))) { stop('batch_var not found in seurat object meta data') } } # parameter checking when reference.SCT.model is set if (!is.null(x = reference.SCT.model) ) { if (inherits(x = reference.SCT.model, what = "SCTModel")) { reference.SCT.model <- SCTModel_to_vst(SCTModel = reference.SCT.model) } if (is.list(x = reference.SCT.model) & inherits(x = reference.SCT.model[[1]], what = "SCTModel")) { stop("reference.SCT.model must be one SCTModel rather than a list of SCTModel") } if ('latent_var' %in% names(x = vst.args)) { stop('custom latent variables are not supported when reference.SCT.model is given') } if (reference.SCT.model$model_str != 'y ~ log_umi') { stop('reference.SCT.model must be derived using default SCT regression formula, `y ~ log_umi`') } } # check for latent_var in meta data if ('latent_var' %in% names(x = vst.args)) { known.attr <- c('umi', 'gene', 'log_umi', 'log_gene', 'umi_per_gene', 'log_umi_per_gene') if (!all(vst.args[['latent_var']] %in% c(colnames(x = cell.attr), known.attr))) { stop('latent_var values are not from the set of cell attributes sctransform calculates by default and cannot be found in seurat object meta data') } } # check for vars.to.regress in meta data if (any(!vars.to.regress %in% colnames(x = cell.attr))) { stop('problem with second non-regularized linear regression; not all variables found in seurat object meta data; check vars.to.regress parameter') } if (any(c('cell_attr', 'verbosity', 'return_cell_attr', 'return_gene_attr', 'return_corrected_umi') %in% names(x = vst.args))) { warning( 'the following arguments will be ignored because they are set within this function:', paste( c( 'cell_attr', 'verbosity', 'return_cell_attr', 'return_gene_attr', 'return_corrected_umi' ), collapse = ', ' ), call. = FALSE, immediate. = TRUE ) } if (!is.null(x = vst.flavor) && !vst.flavor %in% c("v1", "v2")){ stop("vst.flavor can be 'v1' or 'v2'. Default is 'v2'") } if (!is.null(x = vst.flavor) && vst.flavor == "v1"){ vst.flavor <- NULL } vst.args[['vst.flavor']] <- vst.flavor vst.args[['umi']] <- umi vst.args[['cell_attr']] <- cell.attr vst.args[['verbosity']] <- as.numeric(x = verbose) * 1 vst.args[['return_cell_attr']] <- TRUE vst.args[['return_gene_attr']] <- TRUE vst.args[['return_corrected_umi']] <- do.correct.umi vst.args[['n_cells']] <- min(ncells, ncol(x = umi)) residual.type <- vst.args[['residual_type']] %||% 'pearson' res.clip.range <- vst.args[['res_clip_range']] %||% c(-sqrt(x = ncol(x = umi)), sqrt(x = ncol(x = umi))) # set sct normalization method if (!is.null( reference.SCT.model)) { sct.method <- "reference.model" } else if (!is.null(x = residual.features)) { sct.method <- "residual.features" } else if (conserve.memory) { sct.method <- "conserve.memory" } else { sct.method <- "default" } # set vst model vst.out <- switch( EXPR = sct.method, 'reference.model' = { if (verbose) { message("Using reference SCTModel to calculate pearson residuals") } do.center <- FALSE do.correct.umi <- FALSE vst.out <- reference.SCT.model clip.range <- vst.out$arguments$sct.clip.range cell_attr <- data.frame(log_umi = log10(x = colSums(umi))) rownames(cell_attr) <- colnames(x = umi) vst.out$cell_attr <- cell_attr all.features <- intersect( x = rownames(x = vst.out$gene_attr), y = rownames(x = umi) ) vst.out$gene_attr <- vst.out$gene_attr[all.features ,] vst.out$model_pars_fit <- vst.out$model_pars_fit[all.features,] vst.out }, 'residual.features' = { if (verbose) { message("Computing residuals for the ", length(x = residual.features), " specified features") } return.only.var.genes <- TRUE do.correct.umi <- FALSE vst.args[['return_corrected_umi']] <- FALSE vst.args[['residual_type']] <- 'none' vst.out <- do.call(what = 'vst', args = vst.args) vst.out$gene_attr$residual_variance <- NA_real_ vst.out }, 'conserve.memory' = { return.only.var.genes <- TRUE vst.args[['residual_type']] <- 'none' vst.out <- do.call(what = 'vst', args = vst.args) feature.variance <- get_residual_var( vst_out = vst.out, umi = umi, residual_type = residual.type, res_clip_range = res.clip.range ) vst.out$gene_attr$residual_variance <- NA_real_ vst.out$gene_attr[names(x = feature.variance), 'residual_variance'] <- feature.variance vst.out }, 'default' = { vst.out <- do.call(what = 'vst', args = vst.args) vst.out }) feature.variance <- vst.out$gene_attr[,"residual_variance"] names(x = feature.variance) <- rownames(x = vst.out$gene_attr) if (verbose) { message('Determine variable features') } feature.variance <- sort(x = feature.variance, decreasing = TRUE) if (!is.null(x = variable.features.n)) { top.features <- names(x = feature.variance)[1:min(variable.features.n, length(x = feature.variance))] } else { top.features <- names(x = feature.variance)[feature.variance >= variable.features.rv.th] } # get residuals vst.out <- switch( EXPR = sct.method, 'reference.model' = { if (is.null(x = residual.features)) { residual.features <- top.features } residual.features <- Reduce( f = intersect, x = list(residual.features, rownames(x = umi), rownames(x = vst.out$model_pars_fit)) ) residual.feature.mat <- get_residuals( vst_out = vst.out, umi = umi[residual.features, , drop = FALSE], verbosity = as.numeric(x = verbose)*2 ) vst.out$gene_attr <- vst.out$gene_attr[residual.features ,] ref.residuals.mean <- vst.out$gene_attr[,"residual_mean"] vst.out$y <- sweep( x = residual.feature.mat, MARGIN = 1, STATS = ref.residuals.mean, FUN = "-" ) vst.out }, 'residual.features' = { residual.features <- intersect( x = residual.features, y = rownames(x = vst.out$gene_attr) ) residual.feature.mat <- get_residuals( vst_out = vst.out, umi = umi[residual.features, , drop = FALSE], verbosity = as.numeric(x = verbose)*2 ) vst.out$y <- residual.feature.mat vst.out$gene_attr$residual_mean <- NA_real_ vst.out$gene_attr$residual_variance <- NA_real_ vst.out$gene_attr[residual.features, "residual_mean"] <- rowMeans2(x = vst.out$y) vst.out$gene_attr[residual.features, "residual_variance"] <- RowVar(x = vst.out$y) vst.out }, 'conserve.memory' = { vst.out$y <- get_residuals( vst_out = vst.out, umi = umi[top.features, ], residual_type = residual.type, res_clip_range = res.clip.range, verbosity = as.numeric(x = verbose)*2 ) vst.out$gene_attr$residual_mean <- NA_real_ vst.out$gene_attr[top.features, "residual_mean"] = rowMeans2(x = vst.out$y) if (do.correct.umi & residual.type == 'pearson') { vst.out$umi_corrected <- correct_counts( x = vst.out, umi = umi, verbosity = as.numeric(x = verbose) * 1 ) } vst.out }, 'default' = { if (return.only.var.genes) { vst.out$y <- vst.out$y[top.features, ] } vst.out }) scale.data <- vst.out$y # clip the residuals scale.data[scale.data < clip.range[1]] <- clip.range[1] scale.data[scale.data > clip.range[2]] <- clip.range[2] # 2nd regression scale.data <- ScaleData( scale.data, features = NULL, vars.to.regress = vars.to.regress, latent.data = latent.data, model.use = 'linear', use.umi = FALSE, do.scale = do.scale, do.center = do.center, scale.max = Inf, block.size = 750, min.cells.to.block = 3000, verbose = verbose ) vst.out$y <- scale.data vst.out$variable_features <- residual.features %||% top.features if (!do.correct.umi) { vst.out$umi_corrected <- umi } min_var <- vst.out$arguments$min_variance return(vst.out) } #' @rdname SCTransform #' @concept preprocessing #' @export #' @method SCTransform Assay #' SCTransform.Assay <- function( object, cell.attr, reference.SCT.model = NULL, do.correct.umi = TRUE, ncells = 5000, residual.features = NULL, variable.features.n = 3000, variable.features.rv.th = 1.3, vars.to.regress = NULL, latent.data = NULL, do.scale = FALSE, do.center = TRUE, clip.range = c(-sqrt(x = ncol(x = object) / 30), sqrt(x = ncol(x = object) / 30)), vst.flavor = 'v2', conserve.memory = FALSE, return.only.var.genes = TRUE, seed.use = 1448145, verbose = TRUE, ... ) { if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } if (!is.null(reference.SCT.model)){ do.correct.umi <- FALSE do.center <- FALSE } umi <- GetAssayData(object = object, layer = 'counts') vst.out <- SCTransform(object = umi, cell.attr = cell.attr, reference.SCT.model = reference.SCT.model, do.correct.umi = do.correct.umi, ncells = ncells, residual.features = residual.features, variable.features.n = variable.features.n, variable.features.rv.th = variable.features.rv.th, vars.to.regress = vars.to.regress, latent.data = latent.data, do.scale = do.scale, do.center = do.center, clip.range = clip.range, vst.flavor = vst.flavor, conserve.memory = conserve.memory, return.only.var.genes = return.only.var.genes, seed.use = seed.use, verbose = verbose, ...) residual.type <- vst.out[['residual_type']] %||% 'pearson' sct.method <- vst.out[["sct.method"]] # create output assay and put (corrected) umi counts in count slot if (do.correct.umi & residual.type == 'pearson') { if (verbose) { message('Place corrected count matrix in counts slot') } assay.out <- CreateAssayObject(counts = vst.out$umi_corrected) vst.out$umi_corrected <- NULL } else { # TODO: restore once check.matrix is in SeuratObject # assay.out <- CreateAssayObject(counts = umi, check.matrix = FALSE) assay.out <- CreateAssayObject(counts = umi) } # set the variable genes VariableFeatures(object = assay.out) <- vst.out$variable_features # put log1p transformed counts in data assay.out <- SetAssayData( object = assay.out, layer = 'data', new.data = log1p(x = GetAssayData(object = assay.out, layer = 'counts')) ) scale.data <- vst.out$y assay.out <- SetAssayData( object = assay.out, layer = 'scale.data', new.data = scale.data ) vst.out$y <- NULL # save clip.range into vst model vst.out$arguments$sct.clip.range <- clip.range vst.out$arguments$sct.method <- sct.method Misc(object = assay.out, slot = 'vst.out') <- vst.out assay.out <- as(object = assay.out, Class = "SCTAssay") return(assay.out) } #' @param assay Name of assay to pull the count data from; default is 'RNA' #' @param new.assay.name Name for the new assay containing the normalized data; default is 'SCT' #' #' @rdname SCTransform #' @concept preprocessing #' @export #' @method SCTransform Seurat #' SCTransform.Seurat <- function( object, assay = "RNA", new.assay.name = 'SCT', reference.SCT.model = NULL, do.correct.umi = TRUE, ncells = 5000, residual.features = NULL, variable.features.n = 3000, variable.features.rv.th = 1.3, vars.to.regress = NULL, do.scale = FALSE, do.center = TRUE, clip.range = c(-sqrt(x = ncol(x = object[[assay]]) / 30), sqrt(x = ncol(x = object[[assay]]) / 30)), vst.flavor = "v2", conserve.memory = FALSE, return.only.var.genes = TRUE, seed.use = 1448145, verbose = TRUE, ... ) { if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } if (any(vars.to.regress %in% colnames(x = object[[]]))) { vars.to.regress.subset <- vars.to.regress[vars.to.regress %in% colnames(x = object[[]])] latent.data <- object[[vars.to.regress.subset]] } else { latent.data <- NULL } assay <- assay %||% DefaultAssay(object = object) if (assay == "SCT") { # if re-running SCTransform, use the RNA assay assay <- "RNA" warning("Running SCTransform on the RNA assay while default assay is SCT.") } if (verbose){ message("Running SCTransform on assay: ", assay) } cell.attr <- slot(object = object, name = 'meta.data')[colnames(object[[assay]]),] assay.data <- SCTransform(object = object[[assay]], cell.attr = cell.attr, reference.SCT.model = reference.SCT.model, do.correct.umi = do.correct.umi, ncells = ncells, residual.features = residual.features, variable.features.n = variable.features.n, variable.features.rv.th = variable.features.rv.th, vars.to.regress = vars.to.regress, latent.data = latent.data, do.scale = do.scale, do.center = do.center, clip.range = clip.range, vst.flavor = vst.flavor, conserve.memory = conserve.memory, return.only.var.genes = return.only.var.genes, seed.use = seed.use, verbose = verbose, ...) assay.data <- SCTAssay(assay.data, assay.orig = assay) slot(object = slot(object = assay.data, name = "SCTModel.list")[[1]], name = "umi.assay") <- assay object[[new.assay.name]] <- assay.data if (verbose) { message(paste("Set default assay to", new.assay.name)) } DefaultAssay(object = object) <- new.assay.name object <- LogSeuratCommand(object = object) return(object) } #' Subset a Seurat Object based on the Barcode Distribution Inflection Points #' #' This convenience function subsets a Seurat object based on calculated inflection points. #' #' See [CalculateBarcodeInflections()] to calculate inflection points and #' [BarcodeInflectionsPlot()] to visualize and test inflection point calculations. #' #' @param object Seurat object #' #' @return Returns a subsetted Seurat object. #' #' @export #' @concept preprocessing #' #' @author Robert A. Amezquita, \email{robert.amezquita@fredhutch.org} #' @seealso \code{\link{CalculateBarcodeInflections}} \code{\link{BarcodeInflectionsPlot}} #' #' @examples #' data("pbmc_small") #' pbmc_small <- CalculateBarcodeInflections( #' object = pbmc_small, #' group.column = 'groups', #' threshold.low = 20, #' threshold.high = 30 #' ) #' SubsetByBarcodeInflections(object = pbmc_small) #' SubsetByBarcodeInflections <- function(object) { cbi.data <- Tool(object = object, slot = 'CalculateBarcodeInflections') if (is.null(x = cbi.data)) { stop("Barcode inflections not calculated, please run CalculateBarcodeInflections") } return(object[, cbi.data$cells_pass]) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @param selection.method How to choose top variable features. Choose one of : #' \itemize{ #' \item \dQuote{\code{vst}}: First, fits a line to the relationship of #' log(variance) and log(mean) using local polynomial regression (loess). #' Then standardizes the feature values using the observed mean and #' expected variance (given by the fitted line). Feature variance is then #' calculated on the standardized values #' after clipping to a maximum (see clip.max parameter). #' \item \dQuote{\code{mean.var.plot}} (mvp): First, uses a function to #' calculate average expression (mean.function) and dispersion #' (dispersion.function) for each feature. Next, divides features into #' \code{num.bin} (default 20) bins based on their average expression, #' and calculates z-scores for dispersion within each bin. The purpose of #' this is to identify variable features while controlling for the #' strong relationship between variability and average expression #' \item \dQuote{\code{dispersion}} (disp): selects the genes with the #' highest dispersion values #' } #' @param loess.span (vst method) Loess span parameter used when fitting the #' variance-mean relationship #' @param clip.max (vst method) After standardization values larger than #' clip.max will be set to clip.max; default is 'auto' which sets this value to #' the square root of the number of cells #' @param mean.function Function to compute x-axis value (average expression). #' Default is to take the mean of the detected (i.e. non-zero) values #' @param dispersion.function Function to compute y-axis value (dispersion). #' Default is to take the standard deviation of all values #' @param num.bin Total number of bins to use in the scaled analysis (default #' is 20) #' @param binning.method Specifies how the bins should be computed. Available #' methods are: #' \itemize{ #' \item \dQuote{\code{equal_width}}: each bin is of equal width along the #' x-axis (default) #' \item \dQuote{\code{equal_frequency}}: each bin contains an equal number #' of features (can increase statistical power to detect overdispersed #' features at high expression values, at the cost of reduced resolution #' along the x-axis) #' } #' @param verbose show progress bar for calculations #' #' @rdname FindVariableFeatures #' @concept preprocessing #' @export #' FindVariableFeatures.V3Matrix <- function( object, selection.method = "vst", loess.span = 0.3, clip.max = 'auto', mean.function = FastExpMean, dispersion.function = FastLogVMR, num.bin = 20, binning.method = "equal_width", verbose = TRUE, ... ) { CheckDots(...) if (!inherits(x = object, 'Matrix')) { object <- as(object = as.matrix(x = object), Class = 'Matrix') } if (!inherits(x = object, what = 'dgCMatrix')) { object <- as.sparse(x = object) } if (selection.method == "vst") { if (clip.max == 'auto') { clip.max <- sqrt(x = ncol(x = object)) } hvf.info <- data.frame(mean = rowMeans(x = object)) hvf.info$variance <- SparseRowVar2( mat = object, mu = hvf.info$mean, display_progress = verbose ) hvf.info$variance.expected <- 0 hvf.info$variance.standardized <- 0 not.const <- hvf.info$variance > 0 fit <- loess( formula = log10(x = variance) ~ log10(x = mean), data = hvf.info[not.const, ], span = loess.span ) hvf.info$variance.expected[not.const] <- 10 ^ fit$fitted # use c function to get variance after feature standardization hvf.info$variance.standardized <- SparseRowVarStd( mat = object, mu = hvf.info$mean, sd = sqrt(hvf.info$variance.expected), vmax = clip.max, display_progress = verbose ) colnames(x = hvf.info) <- paste0('vst.', colnames(x = hvf.info)) } else { if (!inherits(x = mean.function, what = 'function')) { stop("'mean.function' must be a function") } if (!inherits(x = dispersion.function, what = 'function')) { stop("'dispersion.function' must be a function") } feature.mean <- mean.function(object, verbose) feature.dispersion <- dispersion.function(object, verbose) names(x = feature.mean) <- names(x = feature.dispersion) <- rownames(x = object) feature.dispersion[is.na(x = feature.dispersion)] <- 0 feature.mean[is.na(x = feature.mean)] <- 0 data.x.breaks <- switch( EXPR = binning.method, 'equal_width' = num.bin, 'equal_frequency' = c( -1, quantile( x = feature.mean[feature.mean > 0], probs = seq.int(from = 0, to = 1, length.out = num.bin) ) ), stop("Unknown binning method: ", binning.method) ) data.x.bin <- cut(x = feature.mean, breaks = data.x.breaks) names(x = data.x.bin) <- names(x = feature.mean) mean.y <- tapply(X = feature.dispersion, INDEX = data.x.bin, FUN = mean) sd.y <- tapply(X = feature.dispersion, INDEX = data.x.bin, FUN = sd) feature.dispersion.scaled <- (feature.dispersion - mean.y[as.numeric(x = data.x.bin)]) / sd.y[as.numeric(x = data.x.bin)] names(x = feature.dispersion.scaled) <- names(x = feature.mean) hvf.info <- data.frame(feature.mean, feature.dispersion, feature.dispersion.scaled) rownames(x = hvf.info) <- rownames(x = object) colnames(x = hvf.info) <- paste0('mvp.', c('mean', 'dispersion', 'dispersion.scaled')) } return(hvf.info) } #' @param nfeatures Number of features to select as top variable features; #' only used when \code{selection.method} is set to \code{'dispersion'} or #' \code{'vst'} #' @param mean.cutoff A two-length numeric vector with low- and high-cutoffs for #' feature means #' @param dispersion.cutoff A two-length numeric vector with low- and high-cutoffs for #' feature dispersions #' #' @rdname FindVariableFeatures #' @concept preprocessing #' #' @importFrom utils head #' @export #' @method FindVariableFeatures Assay #' FindVariableFeatures.Assay <- function( object, selection.method = "vst", loess.span = 0.3, clip.max = 'auto', mean.function = FastExpMean, dispersion.function = FastLogVMR, num.bin = 20, binning.method = "equal_width", nfeatures = 2000, mean.cutoff = c(0.1, 8), dispersion.cutoff = c(1, Inf), verbose = TRUE, ... ) { if (length(x = mean.cutoff) != 2 || length(x = dispersion.cutoff) != 2) { stop("Both 'mean.cutoff' and 'dispersion.cutoff' must be two numbers") } if (selection.method == "vst") { data <- GetAssayData(object = object, layer = "counts") # if (ncol(x = data) < 1 || nrow(x = data) < 1) { if (IsMatrixEmpty(x = data)) { warning("selection.method set to 'vst' but count slot is empty; will use data slot instead") data <- GetAssayData(object = object, layer = "data") } } else { data <- GetAssayData(object = object, layer = "data") } hvf.info <- FindVariableFeatures( object = data, selection.method = selection.method, loess.span = loess.span, clip.max = clip.max, mean.function = mean.function, dispersion.function = dispersion.function, num.bin = num.bin, binning.method = binning.method, verbose = verbose, ... ) object[[names(x = hvf.info)]] <- hvf.info hvf.info <- hvf.info[which(x = hvf.info[, 1, drop = TRUE] != 0), ] if (selection.method == "vst") { hvf.info <- hvf.info[order(hvf.info$vst.variance.standardized, decreasing = TRUE), , drop = FALSE] } else { hvf.info <- hvf.info[order(hvf.info$mvp.dispersion, decreasing = TRUE), , drop = FALSE] } selection.method <- switch( EXPR = selection.method, 'mvp' = 'mean.var.plot', 'disp' = 'dispersion', selection.method ) top.features <- switch( EXPR = selection.method, 'mean.var.plot' = { means.use <- (hvf.info[, 1] > mean.cutoff[1]) & (hvf.info[, 1] < mean.cutoff[2]) dispersions.use <- (hvf.info[, 3] > dispersion.cutoff[1]) & (hvf.info[, 3] < dispersion.cutoff[2]) rownames(x = hvf.info)[which(x = means.use & dispersions.use)] }, 'dispersion' = head(x = rownames(x = hvf.info), n = nfeatures), 'vst' = head(x = rownames(x = hvf.info), n = nfeatures), stop("Unkown selection method: ", selection.method) ) VariableFeatures(object = object) <- top.features vf.name <- ifelse( test = selection.method == 'vst', yes = 'vst', no = 'mvp' ) vf.name <- paste0(vf.name, '.variable') object[[vf.name]] <- rownames(x = object[[]]) %in% top.features return(object) } #' @rdname FindVariableFeatures #' @export #' @method FindVariableFeatures SCTAssay #' FindVariableFeatures.SCTAssay <- function( object, nfeatures = 2000, ... ) { VariableFeatures(object) <- VariableFeatures(object, nfeatures = nfeatures) return(object) } #' @param assay Assay to use #' #' @rdname FindVariableFeatures #' @concept preprocessing #' @export #' @method FindVariableFeatures Seurat #' FindVariableFeatures.Seurat <- function( object, assay = NULL, selection.method = "vst", loess.span = 0.3, clip.max = 'auto', mean.function = FastExpMean, dispersion.function = FastLogVMR, num.bin = 20, binning.method = "equal_width", nfeatures = 2000, mean.cutoff = c(0.1, 8), dispersion.cutoff = c(1, Inf), verbose = TRUE, ... ) { assay <- assay[1L] %||% DefaultAssay(object = object) assay <- match.arg(arg = assay, Assays(object = object)) assay.data <- FindVariableFeatures( object = object[[assay]], selection.method = selection.method, loess.span = loess.span, clip.max = clip.max, mean.function = mean.function, dispersion.function = dispersion.function, num.bin = num.bin, binning.method = binning.method, nfeatures = nfeatures, mean.cutoff = mean.cutoff, dispersion.cutoff = dispersion.cutoff, verbose = verbose, ... ) object[[assay]] <- assay.data if (inherits(x = object[[assay]], what = "SCTAssay")) { object <- GetResidual( object = object, assay = assay, features = VariableFeatures(object = assay.data), verbose = FALSE ) } object <- LogSeuratCommand(object = object) return(object) } #' @param object A Seurat object, assay, or expression matrix #' @param spatial.location Coordinates for each cell/spot/bead #' @param selection.method Method for selecting spatially variable features. #' \itemize{ #' \item \code{markvariogram}: See \code{\link{RunMarkVario}} for details #' \item \code{moransi}: See \code{\link{RunMoransI}} for details. #' } #' #' @param r.metric r value at which to report the "trans" value of the mark #' variogram #' @param x.cuts Number of divisions to make in the x direction, helps define #' the grid over which binning is performed #' @param y.cuts Number of divisions to make in the y direction, helps define #' the grid over which binning is performed #' @param verbose Print messages and progress #' #' @method FindSpatiallyVariableFeatures default #' @rdname FindSpatiallyVariableFeatures #' @concept preprocessing #' @concept spatial #' @export #' #' FindSpatiallyVariableFeatures.default <- function( object, spatial.location, selection.method = c('markvariogram', 'moransi'), r.metric = 5, x.cuts = NULL, y.cuts = NULL, verbose = TRUE, ... ) { # error check dimensions if (ncol(x = object) != nrow(x = spatial.location)) { stop("Please provide the same number of observations as spatial locations.") } if (!is.null(x = x.cuts) & !is.null(x = y.cuts)) { binned.data <- BinData( data = object, pos = spatial.location, x.cuts = x.cuts, y.cuts = y.cuts, verbose = verbose ) object <- binned.data$data spatial.location <- binned.data$pos } svf.info <- switch( EXPR = selection.method, 'markvariogram' = RunMarkVario( spatial.location = spatial.location, data = object ), 'moransi' = RunMoransI( data = object, pos = spatial.location, verbose = verbose ), stop("Invalid selection method. Please choose one of: markvariogram, moransi.") ) return(svf.info) } #' @param layer The layer in the specified assay to pull data from. #' @param slot Deprecated, use `layer`. #' @param features If provided, only compute on given features. Otherwise, #' compute for all features. #' @param nfeatures Number of features to mark as the top spatially variable. #' #' @method FindSpatiallyVariableFeatures Assay #' @rdname FindSpatiallyVariableFeatures #' @concept preprocessing #' @concept spatial #' @export #' FindSpatiallyVariableFeatures.Assay <- function( object, layer = "scale.data", slot = deprecated(), spatial.location, selection.method = c('markvariogram', 'moransi'), features = NULL, r.metric = 5, x.cuts = NULL, y.cuts = NULL, nfeatures = nfeatures, verbose = TRUE, ... ) { if (is_present(slot)) { deprecate_soft( when = '5.3.0', what = 'FindSpatiallyVariableFeatures(slot = )', with = 'FindSpatiallyVariableFeatures(layer = )' ) layer <- slot %||% layer } features <- features %||% Features(object, layer = layer) if (selection.method == "markvariogram" && "markvariogram" %in% names(x = Misc(object = object))) { features.computed <- names(x = Misc(object = object, slot = "markvariogram")) features <- features[! features %in% features.computed] } cells <- rownames(spatial.location) data <- LayerData(object, layer = layer, cells = cells, features = features) data <- as.matrix(x = data) data <- data[RowVar(x = data) > 0, ] if (nrow(x = data) != 0) { svf.info <- FindSpatiallyVariableFeatures( object = data, spatial.location = spatial.location, selection.method = selection.method, r.metric = r.metric, x.cuts = x.cuts, y.cuts = y.cuts, verbose = verbose, ... ) } else { svf.info <- c() } if (selection.method == "markvariogram") { if ("markvariogram" %in% names(x = Misc(object = object))) { svf.info <- c(svf.info, Misc(object = object, slot = "markvariogram")) } suppressWarnings(expr = Misc(object = object, slot = "markvariogram") <- svf.info) svf.info <- ComputeRMetric(mv = svf.info, r.metric) svf.info <- svf.info[order(svf.info[, 1]), , drop = FALSE] } if (selection.method == "moransi") { colnames(x = svf.info) <- paste0("MoransI_", colnames(x = svf.info)) svf.info <- svf.info[order(svf.info[, 2], -abs(svf.info[, 1])), , drop = FALSE] } var.name <- paste0(selection.method, ".spatially.variable") var.name.rank <- paste0(var.name, ".rank") svf.info[[var.name]] <- FALSE svf.info[[var.name]][1:(min(nrow(x = svf.info), nfeatures))] <- TRUE svf.info[[var.name.rank]] <- 1:nrow(x = svf.info) object[[names(x = svf.info)]] <- svf.info return(object) } #' @param assay Assay to pull the features (marks) from #' @param image Name of image to pull the coordinates from #' #' @method FindSpatiallyVariableFeatures Seurat #' @rdname FindSpatiallyVariableFeatures #' @concept preprocessing #' @concept spatial #' @export #' FindSpatiallyVariableFeatures.Seurat <- function( object, assay = NULL, layer = "scale.data", # Using `deprecated()` as the default for any arguments will break the # `LogSeuratCommand` call at the end of this method. slot = NULL, features = NULL, image = NULL, selection.method = c('markvariogram', 'moransi'), r.metric = 5, x.cuts = NULL, y.cuts = NULL, nfeatures = 2000, verbose = TRUE, ... ) { if (!is.null(slot)) { deprecate_soft( when = '5.3.0', what = 'FindSpatiallyVariableFeatures(slot = )', with = 'FindSpatiallyVariableFeatures(layer = )' ) layer <- slot %||% layer } assay <- assay %||% DefaultAssay(object = object) image <- image %||% DefaultImage(object = object) features <- features %||% Features(object, assay = assay, layer = layer) tc <- GetTissueCoordinates(object = object[[image]]) object[[assay]] <- FindSpatiallyVariableFeatures( object = object[[assay]], slot = slot, features = features, spatial.location = tc, selection.method = selection.method, r.metric = r.metric, x.cuts = x.cuts, y.cuts = y.cuts, nfeatures = nfeatures, verbose = verbose, ... ) object <- LogSeuratCommand(object) return(object) } #' @rdname LogNormalize #' @method LogNormalize data.frame #' @export #' LogNormalize.data.frame <- function( data, scale.factor = 1e4, margin = 2L, verbose = TRUE, ... ) { return(LogNormalize( data = as.matrix(x = data), scale.factor = scale.factor, verbose = verbose, ... )) } #' @rdname LogNormalize #' @method LogNormalize V3Matrix #' @export #' LogNormalize.V3Matrix <- function( data, scale.factor = 1e4, margin = 2L, verbose = TRUE, ... ) { # if (is.data.frame(x = data)) { # data <- as.matrix(x = data) # } if (!inherits(x = data, what = 'dgCMatrix')) { data <- as(object = data, Class = "dgCMatrix") } # call Rcpp function to normalize if (verbose) { cat("Performing log-normalization\n", file = stderr()) } norm.data <- LogNorm(data, scale_factor = scale.factor, display_progress = verbose) colnames(x = norm.data) <- colnames(x = data) rownames(x = norm.data) <- rownames(x = data) return(norm.data) } #' @importFrom future.apply future_lapply #' @importFrom future nbrOfWorkers #' #' @param normalization.method Method for normalization. #' \itemize{ #' \item \dQuote{\code{LogNormalize}}: Feature counts for each cell are #' divided by the total counts for that cell and multiplied by the #' \code{scale.factor}. This is then natural-log transformed using \code{log1p} #' \item \dQuote{\code{CLR}}: Applies a centered log ratio transformation #' \item \dQuote{\code{RC}}: Relative counts. Feature counts for each cell #' are divided by the total counts for that cell and multiplied by the #' \code{scale.factor}. No log-transformation is applied. For counts per #' million (CPM) set \code{scale.factor = 1e6} #' } #' @param scale.factor Sets the scale factor for cell-level normalization #' @param margin If performing CLR normalization, normalize across features (1) or cells (2) # @param across If performing CLR normalization, normalize across either "features" or "cells". #' @param block.size How many cells should be run in each chunk, will try to split evenly across threads #' @param verbose display progress bar for normalization procedure #' #' @rdname NormalizeData #' @concept preprocessing #' @export #' NormalizeData.V3Matrix <- function( object, normalization.method = "LogNormalize", scale.factor = 1e4, margin = 1, block.size = NULL, verbose = TRUE, ... ) { CheckDots(...) if (is.null(x = normalization.method)) { return(object) } normalized.data <- if (nbrOfWorkers() > 1) { norm.function <- switch( EXPR = normalization.method, 'LogNormalize' = LogNormalize, 'CLR' = CustomNormalize, 'RC' = RelativeCounts, stop("Unknown normalization method: ", normalization.method) ) if (normalization.method != 'CLR') { margin <- 2 } tryCatch( expr = Parenting(parent.find = 'Seurat', margin = margin), error = function(e) { invisible(x = NULL) } ) dsize <- switch( EXPR = margin, '1' = nrow(x = object), '2' = ncol(x = object), stop("'margin' must be 1 or 2") ) chunk.points <- ChunkPoints( dsize = dsize, csize = block.size %||% ceiling(x = dsize / nbrOfWorkers()) ) normalized.data <- future_lapply( X = 1:ncol(x = chunk.points), FUN = function(i) { block <- chunk.points[, i] data <- if (margin == 1) { object[block[1]:block[2], , drop = FALSE] } else { object[, block[1]:block[2], drop = FALSE] } clr_function <- function(x) { return(log1p(x = x / (exp(x = sum(log1p(x = x[x > 0]), na.rm = TRUE) / length(x = x))))) } args <- list( data = data, scale.factor = scale.factor, verbose = FALSE, custom_function = clr_function, margin = margin ) args <- args[names(x = formals(fun = norm.function))] return(do.call( what = norm.function, args = args )) } ) do.call( what = switch( EXPR = margin, '1' = 'rbind', '2' = 'cbind', stop("'margin' must be 1 or 2") ), args = normalized.data ) } else { switch( EXPR = normalization.method, 'LogNormalize' = LogNormalize( data = object, scale.factor = scale.factor, verbose = verbose ), 'CLR' = CustomNormalize( data = object, custom_function = function(x) { return(log1p(x = x / (exp(x = sum(log1p(x = x[x > 0]), na.rm = TRUE) / length(x = x))))) }, margin = margin, verbose = verbose # across = across ), 'RC' = RelativeCounts( data = object, scale.factor = scale.factor, verbose = verbose ), stop("Unkown normalization method: ", normalization.method) ) } return(normalized.data) } #' @rdname NormalizeData #' @concept preprocessing #' @export #' @method NormalizeData Assay #' NormalizeData.Assay <- function( object, normalization.method = "LogNormalize", scale.factor = 1e4, margin = 1, verbose = TRUE, ... ) { object <- SetAssayData( object = object, layer = 'data', new.data = NormalizeData( object = GetAssayData(object = object, layer = 'counts'), normalization.method = normalization.method, scale.factor = scale.factor, verbose = verbose, margin = margin, ... ) ) return(object) } #' @param assay Name of assay to use #' #' @rdname NormalizeData #' @concept preprocessing #' @export #' @method NormalizeData Seurat #' #' @examples #' \dontrun{ #' data("pbmc_small") #' pbmc_small #' pmbc_small <- NormalizeData(object = pbmc_small) #' } #' NormalizeData.Seurat <- function( object, assay = NULL, normalization.method = "LogNormalize", scale.factor = 1e4, margin = 1, verbose = TRUE, ... ) { assay <- assay %||% DefaultAssay(object = object) assay.data <- NormalizeData( object = object[[assay]], normalization.method = normalization.method, scale.factor = scale.factor, verbose = verbose, margin = margin, ... ) object[[assay]] <- assay.data object <- LogSeuratCommand(object = object) return(object) } #' @importFrom future nbrOfWorkers #' #' @param features Vector of features names to scale/center. Default is variable features. #' @param vars.to.regress Variables to regress out (previously latent.vars in #' RegressOut). For example, nUMI, or percent.mito. #' @param latent.data Extra data to regress out, should be cells x latent data #' @param split.by Name of variable in object metadata or a vector or factor defining #' grouping of cells. See argument \code{f} in \code{\link[base]{split}} for more details #' @param model.use Use a linear model or generalized linear model #' (poisson, negative binomial) for the regression. Options are 'linear' #' (default), 'poisson', and 'negbinom' #' @param use.umi Regress on UMI count data. Default is FALSE for linear #' modeling, but automatically set to TRUE if model.use is 'negbinom' or 'poisson' #' @param do.scale Whether to scale the data. #' @param do.center Whether to center the data. #' @param scale.max Max value to return for scaled data. The default is 10. #' Setting this can help reduce the effects of features that are only expressed in #' a very small number of cells. If regressing out latent variables and using a #' non-linear model, the default is 50. #' @param block.size Default size for number of features to scale at in a single #' computation. Increasing block.size may speed up calculations but at an #' additional memory cost. #' @param min.cells.to.block If object contains fewer than this number of cells, #' don't block for scaling calculations. #' @param verbose Displays a progress bar for scaling procedure #' #' @importFrom future.apply future_lapply #' #' @rdname ScaleData #' @concept preprocessing #' @export #' ScaleData.default <- function( object, features = NULL, vars.to.regress = NULL, latent.data = NULL, split.by = NULL, model.use = 'linear', use.umi = FALSE, do.scale = TRUE, do.center = TRUE, scale.max = 10, block.size = 1000, min.cells.to.block = 3000, verbose = TRUE, ... ) { CheckDots(...) features <- features %||% rownames(x = object) features <- as.vector(x = intersect(x = features, y = rownames(x = object))) object <- object[features, , drop = FALSE] object.names <- dimnames(x = object) min.cells.to.block <- min(min.cells.to.block, ncol(x = object)) suppressWarnings(expr = Parenting( parent.find = "ScaleData.Assay", features = features, min.cells.to.block = min.cells.to.block )) split.by <- split.by %||% TRUE split.cells <- split(x = colnames(x = object), f = split.by) CheckGC() if (!is.null(x = vars.to.regress)) { if (is.null(x = latent.data)) { latent.data <- data.frame(row.names = colnames(x = object)) } else { latent.data <- latent.data[colnames(x = object), , drop = FALSE] rownames(x = latent.data) <- colnames(x = object) } if (any(vars.to.regress %in% rownames(x = object))) { latent.data <- cbind( latent.data, t(x = object[vars.to.regress[vars.to.regress %in% rownames(x = object)], , drop=FALSE]) ) } # Currently, RegressOutMatrix will do nothing if latent.data = NULL notfound <- setdiff(x = vars.to.regress, y = colnames(x = latent.data)) if (length(x = notfound) == length(x = vars.to.regress)) { stop( "None of the requested variables to regress are present in the object.", call. = FALSE ) } else if (length(x = notfound) > 0) { warning( "Requested variables to regress not in object: ", paste(notfound, collapse = ", "), call. = FALSE, immediate. = TRUE ) vars.to.regress <- colnames(x = latent.data) } if (verbose) { message("Regressing out ", paste(vars.to.regress, collapse = ', ')) } chunk.points <- ChunkPoints(dsize = nrow(x = object), csize = block.size) if (nbrOfWorkers() > 1) { # TODO: lapply chunks <- expand.grid( names(x = split.cells), 1:ncol(x = chunk.points), stringsAsFactors = FALSE ) object <- future_lapply( X = 1:nrow(x = chunks), FUN = function(i) { row <- chunks[i, ] group <- row[[1]] index <- as.numeric(x = row[[2]]) return(RegressOutMatrix( data.expr = object[chunk.points[1, index]:chunk.points[2, index], split.cells[[group]], drop = FALSE], latent.data = latent.data[split.cells[[group]], , drop = FALSE], features.regress = features, model.use = model.use, use.umi = use.umi, verbose = FALSE )) } ) if (length(x = split.cells) > 1) { merge.indices <- lapply( X = 1:length(x = split.cells), FUN = seq.int, to = length(x = object), by = length(x = split.cells) ) object <- lapply( X = merge.indices, FUN = function(x) { return(do.call(what = 'rbind', args = object[x])) } ) object <- do.call(what = 'cbind', args = object) } else { object <- do.call(what = 'rbind', args = object) } } else { object <- lapply( X = names(x = split.cells), FUN = function(x) { if (verbose && length(x = split.cells) > 1) { message("Regressing out variables from split ", x) } return(RegressOutMatrix( data.expr = object[, split.cells[[x]], drop = FALSE], latent.data = latent.data[split.cells[[x]], , drop = FALSE], features.regress = features, model.use = model.use, use.umi = use.umi, verbose = verbose )) } ) object <- do.call(what = 'cbind', args = object) } dimnames(x = object) <- object.names CheckGC() } if (verbose && (do.scale || do.center)) { msg <- paste( na.omit(object = c( ifelse(test = do.center, yes = 'centering', no = NA_character_), ifelse(test = do.scale, yes = 'scaling', no = NA_character_) )), collapse = ' and ' ) msg <- paste0( toupper(x = substr(x = msg, start = 1, stop = 1)), substr(x = msg, start = 2, stop = nchar(x = msg)), ' data matrix' ) message(msg) } if (inherits(x = object, what = c('dgCMatrix', 'dgTMatrix'))) { scale.function <- FastSparseRowScale } else { object <- as.matrix(x = object) scale.function <- FastRowScale } if (nbrOfWorkers() > 1) { blocks <- ChunkPoints(dsize = length(x = features), csize = block.size) chunks <- expand.grid( names(x = split.cells), 1:ncol(x = blocks), stringsAsFactors = FALSE ) scaled.data <- future_lapply( X = 1:nrow(x = chunks), FUN = function(index) { row <- chunks[index, ] group <- row[[1]] block <- as.vector(x = blocks[, as.numeric(x = row[[2]])]) arg.list <- list( mat = object[features[block[1]:block[2]], split.cells[[group]], drop = FALSE], scale = do.scale, center = do.center, scale_max = scale.max, display_progress = FALSE ) arg.list <- arg.list[intersect(x = names(x = arg.list), y = names(x = formals(fun = scale.function)))] data.scale <- do.call(what = scale.function, args = arg.list) dimnames(x = data.scale) <- dimnames(x = object[features[block[1]:block[2]], split.cells[[group]]]) suppressWarnings(expr = data.scale[is.na(x = data.scale)] <- 0) CheckGC() return(data.scale) } ) if (length(x = split.cells) > 1) { merge.indices <- lapply( X = 1:length(x = split.cells), FUN = seq.int, to = length(x = scaled.data), by = length(x = split.cells) ) scaled.data <- lapply( X = merge.indices, FUN = function(x) { return(suppressWarnings(expr = do.call(what = 'rbind', args = scaled.data[x]))) } ) scaled.data <- suppressWarnings(expr = do.call(what = 'cbind', args = scaled.data)) } else { suppressWarnings(expr = scaled.data <- do.call(what = 'rbind', args = scaled.data)) } } else { scaled.data <- matrix( data = NA_real_, nrow = nrow(x = object), ncol = ncol(x = object), dimnames = object.names ) max.block <- ceiling(x = length(x = features) / block.size) for (x in names(x = split.cells)) { if (verbose) { if (length(x = split.cells) > 1 && (do.scale || do.center)) { message(gsub(pattern = 'matrix', replacement = 'from split ', x = msg), x) } pb <- txtProgressBar(min = 0, max = max.block, style = 3, file = stderr()) } for (i in 1:max.block) { my.inds <- ((block.size * (i - 1)):(block.size * i - 1)) + 1 my.inds <- my.inds[my.inds <= length(x = features)] arg.list <- list( mat = object[features[my.inds], split.cells[[x]], drop = FALSE], scale = do.scale, center = do.center, scale_max = scale.max, display_progress = FALSE ) arg.list <- arg.list[intersect(x = names(x = arg.list), y = names(x = formals(fun = scale.function)))] data.scale <- do.call(what = scale.function, args = arg.list) dimnames(x = data.scale) <- dimnames(x = object[features[my.inds], split.cells[[x]]]) scaled.data[features[my.inds], split.cells[[x]]] <- data.scale rm(data.scale) CheckGC() if (verbose) { setTxtProgressBar(pb = pb, value = i) } } if (verbose) { close(con = pb) } } } dimnames(x = scaled.data) <- object.names scaled.data[is.na(x = scaled.data)] <- 0 CheckGC() return(scaled.data) } #' @rdname ScaleData #' @concept preprocessing #' @export #' @method ScaleData IterableMatrix #' ScaleData.IterableMatrix <- function( object, features = NULL, do.scale = TRUE, do.center = TRUE, scale.max = 10, ... ) { features <- features %||% rownames(x = object) features <- as.vector(x = intersect(x = features, y = rownames(x = object))) object <- object[features, , drop = FALSE] if (do.center) { features.mean <- BPCells::matrix_stats( matrix = object, row_stats = 'mean')$row_stats['mean',] } else { features.mean <- 0 } if (do.scale) { features.sd <- sqrt(BPCells::matrix_stats( matrix = object, row_stats = 'variance')$row_stats['variance',]) features.sd[features.sd == 0] <- 0.01 } else { features.sd <- 1 } if (scale.max != Inf) { object <- BPCells::min_by_row(mat = object, vals = scale.max * features.sd + features.mean) } scaled.data <- (object - features.mean) / features.sd return(scaled.data) } #' @rdname ScaleData #' @concept preprocessing #' @export #' @method ScaleData Assay #' ScaleData.Assay <- function( object, features = NULL, vars.to.regress = NULL, latent.data = NULL, split.by = NULL, model.use = 'linear', use.umi = FALSE, do.scale = TRUE, do.center = TRUE, scale.max = 10, block.size = 1000, min.cells.to.block = 3000, verbose = TRUE, ... ) { use.umi <- ifelse(test = model.use != 'linear', yes = TRUE, no = use.umi) slot.use <- ifelse(test = use.umi, yes = 'counts', no = 'data') features <- features %||% VariableFeatures(object) if (length(x = features) == 0) { features <- rownames(x = GetAssayData(object = object, layer = slot.use)) } object <- SetAssayData( object = object, layer = 'scale.data', new.data = ScaleData( object = GetAssayData(object = object, layer = slot.use), features = features, vars.to.regress = vars.to.regress, latent.data = latent.data, split.by = split.by, model.use = model.use, use.umi = use.umi, do.scale = do.scale, do.center = do.center, scale.max = scale.max, block.size = block.size, min.cells.to.block = min.cells.to.block, verbose = verbose, ... ) ) suppressWarnings(expr = Parenting( parent.find = "ScaleData.Seurat", features = features, min.cells.to.block = min.cells.to.block, use.umi = use.umi )) return(object) } #' @param assay Name of Assay to scale #' #' @rdname ScaleData #' @concept preprocessing #' @export #' @method ScaleData Seurat #' ScaleData.Seurat <- function( object, features = NULL, assay = NULL, vars.to.regress = NULL, split.by = NULL, model.use = 'linear', use.umi = FALSE, do.scale = TRUE, do.center = TRUE, scale.max = 10, block.size = 1000, min.cells.to.block = 3000, verbose = TRUE, ... ) { assay <- assay[1L] %||% DefaultAssay(object = object) assay <- match.arg(arg = assay, choices = Assays(object = object)) if (any(vars.to.regress %in% colnames(x = object[[]]))) { latent.data <- object[[vars.to.regress[vars.to.regress %in% colnames(x = object[[]])]]] } else { latent.data <- NULL } if (is.character(x = split.by) && length(x = split.by) == 1) { split.by <- object[[split.by]] } assay.data <- ScaleData( # object = assay.data, object = object[[assay]], features = features, vars.to.regress = vars.to.regress, latent.data = latent.data, split.by = split.by, model.use = model.use, use.umi = use.umi, do.scale = do.scale, do.center = do.center, scale.max = scale.max, block.size = block.size, min.cells.to.block = min.cells.to.block, verbose = verbose, ... ) object[[assay]] <- assay.data object <- LogSeuratCommand(object = object) return(object) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Read Vitessce Expression Data #' #' @inheritParams ReadVitessce #' #' @return An expression matrix with cells as columns and features as rows #' #' @name vitessce-helpers #' @rdname vitessce-helpers #' #' @importFrom jsonlite read_json #' #' @keywords internal #' #' @noRd #' .ReadVitessceGenes <- function(counts) { p1 <- progressor() p1( message = "Reading counts in Vitessce genes format", class = 'sticky', amount = 0 ) p1(type = 'finish') cts <- read_json(path = counts) p2 <- progressor(steps = length(x = cts)) cts <- lapply( X = names(x = cts), FUN = function(x) { expr <- cts[[x]]$cells expr <- as.matrix(x = expr) colnames(x = expr) <- x p2() return(expr) } ) p2(type = 'finish') cts <- Reduce( f = function(x, y) { a <- merge(x = x, y = y, by = 0, all = TRUE) rownames(x = a) <- a$Row.names a$Row.names <- NULL return(as.matrix(x = a)) }, x = cts ) cts[is.na(x = cts)] <- 0 return(t(x = cts)) } #' @name vitessce-helpers #' @rdname vitessce-helpers #' #' @importFrom jsonlite read_json #' #' @keywords internal #' #' @noRd #' .ReadVitessceClusters <- function(counts) { p1 <- progressor() p1( message = "Reading counts in Vitessce clusters format", class = 'sticky', amount = 0 ) p1(type = 'finish') cts <- read_json(path = counts) # p2 <- progressor(steps = length(x = cts)) cells <- unlist(x = cts$cols) features <- unlist(x = cts$rows) cts <- lapply(X = cts[['matrix']], FUN = unlist) cts <- t(x = as.data.frame(x = cts)) dimnames(x = cts) <- list(features, cells) return(cts) } #' @name nanostring-helpers #' @rdname nanostring-helpers #' #' @return data frame containing counts for cells based on a single class of segmentation (eg Nuclear) #' #' @keywords internal #' #' @noRd #' build.cellcomp.matrix <- function(mols.df, class=NULL) { if (!is.null(class)) { if (!(class %in% c("Nuclear", "Membrane", "Cytoplasm"))) { stop(paste("Cannot subset matrix based on segmentation:", class)) } mols.df <- mols.df[mols.df$CellComp == class,] # subset based on cell class } mols.df$bc <- paste0(as.character(mols.df$cell_ID), "_", as.character(mols.df$fov)) ncol <- length(unique(mols.df$target)) nrow <- length(unique(mols.df$bc)) # will mols.df already have a cell barcode column at this point mtx <- matrix(data=rep(0, nrow*ncol), nrow=nrow, ncol=ncol) colnames(mtx) <- unique(mols.df$target) rownames(mtx) <- unique(mols.df$bc) for (row in 1:nrow(mols.df)) { mol <- mols.df[row, "target"] bc <- mols.df[row, "bc"] mtx[bc, mol] <- mtx[bc, mol] + 1 } return(as.data.frame(mtx)) } # Bin spatial regions into grid and average expression values # # @param dat Expression data # @param pos Position information/coordinates for each sample # @param x.cuts Number of cuts to make in the x direction (defines grid along # with y.cuts) # @param y.cuts Number of cuts to make in the y direction # # @return returns a list with positions as centers of the bins and average # expression within the bins # #' @importFrom Matrix rowMeans # BinData <- function(data, pos, x.cuts = 10, y.cuts = x.cuts, verbose = TRUE) { if (verbose) { message("Binning spatial data") } pos$x.cuts <- cut(x = pos[, 1], breaks = x.cuts) pos$y.cuts <- cut(x = pos[, 2], breaks = y.cuts) pos$bin <- paste0(pos$x.cuts, "_", pos$y.cuts) all.bins <- unique(x = pos$bin) new.pos <- matrix(data = numeric(), nrow = length(x = all.bins), ncol = 2) new.dat <- matrix(data = numeric(), nrow = nrow(x = data), ncol = length(x = all.bins)) for(i in 1:length(x = all.bins)) { samples <- rownames(x = pos)[which(x = pos$bin == all.bins[i])] dat <- data[, samples] if (is.null(x = dim(x = dat))) { new.dat[, i] <- dat } else { new.dat[, i] <- rowMeans(data[, samples]) } new.pos[i, 1] <- mean(pos[samples, "x"]) new.pos[i, 2] <- mean(pos[samples, "y"]) } rownames(x = new.dat) <- rownames(x = data) colnames(x = new.dat) <- all.bins rownames(x = new.pos) <- all.bins colnames(x = new.pos) <- colnames(x = pos)[1:2] return(list(data = new.dat, pos = new.pos)) } # Sample classification from MULTI-seq # # Identify singlets, doublets and negative cells from multiplexing experiments. # # @param data Data frame with the raw count data (cell x tags) # @param q Scale the data. Default is 1e4 # # @return Returns a named vector with demultiplexed identities # #' @importFrom KernSmooth bkde #' @importFrom stats approxfun quantile # # @author Chris McGinnis, Gartner Lab, UCSF # # @examples # demux_result <- ClassifyCells(data = counts_data, q = 0.7) # ClassifyCells <- function(data, q) { ## Generate Thresholds: Gaussian KDE with bad barcode detection, outlier trimming ## local maxima estimation with bad barcode detection, threshold definition and adjustment # n_BC <- ncol(x = data) n_cells <- nrow(x = data) bc_calls <- vector(mode = "list", length = n_cells) n_bc_calls <- numeric(length = n_cells) for (i in 1:ncol(x = data)) { model <- tryCatch( expr = approxfun(x = bkde(x = data[, i], kernel = "normal")), error = function(e) { message("No threshold found for ", colnames(x = data)[i], "...") } ) if (is.null(x = model)) { next } x <- seq.int( from = quantile(x = data[, i], probs = 0.001), to = quantile(x = data[, i], probs = 0.999), length.out = 100 ) extrema <- LocalMaxima(x = model(x)) if (length(x = extrema) <= 1) { message("No threshold found for ", colnames(x = data)[i], "...") next } low.extremum <- min(extrema) high.extremum <- max(extrema) thresh <- (x[high.extremum] + x[low.extremum])/2 ## Account for GKDE noise by adjusting low threshold to most prominent peak low.extremae <- extrema[which(x = x[extrema] <= thresh)] new.low.extremum <- low.extremae[which.max(x = model(x)[low.extremae])] thresh <- quantile(x = c(x[high.extremum], x[new.low.extremum]), probs = q) ## Find which cells are above the ith threshold cell_i <- which(x = data[, i] >= thresh) n <- length(x = cell_i) if (n == 0) { ## Skips to next BC if no cells belong to the ith group next } bc <- colnames(x = data)[i] if (n == 1) { bc_calls[[cell_i]] <- c(bc_calls[[cell_i]], bc) n_bc_calls[cell_i] <- n_bc_calls[cell_i] + 1 } else { # have to iterate, lame for (cell in cell_i) { bc_calls[[cell]] <- c(bc_calls[[cell]], bc) n_bc_calls[cell] <- n_bc_calls[cell] + 1 } } } calls <- character(length = n_cells) for (i in 1:n_cells) { if (n_bc_calls[i] == 0) { calls[i] <- "Negative"; next } if (n_bc_calls[i] > 1) { calls[i] <- "Doublet"; next } if (n_bc_calls[i] == 1) { calls[i] <- bc_calls[[i]] } } names(x = calls) <- rownames(x = data) return(calls) } # Computes the metric at a given r (radius) value and stores in meta.features # # @param mv Results of running markvario # @param r.metric r value at which to report the "trans" value of the mark # variogram # # @return Returns a data.frame with r.metric values # # ComputeRMetric <- function(mv, r.metric = 5) { r.metric.results <- unlist(x = lapply( X = mv, FUN = function(x) { x$trans[which.min(x = abs(x = x$r - r.metric))] } )) r.metric.results <- as.data.frame(x = r.metric.results) colnames(r.metric.results) <- paste0("r.metric.", r.metric) return(r.metric.results) } # Normalize a given data matrix # # Normalize a given matrix with a custom function. Essentially just a wrapper # around apply. Used primarily in the context of CLR normalization. # # @param data Matrix with the raw count data # @param custom_function A custom normalization function # @param margin Which way to we normalize. Set 1 for rows (features) or 2 for columns (genes) # @parm across Which way to we normalize? Choose form 'cells' or 'features' # @param verbose Show progress bar # # @return Returns a matrix with the custom normalization # #' @importFrom Matrix t #' @importFrom methods as #' @importFrom pbapply pbapply # CustomNormalize <- function(data, custom_function, margin, verbose = TRUE) { if (is.data.frame(x = data)) { data <- as.matrix(x = data) } if (!inherits(x = data, what = 'dgCMatrix')) { data <- as.sparse(x = data) } myapply <- ifelse(test = verbose, yes = pbapply, no = apply) # margin <- switch( # EXPR = across, # 'cells' = 2, # 'features' = 1, # stop("'across' must be either 'cells' or 'features'") # ) if (verbose) { message("Normalizing across ", c('features', 'cells')[margin]) } norm.data <- myapply( X = data, MARGIN = margin, FUN = custom_function) if (margin == 1) { norm.data = Matrix::t(x = norm.data) } colnames(x = norm.data) <- colnames(x = data) rownames(x = norm.data) <- rownames(x = data) return(norm.data) } # Inter-maxima quantile sweep to find ideal barcode thresholds # # Finding ideal thresholds for positive-negative signal classification per multiplex barcode # # @param call.list A list of sample classification result from different quantiles using ClassifyCells # # @return A list with two values: \code{res} and \code{extrema}: # \describe{ # \item{res}{A data.frame named res_id documenting the quantile used, subset, number of cells and proportion} # \item{extrema}{...} # } # # @author Chris McGinnis, Gartner Lab, UCSF # # @examples # FindThresh(call.list = bar.table_sweep.list) # FindThresh <- function(call.list) { # require(reshape2) res <- as.data.frame(x = matrix( data = 0L, nrow = length(x = call.list), ncol = 4 )) colnames(x = res) <- c("q","pDoublet","pNegative","pSinglet") q.range <- unlist(x = strsplit(x = names(x = call.list), split = "q=")) res$q <- as.numeric(x = q.range[grep(pattern = "0", x = q.range)]) nCell <- length(x = call.list[[1]]) for (i in 1:nrow(x = res)) { temp <- table(call.list[[i]]) if ("Doublet" %in% names(x = temp) == TRUE) { res$pDoublet[i] <- temp[which(x = names(x = temp) == "Doublet")] } if ( "Negative" %in% names(temp) == TRUE ) { res$pNegative[i] <- temp[which(x = names(x = temp) == "Negative")] } res$pSinglet[i] <- sum(temp[which(x = !names(x = temp) %in% c("Doublet", "Negative"))]) } res.q <- res$q q.ind <- grep(pattern = 'q', x = colnames(x = res)) res <- Melt(x = res[, -q.ind]) res[, 1] <- rep.int(x = res.q, times = length(x = unique(res[, 2]))) colnames(x = res) <- c('q', 'variable', 'value') res[, 4] <- res$value/nCell colnames(x = res)[2:4] <- c("Subset", "nCells", "Proportion") extrema <- res$q[LocalMaxima(x = res$Proportion[which(x = res$Subset == "pSinglet")])] return(list(res = res, extrema = extrema)) } # Calculate pearson residuals of features not in the scale.data # This function is the secondary function under GetResidual # # @param object A seurat object # @param features Name of features to add into the scale.data # @param assay Name of the assay of the seurat object generated by SCTransform # @param vst_out The SCT parameter list # @param clip.range Numeric of length two specifying the min and max values the Pearson residual # will be clipped to # Useful if you want to change the clip.range. # @param verbose Whether to print messages and progress bars # # @return Returns a matrix containing not-centered pearson residuals of added features # #' @importFrom sctransform get_residuals # GetResidualSCTModel <- function( object, assay, SCTModel, new_features, clip.range, replace.value, verbose ) { clip.range <- clip.range %||% SCTResults(object = object[[assay]], slot = "clips", model = SCTModel)$sct model.features <- rownames(x = SCTResults(object = object[[assay]], slot = "feature.attributes", model = SCTModel)) umi.assay <- SCTResults(object = object[[assay]], slot = "umi.assay", model = SCTModel) model.cells <- Cells(x = slot(object = object[[assay]], name = "SCTModel.list")[[SCTModel]]) sct.method <- SCTResults(object = object[[assay]], slot = "arguments", model = SCTModel)$sct.method %||% "default" scale.data.cells <- colnames(x = GetAssayData(object = object, assay = assay, layer = "scale.data")) if (length(x = setdiff(x = model.cells, y = scale.data.cells)) == 0) { existing_features <- names(x = which(x = ! apply( X = GetAssayData(object = object, assay = assay, layer = "scale.data")[, model.cells], MARGIN = 1, FUN = anyNA) )) } else { existing_features <- character() } if (replace.value) { features_to_compute <- new_features } else { features_to_compute <- setdiff(x = new_features, y = existing_features) } if (sct.method == "reference.model") { if (verbose) { message("sct.model ", SCTModel, " is from reference, so no residuals will be recalculated") } features_to_compute <- character() } if (!umi.assay %in% Assays(object = object)) { warning("The umi assay (", umi.assay, ") is not present in the object. ", "Cannot compute additional residuals.", call. = FALSE, immediate. = TRUE) return(NULL) } diff_features <- setdiff(x = features_to_compute, y = model.features) intersect_features <- intersect(x = features_to_compute, y = model.features) if (length(x = diff_features) == 0) { umi <- GetAssayData(object = object, assay = umi.assay, layer = "counts" )[features_to_compute, model.cells, drop = FALSE] } else { warning( "In the SCTModel ", SCTModel, ", the following ", length(x = diff_features), " features do not exist in the counts slot: ", paste(diff_features, collapse = ", ") ) if (length(x = intersect_features) == 0) { return(matrix( data = NA, nrow = length(x = features_to_compute), ncol = length(x = model.cells), dimnames = list(features_to_compute, model.cells) )) } umi <- GetAssayData(object = object, assay = umi.assay, layer = "counts")[intersect_features, model.cells, drop = FALSE] } clip.max <- max(clip.range) clip.min <- min(clip.range) if (nrow(x = umi) > 0) { vst_out <- SCTModel_to_vst(SCTModel = slot(object = object[[assay]], name = "SCTModel.list")[[SCTModel]]) if (verbose) { message("sct.model: ", SCTModel) } new_residual <- get_residuals( vst_out = vst_out, umi = umi, residual_type = "pearson", res_clip_range = c(clip.min, clip.max), verbosity = as.numeric(x = verbose) * 2 ) new_residual <- as.matrix(x = new_residual) # centered data new_residual <- new_residual - rowMeans(x = new_residual) } else { new_residual <- matrix(data = NA, nrow = 0, ncol = length(x = model.cells), dimnames = list(c(), model.cells)) } old.features <- setdiff(x = new_features, y = features_to_compute) if (length(x = old.features) > 0) { old_residuals <- GetAssayData(object = object[[assay]], layer = "scale.data")[old.features, model.cells, drop = FALSE] new_residual <- rbind(new_residual, old_residuals)[new_features, ] } return(new_residual) } # Convert SCTModel class to vst_out used in the sctransform # @param SCTModel # @return Return a list containing sct model # SCTModel_to_vst <- function(SCTModel) { feature.params <- c("theta", "(Intercept)", "log_umi") feature.attrs <- c("residual_mean", "residual_variance" ) vst_out <- list() vst_out$model_str <- slot(object = SCTModel, name = "model") vst_out$model_pars_fit <- as.matrix(x = slot(object = SCTModel, name = "feature.attributes")[, feature.params]) vst_out$gene_attr <- slot(object = SCTModel, name = "feature.attributes")[, feature.attrs] vst_out$cell_attr <- slot(object = SCTModel, name = "cell.attributes") vst_out$arguments <- slot(object = SCTModel, name = "arguments") return(vst_out) } # Local maxima estimator # # Finding local maxima given a numeric vector # # @param x A continuous vector # # @return Returns a (named) vector showing positions of local maximas # # @author Tommy # @references \url{https://stackoverflow.com/questions/6836409/finding-local-maxima-and-minima} # # @examples # x <- c(1, 2, 9, 9, 2, 1, 1, 5, 5, 1) # LocalMaxima(x = x) # LocalMaxima <- function(x) { # Use -Inf instead if x is numeric (non-integer) y <- diff(x = c(-.Machine$integer.max, x)) > 0L y <- cumsum(x = rle(x = y)$lengths) y <- y[seq.int(from = 1L, to = length(x = y), by = 2L)] if (x[[1]] == x[[2]]) { y <- y[-1] } return(y) } # #' @importFrom stats residuals # NBResiduals <- function(fmla, regression.mat, gene, return.mode = FALSE) { fit <- 0 try( fit <- glm.nb( formula = fmla, data = regression.mat ), silent = TRUE) if (is.numeric(x = fit)) { message(sprintf('glm.nb failed for gene %s; falling back to scale(log(y+1))', gene)) resid <- scale(x = log(x = regression.mat[, 'GENE'] + 1))[, 1] mode <- 'scale' } else { resid <- residuals(fit, type = 'pearson') mode = 'nbreg' } do.return <- list(resid = resid, mode = mode) if (return.mode) { return(do.return) } else { return(do.return$resid) } } # Regress out techincal effects and cell cycle from a matrix # # Remove unwanted effects from a matrix # # @parm data.expr An expression matrix to regress the effects of latent.data out # of should be the complete expression matrix in genes x cells # @param latent.data A matrix or data.frame of latent variables, should be cells # x latent variables, the colnames should be the variables to regress # @param features.regress An integer vector representing the indices of the # genes to run regression on # @param model.use Model to use, one of 'linear', 'poisson', or 'negbinom'; pass # NULL to simply return data.expr # @param use.umi Regress on UMI count data # @param verbose Display a progress bar # #' @importFrom stats as.formula lm #' @importFrom utils txtProgressBar setTxtProgressBar # RegressOutMatrix <- function( data.expr, latent.data = NULL, features.regress = NULL, model.use = NULL, use.umi = FALSE, verbose = TRUE ) { # Do we bypass regression and simply return data.expr? bypass <- vapply( X = list(latent.data, model.use), FUN = is.null, FUN.VALUE = logical(length = 1L) ) if (any(bypass)) { return(data.expr) } # Check model.use possible.models <- c("linear", "poisson", "negbinom") if (!model.use %in% possible.models) { stop(paste( model.use, "is not a valid model. Please use one the following:", paste0(possible.models, collapse = ", ") )) } # Check features.regress if (is.null(x = features.regress)) { features.regress <- 1:nrow(x = data.expr) } if (is.character(x = features.regress)) { features.regress <- intersect(x = features.regress, y = rownames(x = data.expr)) if (length(x = features.regress) == 0) { stop("Cannot use features that are beyond the scope of data.expr") } } else if (max(features.regress) > nrow(x = data.expr)) { stop("Cannot use features that are beyond the scope of data.expr") } # Check dataset dimensions if (nrow(x = latent.data) != ncol(x = data.expr)) { stop("Uneven number of cells between latent data and expression data") } use.umi <- ifelse(test = model.use != 'linear', yes = TRUE, no = use.umi) # Create formula for regression vars.to.regress <- colnames(x = latent.data) fmla <- paste('GENE ~', paste(vars.to.regress, collapse = '+')) fmla <- as.formula(object = fmla) if (model.use == "linear") { # In this code, we'll repeatedly regress different Y against the same X # (latent.data) in order to calculate residuals. Rather that repeatedly # call lm to do this, we'll avoid recalculating the QR decomposition for the # latent.data matrix each time by reusing it after calculating it once regression.mat <- cbind(latent.data, data.expr[1,]) colnames(regression.mat) <- c(colnames(x = latent.data), "GENE") qr <- lm(fmla, data = regression.mat, qr = TRUE)$qr rm(regression.mat) } # Make results matrix data.resid <- matrix( nrow = nrow(x = data.expr), ncol = ncol(x = data.expr) ) if (verbose) { pb <- txtProgressBar(char = '=', style = 3, file = stderr()) } for (i in 1:length(x = features.regress)) { x <- features.regress[i] regression.mat <- cbind(latent.data, data.expr[x, ]) colnames(x = regression.mat) <- c(vars.to.regress, 'GENE') regression.mat <- switch( EXPR = model.use, 'linear' = qr.resid(qr = qr, y = data.expr[x,]), 'poisson' = residuals(object = glm( formula = fmla, family = 'poisson', data = regression.mat), type = 'pearson' ), 'negbinom' = NBResiduals( fmla = fmla, regression.mat = regression.mat, gene = x ) ) data.resid[i, ] <- regression.mat if (verbose) { setTxtProgressBar(pb = pb, value = i / length(x = features.regress)) } } if (verbose) { close(con = pb) } if (use.umi) { data.resid <- log1p(x = Sweep( x = data.resid, MARGIN = 1, STATS = apply(X = data.resid, MARGIN = 1, FUN = min), FUN = '-' )) } dimnames(x = data.resid) <- dimnames(x = data.expr) return(data.resid) } Seurat/R/sketching.R0000644000176200001440000006353115063034661014034 0ustar liggesusers#' @include zzz.R #' @include generics.R #' @importFrom rlang enquo is_quosure quo_get_env quo_get_expr #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Sketch Data #' #' This function uses sketching methods to downsample high-dimensional single-cell RNA expression data, #' which can help with scalability for large datasets. #' #' @param object A Seurat object. #' @param assay Assay name. Default is NULL, in which case the default assay of the object is used. #' @param ncells A positive integer or a named vector/list specifying the #' number of cells to sample per layer. If a single integer is provided, the #' same number of cells will be sampled from each layer. Default is 5000. #' @param sketched.assay Sketched assay name. A sketch assay is created or overwrite with the sketch data. Default is 'sketch'. #' @param method Sketching method to use. Can be 'LeverageScore' or 'Uniform'. #' Default is 'LeverageScore'. #' @param var.name A metadata column name to store the leverage scores. Default is 'leverage.score'. #' @param over.write whether to overwrite existing column in the metadata. Default is FALSE. #' @param seed A positive integer for the seed of the random number generator. Default is 123. #' @param cast The type to cast the resulting assay to. Default is 'dgCMatrix'. #' @param verbose Print progress and diagnostic messages #' @param features A character vector of feature names to include in the #' sketched assay. #' @param ... Arguments passed to other methods #' #' @return A Seurat object with the sketched data added as a new assay. #' #' @importFrom SeuratObject CastAssay Key Key<- Layers #' #' @export #' @concept sketching #' SketchData <- function( object, assay = NULL, ncells = 5000L, sketched.assay = 'sketch', method = c('LeverageScore', 'Uniform'), var.name = "leverage.score", over.write = FALSE, seed = 123L, cast = 'dgCMatrix', verbose = TRUE, features = NULL, ... ) { assay <- assay[1L] %||% DefaultAssay(object = object) assay <- match.arg(arg = assay, choices = Assays(object = object)) method <- match.arg(arg = method) if (sketched.assay == assay) { abort(message = "Cannot overwrite existing assays") } if (sketched.assay %in% Assays(object = object)) { if (sketched.assay == DefaultAssay(object = object)) { DefaultAssay(object = object) <- assay } object[[sketched.assay]] <- NULL } if (!over.write) { var.name <- CheckMetaVarName(object = object, var.name = var.name) } if (method == 'LeverageScore') { if (verbose) { message("Calcuating Leverage Score") } object <- LeverageScore( object = object, assay = assay, var.name = var.name, over.write = over.write, seed = seed, verbose = FALSE, features = features, ... ) } else if (method == 'Uniform') { if (verbose) { message("Uniformly sampling") } object[[var.name]] <- 1 } leverage.score <- object[[var.name]] layer.names <- Layers(object = object[[assay]], search = 'data') if (length(ncells) == 1) { ncells <- rep(ncells, length(layer.names)) } if (is.null(names(ncells))) { names(ncells) <- layer.names } # align index of `ncells` with `layer.names` ncells <- ncells[layer.names] cells <- mapply( function( layer.name, ncells.layer ) { if (!is.null(seed)) { set.seed(seed) } cells.layer <- Cells(object[[assay]], layer = layer.name) if (length(cells.layer) < ncells.layer) { cells.to.keep <- cells.layer } else { cells.to.keep <- sample( x = cells.layer, size = ncells.layer, prob = leverage.score[cells.layer,] ) } return (cells.to.keep) }, layer.names, ncells ) sketched <- suppressWarnings(expr = subset( x = object[[assay]], cells = unlist(cells), layers = Layers(object = object[[assay]], search = c('counts', 'data')) )) if (!is.null(x = cast) && inherits(x = sketched, what = 'Assay5')) { sketched <- CastAssay(object = sketched, to = cast, ...) } Key(object = sketched) <- Key(object = sketched.assay, quiet = TRUE) object[[sketched.assay]] <- sketched DefaultAssay(object = object) <- sketched.assay return(object) } #' Project full data to the sketch assay #' #' #' This function allows projection of high-dimensional single-cell RNA expression data from a full dataset #' onto the lower-dimensional embedding of the sketch of the dataset. #' #' @param object A Seurat object. #' @param assay Assay name for the full data. Default is 'RNA'. #' @param sketched.assay Sketched assay name to project onto. Default is 'sketch'. #' @param sketched.reduction Dimensional reduction results of the sketched assay to project onto. #' @param full.reduction Dimensional reduction name for the projected full dataset. #' @param dims Dimensions to include in the projection. #' @param normalization.method Normalization method to use. Can be 'LogNormalize' or 'SCT'. #' Default is 'LogNormalize'. #' @param refdata An optional list for label transfer from sketch to full data. Default is NULL. #' Similar to refdata in `MapQuery` #' @param k.weight Number of neighbors to consider when weighting labels for transfer. Default is 50. #' @param umap.model An optional pre-computed UMAP model. Default is NULL. #' @param recompute.neighbors Whether to recompute the neighbors for label transfer. Default is FALSE. #' @param recompute.weights Whether to recompute the weights for label transfer. Default is FALSE. #' @param verbose Print progress and diagnostic messages. #' #' @return A Seurat object with the full data projected onto the sketched dimensional reduction results. #' The projected data are stored in the specified full reduction. #' #' @export #' @concept sketching #' ProjectData <- function( object, assay = 'RNA', sketched.assay = 'sketch', sketched.reduction, full.reduction, dims, normalization.method = c("LogNormalize", "SCT"), refdata = NULL, k.weight = 50, umap.model = NULL, recompute.neighbors = FALSE, recompute.weights = FALSE, verbose = TRUE ) { if (!full.reduction %in% Reductions(object)) { if (verbose) { message(full.reduction, ' is not in the object.' ,' Data from all cells will be projected to ', sketched.reduction) } proj.emb <- ProjectCellEmbeddings( query = object, reference = object, query.assay = assay, dims = dims, normalization.method = normalization.method, reference.assay = sketched.assay, reduction = sketched.reduction, verbose = verbose) object[[full.reduction]] <- CreateDimReducObject( embeddings = proj.emb, assay = assay, key = Key(object = full.reduction, quiet = TRUE) ) } object <- TransferSketchLabels( object = object, sketched.assay = sketched.assay, reduction = full.reduction, dims = dims, k = k.weight, refdata = refdata, reduction.model = umap.model, recompute.neighbors = recompute.neighbors, recompute.weights = recompute.weights, verbose = verbose) return(object) } #' Transfer data from sketch data to full data #' #' This function transfers cell type labels from a sketched dataset to a full dataset #' based on the similarities in the lower dimensional space. #' #' @param object A Seurat object. #' @param sketched.assay Sketched assay name. Default is 'sketch'. #' @param reduction Dimensional reduction name to use for label transfer. #' @param dims An integer vector indicating which dimensions to use for label transfer. #' @param refdata A list of character strings indicating the metadata columns containing labels to transfer. Default is NULL. #' Similar to refdata in `MapQuery` #' @param k Number of neighbors to use for label transfer. Default is 50. #' @param reduction.model Dimensional reduction model to use for label transfer. Default is NULL. #' @param neighbors An object storing the neighbors found during the sketching process. Default is NULL. #' @param recompute.neighbors Whether to recompute the neighbors for label transfer. Default is FALSE. #' @param recompute.weights Whether to recompute the weights for label transfer. Default is FALSE. #' @param verbose Print progress and diagnostic messages #' #' @return A Seurat object with transferred labels stored in the metadata. If a UMAP model is provided, #' the full data are also projected onto the UMAP space, with the results stored in a new reduction, full.`reduction.model` #' #' @export #' @concept sketching #' TransferSketchLabels <- function( object, sketched.assay = 'sketch', reduction, dims, refdata = NULL, k = 50, reduction.model = NULL, neighbors = NULL, recompute.neighbors = FALSE, recompute.weights = FALSE, verbose = TRUE ){ full_sketch.nn <- neighbors %||% Tool( object = object, slot = 'TransferSketchLabels' )$full_sketch.nn full_sketch.weight <- Tool( object = object, slot = 'TransferSketchLabels' )$full_sketch.weight compute.neighbors <- is.null(x = full_sketch.nn) || !all(Cells(full_sketch.nn) == Cells(object[[reduction]])) || max(Indices(full_sketch.nn)) > ncol(object[[sketched.assay]]) || !identical(x = full_sketch.nn@alg.info$dims, y = dims) || !identical(x = full_sketch.nn@alg.info$reduction, y = reduction) || recompute.neighbors compute.weights <- is.null(x = full_sketch.weight) || !all(colnames(full_sketch.weight) == Cells(object[[reduction]])) || !all(rownames(full_sketch.weight) == colnames(object[[sketched.assay]])) || recompute.weights || recompute.neighbors if (compute.neighbors) { if (verbose) { message("Finding sketch neighbors") } full_sketch.nn <- NNHelper( query = Embeddings(object[[reduction]])[, dims], data = Embeddings(object[[reduction]])[colnames(object[[sketched.assay]]), dims], k = k, method = "annoy" ) slot(object = full_sketch.nn, name = 'alg.info')$dims <- dims slot(object = full_sketch.nn, name = 'alg.info')$reduction <- reduction } if (compute.weights) { if (verbose) { message("Finding sketch weight matrix") } full_sketch.weight <- FindWeightsNN( nn.obj = full_sketch.nn, query.cells = Cells(object[[reduction]]), reference.cells = colnames(object[[sketched.assay]]), verbose = verbose) rownames(full_sketch.weight) <- colnames(object[[sketched.assay]]) colnames(full_sketch.weight) <- Cells(object[[reduction]]) } slot( object = object, name = 'tools' )$TransferSketchLabels$full_sketch.nn <- full_sketch.nn slot( object = object, name = 'tools' )$TransferSketchLabels$full_sketch.weight <- full_sketch.weight if (!is.null(refdata)) { if (length(refdata) == 1 & is.character(refdata)) { refdata <- list(refdata) names(refdata) <- unlist(refdata) } if (verbose) { message("Transfering refdata from sketch") } for (rd in 1:length(x = refdata)) { if (isFALSE(x = refdata[[rd]])) { transfer.results[[rd]] <- NULL next } rd.name <- names(x = refdata)[rd] label.rd <- refdata[[rd]] ## FetchData not work if (!label.rd %in% colnames( object[[]])) { stop(label.rd, ' is not in the meta.data') } reference.labels <- object[[]][colnames(object[[sketched.assay]]), label.rd] predicted.labels.list <- TransferLablesNN( reference.labels = reference.labels, weight.matrix = full_sketch.weight) object[[paste0(rd.name)]] <- predicted.labels.list$labels object[[paste0(rd.name, '.score')]] <- predicted.labels.list$scores } } if (!is.null(reduction.model)) { umap.model <- Misc(object = object[[reduction.model]], slot = 'model') if (is.null(umap.model)) { warning(reduction.model, ' does not have a stored umap model') return(object) } if (verbose) { message("Projection to sketch umap") } if (ncol(full_sketch.nn) > umap.model$n_neighbors) { full_sketch.nn@nn.idx <- full_sketch.nn@nn.idx[, 1:umap.model$n_neighbors] full_sketch.nn@nn.dist <- full_sketch.nn@nn.dist[, 1:umap.model$n_neighbors] } proj.umap <- RunUMAP( object = full_sketch.nn, reduction.model = object[[reduction.model]], verbose = verbose, assay = slot(object = object[[reduction]], name = 'assay.used') ) full.umap.reduction <- rev( x = make.unique( names = c( Reductions(object = object), paste0('full.',reduction.model) ) ) )[1] Key(object = proj.umap) <- Key(object = full.umap.reduction) object[[full.umap.reduction ]] <- proj.umap } return(object) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @param nsketch A positive integer. The number of sketches to be used in the approximation. #' Default is 5000. #' @param ndims A positive integer or NULL. The number of dimensions to use. If NULL, the number #' of dimensions will default to the number of columns in the object. #' @param method The sketching method to use, defaults to CountSketch. #' @param eps A numeric. The error tolerance for the approximation in Johnson–Lindenstrauss embeddings, #' defaults to 0.5. #' @param seed A positive integer. The seed for the random number generator, defaults to 123. #' @param verbose Print progress and diagnostic messages #' @importFrom Matrix qrR t #' @importFrom irlba irlba #' #' @rdname LeverageScore #' @method LeverageScore default #' #' @export #' @concept sketching #' LeverageScore.default <- function( object, nsketch = 5000L, ndims = NULL, method = CountSketch, eps = 0.5, seed = 123L, verbose = TRUE, ... ) { # Check the dimensions of the object, nsketch, and ndims ncells <- ncol(x = object) if (ncells < nsketch * 1.5) { nv <- ifelse(nrow(x = object) < 50, nrow(x = object) - 1, 50) if (inherits(x = object, what = 'IterableMatrix')) { object <- as.sparse(x = object) } Z <- irlba(A = object, nv = 50, nu = 0, verbose = FALSE)$v return(rowSums(x = Z ^ 2)) } if (nrow(x = object) > 5000L) { abort(message = "too slow") } else if (nrow(x = object) > (ncells / 1.1)) { abort(message = "too square") } ndims <- ndims %||% ncells if (nsketch < (1.1 * nrow(x = object))) { nsketch <- 1.1 * nrow(x = object) warning( "'nsketch' is too close to the number of features, setting to ", round(x = nsketch, digits = 2L), call. = FALSE, immediate. = TRUE ) } nsketch <- min(nsketch, ndims) # Check the method if (is_quosure(x = method)) { method <- eval( expr = quo_get_expr(quo = method), envir = quo_get_env(quo = method) ) } if (is.character(x = method)) { method <- match.fun(FUN = method) } stopifnot(is.function(x = method)) # Run the sketching if (isTRUE(x = verbose)) { message("sampling ", nsketch, " cells for random sketching") } S <- method(nsketch = nsketch, ncells = ncells, seed = seed, ...) object <- t(x = object) if (isTRUE(x = verbose)) { message("Performing QR decomposition") } if (inherits(x = object, what = 'IterableMatrix')) { temp <- tempdir() object.gene_index <- BPCells::transpose_storage_order(matrix = object, tmpdir = temp) sa <- as(object = S %*% object.gene_index, Class = 'dgCMatrix') rm(object.gene_index) unlink(list.files(path = temp, full.names = TRUE)) } else { sa <- S %*% object } if (!inherits(x = sa, what = 'dgCMatrix')) { sa <- as(object = sa, Class = 'dgCMatrix') } qr.sa <- base::qr(x = sa) R <- if (inherits(x = qr.sa, what = 'sparseQR')) { qrR(qr = qr.sa) } else { base::qr.R(qr = qr.sa) } # Check if matrix is square prior to QR decomposition if (nrow(R) < ncol(R)) { stop("QR decomposition failed: R is not square (", nrow(R), " x ", ncol(R), "). ", "This usually means there are too few features compared to cells. ", "Consider increasing the number of input features or adjusting dimensionality parameters.") } R.inv <- as.sparse(x = backsolve(r = R, x = diag(x = ncol(x = R)))) if (isTRUE(x = verbose)) { message("Performing random projection") } JL <- as.sparse(x = JLEmbed( nrow = ncol(x = R.inv), ncol = ndims, eps = eps, seed = seed )) Z <- object %*% (R.inv %*% JL) if (inherits(x = Z, what = 'IterableMatrix')) { Z.score <- BPCells::matrix_stats(matrix = Z ^ 2, row_stats = 'mean' )$row_stats['mean',]*ncol(x = Z) } else { Z.score <- rowSums(x = Z ^ 2) } return(Z.score) } #' @param nsketch A positive integer. The number of sketches to be used in the approximation. #' Default is 5000. #' @param ndims A positive integer or NULL. The number of dimensions to use. If NULL, the number #' of dimensions will default to the number of columns in the object. #' @param method The sketching method to use, defaults to CountSketch. #' @param vf.method VariableFeatures method #' @param layer layer to use #' @param eps A numeric. The error tolerance for the approximation in Johnson–Lindenstrauss embeddings, #' defaults to 0.5. #' @param seed A positive integer. The seed for the random number generator, defaults to 123. #' @param verbose Print progress and diagnostic messages #' @param features A vector of feature names to use for calculating leverage score. #' #' @importFrom SeuratObject EmptyDF #' #' @rdname LeverageScore #' @method LeverageScore StdAssay #' #' @export #' @concept sketching #' LeverageScore.StdAssay <- function( object, nsketch = 5000L, ndims = NULL, method = CountSketch, vf.method = NULL, layer = 'data', eps = 0.5, seed = 123L, verbose = TRUE, features = NULL, ... ) { layer <- unique(x = layer) %||% DefaultLayer(object = object) layer <- Layers(object = object, search = layer) if (!is_quosure(x = method)) { method <- enquo(arg = method) } scores <- EmptyDF(n = ncol(x = object)) row.names(x = scores) <- colnames(x = object) scores[, 1] <- NA_real_ for (i in seq_along(along.with = layer)) { l <- layer[i] if (isTRUE(x = verbose)) { message("Running LeverageScore for layer ", l) } # If user-defined features are provided, use them features.use <- if (!is.null(features)) { features } else { # Otherwise, try to get VariableFeatures from the same data layer vf <- tryCatch({ VariableFeatures(object = object, method = vf.method, layer = l) }, error = function(e) NULL) # Otherwise, if user-defined features and data-layer features are both NULL # use counts-layer variable features instead if (!is.null(vf) && length(vf) > 0) { vf } else { # Try Variable Features from Counts layer counts_layer <- sub("^data", "counts", l) if (isTRUE(x = verbose)) { message("No variable features were found in ",l,". Falling back to variable features from ", counts_layer) } tryCatch({ VariableFeatures(object = object, method = vf.method, layer = counts_layer) }, error = function(e) { stop("Unable to get variable features from data layer `", l, "` or fallback layer `", counts_layer, "`. Consider providing `features` explicitly.") }) } } # Extract gene expression matrix from single layer mat <- LayerData( object = object, layer = l, features = features.use, fast = TRUE ) # Try LeverageScore directly on gene expression matrix score_try <- tryCatch({ LeverageScore( object = mat, nsketch = nsketch, ndims = ndims %||% ncol(x = object), method = method, eps = eps, seed = seed, verbose = verbose, ... ) }, error = function(e) { # Rerun LeverageScore with zero-variance rows removed nonzero_var <- which(apply(mat, 1, function(x) var(x) > 0)) zero_var_features <- setdiff(rownames(mat), rownames(mat)[nonzero_var]) # Warn user if any zero-variance features encountered # Display the first 5 such problematic features if (length(zero_var_features) > 0) { message("LeverageScore failed on full matrix due to presence of features with zero-variance in matrix. Removed ", length(zero_var_features), " zero-variance features from layer ", l, ". First few problematic features: ", paste(head(zero_var_features, 5), collapse = ", "), " ...") } else { message("LeverageScore failed on full matrix, retrying with same data (no zero-variance features found).") } LeverageScore( object = mat[nonzero_var, , drop = FALSE], nsketch = nsketch, ndims = ndims %||% ncol(x = object), method = method, eps = eps, seed = seed, verbose = verbose, ... ) }) scores[Cells(x = object, layer = l), 1] <- score_try } return(scores) } #' @rdname LeverageScore #' @method LeverageScore Assay #' @export #' LeverageScore.Assay <- LeverageScore.StdAssay #' @param assay assay to use #' @param nsketch A positive integer. The number of sketches to be used in the approximation. #' Default is 5000. #' @param ndims A positive integer or NULL. The number of dimensions to use. If NULL, the number #' of dimensions will default to the number of columns in the object. #' @param method The sketching method to use, defaults to CountSketch. #' @param var.name name of slot to store leverage scores #' @param over.write whether to overwrite slot that currently stores leverage scores. Defaults #' to FALSE, in which case the 'var.name' is modified if it already exists in the object #' #' @rdname LeverageScore #' @method LeverageScore Seurat #' #' @export #' @concept sketching #' LeverageScore.Seurat <- function( object, assay = NULL, nsketch = 5000L, ndims = NULL, var.name = 'leverage.score', over.write = FALSE, method = CountSketch, vf.method = NULL, layer = 'data', eps = 0.5, seed = 123L, verbose = TRUE, features = NULL, ... ) { if (!over.write) { var.name <- CheckMetaVarName(object = object, var.name = var.name) } assay <- assay[1L] %||% DefaultAssay(object = object) assay <- match.arg(arg = assay, choices = Assays(object = object)) method <- enquo(arg = method) scores <- LeverageScore( object = object[[assay]], nsketch = nsketch, ndims = ndims, method = method, vf.method = vf.method, layer = 'data', eps = eps, seed = seed, verbose = verbose, features = features, ... ) names(x = scores) <- var.name object[[]] <- scores return(object) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for R-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Generate CountSketch random matrix #' #' @inheritParams base::set.seed #' @param nsketch Number of sketching random cells #' @param ncells Number of cells in the original data #' @param ... Ignored #' #' @return ... #' #' @importFrom Matrix sparseMatrix #' #' @export #' @concept sketching #' #' @keywords internal #' #' @references Clarkson, KL. & Woodruff, DP. #' Low-rank approximation and regression in input sparsity time. #' Journal of the ACM (JACM). 2017 Jan 30;63(6):1-45. #' \doi{10.1145/3019134}; CountSketch <- function(nsketch, ncells, seed = NA_integer_, ...) { if (!is.na(x = seed)) { set.seed(seed = seed) } iv <- xv <- vector(mode = "numeric", length = ncells) jv <- seq_len(length.out = ncells) for (i in jv) { iv[i] <- sample(x = seq_len(length.out = nsketch), size = 1L) xv[i] <- sample(x = c(-1L, 1L), size = 1L) } return(sparseMatrix( i = iv, j = jv, x = xv, dims = c(nsketch, ncells) )) } #' Gaussian sketching #' #' @inheritParams CountSketch #' #' @return ... #' #' @export #' @concept sketching #' #' @keywords internal #' GaussianSketch <- function(nsketch, ncells, seed = NA_integer_, ...) { if (!is.na(x = seed)) { set.seed(seed = seed) } return(matrix( data = rnorm(n = nsketch * ncells, mean = 0L, sd = 1 / (ncells ^ 2)), nrow = nsketch, ncol = ncells )) } #' Generate JL random projection embeddings #' #' @keywords internal #' #' @references Aghila G and Siddharth R (2020). #' RandPro: Random Projection with Classification. R package version 0.2.2. #' \url{https://CRAN.R-project.org/package=RandPro} #' #' @noRd # JLEmbed <- function(nrow, ncol, eps = 0.1, seed = NA_integer_, method = "li") { if (!is.na(x = seed)) { set.seed(seed = seed) } method <- method[1L] method <- match.arg(arg = method) if (!is.null(x = eps)) { if (eps > 1 || eps <= 0) { stop("'eps' must be 0 < eps <= 1") } ncol <- floor(x = 4 * log(x = ncol) / ((eps ^ 2) / 2 - (eps ^ 3 / 3))) } m <- switch( EXPR = method, "li" = { s <- ceiling(x = sqrt(x = ncol)) prob <- c( 1 / (2 * s), 1 - (1 / s), 1 / (2 * s) ) matrix( data = sample( x = seq.int(from = -1L, to = 1L), size = nrow * ncol, replace = TRUE, prob = prob ), nrow = nrow ) } ) return(m) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # S4 Methods #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Seurat/R/clustering.R0000644000176200001440000017053415117326655014245 0ustar liggesusers#' @include generics.R #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Construct weighted nearest neighbor graph #' #' This function will construct a weighted nearest neighbor (WNN) graph. For #' each cell, we identify the nearest neighbors based on a weighted combination #' of two modalities. Takes as input two dimensional reductions, one computed #' for each modality.Other parameters are listed for debugging, but can be left #' as default values. #' #' @param object A Seurat object #' @param reduction.list A list of two dimensional reductions, one for each of #' the modalities to be integrated #' @param dims.list A list containing the dimensions for each reduction to use #' @param k.nn the number of multimodal neighbors to compute. 20 by default #' @param l2.norm Perform L2 normalization on the cell embeddings after #' dimensional reduction. TRUE by default. #' @param knn.graph.name Multimodal knn graph name #' @param snn.graph.name Multimodal snn graph name #' @param weighted.nn.name Multimodal neighbor object name #' @param modality.weight.name Variable name to store modality weight in object #' meta data #' @param knn.range The number of approximate neighbors to compute #' @param prune.SNN Cutoff not to discard edge in SNN graph #' @param sd.scale The scaling factor for kernel width. 1 by default #' @param cross.contant.list Constant used to avoid divide-by-zero errors. 1e-4 #' by default #' @param smooth Smoothing modality score across each individual modality #' neighbors. FALSE by default #' @param return.intermediate Store intermediate results in misc #' @param modality.weight A \code{\link{ModalityWeights}} object generated by #' \code{FindModalityWeights} #' @param verbose Print progress bars and output #' #' @return Seurat object containing a nearest-neighbor object, KNN graph, and #' SNN graph - each based on a weighted combination of modalities. #' @concept clustering #' @export #' FindMultiModalNeighbors <- function( object, reduction.list, dims.list, k.nn = 20, l2.norm = TRUE, knn.graph.name = "wknn", snn.graph.name = "wsnn", weighted.nn.name = "weighted.nn", modality.weight.name = NULL, knn.range = 200, prune.SNN = 1/15, sd.scale = 1, cross.contant.list = NULL, smooth = FALSE, return.intermediate = FALSE, modality.weight = NULL, verbose = TRUE ) { cross.contant.list <- cross.contant.list %||% as.list(x = rep(x = 1e-4, times = length(x = reduction.list))) if (is.null(x = modality.weight)) { if (verbose) { message("Calculating cell-specific modality weights") } modality.weight <- FindModalityWeights( object = object, reduction.list = reduction.list, dims.list = dims.list, k.nn = k.nn, sd.scale = sd.scale, l2.norm = l2.norm, cross.contant.list = cross.contant.list, smooth = smooth, verbose = verbose ) } modality.weight.name <- modality.weight.name %||% paste0(modality.weight@modality.assay, ".weight") modality.assay <- slot(object = modality.weight, name = "modality.assay") if (length(modality.weight.name) != length(reduction.list)) { warning("The number of provided modality.weight.name is not equal to the number of modalities. ", paste(paste0(modality.assay, ".weight"), collapse = " "), " are used to store the modality weights" ) modality.weight.name <- paste0(modality.assay, ".weight") } first.assay <- modality.assay[1] weighted.nn <- MultiModalNN( object = object, k.nn = k.nn, modality.weight = modality.weight, knn.range = knn.range, verbose = verbose ) select_nn <- Indices(object = weighted.nn) select_nn_dist <- Distances(object = weighted.nn) # compute KNN graph if (verbose) { message("Constructing multimodal KNN graph") } j <- as.numeric(x = t(x = select_nn )) i <- ((1:length(x = j)) - 1) %/% k.nn + 1 nn.matrix <- sparseMatrix( i = i, j = j, x = 1, dims = c(ncol(x = object), ncol(x = object)) ) diag(x = nn.matrix) <- 1 rownames(x = nn.matrix) <- colnames(x = nn.matrix) <- colnames(x = object) nn.matrix <- nn.matrix + t(x = nn.matrix) - t(x = nn.matrix) * nn.matrix nn.matrix <- as.Graph(x = nn.matrix) slot(object = nn.matrix, name = "assay.used") <- first.assay object[[knn.graph.name]] <- nn.matrix # compute SNN graph if (verbose) { message("Constructing multimodal SNN graph") } snn.matrix <- ComputeSNN(nn_ranked = select_nn, prune = prune.SNN) rownames(x = snn.matrix) <- colnames(x = snn.matrix) <- Cells(x = object) snn.matrix <- as.Graph(x = snn.matrix ) slot(object = snn.matrix, name = "assay.used") <- first.assay object[[snn.graph.name]] <- snn.matrix # add neighbors and modality weights object[[weighted.nn.name]] <- weighted.nn for (m in 1:length(x = modality.weight.name)) { object[[modality.weight.name[[m]]]] <- slot( object = modality.weight, name = "modality.weight.list" )[[m]] } # add command log modality.weight.command <- slot(object = modality.weight, name = "command") slot(object = modality.weight.command, name = "assay.used") <- first.assay modality.weight.command.name <- slot(object = modality.weight.command, name = "name") object[[modality.weight.command.name]] <- modality.weight.command command <- LogSeuratCommand(object = object, return.command = TRUE) slot(object = command, name = "params")$modality.weight <- NULL slot(object = command, name = "assay.used") <- first.assay command.name <- slot(object = command, name = "name") object[[command.name]] <- command if (return.intermediate) { Misc(object = object, slot = "modality.weight") <- modality.weight } return (object) } #' Find subclusters under one cluster #' #' @inheritParams FindClusters #' @param cluster the cluster to be sub-clustered #' @param subcluster.name the name of sub cluster added in the meta.data #' #' @return return a object with sub cluster labels in the sub-cluster.name variable #' @concept clustering #' @export #' FindSubCluster <- function( object, cluster, graph.name, subcluster.name = "sub.cluster", resolution = 0.5, algorithm = 1 ) { sub.cell <- WhichCells(object = object, idents = cluster) sub.graph <- as.Graph(x = object[[graph.name]][sub.cell, sub.cell]) sub.clusters <- FindClusters( object = sub.graph, resolution = resolution, algorithm = algorithm ) sub.clusters[, 1] <- paste(cluster, sub.clusters[, 1], sep = "_") object[[subcluster.name]] <- as.character(x = Idents(object = object)) object[[subcluster.name]][sub.cell, ] <- sub.clusters[, 1] return(object) } #' Predict value from nearest neighbors #' #' This function will predict expression or cell embeddings from its k nearest #' neighbors index. For each cell, it will average its k neighbors value to get #' its new imputed value. It can average expression value in assays and cell #' embeddings from dimensional reductions. #' #' @param object The object used to calculate knn #' @param nn.idx k near neighbor indices. A cells x k matrix. #' @param assay Assay used for prediction #' @param reduction Cell embedding of the reduction used for prediction #' @param dims Number of dimensions of cell embedding #' @param return.assay Return an assay or a predicted matrix #' @param slot slot used for prediction #' @param features features used for prediction #' @param mean.function the function used to calculate row mean #' @param seed Sets the random seed to check if the nearest neighbor is query #' cell #' @param verbose Print progress #' #' @return return an assay containing predicted expression value in the data #' slot #' @concept integration #' @export #' PredictAssay <- function( object, nn.idx, assay, reduction = NULL, dims = NULL, return.assay = TRUE, slot = "scale.data", features = NULL, mean.function = rowMeans, seed = 4273, verbose = TRUE ){ if (!inherits(x = mean.function, what = 'function')) { stop("'mean.function' must be a function") } if (is.null(x = reduction)) { reference.data <- GetAssayData( object = object, assay = assay, layer = slot ) features <- features %||% VariableFeatures(object = object[[assay]]) if (length(x = features) == 0) { features <- rownames(x = reference.data) if (verbose) { message("VariableFeatures are empty in the ", assay, " assay, features in the ", slot, " slot will be used" ) } } reference.data <- reference.data[features, , drop = FALSE] } else { if (is.null(x = dims)) { stop("dims is empty") } reference.data <- t(x = Embeddings(object = object, reduction = reduction)[, dims]) } set.seed(seed = seed) nn.check <- sample(x = 1:nrow(x = nn.idx), size = min(50, nrow(x = nn.idx))) if (all(nn.idx[nn.check, 1] == nn.check)) { if(verbose){ message("The nearest neighbor is the query cell itself, and it will not be used for prediction") } nn.idx <- nn.idx[,-1] } predicted <- apply( X = nn.idx, MARGIN = 1, FUN = function(x) mean.function(reference.data[, x] ) ) colnames(x = predicted) <- Cells(x = object) if (return.assay) { predicted.assay <- CreateAssayObject(data = predicted, check.matrix = FALSE) return (predicted.assay) } else { return (predicted) } } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @importFrom pbapply pblapply #' @importFrom future.apply future_lapply #' @importFrom future nbrOfWorkers #' #' @param modularity.fxn Modularity function (1 = standard; 2 = alternative). #' @param initial.membership Passed to the `initial_membership` parameter #' of `leidenbase::leiden_find_partition`. #' @param node.sizes Passed to the `node_sizes` parameter of #' `leidenbase::leiden_find_partition`. #' @param resolution Value of the resolution parameter, use a value above #' (below) 1.0 if you want to obtain a larger (smaller) number of communities. #' @param algorithm Algorithm for modularity optimization (1 = original Louvain #' algorithm; 2 = Louvain algorithm with multilevel refinement; 3 = SLM #' algorithm; 4 = Leiden algorithm). #' @param leiden_method Choose from the leidenbase ("leidenbase") or igraph ("igraph") packages for running leiden. #' Default is "leidenbase" #' @param leiden_objective_function objective function to use if `leiden_method = "igraph"`. #' See \code{\link[igraph]{cluster_leiden}} for more information. #' Default is "modularity". #' @param method DEPRECATED. #' @param n.start Number of random starts. #' @param n.iter Maximal number of iterations per random start. #' @param random.seed Seed of the random number generator. #' @param group.singletons Group singletons into nearest cluster. If FALSE, assign all singletons to #' a "singleton" group #' @param temp.file.location Directory where intermediate files will be written. #' Specify the ABSOLUTE path. #' @param edge.file.name Edge file to use as input for modularity optimizer jar. #' @param verbose Print output #' #' @rdname FindClusters #' @concept clustering #' @export #' FindClusters.default <- function( object, modularity.fxn = 1, initial.membership = NULL, node.sizes = NULL, resolution = 0.8, method = deprecated(), algorithm = 1, leiden_method = c("leidenbase", "igraph"), leiden_objective_function = c("modularity", "CPM"), n.start = 10, n.iter = 10, random.seed = 0, group.singletons = TRUE, temp.file.location = NULL, edge.file.name = NULL, verbose = TRUE, ... ) { CheckDots(...) # The `method` parameter is for `RunLeiden` but was deprecated, see # function for more details. if (is_present(method)) { deprecate_soft( when = "5.2.0", what = "FindClusters(method)" ) } if (is.null(x = object)) { stop("Please provide an SNN graph") } if (tolower(x = algorithm) == "louvain") { algorithm <- 1 } if (tolower(x = algorithm) == "leiden") { algorithm <- 4 } leiden_method <- match.arg(leiden_method) leiden_objective_function <- match.arg(leiden_objective_function) if (nbrOfWorkers() > 1) { clustering.results <- future_lapply( X = resolution, FUN = function(r) { if (algorithm %in% c(1:3)) { ids <- RunModularityClustering( SNN = object, modularity = modularity.fxn, resolution = r, algorithm = algorithm, n.start = n.start, n.iter = n.iter, random.seed = random.seed, print.output = verbose, temp.file.location = temp.file.location, edge.file.name = edge.file.name ) } else if (algorithm == 4) { ids <- RunLeiden( object = object, leiden_method = leiden_method, leiden_objective_function = leiden_objective_function, partition.type = "RBConfigurationVertexPartition", initial.membership = initial.membership, node.sizes = node.sizes, resolution.parameter = r, random.seed = random.seed, n.iter = n.iter ) } else { stop("algorithm not recognised, please specify as an integer or string") } names(x = ids) <- colnames(x = object) ids <- GroupSingletons(ids = ids, SNN = object, verbose = verbose) results <- list(factor(x = ids)) names(x = results) <- paste0('res.', r) return(results) } ) clustering.results <- as.data.frame(x = clustering.results) } else { clustering.results <- data.frame(row.names = colnames(x = object)) for (r in resolution) { if (algorithm %in% c(1:3)) { ids <- RunModularityClustering( SNN = object, modularity = modularity.fxn, resolution = r, algorithm = algorithm, n.start = n.start, n.iter = n.iter, random.seed = random.seed, print.output = verbose, temp.file.location = temp.file.location, edge.file.name = edge.file.name) } else if (algorithm == 4) { ids <- RunLeiden( object = object, leiden_method = leiden_method, leiden_objective_function = leiden_objective_function, method = method, partition.type = "RBConfigurationVertexPartition", initial.membership = initial.membership, node.sizes = node.sizes, resolution.parameter = r, random.seed = random.seed, n.iter = n.iter ) } else { stop("algorithm not recognised, please specify as an integer or string") } names(x = ids) <- colnames(x = object) ids <- GroupSingletons(ids = ids, SNN = object, group.singletons = group.singletons, verbose = verbose) clustering.results[, paste0("res.", r)] <- factor(x = ids) } } return(clustering.results) } #' @importFrom methods is #' #' @param graph.name Name of graph to use for the clustering algorithm #' @param cluster.name Name of output clusters #' #' @rdname FindClusters #' @export #' @concept clustering #' @method FindClusters Seurat #' FindClusters.Seurat <- function( object, graph.name = NULL, cluster.name = NULL, modularity.fxn = 1, initial.membership = NULL, node.sizes = NULL, resolution = 0.8, # ToDo: Update `LogSeuratCommand` to accommodate deprecated parameters. method = NULL, algorithm = 1, leiden_method = c("leidenbase", "igraph"), leiden_objective_function = c("modularity", "CPM"), n.start = 10, n.iter = 10, random.seed = 0, group.singletons = TRUE, temp.file.location = NULL, edge.file.name = NULL, verbose = TRUE, ... ) { CheckDots(...) # Since we're throwing a soft deprecation warning, it needs to be duplicated # for each implementation of the `FindClusters` generic, see # `FindCluster.default` for more details. if (!is.null(method)) { deprecate_soft( when = "5.2.0", what = "FindClusters(method)" ) } graph.name <- graph.name %||% paste0(DefaultAssay(object = object), "_snn") if (!graph.name %in% names(x = object)) { stop("Provided graph.name not present in Seurat object") } if (!is(object = object[[graph.name]], class2 = "Graph")) { stop("Provided graph.name does not correspond to a graph object.") } clustering.results <- FindClusters( object = object[[graph.name]], modularity.fxn = modularity.fxn, initial.membership = initial.membership, node.sizes = node.sizes, resolution = resolution, algorithm = algorithm, leiden_method = leiden_method, leiden_objective_function = leiden_objective_function, n.start = n.start, n.iter = n.iter, random.seed = random.seed, group.singletons = group.singletons, temp.file.location = temp.file.location, edge.file.name = edge.file.name, verbose = verbose, ... ) # Add cluster names to clustering results default.cluster.name <- paste(graph.name, names(clustering.results), sep = "_") cluster.name <- cluster.name %||% default.cluster.name names(x = clustering.results) <- cluster.name # object <- AddMetaData(object = object, metadata = clustering.results) # Idents(object = object) <- colnames(x = clustering.results)[ncol(x = clustering.results)] idents.use <- names(x = clustering.results)[ncol(x = clustering.results)] object[[]] <- clustering.results Idents(object = object, replace = TRUE) <- object[[idents.use, drop = TRUE]] levels <- levels(x = object) levels <- tryCatch( expr = as.numeric(x = levels), warning = function(...) { return(levels) }, error = function(...) { return(levels) } ) Idents(object = object) <- factor(x = Idents(object = object), levels = sort(x = levels)) # If cluster name is NULL, default cluster name is used (seurat_clusters) when assigning factor levels # Otherwise, use cluster name provided by user if (isTRUE(x = all(cluster.name %in% default.cluster.name))) { object[['seurat_clusters']] <- Idents(object = object) } else { object[[cluster.name]] <- Idents(object = object) } cmd <- LogSeuratCommand(object = object, return.command = TRUE) slot(object = cmd, name = 'assay.used') <- DefaultAssay(object = object[[graph.name]]) object[[slot(object = cmd, name = 'name')]] <- cmd return(object) } #' @param query Matrix of data to query against object. If missing, defaults to #' object. #' @param distance.matrix Boolean value of whether the provided matrix is a #' distance matrix; note, for objects of class \code{dist}, this parameter will #' be set automatically #' @param k.param Defines k for the k-nearest neighbor algorithm #' @param return.neighbor Return result as \code{\link[SeuratObject]{Neighbor}} object. Not #' used with distance matrix input. #' @param compute.SNN also compute the shared nearest neighbor graph #' @param prune.SNN Sets the cutoff for acceptable Jaccard index when #' computing the neighborhood overlap for the SNN construction. Any edges with #' values less than or equal to this will be set to 0 and removed from the SNN #' graph. Essentially sets the stringency of pruning (0 --- no pruning, 1 --- #' prune everything). #' @param nn.method Method for nearest neighbor finding. Options include: rann, #' annoy #' @param annoy.metric Distance metric for annoy. Options include: euclidean, #' cosine, manhattan, and hamming #' @param n.trees More trees gives higher precision when using annoy approximate #' nearest neighbor search #' @param nn.eps Error bound when performing nearest neighbor search using RANN; #' default of 0.0 implies exact nearest neighbor search #' @param verbose Whether or not to print output to the console #' @param l2.norm Take L2Norm of the data #' @param cache.index Include cached index in returned Neighbor object #' (only relevant if return.neighbor = TRUE) #' @param index Precomputed index. Useful if querying new data against existing #' index to avoid recomputing. #' #' @importFrom RANN nn2 #' @importFrom methods as #' #' @rdname FindNeighbors #' @export #' @concept clustering #' @method FindNeighbors default #' FindNeighbors.default <- function( object, query = NULL, distance.matrix = FALSE, k.param = 20, return.neighbor = FALSE, compute.SNN = !return.neighbor, prune.SNN = 1/15, nn.method = "annoy", n.trees = 50, annoy.metric = "euclidean", nn.eps = 0, verbose = TRUE, l2.norm = FALSE, cache.index = FALSE, index = NULL, ... ) { CheckDots(...) if (is.null(x = dim(x = object))) { warning( "Object should have two dimensions, attempting to coerce to matrix", call. = FALSE ) object <- as.matrix(x = object) } if (is.null(rownames(x = object))) { stop("Please provide rownames (cell names) with the input object") } n.cells <- nrow(x = object) if (n.cells < k.param) { warning( "k.param set larger than number of cells. Setting k.param to number of cells - 1.", call. = FALSE ) k.param <- n.cells - 1 } if (l2.norm) { object <- L2Norm(mat = object) query <- query %iff% L2Norm(mat = query) } query <- query %||% object # find the k-nearest neighbors for each single cell if (!distance.matrix) { if (verbose) { if (return.neighbor) { message("Computing nearest neighbors") } else { message("Computing nearest neighbor graph") } } nn.ranked <- NNHelper( data = object, query = query, k = k.param, method = nn.method, n.trees = n.trees, searchtype = "standard", eps = nn.eps, metric = annoy.metric, cache.index = cache.index, index = index ) if (return.neighbor) { if (compute.SNN) { warning("The SNN graph is not computed if return.neighbor is TRUE.", call. = FALSE) } return(nn.ranked) } nn.ranked <- Indices(object = nn.ranked) } else { if (verbose) { message("Building SNN based on a provided distance matrix") } knn.mat <- matrix(data = 0, ncol = k.param, nrow = n.cells) knd.mat <- knn.mat for (i in 1:n.cells) { knn.mat[i, ] <- order(object[i, ])[1:k.param] knd.mat[i, ] <- object[i, knn.mat[i, ]] } nn.ranked <- knn.mat[, 1:k.param] } # convert nn.ranked into a Graph j <- as.numeric(x = t(x = nn.ranked)) i <- ((1:length(x = j)) - 1) %/% k.param + 1 nn.matrix <- as(object = sparseMatrix(i = i, j = j, x = 1, dims = c(nrow(x = object), nrow(x = object))), Class = "Graph") rownames(x = nn.matrix) <- rownames(x = object) colnames(x = nn.matrix) <- rownames(x = object) neighbor.graphs <- list(nn = nn.matrix) if (compute.SNN) { if (verbose) { message("Computing SNN") } snn.matrix <- ComputeSNN( nn_ranked = nn.ranked, prune = prune.SNN ) rownames(x = snn.matrix) <- rownames(x = object) colnames(x = snn.matrix) <- rownames(x = object) snn.matrix <- as.Graph(x = snn.matrix) neighbor.graphs[["snn"]] <- snn.matrix } return(neighbor.graphs) } #' @rdname FindNeighbors #' @export #' @concept clustering #' @method FindNeighbors Assay #' FindNeighbors.Assay <- function( object, features = NULL, k.param = 20, return.neighbor = FALSE, compute.SNN = !return.neighbor, prune.SNN = 1/15, nn.method = "annoy", n.trees = 50, annoy.metric = "euclidean", nn.eps = 0, verbose = TRUE, l2.norm = FALSE, cache.index = FALSE, ... ) { CheckDots(...) features <- features %||% VariableFeatures(object = object) data.use <- t(x = GetAssayData(object = object, layer = "data")[features, ]) neighbor.graphs <- FindNeighbors( object = data.use, k.param = k.param, compute.SNN = compute.SNN, prune.SNN = prune.SNN, nn.method = nn.method, n.trees = n.trees, annoy.metric = annoy.metric, nn.eps = nn.eps, verbose = verbose, l2.norm = l2.norm, return.neighbor = return.neighbor, cache.index = cache.index, ... ) return(neighbor.graphs) } #' @rdname FindNeighbors #' @export #' @concept clustering #' @method FindNeighbors dist #' FindNeighbors.dist <- function( object, k.param = 20, return.neighbor = FALSE, compute.SNN = !return.neighbor, prune.SNN = 1/15, nn.method = "annoy", n.trees = 50, annoy.metric = "euclidean", nn.eps = 0, verbose = TRUE, l2.norm = FALSE, cache.index = FALSE, ... ) { CheckDots(...) return(FindNeighbors( object = as.matrix(x = object), distance.matrix = TRUE, k.param = k.param, compute.SNN = compute.SNN, prune.SNN = prune.SNN, nn.eps = nn.eps, nn.method = nn.method, n.trees = n.trees, annoy.metric = annoy.metric, verbose = verbose, l2.norm = l2.norm, return.neighbor = return.neighbor, cache.index = cache.index, ... )) } #' @param assay Assay to use in construction of (S)NN; used only when \code{dims} #' is \code{NULL} #' @param features Features to use as input for building the (S)NN; used only when #' \code{dims} is \code{NULL} #' @param reduction Reduction to use as input for building the (S)NN #' @param dims Dimensions of reduction to use as input #' @param do.plot Plot SNN graph on tSNE coordinates #' @param graph.name Optional naming parameter for stored (S)NN graph #' (or Neighbor object, if return.neighbor = TRUE). Default is assay.name_(s)nn. #' To store both the neighbor graph and the shared nearest neighbor (SNN) graph, #' you must supply a vector containing two names to the \code{graph.name} #' parameter. The first element in the vector will be used to store the nearest #' neighbor (NN) graph, and the second element used to store the SNN graph. If #' only one name is supplied, only the NN graph is stored. #' #' @importFrom igraph graph.adjacency plot.igraph E #' #' @rdname FindNeighbors #' @export #' @concept clustering #' @method FindNeighbors Seurat #' FindNeighbors.Seurat <- function( object, reduction = "pca", dims = 1:10, assay = NULL, features = NULL, k.param = 20, return.neighbor = FALSE, compute.SNN = !return.neighbor, prune.SNN = 1/15, nn.method = "annoy", n.trees = 50, annoy.metric = "euclidean", nn.eps = 0, verbose = TRUE, do.plot = FALSE, graph.name = NULL, l2.norm = FALSE, cache.index = FALSE, ... ) { CheckDots(...) if (!is.null(x = dims)) { assay <- DefaultAssay(object = object[[reduction]]) data.use <- Embeddings(object = object[[reduction]]) if (max(dims) > ncol(x = data.use)) { stop("More dimensions specified in dims than have been computed") } data.use <- data.use[, dims] neighbor.graphs <- FindNeighbors( object = data.use, k.param = k.param, compute.SNN = compute.SNN, prune.SNN = prune.SNN, nn.method = nn.method, n.trees = n.trees, annoy.metric = annoy.metric, nn.eps = nn.eps, verbose = verbose, l2.norm = l2.norm, return.neighbor = return.neighbor, cache.index = cache.index, ... ) } else { assay <- assay %||% DefaultAssay(object = object) neighbor.graphs <- FindNeighbors( object = object[[assay]], features = features, k.param = k.param, compute.SNN = compute.SNN, prune.SNN = prune.SNN, nn.method = nn.method, n.trees = n.trees, annoy.metric = annoy.metric, nn.eps = nn.eps, verbose = verbose, l2.norm = l2.norm, return.neighbor = return.neighbor, cache.index = cache.index, ... ) } if (length(x = neighbor.graphs) == 1) { neighbor.graphs <- list(nn = neighbor.graphs) } graph.name <- graph.name %||% if (return.neighbor) { paste0(assay, ".", names(x = neighbor.graphs)) } else { paste0(assay, "_", names(x = neighbor.graphs)) } if (length(x = graph.name) == 1) { message("Only one graph name supplied, storing nearest-neighbor graph only") } for (ii in 1:length(x = graph.name)) { if (inherits(x = neighbor.graphs[[ii]], what = "Graph")) { DefaultAssay(object = neighbor.graphs[[ii]]) <- assay } object[[graph.name[[ii]]]] <- neighbor.graphs[[ii]] } if (do.plot) { if (!"tsne" %in% names(x = object@reductions)) { warning("Please compute a tSNE for SNN visualization. See RunTSNE().") } else { if (nrow(x = Embeddings(object = object[["tsne"]])) != ncol(x = object)) { warning("Please compute a tSNE for SNN visualization. See RunTSNE().") } else { net <- graph.adjacency( adjmatrix = as.matrix(x = neighbor.graphs[[2]]), mode = "undirected", weighted = TRUE, diag = FALSE ) plot.igraph( x = net, layout = as.matrix(x = Embeddings(object = object[["tsne"]])), edge.width = E(graph = net)$weight, vertex.label = NA, vertex.size = 0 ) } } } object <- LogSeuratCommand(object = object) return(object) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Run annoy # # @param data Data to build the index with # @param query A set of data to be queried against data # @param metric Distance metric; can be one of "euclidean", "cosine", "manhattan", # "hamming" # @param n.trees More trees gives higher precision when querying # @param k Number of neighbors # @param search.k During the query it will inspect up to search_k nodes which # gives you a run-time trade off between better accuracy and speed. # @param include.distance Include the corresponding distances # @param index optional index object, will be recomputed if not provided # AnnoyNN <- function(data, query = data, metric = "euclidean", n.trees = 50, k, search.k = -1, include.distance = TRUE, index = NULL ) { idx <- index %||% AnnoyBuildIndex( data = data, metric = metric, n.trees = n.trees) nn <- AnnoySearch( index = idx, query = query, k = k, search.k = search.k, include.distance = include.distance) nn$idx <- idx nn$alg.info <- list(metric = metric, ndim = ncol(x = data)) return(nn) } # Build the annoy index # # @param data Data to build the index with # @param metric Distance metric; can be one of "euclidean", "cosine", "manhattan", # "hamming" # @param n.trees More trees gives higher precision when querying # #' @importFrom RcppAnnoy AnnoyEuclidean AnnoyAngular AnnoyManhattan AnnoyHamming # AnnoyBuildIndex <- function(data, metric = "euclidean", n.trees = 50) { f <- ncol(x = data) a <- switch( EXPR = metric, "euclidean" = new(Class = RcppAnnoy::AnnoyEuclidean, f), "cosine" = new(Class = RcppAnnoy::AnnoyAngular, f), "manhattan" = new(Class = RcppAnnoy::AnnoyManhattan, f), "hamming" = new(Class = RcppAnnoy::AnnoyHamming, f), stop ("Invalid metric") ) for (ii in seq(nrow(x = data))) { a$addItem(ii - 1, data[ii, ]) } a$build(n.trees) return(a) } # Search an Annoy approximate nearest neighbor index # # @param Annoy index, built with AnnoyBuildIndex # @param query A set of data to be queried against the index # @param k Number of neighbors # @param search.k During the query it will inspect up to search_k nodes which # gives you a run-time trade off between better accuracy and speed. # @param include.distance Include the corresponding distances in the result # # @return A list with 'nn.idx' (for each element in 'query', the index of the # nearest k elements in the index) and 'nn.dists' (the distances of the nearest # k elements) # #' @importFrom future plan #' @importFrom future.apply future_lapply # AnnoySearch <- function(index, query, k, search.k = -1, include.distance = TRUE) { n <- nrow(x = query) idx <- matrix(nrow = n, ncol = k) dist <- matrix(nrow = n, ncol = k) convert <- methods::is(index, "Rcpp_AnnoyAngular") if (!inherits(x = plan(), what = "multicore")) { oplan <- plan(strategy = "sequential") on.exit(plan(oplan), add = TRUE) } res <- future_lapply(X = 1:n, FUN = function(x) { res <- index$getNNsByVectorList(query[x, ], k, search.k, include.distance) # Convert from Angular to Cosine distance if (convert) { res$dist <- 0.5 * (res$dist * res$dist) } list(res$item + 1, res$distance) }) for (i in 1:n) { idx[i, ] <- res[[i]][[1]] if (include.distance) { dist[i, ] <- res[[i]][[2]] } } return(list(nn.idx = idx, nn.dists = dist)) } # Calculate mean distance of the farthest neighbors from SNN graph # # This function will compute the average distance of the farthest k.nn # neighbors with the lowest nonzero SNN edge weight. First, for each cell it # finds the k.nn neighbors with the smallest edge weight. If there are multiple # cells with the same edge weight at the k.nn-th index, consider all of those # cells in the next step. Next, it computes the euclidean distance to all k.nn # cells in the space defined by the embeddings matrix and returns the average # distance to the farthest k.nn cells. # # @param snn.graph An SNN graph # @param embeddings The cell embeddings used to calculate neighbor distances # @param k.nn The number of neighbors to calculate # @param l2.norm Perform L2 normalization on the cell embeddings # @param nearest.dist The vector of distance to the nearest neighbors to # subtract off from distance calculations # # ComputeSNNwidth <- function( snn.graph, embeddings, k.nn, l2.norm = TRUE, nearest.dist = NULL ) { if (l2.norm) { embeddings <- L2Norm(mat = embeddings) } nearest.dist <- nearest.dist %||% rep(x = 0, times = ncol(x = snn.graph)) if (length(x = nearest.dist) != ncol(x = snn.graph)) { stop("Please provide a vector for nearest.dist that has as many elements as", " there are columns in the snn.graph (", ncol(x = snn.graph), ").") } snn.width <- SNN_SmallestNonzero_Dist( snn = snn.graph, mat = embeddings, n = k.nn, nearest_dist = nearest.dist ) return (snn.width) } # Create an Annoy index # # @note Function exists because it's not exported from \pkg{uwot} # # @param name Distance metric name # @param ndim Number of dimensions # # @return An nn index object # #' @importFrom methods new #' @importFrom RcppAnnoy AnnoyAngular AnnoyManhattan AnnoyEuclidean AnnoyHamming # CreateAnn <- function(name, ndim) { return(switch( EXPR = name, cosine = new(Class = AnnoyAngular, ndim), manhattan = new(Class = AnnoyManhattan, ndim), euclidean = new(Class = AnnoyEuclidean, ndim), hamming = new(Class = AnnoyHamming, ndim), stop("BUG: unknown Annoy metric '", name, "'") )) } # Calculate modality weights # # This function calculates cell-specific modality weights which are used to # in WNN analysis. #' @inheritParams FindMultiModalNeighbors # @param object A Seurat object # @param snn.far.nn Use SNN farthest neighbors to calculate the kernel width # @param s.nn How many SNN neighbors to use in kernel width # @param sigma.idx Neighbor index used to calculate kernel width if snn.far.nn = FALSE # @importFrom pbapply pblapply # @return Returns a \code{ModalityWeights} object that can be used as input to # \code{\link{FindMultiModalNeighbors}} # #' @importFrom pbapply pblapply # FindModalityWeights <- function( object, reduction.list, dims.list, k.nn = 20, snn.far.nn = TRUE, s.nn = k.nn, prune.SNN = 0, l2.norm = TRUE, sd.scale = 1, query = NULL, cross.contant.list = NULL, sigma.idx = k.nn, smooth = FALSE, verbose = TRUE ) { my.lapply <- ifelse( test = verbose, yes = pblapply, no = lapply ) cross.contant.list <- cross.contant.list %||% as.list(x = rep(x = 1e-4, times = length(x = reduction.list))) reduction.set <- unlist(x = reduction.list) names(x = reduction.list) <- names(x = dims.list) <- names(x = cross.contant.list) <- reduction.set embeddings.list <- lapply( X = reduction.list, FUN = function(r) Embeddings(object = object, reduction = r)[, dims.list[[r]]] ) if (l2.norm) { embeddings.list.norm <- lapply( X = embeddings.list, FUN = function(embeddings) L2Norm(mat = embeddings) ) } else { embeddings.list.norm <- embeddings.list } if (is.null(x = query)) { query.embeddings.list.norm <- embeddings.list.norm query <- object } else { if (snn.far.nn) { stop("query does not support using snn to find distant neighbors") } query.embeddings.list <- lapply( X = reduction.list, FUN = function(r) { Embeddings(object = query, reduction = r)[, dims.list[[r]]] } ) if (l2.norm) { query.embeddings.list <- lapply( X = query.embeddings.list, FUN = function(embeddings) L2Norm(mat = embeddings) ) } query.embeddings.list.norm <- query.embeddings.list } if (verbose) { message("Finding ", k.nn, " nearest neighbors for each modality.") } nn.list <- my.lapply( X = reduction.list, FUN = function(r) { nn.r <- NNHelper( data = embeddings.list.norm[[r]], query = query.embeddings.list.norm[[r]], k = max(k.nn, sigma.idx, s.nn), method = "annoy", metric = "euclidean" ) return(nn.r) } ) sigma.nn.list <- nn.list if (sigma.idx > k.nn || s.nn > k.nn) { nn.list <- lapply( X = nn.list, FUN = function(nn){ slot(object = nn, name = "nn.idx") <- Indices(object = nn)[, 1:k.nn] slot(object = nn, name = "nn.dists") <- Distances(object = nn)[, 1:k.nn] return(nn) } ) } nearest_dist <- lapply(X = reduction.list, FUN = function(r) Distances(object = nn.list[[r]])[, 2]) within_impute <- list() cross_impute <- list() # Calculating within and cross modality distance for (r in reduction.set) { reduction.norm <- paste0(r, ".norm") object[[ reduction.norm ]] <- CreateDimReducObject( embeddings = embeddings.list.norm[[r]], key = paste0("norm", Key(object = object[[r]])), assay = DefaultAssay(object = object[[r]]) ) within_impute[[r]] <- PredictAssay( object = object, nn.idx = Indices(object = nn.list[[r]]), reduction = reduction.norm, dims = 1:ncol(x = embeddings.list.norm[[r]]), verbose = FALSE, return.assay = FALSE ) cross.modality <- setdiff(x = reduction.set, y = r) cross_impute[[r]] <- lapply(X = cross.modality, FUN = function(r2) { PredictAssay( object = object, nn.idx = Indices(object = nn.list[[r2]]), reduction = reduction.norm, dims = 1:ncol(x = embeddings.list.norm[[r]]), verbose = FALSE, return.assay = FALSE ) } ) names(x = cross_impute[[r]]) <- cross.modality } within_impute_dist <- lapply( X = reduction.list, FUN = function(r) { r_dist <- impute_dist( x = query.embeddings.list.norm[[r]], y = t(x = within_impute[[r]]), nearest.dist = nearest_dist[[r]] ) return(r_dist) } ) cross_impute_dist <- lapply( X = reduction.list, FUN = function(r) { r_dist <- sapply(setdiff(x = reduction.set, y = r), FUN = function(r2) { r2_dist <- impute_dist( x = query.embeddings.list.norm[[r]], y = t(x = cross_impute[[r]][[r2]]), nearest.dist = nearest_dist[[r]] ) return( r2_dist) }) return(r_dist) } ) # calculate kernel width if (snn.far.nn) { if (verbose) { message("Calculating kernel bandwidths") } snn.graph.list <- lapply( X = sigma.nn.list, FUN = function(nn) { snn.matrix <- ComputeSNN( nn_ranked = Indices(object = nn)[, 1:s.nn], prune = prune.SNN ) colnames(x = snn.matrix) <- rownames(x = snn.matrix) <- Cells(x = object) return (snn.matrix) } ) farthest_nn_dist <- my.lapply( X = 1:length(x = snn.graph.list), FUN = function(s) { distant_nn <- ComputeSNNwidth( snn.graph = snn.graph.list[[s]], k.nn = k.nn, l2.norm = FALSE, embeddings = embeddings.list.norm[[s]], nearest.dist = nearest_dist[[s]] ) return (distant_nn) } ) names(x = farthest_nn_dist) <- unlist(x = reduction.list) modality_sd.list <- lapply( X = farthest_nn_dist, FUN = function(sd) sd * sd.scale ) } else { if (verbose) { message("Calculating sigma by ", sigma.idx, "th neighbor") } modality_sd.list <- lapply( X = reduction.list , FUN = function(r) { rdist <- Distances(object = sigma.nn.list[[r]])[, sigma.idx] - nearest_dist[[r]] rdist <- rdist * sd.scale return (rdist) } ) } # Calculating within and cross modality kernel, and modality weights within_impute_kernel <- lapply( X = reduction.list, FUN = function(r) { exp(-1 * (within_impute_dist[[r]] / modality_sd.list[[r]]) ) } ) cross_impute_kernel <- lapply( X = reduction.list, FUN = function(r) { exp(-1 * (cross_impute_dist[[r]] / modality_sd.list[[r]]) ) } ) params <- list( "reduction.list" = reduction.list, "dims.list" = dims.list, "l2.norm" = l2.norm, "k.nn" = k.nn, "sigma.idx" = sigma.idx, "snn.far.nn" = snn.far.nn , "sigma.list" = modality_sd.list, "nearest.dist" = nearest_dist ) modality_score <- lapply( X = reduction.list, FUN = function(r) { score.r <- sapply( X = setdiff(x = reduction.set, y = r), FUN = function(r2) { score <- within_impute_kernel[[r]] / (cross_impute_kernel[[r]][, r2] + cross.contant.list[[r]]) score <- MinMax(data = score, min = 0, max = 200) return(score) } ) return(score.r) } ) if (smooth) { modality_score <- lapply( X = reduction.list, FUN = function(r) { apply( X = Indices(object = nn.list[[r]]), MARGIN = 1, FUN = function(nn) mean(x = modality_score[[r]][nn[-1]]) ) } ) } all_modality_score <- rowSums(x = exp(x = Reduce(f = cbind, x = modality_score))) modality.weight <- lapply( X = modality_score, FUN = function(score_m) { rowSums(x = exp(x = score_m))/all_modality_score } ) score.mat <- list( within_impute_dist = within_impute_dist, cross_impute_dist = cross_impute_dist, within_impute_kernel = within_impute_kernel, cross_impute_kernel = cross_impute_kernel, modality_score = modality_score ) # unlist the input parameters command <- LogSeuratCommand(object = object, return.command = TRUE) command@params <- lapply(X = command@params, FUN = function(l) unlist(x = l)) modality.assay <- sapply( X = reduction.list , FUN = function (r) slot(object[[r]], name = "assay.used") ) modality.weights.obj <- new( Class = "ModalityWeights", modality.weight.list = modality.weight, modality.assay = modality.assay, params = params, score.matrix = score.mat, command = command ) return(modality.weights.obj) } # Group single cells that make up their own cluster in with the cluster they are # most connected to. # # @param ids Named vector of cluster ids # @param SNN SNN graph used in clustering # @param group.singletons Group singletons into nearest cluster. If FALSE, assign all singletons to # a "singleton" group # # @return Returns Seurat object with all singletons merged with most connected cluster # GroupSingletons <- function(ids, SNN, group.singletons = TRUE, verbose = TRUE) { # identify singletons singletons <- c() singletons <- names(x = which(x = table(ids) == 1)) singletons <- intersect(x = unique(x = ids), singletons) if (!group.singletons) { ids[which(ids %in% singletons)] <- "singleton" return(ids) } # calculate connectivity of singletons to other clusters, add singleton # to cluster it is most connected to cluster_names <- as.character(x = unique(x = ids)) cluster_names <- setdiff(x = cluster_names, y = singletons) connectivity <- vector(mode = "numeric", length = length(x = cluster_names)) names(x = connectivity) <- cluster_names new.ids <- ids for (i in singletons) { i.cells <- names(which(ids == i)) for (j in cluster_names) { j.cells <- names(which(ids == j)) subSNN <- SNN[i.cells, j.cells] set.seed(1) # to match previous behavior, random seed being set in WhichCells if (is.object(x = subSNN)) { connectivity[j] <- sum(subSNN) / (nrow(x = subSNN) * ncol(x = subSNN)) } else { connectivity[j] <- mean(x = subSNN) } } m <- max(connectivity, na.rm = T) mi <- which(x = connectivity == m, arr.ind = TRUE) closest_cluster <- sample(x = names(x = connectivity[mi]), 1) ids[i.cells] <- closest_cluster } if (length(x = singletons) > 0 && verbose) { message(paste( length(x = singletons), "singletons identified.", length(x = unique(x = ids)), "final clusters." )) } return(ids) } # Find multimodal neighbors # # @param object The object used to calculate knn # @param query The query object when query and reference are different # @param modality.weight A \code{\link{ModalityWeights}} object generated by # \code{\link{FindModalityWeights}} # @param modality.weight.list A list of modality weight value # @param k.nn Number of nearest multimodal neighbors to compute # @param reduction.list A list of reduction name # @param dims.list A list of dimensions used for the reduction # @param knn.range The number of approximate neighbors to compute # @param kernel.power The power for the exponential kernel # @param nearest.dist The list of distance to the nearest neighbors # @param sigma.list The list of kernel width # @param l2.norm Perform L2 normalization on the cell embeddings after # dimensional reduction # @param verbose Print output to the console # @importFrom pbapply pblapply # @return return a list containing nn index and nn multimodal distance # #' @importFrom methods new #' @importClassesFrom SeuratObject Neighbor # MultiModalNN <- function( object, query = NULL, modality.weight = NULL, modality.weight.list = NULL, k.nn = NULL, reduction.list = NULL, dims.list = NULL, knn.range = 200, kernel.power = 1, nearest.dist = NULL, sigma.list = NULL, l2.norm = NULL, verbose = TRUE ){ my.lapply <- ifelse( test = verbose, yes = pblapply, no = lapply ) k.nn <- k.nn %||% slot(object = modality.weight, name = "params")$k.nn reduction.list <- reduction.list %||% slot(object = modality.weight, name = "params")$reduction.list dims.list = dims.list %||% slot(object = modality.weight, name = "params")$dims.list nearest.dist = nearest.dist %||% slot(object = modality.weight, name = "params")$nearest.dist sigma.list =sigma.list %||% slot(object = modality.weight, name = "params")$sigma.list l2.norm = l2.norm %||% slot(object = modality.weight, name = "params")$l2.norm modality.weight.value <- modality.weight.list %||% slot(object = modality.weight, name = "modality.weight.list") names(x = modality.weight.value) <- unlist(x = reduction.list) if (inherits(x = object, what = "Seurat")) { reduction_embedding <- lapply( X = 1:length(x = reduction.list), FUN = function(x) { Embeddings(object = object, reduction = reduction.list[[x]])[, dims.list[[x]]] } ) } else { reduction_embedding <- object } if (is.null(x = query)) { query.reduction_embedding <- reduction_embedding query <- object } else { if (inherits(x = object, what = "Seurat")) { query.reduction_embedding <- lapply( X = 1:length(x = reduction.list), FUN = function(x) { Embeddings(object = query, reduction = reduction.list[[x]] )[, dims.list[[x]]] } ) } else { query.reduction_embedding <- query } } if (l2.norm) { query.reduction_embedding <- lapply( X = query.reduction_embedding, FUN = function(x) L2Norm(mat = x) ) reduction_embedding <- lapply( X = reduction_embedding, FUN = function(x) L2Norm(mat = x) ) } query.cell.num <- nrow(x = query.reduction_embedding[[1]]) reduction.num <- length(x = query.reduction_embedding) if (verbose) { message("Finding multimodal neighbors") } reduction_nn <- my.lapply( X = 1:reduction.num, FUN = function(x) { nn_x <- NNHelper( data = reduction_embedding[[x]], query = query.reduction_embedding[[x]], k = knn.range, method = 'annoy', metric = "euclidean" ) return (nn_x) } ) # union of rna and adt nn, remove itself from neighobors reduction_nn <- lapply( X = reduction_nn, FUN = function(x) Indices(object = x)[, -1] ) nn_idx <- lapply( X = 1:query.cell.num , FUN = function(x) { Reduce( f = union, x = lapply( X = reduction_nn, FUN = function(y) y[x, ] ) ) } ) # calculate euclidean distance of all neighbors nn_dist <- my.lapply( X = 1:reduction.num, FUN = function(r) { nndist <- NNdist( nn.idx = nn_idx, embeddings = reduction_embedding[[r]], query.embeddings = query.reduction_embedding[[r]], nearest.dist = nearest.dist[[r]] ) return(nndist) } ) # modality weighted distance if (length(x = sigma.list[[1]]) == 1) { sigma.list <- lapply(X = sigma.list, FUN = function(x) rep(x = x, ncol(x = object))) } nn_weighted_dist <- lapply( X = 1:reduction.num, FUN = function(r) { lapply( X = 1:query.cell.num, FUN = function(x) { exp(-1*(nn_dist[[r]][[x]] / sigma.list[[r]][x] ) ** kernel.power) * modality.weight.value[[r]][x] } ) } ) nn_weighted_dist <- sapply( X = 1:query.cell.num, FUN = function(x) { Reduce( f = "+", x = lapply( X = 1:reduction.num, FUN = function(r) nn_weighted_dist[[r]][[x]] ) ) } ) # select k nearest joint neighbors select_order <- lapply( X = nn_weighted_dist, FUN = function(dist) { order(dist, decreasing = TRUE) }) select_nn <- t(x = sapply( X = 1:query.cell.num, FUN = function(x) nn_idx[[x]][select_order[[x]]][1:k.nn] ) ) select_dist <- t(x = sapply( X = 1:query.cell.num, FUN = function(x) nn_weighted_dist[[x]][select_order[[x]]][1:k.nn]) ) select_dist <- sqrt(x = MinMax(data = (1 - select_dist) / 2, min = 0, max = 1)) weighted.nn <- new( Class = 'Neighbor', nn.idx = select_nn, nn.dist = select_dist, alg.info = list(), cell.names = Cells(x = query) ) return(weighted.nn) } # Calculate NN distance for the given nn.idx # @param nn.idx The nearest neighbors position index # @param embeddings cell embeddings # @param metric distance metric # @param query.embeddings query cell embeddings # @param nearest.dist The list of distance to the nearest neighbors # NNdist <- function( nn.idx, embeddings, metric = "euclidean", query.embeddings = NULL, nearest.dist = NULL ) { if (!is.list(x = nn.idx)) { nn.idx <- lapply(X = 1:nrow(x = nn.idx), FUN = function(x) nn.idx[x, ]) } query.embeddings <- query.embeddings %||% embeddings nn.dist <- fast_dist( x = query.embeddings, y = embeddings, n = nn.idx ) if (!is.null(x = nearest.dist)) { nn.dist <- lapply( X = 1:nrow(x = query.embeddings), FUN = function(x) { r_dist = nn.dist[[x]] - nearest.dist[x] r_dist[r_dist < 0] <- 0 return(r_dist) } ) } return(nn.dist) } # Internal helper function to dispatch to various neighbor finding methods # # @param data Input data # @param query Data to query against data # @param k Number of nearest neighbors to compute # @param method Nearest neighbor method to use: "rann", "annoy" # @param cache.index Store algorithm index with results for reuse # @param ... additional parameters to specific neighbor finding method # #' @importFrom methods new #' @importClassesFrom SeuratObject Neighbor # NNHelper <- function(data, query = data, k, method, cache.index = FALSE, ...) { args <- as.list(x = sys.frame(which = sys.nframe())) args <- c(args, list(...)) results <- ( switch( EXPR = method, "rann" = { args <- args[intersect(x = names(x = args), y = names(x = formals(fun = nn2)))] do.call(what = 'nn2', args = args) }, "annoy" = { args <- args[intersect(x = names(x = args), y = names(x = formals(fun = AnnoyNN)))] do.call(what = 'AnnoyNN', args = args) }, "hnsw" = { args <- args[intersect(x = names(x = args), y = names(x = formals(fun = HnswNN)))] do.call(what = 'HnswNN', args = args) }, stop("Invalid method. Please choose one of 'rann', 'annoy'") ) ) n.ob <- new( Class = 'Neighbor', nn.idx = results$nn.idx, nn.dist = results$nn.dists, alg.info = results$alg.info %||% list(), cell.names = rownames(x = query) ) if (isTRUE(x = cache.index) && !is.null(x = results$idx)) { slot(object = n.ob, name = "alg.idx") <- results$idx } return(n.ob) } #' Run Leiden clustering algorithm #' #' Returns a vector of partition indices. #' #' @param object An adjacency matrix or adjacency list. #' @param method DEPRECATED. #' @param leiden_method Choose from the leidenbase ("leidenbase") or igraph ("igraph") packages for running leiden. #' Default is "leidenbase" #' @param partition.type Type of partition to use for Leiden algorithm. #' Defaults to "RBConfigurationVertexPartition", see #' https://cran.rstudio.com/web/packages/leidenbase/leidenbase.pdf for more options. #' @param leiden_objective_function objective function to use if `leiden_method = "igraph"`. #' See \code{\link[igraph]{cluster_leiden}} for more information. #' Default is "modularity". #' @param initial.membership Passed to the `initial_membership` parameter #' of `leidenbase::leiden_find_partition`. #' @param node.sizes Passed to the `node_sizes` parameter of #' `leidenbase::leiden_find_partition`. #' @param resolution.parameter A parameter controlling the coarseness of the clusters #' for Leiden algorithm. Higher values lead to more clusters. (defaults to 1.0 for #' partition types that accept a resolution parameter) #' @param random.seed Seed of the random number generator, must be greater than 0. #' @param n.iter Maximal number of iterations per random start #' #' @importFrom igraph graph_from_adjacency_matrix graph_from_adj_list cluster_leiden membership #' #' @references igraph-based leiden clustering is adapted from \code{\link[BPCells]{cluster_graph_leiden}} #' (MIT License), author: Benjamin Parks. Reordering of igraph leiden cluster numbers by #' cluster size adapted from rliger v2.0 `.labelClustBySize` (GPL-3.0 License) authors: #' Josh Welch & Yichen Wang #' #' @export #' #' @rdname RunLeiden #' @concept clustering #' RunLeiden <- function( object, method = deprecated(), leiden_method = c("leidenbase", "igraph"), partition.type = c( 'RBConfigurationVertexPartition', 'ModularityVertexPartition', 'RBERVertexPartition', 'CPMVertexPartition', 'MutableVertexPartition', 'SignificanceVertexPartition', 'SurpriseVertexPartition' ), leiden_objective_function = c("modularity", "CPM"), initial.membership = NULL, node.sizes = NULL, resolution.parameter = 1, random.seed = 1, n.iter = 10 ) { # `leidenbase::leiden_find_partition` requires it's `seed` parameter to be # greater than 0 (or NULL) but the default value for `FindClusters` is 0. # If `random.seed` is 0 or less, throw a warning and reset the value to 1. if (!is.null(random.seed) && random.seed <= 0) { warning( paste0( "`random.seed` must be greater than 0 for leiden clustering, ", "resetting `random.seed` to 1." ) ) random.seed <- 1 } # The `method` parameter was deprecated after switching from the `leiden` # package to `leidenbase` to run the algorithm. Unlike `leiden`, `leidenbase` # _requires_ an `igraph` input, so the parameter no longer makes sense. The # good news is that `leidenbase` is much faster than `leiden` so it shouldn't # really matter. if (is_present(method)) { deprecate_soft( when = "5.2.0", what = "RunLeiden(method)" ) } # select leiden method leiden_method <- match.arg(leiden_method) if (leiden_method == "igraph") { # adjust seed for igraph leiden #Set seed without permanently changing seed state prev_seed <- get_seed() on.exit(restore_seed(prev_seed), add = TRUE) set.seed(random.seed) } # Convert `object` into an `igraph`. # If `object` is already an `igraph` no conversion is necessary. if (inherits(object, what = "igraph")) { input <- object # Otherwise, if `object` is a list, assume it is an adjacency list... } else if (inherits(object, what = "list")) { # And convert it to an `igraph` with the appropriate method. input <- graph_from_adj_list(object) # Or, if `object` is a matrix... } else if (inherits(object, what = c("dgCMatrix", "matrix", "Matrix"))) { # Make sure the matrix is sparse. if (inherits(object, what = "Graph")) { if (leiden_method == "leidenbase") { object <- as.sparse(object) } } # And then convert it to an graph. if (leiden_method == "leidenbase") { input <- graph_from_adjacency_matrix(object, weighted = TRUE) } if (leiden_method == "igraph") { input <- graph_from_adjacency_matrix( object, weighted = TRUE, diag = FALSE, mode = "lower") } # Throw an error if `object` is of an unknown type. } else { stop( "Method for Leiden not found for class", class(object), call. = FALSE ) } # Run clustering with `leidenbase`. if (leiden_method == "leidenbase") { # Check if leidenbase is available if (!requireNamespace("leidenbase", quietly = TRUE)) { stop("Package 'leidenbase' is required for leiden_method = 'leidenbase'. ", "Please install it with: install.packages('leidenbase')") } partition <- leidenbase::leiden_find_partition( input, partition_type = partition.type, initial_membership = initial.membership, edge_weights = NULL, node_sizes = node.sizes, resolution_parameter = resolution.parameter, seed = random.seed, num_iter = n.iter )$membership } if (leiden_method == "igraph") { leiden_objective_function <- match.arg(leiden_objective_function) partition <- cluster_leiden( graph = input, resolution = resolution.parameter, objective_function = leiden_objective_function, n_iterations = n.iter, initial_membership = initial.membership) partition <- as.integer(x = membership(communities = partition)) # reorder cluster number by cluster membership size clusts <- as.character(x = partition) count <- data.frame(table(clusts)) count <- count[order(count$Freq, decreasing = TRUE), ] map <- seq(1, nrow(x = count)) names(x = map) <- count[[1]] clusts <- factor(map[clusts]) partition <- data.frame("res" = factor(clusts)) partition <- as.integer(x = partition$res) } return(partition) } # Runs the modularity optimizer (C++ port of java program ModularityOptimizer.jar) # # @param SNN SNN matrix to use as input for the clustering algorithms # @param modularity Modularity function to use in clustering (1 = standard; 2 = alternative) # @param resolution Value of the resolution parameter, use a value above (below) 1.0 if you want to obtain a larger (smaller) number of communities # @param algorithm Algorithm for modularity optimization (1 = original Louvain algorithm; 2 = Louvain algorithm with multilevel refinement; 3 = SLM algorithm; 4 = Leiden algorithm). Leiden requires the leidenalg python module. # @param n.start Number of random starts # @param n.iter Maximal number of iterations per random start # @param random.seed Seed of the random number generator # @param print.output Whether or not to print output to the console # @param temp.file.location Deprecated and no longer used # @param edge.file.name Path to edge file to use # # @return Seurat object with identities set to the results of the clustering procedure # #' @importFrom utils read.table write.table # RunModularityClustering <- function( SNN = matrix(), modularity = 1, resolution = 0.8, algorithm = 1, n.start = 10, n.iter = 10, random.seed = 0, print.output = TRUE, temp.file.location = NULL, edge.file.name = NULL ) { edge_file <- edge.file.name %||% '' clusters <- RunModularityClusteringCpp( SNN, modularity, resolution, algorithm, n.start, n.iter, random.seed, print.output, edge_file ) return(clusters) } Seurat/data/0000755000176200001440000000000015056057544012441 5ustar liggesusersSeurat/data/cc.genes.rda0000644000176200001440000000101015056057544014606 0ustar liggesusersBZh91AY&SYJ®M*€ÿ€ÿðH À?ÿÞà*ƒ@ÝÝ»[ib&!OÐIê1ª¨Ð=!¦@jžjž&…=FÔÐh žšLMÂ4Ã@#!ê 4ÀH¤Ñ4žÒƒ&i=ÓCdÍ J©HWšI#µ'&ºú Åk…S¼Åëmšì‰j'n³ÁKdV‚ŽZИ¸ §il1M¤T"Fy‰».éD¢ÆÌÑû¤¶Õê ÝUäF.“åó¬7 LÆ4PÁ!hb@.UÁEöÿ¦‡]c`[ –î[ÕÊQÁ¨3„5¾\VdQp DóèY§ìøg9=ôXé§Y›*O>¦ó—¾éñ-ò ¾zâÆ€¡ÂEß®˜åÂÀ!‘Pµcvoô.Hš'àgI׸JÛºÂl°‹|¯â¶JÇ ¯i Ù3ð dhž˜à8I¡¨åXcHf†KÛ$ÀÉðáJò/ Y°™ŽöaU‚í=˜¦9Ö¥ŽÚÁÝMâ Ð|n´’R²µíê2,Ôb¬¯_·"iKFŽ)¢—­Bð“.$){ºå•ˆ-L‘¬5‰P"¨ŒÏo—?×4¬rx&›X±m±sÃ)%¹¤I1Ç,vÇ ñms¹Y8ç/ís÷g³ó£­bÉlv— ¶9`Á€ñ×ѯšv‚E‰¶ˆ(_:CqžUíNÐ)“y!C?Ô»,¼°º6Æ ‘wÉ™)å¢ü A¸;{í{«Gj’IiÒÒDåñS4\ô²°AV¸ÕE„ÑqÇK„(82³,zðln)Ê„*Ò–ì3DcK&Ð*j#õ·–8bì~ãL&²lyf"Lêkú éÛ^DŠò‡šàÅÊ𢠊£RÉšo„½Á†9 ‚RAOL ˾¬hR‰¯ê”!®i–͹›²kD24©^î‹öÃïŸ/>þ}è‹ ìFß®b? 5‰.Àþ.äŠp¡!ûaSeurat/src/0000755000176200001440000000000015117330550012304 5ustar liggesusersSeurat/src/data_manipulation.h0000644000176200001440000000544315056057544016167 0ustar liggesusers#ifndef DATA_MANIPULATION #define DATA_MANIPULATION #include #include #include #include #include #include using namespace Rcpp; //---------------------------------------------------- Eigen::SparseMatrix RunUMISampling(Eigen::SparseMatrix data, int sample_val, bool upsample, bool display_progress); Eigen::SparseMatrix RunUMISamplingPerCell(Eigen::SparseMatrix data, NumericVector sample_val, bool upsample, bool display_progress); Eigen::SparseMatrix RowMergeMatrices(Eigen::SparseMatrix mat1, Eigen::SparseMatrix mat2, std::vector< std::string > mat1_rownames, std::vector< std::string > mat2_rownames, std::vector< std::string > all_rownames); Eigen::SparseMatrix LogNorm(Eigen::SparseMatrix data, int scale_factor, bool display_progress ); NumericMatrix Standardize(const Eigen::Map mat, bool display_progress); Eigen::MatrixXd FastSparseRowScale(Eigen::SparseMatrix mat, bool scale, bool center, double scale_max, bool display_progress); Eigen::MatrixXd FastCov(Eigen::MatrixXd mat, bool center); Eigen::MatrixXd FastCovMats(Eigen::MatrixXd mat1, Eigen::MatrixXd mat2, bool center); Eigen::MatrixXd FastRBind(Eigen::MatrixXd mat1, Eigen::MatrixXd mat2); Eigen::VectorXd FastExpMean(Eigen::MatrixXd mat, bool display_progress); Eigen::VectorXd FastRowMean(Eigen::MatrixXd mat, bool display_progress); Eigen::VectorXd FastLogVMR(Eigen::SparseMatrix mat, bool display_progress); Eigen::VectorXd FastExpVar(Eigen::SparseMatrix mat, bool display_progress); Eigen::VectorXd SparseRowVar(Eigen::SparseMatrix mat, bool display_progress); NumericVector SparseRowVar2(Eigen::SparseMatrix mat, NumericVector mu, bool display_progress); NumericVector SparseRowVarStd(Eigen::SparseMatrix mat, NumericVector mu, NumericVector sd, double vmax, bool display_progress); NumericVector RowVar(Eigen::Map x); template std::vector sort_indexes(const std::vector &v); List GraphToNeighborHelper(Eigen::SparseMatrix mat); //---------------------------------------------------- #endif//DATA_MANIPULATION Seurat/src/RcppExports.cpp0000644000176200001440000006036315117062061015310 0ustar liggesusers// Generated by using Rcpp::compileAttributes() -> do not edit by hand // Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 #include #include using namespace Rcpp; #ifdef RCPP_USE_GLOBAL_ROSTREAM Rcpp::Rostream& Rcpp::Rcout = Rcpp::Rcpp_cout_get(); Rcpp::Rostream& Rcpp::Rcerr = Rcpp::Rcpp_cerr_get(); #endif // RunModularityClusteringCpp IntegerVector RunModularityClusteringCpp(Eigen::SparseMatrix SNN, int modularityFunction, double resolution, int algorithm, int nRandomStarts, int nIterations, int randomSeed, bool printOutput, std::string edgefilename); RcppExport SEXP _Seurat_RunModularityClusteringCpp(SEXP SNNSEXP, SEXP modularityFunctionSEXP, SEXP resolutionSEXP, SEXP algorithmSEXP, SEXP nRandomStartsSEXP, SEXP nIterationsSEXP, SEXP randomSeedSEXP, SEXP printOutputSEXP, SEXP edgefilenameSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type SNN(SNNSEXP); Rcpp::traits::input_parameter< int >::type modularityFunction(modularityFunctionSEXP); Rcpp::traits::input_parameter< double >::type resolution(resolutionSEXP); Rcpp::traits::input_parameter< int >::type algorithm(algorithmSEXP); Rcpp::traits::input_parameter< int >::type nRandomStarts(nRandomStartsSEXP); Rcpp::traits::input_parameter< int >::type nIterations(nIterationsSEXP); Rcpp::traits::input_parameter< int >::type randomSeed(randomSeedSEXP); Rcpp::traits::input_parameter< bool >::type printOutput(printOutputSEXP); Rcpp::traits::input_parameter< std::string >::type edgefilename(edgefilenameSEXP); rcpp_result_gen = Rcpp::wrap(RunModularityClusteringCpp(SNN, modularityFunction, resolution, algorithm, nRandomStarts, nIterations, randomSeed, printOutput, edgefilename)); return rcpp_result_gen; END_RCPP } // RunUMISampling Eigen::SparseMatrix RunUMISampling(Eigen::SparseMatrix data, int sample_val, bool upsample, bool display_progress); RcppExport SEXP _Seurat_RunUMISampling(SEXP dataSEXP, SEXP sample_valSEXP, SEXP upsampleSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type data(dataSEXP); Rcpp::traits::input_parameter< int >::type sample_val(sample_valSEXP); Rcpp::traits::input_parameter< bool >::type upsample(upsampleSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(RunUMISampling(data, sample_val, upsample, display_progress)); return rcpp_result_gen; END_RCPP } // RunUMISamplingPerCell Eigen::SparseMatrix RunUMISamplingPerCell(Eigen::SparseMatrix data, NumericVector sample_val, bool upsample, bool display_progress); RcppExport SEXP _Seurat_RunUMISamplingPerCell(SEXP dataSEXP, SEXP sample_valSEXP, SEXP upsampleSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type data(dataSEXP); Rcpp::traits::input_parameter< NumericVector >::type sample_val(sample_valSEXP); Rcpp::traits::input_parameter< bool >::type upsample(upsampleSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(RunUMISamplingPerCell(data, sample_val, upsample, display_progress)); return rcpp_result_gen; END_RCPP } // RowMergeMatrices Eigen::SparseMatrix RowMergeMatrices(Eigen::SparseMatrix mat1, Eigen::SparseMatrix mat2, std::vector< std::string > mat1_rownames, std::vector< std::string > mat2_rownames, std::vector< std::string > all_rownames); RcppExport SEXP _Seurat_RowMergeMatrices(SEXP mat1SEXP, SEXP mat2SEXP, SEXP mat1_rownamesSEXP, SEXP mat2_rownamesSEXP, SEXP all_rownamesSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat1(mat1SEXP); Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat2(mat2SEXP); Rcpp::traits::input_parameter< std::vector< std::string > >::type mat1_rownames(mat1_rownamesSEXP); Rcpp::traits::input_parameter< std::vector< std::string > >::type mat2_rownames(mat2_rownamesSEXP); Rcpp::traits::input_parameter< std::vector< std::string > >::type all_rownames(all_rownamesSEXP); rcpp_result_gen = Rcpp::wrap(RowMergeMatrices(mat1, mat2, mat1_rownames, mat2_rownames, all_rownames)); return rcpp_result_gen; END_RCPP } // LogNorm Eigen::SparseMatrix LogNorm(Eigen::SparseMatrix data, int scale_factor, bool display_progress); RcppExport SEXP _Seurat_LogNorm(SEXP dataSEXP, SEXP scale_factorSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type data(dataSEXP); Rcpp::traits::input_parameter< int >::type scale_factor(scale_factorSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(LogNorm(data, scale_factor, display_progress)); return rcpp_result_gen; END_RCPP } // Standardize NumericMatrix Standardize(Eigen::Map mat, bool display_progress); RcppExport SEXP _Seurat_Standardize(SEXP matSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::Map >::type mat(matSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(Standardize(mat, display_progress)); return rcpp_result_gen; END_RCPP } // FastSparseRowScale Eigen::MatrixXd FastSparseRowScale(Eigen::SparseMatrix mat, bool scale, bool center, double scale_max, bool display_progress); RcppExport SEXP _Seurat_FastSparseRowScale(SEXP matSEXP, SEXP scaleSEXP, SEXP centerSEXP, SEXP scale_maxSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); Rcpp::traits::input_parameter< bool >::type scale(scaleSEXP); Rcpp::traits::input_parameter< bool >::type center(centerSEXP); Rcpp::traits::input_parameter< double >::type scale_max(scale_maxSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(FastSparseRowScale(mat, scale, center, scale_max, display_progress)); return rcpp_result_gen; END_RCPP } // FastSparseRowScaleWithKnownStats Eigen::MatrixXd FastSparseRowScaleWithKnownStats(Eigen::SparseMatrix mat, NumericVector mu, NumericVector sigma, bool scale, bool center, double scale_max, bool display_progress); RcppExport SEXP _Seurat_FastSparseRowScaleWithKnownStats(SEXP matSEXP, SEXP muSEXP, SEXP sigmaSEXP, SEXP scaleSEXP, SEXP centerSEXP, SEXP scale_maxSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); Rcpp::traits::input_parameter< NumericVector >::type mu(muSEXP); Rcpp::traits::input_parameter< NumericVector >::type sigma(sigmaSEXP); Rcpp::traits::input_parameter< bool >::type scale(scaleSEXP); Rcpp::traits::input_parameter< bool >::type center(centerSEXP); Rcpp::traits::input_parameter< double >::type scale_max(scale_maxSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(FastSparseRowScaleWithKnownStats(mat, mu, sigma, scale, center, scale_max, display_progress)); return rcpp_result_gen; END_RCPP } // FastCov Eigen::MatrixXd FastCov(Eigen::MatrixXd mat, bool center); RcppExport SEXP _Seurat_FastCov(SEXP matSEXP, SEXP centerSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::MatrixXd >::type mat(matSEXP); Rcpp::traits::input_parameter< bool >::type center(centerSEXP); rcpp_result_gen = Rcpp::wrap(FastCov(mat, center)); return rcpp_result_gen; END_RCPP } // FastCovMats Eigen::MatrixXd FastCovMats(Eigen::MatrixXd mat1, Eigen::MatrixXd mat2, bool center); RcppExport SEXP _Seurat_FastCovMats(SEXP mat1SEXP, SEXP mat2SEXP, SEXP centerSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::MatrixXd >::type mat1(mat1SEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type mat2(mat2SEXP); Rcpp::traits::input_parameter< bool >::type center(centerSEXP); rcpp_result_gen = Rcpp::wrap(FastCovMats(mat1, mat2, center)); return rcpp_result_gen; END_RCPP } // FastRBind Eigen::MatrixXd FastRBind(Eigen::MatrixXd mat1, Eigen::MatrixXd mat2); RcppExport SEXP _Seurat_FastRBind(SEXP mat1SEXP, SEXP mat2SEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::MatrixXd >::type mat1(mat1SEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type mat2(mat2SEXP); rcpp_result_gen = Rcpp::wrap(FastRBind(mat1, mat2)); return rcpp_result_gen; END_RCPP } // FastExpMean Eigen::VectorXd FastExpMean(Eigen::SparseMatrix mat, bool display_progress); RcppExport SEXP _Seurat_FastExpMean(SEXP matSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(FastExpMean(mat, display_progress)); return rcpp_result_gen; END_RCPP } // SparseRowVar2 NumericVector SparseRowVar2(Eigen::SparseMatrix mat, NumericVector mu, bool display_progress); RcppExport SEXP _Seurat_SparseRowVar2(SEXP matSEXP, SEXP muSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); Rcpp::traits::input_parameter< NumericVector >::type mu(muSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(SparseRowVar2(mat, mu, display_progress)); return rcpp_result_gen; END_RCPP } // SparseRowVarStd NumericVector SparseRowVarStd(Eigen::SparseMatrix mat, NumericVector mu, NumericVector sd, double vmax, bool display_progress); RcppExport SEXP _Seurat_SparseRowVarStd(SEXP matSEXP, SEXP muSEXP, SEXP sdSEXP, SEXP vmaxSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); Rcpp::traits::input_parameter< NumericVector >::type mu(muSEXP); Rcpp::traits::input_parameter< NumericVector >::type sd(sdSEXP); Rcpp::traits::input_parameter< double >::type vmax(vmaxSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(SparseRowVarStd(mat, mu, sd, vmax, display_progress)); return rcpp_result_gen; END_RCPP } // FastLogVMR Eigen::VectorXd FastLogVMR(Eigen::SparseMatrix mat, bool display_progress); RcppExport SEXP _Seurat_FastLogVMR(SEXP matSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(FastLogVMR(mat, display_progress)); return rcpp_result_gen; END_RCPP } // RowVar NumericVector RowVar(Eigen::Map x); RcppExport SEXP _Seurat_RowVar(SEXP xSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::Map >::type x(xSEXP); rcpp_result_gen = Rcpp::wrap(RowVar(x)); return rcpp_result_gen; END_RCPP } // SparseRowVar Eigen::VectorXd SparseRowVar(Eigen::SparseMatrix mat, bool display_progress); RcppExport SEXP _Seurat_SparseRowVar(SEXP matSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(SparseRowVar(mat, display_progress)); return rcpp_result_gen; END_RCPP } // ReplaceColsC Eigen::SparseMatrix ReplaceColsC(Eigen::SparseMatrix mat, NumericVector col_idx, Eigen::SparseMatrix replacement); RcppExport SEXP _Seurat_ReplaceColsC(SEXP matSEXP, SEXP col_idxSEXP, SEXP replacementSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); Rcpp::traits::input_parameter< NumericVector >::type col_idx(col_idxSEXP); Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type replacement(replacementSEXP); rcpp_result_gen = Rcpp::wrap(ReplaceColsC(mat, col_idx, replacement)); return rcpp_result_gen; END_RCPP } // GraphToNeighborHelper List GraphToNeighborHelper(Eigen::SparseMatrix mat); RcppExport SEXP _Seurat_GraphToNeighborHelper(SEXP matSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); rcpp_result_gen = Rcpp::wrap(GraphToNeighborHelper(mat)); return rcpp_result_gen; END_RCPP } // fast_dist List fast_dist(NumericMatrix x, NumericMatrix y, List n); RcppExport SEXP _Seurat_fast_dist(SEXP xSEXP, SEXP ySEXP, SEXP nSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericMatrix >::type x(xSEXP); Rcpp::traits::input_parameter< NumericMatrix >::type y(ySEXP); Rcpp::traits::input_parameter< List >::type n(nSEXP); rcpp_result_gen = Rcpp::wrap(fast_dist(x, y, n)); return rcpp_result_gen; END_RCPP } // FindWeightsC Eigen::SparseMatrix FindWeightsC(NumericVector cells2, Eigen::MatrixXd distances, std::vector anchor_cells2, std::vector integration_matrix_rownames, Eigen::MatrixXd cell_index, Eigen::VectorXd anchor_score, double min_dist, double sd, bool display_progress); RcppExport SEXP _Seurat_FindWeightsC(SEXP cells2SEXP, SEXP distancesSEXP, SEXP anchor_cells2SEXP, SEXP integration_matrix_rownamesSEXP, SEXP cell_indexSEXP, SEXP anchor_scoreSEXP, SEXP min_distSEXP, SEXP sdSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< NumericVector >::type cells2(cells2SEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type distances(distancesSEXP); Rcpp::traits::input_parameter< std::vector >::type anchor_cells2(anchor_cells2SEXP); Rcpp::traits::input_parameter< std::vector >::type integration_matrix_rownames(integration_matrix_rownamesSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type cell_index(cell_indexSEXP); Rcpp::traits::input_parameter< Eigen::VectorXd >::type anchor_score(anchor_scoreSEXP); Rcpp::traits::input_parameter< double >::type min_dist(min_distSEXP); Rcpp::traits::input_parameter< double >::type sd(sdSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(FindWeightsC(cells2, distances, anchor_cells2, integration_matrix_rownames, cell_index, anchor_score, min_dist, sd, display_progress)); return rcpp_result_gen; END_RCPP } // IntegrateDataC Eigen::SparseMatrix IntegrateDataC(Eigen::SparseMatrix integration_matrix, Eigen::SparseMatrix weights, Eigen::SparseMatrix expression_cells2); RcppExport SEXP _Seurat_IntegrateDataC(SEXP integration_matrixSEXP, SEXP weightsSEXP, SEXP expression_cells2SEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type integration_matrix(integration_matrixSEXP); Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type weights(weightsSEXP); Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type expression_cells2(expression_cells2SEXP); rcpp_result_gen = Rcpp::wrap(IntegrateDataC(integration_matrix, weights, expression_cells2)); return rcpp_result_gen; END_RCPP } // ScoreHelper std::vector ScoreHelper(Eigen::SparseMatrix snn, Eigen::MatrixXd query_pca, Eigen::MatrixXd query_dists, Eigen::MatrixXd corrected_nns, int k_snn, bool subtract_first_nn, bool display_progress); RcppExport SEXP _Seurat_ScoreHelper(SEXP snnSEXP, SEXP query_pcaSEXP, SEXP query_distsSEXP, SEXP corrected_nnsSEXP, SEXP k_snnSEXP, SEXP subtract_first_nnSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type snn(snnSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type query_pca(query_pcaSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type query_dists(query_distsSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type corrected_nns(corrected_nnsSEXP); Rcpp::traits::input_parameter< int >::type k_snn(k_snnSEXP); Rcpp::traits::input_parameter< bool >::type subtract_first_nn(subtract_first_nnSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(ScoreHelper(snn, query_pca, query_dists, corrected_nns, k_snn, subtract_first_nn, display_progress)); return rcpp_result_gen; END_RCPP } // ComputeSNN Eigen::SparseMatrix ComputeSNN(Eigen::MatrixXd nn_ranked, double prune); RcppExport SEXP _Seurat_ComputeSNN(SEXP nn_rankedSEXP, SEXP pruneSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::MatrixXd >::type nn_ranked(nn_rankedSEXP); Rcpp::traits::input_parameter< double >::type prune(pruneSEXP); rcpp_result_gen = Rcpp::wrap(ComputeSNN(nn_ranked, prune)); return rcpp_result_gen; END_RCPP } // WriteEdgeFile void WriteEdgeFile(Eigen::SparseMatrix snn, String filename, bool display_progress); RcppExport SEXP _Seurat_WriteEdgeFile(SEXP snnSEXP, SEXP filenameSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type snn(snnSEXP); Rcpp::traits::input_parameter< String >::type filename(filenameSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); WriteEdgeFile(snn, filename, display_progress); return R_NilValue; END_RCPP } // DirectSNNToFile Eigen::SparseMatrix DirectSNNToFile(Eigen::MatrixXd nn_ranked, double prune, bool display_progress, String filename); RcppExport SEXP _Seurat_DirectSNNToFile(SEXP nn_rankedSEXP, SEXP pruneSEXP, SEXP display_progressSEXP, SEXP filenameSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::MatrixXd >::type nn_ranked(nn_rankedSEXP); Rcpp::traits::input_parameter< double >::type prune(pruneSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); Rcpp::traits::input_parameter< String >::type filename(filenameSEXP); rcpp_result_gen = Rcpp::wrap(DirectSNNToFile(nn_ranked, prune, display_progress, filename)); return rcpp_result_gen; END_RCPP } // SNN_SmallestNonzero_Dist std::vector SNN_SmallestNonzero_Dist(Eigen::SparseMatrix snn, Eigen::MatrixXd mat, int n, std::vector nearest_dist); RcppExport SEXP _Seurat_SNN_SmallestNonzero_Dist(SEXP snnSEXP, SEXP matSEXP, SEXP nSEXP, SEXP nearest_distSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type snn(snnSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type mat(matSEXP); Rcpp::traits::input_parameter< int >::type n(nSEXP); Rcpp::traits::input_parameter< std::vector >::type nearest_dist(nearest_distSEXP); rcpp_result_gen = Rcpp::wrap(SNN_SmallestNonzero_Dist(snn, mat, n, nearest_dist)); return rcpp_result_gen; END_RCPP } // row_sum_dgcmatrix NumericVector row_sum_dgcmatrix(NumericVector& x, IntegerVector& i, int rows, int cols); RcppExport SEXP _Seurat_row_sum_dgcmatrix(SEXP xSEXP, SEXP iSEXP, SEXP rowsSEXP, SEXP colsSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericVector& >::type x(xSEXP); Rcpp::traits::input_parameter< IntegerVector& >::type i(iSEXP); Rcpp::traits::input_parameter< int >::type rows(rowsSEXP); Rcpp::traits::input_parameter< int >::type cols(colsSEXP); rcpp_result_gen = Rcpp::wrap(row_sum_dgcmatrix(x, i, rows, cols)); return rcpp_result_gen; END_RCPP } // row_mean_dgcmatrix NumericVector row_mean_dgcmatrix(NumericVector& x, IntegerVector& i, int rows, int cols); RcppExport SEXP _Seurat_row_mean_dgcmatrix(SEXP xSEXP, SEXP iSEXP, SEXP rowsSEXP, SEXP colsSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericVector& >::type x(xSEXP); Rcpp::traits::input_parameter< IntegerVector& >::type i(iSEXP); Rcpp::traits::input_parameter< int >::type rows(rowsSEXP); Rcpp::traits::input_parameter< int >::type cols(colsSEXP); rcpp_result_gen = Rcpp::wrap(row_mean_dgcmatrix(x, i, rows, cols)); return rcpp_result_gen; END_RCPP } // row_var_dgcmatrix NumericVector row_var_dgcmatrix(NumericVector& x, IntegerVector& i, int rows, int cols); RcppExport SEXP _Seurat_row_var_dgcmatrix(SEXP xSEXP, SEXP iSEXP, SEXP rowsSEXP, SEXP colsSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericVector& >::type x(xSEXP); Rcpp::traits::input_parameter< IntegerVector& >::type i(iSEXP); Rcpp::traits::input_parameter< int >::type rows(rowsSEXP); Rcpp::traits::input_parameter< int >::type cols(colsSEXP); rcpp_result_gen = Rcpp::wrap(row_var_dgcmatrix(x, i, rows, cols)); return rcpp_result_gen; END_RCPP } RcppExport SEXP isnull(SEXP); static const R_CallMethodDef CallEntries[] = { {"_Seurat_RunModularityClusteringCpp", (DL_FUNC) &_Seurat_RunModularityClusteringCpp, 9}, {"_Seurat_RunUMISampling", (DL_FUNC) &_Seurat_RunUMISampling, 4}, {"_Seurat_RunUMISamplingPerCell", (DL_FUNC) &_Seurat_RunUMISamplingPerCell, 4}, {"_Seurat_RowMergeMatrices", (DL_FUNC) &_Seurat_RowMergeMatrices, 5}, {"_Seurat_LogNorm", (DL_FUNC) &_Seurat_LogNorm, 3}, {"_Seurat_Standardize", (DL_FUNC) &_Seurat_Standardize, 2}, {"_Seurat_FastSparseRowScale", (DL_FUNC) &_Seurat_FastSparseRowScale, 5}, {"_Seurat_FastSparseRowScaleWithKnownStats", (DL_FUNC) &_Seurat_FastSparseRowScaleWithKnownStats, 7}, {"_Seurat_FastCov", (DL_FUNC) &_Seurat_FastCov, 2}, {"_Seurat_FastCovMats", (DL_FUNC) &_Seurat_FastCovMats, 3}, {"_Seurat_FastRBind", (DL_FUNC) &_Seurat_FastRBind, 2}, {"_Seurat_FastExpMean", (DL_FUNC) &_Seurat_FastExpMean, 2}, {"_Seurat_SparseRowVar2", (DL_FUNC) &_Seurat_SparseRowVar2, 3}, {"_Seurat_SparseRowVarStd", (DL_FUNC) &_Seurat_SparseRowVarStd, 5}, {"_Seurat_FastLogVMR", (DL_FUNC) &_Seurat_FastLogVMR, 2}, {"_Seurat_RowVar", (DL_FUNC) &_Seurat_RowVar, 1}, {"_Seurat_SparseRowVar", (DL_FUNC) &_Seurat_SparseRowVar, 2}, {"_Seurat_ReplaceColsC", (DL_FUNC) &_Seurat_ReplaceColsC, 3}, {"_Seurat_GraphToNeighborHelper", (DL_FUNC) &_Seurat_GraphToNeighborHelper, 1}, {"_Seurat_fast_dist", (DL_FUNC) &_Seurat_fast_dist, 3}, {"_Seurat_FindWeightsC", (DL_FUNC) &_Seurat_FindWeightsC, 9}, {"_Seurat_IntegrateDataC", (DL_FUNC) &_Seurat_IntegrateDataC, 3}, {"_Seurat_ScoreHelper", (DL_FUNC) &_Seurat_ScoreHelper, 7}, {"_Seurat_ComputeSNN", (DL_FUNC) &_Seurat_ComputeSNN, 2}, {"_Seurat_WriteEdgeFile", (DL_FUNC) &_Seurat_WriteEdgeFile, 3}, {"_Seurat_DirectSNNToFile", (DL_FUNC) &_Seurat_DirectSNNToFile, 4}, {"_Seurat_SNN_SmallestNonzero_Dist", (DL_FUNC) &_Seurat_SNN_SmallestNonzero_Dist, 4}, {"_Seurat_row_sum_dgcmatrix", (DL_FUNC) &_Seurat_row_sum_dgcmatrix, 4}, {"_Seurat_row_mean_dgcmatrix", (DL_FUNC) &_Seurat_row_mean_dgcmatrix, 4}, {"_Seurat_row_var_dgcmatrix", (DL_FUNC) &_Seurat_row_var_dgcmatrix, 4}, {"isnull", (DL_FUNC) &isnull, 1}, {NULL, NULL, 0} }; RcppExport void R_init_Seurat(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } Seurat/src/integration.h0000644000176200001440000000175415056057544015022 0ustar liggesusers#ifndef CORRECT_EXPRESSION #define CORRECT_EXPRESSION #include #include using namespace Rcpp; //---------------------------------------------------- Eigen::SparseMatrix FindWeightsC( NumericVector cells2, Eigen::MatrixXd distances, std::vector anchor_cells2, std::vector integration_matrix_rownames, Eigen::MatrixXd cell_index, Eigen::VectorXd anchor_score, double min_dist, double sd, bool display_progress ); Eigen::SparseMatrix IntegrateDataC( Eigen::SparseMatrix integration_matrix, Eigen::SparseMatrix weights, Eigen::SparseMatrix expression_cells2 ); std::vector ScoreHelper( Eigen::SparseMatrix snn, Eigen::MatrixXd query_pca, Eigen::MatrixXd query_dists, Eigen::MatrixXd corrected_nns, int k_snn, bool subtract_first_nn, bool display_progress ); //---------------------------------------------------- #endif//CORRECT_EXPRESSION Seurat/src/integration.cpp0000644000176200001440000001507315056057544015354 0ustar liggesusers#include #include #include #include "data_manipulation.h" using namespace Rcpp; // [[Rcpp::depends(RcppEigen)]] // [[Rcpp::depends(RcppProgress)]] typedef Eigen::Triplet T; // [[Rcpp::export(rng = false)]] Eigen::SparseMatrix FindWeightsC( NumericVector cells2, Eigen::MatrixXd distances, std::vector anchor_cells2, std::vector integration_matrix_rownames, Eigen::MatrixXd cell_index, Eigen::VectorXd anchor_score, double min_dist, double sd, bool display_progress ) { std::vector tripletList; tripletList.reserve(anchor_cells2.size() * 10); std::unordered_map> cell_map; Progress p(anchor_cells2.size() + cells2.size() , display_progress); // build map from anchor_cells2 to integration_matrix rows for(int i=0; i matches; std::vector::iterator iter = integration_matrix_rownames.begin(); while ((iter = std::find(iter, integration_matrix_rownames.end(), anchor_cells2[i])) != integration_matrix_rownames.end()) { int idx = std::distance(integration_matrix_rownames.begin(), iter); matches.push_back(idx); iter++; } cell_map[i] = matches; p.increment(); } // Construct dist_weights matrix for(auto const &cell : cells2){ Eigen::VectorXd dist = distances.row(cell); Eigen::VectorXd indices = cell_index.row(cell); int k=0; //number of anchors used so far; a cell in the neighbor list may contribute to multiple anchors for(int i=0; i mnn_idx = cell_map[indices[i]-1]; for(int j=0; j return_mat; if(min_dist == 0){ Eigen::SparseMatrix dist_weights(integration_matrix_rownames.size(), cells2.size()); dist_weights.setFromTriplets(tripletList.begin(), tripletList.end(), [] (const double&, const double &b) { return b; }); Eigen::VectorXd colSums = dist_weights.transpose() * Eigen::VectorXd::Ones(dist_weights.rows()); for (int k=0; k < dist_weights.outerSize(); ++k){ for (Eigen::SparseMatrix::InnerIterator it(dist_weights, k); it; ++it){ it.valueRef() = it.value()/colSums[k]; } } return_mat = dist_weights; } else { Eigen::MatrixXd dist_weights = Eigen::MatrixXd::Constant(integration_matrix_rownames.size(), cells2.size(), min_dist); for(int i = 0; i < dist_weights.cols(); ++i){ for(int j = 0; j < dist_weights.rows(); ++j){ dist_weights(j, i) = 1 - exp(-1 * dist_weights(j, i) * anchor_score[j]/ pow(2/sd, 2) ); } } for(auto const &weight : tripletList){ dist_weights(weight.row(), weight.col()) = weight.value(); } Eigen::VectorXd colSums = dist_weights.colwise().sum(); for(int i = 0; i < dist_weights.cols(); ++i){ for(int j = 0; j < dist_weights.rows(); ++j){ dist_weights(j, i) = dist_weights(j, i) / colSums[i]; } } return_mat = dist_weights.sparseView(); } return(return_mat); } // [[Rcpp::export(rng = false)]] Eigen::SparseMatrix IntegrateDataC( Eigen::SparseMatrix integration_matrix, Eigen::SparseMatrix weights, Eigen::SparseMatrix expression_cells2 ) { Eigen::SparseMatrix corrected = expression_cells2 - weights.transpose() * integration_matrix; return(corrected); } template std::vector sort_indexes(const std::vector &v) { // initialize original index locations std::vector idx(v.size()); std::iota(idx.begin(), idx.end(), 0); std::stable_sort(idx.begin(), idx.end(), [&v](size_t i1, size_t i2) {return v[i1] < v[i2];}); return idx; } // [[Rcpp::export]] std::vector ScoreHelper( Eigen::SparseMatrix snn, Eigen::MatrixXd query_pca, Eigen::MatrixXd query_dists, Eigen::MatrixXd corrected_nns, int k_snn, bool subtract_first_nn, bool display_progress ) { std::vector scores; // Loop over all query cells Progress p(snn.outerSize(), display_progress); for (int i=0; i < snn.outerSize(); ++i){ p.increment(); // create vectors to store the nonzero snn elements and their indices std::vector nonzero; std::vector nonzero_idx; for (Eigen::SparseMatrix::InnerIterator it(snn, i); it; ++it) { nonzero.push_back(it.value()); nonzero_idx.push_back(it.row()); } // find the k_snn cells with the smallest non-zero edge weights to use in // computing the transition probability bandwidth std::vector nonzero_order = sort_indexes(nonzero); std::vector bw_dists; int k_snn_i = k_snn; if (k_snn_i > nonzero_order.size()) k_snn_i = nonzero_order.size(); for (int j = 0; j < nonzero_order.size(); ++j) { // compute euclidean distances to cells with small edge weights size_t cell = nonzero_idx[nonzero_order[j]]; if(bw_dists.size() < k_snn_i || nonzero[nonzero_order[j]] == nonzero[nonzero_order[k_snn_i-1]]) { double res = (query_pca.col(cell) - query_pca.col(i)).norm(); bw_dists.push_back(res); } else { break; } } // compute bandwidth as the mean distance of the farthest k_snn cells double bw; if (bw_dists.size() > k_snn_i) { std::sort(bw_dists.rbegin(), bw_dists.rend()); bw = std::accumulate(bw_dists.begin(), bw_dists.begin() + k_snn_i, 0.0) / k_snn_i; } else { bw = std::accumulate(bw_dists.begin(), bw_dists.end(), 0.0) / bw_dists.size(); } // compute transition probabilites double first_neighbor_dist; // subtract off distance to first neighbor? if (subtract_first_nn) { first_neighbor_dist = query_dists(i, 1); } else { first_neighbor_dist = 0; } bw = bw - first_neighbor_dist; double q_tps = 0; for(int j = 0; j < query_dists.cols(); ++j) { q_tps += std::exp(-1 * (query_dists(i, j) - first_neighbor_dist) / bw); } q_tps = q_tps/(query_dists.cols()); double c_tps = 0; for(int j = 0; j < corrected_nns.cols(); ++j) { c_tps += exp(-1 * ((query_pca.col(i) - query_pca.col(corrected_nns(i, j)-1)).norm() - first_neighbor_dist) / bw); } c_tps = c_tps/(corrected_nns.cols()); scores.push_back(c_tps/q_tps); } return(scores); } Seurat/src/ModularityOptimizer.h0000644000176200001440000001323515056057544016530 0ustar liggesusers#pragma once #include #include #include #include #include #include #include #include typedef std::vector IVector; typedef std::vector DVector; namespace ModularityOptimizer { class JavaRandom { private: uint64_t seed; int next(int bits); public: JavaRandom(uint64_t seed); int nextInt(int n); void setSeed(uint64_t seed); }; namespace Arrays2 { IVector generateRandomPermutation(int nElements); IVector generateRandomPermutation(int nElements, JavaRandom& random); } class Clustering { private: int nNodes; public: // Note: These two variables were "protected" in java, which means it is accessible to the whole package/public. // Although we could have used friend classes, this allows for better mirroring of the original code. int nClusters; IVector cluster; Clustering(int nNodes); Clustering(IVector cluster); int getNNodes() const {return nNodes;}; int getNClusters() const {return nClusters;}; IVector getClusters() const {return cluster;}; int getCluster(int node) const {return cluster[node];}; IVector getNNodesPerCluster() const; std::vector getNodesPerCluster() const; void setCluster(int node, int cluster); void initSingletonClusters(); void orderClustersByNNodes(); void mergeClusters(const Clustering& clustering); }; class Network { friend class VOSClusteringTechnique; protected: int nNodes; int nEdges; DVector nodeWeight; IVector firstNeighborIndex; IVector neighbor; DVector edgeWeight; double totalEdgeWeightSelfLinks; public: Network(); Network(int nNodes, DVector* nodeWeight, std::vector& edge, DVector* edgeWeight); Network(int nNodes, std::vector& edge) : Network(nNodes, nullptr, edge, nullptr) { }; Network(int nNodes, DVector* nodeWeight, std::vector edge) : Network(nNodes, nodeWeight, edge, nullptr) {}; Network(int nNodes, std::vector& edge, DVector* edgeWeight) : Network(nNodes, nullptr, edge, edgeWeight) {}; Network(int nNodes, DVector* nodeWeight, IVector& firstNeighborIndex, IVector& neighbor, DVector* edgeWeight); Network(int nNodes, IVector& firstNeighborIndex, IVector& neighbor) : Network(nNodes, nullptr, firstNeighborIndex, neighbor, nullptr) {}; Network(int nNodes, DVector* nodeWeight, IVector& firstNeighborIndex, IVector& neighbor) : Network(nNodes, nodeWeight, firstNeighborIndex, neighbor, nullptr){}; Network(int nNodes, IVector& firstNeighborIndex, IVector& neighbor, DVector* edgeWeight) : Network(nNodes, nullptr, firstNeighborIndex, neighbor, edgeWeight) {}; int getNNodes() {return nNodes;}; double getTotalNodeWeight(); DVector getNodeWeights(); double getNodeWeight(int node) { return nodeWeight.at(node);}; int getNEdges() {return nEdges / 2;}; int getNEdges(int node) {return firstNeighborIndex.at(node + 1) - firstNeighborIndex.at(node);}; IVector getNEdgesPerNode(); std::vector getEdges(); IVector getEdges(int node); std::vector getEdgesPerNode(); double getTotalEdgeWeight(); double getTotalEdgeWeight(int node); DVector getTotalEdgeWeightPerNode(); DVector getEdgeWeights() {return edgeWeight;}; DVector getEdgeWeights(int node); std::vector getEdgeWeightsPerNode(); double getTotalEdgeWeightSelfLinks() { return totalEdgeWeightSelfLinks; }; // Added these to avoid making these values public int getFirstNeighborIndexValue(int i) const { return firstNeighborIndex.at(i); }; int getNeighborValue(int index) const { return neighbor.at(index); } std::vector createSubnetworks(Clustering clustering) const; Network createReducedNetwork(const Clustering& clustering) const; Clustering identifyComponents(); private: double generateRandomNumber(int node1, int node2, const IVector& nodePermutation); Network createSubnetwork(const Clustering& clustering, int cluster, IVector& node, IVector& subnetworkNode, IVector& subnetworkNeighbor, DVector& subnetworkEdgeWeight) const; }; class VOSClusteringTechnique { private: std::shared_ptr network; std::shared_ptr clustering; double resolution; public: VOSClusteringTechnique(std::shared_ptr network, double resolution); VOSClusteringTechnique(std::shared_ptr network, std::shared_ptr clustering, double resolution); std::shared_ptr getNetwork() { return network;} std::shared_ptr getClustering() { return clustering; } double getResolution() {return resolution; } void setNetwork(std::shared_ptr network) {this->network = network;} void setClustering(std::shared_ptr clustering) {this->clustering = clustering;} void setResolution(double resolution) {this->resolution = resolution;} double calcQualityFunction(); bool runLocalMovingAlgorithm(JavaRandom& random); bool runLouvainAlgorithm(JavaRandom& random); bool runIteratedLouvainAlgorithm(int maxNIterations, JavaRandom& random); bool runLouvainAlgorithmWithMultilevelRefinement(JavaRandom& random); bool runIteratedLouvainAlgorithmWithMultilevelRefinement(int maxNIterations, JavaRandom& random); bool runSmartLocalMovingAlgorithm(JavaRandom& random); bool runIteratedSmartLocalMovingAlgorithm(int nIterations, JavaRandom& random); int removeCluster(int cluster); void removeSmallClusters(int minNNodesPerCluster); }; std::shared_ptr matrixToNetwork(IVector& node1, IVector& node2, DVector& edgeWeight1, int modularityFunction, int nNodes); std::shared_ptr readInputFile(std::string fname, int modularityFunction); std::vector split(const std::string& s, char delimiter); }; Seurat/src/ModularityOptimizer.cpp0000644000176200001440000010141515056057544017061 0ustar liggesusers// This code is a translation of the Java package, ModularityOptimizer.jar, // available from http://www.ludowaltman.nl/slm/ that performs clustering and was // used by an earlier version of Seurat. // // In translating the code, the interface was maintained, such that the although // the programming languages changed, the results are identical. As a // consequence, rather than rewriting the program to be more idiomatic Rcpp/C++, // both the output and the code was kept as close to the original Java as // possible. For example, in order to maintain compatibility, the Java random // number generator was implemented in C++, and std::stable_sort was used in // place of std::sort to match the output results of the Java code exactly. // // In order to test and verify that the C++ and Java code return the same // results, the C++ code added also includes a mirror of the original command // line interface. This version of the program can be compiled with a command // such as: // // clang++ -O3 -std=c++11 -DSTANDALONE -Wall -g ModularityOptimizer.cpp // // And can then be called in an identical fashion to the original Java version to // verify compatibility or identify any issues in the input/output. #include "ModularityOptimizer.h" #include #include #include #include #include using namespace ModularityOptimizer; using namespace std::chrono; JavaRandom::JavaRandom(uint64_t seed) { setSeed(seed); } void JavaRandom::setSeed(uint64_t seed) { this->seed = (seed ^ uint64_t(0x5DEECE66D)) & ((uint64_t(1) << 48) - 1); } int JavaRandom::next(int bits) { // Only 31 bits ever used. seed = (seed * uint64_t(0x5DEECE66D) + uint64_t(0xB)) & ((uint64_t(1) << 48) - 1); return static_cast(seed >> (48 - bits)); } int JavaRandom::nextInt(int n) { if (n <= 0) throw std::out_of_range("n must be positive"); if ((n & -n) == n) // i.e., n is a power of 2 return static_cast((static_cast(n) * static_cast(next(31))) >> 31); int bits, val; do { bits = next(31); val = bits % n; } while (bits - val + (n - 1) < 0); return val; } IVector Arrays2::generateRandomPermutation(int nElements, JavaRandom& random) { IVector permutation(nElements, 0); for (int i = 0; i < nElements; i++) permutation[i] = i; for (int i = 0; i < nElements; i++) { int j = random.nextInt(nElements); int k = permutation[i]; permutation[i] = permutation[j]; permutation[j] = k; } return permutation; } Clustering::Clustering(int nNodes): nNodes(nNodes), nClusters(1), cluster(nNodes) {}; Clustering::Clustering(IVector cluster) : nNodes(cluster.size()), cluster(cluster.cbegin(), cluster.cend()) { nClusters = *std::max_element(cluster.cbegin(), cluster.cend()) + 1; } IVector Clustering::getNNodesPerCluster() const { IVector nNodesPerCluster(nClusters, 0); for(const int& clust: cluster) { nNodesPerCluster.at(clust)++; } return nNodesPerCluster; } std::vector Clustering::getNodesPerCluster() const { std::vector nodePerCluster(nClusters); IVector nNodesPerCluster = getNNodesPerCluster(); for(int i =0; i < nClusters; i++) { const int cnt = nNodesPerCluster.at(i); nodePerCluster.at(i).reserve(cnt); } for(int i=0; i< nNodes; i++) { nodePerCluster.at(cluster.at(i)).push_back(i); } return nodePerCluster; } void Clustering::setCluster(int node, int cluster) { this->cluster.at(node) = cluster; nClusters = std::max(nClusters, cluster+1); } void Clustering::initSingletonClusters() { for(int i=0; i < nNodes; i++) { cluster.at(i) = i; } nClusters = nNodes; } void Clustering::orderClustersByNNodes() { typedef std::pair ipair; // holds numNodes, cluster std::vector clusterNNodes; clusterNNodes.reserve(nClusters); IVector nNodesPerCluster = getNNodesPerCluster(); for(int i=0; i&a, const std::pair& b) { return b.first < a.first; }); //std::greater()); // now make a map from old to new names IVector newCluster(nClusters, 0); int i=0; do { newCluster[clusterNNodes[i].second] = i; i++; } while (i < nClusters && clusterNNodes[i].first > 0); nClusters = i; for(int i=0; icbegin(), edgeWeight->cend(), this->edgeWeight.begin()); if (nodeWeight != nullptr) { std::copy(nodeWeight->cbegin(), nodeWeight->cend(), this->nodeWeight.begin()); } else { this->nodeWeight = getTotalEdgeWeightPerNode(); } } Network::Network(int nNodes, DVector* nodeWeight, std::vector& edge, DVector* edgeWeight) : nNodes(nNodes), nEdges(0), nodeWeight(), firstNeighborIndex(nNodes + 1, 0), neighbor(), edgeWeight(), totalEdgeWeightSelfLinks(0) { if(edge.size() != 2 || edge[0].size() != edge[1].size()) { throw std::length_error("Edge was supposed to be an array with 2 columns of equal size."); } IVector neighbor(edge.at(0).size(), 0); DVector edgeWeight2(edge.at(0).size(), 0.0); int i = 1; for (size_t j = 0; j < edge[0].size(); j++) if (edge[0][j] != edge[1][j]) { if (edge[0][j] >= i) for (; i <= edge[0][j]; i++) firstNeighborIndex.at(i) = nEdges; neighbor[nEdges] = edge[1][j]; edgeWeight2[nEdges] = (edgeWeight != nullptr) ? (*edgeWeight)[j] : 1.0; nEdges++; } else totalEdgeWeightSelfLinks += (edgeWeight != nullptr) ? (*edgeWeight)[j] : 1; for (; i <= nNodes; i++) firstNeighborIndex.at(i) = nEdges; this->neighbor.resize(nEdges); std::copy(neighbor.begin(), neighbor.begin() + nEdges, this->neighbor.begin()); this->edgeWeight.resize(nEdges); std::copy(edgeWeight2.begin(), edgeWeight2.begin() + nEdges, this->edgeWeight.begin()); if(nodeWeight == nullptr) { this->nodeWeight = getTotalEdgeWeightPerNode(); } else { this->nodeWeight = *nodeWeight; } } double Network::getTotalNodeWeight() { return std::accumulate(nodeWeight.cbegin(), nodeWeight.cend(), 0.0); } DVector Network::getNodeWeights() { return nodeWeight; } IVector Network::getNEdgesPerNode() { IVector nEdgesPerNode(nNodes, 0); for(int i=0; i< nNodes; i++) { nEdgesPerNode.at(i) = firstNeighborIndex.at(i + 1) - firstNeighborIndex.at(i); } return nEdgesPerNode; } std::vector Network::getEdges() { std::vector edge(2); edge[0].resize(nEdges); for(int i=0; i < nNodes; i++) { std::fill(edge[0].begin() + firstNeighborIndex.at(i), edge[0].begin() + firstNeighborIndex.at(i + 1), i); } edge.at(1) = neighbor; return edge; } IVector Network::getEdges(int node) { return IVector(neighbor.begin() + firstNeighborIndex.at(node), neighbor.begin() + firstNeighborIndex.at(node + 1)); } std::vector Network::getEdgesPerNode() { std::vector edgePerNode(nNodes); for (int i = 0; i < nNodes; i++) { edgePerNode[i] = IVector(neighbor.begin() + firstNeighborIndex.at(i), neighbor.begin() + firstNeighborIndex.at(i + 1)); } return edgePerNode; } double Network::getTotalEdgeWeight() { return std::accumulate(edgeWeight.cbegin(), edgeWeight.cend(), 0.0) / 2.0; } double Network::getTotalEdgeWeight(int node) { return std::accumulate(edgeWeight.cbegin() + firstNeighborIndex.at(node), edgeWeight.cbegin() + firstNeighborIndex.at(node + 1), 0.0); } DVector Network::getTotalEdgeWeightPerNode() { DVector totalEdgeWeightPerNode(nNodes, 0.0); for (int i = 0; i < nNodes; i++) { totalEdgeWeightPerNode[i] = getTotalEdgeWeight(i); } return totalEdgeWeightPerNode; } DVector Network::getEdgeWeights(int node) { return DVector(edgeWeight.cbegin() + firstNeighborIndex.at(node), edgeWeight.cbegin() + firstNeighborIndex.at(node+1)); } std::vector Network::getEdgeWeightsPerNode() { std::vector edgeWeightPerNode(nNodes); for (int i = 0; i < nNodes; i++) edgeWeightPerNode[i] = getEdgeWeights(i); return edgeWeightPerNode; } // Skipping unused Network creators // Network createNetworkWithoutNodeWeights() // Network createNetworkWithoutEdgeWeights() // Network createNetworkWithoutNodeAndEdgeWeights() // Network createNormalizedNetwork1() // Network createNormalizedNetwork2() // Network createPrunedNetwork(int nEdges) // Network createPrunedNetwork(int nEdges, Random random) // Network createSubnetwork(int[] node) // Network createSubnetwork(boolean[] nodeInSubnetwork) // Network createSubnetwork(Clustering clustering, int cluster) std::vector Network::createSubnetworks(Clustering clustering) const { std::vector subnetwork(clustering.nClusters); auto nodePerCluster = clustering.getNodesPerCluster(); IVector subnetworkNode(nNodes); IVector subnetworkNeighbor(nEdges); DVector subnetworkEdgeWeight(nEdges); for (int i = 0; i < clustering.nClusters; i++) subnetwork[i] = createSubnetwork(clustering, i, nodePerCluster[i], subnetworkNode, subnetworkNeighbor, subnetworkEdgeWeight); return subnetwork; } // Network createSubnetworkLargestComponent() // Network createReducedNetwork(Clustering clustering) Network Network::createReducedNetwork(const Clustering& clustering) const { Network reducedNetwork; reducedNetwork.nNodes = clustering.nClusters; reducedNetwork.nEdges = 0; reducedNetwork.nodeWeight = DVector(clustering.nClusters); reducedNetwork.firstNeighborIndex = IVector(clustering.nClusters + 1); reducedNetwork.totalEdgeWeightSelfLinks = totalEdgeWeightSelfLinks; IVector reducedNetworkNeighbor1(nEdges); DVector reducedNetworkEdgeWeight1(nEdges); IVector reducedNetworkNeighbor2(clustering.nClusters - 1); DVector reducedNetworkEdgeWeight2(clustering.nClusters); std::vector nodePerCluster = clustering.getNodesPerCluster(); for (int i = 0; i < clustering.nClusters; i++) { int j = 0; for (size_t k = 0; k < nodePerCluster[i].size(); k++) { int l = nodePerCluster[i][k]; reducedNetwork.nodeWeight[i] += nodeWeight[l]; for (int m = firstNeighborIndex[l]; m < firstNeighborIndex[l + 1]; m++) { int n = clustering.cluster[neighbor[m]]; if (n != i) { if (reducedNetworkEdgeWeight2[n] == 0) { reducedNetworkNeighbor2[j] = n; j++; } reducedNetworkEdgeWeight2[n] += edgeWeight[m]; } else reducedNetwork.totalEdgeWeightSelfLinks += edgeWeight[m]; } } for (int k = 0; k < j; k++) { reducedNetworkNeighbor1[reducedNetwork.nEdges + k] = reducedNetworkNeighbor2[k]; reducedNetworkEdgeWeight1[reducedNetwork.nEdges + k] = reducedNetworkEdgeWeight2[reducedNetworkNeighbor2[k]]; reducedNetworkEdgeWeight2[reducedNetworkNeighbor2[k]] = 0; } reducedNetwork.nEdges += j; reducedNetwork.firstNeighborIndex[i + 1] = reducedNetwork.nEdges; } reducedNetwork.neighbor = IVector(reducedNetworkNeighbor1.cbegin(), reducedNetworkNeighbor1.cbegin() + reducedNetwork.nEdges); reducedNetwork.edgeWeight = DVector(reducedNetworkEdgeWeight1.cbegin(), reducedNetworkEdgeWeight1.cbegin() + reducedNetwork.nEdges); return reducedNetwork; } Clustering Network::identifyComponents() { std::vector nodeVisited(nNodes, false); IVector node(nNodes); Clustering clustering(nNodes); clustering.nClusters = 0; for (int i = 0; i < nNodes; i++) if (!nodeVisited[i]) { clustering.cluster[i] = clustering.nClusters; nodeVisited[i] = true; node[0] = i; int j = 1; int k = 0; do { for (int l = firstNeighborIndex[node[k]]; l < firstNeighborIndex[node[k] + 1]; l++) if (!nodeVisited[neighbor[l]]) { clustering.cluster[neighbor[l]] = clustering.nClusters; nodeVisited[neighbor[l]] = true; node[j] = neighbor[l]; j++; } k++; } while (k < j); clustering.nClusters++; } clustering.orderClustersByNNodes(); return clustering; } // private: // double generateRandomNumber(int node1, int node2, const IVector& nodePermutation); Network Network::createSubnetwork(const Clustering& clustering, int cluster, IVector& node, IVector& subnetworkNode, IVector& subnetworkNeighbor, DVector& subnetworkEdgeWeight) const { Network subnetwork; subnetwork.nNodes = node.size(); if (subnetwork.nNodes == 1) { subnetwork.nEdges = 0; subnetwork.nodeWeight = DVector(1, nodeWeight[node[0]]); subnetwork.firstNeighborIndex = IVector(2); subnetwork.neighbor = IVector(0); subnetwork.edgeWeight = DVector(0); } else { for (size_t i = 0; i < node.size(); i++) subnetworkNode[node[i]] = i; subnetwork.nEdges = 0; subnetwork.nodeWeight = DVector(subnetwork.nNodes, 0); subnetwork.firstNeighborIndex = IVector(subnetwork.nNodes + 1); for (int i = 0; i < subnetwork.nNodes; i++) { int j = node[i]; subnetwork.nodeWeight[i] = nodeWeight[j]; for (int k = firstNeighborIndex[j]; k < firstNeighborIndex[j + 1]; k++) if (clustering.cluster[neighbor[k]] == cluster) { subnetworkNeighbor[subnetwork.nEdges] = subnetworkNode[neighbor[k]]; subnetworkEdgeWeight[subnetwork.nEdges] = edgeWeight[k]; subnetwork.nEdges++; } subnetwork.firstNeighborIndex[i + 1] = subnetwork.nEdges; } subnetwork.neighbor = IVector(subnetworkNeighbor.cbegin(), subnetworkNeighbor.cbegin() + subnetwork.nEdges); subnetwork.edgeWeight = DVector(subnetworkEdgeWeight.cbegin(), subnetworkEdgeWeight.cbegin() + subnetwork.nEdges); } subnetwork.totalEdgeWeightSelfLinks = 0; return subnetwork; } VOSClusteringTechnique::VOSClusteringTechnique(std::shared_ptr network, double resolution) : network(network), resolution(resolution) { clustering = std::make_shared(network->getNNodes()); clustering->initSingletonClusters(); }; VOSClusteringTechnique::VOSClusteringTechnique(std::shared_ptr network, std::shared_ptr clustering, double resolution) : network(network), clustering(clustering), resolution(resolution){}; double VOSClusteringTechnique::calcQualityFunction() { double qualityFunction = 0.0; for (int i = 0; i < network->getNNodes(); i++) { int j = clustering->cluster[i]; for (int k = network->getFirstNeighborIndexValue(i); k < network->getFirstNeighborIndexValue(i + 1); k++) if (clustering->cluster[network->getNeighborValue(k)] == j) qualityFunction += network->edgeWeight[k]; } qualityFunction += network->totalEdgeWeightSelfLinks; DVector clusterWeight(clustering->nClusters); for (int i = 0; i < network->nNodes; i++) clusterWeight[clustering->cluster[i]] += network->nodeWeight[i]; for (int i = 0; i < clustering->nClusters; i++) qualityFunction -= clusterWeight[i] * clusterWeight[i] * resolution; qualityFunction /= 2 * network->getTotalEdgeWeight() + network->totalEdgeWeightSelfLinks; return qualityFunction; } bool VOSClusteringTechnique::runLocalMovingAlgorithm(JavaRandom& random){ bool update = false; double maxQualityFunction, qualityFunction; DVector clusterWeight(network->getNNodes(), 0); IVector nNodesPerCluster(network->getNNodes(), 0); int bestCluster, j, k, l, nNeighboringClusters, nStableNodes; if (network->getNNodes() == 1) return false; for (int i = 0; i < network->getNNodes(); i++) { clusterWeight[clustering->cluster[i]] += network->nodeWeight[i]; nNodesPerCluster[clustering->cluster[i]]++; } int nUnusedClusters = 0; IVector unusedCluster(network->getNNodes(), 0); for (int i = 0; i < network->getNNodes(); i++) { if (nNodesPerCluster[i] == 0) { unusedCluster[nUnusedClusters] = i; nUnusedClusters++; } } IVector nodePermutation = Arrays2::generateRandomPermutation(network->nNodes, random); DVector edgeWeightPerCluster(network->getNNodes(), 0.0); IVector neighboringCluster(network->getNNodes() - 1, 0); nStableNodes = 0; int i = 0; do { j = nodePermutation[i]; nNeighboringClusters = 0; for (k = network->firstNeighborIndex.at(j); k < network->firstNeighborIndex.at(j + 1); k++) { l = clustering->cluster[network->neighbor[k]]; if (edgeWeightPerCluster[l] == 0) { neighboringCluster[nNeighboringClusters] = l; nNeighboringClusters++; } edgeWeightPerCluster[l] += network->edgeWeight[k]; } clusterWeight[clustering->cluster[j]] -= network->nodeWeight[j]; nNodesPerCluster[clustering->cluster[j]]--; if (nNodesPerCluster[clustering->cluster[j]] == 0) { unusedCluster[nUnusedClusters] = clustering->cluster[j]; nUnusedClusters++; } bestCluster = -1; maxQualityFunction = 0; for (k = 0; k < nNeighboringClusters; k++) { l = neighboringCluster[k]; qualityFunction = edgeWeightPerCluster[l] - network->nodeWeight[j] * clusterWeight[l] * resolution; if ((qualityFunction > maxQualityFunction) || ((qualityFunction == maxQualityFunction) && (l < bestCluster))) { bestCluster = l; maxQualityFunction = qualityFunction; } edgeWeightPerCluster[l] = 0; } if (maxQualityFunction == 0) { bestCluster = unusedCluster[nUnusedClusters - 1]; nUnusedClusters--; } clusterWeight[bestCluster] += network->nodeWeight[j]; nNodesPerCluster[bestCluster]++; if (bestCluster == clustering->cluster[j]) nStableNodes++; else { clustering->cluster[j] = bestCluster; nStableNodes = 1; update = true; } i = (i < network->nNodes - 1) ? (i + 1) : 0; } while (nStableNodes < network->nNodes); IVector newCluster(network->getNNodes()); clustering->nClusters = 0; for (i = 0; i < network->nNodes; i++) if (nNodesPerCluster[i] > 0) { newCluster[i] = clustering->nClusters; clustering->nClusters++; } for (i = 0; i < network->nNodes; i++) clustering->cluster[i] = newCluster[clustering->cluster[i]]; return update; } bool VOSClusteringTechnique::runLouvainAlgorithm(JavaRandom& random) { if (network->nNodes == 1) return false; bool update = runLocalMovingAlgorithm(random); if (clustering->nClusters < network->nNodes) { VOSClusteringTechnique vosClusteringTechnique(std::make_shared(network->createReducedNetwork(*clustering)), resolution); bool update2 = vosClusteringTechnique.runLouvainAlgorithm(random); if (update2) { update = true; clustering->mergeClusters(*vosClusteringTechnique.clustering); } } return update; } bool VOSClusteringTechnique::runIteratedLouvainAlgorithm(int maxNIterations, JavaRandom& random) { bool update; int i = 0; do { update = runLouvainAlgorithm(random); i++; } while ((i < maxNIterations) && update); return ((i > 1) || update); } bool VOSClusteringTechnique::runLouvainAlgorithmWithMultilevelRefinement(JavaRandom& random) { if (network->nNodes == 1) return false; bool update = runLocalMovingAlgorithm(random); if (clustering->nClusters < network->nNodes) { VOSClusteringTechnique vosClusteringTechnique(std::make_shared(network->createReducedNetwork(*clustering)), resolution); bool update2 = vosClusteringTechnique.runLouvainAlgorithmWithMultilevelRefinement(random); if (update2) { update = true; clustering->mergeClusters(*vosClusteringTechnique.clustering); runLocalMovingAlgorithm(random); } } return update;} bool VOSClusteringTechnique::runIteratedLouvainAlgorithmWithMultilevelRefinement(int maxNIterations, JavaRandom& random) { bool update; int i = 0; do { update = runLouvainAlgorithmWithMultilevelRefinement(random); i++; } while ((i < maxNIterations) && update); return ((i > 1) || update); } bool VOSClusteringTechnique::runSmartLocalMovingAlgorithm(JavaRandom& random) { if (network->nNodes == 1) return false; bool update = runLocalMovingAlgorithm(random); if (clustering->nClusters < network->nNodes) { std::vector subnetwork = network->createSubnetworks(*clustering); auto nodePerCluster = clustering->getNodesPerCluster(); clustering->nClusters = 0; IVector nNodesPerClusterReducedNetwork(subnetwork.size()); for (size_t i = 0; i < subnetwork.size(); i++) { VOSClusteringTechnique vosClusteringTechnique(std::make_shared(subnetwork[i]), resolution); vosClusteringTechnique.runLocalMovingAlgorithm(random); for (int j = 0; j < subnetwork[i].nNodes; j++) clustering->cluster[nodePerCluster[i][j]] = clustering->nClusters + vosClusteringTechnique.clustering->cluster[j]; clustering->nClusters += vosClusteringTechnique.clustering->nClusters; nNodesPerClusterReducedNetwork[i] = vosClusteringTechnique.clustering->nClusters; } VOSClusteringTechnique vosClusteringTechnique2(std::make_shared(network->createReducedNetwork(*clustering)), resolution); int i = 0; for (size_t j = 0; j < nNodesPerClusterReducedNetwork.size(); j++) { for (int k = 0; k < nNodesPerClusterReducedNetwork[j]; k++) { vosClusteringTechnique2.clustering->cluster[i] = static_cast(j); i++; } } vosClusteringTechnique2.clustering->nClusters = nNodesPerClusterReducedNetwork.size(); update |= vosClusteringTechnique2.runSmartLocalMovingAlgorithm(random); clustering->mergeClusters(*vosClusteringTechnique2.clustering); } return update; } bool VOSClusteringTechnique::runIteratedSmartLocalMovingAlgorithm(int nIterations, JavaRandom& random) { bool update = false; for (int i = 0; i < nIterations; i++) update |= runSmartLocalMovingAlgorithm(random); return update; } int VOSClusteringTechnique::removeCluster(int cluster) { DVector clusterWeight(clustering->nClusters); DVector totalEdgeWeightPerCluster(clustering->nClusters); for (int i = 0; i < network->nNodes; i++) { clusterWeight[clustering->cluster[i]] += network->nodeWeight[i]; if (clustering->cluster[i] == cluster) for (int j = network->firstNeighborIndex[i]; j < network->firstNeighborIndex[i + 1]; j++) totalEdgeWeightPerCluster[clustering->cluster[network->neighbor[j]]] += network->edgeWeight[j]; } int i = -1; double maxQualityFunction = 0; for (int j = 0; j < clustering->nClusters; j++) if ((j != cluster) && (clusterWeight[j] > 0)) { double qualityFunction = totalEdgeWeightPerCluster[j] / clusterWeight[j]; if (qualityFunction > maxQualityFunction) { i = j; maxQualityFunction = qualityFunction; } } if (i >= 0) { for (int j = 0; j < network->nNodes; j++) if (clustering->cluster[j] == cluster) clustering->cluster[j] = i; if (cluster == clustering->nClusters - 1) clustering->nClusters = *std::max_element(clustering->cluster.cbegin(), clustering->cluster.cend()) + 1; } return i; } void VOSClusteringTechnique::removeSmallClusters(int minNNodesPerCluster) { VOSClusteringTechnique vosClusteringTechnique(std::make_shared(network->createReducedNetwork(*clustering)), resolution); auto nNodesPerCluster = clustering->getNNodesPerCluster(); int i; do { i = -1; int j = minNNodesPerCluster; for (int k = 0; k < vosClusteringTechnique.clustering->nClusters; k++) if ((nNodesPerCluster[k] > 0) && (nNodesPerCluster[k] < j)) { i = k; j = nNodesPerCluster[k]; } if (i >= 0) { j = vosClusteringTechnique.removeCluster(i); if (j >= 0) nNodesPerCluster[j] += nNodesPerCluster[i]; nNodesPerCluster[i] = 0; } } while (i >= 0); clustering->mergeClusters(*vosClusteringTechnique.clustering); } std::shared_ptr ModularityOptimizer::matrixToNetwork(IVector& node1, IVector& node2, DVector& edgeWeight1, int modularityFunction, int nNodes) { int n1_max = *std::max_element(node1.cbegin(), node1.cend()); int n2_max = *std::max_element(node2.cbegin(), node2.cend()); IVector nNeighbors(nNodes); for (size_t i = 0; i < node1.size(); i++) if (node1[i] < node2[i]) { nNeighbors[node1[i]]++; nNeighbors[node2[i]]++; } IVector firstNeighborIndex(nNodes + 1); int nEdges = 0; for (int i = 0; i < nNodes; i++) { firstNeighborIndex[i] = nEdges; nEdges += nNeighbors[i]; } firstNeighborIndex[nNodes] = nEdges; IVector neighbor(nEdges); DVector edgeWeight2(nEdges); std::fill(nNeighbors.begin(), nNeighbors.end(), 0); for (size_t i = 0; i < node1.size(); i++) if (node1[i] < node2[i]) { int j = firstNeighborIndex[node1[i]] + nNeighbors[node1[i]]; neighbor[j] = node2[i]; edgeWeight2[j] = edgeWeight1[i]; nNeighbors[node1[i]]++; j = firstNeighborIndex[node2[i]] + nNeighbors[node2[i]]; neighbor[j] = node1[i]; edgeWeight2[j] = edgeWeight1[i]; nNeighbors[node2[i]]++; } if (modularityFunction == 1) return std::make_shared(nNodes, firstNeighborIndex, neighbor, &edgeWeight2); else { DVector nodeWeight(nNodes, 1.0); return std::make_shared(nNodes, &nodeWeight, firstNeighborIndex, neighbor, &edgeWeight2); } } std::shared_ptr ModularityOptimizer::readInputFile(std::string fname, int modularityFunction) { std::ifstream f; f.open(fname, std::ios::in); if(!f) { throw std::runtime_error("File could not be opened."); } std::string line; int nLines = 0; while(std::getline(f, line)) { nLines++; } f.clear(); f.seekg(0, std::ios::beg); IVector node1(nLines); IVector node2(nLines); DVector edgeWeight1(nLines, 1.0); for (int j = 0; j < nLines; j++) { std::getline(f, line); auto splittedLine = split(line, '\t'); node1[j] =std::stoi(splittedLine[0]); node2[j] = std::stoi(splittedLine[1]); if(splittedLine.size() > 2) { edgeWeight1[j] = std::stod(splittedLine[2]); } } int n1_max = *std::max_element(node1.cbegin(), node1.cend()); int n2_max = *std::max_element(node2.cbegin(), node2.cend()); int nNodes = std::max(n1_max, n2_max) + 1; return matrixToNetwork(node1, node2, edgeWeight1, modularityFunction, nNodes); } std::vector ModularityOptimizer::split(const std::string& s, char delimiter) { std::vector tokens; std::string token; std::istringstream tokenStream(s); while (std::getline(tokenStream, token, delimiter)) { tokens.push_back(token); } return tokens; } #ifdef STANDALONE void writeOutputFile(std::string fname, Clustering& clustering) { int nNodes = clustering.getNNodes(); clustering.orderClustersByNNodes(); std::ofstream f(fname, std::ios::out); for(int i=0; i < nNodes; i++) f << clustering.getCluster(i) << std::endl; f.close(); } template void input(std::string msg, T& value) { std::cout << msg << std::endl << std::endl; std::cin >> value; } int main(int argc, char* argv[]) { std::string msg = "Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck"; std::vector args; std::string inputFileName, outputFileName; bool printOutput, update; double modularity, maxModularity, resolution, resolution2; int algorithm, i, j, modularityFunction, nIterations, nRandomStarts; unsigned long long int randomSeed; for(int i=0; i 0); if (printOutput) { std::cout << msg << std::endl << std::endl; } } else { std::cout << msg << std::endl << std::endl; input("Input file name: ", inputFileName); input("Output file name: ", outputFileName); input("Modularity function (1 = standard; 2 = alternative): ", modularityFunction); input("Resolution parameter (e.g., 1.0): ", resolution); input("Algorithm (1 = Louvain; 2 = Louvain with multilevel refinement; 3 = smart local moving): ", algorithm); input("Number of random starts (e.g., 10): ", nRandomStarts); input("Number of iterations (e.g., 10): ",nIterations); input("Random seed (e.g., 0): ", randomSeed); int tmp; input("Print output (0 = no; 1 = yes): ",tmp); printOutput = tmp > 0; std::cout << std::endl; } if (printOutput) { std::cout << "Reading input file..." << std::endl << std::endl; } std::shared_ptr network = readInputFile(inputFileName, modularityFunction); if (printOutput) { std::printf("Number of nodes: %d\n", network->getNNodes()); std::printf("Number of edges: %d\n", network->getNEdges()); std::cout << std::endl; std::cout << "Running " << ((algorithm == 1) ? "Louvain algorithm" : ((algorithm == 2) ? "Louvain algorithm with multilevel refinement" : "smart local moving algorithm")) << "..."; std::cout << std::endl; } resolution2 = ((modularityFunction == 1) ? (resolution / (2 * network->getTotalEdgeWeight() + network->getTotalEdgeWeightSelfLinks())) : resolution); auto beginTime = duration_cast(system_clock::now().time_since_epoch()); std::shared_ptr clustering; maxModularity = -std::numeric_limits::infinity(); JavaRandom random(randomSeed); for (i = 0; i < nRandomStarts; i++) { if (printOutput && (nRandomStarts > 1)) std::printf("Random start: %d\n", i + 1); VOSClusteringTechnique vosClusteringTechnique(network, resolution2); j = 0; update = true; do { if (printOutput && (nIterations > 1)) std::printf("Iteration: %d\n", j + 1); if (algorithm == 1) update = vosClusteringTechnique.runLouvainAlgorithm(random); else if (algorithm == 2) update = vosClusteringTechnique.runLouvainAlgorithmWithMultilevelRefinement(random); else if (algorithm == 3) vosClusteringTechnique.runSmartLocalMovingAlgorithm(random); j++; modularity = vosClusteringTechnique.calcQualityFunction(); if (printOutput && (nIterations > 1)) std::printf("Modularity: %.4f\n", modularity); } while ((j < nIterations) && update); if (modularity > maxModularity) { clustering = vosClusteringTechnique.getClustering(); maxModularity = modularity; } if (printOutput && (nRandomStarts > 1)) { if (nIterations == 1) std::printf("Modularity: %.4f\n", modularity); std::cout << std::endl; } } auto endTime = duration_cast(system_clock::now().time_since_epoch()); if (printOutput) { if (nRandomStarts == 1) { if (nIterations > 1) std::cout << std::endl; std::printf("Modularity: %.4f\n", maxModularity); } else std::printf("Maximum modularity in %d random starts: %.4f\n", nRandomStarts, maxModularity); std::printf("Number of communities: %d\n", clustering->getNClusters()); std::printf("Elapsed time: %d seconds\n", static_cast((endTime - beginTime).count() / 1000.0)); std::cout << std::endl << "Writing output file..." << std::endl; } writeOutputFile(outputFileName, *clustering); } catch (std::exception a) { std::cout << a.what() << std::endl; } return 0; }; #endif Seurat/src/valid_pointer.c0000644000176200001440000000024715056057544015325 0ustar liggesusers#include // helper to determine if external c++ pointer is valid SEXP isnull(SEXP pointer) { return Rf_ScalarLogical(!R_ExternalPtrAddr(pointer)); } Seurat/src/Makevars0000644000176200001440000000002015056057544014003 0ustar liggesusersCXX_STD = CXX17 Seurat/src/snn.cpp0000644000176200001440000001032615056057544013623 0ustar liggesusers#include #include "data_manipulation.h" #include #include #include #include #include #include using namespace Rcpp; // [[Rcpp::depends(RcppEigen)]] // [[Rcpp::depends(RcppProgress)]] typedef Eigen::Triplet T; // [[Rcpp::export(rng = false)]] Eigen::SparseMatrix ComputeSNN(Eigen::MatrixXd nn_ranked, double prune) { std::vector tripletList; int k = nn_ranked.cols(); tripletList.reserve(nn_ranked.rows() * nn_ranked.cols()); for(int j=0; j SNN(nn_ranked.rows(), nn_ranked.rows()); SNN.setFromTriplets(tripletList.begin(), tripletList.end()); SNN = SNN * (SNN.transpose()); for (int i=0; i < SNN.outerSize(); ++i){ for (Eigen::SparseMatrix::InnerIterator it(SNN, i); it; ++it){ it.valueRef() = it.value()/(k + (k - it.value())); if(it.value() < prune){ it.valueRef() = 0; } } } SNN.prune(0.0); // actually remove pruned values return SNN; } // [[Rcpp::export(rng = false)]] void WriteEdgeFile(Eigen::SparseMatrix snn, String filename, bool display_progress){ if (display_progress == true) { Rcpp::Rcerr << "Writing SNN as edge file" << std::endl; } // Write out lower triangle std::ofstream output; output.open(filename); Progress p(snn.outerSize(), display_progress); for (int k=0; k < snn.outerSize(); ++k){ p.increment(); for (Eigen::SparseMatrix::InnerIterator it(snn, k); it; ++it){ if(it.col() >= it.row()){ continue; } output << std::setprecision(15) << it.col() << "\t" << it.row() << "\t" << it.value() << "\n"; } } output.close(); } // Wrapper function so that we don't have to go back into R before writing to file // [[Rcpp::export(rng = false)]] Eigen::SparseMatrix DirectSNNToFile(Eigen::MatrixXd nn_ranked, double prune, bool display_progress, String filename) { Eigen::SparseMatrix SNN = ComputeSNN(nn_ranked, prune); WriteEdgeFile(SNN, filename, display_progress); return SNN; } template std::vector sort_indexes(const std::vector &v) { // initialize original index locations std::vector idx(v.size()); std::iota(idx.begin(), idx.end(), 0); std::stable_sort(idx.begin(), idx.end(), [&v](size_t i1, size_t i2) {return v[i1] < v[i2];}); return idx; } // [[Rcpp::export]] std::vector SNN_SmallestNonzero_Dist( Eigen::SparseMatrix snn, Eigen::MatrixXd mat, int n, std::vector nearest_dist ) { std::vector results; for (int i=0; i < snn.outerSize(); ++i){ // create vectors to store the nonzero snn elements and their indices std::vector nonzero; std::vector nonzero_idx; for (Eigen::SparseMatrix::InnerIterator it(snn, i); it; ++it) { nonzero.push_back(it.value()); nonzero_idx.push_back(it.row()); } std::vector nonzero_order = sort_indexes(nonzero); int n_i = n; if (n_i > nonzero_order.size()) n_i = nonzero_order.size(); std::vector dists; for (int j = 0; j < nonzero_order.size(); ++j) { // compute euclidean distances to cells with small edge weights // if multiple entries have same value as nth element, calc dist to all size_t cell = nonzero_idx[nonzero_order[j]]; if(dists.size() < n_i || nonzero[nonzero_order[j]] == nonzero[nonzero_order[n_i-1]]) { double res = (mat.row(cell) - mat.row(i)).norm(); if (nearest_dist[i] > 0) { res = res - nearest_dist[i]; if (res < 0) res = 0; } dists.push_back(res); } else { break; } } double avg_dist; if (dists.size() > n_i) { std::sort(dists.rbegin(), dists.rend()); avg_dist = std::accumulate(dists.begin(), dists.begin() + n_i, 0.0) / n_i; } else { avg_dist = std::accumulate(dists.begin(), dists.end(), 0.0) / dists.size(); } results.push_back(avg_dist); } return results; } Seurat/src/data_manipulation.cpp0000644000176200001440000003600315056057544016516 0ustar liggesusers#include #include #include #include #include #include #include using namespace Rcpp; // [[Rcpp::depends(RcppEigen)]] // [[Rcpp::depends(RcppProgress)]] // [[Rcpp::export]] Eigen::SparseMatrix RunUMISampling(Eigen::SparseMatrix data, int sample_val, bool upsample = false, bool display_progress=true){ Progress p(data.outerSize(), display_progress); Eigen::VectorXd colSums = data.transpose() * Eigen::VectorXd::Ones(data.rows()); for (int k=0; k < data.outerSize(); ++k){ p.increment(); for (Eigen::SparseMatrix::InnerIterator it(data, k); it; ++it){ double entry = it.value(); if( (upsample) || (colSums[k] > sample_val)){ entry = entry * double(sample_val) / colSums[k]; if (fmod(entry, 1) != 0){ double rn = R::runif(0,1); if(fmod(entry, 1) <= rn){ it.valueRef() = floor(entry); } else{ it.valueRef() = ceil(entry); } } else{ it.valueRef() = entry; } } } } return(data); } // [[Rcpp::export]] Eigen::SparseMatrix RunUMISamplingPerCell(Eigen::SparseMatrix data, NumericVector sample_val, bool upsample = false, bool display_progress=true){ Progress p(data.outerSize(), display_progress); Eigen::VectorXd colSums = data.transpose() * Eigen::VectorXd::Ones(data.rows()); for (int k=0; k < data.outerSize(); ++k){ p.increment(); for (Eigen::SparseMatrix::InnerIterator it(data, k); it; ++it){ double entry = it.value(); if( (upsample) || (colSums[k] > sample_val[k])){ entry = entry * double(sample_val[k]) / colSums[k]; if (fmod(entry, 1) != 0){ double rn = R::runif(0,1); if(fmod(entry, 1) <= rn){ it.valueRef() = floor(entry); } else{ it.valueRef() = ceil(entry); } } else{ it.valueRef() = entry; } } } } return(data); } typedef Eigen::Triplet T; // [[Rcpp::export(rng = false)]] Eigen::SparseMatrix RowMergeMatrices(Eigen::SparseMatrix mat1, Eigen::SparseMatrix mat2, std::vector< std::string > mat1_rownames, std::vector< std::string > mat2_rownames, std::vector< std::string > all_rownames){ // Set up hash maps for rowname based lookup std::unordered_map mat1_map; for(unsigned int i = 0; i < mat1_rownames.size(); i++){ mat1_map[mat1_rownames[i]] = i; } std::unordered_map mat2_map; for(unsigned int i = 0; i < mat2_rownames.size(); i++){ mat2_map[mat2_rownames[i]] = i; } // set up tripletList for new matrix creation std::vector tripletList; int num_rows = all_rownames.size(); int num_col1 = mat1.cols(); int num_col2 = mat2.cols(); tripletList.reserve(mat1.nonZeros() + mat2.nonZeros()); for(int i = 0; i < num_rows; i++){ std::string key = all_rownames[i]; if (mat1_map.count(key)){ for(Eigen::SparseMatrix::InnerIterator it1(mat1, mat1_map[key]); it1; ++it1){ tripletList.emplace_back(i, it1.col(), it1.value()); } } if (mat2_map.count(key)){ for(Eigen::SparseMatrix::InnerIterator it2(mat2, mat2_map[key]); it2; ++it2){ tripletList.emplace_back(i, num_col1 + it2.col(), it2.value()); } } } Eigen::SparseMatrix combined_mat(num_rows, num_col1 + num_col2); combined_mat.setFromTriplets(tripletList.begin(), tripletList.end()); return combined_mat; } // [[Rcpp::export(rng = false)]] Eigen::SparseMatrix LogNorm(Eigen::SparseMatrix data, int scale_factor, bool display_progress = true){ Progress p(data.outerSize(), display_progress); Eigen::VectorXd colSums = data.transpose() * Eigen::VectorXd::Ones(data.rows()); for (int k=0; k < data.outerSize(); ++k){ p.increment(); for (Eigen::SparseMatrix::InnerIterator it(data, k); it; ++it){ it.valueRef() = log1p(double(it.value()) / colSums[k] * scale_factor); } } return data; } /* Performs column scaling and/or centering. Equivalent to using scale(mat, TRUE, apply(x,2,sd)) in R. Note: Doesn't handle NA/NaNs in the same way the R implementation does, */ // [[Rcpp::export(rng = false)]] NumericMatrix Standardize(Eigen::Map mat, bool display_progress = true){ Progress p(mat.cols(), display_progress); NumericMatrix std_mat(mat.rows(), mat.cols()); for(int i=0; i < mat.cols(); ++i){ p.increment(); Eigen::ArrayXd r = mat.col(i).array(); double colMean = r.mean(); double colSdev = sqrt((r - colMean).square().sum() / (mat.rows() - 1)); NumericMatrix::Column new_col = std_mat(_, i); for(int j=0; j < new_col.size(); j++) { new_col[j] = (r[j] - colMean) / colSdev; } } return std_mat; } // [[Rcpp::export(rng = false)]] Eigen::MatrixXd FastSparseRowScale(Eigen::SparseMatrix mat, bool scale = true, bool center = true, double scale_max = 10, bool display_progress = true){ mat = mat.transpose(); Progress p(mat.outerSize(), display_progress); Eigen::MatrixXd scaled_mat(mat.rows(), mat.cols()); for (int k=0; k::InnerIterator it(mat,k); it; ++it) { colMean += it.value(); } colMean = colMean / mat.rows(); if (scale == true){ int nnZero = 0; if(center == true){ for (Eigen::SparseMatrix::InnerIterator it(mat,k); it; ++it) { nnZero += 1; colSdev += pow((it.value() - colMean), 2); } colSdev += pow(colMean, 2) * (mat.rows() - nnZero); } else{ for (Eigen::SparseMatrix::InnerIterator it(mat,k); it; ++it) { colSdev += pow(it.value(), 2); } } colSdev = sqrt(colSdev / (mat.rows() - 1)); } else{ colSdev = 1; } if(center == false){ colMean = 0; } Eigen::VectorXd col = Eigen::VectorXd(mat.col(k)); scaled_mat.col(k) = (col.array() - colMean) / colSdev; for(int s=0; s scale_max){ scaled_mat(s,k) = scale_max; } } } return scaled_mat.transpose(); } // [[Rcpp::export(rng = false)]] Eigen::MatrixXd FastSparseRowScaleWithKnownStats(Eigen::SparseMatrix mat, NumericVector mu, NumericVector sigma, bool scale = true, bool center = true, double scale_max = 10, bool display_progress = true){ mat = mat.transpose(); Progress p(mat.outerSize(), display_progress); Eigen::MatrixXd scaled_mat(mat.rows(), mat.cols()); for (int k=0; k scale_max){ scaled_mat(s,k) = scale_max; } } } return scaled_mat.transpose(); } /* Note: May not handle NA/NaNs in the same way the R implementation does, */ // [[Rcpp::export(rng = false)]] Eigen::MatrixXd FastCov(Eigen::MatrixXd mat, bool center = true){ if (center) { mat = mat.rowwise() - mat.colwise().mean(); } Eigen::MatrixXd cov = (mat.adjoint() * mat) / double(mat.rows() - 1); return(cov); } // [[Rcpp::export(rng = false)]] Eigen::MatrixXd FastCovMats(Eigen::MatrixXd mat1, Eigen::MatrixXd mat2, bool center = true){ if(center){ mat1 = mat1.rowwise() - mat1.colwise().mean(); mat2 = mat2.rowwise() - mat2.colwise().mean(); } Eigen::MatrixXd cov = (mat1.adjoint() * mat2) / double(mat1.rows() - 1); return(cov); } /* Note: Faster than the R implementation but is not in-place */ // [[Rcpp::export(rng = false)]] Eigen::MatrixXd FastRBind(Eigen::MatrixXd mat1, Eigen::MatrixXd mat2){ Eigen::MatrixXd mat3(mat1.rows() + mat2.rows(), mat1.cols()); mat3 << mat1, mat2; return(mat3); } /* Calculates the row means of the logged values in non-log space */ // [[Rcpp::export(rng = false)]] Eigen::VectorXd FastExpMean(Eigen::SparseMatrix mat, bool display_progress){ int ncols = mat.cols(); Eigen::VectorXd rowmeans(mat.rows()); mat = mat.transpose(); if(display_progress == true){ Rcpp::Rcerr << "Calculating gene means" << std::endl; } Progress p(mat.outerSize(), display_progress); for (int k=0; k::InnerIterator it(mat,k); it; ++it){ rm += expm1(it.value()); } rm = rm / ncols; rowmeans[k] = log1p(rm); } return(rowmeans); } /* use this if you know the row means */ // [[Rcpp::export(rng = false)]] NumericVector SparseRowVar2(Eigen::SparseMatrix mat, NumericVector mu, bool display_progress){ mat = mat.transpose(); if(display_progress == true){ Rcpp::Rcerr << "Calculating gene variances" << std::endl; } Progress p(mat.outerSize(), display_progress); NumericVector allVars = no_init(mat.cols()); for (int k=0; k::InnerIterator it(mat,k); it; ++it) { nZero -= 1; colSum += pow(it.value() - mu[k], 2); } colSum += pow(mu[k], 2) * nZero; allVars[k] = colSum / (mat.rows() - 1); } return(allVars); } /* standardize matrix rows using given mean and standard deviation, clip values larger than vmax to vmax, then return variance for each row */ // [[Rcpp::export(rng = false)]] NumericVector SparseRowVarStd(Eigen::SparseMatrix mat, NumericVector mu, NumericVector sd, double vmax, bool display_progress){ if(display_progress == true){ Rcpp::Rcerr << "Calculating feature variances of standardized and clipped values" << std::endl; } mat = mat.transpose(); NumericVector allVars(mat.cols()); Progress p(mat.outerSize(), display_progress); for (int k=0; k::InnerIterator it(mat,k); it; ++it) { nZero -= 1; colSum += pow(std::min(vmax, (it.value() - mu[k]) / sd[k]), 2); } colSum += pow((0 - mu[k]) / sd[k], 2) * nZero; allVars[k] = colSum / (mat.rows() - 1); } return(allVars); } /* Calculate the variance to mean ratio (VMR) in non-logspace (return answer in log-space) */ // [[Rcpp::export(rng = false)]] Eigen::VectorXd FastLogVMR(Eigen::SparseMatrix mat, bool display_progress){ int ncols = mat.cols(); Eigen::VectorXd rowdisp(mat.rows()); mat = mat.transpose(); if(display_progress == true){ Rcpp::Rcerr << "Calculating gene variance to mean ratios" << std::endl; } Progress p(mat.outerSize(), display_progress); for (int k=0; k::InnerIterator it(mat,k); it; ++it){ rm += expm1(it.value()); } rm = rm / ncols; for (Eigen::SparseMatrix::InnerIterator it(mat,k); it; ++it){ v += pow(expm1(it.value()) - rm, 2); nnZero += 1; } v = (v + (ncols - nnZero) * pow(rm, 2)) / (ncols - 1); rowdisp[k] = log(v/rm); } return(rowdisp); } /* Calculates the variance of rows of a matrix */ // [[Rcpp::export(rng = false)]] NumericVector RowVar(Eigen::Map x){ NumericVector out(x.rows()); for(int i=0; i < x.rows(); ++i){ Eigen::ArrayXd r = x.row(i).array(); double rowMean = r.mean(); out[i] = (r - rowMean).square().sum() / (x.cols() - 1); } return out; } /* Calculate the variance in non-logspace (return answer in non-logspace) */ // [[Rcpp::export(rng = false)]] Eigen::VectorXd SparseRowVar(Eigen::SparseMatrix mat, bool display_progress){ int ncols = mat.cols(); Eigen::VectorXd rowdisp(mat.rows()); mat = mat.transpose(); if(display_progress == true){ Rcpp::Rcerr << "Calculating gene variances" << std::endl; } Progress p(mat.outerSize(), display_progress); for (int k=0; k::InnerIterator it(mat,k); it; ++it){ rm += (it.value()); } rm = rm / ncols; for (Eigen::SparseMatrix::InnerIterator it(mat,k); it; ++it){ v += pow((it.value()) - rm, 2); nnZero += 1; } v = (v + (ncols - nnZero) * pow(rm, 2)) / (ncols - 1); rowdisp[k] = v; } return(rowdisp); } //cols_idx should be 0-indexed // [[Rcpp::export(rng = false)]] Eigen::SparseMatrix ReplaceColsC(Eigen::SparseMatrix mat, NumericVector col_idx, Eigen::SparseMatrix replacement){ int rep_idx = 0; for(auto const &ci : col_idx){ mat.col(ci) = replacement.col(rep_idx); rep_idx += 1; } return(mat); } template std::vector sort_indexes(const std::vector &v) { // initialize original index locations std::vector idx(v.size()); std::iota(idx.begin(), idx.end(), 0); std::stable_sort(idx.begin(), idx.end(), [&v](size_t i1, size_t i2) {return v[i1] < v[i2];}); return idx; } // [[Rcpp::export(rng = false)]] List GraphToNeighborHelper(Eigen::SparseMatrix mat) { mat = mat.transpose(); //determine the number of neighbors int n = 0; for(Eigen::SparseMatrix::InnerIterator it(mat, 0); it; ++it) { n += 1; } Eigen::MatrixXd nn_idx(mat.rows(), n); Eigen::MatrixXd nn_dist(mat.rows(), n); for (int k=0; k row_idx; std::vector row_dist; row_idx.reserve(n); row_dist.reserve(n); for (Eigen::SparseMatrix::InnerIterator it(mat,k); it; ++it) { if (n_k > (n-1)) { Rcpp::stop("Not all cells have an equal number of neighbors."); } row_idx.push_back(it.row() + 1); row_dist.push_back(it.value()); n_k += 1; } if (n_k != n) { Rcpp::Rcout << n << ":::" << n_k << std::endl; Rcpp::stop("Not all cells have an equal number of neighbors."); } //order the idx based on dist std::vector idx_order = sort_indexes(row_dist); for(int i = 0; i < n; ++i) { nn_idx(k, i) = row_idx[idx_order[i]]; nn_dist(k, i) = row_dist[idx_order[i]]; } } List neighbors = List::create(nn_idx, nn_dist); return(neighbors); } Seurat/src/snn.h0000644000176200001440000000117215056057544013267 0ustar liggesusers#ifndef SNN #define SNN #include #include "data_manipulation.h" #include #include #include #include #include #include using namespace Rcpp; //---------------------------------------------------- Eigen::SparseMatrix ComputeSNN(Eigen::MatrixXd nn_ranked); void WriteEdgeFile(Eigen::SparseMatrix snn, String filename, bool display_progress); Eigen::SparseMatrix DirectSNNToFile(Eigen::MatrixXd nn_ranked, double prune, bool display_progress, String filename); //---------------------------------------------------- #endif//SNN Seurat/src/stats.cpp0000644000176200001440000000227715056057544014171 0ustar liggesusers#include using namespace Rcpp; // the following code in-parts taken from sparseMatrixStats (http://www.bioconductor.org/packages/release/bioc/html/sparseMatrixStats.html). // [[Rcpp::export]] NumericVector row_sum_dgcmatrix(NumericVector &x, IntegerVector &i, int rows, int cols) { NumericVector rowsum(rows, 0.0); int x_length = x.length(); for (int k=0; k #include #include #include #include #include #include #include #include #include #include "ModularityOptimizer.h" using namespace ModularityOptimizer; using namespace std::chrono; using namespace Rcpp; // [[Rcpp::depends(RcppEigen)]] // [[Rcpp::depends(RcppProgress)]] // [[Rcpp::export]] IntegerVector RunModularityClusteringCpp(Eigen::SparseMatrix SNN, int modularityFunction, double resolution, int algorithm, int nRandomStarts, int nIterations, int randomSeed, bool printOutput, std::string edgefilename) { // validate arguments if(modularityFunction != 1 && modularityFunction != 2) stop("Modularity parameter must be equal to 1 or 2."); if(algorithm != 1 && algorithm !=2 && algorithm !=3 && algorithm !=4) stop("Algorithm for modularity optimization must be 1, 2, 3, or 4"); if(nRandomStarts < 1) stop("Have to have at least one start"); if(nIterations < 1) stop("Need at least one interation"); if (modularityFunction == 2 && resolution > 1.0) stop("error: resolution<1 for alternative modularity"); try { bool update; double modularity, maxModularity, resolution2; int i, j; std::string msg = "Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck"; if (printOutput) Rcout << msg << std::endl << std::endl; // Load netwrok std::shared_ptr network; if(edgefilename != "") { if (printOutput) Rcout << "Reading input file..." << std::endl << std::endl; try{ network = readInputFile(edgefilename, modularityFunction); } catch(...) { stop("Could not parse edge file."); } } else { // Load lower triangle int network_size = (SNN.nonZeros() / 2) + 3; IVector node1; IVector node2; DVector edgeweights; node1.reserve(network_size); node2.reserve(network_size); edgeweights.reserve(network_size); for (int k=0; k < SNN.outerSize(); ++k){ for (Eigen::SparseMatrix::InnerIterator it(SNN, k); it; ++it){ if(it.col() >= it.row()){ continue; } node1.emplace_back(it.col()); node2.emplace_back(it.row()); edgeweights.emplace_back(it.value()); } } if(node1.size() == 0) { stop("Matrix contained no network data. Check format."); } int nNodes = std::max(SNN.cols(), SNN.rows()); network = matrixToNetwork(node1, node2, edgeweights, modularityFunction, nNodes); Rcpp::checkUserInterrupt(); } if (printOutput) { Rprintf("Number of nodes: %d\n", network->getNNodes()); Rprintf("Number of edges: %d\n", network->getNEdges()); Rcout << std::endl; Rcout << "Running " << ((algorithm == 1) ? "Louvain algorithm" : ((algorithm == 2) ? "Louvain algorithm with multilevel refinement" : "smart local moving algorithm")) << "..."; Rcout << std::endl; } resolution2 = ((modularityFunction == 1) ? (resolution / (2 * network->getTotalEdgeWeight() + network->getTotalEdgeWeightSelfLinks())) : resolution); auto beginTime = duration_cast(system_clock::now().time_since_epoch()); std::shared_ptr clustering; maxModularity = -std::numeric_limits::infinity(); JavaRandom random(randomSeed); Progress p(nRandomStarts, printOutput); for (i = 0; i < nRandomStarts; i++) { //if (printOutput && (nRandomStarts > 1)) //Rprintf("Random start: %d\n", i + 1); VOSClusteringTechnique vosClusteringTechnique(network, resolution2); j = 0; update = true; do { /*if (printOutput && (nIterations > 1)) Rprintf("Iteration: %d\n", j + 1); */ if (algorithm == 1) update = vosClusteringTechnique.runLouvainAlgorithm(random); else if (algorithm == 2) update = vosClusteringTechnique.runLouvainAlgorithmWithMultilevelRefinement(random); else if (algorithm == 3) vosClusteringTechnique.runSmartLocalMovingAlgorithm(random); j++; modularity = vosClusteringTechnique.calcQualityFunction(); //if (printOutput && (nIterations > 1)) // Rprintf("Modularity: %.4f\n", modularity); Rcpp::checkUserInterrupt(); } while ((j < nIterations) && update); if (modularity > maxModularity) { clustering = vosClusteringTechnique.getClustering(); maxModularity = modularity; } /*if (printOutput && (nRandomStarts > 1)) { if (nIterations == 1) Rprintf("Modularity: %.4f\n", modularity); Rcout << std::endl; }*/ p.increment(); } auto endTime = duration_cast(system_clock::now().time_since_epoch()); if(clustering == nullptr) { stop("Clustering step failed."); } if (printOutput) { if (nRandomStarts == 1) { if (nIterations > 1) Rcout << std::endl; Rprintf("Modularity: %.4f\n", maxModularity); } else Rprintf("Maximum modularity in %d random starts: %.4f\n", nRandomStarts, maxModularity); Rprintf("Number of communities: %d\n", clustering->getNClusters()); Rprintf("Elapsed time: %d seconds\n", static_cast((endTime - beginTime).count() / 1000.0)); } // Return results clustering->orderClustersByNNodes(); IntegerVector iv(clustering->cluster.cbegin(), clustering->cluster.cend()); return iv; } catch(std::exception &ex) { forward_exception_to_r(ex); } catch(...) { ::Rf_error("c++ exception (unknown reason)"); } return IntegerVector(1); } Seurat/src/fast_NN_dist.cpp0000644000176200001440000000400415056057544015374 0ustar liggesusers#include using namespace Rcpp; // code in-parts taken from https://gallery.rcpp.org/articles/parallel-distance-matrix/ // Assumption: the end position of vector2 is implied by the end position of vector1 // generic function for euclidean distance template inline double euclidean_distance(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2) { // value to return double rval = 0; // set iterators to beginning of ranges InputIterator1 it1 = begin1; InputIterator2 it2 = begin2; // for each input item while (it1 != end1) { // take the value and increment the iterator double d1 = *it1++; double d2 = *it2++; // update the distance rval += pow(d1-d2, 2); } return sqrt(rval); } // [[Rcpp::export]] List fast_dist(NumericMatrix x, NumericMatrix y, List n) { // extracting the number of element in the knn graph size_t ngraph_size = n.size(); if (x.nrow() != ngraph_size) { return List(); } List distances_list = clone(n); // looping over the neigbors for (size_t i=0; i= 5.0.0 ([#9625](https://github.com/satijalab/seurat/pull/9625)) # Seurat 5.2.1 (2025-01-23) ## Changes - Fixed `test_find_clusters.R` to accommodate variability in label assignments given by `FindClusters` across different systems ([#9641](https://github.com/satijalab/seurat/pull/9641)) # Seurat 5.2.0 (2024-12-20) ## Changes - Added `group.by` parameter to `FindAllMarkers`, allowing users to regroup their data using a non-default identity class prior to performing differential expression ([#9550](https://github.com/satijalab/seurat/pull/9550)) - Added `image.type` parameter to `Read10X_Image` enabling `VisiumV1` instances to be populated instead of instances of the default `VisiumV2` class ([#9556](https://github.com/satijalab/seurat/pull/9556)) - Fixed `IntegrateLayers` to respect the `dims.to.integrate` parameter - Added `stroke.size` parameter to `DimPlot` ([#8180](https://github.com/satijalab/seurat/pull/8180)) - Updated `RunLeiden` to use the `leidenbase` package instead of `leiden`; deprecated the `method` parameter for `RunLeiden` and `FindClusters`; updated `RunLeiden` to reset `random.seed` to 1 if the value is 0 or less ([#6792](https://github.com/satijalab/seurat/pull/6792)) - Updated `RunPCA` to use the `BPCells`-provided SVD solver on `BPCells` matrices; updated `JackStraw` to support `BPCells` matrices ([#8271](https://github.com/satijalab/seurat/pull/8271)) - Fixed `RunPCA` to avoid converting `BPCells` matrices into dense matrices - significantly reduces the function's memory usage when running on `BPCells` matrices ([#8966](https://github.com/satijalab/seurat/pull/8966)) - Updated `RunSLSI` to support `BPCells` matrices - Fixed `DietSeurat` so that the `layers` parameter is respected ([#8197](https://github.com/satijalab/seurat/pull/8197)) - Updated `RunUMAP` to support `umap-learn` version >= 0.5.0 ([#9559](https://github.com/satijalab/seurat/pull/9559)) - Updated `LoadXenium` and `ReadXenium` to accommodate the output from `XOA` v3.0; updated `LoadXenium` to provide more fine-grained control over the datatypes parsed in, including nucleus segmentation masks, segmentation methods, and other experimental metadata; updated `ReadXenium` to load cell_feature_matrix.h5 when present in favor of the MEX format files; updated `ReadXenium` to load .parquet files using `arrow` instead of .csv.gz files to support XOA 3.0 ([#8604](https://github.com/satijalab/seurat/pull/8605)) - Fixed `LoadXenium` to accommodate datasets without "Blank Codeword" or "Unassigned Codeword" matrices([#9135](https://github.com/satijalab/seurat/pull/9135)) - Fixed `ReadXenium` to properly parse multiple molecular outputs at once ([#8265](https://github.com/satijalab/seurat/issues/8265)) - Added `features` parameter to `LeverageScore` and `SketchData` - Updated `SketchData`'s `ncells` parameter to accept integer vector # Seurat 5.1.0 (2024-05-08) ## Changes - Updated interactive `SpatialDimPlot`s to display spatial coordinates - Updated `BuildClusterTree` to `PseudobulkExpression(..., method = "aggregate")` instead of `AverageExpression` - Fixed `SpatialPlot` to properly handle images with shared cells - Added `cluster.name` parameter to `BuildNicheAssay` - Added `VisiumV2` class, inherits `SeuratObject::FOV`, returned by `Load10X_Spatial` - Updated `Load10X_Spatial` to support loading Visium HD datasets - added `bin.size` parameter - Updated `Read10X_Coordinates` to handle new `tissue_coordinates.parquet` files - Added `shape` parameter to `SpatialPlot` and wrappers: `SpatialFeaturePlot` and `SpatialDimPlot` - Added `image.scale` parameter to `SpatialPlot` and related functions: `SpatialFeaturePlot`/`ISpatialFeaturePlot` and `SpatialDimPlot`/`ISpatialDimPlot` - Restored `image.name` parameter to `Read10X_Image` - Added `scale` parameter to `Radius.VisiumV1` - Fixed calculation of `spot.radius` attribute for `VisiumV1` instance returned by `Read10X_Image` — replace `scale.factors$fiducial` with `scale.factors$spot` - Added `Read10X_Coordinates` and `Read10X_ScaleFactors` - Fixed `SpatialPlot` to properly handle mutli-assay `Seurat` instances # Seurat 5.0.3 (2024-03-18) ## Changes - Fixed `PercentAbove` to discount null values ([#8412](https://github.com/satijalab/seurat/issues/8412)) - Added `log` parameter to `FeatureScatter` - Fixed handling of `clip.range` for `SCTransform` when `ncells` is less than the size of the passed dataset # Seurat 5.0.2 (2024-02-28) ## Changes - Fixed `AverageExpression` to handle `features` vector when `layer="scale.data"` and `return.seurat=TRUE` - Added `fc.slot` parameter to `FindMarkers` - Fixed `SCTransform` to handle `vars.to.regress` ([#8148](https://github.com/satijalab/seurat/issues/8148)) and ([#8349](https://github.com/satijalab/seurat/issues/8349)) - Fixed `SCTransform` to handle fetching residuals ([#8185](https://github.com/satijalab/seurat/issues/8185)) # Seurat 5.0.1 (2023-11-16) ## Changes - Fixed `SCTransform.StdAssay` to pass extra arguments to `sctransform::vst()`. Fixes [#875](https://github.com/satijalab/seurat/issues/7998) - Fixed PercentageFeatureSet Layer calling [(#8009)](https://github.com/satijalab/seurat/issues/8009) - Fixed cell highlighting [(#7914)](https://github.com/satijalab/seurat/pull/7914) - Updated marker sorting to be by p-value with ties broken by absolute difference in percent expression - Fixed issue with replicated barcodes in MappingScore [(#7922)](https://github.com/satijalab/seurat/issues/7922) - Improved `PseudobulkExpression` by adding 'g' to cell names that started with numeric values - Improved `PseudobulkExpression` by adding each variable specified in `group.by` as columns in the object metadata when `return.seurat=TRUE` - Fixed `DimPlot` and `FeatureScatter` which were breaking when using the `split.by` argument with a variable that contained NAs # Seurat 5.0.0 (2023-10-25) ## Added - Add `BridgeCellsRepresentation` to construct a dictionary representation for each unimodal dataset. - Add `BuildNicheAssay` to construct a new assay where each feature is a cell label. The values represent the sum of a particular cell label neighboring a given cell. - Add `CalcDispersion` to calculate the dispersion of features. - Add `CCAIntegration` to perform Seurat-CCA Integration. - Add `CountSketch` to generate a CountSketch random matrix. - Add `CreateCategoryMatrix` to create a one-hot matrix for a given label. - Add `DISP` to find variable features based on dispersion. - Add `FastRPCAIntegration` as a convenience wrapper function around the following three functions that are often run together when performing integration. - Add `FetchResiduals_reference` as a temporary function to get residuals from the reference. - Add `FetchResiduals` to call sctransform::get_residuals. - Add `FetchResidualSCTModel` to calculate Pearson residuals of features not in the scale.data. - Add `FindBridgeAnchor` to find bridge anchors between two unimodal datasets. - Add `FindBridgeIntegrationAnchors` to find a set of anchors for integration between unimodal query and the other unimodal reference using a pre-computed BridgeReferenceSet. - Add `FindBridgeTransferAnchors` to find a set of anchors for label transfer between unimodal query and the other unimodal reference using a pre-computed BridgeReferenceSet. - Add `GaussianSketch` to perform Gaussian sketching. - Add `HarmonyIntegration` to perform Harmony integration. - Add `IntegrateLayers` to integrate layers in an assay object. - Add `JointPCAIntegration` to perform Seurat-Joint PCA Integration. - Add `LeverageScore` to compute the leverage scores for a given object. - Add `LoadCurioSeeker` to load Curio Seeker data. - Add `MVP` to find variable features based on mean.var.plot. - Add `NNtoGraph` to convert the Neighbor class to an asymmetrical Graph class. - Add `PrepareBridgeReference` to preprocess the multi-omic bridge and unimodal reference datasets into an extended reference. - Add `ProjectCellEmbeddings` to project query data onto the reference dimensional reduction. - Add `ProjectData` to project high-dimensional single-cell RNA expression data from a full dataset onto the lower-dimensional embedding of the sketch of the dataset. - Add `ProjectDimReduc` to project query data to reference dimensional reduction. - Add `ProjectIntegration` to integrate embeddings from the integrated sketched.assay. - Add `PseudobulkExpression` to normalize the count data present in a given assay. - Add `Read10X_probe_metadata` to read the probe metadata from a 10x Genomics probe barcode matrix file in HDF5 format. - Add `RPCAIntegration` to perform Seurat-RPCA Integration. - Add `RunGraphLaplacian` to run a graph Laplacian dimensionality reduction. - Add `SelectIntegrationFeatures5` to select integration features for v5 assays. - Add `SelectSCTIntegrationFeatures` to select SCT integration features. - Add `SketchData` to use sketching methods to downsample high-dimensional single-cell RNA expression data for help with scalability for large datasets. - Add `TransferSketchLabels` to transfer cell type labels from a sketched dataset to a full dataset based on the similarities in the lower-dimensional space. - Add `UnSketchEmbeddings` to transfer embeddings from sketched cells to the full data. - Add `VST` to apply a variance stabilizing transformation for selection of variable features. ## Changes - Change `FindTransferAnchors` so that anchor filtering is not performed by default - Change `merge` so that layers will be added to a single Seurat object instead of combining raw count matrices - Deprecate `slot` parameter in favor of `layers` in accessor and set methods # Seurat 4.4.0 (2023-09-27) ## Added - Add parallelization support with speed improvements for `PrepSCTFindMarkers` - Fix bug in `LoadNanostring`([#7566](https://github.com/satijalab/seurat/pull/7566)) ## Changes - Fix bug in `as.Seurat.SingleCellExperiment()` ([#6692](https://github.com/satijalab/seurat/issues/6692)) - Support for Visium probe information introduced in Spaceranger 2.1 ([#7141](https://github.com/satijalab/seurat/pull/7141)) - Add `LoadCurioSeeker` to load sequencing-based spatial datasets generated using the Curio Seeker - Fix fold change calculation for assays ([#7095](https://github.com/satijalab/seurat/issues/7095)) - Fix `pt.size` bug when rasterization is set to true ([#7379](https://github.com/satijalab/seurat/issues/7379)) - Fix `FoldChange` and `FindMarkers` to support all normalization approaches ([#7115](https://github.com/satijalab/seurat/pull/7115),[#7110](https://github.com/satijalab/seurat/issues/7110),[#7095](https://github.com/satijalab/seurat/issues/7095),[#6976](https://github.com/satijalab/seurat/issues/6976),[#6654](https://github.com/satijalab/seurat/issues/6654),[#6701](https://github.com/satijalab/seurat/issues/6701),[#6773](https://github.com/satijalab/seurat/issues/6773), [#7107](https://github.com/satijalab/seurat/issues/7107)) - Fix for handling newer ParseBio formats in `ReadParseBio` ([#7565](https://github.com/satijalab/seurat/pull/7565)) - Fix for handling rasterization by default ([#7842](https://github.com/satijalab/seurat/pull/7842)) - Fix bug in `ReadMtx()` to add back missing parameters - Fix `SCTransform()` for V5 assays to retain gene attributes ([#7557](https://github.com/satijalab/seurat/issues/7557)) - Fix `LeverageScore()` for objects with few features ([#7650](https://github.com/satijalab/seurat/issues/7650) # Seurat 4.3.0 (2022-11-18) ## Added - Add support for imaging-based spatial datasets ## Changes - Fix bug in `FindMarkers()` when run post Integration/Transfer ([#6856](https://github.com/satijalab/seurat/issues/6586)) # Seurat 4.2.1 (2022-11-08) ## Changes - Replaced import from `spatstat.core` with `spatstat.explore` - Fix bug in `FindMarkers()` when using `SCT` assay ([#6856](https://github.com/satijalab/seurat/issues/6586)) # Seurat 4.2.0 (2022-09-21) ## Changes - Fix legend color in `DoHeatmap()` ([#5783](https://github.com/satijalab/seurat/issues/5783)) - Fix bug in `ScaleData()` when regressing out one gene ([#5970](https://github.com/satijalab/seurat/pull/5970)) - Fix name pulling in `PlotPerturbScore()` ([#6081](https://github.com/satijalab/seurat/pull/6081)) - Support spaceranger 2.0 ([#6208](https://github.com/satijalab/seurat/pull/6208)) - Fix bug in `SpatialDimPlot()` when using `group.by` ([#6179](https://github.com/satijalab/seurat/issues/6179)) - Add `add.noise` parameter in `VlnPlot()` ([#5756](https://github.com/satijalab/seurat/issues/5756)) - Fix uwot model backwards compatibility ([#6345](https://github.com/satijalab/seurat/issues/6345)) - Allow `pseudocount.use` in differential expression functions to be set at the `Assay` level # Seurat 4.1.1 (2022-05-01) ## Changes - Fix `giveCsparse` related warnings in `Read10X_h5` - Fix ident labeling for `SpatialPlot` ([#5774](https://github.com/satijalab/seurat/issues/5774)) - Fix `ReadMtx` on Windows ([#5687](https://github.com/satijalab/seurat/issues/5687)) - Fix `VlnPlot` to switch on rasterization only when required ([#5846](https://github.com/satijalab/seurat/pull/5846)) - Fix `ncol` behavior in `SpatialPlot` ([#5774](https://github.com/satijalab/seurat/issues/5774)) - Set `jitter` to FALSE in `FeatureScatter` ([#5876](https://github.com/satijalab/seurat/pull/5876)) - Update `Cells` methods to new signature (`x, ...`) - Replace use of `default.stringsAsFactors()` with `getOption("stringsAsFactors")` # Seurat 4.1.0 (2022-01-14) ## Added - Add `raster.dpi` parameter to `DimPlot/FeaturePlot` to optionally rasterize individual points ([#5392](https://github.com/satijalab/seurat/pull/5392)) - Add support for sctransform v2, differential expression with SCT assay ## Changes - Update `ReadParseBio` to support split-pipe 0.9.6p ([#5446](https://github.com/satijalab/seurat/pull/5446)) - Fixes for MAST differential expression ([#5441](https://github.com/satijalab/seurat/issues/5441)) - Fix scaling options when using `split.by` in `FeaturePlot()` ([#5243](https://github.com/satijalab/seurat/issues/5243)) # Seurat 4.0.6 (2021-12-16) ## Added - Implement supervised LSI ## Changes - Add `raster` parameter to `VlnPlot` to optionally rasterize individual points ([#5076](https://github.com/satijalab/seurat/pull/5076)) - Add `min.cells.group` parameter to `FindConservedMarkers` ([#5079](https://github.com/satijalab/seurat/pull/5079)) - Set `do.center` to FALSE for `lsiproject` in `FindTransferAnchors` - Fix error message in `ReadMtx()` ([#5158](https://github.com/satijalab/seurat/issues/5158)) - Add `label.color` parameter to `FeaturePlot` ([#5314](https://github.com/satijalab/seurat/pull/5314)) - Fix issues in `ProjectUMAP` ([#5257](https://github.com/satijalab/seurat/issues/5257), [#5104](https://github.com/satijalab/seurat/issues/5104), [#5373](https://github.com/satijalab/seurat/issues/5373)) # Seurat 4.0.5 (2021-10-04) ## Changes - Update documentation for `to.upper` parameter in `Load10X_Spatial()` ([#4576](https://github.com/satijalab/seurat/issues/4576)) - Update concept tags for `RunSPCA()` ([#4978](https://github.com/satijalab/seurat/discussions/4987)) - Conditionally run tests/packages that use suggested packages ([#5160](https://github.com/satijalab/seurat/pull/5160)) - Set random state in `RunUMAP()` when using the `umap-learn` method ([#5194](https://github.com/satijalab/seurat/issues/5194)) # Seurat 4.0.4 (2021-08-19) ## Added - Add `reduction` parameter to `BuildClusterTree()` ([#4598](https://github.com/satijalab/seurat/issues/4598)) - Add DensMAP option to `RunUMAP()` ([#4630](https://github.com/satijalab/seurat/pull/4630)) - Add `image` parameter to `Load10X_Spatial()` and `image.name` parameter to `Read10X_Image()` ([#4641](https://github.com/satijalab/seurat/pull/4641)) - Add `ReadSTARsolo()` function to read output from STARsolo - Add `densify` parameter to `FindMarkers()` - Add `ReadParsebio()` function to read output from Parse Biosciences - Add the `image.alpha` parameter to `SpatialDimPlot()` and `SpatialFeaturePlot()` - Add support for the correlation metric in `RunUMAP` ([#4972](https://github.com/satijalab/seurat/issues/4972)) ## Changes - Warn and continue rather than erroring if not all features are available in `FindSpatiallyVariableFeatures()` ([#4611](https://github.com/satijalab/seurat/issues/4611)) - Bug fix for SCT-based integration in selecting proper reference model ([#4355](https://github.com/satijalab/seurat/issues/4355)) - Bug fix for reading from absolute paths in ReadMtx ([#4723](https://github.com/satijalab/seurat/issues/4723)) - Bug fix in SingleCellExperiment conversion ([#4633](https://github.com/satijalab/seurat/issues/4633)) - Bug fix in `FindVariableFeatures()` when using `selection.method = "mvp"` and `binning.method = "equal_frequency"` ([#4712](https://github.com/satijalab/seurat/issues/4712)) - Bug fix in `DoHeatmap()` to remove random characters from plot legend([#4660](https://github.com/satijalab/seurat/issues/4660)) - Fix cell renaming in `RunCCA()` - Fix issue in SingleCellExperiment conversion where the mainExp would not be set properly - Fix for default dispersion info displayed in `VariableFeaturePlot()` # Seurat 4.0.3 (2021-06-10) ## Added - Add `jitter` parameter to `FeatureScatter()` ## Changes - Fix issues with `as.SingleCellExperiment.Seurat()` for the latest verion of SingleCellExperiment ([#4532](https://github.com/satijalab/seurat/pull/4532)) - Ensure proper reference.reduction is used in `MapQuery()` - Fix to `UpdateSymbolList()`, no longer searches aliases and exposes the `search.types` parameter in `GeneSymbolThesarus()` ([#4545](https://github.com/satijalab/seurat/issues/4545)) - Transfer `scale.data` slot as well when converting with `as.SingleCellExperiment.Seurat()` - Enable `alpha` parameter for `SpatialDimPlot()` - Fix `as.SingleCellExperiment.Seurat()` conversion for atypical `reducedDim` components # Seurat 4.0.2 (2020-05-20) ## Added - New `AddAzimuthScores()` and `AddAzimuthResults()` functions - Add `shuffle` parameter to `FeatureScatter()` ([#4280](https://github.com/satijalab/seurat/pull/4280)) - Add `lsiproject` and `rpca` options for `FindTransferAnchors()` - Add `rlsi` option for `FindIntegrationAnchors()` ## Changes - - Preserve feature metadata when converting from `SingleCellExperiment` to `SeuratObject` class ([#4205](https://github.com/satijalab/seurat/issues/4205)) - Preserve multiple assays when converting from `SingleCellExperiment` to `SeuratObject` class ([#3764](https://github.com/satijalab/seurat/issues/3764)) - Fix passing of `score.thresh` parameter in `ScoreJackStraw()` ([#4268](https://github.com/satijalab/seurat/pull/4268)) - Fix FC calculation in `FindMarkers()` non-log transformed data. - Add umap-learn version >= 0.5.0 compatibility for `RunUMAP()` - Fix `DotPlot` to use `log1p` when `scale=False` ([#4298](https://github.com/satijalab/seurat/issues/4298)) - Fix split and shuffled `DimPlot` - Disallow NULL or another length 0 vector for `ident.1` in `FindMarkers()` - Fix range shift when labeling clusters on a GeomSpatial plot - Fix SpatialPlot distortion for non-square images. - Fix future-related warnings in `FindIntegrationAnchors()` - Fix `fc.name` parameter in `FindMarkers()` ([#4474](https://github.com/satijalab/seurat/issues/4474)) - Deprecate `group.by` parameter in `PlotPerturbScore()` in favor of `mixscape.class`. # Seurat 4.0.1 (2020-03-17) ## Added - Add direction option to `PlotClusterTree()` - Add `cols` parameter to `JackStrawPlot()` - Add `ReadMtx()` to read local and remote mtx files with associated cell and feature name files ## Changes - Equality added to differential expression thresholds in `FindMarkers` (e.g, >= logfc.threshold rather than >) - `Read10X()` now prepends dataset number for first dataset when reading multiple datasets - Bug fix for `subset.AnchorSet()` - Bug fix for fold change values in `FindMarkers()` when setting a different pseudocount ([#4111](https://github.com/satijalab/seurat/pull/4111)) - Bug fix for `RunLDA()` related to proper passing of assay parameter. - When using `order=TRUE` in `SingleDimPlot()`, print NA points under all others. - Remove default parameter value for `data.dir` in `Read10X()` - Import spatstat fxns from subpackages (spatstat.core, spatstat.geom) - `RunUMAP` now checks for graph/neighbor consistency # Seurat 4.0.0 (2020-01-27) ## Added - Expose `FoldChange()` component in `FindMarkers()`. - Add the `merge.DimReduc` method - Add `IntegrateEmbeddings()` to correct embeddings of `DimReduc`s - Add `ProjectUMAP()` to project query cells into a reference UMAP space - Add `MapQuery()` as a wrapper around `IntegrateData()`, `IntegrateEmbeddings()`, and `ProjectUMAP()` - Add `MappingScore` to compute a per-cell mapping score used in Azimuth - Add `AggregateExpression()` for summation based pseudobulk calculations - Add mixscape functionality via `CalcPerturbSig()`, `PrepLDA()`, `RunLDA()`, `DEenrichRPlot()`, `MixscapeHeatmap()`, `MixscapeLDA()`, `PlotPerturbScore()`, `RunMixscape()` - Add `FindSubCluster()` to further cluster existing clusters - Add supervised PCA functionality via `RunSPCA()` - Add functionality to enable weighted nearest neighbor analyses via `FindMultiModalNeighbors()` - Add neighbor visualization plot via `NNPlot()`. - Add `PredictAssay()` to impute expression or embeddings from nearest neighbors - Add `Graphs()` function to access the names of the stored Graph objects or pull a specific one - Add checks for NA, NaN, logical, non-integer, and infinite values during CreateAssayObject and NormalizeData.default - Add `AnnotateAnchors()` to aid in AnchorSet interpretation as well as `subset.AnchorSet()` - Add flexibility of choice for cell column in `Read10X()` - Add rasterization option to `FeatureScatter()` and `VariableFeaturePlot()` - Add step1 feature parameters in the SCTModel via `PrepVSTResults()` ## Changes - Default neighbor finding algorithm changed from "rann" to "annoy" - Default `ncells` parameter in `SCTransform()` changed to 5000 - Default fold change in `FindMarkers()` changed from ln to log2 - Implementation improvements to `AverageExpression()` - `AnchorSet` class re-implemented as a virtual class from which `IntegrationAnchorSet` and `TransferAnchorSet` now inherit. - Point size in `VlnPlot()` now set automatically if not specified - Return the sample.tree properly when integrating with a single reference dataset - Replace `as.character.quosure` usage with `as_label` due to deprecation - Minor changes to the exact calculation of the anchor weight matrix - Default rasterization limit in `DimPlot()` and `FeaturePlot()` changed from 50,000 to 100,000 - `SCTransform()` now returns a formalized `Assay` subclass `SCTAssay()` - When using `normalization.method='SCT'` in `FindTransferAnchors()`, normalize query using reference SCT model when possible. - Change default Neighbor name in `FindNeighbors` to `Assay.nn` ## Removed - `CreateGeneActivityMatrix` replaced by `Signac::GeneActivity()` - `RunLSI` replaced by by `Signac::RunTFIDF()` and `Signac::RunSVD()` - `ReadAlevin` and `ReadAlevinCsv` moved to SeuratWrappers - `ExportToCellbrowser` and `StopCellbrowser` moved to SeuratWrappers # Seurat 3.2.3 - 2020-12-14 ## Added - Titles added to `DimPlot` when specifying `group.by` parameter - `keep.scale` parameter added to `FeaturePlot` to control scaling across multiple features and/or splits. ## Changes - `Same` deprecated in favor of `base::identity` - Fix in `DietSeurat` to work with specialized `Assay` objects - Fix p-value return when using the `ape` implementation of Moran's I - Fix bug in FindMarkers when using MAST with a latent variable - Updates to `Key<-.DimReduc` that allow handling of empty reduction column names - Allow setting `ctrl` in `CellCycleScoring` - Modify subset.Seurat to allow specialized Assay subsetting methods - Fix image selection in interactive spatial plots - Update Rcpp functions with `export(rng=FALSE)` to avoid potential future warnings - Fix RenameCells bug for integrated SCT assays - Fix highlight order with proper factor levels when using `SetHighlight` in plots - Small change in CellRanger version detection logic of h5 file to improve robustness to outside tools. - `do.cpp` deprecated and will default to true # Seurat 3.2.2 (2020-09-25) ## Changes - Set the seed in `WhichCells` regardless of whether or not `idents` is passed - Retain Graph and Neighbor objects when subsetting only on features - Fix data.frame input to `CreateAssayObject()` when data.frame has no rownames. - Default annoy search to sequential if not using multicore future plans. - Require sctransform >= 0.3.0 # Seurat 3.2.1 (2020-09-04) ## Added - Added support for nearest neighbor input and `return.model` parameter in `RunUMAP()` - Enable named color vectors in `DoHeatmap()` - Add `label.color` and `label.box` parameters to `DimPlot` - Added `shuffle` and `seed` parameters to `DimPlot()` to help with overplotting - Added new stacked violin plot functionality ## Changes - Allow setting `slot` parameter in `RunUMAP` - Added support for FIt-SNE v1.2+ - Fix for `Spatial*Plot` when running with interactive=TRUE - Set max for number of items returned by `Top` and remove duplicate items when balanced=TRUE - Fix logging bug when functions were run via `do.call()` - Fix handling of weight.by.var parameter when approx=FALSE in `RunPCA()` - Fix issue where feature names with dashes crashed `CellSelector` - Fix issue where errors in subsetting were being swallowed - Fix issue where labeling uncropped spatial plots was broken ## Deprecated - `CreateActivityMatrix` deprecated in favor of `Signac::GeneActivity` - `ReadAlevin` and `ReadAlevinCsv` deprecated in favor of `SeuratWrappers::ReadAlevin` - `ExportToCellbrowser` and `StopCellbrowser` deprecated in favor of `SeuratWrappers::ExportToCellbrowser` and `SeuratWrappers::StopCellbrowser` - `ReadH5AD` and `WriteH5AD` deprecated in favor of h5Seurat/H5AD functionality found in SeuratDisk - `as.loom` and `as.Seurat.loom` deprecated in favor of functionality found in SeuratDisk # Seurat 3.2.0 (2020-07-15) ## Added - Added ability to create a Seurat object from an existing Assay object, or any object inheriting from the Assay class - Added ability to cluster idents and group features in `DotPlot` - Added ability to use RColorBrewer plaettes for split `DotPlots` - Added visualization and analysis functionality for spatially resolved datasets (Visium, Slide-seq). ## Changes - Removed `add.iter` parameter from `RunTSNE` function - Fixed integer overflow error in the WilcoxDETest function - Minor visual fixes in `DoHeatmap` group bar + labels - Efficiency improvements in anchor scoring (`ScoreAnchors`) - Fix bug in `FindClusters()` when the last node has no edges - Default to weighted = TRUE when constructing igraph objects in `RunLeiden`. Remove corresponding weights parameter from `FindClusters()`. - Fix handling of keys in `FeatureScatter()` - Change `CellSelector` to use Shiny gadgets instead of SDMTools - Mark `PointLocator` as defunct - Remove `SDMTools` - Fixed data slot return in `AverageExpression` when subsetting features and returning a Seurat object # Seurat 3.1.5 (2020-04-14) ## Added - New `scale` parameter in `DotPlot` - New `keep.sparse parameter in `CreateGeneActivityMatrix` for a more memory efficient option - Added ability to store model learned by UMAP and project new data - New `strip.suffix` option in `Read10X`. **This changes the default behavior of `Read10X`**. A trailing `-1` present in all cell names will not be removed by default. - Added `group.by` parameter to `FeatureScatter` ## Changes - Replace wilcox.test with limma implementation for a faster FindMarkers default method - Better point separation for `VlnPlot`s when using the `split.by` option - Efficiency improvements for anchor pairing - Deprecate redundant `sort.cell` parameter in `FeaturePlot` - Fixes to ensure correct class of Matrix passed to c++ functions - Fixes for underscores in ident labels for `DotPlot` - Ensure preservation of matrix dimnames in `SampleUMI` - Fix non-standard evaluation problems in `subset` and `WhichCells` - Default split violin option is now a multi group option - Preserve alpha in `FeaturePlot` when using `blend` - Update `assay.used` slot for `DimReduc`s when Assay is renamed # Seurat 3.1.4 (2020-02-20) ## Changes - Fixes to `DoHeatmap` to remain compatible with ggplot2 v3.3 - Adoption of `patchwork` framework to replace `CombinePlots` # Seurat 3.1.3 (2020-02-07) ## Added - New system agnostic `Which` function to address problems with FItSNE on Windows ## Changes - Export `CellsByIdentities` and `RowMergeSparseMatrices` functions - nCount and nFeature metadata variables retained after subset and updated properly with `UpdateSeuratObject` - Fix uwot support for running directly on feature matrices - Fixes for keys with underscores - Fix issue with leiden option for `FindClusters` - Fix for data transfer when using sctransform - SDMTools moved to Suggests as package is orphaned # Seurat 3.1.2 (2019-12-11) ## Added - New silent slot updater - New random seed options to `RunCCA`, `RunTSNE`, `WhichCells`, `HTODemux`, `AddModuleScore`, `VlnPlot`, and `RidgePlot` - Enhancements for dealing with `Assay`-derived objects ## Changed - Only run `CalcN` (generates nFeatures and nCounts) when `counts` changes - Fix issue regarding colons in feature names - Change object class testing to use `inherits` or `is.*` for R 4.0 compatability # Seurat 3.1.1 (2019-09-20) ## Added - New `RegroupIdents` function to reassign idents based on metadata column majority - `UpdateSymbolList` function to pull new gene names from HGNC - Added support for H5AD layers as additional assays in a `Seurat` object ## Changed - Fix rownames issue when running UMAP on dist object - Add support for new H5AD `obsm` and `varm` stucture - Fix issue when trying to read non-existent feature-level metadata from an H5AD file - Fix in integration workflow when using SCTransform - Improved error checking for `AddModuleScore` - cbind fix in reference-based integration (`MapQuery`) - Fix for convenience plots error hanging - Ensure Seurat objects aren't stored in the command logs # Seurat 3.1.0 (2019-08-20) ## Added - New `PrepSCTIntegration` function to facilitate integration after `SCTransform` - Reference-based integration with the `reference` parameter in `FindIntegrationAnchors` - Reciprocal PCA as a `reduction` option in `FindIntegrationAnchors` - New `CollapseEmbeddingOutliers` function - Enable `FindTransferAnchors` after `SCTransform` - Added back `ColorDimSplit` functionality - Include a code of conduct - Added uwot support as new default UMAP method - Added `CheckDots` to catch unused parameters and suggest updated names - `Reductions` and `Assays` assays functions to list stored DimReducs and Assays ## Changed - Fix regex in `LogSeuratCommand` - Check for NAs in feature names in `Read10X` - Prevent dimnames for counts/data/scale.data matrices from being arrays - Updates `ReadH5AD` to distinguish FVF methods - Fixes to UpdateSeuratObject for v2 objects - Sink all output from stdout to stderr - Fix to scale.data cell ordering after subsetting - Enable `Assay` specification in `BuildClusterTree` - Fix `FeaturePlot` when using both `blend` and `split.by` - Fix to `WhichCells` when passing `cells` and `invert` - Fix to `HoverLocator` labels and title - Ensure features names don't contain pipes (`|`) - Deprecation of `RunLSI` and `RunALRA` - Fix legend bug when sorting in `ExIPlot` # Seurat 3.0.2 (2019-06-07) ## Added - Flag to skip singleton grouping in `FindClusters` - New custom colors for blended `FeaturePlot`s - New `GetResidual` function - New Seurat/Monocle converters ## Changed - Fix issue where certain assays weren't being shown in the `Seurat` object - Fix issue where we weren't updating `DimReduc` object column names - Fix line spacers in `DoHeatmap` - Fix uninformative labels in `FeaturePlot` - Fix unset identities when converting from SCE to Seurat - Fix single colors being interpreted as palettes in `SingleDimPlot` - Ensure factor levels are always numerically increasing after `FindClusters` - Better cell highlighting colors for `DimPlot` - Fix to `levels<-.Seurat` - Add ability to use counts/scaled data in `BuildClusterTree` - Minor fix to split `ScaleData` # Seurat 3.0.1 (2019-05-16) ## Added - Add global option (Seurat.memsafe) to skip gc() calls - Restore draw.lines to DoHeatmap, maintain size of color bar with different number of features (#1429) - Enable split.by parameter for ScaleData - Add slot parameter to FeaturePlot (#1483) - Add assay parameter to DotPlot (#1404) ## Changed - Fix to color options for VlnPlot with split.by option (#1425) - Improvements to conversion functions (loom, SCE) - Fix for cluster tree reordering (#1434) - Fix PercentageFeatureSet for single feature case - Fix to fold change calculation and filtering for other slots in FindMarkers (#1454) - Keep title vectorized in AugmentPlot (#1515) - Export LogSeuratCommand function - Fix for FindConservedMarkers when one ident is missing from a group (#1517) # Seurat 3.0.0 (2019-04-16) ## Added - New method for identifying anchors across single-cell datasets - Parallelization support via future - Additional method for demultiplexing with MULTIseqDemux - Support normalization via sctransform - New option for clustering with the Leiden algorithm - Support for reading 10X v3 files - New function to export Seurat objects for the UCSC cell browser - Support for data import from Alevin outputs - Imputation of dropped out values via ALRA ## Changed - Significant code restructuring - Most occurances of "gene(s)" in function names/arguments renamed to "feature(s)" - Changes to the Seurat object class to facilitate multimodal data - New BlendPlot implementation # Seurat 2.3.4 (2018-07-13) ## Added - GetIdent function added to pull identity info ## Changed - DiffusionMap dependency replaced with destiny to avoid archival - Java dependency removed and functionality rewritten in Rcpp - Speed and efficiency improvements for Rcpp code - More robust duplicate handling in CellCycleScoring # Seurat 2.3.3 (2018-07-02) ## Added - New HTOHeatmap function - Support for custom PNG arguments for vector-friendly plotting - Fix for 'NA'-labeled cells disappearing with custom color scale ## Changed - Replaced FNN with RANN - Removed unused compiler flags - Moved several lightly-used packages from 'imports' to 'suggests' # Seurat 2.3.2 (2018-06-11) ## Added - RenameCells added for easy renaming of all cells - Read10X_h5 added to read in 10X formatted h5 files - SetAssayData ensures cell order is the same between assay objects and the Seurat object - Compatability updates for ggplot2 v2.3.0 # Seurat 2.3.1 (2018-05-03) ## Added - Support for [UMAP](https://github.com/lmcinnes/umap) dimensional reduction technique - New conversion functions for SingleCellExperiment and anndata ## Changed - FetchData preserves cell order - Require Matrix 1.2-14 or higher - AddModuleScore no longer densifies sparse-matrices - Various visualization fixes and improvements - Default value for latent.vars in FindMarkers/FindAllMarkers changed to NULL. # Seurat 2.3.0 (2018-03-22) ## Added - Support for HTO demultiplexing - Utility functions: TransferIdent, CombineIdent, SplitObject, vector.friendly - C++ implementation for parts of BuildSNN - Preliminary parallelization support (regression and JackStraw) - Support for FItSNE ## Changed - MetaDE replaced with metap for combining p-values (MetaDE was removed from CRAN) - NMF heatmaps replaced (NMF to be archived by CRAN) # Seurat 2.2.1 (2018-02-14) ## Changed - MetaDE replaced with metap for combining p-values (MetaDE was removed from CRAN) - NMF heatmaps replaced (NMF to be archived by CRAN) # Seurat 2.2.0 (2018-01-10) ## Added - Multiple alignment functionality with RunMultiCCA and AlignSubspace extended to multiple datasets - CalcAlignmentScore added to evaluate alignment quality - MetageneBicorPlot added to guide CC selection - Change cluster order in DoHeatmap with group.order parameter - Ability to change plotting order and add a title to DimPlot - do.clean and subset.raw options for SubsetData ## Changed - JoyPlot has been replaced with RidgePlot - FindClusters is now more robust in making temp files - MetaDE support for combining p-values in DE testing # Seurat 2.1.0 (2017-10-12) ## Added - Support for using MAST and DESeq2 packages for differential expression testing in FindMarkers - Support for multi-modal single-cell data via @assay slot ## Changed - Default DE test changed to Wilcoxon rank sum test # Seurat 2.0.1 (2017-08-18) ## Added - Now available on CRAN - Updated documentation complete with examples - Example datasets: `pbmc_small` and `cc.genes` - C++ implementation for parts of FindVariableGenes - Minor bug fixes # Seurat 2.0.0 (2017-07-26) ## Added - New method for aligning scRNA-seq datasets - Significant code restructuring - New methods for scoring gene expression and cell-cycle phases - New visualization features (do.hover, do.identify) Seurat/inst/0000755000176200001440000000000015056057544012505 5ustar liggesusersSeurat/inst/CITATION0000644000176200001440000000751215056057544013647 0ustar liggesuserscitHeader("To cite Seurat in publications, please use:") bibentry(bibtype = "article", author = c( as.person("Yuhan Hao"), as.person("Tim Stuart"), as.person("Madeline H Kowalski"), as.person("Saket Choudhary"), as.person("Paul Hoffman"), as.person("Austin Hartman"), as.person("Avi Srivastava"), as.person("Gesmira Molla"), as.person("Shaista Madad"), as.person("Carlos Fernandez-Granda"), as.person("Rahul Satija") ), title = "Dictionary learning for integrative, multimodal and scalable single-cell analysis", journal = "Nature Biotechnology", year = "2023", doi = "10.1038/s41587-023-01767-y", url = "https://doi.org/10.1038/s41587-023-01767-y", textVersion = "Hao et al. Dictionary learning for integrative, multimodal and scalable single-cell analysis. Nature Biotechnology (2023) [Seurat V5]" ) bibentry(bibtype = "article", author = c( as.person("Yuhan Hao"), as.person("Stephanie Hao"), as.person("Erica Andersen-Nissen"), as.person("William M. Mauck III"), as.person("Shiwei Zheng"), as.person("Andrew Butler"), as.person("Maddie J. Lee"), as.person("Aaron J. Wilk"), as.person("Charlotte Darby"), as.person("Michael Zagar"), as.person("Paul Hoffman"), as.person("Marlon Stoeckius"), as.person("Efthymia Papalexi"), as.person("Eleni P. Mimitou"), as.person("Jaison Jain"), as.person("Avi Srivastava"), as.person("Tim Stuart"), as.person("Lamar B. Fleming"), as.person("Bertrand Yeung"), as.person("Angela J. Rogers"), as.person("Juliana M. McElrath"), as.person("Catherine A. Blish"), as.person("Raphael Gottardo"), as.person("Peter Smibert"), as.person("Rahul Satija") ), title = "Integrated analysis of multimodal single-cell data", journal = "Cell", year = "2021", doi = "10.1016/j.cell.2021.04.048", url = "https://doi.org/10.1016/j.cell.2021.04.048", textVersion = "Hao and Hao et al. Integrated analysis of multimodal single-cell data. Cell (2021) [Seurat V4]" ) bibentry(bibtype = "article", author = c( as.person("Tim Stuart"), as.person("Andrew Butler"), as.person("Paul Hoffman"), as.person("Christoph Hafemeister"), as.person("Efthymia Papalexi"), as.person("William M Mauck III"), as.person("Yuhan Hao"), as.person("Marlon Stoeckius"), as.person("Peter Smibert"), as.person("Rahul Satija") ), title = "Comprehensive Integration of Single-Cell Data", journal = "Cell", year = "2019", volume = "177", pages = "1888-1902", doi = "10.1016/j.cell.2019.05.031", url = "https://doi.org/10.1016/j.cell.2019.05.031", textVersion = "Stuart and Butler et al. Comprehensive Integration of Single-Cell Data. Cell (2019) [Seurat V3]" ) bibentry(bibtype = "article", author = c( as.person("Andrew Butler"), as.person("Paul Hoffman"), as.person("Peter Smibert"), as.person("Efthymia Papalexi"), as.person("Rahul Satija") ), title = "Integrating single-cell transcriptomic data across different conditions, technologies, and species", journal = "Nature Biotechnology", year = "2018", volume = "36", pages = "411-420", doi = "10.1038/nbt.4096", url = "https://doi.org/10.1038/nbt.4096", textVersion = "Butler et al. Integrating single-cell transcriptomic data across different conditions, technologies, and species. Nat Biotechnol (2018) [Seurat V2]" ) bibentry(bibtype = "article", author = c( as.person("Rahul Satija"), as.person("Jeffrey A Farrell"), as.person("David Gennert"), as.person("Alexander F Schier"), as.person("Aviv Regev") ), title = "Spatial reconstruction of single-cell gene expression data", journal = "Nature Biotechnology", year = "2015", volume = "33", pages = "495-502", doi = "10.1038/nbt.3192", url = "https://doi.org/10.1038/nbt.3192", textVersion = "Satija and Farrell et al. Spatial reconstruction of single-cell gene expression data. Nat Biotechnol (2015) [Seurat V1]" ) Seurat/inst/extdata/0000755000176200001440000000000015056057544014137 5ustar liggesusersSeurat/inst/extdata/pbmc_raw.txt0000644000176200001440000011572015056057544016500 0ustar liggesusersATGCCAGAACGACT CATGGCCTGTGCAT GAACCTGATGAACC TGACTGGATTCTCA AGTCAGACTGCACA TCTGATACACGTGT TGGTATCTAAACAG GCAGCTCTGTTTCT GATATAACACGCAT AATGTTGACAGTCA AGGTCATGAGTGTC AGAGATGATCTCGC GGGTAACTCTAGTG CATGAGACACGGGA TACGCCACTCCGAA CTAAACCTGTGCAT GTAAGCACTCATTC TTGGTACTGAATCC CATCATACGGAGCA TACATCACGCTAAC TTACCATGAATCGC ATAGGAGAAACAGA GCGCACGACTTTAC ACTCGCACGAAAGT ATTACCTGCCTTAT CCCAACTGCAATCG AAATTCGAATCACG CCATCCGATTCGCC TCCACTCTGAGCTT CATCAGGATGCACA CTAAACCTCTGACA GATAGAGAAGGGTG CTAACGGAACCGAT AGATATACCCGTAA TACTCTGAATCGAC GCGCATCTTGCTCC GTTGACGATATCGG ACAGGTACTGGTGT GGCATATGCTTATC CATTACACCAACTG TAGGGACTGAACTC GCTCCATGAGAAGT TACAATGATGCTAG CTTCATGACCGAAT CTGCCAACAGGAGC TTGCATTGAGCTAC AAGCAAGAGCTTAG CGGCACGAACTCAG GGTGGAGATTACTC GGCCGATGTACTCT CGTAGCCTGTATGC TGAGCTGAATGCTG CCTATAACGAGACG ATAAGTTGGTACGT AAGCGACTTTGACG ACCAGTGAATACCG ATTGCACTTGCTTT CTAGGTGATGGTTG GCACTAGACCTTTA CATGCGCTAGTCAC TTGAGGACTACGCA ATACCACTCTAAGC CATATAGACTAAGC TTTAGCTGTACTCT GACATTCTCCACCT ACGTGATGCCATGA ATTGTAGATTCCCG GATAGAGATCACGA AATGCGTGGACGGA GCGTAAACACGGTT ATTCAGCTCATTGG GGCATATGGGGAGT ATCATCTGACACCA GTCATACTTCGCCT TTACGTACGTTCAG GAGTTGTGGTAGCT GACGCTCTCTCTCG AGTCTTACTTCGGA GGAACACTTCAGAC CTTGATTGATCTTC MS4A1 0 0 0 0 0 0 0 0 0 0 2 2 4 4 2 3 3 4 2 3 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 CD79B 1 0 0 0 0 0 0 0 0 1 2 4 3 3 2 3 1 2 2 5 0 0 0 0 0 0 0 0 0 1 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 2 2 0 0 3 0 0 0 0 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CD79A 0 0 0 0 0 0 0 0 0 0 0 5 2 2 5 8 1 5 5 12 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 HLA-DRA 0 1 0 0 1 1 0 1 0 0 14 28 18 7 15 28 7 26 10 16 7 22 0 10 6 0 4 3 7 13 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 10 10 4 1 6 28 10 13 5 8 108 93 41 42 138 77 76 15 19 104 1 0 0 0 2 1 1 0 2 7 TCL1A 0 0 0 0 0 0 0 0 0 0 3 0 2 4 0 0 3 3 3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 HLA-DQB1 1 0 0 0 0 0 0 0 0 0 1 6 2 2 2 8 2 2 1 2 0 3 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 2 0 0 1 1 0 21 21 3 5 11 11 10 1 2 11 0 0 0 0 0 0 0 0 0 1 HVCN1 0 0 0 0 0 0 0 0 0 0 3 1 0 0 2 0 2 1 1 2 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 HLA-DMB 0 0 0 0 0 0 0 0 0 0 0 4 1 1 2 2 1 2 0 1 0 1 0 1 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 3 2 1 4 5 2 1 1 1 5 0 0 0 0 0 0 0 0 0 0 LTB 3 7 11 13 3 4 6 4 2 21 2 9 2 4 4 0 3 6 5 7 1 0 0 1 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 1 1 7 1 0 1 5 3 1 2 0 0 1 1 1 1 2 1 0 1 0 5 0 0 0 0 1 4 0 0 1 0 0 0 0 0 0 0 LINC00926 0 0 0 0 0 0 0 0 0 0 0 2 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 FCER2 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SP100 1 0 1 1 0 0 0 0 0 1 0 3 2 0 1 2 2 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 3 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 NCF1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 2 2 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 PPP3CC 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 EAF2 0 0 0 0 0 0 0 0 0 0 3 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 PPAPDC1B 0 0 0 0 0 0 0 0 0 0 0 3 0 1 0 0 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CD19 0 0 0 0 0 0 0 0 0 0 0 1 0 2 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 KIAA0125 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CYB561A3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CD180 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 RP11-693J15.5 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 FAM96A 0 1 0 0 0 0 0 0 0 0 1 0 0 0 2 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CXCR4 1 1 0 6 0 2 4 1 0 4 2 0 4 1 0 0 4 2 6 2 3 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 4 0 7 1 3 0 6 1 0 1 0 1 0 1 0 1 0 0 0 0 1 2 12 3 1 3 0 1 2 0 0 2 0 0 0 0 0 0 0 0 0 0 STX10 0 0 1 0 0 1 0 1 0 0 2 0 0 0 2 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SNHG7 0 2 0 0 0 0 0 0 0 1 0 1 1 0 2 3 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 2 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 NT5C 0 0 0 0 0 0 0 0 0 0 2 2 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 BANK1 0 1 0 0 0 0 0 0 0 0 0 4 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 IGLL5 0 0 0 0 0 0 0 0 0 0 1 0 15 0 0 0 0 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CD200 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 FCRLA 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CD3D 4 4 4 5 4 4 3 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 7 0 0 0 0 1 0 1 0 0 2 3 0 3 15 1 3 6 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 NOSIP 0 3 2 2 3 1 1 3 2 1 0 0 0 0 0 2 0 0 0 0 0 2 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 2 0 0 1 0 0 0 0 0 1 0 0 1 0 2 0 0 0 1 1 0 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 SAFB2 0 1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CD2 1 0 2 2 0 1 0 1 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 2 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IL7R 5 2 1 2 2 0 1 12 0 9 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 1 3 1 1 1 0 2 0 2 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 PIK3IP1 0 0 1 0 0 2 3 2 3 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 MPHOSPH6 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 KHDRBS1 0 1 1 1 36 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 1 0 0 2 0 0 0 0 0 0 0 0 0 0 MAL 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CCR7 0 5 0 0 2 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 THYN1 0 2 1 1 0 2 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 TAF7 0 2 0 2 1 2 0 2 3 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 2 3 0 0 1 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 LDHB 3 2 1 6 5 3 4 0 1 6 0 1 0 0 0 0 2 0 1 0 1 2 0 2 1 0 1 0 0 0 0 0 0 2 2 0 1 0 0 0 2 1 4 0 4 4 0 0 0 2 0 0 1 0 0 2 0 1 0 1 2 0 0 5 2 2 0 1 2 0 1 0 0 0 0 1 0 0 0 1 TMEM123 3 3 0 4 2 1 1 2 1 1 0 1 1 0 0 0 1 3 1 1 0 0 0 0 3 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 2 0 1 0 0 0 1 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 2 3 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 CCDC104 0 0 0 2 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 EPC1 1 0 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 EIF4A2 3 1 2 5 2 4 3 2 3 0 0 2 1 1 5 0 0 1 0 0 0 0 0 0 1 0 1 1 0 1 2 2 0 2 0 0 0 1 3 1 1 0 0 1 2 0 2 3 0 1 0 2 0 0 2 0 1 0 2 1 4 0 0 4 2 4 1 0 0 1 0 0 0 0 0 0 0 0 0 0 CD3E 0 2 1 4 3 1 3 4 2 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 2 0 1 2 0 1 5 2 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 TMUB1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 BLOC1S4 1 0 2 0 2 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ACSM3 1 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 TMEM204 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SRSF7 2 0 1 1 54 2 1 1 1 3 1 2 0 1 0 0 0 0 0 0 0 2 0 0 1 0 0 0 0 3 1 0 1 15 0 0 0 0 0 1 2 1 3 1 0 1 1 1 0 1 0 1 0 0 0 1 0 3 1 0 0 2 1 1 3 0 1 5 13 2 0 0 0 0 0 0 0 0 0 0 ACAP1 0 0 1 2 0 1 2 2 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 TNFAIP8 1 3 2 3 2 0 0 0 1 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 4 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 CD7 2 2 2 3 2 1 0 0 3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 1 1 1 3 4 2 1 1 2 1 4 0 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 TAGAP 1 1 1 1 0 0 0 1 2 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DNAJB1 2 0 0 2 0 0 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 2 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 1 0 2 0 2 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 ASNSD1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 S1PR4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 1 0 39 0 0 0 0 0 0 0 1 0 0 2 3 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 CTSW 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 3 2 3 2 4 8 6 1 11 1 4 1 2 1 2 2 1 5 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 GZMK 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 2 1 2 0 0 2 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 NKG7 0 0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 1 0 0 2 1 0 0 0 0 1 0 0 1 35 14 12 30 20 27 28 10 25 27 31 22 7 2 4 14 16 4 29 8 5 3 0 0 0 0 5 0 0 0 0 1 0 0 1 3 0 1 0 1 0 0 0 0 0 0 0 0 0 0 IL32 1 0 9 8 1 0 3 3 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 5 4 0 0 0 0 7 8 5 5 0 7 1 6 7 6 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 DNAJC2 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 LYAR 0 1 1 1 3 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1 1 0 1 1 2 47 0 1 1 1 1 0 2 0 0 0 0 2 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 CST7 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 4 4 2 7 2 4 3 3 2 5 2 3 1 1 0 2 8 4 5 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 LCK 0 3 2 0 1 1 2 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 2 1 1 1 2 1 0 1 1 2 0 1 2 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CCL5 0 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 2 5 14 0 29 1 7 5 25 0 14 27 3 13 17 7 3 16 12 3 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 8 5 4 10 11 30 8 5 9 2 HNRNPH1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SSR2 0 2 2 4 1 1 0 0 0 6 0 1 0 0 1 1 0 1 0 0 0 0 0 0 3 0 1 0 1 0 0 2 0 0 1 0 1 0 1 2 1 2 1 1 1 2 4 1 2 4 2 1 0 0 2 0 3 1 3 1 0 2 3 0 1 3 2 0 4 2 0 0 0 0 0 0 0 0 0 0 DLGAP1-AS1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 GIMAP1 0 2 0 0 0 0 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 1 1 0 2 0 1 1 1 1 0 2 1 0 0 1 1 17 0 0 0 1 0 1 0 1 0 2 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 MMADHC 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 2 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ZNF76 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CD8A 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 3 0 1 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 PTPN22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 GYPC 1 2 2 0 0 1 0 0 2 1 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 1 0 1 0 1 3 0 1 0 0 7 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 HNRNPF 0 0 0 1 0 1 0 1 2 0 0 2 1 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 2 1 1 2 1 1 1 0 1 2 0 2 0 1 0 0 0 0 1 1 0 1 0 0 1 1 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 RPL7L1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 KLRG1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 3 0 2 0 1 0 0 0 0 1 4 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CRBN 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 2 1 1 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 2 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 SATB1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 13 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SIT1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 PMPCB 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 2 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 NRBP1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 TCF7 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 HNRNPA3 0 0 0 1 2 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 0 2 1 2 0 2 1 0 1 2 0 0 1 0 0 0 2 1 1 0 1 1 0 0 0 1 4 0 1 0 2 0 0 0 0 0 0 0 0 0 0 S100A8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 5 25 5 25 6 24 40 16 11 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 4 3 0 1 1 2 0 0 2 0 2 1 9 1 23 4 0 0 1 0 0 0 1 0 0 0 2 S100A9 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 30 12 51 22 85 3 54 55 35 17 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 20 6 1 0 10 4 8 6 0 0 0 0 1 10 0 41 11 32 17 0 3 0 0 0 0 0 0 0 0 7 LYZ 1 1 1 0 0 1 0 0 1 0 1 4 0 1 0 0 0 1 1 0 50 29 25 49 98 11 59 28 34 16 0 0 1 0 2 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 41 4 3 3 14 17 7 6 9 6 76 20 24 79 53 53 87 76 42 114 3 1 1 0 1 0 0 0 0 22 CD14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 2 4 1 0 1 1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 FCN1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 10 6 5 9 7 1 1 2 8 7 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 2 13 7 5 1 4 3 1 1 2 0 0 0 3 1 2 4 6 1 0 0 0 0 0 0 0 0 0 0 0 0 TYROBP 0 0 0 2 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 14 13 3 10 16 4 13 12 19 12 3 0 4 3 6 7 3 4 5 15 2 0 1 1 0 0 0 0 0 0 11 21 2 5 21 13 16 9 16 17 2 8 6 9 11 14 10 10 6 7 0 0 0 0 0 0 0 0 0 14 ASGR1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 NFKBIA 0 0 1 1 0 0 0 0 0 4 0 1 1 0 1 0 0 0 1 1 3 13 5 0 11 0 2 3 5 10 0 1 0 1 0 1 0 0 0 0 5 1 1 0 0 0 1 0 1 0 2 2 2 0 2 1 1 1 2 9 2 2 0 1 1 6 1 3 2 4 0 0 0 0 0 0 0 0 0 6 TYMP 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 7 1 6 5 1 6 4 5 1 0 0 0 2 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 6 5 1 1 6 4 3 2 4 5 1 3 2 5 14 11 3 4 8 4 0 0 0 0 0 0 0 0 0 2 CTSS 1 1 0 0 1 2 0 1 1 1 1 0 1 0 0 0 1 2 0 2 15 9 1 5 7 3 4 4 11 7 0 0 1 0 0 0 1 0 0 4 1 1 0 0 1 0 0 0 0 0 8 8 7 3 10 15 18 19 4 17 5 3 1 5 0 3 6 2 0 3 1 0 0 0 0 0 0 0 0 3 TSPO 0 0 0 0 1 1 1 0 0 1 0 1 0 0 0 1 1 0 0 0 1 2 6 0 36 1 5 0 3 5 1 0 0 0 0 0 1 1 1 0 1 1 0 0 2 0 1 0 0 0 2 4 0 1 2 3 6 4 2 5 1 0 0 4 2 5 10 6 4 2 0 0 0 0 0 2 0 0 0 3 RBP7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 2 1 4 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CTSB 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 4 1 1 7 1 1 2 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 4 0 1 0 1 0 3 0 0 2 1 1 0 2 0 2 2 1 0 0 0 0 0 0 1 0 0 0 0 1 LGALS1 1 0 1 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 14 10 8 11 4 6 7 22 37 3 4 9 6 1 3 14 2 1 4 1 3 0 0 0 0 1 0 1 0 5 12 4 2 16 10 6 2 12 16 8 13 21 9 20 10 23 5 28 13 0 0 0 0 1 0 0 0 0 10 FPR1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 1 0 2 1 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 VSTM1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 BLVRA 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 3 1 2 0 1 0 1 1 3 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 2 2 5 1 2 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 MPEG1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 1 1 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 2 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 BID 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 27 0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 3 6 1 2 2 4 2 2 2 2 0 0 3 1 0 2 0 0 0 0 0 0 0 0 0 0 SMCO4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 2 1 0 1 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 2 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 CFD 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 2 1 1 0 0 2 15 2 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 4 5 2 0 0 5 2 3 2 3 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 3 LINC00936 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 5 1 0 0 1 1 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 3 1 2 1 1 0 3 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 LGALS2 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 12 6 2 1 6 0 0 0 5 2 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 3 10 1 2 3 4 4 1 3 6 0 0 0 0 0 0 0 0 0 3 MS4A6A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 2 2 1 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 4 1 0 7 7 0 2 1 2 0 0 0 0 0 0 0 0 0 0 1 FCGRT 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 0 0 1 14 1 2 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 0 1 3 1 1 0 1 1 3 1 0 2 2 3 3 1 4 3 0 0 0 0 0 0 0 0 0 2 LGALS3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 4 4 1 3 0 2 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 2 2 0 0 4 2 0 2 1 0 0 5 1 0 6 2 7 2 2 0 0 0 0 0 0 1 0 0 0 1 NUP214 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 1 2 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 SCO2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 2 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 2 0 0 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IL17RA 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IFI6 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 5 3 0 0 3 0 1 5 0 4 0 0 0 0 1 0 1 1 2 0 0 0 0 0 0 0 0 0 1 0 0 2 0 1 1 3 1 3 0 2 0 4 0 2 6 2 5 1 0 0 0 0 0 0 0 0 0 0 0 4 HLA-DPA1 0 0 0 0 0 0 0 0 0 0 3 8 2 2 5 9 0 5 1 5 0 13 2 1 0 1 0 0 7 6 0 1 0 2 0 0 1 0 0 0 0 0 0 0 1 3 0 0 1 0 12 4 2 1 5 5 7 14 5 11 75 52 11 19 54 23 45 10 23 37 0 0 0 0 0 0 0 0 0 5 FCER1A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 1 2 4 8 5 8 4 7 0 0 0 0 0 0 0 0 0 0 0 CLEC10A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 2 4 2 3 6 4 2 1 0 0 0 0 0 0 0 0 0 1 HLA-DMA 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 4 1 1 0 1 0 4 1 1 0 0 0 0 1 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 4 0 0 0 0 6 6 5 4 6 5 6 5 3 5 0 0 0 0 0 0 0 0 0 1 RGS1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 1 3 0 1 3 0 1 2 0 0 0 0 0 0 0 0 0 0 HLA-DPB1 0 0 0 0 0 0 0 0 0 0 4 10 4 4 8 23 7 0 4 6 0 18 1 2 0 3 0 1 7 7 2 4 0 0 0 0 0 0 0 0 0 4 0 0 1 2 0 0 0 0 8 3 5 2 3 7 6 5 9 4 102 78 23 25 69 24 43 8 10 50 1 0 0 0 0 0 0 0 0 5 HLA-DQA1 0 0 0 1 0 0 0 0 0 0 0 4 4 1 0 8 1 5 0 1 1 5 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 2 0 0 0 1 1 2 0 0 25 39 5 2 16 6 11 3 4 9 0 0 0 0 0 0 0 0 0 0 RNF130 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 2 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 2 2 2 2 0 1 1 1 6 3 5 1 0 0 0 0 0 0 0 0 0 0 HLA-DRB5 0 0 0 0 0 0 1 0 0 0 1 4 3 0 4 8 1 2 2 4 0 8 1 1 0 0 0 0 4 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 4 5 0 0 3 3 6 3 6 2 11 26 5 2 31 21 21 2 3 10 0 0 0 0 0 0 0 0 0 1 HLA-DRB1 0 0 0 0 0 0 0 0 0 0 2 10 6 1 5 16 5 11 5 8 2 12 1 5 1 0 3 0 5 3 0 2 0 1 0 0 0 0 1 0 0 0 0 0 0 3 0 0 0 0 8 4 0 0 7 7 13 6 6 4 50 53 10 9 68 36 49 3 9 26 0 0 0 0 0 0 0 0 0 4 CST3 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 13 28 15 11 13 7 37 5 20 18 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 16 32 7 9 11 17 33 10 15 25 61 31 25 14 58 112 37 18 29 125 5 1 0 0 5 1 3 0 0 16 IL1B 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 1 0 0 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 8 0 3 1 2 3 6 1 0 0 0 1 0 0 0 0 0 0 5 POP7 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 1 1 33 0 0 0 0 1 3 0 0 0 0 0 0 0 0 0 0 HLA-DQA2 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1 0 1 1 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 0 7 9 1 0 6 1 4 1 0 5 0 0 0 0 0 0 0 0 0 0 CD1C 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 5 0 0 3 3 0 0 0 1 0 0 0 0 0 0 0 0 0 0 GSTP1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 3 0 1 0 0 2 3 1 6 5 1 3 1 4 2 1 2 0 1 2 0 1 2 0 1 2 0 0 0 0 0 0 0 1 0 4 1 2 0 1 5 0 0 1 1 9 4 5 7 2 5 12 7 10 18 0 0 0 0 1 0 0 0 0 4 EIF3G 1 1 1 1 2 0 0 1 0 2 0 1 0 0 0 2 0 0 0 0 0 0 1 0 2 0 0 1 2 1 3 0 1 0 3 0 0 1 0 3 1 1 0 0 0 0 2 1 1 1 3 3 0 1 2 2 0 1 2 0 1 0 1 2 1 0 1 1 3 43 0 0 0 0 0 0 0 0 0 3 VPS28 0 0 0 3 0 0 0 0 1 0 0 0 1 0 2 0 0 0 0 0 0 0 0 1 2 0 1 1 1 0 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 2 3 0 4 3 0 1 0 1 38 0 0 1 0 0 1 0 0 2 0 0 0 2 LY86 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 2 1 1 0 0 0 0 2 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 2 0 3 2 3 1 2 0 1 8 1 0 0 0 0 0 0 0 0 0 ZFP36L1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 21 0 1 0 0 0 0 0 0 0 0 0 0 0 ZNF330 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 1 32 0 0 0 0 0 0 0 0 0 0 0 ANXA2 0 0 0 0 1 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 1 3 0 3 1 1 1 0 2 3 1 0 0 4 1 0 4 1 0 1 0 0 1 0 0 0 1 1 0 2 9 3 1 0 4 2 3 2 0 6 5 1 5 1 22 10 9 1 3 3 0 0 0 0 0 0 0 0 0 4 GRN 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 1 1 0 1 0 5 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 1 1 2 3 0 1 1 3 6 1 0 2 5 4 8 2 4 5 0 1 0 0 0 0 0 0 0 0 CFP 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 7 1 1 1 0 2 0 2 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 3 0 0 1 1 0 3 2 4 0 2 0 1 39 1 3 5 1 0 0 0 0 0 0 0 0 0 1 HSP90AA1 2 0 1 2 3 2 2 1 0 3 0 0 1 0 0 2 4 0 0 1 0 0 0 0 0 0 0 0 3 3 1 4 5 1 1 0 1 0 0 0 0 0 0 2 0 1 0 1 3 0 3 1 0 0 0 1 0 0 1 1 3 1 0 2 64 2 3 1 1 1 0 0 0 0 0 0 0 0 0 0 FUOM 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 LST1 0 0 0 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 3 6 1 4 8 3 5 0 7 13 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 17 8 11 18 13 36 17 12 27 12 7 7 4 8 10 4 2 6 6 0 0 0 0 0 0 0 0 0 7 AIF1 2 0 1 0 0 0 2 1 0 0 0 0 0 0 1 0 0 0 0 1 5 7 6 5 4 3 1 2 10 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 7 12 7 6 32 33 12 19 18 29 6 7 1 3 11 7 9 4 1 4 0 0 0 0 1 0 0 0 0 5 PSAP 0 0 2 0 3 2 0 0 0 0 0 0 0 0 2 0 0 0 0 0 6 5 1 5 3 2 1 1 6 4 0 1 2 0 1 0 1 1 0 0 3 1 0 0 1 0 0 1 2 1 8 8 6 2 9 9 10 8 5 10 1 2 1 6 6 4 4 2 2 7 0 0 1 1 1 0 0 0 0 1 YWHAB 0 0 0 1 1 0 0 1 0 1 0 0 2 0 1 0 0 1 1 0 1 0 0 1 2 0 0 1 2 0 2 0 1 1 0 1 0 1 0 2 0 1 1 0 0 1 2 2 1 1 2 2 1 0 50 1 1 1 3 1 5 0 0 0 2 5 4 0 1 3 0 0 0 0 0 0 0 0 0 1 MYO1G 0 0 2 1 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 2 0 1 0 1 0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 0 0 1 0 0 3 3 1 27 1 1 0 0 0 0 0 0 2 2 1 2 0 0 0 0 0 0 0 0 0 1 SAT1 0 1 0 0 0 1 1 1 1 2 0 1 0 0 2 5 0 0 0 0 4 15 8 5 4 2 8 2 11 18 3 0 0 0 0 0 1 0 1 1 0 1 3 0 0 0 0 0 2 1 21 25 6 10 26 26 16 15 11 22 10 5 5 16 2 3 16 3 4 5 3 4 2 6 3 17 3 6 4 3 RGS2 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 3 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 2 3 16 0 1 11 3 5 4 6 8 1 1 0 0 0 1 1 1 2 0 0 0 0 0 0 0 0 0 0 SERPINA1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 6 4 0 2 0 0 1 0 3 3 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 1 3 4 5 5 3 6 1 1 0 3 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 2 IFITM3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 5 0 0 0 2 4 1 2 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 4 1 11 9 2 5 7 10 0 12 2 1 3 4 4 0 0 1 0 0 0 0 0 0 0 0 0 1 FCGR3A 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 6 2 2 1 0 1 2 1 2 6 2 0 0 0 0 0 1 0 0 0 0 5 1 2 14 4 18 9 5 11 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 LILRA3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 3 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 S100A11 2 0 1 2 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 2 10 4 2 2 2 1 6 5 6 6 0 0 0 0 0 1 1 0 0 1 0 0 0 1 1 0 1 0 0 17 13 1 2 9 12 14 8 7 13 5 4 5 3 11 9 9 4 5 2 0 0 0 0 0 0 0 0 0 1 FCER1G 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 6 3 4 6 1 2 4 4 9 8 8 0 3 1 2 5 6 6 1 6 3 0 0 0 0 0 0 0 0 0 12 12 2 4 35 16 24 9 9 30 8 8 3 3 13 8 7 5 8 3 0 0 0 1 0 0 0 1 0 4 TNFRSF1B 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 3 4 1 2 1 1 0 0 0 0 0 1 0 0 0 2 0 0 0 0 0 0 0 0 0 0 IFITM2 3 0 3 3 1 3 3 1 0 3 0 1 2 0 1 0 0 0 2 3 6 4 0 0 1 1 0 1 3 6 8 2 3 5 2 1 5 1 3 2 7 4 2 2 5 1 1 4 1 2 5 10 1 4 17 8 33 8 14 19 4 7 4 3 2 2 0 1 6 4 0 0 0 0 1 1 0 0 0 1 WARS 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 2 2 1 1 0 3 1 1 2 0 0 0 0 0 2 1 0 1 0 0 0 0 0 0 0 0 0 0 0 IFI30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 0 1 2 1 6 1 5 6 6 0 3 1 1 3 3 0 1 4 0 0 0 0 0 0 0 0 0 1 MS4A7 0 0 0 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 1 0 2 4 3 1 0 2 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 C5AR1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 2 1 1 3 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 HCK 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 1 0 3 1 2 3 5 0 1 0 0 1 1 0 0 1 4 0 0 0 0 0 0 0 0 0 1 COTL1 0 0 4 2 1 2 0 1 1 3 0 2 0 0 0 1 0 1 0 0 6 15 2 4 7 3 6 0 4 20 0 1 1 0 0 0 1 0 0 0 1 2 0 0 5 1 0 0 2 0 9 20 9 3 6 9 91 11 18 18 18 2 9 11 12 11 7 5 4 25 1 2 0 3 0 2 3 0 4 7 LGALS9 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 3 0 0 6 0 0 3 0 3 0 0 1 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 CD68 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 0 0 0 3 0 1 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 4 1 0 4 3 0 4 2 8 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 1 1 1 RP11-290F20.3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 4 0 5 2 1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 RHOC 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 2 0 0 1 0 1 3 1 1 2 0 0 0 0 0 0 1 1 0 0 1 6 0 1 1 2 7 2 6 3 2 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 CARD16 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 1 1 1 1 0 0 2 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 2 2 0 2 2 1 0 6 3 6 1 0 0 1 2 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 LRRC25 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 6 4 1 0 2 0 1 1 0 0 0 1 1 0 2 0 0 0 0 0 0 0 0 0 1 COPS6 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 3 0 1 0 0 0 0 0 0 1 0 0 26 0 0 2 2 1 0 0 1 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 ADAR 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 2 25 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 PPBP 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 43 41 36 55 58 54 66 34 30 6 GPX1 0 0 0 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 4 5 3 5 12 1 15 2 3 1 0 1 0 0 0 0 2 0 1 0 0 0 0 1 1 0 1 2 0 0 5 3 0 0 1 1 0 1 1 2 6 7 2 6 24 16 28 3 6 3 18 8 12 18 18 28 11 13 16 9 TPM4 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 2 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 1 1 0 0 0 1 2 1 0 1 1 4 4 2 2 2 15 2 1 3 2 PF4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 14 11 14 18 23 62 9 14 6 0 SDPR 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 11 3 13 8 8 29 3 6 5 2 NRGN 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 1 5 3 3 2 7 3 1 1 2 SPARC 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 3 2 2 3 9 3 3 4 2 GNG11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 5 9 10 7 23 12 6 11 1 CLU 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 5 8 11 15 6 4 3 5 2 HIST1H2AC 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 5 5 2 42 2 1 2 1 NCOA4 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 2 1 1 0 0 1 0 0 0 0 0 8 2 0 12 8 7 3 2 6 0 GP9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 3 2 3 11 6 5 3 0 FERMT3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 2 0 0 0 2 0 0 1 0 0 1 2 5 4 4 1 6 0 4 0 1 ODC1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 2 0 1 0 0 0 3 0 1 2 1 14 2 0 4 1 CD9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 4 4 3 4 3 4 20 5 0 RUFY1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 3 3 2 3 2 9 0 0 1 0 TUBB1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 3 5 2 14 32 2 0 8 0 TALDO1 1 2 0 0 2 0 0 0 0 0 0 0 0 0 1 2 0 0 0 0 1 1 2 3 5 1 2 0 3 2 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 1 0 1 2 0 0 0 2 2 2 1 2 1 0 0 1 3 1 3 1 1 2 2 0 1 2 1 10 37 0 2 3 TREML1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 2 7 4 0 1 3 5 2 NGFRAP1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 1 2 0 2 3 1 2 4 0 PGRMC1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 1 0 4 2 6 2 2 0 0 CA2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 3 1 4 1 3 8 0 13 2 0 ITGA2B 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 1 4 2 4 1 4 1 0 0 MYL9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 3 4 8 1 2 0 0 1 TMEM40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 2 1 2 3 0 PARVB 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 4 1 4 0 0 1 0 0 0 PTCRA 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 4 0 0 20 2 2 1 0 ACRBP 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 25 0 3 1 1 TSC22D1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 1 0 26 1 0 0 1 VDAC3 0 0 0 1 0 0 1 0 0 1 0 29 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 2 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 41 0 0 2 1 0 1 1 1 GZMB 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 27 2 1 10 8 5 10 7 4 11 3 0 0 0 0 0 6 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 GZMA 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 5 3 4 10 8 12 10 3 13 1 8 2 1 0 0 0 3 3 2 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 GNLY 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 0 15 3 29 11 22 15 18 18 10 0 0 3 0 0 4 1 3 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 FGFBP2 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 5 3 9 2 6 3 6 8 2 5 4 1 0 0 0 2 9 0 3 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 AKR1C3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 0 1 1 0 1 5 4 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CCL4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 5 3 1 0 3 1 1 2 1 1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 PRF1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 1 4 9 7 10 10 2 4 7 6 13 0 0 0 0 6 0 5 3 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 GZMH 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 7 1 0 3 1 0 2 6 0 0 0 0 0 10 0 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 XBP1 1 0 1 1 2 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 2 2 4 1 0 2 1 3 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 GZMM 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 2 1 1 2 3 2 2 6 2 1 0 0 1 0 3 2 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 PTGDR 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 51 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 IGFBP7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 4 0 0 3 0 1 7 4 0 3 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 1 3 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 TTC38 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 KLRD1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 2 2 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ARHGDIA 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 1 0 1 0 1 25 1 0 0 0 0 0 0 0 0 0 2 0 1 0 0 3 2 1 0 0 1 0 1 1 1 2 4 1 0 0 0 0 0 0 0 1 0 0 0 0 IL2RB 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 2 1 1 1 0 3 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CLIC3 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 4 0 1 2 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 PPP1R18 0 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 2 0 0 0 0 0 1 0 0 2 2 1 1 1 1 3 0 3 1 0 1 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 CD247 0 1 1 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 1 1 3 0 2 2 0 1 1 2 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ALOX5AP 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 2 1 0 1 0 0 0 0 0 0 0 0 1 0 0 3 0 2 1 1 3 1 2 1 2 0 2 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 XCL2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 2 0 0 0 0 1 2 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 C12orf75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 1 0 1 0 0 4 2 1 2 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 RARRES3 1 0 0 3 0 1 1 0 1 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 7 3 2 0 1 3 3 5 0 1 0 2 1 1 0 2 2 0 1 1 0 0 0 0 2 0 0 0 0 0 0 1 0 0 2 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 PCMT1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 2 1 0 58 0 0 1 0 2 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 2 0 1 0 0 0 2 0 0 0 4 2 1 0 3 1 0 0 0 0 0 0 0 0 0 0 LAMP1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 1 3 2 1 2 1 0 1 0 1 0 0 1 2 0 1 0 1 0 0 0 0 0 0 0 3 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 SPON2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 3 5 1 3 0 0 1 2 0 2 3 0 0 0 0 0 3 1 3 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 S100B 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Seurat/README.md0000644000176200001440000000233315056057544013010 0ustar liggesusers[![CRAN Version](https://www.r-pkg.org/badges/version/Seurat)](https://cran.r-project.org/package=Seurat) [![CRAN Downloads](https://cranlogs.r-pkg.org/badges/Seurat)](https://cran.r-project.org/package=Seurat) # Seurat v5 Seurat is an R toolkit for single cell genomics, developed and maintained by the Satija Lab at NYGC. We are excited to release Seurat v5! This updates introduces new functionality for spatial, multimodal, and scalable single-cell analysis. Seurat v5 is backwards-compatible with previous versions, so that users will continue to be able to re-run existing workflows. Instructions, documentation, and tutorials can be found at: * https://satijalab.org/seurat Seurat is also hosted on GitHub, you can view and clone the repository at * https://github.com/satijalab/seurat Seurat has been successfully installed on Mac OS X, Linux, and Windows, using the devtools package to install directly from GitHub Improvements and new features will be added on a regular basis, please post on the [github page](https://github.com/satijalab/seurat) with any questions or if you would like to contribute For a version history/changelog, please see the [NEWS file](https://github.com/satijalab/seurat/blob/master/NEWS.md). Seurat/build/0000755000176200001440000000000015117330550012614 5ustar liggesusersSeurat/build/Seurat.pdf0000644000176200001440000241665315117330550014573 0ustar liggesusers%PDF-1.7 %ÐÔÅØ 2 0 obj << /Type /ObjStm /N 100 /First 828 /Length 1775 /Filter /FlateDecode >> stream xÚµXMoÛ8½ûWð¸=¬+ê[@Q ±ƒ´‡´ —^‰‘ÕÊ’AQmÚ_¿o”– ½¢?²ÝCF#Í{œ7Í™Ç"&,fÜOYÆxâ3î1?NXàa$dAæá, ðVÊ¢Ðg>gQæÍ|ŸÅIÌüˆ%ø‡³Ô ™Ÿ±4Œð-Ë0,Kà"„[¸ Æyˆ+üûqÌBîÍàÃxŽp<*âx( †xìƒl€kŒ+ü%àÁ_’âþRP‰á/ó£Y ŽœÄ®iÈås8‰3\Á#Á ? ˜€;(ú!œ& fÃ9Kh: •rŠE4Ká/ÿþR¼ŸÂ_†É¦ð—4MÍÃt3 ød˜²OÏ ® “¥ˆ¾ãÇM̸ç#(…± # ;¢Qàõ ¦ÐC‰ ¦à“ BÉIÔÇWÐ#H1;§AFá‚&A–†3UB]B i:¦‘Œ…>Ô ƒDXHçP(ŒH}HÆã;)nR¼‘ÂÄOf “ŒFà9%Ð$ HaA¬È'>P+ ’yB~h‹•cJQä*ãÊqHŘÇOÂCw$‡jQÓ<§1襄žR†þŒãƒØ£ÈCºØ£¼I)M8½“á&Ä>ˆÉpÈ“lúÅ>aAÀ8 ,L;Æ´â¸ÉÂÙ›7ìõš½¾îî:özÉþZ=´óµd®æ«2ï7ó]^|Í+1ç¯ØÛ·³¿>IŒ¿ä³çyk2‚Ì@F’ÉÉ(2“Ù鱂ÌWýXß¾šÄ¿(Ë‹ŸõvP›•è‡FõSàdJmÆÇŸdj2[Íjä²!³Òt{ýßF¿Ò;¹ÜtåЈuÑIq‘2~4(B‡¬Ð¯ÈCQ¨*)ª\‰«Ç}_w­¾ÒFj¨Ê–c»"ó¨…‘vDz¾‘\ëàÕ›N®Åï)š¼w+Ôê oìY›ä1ÙRè`冔‹EÛ)ç‰ÍüVC«‰ æéÀÏûùB4Í2W9…bÞLaNf¡ñm–6›|/.Nä_ ô<‡WëŸçX·U#ˆ"òWÈz+Ú“YÖZ‘Ê^>S÷rZèÉ™B ´?7ß~—Ë^ÌßEײv'0ííú&õ˜Ð¯¼#‘¹Ö¯tZ#³û>ÿqÒÚ2‹vdðãEëh¨H™Û¦SNœA+±M2·¬;á‹Au·]ݪuýSFRÚ×­¾«mL“%?UÐoBbë:¡~~³3çÙõ§ªæe.‹®ïÛ‡F \zWÈ/í”*ìýdÄ}¯£ñ`¯BGè!Mò4¥.¯ïÄ£ZtM'ôÆt¾Ó°v¡½éÀiÐY\´å§M­„©™h LÁCòIWíÚv¦¬Ëj,JýJPV õsåÈŒK»’”vRL•¢Þn3¦²eoñäS‚â¾Bж'lÀ‡'`x>ØÙ/ìýPüÝúr¨›rÑ ½òN ·ÜƒfÛhÊ ý8heS¾³É‹,>ÔÅF<ÕØsH|Ðc¦IÎJ<¿È›âVH5Èûu]MÁ/´‹FCÝÚSUö~o—ÃÊ<4h—þ]†N¥1ØjþŸzåšG/nrUl³6+íÆ&ü¤Ý´ï¢˜W¢“)´™Û‹¨5«ûˆ×aW"þå'¯ì¥ú¿ƒ./å„"¥~Ï'ã‘ád2GTï[%*é,… m.l=•}ÜgÖ4ªÄ‹ÅÓé £{¯Ð.t¿S?_=ë&Ý,а.îpÒÍ©özÖ…®C7+ q#¯‹\¡,ž kfhâü¬À´ä»ó€„k½ÚÙÑ;4ù®WÛ{Q–õã šZHw­élè\§wo7a[]ò„}êÞ;1|´›ÉF¿"Žë~s_ïDQ‹ÞôŽ(;²~ü/3XÛg”Â&ÕŸßiN8“ðÎùurYo×»¦V'ÌÆ,£¥}¦2³1ÑU.Ìí}Ý jx¤€Ñ·¶Kß~ëz¨âv­’yÿ»;RÑÉΊÛÙ¥LÚ{ˆiv”½ë›°¸öz)Pîø«$yŒÎ{•|11Víá¿( Fv¨xc#ôñþ *ÃùìöêžóLúQ«úe¯’8Ø¡Oì¶ËºW9]'¯½nÐ$ÉÔÞn´Ÿ5µÓÈË+ÑJ4ˆ+×ál©W©Ù›åDk¸:ý¼µ¬…úõƒŽ °¶»o÷/9.„í;è½Íw‡¶ú7‹=µ·¦¤9F̸?5&Û•(‡âØ gÏùÊޭɹçä^!…·y#Ôôét/É {¥(»råö6ªŽS—Ý1Áº—kÕ©ƒZugþ²sÕÜwß]¯´‹{íçû¾w7"ožÍVyc‡¢uú[/Oð6®°å«Ù?˜{Ló endstream endobj 203 0 obj << /Type /ObjStm /N 100 /First 878 /Length 1603 /Filter /FlateDecode >> stream xÚ½XKs›<ÝûWhÙ.>Иét&µóp&i3q¦ÓE7Š­ØL0¸€óø÷ß¹4•kìº]XBÜsî=—+‰À ˜ÇO1Îñ²P°À÷˜ïãÒ÷™Ñ5~³|‰Y ÿãõ¼˜ ñ `"ò{AÀ™T®SžB¦¢φĿÏ" \°H„ø—,"üG,Ž0ŸÇ„‹D€N¤zàÌç0…ŽòÑ ™/8F$HŠ0F,e R0_q‘ÌDèÄ@°)X=?öE/Pä.‘W äEÔ ÉC\…ä’ˆx\áqrVx° AX!¥X¾A„ŸŠâ^@žDæD¸qXèG4èÉXâ*ö÷bXÅûALÃè ̃Çt+F´ »ìqÄ” ðå$—ôð(ã|9$ã qçÐŒ‡àÂ!qNªÅ’F`9Žitó Ьð=X†r§[0!(êÚ Žˆrˆ'xÍÅgBÂ/…„ä4"™P„ …”°¬È""BÎ{¶ ’ âHDƒCAA²Ãtyà3éqè„4"™ôDèP´  ¤ÃK&A¼Ç¡ X`""…lI «‘2Æd((Uø#]eHèPPFõ,ÇœæÄÈV‚uåÅaacªNr(ˆ Â T䇂H1<NJ:|S!AŒÑÁ}â¤(%(j*„eÁ"ê½ÏÞÙ»Óü&gï†ìÍõ]Ö?~Z~ÑEßË>|è½ùÆC…_øÍó¼cjž¨YRó…MMñv£¥]V×ùãx¢S³ÉÞ‰5PRSQsMMNÍ#5cj&v^JÙ‚v58e•™ºJòl'Ð+jÔQ3¢&³S 5³ÚYk ¾‘XÂY /£«Ua®Ò¼jåc\›+‹c,³ÔâT[qíª2ÅžPkñ®\ÿÛt6Õd~mÊdºÒi¹¹²sycÕ¨ƒ9µ¼ÍËä$…¯ã4™š±ùÞŠœX;¿øbÝM]ä&uï{r6=JÓK]Ü›¢ÜŽœYÛG¯n.›7ˆš{—\ÙŽü±H¦3óK¦e“yÞÇG Òø=³è{¤¾u.sõÍ»{sS謼3ÅA]¹qig6ÓîÜXïÍ}®Êj‡ XñWn ê¤û ÏJS<˜éŽy7p•*]À{9ý£¬Ü?ÿuÆí¾½#r¹J«ä2Ÿêô“IfóÛ|GÌ•[¸{#·óšùÉÒJlüêÜvŽËÎ,€9^"ctš>cבèÛÔ¼,d9ŒíŽd-Q´[mŸ×6-î¼ÛfÑq­ÜæÓêö¥0ìäÄÊy¥L´#ïYEÿzÜWÜ WžNsÍÚ÷¨¹ÅjªéÜ ÖlÛÎ4/ºò½¯ýëUÚ?5ùy‰½)õ&MGÃí¸µ ×3Ÿš¯Ô|óyýЩõµ~òܪ̟ؔSvjó‚ÔUx¸Ù‡SS•¥~ÞÄõÔÝÝYØÒ²~nµ:ZhD~ÛnÍüÈG³Ö÷ÿlGG\šl¨+Ý•Ìî ×н«[ýÜUw Òe+ÝŠs“”åÊ ò¼˜&™®ð~î ÈÅkT_Ù)ÍÞ£Iç©û¦k7€åaÔüY ¯ 3M&$jÙÕ™•ðÊ-.G“6Ñ[êÏi¡—óþõT—óþ$Õe;ɆÕÒV ÿ,dêl[ÑòÕr…I[È Xn¥\ºR®÷éŽgâum‡ãC2é~’>ÓÅ"Ïž_ùpæ®L éù ßÎòS\ä8ÚçE+—ÜÝË×öÆÚ¡>ß²8»ù<4‹ÕS+RýŽ|¶…ÌXÿkžZ­žañ_èe»g–ó¦æ/[¾œŒ²»¼?Ü´®UgvSqâ*tg£ÒTž%µÃš6zåƒÏè _}êås˜,¶¢mZ-‡6ñ;¢uñoâá|~y1MÛ"Ýõ½3Ý×b‹y¼¸5S,’³ò‘m¤nÝudmyœm©ç–×…~n9ÑîÄé¢IïN§ÜßÎücS½¶˜ý•ÓþØ]Æw]×·~Ç…õ\Û—i¡±Ÿy0/Gç­ob¶á “Þ°Oyp÷VÛÏÓßÓ~¯•§€ûU«ü.«‡ƒÕ¯s=¹W…~ÜÄæÜèÞ’«\ù_±Ý%‹;c*w-»6-vbô{´ÿ§|ÕÁ endstream endobj 404 0 obj << /Type /ObjStm /N 100 /First 878 /Length 1678 /Filter /FlateDecode >> stream xÚ­XMsÓ:ÝçWh ‹WlËòÇ ÃLHi)ÓtB’Bl[¤¦ŽüÑiùõï\Sd”±XTQ%ûœ{ﹺ’ìZœY̵|æzø ˜-æÚ6³¿sLÛ‚9í¸Çœ Àoȸƒ_š³ðœÃ™ë:×q™°hÜg¥߀ys¹Í<ïs‡ùôÌ÷iÜc‡wyÈBÂq-¿œÙ–ãO\×e¶mºŽ°Ñ‰Ž sñí¼Ãl ]!ÐxXxÌ&]¢#@èYäFÀf ¦z@öà¼ëÙsaœdŸ¸| ûd¾d?Ä[¾ xÀYÈ¡3| ‡€w‹9–ö€£#‚‰‹À9½øÌ±9p2„#¡y"°œÃ‹‘å€wC„Öui*Dò%¬ti^/fÓ‹¼–Û2ªÓ"?±_²7o&/¾pßßÿŲ¬ÔÔ¤ÔäÔÔÔ,¨™Q3¥æBŸ•Ôl©)©‰ÔDªðò—½v]:³Ù´Ï’KjÅú“Ú„qšî†1N•1;F´‘Ù,kªZ–•«ul£<Δem¯¡¦ÒƒÒÆ£à\0Ïc\˜D2ñÈ{YF[¹Š‹R™Zü{ÝðHéÚŽ­¨‰{ûˆ4p¦ùLY1à[gý¢H”ƒ™âô­ˆÛº9Y6ÙÉj¼Ž2#_¡\jYlj,jn¨ù‚Z¥œÜ÷¤qûof6cšçÅãEžÈ‡±LUr5û¨/¯DEæÁÌ6²|ÁôQ…½«\ý¨;YnåÉj¶žVUÔ‹½Óqºâw¢˜éù[©&`žË::“QÝ OªLj‘ÎÔXW‰š£qKóyô`¤è邸`Bz€Ü°»Lãa¼‡©êªLld«âh/ß#F†Zr@Xékq¯ß÷Äíh}ùÅy:ýîKuÚ0VæE‚•_?~–éö›ã2‰ªÛ“8‹ªÊÈ[¨šv°ðkµc|V¤J‚Ûnó¤æ?es¦ ª­u~}¹¾¨ä÷S¹kÌ u­¼^««RÆ|WáJ…f ç®(*›¢<–+“»½¸<×ç«+:²¯úN'&¤º8/£ýí0X­pÎõSW›R·ì_ÛÇiTGFü1{†’§[)Q?'î«t{.sÙ+ÈÁý`¥Ks®oÅr@…,c™×ÓMq/D]}ŽuäZYÐ%Âý@µ|bÃáø©6¯dý‡¬gå#Å[?jrˆrñéN².¥9Gå7’µn‰4ó#BˆËƸë÷p­ß7Ï< ,Šì<ÓÂìnC™ª†¿]÷ƯXâyÊ‚çpz$)“4®'“…št;ªžùãÎ#`ÛG¥|[¦ÉV.åWYÊ<–#x»«Q7öVßâ}),U﫞Ý Š‡ô‡¥†]¹Ï´£;0ááx–æÉ<*ï ÷ý>èƒÓß™~ìIôSUyp}ªy?-:òmf„Eÿì³Ì¢,¾É¸6í/)-È7EÖ¥âÈ]剧ÿûÍXš¡;ÃR&Mü÷4zF'Ý•o´¶Fþµ¶×óéâM¹V™Þœ…§’MRlšìîÝþ”U5ä{wdlTX µ[4ª€¶ ê:‡ïõ5Ñ•¾£QXFIÚT'«,M°éï3l©OHõµ»fzá;ØÛ¿øåÏW&^iüX5ŒGÂfEQ&iÕýgµ#ø¿ ›©0vÛt¢—½HOI”¸ÿÈ“¼ endstream endobj 605 0 obj << /Type /ObjStm /N 100 /First 883 /Length 1531 /Filter /FlateDecode >> stream xÚÍX]Ó8}ï¯È#<ìÇ_‰„J†¢Tš2âÓšNÔ4)I 3üú=Î ¯&‡AÚ}¨ë:Î9çÞss“TÄ,Š#§#øÊ"óH$"<Å7a~‹ˆâ˜ 2¢)Ö“8b ë ‰¸LðÍð¡‘ðHR‰yÉû“,Ê-he {(~ >*0¡fEb’b…Å!ÀÐA’ 8$ŒL˜%f%Å„›=Ðɬpe+Èœš siV€,V…„ì#šU‚fȱ„ƒ,6!C#ˆ[ÂAFRìƒp€8“%)Øá C EÖ%d½T8ÈLQJ|X_‘@g SÄ-‘k–™=pÇÈ„ƒœ˜Ì‹Íp'F3ä°§¯hN)öÀAÞçrf²Šç¨g ¹€{)>ÜTwŠH¸ÈRL€ŒLLž?žåѳ‹zUGÏΣ'Ë/ÕÙR« ‰?ž-åÙ ?#O£/&O>!{øÈO¸f–fÐfPfؘ˜!6ÃG3|"´ßzcþt”èÍyÿu¡ë·m]=’ôÎ]¹°'×fxk†Öþ¬ÆõÍ÷j«)kn†½Ýºíϧ>4õgÝÏöºSÕ©Gê8˜¡±Ñ¶gþܰ·+¨ÜÚ¸î|­JýZ­»ºi©87ÃÚn-홯íÚÚJ«mxm€H½ÝëªS]QWD¥¶Öº,V~*ûYáªoDêtWß[>5ÃÎbßxuÕ݆"_Yé·ÃxïTU·]STÛPØwögeU·–ª±©ên‡™ªiõË¢å]ØŸ¥ì·¼tî ³åe±Ñ¹þÊ–Û²-ìšökæë ¶ÕtÙÖeý ¶•-‡¥ßíʑخ‹N·í:¸Û]Û°:{´µÃz¤Ë]?¶ºz8××BO¶ðmSó ®ñ‘Ë{ëwÅ£í”sß1w1^³%ÚÉ7=«£¤å=Má›=:óÕ0Wj¯gº,Û³|¶š¶­º;Í_Yþ½ÏêÔ•ÖÊ3[[3¿ÀœÛ=ÔÝ€ºb³Õ‹²î%¹kûp%Û‡?€½˜MçU·ûN>Ȱ°ê§ÖÚÊ/]W÷6ëþc5›Mi}3'`é¢Q‡›Ku(ÕºPUè…/ù`¼.ýµÒ¿[®õj™E5ˆêò<éÒ>º@Òh¾U(˜¾§ëÇ{¥šÝµjNÜGü• ÙÙ¥ü[W=ÌVܶkuСd=Ü­ß[½z˜§nTÕÎCij¿ž*K8dXÕÉ" NòËðâ3ønpôÆ2ö–òg_=òuÝè·j½Ë»F}?ÍçÀ´}gu|;»¹ó¯ÖïÌ?Ÿ–ÕÞœ­KÕÇ;r7Ã_V‰»«´§"Ÿ­LúR7ûÚûšÏ?)ûAž¥neÝÒ`=ÚpN=eåºÔëî—§×ZuÇFj¿r\½üÆó‡-=ío9úÕòPíü%þÄŸFÿD—ÿˆÿª‡ÿÀ_Í8ÙâôcØu÷þ¨ª®(u€”÷6Tå‹*\ƇxŽ:¨i?Ÿ.„÷ žsVï÷ªÚ<ŽÚ½šíýõÜí÷Ô­nô^?\ÏÊ>ók÷67À³ÓÝúæd­í|—×<°†~þ;’â‘EÆ2ù7šð y endstream endobj 902 0 obj << /Length 1189 /Filter /FlateDecode >> stream xÚµWßsÛ6 ~Ï_¡·I7›¦$K¶{[ï’&íÒK»íí¥Ûm´DÛLôÃ%©lùï´SÇtœv·—& àûDh° hðîŒù^ÌÏo‡YP’çIÌ—A’ädœÙhLFÙ(˜—Á§ð—(™„¬ˆRÞEˆ+õÓlþ5ãdú»èù{0”qL&Y– ¡4&4M‚~2$ù8³†.yÁë(…‹¨¹3IÆiÔÞý‘Ð$C{;`xLÈ$Or´Û³Éâ„ÆÎòoÑ${J´ÍSåø åOýŒÒ0#CBŸóAÑ DZ5>ºâ§ÍΣq¶†Y[)`“Ãe‹Ó4œ‰fUq+¿áUe¥w¼ikQ¨¯sÉU!ÅFŸ` aŸÐ¨šŒXÕsëT#Æ1`¼Ú®8”ÃðsÇ*Å¡Æ$=ØÍÁq-ÛªgWXê%TÏ*±¦´ëüŸMÕB= 4³Ð.íW}A¾Ø‘Ÿ~<·ÿÜñ¦è#C1ç3hÚÓ%ÓŒ¸BíÅw·%¸—•Ж§Oɯ`é`j—?Œ•¡Ö°Å–A§ ÐC‰ÇDÉmÄòa#Ñ`,5—É]¸UÛÉ‚«ý­9œiW¼áûqp¹ƒTýWU²­Ÿ‹¬–¬±U‚Õe×jÎT'y퀪ÞÎG¦ÂîóDÎ.Å}d®«r ËÆ”ÑS€ÈKÀÀL²‘ƒ‰’M©gÜíΠ|n™•§=û}‹‹I¹S|ï6àú4\jûãÒ-r÷›¹Ã¿ÓŒ&4ÎàãÊ8üÁ^2Œ4pœ8}wHË+àULILÓñÀÄcJXOãI²wñ@ãuÏþûÌ˾hÕÚqA¾rWçrbWÎ]>¶üÍq§¶uÃ\z÷áÊiF–Nœn &€ >¡2¢ÔK=ÏtǤó>w/:í¥Xa;O’ÄPÁ¯I|M"àë`O\"’Á|‡È'ˆœ¦±7è‹…ŸXÛ{*ùa%ô[`®êü‘4ÍR*ëÇ4YêVr+•ÜÛó4•"Ï>‚»öŽ/ƒÕºoÔ Þ©×s›Éï·å”m†7×Àì ûÕGfF:õ:M`zp£Â¯Ó›½Óþ ‚ñ¬µÖõj0PæTlAZ¹¨] ?J &‡ãù:pez­sµzÝ-HÑÖ^}_Æý¢[Mù§˜°•Zý×8<n ”ê¸úŒùvte)ðfÕŸr‹W èÿq(ÿÜ{³†st˜MÙ€_Ø5â_Ròûÿ)­‹f#ïÔI‡/º[»©ËŠ7¥:}æ}úõöbÁÄiz-vCÌ;¡Õ\¯ítVªž¯ÉÚ‰ægx޲<¼å…~ê)…é–’Ä4³7Gòº>R½^’EÕ)YŽ“)Z|ñþ†™P{¹,™Ò—]]CÍy÷±/éR(-7àªçë”ËNÃLã·n¶Ûlªïµ$ÎÞ„^NÒÇD=Õ[!£ä0Å©}FÓÜ7šªcD¹â~®0mրׯ)/ù=<ÇvEéÝX›YOKï¦(Xoÿ-‹á¿Âá(ƒêÉð¶Çöëìj~ö/¢®Šð endstream endobj 915 0 obj << /Length 582 /Filter /FlateDecode >> stream xÚ}TÁrÚ0½ó>Ú3±*ÙÆ„C;$MÓNhÓé!íA6ÂQ+K®$†ð÷•ŒÓX÷bŒß¾ÕÛÕîÃAààn4_Þ¼ÏH0EÓ<Ƀõ6 £4˃ !(O§Áz<†Iôcýq„{RdhŠ'AœL-=†ðZÓöéʺ Ø±§ãqiQRùi”Ü2üÄ´,ÅÉu¨,œZð-«•8Ë÷h9®eÆ‚ä‡YQÀµš?Gqš¦áw<ÆïÞú÷,$hc÷€¬¦c–Zã\ò¯÷ Ð–ÚÊK}ò}”LB¥IÚ’¶­8À˜PV.e»ÛB ‡•·²†¿kUkfŒÑÕl¹«Yù*J(=×lïÿ° UÛB]Æhâôz¹QLÂAêLJå³޼9Ò»äz°`Ïþ°,¾ f–W;AÆR zÞ®Óº?/Vð‘EÛM2«¬†—¡£[#ácME3CµL7J3¨›®•É`'Œ—#ÍVéæ’‹Q†È%µ/ד^ 7LxÙ\ ªáÕÊmêÀÎtì^nÕMyõêZ^~o×£?çøË~ endstream endobj 919 0 obj << /Length 679 /Filter /FlateDecode >> stream xÚ­V]o›0}ϯàm f „ð°Im—V›ÚªJY_ÚirÁ¡^Œ©Úüú]«òá6ÂKrï9>œ{¯md²ÎFÇéèË騷/™+]XŠ=%VìûÞ$L¬4·níÐùþ¡d¹áÔ÷¦ÑÄrƒ€a—T°ò —WN0µý¬íME}F!q­¤1ö€e)¸¿˜ãù"2#Ì1/H½›t1FhNZÖ{\#œÑ²ÄÆH‰ IÕz/Ž®S3Š(\Å”ôY ÇÕþ°ÚŒ¼KȘYl%I­„1$ë§Ü˜{¢o,8_@A£Z©$δs ·eq‚Ø&f3®Ç7Î4´I¦„4/T/7 CûEèÛWý{lûòüᛕy)Ê FNc³çªõŠHêø`;וÔ@%]’|Tv¡Œo¯Àgõ€Ít7wvt±60Gã•9rƒ±— €ÌQÐÏ)ý©“Ll±‰^Â[7BÈžgUµmò@Kï[Ôi3Z¾ò|%E½R¿'­‹;n(Ë/0wÂÀn0Û-OɆìÁ?ã47ç`Ánö_é©;݃þ/_¾c…‡Óí÷3"´#Ï/`ð¥Pd7ì…^¸‡òÁÞ&Ž·ˆ?é”Í%»ò÷m-¤ª½yŸ¶FЭ׮\éu3­$䣤ãaæû`貘2ÖÔ ¸xq8×­¡×é+*øÒº#ìIN ÏÈá¤9tõ‡XÞ­gNïPÙïz³?P`½G òæ¹ÞO5ðJ’7Ù0†ÒN-›Ã0„ËårpUÑáŒp7¨3ÜŸM‡[Ü;nÙ×· œŽÙ ÍRÉþ~¢ÛfˆùÛæÀL ¾vÇ>œ¬~l‡Yµw¡‡/ýºÿÿž¥£š„ÔB endstream endobj 967 0 obj << /Length 1258 /Filter /FlateDecode >> stream xÚí›KsœFÇïúÜð˜~jzúßÝ"Náçòäluòæ­ N$! Õg‡p:¥AÈgµv®]áý¹úõÍÛ0Üù"XHÃô_I›Úc±kÔphí'dœæˆv.õ¹ˆoù,‚7ù0Â/Ã$Vsí­T°?Š}Ô_ãû°ÔDÊçFéLY•¦TísCÁ ÆööY¿L&‚„À*9ç÷ɉk<ê*ϧ.¼¢ãí>™•GA,VÇépõRu:3þ6Ë-¥¿=)ݬ€q¢˜¹çKBìA$ÉΫïøæÛ5¿I;Ú¾N—'εO ÝøÉw‡co, l$}j¯×§_Ë=ëÌÍBµ])?Ž&Å5¬”ìÃõCãùö¤«Ô2o4˜pÑŸÁÎþ_ÆǸ(´*2£.n·Zµm >Ç—œ½æçÿP¢G´îîM£—Êøy•µà'gªçCbŽ\*‘˜ëÆ€Ý>඘¿í^žЌC߬ RUUç™ÉÀŽ=?!â5ã;*áKxˆÑž‚fó>v̲.*eYÂ^Ö‡ "gm#çN6V.DMû!¯Ùxñhc,Úv›éVïä¥n:`±x.õP¬ nkÛÌî\_îb„„Ðéh°cgH9Ñ›1epU5à"*gÒG%}Ú4W–sS¸—åWPmlßÅM~ïcH çQJÝ,j¥³â‘”‹¤œ‚Ôx4Zj ùže:sê}ýáR密MÝÚè⪲çàP¤”ðxóÅ æ³Ë•sWÝš´©mÓ;ѼîGZàHWc2ø´^ÿ~SpÊ\Љ³ÆCÆ%&Ît¹.zÒ.”uÄcÌ‘™Þ!‹O7©Þ;ÝpŒ õYiUçj7—F¢ÉW'z8e|Ö•Õ:­ºÖ(Ý;Z­l ]Äóÿ­~À¿•CRÝË:ˆ½ÂéI‰½ãÄršUùÕàšNZ–˜p̦Šw_Êœ )wUfÔ]ĹkàÚ<ÚCàÛG½!“µXN‘,[õ!3ƒWðüD„/¸Ëq†ÂçA¡jÕÚÜ$Ÿx¡â(e8Î1©ž;ìA7dÜ×à<ÀYô^#€Fhâù1‰'@ïApº8MOßN…Õ§d®Â!)ã4±jé—|è-)ë¦Ì&[éÄÃÐpÛ`™®îzxTžXè˜à x™g´1â©V0^;ÁÃVÄÀ}–’Ê9¤8$ë.b¤©ªlÛª‹¾©òÓPÐ_¯ÁEìLU*Ûï>Uÿ”€Ñ&+è^—cCD^Úð¬¯ZrI‘È7ïÀ o²í‹{%'˜” yp’„³û«§Ç‹ÕÉ¿°ËÞ endstream endobj 806 0 obj << /Type /ObjStm /N 100 /First 882 /Length 2403 /Filter /FlateDecode >> stream xÚ½ZMsÛ8½ëWà˜ÄGãk+5UŽ3ÙM•w&e;©ÝÍø@ÉŒ­D–\¢<ϯß× ÚIÄ8²™ƒº›ÝL¢rB‰¨’pZD­„v½:á¶&aœG„I„> ëqßhA ÷1ß8ጛDã…×|? Vu˜ÑZÉ¡FÂï6ˆÄc…V Hc`ñ¡5?‚éZ{?‰ä…6 ‹PÚZ°t`I whnGGàÍÄ\ÚcKÑ90Eä@ w` ~<À&9DalrÔÂ,aC s¢ƒ¹¬™Äè1|ÈžiÀšÆcs1á)€ƒ-&“Vi¾C‚NXëRg+ëØˆ)Àð1M"–±Ññä˜(ÌG쬤¬ ëx@,Á„ðEÜÁ&É+x €‘àj d' ¾¥¨µHØ?%pNØ%„¡œ²ü“Žžàxçñh2V¸%CÂÅ@Ä‚Wšçp0M’ ÂØ/®'87q|8ÂãØ›÷0fºç(LÖŸ`¨„˜ æç@ FqÄ8,áqëE Îˆ£ÀîN¤Ð$ì6ĪÄQÍ;%Žk8¶¾‡q4ÂZ‰ˆcˆçÀ àûU©I"vƒå9lbÏsØXðCg âÉñ2sðÊ$_%d Ø\‚_G\‚«Rb_à5Ò0K˜<{&ª#Qýsu¼Õ ñäðýR]Ö›y½xuQŸ5òð´nÏålQ·­ÔOů¿Nžü‰€Ã_ø/Ë7—ÜÔÜl¸™—Ë7¯¸¹(÷θi¸ù…›Y™×ýÚvÍÓ!^¯«ÍŽT^—Ѫ›²mÅ|óÇôC3ûÎ:‹²D·ØÜL¹ùPö8Zçxï𢾼—‰¹Ùãæð®9/w±d{5m›Ü[ÎÎWë£æ›Ûìž¿*[jË–º½ÊÂgYÖ>/†]ÞÍÐþ;ϯŸ×ëÙê´yµ|¿€Éç«åv3låóœ›ë2ª ‹Y!uZžxUx¿/6»å­âÕU™·ÅŽÇ«Ëýf±ø&ßã‚йh¿,²(ÍvÔ—M½¹Z7÷~Y€û°¿*Ûo†×ù½™ŸOWëû,ô{Á›—÷ø¼ø£÷û¶ÕÖõ²}߬û ûNÜĺ÷CqZS~½wîò¦Ü°~Qoê‡|q×AõðjG›Íìü ž6‹™¦ÛüÇ»ètP¦wƒs‹-Þ,?óúíbÚœžÎ—gßäö¦0^ý·¢cýê§¥™”³!F—§õ¦9Ú?ÞkÛúz;˂ۻ )÷ï l[šºˆÊðú×ÓÕâ`Þnv$p}׫∃bŠv@GßÖëy=]4Y4¶oï ãü®÷{¼‡ Üï};oçWoõ÷^ô·ww9/ ^”_õ.ïn^ß<Âúf·õÿ~1¿8XÕ[ß•~å¿‹HÌËÊÅÀõ¾oËÁ(X”ï{r¾Iõ5RŠö'맯žÇ5†‡¢z9ßœ0ȳg“êøú²Õk$˜“jµÜ4ËM‹ÌÖðÌIuØ´««õ¬i»Z¡»õïæt^?_}ïnxdô!™“ Öx¹p~to¹\ê]WÑð²\Ð|î)÷.÷>÷!÷1÷©ë¹’áþdr‡r‡?©ž¯Ö§Íºã¢NªU¯ª}\ ¸;aö³xgc’979+ƒájÆH”äô³ül€XÌ—«½gÏ:üj¯Ëª£êÍá+þ{r¾Ù\¶ÿ¨ªÓÕ\®Ög•V¥i¬–Ó´:™§`·#Aå$qI¦%ŠÔh$Q°e¾î µ¯>ÈR#‰RÖI,…whw®FE©¹H4IrùomàE2ùÇäš:®VïÎ…¬T\¾f®^‰ÒñQ¸‚le”aÖR‰²Ü>„ª6QzÔ̱ÉE+êQ©ø@B ýq®- ´õ¢žvŒÛæj]oàõ@’¿@ÜÐ#§¤C¿3½³ùæüj*g«‹žéƒYjOÒ©$¬·Ò Ö·ÁÉÀ1 ö*øGeYÍÛöªiâq’Æñ ¤¥§$LôR;aÉHmé!_ÿrµœÿÕ¬ÛFž6=ÀéIICT¿ê“»Rœ./×ÛíünQÿùïÿDJÒ’–r83–W‹Åɶ¹…0OöˆHoÓ&¿Ä!(øè| Mæï]ŸLþ–¥ÂÍD‹7éæ"àT7Ÿ×xõz½š¡Ú‘X½~ñRTÇͧ͗§Ú—±v_ÄÚþÐAÜÛ€¿òÝ˸·Lpgoý®wÞNúz;açíÄÇÚοíº7¾Ú›w;æLüEµË}ŒÉ½Í=åÞåÞç>ä>æ>çNVå>ãÙŒg3žÍx6ãÙŒg3žÍx6ãQÆ£ŒG2e<Êx”ñ(ãQÆ£Œç2žËx.㹌ç2žËx.㹌ç2žËx>ãùŒç3ž·9dÖ1Ñ Ù·¥Qw7ÒèÄï¡GFFN[©¢8Á%,€i{âËäý’?áÆ.w$ * ÊJgSÏAk‰hÙÎA«Ç'á’–N÷$^GÔ$ô$B’üÏ-…D 2F=@ÂŽ@ÂI!ô$ƒD?ÀÁÀÁq=ч¥C>m áG A¶«b §‘„‘#@êB8õ ›dHñ'“@)ƒD¹'aÊ0@b™p*HLOÊÜP`¦Ç'AÉI ¥/$ ]Áºí$ÌZEÑJÛ{ƒ ]AÓOæ´´ª×K‚t! 1‚^’KÒÄ^/ ÒåƒùÉ$(Hã{½$h—w¢mFmè*[$ˆë‚4äÆô¢M\u©½4#œ„äÁ¨^´ Òåâ€^šN‹äAÇ^´ Ò…cu€Ä¢m‘> stream xÚí›KoÛF…÷þ\’ *óâ<–Žd[êÖ°„ @Pcq,¥H•¤Zûßw†”cÊÎãÒnDši ’(|:f äŒaœ‹ô8Ï/tõ§Ó´©¬˜YÂ|ˆB&PÈo«,]š'Ùâ¸èœ¤tØ1"ä`z¥"…ˆOäæÎy+]Ô7¦ÚÁÆåž™\|*¾q¾©›öÚV ö ¢a”%˜rYÔ¦ú»õÑ´sTÑ9*åÔw}‘JEú5¿Rîó2§ ^èwVy%‰ïß ÍÀ 7y“]”m{>Õù¯&‹p¸¼u~àzö",«nÏ6fˆ6T…ÀAÀbt e¸Ý÷hUL”ßÛ’gÕÙÚº­Îóûmë7Ó×¹± îµÜ¢–ÈCÛáW áæzº\=%¼FGÚ/ÖŒq_¨>W®½|ÁA¶ÙÛkžõ®yêƒÁ.\fUk+wpó°ÌÓñ­.–nè1¿ƒ9œ·°¼øDY­tƒÑïÏLù®.‹c“çç{RÊ©cÐ ä¯g¦9®kí<õ>Šeâ§^]¡Ÿ¯ôÒŒ›Þâço~O¬ Šu·‰0Ñv„òmí/,”íØ=K¼1 Phac„=ÏêzcÆå¶üM³B7¦îF¢G£6«ç¸õj…ËʤÙÂù€‹³þ²ßE ʱg•^ß>ÜÀêÓëË`Sìr³—Ueòí8•Øg®o…ƒ—Áí•$~¬ÏÔ÷žêjÕÝ–tÿ|‚ÉÃÑê° vâ´í¶«_ºÅ¡·…À ÷³t]W€RÃtþÛĬóÍýTúNÍËpƒj_KûÓíZ”ùñò¡>ªÖ¦ïOÏ‹›r4·y¸×á!àôýÑ<œ.•gçÏæ‰ÄÞœ_F4ÑÐvË&Ùª£­„:ðöþ´¶€·²Žpw›y«nûÀ!§Túé±o²…ç~b6]ƒ’q_X „f}²z(1išK×ÌÛòg¤üù˜ñôx2?úÚtðJ endstream endobj 1155 0 obj << /Length 1160 /Filter /FlateDecode >> stream xÚí›QsÚ8Çßù~„¨%Y²üHÉ%—d¸˜»ëLçæF5ªã)Øœ0mrŸþ$Ûd8ÒKV.¹6µ^0Î+ócùkÿ»kßK=ß»è½^ô^È‹FÃÌ[|ðïHÀ¼¡#‘·XzïúlðÇâÍ«sÆ.$!E4з©.™ùó~)ëÃÖ|¢ç7Ë­1$„ŽO½!õI}‡Ëæ©¥œ sr7Àa_ªí`HíôÁ÷íAµú\ÛÃó­wÈÓׯþˆ{ÊœÖo¯/zÞ»a€Xttq}Ô/C„G(|ˆ;+òqž˜ó›BŲ&+±ÕÔ1‹¾k&mײ 5KÜ‚å™(Å! ‹Ñ/ĨW%’2ûdÞËx£‹Õ|U”ƒ!ç] ªDµax–­kŒQýX¿ïga<Îýîù€“¾åNÉ2!á‹ý]ÿ:K!‘ûFT›ÔǸT¤ŸõB¨{XO×íÈ×{ÜõëmŽqÞ¯Á"¬ÃVpµbh²Z4t6Nä„°ÞÉaYUÌ'㣼M¯†Ý à ½oŠ'“±N'üȉð ¨>$ž§Xçqú¦¨s(ŸQ¸ìÅ{m’µ+YMV»mÙT*° {Ë@Gv°çFµ÷2n’„»Ñ_Kdç²öÞJ¤2N %µ› ™cmÉdΧYþ±‚½4¶Ñè §NÑ[僅e-…X"ÿíŸq×±MÍOF3E³f;Îó¢*æ_æKy«Õšà®j†EìjÿÇ¡„';•±”µp¨Á0DͲ-"Ì7^˜bÞøz-6z™¨ëFÆqEüVæÙNÛ˜¨ó}>kÈfUŠ*yNÄ*.Õ.)MÉ.p6½qL,Ò«B­Å*û[šB5ÿöؾ‡ï¾ R˜;)Òßf×w±\Í‚dPfb³Éòtï[êu—ÕŠù—TwÝlž8¨Ãµ–*•£xRçzÛm3€4 Cär'ƒZ/3YŠƒ¾¸ioÕ›b‡åÙ^¥a½˜Y–Ï„vÛ”N6Ná +3ËnõÞ¨ã\e‰Î°âJw‘]tC1ocÆM½ãg­&•3焺jè’e¾5Ùé™ÙÇ&ËÃ.±Ó ËòjW¾Ô±¬òß«í1KoêÞÖ~Š”ñ.”E,è º¿N ÎÅåVþu&×éîÖD3éjÒa!°qÇ«}¬Ö½ÙBí#ù¹N6È¡\]í§ž‘뽞BDŒzY\(±¹Ñ*ìó—Ëø›fÏ äï«¥f¸T;oÆ;ž>Ÿð|2޳ôBærk&ƈ+”Zê4ÈÌë6lÒ< 7n¶Fsò©z í¸àªÓö¡JHŽà‹TTœb©·OL±+p|®ä2Kʃ¾Ü4´-k ר7BÉ×*[¦òZ~Jæ‰Vçðæ_f¦Æ ï Ì“Ž7¿6t¿Ü<>þ´èýÃÅ endstream endobj 1003 0 obj << /Type /ObjStm /N 100 /First 1006 /Length 2071 /Filter /FlateDecode >> stream xÚÍš]‹\¹†ïçWè2¹Q«JUú³°»ÆI ³öE3ŽwK–™e<†Í¿Ï[ê©îÓ 9Ëh°ç¨OŸ*=GU’ÞîZC ][ œq틆^RȽáJA3áÊ¡Á5‡Ú+®ø.îÚ»¯õ+Jð@Dp…Ç©h¶û)Pmã Ô©Z‰'éVÊ©±•$p¦ñœiV*µ‘•jàJ‚*¨n2¼·7¸O `«% ™¥X‰CÎÕêಒÕÁr«ƒ5äZ­.xYCK\ƒ$±:¸¡:üõ 9™^X$[½hÑbž3©ÉlÑ|Ò²Yd Ò‹d šúx®åã·MZ*êÈ-¨m{Ð’­IAëð,húžÌBÐøiÔ+9ªf!Ê‘ /S$‹Šf4N©Éê@#–&â‡Ò«Yh •’Y(…ÊbÊ¡¢9¬„.ÖÑ*¡ÛJ5Ô:ZR Àhg †Š¬ËJ­K°hT¬?0¬ÚhCkh”Jh½T+aQJVÂ@âã·C ã £Çd2dC/—+­¦Ç±Õ“Y`¼ÀI&cÔÔa3u¡8ÚL†UPÃÌÞ£&3cCmbfloÜ«ÕÅÇªÍ †6Û\Ç µwU°ý)ÖüÄöfu0°9ïÖ=„áƒjÆ?¨fxÀ‚oë!‚oë"›ðm}DÖ$\Ó0ÃgŒ÷a†Ú¸[7‘‡l „¢M^–aÖm[O‘AcЛ™9Ǩ¯W¯^]Þÿ÷—›pøöööîáêðîË¿Æç¿þtûŸ«Ãww÷?ÞÜH éúðçÃ_ß ñáêðÃͧ‡ðã5ÎÆ±¡QAL6·;îwÂs߆W¯Âá]8üéîý]8¼øåã¿o¢Ô?†o¾¹Â¿'„¨)ÖVεGªÏÌ -V„¿C©‘¤O Ú)±"$œ T#ÆÌ¢/€È+&Ì BrÄDû:„ÒæXÓ"®eÁ (Å‚”v‚ SÑ DÞB¼,}¤ðC8üýÿD¸‹±‘:j—pûå矯¿ö,âx¸h‰‚˜vñð›»Û‡ð¡#¸ ³7°ïÅ?ÈÍþ ¢s¥ñ.oïï>½»Á‹†ÃÛ×oÂáýͯáú²íÞâ}®ߣ¦›Û‡Ï–'†3k¢Ïw_î?ÝØ=dŒqïo7?þôñ»»_ÃhÕ‚ _;£™Þ~¼‡5@øøÜèϨ×VF3ò{!{áô°z¡x¡z¡y¡?Ø=³{f÷Ìî™Ý3»gvÏìžÙ=³{Îî9»çìž³{Îî9»çìž³{Îî9»gqÏâžÅ=‹{÷,îYܳ¸gqÏâžÕ=«{V÷¬îYݳºg=z¾~Úy…9…yušV9'™L«òôsë*®3Cm±õGûRŠÞgf@Ê!D„":é bAÊ)9ÇÞ7Â1· DYr Sl¼È)2Í ¤œ’z,º 1õŸB{Åòf‘4¶Êˆ¼¢iÌt†Ðž±"xnˆŠµœC¶°Hò3YQRìuQ°(3]!i¡X÷Ä‚õ16Üèæ „hDzÿ:DM °~“MúÂxˆMg ‚•Gì ÏlKÕÄŠ8Eªm—O©!§Î  Li5v=CH/Hª3ˆYTªb»h‚ì bÁì’‘7³ÝÌ QŠ"íq–ÅÛ‚‰!¹G®ç³ðÄ2Ù7¶[±1m²ÆÙQB_Ñ$±ç ç8K\}A|„M|Ù0îO¶Ï}AxÈëü~fȽ!™Î:cAxÈØ]o ZÁœAü%(tZ_‚B§í%(tÚ_‚B·„b·BWÒKPèJ~ ]‘— Ð-¡Ø­Ð} ])/A¡+õ%(tgŠÿqéF endstream endobj 1246 0 obj << /Length 1129 /Filter /FlateDecode >> stream xÚíœ]o›H†ïó+¸„ è|13\ºÎÇ:J*Ë8U¥ªŠ¦fÖecƒp7Ý_¿3ØÚuÓ(=ØN•Ípc°Œóøõ™÷= AÞÜCÞÅÉÛéÉ›sν$J8áÞôw#QÆ=qÄiâM3ï£?,‹€H¿Ñ›Mb¿>M/ßœ3¼s.C<œš+·g {È Úå…”Ë(ÁÌ ‰0§ÐÍAãJ¯Òáô–µ4—æþzÖœªF™ÏN^™qÒ™x`„üy_’Ÿ^:$ÝùDgëY’„;€ó][ÆìiÆøGÈ#ÃØÔi±[§%“αî9î*äÃøz06"ŽcW ÅÞ´9ˆv­×Yùy½¸;»_Uº®[sIàÜaÚ“–•åë:Jy¦Sý§ùCsÜ`À' /7Ñ*ÃèƒI0ˆ¸7Ÿ8My[â·CS•M()«,/T£kë¢ûˆ·[pÒAÁ·_bëu.kªZÚòo§·º¼¬íœÆ$þÿ*óçuÐi'„£¥šk#U»ZY;ˆ“u!»ªÊÏmMÕ·Kݨ¬mMðX8ûÓŽ»ÐKgj¡ÏcTÕ̤„¶©YšjÓÝ ‰d„ãÑ}0ݧz¾Ü¶‹Ûlkˆ&”¾Ê©¨CUè í„—öå›í˜_¶$ÜñY~oìŠýº¹·:}w÷ ÞÊû*ʺ©òbnûŒ®²,Û¢ªZ¿ÍMcGq.‰™ p*û¯oÃ¥è› Çżc/Ò©umƒI].Œ¤EŒû»oPÈàäö>ot]Ïlp{>-¿ÒÎX'ÌÏKcÁ/È{³†¾yU®W£lIl‘±ã¬;@è…‰z_Û%<Ãrý/i.‰«7»;0éB-õP/u”ÍtÈüA]ÛÆ…Ú$ÆP~·àÇåú a¾"Ïæz¼(#W;.×C‘ÃÂÉx8øaMh¿Öäg5Ãît®‹áp`æ9÷Öâ9cÄ}Q©Õ—+µZ¨Y®ìbD{wüOä9²òŸoE”Sm ©_Úš<°7@pßh>|Á@bÐëÜ”<Ñ¥s‘uwä Pìí#’úï­…V•m‘&(î¥ äL Nä:¿¯gjµ¹[m,6á}ýîV¿ †¢.+UÔ#㥱ìß~¬¡Žol FHôuúrM(wz•Žl a}@?†Ìc¨1I[¡³÷ˆ.€:Ÿ¦ïÎzÞ‡ó†ÚÀ›öÉúT¹h 2'©Z®úæÚ”ð8éÛP{¢æ0Ô6ĵ+Çt€ýAQ”vÿÛ¨Èô½ÓJï@Z€¦Çvéæ±`NIoýžùñíÊݦ´ÿ,€ ÚW3#^VúRÍlQ¹K›ª­.™Ñ0il_láfÏ‘·gÓ“<›ðZ endstream endobj 1330 0 obj << /Length 1614 /Filter /FlateDecode >> stream xÚí[Ýs›8÷_Á[ñL  „ú–¦—NÛ»&n^Ú>(Xqhøpß5÷×ß®$§¶ëæ —<\ðLƈe%­~Z–ÝÕ&pfNà¼NFû'Œ8Âq;“+‡OYìpBü˜ g2u>¹ÉøËäÍþI¯0“ÏBÃh–sµ¨eëÍe:÷fE®œ)ì7 ìd3y4Hüˆ‡Žr R;ÎÑdœP÷ i$t祹lš±±Àõá<Ù… ñÄ3ü·ùV¡ à7ð§Æ[Ó<{=r>yŒÄnÈ fs…vUDÑÔµ,›«ª.Æçtà÷‡šv…úL5‹¼EMt> ؼØ*Wi{Z¢ýhÕ ÌRV•'¨êJ¶‹ZÁˆ?K€{`™<–,à0ÿϘöS< f¼ &Ø‚u“%tpÚµqSe+a:’³õpã€í‚_³a¸ª¢åt‰:çd^nÕ ;~ÊËɵ*ÀPð0j¤ðË*Û1n¸As¬ZT_›Ýãhìó±=@ºžgSu®nïS\ì sO¤ãnHÏÁ‰“ùi!gj‰vñ ?°äU ˆ&áà|µGúvL8Ìó¬ýýÆÝ¯*Pçõx÷m\×ñ˜tsAL¢ø¬ó¥í`éˆ e«ÛÍâ²Q­P¤ª!LÄl¼ªóÑáŽa‰FøðîPÖi5öå©:-?4R)¦8th=/ ÞÄn޲¶ÕüHå9ÚÂw>ëþÉ8a+iÌ x¾èW½Ž~¨¿WÙìmó¥¶UØ‹d§ñ=U=êät|?1UõÚ7ñ>Ÿ´fª©Äqw-¶€ÚüFÂwvúɱ^Ï,½•Æz(üzÒ8Þe™·€,:ü±\‡öU1¹6ÎÜUÓiVÎðü™Òd7ºcË»ÿ}œÿX¶J¯0¬{Ä5µB˜= ÙàÜ0“Þ0ß+¾Eþ6k0µAùÎ}û©ûÆ»¥/.ÐË:“—¹ZñœMÊN±;WÝm·`ð"k²Eø^ÓqÖ5cdàÙ=,ë‹t¸Cúi‘þû8+ÞVÒzI5ÅÑÃ^€Fv;ó»ÈKcyù£„Î;o™oIöO[«ç~„ㅰÄ~OË©úf{o‚ æGq¸,=ùz-ã«ÉèvDtr_ÏFÂsÒbôéKàLááŠÄùK³…àŒB;wÎG~=X+šOV‹æIàÇŒ8! ýˆ“ÍŠø›+ác±Ò £,pÏÑ“…Nã(‡ÖÃS$⾄ÍÝxìV㈀†!ZÄÝ«ªÆF➃EÀz-l©ËáÜÜܾVeUdi£gߎ |ÆÃ>¸˜õ³-ÿ4À)¸Yÿ±jÒ:›c ûgª°ö ¼‘‰O“Ät?€`)Ze]Ï›¬EÊrÝ@»]ȈèùB 3C[W9 ·‡DáÊRæwMÖÜßN ³ú6Ï+SDhÕ•¹6K8a¨T幡ž½·5êv¡Ê˜ xÉR¿›&å…Q€˜ M\™:)*ôŠ¢Jtý mÑ(· ûX¸ÙTÙZ¼«;CÑ¢#Kfk ëy‡1ø¬©uªì¸$^+à©fªT÷0!ùª® ÃKõ¶‰®×Ï"f×­s°§î\ë'ŒCÜ,EŽÈ-”lÀ-¬Ø8K"+5ŽP™kf6IA×Ym‚7b†·“N³?u]7j97t¸3A vkÌ„z™ðx¹aHKñ¹‘9Ú²5÷ÕKÈNᕃýÿ*MûlÏ\OŒc^›¥á}/S©êÖÜ[¢²÷Ò2¢^ƒ®6ð¹~І٦5“À=­²—`;H@“} ÛeëS"ÖŽ@à=³Òw2­]¨Ìl¯¬‡ý¶<Ø3åÙ÷ëDM¶4-9ÜkÉᾇä¨öKÉI¼ÿÕG=ñ±³À_°]~€[oóBja‰åpÑæª6â<,žø7ñ6øQNPUhQ)Ù&*çVm™p“•%}oiÙ˜• xŒlaÐ:èµ dÚÇ^ œB‘Ч4¢›m¬ÇX?JÝ¢ªÑHQx_Pç[™å¿ÕЂÝÿÆ_Òâ endstream endobj 1186 0 obj << /Type /ObjStm /N 100 /First 1018 /Length 2332 /Filter /FlateDecode >> stream xÚÍ›Q‹¹Çß÷SèñîE­ª’JRX|gœ$`läbüà['fǬÇpùöù—f5#‡œÀŽ5Y°YMO«ôëjIUÕÿ¢È.8¢(Ž$Z#:Öbäb`k¨K¢ÖÈNs;¹¸ÚÉÕU±“‡lg'rÄA¯ÐR3iç'3^¾€Q;†“kÅGªê˜Ø¬Ô옕¬UKµ!juœì[dÊÖ"ǹb  W vLœÖŠNÌZɉHë¡N¢ªµ² ­Gq’¥õ¨NŠ]4SÀEÛU3‘‹$6±‹l×Í$.F»p¦èp­7©fk©‹¥Y¦ìb±Vq)´q©ºdCÌþlß2¹5c f—4˜ëX\Êb¾âèRÑÖ#9 ·ê”ÄFcÜ Î­GqCëQ&±p  ¬‡Ól 8Bk´<‡l=p Ù.­äàŒÖC]ŽÙÆÀ@Y©õ(.çØzT—K¶¸µ%õ€Ñ‚Ù10› ëÉR"µ{ÑRøEÀWŽ÷•ZÌW•\¥f¥²«Ö -±iÕ¾®&2?cªTc`¾Ô\ìa¾ÔJæ]»Ý!¤Öl úˆÝŒ ¸h‚)D›tb·7À³Ö”6mÍnk(©uu¨caFa ±vdÄmR›¬R[·Úæ²u#›êšl4óe\š¶(*î šÒæd;¡Mjv›„Fk—Sµ£æ‡Tmá?g¶Éü^޾<^«ÀÇq²5Í"O°¯Ú’†×/ Dk¸º¾¾Ú^üëýÎmno÷‡«íùÇ_íóŸßÞþójû~÷fw÷2`w¯¶?m?n?¼¤öáj{¶»9¸—±ª·eŒ ími$âsñ©fœ÷È]_»í¹Ûþ¸±wÛc÷Íû׿îóbAìÒ¨–,)ö–4¥X»TÄ×:PDöR¦ b—2ùÂ…´¬sF± vi¨^Ó@A-ëœQ,ˆ]È®},E°¬“geEI^èLjY猢.X¨(–½=8QË:§ 2nïEé™B[Ö9£X°_¤ˆ­2 ©e3ŠûEõ*E´¬“.M<,± sYç”bÁ®•ˆ½=¦8Q°eSŠ»V ÁÛójåD—¦ˆ%ûšÎv\â”bÁÞsò¹ %Z>£È (T¼Ò@1ݽë‚Ý;&ò1¨“§A½.Hõ¢TÏYÏ(“uR¢¼XÁØ%Ã*9ÖKCPôU?‹b¨¯@öY"¿0„T¤ÿõ !µ ´NïÇ‚ÍJPuD(Š"´N)l‚²ƒS:SäˆÐzq ”-lt e„Ö)Å‚ ¡ÂW( €:¥X°c WoBȉB Bk™PЂ¤W(û” N­SŠ{– ì09ìD¿¹L)¤XŒ²ƒ‡R]!´N)ì\Ú£’óƒÿR^§ Ö«=+(rF|R¬b’=,(4!ÀNDæk„£=,(#ÂN)†,íaÉ™"„Ø)Å‚•úÙ³<‰Ž9=‰Ž9?‰Ž¹>‰Ž…€DÇ¢@¢cÉ@¢[Cñ¹¶µ Ñq¤ÿ”èì£Ï”èUî½îK%:9êBŸHtÂå‹%:{yæ(Õ®Õ®3ÕÓW]gª]gêzw=»žÇ]Ï“®çI×ó¤ëyÒõ<ézžt=Oºž']Ï“®çI×ó¤ëyÒõ<ézžt=Oºž']Ï“®çI×ó¤ëyÒõ<ézžt=Oºž']Ï“®çI×ó¤ëyr¯çýŸ…4޼FHËœ%­"›eƒQÖ(i9J¶Ù™†Å1¯QÒ z6wªSW”JZĶ:*ib>ŸQ¬ÐW±¹×¡lSÛܧe[Z!°bs¯qTÒ°9ËÌi…nc—†‚ICö’ó¥)JöAF% …5Ïžþ¥êQFê1”* )jœ–*K(TìÊ™ÂRTšúb…z”È^”´Šbrꋺ=§QIË^ÃÔ+ÔfΞuðRT¦çK((yµM°:£È+”4ñ2$ƉÈg™ùBìé„ÔQI«>ÏTÅ5Ùqñ ¤e_xꋉڻ£’fåýÔ+”+eðv±:•NtÁ£Ðˆ|"åQÓ#_õÒH'”iÐô‚aêŠb3Ò ¥,.~±BkF6‘ip©õÒ‚l"§Á!zšÕ"+^Ï$%Р걽'6¡Xñz¾ ™(qTõ‚=X›QÐ =­úáí-Ñ‚qâ¥!KTå4µ·¹f+Ä^äõÔ%F/Ó:yÅkñÂÑ5=öqªõ.¡ ö!’^ðqZ'¯x7_ìM¡Qd ÅÇiüußÍ·¨i?î+ö¾É ¦©×4Ë{óïWëÿmØàÈÑiX›„9eG˜}-Vdûy–D°Óî/¤]Çöèúº °=º9¼ÝßnÏ·Ÿžýhÿ¿ùûáðþöíÍþ­ßßýº¡Â¥ e»ýå`K‹¿ýbBS‘îà“ö^ÊûeY#Nÿ#"éö³{÷Îs@–ð/tØÊIQ endstream endobj 1384 0 obj << /Length 1747 /Filter /FlateDecode >> stream xÚÝYmSÛ8þίȷ:3ë·ÄI§sSJK)W¦L Ó¹£ý Ør,°­ŒdCs¿þvµrHh’BèÀ^¼Zí>z´»6^gÚñ:ïwÞœî¼Ø :#w4Ó¬ã{žFƒNìûî uNÓΙsÂÅêÞŒ%Ý`è\tû}‡My÷Ûéá‹ýÈ_Zy7„ Û¬¡ÈŽg7ÙhI¶× ÷‚&CZrÜ ö¿ÝAdöé…ÃБ³ZÈJ¯h\Ò¼l…?ìôü¡Û_5Ô„¡Óh®±9uÎi*“E!ѱ+QMiêÌîöÕë{ðë£éZÒÒDV_½0š6ʪ˜t{°žç Õ\ Ù¨—7].èÏâàÚ>·ä¥f¿¹pÙ³³^ßóœi!'¬èö¢Q`aÁ>™‡s +ìÓiÒz@c–Õ\‘pÉ*4vÞª!ÀôÛíöFAàœæB·*+êXOiób–5ZÜ |wd€‡¶ß'Ç. ‡NRpVpqǪ̂5€p\ª9õuÍêFS_f7ÇØŒÍ»¾2ðGHèV4ͪ”ÄfŠ_¢oÜxXÛ]5_Õª¯ºAì0kŒrs×xâ­:q@Ü0 /q WÏáÔƒ¾#SA䤒@Ab¡ÃÒ”æ ]‚–iò¦œ5µÏ…r«6ç,µ**«Bóº&V.éÛïú¾ïì~Ú=Þn5ê6Û嬚¢¡›îb¦dIÁêx^ç20’™ Ìì¥`ÔQ¼IS°š/½ÐùüYúéôög®œE’óä"•µþù1ìw1àC  G#'kª„B? 1˜Pl´5w‡ž¹.®Aä;L“£fÆ+ym.näã¹ +€,@E­da'龂¾›a]mDX_LÌ"+@sÍK;Ðճ딂•Q9{¬ZI4§E¨p¢¥ásêZΞ[ e§Daïà/ß”B”%s¯D‘Èïn©§w»+>Äp­M®Æ#‡ì=‡RÙ'òæ בæ¾à¦xßM"ƒ™1«.¨wÒ”Ô©¹®7¢#¾ü¥©ÞxIÝ5Å̯°zœ1]wE,ˆ½kÄp°Œ˜yhÃÞMÄpîH*V=Ó4ø@MÖ`B4“*‚ öÀ ®AY v˜M ’gK`ÅÖàn`­ Ç—E5+díꦻ€É5h˜%—Â1Žq31JcèÂvžqðã¥6ÓxÛ°5f½(Ñ]X"6Â+ aï/ú£m9¼Râ†#Z  Ú³ w¿ ë2m ³õmìm)h˜ :@ËÕš:üÌy‰!R0ËQ°)ÈШ=Ι]°šqðñ+mÎéu5ŸòJ–Ü•júÇ:õ&ú  d½›d†9Ív!§ŸÆ¸ùÞ‡·+NƒÖqS¢,ñäÒÆ´¤ ËbÒÔRé êx <˜pöÜ ï“®¯ïýœ^»Uªømù¦©‹œkÐa#ðHðЋˆa¸€áÛ6¼Õu;N*6=íå²Is % "‰ÂÎ|="Q |IŒ8Só[Þ(€²”µï€Kt\ÞÚøZ\à%QTz9"çUšÄãѲ#~@vìÁÙBpkkÁ·LM¨r_O‰¡ó*IAæqélxp 1‡„‚)O™R¼(6‹óŒ$^O]Àð’©Ôåi³Š_ºéwbôm« °ÊAï›è ±Ù 1%‰{=ÏøwǼ½\ ,£sÚð€e¼ä0³-ø'ùµÔÓÊ!›¼}9`r3 óœÉ§Å…ÝF×bẪñ»Øæ '‰ßILÉ÷ŽÍKf['HŒv›¡€|—Ë,óâQðº)«í‘í’ê™ÐÒá ìÍ¡ý?­ðQVÓÔ&…CÁè;Òúš¯8Ççÿy÷ïÄþ#–r(Þl•ó§ùøi¿úÆ+¶¦ÈòB^‘§O.æ³ïb·¸¯ qK.<¼Ío”h³ØßùVOPòŸüöD~x¾çºÊÞÁ#‰5ÚFЧ%>¿?ÂaNù/„¡wYm¾WÌËöÓÝ1ý“†üûò™yÜ×Ї†ƒ’2è·Ÿ*Ͷci¾zA/6gç™’(pK8¶{Ò¶ïNwþ9˜… endstream endobj 1398 0 obj << /Length 1188 /Filter /FlateDecode >> stream xÚ½W]sÚ8}çWxÚ{¦Ë–?Ȱ;¥mÚÙ6»Û²›dv âÖ²“’_¿W– 6± d&,Ù’î¹÷ž{t±´…fi_:&ÞgŒ´¾Ù÷lO›Ì5dY¦ƒ=ÍGÈôœ¾6 µ+YÆÍäkï³çUV^uäÚ>4l_Ãá=3‹I‘/G”QÎŶޥŒmŸ`ѯœcÃÐõµ®íÃ+G¼¶¥ÉêT³íZ–þdù’­Œ®ã8úxIWK’I 8¨u°>Xq¹âý”f+ÑIÃâWµí­wô«Yšà^ž±i‘§ÙÍ>žª–ÖE®À»à²X’ú$æ6Íà@.mÞ'›˜Š•÷bÍQǯ [ã%»+C϶ÐCð{ñ½‚¾äË«±3æ^˜c’³JÉ/ÈTHJµø˜F‘x j‘fp¥"ó" ©„ÇâʱÝÝ¥X\u)Ž)…@ýaÄÓ¶›µv—àL`:A ¸ät^D]Ä’?; hJ¨oŽÝŽæ="‚Ò2Ï×ü¬×ãe° "‚Ç=N ˆÉ1}ÂS…ö ( –/‹©9KãTÏ@tWFt T€ ¹ÌÄ´XpŘüí/À#é1Î ZïÄÎ'ÿ:¨<í:>Œ}ÓE®6‹;W7–ÂǯÀéÚ]¹4Ö0pÂÇŒ#mÜùëQ|¬Z[ÔÈd™D;–‰ûŠMòkŒ[ÚEh7û5‡í‹~ÁEÐmBÀ\h=ån9‰/•sš´-ÓÆ§ø(}Á -²ÓG&\éË'Êg[ç dç¥9Z%Ýòô˜¬× $µœHÁ:£!›•Ê9Ÿ¥åï`âÙúåïÃïò5ÅQÓ’c4 á¹=œÄâu‘S5!œ ]$²ù,_ fsõYµaГ±T”L#Zª,8Y€P ƒy–ª–E$Fl”É¢æéVå“þ„û\ú舻\®Jè üÌ ¬5l¬¸^Æ«µñRI!"àÎ:'ò&É))åÖÞª%YÐÆ\6ä68”Û}š‹ø¦S€ $áùøãòââÎYDï"ÝŠU] ÃlQÄ41[oùÓõV¥a ÖÁpbn²áI‰]ìQ‰Â2Q®Þ#h×ÞmÀž8_ ÿ.ˆIö‰¹ÇX§R„0‘µ&w\[Žè1YùÛèCEmS„C¬yÈD#ŸïØÖƒá=0šmÿxK¼™ÒAYsaÅ~ãÏ’xQ~<é8ÌÃ;ø>()’g½}«H*’gEr¶ D£_ó³\3èÊçŠÙ+Z½!rÓ¿Ê}sò7U±²A¬PPxž„âô*Îí–G>Õò?¸9„ endstream endobj 1408 0 obj << /Length 823 /Filter /FlateDecode >> stream xÚíVÏoÓ0¾÷¯ˆ¶‰´xN“8ÎCÒ4P»SÙÁMÜ´ÌiFœå¯ÇÏöº¤³Ð&ñC .ñóó÷ž¿÷üÕ.ö*{oF¯f£Ó B¼ådL¼ÙÒ‹0FqB¼,ЉsoVzsŒ©_–o› c+ø´hZÜÌ.O/’¨žàe4VÉu`f„ívç³Ñ§Q¤LìEûHFƉWÔ£ù öJµxé©¥œz_4´öE&K «ð¦£÷û|‡£.'¡ýr"ŒˆbHRŠrÙr ”Aû ªy/|&q‚ý3&Š­`ÂÇ~Ýi¤Ûó±/ ˜7-|¹4¾ej—™pXbÝÖ@Œ“½³rÝlLfãÑé+m²Úæ[[„\o*¡9«Úƺ¦Pu'OSS›¦ÂEªAH]›»ë1A”<«ë¦»‰C,S”Pb¼æ²h×wÕoíC‹Љ¨*€¢˜RÞïu–øÝÊ 4ø>¼e•uB÷ýSsÁ BH3o–Ç ð¯Ìì®mª–Õfò§¸[ÙñV™‘³ùl·µ]p!v9QsªPÛE¨OÏ¢kYÑñ2“,ó²3¶. VU-¯ØÔ¯æÀÆB9Tx×6Â8–Ôd³HÞI„4Ký‰°¶ab÷í>¯…K»fDHw±Þl @¨¿`Ò˜©é…r€>0†f$TmlWÌÉ©š|fɃãÎÛZ\«B›ZìŒ[rÁM÷tHÛÔ.νƒc¨íQ)¢ùw4Eþkêjêàê áÞ§ê±³Q×äºð ýÁ8|@JÍ⣢­z‘bì#„´¦,ñqŒòȾkÇÇ2ÍXónÕ”Æ^Â[F!˜”¦ ,0 endstream endobj 1420 0 obj << /Length 1419 /Filter /FlateDecode >> stream xÚµXKoÛ8¾çWí!2P«’(KŠb‘mÓî#Í¡vNé‹¶µ‘EC”š¸¿~g8”-Ù”ó>ð53œÇ7ѽÁrà ¾žý>;{ÿ%ô‰›DA4˜-¾ç¹,Œ±ï»K³tpëøÁðŸÙ_ï¿DQ‹’±ØG1ÈÑ4Ã`â¤é79á¤ÎÅt.KŒgž¹îš´$Œ˜—¸‘FA ›Œ©\VÃÑØóœ4¼IyÅß¼CI eŠ%ã1Ѻ®«·G‰æïœýðÆ~Ã07ñiûí[’:e4®Eµ’)Ͳ¤É<çJ‘Í1ki|«OÏé¤c 8@)¾µñXéC"ã=ôÜÎi º§U·˜%ïþóÊê…àU] e=¼_ ^(Ø­Ç)óŽ×¯o®®º”FÕâ.+:”Ah•8¯Ê®D€–]³Õ—‹«é¥•®àkÑƧ¼V•(íØPB¤Ýû{Èx9_=¥Bôÿ`@¶ŸV'n຋rY¯E1dS©N*ŽðBA~âk£æ0ý´Ã8ˆ©¨K62Æ€ ŒŒç!”#wâG»ûçò±*9]³á%Dâ¨pÂZ) žUÒÈ‚Ÿ;”(’¦ßô¸Õ7‰˜n×w2¿ÊTeõÚNçƒÌ9­8C]@}K'GÑ0/-hç'@p•D;pƒØ^¸ÞÕ5'âq›*“‘mJ¹G¨`¹9‚ÏQàʸ¨Ê-Ѫ•¬ó”ŽîtÁÕ…vGn2 º˜5^Þ«G^FípßhG L1u²dïnhE\׎“ž£çt4FÌ÷èn÷žÁÄZd·ÐÃ=mµ}…ë\9¹aåKž ª"¬B' ^çÕ^¬¥\ë£R>h‹±Þ>;Ѐãc“ ˜Mæî¡du‰.’O»äº^£&„¥¹hAºË†¾S¨n¸ørYŠ% œ–ÇÀZ;&Ç«á\H#—ç¹™<ßþjR¬û'R\—ö×XNÈçÒ@ßÜhVJäàmf¤æ¸”kšU+ahôƒ€3ý$ádÓº+nJŒzƒ¬sà¥À¿?í„ Ý–D›ÓËeBT 8)v!KaöYþý _턆7]ȉؠZ×ä»ܘæDìlw•Wµ/¸^¿ÑÏ@Ý>t„¢:»†ƒv]Œ"ç!Ó0B¾1Ñ.R¢ä4h\A¯ÄXAQõ溆5éCǾ³h¢‹qLÅ—”éÇ&štrëø9‰l<±tá '[X…aô” P#–@bµ*… ÅÏaYŒcãaØ9ºtÖ¼X6ENRQñ,yg§¿wž~ýY.±8Îy>¯sݦàRé¿ôôç+u^ë~Öò‡Ç˜™.0M¼Øù¼kà‚€íd¢o¸Ý}X?3׈ÎårTÈrÍóìe­*sYSë¡^UöÒ§=Ðׂ ‡AvÞöc^ uµ©õ7ÆaÝí‡äŒ{\ð[ˆÄÕ®·Àž·@Ö‡•(z•¸'x˜wöýæÒšHp¶,ô3ÐçØ¾÷Ë÷.ÒØÖ›\ëçÚåìì?X®J endstream endobj 1426 0 obj << /Length 812 /Filter /FlateDecode >> stream xÚíW[o›0~çWXíÃ@*©ÍŘ]zI+MÚ¤-Ñ^²ªrÀM˜¸dà¨í¿ß1&$Òvj…ö°—؆s¾ïœÏÇñ£ÂèÚ8Ÿ§W”¢pR‡¢ù"O\¢€ uC4ÑÂ<[­J±âRL6¥¨ª¤È­›ùçÓ+t\¶KHˆM⪗n8ÀÊëXad;¬\ ýà ©ÉÓ­èùt|» „!›„'ð´ów!·e^Y¶ç¸&WƒcÎĶäRÏ‹¥eûÔü%¢æÁ}"×Ú:+,ˆÃŒ·©Ðª¨(…EÌZ‹X;ÉB?ªÑü 0À\H®1—üLi` Y3×Ú½fb-“c&•ÊU ‡¾¯s©$ð£ëyÕÈËúòºž™óL‹ŽwE©ö!('h7 e±)‹UÉ3m vUäÊCê·I~ àTÕ@*%:a¡ó{þ•íé=[‡M<› º¥È#mý·§ož”Eµn’:RžB.'z>‹ÀV› ×?±L(Œ¤•¸S.o†ç¾ ÞsêMx¶Ih7 %C À¨×jÉ@Ë@cCñbl~-¤ž”Ûü}›†:lþŠU«@6Ë,º­2ž¦G=:¶Q|ÛVC úÑÖcšTRDêG§¸èÔ,èc½k no¶0/.ƒð|àýÉ€-~)ÑÙ8D$‰‡áqˆ<‘{ùF<완FJg:ReCÃÆ:?ÞH<ãðP6ÏH;Ž÷òz³.uÙºpöwRÿ¾9‹ã/…êmfª‹Û]:½k¦9òÅR÷oÊë“ö 'Cœý®ñéÜ|ƒN‘,Óžƒ?h¦º¹Ù€fõ›C:ß^õ±W¨=ÙZðXéøp@ªÅM×ÓFv×µì:i^tŽ‹1¿ ž‘ö‹ø0† E™±¸Á(†—^?º¯M3äAÇx.ÌS43¾l†êÏÎ^ïJ 9 Ý&qhàØ“ŸžŠ†½þ—0ŠÍò‰ žjõÔ¨ºwŸAÁ¨…Úmá›ê¥f© —zLb‘ËD>jË(åUõ„Jžaø•þÁ¾ endstream endobj 1441 0 obj << /Length 1441 /Filter /FlateDecode >> stream xÚµXKs£F¾ûWP¾U­X•ÚƒãG*)ïfË–“ƒ“ÃF˜jïjývO‘±,'µ¥ƒæÑ=|ÝÓ\+µ\ë—“Ÿ—'ï¯fEN4÷æÖrm1×uü`n-sæ~d-ëÁfÁäïåoï¯çóäÃÔg,ríó40[N¦Ì0Hy-®¾n»yUá(ƒQYà)'®~6<8çZSo3Ÿy)ªXfÛ:ÛÓh°CkÊBÇCR¿u# x´ïûvÕl6"Áq`ÇeSL¼Ð®õÞ_îÌ=ÝV¢IÊU“ÿ{ sF;ëR’Šà1j<Òr–: «ño§ÍyU9ä%ì)"ófÎl± d÷OŨI#&†c&êƒÀïR´ÞUžBcðh¥åƒ8s¢ÙœÄËÕ?"®ß©mWoÍh  óøcæºöúûts3*»<+Ž”–êp¯äµ¡r}~sw5ª“ʲÙ:«!~Šn¯OMmOGm‡©(å†çÙ7ޱålDýX&æ³nÊô“§£gT1Ï…³æqA2Ð…ôqÝQ• —iV˜Â£‚OB®ÊJ’ËÛûqg9Ž :k:rã*”ˆÈs™6jßì8™¯D$…Ø~’3£f oaßéxÀ|*W`âÜÓ ÍòÀfŽç†FȾþ¨?³>{›cE‚Tq•½º Ô%ý7•p&Ó ˜AýYó&×3-Æó\*­¯Ž:÷b/}"÷ùõ$ôí.Û†(yÁóÝ7B ‘Ï‘®0ÕIˆûQìs¼fb4†yê Ï„ÚèCôZ‹&á5oqµw¦¦/Ís/ô÷u=aŒÙXiÞZ]ýyýŠ. ú¦¥Äà1ÕJЯ%µCßóì'ô« *órM¢1)f¢ÒýÖÖ­iªpÒw8 úî£çRló,ƨ®Û†«wb‘çSUs' =³nPïÚN¦ˆ1üZ̷ϺœÁ‚ëÛ« ع£qÒù&K Ï’Æ –+lPµA$9Bʶ¹Ú4D22׮ż”­w$Ìé°Þy(éFÐÇu*ö0ºòý5°â-ŸiGÕ¢[An8k æK2í<9È„¾ûŽÌÄv) [#‡Ñë‡öçœÇ‚n€cB°ÏͰCñœÖs¾"˜z^j¹;atë´¿•™ (XTù†KÍ Ý40îŽrç,‚ õ€3GD3ÎøˆZʾÄ`_¾yº¾»J´ ~NhI| oŸA~P*]C¿Äú2Ö䯝×èô‡ëœêl(®-ÐìÀà’­5½AÁ2h¯fkòzÏü¨©Ê°çè‘`Ɇ0_Ü€·¦Y?þ’öŠuK–…¹÷YfTñFôL ÕcÕl €Ä#ˆ¡å­,S$Ù´·âò ½Rs´—ñÍ_˺w“ ó½N|}ЮEb^ΦϞî•'ÆÂýØuÒ7ÞÄ…Þ ¨åþ>JëRÊKQó,¯þ˛ۯkÍY÷@Elÿmq~ O!?Öj†kU3Ä¢Ú¾+%4š{ày£x[©«ï ±R)ÀZj‚ÍqøòÈì³¶0yRé¡kóZÞV“‹d¬sõ\¦m‘Ø‘½TÚÀE5%‚‘"6ÀvZþÆì‚6ÚTØa¾jßMa,›¢èËúq!0‹$ãóæO)5’ºEmøæ½óœã¡ìùJ•×#ðtPÝ.eàÍMÎ ˆÉíÉuO' Ý%ñ3?艫ºÇ™æ¤G¼vý1‰(ÿ×÷ /ô/á߆×2ûŠcßþ’Õ´šŠB´rú_ReCæEc_4PH}Ñ05]ágœ¼ÙÆ(C¶Ò‘fjâR¦u—·xê ï¯røFQpéÀ“Úµëî+KWµßZÑî^U±Ñ«¸Zž|ª!Õ’ endstream endobj 1455 0 obj << /Length 1306 /Filter /FlateDecode >> stream xÚµWKÛF ¾ûWIÊÀj"iôr¶Í&HQ,Ú¬o› KcY­ŽFÆîþû’Ñ,ÙÊÖ>ô4ErH~|H®•[®õqñËzñîCY+¶ŠüÈZo-Ïu"+ö<ñ•µÎ¬Gû¶N—~bïšöAvNZ ¥–_׿½ûx#ÕÀõXœp0¬•¼e®¹ „ƒ‘°ÓK;~ LN:wÏ¢Ú—RM4¿w‚ÅÄJ@9 ´ç ØrYì‡dëíÛ¥º®}ßtD´‡ú'4 ÊŽç²Uh¢ËD'¾¸¡ûf¿©Ò¿T%Êò <{s²;)2”½ÍóV梓wÏûV*U45²›Íß25×ýLÇÑ(Úüáóýíÿaû†yÛöló2‘JQ›ðŠù(aöÅdÂ-2YwWÈßÌÉê›çåµ“êŠ 0asÉó=¶Ô'hßÕ:‡cÐ{•ÅÝzñmá¦kyC¡‡©ë˜ü$žbQ^4Yè3±Emžkîd[ɬ€!.¶0QªkZ‘Ë3;ÝNtG 9p¤@'btBõŒŒˆdÚ¡]¡âB3_ZYÂý ŃÜÚ6m%t24£–2£—܆WÄÜ£I[¶([Ô91³#zªU×JQOÔ¢|Qè%>9Ƥ¨dùb”tÀt3%$oEÅ©§}ÿ/o—%V›[=ùùãiÍ>ÚŸj2'ßã-'CÜ›ˆêÞr8ç”0Î×€Õµ¢V[ÙÒÓµ^¬öeN039&;kއPì&eÓ½¾[Nû÷¤hi³²PÝ«.éÑó;JéЛ-¥¦ÙÀP m´¡èÍAI“¶®!N U€eM9í[ãtJL¼D¸W,ôy_˜5Y§’¥²,Õ¥Žú±¯Å‰Â¢SD5Ô4@ Ñ#¯¤±äuÓH?í¤±pÖ½º®^3Ö'%Ü—{-Π9› ï‚|üIoTaºyà(bÍ>âùN‘DQŸ½š-—WðûvíË•ØÁU;8 va0`Lœ„ú"¸…zÖ oÀ hƒPˆ[<Áͨã}¿_«ÐËì‚8i®ÂQOÐ3 ݶxfK'â(…ûÙiCsQµát½JREéÒ³¥Ñ0ùÑõ “þʽ(Ú£)ß^°Bµý³ò†0¼ÐV)ì ¸øWfvzñÑÃ2Êä3Éj§Æïš¶È Xô4 ‡²ºú&²X†Ñ¨ 5—è¿G¤ñbòçÖ57Æ¡ÖDzvÜõÝÙl·àüÅøcc}q9×:Ú‡~€òa€ÊZlJ#l ªlÓÌÜÝÓIí:³„áÝöP§8®™½O²ÈwkevHϾŒ^ì ?@°(À’fwdE%kü&’£íÉé Š‹úPš= i·ÚnÒÛ¥¾¹ºUÙÖÓ¡•×@6¨œ Fƒ©ó£Éöë? x€E ÂÂËÙÎ×ýæ¢Is\Û£bœ ì{‰—B=ɽóåÞ·™† ‚6u Œ>ˆ$ƒ0œ¾ã*±ßÃ-ÃÏÊeq¥MUaçþgTøÕÛ·B>Ýj{Ѧ¿Tßà¢ja‘#äæ¾žàÏã_¾C0 endstream endobj 1361 0 obj << /Type /ObjStm /N 100 /First 975 /Length 2429 /Filter /FlateDecode >> stream xÚÍZßo7~÷_ÁÇöA\r8CrF7Aî´w†½+ü Ûjêœc’ ´÷×ß7´7µl«‘´›Ü–Å]Í’ßÎÏo¸e\LT\,äŸÄŒ)ºTÕ%ÇIìƒmÀNL8QuR5¹Ü~ʸ>É8²Ú)LE)Û³p áPŠ-šmÑd“åê¢[—QhóB„ˆmâq°ù¤d¬* iaGmæ".…j3—ì±­[ n(š\ůRM®â×Ün¢â×|w¸ñm ŹÊÁ֍޷ùÔ1…jr)†÷ÌÂv­â\‰&§8W‹É)9 íÞ4Acíκ»»Vʼn„r X[òÝ$ŠQ­¦¥`šM®à ãDt~¯@©¦;¸Pc¶fUè#q94”š1>À¹ârÄš 5áž“‰©Ë)B,âÛ,ÄÀžíF8ÇbÓB£Y 6GXØAYÔ®X ›’:Ë¥-4¹j›¥¸ÌìLÑ•hÞÁD®µ™+FÅ®À=Ó¨`aÓÃ,EÈ`ÂÁŠdŤ®äh÷ŸFK@¾„¶c$6 Uj1p‰\ \l”\ ü¶šGóçÊÅ®š)aª–梩:܃É1Ü9$Ó?죡ÚÌp8Éæc¨4¶YàfJd·ˆ%•r[W Ñf\#` ‰NÅ‚‰W3îVq½Vs:S¹Öf Á$j¶ÀÚ,!ÐKÍ¢6l¶0-„ÐŒ!o°ÉÁááA÷æ÷3×ÝÜÌWÝ÷óÅålñs@Œ‡³îoÝëî€õì ;™]¬ÜÏ1o (øüŸZÄ“ª;½=_aÊ›wG‡‡mîèbu5¿éN»·'¯íóͯ«ÕÇå_ºîr~åç‹w]Ä|!æî½¿˜]_{ Q}Rüö»ïð·V„¡·ðìÁJL>Ô‘Àm‡05Ø>’)!­a} ]%xbp'®ûéŸÿ‚u|‚í ±·˜¸¹½¾>Û( S5iõåKIyÙVʳÀY“~5¿Y¹ÃC×½BâÕpÙ+¤lÍýÅ’Ìý¼9ã^ÌÒ'‚ÏŽ0aw¼˜_œÎ`8׿|åº7³ßVîlÝøÇÓw³ƒîÖݬ––VÙ®7“/ç·‹‹Ùò.9·s?Î.¯¦ßÏsÍK2RTQ‚Ù§ \ ¿àz'Ø\j‰…[U2<­*ݸH?Èý ôƒÚô~PB?ˆý Ÿ¹ô3—~æÒÏ\ú™ËÝÌgϺþ½Ûºæ·ÏGBl}$ ±!¬x³—àƒU ­¾@è¨ÙðÔu¿™;øÀ7'¿Üø“Û›·?ëö@&O@¤pŸ‚UÌâ˧àId÷ø›/.®.["¿… >q¢ÌuR‘«ä „dBu@‰ö —H#F}E)ö:Ê4I9ÔIà<¥Àhpa¸¡¯*¤IiJ-ZÆÑ¦1IÉô™<7…d„´å³ñ¦è³òHF'N“RiHq T.Ð%yŸQÅ ŸÔÄ‚üÇ1;E•‰¤àL‚b5†èÙX6b7Ã.x$¿1pÒ$ä˜'ÂYà¬(‚(®·4²R}Vpíâ©Æqìþ)P[Þ'!¨“WVO ”Àjöîèc)ãè£J4Ìî5ZMGê&³{Dø6HQ)Œ@«+° Q§ú ®N©Â(1`à ¸z-qu–¬iRUʜթ'06¾öh\°æ‘Ì®èI&5 0;ÂÚh;Ó#Ì=fÐ.ŠÙ—Ìã¤%ÖÌ“ÌZ†T#¸#šÅXA!@ïÐ${ YÌy$«KéiHòñhí‡ô é>[Ÿ/HV2Nô„fuÉÃj{D‘‚0I«í)¶ý H©¶W­”àŸw)5íÐ¥<î{ƒ¬‚·”F?‹Š6uëÍÃöbs'Ѷ‡ê§ŸÐÇ0¬­Ðú´­Ð¼[Qú¡ô Bí„Ú7ÚŸÑOgú–Aû–Aû–AåO„mèÊ2&ËÜ—“mpy®Åöfp>D+$•IF| ˆ Fž›ÌȃH[(ƒÀ‡Ã<³ŽÄ& ƒBÂ~Bm‰%£œ ±"m'_“6ûhu‚ö1XÅ´MÖêDÛã˾j;2š{&׬“2¨Z'ÛQÛ¼ùµê “,hXÁ2òXd2WšäÂz„¡'ôþÈþèAÖjð¶C-P/Ѭb9]]½Ÿ^OÏÖåìv1] ‡Çlà =ò4жX&Þ£ª¼»Zýz{î/æþ:$!tÚæxalw Â%+¾+[в»Z.ogËM`wÞW!ôÞ°uëq u*Ûq´Çºq[åôN_n4 ð=ãÖÐÒ;&n¡ _”¸ ŽV±µì@ ÷å] ‹*[ 3»Dþ2ÒTz[aË0ÄÛÂN˜:„m¥‰ =GÙR:ªí—”=6Zÿ =èÑqcוÃSzdÏxv¢Ga¶öº5áOÔxAH_FšÔGÿÒF{¶•fëÍ(îA´7íÒ?r¥öx0Ê0W¢ðÔ•bÝ›iÛcÅÆí©âˆ[è`M(Gö„76•঵0¨J ›wÑß~¼œ®f§¿8Ÿ_ÿpµ1ñG—C×s¶]u‚O{ꋚJÝ Ps¥¸ÃC«5áµÒl­§{à\k~·¿§å§žF¼§ÙÖëã¤E²ƒ¢ ¶o~^:þqKi!Ì·Ž® eˆôÀ~ÍØ£”(ŽO­t7k?Ì+÷xÚK÷îÒúÜ“J?¨£&!ôièÕ\ÛÄÎö„J¼m-¤ÖÎå1ÿ÷ùâÃôúê?³—ÓÕt¼ Ôž•${³¦ú˜ïr¡íì Júêp¬c`ÛÚßAŠðS—ä }íT{&m‹YØÞ‡òöBq²´½Í‹ÅÌòscçÿ8©F„”Àl_µöÿ„ÝpX Nǯ­ þ]’ÌÈTwßöê>že³¹N/¦×##!Ó lÑ‹6“e{£ÇÖ‹¦¼ce¯m_ ¾0<+ ?ÏÏæúç¤j¦mE4sÛ‰’¼½¤4Ú;"{'‘§É_ÒþÉ_îwdí]¬óy„z ÆiE$h D{Ç‘çÓŸäkÜè;xÞØa`2~B“Úm{©ñ3hÞ,¦7Ë_f‹Ç`šŸï …? ÏI#Zá°òE¤Hà*ÛJÛË.i[é¤ ñwþ7œê¿1Ö¿ã endstream endobj 1466 0 obj << /Length 693 /Filter /FlateDecode >> stream xÚÅV]o›0}çWXêÃŒT\“ö©ë´ªš´%ÝKÖ71)œ®ý÷³1M ¥MªM‹òà >¾>Ççš ƒÏÞljwrÆHP"B&) #ʈA‚&`2SH„59?9¢ƒœ41ƒ£¢(µÔjTÌü0†7eU[´‡Û=>M¼;˜²N/"¸É3[zÓ+ æfò˜©$¿è0à bÔÄ9{ßÖù¶G§!îj  £Jðq: šÏ(eI_YÌ0ùœÀùÜ(aV¤¥‹t;Ê&‘#¸”ºÊšœÃrY„fo‘ëd±kIq¢QuªêY•Ýê¬,zŠ6ÊúîÆ 1¢qÜŠu¬‘HÌ|‹Ô´ )uJÍ(×κçÚ-†Ír$"êò_Ör¡‰ _#Úwï'æØ}ìcx/×a—º BJ,³KR”—ðèÈ!NU*W¹vcêÆ¥Ò7åüýÓ2ãLÂÅ‹D˜¥N[(wÐ5ÁnšvÎÒu{}pÃ×Ë‹‹A¤U³²¼þ¥fåY­‡¨Ëº–û¥2çÖ¼dí8Ðþº8µ•cƒYnH¸Â1%Ò½qvö][RÝB˜Â/…V‹JÚw‡>Vz(Åàò-]û¸'îÞ~ þÖNq;'•,êTUÿÅËsÅ[½¬”¨Š™Ú~·RÕãALßõýU‹ÕR> ¡®_ýŽïø~ËÁ®ÛëMÓ€…adlmAæ‡bP-ÀSøýÙ.Ó¦õ*éåì¶Å•׿Ð8´7m¼]i1Ú©WSóÈÿáǦUV™¼ÎUÝo ·«éÔínþ㦼7´Y—¶’zU)÷0·Û¯Õ …ùô\†Z endstream endobj 1479 0 obj << /Length 919 /Filter /FlateDecode >> stream xÚÍWÉnÛ0½û+äP¨R¤¶CiÒ‚±^܉¶UÈ’CIYþ¾CRR$GÞŠ´(rMÎp¶7ol, l||N/Çð‘ïXŽ1cD™c¸„ ‡úÆ42ff£sž$ALx1¼Ÿ^^2ÒÒb˜ ×£p§’'®”àÊJý%¯¥4¢UZ#Ë…MªuBå K³‘cY®y&劧CË3‹|8¢”™ë Ïy$×Ô,2ýÍŠ%z¹âÅvA!Ê7 ´½Âƈ¸ÈñªÐ³‡_<,PçÅn·,éÖµÓ–çÚ« /EPï= G¶mÊ qâ ^w·¥ñÉZ…ÇÃxþZ¥aÉõâ ®‚Hµ_ ŠwniŸã¹>Ò4+‚"Nú÷s\,õŠ¿¬Ïó8KµFÈ8""Áç\ð4代¢2ªq#ûæ¬Ó8KͲ)zœV×Áò !oÕËñ;‡fJã2N£©ÒLœ¥á2y/pkÿ+÷K.)È­’ûh·Ù^·A‰µûŒxÐkÙ”hÿ }Ç ’’oëÒv,RÙÂ[+yQŠ4ïŒTBÙ‹àŠ>€˜‹`Å»ÈÁ(Š‹xHÌ, ½fI¹ªoœ×7ÔàÓSý40û6<ˆJi(ˆ1ËWƒÙ=6"8»‚4Rß3ž•äÊ`@j.“4•“Áí»Ðq›;‰'#òÂ|Am·Ñb+‰–vÝeØ<—Áó —ÍGL ÛU$3´‰*.³=Í_p×nˆÙØP§mñ­Ù`žÌ=&:lÖ3 ˜m!lW }ÁóPÄkUš?L@åIò}Ô¨PQSx;ý,ºíwy°èGúžù´éx·Ü?±_>ƒ+Ë™?‰4"©Â¢È¯ŒŸœh‰ Õ_5…"½VP—‹0Š×¡¸´K#pú© ²Ãõ\éQêUFo;ûBÑÃF-¿èÏÍÝõuu(xT†º%ûZ‰ØW–z‚SË,òåÙS–—ÝLìªçBº…†k”…} lßêÓ3D¶QÀæÐûÏ6‡¾*ôÓÁÓOÖ“0O%ì˜á_ƒhÿð¿i&HV½I.âÕX^Ðõ&ç%[qõ4Ø6*%Û†’w#¸¡zæT £4J|˜Ïÿ»S…¸>"izS7÷áÃÅ;r¶ôA™Y¸C*&ž;Ä„94w…ÿBü=w¶uz;=›hí’K?¡A¾~fõI# endstream endobj 1493 0 obj << /Length 1087 /Filter /FlateDecode >> stream xÚµWKsÛ6¾ëWp’CÁ™øf:9(ŽÓ™NÆm-¹7Z‚de(B%(?úë»À‚2ÉRÔIÆÀÄcw¿ïÛÅŠ9k‡9¿NÞÏ'o>†ÜÉhû±3_9œ1„±“pNã sæKç–ðÔý<ÿíÍÇ8ní¼õü,ñc’+:Û”ëB\ˆ¢¸|Ú¹žŸQm\N¶¢tý„Ôúô„Y›`0l]ÃÏOà¿Mݨ|-:ûÇF¸'m;ž:Ïh†xÑë×®1FfŽ[QßË%ÎW²ÂÉ¢È•ÂØ’ ›^ý W:fn‰óC^ç3Q<AžY¡o2±¯òúo±§ŸÑUÈgïpxµû²V¯ì:xš?w7\_M›ÕQÝI%:ëóë›K»L)[\»fhÆ0NQ€@ çf‚ÈŒd:¨6¼öWqØýK ¶»»ëc¾æåêæÓ§îVÆ®’_Ä¢ÇòNÖ€DóÙ¾a·—]žN ?¥I`ókZ­÷:-ŸÔêhžÈ¯§~RóŽ.Zº^DÞA¬1ÁØõ‡Zâ¸P Rò «„¨ú‹/¢ëJˬ¢:N¼ʸ•¶É¨£^F ž™Ä{±UËJà'ñ´«„RiCAyèY®úw÷ÜrErÜØU¾µ†åª1£r ϳ: Ý/øU‰—PÆÓò´‹¼·bÊ»EÑv µ„î°Ð÷½Ñµ¿Ë3°iJ×QtBÎì^jèdÓZsƒìñá~Ä9ÄØœ7!Û¬µ…a¸@˜Nd}/,|¦Œ¢Gç¸c«Õq(´hK ‹P(0‚mœ ¾Æ°›û›]Zíi‰c#}³cXB°ôâfß;¢…È#+D¼xì–q!Ââfej]Ó,õ»µN–Å3¢\Êj››"šì IἨÎbKà1:¼ƒ½)æÖÓuÄR¦H ŒH LF(±þ˜-m>ôQ‰£Ò1Œ©Qa6ÊJ˜üüŠêza ^{Gs¹!À̾ mÍz;òê;€Û¼‰§³ÿJöž‘òP-e«8™!ùœ˜gÂøkž¡ˆ4æN=•¹t·Å~¸í÷ͽçqú ×`n;iö¯E)à@#ñU%·#w‡ø(ŸŠk&4hi@¦…’#-üÑÔ©ô¿8½>Ù`\¿ßiÏß¾=tl—óÉ?n.凟>‹©¥Îb;¹ýÌœ%,BëCƒ,uÍÖ­‚ “0€yáÌ&Žö,ø{¦ã%g4˜yšQÆZý÷HwÚâ7Î:÷ø ]!ÃYí^ÈòÛ–’"w#N 9“!‘Í⨕ÿÀ-¤³.06fíq8÷Eùda_AÄx˜ü<1D&ø¥ÇNYìcD„ZT›]­ûÿ¡ú‹¡~®¥è^ Ñ/‹I¯,vÓa¸]€þZ±¦ endstream endobj 1506 0 obj << /Length 1215 /Filter /FlateDecode >> stream xÚÕWKsÛ6¾ëW°É!`'BÀH0LÇMí´·ZòÉÍ&!‰5E*$äÇ¿ïâA‰¤(Å}MÛÑ °Xì~ûí.Dœ¥Cœ“oæ“7Qä$8‰üÈ™/„‘{ނęgÎ â n6¼nþŽ~¨«íÆý8ÿáÍEèuÞLß‹ä%jsBì v¤ˆ3õcø Œâë†/EOþØzX×LæL=†ÆvÎòrYˆ÷¢(Î7¢Î×¢”¿J_»SJÂç§nÓf8ñÌá—/Ä,0ãZÈU•™ù¢ªÍ$-xÓ¿ã ç·Ú}eéÚxƒfb[s9vhôX¨'”>Û'0‰?™é;3üt}yyèð SŸOqLìUgõr ºÝÀG²9ÏÄáqü>EbßÑYéNƒ @Õ-Ø¡ßD*Í‚¬Ì˜V¥ë3tï‚°¨‡›û8ôÑÖ»c€õLÒ SL[ϤÓ&GÚd‹XøÀM!Ú€"ëÛVÉ•¨ÍTsȬ^0ŒyÇГQmÈ)kž¬5‡Ð1 Òt>Ÿ|šx Œ8Þ.¿)¤¡ç'NºžÜ|$N›8H˜ó E×NdŒÃæ…3›ür”ºˆôYáÙFD'ŠHÇÍ(é¹é³ ÷ü󢓔¡ÙÆ¥RªŽû& ÿÿŒáH1 c‚ ³5ë[Ѥu¾‘9@=–)ƒ€ 3\ê1:wZW>—¦[¹üÇ*^¯?ü©’g8ò/óÇ¿àEÆ%Ç‹š¯µ'ÚôD·½ž xhÒ«6Qêê—p²)ì]q«¤ÒTäEOúâìrv>*hŽ®7àq¹lΚ žÊªî_¾òg}ŽKoëÅðà ¶L,ø¶‡fí‚9äÓ±ž_Óÿc-fO¯^_Tï70CÑlôu R)¥FTçT»â5Ä]ØÓxÌ÷2¿r˜9XnÎÕ•’z0«–éjºhOI˜dªúsWw3ù 6ð=o¥XÑ(ŽpÂü>î]ˆ/¶ÂBÉka@++[}yQX3”ÅÙ)§»:0îÒîdhƒ0-ªežò»Sô=x±}ÀP ùÕõùþ²*Œ)j„”QøP@ÆHøh„)/33<vӪخ˃s*»hÇ@mž =!Þy (2¦ƒ?ºK¿…ä >Xض(øaæÔK§^@ ±­ùáäº8è{sW8ÙF°°·’ÂlÈ—Fme-ê1í;¢èjòWmÛ ‹ºå»Žío®SäÎ¥“¥µÂÃæ atªà€Oðüéå½^Ù6Çt³OGÕUeñdÔèüS“´‚˜†¨Ï]d†þÉZpÙ-EP*dÙµÎÒ+—+5³I­–Ö‚—š‰jÕå¹d ãí‘0Mß/_Û‡ðJ¤wmU ïÆZí-:ÇGX•,x£ Ñ–Æ>Û”?Çþ†ô }»RÔ©÷F!@aJýIÅû‡ÉˆÒ5ðó*Z€IÀ޼Näâî¼`Úט-so bͪÚÙÞ#U¯öC-u;†ú¾Õæ‹Ñ‚ÃfÈͰÐö~=ú €?¿Æ70‰ endstream endobj 1524 0 obj << /Length 1029 /Filter /FlateDecode >> stream xÚÅVÝÛ6 Ï_aôIΪdKþ¸aY»(°íÖ˶‡k1(±âxsìÌrz½ÿ~”©¤vêË]€{‰R¤øñ#EæóÞÎ~XÌ^¾ÜËh‡±·X{œ1‰ØK8§q”y‹Ü»#!ó?.Þ½|ǃ“‘Œ¨dØéÏÌ÷ÅV×~˜’î¦j:«0cî¸C 4ƒƒj&ÀŒÐÀï~UíõHu`"º™zÏh”†¨¬ ÍU§èºU[MR][~FŸGÑÝ‘k?B¹D‘ VÇRé‘lõ®ÕÆÅ¢º²©‘߬Q©Û¸ƒ·¿£ëFZ7Ô&a‚nÞj«šFd^™f2N¿Œ¦^kÿ"ùþÉèoõ¾UÝ/Ë¿ôª»¾†\˜jÍ8‘?.fÿÌxo”«,“„2.¼Õvv÷‘y9ßÁQ–z÷ýÑ­'‰°e®¼ÛÙ¯¡4ò’3Cú¥Ì¨.scÔC°ª”1'‰³a¡™ F}ªeŠjH¾:êN‡$ Ç. ]] ¹ "q}­Íª-w= (?S$ B$f‘ o¯ I³ô[]¿g”ÆïÕz$ZÆR™r…¼}]ºS¯–ƒèø²Çb²nZän›Ö)çºSee®ìNv•VÆIŒÖ'å |S²ÚoGýžC Èk&%†[’ô <ßa; P|v|ü/]õp'Ae’¦2þoû*JRfÙpüNÞ©¾šû¡$¨a°«Šbªa°ôeH,$'9Ь©û²ÛX*! 7?¿E¢ÜªBÓÇ»2Šc~›ž¨ÐˆËoÒ“¯Z­:mp®¿ød ÅnÚ`Ý–ºÎ«‡(²)0Ô>1y-€ZÐ~Àɦô9qf–~˜+TÖì§².PîœU³g‘øÍØÊMº‹§ÁÜøÀ$³YHIÆ –Üv»%¿ÇgN´Ñe±é¦eù®<00ÌŸÔ¼-úw% IgÎ÷DP»‰t B —â¹ÑçúpðÔž8ÅlNÌ _LÕ¸®&Ÿ|{“ËáY/yÌcòÖ¡ÄõÊ=dÆãã8p”µæ«åuW›K‚³=ëeB.oŽ)„ݹ©ö‡‰üTÍŸÜúÏï 8x®ÿäR&¿ endstream endobj 1541 0 obj << /Length 918 /Filter /FlateDecode >> stream xÚµUKÛ6¾ûW›‹D _zíÁAœ"E¤‰7—MPÈ­UªWEi³Î¯ïð¡µäØNZlOC9ÃáÌ÷Í`'w°óÛâÅzñìU: JB:ëC0FŒ‡ND Yâ¬3çÆ]}óΣ±Ûµý‡â›ð>¯öŠ“‰1ÇE1×ÚŒugícp™O.ûãmŸF dÆfuŸVm)äÌòœ±ƒqÈuì±ã“ñ 2¾ž<ñüc÷mÓ›E7ÔÏ•c0ö FI`ÿ—¥}ú øªÝTÛ?e•–åìÉ©»m9zûÅ7òeQ½¥rÐl¾ˆ­=þÕˆƒËs—C^‰º}=˜ƒ[JP_}qUgÊvúÓÑd±Z/þ^°Äy¨o$º¾Ûjqó;‚sÄ’Øùª¯VD\U³t>,þ8[ "(ÄDð½pŠ0g€À3)c˜L¬o|sì.=¸`S¥y±õâ¦%ü¸åDD]«ÛeÚ £JhÕ‰zÉl¥çW½©w»¦3‹É’#RjV$À nÌ_CZcîmÚ¶žlµ4š¾Q’»%H¹Í_f›Û­¾œYÚϘ¬ž ÀCFÌ×2ÍÅÏ3ø|¬3Ì(€+¦>µO¥ªÏ”)o¯ß¼aÿ£—]>íGfpHEgc}[§u×¥•0Ê©ƒ0­ssÚ¦RŠlZ6"öø±ipªµDÇ£6G£ã*º×;óÄú½»ëÕS³5i ˆ¬V:R³I­ )z÷ëåX$ô’(<ˆÿ‚ãõ­áª.@ƒ½šÇl&•‰ê°¦¿ZÜrHËâ›Í8dùVH1)ÒO`èQ†•íäÙn>UT HcDáþ~†ó®nºJ©ë™ºÆ ÿ–!û¹ÑP» FçÇÓ Î\d»Ë³†$ % ûg ‰Bðh'ÿòNtЂV÷m'¤> stream xÚXYoÛF~÷¯ú" °Þ¤Pä!í¢…Ñ¶Ü>$}X‘+i[š+ðHìüúÎì,¥(Ù. ƒäìììß+g¶›9³_/~Y_¼» ÜÙÊ^E^4[og®ãØ~Íb×µ#5[g³/–ç-þ^ÿþî&Šœ_–¾ç&+ëÃÂu]ëÛÂK,^²¿~:”¼ªK× ×’î½pô‰p\0âÌ–^ _>ôPƒÿÔä$Cµ“ÙÒMì`¥}ø6ÔEÈâ«:(XíñÙµWaHÌróOëKµì˜K¬ªØ3Ø:Žõž<ÜÞNòn9«8îKÌ…]ñ¦dµ±åæÃíýõä »R6{ól°ÿ$2^Ô?M«Ÿe¶Z~9{æ¥)3#A½ÇÓYYU£ów²ûPœStÒÀ‚K"Ï;ïttŽá‚y[%O¡cÙyqÿ¾oœ Bu»–~!ë'Ö眥œ¼Ï0 Ü劺1ˉž³ ©©¿¥æã¬+j.EœÖ¥P(¢J2$AŽfrÓäÿž‚íÕ.†½ð¬ù!š«k F›ƒ0Ý"?ŒIUxšQb‰-Q°jç%B¬å Ÿi®ªˆÆJ½¸¤©=.3ÏÛÊ<—Èö]Ó÷z·,3²mÒ[*‰Lf˜mš£Ò KÅWÇ(øº€•G…l^ÊqõfXª‘ã|HⓈ„"zû«apü`ØßÐÚ!æ|ƒF||.e-÷Èû½Óïª ™öé¾ ¥ÜÑ4kV¾¡ÐëÙé´~ê×NG¨beºDç&} n<3õ#4=©˜2­¡ªf1M#ªÃ‘ðg'³õ ×»#忨KèçœZá§Éqëì¨wÅk&òé!o|Ñ w¿!¦“ÐL;"©v›DVÅk"(û0Çf®jï ¼·'¾ÐÚ6EŠUŽ˜(5õR½W-È”Œ@ÒöLsiÇóB«$wÄPÈò‘åX%~¨P tÀÍDçÀa„CÇUg8í”ñ ZPÂÕ(à›µ\ü‰òYó‡ÖÚÊ üd½c©,þ¦ ܵ@)êé°RiŽÖÚž—Ð*dp¤¦S×€BKòvÌôÕc"ëú]Tü’º‚ªLÀƒ%uH ªãP‚ ¤£M'GŸÖû¶•köy*›…Ôªø9 •5\©R–s» ?œ\´¢ž¨õ“cåD!‹© ¡:A[zV(!^ª†+ù;ˆ#¥$’Ž|>Hâ‘K· 3Bˆòè’‰öžxãÒÛÆ· •:2o›ùI¤4b±&‚é‹©)¦ÇIÛ qpÚ)h9#<:-ÁÛ 4“šì1b*múà$mpVce‘$·£]äšw3:ºÐÇÍm®åæ&rÊFë1QuŽD„½þ7‘Œ¨=ž4W¡ Ú ¯)ןh,®kq±.4DÌÇÇJ,ʺÇp]aÑ9Ûð(QÑñ ‡ÖHÙ$9V±›¡•aÃ+רIººéêÔÝ“¨(ôW¥àèž‚zàz'¡œ†:Ý53⺵^³‚£lÇÙ^çŒ1Q¹Æ „½©$Ü2Q´#‘QIµäß SÓy;A¤šV1SeªpƒVÝ)|ŒL¤9ˆs[;L·_ócËŸ‹U¤ýŸ|§bˆ K<¼0áã‘Õ¥xÂwßú.°F#uÇ ÞòégIsÞÀ¼•ßß$E­gXdJscŒ¾ò£Ì›Ç¢B˜3ÎJ¤‰)$ ½w}‡R¦§+[;(n4‡m±é| NÝLøÖyéþå(,{2×ë‹ÿÅ”¨ endstream endobj 1566 0 obj << /Length 1031 /Filter /FlateDecode >> stream xÚ½V[oÛ6~÷¯ Š£€H¥D]n˜³¤C÷0´‰·7Xe‰–µéâRZï×÷ð"Ûòì8Š!@(žëÇï’ ôËäz6yý6 Qâ$¡¢Ù¹„8ÔQäºNH4ËÑ_§ °Gåæ„˜¸ åïid{ü¢:Üí—´^WLŒLN­à*F1‡¾Ê?F¶9AbRÏÓ.ýHòj½¨³?EVÕ+øíJß2®Kœ$0º+–æRwúÄxZ°Û/k΄(ÛF ÛÅ_P´e„àô²s)=~w÷ÛôÛ{¾Ò‚‚·ýÚYlFZ™´Ö Gtƒ9þÞE<’–9kº ô¯ŽéªÈÇõU’â‚®Cè&·³ÉãÄ r·t ‰ëx.EY=™?”Ã&€ìÐ$FŸ•j|`läSø®ÐýäÃIÂ(ÎC"{œ‡£ ¶Aì;®¿GyÉöe¥¸ÞH’w$“‘ÏIbÖÀÓn”‘Mƒw+&?"éÙ \œÉ­ü—3­qSŠŽ—‹^FÓ’´ÉµÍÏi•õUÚ1¥¯7M#*_ƒI„ß·eÓ‰Ó@Aâä5^þ‘x‰ã%®®ô†‰Œ—k•ɱ¾= ªOcèÓ@›ÏV¥€ HŒ—}3ÔC"¼͆FdÙ€F®7ÊÝH¬Ô°(,XûœñòI »%ok­o\Çxa&]Ú6O›¿©9{ÛÜ.œq¨S—aÃï}˜lY£:~ljü]@ï¿|¨+|Žœ»Y2ôÒ¹„¦¼èkÖXÔÃÝóÓöLBf„ŒøñEàG€ê=ëy*;‚R0‚1âÁò\²7¬KËJ\D.“Þ=“ÇK#<‡kjÛK'nµFH %„Ò(Ä]«·´ÓâÖQͺH³.Ò¬5ÝÃ2ö}¿¬»Þ\ï8&oO9½kÆÌ2%ŸÊ‰šœ(½t~{¦É^m†Íh+zSÿßð þçÙk@üÃJ šªgÿ¥½ïX×ó ñkzù……lp졞J&V­¬ësÙZ Š‘ )ߨêÖÑ’ñ‘xÉ‘A âË#‘k®|?ÁÅh$ª‡¸¶ÍÙ2í«nt§ïŽ™ ^¸ÍWm•kŸ¬@%ôvÙhyÁÙÆŠ}ü"´§}·j¹LGloÆ Y'á”㎛Ÿ:f­Ù?}Ù¥WÛ[yôb•7¼]€“ª?-9ËW}—­œ–?¾¤au×ůí‰éNŒx†Ï»³³fÜ¿£)xä˜sSߨOû8Wâ7x©†—¿Sw*úøÆÖë3ÈH×'•Y[õu3<,ÿ‡ߨ¤øÜ6~d:_áNM endstream endobj 1474 0 obj << /Type /ObjStm /N 100 /First 959 /Length 1767 /Filter /FlateDecode >> stream xÚÍYMo7½ëWðØ^(‡ÃÀà$p E'‡¶†yÓ¤q¤@’äß÷ er$Å´¼ —û8œåÌ›] QŒ3"¢bJJÆKÒ‰dØyãÙpÈz — ƒbBÐ%É™£È{x#)0`}Sg“Jň)¾Î`©‹º%Ä{Ò=2æ½j2bWŒ‡*,¢3ºØ„gÕ1ë¥â.:‚XÁ †„ȺQ4ên!c“䫘KQ÷T¥rQþyçʨ$ìK‘t*ï.-‚‘èÒ1*u)ΊCÕ!c„õ TàŠ‡Œª³8ˆ_ñ¤gF˜.ÕT8ëQ‰cã ¾à˜° S°}4‡Ó'¬Ç¨öŒú«G!<û¢#Â( 6 ³yÅ“ÆÄJŠ^’¨Qc¬k!7»ºòŠ>´À:œªÁG•0«¥‚‘ÀÆâ£ *£„‘`ã·>¦¯"à-QÏ]` øEÀ?ü©¥&Â)Þ3éæ …ä+´T%a1œ¢* ¿ÃC&(„)Oz2AGQÅa{lÀ¯šJ`8…nŽCÄ•*€©±Qc \¤+#Ñë ü&ÝÏ%‰Êʽ$EÝSïæÕ]2Ñ‘îŽ #OGêü%b)e¤c¤N'RLT@é(Q%ãØc¬O#àK¬VÀF1©çCƒ¬+Ø$5 ® “ŒNNFã7_?÷füªû§ŸÏ¦Ë~º\(ó"x}>Ÿ÷‹ÙÍ|Ò/Vl¬s¿÷Wºg³/æÂa"ÂYÀÍË„̱@X¦O§Ó¤]¬¦ÌåèéÓm+`4~}óvY¯û0ý8?›Í¯úyî.Ç¿Ž_ŽŸ_P½P}&KsáÉÙ¨OÇÅFWcŽÕ0#ÎrI€š“3~mÆ¿ÌÞÌÌø…ùéüÝÔžN'ïgó×ýòg5n5ya.hÆÎÍøÏ¿þ6¥X¸¼I>Xƒ§7××—{Á`ZE#BØï> :8ëáÿ4“UOkCÃÉ­ºd¡Õf°èú YMyȸ.;ƒw–¸¾€á Ñúp¶¾°(ß^(ã­v†øñ«ùl_€{Ž_½83ã7ý—å÷ºÅ‹T¶ybÌ‹´Ò§æ³ Â.X³"YM^‡œ4²p¶àö^†œ}˜^½™wÓÅ»~¾bËb“+dm.Ö!bFWlA¢å,P!ËC¹”UªzTÊ ð&ø›³–€_nEÎaýhø“Õ߈ŽÁjvkDÃþ¾ÍðžfE¨$D’|4â;жVt`CÞIîͰr'’܉wÃÊ ‘¤ðv$)tx$)nÈ‚2ÉÖrÔÛDZ¨²-¨àPŠÚRÊ^ª¾îoæÝò·ÿBÈ“'Ýâvb‹®Å?€®›ào™¨ vàÚÐB$Éh†&Åq#Úk.G4kD»h »c QÂXÒŠK¥òí&1îPf“w9s(KÄmסÚ54±DVªl²D¦šoµ_² ÕÔ†ú˜’³£¬ÒÆ1Óéò©ûØÛi÷©0ËrBvÕN3ZíµQ±i¥IµBÞ«ÈU·ìì»94ùžªš‰š©z|/Uw£I‹nD£y´èc‚FDµiWfÝÎÅM³lN¶iDû„ÚÄÑ íªâžº …õÚSÎùq4öa›ÆÞNcÊ·4¦r;ðn= #äÁ¨uÎuŒžmâÔžŸ»ù¢Žåä³- ^çlÐ7Lê«hí«ÏjÒk@eV‡Ø[¯oµY²6($µ §‹E÷Õž_u‹÷vrÝ-†l<4ÕI1ñËuì‹ÕwIŒF$³ìU°Óýºå‡ÙÔžß\Ûy·Xöó­éùr|€Ü‰h¼oD š Oá8hêdg8Ý…FÛi9¶Ê悊MâqÐA¬O`ŸJ«q¼4*­ÆY•`2d 6HÑh;ZsyX´Þ|öàÀMðý Ù…QZ磠<-¥ÔŠÙrñ­hü:×*›'ÈÒˆö9ZjS – ­>ŸÓµÌ >/; yD£!t[ȺãA;FÇ‘Ë|A%"Z *oôÍŸü Ò>ï»eœ:€Y«ý †:ª/²¢èg15ùþ:`Ò]÷/Ð ˜ñ¡I€ùÈåÕ)EoAýH ÒÄ{J’­/éäA=Ð.4ªZ¸4¢=:°ëþN´¾$p™†Ë93nÇ'&‰`\\mØoMë7aN?}ã…kºðä-ñþâöyw=¹¹ÕžuóÉìª9}w y¨%‡,låFŒß”cDymžïS-ú峯?Ö­úPË—±ÿHw. endstream endobj 1584 0 obj << /Length 1104 /Filter /FlateDecode >> stream xÚµVÏs›8¾û¯`²‡31FØÎ’4é´³—mÜ݃ÛÙf‚Á9Nÿû}OÂ0v›Ãžô$}z?¾÷ô$×Z[®õar;ŸÌgýè7å¥PcÔXÓ%»ñ=cy¶q$®äˆ÷ÜKú+™z,÷Ur桽„?y€6Jíê?f³Z峬Vyyp’r;û¾—5~‚ê<álS¦øŽUš„TyUÊHú"1+̨Ÿ]#·ô»}T³3™iÍ¡Wb:z‡Wã"Y÷/ñv—Ëú×ÿE!(ƒ_eC6òOÆQ'kÝFrü3ÍÞѶ ¿·•Ð]Õ,¼=†Õ–ÇñšøÿQÿo÷¸}ào°€_¬ã7ë$ðÕÿv0W endstream endobj 1594 0 obj << /Length 830 /Filter /FlateDecode >> stream xÚíVKOÛ@¾çW¬8Ù^víõK* P ¡6mC«*åàÄ›`áGj;úë;ûpb'¤í•KÖöìÌ÷}³3³!hŽú08 N®<…8ôlfˆ‚æ!ŸRì9!Åhlœ§ÑÔ´ãá,¿ß'57ïF×'WŒ¶¡Ø+]lWì t9üPx$ˆ®1<߯>±Ñ4ŒïŠÁxÀh%·fˆ Ÿ‰¨)ú:ø¼Ž·½J!,h ¡{ÀÐsD`!놰å=¶XÀˆqQš.5¸ø‰ÀÁrÜÀˆÔ2]Vu‘‰gß˜Š EZ”Ê´ûS^kŒ~ñÌ~Þ߈W"YÏiyÄÃã*‘ïy5-“EyGâFjçàh€,›`jûÊý¢ä µ)Ž#ÅÂ"Äšh4©!4;̘j½`]h­òeUEtRuø¬ ˜Ç~4ÄÔÑâb]Rï,µÆQáYer`<©§j)ó¢ÌÄç¼ó.‘f4ó¨k²Kw¿‹âÔ¦ç.Æ$É‹½ Uò›ï0-ÊbÒ1,‘Ú ®õÐÕÿKDÒT<Ó£ Ž©3‘^Lòíh6…ùæ¿¥òT¶o°Þ<êë3{6-"E:Åúâ6ÛEeãßüíöRÏÝŽ÷b¸À?Ó?"nã‘ endstream endobj 1607 0 obj << /Length 1122 /Filter /FlateDecode >> stream xÚ­WKÛ6¾ûW¹D*†Ô[zØMv EÚfô°Í–i[….%'p}‡Ê–¼´×.z"EÎ g>~3CQgíPççÙý|öî1bNNò$HœùÊa”’0Jœ”1’„¹3_:Ïnx_çß=&ÉHòÙ²4KÝ{Y.×⽨ªî³ØJÑ‰Æ 2·ç}Ù6JoFÍióÙß3Sê°ÃAI‘$Oœ¢ž=¥Î6?:°•gÎw-Z;ø’F!Ì+çiöûÁÞéˆÑdãh% Ä—Ä)Ii†ÑX¶8 ÑæKÉ3æøjŒZzß6]/wEïùaÈ\ŽÃ²,”5.÷ø-½˜¹p<ævž“FMàh˜–j €uW­DM¡Tx±Á¯]SÖ­ZYòÊœÄ{Þ‰^ûm7 Hg·€‹ FJ$$© ýƒè Yn_Àv„oJ« ËH–Û ¹‘ó\*@ö¸+_ÒJ¯œ" &/¼ u7¸ƒPA¬Â1V'ñùʹ %a¢s_:¾Ö¨,Qf¢<Ë´?iLÕZ7%¤ŠQ©]ü%ŠžTe×ÿ eèt¡³J R,wš‰S¡db挱TñmÅ‹’7G9Ï)uÂá ¼yEsYÖÝD‰ýÓK‘ñ®ã{ÒðZLÏB4íÇIÑïdCxU¡úôÄÇ»_žìn¤ie=‘žþò`…웋¶/„µ¬o¹J¸fv áîäzW¿ÃÀí»‹Ä{…p#I6Bé Yî03´´žµ+̧'±“|X[@ ‰ v!ÉN¼;ñFÁ•(c¢^v‡ î@?©Ušïª¾ôÛº,p Máüà\–¹ß7 âÜ*;wX⌛•~#PcÁ»Aªoqœ”c )}}«iU?˜Þê™Êrÿ`( 4Míyz £‘~†6p> †ûƒ™¾?¦:°©S=¨ÂÃ~¯d[u½±{¤^5ÂLƒãBÇ,оÅP¿AÎ–É Ë=’ÉÜsÉ‘JýuXE„²È^®þVË VK5Vje‚•Zc¥¾+¥r ô1 -h) …Ú8d/ÐÆ r‰¯¢b«Ï×c²ô“®³ÇìÉ—·–|kzêá,Ãú Çt—¾)ŠQ¡8é+E …âÃptgº=²U½ô3ÊSo®1÷ôÞÿ 5Wq¶yÝxw iÒª³‹ý/†ðÔš~ð¨É—šO 4ªŒø§[¶’ûæ¯vFM=A–bÅ¡Òâ‚*‹J÷íý°o‡þu 'ã$;׊oâ€r­n0‹M‘ŽUœsð­ªÌüˆš~Y‡Yä–FÎýø4ßT °’çî¯MµG™c‹™UŸØ0”¾-›•cêjž­]r{>˜GÉÅDˆTË> stream xÚµVKsÛ6¾ëWpr 92IðqèÁvíN3žŽkɽ¸9À$D¡Ã‡ €qüï»xÐ¥lZQ:é…X»‹Ýo±€¼ÆCÞ/«óÍêãU–yeTfqæm¶F(JÒÌË1޲¤ô6µwïŸ ^7ì–m™`}ÅÖL…UK¥ >o>}¼JñÌþ>ŒK‚J?Îõâ ¹@+i!/ŒsøK¬ÿ?‚2ói;²›™í|\x!.¢,Ϭñ-S£èe&IâS=¤þð„„ø±JÙù–Ke—xogw¼ âÂßÙ_Fÿý[°ßQiW¨ý0ˆX¹bmk¥š þE»aµ ¬°/©ž{2É]nV¯0ä…<ü v–ÄQœ—^Õ­î?#¯†ÅO,•…÷hT;/…zäirë­W¿¿ Í+šs¼0Š2@0Ã$ÂâÇ*:>+ÅQY`@F‚­£ÍPˆ 4y öµW3ö•ì¯5 À„4ý ³“±:Å|mì@‡;#ÚÛqU¨ÖÇ à) ±1íG]5Rø[ãgèô_îßX¯{ý¥V>ô›Õ"yaR|OµlUÒ…>#i!X1ÿÌd%ø^ñ¡ÿ/`ÁŒ³…êÚù xt¡L” „¹w&vvƒ°–·B£«¥ÁöT°gw‹•±ñ8Ú˜Ãê\â,ʱƒbÝJ.‚0£8†ëÐ$tHU¹¨{µÓM:¶Š‡CÔ`æ d–^x*é gQì’îß±ùs­^ïk'úöɱ œ8÷åºL¼o,/Í *!˜d½NHQsši&Ê” ””vòÛ‰œÒ,¼µqL1áz”7ND¬,é«ôò@žu5tíëo‡½Vƒp µCsIÍšE <°úkÍzÅÕ“ý3ÌÂä2 Wù1¤™$®2üCHóbè¥c¥t~ˆ˜ eþ~gîl8ÏÀ¢ÒxI°:ËtŸžß¹é÷´ik¨bïí„{€d©RK³·ì¤û¸f¶©¹²/kª1‚0Mˆ¿ Ý×n.ÉU*ÞÁκ¿0•“h€ØÇ 5t)µ\`"øW+W“%w–ŒCŠÂÊ7ûU䓹§“×Á)ß\œ-Åj4£S.‚;Ivô"8ñBxÙ"‚Lh¥yˆ„7JAL endstream endobj 1626 0 obj << /Length 1411 /Filter /FlateDecode >> stream xÚWÝoÛ6Ï_!¤¡HÑ·¬u}HÛ¤èPdCêö%Z¢m ²¤‰RÒ`Øÿ¾;%KþŠ3ˆÈã}ßdzm, Ûøtö~vvuë;FlÅ¡³…áØ¶åù¡9Žz±1KæN'Ì~¹º ççEŠÓ&ž÷m–§òV6¢žM¦«…@©3[ÛCþ@ÜìäM7¢GZ®ëe»ÅÄsY#GâÛ_P7ú=EŽåz!)*牤Ùv`éƒéGnľжæÍÜñ@hb!Û'9´e¦[¶í’).%>n)pÁÒ5ðMÜ){Fc>kJ2ÚJA‹EYÓ¢Y báÏŸe&­Wx³¼ik!;äaèŸD|¦ëºÊü*g\W;£NV‚gLߎØG±àmÞÐY&GÌ“BŸ” ú>N ±¼Îø<×ú–uýn6!lÙû®%nuPȸ©¬…V Г°ÂŠô¤Š-´h‚j'¦Ã°éÊ·ïĉ@¬Í1/Ò‚Þ„¯‘δÌËæ„k„lW¹î˜Êõ=8:¡¾N‡î²NAÇñ+|/Lb5½8f®Í7˜gÄ3"R=<Æ `É%m°9-xÒ`çôm›)%Y±Ä^ ðáÆò$*ÐHCAÎJ•¸”¤^ÛA€(5…f^‰Ýë׆— Ò2[QqYe[éµÌÖYÎkÚl¼†MS.¨ÖGO«,ÁhWš“´@FLÐf%òjÑæØÜì©~¶ÀQñƒ¯Må¢=†_•‹KªÙÓJº]ÔóøD¹ÂcVæ™>¬ ôǽ °B+ð‚Q‰­Fˆâ8Rê^Ü75B6u÷½é¦îYWp¤ö©ÃÍ š¾§« 侚Ե‘Ô}Õû¨x¡`ˆ‰ÐÇñ![½¾/ƒÊekšòV7a„Þ…s1µÂ~Œ€×a ÄU³.a)Õ²ë—ÊÛT¼îEÔWùQÔóRŠ.Õ×UI LyTÕåš…v´¥Œ¥ðvÍg4)âlçù–íh«Eó|ÿx¸=ÎvcaD¢weƒIÁ¦¼¢©ÏÖyêû4®T ±Ãò|óFÃ^h6S÷| ,ãBKˆ\] à‘%‘pС•øQaÔôHâ µýööð$´i^‹}Hízݽ•<©KÊ! êšç´p§OºKÅõwØHUÀ¦¥~p V1’×%¨Ç˜O–ljxéEjRºï“8$Üþâ]“íÍÄîÓÄÐÄÞu˜-·ÁIúU²CÒeDÜ%5²Gž²¦ àÏš5zJËû;Boè¬,ó£¿|¶“rzäñß;£k9e¡ßçȶ\ŸT½yù€^|‡c.ê¶ø©Ç‘ 8Ò?é`ÎRçØ9jñw›Õg:5^"íœWâü’xàT48ªáæ}f÷ßn°e¨¶¡(ÿ(3èY46÷š+•Õ|ü)×<ÏÏ»n³íÖ†å…Seòg“¾£ßžPßÁÏ„¡ÏñCæ±t/ 묨1Fs(äGÞ .ê䢟—';îî? Ú;nîIô¿]Hpib'#â¦H1²!0vZ~÷½™ýØÀ!„ endstream endobj 1636 0 obj << /Length 975 /Filter /FlateDecode >> stream xÚVKÛ6¾ûW9Q@ňzëÐÃ&ÍÈ!E7'®LÛjdÉ%¥ÝúßgÈ¡dɼ»…‹Òpf¾ùæAdOòûêÝzõö>MIÁŠ4LÉzGx°(NIÆ9K£‚¬·dCßõU½ýT•^˜Óƒ¼ÓZ˜ÕÙû¶þøö>æõ8à,Ë#0nÃÂìYÎ݇õê߇e@øè)Í!)«Í·€lAø‘€¨ÈÉ“Ýz$1€Ébcµ&ŸWŽö®Ÿ6œ8Ÿ†Ã–Â4á,‰ø< å<ƒtýåq@ß·çsª;Õ—çGIFEcž9Ö„]îZ… }ò’Š®2J¢F…Æ8t:¨ÏºÒÖó2)QÁâèU¤`ðñB.“"cYcð¿I]ªêÔUÒ4𠳄òœø!”B¢úú°ý8Nè®oJkÞRúTÕ5~/Ûfàɼ ”7òɽՃz©$J¤ÀCÁNŠ®DƒOg¬”ƒ³Z(IÓšy~–s€è´½Tê^Z¢!:(+’#Qò¤¤–ñirÅ´³ Š"ªû#.Ú>n8 ÕApÚ×Bá'Äbö –ŒÊ%¬`çþàÁ7DÙ»25aÍ· ÔÞW‰lðÕ˜e®Á¦9õMB¢„qak±—‹™\Èl~#³W]ñ5HK›ÑˆæÔµÿȲûe‰Õ]û¸ø}¯ÚþÄÎsaŠB×CIÐ_ññÆvË›ESeÝëN*Öˆ£\PÒËZýá¡Uš}Ÿ)…Áòvkêjo¼¸•1›(â/0,ò—dñNíû#ä> i§ofó™,bj®FÚ¬£7~œAEÞa}–½®ü[¨Rè˜%S—&|˜N<3~Û`Ëè½)î?L+|q5q†Í׺FІêÒ¸:aéÊŒßvª=¾h6/ÁÛh#CÎûÑoYCqV_ƒ(.ÅÄ5‚…î‡FnûÆÄÕ¡¤r ¬O°_8+¶ø†9ÑVZ7Ìÿöl‹…ë*‚ÄðýÉ6‡e©U"{ân˜Aâ2ª ¾|˜Sˆ/ð¹ qtgôü ÒgÍz6Ïf°‡ÉÛöÝ©w%âŒéWð5mû›îCËÌý‘…¡‰! »Ê£ž×®9ûªí 82oO¶ÌœlcQ¿œÁq=_¶·á›„#9Ô¶£sRÒÑäü~9Ën>3>ü×)wÚÁA ™œ›ƒUk¹ -ø±œ¨=–ý„cc5¾¥h~ªŠ›÷‹W¤önð.A—¡éæX:Î1ËŸ½Rˆª©ðŒ¯öté¤üª“&×äs€Ûz endstream endobj 1645 0 obj << /Length 1422 /Filter /FlateDecode >> stream xÚ•WKsÛ6¾ëWpr¢¦÷¨Cvlw’I=®,ŸœL¢ >T´›ß],H‘š–/ àûöM×Ê,×úcvµ™}¾ =kå¬b?¶6{Ës]'ckéyN¬¬ÍÎz²wþsóíóm÷$ƒ0rB?‚{´Ì–§÷s?±¹TÜ>ˆ ÏÌ\óÒÍföï̃¡kyÝ#ñ2‚ë+-fO?]k›ß,ØZ%Ö«-¬p,ÃÆ¹õ0û«»ïôŸ˜$}&žëÄÀ-ŽgÕ2Ñ(ǽUïøÓ" BWhr¦ø|D‰Íèï0YÔhÀH{‘v¡Í·¨Ç_8ŽíºÙ*ÉR"†›<J½ Ò8p•:È2ã=x’X dŸÎ;4­ö'7£Šêì xÉEöŒÏoÉ<M liƒÖ´°D(‚]⼇§ˆbp²ó;´&˜Ò¡Ô;ˆö†ª9ËUHÈk–ñщùd"æ‡ùO+b¥ÓôÀŠÕöžª‹1³ºf`ÇÈuíßéïîñû÷QÑ=×nRŸ']ç•H~œðébÌXÙÎIs@2”ÏØ¿¿^½¿TŽVùÈÁ»Íø‘ú ålϤ[6…£½h«çœ#’ï“‚ûxé¼Ë(†W{Ñ8þêhK9%+øðöûõæjœï —ÛªŠoÖ7Zv1â':á—2k È¥TT=éÊï¸09æIi:(íKÈ—&"+ç(¶õ©^LBø‘àðó &œF2åœ^Þ‡ƒúZžß…I0‘`î´ ú¯_ÂILs¿h êÝæŠfý Sa`RbâTÍA/Åê»Ë³°'Á9 ?@]êbÜÅ2VìÚŠT‡Fqšy TN÷•4æšïY“«“˺ö2 HÁàömn®îãµ–±³Jü“`m«0¦7Y7Ôf2åG«×ÔµÔTõI­-º§zvשjÚ쨷kÈ_æIÛt)¨h¥©u÷ºË™öè5Pdnq¦ý“Tù¾ÿäŠí:Ìi•7EÙŽ©“a{_ãá œe¼ä½ÈÒºMÏGŒ%éIÈžŽ¬AY' ]uN©Dð‘Œîð€™Pä!`‚h·«ïk÷^Vº»þçGvÑ©Û÷ÃNݸ#öF@ ˆƒŽÚŠ*¯2¡OÓ`Z:6}쌄îa¨# ïî¾sÞ žÉÔ¹(§ÖLš@’ܼlNñƒÊó÷µ8UÃúy†í›âدq9l¹JT ƒ|¡Úùx{ׯ#xx –‘1þ±zO[Á®•^·\=ÓwÀ®Ëf¤ôwÔ ÅE5J¯–¼#ŒûP¼é†âŒ 6¥ë”wìƒë·Òœi£6¢,oƒN‘ojè#69i|&™-¥¹óò®nÀ]´r, LmC5ݯ ‚¯¤ÖS|JdømA~k•RãÇÀx u³™ýjW˜0 endstream endobj 1652 0 obj << /Length 1470 /Filter /FlateDecode >> stream xÚXKsÛ6¾ëWp|¢f"†ïÇ¡‡8i:îd’6vzq2 DBŠPЪû뻋ЦeÇ\ìûø°»ïlßùmq~µxù6MÂ+Ò0u®6Nàû^§N^ÎUå\»¯YSö Süœu¥X®ÂÜ­ø2p/ÚÏ~”ðRÕ¢•Ë/W¿¿|Öf×Àd¸¸ðÍ©À[\¾³ 3øŠè°¿–E겦çKÖ>!ÈUPxiž‘ðG®útYEQè2÷’÷SDëå*IÝx êÚ±V»‰@Ëæ[J¶coÍgUñŠXJÑ.ÃÌU¬nëvK4µãÄwÐ⨲fèZ—õ¶e@3\Ñ¡…h>øºHR²€5 ®GnÉ›FÒ´ni4'ÄnÅ#’l„ò´§~½Z|_°ïcÓÀ÷ü,rÊýâú‹ïT°'zQ‘;Gͺwb8=‹#˜7ÎåâÏ{÷m¬Ä¹í|Ø<…p$EèÅA4‡•Š_´›ÆBˆÈ´˜ìzE€/`LÂ;{­InÌO2¶^&üøSŽ7µT]½îÓrq†ià"Raε ^ÐiIšyQúSN#çÄ3)‰"/ÌÌEzÃeÙÕ‡ñø§¢;'ñ«]ˆÈwÓ·¥12Ýrð“Ye†Î*gÝ „9­ÔÖ%«ˆÁ ˆë³ŸøgßZÎÏ`MlˆŸ‚„µÉy(•í}Ú ©ˆ×ðå¬ÄÓvô%ÙþÐ`o;Ѽå*޳ÁZ c/ù¦oh>nVqÅ»ýxcºÅ¨hÇåN4ÕþŽïÞÝ›Q ¨Íqõ½gM­èÂϨOzJÏ$:;Ø+ŒTXxIa"õI²í|› y~"¡¸N%­g¡“çDW±†§^Ì%˜5mä•¢é÷‚Ä÷Ý_h8k_‹¾U|ÿêìÅœ (!F¯ºm¿çír±’'cõHŒÈÙwKÜ´Æ@îG%ЬJtO2ŸDzQ”Ïïä‘xâk*]=Äx‹ˆÀLy9túü{;¹)ÑxñÚV4JtºÐH1Ìx§ni^ñ ë5â1Û²p´,xÈ´-dø³½€I“è]>h§mñªí8#q›ëy6La~ÚˆŒ¸Ø¶¢ãº['];Ö~TÔ½E³DaƒãÐÔr˜Yioh⻉û “Yj¡KäslÔ÷òQ þ´ŒŒÔ ‹—edlæŒi…â/€A÷/¢8‰'ØÐ±QÜLµ{> stream xÚÅVÝœ6ß¿å¥PÄ|C•V½»&Q+UjsÛ¼\¢]¼ à ·iÿúŽ=föã²—ªê ŒÇ?ç{LŒAŒ·³›ùìå›À5R'¼È˜¯ —Ç"#v]'òSc^÷¦ïY翼|E#¤ùNÄ Gan3AͺÜò³”ðÑ—À Áèœ=´½˜>o¥‘™Õ=‰˜(™¶›8~’àáw´ëy+,Û'¡yG{žu’L¶²ì02ÿ¤y‡›»ÊrM ]ÐQ!2ä·t‡ëºZµøïJŠ[ËŽY6XÇj±DލYw¤ëšËÛ¬Îû¤g½ÉxŽØ‚þÜ~ ~ T¬ÅsS-À\0Ñw§aˆæX¬ÙñéÞò/Ï"ÛÐË+ç¼ÒûЪN)çC©ó¾Ñ\÷¢nË7}sÜ÷äÔ|J¯/èƒ*6w’gA ¾ºžøM¾ŠG^O;Ê›£5ÖßHÑYßœÈøMBï"M&ñÖqW2q” 0Ã{9Ä%­g.š!·àérA8þÕ›ø½#G¿äÝkΚS à¡BÏèª=Pqò1) ÿ¨(‚Ñ™ ü¿†G^,6´•ž‘%òÊÆ.?£¿ßqºzþê™ç¶pÓÿT¼GÈWŒ³ãI|Ô{†‹nÕÎ7¤ €³] ,5·?OvC)/?û„ùò5C½— endstream endobj 1579 0 obj << /Type /ObjStm /N 100 /First 955 /Length 1621 /Filter /FlateDecode >> stream xÚÍY]O[9}ϯðãö!¾¶güµB• ÝJ»R¬öñ@“ EMïí&aiÿýžqXš œ”H<s}=ã™3ãñÅú•QÖ‡¤8(ŸUvò”•¥!â]b¬r.‹à”‹^R䬬«@ðŠ- Å^À•7N¤‚L2*ú2bU¶^eYÝ1!aØ} rAc.±ÅÚ)‰iAÆ IÌÍs{³äÄàänÍ÷ël+‹‚˜Ë¤DP…eS’9+f¡ c,cs’rÆÊ>r†0)£œµF$x; .qø‰ q1DÆ2ËXPލ‡à` {öJœZL AsÀÚ.$1ÙâmŸ8ÅEqz°Pð6Ã!.‹åN$ãÄ E7’¬M2!±ˆ–Ø ‘ób­3°ÉˆbA!žDâ¡àœ"¦²ªH©à±.| 8Ä>1 A¥Äb®ƒ†$Ñ °™2Éz 9Ézd/¬DtVʘðeñ–;89c>3y¨€3˜ñ›e_&‚ì3ÈZ6È’&0,L‚f. ا Þ„Ä[BrcÂþ3e1)—Å’ò¶ø3¤âlÍ»âo•/eŒ{f™êñ’S¡>ñØ‚é}̰߃úâ1HRå` I¢ìÅnI!v‡ü[¼Í*–¹H ,@©E^{N8 ööÍku zdð‘jþüëoeÑ„=†ìµø¼»žLÎ/_>‚6V3â¼ ´g«|\‡æÄÚ՚͔5êC%š2kƒW¢)jS½I³ÎH»J4±N¨ uh›²NÈû{èþ›«½=ÕåºL;Dds÷®¢ÒÜ>$pÓÞ>Huc{«ë°{ÔQyÂòÍ»i?:nçêT5ï^ªæ¤ý2WwšO¾~nñâü²4¯`EÛÍgRnY暣vÖ_OGílQ‚ËØoíøêü ÿ¢N>;TwEçSÌpaÊ Ùﺫ.Î ±§œ"|§¿ ÍA?·Ó²¬9k~iÞ6¯ð€T;KF؃³N’%L‰ïƒŽrbyáNîøúýk6¿^u›ý½½¢¡Ùͯú®9n~?z+??}˜Ï?Ï~nš››}CºŸ^6'Gͯöß8Ó¼€qÛÙgmÔ¨ƒ8qt„¢!mQVœIȚͭ›ÍÏGûÛéŤ¿Ñ£þSóÏu;ð¬A¸Só¡¿Îûá¸]Ûáb8õ“~:¼ê†7®æíòû æsÛ¯ºËaß ßcärÚ_wã~iÓ…¼¨Ôwä͹p7:Ö~-Ó—Áw…%:òNÀðrÎT‰ö!ho+Á8®´ô(uh—ƒ69Ö¢ {ô©m“Õ6òC…â^m¸_5–kÃr5ø®†,—­ E^S(re¡À¡X€ËžÈ›°.?@¤lÜnÐ@ŸÚ&s%í ŽœÚM2{m«]Bl·µÁq8ü"úÚÍ¿*NoËbñû÷,–.}[Ë%¡šÅ÷Àßx)=…ß Ú’–Þµ-äaJ•h*ÞYÑÚ:ÀvµLI$·°Ý LÝ?ÚѯG£8ðº|´Y‡ Цiä´«õ®©:z»4Ît4f•h Õ2U•Fu}ãkËÃÿ/¡[I¸g£wBCŽ«=:ߢ"ƒæ+dàö‹ÿŽUó¦?éüÿÓÑE§Oú~òBÝo=åž]Ÿ]n“ûòZ4A‡]wô®G“EË@•hÃjTĪëÞÖl¢5l¢`=-›Ðà'’ïu¬] d°+I¾ÐiãùA6}üÔžw³>Ñ&|¢u|ŠFsv»AìÍäJ´|1µK“/¥J´M¬ ågל±_¥*Óög7ólX‹oÐÈöÝ  CªD{J@ûJ4CxvÍ™w«ö¦2À>­ØÛ ¼ ~üøX‹¶F»èv‚ö¸Œ9ªµ›q›5k{õuhòRJj-‘èîŸ][h•<ÁnFžåƒÌ/ì.ßêŸðD»ý0è­\—åßJIglÝ;«}¸=:8ŸŽúqû¶»˜´å#áìݤŸ/p?f–C¹q>ßÙEÁ–ñ˜]P4kç_Wí[9|ƒÛ —Áfã—î¢ endstream endobj 1678 0 obj << /Length 559 /Filter /FlateDecode >> stream xÚíTK›0¾ó+|4R1~aã½õ•H+õP%{ŠVZj¼‰ŠI£ý÷5Í“&j•ª­Ô ìñ7ß73 2€ÁÔ{7÷‰@!%¨óg@0FŒ A‚)0OÁj2³6֜߇Nü9&HÆÌ¡užŒµ>ð?ν¯q&d-$E€^y‹G RwxÜ‘ŠÁ¶s]î¢KÞ¢`æ}Þá®ò' ÇPDE8>翻넫ƒ‹‹@2Žá{SøAD¡û²HBý¢ Óš1Ü#Œ«âq¬~FUÏžd_`ˆ=ûÆê:¯š¼\ Ø 9ª‰A@1¢lÿÖÑg ¹mz«|nW>ê¶6Ö¤½•¯ûU›¢^Õ»ÿÚdµ±vàpB;hc2â(G}Ì›df”ìùxŒ¼í¼‹A'¾°¬WIsÓ45>á¶ý”ýÁ7ŸJhtSÖ§ uÄ;|†&=¾mÁ#J‹ ÂN÷eI¬u1]d'Ík…¶y³ì­YP-k® ):ˆÌèêö4¦ôӞȵ"ÍÊM­Í¯èiÙÖ i*{†i™£²ÎB÷Ú ¡"´:7kmP’¤8ÂäéÇwªÜ`ø­Ó‡QŽbEŽ{mª´Í¢˜¨Ë£(¾>‰îü€ ;¬ÎaSùm„ â ERÑÛ )*Š¢¿rF½®T]Û¦ç]Ë_çöì˪í¬/oYØ?2àΚãÿ´û¦ÝYÚÝ«ûìÞ:[ endstream endobj 1691 0 obj << /Length 926 /Filter /FlateDecode >> stream xÚµV[OÛJ~ϯ°èy°¥f³7ßÐéCÈ =T¦¹ò%µqè¯ïìÚ›Ú`P+¤Ølf¾ýf¾™É`-Ô°öqt²MN9Ñ\äZÔÒ67Á1ni6!Èb®¶ ´KqãëæÓäÔ²–Œdp”Íl6=K êè¥s¯Œ²TúŒp}\ÃÎãƒ÷˜ÚpÈ*ŒíÎ3ª^)xs˜^Ü'œ\«ó,.Z˜ ìVŽ6&2Í ts+À›1ý&‹ãL2¼‹ÒPqŸ^ÞÉ3‘×nûúö@JåYR?äh¹äQ½®§AçRÝäû(©è  ™ YÁˆÚ¼  xÞÓnÝE˜õ+Jð“ì[nËÌÄX?ŸÓJ×Vú$†©׊·Ý87¥›Atû©ºM #Óm G˜Õ2 ä´8%gËnV˜ö°’ùÍ/–Ûç8á·ÐY- ÛÖ§}i²zÓÄõåçÅŠœ aÄ_Ãèdu¶$oQmµ\0ëù–<¨f!Bê4…4ùCÕwjHA§çŸv…Ó+5Ó—gç«ùÇ?Sÿ^7hýi¹9¸µ2ÊŠµ;Œ£u¶Ï}ñ†9öíVM×rWO&A¡,'ƒVÔš~$R_ Ï °‰É·.6¯ÅDˆjÈNã"ë$4h¾=¡Ù9è^¢2ÿßKvqO•u¤ÉѳøÃý6Ü_ÿˆ¼{g()/²²zÉ÷©’N5F®é¶™¢ýN wD1q+—¿ÇÕ³Ì ÷¿ÃZUª„‘Ï­²Xß'×Y¼ˆŠò 4*Ôµá‡êñ,$8‘á<÷72ymr¡¹ A+÷ó4ÈM .£ùfô}DTA‘‡uC®¦ik~2ºüе¾pÄ\G»S¦‰Æa#±9ƒ÷X[¾ô–GµÓ´*ÒeAk1ʇAñ¸¯ôí*O{œq¬¯1ÑÅ>7Lª{ò½„ŸÁ1À@ÆLG—`†Iô0—Ÿ Ýá Oç5áVañŽU:Ù´®†DáçÑî—˜†Í˜5Äç•uPPÝK­¼-¼P ïã^*m}d5©‚sÕ¶8†ä¸Ëìú?á×…ö¡îýíbñþ¡Y¶^Qx÷ÃLcï^äÅ0Û,Â,­Ê2w(ÁÞWùlºEu¸ÐmA~ÔyO.n`/…A?ŒÖðÊ}.‘fyâÅÑ•p”ˆò6 Zž¾Táh‘…µ¥–÷õls$;¼8ˆ’6rÌðûÎnù ïŸý endstream endobj 1704 0 obj << /Length 1491 /Filter /FlateDecode >> stream xÚ½XKÛ6¾ï¯0r’€Xуz8@î&´Xl]ç”ôÀ•h[]Y2DyÝÍ¯ï ‡²)Y~µAáƒLr8œùøÍCrG‹‘;úróëìæÃ]&Î$ò£Ñl>ò\× X4Š=ω‚Éh–¾Y··ÓßJÛO¬F,jÞäUiÿ9ûýÃóŒÌõœ8 @¯Ú„(sãê“@81„ÇA8‰?û1Ì´åÅ™çE#j{º®õ =¦ïQ(ƒI“0$Y™òB8뉿£…Œ7üÝàÆ,_I§©œ¼$gD÷´¯÷÷ƒÛ^œ­È˦# ` “¨S‹l“*´Ni—²Á3†Ýç«5¸ÙÔâBû×µ¢~NUg=Èî¦÷OŸ7½Šú¹’Ýf_‡…ÇQÓ㉺юkßÝÐÓ”a& ¼:ñDmZ/6+QÚo5²ÃŸþ³Ç'Tä%N$¤¨zþK¤MŸ&]¿YìÇÖT›•t–‚ °žÄè1@t\fpàZCǘº$pÐ× q)ùÛi³BÌzà+€ͨæƒ2ϳ¦­²+/meh³ÿÎÇ€|Œ®õQ¥¼{tRî¼Tς۰ð†¹u´Ž³ÿξ1U/ÎལÈÀÏIF5ŠÒßGPIg}ÊWÐÝãh­©ë´ªëëÀ*ÅÖÈ' õˆ¡ž Ï-2Z„l'J ªyAGÏ:ac-æ¢e*NÛø H}Œ±åÿ ¯¹àÍ2ÝC㽡¯È7‘ÚÜaM8¶Àî”u®x#5þs’:¸_làø¡ÎReU¯x‘ÿPûœ•h–UvÊô8r&X4=R«G:aj¥)¥Úƒ™šàEöÑ3Z÷Õâw°Ih `¤áxº¬ä;£Œ{À"{AÔ}jÙÙË=Ö2b-Þ‘=ö¬þTmr«vþtn…)©/÷â‹1ìßu"çyô°Yáõ?+tEm:Â,®Œ›S”YVu‡LÔÅ€ sÂ4³ñ9i?œ.ÔþŒÌ+À<3ážÍ·Óá|kPú°½º”Ͼæóq< bÈîõ×"µ< ÇÖÑWÊ/6m0#K.æ4ëu€ÿ‘¥ÔA⎱¥i±w'ó¬Ý¸] íÚV%+µ<ÌËMórO¯ ’ÏäH“zeâÙ/¤76 å N«ÀÄ ò§€€é¦àd?NìíעЭ›Ò±ÇQ[³e.i=ååPªáÖh—;Þì{ž%N%Ýûî{î™ä}0Öobɦ?ÞÛXý,¹&RL>sŒû7º$Ä6Lý)ù Võ@‘žœÙS˜âPõðÄnšÈõ/ ˆ²± Ê®…ƒ3Ӧdzb½¸9Ù¸=^áØµ˜1¦k®2Hek(B X"8%âÉbϹ’1 $ü))·1]±A §¡‰"c™rþV‡Eä)š»´÷±nK~:”Þ•X27D, †b‡é×…#ìá[Dr¤¯=lØá,Ãy¼!ætC±qC(§n¨·A¯Td¥Î !!§pw /UÓ¥¸¨û)¦7ìq¸t><·Ë\¯†)V}‰ÑfÅmèÃÊ|SZ†^T}‚¡\óT c’Ã)ìÐô.ÅFµiµÞ¨´y$3‘Ö éœ¬y“Љ¼^·ÿ$q¾ó¿­ýº*äþÍ“‚ƒ—Ù6Ïše·šëuf}á)s®¯ó…š‘R½hìÖÃ¥m“ñÁä|Ûôd$Ìx‡í…Â@C BW§•ŠÍ^j›Ö=ÁÐ=à¨Ú-—Õ¦ÈH`ŸI`^¡tßNyd_‰kG² Âô‡‡$ú7häaÙ­ÍïBLê Þâ „ÙÖ–?¼(UAÕŸ9 í ÀÁšçõ6—Zd ð¾X5b¥> stream xÚÝWÝoÛ6Ï_a¸{ˆÕ—%+X¼42¤Axëƒ`´DÛêdÑ ¤¸Ù_¿;¥Ê®âeë[ <’÷}¿;ÊÎ`=p¿žý2?{; ÜAÌâÐ óÕÀuæá r]úñ`ž–Ž翽…a‡Ó\¹èÑ<——ÓëbäM¬J¬¯2Y Ì™c,™±½ d‘?"‚CŸtdG ì`[J”u^•°‰k¥ä–Ž9-ëì eDA÷JânOwŸœ±SmmVRmyE\rEgíåV¨uCòJe_ÐwðÛ†,Äãqã]’שHG¶Äè«^Q l2P/‘÷:ìI'ì…Ù€ž²:•ä›Xà¥kÕE2r­ É iÌʺÚÕDè2ŒÉ³f£‰oI5Ò’â ßîrqAe;r!ˆB%&(Á¶w‚¾o¹ç}‘Û¾¹¶]´h6E"s¤ëxxiLE·M¥Ê‹ƒÈ;èº9ŽY…žáâÜ}„<8ޤ÷¨= ±Ø‰ý]¸çÈ8FÛkÿ ²ÐpzÈé¡J·aì ²Ê&a|èÏÇM–`HÐØ#-ë<¥-–×%Nà‰k¥¼â¥¨èÚ£3^vŸö•¤í–I#hú‚T¹¶‡0bŸ?Pe…%ߌkh£,µÝè5N‚µqh}IEÝFÔ€‡³}Vm¨Üm1¬U=fã( Õ×+º½ýýæÆÀE{„â%bs¤³‚ÛJ ÑXÈs¢Úèq“È-@½qƒ×•ôf ÏógÄ<;n¤.Œì(dñÄçbæÆ9·ƒœõ$˜T©P§û0ò"ë½4€—¹¬I~MÞX'¯¤ë%dÇx«ÛÖ2ûÛD³’FNpOdmh·ã™Úg¥ø6ÿ0O†è÷$ÔR–âtT–ïT‹+ôz§äSþ[Œ±ÓvB´3Uëz+È”ÉÐŽ—ߤß7­ðj–éuѦcZ$©JÃtËíNt«ŽaÕ^Ñ ,{GN²0ÐO!èòÀ§u½y…†&»E ¡ê⢿}eæ‚á»Srš@J±Ñzøäò3qþlÓú jˆð=´×ÅÅä)R8ž‡»å6)>ll¦Åbx;>>ª,wy†Ï„Óe9§»-ïh†Ÿ>ˆj#ÓV•ß⛚´GãÕÂXÔ?¸Êø23Á«À÷’ŽÉK ƒ)ð¿Œß×ÅÝå´GʃùØ€ÇÔqºª°×‘ÜuKj²¸´f f›óg¡Jö*ol‹-dÜÒÓø°@ÆäV—éàR~µB¯8B9:2­²5S"­úÀêhî`Æ@!ö/qµa¦,Ñ=63¨+8›Þ<\µ™¶o=éþ Ólõ¬ß&r®8Ä+¨ß{Z͇7࣠5á>ƒ„ ¿¯Š¦ŒW¾ZN÷inä¾yæ¯ægÿjáã endstream endobj 1719 0 obj << /Length 1199 /Filter /FlateDecode >> stream xÚµWKsÛ6¾ëWp’ƒÈâ|ÈÓÔÄÎ$ãdÚJéEÍx`–˜áC!A¹î¯ï.Ñ”L1ö¡£‹Åî·,Vޱ1ãÃä·Õdv†ÆœÌC/4V÷†ë8ħ¡¹. ý¹±JµùŽçù»Ç$çˤª³rc}[}š]S·wŽ:.‰b´Ê~„2GÛ¹ZM~L\ ÃíL„Q@¨37’b²þæ)l~2`kR´0( ˆ(jÍåäNßéWúAã¾®CB@1ñÿ¼ļ§`mû>uÌ¥e»fbžYÕVàšÜ²ý FйeÃ'×,TŒddáÔ>ì9 ‰Ð×x®<¤™ ݈8>U¾çMRg;‘Uå‘sONeÍ Û ¥:ÑôÁ÷Íb¥)íOŽ€±Q“' ”¦¯ ÛðAâH§9ûÛ Ô+ø ë’y Vwßy".ä¶s¼Õ{ÎD[ófp{ãgB%ˆ³í8æ¯êóåëÍͰ%.H–òR‰_/n–Wƒò„ɶgÝÑhkt‹zÓ¼´|ÏÍhÔÏE;îGðä^•ÌÚ¦‘™ UKÞÖL Má,¸˜C ú&Ñ}€î„§‰·êõ¬î- yb¹¦€[©Œß«­N™\±¦©,ۃ˙1ÁSÅ|ÈÄV£WgeU¿ò@±Œƒvÿмϯ„Ý/áQ¸ÂýÒ¿“8"¥±B ßú °E]åŠÑƒ«†ç}>¦z»® E‰-×2¬ÐÔ]V*b׳™¬dùã¿<í Øò~D!™ÇÞñý@Ó–Mj6ín—g`Ï!CTÚWø‘ب7ÆüóY ÖòÄ"M?Wi«: ”I,;„ZÏïY›Ã•>š”ŠöVš,o54þ£Í4‹«èuå±"+3{¨3È<´…J{‰åó,5°1\D; ¸<#Cƾӧ 7ÕõV¦ª ¦¾~mOÉXuÙ]Bú·¹k~£…æ{ì#÷<èXuË/€¤o•ÈXe?Z/†§ß!łےmÊBKëÓKÁš-׋*Oû:#Ô™a6JF·§ H:»ÓW4ÝÂÏû¢¿‡&­qbÄÑLΨN¸t¸ö¯«b<1^Å£¯È_Ö\×íkFýr,0ƒ´{î?’¡šR²xªç« ’‘çææÇ2¹“Ty[”’giŠ!‘G«3Ú .˜¢R&Ø%p>7—DÆë+ô°wÖo¼¾¾ùû¡³þlÊYrÌY QÏ›ê\ÔÆ¦›çÙú™É«X±ËyóòÙ*e!í¬G„æá·oõ,Séa¥nËË.2DFÃÄ€âàõfwW$·MÁòüÍa69•Õ:Ÿ$Õ:­xS*#¿‡imNµÛñW#Ú²=W+“©­‡R\ox©ÂÑ!‰¬ªÎ9EœŽ”qÎeWAº=L£‡@sR UÆ/ƒr”…FÀUÕ"k´©=Ërvw`³C„Ø]Îf Ùwû¤ª7³F^³Ú¿•öo÷йœlE‘A8MÈ/öp4º³ëÐãa°}R{1X’ðè?mš ´ endstream endobj 1731 0 obj << /Length 637 /Filter /FlateDecode >> stream xÚÕU]o›0}çWXꤩ¸6þÀTš´¬k+UZ§Ö—¬š8$„ˆÖŸ¿ &¤i²=äaâÁûÜ{Ï=ǘ tk} ­‹N‘}éJÎ%3.‘G)–ÌGa‚&6S£§ðîâFÊÞNÆ V´[®t–U8¸ ¿#ÇUv¢GÔΘEºdI!xɼÃ(ÃÊgÈq=øÈLœÔÍñLGõºÔÕÈ„ØÌÇ8ÕK]½kv´³ó&:Dv(Á¾èJ­Ž +3¶P§)ÆâA÷Åë(5ò2»šæñÏ*²ìc®ë'Qõ#¸ûÔ3ÎÎ æzÙº/jó^®—ˆuZÏ$At+… á¢8·&O%°Á1óúÝn͵<Î`ž¡Àú¶mùîhôV}½¤æa©Ô+1½+¢ô{ð‰ÃÁö­2L¨ ¬åÛ×û(7½~ƒ(Ïübfð=ŽåŠÃ·ŽÁg]ÅåbU/Šå üž®W­VŠºnø0ÖvÂ̶TvÒ; – ,7ØïU”ê½I÷¡±1LÀÌ›‰™Ïв3vU]YÓ¬¾ï î§™Ø}awa{!ÍY' ѳG{ÎMã븞žšD¶Ht ŸOJâÔÂñC­þkÕb?ÒS8vÔÆeºÎõrÄ\»®¹#Gíe÷¢¢öžëzöxi~Åê”ö/ׯ¯·!MK·ë?°:œC¶9:Bp!HÇíH¢“º.ºê¹.Í´ÕÑܸõw ´ bö8«Š7ZV¨LÑfúp´^—QýuÚtåò²Õô pü¼Ù endstream endobj 1743 0 obj << /Length 1190 /Filter /FlateDecode >> stream xÚWIÛ6¾ûW¹„"…Ô®C®;3@0(RŒÓË$82m«LW”;I}ß#©mF㥛4ùøÖï-¦ÎÖ¡ÎÝì×Õìãm;™—Å~ì¬6£Ô ÂØIóâ sVkç‘,EY>ä¼iD=ÿ¶úôñ6dƒ'!e^’ÀPǪ̀q³šý=c°¥ë¸ÇIæÑ$vòjöø:k¸üäÀU–:Ïš´rBP ‘ké<Ìþèø½\µ a:4Q/ ãØ÷hLšÐ=ó³ÁÛG7JCŠÔs7òIéæsXô/Fà;ˆR¢àŒÃJJÙh¦Ó¶†À> ¯±ÕØN„%ö#/`Ƥ߄ÊëâÐr?2©7m&–:.K½ M­GjÁ¡æ®g„Ã’Pc‰>sÆj[ç.#¶õ[„àv¬;~y-•Ý7s?!Ïs?%Ò¨b¿-…y†ì!4Ê›»¡ÏH+x­À&M›Ëº%×Fêƒ'XR"ä§™ ¡Í“]pcEƼf‚ ‹Çƒå™ma×u¡%GšŸZµ9æF˜Ä‹´,ËÒðµ<›Ãp¹èló­6_ߊÉ(MD-=µÇ_iDµåHŒ­—O‰¼ù0å4Ÿ½yãOÞôÁ(%¿˜å÷/÷÷“Ô»b»+áÓœ!­XY^ÈøÐxªøWŒˆ§MQ•”ÍnDx»¸¸™$®¹Ò¹|‰ †Ö[Š}ŽÁˆxOÿ„0ÍÀO{y6‹z{¬ßOu>g`cðð¢òÊã&ýq¬yc`.þQL¦^e¡‡BðuZRäƒ$D²‘Ã̲畸DN<@ëUrüëä¼ÄþIQ:ïvž¤K])lÍ1õKe•tƒ%•Ãæˆ›6¯š„· ·¢[¸\è™>ÿN«ìŸT¹å‚u¯¹&.˜Î§Ã‚¾ZÊRÖ#‘!9*[`7²¶z èGŠÆTgM——\©Þ± ô¶eät6 wtµÑ¹°yYú±Yì±a4VlRª  .ó-[¤i%MkÂ"7’¸­ùa×CMUØâµ9k£«z};aW8ÑÍóª.åÞöOh¬µÎ:å=ju£]=Æ= ¡â&1Y‹ ?––E¡lMǨLõžTÍåó®ÈQ¡aó\˜l£„ ²Šòï§.ÝIìe©?îVF{-CR˜|Ön¡­>Vømg–z%ƒ .ƒHCºAÚ e«§µ6ˆ;nsáJ驸¹¯¢§ÛØÉúÁÏÅ¡g_Ÿ@•åÑLcAÔ&*^h†.ksF( [”dk{®c ô[!«ïÊ ¯’µ@¬"=l >̶îë´¹Å@ïAûEÿØö;9™e¡á8l³γªîQ\5G'¶GÛmÛÿªqžëò7?xu(…º|>LYvÚ$ðoÂþ)Xó†£3Þžªü»ªËïºQS˜‚#³ÉYÒÎñ¦gbÓÜ-‰6- Ú<ê›÷]bnÈbµ¸»[Ü-‹%|O=~ãá@´ÿÿD/«% _Ý-Aø¢_ÕÄÁ¿Úÿ!l¾: endstream endobj 1755 0 obj << /Length 1069 /Filter /FlateDecode >> stream xÚVßoÛ6~÷_A¤“ZE‰’ºí![“¢E0t‹»—´(›v5è‡'ÒðúßïŽ<)R,ÇiaÀ$Å»ã}wß°- ØÛÙoË٫눳ÌÏd(ÙrÃxø"’,áÜ—"cË5»ó¢`þyùþÕµ”I!?Œ#°ce~Wey«Jµ2M‹Ò³€Î¸ZÎþq˜Œ÷æe"|!"¶ªfwŸ¶†Í÷ ¶²”¬hÅ"ð ‰ÌKv;û³·÷xtÒ!øPÉ8öãTžñ`eå»E,¢Åç‹8ôà_ĉ‡šó˜{½ö4ª(öÃì{@9磉H 89ÿFéU[ìLÑÔ#ß0Œ“˜²ÏüDºÃ H„ðvóE˜zMQÏa0Ú}³0F^î–z•£Ú]ÙR^¯Ýd«Œ“,æÜ%îmš¶Êaap_{[÷pRâ5{Ò0_Uåh4»@gCt6vÎ~ÔùVM¢œ@N¡Ž3þ)ˆ„ó’^sÿ ÎuÃonh·X«z¼yáì¨5ÚÔ$çû>Øåè+ø³…ŸqîξV¹Ù·ê¦H>Ð;ŒËv»¯T=!æê© œ QÀærLûe€ö dë’Ò¼Eù3¡:<  óÄ)5 Ší“gEö,Kà¢åuŽ•&°Òömnh(ÇÚû¾@Y·³ËµVú¥[вt³VAÔkg(¯ÇFŸjŽ%Üi™¯nÌt*˜ø…Mg"ý, ÷³˜ra S¨®`6T)Ä ·Z!;Ûµ¢Ò1 å9E·φb‹þàAD厓ö£€ ¯V*Y0c‹¾08|#ŸK%UhCÕ®u±%[›i¤Ï'Pþi¼ÛÖM G<£0þžgÒË˽ú‘~øn3™“8àö“6„”éIÍ(Œl™Ò󀥨j#‰“:¯F¨ƒ4íug”êB5IØéöPh…†#‰MU»ÂÁ¹å¼ô\“ÃŽìÝQÔ°†ä>Ad1fM2bMW ç¹=pø\bo.Þe©›~~ÊÚ-ë¦íoŠêÃã>6mˆŠ“:ø‡‰æ÷¤ÿWÿåÕ®Túù7X ÆdÔ;‚-ªš/ènjè:j÷õë>{d×¹Éñ’¹ØÝW«/ºÊËòbx5 eÝ­ŽÖ~Y¸‘bƒ&.Æ“§,’—×MY6ºBkmÚý ûÑRÝNT[¶KÙUãFMO{2Ô»õŸhùé—x»"e‡`¦ný1•Ÿ·{êåÞ4UnŠDå[ç¸yÐR¾0´O}Ö¾>6C¬ª9œÚç–Í7Ýgö£l;ÇIWïƒ÷ÌÐᔲÝgïÂtúµô`vêÍdË<fßÙŸúö0ØñFo«)Ýz£·´2žŽ«æª^#²añt*G…Ïùÿ—qIg endstream endobj 1674 0 obj << /Type /ObjStm /N 100 /First 961 /Length 1606 /Filter /FlateDecode >> stream xÚÍYKo7¾ëWðØ^(Î _ò€Û Ø9´5rpämšÖ• [Úßo(;–­uC)‹5ËýÈygÖ”srÁQÎÙÅl¿Å)Ûou$ “£*ö¬ŽYA”à¸$#È “ìÛ@ˆ‹$€ÉÅÔÀÅ¥JNqd.mA]áˆWб­ÁU2¾@ÕlŒ+; Õ÷hþ„& HhRVšœ$ Ȱ¹`ÙÖL_¹Sä#Ýôç_~µtñbÚÕâ5¿¾¸x7yöì3è(¾Àá}hØÜCœN0oz´”äa^´ðjšk†{µDª{ʽæF]õ˜ûh1_º§OÝôq¡ˆ×¶í^Ñ|û€˜¶ yóP"W(À„\¼Ý¤VüVœqüôÍåbv2,Ý©›¾yuä¦o‡–îç·ÿþ=àÅÙ‡a2} )†ùòÊêfc4™W‹ëËÙpµª¯míõpþñìÅâw°Q!Šò;0:»ÄnÓjóº%p#|²"È úâÊÓ¦ÙÖÁ·fÃuã­"MÕãæèD§œ½íN4%ŠÝ‰ŽÌ>ÔÔ‰d®ÝI‡@s­>…^IX¡×‚T“/%Àý˜_φ{1¿å÷rcçWÚ ùªÛ…üôù|¾Ài§«ÖÃäi‡ø7ädzrý~Ùžü8ÿs2}±¸<.—ðnúýô‡éËSj&Ø *IuQ[<áÂÂ}ï=“E¼ÖØófÇ7ýnñváà…oŽ›ûÙÌæÃÕ·f ½BT¼]Û5øÖ %mEîÔ­i‘¢a‹±þ”Æš¼ÝÒ}h\í·ö¢Iþu<œ_Ïö—¦5¼Â\|M|Œ_&ö9æ­$±À±á¦;Oïï2/ d}aý¿rwQ¶s\­ö?ˆ«ºs\Ùô¶Ïpʨúhñ0 {FÕÅ$ámšÀ$í1¯>êÅßg×WËMê6>Ô‘ ‡î[Xw(:±´YV¾Ð‹ºéE*}^,\6¼xÓU·z¯îT‚[܆m‰}¤êHÎÇÝùüüüõâüúb8™-.‡ý ¡è+*¿À~‚á'Ãyp¯/J;ÈÒ¢†ê!¶¾ëáqƒû@sE·¤èT£c£æ(:¦ì¹ôj)¡ø:6{Œ¢9z.éE‡ì«è¡:íûƒçÎ)+›}·}ÜÙ9ey¯íöM—K±¶Û“Ѫ}J´nWOÔ“áúòlùÓû?pÈ“'/‡‹‹†×¾›õgˆŒ¶°˜D¹5Eþ ÐQ³W–^´¨©t¢õ7Ž}EÛܺ‘}[_z‡Î§(›ùi»|Z·Dä-Â4òXiVÏ£åsèh.é–DŠçÜ{vª˜´´t¢#Šm)µÍD^Ǧ¸Q4e›©å+/ä)m^’Ý y¢›Þ+ñ*:+#Îì»EôlÿV­5ÓÿÍCo.Ë=~?I¨‚¨=·‚Ø@&0Ãç9ΖחÃCaZð¤¸E®®ƒï²O ”-hÑ õ¢­q7:™$¡_û„;ж†8qîE3ÿN,[ÓúUÜ'ÿ¥ÆÜ´ endstream endobj 1768 0 obj << /Length 986 /Filter /FlateDecode >> stream xÚWK“›8¾ûW¨œÃBÕX‘ÏTöGª²•lvâìÅ™šÂ ñåáE0Nòë·% O.H V?¾þºÛ&hƒz;ûc9{yãº(Àk¹hù€(!˜Ù.ò(Å. Ð2F+ã²HÓp+øufZ¾±6ðäqœä›¿ê*Mx)̻廗76íhZ ˜aSy8#Éëåì¿…-AtoÍõløвÙꎠß!8 |´S¢²Á!Ïf°OѧÙß{}ÃU…dûÝ(Á.¸æ:>&G­Ùël‚ž" ¼¤h!WÇÒšÞOÜ\0Ç7ŠV¼yFUìÂÒt¨ }ÉžW¼lÄs-'ÏE¢_}CÝáêbUûÏÛ´¨”oãø1†‰ýø4LöHæ]baÏ×Á]q•ÉV¹ÑæP/åÔl|ìQÖb#ùò$#fw1b 0’G;ùK…ˆD<—4N ¤€µ‹¼–ü€Üjñµ.Y.ö-ª]ú, e$6"¶“ úB" ¨» .Q ‹£/ë¯<ª.Ô1éuâq1~×˼ÎÂí|ôà!z²ô•Õtµà¦,ê-^ï+Nbàâ¸æ&IXĽ+Ö´ßø_>0ñùý›÷sui1E'S¦ÅÞ”›2o2˨ÄdæNeÌî‚?(ðA˲=Ë3>ñº «†}Ðí×»Ùµ%Aq± s9iŒY`ìC˜ñÆÔƒ^¯’ìV*ÐĆQ_Ãøk-žáƒ¢Ç¤yGÆzÕVÕ¡$Õúd.¨‘˜ÔrS‡)l“ü|û{ÖMC }x+EµYY> stream xÚ•WYoÜ6~ß_!$Ñ–¢ƒºŠ…›:M8Eëu^œ %î®ZQ›µÿ}ç di-_O¤Èápæ›™o(ÇØŽñÇâ·Õâí{ቄ^h¬Ö†ë8¶/B#r];ôc•W¦ð–ßVŸÞ¾Ñä•åQâšïš²LwJ^ì––›réšY!ÕÙÍ®•JM}žvmqƒ޾÷lµø¾paêîpe ;‰‘U‹«oŽ‘Ãæ'¶’Ø8he°*>ÌKãbñ× ïxd¿â±_®c‡àiDvâúì×éòI“Áûd¢Ï³“Ø5,õ]”Eµ´‚Ð5óæPó,ÅÁ1«}Ù–Ú- #–p--ÓÕZœ 8YZ¡ë™‡­ÔÊšº¼eDM`"˜g.I°÷.ñƒØ,hŒÌ][Ti[ \nÖz»î$Q«Î&Ççcä9vâÄ/‰ÇBÌäXÀèi«—*k‹]‡Œq¿Ãš§18ÛQòñ/ËØ7ÓrŸ^—\ŠBsÝ´8‰ÌwWg–’ßù+­ÓòVIØúqŒØ¶’wKJ_šw8¿ÝYZT°¤vÅ#‰¢æ±Mûó˜ÿ‘ÙìöeŠ^(^%„a|SË ¬ÿ`3aËÀqØëÚ¦|G|ßÌdY*ž®[ wSñWÊC^|u|ì烼¨tbèm.Û ø"çE¶Óß{©Òœ…|&ñ#!x¢š¾:C~£ê{sý¯Ìº“9X@ÉJÑ Çü…‡W.ÏO?ÿój*0"„jzâüÏË‹³ãú†zö$) [3æ‚+îs =m7û ¢ã{f§…ø hŸ#>šÔÕ%"ȾSÎýËóœuY³’Ö™Vlð0æÅ¶Ù—9oPòAÚ§œÖ¡Ù6xìP§•Ô‰ÜmS­Eui«§‡¢ÛöÛºîdmpQéQÓ¾¨7:‡56h%¹ÀPCB‹Ûe*`‡uï1fÖpahûQ<Éž§[¡ù^rwå²n:²¿¦ à ‘ Nºþü]ý-‘ÒyIÇ‚QÆÙ2»¦Â p®%|XpB§ÐÒú4äû ¤:5¨0¢n‚N(ɄަFl*ßá D«,y{›¢'?z>ƒ½n[èVq‡)’U£e#²7gyJØç¸“`·ok™Ï•XŸw/ ßP™ÐèÇÞØüx@Ü;ÊêX·ØX0bå¢p™R8meKlÊTÍÛ G¼m?±!Ƙۅ&øž¡^ŽQýL<0òû¹æ PõÝâW@Nâ*ဠU£:^Ú›m©Å$³:„™¶ÔG©ÔB+!r¤ÍÓE#†¹C FmŽ¥Ö2}˜0 ¥( NDW]kƒñ;g±Ã éš–«fO5Ó¬¥Bs´Œê ö®õc•>¸¯ïº_±Có”ªÖ£åé$sfÚqâ@nšÇœæõ´'ûæ­²´Íe>Û¤ÁXŒ»É—eâG¾è}Ô·"¸Uøº1O7†ˆ|AD¾ù÷´J„ßs?ÌÈOŒ>~›l}6©?rÏ=øÅúö«ýt endstream endobj 1790 0 obj << /Length 1494 /Filter /FlateDecode >> stream xÚWK“Û6 ¾ûWhrYyfÍèý˜N›&é4‡L’u›Ã&Z¢m¥²äŠr6ί/@²dËÞuÆ3&E$ðá@:ÖÊr¬?'¯æ“—o£ÈJYy‘5_Z®ã0?ˆ¬ØuYä§Ö<·ì?ê²n^›ûmY´Ó¯ów/ßnO(p\'>l©–>®™8ú7óɺŽåvûG±Ï¢ÐÊ6“‡¯Ž•ÃÜ; fÒÄzT+7VÄnZZ÷“ÝvÇ­²!Hú6¸‹@Á(Œ˜ãÄglè6ÒžôÃ,H‡ÖOg~˜Øy±•,ꊗ4ÐLC×ø—ï²&hx[Ö-öb{±§‘ö°RÐŒ„ã§3×&Æ¡ |–:é5ØÁˆ#À"pÂàµYSl•Æ}H Üê&ÖÌMY¨¥?‰v×Tìˆ\›cãÙ臲ž¢=ê;CÔDNk\š®‚Úǵh×¢¡ÅУÑL”¥ÞwÉË’z…ÉÊlE£çÛúH¶ËVŸÑœ.+Á²À•†!™Ñ«õÔK”Æ~`×Kl}e4Ãd.èS*¶¨®ÒZ:$µbz´‚éÐèûa† z)s㈎ÿ[ò•EÄÉyo øüÅ e+.÷‡öÖ‹o"koÇ ¨ê\ '´’*Ë(BDZ§æ¸öÅí9PG%åNŒ‹ÔH„1‘U#ö¡3.ĘÙš ¸= 3Á]³ÚA@O} ˆ¼è‰Ë `RÉ € •Ä^lß‹]Ã5‹êXÙc’ý£ÐìTNŽº|Pˆ½’×0ö„¨šùzúq]dk½ ¦iŒÞãM4<_í.*ï¡ò&áÂ9Kꇓu”£…1ÏDnÏV/=%íeý¼§ô$•S%ƒ_ǰ&¿¦$T-H“Úç:û"+TÒ}>Z:ôÎ+¡&¸ Ign¹¤:€pTÉh/ø±ÄjV–é~:ÑãAIP¥iGãÕŠ#–&Þ8¨Úò‰˜lóÚÔvPÖK#Å~/U-¿]ÀÞ 1A4ñ f úàÔ´¸âÿêY)ªU»¦Í†Ø805ð×@è£kPPnUÀЬXî‹j¥R››°ãÌöc¦kT•¤ûÞIÀ­¨6”Ê)V؋Μ™mF:Ž2ࢦ‰o”îÇ©Ú]ÎðÍ 4ÄŠ”‹%ß•¦|ê¥T߸ÉÙ—8Ø×¸¾ZáÔ!…¡UA$Á«Ú‚wIÏL™nÓ혺Ê%* S¸÷Tô N$/”ó÷4›•Àu6EnhÏ×…<çÐ ï„<@DªÍý·ðƒÓ¬^”‚ú¤1oxFé†jݨ†ß§Pf8T_-:´ ɦÆÛÚœ6Rm·¼m‹;x°‘ð‚g¿8~€$ÌibA6]׉½hÄ#$88ŠÕ²¾è]  ×~µ'•4Á0N½È^­~žÑV+ ‰c«ˆ°Uè;ögź0jG@¯¨ fæf˜åîJ B@_c½ ÕhIúZ6õfpUU ¤é)Wþ; C®ƒlìv/Äõ9î÷¢´ß.FÊ Fä¢åE)Ù³SˆVrÛ2YüOÇäÚ›SiTEõºP¼íªæO1¨]”PZŸ™#àŽªeO*õ¹wó‰ï¼CTÃøaGõIï , ˜{1KAjÿµ¤‰J%Aè…JŽDc?ÙžKRð†Ôò¨”ï6|{ÛÝzL-••84øfüÚš°jêÝ–-öOƒ÷žoôŒKè¿Ä<¨œÔ§×/Ll€f9o¹~ÙÕånS v.)@]¬!*XU•è½Ï·0>Óõ§c‘øÁ7ÛÒ€TÃeuù÷þM“ ’I߀â´Èy3¬qFAó5Ìïu};-êˆ{^éuE|–îàr ×ÅÎÕ—~ë?4Ô@{øjÑ+5õÍ#×5¹Êí*9 iT!M"~nl`‚©›Îè’¢kÝ(©龛Пgð»è½™Oþ±O±3 endstream endobj 1802 0 obj << /Length 2100 /Filter /FlateDecode >> stream xÚkoÛ6ð{~…¿MbWoK(ú!kšaC‰³aH‡¶èH+-•¤ûõ»i[¶ÇAðt$÷¾#íîà—³Ÿ§g®BoŽÓØÓÅÀsÝqƃ‰çã L³Áƒ†Ã¿§¿}¸Šã­•A˜Œ'èКϕªêËby·R…Æåg®9ÄŽpR²µäGÁx’Â8\ÀTš\¬äxö£C`‡Å‡QäºÎ¯‹á(H|çæþúúœA¡«!uª¢ 3[KæÅÐsê¹’f⛹™\ˆVi½ñp¥žó×0 ª5[DÉ@ƒ¤G΋ÅCIbxà% ³ÁT—F 4—ÄTä9B뺘µZò'žªs¡ù‹ˆ\gÆô»j•’Ãυκ&¬ðØ ;ñøüRhÌ›£”ªý\”ŒYT53V ÐB†Ý.³YñÍ YK’ Èû>ÈŽ†me†@`V¼xb£ýX³£* ÐCª ݉ó{©~z+𖹘)ÉßÅ‚­ã(£ì]‹F˺ëO Y8W×w_ÌöŽ»8ã]o긡5Z0Žü S¬êŒzÝïºÎ¸ŽÎÑrg(®Z0j¥*­Ù €eƒÚlq"3j'5…¡3Í‹†§Ø;k=sFÛÈE«6äv=06X³/däIADŒ4  ƒ"A(`˜ 6ŒÃ"Æ‚¥Í%Œ·©à»­ ™ÿ©óÝ“áx…7fÍ™>k‚HŠ ª >/0œ„ÎÓ0ŠÁ¹‹ŒÑñ4«4º44í¬‘š§tŸMxÁYDbJØÓ02«Òî[QXè@MÞ.àÔG]èÏ\²>B7"&C7W/³j‰1‚Ø&G[ˆ·‰4ër/Ã=¨"DíXLG‰3ESä˜÷^F…€UÈôe}ÌRvY¨‘GMŒG!Âx.BÂq/ãºÊLv= 1äQ'¢ïµGyév¦îsÈCÏóLï²±ŽÇ¾Ôæ4ÀªÖ£¼Ì.šè ¶ìIË6ö4qnh¬ó†uú`ߢ¯ÈãvEQb&Õ NHâTÌ’A„ñÕ‘4tæ8Ù¢¸˜“›S97ÅòÓúN&PÂ8Š:ýt*hï°0È bÓfN7‹P»ú’/údîfÕË)iÃó9mxà(­f„à™¡üûb&êªÅ Ž«9‰r›k"‡\„áö(«å?ÔýP¶ Åzï‰>¡V¹8®€ ZFZ†¢¥DµÆ [¶ëmÐIœœ ôŽ1j •0µ\½%¬nåªãŜⳮ«ïò!sÆÎþm#$mn*•¶V«¢”¦[ì®Ýäývn¹ÍË‹Ç\Á¿~ Ç£ N)Ûp¹‡bFnmE-æš²Sœp‰‡)J†íRÖÅœO$å\S«º!’0GŒ¢Ô(dotȇ‘oÊ´PsÒ4¦{Fä6¨ieH2ðá´B+¢Ìif²)j™ÁÝ$Š.¸ˆnŠåÊRZ‰Æ,<<¡Â%¦™Q_Ó(~aK‰WdüA¥c€l›€÷ă;¢Éªš½0Ca­ÛzÜÒHª“†Èk•™£=˜a¢aÊðAСv%æ«§ßöíxÈžcø± Òx`e8/ãF â„‡S¨Ö3~Í” GùΟÈÑs^hÙíG2QGjc«†²”¼é/šÞ¢þï©møØg€çÂ6§B5¦¥„&f@¶xnz˜ÚÒå%0ºm:a}ï}CvФÞ̹¯×£‘çÃ=׸¹~SãúÚ—r…Aœ¥no‡8…’ÒzcEóÄsc£.DÕ6 Í–¼ï¾²)§²|¤;/Àj&]%㺹†y:µ×{EÉýM™Ú÷M/ë']PCì§ëúˆîZ=À ÖÃÄèÁ眄¬G¬Ô©d*ÔƒŸº}zÀ~9 7’^÷‚¸+9iÔܤ§·÷_úã 1ü¶Åå—ö.’ˆ´nàvn»¹-·íûº Ÿ|o/Åø‰:£vülÛ¸ÃýÃÍEoÿÍ>øœKã…m³î1æPw«¥ ü¹Ø¿ÿ½R8Kˆ·ãlß´Kä¨qç¢Úei\‹‘ÍJ ~£"„e38S+ʵ|“;¡ÞWKØþ&…Û³(1G›;cl¯ƒOP­k Âß8ÔHŸÁÛ=ƘªÐóü¹‚\ßÉ—ßéö=Ž|D^øÔ T ÿÍóP ½úât~(fk©ÛºÜz¦·ZŸ­;…å‰ì‹<ÅÄSsjDl^ÍŽ™‡lÀÅŸGéì´ÏùM£!N0øÛRh|ˆ ]g«ÑNñVÞ¯ÀĹ¹ÇJ|}Ýk\…œ›@&%Zˆ/¡‹ƒÍ½f3s˜åÌc‘ímQßp3À“ñ`¯à˪¶E<ÆBžëž»®»UnÞ§ÿq¶*ŽÛàkñ"¿ƒBOÁ¬ ûzÊO/8a¥Êø›¢´î‡Ñº±@<—Ÿod‹4ìB ±áGîÕ÷rcº`ý 2Çm‘石ªÒ¶ÇÕ‰:Ù¼Œç`ÐÅâ î©Z~i“Ô>…'®³ÏC› 'éº×Ð1±o²8 ‡Ñ«5}ñ&%Å,TbÝw÷¸–½»ÙÖ UÕšO‹1lôÓÖ°ýVaï™ cØQ¨'ö<üId™_Bþ¦±³WÌhÉKHÓAbn¨·”fšNž¹,– ßWL+},$Óï$ýXÀE»©z9xSRÞå x° ôäñËôìŸqÁ endstream endobj 1809 0 obj << /Length 1065 /Filter /FlateDecode >> stream xÚ­VYs£F~ׯ ¼‚*3Ë}äxðzåT¥WËyQ\[F˜-`Ø6önå¿§ç@ dãʃ40}wÝ´¡¤Š¡ü²ø°^¼¿ò<%D¡gyÊz§˜†lÇS|ÓDž*ëDÙ¨—¤Ð¬@Ýf%þ='M­Ý¯}å˜=9Ç0‘Ø •K8.ãYÒ0;=f½ãÖ-.m!³zŒŠ*Çõ@rꀰçp·E7}äžÐõ†¡ÞF<жü)aÝ4Pè‚1Û ú߆kPü¥Í(¾‰ \WQŒÙÝYTá³sÁTÜäOâågq¬ÿ¼[ŸÉ~âæ;7Ã\ó¥)™Å$j"®²Úñ§ºˆòüŒ‹õÝ’¼¡ô']œÚ,O.ó¶n0]SÌ]$ÛÏ8n^Ä¥ë_1Ý’˜®.®oWS°:?³sP:%tIrB?fÅm•gÍPDúQ’dè„»×¥¤ìßΊe¢Ð †µ]• ³Ñ/q§l±Z/¾,L4si×ö€6.›{CI€º‘Ê?œ³P@½ï0çÊíâIôñ¾öúÜö@¹k†È¶Ü}ß z¦‡^/ì ot×vŒŽ]Óm7PÓ´1Kßj®©FP:8AbÍTkñ–• O‘8ê¬Ls®Å¬Ó 1|dYþœŒˆÈ‘‰áø>òC_Dþ×1ͪ&#åh;?›¼}h_ëhà@¶}Èd‚eÁvXh¨½È0e%âÙ€·H5cÈ€S&EH6r„ ¦óÂòÕí®ŽRüúit2œ=x[°‡®#b’:âæîúZÒrœâ2™¢"„:¼¿ÉMÛ—šm©ÍéùúB$Õ”•(¢Ô ‘ü<«ñDv"÷i*ß·„§~ÆP™øXeß6d¿ÃŽ‚N^Ò,}àê–‚D¨$ˆ¸IÓbù#<‡žZE5Wñ=CÕ•£jY’/E–º¢¸ LùW ‚’(C9—ù¤}Á ŒÄ€:²'lxþ; 9ޤà™Q§Hvvó€ŸdWS|ªdú>¶^á QNWÍc]=6TÎŒ*¢°À§OºÁ2'ÆÎ!9¬>¥4K^Óiÿ(oñ[†¡ì¥ø€ªdÞû?«·-1›ðÓ·{ªt{ôôoSJÚjÿýýpGªy´ÌÉ©Mìq0RãŽõµþ™3˜ÏÇx¹Ù åÖ å,ñçc™¯³oÃ5‹ MæãÄš8©‰â*‡Uøhç=^Ù$Ø&Á`5‡…ºÂQÓRþY> stream xÚíVËŽÓ0Ý÷+,± •ÈÓ‰“ X0C‹@ñ(lÊ¥©Û;Ä)¥ϵt’éc¦EìXÙ©ïãÜsísë %rЫÁÕd`}ÅVL<‚& ä:Ž…}‚B×µŽÑdަ†O†7“7ö˜Ž%öËÃ.ÄQ6)gC/2ê*µY¯(¯¶Òià4© O„"ð&¾ô6±*wÖ˜`¤Ìyí ÍÀqŒg¦^Ç4©×}'_À‘1U˜™®cÅA‘ϾӴÖ.ÏõRΊô›(’<¢¼œ¾ÇB­ª0ÄŒSuòXŸôÐOñõ;÷ËóƒD™gµ5Û^†`Yñuù`f—³Hç>ÝC¸®y1˘¢\œâ\vKô(Ï3¡º$OÜ'MdOeªƒätIÙü2gôo{À*¾é—@Ù²^É"~÷~_³ìçšîÿ~{˦Ó3Àœ×= ^e›W¼ì¥Ÿ|ü<º¹‘ôîºihU{8M?òÑ:ÈÝ=öÀ‹­( (-ÓÍሲp¡2-zúö9ú4ø°{ÖwW­(QWQ ޽ZœP wü§&Ž|ÇxEáuãfEõ&c5e"«·ú3as›WrùºÈX†¦k¤ÃÀ3¾hLµ¹ÏÁé(3~AÙç£ ðHªO°E"Wð’Š´ÊÊ:Ùìߑ˞,GÐOøÄD»k60nØÀ¾‘ ]844)R‹·ÚdG ìbÒÆI"Mô’¶dÜ©À”é1Tá4é?‹dIâ>PGt¢Ž×måÃR黢äa+nøzÛß3¼ë‹j¹.(bϵ:…ù¬;vŽ5 ´Êƒ¼Ðdþ’Í )´¥ÖìßÒ­"‰‡€ÿ2Œ‰‘äkzÉ%ééLÏlÕ‚Œ {w=„>_´÷†&©Œ²:óž|âë*=rQ¬P½  >›íÇ{[°ªëR<µmQ'éþ‹V‹œo¬”6h³IØ8ö½(Œìߨ¿@¿^ç4ÍæTï ?z§jÑÛŒéu³ÊêÆ®=šå° SÂÄÊØ²±hœf` EÍ;qïÞ–“d~'E™Sñðwu; QðÙþcÛW½©‘¶cýÓG•î¨=c’+ÆÿaüG£\ñzUJ‘ RÓ¢ÿä^LîÞ͆9üý>Ç endstream endobj 1832 0 obj << /Length 866 /Filter /FlateDecode >> stream xÚµUKSÛ0¾çWhr‰=ƒ…lÉzH)t†:-áD9GqÜñƒÚßÕƒÄN€¶­µ«O»ß®v JA_GŸg£Ã“ @óÀ Ðl\B0e ]”£Ù][Gµˆ[q¿´ªŸÎã¶Îí›Ùéá s;g¯JXàY,”Ê1—ÏF¿G.ˆ¹kü ¤Ø‹8JŠÑõ AsPž"Pñ=(Ó1p!dä]޾¯ñ¶W‹ºA¸àZàûØ—[û‚Xã¼Kc¶ïZBþÁQÛ¡~dU¥–U+…Ð*4œÚ\Tµb­K3Ûq­{PJ­Èã[š«û‡ùa3/z?š6Ì€p ™Ñ<|MRgwmV•½ð74ô’êFÈq9Ö¥â Ôð‚æ² °©y!ÖKšÝÛ^¨I€OI‚ãE†…-Ïy­Çqäšk¯š8ƒþø ùOw—ÁO≭ŽQ°w1÷ ]à¦È›¥&FåkU!Úe5·Ÿë“^ 5ŽÓ´)\1>ÐÛãø^ÔÀÔî V"ò¼Áe\ˆÞÅÕÙ™2wº®™3ì-ÜMëtUíÔ³Úf/‡»¸c].¶ÍV `!äxªS¬ó@å·º˜U-¶³ÿ¯ëd)Ä é2þºçÒP]ùaQÈÞd Þ˜ìèż6zÈÚ¥1_m£2"·6cÛá$°ŽÁZÔÚlÒÅè=Yf. 0¼~QMbî埪‹É>œ5B‡‰N½ìeÃ{[:$œ–$d³»/QßÑÿÁ}›RÞëÛ—G³iÓÄOßn‰¤ý˾ë°tgVˆ¦¥®´5ØÃ±{æü?õd/ŠpàúÿÖ“i¿'{\Å(£*¨Z?°kjcQWEÏt‡Wµ9.û—À)”8ƒv‘ŠR¨.£tâñ®M#TßÏÍ^a•ó(·r¨²¬iõ‡¬2ãÔ¹|•¡5‡w‡úàliF \¦Ÿ[ÒŠùz À•fô,t·ÏöYy·2ºîÊmg‚lôîã¦êµ?~Øîj?Ïs¡Z•íðø™Çm<¨h’8Xª_Ì’AûU‘áX?…ŽùøÇÅtÜ·7/²ÈJlºfÇž ÏH°Ýpÿª¹ª(œ«âyï$|‘ xÇpí©J endstream endobj 1842 0 obj << /Length 1088 /Filter /FlateDecode >> stream xÚ¥VKsÛ6¾ëWðHΔàkrR㸓Ì8ã8t{pr€IÈb ’VV}XRE¢Û^‹Ýß¾àYO–gý¶ø5_¼¹¦¾•‘,b+_Y¾ç‘ÆVâû$3+/­›¦Î·üã›ë8> )H¦è12ïz©Úúª’Š5×ò o°&èÁEw¼é l†xÙ=õ5oœ0°•œ\?A]zˆ8µ\?#i€zжoŽ=ñÁ¥IØ÷MÓv5Õ?¼tÜ0 í’)†3Ùˆ¬qÅ$Žs‚ÔÞè5vôR ‡m‡c~{óƒõC¸ Ml´ÆäY¬‘ÆzÛñS`ßâ´Z!¤ç®Õˆþ®J^þ2Hµ86­Âɳ~ŒoKtèÙƒ8ÁßfY0ÁÉeäF>ÚqY•=¸ª™êª—ù,õuE˜”l{Þ`€Á|ÍÑÈý͇Ñ}’ion*X͉ãRJí+¾b½˜©$²x÷i9Y]5¤àBÈÈ>4…èK@GSÏ^q¦z`VIf—\ñBi×곪Á‘)gR¡ Zk˜z³f&ü¶¸2àUiJí?*!pWö’JÔÚ$¥•Ä$ƒ\q!¿³(ÚçÌË”£`î›à×{-VÀH’xv:^áuˆ?Ʋ/8^æ/æÉ%Êo†Ø¤qj¬91”otlrÇk«7…Ù>:nÛjB¡·6•³Ñb’á|HÉ¢WíW/ ϹÕÝñ2uîÎOgýë'‡þ56MP˜éfÍ»a— ¨ê-ô(fÅèQ-²sqÔ°‹”Ù!úå]~Ó–\µùÂ3t˜1,iC]1À³ Xcå˜Tt]ƒX'1Ú¼âŠUât?n8Óòý©mܾ©¾÷ú½ òˆ3S`“1¸©“Yâ)¬uzGì‚B·$:z"ûVèøÁ28h©Ù_FW{óÔ~4Ïæ«vTµn‹ªyµq߉X]õM¡ª¶!†ƒ÷ùâûÂÏòw-–†ñ‹¢^<|ó¬A ³ÔÚÑÚ¢ 2¡!Ì…õeñù§-ûø¤+ú‰A9õ0–ÌèÑq6í‘Ð¥í;'ˆ€xj”š‹È&­·JTåDH%ìŒïƎІuÕ<÷j¸ŠÍfÝà4O04{ OÈ=ñ¯ ãx¡c˜Ê¢«ž Þׄª×ï 3cé¡{ftžŽ$›Õ+:¯Æk ÞY™|Aö¬\J¶{ÉžøÙÓ¼ŸÓ4:¾z‘Wo À€ryÐp¶d|ưC)Æÿÿ»8GH3¾wË †g5|† ‡‹^˜Þ󣫎BátiM²škÏÿ…‚=¤Ã`¸ jvoœÇk ï_TÇÆ¯`ÕSñNN‘ÔØ…ÒО<î’‹w²JnÏÿK*-O¹b~ ,{µn;²rŒÈWöœ Yy­_ÎN¨Oÿ’„Oó endstream endobj 1853 0 obj << /Length 1201 /Filter /FlateDecode >> stream xÚ­VÛnã6}÷Wé‹ D\Ý/@ûn¼‹-‚´M @vQÐ2m«¥.©$î×w†¤lÉ«x³@RœÎÌá™!]kk¹ÖÇÙÏËÙ»qle$‹ýØZn,ÏuIÆVây$2k¹¶íë«Ú"Ÿû©½»û×rþeùË»¡70 ]$iÛ*“0C™kr8PvzmÇO`1Ð6‹Z6œ‰‘åk#ì˜Z)Ç¡Š;µ/!Qè½ÖTÒÏnä^4«2ÿS””ó ø÷po°w<—d‘I¹®}Í6EÅô<K=_BÒ*7’’ʶx™Ú¦¤ÕŽJP%c‹=nº*—E]aX/—zm¯bRÓ–É®UBÑ•8ЕPªŽRê¿Þ³ï‘ ’Vž‹ªé$Á”Ç?2y%Ý_0ŽX÷¥DîêOz¸¸»½º0*œîY;–Šœr¦Ü½ iÎ8'c@Æ¡½W_ 0¸c—=Ò§xöÞf‹å쟙N]Ë;P6Š‘¡•—³Ç/®µ!ÄE‚,µž•ji…Àê$D’rë~öû«äRuüÔdá£È#iìêâXvÆÙÀúÑ Ó6w<{1w‚(±iµÆIj/ôú§™GžMåî™îµÚS!:Ê 4ü—"{ôòJéµMïw # ×w¢'Bø®!Ü5y[4*ž©b=é ª8S(롂 ²ƒAj t{Ñ’0Àÿç¹Pál¯°´:âpÚfб“À5´|tËÞÞ^Îe08yd¯*‚Lõ20Í¢H+Ö«¿X./52kVIâjëöáææŒ²ÿ6ååX.ë‘öòîa1ÖŽµ6¯·›œÈ]ËÄ®æc#8óhÒ…êo‹¦¤/dË*&&¥’ I:qÒ€ž ž×/“ y¢œä¬7›“`Ýh2üæâm±êSU]hEO‚zÕ¨êJÒôE;0ðÜIuÝè$„£±ùpus¿˜4#„¨eg‚e}cüÿ¯ÚmW²jø¶<Í~ƒÿšÖ§W¼7ny Ôî--™.ÓzcÆdÛÊ^-äȤ§÷¬k©$§û#ATbâfɸˆÎGâC$ïáJúÊ!šc‹‘Åܳ%ÎLŸñÞD:.Îÿ;ÿ{8ýÙ(<”_uçj„¶¬õwlÃûNëÇѰ§öQÚæ-˜Ø;¤¬•”`S·z' Ë5ثߊm¡]?¡*Ó+ªñã¤Ñš¢Ëá‚@ª'1ÉRLuÕIÈ'C¦ å‚]bUÜà6±+Þ2ýµƒ[è´s:d³<Äòdë³çà Hš„ÓMõÌ¡Ì}ÈÒ¼,nвÀò€BÁYT[óSëQ¡ §Ï;¤>½ÕÁ!.±gë7CŒgï …G × ‘Rã†3*Ìôg£îœ¯‹Ïn°–ásv¢+áݹ:êM¨³¡w„ÓðYqˆ[”PøUë…m[wÐsì8âSR¹§!>ÑiÇ¥Fî(ð•OUÞB*ˆØD¸_ÝuxÜBó…±µ)Ȯѣ ™Ó?Ý ÓV]ߺ¨yƒ”….æÐ¤JÿÖ8Ŷ¢˜ÄTÇ…§Û“ßl† endstream endobj 1862 0 obj << /Length 2489 /Filter /FlateDecode >> stream xÚ½Ër¹ñî¯`íEÔ8š÷Þ“lÙ›MÙÉ–$×Ö©8E”†.0”¥|}úÌCÉNÊÊ…t7€F¿Œf7³höË«7ׯÎÞgñl®Š¤˜]ogq…iVÌÊ8‹t5»ÞÌþòhþÏ뿽/Šešåag°Ñ\¼“QÕÂù"Ëòà|ÇIp7Ïó@¨Z¬kw}hA n?aäëÇ<”–yXäc5|NâèöEÁO_T]idõþ'7ðúN\åÁ¯o`'Þ ‘C«)Ùjâ ~@dîMGn˜Öi ‡N•-nø$l@kzv«Œ>Èt˜W¸T®r§´‚,+ƒJÖx²åÙÑ¢…ÒPðçw…h¼XÜ£)gY\Šæ–ÑWhn8`Åàès”G¹Ǻ…aüóÄzTpŽ;Cò.î„­°äÍd1ÕþP˽“h;?Zœò7“7µõ6k[Q× ¼gÔ¼ð"IÃ2û_õü¯Zí÷´åKÔv1©í,_MÄT5.¨ ª3©ê'´9R~š^ù4f‡ÏIÕäôŒÃv'M—a‰Ô¾wÖÙI?w› –ý>_ÄBãídB›l2¨Ÿ+ŽPìË?3ÌJïÕ;e‡^;޽FŒ&±lŽ•ô0 –æmváïJhyù]öB¦°V{ÇAZähy´ >¨[…¬Q.;&q„ ƒÂDêÂ3X·Õ†A¨Š[0®`1z'MÐ0x„йG¡ûôr ð2%¿ûX-ž2‘ JfwjÃò‘N6¢OòFiÕ#{`°²˜DqŠ^üÝÌÿ+:mVèCqL>%S>ýdo~Kî`ì /£X,# s/Î}\âKÔÌ?ÞòD4¢~°Ê†_IÍÂûùLѰ–¤èR‘Óˆ½ä¤Sç- Emx/âs\øé-‰’ðÂ鸆r„¯éYUÝ2’Ì@íN´+˜ð.Qkb†"1È4K2·õögÓ‰1- ÄÇøØcm’{[A-Êj£†ÁîZL B(P’q¼4 â)†÷R`FNÊÒÝ.)—#­!¦ÛÐ2ž¼„—(·˜UŽH+á68¸Âg+«–r+"½X&¸¢ †váÅT’L@2mZž¢vUˆ…GG¿ë좷ƸßÌÅ]ªf cžÈûZ«ÖY$vêf1Ác Ɔ—¸G(½†Gë„ÅiÂcØ€˜ä£?À”[Á\$h”XBAT?w˜N¯8èu¸sÄQ[Í#Öé´X Ê¢„£Qe<Ò czO¨(Ýœb(Ewhy†Ò†‡,YhÜ™—o”­`Üd™£ÃEÏû¯bPEY…90ï)Š70a»ä‘ä 0PÎì„£j0i(8a|Þ(àåŽr“á}ј¼«Ûg6üœÕ8%ÇQ–‡­ØS©üM‚KÙ •¹ UoiR'àPž—%ò‚¸¯y9aj´j±¶øq°Ñ¸˜Ôa²¤‡Ìê¸ÅfÒÉEkÔý°ëA±šèØ™ìŸê—£úÚ(¥2M@Úð…’Q‹Y(¥$^@yÚg!R ž¨â°`åd*æúº=ûºn/]øM³G¡&„_®¶žHL]1—öÅ\ꫲ,¸jžýßä-¨{!á5òf­½§j¸äj8ž¬†KãCè¸ýÁ6ãñ£š¸ìkâ’ÄX’Ëaf±'* N°Y1j¨ë}ºÎî4°UDЩÃÇ2fD­þMœ VÄ Sew•u8åŸ|«­oî\‚ò>}üu±ÎîÁAD “Ö¾PË¡X+kuƒk’Pçº\Mu®€œöÄ ÛÖ$éÚVN›?bÆm+®úfÛšæÞpèÍZ&Áá2Ò¼¦pìkxÔÔ" §ØÏéhX70@ÝLéóÿ§¯—èc wœi‚ÜZþÔú|IY(ã`äM_ ƒð·”§ÖÓ’#¹e ׎(‹Vš½¢l‡FÜ©üÉö¢ïiã±ÿÆlX8®–Á[ ݹ9V-9tB, °ìù…Ùˆ_˜÷®Ä‹`÷IP¦#ã%;âá^ŽžÁìN9„Sé,øöUζR@R•j TðgGê0l¿q>TÎ[A¯Ú³ÐüµÕåßÏVþÉStÿýæS«0æXG?]Õ¡Y‡¶½[j&oäøÓýcÈÎa.Þ–_*³_¼»’&?VÍ’‹y.–˜¶‹aŽHû‘vÑ9O¹©ÎÙ«òGn—÷ÅTŽòÅ‹óxø MTÒŽ¶— t$” “QŠë‡´Äzb¡‚‡ºJ®À?Ðãb·ÐÑ[M‰} ¾7,‹à—N~š^éýFiˆ£óe8º$Š3êî®9Á^îÍ È7|s9Ù²5{ò÷ñàÒ©!HJѵ^û`ƒÌö¦ú¸Ðg:é¶aèïhÈÔÙÙ¿½:0%Cí?,öÍã¤x+g}ìæ˜È*–/Nh%w/É2zª*YrgÌ+ú ðÕýó wwæYŠ»ÛŠ½ÿ×'ΨyòTÞ"iBÂe!å½¼r'¯œœºádæþÏ ¯ S¼&Pl@rÏWµîò€•ÑÖºYÃp&ºd–Ešäãvóš^ÆÁÿ%…Ïu0ÚËÖ¥©Í©k;k)<{£çÕìgŽêh}þ"7LüK3-š”×üF zMJ(žCAÓìë³³µb^*Ýl€X›P››³GñÖžI<öäg¼ÉmýŒù ;Ð3~-VyXÄÉø/°Cx'ê°:¶z»}>îÆø7Ø[ D×VÒË|åžo}p5Ö÷ÿ·Xéú+æÈÄ9o_+ÿ·›ïãa½6ö«¿âu2kaµnqæ¿ï®_ý¤VÏà endstream endobj 1867 0 obj << /Length 1235 /Filter /FlateDecode >> stream xÚWIsÛ6¾ëWðHÍX0@‚Û¡‡¶v<Óf’©-÷âä‘Ä„‹J‚ñ8¿¾xX(’f$Ù£a{oÿðˆƒ»ÅëÅõ‡0t”„^謷Áù4t"BPè'Î:sžÜ›œ‹Þ5L,¿®ÿºþ@É€ƒb‚¢Ø—÷)Ú€Í v”Lñ€iåǾâZyA¨yyÕäéeL° kù袉Ô(DIì9+â¡$ FMË·ò}ßµ»v¹"®ÙÜ6u©gJÖÒ‹Ýý=š iÚK !‘–Tu%:0±f/§”|Zyž¹Ÿºm–+ùÏ-¿ÞÂH]¸NŸáÁßK«O¬YÞ }¢7òJlXs(jqR},÷QHM$.º¦B;^qTä­¸ØÅžæ¿WüZ ůѶøîÍ­áúör§šè#„N;3gþÞ캒WàÑZ¶-ÏÆQ¯ÅÞzºäb_+ßg­ÞaU6vq{бIó/Ø§éØš¿Î:´…Ä2‹Cä3þ]&¡ËŠŽÿª†F/‰eŒü+Õ¤Tºµâzò¸®ŠXõ™¹{žÉ¢wëFÓ “L‘[ë`Ö©'}¢i޹nƒå˜düPð%‘ר¢!n/¢Ï7£Ýsn¯“®6“úF«¤#2i‚AYq×J€°áºûl¢Yʉ‰ë±Xo§Åz»^ü· RvHYŒBL'-O_±“ÉC© ò“ØyV¤¥C¥^°*œ‡Å?¯Âƒ‡À8JYB°,#â8A‘ïÏã Èa2Î\Ÿb÷Ì+r0)ˆÜ¬~†:  èÕ÷,â2¡ êÍ7ëTüÚbšD¥ßd±¶ŒÎ@> c„±…|Þ¦M~y]½'ÿæJJš¥óf©Œ,oø‚5ë«RJÑnaŒtByÆ'àu(“8Üo61S |+êa÷OVi6°š¼kù¶+ô<7Û®JÁ"#NìíÝÈ‹ü'×T%ov|.™ÜÀ^óNe{o^VÖF¨1ÖÃÃ6„pÿÈÒ =ƒ.-ÛÍ#Ë™w¡cê@(sØ› I˜Š«‘7Œ&{á´<ÀØýMŸ?~¼šóÜ–3‰küBj çìåBÚ,/U.$ß5ì°¿¶ÌÛtD¹¾¼uE*Ã-Æ·J˜kxÊ„‚h :¯¾Êˆ·óµ)+8z/·yiÕLÄÜŸÏCû û<çòñLê ;ýðÓ~C#(všc§÷¯d<©’šæÉͪ{1À2£Æ´“´€&ý/Ñ[ióždp!êÆ´M¦A©XißCÛS1Ãv~ªul‡Mu¿«]~¸DípR‰§ÝŠVÈ ò¾+ÝѺ™ž©Û´|¢¬½ýÊt®|˺B´ãÖŒ…iÆ-”“·oˆŠó1x‡)p÷±Ÿ¶ˆ6^²Éäoðþ­N»ßëuöâx 3¬˜¬Î^œèwSîÝäå½CEòJeØU*«`D¾5Å>©Ÿ0TÀ8ó½÷ä^i© /kðÐ¥yuA9ˆ-Þä2–åJÁLßì SëiÁæMß Ã/Žºœõ…¢Vu/tÕw¡¼\«ÈËã;óFÀüèBiNxÕ{ƒav‹Ó“^ö©•‚ªBzU^yÉŽ²'ü4âþ endstream endobj 1775 0 obj << /Type /ObjStm /N 100 /First 968 /Length 1614 /Filter /FlateDecode >> stream xÚÍXQo7 ~÷¯Ðcû`$Š5ÒÝ l@‘vÀ¶ ‰sm¦¾Ìq–îßµIséd'$¶N÷‰¤ÈeŸS6Δ">§b|$ãC6^0ÎÙ™@¬o‚xCú:g2„ ¢‰^Á)™˜x‚™lX2Ä“¤®.&“3ž¼É9aBœ‘tà$'Á¯â„La'Ñxç¢.ÇÇ’Õ(ÏjªÊ E…KR£«0â vP–ƒÚ[üÚ2¯Û¯°‚©B –ª¢à£¬UàE)X {öë·bB¨*°¥@ð Þ’ ìT( ¹Î1Fëµp\ŠªÈam¦j”úâfà­À)a®H!.ðrµ‘œ×Àäé(ò®.`Œ¸î%!NW¸ŒQ¬+Š!JEU`.ê^œ (lCàÒXhŒIT«¤ª ˜+Um€²RÕ]U[WÕ"øÑ;A0ŠW0’jæ*c±ŽÄyÃëZ"Ycc#Gu ‹\#‚U1‘èH‰$ê(®2‡!­ò@€ˆ•;—EIu3±xÝbô†¾uˆû Q‰ì“êÑpðºÛˆ·óD]ÉäTÌaª^Ä“rC¢ޤ‹#% ÒÌTë¨ÅÁpZR”̘ƒ2x »P¢¹^sÑ\¬T›à¢äªM dr\Åy“| mÂ(Ô ‰œš—F¬*ÀëcšìíMº7Ÿõ¦{uô¾ŸtφŪ_¬Î•ú‚?˜týùp±œõçët¨s¿ô'ó£§Ãgsè0‘@<äÆÛ „,±Z3(Wà“'UÃssè×ãÀt¿ýþܼ–C´ŒZ\œž¾½ ×TtÊlÁ“Ý }´,º×ݯ/õÿчÕêìü‡®;_Í>õËw§Ã¥ Ÿº?/úsŸwTb,݇árº¦'ýl~ÒOßÁ7ÓÙp:,§óÅôòÃ|ÕO1>>… `ÎúÅÉ|ñ~:,¦Ç˜y¿.'küãoŠ™ßàp¿þš'Î꯻@GtTÅåÝ ³ÖŽÔŠl©Ù'ÄÞ†ZÑÎ7"k¶²´¢ñÍ>ÝóพÀ»hfh¤™!·ý¡B›œÎäÇûÏ8Ö#>:xëFÃ=†æìm ÔˆÆ%}7¢‰ ‰(»A+ñrë.îoŽä×eÇbÆ{3nBÌè7évÆÐŒCÊEnDGÒï]€)ã:\J+:d+c¿û¢C«¿ê¶¡}!Zâ#òši‹âÙÔmÍJ˜t‹•ìÛX)\n±’ì¼þoVŽ¡õw]Ÿh7è6@Gðr´ÖoW]òÖdH#%*¹íÉKÔæ·ÏŒwÏÍæ‘Íòf›½~ Hñë%à8ßÃô endstream endobj 1876 0 obj << /Length 1014 /Filter /FlateDecode >> stream xÚVKsÛ6¾ëWpr"g* øœLNm·Íx2i-çâäQ„I¨Çýõ]¤MÒ”DûÂÇb±ø¾Å¾³sóûâãjñþ:ÄNægq;«­ƒòI; Æ~L2gµqîÝ(ð¾¯>½¿Žãž&‰ˆ!vŒÎ%/ÿ`´.éAë.P{B÷†cÒÞæ%!‘Ù½ k£ä*ì»_FI¸_$SLþð‚ÔeX ÝzÏ,ÂÁ!÷°FžŒ¾°¥U!êžùܰ-mŠÚþpuÄ^è®þ¾»€„ÇG~ŠRË"MU«Ó<Âã<ÌùÚ†–·pJZKž3eÿ¶BŽÔ©RT«?*» 8Öe9ÿ†HÈ6c0}V#ôZÓ7ßu¤¶p6é4Ãlba§o‚­rZ0ÿ<øà xcg£îÄòð}ÿ48î*!­]Pû‰…SÈ)0Hbkð«—Å.-6'-õfœú$m½*Öÿ°¼>š=¼Þ[Wˆªð°û8vf³^е·Œbר9vhÿxK ×€ÝÝ-YMyÕ:íjµøw*rðSmŠÂÄG8tòrqÿ9XüäÀR–:FµtB(_I¨‹SáÜ.þzÁ àÀù1peødqƒŠ˜ /‡„ȽԄx©)UúSqQÑÈE‰+½H“…ǦÉkXÐâÔÝÑóÓ´qâ§YðÚ–^8QßÃ4ó´ô˜Ê%?„,|&ô´ +Šîäjc?v¬bL2û¡„¬Y»¾6Ùª¹šüÃ~E– Ä.×逈?A‰ñ«¦rHE¥aä^…xò,ÚZ»+¨Vôƒ«†ü?Ú^?ˆ°Þ¶ÖD#m¥ÑòV¸g5“B“âõQä¼TW¢ó b L×݇êRÍHü9åãNÑÝtéxe)yN¡o(B†@f:ÿ€„-8¿LñÛððG¹¿ÚžT«¶pJ#ÙP— ¡rË®žâç»››I»Pn»Œí©¿;äôݸêà—|¨¾ üè„6ý9Ëš´Êu0÷´õ\2©}B;u¤~}qs{5é”*Å<[ªêy$h29OWÏdC'?7÷i_ëþû8ó!×Ð^^@1ºË~H¶î€pÅ¡€ø]Køò[/œ»°5Ö …w{Îe×…Ü5%T¸£‰qnv%ãF}fæ¼e¤m'î·æW ˆ:ψï¬Ò­¯‰jaß}»óO{Nç“G=}nJ]×v¾h‡MSCa¬ØAÙk»‚QŽ¡éÞÐÿt}<‚ endstream endobj 1889 0 obj << /Length 1825 /Filter /FlateDecode >> stream xÚ•XÝsÛ6 Ï_¡ÛKä[­JÖ§oׇtI»î¶^פÛCÖëѳÕWõQ'ûë ,;vb_îb A€~èZw–k½={}söòMYsgÍ"ëfiy®ëøAdÅžçDþܺɬ[ûRòª›|¾ùýå›À±®çĉÂ4cè#Ï™ËâÍ/,JF‹¦~âëUÓY DŸÖ¦2ÏÛ­å;{ÝNÃÙ,¶/&Sß÷í\µª%þ,@“ºŠ~kÐÚ™Lƒ °ß1W9™%v_ÈF¥/ˆéko$!»‘0™zöJq5 ôή’cÛ\kê…£™õi§ªòiÃ|4쟕JQ¹)š©‰g²laµÈ‰Æâ`$jб´oå jeª­B=§U Zý©JUЙÑN¸6˜z ÂIÙ"ï%iô¯º ¯g³ÎÃ4Ÿìb2i2¯Pèšx°7xâ|ài®j8rØCf Ï;Æ´ÙØ4qŒiâ~dZ±iðI¦¡]q²mL 2L›õÿIâ ¯Þ5ê Ïçv&—¢Ïµß·¾O`ž9! Ô’Ãnls9ód†{Î<ŒÈðv„ÞêU|øçm*réd¢çìþ]AÕ­d³VO»ÑtØxtâ ‘‹2•Ù'®QDï*Ø%Üüw¼ùž|Ü7ŠÿÙUšqœûö,É—{­ºÕØ«*óù³Ù%#Æ)}·iÕÈ“¸nª¯2ížµøSkðbű°ìG¢&Ó0´YÓV„û& <ûn<¡j™Vù3ø‰wðþðÙ†"´ä}Q¶ÛðR³s©ÊR´Ýª &^dwM/Á?68¶#þV³©BÜɽ.®…T$ Ý£¤/ éiA˜h­Ð`ͽBÄQߪòŽ—Þ!ûŒUYô‘K²};êBÎZ<ªBý'ù ‘c²)ôäAÃA…þpP ߈&RàèNVÅÊ\2GŸÄ¹Þ 4S§&ÓÄÝZD …@ÿx8h2 ·Žµoà®g/ò¾i/Ýe% µU!‰òCɵ>_$‹ºÎU*Я[šnû!åÁ¦žøÐH\J™` Ý«!y q¥O^ûàHÍÁ$?Òð‡Wª4¸¹&rð“ Î!ûZvÄÜ­ˆ] –½™xžg_üq}Åâ–D@iUODóH•ˆ½Ùˆ|KKÝ–š Ûªm{† L/àkˆˆŽcS–˜»ÙÔ(â›É5XUå é!tº/ù²‘e&Ì>ÎÉ8ßîÁ€=A} ¹…Ñ–Ñ~«Já¬C×ΞdpsÙT\dœ7: ¯·2Õùø£jg´J´­xh½ Sä`ÞFxìhç`ÈG(JßÊ.fö9ƒz6‰¶ðx-ÓªX¨R>£&æž_+Buäžúvà4¨,ºêÎ_Ѽ "‚߀\ðç$VƒûÐðã#oõªZtéj]5ß¶4…)O>N°!‚+f—Žö¯C2„ = r{‘ßí7:ööH¶_ìú¦<YâPÏ@ˆÏ´FíÉPî8ÎÓ·á-]Ýw ëR‹F‚½¦72UÜѾ“À)hÅ~“¢+DÍ,ÁX3/ž ´ Y«¿'s®_´ecq±—8Ë]ß{ŒÎ¹kÎV¡è ¹ ÆÏ£Ñlî™:Û-ßµßÁU/i‚,òëº@^ÑÏY_óZqÅ„ãÅ)>Š NõQ\cÜ7ÇðAˆ´GìË0Š ÝŠ=¸ËWD¿ùˆäOW±† ›{9Ÿ`#ÃûÓ~Jüzv\õ 0t_KÜꋼ­öúÂQ»ë!CAöŒöÝq¥±+OzñÕ½(ê\¶ßóÖ€°(TŽÀ3í!@1æÙŸêE‘~i hç~2¦¾_öÝ<{p¬áŠj¡ý`ºÚ{ñg#chR¯nξŸyÚxoxL™ÍÇ ­´8»ýìZÌÁ^Ž?O¬µæ,¬ü*ð%·®Ïþ:h~°Ù¾Ð8Wž¹±ãyÑ£›ÑÁDó-‡“Àµ/Ñ¡ ß*u®0½‚ê$Ä^$Ü4#&³t‡mõæ¡ãzñ)Æ’QÁžW(/9ñ¥lÓFÕº¢#áìm#ê•é²WÜ“W}Wc™Dk1eF| Ð'³óÓ›'%©”)ÕwóL`¦ýÌ.‰ …J§+R$rÚÑPJÁÕð°áŠ•“8~ĺ¬Å_A?XH¬94 [_ÍÔ3‹hj/õtÝ{+™õÆ_}:Zà ý£ÀhÁ`:‹Í0‹ª4b†¤0µõ¶kÛÖB‰¢¹ý$nbÒ ö3³È¼ñáÕÛ0€¶ºúŒ>Ìæ8†ÍUCC•I:8ÕñóŽ^™sÇ¡ÿ!=Õ¡›[™Wk( ¾æ¸í¢}öYu×T}í,†‚=àœo`ºÇg¯KC„ýNrqI endstream endobj 1904 0 obj << /Length 931 /Filter /FlateDecode >> stream xÚ•VMsÛ6½ûWp” 8"$ø}èÁ©íÎtÜŒ'–›ƒÓD‚ˆä¤õ×wñÁ†´)‰xo±Ø·Ü•k•–kývõq{õá.𬧉¬may®‹ý ²bÏÑŸZÛÜzFa`ÿµýýÃ]M~à(JÁŽÂÜT‡Þôxåó`;˜0œ‘â}M|´d3Ú©Ì%SWËñRLoæÁW7t¥9…ôâá4 5¤ÙýͲþ½Úvç[yu¶º.úE™4ä½×¼E^Æ8Ÿ?=ÝßÏ¡‘6‘ÆhÛcQýÃÖ;–Y_5õ:xÙ5C‹wÇuhÑòª_ÞÓ–]F›x4]굆‡¢àó€Ü]ß?Þ.£ËgÐeé8Ý1¾Ò¤Â¾%8¹›ùõ6;N³o›Å`hήù±Ò¡Žµ«§¼ÝÓ}×|cÿ#õTòã}Uî9|ûõ¯Á ÎæÝÍ-¹!ÑfÙ=ðësùB5Å/”óÛlÊŽCwùŒ¼[y÷æ°«ê¹éíç§jQÑ_ÌõhŠÅy[½­G¡GLE‚ÙÉšô3Yq6ôMQÌ éêè,”Gip´G|œšÂúðëõXXǪ aŒß0 eûøév5Çô?®.Q^7ÙH‚ƒ±Q]wåp`µíÔ‹³=åB/ѼnfÓFùì1‰Ñ#: ©èû>Àá-1§gI±"œNÚÎÙcBy ô6V ¨ñÐ@’¢¾Ñc ƒ0¡6àÑë p…$ˆéjH6,}—?ÃY]ö{½^+æÙ‚õP“ ¶|½H4ÜG2 ­¶›UűªK½øÃQrÆp©„¼ª> stream xÚYYoÛH~ϯÐÛP€ÍáM Áì:MÜù,€b3âjëšü¿'Ï|€{©sƒ—ÍþnÅ##§Fœ*Hfƒ¶¢^ÏY µyùxŠ3OxÁ5:k—6¯ÊÓ\…ÈÕ뜤°†Ó¿|£KKU‘[¤¿1}Ø’>m…íÜi ‰- œÏ+)+ËS³~,ó?½0ÒÙ¯ÀÆts´jøtT¤àµéIõHXíFÕW hS)=Sê+t òÑKu±4›ª­ÝÅÛ;À¥ÜWµQEqBªOmÙlcgS5BÙ€zeÊ*þZVE»)  ”ØÒÑÜýÓ‹=˜S5Ðñe‰žúNQÈšªÌÛ0ùjúUmêB pU“?ºy¦ÉŽ-îÿQ SÆ0Œ?õÃ? Ä·Â!ÎYtªä~ú 00cYà†gã/škjP»óð¿sÀöWjiÉT Ÿ—ÜVàš™¿õÒ2a€¿è>éŒz'ì µqO®8 „n6ï‚¡m„Æ;N¯}Ø"YÑ.ón—=á$|ߥ.Š#(^ ÝZÕú<èÐVƒ8p¾þøòå »¡£¤±éWf ê1N[æ`¯ ˆäßá•/Ó+Õ¤Kè üÔù7¢Vµ¼v©Jî08äôÀ)¬ÞäàR”†æêŽ emƒóÊEk±«ª8ra×ÊâÞ¾ PüQ·E¡3î¿ävͽ[äT[öAŸ@CØâp©ü‚¾(»äncðܼI>œZ¨4ÑΙ#hÂFv+3bßÛ–¿”á– ’dÖm)6¥ ßË•…˜ ªAé–jQHðÈW’lÇÊÈ÷F«%´üÂÛÞÞ|¹ûí@Òðà¸kaÕdº9­‚1†»>:°"$’ ÷Ì(©ÏÄé‰Êr/aãà æÜ¯sÃC¢~©MóÄ­U[ìl·lXà™ÎŽªrbXËstû~²o18H1'1$Œ1)dK؆èZôÝ6¹ÎàÉèÿu…¢M8‡´ ;ðÑiöO…ⱂõ@JÔEmR—$ ”\Q´‰DÖè-‘6Ñw§MQÝ´œ~D¾úàÐüÓl-'ìCÎîîÂ"@5Óè0³íëHžïKDŽùnQ·EØKqÑ~îis¡à`ß÷]ƒæõáb¶çbçšPC¡Ç5ç09£¬¶‘ŠcÌ”¹—¢×;ç‡%»¬0L±W‰zÉôRc®fTúÕ^ŒÎ¢z=«ºéD…vSq[·–;Šæ†LóU Ó-3YElCgKÂd†¯²š×£®6ÿHφ["~ÏÄö ¹ú,ü®ë-D‡/Q;UÔkuÆi74z¦Ú½h­ôµï~Dcü ñ0¶©žô9–q¨à¦ÕÓ!ŒQ¼jm‘—šÓ¾±Þ‚¯†RJŸà½ kèÎÒ!Å7î:\ðgOñÝû×bFÀËoðUÄë"<ô(³€–sVÕ@ýCyQ~0gÛn ´'Âó”’nKéh¿ sL¢:ÚŽSòŸ?R/¢‚–QÆÉ=}(ÑèJĹÏf?—œž£ |eÚä =D^Na²É¡F}ã¾ÔY0Y1á™d&eóªÊÆÇø<7 œ0…‚ð³Œ. $»:ÄrŸ¥G0Up• ð%à`Á¡–2ÎHr{T #C„|̺eúŽì«lÄUu*öZ;\, |1K§C÷@f^Ö¹Å|Ñ《m¦š'v£Ç r~$ßGPpÌ|>òèKN)%LP…©¸ÉÙŽ[¡ØÁ¡ HBù!„4¯:ÉN „[3ÃEÆ>šÇ=<I´¥GAÂQé½$|A¤mY“Xö0§“t•ùˆ®!àpZ£¥ÆUݺJ¶æõ•uùHµc"o*æhƘK:½íD˜©³2µÐ ýô}œO9"Ÿ—ß‘`-ËO½þ6F]mMœ"(s¿¨M º"@I;ƒJýè (ÔÏËѾîŽs:PQ>^úî0ÔÀâÿq°æÀ±“XÉsÉ‘t=‚{Óc]÷T&u'g®]è“’¬Õ—ר¥rŸ)æ¾ÿÒókUt!ùX¨þzsê&ý“jkúp¾„ˆŠÏú.—j¿Z;‘c”`lg” _wbgµøÕ½ â÷ðˆŸ›ºP£§ÉŽ}´qÞ0/ûkpñu~ò[ÀòsJÓ_ûÃì˜^ùIã`Ü¿ T<®˜ˆýú«je—ë—ªyÚöœfûŠ>>Ö”é­3–Ó˜L±äõÓ£fÆ'ž‹®ø¶mSõi’:rF3–+2Uu´#sqM*o\§ÅæAbàô¨¡Ôý!‘Ôáð|Þm”¥ß5bgÈoÊo¡‡à›ëa±hn£c ·`gÊæ`cèPÞ˜ ,\˜C/×?îe㑳AÁ7½CRbà¾ç]yž7Š7[vío÷þ²mKT endstream endobj 1923 0 obj << /Length 1112 /Filter /FlateDecode >> stream xÚµWÝoÛ6÷_!ô%³õÝb]>6ÃÖ%Þ^Ü¢`$ÚÑJ™žH5ÉþúÝ‘´g§ræd‚„ÔïëÇ»ã% –Aü0ù~6y}™ÆAE«œåÁlÄQD“4Š8¦yR³&˜“,?ÍÞ¿¾Ìó“IÊhš§ Çž9o»+Ñ õ´–\k†'7§ ü’ˆ×qp•4s§…Rútúä ܼ¸7=wöÖ¼çðÁEm3#±™aÓÏìܲ ë?@>y~ºëV\b†ƒk¾ˆ~«œp9ˆCµ±W† Ì"Zþúßy!ø¡eУŒÛ^}ƒÇÜÇcêÛ;ÕÙ³š (çlüH&%Ëe“u8‰„½S *¸ˆ,#ˆz“Ú‹Q8ÒòCu7íJ8ÁïÜñÙÕoc&É[ÇW]ý]«Å©ûæN]hõƇ…ã-—X½^ýÊ­_ú)ü=ü?+ó"ä/ÃlAu0æ 7J6£ ¯QôV}…‚ÃðÕ!á…ÛF¬L»x8(¿V56:.[ƒµû€.z,…¼•‚kï¤â “?¢‡?)hsê%Ž2râê¼> ©nèÒkW×ÁWÛx¤uŸSB×S N¿“Z^æQ²½âÒ_±àfèŦÿE™/°Ç#•~ƒÚq¶.ó97üqO{­‹{ÞA:è@¼Í%(ƒ÷ØCW´,ýëÑ€qlå¯Ö7]ýYw\ÊW›Ælï8‚;®¶“B‰ÇÕkYa;ÀåÿUþÔôÊ€Þ> stream xÚµVKsÜ6 ¾ï¯Ðø$ÍT²ÞÌäàÆq:©›¦õ¦=89Ðw¥Z+)$e×ÿ¾A)»êÚqÛô"Aâñ„om-ßz³ú~½:½HS«ðŠ4L­õÆ |ß‹âÔÊ‚ÀK£ÂZWÖµ}ÞÈRpÅß;an³–+ÅOë·§q°§û—嬕’ ÷¬|sÕëõêó*€¥oó-izQžZånuýÉ·*¾µ@TäÖ½Þº³b0$‹ñÔÖºZý2Ÿ·ükWâ|ß•À÷R°0Mb/ Ã…+_ܘ€P{ú×n”Ǿ}î¸ZNØÜ lÐr£$·Kdôm? ¢¤éX‰œÌÞh~w —úÎãáˆC/ £r;>’ÁÔOÀýÉm4ƒjúîÀå/®¤2È-7„c˜Ô×5—èuÙ " 0$ší¦+Û±âQ5fßãXx ÛÙ(÷ ^UÄ 2zoWIÒ#õFd‡°wø5§ ³oCûÊ~74ídÃÀJ'Ìì['Im¶åò;cxgäªntÀq¢Y$ 9Y2¸6,»å¬¢•êéN 4”ÉÉd9 è/F³PÍŽÓjÓ Z¬<²Cóï´&, ²¥[ÞqÁÚöHY÷ckDÆY"H?}£ÃÌûš›{)„½”ÍMË=Sû°p1§Qà€ÈÝ‚s GÀ‘?ŽEI}ô¿/ßÇ\ë*ÓÄKú½ûpyiIJ7›öP|qvyõΞãÙ؎;fU>éËW|èà ®Ý,@½{‚±8×½@ÈÙ+"(׊WÞòº}Û–¹ç‡ÆÇáh§Z£?ëúFd†P;Xˆ¸8aíP3c‡:AüÅñ‚Îìmˤá>ÌL®ö¡ÄÔ¢ßq’%ö‰T|@yfó ˜XWYêyxX\T}…‡1Á*~ñò7 bûÖ]”{±‚}ý®¯+’ÌÚªæÄÙŒ]©»™fß7mKüQòÅξ3œ&á¼#…Oí&2*°üó8ºšVe¶{2yîìü^ 'œ=…Wµîuý(3¶èë'ÃJ€˜0M²YZ-yËK P6Ïjç\±¦•ÿáeáiæ·/L&üá‹G´®‘DœB ¨bT|ÃÆV‘µOä2ňuß(£ºcúMx ªlçÖ,§Þœ`Ÿ× ]¯Œ-7l·CÛ«ð"öƒ·¬ÇŸæ»uÃ%·&#SÍÿÈï¦äü®{³ÕiU¤¢=Cá½hTÓmiœÞǘ²|~ÈŽZ£vëè÷ÓqcJCàÄû9‰,:Y‹Ç‘ÄØ²/ˆ\É»’¿€F\$ö›÷—n„ØàÝËô"fùëßÐí¦ U©A¾8=-ë<áb_·Ñÿèôz±=náî—D^>]'£W‚WCchA‡ûÐÿÍ) íÈÿ øÏèÖ;Œ(¯T”ÚØ< sÁ>:ñEã\òÿÀAÿ|šû8S;6<=ú¦8ú^8Y Ža«ÑÌ¿z°åD¼¡»'Œ·µÙ8}Üß4÷’üM¸Az¾ÿm&ÜsÐîMé™É³6¡Ú{ê¡ÏBͶSCæúáÕ†cŒ8©c|(6ÞQc 6{T€ endstream endobj 1948 0 obj << /Length 1065 /Filter /FlateDecode >> stream xÚ½WKÛ6¾ï¯r± ¬IÔEi“mPl{h¼¹$9Ðm3-Cõn~}g8”-ÉŠ¬ ‚žH‘3œù¾yrŒáÞü¾¸y}ç»Fb'¡‹µá:ŽÍüЈ\×Yb,Rã³Ä󯋿^ß…aK’‰$pŒy—¼ÚñJÞ8ú|8Üo©XZÇò"Xc¤ùPòèhýh„Óâ¶«±a¹±=¾8ƒç)Q2.È„$”/¿‰Uu«¶½¥õ× ]¢œ[ã˜ohøçáþ~Pz%²l¢è¦È냽|îH¿’©ØW¯ÆxÑÑXüûð~D|•gyqÍ#ÍB*˃½“ûŽ´åÙÁàù$ÍŸ¦¡-³¼ê"-W<vÊ+> ——%žvxÆ—"›ÆJ)¿‹ŽdЇ§ÉØ~«Ë®ÇÎàåø~“u-ûü¼¬Äħ?Ú™Ü÷ÒóR^ƒR¢öQ¦ÕöEIÊ {+äfÛj;Þpä»%XºðIÉZíúÓ P›.õ’ncÀZ†¦à'ɽ-6õNìçÌ3«r´9Œ7ª÷~Oj7¼Ï–y‘ùQÔÔŒ1P$¡9¤Ù6…\„và‡½þ1jŒ¡±·sËó<óqîÅ&É úÎ×8²V'ÂÕ*§ñ…u Sß7S±æuVˆÑ¸c OúÄ É—™¸Ó'bkÔ”(¤oÀ¸ÔÄæäü a§ç <‚‡§¼àÍ]S!dÌWqKwOœ"<Þ¶ûMuÛ,ê² ßŠmÃ:ÄZóTÒ–¢Fe„¦Úcœ.×óoð&æº-ϰ££jöƒSbTÍçó‰4;)ÊŠö±z¢ÐNb¯WnX»Ì°6MÖIï’,¸PÆÙ¢à iJñâ:\x·ÐTÝJ8)·9Jå~C²¦Ú« Ýt|×Mì/¤BV¾8ÈúfuÝÅ@ÿ¡¯ÀsZùf]ŠŽ°³ƒ¨¦»uº>¯çÞßr/wÈS½#K¨›q•AM•`úeµ ±B¹"оOÛ´&LãŒÈo¢äšÄ5`™<`ÂAõ¥E=Üõ ñ§´(êA‹¢4ø$hˆ+Š»¸`“0‹*•äx¡µû  þX’´Z!J«¨ƒ0O·KïÂëvïyS?ý^ ËçfL%çSjF˜šÑ95I#QoÔë±ÿ¨ž²*<úþ¬ÄS5îÜOûDÏáëT~È ù='ª¸æUå‡ù+^IØëÜùÏl¸Öñ†È±ñ5÷ÅËÜ~œèö§yÌLQTr5âôÿB4ý'L¨úŸøe^5ãûÅÍ»öÏ endstream endobj 1956 0 obj << /Length 1468 /Filter /FlateDecode >> stream xÚ•WKoÛ8¾ûW9É@¬J¢$KXì!Û&û@±è6î^Ò¢ %ÆVK›Z‘Š›þúáP²•ØyÀ‘Ùá7ÎŒCoå…Þï“ß“7WYæA‘Å™·¸õ¢0 X’yó( 2Vx‹Ê»ñß)óA*3ý²øëÍU°'aÌsÊ,cZ Ï$têû/åB3–3+5‹ç@d$ÛrmD;’pÙÍ,™ÇsÿÏÛé,I™oÚNœÃ2g~ƒè,qW›5­VBm¾’RÇ%¤tÖõ Ëdj)‚é,GBİáÓ8÷ï–7Ï‚"½¸¦HSB-Õt êûtÆÂÈ_Ê®mïqûjK4­6‚(wµØÕÛ‘yÓȺä¦V[MǺ+ñ²5íøDiù¡(J›ª¤À("¬Jíq-,Öp s0‰e~­ñ;÷ë-ʹ!$7¢?ÌÓÄ¿†˜ÍšØ3{Š]M£(ò/Þ__:u·D¿Gmª#"oQŶT]‘µ´rs f­µµŽ1ÿs˜†[eÜÎ À*±¡ÖDìcCÓøô;RœŒTÛÚlO}›–âUu¥xÓŠm%Z¸( ¦Ý(]‡¸§A»l­Z¾ d½úéŒmÆnKÙUÖn]÷V‘ü¾©EÃ[¾7Ý-V­êýÒÐaŒ]n¢ú`WWð$ž[%ç³Â‡ýÜï6H]Z§õäÌÂçÕ·NG³(“Чë,MÝžÁÂFOö;4z]C¢'M!I²Ø«ÚVÌN¾<íÒv[éqŒÝu‰o zlsÀ˜V )õm‹¡Ç¦ À¶¤Jðáiö‘xaΰ€¥!&±%oƒµ¨WkóTPù,vñ¼.¹|˜V“ íMJ%•3n~yž»;KµYBLž)˘?oy¹g,Íñ¥bd1Æ¡t¨8ŠÎ95¤ƒì/€_{-ÞCË`ÞX©†›r½Sí÷2,ª#mêÆ^¸Z5a«À­‚ˆ§©ÿM”2.lg!Ùñ} Ký+[ðŽhöÏÉŒV˜®ÝžÌVÞ¿xz0}&”êi{DÚÝ•¨HHq J\€þPne'NuÞC´Q¨ò€å9 _¼ÊíX?_ëvk!8½Á4¼‰º·•Œ¯O8šMŸ„VðWb_|üt<¿8_ hwµÆ÷œ¤‚‹Áþ±<ŠAv:èÂCÿ_þà›F>h§¾Öº”eÉŽyÀŠÈ5n8ö½³f¹)¿ê —ò ÛÓÐ*CH¨a&ûCp³á ¨%ù1 Cô~ö*z “ËÅä¿Idc ƒø7HÀ…åfró%ô*8„»Sîí,ëÆ²Ìò¤w=ùç¤uvš…/Ä(g¹I44M8&+FaŸçÐ ÞÙ¦hè¹Áý«uÇeýÓÎN§-cy°¨xedArdf) ²¾ù¿ºlëf¸þ•¯ÎuÚ®6õÝ0¯DØt°(ö#MäÒ3ìÅFI­3:ú`s ™ÐµVMè‹M+´®íø ‡Ô¸8ÌBš¼l•ÖÄ\ÕŸCÆLBC÷Q¹mmД’kMyþplÄ GLMãÔÌÈ_`Š‹JüO»¢ª‡ÓUT<ÁA‘F3ÄyÀÃüÆ5ïÒÁâ+'Ük+±SC'§þ€Ncל4Xìç4.Ãü%bT"ßm¨Q±nŒlÔ\/ì,LAlÖåÈ÷PmØ&¤+Cƒóa-ÑŽ!n:tàQÚõ ~?/e?"׎º†`˜bŸ«WŸ4ºïÅÅêt»gŒ¬× ûWnä9*KçÇœêRV={ùý¨šýýéýû1kÖÏ'è¹ÎÒP‰óÕª÷gçD>C·ÙbzôFPlÐïšfqžfæ?F̧x!¿)Orjšðx³£¼øB~™‡ÜÔùœ?‡©ZÖæÅÜîÑGðØéøŒÄ^~~4'¡°ÿ¢3- endstream endobj 1966 0 obj << /Length 1474 /Filter /FlateDecode >> stream xÚµXKoÛF¾ûW¹˜B%†/Q¤œ&R´F«íÁéa-®Ä-(R —±Ý_ßyì2¤l½R:ìsfg¾yŠÞh=òF/Þ-.ÞÞDþ(uÓ8ˆG‹ÕÈ÷<7ŒâÑÜ÷Ý8LG‹ltïÄÞø¯ÅÏooâ¸w3œÇn’À‡î¼¯ôoE¥ñâ…gØï¤G1 £ÄMýt4 æ°2a³…tžÇÓ™ç9?òð¦™j›7伦 N:›õ)6ªÜ^º,žv.ÓÝiJr ¾x3ŸÕ¢¾ð~ øî<øÞu½n7²‡£›Ú»ã È(ðÜ(4TËå àúF¹ŸFó`îÜɶz< È@‘Øy²ÿ‚‘¸~˜ðS+)t[Ëæðc!>ö©Ü¶ðVÍœ¯ã qࡪæuµâÑr›À2{\ŠÌxZ¨±ï4ã©ï«h—t—Ãjxkº®«v [s£ÝÀõRp½Ý¶¢”…a ,ëL6ªfib´¬WËm¡–BKsSçææª-—ZU¥(”Fyž™Æ ÜÝ« £Û0ÒÆë?~´^³×÷;‘Ñ&®DÓˆçö˜ õ- j̾â)ÇpòÌK]ñØ6r³L®D[€cÂ*êÎI ¢]v¾ÀüPëÓiYGi†ŽôSU°aƒ€äÀq ˜]ÁËIj€…½’”Äa£À!ÃRks¶ª«‰Îdð~¦·ÞÕòQÖWW4º@îªrUª„Îd¯;Áãa”ÂãªæA#¨ NM*á2“_¼0*U¹æµ¡[cƒì˜j4É,¤øÀ£ð‡ŽÑ.‰³Aã‚ýÔ¶¼C §¯e8óJÖE'W+¶jƒ.ê>wÆSen5RŸç±ßlN‰÷p²BŸýU•jƒ/·xÒ÷8g8÷ò5ö¿Z¬%_O[H& Ä _Ò9,sŠ7Þ+ „Êfª\m&í¢SÂ'k“kéеzIñX<í(A®…½ôñþîfœPPÕC™M¯5À}×Èôpr—`zSƒN鞘'ÎÊJs Æ~»K©E&´à #=f¶Hx˜`¯Á3#;è=áÞc+(ààèRY«^îpDkmÑ\Ì8í!p(ÎÑŒ¯:J#m`ÀÏMF5"ÂÓÏ/°¼'F7R/ó÷¨ìa áêÊšsSÕ¦µË)UP‚>»–m£¡…:%6Ѐæ` "¨¾ˆ`äAr®3»ÕCDa¬DT¤œSzW/±ý´- æa±$¢Á2IÌKÞêå@\‡é^ Ùÿ,½6¹w„†}Äõ/wÎFì„ÄGý{ ê@Í3öhëeB°ûw¿m£ÁȾøŒ*ÿþ/w–·*ž5ºàÇCô¿%ì.…t\.‘øÒP׃Cœ.ù;ÀåÙÚí'¸þØv¦¨¸À¿˜FŒÊŠ9í°EÞP€'Ý¿-–òözçÞ6Hw?Sœ!u»e€÷‹½.r¸+2¦ ˆ½Nêc?þ§1Ô§V¾úác÷›’ýàa¿œ˜J³6©ùåçŒcÏßIT#ÁŽ«©ö‰pè›ËÑŠ/~X\ü L#Üd endstream endobj 1873 0 obj << /Type /ObjStm /N 100 /First 973 /Length 1884 /Filter /FlateDecode >> stream xÚÕYmo7þ®_Áí‡ã’3¾¾i _ ôp†Ú òAQ¶‰/Šd¬Ö×Þ¿¿g(É‘#¹^)RÛy–;$‡3ϼq}ŽÁ8ãKÆs4>ÇŒ¯D1Dl(1’3ì‹Þp%È_yÅI:"F¢Œ°^61ÖYÉ$§k¦l’¬—LvNŠÉA·ÌÎäBJxSXy3™’ƒòàDZrgŒ{Î#PX–ê[ý ¤»dˆ#±®c‰z$•5¨xÅ­^ä‚ÇÂʧÈä4@ްÎE.lQpfïu‹‚—>êü"Ї«‹DPRI J•Ì(sƒ¾-8%IÒæ&•ÂÜýfdU{qJpŒâ1£„:;hT6Œõ-fÉ:V §3cAõP .¬¢s½NV(Ø’ ë*>™àR}›M µcÁOX®‡åC(sÐaˆQe†FBÒó‚uS=EP¥ÎÀz90ö ¬—3æBÚPXE!,\’nÓ‰#€<¨ª ÀLð«T0¤cŒ5Žh$ªÂ”+ÉáXI’Ô©TÑS0ư¿NÅuÿ[Ëò´x!%×…ƒ‰Na ÔD—ê1ÑW°R WÕy¤åÛb"W9Å™ªÑ°w Š®¼FQ8Á\¬¬™˜£6Œê78Eê«qEñ/„= éäªò¤˜äCÅ7ˆ*;Nœ¨*ÊO†RdSËqÒÍài),ß2ü©Ô¹X%qš—ÿ½mMó|6›÷£æúîM_Ÿ¸™}5ßλ·m÷ÊÁáÝëæ»æûæÅ+_FÍU;éÍ+rb= EÎ[‚ƈ“u OOÊßssvfškÓümþrnšsóÕÕÏ3{ÝÞuãþkóÍ7#üS9ÎÍ+„…ˆÕ¯LóãOÿ2¥X†ö+pªÙÝtúúQf8oåŽø«Î8Œ[Ò†pnÀÞ–8˜›Ø:àt7ìnaü‡ÜóY_u}) ªÓ.€qõþÕC6ÅûõC0+– BFœÓ',Ø\vóÉu ›æòüÂ4/Û_{s¿×4—ãwí¨y}ÛY¿PpVY‹ù]7iË€\ÇþÞ¾½;ÿÕT8E„¦Tø¸w˜ F©B>8;Äp8l2‚C´‡rKH–<Ÿ†Û9 æöÖæ ðÈPI|b‹€õxàå!’N ž\¶Áìže[`ãšõUžšôW„¬‰¥O}&Ñ¡1}²… Q,Ã8Â;»ƒD‹âåÑx;î'ï™w6ÃàŠR–xç¤áÈlŠåÌÊü=EñÐ Ò%ûÜ#O†` ©’D)†G%¹ù\Q ØDPŬÅ@ÝfYô„ïÚùG{u7µÝxÑ·ÝV¢ÊyÈ´É|ﳈL¼3QíâfqV‹±ÜHÊ 5Ý0n‚Ü|f$/›éÿ;Á¡]ú³¥×âÂV„ÔVàЩíÆà èXÛ*—mBÉÌ(iD«W_¬p|ÔÕÞtí/m‡4µ7³ŸçŸ»š¶Gƒ]íó}P ÏäF{fCö¤ÇM{o á`s/çfî2ÌÜÅó¶¹—òøµ”G²{`D²¤ŒƒÝÑGyäà »?bÏo“®íÛËñ´íû#Æüu>ö!Û€¶o½K¼_¬0ñn÷ ƒxä†_Hz°"âšHk"¯‰²"è¨ÑÃS¶C$Ø 7)Xm]% Êþ …µ QVI<Êe­îPÀ<*ÉE;îïºör:ï(Kâ'a´½¦U©ù[Â|7ÿOÛý0ŸŒûyw> stream xÚÅVKoÜ6¾ï¯|©X ©·€äàÆv ÇÙô²1ZâÊl´”¢‡íô×wÈ¡VZg×öE{_óú†3E¬Ò"Öo‹_—‹7—qle^û±µ\[”/c+¡Ô‹ƒÌZÖʾ¨n×OíÚÏÃUU÷ÎÍòÛËÎ4CB½$ À®Ö‰©’Y㠄Ù°;J»~›ñóÈ6MÅ»ÍC#XL­”ãPž‚-âEÄÄ\°ž}!9in7ù×nêêÖ:*Ðw)ñ²ÈÈæÅ×’KðëF„Øo]s­þþÜ““SÜ‚Up1[dMž×½Ê“2QßþÉóuÞá0Ådl­9ë‡vŒÀHaò1YY­ðB’`–‘•ý‹¹¦tg·lë¡éŽP¸¹qÜ tbÔØé[RÐqã:aÇB>Ý'«Ý0îa\eøÔ€ñT2¯«Ÿ±N¹Ÿé¶¼©X¾«¾¼þ|ñ_‰‘éšJôÞíQf_ÒÔÉ¿T#²ÅÅrñ}A ±è–D¢0ó’,³òÍbuC¬!^¥ÖƒÝX!ðL*Ö¨¬O‹»]38Ÿ1d2ŠêÑ-OÕ[zšEœÍôVnœ†Äþè¸ÔDþ­‚\Qb_Á\ÍRûÚ‰¨Í+~ÏdgçbÃe'j©”ºgÓÌ#Ä?0 ÷Pp˜$@‘¦Rx—·¢éUûÈñ k2¤@†1ª«œt Jh÷w']ÏdÁÚW¿L™7bº&[œ³¦i5õ?Š ëGu!Ë¡bFäÞ‰b›U7êbc;H ‚¸¸zvé¤Íº^×Þ¬×S\c‹Ph‘Èp\+d.€n7ôC;¯7 >E’K’‚ú‘½VÁ* κ8…Iì^|!A˜+tµ%Ê+·Jˆ™5×O\¢ž¸Ä~0$Ž:eJ¨lYsç9nBS{y':ãqçuĽzÝs¹O^·ÐÁ#†¢C’xPª¼ªÌJôwj6^–f¥R· ±éPî·„1¹QbC®¾ÆØòÎ[<íkÃXƒ=1‰[˜VúÖõ-CDØø;Ï·*° „ò4÷¹c%ý³}¸R·-<‘¢a6‰`gÔçsÔòbÈuoÌOšœmßç—œµå=î¾*©ç€¼Àù“ºC@aEö‰-3÷XCAíÓœûRµ”y~fbÆŒ<ë)òÁÓïƒ.¬Ò±tßÁڰ›©¥±8ŤX~W(*÷Š •.ÃÄë ƒ&|Eø>†?ÝÚ³ázºa]¾ [ŠïMÐÁDp;¡¾T8òÚ?aÝ3ô\–SLO.ú%÷ÿ×ñž.<ðk²ýx ¼ K• endstream endobj 1985 0 obj << /Length 650 /Filter /FlateDecode >> stream xÚÝTMoÛ0 ½ûWè(³ª/Ëòa‡ni†-Ù.Y†íf;³4?´¤$ÎG“t[±b'IEò‘O¢ ¢èƒ÷nä]ÝJ†b+®Ðè1J‰ EŒ%b4ÊÐ+îßî®n•êy Í⟛Õ|8èÜ<ê‚ߌ¼Ÿƒ-ElWEqˆÒ™7¾§(ƒË;W±FÆu†$¤Ž¤€}†ÞçM¼ýÕ¯ûÅ3JÀQ "F|SØÇ<)wJ(qïÝ8ˆ´¤ø}R¤‹"is?¡Æí·™å~È0„€S„«k-ªÎ:™˜ËÌÞ-“b‘7&ÕqôR‰ç ·(å‘)ÎH¨•E9È›´žÎÛiµ‹t‹xwÌL¡µ}Þ‡. 6hagÐ ‰ Ÿá Àfö¸ôC…-Xã6-­½¬ÊÀºÚs3ORó; i·‹ÚENÊæÑççµu:{QMó 0Ë»øAW;‰\CÿÚ$0„c 4AŸh‚cJWèê„”bBÈ¥e\דÅ,/}ÁqÛœ,çL«=ªî ¨Êy„¯m¯–>ìóÞV®v`ÝUân6Œ|"=…ì’ıƒˆOçW]þOð9j7G‡¬m³uYµö°hòìÒ~ócK«ßáðC.W‚ý¼Ð-•vIE7«d6/òær~i¦ä¦ÀNîø!¿,½ÞÚ%íLÌQŽ»UtM[7ˆ’ õ²b*#1O©ü”êSRÚ´I™%uO2³|9MŒl‡?QW!c¢™ü;ê*¸ ŒG/¡®ÐÁ]mí„Õ·0Ïi«Vq^X#¼þ ¯BX‡CûÿELÿ¹¯“YsÿÛ¼ms#~®²í'‚¯ý Ü' endstream endobj 2000 0 obj << /Length 922 /Filter /FlateDecode >> stream xÚÅWM“›8½ûWè¶¢*0} 9d7žÔæ°µ™qr™¤R*Ì8Tap^ûçoK-3Øã8“Ížj©»_÷ëG‘’IÉ«Ùï‹ÙÕµR¤H •)²¸',M.ÉK/ÈbIîè|¿yiNM}X¼¾ºlrC¤,É5þ¬âîÌ, æ‹ÙçƒÇ”°Ñ¹ÊU¢DNÊõìîCJ–`|MÀTh²óG×D@ü\8¯ ¹½ý®ÐS,çŒ(Y$*0ûñ&/&×îbÍEJÿ0M¹mÌPE1—šŸÂÃ?¦¯M[F’Q¿“Óî-Mç6W«Ê-Ëp:bÔD1£Í¶²>êù:ˆ<‘™ü–: ^q¦cŠÁ^:ö²²e_o†ºk@?€?ê!Ó$f:áZãõi88RR,@Øñàam:¾œžÄÞº-AëMmׯp_ìÆܼOeÚWöoñ¼ií.Ê4­z´îÃÝØ_ƒ ,ppZƒØȤ'•ðÖhÈ9äg*¡/T‰ãòÜ?5ö‹~µ]WmÄ3:Ø‹9|%öþ„¯G-»‹ó,Ëé‹Cíá¹*¡òC×c--¶D\üZþï¢Ba¿ƒ97¾›Cãô@.ƒ:&УÎ>%³ùÞ¬7MeŸÞX ΔÍa¶²Gb™¦ô9.¥ÛbÏð% +w½?ôÿü,s]$ ÒÿO5ç,‘, ¸6v¸év·¥iªËÊ&²Ý:=˨;ïeÊ´Ë+OxFik?z ok3ôõm½³u»]m« :Ñêçhç,Éÿ1- ¤ùå¾ë׎–LÒ¾s[;|±nhLS·+|kÂ-aŠá$ÔÌI ®éüóÖ²†[AðÂ!¼>txukGƒc”õ]b^ñü†s²v¡ϫ؛cÞXoÐIµ/«Í0š €=†‚R!Î0lœ–Æ©´ *!q²mòKEtÊT‡¸« Œ› àâæíNÉìÓ>:äàÄGú²kB›Æu˜ò?Ûûäú¾?å•OyùE²Oþ þÖC_ endstream endobj 2019 0 obj << /Length 1753 /Filter /FlateDecode >> stream xÚ­ÙnÛFðÝ_AøiD4ï#@ÜÔNSij+ȃ+r%1‘H…‡÷ë;ÇR$%†Â€÷˜cçž¡,cmXÆÛ‹_W·žmÄf8±X¶e™®¡m›‹Ôx7û²øãê6z˜s× }OÜÎ"OȪ¾ÿðæú]>sBQ«u)묘Ù"G K?w³¸ø~aÃÖ2ìãKA˜±çÉîâñ‹e¤üÃPBÝŠel‡‹¿ŽüNWV'ê«c[f >ÜÙZÛ£´­¤C1AÑx ¨y–ø ÊÕln‹¢ÜÍæ®Š Èg¾-Ö%þg6ˆD»ÖŘ_ Àå;x–7 ©ílË–ÑÔnI—ø/M³|]™$׸ټЌû%fcóx#ÞËô#Í󛪒2ÛŸ™¥3Ï0b" dºQÄä‹MV>Ž+xu„äcüœH<á?•g*O¥Üïgs¼.™bÕ䉶'ÀeY4yÊ{¶)¢Ûm¬`¨V*Ͳe %¨7²nyi ŒNò'8QÇ)h7“žϚ” à y±VðpɧÃFѽ+Php[¹¢˜@X6H€ÜÔ„?32ʵÑnïßžFêãܳBq›åi/,¯ódS”ÕItÌÿ(^½äÇóÄ}“cþLAóVju³[*ŽÞéL®)ƒxœc09~‹+¹V£Q8•ÑDTŽäügË·ÈíHå]_,¿ª¤6·YU¿ µR%G°oYâ^Þ¼»E—äGs¥dÝ”ª9–e}3™ì{ˆ0nší†\í×î8×*‘Û¡Ô‹û7£¨9„µÜfÿp(ï Št@™  /ïŠõ{©._1äòáÍâ ö8cu0K•6”¢f.wC.³6–Ò¿ÓòrœÅ>*ì«»‚„Ê:Ÿ³E+S–ë!9zµ9—Y[øI•Ë¢:·áÎGB9M†¸Ëx×åºÙAEq¡ÎT“¡þ!Þ‹ÙÉÌÃt ¶¡8 ½qŠbõ¢bzâA5`Õé·ðb æòJWñ[K.œ5Ëõ,©ˆ{Ød ^l±.øú³åzÔ`>$ ,Œ„´ÂAHÊ !¯êRÉy‡‹Èz&£>tV¤G¡WÌ„^§›Ï­ {ûX1Ö:8ø\÷\>· pˆoõ“•È1ã8,&êQŸÜw˜üÌY².Fá 2v_Ÿ2 {Ì"3"]5¯ÏŽmM×Cl™×ø%ÈÐöJ¨ötñ4ƒì“ÛƒÀsýN$Ü%X[^2–̓ÚBªö¦¾ÛŸ0“b©u(ËÅqR<-‘­s÷eÁŸ7>XÔÓÖÃZWü¿ì¾r€³×n,Dtªð§.ÑeƒcˆVÊáPÐ|ˆgîX!&Ü6opaþˆ_ê·Ø´1<£ tÞN¼%ËÁzT¬î¤FËò}S)ȚΠÉ3 SŽhlä µ¡šLšÈ7¨Ç¹zºy‡`Ýßy ` ï$}Ü=ó)WT•£O¹¡¹Ü¼¾qŸê{³©´'ù둆'omÀP+r‡=rB5k¨}L»5úÔÍWÌ @¥òŠ?”==^àJââfU; Úè«7øF¹›eVÏ'¸gVÒJ–ZŒ³ÑCÍj/Ïç«OfNÿëfÚ ™AлŽMR¹Ž¥¸ §Áª¿•¦w°ûÉ ×”ô¡xÊ Û±ry–ø3ß>3ÚsŸßí̶mq}÷pÃÙŠïŸÑEóÃ1l#»N€ÂÂøÇ¨Á¡èXoЦÂívfSˆZ‰m%ešzÃ4pðxäDzÔ¦ÝWL׊CT4žKn\šOÁ+¿§â6]÷ÇSo¬â *_'úH?N¼ ÍØ·Lï—Ä_‰>£ endstream endobj 2031 0 obj << /Length 1099 /Filter /FlateDecode >> stream xÚ¥VKoÛF¾ëWÊÁ$`n¸|‰,ЃëFEÃpc%7‡¹¤ØP\•»Œãùï}P"eF–Qð¾æùÍÌG{ViyÖo³_V³·Ë8¶R”Æ~l­ { ÂØZ`Œâ µV¹õ`/$°)]Kïj&œÏ«÷o—!¨…F‹$£J!ޤÌÌ3nú”’’$ÒrýEQ¬uÖnI]ýCDÅ´¥bÃò‘µ#׋¥‰o¹ØGi„µ[²¥ŽÍ ½Ž¬ê+eÚqýÄÎõEÇiþ“ã†adß°òVj8Ø%e+´œZ½½¿^Ç4Êl$úˆZšw™J¬‘!þï´ªÆñ¶ ¥ Û2b!76¹6¯¶´áà”ÔZkÅy9ÄÈÇ}qv?õƒ-  •l&z·ÝÖ˜× lÚŽS¸»æ:LÁôEƶ»N˜DIcŠÃkMþô"øÕ×kiøIïsZ®ðŒO%æAJÐo¡I©¨š¼jÂVõi² k9"mÉÏ®¯M]™^ƒ2™¨ëŠ Ó<&]’ç•ÔütP™†àú €ÐŽá%V+ýëí‡gÉ<(ãKÈá÷CW:‡Éœ®ëWÚ®§§KúPÚ»¶ÒÁê´¶²Ï¸l8NJ³—÷ûºíZV¶”sCá°Ãp££ØtŸœ4¶IÝѱÇ0©ŒƒI¥ü?5BbÆ”v€ˆé7h¿(²ÿ¢™ ý±›Ã%¶†¯¯Ü Cón5û{†Uaðž4#/E‰[ÙvöðÙ³rx|u ÒÄzT¢[+^]„’(kë~ödz$½!3*±Éb+L}X#ÃÌcV`§ã±LBð…:U¼#†Ó¢…}Qh²ˆ|[Zr"8ð ù–ØŠ(a%z#ºZZþé‘Qr»>˜IŒÂÄS³÷ Œ4áÄW*ŒÀX”h,~¥Jz«Eއ¾]ÒÆB¿¹2/Å_HÇ´ÀNNø¼ìéTw7ÏXÿMبQÝ~Š’¥O3Ç94}S.õê™ö¥¹þ¨¸aª&/ü‡p\£A»K”R:06ck9å—Sh¨ùä#ÒŽ<ÏþY/™ô‚/õÁ—éNê™(Þ~¼¹™eG’U¡Wéi]Ó&W ª«•øV¥ÿØŠ”ž×U¹@®OsáüMQxðs8{ž¼™÷…+—áú®¥i € Ç~€R|Úï8{èd"äïxIðQ ă©w2=*‰É‰‹–}¡¯0 ó)Ç` º¼º¹7)»­”u‚ÅØöÕ´4ùö 釜 »ÏsWW­ŸÎKò ¥;Ä3RA™›©˜O*ñ Ùѳ]pEzCã9dÚ²ê÷`þŒàkò·Ÿ*q endstream endobj 2038 0 obj << /Length 1616 /Filter /FlateDecode >> stream xÚXKoÛF¾ûW>Q¨É\¾ %­ i$J{HŠbE.)&WX’±Ý_ß™¥DÊÔÃ=ØûšùæI¹³bæÎ~»y³ºyux³…³ˆüh¶Êgžë:,ˆf±ç9[ÌVÙì‹Eó¿W¿¿º¢%‹\'dðÑ4÷ó„Y‚·*Ùâ…×<o$ƒ›6c¾FÉÌöcØdÄ`]‰:sÚÍFVÙÜ]×ú™xé97[„!Ý©øZT#Êûå»O¿ž¦ušò_1ºœ!Ne%Õˆúv]ñôûíä%v—…‰ˆ¶Ö#Ò÷Ÿß½›äšJ©2'/Ev¥¢ë'ç˜ûêãçiÚFªÖIE5&ÏÄN‰”·"ûê†.üy“—˺ЧmùC\©v*·ë²×ɦxü¯C‰hlWŽèS”?ôü;Z •Ñ ì…v½—þü5ú«®Ê\Ç7dKUt[QÏ™oµÍÈÑÇ#ÇG>,=‡\é³P†ã;ˆýØú$:ÅÛ9ƒK LdMݾ…ÅN˜ôTN¡ÙœŒácêHN[t}ý`Nãž…^µÇÀÚA°;s;‚a 0D)¯ÍDn…á¢äöõ±ñ@Š$t¢ÐoRÃWßsÏ ŽÖ]ÖÆvÉX'xtÙ4üÉœi *äbîY öÜö ˆILtáF3N›…¨ÍqÍ{}l‚áöOÁÒ»í=è”rh•À‰£Å‹!’01«n[Ó’DÀBJ³-jÒr'ã-§ƒ 7´¶%š lœÎáßFÖ™*y…”‘µƒƒÄ*φIË ÃÞÖñ¢…‡Ëíñù_ÄÀîYý/ ¢€0(D½!p× ¡µ¦üO~)·EÖ¥“®€:¸B .ó–o&E®².hqÔãF :‰žJlž5¡•ôsx‹WZ­!?û掔ÞÒèUbõ1fÓpûáí?Óþ7*½ ˆ.χWVn/ä…ó€'ꦔ5<ø ‚FÌ`ƒY[t«®iéÀ(L n.!øOÚPð‹vCûµ¾©ýWa–0Iሹ€r¡|„¤Æ"-ó'²l>’—Æ‘³HüqÑáuF=ÙÙA…s í¹ @Bû^BÉ?“=éþ u2 ÜÁê™ÈyW™$_RŽ•yý’uÝ#‘eu]Wèd>Ù†6tÿÓ˜C³—Kµ5;ý½Bñ¬4)€v$ÎÉn ]ÙV´Yfæ7Œ›Vi+â|hj\?”èýcÏ ¼/Û,Pèt,ò,Ó³Ñôyìâ¾ÆÆJ’Âz±Åæ7{pÒˆTj\ݔŠáþ²jÌ&OS±£Žà¸?Ñ$¶Þ(ñ@¨Ðº¦MÊ1½ Zõ»C@ô~>¸Ø ´ õ{ÙŠ×8ù6ä91@G®[ÐqÑÄd“Ø¢òÀX-Æh5!³6h7L](„‘0öîÁ ²ìtÔîMœ¡h,´þÚˆšˆu{O´e3]¨ ›Á©älÝ—–׈4´äZƧ‡Ðuv¨ à̳Ùt ŠB?ë@‚Óa„97atñõå"µÂ vÏx1ÑŽŽcol˜æ4YX™ì»‡6šTÃ\êú½ºkM)"9'øZS/qŽ;Ú}îc¦û"+é$«»7cX{ªðÐ`º<‡–Ý?;(çþ²æ¥˜%‡ t÷Jâ\ƒ†“na´ÐºÙ¤Ýƒ´`¼0â‘Ùöž@kަÐ2c(ê`(Ú*¶ž·Ó—€a?½™û’2›{ðK,Ú M–ÑÉ “Å<6×Dø{ÀšÑ@ £d"hà3þ±³Ü•. yG™ö¦,jè\´Ü/íRv-}¼ŸÿZ¼Dµ³oºéR§Éu$ý001•ã‹Äõ–W» ¿¢)Xjº£žïÄëûÏACìï…=TWù]\œ?…œ¾=§&®KvmßðZŽ”N,ù0±HlãöæBK• u¬o$½R ýéa†l…ÚêW K؃ê€H ]Àa4½ÌúÆ ¦¥áBïÓ4§ñàÞº²-¬·ý“kÊF'»ˆ©¼3¡P7ƒâGŒfâß;@a‚·}{›ÈRïB \fÝ©ëîÔï¿®nþöß K endstream endobj 2046 0 obj << /Length 2300 /Filter /FlateDecode >> stream xÚ­YYã¸~Ÿ_a`ZÚ‰’,{A°Çt v3Þ,‚™ `[´ÍŒ,iE©ýõ©ƒ”%[v·ƒ LUÅbÙÁd; &yóÃêÍÛ»ù|²ô—s1Ÿ¬6“0ü(žOÒ0ôçÑr²Ê&Ÿ½»é"ò”lÚZ}ÈËfú¯ÕßßÞÅa-B?]D ”æ)~ó&°Û¸_`Zô˜fÑ""®™ˆýsîuá¯Û¦ÜlFvùìÝZj_ÌçYEÞ^>õû[ö%¤s¹“Y(üeò–ÿ Ó­›²žÎâyê•þUô~*^»g‚,2»"Ÿ†+¸ñ— Šxö0MOæ­2<ß8ÉJ®‘kgÉlÑÛé, Bo? =9©÷Œúƒî3ðÀ2IXGSMgÀ©ÖzóŒ£Øû½• kt®˜¢ þmv–ûîy„GÂߛ߿ù憇;UÛïn,1ò´9Á»¤½]¾I ¶ ´XF /¼¹Ó‚ø4Ö€È[}üõÝ¥P°û™²n|‚h/?þ}TY[d²ƒ5KëìÑhÄK~©ú ™ÍÁ«5=+lÛ½êKæᒗ܈ôLA£]C¸eVȇ\I£øãÖ¨mÆì|V76{ÝAfWt++VÐU ªôƒzEf½—mq€L„›ÙÑl+‰z²•þbR£P~¹Ð¢¨»á?Nþ1p\Q¡ðQÑ»œ^¨ôý%ôÉ/ˆßxI³ú—¼.™hÀ…ùuç®J6ëÝcYÆògKש÷`Ãí¶»tá”ÞWz_…IBª£‰%pó-£V`×âìµEÚ¶¦»ç ÛõQ)WG{™ëŸëì¿\,‹ÞS ½¡G§WÁHXt.¢Ã=Bð¿2dCÏð‰g¯ƒ¼¢ÍxÆ‹èÂí\àÿ?zÿ;ˆ= v€+]€ž™ *ÌΔ4eºûP÷|ËUžŸwÁñµrOü®U…Apb¹û_íîg•~þû½Üz¶C§°o+p9æÇ2\ p ŒKØ(Ã×{Gç<ÞV•û(}Àµ/ñé8 ì= „÷“:o8ç½(ê`ÄÙ“PØÿ†Àˆe‹w«7ÿ%QXž endstream endobj 2054 0 obj << /Length 1082 /Filter /FlateDecode >> stream xÚVQoÛ6~÷¯ò2 ˆUQ”d EÒ4Þ0EV;{ÉŠ‚–i[›lj¢\7ûõ»#iGJäV)ü`‰üîx÷Ýñ;…ÞÚ ½_Gïç£7Ó˜zY¥QêÍW Àũ7¡4HYæÍ—ÞI¹ÿyþû›iš¶,žMÀÁL}Έ;–³\4¬Ñfº“à˜¸e<>Z#øO™õñ§Ÿ¥D”{Ù1m¹èDʽ1åãÜ_9#øÜ«ÑÆ>~2¦¼eú0fŒ‘J4ùæ ê:§'¹´évŽC›˜¬×>%•?¦¤„ÕøfU-üq’¿en)VÎC÷Ô˜R’«í¢ØIkøÎÂçŸîoúŽ$oí¾j6²>Z^Úwa­1„BcXÙ½õº*• ÃÄ•š¸´óß)R%§–Áªyó“VéUí£("ª}På²—Ü[ª`£¾ÚyÁ3Äîœ1Cãb)wM±zÍÊdÀš#– °z7!Ô ežZaبV«"‡¾|ì€,F~«¯!fì : ¼VÚ9ÖHËggk[„¶ª%6‘®¶|(kh®98Š2pTcé¤}É•ª5Ì_xgda•ÛìÁX)jûˆâ;MaRu€¼úxÀ®KÎŒ{ Ü»êZ–ÂÃ,À|DäeRîNç¹\> @Ù…=YÚÞe¡«RØðñ€¥›Û #ì 7¬²Ûus VsˆÌßk±–ÃÕî|uo$ö†I+3ßdÔ¬¸]öeí¡½ãÌmF—g»¢#˜ïoo{¡z³_­ð‚·ÀÓ«ÛÙM?Z"ç-(í…­kµ¯‚ÅãÀ*øšø1Ú%Ý<0µª tñŸ¯ÞˆJ¾"^±ˆÜ*øÆÈíé ¶…Æ/Ø^´Ñ§ò•ø¢Ÿìþ?$¿ëÙ¡w(ƒ²«…6zÙ‡}qa`>üæ:A endstream endobj 2066 0 obj << /Length 1737 /Filter /FlateDecode >> stream xÚXKÛ6¾ï¯0r± ¬½e£èa»¢E]·=lŠ@–h›©$ ¢”Íæ×w†CÊ’ß.tÄ× g¾ùfHg´9£_o~YܼŠ¢ÑÜžG^4Z¬F®ãØ~b×µ#>Zd£ëi2ó-–4mÍžÓ¤iX=ùgñûû§ÀíÍ ׎g>¬«æDssãhI0xÖ<õcßžy£©C›OSêDÂÒvVñÉ4tëgz¥ŸÐ ]ï–~á Ü[\–ž‚¢ó0¤¾r¥\öÓ݇çǃƒs±Þ©NçJ©Áh”©wô7âÎ`¡FzÜ]½n VN|ÏjäÀ»ï“àBîÌög3ZH,¿²´Ù5bßâ/Ó öb뙵uÒL¦¾ïÃ$ØKdšÙ—…–m7Ö¢Vä[÷´0…=ñZ‚,/rÍ,üq¬FлÊEcO¦çX‹ Œ«xšä×ÊßÌbß«šIÉEI˶¡Ž4Ñ- N•BwÃkfé¹kjžJrmÙs„SßcŸîÉ&2 ä–~X“¢zAhM©Ášo͆—kji6dÍ€´À¦N0þÔ ˜ño8eÔôÊ› MP Pön’&9ÚûÎð.pÆ3KE©Uè쪶 HòÆ@О²<—§‡¾Wãz¢|‹—iÞfŒäŠÒ˜’m¨Ÿ‹µÒ‘›vµÊÙ™P@½þÞ0‰b¢ˆ4ƒw”™(~Ãbèšö³ãÇLÛèQgf®XÑ»RŽ\âyêZŸ0ð­Å†KC(-Jà§•lÕæô½õQ”¦µÀµ_3ƒ%´Ž$3ò•nÚÕB…úÊ㠌ˤ&ÄÀ@+Ô!{ÙÖœe ÿš“±UÒæz—®ëZH††ó®Â¯d°“Ó"ìšh8¢=î½ç=ÄÑ7«¼Ça,m,Øâ̸°gŸã]ëZ´•½|» ?&¨„õ.MCïÐ*D­[€º’ ¹Aý¥"o‹RÒ‚ßJ4}¢£`Œ¨•;h J… þ-ÑnŸ‚ûžUÎn¹øÚæ#Ûàú?i£%R£a Ýhi²ñ0æµ’8l©XTÉ,È›®È4Ç5¯FS•óæ2Ü ¯0H1m¤²¼ãbˆ¨·˜¨b¤j+ mëhP€uT°W˜º¸ªP†+´Ò-a4Ö¾´; €•w¦‰]ãÎ48sL ð˜·ÔîM,÷L ô{ÄÔÛ×0¾8KøhÛ{ÄŸ&`8zD}Þñ·5@G×°ÕØ’ÿ¸„ýŸqØ ö;jAˆ‰â-ƒîf)åÃkòRR±Ë°ùÛº„èÏö ¬’¨ÿ‘$› ÈpSšÔ[Q”ªâX}æB„™(_µeÚpc¨ØrÍ@ÃTôΆö† ññÏœ^,=µF£L`%Y¶ŸN0°,„€Òê‚"¸ÄóTˆõœº®“JgHŽ’ƒ:Ñ>0\&· è3ιì·ãšTKÜçyœÞ‹ý¾ì\ÔOù@Z©Dë!ÓÕ?ðسQèó=Í^4‡C 4³yõ¿µ0 ½°‡³‘pgŠôgk¨‰Uá½Å­ÉߢͳEµ01¡;NE«SöXOã’ã.uéü$é|ÁlÕ{ ±`šR®<¾@œô9 $ŠZó?¤âÄòà–LÈ6¼Ù¯^O€¾R¾Àø[‚™qPõhu]1(%5ÓŸZ @%AŠ—‘Îìè½PÞü†Ìjeç-;JŽYZ}eI£\â¶ju°j=DPØuŒ Tçë†Ó!–yå„[ÇJÚF€,<¶æoG3s—ü¶ZÁ®v*RµëSžÒõéĵ†ÙIyʤ . ™Á1ψƒƒªÆšë8·Žã\]]õn\NzÐC~âßÚ(ôà,\ó¡ÉhØ¡„<œQ‡‚º-ŒUdÚ•aüš‰â‹>b}Œ ¼‹‡,dzØtß‘>'ïž\üþMÚGßÙW›E_#õï|{ªí²:K$GRп߸l“œÿH¶ùÕpÜþÙoÿ wô æ_qPÛ Z¼ù:¹¹ÓÔ§ŽÀôÝ‚> stream xÚ½YMo7½ëWðØ^(’3ÃÀà8u  ;‡¶F޽MŒ8Ú@–Ûôß÷ %9²%Ç”µî!Î,÷q8œy3®|‰Ù8ãK,†#þOΔ Ïlì'3³·gƇBë´ÃšâËÄ£€Ì‹,רMûó“nfNÍøèÕ¡¿ë¾ÍÌ­öwÿ~íðâìc7`¥n2»Ö’Â:4>î®û›éyw=/3uì·îâòìeÿÍœ:£ÁCõ)á=:›b¶¦ú¸º[Ðév·¥ÔͦÀVÊ&G®‚oÝ^Ä"þhábµÎ<šs± YÕˆvÅ R² šaƒ´î2H¶g7¢]°®ÈCäºË§U¦­ðéÓ’ž^–ŒÔÓÂnÄ˲N¼LO'^æ-ˆ· ¾%^Jχ&²Â¾- ^DµjD³Ø„cº Í9ÚšÑLVËzšR±~c €&±nc lBã·Ú4¢9Y¢ÖXâÜ´Á^Pò®…~5á†(ûè+Üzö•üôì+e‹ì[ϧhóF·€&oµÑjCKNÐ]ZÑÈì[u3|“R«nd6·ê¦¬~§çAc—Á·Ú^½PnEC·o扭Hù ‡Ûó&”/÷ª¶ú[%Ôx2é¡ít~'Q{ê•d!ðR¥«pÏ´ªd4>¹ù0«Ïo/'ŸGã—ýô¢›VÜûñëñ›ñÁ©¯jó9v²6•þo¨ZbíÞÑMdÀö«‹OÌø×þ]o¢ŸŽÿšØÃËÉŸáãôlvÙOö'çŸúéõÏêÉAÌb”[8rië9 ›u|39:ØÐ Âz+îb‹*ô¨K×t¿|ùÐ]\\N>è›gh9!Š¢—ç˜Ð8àÎm,ü M'Ý ,Î \…mHI/¨ÖáZΉmÖ;~€>üÀŽ+Ì_!Ïaw6»™vw<„JPïê­ÇË]ðj»æ9<š:ÿÒˆ–TÒˆÖ2íïÃõxHÀ¹ÝjùõÚÊÓk_ÈCÖ5J/›—¦¬:@'¸ß3ú8Ù¡°Õ¨‘Û‚š«àï„6S3Ú;«ßÄžÍ°Ä»ÐŠŽ ½§V´‹®|Çsûu¸†-ékÜ¥øÔF¸~qÛ‚iCÈœž»<ܧ¡arœãºŸ˜›ü´_»ŸãìM ‡A›˜,ëw^o]"ô­hýîl]ôçúüà9ºê‡<}²E?ã8ÔO´Ù&Éú%5ýáÂóõlvþéŸ~úy­Ö°´‘kû¼€!Âë ‘°C–/—… n)ø!9ãCÆio"ê©®R¿£ñä¸]˜v´Œ!1q§t w¶ú»‚žœËƒ–¼ºü2,s=úIíh–†¿hz1äuÿw7}ÛŸŸÍúé€]®Ï6®¸%dgõ׀Ǭ9è®®æ-æ]kj* mQ§e‹ïÔ Å[&jD to¸??†j—[UsÒ/cò> stream xÚÅV[o›0}çWXíÃ@®‰Á@¥=d]S©ªª­¡OY5¹`&.˜VݯßgLÚÒ›´n/øö]Îw|°MÐtb|ŽŒƒ™ë ‡lÂP”"‡L]†|ÇÁŒ†(JÐÂô‰uÌÛ²+„ÄélfV@M!ck˜« ÑdIËóFù¤Ïv¿ å@sŸˆù.ö¨âÂX\”Àâ)‚¥0@·i\Àâ»ú9šßîãí¶ºš`»‡`õ1ÏÇ`ÕHå¡ÄpË}a»Ô%扖í{®)WBw¾ ËsL^7U©'j5¾ÙM¥Ý\Uèï ›Xvó¼lÒª.ì><Ï~w@Op8Ȇ²CÏÓ .y#$îàŽI=L|÷-DjÂÜ‘íg„bŸö„}M\gk™AµÛl=°6”PÐ(¡WO´Ê€J©™¶eÜE‘kÆÐç)bzR—Bþ¨7tb-¾N[%™ø˜¦“\6|)FÑ  žA;TÇwâ‘êú§ˆåGËö11Æ0çtEÅ¡ÓÓ´¿¯MæT·…«*Ñ}(Kwâœ7.ȧ©©Õ}©Ûæ\´5—cN£d¨œÇuà•=Zn íkÛ^J—-ìÈp±ç*âwº¼Oº9¿<;Ó~l¾wq>ݵÏù¨‡¶qÕ–²7ólAF …WÁ©E*jQÆÏ"\T‰È_ë¸Î9¸Ýð¼æšMÏæÇ£4•×ÅÀ6º¸< #ê몯3IvÓöÈ–>Òê{Kõ(švÛûV±²¿(V%²7kùÇþ¥à¼ÿ 86ÜKçõ´^¶…(-:1eóì¹ýÂy­7zçÜGp‹ûßœ–úâÕSEÉT½UîôõS]CÑž©báÝ`»zeØ üO§f•º/ÒÉþº[ÿ%HVº­à}Qën÷CZ68$ýÝ©þ…²’Ú»ß Ó/!eCÕ?—*¦Îy!zDiqoœ»ì¼éæ¹§‡õÃûGYÁ9‚G7^/ÑÚ™R endstream endobj 2085 0 obj << /Length 1764 /Filter /FlateDecode >> stream xÚ¥XKsÛ6¾ûWpr)5c1„øuèÁiìNÛL&µåöàd˜„d$|ÈiGÿ¾û)J¡m¥½ˆÀb±Øý°/ÈwÖŽïüzòfyòú"Ž…·ˆg±³\9Â÷½ Œ¹^,œeæÜ¸:oT}•ëL]©ûɧåï¯/B1Øú›'È$þ¹@žßžÒ}aS2Ø4 ’€vMgs ¼W#·{Ûκ™F³ÙÜ}/ 5™AàV+þ6wDIÄd–¸[K¯˜¼Rá6“©pS\½ãÕZµ27<]UµwxúPiß™ŠÐKüµm í¡q0Ðxá³Æ a5ÂPc óºß­ ר¶–Ý|;™F±ûE¥–V%îm¤.u¹îh-çncx^ȦÖßì©ÓZ£Pkg{‹dv oÅl×ã*;|R™§m.$Yöè†n¡éWz0ŸÅpÚŸ8@2—[UqïKÄ$ŒB·$8q„pá·¹Ã˵ÄÜ ?ªþèG¾Ákºäïçîúªíg+¥â/ÂCÆGX ©Ãâ; #6ëÃc夹Þxµ,×êyŒfsô´¶PµNACÐÐo®Ê5"„ã ~DÍ+&˜ÍdŠH¥zµeÛ‹ †AA€Á@–™¥ÈoåX‹Ze]“êå~‹ïöÇsa)½º8"^L¸J@oF=b<ƒ¤…à°é†±«íjYííá ¹hÂ.ŠsÓT5yø,ÆÔŒ%/¼?³»ùèxÇO:d‰˜²Ü‹ˆ9ÿÂ×€c(/“ä¹Í´0bhø3.&B÷ìÝչDŽ¿Ç˜Ñ@ü./ñ¯ÏOyZ•ùv/:âΕ٪ Ç•“Tciëß0°Ì¨È]fKUþ_Šãƒªo+óB°…è€ Þ÷~糩õÎ}·PPòÖE”Ó™«Zƒ–| ©û˜F(Ú5BÕ-5%/×§åžm"áå"V0òÂÎê¿& ë5Ot“CѸY$^Ìyó™µµk|lTVœú^iµè÷PÇš®ÌØ¢Ã%l¤~¿¤þ•B¹¡g¹©FMðá×÷§Æ)/¿º7,a±kÕü³óÕ¡ØóåÉý‰ Q¢oäƒØ÷æ~â¤ÅÉÍ'ßÉ`ÂÀ ‰óH¬…BHÌCìÞsçêäÏ5¯…}Ý„ïÅp Axq=õZÜY¼Ø÷Ù ô!´¡æÑ&À+šCÕ“R9v˜Q2Â’ˆ”Ì0ÇŠª‚訩!–{&mÚô+<ŽI  3ˆ¶=y)~ä±½ó·Ê¤µÞ4š»ž£ÖÞíòX0Ÿ¹«¶LI ͘*°'åZ…”\`P«Â6$äÑ@ûçLm;ÅèÁ¼¹£·ÊàÄ’«¶—RƒR[ c ¾A¹ç@#êëXóUYB¶Ž¡.ŸªÄƒ4œ¹ÅÂ…¹y5·ù “¶cF ýÈMuÝBͳ~²k ‹-k¸@­=Öh¤Õ0Uò<å C]YAÜ»ÂZ-3Ý&f ås.nr5f5NÉbS˜wª¯Ôöª š-fÜ3âr÷4ÁIj‘ ‡¹¶2ÊʾèÀÇGpxɶ‹»ƒyÙJC†£ŒûV5…§ô´Gs¯êL—°ÏŒ™ˆ¥CŸ ;Ÿ\apဥłj"î[Û'éÜr.ÀCþø@W¦í6ÃX=Ú#‚Ý©Ú]Îo{gè±çäa×FÃ…à;ÏÃ7rä¾ÙŽ˜©•ls„8ˆ*Â? †1õ:Ð3m6y>úll‘½ohÃÕF¢ß¿ÕŇ¼z¡Bâ‰æ®¢C„Ç;Ýÿiò¨°+ÔcPି7¢ÚgDÄÈHÿ£¤±’ÈìKkšÂ?úÇJ°ï¸øGK™½îZŽªç cÐuÜr­ž(ˆÏþct˜.÷+ ú-¹ “öÖZ“Ó1o€Âþ=ò}l5ñóŠH¯NÇÈüûûëwïF%w‰æÞ¬ò6èCæååõ9ñNG,¢3Æ0„Š÷/Â:” endstream endobj 2096 0 obj << /Length 1241 /Filter /FlateDecode >> stream xÚVKsÛ6¾ëWp’C©™ˆ! ¾ÔiîØNÓI3­-çâä‘„| cëßwR¦mµ£±Ðîb÷Ãî‡õ­ã;f¿­fï/£ÀYzË$LœÕÆ |ß#Qâ¤Aà%dé¬ çÖMÃù·Õï/“d I"âq~ŒÎ%¯Š3!þ¤ònf.“JÛÌ|{ Œ½õ"La“ 3¹íJVÍIè¶cóã/¸Ë†QgÎ"È<’eè¨^ÿÃòö8€až·‹( S÷šu’¶ó!Œæ‹8q¥ÙxàíWJð‚-»G± -=v> LJhb/SŒ†—tË^&!˜Ï´d6” ~ÛÙˆ¬ ŒjÇ$ýMܼž/ôZ¼¢-S¸K{=ÕÖ’§DlñËYÕ2y~_æq°ZÂI œÔ˜@X>\¾Ùój«÷#)(<â‡V.öø™Hv7½Ûƒ9¦«KgdÔPW¹è¯+¼“&Þ2 !·À[ƱÍË\°—ÀXÌHZðNÉ*î1\>ºäQÈ'^PQ{¨_«p]Tç\5‚jÐöK_¹ðó2Gj[\^=9ôÖÄwÝЖSqÎË¿^=rÜ6‡òÕåÀ„P(AŸA` ‹dÉJø¿žÃæwÚ ºÆj¬ðÆ$¢Û>Œ½,ˆ•/óeâRѱIî8fº#θbm'«¾u0²'ôè!äYWbÔ‘ª[+fû‹Î{´^ï¶¡JMI'¨Dé«O"a»ñ5.iÙö2wŽ*,gItÀ#õÈ2D_oßB¾¾ï~†;7 ÙU?›®ÒµèCCYà¬ÞjÇ®FB§˜Ý6ùé…R¿ó¦©QÐ\jÒÂÃŽç;\îë9­¬fýP‰š£–£ tQNÃ;<×”m䆿w@¦Þ”Á×’ÊýW?ö˜L)øŸ“’–·îOöº²ÑnŸùéÏnn˜’,QØp]'tÙéïšÑBMù°Ñxh§»N«ÿ²Àï¥Ù½Ö/ß5»×‰Zýw¶,Ïéõ¯ø ‰ï¿ð*Ú‹º¾ë«ÄÖ…*©vi·€(%ƒbAÉÙÅjv? =‡¹ˆ¤1´ˆ“—³Ûo¾SÀàv2çÁh–NMX çzö÷³í‡³×hмà(-%铹êéL•,Ç„O"ßýÀ*Í#1ðæc#ç10¯2¯‹Ù+­#àû§À™~è ”àÆÆvJ¹†²”2 I”xa’ýL0÷hbî$@A©Ï™Ê%oÚã§ñDB×ÈYº-ÍTšº˜¹!ÕØ/8P+ÂÇ‘ž¸žÅ5pZÿmQeÊÂð4¢¦Õh®-wϼõFôÜž_ýZDq²«/9Ðá d£ŽÇÊÿ9-K¬§4c@ƳÎÕïý=ø R¢û|¾ùôi¬š êÚµ“L½¢moeÝ5Þz𶍷›Ükwà~W‹bdä{Á¤ Ì›­×õ¼b•ß> stream xÚµXmÛ¸þž_aì—•‹H§wÉw臽KöC®-’=\¤(h‰¶ÙèÅä]ï¿ï<R–íf[ ŸD‘3äpž™gFòÛ…¿øõÕÏw¯~¸MÓÅÊ[¥aº¸Û,ß÷¢8]dAà¥ÑjqW.>9·ª)oªêwÑ}Y†¹#»~ù¯»ß~¸ƒ‰fì^–G´¯ÖÉ"ȼòÍI$œO„Ý(‹¼<\¸aFs«Ôâ貪zo/;O•²–nâûÎ_ùñ®Ù¼Æ¦´¡Kæ­’„õ:Ñ”míõR–gòÁ¬t%ÚØ»t‹©ôßþxÿ~V¡V1k#Åpèä™Zô m×öÏi¤FCŠÆÛ›—Ù´)¼FÔòeÂkÑŸK†ón”t¹Ævìwgò¾çÏû’ êÕæñLøöæýÇ·³Wô „;Z{y`à¨Ú-qsG[•Ï¡2ª‡tÙ€Õß«Z!T(ÁläòKËÏ­‰8>ì…Ztv¯“û®Õn)…´s=EšQÚtmmN‘‡N1R¿¿S(¬Um̦ ‚ ñWT§¿h¦¯à—‹A·ƒ3!Z2#½ Ú"LÍ[4.HYêÆ/åÒÎ#s„Ó÷ÝØMö\ƒèsQ§ßï…ûT¤¼Ñýó½*M‡d\$*ï5Ïü¬ZÕ€åÉ΢7“¡DöÛã;øÑ€Z •‚@§’Î¥ñûurÞáÖö3ûšÕ4¥‘» £isˆwKo$üýý~T{Õ{Oyív™SDv –cE2À×K®=ÕApù"Y a“„o øÇ/Üa]¨Ñ#ó5Í!ëƒÒ_´¨³€¦†&Á0“d¢jµ1š[ô¦ýÖ_Ÿx›¯XàK!˜°‚±vm˜Øän…?ú0m®Å²ä„N¼Æª±Ìþ ÏyT¶,3· ³ü 5¬Œö¼®“…U”Qfȱ¨]À“ºÃ`üÆ R]b±hÝòD»¥ãº)Ó> L3Jhöü t•‡þ#¥£ßŽqqŠÆà´™¡_ U3™B«ŠyÜ©5Ú{‘üØ©íŽ"b¦Ã®$÷ì ‡À‡÷M¢3àŽ™×ÁDM¶М2lEˆ D'Eä~cVF\ñ2Áuº³Ïja[1¦ónÅ_¡8ã>=΂3dxå” …0uâ#ÖÐ-<Ù³4h±3«—ª“º#§›ä NKœlŸ±K#åÇôÑðåOi¾¡ŽKI‚¡®f'ŒT>jyr¯É Ü\*²å^—ã.ºSM›ísÃs’¬æÀ9?ž{ÚŠ3UwÁ!}ÆãÿTÏ+ —0u®)¡¬-9lÁÚ×¶\³4¢Z¬{> stream xÚ½YKsÛ8¾çW¨r1]eÑ|“JNÎ$žÍTœÝ²•½${€IHb E* iÇûë·_ EEvœÝÉ–6úëZÞl=óf¿¿x³|q~ù³…»H‚d¶\Í|ÏsÃ(™¥¾ï&áb¶,fŸ4:ý×òóË$Ù[F¡ëÇ œCk.˺¸¨ª+eþ< 2G›÷¼ðäK¶…Ï¥{‡ÌƒpáÆ^ˆ!Ÿõ%ð½Éî&?ÏcÏs^Öz}[ÖÍöåé<ŠSçÕéïÈ b–Ë–_Mø…ñhJ¼ NŸ³©¢Ì;¶aP^Ò#înõL”д›R&4ìÒ· Õ*ǵ­´êz£yNµ¼+‹^. UÇøÈ›íNDÕ¡Û”¶×°}+’ýôàøh4j!ïËnÃ=Å»ª’yUnX²1¤€h‡:ò±N·û‹TñêâfùºŒÐAŵ^#|ÄÛñá3¼FÖk™o½R7‚Õæñ> 8îJµj 1‹„†Û6¿þx1oõW¢ù»l7Ÿº}N+ë7ú˜ç@!2†;Ö½?OãØQk½¯4p_  ™yûNVÂp™_òÛw7úkð׬A’5**v~ÚaŽ1"¼s:تⳃñMP¾xqîßoJëx•n'ÇLSú$¤ G½çaƒ¼À–·}Gž.Lç‹{Ýtà:³‰»ÝÄG¿»Ñ"F+0ª§ým Gßà20_Ÿ]?Ž' ¨Î[¸·B1™s¸×ˆ— ÉjÙ·Qï,WüXœ0÷’¨ç/˜2‚§’ÐŽO;„hñ‹!µ/†3Â$MÜEvè‡ Ç'AÎŽò‚+¬d¾çâÝ}iS$±W´ä÷ä˼éÙôI…^>‰ÏÀï>d'ù мº¼ ÖBO<YþÐSFs‡ ”cPš,ÓÜLÌ +£ÄšqÄñláX;ÎÀŽ™¦‰)Iû(ô¡²ZH&5Âe|\´»ÂÎàÿ^!ÔN‘]¡Åƒ»ÒʺVÚÖpÛŠ;F_]0 ïÉ'V}m/£[qدùC£–œ†‘µ¢¥dšD‹I´E("è²^ýµ—º‚}Zù9¯Èy«Wª¯D8=ÏõüÿJiŠrµú±æøé 9A˜ˆæáPß "]{íFb -QLœú} ŒW®™‚ˆã=F]ÂEgÜ8ŒÇTç 8J:ÆhÉD÷ó2j ±ssh ó÷õÊ2ˆB )ŠŸ|ÝúÞô®ÏöÚ¦y8L8u2FÞºàþv¯ZFzócGÙ%ŠÌûe'Ë8/,«PxÍ™>j`i´­ÀÏÍfÙäîõwWüLG½éá˜ßª¾…d`iô“÷›`&¡ÚJzcÓ«ÔzKAÓB( Jæîʦo«‡×2£w•Ê™õ#¾:Ú¯-‚¤>¢p¬;mn›V?õþ2IëdƧòÎ4TË(ckg¹¨"zŸoèöwCå`ïi4‘Á’§´ÍÖE¦h±î®iŸæ=D]ûûPÊ3ºë¼×$Zy =`&Z‡ÌØ.O}ßw.>ܼã#‡9Ú %r?¸EèÆY$nJ}sé=äî´qKx¾uÏR®”Ëç#Þ²CÂ[%±Óªí_ÊØk&8*‡·agͨ9šŽ"!´L!e…!N"äÇä¹ûIÅërábÏkãgä˜ZŽ)„½£Õ9â–ÞÈäþ?6âšÐ5ÞQú×ÙêÝ(ëHdÍï#6ßåäÕÒÌù"G Àoi¶n«uñ´‚h×´Úæ?ÌqdëÆá {Ûçh¹ð‘T½S¦}ÿÄÜ_™RÝV\{Œ¤rÈïË3®€÷\\ƒIŽz8}¿Ñõñ”4ˆžNIqwÙÚó4Ge| œ|¸>9cÒ ¥«“÷ñÉã9êÉ~­ ·"ò<ÁÒÌÉó0 Ý Æ”€mÍ–ÒÒ®&a>ˤR81 žàÂV6¶2›êHu+“D:C-”&@Ké´ðîáJŒï¥K40N‡O çþãr`rœ ˆDóÞØªP%¶5þïÑ•óáý†‚ZÖTZÂpïOëòÛçbæ…‡qÙøLJ»> k$rqI‚lyŠ’VÏìŸB«ƒZßXñú¹ìRvwõ­~FðºD›Òt,»“IÇ¿î‘@ðp§’Ú>;~U¯e‰]ñ]}‰ÓlÎU•Ë+ƒþ H¥Ik±ŸµZÞuÑZéæ§›á‰cõ¬×G]ÄÜUî>öu^ýõÝòÅš° endstream endobj 2119 0 obj << /Length 1832 /Filter /FlateDecode >> stream xÚ­koÛ6ð{~…~‘X•¬w× HÓdèЦ[êíKZŒDÛêôpI©IöëwÇ;Ù’ãxKQ°Èã½yw<Òµ––kýzôj~ôü"ЬÔI£YdÍ–纎DVìyNä§Ö<·®í‹¢Î_©"_Ê7õd–Ø­\*ÑM}Zg8_5JO>Í{~x^×ÓYìz¾‡¸xä²Ðþ ØñH²ïD¡4òIðÇ™çŽhH]×>ΚŽôÒÇ“é,tí“iàÎì¼øèú¾T²Î$,©]ÔômW (›%‘4‹•J F&ö1°?@Ù·E»¢¥µ–]ÞÀ8±7J8»­t­©ç;1Àžb`.Z¦i‚¦ÅqȦM<»·.HÉ:Ä16àÀX‡´Î¬L¦žÝ¯ T÷þI%– ”wkcNSK2§­Ì‰?ªq‚ê’†`Šç¤aH¦SPw¿S¦QÙóU¡ Iä_:Ýš‰g/EÐáŽ1¢1 p´üÚ¸›k´bÉr rQ'w¬ÏQ@¶(þÖ M}ß·3Y–¸•8uŽƒÀZwÊDh»-z×ãx%4á2kô~Mpô´nT%JÿÈü`L{÷==t&Jé ”ÂP‚PÇ…‚U3Á€ h¶Ã¿[nôM†ú&¡IM/t¾&,2§•<¬r0ƒ´¹D´©$6îU‚Á¢)sQõRâÆ$ÁÃàD¬¡•Œ‡‘c@45³íê ˯4eWÕ&DâÈI“¸E?…3”ÂAÓµë®Å±k"ÞY(°jcl¿YÖåŸoßžŒ(]6A[sxN:˜ñmQ–4Â8Šm9ŠÞˆ´BߢkHÓ,kT^ÔKš¶ “äBAòU4½š>º¡‹Aº<¡rxL>]~ŠÙV´³cÀñN(ÁŒ'¬XзÓ(sOfm"j>'Ж”ªÿ¶jòò/&ÐØLã-Œ<FÃúÓJÍEµà2t…š¿?Ã|rpä²ÖÅâþÔŸ³¦ÞºI¡ i¯UÚz-” V¢UÅÁM€ÀWЊc 8¬*ò9f ð`êêš’u(æõ9À Σ®¤ã“/ÃæÃOb{­“GE. г̻5#ß`¹ÂAU,W渥©‚#³PL·‚5É)^ɪQ÷?AÞ{ÐJÈ…èÊ–° ½/ã/&žçÙ§o?œ?yŸÇ9¼GîÑ©ZÂéËMÅÍNdS1t8[›–L0§Y»¢#×;Gy½I{,@AF@³»ôÔ»C[¼ZÑЉgdÆ_“”óé‘VvhÒz‰ž&âwWô™Ec+ Š’ºHAKJÔ›”Ëi^˜0ˆ`Ú7€@ ‚¾›NE‚PuÀ4ÅŽ&ˆSrƒáª57a} øè¶È4!a¦šjëôɾí¿B ïÏÈ»N#ÉÝ“l3§ÏÞÿpàù¨Ö¥Ô{ý·ÇŸ‰•¯(Øø3vü”yቃНoªì³†®«<îÕ0º» ;ûþÙÄ4Nx…¡zÌÔRœ˜ÆœÉ0ÈJh$¤Ò#^Ë€äŒÈ_N·ÜOËò­¡jÍÍ™µ´ú3}¶Ê>Еù¯¤È‘ønD7úá3¶ò²a‘ª«_ìE¤åß!6˜9}¾ÑQCÌüÖMÎ1ÆUr]ŠLBº¶;N»áìÑa뇱_uE™Ÿ‘ûçJÊïvãÚ¦“]G0FðCöo æ%ãý;¯ ýp7‡ãùüèë‘”®åm®é32Ì ­¬:ºþäZ9,sȔĺ5¨•@&ÇãÒúpôÇ£9gÞFõÜÛ"(l3¨ei_ˆoÃw€þ `ÃQ:b6&8 ¾¡·eCoy­œ„Ы*üÔ½ã‘EcaÄà«y‘±Åmo µd"¸)ª{zT&ïZYç-ß{_4‚¦F¾\HúÖIxt¼X$þS6€ìytñBßIc¾¼–:SÅÚxâ;Îrí »@ü@ßWa37/<ÞŒý7fDíê¢âÃn¸Ä.F:ÑK¢·Aç´!Åíª±ßå ÐËü4\躱Õ8‚ÖGN÷íTß‹³[àç$–ZZýðêAgr ½MjSØ^õb?€¥‡:Û¡‚ûݨÌËðù‹€#?"€{·Ô.áÜU4ìŸ Ì¤£ÆFt™ÆæUߘ o¹Ïlöø¨ÕøáìCzÂOòô -Ï«™ãSnÝPƒfbî±°]XI½¡ ™ó/4ñBL endstream endobj 2130 0 obj << /Length 1382 /Filter /FlateDecode >> stream xÚW[Oì6~çWDì¡pt*D,íô!›˜%-›,qr.ÿ¾3;›„ìëŒÇžo.þÆö¬µåY_Ž>/>]pßš»ó(ˆ¬å£å{žËxdžïFln-sëÞŽ£ÙßËß?]DQOóÞ bÏgöEQæŸë"_‹¯å,HìF¬ë´)ªrQføýTÕ—yÚ(Xä½}< 6‚/F¶îdºý}¿°OÒGžÀF>æ´QWâyðBm¨åÌrÀÙyÒ:ñ£e.r·¢e&N”ª7T{iEýsÿŒ›J™þœ9¡çÙ¿ÒÏÕÝåå䂼ØÈ¦ʼ¡fDš2KŸÅ@õbqy{>¹k-ò6CŸúº~ü,‹m]ý#²æø„äÇÛ,5"Pñ'·,vtmŸuë,K÷ïùMÔ«JZÞÜ+]g"?¸•ã ŒÌ?óÝ0Ôù_Ôëv#Ê ìF,¨‰Bò×ý}1.çþŠ#wž°CÚÊðÆ,¿ÍÌaŒÙÕ ü m : ¸½¥€øŠœæëj£mÁŸ›X5š¤áÍ+Ü÷jÍu-¶i-F&'ý·œlâzæÜ¨ò=äá½Al/#©+ô·¢ð¯]í• ¿²=qt"ÐC†ÑæËt#tܪºÎY©X¤ŽŠ‘£f¾ J¾ Õ C(ã÷£Tçõp€b0rÕnþ ¨z$°9Z…ò”p‚$‰Þ@ÝcÖ`%Æx;›¿‰FÔ›¢4éW›' —eÙyÚ¤ƒ°sˆ¤Ëþ;áò1i„ÌäBÇ/}&û=JR€+CÞ†$ߟ„Öyð/ó¢\ÓgºkYîÌá<´ÿØ6&C0]‹Ó1°¸, Ý(Æÿ!ð½7„·U5¢¸ Üé̉X çE‘& Ì!Î<ûúlAÅJDs 2ÕƒãŠj¾-§&ÌWcðî¯YÂmѵÅ`ÜN²jω¢[©‚Æçs‚2 +Ž:ë0š%ºfpˆ5#E£»„•†ïÆ=Bf7W GŠ—CÁw èÐõüEŸº¡Ž2K{î£Ø<¦à<±/o¿Ò€b£nÎx v±ï©ÄƒØs?ÂØ3[/‡H##mœ}© ,œ™,œ@LgE;Œ²€œßeAiÔ‚ÄÆ#<ý ĵÄ <g& ㋉:ù¡+Îî–¿ì|!1ZBOç±½|*$ kñÒÂEA5Oªu„y‚¢nÓv«9ô[!Uoa§õ”Ê©šÑ´‹±àQ`Cñn[ÕXñK1˜> é*Æ:.'8¤È¡XëBXT£Qûˆ´i• (Ç»ÖÏzò¢£}HÿÕdbØz~eת(¥ºß(šRAñLj]?P+EmR3~*„jŸ^ïPøwœ­jî!;s 1+.rýÈ?tñûà-hÀ×<û|ŸDP¡ ”æk”PIó êó5Nôøš:ë J¿ãÉÃ|˜ÅÝÍfœš.DÝ O±?ï³?›ýÝ(JþûÓuù”L’‡Ú"€/±ëö¼T-W-xÖ ¸ëw”}>È>Üwœܦ¯ï±ñ¨1˜I᦯ÜðGId ˜£‚h.tÀxÒ“jHé£ Ê}¤¹‹ë Í¿ï(ôn(æ½r0ï'×u±;³X²)1›ê…«Æ*Éô 5¸*ßó¸ùs6ìô¹¾Øßô£—ñÒêî4¥¶7~Jp›ËøZ! ÿÕcãÕF³8Le©®4}$飕æm“j÷‹x¹»°}ð±c^öâ|³9òÂá‹ùˆúÌïùòè?ˆ{cx endstream endobj 2139 0 obj << /Length 1643 /Filter /FlateDecode >> stream xÚ•XKsÛ6¾ëWprè@3&ÃøòLŠc§Í¸nbËÓƒ“MB[‰”I*nú뻋(P¡äx<#.—‹Åî‡}Á®µ´\ëÃäÝ|òö*ЬÔI#?²æ Ës]'à‘{ž©5/¬vUVÅ»¦,–b>MÖdU»ͬʧ~ÂVuÓN¿Î?¾½âž¡èÁößXãlj«v¼œOž&®åõ›Eqè„Ilå›ÉÃW×*àãG >¥‰õ,E7{b½¶î&Ÿ{}‡OéOL<׉À´(LÉ:ðhïö¤WؤM¾“&žeã3ô÷š¦àkÊ¥>¢³jj{,Ÿz’­’™†ðŸ‘+¦¡ÏÈú©Ëž€»#®Çä¢ïZ™ÚAüÛ‰ª¨c°§ÝHµà…|¹àCº2Žw8a½o•DJär'J=Bã½hó¦Üve] Ü#:/0'HL°ƒeôh+ bV/ß:ÉxD Rø}Æxâ—]UnjùµÈÖÄzÚ‰æ»VTæn%ˆSÕY³áh•ð®-«¥6<ïl€, CòdÛ;¯7Û]' …ü9‰Õ,-MÞ~8ŒÕ;|Fy«7¼ç†Q9L4æLmÎ9›¯JÄ$ØbWåò¤º-!Ô,êfÓ«[5BÙvbÛž“Oiú-k6uUþ'´´s±÷ÀS!¸aäåb½n‰[VÄ’X#±_;XÒˆb§,Ç×v›åJÈGÓ<—]ÔUÛ5 tBaQJh1»p6- €Òe(¨QÃLEBG Ê$ŽŠQàdô BÆ(ò1 Œ#1:Ü*ÓjÍHƒ×R‰žB4<…Àõٲɶ+$¶Î¶ë ëO‰¥9¢\ŠJ!ŠÂó @äÐ`Íi‘j:™@*'èe׊‚D»š8%*À†N ‰ ²Ôº¢€„iÇDÃÞ©JŒo¯Sø.šz³‡` "i¬1ЬaÛ0b‹\ŽNØ=’?Ÿ’û#Û~–ÊO%¢´AnÊÕͪicÉóC'‰•÷÷m¶£µr¤v&/ÔÎÑ–öÅ ]‰;® †Ø«ŽR8=¢gcG$=þÅÉÚ6àC×e¿Òãæþúúl,^‹‹!éî¨ê6ÏÖb z5»¾»<Oê¾pò9ºþfÝ–Û¦ÆysFü7Û<Ó,ñÎŽ—7ç”æ¢lL­yžW÷M4u;ôg~{)eí‘£AM'H:k–» Ô,ÔíÉ@  Èñ¢£±p*Úãf!_ÍBªû4®}2†}2r•H`(Œ eF~‚:ž5â`ËQÿ-»76tR#nOgsèû1›ÔiÎîÄLÿѱ]¦Å.íìz?æÌI |iÈaUÛWÙFŒõ+»oÔ3`%c=IBŸò`(·ÒHÓÓðİÅÍάñÙ¡„ãžš­î±ü%›u)_a)•‰—Oò½€V¶)+½jÖªÊP_ éû°3­¨VÝ ªGò¯1v_MN7ip©°“#¨ìz})2»Îw±šïˆó¼ÒóÅ7àUÑw>£ÑËi&dn òéüаØ0, (†;_|Ï}z(s4€Ê’ÛƒgÄŵѧ¹ŸRç0Å}º˜‡ú?²è›¿¿j!]S¬×Ëéüà¶ ŽÆàÛ_Ó„Óˆìv%¨ãõà.¨0«a§)™<©~÷TÝÍ©âIŒ U›P‰ÐUîÇ>w{3³[ñt z[8©¿}j eHH‰=‡ñlˆ½ÏÕUÈç »¾û©þ[?iÂ=ö†H<Àž{b0µÆJ´±‚Ïû‘͇¡[¨S@ÖÞ5;#¡ïœ§ %Alífþ í’ÿÒ˜aZ\èCPáJÝæ÷ó_ö >wBOá–¨î`!^ežv0¨·n%[Fè’'Èê•îôí[IS50{©U6:3«‚‹XðÈgýMS¾É*Å#5/#§X .ghpHÈ![É,²ÁH="ëvÒäãăñ³o”Ù?ª”è:¾Ö 뱬Z9ÕÈ"%OÙÆu̼ñpédŒ×rzí§³kô·&#æNc;…æ©—óÉÿ‹;&¶ endstream endobj 2150 0 obj << /Length 1365 /Filter /FlateDecode >> stream xÚ•W[oÛ6~÷¯ÐÒ‡É@Íên©À€­¹ Ú Mœí!- F:¶¹J”GIé²_¿sHʵl5M`À¢Ïå;WRž³r<çíäÍbòê,òŒeI8‹¥ã{ £Ä™û>KÂÌYέ;O§Ÿç¯Î’d‡3Œc–Æ1êÑÇ5ãB42pc/c±õàš\‰ÍÁP™Ïݼ¾%n½4Ïʲ1 wÄÿ`ÈÜš5Wº-$×Mk6$ˆÕ𸩇R—Z’x>y±w}qߪZï]É•h·ænžUâ? .†œ&µFÀ© ÑÛý¢µØ±ÔiØÒ˜YÕ¨o]±élžF˜nEÈ¢ÝäeŽÖZ0œ_g[Ü´{€»± iâiñZ6­êòÖÐÛ5:ze(Øy›5¹X8xsèú† Õ„Q8âXv2·G²á¼ÑÔÂÖ •îSˆ^GóØ=›¦¡=íñ^OYB±S@ÕÒ*_þ­˜mL›—Èç{ndÖ‹Ü¿È/ÛŠ'Ìù€‹û)ŽÙžzš“?_Í UBàù¡.sqö1-tXBß=íÔ4Æ:ØÐ?ПVŠ;—k<ºsM) 弯“¢y3và(²ê¹üÚ˜µ™àû)»+ Mµ{É%P6²L£‡{r§.õŠJäª6U¿¯0NDîîL©“ÌRg&Ù¨RÁ7 (ªŽ>ínæžsÒ`"h¶Æ‹ƒdM³àdë +e¯ÂÞz®òÍæ—§œÛ7úì1##'}däìÎ\ `}G0Ý•c})^¶|ßȽxaXN`É»²5/סyVЮëâõ˜ãûö4O¦ï‘¾ÇˆŠª¶Á~`Ë¥±ø›yø£BŠVð’U€g¯jÖb3º¸yÿþåXsɺÖ` ›Ÿð[;8±ê²3½»Ã§ô¸:JÖ6x;Å9XPl(ö£’Û®‚ó%> stream xÚ•WYoÛ8~ϯ0ü$5K¶[ä!ͱÀ")‚ÄÝ—´pd‹¶¹+‰†Ž¤é¯ßeK¶|!@H“ùç›ï,:¼ó×Å·ñÅç» èŒØ(p‚ÎxÞ±9g®t¶ÍwÔGëN¦Ñu\æ…ÈòÞ¯ñߟï<»öÆã6 ]਩#¤¹àFkÄ}wèjê¾3€CwWÂOîsä h2ò}¢SÓŬø¤¯yój‘…«%KÃDôú>çÖ%-ßÜß·ÒÏHÜ/•q˜ÉâƒÍ§7vóA@d* Æ,É [ÊÕi‚R –Ë?"?>¹ŠËBª¦Rœ ÛíÅRE§±ã…‹—É æÆBF"´°ŸaL»t? sÑýDç]©£Ö…k»U¼aIa—ob2/ÓÙŽ¡Ä~ž5ûëLJý¼S–aV4 ã{H%¤Ê)”Y˜F*a¹Mð=9«ÊD:]Ä¢Pi3Üã§·­~.D²bs «Y¸ã½±ÑBлÓsþMdS•‹#ŠbƘ>î·T.†Á`‡W‡{H0dþÈ®²E™ˆ´ç:V‘7pd{ÝÂäc˜ëÚu¤ØF¢:l½ô½3°®À{®ë°.°Ú^Õå É˜å6LÞ/#pP†±Ê¢U γVažcŽ èBŠ%fnuõÀ3V”Ÿ¢Ž× Q5C㌠z„ú}üM¡²X_6]\Ò¥“Fa}¥ŸÑ™Ë0†jI!3ߣÀгcFøŒ{{Qó€°~è¼`bÿˆbÇÑþuðóRÐÁ«‘ѳ­I¯o[ lDÒ‡@ÀûJ¯Va†åb[ðDÍ ‚'”†¨öå‹þ ”©æú“»^Mà}!Ñ—¯Ð_[R‹g­Œ¥ƒÁÜ1•Pf¿6=5!•ñÀÍÏwÌÅKÜœl5>˜œgõV9Õ:Ùq{ÿé 1×J°Ì´~¸j½—æ°Þñ7Y‘„áÙU"¶yj!Ý¿õ|ßÒ‰QVSí/…öR>Ó9Ö„É–X_¾kˆÓw6ãÄNÎéà T©Ñqç:¾ëÐ@P)­1aZ„Ò@TH Ôê‚p‚*3OÂ5i€çšU™è iý+`Ñ^‚u¦ð%VF/??;M§?ޱ7·O·×W¯ñíÍ9 ±™?Jq5Ênf7°­¹B“ Ør@¡V…LäÓB‘´:¸¼44™\È2Bßß«’2Dšký¾îÆÖ´kÄFîk~<0Ãûõ ¾Ã–(uðʸ€†MyE&t‰‰ª¡ Û¾å6Ä<ß?l±×džåµ5nƒÛ÷TØÃÍ»£èÝL ·m<;cwmºž5\Ç·æ™Jh§¡Ëuà iJÐ3ÐÐC÷µÙ²Â¤®)¸ÕI+MšÄH¿¨žD± gøþ?ß….‰½õJ¹nÊÊ4…ñŠN!êÁ ê=ߺóH”2§u[ÕÓ\ë±A5Ù쟉Om“N5"™‰Ôžéf=°L—Ø´ÿMÿt,q#›­`R›Vèâ’–Êɯè>°ž…0JÂv2Ô•¶O;Æ¿è®c>Ó&ÆkLä{B”¨L˜¤p˜èr?¡Àèž_Õ÷ÅaxÄäÿ¾¨=óE±žº²"gg „æËå8D?„¿e¢a䬻Çf "eªîLµËV ÕwT>k¨}AžÐuÏ¢¢+Õ6íK“½-q!R´Fe¬õƒãv|ñ?æõe~ endstream endobj 2167 0 obj << /Length 1289 /Filter /FlateDecode >> stream xÚVKsÛ6¾ëWp| 9c"ßL§‡¤±3í¸nk˽¸™,B>´ÆýõÝÅB²h3®Ü‹¸€öùáÃbgåΧهùìíyÌ‚i˜:ó¥Ãƒ€Eqêdœ³4*œyéܺyà}žÿòö;%MÑ÷Õª¥?E]ÔûH²‡Ì}€³HÊPÀŸQäžìµOhÃTþ´ÜC¨ü}½ ãaFÞ´l6lYÕ’ÕÝBèªk_‹ØÇJÉ…îÔƒçÇqàn×RI£Â •AÕȲ; íŸQ\ËÞUˆJwž6Òn«JkÙ˜Y»×p.HŒEµ´±ôÚ:{ÿáú7 ¬‹›ùÁ³zÍŽƒ'[îÊr% žV4ò%hný ?}ŠGõ‘lÈÅîÐÛ ÑÓ·j7ƒ&qiH )Òm:ƒD‰ÛC ûÀ@<H¿Û誩þ‘Š–_„z±º`\×½Tw]ÿÅ!„û]YÂSZÝ 1åã#­”ج@/Dø.QÊ[îX æšPŒQ\v+ÃÜYÐ탛aq®WÀ¶n^‘°õqDÊ|:e ‘ÉÌ:ë©Æñ!ßLë*XÚÀ¥Uýݮǟt=¦…5{9Ä…I⪡%áBV¥´òÓ i7П .†™¦iÉ«z»¨Ú^S‚A B-+ %×´³1ìÔëÎÆÜˆ:þê%©+Vrç9 $[aä{_ «[m¦®ïchÀµ6õ@8ðÁOi¯—|ƒ€Â¼Ô;Ð9`Ø0à9š²cãO¯€¬ëAþŸã¸’zP¦‹'…é×ð¹–ƒšäº€òú&mئ‰¢8wÍáaÿ´~ÖѤW’vî¨Òî@ý±Z–Ö-œ8I­Ü’ðøDѺj—Ý f¡[ƒa¯§ŽáðZÅYà‹7Ô˜.¶Èä‚iá?há°èáeÀtP‰ùŽÊǘi Z m‰Ù¡ø¦7¨ý½»Fo€79˜^vZ’†^‹É”ŸYè¡AÉ‚g¯,MÐ*ûèXÙÍh¶V÷|W/ .(bo¶—GRû†ªm{·_¼’H£³ùìÛŒCªÃ÷³RïOgÑÌn?N B5,*rgkT'†Ê²8¹v®g<£c0ÈFãX \B±8²oþÁÌEóÖÓY fµbÜé"xm©ð¶4|ÌÜÆ²šc0’P^‰¡°-1“FB±$;£¢·°ºDßü‘ø+㆙þÐâ”EQþМxbZ`œ ùnœ‘ýBU›g“БWÿܧޘI6s $$lKj÷`íF_P+GÄÔH¼­·¿àÆ^ŒzG½)7=vÞ©:Ž˜«M]ù÷9ƒMÕÜ=4‹Æ÷¯»Ãë}:ºšvDÇÆ¦?løæ¿úC¸?ÒçòæâbRÙÀM‰Ý 5©S¶xù:¹º|2©Û׫bG:™¬ ©Z¶uÝ3ºÍ¢IïØáü¬»r¤û›wïÀaÕ ÍfÒv7«ÚͯnÎ&•3Ï›ãOœ >~“\€+ö/”F„Q endstream endobj 2071 0 obj << /Type /ObjStm /N 100 /First 974 /Length 1776 /Filter /FlateDecode >> stream xÚÅYKoG ¾ëW̱½Œ†CÎ 0$qÝh×ö¡­‘ƒbm ¡Šdè$ÿ¾G¶#GR²’VèÁ0w—3ä_#ïb1Îx—œ‘ˆÿQLÎú̆J4ä_DßÃ\Œ÷b8}0)‘ŒàD6ÁsD1{—‰T™½‰Q™³˜”Y 2…ê1!¨,PTê:ˆö¢bsUTEèE̱ç½X…WÅxÕ$©.€æÁë‚‚=ãê+Þ%I*T®Û<VÝ ö+YU©²}êyrneÏC„Mȃ"+…w`V >ÔM ›+‹Ã£øÊ£_ßaƒ£Rà‹ä!‚°K"Ý… ,³Ê |-0(2ì|Y gªûÁ’ìƒîGQQwuáÌŠ~…HެÇ𔚛± Õí°'8›$x²ª‡\DO T0â½¾ƒ“…cˆ cõŒAÏG0µ„ Êã,RÝM I¥~JЍ\èV^‡Œ® °ñJàúŠ@%‚hÚ‚bPÕœLÕ¢`cU»‡+D”ª¼]¨–ŠÀ¢º‰`ÂèË ¨zŠµÈŠf JáL8J\9Žël¨ª—AÕ3†lµ äÄ\¿â^éÚèMr.ã!ƒªö’n@;ÉW÷E|õÕ}”˜U8"±º¼Iªûà YE ZÒ ]1€Š©wvÖ럛[Dq@P_™þ_ÿÎr• ¶àp“åxü¾÷êÕ÷¹UΠ΋édaÎÎLÿÊ—š5°äN*îù!×~|£X=hØ ­ä`ÃþålzwÝ,Ì­é_ž_˜þMóyažeÝ|yhðapßôúo!·™,探ë{ý«f>]Îîšù*¯Ôw4ÃÑàÍô³¹uFslSü{̰ŒRUyqn(õ|îRê±á €‘M#­3?)&± Ž: ·Ö1'á¦`cn« 2¹u…ZrS 6!óîÏ ¼¼DÒ:xð)ÆŸ J9lB)ó~P꿞L¦ØívUÌTŸZÌ”øF~åìõ¯—õù÷Ñäß^ÿÍt6lfUŠ{ßÿ­ÿ®ÿö–êƒ*v‡#!E[”(ÎÎ؆²X¤öâ`aÓëjÓkÓÿuz35ðÉOW'ö¾YØ«åØÎšùh¸Œç?«:ÑÇÂ^‹!nZH$Ø"šµ“u´[¥ë‡Áb4Ÿ>]ާ‹u}*޲ìˆëÌO “;!¿·ä&¶!·Ý›£³Å¥Óp«Ñ´ãFÑ³Èø]æåõ8;8˜Pú6‚©ÈáÁT¸Ëòœ2^CƇ.C†3Y½ÝLR|- š×RI;z9k í7±Ó]à0Æ AÀú†ìôV‘l½ÏC@¡];*p|Ù#pÖ™ذmåÖ:KÛæ€­Ü„ƒëMl‡ÍLU™·T>¢øøçôHp·¥sr½Dî×[¸ä­v`!£vñ©Œ‘Cð\¡&íWdÀC,ç°S¥?.›Ù—.YÅ<4À$ñó,°™ç#b¾¢š÷©Kœ·ÝŽ›r< 7Î¥-w oãÖÐÝÆ­¿þ´p\Cýû®.9l©KrD]’§VNž"ZR§*"bõ'#ëÕ£J›Ô9ûX½™ &s ô|°t9â¦éò¬ŒÆrÎñ‡Úü *™êtŽ#½Å@"Až¦”­þ6á4ݤ½òJ…¶ìSe[yd4½!¶ä1ZNþ4ÜìlÈñ4Ü¥%µåJÖí¶÷Ÿå¾Ó³vs1NqK¦m3EäL:Í PF£è¯S–ê¯ÍÁzý™½™—ÝÓÞÝj¯×âãf4l&ö €°ÍÙHE:¼Y9܇iÓ‡1ìçÃõÓÆ¸‡iÖ™¿ÆX°úë];nI:…PKnNÈ QNÃSê‡vÜúãHærä/_¥ÿª!å› endstream endobj 2177 0 obj << /Length 1786 /Filter /FlateDecode >> stream xÚXYsÛ6~÷¯à(¥f,†÷‘6nâtÜIÜÖVúâx20 Klx…‡c÷×w"eY¶:ž1h±»ØýöLm¥™ÚoG¿.^ð}-2"ßöµå­f™¦á¸¾X–á;‘¶L´+ýCZ$gÅÜõV®jѦeqRÄ8_—u3¿^þþúƒk¸\-ì(ŒL=´ðÇ#S‰*wDej ;€™ÃRNêU—ËbîØzÛLömO8Ö9ÔVhøAȌʛdÜnKžêçv Ÿó…ã8°a¾ð|}×®pª¯å¶g³˜4‘EkXÏȱAÎP’õÒ?(ÕÕãL4 +ЖüMäÓq ɳ\Ôßæ°]֊춬_¢Ÿ5ÖÏ~~'ÈÞÔ—EÂãt‡ÊæFe“tY8v¤Çe^‰:mʘ/\×ÕÏæ–~ËDçŸ?~äÑÓ3y+º¬…¡Å‹ þtdV"Ëx¥l×’Žª¾…6Ì2"ÏçƒÅ2ËF¡ÁX‹=&Z üFŽ\ÕeW¥Åʸõ~kYˆšžœßÍ=OÉâ&“€ì(ö óÐ5å-‹AzÄÂÃ0·²å8dH%¢[†žÒ†i/ÎOÈ/T“•ÏD•‡ö¹D²…Z¬ehëUGŽ…¥`H±ôºÌ,?nL_/ÊVª}kÑòÎôVe—pŠZ/‚TÔ´BgWúA.tPøÎ ¹ºI‹2ŸÃBäê³j¾@Ó¦ ÀŸÂYoÂÙûÓKùÝfÊGº Eo™Çz€¡¤ kG‡4¾RÑÝÈvêËY\vs Úfö2;Fz¬ožņAÝçªa» ÇUîý”iŽò»œ*p-õšƒË==.G±˜öÙ´Ï_Lã‚;Õ©ÕŸ¹l…ÿÖe²~6F ’º æ# 8€AgsbôâRµàøÍ:Ù@ú W¿\—]¦¶ÉPìº"Æ ¨faÑ)1ÿåh¦VTq¥üT ŠÙo$y%7qzþÇòô O«Mm`빃àcåRáGE|ÓÖp¬çBz§ïd}S6ò•âOAe•”èª.Wµì¾u„X©Ž¹GPWHFÆ££A‰TÙz•ÍyÔ0Œýjû¨6”¸ )‡œ;¶² Blu>QÝ ©îrP»–¶¶o–êŽþžG>!hgϲ¥Ðv¯‚ ѸEíàø‘eû R\øqõZÜ$<ÏÒ¦e 4üV] ÍÙÝœ1«Ø5²æ•„—òÍéI&¨PÁ9q*Úž¾Ažà§˜ŒAöaa; "ð3Ô ëµkÊ0–b(R0ãäDC’Lþl"TªƼa!$”»1O¡¤~H›5{ùinþÀ-Ò¹¡Ú>µÈÄ T€;°‹Ñ£ #*nBÙÇPÆèC£úTcdKJ£-:QV„­}æ„%yÏqA¡?m$ ¾"®¶N=»³8&)tެ“³¨"&!Ô »3ÇÒϨõ¨QþÀ!–LB\¥Ô/’ øÝø’'ˆï+ê²kŒ=³./xŒÞ“ÆJéònyññkõUy˜•ÜáŽ3TÔ³!Ÿd8R%—zÝ=îkp “ )íqI¢µõ”šÐ;>îÞÀº¶‚¹ïyGЄ€’÷\G(j}­øSRÆ•Z¶] ;Œ—dÓ{‘W™Üé™äØùîPÃUB|õ î2&´Þ¨ ê®x3XÕ«F›Ìƒî˜U7yüµÉ¡ùžõÕc UYjC²‹“’ø®–ˆ þ4iÞeœJpºéœqv7êš·Yn^]±gtè+ý§¡¯nŒn¸¾æ´ÿËBQršåžÞª6—QÄ:€øx-‰}‚¹}ó>%ááÒåäT„æã³nl?Ú[Ë*ñtûòâóé#ÄŒž Þqñ‘TP!¡R­˜3 ú[4MÞòÇœüfO~³Ž§X¢KÛ˜`Æ ˜`Ù†lb…Ó9-ê¹Fq24O§Ë£ïGì45kx±-×p 'ÅùÑÕµ©%ð#07œ(Ô~i®¹¶×q¦]ýõd Ó»Ëô ŒçC§`Eá†ÖøÝeüæÒ¿·Œ²MØ@CÛ'=²ÁJB>„õ,0þÜÆb¡˜Gìwn¿¤íC Àuw<0Y®m8–Òð½lâ:­HŸÿÑD©ö½°»¹[õW1z®w›ô¸ñƒº*¬^Ť­åKÝvX-ø3B­^iýðâQƒ ²eé—²§íoM·žžz?ñôåZ6*жÔvõX¨Ö³j½ãV âDݺÊ]µ4=ãÉ­ éâ±.=7Õžó%îàîºò=ÞúŸ5E¿1vBùD :Ö endstream endobj 2187 0 obj << /Length 1618 /Filter /FlateDecode >> stream xÚ•XYoÛF~÷¯ü´"š\Þúàv‘Âp‹XF’>lȕĄ"UvÝ_ß9–IQ² æ3³s~;+{¶žÙ³ß.~]^\ÝzÎ,¶â@³åjæØ¶åzÁ,t+pãÙ2}‘œÿ½üýê6z”_2Žb[ÜfEú¹˜ËH4z]©&+‹ë"Áù¦¬jd¼°Íqp–ד`Ï2„™Ë§<Öj­ô§¾ 'êëÍNd¹QÄ‚X£¾6¨É7Û·Q:1ºÀáX±ï3Gùý‡N+Ïêf¾ðm[üŸûÇ»»ÄdT]«—·‘Vz¥+]$ú’I[k¥UÓVº0IÛ¶'™êDåCùË/7CÒ€I‹²Úª<û\cmu³)Óg‚Žº¼+×÷†R_~àˇOËKØuNèÐXIží¬JkýVߤm‚ŠLh$jpµëM~ô'U^g§uÊ¥…ö¾âCœfÛ¡»®=éßGi@íO ýi­²¼ÑÕ8Ž'ˆë¤¬†¾s§I·êß“92ÉPLûREùr9Ía5•I÷§¢wC²ižtõ½¬ó”he‰qeäàÆ ^ú–ç‡Lw]­Û­.æ®M}A^AŽ>Œ€ËBŸ”¡¸ž/Ü8ŒnŠre¸àÏŠf2óðËÑÑ_^è‰ÝH? Ï(¿ƒ»|ÚÕ|,Äê¹#š9èòŒ€«ÁDþ¼É™¶)yù›ízEÊcÕÃh"Za>ãNZâÆsQCøÕ–‚VÉap²!æ[c#úÆ.ö<+–qCÏšîwnvñD& © sp6}Q n½ð´P[ÌYÖ;ðQ<Ùê%+Ö¼ØwÍ17y ¾-¦)““Oa””è„+uÊ)=¯Zó…çyâ3ªézaèŠf£y´Ü äF&J1žÀàƒ9E˜vûº7 ÖµÚ[Ë”*¤ 0&†3«yÌJߨh|ƒÏÓ}°¼Q°<®d]D:wÑ^󤹪Í^É[]¶Ó­à‘2dЧ½«§i[™C¼~¶.Ž£g`ŒópÉ„Íw)l<ÂK)Õ+Õæ ß7° •缽뢖UÏeïŠ ¨T¥y°*[ªD#¸(™á`#®jÂ?kM¡)i»p¡ú2,î\ kpÀÁuP)»#öŽð„ÄHÀÇ£â@yâ9#Gõ!T±Û…*¦Pkް\¢ÈQ½y‘ ¬¤-jÝðKß‹œ^#²áI¸{‰M‚£@ò0 8@6tpÅ–µ3Aò¤ÓYÕ4"àÖâΡú<)Å?­®^xCu¼D2…sP,íX,1VƒÚð“– ³AŸL¨×G`v3F¾*Û5á¾;µOFØ:ìEÂoà4F}"¯YHÃ+[µ3ï+§ÔÚÃÛ‘~î!Á!¿õ‘HZ¡L7Çgð¨Çû’Ù?©‚5;ä(LtWÇž°È ‚hŠß¤c¿ryA{sÙ‚-Jw-<Í¡úTÞbx2€$@wãŽÄ–wôÈó s(ÕÞãçö ®bV„ZIU†"ö/%y"¸»ŠÚ„',õ´‹°±ÿ7WæbZ™{kß¶"9!ü8$68‡èK5ŠMi„q+c®âSa[t¸–çÉ÷Æ-ö×ÎÑ -ÒÁ\%ÏÁwoNØ)C–»¶r7å ãƒy4Eg£lÀ†úlÑD¾øÃ6‹ß†¯·Y€¼Xà^Àr³´Íå &øš—&îq*ÀZ/ °L‰Ч,Å^z [üQä/¼IÞ—w;wG\ß=Ü0A¶âõtGÙžl´6гÏäŒ>ÂTÄ‹sŸ“e[w-žo¤>BOÊ<͆yh²B^´¤“S3O§ QŸ­ö=›Í±Ä/ŸÕÉ" כÁ¬wíò¥·Í‰0¥Ã^nò]r 3½@žyð¿8–qMõ°ˆRy‰DSš¦‡*þˆà ós:QàÒ/ajZ؇OËw¿F?8œÍð2ò¾`ã¹âo®‹u³áñá!Uò¡k5¢âû:Û¬à¹è#|”ó`ïõˆçOJXUÕeq2µ¡’²´U9;Ñ4Vc„DÃvÆÛ|½xo–ÿEˆR endstream endobj 2198 0 obj << /Length 2221 /Filter /FlateDecode >> stream xÚÅYKoãF¾ûWè6°¢›oröäLÆYÉdàQC²‡6Ù’S¤ÒMãýõ[n‰”è׃…³ú]ÕUõUUKÌÖ31ûáâ»åÅåušÎ ¿HÃt¶\Í!ü(NgYøiTÌ–Õìwïºn«›væ^¯ÖZöu×^µ%¶76ó/¼¼ŽƒÁ.¿/Â"/„—G8x!ìqî ³óá™ùlfÐŒø8­ª}‰‡ŒŸ…aæ}_oUk`®læ‹(Š‹©Ùwø½ÝŽð”^uzË=eçü!¢¸­êvÍMyÍŸ/â8ñ>H;óvÉ=Å®uÄêý)§Ù€Ó<ñÓd¶?B–ð0Ï —á•¥| ÄÈ@×Ö¥“±ì´V0r«Êz§;ÛiÙùüáê5Go9øÏ“ƒìj6@VÞ+|›¬©Ÿó§/7§› ­x1¡ç&ô[4¸gÏŽÑŽ?£pó©÷SÈ_\/›ú?NÛ"ñø›zýF1ñnƒˆR5óÀk¸¡¶¸§5Ù íÛð€\õJ3Y ܘœe©_ä!øE’¾àŽ#é+âÃîæ…{Ï@öß65{\~y2ÜFÆïÞ(&VºÛÚ¡í¢N6l? ÇÕãÉÜVÕëÍñj:mW(©-g7‘°¸^šÄÞõ!PÛ…öøÎmP‘0nƒJ™R×;Îá,Kh²bl­lIâm-N¸uM·~Ä£ÐSðœFIBÖ!ÏÎÿÒï¥îíŒï€w¥mCõ<•²X˜ùA5 ÷„"(láâgÀ‰˜i¸kKÞþpJÏ‘ú} ü@éåŸ>d˜+}(‘ø"[ñÏçö<Øm»_Æ©âl¼›µÔ,u…¨6(eð¬ô¶Æ", ÃAÀ?=¨Wüm»ž õ÷®©Ëºo¹} Jèq¨1ìebfàÏÏIKÞž¹T¼Qê}Q*û›öP&_¿&þzþ”-,¹ÀÊ¿tÙ=úž¬õC퇲ãð\·r(>cMŒÆ®`íJiÕrPŒ^ú×^i›¸T²ãêͳ-q™ï~¦o)±FUN\ˆQýAƒò=.¿Â&︀äÞSÒð|§Kõ¨NøZËãNŒEcõ?Ò@*kh'µÜ¢ äP—ݬ&wN¢pXž#k‘ù'‡FѪc&¹„9ËÛ_?Nm„ãã§ìÁZ7=©%qˆ 1qÕtœW#ã´êæ¸^öôFòŒ©,ܵ½ùñã¦Rj¨€ ãÑ» w,øƒV`{Pü–hMc{9L"¥¤K±u°%lôi)Š´Ëœ . œbA‡ÞÄ`Œ1çûup‰úùú”¹œ…ùqkŽq]6ÆV÷ÑlÊ ­csz˜ßL&Àw=N ÷´uÍ… „s¸wJÚ¸Qv-ºaŰ&á‰a Ö 8@@qû†åuÐÃ$²Ó³S0“0óŸ#âñÚTñ2y§;Y=¥( IÚªC¦“§¤t¤2W­¤”Í251ìØB„QÜøŒ˜BÌ_n\Ýmx¯ÚØ ø)¨;ÎÐi´aÃèîm¥”yÒrc1ìÔ)'«NrÁÀZ±×¡> ”œ@'JÐcŸ–B€ÄcÌ€þƒËàØ!DžÁT$gåçyA[P­ˆû*Êví¡”§M„Dªè°ðP{ƒBÂqZŒ9-2pËí»ž'¯l½ÎG{ ÚôOÈ$F/ò*À4,€bLmÉ“¿¢ÕÚÓNÕèÌïà ßÈY¯Œ©×ˆÿaA‘R²¯aGŽŒØ‘Éáø°PÆaÉÝôLšÈ"1ȃ§öoÀz¡@38ás5݉&œuðds®‘øn¢~cÙY÷¶óˆ²Ð89­¯žY‡±ç-CûÌ ºâÙÝ4¯sܳÈ@U|‚¯ÑÜõ²›÷ óÂ#0ä ¬%>vÚm‡O¸RÓÝÆ-¯xjOÉ&vA& åš:ts¯Ù€Jª)k*^óÄsÆŽ 5rÇ6«èùé I~JÆï1Ô®˜p($ZŽa’‚$Àm·îöîÕÉtHK»ë—OŸ˜ ‘1‚r’¢ð~C“t>~´ÊÜ«T{Âw1S@¿<ø×^Ú,¥¡WŽÌ–÷¸2´QŒöŒ°—ŒÕÎ$ðƒM* “¶6sm¹êOŒašÛˆ$\æ„ج”ͤ(îuQËv­F¿_9dV0"?Yx\^üÜE7$ endstream endobj 2204 0 obj << /Length 1163 /Filter /FlateDecode >> stream xÚVKsÛ6¾ëWpœ 5cBßT›ƒÛ™dÚt©¹(>@$$Ñ¡H€Ü¸þ÷.”I›–› Å·»v±‹­ƒw“7ËÉì:$N†²ØåÆ!£ Œ„™³,œ•›†Ó›å‡Ùu÷$ƒ(F$-r]Öů”ú©Ë¸Pòlµ€Š°wг'=?µÀœÿ<Íb—V68ÙC™:IQ”Fæð'&¼S/—Ö>”:\!˜é' ”ö€Vp"t/ê|×ð“­&D·YO½(roY.§ú¬ÜQiôæ XO@D‘`~‚Ö.aN”u{°Gdó}¦îûZ²-§’]RIOšë"sgCês~ŒÂ(ì˜Û0Î꜉á}!”ƒ/¾ï»Ës3¾9ÈŠq5Ü »Æ¬ ­ÐÔ qâ¾mö-g;V‹ònjÈRûïkõc<,›Ú€4³¹(ëmż·¬š·2{Š…’UºIöI’9IÓÔSŽ3tYÃI†}ã0J4çŠz;ê-ÙESÎ F“xv‹r¥@A#Ð#„r2ÊS}õîÛê¢GˆOÀâðH|ħëÕ+CŒÝ4~¨çGG18j3×ÊA é±¬…¤UewÌLì„ëˆÒÿ-ͿҭÝÌNvR¶b>›mK¹;¬QÞìg®é–Vt=Â+lT>6£*לòû/8ÂÊàŒ fŸµ´ÎÓ³¾˜wHÒkZÈz'ÌhÝØ3¾UÉ÷࢙7k“¾jž7µ¤e ¡eþÓÎé–ª,{PÁµèÊ<Á¤8A·h«R>"¹¯u}?€Cêt¢ªöÔÏžõE¡ÿ¦áMš€óžbÔÁ¿6ÙdùîEß4|oa$­ Ê-w©-oà‰GšTnª‘Ñ|7p¯ï‰U°FD[vqhF2¯X½•»Î£ÇÊZm±ûGãªtHN°´Z•77Cª>‚K´*ÿf6ÞðÓ–¹;Æ×`â®/~Y\=¥/©Vñ3å%]WìšQ(PL( Ž®Ä/áuwÊ*`žC´gr×û½òì|̾zc•ä}ŒñKk4oÄÄ#ÞÈUü{"¸6À…MM]jGs§ÛzÂbWó€S©5&àzéñz˜¬Ç0Ø• ì*»júŽc–ÅŠ¡qƒb¬l².°¡EôhôxZc®êBaôŸôîÈäj9ùsBty"ÇÍRD²ÈÉ÷“Õ v Øpd©ó—Ý;!½$ `^9‹ÉïÏ–ÓöÛ ÄPüý 0hòž6xq6hU¢4Äî;V«&(‚òþ­åÓˆ¸ê QO‡ZÛ[ý£j|%nY°Z–òÞ¬æÂÌq|ˆßÁ€ñ4éxI–!ŸøÆÓK&r^¶º ùÆHeÛѽnŠ×ø ê’‹ò Õy醧„š|ovU@S×4nC9ºwÔo©ZWD™£R ÷f»GØKÝÈBUøÿÝŠœvÕÆÄCZÚ'!4ˆú¢~ô—lC•øEÐnõÎÍG­ƒ8øŒGÑ endstream endobj 2219 0 obj << /Length 512 /Filter /FlateDecode >> stream xÚåVÁŽÓ0½÷+¢Ý­D¼vܤɶT8Ðì©pp§ 8vd;Kû÷ë&YHZÓM‘Hœ\Ùïͼ7™::oG¯ãÑÍ<œD8qæ žÎ !àȉSg5žç<ý@䷉ީT“/ñû›ùuhSˆÀ,Ä&hMýfÛ4vÀ.qv½™¹Äý$&ÁgèÃC€šc`FKäû L¬¿ÒD¿¬ŸaÿI1¡'®áøUs\¥D“++6¡Œ)€zð÷‹Å°÷ 8hÀ%º’T ÍÄ&K€ÞÂV°´G‚Y9š* *Eû^¿ç,;»Û"ç LôQtˆ~ Nó,;a¸ïxfµü@åZé‰?ÝßYà Îö ýúÌoK;¼ ;ÐÔ¿¤ä)å}Q'šZž$<P”ö‹j÷̈6Á‘¿Û¡H¬ö{÷hØZ¦ŸœUyŽÑf1­a£bz *S•gû¥Ô×®eÌÌ¢'އA„Ps}ÝD]âæ,¨ÞŠ¶Â™Í„Õn‰î þª~}ÑîîJXo•"{ÇŠ?ròîŽË÷€é§KŒ–ŠV©HDÅOóØçˆ Y€nO<縠„ƒlLJ96ú9)è0ðšIöþý)X¾‰ÿò üæö/jîàw›ûòn=7 ?þ¼> stream xÚÍVMoœ0½ï¯@›CY©86fY8ô*ÙªUÒC²9%Uå³K xe›|üûx#qTW=´l ïgæ c°·ó°÷iöq3;]GÄKQ‡±·)<‚1¢Qì­A1M½MîÝùI¼ø¶ùrºŽã’.cDbpÓCÖe“_1ùs&>—ªÃÏðñ8"&ˆ¤+/W`¤ÆA‘!U ½–ûÌ2Ï™fó÷3p@Hérià5g *žšþëíå¥ ÎVs7ð–©12´Â$Ï„„‡þÞÖ忹¾½SbCAõæ íó¹»ÇKò )J‰1ŸœŸ7Ô¬5×{‘›}!¤ÙdSÊH´¢ƒJßõoß™7# îü󲾿y›ÙhVÊ$ýÁAl÷¡Ó:¦,¶? DÖf¼ª"n¢pè(7gº•\¹¡+±ƒþÐ{ ìE•H+Gs¥Q;é“ùcYeâinÕ¾.tÈôÄ;¶»ïÀyY¯Á禰2¸ÜŠI<¯ûðMõŒb\ŸõÙå^³'dêà•9oÆA½“dM.j¤8•X T1 ŽÑ“ŽºuE2aõÑèo8;)Úƒ²UeñìZ*ÛX’âñ ìê/FÓ8@nx+™þwã£ïC×ñaÀŽãã;±ï%´}vC«v«¸¶|GoÊâ0G粛麎£KCÑðú& \áEIdpgr×Ö¼YÐÐ×㋺NZ¢sv¿éPìé¯õc´ WþdG)¤û6Ö´õ„Á6Ìùí3â°;ã˜üÏ@Vp\ä@‡n”uGkq Aï¹4ÛþËZ@È•±Àü3Ì´:ôïyVÞceÆx~aáÛÊx±™ýûOcÜ endstream endobj 2229 0 obj << /Length 2405 /Filter /FlateDecode >> stream xÚÅYYÛÈ~÷¯æÅT`qySZ?ÍúX8X'‹™q6€=TKj˜"µ<Æãüú­¯ª[¤dŽMŒ<±ºªêº«̶³`öó£Ÿnýð2Ëf+•EÙìf3 ƒÀ“l–‡¡ŸÅ«ÙÍzöÖ{iªõkÕ¼ŸGKO7íü_7ýáeŽ–%Aèç˘6åËsö÷¥EËÑ¢E¼ŒyÕ"Ê ËÚ¶¬»“ÕgG½]¤y”{טF;„^Wãy‡¾,³Vh3_„^Sïç¡÷t¾H‚Ì«êNÛu;ÕÉJ³±WZžœ“¤+¯Ómç÷­ž¸ó[ÞÅ´²ÛE¥··¦ª÷O±J¼‹ÃœîåÕ¦m늴Á,ÏüÕ2š-H¸«4•ûÖ Ícïâù‹ký{$3?á3œd>å#N¼†oOÓné\Ò“ ZÝ ÀRÂ1EÝWPd×B6ç¢>QБßÜ_æÂn¡Ë²õÃÏk(‰èæÿ˜/cO»`½‘/v¨R{Ýž0]ÖÕÖTÛS–· 8­I‡ýaΗ ?Çu`ù Ç Gÿ_†£¯aXøÝhÕõn?Ïp øYWŽ9:!{¥SY³OŸ$Þs½Q}i­ÀœM‡e3B¹+nyÏ/p›úá˜Ý²Þn ¿ÛÇ»º\Žë£5EdýV;¿˜½oiÆ®&¢Ä –ïÖ^‘À;Cw+ætñ`èDXòx\F¯­0åN‚•ÚjKUö˜R«Ö‚ÿ\lÀ2Ãkó.ˆcÝèª`gç{ÂM3aô]t×E[¨RÓ œ/Ò pfÐ1|¤®@AxÑ2e ÕBÙ6uh…ÃW¬t¾X%Ù 1Œø¡¬~U ”¬XË ÉlÌp:­ظׄ_½nM¢X¸bÓWEgêê‰XÏ-é;¡ª`OAM µV65ØC̶R|›<Œ¼W›)îpÞŸˆs±wP 9a§1`gЬ‘ÿÂúªuFRkRÒü£—Ê’Ä“ø¬›MÝìõÚÿÖ@8Î _ðÓçYÇrJf\@Z;ç°íY„¦=ÙuSïr’ïæiê)SªÛÒ:k}€†ì~ªÑ?žóxX’³¦§!ñ]_H±dq”R v°{iD¼þˆÌ–z¯ÖZ2\&Á½@&ÑU’i–AL=} ;lõZæZ¯8í@Xsâ7¼JüÖļžåÑ „–K´æˆQß²Þ*ùüf@ÆÅrï!#!—»RÕ{!_÷{D1€àúkñI8þSøal®œ¡e{ÂfÂæÍþP꽕‚ ]*!ÄG1‡_ILÎŒÍ?¦j;ŠÏzý95/œHÆRÏÿ.Í~JÒ%´MjuÑXÛKÖ6Te#Uc¢U5(“ª~@›'Êãì4KbN%h Êê ‡2ù2‚cÑ“Ú÷Ö:ÒOíf£e¿¹¸ZF2¡M1è‡MÆùòÓóºkçB”x­iUÜèCS³XÖ}¡®%K³‹6(^åÝ7œÃhù]òLáÖì-;ˆ¢Y #Hƒ¥é÷èKÈe'SìÄEabvæ‚­ÛpE(è…ãÁ-–Z*“Ì.s¡³áHî‰ó˜ýîu±xÈDž+˜ÇY‹|´•*ý'‚ùÉÔ¦Bt'‹Ö"£ Œ9}Zmð¡0d ¢)¢Àþm‰âZѵVeÇ2š!2d½Š c×hò4ó÷g2P”y?¶¦õ’ÚK¹¢ Ëꘊ¬F¬èµ$²W’·h.´á¼Œ&_bá›gR ®¬ŽKElò5í!·½áò“ˆlþ„²­—³‚ ïRTXë'6ר+»õ棌¦(âb.vfÑF©³E©Rrï²´½–Ì%!d‚š,µÝÇy}¸× 9Ês{»(_žh ”ㆭÐÙKd‰±‹Eå ²É…[¾5jS8·‚èÄò@™ÅváÄ”³LB[„’6[B»ÆGá‘ÑÑ/Žv1Xc8lfã.@SP(Q1Ð÷;s‹²ž-R>;³Ý‘ELªZjuÄ…0€ô*FÖJ¥,t„ ŠI.úÎØ¶×ƒQ¢„¢¨~i)G½b0Òëxç@>TºÖ‰N§ÅÚ@¹ÔçIžhF(ƒ'ÊVÔiwèd—îŠd ¨±³,_›Fs%N7Y¦p8ž1ð>Ák*H¨YH@Þ3oh v)À*gvCÊND©¤…eÚcÂôÚKwœ dš}ä8zsH‚Ãwä³öÜ)qž${ÚJ–«àÈ»ÒÔsµqG™÷˜üÊñ"oQ>ÁËc™ ãV·->Ö$!ºhö_dZ4`$wl±žôuÕ5æ~üH@‚èQTÙ!Êt‰Ä©j(‘b®†a ºõ¿:'Eß”“:$£˜syFUêŒX-Dx ˜CÝ~’š¹¦Ê÷äÓò=·Q8NÎ"N<ŠÂRtç§lô\ã¡áeEгĻîzÇþc÷–±àVì; ïø¬‡6—¢8œ,Šs+G$–Q„nã£ÐOJã|(scÎbÌÇÉ !£dö@J? 6ÉNº ‹:¶@Ç…î4²UøŠhÙxÆUšÿ0§„(M¥Q¨`1ˆtW]úS¾ñƽ(Õ•3w©Iyo^¿ZÜ*k÷1?ÓRÜ~'ÍID¶ï¯G7°ËÕTKÄi/eܽFѱ{%pÚüA9í^±jº{͆ȧG½tæO“ÌøF‚9ÑNS€])M-Ò0³º¡ý¬nhŽè†èf*6ÿ7úú¶Òù—+øX$gÛVJ>e½ãÁªyA4z;Å$ü ç)…²ZKäiÞ EJHÈ¢ÓÍÞpÒ‹ò‘Êì2†Ö6<õßPìõãjé=«©Ioú¢c‡Ž˜ešB,;~itÂ/W’E´û¤8Ó±“ñ² ¸×{˜5¦ÝK°JÈgÑw(¦0²Ì20ÕÚPÕÛ‹FUë)>ŠzPÍñÉywþš¬ìËê݃ò`…öýËt;ûr%«J#©¶4»Úfp^`»aW—t®-¯‡fÛÿN¦øúòúæ2b†ë¢Fü@´ŸˆñW¼yEËÈEhº¨¬’ÏŽÕѬхc> stream xÚ¥YKsã6¾Ï¯PÍÅT•Eó-Ò{JfÆÙlÍdS±k/39À"$qC Azìüúí(J¦_Ù‹4€Ðýõ f›Y0ûéÝ7ï.®’pVøEe³›õ, ?N²Ù2 ý,.f7åì«—çóßoþuq•e£™qšùalhÊUÕ”_TûÇ<Ê=ÝZœÿ.]ܶZŽ,¢4òÓ¾K ÅÌç[G‹OÎ÷u‘÷þã§kýgô~¾ˆ¢È»œ/â¼ð~.uƒÛwÕ· N´åÁ{±nݘªëÑ÷ûV[«KìÆÞFÏC¯™/B–‰·ðYzº›Ãïwºð¡Õöˆdd}kú=]œ;[€‹4å{™52½•®kËÍ[E{cÓ4üUüÙ!ËÜ+uÍýÞV͆›|qnßV+<ÀÖÍÒöˆM£7ª«îèØ²eÕ˜18>ÞäS–)ÈËvmuÛwj™yß‚4ølËÀ æLhTÕç(þÌûiŸÆNóð•©Íæaž'žÌ‹‚0–¡³­,óê´n%ß\Û©C6fEEäÙ~¿§y¦%Jì&¨õ¶îœ[’£ôqáF7„ hŠôi´a’:ܱUðãn·š#wCɘ–ót;)Þ• ç„ ×N¯X¾ØmU§Q Ø q9!ŽàµÄÁB‡W0Ôüù"ñš‰úŽ´çx¤p¸-¬ØÑݸ# æJîèÈ™"J³ƒ{“Òƒ¼R‘¨m‹B©Zîíª¦Úá.ýŽ ãkB¯É-Ìö÷tŽU'—‡µjµ²!k¸ÛN eGéHIäÝÌóíÀ°‘Á1 gÐÚénkhÓÁß}­•›W5¶SŽ-Û™Ìê-*¾BlÏaѤÂÁ†zº»x!Õñw‹ 꺽½¼¸¸­ø,+Ó”0Ù´¾i7{E6ýÇ<ql´½h5ñ0ý‚™ìë|N ¸Î|ìo‹ÔÏBôK™Ÿ, gø ‡U÷¼ËM"àntœqZ8s…– Œˆ[%DÕjn0ØÇå )æÏ\°n• {ì/ Ïá$œ0T¯ÙC,3¿ÈO\-m”ž®@K-¶sf—¢7l öex†8”}_+Ò" lè‹VÎti™á¯sG_P2©ßŸl±îw!èÝŠbÙhP®ìèãx-4E´q"¢’x©îUͺÕöèdµP‡øFÆ‘xõZõu'K,s ü |4ƒ„O@SVëõËÈ —r¢8äDñrðMH¤ëaËnÅ—ÑÅÄc¿„CD_i¦ Æq‰ ,a¼?.ÒSÐ9q¾îYšv÷IQ”z×ZäÛÉèâçfÍ­[Tލ¦U¼Uðwº½5à¯^¶Ö_!ø9Ü"pxß}k6ˆ 9‘j¹aH’8}ÎŽ ÃàÅÛŒ‘)BÚ€¿|îÁñÑþÞØçÏ#^þÝ8·ºëÛ†ÆÑ ®˜2 c8s7Ê=‰€Aæj†¡÷ÃçëOÌb°Áƒ (ö¼p‹ÄO3—'©{ŸR8¯[¿‚ŒóYtÆ"fñ‘1Ž·ÊRϪÄ nk5¤sЫ†t¶sÈê Ÿ"!X¦Òà‹*ÎÿvvΤ3¨n«£”†žrœg>+kMƒ,È­ˆ<Ͼüp}sö:&~ä2PŒ2lkk­ÀèW[ZÈ ¾EŽ<÷éŒL‚(BÀWª3lJôäú[ áCŠ<ð¥_HÕ¸x =¡˜CU ýå°ÕÀïP[š©<œÃ‹HtÕ·®­Å¶Ìà,'Ø$>“´" ‘9'ÅaÌÅ¡Ôâòíku„Ñ©ÎèÜÿ—Æè”œÖurs ¬®¤¦DÈ4¹ÏI\øWéoò/ë•h§ù’Ycü*U§|HAv²çºuÎæŠê“ºü°UÍF¿Á¯@,°Õúáÿƒi¤ŒÅJ}lá®E•݃gÒLÜ)(ôï™NN¸à R$´¬,í˜( ‚0hÖ}Ópf0Þæã'! 'zÒiÈÚBÅu@‚‚¿ƒàÇ—hëÕF“oûŽ»j³u9t1®ZY·…1JþqžÞ™öáà×ÂtH½hV5ùÎ0JþNlm^SN]×FjÂ^ž "Ò>%­Ð‰Ô+,E4¬4‹І‘CľWô.€Ufm´(E^Éìkð1Ì]žy¶“!Ǻg4þú¾™ #ÞÓ¡êQžX»œþÈ3íŒ+e +W8Œ×É:òƒ¥xƽÕ}iV¦o†h÷_ó+-çÒx¸÷™A ÄÒé…C ‰Ê£·D.9 ÏÉPÝ»WHŠ×ÔZ)V, Ôfs…ì>øSX ŸÊ¦:ÿÍàlÀ”}zyM’ô ÌVuõ—ê†2À½ŸäÞq ‰ Ÿ|:Na¤äÝ}“'SÊÆÄx£šõ[“À¹¢ï,, ßàpwúþÊrêC­Ÿ¤!'qiÀOPH 9qå„­±œ°ïf> stream xÚÍÛrÓÈò¯på¹ Ý%òÅ9°P!ì lQilkW–ŒF"äïOßF‘Ù y:E…iM÷Ìôô½ÇÞl=ófs®A¦y_©üØ‘åh øùåÃ;;ß×(àÎð7k‹ÀmY—[¼P¿Å‰„ܤ8¢ÐE©jF~ùygºÉÕF×|‘`»jÚ-›#L¾yËcoPÜ(wÆD³Puå®~>½` Ë縘yÉS…^) æÒðxqŽWüòö·M§,tݹþ‚Ô; DF»²Ãáî¸Ìœ¼RÆ0ˆV‚c¡ÁŒ£Zó×vni„‚7ñ=g7,EãH×éº2±Ãá:Ûã ±»ÍuÕLsÆ¢»âø4¯@è=Jß,j±Óm×jýXL¶|éFÃ|£”o„+ (ê†ô_hþÄð9ÂæÄa-+ð(”Fš’4ØX`þ©P1+¡¥Õ?úœUÿÜlÖ¢þ<¿£þ¯d(¯û²*Nyó Øü¸âÇοå #læÖêÛ¾~¤ù0¿Wà„I쨈(Ihñ¾E"…X$bh„*ÓÔ ì8 0tOS…”¶¦l‰’C‚ñCóî Í©b¸ˆaÏÒUeÄóÙÙKAâQ6 ‚ˆ}Æ}_¸6Àñˆ/öˆ/\ àø£;Zzƒ¸%¨Emi0¶ÐŽpFU„»æàÁ£H2!º± ',{FrÌNÁÑ%¤Iª;|Zkãç8Ä Räþ Kd^ÖmÓïÜËë{Ü!¥ÄCĨ´È*Á’m±á/ÅÃM9F)H(ïFÒ$")€»¶$E%Ѱߔr{wÜ,ò޹‰°õ¯D Ã%É/öŒ¡ê_j ¹Kœ—“ú¥J…|2iZcÍôFv†ùMe˜þÒèÎ¥óî©P!Ÿ‰<.¤‹xVWbqÐò7fÛBtp,Â`¸†……>]§ZV5ÈjÛ4òœuumQ•þ9‡Ô¬¬f£!¬L*@,LÎF–s±õÈ!þ©å7%—R÷ØrLAèFÝQa)Ö2ah´à¶UuÚtR ?¸ì+zîDŽ{—|–ê1µ#dÛÈ[ÞæÖ–[È4’™¦}„iúXðÀ­n6DH Tˆâ¤t86‡;' ¢KŠv’1 lRlƪ\F¼I»I""z£;UVæP#:”ŸÁù™ M /Ý-ÀFcÎT=_dÅ[‹ ðnE1‡{Ä# Ó€³5sl“~S¯tÛ6uÉ“R{³HŒ‚QvŠKêãDGš€¹ZjïÉ´SµUå Šµ®µaЪšwECo…Ac¾HÒÀù(é{¬Á÷VwI)²µ-ÔØ”!€½È¤Sè“>Ð*¡ý¬ûV XÑbŠ]LMUÇÉ(K-׊”¦4…Ó×ýV M‰Œoê-j<=v–Ñ¢Qü˜%!èE©ÁÊeÿ} £È¼Äy¯LÁ- o%ëØF®Ù_©–œÝ÷÷}Ís‹äɄԖ£ô¾D@75˜c¯e…Ù4}%tÂ7Ø=Zò°S®zPdo,Ÿ´©=œ% €8°Ø£N܆+vìT¹š4ia£QëÎo3Ù}%Îi©>†½¦ƒd8Š7î”ˣώÝý¯ù2!=Æáo^cÀb2|BA+‰2ÎŒ0Ѫšk¥‚¿«’â—Á tîª+m˜-ÏQσTJƶÁé+ƒ=>6r…Åö²¼T=ÌàÎls#<™)åðt†˜ÇfƒJ÷bçÙûxŠ4KÇ€kAè.w,´zÍoBÔ J£Iêŵ¨Ižê¹È•3§Ê "v{~k¹SãbšÆ?K[¸ß­*r嫯DÃ}G@u…’åô,H´#±®·óe:¶ Ü=…S–`R| |ïX^†Š"ŒâG¯³ÓÉ+¾6  ðqr!/xôùo"ëŽØ¶1ž)£ýŒßâûTš]͇®òf|‹²¸†1TQ—°O„0å`¹(häÝßö(j)¾J°œž‘ȵ7ª³ÐÈñÇÏ-Ðq4VM›r½©®÷ƒ-žF¡Ckdwn"Ž(qa¹UKSâ.?Ô‡£(ºy´™ «bý„òñ‘û~üÓ­¾W2Dë¼ÛA8)‚è~x½}ðÿy{ûxñ ý?îòߪê;”w‡„™ó oK æÐ›ªù1&m-z\Ë…ž<Çk@˜Ü+´Bo¨TTL‡CjF°2Î_•šn*i†‰“©ÏõŠöxT¥ü!êÄ$­Ü«g8úø“‘ú—Á?ž1êBD×ìTq+l…˜Oÿ•UØÏá¨*ŒOP‰¼¡·BýÚU ‘ ($ŽçG¯*~‡©^3 ÙdÛT¼5eVÄŒz¬Û™eŠ$(ùJ/¸ûÀ‰ŸNÏ¢HüfËn†@,ßü[K[U©Ë}Îë*;¬fp™ > stream xÚ½koÛ6ð»…à~˜ IJޒ‹õCš&Ù†ÆÛÅ-Ñ2½"JIaÿ}w<ÊNI¬Øëx<Þ›Ç;ÛFfØÆåèír4»ðcnÍC74–kñmËóC#r+ôæÆ25n͹=ù¸üav†”·S7ŽÜмezÕå­¸ª&€2S–/¸È6€W S5Ïl-õs‘±1u#Xz$m9‰=³auÉó|2õ|×<;Á¯gò‰c¶²ÜšLýÈ5—NDé¶d…H¤Þ/SB7<ërÖ¢j£Z>Ùq_³–Ó^Ê!ERÊÉÔ1%í³†÷¬&ndr–£")Y¡[‚kÉ»)š fNÁó “ÒªåE­ÁP®”òFôÂ2Dú¤lJQf9'U•h®˜ ÖvJ }+€m‚ò7e•WÙ–È•’UŒ»Bsð\ô ã˜5˸¤Ó^ìL½8$‚ßìÀvmLJ¯³3 ²b[pZ¦ DZϼÎÉ;†RDŠŒíØ¼?Ó6ä»CÐÕAÀ#L²’U„ýãË&Ó 0ÿ# ­@„ (S}óêôfùšŽô©ÅóéŠIžö´dùV 9äqô£ëºæö#Âg*äé+eÒˆº­0mP¨™×DP3å×» ( .#ä¢xR±\ËÑ7è¶­åëÙ,­Jÿne%U1»Føò=[ÍФÙßWHCé…¦ÚæÕ÷'|×Ñ-â ­?àÇ!ßâBÃ1¹yC¨Ãh¢zÀu¬\ H÷”ȹl!-Ùç”Ó¿VÙ£‰(ÁX™iÅ´`ز֚ &ýÞOëª!àzq:•üpÛXËýˆþRлó~ïZcZ]ò²*´ó!ÙUŠCàö{¯eHR•i—Àm·ª&›í£bå¬á9‡üٓψI‘Ï´ä~MÏ÷êÔ •g[q_o8^/Pè4—ÕQ…;¨tñç•ζWWº‹*OÏȵω‹‰úü+êœËAIƒ’c`ú½dg’#âõêÜ?Û6UK@Ó•¯wA´!ˆZ( Ói\¯ŠäwY°< ¤ÕþÐ<ñA ¨`ÍÊM\¨$@ É;Ùr½p‡ûvºg{E¨Pµúƒ'Zù7ôÙ«xB‘ò²µœ#"÷)í7œ¥ÈøÓy±“¸;äBŽ;ñÎdÏóÌ%»ã1õª Š6¢Ô¨Þp\¨ŠìõkÑC;óqÑnXKä5kè­æßntEÞAèoÕÞ7:ÓâÖÌœ¡ÃÄŠMÖT]MÒÐWo™ºÆOgÃk[åÚ!Áš)AÿZ9ó©¨î} 5S ¿Ÿ¥ÒQÞxPñwyƒÄoè3Μñ J7kµ%â7Ã>ºg,“/0MK•ÝJòÖRºh˜cwüµs©~bR¾0h:ÁÛ†óäòëk+é{x»ñU¢ºÑMßlóŠÀ¶¸ëx©Š™¶ŒÑ§¬R>ÄÃÕTòˆºáuÎ^(ïÕ³ƒlZ Ë8mÆ¢á÷hø‚\ÂÅUue5뢻¼Í·G[^ÿrŽáR!S˜?•tct,jŸÌÇåóm'ౡ-!@_¬¡_¼Q_·8ÿ™fž „Y«ü·+4ˆÄ_ƒ—Kçày©¸¾¿=³Ñùrt?rà¤m8»ÌõCËÖI1ºýh)lsË›ÇÆ£"- º¯È÷ΛÑÏOö4õ5& wC™ëÆV`ký»~¦[ýs” çG|\k;àøñ9«JÙ6]¢ªVl>"#xÅ¡‚È,Õ‚5ø -)‘•J¢ðž!Y¦X½yÆI¶gù/s9Ã0²By•ï8Í ØÓ>Ñé9ÏtzËd׺+긕3„êÕ¹z‰‘Íj"ÐÓ´êÛÉ70“¢ˆÔ¼i‡ÅªÚ|X,¨h "ƒ©zÝsàÌÍ‹Iìï(95Ê­ §—0ôQ>ìu÷x‰”Rba4Wí‡öêE:އºI"êç8•3àËèĀͰ™€•U¡Á€©=Ôj`FéH­ŽV´QìþŽ­à8ß0´,Ñl˜OQÄààÈô(%ʺk l‘Zy¢ê'xp¼ÁQ Ç©‡¶9hZªiÉÕj+š¹úY‡¯Ïqu¨-ý£€ƒÎàSM޽´[»Qÿ•P?’\†¥ /LÒ)¦ÈªË2†OµêtW™0Ý=ê)“9_ë}&{kÖåúX?¨¡*ïгCîçßèl½‰ endstream endobj 2253 0 obj << /Length 1201 /Filter /FlateDecode >> stream xÚ­WKoã6¾çW{’€•¢—%ûÐCºH IP4N/»=Ðm³‘¨€¤’îþú!)YräWÑ)rf8ü8óÍ(t6Nèüvõëòêú.ËœE°ÈâÌY®( ƒ$Íœ<Š‚,Y8ËÒùêÞ1^>´•bçÇs·$Õ#e^än¶^œ»+½ØÀ·ðüÈ•ÞßË߯ïÒh`ö+Häqæ."ܼ íù •¤BÇsøJ̱ϒlèHþÐvæÃKÌ?šÉ|þÁãúf»j„üÎB4¯5P‰‚ÅlfTšÕ?´PŸõv8Þ´l ÅTLN‹”¬–‡w_Î=†î/fˆÃI¹*x#ê‘èòÏçÛ±pfrlyÝœÔt¤óé6?M!iÉCZ¢%ÜcJo·;­^ã+0õ=0’M<>ßßO# Â7t¾p’WÑr<=>ޤ£ëh6EÈ‚TcÛѤh!)ƒ¢áŠp¥ú<ÿeÝ4j;’½»¹º=gª<`\QQÓ’EÏÔÜø„o­7*V¤¢MËú)éÙT&±ÙÏ‚lnÙãFlÚšr/‰]%¦ó¡4·9¹O cšIs ¤ÏO’Ä}¢­ ç)èÂfî”ù˜¢YfùTª?¹;8Ž]8kÖ8&®ò€!ß=M“z‚r –Ieú£äg\95ºëFJ ´°šL·ÔLêžœ™bTÚ]{žáhͦNž‹y<~LÆÑ´¢@ºÇ ò{õP=áÇ<é_Ç‚3È#,#Š0ÎøÆ¬™[Á¤Jšoƒ¼(…zƒ€äØé´3¶’^ðâš›Þa†Ý»§=ok¯ƒX—Ask#£w±üì^È*czîT¡$ ]OÝl5õk«hàùi:¦3+Túnš‹§® œqÁU»òr<ŸðÅþÀã¨Xëb”Æ¡{›õ ]±Ä «Ý¨AJ£…[Ъ2Kt©R{­ßH#BÖÀwf:J4$¨0‚»LE¤R`.<ØK9‹j ‚‹c|¯Âž$ƒ‡©'á6<µ¥.†„±¾$Råÿ᎜r‡œö#9Ðñ¢‡4†7‹þÃYYa–5ƒgÀàTaYý”«»wLŽ´ç:yóÄ%‚‘UEˆHGªFØ¥!-÷a˜šbÐÝÔ!ã{W-ìFM±ÑK`ö_"×´M§Ùyy ³‘×WÑ Ä¿¬ÖíÉàýÌAÞ±ZÚcSJ» ÔwÜiÿ¿´ªù&‰õ¥QãÃK=ž(Í-7tŒ¼nQÞäÃÙØ5Ç=̇£B_ðÖ¤P]i[w1ÿbˆ—S›ï¬T[[ ¢‰R@ϪÉÁ&öÂôýU”ûN±Ø–ãL ¸û†áÐ Í—F®do¬¤¾qÞÿA…•¦B@¼X¨Ÿäïó“ õÞ§»Ç'›± ­_'Þë­¬/¸, æ8%N3ß5jqŒ±¥oÛ"¿õ¶òÎVÞÙúØ aîÞyQ¹Øì¬}ön«±”ºèJJ‹“ &ê"žœú÷¸&ŸvØ5—»ßݯu‹Ü9i©¢KDzuòávyõ”›>v endstream endobj 2260 0 obj << /Length 1134 /Filter /FlateDecode >> stream xÚ­V[oÛ6~÷¯ÐÚ‡Ñ@ÅèF]ì!k›mlµ³=d} eÚÖ&S.%%õ¿ß9$íY2¥À "Ïýö:ðÖ^àý<ùi>¹ºIB¯ E¥Þ|å…A@ã$õ²0¤i\xó¥÷@Šhúyþáê&MO$ã$£yž-sSÉå¨Ö›i”“ÅÔ‡ÿjQoXo‡/¸ÌO ùqThK~”PÆRcoÛ,y]u{ú„F»¡QÌYJ‹<òü0¢ úµU€?š{ õÌñÓ™ÿ?Žcò‹õ÷‡v×>çÏ(4$KÉ_¢ì¦š°R(Þ‰¥¹.¦QFö¦pcI¦ëõœOÏ?¦•Ò0ˆLZB-šV<]ç_U%±:¸„ìT³V¢mml\Ù—6ܦÉìúΆœœ¶(Ì¡;)#[Þß§EJxÝ‹K ÌTŽ(‹s£<=Ôiê'q:¬"ÊFbá:^Éj¹FrF¸áJÁ!‹Î—ãI3RÚÓÖÞ%ÈÇ»;ÃZ+¾ÛX¢NÍÍ\CóÍGðãØ`‚”x(3 ,x{è2D«ëËÍõ c:Äv…²ÙêX+É»ê Ñ¬ sÛèô$TRn©.êûùäË$ÔsaÉÒ‚f‘r;yøxK`Bt4.rïI‹n½"Í’ε7›üvÖœ`€ýÓÁ À¦Ð9Æ"€…!®c8Ã>(†s—'ù3`ÒlÃÕ”…DLYD–@ !]–“;TË;tr7l"J¬5O÷#f)5O¶êK]½Ëʼn ¨Dô-Å1EH °”,êÞ‰¶TÕîèýçým³X @\’¤ÛçRHÒ‚üM5¹â[+žÉXcò|ãjúJ#¤¹¹¯«G=™Ò\—¼ƒîÀ[Îò–[2¯Ûƨ5:Y^×{ÃÁ®>VÜøvm—&WŠÈrd€†B@aœ$ˆtÓTsåæÓÂÜhÜÀù˜ª¹œAɹx´×çu X걞5x¸JÕm(ðiÎ!ÑÆ3möˆÚTZlº–@ƒ±<¢ª«££7Vì/K®ì‰¯úy@Ë¢C+fk»М±«övˆº­ëÊ<ާ,)º> stream xÚíVAkÛ0½çWhé¡ ÔŠdÅr\Øa…f0B‹{ÊzPì/‰·X2²=Ö?ÅNŠ•©k)”BÛ‹Ò{OŸ¾ï=0ADÐ×ÞUÜM9GޏÏQ¼F”ÌÆ…”bÎ"§h9˜f2C¶ÙýÉ`5ôÌWérxMǴÊà 3Ú /b{Ln3àIì±á‰·ËôËlq}±—4rž)0 ‚–•¨¼¨+À‹ùÜb|:‘s’ ]Ë©tD'\JœCµU©ï )Õ]ßÍÀ•(-|@l(o¡Ê^_g‰­u²ËR²ÿPUPØW'ð7è•*ÁBÆßoÜ}ÝùX*?u "Ù6^?1ÏÅ7Û^Ô8ÀRûAzäø G´Ý>;kE¬]»³X “ìDyðgÈ:–[6§ççv͸¤YY¹(NøÉËïb> stream xÚXYoÛ8~ϯð£ άËò}HÑdÑEê-’ûÐî#Ѷ¶¥’RŽ¿3R–ÏÈE€hxÏùÍŒ½Ñjäþ¼øøpñî&œŽæî<öãÑÃr4õ<7ãÑl:uã`>zÈFßy8þ÷á¯w7qÜÛ„37IfpÞs“‹lÁóÕzì'Îãxÿ+©ðÜ…g^ƒ§’Þ“` ?MüLtOỢ’åxyžó>7W·÷×—xÜ3ÎæQD»S–®¹ Oó—'\×ÕÓ“¹~skí‡MIÒ0ì3:M€ÇÄõ½˜ö]ÉU[r1|§Ùq÷»#2^BûtMõøO›]õ­ñ}Îü™s%Æ“ àH;‡Nõ_A‰c7™[#öñ #Ø d‚çB§fJñŒžn*ÃB³æ’È’7ëJ:SCØ1Rÿj¹|=ÍP„ }aÌ_Ì«Kâ(c Ûæ‡nÓ$[±\¨†vjUEZUîx†¡óÙÜQæJåbuI‡2¾dmA÷¤Ü(Ú}K´PÇ‹-ËUÃDÊÝ’x?!ä,vç‰Ç}p¿)ÿHÚ¬ ÎÐàþÔyƒ ¬h9}RL?¯¹1LED-+´ÞSži£ÁLiUt®è,£¡eµ¿ñ=bGT OƒÑ³¬äž†TßF“à6&Š’-³j}ûfqËæÎ%Y§Yçæ¾šI.f½í9/ ¢\8 oŒõ[ ¦Nœƒ4yÊŠâõ$útè…ÊOW¿úFH¢w~â?¼ Ü0û“¸ïÔCFÁ…‰àLre¸„3-ÄÌ¡í!˜x|W2oÖåþ&yÓJáêKá®3ýíN'Æ€Eà gøs“‘Ä ‰¼Û㈬ºÀÁ÷ýÈÒq¹¨ŒnÚlžA&à7nŠˆÓƒ„\ÔíéàQtNA ‰©Ù¢Á¾èpdc@9äy–ôc¢Dµµó9ÓÝmÚsqÈIJù ê+¬¸Îb!\]|dÂâ˦J¡ì0º°!,Øá6kœÏ€WƒW×èyÊ¢PZ´ÿƒ–$Mjj Uä˜Ã#^¸ä\ È@_*‰Æ ÁAô A€œÔ«he ©(еäi®€uÚi"ZE’8ža(éamjŠ— ×¼fÕv,Ü@Ÿ‚c)N¯Ï67rõŠ—yzZ1S¬–?mrF’8æÐ3cz˜ÜÈ™„‚ˆ—ôì 6v¢ÀámZ@UÅz»ç)ôaÃ×L—L¬Ys}y†qÆ5+KÔþoD¯Õ€ÖáZJ-täY{´„>žõ€2vx.A?%ùLj`·¢Çûv…[zvÕcëM@Þ¡~®à–Åâ=Ý‘ñãÚÑuøv)é¹Å`^Öjœ›Î„¿°´žvÇ÷L<>qùX)> ÿéŠr”À€‡°Åí,jÀ]ϦMi›ºÝÙÒÕŽ˜é 8£Õ³ÍóÛÜ>ŒpßãM%}ë/tßÝï·:Vtã5ÅúmùÛUÖg 6¢8£ÚR˜qlŠ"ñš²×nXìÛ§û½²>…Ù¬˜qYò‚S5`Í¡_XÚÕ~jkƒ®äÞw´ôy@Ç¿Ãåo×ö7…³¼n€ætü0 SŒéy@ÐüÀù¦ø²-Ì<Ï’HÝ1›óL„i­çý>üÐÔìö7|Æ7ãÀ¬+êª<³íEW?žŸî—œÒßJŠÂÝ ºµÝc¢*ÒÝ>v7zB7DR^â±Í‹Ìà— D ÐuîÑÈ|Û«À¹ROö½ö½¥:Ô÷+‡úåC^|»½ÝÒÂa…AOBõñ€úè®ÛۡШ ©zýÖVuÙL¸Ú¯žÖ΀«¨žOI¾äBm 1›2º’º'UØy橆,SŠ ùñê ö™žäàû¹Ø@¼mfLFXîiïýnl|v÷¹à”ÏG|Îtó{^¶k£Ê­‹ªf¾6RóÒõÀ$«uºûŵՇÁSˆB¨8ÿ¸zýpñ?ôvËC endstream endobj 2289 0 obj << /Length 1633 /Filter /FlateDecode >> stream xÚ•X[oÛ6~÷¯²ˆUQ”d©X_¶6EW,÷{ÈŠ‚±èX›nÓ%iÿýÎ…’-WIÈsã9‡ß!í9·Žç¼]ü²Y¼¸ˆ"'q“ÈœÍΑžçª rÖRº‘JœMê\‹‹¬L¯jÝe:Ï¿}ZÆJè&Ó7¹¹XÆ0ºëÓ.?o~{qÈ#e×+-ýµHB\\xÖê0w|l:v€>[½mt½wK]˜‰ôŒ 0ñGÝeU©óåJÉX€PVÞ2]ëUHÑ-WR Ñð®²DÛUI™þÛ ½+ø'//y‚¼8¬±ÌZ\šìv¿Ã7Kp@ ª*ø #ñÙvçèµ³ŽÜ$ö„3 CÞX¶™D‰Æ@àJ·dU1©ŠI®¾Â!›¸ôñ úäòÊk³Ó}ÞñGÖ2Ÿn[œß0=5)¾à–ÑíÅËJŠ ¦­b9Ú<«²ö»=yîMîöÀøž˜q7É'äÐeÊËÀb»×a–ºíUFY¸¼D§™´ŸHØ!rösN¸Ô£r?–¢íë:ÿ†4øÄæ ’CA†ïmU¢H§³’ ç:ä¹'#<ÁlYeg§pg\ïñ´cï¤n¿/WPÃ5ÙÙb”ÂÛÌ£§|¬;4¸)ü0¹) ;ÍYÉ#•÷ r‡ vŸø}Ÿå9ShËÖ·T÷(]ñh˦ecÆøã4cÇ®Gì:æoHŸ¿ŽÇôù fBŠ}MyÌ ÑȆœìÒ_'ÖSâ¯,»-\XU\á© bµû‘x·c®ª„b˜‰sUâ>•¢<3…‡J©€+(Ã4¥èñ9¯’"¢8D@ZÀ8 ȲeÑŵµÕÂ* üÈ¢5{ói™DBç½y2å dÊ„‡ŠA£Á:»¾Ü" âW ¶Ú&faôáymÁŸ; ÚbòÃw(}MÂ7œü‡‘U!"ۺ؆˜záÙ¬P.ôÁóÊ:«ù3Ï  çR¸{Þ”xK‰zÔ{•„ì}HÞc:a†ÝGŠ“¹ŸP½fRSóy+SnH¨³<‘oM×Áj˲¼—Y§† þ‰×'qA‡æ”),Šª¨ûθèë N&Û_{ƒþ¢õ¾dÄiÚÄs+®Lßèî‘k“NºRа:ªnÔÁq°ŠŸîƒz¢'µ‹‚”ü›£Œ¸¬ð ÊÐ6³h¸*L{\x¬Ü ´ˆ1„j„7(‹àŽ#Ȭ@±­)8áŒóÌÓæU×BÖ¢DŠKnYdg7ª8òqtqf73ìM¢+Hz |쪞Ž:„ëɹØ´|<7èMó<ÍjĬǕ‹Y¤¦»éJ¿ùª‹:7í,HÏÞscP#h¯]úB]©î46̳ú¦Ø~i ¸dŸQëRãAjìMüÀ2Yyõ'Hç‰_ùdóæG‚$$*;Aõ€Ä­)-e¾ÖP]m6°äæÎä?pƒJêçøPÃŒ{:0âå îÍ»áµ@ü¯xø4<'ì"]´olË8°”axŽCäCõÊi~§ÛRt¶ìsþ¼·Ó7}–§'¡ø.Hš‡4ƒÛHK lý8=½ß«»–ܨÄì΅кÙöÛ½5ÕžHî2ºô!)=ë&+·Þ¸³n/%û™Hg Ù1K8>ž¥qsÝX¯x8«·úì|ŒH;Y”/¥7¤dñf³øo!éDÊñI©åúQìl‹ÅõgÏIa\vU;÷ÄZ8ÀÐ:P@çÎÕâÏO½[§Gˆm'YÁ) ¼`îÝzRd'(%m>ÜÌ$d ÆP´®…põ¬—¡¤6/]aþΚÀ/,uæê­ÁùÈxÒUaðœÈp‚™—;<¹]åY(mÚm“ÑÛø9÷É¡Hߥöžíp‹X”ãù§Åý¾j /Ü-¡7Ðþ³<ëø%J<ô>9üæîqìÌ•ÃcŒž%x*VÒV…eHÍmcÌ 9˜ƒÄyžëg9=ÚÀ †áIðþ±Õ·æéØþà…üÑ< œ=S®ëN@MÁQ¶`aÑb|ùX)á!¹¯Ò—s;ÿ¡}Jè7—ÉnðkF§ ´›WÐy&xÀ€¸ìÝ*¶Ôí Ýü‹¦‚7S1ÀÊYQ5–à¬æ56Ùv¢1<ŸM¶ÿÊ&áu endstream endobj 2182 0 obj << /Type /ObjStm /N 100 /First 981 /Length 1781 /Filter /FlateDecode >> stream xÚíZßo7~ß¿BÍ‹F¢HJ*ŒN÷\‹ÂNq?‚<¸ö\⫱[¬×@ûß÷£ìMw»³Éìz|¸΀ ŽD‰¤È¢$SÌê‚£˜“‹TŒ`GJ.†\±Òxªãª JpÂä(;)%ä4±õD§%ÌÀ+.SãUWØ&.ÉÕÜZØEüU T[[u1µ¶@I¶6q‘C²¶ì¢DS¡F•3TèX¨µAõšMD­ø“0‚BxPm˜ž 'ÚБR“OÖÖ 5dëEG†™0³TJ3´¡·u)Ä6K¥Á¨âRD :#–MTµÐ6ÛX•¨Ú€H.¥dúĪD`ÎÄÔF¨ÜF`>¡&#DÛÓÖ‹Ž”³I‹P¥DSž0_ÖF¯ÙRVþÈ rÍ>‚ 6%1 8NÍpÊ šö |Ì& ¾diÚc½XJ>-¶¸ 2Jh#,"Ød0æ«ÍJŽNB³!"¡4>uÒÂË–Dl‚,ˆRsDJÊ­7[`™\„Œpæ'ÕDTPjÓqr¢Á@oÉÉÄŠ…b!*ÛÄpŒÔhÊ ”ª*FU§AZ[pj1Uµ©y\j‡ eó¸2ˆæpMNÅÞÚ¤­æTi‡›TÛšiÕÖ3ink!F5gˆ¨Áø cmahlÞBräÖÆ† ótÌÉb›š™› Ã7¿DYš_`FÎÇÉɬ{ûÛ/½ë~¸üÐϺW‹ùªŸ¯î h?ŸuçýÝâ~yÕ·6yhû®¿¾¹|¹øÕ½ Ζ†\®ô~†I– FØßOçóf{÷6Ðô6Œx?ûæ› ùsÖ]Üÿ´jß½™ÿ<ë^.–×ý²I toºWïbû0Å®VîŒò )ølò« á¹Fpº“×]¸îÛÅÛ…ë^»¯Îÿ5÷ýýòrõÂA…i´äðE€øÌ€'´IðH„>’t¯o°Ü Iÿúru¹©ÎkÌùpÏ]÷÷üÓÕê¢?{ARšßßÞ¾ßËChÜZÅ+p9Ž›%È<’;){ µqÜÈ^^„Ÿ…; {ÃÔ÷"¹-ùzªÖ‡agH95|ú`|”õGq5ÆÇÛã8Êã—Ú–ƒ”g_˜¾ûa¹¸ºèávÀæõ™ëÞö¿®þÏ;x*x*OÀSYã©L‹§$>#y`“@#»(‚ÂöòQÒ P‰‹§liN<#[a»óm#IêƒÖÏèq‹ñkXÝ,ægýåê~Ùß퀫®r¸†¸±W»ì Ò­¸ÜŽØ½AŠ] Æð´¨¬e7*«•5>Fe¥5‘>žC€ÂÊÅ?¡ ±÷' ^Q—¡¸óÈò(l)Â2ëclµÐêNONš„îôʼß]t?ž¿±ß¯>®V¿Ü}Ýu׋¿X~è0*íþí¯úÛ[ª®ú >¤øbOYÙ³OVœ¯VÉ4¥–ÝŸ¦)TíPZDÎ/&ƒXɾ¢âÀêú„bPt{Vb†<™b5±MæO  ê¡æ™}N¶àt,h(ðh¬þ>4¼ÆÊÃŽÓŽæô¨m`HÕ’¸fÄœª¼?™žÎ¯>.–Xž ó:ò8£@Z«Â½™ý%UöJ‡"”âuuàV°–FPThT/ÊÏœN,Ðíp9[Ì_Üx†¹Å,¦‘ÜR“·CÊ8nœUPòóp£„–¢ÿçÞª‹Í#¹£ª·£ô„%Ç•0ÒÜnúŒy\úgcÜ´=–q€:xãØ<m- lDÇ[K‡¤ ²´tDXì?!M±«Ò@XЂž+,&¨»)¥]cS<ÞØGL`ìgü¼U/ýaùñÆ–cõ0c7ê%»œôÄ}®vOˆjåoL8qf»,ôû/n^ÞßÜ^¿º½¿[õ˷˾ÿsíkw ãaš†j_i$y$w"ñ¥ŒäŽ*(ýãSq°µML –Ý8át<(˜ðÁ&óf5”†nù™púÓ‘ÜÄ8ÛHyWŠSîüÓ߈‘ ä@›%ï¸[èwo2¹°âæ¤í†l²kÇ£RÃÀB–Ãr3¿J˜4¿âQñh¶£^uT¢/‰±Úv#¶ÿžá»ÅõåíÍê·¿õ7>®vnìyæw×w32¼ÊHnQ{Zx&nlAAãÿ7aëÌc­dI>ybá¹…žÍ<4Q½žiL9Ÿ•rüo> ¼òÑØW¾¡Ô1ñãžßÞ•K@M&öˆîDHH¾Òþç½ï-eü´XîäŒC^ÔhðE ø.„v\8-•|¼ãÊãÅ=ZiMðšX_O>>pLååŒÂµŸ(òq±ÿÀÆ€ZVì®0ëh/ÿ@ž ¼ endstream endobj 2305 0 obj << /Length 452 /Filter /FlateDecode >> stream xÚÝVÏOÂ0¾óW4pp$®vëØÁƒ&`bŒ™^ÐÃc+8í(i‹‘ÿÞŽ‚a¦$p QO¯éûÞï÷¥%h†ºi]g­‹a/@)NiHQ6E!8êQ”¦Qв½”v_²Û‹!¥;ȱ&A˜xÃr^Œ Kà|õÔí÷<%L8vû‘Ç@/%Sµ}‹l¢šýGabŽò7rñçK­º~LˆwiÅýãÝÝyíÇøðMvi[ìêì“¡Xœ=<œ`ŒñúÚOm‚»ºg[›0ÂiØûNÇ:EVVL¿ŠÂž§BÚCÎA)ÛÒ$j´´ÖžYM£GcïJ)X¹lœø•4g´Ïf6¦².ÅQ¦˜¼±\;»ÃaÅd£‘m•g¸ í¦ µ&Š Ý°(ØB²4+ê$êž:C)›:æÂ`K1wƒ7©-Þíù&P^ûoW ß?Lõb&¡2)Ú¬+!a®ÊöÞðÓí´b²Ž/˼ŽÐƒ¶œ¿åsgÆß·ÿŒ#¶” 5`ÍÕƒFu ‹â=,Ú»3Ç-nYÁŒ=×~-{BBÈ#Ž.þô«ŸòU¡æUùþWmå k}‡U endstream endobj 2311 0 obj << /Length 1239 /Filter /FlateDecode >> stream xÚÝW[oÛ6~÷¯úD5C‰ºØC×6C‡6Ýw/IÒãpÕÅ£$'þ÷;G¤mÉõõa0ˆhòœÃïÜ™3w˜óëè—éèê: „&¡:ÓGÇeŒr?t"×¥!OœiæÜ“kUfwíìmÞÖÔã¯Óß®®}·Çå3—F1™}!͈Ù[€8îOxÄiì9/‚=nX^hÚ6õx0F~6Ÿ›/?¾FA dp’ 0´« hËG)šVË!ùfw/ÏRêYUËÇôöËû½Ä”Òn{’tʘ³Ðœ=°ÀµÖòûpc0Ø× Ý=o Y޹G@¯¾év¿;¦DA£>³‚ªÙ_2mvß÷Ôýļˆ¼O8çäN¶Z4¸ö4  xmNE]‹±“Õ8æÄîUÚPË—˜¯VUiö ÑhõrÌíh·˜ºîÀl‡a†´†èp¼x¨df.m* ªy’ÚâÍìCVŸB€|§^ˆF‰œæU Pê¶(¤ †¯ë§­:oÍ•ÎT)Y0•E%EŠ:<R™]’_Õ ÃÔ\ͺ…ÙѼÙ\R7±¯eÄ´Ó<»ø§­½v0[ÉåÜþ4ÊWæçr ±"´³\ZF›R?ø5êAˆiƃ@xð\vLëû.ý ¡¿/áºj®E±§Ý“ŸÆß÷!¢¥•4v4 5ËÛ=²øm[~ñ¢øã1‰ÎÛØ'“Py}L[dŒó‹T­´(kõ/(Ù þp¹ŠôhTÆFÁÀ¥cQ«ôÄMX‡t?šòÖ†’)Iœ@U`þŸx#Š–j8 84ôaÈéþ9yóýtô÷Èí†wó…Y—òÀsÒbtÿ•9Â+Œò$vž;ÒÂñ!ê"ߟ¹s7úãàó©{ï_P.ƒW\%Ôóù¡÷nÏ$a2,©ÜgäµV]Á "R·³qà’Ô°£ŽALÚ2ëb–U×M`y™#+ÂZ1BÓ$¹ÈFYÏãÞåe±MÒw²NµZüðê9»OÎkµî¨6:·§7–C«7¾0Ëuì1ìú Úÿô‘ p endstream endobj 2321 0 obj << /Length 1211 /Filter /FlateDecode >> stream xÚµKoÛ6øî_!ä$KŠ”,¡È![›ƒ`ÓKÚmÑ6=\Jjýú}|È–Ù^C“â÷~ÁÞÖÃÞï³_—³÷ŒxÊ’(ñ–`Œ(K¼9!(¡™·Ì½g?KƒïË?>Ü'Éó9¤„`êß!ñe@ü*×·e2_ñªÙuW­ƒ(õwµj4ƒvbA&pÂ^Íá‹ZiO ߊþ¹ø¤CÝS/$)¢ijÝË*ìV¿]Ó õ ÇXs50 ÊâØbÖ«¿ÅºýÅ€ñ´¶Ô“°­âûªx)&ÁM·rÔ'cŒý[{Ü9èÍ$µM]t­¬«!Fñ=±è¼ØÖJ¶»r„M j8a2¸ƒØ¨Žbj'F1J1³xwjÛ•¢ hä·ÍŨ\‰†õñiQF±y4÷ïÀ`J)€ ‰?E•޳‡ÄhN“Q¼®È‰@N»VPOb>Zĵ½ƒ¾ :L‘¿C¡c’\Ö)Ò¶?˜<1ÖoìiÈõ•ù­S«kΦVrbЬ¶öû˜W¦(J²é´½ õØ=¨ë ç•þmÇiS¯Z.]mq{\m…Ë!­ESòBklº%±ï†UWê_Wjœ¡ëºèÜï*ÙJÔ zw´Îæé8XT×íݱÓÑ„¸"H°_ÖF½¼«d«õ}µõ¾•¥ü‡»Ø%ÖãÄoŽ’[YA¸ |Qw6|ÒôûxÖñ`âØðÉã88ögýùW‹i<Û­,„MŠÂb(ñ SV Ý|u0?Â3‰}:ó¸øó„½Ac>›)·6` !sQ4p452fm5CÁ1úd‰­—©pºRôƒ`ÞWfÛ©a2ÛêcÛêÍ»sÏÙžQ¸ZE3ìôØ9 ñÃ5$ähk¦64JòUaMø¼œý˜Ð{ä°Qš!–DÞºœ=Ç^@p)¢Yê½ÔÒcàÞ9£p/¼ÇÙ_gg£]´Fã‘`”€Ÿ ¥£ƒey\ž&'hÒ )ÃnÓëa¬© &¾å¡_t78rš6”èó=vZ{ØÄ⥥}Â}ÍZÉý›.|-SîÐ]é<ÑG#Z{©7î}°aš‡~dè~Ð+L7:Ù\”׈Jg†èÙ89?:¡^ˆãú‚0ër'qFîš;7IÊðq}˜¨DnäÙî ]ZB¯fäÙ¯êr”ÚGýÅíu?]ÜÊpX 4 øC©§¶^ýò¦Y?}J~šÄ' º;Ç]Ú0ãÿaß?©žKKÿÁ“ë·ñæ$¤ªŒI7O¬»:ïö‹zûàĹ妿¾k‚µBæ×}lÀbùåéóäšPñ¦á¯#¢‡§Å⌴ž¨r»[™¬ý/„Æ ï“”wë7ÿ³Üì×|¯jÖo" mé_‚“²c endstream endobj 2333 0 obj << /Length 1408 /Filter /FlateDecode >> stream xÚµWKs£F¾ûW¨ö„ª ÃS®ÊA±×[›r).K›ìFh$K€HÖùõéž°H–ó(˜GOO?¾þ¦e6#{ôùâÇÅÅÇÛ M¬IÀ‚Ñb=rlÛr½`:ޏ“Ñb5z4n“tµG®!yZ¬…œ¦ñ˜EÆ6“Åø·ÅOo=§¥âÑtÇöŒÉ7/l}HE-)ÂЙú«î‘”‹4–«*.“,›¾m?Ðgöõîî•‚B œø>Ìeö»ˆKë¥òµsävz7ÿ4xf-xYIQœwCóèˆ.¾+Nó¸«Ôµ»rÉ형fržÒU²ï*u®újµä³ÅÓRÓ‘öˆ®“])º¢³éÙ"Τ8DZ=ÿf F—ÙÃ&§©µå6[u¤?ð4Í^? Ÿ°J)zÚýaå"ïŠ Kñ0ôÍÊc~^>öp I7ëù éÀü!ä2+¾‡‘’5'Tí[žlßÑæµjÇt"(œÀš0-7•›j/ұˌ²èT]ÿÛ«BTäDVè÷ °§~V4’8¥áÃç ¬sÆBc.*ÉË~©÷Ául ÖéX-”}+Œˆëz/ôÆVÐ`Øœž ãÀr™æ*¢€³Ì÷ÿgó¿7eÀt׊júC6à»ä/ŽÄWWÄ ÃB@@Ä@Ä8¤cÆ÷úölMߎVZRªÇ&Pøªñau56=Ï7î²Í YÉ1ðv-ƒ©¤áüzaòÉl¬jy&EœíóªDb/’UÅwÅ{ûî0°¯* ìp )´†‘ÇNӞǸÔòø>khƒh[¿¨ã_6ÁeQíXܧmÍÔÖÓQ׿Žör.!_ÀÀÅ™1õ,Çû%/ þúï¢ðŒ)èÃ(¼úZfûwèÖ§"Ùl—º•8ËÖö€…å~•8˜¡Nta©BŽ¡ÚÇ „‘QMÇ(MÖgˆð}OËÁF( ?ç(¾Û½Ò¾Hùr‡ c| R‡7oŠ@]JF†ÊÈŒ<}¶{&C®û9¯#…“CÞÏb60³)ÿº›;M³hãMY¡â\c¬i–A騠 ¹V-®ü¹ZæÉv½tÕT&?´«‘eRó5—âªoXØ2,ò­Àï†ý‰9öi_ðiÏøb¼¾z;eǸWKÍsâ1 ¶®§´¢ÃÝÞkS ¬CLà‘ƒÓÙ‰<½ mãWlÝ ›ÊÄ.>,!æˆÊÐm †d tdCf¨ZA;Øb€õaÍ£8\ñ’¢,´„ԢʩÁþúa65 ñr*fm>‰ç¾'»"É›ƒù* ᾕˆV]8¸›¡%‚öÈ5©“1Ö+^+E:.æ#ô¼óóáAÊu><ÏÖÁåÃë§œNÙu"pí%!µèñDLѼâgŠìt Y_ÐspÀ‡s±M0¯àA¼T‰jóÝ=æ%­+SqiËõ‘œP@:<¿+_#C“Q+^›ƒÝ| ;Ç®=»Ä™¯AˤÑŒÿFp]µ-6꘧‹Tðg½©,qcƒiM³ZÃ2I Õ«MŒâàßPQÂQK’5i†Gøàt¸U¨ë¨‡3õ ;ÔÊö¸÷QÝñP¥‹Û/7·ow¶xë»”»¨|þËÍàÿ¬deMŸX©¶Û¯T§.0‡QኮT‡Õ{bê^‰¸¨V`£U¬m]Mè/±x™.)-q¤d‰(°¦l'ªA6”k-º† -u@ëˆNàâ+ €jÅI´¹(o½ð’!2­³™“½' ±J‚’®ÿèH¯•1®Šäɸë!Ô|Z\ü w¿²î endstream endobj 2344 0 obj << /Length 2088 /Filter /FlateDecode >> stream xÚµXYã6~Ÿ_áGktYGö©3Éìf1édz°XLòÀ–¨¶Ò2å¥éôþú­‹¶|uÛ‚Zåb‘,V}uÁìaÌþþæû»7ï>$á¬ð‹4Jgwõ, ?NÒY†~³»jöÕæü·»¾û¦ѯ‹8HƒÄûИênž'^¯Œ­ucÊy”y«®·8ëM ›¹/ì˜OwÌg‹(ñsުװ‚6¥ö{]åÐtfo‘u³Ô/òh¶#¿X†¼Ä­Zëù"ÎS¯«ù[5km,,¥ZfìÖ†Ÿ™7tÌ­L¬ûnÍÔ°Ò,³UŒù,ÝÆ4æa' Ê‚¢ 0_±\²B›ù"ʽRmzØg¹ô~×å–¹÷4‡®ü5ˆ—ÒO>H„¹÷¯Í@ê¶Ï(˜yÚ¨ûV[žÕkVøtB`mz]vëÍ8èÊÉ ºóÐCOè´o’lbÔ ‹½Ÿjæß~ùø‘©_ƒePéZídøvj3VøÉ¼Oïoø÷DøE¦ÎŽM”¸¤âØëîA‰ '[…žˆ‚)„[d~ hÁÚhhÿ¿£îŸ_ÂÐW@àõy'uÞI–â{ øL@.¦c¼<35(«Ycü g—¸¦3vŸ/’<ð¾Xè ¹¨†@¿C÷ÔR ܺˆ2”EDD`ô§•v\Ú Q ‡Y±ù+e™PüY£’c‰ÿWÌiUÿ {žZê¶e.f$é{´îßâ·ðîÇa·÷ ¬M„;mâ `m«ø3š–µ ·{æŸu×31H¢AûX~2Â^5²ZádbuÜ•‘{J¿Z«aì)ºÀOMK!Q¸c2›5‚“E +ƒØ·9Ä´êŒPš,㜅Ü d€ÜPSº VJ(tõ }UÛYŽ{«eÈH84À{1Û¥XåÅЉ3ó<övgØHQQHv†8/8H<À˜&rgÍ|ÓI$m9…ê²L™èŠœ›z[)Ùvâ ˜¬ƒèØã˜mj1&š#ÃM2Ò6uƒ¥ŸV‹§¨$¢µÝ¾s2vN|ìØîjçØRµúeÏ,1©}&¹Éf¤;Fà‹[{›™Mù –ˆ‚Ûýä€ðÃ÷Ó{r‘¤C`Hy)Ã=zca’0 ®µð=ê @g‚Œå¯é& ý/Îúÿ[Séêj£·‘oº~ý²)ª%s2AÒÀ ¼q¾µÛæŠûäº/# ɺÈÒS›ÂĪBáÉ̓eUhm$÷‚ êõy#œi¯^³ìq þ½‹(.všañ‰ȧŒš|1¿æ.dqáí;›†d2¥… ÓBý|0É ±š‡†ß=Ia¢IZõ¢Ù9ËØ*õµvyô•)¡é½ _þƒ{=Æ5(ª(M2¼r¢ÄÏÒmJÞl0x©Èø×¾‘½wÝwB]!yv èK¦Y<ò°Ü ’3U)‘ôˆ¢ÜÉãf›©,'W©·[¾þF÷ôQŽ7D¬ØØ°CŽH½ÿà©Y¦T†…ºÉ‹È{G!Ï(‚÷ä<Ï)øÇ¦¥2¾„ ßL¸ÁÈŠs/VâT)ô¸ÔÉÆŒ"~ÛSîrŽCáÇ<æÉ[’Xi±n­Y°âÎÀXÈ…jÍ£ÇQ~†pë+ÇVM2ºƒßZ=ÎåQcZŶ§q ƒðk‡anNd(ñ4$–´Äò"—Üë{¤oº¿ïì%=Ò'¨§“g瀧œí^¹¦ˆŒO×õ‘.óàG~¸N’©.ôä\øq(ÁôƒTÓž}­^«ÃÂ_æò^M½N  û@Ùs;‘äÒ  "å‚sy ›^¦+G€æmc0éà/é’ÚíãpºLø¹Ó;M”í;·@E‡q TÚ–}³‘»&«t2èèAÖÙõ]Û=<ã»þ[ycnµ²"fµŸ‡QõƒH|ºÓ« =Y,Aï<ð}OwZ¤¢,ÈÆö3ªX„„€WHT½k¾ ? ÂôÝï>^‰}žzÁÒâý‡øÛKk¾Ëâ°ú»$ Â$;é}÷ýñîÍÿfg~Å endstream endobj 2355 0 obj << /Length 2394 /Filter /FlateDecode >> stream xÚµYKsÛ8¾çW¨<‡PU ‚oÏæàd-oeS3±v÷™DBcŠTøHâýõÓ"iÊ“lÕTª¢fh4úñu‹ÝB,þñâõúÅÕÛ XÄvÈ`±Þ.!l× ¡ãØ/Öéâ£õ6+Òõ2r­JõVW7E²”‘µ/«zùûúŸWo=g âãÊð,G88úB˜Íº_˜¦K ýp±’!°\Þð7éˆÑÚ'[øBX¿ ºÚ–Õa¹r½ÈJ³ƒ.ê¬,TÎŒJ§mÒÃ^®¼(¶n¿©¤Éyðë^5HÅVV›õe¡™ÚëÊP©>.W¸O‘šYeÁ¿ÍÞLù²ô}Kå­6jÝ ò¤¯³X%cß烮 ‰ëÓb6]4:—çz'­g‹«U‘žYí[Ǫü¤“ÆþÜêêñŒÏ:ªJt£«L‚ î¶³}GôY¹®k½ÂϺ8&Êìu1·u ' „¥Èbl‡_ÞÜ€0+™~ÑÈ¡q¦N™G¢é3°VÅ4¦VQ‰fþoÂÙü<15 éÿŠOóöæÝýí¬þ Ò1ŠL7ïÄ<·ñäÄO4è ¹þðïó €eàYm;$ÏGŽmµjÚJÏg%N¨M0'ÙÒù®·\9–:Å ‘ÒZãqfªÅÔ¶*¬EÓ –ìn^ð“#£oe$qYÁa¹‚dAK —‘^FÓ–ÝÜnUZiUÝ< $ꦂp„c’Êá¹Èu!öæ"×µ.’D Y~ÓmŠöªG‡ Œ_Ù }àJÏ£À•žoìåyÃ`E¾aZÞÌ71CÈ3†ÖÕXZ*ü¬}DS8þYSH9•©§:Ãäuög)íJÇäÂÖeEÙ ô»û;&z}ùsèøÌÌo/c˜ÈðYn Bг æß¶îv‚X™9ÇV·Ò.o„±¯E© WâŸBo0}à-°jà{ç¬êEŽ•K»Àò3 ³ •G‘ý–¬û F¹çqà’e !’9ïäœ!P!•gÿS§À/·üËFÌÁ”?,A܆…¦)á }¡ªš€g¡4Ljð°n¯ºòØ.üþ@ݾK5>Û¢Wd õìÔP#"µ@‹¹_I!ÌHœÊ^’Ñ0nðK"Ÿ1±Z<`…Ô#sWüsTo“M•è<7»2Òá .W hÏCC˜›©ë ÷´5k%&ºTF†c_¡Qü­™' ¾¬y¨ÐÙn¿ì­PVû’ ú?5³°ð¨¼.ùë¡(QÛ¯Fº2“(¦mÈ$Ô‘xбžEì';×Xƒþ¢0x›å Uòˆµç°–¦Ô¦/ÇñS¨\ÀM[iæÑ¤p0 M“†§» ` 'ÕGpÖBÞ°2DÆPä¦*Uz.Ô®Òú`âìäm¤:¬ÖÍKÔ¸UÆA+£_©SprØFtšÆcMãþLx#(^6žxÆXf¬C‡ù_0jÍngÜxJ¿(Yoê:ÛgÀ”££¹ff×II=[èBîãm’Çgä°_°B¦xg9d…žTƒ¨M¼0“¬6é2ïo7ÈèïA.6†I¾!À…SÓúô™uXƒ^Ö£eŸ¡°^+îq`viäÂëïKÜA‘©H8Ø8øXáÊ‚{fØ%† YÁ—aC®ö•ÂÀG¦Û5äX³«Ôqß-Oy*wÉÈJÊñmtÏfn½WØ~îQ¾Õ;*”«#3ç;F §Lt(¤)îHR½¸-weK,Ï¢ºX2­ŒÔû÷ï™ #sù[ùqlýCvÖЙ’°k¯B϶p˜ÅJ!ìXðàçV™ö'§ƒÐeo£Th¯í©!—‚ÕÌ$ð ±=À¬îi‚yeÛäX)è® ßˆ.trõD–¨\Ï¡%‰wé¡g§™œ8 4€±âÖrÈ‚Œ ´Ñ‹Ž þÏ2èäÜ“Ð0 q±ÙahÞŸ>h¨Vu‰É5ý…¡›"¡rYV÷º™¿Ã,ºaøæž€ nÞ¤„ž ‘¨`ÚtÆüÁ—ÚÞ¨‘Ƕ[_šCÁ?;ZTx&&?ÐÑž*º6iÇKösØ )ü#¢á¶xW4B·Ñ·‡ ·õõs;<©#émEÖ¿Ôñ×î©éü9lÆk~^ˆF—Dü^iA¦17 ð}8ЍÌ|KAþ¸#Œ"óØpº’ÏH?ûds0fÎÅËÄ8§«)„ B½›¤"!Âä ˜K+Pt× XšëÖ¸Xâ7§¦1ã0e/𩌸øFÉ}> ºV#»-ÈxØ4zc½/³?…ö d•¾‚JÙ½éHDÀÍšŸe€ß;¨æoîˆa^o``’‡B†n•ã— Ýí‘1\?ŸÔÞ³¸š9ÝšÞNÜÀÇ®º 2è¯h¾uîÐ#ýëWòZŠùÞÄt’ѳ—Œ³ìZàéoêpÌõeW : üÑ£> m;¥Ìxÿ’tÕ?ÊͼØýÛÚlà °ì\;ñy[MÁz Ôº–¸þú¾iUe`q}É¿¯¡,Ñ=~cxÚÌQ9†¬­7•Þ£¸àñ;®”„h§0Úòà=$Q®Wo4>æ<†ˆÚ‰„ÚoH)œøg' ¯(ŠVs!ãÄBòí ‘Ï€|Æ´i™];Âv„\}²±¹°Q´ û ßîø öçï1ù-‡Í¼Ág-"x½B;ŒÌ_N~úiIý:@U[\÷†&Ä7ž2ó°àão€BM 11*‘¸×-žª}Ã]êAíÌ`­ ±ošc}}uµƒn·ÝØpW5¸ë“ÊÕæª&«ÔTº©y¶©TõˆÍÙi3zyŸ™œò˜¸8n‰ûp1œ'j:†g£¼D"…‹&ÅÐ¥Ñþ˜gÍä¸å†¡‰ Ò™fpIÄOB|$ú?°ôjšíQ;{²êo+cAÒü£QRÕõÅïsg%!¦“}F€ë;×2,ãI°Ü®_üÛEw endstream endobj 2362 0 obj << /Length 906 /Filter /FlateDecode >> stream xÚµV[oÛ6~÷¯º‘€ŠEÝ l–kܼ¤EAKt¬A¦’J“ýúŠt&ÚŒ‘ ë“x9ç;ç;<%Ám¿Î~YÎÞ-2ÌѼH‹`¹p’ ’A‰1*Èzæ(-¨T»KðZjZ ¿GRzVÿþöúò£W[´j]•4ñŠ‚‡Ÿ,oÜØÝ@»¯ßÚFmüñ»gbÕKw\.?~ºðFRÔŒ ÏÓåîwNÝs)éã÷Èۣ↶ú»_ endstream endobj 2373 0 obj << /Length 993 /Filter /FlateDecode >> stream xÚÝWKÛ6¾ï¯’C% R$RÏ=lƒuØô8¹ìmQ¶ YREi³›_ߎäJí¤—í‰Ôß<¾yÐö­å[?^ý°¾z¹Šc+ó²˜ÅÖº°ß÷x[Ix1ϬunÝÙ«²Î?8)·EWŠM%WNÚRôC'•óÛú——«0˜é¸s¹¦‰øO¯üÑ\Kg×X[n¹ãª-5›?ä¶0€¸àDEt¤dGeS{Ùï›Üq#ß·¿§åÙƒêŸaU#•òT+ê¢4^ßVeëÄãR»úƬþ EíC­=[€VBõ7í¸°DÆ„ÌKÕÊNa@gñ·ÍîÛ·FÃõpð6åÂ|ãU¸V—õÎÈ›üsÕï˼ߛ¬‹)ÑKK¾ž-ÐU ÀöއŠ^Ðg ŸÁ—h9§fRòs]|®fôãAv›FÉxýöýñ²çyZìfT‘ó3´0a÷²€ÄÏŸ“ÎwœÖ9·EÓÞVB ’ðEƒàéwcëÌ{âÎ~÷z}­”x2ÁŒþt¯N}:¦I›:K›¾”T½F¾yàrèDÿÃŽ.‡­#0¤õ šþ91¿¾¿½5ëÿf&Eßl&Åÿ¥™ý 3)þú™-ÎZ RËåp/_Óën7dípf÷jñŸ®'Í…Š˜ïE,œwËéc¾|óÄ%ö5$Ÿs/¶M¨Ó&N=Æ“EÌçmÄ mŒQ±£s¡ÝBÏÊœL÷ÍèB¿—mu‘9.rõ%w"/IÎ4÷×’Xgg¥qRþÔ ‹ç^…öe£3º谥̓EÓ,’L•î9n†öëShSO›‚ÖW§n&37S/ŽÓ%ç÷,ð/“Žezï3ß4µ]øQcÎô#1Á+p*Í`:w ß!Üû<ì7°!wŒ1[ÐR• î*½îGA'+yPû²% «AÍ›ïH[½•º7Hq/ná8>jÚÑeW øË2@h–·¢ÂïÔn‰ôê©n% 3pk‰QzFâ7Ú FK:iÌ^ï1\éöxSõà›èr— þ„“ tȸ´»¦‚µ²x,•j@(~Þã–ˆƒM³Q²{p gÐ8²‘%zÒ1ùHB¹Ëü¨>ž(% †·+IÛ¨`ƒÅüdôSÂcÊvO½™è$OÄDÜ^á *pº=O$IJEHPX“’²  H'Yo`b×H`ùišG]ŠØœ¢è§‘onKõ0›)‚îÁ[\0öá@räFIù7”žküjE'`~ÈŽâ6 á›õÕ_qöy° endstream endobj 2379 0 obj << /Length 2283 /Filter /FlateDecode >> stream xÚ­YKãF¾Ï¯ðmd`¤ÑÛö쩃¤X,rI#ÈbfTËe[ˆ,yUr?æ×‡_‘¥‡[îNcsR=Y$‹d}¤ÂÅ~.þùᇻŸoÓh± 6yœ/îv‹( ƒ$Í«( òd³¸Û.¾zQ˜.ÿ{÷¯Ï·y>ZúÕOÂt½ònËzûërxª-Õ}¥—‘w‹®VݹÕ;?„r ûÒ©«É©Ig ?^ÑP‡~‹£p²÷‚Ó¯~†Þ·0™·t=™$ŽZÕÁƒjƒSÕt²hB»£¥!¾…Yx\ÆkïáDÍèËÒψÂíÒ¼’jÑ0Ý'Z‡ÞÙX~’ÈüÙë¢+›š{]Ãß‚6ªª8WªÓn9NXÆ+O·j¯Áó³ðIß›,cÑõÓ‰g˜`–1sÆyJÕ[4ro[šÓÒ·”ÝÆÜn¼˜˜¡±ƒp• …̨\hm´ñv|«ÁÒ_…±÷3mÒOöC5iHl<”[«a±ôÊtH9s×…õùÜÓª™›²óV½SçªcŠq(BP›6š9öï•Ѥ¢$‰=hßî Ë–›îBÖr!vpPÿ'YU …¢¿N²ú±2¢·k„°htý9¶øŽ’,õËîPJ{ÐuB÷B"‘ž³påÝ4/8[&Ûivü%"†[üͬÚþV³æËÝ3<,a9â­v„njÊfÎlÊõ%ÄÃã¡´«ÃÜ+ˆw2¨®mªŠ4QÖ{^ÂÒS£³üRÃОͽV“æHls(O<{ÏêÀÝ£½]ó q˜3‡eUÚùç9-Êżt,;8r£‹82Ž=¾sÀ4HòìïŠ=¸ñÄë'K“ÞEÙ’#"O¾!ÅéJ<'Yi¶ñöºÖ2³ÏRãPîÚtܹŒWB +º:_Äé ‘üMä¶æÁj%¶Q5¤ÜÀœTýºªâUÌñõ¼%ÉŠswhìÝoYì$ɽóÑäE–°9©VÑÝòÄY:'›!…àŒ5O} “´ëØg†´°7øºÐ>"©UÇ*6ë }LŒô5ô›G)ªòÕÓëúH&úˆóM¯•ÓovVb4MG†®Úmù¼±¸g±à‚¸?;T©vÏÛÈáÐÖ÷üÙéÇ’¼×Ž‹ò°ÑÝUíØ²N{BÿÀ³¶ñú Œ9~èûQ»æ#·)vôº|áÚ:»6sÁköÈ]w ß$¶þï¬Zi·l1L‘p&Dˆ $žç#bĽ8&$‚Ò‚BW•y÷OÞå×/>ŠéT z¸“«CF|‹æx:) óä«'è$Þ¬Ç:ÁLGAŒñ»…‰!ÞÁŠèéHé!úÑÝ V8ŠîÈNýai\¿p§=ë4¶ÅêJ‡©-¹fÑi‰Äà® Ò4õê¦ö¿ë¶qnž8›}+àôÌdAŠª‡˜ú—Þ“ˆIž˜ILµŸ’í[°¶ í£ó,ÚG{¤}tGj-±U´½¦w´×6H; îˆ^ÛÜ;èY` ¾îtûP*fv¬{ÏmæïÑ& W¡­ë&›Âdï ´¦SÕ…#­]àh§ÜY(fG¬ûÒ÷lÄV,Ð!HåLGÕªz6¥ i,´§t +uÀï‘é—K5= ´Û×eFxþEî·(ñ¤ha‰‚´E*,‹0ךs%Âô1Õ†6®­xÅÍ2Š"ñ„²f¬…"ź/¯—uf󦱨ÿ?vÑc«ßË-= ×ÀËH’+d.ÅNÝ:‹°yˆÉ²pcñ2]Ü»°€¹ë^]\÷ߊßX»–¾º.ž_ÓCoÆIRœ³Ò8c LáVYÁ”’цfý xéwÜÜ’é9U SVÖE«\= (]iº²ÀyB@7¿ƒ·R8Ϲ݌ޙqÔƒËb~ÈðÐS² @t6•åµÓ·à“XD718Žé¦¯t«·çÂE ¢ÖTç!>^·¨·âÅ,Â}Ðí=­·C¤…ÊÒÚfß %¯P%9Lú48óA¬ÞÍ•T^âK0ôó ƒÊWV‡)A<¢ð&éyÎ0_Î<¸­Üœ«œ˜ÀžUšW8ÖfIF©võÌŒÖÑz<èzÆÝæ`ó€‡~Ø/åšQÊû"U†UòbËÇ9—‘¯M7ö›^rдWNJ¯œÔõˆw½àz„²w»720XÄ LðNï÷ÌA×{Äãxº@¤[ëv-;~ÑÁnÑ眭ŠÍÝçžMÃÑ€ãûàˆ^ÍÄðW—„‚˜ wÀÿ›öŸY–¼ÀoK=‡þn®äÞPo ˆüŸÈ±üi˜q¾ âv j@kqÔ¸TÆvŽH¯Œ’H³å¡1¼|?´Sƨç7Þ?k´Žk+Îiz´Æ–›ŽOŠÖ bŠà¸T…Ôô®UW뻓ª2m6AäÞg íMä‚Ñàz-‡®ÙÊpŠ€:¢ÐûéI29ª  KÉ+Ò#;tèH @zúx*qϨÐV2¶k]˜;b ó¶ªÃ3Ѝ2—YÚ2o,«lm8Ú8#ˆ]áM. â+ ¿ú4FˆÀaLW9Ž9@‡±”th´@ 1ÏBï-•Ñ‚˜„#MÎÖxŒu¶màÇòfN€.ÕÖMÓh\»Mqžf´lödž[v²–ÖàY<0d3ØÒg3BUõËm>û,'·ÍÑÖ£…£twF˜‹œ eÍõ¨¶Š#èƒ:1×C"µUº0©­®GU êüæp(mªû˜áѵ jHjL-à÷ã‚o¤˜©Y‚ `‡Ì‹— ßÌÞÿãXÈéëäkx/NU³öãÿ/îGNE©ë3X“ì4#¿±i#{šÓÂçe4)1Ù B±#\u¡Fmë-p=©¢ûG Èr›ßÍT‘‰IßœT¡?á¡¡;8Ûz„\p¼‰äHõ†;ö(L·šÏhZ[^ÀPYóšž$w}þÝÓƒ¶íÿkÚ<ê.Ò0-’1®%žl`¢6¨³Qí§»rX¦ endstream endobj 2384 0 obj << /Length 657 /Filter /FlateDecode >> stream xÚÕVMoœ0½ó+¬äP#ÇÆ` RmÒTŠ¢Jm6§M˜  [>ÔäßׯfçKjªöd=3~ïÍ[±¬_œO çð„1 „ù ,r@0F4` "1š€E–ðÄ)¬Ëìè†W+á^-NO2©¢ C1¦²çOp¨’lžù¼p~:Dn1 ÛX¢®å™¼<ò*‰Á¯!u  " TÛœ;ß¶ýv×FOiŒ˜„ÈÂX>F …mµT ™”.=F,9GLqv=ÆpRf'0äÁkÈhÐE{F"„q¨A‹6mŠMWÔÕ õ=úÙ$H <£ 4œx™ö%ï„ëù”À²^© †ù@M¥®CMoˆye.6r‰¡hR—@Q¹~;®“0¬sS,ʲÕ[q»iDÛÕÊÄ\wÖQ.dÞõ®G`#F ¾ÌŠKL©hÔ+1ìôa‘™°èÔr§ØKÆž”1 ™f—–¼mE‹Œ%§bzJ Ÿ!_´|gð­»^Ú‘ôÞF—8Äõõ‘v®b BòŒŒP}Š¢‹ö÷uƱÈy_v:8§z]‹î¦ÎÞÛ>ñØ ="³È?;ò å·• óU|-ÆHÈAÈYéèƒ^¾^œ½˜Å¸éª¦9 QCщè쇥nß™YM^ÂmËïl5ÖüQ£Ð¦Ñ[åÒyÖ¨ÝTdsµUÒf±QWKÝBZ²Û²îf™{ïøž5wÓŠ>«Óº¯:Ô·bVFìXôˆ_e´Ç3ÙF‚k¾ƒÀ®FU7k4uÄs(¤Ï†cÏ2­|kž-þA†Ì„ì5aø*Z=ÅñÔ[ê¸XYŸþ5K=ø’Éÿ*¿s³k2 endstream endobj 2396 0 obj << /Length 1180 /Filter /FlateDecode >> stream xÚÅWKÛ6¾ï¯’ÃÊ@̈zEIÐ-RAÑurÙí–h[…,¹””Íö×w†CÚ²¢µå^Š–g8œÇ7iÏÙ8žóëÍûåÍÛ»; ¶ˆýØY®îy,c'áœÅÁÂYæÎƒË½xöçò··wqÜS bñ0CZén–n]æ¶¢ÚHÔ¿ñÌ1pFÚÛ8Ÿñ”;s?Å€ög²,ÆßàNØ5QÔ—ù£²µm§d3›GžçþLÃç/Ÿ>j7eÝNÓÜ7²Ëë¬îª–u<Ù4ð26žd¬;9ÍüNŠŠ­¿WÓ´czy¾Ð ;‘=z·{ü€-8§õׯÉè}@ãN¶Û:§ùºV4ÉJÑ4TÜ$èÕèAKoIrR½÷^vJ´c›F7 B¹;`÷´ã#AÕ«¿dÖŽæ¢È%”„OK)ûÓ”7ªîölõ|AÛ”»éVl™>aš}Hµxþ8}•‹V¼ÕU2ï²¶¨'b麆¹¾ ®CöJ Œ¾Ðå×ôÖ”n†}Nâ)tOÄî“Þ;µév²š¾Û6'l6pGCÁY¡Šv»37ŽP–2ê´ˆÌÙà©jµcæU{6 _“h‹²øG©°w¡@o%Âè@çcõthfcè6²´ÁrsaºN#ofmÊ‚ýÇžaaõÑó½Q )qǘÜħ_ö}™h?ææP´8> stream xÚÝYßo7 ~÷_¡ÇõE'J"% A´Yºk‘%Ù°­èƒ›ÜÒ¬™8Ðý÷û¨Æ©“ØéÙ>Ø€Öæ)þI}T¼ÏÞ8ã}†BT©¾a(!†£7äÀ*™ð¦8“¼þTȤä•ð&S6^²ÉxL!S¢)\y"\eP1+•@U[²!ŠU/Þtúà¢!] +t€‚1¤Nê;¬qJAJv¤¶‚¯D¦—*‚ñNW¨É.e}é䫊Jð|5Û© °Düq`aVqk¹¨8qÕ ºc†€¤qLàHYmòläº9U›ÀVH½€9Á)Kðɪ¿úl‚:ª˜#ôàÙÖàH‰ô×À D dBvê˜C!•²î©Žb"}‡GŠLäª#bŸE*%&&Ryð*&VyMÌ\ßAJ)õ3ŒíPŠ ûœ¡,HÕÍfþÌ— Kµ¢Xr]Q × j„R²n»CÎa©J‘`ÄÁiqI B¢ÒðaP¢*DŒxÝÄÄ×$À¢ª€ªÆ#£%T£À"1ê d°(_‚dÑ´ ’“¦B ŠÕ$ŠdÝÏ ¶”¤k±ÉQåK DùrInê#W>6IwQŸRH*ôÇX÷.§(äNâªA‚V§E&Nw\«L¢®@ $©u€ZL)¨CØØ”«ã¨¹TRìì š“®ZÓìŽFãé 9¾y?­Ï?]Œ>šãÉY;yëPøî]ócsм|Kõaе§Só–‚³ZîHy›PI,¶è£xËžÀ¶kvvLslšW㓱iöÌwGŽì«ÉðêÃ3óüùÿ6·™eµ8›°3¨LK³³Ø¸¥f·7“á´?;¢O–5]oíˆ\,Êè›Û¾e3²›‰ñx¸hú({±Èä§·åº?;ЭGÞßÙ!lÉÑWíxÓ^œx?žÜ3e~a£¡àÈ4¿ýþ‡)Åj'J>ZFóÝ\^¾[ÊŒ¥rsI®+7§EÚ=ÕF´—mpãà´¹„ÿwÖ£owäölјîsïGÓš&ûèÁ­º.ÛÇÁTÜÝCŠ Ù„»•¾~ÒÃSŸ °9œŒO[$§i÷öMsÒ~ššw÷óýpxÞš—ÐÛŽ¦×zæ³®×´¾ßLNÛëÏ£¾{Ýž] _Œ?™Z 8xÐ[=Rûp8Áju)UÆ9ß°tJã/®ßóö~æ]׉7óö³´Þ–nÞº Uí×P\a—ÚSQ—ïzê.Î[ÁÑ bðÐ]¢Õ0Ýnis9º½N>þ:œ\Œûm¹ è* Bt;C‚qÎ&—Ÿ´f<Ž®ö:Å­{Ý=æY5 º—GÌ»qSÑ˶ÃÑGcŸe ”Sfšú©q¿ ëiƒ¬§^“=ºdQ1fdËèQ-Ђ0bXÀ×¥ùu¢¹õg;ÙN‡2̯’a~Q††UÔ‘›%ÙÄ¡#7P¸Õ±­#7 —m…3ªÍ™6Jü}ü^zÏ'~/éÂãô´~zûYS÷yF”["¸>3Ó¹UKc ›ƒÞ*ˆÅ(nbDûbÆèTßÙ0ËnÎý®áúFC†+&X﬎À£WÔû ®CÇS'ÍÉþÁÞ~–àÌ£zÏòÙvß¡‹%Ç¿î=êF·Þ­Í3ÏJ/b¼@_ÜÒ1³våÅø¸ò¢_¿ò¬à¬࢛Ô뙣ã¬Þ™¤‚Ó[+NÇY~èl)Oìïî›7=f™x«7 3+ù¯u÷U+N¯®Tç?KMY¤Û2ôbf²Ú9I/¢²È4Òvì­+zêÞºS½ivwvª†f÷tz15ÇÍ/Gúÿ»ÓéÕõ÷Ms6¾°ãÉy9„¥ùËž¶——@içØº@ÏÖ6–(Ù w§Ù’^ý8Óò­íq3[alÅ!ÏTm +Tí<ó6* ‡båÁg®j×.T^0åqX¿Pã¬>yVŸL3Â÷: ¡Dô®:p¶ÉãHðn¢~eel¸y×ðp}f { §,_µæûpŽ“²ýáï÷íÙÙÅè¼Ç›( R¯!p8š %ÔˆFˆÑád9†x=¼úù¦lÒB(:é߬°Þÿ# zIÌ€/N¶ÜBjÕq\¡D癿@q´àEW> ¹}µ®ÌVç´Æ™=?öÞ Ä?nâVkó® ­°óÌwØ&(ê [áÖIË/pþWÜè¥;wd‹ÙzÃSi~r{€,{¹©K †ºÔu¨Cz˜¦iž@p†J)lÁçc³@žÊ‚¨¥ ¢–W‰ÚÂkïX!Ûêɶ´ . áÚQË Æ˜ì×Z^8æÀQ[ÙoÈÖ¹øçöÚ»†„1écÚß°¬·Ý ‹<ÎÐWËÐyü^BŸ ]a‘Î9:Ÿ¥¨ M6p‡å¸øÅÍÅåÙËË›ëi;9™´í ‹þ <Ü\÷ endstream endobj 2404 0 obj << /Length 1314 /Filter /FlateDecode >> stream xÚµWëoÛ6ÿî¿Bp?TjU©×†}èò(Rt-–¤Ã€´0‰v¸É’KÊMóßïŽG9’_I‡ þÀ#yºçïîhßY8¾óvôëõèõy;™—Åaì\ÏÀ÷=Æc' /f™s]:7îù$en£–yøÎÞŠænêÙ‰¨ª‹ÓÉ—ëw¯ÏyГq3 ãÔgnà'x;ò­¶nö´¯2u¦a[FÚd)êÖ Ÿîhàa˜¸o&SG®ES—HÇæãI˜º­lqy Ž¢Êµ&†y£ìY³\åJ‚'?O¦ ]9·¾¤Mgî‡OïßïsÔ}E²ÖZô¼šnEtÓÞ‰N„J‰úA’“Ä^–†ÎâœEy>0)Œ}4i†ÜÍkZ›[05rÿEk,9¸Ï|¼]Ý=TÍþD¡ E2^hûZƒèÀ@+C)$ÅK⑚Ö¨%ÑmsP1¥28: ƒ?ŒÀ“fL` µ€jFh<`nNKÝ€æÔ-mÁ³yU¬«¼µÇó¦*íÅÀr—׋ÍÚFWßöé&7‰à4†-T³^y·ÇQÉPt) 3˜]æ‘”̆v9-¥üì3&”E­åܱE Fr¥¤É¼ÎyY/è€Ü7W(„ÜßA^Lî}ö#_ ñ=_®*»«Éeøy©£Ðs"/wwc¾8—uù&-W ¥F ?š ½¾Õ¢õ ¸Žç#À|\v¨>¨ñœ¨²Vb¸í%àÌÄ<é7¸è~C1çŒbŽGŠ2 !÷&Ó„ûîǺzè®*ñmÅXº(ÕꙬ} 0«Ñ/'÷Ü5öclÿ»äÓ¾¸1$ØëÇ«Ûe1Ó˼ªÆ]Þæ=¬œ„à¼"ÝÌl~¡%èË GA24ð¬.QXßÎÍ8»}f¼›ÿ aļ̜b9ºùâ;%\‚pe©soX—À&œ]9W£ßÆÐü)fÜV!‹½(N:·ÿ!éå#΂B˜TÄÖ(èþÝ@1ÂWP… ’ˆ·¢n–²ÐvgZ <§Œ2:+p/ [GæÕG§úH”æñˆÿH”(|Ï_´ 3κž¯ %W;í™eùø*“bD/f×9o1ú^ÑÆºýT1}ÒùB<¿’Ž| ûˆZYj‹ý•sù}ý1ŽWYÎÆ–E¯ç;,Ó »-åB¶zp›í<‡ºRþ9Õ¯ endstream endobj 2414 0 obj << /Length 988 /Filter /FlateDecode >> stream xÚ­VK“›8¾ûWP“ÃBUP$$öà­/Þ¾x­õ@U&  *œ”Þ˜vnmD©ÿµgÜj`öva”À¦$ëySì+³ dä·vd>]Á]:œz¡È˜è•+;>Ìï:ÔQ”øƒTúfÙÖMJ)ýzMëÒl6$ýùÒ’ÐÖ¸*]7UÞN}¡p@¢Y’(B²k̺¼{ŒJÌ_»¶¬·¹ fŸ¸TwÕ¶M¹-~!ªÝ¯ŸÕî!¨~jÐUY”­=#èå¾Â¹ Bø7£â+ð¿sÔ=Rá¥ÿ¯iêp—¯Ð½—h–¥DWLj}z©öo ˜ov×°·Þo—˜&>Åäwé(;Ù8¼¥Ç×M]9ðÙmYS`w‚ç6ïýihùú­8G€XÁ²8&lä!šæ•“ÚnDNÚÊ-­åÖ©ôVU9Rá7Xœ;”·(Ĩ#ýE¯|€·½O— H”à8fd ÓØcà?ñ˜›‚NAÀƒ`A¨”ˆ?茶Ƭ†c"û£¥‡.|ÙA< Ñý¬•«/Üý¤ â™1adŠÎ{J;Pà˜»A—Î!U‹9÷×u ´v¬ý¯Ð8®]ˆ'Ж¢üÉ!9OX¨¾ßöXov¬ÓÙ°Ë?ؼ0Þ†gÞŠ}ÇàDãa-Ûç†sŸ1†ƒÝO$¡ªdòìi\IZ+ÓÞÖ+’×89(,7¹µ”I"G݇os9‘]÷59btÔ ç$ý“Lrjl§åòûwÓ> stream xÚíVßo›0~Ï_a¥3Òpý ö©k·¾Lk²¾¤} ÁM™¤@í¿ßÒ”lR;©Ò)¶Ï÷Ý÷ÍQ4G>MÇgJ¡„Š+4¹CŒR"¤B>cD‰Mb4ÅçºúšFsMÆ‹$ÖcýàÜL.ŽÏ$Ûrœº‚)ÏÇŒ†fv@›Ÿ'ƒ‡“"Öî®|AO Y:˜ÞPÃä‚©0@ëziŠ$ð¥{ƃïí~»Ï:l§À(Q€MyŠp?èI¡ÝH;¹ð@Rãã¸Â píiÍÓ¨Šj×ýyII˜þM^¿Ü#‚•L5œêrV$Ë*ɳòÇ :j°¹,$’É6}À/D› ˜›Tv»Ɨ$`¾õýQ—}A÷€z@9®G) ûLuuŸÇÖ¾Ë kÌQYZX¾èhbfß5€·ÃLq·,»n{](c$ô¼nq\Sæ·?õ¬zß Ìcm­ :³d8/òÛa³dXDe¥‹öu¹È«Å¯­Ùõ|XóN1o’Á {mv&£Ë4Z¾Mr^™›«¤LVéû_9=ìð7ÅΡëlTÌW©ÎÁqUö^k®3›ÑÎwdç›(}îãQf/ÜüÀ*¼Ïk—DŸPøFÔaj®zƒx&È—Üá^C¤@â*7OºZY3v¯­‘I>8®¤!.ïóÕ"¶ãÑl¦—•µóLÛò;;pM95òÀÓp.B¿²"µƒª´RÙAS®¾"aÀ›ÒP y…åÄnRC7}¼¸í>[ì€ðýä(nh4‡0 9–x ÇAÇDM—8jpÕgÈÂÁqù'U5Ö5aeþLUÁ¨˜£yy°ÆÆzUDÕ·ºÒNN6çépƒÅ%'”ú¯Û`q.‰üñ¬g•ž\èQÚ6éùKlwX ¸:ÃóÂü×[؉¸·ßâŒPëeú-h܈àâeû­Ä݆[{ñ¿î¼žŠóäJNçI¥º.á,onÖ'QA“ß—cö¬ endstream endobj 2443 0 obj << /Length 1302 /Filter /FlateDecode >> stream xÚ­WIoÛF¾ëW9‘@9áN*@n \£•åäàŘJ,¸(\ìèß÷½yCŠ”iÙ*zÑ gÞúÍÛdiÍÒ>-~]/Þ^z¶¶dËÀ ´uªÙ–Å\/ÐBÛf»ÔÖ‰v§Û¶e|_~{#Rטë/A$ú$Ú•h²¤ã9/,¥x#.³g3]b¾¨7]!JÃuô¶™°¯ .Ûi¦ £ˆU÷ÿˆ¸=6`ìáé…N¨ßˆ®æ­aº® L†éúçX—ª\f[>©ÊÊVl@FV•¬ä…8¥4 Ø2r€ßaKß!þkä!ý)­Yi€e­0l}S¦­sص¸É`S•H呵þ‹ÖšƒNŸù¡ÒÙäÕ àøÎ×mN¤oIc“£ú–>²ò`l¤%zÀžèˆ©”ÂF d'4±¤Ï“oô¦¤1ôž+ë’a;w^œ–Ô“Úc+ /°SÑÍF†ª¦ Ç‘2W‡C1½¥£‹DY”$ K‰ÚÓ ¯E/£ŠJFF"rúnÚª <€àtŒs4]@Ê7©±÷ÆÙj„7=;㮣²-¿Áhu£Z0nßÓriض­cÏftðuŽÄu½ÂĦ-?«2ßÏOäÍÿ‡iÿ! sÇÉ•TO":‰ZH¨É’/Q;’ÁûlŒE®f½³R®3NwqGþKøÞã?ZäAv_W/Dƒƒ¤òˆj¯¤ª6à§:¾‡r3;wÀ\þ/í ? endstream endobj 2453 0 obj << /Length 824 /Filter /FlateDecode >> stream xÚ½VKoÛ0 ¾çWéaP«’_±‡íui!+¶Øí%+ ÅVR~¤–½îç¶”ÄFœ¢Ö]"™")ñ#ù1­A׃OÁàâÊq‡=ÇpP°B”lZSŠÓCA„Ú5/ƒXˆŠ_æ#Ýpµ¼ˆâŒ•\`?‰#îó§Ñ}ðåâÊ¢-O Ýp ›h”Òút@Ô fµÔÒ1|™òª»‘çh,©xǦeÛ¾‚º`L°=¶¥ñœ—U‘‰‘nš¦ÆêÅÒ|^¬”¢|9Òm[ûÉÃR†y6‚xJgq¶–Jßj g…€³FPpGK„´ÉWÊñHnWœÁÅ\]gR1.•@„,á8b%S0µã×ë LSCísf®©M‘÷¢@à—`õ§ÜÎlÜ>lév͡}$/$äàAÓß,Ý$\yËA†\ä‚3ÇÚ¾‚zð åëì 2@ˆv“—rSTÙûÚq]”`ÏVŠ5Z?ˆM†›e>ˆ”%ɾiŸî^Eúü ËÕ¿ –‰U^¤µ«|)_}”ËÞò\ ~±"fKÈÖ6¥8ëäÔG@ïÌì¯}ľœZZam-ëgl¶^hïTU¹éWßšÐôÏût››ûõƒËœà¿Æ­A±GÇݪ˜fQe»8¶&ƒi0xЦà鎥,ËÀ®CQ˜÷Epαé¹è¹QM‘D6¶LØ'È|?Z¸ v;ÒëßX†2÷€ ûY°Õ Ž×ñf`Ï¥P4°Útç zÝv5é³Þ5 Y›ÇÖ¿ê† »¶} 2R«‡ôMdž«Èô3aoÊxð/¸X†ì· (±™ãýüx Þ ¶æ¯çžã ¸­2ß”kÊËÇ> stream xÚ¥WKoã6¾ûW¹X"­Þ=¤û‹m›8½d÷À•舅,%"•Ôÿ¾3Ê‘ ÇqZä 1Éá|óú8ñ­;Ë·>/~[-Þ}Š«ðŠ4L­ÕÚ |ß‹âÔÊ‚ÀK£ÂZUÖ­¡ócõåݧ4½uÃ"Í}û3W+'ìžµrÍû?z^‰R‰®•¨´ð-0O´}Ë 3ø‘‰ËþnØðÖ‰B[Íõö¿pO>œ[nPxiN÷t?ÿæ¥Ú7Ì`ÇY˜Ù—­ãFQ Ž›¤ö!­|7ȼȠõ<︉4DƧ0GŸÀZlß3)yE–Ug¨š÷$n¸ªa*yšÐä硚FžàtÏÕÐÇjV´¢þ-Z©83غ5}Kßq»ï„œÌ„I–¬áÇa%:P?´×¬T]2×è Zª9­•¢®¯DË—´úÝÙþ?òÌ.µ e'Þºï6Ž›A­.•ràËs؉c{ùÝâj(k` [YêyÞ^‘$äβ=—¨ƒ¡Y6yš,xÝ&³ÜêÄ»ùúÕl{›‘½îLþ[SèµhïŽEÚÝ!|ŽwÙ½V VÁû®6­œf:¶) &ë&pî3_aâ[”º8¦¦+¦˜·îÙ†Ïëúj˸ñsöœmyv~(.²éÔ\ùú…³e×so-Åû™Žïe‰Vpg‚SxþÿxÁg> stream xÚµUKsÓ0¾çWhZö –²Ý”¶3 ãMO¡ÅVƒcÙ¡ôß³z8±SÊ Œ²¤Ýõ·»ßçõÑùèjòf:yqI)ÊpFЦ D|‡E !˜†šhæ\I¶YyyŚƽ›¾{q‘žK˜Qœú!ÔÆ„„ÊhâÛo€uÔ³ö:s/Hà04N?ÙzSñfàyl…ˆ)JÁ™FrŠ<’á˜Ä&Öé©ëžï|­y‘ÛúLÖ> û8‹mjÉ‹2oKQcÈŽ=—žY§’Õ͂˷¬e_üØgu¾²á6ð+³ØÓçök|Q€ùÀθäuΟé"B(¢ùC0ß·\>Ìf'{PÍÉÝÝÒ#ÀÇâ<³–¼Àe1ŒqÅÛ.³OûO©µçžg œ‘dXÝ‹ºPý"w~“‹éäû„*‘£â8Ãi’¡|=™Ýù¨€KŽÃ,E÷Út" ])&Uèfòù(4m=ÚBúXG¡#Âm{ü¡YÏwæÅi½^q× ãÜܘ8àj¶ç;ÿñ´‚ SBÿ&-?Q]”8O ÿ-orYnToFeq C%ƒÀã~馡#$$†ÎZHnÞ Þ²²RdU;ÐkìMÃõKä´«ÎV¸^:ùvÍ]âÔn8-ÓxôuÙá‚§H.Q÷z}uØ ™ö¸á[ÉÚó¯> stream xÚåVÉrÛ8½ë+X>U!àv˜ƒí,5©Ä3“ȹ8©DA2§¸(iÇ?…©ÍòaN¹Ð t7^¿nâ¬⼟]Íg¯ß1ê¤8üÈ™¯JXäÄ”â(HùÒ¹C”2÷ûüÃëwQ4½óâ³½oêns]7(x›×ÕßEÝ*ñ±·Àl¤GÏa˜Ã/›uWŠÊ |ÔʉÞîç$cSÇ£ ’ÄT/þÙÞÍtb1‹ý}]Ã[× ‚”\/ŒÐ!Ídj3 q1s—’?¾)ôá¦Ksý=©Ëjksé¦+ ó×Þ ó³ä-7B«¦._`Š<íK´ÏJÌc$Ay¥ÆØ\­øÖH5UFªÑ©$W‚·]c¥Å¯M#¤„w6sc¸S†ëµo$$YÝUêÔV¾‚E?Ò‚ú7Fu£,v⧉îPœ†‘u'ã…ÀJ¡§âà ê£h<ðæt0"õ,_Ý$@¼Éù¢°áÌÛ{ûwŸgÊn;… QdŸ-³;ogã#_ðjk•3ø ùÊÞëºÜt;×2´v)U?QJ#±àR,-¼¿‘ ØÑë¡h(˜­Üª,Ä€…„!|ŽC¡q¨Ì+œ‰¢§Ý ”;UÅSÑÁ1>ÀB¯®Á+9µ°O×BpÙÚdŒ.y5$œyÈŠOQÙÐæ e÷MWª{€1à+¬±õjûËð}ºËM‘·ƒ?plœÙe7Ïæ¸¶ïM7Mø¦G¨vq bÀ-ÚZ©ýÒéU•Â97´?1ïN}Œôw-C}ïO±·¯Ü4^~uÓñ¢+Àn‘ê™?¶%ÄØ¼åufx=4¼>ÉðQTöB!Ûºé3§G^)Z>Ið·óÙϳˆC‡rÉ¢³Ðw²rv÷8KØüàÀVš8Z´tÐ\Ìø/œ/³ŽV9S“'…ŽAXH0žvùŒ¢¥“W£#誆7Ö(Ua‰‰/Œ™ÂbÓ¨a“A€"n¦[Ú„™B‰Àk ´ž&¨êÊ…Ö7© ´úão?ý)5ôL¿…ª”úÀáÔ– xUaô1¶Ê¡­2Ç£ïG8†ÞäÑ7Qf:Ÿ U͉í)Þ™5ùF‡ã%À´êWÓ´XBh,aì¡Ï0I€,9?¸€ßI‘E›1¤9O1R¬S8¶ŒÄ†sF1ŸT¸qêÁóz+ùZœìÏžëÓâãÐU®iD¤º1œ´¦¯{¥·É*¦€z!!è3ÜÜ~üxPÔæ0¶T8R¹Ønm.êfª25ªkènÚŸo.ÀÞ…ÖñƦ[Å3Éï7jïEs¤•ª¼Zñò¥ZÕf«åq÷}K¯n)üüò:ÅÅI¨nx)ÆÜæ[?`!«‹®¬Ì¿.°Y*2l9Jˆ^í£‚ƒö6 0Š‚>L‡@ýÉýÎÙ:ò¼ç;æ¬>§c¶^Xjh'¯wŠæØeÝW¿Ç|ùðÄ}K·uæélº|`à!ÛÇ­·MÐáÖ¨À> ¥ª¬P_á,ß/Fé>ÂúŠÚçVïv endstream endobj 2399 0 obj << /Type /ObjStm /N 100 /First 972 /Length 1553 /Filter /FlateDecode >> stream xÚÍXËn[7Ýû+¸l7‡Ã’ 8 РíE[# žIܸR É@ú÷=C%ÉeK@6/y83žyܹf\äZ\ûO®’‹)°£ZmÇlrI‹£P²ÓЖĩ$¨ËÀa]Nz„Aq¹F›©®pq±WŠa)¸Ê†%r5«A"„F”¡Šb,6'e¶‘:bªN#…¹PA&SØÄì¤êH‚mˆ$É,„Qa‡&Û¡LKÛ¹ÌmT¨ˆ çÏÉLŠfºÙCŠÇ ³#5qxŠjâìLLã‘ÅÄq4šMº98±IªŒGaó€ýH‰ŽÍ‰ÚŽÍ¤Ù°æ½Íc²Ú†Í£v µ´¹„ý¦ÛôÀ’ IÃxÄ"Nk‹÷I&8ŒÔÃGÌ¡ !ŒÄî?œÚª€’«)ÃjŽv\;g-P!PVš<²²Üò4àºg£jHu)$ÛljHð .ß ÐˆQi;0 @Ž g5;À¤ha-ŒÂŽÜvà|©4®â’Ri¤ÉÐQÁ¸mSä$4çˆQ»n`…‚9>JÍÁ¨‘‡—v7 „•ƃ”³ÉÆÕн¹ÍHÎM-ì‘&Â騩(€ÕÆUÄÈhvDPW÷«¡Qw‰è2¦XœQ£*N¬Ô¨ oiÄ*´&§\MLT°äèøøhôÜ]€q‚>u£?ÿúÛÕêq.Çä[&·77oŽ?Þ¦š¥úCÖÐ'ÓÉÂ»Ñ lªð_Ûv‚Ë©úõ”²#.à²ðý²„Ä:ØŽ^Ϧ—gÃÂ]¸Ñëç'nt>|^¸oºÎÿû4`aü~8=ƒÞa²˜[¦H¶ÿht:̧·³Ëa¾ÌmîÕpu=~:ýì.&×ôŠÆ3ìFâêðÉd2…´‹en3{Zn³ÁwúòhtvûvÑž¿ž|<=ή†YÓÞŒ~½=» ö`†]âHQ“¯[Ù“…e$Ÿ¼¸/jîIs䙽˜žO.â—Ówr=¹z5ž}fó_ÍI{1†9zK R‹7Ös)¾ [‚d¾*íjŒqÆŠC7ÁÖÀ_ †¬ì }hÄš¹W6ÂÓ ’Gšsõ%öZ%y é hªäKíµ„{ÊrWˆ®Gåj¼®…èJPbR<Øò°¥-!J;†èêÙiªÑGi¯LhAæC]ëD£²xE!8Z"’ˆö¢È£½²Ñåy ½>a"Ÿº}‚&È[W؇¦ÂžK¾G¥Yeî§Wi¼^„îMê˜7I¥Ô‰ëF݉iŸå†({ë%sñÙšEä¿jgAµ‰wæ÷³áv6^üñöÈxôèŰxù/޽‘ê£î«àoñ—“h‚fÚtD:޽>œ² wëCã­Êu‚Ñçú½fcÖÇ A[='{Ѩg!åÖ³õØ_Ë{I‰7A¢ÝÁª'RÜ!ºVÁ?®n[ÑèùJé ºÕàƒz¼³t¢ñRè%ö’)øøP%åÞÜ‘-ܺ‘p€"¢È5ªV—ѺÂìk*wÖ÷ßÞÞøÙ0¿¾ºßl¾)È.—¾ UcîDK >FîD'ËPJA3r%súÐY=Zµ^4Êž°Þ#kßkë_ öyº¥}Ó´oÊ_>è!ú8A­ŸÃ‹z†­} íoäίçóÛáÙ ¯'ãÅ°× b„ ‡í‹²…}FÅB¼;OœÏÆ“ù»aö|¼o¤Ý¥ÃTÝ%ElC‹ŠïÅÚÛö·Á= £;Ñ,´­£nmÔà?í[çÅ”~ºzYÂfÔærÿ¨]~\X~¹ÝcÔ2+nû]|±ÏâµàÝš]ʱ!]a»¿ý’C¡¿27ø’—T+…z3Èlüéƒ?½Ï?øË›ñ|³¨çºCÄ®‚±ÛТÁ,’Òk7ú5Ÿ«v¢9Ã’ƒ†Ý´õcá6t4»¿/ê+Ó{ ñJ›!^êý_§jؘ«à;‰ù?p@¦Ä endstream endobj 2504 0 obj << /Length 844 /Filter /FlateDecode >> stream xÚ­V]oÚ0}çWX{J¤âÚù0áa¬k»ªê:úÔU“ILš5!Ì1mÙ¯ŸH‚ MH±‰}Ï9×¾1@àkï˸wzIÂ!qOFºŒ!q‡`'ëŠò,ŸÙN`-¯ËF°˜S‘ÈwÏã›ÓKמú.ßÂØW£=T­u1îýéaÙE¯—!:2.ÌzOÏDrðÈ¡aÞË©ð$“çÊ~ ~ô¾¯ñÚm©Å êZ0‚Dr#~1jh‘:Ö(ÒŽaCŒãzȺ²ûØÒvßõ– ·}lÅ\=70f‘ãcDj1ž!1ÙúZÌ9+BžÌ·TlÔ4RƒÐÇô‰³•W)Ëõ¬k[òÿ`+Áu&}ãHA a 3ãú>Á^>õÜüD>RÈe+gc8ô+ñùä7 ÅI9ŒZC<‰›DL Î »ï#d}ÖÍÝãí­¦iÊ`J—Œ7>éˆ úÉ8cï³h–6B_´Fs\¹ÔäfópßÌJô+[9ü2“/LÐÃ8¤4›DÎ-’8kNE›•…颇¡ ºhb˜¤yø ‹ä/k@¾5£0ŒÃ—Õ¡¯EatÛTÒomgG›IšÏŒ1˜õwð[E™èIQf[ߟäEÓñÃã…Ñ1aùºo8xòPâκP•Ú›Ù®c‰¢³>ìª ¸~Ò[uºuéxY¶F«2(0<«îÃÖ"òžr]kTtéwC«Ê˜O¤a¾eâQU.ˆ`S‡º±ý’vëŠg”H' YMhj—/6奎_±¹žæœÈxÐ*ÝŽ(Ö×ñ,—,ޝ×ÓN|Ç9?0•ÝΰZáŽfL•Ou+ôM˜Ô¾s$‡crÐíAUâ÷ïåãí-o„ý»íºÒåÉ,ÖÝû³‘–­n+õ"™ÍBw3*xòqRù£>™òFùT%«nàýYa·¶`&¡ØYT×U§ ¢r÷-õÓœë[_3ÿ)_ú6ìvUñ9OÞìÒ"ʤŠCU××Nϵk’’¨1S.·¢Ø>©¼{÷o¤‡$ŠÙÊ€Xží"Y¥ÙÄÆÛÁ¦öÿ Ç endstream endobj 2516 0 obj << /Length 1291 /Filter /FlateDecode >> stream xÚíWISãF¾ó+TLª"UaZ’µ¸2BpB ( œáàphKm¹ƒ¶iI,ùõy½È–ŒlÌ$Ç [ÝoûÞÚ¶´D³´_~ž}žºH Íг=m¶Ôe™Žëi>B¦ç„Ú,Öæ:Bžñ0ûýóÔó:¤ó‘c…ÞXÿ ³¬È ;Ð_/ÄR“„ášÂ0YJW»‚ «0ÐF¶ŸŽÔUÑ$Ã=Æ- 磱mûú=ë•1rG/–|uõªXÖòä1#8¯ä>J›ª&¬Ú–Ù5ÂÒFÈ3-Ç—6ä‚g¿®F\7¼0F🰾9‘ôV·8 ¹$È A“ô›YìMnÂÝOíÿÐG³}? [Ûi O„-Šê®àŠv¿"õJ&X¸N¦ÜÈË©n?‹„‘ª’DìpB*Ó¹N¨Ïn9åçÝt •ø>oÛÖ§BH?½¼Û¢«š²¢oz¦iа/’¼`$–ãÕu»“Ñ3(¿¡§ã´!»Æ*Ú«(0]?èY³S‡šô×0>>$^­¨jYË&_Ïh\ä[CÁqª­”pÓ¡–Æ@¶ÚÞr¾Õ^Ëjwv¡-bW/e«x4Æà¨vVµ=Tõ(yȇ" ¼w¯œrG8Wàè§iU z‡#°Ì@RÛÛÁ—N7$ªF'YA¯W¸fô¥'¨þ´Æü¡C2äügeº5šw­Âº„yîÚ:ßtÕÛ>}2FcËâ!7й'\°Ès z†òŽ¢»aê/‚Qóu›®Xü%)ÉõŽ4ðLü^“Éec¾ãhËEU>naHšÏo¯Oú"«2¥5—Ñ%9‘wK¹|‘ üp-¥ˆ÷hé ¿.<’àÓ o˜ƒÌSšÇ_1£x‘’)ÁuE±KÆN‡E8Ý«|ãm“ßœpÙÈ QЋãé’B±-»!U^|&r¥¹|å«Ï¿Šg® /F¾Ãq &ea†3R¯‰ª’DtI#ùÅk”¯ª&;Q¹.¨\×Ö/Z.…r^¿’ì‹\àèDÒg"ܽK¥¯•mKÑŒ&&ôåFõ²Ïq ©y",äÕã÷­ÌÉs—Ofœ(]ßéTÛ\Üü¨Šº[‡ë¾0ĵƒCŦ¦Ý<ŸòY¶ùHY<÷«"¦ËWñ,弉×pÍ;¾¥ßó¾è…z„sy€yƒGzuÄ’&#¹ø9相óKÑ›ýuÜI­¯b‚¹Qã“>KBŸ”ö ¨<‹áŒU­Qß}ƒåù.}O.©{’Þ­ó&˦ÄÚ;mžÝÍàQYÁk2k[ÿýyX?ÜðvÖïò7É=)З¨<Ц@çr(†Fñùìèž…g endstream endobj 2530 0 obj << /Length 1019 /Filter /FlateDecode >> stream xÚVmÚ8þίˆ¶.‘6nçõtÕiïZPµí²ŸhU™` ×¼P'láßߌmXú{BÂŽç}æ™±=kiyÖûÁ_“ÁÛQ[Éâ ¶& Ë÷@_\6#d†ºÎM† 9Ô*dUáü©ª’©me)Ñ¥F€I-±´öÛÏÏœ›J‰’íšÍ3ü_ìÙ{Ž–Sjß”ms¦g_`ÿ¤ƒ{éW£W=üm¶)ÊùK¥BÀZuwÚïÍŒ8ë6‚ßõ ‰‹InYµ.yûòYþô¤A]~™¡ÇïóÁñ{ߣç Nû«õ¬Ê¿µ+˫Ëæ„W]m¨íW­:7¨ ™ýËóîhÀ?©<§±ïÎQ°|÷4i¯ÕöÙ ¬YF¼ËW·:Œ½¦ŠƒZÑ#SÍAÏ<4‘Òÿl\s‘óº#U¡ºæ…¯MŒÞÌÀkˆ§µ‡ÕE(éÞ endstream endobj 2540 0 obj << /Length 1299 /Filter /FlateDecode >> stream xÚ•WIwÛ6¾ëWð¹Q¯&ÃÜ>´uÒ$/Ï],ŸÜ ’XS¤B€v’_ß (‘*%Å'`0ÃÁ,ßÌ€žµ¶<ë÷ɯóÉ›wÌ·27‹ƒØš¯,ßóÜÅVâûnfÖ<·mßOgŸçß¼‹ãžh¥.K(ÒBïçÜŠí,Híö+JO±¥ endstream endobj 2548 0 obj << /Length 1057 /Filter /FlateDecode >> stream xÚµVßoÛ6~÷_!¤/1¤(ÉÒ°=tKú E‹6Î^Òb %ÚÖ Kž(7éþúy”,ÅJân؃M‘¼;ï¾ûŽÔY;Ôy=ûu1»xÇNJÒ8ˆÅÊa”ÆÎœ1óÔYäέûfññíV켯‹w¯B6ÐàiLÊÁž‘e,ÕB3jép íwâ~0‡EŽJ¿{iìŠr/GªÃYâø,%I òb#=Ÿsî^Ë}#ZýºõÒó£ÈýSf-nÞí·ÚN~U—eí ìUk\ÊåV/ì˶ؕò^æ¸\T«ºÙж¨+´¡Úº9lâØÛÝÊVXs¢?= qà„Åx“P²÷o/ê ïëG”ºÄÖW¯pÔÚ^0w[±_yàÚ¦Xo¤²1Rźå3î±9‰¢ùÀ?%³ºÊÿ?Ñ>z¸)<æþ+“QD›5$éY{ åÅʹld•Ù@ÀB¶-úOJ›utI¡€’ÃEm&Í\Tù`ã±>ú¬Ji·Â aøìm~{¨áu©Üç0‰ç6úAÄܼÞ/KÙª‹!ü[…›ä1Gõ¥ÎÞwü6Óûm½³}xj\èàÎ:#©)]£è-xPO²F¯<ÈíÃuY/Ñ1ŽL˜¦îkÏgn È2â&q` æJoX“0Ô;† Sø…FTc@€Î-^0zë ªTRcl|Ó1“ Å~´ÔN)²ã4k'†þÞmÉèÓÈÑ·—Ê‚³±(Ï€ÅNA²‘æG)Ðáç”°ÄÒîµÔZ w_–ªžäm ÿ”$N£§øùÙÜ"™bs>ÕkDï Cµ«{±ȪG9j(‰“€±8ì]HÀû/<䯺Åf_7I¢_Ûë%ö-ó³#ø)·û{Üï2oÈ^ãøÁ1WU®…‡§õ`¹ZÌþš1>Ö÷f…„ÆN¶Ý~¥N{`›ð4qîŒäÖ ¡Èæ¡îÉ¥s=ûôh Lÿ§îÌ8I$Ïä$NGxŒyÐEèEŽæn]ëZ&.0F¤ëª³4}½ $ŒÿÈõðáÄ3&HR„#—ReM±;¢Ïß—0ü¦«XDà°‘^w#37­N¯¨ÍnhÆÁHÀìÐ6Œ)æfM­T·gÈE]ô¬\IK$ÐxP&“e©ˆçÇñ—Ý3Fõ plß“l‡ Ýo…Ú‹²ø{Lq]†dO¾…ú7r ~IÜ(±–§×ä)´ kÅÜ35ïÇÑ]±àΧÂ,)¾cý‚ÃØ<›”Åβ*:F(í„j%Õ>ƒçÖÔc•3]À“¦±G‘ÿ|‚mvÙ·de2² ?:é”Ñ~¬òáæýûI•F{ÙŒdŸo®Œ¨?‘™£ö×@ÿB1n endstream endobj 2559 0 obj << /Length 1469 /Filter /FlateDecode >> stream xÚ¥WYoÛF~ׯ ‡’@HóX*Ú·±ã…ÛÆj^’ X‹+ŠÍ’T¹KýõÙYʤ";6 ÚkvÎof‡¡S9¡óvñÓjqrÎ"g,³8sV' à a™“GQ%KgU:Ý(½Ï«_NγlBúÑO¢8NÜ‹çïÚM\ý¼òŠÄ=õ"Wy>üq/.Ü{¼¹­@Æ&,BÇsX%$ç´¯†F´^»ZÍîŽÀ§˜j]8~T9³ w׋µ>”Í”gyœ»Wbè¹ö|–¤pÉóÓÌÅ›ççiäž*ú(:ÖÛ‘PoN2wËÕÖnñÊ2‘uÕÑé§0 /V¿ÁÑYÉ5§\$ >à20Ôuò,X1XË4#kxYŠè#æòÖLR·íú†K¸Wÿ+Ê×ÄÕ2· º~ºÞIqW·í“X¸mŢܖvú¡%šÛZoiºcß •o” ­^)éEBîÐN428ô÷4BþÞ°,Hb&®¿:Ji Qº@?ƒ,ãå$aæ" –‰ÛòF<)=œË]K`Poê5×u×>­¢d…—) 2ÎŒ—ÌÝt=m6Bs -®Ö¸KMKKr§90B?… ³b —^(Qlú®¡¸þð¿Äÿr< 2 ¨Jv×\ÏwÞG JDÄ„œÇ®’¦¹&—@˜º–jcîŠu½¹'o‘Á&%-­FPI¡OÊn¸Æ±PÒ7òy9îÚµR=£<\ÆÕ6]À¸$Ýnƒ#êŠLÌ–îhk®°ŠÄ6n"‹çµ¢s¢‹Ý5rÝv†m§¦aÚãÎ×hâ=Í{HpD«áúq|(Þì$8í5¥‡‘ #G^7(º«KÚÚš4º1aÀÄIËÞÜÒJÜ­Å1Â¥´)'y_ ËCpÝðzyl`Ìßo„#Â:piÒO‘X6£óÖ*bÙ">cl8«ÕÔÌ”½ôp”x('j,4´ ©^Raz®4àåÛ{`b)¨ÑËxA ¢M[‹aV‰®ù‹˜Z*!Ñ<Ɖ!Òµ„Œð‹pv‰š‡ù(n¤Eä0:ŒÜk9ô=Æ;з´§:ã%ع©Å-á¶ùGuDѱä´âÔàô÷^àUZ”ƒ &.°Iaq‡››é»“ÍœkÐÚ<¤¹[·æýŽL\‹Ò<ã yMÄz[ÛwWwtíÜ‹"xç½:³ì6´o²d MÞ ÚíºFAôª®\{kè,¢°R·ÞCŽk‚†Ú"¬™>h^ôÙSálÊumejÐ$¥w=…¬Öâ¤m)úý‹pÐkùKF!ò±í¸>xK°Oâh·uØÚ.ËÚ÷^è¡oÕX[ŒAU…&ÅV9dœ=´V`“1(ÀhÇH•@Ó±§”ª{¤„_P8=.iúþ›Ý¡y]›áî©Îô+]Îî°¨Š§ÛÒYq(€YÆö äà8ëõW¯Àaè^¢pÝ×÷{…¡ykh~ðiµGLѹé0ÜÊ ªÍÇic+¨6Sé¬-‘xªÙxeq¶Zü³ˆŒ££ý‡BÌÀ°œ9ëfññsè”p̃dY8·†´qdEΘKçjñÇ£^£¯‘YäÀœ 0'aŽé?ùÞ8=Ò@fËù7JÂB÷-V€$-ïyùŒ¬94¸‹U Ï ËR¨Si:Aä(úì}{tÜ€-–/ñYÊŽ|wEE„£¥o„Z÷õî«îìyùIFCöÝx)|ô£Áøv 4Ô.ꉑtŠ}(É{Fv»ãàÉÛׂÔ|f©'‹€M–?¯Äó³îQwŒ¿Jh„uÛ•47½NLKLZåÉüCN¿³úÎÌŸ™~xí蕃wÂâù!G_O´ ¥!bŠæ?ÒpŽÏ–=‚`Ÿ¦‡nÐþøþþn endstream endobj 2571 0 obj << /Length 1177 /Filter /FlateDecode >> stream xÚ½VmoÛ6þî_!¤&–*ê]ņ![“.CQt›}p‘hGƒÞ&Rm²_ß;’²%×v¼  XGòÞy÷ð\cc¸Æ›ÙO‹ÙËë(2R'¼ÈX¬ ⺎DFLˆù©±È¥ysm%¾É¨è;ö¾l„µZüúò: #9?œÄõA«” A¦™« w0â¶vÛ‹aÓWB—ݦ¯Xmùž)øD|ÿ ê’±Ó‰a“Ä ã@)jîÿd™Øw`ìîÒb/6/kËö},;ŒÌCRc;.˜‰¢­TL<4ùV$£e{‰™+s¢Qßœ ÖUEÍÔò³†&í z_êµÊ9?Ç)¢¼âDø9±[èô(@ÓÑÔ´Ö#OŃ>—úRõFÇAÕ[61;ZYÄdçgÒqœÓG:¬ËÜÚ±–rÎö’Ú€—"G‰çºf'UˆuãENàé¼e”úeÉ›#?'1:\*òóåøËÝõM½nN6ÄÖ-sõH«¶d§Û`’Ü”EÁÖ~ ö¥ëÅ ¨n×5ßAçJ¢ëëW¨X^ƒë¤¡îsÍ÷†i>yßH@Š(0IåEÝR>©Õºk*EÑZ}o^\rNõù®#÷m¶÷Uö¯hY*Îïí­|Gk¾nºê“º;6X‘‰¢d’å)óryŠ.V«¹Òª{VÒ?¨’ˆýQê–òä;],ã¤BgeâÄntsI^…ÚðjpÙ#NJö.æªÎÑíñý Qή³¿fDVÙ¢sà»Øð0Ú)ës€€øhnúжóíl¨‡iÁk6׃ãvS™Îèù‰æÙÅx ºÆICè+Åt|mû²T{lS¹JÞh€ ä óã9Àxg¥01—=û7 ÿA×Õ|2Uò"4œë&”Õ|ÚÃÍŽð5TK á· 1|áõû 6ÝpÊ endstream endobj 2585 0 obj << /Length 1072 /Filter /FlateDecode >> stream xÚVKÛ6¾ûW{‰¬Qo!èaÛÄEƒEÒf½{qƒ‚–i™^Õñóë;CÊ^ÉÖzÕB’£o9œ¡¥%š¥ý:ûy1{;w©‘È·}m±Ñ¨eÇõµ€Râ;‘¶XkKÚ¶ñuññíÜ÷{PÇ ‰z`H‚~ËXÂß‹ì÷´h=³:'³f¦–FOöý Žïjq6[~µ´5üü¨Á¯(Ô¾Kh¦¹Bà:0Oµ‡Ù'{ç£"öIP‹ø@Ë÷Ñ}%> õ”—¦ç¸–þ`˜T/ ÏÖY#.RÃt¼@ÿ%më†W¸u4VKkã,a‹l×þ/,wäH|›ŠÍ{^Ç•(Qä2Ϥ†Çj&Åã •ú“¨[–Šh8Ž+NµZHÎqõ¢ÙrƒêÝ*f OŠJÄ,U°¤*ÚRäI§%r525Ô%îý'&J,AÌv¨7|ߨ´Ð51VÛ#nä¨Xk8¸Q’#¤Ã+¤ûð§åYhSÂÀQyžÂ«¿yÜÜÊßÖðצئgYúOjøôx? \m¾f•àõ4¼ÜL²:LC×e*š×ѾBÇE:1ŠzÛn6)'ó»û‡ã*2‰zP‹x£À¬HyܦS7à51N_FOàé÷à,-·l€·gçváFZ£Ð©&WEµæŒw­¿ù¾ ¿¹¦t±'/²ÌÙ±´¢o’Šq36©(ÿÚ.ÀkŽ(DtJ¼«’6ã¹áØz×qþgTÕí¬šÅÒt;Ðï: |$ÔªD;N¿\øXÊ’ÿÀÛŠ½bYö•ì‹§…Ñ7Š;ë‹ÒçÒ{Õ´oCПXÖõ´b£Æ¹âÏØpž” )ÔX^>FýÛýj¶Ú;»¾C·@o¹KmÊkžàYbd²…K)l Hz…¥òJ­¶05E4ÞÁԣТ–: SCŒî¶¬2e*>‰BûìÅê]…x ¿EmWvõ(‚’’áM@ÈÑÞI+êÑ•ZžzI–©á¤驨b˜>¼´ðÈj¨·E›®G‹ß‘‘º:¾K`âIƒµ’ÉãÑcøŒá? ®•”a1ÃÉÎð|‹b÷£ó(Mô|xGó!RŸFêƒã)ŽT›ó3½’oæéLzYz\¿UÁ)õ]à'Ó Çü(Àô+—U'ÉxÃÖ¬aj¨ÍòZ-dbÁ(]«)¾–d³’ÕJ© YÍqµÂ]8<ƒ7àñ¥4ã{–•)¿=>6EBĺ» hÿ]w=Y]«÷âø ÎÔN¿^â.H„­Ð¡{Œ Šæ$…‡gŠ6Çj'¼Þÿ•È8 endstream endobj 2594 0 obj << /Length 1787 /Filter /FlateDecode >> stream xÚ¥XYÛ6~ß_aä%4+ºm#èÃf“-Ò#]lܴŦhh™¶ÙÈ¢!Ê{ô×w†CÊ’W¾Z,°¢x g¾™ùfd¿·èù½ï/ÞN.^_§ioìÓ0íMæ½À÷½(N{à ðÒhÜ›ÌzwìÊ/Ä;¹ºÉUÕÿsòÃëë8hœ‰Æ©7ò#hva„›.|{‰{©QãÔ ŽÌ±A8„Ɉëu.+oúÔ’°sß ‡ì²"Øœg•*i, zªi¤ìo‘U4±ŸñŠÓ[¥èi.³SKAƒ5ÚhFÓ~8bOýQÄ^ÁÄhÌÖ\kZz)g¢ÀåêåŽÄþ ²0#e준9½aêGaoÐŽ“„ìÍDžÃÆ(bµHPÉÙ‹]-jè¥áЊR¹> [‚°}F‹aSszÂqUj05Ž&x†J,KnX–B¯ûXUÅLÓ,šO^à3dh¿1g¸5‡Žç€¡×¤€Õd)5m_ÁvŽ›÷ãÄsÇ1 ýpzhY,r31Rœ—¢¤eeŸßÍJ”2£½÷ý$Ñw´m¥sÆ»°no[ó\T•ÓÀ`x·ÔµBD&¿øQ,fð–DXÁŸ7ê•è*Þ>sóÝ L!Kñ Jnõd1W]Ìá18aÎ7y^ Ó1[,0ºCR!…¦}ä|{ø7!vâÞa ,²|3ÃMÃ!â‚C-¼øJæ—´Ž!†,pšfç¥ZÑÈ$ŸÝ`׀ߌƒ5 öIˆ³Ð‘ï¤ÎJQ‰ë´èí˜87a™9ò9 snFêåf>Ï…w<3ÌÌ[^ÌÔ*Â[J–NˆŸ¡ rŽÇì XA/œÖ·q /¤üBÜÄaåÞÑma@›ö¹.fá=PÑŒf*eù¾ik'횸ù8£nPi%‰Q“˜NwÔ~AîÔ48 ­‘sÀFU%0Î,µ–JÎô!7úmuW*Ù&G¼…¶EH)ÈNÒ3¶G iæÕ° jl«ê1ÒZ'íÇÑètŽ{­<ŒŒ>!®kdF~;¡2X`ÞVœ"•`Ω0š’ ùŸ)M¨JÙ‹O¢ ^Ð^ {ª·ðÏ®·àê-Þz…W¼í+í«2Òºf£) ecY²<`Èô|0`ñ|½ä‡Ñ M[cöÙXÚ–§N‡½¢w½T›¼VØ0oëÅTà˜5kÄ̧=@:4Îp±:Þl ëæ$Üô»µ\rl;ަ…Ö¾gÕÔ4L6ã¿Öp|m&V|nbà cÓ ›ûD싟ø6vH1f¬œƒúT•3è(aŽ×“+J¬0 ©ÓÚMi±XYVä•TÎF¶¹2×¼Áž³Ëå î(wFÖÇËŽ¯ZB_˜ë6ë5ôVšÞ(Ì5vfî45Wa”’zC«Þ`oÎNy¬»>;;-ªÇ)5DïC×JIa¬‰ý”:h?±àâÈKÚc1*hkÓp8ŽúªèB÷ïAï0=7lÙ"‹³mdqf®Ê_Ûº8øß@Ü»7ÉpüÛ͆æ¡úxYôFÓ”AÛz¿Ñuže]ÚGÊȰ*I­Ä lîÏxùÍ›òìÛ¢T ÄÔ–‡€c@Ç¡5j9Q/òÙ9­Š?Í]w{ö7^©Ö'ôOW¸®4Ó’áNãÁKayìAVKÛ)A°º¶ :—":ƒŸ¨!;ΠÍOÐf h4t­æÈè²Ã¢QÍ¢Ü}A›ã§Rªu¼ºeÎ`£Ò¿Pÿ»]K0\º‡y)Mc“¶ù¦1‡Gýy c‰¿¥ÐÐØOø>á•hœ['äŠÐgrÞÍðm7¹ýõ}W°WϳßÚ^ÕIôÜ ›K¦µÂ:@!mpØ)Âuœê©çž^:! Iø[ob1/õŽ7sµmV\婎9µ+®ž?ŠS~ùQ›+æ€Ñ®î‰Ö¼y#¡GlCÊ µšÊBœbWŠ$Ü 3­dó0f–­sš´ÑÒ(…WÙòA•ߺk ì Hfã·3ïCw¼%~À®/ú´/àŒøèÞ”)È÷V \ºp$àt1Á„º$Fý~ƒXôæòQÌN¨ë75sg¼¬„–ÜFv¦\I•¯\rl£øÑ¥¯[U+¬ÄîåŒ`™çrý×ãÓ ÁróE»ßMicù÷æþ⮽rŸUq³w]´zÝ‚€¡—=ëæ¸‰x0ê "ß‹RëÈÏýqÊžUÿ=&àá^kõž8£){ŒNß‘¡¸Ž¬ì”Fù|(Úá×J…7v8­|ZÔ7iÙ(Ž;¢¸%Fw¢ó~rñ/Òô9 endstream endobj 2499 0 obj << /Type /ObjStm /N 100 /First 973 /Length 1836 /Filter /FlateDecode >> stream xÚÍYÑn[7 }÷Wè±}˜®(J”TdÒY ¬X‘dö¬nrÛesìàÆÆÚ¿ß¡œ¤nm§7®=ì!uuDREÉ>6ÎøP‚ bØS¼6£!Î*ˆ¡THÆsEâs¹ptl‚vEçLŒyŒ@#9èÉ!k˜bŸMá¢Ä”UHÀ1©”!©êè¼!ªº ŽT»‘ð«vbC±Ž Œ•\q›|R©@J É;øNjÌ$ Ú ¯ ©>Ç:ÖLYÇbús‚ ×B¬ßสÍœN ßr†TÔ0«¦’Ô)|bG:ߨ‰eLÃT b„ Æ(ït+_G`MYŠšH†ƒè·}:{t@ˆºš-q:ŸÅu>ŠE‹Ø8NAgœç½0V抳 䪖)ª{€*ê^$0q•<¤Û˜qPÛø¤Õãˆp >© T—ž…8ï&¤:ÛˆÞ ÌÂXÑHŠ‚(qºúQRRcâ ¦¨c±\‘ê¼±_Ø8pP!ÖÑDvu€@ŠÕX‚¤Ñ“†_ÝoÉŠ¤!™’šM01x³¨tÄB„iÀ‹X¢®y6✆"k\'H¥~Co%FLÒ|>æ!ЦpTbR¢€ ât¿3ôéV)Bæ;… ì”JPœ²*­$³*Î )«b0GJí-Î$"‹­I^t@2„¥ ööÍ s Š:púÈ4¿þö;VÞYV0[†ûãÙhôfðôéýè Ù –w'hWlçú¡ÝV°ýÐXxâ{¢)&›ãº&ã©ÙÛ3͈WÅuØNù3o " (tÓ@J#º…bš ´…ÍënrvÜNÍ©i^¿80ÍIûajîl|¼jÑ1|ßšç°ÛŽ§×šþ‚Ž4GíõdÖµ×ó”X¿½jÏ/†Ï&Ì©NHRño`hØa´Ë¸?O ítž—ÕŸš—UøÂ~EšãÙÛimÿx1þ{Ð<›tçmW­¸7Íaó²y~Jµ¡ŽaJž[yÄ6#}ð6j¢`%pûu!MóÃädb°ŽÞíþõõðc|¬ë³?\´õ´àd R;«G”E¦ZëÇùÅe;¾¾˜Œ‡£?\p]{>;›¢¹è™ÆŽpw±SJ äƒ8â–í3ðm IŠ6à”Ø Z‰í¨'IÅr_Õ>'ü§uüøœ‹dYK‰Ï¨³1?ÿ–øAas~¿áñ=üXˆ( } Df›pĤ×Ó,KX˜@boîb»†v³¿·W-4û5ìšãæç£—ú÷èÏéôêúIÓœuÃ±í¾»ê&Á€táÙßXïÿv—“ñÇÇÛ"QÒÀ@Ya“ž¦ˆª¢õK"ëRYË¡7ž<9œ ¯†ÓîâÃPÆõgÐ"øîÐ@Ü¢è‹f0?KO4FÞè pŸÃgÆ"'>;@P· ¦¸k¡º 7–7f»e†ø¼9C<ß0ć[!Þ r+¤m.ØjiÅ.Ø¢-r" VÔÎ6¥õgËhøq2›nïl¹¡…qºE„Ý÷Zó [ÔpÿÑÙyé?÷Ó·¬÷‘¯øñþýÕh2µG³‘};»oñÐ%XŽá“Gꡦ_ñèÅÅåk¸´EG"ÙøÎv(Fù«~´Ãé¬k¿ô¥òÞ—d«Eð§S–, ïíQåàÒÜ’X"ê‹Æ,Á°žh\m ßÍb…䋉Å츋Ò"¬HœüÀŸüPⲪ$$<Ù šà ’j?4.î6gî‰fÔŽ"ßzNî`ƒóòÙüd q›§ÞÍqÀ, ÞKú†R2ª°¸6™žütˆ|v9¼ZÊe!= ÁwARpgꉎÞ×;a?tH¸1澺9ëe'`‡ \ú¢=cW$mÉvûlËrhÇ´yhÇÛ/ÊbœS±úÈH«©OÃYϵ{cüE{9û°ÅÊ!Çj™D,'}œNÖqÒçcìïúwƒãç'õ c‰k1?€k‹à¯sm:DøKÒM„ÿ¾'º>»Ié‰ö{—ÂnÐøï¨ïšhÏœwõ¤·¥ëY¢e¦JéÉÔì–˜*yIï\—÷ ´‹ ÷<þrðrün²ÄŠäÀŠäŠ•hç×¼¬B#A{¢ëÿ]€9³]Iå•`Îk. «Ð¾¨ê¾SÔt,E¶y¸­¯Ù7&PŽËʼ9²ßêÃøíƒ4Ê ©ÏÒõ%½³—õOÇí¬._Fsx}ÁŸîÉÆ•Ѳ43r‚G~¡žhÏÁæ$ÿ»DYñëLñ›Ç^¹ýu¦l÷×™ ¸®E#¨j|$T7ŒÅÏØ2Ü%‚_†o»öŸ¶³Wѽø"›Cçe–P´&[WüO÷¼]Ÿuí´}=µÓi»DÒã×™v•ªó endstream endobj 2600 0 obj << /Length 827 /Filter /FlateDecode >> stream xÚVßoÓ0~ï_a•—D"ÆNœ_H< AhBÀº½Œ=¸©Óš9qpÒQ@üïØq(u—n…J•íÜç»ûîÎ>#°¼™¼œOžÍ9Ì“0ó`„`Db “(ó%¸öpHü›ù»g³$Ùƒ^Qˆbä½­èŠÍü,òí6Š}²3𠬼žO¾N°ž"€w’4†$ÍAQM®oXjá; Ey¾õÐ íCJ"=àbòq§ïp´,²}ÁDóJâ ’ZÖÏ#>jn¹Ë-"È»ðì5~z´ãÔ,„DqêÍü4ñ˜l”c½Ð‚Ì3ŠÛ^ó8k’è1ûÖ–ÉQ‚SæCŽ^±¶P¼é¸¬b ºyÎ@€upPl·_ñvCÿahD:“ÛF±¶5Êú5ïGâQ»la……™×±mg«Äq60–ÂæÚ|oé²ÕiuqÄåì—óùY£ÑÛo‰4Ã<°rñ…ÝÓ^Œ\Qi5´®0„òÎb„¼vxy~>ªe!7õ’*ÎÚÓð….’—v4,x;ÿtùÚ̶f!X½ÔŸ±ùÛO?{å˜èø’ fÿTðÕº[)ö}úÔn˜>)K¤×™/Ó^§Q`À0vµý²h&Zæ asŒ6\rÅŠ·ø1[6bšS†]IÛè^DŒGÃ[ñ›N–¥›Ž³q4Ýþºmïàâû#‰*¨’‚qj]hx Ghâãè{¥tTy]BõU‚F¡T4kêBÔ½Z2e|ÊO¿­yǦ£16Ý£yÔq}²ná‚·+eΙ³É•q×Ìiq ³³ó‹°°[ë{`-Åò¤+”lS?.˜85GmA…{ž†kjwš¨»y-kÖŸ©QòŽ)A›#A·¥zZÈjÁkvZ6 ©“K¾e÷Óg¯‚ýk{ˆÛŸ{ⱞr¦V›ŠÕ~zC÷ýÏžbûÄÁËÀiœ×IÃÔ»`E;ÛåBSI¼±û¶L@´Ïqæö‡EÆØUÿ¸*:sÄzƒ¥w*úU'mnt/„~@ñö^e¨ õŸ®] ½¾T²z>4ý„ù wZz endstream endobj 2607 0 obj << /Length 2109 /Filter /FlateDecode >> stream xÚ¥]s›Fð=¿Bã<M- Hžœ´î´3M3‰š>$öH¢æCáPl÷×w?îØÙí‹nÙ»ÛÝÛÝÛ“3ÛΜÙÏ^¯ž½¸ ÃYlÇ¡ÎV›™ë8¶ðÃÙÒuíPijU:ûdýTÊmv5„•ÉöÐdkÕíüÕÏ/®|··ýÓBxNàZ®àì3G32#,_¸ ; f o (ÁÌ>{®3Øû€Eà8Öe¥¹GCîBX—JÉ»qÙ„om2N1_¸V“ÍiÇg'p2{kϾï[’‘Û¬ÒÓ•,5´˜³_>ø—îlsïKÚ?3[¸ÂŽÿI!¢¥•Ô fq(+þdÚ4uÉP‰'i¥ÊV2æxŽØ ¬2oë9¨ÖJæð³««´Ée+Ck‘•5IVÍhÁ¾Lb²P ½kÇAÀÒŸÝßb#ý“:XRÿI¡ŠÐZ!«µ¢µÆüg¾ÏË÷YzHF]Ôëù"¬¿³¤5¼š&S|PPW^mz¤q—± IVSŠÊJTÏšµ•2ô¯sà%‹ZM± ýލãÊwoxty•±2Õs@a½{óç¸ÿEÝvè¢x‹·©¿~[÷¡Þò¶sùzÃã:ѯx´Œ@¥à¸/8LIáhþúz¯ëC•Ê&‡}S o üÐ\T‡ºLÚºÁodB¼Ê¶¥qà6¯+Ʋêli¼—¿ò’@²-.€c¼‚W"”ôBÉC‚ìv²á‹² í8ºç2i‘ˆ#|É‚_ànŽ-qLŽœòC¯Û÷ŽK»«Öä$ÝîØ*rÕ‚û„¾C&S¼@íêC‘’€ÎP¶îD"2DP1ŽÌ ¨+”áWÿãЊ±²JgÉ™õ„æH$z<ÃÃ?ò4"êZxØŠKcÅI¹']gàõMz^Qä„¿èo+”Ö±Õâñoð§f¨¥'5nS7¥Æ˜}ÛF¦¹vIÆÔ³E¼è.ÜyªwIMXµ … „û>ß7y»;2›ò½ÏŽð¬Eè²Ì|ÙO—Æ¢æÓG©Ô""mÄ/\R“ ô¶îòíÀþËBi¤L’lߪ1SRz]Z¯›ìf®¯$~aT‰Ää—ñ—ÁöBøMo£BÕ‚Ôoë6{É·¸ÝåŠWÜä­ Zç:Ö.-NžB„VÎ.XÉL=ô; á„,ŒÆ=äÝ}ƒ~Ý™8EÑD`ý¾Ë*^¼.2R"¬ÍÕx«Vïûa,uYL¥•פÅŸ’d¼»ÙeTÕ†s$BîBŒŠ…~yÿ^øÓÁ3T´ñåé¾Â’±š‘ÂU‘£ãhŒ à†ØJë(fQe[ˆllô?ßñŒaõAe ¤ÙFŠ–·vÚ‡ NêFP½Þó;Ò9$,ÁÆ­U §Y“!cbv»‡û£ttšÒÖ°í;^Oeê©:ó}~àt‡D˜”†Àž <š*sÆ¥E.c­@œ""Y£À mu×Q—!B u4é)ç$§žªñÝ5s•sdsŽþã,á@&‹¤<Çr0áP½둀»| @Q=‚ZêùŒVÿÐY.!9þ@1q§ÑÅ_¾­ ®#¹]Ãék¨ò²Gd³w”¿r“¨–Ä}sr-««ËQXÔ¡R¹Ëku å±NlM§êTɧÛÇ2¯ìäÐÖ›ÍD<›êäJyÛÛ8uÚ.z`]å~¤fUWŒ!' A”¼ÔÁœdvš‘·Ãd éTð×1'ò÷ÆPÎ$WpÍ~v×*ñ‚àí¸ ¿:gI¾¹CÈ·¾8Š·9&?Ä`¾òL©†€®9t¥†ãù—çÏÏÔÁŸ°)0Å I0—e õ![Ú‹ÐsÏ/Æä… çüdÏ1V}©}‘·öúîÛ>+tÅ/–pç¤NôSΆ‘ÚµP·kˆ(³Vêü _TÀHÌ4в<Ô£´¦,‰ÞqÁ¹c/•â©sHÖ¬þó>Ř(b«Í_šÂTF­!yoG.o»-S›vâ².²äPœê”„§õFM&5(­ צ;Rû?íPQöéøC2=.þLžrL ¯'Åéš¾ÓLä ËG0#7!N—J–±)EœN$îÔ] Ë[ð˜»Sl}ÈZ÷Œ×î%­kq]«çuå³ï‘ëdÑ«w§\'צѩ 5‚u¶Ÿ|ûªòtóƒŠúEÞê÷.äú Úí½c^߀üuŒjØ‹˜ƒä:¯üÕYû¯¾úvCí²Øïä#ÎtIë ý9·Ý+ †Âcm‰iZÅ=ù¼s4)t|ì^ßÔŸ÷†ÝÐóøuGŽ$=|çð4]¬X„ŒbYz,w*^Ú?4¾ ù.'ŠÑ·FX?¡UäAL°ä¨UĵŠSftš¤r¬¼ÿM‘‘¶D*›k{-“ëmƒ/*O­­ øõRÇ)Iŏà Á¬ Ž×O78õɧ/ù‡DR%ƒïÈÝ =Óc#ØëÝhM¿”óôC®ûš«ƒ,(AyôdÂl°[ßNÜ¥_ˆ–ôB]ú=¢0QØ; Ýî`×®.o—·¯Ìƒq¯Y;V­ôg'",í)÷Èk¤¡ùÅ0+ð.yþ4²ÚšªÁô-ghe×ý¿ç‡Õ³%´Ä endstream endobj 2615 0 obj << /Length 1436 /Filter /FlateDecode >> stream xÚ½WKsÛ6¾ëWp|)5S!ßt&‡4NROšÆr.N0 I¬IB(+î¯ïâAŠ”(Yži;ž1 pßûaw¥ƒ_'¿Ì'/ÞÄIQy‘3_8cä‘‚"?uæ¹së/š~Ÿ|ñ>Šz¤~ˆQšD H}¨§^â6l)hÃÞÒ†*– ¶šÚÔ%=3ß÷´™áoDe‚¯Ü{FÞÎÂØ‹Ý7Š $øn³bj¸ë’7Òžq³RÁ¨Ùm‹feȲ)qYYJó‹×å㾺¾‘Ø™‘…¡g­Óœ§ÍóÀ¼¯ÓÄwYÖpaÔó…Y³VóÎFe¶±åqÎtS6æSaIiYöØŒ<Ãd™Ñ’aò5³Z3^¶f+Þ¢^󨊜à`q­a•J;˜[¬K¶óF¾´‚Ô׸ —–`!?QÕå¾UqϪ$DQ8ôä›GðŽ` Qô°Aì *·3ÈÈ‚Ñf#˜ý<àU|är: ‚Ðý¼CÒZ[ÏĬemqµ Ëí!@WZ6¹.‹FžòOe)@^ü[¾)üç~Y$*’ÂFå¸ÿ_Ok^ŸN¡;Wq뀯1'Æ»—FFŒò}¢ Ç(á^êJÖ4êZŒÙç“xwå\Sfè‹Vw18í"°'1T4H€NÈ„¨ª†BNP†&äE=z³Y[‰TW´ÙaÀüthºïë޹–2^­© wm%¸3kTتŒÕ]¡n±£Æ&Ðp†—ýò梅`± T@ˆ újKõʈŸ¹y7˜3‹#h4ÞP`¢¤Oôš@UÆß´ù@=…_ %%Ö=¾©s* I8\^™5‹˜è€À¾¨èÒn5`Í ?5¬Çá 8T1}© ‡F J;°ò³nç{Ð3ë~–ún Ê€N’ºé™rý^Ç¡ÍI½×¹È™èÎj…, ¿z×å¾a?r¯Ë* Tb—Mu‹@=ÕìFSK0yÆ ñcv†Ð ¦Éµ`ZÓšÙ®{Gu'»_ §sZo;ËðꮨÙ{Ãu+ÕÔ3?Lºa&ŒU ÕpÅÍj-LŒdøC‰#”³ýr`Ù­æZÓ&[m¹¸Þ[•ÔÑr —Ëu éе~r@LºÂpƒ`ÕîÃhú¡ûþõÕõ1ljƒƒæSÅ©ÞʢŊ™£moÏvÉgC%ã[´(~°ütš<•¦ÏÒŒŠ†É‚v•ÕÜ#‘5Üh¹?t*Àÿ誴Ý7³Â`j.¸ Sз˜$z8‰Ç×iAÞ°cóõ`œOtaMÃÄVÔãE´êXMòb¼ýé«ÓCÙ!¦TIØO_¤ÓgçFåCl É:MÝ4}DŒAÁ»ùä¯ ÑW‚tO›‡ˆx¡“U“ÛïØÉáãG¸1~š8[MZ9>ìKçzòÇA”ñàýÔ÷žŒ"ðº3ŠÓ¨}{tØ °zJ©º§)Ó¸K¡þ›&·/o…ŒzçÇ04§ñs¼3^#¯@?P`¡ó–ÉLk@iý,äņý³éŸ .*“@å†dfP¿‹ÞûQéÐÝHûô°€ÁA°™36Mw[Ï+} âu­¸PœS×ÜE'¯¡ÍéT|,O¢šV€5@¿2ËEѪÈ/Æy!)ðÈû[U¬Yñ| !Sv]\ñå'KÉ@‘}ýf~¡ô¨`û°aŸn®®†ÔÑ5u&?ÁjåE5TB.}> stream xÚ­YKÛ6¾çWø(kUZ=¤IS¤6E²m›´m«•¥­(Åu}çE[ò*ö-¬ÉášùæIÆ›­gÞì§?ܽøîmÍR7‚hv·šùžç†*šÅ¾ïFa:»+f÷λz$N§×mÖé7Y—Í¿ÜýüÝ[å6†iä&^ÇÒ?ˆ‘é…'_n5à^XöE1äM¯Úu¿Õõ< œÎŒ¶ŸþÂqÉPêd¶ð7L>(«óMÓÝÊ0”ø~A켪… þ¹É¬E^~|ò؆°OÿtñôP9ÍÃ|±\:è¼›ÓÞµ®5¢Xðôaì¯@ÅÎÛ².ÞÕl²©YžiÀàÏÂW®§–ŒL­wnfL¶wël«Ï+ƒl·ÈE¢®š–Ýf¾ð¡Ây<ÀCÑKösR<ŸûNS£v]VÖe½¶{e_9t)£Ïú–•Qß]Æâ•uÓn³ªü‡0p·ºÛ4Å9…âÈM“ÎÜtðGõš•(4<•Itô|òŠ ½ÑÅËùB©¥ó¾YßâP6iV¾YËÃO¯ïΩ´85°ÑJg]ßjsÁ½Ð<¿Í“ÐçBÛ¨Ô'-T j×0äfÂnQF¤¼Ù>öÙ‡87šé¿¼~5Þ[èN·Û²ÖGF猪F,ÿM«Ëõ†LlÜù" "çC]íq¯r0.iP®øwŒMÏÚ±{0%㟢üì…¡flÑ}‡ —CÇX¢ìZµÍ–G`=V\‘åäÛ5o³Šx¢ÃòAP‚uzø´ª ñcå<¶è±“kcžg_ßM‚pl_·kÜRÂX?Ûs}>dhù0JØ£t`yœ¡õpµd¤øS.æ$ÏùaÏ<…^e}ÕÝÀ,Ž]YUL'o¡C(há”ñÙŒ%ŽÊú*ÝçG„xTQn/DÃ’’U¿Å/>P¬êvØè>àP] ĵa¡Ãñ|ÈJÃ4¥žè0ví w(ŸK9l ØŸîOëžêg•«ÑñI¬˜8b ÂHÉÔ. »‘3€¨?Q)hn®ÈɬÛ9%Ð+½úM)‚àôbçxLÎE@æ<Éc@ʳ*ï«L2†–#Ö'I)ŠbçnS^ϳI'¸íúP,^žj4KÜ(JƆþøÞö<rnè§ŽéZÐ2óÈ"äè¿+Lr{6’o#PÌç\“aBN¿ÿGLq:À§ÏÚf[$”²A@@HÆ1(ÔÕDÐÕÀ7óîÄÏFˆ”ù3˜-ìwB×óükASÊùJ~LQ´Bq& `‰ñ4(tOG@W‚¤R‚$ jî`Ä»—£R#a:„Q‘ößë\¤R$d–£¸q§q—ø?by%ŽÊ["ŽÉ¡¥ð†+ÚSU ‚ø#¢sþ“ø­âh„lx`äã¶d¼AV–RRÂ’QÆÎ8<±K4åÄŒûIþc>‘Îþ;è·¿¾š§±t$$µÒ:N󌛗˜û ˜[nHIÍFÒÁax'çDny0%ÊÀvAñ·=l>-SUƒJ]Áà*7Ê{· ž  Ýè6ö*N¹ïÒÑÖØèB–ÙÚ°Þê¿zmX~˜"WŦ‚‚üÇ&Ð,‰]º—$¸¿Õ\)œVÃLä3‰õ  .­é˜ºÕíZè"L‡›ù$*Á°Òê•nu£-¥È,Ú=v}7x˜Ó =æ#}K˜G‚†GÔ(÷Áe÷F¸p%oxž¡NtbÓÊÙ¹®*ÃC0äd©äÆ]Êi)uy(´‚[ûàÓzÌÜbCX®5YÝ‹%Âik´­Öצ•-ó[qXÚöá¤ÕŸLîÕ×5S<¯‰ÃdžׂpÛT¶lÚTóÐìʢیVô§¬7¦Ì$CýIðµµ®NŠËÓõùݨɶ•v»V_xP—Oƒ:ŠE0¼ `¶ÜlBr%MG·¼³ó ìà #üž¦]Úm6M_Ìp,Œ°‘#×s.‹ãK©X‰œ Œ(‰ÂÏ6ƒžàotʈ®ÃèçH?T šA[cº —¥¶WŠÙa:B¬˜éN³²Ý•FX&jÉiA®{ÄÖt©|çV¯«1^³"‡öo†WÆ=➉ÿૠܸéz:ÌØ˜òÚ£18J{ô7"é‰ÙT‚ý¦Û%½DxöRžPsŠ?k£æu> stream xÚµX[oÛÆ~÷¯Ü °hÞÄKzú&Mâ -bᜇæ<¬Èµ´ Eª»d÷ן™YŠb)7P°ö23;óÍeg,v‹`ñöêÇÍÕí›$\~‘Fébs¿ƒÀ“t‘…¡ŸÆÅbS-~÷Â(_þoóóí›4‘ÆëÀ/òY¢wÍ2ʽNî´èäkÑ d¹ ø$8&ñ®ó*Ê`1&¯e'TmÎGÎôÌ«0÷í Y7{¹\%Aì„jhd:y44lïé·Û+^9êå*ôÚ%œï•²ê5³ 7hû®V¬h¶ÂÜ“u‹6>øËUºN¼7Ëè43òñ­PYcœ€JšR«c§ÚfP ÌÓV€t±^“š¯AŽìö­=´jëv÷¸Ìï·rïXKa˜ÌHÜu½ÐSüºKm'™';¢5ý¾’5¢ ,|ÛÏ@“`¡k¾{µø}µFÕ[õ" ü0ÓÛ~ ì>q†^°öƒ8<óñýS2';á ý6Iƒ0ÉÎ¥!yê‡EFääq >J?( ÌÔ(þåÓðËÆÑƒd|‘¿^ç$úCSžqÄ!÷ªmL§ûAÍ"ôzœ…ÞÃÂHªÝÞª`hï :­¾A·ÌQÉAœ4’‰Èá@!Œ!—JP”à6Ç]gÃÿIÉ;R”8ß÷=†³—èGÚ/ÉͨcSÙPCSÂsôGBÒiÖjðu’aRYtSwøØBdм[¶‡cßa¬Çi¦ÐjH?+Z%Ka^)ÓÁQ’–'flá˜á^Z«ð 4 §W4s•DÌ—€8´hR†&Ñ^¥>«J2áÏ|$ZfÊFÚáÌޱLÖ%±e¶»í‰ÊÖÉ$? Üûä? |œE0²ÆƒæŠÃ÷úºSÇZY¬Ãp°ÇX¶禴U iFž‚™B„8èáÏÏm¶òð½MsKéjªwÍh/›2O¦Ž•Ä™÷_L_V´mH q<Öscv¥©÷VôÆ(aÃbí}²A¢YÓüAUÝž™~ ¡0Z­0f0é0EœTLGØÍy,Îµê —Ñy KjZ}€ú €þ)Y•R·Æð˜vrÈÄÖOOõí ñŸªo+—ë£ÒùµõÍÆ*.ƒö<Å&ÌÃi½%¢¡æ¥!—–°Y)ðB,µää.&à˜€{(}--È/G-!ÚæRU³J”¶Ân÷)rO·0É„]ÚÀÜ|5Ìé·Á;€b0Z‹ÆÜSc•8|tÀ7f|ÇìGÍ]O°E–HÐiÙ™Óâà\¨ if¹€ï_ï‚8a!ÿPTÞõ[À†¬Š5 ㅹ猉GÆ€ëu{˜°´Zí0OÛÁÂ(œFüÖ¶zÒ'œZ¬À’œqI^†¶²Aᨠù5¶íʃiš`SV„ !Qm*5Âå*uÁ©#]ŸR5ø¦R_÷ðÕ+ÅšTØ{Ù›õãâ1ÔQç0ÖmHf2•(±ŽÙ¶%UCIë콜*©¿Î"Òÿ?Ë›“^>ëÁÍ.z/»^7`@á3è=$2ÜÉêËÓàE(pØzí}”Xû‘ñAa[GgZŠF>Ð|\¸dõ\…^#ÿ¾‡ 2ïÝý|qWS¨þ¤¢lŸð\ Ï]ÿ»ÝýÂDòz¶Þ\,ØÉä6±Ï¾nx×ЯvApѸéMòÞ*ypù­â$Îõ¡¸ij¼pD/.”Ø›ãÀ9:AË“’‚U«ÛÝÊÁ$«Ycá±¢Áß¶””˜øÁ%Z_‚>ð%èc‚>ñ®ï^m.!~å èz$ÀÌÁ Ãl ­h›NO›¬E|؉¦p ^ÄÙÞ”µ»h¹'‹ çQ1æ*áp¶µÁ¸Þ•­Ðˆ2-p…éo¶ü mÜ%mªzQS¹žÌÿqñx/ï©“7ßR=ès%îæ†~é«eõK^“L#jÎ>¬ùZÂÓÑ íî¿›v-¶xÜÓæjvµ\½’Ø£Õ´÷š¢ÊŠÄ/Z4ÄïZ߇Yö"Ìó|5œaDO2³ûYŸÌþꟾئièàóEÂÒd>óÝÖï¾[ÚKéŒ-èž¾”Y;°“?ù25þª®Q¼aí"fŠmËm·ßzíü(ÊObÇ›öÓ$ö]w4/nowPºû­_¶‡[^ú(j±½5VÄÊeÂTZmµÐØžÃqޏ¢½àú7j~=&‹À…avfš%bë ý²©w˜%'iÜnéÂqÙ6P DÍsgôQ`Í8ÉÉÒÇÆ¸Í±VÝäñ©ÛÇ3Qs’Ü™~ QÿkŶ ô_­8„Ép3:Øwâ ŸëN–ûÆ¿DÚO›«ÿ-OAl endstream endobj 2645 0 obj << /Length 931 /Filter /FlateDecode >> stream xÚ½UËŽÛ6Ýû+„é¢21¤¨gÐ,d\¤ ÒŽ§gÐÒµ­V—”Ç@‹þ{H‘Òˆ1›I7YØ’Èû:‡—çboïaïçÅÛõâå*I¼åI˜xëG0F4J¼””ÐÜ[—ÞÆß.ÃÌïaÏY×úØ.ùeYµ{±|Xÿòr‘YœM@qLCŸ,‰æÊ`MRi™y™´L¢!cæT~†¡NöÃ2ˆ1öÀwoô‡èY[2^š-GÞ „L®—ºV?³²ýŠ^%–I‚Q42¬6ùˆc\é×Êø“W5´ûþ ¶Ž¬-80êJôr¨Ÿ6ûgˆ«0¤vlËg³©´ÃO~ÞJH¬®þ†w¬gI‡Úòø¶ ?^ëÇêÍÍÝõPÅVöm©WU[þÎxŶ5¬€õ'BU0AIžƒb*PKf«®E ô‡®´J¼zýÕ ííÎ$µìCŒñsˆ‡h£Ä‰ŠÀqÿŽE„å$³šk'¹Ðoä¡ãÂUð¸uÁâûV_IÁm£xÔ 7°eA¸h£¯ÔU™È†„R6‰ë¨'³Ò.n,lê.ìŠØT´»SÌu[ª·ñæ§vtY\¯-ˆôÄ™4#J1 SâÍbó€½RnÊàˆæ™wL/’²’FT¾×ÞÝâ×I¾|Â$eb&L’€DJLSFé(L“(mgZ4“š$·D‰d‘¢i¿—Ê˘ø{®þÒiœùuwÖ/eÕ@+ä!³Z-¤>4[e98Í’¹¹ˆ"Qþ¸Ð˜#‡GDbŽùˆ‚WGÕ}Ö™¼Î…XÉ+ÉÍ e”zÚJÓdh²¡Ch+œ”^%OZg•1Ó+Rƒ¢kާ¡ÕмÊsì6µÔí´8êYQH«˜FÚ'‘L+—³¶ž³=¶¼lʵ’| ËjÈŒ9c‚Æ(ÉÍ%¾lNž¼e.Þ²ÿl5ë†CY÷ŠÊ{e_«;ªŸsñœFRQ3aÆiJ­ÎU»?Äó:Ÿ*›äèzW§ûHsüU”åDíS™¡ŸŸ™ ÖÂq(OzX´¬±µýêIÆ>•üÊbr·§ÆíýÍÓ^v‘@}‡¾ÒçÜþDg¨ö[&‰šLcmú„왆*Q:s83Ök@=‡o¬¸üPÇKà—Ôéäš·ëßîÝÆ²¯õ¤utÁ÷nø5g­ØÿnÝ»ºýB@äø UAøC endstream endobj 2655 0 obj << /Length 1657 /Filter /FlateDecode >> stream xÚÅXKÛ6¾ï¯0ö$‘¢õp€¶M6h¤ÀfsÚ#Ѷ[rI)Îþû΃²%­ìõŠÂ€ùrøÍ|3¤üÙjæÏ>\ýrõúV³…·HÂdv¿œ¾ïE"™¥Aà%Ñbv_Ìœ òçÞÿþú6IzSÜÈ£Àù­š‡©Ó¨•–šÎû¹8Ûy˜9ßæ.Œ¨¢(«•Á®|»1ìšõ– S¨F3×–´©VK¥U•«W( R.¨´ˆcý§Uúñôˆ'‘s7ö}ç-Ÿ¾|ü8)P©½§UÑæMYW^%·j w]VölÅ_…¾ž\â n†¢»\îtý·Ê›‘\ÂrE¹5^S{‡-.Óø»·WåjÝ fƒå&'óÔã /ÛB«Ö(»ñ¶²ÑåÏäýÝ—÷“’¦˜Ônòü;­ŒÒ?”WëBéÀíÍÇÏÓüPú[mÔeÚxžGÝî‚=¬?öÕök!zÎèxbâ…‰ày7zÕnU5B§ºñ¸¹5.d^ %-$«|]k£š1‚!­B`Í *Š"(s¤È}F^!ÁN ôŠc½ë·Äó³§7Opó;2 î« ÞlYkÖ§¬°»Qº’îGynÿÀK“ô$ÛÎè“&Þ" a…Ì𠟈¡¸óA)X”Õì´c¾ò LUvë>nNo÷°÷½ÏÏ‚¦"ë‰pÖK.­8˜"v55—*mn OáÍ]á/œÛy6×Âóƒƒ&ŒèƤEe30ÄxT¤=@—I˜ÂHBÅ&&¨±tL0B³#4û0 :ý °ÈW{W AJJN Ö›z×­ÿKáÇßÏHá/ÈHn—d¤Ú«wx´#¶PÚ³Î# ìHÍZÚ¨3ÒXQ’cÀeŽ|"—•Üþßϯ%Hæ>+å~]Zí©™£×¾ ABèÈ#Ë–r4ΩµX(?AÓìdn'óÃGŒì »# mw-ÅÍ(õ#éÓ„aÎgóE Éa˜óŽÏ¸çß*¿Ú+‰®7]œéìòMVž,šõ0™Ûqá|­1¥´æüN.­+µ±q˜, —½x ]½F+õÌ¥ò¹w0htŒ}ǾQ©ºä±²÷éƒÞ®XDΣ‰±ÿÄ=Iúpµ„ Ç ªÊkjjâÊnï¾è"J0òaÁOtäf`ÆÕŠûì¢\“Aá=6bˆŽ]^IñaK(yReÉ“ÐräÍØØÉRïKc§LpîÉÇ€Fí0‹Ç"p>©Ìã¨çL‡ä‡&Ã#Ã|úÈ’‹B6ÒÐM=JášKkS¾tiŒ&e·4yBý'fæfÓn¯T×[î–\¬¬#àcø®á ðm°Ï"°3ëkXÙ*½êªüíeR»|Ó*„½X}ÉËDÖ°ŽyŽè𜤋M[åü ®²ô’åmë¶eŸ^bAO¯ˆŸ^ iqoìç–Q*J;÷E€rüsÃW‚ɯ:nd‡Ýw´ `͆ÃÅ[î{_xF§ÑÎRæÍä7÷÷Wÿ¦g endstream endobj 2663 0 obj << /Length 1536 /Filter /FlateDecode >> stream xÚ­WKÛ6¾ûW9ÉÀšõ²tè!Mš"Å"ÈÃi›=0m+µ%‡”ân}çAÉU¼»EaÀâc†ü8óÍ x+/ð~Ÿüº˜<¦^.ò4L½ÅÒ“A ¢8õæRŠ4ʽEéÝøoêi˜ù­^Õêk…»i8÷µ±ÓÛÅÏ_Çòh‰(OED°)ËH¢Ð$p{žA;;Òž…q(‚8Æ#^äæJÞNg.€fx‹ ¢¤Èƒ¹7¨y’8Ay…‚ ξ‘|p&¢dˆKÊ^PŽgÅ"KsPž 8<Ÿ×UfXà yèï±Ýt›’»ÅTúª³°ª¯qDú¥j•Õ-O‡<¦j'q¿m¸û>Y¯X±éy)铜ڗ Šm¯¦³°·k]ó8´X×hÛmÚÙØá«zjQä7°[’úßtÑò@uìë’ÇöU»ÆV|8K1,‰<ÁdYòìÛO××WÜ$D¨nÕv·™’U°Û­û6n §ÇNÑlwÝCum³UmU¨ÍænšE¾8!Ö9‘æ©È³ÀÅ"H“w`m~hјR›sõc·ßÌæÀðW o]7-C6š5ÆKÈx–§¿‚uڦ毭þq§Y6NO«ÃgͽªÌ¾²ú¾ý«¦¾xÄàôp?´ùÚÀ:O‡°ó;3ð QïL³ÃXçe\‹Jgéˆà‹'À1z©®‹Eèà ;ÎÊn0kU÷ØØ†øX4µmMW Ýž€ó{§ÍÝeŒ b|OrÃ3¾ìÃ'”µê”!¢|«¶½—gÑ÷–àÜÍãŽÛº¶§ßÒ4[nšå¦Iöî#ˆ½®VëÖ ˆSSý} ïž!¤%Ék¼T”âãØ[MÇhÉo]͆¤ ÎPØrÙâ®m à¡:Uaê\cgwÊ€¡ZŒäÑ¿À´bTmŽ£‰ó$ÀSó™>7 ŸèébÛèÓF•mDáç²K¸â'±+(<ª¯ÅUý$Æ‚Æãë†4Æäq8ÿ9Í!¨6þ/Í|Áx+¢< mJ‹dqêgµC]úH÷Q˜þ$ç}ì½®êr\Á‚ o‡IîRî±Gâàí ;F·q€8Cc¨$ç¾?”Qç©0è> stream xÚµWKoã6¾ûWè(ÄE=÷–6M‘Z ±=¤{`$ÚVAI.ImþúÒÊŽì(À.DÒœùføÍÑ·÷"ï×ÍOÛ͇»{%*³8ó¶;G"Iæå£Œ”Þ¶ö}LâàËöÓ‡»,›m} I””…ßqá+¶T5}wK +N¥Ôg6‘3v’ÙáÈ ã¾ˆµp#öC˺€Ä¾:=wþ=Åoá…¸Di™ZEýÓ?¬Rç–ñ ì$sÿÆí?TxBoµ¯¾²Žâ?°¼®™ašúK0ŠÓàÅ$·¸[¦}½÷Y´ƒÍœBX¨­`7t•Y^ p‘Í V‹O‘h ¿Ó–YcýÎ>ë®PÂaÊ­@!öY€ýQ© Юv¹ê…`«aº@¯èËuti¼OŸ `åÅ…h„ÑØˆŽXÇÀ®ÜŽQ5&ßà†e1ùUã`XSE2¡œ”™/ÕÛÕA²eÔìp]9}aB® š¡> stream xÚµX[oÛ6~÷¯ú$5«û¥Ã²®ZdÁ»ÛCZ´LË\eI¥dé¯ß9$%K²ì8†áE‡<ç|çJ[FjXÆ/³ŸV³Wï‚ÀˆI8±Ú¶e× ŒÐ¶IàÆÆjcÜ™ïó¹™5«hRó{œ³eIkN³ß²¢ž^}xõγ{·Ü-\ËñcÓv]ü:³4? ózd–±pBX¹ŠÍ.úñ磾°‘±°#âF‘º g<Ý­‹JŒ™eó-˼梞/\×5‹-ŽžÛfº›;¡¹žƒ`fQíæ Û,ÔþGæFáù¶¨ö€@‘« Xª[–eBí}²|«h격EÇIA ÄñlÛ¼½º¹yý:Ï)0ñ&{¬R4ÄÑöHd+…ú ®òm¹S²»æªŽ‡¥µÕ(Yñ¿/a®¹ó¼fi%¡!Ó‡iýKŸû—œižì.²ýXïgs*¶[Á.AxµcÚôŸ,וg¤—4‚iOª 5²œ®3MŒ>¤f™òºâ«Z6eë~êšMz<䢮ÝkOlòA—;L±þ‹%µ ¹dü¤R7ÍÙ®¥h¬FQ1Ô†€§í¨B\ÓÂQ?0‘i_£ƒë@A2ŒÔËm#è¾ÌDØÓª,%±fŽ'ÌÚ:^Ö PµaÏSí0¨L“Õ|±¡5³jmA÷cèàÉ(ÁÛÕìÛÌ!,Ãîò«ï»$òd?»ûløöÁ€/qdvNlÞ²º©r}‘Œa$VzàVN÷LÅ41 R:²ÚÍ¢éå”Ì¢áõ!Evõv*ª[ê.\[ZšX¶ùˆÞ*¸ ºÖöýdFv|âYÚG> š²³=É…½Étüa µe4ÐX¥å!Z*¾G©d ûQ 7¯¯'q“¤D$4x‘/&¥UÑ”dýx š•;: µ'éÊšþ‘-À€6yò@qϪŒ>~9Vwuûñ­<±è§ÑiÛ¥§l{U¥ÍüÙuÌÿÖw*K/7^…áJÓÀ‰Œ*5Úéí;éº:ªÏÞŒ®Ý‹xÝËñz§¼¾Ë¸­¢öÝÜ~ìþÇuÔÅn Ä‘C¬¸­åqŸÜ:®ÜuÖ³tå”ÓîÜ ‰-¼À1ߟêŸC雓­óKu”t1’köj¸ô¢0€JçLÎ Ût Šw”aOÁ¹ènƒªCò,´BûfG1o°Jf[ÛüsÇÛªãªéP’â /Õ`Â[÷@zn8ÇvGÀCض_:3á"Ñ}gµá9­™>[Ñ\,Nâ5zµ™ml®.ñL?áä[¨Gí¯ÊHÑÏÀy”ÄÎGÆå¯¬¦ ¨çš÷s0-­¸*7¸ƒÊ$EÖìsµÆŠ&³Œ\IP½T¯ÕC³Bµr¥*"ÌtõÕ‚80a$%Xuh”²f m»jÙxCïíOsLcx• Ú®àd´¸þùh;e´LÆ/„ÌI_P>â”!’oµˆhP: ž!¨Èª€pª¸`ÓE%;¼†ôšV: ¥iÕû£{GAkµÃ yn4ªêuAŠƒZQAèéÇÄB òä‰öTå4Y3N‡ÇÜ‘Ñ1‘ Ñ{™h²ØÄ:ù³¹ü™7*¿g5Ç ËÄÒ6TmFtb­zÝ#H–‡Œð¿«jOugUµÑ¸×EÊAÃ@Ò0FÇ ÏéÉÐAŸV¾._ÆÅñ- ™VÕœp!=o‹L Á}ºµz4EgÇ÷duí•ú7™’/Aü¤BÇ·#<Óþ}#½ endstream endobj 2597 0 obj << /Type /ObjStm /N 100 /First 975 /Length 1939 /Filter /FlateDecode >> stream xÚÅZ[o[7~÷¯àcóÂùðVÜîØ- ;EÛõæÁ+«±ZW $Ûþû~CY¾TÒæè–>$á9gÈÎåã7T8Öä‚ãXÙi´«#Á ìX²ãÈqa'19áb/ðÕ┃ ÔiJ6»¸H|‚7ɥŧâ2µYÑå$º’Û§êjµO º TqŽö.Á¬@š#¬.ÉžÚêYmjqƒC˜£­ËÑQ*mL-jïˆÕÜfTÇÄÕäð“É1¶¨¡ÍÅŽ£tØVc›ÁºüK œ…ìÞ)µÍ'!™œ8¨y""ÅÖsö‚äR³;•¦C F‹¹ÕI%Ós¥&“Sr0ªÍ…Cd{‡ÅŒ` ãÀÉ©XP^‰ZÌÔ^UsUÅThÁ¨4±–¦ŒÙTD a‹lÔb;MÔl1ƒîHÁœ†,ˆ¬íkƨèˆâà3{— §j†":1¶0ÃÚ˜-:d3J4m°4VK¬ÿǪíV®Õ¶QRËLI£¢Pa神Œt@ümBfäXÛÜ•”ÛrÕ¥h^IÐ,VP‹¹%™ñÈÚ´ð2r,-¼Œ¥r:rÆ(Ú*{a‚ŠLjÈÕòØA\3·Ý‰­!–: …’¥¹¬ˆËJM+Ä4™† qñÕª›% f.-kŠÚ× s-‡rMfp%WB‹f•MW¨y±$Œ4ŸœžžtoÜ QPÕ®ûñ§; Á \L9xx`|w÷þ䫯šðùdŠ4Wϱ¯%±¨7ÿö“FEùŠ<ÝÒQ|ßç!Mùª8¯Øð×ÛiÒ+À½²9cëáX©Mquç$Ûí¼;'XíjqFš=팴Á_ô7É“îòþ¿óöüÏÑø×“îëÉôf8mZÂûîÝÛîõµ3l€- !qp"á°övÀâèðÙ ›ÉJ;k~¼tÝ7“w‡0|qñóØ¼žnÿ7™þúÊ\tS¤ø ˆÄщ€ò¢7N""^ÊfKÎÆƒÛÉñynIKà{o4x!¼¬*Íä‡jOé!­G‘çòŠ£¦§t¨¾‚bí‡/ê‡(I)G N«åÂÚ¯\¬+åò°‹Æ÷Ëâ°Ð!+‰)x0êãÅNe@2ü êáA]·Kß= I‹G1=Z¢éÀŸ´ä|4¾y‹€|˜^ÏG“ñ°ÙáÌÿñá@§àã"I³Y'(²¸Ñª7£ß.†7÷ƒCÚ!ÔDˆ‚kô\ã¼ÑÛÁÝýì€QRЂó‘wÖ_i$Ÿ­cõT7šqqöí·+HÇq ¤{.üÈMàkV¶?DŸj3|ìŒ ²dTà%°< d ² YʈüxX_@¤£§*,Èk¬&Ë[ó‹¶ é†®$ÒßäR¦eLwvzÚ4tg«¾î²ûþâ­ýùâv>ÿ8û²ën&#?™~è°¸~ê~ñƒáÝç@Õã0 B¯6äæ§%Ð/èH½5qh%}_Øžö³Ævšº’W‡£ ˆÖ‚RŽhyÐiú^³zÉùoƒ8Bl¹¤Fa¬w¤ ÈM ƒ¦z£]—Ã{XtÀ€’/DvˆŠ7fõ 3Îf³ë?6ZÑ#‹ÈŽþ”mÔî+ªo— JÈÐzä”oà&Û ¡ôEÂÒÆËäžÒŒ~ÑnœzJ5Ïq÷“7t9;c²®ilT¶Ãäç[×mXº®eéÁk>Š0ê¥äti뀃úI *‰RÝóÊf#m¿»Rû¥F\“Qv?®ãòpŽËÃ9ò!)»õw¬ìy‡#G´øP@I‰<ÅÏËIܘÑ[«¿$ÇŒXÿnLàè¤Oܘ„}¨u rÜR9nSÛqMÞ[DjÜ·‘Ý€‡;çy’Õ;¸µ¬ Ö²#àÙo»T»îr³›·)úÌÛ°üuÒ‘ª§°æŒž—ûJ ©ô][à±Lõ8ÒA¼ý"ÝOš+µ;ÆžÒ!ÞGš’ݳö %hü-û6U›XõÎ@XÊ*–Ô«®a‰Ç€=»"û°=¨ä´ìµÀ”¼Eù>þtù®“ŽD#CظC }íP >ÔÜSškðÆ*x%Û?Sÿ‚^ endstream endobj 2700 0 obj << /Length 1302 /Filter /FlateDecode >> stream xÚµWYsÛ6~ׯà8/àŒIóuÚ7±;îxµÐYf [‹Jd¬ˆtg)“YSêï„•KÃ*óœv…ØÈšk™«´}¶ ÂÄ”‹º.axì~­2|uM<™(ˆgn;(‹>ÚZš7š’(u;¯echkÃVÂ¥(f‚X—Ü:𑃆‘M}2ôªl^ç „îÍÖ m ¶l‹¬QeA_•üÖªJš3TK?î&ð¨gUð¶Ù~@‰÷ äÛB”óÝÃ8÷U¹eǯ{”³XUªiªçž戉bñZ¥ç¢–1—EvPÙ't¬ÿ²!JbÕ9ª¤õGÈáCu#ò\.\ÛáÜg ÑE^—(™4bŠIç{÷‡j†!«×ª@Dï 2üGÆöÑÛU¨›‹'¯.uF„Ü`((,e9>Šò†n.^„ͳïb³ÍÉžGøÁkj¥ðXÌ;¼&n¸ëÍÈ ÏC¼Ó¦j‹Ÿ:'zàDSŽLÊ.¾`B×Äû³CëE±7Fš²„5é“yå3ޏ~¡e^ UÀ™ÿÿK9¦}y'«\ì¾(€»pŸ^^Ÿõu 6~:tÍY±@!}í¯LÎf“o_ç€ß•q>M\ßK­l3¹ýìY 8„ÇÁç©u¯Y7|&<„}n]Oþx2zÔ+Ò~ÁwÅ3žz®—F¤êánO‡ L¹]Àñ™ª[‘«¿}Ô×¼­ÁØyQÊê­ùL¿ fû j¦c&èÂphS›ÆCÿIã×8„ ç#M’s¨:žIíw²Î*µÕuö_Të=@þõ<€U|ª 7%@çñHúæ»—äíMø{qÒ>Ý…„Ñ©<Õ]žjŸA¥ÆñXY|œW7——CÖ¨Çê֙ȇŽòò ëÑè¥UU¶[w¾{™‘o×bÀš¡]s“Å~—§ÎˆûÃçbpZ­Ú,ìzËáúL LÍ9Ø×xMå”às-ÛJ4„ =ŒDlìt8¸ù‘ð~¸Ê‹wc‰Ô#¬¦ñð}Ä5­¤Ƨ®) ™·#cå3Ú„Ô1@ß®KÝÐK-=ˆT81CÚR˜iÈ&›ÜÉÑ;ú‘»æ If‡íVg,´I@*«…¬ú\ ÛØXÛhŒÕÙL™•ÄP¨‚!´´#´oîU³~à%(“4™ø,SŸ¼KS%¾* ¡S¾Ò·Cr)Ú¼©‡Qè›vÈçN§ßÏwivxÄJF¡±‘p¢¤d:—y»)ÌÄbÔÓ"†ƒ!Ý¥9ª¾{9T(ÓŸòÛ’ mUâ$Ä+aHT ‰#Â’V…²©q$„Qð}¥z§’8„yBàÂño%Ùÿ­à÷>Œ™ZîT±"^m+n6ˆ$}{€¦ˆïOâÅ |3UúÜNC&EÓV«5j]¨P4ğõü˜ˆÛ¾ øž z æ{UMÜÞÙQÔý×=¬®F'Ô£û¥29>:rN9ÙÕ/ÿéÇñƒû {Ì“犮ÎP‡5Ç nµ?zºbîW;þr¬Ø endstream endobj 2712 0 obj << /Length 1328 /Filter /FlateDecode >> stream xÚµVIoÛF¾ëW¾˜LšÃ]‡\;.b+¾82¦F[.*«î¯ï[†2©ÐJ ¤§™yóæ-ß[æ¹ÆÚpßf¿.fç×QdÌyäEÆbe×uü 2b!œÈŸ‹¥ñ`¾¿ÛÊ6“ùµ•ø¦’mW«Û¼j­¯‹›óë@ ž?ؾðbÏ~ˆ·3W+z·˜ý5°u ±×šĞ‘³‡¯®±„ˮ扱#ÖÂÀŒ8ðaŸw³ß÷òWr$H†Ž׉À¶(LœÀ;±`ÌGÞˆ$pÍ{ËfÖt2ÏþQ–퇱¹RV(L‚«jš˜Í–© Á²a—?3]–KÞde«à…gʴ͞ܣöip‚Èñýä-à0ÁD4#;^Ì\©&­³m›UåÈ÷ F‰(8@£×÷|p >5Œ.¹ GvÛÀmËKLpÜÆ½výÀ\•y¡3Öö¹‘k5iå„ÕÉëVOÄý‹º(™ùÀ-@mÈìÕã*mÏèÚ_i‡Çw:»²­µC×5áåãç&ūӤ2?8É«Ày2ù¨Átq/e+§ye¾ÝÈsŠ»Ž8㣀£ —öýå«Ò|õº+TiùžÙ6Gu<@ŒøA-th±yÁ©u§ºZ¶œ]Õ#xšS† °< FüJTº+o+^ŸöµðÔúÃ9ª4D¥e¡µU+­u£t5qš -éM€J3o¿oqÇPæåQ#=4òrú¡š+RïEZ-ÜèÌFÚ Š¾ª™Œ))Ž€Òüüd“áJéFä¼’Û-µ ‘O@ªê¥ª‡\±YXØnS ¶j12Ûˆ#gžxã”&$œ]Ön`‚ÎŽ(—f_\?Pºu}Ë€„ |ã³Í—j%»¼mÆaºv t{oßúf"R‰ðÒ! |r§ÍÊ5Ÿ°Ôï¥;Ùá<4w›LCC—Ø,˜[7’€-'i]žkuU0 ƒ•V÷î†dF$D‹‡ ¾†5…ßAÞ¾‘¼ n^?.’ËŠ««"áE`ÓV¦Y‹ÄgMXñª\µcaY›·5Åê)[*æZ„Ä%0Ÿ9Å©‹ç>CÒlõL°#/ån LRzQä߯³¢zðCsz®B azj`2gÔs^erœ1q;ôåI¦7``Þ“ø#Àí“â¹S“kB;RºyéÎÔO0دáopoA†ô Þ8X|Rà~© +°Ä!jßÂx Ð×’—õº¿úþ˜œ©ÐÂÛ~cøëØ«ÇFÕÜè–S“Ë|½{­øÇW¼.ç©Ò,}Žb~aŸŸ› œ=ß|‡ ã-ˆƒÿ“÷™–,yÙÚШt!û‰Vâwßixƒž6“óoÓðl’f’Rîàç?èruV¦Ѷo: x™SBxpäp&³Šè_-´Ö¹ endstream endobj 2723 0 obj << /Length 1208 /Filter /FlateDecode >> stream xÚWmo›Hþž_a¥Œ¥@y3à“ú!MÝS£(ûªÊNk¼¶¹ƒ…²4ÿþfv ;î}1°ûÌìÌ3oks°˜ƒ?/>Î/Þv­ÁĘx¶7˜o–iŽë |Ë29Á—¹0ÕIpŒÛÕ+aÝöaÑ‘*œliKìØÔM«ƒnM Çwk[„/?̱‰ N¯&ã±¥«hX\‰m³½•ÓuQÊFúØ4µòq™…ä²O8'¯-ìýâŽÞBÚfçI+#§Y…¤ -Q¯æ,O3c“ÓŸ-´i˜V/ü™æ«”·UÏg‹i/8!¿¢¢k…dVï¡h·dÆ´£Žq²Ã7Uœ®óm™P6rl­à'ÿFÀe,»×Lì¥îú¶¯=Ò2'à‰ã8 ®xZŸdó,¤ÂïæÅÉ“Nú%3„˳ŠT>K¾¥Ñ‘¥#ÝuÇÚ×û»QàjßqÛÕn®%îf1›Mïç°çÈ=G{\<<|áÂ|úÉ8Ób™™'­£µ×€Ãª}•v”œ®Û†‡$ËXä"~ÖLœkˆÈûÓv`|îËÍ€ÈÀ/ÍU 6;¼cTšdee¶,úa:nHX¨Ö6i~¦}íz;i¨e¿ehŽÎ0Ò1¼¨Æ N’L,±-—+•+™R'gš¼/ø·³ñ°â„4—}mo.йSæ­IAÚ ç„­Ó$~m)\/+§d±MåØU)r„Í#îT étKg"†a»ò°Í)çòkEШ,¾KG~‰€o†±ØÊué- …Žƒ0†àµJu±­vv¢XžQ?•+JeµMºh¾gL»ÝC0–®OVŽ^ËùÍüv!#.QŽá”=â%l/=O‹ -’‚ËuzXWhùÑLOѸª í0Êã‘k›’©!ŠpÜjÖÍJ†¯g`L\‰CCÝþM<ÄeÿM¡{Ÿé Š-Ê=u+‚¯ž øÞœ báeG¡šüö¯1®>Ķ$ä[±\%e!>=]dlj> stream xÚµVÛnÛ8}÷W}’€ˆÕ…¢äû&›A±u6îni™vØêâå$þûr(GrT'²0`‘3CrÎÌápgåÎÇɇùäý9cΔLYÄœùÒ ƒ€Ä”9iOù¹v/xîE™ûóªm¸¥îýo¹Ÿ{¡[p¥¼ïó‹÷ç4ìíríÇAF™Æ©ÖN{ÞïóÉ¿“†îŽbiBâpêäåäú{à,@yá€jš9÷Æ´t(x“ÒÆ…s5¹Üí·ÿ5xhÖÇ„o,ÉHÇ;<‹ÅÑØm1™Є Üù­ðü8ɺå^º¸ŠOwûŒÃ¤)™fÑk`":’f$¡ΙPy#×­¬«ŒG8ƒä„™ãëåÅåç^»u âØ-ëFàh!Z. u„³u!¸²%Ì€ºímg[{>$ß”HQiŽ´ÜøcÔ²ó ~$sš•Ó ÿü¸Ÿ°k³âJlÞ~¾ù!òv/5ƒxøLÄH%æÊø€N UFãE^ìǨïÏññsüÍQ&ÿ3Í“ %AJ÷h>+êö0Á©&ø…ç£óŸÂ+=la`YŽ ßí3 NIÓômNYJâ8{‚k· #ËØp µ):i½ÜÓ>)x(æ/¶JÚUKsg`0;=A½’«J~ bšó*Äóiœö®X½qêÞâlvz„;¬;á ”\^ú*Àó!fÓÄÒ[ê\„n^—kÞÈj¥§ë _HÕ6òfcoH :0Yûw^Â\^l„B "Ð . ¬DÕ)¹®ïM­4j†ågè=X¢+bâ{ÙZ>†`SI8¶Ô(ÙÀY® ï-(]€DSJtŒ9Š ŒÄÀ@ÍëÒ—¸µŽñvU4 „Ãäà L|ÒÒÙ)J¿I`àë¢&`XGLS#Á0$ö¯N–‰__‰_T¥'”>TW[ûi¼Óöñ0ܵ)YGc™XÈÐ%Aàþ†Ÿð89C™×ÅÐð/Ÿ>n $Øäȼžù»uÎßÚ?”üa`pÔpûÔ06vþfŽƒÙ°v'Í ¬Ê‹áú¨ƒYy&õè;5lˆh œÄgÅú0wleÿ,FÖOÚÁƒ}Йɭ>¦­ñ­^@âúEGõÓþüQéú ô-¤}§ô–×nh˜ö.ØNÕ (ÅkÓ>ÔÕB¡T;­¿¼Â¯¬òN.6¼Àùì”à`~+í’Òê­!EÊL§5 ǺB© qKŽ…´0¢ØEOyÃs¨?¨®í·Ò*àL#s´í—"½tˆ«3¬3I½=mÍ Ñ¶jŒðv‘›’¥kk”Äà:ȶ¯i¦"–¹7¸ S‰¬–õÁœºöa«O¤P„—JHcĦîj¥ ®JªB;̶]ü·¡„µ²}Ø>@YåÅf¡ÒTÇ%J³.¼úÿá7¨×œÒ6p ¥Ë¦.qd*¿5°Êµ}ÂM‚Væ1ŽÓ¾&z°å™„枢™MÚèíA\vMµm¥É¡ËçïHÛ»‚õôà=Œ# t¯ö>Þ{hÜõ¶Ñ—¿ÀBðÃF™Þ&3½éÑ—¶R˜°¾¼"™þ|™øêóik¬¥Íµ9²sº÷Ãìò²+]uK^áÑöeýó–õZÿÿ¾ÈH endstream endobj 2747 0 obj << /Length 1045 /Filter /FlateDecode >> stream xÚ•VÝ“›6÷_Áø f"™ãÎôázM:¹¹I®µÓ>\2Ë@O€+‰8—¿¾»8Ps‰ï¤e?~ûÛ•âäq~›ý²™½zQg¬’Eâlö%$£ÄYR$áÊÙ윗†©÷isûêM’ Tü$aäÞ6eí-RWßß\¿…ÕÒÕÜ£n.=Ÿº V%,šÝÌHBGÄñKØ…6è¯\³R¨‘ÅÀr:u|šQg¹.óºüHÂ(c˜ç‡táÞß(»PEÓŠÝi*G»cø¢îÁÿìűËDË­`W*-Ëm;ÌÄ|$1Ù –¡G+ÊZù·¾Q+Òë0”=-›:OÝîÑͳ¦ÌIJ¬âئ¦ D´Œ]Á÷Ú®²¦:0iÌ`föÝ+Z!ìî”Hi2 f°cªèˆ²î‘ÃnÓ»1”$=% Ø7Ò.¸Í¾°»ûû6‰Â{ËxžÈãG 6¼ˆ{ÍÁóÁO#-6j®´Õ²I–uÞ}@X(·ÙUøÜs.­F³· 9¯¹²¢c©‹qÌa™Qй}K ŒYˆ®Ë¬LN—Erè$ÓT!1œª¬‘<Àî/ÌAÀ#¡pQ »WVqP»Åªˆr[=Ñ‚BÌ µºÜPÄ¿X5žéÞ[[ï Td½¤„ªUS ü¯/°  ¯{ ŒN­‡o‘„v§ïOoÕõÉËOîµçÑèâÿ™]ýºÕE#ML¿ÃûJ–6ô_^º­Ô_¹¸$ôšcÑÀäZ¨f20' RGâÖ.ÿ0pÒï\fØG·,{\kÉŽß»?Ͻþªƒàê,g¤¤N Î’è„b (:_;¦²:?l«ìoU1!æ=Á¦™4S7.NhhÔlMùü˜÷gûúææT¦×›Ù¿3j˜¡§9¦iéeÕìáqvð Âá*uŽF³r"èã%°Eá¬g¿?› u#¦t­.i° Q¦™dšç’™1&=Y† M#â®Ío¥›!‚3ºþmcæE­/ánÄþŽS}{±‘ðücšxPú" lªÑÄX‡kdi?aU&ËÃYŠNYH—iÿ4ýíuas„ÃóÖJ‡þ¨_?(–óË›õYd%Ä.4­º2?ãItÞï>ÜÝ]MÝ“L)öt™ª`O\ªè&Yæ—y­ù1€Ñfö¦˜ÌË.]¾ vr>i-ùžK^gü²`{Ît+¹ºÌ&ʯ†ð âpïF–™¹@îšü]§É¥Å¾¾ÙÌí\œNÕý)$“<>¬Î ü3h/ȤW•1ÁS¥1ö^xógẠN|_FÏcpäe^Œ ÎåÕdÇÃUðõäì! endstream endobj 2762 0 obj << /Length 1638 /Filter /FlateDecode >> stream xÚÅXKÛ6¾ï¯ðQ"EêárØ&Ù´Åb[dSÒ#Ѷº²dÒ:Û_ßeëµ¶·(Z°Dr8œùæI¹³õÌ}ºúiyõö6Šf gùÑl¹šy®ë,šÅžçDÁb¶Ìf_­_«¼œû‰UÿþþæzkÉë¼*ç,}{˼‹¯vàFAhysÏ Hpåšó€2éPú1¼3Û<õY{‘¯7µ#EÖ¤ú;t]ë=î¿ÜݽAŽÀÍ aH»TæÐƹ7MË·»B8µâ2æ;)”O©d&doÏíÍÝÃÇÉMOB~¯Tÿ„åç/∈ÇÑÓö‚é2ú憞A™u°³½€‹œ…çÝ\7[QÎߪUõás`dä%NÌÌÕ÷?EZíÖ·0‹ýغ1b%}ãõ pißœx„ÖÔ1]^Rä>#¹¸Rüù´X¡bÝó-ÀŽbT«I ™çY7-³  Ü] ZoÄ?Ó1 £×êXðg!ÕØ£’ê ¥~| ϞȣUä%ùÇp…©d¾>ƒ÷Á €~N2“HJ¯Ÿ%õ!ß~Æ€îGkuEX§•”¯«ûNž8)¨7r ýtxÞÉj"£Å,‡pRÀš4ñâYS2š`’b%¤(SqZ¾À×@šc:[þ»ðZ ^7éÎ}B)¤ùº’„c ìYÏÄ2ø¯ˆ>èá~°“„±1~%·¼ÈÿÒûœ­¨7UvJôReâR«O<&¢Ë•¦4ë¹ b¿-²ë¹ÍXhÝUë{Øà&a0€¡ãáýò”JöA¨ŽÀíÔQ÷¡õÎAx-#¯EÍmÏÊá¥j“[uЧg¦©J4îņéÈÿèð2Ý«ó~ôs…Ö7!¨Q,)…™à„‚Žß5úU›Ó  ºº*N«±ßcº]žâþÇVórM[@@œßTãT{B1•rht†>­›?lôþŒ$(PÙNº>›­o¦³5Drô§®œ¼4iìâh0 Ä}³=¢ÝŠ4r+ÕG] ˆórÌ­¢Os(‚¼hÚT°;ÆÙˆxl{»óuB¨kŸŠ5EÜúÔQ̳vãÑ“ö:Õ¬sr¤à5ŽÔ±Ô¨Å}¥¡¡IÈ;e †‰V§u<àiSà€iSp’'ŽòRí­šÊ™ÛQ[ËM®h=ååT¯kà6h—¿¿jw4Kœ(Jú†þæ{î™Ô]4Voa©Z‚oæX;-µ#R óÆû3 ±‰Ó/%ÇcÚ)àÉé‘1ÅaSêy7Mäf…DËØåЙi=ð³bƒ¸9™ÝžÃïÕ˜1f*¶Hçz(aX"8âÉâž+$cHx))·1Sï §aEÆz(2­ü XK ÉSw3?öÓ¦©ù¿¡dnˆP">5…3wÚàñ$y¡)wûpVGw4ó2PÜ1Òi 6˜•Ф4I!$ ñEpJ—¹ñ¡[¦¾n#.jãþÜézn‰KçÃs¿Éðzˆ]Wü(VÜF>¬¬š¢04tËÐå †jÇSCŒ9§°½3»´3êMÛ]£³æ uóè¸\(çdÉ[„Nä JÞñ{ÆùkÃûŠÐ—U¡Ž×VŠ ^fû<«7ýbnÖ™õ‰7Jåܘó‘z‘Rƒ`엃å]SçkËù®é¡“w0i´6 ]Ë||ѯ+ZËûM*”+¶¬ß„¡;òO½[mª¦Èˆà˜D`î^¦á§r,“£² Â̇-‡üùƒ3ò°âJAó‡ðÒ#Y¡À{„Û²ãM ‹§~YšNû3v<—û\’‰ ~WRµØa™gÝ‹5ÐQÚ=£ÈÒûû “¢•~9}¦INŒ×\‰C1†›zs•¿–5¦“¼em¾³ ûŠ‘ÙX‚¥Y5…Æk!*«-Msz¬%­Ëö†kxq  ƒÞôj¢Ò`'Æ×ðe+äº}Õ†–.-šL' f:㯯(¸e|Ô¹Hg õ5M9¾Ìª©!Eá­HGoÝΡÄP‘8~è(¼žþ·î‹¥øgûo(LAµ³l{x¢@Ô˜+ç;šð;Ÿ.ÇÈZK©ëÉ•—WQ‡·` endstream endobj 2769 0 obj << /Length 1047 /Filter /FlateDecode >> stream xÚÝVIsÛ6¾ëWðH͘.à¡׎;éx2Y”ö ø‹°Ä†‹ ‚Ö$¿>HS»Ý¦3ŒÂò–ï½÷½G`oéaï·É¯³É«›x)Jc{³`ŒX{ !(f©7˼¹OB<½›ýþê&ŽG¢ŒÄc †:¡[z—Fl‚õÝpÅGú¥ "8„E‡Ìš™_»i00,é1!Jqâ*"'H.Œ`‚í¬“Ç;’ÔHRc’ô‚Ä´{ÀB(å…‰Ãóç*_L)÷W`!¥þƬë¶Èìv1%¾h°êKsBüLhÑHm¯©=•gv¯k»½‡?Þ+æ•1­­)â/•ÐÒ©}Æ,T¾˜ °ë•¬ì9¬¬®’M[èàPðyµ5Æü¼E±ÿ—\h{àÊÞ“9ÛäzeVáS映Á4CÄeæÍƒ½|ûéööÂ.;@F»庘vI1[­¤ì…] Á›Í¢.×í€B´º.…΢(¾N9óѯvy”Ä(å°…ˆáØ‚[CJ¤z”¨V™T»êãªÏƒ„&þum]Wµ¶•´šO¹‹ºÜ5öú’ãÐÖ•ýoòo.š‡ÚéIÜIü•Ý­E®6y#÷ÓŸ×Õɱ ÎÕôQªû윌*„öòß©VõZÕKHLó_¡Ó~bãçR-ÛRZW.CkÑ쥈oÛŽo™0W7y•½©†t\V‹U­,Ð׳ÉßÞ±G†Eœx‹r2¿Ã^—@PÄRîm:ÑÒ ¡’Áºð>NÞKv Ž!‚Q qFŒ#ñ~À]]]îä¦Å8ÎCìßš¦ÁÛZ•¢°œˆ¿×= L@Ô}A0tx`tG˜¢$u ¯e³PùÚ¤ôàlÞÿªÏãNý©¨T@èÒVÕ45µËÊ(à¨[9,l¥Ã¡âWW+ùj`üБÞϧF,åÉǶîîŠôG¸¾7Ý sÉŒ{ 1œ‘“HÜ·®g2£†É/øœí"±Îô¨=e œßÒ?¼GM-³,7\E?’”(¥–Ê5­vc°û˜£ã„e16þÇÝŽPBø±çÅÉîÈ90ÿp,F#?¦ñHF”ý?o™?v&Ü6ËÔͨòJfí¢Gw®)þ}{&£*îµç€Åí+¹A™²ë_ìŸ{dô·_ä׽럹÷ªuÜ3}~}¼ÔýGxD# ŽùF=Š+Îù¨+˜,.f÷RU÷¸|DxRéZ9†4™|ðε6òÆ/²L¡‚öå?Fü†aÑù7Ô~_Ì£Î0pë±7Š’º`87Õs>ˆLÓØE+ÿÉðø u«*—á,ÀqO-½~ùa/Eóªcëi¢m?Š‚„ût^zì endstream endobj 2786 0 obj << /Length 1178 /Filter /FlateDecode >> stream xÚ•WÛnÛ8}÷Wy’€ˆ!u÷C²Ý¤Û"(v§è"[ŒL+dË+Ò›d¿¾C%KŽ| „"9œ9sæBš:…CO“ßf“‹ë$q¦dš‰3[8ŒRF‰“2F’pêÌæÎ½{Ã=?È\Q}¬6R‰Fz?g_.®#Ö;N’Ñôš3,bZhB­©«Ùäß ƒOê°ÎJ’¦„%©“/'÷?©3‡Í/lM3çÙˆ.€¤‘V[9·“¿:}»£q%Êú®0J€˜$”0Ðк2ô¢SDL{§ïý(‹¨{ãÅÌ÷Ῠ03|À¨ù£-ÀÅwdÞr“–ƒܾ6Ä$4z'y!FÑŽ ÏÆÐg# ð©VjäCddÇ(¨‘›M:Ü(ç£Ë[bJÝ8|½»¹•®4Œeåº*y|="m™jÄZG¦':ûvw5ªø±~^_ÞÜŽK¢^DÏ>ÁÊŸu¹Rg£Öµ,M‚ -żä«ñ„³ì÷ca}‚8±ƒYbu\6Åf)V^¸JÌ–#YÒ•æžš¸÷ã4HÝKLâÃIjë[×LÄ„±6¿[N´å¯|)lÁ-püÏ‹c—7%¬ìΦC³¨-’¼®<æÖM¹*pa´OÙwÑ´¡FûÝËBWäªn†˜­ œ”s‰˜T Õ¶ÑœŠ ë ¦Hcú¦uR-ÉÂÔ“Øér'óÓ•íq~nµ¨7su|úhôÚ£³Wü–€î"œM½Y›XFíyqõÆR‹M…¢ÏOPFl#õ $sšÂi?¿½q èšÆî‚çB=<7|}„Z0ܬ=MÈ4 †mÍN!´£ãw‡zqǶw¸d úN ÛI†Nš:†žö Ä‹zè´½W/AóFpeócUæ¢zõá Æ‚TUXDÆÓQlƒzr é}¸´.ù?fA †.zsmøaè°\ArÏ…Ä®‡Ð¢­uæ½Ø H¶Õ¿MY˜` TÜ7ý{,¢ëm#ßçþhhÍås¼¿m‰xkõ#V…?.þ¶ï!ÁUæ6Œ ¤íž­¨jNXwí¯ù? ·ÏÚV`ñÐ!÷ívÖoƒf£\àˆÑL»õ8\{@œ«or‚ Ÿ­<Ü¾àŒ½€÷X v¬A/R{£j“€¹x­ã7f˜¥À3Öý vz@¬7”ṳ́¡TúëÌž<¶¹Ñ`«~›Ñ8ç ÇN``—êÅVfä±(!m.̹âöDEåJ‡F S§» Ð[òî4¶œ#Å|õ¢š o Û§µAòŽ®½§¡í5ïžÛ—Ë&×Þ?¡M.÷vKYþ/Ny”}÷¦‰Ë«x× û{Ï Ë,?—êiäqÑ¿áOÀ|+t°áÑrYÉzÏCò„(ìzs(ã wyðQ ¿#zëã© endstream endobj 2709 0 obj << /Type /ObjStm /N 100 /First 977 /Length 1872 /Filter /FlateDecode >> stream xÚÍYKoɾóWôq÷žî®êGÊÞ5œl †äI hj,+K“Âpïþû|Õ¤j9\i2ÉÁrÍô×ÕÕõ®aH"Æ™$OY‰dȉÙp!ã}r&ÅbBvÞdGJ“Y” “±›ÂÞPÁÿ%Oð"¡ŠMFrÅfã]¨à*{=”÷86{o| Ñã@Õw8JWÀ8¨žAeÆÇàô]•’R8"(ìH1’`üZhæk©½UÅX•ºØçt«Šè8ሞ @Aˆ¢þxÜXR¶…¬h½Š…XWõOÊÊ…€+¤¥ð·Åõ|¨ï x‘A„z3hB½Î&à”P0;gˆžÅJEÝ &`Ñ ¾‘n+¯²3§õ*Ž)ªAŸ°*Õº\yª. $0V™À”]ÕTô†=«~bUÔ>‘ ¢ ÃØª‘#¦jäˆw¤FÎ Š½ ÓrTMg˜†Sªìpl–ºÇ U™èªÊ›Á5à…Q¥UL„)•L¤R¸5g,Ęôbbò* ¤ˆëÃÀ3ª#‚ÂzPØš%Oî ×WTQ™`Õ(T™dP¥2)&9õˆœ2¨¬;J4ɯWÅ$ª·(ˆ.*'R êµð椬@‘IÔÿSDX%= ZE @…^‰T·_ªìTT¥ˆ%j3ADëµá¦p 7¹¸˜4o¹oMófzÛNš–‹¾]ô+ ;‡H¿œ4—íjùÐÍÚÕ:뻿´7wÓï—?›w Jð4p¼ž€I‡Ý ä5ðåb±·wë”Wë”±!r%®'ß}·%HÝ2i¾_v7mWù»ëæÍÍx@°_«H³Þ¼ƒ/YDŽjÒ’*)9Ë1™ÄB¹À]=¼ïÁ³ùóÝâ§æåÅE=¡y9ëï–‹æªùÛåúï›}¿zÑ4³nº°Ýïî»å¿p€]v·Íýtöóûûù²Ÿÿò-=RÖÄ–áS²’#›¥çõÓô¶»ëûîxi‘El­Ÿ¤ÍÁ2Œ|ißOWmâv1Û÷•*¬VšKÓüýÿ4"–Žvm„k-æóë½`ï\EÃã c?½Mˆ—qèÞZ5Æ¡Y²%䑳 c°ÈcѮ؄\2$XÉcѨ¯Ö#1=C¿FB1¦yj n³í5R±¤Çd$qeó€„쵂o–ŠTèÍ&ÑRêØ7oºå쪅¿"{½zmš·íÏý¯³ÉNZóa'­i…?(­mi"?J7ÆMŸŸ/ÃM³?P_Ç¡QÎlIcy#ÕÚ2”5êÒH4ˆvä,hŸ³UoÛã¥ÏsÛe÷ºâ3>Ú/íúeðÇûeøå6ø‹ésI¬Ä<M\¬ü:UìE£s²RÂXtoÇ_™†žY)Ílü:SÜ50ÑÑý”Ž µÒ‰aCøG"üFcµ)ݦÖîánÀׇ§n€èU"ê’G “ † óG/‹.!÷²ªöÊ4X¾]˜æ›Ë {Õ>tÓþ¯ïµäkö4#KƒöÑ®í»Õ9¤ÕÁ+¦€ÔFÉòâÅŸÐ{\õÝôó«i?µ—7ÓÕG;›OW«Ó‰JC›ï‹³ÓBì¡´¼_Ð÷]û¹íìýtnï–§ˆaERGNE­†éˆ¬S³ #È{zu·šumß¾™ÎÛ¾o·ª!H|@žÙoW´8ÔJM d,:4uƒYi]ËÎyÐqm‰®)cyc²³¡Äÿ»Èy7?r<>?2Ÿ2 nÒtÄP‘/‚èñèÕ5œeÞ™-»ö)Ýì§‚güå"=ˆÆÔI©ŒDLjB:Ø<¢=&ÜÁ"=„f8¡#‰Æ<€ÉþLhö¸%DÔ@.§ì-N2Ô¤¡&jrŠ;±󦓈å‘SFSpÑz4oê4Q?F#ÆsÀûÌ¿QŒ>]¶7³Öé„q@¿”¢ ^ôc¶Õ‘!ÂAýU²Úcúà¬G. ˆìP?³ëd†ù8›?¬úÌ’KÓÐ0(ÚtËW–‰ç~Ÿ±â¾ÒÓeÀÓóñžžÒI«„QêfDF$4}ŃóºÓ]–ClX†28|hpF?¡«_ÄÇ¡9{v‹†¾ÒH,AåÂþ>³lêMyjËãP[Â#A§ Yfø4DÖKŒŽN¬þ BPöÆì‡é¬ííåÃÜ~î¦÷'œoƒ::r … ƒ¤þÔJ¾ØLy„<·ÝÝÍ ëRÁùESRš@.´õ8LÿTö²·íòS§‡U¢kïÛùÉ?xèIXk¶}‡ýÅÒ”/Ob0#$ÖN!(ñ€B° þÏÔ ]¥t4¡w£818yïG¢Ù“Me,Úc~«˸°ÅûßçÁÀ‚ endstream endobj 2801 0 obj << /Length 1147 /Filter /FlateDecode >> stream xÚWmoã6 þž_aÜ—9@í³lù Û>d»ö°C1tknØÐ 7QS²ÙÎ%ý÷#EÙ±S+×*‹¤(ò!Iñ¬åYg?-gï¯8³R7üÈZ>ZÌóÜ€GV̘©µ\[w6ãþüËòÓû«(˜‘çú~ Ž”Ñuö0wüÄòfC•—8´ ®œyzCØ\8ÇA§ËCVl¥¯4à1±Xqb9,q™¯C_gmö·zï¶Åê¾)2)ßÁœ¡oXï0ÏMCm»•U;wBϳphü7 DÕÃ?b¥Õ?Òptiò˜ù³Ü5­¨ôrÜ¢ó‚ úÌ×Faƒ´î”æ;ÒŒ¾ƒu¢l§Öì»`g—ËÙ¿31{ë ¦¡›ðØZ³»/žµ%¤åibí•iaqè˜ð-­ÛÙoÆÒPw%Ãîp"è·0N\e?‚týò¢W¢t° H¸g/æ!³×UBw‰CK_ºB68í¶"yFÃfƒ@û¤SE0Eníó(Q>A£0à.}JôƒhVu¾móªœlíS*b+§ÐÊ!-_ ŸTæ‡ÌçÌ>Ìf#A Pô¹*Òe4A€IÂ)#qW$cÊi×ÏM¶¯gâDøÑ‹2#]REzàLÃðH‹žKC…Z:©’èºñê×Ï×ד¶µØ 92½Z\ß^NÚÊÝ’CYǦ:»ç)S/œt뺮;éwäüVYõfWˆrø§GìËÒ“ÁÐ…@»Ø¡ù -¤mŸ·O£Vû(ªbt ÌpòŒÿD}ºë0JD,rãÀÖþ|˜|æ×9|‹P¡­jÚºzÔA+–o'%$¢@|°¢¿Æ¾']þØŸ¢£íSM¦•£Xì‹$£¤É®"’Bq÷IŒ‰ú-¨‚^Uì#TìŠpŠár:Ob}¢‚à±³hñÔQÑÁä$Ä,eFÌxz3p¸Ï<°!¢ºBç{ܶÌÑBè(Ö“ˆðÆWôŠ#7Mü“C„|}…;s=.ýo*”µŠ«dcJ6î Ö ð»35rúX•¢“è<õàm'°˜D3𹽞Ýã-xß{{á$ðu–`¿ªEÖb6>QDe¾òÙõºÞRAãóa `]1ç§¼!½ìŠƒÒý“(Øã~Qj¼ð¡ªãK€0«}h6"“J,óʼnª€îÂQúö/ÚÕ®ÉËÍ4XI`!¢ÞK ”íôbp­ï‚I€1Þrm\úlZzr/t×µ÷æV2g_L‡ÛÃ27 c,²Eµžâ]œJF×Nÿ$-"¡æѰª¨¾õ:/¡÷4kºã¸¶H­x âõž¾MÍ9DH¢ËC[ë»i›ÕY!ðE®Y5Íà40ÁÕSí5×óó4‚ƒ~'þßCop×j¸¥0²ÕOsÛk·k-¿MexÀŸ›XõÆê>7¿´ÛƼªÿ=m{É endstream endobj 2812 0 obj << /Length 917 /Filter /FlateDecode >> stream xÚÍVKÛ6¾ûW›Cd RHQ¢¥ 9¤›Ý"…Q´µ÷äMQ¶½ªÇ6ù÷>l‹]¹ÉIƒAiæ›oš9{9¿Ì~^ÏžÝRê$~Bê¬3#ä“: Œ}Jg:w)îçA슖íŊ׭˜o׿>» ñÈ$ÔZe‚C"A3d<:¡½#Ü  $Úèæ+›Bt–å¥c'cªÀcÇà ?B Í•²ž½Eºjv%ו¬(®àKn°÷0ò“Èä—es/BÈ}áés]7·‚õC+:IQïþ¼×ª—ú8“n6º 2 fã>5%Š-iÃÙ#ÐÛí¥€9ðµ(Š4Ú¦¨{;^SÝg}/ÚOFý“dÚ [¨,Ûà­ þ .†¶d;Qü^çU¯jwŽô y£P––ó#ïìf=û{†9ø4DQŒü H^Î6[䤠„|’ÄÎ? Z:!ÌÙ"”cS8«Ù»]M*T|4©…Œ(ñaÚN“jOéh\h2²Þxa"w9°+mä vsD±»âòµVB%Z¸×¬àCÁú¼®þ'ßû(Œ“¯Î+œØ@QÅ:¯×¢ãmÞœÜO,ƒñ2RË †ejóõ!‡/„Ä͆Š+x ]^—ÍÐ £ëB?£}§¬ç‘ £˜Öís®´´ÞAsPW·³¼1çÐi†ðìˆ×Ñ×™ñõ^Ñõ\‡¼ÚŸCãF:#V¥s/Ä¡ÛÂS]ê禭Áw¤|CŽ?÷hL!{¡õçähðpŸ§2.)aFãû—ìlÐ׿<òÙu’S§‰€‡Nfâ¢êFˆÄ²9v ¶+„”Þ¡Ø=€§`á¦8äýeÊ/ Öî ¢ls. a½™¬«F6C@aÍŒÜu2ÜϾb.w•5lç%fö…ïûã­?ÁÚîÉx-26fᬈ>KÑêôùT øS DÝŸðÇGÕ½‡Î:Xk ~hi£©A§yi¯¼ßî–ËIb·…½®‡ª_)“&¢±¹‘Mâ:!lbé  >»ºxýçÝÍ$>{ã šÄ?ñåìeîÙ—êV(X×.ÎñÊ•Úóå9Ò¸«>}Õuìã”Ù¤É×l ú¨Öˆ¾GkÜgþ„ÕEû(Z z%ÿÿ]}YÛÑoÚvæOÊgÖn²I#»Iì-¸œÿÛÏ÷Î endstream endobj 2823 0 obj << /Length 947 /Filter /FlateDecode >> stream xÚíVKsÓ0¾÷WxÊg [òóÀ¡@ËÀd8p*\[‰ ¶•±ä>þ=«‡;¨%=0\8$²¥}~û­Ö¾³u|çÃÙÛõÙë«0p2”Å8vÖ'ð}DÂØI‚Å$sÖ¥sía¸ø¾þôú*Ž'¢$òQ€S0¤„–ôvS—öù–® ÖS©ræOà&èz„`¥ìØ RmâÅ‹…ù¾»"zm©¨X©Ÿ7¬×E“s®ÃIÈÄäµ:}©OfÎ®Ý Îó›ŽUÞw<È>‹¢}b‡¤¾ù‘/U”8™ ²›´¯Ôñ‘Žÿ¤¢¨toô?9—ŽtY·|&ûùëri5<…ÈȾcC'VÊŸUåvƒ,ZzhòÚÏDÏË\äçVaº›Çí£Èš!§tî>ÀÄî°¿aœÎ„×_¾^Z…74COOÄ!¤¶=K-¡ÎÁ¨ƒ P4øË]Ñ¡ÏÅ¿äh®šä$äN¤st: /nóuy;/÷yc²C\¦ggt××b®{u±\]þïœÐ9@ØpzãÃ%ïáaß$rÑo‡–v ‚]Ág³âx=¢¾4¤ˆ¤é”ÒÇÓ&˜õ]˜àĽXÀØ!n›‹¾¾÷šú§šWr3#räÚ,·]2œáð¸ßK¿&Sð™*w;h6YG`ze¢’tQ!J–-±ªã¬ûæãhYw%Eôù ¿{¬¼£SB”%àÊ-°°†0¡âÑó ®&äÓÝ;Nƒ8´^qttFd¤hè ,…frKŒghÉZ}jïÚÒ¬—é'øþ£kˆ£Y'ååúìãZl¬ endstream endobj 2829 0 obj << /Length 1242 /Filter /FlateDecode >> stream xÚÍVIsÛ6¾ëWprhÈ‹HpK§7¶3“ªבӃDB2kŠTAJŠúëû䈲¼¥—\ˆ…oýÞæÌæ|ü:ŸÇ±“ùYÄÎxêpÆüPÄN¹‡™3.œkwTÖw^ºª¸¨š®õ¾Œ?Ÿ ¾Ãf±Ÿ²„."$0«g»WºÃ5 “Ô° ƒ.Cb^)=iZÕ°§îz(‚ q/tY£]7 Cá.t3Óªmñº².hS”rV7mWætž‰œ©v_Á®eÌrá3!¬IS®ºÛ¦xÚ¨ú쥠\—rR©s/®’ÝÌ"çÊã.Hò†`wñ"2¡’¥ŸV¡úJ""¶¨J“Ú®!ß—q}ÂíéÖô§½N@× É_½9úØXÕÍ”~Yat¨å\Ù8‘i˜F„ĺ¹¬òe%»²žÑE¥V& 5„˜ZTÕhå¿I áß¼I¤#,ÿ„+©}tö2£b  ÄÝ =ìú6´€®züÉÝ×$xEç¯uÙ=ch€†®o¡) È$XŒ¼5…™ë¶2¶#á­´»|©µ¢Â­6– =E§Z:ïy…èUë{Ã(æî©šÊeEÈIb?Kð‡ûY“?sÏ=ι{2útvD%SÓv} ”ÜÒ1—”€ ,µ›·+/Š]Á·V@KëK8ærÃB¡ ûsj׎VYi%‹ ÔײíÚ]3Ðzf ·ÉiuCLÐU÷o•w¶ßŠÝΙ r:ˆ|–X§/ÕT°ù^Á>Lž‚æÔÓ”¸ßWRßµM}„~ÅîouP̸?Ññ/ìnÔ½lÓK@ 4\‘{j©/°ñÙý¨A”×C-aŠ˜¹€V—_Ë9”wS“lÓ±ñ¿V¦ßÿ(kº/ëŲ£«v!u 0C6q,çІB÷ã ªzÿ;UGÀü†Ì)s¸a O`å¶—ø ÈdŽðìöòÃ'ˆ,šòg>‡9w2žñPô ~6gãÁ?n¸ùýlU~Ì„“Ï×_˜SÀO°ß³ÔYÒ¹#À—Dà<­œOƒ?Ä’íð^as°+†@‹2$ ¾ ðὓqÖo|©`0Á Ëv)«ò_S})ÀíE ®”^dvºÂ&¯–m§4õh8#’€_cø¶Ô¹~ŠeŽGœIr!;ID%ç¤6ï‡I¢Ô­Ð#ƒ%&3 q@5)£C‚ô•"â)ÝÌÕºÑwGCÄÌÏ ^ B]x6‰0ö£mS=Um®Ë…Iðï(ÈÏßBd3žà²È– ÜîÂ?ÀDZõ`Ç«q“8§ic.MÁ*IVuÿìC´ÖÖ¨“ù– }bj|x¨"×(ÊFb¿›¡ë¦“%D{…´ƒ˜=ó¢ÜÇÿ´œcî#6ƲÌ<6{Ö5ì´G‡ 8¡kGŒ¹¿ÐÂß ïaîQÿq5$‡Þ‡ÃíŤ~ ¢>ÛªYC§|Óg²ã`¦›åŸl^¦BV‹[Ù#Í/hrGÖkLžƒ¬y3Ÿ”uß²ñåÕ™¡Û¤¡„P}»Á:§w⣋Ÿ ˜}iþpÁŒ¿'˜V>½£v©±q¾ùaBù 0¡×þé%‘* endstream endobj 2841 0 obj << /Length 1554 /Filter /FlateDecode >> stream xÚ•XéoÛ6ÿî¿Bh?LbEuyÅ>tmÒmŠ¬Éºi±2mkÕ59ö×ï”#%Ž“ @D>’ïø½‹´k­-×ú0ûù|vxì ké,C/´ÎW–p]Gú¡ á„ri§Ö…-üpþõü·Ãã0m½XHÏ #û¤R©pÿúû¬V]¦rÜ9sàÖ‹`&™ïÛfݺœKÏîÚɹû_ൌ‘ë¸ÂgFÕå?:éîKeýÈ‹ì·ó…”Ò>Ó}£:ûpv¾{ƒxªºˆœ0ŽXbší~yÊ{Ÿ}mV•í|á{K»«ø[çUwÃ@ÚÅöõmÇ  ŒÛš'ÊšéÿU‹\—ënÃô’Nz.ìf¾vƒ–¤k_án°¨jxk[3ß$[Ýf嚉7 ´ÀŠBg{`žp–AÈæ©2e¤né {àYl¹ H1sitÚ'Ý”ôÀŽ?7Y‚Jƒm>[©*ÏÈþ[¦ß±¤)â)Á”¾Õå{ö¯+^)«Žw¦q¥¯Ó>“¦öhÕ°tÝ2eÈ='`³úBÕ O·Ñ¥µ¥>àˆº#²èD½¹¬PkýD|!j¸ŸDU«­F¬³`ZÅ_@‰Ù ôãÆ1&_Äßi•?¡¨‡Š¾ÛT„EE*x¡ÑV˜ÑVŠ#É_ÜÀ}•Wún_¾ÚdøºàìûÐVuß2‰ìRÕ¤ºïŠ Í„­ºSfƒLQþcÑOH&×B4Áuˆ'L6R¼ð óAùÆóLõJõy×N]16íùÑa _7U_;—·O¤U´3@ Ý)'Ub-PºÊû¢4±kô#ËÁ’í¡KÎÈg‹‰g•×õŒx~‰ÎiªóÂÀ®j•l+Vü5~¨º3ßóìÓ† ½ÊRÍ;”a¡ðãcMŒ†šˆó5÷’±8(0–è4–B¢¨›GKŠÂV¶i‚ÇóXÚZu}£O!˜PÃ@Ø@…~C;Ãa'tˆSnH¬Ç6 ?ÅôÌaIëy€óžCÙF±Ñ õØVVð]Mú¼4ä’ª¸ÌÊ'2Ýg(v/dà’À–‡{·â™âÏÖ6¯×ü5å7H¡znötjÝÈnÅßóOÈö£7Ã]hò(ή³<4ÓËm¢S{m¾3F×w”¤^ÛÌY›j°ÒTW°Œ‚¯aÜâðp=ôdÈ", %Ž×´üRäWFÏ@~tÓbs•µ=ôÑÿô 2¶ÝÑ v\p°Ýþ'œ)üxƒêÛÁ2P3S~i‘« î&Q4B…‰[>c „Ѱ!$UÏÔϘö{6µªyÔ=è*;¹—.–>Ÿ’®xÏs0$×®©Øs#ý¤Ár¼õÉPÒ].2<¡t€‚€c=V&žzÓwÇ wy‹E$¶‰L¹<ôì¶3 c,¦¼ØUk 9Ñð¬Ç|3&ÁŸ[ ZÄÃOÂû%5jsJ÷E…9ªájypµã  ÷Ã$)mÓZò¬í¦ k½¾ëÇTBª í.?¢Æ><ºQäêþÇÅ$!b`úƒKÅ\jñõkíºöGŠV4}ùãÖ,Ì2Ï¥“¬ü®SSØ1l[zn8üJBp÷©ã»¦ñàä‹ M~b"9Rü‚V~؆ÖhÅþ¥æÛèý#l+ëçD<Åâ¨LQÍ1$ÑÙÑùìß™ ÐÛw¥ç¢nd%Åìâ«k¥°Ì¹Œ­kÚZX>„HäKçÖÙì÷GÝÅ×ɳð !ÅR8BX÷¾NÃå4Ôcȼ“9´ê ÿ)J A¡ áÞp’}€¨ÖTÒ+¼Vf8J¸öãòç¬Íú‚ÏœÕĈDáè†(ºÁNÇ´¬¤JM’vÖOV~†/'F{P»Ä4³0`PŒyÓît…#Ç ^ä †Üßñ{ —K¯Û¤Éê/¿gÖNtÙ¨&H<‡º¬Š,1c‹3¾èëc˜ Ætµ#©alß=Ó€¸ï{ôûÀŽÚ{¿ í´àþæ]ù endstream endobj 2851 0 obj << /Length 1521 /Filter /FlateDecode >> stream xÚ•XKoãF ¾çW9I@¤è-ùÐCº›ô`HœÝ»E:–ƶZ½ª‘6I}ÉáH–ÙNàüIùñãȶ¶Ñlí—³Ÿ—g—7a¨-¬Eè†Úr­9¶my~¨EŽc…ÞB[¦Ú7ý¶b©cÿñx_³6c¹ñçò÷Ëßûfz®FºãG¸zf+°Ím³5Ó`ä‘ÜÁ6|oÿ¡äÄc+cÍtV6ÌøÝl+Ox°Õ±A@[SÖ2+Íš ¹ÁV‹!-®³œ—¬à†ضþ5ç0Ûò†§kÎÚ®á«ä±`m“=[Ûà|_Ò„`/ûR”móûEž%­rʙ߾ÊJKdÿíŸøôp{;»›ì·Èä½#Ë»‡ëÙ#meuuÍ›½Ý7W·÷׳~Ë ä›Œ‘[­×Nn3!:þ˜WO ´«.7ÜÅ7/[phUZíKýFÝIUÔ,ißæ˲ä´9‘º/ÌQY0†·‰¸t—ÂåU³éÀPÃsõVú €÷¨&×$#7Ò?f OÚªø¹áî\n¬·,+³rCsí–c'Ö hâ»íù9§¾¨¡užd†# ÓÑ9ôSZ_¡¸uûxO¿{»š# <ÏÊtÏŠ…ŽŠ@8«JÇG¡µˆÝ zJÃôÑŽïAttô;{ eœžÏ¤ÓÈý o€Á)Â1ŽdžuÕôF)æg®ì+Þ™5˜E™Ó}Ä_¿žŽûý.g.@¡*+ ³’ˆu"ÄAÐh=~¥å†³”zYya`ð–ýL’w©’sNjªüeS•â\i©HZ^õRˆ̓ùC”),Ãô}_ÿÈ׬Ë[¡V)Œbùt Å=×rݡĕœ£^t0èŸË\åî? 9¯UàÔµÉFŒ.k©·•ü!wÓ QçŠ"RYÙc¥¿žÚ¦P³Òc`óv¬ ¥ò4V>Pö+}òNÀ˜@VÔÙå? vÔiyìë F‚4Æ ",|ýƒM<¾ :Á×þ´åj +Yþ"¸8’†ÿÛeÒÀ–¬™M&54±"Z¼Ä“1xV¶8ê ¦†’è±ST`u7˜¥ôW„.¥:tø3+êœ[ïFQÁ¥+Bù’‰¬+¾8sI¿œ«ýwþ¥Ú›¢eeÂ1U„Ì9mR“­©eÔü^Âú¤–µ5ШD§¨Z„wUXR^îê°“SýÅ»à ©Ì#µ2åÏ=úŸ2 Qy›h1)ˆžþ׬Æ$8=FGÞ ët5uwÕÔu]ÉëØÒk;Š×]Wò?8f£F˜'¸cðê¼j[ž"ãÙшñ¤¨j,Þž¨ý÷ç)",Ïq=JÜsð sIÀ×m– úÀ³•> stream xÚ½VmoÛ6þî_A´&5ÍW‰¶Ù–-Šb«½a€[ŒEÛZm)•d$ù÷;’’-¹²ÓéÄ:мã=÷òœZ#‚~ý2M^ ŠœD,B³¢„`."SŠ#ž YŠæ*ü0{=yE£ó1g‚ñàM¡Ó_÷eVLMHó1dq`J«0"Í=p‰èh4f1¬¸7}¯w·[SõTÎ=Á”B ”#áüUhLcÌêm=Ž%!ÁÛ¢öB¹Ï´†í¥”àD6˜R]ëEš•þÔOc0æÛs·õƒßéÝ:nu½™ÔÅÄš™€³¬‹òaÈÈ g¶YUãU1xO$i]™z÷PÓM±ß¦^®6Å—@¯6¥I+£ë}i7ËÅN×ev7rºM%ÿ,¦"ÓÛöJ|ˆÆÏþÑó£±Ã(N æ½X_ç©µÑ y«2ºž>(hDÅ%ÄFh¹Í?”Â&‡$*tçŽî€ú‹y‹¦£?Ï–ƒ¯`Õ­`€AMËHà$aGÈWy^<¼ÊSsR›QÒ«jÁ Þ„’…ýÑp.UPoŒ®BÖ–_f΢ß.¶ænɰJÄ×àöøÄ@‡J¦0Þo¦Z–Ùmù`6¹m…¹RÇèÎ Ø`ÙF~ðË$ˆG'Ž­Y&Á©Æ«¿*½6_ÞÔ—ý;fÏÖZqó/tÜ‹C˜¶àóéª\ïw&9 êË„sΧØòœ²íWR |k²õ&d*¸ Çð[”>Œ,e Q}ª¤3ÒЛ…zùNiïüÃÞ e¯A]ô2çä»Ìïò@»L+ŸiÑdú "ùw˜DÞîÍ·TÜ;L•W½¢.T0B6¶ð¢%}´ÜÑ» ¶UÛ)Ó øØ¤ç{þ±¿+q–`Aãc7sÒ|ül@žWƒ$äô½ÓVÚqklˆdìØú\š`ÊèÓPKæQüÄÜÓbqŽZ÷k½n!þ¯ÄÓIYwR6Ü£«J?ô¦æ³f¬>{”’øSQ’:~Ò¸!~‘ ¸%ˆmáÚk©]Ú Úâ XÙ§òAvoŽŸ5nYotí,A´k¹v{¦ÝÚû½Ê¯wÚö©Mgi;öÞJ:Z›¼QÊõÎT/Ü'FáD1ÀßRz\7º\zSSM,1@Iè4\÷ë¼) 3çü)‡8>">ða…/ñïøàP‡…}Ò/Ó0³Ô¸þZ5d š±Ú23¼n’éºQ©|u*¿%óïMÎWüa…Ê5jÅwŸ…gîÛÕìKýÈ,´¾wY|È/`®ÿ[Ë ê endstream endobj 2878 0 obj << /Length 833 /Filter /FlateDecode >> stream xÚ¥V]o›0}ϯ°úd¤âÚØxØC§­“ªjÒ–l/iU¹@S&)mý÷»¶!% ¡Í¢JÅñýð9ç^_ h(ú2ù8›\\I‰"IO¢Ù#b”.$ #’Gh– 9¾)U29!Ç—ß—jåÜÍ®/®ë…ñH’rHj˜ˆ´Ó„¶ç|žMž' –±Í2`D°ÅËÉüŽ¢Œ×LQˆþ×%€":mަ“o›|»OÃC„}Œ ¥Ï å¼ÏcÃaD½Ø¹ë‡‚âÇg¸ÔÿTâ¸Ü1h ãùXç0›‰j”É6LRPqq IKF ERF¢¨-ʧ´Ž«lÕde±Eæ•ÔV…Xˆ\°x=-€ç¸_Y³Ñ1ÚAáêœæ1›âG­éàÙXÂ7°´u¹¥>Õ)7‡3±ï[7‹$Yunè¶1.×ES“Ç,O×§°³8ÍóûUÅe’Þ/׿Ï“,Ò"H¡·ë(i£žŸÖy>fökÒ:-N‹¦*³d´5D«ºV/ÛQÓ•j2•ûgK]­-³ufœÝ½¡ì=}pY-ÖË´p¸‡›z´Þ胮À;—s«ç.¼ç¥ãz!Ž•éWx—úéÛö5;*›²z±?›'ÕØU 1ݨ¬¨;[Ú™ÖÖÖ–ª©²¿çðCD¦?ìv¡–©•9$ ½m垟t ¨þ¹½Qª0wM蒛亶ÖtK¹È¡»v9÷ur7g„DJ¹ßð£zyè¥ñÚµL¯·°^õÈŠ…µEô¢¯ˆv¶ŠtI| ÷¢ë”Ch }ïšúDà¶Zz¥“´èD¼ÅǵNƒÜõMç Mà²J²B5}ÍÑšo›QìÔ†ÙirW–GéÛz ;õFáûþ×=ø:ÒËK‹¶Ül·£$‰í^mçhïmhCÈû;ÆŽÛÿÚe»ù³Zâ_0ÇZl0Ï6’× ,|ž8 7z‘ÁBê±An!ÿt" ñëô¨ï ѾÚ ø#!ª¨[~ßSjn?;Òuóx|‘HõDx›Æ4Õ‚êOš¼.¼ŽÞr—àЇãî>ÿ¹É endstream endobj 2888 0 obj << /Length 1206 /Filter /FlateDecode >> stream xÚ­WmoÛ6þî_!ø“ TŒÞ_6t@‡&Š ES§ƒ&Ñ6Yr%*qþýîx”,¹Š’ûbÉ;ÞÝso²ml Ûø°øs½¸¸ò#aIè†Æzc8¶ÍL:Á)¤œZ; ÷\hhàT (e!è(±ßhC•.—ŽZK%cïÛð[ œÈOjµz˜Ò‡twƒãUùÛͦYð|w˜¹~+Õ¸ªÌEÁ:w ú ‹‰ãÅ#*àÑ àôØæŒ¿êRަ×ò\PÀ"-ÌMóa‡i™RZº‰«^ä¢9º3ƒ)ØWðX”´vªQäòx(ªçjî ž&Êu¼Å%I¨ÒÂêŪ­i­–s}ó¯Jt.%¯Ùk³\}Íì,kåÓu²¡ Á 7 S3=¬Ã¶SÃGÛïº4Ñ•WõPÉǵ¿Gx´¦ß&¿AàÓú ¸3 endstream endobj 2898 0 obj << /Length 1561 /Filter /FlateDecode >> stream xÚ½XÛŽÛ6}÷Wy’µ"JÔ-EÒ4)E»ë6A K´­V²\JÚK¿¾s¡´²­uã)öôh8Μ®km,×úiöÃröò]Z‰“„^h-×–p]Ç—¡ á„~b-sëÖþPÏ^lgiyÓê.k矗ï_¾“b´ÎOB'v}°J+D PiæšúVE£U /ñø0‰@èóâOžpVíu»\×þäzn•¶ºx€™x5_H)ív«æ ß—v6vÝíæ^d· Š|›• Ýq­…Ž\îG‘éz׌©êRe]©x댬u^ìÒV5_ã„w©ÚT NÛmÚõîK¥Ú-oœÏ‚|Qe >º‘Ý/ˆÌ–ŽV¡ Û»®5ÕÝ®añý¶Èp³-zÇçÂI‚€=ïsú Õº²-•1œ–üåØeØJ6ÇK8¡À}BÁû´{õ/EpÆ%nó¸'ŒcõÚ‹‚h)KþÑìÁ•ÞÁÑÅ $ì&-NÔ(¬2e‚¬­yÔ*Í¿36%c¨Ç¤Þ™@E`ÉL­¯^‹  —†HfÀÖu‘£•c‚œ5A,*v<î‹UNƳ¹Ì}š©o’^Ça2íúq8+÷/NLò¼ËJÕ5_ž;Jàax zàR䤉Ÿ>÷'Ññ‰ŽS2dŸ‡3‚¯rœWBøœX^èHihÿ·yÚiÙ©ç¨|œš"+±Ä~_3Òüwµ+ºj¢ZÜÚæö^ÓðçÄ–FË<½>Ùà–ÒåFu:mÏãNI´Lû5T«øè*G r­¾ÎWò D&hZœû¢Ýšª«ð‰ôVxĬ”ê°Ð0Ž©S¾½®Ë²FÕûb·aÑÝGØ›³<@÷ÁaÁ¾˜ &@¹]Äã"yƒ‰ÔPzÀÏ_Ø‘¾ÀPÓHvÒ÷¦*/iy;œ©‡½VMÃeÖçi›ÊXPŠ7¬•jc2«Ë®¢Rºé.géZ¥m§ÕH¹OqX›4c~¶/úuÿ…iŸÃøÕp눃Ȉ~ <[딢+‰ûˆK¢žý@6¦v#ANˆFMI‰<`l·Z)c„±4£÷Þè Dì€)$‰Qtu‚©!º `®4eIþo€‰Ï¢+ÀÔÐõƒ®7 ‹³§&U Ýz=´ã~ޤ-*hY±‡w%hÃ…ïL¡öÝ€€|&nqÅFíÔíÛå쯙 üCóîljÆ‘•U³ÛÏ®•ÃÇ÷žpíÖ=©V–«‘Ä~½´nf¿ž°»;~!½p… äÁðB8xŒ®/L¯/–®ý&-V®¼AlÈ&À„¤û<@†X0´èSÉn§ñ£ÑÜóF點`AZ† »±3Є®ÃÈ0râäû®ï$FàGÕdºØ“3Ï”Kq¦\`,ù1( ‡æí ÍrÚkEéÝ/€~Ýó{¤¢^¨xR⣨ʱ¨ÇÖh`GŒ£JMoO¿6ºîö<Ýë;V2[óX0ñ¨N·îaÌšû‘ ÙðˆL7GNæ,J×­ÒFëÉ.u°Äörû´š‰-S9ù2:p­ÿĨ!5Hq£þTa) #i¿›OPß jtÒOŠ¿è¤˜†–˜jò<û®¥ì–Ì"ÒþåÍë+œQÙúʰã¤Þó„¼ÊÙ©b³¥þÀÐHÃß™@¤Í|š¨o#vð&÷ðöˆp|®ð6‘½2… 98Ž¡m*[H­¡[â ½)ÿ£CâÎ]Ô(þ63zU?Ü”+è²>Æjü(Â)]*ׯ¨¢ÇûHû:gꎮÄ´iü‡ÿ ¤¸Ž£N§›þµe„ æ%–ö ¶Ò/LJ­òÇ Nåý×¶Íò„HñÝ=Ôÿð|õ ;Û«©£“×ÐL:w©žT(rèAV¬¤ßóðóÇ&u îèHpR[CFši¿Øgé‹«©Ð#}•;yQmðJLïPëbsúÒ+Š®‘òòúã[Ò]Làzòˆ~„bòbÕ” endstream endobj 2797 0 obj << /Type /ObjStm /N 100 /First 975 /Length 1596 /Filter /FlateDecode >> stream xÚÕYËn[7Ýë+¸l6¼ä<ø(ŒN‚´Z ] ­á…c«‰QG2dHÿ¾g¨ÄQ¬«öÊ–Úta›ä=œçIS.â‚£‚‹¡8Ê¿(»Srœª}"'QlÀNRpBÑiH¶ N•l NmcÁra]ªpq™¸º\È8TWÈÀ1ºªÁX_¶ÄU¶‘àWpS ŠÚFÄÔcÂ(g[ÃV¦¶¡`ÔŽÕE‰¶ƒ@]R´5Œ4Ø"ŽÀ"S[åœí$8[)ð€ˆ±’In¿‚˜ɔӨ0ÎFíì ò„ËÑd1E1Ö¹ž!™°‰Âø ¥­aª¤`azÑlâ™)a$SÛa SƒªEÈq0ŽE£¦@86@F6°€-S4‚[¤¦è’¹És“¶Hv¬ÚˆÜv±5Š›ÜEA¥d“BÁ¢’MA¯f;†€Oˆ <@^b“VÛ}™õ"Ø‚µ«6I0*˜b&ÚHŠQ¶ÓÂÜ$‘ k”Úh5G6 œº€—Ùã`B`dkÕˆà ¥šK›¥Ê`±ìF ´¥QÛ^.•¶Ë•˜GV­jçÎ#»QèSS»Q\œ.í¹¶4hì×fÑgÒ¥IÛԨƒH‚KD¯À5äRlw M§¦#§6r ž(¹]bsÆ&nÃ'’„&@s±¶„uùU\J…F£îålºp®{ •V(.¸1&P\ w“â*¼o9$2ôé“WÚäéÓQ÷z>;?š,܉ë^¿xéºãÉÇ…;á“ñ:þóz‚gï&£î9øN¦‹sõFzÔ'7³ÛùùäféõmíçÉÅåÙ³ÙGw°u¸\éŒÎæØ L¢§Ó¨,c’ÉsmŒº£Û·‹6ÿérúǨ{6›_Læx8í~ì^uÏOb›˜<ç8 îÁÃî|…"bs 2^³‰rØÔwäºfÇ3×½pߟúw“Ù?¾½ò ¨à‰)ç“4/ÜI‹ŸMo~ýÍÕê”I¼âf¦·WW§Á1„†NU}‚gCkM>àï^Ð ýÀÿ¢%y CÑÝÀ„¢Y“WJ;–ê-\ D ù¬÷Ð_|ç+wùÚ‘¾8È=GBÌiygÝ­ìI‘Ö<ÉRÙVž´ª‰Ï²2ÓUð?›iZKðBe?èvñÿ‡föФ8 -ˆNV…l0Ó¿ ñÿ¦™¢úX3SŠ7S¢-ÌtüYmÈ¿Þê’í½{³¦v‘©ö(*STá|?3Ziº93ö¥B”Á.Þ¥BÒà¨%Kð°f+Žð7Þe×–\»ÃƒƒÆ¡;<_\ΦÝQ÷Ëø•ý|÷~±¸¾ù¾ë.f—~6×Åàcí8ÄYžÜË–T¶¹ßÒãD‰<÷Æú^t oÝË>Ðb9Jþ{°ä:Í•}ÈõQeÕ=¾ 1;‰#²^8Zßò`÷àލ¿}EqŽâÈ3´€~Å[SCô1l®ŸÏ>¼½œN^_A¬µÂQ¶)e«Â±-0nŠ<Í\}Žy šŠ»°töIò7^®iýÊ#ìWÚÒ²=ߥ!«úˆÚ7"K*ªqAG{z©Qµn4ä›ëUó}œ hZ}Äù ‡'ø©¥žŠö;¦ê•2Œ'g1¼iØ{]s'ÝÆt+wÒÞ~&øŒdÚŒ˜ÑjkO6;5âÔÓs¤ðp#ÖºÓî¥I{Lž*ºö„ Æí(ûPÒF³9šÜÎÏÖÛö´M?”¶ê‡Ro‡cÑW÷ƒ†…:-5mèBzÑŠzi š¡ê­EzÑ’Ù÷É3 •š,›š"’—EG©ÞÞy¿íä•˺ßçôp¿Ïò)yeÝG€K{Ë_”VØlvóŠˆÞ?Ù«€=ÄQÂUoN¡GLJãg×k(ç-Ñ*ø.åèS,ûAGFnÖhÕêÍP‡¡­"ÑPÚĉ> stream xÚÝW[œ6~Ÿ_”‡©ãŘ۴êCÚM"EÉ6Ùäe›† ðÔÀnÓ_ßclf€¹T])êó}çÂwŽ•YŽõzñËzqõÊ#Ö ¯7°Ö©ES/°BBp@WÖ:±îñ]ûóúÍÕ« ˜RŸ`LmôVd7B–¬ÈÿæÊzá@ðÇ–ý¹¥ÂCªO¿Y[òʦ.jêÑñé^ GÖ’D˜F‘~‘ØüÁãfJ`èâýÒ ÝÝñV²Æ^RJá½ô4wrˆå”©ïj¨LŠv—W~`ò8 Q€¯¹†|°}1™³MÁ/ÀÌ^M4ïÞo»&+Š/¯ÞÙK7B<ÎSó„©‹‡jnÔèµHõ–B±Áº{Ø&Hèu,Ê]Ûp}SòFæ±^§B^àHÅól»ò„/Ô_nÚR±Ùh¤ÉYª9WŠ?¼ËCe"õÒn«™£œWúªã³«XH ‰çÉøy6_’É“6V‘?íë*¾î²¤Á‡uÔ…v£­ù!ÂÆ¡åE’'8ÉËúŒÂ=~©ÂŸ¨úhcXiJJzßê¡/´óå|¢BæÙ,OÉû_gx ÊÁë T!™dxõËøÚ»É§©ó^ï ¦È~ÑP;)2ÉkCq£Õd*›Jè\ÿ ÊŸìU€XÑòYµœÊúD%oyÓÊ}n¶\óè8=Ø]üXf´f\j¹:Ô¦ùðôËõâÏTÇ"ûþáE!\jÅåâþ³c%°ùÆ‚­Ud=v¦¥åA‹ = ëº[|ø¦àë&5Ò|âàüóB¸žì>Áj”Ÿzºé­·‡–¢[Û'ˆ=ª›]³†qÎpèx—8§ðf:­G &}]ó:–ùî+93­7— I·]Bur{—NÕÕÇZ¥þX>³Sò»ã; øú¬ã :fÇ)‹¥hêÉÏúAqcT2™©¯s°í¾5{ýÇ6Ü\ß~|i¶1Æ€H”ê3u)^¢Y={¦Mî¨AáÍV$zölâ‚ÕµVHÇÕ»ÏM‡Îß#åN%+ùÜÁÙCJA^ùþw°'Ž×'úކüõ?‰Ö$\×êž´CüÉ€÷Ùï&Œz®þ»-½Ø”•ÉêéiÿIÿpÄ©ôÐNT‹ƒÖ Ô¸lZý“ 9ïe>LÇ~Ä9 êò8N pú’Üÿ­ˆQ?÷Á&¹]¶¢›“úÉ­s_Ȳþá"h;© ªWCžUfQˆlÙHVÕ ¸å~Äfý{Ø,3]þ6Öë endstream endobj 2921 0 obj << /Length 1284 /Filter /FlateDecode >> stream xÚµVÝ“›6÷_Á[ðL 3íCÒ&éôÚiâæåšéè°ŒiqŸïú×wW+|àrεM_`µ»ZíçO œÒ œïVo6«Wï’ÄÉý< g³sXøQœ8)c~åÎfë\»?¨òãÕûõ§Í÷¯ÞÅl¢剟Ø2zŒG¨´ ¬yÐŽ'ÚÞ¨î…)0#Úôö^4]-ûÙΧþ`1s2ØœÄÆÛÌñXêg#[Ö÷+þÀÐÕý¯¶bÄûš~ú¦jUƒ¢vÆùK"úêO9“Œ‚N«›™ ðC°Ã¬¸Õê8߇B BðXàç<tw™ý[«t3Šð#0E n-Û.D1Ço7«Û•Àa§zó,õ£¬~~²F¦© L“¦_hž>cáySMª›ä“m×^Åû¨‹C-(FÄ3wØ[âNèJ´Åš3×pRwP$i$2EK+mC¥HIíˆ]+ä—¥ÑÝ’ìNÔÛ‰ËYâ™°èŸd‰²/Œ‡)`­Ð·²/tÕ—íâ œ žiüÌÏÒŒ¶OsE6G@Ü­9w)O£HÑ¿‘&?@i››(v±¯ (¦Œ¬²:­j½Z•}'F;¨ªåpÐVC´ýÚcîqf®ÔóݰÓ3[Çþ< ²f6¿ôêòl@XÈK:m2ôõÞN§ïûÏõâµ.l×Qè—áé3^ÜŸ£"›uy†©ûz,вX3(”¦¢˜†=Õ$§}âxþÄ{:D|ùüÏÿ zÆ–Mظ qŸªÝª‡^n?›CÛ˜×yââTý›®~oú«Ÿõtì"j,·×sŠú%¯›Iw͸@Öx„öaÊÆ´-ÃK˜„>O“ÿ„Ø?fãJt]Õ– ¥åe(æÅW®Ó‚ðsgú‰¨ Ò–}É&!j0M(Ý_€Ö0Š|–³/­aBŒÉƒV;>›}‡pÁÚè‘68'¬`+ûªlåÚÜ#È@Åÿ^ÖQÕ n¯j÷@œÛƒÔ–,d]£)–C—ã™BËöÅ09 ”h¥e§eoíI{$ƒ9z/O//NQh¹“`РwÀ]|<ôrðaOÄ!DÃNÐÚTÚ,v!¿< Ý7Ä/TÓÁe ‰˜ÆbÛÔâw[Y•{´ Lø*½WD˜ï¶'-ÊÕOí FÓŠ‚á&(êKâRC ­ibG¸7݉ÖlK"yÜ«=©ÖèCꢞ¹šoÒWjF-ÁÇjѨ~ J@±"pÔ”‹c`æaTÇ94”†ÇÆßÂæ˜vLQ\¨C}ÚïÙ8íïV÷×Ƀљq³ _Gatø¦²¸q‡¹–s6Î1’cÒ€´ãÔ8ÇHOæ–æ 3ê’ˆéœÂÒ ßTÞôÈCÙîL69þov'^V‹eA«pV AÖt»n+SmÄÜiÕœ=5åí¡¢'Jý"ð ƒ[FÕV“™ôFÀ}^ÙÉòd씲áù zîª endstream endobj 2935 0 obj << /Length 742 /Filter /FlateDecode >> stream xÚÕVMSÛ0½çWxàP{Z Ûòggz -t¦C9€9Ñü¡$†XN%Ê¿¯äuÒ((fàÐK$Ko÷­žvµñ¬™åYß&ŸóÉÑiè[Êâ ¶ò©å{Âal%¾bœYym]Û~:¿òïG§q¼Å‘‡ª®-JjÔ•7¤:&Ìïž°DI3›—»ü02E¤-I]ˈÌpóèv ÿ †È3biÝ´{qcü·¼í:1× 2ÙÌüœR ˜q†–¬§DïÀö¥`E%дa\ -‚üâêÄ|<Šàò5øAAi÷p`¶@‚Ÿ£ \ƽºS¡œ_½ßVvœmh;ih³‚ò)a+ÇõíÎñm¦&4Ø”Í]“E(Éí"wë+Ý.'ìNñA`!†DÕdÆp‹ q,5¥JSí25‰y)d¼µgéQº:þÖ¿Š—ÿ\8®ü^V£Ræe/ÖQv8AEò< s!žä“¿Oy®t endstream endobj 2945 0 obj << /Length 1591 /Filter /FlateDecode >> stream xÚ¥XKsÛF ¾ûWðHÍX4ßÎôàN’N;‰š8J/i¹’XKKf—Œ’_`J”E[R:ž1÷`ñX+×ZY®õûÍoó›»7qleNû±5_Zžë:A[‰ç9qYóÒúl¿Ë›P?&_æÞ½ ½}ÅNê ÍPzQ„D7.Ð+pMƒ$5lS?Å€˜•X:b»eYÉ•>’óäÔÏÓÄOì±JÈBL¦AØb;ñS{1™Âÿ^†ÙØæ­ª¾?•7Ôǵ¦^àDnHŠ|E°ª’ÄN–úÀï;Yä?ëÿ*5Ý‹Žœ,aѹ,Öµ:cÍ3ë†g+:¶^â7´ó‰gËÉÔ³ ¤1Í~[Ó·Ó‚+"Äa£`3ŠìEÑVµ$BÝ¢T&²ÝZð^Qo›®Ì4ÝáQ¢Z­ñkØô9§ ˲ھŒ:GíF„¾ BH ºkš´ð%´0Ý/N& ¯VªvM£ PÕ¸½;FF¨ÐdµÌ7´EV‹ÑjSÔÿ1DLDàZÖiï¡€ ´æØ.ó6¿>Vô¶®AãúçB¥8b³aïö’#Ã7ãQ•¯XMc^dŸÈQ9xâG`¦E¾¨6°$® ‹G-åO…EäÂîÃ%–NáEÆãé3<Ø+E+Ô¶’%­™ë‘¤ØÐÆ"—å®*É1£Ñ°Tõ–ƒ €³Ùm¥òf}u(€‘œFuRœÉ ÷Ûº“|EñÄü¿ì3@'÷×y M³ùq¢\ çJΠdœ„\|t·€X)ZgY)Ý:/{{,ÿÕp”¹)_ø”í ]ÔŠïwj/;YhÙ·0†.LËJ·9–L`°’±ØÄ6ןõ=„nv=¼qdIövhÿã¡Ò-­J‘+q˜pþ¤H®ÕÕ¡‘°íº./…ÙËGS!Caf¥¢ ûšÈÍ¥4·‡Ë"1‡öÃýlÛÞ5uÀi•ú‚¬ö®V¨AwÑpÀгW]`M;kÀd.3Œ%ŠJ“ÿ’ý&ßÃp$NLï ï{OëöÜõ~Æب_íSjXv(·=c-3hPL‘ÛåãæÄŒ—½¯”@^î¨oB-j-.pÔ«J7›|¡mŠ©6·)_aùÑwÂæ¢Ws+-ã¥ÐO¢ÜÆý=Éb;ßtâ¹–t¨ 2{©z 1?ˆ¶S}MÎI-Šœ¢­Õq©ÆúÁ>„t±ùz~óõƃ£\ËÛ·ÕA:¾XÅöæó×*arƒd©µ3¤[+„PIBì¨7ÖÇ›'z»ÃÞýÈþžç:1€ ÂÄñÒð´w`³ãvãH±B¥N4,&Vè`<›jdÂ525V2$Њ›¯$ŽLDŽ›Æ×˜€ †#Ïh°œ,ó ê+¡ UQ¶ÿ Ï×ô¡f™¯oúعÈCá—¿8`c¥¬9tÀ1¨ °Ÿ+¨¤%)·#I½Ù˜”±£¤bö ?ѰÀ´ë¼íe1—cÏn©U©.P¥A+d¯WQ9œQBƒðƒûý: iL¿¢eö;Òš†“eЗ§ªtýÂ6†?'µÔÊê‡'‰ªIšÙsìø€ùÕH/{”ìÛkDûahÿ![}E+^_ö|¼æ„'¶}¯j|ÿ|zwÿþå#,™=«MY0 ¡ñ%¬-úT«¥XæÝ¦½ÅYз §ö.JïŽeWô1~Z¶Ad“«ª2†·©”ÃAFn –z_bo߇¶³ì·Í@gP§FÌÍ,PhÃ`ÿ¼¢)kj^C´rÜ+ÀTõïL–wMlË›J–}|Ý_ôB޳áe…Y‘?ÁvV1âî¾t«:ÓâÁs˜}xSËþ1MózÁ?€VÇØ@ôÒžs5ì!õ3î ÷îåSŒÏÌèà%oˆ'½Ôþõ;âcÆ9hà° •¼vÀ¦Kjï'¯¦±,|æ§¡}VŽë6‘FíÌü`t¤:ÿ&"ÚÛ1`&«Ý޹vŸËFù`—²`äºö¯ô™}zûv”XŠÝáf:ÒØü¾½ ƒ{=Êxb7(®ÿ#/Y endstream endobj 2959 0 obj << /Length 1388 /Filter /FlateDecode >> stream xÚÕXKoÛ8¾çWØÃÊ@¬ê-«À¼hRt‘ÙÄÙK²Æ¢-ôp(*NþýÎpHY’Ç z)ŠFEÎ|óø†C;£ÕÈ}=ùs~òé,µŒÄÿhujÌðÏKýy8`_?]î<×y#[_€!pÃNôà5°”‡Ô‡LÖ<_Ò˜Õô•gò =G§±2Ê-ÙÀ-Z%+¸–°¨„àÅliP5ÉoU™âêD¹_=IÒ´6±<ÏëSŒ‰c€„p%VÁ¤Èžõ·T+ öVyS”4&€{J“‚ÛEµM ŸDá4»z×ê$7˜Š3€Ï>À‰ñB`ûNüF <ª%=¥ùTpÉLD#KåbžRLÈ]„¶Fô”l4µU1Ôó{Øãí+¡„#E>e)O5QkÖ® â›LPN8F‹Û×âZk&Ð4ø¡ý+襅»åJrN+ý¶Ü{`5ygJewmÌ÷ÁVr~P„UnPt‡™‚•%§ø’Chr“å9Ö "Í1îf'§/F¨ñ®oøÑ~Ü×Dä•ÄŠÉ4O}Uœm1Â7ßH†y-æ*¢)N¢ ¤ˆï$Ö:ç ÏYœGÐb‚á­$ßâÏë<[d2Ù×3l  èü„öt$0MixµS…oE¾r97¿|y³«Ã 9Û^`m£†{ÏD=(/U#×xú4ò˜ßþ'Ðç ß‹}øKÕà7+.aj4Ó R>†“}{í t=VË®y#L Ù)/¢éóù·ß÷¢:›Ÿüñóù( endstream endobj 2967 0 obj << /Length 1297 /Filter /FlateDecode >> stream xÚWKoÛ8¾ûWè¡P+’¨—±è!»M-šl7qNiŒDÛ*ôp)¹Žûëw†C9²­8ö ‡äð›÷صæ–ký=ús:ºøEÖÄ™D~dMg–çº"+ö<'âkšY¬”j.»¿¦vÂÙeÓÛOØÆþ>ý|ñ1ðz·ÆÜ’€yaŒ»#×¼Ó}áxÜ;îÆÖØÅé­o¾çîÜ=x"t]v#×ö˜»Á3š†Öi­”l–öxu•åÕœøm_ÎÚ…$ÆLŠvGͶU3“p7#†¨²‹Z™Í…ÌÕ°xÛc•=öØœ¤/•#x׳Æ`ÄI’bYž¶y §9ç¬Aúm gª.ÆðsK¡âDÞjý“]ó€M Þ¢§XzÜKÇñ9–¾4ˆó ÍÜʹ­6 k­P)²rÎ×…³O•‘zU>Ê ]Öœ¢’û¿´˜ÉüáFì‡è)éìûë˯DušU´¬gômÑ×:‚`ñs%Õ†ÈTEÓ‚èg¹Ævµ¢L\x^Ÿ¡H$”¬RÙñFé¹j0¦Ï1q³¯ªF<Ü­®¦£Ÿ#O_÷¶©Æ‘¦KËÑÃw×Ê`ï3ç“ÄZë“¥ 8à@ÖÝèßO¹ýò²Çó\'áa˜8Á@¹ ݉“FŸ²IU¾ÔáóB ÷#ÓK ºŽŸ˜ xæ ¤;(¹š[?šà5êía£@î9þÄTžûF€À!$È’#ÈÞ¼±uÝqú–²]ÔÑ3¬–H¤…h ¬˜$à[x'FYß÷ûׯ¸»µUGÐ77t·YÃw<¶÷ô¹¹ÿòå>º'góÊ1“ƒ"ËLy'ÏšÓSˆgX­ûç§·÷Wƒç+á¨ò´£Žãhöx@m0‰wJ„\ªùª”•Í}Ö6G#å•y:^‚c߇<=·AÜÉ´‡ã’±ùè¼ Ê»8hIçóS S׆Ò[È¡ÞÃù*<ÊcEMSвțnc6ø”£ão–†×lôQsx1™#à1Km B‰ÚW 5¸ û…• Þ¯zA™Ð‹X!«y»À¼}"ÅßÓ'Õ¬w´Ø`÷yûV*–4“É 3ŸÕ]V£<œ1] ÉM7]~Ù`;Q¬h23C#ï†F €V¨–öjêÝHJ0_Vç·F0-Q•(åQÇŒ·¸zîéU£ÎñÑ9]ûH|ƒ*> stream xÚV[oÓ0~ﯰúB*‘̹'ç8­FŸçÓÁÙeà¢ÔI#/BÓ%r1vü B±ë:‘Ÿ¢éÍ,7LFwÓ«³Ë(2Lý0rB7…@Òè3åär”ø%¼©©p`çb:ø3pá#w—"Š='‰C”•ƒÙF ؼB°•&èQš–(qàÃ{n_vñöŸªŽÄ¬ÃÅN•Eaत…Ø K ß™&¶Æ£ÐµV«Z<¨|'œŽl?L,ú´QËŒåÕZ­UKñŒ­²)x¾)´åRzŠ”Ê^Ùä#ÛµÖ¼R_D™²|½:à&Ñö“£×¨È z=±$±"ë#eYo¸(Ð$«%­+œÙv°§¼?"k LTìûVMá#y@žZÉ ®[¼Îç W,ªdÑ"Ê„í½ø €2r-.Xg'-${{–•…z[Vµr^é´:£ÜL%ƒ E0Gi¼ÃŒ-Êò±ZB·Œ¬h/=ü$‡ù1¤ø‡XD”Æ>¤t4Ôéªù/šñ·rw·¶°»›‘Ú,!¼³&%pbl½W¡XÖ~ÃÞ ‚>Öñ¹¾LzM cäù4SVT¼ dA8JS»§j`Ä=å0Æõª)á\}Ïâìè¡? ÅòÞHè¨{f1ˆu¬”sC›šp¥žj%…V_3£`$v¢tïðŽçôEÎIζÛF•#êÁ¾LŽãðǵT“Ù£YU4åZaÊ¡?õ«*η ñjÛ¹† _A™’æQœ¡×ËWØ”®Å×PÃ4Ñ º$0·5“j„´Ž[=žÈªêŒ#ý~Ÿ›CNŒ8&F#bõ¹ËŸ€{:Y²ãŽ#ˆ_"`@¨x—'N~S{!>ãe]•¸B8µ¿ÒÈoèÜ7_)Èi­[‚èlIWÅP”î\µ½'r¡£™¥ýcÎï_жôB½çëî0Èxë$[á„ê/žH ¿ ìôË%`Q°%ÃM ­@Í:næeö“• èáö¤T0 [ýsך¨ÙüÎVϾJdŒ»îzvšÓ½ø¶/a;¾ ŸLÂLÏá^RWÄÅøÒ“ {ƒ¼¸à$ño2“;ovZ0v¬R;¹ïÛëg÷ÔˆÖ{J¢¦–ŒÙìîîÅ$1þÿ ¸ÛQ endstream endobj 2984 0 obj << /Length 1158 /Filter /FlateDecode >> stream xÚµVK“£6¾ûWp„ª˜H¨J“d7©­šC'9ÌîA²M ðx’_Ÿnµ„‡ÍãbIôCýu«¿6óvó~X}»Y½y'¥—‡¹Œ¥·Ùzc!ÒK£(”<÷6¥wçßVí­z >nÞ¿y'¢ mžË0c|½(ÉQiŬû·›Õ«¶Ì‹&Ï2Â4æ^Ѭî>2¯á{DyæŒjã ¸<è¶ö~Yý4ù»^Mø"» ?b¡„eÂCñ<üÉPçfwëŒ æßëÈ?ê?ƒ5OR_á’ùED¾®êªÝÑÕ–¤ðñ¤Ciדdì¬F¬ásMjª>ê$Uk5hiÔØWÚr²Dë—äŠr"J*#XMN¾×CÑW‡±êÚYbÎ š:ʼuÌ”'d~c³Ä¹AÂdé"IpVpn1Ÿ%©Q®ÖqFÉ‚/&Yè ®ió$‰ïrg“+w¿ÈÕÀ5FÇã0ÉbŠî×Aíô"¬˜Ù 0éå|` +Õ¨¾‚¢2æ7UëvF½&¤›~wltð؇CûLHÈÕSžUên¤qêßR²Lâ(á‚LÍ—m¯}íåòV†B!môùå;e w~²÷¦îºîXN¶úûÊJWçÉŒŽ§Êù³ötèõ¡V….Ò¸'tMe^Ü+@q ê'|(EQLÁ9>L˜ œ©œ€ ˆ"%·Â`K}+!lØI¥S%xÜEû¹wö[Û«þAWÿ¬Çcß³v£fÞŽÚvíjÑo»¾±ÍŽ˜õ ?ÕçD—°)€ì‹t^Ðð`oŸTs¨õðú¶ÎÀ™g”ÎÜU~¤þzí±º>§oßÐÒßWm× ¨}KCõ—žK˜•úî~&aaLd «ÔöÝi¦”8J1ï•…yrõÂç9GÍ\Å™³fqf°åË—ÇQ,²0‹¢ÿwvÇœ…I,º'xe·êS¼<Áœàß©º8ÖjtãÖYãÅîõ Öãh².—¡"UÄé3z£ JÏù¿½‚ÌÔ½Æîî ˆ9p_tÍá8ÚƒÂøGãéÑÙt[Z÷Ÿ&GHÏ5 YH?èASK•»Û©4zÕkÈ–¿ ðŽYHðÒâ\Ø;H!úáüš#xͶÞÚ¼j‘KdŠ´B›º3,Yàÿ*<·ºÚíÑ¡åà~o)Çü"ÝHéoxGµF# Ì Nö$- ^üŽ­S[ûz&ð)WèðLÌß Íå©¥î®LÓ•á:Ø”Ó ¹iyv‹Ô("R†!ái×wÇm1¦¢;Ö%åy¢Ìd7S ð`)·Ðë =êÑ+Ewa)ý:·ZõzÝá*§Öo[Òæ´Wã˜^µ˜Ÿ Ý›¤e“¯sŠè³y°j ƒ™ú™+2lÜ$MMŽMƒ*7(³ |>Ïü¼ìð%“þïøõäÜ]£ܾ¼´Ñe¥¬Š*ún°ÑáØ_kJäþØ1O¾Ì™§i"6ÄX³‘é¦`]‡‹<ô7)’O> endstream endobj 2995 0 obj << /Length 1035 /Filter /FlateDecode >> stream xÚ­VËrÛ6Ýë+8Y‘3|f& wì¤Ó‰5GnN Q¨ù*@Úr¿¾*"MËV§+’—¸÷…¬ÂBÖçůëÅûOg¥nù‘µÞZB."+ö<7©µÎ­;Û‹ócýûûOQt½[b/Ž‘}Íö"#­³ô›þFIWdz[¹bŒ#ð-EÖÒá ëýo)èÿÒöIŽÙ&ÖÒK\œ$z# ÂêâšvœeßQ¨X+8œç¦a¨qÍæ/šu¿¨ßhü«àMßÂ&îá³Nó>ëXS;Ë!û£~¼k3ònŸ³JŒ Þx?B…cL¤1Ù»cFhv7ÚŽ½Î£(ß4‚Žë›Û+…]Î(ªz:Fº”7á‡nÇwÁ‹¾¢µƒ}»'¯ö•+ÕW5 &o‡AìÇö7ÚsÒ9KŒ1,‚£DöÜÊd†^è¦(x~õ§zÒág×.œ0´ gdSRmÙ6\¿ä¤#‚žÃägŒ¤} ñçŽe¤ÞN: Ü ù@y«IY>i«ÚŸ\‹–d†f×èg/è UTŸ$J.™¡"¦Îœ¥gŸãðþ´·XJ±¢¬ØI-6ª ú×ÒÔW 䨦\«0°¡{R±Úèa ™Y«bâ š:AO #©^“=« /åH°¨fÕlµ¥l“ n”úW==à®QÒÈüXãÀΚªí»s4–5ã$õHR¿â|PÖÐèkãZE%ìΈYÏßÈw„ƒ:?ä)‹†³nWéÕ²royc„¹¹X­†ªóÆs UítÑðU|ж$’à“ÐÎ[Þœ ¯] ^«v8i§èç›Ø´ÅN*Ü íz>$Ñ,$%¨^ƒ`CLè*ŽÄØnìJ¦ÿ^&—|уUuÄIY¢ägÝÀvFËR±¿Z/þ^x@YÞaÀ²]á¬ZÜý@V?¡—¸8M¬G­¬ÚD`x/­o‹¯/Ö{=sŒJ¾‡Ü$ÂðL£àÐÊåTaŠi Fé¸&²/Õ©!´0$oèÛ´î˜4©ä !ë÷-ء꡺7áðTZ´ÚÊJ!ø¨$hÕ—õñÓÄM`::C­C03{ùØb_ëpIEÆYû¬¼1¸.¹ŠîG/Q¨Â ;:92õŒòQõ.°©hPÖ-@{Nõ‚«åý¹«r0ÛòœBÛÑöJ1ý±Ê¸~­£#\6ÝKd37«@fnȆ•¬cT¸oIËÿs®<Æÿ8Z²BÒõFÃÖêöË—`ÿ° 7¤$u&ÅžÌq³[—M±ÍÜnw¸kÊñ"äúáì""y¼7«‹ù‘W6Á‚Öt2÷šIõ™øQÿwãò endstream endobj 2904 0 obj << /Type /ObjStm /N 100 /First 972 /Length 1674 /Filter /FlateDecode >> stream xÚÍY]o[7 }ϯÐãö¢+‰’€ @Ú,]š Ø–õÁMÜ.[k¶´ÿ~‡rÜ:½^;v; ixï=’(ò"•Tª¸àbÌä"«K¥Vkt©†à©c!¼Mö":JÅ„ä(³añ9{“p´iØ)Õ¼©N 05—É01ºœóeW’-“+šM g?ØU©&ˆ‹!ˆI Ih­tpxxÐ|?tÝÑh4žtg7¯fíù—ëÑ?Ýãñäj8¹ˆ÷ð²û¹{Ö=¹ˆíá {1¼œ¹ 0Ø8Nñ¹BÉ>œT³‡Å€;r‡‡®;sÝÓñùØuÇG~ú~0™ÿ5Þ f“ë?ºGðÏ4:vHë¼pÝo¿ÿájõ†æÄ^ úèæíÛ—kÁÈ oz¸­lõFÞ š“Wí«IbÌüp}2ÍšO0¹ ;AL[Ö¼}ÈÎ2çíCq–=o#‘Ýæ-0ì ³w§“ñåÙžtÝéñ‰ë·fîÓÂsrœÞ º'Pb8šM-‰¶ÙŒÓñÍär8'ÖöîùðêzðxüÁ5Ú(Rv® <8L0Ú€Ô€K†°Ã ·³ï€VSÐP‘Pû¡…ÙǾSsɾà\Ø Z¢Ï1þÐL>†ÜMp8М8{í‰Æ)íCŠëø‡òwƒa™åwø¿Lù-Q)Þ€X·€6€eð×`ZÀRYûASm'B?4×ä­Rè‰fäôÞ»¤Â> „뉦쭚ê‡Nš¼Õx{AÃó\÷„Žì§-Ž—^áµu@‘Ü(¢í åsÿ€Z= V¡SŠÈZu—Yk'yŠW˜•74ë¼6œbáÖ@˜>­±¸âB˜3à ¶­+‰-‹ žÌ(žPjq ¾Xµ]Ès.këÊóÉ`4}=œfƒåšòaÚ0¢&Xu«@µŠÿ+Ú<ƒ#ÞL³áOï^ ¯®®Go¦»S ̓GØ$ ȉè[3Šësô’h­NàÑßÿëó£ÓÝéBR¼uŒh@=Z&‚rq!Õ‹æµÊœ\®.;]þ5žL¿ì¬¯íʼ"8Ñôyc}?4)òéÊ nh¸ÌÚé~èÉç²EªÞoñ/õ~N‘¼}N‘E*‘E*‘´h—9%R:šc*’¶~Ýs̨fÕ“®â§ÃÙÑt:ø¸ÛœBÈ%v¥”’zAòdb¯hÖ-„ÒÄï~2ÜB›hÖ®½,p‘ñê3’ï“á>)…ßI,kkiìÒA¯6Jq-ФlM–ÁŸê[(+õD[;£e›Â`m/5ú[ǰæû1¬Ò3†sºüˆXYz+(ï4†-—'µû.”g8ýŠ‚ l—]vð|ã¨IÐ"ÛÕŠ8‹ %´ :¯!}§²@¥Åš Žb‹` ³Èvúmë‚P$+Û²¥—Ðd…vm\¼¦õiålxûÜ ^Õ ‚wü9xA—P÷ƒFPõDs¶4/=Ñ”vÓ]Þ Þ½¹“avÒzä­G¦ÍR̲Yò&e`^ÕÑeØpe¾t¬žW–˜«Ð¢¡™{¢[a´'™×K)}Ñ,è[éÇÓ¾©Tø>•JÚžJ…6 Ò2ø39¢¯‰öƒŽÖ:ÅžhÔhèúê-ÁÚ´Üͱ¬IQ«ÐÖ Õ•—«ÐögŽÞ›Ü+ê³òжi-¥·&q]‘ëæùð_ŽÐHý endstream endobj 3006 0 obj << /Length 2175 /Filter /FlateDecode >> stream xÚµXYÛF~÷¯ü2ÔÂdxSJ°ãk“]çÀìYÀ^-ª%õ†‡Ò$g4ÿ>U]Õ)·gœꫪ»ºê«£.ö‹pñg/oŸ}ó6Ïë`Çùâv·ˆÂ0HÒ|QDQ'ëÅívñÁûQºR—~¼òä÷Rô5 þ{ûÏoަф÷ƒŸDEzQáê³O²Õ„,. ›,|nÍ ½ìú`èäÒÏÂÐû;5ÏïUU¶§ç/p7ØÉ™ÖYFµ8¥¬ª.Øëv8Îzÿî“©Õ[©ƒÍCpÔífÆr{óþ“Åì,_w@Mš’AY‰®›ßÆ®}2k·Ê‰ÿ¨ûMÐ?/ñ¯ŸÝJØ•A#ê bq·ÿTµûøí+7ÓñNTA9ôín7c ƒ0s2A`¦ý5nºö1Ì"†B:±±­ÀÀy®ˆìZï‡Z6Ë$öúnŽËö,¸O´ Ò,e nþ'Ëþ^s¦E\x×ÍÒO’Ä3vÎ=×ô¼2ˆEtŒÚʦ¢'Ήáœ€r ~Ñ«ÀI¼^yl~ìö-µ[ù1LÒFÒ¨ú7¤—šÉv­þ$ŽBï8²Š†Zs‡Œî@»é1¤þÕL6\=ªÖé§fM{\•Õ2ò82ò|cç"Ö«xnç^ê^Ky"æ±¹¶æF[êÓ OÂn7ëh~‡aGPÓ´&Žl% U3[-«¡ƒ³ø8•RF)ªÙÓüS‘DÄjùû ´´Hƒ_°Zh4#uo>³ÿ–—ƒª¶¯hó[Øüqû'IJšÎƒ@kÞ“Ò̆¥dê¡y þ¨ôÏP ¯—~šg^'Ëí‘æ¹až)˜H` cæÚú(´êÚ”‹ªSYš˜Èç‚”÷‚ö21wˆªŠúmö, ÙÔÅó¿·™Hq¢H~§äÐÎ]'˜à—€ÕG\÷дÇU‰²3ÄʈiÄ>.ªŽZD¤ÜR¿o¿xâ$’8tæJ!h-8›`sÄãÅÒx¹L j¦žC ÅÑ)ž³0ƒ‹¬ô?èDSÂ]÷Œº¿T- .’U÷;Ê>"HlsAsMöÍ¡zGí^6²#î{Õ¦îÔÚ¡IËÝ”LVŠà©@ŸÅŠ$JH¢ý‚Å¡­½â¨šŒû;U+¼0d,a(Bá ¥Ö^º÷ò•"4'¢î_`T‹¼¶¡i$I´ØK^|L%EÇÝÿø;Ùô· ÌžH-ÁP.TAžá®>T •4IÛO£1H`=žz¿´! Ák¹cÄÄ¿–&¬ö±ÚÇ–Š±¥Ÿ¯RïµÜ‰¡êiA1a‘,ò2&ù¡)5\5æ÷Ò,ÆÎW rË†Ç²Ï ÿ »¡){Õ6/3ƒ±…kÕYd™« ö>@íñ~œ¡@<<î™ Ó@ÇÁxšÏhLì¸ÅÖýQ¿×ê4U,(¦_ÖÜå‘ÉOçò(1•0B@^<èlûæöÙÒíh' endstream endobj 3011 0 obj << /Length 1982 /Filter /FlateDecode >> stream xÚµXY“Ó8~çW¤xY§ {|;áv¹ †}­-ÅV-¾äafýv«%Ç’©…'KÝ:º¿>åp±[„‹gwžß9{šF‹u°Îã|q¾]Da$i¾(¢(È“õâ¼Z|ô¢<^þuþûÙÓ<Ÿ,ýè'QQ„Þ+q©JÖ/ýxåñçœé†-#¯ÇwB{‘ûÂmÅì¶$ȳ…@Jè²OqÎö^“𣟅¡wWß]úi’y÷—~žæÞ‹Š·K@‹í1*ñ)L.Õµåpïr郌’+Å+¤¦ÞŽ·\ÑpCºhÜøu‡C ç@êì.Ù ½¢s»-ÊM¢.|pe¤SÉë%Iâ J´;ê=ÇAê½×ƒÿ7»Lûš+\b žï.Ê‚8Ên^ËwÑv b˜Ãu4ÁK À¬Àu€² (vE|~y€¦F"Œ…±@ÌVÆ,÷¤îd#°`\¾…ƒIF2b‚NL‹ s1ŒŠ ,ÍP0Éjñ¯‘µh9“´¹éŒ¬¯ äÝL˜Š“YºGÛN’ñ>¼záo˜ÑéÓ0Ñê‡-—ßÊrfPªkÁzq£õ’Õúˆõy< 3±N­ÝpxÜý‘ãHh7ÚEV:aC´[’vásÿl…vCÊT#¢Ì,…g)K­ÈR~åÖ6pžµ ¬!ÛÀmsÌžÿÇ^·‹´—ï0Æ@`Œ±$Fi}ên±$”%$ß¡]¢‘ø[‰©Š5°ŠS摟‰£;ÚQqÍeù`rÿ”aÆl˜EóøÈÚb½òu­Òr(µ èØˆ K@d'/ÌfòÂüJ´ N?jƒJ”šbœ×ø Þ ƒY'”j/,à ‡æ.ørVâÚ=ͶP{Éi"ÚJ\ˆj°Š…µÕLxe×ôLr—w÷Â:ŠoFS?$>3;x!Í¿ ½§£]µøl2Q-ö„‡Ý@‹È¤`QL°ö²_™ô_=xþSFâ¡ãº¬‘œÈöG²FòY#^Å.kÄ«Èe ¤2úì9dUsšO ‚sÍÕº“FX$tôUå»×|Å¿ÐÃ? ¸ù æe×Cq>âµ"Ù°'ßû¼Ì2íøÔiÀÀCk º·œÇOì °0(ó«ŒüøÉ{þ%þ¹fÆ~©EGÅÁ¯°v’%‡‘ŒÙ9K<* UÙµ°ËÍT†ø¢â4þº./Ð*®fÇÌ[s%´ G³õIý$äB±´ÉtI‘CS”…/;TZô ·%;è(«#sô§]‰é€xˆ Ö`Ülò(¼¥õ> s,d%á‹SÉ4G@pžêJ€ƒ®C;ÈÕl Û0]=4í¼«N'BšüŒ$,7×4W7Z8œ‹ÙK½ ôUÏ¿c\ eá)Íߥ8·?‚®F;Ĺ­¥ÀzôîÅû·ïhìÂÞ%fS>¡Ã²bY6å¨æÙŠƒšÙ¼QS¡ÎÉJ®È²Éµ©1¿Òä×àbzù– µ zî¤ÞonÛ2hYóSð5£¾'¥X¸Æ¸@­ëŠFÔ³±vÇMG”~ÛwàªCßZºuæ¹ J›Ô€ÇméZµÔyÕ)”D;û#—`NêMȘ'ÂV‚§ñÃÖÔ¼Øý M]üE~tk8û Vå »íöfHc„ô­aJa=X™a§ß!6³Tû N:(&Eh,Ý»ÖúÕ÷ƒË=Xì¬ n?GñÈÝÐØîϺ`ÏÔø[Æ> stream xÚ•]oÛ6ðÝ¿BÈ“Dªd}zÀܦZ¤A–¸Ã€´™¶µH”'JÍúïwÇ;¥’£9õ‹yïxß´om-ßúmöv5{s™$ÖÂ[$óÄZm¬À÷½0J¬4¼$\X«µuo*þÕ¹Ø;î<³åÕ…ËÒùºúøæ2 ´á"ñ2?„› U„ˆ4ó™ÙûÕìŸY oÏ|’4ö’dnåÕìþ«o­áð£G‹Ìz2¨•(i„×–ÖÝì÷çûW£L” • |/“8e²‘2 Çr$b1 ½wã,òí+Ç ìBI'lÑ8n§öºÐyST… O[ú*”(¿ëBã.³kEë kóSšKÖ„ýîöÃÝÍ-áÀmxbŽ¥b¢ž‘oÚlQâÅÑ)V#ëD®N‚0²Î…DÝöm ­óÃJ#—™å™flÜÕÎ JíM§rs ì›c§ÙÔMÅÒ]ÿù[¡åš>ß¼[ ‘¦¶9ÜŽvÕ0 1/…æ;µÜ‹F´²üN{¡ÖÌ¿©7Nì¿eÞjT ”qÁB‹8&Á\’…­»½¹¤HGmM;Q:]œË²Ô(nh;¦"º18õB¥™²È>‡Ã4³‹–:-5Óa(mfñèьø´î›Båždœ¼®È µ’$à¤b›¦®€ ‡*Ânhr|šÖBí»–@£6¬åZôg´~ZÞÝñUxqj?:pØÊžn+Á 힊–ù:>õD.âNJíq…†¬‹ñ6½Œ£õ³F~Sq:·ÙTܦ/ŠÂ?ö!;³~@sìÌ¢€ ¢.ö}ûWZ®?_]O¹D­‹J{èÎvDüOão¤h»FNÑ„þ$I#×ñ«÷(ÇRŠMi‰I8À擪îs略g7·«·Ó÷‚S%¦É{+•œÆV­gÆø×«ÿÁÞç㛃iƒ|“ÍC­åuuûùý´Àõv“{íL¾«Ë±M|owlˆàXØÆÜP—Ͷ« kÃ9gíÉq› ò *ô½¥œKÌÚ0‚ç¬çZû$ðK‘„*×A-õ/ŠƒvÃlœsà¨0ñ…<,EX¥ÃˆJ ðíÐ?@— `Ø6 µ¥WÐŽM+Ò‹ÄÔ(o@cš5Ô›+¹üÑ›a‡ÎS :ì§4 _¦îQ=ç¨çuW!.iÍÐàL}2.é;Ü,•†”e){« 3£Ê«r†0ìLWŒ#¢¦‰·Èæ@=‡0f?‘œÃW}GRf½ÁكѰé ëxv4Gè±=쨒ƒ —º£N Ð)·=>‰ôˆ¶Å`ç`T¢’§D„)šÇCóï'ƒöZv‡ÞÀˆb4ÀSWáü\†rÓS®é”꓈ò-²os òYÊ>K±‚™ƒ~>ÅzÜ^¯_Ÿd+8ODåuÙUŠ„äóF40yŒ]æEy;œ1~6õû¾ôº¹¯!†ÆI£jå’`EoÖƒ®,yƒâRjMß{=ìŽV 3P‚½oAŒ‹ç‹±ò0hN1[ßx»ófXBPºz e†ö šêßa?±þ]Áãμ껕š]†›šV +MàÓSÅÌ¿;úQ‹'œô“€‚0#Ê7Ǹ†V>̦”B3ø§»13Âë^¡l¤ÊåÔ ‚ tuav-¥>ܦhv·ƒoSàúd¸âËÍÅFLü©éö©»½&cWóÂgLo— ¹]ÙÒAÁˆ0Ÿ˜Q>¨¼UÐb?3W™ªÇM^®ÙÕø*4‰¼ã¨ìŸ’ç gw.¸†W…æ %UÅ£3w]l¡2d×àO‰ÿÞeCŠ endstream endobj 3025 0 obj << /Length 1334 /Filter /FlateDecode >> stream xÚµWÉrã6½ë+Xs"«LÀ‡œxÉLÙ“Š-'Ï ’p±AÈËß§eQ¦·JrØÝht¿^Eœ•CœÓÙÏóÙ瓘:EP¤aêÌ—%$ˆâÔÉ( Ò¨pæ•síÒ4ö~Ì¿~>IÓÑk? I–¸çWg^¹ó/=¿=âæîæågÄ>oÄ;‰ã‡|EFû^‘º¬ÞðÑ»#ûrǧE@s÷‚«l{Ï¢Èeø»—|#™2¤náùIâþÅKe˜÷B­ ëì-=´W«ŠWFB´†¤ÖÜ$¯6¥¥÷u§mêñ|v;£`%qè¸\‹³Ô)›ÙõâTÀüê«È{-Ú81`›Åœkçröû3—É(:ù®÷”)à‘Â/‰-~ç]Åj¡ÿäbµV½_Ö¬ï÷ðO‹Qàò˜¸sí_’Ã}/¡®Õáe™kôæ/[e“Þ&2N>â­ñ*žÈ¹$M‚"£Æ«#Þ—RÜhÜ?žÆ9LÎÎó!ÌÚ;Œ7x¹Šâ—ö¤ dú(ì/kíw«¹lx%˜²j+¦˜9õª“lÅŸéQkƒV‚o©V²A»²Á®Ì}D'±2­"±^ÜãÓ[[á"¥`æ)%nº¤9J^ƒe–.Úe'f-çÕÀ–9ÜhX¸DYÑ® ±êð¡û¶W’³ÆÐXËêÇ^Û_¾UÉ^Ošl:±Ày>u¹GÝ•L‚ûNb:Ê(½¯ÝÑV{ùlåèHP[¹8 /Ç®’¬í— oÍ0I;rå Ç‹ÓÙ´ ›Z mÇ74bÑÉý‚š°'°–yæI->—Ð=úÉ„ÞÑ¿œØ'¸×èµèÕ«¦ù !C—Ó¢"²4Ç!1P ÈÛ„ÔWÆ)Ø›+w^b;¶–YÊ®1 V£‚±^4Wðgøåã@ÓšæØE¨%öø¶sß íè–6)° ѬxË3©ÿÔØã-O÷*Ñð¶‡4eõ^ïý‰—7L²¦ÿpT3b£€Cϱ¦oz^m‹jìƒ)˜½^=.Þ ÚûMïKèUt)Þvê-†Q ˆº\!!Ó~ Ck3$­²Ä8!CòɇKxhÑn¥J—²ë­¨®o¤áä­ßì7t#ú*QÓ ¡%éÊÁÖ”îøv°×5þƇ¹l¹ øSj¿š¿U¿]Ù5 ª}µK¥QÑ¡ïV¯GÞN‘m!Jv/Nå()‚4‰þß$ŠÃ í ru6¬ÏV¿½Õ#ÆÝãhˆ{ƒö¦><¿ ©Û³æ¦Æ\Á…—„PÐ\/)†„c¤ ÛqK]ñDq©•@ X®»íÍ{u% BËÂD¡4 ŠœŽ‡n´°Í¿øæÙ[³ á$9/OEÛ »q ä&«ƒCYˆîâAÜ™Ð\Oª—#E³ ¥Ñ³?…yò´³ÿ»ýéKÅÍøK,0h'=gÍU~&!àÙmøi˜¦Ha±jù "p§‹ÊPJ^×VÊÌ $6(`BoÃ1Ä6°2’üaØO°!›.x~Û¶S¸‡M,ƒ¦b¶=è•€­úwÍç«—¹×æóûæô¨"†D‹Gc›»þ99˜rÇÌ?Ý3~2?Ÿ~ÿöiRövÃZ%Í]qdcaÛ ÙFuó5,¥ë‘øÉáÙåñ¤ö†=… ÕŽt2mì^«±€`¢?²Ž˜“êö…e,÷$Ázš|ùŽËEןž_\kYùmeîG*õ~„ËÛ endstream endobj 3038 0 obj << /Length 1051 /Filter /FlateDecode >> stream xÚ•VßoÛ6~÷_! }€I!EêW°=xK²µhÓ5Q·‡´d‹¶5HV"RmòßïÈ£\Éu<L‰º;~÷ñø‰³vˆóûì×|vvÇNdq;ùÊ¡„ŒÇNBi³ÌÉKçνÕzã…©»ð|øo;YRz_ò·gWœŽÜY)aÜ8Ò8ÒF3b×k>²ös?L`’¡Ó¼[÷Øz,t•œ¸ï.cO! š` vñ¯Xª}c¸w>OÂĽ}W(ÏgŒ“çG±«=Ï眻s)ÄÏjƒ†žNÉ{ÊXVŸ ã¢ÄYà§Ð”=ákY¨ý6… …d ÈÊ|÷ÀŽÓ#ŽOÓ€sK“^àéxrQÉ]Ú®†Bi4À¾VÕ}-«íúrî~&ù#ÿ0`¥$V8ÃwúØ}±UU-Ž#gz[òaíãÁ„ñÃZ{i'Vm‡p—uuqšÍXªj·§ ã–Ô^µù¦rs_¨ñý½@e§·‘DzÔŸ¢@ Îè˜M¡taC¾­í«†¹- ùaJvaJa>ˆÁÇ>,0ºTøª‰ñ5R'‰ƒ, !dQ„Éhºl _à^!W•Dª®@¢Y„6Ö«W°„¸×­Â‡®ßž Ò•F@}²I÷56?û8>¥x¸Mÿ¨  -D‡AÀ`ÍÉZ—ÛR—ÜuË|ö0£†Oº»½„iÀÝÂY6³»/Ä)á#‡©ÔùfL‡ƒR&\ßTjçvöñY:ÌizÍ€,cض0N:Ðb®H‹ñÍhDhœMãÄ6·(µž^D]ÓÂ`æ·]ˆÃÉEq@Âð%ÉaüÀ=/¤If–ï !—]uÿCÏü¿k«õÊK&‡«s6ÜTQÕò'|ƒ:,†¦-…ØÓ–Ò´?w .8ÏØô±‡£¸à¤æ,ÙÇ›„ïn$Þž™[ƒ š×²}æàœ€bŸ£1žóó#U³?B)ü×Éß@ endstream endobj 3049 0 obj << /Length 1200 /Filter /FlateDecode >> stream xÚ•W[›8~ϯ@™‚‹ÁÜvÕ‡YMg·Õj´í¤êôœ„Š@ d.ûë÷ aØD£‰ããsýüÙ±´fiÎþXÎÞÝ ®…,ôlO[®5nYÌžæsÎ<'Ô–‰ö sÏ3~,?½»õ¼žªãLX )¥»»²¢F½™Õ˜ÿ°œýšq˜Zï,{¾ÇáhñnöðÃÒXü¤ÁRhOJu§ p¥eÚýìsgït¤ðƒ~øÜb$ä¹! xøfdJØÛö`ްô¿ “ëéf›Ám˜Žëëwæ+ÃåzQV( ô4§ñ&ÝuvÇ3>óm~I¦”‘iˆgÃèٔѬâ2Ý×i‘Ò:¦7lj ™<`NÐö˜œãèOi–Ñ,.²¢Ä©Ðë­$Ù¯ƒ,_še™eM£<¡I£'ôKdؾ2Lø¤:B±(ö оAUξZ¯®'µ01ÛežåR"_«h#G+0R‘`¢"‘ï–k¡5¥è€g¡Û¸*V?e\/Ô²5\*erˆ±£«yÎÒäytI„©ZŒ®'éŠäZ–þžþ›=TôH1‹V2hÞ^ÿ}ÿaÔ¨ÒeUú¯lo¤¶?Û0š¬Øöx~z»ìÑûúu|Tðù–é»6¿r|_®‚ù‚„ó+)xÄã9,òÑ’å{Œ²ÃÐùüj•àß|4ˆ¢Ld9â»’Ùºs¬Nà A')ÙåH mÙ¶Å‹²Œ5g¢g~ùåëx©cJlŽsv®ËÍa'sñõºšSX-ÁGÝ-¢|~;{ü7™ íÝÐö*(¬~ïfJË7’¸$õ:»là’]s@½t‘Cžâüõckùž¼6›'÷t÷´ß=ú¢´ ˆ#ª OxâHCè 0ZVN =p•ác‚|œáhš˜8×UòS±ºß«XT´ÀÚ§`^·|,T#œå“ÇÖdh¾ŠÌ´=1à#Û£ú¢\ý¶¨H¦ ²AïIDèñº8ú¿E¨úü}¸¯hLÓ~qDô½¢À`ío@޾ˆàgÞQIÉÊ endstream endobj 3057 0 obj << /Length 1197 /Filter /FlateDecode >> stream xÚµWKâ8¾ó+r4Òà‰Iâ$ZÍ¡wú!­Zh¶›ÞKïLb »!aâ¤ö×oUÊÐÐ0-͈ƒ•²ë«ÇWÆuŽëÜ ~Ÿ>ÞJéÄ<–céLçŽp]îùÒ …àÒ‹iê<³É¤.ï*µ^¿Nÿøx닞‚K¹×~*dˆ \{C7‚VÔÓyaÔªÆ!lz¤\(þ¢òFœðê¾gP‡ìs™—Õpäy{kÕÚå¼ÛŸ\ѸŽÆ+³bCmpÓg›¥.Hܘ¬XÐ4iL]®hn•Ò‡à:#rX•Uª«ó†c0ü‘ÌÑI6ßÂ,¬^jšÐ4ã²u^Öukî¶ÐT²`À©µáÑ/"6]f†D‰*èŒ !Ó´hŒž7ù«ã’ªDßlR"'”<ŽÆ€Oð8ZbðŽeså±cQXÎíG´«+mjÚQ•¦‰5¨…Õ®›*Ó)qÀ¾-/€Œ¤:´ݨh ä4Ë3:½õšîZ ¹Zy–RÔÉ]]x¬KEbÓÌŒ®i«.iœQ¸l*a8tJ‹\™šôþv·,:½5,ŹÌíüÛ˳,7\å9Otž›ó‰„𸤘‘* –Ó€•MôbYä[š}ktµµj…ÅRèl±Äón§tÒ–3EÀ9?o¹Ä¸ù^WÊ:TUj¥!K¬µkeLç_ˆÑMtXþ ºÎV_ Vî÷}+" —û “þÆ’‘Ê¢²€e$IùÊ*ÁGN…:4}8òijÅS'ËMYý{pœD•uÌe€y±€hA-a+mN• àµtb2›Ÿt‡/KÊÕ,+4)~¢Ï§O7§®d¿Ù|ÀªÚdF8(4!ëòke‹&¾ÕC»dkeÆÍtðm Zψ]û°}ÒIVƒç¯®“‚j“{qälÚOWÎCGî<þ< ÛïQ …p¹T~ìñ0ôNô¨^|e|˜€‘ïBó(ÐÝ/€™E0Ää8Á*˜ AD,"74­184EfmG³]AöVY‚:*§Sîªv–ôŽxÓS~ž ƒ÷xŠ<âŸèÚ¾/9!yäZ›¤ÊÖuhß“û!©£“ˆ±½èÊFòOX7õx³õRÌÎG­@BQêéý@?µ8]Á¯QíÒ9»(x9ÃL†\ꨣßvù‰†ÉÓý½ý`ƒðÛГß^Ý?Þtœÿ&K(Õ¢YAòƬ6gñ\À±3ýÂ[ ùöê<Çw±;äœ'ý½×.›ò™¼ÛšÄßµá9Ýß>kNšj>ìÒ‘zfS |‚5º'(+6ÝCK]Ã'ö50ÃlSLõ\5ù{`ïráòcõ;ÜÊ2tËäÖ KÙ)0®*݇ãí½Ñzÿ‚^g3êA×MU˜ƒnÐ+Õ.7:Ú9Éi"¸€Çý/e†|<¶U]V+xåý§¯U­Î7ÀQt:ÄÚ;ÍÓˆ$<ÙÆþÏaiáåËà§°ô¤‡¢Ÿ3IÙÐK×f¢£ <Èõ^´¯+_d/(ìþ7(ìÛaä3~ÒBpØÿ V‚ endstream endobj 3070 0 obj << /Length 878 /Filter /FlateDecode >> stream xÚíV]OÛ0}çWDð°DZŒc§ù˜´‡ŽÁ¤©ðe/°75m¶4©’ýúÝk;]R™š&mO¹vï¹_>Ç.uu>|˜Ÿ…“’4b‘3½sJ #'ñÔ™Î7ˆïëôóñYõ\Á°„A åtQÕ+Qä?åGÑ t? & ¤{8¿ú,†M®á×XÈì±/„Kú'Ž$$¥¥Ž[:¢Õì›ÌÚ·ž?¢Ô%„À^€‰ ˜Ï8I îèH{\qý]ÉvY͵}WÕÚÈ Ñ4z1ïq£~}£”wã~á碭ó6˜uÁôÓQôHCªøTN;Ž´cרé­ÿSibˆ6¯JÒoí½þNªÅ6Ñ¡5F“‰B’;‘µÝ4 8C©²õ"/‡ÎCGÓ㬨²ï¤Üç‹ëÉÄø^Ö³ª:O/¯O­ÎpæjÛ·ÌìO“aÜ4âá?,LxÑÉFßÉ^ÉM-ÚíèŽÖLC(n=K?ÿ vß |5àùá]Œq½Ø¬déqæ¶ÍÞgè‰çGŸÏîû HÆ,vÇ0Î9 ½Èµ¡vù‘0僞Ï1Ìaºb véBw ,‘sº­L íRÖÚTTð|Ì›§Ê eûø´§¾8")þ•™ÜùïÔº%G4†ÑwãÆ½¸ ‰¢ÄLа€î’ë–2j“µŸp·/ã3€ààç‡@ž3R´›ÈËiâfÕFÏßó·Ñ{º10¤È<8¦¥q•E¡-¡Ñ©;Ïïó¹ô5XÏ0Ôƒ¶áдw[µ¢ØÞl(Žm~ÈÍRsÇ¡Ñ.á¶RVñUj\ˆr®¢6E›¯‹\š½.½ÆKëÀX’¯ÛÄN $½ÌMYÝ¢–Ö G* ¿¨†»µ(hfÕ‘yÓäåÂZpÁzsünv!aŒ¿uN&—ûƒ‚Ãô×kdGV.N…î*3ê•u×çv5ÊA;o‡¡²¯Mj: _«ÃË“½’ˆÀCPÖ=¶!q‡NÆÀIàA¢UnUƒ˜>kq­X‹P¥˜£Ümq_tȾbpm(»«C+¥¡0 )sÖ:7ú(Å(,™J<> stream xÚ•VKsÛ6¾ëWp’ 5c" Ùi©c§Í¸7rzq2ˆ‚$Öà#eÇýõÝ@…t$'¾+ìó[ìƒÔÛxÔ{7ûízöêœs/'9¹w½ö¥$й—2Fx”{×+ïÆ¿:}³(7ïd-õüóõûWç1©D9'À f¼ Ì"ÂrD J‘»læAÄc_5› ïD­×MW‰¾lj¼OüR[¾h[UÊ™I”ùçó,ò›Î²ŠfWÏÃÌïµUiçàÊ—Ž[•J9k±ÿ‰&ôôêO8˜•Õ²wP²ê€;O£.„’d-ŠÞ¸Œ"ÿ5±Ï$„1Og!¨g$L³êcñG ¼ X¦þB à¥ßJë-Ì™ïþYD!• ”¼ÃDHeïjL¥*ÿ³é|äù1ÞQÀ•è6eýt¨1†úÇzÄŒšŒ§q|»²ÞØËÓ‹@Ð|Æ Ü…î Áµ´â¢è­­ÆZŠ~×Im9øhÌ>21^#bS‡^ÊIž…Ó7C¥Ð(=;ØkŽÐ/USÜ=™3ð{ƒ ¿üIy3uø`ÿÙø ©·ÍN­,½´ÕiÿtP¹†(Ý)E&¶Î„¥áå˜{‚‰ŽüûËAY¡¾s{iN}t‹Reï,CiÀÕÊI»|Ë_¿í¤XéggïNvËFÿ uq¡¬JÝ*á†uÝvÍÝÿR<.ñi9›«¶0§ïÔÌ3Ê\h-ž4Á@/E%­»fmOÔÄl>¸>mì¹³¸ÁJ]p Ü;³µPº,ô[áìoͼ³KÚ¹î¡Au_†ÇÉl®öÏa÷I¿/÷Ñ|†Ô˜MR”¦ÃÝD¸/û­ö0‹@ÂèíFØÕ©&?3>j±‘??Žç}T–ØASn¾'¸lwž‚ÜšÀˆò¸ãÝ EŠÝ´­)a ²Þ ƒÂ Ÿ¿¹Xœ¯ÄWÒÊŽ´ÅDáòãÅ…ÀøîËc8¡Yþ26ÛÆ endstream endobj 3087 0 obj << /Length 1161 /Filter /FlateDecode >> stream xÚ­V[o›H~÷¯@}i™2 ×JûàuÓJÕ®äÖn_Òj5ÁÄf—‹—$ý÷{g @;‘"Kž snß¹:ÆÞpŒ‹?¶‹·Ù}Š0£€N!»cÝ– Üó|sÕÖµŽúü§ ó7zQàU«š 9TÚÏÉ÷Âü`qÎÍ埛«³!`Ž Dè÷þÁ«N[¸ªÓ¦­Kº;Žˆ|p £kˆ]Q`Ê¡T™ÅÍÝŽ¸wž Nº¡*5të­»ªÈJÙdå^#yд+²ZŸe)óŸ*SL;|RwbD¹>ƒœ$Q߬8 \9UræsVj– 4ÑN%iªšÎ˜°öæÂöþPažàöø˜Ÿú£¬õ'Õ€ªÉ™h_tkÙÜD÷eyì%²D`úzÛK•ú"O¥Ò[Âq¤ᆪe¤tÙùÀ™Â¿^ÆÍc·I‘äÀ2WÕ%~,2j<ÒöËÅ>ÍÚ ¼° ß?ÉäßMSËû³gnÀÕƒ,Žyz¾ÝL²3f7hBbrⵓĒöæxS$«Bæù,ZÀ÷/7Ùþ#†’tqVÂ;)×?cA0(÷ÝÓÂðÀË¡'`Ÿ›Åç'M¥Qaâ#P?€\o3w0£› ûWwóÄ“jä Ï1W2OÚ\64~¤c6GËçXSà?±|‚²‘{ý­ \X%.ii÷Š2 ¯oðŒâ»Ïª*æ¿Tª|÷4f"äŒ/Œ ñNLQÂóY,‚æ}ª’:;6YU¾¨°èÀC…CC_îúúÛ^„“ þŠ…QÒqR‘°,þ: Qk"À:õ#X—òæ«BÁÏNš3©>Š Ì„ƒ6}È_ÒèզLJóm5Äaîöýº>¢>ÔõçZàÏÌZ(x;¼Ï’tqè–D#ç®Á+´Ç/Ýä &1ìuš„½&á4†O rä•_10ÇnIísওP!wJ„YuÍ/4{¬^ú¯Ò2\âƒ!SiŠAîxî“Íb–#ªSwüÔ1ÜAz}ý¡UÌU‚2ø?úbp¶ endstream endobj 3002 0 obj << /Type /ObjStm /N 100 /First 972 /Length 1636 /Filter /FlateDecode >> stream xÚÍYËn[7Ýë+¸Láå 9|F'ÛMØ.ÐÖðB±ÕX+’Œ¤ß3”r$5”-YØæ½÷pÞ<ÒDÙg¸”h‚èßd éßlÈGC™MÈÅ0gã<ñ\çzãcÔ7bB = ¼}ë\2Éd“rLör¦ø¤6ä¼èÈc”õ£ƒVb•Ibˆ=>P&˜ä â)a”`1tP`Vì Qí#LRU0Ž$V]ÁPt*Ž1Jó¯P›ç‚1*¹~…Ç®ªà„QJP €ó ¨Î ̤³F%">±‡»‚°°uÞë¨èφC¨ )ÕßYæ_ñ.yÕïÂé4(5A£!Š©ª˜EqNA–ŽðÁõ;àÑõ,`F®'È¾Õ x/¾NÀ;I:A5F®ð˜ðÊð8OàWN µ°êü*Q­²/àhp¢^‹T£ƒ‰I# Á?ŒÒ© Ψ´ÄR "²V•NˆÀ%”'X2”BÈY‹ÐUj…FÑ´©c¨JÑ2ÀH3S‹TàÕx"—¤*Œð¤$Æ(ª¼„®ÊˉÊÓx~ÁÈ‹I E‘H"Å!ª’bÅArFC<¡e-¥¦ u,¥¦ 6¢t’iþÕ›È5ÈEôÐ eÙD©å[Gš‡õ¥¨ÉÅ™ƒïííõº×æ„U¢3‡¦ûý?M)Ö‡h ¥ftuyyÚ{ñb5˜œ«èXÄFToZ‚·BØçl©Í@çÝ 9“-ÜŒf±É}…>ffoÏtX† ¥N;@™•xó€•WPE×ìJ7°¢|Æõ »w“ñÙÑ`fNL÷îõéŽ_fæV×ñ¿ŸøÐÿ0èu¯ w0šM•(£Îïu‡ƒéøjr6˜Î)¶¾{;8ö_Ž¿˜åøžM…O¡¨?Ál0Mâ9p4CÚ‰©Ì­ö|¥¶zÝÑÕûY}þy8úØë^Ž'çƒIîN»»7Ý«ªjÏÄÿÉá_#ûòjxyþêòj:LŽ'ƒÁS Ð]ŠêNÓZâ÷Á·E‘}PÁš|ÞOábrï¥ð~ruëtKç\òWé,›¥sÑõk{Úâ´¾‰ÖªÕ e󺿋Æú =//:¾èü¼™¨çšëüÏ2\µîp„3t»îˆ’…ˆàGÐ'²QÛ‰ÀÖS8½]Éu!wû{{UA·6ŽGÝQ÷Ûáýyr1›}š>ïºóñÐŽ':rGÐÜMIág8C>æçŸå§w ó‘ŒáQª•æ@ó_СÙb'»µŒq4¸šôg¿¾ÿRiâqÖ\Ç‘?V#$[= ¡+“&[ž?¿a/{xÞŸ^سËþt™ÈpÈm'²Eð·‰lZù8áÈÔ†1ZÌhE£wåÔj 縆¶€f¥&߈¦QiétwK6¡,“MHoáBÞ ÔÁwM™¶º¼´W†JhÝ3=·ÚíÅ[ææ»Én[8IË yøn"a›-ée:8/è•a ¶DA÷ ~vëùøSvvñy<ù¸Du7¨¿EðbÖ¹MhÜEv‚ØüJª[‰vèÙ¼oD{I6”؈áÚÔÂ^¡·¢;AÃlí…¾tð6ò6/.¶BçÉ-¯ö˜Nç7N4-§Eð·;‡UhŽz”ÈÛlÉ“þsâæÌ½•Û¡´âÖ#µÞzäåÛ¡´É­GZu×€®–³oD‡¬•›ÑÚ1ë?‘væì¬øÜŠ&Y¾)þ–\^±ÁfÙ¬7Ø|s\ËÛÝi¯m[PΆb±¤ÿ"*liýU "¢çŒ×öxìIN¯oMaµ 9ù†)?õÏ>Í&ýÏK{~ÞdÏÏq’Z…–¤eÛŒ&miÐÿSùÛ( endstream endobj 3102 0 obj << /Length 1490 /Filter /FlateDecode >> stream xÚWÛrÛ6}×WpÜj&bH$¥Nó¶N§™4½XéLÇq;0ILy+AÆÖßw/ EʲãöEXËöìÙÅÊwvŽïü0ûv={ù&Ž•·ŠÃØYoÀ÷=!c' /+g½q®Ý_æáÒÕMªKZµÓoæKájÕv¾ÒíüfýöåŒì\/„/ý•$îÎ|{âåzöÏ,Ñw‚á°8‘Þjé¤ÅìúÆw6°÷ÖXº#Í‘pD sçjöë`ît$‡ärìPà{1\-Ž/YÖ!r†™81ØTVo!}÷;•§]®Z=_ˆUà¶{+Ôó(|ð7%‘Ló^µåQåólå<#µª+[Ó›R-K·d ¯ÊÝ©ì÷<ì²Ï ß< ½ÀYF«(béØhén5ÚCÉ®!/ÏA/ “ÿF[ž¡Oì OÆ!ßå{mÒ&«Û¬*' ÁžP'X‚+K/ $¾ÞgˆRºÛ®LÉ Ìeu›k»u@fV®ÕR&ˬ”ª9D`!¬p# áâ”ã¬Á@büò“ORˆßg½áÉ-ÞìÀVU ^¢L^¢ÀÙú#âAYÑ‹˜ùö„fs{ËÐfóƒ49WΔ…å¹²=^Ã?ú‘OÀàgâ¤"Þ~Òiûânµj[Ý€ó‘ﻯxxÿáÝ»³ÊGž£ °z¥*ôó´•1êð@•4c—l‚»Ás0Ýìº)B$ÜSØ?†¹cxòRž¼û÷5“âJw =lÀœ (Eî9ã#‘Ø Wá44OlôNß³XSm˜Û÷ ÅäiP²,ï³2w( bReáÖj§²Ò<ëÆÁ ?ž¼²°(…P¯6ú£/d‰é‰Sk€'ÁPդܷ“móº©ðî”Ý/àÊ>ö «DÎûÙ®¬z[\}ð£žï8Ü_Ï’š‰pJK[n`1|3 Ü@ü/ÃðžòC„‚ê$Ž…n•·Q­âéP›B5•ÁPôuW"D’!!5zðBûðÁXby%]íò± #` `YþÌžfIûÄãx '§–ÛwY»Ÿ”^±Oxc[a_yÔ»÷šC¼©ôöÛ´7[° 8aAT¼çG#–'CQÞøu°)}ÓuÆBóû|ÃSÑéÿÓæýÖ‡BÊ%†BÊÄýL<Ò–^|Xfœq‡pÆ¥)ÎsÊn\G¨Y±Ö< Æ AMª /d[ž[²iÑÞ´32‰œÁmu®ŒËž8Ò%µ ¸"{’Wä‘+OñDžá‰˜òäKÃ彂¦G›ç¿ÉK0Ë!†ð¿*°ñP|ƒ/êÛ"ýËÐ6\ôäHV÷+~àFÿ©pJÞ¢€˜ôpàá …qC‰ ÐFÖÔ¾Òne¡•L$.qyþ"ÚûŸ×—_³¸’¸/”6£GMÔ]ÕümNº¤}W(«Œ§±„T2ËÐ?zsvW÷û\S›OéÛ6]ërÃÍ9rÉ?TðwnìÉr©9˜VSزÑüp ÖõõEÍm•W´77ÜF³àñ±ŽËvÔ“¿bÕ£Év¡G'VéâÏŸÖ‹¸ÿRÿ=M³ endstream endobj 3112 0 obj << /Length 1059 /Filter /FlateDecode >> stream xÚµVmoÛ6þî_!¸_( bEI¦¤`ûЮɀ-ÒÄݯh‰v4è­¤T7úßw'êÅJ\§Ã:°ÈãñxÏÝñá¹ÖÞr­_¯Ö‹W³bs[ëÅ\—ú·BÆ(÷ckZÂBÏþ¸~óâŠó#Õã{Éu^5×¶©šVmo“JIT_¸ý)—ëŧƒ¡k±ñz4à‘•‹ÍG×JañKqd:Õ À‡0ðaœ[·‹÷£½‡_ƒ":FÁ\Ê_4ð=ƒýü%ou#ÕZɹ‹-žC‹·Ûa;þ*"‰Ù§ÍL _ü„¤QöŠiþÐêiÀA@™Ïÿ `,8‘î†4\­ °×R'*«›¬*g &póG–ã¹Ô ý).È÷I­äç¬ju~ó€$Ua3R·¶ÃH#a˜yƒñëvüî®ÜµnöªÍòtˆ±ùô@ƒ™ê™!qÐ ŸQ÷(>h±—'ý?'zÏQžÑÃjû§Lšç¶³r]’f &¬nú³ù,ÓêP„Jõ²×£”~¯ï/Õ¾-diûPžÃð„ïÆÑ¥9ËÞÆ B/$·²U¢1Q¯¶à0'§vŸå‚ß!̸9j ÃÙÓàŽ‡ä%Ã-°a|'”Hl¬…Ò˜èFeåÞhèÚv ’lw? ›;i4"òj÷`½/+aÒR¹mÞA¦{2Í¡tÐk+ä4Ž<ÀÅh<܆*`»ä9žç‘kô»Ò:ÛæÒHªî¶è 0Åd©²= ºCµ¦³?ØÀZð‚YæXý»îœPȲ­q÷#¹(Ssâ=GÏÝo8½¤çR茀 uz>…ܤNHÓ q‹ÜŽèËa÷ ÐT½-øÑÈR{kÞ<òfcŒÔò⢆;Gë»û¼zèÊÙ{ó›s"òVþGÞJe™V{%Љ” D$`$[S–#˱Õm#S#hµ©Õ3 öÜ,+ O\© –•~¶WЧ _~EKýýLaªƒ!,†„ÆÖ³g†©Þá3…Õ–cy¹P^ýžíÌ:FÉO-ÜÃw¢ºIÇKHâ@{°*|ŽÈq}óá£`®JþîŽA×ÂùQ©hDg²Þɺy¾htt+2º“Š1ú“c¾³$Ì(|æÕ´ýÑñOÁSvœȾ'xpqY4OÁe™¢õãL ÆN·,Ž ÿáÿoÿÃ"úŸ)×ßjÑ÷?>ô?WvÈI[” OS™–§;£ºk{:³8“®NPPõÍQ·-Íð±Ø¶ùÒ3Ááõ}öcz%æ#ѲÒ+½–¥Îº ïꉄš2ÝŠ<ûk`C=]„†è€Xcú‰È“6# U@nÚòmöE'­„†À²ësBOB€ˆþüú endstream endobj 3124 0 obj << /Length 1306 /Filter /FlateDecode >> stream xÚWKsÛ8 ¾ûWhr’f*UêuØC¶IvºÍ4ÙØÙKÚÙ¡eZæV–RInãþúÊ–UÙ©÷Dˆ@<>€kä†kü1ù}6y{EFꤑ³¥á¹®°Èˆ=ω‚Ô˜-Œ'óÞò³*¶Wr}_T­õyöçÛæõÄ‚4r7¥JÀ‹dš¸úàf=n»c·ý6zlx.ÄŽ­ .éÛœ¶—:^§m¼u»©çÓ¬ªÅ'7tQ¯KÁµ4 ‰·šÿ+²ö:võQDG-¯sÑ:¹(…“¼i,;t]ó7Z.pÿâP0üYP.DÙ~|¼½[Ë—&ãÏ£—ugÿ¨³ñk³ª8ªj^æÂçnž Ù:óí+¶éXÌÅétfÝ\ÞN¯Gïx®Û¹Ónüî.·=’È•§ñu€̱Ÿ8žËˆï²Î7kQZo¶ÍIмÀ­}l?Ù,öcó²´ì @܈L%EKZuÚœZ¶g Ë375o¡ò¾91æn| s' ‹#'M|PàCü| "Ñr²aÁ; €±Y+ë¤Ý‚¢3E&—[YæÄÀ‹‚NézÚDˆ*ùZhǤB»$!^´ÂZb: Oœö×Þ}Äk*˜_õÚ#3+/ŽÙ®M®hý&› /äí@g>v Þʪ‹6H`CŸ€þ_t+râ˜ôIˆ!ÂþGî\V¾ Þš (Ž<‰)z”ŸÜ€eÊ·æU,öÌÇ~rÒæÈk¦úB4 / Q®ª‘Œti„=\…»ÜDû‚ MÍ/èHY)?3DÓ ¨j£e3AH IÖ±lzæ f¿ÓAA¤­+ÍYV¥­ÚÍ.E?µjL¦&/H$JH;¦A䂸0Î`Hó>S—üm´"t5!ìpciD­‹Ds­øBhQˆÕH Ík±E÷ÎGß®ÁŸÌa€ÀÛ0ôöÀú†¾¾Ëv…T`®± Ô^»â%QU©·tb€­E÷¶:vv|ÏœªÜ›ø ¥G|³d|¼Ö*+Z÷Åy,cý¬ìê5 zÕMjIX`ªó á°Òõ ñ30S«ÏÚµ(Î 8s® ßÈ3;÷Ý3yã¢1¸bÁ‡–¾ 36²•è&~Î!M "IÎí:Nç [1âH´è©%ß­zxIYÝ­2·Ç0)KJb¼¯k u]5¼QàÅæ•À‹È*C6ÄÞt‰ùx`¡U’xú S–À4jr®ò8f%š¯-=|œß__LûIæt5aGl:¢±!Øüˆ†»ÆN&Æwź6x3üW)Œé䯣ƒ£ú9:œ=׉Àn/úºnïŒzFé8„¹Š;WM °ÝõÆ‹™“øÁ9ÞÕlä—Îc¾§zäºMVKj9çä‡í±À‡4ÝÕb ¥ÚÐU¤šÐXW¢¦sý~Õd AÒZJÒûˆ(„P›ïô0Ñ¿)íª^Ñ80*Ie†Í[_ÚIr­€Só¡®—CƒÈx1Ö:¾YaO¹Dþ9òc×Òób7㰦ƴ±èA2ÿ`Xç… endstream endobj 3133 0 obj << /Length 987 /Filter /FlateDecode >> stream xÚµVËnã6Ýû+ˆYQÀˆ¡D‰’³H›¸hiâÌ&-ÓŠ =\Qn㿟K‘JDGq2@"š<÷ò>IQ(úmñËjq¶Œ”‘Œ‡­¶( ”°ˆ£$gZmÐ’Èû¶úãlÉùúà³0a¾ñ·Õaé¥ KÑï;ySµ½¶XP»ìML)òÃ~1ãÿ^‰B:ø·¾à'F›"?ÈHLSãè¸(k½ý_4¦Úå€f HÇÖ®ÿ–yÿyX¦îRѵûYàßÜ+½l8À¿OfjB%§ÂÏ{«mþsžºyñô´œì\Bç¾B’÷mg©²µ¹›Ó6Ô£µÓB3¬óØŒ­ÑK¥…Šªš˜¿øß^NíiÂé°¯E-Ý€m×"¼$Z#‹¶13Úç¶{¶xÕçºT¹)Í$ÝãöCeF:N†êЗ€6»=™ðD³1¿¶všß òݦlD/ÕGôå«—q¨þ~^Ùï#%¿•p4c MPE1¶ÛÊGü"—«Å?‹Ã§¸ÓLטQ<=¥Ñý£hŒ7b©¥[­ÒHž}N b¿¶UÛmãµ4?˜± Æ5Ü–¥f-Ï¥RåÚìÁµ†š ÀIQW qx;{ 'Ò¾”}þxñž~`ò‘óô¿¾’&$})ñw_J[ãAÍ.þä‡Q“·•ÏeY3t*OÎB%›¢|=?F¯ïƒ³PÿŸÝ¨.’ïûv»u¬éìk°OsàëóùµuÝ6DåBsm‚_ÝÞ_þ„çà+–€ |®ö" endstream endobj 3142 0 obj << /Length 1471 /Filter /FlateDecode >> stream xÚWKoÜ6¾ï¯œƒ%ÀbDQÏ=¸I\´HŒ4^÷â…,qe5+i£‡ÿ¾3jWZË»q/"EÎã›áÌpè¹á¿/~[.Þ^³8pc¹2¸ã0áFÈ9 Dl,3ãÆüÜȬH»ó¶M,72Ÿ¬oË?ß^x|Ä'â€EŽ©Šƒ‡>-­¨½µ=Ûn‹‚˜Î›¼/ee ×ìÚ ûþâ¢1èȰyÄD‘ úö_™vûÆpol/tCóJöMÒY¶˜,ÛÌ9α.Ty,óJ&]ßÈö°2Êþ¶"a‚ôºÑ W4nE¨¿®ÆÑ37ëºc–íyžy¡ÇDiRéI]J-¥©Ë_öQ„#‘Ï þ«ËÃÀ}Ç1Ï+}ÞÑÔ&PŠ1 7Ê„•´¸ °-››†ùÕñÉrmYB‹¹¬ôv• öØä†“OWÞ9?6~È8<ë½Ê0…àC€¹îËŠ~ ÎÐ¥4+Ñ’.aYÒ%´²³#v|³,ðØàŒS >wu•5E²FÊÀÜÀFdÊ&…ȆI—äZ¼  ç,ö}B²ÏÂPþQ؃¨ÿåˆÀGh/ÃAàªöB€§5¸ó¾(¿È¬OgC Trù”\ZWÑL†‚»Š*§uô£ï$Iåzý’£d‰î¹%oe$cçÞ]ɺÇSk)ަq§¤#åçw4r¢jÖc6 'Ÿßý3ÑÄ÷]ܦB?R|÷@a þQUª*ì Êä*é׺~š4íØß+g›zýDQ~¸ž!ìËm®€µ[=ó¡ ²òº¢”¹j¶E5áAmJ³ËÅN®~M® x¸kðe?™‰¿!&Q)¦€Ž™Áéíf]t{xwQPŽÖÇÀºÌçœÀ–EÅÒ¾«W«¹„1Ï^¬·eò8b|ÉÖ0`qä*•±¯UŽcÌ Be3Ž¥P.éKZHªLï$ÓTüÕ‚þ¶9ÖÒÿj,“¹îô2Ý[gþ7K¼°DªKC¹e”κÈ´X=áÌ3ô y·XKZÁÀÁQN@oI34 ÇÓoÞœÒôáN6šîT/R¢LD–p¤EU‹@»±yüôl‚7 ¼°áœ­ ÛÓW†º,늵iF-ǨeŒ½¦%Y–Öu“)>.fñPSH?R<«Àÿ§¡Å "Ý@}M:êtöÛ9lÀ\Ÿ‰P ÑT€çº¸= Ûî-$æ/"¦ªÊó!áÄä.Añ–‹ ’ƒoûWl0Ei¹¸ùælÂù1Gƃ"- Î2ô°e]W‹¿^l6U“<í7¹Ã°A„1(óŸ5ÉO{~“J$<È-Ÿ›?Ȧù‘y¯|¦¦+µW¯ð¡)Q„ ñ´šº’E~w«Èšö€+‚¹Ð)¼Âd²7ó.g<Öï‚÷²M›bÓuõªƒÖmúòN¥b›«¾J•[@;òPà†ëò)ýÈGømÛ-\WQ<ëùª‡A¦¢ÓKßé¿’I£ÛèðhKùu' «Ö‹*“l®r©]@×@øCtgØuD&^"¸DöáLÕÂ{KÝEÔ¢‚ˆ“ï8xöÜTˆB…($D¸EXç™bPÍŒ¹ìh+ª’Zx¹é;™Ñ϶†C[ºŽù‡ˆÏ‹+Õãïa ¢=–À$×—þä|¨ Àé{’2zxENõÆÓçˆK³ç8> stream xÚ­WK“›8¾ûWP>AU ˆ7©Úƒ3›lUjÊ•qö2›ƒ²­ ‡Ç<òë·¥Ø8̘ÙÚ‹HÝýõ×ê‡]cg¸Æ‹÷›ÅÛ1R'¼ÈØl ⺎DFLˆù©±É;“Ä‘õuóéíÇ(:9zg{©ïæçšhÍÞ×<ß±¶e5“ WÛ#Á‰¤kØ^ o>ª_Õ»®dÂò=³mFrçOГœ‚M ›$ŽŸ$¨¨úöËÚsËd„9ˆ½ØÜì™eû¾–F¦Sº†å¸j+ù ÌÌ"&-²® -Ã/ß…8·‘Œ½#¡%‚Âáùã PßÑ®`´F;‚ñß[° 8½Ä¬àUor‘óŒ5ŽeA`®P6cEÑàòQcÅ·’¶5t^›6 }zuè°œ³ÚÚ;ò·­j\jP[^Íb-Dó ÓMÊŒ!øÂx¦X)¡ W,ϹØé0o]ÛÇý¨þ,êGÔ– \3 üà5w9/› ÔÉ€¯»S¸õjÎÁ4dE¦ü„[ågý²fmW gF ‰D{£Ž£]*= >`×>PÜÕï©Å;øŠ;ÐU;ƒFulÆà¿^>ÍÌ–Qð•]ˆ¡/GÿW%£ÂÙvbF™ýdÎ’‹\ÓJiPÉè=àé.Ø}M€è¿ [Öj~4ÎÀ¬©È«?*-c”ÕžeÖ±*òíH–IÖ´C¥ð»¡RÆú*B™Ô–t¬~:IŸù±¸gõ·ªa ¸ŒÂçš ‰¼í¯µˆ ¶ÎQ´eçòB'N<4ò—•FÐe:6ÙþÎ{ôYÛ«/gfV!2Ê….Š:=¶>C“=$à¡,Þ[¡F¥[ÎY rÚRÃ>U?l?P»†‰À$5²rq÷Õ5rØûdÀNšêdi0nÄë¸]üùì€Ëh ®=0’zz`™5’DéHç¤ báz½+„œ8È_Škp7ìó-„Ò«,à®4îâI0ªž"ÅXÃô”3É•ŸúN¿Š,$%˜˜âü(tB¢Iù5YÍ¿””™·Lr õB¶šLÞj¢ŠDªx@tEËíªT— ÷{~äZñ#à%*Êiâõ#ub I½é¬ªz5ød-9Ó:A-½RÙK „ºD¡V˜’ÁØ'›º„'5C8Žå2€¸t#†Ú]6ø ý“'«¢Àb©ò÷jÆpÙH½­jùβ£Ô3‰² …Á:×ûÀÛ=ö‘Þb¶žº¡ {Z—•à?©F“¾ã·X½å’õ;=á°FÂc2b^= |:ƒËQGO*.Jr˜“äkÿ”´L}»^Ã>IÌ]M{\Ê¡E>`DgäI2¦¢LRóžSܽ¦‡‚f\Å^?ðŒsVÉþ„!ª®1Á¾ïH²Só æ¤¶´ZÙ@«Û2íû‚¼ß¬aºP»èÐÊÏî-Ê ÌçïõþKCwìÅ¿:3ÿòLWº¿ÝÐU.§ê_ÖÈíò›)R®7S÷ptNnEèºæoøX2ºœTz”T“ñ©yº“2n%¤Þz§dí¾ÊG’™try{µ›hÿºÚ­µ[Â.¹'ßSë/××/ÐŽo'¤–7ëÕò%15|L ®6««å$ÙMw`õ=‡î¶Ñý¦høàƒ> stream xÚÍXÝÛ6 ¿¿ÂèK`výýqÀÒëݰáÒÜ^®E¡$Jâ5¶3Ùn‘ýõ#%Ù‘'¹t6ˆ$J¢È)’²c¬ ÇøåæÝôæíC©F^dL—†ë8¶DFìºvä§Æta¼˜OŒn £ïX¶XÑ ]RF‹9~šþöö!p•Ý/–—ú~`ºqŒ³7Ž<–%Ê2/†®oX²åglÈvCæ)lFͼÎÊÂþBwC+tógѼEŸßü„¬­"¦axzû"Ë+m¿{:½»¿R6++ª-žNžïùZ+Òª>:¡+õÅ,7­;Iäº[59-†¾gÖ•Éa{2rS;ðÁˆ©¨«›tø}Ï‹ÍÑÐò}_Ù‡hÃHýÀ,g chþIçõ9;!J±íDR†·ÿy‚x/@>ô³ÙÔ™UæÙ\Ðà`×dÙÐ5‘f/˜ß †«(,º,_`'à®:F{8'lÙiâ ìê c’K¸Ê¥hÁ‰hQ+²iamy (åºzM{açEjN×qtIAÈ*ѶCðsN­wÒÛêDG뤇Ús¿?k%4Ò¸áö™ñC)Sµ@k_*^ RSÑ…X´,١έ½Ž ЧsÐé:—tE‡¶Û^¼¢d9Ùd~ÃsZ¯ËÅ¿7²ÆU:/²æØH­QÿÛ¡¡ùX®Æ°ôÅMÒK2éÑwÓ×™¯×yIU‘ݵ:`šs'$(:;cøeŸŠ3ág'ãEwr¤Á ?佨>º$ï>\^F$´ý4Uà ¸ÒòJH¼×B"Zg^m:8D,'ÛmV¬lôÀœŒGmDƒË´“ÁBúJãGŽ«©úWCÙî?R–ŸÝ§èh˜øæÿFxÀ]§uwØÕZK™«fKÙ× dùþ€=årˆÈIñ?â—[`/c?CµpŽ%Rá°.E;Ûs Í–€•·Œ8pØÉ t€£ß ò×Wat¡R5)*øI`Ú"Àü¾­ÛÀ «½=„%V`Iì(Jô\ðÑsó+œjSeÑ0< ;A‚8”àÅ{ðøøáWì&©k… VœaˆÇ¢Á¼0‡ž'8n¸¥Æ¹5/'„d:`'KqK: 9ÊÇž¢Bbµ ;t½«0i“0†ú$ÕñCÅ«D¸wMÄuÓOw#ÑAˆüPB„½€™.iîSe(ý ;õÿ›ñóã#Àây$LÑß1 êw êƒá·l#'ö· s²™7RC8ìX‹Šô(ÑL[V(ñ AVRóÁ=ìÁ°µÊ (µ¨–†väž‹å×Ç5O­QÎTT+1n:¼E(òd=ÆqÕ”CÊš°¼,ÚºIà;8 ð /†Ép•êÙÕ}|ÁœEYw¿°1Ð…díX® Â¢Ì¾ºRÒ^RR7ŒV׿Ô·ÝËÑxN"CtÚXÓK$ëÁæÿÆy­´Âù¬\û`¿­áy ­;ï•5÷˜ËÈlCu‰¹o³2× ñ@Ë.Ê#ïšúË=÷¤æuÅw¹²Ë·Òa¶@BO(„TQm„;¹]‹n'X‹›³pÝ^¯I˜Áê¼ïõ ? 'ürq¥G¾?ûÐôÍ/<É’ëô#?‘ü8=.=%{í}ô°taAhÕ(†c©¡'Ÿ“vFšjdRÕÂ0ÖQB&¹^~VêOèDÿ tþ ~byb]¶@slY¹‚kYie¾!¡*_ÑSo`pYyϧdö|$uÛÞOoþÒ­$2 endstream endobj 3166 0 obj << /Length 1312 /Filter /FlateDecode >> stream xÚ­WÛnã6}÷WûD‘Vêâ‡>8›¤h‘©ã- d÷–i[­n%¥¤ùû9”#9Š“‹EÅ3gÎ Çžµ³<ëçÙùjöùŠúÖÜÇAl­¶–ïynHc+ñ}7çÖjcÝ?Iíï«_?_ÅñÀ4L<×Kbø6º¼¹¾°ƒ”,”ñÌ3gÀt°Ëé·9A“!nþÞDŽm|b„1µ?uÓ„âæ%o;QIÛ Ãˆ0DJÓÁ†{X‰É¹È7;¾ä[.x•ñ;ÞSÿÈ4"ížµ¶Þ”Ù>aŽ×¶Þq<§“|cN”¸œƒ)Xú¤éZ\ikãü¹©%”78\j§Ò_åÕq®«$@]TÙ¾ò˜ÒfâªeXr jó(BZV{ 5$ ¬ä-ß;©Pr€«= „ c)ÛZ [!É+|¶{þ ¥ôý”††¥<*…ð¢Ð]®fÿÌ|ÍŠ^ ± ýÐÊÊÙýwÏÚÀ"øæ†óÔzÔ¦¥EÁÏ„†0.¬»Ùï/ãô=Äíûž¼Øó]/H‡Ò=–m<9‘¤Ô#Wv“®ÊÚ¼VôD©Š1<Ò;RõŸá 6¬e8ÚÖm¯óŠ;½p‘ËLäe^±ªÅ™…D¤bœ̥û:UQšºó1…ŒÐ‰Œ¢Ôõ¹à Q£Ýü¹Úç*Ü4!Ûg²hLÌ L”Æ «d×O?ä˜T0}ûe[pkB8Ë”röøVæÿÊŒ5‡„ì`Ò|Sr%ù–OøÎª9_@´¢˜üųVNåÌà•ÝZ§JÃTà˜,(0aW²%ëAš–ÃÌ¡:sô„’€k2cT oP{~•l7]'øO§øF‚þæEžör®+íÈÓz­H8›"aÃ] ’y‘瑟ðñiy³ø4iÞdSæ·ËÕù‘}Œö[sEÕÐzÇ+>ýõªuõ†±ýÍêë&Ù÷&í¸X×’LW˯—“ÆE½Ûfn»\îëb3Úä¹A¤÷8ÿþ;¾»®ä•¤•'ÃÿFØ1¦'¯ ‡&AB¦¶×ëC:˜‰­Q³I&Þõ—E)å|GÑ»´¿Ó2:‰'ÔxÀNeÕ“Iœº¿¨LaåTÉ Þד\J..ñ]ÉH~ãA»?£è*Ýè~`‡Ö·"¯²¼)ŒmV—ªv%PL îðl ÙlTóßðŽòéí¨ÿÆõMd R¤èJS¯óÖ¾–‰oŸ9}! 8koñ!ºÉü6Ý7вŒ5YÕ•ƒÀòžÖLé+0ExB£ŠÅI$‘FÒ•*îÆa1V^£ úØŒ^K¼š0¼© ïH4‰p_­N‡8¬JgúÀ]½ƒªe‚¶fâÍS©Ðéªwâð$vçi»¨}n¿†~F731i¹4!S/5>uªâðq¯R%Sy°Ç8Qyñx¯±=L3eò H7¥Ye昂3i†:[]¨Õx“óÂÔ©ê®.IðÕ~¢àºb;Ô;\©ضB4õ¢¾Ùõ@ÃTÿjœØ‰ºk$Ž•FÔS·®íÄ)T*¾e]ÑâBn ás"còK• pE1öžËH—EÓ ñMßâ7ÏÍ»VB߇)t&»3fJi™K#Rt•ýmä.óT&9ÙÄÌ)Fp£ý¨ŸsPS‘Ë£êÐ\At©F𾇓·_Ìþ­¨K\R¡d‘©ŸEºŒôí̸“X¡íþ¢µÇk endstream endobj 3183 0 obj << /Length 1799 /Filter /FlateDecode >> stream xÚÍXÝÓ8ï_í ©DC¾“r‡Nì"¸¥{/ BnâvÃå£ÄN“&i¶ly:!ÖŽ=žÏߌǵ­aof®fÏ®ÂÐXZËÐ ÕÆplÛòüЈÇ ½¥±J[óCÍw_­®²2}ÏêænlòZÌ?¯Þ=»òÞéÛ…g;ÑÒ„ÿ¸;³µœËÕìÛÌ©m8ˆ0 ,7ö¤˜Ý~¶6ß°µŒ{EZ>hùÌsãã쯎ßxTvøqßǶBÐ- bˉÃI;´ pÅr`Œëù6šŽÉwø—Ñ|¾ðbÛ¬Ö_9~&sÇ”´$+Áþº)i!Í>ÙžÇéX)3–ÿ¾£5!²JÓªö@CZ`B°´vŸÉ;Ôìr­eì ðÌ2È®¢Ée¶ËQ¯ 6‹ 9§ÔÊÉÀi÷{¾åxÞ9î'7ûp mß í˜ÔyÍERg;‰–õý{ðó4N ÖÄVàê(½Éö aà×óL†ƒk¼Þò”–ªõ|æ×ùƒ´®¼¤fr輂ç•WÕÄ6SžÃI,žÂBàšò.D²iÊDi¯N6‚ëõ"+3â\hE6D"︦àiÆ”Õ`é F7ïßBx€ä“Ø Ë“&g µFdå§>±Âµš¡¤{ZíN'@ Ö¥>­¡H°ÎöYÚ(MºIh•Á÷:—ùHxUß!BhƒmÝA¾•o#å[õÝÚ…[}ßá‚Ò7Èej~Z*KaΤLÿÖð2é8¦|‡áÆ)¦`5ÉûyB–fàZk* +Å,Œ{~Äï¥)òJÒŽÒ FÙ’’µ0|DWª¸ü ¥LÐ…%g‰ '|i=©jø#Û-’i¹À³LGâR&ÙX§LLÓÚgyµuvP‚†7Òc€#K×ñ~Z/0'ÝÊs¤Ñ+Ø–O&óDrÇ'’û¸c>`)M$äa`we§/h¸€zwÏëu…xíí¯®o.U:œ²D+ð²Þ6ÔÌZqÒ¢ŸXB:.ÑmèG꼩™ì¥dhª“£¨Ì fh¿‚Øøv¨ƒX-;ÖW49í¤2 ʼl™“¬’:ãïïx­§›ª©ÔV®KTåZ— !«š§¿Ñêk¾aPuu ѤO€Í“3Li#|Ú³ḣ:#“*o+ºB«š+‡–ô»ºRõê1ˆÿ{¾„J’7üW®°k.›ºl]EZÁ è`à÷`p"S5;²Æo …ªÖ4våûKóØ3­ÇäLJÖGЂxæ ÖEq½Òv"Ï®"{ØùÅ׿â´Ý¿aпÃî_ÅÏŠTcR;=½F®#Eô"G(BR‰€©HpÍËš55’ÉFhvt¯‘pEE¡/‰¾ÖtA8f­`hÍ¨Ž¹Bïk¼dkÕ“ôÏNܱJdL"Ÿêk¥fŽÐm/ §ç)ü‚¶"'‚¬í¼àŸ+ééõQúݪ³×/}…ö’«‚°Ó=SÒø.×…›WkjW|,æˆÝ~1?­ÃZyˆC¹â“×cS–ªYpÝ®¹ƒYë2Œ›WóØWÖ¸.ö†XÖ*å’e¹>ÂHRqm0®r2r€»±ÒªÑô}zR&´œš³ô$¸GÄ3ûl[r)9:𢓸ÈJYWS®;ðx² Ãóì_¦Ñô³Lß4PáÎ«Ñ Í=wªÍ>'͇#-ŽsoúŠdtÉóÝÐf„ƒ¯=¬–co ¹P½ù6ãZù„é BMÅek BïÑ™1‚.ôuåI«L…ÞÈ|U…Ò±‡á8+±#Λ”Ó÷'Ûµ5"‡p‚HR[­ž¦S˜…£øÌ°j [Y• òA7©w¡_9#Á7A›ytÊ=¡ƒOX¡_j1‘ã¤SuÑįЄw \¯p{·ŒÃö-‚ă×!!<bˆ®'ß@NZQMít¨ ,·ê`,0Ý—HÎIz%Â.ºâm±Å«]96°iѪ/¦Ìmíñà:’Bä6ˆJÐûŸQ™}(LP>=þ(ü¾‡ÕÓÓwA¨¨ˆâLÞUuÕlÕ[(230ŽÞ>&i£:qÔéa²NV`xÈ÷‰Ú:á/týůŸAq%y gQASºÏøýåU—»Ëï #-ÿxŠYèw¥3²XaÃG5]$_D€ïôQ–Û`¹n¢$˜½¡oþ¾ Zð  -//Ú »’îèSZßãƒꦵá ý!¬²wÀ7]»%ÒÚäl_Õ/.öαnñX7÷ÿ£[ßoíoMø¶DÝpTk¨Õ÷ÁÓ³çgý@ýñÀ¾{¶ÈSoåc!Äá!!…þ½s `Äy¢—«ÙJq¼ endstream endobj 3099 0 obj << /Type /ObjStm /N 100 /First 967 /Length 1848 /Filter /FlateDecode >> stream xÚÍYMs7½óWàh„A7¾]J²rí¦j·*%+U›H>ÐÔXâšá¨†¤cÿû}mÊ"­!EVr؃yh4¯ Œ5™”QÖdV.(Ï^A£Ud“NQr"xŶ ƒâDˆÊ²€“W6L†”‹a@”²òÑI‹UðÀY…à¥Á©H$‚WÑG‚J€Aˆ*¹,BR)°QÙaLBôL4eE"þe‰å­ ]ÞBpEÁlW”‘‡”Å Š|§ý} "%EÁ%Pbx‹—‘¥c„KH‰¤cˆŒ·À“b#ó'8M¹0|#æ@мÀI1c¶Þ¡{Â$à æ\:0¼ê¤Œ`çÅ3ð2{ ‹!ÐxÖ:H¾à0XÌ¢Øb°äÄO0™ìñxâl#†ÀâqN¥°†Kh7Q:8o1 œäQ¬°,st˜¼23Ñîà#/®tAœ–XOC8LÀûÒ> F:xH‘‹b€‹b)N&±d,³°ÙC1šœ1¢Ø;HÒŸ¼‡”ƒ ‘•#WCâîmPΙOÝ|!S{;S Óu¦€n.Á.a`Ú:¯`¹¼aa˜ë Èê…A²æhc©XŒeð\HI¢CÖžñ¶˜ ‡x[ŒJ,Î/o­ò¡°Lt&b Ÿû\È€À %Œ@,\qwL*ø\ú"J¢-kcTHP@ ÄŽ\©„¼#•Áy‘ªWê¡Ígªúïo¿#bŒÆ¢Á „ߨ¦‹ÉäÍàûïAãׇ@#Hu©{¢ÉiŽ}íF èúêÆšêÆõCƒÚ Žî¡O›é\«êÑ”A´Òí´Éaù€Hʈ߻‡¤2цtƒp+OPXýÒ6£×õ\]¨ê—W§ª:¯?ÎÕç±Î?ÝÖx1¼®Õ·žÎg’KÿAuVÏšE;ªg]Î,mÿ©¯ÆÃ—ÍGu! ¼‰™ß` a‹Þ’µ»Î+s—üýyî9—©#jŸ×8êx騽M^K.ê‡öÌÚø¾hgœŽ©¯%B5‰îžh¡ZÚÄûtY%ÒFºÜ£ÕÎÜ¡5Ü¡-¹SL§ ´]¨²1‹=_ [ƒêõâí¼<ÿ{<}?¨^6íUÝåæMõ¯êçêÇ *bÏh.qˆØ—½IɈÉè$ó³v,¶œÿ½VÕ?›óFÁýÏÎÞMõð¶~ñâvÒÌõíͧIó\ü³º@´ Ãi-g±š!MYGê ö!iÙŠz¢)À}'‰}Þï‹¶ÞÂìÐM9i)‚vVgvÈÓ‡5Ô‹by÷<«?‹WÁŸ™–} «~hÍ:†ÔÍqÃÖº@—‚æh””:zÞ!õvÛ¶ö!,ížz­ÙgêÅéH—CFÒÑÊñÈi)`9¡9†™÷´žn^ çÃ9wJ½Øº ~œ­ëÐU…5¡'Ú¹ ¥Qì¦Ã ÙjÆ!¬š¢,Û¿]IêÖ”®gYA.=Hun› ÛÑ6äY‡v¬¹'Úæ€t”ƒÆ®J¾ï,9¡8NvŸ©'ÆÜ„û↧5ÜÈ»sÛ-¸± ~œëÐ.;Ö@Ö¢mÐfí‘âéh£v±ï,áÆ_–*‚yHŸ¶£Ãê6èÃ^O ˆ¿ 8ìƒrÑãpüŒrûbXÛœ6êwÃÅd~2› ?=Ø }Þ†±y c­Ñéëû–­O“÷öKœï¾”ááR÷„¥Œ{]Ê„ öÊH§r·gRîNg>o.iÆÓ«—íøêº>o‡ÓÙ»º=™Žnšvö`]qBé¿®«àÇ3ÑZ4%퉂ö!ëœ{£ .M¶'ÚzÄ’í«›PâÈg‡¿[ÞJkÊ÷D»“=vG—ra|'ø¥–B\ i)ä;!}«ú_F‘¢/å>NØ,—è(?³bõ²|ϱØë$2î‚­ÄZur|\ÔW'£ù¸™V¯«_Ï~–¿g7óùíìEU(º=ºm›ÿA»nÚëêv8z~‡¶ë¶žÍÚç_‚çiq-÷pÜ}ä)©ÚbÍr‘ÎŒ£‹ß׎ç7úl1ÑK“Vãù‰©ÑʇˆÎ$—X§îCÙ7MºN¯&u;»|v=iÞ'——‹éÍÛæã¥qæòòC3¾zû»‡Åtö~|[äò<¾ž6˜Ü\Ϥå»'ô=?ûõ§ËçÝñ8›œ‰Z¾ë0²`–¯€ÎiWîòŽi{>}&~·˜/Úú|TZ Ûùx4©g_ G†ŽÆÓyÛè›ù“ç;ÏrDD nòr=3Žˆäpäò˜í5(ºYí-"–gw‡£$cN6kƉƒ½Ó†6ßšÞN†ÓýÅ€Œî‘™°vßzµÅÞÆ¨]ˆ6ß üÐ9Cîo¿aNõ³V;ÏŠÁE"Š#¸h,ìI¨±ýöë×Ùµ™Ý‹#:jðòøþók–-.ms ’xýç·v¯Ýšälº‚þ?«S“ß endstream endobj 3207 0 obj << /Length 1403 /Filter /FlateDecode >> stream xÚÍWMoã6½ûW9É@¬%EI–Šön“`‹´hç”],h‰¶ÕÕ‡+Ê Ò_ßåH¶âM &ŇófIæ¬æ\O~^L>\ÜI¼$ò#g±r8cž"gι‰ÄYd΃Ëc6ý²øõÃUõTf‚%¾pÿhÔöîãâS5õc·UëF¶y]á„ ³ëÀ"±ÃÌ(À™~ݹ3óçÐ Z£^þ¥Òv: s¢f»,Ó¯¥jÖ*;Gs`jÆ™—„Ö­í[*·¸_nàGÄs/îJa_P¯S” ÊЃIÓ»j‹ÿ’úÓYÌ]YaPqÅñ"×-Iªº)e‘ÿcÄIŸòvCR¶Æœ¬ô I =’æ`»í—¥5©ÎL¬9÷½$ælÁŽhs¸ïõhQ¡ ßmŠj0Bb tfá_”N›|{ÎG ˆ0¿uÓ›ªÖvW»*5VÌW+¿!ï)+Ìí°¤ÆzõʶKHÉÈųSÚ´:‰¦=eüPÖꩌ¾Ÿò)Øt¶”Ýü¼ØiÖN×½½>L¾˜ÂÜ»8Ñtøðv?&le©ÚMmw„"¶³%·4¨i=ƒN©Sàu=õ1˪5‰u«¶ú‡ÃÅçƒR•ñÐàžàÜV®ÏÙ)‡Lõ‚Ћˆ{)†vS7ÞJÉv× h"L\DÖ(Pc²°ržÒÀã“ÅNãw䦲(ô{âŒFîT˜÷Šúªóáäpj[“Ÿ™jUSæ•ÁØhuÅÚ⢠··?¹™£;mŘ¥=P„›•n%˽Òà@'dBo{ÎÜä€éà£ÜîZc¾ÉK蔹ÖÄn8úRŽe¸Ð^ c`m”–TUAß[ÙÈKß.þ˜Ë1ßÉýXÍתí6öô¸é܃`VÿQÝß™û¥!ãîXSôð8âSˆ°°ò2ÙJ«ÂUŠ ,ò t±#iMu*M‰F éòÎ&Œ¨çì5PI4{Ò\UéóƒÇ¨÷…eMyv‡ý;®—à%Qså{-×jôr3rÙ‰Ç.;¯Þ@÷Ï…Ä<Ù‰GÏ9ë|,1ïð¿ßßÜŒ«Vé0¸½I>cl8ÉFŽ/-ò­LûÓBªYÖz¨¼¸½·„‘Mv„CöØ+ÉE³†«C5tú$¯aàEõtåø>äÏ%Ý7±÷NÇ‹ ”`ý=tz…Ý ¶¿€ãoKÌ(:¾~¹Gt=ö¤éZxü ïÀ1¼ endstream endobj 3217 0 obj << /Length 1532 /Filter /FlateDecode >> stream xÚµXÛnÛF}÷WÎ X/"EíC𨅋À ¥(àäaE®¤M(’å.ã¸_ß™%ERÇ(ŠÙ wçrÎÌìÈ®µ±\ë׋_–³Û(²'‰üÈZ®-Ïu`Y Ïs¢ ±–™õ`¿¯yõáÍò®˜ø±­ø¦fJ”Åäóò·ÙíÜëÝ~˜nâ¶{øõÂ5zÚŽÇ}e±5õ° H“’= .È}a/·|2õ£Ä.&SÏfÏÞáÆÂµË5}Pp‚äÀ?'¶jGÓ?ÌxÐW_?¯\K.IS# 벦1„Ç™LçÅr+$LYAW8ØÆbF¥(6¹Ù*ØÎÈk4ÈZDNûÖ8IÂÐ`•ç“ià…ÚU=AôЂ'i>”4¢ºØ6‡úFòŒö¶úÚ· 5)µ)8C£®pÛè°VHCŠ··¬f©âæ ÉJ… •0©µ'îЉ´$s˜(À¸µº£¹·UÜáŒt½„Z¼ÿÔ¢xÀFïÔèÝð #û O•1°¤{\é.¸¬8xº©Û¨ÔÎãVÁ‰Ü#0ÈŠD¥â“Ì5-¾;äÖ;\4RÑjKJˆ82Ãw[›xAË¢¬w,ÿ´" ³¡ÌmÈüšâ|wC#~îÚwà0æ{öýÇwïŽ9üÉ ÝŒ¯Y“+˜zWA`˜‡IÚÔ5'@iÜ¥E‡ËD›§ó÷{´ÁjHl`≠tŒé{=íÒ-p"?6éV¤Û²vÖœ©¦æòÝuöéúÌ}Ô¾´X€ËõõXØ¢',v¢ª¤:~²0àùžûL‘t¡œ¡"ˆ4;^‹”6¾MBÈܼáº>Em}‚/K ÎR,./)ŸpçÏ껢«·?]Õ%F©EèxÑG†1ÓEGU—ö“KG7D‚ñÿ70›ÈÐõÆŽ=}\çñ˜Œ/†1`#qÛ†¦h‘íóè(mÓÖ ¡è¥¼%¡IêTéÇ%¡è'QÏÜÕÈ%½ rgÌEÕ¨á & ÔîÅä~Ø»§—6ÊN¹”g“&(ªL•“æ¢r |løy×ñ}§sPˆã˜ób£¶4WHÄ#š[ÒÆ¾p®Ÿ´Éúº†“RˆVdf‡}§I—rtç½ÆÕ’ú›áÓkˆøEÖ°œâÒæ Ðqc (€þ‡ªNÁo¼^•òèæØ½²Êûe±l>Ûolƒo4ýÚ¼¯Tw`Àœg\ûs‚!¸œjß¼QûæÅNkuÉIì” |¦pQ®_öXGPH( ÏU„ |¨ ¼$]Å ¸Å*àªÐì÷Ç• ‚Êw2¦ØÑŽÅȼl•¤ØÌÐÛÔv-(¤,ò':`tÇ&7¢ö»Ã€:ò¸y\ÏÑgjäÍw¶«òQÍ=5j›bÍ;6N˜'ëÕ«‰.H÷¥¢IÝ×Ýcî‚õæ×9‡•GQH¥›S½‰`à„X}‹ ëuÅÒ¯—z!¹™l•ªäõl¶&›•“–»™„Çä ËÙj&µˆiKÔØŒ\¬jV?ak±W†ÝűÃ}s/+À>¾ìóo1pM2ÞIP°6˜ß{i^®¨ñÀ94¹]¨à:n®6á{5gF:š'¹’gà†tjr_ëêi ÊX][ûÊG—×¢–æ˜?fÔü^8fNk¸“‹öúOSšø»¶ ±Ö(^õ¬wZ¦áRñt«¹xð®ýÏBâ!!¼Öí(©éõ§z£íz»_©/°9‡Š‘ë úk`ÛàŠqâöãýàLσ€Úo:ºh+Ñ=ñÊ*ønn+˜qkx±cáTcÖrÒ¹u,ñ³pu褣T-+Ëâ îWÇ\WÂ>¼ýòýÆ¡øg@ÏÊG(M wxÄUž¶j„ë­(²žß¯éÌs¹ÎŽ«m™ SÀ¾ü‘;Ê|W²!-Ü[×@uu$Oús’7CÜM‘¡èþCÔ^9xÔn–ÿã¦éê endstream endobj 3224 0 obj << /Length 1305 /Filter /FlateDecode >> stream xÚ•WKs£8¾ûWP¹W ÃaÞ™d«¦2®™Ä©=d§j0È6^ÀëÍþúí–ÁñÅ’Pw«Ÿ_·mccØÆ“ß—“·Œ! }Ç7–kƒÚ6q™oÌ(%¾ËÄx2iàL,¿|¼õ}ÔõâÒ ¢oU9µ<ßüŧԌ›ÏQ!ÓÄVoÝ,'O(lmƒvÏø3Ÿ0/0â|òôÃ6¸übÀUAš 4™1ö™ñ0ùÞÉ;]¥-n µ‰Öù^H˜ëujþâêq¡Æûdy³zêQ8p‰›©F›ë}–R3“ÇE‰]–—j»årS?ó&Þâ~fFu½ˆW‡ÁfÄuýKœ!fôiH<*mþÌë¸JwMZ=›¶÷s 0, ± ɾܦ5`S°¼ˆ…qвLìÌ̃"؉$ðLtqGW®åºM|³µ’4çE ×Q&/ê´ØdÜŠy&>ØæýÔ¢æ¨ç’€ÿ»«x]w•ËQ£ªÌ•6h˜c‹BOEB…"]W°Ô¼‘J7¥<ÉXÁ&[ó€w¼B5AMS—™é=<|²Ø Jx.kô﫨QžêÐŽœJÐßD§x„ùL¯—Ñ=_:„‹ùZå 'Öeu‚-Ð1!dj1Æ÷×Ñ>S˜'0Ök(Íëwi;\±£j£ŸžQgàQHG[¤Dí"Ý$W3I‚1ëu>X¥PV=zÞ>‡„að²ŒÙK8RB×_{ Ô9JRÇ4®uÐgýqôvÔ¸{Ù[Jðó¨åV§½ß>džï9k_¥©fë®?$¶Æ¾jÓ—Tâù™bê©]ë…*âlŸp©HZœÔÕQá¸íàØí¡?\aƒå½9æH ]†'… Ef¢¸<5ÐÀº¯9Á Õ7?EжYàà›×z »–"T°^C'ƒòû¶Ôp½+¼ž¨ ’õ[ã8ü 0K˜ù.æXÌ=æ9f–Öü.’ 7Y´Ná™<7UTÔk®nåÀˆ¬}ÈßЃ‚J$$sDüžŠœ;†Jë²Ø~‰jižfQÕϸnÐ3îç×h÷}Ï«—Ÿû°›Fèb,öú‹zÁŸH°Š™}"ý'†—Q©7ÜÇP;iÒr¶¼P;_‚€(“0ÿG0”«—²Z’JD@™*(ê¾®µ^»³Å§×pïٗÜ6+úÉ™©dàÚ%›ø“"Ç \_ç`å7yÈU1òL´*o¸UÉìx?x Ílö§?·€7:F×N®ú¼U›¢¤ Èü.B‡½¾§JÆ»T1ßN)ÅsÔ„AA” Žlð·øèç6¯ endstream endobj 3231 0 obj << /Length 1313 /Filter /FlateDecode >> stream xÚµWKo¤F¾Ï¯@{iÁ4¯H98±)²V‰=NÞ=´¡g† v⟪®7c2c¯”S?¨®çW|kcùÖ/‹ŸV‹‹›$±2/K‚ÄZ­-æû^%Ö’1/ 3kUXöomã¸qbywUîœ/«_/n"f< ³ÄKý˜ª, ‘hák9à ¯Rã•.SõÌ "/ŽzÜŠ¼ÙíûNxQn¶œ°:¼L¼, ,—^3bðçVt[Ñ:n†v×Ð Gf ‡Ùš9ÞF6ÐÑ烤6ŠÃDª¯ëF3©ø“ã"¼¯ôË–×r-ZÏq£(²¯Äš÷UG䥤õÆaŒÙ—·÷×Þ± 7ŒFÄ‹–dÄ7Ñ>5Rœ²ýÑ‚` Ñ)k¥5)¶o›M+¤V×mŠ’oêFveNçðžŽfd*ÄRI !ÑýÃÉ›W½ø¯¨šjác–zašÒãKp]Û÷¢oyGûÜÇ Otq(»-íTDp³î« w‘]ðŽÓÝÞ¢(4/2¾9z.ÿRír\¶qQîD-˦æ]´¢èsˆj‡ð(aìô ñ$÷€•.äCÇdÑj@ͱ>ÊÑJ[åûV“IŽî# DŽP:p”{Z^~öÃhàI¾P0F};0€u½Zü½` Ÿo±1wcȪ µòÝâñ‹oð ,ðÂ,µŠrgE`Í2Ât­¬ûÅï¯"ê›õa‚UÆ|/pÇ ó‚!c¡>¥ÁÀE’Màš„‘ÄN Îø*pÁø‡qj_™qÁ E¤H´½x½TÑÁ`¡7x"@Y Gt¾Ý ßD™Çâw9‡œÍÉ8<åK9áJȼ-÷J×ïÈ’•“b´kÊÒæ¸$2áê¢UЇ Š‘dD}ÿìÇ~‡œž÷eΫꙮa›÷×l{ ç´Èþ ]§öÍšH6¢ر¹4Pµ%È¢IHºê¶¥Þù™ ù ׂ®ËVŸ‡È©ÀUúÃaÔKmØŸšN Bx7ìôU.†gU˲Þh-åpߊ/ë9{úšŠ¯7¢øHùöÔë²Z7øí0¦ëÛ:ÉIMÝ-FÉ*w‡&‡V½©î>`‰žEÓ™ÎzŒ®— E×*ã‘8œ: yB¢s¾1û¾ý#-ö9ÿ0KÏ¡»> stream xÚ­VÛrÛ6}×W`œj&D’ÉLûàÖvÒŽ'“Ør^œL"!‡ / )µI¾>‹ )R¦(9Óá² îÙƒ³ ô€z5ûc1{qPã˜{-Vˆ‚ý€£RÌý-RtïÐ(˜\üýâŠóžë½ë{„ÄÎÛºš»Œ9Ÿe²¹ÈŠ™nå>#6 „zçr½V¾ùøå7Q¬sÙ ŽáSŠà04Ú¹4ÄZ©o¥b#>FÎÖË"ù§)DžŸÁšªo«¸”à˜Ù¤v.G¬.#ÄùÍ5#$kóTqª¥ZËïfØ|n6jÅÇ&«ÊÛÙ:¡E&ø3ãó>k¶"Ï~H³ÜTkÂ`©Y>ÈØÓÓÌù$Ŧë±Äùkcý°iV4#µ†¥ÈE™´@­qqswÙf>»\̾Î(€$ˆvâcÁæ$4¤ìnuL½<ª> ”æŒ:pJ ŠAŸEÎ×­¬¿›©R¢š…pmfG+iÆ2уqþdÙh†©#r³iüÔOKÿa¾ÅŒÄO!ÌŒT>ó<ì¶8/d“ÔÙº ?Rƒî¡ê1‚zìh…+çŽÑ˜ïûC0µ ÁL3ä 4`˜‘Ö¡eE3;!êf4@ïªÐÇ$¶:¿kă<½§LåЗ†*]V±î`.Ð3f\urÏ»¢ëYºÌ†V¢¨R9¨Äô°DØJoëì,o²vKUÐt,Üñ5ê—TÅ2+‡¯Î¯o/G½unX4ø>8ñæîúúŒSY&VЙ¶µlN ‘V¸ID.u—€,¸…<5‰öÌybÞÿÊzY51i_wD5m+<&èóúa 1÷=g3ýXN Ú”àÞûLZ@è¼Û•jµÜ•ñÞÁhø°SL£=LóU°›aéÿZ@]GÓ‰…«ß•²jNÒ´Ÿ¶ÁœJ³4*QhVUm&ëÁÉr?VØ‹1ÌÙÞ’#ðÔó "G—~÷¯êåÜ æ¼ý󼃂CQäã8 Ÿ‚Á´›ê\½oÁõí_ûLhóˆþ=¹->ãÃmj XÈ! >áAåPó‰7Ý U«£O†¾Ó¬´/Î'ÙÚEwn‡¦w½m?d7Pb¿Yº÷ª Ùjïm Q¦Çð5fGÔÖáç !}BÍôûú$rO!??ÅÂÜ62Ý+‘^,;©ˆ•.øø»ñDMGxâ•·#üáú ÜÊRÕ endstream endobj 3248 0 obj << /Length 1299 /Filter /FlateDecode >> stream xÚµWKoÛ8¾ûW¹”"E¤Þö"M·EQtSg/i±%ÚÖFW¢›äßw†¤dÉ–9ôbÉ™á¼ùÉ6–†m|˜¼›M®n}߈¬Èg¾1[Ô¶-Çõ€RËw"c–äk]MMÏ'ÿóD|œRRNY@_ֱȪrúcöéêÖ¥=-¦CƒÐ%4n&¶¾²ý‰°oh˜,€¥£®\ðXljÞ d÷o ÀÛiè–Ýt‡lž*jQÕH¸d-]ð¤ ÚæC¦Ø†I=+Š|eIZYMçü Kn¸àu‘•\]ž-Ô¿—$^ƒA”pˆKÓ •öH#‹XÔÙ³.Õ¿XiÑõÔd!Iâu/ꤨäQÊÏñ*P^Õ<ÝÈHXe\œð ]K³‚— ðǹº´S –¨å²=Yðš— ·vx²F¹¹MÏ| v¿(:å‹x“‹WdfëÃ#9îe{>„ÁÀX>¢5  Ê \qmªƒß;’‹¬lÅÇE†FýkGÃpë(ì¦ÜDcÀ·¢KÔŠõ-Ûeêê§‘Oâ|Ã59ÝirZ QÊÞqèÙ²½\YôsÃë³*s]ª½ßE\m&U“hŽGIª44|sIKÏÛVs×÷³ÉÏ ëlƒvÓÎs˜å‡¡‘“‡¶‘Âá'Ž¢Ðx’¬…áBš×:7¾MþÙsÕîÔáh£¶åC> stream xÚ­XKsÛ6¾ûWp¦‡Ð3BðÍdzH›º3m’qc»'X„%&©T<þ÷Ý@‘²$;m/ˆÇbñí·(ð^àý~òËÕÉËóXz…(Ò0õ®î<"ŠS/“R¤Qá]•Þ/óôôóÕ/ÏÓt´4ŠsQH ‚hÑEמΒÔÿ¢ç§Òï¯ß¿¹ÀM'=˵p`>’2‹¢€ÄÌ #V«Ý™ÉþEofqfþµÒæ„D~{Çm­Naâá4Ì}”AcwmÇyÛuzÞWm#v¥µ ¼™LE`µét¹á= w\+§ -·F¡:ßI'iô=wáü©ÌkèÈÐ/õÚÔ½‘&ZÞÐÔZ™^Ÿ‚$Dñâ,š.†û¿Ø'ÆmW-öí9°“Àä.b_õÃqÀdˆý «fa²¡°pHÀJú÷øùeµÂ/6U‹]Uó”;ÌM€aRŒDyh lçV}Õ,ø«m´=·kW{ÆÉ#ößaÊJ÷˶|oßãB8:÷KP0N3R[ôž¶1x‘¾ƒcq4õÍW$µîçH¡ål®ëš':‡ÓzèÝàâ^1«P(ÁŠËïƒc@‚=©cÁâŠ<ÏËRQä!ÜOŠ"Iø‚/P‘|Pä2AÀ®8ñU ûØ-ÝK[¯l\çîÕ..Ù—\¤i>%ѧPÇ¡L‚´ƒ½–Ë#@ ]ÚY¹CáP¾bůU±SM 4 þèž™¿DXKœˆýRõÊ.©ÛþØ•‘(ŠèÿºýÜË×s‚óD¤É4â!wžPýör‚hPdv/u1$ÇEnuÁÒ…z÷K é¾‹Ò†ŠüMubëR=© ®²`ÝóY½=û?ðâõAú‚2KÑÚ@äGñIJÃŒ%± ºO§ºa{Š„¼}OÞ›†]n³aŽÙ0£ØÐQ`9³Ù{ ‡©;ì0º±ßÞB ÐßÜ(cÔÃçÏa~f[R­Ÿ­ †Ö7 aûkŠB­©újÈ»iâW ~ôz¡;ˆ[I”ùWKÍ;H>-âr†z77„˜% ›þÚPgW/t£ým‡øf£~ˆNrFâùhØðø]w·­y¢‰ÑK/:{kŽ`ë®]tÚX‹ÂŸ„2j¡­¹âññ"s˜ Yö½Õ½ªjs¨¾›”ÔsgVëóª3¤‡ôk­º†»©°[ñÀ6ðw§× ²ækØÄ†ãŒ ÎÏ!iÚ„‰Z±ð×¹_×”©b´xsÆCµ‰ZVf8|F6 ¬¹Rk®A#õ±F(2,vTÁDL$Bs¦,ádÃäU¸`«44Viþ e*n 2pŽ˜ cˆ Gmh ñ÷iåÀFÿ->ê~Ó5ŽAL«K½El˜€K& ¾,çî«~éøÆí#í1·Vpã•n ]óØ¤ºCU»:ùv‚ÏŽÀ“Ã{üRÒ›¯Nn>^ s`=¹wO+W^ –Ìâúµwyò×£“7ÑØû¤ D pD1¼Pb9> stream xÚíVÁNÂ@½ówž0)ÆW-Ïé [wÑåq¿ãU¨,äP¦—$/è®A º©¥ÑAí2@Ð!n»«ï˜á(œ¢B‘àÑšªi®–úþVÒ,_hE”:'æ¸VÎ3¼Ä*Îk`F­P! Çb&Ó¸ !WM; …XWâo%çZfYçWYRÏŸÈE&Ð^`Þ!U]}¿7[ÑIœÌ2‘â[݌턯Ðoç(0{œ=H"αÞÀëÕê^¿¢im^aºLŠLêËçÖP^»a¹µØ-õ½N›Aè™ëƒ£`ÄÌY}{S©ÌC2 ³­]VÙ¿I=Üìqu3'ÎY–߬%ÛhVÊV/Ú/Æ*½¡–NKéÕ¶6c)gFùÁ–ï‹oøî¾ñÿ}³w¾áRÅÅ]Ãws¿›k>‡ö«Îú¦*ßã/×o8ÿ1~þ­|œçQã Sˆ endstream endobj 3272 0 obj << /Length 1390 /Filter /FlateDecode >> stream xÚ­XYoã6~÷¯öIV\Q—¥û"Ù¢E“f]§/ÙE¡Ht¬Z‡WGŽþúÎp([’ØEàñræûf†C[Ú£fi¿L~žO>}q¹²Ð·}m¾Ð¸e1Çõµ)çÌwBmžh÷:ãûü·O_|¿·ôÞt,Ë·õÛZ´IùÐf««—u%ê:- \>±Ô)pDГ³§Ðt4S}å •HÚ¸A–—‰È>¢<Èš Eèyã5E” Ãô,KÿLŸ•X°6ÖÞ\‰×Á»ë‹Û¿÷ 2Æä°’Êý¹o–Ç ×íYgòLó™ËmZwQ=¶¹( ÇÖ›z€Ëø; 7âó|ÅÂVT¯c`ù€϶§úW¹ÎtGO¢&ªEsŒ ´ØgÜñ>ÂÇ#. ;Г$EL£ŒÎZGÐÒˆªÆ¾«7¥Ú~,Ð*Üš³%îå³¶@.öb4ÖS‚Á’4¯«kOAÝË@·¬IU ÎŠË¬Í‹Z²(A_©w[ XTeN­½ÈœJT¢ˆÅqÝ„r¶Y{.cÞè°Ðx0w“Þq\9á¸ß,Ç-„RnEj,ÊJéµTú¬ÌBDlê"}\ ÿ`å:-wõ({48ôÒf™Ÿ¡niH4Ë29¿k\‡B<(¤:]{ º¨ h²OGio’Ì0]×ÕÿX7[rÒ"ÎÚDüDSUT†Éõ4 ½ñ×,XS QŸÀÄuY!Ö®¥“4Á€ô O¤®¥/uQQRœÊÜ/W>/EAm ÆQ“4žê¯ª»^WÒ‚—4uZæÝ©ÏÂÀæ]Eu a ôíÄb^CÃÜìØ‹ Ôê¯Òø80œ¨n" Ø Ð•´§ŠzÜÚ¸:ðê[AWX°åÕó]´q–&"*€Xײõ¸¬Ñ[$×Â|ãp˨1w‘QÜ6rò åŒË(Ïýs!ÉlV”Õ);78o%½‚ÎüݾAQÙ.ê2XöòÛîGñR°´HÄËyuù•P´|E¥;ˆ„ú´‰jââI4mUt nv ‡Kèz¾þˆ’„YÙ+MW"O†çæ(Û¨ݬyБñlvÀ›?ÓgŽ0Ã黫®Þ8G…ß ÈÉšá‚·Ì×mƒ`8¡C‚è¹¶£ßÕbÑfjÜqAMy+Rh‡˜íž©!–­è1J ™¡#^ lÔj{«×~dJåÆhùR™&ÝíCzÊ|y.쇲¢òx¤#*7²ÎÜÞ‡edˆw®~€½´€L’¡\_îi…Ãü®öÕÇÉ-„6@ÈInùʨ •ï[·&Ý"ÕŠKredo¾XcS+W—ÞH™ƒ4ôŒ¡ÚmcÒ1"¦©‚zË eg‹Î¦ò$ew‹—ã {/›› úTCCîŒK³óåïhl%(jé6ÙT›î{›>(µ7«Ò];±4è¹ÿni LÂ#•9a =Ë¥¹æB机´3íÏÉ׃¯Kzë˜Üb>Ï{ƧpÂkâx€Vm$†.öámÁeñîMuÜÇðÀ÷¶{íµ•ƒYÁ9¦’Iîž¿/¸ë3'Pax)ê¸J×;áw€Ýñ»«™(Kÿ#vã²í®|ôDuïIÚE-¶SgÂs„º]­ü5ªë¨W,vCôs&딺»UL÷Ž«æ©W‰-sr-Ô'þ®£ºÒù°JšBÑLŠ&jô¡‡…\g¸®ÞÿçPùBä¦É endstream endobj 3282 0 obj << /Length 523 /Filter /FlateDecode >> stream xÚíVÁŽÛ ¼ç+ÐT³8Ä8>ôJI¥*ZUsJ{ †¸n³\múõÅÆ‘LJšôÐ=í ›7oƒx£÷ÙèaIHaJ&d{!ñ”€$Š Á)ÈØŸo˜Ø5ÕÅó“äJ•¢Í>>,§Ñ€» 1BdD³´ŽP¿‹M0ÂIbþ°]|£hÁü¥Ñ¬3¦:a”ÂY_Îò Š‘Ø}ç¹~;c„¡™‹ÚýºD0L#K¿¿·ˆ5¶ãëo‚Ùï½ö#¯¨RVz‚émôM_”a–Û`®=ú8^¼IÊ”>¯ˆê¤]üIl¯¯ ¢mn¤'åTóBÈ#> stream xÚµXÝsÚ8ç¯ðЇ˜™ X¶lÌõ)×4ë´÷ôî!탂øÎÆT6Mé_»ZÙ±òÉL,ÉÒj»¿ý0ž³t<ç]ï×YïêVpgÌÆ‘9³…Ã="rFœ³(;³Ä¹sùØ|™½¿º¢ÖÖ@ø, cd6Md’nK6ÍÒDMÕW<Ðóì=õ.‹[†/Œˆ¡?‚Å€1Æ:‡÷4¼F¾?r¯õr›«õÀݪ ƒ@¸UÏÀ½ aUÑd#ËR%4®7äªZfSRÒJ¹@èŠf²´ À‹zÐpr€áΜx£•¬öVËêûÕ¼:Šþ yÈbOTÐMîž"ØÙ Ðø‘p×2·£bAϪ~UÅ1ÊE<;šé±mÞotšKföý¢Ð4x@sJ½N×Ë+¥u½œ+·T徦m; ²€ÅcNÈæ`Že¡w,—•N¿?…q±qìÃqŸCŸŽ_ƒ#øÈµ‡Í8QŸ½@ j4_êb»YISƒ›Rm“â~›ýGsõ}£Aÿ´XÓ|.³wçÛLV°V¾†U?p•œ#ö*j°pP&´XŠl›¯‰Z¡´.ï¤}ħõ´ÂÇŽÞÎá¶ rYo¶dln$¹úëÁòÏ’Ræ›L=eôac»©@Å­>ôV—WÁî»Ĩm\Ël÷C±ÁPáÞ¨…Üf!HíV™e4Xt$¤Ö°›»+UGmr‚BˆÃš=“;¥ÏŽV2 ØZ㽟½Ð+áýÑA%Â#@ƒÃCßsÓ½Êñ0`KÑÔf“ÔŠ^-ÓoFè\'âA@ÊIh‰Þáuú8«]hn\Yi…N…YƒEv5>kQì¢1PyAC(:Ñ 2|¹¡Ä†ŒJ1TBñ¥¡?œ+ û…¡‹)è¢æg#ûÙ\*³¢:áä*{ƒ‘aß(¸S¥¨pI™‡îÝ'À7¥ï‹R=}¿@ ü©SŠ<œ#J´¦-wb¯„ôÛhy£‹%¦[=¤>‡¤í ~"ÔšèŸUúï Ê£†Ö5ð¢šÐ Û¡†^“èËg–V®kVšjõ´êÜ7ªC½Tº­¡°BìZ扬dSB-NKs×#C#ÃÐÃôòˆñvÀ9w¯?Lß>æ(°ûݹï U¨Ôä->® HÜZFj+¶Äìís·O9â»_¯@EÈRä}³2W€A¯`ÀBécD˜B#j ÀÕ>]pßäÅ£™!±¶9;rí9™$ ¯:áàÀ?¾f`ÍJ-ÅùÞ0}VrFpP#D»3£Û³ˆºIpªÞè"\hW|œcÅÇÐ2‘_ÖI´X¿Fo@¦\ÛËŠÅ/À?Ïsû&)Ùk¹„ͪÿS‡Ô‰¶/—5–èøóœ° ˆIƺйÌÒ¦a§ÍÔi‘l‡õ±m*S†kÍ:Ò/mÆSê¹=íïVŒºÁ¨>ÚÎe^ Rl!çUq¢|sôý·[t¦F4hÀ+€Ä Ú'°ÔK¨,§ ü‘6vr¸­Öä¤ó›bÒ…õbN‚í¢ÍCŽŸY€-°ØþŒ#($[õ³/µÎgaŒX[OLö/ºMþ‹JãbÓ\ƒ£`O’ûX-ðQ·ý>t§iµ¢Õ¥Z«zŸ}j*ãØ[ûãc 8nšc÷Ý=˜®Ü´õ%Ö ØüÛŠìG³”Ú³³ JýôöòØG‚n[„¾D»³¦²­œÑé¹¾žž.Ø.}:¿õ¾ö¸È›OzÌÁû#gž÷î¾xN/ Ʊó`¶æŽD#À8s¦½¿Xáu~7hkȹÇ"Ð,‹¹8ý“ÀÕm4î"Œ…ç¾Sh(h›§›A²³ NŒ°'àE>ñð9ð†8òó‡æÕ?Hܨr®ÓMÍà³ceDÇ ú2Ba§“ЩPýdÚØcWŸøe?l_½>BÁ›ô´•ÇŒMÂÅAÃÍ«[ÒN¯o/Ž5ônÛÅûÇŽÙ‹²ö!…ùõä’TaŒ™nÄÆ›°1ç/ ev=Éåæå8 èü?ôå5 endstream endobj 3196 0 obj << /Type /ObjStm /N 100 /First 977 /Length 1757 /Filter /FlateDecode >> stream xÚÍYÛn7}×Wð1yárÈá ŒŽ§4° ­‘ÅÞ¤n])d ùûž¡.‘mÉY]œæÁòìî!g8—Ãán ,Æ™@9Žú?›Bú¿ Bq†rPŒ÷EAHÀz'†IÁ%™(¢B6É¥„brÌŠq¦à"Æd>êO½—¡ÄG’ôô2AŸ'À8êPè èXŸ£ëáž’DzÏÃ@_§ †Š8•Ø`&µSyô)á^еyÊÆG¯Ú¨@J’wÆ ©Å! C‡ÇØ0K΢¶x<-˜*âÊO•©nçT…Îéb3¹¢Óy\«ñAÁxJúB]FPI ­`fø"añœÕº)ê“êÀŠ×•颦Ш$ª#0IÆS¨À°âTÀ硈š‚ÙÙ©í ÁvÕvöaµ¤j;Œeª¶#ØWÛRU‹,aά*€“UE1œ\]žƒÄb"’„SÑéà;Îj˜.›sÖé`—ê`¹ÔdˆÑD7Bª÷Xð*T ™2ŸCYDB`Aêt¸…e@¢"GNàÊètñX ©ÔA®#¢úCWü‹Y½ï1i,5à_q5oA²ªybÄ×dX\•’ÚˆºÁ¼õV„U–'\*àx‰¬F¥ )WΈh€=|&©>EÁI®æÁ!’³:?R‚Æ;cDIo¤srõ)’#!Ô½ƒƒ^óÒœõŸ3'¦ùý? 9gƒFÅ[‚Ü\_¿ï=þ0᳄¬êˆvÞ¢ª;¢‘ÌV× ís¶ˆGG4•hK¼cÉñp01¦9O¯;FE·¸Pê£Ù…(ÿ?ÄÀåÙF!/®”’°½‚²æíhxqÚN̹iÞ¾<6ÍYûebvœ}ýÜâAÿSÛkŽ`S;˜Œ•¯’Žï5'íxx3ºhÇS®«÷Þ´—WýÃ/æÜá†7¨«÷PÔa´’Kžƒ!f;Ÿ²ÚS y&LWY y&L—zÇ´:I¯9½ù0©×¿^ þé5/†£ËvT pï›_š×ÍÑ9Õ µù«EÑYmLÞÖJ¢`53)çbî°úÿÔ4¯†gCƒø=9ù8°§Gg£þ`üq8ú÷©úo/Æ lïTÇ`³L.6ZoH{±¯’O£þäj88nû“›Q;ÞŸY |S‰ÈFÝ‹À7¨Þà;ÿc}DëæäØ2è;¥ÕÝ7à?öµÆ¼j'ÈÒ«Ë›þõþŒÁVgsAíºlëmBЈŠÇ?´kÙ¥mL´PJe£Uê¿Ç!·À ¢tNñ‚f«íV74ö1‹^§˜Ø[YG}·Øî6v¤>´…Ün\G+¸Ž:r÷t—ë´ÿ›Z˜ <h~gÆÏ{â:ð›Õ¶U²C¶íI,*I !Yym²ŽÇý¯û$9ª5"(äjÓhE›X'þ‡™€-^»Ïb”0©Y¹˜0ñÃÚd¡[°Ó®F!AÐÃÁGé%ø£6Þ)ÛBzfI–Ñ1²îKÎoJq´ ÅÑ*ÒÂF­§½n躽#Ê»5UKôq‹X¶æÏ÷¹Äû͸dyé>làÕeðÜO’ÄJLƒdqàꈎI7¥®vÁÉ ?Úαu€­pÙ>ÀÁmàeð"Ñ•ŽèˆbÇ9êqÐÑ=æŽh©í]74ØKºúDÛçiWrXn4–3iûä)÷“'¤’'o’> stream xÚÝWKoã6¾ûWÙCe`ÍÕû‘E)6)ºH[4vÒ=Ðe«•%¯(ÅÉ¿ï ‡R$Gq6—ŠÑçññÚ26†eü<ûi5ûpFÌâÀ ŒUfØ–Å\/0BÛf«Ô¸3oOmëÏù×ÕçWž=Pwã€E– Æ”¢Û¨4³´}ÐŽÚ 7Œ”ú aÒ¥MïÞ;e™K—¾;Ñl«”䬪IH .%9º“wjõíÚð°;óK.óv÷ÅžÚ6¹Å2vìû:lžæ­üËò­jý·Hš÷äŠLx!Hü‘>gEu¨…<Ó Œ1ؤŽE“ŽËbûÿ*à kmGzÀ¬8 #.êM»åÜuÌFŽPrü=r Ùó´rðfö(Q^è„æE9_¸®kæ;¾$Vkp;0§ '<·õ‰äéãÓñ9ÆÇyæ )R:º©´ ÍVÔ$ªêϰ!•ßãNHîPQN:ä+‡È‰Œ'MU“LNx]]ÕÔV µ‚Éë9ìüHƒªÔUv>_x^`žmsœH`Ї~Ê7á¼ ”*íßn¯¯'ˆ„³ÞÑ­ŠÐGΫm©Ü×y½Ÿû¾É‹V°)Æíq)0žÈ5/ Y½Døc‘QãÄ›×`¹mÍ›ß8ÏÏé>Œ_®fßf¶2h÷4 @…ÂFF²›Ý}µŒ3˜GÆA©î b=¤ØÂXÎþxñÖ(.{h[,€,{>dÁžqù?A<ªEy–y=÷m³ÂsíGf^Ò7å ')«•ÒG¡ÙÙÕsXä‡o •Bò&Ú“g»Ì5 > ™Ôù¾É«r²œGPë çëîvYòu!$ÁIpùH,æ”±Ütè' ¹çµÔ|¢w™7užˆîâ×êJÜçiÓ5޵eL“šÜˆ²Úå‰dßß·iìo¾ÂŸþ¸›#Ù«;«V<ºbKóú}ׯ‹àµ`IU´»rÔœ±¶v;E1¥mOÚnËü\åLð¦­1›ƒ«›ÛËÉMR¿g²Í²üa´ãêâzy©v,&‚üÏW—ø.«§¹ÛÅÞõ iûÛƒc&õž— 8§ˆ½¶Só…m> ;±£ %Y#ïIOu÷šä.Á¸ŠyÐ;x™Òúíp¸5 ‹¹8Ñý«;Ç8Çõè>Áàè&DáÓM€U€!#é‚>÷Øx„nX0î¾%ßÑþç* /IX+W 6ù=ž#Ê)À( °M¥ªuF˜**Ev0#Y¨yAKú²ÃRª«“CØ€4Ï6ÉHG+tî ÑîÂR.i¾w[føÔñ&®f^÷Ù¦> stream xÚÝWmoÛ6þî_! &µ,ŠzÖY–Š5k¼b€xŒDÛ$Ñ©$Þ¯ßQ¤d)QÒd݇a_¤#yw¼{x$zÖÖò¬·³ï—³Åy€¬ÔM#?²– yž‹ƒÈŠr#œZËÜZÙ(õ«åO‹ó(¨®æ~šx©ý’y¿­O¹3÷›×9«ˆ¤B™Ì<3L l=kîÇÐÂz‚NÙ¤hèÈf`; 1±æ(uƒÐÿ¸qæ&ÞP"›š 77ª'¶Y•³¬ ¥U;ª…œH¢5vÄŒ•|šB²}ñ@I:ð9ìÛ쨃l0Aök­Eô¯`Bj)ã•r% «XµÕŒ’Ø“Zï%‘5»Sé*,ì4 u:Ò ¬£ ߢº65/u%™šegT•ÜØ*ܲ¢ÐÒõ±Û5ˆ*š»Î<Ž}û=LRß2aŒÌ4]œªËÄÙößOM«('’ w{X ÁÀbŽ1îÀÄ ,tCÅ«ØTã[[k£z™«E÷7õMIžÝ‘–JLÌD%GQÐPk_¯^9óÐó쟹ÔBÝTßôYy•™ÔèóZ ¼‘ûÆØèµQÒ)-ФÚR£õ­þa×ùL´O…Ì:gî\'ãA¼«vèkË0“•½'r·|¡Ü,À Í$¯SN&ÜKP•±»a€ë'/ôºÐ@F:<ÀåŽ7E®e±ã·Zº&uÆsØRܼÖ][ZÚ¤2Vº¬ÜRÞMá|¬žuWœöoœ.D·Gïþâžp/hS¹æ×Z#ËÓÎzÙŽ¿o‡Õ$o*)FŠ"ÎåÃF@É—”ÌwoŽ5Ó ·Lî rý!Õ¥ª%yØëÝp?Ûÿg¹Û¿LMõÇþ¨w¢Ò`ð1|þsõ¥¦øÊ€@þ}r•ÞÂFÓ–gÇ“÷ùæ2I&2Y­ž½ê+û¢æ’²êWWPAÿ*R'•d×´ÅÇK–)&ÆÀå€1ÁšR·—Lˆ†jÍ .˜„ÒOÀy.ŠÑKàÐi,È—ëyf…~ "«Ù^š­ñRšùŽ·‰™Ñ‰ƒ0HøËGç˜74û¼AñBñ¦aîÒ믂léó¹ÍãQO,¶*OuW¤¤ÝÊ Ikw|•}Ž‚ÔÛ¦¤•ƒ>ÍÃ>cÌýU!Ž*¶@u*ˆ%×ð’~§Ž `D¶‹°ÞwØ¯Û H=´z`ñÉÃAñ ”düvAPVIØGÄîé)œ·úÀžÃ˜¶~2É…¹ÅT7>’îPç¨þ¼*ZbUV4¹Qí=£¾#RK;¢°ºq ùƒî%KÖšæâhé€Gnšøc _2àâßçþ)¡\½Š´ûÚ€=U:i ýËç‹Þ|'Çg…»©ï×N÷‡æoÏÞš endstream endobj 3324 0 obj << /Length 1181 /Filter /FlateDecode >> stream xÚ½WMsÛ6½ëWpr"gB„ ~zPãÄÇI[Ei;ãd2 Jl)BæGÿûîbAYVh;ͤ¾ˆäb±Ø÷Þr— œµ8§³Ÿ—³g/ãØÉX‡±³,LD±“pÎb‘9Ë•sá.T¾âÁ_7Òû°<{ö2â;D³4ÏøòL Ó,°G¼XÎ.gn‡ï£ÇIÌOb;»ø8+Xœ¢èaè”=¾×di÷ ¡cêê~C ]áqwî¥Â]âÏ܃Åç>bœ>—II˜:u [„póC‰ö.ÞÌý½Ý`+TÇl’ì#C¡d · ½ëòµš¤v‚êôª©êÞ2(«Z5ùV=õ|HÃÇŽ¢ËrñîÅèÐT—ƒb¥Êû¡pƒ˜ü[àÌÛõ°U'B·ïî…õœÀÑ+t«Ú.|‘€Ø¿¡V¹RX¥A…¤ëÁ»sÇѨ¯dRX}o¸ºÿèŽ>Ï©ŒTM‡µs¹¢K8&uUQzµ yÀN`ª!lL5ƒõÕ‰uİÃ_ [à-•×}˜8‹âÓ‘¼÷ ƒv™¥!l¡ä9mÿƒ ¨¯ D‡è‘u¬T™uO†å“¿»²ˆŽ=,¦?¼,vózPß×z ÉS“™›SívyÛ)2í;Ø­<`µvd§7Ì…®‡mc­õ^tµ‚F$ÃÀ}UÒ’Q0W»Z‘e­M a¼Ö¾”µ:ÕcÚ}òØgˆéºê,—º¤ëÎAÓ!_¤_7viGÙB³õE9¡ìî™"’„…Àðÿ:7E°u°_N>ž*}Öœ¯ægˆóóG§žœŸ§³* ÷ <Ï}ØiÐÌq™ý˜A*BÎÂ8ü!ƒô\x &Áƒ›x é)ê è<éànó8Ã'¹K:Óò>g«ªµ3¦Sk }ްþz§nM™'Ìü'>gÆ¿{Î@Û¦¢Š^·×ôXhz¿óª©š5íÙ÷t‡ƒêà‚q:~u“÷­=ÜàŸ›ªÀ„ ý(Ìl<óE1±v°ÝD"0ÀУ†’å" X@2ê–®fçPÔXuƒ):è„ ¨†Î ¶¾©ñÆ2\)ˆ;Ñþy²_‡‚²°Õ^ÙÖØõUmG¯ùÖ{ŒÁ2_­ô¨D râO .E®†™!¥û7”ˆg|M}$õ‘ŒZ××kÝe”)uIúŽÌe;¾çÈMÙ*L°+è³·¿¾±ñpœ%îçje¾ƒÁò C]Ó|}|í–ºõïСW¶ï”ÚNȦëácz”FSæíªjòÞ¾0ÄÚJ}ö$r=É4ôà=ßzH endstream endobj 3340 0 obj << /Length 961 /Filter /FlateDecode >> stream xÚ•VÛnã6}÷Wy)DŠ(Q·}HÑM°‹Å¢M¼Ata°ms«‹+ÊÉúï;¼H±ÅIÀœ‡3sæFùhƒ|t½øm¹¸¸¢e^1Z®ñ}/¤1Jñâ0CËÝc’QçÛòÓÅUAïÝ0 AŠo8+ˆÿ×êcÅ6\á¾Uÿa¹øoA@ô4ljïEQ„òjqÿÍG~Bp”¥èQC+DÁxBCKt»øsÐ7]ûé±ûÄ÷b GÄKSbÜÙA`”Ñ”úø³ܨV8n¥˜™”áÚ!˜×Ž ° D¡¤iŽï„ûÊÈOFç£f^’†ï‰†aMg’e) ©aý;—y+vhêç'îãÄ§È ˆG#›óÏ&†š<,†|Hñ5¯›Jôtac  ¨îÄEWé)$'5ú¿Êi2^Z§)ž8:Êîß~ä+¥‚UâePk(À+D{®þÜiÍ*ïã_ÍrÖ )÷|U6-—+ƒÚÕ›³Y%LJv߿ݱN°r/K‘Oìé-2ǾeÇ[¯b]+~Œ®-o¾~8A«;ì&fLÎî‚3}É „’¼%‘—íf_A3„îäÉ„¾’È!?“•©:A‚ÿp`ð°n«Š.Á]cV¸Ëó®iæßGÑlíÆ}íJ³ý0nb¬PÁ:ö‹3,·Í¾,,¢ÎË}¡k%±—¥Á4`!-¹´1KGNDg¾’,~DŸÏk¡Ëœ•|ÍM¹ú.›ÚS?sJÀ(4o]¼æÐ®‘BM ¹*…ì¼\>Œ€Ülæ”ûÖà¸ÕNÚŽT¥|Ñ­Ô7k;ϤÓP?¹`/†MæüðÈq÷¾Ç…uÓZò[nØë8ž›Í½ì½1± ñNûÙìö%x:º©¢%;Vçü';…ÿU-ÁßãÿxœœäA+w\AZ׺‹5gݾåj;ÄýhREB­M]ŒÔw†¤…oYg¤-ST4³ó†rõ䪫?ܱõ4V-•h£¾O‡î„S¡7Aðl¸¾Þûæ”íÃîØ§§n€`Ö¶ šz(ÝŸ9t¿ÛNâ;rf-‰ã33×_݉ñÿÎÉbÌÊ=Ï‚}‹.íøóRÔnP/Þ<‹Ý½v¯q^™îƒ²Eø;Ìò·°¸å*JÀú²„Æž€Þàå„߬»óŠ,AõŤ>Dì‹ò)„oÁÿ̼Öo endstream endobj 3350 0 obj << /Length 875 /Filter /FlateDecode >> stream xÚ½VMoÛ8½ûW½”V,)R¤tè¡‹®[] Ûxƒi0²œ¨°¤V’‘ì¿ß!‡v$GMÓÏ‹ù5½÷f8cN. '/®O–Z“œå:Ñdµ!‚s&•&F¦eNVkrFß–v-ø»óO]{ÅIFËóºìÚ6ú°zõd©ÄÈÅYœÃyêN<|ì¯ÕâóBÀ”qøŽ6’å¹!E½8ûÀÉ_8Ê3ríMk¢ŠQæ[r²øçàïxôdT6Ó€M§šcî’™ò8xMò‰›„å™ ±SÜD© ¥ûqîn¢X¦†¾é܈äÏ`+£?0/”Lkõ- U57Íãñ`Übô ;”kvüÙ1TnÍr2ÿ ãC‘AQwØ£íwl ÁfÏ ¶jªæ2:>{?uç×xs’Ѱ>Êh0Çxâ¼jÐÊg«Ëbœ²$¤r¸…Ž•R#QRA7v·Pl„xT} Ž :Ž£ôz<ûDr…€|~%è4Ê5µÛ]ù=Eæm9ìº&³ˆÛçÙ¦;à¾#ù8m&•Öûמ\q¡.³4ÉmÓ‘ÊUb9-'…Ý–KëD_Ë9‹…Tœ¾öí› ¶p‚“Qá„Æsê b_íj\ŸþÒ64¡ed }u^ÉW?©%¹a2û9}èuëÙCl‘½œ´ È—Óè–<,½Èh·Œ25"þÅJ™ü¢‚?Ž·+÷ûºôÛK÷7Ä7î­Ùá ÅÚýÓD¸ÙôœôŽã9žìÛ†¹ŸÙ?†£2ÿ€hüP]y݇;®Z¤š~„®4ëÞÆÿ‰¸- endstream endobj 3364 0 obj << /Length 1012 /Filter /FlateDecode >> stream xÚVmoœ8þ¾¿Âê' ›£ê>ô®/ºªªzÉ6­”V‘ Þ]Ÿ`ÙÃp¹ý÷7~¡$"Åf=ãyüÌ3chônóûvóâm¢ÌÏœ í…Aà“(Aiú Éж@×N˜%î÷íûo“ddzíašÆ©sÁY_o.ù¾âGS§e­¨RùlêÍvóÏ&„i€Â!J’~Å(¯6×ßTÀâ{KE·Ú´BI#ó]nþö›æ(t|”0ð8\Ã$2G™‚] §Ì&§¤Qà|pãЩÕ?V¸‰©›˜É;~¬+‘Kõ•:W®:BŠ®2ßðÒõÀ­4Æ—\í1½Ì É ¿Äá ZHgœQŸàÔpðšË¼'rò;¦’ ÈácjÜ?ÔšB,0q@"ààŽø Jc¶¨bO…#‘Oá\:ÜgÉö|çnº‚{1õß‚8P›k?ÑC?‹ã *ˆì¢y®-»›Õ‚µì§‹ÆõÈ*Ùç73&ù¯š}§$C°ÓÊU<ü!—³ZŸ(ýÚ#§Î'¥PÖŒ|ÛÚˆ|yÞÖÍÙ|Þ c0®UûÄ?.†‡J „Ý ÔórŽe|Åpæ“p¦¶à§ÿõh½³ç8ØÐ?˜´3 Iã ;îycm»V>TrOå«°°‚õQC”f‘5"=ÑUaæ¢5Mz¥6ã.Çþx*ë¶å…ïz”†ÎPR*kÓ²²á4i(MüŒâ© ­ïALÝVð†mFÉ1…ºJAŒ î’B´§ +6W½ÖàçZŸ8¬í“u¯yöò|¼ŠLcx P«ž¨ï-¡ÔödØ tú³¾´r„!AòŒÍ_"W b#œ ˜R ô¦aE$0z‹î¸ç0‰“ëëKýBÒ£öìòR•z'UуShQîŒA'…Ÿ±¥Ú¶ë#hÑÃÊ®ƒ}špÅÚFügÈÛ5µm …¥NHËl+ú‹µ“¼øeÕöM{U‘’רpzŒ±¦HZ WS›cÕ÷zJ5ŸÊHÍX˳u?pÛøé´G¨-w¾êsv}ÖCT(r(xÅøKØ-V™ìµ>EÍõÓ‹{,˜ êù¢Ÿæ*}””FéÙÕ¶W¼e¢\|Âd‘ñÓ7™}x^¹Yâ°²ãOyr½2!¯Ì]Ba†myBcŒçožb”>în&¹ú"½ÌÿN Ï endstream endobj 3373 0 obj << /Length 1218 /Filter /FlateDecode >> stream xÚÍWÛnÛ8}÷W~’€H%R—]샻IŠE›¦ÙîIX›¶…èâˆtýørHJ–EN°Ába@¦ÈÑ̙ù¾µ²|ëÝäíÅäÍiY©—FAd],-äû^ˆ#+FÈ‹ÂÔºXX—ö9£‹Ùµ$vÄ6u¾_|xsŠQçã0¼Ä¥jõJcšøÆÚÉÅäf‚äзPk(ЉG‚Ôš“Ëï¾µ‹,¹”&Ö-,,±ÄÔæÖ×É—VßÃå NºÞ ß‹$Ĉ$ñ£®7ÕŽöÀIÒΗ—n”`ß>w²<èÂqC’Ø´4ƒ0[í—b{æÄVŠÕ럟OþѲ *´µa päa?~ ÚU<°qŠ=Líê1ãó:Ûˆ¬*{ÎîîíJ,%^˜${¦¤ah¼±ý±¢²ÍËã˜PÂãrØ8þ¬ –â%¥¿8]±Aˆ“Õæ^ùÄ…J6”BÈK ÑBË,g%-Ø‘ðû‹b·aŽK|ßþCÿÍAÕ4+—U]LôÜtSWsÆyU·37Û ë©Fƒz¥QÁêžæéñììýÏ·9-¯ž±›~©M{7[ZŠd£e‹BT‚æí[‘íW zߎ¹X( Êš;ÀP»(¡¡—"¤çåöÿ_é­nç)çt×g]9ð€jS<Ï;ÈÉ¡XžÕ«mÁJ' lÁGcú©XŽû<>¨S½”½tÃXfÞä äG票töTÔÙ½¯XÉj*˜Iè:i•øvÃEÍh¡W$õŽ+ÿ¬\y­w{ÄKÃÎÖŽb%€õëFégól¹Ó&ïÖÙð¬õ«€Z²3R=Éxã‚÷ÀåÄm¶`‹G¨ãŽ„xÑÈÓá®ä€.#çÊ|Io1QÖuÄôEˆý渓çnJ§ˆžuvDëÊ3Ø™­8x-¯tZ¾’K™ì¥ã"ûÔI°môþg®èòJ®|Ù¶7’î@¤™60ê †4™™¨¦BÊ—ýľòC¬» ¼-ÛšµiÙó{ó5烄Àâ§Ù:+m_g›ž‘¾}ȽÃå¡q½×ÇF @@ÀßkV>‰½©5èq[!þEd™R´fš ;.2ð}NÕ‘J‰äìXîô˜«Û³SV>¿„Ê.6ÎLHf>ASèX m.ªÚ =4ŸáñÍœÝø öH·ËñD;Ýojè EݤzÓŽÐñ~UJÓ‹çôæoNÙ4ß²§ŽÃcý¸wqx5ª€`¶ØÎ¡Øq¡_î2aZ¯ÚæU{ô#+;±T-Mž¯Ô²ÊsÕÕîÚ6wë¢\àcåS\b‰_N!òZ5ÔläH p`7+ùó«^YÍðüݪ[(™ÙКK±<$í•¶À”T`xƒQ7¢à{¸Wȇ$»bžs-Ek£r^åÛ¢äZVÝ]`v_'áæ‹ú'=}¸%Øm¾{ÕSÄœ•¢®²ã˜Ä¡ºj¥æb©FËZgd ±"cO@£…¨KcE‘^’úUfÎ±ìÆ ˆDÕDälVê±®3J4§Æ>8q&“4'ë%FXMïtý|‚[s“Ô˜R0”ò®ü à endstream endobj 3300 0 obj << /Type /ObjStm /N 100 /First 974 /Length 1578 /Filter /FlateDecode >> stream xÚÍX]oSG}÷¯ØÇöeïÎìÌ~  ˆÒV¢m” DKó`ˆ[¹ 1r‰ö×÷ÌŠCn`lŠYs7çîÌΜùع$\ä’I4¡8[ƒPpuÄš&ÅJ.‘«¸¤É)r`[P—¥˜\®2]‘†-®´ýju56pp5CtD!˜DÐCMYqSû¯Â"Š&%HZM‚•t¢Õ%[ ö ï'†#)•¶ ;ÊQl Ê Œ† શ5¨¨Õ6¦ä8ˆš”!Uš$ØÄmc‚K¨˜%0‘™í²½ÀÀÙ?ð_†”ÚZt¬íP 8… .8'çpN5LSÇ9&{k¹˜í ý…Ív¶Hd³¹B…y.6 n dˆø jvšw)˜?$ÕTØZmoÔ+—C£Xp¢éÖÜÞÅO&1‹±_I†HþMXWƒ{%´,¡ÆVj[S‡ˆ5\‚TšŠ±Q@(üš ì"fmDE`@‚EÙ´*þ©ÉŒU¨H¤Pݒ̰¨P‘ƒYŒXJ$ሒ[á)-Šp¶”Ú^€ÖÚˆPHmaU5´0✊ CvWnü°5 ¶ <­¢*@v©vˆIÉÒBÉ@WMíØ0[S;6ލ¹;C*Ñ•RC…Ñ ™ŒøÂ½øA@5/‚U‰+r‚Tìæ"£$Ä#f;E!¤/¤¤“½½Éðäï×37<8?_¬&Ãñå‹U{~ I;ÑiW?8åÁâ|Õâx€‚\ÑåÚk¨D5½{)+Ñ»qV¶ßÂÐí¬3\=¡p ©j{ÂöÃárñòx.¹ápÿÀ OfoVîä:=§Ì&Ã#X1;_]X{ßXx±¸\¾œ]\5Ú¶öãìt>}¸xãqZb® &N—xÔLå ØHÅ­û›='ÛÉ ¢ìÑá. ÖL‘æ'%¸8”O$ÅÏ/þÄ&÷îMOç—¦ˆµÏî¹~àduþïC£ôyBqïCKFq¤¼4£÷š ÊaíE£úêmœ¿Nóõ¸Æùub$îÌyát,ÈÖÝ £åcï)qYðZ¸-àt'–Œv¹Ü¡Ô®së#ÄȆÜÛ$!;IhƒÁ‡$äMHÈc´ÊÉëhÙ:’'íµD³ú€ûh'“S-½–zx÷ÖÕ½í~ÀÝÄ Þq/£vÀÕ´M5oäüÆEûúl²–XwÎ 73$–Í2d}4‰WÙÜnÊo…¼Õa£:Z .\»(UoWT¦hSã­ÃÊÓùÅüòÕSÞÞ]âíÔD z,Õ>©`”G=ÓäSH_Ò„ŠÏôŸ%³çøiK/¦§žù£Ë3üzºšOÏnŒo±nPïÖÁï+XðytÚjîĪšÕ±-„K'–Ñž5§N4ö’êgÞW¶_t¤ H¹{£”Mˆ#£TäSÞ šP‹w¢Uq§`êEõö-ª-¨f"µµøÌe7è`Qêõ 'ò¢½§´â¬¹×ƒ”0§—ôÕuÊ42K&¾{§L[½Ä‹²Oö™2â‰þĸ‡bpû¬.6™zS¯ëö%'ht½ðŒ¡-™$}h äK-h*6o'îÿVÛs¼IÜLw'n[èp-È-ôÑ‚ÉN³'¬0PŬ·÷âõty1û-Hx5]-çon°6ó¬]¿ç¡ÞR@·€ÆÔÀ©Œ\–;ÑZPF¿sŒ¡#Ð2úc Ý>·æÝbð |ÿ Ï»® endstream endobj 3388 0 obj << /Length 1433 /Filter /FlateDecode >> stream xÚ¥W[oÛ6~÷¯ò2 ˜R¢.ÞЇlK Y±¥öЃ,ѶVÝJRmòïwI¥V,+I‹Mò\xøïgçç÷Å/ëÅù£ÎÊ_ÅA쬷%ÄYì$”úq¸rÖ…óÞ¥«Ôû°þãü*޶† õ zôžžª{Ü· VýðÉà2d …Î2H`24 îJFÒO<{¿ŒqïH@Œ/,-¦¡[s•™ÊìúHéOÞ’Á¾Ì[†Qàê­0 Ý­Èjn&¿”jo&s^UËŠö‚Ôå•YE f…†a¸e“Wuû‚K³–Uv{ÞV}ÝØÙ²™ô÷mËŠ7è±ã8¢ÎncE&PjŸ)P‚!Á›ô˜¹%¸Ð˜álŒ2%Êû“‚ÑÄm…Ñ?§(çmYÈÓº`®<§)| \95'øgÏOƒÆ®z見‘[b0aÓœge³mE}Ò­QÃÊÍŠ¢TeÛd•ÑÈï;Á¥„O[Òʹµ‘6Ó‚«^4¼°ÓMa¦ñöì\/Ëfgfáj¨»çp3¥ÐÑ ã›”|WC$`*SÚ2ƒëS8ñÐyKž™º#á;ß[&Ìœ] õyÅ{iÏÄ¢•^©yk‘5—@”ZÁõþQ]@.AEâªRè¹ÐýànÏíàÀ¹Ä8— Εrêl 5ø54ºð´^„Q7ñ`ôµ[óµ˜[•RM@/cŸK:×mV\|l¦9ù‚1÷ÂÒüù©#ÌðF“Ôƒíw¼™š'3íô¢¹ÿñ|p•Ò¤N›ØÒ¿D»CŒÂ!J·p ¡f1ng4wi= Û‚ÅÎ ‹S =ª)Z÷£¡¬÷˜xA¹Û¾É Tƒ±Î¥Ñç':*;ÔÁyâj˜vä(>¨^µÆ(Ð\Á…Kd/­yƒCœÑ yhÅüÚ`"fc ùÀê®=ˆ‹5ü»©øÙ X÷&/µId’8u¿ˆ¬3•À€/¦QÂ_¹)ºT¼ J ‹wúï¡C3ˆ‚íš¹Áè_mi±«¸È5»ªÝhb0¿1‰µ¾¹½D.yÞ‡a. a>I }Óh† Œ˜Œ†áÝÔ½òR¦O@¨Jï* —•ÉŒ¥‹/Þ«š?îaî(ÍáHó®â™´vt3³À~@”ù\î®Çž=Z\–X'ϦB7›ìo[Å¿=UñÆ@×(ø§Éàÿ•Š_‘º¨›_éDy–Ûº,ÇRñÑ‹ +w–õ1¡ñ»Š›© ÓUÅMÀ/׋O ªÝ Ý(‹!2ò¼^¼ÿ@œW~¸J/zkí0ÀXÂBWλÅßGa#£–÷ðö(%~ '`lå,<ÝÎBÿ»3Iq¯½òÿeXì¢Ô»(}l0Sh0õ¦%®þÁk¼`½ª“æ+­%ת*³Tƒ z펄 1^YÂS˜ø”E¯ “ ›x0’øQœšpüÆe.ÊNÃé@y©ÙÕâ²ìÁÖhl,²ÂôKð{(â²Ë„´è°A ïÙ Jå­DÌMy:áy:ã¹Åæ´&³•~°Œ îèÇ)¢Ã„¯ÄfeË¡† .OŠùæåàé'Ïó¡“»­ª)à´zÉ»ÑÖ³;2u6káE2ö€òcÙùhi$A&õë½ÖÈ ¶C´}Í­ìZ9ÞuqýîrR¦oÊO=ŒÈ‘Öµi¿m/ûízÑ#;æq3†èŸCè…ØõØbC §ä,RŸAh}ÄROØ8€‡ßš.6öq'‚Ä»½¹žl£!éôà~hÚCvÌý3íµNgõßãÖ¾ÉDÞš¶là˜W{úˆù–|‡³ƒ‰óofü¾Àðÿ#Ãf– endstream endobj 3398 0 obj << /Length 1174 /Filter /FlateDecode >> stream xÚµWßs£6~÷_Áä^`¦È0‚kûÐI§Knš¸}Ion= >wiÿúÛÕ ¶ã$7í‹‘íj¿o?­„g­-Ïúeöãr6¿ˆ"+aIäGÖ2·¸ç± Œ,Á9‹‚ÄZ®¬[ûZ¦««´ª[ÕÕÚy·üm~ò‘WD,öˆ©çó$ÁI3Ï,Ó?Á+y¹ˆµ›ë 0äœÉ²dY]v›jdoÉ[×÷}aßl×m™ù?Žýù¾È0ÝÓ_ Æ¡]çÆK´4üË ÂRÒXÕôìZIóóºÙ9ШJ7²ý–Æ+™§]©èOaòý¤Çˆ=Ëå‚l‚šËTu|Zq6ô'`ÃXx¥Á‚-—·aÇåvƒã–센¥ÉzØCA×î:Çù]+IÆ…P .fn‰ˆ%±9K ðÿ?îYJF‚håö4?8ªu/ûb•ŦPÒT´0’ÞOK<ÇË úd¶h÷ÙÙš…¾>aÃmû¡Ø2 ý4¹˜îU·A©ÝQÒ™q­2?òí²¨PKhB-¡ c“ÓG‹N fâ°ß€øC [‚öFX ”·.ª {ũɷ¾D“Jú£Õù‚ªizFOòÀÅq„á!Úñ L–ÑÀƒ0<ˆž‡¨/£qØQõÑ{*È‡Ý kYI²<º©ÿF=0Õ¤U»­Û§°£–NØz¾N§nåžp7)œ4Ns#àPWJ§mÔüD† ÆeØUÅÇN²©9ÍÇÄÉý2ýàh ío›ÐpE_/Òï¡…7éìËkÿq/ø‹›™[Övy¬<­­k¹©1ßO¸dÏm“å@Þ™ËÏ æ4Û-²B/EÀ¨[ÿ}GÛõ¶»´Éj]º•l™9ÉÃ1Ãqœ0á ð§“D©“ècèÌÁÙ7ÅûVm·iÓŸ©cd5¥Õ€oP’|@`mQ›Þ·JUú¬ŒÏÒͶܓÊcO]ÂEá fÂÜE^½rÜ…çÙWµ¢AÓU¯õi‡*õ@f¦ÌfÞžš8(ë,-i˜ËàäÃéÈMßÙ!|ß³‚ß¹ôÄ[×¥z@=joÌRL—…íKs¿§ÇYVw•2Ñnîõ¿gߘ<†^3vè­LµŸhòt¦]ý´V;?íæŽS4 û]³³•]“ª÷õÝß2SSà?A·PòFOx«ß#Ú4‹Ç‹™Þ/OÛLÉÿ®>u¸Wjûz>×2¸‡{ó|W’gS|cÌùñ(Çk|Ï ŠòV7ìAAÄtcW+ôﯡ͞/gg<=‹ß%> stream xÚÅVÛnã6}ÏWy©T\Ý%oчt/Á.’Å"q ›bÁH´#@¦JÞ:ýúo6%Kv´…‘'Rä\ÎÌœѳ––g]žý1?{ó1ò­š%AbÍ–ïy(Œ+õ}”„3k^XßìÀóœ¿çŸß|LC4Œ|B7_0­›–•tÉåÏ<å|D†¢«5Ý …ÃPêß5xI:jc+˜ËLÈ™åú ³lȽ ðB!IÍâXJ¸Å¨(Ù¯BÀë^®Ú Z”qÜØóìßåòåîêjXš´X˜› RW$_W¤™ ÓåŠÐ·eM_¤—H½öù©+yžƒV—Es>í+=•Ri¨ ¼8x¿%¬«pñ=Ä çpñ}PsI(™ªª²°¨ *Žf{ýÐåõš¶ Za Ôæeš9©*$b¬iõÜÑ™ßÜ}*î#­¾¶„hæË㫺Oéu…QˆLípÓà®Ãóæ¹¶ßïHÞCAŒ²Há¸`Ë5Í »m6å‘fÔ8ûóÀœ9ßÜ0 Rû«d6n7 #»­ùBdUÁëÅ÷yM¹L‹KÊGŒ83FŽÐ»½þ$/êuû´îïåEƒ ƒY¯ãkK(X w¹pîJ•v|»u\ßf%ì6òôÝíŸSðvfÎAÐ~ ßíÒ×(„£PmËJšWëb B—pÆñÌÖ[ZH톛–g¥§MÙ–dRºcñ`Xã¥ØZ‘Ÿ÷^íë£ðQæÚHÒͲ,ÐʪgM\¡,µÂ&mËRûòøHñÝ­#YbDLQÌs4çΞŸ¢Úc!–s È*CŸÖ%¯…| ÷Œ£/8Q)ßm¹«l‰É˜ë\ëAŠß”)îÿQÙk4Ý 5Ó5c[poûQ¥FTYŒ’X&B=îß;’˜„÷^ài"‹øo7Š¢>ÕS%±e³XÅÿ¯›Ý‚[…ò—“CÈ9ËB”Í‚©°÷83]K¥]fý/ø™7ú§a8DC/’4„U÷«üÚñ>ö¡rùå<Õõ°jÊù‘A¹(§ÉÊ=R½aÚ5àw]lü1%IÖÍÇËk*_SF!$ì—h¼–":(ÃcœZ=ýj›^=cˆ`~õÉ—~Ðìž„æh>6þ%LIÊÁyÈÔlˆN9.šQÑnëo§Á#Â4£½ºì7c&g%0š‡AO2µ¨À|¬çú/êO¯Nâüš`Š®ÉŠ{x`˜’[þ0y šJJÿFô?`äé (w:Ðï¹ý‹¯ŸV‰Pc}Ï —ªš¯ðrÙ’B·”Ú˜Òí0xœ â|æ^¡÷þQï Ñòã€Ó©€ÃŸ|3˜‘bjZÓS¥o÷Þox9¤¸Ü+Âê&Rß½"¼Ë}\F+gæ8J½~˜ŸýØ Ùc endstream endobj 3424 0 obj << /Length 1885 /Filter /FlateDecode >> stream xÚ½X[oÛ6~ϯ0ú$µª»ä ðMÑaM‡Ì-04ÃÀÈ´­M]QÊe¿~çBÚòM±[lSÒ!ÏÇï\Io0xƒ·?M.^]%É`쎓 LfßóÜ0J©ï»I8L¦ƒÏÎÓkQ)ÝÔE5þ1ùùÕUäwf…ãÄͼÖ$ùÀóQèÂ3jì/ÌJ;³FÁ8tý8„A /Cž|øÞÖì]ŸG±ç9·^à½îï0ð/‡£0 ¥xäÁÓ0HY–CßQ8|à׺EÅCø 2§‘•.”xÚÕØÅé F~äz±ÿ5o¬åÑqHÙ>¤¬K]»I ¸׌•–ªÔî¬(Y÷à Øñ 2.Uʼ-¥æÇf!†·@!Œ}'GH þ¾ª>ÝSÞ2‹2uÒŽæ}Ø=;cØsYÉÓpûénšÊÃY­–Œ9GÃӻǔåøq“MßîÐHÖíOÜÒLÝŸfÜЇª|bÍ¥F£õ -Á0 ¯Õü÷i˜Á'w8Š¢ÈéÄ%Mýíý;–ŸŠFð(WìZàjš…B0”ÇÃF5¢<¦á™-‡n’¼eÝÞiÙ¸¹j«F»†èžÍ§‰;†¹#?pÇ6°ÞÍG·<ÀÕ¹æçµý`¬ª-§<¾Ž@ÊLºky§À™ìá°íõÒ4GÕÓ¢4 fªæ0JV¼ò·B[önÌpóâÖ £ÜZj¾”†æ¦PÕwüú»^ä¨Ùe_ŠÉÜ$ɶèô4sÝæ¥µI4è„ßx•¶Ï(SƒRŸ’ö‚sñ¼~jÔªzÙA´‰ÊÜ~5ÁÄ¡YþsTïåY¹«E%[JeÂæŒ]Ãê“Ó²±#*p)7+Œô^¬˜( @ñäùøæ%?ª½4±—·Šfa3‡X'C ·¾OþóÌ‘$r‹A[bÚª¢šgy`Œœ F–2´—A–E´› ÀfËJM%K3E°&lZî;JnùÝ^¨ƒõœ9´ÑSC÷ÓëÜ;âœûb^ɦ‘Hà‹µÆQuíÅ!êú~H•\G–Å?¶[z.Òg-Öùoó0è†9<æ´ÂŠý9ì|ñw|0^mïÝÁ÷€ 0ô.(Bq^H>æÃú`MR²±»Ù\‡œ;Ág¿ªwWyoê¼VË%!D߃Išý¸¨r<Ò´SÉÏ}ÕZË/-´D…(Vl.3%•ªFÌJ&¼2ÞOdäØGÚÈãYA†ÈY¶eShÓ}Eq ÆS–®­‰O‰#m o ˜%Æ"$LGT ‘h<<Þöº9„V2@5Þ_xÁƒ‚´lá -0ÜÇ(.emüŠT¼[‚r{j&áÞ>è¯Sì~B¨@‡dE±ªò€š“™±ùãéòò$ÿ‹#<Âbe«Y¡àN¢8jªVí;å$uøæo0Œ›LÛÜ^â7Æb°Ì:°à&ÞäÖ|!õg$W:üu“+ëù#u/ëûB>œŸ^¯Uó i’N¨›U²Fù‚œµõæ@{Fö´·ŸnCñÙ.r%èþ÷orÎùÎ…Âæn‘îè¡s‚PœÜõ›ÉÅ¿ç{i* endstream endobj 3435 0 obj << /Length 741 /Filter /FlateDecode >> stream xÚ½U[o›0~çWX}i¸Û\öÐªí¤ª›º&ÛKÚNꉂmý÷;`HË¥‘º*R|;>þ¾sù h†úd]Ž­óæ¡Ç ñy„`ÊzhŒÆšØ>ñ§ñíùMôL)§Ø÷CpÔ=ˆ$å2#±¬­-Ò>r=¶––S‚¼µÿ ¤˜Å¥skòDP‡·ŽâýnL爄Q˜çhd}]ûކDÔ'á­€soƒï>©”¸”Å> ÷.O\N±îÙ¢þK2Ç¥<²‹•.WÚ̧U}RÌëUh7nÍ8W©‹´¹®š‡v€QzJ Q¶#[‰qäû†è•Pi%K-‹ÅÏ ßíŒGÈõbHv°‰p¡tC˜2 Ü…Ý{Çì–0,ׄ Ù@·öîǘ±¶”¾©d&vÂÚ3:³Kç#á$Kt‚3Y}p\Nˆ1†]ï$n]T³Õ\,êÛZD¶Që¨C0(®­`O\ú¡}%+‘ê¢z11L!STÈ…\ÌLÀõsàÚ­™=Êr¡†þû˜@ ±µ¥Q8Œ&€¶¯ÿèª}¢Lªd.´¨”AQ&J‰¶t×6ðêf¨›>üƒcÒܨsôYÿ9®Œ‚”°ðÿªó8æœQ«Ýjp×´{_ šË®jbi¶TÙh™äFšÔíUF@9{ AŒyÈÞDîŠN:’K³TeGJ£#÷®ߥ¬îø´(ª Oe.Úž‡ZM^Ìô£ÎFñÙ{kÁÛáþók50ŠªŸÛÆ/ZQP¿úm¿_)~8àÆnU›I³†÷å"Ñí½öà ¦d]§(ˆ‰éA¼Ö/ íWcjÆú¦'/kõè¶‹L*×èä¼.‘žÈIÓw'ì$_‰“ª»Ëñ©*¶G&†º¡/ œÛ?AÛ_Áb$jε/rUì)¶W€¶ÉN¸Ãé/»‹`Š endstream endobj 3450 0 obj << /Length 1109 /Filter /FlateDecode >> stream xÚÍVmoÛ6þî_!ø“D )Ro+ö!]’ Aú2Ç)8E!H´­M–<’n“¿£(Ù’£(]Úƒ“"ïŽw÷Üs$¶V¶~¼žON/ƒÀŠQx5_ZcDY`…„ €ÆÖ<³öŒ'ÙÍ܉¨}6“UQ9çW§—Œtôh S°Zkx˜j¡ nº˜Oþž˜b‹ìÏÂáZéf²øˆ­ 6¯,ØŠ#ëK-º±¸2m¶°n&¿ïíu ,êB0 ÀÅÀf½@Aìõ! qGyáú”a{æøÄæú/É—ú‘]íÔv§Ì|)ôNµÑ_¡ ù ƒN~ž™(öÉ¿ Ù„Æ0 H„?0¡s™Š|«òªìEvˆ°‡‰,Ôi2Pz‘2±Vàïºäj{žÂИ»•ÉŠú1àWôŒ_-bwØÇY¢”åâÄq}Œm„¬’Qˆ±t&V» /êÙJŽºöŒK­ GÔKïÂ¥¡Úç¹à©ªÄƒIb Øx‘­’¼ÌË•I±Zs³©ÍšÙ¦¬àòØ~×' .ù~“nHø7Þ\Ü+ѱMD²áŠ i¼Ø&Rò¦TK ø¡È+«Îù±¨54HoÔýóŒgA„0äñ?e<ó ¨Ÿ¹âR¦üEŒ?7°ÀìÒ C»ÃùÈn '9Ï䎰ïÃyF<䓸;s>/Md‰Clà>„o6  M¢»¬Ä&Qª­–«›wo•ís\üöö>†W·m³§ G Õ6Ý1­v%°¾î?›áííõõI-Y¿•­Dö•²›ªàéNGýUâêaË{’©vz*ù :“J4rÚ´¶i K¢Ê39Õ-nÐÞ2/€Ãý³Ï>¥k`w Ÿj·›F±mšÚ GQL`®«$ûm÷úÍÙû_Þ_ü1Ðq—Õçf-#yè=­•¦?®#‡=tG; Óýø½n¿‰Z;. €ÆBؾ]›è|õBb†¡’×b¦äµ„)y³ú%o¹³6›ü~+@_“³þÖ‰|U'Þ=qäõ‘ëjW4œâå/ï°‡›Œö»/ÜÉhÅK.ÑŸÒ4ãÀµ.HXÇkˆ:b--vRß ã_µ×ˆ”ƒ–´ÓšCÚK¦å_ùvì¢s÷¹Ò×]ÔcèËð&-Þ¸Á›¼Éxc·†usÕ€ò¢8•[Ç…+evåOBžVF\dy™ÀÑMR_^ Ú‰oŽŽÇ^\xÜ.ÇßNÞv¬ÁŽµØ±;f°óí@¾AøX>Úíác{ÇÌ×nŸ—ÿ%xQçòÅÍל›kÜ ôÓ–xK3“D¯µ¹†ú(±F¤öFÁÕN”'ú#²S}̺‘—íAe;fÜT‚ÓK]ú5C쟎£;QD:â~ÕÞy?8Æ5Àæ"7oüú2?4_;œÝ  X­•ÂVið*„§å?ÖaÛH endstream endobj 3468 0 obj << /Length 1629 /Filter /FlateDecode >> stream xÚÍXmoÛ6þž_a¤ý ±L½KÁú!Ý’ E—­[ HŠ‚¶i[,y¢”—ýúÝñ(YR%;ÖaR$w¼{îÍl´±Ñ¯'¯g'Ó+×EfäÛþh¶YŒ™ŽëË2}'Í–£ÃfîøËìÍôÊ÷GÏ5mÛ‹Ô¡‚/?Ç…r!ðô ÓLª8 ò‰í1Ó ˜°èÐ-·¶ÅZÔùn&cÆ-³ÙB¤c;4Š<‹—¬ñĵc!’d:¶ 9žXÆn —Y1ž8Ž [°D&êò ›Ò…žé{£‰åšQl«8)D~X:7€ë/Ÿc,P¾ ÏùÉ”EF[·Ìq½êÛ,‹2’>çH÷8ãŒv\J2@KÆuåõ…Þ²:[NÍMþïÚœÚRÄéú.˜VCHjXò‚›Ëøˆ"TÄ{| /6íÇsà ±(²üQk+#{ò8EyE':¦Õ*âéR¯%¥„èå7ß]Ëg YÊu!K¹ “eyÿð8KY Ç!KáÞ¥Ô&juˆ°x܉£œUd Td•”9ÛyŸyFG9 âi¶ÊuÔ± –DpTAº‘–i)N+gÍEí× 6:" PµŽú~¬¿Ý}´'é“D¥ûÿ,R¬·€‰Æ ÝAÀ„ì`\æ(³á8Ü nÆeö0`°‘‚µ ½…XŵVðF &¬ dÝ÷X!…KRª2w¬ó×ñâîñ‚% ÿ˾ª;[ìá,„‡ï˜8 rrà ;œpìgGQåõ°Py=LµÝ`Ö¨áKîÀd<¡$ð€5&êá€IJޑHà´M»©¨LÛ-ßmઠ”:«¿Íøò·òõïï~÷ËåC5 ^¡Mf8Ê4ýð]D¥öGQæ¼8Rcí2‡ðàß ò}JAö>ÏÖ˜›A*@Ô'¬â•Ç ½RÅäéUÀÚ¼`s§‰ó¡jÎ:PÍÍ6ªÄð=cU¦ *¾lß7J)tž6¥TŽž*åtÁúù¾®£V1ÎEºÄ ç"D)µÔÖi5à  Nô5Ç˰XQU²4)nͰ³Ò,DÊçˆè-‚—µ«X†Ä¡èC¡™s4‡oë"Ô·šÂ¯WqìŸ'Ÿríצ@PDZ @FyùlNÐ] Ô-óØ:ÉæÊ¥¨¯Èf>]–u\†¹ÒXe¹èÓ ˆF}m£Æ¸`V© mÃBè¤ uâklh.èÔR@NJ4 'NØ”Ô>ô9žlá®· †d²K—šO-ÌApw«l ¹‹×©( <­9Nb,,OûTwÐ᯳B<Ë]ƒ¦»ªNhB0c.þ*¡Ï¦‚½ê˜žá¾xã7™¥IÜ‘«÷‡W¿yü©:¯u§[Õ©jBðè$˧DÁ˾Ý%Bö*¦·K…¨ïûn­¨Àt"‹îzñb¬2÷5þ*„æy X€Õ?zé*MùiBc³ÅE{+:ätiUó¦h^éCV¶nŠb'ϧSé˜|ËÿÎR~/Mèx§wšÅ3ò”™Ìt¬é–ã_s¡ð:½çéZý31 Jtz¦xMz˜5_óÃ%R­â1‰?zí…ò?F¨š FraÅgGm†•Ïv‘BM¤Â$érèí¾$ÜXç;£âôK‹B§Ú  jï˺'âÐ9ßjKžHS+£y^×L-7¹LYÓ[¾‹iÕx9;ù¾B·Ý endstream endobj 3477 0 obj << /Length 1529 /Filter /FlateDecode >> stream xÚµXKsÛ6¾ëWp’ 5S2àL¦‡t7ɸië(íÁÉh²9C‘ Ùu~}w± EʤìtÒ‹ˆÇb±ûáÛÅB̺²˜õëâ—ÕâÙY[©›Æ~l­6–ǘ„±•xž©µ*¬KûBdÅ_å·+Q/?¯Þ=; ½ÁŠ ]ÎЧe}¡Ð‚™-^¯_4™åõÚã$r“$¶òíâò3³ ˜|gÁTÊ­[-ºµB0 Qme}XüÙë;þjB>tÁcn &Æw“(˜r¡_ Þ§ƒ¥—N„̾XFž-ð'+–Nq;«MãG›ÃTbÿöúâìí‡74ý¶Þí57­Ý’Ô`ïiDÂØ£ð{!ÏÉ˽ÄMSsx¯„ÌÛr§Êfìú‚ÑqzÜr<‚À`„vµ¿2Ó)kš=À"SµÇ =BÁÙ4í6% 甀–Qö‰a%¤aÙÐ5íò#—!ÙõQfWbÒ¡ ù’]ŸXÄP£@ÊsÓ(")ôÈ-Êö'-ÀÆ“ªÍjY.ˆ1ûgú¼ÿx~>^Ó¹ËT™UíÛ¦ùay”¸ºÛ‰‘ä)®¶¢VR@>™Ûý¿p[æíü¡2:çÇXµ)+%Ú±ìËu~µYëI˜¾äƒs-ãLœœœ×)ð7õhø¼íᵺMscZ™”ÙÝØsZõÄÛÑm7ËQcÖËöjÈ/ßVò$WàhgúQîî¥$~bÿ±ô!]©k¨$±UƒßØVׂ@‰ÈUÓÞÑømÙI¢Çˆ¢¦î!œAÊ„å è¥ÜnÅ×=h‘$˜)’©D& 5µL+‰Ý”ûã“j6” È LMU5K0ü¶¬¯h¨Ëº³ƒÀ(pJ=?v?¸ÏÝ8FÔ~Ö±Â÷ØiÄð8?1Ÿ™Ãä£Iع¨ªõ—»5pA¸¹¼™¸þ|¾÷|é„adï¥(:·Zj´^zÏòf_£¯ŠºÛLµå?§¼Â€\νêQº»Ä:—üÎ%è’j…4Ü'5ìä@<8³¦ÉL Ôþ:}Š=¢F.ä)(œn âñ£à(„‚pÅzÂB%J¸A%Ä4¢ï·–:=2ØÑyB R7 HÕ Áh…cžÍ}HLÀ×Ñe%>B)rcÏÂð~: —ï9×µ‚>È82ÁHíåhâðÀhIDiÌœ¼”“È£äû—S ë)µà+÷; £ú@;èоÜäÕÉT3]#°úeÖÑÝ|¨p ”²(lPØÒ@a£ìt8ù‰7ÊÎà„Sˆ“ÖÝㄽ§á¶s Å©t—}ûífÒž(i¼KØ%˜&>$nxH7e¡ÃF±ˆœÒŒ+u2«Ekt@SM£@u §¾®upNÁyT‘ÀMXg[•qip­q‚¯¬¥êKáf¨ÐGWõ„¢Èmn¹Úè{óê,VÀÚ×ï%î¡N<]%Qz=u¡m¨ Àua¨SL½cÆ U Ÿ=ó|†…s|ö©ZÁï€Ï>ïùÚLÌÇP"B­ì 9¤$Ç ¸G6v4gQÆD…oZ3KÇt¦Á—ÊÔ33zÑå×yœ7"SûV¬¢õÓ§.’dìÿ«(ÍM¬´MYȾäîKj n$Z¢Ki&¢õÛ|œNFÕ"$œ|ú’׫ſØ  endstream endobj 3395 0 obj << /Type /ObjStm /N 100 /First 985 /Length 2143 /Filter /FlateDecode >> stream xÚÝZKs7¾óWàh„\ÊÉ׻©JªR’Sµ‰¥%%Æ GKçßï× G¢,22¤SÎÁVÓ~| йÄÊ(ç’Q6z!¬r¦ôò\zœŠd…ð*e"(k0ÐR òŸ“¾¬¬3 TÆT.ø(«¬ÇdÑy>ÊGU&ÉNÙàÊ| ©,!…“Õ3fçÅìèKe‰Œ%²,!sÚ,Kxc™²D!KxC d oœ"»X"‚’%¼E‹¯!‚ʊ¼  ¬%*ð&( ÄX‚0‹ì_±XòN(¬‘±ePhZ*ce¢:o¥éY(ÄVD¶hæòM/Ú••'2²†QÞE‘ šö!&õìDŠ XöF¬|¢Â‡YR”™ ³d[úpd9HÄ &‹¤Ðf 'k`ªà¢ÌìH…5A¹¬‚¨}”µÇG&ÙšÃGæ2 ©Ä¼Ë ¢ï1q¶2#sÈXÁ[)›'PA@]Ñä2À«h‹ö|U´çĶп}3q ÅaÎ"]R1”±˜*B²A 8ê˜Dà€%¸KÀ$œDñK$EAƒ11X¤+—T,X±1²>”Ŧh;dÅÖXÙúl9=ì“©è8Å¢6PVqXô‘b.Ã:9KÂôÉFÙ7\9‹˜U e,P,6ÅV%l\úTYØ©ÄÅB`ò‰Ë,8ô”RëU6°vh%«l¹ô%• †ƒ±L‡ÎäÁññ zõÇm­ª‡×õ ú¶™´õ¤‰“%xüÉ :©gÍ|zYÏŽWú~¨¯FÃoš÷êµAG„Uq¦ó&™b4¡ðÂø|2i0ÛëEè@×"t, ê×¾#B!Î_~¹"c™mPÎ/ÚÒþ~4y;¨¾i¦Wõ´HbΫÿTßUß¾¶¥!Â_¶êµMF[h+š¤yø8i Ñfí¬ßsu|¬ªSUý»yÕ¨ê…zròf¢OëùtØ>UbëFÄQö~áœ4!Ày4Ö'otÆÖ{ [=¿ÛJÙIõüø¸,P=¿lGͤ:­~:ùNþ=¹iÛÛÙ³ªºœ'zzt;m~Åüº™^W·ÃË·8º/Ðw=­g³éÓ Òn­5b£ þ‚Õ,îê¢Î.Iû7jí÷Q{£Oæc݉´Q[‹äbÖÚ‰„ §SæŠt3œ\ëéììÉõ¸¹ŽÏÎæ“›‹æý™ñæìì]3ººøzÙ˜OfoG·….íÑõ¤Á& æz&=_ü…±¯N~ú×ÙÓ¿`OÞ°–È\Öˆ¸ÁÃŽ$®£ƒßÞœîlF¿™·óiý*ª‹U §íèr\ÏîYŽŒ=MÚi£oÚ߯OwÞ9§Y2Zö:!žgMˆªÁ¼WŸ¸¶CÝ/Æõм/`F 8s¢ªÿþü‹ÊP"“×c2Ï72[c 7ò6‘=¹)!иžÜì8N> 7B}On‡@…ÔÚ“Û‚Ûñ:y‰ŒR|ò%Ò~F6-Ã^"æØ5 }¶¦k IYÛ5$¥eƒ1¦®IºE ÁZÕÓæò´†…!—½x©ªWõûöÃò(Éå5I.÷LrÞ,’ܪZò6v•×YŠñÈÔ“HF3çžÜÀÂ:Š;Dm{r{§Ý‡vuo)cÕl6Ç>Ìáõ‘9ÂßÕ¤Šèm˜;EE9„uj]Ë ü©-j‰ípU“u|ïš;k•üc­m§Õ$é—•òjI¸Žð:"vwDꈼ$Èt„Ý+ìÄá@}L‹#Gª ¬Qò¢„# (½­0  `ømØNGï÷‡ŸIÖHM€$,µ/ ¤ ¥þC2v‡”TÂwHÕ±N!}&H˜8¿è SÂ_C'îDêðÇDú§!aŠ^[ê&`ìùóÀ ’¬Ü9exÉaz¹yÒÙ…½zÅbW{s k\ŽÁ2: ¹!tç¸9´Ýއ“=†3„­ Ñä´Ü1:‹<=ZÔ†7 ñÕBÏžý©4=ŽQTî—,#¾#I)“ƒ8,”·?¾…\› pñáÈ5øønTÿ¾§ZÌÂîH¢ñ²³NŠ›üij1¹8í’V™ï`-x¨·“lìúrS ݗשÊý¨v—úõ¿ K¼³34sá14snwhæ:$å:Œ¶„ä{‚Tñ%¹„#·:«œ@%ù…¼9éÔëÚ=â(‹zªG÷ˆzÉ8'8~vâ?›aÔxtUŸÖÿÛ£ ‹0,‘H^A`€VLÎEÞJŽbÕ‹kÛž®¸Ê|W¯097—™{r†ãfêËMdmYÇí%ðûÃp»„ðD¹/7J y1éÇMIÊîÔ—Û Êí«A‘ùÍ.µçj¼[­âD¿#\0#œO»G8ωgˆ.vñL.lØ*ž•sñy ÷]e¾wH¦Ãp;££µ=¹êy±ëÉíISï]"dî¤ÃpÃÙ©ï&=G^ìúq»„¿6öä– ;l¾ êyŶÑ÷s3_¿Ê«æÎÎ;ø;ø»+¢Ø]ÅîŠ(îõ‘L’ÂS!Ò#û¢ÿ$ïðQ4}‚7FoH;ùÂòjÅ['Åägrµâ2ÌVÞË—W+ÞX„Àüw^­t"uW+éŸvµâ8i¹Yí®V\Buh>³gFçÿ¼ü4‡µüF€á‘÷ê¿ÎšÉxÔ>*lãA˜ïR¦5ˆ%©'7Š9Ì{r;($ÙÞÜÀÇÙš§½³ ¯y½á¾¯7É=Ê&ìÿ$Aôð#˜Z”ßÀøQ¶¥f5@öR-RÞïíÞÍÕ›0ýÐþx›×'^÷úÄAghð Ü.=¼,ù?ãLó endstream endobj 3498 0 obj << /Length 1982 /Filter /FlateDecode >> stream xÚÍXmoÛ6þž_aôËd V©w9Ã0tC[lº"sûaÍ002íp“%O”'¿~ww¼#›¬'lòæì»Åًס7™»óØ'‹ÕÄcÌ Âx’xžóÉb9ùèø,žþ¶øñÅë8îˆÑÜMãÒB‚/?È»µ(PöŒöô$É3?Š]ßK ‘À`@k\úëÍ>²îã,b̹d>»šÎüÔ)§ðo/ŒxçÓY†N&ò|: ‚ÀéŠàHè”MËB(ú. úÝȬ*M;+iRµ”¯ ª-ÏıYiw3iäÆÑdæÅ®Ç<ÚʦÌÝúv+Æ·$~â,ÐÄÛ­ÖŒ*Xº¢_XEdMnFÁZòœ:÷MEy^W2Ó;„^]ÒoGó54=˜…º®qjâ” æµ Û¨¬êJ?Ibwžú°;ÏGí®\o¬{º©Çi§íVîEÞ=Ò÷èè0õdsl¸;8º)îqÄX††.óÓS %â|ª¥]Ú}ÃDÍ—¼æŸÀ0P©>ÁñÓnÅ—9¿²¶·‹k!M$µDÂ͵D‚*3ëNTFR³fn}$ùß#¬éìÑ?õ0vhO™7Ñ9¡j .!–¤_SÂCè&ü+äXéÀ³k‰ 2ú<ÿJ‘~#pꩯd^‹j܆Ïüe÷œxÅ3œÖ;ÍK„¹ Zî*=‘2Ó4pžÏâJÑ-гñ£^òíKóéˆ|0ÏjSÊm_Sß Y¬Ç°`}îÆH|@à×™,–b?í˜:yÙRxƒ[lTݽ.D¯S£Ä þ¢ ùŒx±¤Füܺu–7JjV‰6²*wã[‰q+oùFLûpÖèbž5ø5êýÿ}0ªŒ€£å·ðúIfˆý¶JIØô}´ïZ ‡]Š{pOø±x&×ø0C(ÊñPÑÝNöR7 Ò¡äxމ / $ø#~èÜÈúÚì¨Ü´ñ[3ä £·ÙÄ0˜dBg}mWežko¾Aë!ˆ¨‘Þ† yúNÅ$ˆ¹>|81Æ º#xl]ñBe•ÜÖj”"Ã?i‚?7T¨šoÎôí¡³ŽJø¤=Ï®uZ*°&G€>^#èqó@'gŠF¹¾ ʆ E}ò,X ^7°’NBÐ|¯ŸƒÐ x+öj è™]à“R’‡€Vb½E­éñÔ‰ƒwi9æV…Öª"wJZú%‘Í_¡µ¥$-¿]’Q7…žN$¤a%„™L@…hù À•FºKý‡ µQ EÑ”þïaÍÓª”ËqH‘DH«ÔB - é<µÎ )ŒÁÂH½¸1©p'GƒQ -üZhq‘´ á³Ç¸§òðŽ !»A8þ_!|UîÅ(º˜°p²Ô¦A‹ntâeÖfTWåþ™?\pYTuˆµ¨¢Âa F·þÉà±7“ò"3\è[äB¯Eš9huò ìÙzÚ•ŒJóÕâ§[üb¯_œêðpmŠ/CG*ùFQ¥ê·ÞîƒOTýÖÛ±u@EL=è[WïêWGA* ¶ GQöIÉ" áè~YP»õáç»yÑÎ&<Úç=g–‹z»­¸»E#‹AúcН¶ ¬ ´g­Añ(/ú©|Zr÷pB3Xºü"šŠ×ÑË ¼AN÷‡Èê±<Ö®ïªrYÞ¼ó+„ÑÀêeÖW…î`&WåÀÞPl`Z\K¤v ùESd”¸úq …Ž0’›hPÓÔØ‚+ rÕü(Iq% îª¨­ ;j”1RŽèøÓÕD½+\ŒÃtm¡\ôDÏY`5jTˆ‚Þ*zs‘:¬ï‚ =zh•è°1„ŠŠãqľIà!pÂ^Æõ²8‰M1E÷ß»*öè™UÍÉš®»\Tê’El—WÜÜÂß»-.Þ¿‚OÞã6˜ZweßûX?cÓ ]Öø>"¦É- ž K¡þLééÐ÷z:ÔRKðj™›)ܾÈzNƒçZ:JöxwÏÓá}ðôm.¸2zðaj”ÜGâœ\¢®ø¬Õ8“˜{>‚n´n}7çPGäòÎŒyúªÁç3Ü<ð»n½“Ý\¯pÏŠû>rXôãoë|ÐÞö÷Œtð }ŒŠ+¨Mk±–Ÿqó¡}~ÑR¢¶»9< =Á3ލ»Íy1º+G³7q¾/7m!r&)â±,°8Í›¥ þx)·]¡Ÿçºo)_XY/)ÊbFèégIy‡7¥a¿#Ã*ÚzÍòGlM“×R™ÚûA+¢$Ù”&íib/v„}Ű˜ÆæD´0½ŸJðDÃð¨Ïº|Ä•Œ¡ ߘ°¡„°lÍÁ³@wŸ£¸ tÔÆ¯ÅP¾1e>àC«1}6x)X÷„è@H:¢0b *;”«S"3¦ ß’?Ÿ?‰Qˆ¯w©y2Ç;‘~(ˆb«¾.«²Yc"'¾Z˜uÕ†&ËYªï_üFv'謃Q<øû@lÀ ¡?!¸ê÷¯np%}3oVîDµ“âæ~x=þ}µ8ûæõ3˜ endstream endobj 3505 0 obj << /Length 1117 /Filter /FlateDecode >> stream xÚµW[oÛ6~÷¯òD5KREëC×%à 4íRw/i1È2íh“,—’âv¿~‡<´-%®“¬Ý‹)’ç~ûh¬ü:ùy6y~!eÑL Ì–gŒF± RΩŒ²`¶®É•^™¦ßü¶ÐëP(Òµá§Ùëç10F™¤ŠE Ö±–Z¢ óš€:POwäS‘Âa„L—M§G\î¡.®‚)W4R ùf7eN£("Ë~]te³¶»˜ý¹/öwÝNSʲýç•U‘²ŠkDzȻœvù¼Òwá÷h7yŠ”ü&’ä+íu6¸ÎÃ)Ζë¶Ë«J/œÐóÙäó„;3ø>ü2fTð ¨'ןX°€»×`l”©`ë(ë †¥±w¼Ÿü~/dl˜âX £Ç•à€å*½—bLïÀY™œUÌÈU˜pð~VÆþ/8—(R¢÷=·7y d‚,ðÈ¥ÖZCdmx=×zÙœˆøÊ ÙOº©ìDE4‹$ºý‹n Sn\É<¥ð|Ô.B‘Æ€R‘BWUÈI‹»r«¶e¡È?u-”’îìSIZÝáEŽËZo‡„Ðkeg—¯x:‡`.ð³ñòmU»ºi½¬¢©ëÝõ­+Ǫ÷DÍr¤®Ý`]%þ‘Eq8µYåÄ•&D` aÍ,›3Ÿ2¨â¢©úzMý(5· “Hh"}~hmC‹ï‘x«>ªÒ,aÍü/]Ø`&Œííƒ þ³^šU_C˜#AîÔüÍB+Nˆ8…´¿×½É;Œ_3rsŒs¨Ëæ 9ôé>§ç‘Uv™×~ฬÃ:L`l™†žŒ•‡€?ÂÌ×Ñh“—¨þà}ŒÞ'è½»Ü–Ý ^aEÃQ£ü6ÌÍþøñîªJ8%8LòâüK^o*Ý>¾“ñÞ©†GY¾ÒØÙf^¶5Lô³]幬1è¯÷@‚•úÓ×{õ| ¼SÓ¸{Ë™ãj÷êŽO͈Kš(ñÿ‚ˆÈ2š$ûö¬rH™~Õô£H(riçMcÀßò›ä$%Mò- ÂõïÈ·ßö]¨”ÂòCCHX™ú>ÀP»ÎÞY!´`p€[tWH|7؃µ4#lKé'¸ñ·ƒÜùÜÆý^”·å¢\¯fxãz “ï‡aÌÃŒ¡4œÆ‚“·Îs(ϯ#€Hл¾Ýu.6h[äÀ]iÜ-!ky†š®¬ÈŽ~:@éGííí 겪üÛ."¶[^½{ãZÀXå8Ô½·RiŠ ¬Èĵ<ò–½&ô1Óäûa-=Ö7Ö3[ ~ŒmLî nµ™76òƒ»ÙÕ‡óa0ûÁ0ø0.%—Þä)¿|sê›ÜÁöNM Ñ1 'Àrº“†q‡Î–üð_­Ñm_u®Thþe;Fþo‚A»T~)°å)‡ŽoL³Sާ&à¿‹icE endstream endobj 3520 0 obj << /Length 806 /Filter /FlateDecode >> stream xÚåVÝoÓ0ï_a‰‰xvì|MðPʆ„&&Úl/eBiëu™òÑ%é:øë9Çî–Œ´ÛB¨¾úrw¿;ÿÎ>Š–ˆ¢ƒ÷ÑààX0’Ðs<]"F)áÂC>cÄã!ŠhŠXѧƒcÏk}:µPxË<ÎäH¦©ÅpeÙ &#%EV ð°ªbË ðwåd@Ml,ZÞ(²þqòÜ =§kÙ±iÙv@Èf! |¡Ç²^—9@áœãX-gq]&wzk“ÔWZª¯¤J™Æurk9>6;ób+Ôu¥sï µUHN sL‰Žîâl•ʪnüàÌ÷ð€h_Õ²]Jñ[[¯ûWêÒE\Çzï^ÊY’™Rå}Ç}£…*ù!;š­bU³Ž‚ü0£ÎËbÓµSJ•ž:*FIè†pû·¿åE™uSë:ËT·®zSÃ=¡´OUå£hp3`ð Eìž·.h‰æÙ`zAÑ”à…ð0@›æÓ  ¶/8È)š ¾ì<%ÝA›g€Åæ¹4$Âw¶dÛÒ¿"“Q¤Èþ˜è^ØiÆÂrnLnn€Á¤ÏpZéÿI®×¸Y}|:»–Êd^ïN^„>á>Iò:IÑsÏ!®ëë$?Èj^&«:)òßkH“(ôUS)-69Bo69ÂÿSEH_KäS=wVÅKùü†Û ïÕ+ͼ 7 ”õU±ÐòeQjažÆ•¹  ÄíóTÚ×p;Ì·ùðج×Dñß½_¸¥Z¥˜©ÒlTnˆÒVæù|vrb> „´ûÈá$d:ß4Yȉ¼yq¾î?šo4gñê9Þó¤JÖÙ9ûÛÇûÔÅ0,—ëLæwÌëýâ‹ÁÖ-¬S.x|<47Xó¤z¸Ïêq]|ârs»>ä¾7w Ò­šIÀ½:Guw—:2ø0s‹ÄôVŸË>fî€ ïà)ÛâêѨÁ°*É…™¨ S ­J-6ü³l0X> stream xÚ•WË’›:Ýû+¨Ù TÂS†Å]ä&™T¥&S¹±§îb’… ²M"Œ#‰Œý÷i=Àà›Y Y­î>ݧ»eßÚX¾õaöïröú!+ó2"k¹¶ß÷¢Yó ðP”YËÂz²¿”ņ|¦µp¾-?¾¾‹ƒÞ…(C^êG N‰†~&…f¾±ð~9û9 àÓ·‚N9š'^œYy5{úæ[œ}´à$K­g%YY1˜ŸÇR+µ³ÿ:uç«§}ï!ð%©£`@w g½›O.Jcß^8n`—» %Ž%s;w’À&Ôqa¡ò§ÔfRþÜ·JÇÆÈ‹Pø¤Q<’̽(J5¢w„ç¬Ü‹²Þ 0° ²¤–¤Ê°¾Î°¦ö3Qlc¹D.øT¸ÔW½Ö+WqqÛ„®å¶”êM…QóÕOü ÙMä°g„spô•þ¡"‚•97»Ïoõuž× f~$"÷@K`øÖ†+¡„‰—…‘†òÈ18=ƒ‘˜¤bÒ‘Dú/*Ù„/K-T¯¾“\¼RǾ9BúhM°h†þ¡¹—טø¾ý^ïïG%Ë‚ìÄDY^31¼{s¿x?*Š9ÇÇiZ7¬nöÞêš´}ô*|˜è.®ˆwôhYñ‰^Óz3Qržè…¢vO² ÀÐ RÈÌKÞ¥øHØàâäü͸ó]ÏëjUÊréI/¿<Ž ¯KJÏssc¨w£.¸#´ZLoئ©ÈΉB8x©¨®“®“³v;hIOn<çö‚4 ·­fx=v³oKF|NÂaÝ]6IcwN ÍňCÿ”µ^M¿ƒ¯^÷‚ݰ{Á8èu/Ø©îb§îþã¶Žb SÄXÙb£=Ǫ_[säei8L ‡žlÚ&;¤ü%»4)ôO+¥Vk$"—çÛw@Ã6à šÛYì…Nu¥‹aKdØÞÖ´f\Vƒ~Ýpãèºf§‘!$ä © ½î:Kþß–ª”\9¨ö+’ã™ìš7 «q§rPäoÙ¬eÕl‡õtY¸¥'ð~Õ¢9n¸jŽì½ÚH!«i¦ër ¼6BP×Í-dŠÌáþ­>S,‚õ¶ g'ÂÜÖÀ;=íÇG¡ÌaQB7ÿãa4¥ôŒ¼œÌöslø8’7{ÕÙòŠÄ¼h ÛÎøÚQƒÃ:gæA¦ôÉäNgb7¶¯÷ÁRôôXËe}Z™ê"”_Û2*ʯ~&Ù›Ú&ÖÏò[#ç'}]K \íiƒš•OÓL­³ ÿ̸ž›OP"•4ÐTÚêÑDôÐÖø/'I€”²!/)ôÞãå¢a¨Æšè:Ê ×±}tO¾€¶Rð!i:AÞÑ \–uÔü9ä.8,ßNEÒÑÓC¿³»–݆¤ì¬%hçrmø žfêAŽ)yA&ÕKízÇ|hTM£aýzÓ­iSíZ’š:Ô™§¢ÜÓ^Óo›;3‹’ï©©/=_Ç^:ðî7ƾŸ endstream endobj 3543 0 obj << /Length 1127 /Filter /FlateDecode >> stream xÚ¥VÛnã6}÷W~± DŒ(Q·}HÓ¤ÍÂX¤±Ów±%ZQ#›.)Çëýú/V,GÎ*( X·Î9Ã33t­Âr­ß¿Î—·[ JB/´fK ».òIhE£ÐO¬YnÍm»ã/³O—·axd:w|øÚ÷×Wwë±Û5-xZ—l-­® r¸B¤ø8Rl9^¾"*V·üNÍ ò"{*Íß÷íšÉ+±7ÛªÒoè· §BHê9OëTß-9[ië¿ÝÀ¥cl£B{˜±­F/†Ú˜q}Jÿ!8àS\Ç<\ËÁŠ<Í¢J÷”ÿ€†4&© ¹íDÃ58MÉïA‰4”|MÉð!oøÿÅGÔiö܃ÏŒ—ߙޛVÕ^G”ޒⳡ{'̆@Qmñd^Ó´ÞrÚ_ÆV‹rMßGH$ÂkH SÖŽÄ dÄ„m *ˆìRãgú{ª_Šr]T‡ðC±Åe}ûðß\ymÒ:{Ú1ÞΦ¹.¥ˆ2`Ql*@¤ô l1v‚Àþ‡f5lm€#ûni|ÛñˆØ·W“éM×Êö…¦Á)$V¦…(‰=H#FIê<š:©Jaª‹-µx$¨·…y ÀiÖ{Ý–eYUh±ïµ-ÕA /%«Êµ¸äe^P£“E* cZƦhY?Qã22‚µ+wTæt-eULNÈ1`Õzlk´“ÐN«-=×·ðIßÂ1òãH;_}H² >* µ Œ”j£™‘W…hÞå`ÜŠrüE›Ï»5ó³I§Lô®ôB?›Î#!£ÿ í'q… —è“ÿ›oéjSQÑ™þÎ1Ãb!i¶#B~b”'{œlˆÃÍb•}+hFMËS½ÃÑ›¹ö …v°¥[è<®+ó#/¯K\èFmâ`¥¸Eþœ¹ú2j¶áè‹}ýw¹œ1oõÍlðï+]áf@“ˆxÄÊVƒù×Êá#ðƒ<ÄÖN™®,Øvî+k:øólFõ) 5›!K!h‚>J\l²¥æ|÷Œ‡£AÒmL\{*K·|xR;²ÙbÛ‘ëè'WØ.¸ü]µ›0Á(v½ÖÄHÇñ†`ùA ‰ýFEÆËÍ{—Î`Ô;†i} ò¿Ó­GÎu`´ÓÜ)eñ®û”Ä£H Ú¿Σ;Ù5©tU ‰:yé`òÐQŸ'“‹¦tŽlS!Ò}?Su$ýláQüÀÒ ¬5Ý!Nóm¦¶íØeXº4G9vÆátI9]g´¬ÓºßzÍ8ôŒò»J8ZÑú‰å-ÏL5¨ +>K:4 f8½ž©vÕ¹p^®ÚðO¾ÛiùŒ`×rJ¾ê̤ÈÒŠ"}pmåQP‡Æ³pPÍP“ï~éyF;ZOm¡AavkÓ3;}6„È;ctÓW³ÕœöÄ/䔿PÄx~’2u ëtz¡|ÁD;‚¿Æ!õÚé(Ò7Ç÷Úæ}hõ endstream endobj 3554 0 obj << /Length 1845 /Filter /FlateDecode >> stream xÚÅYKoÛF¾ûWèH&ÃÇŠ=¸I]¤Ü Qу“Ú\Il(Rà’VÜ_ß™]Š”(Yn‹Bí{æ›Ç7»öf«™7ûùêÇÅÕ›»(š¥nÑl±œùžç†,šÅ¾ïFa:[ä³ëÓÇ··ï+;H¬V¬Þue]üòæŽùƒ¥Nø^d¾£Wž>¦±Á4oæ1´BÚû¶YuQÙa`µr´îð û$CI“™ã'n˜$´Qýø‡ÈÚÓDz8ˆ­[-{2–= ­Ï¢í¦U œ`;ó¹5uL2VÐgnäG$—’?Ÿk€X÷|#l%F½œ”ù¾uk6›0´ŠÊV‚¶kñ÷t IÇèbcÒ±äÏ¢‘`JÊ^Kõ-¹ Ïè]¸‡Qä”üÇp^7Åê¼{7€9ðÏMf N¥ŸŸ`K:ë]±ù$ò.GcmMXguÓ¼¬JìÜ·5qtZPÿÈ1Ôv Ã‹APŠœóÂIÂÖ¼¤Ž“g‘±Kш*çå ¤>f°ä¿ ¯¥àm׈œ/Œ÷‚>¡¿‰ÌöÁ† áh€í7™¸“ÿ%ÍG¸_làúsmûºÙð²øS-s7¢]×ù9ÉãÈM“@m‘ÎÚc†»R—ÚÚv@Jí D~c;ŒÍ­õêW°Hh ¥ÑøüvqN#§j`ð:yAн3Îyœ–‘Ó¢‰lÇ· øQ›ÜV÷úŒŒÂÔ¬ m{±]ÿÍ]e+š Üè¾Û õº¢*Â,®„™3œ³®›‘/…Ö/dSçœMf¼®J±ç¥ ¦³…ZŸ“x˜l“l_̵·Ó¹Ü™¥{³»mí•NB¯væÓ`¼BŽm߈Òê8–O6P/;Èè"¯uèoîN«uûO¢à°:&Έ-í{u2P°ÈÍÂÝZhÕv*Q©µ aQ­¨›W{ߺ8ñ2—ñΔúÀ…âÅNf¢4Án”ØAJ`8_Ö•œÄÇŽ½øzªrF£¥tm'Šbk±.$g\ «ôñA ­F[ƒ]õ>s¨Y<Ð,q£(GרY_H\ž§¨ÃO-Ù6 ÇµÄgÉ-‰aâYbÌ?“`"V`êGÅ70ªÊ'àËé“ï1ÅæSln‡97uz€—¥DÉ8¥¯Þà̬=p³bas3ÇœºA½4Æ4ß*‰TªR@Àá)P]j$ÓHŠÓl »pjadl#SÚŸë˜APHž¡¸k{_ ë’äÇ’ysÄj)x˜¾*œ¨boɉšö¸X‡³Ê£…X’…â…pž²ÐÁ=R“”:-Ì iü!8%˹/v‰J×â¢*ìßþþ·Ð?€ïn]héU3CΗÿ(Wl‚F–]Yê9tKPM¹å™žŒi»°>Ó«”;ªE›m§ç ”†©ô˜0 •ž#½tI08(5òËX ·5ÁßÔ¥Ü_;):x•]é\3ëgÞIYpmÏoTT¢<Ç13h.¼H¾ÙBÕÔ6B\P4}dLhCcPhÔ ±óÜÓ¹G%ãa¥ ¬ÅÒÐúõ`âÜ;rRµZ®ë®ÌiÂ>•ÀÜŸtÕN‰dÏų£²0Âü‡Ÿ ‡,ú#4ò‘xAý}Œ©VS£À;lÌ!Gv‰ñÕEMPª~,iR6¶¼hv…ÔS&"¯çgc€Vl‘ÌçÌ·îÅ æQî=£ÈRëÇe“¤‘1«>S'§OÎ[.E‹á‡M¬eñÚ­1§fkýVrX^™%Èв+^)„iSo¨›Óg¥Å¨hOà0öÅ›{”'¡±ÄËWK³؉Îøc#š•ù© ;-]Vv¹JL,5ª\ʸd ûÈ—¢%TÞtÕñ ££k!M†¾Š‚Àº³gˆêŽï*o¦Ÿ´bã¾P†ÿ9Á5¥ÿzJs'ÔÃŽ'êD¾7þ@ž|ä2–’7“ŽbÎS7Ž##vSFR<\û_øáá:øªuæ¦^<÷Á¿Æ‰H$N`~„SŠ=83À-}3qJÕM¢t$Îï{B •7)Á` Wsú&Žh8 >HÙÔ©ÜÍ>=agaêQ_E‘¹sá<¼Ø6RÅ&ˆÞªúû•cãZ gÚWöÑëã‰Û°\AÄÂöz(qû­$ÿ^s¡ñ! )ŽÐÕ9Òr…>¡,'ê<âc#ïÚ|·€ NùŒï^~ÇÔt«’pó$\"˜³Q¨^OjóÞÓšWCMãbUò#—FZó.$õƒÏà1KŒJÞ}¢Ÿ(±ÜW<[<‰æ±–/°/CöýØô~…Ro›zÀÈW°½ëºçωÔC¥þSƒ*ŽôY\AD7†É‘»¢ÊßW=·Uvt 7ߟW‡ChÏ endstream endobj 3560 0 obj << /Length 1071 /Filter /FlateDecode >> stream xÚíWÝ›F÷_œHÅÒAXÀ€OíƒëœÓT—Óõl5ÎI]ÃÚ¦ÖÝ…\¯}g?ÀàÃÎ%éC+å‰ewfvf~ó±ã[Ã1Þ ~\^Í}dLìIàÆrc DZ=?0B„ìÀ›ËÄX™.rG÷ËŸ_̓ Eê…Èö£I¢»ª˜Í¦‚nàhñ Ûo1X5‡å†°é)¾«¿p¾Ïïpžú‚ÄȈ€9ð¥¶Èrlg:ºþ]Q~o©ï‚T —¯q‰//¯)NÄêƒ3v†ûuóá´Z ïn¦Ãûû®H¾ÏÒRÈh“\¨³úü >@ðò)w49sKWø e9ÎÒ¿I­(P<›yžɯ˜¥x‘9ÁeÅÿ\‹g_t9ÄÓílÚÃå"{‚ÂŽÓMI˜ZîÛj/>&Ô"-J²SZ¶¦œt4žO¯W v–6Wu¼#ÂHk9Iº^?’fý p®j5Ê^lRÆ5X™€P-1×_µš‡²N´œWc¹«ø‘´Èµ„„eºÑ¸ˆw”é»×¤| ¤8Ò÷H\$Oj{èæè(dã¤äg´åø£¨xrÓ|_•ÒÍ8k¤ÓŠÅª(ÿ'²#úŸgÇ Zg¤õýªÜyG­Î=f< @œÁÿ½¾+ÆÚ=8ã´nG$nBµ%LVñ®Éå’ð‰Cëu˶Šû>¶~Ö´N˜ü$±y ^Ý–»&NÛü­èÿûaÝ€ÚVÙu¾,¬»=½ñ[؋ْá‚CYÎë!JÝó^!ÞÓ8>ûiò-2>˜süØÕ@~]ÁÓ¡qUˆ°Ó~å×|ƒ«åàÏm5ÓŒ‹|;€’çƒÕ½c$p ÛÞ$2$inø0ð„¾ëÌX ~99¨‘)jL`vCš¶ëºg¦¡`Òb[Y‘çÃB4p@ç#Ë‡æ ´HãÑ™¢{ãÈœQÆÄ?ÉTõ’›Ó‘˜Ð±yÊO[Ž"ßF®÷9–+ ýž¡ùàÆHÏZ¯ Yº¯ËiߨÖ,#‰¥3>8zЇBñúòP Z‘°[Ú »1Ø|°Îqm«<®äÄÖæOR¼U/±™Š™2‡w•™e#%”¯%A àØjg>Š> stream xÚ½VMs¤6½ûWPµ‡0U- 3¤*g×N%åìÁ3>y÷ ƒfL ¤) ¼ñþú¨i0c|Ù è£ÕýºûuKwðï‹ßwoâØKH³ØÛí=$ŒboM)‰ÃÄÛeÞƒWËOŸ®ßv}¼‰hO:Lb² B««‘c4¡‹À©·ÒQOzÙŠ/ÙÚ.†xèÞðƒ;õ·ê6}¨oIÂXä×`¨ÇDZÑËÅr>Θ›B¬{Vç’…$¡|ø€"ŸÅž×E…“mˆÿRTO*ûµ=g£“¬VcÃÍnÒ¸6èMœîàM왊ˌë,ÿ!ÅoøÛÝÝ_OuIÒt Ë‚¡dìT ‘‘Ú õFÓ0ž…~T#Ñ›«Ûí4áfy9ˆ·B?Œ6Ž÷Jã -¸1HÂuØãÁC³û‹£gŸ!þVÔšWS‡&ü´ÌZOø DôËýííiYö†l<›Në^ðªÖÂÌà…Tºä؉§i`U§¼˜+ªòXW‚„¤P<ËåÁÌã<Ï2’Š¢ yFç©w‚ÍsªNšSãνŒm‹Ä+}¨K!!ó+s¶9žjŠt@Ðq[¦ƒú‰[û7¹6¶é…aØVGVuw僖±’q娿¹?ÃìV¤Jfc»!Ú»ä†]ðOÁèõ¿•æÆÄ?rÍm»ÚàªýhKNd8WrÁ6~¥pö·Ð± ê׋%õ´«`ãç÷SŽ,Iüïyõ„£ |‡SÒ¹fÕ¤˜^o“dÆdAöâbQä·˜ {˜cþêì3¯8N ü Œ ŒŒ-«Â­öŒ \f8p¥KZÕG3y1 —%ÀÿÝ݆õþºå÷©l-;?{9ë_sgsÇÂô/E°]òJç)t2˜-‘¶Ø|¨opšª¢.¥‚~âÆg@îTÕ2wŽ=/,é¹Î¹LÝoYZ .qÌ!æ°3Ÿ/ˆµ…ò¥.–ÍŽý íªaïü°.q©dnÝÕg¶9Tzä•Hë‚WâÕÓ½ Πæ‡*ÑC4­qK²XF–·îq{k3ÌúæKåZMÇ*ÞS;|Û¤gôœ'…5Ù˜=ju°”7mv â­~,¥4ö¯¬ Pôe”ßc]8ÚkLDÔÔ~#óäHû5£®­;C _{n¯¿›KܶÁ8Ú ­V¹+ê/ïI÷ºx›H[Èz´ ŽGQâÃÀàø ÿæ¡ {à ,ØgÁQ÷Zo¶ÛsàsPæJâ^£Þ.aa)h‰¯¢v¿«øÇBœlɯ¯&ÇrÓrH’„h¹p·Éè]l†L^í×»‹ÿB9b} endstream endobj 3575 0 obj << /Length 1229 /Filter /FlateDecode >> stream xÚ­WKoã6¾ûWÙ DZ‘zí!Ý:‹-‚m›½¸ÁB–› ½–”ꤿ¾C eKŽÍ½XCr^ßGr8v­åZg¿,gïo|j%N²ÐZ>ZÔuÏ­ˆR'ôk™[+¨?Xþöþ& Gª+Ûs“Ð%wÝܦ¤ú(Óf{›6Åœ’4i¥Mf®‰4|!\<[6‹`èa$É«Z–i!þåó£,W6c,"w#mÛ§ ‘éœÅdæ’ \>£ÎÁ¯¦í‘:÷åi‚ýC¶v[‘i7[=ôá|éÁ3®‰²G1©•!Ù0¼›­9޼¬å3šfµjßH{è0sÓi”yŽ Ç1Aüq¶‰vžçxÍþš'!\ºŽŸ+Gô¸¹àþ;Þv²R#&5g¥Îd-*n’¹çLÍÞô•$ì+‰Ù,Ñâñ2‚w ]Á­îŠÖ¸Wm-y~–NkéžkG±‡G÷,~]'¶¤¢xwºöXƒµ¯kŽÁr´7¯e³xJ˦àêL"'Ê ¾BH‚ëÄG_ïÞ{®K>×- ²«®ö÷r ’Ã}øÛ Ü‹f]f_¼ÅŒé)݃ʩUˆèE¹Ö»Åfo`Bòo}ŃQ»«Q é%ªï8Nãe×’j Ñ¢XwµZ®†©µ9 ‹ª­'Þcòµû­×ú‚¢%ŽDŸƒH‘±Ÿlüªn yjŽø/qIß@…âÏf¦.ª´äjª® ]Ñ+ß}xZö?Å}š¬eáÓ«øDñþju±‘u×\<¡ÿ(ÑŠº:O='¦?D‚öOtäÔ÷™ÎçWèò¤höáßø®%{Ê40·Ò೑½KŠ1rè¡EÉ+QR]ÕL›裗w™Ž®û Ä'ŸZœïk|¡WÌM5 UÔ¦C?ò>¸màPóÊ>Õµi·,±<ÂjÚ]ZìŒÃ_¾ÃBIgçûd9¼¼¢‚Å3¨ªmÝæ-_÷Ý“QWÏeÉuó~’cØòÿ+øc endstream endobj 3484 0 obj << /Type /ObjStm /N 100 /First 980 /Length 2030 /Filter /FlateDecode >> stream xÚÍYMs¹½ëWàh„Ah|¨´›xí8Ùª¤vKòVm"ù@Q³cŠ£mçßç5(J¢EZCŠLå`«‡ó€nô0Î'£Œr>‘òAþZ•-þFVä„•NÞ°òs!¨@ò*E¹ü’0¨ü’™Èf0¾Ì˜I{abŠäErŠÒü­W”1¤¬,ÁÇÆ(k-‹D"‰d•uTpRpøÍ+ës1’• xK6bl”°.¹(–’S!`’b(›IVÃ&+gÿ1A· ^$h$2PA˜‰XL!€-ì f[/óÊRl–IçÊ$xëR±]–ìÄö2;†…hÅN¼H6@…©¬ÑBY[€s€ÅXŽ7b"[©XÏx2e@€TL±R1Ëó¶˜b3¤„`°Ã,nn Þº(#œS^|S¬òœËo˜9x µP’8ʉº8®ô±Äy< "ahŠ*0 ¡(o³‚+e¬7ŠÅS$ Äs¯x¯ ‚ó )Ê,H–Ň˜ „24*â_öø-p¤8žû’“‹=”å36ÈJ#gÉzQwWT0rÖ‹§¡R±œU`¬æy„µ,#`l,!b„R Ay*!€ÆKTäNJæaöH%ÍBVÑO!A‡ „:º¹Š)È,0 ú :ŒÈð<Œb£-¿£,‘‹ÉÊÒઘB™:2‰‘€eNÇÇÕ;uæÄ¹F¨ê÷þ ei´Ôc°Ygöj2?üøã÷ÑœXG¹Úå¤ |±„~ßL:u|¬ª÷°6ceØ{3›ûôÔÜürÐy÷Ê—8s÷¥Ã¤ù+èª~m›áiÝ©3Uýú>Ô_;uoƇÿÜÖx1¸ªª·0©žtSieüAuRO›Y;¬§óS~ûG}9üÔ|Ug¢2ÀÅh,¡hÐb´t;7¾™LÌv6o’bOi’wB\i!ä;!›…@ Á.·|¾YGÑxPÎ.ºòü÷ÑäÓAõSÓ^Öm±Ö|¬þVý\½=£ò Â5h°Ú¢ytÂ_´JÑ=G°7%T§ªúkó¡Qõ«“?&zz;h§õ¹ñæfе£¯¯Åá;1ˆ`ÒÁз5%Ù¢6(›ŒÎi­A§õ¬tkÍX¥Ù¢èAoGÈîÂûˆècÙY4Y÷ñ~)e%Õ›ã㢡z3ìFͤ:­~;ùYþ½ºîºÛéQU ÛÁD·‡·móo(ÐM{U݆Ÿo?à·«¶žNÛ×»òšx ;¼å´C'p°:#•­õšÂz·}u×úd6Ö “vH²è² “°Aè$Üá“®“ËqÝNÏ_]›‹Áøü|6¹¾h¾J²ŸnF—¾{˜M¦ŸF·E.Ï£«IƒEÀÍõT~ùác?œüö—ó×/H(o"ú*B`H{ìeØè4ª þ°H´-ê>kô³nÖ֟᤺äÕ íFÃq=}€:Mº¶Ñ×ÝÍøõ ª"ÂØ¾´ìNغ4a¦ÔÅ|Q;«Bß{!x*¹¬-x˜›öf}_»&»+ëfðh²Fc{'lŠNl!͆×Úð§¹'ŽŽ¾kLØ9§=È ¨—ÎØP¥µgpP¢¬}ô›on×ú웿8¤Ã/?ê/ß&_á 9>ð„œ Mˆh œWQÇà{ ‚¿²/öC[Nü©';ú&­#,Ke™½<&"Kìe‰¯<¦(xB~Ê™á%„™ô„°ÈIckÂ’ù;üâù¬³Èº"£êKÖY!ÖÑ¡íï´c\ºîãú›“s`ï[ß“âÌ:8ê‹Wð{3ìH«r}5].§ž`°Z«¾ñ ©ïÔ.[{Oí(è˜h/heÑ÷]_4æÆ)¹'š0·Cµl~¸YßÖž{¶nÖÃö¹–pttRO7õÛz<^¢¯%p”7èÁÏw‚•hlê‰fµìöÆ1SÿÐþ&Û-ÑA©ôC[ö«//V¢ G’y‹Ý}éÎaýÝD»òÄ/«XçŸVì\CÿŠ}ì ç6(Çàû¤ŽHê”÷ƒ¶ ½-á„pGÛí †Ü¾nŸ¶°wOìiû–ìî®äzu‡½Ù¡7gø589Å8å‚/L:àHå¢[†tÃë/Mûi‡—B6iðd¤£•oHƒÀб£³lfIIo7¨‰ÇàbæËKO4V¶ÀUhI®œöƒ–ë-ê vI¦ö[ôËõ GrG ‡WôKîÙ/™ã“rò‹rb³h§W®†áU+ŸÌt„ÿ,;mäKi…am6¿ݜԗ³áï'*\>hÐ.ùd2*œ•C}kÿ§–8-ia}žßö‚uÙò Ona×ß×\dzi÷¤¼y“-]OÖ·1·_.ƒ‡‚­S=¬ óœ6Kõ¥¥oÂŽy#v¼ mÉz¿4ETQ¦ý 9èàwI—Û`ŒòÜí²)†§Ÿ±äþvëL ÜÚ-ŸÏ”UhG軬¾0ó¸âª-ºíwšh÷p–ö IÖ%dTÖ$_ö¢<¯¿n¾©Û«zÅ÷³›¸ÉEZ\u%Å$_;z¢åN*÷G{«Co´´¡Ê[¢ÿ }óc endstream endobj 3587 0 obj << /Length 1106 /Filter /FlateDecode >> stream xÚWKoÛ8¾ûWía) V)‰’¥öm“¢‹b‘&n/iQ0íh£‡W¤ÚÍ¿ß!‡r$E¶Û^¢193üæñ êlê¼]ü¹^¼ºŒc'õÒ8ˆõÆñ)õB;+ß÷â0uÖ¹sK®»úÝës÷Ëú¯W—Ìh‡iì%4_F/ð#­´ Ö=h³ö²W_+X Ñè£ä[12;ôwÉjŽmêïQ¾mùîþ=ß•<+xý™F´¹ûGdêÌ]F”Ïó`ÍׇÃez½íË—¨qâ·ê¾ÉQÞ4- YÉ¥Ä,¬Â[³û›ÍÏâ-¹]Ë՜Ѭ ‚ħQt$$?5 Då•ûPmtC?[ídv§y—©¢©½šWãü?/J¾{qÂèA<ŽmÞŸ_}7ªGŠUú&Ú»FŽq¬¯?^Œ•mÀPN³¼&Ã::Qç7bûRÍý÷9\§{ëyxF8*óãpÜÓÆrJ³ ®RK§óvÛU¢vÀ(y”V'è„ÑMùìúž­‚9w—aö2[À‘9ÓnO<š†£z>.ôq6À ÑšãvÀK‘# ÕàW[ùU>V?r>°ä8‚H#Xß <)£¥fƒHf] yB¿£gë\ç„.AŸ—xðÞÁ¢3½ˆéN§êsÛ÷¿‚P7ðQ€~ð !‹{®O HXyЀÀY•¥DT½–ŸiÈ„.+‹ˆ2y©Ú¢Þ¢|‡šàÎÌeŸˆ‰²éŒ®Ò­n‹F_ ZUs|{iŒ‰¾‡ÿ”Oé¹KƾþRB—ûsi­OÕZ÷™ÎP£úRÿý,¨}ã…䢨jN¬È7“ÜL5­"kª]§l¿ò:ÇX$(Ú5=Òàv1òSˆ¬±@?H¦~¢Ÿ:Ì+(®a3WéÚJ]Yó0 ɮmLø™èoâÓ0@ŸÜ4&¼ìæ<ÏBum P÷ãMËýxÃöóIf׿ê%ÓZ0·ŠewàOPÚvR4ÜËx™u%G^3™2õ§å¨SÔ“£Z±œ»%-}m7ȲÁf½X/þ]ø Lÿê ÀƉ“U‹Û/ÔÉaüAFç»Q­*+¦Ÿ|¥s³øpðv1OËñãS/†„ûikÉôi9¨JœŽº$ %×n‘NÓ2JÈ»:;7‚|€PëÆ‰Vä54¸^kj»”ÀÕÀ@àå£,LC¡bc½cJâ¿]kÜICýƒùñê%€î'òƒy`3OlŸ1–.o„ÌÚb§úã¶UMfâˆl¸TEÆñ/·M =YÙ½¶±Köª;žé|p¡¯‘vÚÀLLt‰Œ0˜î…êg¬?ÝÀ ¨Ö¥›À+ÀZç}ç*^”rîyÅq¨5²]ª§’¥<ž ƒ!C^àÍßr30”hå™iBÌ=Å3=kx¼Òvræ?x…ÌæÚáÂ’J§ endstream endobj 3599 0 obj << /Length 432 /Filter /FlateDecode >> stream xÚí–OOÂ0Æï|ŠBâJ»¿ŒÄ* ñã„Æ”­Ã)lfíHøö–•%++ñ¤é]ûüÞ·oû>ÉXZ·A«?±1ð¡ïš.b€‚–ícèZ>"°ìšØí½Oý‰ëÖ¤–ç@4°E R4+ÒÇ»ÑA×BÇð"¶]ŒŠ0LO,Z’[0²¦ vnáõ£D "·žÿ9([}Ð_÷ ¡.„P¬áCÄ0-èc,‰NGJîiLŠ —sKŽ[Êß³hXqâ:|Ç9ÍTîúe-Š¢:&Œ‘½Lq#‡çÅtª•¦IÈ¥ƒTݱòœî`E:MçcmT¡„q‘†<ÉRi‹˜0ÞÖb;š¯2F"˜-ô9Ò(Ù2ø•')W{ endstream endobj 3604 0 obj << /Length 1168 /Filter /FlateDecode >> stream xÚ½VßoÛ8 ~ï_alçײlÇpY±z(ŠÃš=u‡M‹•Ä×Ä,{mþû#E)±S×Iážô‹¤(òã'úÎÒñ?/>Î..¯ãØI½4bg¶p˜ï{<Œ c^ÌSg–9î禸¹šŽþ™ýuy²–4Oc/ñ9ØÒr› Ð…õtÒ’ó8ñ’ÐØã¤Sɬ™×yYx…ØÈÑ8ò}÷Þåsñîw´ÖÆàPEÇJr÷Bç[¿’’2óÕ½# ze=ÏÓÛãT{Ú9ûêGÌêÜK£ý÷ïÉä=§q#ëU™Ñ|QV4™¯…RÉ oÅæAŸþfbÜŽÚƒ{/›JÔ}J½ GO¡äÓ¾vºçAåå¼î8+º¾ûr{ÛIt!EÝTR6†‹|Þ•ŒüW2ýÓƒ”vD¯§·÷Ÿz¥AÒ[4…†Æ X,„ªû‘ñSV?Ê#`Ì>é¿£Èòò¶U^Ôö!êKaÓ£Ãýðþ55qsõ?• 1lÍãú‰½ H:ï~ýž8€{¦£ q³,Lj5Ý'Ìká^«·ê’Fðä%-¶Pe2k „.‚q†Ÿi»T=ÐÓ; )SÐD'w´Dª×“\uœÍ‹%­«¦ '¡ÈΣ®øa÷0awÍCiî¬Úž†î͈¹WŠæ6”ór³mjù†HYNFÆê#„$L!±r!š5Pä8⩽QÑY½’F(‡d+“ÜØW$-í¸W˜KxÎÚ?Ó`ÈBWÚ$öÒ$èVÚFÔUþìÆ1c¬$)ÅǪ‘4{ÊÑ8ÎlŒô"¯iD´ÂJZMQ¨­¼fCÜÃÃú¤7žE ¶{X‚üC>ð[ýÛZyé°÷`r"…pÊR÷ÀøzU•šéƒ³ lŽø~Aõ‹¥¤S/ ÍŒžZnÑúÉà×|v°‚t‰|#ž÷‚Ed˜IK‚gÖƒýtN£ðoø7°&jü•´\±¥ÉRÒÔ*°@©38ÏEmIå)¯W4[åËÕåºÄh<Ñκ`Ȩë>EÛ¶—Ü\©7”Vûs|Xè ª.ëmÛ/í¼ ;áFèù~Ôÿ縲b H}€ƒZN(èÈmÄЕˆ»Ä]ÙHž_Io#0Q,‰iª>P.û¬ e»¥®ÈàÅõal @qh`çÆîb…©kGÎó¯>uhÃÈàð‰¦8˜Û_“Qˆ™þ@ÛÂ: /’”˜ èkܺwÿ,õvÛ÷TƒñâԜĠðo¦É ¶´ ¡0lÑ<ìcGm«zm²\”†TÇ 5r>'í{øÓ¾_c ÷-»·9|6‡fâÜ^ÁÄp-v²:£—™aâÑZ`ÎwÈk˜rÜ‚’Ôãw¡Û8ýNè'ŽºïÅÉÓJYø i2IƒÍ"¶Àñ_Hßd!Ûû€¿SùhìøivñˆÁá¼ endstream endobj 3610 0 obj << /Length 637 /Filter /FlateDecode >> stream xÚÍU]o›0}çWXéÃŒT\ƒ1•ö)í¤*š´„¶)…Èë´î*˜9{bØ gÍÍ3Œ‡¹uYÇm&ÛŽvMZ#‚ODÇ#æÀ!QÎÒ(”vl;¦Ôƒ³Ô&°néÆjÓóµÝ6;ðUEâ+»ôýÜÚœ* 㮡Ý”zÝÙŽ2ˆ¬¶e•ŸÖ¤ªæQÙÖGîäP i ŽäpZ.n[ZW^ÕâA50h®‰²ËìãróYÆÍ¥íøC„:#Ò.E!Ñ 1“[±Ïý±¤zÍeó©L®Zúì´Pm;¢=¢WóÐÀ0¹eb#³Úu-uõ×zy·šÏÐo²Ú”µ£ÅêÆ.’4¯Ñ®J‹f”@®ýK¿b+E³¯¤)‡bc‰J&ûÎ;è‹S˜(©>NŒIµ”Éë¹Fœš`wì”~6Ú“ÙŽÇ©÷ÊÉzgJrmÑ€Ž~+môUoÞ¡çÖpÚ ÉcÄŸ0ù%ç¼À&“õÃ=Ìö_úÌÿÏ|ÆÎðÙ¶ÙRî+Ñü]Ÿ±ßâ3ÿŸ=͵ùØn“,“óÍðìQýÝðAû endstream endobj 3619 0 obj << /Length 1213 /Filter /FlateDecode >> stream xÚ•WIo£H¾ûW Ÿ°W€ #õ!e¤‘ÓÊ8N_2­Vʸ¦Ù†%™Ì¯Ÿ÷¨2Óí“qñê-ß÷6 -Ò í÷ÉçõäúÁu5Ÿø®åjë­f¡¶«-L“¸Ô×Ö¡öª¯êtÉEÈÓÙ·õ×¶Ù¹@}—xu¨eú(41”ö:Òsêzijµ¹µ€3*‡³¹cú'ùc[W¨ÌÁ ßq¤Ü/6YÉ{¢ëÕËý pФ$y!ÒªwÁüÍ–ßrVÕºCÁ+„æxî7±Èw®|÷—ᘠ-»¿éAìY Ú›"ª–ZzUö;þ=B™¡ž'e›¿yPcßeêun/¬…~“Îæ”R¸Á¹zsKlåo³²”ϳ¹©ó™©×«È±CÓíAsÞ×BWTð–‡ÁƒE[ÏÁ6fZ¯2åXµã…|LxµƒS¸–¸³ Ë_ç‘WLZ Ùþ)Èâ:I¥{ï¢Ú)çXq…\ÄS~‚Øl× ÷ÙǸ§NƒÈ!pÒ±=Vu©<Ùf ²\zQÀA"ÒH.EÊY!¯Þ ¸D¦x(ðO@˜5 ]y“²ø£*:Èocy‡Ü`ªÿR„Ge<ÎÆø•Ø$‡ŠqÇ÷‰‘€Wn21Áª}èÚ‰hwgÏ»â'c!àQÁÕyºE$.ɲnË ÎÂà¾Ô Ʀ’¤èÖ ­/€;töFe£€:)E––ýÒÈ„€£Ÿ@‰åÓáV7âëÂ%¾gÁu Z›%¯88*Õý¬Ì»D¶`Û:g+ŽT>ÉW˜‹Y"“7KU“rÞ:ÛI¶‚‡uPpäÿIY™ÈÊj//]úàbTe–²„_RÍÍh/fl;_gdp\×nÁÒ0KäóªË-£Ö)Z@ëÞéuÅô´ ™¥ør ñ÷j³Å ‡>+¨åJUqÈ$3›¶Bµð-«c™Ø÷ëÉ?lšÙn7Ôs‰ëP-H&¯ß -„—0Ý õ=í½M4¦ùÂÆ½&Öž'žËÍ ÕŸÌ¦A\ˆŠº>Ù¯8½ ª¼ë÷§¢gújf9z¡:4&psþ/`ÀÔeűœ 9EòŒÅQV@§KFvÄ¡æ%ËÀìÝZ>q> stream xÚ­X[oÛ6~ϯ0ò0È@Íèn9Àrk·¢²$ë0¤EÂH´­TO”Òd¿~çB*¶ã:0°HŠçð\¿s(w0¸ƒ{ÇW{ïCo0“ØWÓçº"ãÁØóDLWÙàÚñ}wøíêãÁû8^Ú„cØ’#ÚtÑUŸeó}˜Ηa:²Ék¤ÚsÍapR¸D>²ô# ‹s9jf]©ªaà;­^!_»dYp`ä%"HfTßÝ«´]`YÕëQ8öÇÎQ5AàÈì^¦ªJŸxZʶÉq:u³qK‘ëV¬Ÿ°,“ "…"ŒÇ,R©Úyí ÒéÙùÅÙÉšòêìô-G*ÏTu³ËIž'ÌëáÈOœZ+ÐÉœiS—±Ì4–Ŭnòv^¢–`M£¥^å±q|RW_Ý œuýÔ’tºMUÕ´êñÝË‚=ëjÿpkj…Rù¾3G…Úv¡ÒFV¢Ñm—åµHëòà¾TwkÞÔ«f_› 4ÏØÉ†#Ï™’¬®3^sxY7ŠGõe×b7úÂÔYÎ †üAÝL»*%;lñå£IäYhŽ¢Ø¹ÇXENh8c£ž%ÍÈ)ðdÇ Ÿòóv9O)B2~ñ+?l–Ü¢¯Ý±s©lÀÁO$ƒeåáÅ å¯Eà¤E§[Õ܃oQñu“ç, bðoK±ÒèÒþ-Åÿþ®~âÃó ÂO¢Tåjô<_¼Õ9çx¬ÔZeË>ÎÈöæ pÞ Æ]‰n, Û(ùØ[¦‚L•´LÉ+õª m$ÒvVÄ3°ÊnúL¿»Ž©`U)¡ó•Þ6>¢Í µQ~ϪWÆAÊ*ì<õ uñ%vÖ nÞ¦µKž ãûFéºè(ÈX´ù®Þ7<Ž0<=癞¦iM·M]T5p‘¬Âoe£U¥´æ9꺺Sɼ¦üÀg#8VÌàlØIìü–Ïæ(4>ÎÃDÒÿ~ÅÇ~ÊS‚1mcã;¯ncjCén!Ï9VÕ½,sÔÓ%,ÆNê;%kYë&³z»Ðl±Û¡aß»cÓŸðØhÄ“ ¬ùÍžô´Ë¬q7(À½¾'NSä3*p1 “‚«·¢&öŠä~üt |où-šïÃù§QÀÛÇdÂJ+îìq‡ìÐDmäyÎÇZÏyý/l> stream xÚ•WÉrÛ8½ë+X>QU!Ì}9ÌÁ™ÄSÉ8žŒ­œœT "! S\Œã¿Ÿn4h‘2­ØK7úõö¹ÖÖr­¿oW‹óË8¶2–Å~l­6–çº,c+ñ<™µ*¬;û¦¯?É_]Î÷KÇOm±ü¶úx~z#½ ‹YêpªÖð}…®1ô~µø±ð`èZÞ£8 Y¤V^-î¾¹V›-ØÊRë^‹VV0’-­ÛÅ¿çµ#a:vÄsY ã(a .Mx„l¤{çDièÚ7K?²ûzéQjk½eäÙø%ýy·ÂˆÅ~ò·~8“‡Ø‹˜{ÿèòVî•lê üƒ“œx©åx)"íËe€;¹VwϵU_7³e!꥟ØJnhØ¢U}»¦œ´Ák3¨›Ú1å0’Zz¶ÙßÞ\_ÐHüÚ·¢ëd½¥y.ʲ3v\™sót›žp˜íMÓ¢Ÿà›Ë"“Åj ¦úRÉ})@0lÕ ®*t"µá@ÏîÎõqu!Ñ[œÁ±;QIXÍy‰ZáÄI®å˜©ìq& £Õ%dþKÇ·b6þ3ùHŸÏǨ¿º‘«=Eá`êm³þOäêÍ$mñ®ã°Èuí?èsöùfõölV¸+5•Ó¥`W|^£äk™ëlE-æ¥kÅò±šWbªt½zFEÜ?«S™Ð|×GúC!Èš‚!¦)ÌhÖŠ›âû­,;]¨égBÕl79S;(ô]S-—ùó6¤-«ûj"í¹³®þíºé¦1º¼¸º}?Ÿë})[OÑ_¹ºš•ÞÈZ°ª)^zú£<›­èäû‡wóÚ·jÍÔÃþ(Ûÿs¦¥qhïd_¦$wÑn{ä€ÀG9ÕŸ§û’îè~˜ë&À5±OäŶ֢… }uéÒðY é±o¹bLJÑ`ÀbxÙ¸ÇO‚‰|rHÄmšÚÁnߊD.Õƒjr“pʯnæš_‚ϱÊitÉStÈ9dšXIsøñkâcJð÷Ùª„â»ySö•Éß½T;5Þn…Áƒ¬B#0AÑ*»× ›âI€fðÏ£,qbÆCU…úæ% t¥"VºlÑ/ä·W¡œrðI˜Æë#Ί—–ˆóˆáÐè‡Ëódp¬äO²–• ©ãûÙ||qã‹_8"‚W ΰð;´#Ž©}Ð¥j]:!¼?lhm3ÐëýR?éhR5œ´“æìŠ×†ˆŒ]òh6ì”à4B–ÛZfºŽÓÐæf:Œ iÀhà~}K :Çñ–³Ô†Š1–Èdx09s‰^ƧüËS8ôÈã£æt ;4­× îwPìz4ÔÔv¥ÝÄŧAëÃÆ(óš—ÄtÂÿ!xZ÷ºwžKЛ½ÙáØÿ„ø¾D endstream endobj 3644 0 obj << /Length 1894 /Filter /FlateDecode >> stream xÚµXYoÛF~÷¯Ð[)À¤I.E‘Z ÀM㸎ÒH‚`E­¤mx(\ÒÇ¿ïÌΦdE¶ ô‰{ÍÎ=ó-ýÑjä^ý6;:y£ÔKã0Í–£À÷=Å£ix±HG³Å蓆áøËì÷“Wq<8*&S/L#¸ÈºjË·U-KsŽg|fÑ}O2 v…H-µF^B7äÕj™yͺVf]å‹­kvÄœÆ^š„#7½tùºÐÍØ“Øi”it¹âIEß•*•¡áÍZ'‡SgM+Àq&ÎÍ1LãÀ©JZ–xäwT-WŠw%³É•4<üÛ]¢Èv¼ÐŸ}!T­ÊL¡ € æL'ô³?ñAW×d2W0 Æn4IœùØE>•ù*UÒN³V8Hn/q*ZXÕU»14®–t:Syn¼±›„sª–²ÍÚÐ|Ð÷ ÎˬÐT{äÜõøL8fCbª…¡…vC_+¤‘³lˬÑUyLëó¶¡A&KÚ:jUQò˜èU)Q÷oEOïÿÈ‹ Z­¸ºQµW¶Å¡¸ùäŠ)XöN…½ÅküL­ýð[Vu!óBßž½¥¼X¢F†æPa’8u[ò¦Ì làBŽ—•õ¿ÝXTÄÉtfi—³¬­ªë³¢ì—kUÏ+£ë… ç©6›\¢8wdðBAÜ£õ!ˆW0‰žÎîÒ7¿{‚ ÕÈ…l$r€]ò¶(;—o̾fM›ê–#ªÖ…²ökdÞÑ• †?Á˜&ú3ãŽIh)Ë¥1˜sQfÝDĺtmP÷¡‚‘Í¡²DãQH“I œÙZseè¾…’$Ëv ™÷|aÒµØÞ–YVµC:`DƒLš®øHútZ7m='±÷¤ æ${h AÅ`h á¸]vfdŽg$3\êRyEµx$ºF×ǵ-P!Ô%k?Ñ$øÞ¢ífEßÙ üá옦§gt’Ë2.Yká@É Ï®ù ¹ÔÜŸ¦UëuÞh°É_³F÷.‹HæY›ËÆ:nê³â!G\^]]¼ u£6’_åw´#K¦DCw \åÝ}šœ_q…²â2êŠ ¹¶ý‚ïñw'5/?àªê‡{ÂÅªùÖ/\R×¶yÔw4å€$;]ªkZ3íÜ€¯T´°–Å*‰ên ÉÙ3̵'F´œd7¼\ÎUnžÜæC¢–1(-€jJä`i»Bù­aëü”¾À’ìø¬Ã’oêfî5w›§äÆ}".Áaí¦k ê8°õòêüýå÷ø—û*™aéÄpÃU¾8¸×ËF^ ̺ ä€-ÕK÷‡ù2ô.ˆ(ŠîaÚPsó~óÎ#TECË¥ÝN¼0bù×8…º—·êGÐp ‚& P≄aá•[t½÷½jkÙuOÐy2qþQ/P„I¼ÝelÏ^s+˜–Ô#Kaû.û~@ÔºÜ!˜£-Š<\³ÙÔÃ&gM^5æç݉vújâE‚+z*C‰ÐQ_©®Œ°‰ï;/÷4=€$ʰŸ’>ÒÄê‹À(Yó±þJ[ÎDêH¦¥U¶;€PöÍ»cL!‘õÝVñ½Ç "¼H#¾²*Ý s–ÃÅå=Ñ\šn«bHÑ•3ì‰Ü*pL­Â TÌ;ä·~ï{üâ­ x´"$UþKSçu^ÍeÞÁÌD_šhè>A;F’ò-çHÈûârÛœ3k­GâoX×¾~ƒŠÕãAwiŸð°¶•'PAùd¨ Þ†Œ‹p“r®’B—Ц„—…#iJ 4ßðæÍQÿAØ`5Bô. Eûè ¾‹ ˆ½Ó탆*†&w1 (7L9@·˜ÁÓ\ºM ðÄcòOÆH°¨øaÃPˆŽvP•.‰’À ,`¨×ôéŸS4…&ø£êÁOJÑ?))‡ÏfGßPÉý ÏQV}úâ° ÀÅi2º±G‹QwO#ã|ôþèÏ}Èßú+2„˜Œ'ü˜%xœ¼ŠÓ-+Ç"‚r]›¶±‡Ä²ñB¤·~2´zŽŸ©s}ò€¢aÚÆú EI¡hÏož0às:U&«õ¦{‹<·OCÔÕrc¶œôΓ9e&¾ßhÇ"ÖáÑ·pMêo“ò¬®Š‚{`ƒ³ øoc|e­>îÀ V.¥Wk qY:Y3MVî>$ŽÞâ>#ð' Àï_õ³û I†¸çƒ1öÚò‘ßc0Pk¶$â黩 º¿vò }fWκfð˜¬/êU‹p¨%9(ó#²Zˆt¸îà/‚³Û ”Ã}ÏVÚZß>ãw¨~˜MŒ@œ[–nþ£øøßr s…Šï51dü¿mj‚r endstream endobj 3651 0 obj << /Length 689 /Filter /FlateDecode >> stream xÚíV]oÓ0}ϯ°ØŽ´xvœ8Î$ʶ"M*k÷T&ä¦îH“'ý÷8qº5Ù@ÁOþ:÷ãÜ{nZ n3çḧQÌ|f+@0F4` "1ƒÙÌáe“ONFîõìüh4â˜j_Î÷i rpïþlæ|uˆÞb@<³(D& Y;ók –úñ觘ƒûº­Û Lþö×.ý€ï¦O0b:ErŒî§ÿ`©YÇ;fsÓÃK×a“» 9œTiž¤¥(²ö*‚'ź;¹Ìkƒµ&¹È6*U];ç€!?~…³áXZÃH„0 ·S©’*-ë´È‰F8ðGAøX×ói …YÚ:é ‡Ët-s¥½Š,­]ŸÃTrÙ$m4äz¡pìr ‹ª7’µH3Õ{\è•â©ÍYÕ…66À>L ‘%M&ºô»‹RTb-]kYiG¶´4O×'™I[IÙ«‘ºH)íúVë“Ö“²ˆvQ»[]¯-ÏŽzÑ_)q#­5µÔ˜?_cÎGâbñY&õ¡ë…C„¾#[z>E11q*W¢Éjs˜R³®e}[,mUy Ô½¶ÑÑ«e›À®qÿ$”âYÞ_]\X¡y™¨2ÄV\%ïP™ˆt<º˜žYÑ÷2½¹­ÑbƒîD5°™]^Yep'«E¡ä àmÖZÒ •­:ä8´ãWRÔM%m6ôG„·ÃñEkùjròé•ÕFKy‰š=oïQYVÅ·Ÿ«–WwíYdð‚î†R3ûUÑ÷$É´RÌüDt0|íëkÛXÂQ§-‹¿GúU³ß©êm»ÿÏÀ?=V]³¿£ë©l*Qÿa?ý\?ùÑÑÿ3¾ß-_^ endstream endobj 3660 0 obj << /Length 1450 /Filter /FlateDecode >> stream xÚ•XKoã6¾çW9É@¬è-»Àœ )¶Aⴇݢ %ÚVW–\‘Êãßw†CÊ’V~>hDÍ g>΋vFë‘3úýâfqq}¸£™=‹¼h´X\DZý Å®kGþl´HGß-Ï Æ/þ¸¾¢«»öÌñ@‘bzª‹ÇÛ9ò]8Z=èž¶&~àÛ3P:ñbXôIŽ Á>Æ“Ðq¬/ôøöòðp…Š@É옅!±®8“uÅÅyÜÅ.ér†Î _Å_í]Â:¬÷ó‡ç»Aî7ž­7Ò^~د¬êÈ,ž^z"‰¼òjY ~‚ÙXf[a窱÷·p˜ß€2 ãr8­™•…]°m׬Kâò„ÐOÞ=®ËÇÛ.œ§vÝó<ðõÛ¶­–'3o?œÐ¥ ‚v<¹S¥‚Pï7¯Öõ–cß³¤èDbÿÙ‹LTäNíÔ+Eåò_žÈ~,·óäû$ˆ½Øšã‰ïû ÎEÖT{ô9²}Ïïø|xÈÃ=´WÞ½‚íkIÃSÚZ–Ú¹á‘[.7° © V¤$ùõéáf~މ^;;¢‘ßT$);Vôœƒä¾|Ð+ÖEdÚ¤¥2gÅšÞ«º Ëâª$?nžÓb­aƒú«š«¼!§^¯Vfy>a&5àúÀõ~°ò®¹¹‘3ë*Íέ°èVé£Hºˆä_(£² övB Ú ø#Ã&¶xš³íO½-÷:C‹U+½¢B õ°6$üxK«Foc•ÚÑÑR‡ÐÎKf,Bu4«hRqŽ-nŸ€´ ÜãåîTxlzÚé }„¶dPŤÚpS·vD S¦L Au+ɘ4î-“¢6€Ëu^â¼ÑJ×çU©S¹ÙsùüÌk÷Þ£Žyʱ[Ñ®ÀP•ÛžvüBÃN˜ØîpC?bHs0D?ZÚ“öÅ­g´†0h‡¨ÂñÓÒN§ `Ï üªH‘Q0v©PÀÊO•˜«W¸2³…6O²ŽPÑ3ùª‡ªXAduÊG×â=fÃ/èÁÂd=”}ùNV gP~¤­áÓ¨6#ÕQ@}ìyP¯a¯il1zTкÊ-ÒST@¤``äè>Ú(À6€AMpU€› Ü(>ð <¥#juXÅ™œ(ÕaV”:ê×Õ™wðò|l̬²ÛUåûSÛ‹05†ŽÄTšÀlÆÆˆ‰¦Sêyd±¼ææ±«©H)E&›£7™…æ Šý=ƒVÆ÷£ÐùNsé9}â÷ª‹™;’ïFd‹¶ú¯éQÈM8jj}]Ñ‚Ùë ]ªÚÜ¡éæî>•Ô Ímð½xþ‡ÎZÅúEèŠË\¯ì¯uê ³ ‰F‚&ILp-v!ÂJÉ “=®B•ѵÐLí^èAñã'kˆç¡;I†ž…¦D!–«`:e’Ùx¥™á-@g6¬Wü¿š iØö¶&4ÖWsÖII@Ê!ØýªèÀs£|E#µ„3xÉ4°Ò°Gæ¼âöyÁKZ•»ž`®tP3miGcsèqxH :t芵®ø–e… †wøÏ§wïÚz4â_Š…´‚}‰¾ÒM°3 -[×–V>xûŒÉ¾?Ç3]†nžýÿYÌSgùT =.<óºbº"ª›eH7ËÎ8´§}·‚ðLêœí}T—=GeEO¬ÁCo+òRÚ~·¸øŒÒ•k endstream endobj 3666 0 obj << /Length 727 /Filter /FlateDecode >> stream xÚÍVMOÜ0½ï¯°àÐD"ÆN'©ÔC+ ­*•]N[T™Ä»›’mâÛ__;6Kn)T.Ì8~3ófæ% +€Àçɧùäð„RÀ„úÌ—#BA„1¤AæX8ç]5›ÎNÝËùÙá ÁxP£@&ë¾*ЙüÇóÉÏ –.x—šF!$ƒ´œ,.ÈäåWI n{h ˆ¬•¶³É×]¾Ç¶çOâ!Œ •iËbÁþ»PÙw2ˆ[xQLsîú¡ÓU®„±3ë6nˆÞÜä-W^¦žGÎTùLðJ/Y%òTŸN«ŒßåÕª¯f¡Ð'ä%ÐË¢(Ž B¡nôˆ·i“oD^W£fšmÇÀÃ1$áÜ\ÏdsÊøN+àù±™@¦ïÔ {ç ‘«´Xã³ÜÅNÉ«VÖgE.\?r¶Üð¬K{^ýÑšùj€gÚ¤¼(<õG¯‚7/d!èzÄ'ÎýfeƒžœZRÝLÞÊ}DÄéúüʵ¶)Ûˆ®áúÀ´)òгÆàVµËº)™&¬žÕKm mvm²‹5Ú+Ù]^æ¿$1nîraœŒ›0)*ÝŽÙˆ5Ñ7«\å7n"QA0„:êAÈZ’2v*åмŸC•xjÅ>…(2¯òEËVܪ ‹Vâ¿kÅ,ÕW?x*\/DÈö‚0-ùL0Ö!ûûrÄ—¬+„>ÌmK.ÖuöÞ6ŠA©þZ‘ Æ{ –hÖ¶l«k|ÐæËÅtj…V#Xˆ¬ ’á5çÝS,¿ïØÔ¸jØfýo,nxsUËη³ñš´/_í¤…²V_Œ>ªêöÑåPM çc¿KŒÿ¿±äL}*ÚgÐôõô¾qýÐ?èç•å3ÙW}‘‚·¤ ‚my3Nœ1ÁtÞ'?òœßV‚ endstream endobj 3676 0 obj << /Length 950 /Filter /FlateDecode >> stream xÚ­VÍ›8¿Ï_¦‡©¡€ ‡¦ÚN5«h“t/ÓÕŠ$N†-›YÍß÷x†`–&©´'û}ü~ÏïƒÀÙ;óåæÓêæÃ=ÔOE$œÕÎ ƒÀg\8Iú‚¥Îjë<»Q$¼¿V|¸b Ê’Èç±C­ÐSS.˼ Œ}0>hÌç>O™3‹8d¤ø*ëu¥¤7‹ƒÀýHËêéëç÷h ÌÌJÇ$¬¤ÜúÍHšG“²¾ï·Ç³´ufÝ} â°Ó‰˜Ÿ†!¿{G&—ŒÖƒÔ/Õ–ö»ª¦Í¦È”¢ˆ$lÀï¹½ýn,æÏîR6u¦§”&FTLpuТž`T­ÿ‘=@›½Y{üºXLŠîd¦›Zª Ò‚¤KK,&MÖrÛlt^•~™쇻U…Êo/h}—6ö[ŒÄßÓZû:;¾\ÇôÿO;q}ÚÁkóaa„s,?e ÉÝÕûæ KE®VVI×QÞ ¡(ô;,”ãš ­œåI”¸wð”Œ1PnÂÒ§gê3»Ð~îBDèÂpŠæÈ ¼q÷™)·äYW´><->ÝÑ6¯‹uv Œp˜çg‘Ĉä±ÍÖîŽÖ;Ðôàæ>ÛFF­À-órOßuS…ª¼>Nåyl b[ys€¥³‚ü<6 ˜q_Û¨;˜ÜÝT/t­TUÚAî 2ÇFâYi®´7 Ý ´kÜÈëÙØz–YˆÌ¶9¼¾ù–p]•tòqƒ1Á{íþÍ SKe¥M -ƒ‘«¡÷3ò2ô{Lå~¤²HP5ÂÍ©áÐ2C5!›È}ØÑUçì# ²V¨98[SjÐu'¸oFäg)M•xõâØÍê<[æäôÐ~U¦ó n&dBìÿrÙTÞå"X˜\kyµýiØÎLvÁ_éÅ£¿’ yܽÐgàÔ®™ìz©p³¢‘“S}ü7nOó' oRš71?”D§vLSÛ$½~1áêÞø4Ó6Y±iŠì„]éªîÆp^ŽôzžÆ¯**=‰ýóêæ¸Í ° endstream endobj 3584 0 obj << /Type /ObjStm /N 100 /First 970 /Length 1336 /Filter /FlateDecode >> stream xÚÕX]o[7 }÷¯Ðãö¢+R$%A~ Û€ (Ò>l ú¥^W,° 'º¿CeMíÚY¯¿°ì%ᕎDêèP¢œµ¦BÖJAÌÿshŒÿ%ÊÕ,0zˆ ºE¼͵¹Ñ‚d…ÑRLƒ‚r™|4p0rlËÁ¬c%êX E‹jrpÕP¥ƒkhK)P²æ"’ : ,KÞ†Ùª[ŠhÍÜB¨B},Ãr–Z …s¬cÍàË¡’j0ÄCEÅ›0 ¦4…‰«Óa„Þê„a|sFŒà¢UŸã9±‡G°HÉ]Àb_…q‚Õ|f¦ÀYœ¡3Wƒ fК}bΰJŸ¸Vî`Ù]¯0ï«e ÜRq˜=YÇÁ¢äÎ2 ¤€d„—9Ѥ€€Œ™½|póˆ}Μû|f0ŽI|cbÙ€^âêsë‘AÌæÂþåãKÁ^Ö”+;V0¾öpE4òØ%IèÅtP‘……@œ%#öBP«GÊ%'aK–â.*¬»pé±+F¨8L|Nl&vÝl™”ìì(:KgVIíÌb§¥¥‘ï…Âm³î¶MÉ—­°¨o­¹¦ÙÛŒ]ݾ2,@s_VX}/ 0|"(ôª:V‚šï°êq¢É­Ú'nž$ÞV<]< ªG º3øÑê9døƒÄrgðƒlqgEÔç. i¨O&''“áE8Gæ ú, ?ÿò+’'ÅìÙ[8V0»½ºz3yòä hµˆèWѧóÙM89 Ã)„ѰË}Ø)ÒìÓv¶! ÿùÀê'$˜!Uÿ„ÃËÅüòÕô&œ‡áå‹Ó0¼ž~¼ ÷¾^ÿõaŠŽ‹wÓÉð~§³›k?MŠŸ gÓëùíârz}wÂô¶Ÿ¦oß_<› ç~úyæ—ÆoàèbÑêÝà嵃íûµ·Ö—^X¢hëD-ƒ?eM£§â8´‹ MC産Ÿ¦ãÐL„¹ƒÆ©=7ÿwhÕØp²> ãUå.kzE¹+šö;TH)êÖÖEÝÊî¢nu Q/ƒÿUÔ£²m»eIÖˆòŠ`Q–ÖˆòZc4Q+àû|¦qÝì ¯‡%µÄáÎDQÚ@T݃¨¶ Qmƒ¢pð5¶ã %E¿ø:sLcÃV\È’ÊžWìòôEþ$åhýlò’vg%ÑgÓ øžcJ‘ÄF¢Q¾¢êáã …"ÊÄ‘hn%J®{¯¨Œëú³m·ÁÃÓÙlŽÙÎïÞ6OÚ¸ñ…ÿŽœ ¯n»éß?¾Ÿý9žÍo§‹î%½¾~žŸSÿðÀ.±$ÑÕKe-Q½x×Èxl≋:5ö´óø* ßÍ_Ïöᛳßgñòêöúfºˆg·Wñjúþítö­Suð‹ý)X%úû!5<2s³˜Ú¸Þ-.>üñ@p]I\¶H—eðWëÓè~ŸY‰Æ3zÇ1Ð\kliì*Y ­cщ¢‹ù€åÍAR1¯?nüá½óY›·xܬ€?ßÃ)×ã ¹D&‰VkÑT‡Îœb‘²çYûàÕºóˆúUö¨_e›úU6Õ¯ Uj‰Îì‡-Í¥âêµ±hÎx½Ž]%•¶~òü÷?f˜Ò9´‘rX÷ù/hãå° ^Î`;6ט’<4ãZv¯Ð ë9P…nÞzZ÷PÑ6o=Ýô°ñÚÌòH4Å$ípɹ;‘¶N¤ÉîDšnAä2øk)¶7öÁ”yä臒wX-á¡Pyò– š+{h®ŒÐÜß[,Y\ endstream endobj 3683 0 obj << /Length 808 /Filter /FlateDecode >> stream xÚÕVÛNÜ0}߯°à¡ŽDŒ‹“TêåR !DÉ¢>PT™Ä˦d“mœåöõµ=ÙeQ[ÚŠª/ëñxŒÞGÛœ£„$ÜãhöLóH(z‰¬t3\/ƒÓ4ÕŸiHSÇeÆ£mÞ¼˜ÉJi¢,ZG_¾#óEfÙ «ÔÃÍÉRhKørˆº\&xĔɲtÍl¯‹¯’%1Œ5KW·. 90Jm¢Ó+³zxD´§­Á“‰y»h$8øJƒ¦’¢mÛˆJMêf&– ¾™ãEx Û™¸+fŃT]¹¶«—KC4²Êe•ÝwùêÂTöPwc¼*n,-])ˆ£uÊf{mªZÊ#qÜ„Fø“ûºqö\3#=>ãªó)˜B™5¶•—Ùº¾5#¨ÁîÏ¿;_^, è±u_šânˆÊDdmݶq¤{›¬ëØ5"ô8¡Q÷â9SâJªw@ÍñÕœ‚4i}ùUfí–㆔bBˆ•k‡ÖóIÂ\ÙÜ„=9‹²…MêÃ:“í´Îß±\+e (¿²„0p[(%î¡Æ;XŽÏŽŽC«y¦z‘!ÝÒýêi#ײŸzCý²1˜¼“ɯฑÍem$±|°s”îF+)s²xxƒ±z:ÖíôðgcëO lýÔ‚‘•ºÏ ÀÈï}Ìé›Nšë‚:Ç;v2wã_]ݰ'R˜˜úK ÿ„Ƨg  þ z …¯¬ þâ×Êÿ¡ gýïê;Æ`§á endstream endobj 3694 0 obj << /Length 1340 /Filter /FlateDecode >> stream xÚWKoÛ8¾çWéae Vô NуS$EƒlØnM F¢mµ²dˆR‚ô×ï ‡’-E±=‰Î{掭Ár` ¾œ\ÎOί™=›cßñóÅÀ¶,Óeþ °mÓwǃyÑg>ývu†ª@Í\{1K!b³êp3§—7å/¢h1žÊˆ§ÂŒyÉO{ELÓTäÑXù׺ûiyv-ã¸æØ¶‰þá)Ÿ¹ô]‹r•Çt^äÚ(åRRw'%êö/ºi%ëÁ˜‰ªàeŸP¯@']ðÚR^÷D”?þQٛ𖿴rw÷íö¶ÍêëBð²*„<À­g›¨ÍéY½|…ˆ«¨LòÌÌøZtª¸‰Þ¨ßVê·h» Éø·_hYðÍê8ïëUÿý½zLãA½Ù.šìÑ3}OiR,«µÈ†®c”²…Ãî·Ó9¨ÈM7 wû¢‹d»Õ¶,pc’ Ó.@p¾Ñ'ÕíP̰VÌoÛð´¡£rBŒ Ì1cÝ)b2]æÚ…r…`Ç£àp±$ Ïb’ü:½½œãb {ôÐÉ;Õ£Ê}' 9„›ú©F£:%Ú§Gå¡H²%ý.ªŒ|̳wäPÁi¿X¨ù0Äñ”lÝUķv¡h{®ê<×¹òõ¦*E+—®!˼ĈCÆŒŽ tê¨c±àUZÖ |dLmï ÎÆäÇ ô‡~ókCs©(¿Ñ)PY8CÊØ >J~Z.Ãéå2Ï€&"YT8ë4:5ÎmCt˜Us¾J)\(~< +Â;ðÍqè´áݸO9Ãq'Íáˆ1†¥ ÷$uïCÛØÙées‡{ù C4Ui˜1CV˜¯"{ `n›»]ç­R×ótÿ¨A¯î¡jèÖ\‰ÿ:,E&j¸KIø^Öƒâ9)uT«d¹:OsDç3QÒœÇPn-NUCݵ‘Ù=ýY¾#²føï ÍEpΧOË×xQ ¤:Fóоå—/Ä¥ÛÚ™Á³"…Ž ANz@'…cø2Gë‹%µ7Pñ±£Ós’¦¯ÛT¿fY^jÜ ]^ÿ†HïFÖÙççaÛ,ŒÑÐG|4ƒIƒeB×09†£ ð¯ "ÔÆ>ÑÃÞaWa+ZtEÆüf+ÙÌí¦Iž†žgð"ᩦl7£¶Úé]z#;àûSHûía@ßj#_h¦¢=Üõ»³}¢Ž}úµ½î¯¦5:P+ØÎ¿3ÝY4£#Þ¼,AÏ<´}Ž}ƒ§•è]‰ºÿ:«ÐT@3]A½SŽpåñhåiͶ;6êGþvDUÊ·QªÇSO¦$ëÈ5ÑvešéT,D!²HÈÿê%/䊃/ L^!J`‘üÒlR &úbò'Y' ^ûM½á«"_'Düû‡IÔY¥Ûâ)Q¯70Уdƒ]€?ÊŠ)ÏD=è™Z7xú2êý+˜È g¾o|OdÅÓäÊ/z8ô‡K½í‘N;\-/x(Ä€)›‹ú+«G‰ÃvÃ)Ío+×kž%‹<¥š1ð0¡³¼,E‘õy9Q¾ÌÒáX¶Mu½©Rª¼ý¬1†kT€ËÒ…ízÁ(°õL0Ðj (£>N_¡òA9çÉ…m™¶eûç¿Ì /Á¸ 䘖íí…§ñ±·m®æ'ÿýÝ endstream endobj 3701 0 obj << /Length 779 /Filter /FlateDecode >> stream xÚíV]oÓ0}ﯰ¶iñì$Î/hhBÓh»§2!7qÛ@“ŒØìßsm§]³EöHðû~ùœs¯ÝR´F½™¼žON/âe$‹ƒÍWˆQJÂ(F c$34/ÐO»z>»:÷nç—§;³˜¤4„b6024¡}ýóùäË„Á’"¶/'œD”¡¼š,n)*Ày‰À•¥è« ­P§'‘)»E³Éû}½Ç_‹?Jñ3Jb€ó Ÿàß§ïì oá'iDñÔ 8îjÏyе_”J·å²ÓÒã Æœà™nÌ.ߥËÜ…^Ér½YsÓ:Ëyå1l-.·(ëµ0®I“ Š~EÇ=é]ÌB)wÜϤÊÛòN—M=àÿ Ã ¡,E>KIĤ>Ibít`¸z•¬ÔÛR{A‚ﻕE—Ûóìv÷Ur+s- ·[I¡»V*âùè“ñØÁ¶ÜY.Ê=PcàX݉\:ßÊiI¤…‘‚Ãóƒ:íÕí.\óÞʼ© Z! ÈdÆšr×sã}ÀÇñR¨ǃT»UR0÷²,ïemu‰"Ž/¼4råCàapiQn•Û‹% MpÓi·Wºií‘Pd\lón+z5Áp'ZQI-[uâ JÊþj§ƒaj^·e­M±k“¥Fž€&½õp}3HALhÒ¿!7J¬åèŽLdúã‰4xLãšå')`Á)ńӒ²AH2Æ\Êñ± ™…î ì7MáÖ+£®Yä[¡z~I8ÐÁx_Œ)„+Ï÷±¤Ñ„G ?`bQ›ÀðÑLô GÆЊ{ý•û\ݼ{7 .H§ä š†jUKr¨O}45ž£“±Ë÷‹Èj)‡Áhýýã@>Ë!ú#sÍ>fAo­Ù‘è·7ý¬¬¦†ÅŸi{.·æþÿLÛ¡/ÃHö’?{>âgÌÿ'çÃüiøÿ$ü -òÓÿ½¾ƒÙ´p endstream endobj 3713 0 obj << /Length 1610 /Filter /FlateDecode >> stream xÚ­XÝoÛ6Ï_a´&•"‘úr†=$]³e+‚!q±‡d(h‹±µÊ’!QE²¿~wèÝi§wÙƒu/ëR¨1¡QwbƒÑ³ èÙóèÚxÍÈû,Åâ¹Tôö@º”I½Ti‘“ú?ÓÏ»íR¼å_Ê,«z¼·_>̤›>§wŒžù$…ªKyêXÃ]I™8u%ûG²ª*—N7Lyw¸3n híÈÍBö%Ø +%ò%Ü!T™>¿NÿÖãN.6}+ÞVk'õM¾ „ ú_Ç¥ÇÑd{$) a<“]~7÷½Ò>p‚ &¾ËrUod>å üÙ«šáï Oñ ê(Ž»Y8¬;¯W$~Ä¢¦lÎ9•¡5&9¬‰ÀñBÖ³ûð=!ƒ{ËXŒ–Ù[Œôà öªSóöXŸêO˜·”N½‰®}sµòäÈ|‡³‹¢XÇfŒFJ$Q;‹M“Ö«¢ÝBõ´\½ÀòÕ L!‰ð·v/QüBg¦y¥¤HÌY† îË5.t/­V}E#§ éÁ扶ðu¦cÉCbÝêiÓm Ö%eš¡ †TJ—ïªÖ¦Ž~E ÑTǾgአGue.lðNŒsñè »è õ¾Õà×k*c—ÐË›hø¦>’­8…<Çäð•)9üH«VÍtMXé9¤Án\¬Òïº7z£}5¯{\·ù 1—%B‰ëÈt¡+ó¹yĥ퀙½íÇFÿD8Z4Ñ^sŒg=ܘ¹ºÝ@b¡Ë\¿Ó5h˜Æl n¦Á*5G)Í<§ûII´ {xä0“:ç'[Vóûi~ö’v ˆ endstream endobj 3721 0 obj << /Length 1091 /Filter /FlateDecode >> stream xÚ•VÙnÛ8}÷Wé D´ö%@2HS HÄH‹‚–h™‰TIÉIþ~.Eű¦qŸ¸ÝåœËÃ+yNåxÎçÙ_ËÙâ2IœçI8˵ã{£ÄI}'aî,Kç]÷üöëù·ùå—Åeäy‚3/„`ƒaúÚhæñ?-g¿f>L=Çß…NÒûAîÍìî‡ç”pøÅ£~ßà @Lâçékü;WàïùݹiyèzĨçs7Œ3´ó±ÓˆRœÙŸÐ0p#K¹?ÅY¸T’µ|ùúäüÌqý 'A°c«æn¦¨ÛP=&œ­…lÌîW¢WuiVçm+Å<ÈÐ#kÈrØ&|<ÿ§nœ ÿhñrúÝ‹=]}³S²†r¤6’–}ñL`»P‹šáDGýyrjëgD)2µþûöêê(i}¬S×K›ÇåùÕÍ'«Ë^oœÒèDwbuá˜SVmVBª‰Kè]½ao¶œònê\Y«h$+¦h ž¾…‡¶¢Ø¨ãj4´DxX’ŽN\|«}Ã8†fÐMLákl5V­¤¤ü]Ô‘£¢Pxö¨q0qZ¤†RBãalY7U’ÿ–$Ú¾Öm «NR^éþön*N+µ¥X‘¦­éëRÅV7rÜ ¬Þ1K¤ˆUU+dmNô_ÊãÏV<éݷĽš²‹»]âû‡òH©^õ5‘X¶~«è†ÞUÂ/’þ°½c¼Xãš4«rZÿàÍØx-Iq”žë-PP¶>|víl©\‰ƒ‚.¯oíL¡­[¿ð'ý?÷¦!ä endstream endobj 3730 0 obj << /Length 599 /Filter /FlateDecode >> stream xÚÅV[oÚ0~çWDôaTZÜÜYöÀ4¨4±j*á‰U•I!kbG¶Ójÿ~Î…§¤šÔ=9²ÏåûÎ5–‘–q=ú®žm„( œÀˆv†mYÈõcjÛ(pC#JŒÍÄqË»èÛÕ"ŽDÝÀA^èKCÐmEÖßg?jÁ‘ÕÙ—Æ?i˜®ç5*¦3•—n«øÓòíZKj˜Ž‹B»½¾¸¸4}Ëš¬Üö,@ìiÒ~ï(k?âsÞb›ºGž6Íë‡öEÁ°™\3\îu:Zy J†"ô}…¥Äl5˜Ã†‡"B·¿ ”š§ }’`ñïùçö¸Y/—ªhg¥*p‰Ž9w ãúÁÌ32Ö*Ó¢¤ˆàЦ£w$}°,V}Ä”1ȱÈh¯(i¼WXK-ékFRİEÁÖÊJ2.TÛÈÕ ó’NXePV9—„ H*ö”¤2€8.ÊNøú˜â39î"³X OT žª,³åj® @‚*®õ^Í>zxJø00 .+p –Nzˆý.&À¶ô/ðÑízÞ“Ô¤Šë*E öÕ¸îÒ{}ñ"„škSÓ¼ï=Œn K÷[iá­ó(8™G‡¹Óx{‰LAÈ»[Éü½ ® ’]óÆm’«ú9\j•1֗а¨ ´ž6gè醸 ;\åbV?¼¤Yi¯êÌê§A0¬ÿxNUã㋞(ôï(9±Æg:¶©Ë¡Ù‘ÁÖiôI¹ë,5G®µü·­¼¶5yFà ³—ð¹•ùüƒu8çÑèSßs endstream endobj 3736 0 obj << /Length 1515 /Filter /FlateDecode >> stream xÚÅXÝoÛ6Ï_aôIjÖú´T`ÙÖ-²¡Hݧth‹¶¹H¤@IvóßïŽGÅ–-;n1`(PÑÇ;ò~÷ÍLGëÑtôáæ×ùÍ›÷I2ÊX–Éh¾ùÓ) £d4ó}–„Ùhž¼ûV}ýãöóø¯ù§7ï#ÿ€=Ì–NC8Ì2aˆL7Sw>p§Ü“0IY&Á h!É”R±\ÖÍxO§Þ/ô%^ãIpÊ4É☘ëÊž÷XýaFÑ0]±R~g†7R_!Rè%/ØR+%–ÜÊæ©/t7(eDÕµÔŠÕjÝl.]•kPj+XÍ˪¨¢è‰Å×ñÓŸ_ï†Ù×±µ;ݰzÝ7çûÛ»/ïγóª2úûߕ޽$•tŽ9kë>¼(Ö¨‘Kö¸Ëëë pµn n˜©ØJqEç±äBÕ%¯~€›¼\ä}ç¹W†//GtrÀ½õF®Ž“`8P·Â,ô‘Eç÷_߉ϼ…p†øT¼ì˼jÁ¯^zO×¹‚1fÉ“ÌævoïÛ4ö]õˆëŸB-ˆÙ̈ïÖ¬ÛR¨qxMÝ«$Çߣʂù) Ó”Ò‹ ‰kÑaåz˜D³`æÝªñ$ Cx‰7$uxbŽYìg=ÌçïH¼Ã¡ RD×E^ÅëZätu£ ÍFZBl€ yM®r’„B<ö½ÏW( ¹ò¢¶>j›KÐ /àÆ(é€[µ"Ê#BÃÒÐ{” ê²ÕV,å·i T:Š=DP¥ZÓzAœpdìxâ{âˆÙª-ñÇkhÃòãY1Ôf ËÒà(û:õÉnô5O¢Èšî3QcúDë\¬x[\ôúäù¢߃ù öŒ­÷±àuiLÞ†/t ´oy9o8Ñ v2Œï)Úik´ePÚ»#Ì2o%xÓBõhÐÖCÙÌ££c«ö:-…!ÜÙ) ÜÕRôMìJÖë O®(*M«yˆ{;w^àô!Á« ²éi—:EO~¯_ú9ßey2Cæ8IvJÁ w+@oó”KåR•â¶ZÛ0lzºÜ3mÝ÷käm%?cÉÔY2òîi£‚öÔÇq )µî4‡,¼––÷'8öwõ7ëƒÍÂt1øo0ÿÈà2ÊÙ>Ô&…àÉ?µ‡*ò¾`ùlm‡á°rÈvP‚ª}WÁb°:2Ge›„½ÚÛÎ)wÁ*×—˜Ä„\oÚÔWäÕ|#чIÉÛSbV‘Hç$Åž9;í™°aѧ½r¿­]?²†–ûùØ][€m©ˆR`™yK;Àoû@‘B–6ýñÌ4#UÒÔ+¹’+]äD¥^Ý jBâûÞ7k«<ìmÇP¥yÑ w‚+{°‚f‡=Ûžg5Z Z­ ½àÅà³°» ÀÄϳˆµEî„×e-̉ø‘„Y­©qQ躦Â/8†Ë‚`%{®µ’1F~ê}TD_ %̰¢ ¹Ý†›¦éµÞè¶p³ ^5⨂R>nÞI.-âþÐOÙOðR—•VB5õ=lÞiq4šéÕQƒ­!³D_=qÒù3:8µÑìúVFïÊ+žÄøÜ¦]êÁIꉴ|σ–K÷ÛÂw§¥¹t‚•fwymÉøç®º¤:;Ü:SaÌW­­hY +μ[ÚÝÉ\Ð&e‘¢éf¾Ð%"°‘†5ýàÆ‰ðÿÄòDÔe77ä¯Ý.½C2éRDf†ÁøPÏV­Zî'%õýÈ:væ‰Ó7wÁ_èn¨än“n¢Ùt,.8ºDøôqŽï’üyÐw°£Þ»‚³Á¾ôn~ó/½6ÓÒ endstream endobj 3745 0 obj << /Length 2329 /Filter /FlateDecode >> stream xÚíYÝoÛ8ï_áGˆU}ËÞÅ=´¸öÐC»X´îÝC÷°P$ÅæUuÕ4ýëo¾(KŽ’&ï‹ÑpH‡Ãß gè`uX«¼x½ñòm®vþ.‹²Õþf'Ù*C?‹w«}µúâEq²þÏþŸ/ßfÙdhœE~²KA ú8´Ÿ?¼ú¾D¾ûÂ"ÛÉÌMœ$4uåÀŒY@ë×.ýLÂ…z_6qåÞ±^o¢dëµëhë 'ü œ­WîÐ7üµ¦P­jܪ;øæž¦¡%΂Õxœæ¯HáÆÐ×R¹§ZÛYuR?FÖ)Òh”vËJê¶Wº-ÜË*ÏüÝ6ZmÀ¤»4åÍÖS¥« $úëM’o½÷…9à.â$õ¾­ÓÌ+š¡î¹mê~h,Ò ©„¼“65sвLakæÏX‡­ÑÓ";ïÝ Oùíóû÷¤b0×Ná‚AâõÏ/ÕAœÔÕ°ÃÀ+°w¢7oUë4Ü Ibê¦.-[×EÏdêé–YdGdôê‡ÌÁDŽtᆻÁ2Y@„ FèõHàþìÒ>þÒ ˜ÇÞ6L4hb$Ihcû+îIïíOEÓ€˜Ð¿„å Ðãç~'¼xS±çÓ¡< ê0Xîi§°& Öª¢eE · ï¼¾ÐÒº©÷aÅ|na•î$˜ïá¤Z¿R½}‚O]앚üÒÝçèÜVŽk˜`›;aö»ˆ´ÏIûü¬= p‚á(D@P»Oø†ŒbÌjÅJÓê̓¾x¨Aƒ®ä£ÿEQ„Oÿa¼z@o#zniŠÀ¾·82 7‰•¦£=´hl£‘º,:Ù’oªÁ©ÙŽ!‚݃9HÓ<MÑýXY`EMU0½hÚ({< _óW²&p!CtEIe ìÁ8Ÿ³ÎçHyp â–”6õ¡0•@T ž%ú:|ö‡Ò‚YÑþ·>aè¼nϳm²$:.…¿)òMÑ„ ü §«&ÀJŸïÀ=€ª¨‡~’;϶WC˜Œ!Ô©ok¹F€ÙÃ^…¤k Ç-€Ør=!xÀ=(XG™÷®å^@9ÍR-¹13ÉôD®J-‹Þøà«ÚÖÆ;«žÝLUbdÙ¸Ó®^–Íp’¡š™?™ì(w;BöÅŽÆC|âa¤~ÉYÔÖ×Rß1œ*ýØ©ŒÓ#ØrÈóß±CÖF´¡‹^NÁJ`²n±gK·ÇÍð}â€×ÏZ:$‹¶bBöX›0v÷ü%C!aéºïfÃ:õ ŒÕæ$?Åï53fmÔøŽÉ^ºF•ÊuõµóÞ~.T_Û‚<*çË>‡F_/‹Ü,¹úyÞ#7μ×ñÃ~ ñÄ lƒž™°m–$·ÿÖë o³‚`!]›V›“,³wãÎ9É‚’”SDâDu…)Nè Ü$ÔõÐÈÝ…Ò³†Å“>cgBÌa‚ð€Dè¿"•’E£`–.EÁ¨LÈ3ÃIþ…b”·híÁ¸@¬ äТö dèöŠÝOn ŠLÀ2zy tHqÖ%©Ê9ŽÀú‰ž›øY–K¤›>$-EFeïžë¼tºIͰŽí’6ëäâ©Üq‡©ÿ7(ƒ¾ƒ­ ”—Lî.CdĘvîÀÓ¡~ÕT¹A©‹‹ÜÚôK>k˜¤Å1d³¥ŠésB ¢ï‡S-=|G]Œs¹1NbÁŸù% íš/œÝ! \*™zGP˜Àë¸+áLS\f.B*  ¦ÊÌF­ºÑ°EPt¯‡ÔÌQMȶ±Ú¥qNvw¦€ƒ+9å`ÁËžíO­{­¶Lˆ®1Ê(.SƒË”C md%³Æ’…oNE¸>ý‘ŸÇ.ê†ûèÔí¥ç€ÿßh9<Ë9q>ÛAÈå:JÒ(ŒZH¸,FÎ.¹³/à # bΛ`$†ÍaŒøÓš•‹•D€•Äfô“òb³ cï_ëmâ2·æˆ4ŸQ’Bf€·²8*!åŠ\¤UËß$bÖÍæÀë Â<ѵ\ÀÏAò±vž²µ\ªFÉ(›êù1NDÕ>KøiÉ÷`”‹a3‹¯ØA°„DÿBqè9Ÿ1šWó0.»™×M¥®JéÕ’¦ (©«¿qñnñâ?<¦5ÉxQ—P²ý½„óë BI nN”X˜pRz”:@߈ƒ€³}üžq@ȵd ªAy\R “NñAmñž+dOà…]ÓR™9¥î-„KŸ ×7€\¥c½”ÊCL)!ï¹UGñxÁ‘ãSÁwQ|ñBƒÑ ‹P—ÕôÕ–ßïgR¿pb~ùe8•»EoÿD¡´µ¿±ŠûŸßPíË2f x¿ÊÍY»ûþüíÊ >L~¼·YÖü‰òh‡OÃ:¹L/F,ªéöš™øA°›˜ŒÎëûŸ¾}ò-oš+Ö™'k<Ù>°¯o ~äv§Ã‹ ¾}õþÓ›Ç}zæ‰ÀrO8,äéÕ:Š’ƒy¤c÷ÈSW>V¥Oƒô&†¹àO×'¤·„EªßC´EdÞë;U±q¯0虂gpÀÛæ¤S”DÁ7‰D¬(Ù7p釢(a¹ç$+ë o-Fw©žmßF•þ×Ûê'¿‘Ex¼Âš ŒÂHŠq©0w̢Дa<@z~&Ïd×ÐÕôšŽƒÛy¹hƒÁ?‡ð:ðÏi"ØI;º+ ÑqßüférÕø Ú¯(•ë”þ«rѸ·E[òƒqÂWQ»#¡Ðeú­v/ŽóâA¸0‚[uÏ™—Ïîûfÿâÿ£/˜+ endstream endobj 3749 0 obj << /Length 2296 /Filter /FlateDecode >> stream xÚYmsÛ¸þž_¡o¡f"IðM×igÜäÒËM’zçÚ™\§…$HÂEê@ÒNòë»o (‡¶±€Åb±Ø—gt4ÛÍ¢Ù?žüýêÉ/ó|¶ —y’Ï®¶³8ŠB•æ³"ŽÃ\-gW›ÙÇà]_xsq9ÿÏÕ/?¼Lã»Zæa)FŒ‰ÊéI$òý/ì*G»ª(iÛ"IÃ’·êz×WÚ…îngÚîLЭc‹<\–Él'á2‹YÀ¿ö¦Û7_€úA×ðoßè3 ®7ÍÇG[²<øÝ¬;Û·hr&ÒÖ¶³º²_D2*G¨3è»ã-³ŒõBÁI|²Ý!gžµÑ"—&v·GŽÕ|ÇäxÖó¤ö!襖ÁÕÞ¶¸”ëyÌ÷1n*‘»ÕmgÜ3˜*Xõ³ð¶,84mW}æ1\pBU°Ö¶¯€cYàÕyp0³kw{Ýñˆ R„~½a—y'ÆA‡—ú\ ߯¶®×2kû5®îeo˿릵µýÓ8‰;·gÎJ:Siñl1Ýì“«"xV!b).AÚ«ÙlýRãI|±ö+õáî¨~ò ÐYq ¼7¶#±Ëüat#?i[Ýw D€]ë œP¦Ax;ÀÏ2dˆð,TIÊ"6¦núx_b|\¤ Äà IžRàâ/¹Œ{d$в›ºß@swfÃ|ÍÊgĽ °0¸žsÀÇ–QD©àZD¹Â+ö®¶õŽÏjÈ=h˜áj#ëtÜ* š£87Y;SY#KZÈæ€*Häo6t®ßÀ• ³p­jÈE`u^à+ÛA¤ß`êuÓ»ÉÖ;4ˆR1C€JFI§(N)$=ÓíöÂ.±L¶ö$ÃÆÙ­I+XnmlÀxiš—èí4D¨qíÙ™pø¹™ÒSN‹$ù-Ré'&ÿ/ÿ”ÇÛÞy´,PÀæ ¸sMukCŒï5*umÙC E|>0Z^0Ÿ:´qSãeÊ,xa&­ºÕ}…XRDPËàå<ŽãàâõûŸB^øgMx#Òðp„üY I® £§=dÅ¢BjW?e"ØnϾ߰tÀz^¹Æ‹€]í-|¡‹)°P”Èó¿ýÓ ³0zT>¬6úþüM0ßÙèk‹î[ã$ Ž˜Š”Ù@¹Ù[£8]Ÿ|Ø"EI¦Ã’3oö‹@'í&;Hñé˜F ]¦§#ˆ¸3y}(#‚8¬ªË%Ç=PÎ)?ÃÁÀu=˜ÑUOY ó£ƒ0ƒ,¥+»½Â`ZãxÛdt±.ixBaË.gŠT‡e@= 3!ÒeÁïî¡`˜£Z”sì ãµ¥<•‰’æ)UL¦Ÿ®ƒóu8 WEAÚãšpJó÷¦ë4³\`GG8-ÓŒbxäÍŸ=è—Ñ•À¹ˆ>××Ê™ROp„3ßì}…„Õý²?N½0>‹!?äÐÞð”ñ\Éãê\¸u‰÷fŠšÌ••cc©l9N\¥4»8_å1[8¨þ;‚d jX%\€EÃ'J]!¹²ÿ·(‹|G@íO!9fjÞ1FÓ]¹ƒ˜›O_Î`(`|oÅÆeÇf`¤§ì X‡@8m}8JL \ù³Ð ŽûðÛ€7¹.-ØÍ(ç¿è3ÑVp&æ†Õä.óÁ Vþç<̤Rª[•’s–ØW§~3q ÍÅØÈK\Šó¥6ôkiÔéDoä‚à燬pS9ÀA5B=2ì¯á Ôîí¶»?ö‹ÉÐ’³Ð‡é8ô#ì3Æ[nªeñ ©¯°§©±[ø žÍ†B'RÜEÞC0`¼s–Úû»›üå¬!Ãʤ7Öòb²ôÑlôü»hhô¨îa1˜¥=:‡WGÛÏËr{?r¿3ØCP‹€ä`ùµ‡Éƒy`‘ÆýÁ8Ë£ ®luÒ”Žß›xöÚÊ`¶ñhþñî8IŸ¬tbww8*ÇøûÃñÚ¸ö¯¿6ž{@¥¾ã_*£¼hÇ Ä]*D“Oð›M{¿1¦Â…$®%ÀÑîósRˆÍ]ï¡RL­¼‚|iýË7Ôç« þAqÉsÁ*‚„ð{îeÜ'+èývjì2Œ•·ÔTãåE—eò¢‚n™`ëcßñpk´µõÐ-=ÃçC$·4Ô[Ó¦­|Ø)ÏË+B¸Ñîžøòó‘÷ŠFo?¼~ýfp€·“ü ?²…ŠÓ“-(Ïb5’EëXš.Ÿ_ð=V€øêù…Ô¥XœË{ [ÏÆî†Á0š8e£†wÛdơߛpccßcŒWÔ‹DAk:üÚŽ€¶ŽIR aÔEÞÖÈÞ¯Zßâ¢ÂY,]Mt:œfhDÄ/£7"kËìC÷8>@ÊÜþ‘8‹ I2 ktdÖÛ¦cVGl¨ jý´†0GÇšÖlòÂ_¦C9VCæ}mP8‚>(ô­xúª‚}dõˆ`Ã#$vÜåÆý¿sú¸0!Þâ+p„oJvži1.ü ¥^[5´øß˜°uÖxìÃÅàkíþ¨Ñ{¾ ì;‚¨1Ú²®Å¹®êѺ¶UÓ}ÆRŸ›¨œùi$è¨äµ¿Çkp¢2üФj&r w$,óc* “qšMD"6àøás£;}[3ÂY•!c ùð1¸û Þ,ΜéÒv|•Š;FcuŽÆø¥ÞP+Ê÷yM}oz§}(œ.bštœ.q9ó…yRð=~/ù…}ׯWÁÍqªRþÓð΀ jj}¿.´èŒÚÖÃcABS.N%ø Œöµí¡‹¼3[xäAßÜ>æ&oÖ¯êškû2 ^ãoY?#¼küȬZʃ_h‰ö?ʰ¶½ž¼Ñ8«6<»8Žÿg!ß‹ä#pIÿ*ÉNÿ*ÁUNX}Ý5DÅd·Ú‘ñÎÊ3ž_¸C»Mö6‹£³gÝZ\FI/–$î$ŠËI‹ýtõäÿÅ]ùW endstream endobj 3756 0 obj << /Length 935 /Filter /FlateDecode >> stream xÚ­VKoÛ8¾ûWé¡P±¤H½ŠæàÝ$E‹&È6ö^Üb!KL¢…dyõh’¿Ã‡lÊ‘œt±“æ¼¾~3¶î,l}šý¶˜½¿`ÄŠQxµ¸µƈ²À A­Ef­lÎÅ—÷A`¨Ò#Œ}p$•n’r[ðååg¡:Ã:¸g†Û¹^‡T™ž?JÛf`9µ‚ÇÈŠÀ8`pd¹$B! ”¯7o×ÇØ¾ªZµ©»ÍáŒ]‚Qì뤲¤M¾cŸl×eúWS&Eqÿɘî^eLª#~ë6j³¼œ_«]™lÕ¦Ò¢Û¼n4._-׿7/D”jÝ]á^¯ÖóT;;UËÞê:Èò²hþ³$£A×Å®r¼éŠvÞY^ ½×¨yÖ¥mÞWáT±)¤Æ=®¤ä­’ nxew¢Ž#&êf‚A1‰†Ô8ßd¸ÉÞdv¾˜ý3#`‰-²kߣ(fVZÎV?°• |#GÖƒÔ,-í2 ûº™ý1I^Õp‘ÙpPÖZÐÇ"äh/±a¹rƒˆaûÆq‰-õ—ú¡Ý[fÂb†pìÿJ* 2™ÌQD}ÍÞ¤u¾•—<ÖÆ‡sF´m mëióÊñ"ûaÓô™bó$‡÷ê_ÊE/ˆ][©5QK=j<Í¿cÊx¦N7´+ÅïZÉk%¨nÕ ujã2ÚŸ7iÑe0”ÛVTÉ Bv[ €´o`𝋡#*)P¦t &œŠÛ’›¤Qëƒã…`Y MíÁôUó jžvË&¹ã¯ŸšÓåßN4†˜Œïúöˆº2ŽŒ±ïËaÈ/æ_oεÂO^¯«fDÞ7Üd†º’óú®+ùÆ¡žÝ¦2¤ûqø2‘A7ù!Tþ2iëüQ_EÞ îQf·÷\Õ‰q£iÕI–µJi,‚‰Hp$D4Ò™õ¥=Љy€éê!¸¤1D]:Ä&kœ•æZORØÃÙëAí.ô(***µÔªš·ò¥’U‘MqPÀ[þààÛ{Ùd°›¨Âˆ=¥^®ÛYÞl yaO׸­«;xÝ4ÌuR¿¦ÙþtâÒìø™oã¼ÊSO„žG/µÆÿùÕô+C‚öЋ.ñhiF0 /TÊ…ÇèoçM“<éýç‚¡2ø\ç‰0P²Suròíj~¢¥Eò$xdJ$‰x uVe6¦Ñ³É7*ÇS>ïy’éŒ #Òî³âð:àqþñ/ÕÈ endstream endobj 3766 0 obj << /Length 912 /Filter /FlateDecode >> stream xÚµUËŽÛ6Ýû+„dC#†’ táb2E‚AÐÖžÕ$ Z¢m¶²4•dO&_ßKRòXÅqtcñqï¹çÜM‚u@‚ß'¿-&on¤ ¦x*c,V%3.ƒ„R,Ù4XäÁ=š«0NÑ>Œ¤CŠfeFUöðé]™ëÏá§Åû77œÝG,‚¡˜%övBºo“'–$ ‡h2‘˜&"ȶ“ûO$Èáò}WÓ4xt¦Û€¡„3XÁ|òçïôë$ñôX%X7)¦˜Š¸—´× £zæ@€ŒLB8ãÍ­dp #&ÔnÜ"E³0–Èâø­9 ëä &‚}N¯‡”HÒ§)óz®u“Õæ¡5U9ó,jPš¸³4©pÄëÂÂfÉUÚn92ÐG%?&YÔXý®oîµÖ£tFè¥géWë#¤Zþ­³ö*Œ!he ‡ô,§jV¯w[]†,Fms–Û78y's2<„Î|?h³ÞØD.Ã~«ÚW°9,wðhÚÍ ©ã°®Éܲi«Zç§$Ži`-°$Ò³¶©:ÏYXÎØpÊᨭ|´„ñ¢ïîì±6­>áå<¾:\¦8ôÿv.!NºöÉT¡¯U«ÎϹLû9ÏB#Ut3®ÊÜ/à˜"]¶º>yrÀÆgsŠy"ÎØsÊ0ëËù£coÓ€†¸W ‹ ¦> ²»YiÕîêÞΔþëÅÇ^|c³fÿZFœ3ônå/÷¡HÕF- {í0¦pÐù>Ô®±÷&×ù%Ø5¸­p­×¾¹òζ+}°'«Ùu8ÅS!¼&-¸mGÀ;Uîuf¨Ãq¡À@­•)›Öo´Ê,“ßu’¯ Àû‚s@jvEkÊõaëu -vÏ\J¿jl²ó宊&è9õ:Ç—¼f?ï…íGäÅãŠ1îßVË;fxJ½Ïë×ÞâZ¯dÃoæÌ·ºÝTù/cr±œåņeì9ŒTø¹m _ýçÃÝíí¨õ~ØD—9ª…9Ƕµ/sh ÓâåÓ7¬» l«\x×èù«Â”ZÕ¯F€1ÞmÍÀáfv;;jWصÛÀ|ñ×ÝW­³îY»ÄÜ!ã­ú<0§dÔxYTÙ?¸1_ô‰5!ã©1%) W3ç<ðc/üú2ëzY5 †žvÇÑHãõÍþb‚àiÿˆ¶»& endstream endobj 3779 0 obj << /Length 426 /Filter /FlateDecode >> stream xÚÕ–AOÂ0Çï|ŠbâjKYƒŒ`4èAæ =t[ÁiÇL[úé--JF2MHäÔfýýßëÛ{ÿeÌ׵˨v>lcЃ=Ú¢ šŒ$m :CJz JÁ¤Ù"ÝÓçèö|HéJhbÚ1,4N˜àWL³5ZC› &|wKYQ@ÌCÜuÒFã4jމ[s®_ŠÔí§…t›D0¥Ü5:d+äÄžž¸/Ù¤y£¹d±àwLËlU&."˜ò{a¸SÙ Ñ·(ñ¡"~å‰>³Ç;ú)gz!¹ru\¸åþq4òiêè´€jУ£‡ÇAilC'|nʬ†ÛÈ0g+Ǩ†ÚÇAI¹æUàoM‹˜Vâ·²¯ûøçÜÐK&Ô”|f4Û.˜6}„éÚ@•²¨w‘iT£ó"å.”?Vu‘Í9“õR‰á"Ï<Á°?ïÄŒ-ýÃØÆ¢HÞ Ê>ùÊù<››Ëa{fÅžŽìÓ-¹Œ U±àå¥1_H¦ÃLÌú¾’…~绣¶=ü×ÿxlD}ýü{|¯ƒ¨öˆ?3? endstream endobj 3680 0 obj << /Type /ObjStm /N 100 /First 974 /Length 1595 /Filter /FlateDecode >> stream xÚÕX]S[7}÷¯ÐcúP]­vW&3$)m¦i'éL[† .¡%6cL'ý÷=+5Øn¯í¸I0ººGÚÕîÙ]N¹¸à8åê$Ùq5â‰.†à(q±›ÇÂ.G¼.Ù&Ô “ ’“Üf²ÓÈ ŠÓTm¦ºDŠA .%TÈå`’*»mãJ®Š-¯êˆÈ@5a¤m]†Á¤@ Š’±;¤ˆåœMCÁ[¨‰µR«Íá­Š@Ql¢ÐSì(q´‘`”Ûä(6.ç`#+”AXIMluTñ‚3™I¢‰€Ž‘´Í%¹íB°“à(©‹ÊÉF„Q1¹+L Ìe dPe«˜ò“B †½ØŽ›úD³J³÷Íi#~˜M“È82Fj^1±8.77äˆÑD¬ÉŽkz§lJ5p6•ÍúÅ ™±K%›ƒ•$ˆ©Ìì„nVds´-ã‚‘¶9q"ÁdˆªÍ CÍØ@²š\JJ3 ¸#µ™EÀŽ@¦©§düÈJA²F(4œÑIM¨ Œ­`*̉˜ µ‘Ù˩⦔j1aZA@³CÆžš²îT3:F‘“™?ZB5X[Œr9AXÍÆ;'…Üæ2x 'š%ÓfM‘ÚÆ yl§‹ÇDm„3EâªÉ%ØÌ`˜szÎì’6fÂ#I3!0ݘÖO©13á­‘ s[ÚÛ5¶µÐ®¦<ØÙtÏÝ!­ê}×ýü˯ŽBðf;ÑìñçF×Gƒ'OþM…½ÊôÞx4u;;®Ûƒ«k¨7Ëö`ŽšnàÜ ®Ü<àx$¤·¯[Biذ{5Ÿ §îÐu¯žï¹îõðýÔÝÉzý×å/ŽÏ†ƒîäGÓ+KlëÝþðj|=9^ݤ”6÷ÃðÍùñÓñ{w0¹\ãO°@œÞ€³gGtÞ½ÖvtD—WÄ弡fÁ·†‚õ|Ú–‹A¾±f)we€sœgÙ}®Í9paŽs5®Æ¹nw4c·Ã›‚gú<Ûƒîéxòf8i»…£î»îE÷ (qG¦À)T¥z+#DÕGd,QòÁÄäcÈÀ\ŸL±g÷ò|ôG·»³Ó$t»§Óóñ¨;è~ÚaÞŒÏSð(u¿ûËãééø ;ØTôô+è7ëÁÊ+ÄÊ,øŸ$>£lõCÇH>p_4J•¯5ùô +Z@žÚ<ùFãÙ³[ËÓÛ ÷Àÿ‘„6Ç.KŸ;zIÂZÖ¼Rþ¼V¦ù"™‰VãÜL²~×ôiíî&™‹Sò‰í!žÐº)±ÖÆ"/Ô\ûg®·ÓéåÕã®;;Ÿ¾½>ñ§ãwÝ÷×gÃÉËã“nïÅô냿™É^«&X¤¿Šªy뙣Âùm¥D/,[S³±ŽVhHîï(¢·¬³¥Dˆ‡ \ØŒ¡‘0´nÀÐ|ËвCIØ'ܳ,Îqr•°ØÅÁSÕ\ñîô|4^u×ïŽ/×g'£gª¸Xï„‹‚~‡íTѬAÎãÉûó?ýxrÖŸ\uT@Ÿ¦§‡ÄŒ«ž¸¤˜0îœ[A34 éËCGôr}©œ¼Ý ·T|ÖfóÁËú-N¬ý˜¶QR[ÿ´iþ´,ë§®®h\–§®AíZT/NÔîÒDÁmµ5¢h©Š“ÀèíÙ>MÁ¢–Év›í\÷íøõØÁôöù–œÜ’ì´ºZ `D4YIZ¨x²ÞQ’Ú]e¹qVF ÖR/úñöYo³ú1#:Ï"áõY$ôE?*‹’øbþC,lß ‘‚XEèäbýŸXd7\T:Êí"9ÉŒâ\ ù¤©·"[I.ë¡. BîIå¹ä)e…™ß]¤kÆEšú¢‘NêÆ5écD”.ÈË*ëRWI6º Ù¤ŠË3SO´bo⺴ {ͽÁÖO.ìI¡r=ÁQ—õF Ñ¡"÷Ô5ÂòÞmeù­f¶Z›viíÒ´K«Ð.-¢]Nðß–ÐZè‡V+ú¢­QIÚ- · í€Ù2ÚˆŽêcêkmÖì#Égw—È ÊaÞ æòÉï¶>HA endstream endobj 3784 0 obj << /Length 2000 /Filter /FlateDecode >> stream xÚÙnã6ð}¿Âo‘µV·åÇIŠÝ.õ¶»} -ÚV£Ã•¨ûõ‹²+WaÀäœáÜ3”7ÙN¼É¯~Y~øt•$“…»H‚d²ÜL|ÏsÃ(™Ì}ßMÂÅd™M¾;_תÐʨéßËß>]Eþ!\$nê…@ŽŽá}ðä8 NÏìñY0‡Å‘ΛmWêjŽiПŽ@.r›NfþÂâ” Õ«ôÚ03£ªÜú£èýÛçk™ZíÉtc5ï–9(å%5Îzu \„Ä0n&1ü¼—è¹—¦Q|?ayÂAwÈfg„ávWwEÆG!¨€Šf`­‹B,П>¨upÍÛ=¾Ý¹qWoðø?À—á/b_÷NÜVȈx³AÌÙ€ •h·  )±Ôoƒ³«ÃZ¦xaTåÕ–ámSw{öƒÞLgàsƒ¸Dåµk±óY”ª¹E’rz,;FÝHºæ˜5?74¨@žÞœ¨þ;]HEÝx¥õÛ²n$ö3Ða^´ïvÙ²Îtáv­~åVtØopjy 4 E^i‰TKIªº`¸–õ­®t£ŠNþÄ´Ü£Žâ¥œ h©ÎÛ¶®Àõ#*½U&¿Cc«¼ªŸ·r™«³œM#VN ðD",¯+°| ©ãËÞÐò®j䨳zÆò–Q6i f(¼8Œß9r}&‹ªÊŽRÂÜ8Èyön“±Ü®Ì_©¿h°›>‰Ì!p*!ûñd]w}r˜Ç”\¬Ós¨7 -9°• ‰«©ïûÎùï_/f?„‰5'Îæô1Ô0s¥±³ê̳¦R©K0.T?ª˜è´ðÈYÞ ¯ß.¥nlØËȇ2ªxì#6ÓÜšéÝêÏj—Êô²â_;}h;¬ ˆ|H1äŽ67»ïHÎÀT+èÞ¸£|¬ÑÈfWÓoý_fH!n©ÞÀÌg…Õ)ñ®ôE§$¾`l´ ­®©x‰ý &tOÆsë¯@r¹Yß(@~£ïѱR»1œûñºÝ_«êYÏÜé¼%ôÀVÖ­5ÏYO0ÁºBqj¤zã Ï <8­ ¯SR¡ƒù9RxØcˆ’PRô)ÃâÀů‘³m ñ1ÖÝPw%þ¯¤“Œb㘧¶ÆÅP¯i-ä ÕÍ™TƒXÔªÅOú‡ø¸¦·|Óíu?$æa¨êj&‰a„çCä~|ê|§ÝnèÄÞûÛ±UQ¯oÝ6ÿùJ¬«}y‰C80‹¥nÀÒ¨ŽqŽãÁ與ÞL”(UÐ’âhc/£ÞøH)¹ÜwF*J'>)¥ãºZ7Z±ºƒhŽbCkäMä¥RáÊ#­ô¸èiw{¿uW()}DÍEc 68Ër<ù‹éër´Ù®Iâëº5o4[ä&Ad wå²·BN6|ó³D ½¼;ûN“bwVyÕÚ7ÓýÔ 9¡ªìŒ]/ày]°qÔ>ŠgPRä2¶Ëí2wn¥ïÜÐ/Ђ#­ÁÐ"ïwú;ݬê×Ú9ê.rh7ÙEäÙ ¯‘}S+%,olµ¼ÛÃì}˜G2NÛú¥Þêê•F^ƒ®ý0QµÇ/ý¾8?ý(‚Ÿ1‚Ô]Dâg#-ó3<ô_@N>ÕÌ‚$†L‡Z¼GŸ9뺑N°ÚòJo¸¿!Uk[å°/Ƙ‚ÆŸ…ÁC(ã ò` Gº)uS<òÞ­Ü_1¨äÆÃcy,H±“½ßå”4v ¹È³1բȗ2ë[éº+9QÃdXý$»Àˆ’ÜåSòNê,q݈°[º}qÞ åY§Š–ü#‚,éùÏ%§T·ò>à’¤y¹–zGúÞÉâ¡ÿgØj˜-yèbTÇ)äèrO;æ¯KBn§Ÿ­‹¨‚ºc€RŒâ^KPkËDÉÊb¶G²uk)ýeGŸm8U1B_,AœõÍO@é¿01Œ—àxh²ºÏ±Q-žA!Ï ÛÁ°oLi‚6”u.Zæòˆ<¬«ÃFÛ­Lya.>P¦Ü$-Úê1ã/›_a"MWâs¼arÂûí¡Ðv„-Õ„-½(êcÎX½ÇP…ìäôN&Hù¯2(š…`e±ÙëhD¶^c­{á<Ë!¶ˆí(ÇÀåƒ…è• +#¢ÓúPkl™êJZ¹!oødk pU“ñF¦ïr¨S”À/ߌ‰2tžá7ÌãGç„0ì…¿ÏK*Mmìw\[«Û)§*û1„>öÞçðNMî—ËÿŒÔþ endstream endobj 3792 0 obj << /Length 747 /Filter /FlateDecode >> stream xÚÝVËŽ›0Ýç+,Í¢ À¢‹©ÚL5ª*µIg“΂'¡‚8DùýÚØÉ!Ì£š.ºòMì{ï9ÇæØ¬דóÉå”bÁˆûÌ—# å Àry ŽO‘{7¿¹œrÞZJXC¨BÍ¢Yçbê†Ä‰“Z–•Θ Ûèó|ò0Á*D{ð€@B(HŠÉâTMÞ5…`ß,-U0JTœƒÙäû±^4DÂ6Œ WÔ8c…¼qŸ¢µ’#9×¢v=ÂB'+â•0a•¸ ;ªŒþ8ËV±a’”@†/!iÈÐ]á(‚>f†Ì'Q%e¶­3¹épyäÔÝÙx8‚±Zr„É©°J 1¶ˆõÀxº’¯+QSég¥ A€Ž@joÏ/ļÿ-’ú½ë1„¡úë>ª–ça“Ö ^>¦U[Y›œfÀ¶Ä2KwI烓ë¬ÕàL.÷'S'P,–‹ ³`FÌXˆz-SÛ^–&Hò¸²Ê¤{ìÔì;«y[)¥Mž¥b&†ÒS0u®"ÆþJÛ·ã3¿úQÄÛFç­ùÜfU¶+nñÿ²?–ÿÖ|Κ‹­sU®v…ظÄwêjÔdž0 çú‡\x4ðçjcPÞ+°Üi²š?jiÆÕÁ9•'`'qסG×4Zʢ߯¯XIhoY%Ê8:îktV?Ôz4M·jwEÚÅ(ëµ(MØ ×S iõ8¡uUí¢£x˜Vk¶mJK+Ér—ç&R–)ó]s;Šõ…Žþ= ‹hXÓ£Õ¡¢ÍÝ¡0½‘¹4ÆUÒ»ö%[­;d¶é]¹MwåeìÝôô©þ*õ‘Ù›N¥Pš ‘š}OÎ à9€[7âj[wâ5ﳟ›\š±å^]zÔï9ë'ßd}æ }°ÓG†íƒOÀ´8XHbKï¾ùL¬´I)âúðÉî³z}†=yÛló¾z|þCPé endstream endobj 3807 0 obj << /Length 1189 /Filter /FlateDecode >> stream xÚÕWKoÜ6¾ï¯’C) bô¤¤=¸v\À(P×»mN²–»«F­(Õi}g8”,ÙêÚ)šCO’3ÃùæÅ‘kí-×úaõýfõöR+å©ð…µÙYžëò Vìy\©µÙZ·l7­¼ÊrÛOاu×fHÜÛ7Wo/Co"¤‚'nºµœzÈ´rÍuï6«ßW®å7‰8æn[yµºýèZ[8¼²à(M¬{ÍZY!‡¨¶´Ö«ŸG}¿N˜Láx.`¢.wýpGC¹ŸYÞH'â·N„.;oªcßIÛ ¢„¡ êZ;òë-•ãªÑ{Rá^ÌT±¯‹n곬ÖÉõmË~cžúÑ—øð† á¾Ë/"¼Råmq슦ž}= ¢—XŽ—ð IŒ»F$Yï ²ësDêLš¾ÜÚv^L›úI Ì8€À£Ñ©Z?[õrkt*œ4'BÄïÅøØƒ)ÛÂöàÂZAÎë‹äç¬*jùr f9vÒ-ÙL^ÝÑ!땤 O‚aRâé¼§4o€¤ž`G0ðU“)07*ôÛ.ÍâBvYQª!=_†ò¡DOB 0ö7åŒ÷AØ)®y‘uC˜I(ý»OWf¢Ýûù`Ê÷t •ëqú  R £c ¶±HLÚn% +5Ñû=5¤'•£[·§¸Ð^5÷دiO-®l×a-èkûºÆa[K,xšøË]wþŸ·8ô¤!‰O;ίvj&üñ—q£]¢Ll)ÍòÐT¢±©<Ûýz(ûV'蓌|¡E?UmAw¿ÇÐõm÷—,ÁÿÜß¡qÜ endstream endobj 3824 0 obj << /Length 1333 /Filter /FlateDecode >> stream xÚÍWKoÛF¾ëWÈ¡$Ò|‹,zqÓºH»i¬ôâÅšZÉLùPw—–òï;³³”I™²e8‡B€¸œÝy3;ô­µå[¿Í~^ÌÎ.âÀʽ< Sk±²ß÷¢8µæAà¥Qn-–ÖÆ¡óeñáì"MG£8öü AúÐõ»…“Eö¹”Ì 3û›[TLJä›ùFèŠÜ^‚Î9œ;n„’*ÙŽØžðó2Kà+-?iáÙБÌrƒÌ‹²ŒÄ~`Å?×J°íǪUb§ÄÁÊ /žåÿu1ûwhÞ`¿4Ƚ$ͬ¢žÝ|ñ­%l~ÑQžY[}´¶bñ<Ž`]Y׳?&Ü&iä[à{)¤-õC/öñÇØOÇ=Íì7nž½¸Ã@'r^¶NØK^åÝ^ĤsIŽúó—8GNÄHKR89ȉ_¸,D¹QeÛL¦þ­IÖ.ÅAh\r‡Ú'$µ·Ž›¤öW^("”Ÿ‘Íèµ>8Ïš%-6L°š+.Ìy©ZÁÖFÑJ´õ^%â_°F®ZQ{Ž›f¡ýÞ(+XCÜ`E8·9z§!xy’õä 2Š"[µøŒË ìªè*¦8Q>bmq&$H\–ËŽU’^A5l8°ni½æ —Þ^%¢:, U/QuÌû«ã6ÊÓ¡zÚÁ ÅJ 6’ˆ¬ªh¡z¡eƒ‘`:›š°j;U½g¸úDŸPÓ7šC£ü°¯Žõ¶C¾ß‚ª8¶·¥º#¥|•<•‚‘Å:ž:¿:'w…>ê]¥LÌÛÕ‹\Œv“'$â;L¼lnjü³DàM÷ÄG…òT7|ó‚ãûöuDOÀ÷]»¤µ†.öäìb|ÀÝhgìݾ M±M²$ â÷¼’ù‰¿ƒ¿ ÏQf§M|S±‚×¼Qÿ_Òi_´ªŸ\zÞ³ªãFÆ“9?ëœs"(,ùdîå|N‚vO×Ì<„Š>o¦"¡Q>ŽÆ3v™AÁj: ¸—$îãpܲ-»â[ª6ˆªî•|KÝ­Æ×N*Ú¾Õ]Ü”iÙôµkÚ§dµcŠ K.è“£ƒF˵Ðû*’¢Õ)IûÓÉSû‘g''áf*ÎöÔɰ[“ï­¾Nèâ3ìQxiÔ\è`¦!E€ÈiUSH@í»£ ‹†tºMáâ2wš±9]´Úfö`ìtPMo¸†ÉëU°âLu‚{L)QÞvŠËg€uzNF‚#Ì[á @ï½§q/ÔàèAò€ÃÁ ê£àUõ} F‰ßÝZá¢*7'ÚÏíªÔUgx…jŠÂ Ûâ_Kºä ÿ‰² t2ìâèp_ÃBáâîˆ ¹1=˜rõ­lÖD§bŽZ; =óáVÍvD¹w ¥± X;¥!ÛpÃ{* tiî³~<ë“Ї~Ô¦0jÆÆýèQ¥ÿÞ˜fe»È¾ï;‹}¬á£áïE t÷V@×եǞ³0•W„°84™é{(ØÃ0‰tÚû}¤y'˜2ÌÃé zÄÌpÄlLÂ"ûóå{Ú„ M”;£…r6лä+ÓÙÑœ”ÎOŒxÝbß:µuðÀO£Œ=Lú¯/9Fó:¡ìZ‘èõ ºì‡|ƒª×·®š/KÖü `zÞ´K}–4Rša£Sÿ=# ]…}5°¾Âhª"ëÇŸNPSlðݯ­€-nœ+Z¬húˆ‘/¶þ®xºu Óç´ý‡“AõôÅ8}ËÁ·øcö endstream endobj 3840 0 obj << /Length 1535 /Filter /FlateDecode >> stream xÚÍ]oÛ6ðÝ¿Bh&‘"‰ú öÒµM±+ÚÅÛÜ` -ÚV+K®H%Kýîx”,'râ :øÁäñxßw¼“g­-Ïz7ùi69¿Œc+s³8ˆ­ÙÊò=Ïeal%¾ïÆ,³f¹5·¯^Ϧ)³^ÉUÝl§×³_Î/Cpe±›z ˆê AÈiâ>€°Ý 2ºôN¨©Ã€¯rZH‚„Z ÙÖðع(i_ñ­¬,‡ú©åø©ËÒt¯’†žÝÙ–JâÆ·y#ŠtsZ.¦AbßѺ¨ UðÒÜl+ºU¯ŒðsS«Ahù›–#È1w"?EîCczn˜¿ºÉECUM /Ó µ…Ø´×iÇ_‰F›(;àÍ,ŠHu©^¬7x̰TtŽBÐ-ª+¦¾-*:5¥ týÀþsÓoµn¾ÕÚ µ¡ÕV4k°ÅÈ¡êx B¾’’ß!Ô MÛŸÅ„}[žå(´ÕFHa˜ÔZd¸§8ÐKôáˆÖÅv§¯Ôâ•ÖÝ•1 »7¢”ãÆÀ¡,km*äÇö×V4wd 8) ¼—QÒÉbMœÆûGç î‰á>à·DÊ^­{Q 0õ ¢Œ˜Ä…‰Æ„´'bÐÂ'Fx „w°È³[)VmI÷nudè‹à~`L?{û_‹‚þÐÿJÇ]Ùï!j%.`—øv[•ÅŠRÍ»‚,‚œ<9ïYahð£‰hŸ+ÄXß}\3‚ç@½óðò²ÞîJÈT³;ð B´_àêÞ×®;£³ªVl„.p¹ ¯ƒ¢‹%0ˆÜ ‰Iñ×àŠ8é¢;®!ÝS,¼‡Ú«´¥Zý¡žÊs«õëZGÞöz#‹ËPc䊫#\ñè‘r2 Âmªª~’âã5 ö5L±ŠG I°¼®DšÐ)°ÍsÊ_XSj£sÀ¾9–¼À¢úSÀ?(íe­Ÿ2?£'ÿ‘.ŠBZ%^`ÿ¼¯BYL†Ó)m¸á±;a³•h¸ÒÏ&lÆÏxCÆžñ0 ò>®®D ¬i}Ã\Ïõz# ­d0|×?£¤¡Š§S±B7Üè'ÕÄÂo‹Ò$oU½åëb %øŽ@Ÿ<vdž$¤¸%ˆqQÁ÷ñ-犟’§WBPо*e=š='¸Ï©„ÈŽ%ãm='ˆŽÝ{J·s¬ròˆì*Aj¥@,{©—e>Ñzù¢Øóì÷XôpíÉEïdœlzVƒ×§ªÞÕ ý¬ÐF7{¸D.n)¬Ìåa4Þg±[l—Ix{JB‡7äþµO^äíÑ`çw„H?=Têm•ã…¡nO]ù®vHÿ;Œt>·_\_'s}ĖΘ§2öXâË,zÕh±­õ›ŒË~¹O“:„CÌç”ú ûÜþ¡¯ÈC(r;ûúú˜}¿ ]LŒ\ÔGã—ÙÉŒþOÖÖ1—œ¦“·³É׉¯Ë­ßÏÞ—ºQ–YËíd~íY9q¨©u«Q·VïYâ¼]ZW“G«©ðŸ°U ©ŸùnÔ?1GŸÝ8;^S/?ˆf…ÍbÃ$Ør©šiã3‘pz³Z¤Û¥¦I/¾ql^Ž«î'™&ÉsT'Ño~ÄܬSñ˦ØõìŸÙ~ ¶@[È `NãøÇ ]€>7¯–‘Š/ P’8@RUIm ëþÿõgZ,ë–æ*I$[yl~ X¬mmˆ^\ÜH5ÞƒYŒ9òÕN^œŸ¯±m»paê8— Òg^òÅù€"Æ¥;ÖXÎ6ص2±+ùRÏë&ˇÝ>`¾7.oöNò :(ÿ f_UþZwQŠK˜VÚFÈC)´¯ i â?àÕ}ÒÀÈRø¤f× ã[>åŒIõc7ÒÂo)ë¶-¾áËJ "ÂÀ7Ý È‹¢ª·úãî†8pO/ðûîð¥6œô·2=üu*àb4¼!Ûþë³ endstream endobj 3853 0 obj << /Length 586 /Filter /FlateDecode >> stream xÚíVM›0½çW ÝC©L 6$TêaÛ&•ª¨‡†œ²=8`²© nm'jþ} „o@‰öÐSh`<ïÍÃÈÙ:Èù:øÆsâ9D¡:qæx&¡3ñ<qäÄ©³ú„Œ~ÆßÆó0l…‚CT-?Ç£)JZ¨Lȼ Ð)IBZH·ºþÄ8qM°RtË,XŸ5tÓvÍSCä Ï…4E<£‰Í/–è÷#7@hÆç•Y “ëcˆ<¯†=>Ö!_XF÷\×K\Ûœé‘~hpf8Qt¦«B¢ª++¬)£ƒ!aœÕZvžJ–1ÉŠ„ɹH¯kúX›ï«Åžæ H„”&+ì󅉬fÉŠ²eÅš õ¦véžrÈÕ{ót¥¬ì@åŽn8;à°€¸/ß%P@¿X`pV ÙÖÕmäT³BCJ5½­53q•PάèùÓb9ë OL&o{7 ßý³j[›?)·ÎU¤.oþZgE"ø¥×lCùŒ1*ÍéËx;AMÒ5t¥!ãô ìþCwƒ¢PLä,òxmŠa³†f ?‚yͰeÅ«Uì¨b,…½²çé2õHÐÝ“ñ*¾—ÝhMåv;ÔàšÙºSßgÍNÍ W‚<Á-\W§ïêK!×Ã'¥è± Ó—¸»Äý‰sL0î×9âTš³Î\oØHUë¼%U-o½“¶Ü‘´åî ¹äh)ÞeùwÕ»ªz?t³xðfP­b endstream endobj 3858 0 obj << /Length 605 /Filter /FlateDecode >> stream xÚíVÁrÚ0½ór(ÌÄ‹Œlc=¤è´CsΉr¶ td«• _Ù2Ä{Â¥“rðH–ÞÛ]­žß99_:ŸâÎ`†ÎÆá0tâµã!Ø‘çAˆÇNœ:‹ÞüsÜpO\®¹ÈúËøÛ`ê{5‡!¬ƒ–„¡ ªòhtTC»x•pëE/2¤››¾ Ô›c3fT=ñÔÌuZ3I‘Ò0µ‹r÷CUZ=™.ŸîQM¤Fr\}øqœ<ø ‚P‚± 㫟4Q·åöY]19˜ò?š¡ûp×µ±¡Áæô”xÈIFm’®¤Û˜@Ð54O(hd<¥ÌbÞ?ÎfÄ”CÂ…Ð…Ã.ÛZœøáqÒÈÑi“V?¨¥0¹Mw„ÁšµÓo¯”U5aOÄ–¬=Ñ ·ˆ¸-ß%QìA=YdpW‚â èFåÕ ” aöEMïfóIk¿i®¨¸®Õ Ûþ-¾?)tèÊßB“gk/O8»\5â\,Je-—à 0*†[¸2عöúö›Â›ÍmøföRÁš‘=·ûÑÝ›užð\R±§ÑŒ‹Ã•MTK!ž³èK† ÍÏ„Øz’ÒvÒn¿çû‘çÍ"¢bÅÏð—Ñ«¶@kkŠÆ9C¬Mò{äW-ÊâËùN”Ø>¿WV=)̈RâÝèþ+£cDiã‚”(ò&Îè"á3Û©Û£â‚T •=ö]¯÷âjµýš«ÕV&mgôC¿îŒ¯Äð/c¼Ø_½üw÷»ÖýN?Çqwþ/ÿ»' endstream endobj 3862 0 obj << /Length 2049 /Filter /FlateDecode >> stream xÚ¥YKÛ6¾çW¹¬ Čޒä¦I‘"I‹¬ƒÒ"%ÚV+‰.Ey»ýõá²ì•½vz)RÃy~3C¹“õÄüôä‡Å“çïBo2góØ'‹ÕÄs]„ñ$ñ<óÉ¢˜|uü0žþ±øùù»8l ¢¹i„ô¦Û7‹i82kÚ•5~ðÄ5çÀ!áàË™ýtæ'ð2 ¯åº«y3 |GµŸ?\:ä9̼9óÜ”‰åŸðÙ<ò‰Ä¯’Ï~wƒP)²Gªƒ‰S‹é ­É+š£¤m·Ýê·B’-aÔT÷ãŒ@'bý­«Ë²§NÖí*SÆCh¾›‚Gg²Ì–'­ÌÂ(qÞ¯hy+Å ij…x QÈ®,xñ özèñõ• _ÌSPU[]V™é®Ìh 6:Œ`´q~ÛK£‚ è±ÏT³qagÙŽqúéˇÈh;]‹LâHm8 4/ òrc—Äv”\ÛEõ¼°f4R^N¸pŒ¼+[Žç'¡Ór58„WÖ ãúþ¦%ŸëÄÖ:& ¬·tx™ÞÎÇô¬÷ãAd‚åBJÀ@füítx#Ž~ë2Ϫ—Äp¹¢çâ3úà—·4C‡/ø*ë*…>øŒÞ¶Jô‚š#-”}ùøÞh¨lN‚"±j¿Ê 7ˆeíã=á>_s ÒúsÏÑ/ºE]j?ã®#VøôœÐLS×o• 'L=§[¶Y½E¸ãôönƒ¯ùÉê MÊfMëŸ~€g׼ѱ CÔ> Ñd€B8…ĆX§ÎV;Z´ŠA#TRVUc±©O´†! êgäŠÔ­‰Ò¥F8,‘ý̲IÓ‡Q`ða”_o€u‘ <"qèÇçƒëh×½ ]Za _µ¼¢j ^« mð hÒ,ÜÓ Y†ô扉é¥ýÀ@è½ÐadëŠJ!ž Î ´iäßí÷Õ.wLm®Uý'¨ßd™£ÚÝÁrTéàÆf"ð¹V»?ïÕŽC«vï3 næÿäœ*sc“‘h°FŸ=T«Bµo`ÃFTd[½ •: ®Ðuȼ0ìuÝ2%˜äá®ÕñaPà!Âà\C3<÷u(ÎrQuuct„²p¶fãuBà:[.sÞ(V—}‚>Ì?(8ÑÒ˜O+ ñЩ1¥C®#±È“‹¦0àÓˆf4:T9˜ã_nô¾/p®OõºVTLkálúó±Œ7¾;l{öqÖçБª=8Wµ‡¶bí;ª\à¤ÇLSÍ÷õ~öÚÔm[§®É÷Pà´P°ðG:—Çk[Æhb†­}m<à¶kJuTï©Ðy7õ<ÏyýáöíE]ÌQéå—4e‰–ÃpyF>ðAÌ·YC“¹§DCò)¿X0c²¼*· Øõ#Fó“¡Ÿ‚×F?ÌuôûS™: ª(¤Ñk»hîÐqú•Žax"4(§IG1CŒ›fíßK`·y¸T ?¨ÑLÂ;Þ©ƒ` kŒ­îJHGzd ñÊÎLšÚªÅS¬Ì…†îH=°Ë®UlUe;!/°KË à|n_“ÄyºóŸž’5ôL£7ÞPj`߈â@O×UýSVÿ*Êobµ‚ŠîõQ†àÀ朦öŠhûPLœ&3ZwgMq²›Ä\uÿ¶eÛŠC.>C'uêÖCõáíí ¢‡'®ï“ˆ=Íá€÷œoíÞJ¤Á¥¤Ï+-d¯–Ëg5¯…¼¿6ï ñ\Q¨YyFӆ禮ï‚é²+«Â¥®Çq°ê â?[šÙf#X·e˜_’¼›šX!ºÊ|£E™U¨ ç¥L¬Ð˜ä§|U*”f C3({˜nB^2·ó’¼â»óŰÜJ]Ï–z#<üc¥ +Þã=ÍÜŒB%„¿Î¨}YòM€–®yáÙBÍ5LÇ¡)ÀŽºSÆN/\Ã0»Ò·©¶…"š ]PD_„˜Z èAÖH¢ÑJç(H¾•¦ªëòrYVP=Póƒ«GYÕ‹(œS/ŒlïêGέV l¦‡:àS¨d¤ý Ó:¨”îªQøú ÁåR<¦¦ðaA)^®Ö[Y EÐR_â½2´ÝkÞ·#6½o 2¸º»?/F¤«dsŸmó«½H¨yÝÃõV£’~³á£¿†·ä¢>Œ}×Fö›ÏŸ^ß\såÅ5Èî£w|F(/%'Å1  …ƒåD=g¶Q÷ðʆäÉʆÜiÿaBÕ—°aŠ)Yeú؆£ÈP«íEöRž7·o7£?ŠÞ.žü³yã< endstream endobj 3873 0 obj << /Length 1632 /Filter /FlateDecode >> stream xÚÍ]sÔ6ð=¿Âøf8ãÙgÓöÚÂІ’¤} £Øº;Ù>,9Gþ}wµò}Å>’ òbKÚí÷®|gáøÎË“çg'O^$‰“yY&ÎÙÜ |ß‹XâÌ‚ÀK¢Ì9+œ ÷ô׳÷BuR«Édz?ž¼`ÁE”%^êGÀÏà†l†H'¾½°Ùö´GŸ†38Œˆè7¡y)ÕáƒÝë‚Ô™)È–ét2Xæ>£_-Ö¸H]®Ÿ„3÷šÎ?ø±_ˆ9^óJô ÐáVðNãÈ-k‚®—e> Swùt2e³®# ¤;"]̼éêA]¸–¶+½œæMÛŠ\‹‚.8ój²¡Ç›€ÇFdnø¦àŽ,ŽIår³ÔœDÃÐ )é|É Ztu9oÚŠ6J|éD—õ‚ð 1 ÜÕd¸zùèû IÐâi#.˜€}‰€ëaå³Ð-ÏêåuU9h4®7™Æ©?fD²àš˜pˆ$Ž˜+›E° 90ZƒF‹PÇ­ùͶ·:ÈÆ“ PUÎ¥ðŽHô‘û¹ Þª¦¦Z¡Ê¢ãRÑvÞ6­ôRÐâƒ1m% Ü·Ïé´j&#à&ÙcžñËÆm%¬ššKy½% )œ RL´Ä9ry]pMÐè«ä9·¨>åÚ@?ÅѶ©ÇÃd¾M–Në;‚áÙ6+ZY'*Ú‰¯+X+4KÓôiM ÓV/¹ c¯ ˆr´¦”X;Ó4v_ÕC¡eêf ¥&z½ Ë©´-º¿ pr®¤ké%¢–,ˆV’Øáp¥Kfâ¹uŠN†B×ò¹4…U˜@DTñ5—]aŒP*ІùR éCõì‘Nö4üF£”Æ S¯™Óo“\5ù ‡v•x`ñmÄ"^Åk;ãàn¯PXŒËN™ZAKòšv[¿$Oi™÷)€NæÊîšZxV­½¹ç²0ñßrùk’è²wê²m5Ê÷Tt­‘Ö x Œñôn:X— ¸âôÃÙoÈ%Ìq‚ô…!7£"å,lÍÅ’—}5‹ÅÈ’øÇº ÎFX.òÆ´`Öb•³óÏa÷æ•¢ê?,}2:y‘ýf:ŒÕíxÓ϶àB¾i G:ñÑî«àÁ°Ã6Ã%mànnÜ•ìÔ‡ šú¡¥ì'SWµe7VfÇ‘ãA<³aÛÝ3©šÁ@öáë{©Óâ––ïMx§GÞ,V¼±l¸p[ð-x“R ¡?mÍïËÛNÌŸ¶a¾aþûÙÉ—“Àp6OGæ‡^Å$¯N.>úN@ˆK/ÊRgmP+‡AŒÎ¾¥szòç€UwÞ§û¦ |/`Hð²,zŸî¨žd{Ú$óÝ—fr‰SSÌ¢ÄPáˆfÐðÄÌ鯮ƒÿgP'̤=¬v4 ½4Ëî¢6©Çžß ½,býëXåm¹ÒeSß§˜¾ëÌÃ0Šú†vçšöFfazâLœÛaß>=îqñÖàG¯5!6áVé\ñ…Iæ†Mvk¬…Í%JÅ.†—´çyý¤%9Œ¼,¸5‘Ùü<¥ÿUßCø<|HðÓˆþ•Ð˦ µ)˜¸È%47²É,Úï[}4T?QÀ7 ¾:ÈIƇ# *Ù|Û@‡Šµb%y.*QëEÓø>šþï^ݤÓçÕʘÓ,¡ßÛóׯ,—ßÏ ñw7Ãp<ܨAÐkþD˜um endstream endobj 3788 0 obj << /Type /ObjStm /N 100 /First 976 /Length 1604 /Filter /FlateDecode >> stream xÚÝY]o[7 }÷¯Ðãö¢+Q")A~ ûÀIºyð· êÙ…ítí¿ß¡§Nœ´×‰Ó­{±yå#êˆ")ò:iI.¸¤%º« 숳 ⨶u)³ äRð‘‹Tªc(ÀHrBÅi'šÈNÉWv*6»Š+±¨+ÜFŠ«¡TWm…‚§Zƒ  R6‰ •6–@‘Ä”HJ6&`µð±TÉ‘2ÆrR§Œ¡lôJ(.2U“*$µµÀ% E“°˜ˆš„Å4ÒS.6í%•ˆ-—Ü´˜TM %G!Ú\@(Š­†GJÁèÅâ(ç&U˜U ¬±` 2©Í ØÚ¨),OÍ8… ¤£»b‹xd±±Ú&€EHF%Á4¡ØŒp´’°bTÅ `"›aÆ$±„_Sl3ðh–´p5¢fMm†ATL——›8G˜ÛÀ•„52¼!‘™ ;…:3UNû¶SË’@ Á¸™ñafÍÜl‹CÏÒl ÇÉÂm–jËfà4Ûi`ŬÅf$Œµ½†ºÚ6£qhçË1|Ĥ©­Áꘌ@axk’6Wç`s8ðØ‚ƒ`i§K6} 5ƒÃÛØ\c˜»\KJlG$îŸm5ü ©±×àË™©€5SÁ6‚³·_Rã K Œ÷£¦BNj£¢P\›b…âZm‚AC¶ Z ÅChjL4ØÛtGß\÷røf4èžO'‹Ñd1·èÍôƒAw0šO/f§£ù2¢Ûد£³óá³éw0 vH•NP2Ãl9-O'“)´/3†ÜÉàÉ“µe`Ð^ü±hÏ¿œOÞºgÓÙÙhÖ”‡“îÇî§îùqlÆçtáŽU_áÆœ£góK_@™™<~î©ÛÛsÝ¡ë~˜M]÷Â}wðzâçïÆç‹ï8\Òx]ˤvàºW¿ýŽ„â¼K){†ý&ãñÉàBCKe/ˆ¥~hbö [^CïÃôò><ƦMÛG´ÔpõñPVH‡qiT¨è^Φ§‡#˜gùbßuG£‹›ÖÞ8äJ›‡\Ãv‡¼¾Û·0ä:øÊšpžéqÐ)y\Nÿc0Eû‚Y£ï‹Mœ½%Æ~hŠÅçÜ÷T¢_õÎ`¸æÿ×#ã“ÿã—vÇÐmq¢¸š3J º(v«÷ ”åf X!Ò;P®?¹¾zÂ÷£ ‘T©þ'Љ¼jO°åþÊ}U£âñ0yOt, /í ÎäÅ{ä÷¯éÒ´yÁ[­·•K¯]ðVПVÏ^ e%Ô]Þý¨å=ŠM‘ì­dCí#<œ|ÉwÞû?Oß.fÿ_ާ×îÿÝPÉŪK*¨E*ůÍ%··¶5³gmå¶·rš)ù$z'§óùðãîhXqc­ òÙZ Ð1B¡ís¤;i>?š 'ó×ÓÙ_7ë3ëšúgKÚ¦>»«WÑGA£îóŒ÷›C£ÔR’žè\*ìÝWwªê™S_tBÌÕ¾h²›/¦{”wÔÚ7óNrq›¹8•ûçb —™—â¥x%ÈJÐ6dw4cÈÊhÀì#NÑå[‰³lö»IË9ß\b{åÄàÄwrÞÆó=p6œÿéwGÇšSn J]œVŽÈÈÉÞ s„Ç6Ð:Ás3êŠäœ|®_íŽ¸ä ®M•+¹ÚsêÏ¢E}ª[\ëà/_·¢îø¬=Ñœpôšz¢3’•”¾¼)oïB»¼Ù•} hAžâî^­\OðU¹–ûWïÊÖs?Çû·–L[ÄÃ:ø³ñð°+s'—$—[ %0”ö3ÔÖÛNv+›¯æìýò½w+[¼š»~D·X Ÿn¿ý ´šÞLÚ7˜Êf!%«jIVM­¬šÚËýµ7÷»ïnsŠ8K6¸‹Úß#>|¦Á}?ße[›Š‡]‘ ÀÞþ*ú‰7£…?¸ûÙh~~v1ÏwØV†ê‰>Ù…Jh/{¾Dét:›AA£u:½€—ìÐLhuÅþÚ¡ˆ›`&õÙþ,Lä#§ÏÕuðÏ‹ñ.¹$Di”+*ÉÌR*·WUºÍ-¢´MUušÉþ·‘žèŒ[>öG‡eKòè$Ùg‰ß>úö_á endstream endobj 3893 0 obj << /Length 1241 /Filter /FlateDecode >> stream xÚVKsÛ6¾ëWp’CÉ‹!>=¸nÜI'ÍLm¹=89P$!¡H… åñ¿ï.”I™~õ„Åcw¿}bgãγ߳—!s2?‹yì,Ö _„±“0æÇ"s+çÖåaê}[üùá2ŽOoçìÑ%Éô0g#IJ˜÷`؃$ÆSmD=r½ˆC ðÆÈÇKÈYI¹°Ú¦]"˜Ïƒô-.!ÓÉigÂg‘ À¿K]4jo@ý²¾°Ÿj™ÁèÚ[›u¸Y÷n„'é… Uø›! r££Ü Ó¬Ù¶BÁTÇyÑÔZ? %½;ÃÐý4*g;ZK¹­÷¶¦‹º1 ÍŒÐ÷Ö>ØÈ³<~PØ ”=E Àç¿æ»¹ÑùF>;±¾rr}²º±Õ·!¯»ŽÆ]Û÷Ù”k«‡ÜÌè<‚ñóxøµ?ç'$d³4å4x¼¸ºù8ùx}Xû¯…&lg>aõ£¸_¡+ý5oˆê endstream endobj 3902 0 obj << /Length 1318 /Filter /FlateDecode >> stream xÚ•WYoã6~÷¯²•€XÖ}íCÚ‹-ŠôˆwQ ›Ú¦mîêð’rÒô×w†CÙ’£xc0 ‡ß\IÏZ[žõëèçÙh2M+wó$H¬ÙÊò=Ï £ÄJ}ßMÂÜš-­{ûŽ|Ñ|¨œ ³¾–¬u5u²Ðæ¬ÙI®bçaöÛdùM÷ã bߢ¿Ž<³'ˆE1Ï)ŒBÚêZ®w%¯œ0°Õ[wÜ‚ž¬ <³Æ~æ†YFŠêùÀìB5ÇÛ¡ ‚ÔþÅÆaÚõ ÛÈV|vš¹¹3ŽcªceYß?vs߸­Z÷œ"€Û]‰Þ…àŸË>–w|T9cß–ØW4ßÔ$'9lSŒ)ÅžO£Š5*VrØ"ñíZRûˆ(ÁíXCL<­ÑÏ4¬*¤%W$øÙ‹½º2ÚVírΨpc”ü ⾑•uI½§èJkë¡ÝîŠm±ÒÄͳ,õÝ<ŽÉÒfÃÉGhfR°yafÚ踧7Þ+í¸ï‘Ëy­øiFèÀ?¥ ª¡€•&xðÇÖÔÿ~ÐÚtõ¸rߘQ>n}ÅBÔ.§Eðs3KâZêþýbg]»öTTËOÆeÓ·ll»˜Ù_Ò®be˜¡¯SdH󅨆¤Ä#­UݼpSA@!:ÈŠ›¦”ƒ«Úç‰-jwJTkê¢áƒ9 ß^ðÂK3@jŸ-¤U/;Õ€³ÝƒÀ׊¾¨-™¾Ÿ½0âË–¬wëMãÞ,S@ ~’R“F„s8»ÌUà“ƒŠ?+¿Ìñݲ>X‡DkN,¨:T‘ðR£Mé'™´¿ù—•Û‚Ÿ¾žôH eI´Ç™ºaî“®w<ϾJÓHƒ«½=ð£! #‡‡¶¢R ÃÌÒ“Xعӗ–÷¬a4Þ²ÅW:“¼§*€»ŒÞ„6ªœ¹85Nm]PìĽ–øÅ„%Œ3|Óè‰þ`ÈtÐ'~ ô™§çø„lÞµ~è¹^’´÷µbÛæõ¹gÌI;> stream xÚµVIoÓL¾çWÌÑ–êa{!Þ*˜Œ{zŠX _Ü»jò¥ðï;AìC—(¢fPn%C <¸ÏߦQþ"µ¿Ù68ݹË}4¶È |ìÇCûín53öïÀ”$NÎ:~î~XÜp®7E!ò2  çÀ5µOU9 °¾ÿz~Q-jO§;ô¼šï•ýšëU~[(ÓFLˆ»”ÙVœ¬ŒvÔi` Ñ(ª+ÛßP*p&Ù°ºº.}°*5L¯öNu¹SµQþsU-Ÿo;2ía‘X9pþ £äHÎ@¸!ŒÜ7-ôz×Ç„Ÿª»™µ:¯ȳÒÚˆbš]Òy†f¼Ty…ïCh¹Æë¢¶–ÎþØž¯šµ¯ï{‹ZšÂ¹_÷þöqÙ1àýlŠd‚E2¬eßÔ×Än1¾”à¿­èØT4´®S‹º›4‡o`ÚÑ'í18s¥o”ð0sß¼?¾ú‘µß¢0»¡dŒú–¼†¨æ]¡ývÚhé©×²ÞN'ÿO(X#ˆþÞ–8‹qJš•“ëïÍãóL¢Ÿ–µD1Tysx/ÐåäóÞ¹èV²Áh¤ ¸ YœÄ¼¿ÜØ¥kg¿Ùr‰ÈÊ4 n„³s£Q&бLL˜©&¯§îc q©Í³ËšDšqgl,Á›u“ Ç?Å=Î ñÈf Ë(¦Ò·Ë7ª™éÕz'W÷$ÄøŠèÂi/ìK$ÝS"Íc– 'Þ`ǃü¤;,ßÙaÅÉ;ì“ïš;Þ‚Üú>ñ endstream endobj 3920 0 obj << /Length 1055 /Filter /FlateDecode >> stream xÚÕVKoã6¾ûWèH—oIè©mš¢{Xt7n÷ìAkÓ¶Z[J$y³é¯ïC)–_qÐP)‘3óÍë#Y´ŒXôÓäûéä͵1QNs#L4]Dœ1*•‰RΩ‘y4G·äÆv?W±ÈHg—MÑ•uuUtEüiúö͵â;Ò·‰äJ+"tÌ w&,˜‚jg'‹‘—D ß5ËíÆV±¤kGrû#èÉvñfQÂ3šr…ŠêÏ¿ÛY·oyŒQ¥"Ÿ¶àJœH)A(N´!Ç$³1fn¨Èšª¶è¶mÏ[“¬½Ûn\üÀ¼mÌ.ܨÈÂB´@UœpÒ¸y‹ÿ»÷5ÌT8_Ô .–ã„\‚›#î¢m‹§ó˜µÇ\lì.Pé%cXyÂÏß¶µÁ‘:x¶¡c¸ð£µkˆö뀱ÍçlO®ƒþK ®M*¼Š%Î/O3¥ô¼Eã,ö쌆ôÝC¸ì¢¿mºˆÕ=ÊÖ6Ý%%ø[œR¬·öU=„?øÓ´ 'ZÐÍ¢fõÓ~ßú†Z<ïlÝÌå9¡sª˜üw)](A{fŒ÷Û¢êʵ=Ïå:.¿öõ\̻͑•Eò4ø/ß0^¥t!åLÿ3”ÎóœfŠÿ=Jù¡öÍñŵ3”Ÿ¯ (.ÀSß:è-üÁ–2{®hŠY‡×9ãn?œa'-)ñ*/€.vË¢™—Õ?Ûz¬¸¡q¢´$7]3lx¶nZ Ø÷$º ÷ì4#e‹ccïáÂjyÍñg ŽÃ…½cR}E¹œ<–=ç­pÃì^ü[ÀG ¢„ûµØÜ¯Ýá#sF8Û“;×käÌé9xýq#‰¨ÂU •¥CÎ$*ƒÑ+N—‹­Räc¹^¢D•Cäèó)\¿‹?(Û3jw›öªâùT¨ê*ùÓ6õ˜æT—FÂjÿëûAß«îb0ÛvõbŽýÝ#ÿ@/´ð_oRqú endstream endobj 3936 0 obj << /Length 769 /Filter /FlateDecode >> stream xÚ½UMoœ0½ó+|«‘‚ã/À¤§4M*õR5»êe“oJK¬šŸßÁö’…²«¤ÑJ‹=ߌßSt(úä}Xz§W’¡„$Ðr¥DÈÅŒ‘H$h™£æ!÷o—ŸO¯¢hÏuÊB†zÛ¤ÝE]Ué&²2mÛÞÛ£î8Aîm£(à1Ì„}ÞÜo+½ñÇÝxßô qÔ>R(á ·²mW¯×Ó“Ù°ŒyŒ—ßµ!ÌŽ*„uuÿ•¸Û6k)6>Wƒ=µÆÇmjÍE©§‡©qš ÒT±E—§]z[8Âfü-žÚápf¹ÉÕnc\f©^ÛKU?èË&®jßü$Âi¹Õ³¥Ÿ’cRò-œãmå3¬›"KK ©Ñ[ë°ãÖ¥]QoˆûY@u{×I…fÀ,ŠË§´z(õqòŒnIA°Hî2b dÙX­îH«u~CC*9ü³>ª¹LJ’Ðéa¡»¯²Ø;Z±Ø‹»Âït5²>²×xŸøAH)nM~ýIì ô鬌öðv½Ë¥÷è1@JT,cAâ(FYå­n)Êa’!"Qè§q­¡ÇRÀ¸D ïëÁÂÙV1 ”$~È0$ñî2l3˜íQ2æ»Ô1(TfŸÍ$íìüb0Ÿ˜ ‰„€¯HÌ& gz¤ ¡Ìõ£ºÍšâÁpôÏ%‘¸Bôc…ë;¸²ÿÐYg «Š~˜ÚÑJ«-ñ…$N! ·Åæ¾ÔA¦ËÒ.è§~CëÕÐ0¼®;¸~?2(\ÕC—ë.-Êöd`7v; ×ÒÖé´0é39´#Pqfšö¬ì¦-üˆBÍ=Ú ¯ë+ÖVéË)Í‘GcÚ¶—ø¼lëˆéííÃ9;;ÈåYJò8&ÿ[jØcïîDqLÍ+Î…x‘ð¸Làâ#<Î8Ù=©»+È`y.ž‹gž›Ù ³åóÛc˜­ ³çÞª· 7{sv¦Ïô tøøx endstream endobj 3952 0 obj << /Length 919 /Filter /FlateDecode >> stream xÚ¥VMsÚ0½ó+t´g°*Y¶±=$MèL'Óiít&ÍAáhblj‰–ä×WŸ„¯n‡ƒ…ýv÷½]íJ”½ËqïÝ0Ë@‹,ÎÀx0B$` 3R€ñÜ#¶l©?²9 ïÇŸÞ ¼aBŠ æˆ(‡§DƒzÈŸ÷~õ°Z"€×î³A !`2ïÝÝ#0U?õ©ÈÁƒD1$ÚmF½¯k»O£!É75`3E1Ks§ñA ks¥¿Ø°½‹ÒÙÊ“^¶õvþÕ+h ¦sùÞ>>»¹é{wëd> stream xÚíWÉnÔ0¾÷)"8ˆŽÇY%z˜Š‚!±r'nj&GŽ+Ržo’!I•[5;þ—ïßíñÂñ—'«ƒ£!t2ÅAì¬Îèû…±“@b”9«ÜùêQè}_½:zÇ=V!ÃP*ÒLÈ%ÇbuA¶D1øC¤=©B‘[‰]PANðzSpvÙ¸c–±û±€©Ž@#½äÅå–T \Ñ ¢¸¿îEU)‚)@ijIÌý$ô³üuAâž¶‚cOf¹5æxKáú]ÁÌù™·R—옚†äf/ŒCé@¯&ýS*H0²Qj ­° †¹‡“j¯:¡i· „±ûÙ¸€=èÊZ€®µø‹Y°ÌµuA©Ó¬ ýM$w3W¸Êü8ê\PÕp{vRSN$1ÈÒ@‚ ‹öÙš^õ] û®h­z«|™udÑ!ô2²Å´šm”ÈŠyW21Šx]ä”ufCH}ƒT"U¡¯%ï0m¡;&z-]ošy¼ ™Â£kOöÀ¦¹h7Šæ]TKÛ[ºÑº f[LÀMmÊJV“ÏÛõ˜Ù”zîõäø‰m½,vqyIFÌþ}°7X¬µEQËJ¼^¿kS™œQäþ$kq“y÷(¹¹Ë²aóNþ@êpõi¶ï¯~bìšÉi‹·uIægî õ©T‡zPfsÿØ\> stream xÚWYoã6~÷¯òbÝÐ}H7›E‹tnœ§tQ0e««Ã%åýõáP²”(Φ)Îýqf8vŒáŸ¿¬g—Qd¤vy‘±. ×ql?ˆŒØuíÈOunÜš×ßW^bò.Ãe»²\ó‚­\³Ã[}[ÿvv¸#%~ىム%î…!2-m¸#î(@nËÅny1ú$T•w‚‰§?ÐÙlvUÛy°uQè°\ÇNCí]^¬,ß÷ÍŸ-ZsÖ1»¬æ(üH‡hM+jêã~á&p= öH|½-åÊ R×,öM¦´À—cî1B‰j²„ÆIeòÕ¼Û¶+ ÎrÍØµ´æ-r>4’Õ»ŠÓÙ¶Ü€FÕÖ,Øä¸)aSóF‚iVi[ ¾âVÆ«Š¬|ýr>ä– ¹’óüq'¸”Ê龩B ̇-êÍÐç-³¾Ûly¥Kù¡ì¶Ä.3° ö®¬Ê…t!}ULløÁŠä´u-Œ¯ÈB|½ÐNíâd 7w13•¹¨C~bõ(4RÕÂ'ˆ´wó¬;€‰IÉž¨ ?èb¼¹º:õAäå„~Î<³TŽñÜ~ià„h'³r*sò †¡\ñ{.µë¬dIÕMSÂeÔ'ôÌè»gÂnà%šzPie¶ÔÚfiÅ~e7•½<¿ºþ42çSÇ]ÏŸ'c²›:”o>þÎ:Q>Σ®ÜµrêÈúëͼgÝ*àÇnÕ¶UÆÖ8o4}7~+ÏÅfźò=³“GÓút¦D}>«¸“VÄPˆçTt×|/XGÅŠÏvš¨À~9í4`üà{Ž à¨ÅÐC‹À‡­ r9BsÊ^YqœB¯-ؾêð<0Uß:á­¶eC$h>ýü†ÇœvÝVoò±&¦ ÆdÂ+Ìx_qd§‰÷¼Î‚ À&§aA‡ª½„b<†‹5h¡£kþÇ.$Ið]‡[Yvå½Yé €Žo¸ ƒV¯ŒD3§-‰e]+ΪË%éåYY<ÑX‡ 6%"ûÁð=ê­´AÌ¢†OLÀfÿ$á^ÛôUé›WGpë!Üú¯јVí§ÑâÔZ…zýîËœçø"%©‚¬ë]ƒ`8‰ çà„3×L¨+ÓË…O#î´ žvU`zz.D[Sf`–°ñ[ø> stream xÚíYKo7¾ëWðØ^¸ä<øŒyÀm5ì hkä ØÛÆ­-² $ÿ¾ßPŠ!Û2¼R$¤‡\ìÙÝœ‡g(.…]p\Š8Iö_]%üÏÑE.ðD)àÁž´½4° êDŠ£@Ù Þæ”œJá „bÓÕìÛ|5º”1º†èJ05¸ÊÙ„âbX «‹Äjʪ©Wó‹ÂÁ$”Ó Jdï¤ÔæÍ.¦#2ŒM© ÀÄHx—ÕDH¥ù#øSÍ¡áb0jdHR¡3Q€ƒ9Cˆí£B*Ù¤äˆØ„ )W{I̱³#æ†QRÁ;2©fSeD#mb‚Öb¡¨e¶" ¬’YGPVs›@ÁåOB2Ç £9F˜<.ÜÁx'JæöÕ(í+C£6Kl]r ÔÂ2‹ k›Û;¬iŒ¶XxAhMªN(˜¡žò(cÝ„ÚtpV Ã$LÂÍ3ad¬ÈXl¤J{…ìQjs }4›j¶ä‹6‰b’ܢĒ’l)¤: XXÇN£Ú5 ‰“‘vJbÑQ“ª™®ê”Ù£ÈC¶hUÍHÍODA¥ÅS1±òµ" ª- ðSS Y"H-d Êr° :²šŽ¹¶–ëÒF@G)Mæ3¯¸b¥ d:ªK‹0ÂçDµ}l6dzBj Ÿ“K ‡Í#ÙB…IJæx”Ø6'œNÙV½ÂÁ„<Œº×î›—°§]÷Ûï`k϶µ“xÙMn./ßž?­âK©CÑ¡ú{î §“¹;8pÝ!"dÞ·a‡X\Û5Ëq¶K—ÅÕ—Éö/uf#$£=aúîh6=;éçîÔuG¯]÷¦ÿ8w·šß|ú·Ç‡ñ_ý¨{+úÉüÚØÅ˜îxÔ÷×Ó›ÙY½ ¥öî—þübürúѼ°È•ÞAÑx†ÑÆ‹©W#QW"Qk D&ñZeMØêš°%®ž†‚±{|-CÑœ±Ú ¢½ ƒúê@4Qñ”ôHnÜI‡»‰²š« p/mV3eÛÜ0ò»Ÿvhl”Ý‹ÉdŠÙN‡›ÙÓ·¥°ðëž!mȨ;¹y?oÏ?_Lþu/§³ó~ÖÔ…wÝÝOÝ«ÓØÌÂ3ø†ƃ÷Œo<¨•}4v¬ÙkÀ^´ðž¸î‡é›©Ãò|wüçÄ^LÎߎgã÷—ýa?žßÌúëï-j;1ŠCölFiñ¬-¡x;4=|%£ˆÁd Q„‘9sòbõ ©çT¶¶ÊÞŠ™Áp|KU½Ñù04Î-_tèÜ’vÐõ@4«—0ÔÔKÞÎÅ} £÷ušlÍ1®áˆºõùa¥èðäY?<ëÐ(u¼•ëÃÐØÇÞ*Þ} )‘·’z Ú6n­[ ¦ƒdw«j7¹AáanIJõùa=ÄO‹˜œ‡¥T*ØúoíœE˜éQ <éofãùÒ‹u“¼­åí4êr_IöƒŽÕÇX¢%³×Á`«{d¨“Lv€5›Ìh?è½56ÃÐÆÕ,åÇÕœîGôc[ïG^ÖsÖ>/ú,ðn ;;´Q‘³/Ö Sôb bŸˆŸØª¿¾ÿ“ì®vŠzRÂÉa—‚ºÎªM&~x1Ïž-žüñùøúƒ?»_ï²âD1W°®±X…iÝsAªs+8„Ó× Wäâí‹ ûL¶GP£Ç¼Q¸^M¯®Æ“óÇ¢Öö#ë<¼ ~š‡×¢)ùÀ4­­¥¬ÑƬv}²4YñY¢Y³?Ê(ÇSÝ+YH¢#"B‘vY#Ýí¸wBʺ¦ÉÖM¶­à}R–eom7„;¤`.à\ô’Ĥ™ …óH;l€Ç«¥£éå§e£xt9Ý!­Hо]Ì.íÑ{¨±çõÅÕ}[Zé&}«®ë[³zeÞš«Ï1}CC?Mí@´Ø­¥Ð•êã×Ò+ì¹5)æ5¤˜¿€ÓN¹ðs¨v†â@O [F‘ªõñ»³ù‡þª@:yÒÉq}MA™¢…ì¢oèÜ\ÐȬûÁc=ÚJ¼¢_x©}çðÝÅOµ¬¹¢Êu³dZõ½lrEUÖ]Q…êíWÕ[ôôÀ endstream endobj 3991 0 obj << /Length 1309 /Filter /FlateDecode >> stream xÚµW[oÛ6~÷¯ÐÀÈäPw©}ÊÚuX]cìa^V0­p•%‡¤’¦¿~‡<¤#;Ž“D¼Ÿû÷¯õˆ÷ãìûÅìô]yUXåqî-V^DH˜¤¹WDQ˜'•·h¼¥gùübñþô]žOŽ.ƒ$*ªØ?ßPÅi÷Óš¶,¨;*¥><#V†û‚ r*¨ô‚¸€i‚2$cÍν=Å–AVÄ…6’$÷7ó .ýArÅoæ0b¸Ìû9œQ¬eVƒ¨+{ÄÈ1£a¥¿Åý– }3¬qÜëWǵ~îd>¾Xø-ë™ jáˆtÒæh)œÓÕÕ`겑i:Mp[ñ[=þœW¹O»‘=Ñ\DeX%^¶18g##ª7@¡f™ÿ/ø7o¹º²EàRþ°+ª¨­¦¹÷¯ýâ§g·öˆtõQ&Öï?,f׳Ô&^´EÐ >©J¯^Ï–Äk`ó½GÌÒ­9ºöRŠ"M`Üyç³ßø€ìÀôzF$ÌÁAÉC’YŸœw¼açìútW»Å•¤ÄâFVº›ó,ò¯qåþ‰ƒÆ¥UW½Ä84"=À5i‡y£o™¬ß(>ô_’[(tΰµjÌ1ñle>ÍlH ¤0WÀkj4ÀêÕ (&ði$Ò‰ØtTé‹GS?q‘Ôa–<–S3ëa ï©z °2B\Á?U_®Tèʸ{Z_ÿ´Ëˆ…ÇhRRfŠØBô2âIÍÁP\ãºËÀ¡«ÚÈúk7ì:Ünug`i@Ô²&/DÀ&|\mE×/Dþ —#íCë1й±UÓzniýó$An¯Ø>flùR2åö÷² XĶ2§Í=Ó" íQ²#j£ZîR¼na·÷Lƒö)µ$[Ã'ìñ‘=#Ä€ÎqñíYб¾Õ0¬ç{Œ©—0FȘzŽ˜­GÆ3æ«­öƒ¥V'RïD>‚ùÝk$©žÁSwo­M§{=»4yĶjÙº„]¡Ý抚&r<{ÛÒ­™ÐFÇ»I\[ ]7èõ[£Pƒ«—6€z ÌwÔý %L˜k¡.qâÿMbr0ÂÀ;ÅV߈ 5H£Œhƒ?áSoÊHÑB¬ðcÏÿ³¤Áç³à¯ û%Auñí‡o â¢gÒšËúY©dè@ÃsÇ¥c|Û^½Tb¬u‹eÏè·Y×Ñž £œü£„geHÒÿ™­ã”„±hùÄϦŒï2öF“õý ¸úæ8kÇqæä+±vTa}Ö~§{)×4c5š1Ey'¿s˨t}c{]c©šÖ¹Îqý;pÑÜéaé‰ÖsÃ?dërÒZþzy%ó¨Ñ :뀿óé3´Øgש>¯^=óG·ûB:ü 6ñþ endstream endobj 4003 0 obj << /Length 899 /Filter /FlateDecode >> stream xÚ•VKoã6¾ûWéEV\RJ>ô°E’‹ h§=¤‹‚–iY$ª"'ýõ>œJ w« ¾¾o8óÍXCÔ~\ý°Y}¼¦4X£5Mh°Ùc”f4(A4]›]pÞL5¬ý¹*ú²ùüñ:#Jº¦¨Ä)4à$/4h…ÝW›Õß+Só´ÈQ†IPu«û/8ØÁáçŽÖep2Ð.ÈÀƒ"ÓfÛàvõË‹½×£‰!+§1Œ(¸Hó.K½1¼Ð!þõ„{çe†Ãߢ˜„<²¶ù‡Gqš¡¢œ„ƈÞ(ê=JÅǦ¯íšõ;;áOè±\ÊFô–½cŠ!s±_Œ¢$ËÞ£‡;ó䎒aœÛ¸/¹¬ÆfPÚ“iÜÿÅ?K&)ƒ˜”(Ë=²ÅYZ„̤2;ìy¤u9jÉF®÷h(F{¶kàv®¸]Õ£8F/½ú瘣Eq‘çg5eP®î;ÞGI* Hr>°#$#†#ç Ü%Eø¨Ñ`„ÐbÐkS†:è,EØt¬6S {LÙÍ“&jÓzQ‰¶å•â;p,/²ð÷¨LCÇf­–<ŒB“MìœE'Öµa€"#·ºé3[`Ã.›î|hš:íRwÙ`ãÔº¤iî}¥3)í’žÆlšÍe°Â‘˜* 5 ±ÕÔ’zÖÙòÕø‘uÜ(!ÆäþçÓòŠum$áÂ}î¤ÖÒWTž"+—™. £…F§s=Äö/HÌ_~Me¡í3¤ ãð{;ütwsóÁ'ìÞ&G.C›’Yˆ…âyUÄÚáÀfò ´¬XËgè‹Vœ ¯(Õ(†zóëݕ׼4U3µ«¿W^ìçƒÏ'ªŸe†ª£ûý\O~4{Z‚>‡ÉÛV¢CSZø©å‰ú §Ò5xñÝåUr™PdžWü¶õ§È_S¬âê+¯?ÝÜú…oÙ–·ïÁ"iÒ„ Qê¯À4M§C£¸¿^,g+ž–Íȇž÷àÉÒÄtÛ¦çË\”ÑøêU ð|ñRÞþãL¾‰Ë3y›`§Ž<°aîV⯩FñÀ—ÔyÓCÇ×›G¾PÇ@ÐmzÕìŸ2ÎpË[–¸å ùøWÐsÐk:fž‹ìë7ÄŸ’×ÐàsýìõM†{º€y 8£IŠÖdÖC\[=·‘7^_ÿRÆ, endstream endobj 4010 0 obj << /Length 510 /Filter /FlateDecode >> stream xÚíVËnÛ0¼û+õ’£‡EG‡RÄ.PAÑ(§¶((eõh(Q é&é×—z¸0kº–ѽô  g–ÜÝ> stream xÚ­Y[oܶ~ϯX¤Ö^E÷Kó”É9-‚´hÜö!9@i-׫–+)"7Žûë;JK)Z_ŠÃ9$‡ÃùæF:Xݬ‚Õž}wõìÅ›,[•~™EÙêj· ƒÀ“l•‡¡ŸÅåêj»úà½ï„©…úYµfý¿«_¼IBgI\f~ÄÀ&Gi‰“žv˜8³7ÃôM”1æE¯ú›ãA6ë8òŒž,Ÿ]áÊ[¬6aáÇEÁŒÚë?eeæ¸â~Ø$y”{¯Ö›8޽÷òØ ƒíÖ®7iê-1p· `ÇÔϲœw¼éÛcç_ßÝ¿gŒ{¾ÉÛ¶;þ¤þVÁTëÐkÕñÐp×´<‹¶à¦Ù[§E×ë¨ðîž ñN sì¥~´ÄIÀ'AÄ ÁráJŠ£Ÿk}ªþ[úëM–ÆÞÏ}‹Ò}®·v¢„ÖÀ£ç®UŸ€(?ý2a¯/QÊUžùeÁ1B¿LS>FÓVÀë[³÷ïSÂf䪰æRÄÍCŠH–¡³H$ÌŽ¥§ µ]PhÐuàGƒ4Ðð'|nU«5EQ[ çÊ´¨ã0däà ËÛô¹IâГ¢B¥ï¡¡ÙƒÖ;Vi³ÕL%|á+üF^ çÝ‚¿Âv¦6|¸\ ­ü¼ð®öµæé˜.pòÝY4…Ò¨¸$!8sOrGðG×Í"Rì±à¢•A3ÂáÖ~‚@Ò×Ïý¼‡ê8,˜ò: ÆínPÒ˜AÒ9aáˆk™ÈªþĉÜ–è¸"üøÅªG¨¸ùËWƒ—%¹wÝË[Ùû°«_7»ö^ˆ=Ðm’¤Þww6 È8*siÅ ÚVÄ¢¾i´Yÿç"¾PÝ^Üo|QDa4°ýó¨ÍÌèÛNT£¥œüÈ™qÍ&ùÆ„Æ*”ý“Μ@¬6S ¬'Ún/-Ùgd#ý'xŸQW€û#Îøý¾e "2{aDÛ ö@$£³?W oÁþž¿x¾¯ñKþO3è°Jtºc… µýVöÝÉTxÖ=2ÅýÏù«çâî,t V ü\CN¼?ÐÁQ)p3±6=Õ»{´'›WÕ·Ý#‚Ú÷8m§…>͇“‰T…C-ìŸê¨™ÞÚñŽ"K[sÜÒ'6FnÁÆÒ°°6dø€ÇØrgæ³0üæÕÛ÷¯Š¡Ž …§÷¬f9ÄËþFaðÂAj‹#4!Þ$yBXXg~ ”(R”ç¡ÇEÛ틱ÄC"ìøëäò»¢CqsG).0ÈV°WC²Ý¼$Þ]¨¡hĉNU‰14H½[n$å4âK}À½Ž&È/„"]“Û—6Ó¸+†Mòú ½ Ð ¾ƒUwªj·c(\ŒhªÍÂýÀw3h%ö‹0|*ºB)F6ÍBöØÔœ{zMŠ|†^ž†ŒYô’"cô&”]7Þh\`LB²£‘9¨™U$a§Ö5 \ä.{TzÊASø€0fB — 5tÙÂ\'›êåÒ1+ÎÞ×7{©mNdqwÙÓ™‘èðÀ¬ø ³w¿¾}»œ:ƯAA{ Z¢¾ËvG¯ú6#âˆ>q …¶±\Yoаš/Xó@_Îúè ’‚º vÑÁ¢$dÎÑ)op§nf££ñpwêM4ó|îÅa×£¾ª_bŽìpÙÅ9¾Ã¶Ñ|Trî[ôa¨ÁÎ#—›Ûš 'ÄTC@]•j’0“Dh£˜f²ÙÓ«C89 ñ}––:¸Þ\«©øÖ±ìÉÌx )'·Ü›KÈ!Û,$ æw¨¿:šv·[ÔçåÙÀæã,<¦Æ|Á"ÞrrCÍr¾¡ÂD9$8ÞàˆkªHÀ¡`¹7^ó4÷wgçš›ån9„óKéÙ Þî[‰÷é(¸v©1™#…,»°WlÀ¾n‘KÀ÷âÓ7ß\póv/{;ïÂcrÔ Þ%wvÁˆ o@èR×ŧðârI^._Å~žZ¨¤RÚǰ¨à×<Ló^qý jŒ©Ø"4á;»§Ó=2”^ÃñžïéHàŒ¡&0@Â1‰Þ à;HJX@)• U±´¬Áë·xJ+C[D´…}¾ÞVj(зøLd^%[ýÔ¾™a¹#´,˜ÀÉÖÞ÷Jô}m¤ØºÛ„<7"=áûÜ5~°#æHs¹äðüncëL©`Ÿ¡ê°Ê9ÝÅ’Yqzzer^¢hì8©ñÉ%õ„Å÷ ûÜåùDSØ'7ɳñŒHãàw* ‘—@Ÿ3øðØ£~iïÊ”Eòì4YÓÛOœðÉØôÙ{Ǩ°‰‹@/yD‰á¥cxa±½ñ¥)·Ïh“·ÁfHÿ±ž›$V¼¨¤ù÷žûûž2G9S5¿Šµ’½µb5Em6iœ€Ž£èM1´•.œâ›5‡ÐÖöÌÀ‘²Y³ä±ÝÂ=öÁW%®A¶û«g|Êðc´ëC°˜Ÿ Õ칤RGpìûßÐf/K$ˆ¯ë¿sõ|/ž¿ÐàÊ¥wçØŠ .W%?u-HTµˆù`ç÷Heä³ø×WÏþƒ×ÐN endstream endobj 4023 0 obj << /Length 1557 /Filter /FlateDecode >> stream xÚ­XYoÛF~÷¯’ °Þ¤ôÁMä"AŽÚ>8E°¦–ä6—]’>úë;³³¤(Y²ä¦0à½fçžÙr&ùÄ™ü|öÓòìÍeàNæö<ò¢É2›¸ŽcûA4‰]׎üùd¹šÜX^äLÿ\~|sE#R?òì¹ |4Íçšµ‚•W¥l‘öÌ1"úä$£Ë3?ðöÌ‹aÏ'%»å¥}+¶8ìhx3ó=/¶þ(x[p5…Ulµ’ƺkiÂh¸Î¼Ä’Sø÷`”쪕¹Upš€\ Œ-^šþ`ø|qB'çrýu³u×Ш·éf7ÒÝU{l°3™¹‰íÄd©â5{ÖÊ­¼æµáR}ßè “äþDÒX+~7Ec*4»¥MíÚV%«OW´Jå1=càú©[££’2B3+º–,»uÕÐZdFSÈ•VT9­4ƒ®lE]òÍysºª©\ߊŠ?¯m€^}'I[¤žù¡c$é© ·IZ1в4´yN£cÃÐú‹§í[ÜI¬J¶†¦-XkØe4.¯‘ío‹·=_s2V÷¢ÔNžÄ‘=O<°Êµçah" M Tßȉ÷ø7VÆÁÿ¨ku ç Nßä0S8“]-`^á<×Çϸ|6¨¸q|ÝÚø‡ÛK[©ž÷?&Ëç”õ!ÒºT0‰³9¥*€ Ù§ç+ë‚Pcï$…\I,%/ -Y³T´¸ùh62Çz`*YWŠ*K¬8Q0ÂᘒÓnÑkÀ§"{Ô!CZm&NÖ|t[”Þa#“ºÎ¾õ^Nß⬅ cF Cׂ]𩦌zÊ÷bç´Ym@~Œö‡¤Ç-íK=½›†¸ît¡i—?Õ õH‘iA¬µ>/L«¦`5YüÀä !A¬9¿éÈû† ¡pÄ–.~\ÏÌ=¶6¬Ù¹‘çh‹G»5S@Ùr¾Ž“ØZü`´VWÒ†ÖTµÐ2 …n‹³ÎÍnòD ¸YÈ;þì“4H0º$ñýâêzñî÷\¼7%k^ÛŒ PJnpÎ> ×=˜‘{ë®·’Ì=þŽî¨ù‚2è¬!¦P¾ÇËä ÷à ©ñÓ\ËZ–)Ý'õ¡¢q­¡††ˆ)ÌiF#`hÅhªG¦áGCè.*¥)Ó=¦4bES—Œ^f¬Èm“!{ûnÑC_KOÊ=ߎ¢Ú@²mx¾†€hÝšçÿâøAÕ÷Åá«eÔ­²+W»=<å}{+û”#•ôéF-Ð&4HßµÃÀ¨óût ¯÷¾´­Á¾Ïà{Ð8ãÃ<÷j€ndqa¬=‚ÖÞBµÎS˜XcU?D{qd:âHfÈé½À „㑆ã´q/ô 3¸<º‰Œ›þÀÐÜ'n{P< AG¯ÂÌ ¼Ceï{îžJ~Z[¯¿.ñç ¾5úÑÁ/Ion`-ʆŸ#Ô‡¤ÛÜ>Ï{‘«ñh@ÉU>ýÇÃCòÎÌÈû·/!›}+W¬¨B˜b×MF[ÌOF¡%“º›ï¥}ÉŠ¹6NÔÅ[×|öåéÞ`}ÞºsÈÛ€x½~ ¢Çú„ºàDuÕƒXB:¾ÄìÂIºžhi‹Á‚å²kh‰™£¯l?Žãù“_G0è ïkmy‹Þ87²ˆƒáû# ¯~ý\¸¯ú° ÿ^îÄÓýnoŒÐÈðDx°¶o·uMË®ŒlŽ9ÃÈþ˜oùÂ8cQ­ó8“žüòÓ‹åÙ¿N¾ÿ endstream endobj 4029 0 obj << /Length 1522 /Filter /FlateDecode >> stream xÚµÙŽÛ6ð}¿BبTDŠD–ÑöÁm’Ú¢±Ó‡n¶-Ó6ŽHe³ùúÎp(YÚõiÓ'3œûbèìœÐùùìÇÕÙÓYæÌƒyÆ2gµu¢0 â$sfQdñÜYmœ wy(¥þmíùiæþ- í]®^>}‘D£wñ< ò0ªæË"D: -£ç«³÷glC'xd³Yå©STg—¡³àK@óܹ2¨•“€³É–Îòì÷ÞÍÕ(’äcE¢0È@Ä,ƒ5cEz†ç`„ùèí…ŸæIè.=?rñ…òü8¹ <ôÒÈ…ÇpÎ]Yë†vœJ©,¨ÙÒªºµZ›g››TT`„8m›$Ò,þÛ ’ÎÌ ËÉÏ„*Zyв©'68ÚbâØ(wü(â<™Ð$Uúð"WÓÝš+±±àšVN‹’õ®öJëV®;m²öXî’5üÞš±µfRyì‹Ø’Ö+ôPÏ^–ÍëÕÀ‡?Ð=1Œ~5Ç¡­º‘yHÓ˜9Òüâuc:^!¹¶Od…ÙR®àƒ+©÷ßõÛ²$ðNÒ”J'½7­wL~&­„r®Ö}Щ:^ú&£tU£ë¨»ÊOܸʘøj/êI›H¦*ÅÔ÷±çÝÃoô^ôÝ÷éf˜ð^aš³Ì¸õj>P€ºm‘·?™Ç®•>8ùƒâ£)éx„‹¡3Oà/H½Ó{:Scæ-è*Zº"º±gt%íŒe •¾ÇzøåûFámä¾3¶ºþ$Á¹Vô¢BX‡5O4°‹A$»± «¦µ7¼<ìiêîö{%Z Ó;ƒ‰m¢¢»mS– Þ_6t»¶ÎÃ=~apíðG_)Pª5.Æ ÉÂpNcáIïBn¿=åW|3|r° ·b'>)ø…hÙXæ÷‘ÿë‚ûŸþŸ—v ýùå·o¿¾“éÐ>'Š*©ŠG…уÓ`W+Ýv…îÚiÃÇkÑt6ËL©8UÙ Æÿôž} endstream endobj 4042 0 obj << /Length 1209 /Filter /FlateDecode >> stream xÚµWKÛ6¾ûWΡ°bD½uèaÓ<€ HÛµ“‹“ƒlqm²äJrvýï;ádIËx½ &9r¾y‘rŒ­áfo–³×ï}n$, ÝÐXÞÜq˜ç‡FÄ9 ½ÄXfÆÊtC×ú¾üøú}DW¶çÇlŽëF´ì¶ÜXnlîªz!ZŸ9ê”wËÙ?3SÇàýaä³ÈãÆf?[}wŒ ˜ `%±ñ E÷†6D¾óÂXÌþî÷›Ž„"¢à WDÌ÷г[2Ææù޹°lnJ5Ëö‚ÈLKcóÖrC³DæÆâ§‹NªZÿV<:Bߘ¼>Áô5Á ¹Ï¿DùV4›:?´yUŽžŽã6Y*'-:´žGh=ßGV²ªµe¡ùC þ–’cdš»sÀ6þÒ¤[¡µHca|ÁÂW¯àhbãѸí®Êh~‘ÀɦH›†ÌмQ\‘û›2xxÌÊ%ÆTO«ã€eœ%A0L°oNà ¬”óÆ7’3ÕÛTµ`í®Í®*”ßiøüåÓ'­R–7iQT"cYÚ¦˜Ù‡4¯›g´C¥­Töi[ç׸­«ã­O/¶/ÏDyuJ—^bcL’mÓ! üš ½­·Ç½(-Ï5Ûæb¦>“¡“Î2*¸•¹n4( UQmE#СÖ-(£ZðátËiz,IôÙtÁ–(dIì‚¶ ÞrIýϲ8uåß•=µ@d=äíNYˆ§)êV¶A!m…RjwÔEà.Wr?­ 0Óâ¨@¦µšÔ¢Móò°voôò/ká…ØïľBÈ?-W6AXœºEç’†Ðpö"ùÛE®E‰¹ƒ(IªÝ©Í5í ®”¤Ì²}Ÿ›ïØ–é:“dy#[Ëÿ¸¶Ìôòe'&.2e0ÎG¸Ä¡F<¿€ ,\VÇ–&=zZ Ð#A9* JŽwúM‚Ñ:8Kk@ñ.3…åÊì™ÄÚf÷LqFæ_ç(}Qb¦8Äæ:/ÓúD¤®9!½96ùý)/·D|ØÁ½„U0Ø@B4Œ<‘±.¤T¥SÀÙy3]‚$d0»žSwà&*RÏ,«– UT‘É囋]u,2MIièmCåÇ'4O!~÷£ÉµqÑï:þŠJžÛD“†=2ª{h AQT*#ó,·’•ýÚŽ k£üâvmKáú–â[Š `RTnßRPÉ‹FæN: RpQµo,Nt¡±sÔXæ¼õçÚæœx>m0ó7öFÅü†Òf¾¤å°ÝôÎÒ×æèª¿˜!üIiz<’Ù CWš8ïJç²4£Ai"±/M¹AIã0[`IÕ)Øêy¨²lTšÈþ_K³Ôdr_“ünðò=í÷ÐC8`C²zÏ>[´ê=õëh„øˆ¹?ÖÊ‘ò§çÐÛæÂ›æ/s‘ üÞE÷uµWçå_î5욇ÜW+ é}ñ>€îD{¬Ë¦m?õÖè¦wOü¸ê¾•´_—Óv×}Cýоªú/æÎ[ã׺[»Àk[¾@ÿ@®ú endstream endobj 4052 0 obj << /Length 897 /Filter /FlateDecode >> stream xÚVËnÛ8Ýû+ˆnJ+‰zÐ@;˜dÒÚM;‰;7(ô`,²äŠT__?—9’c9ÎÀ J$ïå9çžKÙCä¡¿—«ÅË·qŒ–d1ZÝ!ßó c”ø>‰é­ ´Æ7}&¸¼üu™vyë¸Ã×|öhÄsYµpnWï_¾ ýQ¢µ$qäã ¦juáÙ#߬ß>rÕùãTŽKçf¸á}çùÔNȾrõžÛ÷L/ =W˜©¶1£,¹yd:ĉÜêv᪲«²^¡U3~çø}¬K¢rWÑ .ȶŒ,i1ü±­i¨/Hà“ÔBAŒðá/EŒJ-†+.ò®Úi(c¥ïŸØÈg@aIB/0᫲@RœCpâw'H0o*ÞäÜ,ÜõMn™Â›ÐÕ±1ª<Ô”G—¦ÚÌq£åº6°˜A] »fsäi÷u*‡ùjä}3³Ó]¢*HRÛc5\E%`$aÔPù$Ò ?ªÁMØ Mæ½üÙ‹¼6SÜàÉ? Êæºè6ý–7 °'Á=Ê{ÐL7D˜@í#ÆCäc ^q™Vµø?>ºáà–0 ñú¯¡¸“ÛmÚQªs=•’·*6²59öþ0¯S{¨™{˜É´),„¹{uÚÄ‘A.>Ö­Qº) Ê»ß+ѧuxs3£Ñ[¸ç¹wêyEû,;ÿë,cœÖ=R9ìzÍeß5Ó.5»oºŸœ…í¢—eÛ)ÑÄÐO5̵:äáÅpAì¸å¿¿õ•L_X$lâqµåU×fGÒaëŸw/Ê^æ%i»ÍçPІ¥ ΫE;Ó˜ð# u4<^Ï·©~êþùáñä–ßÃXåÑÃÞ?IïÍÏt»«¹8ÿ>d,÷œp²Ÿ˜"•©ªõ³]¶Í¿ˆmZ×φ²ënò ›ì_›û-à(Ïï\3žÐE¥Ö©‚Ħc“[O§xm†û^°éÚ~Gò¶î·Í§íÐŵ^y¾wØhÅdÇ‚fŽâeÇEÙÖ©Û÷H@YmÊI5ú¸clÔ\Îù†ÍÈ:ÛÑðÏæ?‰¥Èÿ endstream endobj 4064 0 obj << /Length 984 /Filter /FlateDecode >> stream xÚµVYÛ6~÷¯ ¶/Z1¤ŠzÈC»@PèÆí‹»(d‰¶UèZÙôßwxHkÙZÇn0™á|sjÚ#‚~]¼]/^­|Š"1—¡õQB°ç3RŠ™¡uŠ6–Ë|ûaýáÕŠ±#V/à˜º><¤˜Ö6÷¬ª^ÙÜ·DÜõh¥Ð‚]ËõâqAaKÕ°ÐÄû()›‚R ~@@Š8zR¬òIè{°ÏѧÅïã{§«¶…ÛB f` ì¾YÕïDžO±eÑ‘àÆ =ŸX+Û¡VV¦¶ãñÀJì€Z"·X@î˜õ”uM=dûƒh;}Ý*ÞªQ­fØÁQc}ÞgŸE©oÒ¬e›Ueœë -(ÿÒ>él!‘T¥Ä V¹8â9à—(´UâNeöØ eÚ¼»=ŠÝ[œ­êÏ$H1ì¹Zû{Ñ&MVw™†xšÓã>Â<¢Zü^@¶H_xžòŽç[y¦| ÕN¯{Q*WÂÖxغƒÐWm×Tå^ B q¹Õ5Ù¶W¨4wu¤dÄD…'µí€hU ýD«3âGZàLCãþ?Úx/fMŸq¿àŠ!;ÿ"©¶ÿˆ¤ûŽ™#zóZ/ÔÜ—‰Jæc’K mç1ÐÓ uõæ·OKÀ1Eô ß4û²Ôö\ã’ÿk¡¶ê¤ú&é±qüÐ ­÷Yq/ ÿMŒ¶™Ys²ÇÚ( q0”…ôÚEMÌÕštýiUCšô­¸A• Ä×íúØ2±¶*ÍDsž‚: Ç Ûè¹Ìù‹p< gR|¦PÄc¯Z\©"¸ˆXäñPšžá®†ãσ†T3:¦“ ¾øÓ g¯éòKט2¯ã&.D'±ŽÛV¤c¨õ[ðÃ5{4lïÏpl”IJ؊4ÍÊýY¨çˇiÔÚtþ¼7õÇãöØNúãg¨…ª™vÉ1 ¿hù%.ê\´×7-1ÄÇŸù¤¦qˆuWo‹äﶈóünè+*|>TƘg–9êAÄ©|é¼ NzØó#›Í]ÄwRßK:ÒRïdzËM[‹$Ûý«O‡,9Œ=vèò¨rUnÕ“Þqi¤Žº®,R¹>é©þÛ­y¡é»/7ý`0~þÃïŽ!?~ìœE#‚âŽF¯æÆÀ³Q+àÓQ+$ÖNM3±œ|zI€yÈÕƒM‹Ýó̇³™K¾£Ê6±^†™+$'3\Lf.礥¿¿v梌aüõ]¦. \Àø·]7L]»!„?vðª õÜàuf¸ø?çÆÎ endstream endobj 4078 0 obj << /Length 927 /Filter /FlateDecode >> stream xÚÍW[OÛ0~﯈؋£‘àĉ“NÚiBHƒ²—Mnê–L¹‘¤ÀÏßñ%miJÑ&MHµcŸûùÎñ+£/ÓÑÉ9¥ÆØS—Ó¥á`lãØ”Œé˜¡©”W<^Ý›nˆæ¦¿yY™wÓo'çžÓ@ÆÔ1ñ’Õ¥¾ a­¨½µÕ[n‡D1ÝVlÅ;l»V¶­ Ë m†Úð¼8ç¬^—¼ú‰},DJjÐþ}_‘åóß<ªå5î^-âÔ´|ŒÑgµ8½TÙRkéк¸—¸(s¡Ž/:Äç§—7“^ú9KXí'§ŠÜ¶mylõ8 AptÎ:Yqs}›4 ?-Wë”g&qQ] &bOTd_" —™ån€Îâôš/Ö‘iX„ùõñ¶µ Ï=›¶s5¨‰ºJϪ8Ï”ª:Wëºâ¨Ú&|P! ¯Öé¶hx©=\ŠÕCKn:D™–ƒJ±¯ÔycVÉAMv€e[tí·ì|VA¸×›BÚº}5 çÚ]õ‘älg«ê«66J áZy,5±LEƒ?¬Y¢Ž2Ëáˆ6¥(NŸâú^ítÓj>?6ŠÍRßU”¯}€kºÞö nò\—Lǘ•,å5/uª VUMœ!íJüÙ¡Q ‘j{ýÊŽ™ä¸Ü‘ŒÁúþaŽ)bɺ¿É¾ðàeM«éø2åãÈà%ï$ƒ v™ì3jòÌÒ"áÕÛ¨·±1°ÉØÕ­€ÕLtü£bžF¿ª”%ÉQÓüd14E­wKÒwûâ Ñ ­ÝŠ·ü³ÙQ±£»»cuóêñØeÂuº¬š¥PUÆÐ¦>uÂ`œÃ³w> stream xÚÍYKo7¾ûWðØ^(r†C#@u E;‡¶F²½IÜ*R Ëhûïû åø%¹¥l èÅâî~œ÷|œ]—ª.8®Ê.eûM®’ýŠ‹\°(ÕE<äZ bŠKlwTÃ%q%Ù.l-Zö°`§Àh §À Â+Ùî %Ú;C45c•›Žâb ûl! ¯.Rh` %“®¶‚Š ?&<… ’Á½ä¢¤ä4â¾ÀH °+f&{­¹¨­°¡P²”•ܶb‡FÙà **™ H¡@Ñžš¨œí^rS±9¢å½ì(EÃÁ)JÒî±# ¦—€ËÁtÄê¨p ŽTÛÓ„Ør°|*VHGlzñ‡cÓAêbÌ]ŽÅüÀ6Æ_¸+gSÁت¹ŸY’ ±Œ‰¥.0”e6×;ri; Ì‚¡°ŽKi†á¡FÓju Ùìdè¯Á´’%NT4é˧„ð™u€0™? z8‹S‹eŠíbžÄ\DÝ$ ¶ÙKÒj¤å6œ¹B…RrÃA°ªY GÅ@VÑ*GW!¢Â:€ ;a¶,KÂJÍè–Dæ’­d*°CbÛ!’ÛÎÍd„\r˨`UZFQ°¢­~`™T8Os°V p9G¤K‘‹‹ ÌÔ‚’ V-¡Y]F–mU±j Eô3ü³öZF‰ÊH¨Ý"—åkÈó2¡â2Ò½¿¿7zíŽÑ=}èF¿üú:+xkŸ¯¨Çéådò~ïùóGÃ[ÏèšN4d£%úÀ °Eÿú`6]¸ý}7:@X*bѶÀÑ®/ÔUô×ò¢ Ü ¿¼Â†È¨õ+ (&h»€øÑÛùìôhX¸c7zûúÀÞ -ܵæwð`üqؽ‚ÃtqadÓ퇋Ùåüt°{Z—÷~ÎÎÇ/g¹csiv¥Ò{(ϱÀ¬Kà‹étiÇKÒ4{iÚâžþ†Ü]ž,ÚõçÓ?öF/gó³aÞ´„÷£FoF¯Žc»0ÃNásöŠòŽE|j,©>ƒ ¢f›Q/ZXÜèûÙ»™CZ¾9ü0õGÃå|¼øùäwHùÖ¢´kb,¥ nöÖxTÔ—Ö¢Õ£»ŒyöìèËxq>ž¼ùŒ”øÃ³ñÅ':_\Ü6³W½U\µ¶Ú…y´âšJ¬ëÊV«×{ÑÄ]v‚N*>J¯%©$NéE“zãž>4(ßKì ‰zÉ»Aƒ'(÷¢c&_À°Ê"¹K1·YåsÜ%•Gòf¾Ï#mÊØˆGn|oOoÑß_Ÿ`м ,£ÌBÚ %\{ ‘PÁå‰ç˶OsXS ú„J¨}•°a<Þ?Yõ/r—Þ?1Ûd½Åƒ’’z̨öj5qq KãÒøàÙt2þæþËxâϧf÷¡ö&Ðß·Á×µ]Ñc7/×Û\u—Å .ÂÓ²Ikx‹â²¹4»½ôl1­±&ŒíõÀg¤—JôíC æ}0­o®¦Œ×çŸßNf[H‘| §_ ²óÔ^â:í9Æ‹ËùpߦV=´ õÓfdÉ`ÆØ‰& •·µõñ¥X×”bÙ¬ï8«›ÄQ׋ūîÍÉÛ÷–>´äìS޽h"×ÈNtò{e§€ÙŽ:ÁTC#ã Äž{ÃM)ûR¤sÿïF‹D«’ÂãÉšëV9:ãuñNŠ)Žª}9¯RÚkaPy_LO?꾮 ¦¸Aßßôdò•w&t$K'ZÀ±b':E›Ur'ÚÞˆ‚Ð üÁb½û æÑ¥+kJWžPºI¯æŒ´Ý^~Ù ðmAäH0E²bÜÀð–˃%üj<9½œŒÃËñütv6¼™~˜@Þùlz±Å‘£1^¾6ŽÛoùOãVmZ;vÈ&Í&ô}ÊÜ ¿T{Ñ‚#-†Ü‹ìëÚ3m:! …K'š1õKÕ^t*>EîD²DT{Ѳœ˜wt¦m‰&rZ¥‰L§‰·úì`t€“ÓÇdÿ^©´ðQAüð ÷Ýç“áìì|úñb¥ë2oÐu·Á7}ÄžtGhöÖNMëÐbŸýBíECvL܉f¼W©ä^4_z !"L;AÃA/Ä»:›ÝfEWÛ “w_›iYi³’®Nã"7ýöIN§ endstream endobj 4095 0 obj << /Length 1009 /Filter /FlateDecode >> stream xÚµVKoÜ6¾ï¯‚¥€ˆ%‘¢=¸m$0Ä^ç²õ•èµZ½Bj“úßwHJ iͤv‘bäçùÍ7ã`ÄÁåæ×íæÍEF‚,aÁö> qŒÓŒ9!˜¥E°­‚J ï¶ïß\0¶PMi†“$GViò)Ñé{©ÞŠQ‹M<‚(ÙÂ4šm£$aê<| †Ds+Ó…‹U¢<ˆÇŸŒ¯åxP£4M‘0K†¾„ G²{åÄý½[KÙ4n׉Vjî|»ù¼!)È–˜°<(ÛÍî.*8|ÀQÁƒ¯Vµ 2*Ï Mp³ùø$íx5_V@bÌ &8gŠ‚g]ùЫ9Fe#´>“+? À@X)™ü2ŒƒœÌWCbÜì+ñOÆÉ <W½È§^ùJøˆñ"œ œªúo'r`Ø ³QæêAf3Ábް˜?,>LN y N†.åx¦µx4g<ÁÚíœÃ<]¡ô³ztýáìÚwwëï7áô9`†^tzoÜj±÷?eâÕ•Ã:¿ÇJJýœà_¤ú>Ü+Õíõí¹·*÷™]âkâGv€ŽÔ¶#žn~âÞ ú™&._éµ1…X‹ÈÃþy^ŸL|aÿ9ƒ  endstream endobj 4108 0 obj << /Length 1980 /Filter /FlateDecode >> stream xÚµYIoÛF¾ûW>Q@Äp—˜›› )'u”S’MŽ$6)Ï–Ý¢ÿ½o™¡HYkÐ"€5œåÍ÷ö÷&Î`>pï/~›^¼|EƒØŽ#/Lg×ql?ˆc×µ#?L³Á7k:œø–LJ5òMR'ÃÓß_¾ ÜÎ9?Žì‰ãU:áEcÜtáè‹`wÐÙ=2ÛGÞ&}>t%çÍR”Cß³jÕ;¾ý ä&]ГÁÈm? ˜PR¦‹J*Qocè"þ6ò=ol]•zü³'‰{yxûì8âûp©9Jݬên8 CëO‘ÖC:;¥I-2þ¼‚§³cë]^fS­³[ZðgäFv¬µ(Å,ÓÊÛ:@™Ž `] ‰‘Z_gGAXÓE®xC𔆕‘7±¨¥ùwÇ ·¹ÞZ•‚©V3}Ë6¯ñ¾ŽÆ þyR¯¶;€'¡…=.¿{®s˜ÅÐq€€¸! EHQ¦ôX$ ZÈk%ŠÅ«"¯Bê9þyŸu%yË6hÒµ¹£L–BSH+)Åñ1$€îÚq1v-¶ªÌpwLÒ§_¦4飭T…z*q,3®ØZ&µÌõZ ª%g«¢Y–_Ô6ðÖ¤u^•‡°Ž» šäòù79”y &Ú6”úpG>†‹!»§ ª F¯šãLCõGšƒ²H—+ŸVH[±h)—vM~¡¤àø›&謦è{…÷‡ÖW°’.+-¼—¬ݘ ¥ÀúüúÊÀÔN-÷ÄݹÓuW“ò~€%G'Xÿ~ •oຠ7êmi{ýåÂކÎçÁû¼b;h‘›¢}LGÈÖ[Ñ·¶h\ê¾;Êâé?—wúf{÷ëÿÉ ÎfÚ¨ÚTFàÁ·è³€8‚Ì ˆu=Õ­{t›ØÏ†T‰¹~ðí‹h út‡FóãoCðŸ½%ªîöÖÍ› žVËUÓÚ ë0ØjG‡T;Ÿ›" Ï.+¹<¡…úL±IÎp7Ì8ֵǿxsv‘ÿ•pÄÃYó»)ϦœK$ej=¨ 2“xʹâ-ɬ&ùÃ0ë†V$dÚ6w*™=á»'…öÜF p‡:b.cvÈšÛ/MÑ'Ê6G·Ôµ•£O¯ŽTv?è¯+.çdU¨­ p—”Ù:ÏêÅžÚé}Ò(•›ñ“¹ÅV{nˆ'3"VGü'BÞJÙÆtîÀ›r_`+ ½SŸcKÜH½˜Wº—%Ÿþî„g63·W77ñ#e÷tq”v-…P'DÕz@ ¤0t­yÎ0ŠW ²C¯$ôÊëJØ©ÍÅB!´´•iñs¥SØc¾Lj}[) jTõÞ¨±Gü Žé.âLÏ}ò®Râ”D#uãÂ:ðs€ªŒ©KeΘNC!²äŽMô)·BLQ!ô# TM-Ïå&Cã,¶S¬]"ãG¨/x¶Œ¸ß<ºáÂ%î¿ä1ZoF¯Nô€CÏ5-Wò¹¶t¹p™‚'‘ÌÔåiŠñìpÒ>ìˆ,§´y¼Oëõ>ºÖºu#1ÉÅ–¡»J$\º2´Ÿ·~qÔWÆ z“ 'Î8êåo•Vôä„cÎ10‰érñ+-è9Œv£æ2çå®gš³èΑíþO^¤Nµ…¯;gúVÞ: ‰.Zä',Ôu‡Éb¹µƒðƒé>: ú)÷ IA€"Λ–>9’àßÔ*žÔàhlšb~ŠLF‚•ƯÐ^—8K+óì~牽ó¿ÞN/þþ+¯m endstream endobj 4115 0 obj << /Length 2148 /Filter /FlateDecode >> stream xÚµXK“Û6¾Ï¯Ð‘ªÑ øvNŽc»¼UÞƒ­Ú=Ä{€Ih„˜"’ÊxòëÓ/P †Ö&ÙÚÒAx4èÆ×_7¨V+µzw÷ãîîÅÛ$Z•a™m³Õn¿Š” ã$[åQfq¹ÚÕ«ŸƒmV¬ÿ³ûÇ‹·Yæ‰Æin·1("¡Ýºˆƒ^·ÃÞô?éQãŠ;%Á.‰·tãÖn¶9 Ƭá'3jÛ ³…ž‚Ù1 XªÂ<ÉeóƒYoGm[n £9 Üìöü?¬Œœúõ& º5ìT¦>÷²\»FwÛšš{_@°LÓ­áï1\o²4 Þ¢Á]/ eûÎ)¨É§ 6CÕÛÓh»v:˜ ¦mÀÑeš²#š§ ÇŒ‡Ž6­»¦{xZIpSEpjŒDl0Òø4žu?ŠÄpvÓS'ÌȺáÿצ‘ÖVEeÈÎs8‰Zõàki~|w·úy“âÑ;û2Ra¤¢ìÅ/aËC^* UÍî Œøá–NgpÆ;å ýE’©(ÉçÚP¼“\Ä/.ÏÝ¥tã»I0 özÛ>ðHmÁéf4,Þhw‹Oë¶æÝ í 0l§ó¨ñÊÀ•©*ƒG¼}Ã’ŸUœôÃȪCQY†w¸pµ¼Ø>ð„#Äqh{û-¼•ÜG:êÈíE¸M Öõy©ë5~tàÅ©àu×c®ùçž#ŸŸæø,0´¬¨ ZÙbp‚„Æfe5#§Å»#…kdÆè û^ýëCÏ|ú'ž¯’xF¸ôšÍýç)É ä^×C0¦IŽ@A‘ žÆ½ÌÊ]ÕØËÁøoãl)ôA#lexøÊÂ\,ôüz6dn„&‚a>ÆŒ¼­¬K@Y4)G“x®¶¿ÙÚˆàÜó‰eeQî{Dr¾N9KB‡¦Ùî"E”ž3ààÜ×ðÝ7ŠÀ Y…ÛÖ¿%´qîÜŒöÔXòuM6`›)V#Vc¨ˆAQÆ»)èYô€~aAÌ"ÍsKpÑ[ÛÖïÛÑ<ôÔWm 7C'@%qü©F §mùútjž– Æèʲà>ƒÕ‹4øJ é[ÓpÿÑÖãEþ @Á­3t"-vj‘cß-ÝX\€×êWÆûµ¢©íú#äpèïFŽRõÝ0H›{µÉ•­_onÇ64„ø  TPÞö˜lÇ /“¼­Ú‚b8 é ‡^š}\`æBëØO! à–œ xä³JUÕi¡â¤"$ÀXÄëÙ1И¸;îgX7àø#’ãBD?¦ôø9òæ'äDZ BÄ`(2UL $'l’Ä«1pff*ª’Œwï+äö‰û=ÜöÕ¾û®‘:†%acJ>Ñ…½ü?%¤\LäDø'^³­f’Ê‚ë;âQv˜˜¤Êq[ôlÁ ôÖõ½ØæŽxŒ¨‰1|Ú˼,‚£'ªÿüL0_!S:Ë÷RC&*‹aRiÎÇv(ê…=º””ËNmÍ>ǵݕ/hˆ‚ÊàýþJ¤7û)(p#ΛQPì,+ãþIÛEž¶:-Ø3Çõ–£‹'S™~ä`ÅúéÞ!Œ ‡©¬áQˆSÌY”aʲG°‰7Ý4#€^K$xÙ'º—íÑ(ð%ºñÑ:‡ ˜ÕÍÚiã.Ï+!ÿT?p#2Uâ½0ª.öòS\÷äÞF`¤ >ã?J’çåÊ\cÂØÅ½§*õ3pŠ}§ÞÔ¶æÂØ–„J‘/7êÕRîg1Kä“ ZîÞ'6qh­áÑ7˜ñÛÏØì·ñU­ý¿’™9ý9K²Ìÿ*âRÈ(.ÊÀ|§,Èå01ÁÚìQ_ºw\{‰åRÍúèò›Söðµeük]b•s6ç+Ãûýb–ªTŽ´Ta±Lôÿm7JæÁ–TáSn‹Ø)\š ÁQ"‚ŒùÐõ¶ÒRÀ£Á¬Œ´PÁS¢¨å̳úV¶»@€ž“îpß룼 ˆ“²Æ¼)<ΡԕßóTe·ÎFÊ8%œŠKþc·ØÑœé±ùjôTcÇÂñ hûÅÐÛ†™Æ¥HÜgz]@ÇèÚÒƒfƒcÕXUª»gœxâêDžo$Ž7ŠEw'ôè¾kÜV’d7€…L+ï×+<ÅyÎ/ ðäª/ᘕþ3uî+˜s*Ùצ¦véqwV\Þ»3xÒ‹™àIGkžýfɵ(‰XTåü`cĵ”;™©k‹+u³ø¨5£ûâŒÊÓÔÃK¬Ô=ú¤ÍX„7‚†? çùð&œÒ2¾)ì%CÜqÅ$5Væp•]5)\vêäF•ËöÊ}ž€†ÛUeÂÁ4Ie›Êg@I L¥h†·Ÿn…;!üwîÎËÆ~Èá!?0q¥–‚@nºQ’zøK’ÅÁso8ä\8ÇóÒ¿­e-×~HÒ‹ ãhæEí$as”ZÕ/u’‹„#.~‹Ùa9é\'œ®fÿkßµ¥bâïº`ÝvìîùŸ?ïb;M÷Ü4"¦ô8û5Ô‹½9˜v°¿É—KœÏFºo"¼Ý“Ÿ ŒjÌæµA²jx?æ;•øõ—›ø ø‡(Ï_FEQ,b1*Õööçetä_û¼|ýÿfw÷—žv‹ endstream endobj 4122 0 obj << /Length 1038 /Filter /FlateDecode >> stream xÚ­VYoã6~÷¯²}°[¦DAóbãE °w_²AAK´Í®%i즿¾ÃC¶ËÞ¤è98ó ç@ÎÖAÎï£ßV£ù"ŠœÔM#?rVÇCÈÅAäÄžçF8uV¹ó8^M<æ¤Ê—Ï?S™©ewOÖ“™:bò´úc¾¼Ž²ÇF¡Ç~”*êÙg-è°!gæÇpÂæµ»¤l *z"çVP•8 G6?qf^ìâÔ3º>|˜ÌB„Ƶ4¾¯®•bõ¨‡Ü4´.Z>Y›•UB’¢°—;j6KºçD~$’˜sC²g²µDAíf'e#®çó-“»ýÚÍêr.ˆd_IAÖs¡UÌr¥cÀŒ‚­9á/_PˆŽÁÉbÎ ]5ë2ÃÏW]>ßsS£ëÛ¦æf“Ó²ÿ@;««©µ¾)˜|ån½þJ3ÙÒBÃ)üZe–‰T¹Ù|ÛSþ2d¦²Î}%õëÌ"¨-´Fx×ÑÓY%æ‰K pè]û1:êÐ8Ä=ÊŠÒú-Á­ § ¯3*«¶„ʬ”d»,ïôôž$û‡Úˆ¢>ó¹_R¹`Uþ™pFÖ]P"÷œŠÿGó2#Å í~²sö[3^´l@ÕEÿ“ÆS?OÔ %kÿ<©²]ÍEïIËÛ’NlNPŒlÑ>‹Óœeª6€õcm½Z[Ë[À¬‹TòYìíÔœÀ~]ëº}Ç~1%ñoRUµÔ%I¼7Œ·yþ'•¤µ«[·N@²8–ÀŸ ùÍ!ý[ÏÏbiÁ¼«rõT·¯´"£»ÕèÛÈIäx‡† •É'+GOÈɺ¡Q%ÎwÍY:´Ü8À°/œå诳-O7mèz¦ EÐy1Ü8´ÕnuhØÐ¬U£¶áî´Î(í5kz}ù$ôÆíoÁa2¶1 ãñFÓêÒÜ ­üÀ3)sPÝB­›½j¢Þ¸èè9‘ï»û 0‚ ÆO±›¨©@ñ‘ŠŒ³F…vp¬x5¸è1"qqÒb¹c*"p_ébNmJYbFÕÈ  j:ziÌld®ŠÎ¨dTq"ìˆYDo´¢¹¹U™Szëž [ p­ak¥¿:‘à‡‘ñG·x•Š‚•¬€’*µÉΔk88²µ2ç»6›«œ•´€)¬˜„¨k'Àn0f I?t“6…? 50½y²Irþ{«ŒÔî¦zš4.‡†ß…i K2Ÿ˜æ.‚ô‹ë•¡] ÊAµØgf† HâŒØæ¤ò<|º¿ŸEê¹Ç¢Ë†¸eÓâ'š­PEÙv·>´¨Ÿ±s ƒl³—Ô\ÜÞ/旅‘…\ÿ»NUÜ endstream endobj 4129 0 obj << /Length 1398 /Filter /FlateDecode >> stream xÚ•XKsã6 ¾ûWè¶ÒL¬Õ[Ö¡‡tâtÚÉîìÖN{Hw&´DÛjôHE)Þüû%K¶âÇ%‚I€>~ÈXÚF³´ß&¿.'Ÿï=[‹Ì(pm¹ÖlË2]/ÐBÛ67Ò–‰ö¤;¡eüXþñù>zªOS×rmG,/†3Óyãg;Ï 'ÔWÆþò$I‹@뉥6…g½eœDW›ª¯Ü°âq™¿657w<ÝlkaL}ËÒ¡ÏýíÃb~ƒkÂzSp4ò}²{ãÕª| ½üóq.u§mÔ7øÇòm Íóz>Mí8䛑5#½ÛjÓä¼0\G¯‡Ñ~¢Ã…ì™éF*²rõ/ëC<ì¬^ÈÝS×uõo*V£ì-Dä븀y Q|‡S”[Š8™-OL&{?½5îÜ;ÍPßrÃÖÚíqê\+XÎMcêyž~gLm5׬ɔ·© µObÀŽO׸^ñ¤‰ë´,N{í:àé] $@—e´ñÞ¸s—¤º$¡ÖeEBƶà¬Z¢®X!Ö¼ºÆç$ÍÅiw}y¾Ê­´@XêÀ ¯È¹7 Z\·®¥E’Ƭ†l¢ß»mJ€’:ìŠæ®#RÊBÐ EëEë©hÃa´¸À•W|°š!µC¤ö|KÏRQ“T®éK¡°ŠÅ5€C¢®dé?Ò6¶¥œ©¡RÈyͤ´`™5y!Ú2K ´Ãbf4s†Å`ú¢O”> €í¾~÷Ó¿>><˜*mÓ<ÍX5\¦Å‰ŒÔù?a¯ß^½?ŸB|ÚùÛÃýå\.â_›CW)‡uô¡À@ ¾îëuYg ØŒ¦IKá=LFn‡‘oe–kzatÿf^&°Û‰x;€8P‡ÌÏ•„¼”a$]à½K Õ¿ãP= €Œ¸ö\ ìy+<ŠóUO–Ï¢ÞÈÞ@* O% ré=!è¸a|]6Vy2¬±ƒž ³qCê¯U)™s!  ü˜~˜f#¬ Ì¹'Ûô=çð–pbc ù{Ë!F8d+?~»uÕðV càá¸d ý‚*-{,±£=Kp.UÆ÷†mÛúí@¶˜c ]ˆÃ KoK—¢` 0¨Vm>w`Ⱥ°Uõ`' ¡©ÅGùö™²<›2nÆb~}Ö´w¿ó]è[Õ5]t ¼©€½ä“yB’²MQŠÚ, Pa..¹.þeDβ†^¯ÜWDl’3¿»ù¡Ü»ùÑÀ.­·$µ°Bi£=  `%h'±ëH+Ù5Ah»&œÊ,Šôß×4ÌèƒìËí7¥Ú«–r-1vÇzZoi“@Ήg`pÝdIª‚›¬R“,%I²¤P1ƒýkô‡UWJÝ¢ÒA”Ä+‹¹Ú“ :E8c œPº ”Ób,¦®|wª…Ü(ÊCL&Œ>÷{U õôùròßĆõ-ÍîX®å™Žkkq>yúai L‚ À‚™¶“ª¹æ;¡ç‚œi‹É÷Ÿôм:lË €dÎ,4Ë£€ð†/y¾–Ñ W,üK# tz¾¤íCZç+Ãw WKÉñµÔ,sú¥¨™ÐHŒÓÈødÊF¨ßž“/YB ô³»ZŽÂ脾i[Á50\ÞÈ£×ñXL¥áq•¾½>.Ìâ¥1Ît xÿ&Ö¡†W«J"¶Ù°{*qU‰bžÝH·ÄF²§´Âš¥°:WŸ±’|Æ^øœ=漨å? ´‘×6«ËÜDGïrVÅÚ{¿ãÝ`¨¯ >Üo6¯Æ;F§‰›fÎà•ñóh¿³ÿ/8 Èù?èDaÅ endstream endobj 4137 0 obj << /Length 883 /Filter /FlateDecode >> stream xÚµVKsÓ0¾çWèh"$K²ìc)4 ÃÀ0M¹N¢¦?ŠåLÉ¿g¥•ÓÄ„´eÊIÒîjŸv?›‘5ad6y=Ÿ¼ºHS’Ó‘{Gýý•)Ö.¾›e;~2“쥾I Kö4oHdeOꎳZà3¥¢ÁÁc9‰ó4*ªù—æz$¼Wb9ÕÆµ¢ö­¸BÉÃG¹pÄ·=1`‰`¡þ/Ýñ\ÒT%í°­mõ¡´ý#|'€ïf¦G¶€R}=ИÚmÓ6ÛÚ"×À¡Ø Ý`P/œ}[‚gðzJ¼ Óp)©HÓaš‹²q…æÀ•›®ƒ1p? (%æ¾Ä‡o®«¤:ZÖ„»×jt¸ÂPNa÷ühïG~v ßpÜ"§ïÅv/j Ý_… zŒxnºá£> Oß]AìÙ'<ÌÐ!è?¶0íÀSý¦ ’ó¶®Ë¾7áè(äÝìãù@ @ /ü ¡o endstream endobj 4152 0 obj << /Length 1316 /Filter /FlateDecode >> stream xÚµXKoã6¾çW¹T"­^–äzHÛ$E±Ø§—lQ0m •%-)Å›ß[2m'-Š<‡ÃožŠo­,ߺ»øiqñá6¬¹7OÂÄZ,­À÷½(N¬4¼$š[‹Âz´Ã4tþ\üöá6IöDÝ(HÒÈ~h7Ìì‚uÜ ì{Ç ì—œ'Åo*à~*e‡*.|}3\ïéò-7LaÑ…’­øHþØ/èÉöÍÏ,7ȼ(ËHѯùýËæ©©k.™èåWæ£fu(éÀ›Ïf$-•¤¼Rûþx¯+7¼é;Çù¾ý#ý¾QTòg.Xå5¤o¯?Ýß9ÀD¾öº—–ËÑ‘­½dUÉä_dÜåí\¶‚?< ŒŠÁާFò‘ÎÅ—‡‰ {ž§Ø®¼a8FÞ<Ð~jÑë0ºøÝà&ÿ?¸oÃ`öv &¡ëbÌ…3/ B’»«~Ãk' íNž â3Á«›æM0ÊÁ8 SûÚq£(²Ÿ yùÖ5Y±Ý,ik‰@”'çúlœ–ÁÌ›…c/·g’t[×ÐïMceG+ºœ/¡ÅrVç¼*ë-¿õ\¼YÖÚlž7uñk÷å¤ÁPÜÀªj•ípA çµ}½àRèñÄŠ7-x’à_’"›³%Ö´jEƒúŸË‚F¯¼ç™{µãäC|èoy¡Š­@!ïƒ>xMË xÆæã©ú&Þ< G†}õC_§K6²cžØûÍRêppú53Ps[Ö_† °ã¢Æ¤–1®¸ÊHtk-‡^Ô›—¹(u`j­Oè¤ã#Â(9–Ÿ“¾D^eç1Ù+èÿ’8µk¾E"ÛT€K¨A¨±‚øÕÀÀê˜U`™IÂ}`&FŽcw±.±ßűÝ2Á6\ ‚8,ÏyÛémew_ue[a!!hÛ®lj½ÍðÍÈ•˜ŠëFtîú•7’ÄÅWž©ôõM)ß^£âÆAºËôszÆ>>T7´™céïŽr-7¹ó¥ù~½+t€Ük=Z .¥®ÎL?¥àm™w¯UY¡‹.‚Šƒ™±ž~sÍÒ]ö¸¥ Zzó½ƒ}:<„.«-“r¨œP«Hüy™%P%‘_ÌxT'în§rv×Ð5¸¿ðŽ••¹•OÇçI ¿uÀë*ÁR¯àjZñ!sæêaÊÅn©Ö©j5Ò5IJW ~½ûü3¦¦„¼à’D„ƞ˜ÔËÁ˜QG3Ø#‡[XgÊ–5Caê’à‡YDöD³xÚÜ€sðT”g’6y 'Ѭֿ؈FÊ©'M=dšLHJG£Õ7UqFéùtNÞ䙯Z˜*t‹ÕOÔ£MÉu3ÁéšÔ?ˆÒºéL&P&ö-µf(u¼ðNN¥:ˆÿpTßíù±0~ßg”WˆÍÜ.—ÆGÁd*;Р0£¸ h©ðR1·¥Ž´½¡ WÍj†e)'q9žá aióeÓc‰Ã9e»[ãÈÆ(¢R R9lP£ÌAB§¨Ú|²9Î!äLÓÓsܾ0~ÇÈÚ–’r1f•éŽô‰Å$ý>ØBöé:ºZ6 ïeƒÃþé> stream xÚ•UMs›0½ûWh’`&È„€Ìôà¶vf:i¦mœ\Ò0–mZ ÉqÜ_ßÂ$ø#FZí¾]½·²ÑÙèª÷iÜëC!™ÃÐx†ˆmc—2ä‚™¢ñ=÷fàQ™D“”Ì€<’«’Osi>Ž¿öG”4\=¾ 쟌µ7÷þöHuïd§CJmì8(^öm4…=ðÝ0@ëÊr‰((Õ§.ÌStÛû±÷&+­·y3.uºN­õ­ÎÛo‚…-±“€ÚÐ!,b$| ôö|ã©ö¡V1ã¦G åM5ﺓ@Kß“­ÎŠvt0×_.þ q™2ɳNÚ¿ja¯v¯3ƒ–ðdzžñ’ü™é:‰ºTÞˆæütÙuà!{/IѪb^XõT êzž6Ï'¿y,/vDolÅÝò›¤QüçìBÿ:+ù´Rb§‡Bb‘üã-'Ý–i>oYÝÜ]_w ž^¸+¼är‘OœbúT$D´9-@ ÉË÷Øâi‘¼­“GœºF0Ûiß긂íæ1Š ÊùjÉ3Óu y¸C~ô•¿~ÚÏ4õÞ¤UIÍå|É0£ëdÐ~¹ ÃÔo0è`OÅùœ§y)t™«‘¢0!yƒÇÉl£ÿdyfÆØVcýæ¢>$óât|[~.…£JQѸ*Ĭº¨ƒj y’™0È: è%M+×(Þ6Ë.`,|ÑÃATL¡ª:pͳ='5ˆ¤Q‰KMD¥ÝMzî¤m endstream endobj 4088 0 obj << /Type /ObjStm /N 100 /First 975 /Length 1774 /Filter /FlateDecode >> stream xÚÍYßO9~Ï_áÇë‹×{Æö U¢åèUêU8éî)l;.©’TmÿûûÆ’”¤ÙDW©ÐÙõ·ãñü]ŠÆ™è2~ØJ¢oŠ äAdg‚$%ðäƒd"%‚aÇ&‡b˜+6.©‚ÄŠ#Y±`šƒ(ÑäºTœ)Bº'~y§b+**¾B=Ý¿@>ÊÜKÁW„_±~ás>ª¼Êï“RÞx®0aÙ;àDOâÀÜgªŒÁ¤ë*‚=PÁ±è»b(ä Ê;C1}' ’òóÑ犕)ņ ±êMpR)Ruê^L?ìá“ S~>ƒšòƒÚ™êT‚V<Ž $ÕÞ¥¤\T¦ºA‰˜ „âUÄ X°©)]}§úªÒ³°œ±± °JEÀ!ªz–#e`cTÛy6fÝ5ÁT·ONzî€Í«` pJ•~eª[àxY Ø(UœŠ¨tÑÓœª1’ú”²‹ê]%÷𠔇LY”(º?ž˜Bý€Aåº?¨0=ØÅéj‚kª8çd©vı9U½cS*8LÍ™*_ä¤Bq†7{U;P¢_ÀáÄÕÕ˜S~± ÕÊâŒ04Qà÷2ý"INí “Ä§Q¡ïᨒ#¬W‰¢ŒŒKÚ’R?H® {'ZPdR5«‡ xööözÍé—­iöƒá¤×œ||7©ÏonÿôšÃÑe;:sywÞüÚ¼n^žùúÐkŽÛ‹‰9 >Ù¬6o".¶†K"9·oööLsbšWÃÓ¡iÌOÇïöͰy3¸?3ÏŸ÷ðosI|‰6TUfë`'ÛzMS1[(l©$oÛ›«ëwÃѬ$æ (ÿ±iþøó/SŠ Pz¢hùhðñöö|)¥¢¥°HÔ _³„¸î†Žì–®h—lDVí†ެs»A#÷Ù„dßí¶ìª¸zõ€9ôáp0©v?D Hýìù£¸¯ùþ!MŠÓѼ¦O`؆'-¼Í4G‡¦9m?OÌù¼õ¯Ú^óû¶ƒÉXËë÷ê§ãáÇÑE;ž˜úî·öò¦ÿbøÙT×dýT¾zÔák­‡i ¬a1ÆÆµª<ç[ŠD°&B ©Å.Ö°Ab´ÈˆKÃfpq=Aâ¦Ä5âf¼:n¢ { óìÍ ¹„:£Q†$Û x´Ä;BGgÑotD£k°ùÛ~ˆ›¹P™¢NqÓ&tS¨‰E‘Ÿn4EÚV==Ц²Ön®ÚÌÝa›FÞYAA”È€žX“1*;YìõlÃbRˆVò«$1F[Ðg¯åðfpy:êÆïÛÑT¬-Öm ˆvtD½õE;a¨ÇkæmÉËЫv²?÷¿ô'ýíIƒ¦± ‰X®U6¡É#äÈa©,Çûoß~›urèœçÀß̓›Õ3ä„âÝfè—3=žˆ:Ý…ßwâÖ!hy .2&f ãü=kC0YjÄÁ¥‰“ Iñü«{Tïhö÷öêÍþÅäf8hNšß_ëÏOדɇñÏMs9¼±ÃÑU6˜¥ùÛ^´··–œ/hS¬ þÙ?\-ë]DJ¯!tUóÕTtÞLVÛDq˜mžm-•g‹ŽYˆZ#Yì™Éblýn&y OºõUîUɤƒÚPéX's—‘= 7)–‘Ò0çX¿s×Ðõkô;sà•ýÎB4aÒŒ1 ›–ö‡¬1—OžœBˆ§rë¥Ù£“_óàÕ&X„µ4í ËÔL³¶O?Ú¼ã©,°nÚÀºyëæÖÐ*JT7tÈÙ qW´‹˜“vÖQyáð»íƒMœžésýÁ¬glÅBzì »9ƒòÈ‚¬á ³àÕ¡¾Í!Ù´èæd èˆZå¨+Ø©}¹#:°C‡Ó­-·^ÐvDÃÓÔ„»@ëŽ^ÚvDku£îÂÇó‚òÆn=ŸŸícÚæ> stream xÚíW[Oä6~Ÿ_íSFb‚í8—QÕZªjµ¢…¢JS´2‰‡q•Ë4öÀÒ_ßcgH`€a»•ú°0¾žóùܾÜ$8üp19<á4˜Gó”¥ÁÅ2 „D1OƒŒÒ(çÁE,B–ñéÕÅχ'i:8 Ç"BRä]*­6õ4ÃK6¥á¬¨„ÖöÚ„xmý/¨Ìrf1Ë ãQ’¤(NËJFµMTK³jË‘¤Ã“Œ $di4ÏY0£,š'ï/Žåº“…0²¼ztw¬}{™G1Éñ2 ÷o Í´˜%Œe᜛²<¼ŸÎ☇¦µ¿q¸ÞTŽn§IŠN‰ë l"ñØR ³é¤Æ#Ë®­_H<´ ¡uBÙ½Œg€íǶ±Ðn§0–±ÊH¸žÎ`ڪƮ‹›ô¢ÝxÙvµ0vBÃR.Ŧò"”ÆX\¸­¿}øà7é“Í»•*, йSh#ŠiA—*DU9£?ø“‚?|÷FK´×J*0êÒÛ~å÷Ý«!áÿ5¼6ñp¶þäÚ­¶puhðZÕˆœ(¿xÓ³zuf%\†49 „¼9°|T®ÕËdÖƒgê³´6JXÑÒV›v[÷ø 'Pýíp'ømÝ–dá¸_w>†ó7²­?iH ¸U·üƒ$þh4%„…Çrö¬¶1ð`Â^O(;@ûÀea ð¡5æ%²$¢¾¬\Nçi(ª|®JŒ Shò(ν%¼n싽ƒÁßIþ uc+a ý\Ú€ruTév'ÿI”âð×'n~ŒëD5å%f¼<éý‘¯wÂÊ=®÷ŸE½®¤~ÒŽRšƒ°”oÁdQ¶……€{{oŒAŸYíÕöÚÙ¢ƒ„ßãσ°^ÖäýÅä¯ uf¢[áqqšE=Y\‘ „MÐ èòàέ–ñÆUp>ùåÙw"QìØSˆNç ‘9è’î  ¯ù¸HÆœ„®j$ùö&ήï~™GP¿áaø¾ƒiãœG”ùè9–ºèÔÚ%ú[’“ƒ{K³!S\Á'¹ag™QKW(_Ók¨À¢Â‰j°ü»rcG¹‘é5Pò;NeÓÖªÐ#Ån¼®„±‚öIF[¶^ŒøWÒNÕâF¾Âغ¾j˜U'å¬Tµl4žúÂçÔ¸¡Í-_÷´ìUïQ0ÈbR”Vꋈ]{Ðzú²ÕÚkžÎl/AC#T¥÷鼑 îW2ZŠÂ´ÞÃXÍÓº:`Ò8fÙÞ/w ,ûŠ×p„ß¡¦/°ðVÏ«oÝif>Ê‚ýû³¢m»R5Ð4è½Ãц’o ;QËÇÑg”Ö¿Z´Ø½x>*߆´†uk¢N”j³ÒsÕÜTã ÚŽQC—ë‰9YÝÂé>Ó¼5½¢Qül{6í{2óBÑe)‰ÿ[6a>!æ#2a_L&l/2a1‹²8ÿ:dÂHeŒÿ;2ÉdÂ3êžÕfc8…Û<·á9…gä §Øí-§Ø‰•ÐX .Tmñ²»jIÆž@’±#ƒš ’Œ]9µå®ç™Ó¦ÆS?oû™A»ºea³‡ƒÃ¢ïå…íÿpTm Vn“«ONÿ¥6ŽjmDSŠÎ4ô ðkâùý?È/ûF~_üú_(eÿÑ+Š endstream endobj 4197 0 obj << /Length 1146 /Filter /FlateDecode >> stream xÚ­WÛrÛ6}×WpüNM†$ÛɃ[Ûf<™©-çÅÍt ’Ùðf^â4_ß]”H™’ì¶/",gÎ.–ޱ1ã×ÅÏËÅ»kƌ؎™ÇŒåÚpÇö)3B×µ™ËÔx Ÿ²ï—YqSñ4+7­ùyùáÝ5uG«,ß Â€xa€³ Gû¿Z.ž.¼:†»uÍÂÀŽ©‘‹‡ÏŽ‘ÂÜfâÈx––…Aaóúðžw‹ß·îöŸ>Æð]Çf‘»á!ø[}<‰ƒúÔ!ŸLË%YÛó<û.LËBr™áXaºD”­œ®Jž«¹[3€aüIû¤ƒ ŽÈF”Bí6OeväFoáAÅKgŽ‹¹‘í3_Å{)Ú¤Éj‰dì.èÉá —GÑ@×.rß']U«|å­ä 2-/$IÆ;‘ª‰ç¬{Ä7J±#&’ª¨¥uUŠÒ„g7èhŽ…X¼Àc­¼û–oÄl3AEGƒkà'pЫ\àƒ¥kÇA ,«Õ_"éÎå´£§˜šJ³â‡¼W÷Ç`j¨}”kÁ»¾Skß™5Nª|bv¶Ê{q6k:"u¼ Nø¼}ÝT žÎÈþúâæîjÖ~Ås^&§Í5å>ô÷77b,VY)&ÆËÛû+ikÍœœû\4›¾EùžVÔ¿ˆ:ö½â°Wäh½}Ã;¥êj¡02·r¼’˜=:’ÑÑÜèc_˜^D` øÞq­Ò+Í Aà-ˆ¡UC]¥LÒ¬­sŽKÿ~ (_²G‘ùÞ)dY#ÅEw©qC8¿TyµBך¬Ä;¬UíPÍÔ³oÅÈÙåÝirn§…¯ bx,³§^L9ù:-´À}Ÿwç"z=O»]é8@Sü?en¸ˆŽ×yUU(ymù,&uŽHd‚Â?]Z ‹Wƒ-4¹Ð÷V4XÕ¼KŸ«æË| ›MWr&/•Q6¾9¨™9×”2uIϹ%ç a£õŽžùAQåYÛé÷wˆ€ú¢Ùî-¦Ê#\ÐCÛeÆJ;ojDuß~1O$€:A$ÞBx Õ˜ËêÔ^ ¢Ë0 )¹mYpá{e>´,/HþI“éÔ> stream xÚ­VËrÛ6Ýë+0Y‘3!¾ÉEnw&ãé8µÜ,Ü, ’BK€IÔ¯ïÙ¤CKÌLWˆÃ{ï9x´Cý¶úu½zs„¨Äeeh½E!!8N2”‡!Îâ­kôàEyæ^xse#hœç8Í4€þÍ­ÚWÄÅ¿^ý³ ¡KPø:Ë3E%ª«‡ÏÕ0ùÁTY oô€Èž'1ôº[}|Œ÷¼µõãúC‚3`”¥%ŽHúri@¦ý÷äEB¼;?=Þìóƒ8ͽÊOC ?€F˜O…÷•KÁÛoOQç‰&9Iþ3D-¡dfA²°Ä„D–Ð;¦ªŽ·šËfBê‰ÜtQ „Ž‹ÂýÞQ?*¼o XĉGM?ƒþ@lèÉ­mÕ ŒzNø¯b0Âjª]œ¿HJv¬avľ·S *}m?˜îx¥Üèö­ý]U`î#Ó†(¡Ýt9Ã%Jqç–˽¢;6+ÂŒ(ÅQÜ&1Õ›p2HˆËÔí#¹ùÂ*ýz˜&Ó©-£ºÌLVR€|)!Þ/¶ùýþæfŠÌ,²ÕXñÙ° KE»§h8‹ã5k´ZSÉNO×W7wïçÓ+EËhí:Ù·xs\XC+¸^Œ¦õ—^é2ñ~_X=0|Ä‚ÔB1„Ü]B:-Ø «áY38KÕ¬6»ÔœùZè‘u?#uû<ÑË<•¦Õß ±•ÁÇÄÞ"ÁÌ5rñjs7ÒU·ë¬ñãȃã{îŠ{éjËÇ÷Ö3û›8ÄCäQîݱ¾£§‹L2oîÏq.#GŠÓbz žÏ›\×~7½ƒƒ›Ii[g>ÐY Œ¦Vî<² V°'+òiãC®£Þƒ©»,{ê¢WtpOˆ¦käÁ!‡u‡ñ¯Æ3Ym?m†°¶o™èÊÌïßžø%͂nj \^ŽLâ¬l©‘í­²S6ñ ˜g¯\¡[Ù=ù·6”¯ÜÉyÎo’*¸5<%¼ ÑνÏšV0x‚©…œ„°¶v^ SÇ•µ¿áéâ§)ü×ÿE8ϼ|d>í¹]x÷&2O"pFæÞVv‰bxSV¢¯ÙiàÖoϦϭdØñ5ÛÒ^¸cÈÝZS!~ØV£gö |ß endstream endobj 4217 0 obj << /Length 1606 /Filter /FlateDecode >> stream xÚÍXÝ›F¿¿Âºc)&`À`U}¸¦¹~(¢Ü5R{©¢5¬}›KY|9ç¯ïÌ΀ïÃ8OÕIÞÝùžùÍ,Þh=òF¿œýt}öòr>-ÜÅ|6]¯F¾ç¹A8žï΃Åè:Ý8òò]®›É?׿¿¼ ý½ãÁbî&^ÌìÁYã¡3ù·O Jö¨¦AœX²é,†Å€ˆ®›õ¬›iÏbç Mƒyè¨L–XiÔÄw|ÛÒFš c¤¡½ÈÓ%¾GNs+iñ~*î•-Ÿ~/'³„¨÷ \¼Ã²kI»dÝO¦¾SÕÒEœCG¯è¹#n¦hÌ(ž»‹d6š‚?QD–6µZn<ÍAô%¨rM¿+û[7Ì^ «™“Š’¶Dn4ñ-vƪLk) ÐiO×ôgò`§aêmºE#XS‚i¨©×WÒŸƒÀÉT-ÓM=ˆN/¦¡‘»‰()¶GB:ƒ°½…$QÖðDÊ6 ðÓ*Ï‘/X'¹›¼A'a·OÞGzЗ"Gˆ†ø¶WGƒ3‹»ŒŸÍÖ&‘¢u·¸P¤=L5\²U 鏯Ðe—9Áp¹©p¹Ÿ‰–aM§p:¡5µ Ä”Mæ–Ÿ¹4Iãžà€F¤_ôWè ß49€‰‡ ¤F/|yP3»>ÜùÉ.K€‡ú„¢Ou±T¥<ÒCPÃWšêOÃèfÛ&õ<ßáP‘þšö-²[Iü¹É¨F9ôúþ~7–ªMzûU×}ß Ǹ^WØ;l…G<Dv"€ÜŽüØùmÅ´}ya9—o®^?ÆÙN P-Á±å“M]´]Ã4}DD¥fÿÓ`¥òüèLÄqÉÛ\ ô7/k•­%'ÊRp2ƒ€TP;L2æŒ÷ÁkÜ]hÆÃsi•«jì©j—Ñ-Ê`¹±PÑtˆ…è´7')Ùëv½ëÓ`EE–¹¥VæHÚèÞ Ç¤‚’G¶öVetM†‹µè& bÞ/T4µAšÁjÖÂ4Ǻï^pÜÙvÐ^•øòÆ5y0É0kêº.DÃðÿ^þ»;¯×x²÷{&÷~öHi±dæžj™›Uj@[ènRx¼ÕøÐ (½½–X÷¯f¬(x{%OÃ%MÕ·c©³ùBׯVÚe” ÷!ÀOFÓYä& þña² ±ò©oûâØOÜ Iˆøâ4£‚ÓÁÖâ”k…àßa.Vñs»zyr}¿k=–ðG:~ýþÏÇQø®zD®¯ª»{ó0ƒ*¨örÓ^Üy‰nw;4ÏúF.ÄÌ€ `à\àwŽÇb0Ƚ‡‘¹”àèŸq;Èžg“á5]µÍz<ò}+fó°Ó vƒ÷œáRÏ«e‘~²Õt¶H=èiýomö«Õ’By† ;/h;‰iOY7ÇÁž27vgÜeÄÞŽóîÕ'ÿ1’'Žÿ/t~ó×ß'¨Ì"»Ïß%ÒÂæ;õ Q^_Ÿý‹iaƒ endstream endobj 4296 0 obj << /Length 1077 /Filter /FlateDecode >> stream xÚíšMoã6†ïù:&@­•H}çc؆ky{Ù- FšØldJ ¨Ý¤¿¾T¬$Ž»ØõjOE€ØIg8ÃygdÏY;žs}â|ž¯N>\Ô!'±ï¬îßó\DND"7&Ϊp>ŸÞˆÏ~_Ý¾ÞøáŠ&Nê¦úªî&Ï©›øtwýÏ£ÝåúÙÁÞUŸG”ÒÓ¼l’‹uÉþƒ|ýUùÄ%Aÿ´ó–—Åœç7 {êïò÷|úK¿:ýç&Žì¹ûº¼>é¹$=° 8°`ŸyÅE1Ù-´1Æ 8kKÅgUÁÊ9ðõæ®2g§’mO$HbÖÞõ6FÆÇ û^¶b ¼a?~ú£}/tœ•8£äôk÷‘ÑqÁ·©-«M 1»¥q‹²RÆ,Š`- &8ç•ñNyIÌVãeS•DŒYÍg¥OIŒäˆ`,˜b ¨æÈÌsw ŒO Šñ× Ìmk½L(\âírq²ewŽûßiX§ñ/¥ áùì’áx¬%4 ¯ÄϼIÞjȸ,gL>ØilÙšT¢ù Kp‚­Ð¶¼Ã«Êb²ab ¦8ß ¼…„:›¬0ÓÓ¡Cu ¢ K£Š6WG„hÿà[–?dJ²oÆÖÐ!q¦d2£L@N‰ÿ j1g|}mspúQŠ ÆêOÈ• Åó>ÍÆ s`„Q<­°âëZ²z3euÉrÎ,äw€Sû76&†8,Bq¬lšÝ˜Ã†eV–Å8Ø*›_šÃÞ§øáç\{Ý¥^äQèê[_—`“„„ú˜& ¯$XøÃ–»ûVµòØ>ôß,Û?kÙæLTÚ#á™iŠ9Q4ó7þ×Úb€ðId¹W|§ža-B”Œ…¨”îÆ"ßXÌ{|LÅ9—¼XÃʲYB§óA¨ý5ã}‰¡ëbw#Ý„ïPš5j¹„ÈFaçì=²åNÇ ú¶€•d¢¹iK‘ægxâ#Ñ™œbÇ× ^°ú8.øsbžÕ(q÷‘Ém%žr¥¸^€pñ6|Á#QgÈ+òr{E¡Ë޹ ¦î¼‚§ìɦÀ¢ÄÉmÅ…æøò)&š§UÎJ­ˆt›m 1–ÎX]ëÍ|VcæDŠ#þÚ‚|2§aReƵy3ÐJ)7'bÄÙ|®ªç–Ï\Y`Þëô‡žÕ«A?Æ«˜„]•[Â}7ÆÌ̓'Žðƒ²!ò5€|›‰,»˜94ÀC1³Á”ï±WÀº®¨1ïÒ’!ð¡9Sqvü÷Qfím/‚Ʀ¼““WŸDö*ߨWw{Ãvy[þØä¬>u¯‰ìñ&¬Ì õ–ÝeܸA¦˜=»¸¡kÌfióZ3øþÇ›PgDB·RrðëŠËÕÉߘñ#È endstream endobj 4193 0 obj << /Type /ObjStm /N 100 /First 995 /Length 2412 /Filter /FlateDecode >> stream xÚÅZ[o\·~ׯàcûÂ%çB#@Ci¶0l#hkøa#oZ#†dH2šö×÷ž¥,ÙÖÑÆæÆ¶f÷ ¿3Î+ÙrHAråàÿ@H`"'4ˆš%”Ôyj¨ÒY°Úµ¥YkȹøC¥zJ@©ƒš‚jÍ©fQ¬Ï Zö¯°T¸:e ¬/°’/h@×ê €Q(fÁ‚Rü XŸkö@iXRÿïjT]: ”¨çTM€k ±唋NØ%Q2§2(•Pˆ}û””ô ªõ 4uE[_[á`Ø ìD“*«S`«Ð¹PÆËŒª¿B@¹ò!F ¶<ÅF3dE8RœâÀâ;£ŒCRé+,pYV´À•œµºx®.ˆwdUßAxnËS|¬ÉQ\5Æ}-þkÅeÆË5'G& Š;Õ‚rq©8Õþ”sЮ*¦ uyÊA[W–•Ô×bû%/OaP‹JqêДËŠ߷PJs>I¡;ŸäPZa¼öWSsI±ýJËS •‹ï†UeY[B-ìòÁZjíÈb¡Z?"iÁR¯Âr׋æ`Ôü<”‚I_ ã5]žJ°E*U?Ùþ´kÖß’Û7ÁÒ-È-4îçVRhÒŸ–° ßì­-º‚àmÑ^”SbßP¡ûeuqëbƒ?§E²WI‹hŰtÀ°s2÷rÿ‚¢èäÑ£“Íóÿ¾Ý…Í“í¿v'›ï/ίwç×Wî*ßz²yº»ºxwy¶»Zܧ÷×Ý«×Ûï.~ /ü‹+¬^žä«Á wÆoÏÏ/€öb "øj "{BQQaƒhxyòÍ7·„í°'›gï~ºîŸÿòúü—“Íw—¯v—]¤ôró§ÍŸ7ß¿Èýƒïâì:¼È¹F˜šæ“»}¶èö¬Tci ¶oãGaó,l~¸x~6Þþ|O_Ÿ¿úq{ùzûÓ›Ýén{ýîrwõlj¦ÅFѺK·H=\Åe1§˜(ß+ÔånûêÉß~˜'Ì&º™q’Øå»08ÎGïäêlûf÷óöìúâr¦V4E)CÉ96úW’fF:±zsFYr,å+œ’SD`½9#d¶|¥3ÒŒ3ú\i‡²ÔOÃæïÿø'b_ô¤ZI¢6 çïÞ¼yy/3ÂcçgLå`nìAPxÈJD0?[¸Ä’ëq¸ážãæVb²CuÂJ;=),z!rnX’ñ¡rSwËCO™=z¢ºÃ}ŠØmöe…Ÿt_vŠ<ë‰bù€R¡å=à©gU6‹ÆϽÌ=º‘ož\^œ=ÛÁomŸ†Íóݯ×f¶Òp«§á¦¿- ßÖD+¿Á½n3µ•Z"Šóãp#œq¶¹Õ;È5z]~7yHÓC±s6à=¦t×znÛÕSºm/wLés‡RùÈx¼¡ø\ãñŽæ`ã¹Ã|Û„ì8Ü0ž¦õ@n7c:Lô.ìËbÅüÎGïæ:`"ú°H§½¨½±Ü<™Y‰3*ñæÝ £ôF×ÄÆÕ' bQ¤Ü[:¼Ý^Ÿýû?—¿Ì­í¤·ÏŠêÅÛ£Ö3+k‰h ï/î¶W×»Ë×ÿÛÍ%“EoßSF‹:ª¢öE·‡fù¸ýžJÙwJhT#ù€Æs%ú5t™^ßß)í ÉãíõöòΧ‡‡Žü‰Ë eÌM-A…s  iü¾“ü—î@¿Ì½Û'âw“ÏwoÚ·Þ>ÓÙeu6ˆ¶'8 bDÑGtàÌ™2dÈ0Ó˜|øp0Re…bêŠ4SœF‚öa >Õ§„Ó€S+1#+BÔ‰BTh¡XaŸŠ*,[¹OÅ34“Wì2Ï4̪=- åïX¤@…âV×¼Cgž‡wô>w. ƒ·Þ ùõŽ z¡5ËTžï¢¯P÷Žn™.”Ç‹•ãHt!àª|ãq£®¹¥©ª€iªß¸_´}´ê•¶®¹’ÞL£Ð轃@Ф•+,Ó¯,à´ÖV¤à‰š@ §Œ¨Åž;$#¹L)ÚšwÌ”a(‚ñ×`˜C샑¢¿¯"”cq»Ü+›®´f—S±Û Yünu„m†³”µˆYi¦"ÐD xáŒîf‰*56q¡¼Ý±û…°4ßAýjï!sCÀL­_mä5»4™Ÿ:P¯Eî5 ®k•î"'xØrBB®Û Ëôœ—-+a;×6?—£ˆÅæ>—£h‡P+±*óDUd¿LA/€Î'JöñtýpÚÊ+Nš%A „ßÔÞHá7]k2Wн‡ô Úî!=…y“5ÉåÅ¥Ë-¡ óXõ;B6‡Fñü±W…_‹®9ˆ•™F†Wu[X <î Q¢µZwfèÎè]¥-!‚ºÑ꺂dµ®É2_Ц+—÷ª(†2s­ÂË:_A×Õk«½øº®ÕVD<¿ìÏÌËß^؈ÿ\ËoNÖ¤Ð#HA ‰ÝÞKøÅÉÖ¤¨G"Y¬7Ež_Ó·˜ÖŠ<š9¦`ƒæ=hex†ô:WðÑЇ­šçyBB¶¤z3°V”‘í€Ì”‚-úMË–ˆ{LyxX2µ®¸QÅ~Zr£Š‡¦%¹Í´Š)ìý¸ IT—ÐÌBOð6/3Å,ú³ë…·@ººZWLÌcÇð_oŽq‰x¿®òð¸„Ê|«ãñ;o?—‡Æ%<1 ‚4{{¾—,þQ—”™2˜õšLK|”–ü§ŒMKªÁ$öÃ’“@àÀé¬11}ˆšO_üÎ=šÿì¸úodüÒŠYɤ–`ûÍEdöÓY™ªÚ|EŒ‰x ŽCIÙg%HÌ,4GîàŠšÎtŸ;¾ ™µäñ¾Æû?V]? endstream endobj 4394 0 obj << /Length 1267 /Filter /FlateDecode >> stream xÚÍšQOã8Çßùyéší4i¡¥ÐUË¢6pHÜ ¹ÉlÉ5³v²¢ûé× …-ÜÞªcwáÄCªÊø×ñŒÇóÇsŽçœœÄ†AàDnÐÀ‰?;Äó\æNHˆ°È‰Sçöpt18½9ú;þøaè“­Á, ÜžÇôTí0FÍ o3»ÝÛÝa¡†N‡†úKöøO“ìA%¼„sàÕŠ—?¡Üþ±™Vÿ¹=G6³?~œž8·ÆØ! ¼_±=§C¨K—ÌñàØœÇvç]梺YÕr>K„chHP ¥aowÖ´.,P”ì„"Ϭ'ÿ)yd/•èÏúã¶…yÛàüm\;Ÿ˜uÿðH*µ´=ßO¦;.’{!gPu’œ+eì¤îî>âÊíCžxÅ5×<,PÄÔ’Wo&?ÈY±È¡Ÿ>” ³æìÊhUr©À=ïžIQ›g´hwè‰ÌÒLá3H(°Ž+Šðr³Äz¹ûñD¤›b‰ûRŸ ‰ÇJñõ§y³ïL¹>ÂÒAÕc@›ÒºÄÃ,¯@Îò,ÕýbŠ ÉîžAÕ.©qÈz=l´â pm-$^„£,´3Q49é­°q¦T }!dš:~•½ááÛóëá¨ø,ܧmc ¥"†·Öz_GCÔ@¯\ý†äÈ&´m»‹HO:ÿò<«ÖB¶¸¯”¥±(ÿxšÕ{ˆçQÃO¡à+x>|¬–™z˜t–ð†<©„4?`}„©OæYžé>E!§ ê¼²À!Bw¶·¬L»ˆœ8+õ~±«h€áÅÇS­q-ý`ŠUÏTîsò5§"¢'e»1Ía> 6Ôõ`-áÍxM†Ûlÿ!ÜbÉ ¥+û= 4vg_•éV©m¡'01{©¬^][ ƒpêI÷´ë+”J)Ž:Œ& ”V´»uú>²´ææI ôPZ©Hg¥>=xž¯¯¹Ìø\ŸÑ–i!BlÒæì‹K<ŠROKm®#^.õëç+>¥Ìe^àtCâFQo#/âOXÕæ¿!Ç‚§Ä»¹Ûxܘé8f¿–™˜,Aš3‘vnjs^„ãÝ@¡3¡¹`ñ0¸Å…+-Z¾™·Ä»‘&&Wãx¤à‹]¨bª…g­Z AˆFíæ0aͺÛêj˜s)ž{ß5Ç1<î|pwâ£ÅoÆ’—ܶOfŽôñ–ê²cw+¨xj·˜ô ½ym†EsIÀ­ê$8òñR¬-™&•yÚ‹zÈнà…P•üQ¶0#œ}¶-(ê!³Ðu¦sžJ̯"=†~[@aŽCm ­!²¯ÐuaÑòBäí.—˦”æ×»êêz"…=2Çak|Uæp51§1D‚is©U;…¨¦aÛªÐ%y×±fmoëd½?•KÿõVÇ/<ÙAÁ«å‘ïZ7ûü¾‚Ôg¾ÝÛ"˜µ¼”¢iƒZU©=Ì>X6M»N¯Aí;æs°éNF{íò¨*ö?#ƒ¼×uûÛßC¿{7çÝî¦ßù’¸5z­šÖÌ/ˆ1м%n\kGE¨œÑ&¸l-eÌ}ØÊ¡<Ί%¤ Î\ÓøÞ¥È×û°1üßÞ?ÿÆkà×ÏÓøà;þ1h endstream endobj 4299 0 obj << /Type /ObjStm /N 100 /First 1018 /Length 2715 /Filter /FlateDecode >> stream xÚ½[K‹]¹Þß_¡e²ÑU•ªô303ÆI 3ö"‰ñÂñ4aÈÐ=Øm˜üû|¥sêt¼°ÎF·Á`Ý×§ï”ê]jáÊ!áše±….Í$‘-JЬ¶¨¡”n‹Zʶè¡çŠEKR5 F8ñ+d.öÀeü²I 2~Ú4PÝ~[µj;µ8%cÑZ`ÊF£õÀFR¸§À’ ¯S`•„=:ƒíà^ðiKš45*Ò:~{9%{[u¼Æóá‘°²½)Ù ûd[á+RÛ+¼,Döêö)@ÛöÛ4m¿mAI õ C|€g³ÅÒVÔ(c•ƒ¶T°IО»½§¡$F¦ Ûæ™ ÷l¢ÊÔB‘:P:ÎÂHfNpö”L¡´ñ)s¨iû4‡J¹b–PyûTC•Ì%T51g®¡sæjK¯‡ÚçœpàÕ~‘)4NÆ%shYŒiΡIUì j%Ùs@aZÒ5œ‰ááú&+lÙiHÝMŸ öºÐ8 ]Åä€^†œqd½¥~ÇÓûØ_¡”†(:”6^R±ÜˆIÃRÆIHÇr£¦CW‡(”5m©ÐVJãœúD$ö@ }¥Ÿb7Ú*v#{&ÅnTš=”b7jdO¥Øº.ôöÐ ·˜i0‚Ý8„‚ÝxSµ‚ÝxÓµ‚ÝxS¶‚Ýx#Y°[ÞD¥¼É–Ey#‰ó…’P"ûB5K,ã †­4J—/.×·ÿýí.\¿¿¿x¼\ß|ù×ãxý×_îÿs¹þððéç»Oï¼Czýóõ/×ßÑxq¹þt÷ñ1¼ÊQ KàÛ8®M¹–HEñ½ïËáú&\ÿôðö!\_†?üöáßwÏøÇðÝwü[ÀBr4K©Åbö[RdÂŒ8Ú‹¾ƒœdíôE Ø#4,–6!‘é¢à¡”O¢È¢¡‹¶E‚Z@©áÀb3ŸÁ¼04ÔÔcÂBWÊ"µ(P~¸ïX²9x6 ÙÌ”Só:P‰¨pÕˆSC=$ixšXÓTº^ˆ‘ÌPwY ¢B63 -18ªëØÍJ)E8ÿ¯Á̬´ÔB5³RDÇ™°¨+C[dÄ †¹Š™i…JvËhìtf$VºÍ Á#„s&ÃJ!FÐa8°2µÒ–Ö»M¦»Yéî6L¦VÚä²Hκ=É‚*dÃ3+Õ¢æÈHE‘7@Ia¥°NKÉ‘B6ß&Á²ÒyÃÉ÷Æ ;íÃ]‚C4uÆbe4…Û4GE¥Ç;U¸Í„üºgö;a¡i½· ­±šîÞéžЄE¹¡BQþÏP! ›‰¡"×_ÈŠjÉRÙØÍDF®gy'ÕÄDòR[‰”=Ö#ŽYÖÝ#O,äkÕ|in§+ ׿ÿ㟨&¢eâ•%*JÆû/¿þúþ›_FÁ1¾­ Ù ﯾýêáþqPxeÕ÷ºýîÕ(d{Û_Y“ŽV ‘¿@áƒÅ^ñúúÓÃÇ7wxðp}ýòU¸¾½ûý1¼ÿZ–¯ñ€—ëØøîþñ³•ºb¿7‘}~øòéãÝx·÷þv÷ó/~xø= )” µÛÙ½þð ¿GÞ¿8Nè36³ñõò¾ _°/Žïˆ/ÔÅÕÍ}_#“#“#“#“#“#“#“#“#“#³#³#³#³#³#³#³#³#³#³#gGÎŽœ9;rväìÈÙ‘³#gGÎŽ,Ž,Ž,Ž,Ž,Ž,Ž,Ž,Ž,Ž,ެެެެެެެެެެŽ\¹8rqäâÈÅ‘‹#G.Ž\¹8ruäêÈÕ‘«#WG®Ž\¹:ruäêÈÍ‘›#7GnŽÜ¹9rsäæÈÍ‘›#÷ ùý¯Çð8 Ô ‚Ÿu-,+IÖ&ê™g™ZYè{-ô"†‚à§ÖDè`ÑC©=¦iºX–SlyªhA4‚(˜bGiY¿·6cQy¡(¬¬†ÙüQT¤‰Ðî‚^uVOÕ…™šÅx¬’yˆOˆÄ ¢«4gé"µh"pC”q­°ì Î²E¦•Z±ˆ"WUx4&ˆ$[µàÿYm¹0{'K”µYEcµ$¯ª({[)3¥X( ”MH:´Â3 „Z-×̨ٚéúsqÈà«P…gkÔlSƒ"—Wž‘X¨—LP ÄFëAÑî( ¤òÔgÝÂ*†áºuö³ÄšL–2‚„eò3 ­7PKæ¨ðY‡ZæŒ 29•AFfݧbç­ƒ¯(&Ú¬’•’°.‹:jËN6rŠ„¼NQL”:!±²+éÇ!¨Ò““^"jÜos¨+9äÕÖo°!*}²ADÈgÖ$N70P)Ö‡}B#l€aQl::H+ ”N Ùk¢Ñ ³nƒÀsõþl$àÛȧFëö@3ªŽá#Þžµ$‰Ö'VVQ£œò¼ >Âú,¯â…)¦5@ǘ ñ»÷a¬ÙÄŽQö·™(2/¡‚¤¢¡ÚcDn“T¢ˆ"ô™H¸Ÿ°ù5ª·”FB†óêµÏRšõé„Íó¤=‰5Þžå¹EÖgw6ϳÂÞËT}ÐŽ‹žÖ‡0TÌð–mO­p@…cɳ`ž–¦Ûj³º1Ð3wÉ jQmʘlä6ëΦ('ÃE¥ö¤œ¹Ežwªy}<·^L¬CVniÊ¢®!y =ÛC2eüϳN5­/ÃØZ½y–ÅÚf$ÊÒÜ$Ì@kÇÔ=¹a»‚ = d6ÒëúÊEºÈ”¯Ï±,¤ÕV$‹íý:e!7P “BXßÕ‚áÃú¬.^LbóYœmvSŸ—d#¿ ]_•Ú Ñî±mµ˜ŽAcJÏ5ËñXfƒFJåˆeLÈÿûLõEuø¨\ÿmƒFá) ¹‹'UžX˜‡s|&Œ\¿ÙÅ-…{à²åœDcÆG:I÷ò-D¬¥§GYh-¾:á°rÀçeYce!Û±XŸWrÔ‰¯èº>ÉCFÒ#ÉCÆY9Æë}¦ÏwŸy6b$Jëo yÇßo YÇ?•iMØÖßÍðŽ¿ßÍ8oùK¹‹½å°8mùË î´yËßï´Y˿ҬÅ,K¯P5btôüɧŒž¿Ê´Ñ}ƒkÞó÷k§MR^ ÀWVæãòiA€Oò\Å©³ðÑÃÁâtô°òZ[nðѹ³ë] Ó:=ô\>õáƒ_>=>t^o">}p9Ÿ>ô¼þÎŽüÎŽ²> WÎ}þàÊiójS²þ¶£O öÛŽ§Z™YˆXkB „XÆõ|±–…æhMã#©0ûc‘³õ²ú"î>ð{¸§äAëÖ>‚Øý•M ržrhëo´íkuÛœó Dïëcé>ðPz:à•)ïAb›@$Î&œòzǽO ÜoÛ±’ÐèÄ>8”âlŠíç± Ž9AðÊiŒˆ üDNG̼ÚYù½Õé‚ór‡éó‡ƒÃÙüs½ÁÕìó‡ãj ÛÌlÖíÎëo‡ûüÁo‡Ûü¡¦iGñ`ñ?áe@ endstream endobj 4498 0 obj << /Length 1459 /Filter /FlateDecode >> stream xÚ½Z[oÛ6~ϯÐc ̪¨«Õ—Áqn’Ö³Ž.ŽœÏ Žý(~ Ús:ÄwIm1WTs*†BjsÀ8î–teÉ1&o 7^òj9!–˜Iˆ ¹ÅôÛÆ v̈Àgø¸ƒüÅó‚-^ØÄ[ ÔŠ±í›‚ž“sRq‘÷EUj¦ÆË 8´K¡Ò\pÍYùF½<ïÝóe¥#VVBñç¨×2¯ËfRëŽ`̼7Ÿ+6§š}_)V–\Ƹ‚*-ÝrEUÉÜËèBÉjeŒšb|Ë·ÀÕ'Ô>-Ù5Õ³…)ZàcИý»Ùƈx17Å辂®J–­Ø ¼ìQÁÀ[ñïø=¬2â¦Ñ$|U KšûR l»?s©îL7³QHˆR„@¹<奦ÅÌØ•Ã.•Aé׌›tŒ12ÀÊN…4¡Ê “Îi©Gò[6£‚pøúR)&  ²ˆ¼¨Ð{%iÞ+ y7(rfì äm¶ùs>¹cE®™¦çàö•E 0ä®9„9sEF˜ 6djÆ Ý›Ê[sv‰‡G„´¹UjÆ´92&oKVårZ‰¯-']Ì‰ŽØ¼vÍAÄÍëp“0FÃ~oP@žRV¡À[Á¹u•ŒÞ2ûPà£J0Ÿß+Z@AnÞD3úc•CþÏî–S)® !›÷$¤Ý¦ä–—ü¾yà{“j¾£´j½Q-I¥åPòBgüž¤Z>¡j&s6(n›Õš)­Èb2ÇÉŘ}×PËJã‚ÃÇôû'‚ξöŠüÏ×΀l ¾ÑО÷)Õi®ÒÐ3hDΖS–çÐþ|ª´àLGñàÐ¥:åËl%¸±É† q9å«]Äœb„ð‘™,´‚B¹£ Z*cÌÝûƧÿ?ÙƒïnàÅN”@;˜v7;=_BE²¤ÆwÑÞF¤î>álÑþ¶ÆJ°Ê™bš ¡Ñæ¡aÿk“Ÿ´Õf‚a(­rØþš¹ÁìLLå7´ýÇ fÛ*Ù /B°{¨Êí¢zÜEP|Ú·Úp%$D½„¶G]IàjžOÁêåø“¥_‚1ÖA öC|ŒÁ–ÐÛYF7âcB鱞!†çvleK5ÀìhlƒÁö7(-3ÈÔßì 1äŠN™ØÌ&!Æv×ëþÄcºW¼øÊr«r‹„˜süøÑêãA®FjaxGŒF‡RÜÙºd‚)®jÀ6Ü1ÁÄÏçÌ®kO3V)ªÇ ¶´è+¿Ã< h0œPÅéT´‘FüÃtÂïÁ\ëKtè.-†ô˜ 0…Áxÿä,Þ¥ùëMUëõÇ•0˜)½?ÓŸî»Hò“ [Jô½wrLZ—º/húµ¢Òƒ?hÏÿòTÀDYÆiúÚ ©­b¶Êdpñ¼!Ç-[\7lU`•qŒ9ÙzU”ÀªäÕ}€¯áuõóã[÷ŒÛ—ˆÓVºÝˆì>NðãäõÇ{Í5ɳfùÌξx‘÷ÌdN"ö—7ß‹í ©óɤ‰‹Ù=^#˜´X®4D“ ¶9&¦F¦Lˆ\ÿÔ× 7./e²·ó¦«u^–Ú]-î„l+;cªvZºõÝþ)ÕÔjŒa]º9À¹7Š.™Û|˳ÃfÇÑâ‡1Ü+nôÂS´6)E‡ØÔ¦†?œš»O‘3(p«ñ!]3ÅëÁã>…GoSøKÜÚTzb¤ô9›¼9xuÆq6>ú0{¹I endstream endobj 4396 0 obj << /Type /ObjStm /N 100 /First 1020 /Length 2769 /Filter /FlateDecode >> stream xÚ½[M¯\· Ý¿_¡e»Ñˆ¤HI€ ‰á¶@ ±i /\ç¡øþÒßCÝጳ°œ…æFžfî½GçR$ÅM•VSIUš&’êKlÝ-ÕÂ>èIÅ|0’ÙÀ —Ôç¥Niˆú€•ãš$â"wU@Jóï^ùÈYñyzKÔŽ«=QoN¢Ä¥F£$¦‰<4ñAhpb!\­£%®L˜cP’ÊN߉ªÓ=‰uç2F3¢”¤æ#Ð(x¬Î—c®>ò)«þÑŸ­“›ÏQ @›²‡[zŸO@&…ÌG#)Uð«T’rwd¢¤u2%NªÕŸÀG5—i¥š´ãfŒ4騌9ek€QKÆÅPO&u¢@ðµùl\°ó*S²V^ßúqUR+¯ÕhÎËš·Ž9ØRsBµÔ´Î'zjÖ&ÞH­OÎRRóªÖy^Nç³"©Ku¦P—^›¿9ª¹¬ '½Íy±´½Ï÷•žÆÁJF49×’7¿¯B…¦`A! ÇÃKs}ÁiLU«˜r ©˜Ô¨›C‰ ù4´¨ˆø4u`Xç Z0Ôá J6q,umíæ/¡P×2†¿£B_‰Ž °Äf˜ *…/0©¸Œ³‘™ I1õâf£1o0r30gf˜ù¸ÁCÜΜq=nÀl¬c`6 $q‰¸Ï) þÄIØÁ| ˜ ØÎ·€¬ðÝ”CÃl¢âÂk˜Mì¸Ám±M9LKBwOžÜ^þï×ûtúöÝ»‡w§Ÿþýq~þûÏïþ{wúîáýO÷ï_ø‡òúô×ÓßNß¿¢ùáîôÃýÛé”:»‚ i6_9)Y aÍC;îû6=y’N/Òé//ÒéiúÓ¯oþsŸ©ÊŸÓ7ßÜáß, Y™Á‚ÁbX Xð‚Eç},àvr…õó Ì.hÈÄM] åÖ,Xu£,jÇìp™md(\˜fÆ_î#wµ Yd›f­x÷vÖ 8wgÓ²~•³Ñg$T2œÆ—I4ÚHb`28^Æäî­´hvʵdØà—IŒJ!‚7‡jB"ì.YKfìÓÌ=7[€g¼(Šذk–\|=ȲŽ Ú¹ Z]n ç Wå¡— W¶bÁöÝ,îÊ;œÃ±‹dÁ6Gƒá–,êNÐ ¾l`f0“qv³\VÞ[v’¨ ¸ƒ´eQ°‰fö-ÞZ^j…èþ-„°ðÇ—-„Ts««}Lo°0×Òõº¶‰v €}FB(¯1Ê l›‡šgEl•Y{Xý‰§îù†ú‡túñŸÿBü˜šÕ¸BÝkz÷é—_^ÇÍÏÞ}œ¨Ï`ަ9ŸzæÑi¹|@ KtþàáŽïóçKˆSËñ€§çïÞ¾¸Ç«¤Óó§ÏÒéåýoÓëßKç9(߾Ǽ÷ï>~ð¬f>ïBøððéýÛûùßýãþ§Ÿß|÷ð[šr3Dâmø>úüÍ{<íy 7N™ÀÄ37r>35:z ŽWšyÑy@1àH j 4ƒƒƒ@¦@¦@¦@¦@¦@¦@¦@¦@¦@¦@æ@æ@æ@æ@æ@æ@æ@æ@æ@æ@–@–@–@–@–@–@–@–@–@–@®\¹r äÈ5k ×@®\YYYYYYYYYYÙÙÙÙÙÙÙÙÙÙ¹r äÈ-[ ·@nܹr äÈ={ ÷@îܹräÈ=G ‡YÕÈ#Çüz¤¡¨"¹/pƒ׈sú™gÜW…ísÆ `oNf=«'¢£e¹!Á(ºrÆÚ6’ áU5ìËÑH@Ï‘çÞV¢0ÚÉâ¼ µf¦q]OsÊJ;wè ÁìðÈst©;Y°'2p†•0_Šx 9µ±b±‘„§ð–Ú´¸(˜òÀn§î;Ub³=´Þü¬šâ%¾ ÅX¥5h­`3Ví€z4#tPöuµ$7XŒ ›äëZ ®§eäx R³U½r@XO+ûÜé$\ B™³—';ãõAÖ:T¥ÞoœžbÏjÐÙ8j²ò–²Óe ‚u/¶w8Omæ»@H›±á~™DÝ)„úÃËù Ù>¶XÕ9!Ùo‹Å¨m¿@•;ÙÅA æÉ ¬Kaä9õ, Ø’9LMÞÇÐ7±H²mãZWf‹‰¾×¹³§-ˆÞ ”öX$<ÁŸ%#ó"ÝŸl´„쌨Üy…X° Ø9¢Âê õ¶òH$ÂE œ&q¸J)ò2ÌjÛ’ý¶!½Ï:XÄ2HP¿RÛj‡RHóB$Ÿ­C@ Þ‚Vý•ýq¶|âˆsœ- ±¥¬ª?zI(L³~& ˜jã%‰±ß>¤b77¨ ÈD—ýœVöoÂ-wo=Wƒ…tÄ ²bA7`Aš›G—Á‚ ŽkÙÛêûÓ/ï°©g¢çôK¨æ²Ò ܸÓeyYšg‡M‰QÎ[_éß"ÜŸ¶qÍʽÃfm%‹­ÑÕÙ[°¹ .Y9·–u™‰*íßC¼Í×]-Î{ˆ·ùd‰Ò Dá-6,ˆ÷P¨œ[lËÚ@Ùo!Þbÿ;}Ï[/”z0Òžá}>ï°y:ŒLl”:;l}Õvåìc³Áæ-®Xo°­òa®û—cö×f½èXŽÙ_[V'ô’@nt•Äü¾,$!7ØLg{mö=`s¶×V%’ºs/EÞчí5ósðØ~`ÇÛk+¨tðöš'Å¡³½¶’Ä bÿÙ^ãëjxwm¥;ûŒ±F{íØÁô«íµjûOËDm»œ÷©mëÎ#;+/Gi¨ŸÄ2KÛ« fgÔíV/lwî3¤có”U”¹³º.pÕ:«ÚÝÝaW÷Ö‘Á8iÕßJ!–ÂËd$—¥ðÃc¥c»Ü2ýiˆÁMsa™Fû!Xñ2nœ!'Xfí m0ÝnJÝ7y±ì|nÊ+ý²,õýçØþ² sl ½P[M¡ºÿ ‚¶ãèRDð~C­Ë"IÛï+»&Ùõd¡7j_ÊbÜ@ØË™®¢P7CW'–npz ®¡š\Yx Qú#ŸÞÒYEÔËé-…óný‘o)áï<5}ÔQöÞ—<òé-Eî$··”à™>Öé­ó1äŠÜ€Ä1ä:òŸåA¶vÍëÛzeÑi¯DQo°ƒ¸¿Ôr= ]›bGYÕ‹v¶].,;êõ4]µêæ#§“ÖóüAH%„ çÂ{Aêqÿª˜i¶ßL+ÃOÊõ<ÿ]Ö–Û-ÖƒZ¶ö™VÀ‘‘-YÜ ÖõȪñUä¥L}¤óGçÿoi‡wA*üÖ²9nðƒ…/Y®ö!^X'nñ« 3¿@F&Ât°'öQ¯²_öAF&«-oUÌsÄ+ØÇç¯w< “Ræ­˜ ÝŸ‰HþS0¤éÕIÕ¼ 5¹Ùvë`žEe·Ž† ê€$}î¶­?Aªãʳ#rú: .;7RW¢~e­Ìþ¶?¦/Ùx,1ã]°ÂÊh•Ç9àtùeÓ<ÉA—Z ã{ägsÂɵB¹_I°åVøë$®!Þÿqr7ö endstream endobj 4650 0 obj << /Length 1700 /Filter /FlateDecode >> stream xÚÝ[[OÛH~çWä1H×ß!ÚÕBQ±+uWhbŸ$³ØÙñ¸@ýŽIR’HÎÌÐmWÀžïÜæÜã¶&-·uqt:eRßÊB ‡¼؇|·Cº¡»¤%Ùø§‘]oѼîé±¢´uìµQÜ”<2ÉA™Ô‚Êáf¶Yi´‚qä#w œ9å+Æ¥û<”¯¨¢—FD·M¤çǶ£yˆIwNË'ÐΫ>4¾\…-*Müy„ñ(è}ƒ€"ƒH;¶‡–…7ÉNŒ–ësÎ6ÎöS' ½Å‹a¸xñuöìÔõtʦ?ˆ÷äëO„¿¬KÃT%îšñ¼ËëJ‚ K Z¦XN ’Ô¶Ïq#Û'FæÖ7ʺbÙôŠ­•®Òý™£Ÿ. Õ.åÙ5Y‹Ñ€Mt!}LRÞ@ÖœJxž·Úñr&Áhi[þñv9ù†i«¿’K—TfSm-„²Ì™@ÚnÈ·P&`’ì½N=Ï•íäqý Äï±×îɇBÂDųMÞÑ}È8 ²R°Bÿ^bbEúT8b³ðæíAF¥ 4Ö£®Ÿ"Ù¨œAwx©| ׆LêRœå*¼ÿ£/¿m²-ÖdCKðRžôgtþss´¡¤V±zvãýo”´qçÞêj­‰pM°ÖאַqÜ#Ë™d„zÑ$Ó?u¿b•, ƒ[ÚæÓ[Ê–R°ÃÚ´þ&6)ˆmWä±±JtKÎ鼂³Ùò\…ñµä „vÎ`ª‰ú`ƒê©#­rLÁîµi 8 ”¢Çfƒ9gÚ é•¬•³+ ÉcôÅ»(/À´{²²‚V²#§P íÂï0ÌÕÝ/…PŽü6+ëBÚ*¼‚c T"ßUßÅ´¡U¢ÝG`ÅË죿•Þxƒã…ÿׄ}ÁÚlûºÆÕÛÍå> stream xÚ½[Ï£· ½Ï_¡c{‘ER¢$` ?°mX$9´ ö&ƒ"h°l6@ûß÷=Ùôl/Ÿ¨Ö@²#ÛòÓû(’")ºÖZ{ObÆÁHꃙlv FIÍ8gHr眡©OçÀÒÔÁAMR\8jId¶Œº^Ûš7’´¹æÍ$]£Y’ŒF8| spÞÔ¤¢œ7-©¶5¯&µAjs&mÒ±Xhs|êï9hà=LÁº­@[áSŒŸ¶‚h28ÂK'r+øF]ŒðÏ”ÉQOx_0 _h|oBë»™à_Ž$µ¶ESëk]±ÔÆùÓšÚ<Ú’ŸY‰'?³ÂK«‡EÈÛùÓ !¯Oµ$ï뻄ϵ.ÖË⬖ºœ?­©Ûú®¶Ôëù»žzk^O½ ö£a£·æMì_çSb_‡™š¤¡•x¦iXç<(Äà£bTÓðJÑYK£wÊʤïªZ6˜,) ÄZ6ì³Ï®ó>O¯^¥Ó7éô‡§oŸÒé«ô»_¾ÿçcû}úì³ü÷ÿ“°n™ª^³ÀŽá%r§Cè5{?àà9Œ™jÑ\`•·8ŒºC-ØXó•7û~SºQUG.0Í+‰Ú²z‰¾‘DÙü#I8Õñ’0ÝH¢—Ü?Äèyâ¹ÅA}'‡ 5ìóJgì³¾€ÄNÛpÍ’­°´šÞýöóÏocòë§wèkèˆè×·^cÑéñ¢2°—Ë DùUù^>BÜ^âÅ Y*óàOoÞ?ýðÍ#ž+Þ|õ:¾}ü÷‡ôöEõüN_‚Å㻿2)£|¾¦D~}úíý|¯Žó{yüñ§ï¿xúwZBta*Ê­yóý{|¼TÏ×üŠ…WFH>+!¼ 4ƒƒëdAÁˆÁ¼ ¤Ä %%%%%%%%5555555555----------k ×@®\¹r äÈ5k ×@nܹr äÈ-[ ·@nÜÙÙÙÙÙÙÙÙÙÙ¹räÈ={ ÷@îܹräÈ#G @<yòäÈ#g Ï@ž<yòÕ¬f Ï@žÊ8 )tldì¢CÁ¯,ðwúKX ÙȹN_»²À±4{“…Ö±®0žjÏ,T4«¼ˆÅÆb‘xɬÕ9¢Ýߊp>³êˆvÕí>ɇ°LSÌ,¥KC& ƒa°+~ ;3Á«$ßxÈ«$‚"¼»“$:|Ž8Û<Œ‰HTÆ‘­‰BwÚG8,݃…ÃpXºÍì>$‰xÁრé\ 9«ô8U‘amÇFë€>àÉí™uÛq“ÄÎÂ\Eä+ GNˆPà¶$ü8 i¹²@1„Vpc‡îj¿y *Íë–íbˆ%qŽÌm§Ràø`ñ°Î<—R@Sz fγÈHÈÀ“kB‚'÷¤p¡ñó"%‡’Ø©ié2­ÌTˆÕ#£’Owµõ›¾ªgABá¶iß$ÑêÎýÐìH ®$û€üê& Ùë¯j.í#ÇF ÛX´Ñƪ>³€uz m#ÞµXTjf¬Ö© ­õÈ@|§j"‚AŠ×p‚2ßÕ ¹mbÙŽ\Eßê* Èï$Ô2+·IìÔ‰ÎR[gg£Ûu#Š]©5Šä@;¯ÁTYÉçë/DÞj)xßqÀFÜ}§Ë„JØêÈ> stream xÚÝ[ÛnÛ8}ÏWèÑÖ®HêZì‹«Ü¤Û Òº‹€±[ˆ$z)*÷ëW²GvÛ¤(w[ä!A+Ιsf8Žl]›hºv~ô)8úpf͸´´àAº>@†¥Ù ,äjA¨}ëAÿ\~8³¬Ú£Èvp C‹‡Fœœ~-;Ò+ë…i§ö|ÿeAÚÅ?¢å²³( o1‹ð}LÎIJ² É­#¹ÇZ¿ðÉ5Í庿tS_>ºò­,¸fôŒ`ž³F» + ²Öþã·ŠIñ3p4VZþys~T€ „z@‡ÛéÖ¼v¬Š-CoŠÓ ‘G5·¡êžý‚—r?ú—4‘_˜Û*£Or†y0% Q®4Ñ>> stream xÚ½ZÁ®\· Ý¿¯Ð²ÝÜII”#@Ãm0’,Ò^¤ÉC4ð lHÿ¾çègœEî¼…<@k|ï¡(òPb©ÞSN¥úHbŠAÏI[á@’ ç@S5¾Ó-µýQI¾?ªi˜pÐ’äV9ò$2úF;&ÀË|:r’::G’Äçw‡&éwX’±?-IeZ“j#ÊhImLOZ•sàemûÓ‘Ôù´eü‚¡#ü„\GšL‘%rŽJ2üŸ£šŒ40jÉ\ Gž¬WÀ¨Ãc¾(Q¾'ø¨•³ H~*F¤±?åDûS@ùþ‡ G-Õ¼?õT¥Ì!6ÞŸŽTK%ͩҜIª®dxs¨%üúù^I`1ß« æ{-5뤟ڪ4Ì¡ËGkèHÍ;ßú¶A’ Æö\ÈKæÒ9‡YÂͧXñ²?­Ééµä>ªyò^*æ°NÏ ím¤.4X+9u-Ä+’º99>öš‰W,õ¶?-©ûün©©ý»-<ŸVIC¼`Ѐ!ñÔ›ÑýȯÀë² ~¹Â‰òtØ3Â+Ûy5$ûþ}uì/ÐYóþ¼ŽK3Âcž›1ÜCຜ¢ÁawߥÃÁàtm‚ ¼—¸xK4gâÂ×Ee³Áù£fƒO̦•ÞfƒÓzŽÙàÄüáŽÙt™9f³ÜÈÌ»tNá…»ËÈ x2qa>1z;†˜ÍÜÈ̹»Ï¯q+æ\^¼x8}ó¿_Óéó·oŸ><œ¾þõßæç¿ÿôö¿§/žÞýøøî»ŒèßœþzúÛéËïd~x8}õøÃ‡ôùØàÚÕË–aSºÑ­¶Z¯}ž^¼H§¯Óé/Oß<¥ÓËô§_¾ÿÏãVìÏé³ÏðߣmíÊ¡ä¾u¬úme„„m”HhÙBÏMu¡!Šöm ü]HÙ®u“Dë I”º1y\H4ݪ>ƒvÓBŸh}c*©É0ž7ŸN6Eÿ˜…Õ…$ð“;âD(Y7ìíÛ$ðÒÂÉmSf`¡¶äêÛ,,¯ôMß^/$ LSêsHŒ•¾‰ ‚¤taÑ`š\n³P‘•ñªc° 5ƒ"¶dÄC°h,ì V´•^/@âªÖ·)¤nÌá&:$±2rõß…„ ¢f½M¢.Ü¥Å*¢æ¸’(¾ È«Û$VnÒ „йhc3ÈÊ›$ &²p8í,FÞÚ3|cáö‰ 9Sµm”â½"€„µÍú}VÚm”òUàù W±ùH‰9¬ëíP†lÖüjˆ,Ð7Áª­ŒUŽ¥g‡ÎCN…À«[gÒ¡ûêK@¬_HW°—õ(îÐ.ãÀºD –Nµn”Ö0§ÈÆßw£Ð7i¥(Ð/‘1Xÿ‘Ú8xö \BüêÞÐQ¢| Ç„Úgmsa”R²ß‹E ”¡³AY…ªj+X0€ò.÷Y :ž>Pn²D>³"Ó"Ò‚ÕÊJ%e(ºÌw‰[°<6OA¢v[™ÈÒ*vf¢Û¦´ 8å~T敨Íð€œÙºÍUp$r««áw"1™;Ï$Š@WõÛ– LAúörå€â4Ã3n’XêFw”+ ”:ê3HøÚªÃú¸’`Æà^¹EbmE|®:ÌxZR.U‡Aîæ\îs8šÆ´LÔ4ŽœŠmË“Šûx¦Q»»`YžÅo“hymU.Œ A‚AÜÛmâemUÎ|uaýá ¡·X¨ ׋zuMØDö‡çOÀ¼õvå€Ð)~<üœ k„_H(â¹øä÷…"“õ…˜%ux(|¡Š!}ÖI*÷~¥õM•·PøHåHéNN•à€ÃÊäU #ðš êz†mÕN(’å`o¬Üó@í¡·wj79ˆ÷õ*WKf™qQ¹Z¹7ÿJÔ¬ý7ÞÓŒÑEl“è+£¶„aRˆ›Æ«ÄŠ BKGÅýNZ(ïE/$X?‹Äb±]® zQߦÐFËÒ‘¼Š_HÔŒä%z›ÄÒãuãý*åìÆjc pu*OwXôµeo ƒE™Aü,´õõÅ ÝmâêN3©õ²¶öá™Hp`ÒŸCB²¯¯E…‰‹râ\‹’•ظ)æ1‘X$S/óàJy U=8+#fåÁá…4;nR¥Ç‡n™¤6P`ö‚S²AaSõ q ]{²®Y’P`³—…°5k¢±jÔõòRP{±‹¼”­q$†¯?­Í QæqUe3ýh®$Ñ0{@‚” ;{n’}m÷lW®Û`SÈMK,½þrÔÿ´°ecoÔMºôŒä¬î$3N ,š†-6‡A{å&-ˆU£]I4D«ÙòsLBËÊ;jÇ:ÌN¥3 –]· ¡¿?xÉÒY/§¯ÒéÛþ+!+ZiÉyƒ5JzûëÏ?¿‰—_=½ý0Q_!;ŒvþÖ+ÄJ6`?ô4DθP”ÁüŒÓëwO?|ýòéôúå«túæñ·éÍïíñ,N_bªÇ·Þ3~Ÿ?ûýÓ¯ï~xœÿ¦û¿ýãñÇŸ¾ÿâé·4-Å«,_ÿßNEõüâ´ò{L<Û¿Èg6%5-——{ ÆyÐr $ƒ@nܹr äÈ-=========={ ÷@îܹräÈ={ ÷@<yòäÈ#G @<ÎÈžs $‹A‰AA‹Ç Ç %%%%%%%%%%5555555555----------K —@.\¹r äȱ­¼r äÈ5k Çô؃{ÐczìA=èç=øfM$ÕZ6î°Æ³$˜LI¾¦65¹ß)©L…‡I¡>;ã8/Èf5Ôg?º-Í “¼ŠAR§ÆëÆ3“¼el_’B…xUV¶'*{"XägçAZ‘ÝÐm/SîT™ñüHW ÷æµØ ÖTwû}îAPÎr "¹Û,xÖZREëQš_x€"-ccÈlÕ,&Ó7 LÂVMìéû4­J‰¶÷äAõͲ¬ÚÞ“çG××K/ò綬±èc+ú,+c#|‘…ÍèÃÁBggà8lÀZj TÖ÷®¼2Ï}c>ÛÀvö‡Î¹ÒEéíWuÀ/žÅb¥wB ô ›ÑP³Ã/töA±mø}n…¤cn¶Ÿ9ð$ËÏqãðúx! ÍŽ ý ­[fñ Z|¥OÔyŠÆ¾¼!)Ø­“SÙúámH^»y$›òÒ°BPD6åiãÈõÞ, ²»ƒD婎ݛ›óì#:¶¬z/l=#‹ 9ƒKá”™,ÄMǽXœå ÈT\â³)oë¡Þ”¼r£ dô¸²tR{‹•—Z vÙøÔuž?kC9¢¼¡±ãóç¥I$¼“PÞõâV¹2íÞ,*{½²@ ‡­7Wÿê J1 endstream endobj 4888 0 obj << /Length 1549 /Filter /FlateDecode >> stream xÚÝ[[SÛ8~çWä1ÌlRùn=†p)’¡IJÙiwaŸ:^lË•íúëW&!„‹uÉÎÀôN±õï“tn>E­¨…ZgG“ƒ§®ÛÂ]ìšnkò£e Ôµl·åF×µpk¶¾µÏ‡Ç'ׇÿL>}8µ¥‡-ìv}dñ¥3}«~èÍWçOûKOwžï˜ÿGköÒ%aœEŚ念ÿš¯Çÿtý«—ýuT¯îâå‡;–eµM×Ùfju8/Œñ3öd´(7afÁšE¿#ÍÍó_üÒpÍöv­Q¿oÓ{Ä¶ÛÆ¡ÑÆx'ó™ÏxÒ¥$—óچ¼ŠÿDÉ‹·ù}áøI@Ž€j×ÅU*-ÚŒb#¬€$ã’UA)fíP4¤,%IüäÍÆô¢«ÁHÇaV¥qF²äŽ^@³’‘¢ì”S ìAûŵùÅuwÐ1Í®‡æÒ¥äºIA“'4š:Ésî¹ÆeðÿìGü\Á“æªD=ïtƒ¿íù«öªÊ ù*6uY Ùa— -åN?9&· œ)+›Rº&¿žÈ¹HEÐ÷'½¢ ògÑk¨â*FJMé‡a‹Ü(É|äÉúMLœ Ƚr)U25§øxqÜ“r˜4ä¼|ø q4-5Ü4¨¯E± …»¾cÌlvœÙ[[ÝÏÊ’ !E¡=4\{G=òlö©—-ÓnÀ²Æ_.&çü<†´ºßÜrÂ1¬ÞR¦é4ÙQ;š£pƒòo…½ê‹”›O˜º.pc®Ãçø.ÃÑá8,é#ùT®iøÒÞ=rùÏ,èO¦‚þÊS(r¹âðM²XìÃð >|û;1¯“II4a¶zQà Õ7k̰y-ˆCNÊ`ú›²;=ضf'ÿzS•´Û+eW“ØåµW·X³N¯Îwd:[™µ]ÝF¦>Ö¥™kÂ…r ‡t¯èyÍòÐù¼ì÷ä+ûã8ÝC5¿îÖmÜúqA i•HýwÙQùI¶å}5Íš–X—ÀÈÊÞ-ý%ß ðˆh3D=µ€Æ Ÿ!zFCžyB2M‘ÕÓí©LtØ1Ú†öUE²çúæö“ª(M(…Æò£ÀÀ­Zx7â2Mš<¼ðS2€–bZ$’âÖ¿j•Êmk7zõç Ó´ºr[ŽWëïÏé0ã Tk³zMJ_Ç[ æ„Á/u"Á`°ør£üÀ•ùà©gæ^“«íâKÿ… ”*Ü€¦Ñ`œê gHý<ú–„dq:‚°’oÕû¶¸lZ·#NöË w©i¿^׌»‹«5_¦ÄçAüß•_H^@ÒÛ*¹;¹Ï…’èBN¨by½,ü’„þ–ËÎÜñ5¾Nãr ¢]}ÎÇÑ‘0®Šî8‰Cž,ÿ”Ö‹8¶'Ðå¡á!›u†ëQBGrnÐU\ÄUze¼uVÞ:Væ{Ù«Þp¨Ée"¤½·´ÝŸòrNâ ’'°çõ0™Ñ*™FÑêÖyÞË2ú°·ýÙvÚ„º–÷‚†ÓØMŸRÆ)ZKØgy3ut}ÐPv`KBºÇ7g@? Á[ʧ$’ï*`[‚jÎè-ܤP’P¥ÀŽö8 œ’ ¤ %v$„C”Ö ½:©V€vI÷î胂ƞ ÓA)?}õæ 2%z &½±«å2l± ´—„pSùk‘šÕˆÃ3]qÓ$«šÅ‹‘}Dä)|AyEÝﯘŠ"€=#úˈϣü{™Ø_a¸<µ/ši¯Nýëœ;s„2lˆ­òó{ïB^;1Ošð8ñ ú´Ú?æ‚f=ÜÞ‡$)”G|Mä ±]BÞ\X 1nf¤õ¿±øg×J½±sð>ùni*¼‹]ðÞöØÕb÷êOB*_ÕL„·~;™üãý U endstream endobj 4766 0 obj << /Type /ObjStm /N 100 /First 1014 /Length 2829 /Filter /FlateDecode >> stream xÚ½[M·½ï¯à1¹ôUE²l J$€`ëDÐA‘CkH2àüû¼Çžš•îY Ô‚–³Ýóøº¾«YkÍsÊÉš—TÔ¸$͹ÐdY¸°TµrQSkƒ‹–<.zû%O%ï×F*’õÎÚÈ€ÔŽß €[ç6CRi™û M¥+7–Šwî4j’œW-IQâžDö«žÄö«#IÕqÌ ¶L;øˆóji–¹Ò¤¹W–T²sU“ê~µ%µýjOÚðVž´[áj$õ^±GÁÍ“U/¸0YõB“U/ØÜö«€ª¹P$“UÁÇ–X~P½xª¹ÏûFª’ {H†Œ).%U›È"©¶‰,šjŸÈ]øD(cg%-µ²·§¶³OÍæ¾2R«Ú±‡f¨¯óÙ´$èO®’ÚÎJ5õ©Á3îÕvݯ¶ÔmÿnO½íW=õ¾_©{/Ø$=Ï«¢—yÕ$¹Ìç5M>mª›%ŸFÕ­&o4¸n°ªiVØ)ù 5vó4r›(#2¨óšatÊ=jIÃæÕ*i@\i}¿jiš«šÆÜ£6ØiQnR;–ÒÈ¡Òzu¿曫 öÁ%Øô¼¡Áló4w~mWiƒƒÒ\ÂÂ¥Å>E¤ñ)ñXEtB£[T%Cˆ¢H›7t~­ZÔ†ïOè·hn|˜'ØÎ-z¥; Ÿ¶7:k›`ØMë˜÷b7¥5`‰ÝÔ+Áœ^8æ ôqÃ~wÏžÝ^ý÷çûtúúýû‡Ow§ïù×§ùù¯?¾ÿÏÝ雇?ÜxÍÈßœþ|úËéÛ×e~¸;}wÿîSz ÈMèr½mƒÎ_ÛÆø!^7pÀ}_§gÏÒéûtúÓë‡tzžþðóÛßo¥”?¦¯¾ºÃ¿ÿŸ…”ºA…ºe(J´lO-]·>숅¬cQZݬ’Ê–)y— «²ÕvÈ¢/d¡yS¸ìmË ®&[- ™c«½ÿ>‹QWŠ"oP#ößA„ÇÏFR}«£‰BWŠFˆøHó@ FêÙŒ)Cê†Üs#IÀ”HñÆ‘ÆQ˜Õ¶VüF’ A )£lDanÍekz¨[殮ùÖ°DeÖ}À:ƒE[¨‘ d1T±"A¸Þ2BVi°Ñ^XÔõ¶YÌ6V%aœ¥‚ßg¡+EHUgŒ8“€bœIð $…,ºÀåä‘Å@ð@™t…æ•fa›–ra!²a‚½Îb¬uÖfpVÖWYÈÊ|™¬`w–© ßÊ‚Ç_õ hÕ•Æée³ÙŽœI DÌZ¯“h¾Ò*úÆ’3HH±­ÑUksºA¬®$o,Ú,7t¨·\ãæJQ´©$\á ã ,d¥›Â6³ol;*I•ÁÊïHceÄBêÈã‘L³¢½¹- m,!„-ÜÆ–JñÓ‘V‘ÔPw*da¬0ÈÀPo¢w›faÂÊ,Ô­Ž™…1Z£ÿ¥£ 4B(šŠœ>HÔ…E–ºcS´ÙŠ®Ñ}7$ˆåÒËô¡VˆÕPâ±mTÄrè‡ÅV½µ(òØØ4_DØý‰BÖ›f=ñ‹iâ÷¢G ™,¬z•Á!Uô|{BI´NN Qó [YlÚTƒ?’`ùxu•„¯ ‚Í´?’PgÕò •aè†5¦Ž:` þuÈÂÒÆ¹Uå‘"7Œô ,t©BÀUEå[DCKRY!^åƒHÑV*DªºöH-‰ëu}¥{ ´Ï9°?} ‡•&Bf¾Õ ØÜ‡?ÄÂ϶ùŠ0HÔÜ3úuè§WÖ5¨é2vmÈ`m$e%¡¬Ð¨w¥+«+–·j–Qe§°¨K#·Â eÁÈ]è£×Yôµ,ŒaÈ#•ù#o|][Þr¿U¼ºØzddñ‹Yˆái²¹®¬)ªï.‘§džl<¾)3¯ÜŠ„Ë|¿mìË“A‘åÈe‡ØR¨rµòðõ%OÊ*J;ž¢7R¹™$àÊs0T½Òy<V<úà 9°L[»QÉ0›Á&xæÇ•çEFq$]ï¢&0¼]ÔŒj9tѕپ8 í3 „‡nWIHËëë+(ûÇÜ\é©â4‘#I¬ ÜhúŒ¶p&;åáæ5KÇØ*œBj „ (3yøDMo$ îÞ²\X°U÷ÖŸÀ¢£P„N·v± vgzx¢}u/¨=£ÆEW22_Ü ˆž­ä`Ŷ*ý‘…ÂI‘>®²“/ äÓ™GCm ‘½!P_ù²„•>vEëãc C 9¬”K Íó -Lê>IT‡>„)í¨Ä³üX Ìð xë¡“.%1ÝCØ…prãì‚úÆÝÃVvÅÊc‡:'”aÊœ»OVzT\­ô޽ùèIšmcFlˆQlBF·"qvÔ”p†-:É>eq³£óF/àÄâ4Ên8E‘ÉI\n¬FC‹]‘¾µ°Qt_u’:*2—’8;Gióˆö✰è‡Î¡ëËmɆÈÉ%g´ž¬ÄŽj+[Y[!SÉà‰ LÛ°áû´ YûèÒ ¯m(tSqÝ‚bdu+(æÉýc àDôs+Iœ{NTtΨ{NTÈ¡i¶å­Ç…ùõ¸Êa,}»Ì^ø30‰Rì $ÚúÆáá9ÍѼ£YÆÒJ×Oï᥂„Íss©‡Â¿€aòȺöGĈ›oÅ‚•D™ã¢±püwaƒ tt=òo"÷󉤀þ.þþ&”E(TS‡á×aéý/?ýô&n~ñðþÓD}a%<öo½h-8S[J\sªt~Æé凇wß߃}:½|þ"^Ýÿú)½ù­@^‚åÝé[luÿþÓGÎÄ:¿Ïçþøðˇw÷ówmÿÝßîøñí7¿¦)*ž[÷ ^¾ý€oóåUÞoœbþˆç`-ù̱Úó¢ÇÂc1΋7÷¸¹K,4‹‹‹@îÜÙÙÙÙÙÙÙÙÙÙyòäÈ#G @<yò8#{α(±Xh,,5-=‹@.\¹r äÈ%K —@.\YYYYYYYYYYYYYYYYYYYYÙÙÙÙÙÙÙÙÙÙ¹r äÈ5k ×@®\¹r äp+·òÈ-[ ·@n>èáƒ>èáƒ>èáƒ>èáƒ>èáƒ>èáƒ>èáƒ>èáƒ>èg|³vè*Æk8tU9Ã0<޲¹´…µ•Ô¾ Ž×N´£!äŸ|8“ÇQ'8ÆúqîÆºÖãÜu¾¢X:élpç€Æqš@+°ÀÆÂæH5}°®™$Îú`]sHâ ‰¶9׿Ÿ; ¢GjçHÅÑÕ*ëç¨9:1YðÅB^Ë}Ëíp¾få|½:w›åeðO@ò–÷ùšr4îdm¹aV„©l{ãcs aëÐGÇz›¨|~’8ÛŠ«ÞH¸+•2M’à™9!mÚè+Gv©T~ÜÒÊH¬Ùå딣nOÄÒqd¢ $ø®¨¡î¹Îbå …ÀE!hD顜¯™Fã8rQé+M“Ó¨{j1È¢ÏwEh ç ƒG«‹mþË`Ð endstream endobj 4891 0 obj << /Type /ObjStm /N 100 /First 1014 /Length 2375 /Filter /FlateDecode >> stream xÚ½[=$·Í÷W0”ë“$p [€-@‘¥ì @²†aàNNþ½^‘Ó3V öÜîÜeOóuññÕG×hmœJÒÚ$‘h 4±·XÒÂ1ðdâ1¨É½Ç ¥V$=uÁuµ—DeÌuJÄ…_0bÜr|°ãæ:g5‘»vKTçg=Q›³5q)£–xâé=1{MÚJI¬1ÛðƒMì#Ú€x¸ÍY<Á@ÕŠ%)sÖ“àÖ1ªID8F-‰ºÄ¨'±Ÿ ’¤r¬F”¤YÇÄIz;.&ÖáÛ¸Ø#<ªqÜ™0á6®kÓ\á’Î?¬ŒY¦dÔÖÀÇLÆgY’©yŒ4™;³%«s{ÑælMÖû¸_K>QqOÎcVJò‰J(¹±` <´ûœ•äuÎjòÎñl0X-6À–Uš³5Uá°´TuÎöT'*-©Ö1«”@—Š5”S¶RIm¢RMx‚ø¬ZÂÂjê©ÙXWkjnã.`U³=µi++©O[¥>me Ò kàc}Ú —tÖÀB}¢ÂDŸ¶ÂFõi+kàé„eC¶ØöJ[:è[Œë8§ç p©ó0¸tŽÛ:(Œ‹ÃõX\%’Á!P@üxLð›Èz,\±UŽûV¬î¬V±õyVcš`5Ð?®Xe°´b56Ž…+Và ˆ%*Vã:0T¬ÆdÃj8ñð « u}y÷îåöýo?H·¯>~üôùåöݯ?}¿ûßÿ{¹ýõÓ/ÿþðËûe(?Üþqûæö·÷4~y¹ýóÿ>§÷ä–q@AdÎ[H3ˆ:s¯¸î«ôî]º}—nÿôý§tû:}ñóÿù€é_Ò—_¾àß%3®½¿ÖLØ +(ÚŸ£ kQˆeáP²6QçÉ«–Md…¢ï´ÅÜuŸ(°#àPù•(ZÁ Á}S  {ÍPWu]€ðò´Pž î´€:Ÿ¡70…€œ8»'c€*k÷a`ëyˆk±lÐf2ÀŸ+Õ¬}i‰Ç”)Ž'|q) `´Ü!ZÀŠvªØÈ«à\”r€PiÈ~Vò«P(N)â„Y"2lä]¼g¨ö‚[e&€£}€¨š.ä„íÜ–Îú¢[~!Ø·‚°ŒÿˆëD3âBlËmEaÐ+Ž$âbì"~¥µ‹¶ãîÄîM w'†Xy‰ÜßÀD3ê5#—(:Q7ªUòÞrD±Ì·@Å«,˜iò(šÿE º…ÃmhŽ0žÃ•u ¬]âPnö æŒlÝUP“´Ø©™xäêDìOœ“s{¹~û ‚5W¤>ç zÙJ‘Œg§tÊeZœRÝêÂ"ª­O ð&•èÃV^‚‡QXx`@x›ra§jwÄw. á¬HþN1øN€—BÊúÀÀm¤„§6¦,‘ìðƒj–® [Ï&b%}b@`c휾Óoÿgä ý{A¼Ó‹K‡×¦A„¨_X('°àÏÅé"¥ŒÐü`TÑN1 UÙ)”;õVŠòê)ˆºÓ­ÁcUr¬Ž ê]¦eH/RÊ{BÎHøªÒ#!é@2¸¢DßÌŒ? ÁˆýI(ÒÅvï¯ÒDq B°Ž* u‚%‚ a„@áAÌ.AÔáEƒ™«ZQ¥¶ÀHY!Ž °Î¨ŸWjUwV¬«3=Q@B{ós¸¼€ÓlO ¦Q{ ß_±"cªGñŽÌÎöcç Á£“Àpé‚£Âur èW¡¸+q™¦¸+R°3²×p¼§8P ù3–s{ó¯ƒ%Ô´ ¸ù¥Vì,!¾óÀÀÔOœƒØj‰‚>ü¹ñžUU5N>Ä{y@6Æü*-Ëx—SD-é˜Á¡;ÄÛV½n” 5刕¼ ÄÆÐF+e}Bha9‡@; !qvÊobÜ0ÔaÒ¥Pl|¥qJM厗ŠÕ<S±Mbv‘+} €t÷xu ÐQ®X heç)•Qpˆf׿x5@,+V´îC*”k;äªw°¢#GFá+mrQ˜'H8:Ù…RÔÛ+P´ª©Er´YX¸ ÿŠ}‰â®— g¶âfÓýÜ4„¥=¹iØ[¾*n¶Ÿ›V%rîÁÍèa±*²zGk{7¤?! öGVò ;•¡´²ù#-;ÇÐvº0$Àâ0„‡p:Œˆ½€Wq[žŽÊ!Φiê5iG˜kTei ¶78¡\ÇÚÇ Ss¿¨¬¬Í3WìEö‘  ŽÕسw¹ D„rN£¯%zâ Òï(±‹QD_Ëhþ:PªÚ.B!AÉÑ wÁñzØr—h/êQÅY (;QÔ’KtS(H::±ÎPpÝéJ)Kó -q\éï,j ôÒªh[‘Jð#š$kîÚ.*(>@ ¶Œ¼ãáâøU¬¸‡ÝŠÐÒù»GßѲ۩ÓN‚À6º;[ZŸ½=Â÷Æ£ºÎ76aã|Áf4Ѳê¯u°y 8‚Ís]ö‡yøŸ½ú#Ì‹¿Ó2´Ø‰BàÄmìC`B)ppeÉMÝ_&ˆ³†/‰*žÏ&,Ö¥'³ýA– ¨-ã÷ +º°xÙÒ±…àœB­£×(Z£dÂðîá[Öbáûu3zZ´€õ¨ÛD¯LT—(ê~áŒ^£]-wáõ¬´¤EÛ™)D¢?Ph¡Ü‹ž£àÂ;ãÞh"x‚€šÇ^b«V@±Æ«^C7m¼FѬËîÈÞ÷—6…à¹â‹ ÷Ò¦0ç«¶ãAÍ ³Ó§G{4^™®Š¼;+͇% NYèa‰h¼²v™-Õᦟ¥æè¼òõ ¡7(x³käÞOÇ·^âÞpt$ò¬¥!ì($C´¢EÙéB4ʇm¼¼¯ñýžPíÙܱ²YÙVÄ‹{ßDšaKt.)Q÷ËU´È:§\EOwÓ‹@QE¼º>¸#ª`dé­-)±³tiW|é9ao”EÿÑx—ßÖJñ(Ì¡Üý‰Âãïü*¿›Uº’ endstream endobj 5047 0 obj << /Length 1524 /Filter /FlateDecode >> stream xÚÝ[ÝSâH÷¯à«63“ÉÖ½ ˆÅ–zÁ­«òîa £æ —„=ýï/ˆÒ3«Wûà–2óëþõÇt÷ Fã®a4ÎŽNFG_ú&i¸mצvctÛ †Ñf¦ÝpiÛÌmŒüÆM“róø¯Ñ·/}Û^û(sx›7ßhù¡ÁeïôÅÇŽŒr÷|k¾öùÖó‚uò_²bÙ0ÎD&ýÎc–îÚš›c¬ù§aÅ+Þ´ˆM›žœ'"ÝË©¬Û`±˜”‹Iå¿”ÂæÿÚ¼‘,d.þ;<;*©Åvid4Z9M®å”ª\u;ƒ(“w¹åÂ(õ½þ{B¿è<ò.OÕ êy}ѹBRSÝïk÷#œkF’Ù¤ì­×=šó 4©Qþ=tì<ÊOÿ£¤O§"òßÅh ÿ÷#H£ì"Ù²ñ-A¯úAg[èÙ´¦¤–Úü¹á‰„³¶™¯µœ|·Æ¿~iµÛ'¹p¶E’t&’T*Hö–¤+Ãi2ÅÔù8“Ù`ª’æ·4Ö®Ž$£ Mç²ljD"ÓÜU¼Û.‹ãÝoÎ*µD½¤Cás$Ó—(36”‘˜JD?¢Ü‘ÖNÝC®+À™Mîõf\/ |éÉ°È¥ÊØà‚¨\}¨K*kŸ×ܬª¢[ÙúÒÖ3 „ºNeÖîD“û8ñ¤†³€ÎÍ%êÉÓ‰H&±/Ñíâ2>ˆ#¬n{¶Ä5Õ(a¿•)m›„,eJýÙ–¹“ 0Ï(ŽC$\‚©uÄ+vaJδß{@/epw?ÖyUm[€|R¼0”ÉFt¿9EÜ™0_mz°Ôiƒ‡=;eCÁ¨Gü&öøÙáØO$Р÷¡5CCÜgƒ©¥Û¯¾?Vï]z—òRÌãÎÅXê¤[’‹¼ËSõ–rG‡­WSCÎã9Z}K7ÈìùFšAŽ›…´ô0âî^|{îZº¢BTÈét,}?ˆîÔƒÄ\3]Ï|‘Éçï)h€8èÓt‡çAŠuчP-o¨±ùóttôR_úX endstream endobj 4892 0 obj << /Type /ObjStm /N 100 /First 1026 /Length 2737 /Filter /FlateDecode >> stream xÚ½[K‹$Ǿϯȣ}ÉÎxå¬m°a‘t°-ö Kƒ;bµùßû‹¬Žîñ¥ªÙ ÃLôTÕ_fÆ3+[{çT’ö.‰D]Ðĵ»0’r¡&Õš¬ø/ÿ±Ä…p½ILÆ.á9îŽ0pU©?Aª‰Íü‰ÑÕ\ê‰ûöìH(…ÆDTæ„W‚ÈSE…6ؼӯÐF:GW¡6ŠÚ¡­Bõ9„ m¼­(ü„˜Ô©WhcnN§AÀé4hcS ôˆë\!ø€ÓÁ°‰Ç\:h') ~3 ‡à®«E"SÀAwSm²‘„‘‘´9QÚ¤Ïy€WcòŠ?æž­¸ÛEhÓéÝâ…ŸÞ¼y:}ûß_žÓéó^>=¾ùí_Ÿæç¿þôá?O§/^>þøüñ»‚(QÞŸþ|úËéËïh~x:}ýüçô¶–7rœi³‹ìNü\là¾ÏÓ›7éôM:ýéåÛ—tú*ýá—ïÿýœ¹ô?¦Ï>{ÂÏ•²Ì™-™Ü»[ÏRê™ï°0YÇ ²ùJ–ž–UFÉ"0ž‘Yö¦b¼&ñÆÓ{ô×éô÷ü3‘fÔX³!Ò~øíçŸßÇÍo_>|š¨oa¥nˆó©·0lçð@¢ó·UžŸ€qz÷ñå‡ožÁ>Þ}õ6¾}þýSzÿÿò,ŸN_BÕó‡O¿z2˜ì|Ü¿¾üöñ‡çù?Ûþ÷·çúþ‹—ßÓœ*Bmø ¼ûþ#žöÐ_¶ç4ÿ Å3§8Ÿ™R΂†p¹TCh!ô¶‘Î\r(ABÐ,„B ¡‡ÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈ5k ×@®\¹r äÈ5k ·@nܹr äÈ-[ ·@nܹräÈ=ÉFäÈ={ @<9|p„ŽðÁ>8ÂGøà8û •³B 8 AC°j-„B S S S S S S S S S S s s s s s s s s s s K K K K K K K K K K k k k Ÿ}ðýš´†ÊIT½͘1VËΫäV•åVråæÅ1r+ œFË0 ÔT™Û* 9ˆeñ¢ÝjîXjô>d÷‚3Ñ÷XðB¨*PQ uÐ G9‹B }†œÙ ½ÃT Àòx™ ”:{FAv(ûf{,„`uÅÂ⓬dF2¨(û<Ìó*Ê>í{Å'…,ªP’¹c ÔG]Žv¤Z6Þ1‹ÑV:)aÄtá0zVäCÌ+½´b9Ä[pÄ)o…0„ÄnòսXÁ´Ò(°– -šÀiŠ b]²ê£–£Q6ß ëatL‚™×;©¡G#ïŸS1œ•ËNÔ¬+ã•a*PØ\H ò÷! æ•ILËlKM‘µÐ#ò¹Ùȶ3ÙîÀA Ü÷\‚–ÅÚ^´âv£`¸ÉЫQàÿ•öüceÈD%Ã($ *Ÿ ES`,¹Z{‰ózßÂ×õ Ê»ÁêÐI#Jñ\¹w6rÓ“kT·ä‚×yzµ•“s÷]Ë`¿mnü°@ÂY_P¨' ß³<s¯m7nK]9–ÉwE‘ÉÐv ›û^Z+Ëc7dJ»Ã\ °ô½TªŒÜ%¾‰.dÇ,V&ZŸÛ•Cƒmn/v9,Í¢–é.Ü"}üˆÃÒÅ8טŠúÚ8ù·r.m…–;°@}í{÷ 17ÆAlwǹ-´ –žKõ—NmvcŒöà •ÝºtÎþ)¨kÙôOUPjÞ —²2\wŒ+¬ V;âÀJ듸 ¨mþÂP×È€c´0Ek›ŽŠzµ]Yà¯o²`]蟱S#¨j|ÙªqV{,ø†‰²¶+_‡48èîfÍJ—¹ðZíàe.ÀŠ»>j.Îͨ ®õ­zoFuT°‚½XÝ+kÊÚäAÌWþF©·[X,ôT.2w‚º~U7ÌÅb»@çÑ^±@îªr‹… C[“+‰ŠŽ£ÊƒIœ÷(íÎpÓDàDÑŒªâA!‹F\Æ…Äðò†Lâ+Ðs©]·¸”=ŒÅð)Rr1†éÇ „ ’ìxÌ>‰Û%J›+ ó-<>&ÑWº(¼¡¼&Ѽ໅ÄJç䉂¼ÑQè ïË+j›šØ75ùQ»”¿"áçì´6{¨]9Ìä!‡XûÊr[³¿f„ B|`£¢·gUö<¤¬ß\¾@üjhƒŽI,ݤh¹W¾’螨kI¬Ý¥€c¼šô‡‚¼zÈÁ––™h3ü é™„»‡5>&±4â’›@Àß®tLbiÁ-²¥¬ ²¦Þ°Ks¹ú>•^9 dú©ªCÃV5ûá“ ¤QÄ«HŒ;0 Ïá—‚‚a*{/«‰7¤^@ Dí>ãç!‰¾ö=±€»°@I1óé! áµý¨°Ì(¶ÚM,dm?Jµ_Y ìW‘X¬ÜLôºßø Oaƒoa±²Ê«Þm¼bѰúMsqG-èA ]•47Þ©¯hu}åS$ÂQI´;8j°G=d±² º8ê™ÅÅQYÐ5X„£²÷pÔ`ŽzÌb©£Âçá³3 8ªçæüj½£no>^eÔ‚F¨î5…E—;ê…D8ê1‰ºÞQ/,ÂQY,-½©ÏîœÚÈ~ |º ùA0ïÖwvþûú·ƒó„\^Q:¥²w°ÝôúW n‘Ö‚Åv4°XÈD0û©/Ù¾‰ã¡únÚæ%3!k»±y O8WóÔÞ\;X‰›Ê£Ö#ŒÂ_9\ÎF’œdo&Êú³‘g ÃÙ1[$F›gj6 L–ý¸ü!¢•ö@LåÂAêö½­C+1¸'èüúÞä`˜¹…C]Ú’"$r ß`‘K½"ò'”Ù|ÉŸþ}µRwY,´J?Ñ"ðMÿzA›'{ Žâß/ Œ†}¯º ÿK”ª endstream endobj 5068 0 obj << /Length 423 /Filter /FlateDecode >> stream xÚÍ•]Oƒ0†ïù½d‰eý€Bo—}DcŒQ²™ 1¸UÖȇaE½l ƒ[Ì.hÊéûœ·ç´ fÚÈÕ†SÆ78# ¸Ï#dP“cƒQÜðôó«ñänðà^ §&®SÎ Ñ\jFk¤¡R=v*Ñð+;Ÿ¤Å¢¹ŸJÿ)Sá«,×a¢Hž~VJçá€tK(†73 xRª›îã#sSܲêà™ˆ+TÆkþ ÇÂõe÷ÈBe‚UqbF~7S“݉ไMIÏåFfÑ7%³Ýïª\ —¡¿ÙœÀÙ¦l ÉœŒÉjLҚָטá—t*ùO¥#RºoæÇXF—‰¿’qÐiµa†q·kŒµèÍ·ê§-‰iÀ’‹í»XK%Fþò%H“,^×·"K}å®E$znMS'¬[´ÅF¾Kµ~|M“ G4góI·ùϺ* Ö¹Ó³*A¸wE³wEÖâ.R©ò?€BºŒ•òF“I\LDB­“U1~ÎâåöKç’7ýw1%µ¤½'®ö 9Ð5Ö endstream endobj 5049 0 obj << /Type /ObjStm /N 100 /First 1015 /Length 2288 /Filter /FlateDecode >> stream xÚíZM·½Ï¯à1¹pXU¬* Ø”HÁÒ!Ébм„»†´œŸWìí‘d@œÁ“­¦ºÙM¾.ÖÇ+’µ7K%ÕÞ<‘p-±i=IïzI*%3S+‚¤.5„š¨X Iq¡$C—[+:¯[kKd%D×äQ .©™…D‰ã'&¼ I3F…T×­UÒ’íÖê‰$|AßÞÅ'*-T’ðh%J"£•8Iï’$±­µ&ñ­U“4SŒAŠèqO3ácØ$$¨HzôÂø,•è…¡³è…¡RßZCƒè9¶VMJÝ1[èx¼‹‡ëÖ àº½‹Á}¼ÿµÑ‡:!q² fÉbò Õd20‹&Ût%†ézOÖ†&¥%Ût%=ù¦«Z’oºª”\$ú«œ¼ZôW%ù¦«Ú’oºª É;Æ€:½ù¸WS# ôZRc7”R«%Z¤£©¤fèo´øTSë5ð©¥^Fê©siC[Ýx£§^=Þ°’º•èÏ(u­Æ f=ZÖ60ôN˜å1°T¨{¼cÄ׎·,DõCeŽ×P+ ûÖ0~ÒxVî–6DLQ-ÏÅݰg î°th8CÔ¸[cˆøfim<Ðü1ðw5zpX›ø"üD¼Ž»5îʸ‹“@í'ÑÎ)a†T|F5D¢Pøfiâ‡gÏÇ×ÿýù&¿½½½»?_}ü×ý¸þë»ÛÿŽßݽÿñæýUAh(×Ç?ÿrüþŠÆÅáøÃÍÛûtU«dߘµ WÕ\ñæ=sU<ömzö,_¥ãŸî^ߥãóô‡Ÿßüû&sùcúæ›þ-ÀÀÀ šZ TѬP Bf㯃¶„´,Ⴕf‡™„&Â$ ¿0®¯ƒ Òס㬘ncÎÃ0Ÿ3¡LnÄ+'º€/Ásƒ}ת9 Ô¨gQŸ è´… 4¿ï–ü§zÉŠPfÅ3¼hf› íBšdø×jîˆjˆ ¾«]³tš€PYÂ[VÄPuÎáLz¸)Â8À!|ÍPèJã Pµ’á!ˆo¹!ˆ«S®<•¶© I¨6|9r10IÝ0‰ÚL¶P£7 ËÈR‘M ɨz®Ú.…!Ë#Ñ2L ‘*h¢'’ÅÄI«¯ÔÜìGr0·JY׈èµO"7éÊ@A†Ø?¡Îìì,Šî+ˆeŸ<¡@øªHågQ€£­tÏŠzBáÐMШó(žÂ? åàÉaH¤@EHoýë(|©Y s‚Ã9be¸2C\Âà-4‚j›Û(trÅL]iš ¦é‘A _>ª˜*o fù|- Š “4ÍÅuÐ<‘@¦¥ýRAó!Ÿ‡{–Î{>¯†Ûn—R˜®Äà”&Y 8LTƒþµK± ¨À*&€;â%êd¬Ž,†:8ÛŒÚÈBÆ[«=Á6ƒå)zTeà `{_G¡ý Œ¢hŽÂp7 D›z©ÑJz…éˆÅ ¤Tp}ð«ö "tϸ]:àWµÑMöù(Xæ4,UÅ`(Ar,Á yT‘Q Y¿Ôl€VC`¹H¨ÌàýŒhå9ŠRŸÑ+T¬+E‹È“ƒæF T…¸Þl:Ɖà œ@ øy²R½Œª|‡€iú Øž ` ªó³ð0Ebeš<êB(}Ìà’ð‹žjeP• ж¾d0½f:ŠÁa#%–fóQׇmn±BpÊåÜ=j΋€&¨'¦ íÈ!Èã…€ÑfÓaºÒAbe£j$ 5‘&D£,3Ë4[™;¶ÅDFaÚ#sÁ2¹ZâÚ£P½ŠÓ„0ŠóXɃUX˜ªDÌYQº2}Ôìàù' 7Ýè<_¹¦‰ˆ‹ð'ˆS ®uD_º°êƒÛž@hDïüt¬­‹4›|B¢£#xžG±rau_ÞeËØ©Ù—w9ÈŬ¢¥ëx éëˆð} _ë Ãw°U2>bmÄzXéfpìØ¤Š•nÙ6-á‰Ó<¶’sGíS)XND®@Ua¤HbÈg“D¶´| dñ rƒ2½ƒv“#˜·i9¸t¥;*âÏP4Ï…¢®'z„:Ý‚ô?=²ˆíBº8™E­¨ñèdªÌ !•õ«6$uÏiÕ†ëiV•²¯Ü"Œ8¶uǦ}É2&JÄÉò'¨ ¿^u 0‚± ÕYYº7bAü êuÃï9 ¿RÄót¥¥Æ™‘Òñïÿøgêàí¸vt¯°±Û?ýt½?üâîö~ôúVØKßÞza–ºíÈ¥hoéqd„Çú8¾|÷öÕ Ð§ãËç/ÒñõÍ/÷éúK…¼ÊÃñ{ us{ÿ!vð[¼ßýáîãû·7¶]ýqïo7?¾{óÝÝ/i¨*VM|,N¼|óo£Bíe{p¨ù'Ï8Èð Ð.ð.È.œÖ]°]ð]h»ÐÛ{¶½gÛ{¶½gÛ{¶­çë5vÁÈâ55x*d&ÏqøÅ:<„g!ËF‹`úç‹¢8N !~‚ûÅé¾ÄI*ulåæYƒbøÊgËݾ0‡&þ’ɶgK¨Ðà´@{¶C &q¶¡ªÂx0P˜{(@•:Û«O0#@á-§ªJ|áÑ×€Ÿf¤8òìÅQ4ü‚jî(âD¶©]èJ»@½c—اðX×' `3 éw¤s‰-:ùïЪ1«6ŽèÔ.Vîa3˜o‘¤±êožÂIÉÝåB{1†§Ó”Q-£ æÃSieÆ-|a!BHªrBÁq(ö´Ï¢X¹bÀ„ˆ‡øvÝÄžö9KwÒQPäqÜqG¡ÐØcP¬ŒœG¯>Cá¨Ý»>ÅJ?•ž·£¤ ÿA6‘IkA2™gK_n Öiþÿ²Î/‰æçô7²Î«Ö÷—ÞÝ_ÿ~9»ü/ë=Œ endstream endobj 5072 0 obj << /Length 116 /Filter /FlateDecode >> stream xÚ3·Ô30W0P0bsC#…C®B.3 ˜’JÎåròäÒW03çÒ÷ sé{ú*”•¦ré;8+ré»(D*Äryº(ü‡‚ä1˜ÿÿÿÁ£ŒQÆ(c”AW…Å—«'W Ê  endstream endobj 5073 0 obj << /Length 361 /Filter /FlateDecode >> stream xÚ핱N…0†KHºðôªDãÔäzMd0ÑÉÁ8©£ƒFgx4…G`d {N[  !Ä\'/Ëé×6çü”óy–Ê+‘‰Kq"…”¹ù¹x•üƒËìBÏgz"7«/ï|WðôQèžÞâO‹;ñõùýÆÓÝýµ<Ý‹')²g^ìŸ¸Æ @;‡?&yxÄ|*t¤‰ŒTT#…Ôcްãú‘ôFGºßšjK Œ©ÆR¶FgIA£óö–°cƒ!„ 1 î'ŠtåÉU1¦Ä@”¸ª©IoIe3óC õŒÀqG`¤,Rh„-Rdd.R¼B‰y¡ ¤6SiŽå ÿŠsfê—ßo{O¬uÖZG®uò²|¯„ž|Çùä{Ó÷­ïéf~ûAHZØÛSãïŒ`*¡¼€p·@eI+¬b`–(ö#)ºÏÅéÁÀ&Š0Ðð›‚?ð&Ϭ endstream endobj 5074 0 obj << /Length 360 /Filter /FlateDecode >> stream xÚ½“½N„@Ç—l±É6<ûÊaDŠä<)L´²¸X©¥…Fkx4…G ¤ Œ3;;äâÇ¡“Üå—ù^ö¿Åùq^¸•;sG™+N\qê3ûb×9:W®È9òðl7•MïÜ:·éºmZ]»·×÷'›nn.\fÓ­Ûenuo«­Sh¬h™ ŒŒ%"0q†hjè9uT1''Ðad⪖ò¹Ê·n”Š|̇´¯ l@ ÄÔÍÿ±Ã‡|s,èT¨¨ýx?ƒÑ·jŽôkÂÌ(lý±Úð¦Ÿ0ž± §¢ùÉöåALÁú;–Qì78ßú?`ý'Ë%L~ÀI0>ŒÑ`DÛ{¨=c/ŠÚGÓ+y)¦ BÄ®„oÐÑ"6tϼxƒ“ùœu6Ú¤äÍD£ÕêA‰¬MÏj¤^_49Z9Gä³4-d¦ðáG5k­‡–ÇKCæ‘H\^ª²—•½µ/„@ endstream endobj 5075 0 obj << /Length 256 /Filter /FlateDecode >> stream xÚíÔ½jAð‘Â4>‚óÙ]C6 ¯LeR%)SD’.p,ìôÄçHaqrpåÁqvÏ%ˆX$Mp`?~ÿb¦ÓÒ—¦MšnäsMí+z2øŠF»D;»Ïã F1ª1IŽj 1ªxHo“÷gTÑè– ªÝÒ÷ ÐeðÅÌ.˜óD æÍºþrwTcy‹ zMþj¤ÒgÔ´Pg?QÚÙÉ(ûn¾!¡•v5æ|ø™W”ye¥¦©o¾ÓÌP^jûšW´rJ‚–­K¥¾**Ž(?YÙ¯(=ë¬-ö%ëůŸ¿öc¼Ã-Ê?[ endstream endobj 5076 0 obj << /Length 415 /Filter /FlateDecode >> stream xÚµ”±NÃ0†eˆä%?‰ L•J‘È€bFÌÉ›ôUò(}„Ž"¾óÙ9ŒMU9_bÙŸþ;ÇÚ« {m:³ñk/ÍÍÆ¼[ý¥­í þ<ã«·O½ëuûìçtº½÷uÛ?˜ŸïßÝîoÕíÞ¼XÓ½ê~oÀK©‡é¤À¢ü5„ÀáP ‰Jz¥¶@O«™¨‘N‘üZªTjŽ*,x³"á¤a$*™T€‹‡ÍY­p‰\Ra5Va5Vaµú¸ÒUXUXUX†Uˆf7'µ¤BjI…d’ $RK*$sȦDX‘1Q PÆýG—P¦&Õ2kÆ‚ÊԤ̔Ñj *SSYjræ’­’“Ëv‡ÌLÈ I©9©V8©V.R­š ¡VŸdj¾@‚šI¦æ{Eää{e»Ê@–š“©‹Ì©\Rãó ZÕð̬jØ+«Z3­g’OPR£¶MjÀ±!YÐb‘ mÕBÛFµp|£Z83Qm˜EwÕ¼-©á‡d¡‰xsÒw½~Ò¡¾¾I endstream endobj 5081 0 obj << /Length 122 /Filter /FlateDecode >> stream xÚ-ɱA…á“($§ñ ç Ì\v³T’µSH¨¢B© $:óÈ@\#Qþß_‡õTQUE&ªMGã…Ö-nÿu8³M [Yð,ÎVº]ï'†v=WéN;SÜ3uzÀ3üãéxîý:côÁEâ†_Ïìœ endstream endobj 5085 0 obj << /Length 113 /Filter /FlateDecode >> stream xÚ3¶Ô32V0P°P06S02U01SH1ä*ä24 (Be’s¹œ<¹ôà ͸ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž.  ÿþøÿãÿ¿úÿüÿ™ÿ3Ô3ðq¹zrrJi` endstream endobj 5089 0 obj << /Length 209 /Filter /FlateDecode >> stream xÚeϱ Â@ à+B–>Bó^k­¸ª‚ÄIÛGë£ô:vž÷7HO„».!¹$‰'ó˜C^Ø›L9Yð%¢;Í ñDâ|£,'}àYLzc£¤ó-?¯+él·äˆôЇ'ÊWlŒ)•²¶½]¯ ÁJû¬aÐ@¿…£7ôÄ*Ñ8ºÙn¨•>ÒSúË_øWføÎÓ9sÖèä7p,"®Fâz"ª¾§K˜ŠýŽA=è7ƒcÙ×ÝÚ™üwߦÕ`PÓ:§=}Ù—š¦ endstream endobj 5095 0 obj << /Length 101 /Filter /FlateDecode >> stream xÚ32Ö32U0P0UÐ52T02R03RH1ä*ä24Š(XC¥’s¹œ<¹ôà ͸ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ÿ!àÀ …`ÀåêÉÈÓŽ¤Ô endstream endobj 5096 0 obj << /Length 98 /Filter /FlateDecode >> stream xÚ͉=@@ ÝwŠï¼}+6j?‰-$T Q¡TÎàfºG6¡¡2´JMé,'Å uw5Lão 2é¨RÝâkîÛ1C²&§B öJ3À<‚ßú‚Ò£ÅÀ|kø endstream endobj 5097 0 obj << /Length 102 /Filter /FlateDecode >> stream xÚ32Ö30W0P0bCKCc…C®B. m1K$çr9yré‡ù\ú`ÒÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓE¿ÁþAý‡úÿÀ ˆgÿ€¿ËÕ“+ !$† endstream endobj 5098 0 obj << /Length 188 /Filter /FlateDecode >> stream xڵб Â0€áŠƒp/Ñ{“(‰8 µ‚ÄÉ::(:×GóQúJc.½¡Yt²P>z !ùÍtl JœøWÏQϰPpM3IŸôãt̂أ6 Ö~ Ânð~{œAdÛ%*9Ê#Øê$!óê i¸&¶‘ Ý“ÐRZÆT²,˜wDHcÚ/¸ÿÑþ&:'>¾ß¶¬z ¸ Wâf\Ð÷äºýÖ]y¿¬,ìàLiÙ“ endstream endobj 5099 0 obj << /Length 101 /Filter /FlateDecode >> stream xÚ36Ò³´P0P0bcCSs…C®B.#˜ˆ ’HÎåròäÒW0²àÒ÷Šré{ú*”•¦ré;8+ré»(D*Äryº(üÿÿÿ2f¢¡ŽÑýÄåêÉÈ\qä endstream endobj 5100 0 obj << /Length 230 /Filter /FlateDecode >> stream xÚ}Ò±NÃ@ `Ÿ2Dò’7 ~.AE—T©‰ H01TLб$˜Þ¬}“ ^àCoˆbœl$8ƒ}¶GÛÇEAH9G§Žs|B7“>ëÚnñ°ÁE‰öŽÜ í•LÑ–×ôòüºF»¸¹ í’V9e÷X.‰Ù@̼c¢Dp#JÿêЊÎÿê‡Eïš¾¹êB‘—0ŸmkˆöªæâUi€Ä ”4p¤+nál¨ˆáM—áÊëÞ×#m¿všª ¥ #%í”âF• …^òQ0Ü_ß?Ô½ð²Ä[üPü¼ endstream endobj 5101 0 obj << /Length 187 /Filter /FlateDecode >> stream xÚíѱ Â@ àÀ B–>Bóz½Jk;jotr'utPtµ}´>J¡£ƒs-‚‹àü.pGIJ…44‡Mhoð„‘ Š’þdwÄÜ¢^S”¢žKŒÚ.èr¾PçË)Ôm [´1s«˜›o·i§jþþjéÞ­þðÞ›‰ÞÛ ÀH‹ž˜ø¸‰WJFÝÅ~ë,ݯHùÌ5tƒ ]¹M€3‹+|œ|»¥ endstream endobj 5102 0 obj << /Length 187 /Filter /FlateDecode >> stream xÚm̽ Â0ð@†Â-y„Ü˜ÔŠŽ…ZÁ ‚N⤎ŠŽÒ>Z¥à tÌP<ï*Ýò ÷ñ¿™Ÿdsô8å7ó˜-ðœÂ ø÷8”28]¡àö\ƒ[† >îÏ ¸b»Ä\‰‡ýB‰*Ji"¥ Q£l—wŒ‰Ü7=“|F4ý°cZF׌¤G䌈Ñôæ=’D?f+ÉV’¥æ‰LÙ3ë,Õ6¾(ŠÄ7Ú*ªªÎ#¬ìà WGiÒ endstream endobj 5103 0 obj << /Length 174 /Filter /FlateDecode >> stream xÚ31Ó34V0CcS …C®B.#° ¢’s¹œ<¹ôÃLŒ¸ô=€¢\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ÿ€à?’L2Ódþ"åÿƒÈúÿ€äù@òÿ y€ýl`þR%ÁˆJ6`(&ÑÍDA 74°ÿƒ» ìο?ìnþvÿ°_°ÿ``àrõä äE‰c endstream endobj 5104 0 obj << /Length 172 /Filter /FlateDecode >> stream xÚÎ1 1Б-ÓäfN`\‚Š .¬+¸… •…X©¥…¢«íQr„”)ÂÆ hoñŠùÃðÇLGó’Æd² ™]J¼£ÉÙ8yq¾aÝ¢>)Qo8EÝnéùx]Q×»qÚБONØ6¢¨R)ù¢—ADdPQe^ÅêË:¬ÞºA—À¿ìçÃLX²…ŒðæúP¤ÂsLj¸nq‹ÏV endstream endobj 5105 0 obj << /Length 182 /Filter /FlateDecode >> stream xڵα Â0àH‡À-}„Þ˜¦Æâ¨Ì èä Nêè èÜGÓGé#tÌ wBQÔM„䃻„»ßä}=Àùš‡#Üj8€É¨N¹ä‡Í j‰&5¥.(7ÃÓñ¼UÌǨA•¸Ò˜®Á•(„ˆ&|WTퟔžµ 6FA’òÖ#c/ÈÄs†¤áÿ¯§ªß ?û9ÓÖÏIgÕeãœ^D­ áJù/¤m-7$L,à¶Î—‰ endstream endobj 5106 0 obj << /Length 188 /Filter /FlateDecode >> stream xÚ]Ž1‚@E?Ùb“i8{ƒ bâ&ZY+µ´Ðh ÞŒ£p„-)ë@,“™—ü?ÉÌ׋t¥Bµä‰Ó¡o=)NXΰ¸>(7¤O*NHïØ%möêýúÜI燊Hê©ðB¦P=€ÌÕ€sžó[ˆNt­×ƒ…C`™EY(›)j× ›‚kІ¯ÏPÎ`‡¢þ5ÿ••ìàW¢GÆ©¾œ²t-pHW¶†Žô<ÑcË endstream endobj 5107 0 obj << /Length 145 /Filter /FlateDecode >> stream xÚ32Õ36W0P0bcS …C®B.cC ßÄI$çr9yré‡+ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. õ˜ÿ`ÿÿƒÁþñ†ÿÇÿ0þïÿÇøŸÿ3³ÿaö?Ìøý>üÿÿLH=-0º¸\=¹¹ÍÈj2 endstream endobj 5108 0 obj << /Length 240 /Filter /FlateDecode >> stream xÚ±J1†G®L“7¸Ì ènÎ[´rá<Á-­,ÄJ--­7¶’GØä ÞøgµÑJ¾ 3?þYû£n%­¬äПÈÚËñ©šÏŠ’ÇhöôTñ7` V‰`ɪN´T%Zº àw:û~F¨¨b.H5#À@'ÄúJu– ÓHd3|MÞ㢿˜˜4Äé'rqúÉ– 8*U$²ˆ/¾á/© endstream endobj 5109 0 obj << /Length 148 /Filter /FlateDecode >> stream xÚ31Ó34V0P0bsS …C®B.S ßÄI$çr9yré‡+˜˜ré{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]þ3Á$;˜d¦%ùD²ÿ?$ùÿ’vü?€dÿ ùL>`ÿ'€É ’aÉÿÿÿÔÿÿIr¹zrr7 Šå endstream endobj 5110 0 obj << /Length 125 /Filter /FlateDecode >> stream xÚ32Ö30W0P0acSK…C®B.#rAɹ\Nž\úá F\ú@Q.}O_…’¢ÒT.}§gC.}…hCƒX.Oæ ü?äÿ€ý?ÊÕàŒÿþ#!þ ìÔFÿÿ€#.WO®@.ücQZ endstream endobj 5111 0 obj << /Length 175 /Filter /FlateDecode >> stream xÚ32Õ36W0PÐ5SÐ54S02T0µTH1ä*ä22 (˜›Âä’s¹œ<¹ôÌ̸ô=€\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. 5 Œÿ˜ÿ7€1ûÿ&RRO°?À`ÿ31ÃàÀò@lßðÿ@ýÿþ?ã†ÿÁ˜„ëÿc¨oÿtöþÿ€Þg`àrõä ä—‹¥ endstream endobj 5112 0 obj << /Length 102 /Filter /FlateDecode >> stream xÚ32Ö30W0P0aS …C®B.#C ßÄI$çr9yré‡+ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. Œÿþ#!þ ìƒ ýÿÿޏ\=¹¹õ'Xr endstream endobj 5113 0 obj << /Length 173 /Filter /FlateDecode >> stream xÚÕ̱ Â@ àˆÃA–{„æ ¼V¡­‹C­à ‚NâTÁ>Z¥pc‡z1í䢻Càû“ŸÄÓјBŠd’& "> stream xÚ31Ó34V0P0bscs…C®B.S ßÄI$çr9yré‡+˜˜ré{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]þ1üg`øÿýÿ Éÿÿ´ãÿ$+øÿ0°ÿû$™ÿ?`ÿ'€É ’aÉÿÿÿÔÿÿIr¹zrr¿_u¬ endstream endobj 5115 0 obj << /Length 169 /Filter /FlateDecode >> stream xÚ•Ž1 ÂP †ÿâPÈâšøÞÓŠc¡Vð ‚N⤎ŠÎõh=JбCé3ƒàæ/„ü_ê&ó)[*µ<[ðÙѤ[ÖqXœ®”{2{™É¬•~ÃûóB&ß.Ù‘)øàØÉŒQ B‹(ÄF]Ô#n0nP¾A¥Èjdµ¢4_Aû~|>KF­Aš«ê¢Vê‡L®Õ™Vžvô›kó endstream endobj 5116 0 obj << /Length 183 /Filter /FlateDecode >> stream xڭϱ Â0€áH†Â-}„Þ hë(Ô ftr'utPt¶ÖGé#tÌP<Ó¦7%Ç7\ üÑÉH*ŒÝʵB5Å£„ èq»¨îêp†Ô€Ø¢ƒXº=³ÂÛõ~‘®ç(Ad¸“ïÁdȈ׌EÔø Âi£ÊY†–q*ÂÚ™O'ó¾OÞ;è,~6ÿxÙO@}ƒïñmeÔtÚYålúyûNmdìÕ_…… ¼óàa endstream endobj 5117 0 obj << /Length 138 /Filter /FlateDecode >> stream xÚ36Õ35R0Cccs…C®B.ccˆˆ9˜JÎåròäÒW06æÒ÷Šré{ú*”•¦ré;8+ré»(D*Äryº(0ücÀðÿŸü aÿHTüÿ7°ÿø¿ùÿAT¢á?¨ ‚H0МøÿÿÁåêÉÈN9V  endstream endobj 5118 0 obj << /Length 183 /Filter /FlateDecode >> stream xÚ=Í= Â@à'Â49B殉;üSZYˆ•ZZ(Ú‰Içµö(ÁR!8¾ˆûÁüì¾í¦í~O;Ú­ñôu›ÈAÒŒý·­›½ sqKM3qSNÅå3=Ï;qÃùHqc]%ÚYK>VØ M3DäKÃWĸP…èëýcìN, …=á­¢7b[feƒ¸ ¼ð‡'¢?f–5¾â®Ì¬ð²îE€LrYÈŽR® endstream endobj 5119 0 obj << /Length 143 /Filter /FlateDecode >> stream xÚ36Ò31T0Pa# Sc…C®B.#3 ßÄI$çr9yré‡+™qé{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]ä0°®ƒâÌÄÌ@ÌÄòÿÿ3üGÂìPqÊ1óB˜ù?{3þïg`øÔdÿ¨ñ—«'W S™Ov endstream endobj 5120 0 obj << /Length 148 /Filter /FlateDecode >> stream xÚÅÊ!Â@ÐÙTl2¦G蜀í¦[*IJIXA AP€D@@··ã(\¡ªŸY ñ_òg~˜Ï|%¥xMh¤jäìùÆ¡Ö^¦š§+·‘Ý^BÍn­Wvq#ûó®Ý.ųëä Ë#ÇNd& ~iAùDÈþÕüËb"Z$‡D€‘z¼Õ/5ƒÅÈ«È;þ.qmz endstream endobj 5121 0 obj << /Length 223 /Filter /FlateDecode >> stream xÚ]Î?nÂP pG Oò’4¾@û’<þ4RÕH¤f¨ÔN ˆ @ e@Jz³ .’#dÌPâú¡Ñ.¿ÁŸìÏ}óô’O!=Cê‡dF´ p‹&’©OÓFË ŽÔ32êw™£N>h¿;¬Q?ß(@=¡y@þ“ 1WYóÕ€* =!¿âpîBKápñÐQ¾då‹åWiG]xuÕâ^Ê÷ô8oqîæ/ÇéÚ"±%ûø$|¾"×+eqåzêÙuùâ°Ÿ ®„€Ó¿ð1|m endstream endobj 5122 0 obj << /Length 188 /Filter /FlateDecode >> stream xÚÎ1 ÂP à–…,½A›øZÛÒ¥(Ô ¾AÐÉAœÔÑAQè êæµÜ¼†›«›Ôü‹:ù $á%‰‚FÜdŸ‘Ïqij€–&’W)ÓešÔˆÃ„TOª¤tŸ×«ÍœT6èp@*çqÀþ„tΆa´Œ7;ð0k,`§Æm°¯¹ æU°*΂}œ pA ¶ 7Á¼VÅI°‚ƒ•pA P‚§¼ò‡ÏûþÄÁ·o¨«iH/ÛqkÈ endstream endobj 5123 0 obj << /Length 223 /Filter /FlateDecode >> stream xÚ…Ï1kÂPð?8‡4«“ï¾@ûòúp2`-4CA'éd;:(º‰ÉGËGy!c†`z§Ð‚.¿áŽûß]â^ÒWŽ9ágÇ~ÌiÂߎ¶ä½cNÓkg½¡iNvÉÞ“ý2Ùü“÷»ÃÙéüÙ¯Ç_”Ïx `€#Lèµ0]×üQ+A©”RÐ*µRAg5Bv™Õ¨&“Ð`$¾”ŽAÔb„þO Ðïn(ÿ1JV Eº õÐÆ•¢ŒÎ8A˜è¢‰¬—½Y(AÒä ž¾} rè=§ýòuƒ endstream endobj 5124 0 obj << /Length 227 /Filter /FlateDecode >> stream xÚuÏ=NÄ0่4M޹8&낆HË"‘ * D”[,‚–øh9JŽ*RDÆ QlóY~#ÍÏÆú3®¸æÇõ9û ?;:Pí5¬Øûµò´§mKöžkOöZc²í ¿½¾¿ÝÞ^²#»ãÇÕ#µ;š02…Ìú>€.\‚YÔÇÄLB> Ť”4 c&hFDtÚè:A>%@¾d€ˆ’˜ÏÙÄ„@¦l%$ú•ñ‡á(Ý1š_ú…r!µ/Ò t‡’G=«Ð{E&ÝRWC©KÂhDW-ÝÑ7빤¼ endstream endobj 5128 0 obj << /Length 204 /Filter /FlateDecode >> stream xڕб Â0à+ ‡Ø(z/ I• E¡*ØAÐÉAœÔÑAQp(â£õQ|„Ž^m‚E\$|Kîî¿¥Úý.Iòj’:Šzm}< ’Tœ00µÍãÅ’”D1åŠdF§ãy‡"žÈG1¦•Orɘ Æ<²ÀºØ€spùªÁ"–²G¥…9¦5¡4ÐÒʳò’ëQ3ÎܬŒxÇ:n¨™Ø«–~y~VýåòCTáé(Ô™£ÙüF++ÃI‚ |Û A¨ endstream endobj 5129 0 obj << /Length 194 /Filter /FlateDecode >> stream xڕн Â0ð+…Côï4_( Å¡V0ƒ “ƒ8©£ƒ¢àСÖGé#ttp0!‰Šƒ á·ärÿ$§T< N‚z’“’4”´xBÅÉ®‘ô¥ÝSlMŠ#››}dzA—óõ€,]NI Ëh#ˆoQgЀ–‰J£rÀª½Û—ÜHþÿððîNÔN#¨œ80om[…ÓµÀ™xáŠ"mTé#lûG[âX»)¼ŽúiuÞe0Û€3+|RA endstream endobj 5130 0 obj << /Length 137 /Filter /FlateDecode >> stream xÚ32Õ31S0P0´P06V06R0µPH1ä*ä24Š(™B¥’s¹œ<¹ôà ¹ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ŒØ?ðàÿ!†ü?Ø70aCÆŒ˜Øød,€‚@!.WO®@.õœ"m endstream endobj 5131 0 obj << /Length 136 /Filter /FlateDecode >> stream xÚ32Õ31S0P0SÐ54S02P°TH1ä*ä24 (™Be’s¹œ<¹ôà ¹ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ÌØ?ðÿ ÿ ?°o`0`(`H 0703°3ð1È0X…B \®ž\\Ë—!Ð endstream endobj 5132 0 obj << /Length 93 /Filter /FlateDecode >> stream xÚ32Õ31S0P°bCK •bÈUÈâÄ@tr.—“'—~¸‚%—¾ˆðôU()*MåÒw pV0äÒwQˆ6T0ˆåòtQàc°o¨oø u 6 \®ž\\TtÓ endstream endobj 5133 0 obj << /Length 164 /Filter /FlateDecode >> stream xÚ31Ò31Q0P0TÐ52T05T03RH1ä*ä2±Š(XC¥’s¹œ<¹ôÃL,¹ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ÀØ€L1C)0ÉÀ¡ø „’PÊB@¨õB€˜|‹P“ÙðX5Ù€X °:Õ¬NÇcV§† ² \®ž\\Á-› endstream endobj 5134 0 obj << /Length 117 /Filter /FlateDecode >> stream xÚ32Õ31S0P°b#3c3…C®B.C˜ˆ ’HÎåròäÒW04ãÒ÷Šré{ú*”•¦ré;8+ré»(D*Äryº(0Ø0Ô1üg„ÀŒ ˆ| ö õ ÿ!h€ —«'W %– â endstream endobj 5135 0 obj << /Length 96 /Filter /FlateDecode >> stream xÚ3²Ô37T0P0W04S0²T02TH1ä*ä2 (˜B$’s¹œ<¹ôÃÒ\ú ¦\úž¾ %E¥©\úNÎ @A…h ŽX.O…úÿ?€è?}àrõä ä¿Iz endstream endobj 5136 0 obj << /Length 94 /Filter /FlateDecode >> stream xÚ%‰»@@ûóç ÜÝ»¶öHl!¡Rˆ ¥‚ð÷„)¦˜ñšxOÃŒjéSªãl±Á…7ê?¦y„ôtRS!±á±Ÿ $o ZHÉÁÒŒˆ%ï—몈 û¢ endstream endobj 5137 0 obj << /Length 288 /Filter /FlateDecode >> stream xÚÐÁJÃ@à„=æ²/ î¼@MbÛ”BI V0AOŠ'õèAQÈ!¤y´}”øñ¶B0Îl&‘.?|C›Ì¿ðÏV3ôqzŽÓ`‰á +| àÂ9=öqvïža“€w‡á¼+z^ro¯ïOàmn.0o‹»ý{H¶èÐiQ¢)eMJ]©S2vÒH’¹k²˜Ì„©÷d-Œ!]#¾~šœu?ÌÚá»Úëþ8é,yl-”šÇVÝW6|tOGœ¾qÁáµ8ãîmhm›q¿m¨›QÝNcG«PtV<Wcù_õý:RÓ‰…â-•Ô\GIñ¶‘Ò»>˜)Í¿iRéòçÒJNøÚ¸ o/‹¶¸Là~¥Ÿ§£ endstream endobj 5138 0 obj << /Length 281 /Filter /FlateDecode >> stream xÚuѽJÄ@à )Óì ;/pæ“Sç ¦ÎÊB¬ÔÒBQ¸BâÂv>‚Ïß$peŠ8;»çå¢n±»³ 3³Ù~vˆNœÄSLcLð.†GHºŽpšmb·0+ ¼Â4ðœøüôrálqŠ1„s¼Ž1ºbŽ‚VÞšÝë{MuPJ{µ oM”Â7´"Øâ5?ÐKŠûZØgcGý?ÒQýFö´vè¸>*jˆ¹Ìµh¹è]> stream xÚmÐÍJÃ@ð 9æ’2/PÓH×V¨ Ô æ èɃxR‚ŠB%é£|‘^sÌ!¤ÎL¾ƒË$¿É.Løïlq¼pŠ“œsÔ3ÔgøÀhMÛSœŸ6g/°ŠÁ¿C­Á¿¢ðãküxÿ|usøk¼§a¯QÑJ ¿íC‘î>d<å2¡ŠJb«R¦PiAä‚ÕrNØw=ìÇp×Ãép wô×wÕÖåí¸zDDT#Õ#í ‡s%-åŽWVÊ’·Ð碶!{íá6“q`ǘøÞs|nàK°vŒõ+¨ƒÜ€ZV¨1œ{Ì‘'IM(”5ËŠ­o„M&D¦š\Í‚Ëná/c—Û endstream endobj 5140 0 obj << /Length 219 /Filter /FlateDecode >> stream xÚUнŠÂ@à]¶X˜"yp7Oà&B¼tþ€)­,ÄJ-…xœ`—¼¯äÜ+ä ÎÒBX³3wf>f¦˜Q6øbйËG)î38Aîf©kÝbw„q fù̼›‚)øûs>€/'˜™â&Ãt åEòæªPš‰>{Zâ; f,óOÈž?B]}tì1LÂU|÷hµ‡¼ª§!´ð‰’€‚©­õ°L+ôƒ^¤Þ¨†Ð=‚ˆ™ˆI æÂTÌB?…KkÙÝ Y +xir§ endstream endobj 5141 0 obj << /Length 245 /Filter /FlateDecode >> stream xÚUÐ;NÃ@à±RDšÆGðœ kK,¤‹”‡HPQ *BIAµs4ÅGp™"Êòÿ»Á6…õÍ®w»~¹¸óV¿ûÊüƒ*ýRÏuÉ%ƒ÷O]×ê^Ì{u{쪫íûøó¡ný´±JÝÖ^++ß´ÞšÌC‰„S¢É{)zÐÉü™\"i%»¬4á”6Íò‰Uj‰HSÑK&eo©ÂTF€çg³K´±³ðÿ5Ѥ²¨r#ïãŒØk¤ÁDV#¸ Ĉó7èÿ¯—'Šîïp*ÃSó¥±AÎ ×]­Ïú >à™ endstream endobj 5142 0 obj << /Length 275 /Filter /FlateDecode >> stream xÚ…ÐÍJÄ0ð顃}ƒí¼€öƒÍ² º‚=îɃxR‚ŠÂÄæÑú(y„{(3itáG&Édfôêd^QAeEÇ-–¤Wt_ªg¥5G Z”áèîQmj•_“Ö*¿à¸ÊëKz}y{PùæêŒx¿¥›’Š[Uo @<âˆ9ufÆ8g׋:&í°ç£ëh€¬FŽ÷ˆOÂ^|I‡ÌòÓNî{Œ§‘?,œ''Oìi%ÉÉõ‘”_ùàMÀü à–?ØK¯ÀÓ´ L Áz¢@;uÙúž3Áå2<ÛŒ+ãÙ¦Œ ÕJfWÄ-ƽ<Ï%5¾Þß’“É uöP›:¯ÕN}°m» endstream endobj 5143 0 obj << /Length 249 /Filter /FlateDecode >> stream xÚ]ѱNÃ0à‹Ù®ž¤f»–·Zªwn×BÆ{ÿG4êûèQ ù@ÅdNAÂÄBí¢Í^=•IÝ T‹d¬%sµ™÷˜Ú]KsýÄbr¦h6ó@Î^^43{2è±¹˜îƒzD!;‰(dý«­`ïÑ!´m¢X“Ú¯¡m㺠ZÆèB$B¤¹ŠÆRm7ó˜WúKPËÄ›–_ø †×Šæ endstream endobj 5144 0 obj << /Length 245 /Filter /FlateDecode >> stream xÚ]ÐÁJ„PÆñO\gã DsŸ « ×ZÄÓ¹jÕ"ZUË`Š‚Cúhó(>‚KÃØù®Žf‚þ¸ žû¿.;™ÏMbœÞÙ©qgæ%•wq™®.ùáùM–¹Øã2±7úVl~k>?¾^Å.ï®L*veS“> stream xÚeÐ1nÂ0à?Ê`é-¹¼Ô ÂС*R R3T¢CÅŒHµR¤äh…#ddˆ’úA vkÉþü{ño›áÀc6vŽ6c^'´##9–(›Õ–ÒŒô‚!ýjOIgoüµÿÞNçSNHÏø#áxIÙŒ¡;ê? *¡„Ðrú–§Ž£Ëħ¸óä>h Kur— FäP¡wåÙVÒ á¥¬Pu¨3ZB‰ŸŽÈç„Ïû®Òá(MnL| —Ü.G}Yƒk²ýzÉè~ƒm endstream endobj 5146 0 obj << /Length 270 /Filter /FlateDecode >> stream xÚmѽJÄ@ðÿ±ÅÂÞ˜yÍ— pppž` A+ ±RK EÁBÈ>Z:_#oà–)BÖ™½wáGf6󱩧ł2Ê :)¨:£òœžrójÊ’£UyL=¾˜umÒ;*K“^qܤõ5½¿}<›t}sAü¾¡ûœ²So€qĬ¼=f¼ï–›9fîðùÅ©Ëh€¤FŽ÷PC@s€>ítü©“óh¤G˜[†€ ´Rd‡ÔúÃJÉ " h"ö|š÷<zØŽÙtÄí! Í#ݲsi‘DÚ0$§'x,.$cq/õcÁ÷¢¿­,±Òág J z·ß\ÖæÖü­U endstream endobj 5147 0 obj << /Length 208 /Filter /FlateDecode >> stream xÚÍб Â0à”…[úÞ˜V´…ZÁ ‚N⤎ŠÎí£ù(}„ŽJÏK‹ÑÀ@È—„ûá.‰Çé#œòfÌR<Åp…$å{d®æãxLÜa’‚\ñ+HµÆûíq™mƒÌqct•£ð‰tHTý€´#>EP3žßs‹Ò raJ !úÒ!L½Ñv(]p†gÑt.8÷Э xYÔ4}k]FhaZ7¥C|¦¢Ý©üÛxÞS)¨õºÞ‰ZX*ØÂ ¬Sšd endstream endobj 5148 0 obj << /Length 155 /Filter /FlateDecode >> stream xÚµÎ?AAð•Wl2#˜ØdKÉó$¶P)D…RA¨9š£8‚òbìóÆóË|3ÍüÐz´8*ãqqïà!ælK,Ýêf!‚™ç+˜´ÀËùzS/§èÀ4¸qh·TQûƒÒy”~1}áÉ „3îÌMP u|˜žðf*¡e´ðz”7"êÈ…`–`_ÂâSt endstream endobj 5149 0 obj << /Length 199 /Filter /FlateDecode >> stream xÚuϱ Â0€á”…[úz/ imŠu*Ô vtr'uªè\ÍGé#tìPŒÉE#.ßp—?"Æ 0ÁÁãã1îC8j ÚÑfw„¬¾F!€ÏÕx±ÀËùzž-§Ïqb°…"GÆ<)›o™×)˜Û~ôŒ­o¬mûÆ»mj¼ÙVFf+ɇ­cìlÝŸð¯üöO¾2¥ðê¥Î—”üVgvdMi5…”L?X:úpâêc=_ÿЧn3˜°‚'ä¯VO endstream endobj 5150 0 obj << /Length 203 /Filter /FlateDecode >> stream xÚMα Â0€á+…Cè ½'0©ØÚAª‚ÄI7ûh}”>BG‡bÌE1 䃻døÓA_æ$)å; tD‡/8ÌÌ,yä‡ý …bCà ÅÂlQ¨%Ý®÷#Šb5¥ÅŒ¶ ɪA¨u ÎD DµfcßÊ9ñ-O_pjÏ·3ðmß—3ômœÑß® ïýäð±5·áŸ~¶66¼fƒšÃ;_+­QÅáqÉšo&V—&9Ô ùx¾ç ×øûdœ endstream endobj 5151 0 obj << /Length 300 /Filter /FlateDecode >> stream xÚ]Ð?JÄ@ð¦˜"{¸3'0 ®› ë ¦ÖÊB¬ÔRˆ¢°U’›x ËÜÀ#˜8åÁøÞäŸIñ¿oŠóE«ÓÕZŠ&>Sç‘z Å‹ˆ( Ïb›ÿVEká_á«ð“kõöúþ$üíþB…Âß©»P÷"Ù)àÍ·é´$› £•NºšH’òA?%®“A^ à|‘6¤ï^ì£@Å(.§: \= )ʛɠâ¼Wš‘ªQY;àXývrÊšTfÀŠ©Š;£è¬ÈÀ‰£<Ö+fT ‡QR«‰÷ª8ä‚vÊ™– Y±eKÍa¦ hd'ÚÒþI~¶:t'mi «¹ ËÙª ñ#‰JkšRBÞÔVËAn+q™ˆñé¥™Ê endstream endobj 5152 0 obj << /Length 291 /Filter /FlateDecode >> stream xÚ]ÑÁJ„Pà#..œÅøÃÌ}‚Ô(u1 Lä"¨U‹hU-ƒ) \úhΛ½€ÐÆ…x;ç\G-PüëÿŸ(<‰Ou Ïè%œÇú)ÄWŒbZ¼äƒÇÜfèßé(FÿŠvÑÏ®õûÛÇ3úÛ› ¢¿Ó÷¡0ÛipM `L=GgŠ hTà6GÐ xŒŠa, B9Ǫ(A R}a9¡²Ø¬+ð,jX0ï?r¯•@5°dì'´ÛÂÆ¢ƒ„Qp,œÚé!@{F5Á(IÍ”’å€T@‘ÒÀõ£S’ _Ò =ß#¤ÂÏ% HÊŒVè–¿ HΈ^Z™ùƒGöÉ¿Ü (xš\Œ5™/3¼Å_Ë||Á endstream endobj 5153 0 obj << /Length 266 /Filter /FlateDecode >> stream xÚmбN„@à!$Óð;/ ÀHlÜä<)L´²0VjyÅ팷ƣð”äpþ9L0@¾e†ef§./ëZr)6r±]VWòVð«R£¹ÔÅœzÝó¶áìIª’³;sÖÜËçÇ×;gÛ‡Ñ÷<’¿p³"ŠO„ËO-“±.”4Ð7RD×Ê‘S4áEúYÚRÒzcéf‚ÒcÅ=¶T‰‡h\KΕÿHg:Ãd@ůq è¸_eÂÑ\·‚oÿŒã Ó™“ÍŒšEc†¶¼@[ÆÑµWðK›‡·†Y6' ÌPÇ¢ÕѶ’·‘›plЬ>ß6üÈ¿ƒmyä endstream endobj 5154 0 obj << /Length 208 /Filter /FlateDecode >> stream xÚeÎ;Â0 ÐT¼ôõ H«*0V* Ñ &ÄŒ ˜Û£õ(=BGÔ`‡O1$ÏN;f2Î2LÐК¤h¦xLá†ó„Sg(JÐ[4ô’NA—+¼]ï'ÐÅz†)è9îRLöPÎQ¬µå°j¥¢Nå-ÑrÄ„TÿžD#ɉ~ –T?Bª¬”„frOMPÕ¨sÐÈ`à;¤vôî)Gÿ/¤O7ºr$òi%±O#É}jIå£$Ö£w{ðÆÚç?°(a/5ÿsR endstream endobj 5155 0 obj << /Length 325 /Filter /FlateDecode >> stream xÚmÑÁJÄ0à)=réu=%/ m-­+ÈÖìAГõ(¬¢7±é›|‘À¾@ËÆ™d -´—¯dštæO™Ÿ”¥HEv*޳Rà{q.^2öΊ—SqV µç7¶®Xr/Šœ%×X`Iu#>?¾^Y²¾½K6â!é#«6Â=Ð#mKôQGk:0HÜÂ7•Vȧ/AçÊ‘'Ö‘ÞzP·5×ý%4A?&4cüŸâšN1|‚lg¨uÜÍbi4®gí娕ˤvMƒõìÁÞÏe†ñjˆ•VjlYÂö ÃJ§oÚÃàZ`†ñ¯ZàøÑŽpÄp4TðçR«¤ë£éa;¬!»„%-_@êÙz:…«Ð!#=ºMiÕÓþÂy¶±«ŠÝ±üv’Ö endstream endobj 5156 0 obj << /Length 261 /Filter /FlateDecode >> stream xÚMÐAJÅ0Ð)]fa/ð¡sm+¶"ïìBЕ qõuéBQp×­Gɲü iœ™hMIyM:™ÌdhOúsj錎Oièˆ'Ͼa?ðbKýEú³ÅíˆÍõ67¼ŒÍxKïŸ/ØlﮨÃfGµO8îÊceID``g&@òY”â›ñ95³ü3çØ•’#­Ë™œœ¥ð “fW<@Ô ‚€E¿Çs>‰(Rµ §’:$ÓV.Á»¹bãAû*3ÂJêËü´€ î«Ê˜sìJ´¯Ú›?&¡JI_B”´›)J—rí&| eàýüD¯X‡×#ÞãdŒ? endstream endobj 5157 0 obj << /Length 255 /Filter /FlateDecode >> stream xÚeбJÄ@à?¤Lqy1óš;ÉåÄÀy‚)­,ÄJ--í‚É£í£äR®\g& wÚ|°ó'ìü[”‡å1Ϲäƒ#^¼<áǽP±’¡ŒSòðLëšò[.V”_ʘòúŠß^ߟ(__Ÿ³œ7|·àù=ÕP¹…aHÂ(fîãTÆÈ AêÄ#{Ľš8=N¦Ý¯™Ø#Ã_+ÑíÚAïžtjÖ›£4HÃ`~AWÓQ‚~,¨‚·@Ekÿ¥flF[bÛ³î[ªúÏ µ~”ö“-´½(½ÛN[¶N£ÏA/ñ£¼†V—í­‹³è¢¦ú?Fj¤ endstream endobj 5158 0 obj << /Length 214 /Filter /FlateDecode >> stream xÚUϱjÃ@ `ZîB­'¨ã«S0Òâ¡ÐNB§¤c )-t³ÍâGðè!øz²3HôñKh{~\.hN™ í)'—Ó)Ã+º,ä9Çqs<ã¦Äôƒ\†é>Œ1-_éçû÷ ÓÍÛ …é–áæË-ÏÕÞ±wzð´¶L“Ô 73ˆnb¤. fV÷ c†éF ÓI, —m%‰¦‘¬5µ¤Ò€Ä+I¤¹IbM/1šNb5Ó'ë1UÞó…Wà®Äwüݦpt endstream endobj 5159 0 obj << /Length 253 /Filter /FlateDecode >> stream xÚUÐAJ1à˜ÅÀ[4ç]@3SH[A¨œ… +âJ] Uº›£ÍQz„Yº(/É(™EøÂ !ÿŸY}:ŸrÅõŒO¦,[3ççšÞÈ™VlΆ£§WZ¶¤ïÙÒ×2'ÝÞðÇûç éåí%פWüPsõHíŠç¬r‡1ØZøµÐ p8áüŸƒ°ø#ól"kdû”ÜÓGvÈR !èPô)JÈ,Ô.¥Š ìRAE&‚Mñ½Ž#G±×˜¡ÞbToYè’=Ð$-¾C0dðLâÊÿ¡´øŠÈm¨.—ÛÒÖçFæüÃ’bðͺjéŽ~)kB endstream endobj 5160 0 obj << /Length 231 /Filter /FlateDecode >> stream xÚUÎÁjÂ@à 9sÐ;/ ›UÖ¤*X æ èɃxRBZÚs·ôà­OP|–3ÿj˜€WòÄÄLĤ¹Å«ÈÀ3+¾®C ,¦Ít"‡”Éïå²y®¦\6´*ÀÒvè211©E[&:·|Ud–oÝäM~˜3óË\š<ü9äLæ ì…^|Ip…ÿù` endstream endobj 5161 0 obj << /Length 293 /Filter /FlateDecode >> stream xÚeѱJÄ@à [¶H^ °óšäð.¹êà<Á‚WYˆ•Z QìnßÌ ;ŸÀb!eŠpëÜn6âÚ}üà ?L=;^ž`e…G3$Î+¼+ù#¯”8_Ž£Û¾nx~…Õ‚çç”ó¼¹Àç§—{ž¯/O±äù¯K,nx³AcúÔ¦µ:¨sÒñ`§íõ+ ÑàÝEz’òb¿’^±ÓŽ^‰“ñŠHY ö&¡& ^T'¦{m „¤G©Q™PTjsªIÒ‹ªÔNê„Jœ´W¤„Ê1)T(¡Ú@ I{½;e$åõ!­êI¯ >Áª¤A|Yí½À(ß¡$ˆ>€è¼R'úoª')«á¤U?‰öRD ~Öð-ÿ:‰­T endstream endobj 5162 0 obj << /Length 275 /Filter /FlateDecode >> stream xÚeѱJÄ@à )¦0/ É>¹È™CÎL!he!Vj)œ¢BH-¾IÀÂÒ”W„¬³3ãA°X¾ewög7ÏŽVÇva—4òS{²²¾`îë…/ýäáצ·6_bzI«˜VWöíõý Óõõ¹Í0ÝØ»Ì.î±ÚXœŒsÿCÃõáЀøAdí1 mdçu¶¢ñÐáHlcµ`˶»­Êm ùìÄ/õ›ÛAôâ$šQÝÍ ÿçî÷Oó>‡jáÄZ&è¾?èJ6lKÎe@<€„!áü…ZCÄn!òϽHodn#iðXŸ©.œä7|pG_Ò¸‘u{w€Þà/:¹wÇ endstream endobj 5163 0 obj << /Length 212 /Filter /FlateDecode >> stream xÚMÎ?ŠÂ@ðoH1ðš\@È»€Nbj£àº°)´²+µ´P´ $`‘No°g‰7ñ)S„dgFA›ï/ê÷¢ˆ}q7`Âo:PhŠ>‡Ãgg³§iLjÉaDêG—IÅ¿|:žw¤¦ó/HÍx°¿¦xÆ@@6/ïcGÇÄP‰Âà”¨!×Rˆ^!ª'“ÌâTH3=™â,ÑšÅæ×R˜;÷â…g¹X²Kž%Hs$h%Æ¢uõg·+> stream xÚMÏ¿ŠÂ@Çñ‘-¦Ù70óÞ&a…ÀÀ‚VWˆÕ¥…rWšGË£lgé–[„è¬QsŧùMó¾yK)¦!õêúJp©á1¦Á°¹|îpœ£þ Ô žóŒ:_Ð÷ág‹z¼œP‚zJë„â æS‚ º¶àÄŽÿÔ¬jußkÉÀzçäEª’¥òÌ «¬°Q)Ü]ÑÈx’îÄŽ/ÊÕ¬eQPú»¬xÏÑžc=þrÔ_ÇÁ»°0’%t£ÿÀà,ÇÞ!_‰ endstream endobj 5165 0 obj << /Length 186 /Filter /FlateDecode >> stream xÚ]ο ‚PðOîœÅGð¼@]ÿ éb`955DS5¡öfö&>‚ã$»)5üÎð}œÃñü‘Ë6+X8!Cо¡ %j¡•P¦f•¢¶J`Rôò¢Ûþjµ×Ÿæ—­ùZzê FB”!Ì‚ž¥_©ºC4KhEoçM> endstream endobj 5166 0 obj << /Length 237 /Filter /FlateDecode >> stream xÚUαN„@àÙPLÃ#0/  ¼æHÎ3‘ÂD+ c¥–íH ± Ó7ðY0¾ˆ@IAXÿÝcCl¾bvæß?;9Î2Id#G©d¹¬Oå!åg^å&²Þ^îŸxW²¾‘UÎúcÖ奼¾¼=²Þ]IÊz/·©$w\î…ˆÔÌGï ~=ÑBç‰Oá \N nk¢m`ˆª`Â\MèðÕd³G :5"ìÀ€šÕ»>ƒfÆâ®g¢ä|w3±ãÇòÞŒT8Ú¦¢º¥ŠLH[e"4ûü 8 ¿Ð6IõÔŸ—|ͬÁkÞ endstream endobj 5167 0 obj << /Length 193 /Filter /FlateDecode >> stream xÚmÎ=‚@à!$¯á¼ èòS $Љ&ZY+µ´Ðh²…‘åfx“=%-l,¾f&™LCö9áQÀQÂÑ„)LLès›ý‰¦‰ ‡ ‰…‰IK¾^nGÓÕŒ9oöwTä ”€Ý×pŸ< ÑAZ-¤Ý@:ÒÔh½M¦,ÃÑ™òTYõ(ûÖPà zãõG÷ãߨ IaévíÁU.R8Uk®èÏÍ ZÓ¢ B endstream endobj 5168 0 obj << /Length 216 /Filter /FlateDecode >> stream xڕб Â@ Ð!‹? 4? ×Zµ¤­`A'qRGE¡C©~Z?ÅO¨[©&‡á\îA.ärI»ÛêôÐÄf›–ƒ¶ƒÝ>n,؃íÒµ‰N¯Ì­w0 A.ÐvAN(2œâñpÚ‚ÎFh pi¡¹‚0@!D-%ŒŒð\"ùƒ¸ŨÞr"Ë®R\uêŠTÇP\(z>Sa¼¡Ø§#|¡sf’ÌC§¢ÈuªŠLç¯1>|Sþ¶Á$^IÁk,b&â…rŸˆñÕs\ ãæð;ø]ª endstream endobj 5169 0 obj << /Length 236 /Filter /FlateDecode >> stream xÚEοJ1ðY¶L“2/ Ù¸{ºÀy‚[Z]!Vz¥…¢ ({ûh_$°¹"¬Î,»ÚüŠI曯^ŸSE º5Žê=:|ÆzÉÓŠÍôôð„›íŽê%Ú+ž£m¯éõåmvssAí–îU÷Øn @ð‰ÉëE2 ÊȨ èž1½JàAE8èƒA‡b„räÈßg|¯FÆí‰Ã„äÌ d¾]¥ 2÷ÑG€d˜÷Æ3úKê–‚ú'Îè‘'BÇ¥„žx`:!s\ÁIŸ²`~zNx /[¼Å_¨TdW endstream endobj 5170 0 obj << /Length 229 /Filter /FlateDecode >> stream xÚUϱJÄ@Ð7¤^“ò~@gãfa„ÅuSne!Vj)¬¢`•̧åS"þ@Ê-ÂÆûFaæ0Üa.wª³Óª’™,䤜NžJ~å¹Cˆøü÷æñ…W5Û;™;¶×ˆÙÖ7òþöñÌvu{)%۵ܗ2{àz-” DfJ £HŸGº„"|„Z¥ÑÖ¦ÁçÑԠÛ)ä€ò`ötfTvhÌ"Ã?|@‘×QZ×計VШó@0ã1ØE–Îã×¶-eý¶ƒÒƒ¯nOæ;`ëDŽhI|Uó†´éd" endstream endobj 5171 0 obj << /Length 187 /Filter /FlateDecode >> stream xÚ…Í1 Â@ÐR,Lá^@ܹ€nŒ¦¢‚)­,ÄJ-m5âÅâMö)Sq79€3¯øÌ?ŠÃ<æ~ÈQÂq̇.ì6µŸý‰ÒŒô†£€ôžIgK¾]ïGÒéjÊ!éoCv”Í^a JH˸ìçø;%ü¢‡ŽB·‘Xœ[O”ë ÔŽgUð[¥kM•4FF~ŒúêÕxçÊÏ•€ÓìBTð hžÑš~; 9õ endstream endobj 5172 0 obj << /Length 215 /Filter /FlateDecode >> stream xÚ•Î;jÃ@à_¨0La]ÀDsyõˆ¬Á?À* I•"¤Š]¦ˆI Eu4ÅGXw[á‘× Æ¾f†™Ò|ø8☣Œ£¤à,æ<çuBß”¥Ò޹HÝìó‹¦%©7ÎRRK*Wü³ýÝš¾Ì8!5ç÷„ã*ç  /&bw¥ÜUa-« pÐð ¿6èu<ƒ@ôŃøÏâÉ×gè9{+p+tjkâܼ]]´GËsŒåw´¼¡QI\§•˜6¨Ñ†€ÿrYÛtZ”ôJ'L{JÓ endstream endobj 5173 0 obj << /Length 248 /Filter /FlateDecode >> stream xÚUαJÄ@àY¶X˜âòr™ÐM.ÞA\8O0… •…X©¥ ¢íeå _ë|“XÙFlR,‰3…m¾â˜ÿ/ʽe4§Ýœög4/é6ÇG,r|ð{¹¹Çe…ö’ŠÚSŽÑVgôüôr‡vy~L9Ú]å”]cµ"Ð-€"ÀŒ4ÉÈ6"ñn"ja ‰g\ô ôê½… ßÃ}abZvL£ºRÈ´WÝ€î¸Wq‘þæÏz=Aè…æ³ã=AF­…Zp2Ǥ>}Ýþ±áÄm¼§ÿ1¾fxÔ‘0Sè!9„¦ƒTxRáþé^ñ endstream endobj 5174 0 obj << /Length 172 /Filter /FlateDecode >> stream xÚ}Ì1 Â@…á‹ÀæbæºÙ…è ‚#˜BÐÊB¬ÔRPQH!š£å(9‚eŠÝÙµ¾êð”(E!¨/I )ÒtxA©M )»eÂ8E±!©Q,LF‘.év½QÄ«I m%…;L¿ð>?9›:À^ÖÓj¬šµœŠµ7óœ’ùNÁ‚ÿ÷Ö=¨»Öj •‘Av†G ¹Êç)®ñ ®E‡ endstream endobj 5175 0 obj << /Length 266 /Filter /FlateDecode >> stream xÚUÏAJÄ0à?dQÈÂ^`0¹€v:B[¡LaÁ.]¹WêR¨¢ÐU'GËQ2x€‹É¢t|MUÆÕG^Âÿ¿dùéyªæ*W'©Êçê,WO©xÙ‚†t,¦›Ç±ªEr§²…H®h,’úZ½¿}<‹dus¡R‘¬Õ==ˆz­˜Å€È!ò|¯e£2ŽL»Äñ²ä[+1“-ÿ2R•c;“–íë¶2l ›IÓTšõAp©ÝfÒvàî@tc[¥§Ö èÙÿư`æ)ôÏaTzÄCY?›ô£´‰/C ÷EåîPÚÌ5¡„Û&„së~´¡„o eŸôs*ÁP%Äe-nÅ7ã7x` endstream endobj 5176 0 obj << /Length 225 /Filter /FlateDecode >> stream xÚUϱjÂPà?ÜáÂâ ˆ9/Pc0$Bj¡;u(ÚŽ…V2H¼à‹åQî#dtí¹É`]¾á¿çÿáÆÉ8ÉxÂ)?DÏxšògD¿GNxšõ/ß4/)|å8¢ðYb Ëo7»/ çëKºä7é¼S¹dÏâ蓺øù@7=æÊbTªEV´žÓŠUш?âI4›öà´õMÔÐâÚç;žØ@ê½A¯êmQSuj#Síêõ}7µ÷ÝÈ~Ô9ìÌÜ`^¹©ÀBË× è©¤ú’tUž endstream endobj 5177 0 obj << /Length 190 /Filter /FlateDecode >> stream xÚ=ο ‚PðO„³ÜGð¼@]ÿAµ(˜AAM ÑT Em¢B/foâ#ÜÑA´«BÃßóÀ›;¼â™ËÇþ‚¯.=È÷tè°¿œ6—;Å)É#ûÉ­ŽI¦;~=ß7’ñ~Í.É„O.;gJ Àì+ˆ¯‚92´È =™ ¡¥Y5"¡ÙÕ$*GE1À_ßkÐMŒAÛŽÌfb)­n!ê ¢Êa—!"„ºt¨5¾}€6)è•GÏ endstream endobj 5178 0 obj << /Length 238 /Filter /FlateDecode >> stream xÚ]Ï¿NÃ0ð/Êé!÷Òš?"R)èÄ€˜ZF¤‚@ê€j?šyó=D ç¤$¶ôî|§Ïjr¢ŸÊ=.ÏYMxzÁ«’ÞH•]õlºo-_iVSñȪ¤âNêTÔ÷üñþùBÅìᆥ:ç'z¦zÎÈLfÜU¸ò›/à2¸k`£­¸Ö&[ˆ~‡ÜÀõ6bòÓùÝ‘Tƒ~4óЃ{ÚÎh{“FRýD“öJÎÊÈ*+o£Ft:‡^˶ñCØÆf\8ØŒ&‡†Ñôи%F–Ó¶öŸt[Ó‚~JlÓ endstream endobj 5179 0 obj << /Length 209 /Filter /FlateDecode >> stream xÚEÎ?NÃ0ðgy°ô-9‚¿ €“˜¿K+•"‘ &ÄÔ22€`«šl‹%GðèÁ²± U†ßòÞðž½:m¹æk>i.ø¬e{ÉÛ†ÞÉ–´æsû_mÞhÕ‘ybÛ’¹Ë9™îž??¾^ɬn¸!³æç†ëêÖ x ô·ÆBþ`'#¼ˆ"“QMU1"èQ~9üéé{Hw” \„šfÕP3] ˃ú,a!ÒaZW}¾²‡p{EÌÂL~& ‡< ‘ÒxD·=Ò/´8bª endstream endobj 5180 0 obj << /Length 182 /Filter /FlateDecode >> stream xÚUÍ1 Â0à_:ÿ`/PìMC”v(j3:9ˆ“: U:ˆÍÑz”¡£ƒˆIÄ!Ë7¼ï‰é8âQL#NN"¦#Ç ¡ÃˆDòkgÌ%²- l©cdrE·ëý„,_ω#+h§‡ö( ò¯¿ ß0¬R‚GéC:k3•d¦V™ª4PÖ`  {@û1¼ÿ€¡gy9x–Ρoi|KãZ”Cf1.$nð ñÿ> stream xÚ=ͱjÂ`à2î’7hî èŸäÇ6]ˆ fìÔ¡tÒŽ…*:H|±é(V;Qû¬›X¶’¤\FjÓÛeý%E)æM“TÌ‚k1åRvûO1Åjª±˜™¾Ç}H9S Ü Á¹B†4øÅ7Z4^ë7^󝿬üð;r<×ÿŽÌȇ0È)¤ Êèz§»!ËB–e,; eá£__ß=Fʼ”W¹|/Hd endstream endobj 5182 0 obj << /Length 178 /Filter /FlateDecode >> stream xÚ]Ì1 Â@Ð )Óì„Ìt“MBÄ…Á-­,ÄJ-+³GËQr„”Bt ñóªÿá«|(¢œú1%Š2EûϨR.#Ê’ï²;baP®I¥(ç\£4 º^n”ÅrJ1Ê’61E[4%o!¨Aü™u4§x@ÕuŒ/øòØÓñYë¬qDówßûk;Ôp×pÒÐjh´WOü: ¬ðm 83¸Â7Ä¡B endstream endobj 5183 0 obj << /Length 216 /Filter /FlateDecode >> stream xÚ5É1JÄ@†áo˜"ð;ÉMB¢™……uS,he!Vj)¬¢°•›x¥9ÊaÊ)Bp’ÍS¼oÓ\^]sÉ-_TÜ´\·üZÑÕëK®õù¼¼Ó¶£â‘ë5w1SÑíùëóûŠíý WTìø©âò™º##„M~!ÝJõ‰Ë&Ò ­zåt9FìaÆô¹õ¹u‘Þ"øYa€áÌ b&ÄõÏ9ã1¬ÄM¤‘J·°‘^-}´ð‰?Ÿ°9:o,”U ÛŽè;¢VF endstream endobj 5184 0 obj << /Length 205 /Filter /FlateDecode >> stream xÚUÍ1jÃ@Ð/¶L!]ÀXsxµ^ƒ¶¬"W.B*'¥Á v+éh:ÊaKÆxl%4þ†oÝlÎ9üdxaØüa苬•2gëÆËþ@ËšôŽ­%½‘štý§ïó'éåë3Ò+~3œ¿S½b$PTˆ§h»$&wÊ;.CÕ¹ Yw¬þÐ ¡A ß †¿ ¸HD†‘)Ô€ TøC‰8À!ö#Çÿø_¢^P=”W¼ÉDC)´ƒö­kÚÒ V²Aš endstream endobj 5185 0 obj << /Length 238 /Filter /FlateDecode >> stream xÚUϱJÄ@à?l±0Åí ·óš,GHŠ`à<Á‚Vb¥–Â) r—GÛGÙGØ2ENÜS8¦ø`vfv¦,Ï]ÅW|測y]ñ³£7* žc]§—§WÚt”ßsYP~-iÊ»þxÿ|¡|s{ÉŽò-?8.©Û2" 5Bõ¶×+hßú……–‰&Q[Xo}ÝÂöÆïfô?´BÜÏôAqaú#ÐGØÏ L0P3 ¨(E§È>QZ–ÐAj4‰ú„¯ÄNq1 ‚2!šQydqõ-«`l.ŒÜÝvL¿@WÝÑaÔ endstream endobj 5186 0 obj << /Length 216 /Filter /FlateDecode >> stream xÚEͱJÄ@…áR Ü"y¹/ Iv"f!XW0… Õb¥–B…KœG›G™G¸eŠŒ,Ææ+þSS_l8ç’Ï .K6—üRÐ;™ís6Õiy~£]KÙÍ–²Û%SÖÞñçÇ×+e»ûk.(ÛócÁùµ{†òÊAzD¬jÈUW>õsèô‚ÕnVÐnŠ¡í-t‹ ¬ß+Ãʼ2ýü3¢;Ž_| üJà%Ár,¡cQvŽ$FŸŒ)úêX£‘F \ì@7-=ÐsºJÅ endstream endobj 5187 0 obj << /Length 243 /Filter /FlateDecode >> stream xÚUпJÄ@ð/l˜Â¼€¸óšÄäHŠƒƒóSge!Vj)DÑN.>Z:_ca;S„à·Q9m~ ³ó)³“âT3­ô8¯´,´¨ô>—')Œfº(¾îeÝHz­ÅBÒ Æ%m.õåùõAÒõöLsI7z“kv+ÍFá˜QÁ¸‹Ø–Ú"qõ Ißîé`{¿ƒ}w3ÁˆÕ ¢™á›fÀÆÿaBì™»=ÑÌð3ã ÓKˆ·žM;tŸÄ~®è±='sŸ.ìC˜Ë±ä |G ew´†UuÌ‚%s‘LáárÞÈ•|–ob3 endstream endobj 5188 0 obj << /Length 211 /Filter /FlateDecode >> stream xÚ…Ž1jÃ@E¿P±0Eöš $+1˜Ø`bp°Š@R¹0®œ”ÛØ Î:šŽ¢#l¹…Èf Å<†?ïÈ<ͧ\ñ”k–9Ë3Õt" +–Ùýrø¡UCnË"ä6“kÞùr¾~“[}¼rMnÍ»š«=5kFÞç¬7Ê`€åhÛøÄß –#2o²YA¡;´§Ð `’°Hh¼ÎZ‘´"i‹¤Í ´É °!ó(£ðRF½ÛØ£µ±ÃÑDmå#þ½5ôI@%?‡ endstream endobj 5189 0 obj << /Length 230 /Filter /FlateDecode >> stream xÚ]бJAà?l±0Í>ÂÎ èÞ%w'6 Ä^!he!Vji¡hw˜_leáÊ+Bô¿\&Ìò±ÌÂìÌÓó¢ÐL/õlªE¥e©/¹¼Ë¬b2Óòb|y~“e-áAg•„¦%Ô·úùñõ*ayw¥¹„•>æš=I½RÀôü–4žt®…I6ÂFáZ“à˜€˜Ãt#ÍÀæÀ¤?ÀjvOG,I#¬“Ü1>ÂÇ-í k`#¾ØŽ°õ ™ìèyßñ¯½Dø}ÑçÛÃqç ž†÷à~`[ u¹®å^þš#g endstream endobj 5190 0 obj << /Length 176 /Filter /FlateDecode >> stream xÚmÎ1 Â@Ð iô™¸ILÀTÁ-­,ÄJ-mMŽ–x…ÁÒB\'î6æÿæO“„BÊØ(£4¥]„'Œ»v±;¶,4ªÅª·¨ôœ.çëU±˜P„ª¤uDáuI0vŽìà±ó[€>Ë™iÁ7 äw40`ÔV.Àªœ›óv^–'žVOȬh/|5V þÌW5cjSKü.[HG endstream endobj 5191 0 obj << /Length 277 /Filter /FlateDecode >> stream xÚ-±JÄ@„gI±°…y¹ü/ Iî/Åaà<Á‚V"¨¥E!Åá­øbkåkì#l™â¸ÜÿG‹ýŠfvþbzZ”ÑœN¦TœQYÒSn^ͬb1£rþç<¾˜ecÒ;šU&½bÙ¤Í5½¿}<›tysA¹IWtŸSö`šQì›ØA;(yD– Cõ˜Ž‹5£jÕ]ÆhAàG´ÑNùuÔ+7 œîÕÓA}Ù8¨o{õ‹Ä©=j‡5ÿ‹-?È nÿ_¥½L³s'æ¨;†ŒÅ¹è‡›ãt†¡-"s—=âŒHfÁ…¨{.Üî]=ð1#衇WC€Çà `.skR@eÝ endstream endobj 5192 0 obj << /Length 247 /Filter /FlateDecode >> stream xÚmÏÁJÃ@à?ì!0—¼A;/ IÛ„æPjsôäA„‚zª(ô 5¶²¾Á‚—Bë?Ôƒ‡ùv‡™ËéqYj¡µMµœkUéýDždVó²Ðj>¼Ü=ʲ‘üZgµäç¼–¼¹Ð—ç×É——§:‘|¥7-n¥Y)àzãyK=]€óIDÚ’ è02F ôØz² Æ:é×I‡ðKp>¼‹ølÉ;ÒÀ'Œ[rÂÂŽÅ^¸C4¼a p7é¬ï›þ‡ý¿ììy0Ï_ø·Þv„4’,ž0ÊÆ¢l-ÊÂöŒØÔ¢$¶Kι’/ÕRcë endstream endobj 5193 0 obj << /Length 236 /Filter /FlateDecode >> stream xÚmÏÍŠÂ0ð„ sñ„Î ¬mm­—e?`{XГõèAQ؃­à‹ôr,XÌ΄Z4ÐMÂ?3·[qŒFø&Øéà:„D Ø ÿ¯V[¤àÏ0JÀÿ¦sðÓ<ìð“!Ò~„óƒ¤#´ úUÃ55†ÜâΖžAX²:•E––§Š¦DniÜßô8õuçÄ”M†öReeòŒ£7ŽVœª8@|Jâ—«)B„“;¥poT×Ó%zúªÄIjÕçÿb)\M͸úuÜw3¿ü険…q SødšY endstream endobj 5194 0 obj << /Length 242 /Filter /FlateDecode >> stream xÚeÏÁjÂ@àÉ!0—¼@ÑyvMˆ…¢`ÌA°'ÒSÛc¡-<ˆúby”ÜzMo9„lgÌÁJö[˜]fç7qÌ!ßòõ€ã”“„Ÿ#z§a*Å“´»yz¥iFvÍÔìBÊd³%~l_ÈNW÷‘ñ&âð‘²ÃFðsÔð+¿‚ï\©äœƒÐ*µR½+ºÿp§Œ.Ù)ogŽÂ6øþ*ÖTÿjÈ)”h` ìarAÖá’ö?æDƒžrìð8xuG+iN‘ iJ!Pú…’£ÂÂAm€½‘|cy‹¾ÎHníÐ<£úÔÐZˆ endstream endobj 5195 0 obj << /Length 250 /Filter /FlateDecode >> stream xÚMÐ1NÃ@Ðo¹°4à¹ØNì¤ÃR. ¢ˆ¨€2Etˆ,7sÇ-%.°¥ +æÏ*‚ûŠÙÝ?³[ÍΫJ - =›iµÔºÖ§Rv2_°Zh½> stream xÚ]ϽjÃ0ð·èB|/ÐÊvlJ 4¨‡@;uÚŽZZÈ¿A_ÉoA =+'7rIAüþÜ Ý¡,½Ì2Š)Ié"¥œONO ¾âhÌݘò«ÓÕã Î 4÷4£¹á>šbEïoÏhf·sJÐ,hPü€Å‚Ànaß- ÄO ±w°‘îD-V5JZU˯JW•ºWFšß1×À9Î p2[¨Ó4Œàâiª 莒‰> stream xÚM±JÄ@†ÿ°E`š¼™Ð$w‰±ºÀy‚)¯²+µ´P,Âm-²r‹3ñ_õäXøXfvþùØrqV–šë…ž.´<תҧB^eY³˜kUÿv_dÝJv§ËZ²k–%koôýíãY²õí¥’mô¾ÐüAÚÆHf¢™{`Š¢Ñ8ˆ"éá‘â€Õ"Ÿ`~à`ÁÛ'ìÀië8ØŒœiü'~aãÄa£ 73»PcãÄR¨K÷\ìO´0’!š‘ö˜ƒ… –ËРûgVÔ:Â.  ðP4IJìS¯áaòüŸ ‡ÈU+[ù§Œf9 endstream endobj 5198 0 obj << /Length 249 /Filter /FlateDecode >> stream xÚEÐ=NÃ0ðgyˆô!ï¤MD¤R$2 щ1QF$@ u@oFŽâ#xÌ¥üí1ø7ØïÓåâ¼,%— 9[H¹’ª’]ÁLq™KUÏ/ϯ¼n9{eÍÙ-®9kïäóãë…³õýµœmä±ü‰ÛéˆÌš£%šLOjHi¯%N{2½ò”ZÐèðN‡Àô‡gôŒŽ '> stream xÚÍ“?N…@ÆgC±É6½€QãÚ¸Éó™Ha¢•…±RK vF8Þä%^€’‚0Îì ‘¼Z ø-;;3|óqvrX”ºÐ§ú ÔÆhs¤ŸJõªL¡ù6Ç~çñEm*•ßiS¨üŠ^«¼ºÖïoÏ*ßÜ\èRå[}O‰TµÕ@W‚€dªR‰ˆ;Ȉ,Q–ˆG¨9ÛCi ì7rXKËä0—Aà@$ˆs;’²º:ñ>GOÔ11PV¨GG’ª à{ ré(µëÜ‘  J}1*7S(»$;SheIÙLõ>âoúCø¨^¥f­i0Ó¤ÚÙIñ™Î§ÉÌô¬ð§ Cœ4ôqú¢ŽHºèG®¹‹nJÛè°¬‰®³œcÔC +{ç7ZÛÎÛ¶>»ƒ Úà¿¢‹*E!¼Õe¥nÕ/ÙÏíã endstream endobj 5203 0 obj << /Length 244 /Filter /FlateDecode >> stream xÚ…¿J1‡gÙ"0M!óº·`D«Ày‚[ZYˆ•ZZ(Úºy´}”<•aÇ™¹ãôP1|ðå—?üâéáIO :¢ƒžâ1ÅH=>cT¹Pc;÷O¸°»¡Øcw!»á’^_Þ±[^‘ØÝÊ™;Và8ƒŒ‘?dm˜gPÇj·\R…q :“dÄ„*Á |…Vbn¶;ƒg³Eó çd˜ö1Öo( Ø÷aãhDBÿcü³!ýD[Áo˜¬1¿En¥ ¹±¦ä%iêÝînª6N:ó\ÒZÛ` æ]H›_ÙI<ð?yë­œ endstream endobj 5204 0 obj << /Length 184 /Filter /FlateDecode >> stream xÚíѱ‚@ à& &]xúÞÜHLtr0Nêè ÑUy´{ጃ „zwÀ¡Í×6ÿÔd4”’™JBG´ñ„qlfiG{Ø1+P¬)ŽQÌÍE± Ëùz@‘-§¢Èi’Üb‘¤‚˜µ©ÒÁc®|æÚ!P÷Æái à±®!`{èø.ÿT¼ÊV6ß¡ýAÓõ_°yÍÀ4Õ8+p…o âøš endstream endobj 5205 0 obj << /Length 231 /Filter /FlateDecode >> stream xÚµ‘±‚0†kHná¼Ђ±0’ &2˜èä`œÔÑA£3<šÂ#02Î^KL%!_sý{½þ¬æI‚!.qa¼@¥ðÁCT±Ý9ß +@P% 7º ²Øâóñº‚Ìv+Œ@æxŒ0> stream xÚ]Ð1NÃ@Ð¥°4¾;ÛŠBƒ¥$\ ‘ŠQ%Ú¬æ£ì\¦°v˜Y)¢yÒî·çÝT—ëk.¹æ‹Šë57 ¿UôIõJ/Kn®æäõƒ6O\¯¨¸×k*ºþþúy§bóxË[~®¸|¡nËXÊp8™ÎÙë…HDÑFä#ò°Ô々Ú~Àþ¨¨7ö'ÉQÈ”´^;LKZ+45qj@.dêtÜÇv“ù!¤¸Ç"iíÐÄÌôehÖ”ôÁjÛ]ˆÿdVçµ³½ÍSuž‡è ±ýõ?h©›ÓêgåcfKxýºëhG¿Á•¡Z endstream endobj 5207 0 obj << /Length 186 /Filter /FlateDecode >> stream xÚ35Ô34S0P0RÐ5T01Q07SH1ä*ä21 (˜›Cd’s¹œ<¹ôÃL ¹ô=€Â\úž¾ %E¥©\úNÎ @Q…h žX.O†ÀOþÁN2bÌH$;É&åÁ¤=˜¬“ÿA$3˜äÿÿÿÿ?†ÿ8H¨úANò7PJÊÃç‚”ÿÇ`$ÿƒHþÿ ÀØ`ÿð(Èþßÿ ýß E` q¹zrr:é“p endstream endobj 5211 0 obj << /Length 103 /Filter /FlateDecode >> stream xÚ33Ñ3µP0P0QÐ5´T05R¦ )†\…\¦ ` ˆTr.—“'—~¸‚©—¾‡‚ —¾§¯BIQi*—¾S€³‚!—¾‹B´¡‚A,—§‹Býh“ÿ@)¨ —«'W )+« endstream endobj 5212 0 obj << /Length 96 /Filter /FlateDecode >> stream xÚ32Ö30W0P°bC K…C®B.K Ïȉ&çr9yré‡+Xré{€O_…’¢ÒT.}§gC.}…hCƒX.O9†z†ÿ PÈðÁ†ËÕ“+ ]› endstream endobj 5213 0 obj << /Length 94 /Filter /FlateDecode >> stream xÚMÉ=@PEáþ®â®À¼™x¨ý$^!¡Rˆ ¥‚°{ äTß±4J2:ÆÔ„–Ò”³bƒÙ‹ŽþÓŠ<@zšAjzHhxìçÉÛ‚ )9(݈Pò¾¯¨:<Ól ” endstream endobj 5214 0 obj << /Length 221 /Filter /FlateDecode >> stream xÚmбnÂ0à?bˆtK!÷8Á ¨Ô •èÄ€:µ¨ÚµðXŒî›¤o1ƒ…{‡ÕaKþ¤³ÿÁ¿«Ù¸œrÁÙ՜뿕t ª–¹ÐQ/^÷´lÉl¹ªÉ<Ê)™ö‰??¾ÞÉ,7+.ɬyWrñB횤NÀÑŸÄ9èÒÈm&6P¿¯:5 ’Â(Øß˜uHƒ27·P-òS0õ²nÔ@sÒ@ƒ¸Gh@Õ7ƽ@—ëèâJ' ¨N›E•®IpЖ÷êgôðþ×{ûï´ ‡–žécõƒÉ endstream endobj 5215 0 obj << /Length 233 /Filter /FlateDecode >> stream xÚUÐÁjÂ@à ƒ4׊ÁSµ`B{êAA{,ØÒž“GË£ôrô ngvÜ]vù˜]Øaþb:™Î•QOt ·O9~ᬠڕüpüÄe‰ú]Í ÔºE]nÕÏ÷ïêåëJå¨×j—+³Çr­€Ö€Ç(àYXU€õ‰zj&®|’€aOÃd pèùcš1uÔŽ¸Æ-1H[7c(< ¤bÆgá Xk;®>É÷èN`$ŸŽ³„Ö:¢‹ -åomc)¾ŠZ¶ç†/%¾á?OFi° endstream endobj 5216 0 obj << /Length 245 /Filter /FlateDecode >> stream xÚ}бNÃ@ `W"yé#ÄOÀ% í©‰ Htb@LÀÈ@ÕÎÍ£åQînìåøí‹ e@Ê铳å³_^-¯¥’¿+ï5±÷ˆ+ õÇÛ'¯[vÏâ=»dÙµ²ß>Ø­Ÿî¤f·‘—ZªWn7BÇ”R$c̤Ž(õÔ„•Ñ(NHN͇ÌxÎì‡ÙÄø—ù%ƒ•ƒõCke2Mo胵ŭB/ç©•ð›Äpè·8Yi¹RN„L4pʉ`Eÿ¡ËÀMôÓ¢s‚Ñd޽~Fgû:5ЗêTúŒŽšHºi¬Ù só}Ë[þL[œæ endstream endobj 5217 0 obj << /Length 266 /Filter /FlateDecode >> stream xÚÐÁJÃ@àYh`Í ”f^@“[ …ZÁ zò ‚ …* =É£åQò9î!tÝ™¤‡âAO;»³Ìü¶8-Î)£‚NÎhaÉô’›wcm(f´È‡›ç7³*MzOÖšô&”MZnèóãëÕ¤«Û+ ç5=ä”=šrM¢“@åë) ¼oç\SÝ%´Ø}‡«³ØqÝKK䄸´ã‡PËFïF왎»m4â„øˆ¤cž´ÂRÀ1Uó'~¤þú@õ›h`"[bzÄ ÉOv˜ÙJ:Y³åœ ¨°»®‡8!áÎy¥»@ì4÷h? î%<$ü¹.ÍùD‰pj endstream endobj 5218 0 obj << /Length 241 /Filter /FlateDecode >> stream xÚѽnƒ0àC"ÝÂ#pOƒ(TLH ‘ÂP©:D™ÚŒZ53<Â#02 ßÙ$i¤(Aœ>l#ÝÓxñSHiLÉ+}GøƒIfÖ!/ùàë€ËÕ'%ªÙEU¾Ñßïqjù¾¢UAۈ–A¥µîÄÑ©kó¡~ÍF AkóæpÖ³Þ`…Ñ9EåÌkð&Çkkpk ³Éá9ç“\SþX¿·ù}iúžõÙÀõ,3ÐðO®ùZ®)g{I!9ÅÎê·VÓ®ÈQ5’Fb´)e¬<îþR‚gJàëàÛ‘)›gpò-áºÄ<[?—Ò endstream endobj 5219 0 obj << /Length 230 /Filter /FlateDecode >> stream xÚmпJÄ@ð „´bæ ÜD؈ œ'˜B8+ µT´5y´> stream xڅн Â@ àÁB]ó^«=ì þ€ÄI¡}´>ŠàØ¡´&ZÚŠã#¹§N—,êñÑ.é>íl<¢v8·$•‹íGªiÕŒ«¨¼9O—=ªÑbL6ª ­m²6èMü”#Îi ÆÀx7.2>´Ê12¦VFS¨0•ªBÌ@‘ú3–ù`F²[ˆ…×cs4"#p}ãþ¢ýK¸—_†á_üŒà'Fújá¾À©‡K|ÒÐqj endstream endobj 5221 0 obj << /Length 270 /Filter /FlateDecode >> stream xÚ…Ð?JÄPð/¤ b.°ìÎ4‰°‚XW0Å‚Vb¥–ŠÂ²ÉÑr”=BÊ!Ï™I\ˆ ¾æG&óþÌ—¥§IÆ1/ù䌳”Ós~NèR-Æœ%ß§WZÝsšQt#eŠŠ ¼¾P´º½bù^óCÂñ#kôð…ÜUà9·µæµs`Ñàâ(+Ìw€z;#h¿GØÈž‹½œÐ!¯ éW¤øñze«»e0Òá¹TV<%× ä‘Êú_ÜHõ'Ëèo@Ûííeõ7®²)Àˆ%pÀb9 czCr™&!j.Ç; w¶³‘¶uØùÍLÚœ«ô$ – ]tGßPÄ< endstream endobj 5222 0 obj << /Length 217 /Filter /FlateDecode >> stream xڅѱ Â@ à YúÍx­ÒªSA+ØAÐÉAœÔÑAѹúf}ÁÑAŒI…C¹á~¾ä²Ü%ïvºJ¨''RÖ§mŠÌ3©-õb³ÇQ…vIy†v*]´ÕŒNÇóíh>¦mI«”’5V%AÍÜ0óåpFµ„6¦;˜—Â8HO?BEà >üˆ¡ƒDtWÈ£ød&VDñÍB;Hµ¢ph>?ìÃg_;ù# tXžymWú Ã,?‹“ øgÔ¬! endstream endobj 5223 0 obj << /Length 161 /Filter /FlateDecode >> stream xÚ3²Ô³´T0P0bc Ss…C®B.cS ßÄI$çr9yré‡+›ré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ìÿÿ!êAC=3Ø€õ`¢ñL0`'ÁÄ?3˜øƒƒ`?pü`âBL<ÀAØ£úA€=ÿÿÿñDp¹zrr¾aZ¡ endstream endobj 5224 0 obj << /Length 199 /Filter /FlateDecode >> stream xÚmÐ1 Â0à'„·ôBÞ4­¤ÖN…ZÁ ‚N"ê(¨èÜ­Gé::cÒ‚Ìò  üïÓÉ,¦€§$Šb:‡xG!tP”ô/§+fùŽ„@¾Ò1r¹¦çãuAžm"ÏiRp@™@ªTcYk5à¿ÿlÜ2ÛÚmj[¹-lK·Êœl?n½Ÿ¬ôZSÀXÔ¶C}´ªzͪ4çÝAG`ºæ R]d®3€˜/}Ï,åu3ömp)q‹_ûoaî endstream endobj 5225 0 obj << /Length 196 /Filter /FlateDecode >> stream xڅн Â0Àñ ‚…Côï LC[T?À ‚N⤎Š‚›>šÒGèØAŒEl ù‘Ëø'ªÙ¡"ÞIDI‹Ö wÛYh¯öaµÅ¾F9§¸ƒrÌS”zB‡ýqƒ²?B9¤…¢p‰zHp6&øÌÕžp¾|b¿-j8 endstream endobj 5226 0 obj << /Length 305 /Filter /FlateDecode >> stream xÚmÑ¿KÃ@ðxT³r¹X4íT¨Ì èä B :Š?Ð9'þ[·uô_ˆ®f’Áó½k›Úá¾|ÞÝÁ»Éá^¼/•ìÓôåA"¯c|ÀdHµâ’¦·8N1ºÉ£šÅ(=•OÏ7ÏŽdŒÑD^ÆR]a:‘[ Âþ’LK> "@ÎÚª(î ŠÖw­wVÞÒ¬¤˜nÐŒä5z+WñJ¥ð×ÕiÄ µì:yNÅR½ RN@WP!Ége¬Ë„¦­<½.#Òv­.©#ÍéFÝZ½ÊI»åÔ[Ê6È,,iÁ‡vR|Ÿ¶­¯•üŸZx¬ûZøsà!‰¥J¥“G*œh;‰¿ÜÚBamÅòi'> stream xÚeÑAK„@Àñ' Èk‡Àù©Úv¶ ò°P§KTÇ`‹:;}³‰û ó òèÁvzÏ]Å=èüFaü;“ON&S™ÈSºòs™ÉÇ_0Ïhžð”_<<ã¬ÄøVæÆWôãr!ß^ߟ0ž]_Èã¹\¦2¹Ãr.¡²„µjÀÊ5ƒn¡rh„߯á‡à3¾Û1¾ÖÒè}Z‡ÂCÑG¨tc‚P…ÙG¢zŒ°é1Ž Ú>#é ÖcxÖ,¬ ‹³ŠA•ºwÐÅÆ!2´EÕ *kíÐ8;´âAqÂ2¨À³jØGÅXmÁ Á'ñÎmA?N¼i¿ƒÞ/K¼Á¨‡xƒ endstream endobj 5228 0 obj << /Length 262 /Filter /FlateDecode >> stream xÚ…‘1NÅ0 †]e¨ä%Gˆ/m©xS¤ÇC¢L ˆ ßð¬´GëQz„ŒªÛdè"Jò)ËþÓ^žû+ªiGgÔzò;zmð„Þ³XSÛüܼqßaõHÞcuË2VÝ}¼¾aµ¿¿&>è©¡ú»€]@ƺ¼›ÙN¢ff¹üÒYÌ*˜à('‰’ ü‚Q‚ BФùŠ Id“!Ù‹¥T$·pÓa“¨èÿ‡6U.ÃοÀÅ~‹I2FE?h+(¸QÊ©š[/¹UöB–€éÃÄ oÄ\öLrƒD’Š5éßÑð¦ÃüÖ¼ˆ„ endstream endobj 5229 0 obj << /Length 207 /Filter /FlateDecode >> stream xڅϱ‚0à# $·ðÜX0)ÆÉD1‘ÁD'㤎áÑxÑP¯GIt0 Í—»¶×¿:è„bšòÒsÒ3º$xGrÛÒnœo¸ÌQH§¨6ÜE•oéùx]Q-w+JPetä1'Ì3‚ÂÓ€Ðõ˜ÀTPÔ\–6Bðæf ~ËxŽî3à9º:ð^vì@+ð{B#pˆ€‰*ɱpqä”íý‚>{È{ wƈõ( G5Já(ÿâ9Ò‡ýÂ6qã?¾}O endstream endobj 5230 0 obj << /Length 318 /Filter /FlateDecode >> stream xÚ…ÑÁJÄ0Ð)AÈÉh[0ëî©°®`‚{ò BA= *z5ý3û)ù„€—JãÌ´ Š¥í+“iÚ™Yž¸µ-ìÆ—+»rÖmìC©^”s-ì™›—îŸÔ¶VùuNå—Wy}eß^ßU¾½>·¥Êwö¶´Åªwôt¤Ôâ]ô:P¬=RÐâŸÙÀL ÓL”>n!#x`ï—´‘ÄI£&²QGÆ, L8s‰ïþ…‹’Ãßèþ7¢'ÌL`ª™n¢¥bÁ·}ÈcX±š*6áè+Öa}€”¡ØŸ6IôÀ~eÈ'¾:4‚:ä2ò`æ¤D@õÕe\ÏL<« ™¨§É£HéY ý4ñÈøÀàLÕE­öêoâ© endstream endobj 5231 0 obj << /Length 249 /Filter /FlateDecode >> stream xÚнNÃ0`G,Ý@¡÷à8UÚ2E*E"L ¨tìPsüh~”> stream xÚuнNÃ0ðä¡Ò-YÙz/IÀTt!R)`b@LÀˆ&PãGó£øÌV¤¨æÎa¨øÈðS|gûîlg{Í×lywŸíœç|×ÐY+Ášg͘¹} EGÕ[KÕ™„©êÎùåùõžªÅÅ ËzÉ× ×7Ô-0j`šÜ#ЧQ æ#ÀD¼LÚ€Òc0u(e ‹+9í1ü´ _¬E—ÿÿrùŠ4ê²A)'RòÐvd/Ú”F½¶™¢”NI/ÏJB7™,ú|z’5[%°m_‰«¾}תŒ¦£G9Ð;}ŒÞ£tøŒúBq)[m0”:˜Ï}ÐiG—ôy?x endstream endobj 5233 0 obj << /Length 198 /Filter /FlateDecode >> stream xÚ…ÐÍ ‚@àÂyõ 5OÐ*h&‚ä!¨S‡‚êØ¡¨³>šâ#tô°d»µDFäÀð1?00~8r(9ôÈhïâ }OÔŽ,å`wÄ8E¶"ßC6]déœ.çëY¼˜‹,¡µKÎÓ„ŒZÿ¢‚¬Ô¹Y@T7sɸ z‚l»õbô¤ãÔ x³ýÄR I´;Èø‡®à­ŠªSqk¥¯([‰Å²µ\ÑŧÅy£NS\âwpmõ endstream endobj 5234 0 obj << /Length 240 /Filter /FlateDecode >> stream xÚ}ÐÁJÃ@à ¸0HsõPè¼€nHLO…ZÁ=yBA= * ÞÌ£åQò9öP:Îvô 9}à 3Uœ5gœ|Zp5çòœsz¥²ÒnÆå<ŽžiÙ»ã²"w¥}rÍ5¿¿}<‘[Þ\pNnÅ÷9gkjV,"­ùVöFZે˜áÀ&²WŽG˜"‰ì”“jØÈVÉFxA”Í=f‘^éþÇtXD:¥ýƒ$‚ߨÀQ`¢uþõÓ@ ¤ºú3 çØF«d@âma5_³óÙjέ ñ"btÙÐ-}”^p endstream endobj 5235 0 obj << /Length 243 /Filter /FlateDecode >> stream xÚ]ÐÍJÃ@Àñ †@¯½9/ » ÄF„ZÁ„zò …Bõ(¨èMÌ>Ú>J¡Ç$ë~LµÙÃòcfØóê¬jHRYÒiE Iõ‚žJ|ÃÚmíxÁ§Ý .[T7(níE{GïŸÏ(–ëk*Q¬è±$¹ÁvEƌѱ©Q³y‰]CªÃœ*Ö>gY8U°³Î#å±`k½²ö¬&•³÷98ù7‹,¼ûàlïsÇJﯬËB>ø¬S}òŸƒ>éŸÙÔ±˜˜Œs¶aeÐø¬ý˜-«#ÕÔ¦~G~±—lÆÞ´x¿+%eÒ endstream endobj 5236 0 obj << /Length 318 /Filter /FlateDecode >> stream xÚmÑAK„@ð'‚ ëU(p¾@©™äÒAØ6ÈCP§Õ1¨¨³³ßl– Sb?‚ÑEXqz㨛ëžüñÈûó&ŽÃcêÓ  GtÒè„>ä•Ħ>¦íèá™ÌRâÝÐ8 ÞæÄK/éûÛÇñfWgÓ9½ÅŸîH:§BTºÁ†4‘Ò ÜÀ-AÇ]˜+ÅÉ@kS]Ñ”„žÆNZC E$«ž6ÒÑEfŠ{œ"92gÖ=ƒ4¦x? vl¸ìÈ% É„k‹0QÔq£µá¾¢t6Œ®,¤¬ ®${Qtpc6¢äÛ,2Ȳ.Þ¹lÉ!ÿ„ŽIËÉ׈¿Øã[qÝÓÄÓ$eO·e%7ŽXÊJÛÔqèòžvKÚl'A‘8Q”ÒÈyJ®Éj㬠endstream endobj 5237 0 obj << /Length 276 /Filter /FlateDecode >> stream xÚ]ѽJÄ@ð [†3iÏ*ûæã0^eà<Á‚VWÂZ §høf_$•¥¤LnœÝ™æ,–_f–ìþ™-‹³bi3[ð*K{~aŸr|ÅrÁuæJ·ñø‚«Ó-˜ÞpÓúÖ¾¿}o¨F`¦Î5@¦î5@/òÌ|ž™×øI¸ãÄÈOàRm\ŸÿáoC= þ‰þ‹×5Þãa“|Ú endstream endobj 5238 0 obj << /Length 212 /Filter /FlateDecode >> stream xÚmνŠÂPà„1­ÅBæ4¹a·ºà˜BÐÊB¬ÔRØ]VØ"xï£åQ|Ë!×1‚XØ|3p椪?pÂ)÷§)?y¯è‡†_²LXFsÙiœQ¼–ÅóÆlÁ¿§Åãå„ÅSÞ(N¶”Mpw"¯þ‘%Î@ ¯FÔ`_¨|ßÁ;Bgá9!¬4`Š&E£U ÁáEˆ ù¡­`ßàAíKª]Ã{ÒªÚAÞ5èä]m?ÎIT”ú*•%Ã!´4ËhE7U}Jì endstream endobj 5239 0 obj << /Length 227 /Filter /FlateDecode >> stream xÚuÐ=N1 à7JÉÍ!¾d¢Ù?FZ‰) ÚQ%$(`r´%G)V ž °ÍWØ–åçÉlßµÜð‚÷Of<]ðµ£;jçRlxzðÕ¹º¥eOvÍíœì‰”Éö§üpÿxCvyvÄŽìŠ/7—Ô¯ó1²ý¡Á/6;¨ yª &C†z‹‡PïÞ@oQ{½:CG ¢Ž2U¨…\Yô•MÁÿ‹Î:|…º$³ñB7¦0x¼âÅKœçP%¤ñ†ø${By‡œ:îéœ>ðLe endstream endobj 5240 0 obj << /Length 182 /Filter /FlateDecode >> stream xÚ}Í1 Â@Ð/)S˜ ™ è&YIc@#˜BÐÊB¬ÔRPÑNÌ-Gñ)SHÖQ ±±xÅütæTÎ+ZS‘3P8¶†W]‘¡‹+|4(; ¬SúwXOøZ‘dx)ñeEûÇã÷îÝ>’ ÄÁ7¸{¦S¹•kœz(ƒ ÏhRЂž]«<ø endstream endobj 5241 0 obj << /Length 227 /Filter /FlateDecode >> stream xÚuÐÍ ‚@ð Á\öœ([2)Š„> A:D§êØ¡¨[¤æ£ØØÍCh3.FP-òCgwÿîŽë5u›ZäQC“Û¥N—vèj.¶¨Ó33ÛŽtVäjtf\F'˜ÓùtÙ£3ZŒ‰«Zóž ~ĨÂoÁ~yûcþáó·µO3I­âΪøÁúÐg¯`g²@¥`¥P?‰|ªXÞmc$EßbX©¹›KöoíJ>G}›—í¹Urì°Ô/ÛcCM~Yܼz¬Â'XÉ€…" 3Éå-8 p‰/¥fl endstream endobj 5242 0 obj << /Length 195 /Filter /FlateDecode >> stream xÚuŽ1 Â@D'¤ü´BþtE…Á‚Vb¥–‚Šv¢ñf%GHi!ê˜B´pgù3c[N¤¡6µ©í¨më2’­XK1|+åÏb-q*fªÖŠR“Žt¿;¬ÄÄã¾FbÑh.i¢À€ûÌÿR]Ü#¯sãìèÁ+ÀË ÿŠ JdDïz|ãɃšÿÇý÷y*Ô˜Œ*CѦ#6 wrÖp38UœßÛ{Ë •‰¼ÆÀAê endstream endobj 5243 0 obj << /Length 184 /Filter /FlateDecode >> stream xÚuÎ= Â@à )¦É2'póƒ‘TÁ-­,ÄJ--m£×Š7Ù#¤L\w… lñ>˜÷šIÆ£tB%:iNãœö1ž0Íô™Ó »#–ùšÒ ù\·ÈÅ‚.çëy¹œRŒ¼¢MLÑEEpÓñTÀž |´E © ý¯ ¤†5àëæf‘Kó)%@h†ðî °€ó;Ô.^†ÞgéþñÍ T;gWø*S™ endstream endobj 5244 0 obj << /Length 257 /Filter /FlateDecode >> stream xÚu¿NÃ0Æ/Êé–<‚ï 1$Щ‘J‘È€S„„Œ : Æ/Æ£xcõèÕ|gÊF=üìûãû>»³‡ý‘´båÀΤ;•ã™ M_ íä·@¡§ýô™!3%Ÿ©×RJP™!ƒLjŸª ÒeTé"féSÊø‹_e鵟´!}Ñ ®©v–¡ŠYW}Çç#_ózGq endstream endobj 5245 0 obj << /Length 211 /Filter /FlateDecode >> stream xÚ}ϱ Â0à+Â-}ï L«­8YÐ vtr'utPtõ±#>€/àPßÀ±Ci¼4‡ùÈå.„ßë4Ý69Ôâíùäwiåâ=];ºÔ‡åûŠy-#¾Ei¿;¬Qô'rQ„4wÉY`X)ð:“ŸõÜZÙ÷?ëÆøŸ¶Q©UüξKþÁ~À ñ„{Í}C!`eá ¸èn!T˜Ëò2­V§ÏrS°’j9·eLtʲÜâÜJ½”’_oJ]pá?Rémì endstream endobj 5246 0 obj << /Length 150 /Filter /FlateDecode >> stream xÚ32Ö30W0P0aS3…C®B.#C ßÄI$çr9yré‡+ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. ŒØ?0ðÑ0‚°0070àü˜ÿCƒýùdD (¨ž¡ýc`øƒ‚è1ÿ`øÿÿq¹zrrxæ<÷ endstream endobj 5247 0 obj << /Length 189 /Filter /FlateDecode >> stream xÚÏ= ÂP ð”…,½€Ð\ ¾~ÐM¨ì èä Nê(¨è&¶GëQzÇ¥5Å>ñ9ø ÉHâc?"‡ìl7"/¢ ¤½‹gô=;ù2Û1ÉP¬É÷PÌ9@‘-èz¹P$Ë)¹(RÚ¸äl1K bÖh½n û†³ü]Z Ð}1˜þTR¥2¥ReI…j"*<~ð;Ð|ŒX®õjèz|Z§WÐ%ÜÍb‹·4ïKq–á _êãMt endstream endobj 5248 0 obj << /Length 226 /Filter /FlateDecode >> stream xÚ}бjÃ0Ð3·äâû‚ÊnâM¦P…vê:5IHVË[ËŸ¢­«Ç &ªî ­!œtèNgfå#åÄÛ,h^Ò¦ÀãœC¾øÚá²BýAÆ ~‰§¨«W:Ï[ÔË·'*P¯h]Pþ‰ÕŠ é!.7xùW‰é­Ý=Õ ¿çd°«B7ÒCÖ¦ k¸fÔ‹ «€FmS²°g~Ôr X%NXg¹@íÄÎqßÜ¢“vkùÒ5a{DƒW±-ðØK¬,¶#=¤=d„àCø³âs…ïø C„j­ endstream endobj 5249 0 obj << /Length 150 /Filter /FlateDecode >> stream xÚUÎ= Â@à‹Àk<‚s÷G‚vBŒà‚Vbe,-mGËQrËâ:Ó¨ ßÀ¼W=?Ù [öz9çS®Îðš­F}'fËÞÃ,¥… +¾^nG˜b=gSòαÝ#”Lô¢Zt*ë¨ÿõLd¢M D“ŠGb&(QÝSoð¯'ºÙcc#°Øàþ÷G> endstream endobj 5250 0 obj << /Length 231 /Filter /FlateDecode >> stream xÚÌ1NÃ0àe°ô/½AûŸ'T e!R[$2T¢SÄT‘ÁV¥A\ª£QÀ ¡p¾¹EÔ´1r§a?‰]c{þ&ʶQÕÇ7P ‘_‘Hõ_"Ÿ" ë‚f´צ†8 endstream endobj 5251 0 obj << /Length 192 /Filter /FlateDecode >> stream xÚmÏ-Â@ài*šŒáÌ ØþŽ&¥$¬ … (@" àôXÈ%€ à++š.;¤rÅ|™·ó̦ƒ^”PH±´Oɶ0åräe³Ç\¢XR£˜ÚWrF§ãy‡"Ÿ)BQÐ*¢p² è¨Lo”ј§ª¬/¸do¸tï5Œ¬Ȭªõf;%_[Áa\kþ±vëÕ\`kð*·~Ŷ_;´§@ƒ1_c?Òú0¦Ä‰Äþà†[— endstream endobj 5252 0 obj << /Length 198 /Filter /FlateDecode >> stream xÚuÎ= Â@àR¦ñ™ èf݈ÚðL!he!Vji¡h4GËQr„-·u²¢ìòov™—êN¯Ë ÷¸­95l¼×t"Ó—0a3üLvGç¤Ölú¤æ“Ê|9_¤ÆË kRSÞhN¶”OÈ* x9 ª –ƒ­N‚À a°Ž<+£ÀÆ‚ódørÿqB÷üƒ"ûøR -Oõl¿qÙ€äfM©ä¤’o#Eüf¼ä9b Ð,§½ ]Lß endstream endobj 5253 0 obj << /Length 225 /Filter /FlateDecode >> stream xÚ}οjÃ0ðÏh0Ü¢GȽ@+ 'îR0¤ ÔC¡:„NMÇB[’5ö£éQü1VOIó‡ÐD?„îôqÃâÖæœñ•Sð°àüŽç–¾I®™ìQ¾¯½Ò¸"ó*Md¥@¦zâÅÏòƒÌøù-™ Ï,goTM‰×-Pû²‚_—âÆéi€vP=ÒªƒZCù­ûK⑊]l¸¢Þé.*á3ÍŸ{P¾ï,›Øm¢ñ8Ôˆöb+ã þ’¹°º—T¬t€(‰"âêOìþ79ÕUÛ—Ú3iZÑ ýw'mË endstream endobj 5254 0 obj << /Length 222 /Filter /FlateDecode >> stream xÚuνJAðÿ±Å€¹6…yÝ;ïŒW1B®L•BREK EÁêöÞÌ}”{„-S„¬³1!HßÀ|1eqY]qÆc¾ÈÇ\–\ÜðsNo$9“¸.ö­Õ+M2  3“:™æ?Þ?_ÈLï8'3å§œ³%5S,†PÁUH¯P£úB‹¡O68÷j3¯=R¯{hŸFFnO_w,~IûÙ î”ёk#6~TAH‚´Ô·lk íÊßÊTðm<$;¶‘Í?$;ÖP±B„îšÓBd% endstream endobj 5255 0 obj << /Length 166 /Filter /FlateDecode >> stream xÚ36Ò35R0Pac3cs…C®B.cc ßÄI$çr9yré‡+sé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]äj˜ÿ7þg`ÿßÞßÀþ¿O¾Á~Ž}ƒ¼ˆ( ò òX€Ä{0Ñ'PˆzQ‡‹ø"þà ÁÄL‚$ñÿÿd‚ËÕ“+ ºæ;W endstream endobj 5256 0 obj << /Length 198 /Filter /FlateDecode >> stream xÚ=ÊAjÂPà?¼E`²uç\ ¾—>‹Šµ`‚]¹WÖ¥ E¡‹Psæ%Þ Ðmètb© ÃÿÏøÇþð‰{~HÙØgüžÒ¼ãvüèï²ÝÓ$'»bïÈε&›/øt<ïÈN–SNÉÎx²ÛP>c˜ŸùÂ8jP£‰*&àYeqy×mwn\\q£¤‚‘F Râ"=-ÑJÚ¯ÚÁ¨è.SˆªL(—ŸJÐ÷¦«Ô/%è5§7ú9G, endstream endobj 5257 0 obj << /Length 176 /Filter /FlateDecode >> stream xÚUÉ= Â@à`Ú}ÐÍnT1‚[ZYˆ•Z *Ú‰ìÑÖ›ä–)„¸þ€føš™‰eW(¢uÅ’RA”‰#JåçYï0WÈ$ä;#WS:Ï[äùlDyAKAÑ UAЂŸö›¾ .€ œ Ü Xý­Î½ÁµÊß2 ÌxLÿ 3d°—>ÓÓ{ß”îÍ8µ†+àXáŸ?y<Œ endstream endobj 5258 0 obj << /Length 183 /Filter /FlateDecode >> stream xÚeÎ1 Â0àW:Þ’ØwMC«u+Ô ftr'utPÜš£õ(9BÆ ÒZ)¾þyùb&3J© ©¤|NYA‰w ™†Ë–Ãr¾a¥PÂŽbjjKÏÇ늢ڭH¢¨é()=¡ª)rÛÆ·ÞE?˜nc ÌŒá†õà혤å=-$zL©“ %üÑ ”|(  D$q@3\O¼cæ=üi¡ÑÀµÂ=~] X€ endstream endobj 5259 0 obj << /Length 189 /Filter /FlateDecode >> stream xÚ=Ë1 Â@Ð[»Ìt7&˜tBŒ` A+ µ´P´ÕÀxœ%G°´ÆÝDÃÀãó?øƒhÈŠCî{DìxïщÅæü°YvGŠS’+É™®I¦s¾œ¯’ñbÂɄ׫ ¥ ߫ܭª*ûá”pÞâ QˆDnRfi ±[:°J Jô ‘Al[CþÇÊ€±¨Æ1؆‡Æ­y¶¼4ݚ·è85øAÓ”–ôœF< endstream endobj 5260 0 obj << /Length 236 /Filter /FlateDecode >> stream xÚUϱJAàY²0¯M¼yÝ=’»3BLÀ+„XY„À¦´P´Mö |„¼Ê‰àkhee‘òŠÀ:»kÀTüSüÿä£ÓQI†J:ɨÒ  û 1/844(ãåîÇê[Ê ÔW£®®éùée‰z<»¤ õ„æ™VrîÕmSwHÒ‚Õª-¬@~Eé–9ù: ZXïéz>÷ô±ñìÄÆ€L#‰­™Nä(± Ó ¬úÉ›ez‘3õŒ‰ÔêƒY×꛹hÔO@¬lÿáǤ‘c~$ <}M„ pZá þ„å]" endstream endobj 5261 0 obj << /Length 213 /Filter /FlateDecode >> stream xÚ5Í=jÃ@à·,nS4'ÈJ¶6 ŽQHªÁU’2…C ®,MGÑTn!´™“b>˜Þ”ËûÕ‚s.¤Ê/+þ,èHe%}®­.>¾iW“ã²"ÿ$Sòõ3ÿþœ¾Èï^¸ ¿çw¹> stream xÚMαJÃPà?Z8„fí x^@oÒD“É@­Ð ‚¤ ¨c¡Š‚SÍ£åQ|„Ž­¹Ô†sù†sá?šœç3º9‹3MsM.õ9–WI3n/’߯§ÌK1÷šfb–Ý^Ly«ïo/bæw׋YèC¬ÑZÊ…âp¨ ëý‰Â"lî1î^M+ ø{Œhðoƒ)à5ÈiD;['ZÔG½Êé;w>œ£ó‹SšÓˆ~;O{ë. a¯“Á@F‚‘`$ûõ^±ßŽZ¶´ìgÇΖaÛúylÓ_•›RVò§GS endstream endobj 5263 0 obj << /Length 188 /Filter /FlateDecode >> stream xÚmޱ Â0†ÿP°pƒ¾Í˜ÖB¡S¡V0ƒ “ƒ8©£ƒ¢«Í£åQúJë]]î —||$Íy¢c½äIsfú’ÐøŒå&Î7*-™ïd6#íV?¯+™r·Ò ™J9s"[i ÃÐŽP=fjyÕ rÊ£@àP zP#ø0Âv‘8… æaâB\ˆ q!]']Ç®’®úÓ ÅexL¥;—î[Ü^þØý@kK{ú'žCÝ endstream endobj 5264 0 obj << /Length 210 /Filter /FlateDecode >> stream xÚuÏ1 Â@ÐR¦É2ÐM41Á‚Vb¥–Šv¢9Ú%GH™BÔÉJ›·ÃÌÀìƒnÔcŸÜéqrñ& =õciúůÉzGiNjÁý˜ÔDÚ¤ò)§-©t6â€TÆË€ýånàz¬*íp GÃ]bØp–êy¬Ú`JÁyãt‹÷C»Nþq•óÕ?Ê‹|µ¼¡[¼…A–´ . g©%„Ák™&® nW²„G-$ qNszmh± endstream endobj 5265 0 obj << /Length 161 /Filter /FlateDecode >> stream xÚeÎ1 Â@ÐYRÓäÎ Üìj0] Fp A+ ±Š–ŠÖÉÑö(9BJ É:‹-üÿ«¿2‹ÜRF[®)ÏéjðVz&UBsÇÊ¡>‘-PïxEíöôz¾o¨«Ã† êšÎ†² ºšÀ$,e¥<„Ð)1–o“V@,°1¦Ä7–ˆOl&†X*úØ\ø?¾mÏ×Ã0éqëðˆ?oEQ{ endstream endobj 5266 0 obj << /Length 236 /Filter /FlateDecode >> stream xÚUαJÄ@Ð;L1ð óâ¾/pIÀB\XW0… Õ"j)¨(Øí|Ú|J>Á2EÈø®»æ0™{'/msÜh­-W§]§O¼I[+{eðø"«^âFÛZâ•Jì¯õãýóYâêæB‰k½k´¾—~­@5X£” ?,„T}ãaÄ!ü„S¸ ¯p3†˜1YÝöFù͆cÅø½~eOÿ°€M32![[à€cͳX«ØX0<' CÏ0d< ‚qD΀Œ/bav.ûŸB)%Udi`KÊžy‡\ör+?€¾f¿ endstream endobj 5267 0 obj << /Length 242 /Filter /FlateDecode >> stream xÚuϱJAà± ¢­•7/ {›Üy¸Dð A+ „ÄRPQ°òÖ7[ð|ûW¦8¼Ì$Ml¾…ÙÝf w\9ç>rQpYòÜÑ3*)æ\V››Ù#k²7<ªÈ^H™l}ɯ/odÇWvd§|ë8¿£zÊØKdiÐ"ëû¤D%(€ï;¥œ”Û<)÷ÿ‘”Ø_ŒïOIY Ó~0-Î`> stream xÚ³0Ö30Q0P0bss#…C®B.sC ßÄI$çr9yré‡+˜ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. `ÀÏÀ€‹ÁÞ€“Á|ƒñÊ`„3>À ‚3*`ŒÃƇ[· nô‡úÿðJÿÿgÀ¥àŠÑµÃ ”ǰ´ÃaÐ÷܃˜~ÇPXƒ—ËÕ“+ »IŠ endstream endobj 5274 0 obj << /Length 99 /Filter /FlateDecode >> stream xÚ5É;@@Eáþ®@yWàŸ!^‰j˜BB¥J¡µu&ÁWž„¾J¨˜0ȨcFg ©kŠá7¦ÆBz¦ÚUˆmxìç1mA )9hª¶äu¿®_þóT€µ # endstream endobj 5275 0 obj << /Length 149 /Filter /FlateDecode >> stream xÚ31Ô35R0P0Bc3cs…C®B.c46K$çr9yré‡+pé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ä00üÿÃÀøÿûÿÿ üÿÿÿÿÿýÿÿ@¸þÿÿ0üÿÿÿ?Ä`d=0s@f‚ÌÙ² d'Èn.WO®@.Æsud endstream endobj 5276 0 obj << /Length 202 /Filter /FlateDecode >> stream xÚ5= ÂP„' l“#¸'0yÅ.à˜BÐÊBA--m£GÓ›¼@:St3(æ±ßÎ’N¨±º®:í÷4qºwr’$Öæ%¿Êî(£L¢•%$šQ³¹^Î׃D£ÅXD];7’Mt  U™„µI;7IS“¼}êð¯ ø¥_"(¼ –©aµÖ•ÚgM†Oc¯ðßà}Æø7ü¥ Y` ›9FQ„6x.âJ.§ ¢5š¤]ç 2Íd)_µhG™ endstream endobj 5280 0 obj << /Length 189 /Filter /FlateDecode >> stream xÚ1 Â@E°L¡70sÝì ’@°ˆÜBÐÊB„€ZZ( 9ZŽ’#XZ:IV›t«þ 3ïOÌØÄrÄ#²‰xjø¨éBºN%7nt8SjImYǤ–’“²+¾]ï'RézΚTÆ;ÍážlÆ@TðJô ø@ ðhxÁ«jze/¨ š]aöåÙáýÝ;¿íÇÎAdDÉ/ak+ÚÎ?i¶¥”T“‚RSÊ"§…¥ }G«@ endstream endobj 5281 0 obj << /Length 188 /Filter /FlateDecode >> stream xÚ1 Â@E¿¤L/ :ÐÍ®A"ˆEŒà‚Vb¥–‚Š‚…EŽ–£äÁÍ$±ÐNxÕÌgæý¡˜1‡qß„l">hº.§!Ǧ^íO”XRÖcR 7'e—|»Þ¤’ÕŒ5©”·šÃÙ”s Î@ t€h~//i¹ÝKxO`L®Ð“tIVãçßxÅ?üÞù¼¨>ö‡©(=C±uÚ•¿/ñ@ªÅRÓr•iniMoEËBs endstream endobj 5282 0 obj << /Length 165 /Filter /FlateDecode >> stream xÚ33Ñ3µP0P0WÐ5R²LLR ¹ ¹L @ÐÄ "“œËåäÉ¥®`jÀ¥ïæÒ÷ôU()*MåÒw pV0äÒwQˆ6T0ˆåòtQ`Æ`нLÉI†`’ù˜â‡ˆÙ@¨©˜RŒ)öÈ&U@¤c Œ‚ B•@5@µÃ ƒ µj-\ò²ÑÍ;@¶e¸\=¹¹³+ endstream endobj 5283 0 obj << /Length 161 /Filter /FlateDecode >> stream xÚ33Ñ3µP0P0WÐ5R²LLR ¹ ¹L @ÐÄ "“œËåäÉ¥®`jÀ¥ïæÒ÷ôU()*MåÒw pV0äÒwQˆ6T0ˆåòtQxÀJB±SŒ \Å¡˜!’ Ø%¡æý@5¯bÙ–A)~d%P PírÈFC-‚Z+‡ì$¨QL‚z…DK ¾árõä äµd*… endstream endobj 5284 0 obj << /Length 104 /Filter /FlateDecode >> stream xÚ32Ö30W0P0WÐ52T02R03RH1ä*ä24Š(XC¥’s¹œ<¹ôà M¸ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ÿÿüÿó‡a0C ¹\=¹¹¶ h endstream endobj 5285 0 obj << /Length 102 /Filter /FlateDecode >> stream xÚÍŽ;@PÕggÜwAí“x…„J!*” Âî%>‰EÈt3ÍØ00 •¾UjÌØrR¬Ð豆iø¥qAæ 5‚T‡¸šûv̬ɩ‚½Ò p¯ó:½_ó¢thq_þh endstream endobj 5286 0 obj << /Length 103 /Filter /FlateDecode >> stream xÚ33Ñ3µP0P0WÐ5´T2u MR ¹ ¹L @Ð*•œËåäÉ¥®`jÀ¥ï¡`Â¥ïé«PRTšÊ¥ïà¬`È¥ï¢m¨`Ëåé¢PÿÀäÿP *ÈåêÉÈ- +´ endstream endobj 5287 0 obj << /Length 109 /Filter /FlateDecode >> stream xÚ32Ö30W0PaCs3…C®B.K ×ĉ'çr9yré‡+Xré{¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]dêþ7 ÂzlÐ+”Á Ѫ-õ@>—«'W Êî/ä endstream endobj 5288 0 obj << /Length 130 /Filter /FlateDecode >> stream xÚ-ɱ Â0…á gð 2œ'0¹-¥™k3:9ˆ TGAEçæÑòfÚ¢|Ûÿ—ÕÒ7ôlXUÔÀ:ð¢x@='eý;ý m„;P=ÜfÌpqË×ó}…kw+*\Ç£ÒŸ;Zä“Fy2d›åÏd“L*R!s™ÉB¬¹ËY°ŽØã ,P#Œ endstream endobj 5289 0 obj << /Length 164 /Filter /FlateDecode >> stream xÚ31Ô35R0P0U02S06W03RH1ä*ä26 (›Ad’s¹œ<¹ôÃŒ ¹ô=€Â\úž¾ %E¥©\úNÎ @Q…h žX.Oæö8qsƒÍ憺Ì ÿê››ÿØnÿÁÿ¸ÿóïý ÿÿ10Øÿ``àÁ 6P $RR ÒÒ 2d>»@nárõä äT¶Dí endstream endobj 5290 0 obj << /Length 105 /Filter /FlateDecode >> stream xÚ33Ñ3µP0P0UÐ5S03P0±PH1ä*ä25 …M 2ɹ\Nž\úá@.}0éé«PRTšÊ¥ïà¬`È¥ï¢m¨`Ëåé¢ÀÀÀ`ÀC‰ú ÔÐô—«'W —á)Ð endstream endobj 5291 0 obj << /Length 131 /Filter /FlateDecode >> stream xÚ-É1 Â@EÑ?^á ¦xЙ‰‰mŒà‚V"ÑRPÑ:³´Ù™&Nwo¾\ø’ž%红V\ó¦xA=y1žö:À¨n×w¸°ççý½ÃÕ‡ ®áYé/ ­tò‹½4è’M22ÉD³˜ÉT&2+•<å*ØñBÛ#´ endstream endobj 5292 0 obj << /Length 94 /Filter /FlateDecode >> stream xÚ32Ö30W0PaCsK…C®B.K Ïȉ&çr9yré‡+Xré{€O_…’¢ÒT.}§gC.}…hCƒX.O†z†ÿ 0XÏ ÃÀåêÉÈ[\w endstream endobj 5293 0 obj << /Length 153 /Filter /FlateDecode >> stream xڅ̽AÅñ ɉ¨ŠóÌ—eëµSH¨"‘ ” ôÍ£xw³ÓN¦ø5çæþgvZ8œ8K¿àÜñbñ€·²–>žÎ7TzOo¡×²C‡ _Ï÷ºÚ.)k̓<j*¥zÑP ¢±‰R˜è.NÑO|[ƧÕmÈÜÏdSéL6•Îeé\6•NdV;üxÔ*Æ endstream endobj 5294 0 obj << /Length 101 /Filter /FlateDecode >> stream xÚ32Ö30W0PaCsc3…C®B.K ×ĉ'çr9yré‡+Xré{¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]dêþ7À`=ƒ 1S—«'W fp"¸ endstream endobj 5295 0 obj << /Length 140 /Filter /FlateDecode >> stream xÚ32Ö30W0P0WÐ54S0´P06SH1ä*ä24PAS#¨Tr.—“'—~¸‚¡—¾PœKßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEA†¡žá Ö3È0຀`ý™ PÈx€±±¹™¨Ò‚¡€!ËÕ“+ &,• endstream endobj 5296 0 obj << /Length 107 /Filter /FlateDecode >> stream xÚ33Ñ3µP0P0U04T03P06TH1ä*ä25 (Ae’s¹œ<¹ôÃLM¸ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. õÿAà˜üÿ‡Îj-Ô\®ž\\~,Ü endstream endobj 5297 0 obj << /Length 131 /Filter /FlateDecode >> stream xÚ32Ö30W0P0S06V04W0µPH1ä*ä24PA#SˆLr.—“'—~¸‚¡—¾P˜KßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓE±¹A†A‚Á‚Á€¡€!0€Âs ÿþÁz ´oàcàrõä ä-#ª endstream endobj 5298 0 obj << /Length 162 /Filter /FlateDecode >> stream xÚUÌA ‚@à7 ÿÂu ÁÿŽXÓJ0ƒfÔªEBµ ,jímŽâ¼AiÒ"ßæ=xj1›kŽû¤)«%gš/ ÝI¥ÊÆå|£Â<°Ò$7}MÒlùùx]I»'$K>&ŸÈ”ÂGƒÈ½mÞ~¹¼ûi\Ô…ÎáðG8Ô¢x­8ÂM lÏŸj„¨0­ íéb+12 endstream endobj 5299 0 obj << /Length 94 /Filter /FlateDecode >> stream xÚMÉ=@PEáþ®â®À¼™x¨ý$^!¡Rˆ ¥‚°{ äTß±4J2:*5¡Å4嬨`ö¢£ÿÆ´"žfšû¹@ò¶ BJJ7"”¼ï몀Ði ‹ endstream endobj 5300 0 obj << /Length 165 /Filter /FlateDecode >> stream xÚ32×3³P0PÐ5T06V0²P0µPH1ä*ä2‰(™B¥’s¹œ<¹ôÃj¸ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. Œ Ì Øð107È0°3H0°1X0ð10ð00È0$E@øPôPŸc0nøß`ÿàÿû0\@Œíø€Ìärõä ä;g0÷ endstream endobj 5301 0 obj << /Length 90 /Filter /FlateDecode >> stream xÚ31Ô35R0B#C##c…C®B.Cˆ D"9—ËÉ“K?\ÁÄKßCÁˆKßÓW¡¤¨4•Kß)ÀY(è¢ ÔËåé¢ð $—«'W Rˆ endstream endobj 5302 0 obj << /Length 91 /Filter /FlateDecode >> stream xÚ³0Ö30Q0B#C c#c…C®B. #ˆ D"9—ËÉ“K?\ÁˆKßCHxú*”•¦ré;8+ré»(D*Äryº(ü‡ƒHL.WO®@.ëë' endstream endobj 5303 0 obj << /Length 122 /Filter /FlateDecode >> stream xÚ31Ô35R0P°T0²T06V0µTH1ä*ä22 (Ce’s¹œ<¹ôÃŒŒ¹ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. 5 5ÿþýg„" Õ1ü*Êl*,,0‘ƒ—«'W /¨67 endstream endobj 5304 0 obj << /Length 200 /Filter /FlateDecode >> stream xÚµ‘½ Â0ǯ,ÒÙÁá^@ÓH[ëZ+˜AÐÉAA…*:ÛGË£ø&õ-8d¨ —áIøpéd8¢ˆȔҘ’ŒÏÈŒøŒã÷Óþ„¹B±æ(æ|B-èz¹QäË)Im$E[T@¼ >Øß²>¸˜A`AÇÉBË+ºø`3šô4;V¬è ‡+-¢ƒq€{m§z¡Öß×l[·]ý&G“ëG5Á˜jCãàØîŸ·Œ3…+|¯rPË endstream endobj 5305 0 obj << /Length 263 /Filter /FlateDecode >> stream xÚUÏAJÃPà‘Y13Ð4i»j³tåBA] * ]”vB.{b yÐ ÜdÞsJDìâÛüÃ{ÿÌqt”ô¹Ç &yÐ燈^(Ž4ìñ`ØMîŸhœSxÍqDá¹ÆæüöúþHáøò”5ð¾¹¥|€ü`aaÇ9Áïeå­ ã—R(£L¥(û3”]µ7EÉÛ`±¥EiÕÔêN-6Vj-pâW©|gÁÓíªÀ9£Ãpã«\ª²,~‰UsퟻNöŸívI ÊìN=k¿jF(uŠE}€¥ññ£òÖŸÚg\ غ]ÑYNWô_Z endstream endobj 5306 0 obj << /Length 295 /Filter /FlateDecode >> stream xÚ¥Q±JÄ@}a‹ÀîÚÁìh6± œ'˜B8+ j)DQlDîÓ⟠ø)-qf·ÑÚdáM^&/oÞlª“º±ÎÖö¸´ÁS{_ÒÕ•Î3úæî‘¶×¶®¨¸šŠîÒ¾<¿>P±ÝŸÙ’н)­»¥ng³@¯|a…Yn b Ä=Z F˜Á-µ;C4 ¬`Ú £ FŠhj…x‘†¹1føo8ý}}‹Èà¢IDœ3Ö솘sÓ{Hûõø ØC6æb‰“BKú¿à›i°”ªÁœSµÛr£æßØé(_Ó ƒ}NìÇ\F?t"@!„°Bzéï>a3û„óÉ'¼tíìס²¡é¼£+ú®E}d endstream endobj 5307 0 obj << /Length 172 /Filter /FlateDecode >> stream xÚ31Ó34V0P0bSK…C®B.# ßÄI$çr9yré‡+˜qé{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]ø0Aý? Áøƒ½ýãù† ö@CÿùA2þ€’@5@’±D‚!™dþÀðPI¸ùÌCdþÃÀþƒ¡þÿƒÿÿ “\®ž\\^åˆÓ endstream endobj 5308 0 obj << /Length 175 /Filter /FlateDecode >> stream xÚ3±Ð31Q0P0bScSK…C®B.SßÄ1’s¹œ<¹ôÃL ¹ô=€¢\úž¾ %E¥©\úNÎ @Q…h ÊX.Oþ êÿ³ÿg``üÁ~¿ùûÆÿüäØÿÉ?`°gàÿ¤êàÔ õN}`o`üÁÀþ¤›™ÚÔøFÑ¢¢˜ÿ0°ÿÿƒÿÿ? Q\®ž\\à  endstream endobj 5309 0 obj << /Length 154 /Filter /FlateDecode >> stream xÚ31Ó34V0P0bSK…C®B.# ßÄI$çr9yré‡+˜qé{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]øÿ0AýÿÆÌذIù~ iÏ"ëÈ?P¨†ñ3õÈÿ@€JR×|Z“ÌÀ0ù Çÿÿ@&¹\=¹¹)“ endstream endobj 5310 0 obj << /Length 208 /Filter /FlateDecode >> stream xÚåѱŠÂ@à?¤X˜f!ó·FHÄJð"˜BÐÊâ¸J--îÐÖ|1}_aaËÁu=ÎÒÎe¿Ùýg›Mû]îp,+íqÒçeL?”&Òwš¶¹X¬i˜“™sšË)™|›ßíŠÌpúÉ1™Œ¿$ùMyÆ€vˆ¤Š3|-{Pé½ÓeƒÓ!,¨„GpPghÁºFdPCWTíÓ-”k¦¡Cˆðj( ­g¸f"{¿!ªý—Â[ïÞ—ÿA£œftàùËC endstream endobj 5311 0 obj << /Length 189 /Filter /FlateDecode >> stream xÚ3³Ô3R0P0b3sSK…C®B.3S ßÄI$çr9yré‡+˜™ré{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]ø0Èÿ`‚úÿ ÿÿ=```üÁÞüÈ`Àxþ?!ßÀþŸAȰgàÿfÔ1ðÿAeücu1þ``ÿ4Ä`¦ã?`cÐÓƒ–Áü‡;€‘ýàÿÿƒÿÿ7`2¸\=¹¹UEÖ¾ endstream endobj 5312 0 obj << /Length 330 /Filter /FlateDecode >> stream xÚeÐ1KÄ0ð WbV‡“ä hÛÓëUw'ØAÐÉAA…Stp±7?S>ˆC>BÇGë{I<»üšòþÿ”‡ûÓJåê@íMTY¨2W÷âÓn檜„“»G>¯yv¥¦3žá6ÏêsõòüúÀ³ùÅB<[ªëBå7¼^* ák¬‡µÎ›Ø[ojW^ar¯„*ºóG½áÉ¿ý*šo¸ŠºhÈ¡YP~˜hˆ)?£_Ño`Ã`@tÑ6Š×éó£¯J[êL©žmS/t Ý]ŒÑ#”¯zð‰ŠI™m€’&Å+S£ % -%• -3_¸ÄP}ÑÒ˜w4ò&ë!Y½¬¯¼ðkC1 RÛ ¤u㛥ÞFt(×X@;xë1¸lYÛÀ1NNÛ|1`×'ÿ1:?­ù%ÿ©£rú endstream endobj 5313 0 obj << /Length 185 /Filter /FlateDecode >> stream xÚÌ1 Â@…á· LàœÀMŒÀBŒà‚Vb¥–‚Šv¢9ZŽ’#¤L!êÄ‚ºËWÌü0aÔíìs_„D¼hO¡Ïõ—±«-%–ôœCŸôX¶¤í„‡Ó†t2r@:å…œY’M¦€zÜáæ&óÐÎc¸¥§ÜÁ©ÎPÕêöøp±t¼¸e£] 0.â,$+IJ’“‹¬áâ­õ§_ÏFn_óoõ^:,Íè Àv;r endstream endobj 5314 0 obj << /Length 235 /Filter /FlateDecode >> stream xÚmÐÁj1à é^=;OÐd-‘õ$¨…îAhO=”‚ÐöX¨ÒÞ„Í£í£ø{ô°˜N"¸Q6>fB&?™Nî'izàmf4Õô™ãáZûÒ||ã¢DõJÆ zâ.ªrM¿»¿/T‹ç%å¨Vô–“~ÇrEP@X×ìû8õ \²²IU{ó˜»ùÁ3ÌbÆYã¥1Ezôè$æ'i=SË©†LÂB„p6Pu Ž–8ç:R†£ ²Ž÷›[4ß9Þ²áéí…ÃŽ&ÎÈ&üZÚú'­ãXήÁÇ_ð%°m¼ endstream endobj 5315 0 obj << /Length 209 /Filter /FlateDecode >> stream xÚ•±‚0†0Üâ#pO`Amd3ALd0ÑÉÁ8©£ƒFgúh< ÀÈ@¨…«Ú´_®íÝýýe4fÐÜ,¹ ¹¤kˆ”µÓ„íÅåŽqŠâH2@±5§(Ò½žïŠx¿¦EB§‚3¦ i3 €5C8ZA–›À/:LÊ^ÕÁ­ûpšôXpžÛôkÚF¶­±bIF°Ü2ÕéqžËUœNÐC¨™E>ª_…ñ÷c‹ð+v·d¯ó¯åínÔâ&Å~VŸP endstream endobj 5316 0 obj << /Length 260 /Filter /FlateDecode >> stream xڭѱJÄ@à? LaZ áæ4‰Üª[-œ'˜BÐÊB¬ÔRPÑÖÌ›ø*¾‰yË+Äuv²g!–Bà#“ÍÌî¿ÎïúnÙñÎ;ÇÎóMG4÷Zly¿›¾\ßÑ¢§æ‚çžš-SÓŸòÓãó-5‹³#Ö÷%_vÜ^Q¿d ˆRPDZT†¸R´öR ÊOÔµ þ@ù*˜(ÞAWEÁ],øR‚º˜IµRê5ú7P­Ñ&?”2oÆ(~#FLØàgÈü5=dF#ïzv¢L;mf–Ä&,—mXJ[°Ìa Þ#å }Rº:%e-vÁvS½•Ô=U:î霾šes– endstream endobj 5317 0 obj << /Length 194 /Filter /FlateDecode >> stream xÚ33Ö31V0PaS Ss…C®B.S ßÄI$çr9yré‡+˜špé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÁõBýc``üßD@.ƒý0ÅÿL1ÿSŒÀÃ?UBÙ7@¨`JJ=SüPêŠýê (<ö¡9ÅñP¯@=ómrüC%h˜ACž  !@ y`> stream xÚuб Â0Ð  ·ô¼/0­ µ‚Dª£ƒ¢³ý4?Å/iLsqˆð’»INÍÆª œ&vª)©9 ¼¢‹åý¶O4¬4Ê©åÊFQê5Ýo3Êj³ ­ioK¨k2ýè D˜ÒÀ€§dFLƤ1’(­C8^Qˆ€„ÉÆDð¹ïɰ|pÃ1ÆÛ½Ó.þ"bøÿyÒ€Œ)™gëºk¸×¿àRã?UŸ’~ endstream endobj 5319 0 obj << /Length 166 /Filter /FlateDecode >> stream xÚ35Ñ3R0P0bSCSs…C®B.s ßÄI$çr9yré‡+˜˜sé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þƒÀd’ñƒü†ÿ Œ`’ᘬ“6`R‰äÁAòI68ÉØ€L2`%™‘Hv0)"ÿÿG'!âP5Ⱥ‰ A€J$ãÿ `G@%¹\=¹¹Mÿx× endstream endobj 5320 0 obj << /Length 254 /Filter /FlateDecode >> stream xڭѱJÄ@à?l˜&yM"&`µpž` A+ ±:--­7`ákMgé+ä ¼òŠãÖÙÍ& XšæKf’Íì¿]{Üt\ó)p×p{Æ =SŠu¨ÄÎæ‰V=U·ÜvT]j™ªþŠ__Þ©Z]Ÿ³>¯ù®áúžú5ð(ü6S¬ßü`À쑊-Ì— oÕ¶¸áÖë¥d‡ˆ¾¯ I¾Sòý03a‘™LlB".€¿Ñ!1ÍúOx½&ÂpcÄJÂ&ÆHù‹¸£…¸Û…˜„rI)¥ÌÜ” _ò,v0Ÿšõù{lØtéT–‰é¢§úî”Û endstream endobj 5321 0 obj << /Length 125 /Filter /FlateDecode >> stream xÚ33Ò3²P0P0bSKSs…C®B.SS ßÄI$çr9yré‡+˜šré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÿÿÏøÿÿ?TŠñó bü78) À¤¯s‘)hèb y.WO®@.!»¥7 endstream endobj 5322 0 obj << /Length 106 /Filter /FlateDecode >> stream xÚ3²Ô³´T0P0aKSs…C®B.#3 ßÄI$çr9yré‡+™qé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÿÿ†€ˆ¡¾aècWüÅåêÉÈ3v\‚ endstream endobj 5323 0 obj << /Length 165 /Filter /FlateDecode >> stream xÚ31Ò33W0P0VÐ5R0¶T05WH1ä*ä26 (˜ZBd’s¹œ<¹ôÃŒM¹ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. öÿÿ?@"äÿ000°ÿâ„=ˆ¨oÿ`#ø?0üoõ ü ä0X0È`a°o`àŠ2°7Ãñÿ qõ \®ž\\ŸÎ`¬ endstream endobj 5324 0 obj << /Length 243 /Filter /FlateDecode >> stream xÚ]ÑÍJÃ@ðYrÌ¡¾@ û&A[sjsìɃxj= QôjöÑò(y„=HÇíÌÿДeöDzÌÌ~,¯/•/üUŒeé7~_òG‹8"ÇÝ;¯Οãšó›GÿõùýÆùúéΗœoüKé‹Wn6^DÈÅ8×I êF"!¢:˜+2oa[8˜®7“`¦dÎ`+ØÂÁÔôhLM‹fp ˜&byiguf0«­~5Õ¿jŸþ©RrÀyd* îÕõSkÜ_ Ÿ¨ NÔÇ÷9LÕxoéá ÿádÔÿ™‹„sù¾á-ÿ5Š•P endstream endobj 5325 0 obj << /Length 140 /Filter /FlateDecode >> stream xÚ35Ô³T0P0bKSs…C®B.S ßÄI$çr9yré‡+˜˜ré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÿÿÿ€™dü€þ3 eR/i& 0È ò‚d“Ì`’LÊ?`üßÀðÿÁ@!¹\=¹¹Afl÷ endstream endobj 5326 0 obj << /Length 244 /Filter /FlateDecode >> stream xÚuÑ?kÂPð{<0p² Þ'ð%œÿ€ ur(Ávt°ÔÙ€«ê•]ÝÌGÈè|½¨X#yîøÝ=8. [~›< 8¢€:½û¸Ä°ËµW”ÅÇ|ýÕ”Â.ª1wQÅÏôõ¹ú@ÕjH¯>yoÉà瘣1 ýƒ¸ 8hFãx‡]Ê*ñ›1æ•øá8§¾yºØTBŸ¤,a P³ —À“M õ2Ü< œ fepÒˆ\$ÀIÂÖ5+zÛG4÷V¸Y5D NZ@fWðí¤'c´ÔÒÇýoÊÀQŒü¦Â! endstream endobj 5327 0 obj << /Length 243 /Filter /FlateDecode >> stream xÚUпJÄ@ð/.0…ûfŸÀMNÖ?óSge!Vji¡hkRù\AKÁTÖ©$EØuwöŠM1üøf`Šï`¹·<’…Üw£¥>”w%=’Ö.>úÃí­jRWRkRçnKª¾ÏO/÷¤V›SY’ZËëR7T¯¥µ@fµm óÀ¦‡í¼ÅÏ0 à{d¾¦˜üۘÎ=õ4]LÕ3ùȦ€aÒ@b·´liº@ÏT|`Ä“MLjbËÀ¾Å4ŸLõ“ÿ1ÂÄdtFÀœW$®Gœ á*Ã.|ר™±ÕtIÿ6D†c endstream endobj 5328 0 obj << /Length 239 /Filter /FlateDecode >> stream xÚ­‘±‚0†Ï8˜ÜÂ#ô^@D'ÔDŒ“::htGáxWÚœmš~éÝßöú_LÂyÒxJsNgoô(ò»ÌéŠIŠîžÂÝ5‡ÑM7ô¸?/è&Ûñ~IŸ¼#¦K¶ Cµ¥ Ô¼*x1F%¨À)dBœÃè ñ‘Š…¬ªA«ÑŸ8çEÅjGîU…Ò(ßNk¼ûÈ4ª,— ~ÐjÔ…}Á<ÛC¿2[|Žþfa?­-ÈÖžÆ3ë ñ“­oŒ×œÈ¾}°]Ñ=ÂUŠ;ü”K‰É endstream endobj 5329 0 obj << /Length 167 /Filter /FlateDecode >> stream xÚ35Ó35T0P0bS#Ss…C®B.K ßÄI$çr9yré‡+˜Xré{E¹ô=}JŠJS¹ôœ ¹ô]¢ÆÄryº(ü‚ ê„úÏÀÀø¿,ÊÀ ÿLñSÌ? Ô0Åø™adªT Y;ªÑPû ¶CÝuP7ÈÙÿÀÔˆ ƒ™….ĵ˜—«'W ŽK€¿ endstream endobj 5330 0 obj << /Length 309 /Filter /FlateDecode >> stream xÚ­‘±JÄ@†ÿba æ3/ I ‰ Bà<ÁZYˆÕii¡(6‡Y±õ¡ò>D|I™"Ü:³$EÀÒò…Ù™Ù™ÿ/²Ãü˜Êé -¨àŸºKõ£Î3Ž&t”G›½¬t|My¦ã Žë¸ZÓóÓË½Ž——g”êxE7)%·ºZà[ÈÙV°óþz=ÞªEd€°‘¥ê€šKzNä¬.{7Aâ|®Œ$sQèЄÒ>j"‡vDÉmvsÔý#ƒL°ÿb~ÃüöùdóáGŒûñ¶[ÞVužeø½ÿajÖEyȳv¾Y©:À†%*?ñʵÑJî¤~D`q£ìû€@\qðíBìcáÌšpê`¶èŽÐþ ™j‚óÚ·²<§Øq}^é+ý 6²¥É endstream endobj 5331 0 obj << /Length 221 /Filter /FlateDecode >> stream xڕѽ Â0ð–‚ì#x/ i*Uœ ~€ÄIí£ù(}„ŽJãÙK Í"&…äHrÿt¢F*ÄÇ8 q¢0šâYÁ È€f4ãÊé óäžê ×´ 2Ùàãþ¼€œo¨@.ñ 08B²D­uåÐ uf,HW§‚ ô¥lüfëç¬(ºz¥eõ§Ö~ûüæÞ¦Øô§¹_Qš@™ñÍëõ6Ò+L®6ŸñeålóZ¹šÿ«›v,X¿ÕKéP~ï‡ÞEÔºe¯Ö©úN=â’¹«vð™<›Â endstream endobj 5332 0 obj << /Length 256 /Filter /FlateDecode >> stream xÚUϱNÄ0 à¿Ê)K¡~h{=îÄB¤ãè€Ó ˆ @°!ZÞ̉èF%Psw ²|Jì8¶ç‹Ãª¦’æt0£ùŒŽŽé®r®^j°¤EµËÜ>¸U㊠ÕKWœkØÍ=?½Ü»buyJz_ÓuEåkÖ?€ÆŒ!òÎf°l#>Ù3ZÎ;@Î'€ç7Àîx ïÉ&Œ&È–Nm9ƒR0—!¡G/aEïFD+E$½ÑŒµ²MX‰¿„^É>a‡-úÆü‘Mˆÿèû=¦×:upÇ´–¤-µiÞ}õèGŒˆA§Š^{s¦ywÖ¸+÷=Ÿ†# endstream endobj 5333 0 obj << /Length 150 /Filter /FlateDecode >> stream xÚ3µÔ³4W0P0bSsJ1ä*ä2ñÁ" Fr.—“'—~¸‚©1—¾P”KßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEÁþ?<@£0ÿg`ÇÀøùA ˆbüP¢>€©T*L`¥€)‹`J+ŦF Åþ¿Hʃ‚ârõä äWÎr° endstream endobj 5334 0 obj << /Length 191 /Filter /FlateDecode >> stream xÚåÐ= Â@àÑÖBÈ\@7‰¬ÆJðL!he!Vj)¨h«9šGÉ,SˆëlÅ3X,ßòf˜âu¢VsÀmnFlzlº¼ é@ÆH¸¤˜¬w4HH/ØÒ‰I'S>Ï[ÒƒÙCÒ#^†¬(±µÊ>ñl \3X~ZPCAù©J'BEH?4€þ—ºôuâ7{©-'¿ROrï%ËxºVÝ™‹Ã·¹CÙ ï qBszØxaº endstream endobj 5335 0 obj << /Length 240 /Filter /FlateDecode >> stream xÚmÐ1jÃ0Æñg1> stream xÚuÑ1KÄ0àW „ãºv8ÈûÚôÎb ç vtrá@ÿ…?'â)ΤC¹ø’£âMHøH^ÂK^Yì/Pá÷æX.°8ÄÛ\<ˆR¡ëÅÑvçæ^,k‘]b©DvJË"«ÏðéñùNdËócÌE¶Â«Õµ¨WhíÀ­í"kÿ·ä@öŒæ¤àmDâ$f~¤#; Hl ¿¥½8@£ÁŠwdFUšì¨%[pù¤^q(é`J7)¯Iˆ’›ÑMk¯T¢äRÙñRI JN%}¤½Ö<=“Dt2l¥IÜ©yÑÑ&ôFš:Uï; ôAš9ÉOŠ} ô5*¡¿­ºÿÄÿ‰°­ ÄœŒE'"'íEÑ<´¾¦®_g'µ¸ßÑÆ©Ñ endstream endobj 5337 0 obj << /Length 279 /Filter /FlateDecode >> stream xÚ]ÑAJÄ0àC»…МÀ¦Ç.„Â8‚]ãÊ…êÒ…¢ëöÁ«ô&æuW°ôù’<3‹ôãÑ¿ù».OËÊXSÒZ[svnž ýªIkÂè_<¾èM£ó;šu~žÍyûxÖùfwi oÍ}aìƒn¶¦E„'8p…@ë@Òµ1Ù±=™Ž h¨ $«3,ØÄ+N¼€ÝŠ­‚moƒµÛ³.˜ }0ý颿Q…£’x(`ÜO‡b<¾£âkˆç|ŽÑ4ºPS0á€%»â€ ¢–ƒöàØÞW¾œÌÈCeàË  »ä›PIÂ{Á7™½]øоiՈݱúªÑ·úR}Ý endstream endobj 5338 0 obj << /Length 231 /Filter /FlateDecode >> stream xÚÍαJAàYÈÁL›"y÷.p1©b¯L•BAS¦P´Î=’p²2EÈ8»n@ô,†ofgÙ§“ËÉŒK®´¦×WüRÑ+ÕsË8ÆÅó– ¹5×sr·zJ®¹ã÷· ¹Åý5Wä–ü 7©Y²È ð~k%…öÒvìT²Z^{ÓcÝÙ³ ÷ÃâôU«o²CÕ0Ë–*¤ÅSTB¶‹ú`ζÑñÞ&‡í%‹ãE¶Ÿ´§QÒÈ0›b4è3¾Ýe}÷¿Íÿô"Ý_馡}Èl® endstream endobj 5339 0 obj << /Length 232 /Filter /FlateDecode >> stream xÚUÐ1JÄ@Æñ/¤¼&GØw“@B,ÄuSZYˆ ¨¥ ¢`—-GÙ#liv|ß‹ÜÀü`fÈŸ™iÊ“¶ÖRu«M«Ï•¼K]Ù¼ä”O¯²î¤¸Óº’âÊV¥è®õóãëEŠõÍ…ÚêFïí—é6¢}8rB²G‘š² ç g@þãîp ¬vøÂoûÑðDšD,ZŒN€Çà±E‹Ñ- ®Å-FIâ2vpŽeDZdøÓbt¤½k±Ùt`ÌÜÓÔel6óXÆË"÷ó­üdÁí=yÙ<"ú»ýW.;¹•_µštó endstream endobj 5340 0 obj << /Length 204 /Filter /FlateDecode >> stream xÚmÌ; Â@à . ´Vf. ›´1àL!he!Vji¡(X›£å({„”Á8ë£—åø‡ùÝéÅQ—Úš’˜º}Úi<"ÏÈŃ÷f{ÀQ†jÅ{T3ŽQes:Ÿ.{T£Å˜4ª ­5EÌ&¡€º6äü¥…°%/_x÷/PAP02gøýÁ0Ò¦–yp&îî¬dBw›:Œ+0ðÁüâ}¨AT¾yóMÞ6Ó¢5lö–¢.Ë5²Ài†K|¤øT£ endstream endobj 5341 0 obj << /Length 198 /Filter /FlateDecode >> stream xÚ31Ó34V0P0RÐ5T01V0µPH1ä*ä21PASKˆLr.—“'—~¸‚‰—¾P˜KßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEùÃT‚D0S$ê00|`ÇÀü¹A¾ù;ÿæ ì˜ÿå˜00þ* àÄ?8Q"êI&êPMÊøbÛ½`Ëßœq ä ã ò Ìê˜þÿ:]þ—«'W ÈckA endstream endobj 5342 0 obj << /Length 182 /Filter /FlateDecode >> stream xÚÎA ‚`à'?( ‘œ ”ýüºÌ A­ZD«jXÔ.Ì£yàÒ…Tcu€ßæ 7f: 5ÙðP³™° ø éL¦ %¿—ý‰â”ü MþBbòÓ%_/·#ùñjÆ’&¼•ÎŽÒ„¡ZÀ{ÈUe5ÈTÆ©¬Ö-Õ‡W¨6êÀj@-ÐÉÅóOù¯Ó‰;*`{ú^‰ž[bàTd7“ý w§”§ÍSZÓ»= endstream endobj 5343 0 obj << /Length 198 /Filter /FlateDecode >> stream xÚ31Ó34V0P0VÐ5T01Q0µPH1ä*ä21PASKˆLr.—“'—~¸‚‰—¾P˜KßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEÿó‚ÁþT‚zó !ÿHÔ±÷`øÁøþó†ú쀶¤ „|P±=˜i«‡u âÉDª)öph‘<„ÚkrF=ÈAï?0þ`<ÿŸ¡†½ÿ?ƒü?þÿ ì@‡s¹zrroXhI endstream endobj 5344 0 obj << /Length 189 /Filter /FlateDecode >> stream xÚ]Î1 Â@Ð\˜B/ 8ÐM²(ÚЦ´²+µT´“èÑr”!åbI qáÁ23ü;èö9änÀ¶ÏvÈû€ÎdC)úlGUgw¤IBfÍ6$3—2™dÁ×Ëí@f²œr@&æm)‰Ú¸·2Ï©\^¡sϵ2¸Î÷¯HÅøQ‰RñþQÖOþø—Ö5ÉQÑJrµìhè M£íÂá„TårL¼@³„Vô½£@ endstream endobj 5345 0 obj << /Length 141 /Filter /FlateDecode >> stream xÚ32Õ36W0P0bcSK…C®B.# ÌI$çr9yré‡+Ypé{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]ê˜ÿ70ð|À ßþ€ÁžÿCÿ`ÆÌ00ŠÿÿÿÇäè§3ÿa`¨ÿÿ޹\=¹¹¢&[ endstream endobj 5346 0 obj << /Length 237 /Filter /FlateDecode >> stream xÚ¿J1Æ¿00…ñ v^@³9ïäŠÃ…ó·´²+µT´[¸}´> stream xÚ31Ó34V0P0bS …C®B.C ßÄI$çr9yré‡+˜ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. Ì€à?É&™iN‚ìaþ`ÿD~°’È700nà?ÀÀüDþ“ØÀÈä‡$Ù€‚ëÿÿƒÿÿ7 “\®ž\\y endstream endobj 5348 0 obj << /Length 122 /Filter /FlateDecode >> stream xÚ32Ö30W0P0aCS3…C®B.C ßÄI$çr9yré‡+Zpé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]˜ø0È@A@ 8~Àüá? ±q©ŽØ0üÿ‚¸\=¹¹(CE` endstream endobj 5349 0 obj << /Length 150 /Filter /FlateDecode >> stream xÚ32Õ36W0PÐ5QÐ54W0´P05SH1ä*ä22 (˜Ãä’s¹œ<¹ôÃŒ ¹ô=€\úž¾ %E¥©\úNÎ @Q…h ®X.OÆ ìø   P?`üÁð†Ø€¸ôE6Œ?êügüðŸ‚üc?PÃ~À†Ÿÿó.WO®@.ÿ§Wõ endstream endobj 5350 0 obj << /Length 196 /Filter /FlateDecode >> stream xÚµÍ1 Â@Еir3'p.#˜BÐÊB¬ÔRPQ°ÍÑr±0EÈ:? êdÙ³3ó7èuÂ.{Œô¸òʧãH‰ÆrCqJzÆGz$¯¤Ó1öÇ5éx2`ŸtÂsŸ½¥ […RÊüâë?´LõºæÝ3Ø‚ærÁÊkm‚¨„;xÔÂ3êH†Kv¤Ø@%¯â.êýoÔ nn—**ŒÉù@Ô¦ôDr endstream endobj 5351 0 obj << /Length 108 /Filter /FlateDecode >> stream xÚ32Ö30W0P0aCS …C®B.C ßÄI$çr9yré‡+Zpé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]˜?0ü‡!þ ̃±ÿ`øÿÿq¹zrrÆ‚Q. endstream endobj 5352 0 obj << /Length 177 /Filter /FlateDecode >> stream xÚ3³Ô3R0Pa3scs…C®B.3 ßÄI$çr9yré‡+˜™pé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]˜?ð`Àðÿƒý†ú@úƒ=ãƒ:†ÿÈ77Ø3ðnà?Î ßÀüÿˆþÇÀDÿa`ÿÁÀNÿ``ÿ€þÀÀþ`Ð O€âÿÿƒÿÿ7ÿÿNs¹zrr#߈ endstream endobj 5353 0 obj << /Length 147 /Filter /FlateDecode >> stream xÚ31Ó34V0P0bcs…C®B.C ßÄI$çr9yré‡+˜ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. Ìø?00üÿ`ÿD~°’È70ðnà?ÀÀüDþ“ØÀÈä‡$Ù0½ñÿÿÁÿÿI.WO®@.‡e% endstream endobj 5354 0 obj << /Length 188 /Filter /FlateDecode >> stream xÚŽ1‚@E¿¡ ™†#0Ðeƒ6 &na¢•…±RK v9Gá”Tâd)H¬ÌN^fþîþù‘žÌ¦ð”Çš£€Ã9Ÿ5Ý(ŒE”qÑßœ®”R{cRk‘I™ ?îÏ ©l»dM*çƒæàH&g8^W‰S­œQƒdHàVðá•R¾ ò!J*¨- Ài~ nNû/†ooñkg»Íîõ$AéÖHåŠ> éáwlzZÚÑIKÚ endstream endobj 5355 0 obj << /Length 196 /Filter /FlateDecode >> stream xÚα Â@ àH†B¡y½ž­uj;:9ˆ“::(ºÚ>Z¥p"ØŠç]qÐQ |CB’?Šû2ä€Ü“1G!‡#ÞI:R°«aøm”d$V$f¶O"›óùtÙ“H–$R^K6”¥ŒÊ¯À¨\ƒ¹UW0÷Â/¼º%>Á«°T¨5*è´4hy~“ÿÌ÷ö²¥ý¦Ýß> stream xÚ31Ö³0R0P0VÐ54S01Q06WH1ä*ä21PASc¨Tr.—“'—~¸‚‰—¾PœKßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEùÃùŒêØ0üa<|€ùÃãìÊð?`0?À€Áþ€> stream xÚ36Ò35R0PacCcs…C®B.# ßÄI$çr9yré‡+Ypé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ØÈ3üPàÿÃÇþ?nÿÀÿœýó3 ~Äo˜0ÿah`þÁÀ€‚?P³Íüÿÿs¹zrrjÙF„ endstream endobj 5358 0 obj << /Length 195 /Filter /FlateDecode >> stream xÚ=αJÄ@à¶X˜fßÀÌ x{›`TñSwÕ‡•Z * Wî£í£ÄÊ6`“"8Î%GŠ™ùÿfŠ|q~ÆK.ø4p¡ó‚½R^j¨çåÔ<> stream xÚ36Ò3²T0P0TÐ5T0²P05TH1ä*ä22 (˜Ad’s¹œ<¹ôÌ̸ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž.  Ø W á Œ@Ì Äì@,ÿÿ?Ã(f„ÊQ „þ0‚pC sC3ƒ=;ÿ?°f.WO®@.uH– endstream endobj 5360 0 obj << /Length 153 /Filter /FlateDecode >> stream xÚ31Ó34V0P0RÐ5T01Q06WH1ä*ä21 ([@d’s¹œ<¹ôÃL ¹ô=€Â\úž¾ %E¥©\úNÎ @Q…h žX.Oæ ìþ`üJò`À‘p’ƒºBþ`°ÀÀðƒ¡üÆçÿì™Iùÿí@’ùÐ.WO®@.1c endstream endobj 5361 0 obj << /Length 183 /Filter /FlateDecode >> stream xÚU̱ ‚PÆñ#‘k[çêªWJ'Á rjjˆ ¨Æ†¢¶ˆûh>Š`›Ph—º—jù ÿ¾@ BŸ\ò©ïQà“ÒÎÃ#ŠHE—Äè³l˜dÈ—$"äS•‘g3:Ÿ.{äÉ|Lò”V¹kÌRj×_œ œÒ.Á.X ,g0i)à <¡¥©¡pƒ¶&†®A†=éjœ|c(v‘kØ]þb=ÀÐ(Ô¿áúO¨ÁI† |F£?ê endstream endobj 5362 0 obj << /Length 233 /Filter /FlateDecode >> stream xÚUÎ=KÃPÅñs Xx³v(æùzËíËb ­`A' ÖQ|A7©‘|±€Ð~Lïx‡`¼7UÓN?8gù«áá°Ï!ñAÄjÀÝÏ"z$¥ìr·¿~nîh”¼d¥HžÚ™drÆÏO/·$GçcŽHNø*âðš’ WUPñ÷6¾Aß´4æðŠ5¹§q ‘þ" bxØ%âtÇq¿Á_ù®cùGˆÅ²h;²š÷L€ Ëtè5Â<þfúOk…2·|âµÁ+ñ–ZlECÝdÑ ±ï(°ç˜ÂÑIBô¥Y_™ endstream endobj 5363 0 obj << /Length 210 /Filter /FlateDecode >> stream xÚMν Â@ ð)(¡«ƒÐ> stream xÚUÎÁjÂ@àYi® Î èn²Zõ$¨sÚSE¨GÁ½‰æÑöQ|„x ‰³²Iéå;üÃüü=ÝF¤(¢N8 ^DúÖ!þ qª¨¯ÝiµÅIŒò‹ôåœs”ñ‚ö¿‡ ÊÉÇ”B”3úI-1žQY¦ãâàAægà//7ˆœŽ4gËZŽvª*Ì 0‰Ã¿˜Š+ã]S‡¸CEÉ@QsüϰFÕì,IqSn/¼'¶’gCþbŸ^m‘mjg`ç1øã'>ÚŸKø endstream endobj 5365 0 obj << /Length 183 /Filter /FlateDecode >> stream xÚ%Î1 Â@„á‘@„‡$|'0‰+AA¢‚)­,D¨¥ ¢æQ<‚eŠ`œÅ_ìì·°&î# µÇL_M¬‡H.bìÚ£½ØŸ$I%ب‰$Xp• ]êíz?J¬¦Êu¦[>ÙI:ÓIU•uO§Ã)Fh~ðß!;£ó:còÌÛዬQÖ‘‚ôŸÿ)HÿåpIëH]R·YÀ#õH[¤mé(œ²âl2Oe-?uàC endstream endobj 5366 0 obj << /Length 188 /Filter /FlateDecode >> stream xÚµ1 Â@EH!L“#d. ›ÍºˆBŒ` A+ ±RK EÁBb޶GÉR¦R×l´6¯˜˜ÿþPtÌ+îǬƬ5$Ii;ŒXÜf¢$#±a¥I,ì˜D¶äëåv$‘¬f,I¤¼•í(K~ |[äj¿„W¢‚opGÏà ÀÄ!´—S‹¢E¦ /‹òèzù´ÌO¾6x+Ó¸YÛ~åÕÎÜuдñí…æ­éÂÕ`ú endstream endobj 5367 0 obj << /Length 121 /Filter /FlateDecode >> stream xÚ31Ô35R0P0bc3SS…C®B.# ßÄI$çr9yré‡+Ypé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]0001;Ëñÿ ÿaX*6T°ý†úÿÿ?À0—«'W ¾NÚ endstream endobj 5368 0 obj << /Length 228 /Filter /FlateDecode >> stream xÚmαJÄ@ÆñoÙ"0M^ป'p÷WóSZYˆ ¨¥ ¢`eòh>JáÊ+ŽŒóé5‚E~°;ÿY²¬šc­té_^iÓèC-/’³Ÿ+9¸’u'éZs–tî·’º }{}”´¾<ÕZÒFoj­n¥Û(Ê-€~‚Ù€8¶#J^ÎQì0CÜc…0áùîÈDÌ_úŸžÓÁïø:ßsöNüaçü™r$_΂[-> ³À,°ˆ, %‡s„'äƒlÏ"³ÈÌñ¥™aAZÒ›M°¿ÈY'Wò TŸc| endstream endobj 5369 0 obj << /Length 235 /Filter /FlateDecode >> stream xÚuÐ1NÄ0ЉRXšß`3', ZiY$R AE¨€ ´ØGóQr„”[¬0¼„‰"OÊŒóÇ“ãîÈ/¥•^—ÒŸ‰÷òØñ+÷ÅVüɾóðÌëÝ­ôžÝ%Êì†+yûxb·¾>—ŽÝFî:iïyØ™-­2È9QµµÕ EëPõE6‚f¤LÍôV»&‘ÆàðÌÔb&e6‚€§Ñf“õÕŽó‘òY (yâ/ifU ý°Å_ cBüÔ¨M>Õ‹ý‚¸Ÿ™°y¥ÿ€‚޵¸2_ |ÃßÇ›jh endstream endobj 5370 0 obj << /Length 188 /Filter /FlateDecode >> stream xڕν Â@ ð+ At-(˜'ð®¶µkotr¡P?ÁQðÅ_ÄÇè èý‹­³ù‘äIàõÃ+FŠÃ!¯=Ú“™º,ñ‘o)Ñ$ìG$'¦KROùt8oH&³{$S^z¬V¤SBĢ⊠ØÀ©iƒèA«äf°1ë€h‚.p;»Áö`¯Z  \2ðoóŠß›ÿÂy™³54Ö4§òý`ö endstream endobj 5371 0 obj << /Length 226 /Filter /FlateDecode >> stream xÚ•Ï¿jAðïnaÜ ˆÎ ˜½s=b!j W¦J!‚`R ìnÍG¹G°´8ÜÌœEH:›_1;ödÏyŸSp¯ÏnÈyΟíÉ9)¦œ¿Ü_6[šd?Ø9²oR&[Ìùð}ü";YL9#;ãeÆéŠŠÇÀŒÇæÒºÂ„ÐpQ*Å+j .+xsº7á”xÄ•‘Íç–Üð‘\ƒ }µrÓþ† ”¿ø´•R þ/:tK­¬uéîNTc¨'Û¼‰Ä'ò¡jìiT”2ƒ®D¥×‚Þé+XÑ endstream endobj 5372 0 obj << /Length 243 /Filter /FlateDecode >> stream xÚm½JÄ@…OØ"p›¼ÁÎ}d³ƒÚXW0… •… j)¨hëäÑò(ó)S„ÏD…m>†{çüÜuuìVZj­G+­ÏÔ9}ªäMjÇa©îägóø"›VìÖNìÇbÛkýxÿ|»¹¹ÐJìVï+-¤Ý*Ðô@ P„sŽºø‚&¾³¾[ D>#E@ƒ¢Ç†r˜Iõ~2û> stream xڕα Â@ àHÁB}Ѽ€Þ]õ¤“…ª`A'uª(¸ÙGóQî|ƒšTZèàà‘û†?$w#3°i²ÔhdÈŽéhð‚CË!Çá·s8cœ ÚÐТZpŒ*YÒíz?¡ŠWS2¨f´5¤w˜ÌHŸP˜Qžç®ÎëY’ 4aÐ:B@à ¸Ç8 ‚—1¾ìn -¡SQ¼üRá-8­ð d“_Ñ®Ó+ÈJ¢_<ÿ!’¯tùâ<Á5~lúQ- endstream endobj 5374 0 obj << /Length 265 /Filter /FlateDecode >> stream xÚMÁJÃ@Eo˜ÅÀ[8мÐ$A„ÒB­`B]¹WêÒ…¢ÐEÁù´ù” ;#Ç›*ÖÍyóî{wæÎquÔLµÔZ§ZŸjÓè}%OR7KmN~&w²l¥¸Öº‘₲í¥¾<¿>H±\Ÿi%ÅJo*-o¥])L OÄ[ À`;d1ëa¶°3X`LpÀM6{ä{xÖSÏœ˜°Hpžî|tO¥0£1l¹6Ì ùi4ÈþÓ,ìÀe3zŸÓáw™gRÒô¦SÅß@v伕+ùÿcå endstream endobj 5375 0 obj << /Length 237 /Filter /FlateDecode >> stream xÚuÏ1NÄ0бRDšÆ@ò\œlÖBT––E"Tˆ ¶¤AKr®â›ì!eŠ3³ ˆšgiÿ_×'aE5t¼¢æŒB ÇŸ± 2¬(œÎ_žpÓ¢¿¥& ¿”1úöŠ^_Þvè7×çT£ßÒ]MÕ=¶[‚b—….'0SÉ2*(ÙŒ`&p ÞÁõBì!Ît ç¼àÒð_èÝ_èR¥c§Ø™%Éž 6{6Cñ!I¬cˆ“Ä)A×ô?€Ö«ÌÁ“ôXZ1IÁØËN+éOVë”ùÀäqY‰-Þàú m9 endstream endobj 5379 0 obj << /Length 200 /Filter /FlateDecode >> stream xÚ•; ÂPEo°L“ ™ èË{? bSZYˆ•ZZ(ÚÆ,-KÉR¦uò)ÔN8Õ ÌœãúzÀO¸g4û†‡†šÎdŒL=ûíj¢0&µacH-dN*^òõr;’ W3Ö¤"ÞjövG t)PÂ*ÐÉaçp2¸)\ à <` %:5vQá9܆ Á÷ô‹×ÿü\ø<.¿š§òÝ)Z™FL ÅSl+ç¤ö— i‘"é’:i”Òª·Kó˜Öôï*c¸ endstream endobj 5380 0 obj << /Length 196 /Filter /FlateDecode >> stream xÚ•= Â@F¿`˜&GÈ\@7»þ¥RðÜBÐÊB¬ÔÒBÑ.ÄÍ£ìR¦⸠j)¼jfÞk÷[ºÃ w¹i4›”{†wšŽdŒLNÛïÕö@#KjÅÆšÉœ”óùtÙ“-ƬIMx­9Ù°J @,ˆnB‰ BPÂÈ«gXxnˆ÷$ÊaõKý?¿¾GîýT¾‹ÃKæ%–{Ïúé,æâ/Ò"EÒûÆÌ÷J5M--é7Z£ endstream endobj 5381 0 obj << /Length 103 /Filter /FlateDecode >> stream xÚ37Ñ32W0P°PÐ52S03R† )†\…\¦ aS¨Tr.—“'—~¸‚©9—¾‡‚)—¾§¯BIQi*—¾S€³‚!—¾‹B´¡‚A,—§‹Bý0`€PÿÐi˜<—«'W ¦5° endstream endobj 5382 0 obj << /Length 112 /Filter /FlateDecode >> stream xÚ37Ñ32W0P0UÐ54R0³T05VH1ä*ä23Š(˜™B¥’s¹œ<¹ôÃÌŒ¹ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. Ì `0¢èÿð©áÁåêÉÈÇ‚J# endstream endobj 5383 0 obj << /Length 102 /Filter /FlateDecode >> stream xÚ32Ó35V0P0b#CCc…C®B.C˜ˆ ’HÎåròäÒò¹ô=À¤§¯BIQi*—¾S€³‚!—¾‹B´¡‚A,—§‹ƒýƒúõþÿ€AÏþ—«'W !‘$‡ endstream endobj 5384 0 obj << /Length 111 /Filter /FlateDecode >> stream xÚ32Ó35V0P0b#Ccs…C®B.C˜ˆ ’HÎåròäÒW04æÒ÷Šré{ú*”•¦ré;8+ré»(D*Äryº(ð7Ø?¨ÿPÿáÿñìð70`¸Õs¹zrrD7„ endstream endobj 5385 0 obj << /Length 191 /Filter /FlateDecode >> stream xÚM1 Â@EH!L“ÖBt. ›5*$BŒ` A+ µT,s“£ä)-ëÊÀ›Ïûãõ:ºÇ.·5w‡ì ¸ïó^Ó™$º2"«jw¤0&µ’R31¤â9_/·©p1aM*âµfwCqÄN‚ã &yæ–IK˜·m² …mòž…õŸ€É‚À # ‡d¸Ãʤ²R©ìT„ˆ¨%’Yh¢|Þ’å¼lAÓ˜–ô!K endstream endobj 5386 0 obj << /Length 193 /Filter /FlateDecode >> stream xÚM; Â@Eo˜"ð7 ú6 “‘‚ L!he!‚ –‚Š‚]²·2K™ÎvÊÂ8~@›s/ç>xq§v8àVÄQã„“”·!)î:¼ägÚìi˜“\pÜ%9q†d>åóé²#9œ8$™ñ2ä`EyÆXÃ+= ¿µÒWhºŽj@ß®¨×aÚ w~€§þ` ”›D‰»7X#¬²•°úƒ‡°æ‡âá}1¨`õMƒB½ŸÓ8§9=1hM& endstream endobj 5387 0 obj << /Length 170 /Filter /FlateDecode >> stream xÚÕ1 A Eÿ²]¯8;êÀvë N!he!Vji¡h«{´9ŠG°´ãd±QÄÞ<~~ „¸~·p\p/•³ìJ^[ÚÑ L}¡­V[ª™9J2ãä’ >ì2ÕtÈ–LÍ ËÅ’BÍ@.ÀY®*åtÀßà“}4˜I“½¨™kÆ\Ðê7B <µÄ/z‰¢ñ…íž¿aúš×³?I£@3zóպà endstream endobj 5388 0 obj << /Length 186 /Filter /FlateDecode >> stream xÚÕѱ‚@ à’.<‚}#èF‚˜xƒ‰NÆI4:ãñ(÷72(µeqbÑÉK._þÞµ7\šŽgÓDv6¥tN§¯˜%’czp¼`a0ÚQ–`´’*FfM÷ÛãŒQ±YTKÚKËMI>×A»Šk‰üb¶2p:È[àvä ²; ¯zªUë^_mT™ÐŒœè} ä2H«¾öÜ/;è¯óÿEægÎòMCâÒàßλáR endstream endobj 5389 0 obj << /Length 256 /Filter /FlateDecode >> stream xÚ}бNÃ0€á‹ó[ñòŽ«í#•Ú[wж¾£¯Ïï7´«ûkÊÑ®é)§ìë5€Ú‚,ÝÇH‡Y˜1Fu˜EÃ1˜Û$Ì`„Ú³$ª] ½ciÕÝiÇ’˜¶MÓ6Òj T§Ä%˜0Òú©`t‰è)ßšô »µýÚ£Éî§ûì0„R7¡ ŒÇ’A¢«Ó\—þt‚‡dèC@ëf;„wÛ€75>à/G°ž% endstream endobj 5390 0 obj << /Length 208 /Filter /FlateDecode >> stream xÚÑ= Â0àJ‡Â[rß LK©¥S¡V0ƒ “ƒ8©£ƒ¢s{4Ò#tìP“ö¥qj |ä‡÷Ã[Æ‹$Dõ^†Åx àQ¢Î¾>ê‡ó 2ü€Q|£n‹->¯+ðl·ÂxŽÇýˆ¥^oÇémIiTEí¸²êud=X4ƒi;87v¶LNó7މoò™üTÏŒêd²T}Xö÷_õ§—QOË^Wþo5Q;ŽG2Ê7öOõ×Ò<êq.ÖœÔWX ØÃuRÖä endstream endobj 5391 0 obj << /Length 263 /Filter /FlateDecode >> stream xÚ½‘=NÄ@ …¥ÉÍ!¾L"±ËnC¤e‘H¢J ´$GóQr„-·­ñŒ7qF}#[ãŸ÷–«Óõ9Õ´ “†–g´XÑsƒo¨¬Sxm™§WÜtî5áZúúxÿ|Á°¹½¤Öª±Û´ (E¸TV";§‘èYäepšÒ{ðJý¥9†~P(eÔRÂé™XföìdH-Ø ÌXq*óKÏíÄ8§ãþ/÷ü§~ÖbyœoƃÑöq?´}Ý`ôƒéáÁô©ÀôºÓïëØ0fW Ø';´¬jœô÷#˜©†úcŠÍªþyÄ< ^ux‡ß³ = endstream endobj 5392 0 obj << /Length 196 /Filter /FlateDecode >> stream xÚ37Ö32V0Pa3 Ss…C®B.3 ßÄI$çr9yré‡+˜™pé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þƒ@˜þ¥ÿÃè õ?ØÿÓp,ÿBóÿ‡ÐÌ@@4#P2Íðÿ„®ÿ€JÛÿ@£ÿ@hytúú?iBöÿAu?œ†ú«þª¿aá¥aá ?öÿ¨á[ÿþ°ø@‰Ÿ?P\®ž\\2oÉ™ endstream endobj 5393 0 obj << /Length 184 /Filter /FlateDecode >> stream xÚ}б Â0à+Â-}½'0­Út µ‚ÄI‡‚¯ì˜¡Û¤…¦VÇÇår~>ÅS hR(Šéâ#^ô¦-Ç &ÙŽ"ŽlUÜ"“kºßgdÉfA!²”ö!”)isÞÀKT •¡oéY<py~# ³ˆ?@Iæz­S=©Z¿ˆ¿‹Ah1s–Ì!oâ9)ù–¹ÁÓʦ«:#Ç¥Ä-~·Ê endstream endobj 5394 0 obj << /Length 159 /Filter /FlateDecode >> stream xÚ33Ð3°T0P0bS3Ss…C®B.S# ßÄI$çr9yré‡+˜qé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þƒÁ¬CýfÅPÿLÉC(~ÅŽB1£PŒX© ª‚Å€Dý@¦!;˜úÿ7UÓ€j š ø(ÚP °ÅEq¹zrrco©· endstream endobj 5395 0 obj << /Length 262 /Filter /FlateDecode >> stream xڽѱNÃ0à«2Dº%à{p<¸-“¥R$2 ÁÄ€˜€‘súh~”> stream xÚ36Ó32T0P0aSs…C®B.crAɹ\Nž\úá Æ\ú@Q.}O_…’¢ÒT.}§gC.}…h 1±\ž. ÿÿÿÿƒŒê0 uŒî'.WO®@.•õy9 endstream endobj 5397 0 obj << /Length 138 /Filter /FlateDecode >> stream xÚ35×31V0PaScSs…C®B.K ßÄI$çr9yré‡+˜Xré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þVŠ¡þÃ0¤ØRüPŠ %BÙ£Põê?˜b„PÌŠÿ˜ªÿÝÿ8(.WO®@.‹† endstream endobj 5398 0 obj << /Length 253 /Filter /FlateDecode >> stream xÚ}Ò±jÃ0à·è ì{‚ʦIëBÀ¦P…vÊP:µ;´´ÒÁ~°~?‚Æ &×S !HÁßIËwWÅÙÅœ :—[U4¿¤—ß±šI_„6|<¿á²A·¦j†îV^Ñ5wôùñõŠnyM%º=–T> stream xÚeѽJÄ@ÀñYR¦É#džÀMü¸\·pž` A+ ±RK EA±ˆ¾™¾I|ƒ³Sˆgwv/'W,üfþÅn³¿ÓìQEþ4»tÐÐuw8›Ë\ùÑ/®nqÑ¢=§Ùí±Ü¢mOèáþñíâôj´Kº¨©ºÄvIÌ@ƼÚÀ˜À èøU´Á;€é=zÅ‹¬ž'|+ž|1 #G”R (¤ø¹¤2))€RT¸58BÒ )*¤¨¢BŠ ˜0Dtc„㈒ß(rþTd¾†À¿á±<\B¹…"!OÈL¬ÑmÁ%”‚Á£è!ü)ä Y‚Ùµx†n«Äº endstream endobj 5400 0 obj << /Length 165 /Filter /FlateDecode >> stream xÚ33Õ3²P0P0b3Ss…C®B.S3 ÌI$çr9yré‡+˜šqé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þƒ˜ú¡þA¨ÿ õ?øÿQŒÿ€( Ä Êþ2%ÿ…úO&…b ª Pk!Ž€: ì@ˆ'@Ôõ¬q%vŠËÕ“+ 0¾ª( endstream endobj 5401 0 obj << /Length 233 /Filter /FlateDecode >> stream xڥѽ Â0ð‡Â->Bï4bÛ­àØAÐÉAAëækù(>BG‡Ð3͇‚uP=¤òAYý‡Ú¯K]¹k̵ÚpÍ&ŽËœÛÈ…MšÊgd ŸÎoç°Úk|x–¯pÿ +‡Â@Zä/0ƒ´d73(Mº\5|¢³3¿WU =e0ƒ>¬ß endstream endobj 5402 0 obj << /Length 263 /Filter /FlateDecode >> stream xÚeϱNÃ@ à?êÉyƒÆ/iJ"•¥‘J‘È€D'ÄŒ X{÷hy”^åc¡¯êŠ™D5‡=îþÙü:þé§“ÎÇ|ñ_.þ(Ø_’ IŸ˜4B±±ÌCjÑz8½–nZ:Ð7¡6 endstream endobj 5403 0 obj << /Length 152 /Filter /FlateDecode >> stream xÚ33Ó31V0Pa3cS3…C®B.SK ßÄI$çr9yré‡+˜Zré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ìÿƒANúÃÿÌÿêi†úõ Zþ@ˆæ‡Ó5`šNW€ifœôýà˜fÄI3€i0™4?(pÓ\®ž\\wG³æ endstream endobj 5404 0 obj << /Length 196 /Filter /FlateDecode >> stream xÚíÑ1‚P Ð’.^@?'ILtr0Nêè ÑÍGã(ÑP[ˆ‰““£Cû_Û´Ë‚Á0$êûy4Šhïã CmJ9î&»#&š5…!š¹´Ñd ºœ¯4ÉrJ>š”6>y[ÌRbæ\æò €[B§øãgpq ‰¸þD¬…b¢ ¤û7 ›%é¸ÇXzÂ’¯²+pîC‘7 M=$¿©¯¬qÓ˜«ŽÀY†+|œ¼T endstream endobj 5405 0 obj << /Length 271 /Filter /FlateDecode >> stream xÚ}нNÃ0ÀqG"Ý’GȽ8‰DÃÔH¥Hd@‚‰uFlU›GË£¸o©‹‡¨ÇÝÅ|4RâülK§¿\•ç%æXâYUŽ>ð³Šy{9Þ<½Â¢û€³ ì ƒmnñãýóìâî °K|,0_A³D"êMLäþá¿1 /äΘ­¢c Œô/jEË802F¦x©åZ0WðýFf ÖÇàa2+x…3‘ ô .Hbìþ‰‚[¥TS'J &f N”@MüA­àÖy@»Qpâ: œèÜ7v#"Úõû†ö.€¶ÔBMíúŠGH'‘ SÄ~ }J× ÜÃ2ÿš` endstream endobj 5406 0 obj << /Length 199 /Filter /FlateDecode >> stream xÚuν Â0ð+„[ò¹'0­~€ÄIí›™Gé#tì =猪‹!ùAþ¹—úù€RÊÉG4Ó!Ã3vYªW}ØŸpR ßP>@¿}±¤ëåvD?YM)C?£mFé‹AhÀ0W–¹pµ•(Ô†Å&áRŽ_ïÕGW«¶RM©Êú1|šŠw5áFò—ú«ýö ]Ÿ÷æ·ñ¯¬5IW¦†º'C»§{p´Ü:ކ«ƒV†#Î \ã 8.y endstream endobj 5407 0 obj << /Length 191 /Filter /FlateDecode >> stream xڵϱ Â0ÐH†Â-ýï L«–ºj3:9ˆ“::(:·ŸÖOÉ'dìP{^ŠCEœÄ<¸Ü%¹$“Q”`„c^ Ïc¸À4å¸ }âp†Ì€Úâ4µä]Pf…·ëý*[Ï1•ã.Æh&GA‚}1è”t@%’c55lË)É1•’¬(*ÉÚúzí¼Ãºgã û¶?øqÛÛ[®ë„­Da_½=@ÖMÐ é4ÕBÚ3²ò'`a`Otí„€ endstream endobj 5408 0 obj << /Length 184 /Filter /FlateDecode >> stream xÚ•Î; Â@à )ÓäBænbÄ*#¸… •…X©¥…¢­Ù£å(9BÊKÆY#X[Ìó‚?›M³ŒbJ]-(Ó9Á¦¹ô±kÝâtÅR£ÚSš£ZË•ÞÐãþ¼ *·KJPUtH(>¢®> stream xÚµ= Â@FR¦É2'p³$!vÁ-­,ÄJ--­o–£è ´‹dœ±ò¯æÁ·3ì<6{AŒ†\±Æ¸+ [ˆÎDi,7P3ŒP#¾eƸßÖ ²É5¨çƒ˜->E) ït´ÿD›ŽL®Ì”Z&U¼×!˧Òm,—J¯¿–yÿ"LŸXœÞI?ðåµ]ìÀ&^-Vìæ±gÇž·Zêø¿n$ù̴ɦ†¦p h¥Á endstream endobj 5410 0 obj << /Length 191 /Filter /FlateDecode >> stream xÚ]ν Â0àS:wÉ#ä>m©Ð± ì èä Nêè (¸¥à‹õQò3ã­ þ\È'›3ʇEÁ)çrFçï2:RÞߥ}ì¶×”¬$S2{ZÏù|ºì)/&œQRñ:ãtCuňCèà:DávG|‡iÊFy”­öÐV;¡tPo¼0ðáƒÌ7ÀæÙ÷âª{äKxÕNÄ. P¡5­ô €’’ÒÒ‚¦5-éQle€ endstream endobj 5411 0 obj << /Length 155 /Filter /FlateDecode >> stream xÚ3²Ô3´P0P0a S …C®B.c ßÄI$çr9yré‡+›pé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ä?000þÿÃÀÀþÿ?÷£¾ÁþÁÿ†ÿÿŒÿ¡óFÁð¿FØ1 bˆÿ ÓÑbõÒøÿÿÁåêÉÈŽXo5 endstream endobj 5412 0 obj << /Length 264 /Filter /FlateDecode >> stream xÚ…½NÄ0 Ç]1Dòropõ @ZµU™ˆt`b81#æô x¥lŒ¼B$€Ž7œbì´Bb"Š~±ì¿?â¶?é;ª¨¡ãº§¶§æ”j|ƶoE]·„îŸp3 ½¥¶A{)~´Ã½¾¼=¢Ý\ŸSvK»šª;¶rJ“€xþâP0ów4Éð{\í .c9ØNø]ÿ”"ÿßY¹pÒ&Zm­¬m¥1¬˜÷BÏ`­XëX Ï2ÝÌ1Ï2s–Pª)£Ö—àH˜²r”Á€—L¥5ø1ýÒýáU¥—Wôš[$ÜtUòÝ’ŒáYņ'¼ðr˜Ô endstream endobj 5413 0 obj << /Length 157 /Filter /FlateDecode >> stream xÚ35Ö30U0P0bS#S …C®B. ßÄI$çr9yré‡+˜Xpé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þ3Á$;˜d¦%YH2ÿÿ$ùÿÿ’ò@Aæÿ6Œÿ˜ÿW€É òÃÿÌÿ ‘ H$Ã’ÿÿÿ±ÿÿ“ärõä ä WžH endstream endobj 5414 0 obj << /Length 122 /Filter /FlateDecode >> stream xÚ32Ó35V0Pa#SSK…C®B.#C ßÄI$çr9yré‡+ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. ŒØÿ0ðÿ!ùÿ("”ªÁþ3Ô#!öÿ ÌÔFÿÿÿ€#.WO®@.Nq endstream endobj 5415 0 obj << /Length 173 /Filter /FlateDecode >> stream xÚÍÎ1Â0 PwõÒ#Ô(i‚ í©‰ H01 &`dÁœJ\,Gér„I+: F,=þ°*G² ŒÒ ¥rBjLyI‰gTÝ9£i>dûVņTbfI×Ë툢ZÍH¢¨i+)Û¡© ë¸íEì¿ Yßëú¿Lì!æO`ý’@7Ú[§=·Û¾9nÙ…ÝØû4?ú×#nç×ø`9yÚ endstream endobj 5416 0 obj << /Length 198 /Filter /FlateDecode >> stream xڵб Â0àJ†Â-}„Þ˜TZèV¨ì èä Nêè èj}´¾¯ÐGè˜!ỗƒ:Èw÷'„dfœ¢Á‰ßiŽYŽûNf¾6\ò`w„²½Æ4=÷]Ðõ/çët¹œbºÂM‚f u…~ÑCQýÓˆº¯*ÇSÕK¦cã;[È©›èXeÙ°c£–ÅF:Ô‹’!÷ö1HÞ¿B !ù›%ލõÔ‰=Ûˆ…ec'lô’ü_Ù‚ì§0«aOP‡Œ± endstream endobj 5417 0 obj << /Length 105 /Filter /FlateDecode >> stream xÚ32Ó35V0Pa#3S …C®B.## ßÄI$çr9yré‡+qé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þ3üGBìÿ˜úÿÿq¹zrrÊWù endstream endobj 5418 0 obj << /Length 188 /Filter /FlateDecode >> stream xÚÝÍ= Â` àˆC!‹GhNà×"Ú ‚ ì èä Nêè (¸µÒÁkyo =Â7:”¾¦ÅÉÁ8„<ù! úín(žt4BMl}>pÐÓº.«ÁfÏ£˜ÍR‚›©vÙÄ39Ï;6£ùX|6‘¬|ñÖGB%%9µ "” 4Dªrr•{Ef‡V5 ÜR×’S^r_Ô,µÿ¬¥»IQiâNÉë[)%ö[ôyü/ Èû[<‰yÁo¨Rµ€ endstream endobj 5419 0 obj << /Length 151 /Filter /FlateDecode >> stream xÚ35Ö30U0P0bS#cs…C®B. ßÄI$çr9yré‡+˜Xpé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þ1Ô`øÿùÿ Éÿÿ”gþ$mÿ7°ÿ«’Ìÿ>0Éÿþ`þ‰l@"üÿÿýÿÿ˜$—«'W Žá‰ endstream endobj 5420 0 obj << /Length 176 /Filter /FlateDecode >> stream xÚ31×37U0P0bScs…C®B.C ßÄI$çr9yré‡+˜ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. Œÿ000ðÿÿ$ëÿÿ’ÿþ700ÿc°ÀÀþ‡Aþÿ2 \ i$Á €Êêäò?ˆl •Ä4b>Ä.dÛ!îp!îdræ~ùÿ€$Ø_\®ž\\-in« endstream endobj 5421 0 obj << /Length 193 /Filter /FlateDecode >> stream xڭп‚0ðš$·ðÞ h[I;˜èä`œÔÑA£3>Â#02Î+šhÔM‡þ†ûúçK£`¨#Ô8Âc¤1ˆqgàaÌSQðˆ¶H-¨†1¨ÏAÙ9žO—=¨t1A*õA½›¡ ]‘O›Pö±’JA…äy)Iˆ¼r&õÓ~ó®ßþàÇmý—·’ªkÂ]Ÿ{77”Ôx­Ü¿f}N$¹nýCâù&L-,á‹ endstream endobj 5422 0 obj << /Length 144 /Filter /FlateDecode >> stream xÚ3¶Ô36V0P0bcsJ1ä*ä26òÁ" ‰ä\.'O.ýpc.} (—¾§¯BIQi*—¾S€³‚!—¾‹B´¡‚A,—§‹Ã?æ ÿÿñÿöÿDM}Ãÿ?þ`ÿ÷áÿæÿ@Ä8ÑPß$쀈` 4'þÿÿ‡Ap¹zrr8WÖ endstream endobj 5423 0 obj << /Length 187 /Filter /FlateDecode >> stream xÚ%Œ= ÂP„7¤¶ñÙ˜„‡Æ.à˜BÐÊB¬ÔÒBQ°“£y”á•[„ŒûHñÁÎÌθb2+$˜Š+ä’ó]n: 2ç/*NârN7ærZmåùx]9]ì–bîJŽV9qµ*ý> stream xÚ36×34Q0P0bc#Sc…C®B.#K ßÄI$çr9yré‡+Yré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ø0°<¶‡âz þÁŒ@ÌÄòÿÿ?ø„™bTÂðÆÿ ÿ7~`øøƒýÿ@Ç400ÿcàrõä äÎpR endstream endobj 5425 0 obj << /Length 149 /Filter /FlateDecode >> stream xÚ35Ö30U0P0bS#cs…C®B. ßÄI$çr9yré‡+˜Xpé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þ30ØøÿŸÁþ?’ý?ãÿÌ@5J2"‘Ì0’ñ?;ˆlàÿÿ¨Ìèâúÿ€¤üÿÿA*þÿçrõä äðŒ endstream endobj 5426 0 obj << /Length 199 /Filter /FlateDecode >> stream xÚe̱ŠÂ@Ð7¤¼&`Þ8Éš …(¨ ›BX+ ±RK EÁBÐɧ䦜"8ÞqaZÜ÷=¸yÒÎ$‘/$ëI§+ë”wœå良þ±Úò¨`=—,gýƒ+ëb*‡ýqÃzô;–”õD©$K.&âœQÎ~8¢˜¼-x¥)؇%‰à Vd‰.hUAëmPþ[‡0ªÃ+|D0|D] ×zy‡ÊÝ^Öœ}÷b‡Uc\6úù?ù»à?#Zh endstream endobj 5427 0 obj << /Length 236 /Filter /FlateDecode >> stream xÚuαJÄ@à9R,L³opÙ'p=…póSZYˆÕ¥…¢pE ûhû(û{]Ä#ãÌZ˜F˜ácfø«Ë³«Ú朻ªÍEmö%¾aµâ¹Q»WÜthMµB{Ë[´Ýùxÿ|A»¹¿6%Ú­y*MñŒÝÖ‰\Kÿ©&Ð#d!#P¬OIÇ*¿ —M «D // R2h‚``ÝRÌ“m\®ùÕ‹ãzð=@>6m8ˆ}F}:ä1Μ¢>²Šý ,EýÍfù¹œ‘]ˆîO Î sSq0€iî ›TxÓáþ¦‹j endstream endobj 5428 0 obj << /Length 214 /Filter /FlateDecode >> stream xÚeͱjÃ@ `-~„ÓôìÆ&lpˆ‡B2e™ÚŒZš-?šó&†¾ÀA–Œé– î㤻_*³—‚2z•S¼ÑbI_9þ`QJi©ŸßØthwT”h×ÒEÛ}Ðßï鈶ټS޶¥}NÙ»–˜a÷lÌ}ì!â!xHĢ µK{Ñ0S%¦ÓYLæIŒÙ±„4¬^½vA:ÓCžõÿ5ûÏ2?¹j,TÓkØ„pÂgÙ àe3D^63ÔìŸÅU‡[¼}l* endstream endobj 5429 0 obj << /Length 245 /Filter /FlateDecode >> stream xÚeϱJÄ@€áYR¦ÉÜÎ è&^¢‡óSZYˆ•ZZ( Wœ$/%ñEò[nnœYäÚ|Å,ü3[åû%åt@{Å!•Ç4?¢ûŸ°¬dšS5ÿ}º{ÄeƒîšÊ ݹÌÑ5ôòüú€nyyJºÝ”ßb³"fo8ü7a êLìàŒ¸{؈kq€ÐàEoÄÚ›A ª I¿sLÅlL;q›‰é6‘­˜ð,ú)þˆŽ"pøkë'ëaÒö“šß “6ª«jùTº…vûMtÕ%ü¥yþÖpû®É7«±šc%^–Æ ð¬Á+üš~oì endstream endobj 5430 0 obj << /Length 200 /Filter /FlateDecode >> stream xÚMÎ? Â0Çñ_ÉPxKŽÐwÓÚ‚bÁ?`A'qRGE¡ƒÐ-Gñ;ˆñ¥.ù@^ø’W EÁ)çáŒ9ñ)£+åa–†kx8^hV‘Ùq^YÉ”Lµæûíq&3ÛÌ9#³à}Æéª—Þ{÷G«¼-m,@{L¡?˜ y㉲§C¦|Ï uäj%@ª* éy RM§œT—rR)§~ØØI;Ýó¶Ri+&¶éPÚ¦¼•õþ¡eE[ú´åfN endstream endobj 5431 0 obj << /Length 122 /Filter /FlateDecode >> stream xÚ31×37U0P0bCS…C®B.cc ßÄI$çr9yré‡+sé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ä€ÀDübvQ$þÿG%úAüȨÿÿÿÁåêÉÈB•\ endstream endobj 5432 0 obj << /Length 231 /Filter /FlateDecode >> stream xÚmÏÏJÄ0ð¯,Ì%ÐZ%c‹ã7¢â!¿02I†ñ|ÜøÖÛz¿ü¾“éGÆ­…Vx|–í,ÍïGi®˜•f¾ö‡×ã“4Û› ßI³ó÷odÞy¸A# ÕŒJõ—&E½8]&”ÃRj ©Ð¤ šÙõKXÿ™"9ãØß°öC¯ú"‚ãƒùÊÞáN¤¶¶šàžç‚ +–o¨q‘Ô ™€ï@æF2ŠÌÏh.ÊpFmLF IÿA.g¹•OÕ¬—´ endstream endobj 5433 0 obj << /Length 237 /Filter /FlateDecode >> stream xÚ}±JÄ@†ÿbaš> stream xÚϱ ‚`ðáÁ{2As‰3È!¨©!šª±¡(hˆôÑzÁñĺïŒt©¡~Ãÿ8îÎûa@ ¨ç‘R0¤‡Gô=9›Îö€qŠîŠ|ÝÇè¦s:Ÿ.{tãÅ„8MhÍ3L®±â“+ÿ"dL-V¢K±x{°pprm î%@%*­!š¥ÞiÉfúÈ£ú1ƒÖºÕh¬´fG«£Ý¨ZŸFéȶ> stream xÚEÐ;N1 `G)Fr“#Œ/³£Ñj«HË"1Tˆ ()@PgŽ–£ä)S„{Aló)Çù“iw¹›iC]Œ4M4Oô2â;n÷²¸¡yþÝy~ÃÂÃm÷8ÜÈ2Ë-}~|½âp¸»¢‡#=Ž´yÂåH`xpœv ú$¸ä"¸,t¹?“”¬¥JIÏRÜsTR/´°vÌ „ –å6£#`f€ÀÁ3G&û-Û]\\ò\´Eõ«åV>R®ô­tŠUÌ?p¦²"ÅFÏ ¶ø¿Ìò¢!ÚS‚S¯`% ^/x?}Ï“… endstream endobj 5070 0 obj << /Type /ObjStm /N 100 /First 935 /Length 3485 /Filter /FlateDecode >> stream xÚí[ËŽ·Ý߯à¨o³ŠO@ðÂq HÃ… ÅÄÛZX ¤1ü}Î)6ÙlÝyæ*Ž@ºhÉæ£ºÈ®:§ØR_ƒ[úªÎGþ§,'ueñ.¡¼†ärtRQ_Wü]£ó¸¤Äì¼ &×伯2¸­&8Ÿ"3¼°& ƒÛ’JpâQ“‚8ÔÄâÔDÍHX£ =X#ÂyN½‡$¬ñmB)N!¯§5C!±hÀ-Ь!;¥ÌŠ‘eVŒ(³®âeÖÕãq­fu2 ä ”Ù§àe^«wœªR!32â"æó¥V!32ÅÅÌš5¹™=Õ’0¨Ïh˜ ³Ï>¸¤¬Y³KÙS 2CéÈdªO‹KÙSyµ,€XMt2ûèq+²ÆãV2¥{—!³¡:.C\³w2©™ÄšÌ…SæŠó>[«Š5,¼ËÞšÒ úÆ€šë’­•9,_ò…9.m> ëÐuØÕæ(˜£ GÆúøš*…DZ8 ×ÿN‘QÏ:n“›F„[HÑ×&zÛ P rØÅ sXUçô ¥i¬¬Ã2hÌ!\FlÞrXYî» UÄœo.‰g®bMs3&lGa“*ÇHh†Ì¡®rîǬ…]³¸‚‘N=K,v:6% T[‹\uU¡²º2ÃfŠ!kò•9®…@3ÈBQkÆn¨oµ°æ^4ÆÓ‹U­îkwþòÕÝËOÅOÅOÅŠq]_žž??ÿöïÞ¢òÍë»Óù›ŸÿqgEVêéü×›Ÿx/ ˹¹{ûê_k(tˆøíù—­Õ矿A'ᄅ‚UÁ­¯oß½ùùí··ïÜóçîüÕÛ7ß~s{‡v篾øÒÿôÓÍ·Ÿ»—î³Ï0Ê«·ïîþðãÍ[‘ÓùÏ7[þótþû«ïî~|× 4çtþãëoß|÷êõÍR[[s‚wÍf³þÈuYsú‰?̼ÀÕ¼ÄúÐÍ{zù°À>ÍjîžÎ_¼úþûÛ··¯©YÏ7Y]çåõ›»ïn¿‡‘[Ï7[âiýö;ž•t°Þï•ÂJÁàA9‡ÃÃKSGbQG‘Î$‡^ôv7ö¢X1 Å…T—ðèÝ’ëÅnÁˆc·ôüq·ÐùÂßÑw]½Yjš6 c¯¹Ø+E/÷J û#+—úKWÓù¦¦]ïÕ»ï=VgùRgªeèlËuà7Ä~ •¥K•å{TV†Ê´.¢×«,>UeñŠmFi#ÀE¹ZcE&±04V× 5“{ÔX•¡±¨Kz”ÆŠœoŠìk8r·lO1æy½BoÏ’{Š› 0{­êB:s¿ëŽÈõ=ݾ¯;‚ÙþÈ¢Gcü‚…Ó‡Íy‚ÞÓ(©,u{Ó@ –R.[—Ù¼cf·ÿµÙ×…d)-€ùš¬û–/ ¹U\È©šlVߤoõëV‚‘í·ç¦0²1IÞd ~ܱ©!žÈZG‘òùu‹~)…ßaÅð:ã ¨|)†R?õC*ò;.H/Ú¼C*oó©x@–M. ;'- ˜Á„$l aò,þÔ°wD©À qÐv¿YóÖ¹åӺļ)`› µ´´ÀÞ÷±ßWKV[Z2•7íµ›²öjñ‹00µ™jÒC4b[m c!,qëã‚m,m?Šl aÛi·„Q¢aÊÕ.XF©N×qGa&yXJú’½O€q´+ÒðáBÿ€þ­#ZG?û \hÑ.¢]¤ªwÿ;vánÊ4‡¸0JÆ(£d¡QÄ\Þ½NFk»èYÐ#£GAâ yp¡G 4™¸Ð® Üu©×û&ùAÂDïóLØÃW£Kf˜LÍL’vë&´WÚ›ñí¶‘8¯Ý´©•ºe ´ Ò[3s½e ÁÔnŠù2yíÆ•~Ëk·ËÁfïf9pö2Fá|»b™YêcFÎWeö~UgïWÃìý†ßŠ”eø­HYvJY†gŒ¦‰á5Ù/tYøVûÐeIìdò¯ ,l%>Cè£d>Cè²0žéC—…†Ç‡<ùe†—æ3„á¥9{\gŸ»,™³Ç.Kæì±ËR8{ì²0êc—…¸ÝÇ.Káì±ËR8{,3*ˆ]Æœ}ˆ²¤.K¡,IfŒtÆ)Ì!ÅFHé€R>`„T!ÕFÈë#dÀSì2M± µÇ 2챃 9 CÎÈwP@©r= ˆ²DñQä€ ÊUì¥Ø¡ ¥*‡ˆˆ/é7ÊJ(Õ΄‹>ÊeT­hQµ-OT6ïú˜ZÊ3öðé—gìQ/±Ç†‰=ª9´õ£pÓ÷à”¬tö).¹S½èIÆúô¿h¾'“Îì|Á?Skކ¿wÓ¿w#Ye~wd=À^Y°Wv0nç;·ƒ5?uó¤+Y<Øʳʫ¡k}ºJºÜ>éží“×)²¸Ù‡~ÀI©¸Î÷ïçùbü—ô·…4Û (®ˆ‘þÍàfä~j ~a(ÙÌb§Uà’ÅËvÈ”>Ëú¶<¤ïd}¿µ´´€ã‡-Êú®ªˆXþуFý?=hM¡çÄ|· Ýò[{›ü1¸³¾. ;Æ÷# †"’„V÷„6(~{ìˆ;@05ý.Ñ$OZ“&Ö“A³‰õdpp¢;>?Ø mœÐ —OµËðøÉÆŒö’ÁÍÍÜ jžì ¸LØK1'ö’Áˉ½Dü„½dDOˆ½dDOˆ½dDOì4YℽDÒ„½Dò„½dàãb³× {É@Òvô<Ð2±— |Lì%{ÉÀ¤Ä^2p5±— TOì%ÕWÓ Ÿ˜ Œ_­e˜„uFbüÁ›™‘˜‘˜„0#1 qFbÒŒÄ$ä‰I(3“Pg$&q=x±è^,ÊŒÄ$êŒÄ$†‰I<º¼xty1ÏHLb™‘˜Ä:#1IëŒÄd€_Cb2Я!1ÙàïwŸ®ÿéõøSå|„á–¢=¨×ã—8á˜Ô ¿\)Ë=GÊ2)øÞð!ì¢×9ÿž~¿tžò[ÿ–z \ÓåGRé½`˜ ;€ñJ§ÌOŠtÇ/BŸdrÈöÕ’NAÙ9­ÚÇMÝüÙ—K²Ÿ§?öýð×@ü`Ñi¸·ˆNûôÄ×|q,¬ùòXXó~,¼ÁwKçít|uB±HiC¥– µ¤¿F­_ºÛŽl+ßn7`»ÁÛÖtº;³ˆKñÔt³!ïÆ¦”'áƒ\Ï>6ªñßd ›4낽ÚmSÿ;këÿ›•¬æ•Ýt¸×bä¸(Üqr¼É€ß@‰º‡˜Ý.˜…ÁË=YE?»FD ~Љ¥ãB»„v íÚ%´Ká±ÌW¼†áB»º>âÔÖØ?ÞøÝp$ÂJ窆*Gœ™8QÇ)+a¢Žð có:Î?ù~è8%ïÒq 2uœ…ò‹\xß¾v1AåǪ#"ú€RwjrvïÀïuu°7s$¥LÑMFÿeÄ3¡îÅçì#ŠÏ“©óÉ€ŒÓgc‹u>:Ÿ èà‡äŽ:ø!¹£Ž€0m—Žxp´ïu׉WêˆGûlW¦“n“':Ü&OtxMÚ8ÙϨ—q¾L/ã,€z§ Éô2N(Ë`ÊÉV%MŒW§&ãÕÿR–ÿÚå‰ñêà¿ÙöD¯îü—zÙù/eÙù/eÙù/e9ð_=ð_=ð_=ð_=ð_=ð_=ð_=ð_=ð_=ð_=ð_=ð_=ð_ü—YÝ/eÙ¯íÝ0}× #ºn¼y׫íÏ<±hL™,ZQ&‹ÖpøÄQÃáGx2âÉ|þ‰'SO¦&žLL<™2í<™,ZwžL­O¦TO¦TO¦TO¦TñðE„ÆÃ_Dh<|¡;Oöö*û™EëÄ“íeÖ™E눋ÖôÔòB¸öòÄ_¯½À«A/ñjÐé3ư@ï-½çœ".Ô󲯏ˆfëž[÷ |×øŸ¯µHwÈ> stream xÚ32×3°P0P°PÐ5´T02P04PH1ä*ä24Š(YB¥’s¹œ<¹ôà ¹ô=€â\úž¾ %E¥©\úNÎ @Q…h ¦X.O9†ú†ÿ ÿᬠ—Àƒ€ ãÆæfv6> † $—«'W ÷ '® endstream endobj 5441 0 obj << /Length 220 /Filter /FlateDecode >> stream xÚ½Ò=‚0à’$ßÂüN`!!U'ÄDŒ“::ht†£qŽÀÈ@Z©mIjüÙlBÚ-ïË$ÇCŒû‡ÏOñÁ¸š‡jª^gHs`[ä1°e¿ ,_áíz?K×sŒ€e¸‹0ÜCž¡ì‡ „(eml ñdE|µQ”ýb©M*mÐhýVK;-Fi,ŒI©U®Aml´¾µu¥Öø¡ü“ΧâûýéË÷Úl.CNµ›ŸÍÕZ¸=x¦Úº½%õÐë³gizïÜÿ@Õ‹6ð ·¯7 endstream endobj 5442 0 obj << /Length 213 /Filter /FlateDecode >> stream xÚÅѱ Â0à; ·ø½Ð4X-‚P¨ vtr'uTt•7)7´&/¡Â“²‰Ž hÀ4³“"¯rM¾ò¨Ó˜îzd‡Ú endstream endobj 5443 0 obj << /Length 203 /Filter /FlateDecode >> stream xÚ½ Â0…Oé¸KßÀÞд¤v øvtrAPGAEÁA0–Gé#8:õÆÜòANȹß-LÇÎØp;ç"ã¢ËëœödJ åZ¾_V[êU¤glJÒ#‰IWc>NÒ½IŸsÒžçœ-¨0pu@ÜÜ€Ä_‹x vёÒZÕ°uú/¬{#õÒ¡^EÈAó^Uö‹ÌzÌÅN4° ¨E A2ò¢;Wa…Äé ¨°V4¥'VhLr endstream endobj 5444 0 obj << /Length 210 /Filter /FlateDecode >> stream xÚuÏ1jÃ0àg<þÅ7ˆÿ 4²‘ã1'…z(¤S‡$ MH×XGÓQ|„ŒJÝW\(TˆôúŸ 7uN3uúk‘i1Ó}.Gq%CËáf÷&u#öU])ö‰±ØæYϧƒØzµÐ\ìR×¹fi–Šè €éÆWà‚Op_ÝPIÓ!õ I@Ò*¤#f %×#ý¸~á,üK{ÇT#ç¼³¶,„ΰq`É(°nìYÜsLøâ¾Þ–ÇF^䃷V2 endstream endobj 5445 0 obj << /Length 203 /Filter /FlateDecode >> stream xÚåÐ=ªÂ@ðH˜Â\@ÈœÀMü BÀ0… •…X©¥ ¢­ÉÑö({Ë«ãî+¾¼b†ßü§˜aÖé8åž«|Äý>2ºPî³Ô~±?Ѥ$µá|@jáRRå’o×û‘Ôd5åŒÔŒ·§;*gX@l$Æu¯8lSyÕEÈžñn!Ñ­Á£X#xiTCÄÆ©F•þHjODO' 0¿ôvÒÊÝö§þ³B÷J#n Ò$"¡ˆù&š—´¦ݤ› endstream endobj 5446 0 obj << /Length 144 /Filter /FlateDecode >> stream xÚ36׳4R0P0a3…C®B.c˜ˆ ’HÎåròäÒW06âÒ÷Šré{ú*”•¦ré;8+ré»(D*Äryº(0ÿ`þðÿ‡üŸÿ?lìþÿ(¨gÿñà?óÏÿ6ügü  u@lÃøŸñþC{Ì ´÷ÿÿpÌåêÉÈÈöPê endstream endobj 5447 0 obj << /Length 207 /Filter /FlateDecode >> stream xÚ½½ ÂP F¿Ò¡¥Ð¼€ÞVn«“‚?`A'qRGE7Áúf}”>BÇÅšÞ‚Šè*3$|9º×î†ì³æV‡uÈQÄÛ€¤}®+ê5“Íž†1©%kŸÔTڤ⟎ç©á|Ä©1¯öר8Ux·èã”À*à%V7±38©“ÂÎ \Aî&°rOP ådeyÜ¿¡>Xý ?c\%éý#øë£æË'q¶(I£©fÔ‰µNšÄ´ ƒ…) endstream endobj 5448 0 obj << /Length 131 /Filter /FlateDecode >> stream xÚ3±Ð37U0P°bC33…C®B.c# ßÄI$çr9yré‡+qé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<] >00013Ëñÿ ÿAø9³ùà óÿúóCýÿÿÿa˜ËÕ“+ Ìt^@ endstream endobj 5449 0 obj << /Length 259 /Filter /FlateDecode >> stream xÚ]ÐÁJ…@ÆñOf!"·."ç åÚÍE0p»A.‚Zµˆ ¨vµ ôÑ|Á¥‹ËÎgH0?˜ñ?p´¬NÎNmn¹ÊÒ®×ö¹wYUºÏ¹å‹§7ÙÔâîìªw¥§âêkûùñõ"nssa q[{_ØüAê­…ÙÈB´aD4%;˜>Ú#îp¨§Ýà{%*eÌdl”鈧W”]èHÿ‹ùOË·ž¦…dfä 3Âױt¢KÒ‡óF¼oæû¼³MØfl=³oÂ,"†EÌ"pLΉ~WІh–Fš¥F³*Ö4×€& !Œ3ž´DWþËZnåÎvj endstream endobj 5450 0 obj << /Length 257 /Filter /FlateDecode >> stream xÚmÁJÄ0†'ô˜ƒyÅÎ h[éÖÞ ë ö ¸'âiõ(¨èÕöÑò(y„sÆ™ì$ä;dfþò·ýùåšjjéì‚Ú5u=5ø†mMrºþPÙ¿àfÄêžÚ«~Æj¼¥÷Ïg¬6wWÔ`µ¥‡†êG·*€‰`ˆß‹Z@y˜æÂÂ`5@éNŽ0Þ8FéÁ„ Ê ðÒxÖ‘õPºŒÁ fÆÄ¾ŠÍ¡HmVJ[ù\8ô¥ )ƒqYT‹‘Nà K†Jˆ¿8L3#Úÿ±Ä™g¾DïU”kñèÙ-¬Ä2¥¡gþBá8&%ÁÃ1DñÂëwø>³vq endstream endobj 5451 0 obj << /Length 238 /Filter /FlateDecode >> stream xڭбJÄ@à?ìÂ4y1󺉗‹[8O0… •…‚Z *Úš<Ú>Ê=BÊKÖD¸Òæ+f™™¶ö‡Ç+.yÅG\×Ü4üPÑ -½Knü÷Ëý­;r×¼ôäÎ¥L®»à·×÷GrëËS®Èmø¦âò–º ÁØ`#úÁ¦” ÌJT&e« 0m´ã?H‚M¦ÈF3âC‚ …P J°@¤#ßJ“ÿ2 ‹_â.N”^‘v2%5+w:ù‹gY9–º×Cbì)û@;ä@¯ùf,B‘M¥—B‘~2ÑYGWô îøeß endstream endobj 5455 0 obj << /Length 185 /Filter /FlateDecode >> stream xÚMÎ= Â@àR,LãvNànB¢ þ€)­,ÄJ--íDs4o¢GH™"8nÂW ïÍÀä¶?ÌÙr’ó`À™RËû„N”f>¶œg¿nw¤qAfÍiFfîs2Å‚/çëÌx9á„Ì”7 Û-SŽ(–§“·“êѪEšÎ§#ÀZ^JtÔhàŸF{pš FÄUK½ÑóžÐ%\ÙÞùÝü3q UA‡R•ˆš´¢/Û W endstream endobj 5456 0 obj << /Length 189 /Filter /FlateDecode >> stream xÚMÎ1nÂ@б\Xú Gð?»kǸ‹%p¤¸@"UŠˆ ()@¡‹bmÂ\.’åÏzEaéU3SL¡—eÁšMΫç%›LóÑÐ…²ÜÇš‹·Ww8Óº!õÍYNêÓ礚-ÿ^o'Rë݆ ©š ë=55#ê[$w,z¤w¤U‡‘CÜO|?Mì$í ÞƒàofÜ\‹‡X‘^ÄC0¶3UÊà-Ä%âbé#±þ }4ôEO·€[h endstream endobj 5457 0 obj << /Length 266 /Filter /FlateDecode >> stream xÚ342Ñ37S0P0bCCS ¶PH1ä*ä24° €@’ɹ\Nž\úá @ .}8—¾§¯BIQi*—¾S€³‚!—¾‹B´¡‚A,—§‹ÂxÀpÞÿÞÞTÞÞ9öÿÿIöÿ` Êc¨ÿÿ‰Ç±Êcã1@œãÕƒ …ñìÁ®ñäÁ4ŒÇ¶Æc»;l=ï‚LjŸ÷ì{²x?-,á %|¡‹+ ¸cóÎxGM¨é5-¡¤3Ô4ȶkÚe‡d 9ïØ#g8æ$…04àà!8Êå :¢Ä§ËÕ“+ é|0 endstream endobj 5458 0 obj << /Length 484 /Filter /FlateDecode >> stream xÚ…ÔÍjÜ0p ºø¬hvm($'Cš@öhO=”žšIHÏö£¹§¼†ß :ú`4ý4²ÖY‡vù¡Ñx,©Þ×g_ÍÞÔ{ó¥1©›½¹«õ“>¯ÑŒŽ¦‘Î?úò w?Íy­w7Ü¡w‡[óòü÷^ï.¿3h¾2¿0í·>\¥TA#þñSDÿÖ7š3f N*·¾ŸG03&õ…å¡3ÆŒ%XÒ€[-Gj§ìf°tLâ(9uÃxU„a¼xæÔ+¿¤EXÏÊ“…èa< ° Ì™³g¶f¨Þq D°Ýdµ"²\s>a±¦Û$0gö‰CâÙùJ†‰I0]"E¶qž§$„ÂÆÈž1{¢8º _[Énæ@*ïŸAÅír œ% ~Ž8Èr®LóŠ4O»$ùH™×¯³EÆw)‡f›ÞdZJ™§ ר TP:®íÂ*•¹L,óÄ,qùÀóx‹í&«è–|>'-T°ßdÜ8nÅñ”³ŠG0VG0–˜é– Dé ’|ÜÌÓ†¢J¾_ôæ$1E¯~ß ôÏæÛ/J35œP&$èd!ú,ÛH1U܇SØ«6܉™l¸Qî<úú èÿïï¶ endstream endobj 5459 0 obj << /Length 356 /Filter /FlateDecode >> stream xÚµ“±NÄ0 †Suˆ”%¿´UÜM‘ŽC¢L è&`dÁJ»ñZÝx¼7v¨0±“ö‚ÝDë«“Øþÿ(Ëê°>‚Žá ‚e 'K¸«Ô£ZÔ>YÂ"®Ü>¨U£ŠkXÔª8÷iU4ðüôr¯ŠÕå)TªXÃMåF5kBìEørÄψqJ{Âí´Ž82jtþÑøL6[GåaÛÑ&>GQâÀ8P*‘Q̸ÇŒ«åœ@츕I±ÿ-µÛ‹¡‘¡I9ÆcÆ«‹H‹YrTAâr ÈÎEñdm´§]ùιsGóí%e8ÚÝ„mŠÑIéÄ»?ÑîÃööÁ‹©[DºþsF]¾ã {CÚôa°Ìë6½$^½mçC—Þ#$£œùRœàcø±X:-qwH•%Û!Ã@B¨³F]©/À¾jé endstream endobj 5460 0 obj << /Length 305 /Filter /FlateDecode >> stream xÚÍ’±NÄ0 †Se¨ä¥P¿ôÊлN•ŽC¢L ˆ @07ÖGÉ#tÌPÕØN{¸+^ú9±ÿ4ñ¿+/¯pƒ^”¸­p[ãk PÕ¼¸ÁݼóòûŠG¬j(nyŠö¿>¿ß Øß_c ÅŸJÜ> stream xÚ’=NÄ0…¹ˆäÆGÈ\ò#ABeiY$R AE¶J ´ë=Ú%GH¹EäÁ3v¼ˆR„¥$Ÿ=ãycçuÍù%Tpg5´´WðR«wÕ6~±‚.FžßÔªWå#´*oý²*û;øüøzUåêþjU®á©†j£ú5!2œqÏ€ˆúæ\Œ î몛^=¨oaf+š endstream endobj 5462 0 obj << /Length 443 /Filter /FlateDecode >> stream xÚ½“½JÄ@Çw¹"°MÞàn_@sá<¼1pžà‚Vb¥–ŠvBâ›åQîR¦;ÎÇf7bD°p “_f?gþ“u~¸XÚ¹]Ú|¯ÖöxmrólV ŒÎmžù±û'³Ù™ìÆ®&» “í.íëËÛ£É6Wg67ÙÖÞæv~gv[«¼%-ùj¥ ‡¤9Ô @…Cˆ ~ã,pº¢Eœ@ƒåìU‚Ï :¯ç'ÐhŽ(œ´',9Z::¥%ÆNáfè¹²Ò‚NMq#]æ ÒKÂÄcõ¦ëÿÆ_o6Èb<ÍP)Œw¡f´X*IèëKè«.²’5ëÌzTmx>Ú”Õd7JÜgL]é;“"^7îJ9Ž7*è[º’:U•šÊYG9ýMƒÞº×UfóLs¾3׿.vÞ‘ endstream endobj 5463 0 obj << /Length 325 /Filter /FlateDecode >> stream xÚíÓ±JÄ@à„+Ûì#dŸÀ$Þ!¹*pž` A+ ±RK Eë|±_ä:Û”'„ü&3;;'Vr… /›ðÏì„,OŽs—»Åx-ç®8ÎÝ}ažLYŽ9ÝOîͪ6Ùµ+K“OÛ&«/ÜËóëƒÉV—§®0ÙÚÝ.¿5õÚE1v/àPF2UÚþ“ñët1ªFyZ„IhwiXmÑ c„Îfƒ6ÙR“²˜Õ6°i…œEä,"g9‹ÈYDÎ"6›@„™Í¨[b‚ð‚U¦ 4f£”ÿÁâvðƒRNå;à‰7på‘1àçÐGcëðƒêä÷›X)SôÊAh• °ÇÖs¦Œ¹ Ï­§¯Llö¹Vè…é>¡„‰’+ 7ž±’/ì„Tù§ió +Èú=ÍYm®ÌÏØ: endstream endobj 5464 0 obj << /Length 201 /Filter /FlateDecode >> stream xÚíÒ? ÂP ðH!‹GhNàkQZÿ€ÄI]mæQz„'v(ý|¯UÐMÁÑáã—’)a«ÙêŠ'm“ +aGÖ>ï8°½g[[¬¶ÜXÍ%h³›)«h"‡ýqê?ˆÏj( _¼%GC!š\M€1.Jk@b­©µabuÓ8³öäCŸj(ȅέ èÌŒýî5}x~÷–<­öoT "s¿4ÎŒ‘›V:TI¯æ_šýý@ù9Ë£ˆg|(4 endstream endobj 5465 0 obj << /Length 218 /Filter /FlateDecode >> stream xÚíÒ± Â0€á”…[ú½ÐäZœ UÁ‚N⤎Š®ÚGóQ|Ç¥±IEEP\¼åƒ þˆš*D…-l¶ IupA°†0ª¶ ‰øl¾‚$9Á090{é·›Ýd2ê"ìá”PÍ í¡¢õ|¨ó¦î ½úÆìÕ÷:¬ËzlÀƬ®õµ™Bè7½¾÷÷ ƒì7ÆYÝElú(ŸÝ›~ôÍÒ†’Ùä:srëÑÍmH'ïlÃÊý“ý˜ÖGž¹a/–\^ÎeVÇÐOa 0«   endstream endobj 5466 0 obj << /Length 220 /Filter /FlateDecode >> stream xÚíÓ½ Â0ð„ [ú½Ð6ƒÖN?À‚N⤎ŠN ¾˜à‹¾€àâ ž×3â âj w?.$dù»Ø•+cKÓ&5;˜Aêxc’>NFS¨çõ1uµy QÞÁÅ|9¨Þm O›8à;CÈ›¨ ]/ºñ¦Âýjµ–7Cq(¶â@lþþûKÛ/|pøf+Î>x%6tåz~Y?¬ ›£7W»'’4q ¶D; ÃFe†óq(ž>é›wÈíêm¹¼5·w(õ´æIZ¡•Cî‡o| endstream endobj 5470 0 obj << /Length1 3040 /Length2 21659 /Length3 0 /Length 23164 /Filter /FlateDecode >> stream xÚœwT]˶ep÷`ArpwwwwwîîîÜ <¸Kpww NÁ5}òî7¹¯ûÿîу1`ÏUKæš{UÕ†ŒHQ…NÈÔÞ(noçBÇDÏÈ ²3±·s¶·1r1ò²d¥Sš»Ú9@kLlðddª–.6ÀÿÎ žLèälioÇý·¿ˆÐÈd5r…©ºrFž&V73;7虑‰ëߎöNÜ9K #  @ÅÂÈÉO&bïàédiná øû@iB dd§E3Ó”,²@7K Ý?(Í,œ]ìŒlô6F=šÛYÚЛØÛRÑþo ™˜þJøÏªž j6 ý¥·w2ÿ?E²Ðý eÿ7ýdø«¥­ó¿]MœM馮Tôÿp“µ4Ú9M®v¦@'€Š”,À ô^6ÙAÎ  Ð $¥)ÀØð륉ƒèÕç`ä`aPZ¸¸8p30üŠ3ûµDïlFota I,fg*bok ´sq†gb˜Zš¸Œæ–vð ¿R©z‚82Lfa9#'K€#=##€ñ×ÏßOz )Lííl<»ËƒÄ0È«‹H©Óü7Sô·³°°½À›@ÇÄÁ`cäp²°|ÿ™TÑÈò¿H1þ”²3³ü›¼©«Ã¿pûkð”ÿ<*À?SÉÛ»€4Pþ~kºŒlŒ& _LÿÍýËášž_±ŽÁŸ ÿ=Fÿ­ý==ÿcäŒÑ¿Gç—ÏNϯz]PÿÛÜüòùEÈþŸöÒÿ÷þùÿÛ3ÿã>ù¿ïqW›M!åãÍŸà¿ð?çBÜÈÖÒÆó‹…ü§§ð/âÿ]"•?UÊÅÄJÈÎÜæo“¥³¸¥ÐTÑÒÅÄ`fdã üË®ö«K; ¢½³å¯ƒ´%ØÿcMÕÂÒÄÚèì ø¯% é±7µ´30³±ŒœœŒ<áA›™™ àͰeò=@µèíì]@!W_‚Nð¿v;€Aè—é/Ä`þ8 "¿'€Aô7â0ˆý8 â¿€Aâ7b0HþF,©ßˆÀ ý¸ÈüF .²¿ˆ‹Üoâ"ÿ¸(ü8A\#¥ßÄEù7qQù@\T#µßÄEý7qÑø@\4#­¿ˆ‹öoŠ3ú@õŒœM,-M,L\mÿ¶³2ÿ²»,­ËýËÙåw,¨¦ñoŠ062±vmU‹¿­L̬¿ÌN@ý;™m€f.˜ÙþËü×ý;+Ó_fk Ë?ü¹Xþ¶ÿG¨u“¿ˆ¢‰½ h®ÿnŒõ—ÅÖö·LŒ }Lÿ†, •Mímlþä ºv€¿“‚<€ÿ(ÊþkÝÑtäüÄ4ð6F¶d)dö; ÈÃÌÒí´¿–í]ÿ, r1ÿ]´nþë3ø§ ¨ßj³‚D´ðt°Úýá²YþAä­þ€ i°þ‚ôúÝ;H›_ûþ÷:HÝ?:Ý„ ¿K±rÙ΋ß"€JÛ¹ÚÿºÍÿ Ä’Ëþ7iPNû?¢˜˜@:ü^Õp0rÚýãý³2ý—õŸoŸÔh„ì¿OVˆ6®4Á²8þnòr:ÿëôû›9ë/£=èKÇØæ@õí™@íýNËö Ýþž äî ú„ù› HŸÿØ Û‡á7{ÐÌàbáüc&@Í»¸ÛÿÊáú{ØA5ÿu9›Ø;ý© è5ºýA »ÿ±Õ@I=þ€ ªž@ú^¿9ƒ2yþbð3ßÄÕ $¿Ë¿¾„@¿±™%èÖ=€&ð+‹ö&šæda±ñ%§‹_̉J‡I¥˜•`k‹”i÷Õ(Òáë¯.Zþ¬\ó¤áT°¡Y]ô•þÈR3WY¹K8S R~ ˾|~5»¶èeàµðn2ƒ`i…ð5ó9—âf.Ý/êiçŠ]]7&º k­Ðµ»‰‹ ² é ¼à[º©¹Ö1¡Pkå—Sc…6‚¸= º·Éïî25KL”DJ©JÀKIõP=ŒáRl8Š`±*hSëçgÆiÔ­'ˆé_À›2t°ß•ᧇ­"îChÚyVñ™ÈCÎÅÈ1Y=Ù©Å Ü>Îíi‚›ç‚Í_Âï–éšieš¨#•úfËU«¸J´ÏaÏóõ’an9 Åã4&ç=iUæ€1ÅS"*—ñ~—=Û=ŽÉâû«0•¨¾Ä]»f],¾Ö¬§D¿=i(a]Ãý(§ˆ»âú~û Ò"µÝH~#x<Êç{W™mjR˜Û¤Dw šLä°•²Ü;s0ëR£ Ú+Ý6ÿMŒ(_Áf1?çcýÌ3¿ G™+×±Tm)„F¯ì$@&¬òÏ$F3¢Rîï¾®¢leðëÎÑ™–DÁ­Æˆ±µÇyñ ‹NdzLvù»o˜¹/“{{ž"ÕÙ•°: 2®—ŸÌ ˜úÆ«¹Ý½Æ³û#Í×ù:©¼ëÅMj‡<)ö§ †Ô‹CWÓtMR’νcº°k:òic' ÔÞpÍîOÿˆ›è€FLÀ9Tôð+¶Ç&Ë¢ÍgSMáÒWæWYªö. Ž‰Ð -ˆõFγ÷¹ž©ÑãÝþéì¨SËIV_XµÅN‚äÁùùÓ­àV£¿Zö¼š{Óâ­£ÿi8[ÐQòâ°v:" uçGžVÙ@Kƒ…R<©Á~–—Wž¦ùcTz(ïPvÇóëè¶…%yùg™BŠ /!¼r’ÒfG¹é¾0Õ$ÑúÙ9´¡ š…ôqñnºÅ¹ùå3Ioùkøí¢tR‹øÛÉz¦GˆU}Ÿ,{_¹u#°;ÞVJƒÞ 'ýZ/G—”⊭pÜO2J‰sm¡–Ÿˆ¼ÞŠn¨;'2¡,ª—£‘³¬‡<¹‹4Þñ\¹œ $¿ŸÛ]ŠæÌ”c¯w“bX·ÿ,‹)YÔzÙ9'é‹_\{ú3—Ȳ¥ÚêthYÁ7ñ#úS·ˆ’iõ¡j2Õ4·,“`Ó¬YXT#âIgššû¨5:îÜ*jÖ7š‰åÀPa$ŠúÒn¤ûïrÚø°?jÄÐ̤/«Ü ÛzvàfÉŠ¤ó°D›qÅÖxÊT O*yïˆcõ$²<‡[Í» ½£oBØf¸Gуã?*—+q%kz«"ÈÁ¿ëÃ7ÄJÚüøÕëu)ÛW²1føñ“ñ&^òå\D/"(†w”“¬ÌÕu©—/´é‘ÝâÐã2ɚ͂£RÆ[¶x à"7=GÁÓîµj¡Ç8üæ$iŠã2Ó{$–t…ã>»MÇÐ×ÅÂFÖâm¯2§õþôÍ©¿q¯ó|.܅ް#[ C[¼£¾Ï†Š#MŸ…„2qÚÌyç,]¤E û;Ð>¢üÜà4 =\ü½ßySco—ry͆å"Ó+ýÜS˜¯XZoÍ¡”:ä¹øCs±+}ZȘB=†N¸Y•ôIÜ4¾~|Ÿè^Ïãͧ)±’eÅ}éƒJð›¸n¦dJDAwxÎÛMÈœ§ÓÑ·/#œÀJ­ ¹-ƒ =ºà›uXpBîW`«„êœØR7Ÿ,7ßK›Sò I>{ŒÃ,*Ÿ"ï-pÊl•¯>qó=7u‘maYÔÉ·DÄ+ÓUØpVv%…·ØqñI.CÏ®&z§±›û¡\×6.ÒCÖÈ‘FJwisÇ.¼­ØŽØ¤sÅl¬;dþʽØ×ÿ€Ð\ÔÅ7𱘱¯ö¹òÙ¥Ùå܇ÓÞL4,ösñ*xÇV€‚=Gê ‚éÛáÊË^’ùE0ØR¹’Xq;áU¹]½tN¬ô@9€RKì0F šÄø6ÍSξ<ÜR@Äx·Í¼âÏãl”Ý'h½xgÆséªA™¯q["gÙ™´k[àbTÆÚ¤ÂyÌQVË L}•®×‡FKýK…ø!'1fØÐ¯ñʇVÜn×·ßgC×*Ú¡ˆhz¹hÖ,*JL¤%Q4Ç̺RL¨°hU¯{ËžYƒ ‘E£F×~Ò&FÈ+8EÆïPh?ÐçÁÌcRèu¶âöñ _-–îò®¸t=v| ^ó»oÜý|Î+ÿÚjðyëk[Ðìp °‚_ypdé.†þ›*VΠJ˜Ô…ñ¶â¦×24aä-võj‹ö#eH•/=8,#nàIiœClò‰!®M³A:È?°•§/G¢èŸóó±1øæ²Q,œ¡ó!öµòÁ²by3U¦Ü²Áfé"ò­°\–øb§¯KÑ ܹǷöl‡èzcÈ yž‘’,.jôYX_¬zÓ·Mo{‚ê^ýuë×1tŒ‘qº,ߥ{Áç‰JSª^,ã…óÔ…¬•š áVÃOIµGQ©ê DnŒû6zø€ñ6åõ®Ù.‹ªFM!e·ú%YК‡[Ùx< :RpXÑbüsê•ûNÄ/lmBûŒ$±^¦y—ÞïÙZz¶ô(fÏœ/mö‚ÌpŒ”f¡¶Oû´XY~ºEeûXö¬7ÀÚcÓL-}8Ç~õþ1fÕJ€=àÉ—³(k/c¼±H]º"É”ì³.2¤þ‰“ÖïÁ– ®C”øÃŒ}&íÜû²¼ý“í‚ci®ññŠ''â!é VÅ7Àc¼Ì<: µ÷ýÙI¢°”IÆ?$Ø›¦µPé‹›F¨ÊhIÀXC2vŸB_I]ó´>Œá·38Ôrÿä4†æEØj,*[Š­@Éÿ™ü¦`“v‚Ú Uöâ‚$µ°ñGTÛl2;=˜ÆxժᄄL…Gñôm!³çW Ã+?Ìì4³Æ2¹Èðsj͹¨fMäÝ3ͪ§±x€Îb²[D‡‚t¸¶ÓãE§5´ê~nO  °Û¶˜RT’ <]Pñ@“ ©éë¾ÑY 1m·9b•ÏåˆBžõªbñc;ÂÕ:šhŠÏW­Îè&1„ ‹LÔ7±ÞŬðiw,%€^&¹\;Òm=”÷ªáx4òÁˆê|f”š}ø_6ŽQÆ/KãAlÔz¢ö(­Çª’†‹ß&~觻宆<¦¯Ãøâ»Ç”sÝG‡\Ãu˜Óò[‘7\¦‘²Jì³ô6>Rî=«Í¿:Š+4QûbÏn´pbî†}`P»á9ÈåiãCéRL— é­×GÝ$†æ=€!ê¢dÚV[F( „ØƒÚ ºLÄl³ÔÌ×î&•%?³;–è{‰MÐÒ’m3"pò=Ÿíѽdô.(íÏšéÜ5±ø"rÃf7ÂP†ŠÞö½JÇum–dß(¡»Í¦y—Óµ·ªö|׋]}¤>Ê„ŠV­8ü*Ø…Ôˆ¢Ãúè•A@éûPŒ=flÅüÊtálØrMæ4ð+.Ÿ—ÙqÑ‚Ú }ârþˆ^JØþ-GyİÄ+ŸË¥ÝÍ‘ºÊ{ÕÄˤicºÂE2•±œú és÷o»t2nÓÈuÆ÷[CUQ¼]ÆúT¡Û„Î^_BJó­¤2Š2O ªì‹ðEUæÇi£nÕkµI&3Êð÷¢­s #÷”)È?® +gzšš\LjcŠiy‚Äñ*êæjm—d2Ï^Ô·ð´ëƒÀCãÚ˜Ök0Ù6‚†¡%F±Õ„jhO”< ®zfÍ&è.õ³û<Ђ*t«K>ÕPré%‰•E:ï´ðëœ8`"$+©tü·ä“2ã&å-Zq ÄŠ¹€_eÕÑYúöS¥¿‹ÛÊøS=›çz±T%bOEvrî1A;\â8ã!8iø'cIæ7«Ä_2.ó ϰŽÍ¥J•¤>u6%aô¹ ¶~š¨0^wþèÈ‚)—•Ì=ŒnÄT\ÈhW3ùA.%yâ¨}_Òñv²—Z“ú3¢ÕOÑ/êÒY¡ñ·T,uôÃ’ËøÝ¸# {ï]޾ÞßèÚc’P¦¡àܸ4Ñ[ëaî»Y,XÖµåÎC[­-àUCSÆ J]Áj’âYZª¦¯Þê^˜– "œ²ª¹xí(5Ö&ÛD§ã³ /¾E¥(w¦™ü Ööó˜íSöß…èíõžþhdýðágøŽtÔˆ7ÝOp™ÃîJÿÍ5’a¨‹¤U´/¸ªÊ·3ù™4m_߸H^DÕrÓzu>IÒ¯I Œ}H»Ê´ùÖ±&/b|ú,5Wø£1»ýÃæ¹ ãyïí«Á2djþ¹Â•:ÙÀí¡ø!Y“¡Ú¾­t\ýiCg\Ë,A2 MJ«1¢z¿RKPG¨21Î\@«”!Œ¯ä ,nËìvb;bç=öúv›Ð7;rÁhWQí7ÇÐ^£Äµ»áWì·£÷"c”èG[Ùv˜Ã8¢IÏ6‹.Ÿ ^=gá¬öâ8ýÈHúrVo&üÒ%ÝØu·²¬˜—…ýÖ6ïCsÀ‚ƒße|7Ò0W‚¯,d—í…ЫŸ€­…AƒgèfI„=ÙÈ¥è#¶.1mmš*"Þtú¹²ÆÈ¬À¶{ýÞìÔ2›$q\yîô‰´£ERŸk<}ÌÉmùg<Ý£k»ÐÙpê•pë³i;m8‘Œ2Ô¨ÞÛý«Ugvœ &ߖמOB•Qê™ Etè3=ÐÒ~ë!/rÙ[?£Õ{”#<ø[¼Žlï Äú»çµ÷ÎKæËCá¦1û¼ì%l ø9lº„£WË7‘•Uæº=H5¢ó`2W?'ùš‘õt ó'M'B‚æÅ`¿ÇÚÑH`žd»;‹¸³Ç.‹Füá›»QÔ)ó¾òüŒÓ©È=XeVrIrH˜ô¢rX>NÊ“vv¯LÁ5õ„s¡¨Ý“ÖôÇexÓ¸µDŸÒL¬&Òö4™G^Y·¨ŒótÄ?‰ñ´îÃ?—âŠ)AÝîÀ“êpq ésÀÕîïm“ê•)–ÐIdK.z`]HOï®gð Õ_ ™M¥DëÂAxFøÔËgoÕGrô¢ä<4ù`ËÐ'§¨âó„̳˜7Õb\金ƒˆ¡Ûn¼›¤Ãå#»Ôt§<‡HøZ2¢4»¯f‡Q å¨ÔDÜh¡ÙIiNƒ7‹•ž¸ÃÊÐYyÀ--5,ðý!ÆCsn˜iºU×1¦l?%ñ-˜+¬Lw`Ðûf­¦Wœ6«¯ÏÅßÖ7%âE^9+™º”éW}ߪâ¯_¤X=:yÂT“÷¸~Ì(†7”è&ý¤ÚhÕ÷"вsß'šú*¼`²¹dVÉ´)Øú³ÝóŠ˜24´Ç—É¡×]Ò¯t.i( ¨rwê9Y(I/F/¦þ©œ‚o %*bET“’²Îf Åqû£¬ü%˜Ÿ./å¶OKY9ÿǦ$ZøUvußí×Çó¯]×?¨¨jÇÅfg0Q{ºøÏ…jŒŽÈJÏ'6;§WÄ)p [B«i•>úåÙŽmõe`µÈ’{p}0t¶K¼ægÀ û4£¨o•’/ßDvœt#Å-Š·>¢nòY4[Iµ}W¤Õg¿¹Ã¢ª?xGË¥¶Ç†{/9ÍXôrކbßñÒþÒå·R¯ÜR» 8|»#âQ&€šTBÆþy¬%Ufñóšt|Ú‰o!k+öêtìÝf=¥I`GÒFº)ü²]ÐÈjÂV•[eš¤c¤†;¨¼ù€ `ª0lÿ %ÅÛŸíhYåJkÄÓÝʹxȩͮ±Íaå?vÜ̆ ¹}åB-¡LH¤t™´“¹ðz¸Xˆw6›4½Bå©9¦4µR̼/A¤RΦl“@–ÆË”•©uûb§¸Ÿ#üóÑE)¢G³Û]­Xd±Ë-¥„Ÿ&7&΢Mð¢f¥Æ BÞù“‰-š©¯š˜ê¨ûP”]ú,ÍËWvŠ»óK­8ΟŸö±=ô^©œ>4&DÇÄ_ ¶²žhjß~€>¿êѨ ôš5ÚW6Fš¾ƒ³mpÍ*쯥:Ù“_‹7%6ìµ5|üÒO°*¿åÿ¢îó©]:ñsöIÍî–|Hª.1®§V¦­4‘—DÙe- ·uˆ{¾7© ÙbdÏûêàûf´„ù‰ÈÊs›˜Ïëù\ËJ÷ñ÷ JpÁ kÊÌ”±ûÔ•B´VP‘ÐkKwí,‚Rì aœoP y^TãÛ髤Ä>î9+Z 0ø=ˆ'“¡.ÆMi ŽPÚBç¬Wß³ž0~þpU»^:-á…üM‚¤õ²î›x\GÍ¢„½«ŒBèÄ».Û*$¢þfO|¨­AaŒÁB¿K+Z¸d6?UíeF8ÿ].qZÚœG²O’¹¤DôÍä²M7ƒ¥i¤vàgakï²ý’F4¿u浃åÙϼ 6©Te2bÚŠ‘¶Éñ1T\Ÿt÷ö´yK5ûþ’p"®¸ÓUTT^cX›Má)×-åTµìÁ´¾{®Cs@?ÒïÅùþ¡ß›æá!ÌŒ60C*jÛF/çnKÔ»†Jþs|d3&ŸáXãø9YGZ`P¹d^CEÑXÉjKŽû®1,Q¯÷¾™p½×Æ\- ÜÎ,ÝY9¢õžê§5Œ*¶ ÿóa2bw2ƒw cÔ¯ŒŸIL·F®$ÛŸÄÑô’Îì†{Òa›œ£+¥t†t—[H¾­‡žºp³ÿ°ù*ۆdžS§êà¢B¶¶%§ŠHeÃR¥<Ò¬Þ{ª0Ù$qrማ‡ŽGØX+scF¶#  ~GRûðz9U©6lõl©§Š-:Bô?œkžÄóÚL:[îù>’CµÆÎØL‡J…“Ÿâ¤~FÛ¾JOänåx΀«þÈŠ…©&âÅ"”qÃB°â]ÁZ®?FÆ1WÝ‚P“0Äü&·€žE}’Яzs 8 ¥_í´é–¦©Îñ({zgE8†a±>¼ÈÜšôf£‰ãÝ{ºcýb¤U@ç ›„z\‡é] 1§Äì'å#Ø¡fûå½'ˆåÁÑ#™…ˆ:– –,1s™ýP"ÁŸ¸7ŸúT£ðæ[ÕÀ‘Q£Å«ÀøFØËÑu>&¥`;§)ÍT(ªÖ†ÔºˆåX¡ t׿â'ðŸ/Év»=BŽÃp}x6DŸ•g ÈO:Qeɵɦ4àç>2Ì6¥p¥W*ɤâAC½p¼ØÐBÛ¯ˆcá}\¾›ÉºO1i[|79“‘²mòéXXvT±õ-w@@êµq5iRcŽ{qB‚ý!ý‚ôÍäÈXéÓ2©§/l;/ãg4åÛxíº„ð‚Õ&¶+ôXIjqwª3?ÕpȇRµtpò׋f{¾È/°-çæ,X%ìgTnÄÑw/y¾jqõ?æ•{ˆ©/9@]bí¥!¾… öãŠSM+¶ÿ9æ»ß‹® µ8fþÌ 6g(öÐ\g„Ê X.xOˆ/¦d²PŸsÒ!¨4ÅÖZ¤Ï1µ1þàW¥åMGMŠÝS”}³^©­u#ŠO²ä-IØ`&O×ÖzGúÕêvÔ“ÃS)ñáð$£Dƒ&½qßÖÚKü!JBîÉv’Z …Õ€SEñmBîBn€³«eO MbQ¡eÑÈÏOñãŸ/$]‹nßvßü´ò¤µž2y!¡ØHÎ{‹K§ßNxŒ:-.Ý&kÜ]úµè]—¯½«åE_Ù¼uuÜ,­”úÅØÖ’»Ÿ¾'ã÷+D8 hFd³h.6^~¡Ã0#ú™Pñ÷iCUÀÀ„:¡‰œ šFù(,˜ÙUª¤Ÿ&dVC}*°=Ûz¨äõ4YŸëç—`cÕ[ä%º|} ùÍªéæ¦¿ÄY›xWaM™82ê!ÎáïìDw/Ê ,û2ëïsÒ#zUzb_·8&{‡'áÒ^ ÄŒS_¿Ò!´#ós®³1ß9Ny‰Ê[»¥7·„/·.P>Bº£d´tCÈfÈH¦W,c™ð?¥êó*i.ä’u P!ž™{v ë#t¡f}[ ¾ÇûAL›ë4®rB@ËòŒüøÅXÒëh%â2«Rì ™²åé­Ç½šì©ÑJgOm…WU,O›gÛÞ=õ¼rñàøktË®ÜæË…Áª©Nõ–Zº]Âëü³×§,®¡ŒãQ½[­DÀûMº•»ã–0üÒ$u`bòê§6ã~櫲š!JÞz*;9rú7U`î¡SS>mRïw%(öÞ†¿Ïw àÍ1•(°ý±ëѬ1g˜¿ÒŸ‚õ£‘†jñ¤þ{ßeôZMüOrgf=ƒ-wÓ}2Hù£÷8¤í«Ÿô!çR.Žt³sz¬?J-¤TyÒâ«£B1(ˆ× &9eRûÌŒÕê#ó\à\!v§Tg@K˜HvsDãsG öà&iU«Ý=½î3>üoãUY®dl/?²SÅ=†X/ž¼]•xTõúm÷Ÿõ¡í9[ÁŒý;ÁETÏd«,ز¥ça=‰RÈ}¸“Qî×âóÁ16hᡈ2:9¶ÐÔ¢GÉ ›Ž¶âjps¨&ãȾÍrg;.VO»lÞñ¬ášÑöesWE[‰É,–´_µ%爛 V¬žè!fWy¥MùÌÚc ŽÞ=Áž`‰'Åß#Js×ÞMI¿]†Ïa|éĽê‘ýnv”ÑSPY%蟖KåŽuìÁÒF8ÜÕ©•ú̧5ó:ƹ2™IwEJ±™Ÿ—ÉœŸð¹Ê)%;Ø@ëqÝ¥iƒ%ÌÍßuä3ü¾<²=¾ ~ƒ>ô²™”ÌNa“Ò¤”a}#K,6 ·{<óî¦ Üµ^dºo¹·þkæÆ6w¨ƒ¾‡Ò‰[N'²ûÆ ‡bý¶€EÜ‚µbçZ‡´­kÍ)÷Óä3öÜDJN÷U•ܾ¸M¦•rÜï­,¤,ÞÈz¸Ço6¿=væŸ`X{“ ßßr>ŸCL¸Í‹:)ް)´b"­lèá·ÁvÎ à†E7vó!óóLÁDý!›ÐÃ@0,ý¾n“ ¢ôaG‡Ž …uÄ]ªF?ózŽmÇrÏÈâž%ܹižE¶LyÁ¿Rm)W½&ýµ? QˆÈ¼NµO‘ÉÊÁ}ïMÌÚCQ€o‰¢|¾X±`¹¨IÍùÐÄgêÆdA€X{ÇOAdÄ*â^Œã!(zÿ ï êAýøš9—6¡ë° >« ù  ;Ø(fü¤Ú·Pº‡œÓÁî5§aU,Š™Z}Ãdž›ã=Ìös×¹ …¨ˆCžgØÛY9–Zïi¾?­øú ÊPDɦé¿Cÿ¤E,Ÿ ùË5@¶( nýÆïú†MîÉ¥Qçð0ú;ÉîÉ'-,ðq_½rÝÿb¾ŒÛag4šý¹YSnqõKꥩ~ëÄt””bÑÑd„<¾·f_ÛÉ=é]o¦ù{¢d^àˆØHèCÇðïc‹-p3)¥"D•ö4„âË;7`âçËni®æx€-Ä8ÌÚ˜G½|¡ü΃ÝCÐgé:Uµ0œÆÌcg3¢}‡ *¼ Eàý€lm‰»ÄeÕÑg›èÂët\zzÅ*w ó”)¤¤àÌöM©ôÚZ,ùzø]g¯îd"‹@ŽÑ—^ü~‡Úç» ¦˜Ítç,vˆøoU:ºòœk¨'¯o<àø }‘Šˆw¸Ô„ö›x'È| Þ>ä #»¸¥†vØqà6gEÑSjOš<×ÔrX¨£½¬Ö=‘Éòá2_¡5Ão#£™LA*pªÒt½h}Ë’Á½š1°q or¾ÒÅF½µqôf‡¹8òùÑvûDÖ8LœÎòüÊ”„-Q5Ñ ž’tLi§kÞ]›V’Ä"..ó¶Ò=7ä£9ª=¦{?ú f0s” 7º0’3‰’FYÐ/žeÖþ/ï{Œ²˜n–œ·’dnÖýÒ‹W>Dh×58å[,µ\˜hv@“£|KŒX„ö‰Í~ü†Ê¹ŸÛàkˆs¯VCÜÓz@ Ý€ö³"Ö­ ëžlv=}šÛB•<£)˜]¨jk#–uýO>Û¶Zó¹…û‘]rç;\85‚l÷?gkI±žÊ«Uõ³Â*ñ ›½¬U¡Öë‰'ÕyçÊ(1ü‡ÎÍ6×Ä9Šøìá{ÙJrÿPîyÎZU¸òø`ÞïHp75Éáúœ¤=-BOél}~™.‡t”£þD²a&úð§µ~}±¼pè‹mR- ! µáV`ä^´ŽZ™=sƈ.âû(>zÛ0§ÅJ~ôÉ1×”ƒ€Ý÷Ð-[Q!1²p.ç¨üÑáøNF9¸dPÒœ‚]y溱¦Áq ÍÐîy’BŠc)½_ú‘ŠÌÙlY¨«RݿܣžŒ[ ÷ù½©åLIš¹^gh€Ìe'V!yr‚>¿ Dšº+E(.]”–ñ®ÅCv|2Vf+…9ÍA¯Ç³ão™TDÀðz?¸‹-?ä?VˆË÷U8GÜ›÷®äJèãúUoƒÒÁ6ÅÀ¹;îXšµõÒ¢4õ€ƒ-[2_|.º&€òí °XûÊùRðÛÛ ëaw¾àïa#Øaº,Ôº7x³\ÝÜ÷œŠ3Vâ'Á·üì3˯ù2oS’û!N‰ƒûq¸Ý£mDÊ.Z;j³´¯ëÂdÏç.6¤»ºÒ*ZZ<¹ÞäwLä]î¦|}N" qooÉ6ÿRÈ9Ÿ ï¥/§/6G¾¢æf¬`¶Àpú üú²°ÓNÓpÀ|qøís`[ݽ0¤/W’„¦…—²—oDE)‘™¬ù}k¾¶ß^מ¤Ç€uðÍɘìy399ùjû¸«¾ýŽˆáÒêÕo:ÔcßA+¢N[ßsДâèorÅB…*‘¼mA†(«|/@!=£\Jܹ#:ƒ½Ð±³ƒéòU%ì± [⛳åĹ¥Äù³ÉÅü= j+¡Nm›{õ;Áø'˜¬D¸>væ|`Û ,…¦pÒ¶ý;_ )þ/gI¼ZgjhF;¶C\Qjê(‡©â¬¾Ã¼í¤gB˜†a°/±)wÝk«úŠ Ã ñÄ »³‘·SGåÔħ½ÐX²9±q¶/Ä ,,ÜrZ-0_Êo"¡*:Ò th¾c8ÄÇ=i&óù) Ž^ÔÂ%ÕXN¾æ´™(L¦'Ÿ"¢¡vò•Hæ¸$!_v¤!=J|×ðR¹óãxÛVŠüÉi`áOì(5­ ÖɃ¯CÁÆë… eø…"'±†kA¼¨SF>kú}Ùns±èƒ69ö‰ÀrM·›5µÁ³f¿Ä§{_¼iBhµŠ™XÒp‹ñ7ívC¹Dà+teÑBsµöò*'q«¸Ù…ß*XÌ?¸ÄÙbÊÝ¡ž‰)ôMŸ*Í´6ìÈøÒê>0•1'ådŠZ·wõkP‡Š@Kϵ"Ï0î»lºßj«lŒ#÷[[n%ŠtS%Hòivc‚·ˆòži PG>çdŸEÅŽ¦aæ"¨ô³ø_|-AÌT÷Nc/äçÌØ¾n dL¶þÂHª¢úPNnv©i÷{&qž¢Q†Oz¾½Í“+8¹R£u®— Vf¿öö‰Yb¥ìK=ãhŠý6ÜñV—ݨf~’£ƒAž3Ä13‚¬†CãÆôÀ.œžFXS¿§G>|tV´ËœFåö"øš>ö7–Šehr¾cØ‚7é†Lý.Ä%\Ö™ÔŽVeBrã{½Å»ï[=äyÈPד?kÝ8ާUcœLƒyoZܳ-@Å@-ݶâÇ‘z¦7¢b¨ º|Æm‘H‚h«–Á„¶D?æ#†‡p`/;‡šˆ-—•c,f>yL¤™Bß±>?c0ÁĨUá±êCi¢·ÝW @Ųxw³v»¯F˜·™×¨.f͇pƒœ‚MF¦œ>à/Z6¬˜3™ÄFöêp½[L–Ñ„•2dá ¥·OVñY_"¦FÊLª|FuÜÚ)9·T±¼Êûsk”Røƒ¾”e†¢Y%Ký[Q¤=ªïs¯1.¤"Ñ‘ÛSôaж’Wñ—9ükûé¹4¤1nuO Ò>ŸC\‰¡1ÌQ2ìåxl²·ª Ï.~;âH,£÷¶ONVÔ˜{-óL.ê9“JØO@b¼'õÅÕUàÏ @øvmqnBŠY4Ôwg{åmÃ9¦™·˜ßL31oÉ"O-‚ËÞ;H­€¯U8drHtØròø³Tå³üˈu—Hv$ö¨ÙêrÛ žø®+(C.±Á†¬†³Èö‡šÞ?iǬˆë¾¿9l³3:P«fëz[ñ ç››cêЫ' eÍ;£#â Ç8›h¨æ}ky <Æ¥‡±ê™"à0Ú;¯½16ßlâ' ‡uà';Ä#l™õ§°ÐávéŒ0Û_&ŸÂ{ÆKÕÑ“i)^Ç’ Ì«& ¶¨ïÎîlË‹Ø(ÏÆ Ùšäæíóºßpu"9±Á¾Ï©Â÷ê)í7#|©j˜ nX–TÛ^°æœkIN×°*åMð2šÐuß!ãX,Œ/Ó^n2ñŸälá»^"Û´õ=  qÏJ«|~²©€šM’êd±+cϧ´×¬SDƒ[“Ôh°s)À·\7 )üj%äºÃœ9'!Ñ„Y+?$•ë$B[4kõÔ¿³Õ¬Ãµe±tÆ:%ÊÉš•2]QCB+Umt2Qéß°íª­Éjæ^tµ]U×Ë)òyƵáu»#00ÜÔQ¨÷sÜ>写Ò]„¨Á¨Aí'<„0 [¨œÏô‘ml8~â¤xŠÀtù'Öâæ}¼Šë)nøEóѤ#¬£°…Ñ7gi‹ âHU NÓdpíРňq ùS¢qŠê>×ôØÌ’u3â,Z·Œ•¿ÄYðsãç ákQSY^µ@›¤$N’.RÑ(˜L9g+¶kV‘`“j7 (ôžyY°G«Ép'=»¡ÿ%z1îæLœ´çDŽ£]ìŠ9É’†zçzª êÉò¡wüÇ-Öû°!JFž7¸½oé±Q´·lÇEpµ¼ªVðaîU\‚ ÄÙsBOÇ-¤Æ»%¼‚ÁB&Èo¯‚˜2ÁÆ`ñÎÂ`Ä^GL"IÈ`/pL¦RõÍL¾#=Àc*™!k~ðO  ˆ7ðvÆ*¼ÃmÑ[~ÕD%Vž«¹­zEmdïQ¼x>¾oâl2ר1MÎj:|·äÛþMÒ“ü]õù¤Ù·^Þï¦åÌç(7‡ÜVv*ÃØW»wrñÉ!7}Îl«îÔ=—ÏßÝú†~–À©o†œ=«%´þ°²"BM¡4$o ñ,…’mµ»” ä<.ù°K‚œ´Ø–ŠÙ$sçT)#>˜û躎ôúgç{O »‘JÞ´ 3Á,ÖhM¡9*ш—©ÎîBŸ#Šæ=V·­Y A¤o7!̶uw4¨Xw¾Ý$aÎOLÚÞfîe°w±îœW¼u‚Ú«„˜+Œ6ïaÕ3díýE˜×>ˆê5P™ç˜aLêKÜÁ¶æ¸ÚëuôÝ|ÓZwoÆýjÚl6É ‹¤ DtHy*žÌ9ÌÆÆÚTBG×(E>¤•)†Tëîˆyƒ1™3EâÇ"p†ã©À¤Å)ò‹´°µ' aØæªV«¯‰›dî¬Ñ}5Ѷ ¾8ÅT™Ú{˘.¬«GK ˆ³ ÌÃü™u™^!kó¹¥… ½ٹиÏén$Pv<ögë¾kk=ÈD¿ù=w6`ç-ö`EiŪ§E¦_.…8ΘQ“¹"W¶ˆ ¦›Ð ›àu|‡ŠæûeÊmKA” ë̉o.B)×;»Õ”¸îåÕ`yžîu:ôÓ×#…4]Ô–,â4ñÍéƒ~òe£_ŠCr‹±‰ì–4ØÔeñÞ ‰]I»] `6Õô%J3*½REžø‡b"¾V<:C—KØ^;SÈ(¨Pëˆw Ká;ƒ¾T`œÉ‹Ùðóο‘¡OÝÅ£žÉiö:+ë µÒð‹W0¬Ç’¯#yàâ/ŸÈÚ„¢g²§Í›‰ªhÇYÞ_Å| ]JT»ù鎊ÂÞŽÑë¼:6p÷R•„'ACûøB¦ç¬:‚gRô4˜æ¡3Œ§yvCŸ¦ qþN#“¦xkd—Êú²çž1ãG²w—JÙ”o]ýþPT¾ú¼æÍ¬˜%lñ‡Io”œž7¨;w­áÚÁ h×íÝ VT Õ¿øùp˜£šÆ…}öçÍAŸõ­§°²ÂvâÚò°Ê*,Pf“:›àèË}u&—ƒ#.uy ÆŒ€iwÕźxû-†GªñÕæXG¸ˆb¶ËÉ6¤Œ×ÙÀŒýþs&»ý~évá"3/ù‹p³ìPž%gï'˜žúø¢¢ÌÅ‘IÔèA6‹6W¦bEã cô(뺦ãòî?¨t©hØÔb)x±c¯§øÜì™×ïg#ŒÍªÅG=B˜…÷­}px8•O䨂¼2-õ›m´ç÷w½)9Wòcg ŽÄ?îG´%þ—#ÝO!î³|>8‘oíñ…v8¢3ã?ˆl=·~õÜ?hNÙ«mç<“¹IåWéXXÝÕÄ}í¢}ö‚»‚Ï1ÆœüòØ•ø(²©äH•KCûùs4²mE‹>Û´‘äGUÂâïìz¼lš=e;ç€!RÿʰCRÛÈES4;”ÔQº§íµ)¥ì¸ü$ª¯«WÇZÊa,¶£$·äa†ãmM¶&¢ãôÛã¡§à»Ñ©U§p.),…9׬‚÷&)ÌÉÒtu4M^oÐíI¼öîÍGpÄIç""2ó›'!§4ìX­mÁ t5¹éeC?^‚­~GϨþê껣ôy?Ñ’ÓŠ–úåˆ* Ï×|ÌÇAˆœUæ¨Ò]ù²Nd6q!åbQ Ÿµ¶¸øý1¶%òþ;ZTS¼ïâò¨\Wœs¤/±˜‰2KÚÛ>äx‘ÝYªO|¤"ƒ HéTäå!) ú]ó1Õpíîõ)\ì±>Ð:rD®B¢Æ„’•ß$yü°åË5«û1|u-3Åu FS§ôù ­Díý@g ôuw’Ë’žfN íÈù¹ÜV"·{qZµdE)ß·’Íÿñëªk-êþŒÌ­4“\~±ˆ¡eXo¬¯›Øã‡z)7Žíöø$CT5u!§‹ñ&scšTøÞy·ØéøÿÂÃìêÀwJƒ0;‡£ƒh¡BÖ%¨Y´¿ë æ™s{úùæ A·NžÁ(È›fY_ꢤŒFˆø$3oû«9[~öøhÞlï4ÎýÃ0ÝËRý2*otªüŽÉVŠØ$û´ó#åºx–S.¦(å†ÇÕiöcFL¿À÷c×€’R$˜nMð|C*¼áÖ÷Ü'KÓ#¸eÇrÆæ+_lV‹G!&ý4©T«mòÙLÜv½ü1Ô£ë’h»)J‡rÌåRd §l9Ñ®  q¢Ø¾#»e}Þ8oèp‚+†l¥ò»ÝþjµÅǃÛ_¤{c!mÚ’^è51`|¸TAèVÍëéù¢h×WUâ»A}J\°[»ã‰®E _1k:¾1ÌrtíG§¶öä·‡Ë8ݧ4#Žhã¨Ïò\›í>ëâÖ1®ï~!kìó²KÏ‹‚6EÐü›s@o=1yÖ™ÅÁ‰#ÐÚ´× e‡É«¤c  mœlGÐ(ó|ãhgk²z÷ŒQ¼‚”ëáo˜;á­³¤q†Š6žÅÆíGON"Êñ}P8lŠ·ºÄ®;ÒšDÌhøá¡~~D—Î_çN¿|ù[¯¬¡ï­EѦõ º{Ý(ÆL.s¢ï’*Qåá1MaJ4¼ëYWµŠ´¦3?_R³!ÇñA \HÍ/‘ ¸éVäj*÷[rlÜZ­¢èf?¾Ýä“ú}KÝÌv”ðÞÀqå7žou·:C8°}Ò™õ —y-¨µ¤KŸæìd™4%»µF Ó5ZX ;Õ/Ÿ4×ko…I7ÊóÚ\» œZŒÃ÷Åw¡h¸¹YYD1MŽ­Žè9Çå97¾ÆÎ «—Uʽ/.¹ºÇݲ;ÛBŒ¦’i\ðS·w³ìy%ž„Y˜¤½ã$ùÀl MrÙ(Aƒ&C¼mŸ[,ßgòÓü ~«»ATêçOˆCÄ|CŒ÷YE°”XÓÃN¦èæOèÒ¾0!Tt.Yå¾|¯,¦Ð̵u4)ÞáZµ@[燀_¯qèú‰çh14 •Íùd¾¸ÿÔüÓ“?¡žn"yªI…·˜üGIƒäµ­.[æÓL¦5Ò3v0ÄÜX8ÒÞ;{&+±ï‘h(¤c[À p˜HºÛ‚&W?²µŸ$åôòLÙù…C5`†_Òà'F›ºó¹mm?¾sµ8ð‰˜Ry+Ì$3‚3XOe¤Û–eŽ%"–ÅŠçW¿³5fÊÉÙY¹‰Ä7G*ã|Gnýæ¥T›§gF!K[6¯ËÑ"-É%Ç©wØVŸÓ>ä¦Vÿ)«ƒ6IÄySÊúßÿÅH3)5$à錡æbËû Hw@p¨žÔì[G»éR ÂØAeþe¯æFñb¸¼!ÝVöXN¼&Ôädù²h±!ñ¨FØ~ùþï–Ó*8’±e|2}ñ’dt2ŽÌs¡òGˆ§“¡¼ §íÛ…ko™üËÝùu3²ÍƒœþÛ¬ y„ï"î êÒ8¼‘Qqu›Í(²{bý¯e¦ú ]róHo)Mßâ%`©¨xãÄéÉÌ=&3!6òŽþÁY9¤ÿ˧dâ|GñÄ墡j‘Ä'ü½‹sü`÷eÉãžh–§¸ ÝuRÏ׆¨[T ù=2Áþ†Á?uîÜ ’û>Sw$•Â]á6UáèíAc Ì•áMFl›¾ºŠ_:>½ˆ.œÛ œtÜag|ԼʃüšÒWýi¸÷+×\©,2¾•½:‚üîÑð÷=ê6ñŒ‰ ¥%ôíMÖ·-¸Zæ<¸»psx«_ßCZ:­õ¤5˜%ÀûEcw6^±ÿ¯z…ç+”tP÷¶í·Ä¿€gdgÁyb¥Bmbΰ:eñí‚«väÁ1ÌMc´Ølºéƒ›ø^#ºÿ˜Q«ÎÝ(›—¿ú“¤ÆL8w©©j‰zϲÒ¾¯ú‚.˜½šÓÓslŸ-å‹ ÄÒ‚|u`Ò¼¥°½¿Ì‚CŒOQ-!è»$Üäc£-w¨‡?Fw¶““Ç’´˜„)2k!L€éKŸ9pCÅhîªQY_™†W÷¡µÐzDlتp¨›£RáŒJ¨(éŸÀÁÕ86ÂA™Éñ¶°Žlª4½Ñ Ù}‚*W¹ÚšS_ÑYe±\ÙK4oƒ'ñ¢ÝÚë#tiª²øibÛ@©=±„™éƒ7v#VþcÞMЬÃ0»'õ·2bc :gâr~§ç*Ðtâ@îÇõñm7õ2XÃÌÝܶ‰rz#ƒq€V:ž³» ÎÌ„êç̆è´àÎÞ*Ëh@0S9© “aȺs QEÝ÷“múÌ p—©ðÒÛš -ó—<™¹Žø¬~£èµÈÑBœrbtçnåâß’öñ13‚Ugª}’s†#=ì Õ›÷€ñ2ûn5Y ·I¼õ„f\µÉ9Kççñt‘Û³´ÂXЇM¸…·ÇÖ=#›² “[—÷mý]rèÜerôò|ŽËä)o±îuk½‘Бj8èÌÛcÄ›ë|‰~-ösÞ§7üU•þÊM5Áð¡¤;IuQüKšµ¾Œå·‰I/¹ÌLÁ7oYQÑE6ŽtAô<&ú#|ª˜žìÔ_©‡¤àö| k1§ˆX¿*.°ì¥5‘‘„Âðúð@‡ÿMtmõyNóÙË Ææ(Ž4µè”X¤oŽÖ(cÉ2bõ¶ªCÚĈÓ%s¼COv?o¯ÀÏç$®¸yn<¨(F¯¾Þ)Xû¹ =g§Eª²ŸÉK‘®ÿ¶¨2|0êÞK“*+[¦>òÅ|¤Ÿ«~Œ5;jù¾žaÝÀ—fÖƒoòÖ(›Ô‚cBhéxƒÊO©enKöiUÌy$mÏA~ÔC6a¢ôXÄ ô¿ãËîö§­ÛoŒ3-ä¶Û(z™X5FiéÉNÖ‘4j)ÆÔî²³›ñçI·#Ýf@~‚Écû:‚ÀráÐ~- {²øEh7“*>Ãþ·ê)£¨.½_V™HžTm@w[Ðì{2˜ûò.ž‘)úg„ö\ßó½Fμ*Ú0„³Q ýÝxœ:ÔKsÚĘa2»³Þòªh—cU˜Lêlpþ¼l‚ÙÇ ¾ª= K£l`ßÙY´ew¸ùÚ¯›RºÈôÞ¿&n±ÚB»¤Úš-(ótœµ'fxÔ´DÓƒ1 (YmD}í%Jå*Ùöâ¶ÀÉIèùò˜ža‘ômc›½ÕÜï§gûE.Ø@A©Éqxtyñ1_Ý}@£WŸÖ¯ÏgÂÀf1Í¿\“•KªŸÕ¾HKÕ2îxfªÃÊ}I`©Óƒù‚ÕKü]Ñøn`SX\~Þ²¹í°"ϹÜÈû°›CûŸx~bmQŽ-¼Úcâb‘ê·SVˆkÑææw ttKUÝ¼ç¼Ø¢KƹeýæÅR\gÞ,ZEñ)‘tü渡z2À#ìê8N-ýP쌀‡^챕øp¦« rDBha=ùªa~*;Ñùƒ=¸¯‘•GK½”L ÊÞ#¤õº×}_BHJ8i2˜QÔù —Ë`–t f"/@DWêÔ¿<9›u'÷s4}íâ?©hÒuÍõæp˜V ¨ÓVp1O:S žòû¬* cã[ìɃM(L–C’Fo™«ÚeE® ÓUñ¹é(ú§éHC‹¼p§ÚÜó,ÞviêÛ®2ô‰ÿò–ÁŒ—;·~….誱óyeÜxVnæ®­¦6 .*øå…%iøåãÇ·BUBïçÛ­S°÷œ!ùC®ÛþŒ7–€×6ÔM»x;3ÅÆÁÝd–ޱúºXʾä—:Q$ûñ©nZ*T˜It×!“‚TÐ$†Vé°ïQ¦×œ09ÃKZ-âE¦÷ÅzFêM™4@(»+YÉwÖ,À¼gµaøäFT^¡öjDBnßYCæþíw.˜Rù4ÆeŽ®âIÆO® ŠŸ­qôº@ãíœÂÃãÐÛÀ˜·‚˜¸1ê£uhnýâ •ë2Q‹è'Û¢Lˆh öœ-õ¦\#ð 4£cˆÇªy¼Mâ¿Q߈p½mãÁm¾4àÏúèc`=fXÔ,ò4¨÷±‹о;üx*VÊ_â??„¬ˆ¦îû#YŸÊ¬¦‡TeXPͼª·Ï[Ç\³wÞ¼‘*±£¢Q+§ËÌ4/FáB í¡mÛõèj*ˆMÂ(P^Ûôq»;ü&ç9 :2/¤­ùÔÎi- «<û8]@±œ çlü£Â·› {i¨ƒºá#‡W[àa‡B"°ÁÅZh¼Á§€å^c]YyÓÄ^œ|P4п‚÷„9zÅܦvŽï_3Ðq:ŒŒ´Á)#k9²/`º†ìNùõðQ0oŒOÖgcp=‹t>O×YìÖ!oû zBRFª¤™@µÜ^?ãËðÓ²I¢Ï²ã¦4AU–×qò•0Ð3a-Ú?Å ûYÝ…TþS H+²S8´2eÒ áœÙ™ܤ°×æ³¾Æßº…hý¯ ¡»4v uƒ¥ \ ¥}tòó{ì¶ÅOön•ý^“/̲LÄOž"­¤â¿(ù‡8ÆåÍÚäž'0.òno±î)œ0}ªüp3S\¼ècíØ¯C2ëRWn²2íA°÷£Qðµrÿ´ÓEõx½Öt)òÇ0³Éà:Àœ*€IHri†#é1×Õ„îtÛ²`[Ìñt Ú£&&i!Ê›¦jˬøçiö™=ª„s–Å%Àט#ÛE6&,ø.e†›ÉÀl³n›|2ÃbÊ¿azA8ñm˜†í´fE¯{jmŽ5¦÷å0åpsK·k¨r’q•Š0¸•kD7Ç[¦Z[Æ<Ïé¢LÁÙ¦á‚ãF½¬@oAUA5oô"àu\x ||…Ãúyê½Åq'x,IéÎy±¡oô˪Óp»æ+?pÝH‡î‰ÐU-Oñ‘ýÃ/3•è L?‡=÷*…,d†i¥ÅnW)fænY€1¦y“X™Ýµ8K"}ä¡î¿a¦ê?,Çp2‚Œú¶{ëîŒÝ”døJÁøÉ\.Rx[އ›S÷j(&­¢,Aá¬Õ_ÖEØíE- ›7»…p6­'oÛ’u»_]cMM[£°ÌÆþ¬DÚÏÏÙäÑ~àGóø`†n— ›;ä6x# ”ïØOb³¦4Ý‘“Ø=¿ú·žø~¾_|v)RBĺ·Œ÷;s;—Ö r|îãéZr7ÞGÕÄâ­åMî;Ì[ÀÒÍæU’L¡Å÷UÊìG2Ÿ¤6æû3´ÿIÑ·¯91·Žšï»wVÿs«ñ^u1SÒ2¨-ã`š«ÖØ(|“ú¬˃ò›eúæý¥•ÿãÇaì+tõV~»àÍP'¯r•–‘¿IßÌÄÇ Ëb;³ä DN™ -ÃÃO‹÷Ä$ÄËñ.Ï„Þ9Çò»šûa ó—l¢J5ƒšÄû&ú}œ$/Ý];4Á&cíG¿.ÞNPþX ñ Ó:`ùÇ_ùG·]]p¼1ñ°äDšÏx˜ˆÔYÐÚÚ¿Ñçã.¯ïÏá™gKm¯ ¥<Þå̇DT&üâ‡P¦j§¦9åçàV*=½ç!vúr)X±[il’ÇOAØÑY:ŸŒ‡¬˜{ÔkŸKìšß‹õ\Œ¥b¹¶É[øÎP@(1Õ„‰¶ý»©Š6Õ³QÁ]™§,£±s;ƒâøMiÓaÜßÒ ¥—*„˜”ŸÈ€jt€¿‡#ÃÖyT¶)€·n™ðFð ÿ6ÁoƒèŒÄl=}kI„¢žh#›¡‚;Krˆ-¬X&- ) ¾„ÓH7´+Š:“1[^)f»lÍeÙc ­G=ÐtgÏ}vo n÷îcjÙiú·ñÐ J78oÏnÄ[gE6:W2Ò4Ñ;éZœ83 Þò3lŠ·Ÿ¤&Är_I{¥wŠ˜SïñƒÝŠ>mÕ¥ì·'!”/üxênA[¸ŠævcÓ'þt§ë„{ÕH=·Ëº76ºc­_$oR'ó—=·ÙA¬ÆEïÁ¦7eÆ ÈÜ&Š:(ôfX}E@oO´xwbNù»ÅüÊôé´ÿˆ5ylöFà«SpKjÆš¦æëÙwà,ãåA› vTø³ÕØaªgG4«4"]W,ei|ô ‘®‡ñÚºXÅîHª‹^ø½îY ƒ*;Ò.¤Ü…©1 <´µäà;+‘Û…°!¶Góû§Qå²oÓÁ!Ð*æ‚`ån§ SYbOÍü4½60óíQÇ ÀXÓ_ßÔÞµQ0ó*¬fLl‰¶üÑ…“I32”"cAjÁ–Ö#gáîzC¡‰Àª²pAÖ‰"z$ xàÉ|VòBñcL£Ðئ!3.Gkl3 /'%ÃþêHù§.t¨tÌDDÉ÷ˆ K«t™,M÷y{ÛÐPñÍŽóeœ Qg‡ A‡ Ë {ê2•^4ä×ÐêdIfÇ9%_]„Rn’ÚûUšÖ:åZã¬ði–B³•Í_é`prÂt—~£°ÉR#~!ãJá9zd“”Œj±Îémx¶ó¦eY1TvsZük‹W²_#K©<™n(+É›zÙÑIs K÷M8æ¡:9äù‹z™­~øÐVJoðø,Vm?Dðµ oLû¥ä§å&‰ð¯ˆnˆ$¾3Œ),ÒWË&iä¾ÐwÒ°=gú6€í€‰‹\ê8P”`úÀn†;_ÛúÈÔ¸gݹ‚‘àHÎÂFhG\fŸÆOºr>6ßcÖË–Ï!ˆ*êI*µùïë‚Ñõö@~{ké hÞòOX òFõ:÷Y™ß|eÞϦ£Ý€‚¡"JΞ®;‰3Ò]b®û¬OÜ·A]kz@Í¡º1w—^/£õeEÓcòç­½pÏ#ðYµ×ñ>L{T#¬ºh ¾n×aD"°-ºÐ%Ì!²>dË`[ï8{ÊsrãÏæHN8]»Ä¥Cœ>q1wY æÉèÐg="m-Ô–^N¹5KâZ¢.ž@øYs‚ƾd›ÊÀ#wº8ÕéQI{¶Æ &[}¾­ÿìnÉ—¬p ÈtôÈ o‘·ö½t?CïQán¼À€<™0wOI'E9^6çlù$qìHr=rû ¨¾EÔ †;<َ•åësà Øu30¯Ü´œ'e÷UÙñ3.Õï$ŸéÓ¢uäpÔ†ŸígåDÂÙ„F¶Ín˜“+ŸiuÛà6!-Ä 2ÓŽì —“"-ŸŠÞÕv5ë(?ÙÂX=d•ÿ K±¾T\W´5Sß\1«Ux­œ> endstream endobj 5472 0 obj << /Length1 1397 /Length2 5973 /Length3 0 /Length 6926 /Filter /FlateDecode >> stream xÚwT“ë²6‚ ‘""€À¦“Ð¥÷Þ«J !@(IHB EÞ”Þ›t•ÞA”* JU*EŠ‚Ò‹ÀeŸsöùÿµî]Y+ygæ™öÎ3ßúÂÅnh"¨ä€´‡©#XA°H¨¢§§A Q!HÀÅe ǺÁþÖ¸Ìah ‰þ„ Áâuª,¨‡Dµ=Ý€`Q XB,) E@ Û‘hi *Ä îÔj#0 €K‰òEܱø<^úñkêóùÅn °‰Å»ñ=‘hÀÏAƒ¥€Âø™`!?Õ€„†z¢ÑøÜ¿8Ïû·ükËa005‰„Ê„ºÔ†¶U+1y ® Ëo§Ý.²!Åö¨Ú.&šädOëc[ìûMWÄ÷èÿÊûäþ(d)Ö**M?“CG¶ýè]EµÐ7Ð?CÝÍò2&XÛëÁÊ7Îp,µšL?³ªØ•*ó™‚k?òJ½63iüì5®+n:ô<›çM=ªÕßq^ÞÙ´fçIî”t¶KvŒÁ³P£fh•ÓÑù…«Ñs#؈šúä“1æ]pÍWsŸX\µ#Ât|§Ç»F~xê¤iY¾í åÐK”;/_þÐÀõ"ÎË1œ°õ¯êTêe5~ºlÞÇ‚^N·œ™ž°q K©tç6Sù’™Û¡­Aw¨EE)¼àé•fׄ>÷])¾{à‡;/ØmoWæžö¨ŠAÄÑÄâêfü3‹Ÿlƒ…_×C3jbUpÞî‹þU>‹Öº}îȆ\›»ø×…÷Ôc‘Ò@¶Ü'Ñ¡qôB­Q—º#÷YË ãÊôóŸìÓ½éE¶ˆ¼Ê‚cO6qg›„™@}ªGüÔð†Œùh‡“D_A9¡ü”ÀÅwùÖ4ƒ m1w%ÐЙ±hãd m¿_;]ë2ÍmêÅ0¸çÊ[½äeEJçÁëyR< 5êYO|Û¦´°×’Ã;VÃ4þõj[™\0©Ðí'Ÿ³7÷D˜w³å®±Y¶Û²]Ø_ mo|Sf6/š?é}0x¥qÇ‚ƒí+árcNÖ«ÈÎ:òž:Æ 74¹ˆkÛAd§Å;Vÿyئü¾jÀþ7Ò9 =wS®µ}­¯»Ü« q*»FÒ¶ooÉÖ~ ñ·kwŽ+µ¿ÏûÒûnÈ6Ô’ä’ü­ö¤ï‘àzº3ƒISX7ñýÔ¹àè†ã¤ r:i èarÙ¯ï®!Œw:Xlã`ŠUu|„8ÿÔ„ ¸PÓí!Þ‡}YÊá&ç1¢o=rͰ‰µOÌü†l!…†‰Ù*“,m\'¦™9í>oóLS]¢übÑP+2€Bf«žf?‹"j÷‘p|¯YwbÉfmªvðÒ%Ó¸?:P˜ÿ”|y™n˜™N5ë&µŒ»3“ˆªÝËËÊÑd7?œ vhdo ’q+(4-¦œ—X:ñ¢½ÕyÄ73)Ã{{ãÊØ*…+ðf‘ÑØ¼w<Ä£×^b§uÒ2¬CŦ{7q˜ ¹áØÒ(ûÍEçÇÃ1N×f·ƒ9.Û=wNkªŒÛK‚Ý!ù+7]!ºƒ÷gŽÓMß‚ýÞ_g¤EäG=œÈUŸö³7}1ÔæHþék~…_”îè&wdg'`àNÎí¥’…“í†yy…àëÓËõ¦ùú‘[ÆÞ™c‹Ò€Ö,XË6@x‡,ªu…ù%=ïé׿k¡ùØÕé;!­’A;ØÐÇ“€NšÕ‘dÞêp©Ë&ÆcwR|oÒÈfcêE\R lÚCZ©¸:¯>2Ëi [ð“Î/¯z¢âŽœ_ s•š&úŠ·jÉ7E˜ÑžÃµn¢ ÜáîˆÍ‚bGƒ)ê*\T†¹6X¹§E‰vzÊÚ··•h„£Bº¾j ìÉÿxýÃ9"WÄÇ|½ùõà‰oQÐÔ-ÔuÎ ³afHIPmPޏ‘È=Qiúœ&¦~Ù»#~࣠¨¹C5‘-Zã( æ2ûT3\Ä ‡,ˆí^Èm³¼Ag<÷òýXålÃ÷RSgªÆßjïÃÝ(ïë Œz›…¢| ÝÑ^âBO‹o—ܬÎ〴ÕS_ƒÝ]Ï ˆ'’x" Ú²5¯¦~{åãp©Dgà`hÇU91²÷ÜmKÞ;qîΆì'Í»qÕ½—}¼h^\ZVäÌâȲ§eçiÀ¹ªÛceêú®­»5w縒/ë3ˆUŒ‘ˆgìÍ×Í\¸(ñeÙ9F=­©%ã)ù,3\mDaƪ‚²_{£(sÔ¥Bp¶Î­nÉ(øv\¢0L‡&ˆþšÞÖj»Wv…zÔÑ€ÔbîáRY^™ç1hö0!ÎU8±’»J|ÿêëѲㆉdÁ5‚óºwÍï=µÿ"v'×rä9äB'¯6îZTË~§§S7¾½ñèq_‚YZõAÖP/ÂíÄT“¹1zî›Õ 3ëí½ø Sº<“ eö·fVYg,¯2áZ‚gõ+¹S“5&ÌÀŠ áB· eúF´.m¼UÇ%s–´™}Ö!$r{ï(áã±ÏBæ ¨õ¨y ©)\ÇÇuòÑ>Å5©êÇÝ_¤Ï»F—Ê­4ŸÂZ“éDV¾ ¼ˆ› ­¹æk´XIøÙú™\!aù–t¸™!Çôš š´÷ŽZ|³–Ž r„z4t¢c¼\mߟTR%y<­l4à!î°¼ÇËÀš»©ÝÐäeFÄ7°‰Þ7¥·× –w¥ùB(gä]`p.I'þ#ò“tÊ{3[:]C…„†¾›ú*•«&zðí Šiù”kÔ½o#W®®|å{ïrË¢+GuCj-†sgÌ'—½I=z~`(ºùœq}Z7IÆö>ÀÁ(U[‹³±5µën?Ïz:wcµë‡…Ú–ô‰Ž“TD·RŸIÔ}ºi >) ô’?ß|Âl"@¬~¤BJ¾;©4Þ3ïëÆó`I÷RË[ìó|6¢m³xš­/kd ÏÜGùèNãMioÇTk!,¶0pœN|KY­¹ŽZ¥¿Ñ$aå µÂ½¢c Us1'öËG킇BLkRÌuÏFÅ}-tüqA£»Kißü§±WŠ\”ÖÃÌå*qS¢Ó¦“Úm«–µí ç¢vg^ùç(:Ä쪞¹ÅÓ¬¡Ï×ï b×2Ò׫+jEp9ßB‹ "²&Xpƒ[÷¬ÝsûÌÕh‚¼V­Mº[Þœ{»ã¶0*µk&XŠb3¨ø—7*‹Š1=âT}>ºªo:”Ò£ïŸõè—°¼3&êÆ|ÍvìõYQåI}0„ȯžÌþŸ‰{úväI,†¢kª-.äÓ‰zŽ´šˆuWÍò‰ QùYÓ—ýkk!eÁ¸©+ЕĔ £œÅÊOÉu …£ã?K7+Óí'çÞsi0厃=%@Ö»`@â^ŠfkO XÞ|)Ïú7åÚ3Aj×¶ç-¹½©®Å‹{§ÏuX+Ýcfçl‹”þZ}ßy¯u¬“†T€ÓFæ>®jITׇ üVù-ŠœäÎL’Ò™”»njÿsöe‡v}ŽåŒ@z’‘IJvÔ|ÛAÚf’kAIúïòªvÏûËu®lIPu*ÍŽ÷ÙÙ-·»H “Þ$¸W÷(èâܬ„‹ïD‚ÉêÃn£òêbÒt‚ìÀÆŠa,'ŠÈ¥"¨³wÝ» Æ/›ƒWi?Ïmú1|aVÜ3ø ³v·5Ç%, `õ «©²qe{à˜5C º¸|>@æ‡u/]Í *—}\ÅÔ¾ñöÌÿ•_´:Âíô°0’§”nú¾ i:ÿÖæfæ©{Íç(N ÷w*H)e=§ÚÓDuÍ8wÞù›sE¢ÄåØyãx–'ˆËÇ•ýL%C:èöúgÛaÁ箺#ŠŸ¿–¿¢Ôë¶yæüaƒ×µ*«N&e?–p¤ˆ±¹yä£q!”NJ¹Iopžy/fË¥jIÖt¦í…'d;„Ñøcõ Æ1¹¾°èƒ•{ÔŒ¬á_½O1´:9è¥ÚF„ývŒ€J¥ÇnwøÙë›Z…Y½ãé—Ñ/¬>6¾zðúâÓ©1 i畸؊v¸‰Røòv¼²*ÛqBeøIÍ“É âTøø®+IAÈp¿R>Ï”µÞ2Ã{jJ2*Úƒ™x›àŠ‘ ƒ”·Ù·ï|å˜÷Êlpâj±Á 8ÎóƒÐ¯s AW“hÔ£JßKÑò°‘vÄÚo’Î]cÚZ†4Ԝǹ×n„„ ¯/T2Ù¥ä,)ÞŽaOGZ)ê&ALÓ¬±ä_(qU1ò½<4“ Ta\ KB>7µÿ4Û!¾\ÕÔñã…Hr»ü³/:>¢]Å ¯m±¥,YëñïüG,ÞsE‚ ‡äVÕ«Z“…¶ElÐuÅÒy<,šòå°µiáٺq™ªÃ}[d¯ ~oÐ[TÆaì0öñ¹±Sg]˜fEZÛ$L›0aZî’zdG(¥A¢Ú«gin[1sÎVvö— ¬RE™Mœ“(Ñv‚ÍOwÍ—{„7ðÚå£O•È+’̤zûzñ|(ÌUæc µâ7×R{E„ÿîŒqB,"71JÄ÷mx]èTcëó5õ:æ¦!·žI1.Ææ¦ Ô¤Û½rrGèÔ 4äIy]å]rZûëQ¥Ú}vß^'ßá5öÙžK\'êö!šv.»EÚªªÉ°‘7ê'„6¾l¡Ó.¾ºÞ¼\,íq™®·ßÙWg¶þ\]FöîEÞ»°]þ;ÏšæÉÆ©¯ï™ £;ÎJت¶•ºí7Úú ëO—ÝʹÜp{ LH æs’ª¡Š¾˜ŽUãìΪ‚Ú­ïÆˆÑÃŽE×[³y{‰Š&ù'þÚä¼{šV—™Hh’G½ÌTeyƒS·­‹²ÎжRžK,ÿ4·®ñ®úe1AS¦)çš–ÞÁ¢o A¦˜°‹uSÇ­<9; Æ^bBâ,Åõa)×VxÁ‰¬ýqJv^Ë%ÀR}$?«ŒEÖe÷ï㤨$MÐ(îðZÎ(×ýå7ŠK¤ %é1½ ÈW©7io ÔÂüOÓ÷ì«>±f_ÅêFHÔ€Ò"ýߎm´°òÎ{¼[¡ROÁ’¥äÊùÔ·öÇLS|(±]í‘»H¢:ãO«5¸½®0DÿØŠ|Ñ׆R@ÎÇ6öå33âç:çKF¸(O/I)„)„~^Q%~GÀlùpÏW5yªãŠ»E‰í­DûÈEª¿7/µ–ÝeEñ‡ôb^ i瘢8Dû•¹W}_|¥û4ö@˜„$Œ°3)|ð;ÂHîCž²»Ï?DÇ'Ù¸­ùÖöÈHvì…1j 1½T÷ÑuB<Íáæ$UóaMˆƒ«JrÅÃ×xT¶uч\nO0Û+òò·´Õw[¶pÐŒñ½ª·‚¼pÂïîæ“ó<庙©KN1O.£‡å„k(;¸Áê¦jÖßÛDÏ—šp1së5ûÆÞU)J&³?^j.‰ã'Sò¾¡S8|d®HÈ&+T“Xfq³@GÈ’ˆé Ø2Z›Ffþ•îUÅrª`ä pY{—[´˜|ÿ%yº¿`5T—êrè^½éeê¼-\`?55aö“î c¸äxq…ÿ½ÎÁ<åØšùèŽ ¹fR>î¡`SÉgR÷#âo¥.ôv¸¥¼’b»ÑÈVÛó¢ÙYû´©äe>sKÜ…ý œ?6–I:š¢é¹5mW׿ÁÈš·z”÷G“³ñ±=RgÙI,ëúXwL}‡é/žyVçPND¥v?ét€»‹öÁ’ÞÒ¢£ûº-B  úYÁ‰¥i;•«$=`¦™Et¥²öÅä(¶¶in´kja`Î<úMLÈÀ‡Ó'Ñç3õ÷‡Gwšòˤt4hm·@uìÁ“È=\‰EÈ·¡A¸t‰EÿÎå4º¶Ž“¦—½??ÁxD˜–·;?@Ooìè&qK[ÜînËH.9=-jÐuŠ Ô¹’E¡x*:aµe¢/-õ¸î/§Ëë%ó¤f s¼ËãÆö\#§ÓÈØ¦ ô5ùh Š¥î¾@Þt2ƒDÀ³'}w¼Åßs .ú»f”ñÀ8…éç´Ÿµk7/$±öí¿Ìeéí#o9£FL×¹ºwV. çóÈó Ÿ–}étn[Ûnõ×÷|igdXx8ù€×îû“4#£¾ÆužWÅ’ÄéSêlJCæBÐêÍW!#YHÅ5øìÞ«ë•Q,tO 9-=Ü@u:NÏ"ˆÎ ÚÅ{Á”åE- _uº7i,u¾ÍdõÊœ]Š1DH¬³[l.†ãOÔn4öjµlK œj™¾äŒˆ;öÍšŠØJº¤™Š‚·¬^˜Cs­éݸ?Î?Vïš•nyEeP´Îy«?š”]UºŒ †š Œ‹—ð -„~)KÏ'鬿ÃV7íDù• ߉tÄ$h[ÄZÒ‡çK«мÒPªYè²—8K.fÐ^vÿaµ®Q8h›ï¨QçkÊ{þ&Ey˜à4ò騣µs†JÊË©{ƒÜ¨¶{G¬Œùopzu!SU‹3¦ÂçIÏ}ƒ7ò× l‘W?«ê#Ðk|ÛC•¸üJ磩#Ë`î’îˆÎ‹ÕñB•1G,³ïŠ#nvoö¹%›ûˆî›æ<½zÀ¥kc$±7ÁÕË"¥ã'L^ Co½ý …ô&Ncn¨0B*²¸ßÀÞÖFx]Ñ÷óÛäš´Œ]ÊLçÏk¡B*2Ogê>¬TdC}Åò*å¥î\ñllÈËU$Cî3•w—mÐ.“KyŸ…½+òek6[”Žß5|¶pD1Ð)2Ï8t0s'Çà2gñV"7©7T=Ÿ~Iù.;%F\®Qzwb)&Q¥XºŽVP.¸/ºûˆƒ’è¬ÈüÖqæÖ¤þÖ…½¥Çà cFÅÂ`Š{o7{äiÃ.í²„A¹Ì‰8¦€“­y>`(ŒÔ›uÆ|ßÉc'ïY?ÜxŠl`W7==}G}×,̃3NàDƒˆ–¾œ_2¬+¦p"nºR5’­äh°äCç#XÒ›UÞzð8¼”€|s/TÖnÐГäE®> stream xÚxTSÛº5Ò¤#H7 ½& ½wÞAjHB‚$t^¥7éJé]©Ò¤(]zQA^ôxî½çþÿìõ}ókk͹÷ád30T‚¢`ê($F$”¨è[‚€ PT!áä4c°¿í$œf04…”þ„Š ŒÁÚTÁ,P…ÜóD@¢¸4HBˆRQÒU° ÐÜC!ahN”»¯ÜɃ­ó÷%€ IIIü(¹Á<à0  Æ8Ãܰ!`ÀÃ0¾ÿHÁ#ëŒÁ¸K {{{ ÝÐB('y^€7ã 0‚¡a^0(à×È=°ìÏhB$œg8ú/‡1Êã ö€°C¢±!žH(Ì€­0ÖÒè»Ãuþþl$úWº?Ñ¿Á‘¿ƒÁÊÍŒô…#Žp  ¯®#„ñÁÀHè/ FaãÁ^`8ì€ün PW2€±þ™ ñ€»cÐBh8â׌¿Ò`·Y UA¹¹Á4ɯþTá0vß}…ÿ®+åôÿ{åGBõt6EÂx´Tÿ`°&’Ûœ`€PJ\\ €=À| ο ˜øºÃ~;›±3ú»£ÜŽØ1`pGö‡Ä ö‚0ž°@ÿÿtüsE pàs‚#Iþk†9þµÆž¿Ü`ÄÒþúüëÊË0( ‰ðý7ü÷ ›ªiÝ·4çÿ3ò¿œÊÊ(€¿ ˆ@PJ@â 1@à?ó€áúøX-¤# õW»Ø}ú»e¯?àù#^À?sé¡°Ì…xþMtk ‚ýýŸéþ;äÿÇò_YþW¢ÿwGêžÄo?Ï_€ÿÇvƒ#|ÿ °ÌõÄ`U ‹ÂjùßPsØ_ÒÕ…AážnÿíÕ€±jPB:a-º+¼û—ŽV‡ûÀ p Äù/Öüe7ý¥7 3@¡á¿î0Ø( ð¿|X‘A\±w4–š¿]0¬†þYW AA‰MDLöðû’`Ï»øƒ°ª„Â|~“ ,„Da°!ìŒG”ɯƒƒÑØ™áhWì98ÿr’ü£ÄÓë¶ßLÀVÿ{ý[Ú0˜ B2?‹‚È„»¼ï8¯UbòüæPæ¬âœgîÕˆ" zñéXõ]ï¯t§Q¥eg–:¸ Mq„ÃDm¿LПÛÇg'ƒDlÒå’ƒŸž*‹ XÝGÍ.dÓ4Œœ4Zxzl.Ëž#w„NžöÃ+-n§"7Z^w ÷Dí£8¾²ÐN…$Ytfo÷m%7k‰¾¥2ãSÇÔi¿CuÛñ&æ'Näã´wiÈÜW”š›`O4¥(4¡zg¢³Ž“©Gl)¡ð†ô {x1¢²)Q¬MåãmŒ©ÕX§ã¸…È£çcÓñ7RÕ™ÌݵwÛF½=÷”UÔÜsR¢«ÕºÁ\Rþø¤ÑfAªd'’Ôdà‰ÆP‘Y¤޳cÉBA{®hÛŠãQK,Uýw ÷ýÓ^æ4muÌÂ÷ý gxÅ¡ê’?¼ D?|¶Ðí«„ê®ûúp{ÝÆü“j¨n+A´åݥңȪ"ËÄ™7Ejû:—"«v"­7ª[ËQšéþ$ [>S 7‡¶¸»;<ÚQdç§ßÍõn³e«¥–ìfµ&NãÿàJ[ÍDÜV¿¢³Ò¡Â5r=gUÏw8(©äB©œÛJŠß÷ð…3{9Î ÂøÇésu·woמ!˜!|‹Ñì_«mƒŒª¾ØT¸E®Q¾…—†kWèM%°i݈{1ýâÇ:ý‰ÕO;Ì´¹LV÷›ƒÌAOEž;¾7¥4Ó7LŸäú¬žœ‚E?«—!ðÒ»Ž$}𫘟MaR4Í•ÊzªWdêÙÌ'~’©´ ß 3CÕ?~ïÕ–¿“¢ÐSŸv[&-·Nn䃼@øÀjie—5{å·¦ôì[“F»×½ŒTÒçŠñs UIȧíòéFr):]©éâëJZ綸õYÞóÙ4%P­!M?WÈ™h˜Ï$ÖØ¡ãaS­zGí±òQ4cé×QËšŽÂ]á¯W‰ãV…­?æX[t8õ ·³4Ã"S©e ¸î=yä•<#0ÀÑÀîlZª«p\¿­°œêÎ7.áEþî–Ü{:pUƒ"Uñ™^Š˜í¾hzŒÉçzIǶH£¯aITX«>oxYPbúË'yq¸é³ï)F~OiŽŽ7ý£&l©T?Ë®ùge­(§lÍ~90ŸqäV9ò]\©µ|>ý\ÑÂ*™Z‡d”xÀÆðåšvôÅ]W}¹[»?+gM)e Pjo}qÅ}›ÅG.AôÏj`çì{óØÜÆ´5ª=ÔöG3WÜç£C*IDzâZ3º•+<ü•pÒÊŠ-o6›Éç¾`0ÙîrÕ×ù‰úeºNcöB™Äô O[ã%±Ã,qe9ª÷E^È÷Y&«DÕY‰uãì“gå46£‚AþÑ“CŠÓü˜³áä×.Ë!à1wäÐûÕ†éO3þdzå¡8{Μèo›ûùœÖwËzÏèB×>W™-¬ †uƒË³mŽ7fHqw0…ˆÔLgJñä+ýh¯»R£Í7õRIÆ[<ƒ]6C÷3âWILg­âg¯dŠëïglt¬yͱJ¹’úR%Ð5j¦øºË0ª½[¤º0ì‚r'¤÷Âmª>æ8øi¨(°s†À>{³mÔeŒŠÇlp|in•¾ê|Ë;Ô™ vgn£Ê]Õû¹›I°µ‰ôµŽ0S?€ó !0j¾›)nîÃ-R·‘ˆšûŒ}E:ä’ã/çã!#G㨛ó¸U±9:šÅoÛ´?5åófž>Èç÷bé›Þ?Ú^\s„ÆN÷MÜ¥½ b=!ÚŒà’‰û8w¼nâ´c\6ôŒªð±Î‚Ÿ†'Ì2,¢ïÌUϼÑòå®úœì†r`}Ʀkýû^Â%£]ž…™q[‘9NJ ®ÒÅåŽ[x;NÜÅ&"À- 5ýz§ü.ƒáç6ÚêðBß<š€ÔįÛÔ{ü“ž°ö¥©5BÞ¾˜ÇKÑØ~'\}ÊB·™‹À»Ð„eGΨ4lzé}]g×$-Ù!ûJXoÓ*Tº•ô2.?`½–g­Õlæ`)V£¬ !ªíÈd~ÓoÑ£ÀnW?wÅÝ‘H ]@ O7}oz]䃟ð‡ú¦y¿)Þûá­1ª×Xî R|[ªíº7Å2Þ7þÞr¤4¸UE]ÿz™a®Ei-­õU'ÑU7¦yYh…câƒÓ-b‰0ˆákxƒ•'–8–táx».Dѳžk‚x%ˆÊáìñ½{¡@–¹Ÿ! •½f ðnjê¿£uÉþ€îbyè•‹¯Iv|Ho£™Ûà—ÇË Jß8© 3$%ïͽl˾&åw½ý³I´Êbpæa[rfäõR ßîc©¸ñ­G…(—Ó]íS—Â6!b‚Ñs~Píì‹Ò^­„ªÎžá}<ѳ&A$ê¸ã°“[v²s‰&¸>'+‰ãS»óuð •áo£R!ÏñOØÏ‰m"šï)ª gúºKì[A½!»£Å£Õ¨CÉÄ~moC§ñî¹| [òP¡ÙØè¼±ží:R³˜‡Ç¯¯.ÎÝÈn"Àcd6œ7w„ØKì“ÚËíž6Ùƒ×Ü_žö'°¢SpÅ|…,Âñ˜§FŸó|a.2)ÜÅ)9…‚´ Š\++ßĺ| ª,"bBýnUhMïEëœÅ3Æ¢QŒ–/°¯ë©þô˜~«Ô;ÏXÂT悔 Mqw¯Qç«,;©[ÌôÚóП†Ž!%7žQMá9J…ñÕ0íXHŸt­ËvdKó.ê°8âŽÆÓöJ¥pS\døYüiÛQļ J)N½µÚ|[!Ú=¸ïÍš¸ýæï½QbYà%F~=¿Q?cÒ‘FÕ›•ô^gl‰üÞöÞ᦭*¼ìÒªd_-›÷¡E¤‡íàæ¢iÔ÷€œŒ;ßÄÌ·'Mc·„ž]LÈ]ÅecßgzÄô z 6ÐÙR¥¬ kŸSùHXøÜ•‚j^ɸTŠˆQ© …JäœÌ¦ìeÔ4>žc¦ ÚV/cbje`Œr—Ûbq…Ø™½a¤ÎŒ ÝäÁO`k³nî‡_ïE¡këV2B®ìö·”¦‚DKW i7»•YÍŽrìK©µÑ%¹È‘<²QTnäù{_¯±£=+Vÿê4Ý]7O9kc-gG©¬’z¹óÁ‹ñýŠÛK/'ï6ƲF=Kšø znàHÿ–¸êH`Ö¸¿@üxµã:óg¥VÉ_yÙ"íh¬ûë¸;ÈçLƒãª€)¼xk\(°°uìÆ›´æ²[Æ»ÔG³Ò µuÙÉ¡rôÕ¯Ùn]»Í7ÒY!D ¼îMÐc$ÙÆ£8?ÿ(Û Òҩثǥåö8ÿãSy ¶×né°ƒaÅ1¹ùû”™ŠæÆyžä[×[3É×e}Ïsõ<ÉÀi„[ÅeýB%{¸½†â¾h„È ÊW%-›(Þ[ºçAMÆE_®,3摌¡ñY‰3\e|¶ ,ƒÉÜEŠú ®æ¡Ù¥±þgϺX'wk©¯¶æ+øÓ äÕÁM²…}¹ÝvвY¦›!Rîlv]¸¥† 'kÜ%z9 {Ë×3åÉqûËF_ºØ4P#D-äïú)Ì«îËéG\ët@’±Äû?¸å`É#Ï>/É·ñ¨khÔµÌWôµ{Žó|£¹ÚC–¨ê½Òznó,˜´“)‰vúÄ_-…v¸¸÷‘wÈ<Ãr•­Ùòº3#&÷ÔÏ•ÃÕ•Ãæîv -þ>ı¥ð{ e» ¾y†âáÈÑѼÓÇî·†5OR ¿dÅà;,—Ñ »]kAˆÛáª\âÍ8]ÃvîÓn>ºËÁ&ׇY¦™8×Ca"…r7Þü‘qÇãÖšÝôå•¢sß;<«5öœ þL”¥l†¬¹Â@.ô’Oë±ãºr%Ռǣ=µ¥=+Ìä‚“¾6s¼áSŽï/än2~ }—«°U…ðRÚˆV0foÍ0Ïàpòéj2÷2fmç˨@Ÿ.g^òpïd¨Ýt¹,P§b¤ìކD Y0é»Üg+*Ömî¼øÕ¼§?síngSñÖÍð´~Ï)n¼¡«ÛFÒXNö`À‹«©føLe鳨N“Î}t½·‰§2º£m¼öÜ ÿ¿`^uy¡é£Çuê'¦çìíÚc‘‘ü•S–]0 `%Oú)ÊÄ”­Ó ãäJ(õŠšÇRK0)aÿü䫌ý íú¥ "Mé†çO–-5Y@©+횃þ-ÞaƒF¶–“Ù ä$O8ÔËÞfhªÎš1*¸úN>n½i°È©.×Ú38 Ep:Z¨¡=gà\ÿP¯Áª_kØn+:X…hß„ÎoqÊ‘xXv:#-î"äšý]ìSY 4{»ãrù#‡} 1E(áBuY0ÕŠžˆ«cøåyOB4/ˆr«áÐky«û8Hû½¹®îô¢¨Â»ÄørÝC›oÒæ 27©¼n'EPf^·X‘¹®|;…8¦Ô‚&QÈ`YKF¡€ÍäY4@èF3šnïÔÔfíyXŠÜ¤EìÏ—)b /cƒ=‚u1ò¾r5‘|«!*x]mÉ:1ýLJu…î¦óþ’ô‹£kÖÇgsCÌ:!¸Ûa…©\ î©§†ŸŒ¶ÓÝ…£ÉxV™fO^öÍz™ïŒÓ3z¼:Gö/NTÖ+tß kNQg7ªʯàóÐ6œ2°OWNÊm‡ 7wÃ|P÷l–ßU°½ñ¾×ÿ(ø(?³=$Fµ_d¶2R^Ï_EUÜ\Uýò‚E"¶Þšý|¶|Àwýóp_*¡IAœŠØ…†‡ÓŠ)A¥ØŽÄ¨Çq\µ‰Ý±DÓ?jT¬ÍIæ?Þ"+¬!Ðõú¼Äãr S¶º ;/BìæØŒÙôâ¾1§ÐŸKfŒv#Š{šP½OldÕuk"¥'ërç ÑOîÐõ¾P5ÍùK™ÀÛûÖºAyYé9XbÂiDä*Íý¬»¬ÚÑNQøåýÏzÊ×)hãrMªÒ3ÜàSvÎí{CíÀOE¯W=U#sScȸ‚/û$¥„.gKÛ×½”!üAjÝü ¤Cb%Ñ\©c‹Vù ¤Ó1±–úº´B&m.‰ÀØT 2@î"¢âfUü©R_B>ÄÕü»kqQy'îˆE wØ‹¯,%t¹´=²¦¥/Þé½—ÔAA]ޣߑ‹RFÉ“fÝab<ȘÄp[¤Ci¥øÕ$êöõÖˆ² q’þý6‡qn­yÂQ 7(óÛß%ÐC½YâFXfœþ¼ír§9ÞÌbËRë3È“PW@Ñ÷¹PH­V³ç¼rJUŽÍ‹ëŸ7øšp,£lk˜¨_ž*ú­›Où†h}˜'²£yIk€|ëªÀNŸöÓþ-ÉíLŽ—Kö¡‚R´†Â}ÅŸuëaÁù s¯‡¶¦j¯±Rî8¯áÙÄ–8ìw_n¶oUÚm‰ÈNžf ðãSî`˜{*j­Æsë¢îþ,×W|Æ©›¬º¸I†)iœó"‹œ±flvXì=Ô5S§Š]ñ»j}1—’wÌ,oPNœ÷5‹b¢š*¯Ú ]*"KzØK¾Mš%)²¢Ö‰u.ÀM°¤¦­çC‰I¸Ò.ýL½ÃD¨™b#På3pŒ®AûìkæËªkS­®EÍ]Ýu.½Ñz_|‚>ÇM`qÒÙXÐü>u"9ÞØ=zîæÚ³a¹²µÞzŸóêÁˆ éŽs}±%ƒµpï^»‰5`,›ö¢hÌÄ»íçÉoN~JëÕxdÜÙå~;BÞ å¸j wgTF¶CVc‰õ¿lÛS•º§dú·,•i‰ßRÉоTÁö®Ís»IXùaØø-Çsì“*:ÇEGÉ-t>™ÞÄŸºJX"Ô[s®s‘=d_SK• h’±Ç§è'õúÁy~{¡ÆÄj2K`³ Ãe×xlÊè¿TIî»ñò™‘ö„&ÓyÞ÷µ»ùÂÊžZñÔý•~¤Í¢Æç·¸÷᪸ŠÊnUmV}B†WQŽ9MÏDôÇ`ŒÏ¾ôq²„ìòn» ž/ο¬`§iô$ÉTƒ¥ˆó÷Í×¢Kïr3ݬk-=Éü´îmø‚ñx¿ÖA]àÒ Hb`ô#ôbÀ¡\ ^yÈ)D£íg­w³06|ýbõŒNm‹P`f&2E%§{ EÃ{S0ädÐìÓ3é)FÓy‘Éù!Pô»×©ì݆æmOÂô/O&“ïòéûýh‚´¹@Ò*-¹.–>ÌÍÓ$îlÉmKP§YÒg5œž¿ÞßPCk-©Ç¦ ç*\¼‰ÍZ&³£…ôøÖ_˜´Õ&¥’®F›äLX§?±o¸-X«œ®=ñ¨8ô‚~ÔóÁô­ñ8 ¨.æåÜì±+ëÙð"õ=`¦Yδçßœ7W@áCe‚+Ÿ37qåã¼®TÊÓêµw¥ª;?Fúzûä0| ëïëî‹/™|;‰ Á«õÍû™ùôܘú:Ãýo›) ƒDsþ =ìK-õaÞé´¨\ÅgWñ„Eá <ÕËÝÑo4Ž'ÑAuë@ ŸÌUw[¢¥Ž%R±Ó*ã·:Æñf a¦‡£€ܱ@4ÊùH«Ö¥öUöµ¨#–O³›Ùv5*©¥Î“?$ÎhÖt½*ú¢²üc‰¢¡¼Ò¦ø ˆÖ[îO[ñ“íMã¯;/:׈/ŽØŠ ýË+a´ê“F•ÑÊüm8’ë¼5w8àðdS¿iMfTöí]!×I¯çX6›œêÆJèÂÓx#ü»DúÊWGœjoL6Sssf#S"˜¸ ©Ž‘ R{:D¢qYõdü•_¢ÓÒ(Ûü0WëTìÔ6„åTÖv™A©¸êØa¸ì#I5ÖDöÐ1H¼¤_mÊŽ—AŒÆ‡à°Ÿkßwé„XÁDÃg]ô?ÇK‹ endstream endobj 5476 0 obj << /Length 696 /Filter /FlateDecode >> stream xÚmTMoâ0½çWx•ÚÅ$ !Ù ‘8l[•jµWHL7IP‡þûõ¬V=Mžß̼ñ s÷ëu;ÑU··õÈÙ›=w—¾´“ì÷îÝÝå]yil;<[[Ùj<=?±×¾+·v`÷Ù&ß´õðàÈ›¶<^*;²~&ûQ·‚>ìþÝþ”MS >Ù_êãP·ò{=éÇsæ@öd”ôÇöçºkŸ˜xäœ;`ÝVY×`Œs4½JaÓQÜ¡n«þª‡í¡.’Uu9\ßèY6î>¼ý<¶Ù´‡.Z.ÙôÍž‡þ“4>DÓ—¾²}Ý~°û¯ÒÜÑör:-d0­V¬²WÑÍÿ¼k,›þ8ãóþy²LÒ»ðºÊ®²çÓ®´ý®ý°Ñ’ó[Å*²mõíLrŸ²?ŒÜÔqù¥ã• â5F8@ šˆ=@Šð)&°  È8Ô¹€ÂÅRx u€Dº\j2H—†ª¡ÐVÁ¹0CzL]ø Âb°ct‘I ©g$`htÑ‹0œÆ\F„áŒ0ä†sê‡á jd< —Iê6œ»õñzgóñºË»þê W ¤qÈ’£+—Ÿ#ö•ñÌÇkÄÞ .‰bªsré…¤šáæÄç†bïmŽXú¾„Kß7ǵHß7Géû„û¾nb§>&jÊØµäuœ¯¼ú•ñ1ÜV™÷•âÜãâµÇ‰Ou$ÕŸqWèS/%1{\øxB!€§ÔK(hH©—TЖ枃»J©Ïϯv×ÜëÁ=küÒ2ø¥UðKÏ‚_:~é$ø¥Óà—ÖÁ/¿Œ ~™Eð+7¿èË¢/ ÿlì¡ÛÒ(/}ïö -+ZXukoûìÔE?Z„ãæÅÛKýqíƒÄ endstream endobj 5477 0 obj << /Length 900 /Filter /FlateDecode >> stream xÚmUMoÛ:¼ëW°‡éÁ5?$R. ¤d9ôMðð®ŽÄä ˆeC¶ù÷³k›m‘CŒÕp¹;;†wŸ~>Î|¿Ž3óEŠ_ñ¸?O]œ5ß¶‡âî®Ýwç]Oßcìc]=~?§}÷Oâ¾yhÆáô9%?ŒÝ۹׬“B|Æœ‚>âþ)þ;ëvÇw%gÏçáí4Œ3‰ä§áô–’>\ ‚‚6ý§ã°¿ õEJ™€õØ7ûÆ8ó 1¿’{Æ~ºðÏ`W(-ú¡;]¾è·Û%=°ùñýxŠ»‡ñe_,—bþ+-OÓ;qü\ÌL}œ†ñUÜÿI--=ž‡·B«•èãKª˜æÿ¾ÝE1ÿpÆ[ÎÓû! Mߊyuû>Û.NÛñ5K)Wb¹Ù¬Š8ö­iÇ[ž_®¹uÊ•MúÑzQ­Š¥Ò)V†€Ú(TØ€àx¿àÞ¢ žjy‹°°!ÀÐÔ•µZÔÀ2àP="¦ZdÔ0\ÃG©R\¡·”).–2*ÎШa!„U¼Ä,†³ÔÛHð° `+jÐÃ.¸5Nα@èâ°èÐVK-àxŸ%ô˜Ü3š% A°YÓ€z¡ÎšÔ>kP#¬³¦õ™5m0W£oš¦Ã¾žj­®§Üý·.†ÐZ¡ŽT$X/©)n)æ#W—„o(æ“oÀRZÞ $K¢p4’ŽZ¶-bâ\­1¦Ü°Jä æP"Gñ‘XÔQ¬‚i/8ºkÉ^€ÂZqŒ:ZsŒ½š9”d š­Bù Ž)ßsLù-ï7½æx˜ÏJ›¡¾Ò`¯ažÉ½)f¥É$†µ’1™¸ dÑŠcªCZCù<£7Ã3JÊgózÌnøþHȰíáÌYÉšäTœ¯a…Šï¯Æ,_»œ-Ÿ—Oë87Ë}êÛKÔ´Ü—Ll¹oKñšò+Êg­JÌâ.¾GZyóº‹Vðc­48¸’ï¼äØWtù]Í:P~`áŒñ±–rZŽq.nÍ1]Ç ÇàSÿæ/©ßP•ýïuö¿7Ùÿ¾Ìþ÷Uö¿·ÙÿÞeÿû:û?Èìÿ ²ÿƒÎþ&û?”Ùÿ!dÿ‡&û¿1y–¦¼ÍH·œn5þ¹ã)º½ÝyšÒ“Bï½x#†1Þž´Ãþ€]ôGoáõñÅ×Mñ?®Xê endstream endobj 5478 0 obj << /Length 814 /Filter /FlateDecode >> stream xÚuUÁn›@½óÛC¤äàx ,‘ei#åÐ$J¢ªWÖ)R ¶é×wßÌ8•šæ`ëñx3óæÖßžf®_ü,¹ÖêÑÆÓÔúYõ}³..ê±=íüp¼ó¾óÝùîáF=Lcûä겺­o‡þxÄ·CûvêüYõQé_ûá¯sÔå³ÿ9;šÙï~1Íô¬_àBÏ4ôÏýñ-è¾’¨À«O¼¢Ò~:ôãp£ÌµÖ:ë¡«Æö9Dsñ¤æg—Û~è&1¦^`32±êúö(WôÝîB0(~z?ýîvØŽÑr©æáæá8½“Ó«h~?u~ê‡WuùÉ]¸ûtÚïß<œ(­VªóÛÐ4dq·Ùy5ÿjÙÙóûÞ«˜® »kÇÎö›ÖO›áÕGK­WjÙ4«ÈÝ?÷LÂ%/Û³v´º _±NŠU´4(61¦‘‚ȘH`ZpÚ0a‘A‘SgAQ@Q LE…)5÷8ZÖPÔ\RC±¦%4k(4m¸¤AÓ%MÅJš÷ëŸ÷´‹óÞí¯Í$é¸*C™6TQ.€cæ3à„pô‚4ctÊ| œ1vÀ9׿À–yÒ\Û;æ‘´.y.i*æÉOÍY£§I¸¼a%aÎ2A†{&˜c¯xÓï”sÌÊ4c̲´» «lcw3Æî6aŒÝí‚ñ˜v7äÍfŒ©gΘ4–½a®ŸÈÊ’O³€g[2†O[1†[3¦þôKš?¾mÃgÁþSÌ-Ø }Áþ3è öŸÂOÁþ3ªeÿv/ØNzöŸ‘ž}æð\°Ï™ì-!={3ôpó“ïàßI¶ØËI¶)°dKÉýd‹gÃI¶˜å$[dè$[ÒH¶Ø×I¶ðì$[ìå$[ìë$[då$[ê/Ù¿“lá³”l1·”l¡/%[èKÉ~JÉ–j%[ì^J¶¤—lIoùí$,çv)%sìRJæxöÊš³¥>üf—T+™cVÍýSìÞß°¦nä$ 7G"Žñ·=MS8‹é¬§ó'k?ø¿ƒý¸G}èäü†«û&ú馿r endstream endobj 5479 0 obj << /Length 550 /Filter /FlateDecode >> stream xÚmSËŽâ0¼ç+¼$æÁ1$#„”‘8ìÌh@«½Bܰ‘À‰œp`¿~ÝÝ +8Ä*—«ÜåŽ=ùñ¹óSÝÁŸ¿Jñ]s³øùÏCëM&ESÝ®`úw z\íÞħmªôbšo‹­©û'ÞšêrÓ0ªž‹28׿¿ëˆé~û}øëÐúuHX¢z_÷§z.ŽßXA¶_`»º1o"x•R:bctÞ\ñ$7ÒˆÙ˜ïTm‡H∽@ ]Wý0£±ºº– ywïz¸nÍ©ñV+1ûr‹]oï”òÅ›}X ¶6g1ý–Í­ínm{Ì!¤·^ '·¥ëÁûá böü˜ÑþÞ‚P48YÕhèÚCö`Îà­¤\‹UY®=0úÛZÄŽãiÆ¡“Æ 7(©äÚ[¥Êá4rƒ”;"A"e"qD†»gs"2´dK$Øâ°#Ð’±%#KŽDÁDN¹Æs5&ªþì]ªJï[/G endstream endobj 5439 0 obj << /Type /ObjStm /N 100 /First 1006 /Length 3814 /Filter /FlateDecode >> stream xÚÅZÛnG}×WÌã.«ï7 `'ñÆ›ØñÚ± ü@Kc‰Š´I*qòõ{ª§j†#Q”I>,RÕ=ÓuªûÔ¥§9Á»Ôè&x—› mStjŒ³hø`¢'É5&…D’oL t[l¬±]15ÖEºscC $•ÆfN‚O¦±%S_r ‰ã—2$‹«^k\ÕÅ5Þ[Ü’c€”Jã1®ñѦ¦Ü–0Þxƒ‹%P—m‚ñúÄXOŠ<]t¦ .hXm·™¨a?MÂÄ€û"M‚Ê`‰I÷eXgrÀTJÁŒ‹qMÔ¥@ʶ‰VÇ«.X£K½Õ"îà k­ibt cò˜²ƒ1c˜u)6±„ÐÀÆÒ$- Z’¡E Y7°‹™\F,¾I¾#a-R(ÀÈ`)%LÆíš” -k²M*&7N¬-–UÃæ þgž- Ù—'΂¡Ll:ssˆºqJsÎ<§äAæ‘s6‹p‡\À•‹´êºu°¾XøŠKPUš.›Øo€‘3¤@L •è4(†‘%a ^ghÉÞ7ÞxÜW˜Å6^¶3fm4¸}™Dë«Ö´ƒÛA¤{}Ôp-˜ktˆäQ눕†6uÊä¶°Äè\ê0ø0ÈÑ1¹ËÆò]66“C à\oõðãL†<“Y&ÐUÀa|à39Òˆ„+™|n…%4ËD Þ«iI)¶¬†Vò˜Í ­Š±ÖEQ](;á0…ìhV¶41‰FD¬u¶4"a~D¤ C#2"6kQœ9ùòËõÓ_ÚF};?[œOç'ê›éû÷í²Ÿµ«æ7Õ¤~°^YÎëóö=QMêþ\ú^¯Õ¤~ˆÃ¡×¡‡‚yè>XëÓÐSЃOÀhx@F‡€ú€ÊáþÑÂìˆ{êº#,‹¸#Bc‚FÄx4&؃ԑ{ÆÔÆ! ¤AkÆèLk8ôXôÐZ²Ç˜p«<ØVЃ¨(qèÞúM6ÁïèËЗ¥/G_ž¾}ÑrëD_™¾h„¡†F‰Æõºá„ÔY¿hpåÊÐ`Cƒ ¶4ØÒ`kßž|õUe¬"9Âtݼ8©ü¢¸ek+K+S+q ¾Ò1·(Åb‰¸å¨e¥Uœ´(”‘»V¨%Fî$ν“;…8ò·(ˆXª-rò‚ËbK$¼"¶PrEð(+PØp«PKðͨˆÎD3*‚—hFEV)UY‰Td•RE[2ÍO‹-™RŽ[°$h‰-53i±¥VF-¶dš»[J­h)”¥´XV(}i±¬ÐZk±ÌÔ4§KߤÕ6ºo’qÆôM²ÎؾIæ×7É>ãû&hBß$›LïS5§šÔ7É*Ó[eÈ*Ó[eÈ*Û[EõÜÛÞ*CfØÞªZÏmoù²·½U5ÛÞ*CfØÞ*CfØÞ*KfØÞ*[Íè­²d†ë¬âÈéòåãÅ|}¢^^¿[×&uºõlrE×P[ë O'ëåôSó›>Õ ìÃß ¿íîzôh{×<€iˆ,x'®¼hW‹ë%%á/¿lÔóåâìe»Æmêù7õäjrÑ>jÞ60J=ž.Wë¯/'KdÙõÄX´õfz¾¾\u»·:'IôÝ6®vÑݰê6t<×ßl:­>D>Ÿb—vû[÷ÿïþKþÔÇwìþ þŒzwZ3„üßüËæÔ6¸tŠH{qCMšÐÖ# …I³~¶#$ê@á1”\SKJFMò5ÑÓfÈÓ]º§}‹Ýè,]XP~¿™Ñ‡LíÉ÷}ŸcÉ›}Ú̪>ofU_6³jqÕð°™½7›ÙÃÛÍìáÝ(]x?ŠbFéã¾nö{FDä[‚:@±OA{hˆ¸2 ‘´"1Ý ‘˜o‡H,}ˆ}Ÿóò‡}Ýiê"«z7@_Ìi­ôÏžÒX饿Oý8f¢ˆ¦‘Ì©Œòãà°çõ®-’«%.Q‚½Ð¤~h¯?ô–Ïו%Ú# ©«7´Iº:ä#qØ AåÈCØ,×!mè AU¨¸„¸YvCÙ •¨G¡Ç¥4ÚQuŒn9ÑjX £oÚÕÙrúa½XvÒEÕ÷^ýäõO@Ý|µ˜MÖ“¿§þÁ‹öâz6¡g“‹Uã7CJ£äÐ.1]@D=\µóu£áð“ßµÓ‹ËÚ <̦gç³–š/×íÕkl¯OÔÏ|;–± ŠÅ¨‡ê‘úZ}£¾UÕ¿Ôwê‰ú·ú^ý žªgêGõ\ýG½P/ÕOê•z­Þ¨ŸÕ/êW5Q“ÕÙtz6]ž]_A^·Ëéêw5Y«wêÝäì÷Õl²º„´Tï–“³vÖ¾_wÒ’,¨âïíºï†Ü]8Sg‹ÙbŽï««‰:Wç‹VFµªZ®Úד™j?Í&Wê½z?ý£Uï‘`Ô…ºX¶X¡.Õå_.Û¹šªÿªßÕLÍÚÕJ]©¹šOç­š__½k—«éÅ\-ÔÔ‡ b§šR¥Î°tq®>Ì®Wê£úxÝ®ÖSØõñz±nÏßÍ:a5¥E>} —j¥VíÀ]M?©núkµ¾\¶­Zÿ¹P×êz~à³Å²U¨?Õ'õ—ú[ýÝ.ÿìø~<_Á'½C½yöÝ믾øúéÓ'Fou ØÂ?°tÄBG")èÁ‡bñ›^³ü?v¥´WÙâLxFÝp¦õe»žÜ˜‘ÝgF¯¾}òë/o0£—¿Ü5#ìý”úˆŽˆLi#*0½Ãfäõ3羚¬/oLÌßžØ]YÙ‰×ö´á‰—SÎÞê‹}xUoìBƒœÝ´ó7r¦êÓäpëÕà¨aRݲ:hJ5j°5QwAÒE—RïóêCRÄ(Ƈ”°í›9dú4Ž™—VxV–Ý:} ”cgÇDÉ8Ïótœ6¬‹æ¨$Š“˜ž¡°ÇðÉ?³WnÅÇÛPéÏzYR/ŽÂ%B—€„ bq0<‡ >œœ6lèNQ…JLQ8• ¡¤”ÙhüPRÿ¬Ô?Ëõ‚xƒ”2“=*óâD™C2ì쉰MŽ1Sw´z TŠ¢8²¦ÌÓËš×6 x¶ûÍÊ ²ä†ìEqA¬È¼@(§c $¿-‚Är‘u+Â^ÙÓÇP²…µ%‰> áÒm¬§9û;môáP-j¬(æäêtwÀ¡;†„Ë1PI ¸d8ÃûgŒœôqG¸…3^ô±78©`Îp9v¦Ë› 2ò~ÎFPÖðd¤^9Ë; g¹ø:ˉÉÙŽÓ¥L9›Eà‡!ç8O:·gfC9™Œãäêœ!Ê%.4ÎíW7 8®ÿ¬ AÀùçxÎ?–Åç P#˜A3Bà´ ŽÁƒ·G@… jÄñBÌ$˜¡ì—-â* åQ3Tä=”‹–1#o­]ôî( §(³Šâ“Q¢;J\År TâJáïnánÒÕß%®š.í¹¼%‰.Ñ'³JI.qv©˜# ²øxÏ`òèIËñ(( Ï\X(’nåÑ ƒ·_bJ#¨D±$¦’»½î^=!¡å5ŸöxmEo¼æ¤ïu!ºc xßàù0«ñ†+¿7b…±F„|”áðôFL7¼ëó&KOá{¬>‚+/õÊ[~ðüJRã%+úÈéùòÞtwCñ~«A’,ÜŸ¾ÝÈö¼©°p&¨/Ûvg`rê!OõMÛN¸¶ª¾ÛÝ9öãÄbúÓÞ7óNé@¬ú6/?]÷¼òʹ ¾†ÉOuñ,ß?, hàP­¯þò‚<Üê² +»~Ç,»WÉIš'Xßî¶cG­¡“«/óÎE6Rã}îkòžnXn\©ª’©“TÞ$e?˶0çûùrwc•(Ù͈% y‰dI…ùþGløØXŸÊqjªÕ.ôÏxýV»ßñìLCeV=÷’‡ºqYÆm«#?^¯gÓ9 ­¿R4ü\@?R4Y|†µZÓ®g-®óÚ?l²ÓÁ|>ç{¾lÿhrÿLÊÃÃ0ÜîÎkñ¬ý4˜uC™é•ño;w)ãÑDÙ6ËøW­ªÌïVfGÊô6enP¦w*“ט:e7~ìë”ÅaÉãî%—wVX™Ý¦l î& ŽˆÛˆa7aD@ÜF@» #â6Â@@ØM€¶àünüˆ€°?àwàGømø·›7"Ào#À ¸Ý¸~n Àí&ÀŽpÛ°v7vD€ÛF€°» °#ì6ì@€ÙM€`·`Ìn̈»3`v G˜mèyéý.en¤¬'àr&g endstream endobj 5492 0 obj << /Type /ObjStm /N 100 /First 884 /Length 1550 /Filter /FlateDecode >> stream xÚ}˜AŠl7E絊·KŠWï1xƘÞ@þ ¡éù4^¾¯ÊdEE9ƒO)³”':¯8ðïa׸öó\{ë‡_Ó¡ŸóZ6¯}ïËÆ­ŸvÙíÚò\àÒO¿ÜÎGæÅÉks_|ìmÓôžpþ\7Äs¿ž%žÏkŽ! Þœc‹»æÔ¯·0s™˜¦ï¶!¨¾xÚ-êÒfPØeçXâNmæxj3‘§6Ÿcì¡Í7DÖ@óY®=×ciáZèè0j¼µ·È`ÝY®g‰ŒscCd ¨«YÚt‘5 -YšéàÔ€f·ÈÐ@‘5 9DÖ€v^QûŒÈÐöY#IƸü¹/{Äp]Æ€C‹{^®ëÃô[‹uaé›]—›K m¶ûÑB›A^®pØ›K­ôЬO‚Èz°õ ×÷áÖ”m~–È:¥q½ú×l>u7nB,Y7â6E^ç×:ÏóIݨÏÅù„Þåyœ£<vN)8/nסž3ÛÒÃ'‡6â>7rÛîsYÔéöû=n-Þ¯øüýöçu†$x¿?»tˆìG§¥¹µÐ“?Áæ¹=.òÑðhÝ–ž*]?4à÷¹¿ó,RäuSýë<Á’ ¨gZd`ëµ8çÚÆùKYööão?üë?ßÿûíº%m\¿½ýð³–ó¯å¯ÿþýÛÿ¾ë–ž×¿ûÿû_èû«_¾ýñ]›ï÷W?ý”`ãÛr×Â<Áìï°­Gîf=l~‚½Îù¶>`÷ÓÂî`^Àî;`ÞÃ,ÁfCÀzû³€×9¿ÀBÀîlO°JÀ»°“€] Ø!€½&»ÀÀ^“€] ``/À“V¼àI+¼àI€W< €$À+è ðJBz– €`½KP °`½K¬`!`õV`•€V/`%V X!`õf°*+Ì^ÀLV%`†€Ù ˜IÀ¬Ì0z# ˜•€F/`$³Þ}„™"ü:ç؇öfŠð®"̈0û3E˜U„fa¦³Š0#Âì#ÌaVfD˜}„™"Ì*ÂŒ³0S„YE˜aöfŠ0«3"Ì>ÂLfaF„ÙG˜)¬"̈0û3E˜U„fa¦³Š0#Âì#ÌaVfD˜}„™"Ì*ÂŒ³0S„YE˜aöfŠ0«3"Ì>ÂLfaF„ÙG˜)¬"̈0û3E˜U„fa¦³Š0#Âì#ÌaVfD˜}„™"Ì*ÂŒ³0S„YE˜aöfŠ0«3"ÌWBÿ ¶¬ðêôvþÛ㬊°¿:ý³–ìaH°UÁ<`«‡O°×9¿Àæì•ЀÝL0°W§ =l%ب`°^Àþ,àuÎ Û!`÷6¬°CÀîì$`Wv`/€IÀ®0°À$`WØ ð$€•Þ ð$€•Þ ð$À+Ð @à•„ôx%!½KP °`½KP °`½K¬`!`õV`•€V/`%V X!`õf°*3Ì^ÀLV%`†€Ù ˜IÀ¬Ì0z# ˜•€ú{Šðëœ_`! 0R„_çL0D„ÑG)Â^EaôFŠ0ª#"Œ>ÂHFaD„ÑG)¨"Œˆ0ú#EU„Fa¤£Š0"Âè#ŒaTFD}„‘"Œ*ˆ£0R„QEaôFŠ0ª#"Œ>ÂHFaD„ÑG)¨"Œˆ0ú#EU„Fa¤£Š0"Âè#ŒaTFD}„‘"Œ*ˆ£0R„QEaôFŠ0ª#"Œ>ÂHFaD„ÑG)¨"Œˆ0ú#EU„Fa¤£Š0"Âè#ŒaTFDÃzØL°|•ú endstream endobj 5493 0 obj << /Type /ObjStm /N 100 /First 858 /Length 1510 /Filter /FlateDecode >> stream xÚ…˜AŽ7 E÷} ÝÀâ§HU†_ ‚\ /YFãçkì4³˜.uê—ȧîWÝkʘCï=öæA‡ØzÝ*<ÚÐyñøcÌ9ËÁ£Ó{¨ßÃÅy´á·>Ô…1Œ³=®Å<Óqƒyë2y%]ÆÁfâ’!bŒÔ=ÊLåµu2œ¬SÁÉË 9Ëb®p²óA…“ýf2O½™<9ùZLæeäæ©`M˜(›%²Äœþª°0:XôâKÃò5ÀÚ`\&X\®óp^å3;ó6“Y.‡ówƒÉëtl2y5]LÖ³Üs T(“Y ª0 §þ‹É8­9×9µÙb2 d7™:_ÚÌäùÒ&Ïy`LVÉÝØ§Ü±æ\lÀÅkb'Æ»8˜cAÙ›íc©€N>€Å9y¹sÀɶô!>^&³GËÙ?1NÞ›Éì캌ɋ“o0™>üþç·¿¾ øûíñá3yÝ߇¿þñõËßߨ‹[~¼ðõË?/ï×g¿|ù÷Ïó—gŸ>½ Svè5Ìú0MaR…­“6ìºß„=×ù.l¾†]»³¦EØå¦}˜¼ û±Îwa`÷öNaV„í°{[SX`€Ýð`Wvð€'»àÀ{žxÀ€õ,ð €ëXà ÖX €U,¬ÀJ¬°Àê¬`UVЀ&« @{𬠀í Ð €ôh=$¨ H@T$H@T$H`&R0{3 À ³0€Y £—0’„ŸëLa £—0’„µ’0BÂè%Œ$aTFH½„‘$ŒJ £—0’„QI!aôF’0* #$Œ^ÂHF%a„„ÑKI¨$Œ0z #I•„F/a$ £’0BÂè%Œ$aTFH½„‘$ŒJ £—0’„QI!aôF’0* #$Œ^ÂHF%a„„ÑKI¨$Œ0z #I•„F/a$ £’0BÂè%Œ$aTFH½„‘$ŒJ £—0’„QI!aôF’0* #$Œ^ÂHF%a„„ÑKI¨$Œ0ž ýYØ|VIOOòThv~ÜxV§§OØêÃÂf¦6Û°ëzö\g{zšaO…þ,l¥0TaaèÃÞx®ó]XØ=€í)la;ìÀF «ì°{žì €ïx°+¼à €W<XÀ¯X°€%^°`=€•X`€ÕX €UVX=€•¬ À ÚÐ`U4h@€UР=$Z@@ €VÐ@€ €ô$@@€ô$@@€ôf €f`&R˜ —°$ ?×ù.ì@ïà¤àç*ST¸pò¯Tþ ýööMò­ÜêíÍ›Ä[y7´Û[7I·rn(·7nnåÛÐmoÛ$Ûʵ¡ÚÞ´I´•gC³½e“d+džb{Ã&ÁV~ ½övMr­ÜjíÍšÄZy5´Ú[5Iµrj(µ7jjåÓÐioÓ$ÓÊ¥¡ÒÞ¤I¤•GC£½E“D+‡†B{ƒ&Vþ }ööLò¬ÜêÄÿ|{J?SUßêâk@š¾íWwÚq7Õ»<}iªnXBJí'dºõ,>û_ßûínLú.Þg¯‹ùIÊ÷Ãç‰ÿ›–r… endstream endobj 5495 0 obj << /Type /ObjStm /N 100 /First 1056 /Length 5951 /Filter /FlateDecode >> stream xÚ\KsÜ8’¾÷¯¨ãø° ²£c6dÉuHj¤öôÆÆ(,qM5¬*·Ý¿~ >@¢JE”˜_&òK¼ ‹¼ÎWÙªÈër%UnèU‘ÕöGµªþ¨W"«àq‘e+¡de‰•(4>“+QÕ™ý¥VRä(ÍW2ϪŸàW±’eŽ8( ª•ý¥WJ8j¥òÕ+¥%”_ˆl¥êÂ>b•‹ŸÉUž kY¨U^ŠÒþÊWy•gP†(ÀãJØg PNŠ,>µÚò(D½*¥”ðKf«2¯ ûK¬J­ñ™\i!ð™Zé¼´å‚CZ×¶ Y¬ªL£´´a±eH½ªÊ qªªDi½ªêªlUçÚò7j(¹ªë)ˆ©”ø3‡Ÿ¹–PŠ*à§VÖU®<ÆŸ~*g´‚ŸenKƒBÔÊþy‹Í¡^¤ªl±ð¿eacCi|¶JS"Ï¡´JS ÝΡ4UÚú/ ²„ª°¨KՈƠ´\!Yˆ¯È]݃q¨p?¡4¨m«V@i@Bi¶x(­€Ò ˆ¡} ¥•™ÂŸPZ©ÜS(­„J³?¡´²ÂêƒÖ!´ãVBi:PBiÚµ+PºVøJ«¤²¥+QåØÜJ(­ÒjÛV ˸„Òjm*š™¶ÑÑPZ]V¶Z4”Vרœ¡}ÈÌÕ*T¨Ì\|54ò¬Jƒ†!¡"šùXo" 5€?+ìø³†ŸcVeð³.liÐ|¡iæ¶@Ii›ü„Ò¤®ð)”ñ·õVAiJaS­l¯-¥ tP ÇúPAi¹ÄÞTd^`Ì ÍJè1[CiÐô-¶†Ò0žðJG¬ô:YfUöÓ/¿üô÷«æÙlWÿû·³þá¿nwͰ{³ª3;jܬþvóeóö¿¿ìwûÁüüóK×lÞØ¾],“õúä¯öy¿{º1Û}·Û¾±m*;x+Þ¬´'¿ì×ûÎÜ>ôƒAí:%µª0j€ôß?ýý¢}nw߼οúÇ?<¦ êd»m~ØÒE–,ýÖì‡f‡ ‘íÖ‹-I`ƒylvæý÷—Ál·m¿yƒ}î Ópožúá֠ЂP¤‰Ú|H&ñÛ›u³}zûÐ5[¬ÏB3PºI«m³éw@ÄÑF©“b« ý7)>ßìÌ#Dâáñ/Ó%¾½šÍö‹<±ãi¿Òl"’¾ÚÚ|i í£ÓqÚÕ Ì 2xÔ€‹Ò¿\€ì^cÞ?>›Íîºë­…JÄ"áxd‚ç½Ð)êõ~×_÷ífwÛþe»yáyL…V³ ì›šG¿ßØ + @ ¤×¼ûxg¾ïNû®¬nU°Ô}ß#E–0X¥’pz× ýÚœo¾tæÁ¶ÝízÚx ßuÍÃדÍú_OíƒG‡`Oˆ^h*ÜCe®oÌÕJŽy@"Ôã‰÷Ýú®Ýuà ÌJd¶x7´ëGsjºn{cl…@L±ë¾±‹‚ê@œ D¼1ÐíÌæÁ¸¾\ }ô»¤|%Kg¡ü:;|àöm·>íöÛîck³”¤›†rô§äWíÓ™¦™R館jW¤QžžžÑÔ*×eJŠƒz¦ÙPD$x}6§M÷pmXSÜß¶Ö‡œúàIÑíK÷ Pq¿yãv,¯Z«µ Ð­¹lvOÖÚ;gj°­"déñ1€fúãÁMÒíÆFAÓVÊÝÊGø€q<Ñyá?¿}hvP1(ÊY‘3W2cãƒC¤.Ø"ö:VNÒX6îqx{{zËÓÙÒ•LIãE$¾;¹yn^P7„]»†Þù”Få~n·íþù³@i‘bM甬7¶Ì£$u»ïºæekÞ?ß›õBùÛ~×µ—Jš®k’@F#o_ÌCk¶Ël qh¿[ú~5Í+ááûá¬}¾}éZluµàƒE83Š| (Ä•ìÅêù¾ÝÛÚmx*¯™S¤ÝÿþûádžÊk  ѵ‹AÄ1õ·ûÿƒ¶€†ØÁ1b“¶ÁGƒAº}€ˆ\ÂÉìPNWE§0:÷Ïgív×ÀìdÝõÆ OêÌGâë¦3»qÁAÂqöÞl˜bnƨ*ø~“àÁØ`ãàAœ‡„ÞY3|½{2Ï®k‘ äÌ-YÇÙQ º&;kÍnÞÅU´Ÿ-,ÉWzþLÜøRivÓùjò g¹+T{…NÃ{™GN×Hð–jûû8Óñó`=TËê0ÆÀV«ïô! ÎÛ‡ÁìÌÒ¶´×¶|±óƒÖS¿ÔEMg·Y€*tÍsÖO›žÚk@ý¼Ö•æ™®z,¿÷Ý}ÿçTž&ír¸Í2©¼yl‡ªÉ3M\‡QùÒØ¤‹¨«2zì ÞóÛ3û¬–âó,¬ÈÙ¯=ûŸXÈ,áSÜÄӴчf»»¹Ö›2£«‚fhÞ1ýŸ°p±3 ”ÌVÕìo¬Ãò£ç9é !í374™Ñc”^ô°”K:’Î}·`EŽeÉæ•›Ì\S y†~sÊÂí,£´&Ù®2:n*˜´†ãRržúY1t3Ï^D“!rÜV¢•Bò2§˜'„s.1ë0ˤÅdÌfàœ/ƒ²Uàl<ÍðͬIËÑÙaŒã4>¶]d2?†BcaDgÆ! VL/ÒO††2)J¶ð9*iꟖå”Bð2ºøÅL-C Å#– ”"KŃpJ8±ïCO åöºMweÚǧ{W½Q#``â2hQž‘R&„N5OI縺eñ8VIÉ ,À¥ŠÊ2婤´ÓkØÛ ¢ð·/Ð)š®û‹–¶¹ïÌ8Ÿ`„jùJ°‹XõZôÁ:Á8¯¶› kZq sýÚø£-Ð*_«E*«*ëv?-vj »ä"Å`ë j¢IGäU îñ@$í&ƒËMf: ÓÆT©cÐP•M5¡Â3\Fv†t»Pe™ &Cü¨Ád#…ÏjÊÔ€šw÷£ÙŒ±¤=°ïÖ§OÍæÑŽ«ª*8‰‹mΊæ Ñ­‘“IHUɹòŸ¤A>8 Ö`U³Î-õVg,`醊&Ô?ôÓ‰œª½}L?<7;‘ýñöfß½ýhú_·°9³¿mæóü nõëñ.ð|Ô8¢¯5ʆîãû;ØI{é"ÛbܦLftŽ´Ïo<ß÷ÝÝ“Ù6ÃÞîÁ]Z~4S.IæôÐizŽÌè¼1 æ:±w›âè&«Â³An›#°òÊ<nl§L¸ÌeÍÉ—MONw5ÀÑ*Ä’1—Þõ… Àf‰}* íTÈÊv E®?}„¥¢2ßÓi£ˆûˆ’95¿%ܵÛíÞœöý°n7ÍÎliÀ‹ê–¿Ð‰ÀDô^a/ª´Š#wÌaZÕ~oJƒ±Úý.¶›fŒëÁ¬Ûé¸Næú( ݤ«ùCóòd±,KÄï0gb„šùÙRi/vù„©REs9ˆÀÙ‰îë?ýþå´ÓM¹°œÎQ¡ÍÒMG3wÁ3DÌ#m%‰éœ"]âÓÝogæyo'k{71zŽ ´w‚`É«t7ºHP‰¦>}þp¾ùÒ¿Áûk<[ÞWO›e9 é[ÐU(w¾Q@3<÷›~–ÓÞ‹=€pa$ïSÿÍ KF±¦oTæÂÉf€b"œ6ƒóÓ“é$§&sʹ—Ë”MüÉLE÷§çãj{>Ú£Õ+Fsš}Oªò”c óƒÒ°ÓÑ¡ ËB*CEÚ’Qè{_Ò¡ ”;ÔúØT̘‘ÍK¶Õ'H0&øPú@GíYJO'd&˃g&?ŒáïóIï§ÇÜéÃËç±ÒEóÃ%µJ~QgÕGÍá*ö!$G±8L0町z= ûãx‰TViqX4?Æ2Ä;AFÁ šÁfÛîì=§J† ßÌØ ¦žVgÇP®§دÍÃ×ÛÝÐü‰ãLÅP…?U;B'²ÃÆd0õ¡éü™:9ä4€Ò«ž¯jÒõñ¯ö*ftt§iF›83ì™ñz¬±‘º§§'Öºxć®üš>…¡yð¡4ßtÑÜ›Žœ½èãf=å½BÊÒ¬®ûîǼQB²óUŠIdÃÀâéâØÊ¼ÝŽ¡wA"± «ÔñPf¾VŸ’9ÅÚ¾¸ù"1EN{Jä¼øNʇƾ%‹¢™· Òchðƒ Íx]Dy—“@g2Qö“ý*FÅ7…eËY8«§Âµ€„/Coð×3ìá×nBV…x-ÚÕBÐ3–\nÎÜ·)‚Æs¹³›U‹cÑp|<½d @è Üò®"%uʹëfØšwmoUUÉËP1š’æ¶}‡ŠE’çès¬•d9!°Ð"ˆ+7ó·0xlí:¼-x™+1…sö8Ù´©Ë¡b’§“»2ƒ:YòÒµÇñÑ^Å9_<RE¦B4Zzõeïî|3§ý~Ô¥»3_ê”Ë×Åm^7ÁwÿÍŸ˜æþBz^Ä7]g ÐÒæ‰7ß ½ý¦´7"xRçõÍf¶¦ãfš˜¨B“‹dj'šÎä‹8j%Z³§¨!ÃføÌèeD¦›»ENT’Z2š®óÃìŸöÚ.[g]'1ËÞYó9ñ˜Ì+épLP²÷>[Å$‚¼ö;mï®yQ¦¤nLÉ’b²–¨²dþÅkÄÖÉ(Å[LDÌÓX†-š¾v_T$ÇäùŒ~×0 tS[ù ¤]aÖÙklb¦Ó»Zî þyï⪯#ÆeCpÜ"ÐÎaÚ=™WHUí-xØ7dµ·0»î›Í®uŸ®ôëc¡ZåY¿­§?:!B$"ŸèóWduž….D뱪L@^ ’ðð|‡1øŠE™.;•‘ä´~n6ëÈÙDdbbGlwߎ5;²P%/ûùgö‹äJ§à˜gÄÏf)H계J¥4¦×Ãñ}í,ÁóCÄ‘`£×Šñæ"é/ûq•‚|ÿ'OF%y›/Y—î2E³¤‹1å+Òá> #¶_øDOÒ;Üó’Mv|KÂûK×,ÙŠ›eó#¼+ØlûbO©°ÛD-fùˆ©:ç#iju ®pC2¾.ŸÿSµ7 Ï§D0=æ*ãçaô½U ƒÁ=@&Ó1˜}?d‚ç¾ìÝaä^7†j/"Ó<€–>ŽsÔbà\VΊܮˆï}#FõP$æ6Wz%wínüºéÇv8¦ï£tš-rï}"r.ÓÐíï·f÷îGâ{íÕkh”¿îó9nƒòÿ`¬2p endstream endobj 5596 0 obj << /Type /ObjStm /N 100 /First 1043 /Length 4981 /Filter /FlateDecode >> stream xÚ¥[Ks#Ç‘¾ëWôÑô®÷C¡u¬ÖÖÊY¡ÐHòaÇ ÙC"hiüëù5ˆ®dvõzc/`VVUæ—UùêškÌc̓3…”!PêQ’1ƒ5Îñ/;XWÿrƒ£~°%UþçèOú¢ÿ‚~¥Á嘖o\æ_eðÁaF|ò¼ž5ƒ/XÙÚ!˜jù—‚+¼‡õC‘gØ0„äÀ‡«¥=lBà£å­ãÝ,ýé¦UhZˆ<Ãþ‡ås4 ¯ÇjÕiÔ´#XÂ\áU\Rˆ¼m™x#ú•‡” V)Cª@ˆ”É–ŠÉ›!;†/yKðÖ×»!³ªôË9g^Ň!×Àòù8k íA@—yeŸ‡<æ–¡0°ô«%ç`†R-P­áU‚ªK,KðC žW a¨l<ú‡šS¤=BjõlKÍSyÒ A­ô3¦F6;Ùˆ’ÝMf$q‘´Ð!’å­ÁV1ÐO[y…駆6#\ hi7›¦Ñn¶8F‹LJ³&íc ¼BâSæ=+h7S¢Ý\ tž¬«‘%K´›·!Ón´¸¥Y¼E¢Ý| Xvó9` ÚÍO gÚ-ØÀ+dÚðbè2íFÇ–· 3Ъž…Ì´[¨'Ón‘ö£ÝºÓh·q´3í3tË´[¬8Œt,-Ö­Ðnt X†B»²,/!`IžFçΦjYÞB»Ñ±r´Ý ›½ey í–'PénØœ V ÝrÅå«´(Þ.€-G€lcK¨<­N7–å­´[)•W ?`«©á‹¯¾úâßožÆÓð?¿ûñãþö§wßóÃîp¾!V8‹‡‰~8ìn MK{þÓ¸Ûn觨é·öf(t3Úÿ7ç—ãˆ9yyhš†õþþžÛ>mÏZº…IÿâÔúž¿·GìIà·{^ǦMk3xÜìOÇã×û»ÇÃñÝxæÙä.û ·?ÞoN·w»Í [æÿ3ö^sÿysÞèäÁªé‰Ëx4Ó¾ R¾û4žï¿Û|a\v²«W9q.ÔÞçW:/×…cAü·“5¿Ž¿ÀÁßß:c+KÐ^½E&‡²ö†k÷ÂW·“Žûó#~íÆíý¸¿áú,,ó¾r8›ZŽÃþÌwüâmÎãáø™ƒ~{Ÿ™ ؔ󼪣íêZ˰ŽÇñî ùïÈáÉjTw67`6Rs…îù<žèÚovìŽãý ¼!m£ÜÇÍÝx¾ ¹½ggTÃÒ评5F[<Œ‡'é&ËòÑYRdq…E®Lçñ·3dH 2ðà´Ôø<îÀ[¶×ÁÓöþeÃi¡ãº}fx€Cgž/Û#ÁµÕuüq³¿ßÇÓûß=ìÔ÷/{Ê\cpß¿ÿÇa{ÿá?/¼ìOŸ¶Ïø¿·ûíûLXž˜òÿ¹?ýøó7ïoØ·¶†xÜŸûÏ_~ù—éÇëå¤*y1l¼AtmE‹<âf±k±ÍaÙ>mF‚æ„~z7{x›ÐdÉ»ÍçÃË7¶Üÿàdü5ÿãÃÞÆÆiø«ËÕáѸ˜=½J·4iQÉ#÷oTyÚ|o÷<—­üi<>ŒÍ¹ääÈ~Ýž§(÷|<<38Áb—Ût÷¸y&sýqÛ\<Þv?þvk8¿¬óLWsbñ-Xj^ bãÊ¥D½ Ð|çCKrFëc4ÇQ¼H>Ï|9Z`Z1‚1WýY‚™±'fâe«€Âd,+i´"h´ÚÒG)8I¬¦#dºi;BZd:¯!éBn¯¦¾Ð‚&0÷|ಓÊdð Ì}Í/‹ÉÌŒ=1+o•„‰XÊÄNÁ`'!QpI\ ‘:gfÆŽ”=\‘€„ 8qà\ ‡Œ`*ÕpY"àM])-&K03vÄŒ|à„î¸e±ynY@›ôŽ¸Éˆê;n=Þ4|=Û)’/GÄyËâZÄ 6yœ`'Æ¡cï8 Ùõ– ¨É€–¸`7FÈ“8q0V ›€Z÷)áÞÉJçî¤9@¦n€L8mE-6³Sa1³ °É@š6nž€èø¡4ÈÜ §MFâŒÓV¾¸É@š› ¤¸É@šÄHµ˜y¹kòœ9=“n0ã¸ÉГ7„:…q“ÆÍE¡`áälË<ÇÇÒÅaY!dñ  ŒJM`T"hâ°”šP°0®ç-ËK7>–‚eÅ/•—-B$"UyÉê„›8•Õ‚&Îe€¨!çøX»ñ±7és*p“‡ 7÷*p“A«fо@èŽù,ÁÌØçM4Ò½ZAàz@xÇ ¶"rœâûࢠÈžµë562㲄ÎL@Ê­o%â 3’–˜¯J€±Ñ!ÅwØ fÆž˜RDBÎXk‘@EcZ܇¤Ø‰xé8ߣ ªv„œ±´½<Ã!õqYnÜDÀtá|2#vß>9wÂ- ÚIJ‚3cGLV>Š[êÜœ°$*'n¸Ã\'«Ã ’†àß§Ô±øÕ 1_OHà&<ŽsÀMâápÞDuœaû$<¿C†ïDdeÁk'„cÿ+[GF®üµw¡M¨ {{t(¼@Ók¢ ]8Á§â\ÎL‹Ëu$˜{bÂß¹Õ›¸ö\ø, Îù5ÑlaJ#¿w¥swü5Ñ`ÆŽ(œH*Êïåæ4g×¾D)RMœhÎï}é<`f쉙±½Àå€÷K”Þ‹í9¿—H"¿÷A(üÞ‡ÎÕ ×Dƒ;B¢ð¢s(|÷‰Ë_¥»D‚ïƒÀ’|+;N ¾Ë¥$˜{bî Zq-¸ š0/×òBq~Œ(è\šp–Ig¯‰3v„LnÂ(¼È /’;‡ ß‹äÎq†¬‘ë1Öv°Ls|LÝøˆ‚À‹œ‘=c•·—¾—ñ‘3ü`߬ bOÈ9>殿ÌnR¤ 7qyò„›Àˆ3ìpÉ¿¯4\<‘:Îðƒ¯ËI$˜;bòªÉ )¹"o2®B’ç;dÑÔpœâ‡Rä\’#šÞÁœÏeéÆG.¢‘ù2ò!p®…Ç#×l'y|z<œ¡ÖŽÿ)×°Øí]qd«¢êã¸VE͇¶UÙ¢TÞ€ƒT VQµcܹaÕíWq4«¢Ê’‰ä—CY]Õ„jQDT2îéܣ궨8‚QÙÙB„•ÝTô§Œhœ"ѸD82[D#c–ïîܛ궦 Š(¬¹Š¨¡¸d‹Ȉ:&NHµàq² ߣ^·¾ru„céªhã `Qõ!^)0U…kG;ʈ2͉ŽÛ›»Q½„½¨šZP¨ŒðˆSF”‰ˆ;FNÄqZÓd™åÄkîBu›P¡¨k!àE Ø'JÔtì菱‡pc:ußÜ~êvŸšŒ(úÐ{2"eáÀD•ŸØ˜ûœV$æˆ3F”|f¨š[on;u»NGJ”{yBª5$$'[Sè8µZ• ¨V…2é¾!ævS·ÛÄ‘ÈY €~ ­&#ê>öðTçµÆæF‘ZE¹ÏD•߲ÛÛLÝ.7yh~kî1©•IH™Ñb2¢Fá““­±:}ú\¶ìÜ_ê¶—¸·ãd›KΉþj>’¶†¬øèiZû×é›§Xkúä¹ÜðœûJݶ7vð¿°äiÄ£ßãò F“ ^‚M7xn»0az«õÃNGý&ɬäo‡=Öªz“€×VD 8=0°°²Æ×NK;P0 NÈùÞLYU§bE-œúZ66Wp¯1¿°Ðöâ¶ ,,å‘›5mÞg©‹Õ¬¸°UÄ (7µh@[ïbŠZMº>|ô¸¢ º\bÆš*ë%µO=+:ß×”´\( ’¾xS™ÔúxªhÖÔˆ7’E \í””°Ø%%e&48SVVÂ;†”•‘йLY^t/“~¬"%“ÖÔæE‹Ì‹ ˜-ÖôŽU)¼u°š ôÊŠ-X09aE 4FSQGs4e$4H“v[x‘ª Wuñ"Õ5X29aM €^µ¸½*÷ƒj6JmЕ´\jR=§´Fƒ4»ÏË‚É +Zà­Evzº(®#:*R§®÷T–:­5£—õ§t)™œ°¦FÁrÊ {e <²ÐZ£{} ×ÐzPZ ÃšC^Ѣܼ™°¢Êà¬3 ”·YÇ@Ô¸9*€B7G½@z —Vâ_Á<¬Ær”Ë9)wº²j᜔1P_Ç4t€®3JãœWnFA<®Æp”ÕYûtÔË9k±zV7•sÖNåsÖN5tÖÿuFJ&'¬¨‘º: (¬³¨®³ÎiQbgí„Qggí„Qlgý(A&ù×”ˆèïh©èÊëàH± sTâE;U´‹Ž|àÕ%d²ê£PÎíéQ¦«”@­^¬r:è$í‚Ñ.Ú£t/nÅÕf™„äÕ$Ý墯1Êù¢Ojúâ”ÓÁ[’¢«°‚÷oʨñþ‡²LNXÑýâ¸xdRtÀÀC“¢#:eA\€´v@/¬£È$¤¬&! e ¬*ÌUê<½Ô©EK Ì‹–˜--0×ÞUc¬+JˆtЭ*Z³j׉Z³ªŒzzÍSU[czÑS«2ŠÆë×Ú†ðêʽææÍ„55ð LõmñÒ†èZºV_ÄT*ë’2άŒ ÒAž°¢ךΨž1â8£ZÆxD¡T‹@WF墑B˜¦=×/ö ™œ°¦@W]<Õ¡®ŒºÊÁỂjsâݱ+% Vnwé OXÑ"ô¨·èÚy%€®ÒD¼)"º2êôÕV»ìéÓmZ1F’IHZMB@מþòíW)›*{Ä£#gt¢˜ºvÁèå/•d’W“|6:ñÄ7b£º¸xäŒöÁøZl´¯Í]ûÚ ôÖÜT–!#_’iô© endstream endobj 5697 0 obj << /Type /ObjStm /N 100 /First 1041 /Length 4158 /Filter /FlateDecode >> stream xÚ}œ½®&¹q†ó¹Š=¬&Y?$ è N †¡`ÙtÿùìÏ{¾ÂbßÖ4›U/Ùd=¬îñXñ¼ÇšOÛÿîë+Ïw›—íɹÎþ¬çÇxZ›ãü²§ÙÏ/šÏ÷üЧe®ûWî›&7›OoIÛõô‘ç¾í}ºç¹KkOÏlçWúÊs—6žÑâ´möŒ´ðgxÐ"ž‘Ñv-·¿A‹ùØváüZ ?mûû˜ûiÑÛcéÇÓÞ[~ZôýÍNh}ß~-üq·ãi?ÿ±±ûèy¤ Å|¢ Z¬'Æ8-Æû„sñhOä8žŽþħßýŸˉmÿÁþ¿s—áÏvåxº›å¾ýîcß*W§í|fk§ÝÑÜ"7Þgz;÷³öÌ#ÓþÕŸ¹Ú‹“ÏþqZ˜=k¼Ç+ógIÛx¶¤¶ûØ®õr—=Üïþçü\ûç8£[”ö£ïmÿ Æ‹ÖÞ¹N3?ÿ®ÓÌ÷È·¾h¶‡¾Ù<ñøûó´õß“„Y²¥õ—iâ»·Þ™'{ÐZ·ÿùü“}þÜòmᾚ_._boÛÞö2òÕÞ±ë}vºýó?üûoýíïêØÝàÏ?þô§QL;·ÛÚ|íÆ±7±vu+}h»^¿°Ûç0Žgwƒ"ŒuDŸÅ:¢7“(¢›x»ÝÄÛ…è®÷A½ý¬Œâ‹}}š{H/hê-š‡ÌÀ…æ!Sm¡y~bǶ¨‰ã×?_þ9„ñ2_õÛ+)=w±39ÅÎ8ä;ã ã<^Æa¶1Çîë« ‡©½3K{?ãÐ_µOì.ö…ýë8†xVqD«‚h/¤tr$ß³Lì»:u$ï]íGò³°µ;öb(Ú=»AFp;™9 ÍMÝBsÓ°ÑÜdL;š‹õŠÇîEÑåÉÑCžÈŽè!QtD—'~tD×祣Þï3öû0Žgwƒ* D_ê.¢/uÑe‹ÑÕ|DßQì {ñ`ÇîEgÌû–^ºØeñ†ÝÄîØeîŒÀ.ƒ=Žz»Õç0Žgwƒ*Œ#úÐ'`ÑO¦ÿÅnGô%Q¢» †!ºË”2Ôû}sùÅüù¥A…!zÊ2bˆž"®!ú”)hˆ®SÓ}É`ê­ÏižÝ ª0Žè¦K½#ºš_.—±ó†]ÆÎ;v$?êY+žo»Ó ˆÂÛ‰ˆîØ5ŒÀ®a$v™;~D7I6÷,Ã^ìn?¿4(ÂD¯Ñõ¹D×ç>}èõˆ>ôzÔ+©qoQ&!æC442E͇L‘@s“ç>ÐÜäþ‰xYq'!å•H®»q"¹‰³‰äºK'’»‘Hîâý¾ß~EÞIH–IH¢¹nӉ撘DsݦAF“Äü,˜³å±-‹Ç"ï5Ë$Ò4MÂ!M%ÖiZŠè £é 2~“üƒŒe^;ï$d–I¤iSoHÓ¦Ì5HÓtXˆ.—ƒŒ¶$ ñ×Rþ!Š; Yei~³HA𦩤išJÁŒ®; Ìø]x‰½Ø÷Ö„¬ò5½©[ û×™~r!CwRæ²»Ôè²]ÔèÕv±®ä4øƒ›>št3°w±ö!v†b˜Ø YÉ lôßÑæÛ0ðìnP…ÁP˜ºÅPÈpò»æ²×Üè²Üè.ƒ7º·"Š{0Z•¸yN§¿vƒè®Q z¨[ˆ¢Ë’mpã9GÿF?¿4¨Â@ô1ïˆ.½ƒ›ò`Àžz=¢Ë’mp£§Q\ùàiPDnzª[ˆž)vD—ãƒ]ðÔàFŸzÔ›Ÿ)<»a D±ÀM—c7]–fƒCNj nŒWïoØ‹Á¸gÔ°2ˆ£y4õ*°‹†ÐfÈÊl`ctµÍCòÇÃaçÜ¿âÊ­ ØŒ!’›!‡Il†œßÔ¦Î"¹.^Pcøç¬ÏîUh²›¡O=°rœcPcHžx¼ÝšËPCQ=Ýv僧A°‚Øl†>õÀfèS5†ÊÔ’Ôóó žÝ ª0]È߀ͼπÍïH×\Ÿ ¨ñÔ{¿Úöb÷ö+< Š(€ÍÔEØL9X0`3%ï3°1%ï3°15dz8[ó»AÆävêîÂ.î&¢Ëó 7¦.jpcjZ 7fµJÅ„d™„€›© ¸y*ß_툮snÌoÂCô¡÷A½Qì{yoY&!àfêª nj¾ n¦.¶pcʼÁ©‹0ܘV<ßw…ÒÊ ¥›©‰'¸™®î"º«»ˆ®$ܘr†`pcFñdÜJ++”n*L€›)597S3?¸15óƒSs¸1óóIÈ}@he…Ò ÍÔ-ÚLMü ÍœjGsM½ÀÆ” ›ƒÅî}W(«½ÛaM7‡5Sv‡5Svç«öÝÅnØ?ƒ_ ˆ—J5§¬òjNYåÔœïû‡ÙT…]®‡‹N¿+”^myiNÁ{‡4§ÔUÒœC¯Gò¡×#ù±#^ÁÝ~W(½¬P:¤9…»ÒœÂÝiNS·Ð\È×AFY}dœ^ŒÅ]¡ô²Béæ” ¥Cš3Ô+D—T×AÆzD—ØAÆŸ·<¿+”^V(ÒœRNrHsÊ2ëæ”eÖAF;qÊêë ãœoÅ• zY¡tHsÊ «Cšsª·ˆ>Õ-DŸ¢ëb3ÎU<w…ÒËÓ5çR·]^…rPS*4.ÉÀh\ºë]EW2èe…ÒaÍÕdJÁš«©»Ž]ž qINë@ãPw qõb0îó/+”k.©b;¬©«¬¹tW×ë]RcW/žï;ñ²Bé°æ’4ÊaÍ5´{D—S ×7a#ºé}PÏŠ0î ¥—J‡5µXsÉ¡¥ÃšK-h\ROr qé*4®¢ ä÷–QV(Ô\©Q ¹$ƒj®ToÑ|ª·h®« ÌX Å]¡ôr‚4—”$Ò\r4éæ’ŒÖAÆ%­ƒŒK3ZqUKí]¡ô²BéæZš/ Í—†±5¯”"dt5¿\^L¨»Bée…ÒiîÛ‰W‡4Ç«iê!Ím×ë » ÆAÆñjÆyqÛ‹äü®PzY¡ôCšûvêÖÄ®n!º¹ƒŒòfŽ/D×5p¡Þ(ö½»Bée…Ò¢Ëé/D7õÑ5Q]ˆ®¹ÔBtÝîê%¿+”^V(}!º«[ˆ.éöY™‡¤&5ºš ¢xŠ(òÁ»Be…2^†Bö…x Ùâe($i—¡$<^†"õ> E~.ŠÅ]¡Œ²B/C‘Ú=C!F@›RÚ‹†èSíˆ.ûE4Ô+ªIqW(£¬PFCtYé£!úR·}©[ˆ.Ùq4D—õ¢¡^ñBÜÊ(+”Ñ]vŒ7uªuD—$öŠ·‡·ÝÅ>°GÅ•FY¡Œƒ›ûvê–c—)ups´¦î&vuwbW•öÏGRqW(£¬P¸©ÏåÁÍÝ‹D1]ö±ˆ.I{ D—¤=êõ"Š{F•Êh.Û[ 4—÷"b ùPoÑ|¨·h.¹|€Å ©qW(ˤ6 É¥B†ärʆ䲻…!¹F’Kê†xþ9Œ»Be…2 Íuw34wuÍå< Íu‡0ÂQ/Š uW(£¬P†#ºðM8¢Ó=¢Ë)O8¢ëþæˆ.oÿ‡£Þ,©»Be…2Ñ…%Â]X"Ñu‡5º@tÝxõV+¢¸òÁ(+”qv†Ñ_õêˆÞ›voØÕ]Ç®÷9¢w]Ô6Ž^$çqW(£¬PÆ¡Í};ŒC›Û.ƒmêÔ9t6úP{Ã.^¢^qtw…2Ê e$¢ëÚ™ˆ®kg"º$ó‘ˆn¢ër—¨gEw…2Ê e€›úUN€›rÌàf—’_À]rü€»®‚pc/^‰»Be…2ÀÍ®nv]<ÁÍ®é9ÜØ¿ Ñ5?†{ñbmÜÊ(+”nÊë¾nv]$ÁÍ®ù+ܨýÜØ­àÆñyí=e…2 Í!ïE´94!„6‡®j`ãÐU l’(òÖ|qw…²Z¡Ö”JnšCRÑ„5‡$‰ 4Ygh²Î&Ð8Š·jï©,+” jêÇQ jêÇQ jY–f]£c¤˜0cQîλB™Õ–—惙„4‡,þ iYüd¦×#¹éõˆW¬²yW(³¬P&¤9ä¤%!Mý‚,!Íáê.šËr𠣡&È8¼ŠâJ³¬P&¤9$EMHS¿wKHS?lKQ?lKqÈqC‚Œ#Š)uW(³¬P&¤9BÝEôPw]rà%§LqÈË{ 2ŽÌ"Š+̲B™æ-)!Í‘ê-¢Oµ#ºä® 3êg{ 3ŽõùD*ï e–Ê5‡œµ$¨©Ç€ jJž@£É©y&/õ%ÐhE…2ï e–Ê„5­i÷GtÓµÖ4]kFÓµh´®jõ~}Šö}w…2Ë ešú[š:u`MjGt9ŸN ÑtÍŠ)uW(³¬P&¬©ßÛ%¬©ßÛ%¬iºØ¦‹-ШŸÂ%ÐhEN›w…2Ë ešú\š¦‹*¬iº¨–zD–M ñ×7jßGqoåaN‚šúe[‚šú×…$¨©_¶%ÌhòÞEÂŒúá^ÂŒxç]¡Ìr‚4]^HHÓåõ‡„4õ‹°õ+«]2à½ø¶8¿$„e…2!MýÞ(!Mý$&!M—“Ú]pQWlÑ[±{™Qe…2!M—¿'!M—o‹Òt]jAF}Û¢¸“²B™¦¾F‘¦›z‹èòŽ[ÂŒZóH˜Q?âJ˜ñ×éç÷aÜÊ,+” jê¹^‚šúõ¿”<ögžï¡hbf(¤æ6¡Æ_Ÿj}ˆáJAfY¡œÀ¦OõŠ¡Œi›º©O°Q÷ 6ê7YlŒ¼ç]¡œe…rB›ñj7g(BóÌ5ý"lÂú­Ö„CÐ{ÂQ¼ê5ï å,+”Ü ù &¸²¸Lp3†ºØeNÁ14lÔŸ3©yW(çÿW(ÿôó&y endstream endobj 5798 0 obj << /Type /ObjStm /N 100 /First 1028 /Length 3594 /Filter /FlateDecode >> stream xÚ•[MsÇ ½ëWÌ1LUèé/ír¹J‘âÄ)q‰Š.)6äJÞxµd–dEίÜGi½múÖjm7ð0ý3`áÊÓ<®u U¦"ó<%ÓA˜JÍm'®¡ ÒTëÜy Aì×e Iìç4…"¥x ,ù™Ž¤mÛ\b¶I˜§˜¸¶Q˜bá¶KˆSdnkCšbåf#ä)j;‡2¥DÍ“@S*”Úˆ§ÄÔFõ—lE²º £8O9•¶6†)—ÒvŽqÊ\Ú.1M¹–æUÔ†Ò¼Šú“”m-M¥d[¡pn8¢4*lE(ä¶"Í¥Ôp¤0QImmŠÑÃÿ¦‰ØöKy"¡¶6•‰*7M<‹xâ8‹ÚÐ ø°_tiC”çIA6_tSæÔ©,†('‹í—ó¤ 7»ê¸¢§6¢Iý±ÿåIç£ÚP‡¤Xs„T)ó$þ)R¥±«äÔùa¤!£<Õh±Tã5=ŒhªùaÄSUvÔ† ’y_êTÙâ«á©bѧ )$ ¥š ó\› Ñ0ǹùªas mKÒÔšsl;‘æÖ\Ì]͈0+ñj‰4»f6ºI³wn Šhò„¹Zð9hšÎ–9¬ÖBà¶/«µÍCnyœ,‘5ûBдhCµhn Y­-ψæ|0j-TsG· qNÍ„â 1X–(%!ÆÒL(w!&ËJ xˆ™l™ZÓÜ·ej-’‘¨ÏQˆ\gµ¦>©æ¤²bµGRC”œ†X£R´<¨j-%¶Yµ–²í«nP»mßÚR²¸+ß!ñÃfj-Õ¹<ûæ›g_ýmõq};ýów·ëË»Íõî÷çŠôlJ¤¹8Oo¦/æãÙdäOÏíçš°ÇóÁ惛6_Ü|²yjó?>ûêÕæãæÎ;¶\ðã³o¿="fÛŽ™bóâæ©ÍïÛ<¹yióšËÇóÆ¥Ó0šgËÉHw±HF:;ëÉHg¤d¤³CŒtöû{RO£HgG¿0ΫK‘dœWÇm2Ϋ‹]2ΫGÑ8çÙý>7òÂ<QΖ¿€È³qÆs£œƒKœÜ(o'íñ|²yïl£œ“ß¿‘Ç%œFÑ<[.Á ÛÎeNf›÷n‰Í» ÉÆ9¹˜ãÜ=õÅØ£ :;Z0@QŒtÿô#\þ#¹ÅH'‡®éìÑ{\NÃhž-Œ`éìr¤éâçtqA"#Ý¥ éÕ¡£Æ^»ïFÁgG ((Úv.æ”lÞ‰²Í» Q#]|îټ߇m~pÔ6Ï– F0ĶËÎLµyÇ.é.¥¸‘Þ®•ÇóFzr)ÅÆ^<ͱå‚ 6Ò“#‹ôäHg#=9Ôl¤{ùf#=ûý½</%CŒ`éÙ¹%FºËh1Ò³Ÿ7Ò½ª‹‘N~{cóÅò"ÃKˆéìÍéþ¹#]¼[Fºø}ŒôêoìÕÁ1%ËKˆ /!µ‘]*T#ÝËw5Ò½|×FzõÏ}M6ïPÔlóËXÔ¡~×b»yoÉæÝs\çÕŸ:UlÞ£¨6£Æ]žE]ÜAFqh|kŽ=ªól–ÉÍ·8T·:[bró‡˜Ý¼Å!žŽC]\@ÚïG ,Ñ{kqˆâæ-±ºy‹Cb7oqp÷¨–”Jž @,1’¼ŒrW#Õ`”»SSÓÈæ]è‚QŒrW$izµy:]$™gË#Æ99ƒqÎÞ-㜽[ƹ;Ϫ•Œ>tV2VæŠÅe°- °J³½¿86c¤»Ó´Z¥YÝiZ­d¬ÕÉJÆZý>ÆÞà”5Ï– F0ŒôêI4Ò]ÕS­Ò¬îvW­dt÷ŒÚJÆ<»ó¯¶’QçÁˆ‹Ë`[0@Ñ*Í<—R­Ò̳»ÕViê¼w«´ù䞤V3ê¼ R«uþôAkž-Œ`ˆmçbÞJMw0¬ÔôÞf#ÝRÙH÷‡T6ör X\Û‚Šl¤ûc$éÙ‘žôìÝ5Ò‹{²‘^KÙØ+ƒ'#§³£#Fº{S­Öô$#Ý•²µéÅÿÞHw%n-ÆÍ‹ H[0@QŒtò(Œt#¼»F:ywtW³Öbì=¼+êÃ(ùìhÁ†Õš^ùÈHg?o¤‹óŠŒtqO éâžo2ödðd,%ƒ†—2νqî ïJƹ?›É8÷gp«s˜j«ó £hy žQ­ÒT#ŽÂViæ¼ñhó.ÑZa¦ó.ÑZɨó\+sˆƒ£–——^BZ¥©Û¹X´JSçç­ÒÌÁ çþ ¶’Ñ_ÉÄØ /3J†—1Ò½`ˆ‘î)1ÒÝkó*FzÇ]#Ýß ÅØÔÝæÙrÁ†‘îCŒtÒ‹‘î ìj%£’j¤û“¼{ep ‘å%d|=¯Fº?é«‘îÊþZtò(ŒtdW#ÝµÕØãÓïr̳å‚ #ݽå¯ÕH—AÌëò–P¿8Ñÿº¹Òß–|¸Ïê€0` ƒ‡g¿ÿ®ðåõå.îVû;5ôæýîüÛûõóÝÕ›õ•3UG”" ƒŒAÁÀ7¶ýõöêíæn»>˜{q½½Þ¿Ü|¼¸Ùnî:» €r8u¯BìY\X8»útsñÒÛ À€'Ï¡.×| Ò³g;?Úùn³»z½Úÿ¼Þßv¬K–, GxsÏÚû¶©¿øiµû°>WÜÉûKo;W®\\Gø—æ®íÏv.^¼}~{»úåàÁŸ÷×÷7/®÷ûõvÕR÷‡íu'¸ `À&€M ?ÁÍÔM§ž¡G¾ßÝ­?ìmþåênuþæjuûÓùåvuÛ‰Eúô è3¢“ápîfÚÀÞ£O¯®WWÏw»ë_¾ß]­?y72È` ƒŒ@e¸š» ¸4ñhùõæÓf÷áõún¿¹<Ë€[·nA| ¼+ÝdT·—«›õ_Ö«»«›ƒá®·¿hös ]ºt(ðŒºiøÅþ`߬®6÷·çoŸ¿iŽ8³hhhâ ®Q7õ`b»¹Z_¬ÿÃëÕÕ»Íÿ>¬w£@F@F@ÆàœáwSìóöŸ¡Þï^­Õ‡]/¨ T T T Ânq7tÿvÀ¼[í7ןMþãõóÎ/Ö÷šî«€%€%€%à[à™äVÍÄÕúýê~ qº¸\m×ß­.ï®÷_0ïì 0 0 0 ¨øX»Iµ°ôns»¹ÿøŒ?Àþû¿þ­ºüõ×oÖ;üëí¶sªTà®À]º]*¼­Üõdaíá_‹£ìÁ©·ûÕîöýzßNžŽ€›j "©çÇ—“o¥aÐSekøUùÖûÍÇõîîTf® „k^dé€1 jÏ5yÕ\x¿WÚÏ_¯ô<ûtðæfuwùÓ¯÷?{ø-à“¶šOÐüÃØcÃ7ÛÕN ݬTïB Ž @Á _ ¾téq?¢»\6æGÙßöðÕ@ð:Âk(:AÑ)rßFy4!¡cNCþñ²àŘà†¯»G؈!yÐw‚¾S‚Ób¼*‡—ÎFl/×ÃÜ d5£à5T– ²‡>&o#?†#r'Ðd”HI:{ÐS*ý·÷£’½h/A{©Àgh'ºštÐxy ¸pÇ<†ÎÁcÈ$ú£J§!êaßEæè*AW‰à6„‘ ŒD§;–ÂòûNHHS‚œ¢Åª §JðgЖoiCÏ@@FÑUÐŽU2Hrº¢ Ëw-qî<™O‚x’$ y$§‹ð8/ª×˜:á‚P„}_:©5ª§KظìÍŠÔáRHBô’4‰éààÚ]â²ÃŸ; ±cˆ£‚eHCšx>ýy.-‚•Rè˜bl#Ĉ!FN¿ÕMËï‰|°Æ0ô±é€0€?áô·Ó´|m™*wl¤ŒQ´2ĉ!NO¿çMËw9úã•!ih¿+è·ÓX…Jq:˯™:á‚´1¤QŒ2ÄŠ!VœNgF^ö*åÚ $]‚:ˆC´8ŸN¼ì9(Ñ« CêRÇ((âÅ/ΧS£,¿–Ò $!yŒŠ:€?åtj”Å ÛR;á‚ö1´-:©Ð3|ú)Ëy;‡T}Љ:©5|Ó§eÇ0•N¸ …èq,hj,èbÔü| ¢eçI'\B†2ŠC´2êþðéÔ Å×3þò#ÿ£)€€2*B†¨1D‡xù%žK'\Bô]4Zê¤BÔ¸žN ^~Ncé„ RÈBF}Ç5†¨q=¼|-.A:¶€R(¨áгYФYdÔ©tÔ_|¼b(CA&Ð5®É\ŸÜF+>^5DÇhA‹hèº9‹„'÷Â-ZfmÔPP¢ tM kÓ[²—@ j((ÕÐUj«tð“¿NK'^PC¢AµŒ:R?)u>/ µ å´ ÇÔþê0ŠÄ¿öyáIo†º(ÐE.¢“µ uµtzUõÍðà-zUí/±ÀƒN мC§êÞÒýÆ%(¨@A *(¥”ßð¢ädÁ,R” ¤T ¥‚ÒP( æQÅ$PQŠ¢×þbì0€+ÄO­˜zcŠ TT ¢”†Âé©ãÞíG ¢è.h ¶¿B; à×'Þ~z'PQŠ TT ¢è>.‡vã§H\÷ƒŠŠ<ýˆÂAò¦‚½$ endstream endobj 5904 0 obj << /Producer (pdfTeX-1.40.27) /Author(\376\377\000R\000a\000h\000u\000l\000\040\000S\000a\000t\000i\000j\000a)/Title(\376\377\000S\000e\000u\000r\000a\000t\000:\000\040\000T\000o\000o\000l\000s\000\040\000f\000o\000r\000\040\000S\000i\000n\000g\000l\000e\000\040\000C\000e\000l\000l\000\040\000G\000e\000n\000o\000m\000i\000c\000s)/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20251213183311Z) /ModDate (D:20251213183311Z) /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.27 (TeX Live 2025) kpathsea version 6.4.1) >> endobj 5899 0 obj << /Type /ObjStm /N 5 /First 43 /Length 222 /Filter /FlateDecode >> stream xÚË Â0E÷ùŠYª I©(‚èÎ'>Vâ"h(mÅÄ…oÒ6 âÂÝ™aî™Ë `À‘1ˆ÷A„5Äg©‡b‘‘<'t¦Ï\/Ú€lY€(@ ñp$t®¯Ú:}gZú[+ï¶ £NVWeodi÷HF£E˜ 0ü¶}³âïΈøÃ¹}ÁþÏy&SeÜd–Ó†îîyS@'ÒÊKUº–…rCi ¡«‡½è²i5:º”Weš¬ëÚKÕYѽQaÜ oª×g@›³ßøE$oê endstream endobj 5905 0 obj << /Type /XRef /Index [0 5906] /Size 5906 /W [1 3 1] /Root 5903 0 R /Info 5904 0 R /ID [<42A1F853DC5CDB640D249CB178463F0D> <42A1F853DC5CDB640D249CB178463F0D>] /Length 14818 /Filter /FlateDecode >> stream xÚ%y`[Yyöu´;vâ{­ØŽã›Õ±ãÄNÛ±ÇIlj—x‹ÄKÇrBY Ãj‹X ÄVÄh( DÙÄó2ËP ˜R‰”i(E”¥bªJ¢¢Â|ç÷òÏ/:ï]ružç½ºË{Žm6›íq»Íf·)›­^ÿãšwÚmϽGL;±.bwi:€“رuš.à&6A,@Ó¼ÄÖˆ­Ñ¬Ût,-ÿÇšµ ŽX±UšÛÁb»ˆÝ¦Y b‡ˆÝ¢i‚b=ÄnÒôÄÎ[¡Ùšˆ]$¶L³ì"6Ml‰f ØMì±Eš­À²ÛÜ]vb7hî{‰™Ä®ÓÜö³ˆ]£y$v„ØÍ6pˆX±yší ƒØ)bWiÄÆ‰ÍÑ<Ž»Jl–fè&¶Bl†æ1p\Ç"ÒÏÓ4{À b;ˆMÑì}Äv»B³œ$vØ$Í0HlØÍSà41éÓqšCà ±Ybc4‡ÁYb·ˆ]¦yhyÜe±K4ýà±íÄFiŽ€‹Äv»HS\"v”˜¬";#&ž¼@Sh‚˜Ÿì^¾ÌbÒ§çiJGL“>•C“Nœ%&Ç|–¦ Wñü9?äk‰x Ää˜ÏÐá¯ÛCLºDL³Hì±Ó4ÅpËÄÆˆIwŠYo›!6HSŒ~›Ømb"…$‰ÎϦ—ØIš’`b’G"£$ç]b-Äúh’ØYìžl,hc>È’ìY;1éØ4Iö¬“Øibx(K²gÝĤcÓ$Ù³^bÒaø/K²gu²{›Ýĺi’ìÙ:bb8¼›%Ù³;ˆí#v”&Éž5ˆõÃ÷Y’=Û@ì±Nš${v'1œÉ’ìÙ&bb4Iö¬NvoX:Œ|Ë’ìÙÝÄÄè‡h’ìY‹Øebäj–dÏî%¶@ì M’=«“Ý[­!Fžg‰‰Y÷Ó”"&'-ÙLþóbòì¥)ÞIL’XþKùÒº7jÖêˆY4¥Ãº‰5“ÕÎ>Nì±Ý4E¨ÄDKùª"r1éÓ]4qIö$1?1é&–$&&l¢‰;³§‰ÉñIãììb«ÄvÒ$+²:]j2r²yȨìyb’$ 4ÉÆìbâ?‘–LÎ^$vŒ˜A“dÏ^"6DLlA²gLjIâì I²g'ˆÍK‘ìÙ+ÄÄ“u4Iö¬Nömí.bbG’=;KÌGlM’={•Ø bbe’=»@Lüç¥I²g¯oHìÙEb‹ÄÜ4Iöì21ù1”"Ù³:Ù·ÅÄCNš${ö61IbI?’={‡˜üÚi’ìÙ1ÑWR—dÏÞ%vœ˜¦Nvõ Nöl,ÐÊ4nHL;±)bwi:€“É´±NÓÜÄî Ðôýõ·•Hì5š5`1|ãÍZPG ‘7Vin;ˆõ»M³ÄFˆÝ¢i‚bœ©7nÒôÄèìš ‰gÇešÍ@÷Uí2gê%š-`71L¸±H³XÄHØ4÷€½ÄH¦ë4÷ýÄHœk4€ƒÄäøh¶CÄæˆÍÓlÄHœ«4ƒNbœ 6æhZËÚ-Œ¹1K³ t#Ù7fhljq²Ü˜¦ÙNã$³1E³ôã*cã Í~p’É´1Is %6Aó8Ml’Ø8Í!p†˜|1šÃ@[ª®•d߸Ló8OŒ“ÖÆ%š~pX3±Qš#à"±½Ä.Ò”—ˆ&&«ÈNLj‰_.Дš v†˜ì^¾Ìbò=ÎÓ”Ž˜&ÆIaCM:q–Ø]bgiŠZ™ºP=1ùZ"Þ1ñÁš"üub$݆t‰˜f‘ØIb§iŠá–‰qº!Ý)f½IŒ+äAšbôÛÄ–ˆ‰’$:{ê b'iJ‚ˆñ£¹!2JrÞ%&ý×GS'¶}U'{ã~ ¤{‰)`'Æ™uãMp3ôÐt71éÄã4=ÀKLÌpŒf ØFŒËänšµ Ž¿]4·ìÛGk‰¥Y bbê#4MÐ@ŒËËNš>°“Ø0±Ã4A1Îü4›Á.br"k§Ùv‘Ñl:ٷǹÚh£¹ì%¶ŸØAšûÀ~bÜòl )8HŒËóý4e‡ˆI_ÉfòŸw“Ô^šràÄî“ÿR¾´î¶mÄ,šÒaÝĸ}ØÃ•Î>NL´ÜMS„:AL[¾ªˆÜGLbÍ~p’˜ŸtÓ$&}ÕDó8Mì&1éâ! wµ# 'ø4‡ÁYbü mˆ<çÀybÒW 4ýà±+ÄDÚp‘ØubÍQp‰˜œPÄ—–vGŽ_Ä4ÇÁ1ùÅR“à 1IÄ:šS`š˜üˆˆgÀ,1ùñÚFsèd¯ï•ÿC¬<ˆÉ ÊKó¸NLN´’7À"±NbnšK`™¿º’B+à&1ùÁuÒ¼n»@LÒoÜ!&¹e§¹t²×GmÄ$u×Á]b’G6šÚMŽì]Ó6pê—˜vbt˜ÿ.MpãrÆ¿NÓÜÄ0µ?@Ó¼Ä8HÿͰ¦ñß¡Y êˆ!ž•æv°ƒ¿jþÛ4ë–»¾Âe·ÿM4ãJÁ“¦ì$ÖDl…f#h"&ǼL³ì"ÆIË¿D³ì&†ðþEš­À"Ư³ÿÍ=`/1NPþë4÷ÎÆ:Wþk4€ƒÄäøh¶CĸRðÏÓlÄøÕõ_¥yhoYùs4€£  tƒcà8è'@/èýà$8­l­¯·ñi Q‹¼ôk‘}÷ï‚;€üõ‹¤;‡Á²í…ìà 8Î*[[‹ÄÎ `\£à¸ ÆÀ8˜“à ˜Ó`Ìù¾ÒÒCÒuÒ§ÒÙ¢‚È#º‰ ¢´X@¼!¦7‰ÍÄbLq¬X9ú"F/Úö.:¦.º-ŠwýÊÖaʺ‰Ã(zù4ÏÃ)yºÕ úÁ(¸Í ¤ëÁ^Ð΀Ip.õ`78 zÀeÀ£ƒ®Ep—u€GHy®ÂCŽO"+óÍ€W=óü”ÏïûÁ`¯²Ýžÿ²ðh¾•~Á£4‚6p´ƒpô‚=ÊvïÙË ›uƒcà8è'À0èS¶'ß“-N‚Ap œC€{:¿|·sà<úBî©¿’mýàÝ9Æ'®Pæ/*Û³¾.K/Ë@–Ê%±tΘ¢þ,˜W\-ƒ+ÊöÜqÙÕ¸®ƒ`ȹs‚ Ãd³›àÿ­(Û‹ÎÈ^VÁ뀗ír[À¡¥ñiÍÓú'c³´`Ñ4¯ÓÀ Æ4.Ië«‚ÿ·¬‡AÒòö°è“Ñâ²@Þb•4.IËKBùßäÕ .I£~šKƒ*J§÷ôM[ÊöæWÉ^°Oû¤±O[¤ee‘î Ð2ÒX -ÍNe{¨Iv€#Ò8"#Ò˜!}Ò} Ÿð„ÙßÄ'iʼ‘Æi¼‘Æéq0 lï8,{ÆR鳫¤±EúÀ/i®mÓ˜!Òc친=@UÓÊö®—ÈN¯¬’Æ%i\’Æ%i\’Æ%il‘Æé%€úé°•í½O”]áˆ4ŽHË%6>Hãƒ4Hs­Ü%š”íÃoãò·KÀr—8 ¸xA ظjÇþøµ²ív°puÝ¥Íð™)Y`€à;A#hÍ ´(ÛVI¶h{€¼úÝä…ï ¯yÛ€ÜÊŽeûÒ‹eò6W^ßvyiËÛÒ®ãÊ–é•UxAÛÕ ú÷ ]€·¯]¼ní¼PíâÍh×°²=òw²í9À[Õ.?àΡkUå0xeÚÅDר²}ãU²¯L»xGÚ5 x3Ú5Årh×ÁŒ²=š”•çÀõRÙ¹ËRí€æeä.#w¹ËÈ]Æ ed,/)uÖ”Íäár—‘»ŒÜež³ú¥;9™—J씕×éN æIâò=¥¦öI“‚®@=\|z¸øôÌ{”Šœ¥ @gü’Sšµ ìõ€[}®ÿ<\õy¸êópÕçáªÏÃõšgÞ§Ô­iÙA Ø ZÁ^°ì<0à2Ïw_~ÅÛi ºÀpH©»Ë®:Àa VéÇÁQ¥žøiY…·-~ŒÎŸ‡KDÏ|è'Áà—ožù¥žñ˜l{ 3@žtœ矧r¤b=ù–ÁQjã%²—q0&Á0 ¦À4˜R¯rU©¼E6›R×r HåÊ ¾dþ†R/Ù!ë­©W¹Ve)”|yæ¥ðD¤]Wê•–lq˜žð$kÓ®ÔWþ\‡‚ ›N¥Þü'iJ}‰Ôžxm¢þ&êoÊÓÚ=|B¼Íz¥“ÍðÁ¦`†M̰‰61Ãæ.€ú›¨¿)§ Ù >Øìû•zÛAÙÕAp`MäÞDîMäÞÄ ›Øbá7ÔßDäMDÞDäMDÞDäMÄÛ<¡Ô;¥ë6yjµ‰¾›è»9Ì£&n-mW¸îá¶Jêi{s œSê}C²-VÙDÆM{m^H»9®Ô¿-« ù&šo"òæ @ÕM ²©sÿÏ—õ¨ÓòË×GîMäÞÄ ›(¸©ñ¹¯ÉzX` lÊC6„ßDøM*“6~Sê‘ÖyŒ&ED:÷¿¸ ÛŠî±ÀôÏŒùRù$…@¥²w¤ÉC¶fð‚ õCµ@*„êÏáš·+uÿ‹²™ ¤.È\:äJ°…¦  ìRê[¿‘ÍZ¥>Í<ëk¦À§™Šžæ€:žæÃ@gü÷öÊí ƒã!`óÐ:•ú3²ÊQp  [©’%KO€^ÐN‚Sà4ðƒ àTê·ÉfCà À%ÍòÆ]žYò|²yœWê³²2&›/ƒ10΃-ùß®€)0 äi褲«ZÙlð¨³y,€kà:X7Á¢²»?%[,yý³ŸÎ–^‘o){Ý!YeÜk@¼q£+`è¶)û.~޽aφñAØ j”=˜•X%¼ w¸VÙ÷“Ø"Œ-Â<Õ c0aa|–ò.”KñWƒ²w<*›QÆHa©öBÆp‹²÷|S–Jµ"‡qD˜ïÆ>aJ¹Âø LWƒ„)Û c†0ê‡>Ü­ì'?&»’ßÙ*„{”}ðqY€˜!ŒKÂýÊ>ôY€-Â8"<¨ì£q‰á’0ã’ð²Ïœ“rÞ8 0Mø<”}ñDz V c‹ð%€-ÂÈÆá e_ýެ7 pIX^ô‘á0£ìwÿMV¹ 0Ho„ñF#…. /ó @zM¦ßTö'½]¶½0C„W•ý)–o„xH6ÃCUTqI—Ty$_ÅUù®²?k—¬‚Kªœ2ªœ2ª¸©ÊÙ¢Š_ªø¥ŠAªõÊþ~Ú|÷÷½€´¯â—ª©ì/í“ýq©âœ*©âêNeù„,ÅCUÎ%ÕVz¨Óu/ ‹«˜¦Š#ª{”=ü,ÙBJQ¿*…8§*¥ø¥Š_ªX¯Ú xQíTö×½D¶å4R=ΑZWñK#UûV©âê eóUÙ 7UÙB®cåp9ƒT±O¿TñK•“Gõ´²¿íe3ìSÅ>UVå!m µbýÊñ²yÙv w ¹cÈCßúÆÎ*òrrôCЂÆÐ2vA9^ù9ÙÕ%À?†‹MÔŠ+Çëž)« |Œð1”Ž¡t ¥cˆ£>†Ò1”Ž!rŒ"÷.‰Ii;JK2Å•ãMß•O([RÁŽÒ1©[¿Ç7¯µ`¨QŽûslVBýýRRʵÄHöê—¾$EéœJRŠŽú%)@GÆÒåx÷uÙLŠÍ¾„ð%©)Gø’T’Óu%N %ô-íVŽ÷Ëfä~ áKÈ]BÆÒ^åøÐYŠð%\RÂ/%,PÂ%,P¢bÐæ%©[:ªšl‹JÇ>(ღ)‘û%4/¡oé¤r|ú›²(aÒÝDÆ—ÎðIjuåÿÅ %Ä+UŽÏËɲ„›J”U”°E [”ðA‰d/a>(qz(¡~‰´/!| áKè[šQއ'eø „JX „}JŒ}(ñÖ7*LJ¾¥åHçe q(‘ì%|PÂ¥{ܪR`±,ZÞUŽG Ò´p©}ëVNÛ‡å‚ÞC¬x•ã±?ÊÛ@-¨;@=0€ uË;A;hRŽïÞ–ÈèÐ dÀ Cö #Ú€ÔýSÀ¿Ü¡ÿþ)ÙËa …þGµ$ËÇüË=€Òûå.åøÑ/e‹^@‰þòr÷N%þò þ~yŒ€‹`øÁ)åøùsd/gÁ9pžróé˜ú🽲Þ˜“€‚]¿.ËÓÊñ›e½Yp̃p \wÎîß?WVæpYªmnÛ`Ük`{D/Ÿî)ÇÿÍHQ ¥9[(½…Ò[NÀoy”Ó/‡±…ª[ÛArz’Cä-DÞBÕ­Êiero!÷2n5(ç®WËäÞjÔmI‘¬ ¨@é-$ÛÚ­œ{Ÿ"+£ùšoȽ…Ü[øe‹q[H»%#7ºÀèTζ_ËèÎ-Ù=roÉ( DÞê'‘So¡ÖÖ rvÞ‘Ídô… ·@î-ÝBä-¤Ø:¯œÇ²>ØÂ[è»E-Óªnᜭ+Í·¦EN[è¶5§œ}k²TÝBÕ-TÝB­­ëÊ9¸O–.yµ/·õ¨ºÅ`*¿|ÝZãiZn­*ç™?H‰¾ØbëK ¯~5€ŸV`¨A«£QÎç¿QÖkZß±¿”f- j¨u¨µš@ ‹öŸrNÿyM`hµ¶ ìò @ã8 œóÙ¶ ”µv€NÐN‚£Ê¹ø Yù8zÀ ÐúÁ90 œ7ã²2L­§Á æ©U^àÉf2ÀE«ø˜¬,ce(wj•Ñ0—Œw™S`\9ŸØ!+O‚+|#é]Æ¢´N+çS3²t0¶¥•Á,­×eV­7ƒTZWCSZo¤´®†¡´¢oH„ZRÎg ÈN×Ò†h†6Äð’G¢cC.H ”àLº§œŸë“-ø Õ*èBˆbìHˆZº †šèÀËNËfX „ú!Ô5pC_…;„Ü!ô íTΰK¶@ýê‡Uá—z3¤ íUÎ×_“U°Oˆò½ê‡P?„ ¡å|ó—d,Â!*üBBø‚†N(ç[{e=Ô¡~HÎÞT†>t0Ú)4¤œï˜”•yŒÂ%!ŠCò=Ð<Äè¤Ð¨rþíÇe=ÔaJ‡ãÂ!F6…pDˆ¢¸Îéül!ÏZäX;$#Œ”óC)YŠð!±$C”P?$“P?$ª¢oH§ó'^ [àƒø@!Éà"4/È"4/H]ß]åüä·e)Ù]Dr5‚Ò/„Ò…:åüÁe=Ò¹€x}â~øåCÚgêpDGšñ yB¨B‹r~åû²úÈîê(/, já@Ú½Q8¤œ_D¶@й_8 ¶€´T- ~¼,0æÌ r¿€ªT- Y¡_9ïFö‡ ˆ\ ± H[@ÚÂyjÚä{ já‚rþó×e ÌP » è[@ßÂ8 Ï ˆ\@ä"¹@¬ •þvXöBN¤jU ¨ZXZ@ËŠrþ[NVÆZ†–Ñ¥ w)TÀÀ \À êM9JÆoõ‚° Ôí`‡r5 cºdƒmüR¼¹hA='+ËЭVÀ€­Ñ}€!Y£±FÛïFÛƒ®F©ùe¨ÕèÐtžÿî?e§GAèÇÀqÐ ú@?:§ÿøNÙŒÒÑSà4gÀYpœ”™ŽR‚•ÞWÁEå²=&»º ÆÁ˜WÀ4˜³€bÕÑp \7À"X«`^¹\/’=/ƒpH}ìm°FÝ«zG¹êŽÊÊëà hÆ>ÎNÿ€r]ÉJ áã§Ê6ŽÜqäŽ#w¼ð-ãhg€_¼ oÜ©\­c²Lg¨_œ2Ý8ˆËˆ¹ÊÕ¶(«4¬Gó8šÇeŽˆËÐ<Ô#|\Fà!|\ÆØ¡V¼]¹:]²+c‡ðq”Ž#r‘ãˆÇ ñ¹ã}œKèˆø08©\]/–½ ”Ž£t¥ãˆGäø8«\'^/+_ø%~P‚Gä8úÆÑ7޾q¤+×ÀeÙl 0éˆ_þ7TÏ*×Ùœ,Å4ñy€úqÔ£~UãKÊ52#ë¡yÍãh_å=JÇo+×åÊ*¢¾ÔDËW½Ë*6 ¿Î©€rE~%1hñ®uI“*`›¼ö‚P êÀv°ÔƒÀT®¥’mùa¶ùÀ.Ш\+Êê©m’ö§øt´(×MYÚ ö€½`Ø/Ù¦\믕ÛAèiÛdøä1 ƒ»”ë‰o–•{€ šì2,r€¯¿Æ'ž—ØN)×ÿ#+JŸm w´”ÛüÊõ§¬2¼h» ²h›ÊõÂ/È* E´Í Úæ€ü0K±ù"XP®?,+_×Á °´ÒõyYºnÛ@”–Zv9úõ¶v>ÝU®pA¶¸GŒO¥\ßHÈ'$ 8”믒&uðô  o}Û"9€´¤ èÓúƒ†l†K&@ä"* E~ÛŸÿ£fÐ(³ jÀHç¢tqUÈد\ñªlË+µ…ù¼  =€¾F·:”ë½o•õP:€Ò øè@߯ãR‚ܯ\ì–•‘;€áô}iƒÊõáoÉR9žœ¤E—¢wh­2’Ugü'de?@óÀˆrm½Xb2°uHÕ®Œ›½ Æ”+óˆ¬Â#ô€T’O¼À¼À‘QŸÑù²l#˜!€UKà&À|#Å|Íו+ûÙÉž#Ïs(³)×cÔ½îÈa•œ8•Ûùu¹2g9”ι•+ÿ€¬‡-r8"‡#r8"‡‡r¤}oä0C3ääR3äP0‡´9íˆ|Xv…r˜!‡r˜!‡räyûä€í—ñ¨ŸÃ9²;G&ç/‡Œ¹ƒÊUx·ì[äHû\À9Ìà 9Ìà 9œ“#ís¨ŸCîåÈéœþÍûe§ìdÏ!|NžŸ¢tisH›#ÙsŸ£l:… 9´ÌéŒÿ¯ÈÐ7'£’eÈñ´rý¦Q tNÆŽÌ)×ï¾"1 ’cZ¿ô$¹ŸCîrç;'ƒŠE¨kÊõ§fÙ ää?ɰ@õsØ'Çy#'Âßc[÷* ?ïg9ð›`E¹{–¥Œ×íe o¯6CíK%Ƙà^`Ôoo-`äF/y{[Àvå6>,+S±ßë ßím ée”n/8½»•»é ¬ÌˆÜÞ=€q¸½ûÁpô‚6åÞ]++w€Ãà8 º@7`I¯TIýà$`dIï }ʽ7$û; †À0 Ά¡ôúÁ¸Hñª"Å#ÌÞË` ˆ—”ûÀ?Éþ&À0¦Á ˜s@†™Ï\~ Èò@’3óƒ_CÆ‹3ð»WËÓþ9ù?n4¾ d¨8oFSle@wïºry»¬ŒæQäŽÊèo‡r?ù”Œ —AÞE£¨K¹×dA ¡ÝÛ ÞFé(JG‘6êããp£èmTîáû²m3`Øu”AQ¤"ht¯rûß+«ìR„Åx¡èåù,hR%/£„9Ú 6Ú¡ÜWÞ"ë!|á£E²è1å¾úYŠúQLíX Š¢X Š¢ÈEî(]EËèYå^:/;@ó(šG/ü½ÔEß(jEÇ”ûö¤lÈQDŽ"r‘£ˆEä("G9*òȨ¨Ê°d[—€ÈQT¢jU£¨]ët6ÿe…-*hY‘Qö÷”û cs„¯0$«‚´¤­ e-+Ìà÷+÷;lrnç€*H[A¨ŠŒŠ'‰+:‰Ÿá•Ê}FwUÈäŠ ÄGߊ µGøŠ œG· ¹Z!k+:±Ÿ3%;@é êWPºBêV¬rP¹_´"« r‘+¨ZAÕ ’Uº•û•õ² ãÆ*¨ZAÕ ªV΂“ÊýšgÈ*¨ZaàY…t® m[THÄÊ9å~£X¾‚´…´¤­ m T¶Â” ~YU+x¼‚né°)å~óÿÉ®»‚Üä® w¹+ ô.šWd„éW¹®Üo}¶lư¹ rW»‚Ü”® t…<¯¬ƒ»ÓÙLbg0‰ÁÔuFVæ¼80ÓÔLSg09ÁätSÒLIg0ÁDtÓÏL?g0éœÁ¤sSÍL5g0ÁœÁsÓÊL+g0™œÁdrSÈL!g0qœÁÄqÓÅLg0IœÁ$qSÃL g0!œÁ„pÓÀLg0ù›ÁäoS¾Lùf0Ñ›ÁDoÓ»Lïf0©›Á¤nS¹Låf0›ÁnÓ¶LÛf0Y›ÁdmS´LÑf01›ÁÄlÓ±™Ü“˜Ý Ø8 ¸xA ØjAØv€z`€@ÔߥÜ_}@þS¹¿÷UùÔš@3ØZÀnÐ ,°ìûÀ~pmàhà0èGÀQкÁ1pô€ ô~p €Ap œCà gÁ9pøÁ0.‚Qp \c`L€IpLi0fÁ¸ æÁ¸®ƒ`,e°n‚[à6XwÀ€up >o2Mfß3™}ÏdÎ=“9÷LfÚ3™iÏd~=“ùõLfÕ3™UÏd.=“¹ôLfÐ3™AÏdÞ<“yóLfË3™-Ïd*<óA1ƒO¹¿õeùßô§Òãò õ™Ïd><“ùðLfÁ3™Ïdî;“¹ïLf¼3™ñÎdž;“yîLf·3™ÝÎdN;“9íLf²3™ÉÎdþ:“ùëLf­3™µÎd®:“¹êLf¨3™¡Îd^:“yéLf£3™Îd:“9èLfž3™yÎd¾9“ùæLf™3™eÎdn9“¹åLf”3™QÎd9“yäLf3™=ÎdÎ8“9ãLfŠ3™)Îd~8“ùáLf…3™Îd.8“¹àLf€3™ÎdÞ7“yßLf{3™íÍdŽ7“9ÞLfv3™ÙÍd>7“ùÜLfq3™ÅÍdî6“¹ÛLfl3™±Ídž6“yÚLfgk ÷Èýr¿Üo ÷Èýr¿Üo ÷Èýr¿Üo ÷Èýr¿Üo ÷ºMÐ|`'hM ì-`7hØö‚}`?8‚6p´ƒpt‚#à(èÝà8zÀ Ð ú@?8 À 8Nƒ!p ƒ³à8üàÁ(¸&€h®/v~V#ý|Y¹¯È§IpLi0fÁ¸ æÁ¸®ƒ`,e°n‚[à6XwÀ€up >ǨŸ@ýê'P?ú ÔO ~õ¨Ÿ@ýê'P?ú ÔO ~õ¨Ÿ@ýê'P?ú ÔO ~õ¨Ÿ@ýê'P?ú ÔO ~õ¨Ÿ@ýê'P?ú ÔO ~õ¨Ÿ@ýê'P?ú ÔO ~õ¨Ÿ@ýê'P?ú ÔO ~õ¨Ÿ@ýê'P?ú ÔO ~õ¨Ÿ@ýê'P?qŒq€hž@óš'Ð<æ 4O y‘ˆœáÇ•ûK¢ÑUå1ß)ŸP?ú ÔO ~õ¨Ÿ@ýê'P?ú ÔO ~õ¨Ÿ °2e>¦ËôQ á£ÂG-„Zµ>Š)|­5€8* |L¦é£ ÂG„2e>Ê |ÔLøZ¹S§ ÂÇ„4>Ê |Ì·é£ÂG-„Zµ>j!|ÔBø˜~Ó'ÔQøZR á£ÂG-„Zórú(ˆðQ8áke”3¥>f¾ñQᣠÂGA„‚³vú¨ŠðQᣄÂ×Ê“w¦ÉñQá£*ÂGU„é<}”Fø(ðQBák¥‚‰ét|TEø¨Šð1øÉÇ<Ÿ>ê#|ÔGø(¡ðµŽf¡ *Â'U”KøZ§Á ˜sà* PÒ¥>J#|”Fø¨£ðµ.žQ$á£HÂG‘„" E>Š$|Iø˜àÆGi„©E}ÔGø¸ó÷Yhn¡¹…È–dü‚òÔž—¥Ì€î¿¨<{öØ”çØ‰á XøÀÂ>°ð…,|`á XøÀÂ>°ð…,|`á XøÀÂ>°ð…,|`á XøÀÂ>°ð…,|`á XøÀÂ>°ð…,|`á XøÀÂ>°ð…,|`á XøÀÂ>°ð…,|`á XøÀÂ>°ð…,|`á XøÀÂ>°ð…,|`á XøÀÂ>°ð…,|`á XøÀÂ>°ð…,|`á XøÀÂ>HÉÍ7>HÉ[7r?Eî§Èý¶H¡y ÍShžBóš§Ð<…æ)4O¡y ÍShžBó”<¥Cóš§Ð<%åhžBóš§Ð<…æ)4O¡y ÍShžBóš§Ð<…æ)4O¡y ÍShžBóš§Ð<…æ)4O¡y ÍShžBó”¼iEóš§ä­š§Ð<…æ)4O!rJ4w)OÇw¤ÃÎ(Ï™3ò õS¨ŸBý”<:µ¨ŸBýê§äá<ê§P?…ú)ÔO¡~ õS¨ŸBøÔYå9="»ŸUÞ—»ãAå}§NÄK÷4ÆöjŒÿ«ÆäQYÊáÞ—z[)µVž)9­ßçèïK±¥_Ç~&1™zƒƒ¼?ª<Ó.Vå ïËÄ+2 ‚ÞŸPž™oèÿcö•s§Ái\ý“ÆüÿÓX(i\ûƒÆ Æ"Xri,o×Xi¬|ë‚Æíð;ÕÿѸóqµiÞ¤±Ѹû{ÏÐxÂó5þbEã‰~'=SãÉ/ÑxÊ'äp¥¬L&™Vž¿,èO³k<Ð~­ñô¬Æ3^¨ñL¶}Ö)ð g¿Mc£Vã¹ÏÓxÞ¿k<Ÿæ 4^øY»zñ¤ÆKž£ñÒÑxþòk¼¢ªñÊ]¯zHãÕlûš'i¼öµ¯Û¯ñú ÆþAãtØ_óÞÌ7Š–5¼®ãÐz·Æ[郿ù•ÆÛ×xÇ8û{gB#ñw=¦ñn4¥ñ^võ>¼ÿóIèƒ,ý]üa:û#—4>út½AããÈø‰ßk|ò¬Æ§Ö56éˆO¿Cã3|ßÏNi|ޝbåÏ·h|aIã‹‘ç´twÞ×× _BÁ/¿]ã﨑þ¥ÆWÚ4¾ú|Y™óÕ}ÎW÷¯+Ï×°Ï#ç_ÿÞ¥ñõûÙÜUo|Tã>K¿yXãÑqþ€Æ¿ü³Æc_ÕøB}û·ÿJï~÷§ß;¯‘_Óø>ÛþàŒÆåG˜ëÇô}a@ã'ìàg]?Ÿ×øEXã—oÔ(f4~E•¶ÌÊÿuSã×5þ›•ó*ß> ñ»¤Æÿ|Nã÷ßÔø_‡Æú5ªìùÿF5þxYãO³¯Ú”צ{׫ÒvÝ÷^§N ¯Këëuk½ž›ÒWœÇïs¿¿Læq>½¿¢¼^­¾·Fw±wÛœFí ¬Ì¹ý>çöû«Ê[§ëÝ®µôîÐ9ã­¢†¡sÆkú€Îoƒî{¯Ošwg³Fãv émÒçoóŒÆ®Ó@÷Ÿ·E ïÝ­ÑÛªûÔk]ÓØã:Ž{õ×÷î#¶ŸÆ!ƒQC:¼íZKoÇ6 ½áíÔùá=¢µôÕ]ìíÒr{±Þñã=Õ‰¿ÑèÕfðö½U£ÿg'?£1ðlÁ§hœÒ2zO¿^cHûÀ;ÌW8»¬qN+ã=¯uó^Ðçï_úâˆÆ(]réA1m`ïø+4&t’x'uþz§è—i­–wFëæÕ–÷Îi¹½Wù2ó:­¼ ¡q­Wã:;¸Ñôiλ¨Ýä]ú–Æòh¬ü¯Æ­FðU/Ð'ï¼ÆÚO4Öõ©À{W'¢÷Þ³4ž 3Þû¯Ñx"ø$jÞ'Mã):»½OeOCž ñô‡Enl(#ו÷úTê}ûl:ñÙtØs>¤±ž{Pãy|­à˜Æóµ½/ÐNô¾ðo5^„ _¬OÈÞ—ðÝ^:¬ñ²n—#Å+hþ½ûJ<ôª/j„?­ñjlñÚ HŸÆëøôzþË7°¿7ê£÷Mß×økú êôÁƒtlLg£÷!·Æ[ñýßìHö6ºÞ·ÿ“Æ;Ո볷÷tD‚ý½ µþö=ïæÓ{èç÷Ðxÿ“5’ú¾Ö_­ñ!6û𥯘ÅÜÏÔÔ~¥jžÏánésŽ÷ó|­/è¼ô~ñi_¢ÛÖ§\ï—ÿQãïõ‰Ç›Æ÷þ˯¦_»"{‘Ë_þNƒß¥¼ÿÓøúû4²6o jÜ×'nï7I¿Gÿ¨ñð-}Z÷~û ßù¹ìŠóý2Ñtò~·IbÛTÍÉ:ùT«jæÞ"ŸêTÍSµkž®-PólÝ5ÏÝ’Ì”î—"Å$ó~ùfÎ~¿¼0’12>^ ¸ø )þYUóê×é½¼‘×ú´Yóà=ù¤ïÞƒ|Ë ß2ÈŸw2„%Èá9Ü 3‘™ >È»» 9!È'AþRS?Jd˜jɃÌJä/•ùkAfÑ2Ûtºª ÂÌpd¦ê ãÔƒ”>™Ù(HñMù̃Ô[ùÓAþøM?Ðäl°0ÉE9çƒ [ òÇ«‚Lµdž÷ ’ƒÌkdÊó z+ÈÝA^ë™–>ÈÊò‚üA¦ ÓúyñäÏ™¼;È´†AæöRd¢Ð /!È_¢ 2ÿx ½ƒü‘¡ ÊQ&ˆ2A” ¢Le‚(D™ ÊQ&ˆ2Af7 òÇ8‚”^©·25¿[d2ú ƒSƒü¡– ¯âƒü8™Õ"ÈtÚA;ùË"A¦1 2½Q¿àdŽóà:`Œb¬Ðg¤šRñјGø<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<ÂçµðMú±æaž5(`à.àà5`¨u`;ØêLÐ|`'hM ì-`7hØö‚}`?8‚6p´ƒpt‚#à(èÝà8zÀ Ð ú@?8 À 8Nƒ!p ƒ³à8üàÁ(¸.ƒ10&À$¸¦À4˜³`\ó`\×Á °–À2X7Á-p¬‚;` À:¸ ^_ªÕ|“QMI„O"|ᓟDø$Â'>‰ðI„O"|ᓟDø$Â'>‰ðI„O"|ᓟDø$Â'>‰ðI„O"|ᓟDø$Â'>‰ðI„O"|ᓟDø$Â'>‰ðI„O"|ᓟDø$Â'>‰ðI„O"|ᓟDø$Â'>‰ðI„O"|ᓟDø$Â'>‰ðI„O"|ᓟDø$Â'>‰ðI„O"|ᓟDø$Â'>‰ðI„O"|ᓟDø$Â'>‰ðI„O"|ᓟDø$Â'>‰ðI„O"|R ߬/±k~Ä8ÃæZìÀœªæúÊ·æÇ_±ý§Fá: endstream endobj startxref 647876 %%EOF Seurat/build/stage23.rdb0000644000176200001440000000654115117330534014565 0ustar liggesusers‹Í\ëRÜFsánð…`ÇŽ! 6Ì€m⌳Tù¶c²ëÊjã£P¬‘f% ˜PÞÚ·ØßûXÙÈïT Þ>ÒÑL«§5  ãuUû;@«Ï×çÒ7]^ŽH’”“†òôÿA/Òÿ$ip–þ|ÁûyH¦¸¼ KLb«.Ñä½cÙ¶Þïóöº¬Y²i¹2Ñtþp šš$ å˜k Uí•«îS‰m±¸õìÉ“í§»|eǮ٤NiŒÃO>¥vYî`èª"½ª®„ŠC’ÿï7®Êà¶Yã(ä¿Û}´r«W"fÍÒtsŸ³€°rÞTÄáš-m·[~ç.vuz«6š”Ñüaó¿å™Ÿ×ùßrÍP å\ÐÍçÏ^켬¹­¼]š¸qÔTÜF³R¥ÿþXwÍÕJu¯¥¹«Ý¾C´»÷ê÷+/H‹z¹ÒPÍÊŽé’}pùcõ˜ØN¹Ê{6w¤q ϪÀ'~ÇGGÇ¡QUÚ‘4r×ÀˆÙÙÐîöK ºÜ;.ÌVÄõi½¡w‰hTäçQâ'ˆfÕZ bºª«[¦¬›rµ¢£‘é/þX®F'Kˆw9VP®¤æÛ| ~•A, hà0¢3É…b¹¿lW¿ƒá­ˆxåËIÈ µæ?Ó„j¯ |¥ÿ®õ3 bùÿp ×%Ä+('²‘PkAQ ]u"ô ΠœÌ(©|ê?`KF¾¹ÐöÜÛ9ìòè<©”ÔHÎqu×%N’G‹ $¶J*ç€úY±$tÎèYéä«[Ïn øÐbIi–).có*¢‹§PžJÍkD–­½IÍ]ŽM¨„$GPÉ‚Pƒ¸–ŸÐ0’ΔÐUj![ß/ÛDkÕ¼ņ<׬©sñ 2¤¤«(_MMð‚,ÓE¬zLy=ýîñãø´F‘ÊhûSÒº(Ëu¢º-›8‰™!@zÓæ¢,^&æ5Ž\Æ3ÍŲìÔTƒ”=vfþšê&‰¶ $xå©Id¹\.Ç&3‰&¥ÎF šLn)6&ÀÙU}f³mËQ÷E³mÐé \°ô{¶Ân˜KÚ}o¶ý -iÉOî±$¤­Ð þ“´TDC97¯…A>t7å|&/ |!Õ*Vh«àä 6·[ˆ«(¯f–UyÅÐÍ×wÈSÕ^YM˜¹Œù=x–Ôç×Q^LÚ®–g×P^ËÐB5K ; n ñ6Ê·S;E9qFÝA¼òý m »¤¡WÒ:ÊëýzAý bé7Kh“OD=‡\“sl”ÁËsº¶Ó9ÄM†\o™5 ‰Mtq å¥óäËè/À›(ßìú[ bé7 æ´ï#y"¼û‹Éq£x3®ècF½üTmÙªËšÞ ¦C驆ÜÙ¨Ö-[®Y¶M’2Ê7<ïgŽ ¥-”·ú[ þ!ƒXúMƒ9—;ÇÏ{ç1©Íb4Ž¢<šYd_"Û?Ú€Hfîá$ :xåDÃf¼PžE‡ÞBù= “ ~™A,ý¦Áxc(—‚3§˜ì®a_Ãð(ú˜Q4ßÚ”é Lƒ˜FtûT̵ä–CRÆ6žBüåD«Êx±} =ø%Ê_ö?¨@ýƒXúMãC´@€ç´¦6’Ü^ºŽÑ ˜~MãÏ,aœv ¬MËn¨†þÑ‚ÓUÝ”pD\F9ÙP{š‹<0.wï¢|7ËظƒºÄ{(ß;ÿ¼¾ŽÑ xåD[ôt ê×ÄÒo̱ù9æõ(sê“àG’ŸÐ€SRûæ`–ɽè,Az{1µáWñ“8^B\C9Ñ X†Éýfà—('šÆâ%7¨»¸r¢i+^r„! øÊ_õ?«@ý±ô›†Œð|’{°\.Ç$ö±ä'2à0ÊÙ%õ̦½ï=çÈMš34§-–¢ HŽ!Ρ<—Y6÷>>ŒLg ³„XF¹|þé êæ+(WÎ??Æ \Eyµÿyê×Ä’QïG5ˆWîiìöœ”6‡S™`Îϳ6bI˜ ü­ÂØt þJ &„)þÝÔÈÜüDòG2ÀTûx¹ù F óØFÊ™—t÷€Ý¶Ë𔆬jPéhª»q'WQ^ÍÌ>åP5Z"Í£QÞo -`Ú˜.…øI/6OÑbIi•)þQѸ´þ€Lõà‘P똢§fëÍÎ9T—Q@ãâû •E S‡Špáö!{·ð‰·ðÞ-Œ{ëÄ”3Χ5à/@,ýö#s3ÃpZß=€3UðŽts?4Ds÷|Yµ‰¬ªº¡îd=.æL?Ãç ¤Þ,Ò›Ö¶Ä’l ébhǦÚÐk ï%´`ª–¢‡›’â°w&»B®_IPcü]7›töJ9“?©h”±O¦Û¾¦^s¾g„A,­9?ù«­»§¥sLÆ«’¿ø|„ò£ ¤gÖÆÞqݹê?¢¶~ä÷j%ùí _D”Q–“v¢«eÜQJߢümÿÃÔÿ‰A,y † ¢ŽÑÐéµÔ –Ê >Ç`ºÕN×Ùsòл-ùYx åD¶Dx¦f™5Òt#4 2DõÛ3 þ ƒX’ «V.x8¤3øw»-% JѼšÌ µf[ðbtð¢7¿IÆšÔ½R\u¯£a`BPgXÑ,Óu‰ã2K<•àåÂv‚°©Î åíŠC\¥ÕWÛ=n’pár¦¨Ôõý–ÍV½ÄUTjv¸‡|ï¼ÍÔÛÆW)¯˜–+àÃUÒÈ?Ì0ñLqZ{í5U»úÅNuÁ%&9ªY†÷Eö%3=.)*Ác×íêcBÖ~À•.‡ÛŒn^¯›ZèÒ¹.ÛBÔX¦qŽœžíæ|×=¸`TXiÏ2´îJ+èub8l{WºX¾ø,8Ç9ƒkÏqm+¿ÑªE­†ªŒÐ|h5¼/I0µ.cÆÙÈÄ¡ÙõFm4 ¦a¾+Qñ„©]c²kL Þ×!¢H)Íׂþ‡µÌSÓÙØ˜ïjåPµOi%8-äc‡³L{mÐ3=Ç›D%ç7µEýfKÑ–n¿?ÄšYÅÐ,—uˆhˆe¶Xízň¹ÓŸHŽÔxº+È#Áв )4JÆêMÖ"Oа««|¦Ý‰Ê4ÎtZj¡‰ÊÈÐ6¨µZn¸£‘£õH“ÔtÕ÷¹+QO5œs`b¸¢RÕž5CüGzpR´:ëùQÁjºvËìÁm\iÒaž¢3»Ö£" <|ƈrµ¨hnYg ¸ö»î§Nï%8æqãå:uME=| wêôŸc® îkr|dÙÚØæ”jàÏ+Ž÷¥Qøñ‹ ÿc5½VRtêanÑ:Éóuw/8Õþ=Ìv¥i±j«e×Î⿼¢îí FùˆÊ‡Äf£¢åÊMZÍ }" ÒPuC¬œÏâÒªNw¸‘Î ^||(*ÿ‚3…v…qAcÊslZMGçÖÌ\^7Mր¦•ÐLËÏ×yjˆæÁì0¤¼Þë5ŒÒ´Nè,Z#§™ŠQKáž%x±ODï¢ÒTk¯é´ûÿrŠÙˆmaxé&:f覎){ÑCßð³‰Ó2\gÃÖ–—ªÞð¾àô÷ײ g}}½ª½BR¯˜Yyqn~mné­`_xÃ'ëaåzg_ÈîÛàwù®ã*æÃ[þ’ÿû(„UÆÀæÏ¿ÿúï¿oo6Ïú­^Á§•–cWœÕ&•j€ZÅß…Vœc‡ícòW¿ÏÏa ræy5Qðh|•›]¡ øÛ«çÕÅù5a@°¯Š Ð&g>œˆ˜i«»ä%ÓÑ’wt·R'Ý®¼y{«©“_ÃÛ·oO|AÐÇUì àLÊ>–”=}Ï_deáÎÜüš  HpåÙ$]àæ€¦míª÷}½ ¸ =D÷ào\§~2¿N¢ÿ º÷9véópW“y¨Û;þFäü¼Ã$N†ÞÉ);çIú>|4%!é’²UÝ|êmг þ¹w:tràºMg½R¶ËÕµðhQÙ²÷+8ýmÐÀ:ƒ/ÎÝÆ.>AùI&!F×£eA²宊rèŸ4sdQ¯ØÿV¥ö0—|h[ …wý=S^ý*þêÆÛ±E¯kØ÷Œ¾Gùû´v8Ó1äd`ŸSÓ½…iú:¾…t_´Øç(~@ù‡Ì¦ÁÎêxûÅVuçùîγ§ÙØ"ÁZ˜ámö!)ÁZ8á8Øañ²0Áƒø&ðÏ£{ÿ1öPAYÉd<R4KϦß+gXÛReѽ\Áž~òש}<øø‰ª›tçn’Œü¼ßÏ6…h+°·j(k™ŽÜÞ¹ß%¼ñ¨j¸E ¥Q¶_\.5mÒ¤{P0©·ß}ð«üCBEÞ¤Ó¢V¥ßÿñ!Û\Seurat/man/0000755000176200001440000000000015117326655012303 5ustar liggesusersSeurat/man/AddAzimuthScores.Rd0000644000176200001440000000114515056057544016004 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{AddAzimuthScores} \alias{AddAzimuthScores} \title{Add Azimuth Scores} \usage{ AddAzimuthScores(object, filename) } \arguments{ \item{object}{A \code{\link[SeuratObject]{Seurat}} object} \item{filename}{Path to Azimuth mapping scores file} } \value{ \code{object} with the mapping scores added } \description{ Add mapping and prediction scores from Azimuth to a \code{\link[SeuratObject]{Seurat}} object } \examples{ \dontrun{ object <- AddAzimuthScores(object, filename = "azimuth_pred.tsv") } } \keyword{internal} Seurat/man/TransferSketchLabels.Rd0000644000176200001440000000341515056057544016646 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sketching.R \name{TransferSketchLabels} \alias{TransferSketchLabels} \title{Transfer data from sketch data to full data} \usage{ TransferSketchLabels( object, sketched.assay = "sketch", reduction, dims, refdata = NULL, k = 50, reduction.model = NULL, neighbors = NULL, recompute.neighbors = FALSE, recompute.weights = FALSE, verbose = TRUE ) } \arguments{ \item{object}{A Seurat object.} \item{sketched.assay}{Sketched assay name. Default is 'sketch'.} \item{reduction}{Dimensional reduction name to use for label transfer.} \item{dims}{An integer vector indicating which dimensions to use for label transfer.} \item{refdata}{A list of character strings indicating the metadata columns containing labels to transfer. Default is NULL. Similar to refdata in `MapQuery`} \item{k}{Number of neighbors to use for label transfer. Default is 50.} \item{reduction.model}{Dimensional reduction model to use for label transfer. Default is NULL.} \item{neighbors}{An object storing the neighbors found during the sketching process. Default is NULL.} \item{recompute.neighbors}{Whether to recompute the neighbors for label transfer. Default is FALSE.} \item{recompute.weights}{Whether to recompute the weights for label transfer. Default is FALSE.} \item{verbose}{Print progress and diagnostic messages} } \value{ A Seurat object with transferred labels stored in the metadata. If a UMAP model is provided, the full data are also projected onto the UMAP space, with the results stored in a new reduction, full.`reduction.model` } \description{ This function transfers cell type labels from a sketched dataset to a full dataset based on the similarities in the lower dimensional space. } \concept{sketching} Seurat/man/UpdateSCTAssays.Rd0000644000176200001440000000074115056057544015554 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{UpdateSCTAssays} \alias{UpdateSCTAssays} \title{Update pre-V4 Assays generated with SCTransform in the Seurat to the new SCTAssay class} \usage{ UpdateSCTAssays(object) } \arguments{ \item{object}{A Seurat object} } \value{ A Seurat object with updated SCTAssays } \description{ Update pre-V4 Assays generated with SCTransform in the Seurat to the new SCTAssay class } \concept{objects} Seurat/man/ReadSTARsolo.Rd0000644000176200001440000000061615056057544015037 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/convenience.R \name{ReadSTARsolo} \alias{ReadSTARsolo} \title{Read output from STARsolo} \usage{ ReadSTARsolo(data.dir, ...) } \arguments{ \item{data.dir}{Directory containing the data files} \item{...}{Extra parameters passed to \code{\link{ReadMtx}}} } \description{ Read output from STARsolo } \concept{convenience} Seurat/man/DimHeatmap.Rd0000644000176200001440000000463315056057544014611 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R, R/convenience.R \name{DimHeatmap} \alias{DimHeatmap} \alias{PCHeatmap} \title{Dimensional reduction heatmap} \usage{ DimHeatmap( object, dims = 1, nfeatures = 30, cells = NULL, reduction = "pca", disp.min = -2.5, disp.max = NULL, balanced = TRUE, projected = FALSE, ncol = NULL, fast = TRUE, raster = TRUE, slot = "scale.data", assays = NULL, combine = TRUE ) PCHeatmap(object, ...) } \arguments{ \item{object}{Seurat object} \item{dims}{Dimensions to plot} \item{nfeatures}{Number of genes to plot} \item{cells}{A list of cells to plot. If numeric, just plots the top cells.} \item{reduction}{Which dimensional reduction to use} \item{disp.min}{Minimum display value (all values below are clipped)} \item{disp.max}{Maximum display value (all values above are clipped); defaults to 2.5 if \code{slot} is 'scale.data', 6 otherwise} \item{balanced}{Plot an equal number of genes with both + and - scores.} \item{projected}{Use the full projected dimensional reduction} \item{ncol}{Number of columns to plot} \item{fast}{If true, use \code{image} to generate plots; faster than using ggplot2, but not customizable} \item{raster}{If true, plot with geom_raster, else use geom_tile. geom_raster may look blurry on some viewing applications such as Preview due to how the raster is interpolated. Set this to FALSE if you are encountering that issue (note that plots may take longer to produce/render).} \item{slot}{Data slot to use, choose from 'raw.data', 'data', or 'scale.data'} \item{assays}{A vector of assays to pull data from} \item{combine}{Combine plots into a single \code{\link[patchwork]{patchwork}ed} ggplot object. If \code{FALSE}, return a list of ggplot objects} \item{...}{Extra parameters passed to \code{DimHeatmap}} } \value{ No return value by default. If using fast = FALSE, will return a \code{\link[patchwork]{patchwork}ed} ggplot object if combine = TRUE, otherwise returns a list of ggplot objects } \description{ Draws a heatmap focusing on a principal component. Both cells and genes are sorted by their principal component scores. Allows for nice visualization of sources of heterogeneity in the dataset. } \examples{ data("pbmc_small") DimHeatmap(object = pbmc_small) } \seealso{ \code{\link[graphics]{image}} \code{\link[ggplot2]{geom_raster}} } \concept{convenience} \concept{visualization} Seurat/man/ImageDimPlot.Rd0000644000176200001440000000645615056057544015120 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{ImageDimPlot} \alias{ImageDimPlot} \title{Spatial Cluster Plots} \usage{ ImageDimPlot( object, fov = NULL, boundaries = NULL, group.by = NULL, split.by = NULL, cols = NULL, shuffle.cols = FALSE, size = 0.5, molecules = NULL, mols.size = 0.1, mols.cols = NULL, mols.alpha = 1, nmols = 1000, alpha = 1, border.color = "white", border.size = NULL, na.value = "grey50", dark.background = TRUE, crop = FALSE, cells = NULL, overlap = FALSE, axes = FALSE, combine = TRUE, coord.fixed = TRUE, flip_xy = TRUE ) } \arguments{ \item{object}{A \code{\link[SeuratObject]{Seurat}} object} \item{fov}{Name of FOV to plot} \item{boundaries}{A vector of segmentation boundaries per image to plot; can be a character vector, a named character vector, or a named list. Names should be the names of FOVs and values should be the names of segmentation boundaries} \item{group.by}{Name of one or more metadata columns to group (color) cells by (for example, orig.ident); pass 'ident' to group by identity class} \item{split.by}{A factor in object metadata to split the plot by, pass 'ident' to split by cell identity} \item{cols}{Vector of colors, each color corresponds to an identity class. This may also be a single character or numeric value corresponding to a palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}. By default, ggplot2 assigns colors. We also include a number of palettes from the pals package. See \code{\link{DiscretePalette}} for details.} \item{shuffle.cols}{Randomly shuffle colors when a palette or vector of colors is provided to \code{cols}} \item{size}{Point size for cells when plotting centroids} \item{molecules}{A vector of molecules to plot} \item{mols.size}{Point size for molecules} \item{mols.cols}{A vector of color for molecules. The "Set1" palette from RColorBrewer is used by default.} \item{mols.alpha}{Alpha value for molecules, should be between 0 and 1} \item{nmols}{Max number of each molecule specified in `molecules` to plot} \item{alpha}{Alpha value for plotting (default is 1)} \item{border.color}{Color of cell segmentation border; pass \code{NA} to suppress borders for segmentation-based plots} \item{border.size}{Thickness of cell segmentation borders; pass \code{NA} to suppress borders for centroid-based plots} \item{na.value}{Color value for NA points when using custom scale} \item{dark.background}{Set plot background to black} \item{crop}{Crop the plots to area with cells only} \item{cells}{Vector of cells to plot (default is all cells)} \item{overlap}{Overlay boundaries from a single image to create a single plot; if \code{TRUE}, then boundaries are stacked in the order they're given (first is lowest)} \item{axes}{Keep axes and panel background} \item{combine}{Combine plots into a single \code{patchwork} ggplot object.If \code{FALSE}, return a list of ggplot objects} \item{coord.fixed}{Plot cartesian coordinates with fixed aspect ratio} \item{flip_xy}{Flag to flip X and Y axes. Default is FALSE.} } \value{ If \code{combine = TRUE}, a \code{patchwork} ggplot object; otherwise, a list of ggplot objects } \description{ Visualize clusters or other categorical groupings in a spatial context } \concept{spatial} \concept{visualization} Seurat/man/DotPlot.Rd0000644000176200001440000000530015056057544014155 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{DotPlot} \alias{DotPlot} \alias{SplitDotPlotGG} \title{Dot plot visualization} \usage{ DotPlot( object, features, assay = NULL, cols = c("lightgrey", "blue"), col.min = -2.5, col.max = 2.5, dot.min = 0, dot.scale = 6, idents = NULL, group.by = NULL, split.by = NULL, cluster.idents = FALSE, scale = TRUE, scale.by = "radius", scale.min = NA, scale.max = NA ) } \arguments{ \item{object}{Seurat object} \item{features}{Input vector of features, or named list of feature vectors if feature-grouped panels are desired (replicates the functionality of the old SplitDotPlotGG)} \item{assay}{Name of assay to use, defaults to the active assay} \item{cols}{Colors to plot: the name of a palette from \code{RColorBrewer::brewer.pal.info}, a pair of colors defining a gradient, or 3+ colors defining multiple gradients (if split.by is set)} \item{col.min}{Minimum scaled average expression threshold (everything smaller will be set to this)} \item{col.max}{Maximum scaled average expression threshold (everything larger will be set to this)} \item{dot.min}{The fraction of cells at which to draw the smallest dot (default is 0). All cell groups with less than this expressing the given gene will have no dot drawn.} \item{dot.scale}{Scale the size of the points, similar to cex} \item{idents}{Identity classes to include in plot (default is all)} \item{group.by}{Factor to group the cells by} \item{split.by}{A factor in object metadata to split the plot by, pass 'ident' to split by cell identity see \code{\link{FetchData}} for more details} \item{cluster.idents}{Whether to order identities by hierarchical clusters based on given features, default is FALSE} \item{scale}{Determine whether the data is scaled, TRUE for default} \item{scale.by}{Scale the size of the points by 'size' or by 'radius'} \item{scale.min}{Set lower limit for scaling, use NA for default} \item{scale.max}{Set upper limit for scaling, use NA for default} } \value{ A ggplot object } \description{ Intuitive way of visualizing how feature expression changes across different identity classes (clusters). The size of the dot encodes the percentage of cells within a class, while the color encodes the AverageExpression level across all cells within a class (blue is high). } \examples{ data("pbmc_small") cd_genes <- c("CD247", "CD3E", "CD9") DotPlot(object = pbmc_small, features = cd_genes) pbmc_small[['groups']] <- sample(x = c('g1', 'g2'), size = ncol(x = pbmc_small), replace = TRUE) DotPlot(object = pbmc_small, features = cd_genes, split.by = 'groups') } \seealso{ \code{RColorBrewer::brewer.pal.info} } \concept{visualization} Seurat/man/BuildNicheAssay.Rd0000644000176200001440000000201115117056267015572 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{BuildNicheAssay} \alias{BuildNicheAssay} \title{Construct an assay for spatial niche analysis} \usage{ BuildNicheAssay( object, fov, group.by, assay = "niche", cluster.name = "niches", neighbors.k = 20, niches.k = 4, ... ) } \arguments{ \item{object}{A Seurat object} \item{fov}{FOV object to gather cell positions from} \item{group.by}{Cell classifications to count in spatial neighborhood} \item{assay}{Name for spatial neighborhoods assay} \item{cluster.name}{Name of output clusters} \item{neighbors.k}{Number of neighbors to consider for each cell} \item{niches.k}{Number of niche clusters to construct} \item{...}{Extra parameters passed to \code{\link{kmeans}}} } \value{ Seurat object containing a new assay } \description{ This function will construct a new assay where each feature is a cell label. The values represent the sum of a particular cell label neighboring a given cell. } \concept{clustering} Seurat/man/ProjectCellEmbeddings.Rd0000644000176200001440000000554715056057544016775 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/integration.R \name{ProjectCellEmbeddings} \alias{ProjectCellEmbeddings} \alias{ProjectCellEmbeddings.Seurat} \alias{ProjectCellEmbeddings.Assay} \alias{ProjectCellEmbeddings.SCTAssay} \alias{ProjectCellEmbeddings.StdAssay} \alias{ProjectCellEmbeddings.default} \alias{ProjectCellEmbeddings.IterableMatrix} \title{Project query data to the reference dimensional reduction} \usage{ ProjectCellEmbeddings(query, ...) \method{ProjectCellEmbeddings}{Seurat}( query, reference, query.assay = NULL, reference.assay = NULL, reduction = "pca", dims = 1:50, normalization.method = c("LogNormalize", "SCT"), scale = TRUE, verbose = TRUE, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, ... ) \method{ProjectCellEmbeddings}{Assay}( query, reference, reference.assay = NULL, reduction = "pca", dims = 1:50, scale = TRUE, normalization.method = NULL, verbose = TRUE, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, ... ) \method{ProjectCellEmbeddings}{SCTAssay}( query, reference, reference.assay = NULL, reduction = "pca", dims = 1:50, scale = TRUE, normalization.method = NULL, verbose = TRUE, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, ... ) \method{ProjectCellEmbeddings}{StdAssay}( query, reference, reference.assay = NULL, reduction = "pca", dims = 1:50, scale = TRUE, normalization.method = NULL, verbose = TRUE, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, ... ) \method{ProjectCellEmbeddings}{default}( query, reference, reference.assay = NULL, reduction = "pca", dims = 1:50, scale = TRUE, normalization.method = NULL, verbose = TRUE, features = NULL, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, ... ) \method{ProjectCellEmbeddings}{IterableMatrix}( query, reference, reference.assay = NULL, reduction = "pca", dims = 1:50, scale = TRUE, normalization.method = NULL, verbose = TRUE, features = features, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, block.size = 10000, ... ) } \arguments{ \item{query}{An object for query cells} \item{reference}{An object for reference cells} \item{query.assay}{Assay name for query object} \item{reference.assay}{Assay name for reference object} \item{reduction}{Name of dimensional reduction from reference object} \item{dims}{Dimensions used for reference dimensional reduction} \item{scale}{Determine if scale query data based on reference data variance} \item{verbose}{Print progress} \item{feature.mean}{Mean of features in reference} \item{feature.sd}{Standard variance of features in reference} } \value{ A matrix with projected cell embeddings } \description{ Project query data to the reference dimensional reduction } \keyword{internal} Seurat/man/MixscapeLDA.Rd0000644000176200001440000000323215074241310014646 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mixscape.R \name{MixscapeLDA} \alias{MixscapeLDA} \title{Linear discriminant analysis on pooled CRISPR screen data.} \usage{ MixscapeLDA( object, assay = NULL, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "LDA_", seed = 42, pc.assay = "PRTB", labels = "gene", nt.label = "NT", npcs = 10, verbose = TRUE, logfc.threshold = 0.25 ) } \arguments{ \item{object}{An object of class Seurat.} \item{assay}{Assay to use for performing Linear Discriminant Analysis (LDA).} \item{ndims.print}{Number of LDA dimensions to print.} \item{nfeatures.print}{Number of features to print for each LDA component.} \item{reduction.key}{Reduction key name.} \item{seed}{Value for random seed} \item{pc.assay}{Assay to use for running Principle components analysis.} \item{labels}{Meta data column with target gene class labels.} \item{nt.label}{Name of non-targeting cell class.} \item{npcs}{Number of principle components to use.} \item{verbose}{Print progress bar.} \item{logfc.threshold}{Limit testing to genes which show, on average, at least X-fold difference (log-scale) between the two groups of cells. Default is 0.25. Increasing logfc.threshold speeds up the function, but can miss weaker signals.} } \value{ Returns a Seurat object with LDA added in the reduction slot. } \description{ This function performs unsupervised PCA on each mixscape class separately and projects each subspace onto all cells in the data. Finally, it uses the first 10 principle components from each projection as input to lda in MASS package together with mixscape class labels. } \concept{mixscape} Seurat/man/SCTResults.Rd0000644000176200001440000000263615056057544014614 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/objects.R \name{SCTResults} \alias{SCTResults} \alias{SCTResults<-} \alias{SCTResults.SCTModel} \alias{SCTResults<-.SCTModel} \alias{SCTResults.SCTAssay} \alias{SCTResults<-.SCTAssay} \alias{SCTResults.Seurat} \title{Get SCT results from an Assay} \usage{ SCTResults(object, ...) SCTResults(object, ...) <- value \method{SCTResults}{SCTModel}(object, slot, ...) \method{SCTResults}{SCTModel}(object, slot, ...) <- value \method{SCTResults}{SCTAssay}(object, slot, model = NULL, ...) \method{SCTResults}{SCTAssay}(object, slot, model = NULL, ...) <- value \method{SCTResults}{Seurat}(object, assay = "SCT", slot, model = NULL, ...) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods (not used)} \item{value}{new data to set} \item{slot}{Which slot to pull the SCT results from} \item{model}{Name of SCModel to pull result from. Available names can be retrieved with \code{levels}.} \item{assay}{Assay in the Seurat object to pull from} } \value{ Returns the value present in the requested slot for the requested group. If group is not specified, returns a list of slot results for each group unless there is only one group present (in which case it just returns the slot directly). } \description{ Pull the \code{\link{SCTResults}} information from an \code{\link{SCTAssay}} object. } \concept{objects} Seurat/man/ProjectIntegration.Rd0000644000176200001440000000435015056057544016406 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{ProjectIntegration} \alias{ProjectIntegration} \title{Integrate embeddings from the integrated sketched.assay} \usage{ ProjectIntegration( object, sketched.assay = "sketch", assay = "RNA", reduction = "integrated_dr", features = NULL, layers = "data", reduction.name = NULL, reduction.key = NULL, method = c("sketch", "data"), ratio = 0.8, sketched.layers = NULL, seed = 123, verbose = TRUE ) } \arguments{ \item{object}{A Seurat object with all cells for one dataset} \item{sketched.assay}{Assay name for sketched-cell expression (default is 'sketch')} \item{assay}{Assay name for original expression (default is 'RNA')} \item{reduction}{Dimensional reduction name for batch-corrected embeddings in the sketched object (default is 'integrated_dr')} \item{features}{Features used for atomic sketch integration} \item{layers}{Names of layers for correction.} \item{reduction.name}{Name to save new reduction as; defaults to \code{paste0(reduction, '.orig')}} \item{reduction.key}{Key for new dimensional reduction; defaults to creating one from \code{reduction.name}} \item{method}{Methods to construct sketch-cell representation for all cells (default is 'sketch'). Can be one of: \itemize{ \item \dQuote{\code{sketch}}: Use random sketched data slot \item \dQuote{\code{data}}: Use data slot }} \item{ratio}{Sketch ratio of data slot when \code{dictionary.method} is set to \dQuote{\code{sketch}}; defaults to 0.8} \item{sketched.layers}{Names of sketched layers, defaults to all layers of \dQuote{\code{object[[assay]]}}} \item{seed}{A positive integer. The seed for the random number generator, defaults to 123.} \item{verbose}{Print progress and message} } \value{ Returns a Seurat object with an integrated dimensional reduction } \description{ The main steps of this procedure are outlined below. For a more detailed description of the methodology, please see Hao, et al Biorxiv 2022: \doi{10.1101/2022.02.24.481684} } \details{ First learn a atom dictionary representation to reconstruct each cell. Then, using this dictionary representation, reconstruct the embeddings of each cell from the integrated atoms. } \concept{integration} Seurat/man/SpatialImage-class.Rd0000644000176200001440000000061415056057544016236 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reexports.R \docType{class} \name{SpatialImage-class} \alias{SpatialImage-class} \title{The SpatialImage Class} \description{ For more details, please see the documentation in \code{\link[SeuratObject:SpatialImage]{SeuratObject}} } \seealso{ \code{\link[SeuratObject:SpatialImage]{SeuratObject::SpatialImage-class}} } Seurat/man/merge.SCTAssay.Rd0000644000176200001440000000203115116120241015274 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{merge.SCTAssay} \alias{merge.SCTAssay} \title{Merge SCTAssay objects} \usage{ \method{merge}{SCTAssay}( x = NULL, y = NULL, add.cell.ids = NULL, merge.data = TRUE, na.rm = TRUE, ... ) } \arguments{ \item{x}{A \code{\link[SeuratObject]{Seurat}} object} \item{y}{A single \code{Seurat} object or a list of \code{Seurat} objects} \item{add.cell.ids}{A character vector of \code{length(x = c(x, y))}; appends the corresponding values to the start of each objects' cell names} \item{merge.data}{Merge the data slots instead of just merging the counts (which requires renormalization); this is recommended if the same normalization approach was applied to all objects} \item{na.rm}{If na.rm = TRUE, this will only preserve residuals that are present in all SCTAssays being merged. Otherwise, missing residuals will be populated with NAs.} \item{...}{Arguments passed to other methods} } \description{ Merge SCTAssay objects } \concept{objects} Seurat/man/FastRowScale.Rd0000644000176200001440000000130015056057544015121 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{FastRowScale} \alias{FastRowScale} \title{Scale and/or center matrix rowwise} \usage{ FastRowScale(mat, center = TRUE, scale = TRUE, scale_max = 10) } \arguments{ \item{mat}{A matrix} \item{center}{a logical value indicating whether to center the rows} \item{scale}{a logical value indicating whether to scale the rows} \item{scale_max}{clip all values greater than scale_max to scale_max. Don't clip if Inf.} } \value{ Returns the center/scaled matrix } \description{ Performs row scaling and/or centering. Equivalent to using t(scale(t(mat))) in R except in the case of NA values. } \concept{utilities} Seurat/man/Graph-class.Rd0000644000176200001440000000054215056057544014737 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reexports.R \docType{class} \name{Graph-class} \alias{Graph-class} \title{The Graph Class} \description{ For more details, please see the documentation in \code{\link[SeuratObject:Graph]{SeuratObject}} } \seealso{ \code{\link[SeuratObject:Graph]{SeuratObject::Graph-class}} } Seurat/man/SlideSeq-class.Rd0000644000176200001440000000156415116120241015372 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{SlideSeq-class} \alias{SlideSeq-class} \alias{SlideSeq} \title{The SlideSeq class} \description{ The SlideSeq class represents spatial information from the Slide-seq platform } \section{Slots}{ \describe{ \item{\code{coordinates}}{...} }} \section{Slots}{ \describe{ \item{\code{assay}}{Name of assay to associate image data with; will give this image priority for visualization when the assay is set as the active/default assay in a \code{Seurat} object} \item{\code{key}}{A one-length character vector with the object's key; keys must be one or more alphanumeric characters followed by an underscore \dQuote{\code{_}} (regex pattern \dQuote{\code{^[a-zA-Z][a-zA-Z0-9]*_$}})} \item{\code{misc}}{A named list of unstructured miscellaneous data} } } \concept{spatial} Seurat/man/HVFInfo.SCTAssay.Rd0000644000176200001440000000140715116120241015442 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{HVFInfo.SCTAssay} \alias{HVFInfo.SCTAssay} \title{Get Variable Feature Information} \usage{ \method{HVFInfo}{SCTAssay}(object, method, status = FALSE, ...) } \arguments{ \item{object}{An object} \item{method}{method to determine variable features} \item{status}{Add variable status to the resulting data frame} \item{...}{Arguments passed to other methods} } \description{ Get variable feature information from \code{\link{SCTAssay}} objects } \examples{ \dontrun{ # Get the HVF info directly from an SCTAssay object pbmc_small <- SCTransform(pbmc_small) HVFInfo(pbmc_small[["SCT"]], method = 'sct')[1:5, ] } } \seealso{ \code{\link[SeuratObject]{HVFInfo}} } \concept{objects} Seurat/man/AugmentPlot.Rd0000644000176200001440000000151615056057544015034 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{AugmentPlot} \alias{AugmentPlot} \title{Augments ggplot2-based plot with a PNG image.} \usage{ AugmentPlot(plot, width = 10, height = 10, dpi = 100) } \arguments{ \item{plot}{A ggplot object} \item{width, height}{Width and height of PNG version of plot} \item{dpi}{Plot resolution} } \value{ A ggplot object } \description{ Creates "vector-friendly" plots. Does this by saving a copy of the plot as a PNG file, then adding the PNG image with \code{\link[ggplot2]{annotation_raster}} to a blank plot of the same dimensions as \code{plot}. Please note: original legends and axes will be lost during augmentation. } \examples{ \dontrun{ data("pbmc_small") plot <- DimPlot(object = pbmc_small) AugmentPlot(plot = plot) } } \concept{visualization} Seurat/man/FindSpatiallyVariableFeatures.Rd0000644000176200001440000000554715056057544020515 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/preprocessing.R, % R/preprocessing5.R \name{FindSpatiallyVariableFeatures} \alias{FindSpatiallyVariableFeatures} \alias{FindSpatiallyVariableFeatures.default} \alias{FindSpatiallyVariableFeatures.Assay} \alias{FindSpatiallyVariableFeatures.Seurat} \alias{FindSpatiallyVariableFeatures.StdAssay} \title{Find spatially variable features} \usage{ FindSpatiallyVariableFeatures(object, ...) \method{FindSpatiallyVariableFeatures}{default}( object, spatial.location, selection.method = c("markvariogram", "moransi"), r.metric = 5, x.cuts = NULL, y.cuts = NULL, verbose = TRUE, ... ) \method{FindSpatiallyVariableFeatures}{Assay}( object, layer = "scale.data", slot = deprecated(), spatial.location, selection.method = c("markvariogram", "moransi"), features = NULL, r.metric = 5, x.cuts = NULL, y.cuts = NULL, nfeatures = nfeatures, verbose = TRUE, ... ) \method{FindSpatiallyVariableFeatures}{Seurat}( object, assay = NULL, layer = "scale.data", slot = NULL, features = NULL, image = NULL, selection.method = c("markvariogram", "moransi"), r.metric = 5, x.cuts = NULL, y.cuts = NULL, nfeatures = 2000, verbose = TRUE, ... ) \method{FindSpatiallyVariableFeatures}{StdAssay}( object, layer = "scale.data", slot = deprecated(), spatial.location, selection.method = c("markvariogram", "moransi"), features = NULL, r.metric = 5, x.cuts = NULL, y.cuts = NULL, nfeatures = nfeatures, verbose = TRUE, ... ) } \arguments{ \item{object}{A Seurat object, assay, or expression matrix} \item{...}{Arguments passed to other methods} \item{spatial.location}{Coordinates for each cell/spot/bead} \item{selection.method}{Method for selecting spatially variable features. \itemize{ \item \code{markvariogram}: See \code{\link{RunMarkVario}} for details \item \code{moransi}: See \code{\link{RunMoransI}} for details. }} \item{r.metric}{r value at which to report the "trans" value of the mark variogram} \item{x.cuts}{Number of divisions to make in the x direction, helps define the grid over which binning is performed} \item{y.cuts}{Number of divisions to make in the y direction, helps define the grid over which binning is performed} \item{verbose}{Print messages and progress} \item{layer}{The layer in the specified assay to pull data from.} \item{slot}{Deprecated, use `layer`.} \item{features}{If provided, only compute on given features. Otherwise, compute for all features.} \item{nfeatures}{Number of features to mark as the top spatially variable.} \item{assay}{Assay to pull the features (marks) from} \item{image}{Name of image to pull the coordinates from} } \description{ Identify features whose variability in expression can be explained to some degree by spatial location. } \concept{preprocessing} \concept{spatial} Seurat/man/STARmap-class.Rd0000644000176200001440000000140615116120241015123 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{STARmap-class} \alias{STARmap-class} \alias{STARmap} \title{The STARmap class} \description{ The STARmap class } \section{Slots}{ \describe{ \item{\code{assay}}{Name of assay to associate image data with; will give this image priority for visualization when the assay is set as the active/default assay in a \code{Seurat} object} \item{\code{key}}{A one-length character vector with the object's key; keys must be one or more alphanumeric characters followed by an underscore \dQuote{\code{_}} (regex pattern \dQuote{\code{^[a-zA-Z][a-zA-Z0-9]*_$}})} \item{\code{misc}}{A named list of unstructured miscellaneous data} } } \concept{objects} \concept{spatial} Seurat/man/RunGraphLaplacian.Rd0000644000176200001440000000242715056057544016132 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/integration.R \name{RunGraphLaplacian} \alias{RunGraphLaplacian} \alias{RunGraphLaplacian.Seurat} \alias{RunGraphLaplacian.default} \title{Run Graph Laplacian Eigendecomposition} \usage{ RunGraphLaplacian(object, ...) \method{RunGraphLaplacian}{Seurat}( object, graph, reduction.name = "lap", reduction.key = "LAP_", n = 50, verbose = TRUE, ... ) \method{RunGraphLaplacian}{default}(object, n = 50, reduction.key = "LAP_", verbose = TRUE, ...) } \arguments{ \item{object}{A Seurat object} \item{...}{Arguments passed to eigs_sym} \item{graph}{The name of graph} \item{reduction.name}{dimensional reduction name, lap by default} \item{reduction.key}{dimensional reduction key, specifies the string before the number for the dimension names. LAP by default} \item{n}{Total Number of Eigenvectors to compute and store (50 by default)} \item{verbose}{Print message and process} } \value{ Returns Seurat object with the Graph laplacian eigenvector calculation stored in the reductions slot } \description{ Run a graph laplacian dimensionality reduction. It is used as a low dimensional representation for a cell-cell graph. The input graph should be symmetric } \concept{dimensional_reduction} Seurat/man/MappingScore.Rd0000644000176200001440000000540415056057544015164 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/integration.R \name{MappingScore} \alias{MappingScore} \alias{MappingScore.default} \alias{MappingScore.AnchorSet} \title{Metric for evaluating mapping success} \usage{ MappingScore(anchors, ...) \method{MappingScore}{default}( anchors, combined.object, query.neighbors, ref.embeddings, query.embeddings, kanchors = 50, ndim = 50, ksmooth = 100, ksnn = 20, snn.prune = 0, subtract.first.nn = TRUE, nn.method = "annoy", n.trees = 50, query.weights = NULL, verbose = TRUE, ... ) \method{MappingScore}{AnchorSet}( anchors, kanchors = 50, ndim = 50, ksmooth = 100, ksnn = 20, snn.prune = 0, subtract.first.nn = TRUE, nn.method = "annoy", n.trees = 50, query.weights = NULL, verbose = TRUE, ... ) } \arguments{ \item{anchors}{AnchorSet object or just anchor matrix from the Anchorset object returned from FindTransferAnchors} \item{...}{Reserved for internal use} \item{combined.object}{Combined object (ref + query) from the Anchorset object returned} \item{query.neighbors}{Neighbors object computed on query cells} \item{ref.embeddings}{Reference embeddings matrix} \item{query.embeddings}{Query embeddings matrix} \item{kanchors}{Number of anchors to use in projection steps when computing weights} \item{ndim}{Number of dimensions to use when working with low dimensional projections of the data} \item{ksmooth}{Number of cells to average over when computing transition probabilities} \item{ksnn}{Number of cells to average over when determining the kernel bandwidth from the SNN graph} \item{snn.prune}{Amount of pruning to apply to edges in SNN graph} \item{subtract.first.nn}{Option to the scoring function when computing distances to subtract the distance to the first nearest neighbor} \item{nn.method}{Nearest neighbor method to use (annoy or RANN)} \item{n.trees}{More trees gives higher precision when using annoy approximate nearest neighbor search} \item{query.weights}{Query weights matrix for reuse} \item{verbose}{Display messages/progress} } \value{ Returns a vector of cell scores } \description{ This metric was designed to help identify query cells that aren't well represented in the reference dataset. The intuition for the score is that we are going to project the query cells into a reference-defined space and then project them back onto the query. By comparing the neighborhoods before and after projection, we identify cells who's local neighborhoods are the most affected by this transformation. This could be because there is a population of query cells that aren't present in the reference or the state of the cells in the query is significantly different from the equivalent cell type in the reference. } \concept{integration} Seurat/man/HarmonyIntegration.Rd0000644000176200001440000000562115056057544016417 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration5.R \name{HarmonyIntegration} \alias{HarmonyIntegration} \title{Harmony Integration} \usage{ HarmonyIntegration( object, orig, features = NULL, scale.layer = "scale.data", new.reduction = "harmony", layers = NULL, npcs = NULL, key = "harmony_", theta = NULL, lambda = NULL, sigma = 0.1, nclust = NULL, tau = 0, block.size = 0.05, max.iter.harmony = 10L, max.iter.cluster = 20L, epsilon.cluster = 1e-05, epsilon.harmony = 0.01, verbose = TRUE, ... ) } \arguments{ \item{object}{An \code{\link[SeuratObject]{Assay5}} object} \item{orig}{A \link[SeuratObject:DimReduc]{dimensional reduction} to correct} \item{features}{Ignored} \item{scale.layer}{Ignored} \item{new.reduction}{Name of new integrated dimensional reduction} \item{layers}{Ignored} \item{npcs}{If doing PCA on input matrix, number of PCs to compute} \item{key}{Key for Harmony dimensional reduction} \item{theta}{Diversity clustering penalty parameter} \item{lambda}{Ridge regression penalty parameter} \item{sigma}{Width of soft kmeans clusters} \item{nclust}{Number of clusters in model} \item{tau}{Protection against overclustering small datasets with large ones} \item{block.size}{What proportion of cells to update during clustering} \item{max.iter.harmony}{Maximum number of rounds to run Harmony} \item{max.iter.cluster}{Maximum number of rounds to run clustering at each round of Harmony} \item{epsilon.cluster}{Convergence tolerance for clustering round of Harmony} \item{epsilon.harmony}{Convergence tolerance for Harmony} \item{verbose}{Whether to print progress messages. TRUE to print, FALSE to suppress} \item{...}{Ignored} } \value{ ... } \description{ Harmony Integration } \note{ This function requires the \href{https://cran.r-project.org/package=harmony}{\pkg{harmony}} package to be installed } \examples{ \dontrun{ # Preprocessing obj <- SeuratData::LoadData("pbmcsca") obj[["RNA"]] <- split(obj[["RNA"]], f = obj$Method) obj <- NormalizeData(obj) obj <- FindVariableFeatures(obj) obj <- ScaleData(obj) obj <- RunPCA(obj) # After preprocessing, we integrate layers with added parameters specific to Harmony: obj <- IntegrateLayers(object = obj, method = HarmonyIntegration, orig.reduction = "pca", new.reduction = 'harmony', verbose = FALSE) # Modifying Parameters # We can also add arguments specific to Harmony such as theta, to give more diverse clusters obj <- IntegrateLayers(object = obj, method = HarmonyIntegration, orig.reduction = "pca", new.reduction = 'harmony', verbose = FALSE, theta = 3) # Integrating SCTransformed data obj <- SCTransform(object = obj) obj <- IntegrateLayers(object = obj, method = HarmonyIntegration, orig.reduction = "pca", new.reduction = 'harmony', assay = "SCT", verbose = FALSE) } } \seealso{ \code{\link[harmony:HarmonyMatrix]{harmony::HarmonyMatrix}()} } \concept{integration} Seurat/man/FindIntegrationAnchors.Rd0000644000176200001440000001350215056057544017175 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{FindIntegrationAnchors} \alias{FindIntegrationAnchors} \title{Find integration anchors} \usage{ FindIntegrationAnchors( object.list = NULL, assay = NULL, reference = NULL, anchor.features = 2000, scale = TRUE, normalization.method = c("LogNormalize", "SCT"), sct.clip.range = NULL, reduction = c("cca", "rpca", "jpca", "rlsi"), l2.norm = TRUE, dims = 1:30, k.anchor = 5, k.filter = 200, k.score = 30, max.features = 200, nn.method = "annoy", n.trees = 50, eps = 0, verbose = TRUE ) } \arguments{ \item{object.list}{A list of \code{\link{Seurat}} objects between which to find anchors for downstream integration.} \item{assay}{A vector of assay names specifying which assay to use when constructing anchors. If NULL, the current default assay for each object is used.} \item{reference}{A vector specifying the object/s to be used as a reference during integration. If NULL (default), all pairwise anchors are found (no reference/s). If not NULL, the corresponding objects in \code{object.list} will be used as references. When using a set of specified references, anchors are first found between each query and each reference. The references are then integrated through pairwise integration. Each query is then mapped to the integrated reference.} \item{anchor.features}{Can be either: \itemize{ \item{A numeric value. This will call \code{\link{SelectIntegrationFeatures}} to select the provided number of features to be used in anchor finding} \item{A vector of features to be used as input to the anchor finding process} }} \item{scale}{Whether or not to scale the features provided. Only set to FALSE if you have previously scaled the features you want to use for each object in the object.list} \item{normalization.method}{Name of normalization method used: LogNormalize or SCT} \item{sct.clip.range}{Numeric of length two specifying the min and max values the Pearson residual will be clipped to} \item{reduction}{Dimensional reduction to perform when finding anchors. Can be one of: \itemize{ \item{cca: Canonical correlation analysis} \item{rpca: Reciprocal PCA} \item{jpca: Joint PCA} \item{rlsi: Reciprocal LSI} }} \item{l2.norm}{Perform L2 normalization on the CCA cell embeddings after dimensional reduction} \item{dims}{Which dimensions to use from the CCA to specify the neighbor search space} \item{k.anchor}{How many neighbors (k) to use when picking anchors} \item{k.filter}{How many neighbors (k) to use when filtering anchors} \item{k.score}{How many neighbors (k) to use when scoring anchors} \item{max.features}{The maximum number of features to use when specifying the neighborhood search space in the anchor filtering} \item{nn.method}{Method for nearest neighbor finding. Options include: rann, annoy} \item{n.trees}{More trees gives higher precision when using annoy approximate nearest neighbor search} \item{eps}{Error bound on the neighbor finding algorithm (from RANN/Annoy)} \item{verbose}{Print progress bars and output} } \value{ Returns an \code{\link{AnchorSet}} object that can be used as input to \code{\link{IntegrateData}}. } \description{ Find a set of anchors between a list of \code{\link{Seurat}} objects. These anchors can later be used to integrate the objects using the \code{\link{IntegrateData}} function. } \details{ The main steps of this procedure are outlined below. For a more detailed description of the methodology, please see Stuart, Butler, et al Cell 2019: \doi{10.1016/j.cell.2019.05.031}; \doi{10.1101/460147} First, determine anchor.features if not explicitly specified using \code{\link{SelectIntegrationFeatures}}. Then for all pairwise combinations of reference and query datasets: \itemize{ \item{Perform dimensional reduction on the dataset pair as specified via the \code{reduction} parameter. If \code{l2.norm} is set to \code{TRUE}, perform L2 normalization of the embedding vectors.} \item{Identify anchors - pairs of cells from each dataset that are contained within each other's neighborhoods (also known as mutual nearest neighbors).} \item{Filter low confidence anchors to ensure anchors in the low dimension space are in broad agreement with the high dimensional measurements. This is done by looking at the neighbors of each query cell in the reference dataset using \code{max.features} to define this space. If the reference cell isn't found within the first \code{k.filter} neighbors, remove the anchor.} \item{Assign each remaining anchor a score. For each anchor cell, determine the nearest \code{k.score} anchors within its own dataset and within its pair's dataset. Based on these neighborhoods, construct an overall neighbor graph and then compute the shared neighbor overlap between anchor and query cells (analogous to an SNN graph). We use the 0.01 and 0.90 quantiles on these scores to dampen outlier effects and rescale to range between 0-1.} } } \examples{ \dontrun{ # to install the SeuratData package see https://github.com/satijalab/seurat-data library(SeuratData) data("panc8") # panc8 is a merged Seurat object containing 8 separate pancreas datasets # split the object by dataset pancreas.list <- SplitObject(panc8, split.by = "tech") # perform standard preprocessing on each object for (i in 1:length(pancreas.list)) { pancreas.list[[i]] <- NormalizeData(pancreas.list[[i]], verbose = FALSE) pancreas.list[[i]] <- FindVariableFeatures( pancreas.list[[i]], selection.method = "vst", nfeatures = 2000, verbose = FALSE ) } # find anchors anchors <- FindIntegrationAnchors(object.list = pancreas.list) # integrate data integrated <- IntegrateData(anchorset = anchors) } } \references{ Stuart T, Butler A, et al. Comprehensive Integration of Single-Cell Data. Cell. 2019;177:1888-1902 \doi{10.1016/j.cell.2019.05.031} } \concept{integration} Seurat/man/NormalizeData.Rd0000644000176200001440000000407015056057544015325 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/preprocessing.R \name{NormalizeData} \alias{NormalizeData} \alias{NormalizeData.V3Matrix} \alias{NormalizeData.Assay} \alias{NormalizeData.Seurat} \title{Normalize Data} \usage{ NormalizeData(object, ...) \method{NormalizeData}{V3Matrix}( object, normalization.method = "LogNormalize", scale.factor = 10000, margin = 1, block.size = NULL, verbose = TRUE, ... ) \method{NormalizeData}{Assay}( object, normalization.method = "LogNormalize", scale.factor = 10000, margin = 1, verbose = TRUE, ... ) \method{NormalizeData}{Seurat}( object, assay = NULL, normalization.method = "LogNormalize", scale.factor = 10000, margin = 1, verbose = TRUE, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods} \item{normalization.method}{Method for normalization. \itemize{ \item \dQuote{\code{LogNormalize}}: Feature counts for each cell are divided by the total counts for that cell and multiplied by the \code{scale.factor}. This is then natural-log transformed using \code{log1p} \item \dQuote{\code{CLR}}: Applies a centered log ratio transformation \item \dQuote{\code{RC}}: Relative counts. Feature counts for each cell are divided by the total counts for that cell and multiplied by the \code{scale.factor}. No log-transformation is applied. For counts per million (CPM) set \code{scale.factor = 1e6} }} \item{scale.factor}{Sets the scale factor for cell-level normalization} \item{margin}{If performing CLR normalization, normalize across features (1) or cells (2)} \item{block.size}{How many cells should be run in each chunk, will try to split evenly across threads} \item{verbose}{display progress bar for normalization procedure} \item{assay}{Name of assay to use} } \value{ Returns object after normalization } \description{ Normalize the count data present in a given assay. } \examples{ \dontrun{ data("pbmc_small") pbmc_small pmbc_small <- NormalizeData(object = pbmc_small) } } \concept{preprocessing} Seurat/man/DiscretePalette.Rd0000644000176200001440000000207315056057544015655 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{DiscretePalette} \alias{DiscretePalette} \title{Discrete colour palettes from pals} \usage{ DiscretePalette(n, palette = NULL, shuffle = FALSE) } \arguments{ \item{n}{Number of colours to be generated.} \item{palette}{Options are "alphabet", "alphabet2", "glasbey", "polychrome", "stepped", and "parade". Can be omitted and the function will use the one based on the requested n.} \item{shuffle}{Shuffle the colors in the selected palette.} } \value{ A vector of colors } \description{ These are included here because pals depends on a number of compiled packages, and this can lead to increases in run time for Travis, and generally should be avoided when possible. } \details{ These palettes are a much better default for data with many classes than the default ggplot2 palette. Many thanks to Kevin Wright for writing the pals package. Taken from the pals package (Licence: GPL-3). \url{https://cran.r-project.org/package=pals} Credit: Kevin Wright } \concept{visualization} Seurat/man/SubsetByBarcodeInflections.Rd0000644000176200001440000000203515056057544020010 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{SubsetByBarcodeInflections} \alias{SubsetByBarcodeInflections} \title{Subset a Seurat Object based on the Barcode Distribution Inflection Points} \usage{ SubsetByBarcodeInflections(object) } \arguments{ \item{object}{Seurat object} } \value{ Returns a subsetted Seurat object. } \description{ This convenience function subsets a Seurat object based on calculated inflection points. } \details{ See [CalculateBarcodeInflections()] to calculate inflection points and [BarcodeInflectionsPlot()] to visualize and test inflection point calculations. } \examples{ data("pbmc_small") pbmc_small <- CalculateBarcodeInflections( object = pbmc_small, group.column = 'groups', threshold.low = 20, threshold.high = 30 ) SubsetByBarcodeInflections(object = pbmc_small) } \seealso{ \code{\link{CalculateBarcodeInflections}} \code{\link{BarcodeInflectionsPlot}} } \author{ Robert A. Amezquita, \email{robert.amezquita@fredhutch.org} } \concept{preprocessing} Seurat/man/FindMarkers.Rd0000644000176200001440000002672215056057544015010 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/differential_expression.R \name{FindMarkers} \alias{FindMarkers} \alias{FindMarkersNode} \alias{FindMarkers.default} \alias{FindMarkers.Assay} \alias{FindMarkers.SCTAssay} \alias{FindMarkers.DimReduc} \alias{FindMarkers.Seurat} \title{Gene expression markers of identity classes} \usage{ FindMarkers(object, ...) \method{FindMarkers}{default}( object, slot = "data", cells.1 = NULL, cells.2 = NULL, features = NULL, logfc.threshold = 0.1, test.use = "wilcox", min.pct = 0.01, min.diff.pct = -Inf, verbose = TRUE, only.pos = FALSE, max.cells.per.ident = Inf, random.seed = 1, latent.vars = NULL, min.cells.feature = 3, min.cells.group = 3, fc.results = NULL, densify = FALSE, ... ) \method{FindMarkers}{Assay}( object, slot = "data", cells.1 = NULL, cells.2 = NULL, features = NULL, test.use = "wilcox", fc.slot = "data", pseudocount.use = 1, norm.method = NULL, mean.fxn = NULL, fc.name = NULL, base = 2, ... ) \method{FindMarkers}{SCTAssay}( object, cells.1 = NULL, cells.2 = NULL, features = NULL, test.use = "wilcox", pseudocount.use = 1, slot = "data", fc.slot = "data", mean.fxn = NULL, fc.name = NULL, base = 2, recorrect_umi = TRUE, ... ) \method{FindMarkers}{DimReduc}( object, cells.1 = NULL, cells.2 = NULL, features = NULL, logfc.threshold = 0.1, test.use = "wilcox", min.pct = 0.01, min.diff.pct = -Inf, verbose = TRUE, only.pos = FALSE, max.cells.per.ident = Inf, random.seed = 1, latent.vars = NULL, min.cells.feature = 3, min.cells.group = 3, densify = FALSE, mean.fxn = rowMeans, fc.name = NULL, ... ) \method{FindMarkers}{Seurat}( object, ident.1 = NULL, ident.2 = NULL, latent.vars = NULL, group.by = NULL, subset.ident = NULL, assay = NULL, reduction = NULL, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods and to specific DE methods} \item{slot}{Slot to pull data from; note that if \code{test.use} is "negbinom", "poisson", or "DESeq2", \code{slot} will be set to "counts"} \item{cells.1}{Vector of cell names belonging to group 1} \item{cells.2}{Vector of cell names belonging to group 2} \item{features}{Genes to test. Default is to use all genes} \item{logfc.threshold}{Limit testing to genes which show, on average, at least X-fold difference (log-scale) between the two groups of cells. Default is 0.1 Increasing logfc.threshold speeds up the function, but can miss weaker signals. If the \code{slot} parameter is "scale.data" no filtering is performed.} \item{test.use}{Denotes which test to use. Available options are: \itemize{ \item{"wilcox"} : Identifies differentially expressed genes between two groups of cells using a Wilcoxon Rank Sum test (default); will use a fast implementation by Presto if installed \item{"wilcox_limma"} : Identifies differentially expressed genes between two groups of cells using the limma implementation of the Wilcoxon Rank Sum test; set this option to reproduce results from Seurat v4 \item{"bimod"} : Likelihood-ratio test for single cell gene expression, (McDavid et al., Bioinformatics, 2013) \item{"roc"} : Identifies 'markers' of gene expression using ROC analysis. For each gene, evaluates (using AUC) a classifier built on that gene alone, to classify between two groups of cells. An AUC value of 1 means that expression values for this gene alone can perfectly classify the two groupings (i.e. Each of the cells in cells.1 exhibit a higher level than each of the cells in cells.2). An AUC value of 0 also means there is perfect classification, but in the other direction. A value of 0.5 implies that the gene has no predictive power to classify the two groups. Returns a 'predictive power' (abs(AUC-0.5) * 2) ranked matrix of putative differentially expressed genes. \item{"t"} : Identify differentially expressed genes between two groups of cells using the Student's t-test. \item{"negbinom"} : Identifies differentially expressed genes between two groups of cells using a negative binomial generalized linear model. Use only for UMI-based datasets \item{"poisson"} : Identifies differentially expressed genes between two groups of cells using a poisson generalized linear model. Use only for UMI-based datasets \item{"LR"} : Uses a logistic regression framework to determine differentially expressed genes. Constructs a logistic regression model predicting group membership based on each feature individually and compares this to a null model with a likelihood ratio test. \item{"MAST"} : Identifies differentially expressed genes between two groups of cells using a hurdle model tailored to scRNA-seq data. Utilizes the MAST package to run the DE testing. \item{"DESeq2"} : Identifies differentially expressed genes between two groups of cells based on a model using DESeq2 which uses a negative binomial distribution (Love et al, Genome Biology, 2014).This test does not support pre-filtering of genes based on average difference (or percent detection rate) between cell groups. However, genes may be pre-filtered based on their minimum detection rate (min.pct) across both cell groups. To use this method, please install DESeq2, using the instructions at https://bioconductor.org/packages/release/bioc/html/DESeq2.html }} \item{min.pct}{only test genes that are detected in a minimum fraction of min.pct cells in either of the two populations. Meant to speed up the function by not testing genes that are very infrequently expressed. Default is 0.01} \item{min.diff.pct}{only test genes that show a minimum difference in the fraction of detection between the two groups. Set to -Inf by default} \item{verbose}{Print a progress bar once expression testing begins} \item{only.pos}{Only return positive markers (FALSE by default)} \item{max.cells.per.ident}{Down sample each identity class to a max number. Default is no downsampling. Not activated by default (set to Inf)} \item{random.seed}{Random seed for downsampling} \item{latent.vars}{Variables to test, used only when \code{test.use} is one of 'LR', 'negbinom', 'poisson', or 'MAST'} \item{min.cells.feature}{Minimum number of cells expressing the feature in at least one of the two groups, currently only used for poisson and negative binomial tests} \item{min.cells.group}{Minimum number of cells in one of the groups} \item{fc.results}{data.frame from FoldChange} \item{densify}{Convert the sparse matrix to a dense form before running the DE test. This can provide speedups but might require higher memory; default is FALSE} \item{fc.slot}{Slot used to calculate fold-change - will also affect the default for \code{mean.fxn}, see below for more details.} \item{pseudocount.use}{Pseudocount to add to averaged expression values when calculating logFC. 1 by default.} \item{norm.method}{Normalization method for fold change calculation when \code{slot} is \dQuote{\code{data}}} \item{mean.fxn}{Function to use for fold change or average difference calculation. The default depends on the the value of \code{fc.slot}: \itemize{ \item{"counts"} : difference in the log of the mean counts, with pseudocount. \item{"data"} : difference in the log of the average exponentiated data, with pseudocount. This adjusts for differences in sequencing depth between cells, and assumes that "data" has been log-normalized. \item{"scale.data"} : difference in the means of scale.data. }} \item{fc.name}{Name of the fold change, average difference, or custom function column in the output data.frame. If NULL, the fold change column will be named according to the logarithm base (eg, "avg_log2FC"), or if using the scale.data slot "avg_diff".} \item{base}{The base with respect to which logarithms are computed.} \item{recorrect_umi}{Recalculate corrected UMI counts using minimum of the median UMIs when performing DE using multiple SCT objects; default is TRUE} \item{ident.1}{Identity class to define markers for; pass an object of class \code{phylo} or 'clustertree' to find markers for a node in a cluster tree; passing 'clustertree' requires \code{\link{BuildClusterTree}} to have been run} \item{ident.2}{A second identity class for comparison; if \code{NULL}, use all other cells for comparison; if an object of class \code{phylo} or 'clustertree' is passed to \code{ident.1}, must pass a node to find markers for} \item{group.by}{Regroup cells into a different identity class prior to performing differential expression (see example); \code{"ident"} to use Idents} \item{subset.ident}{Subset a particular identity class prior to regrouping. Only relevant if group.by is set (see example)} \item{assay}{Assay to use in differential expression testing} \item{reduction}{Reduction to use in differential expression testing - will test for DE on cell embeddings} } \value{ data.frame with a ranked list of putative markers as rows, and associated statistics as columns (p-values, ROC score, etc., depending on the test used (\code{test.use})). The following columns are always present: \itemize{ \item \code{avg_logFC}: log fold-chage of the average expression between the two groups. Positive values indicate that the gene is more highly expressed in the first group \item \code{pct.1}: The percentage of cells where the gene is detected in the first group \item \code{pct.2}: The percentage of cells where the gene is detected in the second group \item \code{p_val_adj}: Adjusted p-value, based on bonferroni correction using all genes in the dataset } } \description{ Finds markers (differentially expressed genes) for identity classes } \details{ p-value adjustment is performed using bonferroni correction based on the total number of genes in the dataset. Other correction methods are not recommended, as Seurat pre-filters genes using the arguments above, reducing the number of tests performed. Lastly, as Aaron Lun has pointed out, p-values should be interpreted cautiously, as the genes used for clustering are the same genes tested for differential expression. } \examples{ \dontrun{ data("pbmc_small") # Find markers for cluster 2 markers <- FindMarkers(object = pbmc_small, ident.1 = 2) head(x = markers) # Take all cells in cluster 2, and find markers that separate cells in the 'g1' group (metadata # variable 'group') markers <- FindMarkers(pbmc_small, ident.1 = "g1", group.by = 'groups', subset.ident = "2") head(x = markers) # Pass 'clustertree' or an object of class phylo to ident.1 and # a node to ident.2 as a replacement for FindMarkersNode if (requireNamespace("ape", quietly = TRUE)) { pbmc_small <- BuildClusterTree(object = pbmc_small) markers <- FindMarkers(object = pbmc_small, ident.1 = 'clustertree', ident.2 = 5) head(x = markers) } } } \references{ McDavid A, Finak G, Chattopadyay PK, et al. Data exploration, quality control and testing in single-cell qPCR-based gene expression experiments. Bioinformatics. 2013;29(4):461-467. doi:10.1093/bioinformatics/bts714 Trapnell C, et al. The dynamics and regulators of cell fate decisions are revealed by pseudotemporal ordering of single cells. Nature Biotechnology volume 32, pages 381-386 (2014) Andrew McDavid, Greg Finak and Masanao Yajima (2017). MAST: Model-based Analysis of Single Cell Transcriptomics. R package version 1.2.1. https://github.com/RGLab/MAST/ Love MI, Huber W and Anders S (2014). "Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2." Genome Biology. https://bioconductor.org/packages/release/bioc/html/DESeq2.html } \seealso{ \code{FoldChange} } \concept{differential_expression} Seurat/man/SelectIntegrationFeatures.Rd0000644000176200001440000000353715056057544017724 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{SelectIntegrationFeatures} \alias{SelectIntegrationFeatures} \title{Select integration features} \usage{ SelectIntegrationFeatures( object.list, nfeatures = 2000, assay = NULL, verbose = TRUE, fvf.nfeatures = 2000, ... ) } \arguments{ \item{object.list}{List of seurat objects} \item{nfeatures}{Number of features to return} \item{assay}{Name or vector of assay names (one for each object) from which to pull the variable features.} \item{verbose}{Print messages} \item{fvf.nfeatures}{nfeatures for \code{\link{FindVariableFeatures}}. Used if \code{VariableFeatures} have not been set for any object in \code{object.list}.} \item{...}{Additional parameters to \code{\link{FindVariableFeatures}}} } \value{ A vector of selected features } \description{ Choose the features to use when integrating multiple datasets. This function ranks features by the number of datasets they are deemed variable in, breaking ties by the median variable feature rank across datasets. It returns the top scoring features by this ranking. } \details{ If for any assay in the list, \code{\link{FindVariableFeatures}} hasn't been run, this method will try to run it using the \code{fvf.nfeatures} parameter and any additional ones specified through the \dots. } \examples{ \dontrun{ # to install the SeuratData package see https://github.com/satijalab/seurat-data library(SeuratData) data("panc8") # panc8 is a merged Seurat object containing 8 separate pancreas datasets # split the object by dataset and take the first 2 pancreas.list <- SplitObject(panc8, split.by = "tech")[1:2] # perform SCTransform normalization pancreas.list <- lapply(X = pancreas.list, FUN = SCTransform) # select integration features features <- SelectIntegrationFeatures(pancreas.list) } } \concept{integration} Seurat/man/AutoPointSize.Rd0000644000176200001440000000112515056057544015346 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{AutoPointSize} \alias{AutoPointSize} \title{Automagically calculate a point size for ggplot2-based scatter plots} \usage{ AutoPointSize(data, raster = NULL) } \arguments{ \item{data}{A data frame being passed to ggplot2} \item{raster}{If TRUE, point size is set to 1} } \value{ The "optimal" point size for visualizing these data } \description{ It happens to look good } \examples{ df <- data.frame(x = rnorm(n = 10000), y = runif(n = 10000)) AutoPointSize(data = df) } \concept{visualization} Seurat/man/SingleSpatialPlot.Rd0000644000176200001440000000476015117056271016171 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{SingleSpatialPlot} \alias{SingleSpatialPlot} \title{Base plotting function for all Spatial plots} \usage{ SingleSpatialPlot( data, image, cols = NULL, image.alpha = 1, image.scale = "lowres", pt.alpha = NULL, crop = TRUE, pt.size.factor = NULL, shape = 21, stroke = NA, col.by = NULL, alpha.by = NULL, cells.highlight = NULL, cols.highlight = c("#DE2D26", "grey50"), geom = c("spatial", "interactive", "poly", "poly_starmap"), na.value = "grey50", plot_segmentations = FALSE ) } \arguments{ \item{data}{Data.frame with info to be plotted} \item{image}{\code{SpatialImage} object to be plotted} \item{cols}{Vector of colors, each color corresponds to an identity class. This may also be a single character or numeric value corresponding to a palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}. By default, ggplot2 assigns colors} \item{image.alpha}{Adjust the opacity of the background images. Set to 0 to remove.} \item{image.scale}{Choose the scale factor ("lowres"/"hires") to apply in order to matchthe plot with the specified `image` - defaults to "lowres"} \item{pt.alpha}{Adjust the opacity of the points if plotting a \code{SpatialDimPlot}} \item{crop}{Crop the plot in to focus on points plotted. Set to \code{FALSE} to show entire background image.} \item{pt.size.factor}{Sets the size of the points relative to spot.radius} \item{shape}{Control the shape of the spots - same as the ggplot2 parameter. The default is 21, which plots cirlces - use 22 to plot squares.} \item{stroke}{Control the width of the border around the spots} \item{col.by}{Mapping variable for the point color} \item{alpha.by}{Mapping variable for the point alpha value} \item{cells.highlight}{A list of character or numeric vectors of cells to highlight. If only one group of cells desired, can simply pass a vector instead of a list. If set, colors selected cells to the color(s) in cols.highlight} \item{cols.highlight}{A vector of colors to highlight the cells as; ordered the same as the groups in cells.highlight; last color corresponds to unselected cells.} \item{geom}{Switch between normal spatial geom and geom to enable hover functionality} \item{na.value}{Color for spots with NA values} \item{plot_segmentations}{Define whether plot should plot centroids or segmentations} } \value{ A ggplot2 object } \description{ Base plotting function for all Spatial plots } \keyword{internal} Seurat/man/VizDimLoadings.Rd0000644000176200001440000000241515056057544015457 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{VizDimLoadings} \alias{VizDimLoadings} \title{Visualize Dimensional Reduction genes} \usage{ VizDimLoadings( object, dims = 1:5, nfeatures = 30, col = "blue", reduction = "pca", projected = FALSE, balanced = FALSE, ncol = NULL, combine = TRUE ) } \arguments{ \item{object}{Seurat object} \item{dims}{Number of dimensions to display} \item{nfeatures}{Number of genes to display} \item{col}{Color of points to use} \item{reduction}{Reduction technique to visualize results for} \item{projected}{Use reduction values for full dataset (i.e. projected dimensional reduction values)} \item{balanced}{Return an equal number of genes with + and - scores. If FALSE (default), returns the top genes ranked by the scores absolute values} \item{ncol}{Number of columns to display} \item{combine}{Combine plots into a single \code{patchwork} ggplot object. If \code{FALSE}, return a list of ggplot objects} } \value{ A \code{patchwork} ggplot object if \code{combine = TRUE}; otherwise, a list of ggplot objects } \description{ Visualize top genes associated with reduction components } \examples{ data("pbmc_small") VizDimLoadings(object = pbmc_small) } \concept{visualization} Seurat/man/Load10X_Spatial.Rd0000644000176200001440000000426415117056271015417 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{Load10X_Spatial} \alias{Load10X_Spatial} \title{Load a 10x Genomics Visium Spatial Experiment into a \code{Seurat} object} \usage{ Load10X_Spatial( data.dir, filename = "filtered_feature_bc_matrix.h5", assay = "Spatial", slice = "slice1", bin.size = NULL, filter.matrix = TRUE, to.upper = FALSE, image = NULL, image.name = "tissue_lowres_image.png", segmentation.type = NULL, compact = TRUE, ... ) } \arguments{ \item{data.dir}{Directory containing the H5 file specified by \code{filename} and the image data in a subdirectory called \code{spatial}} \item{filename}{Name of H5 file containing the feature barcode matrix} \item{assay}{Name of the initial assay} \item{slice}{Name for the stored image of the tissue slice} \item{bin.size}{Specifies the bin sizes to read in, can include "polygons" to load segmentations. Defaults to c(16, 8)} \item{filter.matrix}{Only keep spots that have been determined to be over tissue} \item{to.upper}{Converts all feature names to upper case. Can be useful when analyses require comparisons between human and mouse gene names for example.} \item{image}{\code{VisiumV1}/\code{VisiumV2} instance(s) - if a vector is passed in it should be co-indexed with \code{`bin.size`}} \item{image.name}{Name of the tissue image to be plotted. Defaults to tissue_lowres_image.png} \item{segmentation.type}{Which segmentations to load (cell or nucleus) when bin.size includes "polygons". Defaults to "cell".} \item{compact}{Whether to store segmentations in \emph{only} the \code{sf.data} slot in the corresponding Segmentation object (default TRUE) to save memory and processing time. If FALSE, segmentations are also stored in \code{\link[sp]{sp}} format in addition to the \code{sf.data} slot.} \item{...}{Arguments passed to \code{\link{Read10X_h5}}} } \value{ A \code{Seurat} object } \description{ Load a 10x Genomics Visium Spatial Experiment into a \code{Seurat} object } \examples{ \dontrun{ data_dir <- 'path/to/data/directory' list.files(data_dir) # Should show filtered_feature_bc_matrix.h5 Load10X_Spatial(data.dir = data_dir) } } \concept{preprocessing} Seurat/man/FetchResiduals.Rd0000644000176200001440000000411115056057544015474 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/preprocessing5.R \name{FetchResiduals} \alias{FetchResiduals} \alias{FetchResiduals.Seurat} \alias{FetchResiduals.SCTAssay} \title{Get the Pearson residuals from an sctransform-normalized dataset.} \usage{ FetchResiduals(object, ...) \method{FetchResiduals}{Seurat}( object, features, assay = NULL, umi.assay = "RNA", layer = "counts", clip.range = NULL, reference.SCT.model = NULL, replace.value = FALSE, na.rm = TRUE, verbose = TRUE, ... ) \method{FetchResiduals}{SCTAssay}( object, umi.object, features, layer = "counts", clip.range = NULL, reference.SCT.model = NULL, replace.value = FALSE, na.rm = TRUE, verbose = TRUE, ... ) } \arguments{ \item{object}{An SCTAssay object.} \item{...}{Arguments passed to other methods (not used)} \item{features}{Name of features to fetch residuals for.} \item{assay}{Name of the assay to fetch residuals for.} \item{umi.assay}{Name of the assay of the seurat object containing counts matrix to use when recalculating any missing residuals.} \item{layer}{The name of the layer(s) in `umi.assay` to use when recalculating any missing residuals.} \item{clip.range}{Numeric of length two specifying the min and max values the Pearson residual will be clipped to.} \item{reference.SCT.model}{If provided, the reference model will be used to recalculate missing residuals instead of the} \item{replace.value}{Recalculate residuals for all features, even if they are already present. Useful if you want to change the clip.range.} \item{na.rm}{For features where there is no feature model stored, return NA for residual value in scale.data when na.rm = FALSE. When na.rm is TRUE, only return residuals for features with a model stored for all cells.} \item{verbose}{Whether to print messages and progress bars} \item{umi.object}{TK.} } \value{ A matrix containing the requested pearson residuals. } \description{ This function calls sctransform::get_residuals. } \seealso{ \code{\link[sctransform]{get_residuals}} } \concept{preprocessing} Seurat/man/CCAIntegration.Rd0000644000176200001440000000762615056057544015377 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration5.R \name{CCAIntegration} \alias{CCAIntegration} \title{Seurat-CCA Integration} \usage{ CCAIntegration( object = NULL, assay = NULL, layers = NULL, orig = NULL, new.reduction = "integrated.dr", reference = NULL, features = NULL, normalization.method = c("LogNormalize", "SCT"), dims = 1:30, k.filter = NA, scale.layer = "scale.data", dims.to.integrate = NULL, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, verbose = TRUE, ... ) } \arguments{ \item{object}{A \code{Seurat} object} \item{assay}{Name of \code{Assay} in the \code{Seurat} object} \item{layers}{Names of layers in \code{assay}} \item{orig}{A \link[SeuratObject]{DimReduc} to correct} \item{new.reduction}{Name of new integrated dimensional reduction} \item{reference}{A reference \code{Seurat} object} \item{features}{A vector of features to use for integration} \item{normalization.method}{Name of normalization method used: LogNormalize or SCT} \item{dims}{Dimensions of dimensional reduction to use for integration} \item{k.filter}{Number of anchors to filter} \item{scale.layer}{Name of scaled layer in \code{Assay}} \item{dims.to.integrate}{Number of dimensions to return integrated values for} \item{k.weight}{Number of neighbors to consider when weighting anchors} \item{weight.reduction}{Dimension reduction to use when calculating anchor weights. This can be one of: \itemize{ \item{A string, specifying the name of a dimension reduction present in all objects to be integrated} \item{A vector of strings, specifying the name of a dimension reduction to use for each object to be integrated} \item{A vector of \code{\link[SeuratObject]{DimReduc}} objects, specifying the object to use for each object in the integration} \item{NULL, in which case the full corrected space is used for computing anchor weights.} }} \item{sd.weight}{Controls the bandwidth of the Gaussian kernel for weighting} \item{sample.tree}{Specify the order of integration. Order of integration should be encoded in a matrix, where each row represents one of the pairwise integration steps. Negative numbers specify a dataset, positive numbers specify the integration results from a given row (the format of the merge matrix included in the \code{\link{hclust}} function output). For example: \code{matrix(c(-2, 1, -3, -1), ncol = 2)} gives: \if{html}{\out{
}}\preformatted{ [,1] [,2] [1,] -2 -3 [2,] 1 -1 }\if{html}{\out{
}} Which would cause dataset 2 and 3 to be integrated first, then the resulting object integrated with dataset 1. If NULL, the sample tree will be computed automatically.} \item{preserve.order}{Do not reorder objects based on size for each pairwise integration.} \item{verbose}{Print progress} \item{...}{Arguments passed on to \code{FindIntegrationAnchors}} } \description{ Seurat-CCA Integration } \examples{ \dontrun{ # Preprocessing obj <- SeuratData::LoadData("pbmcsca") obj[["RNA"]] <- split(obj[["RNA"]], f = obj$Method) obj <- NormalizeData(obj) obj <- FindVariableFeatures(obj) obj <- ScaleData(obj) obj <- RunPCA(obj) # After preprocessing, we integrate layers. obj <- IntegrateLayers(object = obj, method = CCAIntegration, orig.reduction = "pca", new.reduction = "integrated.cca", verbose = FALSE) # Modifying parameters # We can also specify parameters such as `k.anchor` to increase the strength of integration obj <- IntegrateLayers(object = obj, method = CCAIntegration, orig.reduction = "pca", new.reduction = "integrated.cca", k.anchor = 20, verbose = FALSE) # Integrating SCTransformed data obj <- SCTransform(object = obj) obj <- IntegrateLayers(object = obj, method = CCAIntegration, orig.reduction = "pca", new.reduction = "integrated.cca", assay = "SCT", verbose = FALSE) } } \concept{integration} Seurat/man/GetAssay.Rd0000644000176200001440000000114115056057544014307 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/objects.R \name{GetAssay} \alias{GetAssay} \alias{GetAssay.Seurat} \title{Get an Assay object from a given Seurat object.} \usage{ GetAssay(object, ...) \method{GetAssay}{Seurat}(object, assay = NULL, ...) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods} \item{assay}{Assay to get} } \value{ Returns an Assay object } \description{ Get an Assay object from a given Seurat object. } \examples{ data("pbmc_small") GetAssay(object = pbmc_small, assay = "RNA") } \concept{objects} Seurat/man/IntegrationData-class.Rd0000644000176200001440000000165515056057544016761 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{IntegrationData-class} \alias{IntegrationData-class} \alias{IntegrationData} \title{The IntegrationData Class} \description{ The IntegrationData object is an intermediate storage container used internally throughout the integration procedure to hold bits of data that are useful downstream. } \section{Slots}{ \describe{ \item{\code{neighbors}}{List of neighborhood information for cells (outputs of \code{RANN::nn2})} \item{\code{weights}}{Anchor weight matrix} \item{\code{integration.matrix}}{Integration matrix} \item{\code{anchors}}{Anchor matrix} \item{\code{offsets}}{The offsets used to enable cell look up in downstream functions} \item{\code{objects.ncell}}{Number of cells in each object in the object.list} \item{\code{sample.tree}}{Sample tree used for ordering multi-dataset integration} }} \concept{objects} Seurat/man/UpdateSymbolList.Rd0000644000176200001440000000425515056057544016044 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{UpdateSymbolList} \alias{UpdateSymbolList} \alias{GeneSymbolThesarus} \title{Get updated synonyms for gene symbols} \source{ \url{https://www.genenames.org/} \url{https://www.genenames.org/help/rest/} } \usage{ GeneSymbolThesarus( symbols, timeout = 10, several.ok = FALSE, search.types = c("alias_symbol", "prev_symbol"), verbose = TRUE, ... ) UpdateSymbolList( symbols, timeout = 10, several.ok = FALSE, verbose = TRUE, ... ) } \arguments{ \item{symbols}{A vector of gene symbols} \item{timeout}{Time to wait before canceling query in seconds} \item{several.ok}{Allow several current gene symbols for each provided symbol} \item{search.types}{Type of query to perform: \describe{ \item{\dQuote{\code{alias_symbol}}}{Find alternate symbols for the genes described by \code{symbols}} \item{\dQuote{\code{prev_symbol}}}{Find new new symbols for the genes described by \code{symbols}} } This parameter accepts multiple options and short-hand options (eg. \dQuote{\code{prev}} for \dQuote{\code{prev_symbol}})} \item{verbose}{Show a progress bar depicting search progress} \item{...}{Extra parameters passed to \code{\link[httr]{GET}}} } \value{ \code{GeneSymbolThesarus}:, if \code{several.ok}, a named list where each entry is the current symbol found for each symbol provided and the names are the provided symbols. Otherwise, a named vector with the same information. \code{UpdateSymbolList}: \code{symbols} with updated symbols from HGNC's gene names database } \description{ Find current gene symbols based on old or alias symbols using the gene names database from the HUGO Gene Nomenclature Committee (HGNC) } \details{ For each symbol passed, we query the HGNC gene names database for current symbols that have the provided symbol as either an alias (\code{alias_symbol}) or old (\code{prev_symbol}) symbol. All other queries are \strong{not} supported. } \note{ This function requires internet access } \examples{ \dontrun{ GeneSybmolThesarus(symbols = c("FAM64A")) } \dontrun{ UpdateSymbolList(symbols = cc.genes$s.genes) } } \seealso{ \code{\link[httr]{GET}} } \concept{utilities} Seurat/man/ScaleData.Rd0000644000176200001440000000744215056057544014422 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/preprocessing.R \name{ScaleData} \alias{ScaleData} \alias{ScaleData.default} \alias{ScaleData.IterableMatrix} \alias{ScaleData.Assay} \alias{ScaleData.Seurat} \title{Scale and center the data.} \usage{ ScaleData(object, ...) \method{ScaleData}{default}( object, features = NULL, vars.to.regress = NULL, latent.data = NULL, split.by = NULL, model.use = "linear", use.umi = FALSE, do.scale = TRUE, do.center = TRUE, scale.max = 10, block.size = 1000, min.cells.to.block = 3000, verbose = TRUE, ... ) \method{ScaleData}{IterableMatrix}( object, features = NULL, do.scale = TRUE, do.center = TRUE, scale.max = 10, ... ) \method{ScaleData}{Assay}( object, features = NULL, vars.to.regress = NULL, latent.data = NULL, split.by = NULL, model.use = "linear", use.umi = FALSE, do.scale = TRUE, do.center = TRUE, scale.max = 10, block.size = 1000, min.cells.to.block = 3000, verbose = TRUE, ... ) \method{ScaleData}{Seurat}( object, features = NULL, assay = NULL, vars.to.regress = NULL, split.by = NULL, model.use = "linear", use.umi = FALSE, do.scale = TRUE, do.center = TRUE, scale.max = 10, block.size = 1000, min.cells.to.block = 3000, verbose = TRUE, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods} \item{features}{Vector of features names to scale/center. Default is variable features.} \item{vars.to.regress}{Variables to regress out (previously latent.vars in RegressOut). For example, nUMI, or percent.mito.} \item{latent.data}{Extra data to regress out, should be cells x latent data} \item{split.by}{Name of variable in object metadata or a vector or factor defining grouping of cells. See argument \code{f} in \code{\link[base]{split}} for more details} \item{model.use}{Use a linear model or generalized linear model (poisson, negative binomial) for the regression. Options are 'linear' (default), 'poisson', and 'negbinom'} \item{use.umi}{Regress on UMI count data. Default is FALSE for linear modeling, but automatically set to TRUE if model.use is 'negbinom' or 'poisson'} \item{do.scale}{Whether to scale the data.} \item{do.center}{Whether to center the data.} \item{scale.max}{Max value to return for scaled data. The default is 10. Setting this can help reduce the effects of features that are only expressed in a very small number of cells. If regressing out latent variables and using a non-linear model, the default is 50.} \item{block.size}{Default size for number of features to scale at in a single computation. Increasing block.size may speed up calculations but at an additional memory cost.} \item{min.cells.to.block}{If object contains fewer than this number of cells, don't block for scaling calculations.} \item{verbose}{Displays a progress bar for scaling procedure} \item{assay}{Name of Assay to scale} } \description{ Scales and centers features in the dataset. If variables are provided in vars.to.regress, they are individually regressed against each feature, and the resulting residuals are then scaled and centered. } \details{ ScaleData now incorporates the functionality of the function formerly known as RegressOut (which regressed out given the effects of provided variables and then scaled the residuals). To make use of the regression functionality, simply pass the variables you want to remove to the vars.to.regress parameter. Setting center to TRUE will center the expression for each feature by subtracting the average expression for that feature. Setting scale to TRUE will scale the expression level for each feature by dividing the centered feature expression levels by their standard deviations if center is TRUE and by their root mean square otherwise. } \concept{preprocessing} Seurat/man/TopCells.Rd0000644000176200001440000000157215056057544014324 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{TopCells} \alias{TopCells} \title{Find cells with highest scores for a given dimensional reduction technique} \usage{ TopCells(object, dim = 1, ncells = 20, balanced = FALSE, ...) } \arguments{ \item{object}{DimReduc object} \item{dim}{Dimension to use} \item{ncells}{Number of cells to return} \item{balanced}{Return an equal number of cells with both + and - scores.} \item{...}{Extra parameters passed to \code{\link{Embeddings}}} } \value{ Returns a vector of cells } \description{ Return a list of genes with the strongest contribution to a set of components } \examples{ data("pbmc_small") pbmc_small head(TopCells(object = pbmc_small[["pca"]])) # Can specify which dimension and how many cells to return TopCells(object = pbmc_small[["pca"]], dim = 2, ncells = 5) } \concept{objects} Seurat/man/AnnotateAnchors.Rd0000644000176200001440000000256415056057544015670 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/integration.R \name{AnnotateAnchors} \alias{AnnotateAnchors} \alias{AnnotateAnchors.default} \alias{AnnotateAnchors.IntegrationAnchorSet} \alias{AnnotateAnchors.TransferAnchorSet} \title{Add info to anchor matrix} \usage{ AnnotateAnchors(anchors, vars, slot, ...) \method{AnnotateAnchors}{default}( anchors, vars = NULL, slot = NULL, object.list, assay = NULL, ... ) \method{AnnotateAnchors}{IntegrationAnchorSet}( anchors, vars = NULL, slot = NULL, object.list = NULL, assay = NULL, ... ) \method{AnnotateAnchors}{TransferAnchorSet}( anchors, vars = NULL, slot = NULL, reference = NULL, query = NULL, assay = NULL, ... ) } \arguments{ \item{anchors}{An \code{\link{AnchorSet}} object} \item{vars}{Variables to pull for each object via FetchData} \item{slot}{Slot to pull feature data for} \item{...}{Arguments passed to other methods} \item{object.list}{List of Seurat objects} \item{assay}{Specify the Assay per object if annotating with expression data} \item{reference}{Reference object used in \code{\link{FindTransferAnchors}}} \item{query}{Query object used in \code{\link{FindTransferAnchors}}} } \value{ Returns the anchor dataframe with additional columns for annotation metadata } \description{ Add info to anchor matrix } \concept{integration} Seurat/man/LoadCurioSeeker.Rd0000644000176200001440000000103515056057544015611 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{LoadCurioSeeker} \alias{LoadCurioSeeker} \title{Load Curio Seeker data} \usage{ LoadCurioSeeker(data.dir, assay = "Spatial") } \arguments{ \item{data.dir}{location of data directory that contains the counts matrix, gene names, barcodes/beads, and barcodes/bead location files.} \item{assay}{Name of assay to associate spatial data to} } \value{ A \code{\link{Seurat}} object } \description{ Load Curio Seeker data } \concept{preprocessing} Seurat/man/ColorDimSplit.Rd0000644000176200001440000001116315070750476015320 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{ColorDimSplit} \alias{ColorDimSplit} \title{Color dimensional reduction plot by tree split} \usage{ ColorDimSplit( object, node, left.color = "red", right.color = "blue", other.color = "grey50", ... ) } \arguments{ \item{object}{Seurat object} \item{node}{Node in cluster tree on which to base the split} \item{left.color}{Color for the left side of the split} \item{right.color}{Color for the right side of the split} \item{other.color}{Color for all other cells} \item{...}{ Arguments passed on to \code{\link[=DimPlot]{DimPlot}} \describe{ \item{\code{dims}}{Dimensions to plot, must be a two-length numeric vector specifying x- and y-dimensions} \item{\code{cells}}{Vector of cells to plot (default is all cells)} \item{\code{cols}}{Vector of colors, each color corresponds to an identity class. This may also be a single character or numeric value corresponding to a palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}. By default, ggplot2 assigns colors. We also include a number of palettes from the pals package. See \code{\link{DiscretePalette}} for details.} \item{\code{pt.size}}{Adjust point size for plotting} \item{\code{reduction}}{Which dimensionality reduction to use. If not specified, first searches for umap, then tsne, then pca} \item{\code{group.by}}{Name of one or more metadata columns to group (color) cells by (for example, orig.ident); pass 'ident' to group by identity class} \item{\code{split.by}}{A factor in object metadata to split the plot by, pass 'ident' to split by cell identity} \item{\code{shape.by}}{If NULL, all points are circles (default). You can specify any cell attribute (that can be pulled with FetchData) allowing for both different colors and different shapes on cells. Only applicable if \code{raster = FALSE}.} \item{\code{order}}{Specify the order of plotting for the idents. This can be useful for crowded plots if points of interest are being buried. Provide either a full list of valid idents or a subset to be plotted last (on top)} \item{\code{shuffle}}{Whether to randomly shuffle the order of points. This can be useful for crowded plots if points of interest are being buried. (default is FALSE)} \item{\code{seed}}{Sets the seed if randomly shuffling the order of points.} \item{\code{label}}{Whether to label the clusters} \item{\code{label.size}}{Sets size of labels} \item{\code{label.color}}{Sets the color of the label text} \item{\code{label.box}}{Whether to put a box around the label text (geom_text vs geom_label)} \item{\code{alpha}}{Alpha value for plotting (default is 1)} \item{\code{repel}}{Repel labels} \item{\code{stroke.size}}{Adjust stroke (outline) size of points} \item{\code{cells.highlight}}{A list of character or numeric vectors of cells to highlight. If only one group of cells desired, can simply pass a vector instead of a list. If set, colors selected cells to the color(s) in \code{cols.highlight} and other cells black (white if dark.theme = TRUE); will also resize to the size(s) passed to \code{sizes.highlight}} \item{\code{cols.highlight}}{A vector of colors to highlight the cells as; will repeat to the length groups in cells.highlight} \item{\code{sizes.highlight}}{Size of highlighted cells; will repeat to the length groups in cells.highlight. If \code{sizes.highlight = TRUE} size of all points will be this value.} \item{\code{na.value}}{Color value for NA points when using custom scale} \item{\code{ncol}}{Number of columns for display when combining plots} \item{\code{combine}}{Combine plots into a single \code{\link[patchwork]{patchwork}ed} ggplot object. If \code{FALSE}, return a list of ggplot objects} \item{\code{raster}}{Convert points to raster format, default is \code{NULL} which automatically rasterizes if plotting more than 100,000 cells} \item{\code{raster.dpi}}{Pixel resolution for rasterized plots, passed to geom_scattermore(). Default is c(512, 512).} \item{\code{label.size.cutoff}}{Clusters with fewer cells than the cutoff are not labeled (replaced with ' ' label)} }} } \value{ Returns a DimPlot } \description{ Returns a DimPlot colored based on whether the cells fall in clusters to the left or to the right of a node split in the cluster tree. } \examples{ \dontrun{ if (requireNamespace("ape", quietly = TRUE)) { data("pbmc_small") pbmc_small <- BuildClusterTree(object = pbmc_small, verbose = FALSE) PlotClusterTree(pbmc_small) ColorDimSplit(pbmc_small, node = 5) } } } \seealso{ \code{\link{DimPlot}} } \concept{visualization} Seurat/man/RunMarkVario.Rd0000644000176200001440000000117115056057544015152 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{RunMarkVario} \alias{RunMarkVario} \title{Run the mark variogram computation on a given position matrix and expression matrix.} \usage{ RunMarkVario(spatial.location, data, ...) } \arguments{ \item{spatial.location}{A 2 column matrix giving the spatial locations of each of the data points also in data} \item{data}{Matrix containing the data used as "marks" (e.g. gene expression)} \item{...}{Arguments passed to markvario} } \description{ Wraps the functionality of markvario from the spatstat package. } \concept{preprocessing} Seurat/man/FindClusters.Rd0000644000176200001440000000723415070750476015205 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/clustering.R \name{FindClusters} \alias{FindClusters} \alias{FindClusters.default} \alias{FindClusters.Seurat} \title{Cluster Determination} \usage{ FindClusters(object, ...) \method{FindClusters}{default}( object, modularity.fxn = 1, initial.membership = NULL, node.sizes = NULL, resolution = 0.8, method = deprecated(), algorithm = 1, leiden_method = c("leidenbase", "igraph"), leiden_objective_function = c("modularity", "CPM"), n.start = 10, n.iter = 10, random.seed = 0, group.singletons = TRUE, temp.file.location = NULL, edge.file.name = NULL, verbose = TRUE, ... ) \method{FindClusters}{Seurat}( object, graph.name = NULL, cluster.name = NULL, modularity.fxn = 1, initial.membership = NULL, node.sizes = NULL, resolution = 0.8, method = NULL, algorithm = 1, leiden_method = c("leidenbase", "igraph"), leiden_objective_function = c("modularity", "CPM"), n.start = 10, n.iter = 10, random.seed = 0, group.singletons = TRUE, temp.file.location = NULL, edge.file.name = NULL, verbose = TRUE, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods} \item{modularity.fxn}{Modularity function (1 = standard; 2 = alternative).} \item{initial.membership}{Passed to the `initial_membership` parameter of `leidenbase::leiden_find_partition`.} \item{node.sizes}{Passed to the `node_sizes` parameter of `leidenbase::leiden_find_partition`.} \item{resolution}{Value of the resolution parameter, use a value above (below) 1.0 if you want to obtain a larger (smaller) number of communities.} \item{method}{DEPRECATED.} \item{algorithm}{Algorithm for modularity optimization (1 = original Louvain algorithm; 2 = Louvain algorithm with multilevel refinement; 3 = SLM algorithm; 4 = Leiden algorithm).} \item{leiden_method}{Choose from the leidenbase ("leidenbase") or igraph ("igraph") packages for running leiden. Default is "leidenbase"} \item{leiden_objective_function}{objective function to use if `leiden_method = "igraph"`. See \code{\link[igraph]{cluster_leiden}} for more information. Default is "modularity".} \item{n.start}{Number of random starts.} \item{n.iter}{Maximal number of iterations per random start.} \item{random.seed}{Seed of the random number generator.} \item{group.singletons}{Group singletons into nearest cluster. If FALSE, assign all singletons to a "singleton" group} \item{temp.file.location}{Directory where intermediate files will be written. Specify the ABSOLUTE path.} \item{edge.file.name}{Edge file to use as input for modularity optimizer jar.} \item{verbose}{Print output} \item{graph.name}{Name of graph to use for the clustering algorithm} \item{cluster.name}{Name of output clusters} } \value{ Returns a Seurat object where the idents have been updated with new cluster info; latest clustering results will be stored in object metadata under 'seurat_clusters'. Note that 'seurat_clusters' will be overwritten everytime FindClusters is run } \description{ Identify clusters of cells by a shared nearest neighbor (SNN) modularity optimization based clustering algorithm. First calculate k-nearest neighbors and construct the SNN graph. Then optimize the modularity function to determine clusters. For a full description of the algorithms, see Waltman and van Eck (2013) \emph{The European Physical Journal B}. Thanks to Nigel Delaney (evolvedmicrobe@github) for the rewrite of the Java modularity optimizer code in Rcpp! } \details{ To run Leiden algorithm, you must first install the leidenalg python package (e.g. via pip install leidenalg), see Traag et al (2018). } \concept{clustering} Seurat/man/ReadVitessce.Rd0000644000176200001440000000673015117326655015161 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R, R/convenience.R \name{ReadVitessce} \alias{ReadVitessce} \alias{LoadHuBMAPCODEX} \title{Read Data From Vitessce} \usage{ ReadVitessce( counts = NULL, coords = NULL, molecules = NULL, type = c("segmentations", "centroids"), filter = NA_character_ ) LoadHuBMAPCODEX(data.dir, fov, assay = "CODEX") } \arguments{ \item{counts}{Path or URL to a Vitessce-formatted JSON file with expression data; should end in \dQuote{\code{.genes.json}} or \dQuote{\code{.clusters.json}}; pass \code{NULL} to skip} \item{coords}{Path or URL to a Vitessce-formatted JSON file with cell/spot spatial coordinates; should end in \dQuote{\code{.cells.json}}; pass \code{NULL} to skip} \item{molecules}{Path or URL to a Vitessce-formatted JSON file with molecule spatial coordinates; should end in \dQuote{\code{.molecules.json}}; pass \code{NULL} to skip} \item{type}{Type of cell/spot spatial coordinates to return, choose one or more from: \itemize{ \item \dQuote{segmentations} cell/spot segmentations \item \dQuote{centroids} cell/spot centroids }} \item{filter}{A character to filter molecules by, pass \code{NA} to skip molecule filtering} \item{data.dir}{Path to a directory containing Vitessce cells and clusters JSONs} \item{fov}{Name to store FOV as} \item{assay}{Name to store expression matrix as} } \value{ \code{ReadVitessce}: A list with some combination of the following values: \itemize{ \item \dQuote{\code{counts}}: if \code{counts} is not \code{NULL}, an expression matrix with cells as columns and features as rows \item \dQuote{\code{centroids}}: if \code{coords} is not \code{NULL} and \code{type} is contains\dQuote{centroids}, a data frame with cell centroids in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} \item \dQuote{\code{segmentations}}: if \code{coords} is not \code{NULL} and \code{type} contains \dQuote{centroids}, a data frame with cell segmentations in three columns: \dQuote{x}, \dQuote{y} and \dQuote{cell} \item \dQuote{\code{molecules}}: if \code{molecules} is not \code{NULL}, a data frame with molecule spatial coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{gene} } \code{LoadHuBMAPCODEX}: A \code{\link[SeuratObject]{Seurat}} object } \description{ Read in data from Vitessce-formatted JSON files } \note{ This function requires the \href{https://cran.r-project.org/package=jsonlite}{\pkg{jsonlite}} package to be installed } \section{Progress Updates with \pkg{progressr}}{ This function uses \href{https://cran.r-project.org/package=progressr}{\pkg{progressr}} to render status updates and progress bars. To enable progress updates, wrap the function call in \code{\link[progressr]{with_progress}} or run \code{\link[progressr:handlers]{handlers(global = TRUE)}} before running this function. For more details about \pkg{progressr}, please read \href{https://progressr.futureverse.org/articles/progressr-01-intro.html}{\code{vignette("progressr-intro")}} } \examples{ \dontrun{ coords <- ReadVitessce( counts = "https://s3.amazonaws.com/vitessce-data/0.0.31/master_release/wang/wang.genes.json", coords = "https://s3.amazonaws.com/vitessce-data/0.0.31/master_release/wang/wang.cells.json", molecules = "https://s3.amazonaws.com/vitessce-data/0.0.31/master_release/wang/wang.molecules.json" ) names(coords) coords$counts[1:10, 1:10] head(coords$centroids) head(coords$segmentations) head(coords$molecules) } } \concept{preprocessing} Seurat/man/RunCCA.Rd0000644000176200001440000000502115056057544013643 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/dimensional_reduction.R \name{RunCCA} \alias{RunCCA} \alias{RunCCA.default} \alias{RunCCA.Seurat} \title{Perform Canonical Correlation Analysis} \usage{ RunCCA(object1, object2, ...) \method{RunCCA}{default}( object1, object2, standardize = TRUE, num.cc = 20, seed.use = 42, verbose = FALSE, ... ) \method{RunCCA}{Seurat}( object1, object2, assay1 = NULL, assay2 = NULL, num.cc = 20, features = NULL, renormalize = FALSE, rescale = FALSE, compute.gene.loadings = TRUE, add.cell.id1 = NULL, add.cell.id2 = NULL, verbose = TRUE, ... ) } \arguments{ \item{object1}{First Seurat object} \item{object2}{Second Seurat object.} \item{...}{Extra parameters (passed onto MergeSeurat in case with two objects passed, passed onto ScaleData in case with single object and rescale.groups set to TRUE)} \item{standardize}{Standardize matrices - scales columns to have unit variance and mean 0} \item{num.cc}{Number of canonical vectors to calculate} \item{seed.use}{Random seed to set. If NULL, does not set a seed} \item{verbose}{Show progress messages} \item{assay1, assay2}{Assays to pull from in the first and second objects, respectively} \item{features}{Set of genes to use in CCA. Default is the union of both the variable features sets present in both objects.} \item{renormalize}{Renormalize raw data after merging the objects. If FALSE, merge the data matrices also.} \item{rescale}{Rescale the datasets prior to CCA. If FALSE, uses existing data in the scale data slots.} \item{compute.gene.loadings}{Also compute the gene loadings. NOTE - this will scale every gene in the dataset which may impose a high memory cost.} \item{add.cell.id1, add.cell.id2}{Add ...} } \value{ Returns a combined Seurat object with the CCA results stored. } \description{ Runs a canonical correlation analysis using a diagonal implementation of CCA. For details about stored CCA calculation parameters, see \code{PrintCCAParams}. } \examples{ \dontrun{ data("pbmc_small") pbmc_small # As CCA requires two datasets, we will split our test object into two just for this example pbmc1 <- subset(pbmc_small, cells = colnames(pbmc_small)[1:40]) pbmc2 <- subset(pbmc_small, cells = colnames(x = pbmc_small)[41:80]) pbmc1[["group"]] <- "group1" pbmc2[["group"]] <- "group2" pbmc_cca <- RunCCA(object1 = pbmc1, object2 = pbmc2) # Print results print(x = pbmc_cca[["cca"]]) } } \seealso{ \code{\link[SeuratObject]{merge.Seurat}} } \concept{dimensional_reduction} Seurat/man/JackStrawPlot.Rd0000644000176200001440000000330115056057544015317 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{JackStrawPlot} \alias{JackStrawPlot} \title{JackStraw Plot} \usage{ JackStrawPlot( object, dims = 1:5, cols = NULL, reduction = "pca", xmax = 0.1, ymax = 0.3 ) } \arguments{ \item{object}{Seurat object} \item{dims}{Dims to plot} \item{cols}{Vector of colors, each color corresponds to an individual PC. This may also be a single character or numeric value corresponding to a palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}. By default, ggplot2 assigns colors. We also include a number of palettes from the pals package. See \code{\link{DiscretePalette}} for details.} \item{reduction}{reduction to pull jackstraw info from} \item{xmax}{X-axis maximum on each QQ plot.} \item{ymax}{Y-axis maximum on each QQ plot.} } \value{ A ggplot object } \description{ Plots the results of the JackStraw analysis for PCA significance. For each PC, plots a QQ-plot comparing the distribution of p-values for all genes across each PC, compared with a uniform distribution. Also determines a p-value for the overall significance of each PC (see Details). } \details{ Significant PCs should show a p-value distribution (black curve) that is strongly skewed to the left compared to the null distribution (dashed line) The p-value for each PC is based on a proportion test comparing the number of genes with a p-value below a particular threshold (score.thresh), compared with the proportion of genes expected under a uniform distribution of p-values. } \examples{ data("pbmc_small") JackStrawPlot(object = pbmc_small) } \seealso{ \code{\link{ScoreJackStraw}} } \author{ Omri Wurtzel } \concept{visualization} Seurat/man/ReadParseBio.Rd0000644000176200001440000000064015056057544015072 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/convenience.R \name{ReadParseBio} \alias{ReadParseBio} \title{Read output from Parse Biosciences} \usage{ ReadParseBio(data.dir, ...) } \arguments{ \item{data.dir}{Directory containing the data files} \item{...}{Extra parameters passed to \code{\link{ReadMtx}}} } \description{ Read output from Parse Biosciences } \concept{convenience} Seurat/man/MVP.Rd0000644000176200001440000000131215056057544013231 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing5.R \name{MVP} \alias{MVP} \title{Find variable features based on mean.var.plot} \usage{ MVP( data, verbose = TRUE, nselect = 2000L, mean.cutoff = c(0.1, 8), dispersion.cutoff = c(1, Inf), ... ) } \arguments{ \item{data}{Data matrix} \item{verbose}{Whether to print messages and progress bars} \item{nselect}{Number of features to select based on dispersion values} \item{mean.cutoff}{Numeric of length two specifying the min and max values} \item{dispersion.cutoff}{Numeric of length two specifying the min and max values} } \description{ Find variable features based on mean.var.plot } \keyword{internal} Seurat/man/SelectIntegrationFeatures5.Rd0000644000176200001440000000177715056057544020015 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{SelectIntegrationFeatures5} \alias{SelectIntegrationFeatures5} \title{Select integration features} \usage{ SelectIntegrationFeatures5( object, nfeatures = 2000, assay = NULL, method = NULL, layers = NULL, verbose = TRUE, ... ) } \arguments{ \item{object}{Seurat object} \item{nfeatures}{Number of features to return for integration} \item{assay}{Name of assay to use for integration feature selection} \item{method}{Which method to pull. For \code{HVFInfo} and \code{VariableFeatures}, choose one from one of the following: \itemize{ \item \dQuote{vst} \item \dQuote{sctransform} or \dQuote{sct} \item \dQuote{mean.var.plot}, \dQuote{dispersion}, \dQuote{mvp}, or \dQuote{disp} }} \item{layers}{Name of layers to use for integration feature selection} \item{verbose}{Print messages} \item{...}{Arguments passed on to \code{method}} } \description{ Select integration features } \concept{integration} Seurat/man/JointPCAIntegration.Rd0000644000176200001440000000606615056057544016415 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration5.R \name{JointPCAIntegration} \alias{JointPCAIntegration} \title{Seurat-Joint PCA Integration} \usage{ JointPCAIntegration( object = NULL, assay = NULL, layers = NULL, orig = NULL, new.reduction = "integrated.dr", reference = NULL, features = NULL, normalization.method = c("LogNormalize", "SCT"), dims = 1:30, k.anchor = 20, scale.layer = "scale.data", dims.to.integrate = NULL, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, verbose = TRUE, ... ) } \arguments{ \item{object}{A \code{Seurat} object} \item{assay}{Name of \code{Assay} in the \code{Seurat} object} \item{layers}{Names of layers in \code{assay}} \item{orig}{A \link[SeuratObject]{DimReduc} to correct} \item{new.reduction}{Name of new integrated dimensional reduction} \item{reference}{A reference \code{Seurat} object} \item{features}{A vector of features to use for integration} \item{normalization.method}{Name of normalization method used: LogNormalize or SCT} \item{dims}{Dimensions of dimensional reduction to use for integration} \item{k.anchor}{How many neighbors (k) to use when picking anchors} \item{scale.layer}{Name of scaled layer in \code{Assay}} \item{dims.to.integrate}{Number of dimensions to return integrated values for} \item{k.weight}{Number of neighbors to consider when weighting anchors} \item{weight.reduction}{Dimension reduction to use when calculating anchor weights. This can be one of: \itemize{ \item{A string, specifying the name of a dimension reduction present in all objects to be integrated} \item{A vector of strings, specifying the name of a dimension reduction to use for each object to be integrated} \item{A vector of \code{\link[SeuratObject]{DimReduc}} objects, specifying the object to use for each object in the integration} \item{NULL, in which case the full corrected space is used for computing anchor weights.} }} \item{sd.weight}{Controls the bandwidth of the Gaussian kernel for weighting} \item{sample.tree}{Specify the order of integration. Order of integration should be encoded in a matrix, where each row represents one of the pairwise integration steps. Negative numbers specify a dataset, positive numbers specify the integration results from a given row (the format of the merge matrix included in the \code{\link{hclust}} function output). For example: \code{matrix(c(-2, 1, -3, -1), ncol = 2)} gives: \if{html}{\out{
}}\preformatted{ [,1] [,2] [1,] -2 -3 [2,] 1 -1 }\if{html}{\out{
}} Which would cause dataset 2 and 3 to be integrated first, then the resulting object integrated with dataset 1. If NULL, the sample tree will be computed automatically.} \item{preserve.order}{Do not reorder objects based on size for each pairwise integration.} \item{verbose}{Print progress} \item{...}{Arguments passed on to \code{FindIntegrationAnchors}} } \description{ Seurat-Joint PCA Integration } \concept{integration} Seurat/man/GetImage.Rd0000644000176200001440000000166115116120241014236 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{GetImage.SlideSeq} \alias{GetImage.SlideSeq} \alias{GetImage.STARmap} \alias{GetImage.VisiumV1} \alias{GetImage.VisiumV2} \title{Get Image Data} \usage{ \method{GetImage}{SlideSeq}(object, mode = c("grob", "raster", "plotly", "raw"), ...) \method{GetImage}{STARmap}(object, mode = c("grob", "raster", "plotly", "raw"), ...) \method{GetImage}{VisiumV1}(object, mode = c("grob", "raster", "plotly", "raw"), ...) \method{GetImage}{VisiumV2}(object, mode = c("grob", "raster", "plotly", "raw"), ...) } \arguments{ \item{object}{An object} \item{mode}{How to return the image; should accept one of \dQuote{grob}, \dQuote{raster}, \dQuote{plotly}, or \dQuote{raw}} \item{...}{Arguments passed to other methods} } \description{ Get Image Data } \seealso{ \code{\link[SeuratObject:GetImage]{SeuratObject::GetImage}} } \concept{objects} \concept{spatial} Seurat/man/FeatureScatter.Rd0000644000176200001440000000526715056057544015525 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{FeatureScatter} \alias{FeatureScatter} \alias{GenePlot} \title{Scatter plot of single cell data} \usage{ FeatureScatter( object, feature1, feature2, cells = NULL, shuffle = FALSE, seed = 1, group.by = NULL, split.by = NULL, cols = NULL, pt.size = 1, shape.by = NULL, span = NULL, smooth = FALSE, combine = TRUE, slot = "data", plot.cor = TRUE, ncol = NULL, raster = NULL, raster.dpi = c(512, 512), jitter = FALSE, log = FALSE ) } \arguments{ \item{object}{Seurat object} \item{feature1}{First feature to plot. Typically feature expression but can also be metrics, PC scores, etc. - anything that can be retreived with FetchData} \item{feature2}{Second feature to plot.} \item{cells}{Cells to include on the scatter plot.} \item{shuffle}{Whether to randomly shuffle the order of points. This can be useful for crowded plots if points of interest are being buried. (default is FALSE)} \item{seed}{Sets the seed if randomly shuffling the order of points.} \item{group.by}{Name of one or more metadata columns to group (color) cells by (for example, orig.ident); pass 'ident' to group by identity class} \item{split.by}{A factor in object metadata to split the feature plot by, pass 'ident' to split by cell identity} \item{cols}{Colors to use for identity class plotting.} \item{pt.size}{Size of the points on the plot} \item{shape.by}{Ignored for now} \item{span}{Spline span in loess function call, if \code{NULL}, no spline added} \item{smooth}{Smooth the graph (similar to smoothScatter)} \item{combine}{Combine plots into a single \code{\link[patchwork]{patchwork}ed}} \item{slot}{Slot to pull data from, should be one of 'counts', 'data', or 'scale.data'} \item{plot.cor}{Display correlation in plot title} \item{ncol}{Number of columns if plotting multiple plots} \item{raster}{Convert points to raster format, default is \code{NULL} which will automatically use raster if the number of points plotted is greater than 100,000} \item{raster.dpi}{Pixel resolution for rasterized plots, passed to geom_scattermore(). Default is c(512, 512).} \item{jitter}{Jitter for easier visualization of crowded points (default is FALSE)} \item{log}{Plot features on the log scale (default is FALSE)} } \value{ A ggplot object } \description{ Creates a scatter plot of two features (typically feature expression), across a set of single cells. Cells are colored by their identity class. Pearson correlation between the two features is displayed above the plot. } \examples{ data("pbmc_small") FeatureScatter(object = pbmc_small, feature1 = 'CD9', feature2 = 'CD3E') } \concept{visualization} Seurat/man/SCTransform.Rd0000644000176200001440000001506515104403544014767 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/preprocessing.R, % R/preprocessing5.R \name{SCTransform} \alias{SCTransform} \alias{SCTransform.default} \alias{SCTransform.Assay} \alias{SCTransform.Seurat} \alias{SCTransform.IterableMatrix} \title{Perform sctransform-based normalization} \usage{ SCTransform(object, ...) \method{SCTransform}{default}( object, cell.attr, reference.SCT.model = NULL, do.correct.umi = TRUE, ncells = 5000, residual.features = NULL, variable.features.n = 3000, variable.features.rv.th = 1.3, vars.to.regress = NULL, latent.data = NULL, do.scale = FALSE, do.center = TRUE, clip.range = c(-sqrt(x = ncol(x = umi)/30), sqrt(x = ncol(x = umi)/30)), vst.flavor = "v2", conserve.memory = FALSE, return.only.var.genes = TRUE, seed.use = 1448145, verbose = TRUE, ... ) \method{SCTransform}{Assay}( object, cell.attr, reference.SCT.model = NULL, do.correct.umi = TRUE, ncells = 5000, residual.features = NULL, variable.features.n = 3000, variable.features.rv.th = 1.3, vars.to.regress = NULL, latent.data = NULL, do.scale = FALSE, do.center = TRUE, clip.range = c(-sqrt(x = ncol(x = object)/30), sqrt(x = ncol(x = object)/30)), vst.flavor = "v2", conserve.memory = FALSE, return.only.var.genes = TRUE, seed.use = 1448145, verbose = TRUE, ... ) \method{SCTransform}{Seurat}( object, assay = "RNA", new.assay.name = "SCT", reference.SCT.model = NULL, do.correct.umi = TRUE, ncells = 5000, residual.features = NULL, variable.features.n = 3000, variable.features.rv.th = 1.3, vars.to.regress = NULL, do.scale = FALSE, do.center = TRUE, clip.range = c(-sqrt(x = ncol(x = object[[assay]])/30), sqrt(x = ncol(x = object[[assay]])/30)), vst.flavor = "v2", conserve.memory = FALSE, return.only.var.genes = TRUE, seed.use = 1448145, verbose = TRUE, ... ) \method{SCTransform}{IterableMatrix}( object, cell.attr, reference.SCT.model = NULL, do.correct.umi = TRUE, ncells = 5000, residual.features = NULL, variable.features.n = 3000, variable.features.rv.th = 1.3, vars.to.regress = NULL, latent.data = NULL, do.scale = FALSE, do.center = TRUE, clip.range = c(-sqrt(x = ncol(x = object)/30), sqrt(x = ncol(x = object)/30)), vst.flavor = "v2", conserve.memory = FALSE, return.only.var.genes = TRUE, seed.use = 1448145, verbose = TRUE, ... ) } \arguments{ \item{object}{A Seurat object or UMI count matrix.} \item{...}{Additional arguments passed to \code{sctransform::vst}.} \item{cell.attr}{Optional metadata frame (cells × attributes).} \item{reference.SCT.model}{Preâ€fitted SCT model (supports only \code{log_umi} as latent variable). If provided, computes residuals via that model. When \code{residual.features} is NULL, uses the model’s top \code{variable.features.n}; otherwise, sets the assay’s variable features to \code{residual.features}.} \item{do.correct.umi}{Logical; if TRUE (default), stores corrected UMIs in \code{counts}.} \item{ncells}{Integer; number of cells to subsample when fitting NB regression (default: 5000).} \item{residual.features}{Character vector of genes to compute residuals for. Default NULL (all genes). If set, these become the assay’s variable features.} \item{variable.features.n}{Integer; when \code{residual.features} is NULL, select this many top features by residual variance (default: 3000).} \item{variable.features.rv.th}{Numeric; if \code{variable.features.n} is NULL, select features exceeding this residualâ€variance threshold (default: 1.3).} \item{vars.to.regress}{Character vector of metadata columns (e.g. \code{percent.mito}) to regress out in a second, nonâ€regularized model.} \item{latent.data}{Numeric matrix (cells × latent covariates) to regress out.} \item{do.scale}{Logical; if TRUE, scale residuals to unit variance (default: FALSE).} \item{do.center}{Logical; if TRUE, center residuals to mean zero (default: TRUE).} \item{clip.range}{Numeric vector of length 2; range to clip residuals (default \code{c(-sqrt(n/30), sqrt(n/30))}, with n = number of cells).} \item{vst.flavor}{Character; if \code{"v2"}, uses \code{method = "glmGamPoi_offset"}, \code{n_cells = 2000}, and \code{exclude_poisson = TRUE} to fit \eqn{\theta} and intercept only.} \item{conserve.memory}{Logical; if TRUE, never builds the full residual matrix (slower but memoryâ€efficient; forces \code{return.only.var.genes=TRUE}; default: FALSE).} \item{return.only.var.genes}{Logical; if TRUE (default), \code{scale.data} is subset to variable features only.} \item{seed.use}{Integer; random seed for reproducibility (default: 1448145). Set to NULL to skip setting a seed.} \item{verbose}{Logical; whether to print progress messages (default: TRUE).} \item{assay}{Name of assay to pull the count data from; default is 'RNA'} \item{new.assay.name}{Name for the new assay containing the normalized data; default is 'SCT'} } \value{ A Seurat object with a new \code{SCT} assay containing: \code{counts} (corrected UMIs), \code{data} (log1p counts), and \code{scale.data} (Pearson residuals), plus \code{misc} for intermediate \code{vst} outputs. } \description{ Perform a varianceâ€stabilizing transformation on UMI counts using \code{sctransform::vst} (https://github.com/satijalab/sctransform). This replaces the \code{NormalizeData} → \code{FindVariableFeatures} → \code{ScaleData} workflow by fitting a regularized negative binomial model per gene and returning: } \details{ - A new assay (default name “SCTâ€), in which: - \code{counts}: depthâ€corrected UMI counts (as if each cell had uniform sequencing depth; controlled by \code{do.correct.umi}). - \code{data}: \code{log1p} of corrected counts. - \code{scale.data}: Pearson residuals from the fitted NB model (optionally centered and/or scaled). - \code{misc}: intermediate outputs from \code{sctransform::vst}. When multiple \code{counts} layers exist (e.g. after \code{split()}), each layer is modeled independently. A consensus variableâ€feature set is then defined by ranking features by how often they’re called “variable†across different layers (ties broken by median rank). By default, \code{sctransform::vst} will drop features expressed in fewer than five cells. In the multi-layer case, this can lead to consenus variable-features being excluded from the output's \code{scale.data} when a feature is "variable" across many layers but sparsely expressed in at least one. } \seealso{ \code{\link[sctransform]{vst}}, \code{\link[sctransform]{get_residuals}}, \code{\link[sctransform]{correct_counts}} } \concept{preprocessing} Seurat/man/DEenrichRPlot.Rd0000644000176200001440000001055115074241310015220 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mixscape.R \name{DEenrichRPlot} \alias{DEenrichRPlot} \title{DE and EnrichR pathway visualization barplot} \usage{ DEenrichRPlot( object, ident.1 = NULL, ident.2 = NULL, balanced = TRUE, logfc.threshold = 0.25, assay = NULL, max.genes, test.use = "wilcox", p.val.cutoff = 0.05, cols = NULL, enrich.database = NULL, num.pathway = 10, return.gene.list = FALSE, ... ) } \arguments{ \item{object}{Name of object class Seurat.} \item{ident.1}{Cell class identity 1.} \item{ident.2}{Cell class identity 2.} \item{balanced}{Option to display pathway enrichments for both negative and positive DE genes.If false, only positive DE gene will be displayed.} \item{logfc.threshold}{Limit testing to genes which show, on average, at least X-fold difference (log-scale) between the two groups of cells. Default is 0.25. Increasing logfc.threshold speeds up the function, but can miss weaker signals.} \item{assay}{Assay to use in differential expression testing} \item{max.genes}{Maximum number of genes to use as input to enrichR.} \item{test.use}{Denotes which test to use. Available options are: \itemize{ \item{"wilcox"} : Identifies differentially expressed genes between two groups of cells using a Wilcoxon Rank Sum test (default); will use a fast implementation by Presto if installed \item{"wilcox_limma"} : Identifies differentially expressed genes between two groups of cells using the limma implementation of the Wilcoxon Rank Sum test; set this option to reproduce results from Seurat v4 \item{"bimod"} : Likelihood-ratio test for single cell gene expression, (McDavid et al., Bioinformatics, 2013) \item{"roc"} : Identifies 'markers' of gene expression using ROC analysis. For each gene, evaluates (using AUC) a classifier built on that gene alone, to classify between two groups of cells. An AUC value of 1 means that expression values for this gene alone can perfectly classify the two groupings (i.e. Each of the cells in cells.1 exhibit a higher level than each of the cells in cells.2). An AUC value of 0 also means there is perfect classification, but in the other direction. A value of 0.5 implies that the gene has no predictive power to classify the two groups. Returns a 'predictive power' (abs(AUC-0.5) * 2) ranked matrix of putative differentially expressed genes. \item{"t"} : Identify differentially expressed genes between two groups of cells using the Student's t-test. \item{"negbinom"} : Identifies differentially expressed genes between two groups of cells using a negative binomial generalized linear model. Use only for UMI-based datasets \item{"poisson"} : Identifies differentially expressed genes between two groups of cells using a poisson generalized linear model. Use only for UMI-based datasets \item{"LR"} : Uses a logistic regression framework to determine differentially expressed genes. Constructs a logistic regression model predicting group membership based on each feature individually and compares this to a null model with a likelihood ratio test. \item{"MAST"} : Identifies differentially expressed genes between two groups of cells using a hurdle model tailored to scRNA-seq data. Utilizes the MAST package to run the DE testing. \item{"DESeq2"} : Identifies differentially expressed genes between two groups of cells based on a model using DESeq2 which uses a negative binomial distribution (Love et al, Genome Biology, 2014).This test does not support pre-filtering of genes based on average difference (or percent detection rate) between cell groups. However, genes may be pre-filtered based on their minimum detection rate (min.pct) across both cell groups. To use this method, please install DESeq2, using the instructions at https://bioconductor.org/packages/release/bioc/html/DESeq2.html }} \item{p.val.cutoff}{Cutoff to select DE genes.} \item{cols}{A list of colors to use for barplots.} \item{enrich.database}{Database to use from enrichR.} \item{num.pathway}{Number of pathways to display in barplot.} \item{return.gene.list}{Return list of DE genes} \item{...}{Arguments passed to other methods and to specific DE methods} } \value{ Returns one (only enriched) or two (both enriched and depleted) barplots with the top enriched/depleted GO terms from EnrichR. } \description{ DE and EnrichR pathway visualization barplot } \concept{mixscape} Seurat/man/SingleDimPlot.Rd0000644000176200001440000000522015056057544015303 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{SingleDimPlot} \alias{SingleDimPlot} \title{Plot a single dimension} \usage{ SingleDimPlot( data, dims, col.by = NULL, cols = NULL, pt.size = NULL, shape.by = NULL, alpha = 1, alpha.by = NULL, stroke.size = NULL, order = NULL, label = FALSE, repel = FALSE, label.size = 4, cells.highlight = NULL, cols.highlight = "#DE2D26", sizes.highlight = 1, na.value = "grey50", raster = NULL, raster.dpi = NULL ) } \arguments{ \item{data}{Data to plot} \item{dims}{A two-length numeric vector with dimensions to use} \item{col.by}{...} \item{cols}{Vector of colors, each color corresponds to an identity class. This may also be a single character or numeric value corresponding to a palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}.By default, ggplot2 assigns colors} \item{pt.size}{Adjust point size for plotting} \item{shape.by}{If NULL, all points are circles (default). You can specify any cell attribute (that can be pulled with \code{\link{FetchData}}) allowing for both different colors and different shapes on cells.} \item{alpha}{Alpha value for plotting (default is 1)} \item{alpha.by}{Mapping variable for the point alpha value} \item{stroke.size}{Adjust stroke (outline) size of points} \item{order}{Specify the order of plotting for the idents. This can be useful for crowded plots if points of interest are being buried. Provide either a full list of valid idents or a subset to be plotted last (on top).} \item{label}{Whether to label the clusters} \item{repel}{Repel labels} \item{label.size}{Sets size of labels} \item{cells.highlight}{A list of character or numeric vectors of cells to highlight. If only one group of cells desired, can simply pass a vector instead of a list. If set, colors selected cells to the color(s) in \code{cols.highlight} and other cells black (white if dark.theme = TRUE); will also resize to the size(s) passed to \code{sizes.highlight}} \item{cols.highlight}{A vector of colors to highlight the cells as; will repeat to the length groups in cells.highlight} \item{sizes.highlight}{Size of highlighted cells; will repeat to the length groups in cells.highlight} \item{na.value}{Color value for NA points when using custom scale.} \item{raster}{Convert points to raster format, default is \code{NULL} which will automatically use raster if the number of points plotted is greater than 100,000} \item{raster.dpi}{the pixel resolution for rastered plots, passed to geom_scattermore(). Default is c(512, 512)} } \value{ A ggplot2 object } \description{ Plot a single dimension } \keyword{internal} Seurat/man/FastRPCAIntegration.Rd0000644000176200001440000000463315056057544016347 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{FastRPCAIntegration} \alias{FastRPCAIntegration} \title{Perform integration on the joint PCA cell embeddings.} \usage{ FastRPCAIntegration( object.list, reference = NULL, anchor.features = 2000, k.anchor = 20, dims = 1:30, scale = TRUE, normalization.method = c("LogNormalize", "SCT"), new.reduction.name = "integrated_dr", npcs = 50, findintegrationanchors.args = list(), verbose = TRUE ) } \arguments{ \item{object.list}{A list of \code{\link{Seurat}} objects between which to find anchors for downstream integration.} \item{reference}{A vector specifying the object/s to be used as a reference during integration. If NULL (default), all pairwise anchors are found (no reference/s). If not NULL, the corresponding objects in \code{object.list} will be used as references. When using a set of specified references, anchors are first found between each query and each reference. The references are then integrated through pairwise integration. Each query is then mapped to the integrated reference.} \item{anchor.features}{Can be either: \itemize{ \item{A numeric value. This will call \code{\link{SelectIntegrationFeatures}} to select the provided number of features to be used in anchor finding} \item{A vector of features to be used as input to the anchor finding process} }} \item{k.anchor}{How many neighbors (k) to use when picking anchors} \item{dims}{Which dimensions to use from the CCA to specify the neighbor search space} \item{scale}{Whether or not to scale the features provided. Only set to FALSE if you have previously scaled the features you want to use for each object in the object.list} \item{normalization.method}{Name of normalization method used: LogNormalize or SCT} \item{new.reduction.name}{Name of integrated dimensional reduction} \item{npcs}{Total Number of PCs to compute and store (50 by default)} \item{findintegrationanchors.args}{A named list of additional arguments to \code{\link{FindIntegrationAnchors}}} \item{verbose}{Print messages and progress} } \value{ Returns a Seurat object with integrated dimensional reduction } \description{ This is a convenience wrapper function around the following three functions that are often run together when perform integration. \code{\link{FindIntegrationAnchors}}, \code{\link{RunPCA}}, \code{\link{IntegrateEmbeddings}}. } \concept{integration} Seurat/man/LogNormalize.Rd0000644000176200001440000000220415056057544015172 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/preprocessing.R, % R/preprocessing5.R \name{LogNormalize} \alias{LogNormalize} \alias{LogNormalize.data.frame} \alias{LogNormalize.V3Matrix} \alias{LogNormalize.default} \title{Normalize Raw Data} \usage{ LogNormalize(data, scale.factor = 10000, margin = 2L, verbose = TRUE, ...) \method{LogNormalize}{data.frame}(data, scale.factor = 10000, margin = 2L, verbose = TRUE, ...) \method{LogNormalize}{V3Matrix}(data, scale.factor = 10000, margin = 2L, verbose = TRUE, ...) \method{LogNormalize}{default}(data, scale.factor = 10000, margin = 2L, verbose = TRUE, ...) } \arguments{ \item{data}{Matrix with the raw count data} \item{scale.factor}{Scale the data; default is \code{1e4}} \item{margin}{Margin to normalize over} \item{verbose}{Print progress} \item{...}{Arguments passed to other methods} } \value{ A matrix with the normalized and log-transformed data } \description{ Normalize Raw Data } \examples{ mat <- matrix(data = rbinom(n = 25, size = 5, prob = 0.2), nrow = 5) mat mat_norm <- LogNormalize(data = mat) mat_norm } \concept{preprocessing} Seurat/man/VisiumV2-class.Rd0000644000176200001440000000124615056057544015364 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{VisiumV2-class} \alias{VisiumV2-class} \alias{VisiumV2} \title{The VisiumV2 class} \description{ The VisiumV2 class represents spatial information from the 10X Genomics Visium HD platform - it can also accomodate data from the standard Visium platform } \section{Slots}{ \describe{ \item{\code{image}}{A three-dimensional array with PNG image data, see \code{\link[png]{readPNG}} for more details} \item{\code{scale.factors}}{An object of class \code{\link{scalefactors}}; see \code{\link{scalefactors}} for more information} }} \concept{objects} \concept{spatial} Seurat/man/L2Dim.Rd0000644000176200001440000000114115056057544013476 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dimensional_reduction.R \name{L2Dim} \alias{L2Dim} \title{L2-normalization} \usage{ L2Dim(object, reduction, new.dr = NULL, new.key = NULL) } \arguments{ \item{object}{Seurat object} \item{reduction}{Dimensional reduction to normalize} \item{new.dr}{name of new dimensional reduction to store (default is olddr.l2)} \item{new.key}{name of key for new dimensional reduction} } \value{ Returns a \code{\link{Seurat}} object } \description{ Perform l2 normalization on given dimensional reduction } \concept{dimensional_reduction} Seurat/man/TopFeatures.Rd0000644000176200001440000000172615056057544015041 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{TopFeatures} \alias{TopFeatures} \title{Find features with highest scores for a given dimensional reduction technique} \usage{ TopFeatures( object, dim = 1, nfeatures = 20, projected = FALSE, balanced = FALSE, ... ) } \arguments{ \item{object}{DimReduc object} \item{dim}{Dimension to use} \item{nfeatures}{Number of features to return} \item{projected}{Use the projected feature loadings} \item{balanced}{Return an equal number of features with both + and - scores.} \item{...}{Extra parameters passed to \code{\link{Loadings}}} } \value{ Returns a vector of features } \description{ Return a list of features with the strongest contribution to a set of components } \examples{ data("pbmc_small") pbmc_small TopFeatures(object = pbmc_small[["pca"]], dim = 1) # After projection: TopFeatures(object = pbmc_small[["pca"]], dim = 1, projected = TRUE) } \concept{objects} Seurat/man/ReadXenium.Rd0000644000176200001440000000503515056057544014636 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/convenience.R, R/preprocessing.R \name{LoadXenium} \alias{LoadXenium} \alias{ReadXenium} \title{Read and Load 10x Genomics Xenium in-situ data} \usage{ LoadXenium( data.dir, fov = "fov", assay = "Xenium", mols.qv.threshold = 20, cell.centroids = TRUE, molecule.coordinates = TRUE, segmentations = NULL, flip.xy = FALSE ) ReadXenium( data.dir, outs = c("segmentation_method", "matrix", "microns"), type = "centroids", mols.qv.threshold = 20, flip.xy = F ) } \arguments{ \item{data.dir}{Directory containing all Xenium output files with default filenames} \item{fov}{FOV name} \item{assay}{Assay name} \item{mols.qv.threshold}{Remove transcript molecules with a QV less than this threshold. QV >= 20 is the standard threshold used to construct the cell x gene count matrix.} \item{cell.centroids}{Whether or not to load cell centroids} \item{molecule.coordinates}{Whether or not to load molecule pixel coordinates} \item{segmentations}{One of "cell", "nucleus" or NULL (to load either cell segmentations, nucleus segmentations or neither)} \item{flip.xy}{Whether or not to flip the x/y coordinates of the Xenium outputs to match what is displayed in Xenium Explorer, or fit on your screen better.} \item{outs}{Types of molecular outputs to read; choose one or more of: \itemize{ \item \dQuote{matrix}: the counts matrix \item \dQuote{microns}: molecule coordinates \item \dQuote{segmentation_method}: cell segmentation method (for runs which use multi-modal segmentation) }} \item{type}{Type of cell spatial coordinate matrices to read; choose one or more of: \itemize{ \item \dQuote{centroids}: cell centroids in pixel coordinate space \item \dQuote{segmentations}: cell segmentations in pixel coordinate space \item \dQuote{nucleus_segmentations}: nucleus segmentations in pixel coordinate space }} } \value{ \code{LoadXenium}: A \code{\link[SeuratObject]{Seurat}} object \code{ReadXenium}: A list with some combination of the following values: \itemize{ \item \dQuote{\code{matrix}}: a \link[Matrix:dgCMatrix-class]{sparse matrix} with expression data; cells are columns and features are rows \item \dQuote{\code{centroids}}: a data frame with cell centroid coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} \item \dQuote{\code{pixels}}: a data frame with molecule pixel coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{gene} } } \description{ Read and Load 10x Genomics Xenium in-situ data } \concept{preprocessing} Seurat/man/RunICA.Rd0000644000176200001440000000511415070750476013654 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/dimensional_reduction.R \name{RunICA} \alias{RunICA} \alias{RunICA.default} \alias{RunICA.Assay} \alias{RunICA.StdAssay} \alias{RunICA.Seurat} \title{Run Independent Component Analysis on gene expression} \usage{ RunICA(object, ...) \method{RunICA}{default}( object, assay = NULL, nics = 50, rev.ica = FALSE, ica.function = "icafast", verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.name = "ica", reduction.key = "ica_", seed.use = 42, ... ) \method{RunICA}{Assay}( object, assay = NULL, features = NULL, nics = 50, rev.ica = FALSE, ica.function = "icafast", verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.name = "ica", reduction.key = "ica_", seed.use = 42, ... ) \method{RunICA}{StdAssay}( object, assay = NULL, features = NULL, layer = "scale.data", nics = 50, rev.ica = FALSE, ica.function = "icafast", verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.name = "ica", reduction.key = "ica_", seed.use = 42, ... ) \method{RunICA}{Seurat}( object, assay = NULL, features = NULL, nics = 50, rev.ica = FALSE, ica.function = "icafast", verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.name = "ica", reduction.key = "IC_", seed.use = 42, ... ) } \arguments{ \item{object}{Seurat object} \item{\dots}{Additional arguments to be passed to fastica} \item{assay}{Name of Assay ICA is being run on} \item{nics}{Number of ICs to compute} \item{rev.ica}{By default, computes the dimensional reduction on the cell x feature matrix. Setting to true will compute it on the transpose (feature x cell matrix).} \item{ica.function}{ICA function from ica package to run (options: icafast, icaimax, icajade)} \item{verbose}{Print the top genes associated with high/low loadings for the ICs} \item{ndims.print}{ICs to print genes for} \item{nfeatures.print}{Number of genes to print for each IC} \item{reduction.name}{dimensional reduction name} \item{reduction.key}{dimensional reduction key, specifies the string before the number for the dimension names.} \item{seed.use}{Set a random seed. Setting NULL will not set a seed.} \item{features}{Features to compute ICA on} \item{layer}{The layer in `assay` to use when running independant component analysis.} } \description{ Run fastica algorithm from the ica package for ICA dimensionality reduction. For details about stored ICA calculation parameters, see \code{PrintICAParams}. } \concept{dimensional_reduction} Seurat/man/GaussianSketch.Rd0000644000176200001440000000105215056057544015504 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sketching.R \name{GaussianSketch} \alias{GaussianSketch} \title{Gaussian sketching} \usage{ GaussianSketch(nsketch, ncells, seed = NA_integer_, ...) } \arguments{ \item{nsketch}{Number of sketching random cells} \item{ncells}{Number of cells in the original data} \item{seed}{a single value, interpreted as an integer, or \code{NULL} (see \sQuote{Details}).} \item{...}{Ignored} } \value{ ... } \description{ Gaussian sketching } \concept{sketching} \keyword{internal} Seurat/man/JackStrawData-class.Rd0000644000176200001440000000062215056057544016360 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reexports.R \docType{class} \name{JackStrawData-class} \alias{JackStrawData-class} \title{The JackStrawData Class} \description{ For more details, please see the documentation in \code{\link[SeuratObject:JackStrawData]{SeuratObject}} } \seealso{ \code{\link[SeuratObject:JackStrawData]{SeuratObject::JackStrawData-class}} } Seurat/man/GetResidual.Rd0000644000176200001440000000314015056057544015000 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{GetResidual} \alias{GetResidual} \title{Calculate pearson residuals of features not in the scale.data} \usage{ GetResidual( object, features, assay = NULL, umi.assay = "RNA", clip.range = NULL, replace.value = FALSE, na.rm = TRUE, verbose = TRUE ) } \arguments{ \item{object}{A seurat object} \item{features}{Name of features to add into the scale.data} \item{assay}{Name of the assay of the seurat object generated by SCTransform} \item{umi.assay}{Name of the assay of the seurat object containing UMI matrix and the default is RNA} \item{clip.range}{Numeric of length two specifying the min and max values the Pearson residual will be clipped to} \item{replace.value}{Recalculate residuals for all features, even if they are already present. Useful if you want to change the clip.range.} \item{na.rm}{For features where there is no feature model stored, return NA for residual value in scale.data when na.rm = FALSE. When na.rm is TRUE, only return residuals for features with a model stored for all cells.} \item{verbose}{Whether to print messages and progress bars} } \value{ Returns a Seurat object containing Pearson residuals of added features in its scale.data } \description{ This function calls sctransform::get_residuals. } \examples{ \dontrun{ data("pbmc_small") pbmc_small <- SCTransform(object = pbmc_small, variable.features.n = 20) pbmc_small <- GetResidual(object = pbmc_small, features = c('MS4A1', 'TCL1A')) } } \seealso{ \code{\link[sctransform]{get_residuals}} } \concept{preprocessing} Seurat/man/FoldChange.Rd0000644000176200001440000000670715056057544014576 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/differential_expression.R \name{FoldChange} \alias{FoldChange} \alias{FoldChange.default} \alias{FoldChange.Assay} \alias{FoldChange.SCTAssay} \alias{FoldChange.DimReduc} \alias{FoldChange.Seurat} \title{Fold Change} \usage{ FoldChange(object, ...) \method{FoldChange}{default}(object, cells.1, cells.2, mean.fxn, fc.name, features = NULL, ...) \method{FoldChange}{Assay}( object, cells.1, cells.2, features = NULL, slot = "data", pseudocount.use = 1, fc.name = NULL, mean.fxn = NULL, base = 2, norm.method = NULL, ... ) \method{FoldChange}{SCTAssay}( object, cells.1, cells.2, features = NULL, slot = "data", pseudocount.use = 1, fc.name = NULL, mean.fxn = NULL, base = 2, ... ) \method{FoldChange}{DimReduc}( object, cells.1, cells.2, features = NULL, slot = NULL, pseudocount.use = 1, fc.name = NULL, mean.fxn = NULL, ... ) \method{FoldChange}{Seurat}( object, ident.1 = NULL, ident.2 = NULL, group.by = NULL, subset.ident = NULL, assay = NULL, slot = "data", reduction = NULL, features = NULL, pseudocount.use = 1, mean.fxn = NULL, base = 2, fc.name = NULL, ... ) } \arguments{ \item{object}{A Seurat object} \item{...}{Arguments passed to other methods} \item{cells.1}{Vector of cell names belonging to group 1} \item{cells.2}{Vector of cell names belonging to group 2} \item{mean.fxn}{Function to use for fold change or average difference calculation} \item{fc.name}{Name of the fold change, average difference, or custom function column in the output data.frame} \item{features}{Features to calculate fold change for. If NULL, use all features} \item{slot}{Slot to pull data from} \item{pseudocount.use}{Pseudocount to add to averaged expression values when calculating logFC.} \item{base}{The base with respect to which logarithms are computed.} \item{norm.method}{Normalization method for mean function selection when \code{slot} is \dQuote{\code{data}}} \item{ident.1}{Identity class to calculate fold change for; pass an object of class \code{phylo} or 'clustertree' to calculate fold change for a node in a cluster tree; passing 'clustertree' requires \code{\link{BuildClusterTree}} to have been run} \item{ident.2}{A second identity class for comparison; if \code{NULL}, use all other cells for comparison; if an object of class \code{phylo} or 'clustertree' is passed to \code{ident.1}, must pass a node to calculate fold change for} \item{group.by}{Regroup cells into a different identity class prior to calculating fold change (see example in \code{\link{FindMarkers}})} \item{subset.ident}{Subset a particular identity class prior to regrouping. Only relevant if group.by is set (see example in \code{\link{FindMarkers}})} \item{assay}{Assay to use in fold change calculation} \item{reduction}{Reduction to use - will calculate average difference on cell embeddings} } \value{ Returns a data.frame } \description{ Calculate log fold change and percentage of cells expressing each feature for different identity classes. } \details{ If the slot is \code{scale.data} or a reduction is specified, average difference is returned instead of log fold change and the column is named "avg_diff". Otherwise, log2 fold change is returned with column named "avg_log2_FC". } \examples{ \dontrun{ data("pbmc_small") FoldChange(pbmc_small, ident.1 = 1) } } \seealso{ \code{FindMarkers} } \concept{differential_expression} Seurat/man/SetIntegrationData.Rd0000644000176200001440000000102315056057544016317 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{SetIntegrationData} \alias{SetIntegrationData} \title{Set integration data} \usage{ SetIntegrationData(object, integration.name, slot, new.data) } \arguments{ \item{object}{Seurat object} \item{integration.name}{Name of integration object} \item{slot}{Which slot in integration object to set} \item{new.data}{New data to insert} } \value{ Returns a \code{\link{Seurat}} object } \description{ Set integration data } \concept{objects} Seurat/man/ExpVar.Rd0000644000176200001440000000065515056057544014005 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{ExpVar} \alias{ExpVar} \title{Calculate the variance of logged values} \usage{ ExpVar(x) } \arguments{ \item{x}{A vector of values} } \value{ Returns the variance in log-space } \description{ Calculate variance of logged values in non-log space (return answer in log-space) } \examples{ ExpVar(x = c(1, 2, 3)) } \concept{utilities} Seurat/man/RegroupIdents.Rd0000644000176200001440000000113315056057544015362 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{RegroupIdents} \alias{RegroupIdents} \title{Regroup idents based on meta.data info} \usage{ RegroupIdents(object, metadata) } \arguments{ \item{object}{Seurat object} \item{metadata}{Name of metadata column} } \value{ A Seurat object with the active idents regrouped } \description{ For cells in each ident, set a new identity based on the most common value of a specified metadata column. } \examples{ data("pbmc_small") pbmc_small <- RegroupIdents(pbmc_small, metadata = "groups") } \concept{utilities} Seurat/man/RunLDA.Rd0000644000176200001440000000312515056057544013660 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/mixscape.R \name{RunLDA} \alias{RunLDA} \alias{RunLDA.default} \alias{RunLDA.Assay} \alias{RunLDA.Seurat} \title{Run Linear Discriminant Analysis} \usage{ RunLDA(object, ...) \method{RunLDA}{default}( object, labels, assay = NULL, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "LDA_", seed = 42, ... ) \method{RunLDA}{Assay}( object, assay = NULL, labels, features = NULL, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "LDA_", seed = 42, ... ) \method{RunLDA}{Seurat}( object, assay = NULL, labels, features = NULL, reduction.name = "lda", reduction.key = "LDA_", seed = 42, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, ... ) } \arguments{ \item{object}{An object of class Seurat.} \item{...}{Arguments passed to other methods} \item{labels}{Meta data column with target gene class labels.} \item{assay}{Assay to use for performing Linear Discriminant Analysis (LDA).} \item{verbose}{Print the top genes associated with high/low loadings for the PCs} \item{ndims.print}{Number of LDA dimensions to print.} \item{nfeatures.print}{Number of features to print for each LDA component.} \item{reduction.key}{Reduction key name.} \item{seed}{Value for random seed} \item{features}{Features to compute LDA on} \item{reduction.name}{dimensional reduction name, lda by default} } \description{ Run Linear Discriminant Analysis Function to perform Linear Discriminant Analysis. } \concept{mixscape} Seurat/man/cc.genes.Rd0000644000176200001440000000073015117326655014257 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/data.R \docType{data} \name{cc.genes} \alias{cc.genes} \title{Cell cycle genes} \format{ A list of two vectors \describe{ \item{s.genes}{Genes associated with S-phase} \item{g2m.genes}{Genes associated with G2M-phase} } } \source{ `https://doi.org/10.1126/science.aad0501` } \usage{ cc.genes } \description{ A list of genes used in cell-cycle regression } \concept{data} \keyword{datasets} Seurat/man/MixscapeHeatmap.Rd0000644000176200001440000001211515074241310015625 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mixscape.R \name{MixscapeHeatmap} \alias{MixscapeHeatmap} \title{Differential expression heatmap for mixscape} \usage{ MixscapeHeatmap( object, ident.1 = NULL, ident.2 = NULL, balanced = TRUE, logfc.threshold = 0.25, assay = "RNA", max.genes = 100, test.use = "wilcox", max.cells.group = NULL, order.by.prob = TRUE, group.by = NULL, mixscape.class = "mixscape_class", prtb.type = "KO", fc.name = "avg_log2FC", pval.cutoff = 0.05, ... ) } \arguments{ \item{object}{An object} \item{ident.1}{Identity class to define markers for; pass an object of class \code{phylo} or 'clustertree' to find markers for a node in a cluster tree; passing 'clustertree' requires \code{\link{BuildClusterTree}} to have been run} \item{ident.2}{A second identity class for comparison; if \code{NULL}, use all other cells for comparison; if an object of class \code{phylo} or 'clustertree' is passed to \code{ident.1}, must pass a node to find markers for} \item{balanced}{Plot an equal number of genes with both groups of cells.} \item{logfc.threshold}{Limit testing to genes which show, on average, at least X-fold difference (log-scale) between the two groups of cells. Default is 0.25. Increasing logfc.threshold speeds up the function, but can miss weaker signals.} \item{assay}{Assay to use in differential expression testing} \item{max.genes}{Total number of DE genes to plot.} \item{test.use}{Denotes which test to use. Available options are: \itemize{ \item{"wilcox"} : Identifies differentially expressed genes between two groups of cells using a Wilcoxon Rank Sum test (default); will use a fast implementation by Presto if installed \item{"wilcox_limma"} : Identifies differentially expressed genes between two groups of cells using the limma implementation of the Wilcoxon Rank Sum test; set this option to reproduce results from Seurat v4 \item{"bimod"} : Likelihood-ratio test for single cell gene expression, (McDavid et al., Bioinformatics, 2013) \item{"roc"} : Identifies 'markers' of gene expression using ROC analysis. For each gene, evaluates (using AUC) a classifier built on that gene alone, to classify between two groups of cells. An AUC value of 1 means that expression values for this gene alone can perfectly classify the two groupings (i.e. Each of the cells in cells.1 exhibit a higher level than each of the cells in cells.2). An AUC value of 0 also means there is perfect classification, but in the other direction. A value of 0.5 implies that the gene has no predictive power to classify the two groups. Returns a 'predictive power' (abs(AUC-0.5) * 2) ranked matrix of putative differentially expressed genes. \item{"t"} : Identify differentially expressed genes between two groups of cells using the Student's t-test. \item{"negbinom"} : Identifies differentially expressed genes between two groups of cells using a negative binomial generalized linear model. Use only for UMI-based datasets \item{"poisson"} : Identifies differentially expressed genes between two groups of cells using a poisson generalized linear model. Use only for UMI-based datasets \item{"LR"} : Uses a logistic regression framework to determine differentially expressed genes. Constructs a logistic regression model predicting group membership based on each feature individually and compares this to a null model with a likelihood ratio test. \item{"MAST"} : Identifies differentially expressed genes between two groups of cells using a hurdle model tailored to scRNA-seq data. Utilizes the MAST package to run the DE testing. \item{"DESeq2"} : Identifies differentially expressed genes between two groups of cells based on a model using DESeq2 which uses a negative binomial distribution (Love et al, Genome Biology, 2014).This test does not support pre-filtering of genes based on average difference (or percent detection rate) between cell groups. However, genes may be pre-filtered based on their minimum detection rate (min.pct) across both cell groups. To use this method, please install DESeq2, using the instructions at https://bioconductor.org/packages/release/bioc/html/DESeq2.html }} \item{max.cells.group}{Number of cells per identity to plot.} \item{order.by.prob}{Order cells on heatmap based on their mixscape knockout probability from highest to lowest score.} \item{group.by}{(Deprecated) Option to split densities based on mixscape classification. Please use mixscape.class instead} \item{mixscape.class}{metadata column with mixscape classifications.} \item{prtb.type}{specify type of CRISPR perturbation expected for labeling mixscape classifications. Default is KO.} \item{fc.name}{Name of the fold change, average difference, or custom function column in the output data.frame. Default is avg_log2FC} \item{pval.cutoff}{P-value cut-off for selection of significantly DE genes.} \item{...}{Arguments passed to other methods and to specific DE methods} } \value{ A ggplot object. } \description{ Draws a heatmap of single cell feature expression with cells ordered by their mixscape ko probabilities. } \concept{mixscape} Seurat/man/GetTransferPredictions.Rd0000644000176200001440000000207715056057544017230 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{GetTransferPredictions} \alias{GetTransferPredictions} \title{Get the predicted identity} \usage{ GetTransferPredictions( object, assay = "predictions", slot = "data", score.filter = 0.75 ) } \arguments{ \item{object}{Seurat object} \item{assay}{Name of the assay holding the predictions} \item{slot}{Slot of the assay in which the prediction scores are stored} \item{score.filter}{Return "Unassigned" for any cell with a score less than this value} } \value{ Returns a vector of predicted class names } \description{ Utility function to easily pull out the name of the class with the maximum prediction. This is useful if you've set \code{prediction.assay = TRUE} in \code{\link{TransferData}} and want to have a vector with the predicted class. } \examples{ \dontrun{ prediction.assay <- TransferData(anchorset = anchors, refdata = reference$class) query[["predictions"]] <- prediction.assay query$predicted.id <- GetTransferPredictions(query) } } \concept{integration} Seurat/man/IFeaturePlot.Rd0000644000176200001440000000144515056057544015141 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{IFeaturePlot} \alias{IFeaturePlot} \title{Visualize features in dimensional reduction space interactively} \usage{ IFeaturePlot(object, feature, dims = c(1, 2), reduction = NULL, slot = "data") } \arguments{ \item{object}{Seurat object} \item{feature}{Feature to plot} \item{dims}{Dimensions to plot, must be a two-length numeric vector specifying x- and y-dimensions} \item{reduction}{Which dimensionality reduction to use. If not specified, first searches for umap, then tsne, then pca} \item{slot}{Which slot to pull expression data from?} } \value{ Returns the final plot as a ggplot object } \description{ Visualize features in dimensional reduction space interactively } \concept{visualization} Seurat/man/InteractiveSpatialPlot.Rd0000644000176200001440000000402615104403544017213 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{InteractiveSpatialPlot} \alias{InteractiveSpatialPlot} \title{Interactive Spatial Cell Selection Tool} \usage{ InteractiveSpatialPlot( object, image = NULL, image.scale = "lowres", group.by = NULL, alpha = 1, pt.size.factor = 1, overlay_image = TRUE ) } \arguments{ \item{object}{A \code{\link[SeuratObject]{Seurat}} object with spatial data.} \item{image}{Name of the spatial image stored in the object. If \code{NULL}, uses the default image for the object.} \item{image.scale}{Character. Which image scaling factor to use for spatial coordinate transformation (\code{"lowres"} by default).} \item{group.by}{Metadata variable (column name) to use for coloring cell points (e.g., cluster assignment). If \code{NULL}, uses \code{"seurat_clusters"} if available, otherwise all cells are grouped together.} \item{alpha}{Numeric transparency value for cell points (default \code{1.0}).} \item{pt.size.factor}{Numeric scaling factor for point size (default \code{1.0}).} \item{overlay_image}{Logical; if \code{TRUE}, overlays the tissue image in the background of the plot (default \code{TRUE}).} } \value{ A character vector of cell names selected via lasso, which can be used to subset the object. } \description{ Launch an interactive gadget for lasso-based cell selection from a spatial Seurat object. Supports Visium, SlideSeq, and Vizgen data. Returns the cell names of the selected subset, suitable for downstream subsetting or analysis. } \note{ This function requires the \href{https://cran.r-project.org/package=plotly}{\pkg{plotly}}, \href{https://cran.r-project.org/package=magrittr}{\pkg{magrittr}}, and \href{https://cran.r-project.org/package=base64enc}{\pkg{base64enc}} packages to be installed. It also requires \pkg{shiny} and \pkg{miniUI} for the interactive UI. } \examples{ \dontrun{ selected_cells <- InteractiveSpatialPlot(object = brain) selected_cells <- InteractiveSpatialPlot(object = brain, overlay_image = FALSE) } } Seurat/man/ModalityWeights-class.Rd0000644000176200001440000000176415056057544017022 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{ModalityWeights-class} \alias{ModalityWeights-class} \alias{ModalityWeights} \title{The ModalityWeights Class} \description{ The ModalityWeights class is an intermediate data storage class that stores the modality weight and other related information needed for performing downstream analyses - namely data integration (\code{FindModalityWeights}) and data transfer (\code{\link{FindMultiModalNeighbors}}). } \section{Slots}{ \describe{ \item{\code{modality.weight.list}}{A list of modality weights value from all modalities} \item{\code{modality.assay}}{Names of assays for the list of dimensional reductions} \item{\code{params}}{A list of parameters used in the FindModalityWeights} \item{\code{score.matrix}}{a list of score matrices representing cross and within-modality prediction score, and kernel value} \item{\code{command}}{Store log of parameters that were used} }} \concept{objects} Seurat/man/MULTIseqDemux.Rd0000644000176200001440000000240115056057544015175 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{MULTIseqDemux} \alias{MULTIseqDemux} \title{Demultiplex samples based on classification method from MULTI-seq (McGinnis et al., bioRxiv 2018)} \usage{ MULTIseqDemux( object, assay = "HTO", quantile = 0.7, autoThresh = FALSE, maxiter = 5, qrange = seq(from = 0.1, to = 0.9, by = 0.05), verbose = TRUE ) } \arguments{ \item{object}{Seurat object. Assumes that the specified assay data has been added} \item{assay}{Name of the multiplexing assay (HTO by default)} \item{quantile}{The quantile to use for classification} \item{autoThresh}{Whether to perform automated threshold finding to define the best quantile. Default is FALSE} \item{maxiter}{Maximum number of iterations if autoThresh = TRUE. Default is 5} \item{qrange}{A range of possible quantile values to try if autoThresh = TRUE} \item{verbose}{Prints the output} } \value{ A Seurat object with demultiplexing results stored at \code{object$MULTI_ID} } \description{ Identify singlets, doublets and negative cells from multiplexing experiments. Annotate singlets by tags. } \examples{ \dontrun{ object <- MULTIseqDemux(object) } } \references{ \doi{10.1038/s41592-019-0433-8} } \concept{preprocessing} Seurat/man/ReadMtx.Rd0000644000176200001440000000361115056057544014137 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{ReadMtx} \alias{ReadMtx} \title{Load in data from remote or local mtx files} \usage{ ReadMtx( mtx, cells, features, cell.column = 1, feature.column = 2, cell.sep = "\\t", feature.sep = "\\t", skip.cell = 0, skip.feature = 0, mtx.transpose = FALSE, unique.features = TRUE, strip.suffix = FALSE ) } \arguments{ \item{mtx}{Name or remote URL of the mtx file} \item{cells}{Name or remote URL of the cells/barcodes file} \item{features}{Name or remote URL of the features/genes file} \item{cell.column}{Specify which column of cells file to use for cell names; default is 1} \item{feature.column}{Specify which column of features files to use for feature/gene names; default is 2} \item{cell.sep}{Specify the delimiter in the cell name file} \item{feature.sep}{Specify the delimiter in the feature name file} \item{skip.cell}{Number of lines to skip in the cells file before beginning to read cell names} \item{skip.feature}{Number of lines to skip in the features file before beginning to gene names} \item{mtx.transpose}{Transpose the matrix after reading in} \item{unique.features}{Make feature names unique (default TRUE)} \item{strip.suffix}{Remove trailing "-1" if present in all cell barcodes.} } \value{ A sparse matrix containing the expression data. } \description{ Enables easy loading of sparse data matrices } \examples{ \dontrun{ # For local files: expression_matrix <- ReadMtx( mtx = "count_matrix.mtx.gz", features = "features.tsv.gz", cells = "barcodes.tsv.gz" ) seurat_object <- CreateSeuratObject(counts = expression_matrix) # For remote files: expression_matrix <- ReadMtx(mtx = "http://localhost/matrix.mtx", cells = "http://localhost/barcodes.tsv", features = "http://localhost/genes.tsv") seurat_object <- CreateSeuratObject(counts = data) } } \concept{preprocessing} Seurat/man/SingleRasterMap.Rd0000644000176200001440000000201615056057544015631 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{SingleRasterMap} \alias{SingleRasterMap} \title{A single heatmap from ggplot2 using geom_raster} \usage{ SingleRasterMap( data, raster = TRUE, cell.order = NULL, feature.order = NULL, colors = PurpleAndYellow(), disp.min = -2.5, disp.max = 2.5, limits = NULL, group.by = NULL ) } \arguments{ \item{data}{A matrix or data frame with data to plot} \item{raster}{switch between geom_raster and geom_tile} \item{cell.order}{...} \item{feature.order}{...} \item{colors}{A vector of colors to use} \item{disp.min}{Minimum display value (all values below are clipped)} \item{disp.max}{Maximum display value (all values above are clipped)} \item{limits}{A two-length numeric vector with the limits for colors on the plot} \item{group.by}{A vector to group cells by, should be one grouping identity per cell} } \value{ A ggplot2 object } \description{ A single heatmap from ggplot2 using geom_raster } \keyword{internal} Seurat/man/LeverageScore.Rd0000644000176200001440000000531115056057544015320 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/sketching.R \name{LeverageScore} \alias{LeverageScore} \alias{LeverageScore.default} \alias{LeverageScore.StdAssay} \alias{LeverageScore.Assay} \alias{LeverageScore.Seurat} \title{Leverage Score Calculation} \usage{ LeverageScore(object, ...) \method{LeverageScore}{default}( object, nsketch = 5000L, ndims = NULL, method = CountSketch, eps = 0.5, seed = 123L, verbose = TRUE, ... ) \method{LeverageScore}{StdAssay}( object, nsketch = 5000L, ndims = NULL, method = CountSketch, vf.method = NULL, layer = "data", eps = 0.5, seed = 123L, verbose = TRUE, features = NULL, ... ) \method{LeverageScore}{Assay}( object, nsketch = 5000L, ndims = NULL, method = CountSketch, vf.method = NULL, layer = "data", eps = 0.5, seed = 123L, verbose = TRUE, features = NULL, ... ) \method{LeverageScore}{Seurat}( object, assay = NULL, nsketch = 5000L, ndims = NULL, var.name = "leverage.score", over.write = FALSE, method = CountSketch, vf.method = NULL, layer = "data", eps = 0.5, seed = 123L, verbose = TRUE, features = NULL, ... ) } \arguments{ \item{object}{A matrix-like object} \item{...}{Arguments passed to other methods} \item{nsketch}{A positive integer. The number of sketches to be used in the approximation. Default is 5000.} \item{ndims}{A positive integer or NULL. The number of dimensions to use. If NULL, the number of dimensions will default to the number of columns in the object.} \item{method}{The sketching method to use, defaults to CountSketch.} \item{eps}{A numeric. The error tolerance for the approximation in Johnson–Lindenstrauss embeddings, defaults to 0.5.} \item{seed}{A positive integer. The seed for the random number generator, defaults to 123.} \item{verbose}{Print progress and diagnostic messages} \item{vf.method}{VariableFeatures method} \item{layer}{layer to use} \item{features}{A vector of feature names to use for calculating leverage score.} \item{assay}{assay to use} \item{var.name}{name of slot to store leverage scores} \item{over.write}{whether to overwrite slot that currently stores leverage scores. Defaults to FALSE, in which case the 'var.name' is modified if it already exists in the object} } \description{ This function computes the leverage scores for a given object It uses the concept of sketching and random projections. The function provides an approximation to the leverage scores using a scalable method suitable for large matrices. } \references{ Clarkson, K. L. & Woodruff, D. P. Low-rank approximation and regression in input sparsity time. JACM 63, 1–45 (2017). \doi{10.1145/3019134}; } \concept{sketching} Seurat/man/ProjectDimReduc.Rd0000644000176200001440000000270715056057544015623 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{ProjectDimReduc} \alias{ProjectDimReduc} \title{Project query data to reference dimensional reduction} \usage{ ProjectDimReduc( query, reference, mode = c("pcaproject", "lsiproject"), reference.reduction, combine = FALSE, query.assay = NULL, reference.assay = NULL, features = NULL, do.scale = TRUE, reduction.name = NULL, reduction.key = NULL, verbose = TRUE ) } \arguments{ \item{query}{Query object} \item{reference}{Reference object} \item{mode}{Projection mode name for projection \itemize{ \item{pcaproject: PCA projection} \item{lsiproject: LSI projection} }} \item{reference.reduction}{Name of dimensional reduction in the reference object} \item{combine}{Determine if query and reference objects are combined} \item{query.assay}{Assay used for query object} \item{reference.assay}{Assay used for reference object} \item{features}{Features used for projection} \item{do.scale}{Determine if scale expression matrix in the pcaproject mode} \item{reduction.name}{dimensional reduction name, reference.reduction is used by default} \item{reduction.key}{dimensional reduction key, the key in reference.reduction is used by default} \item{verbose}{Print progress and message} } \value{ Returns a query-only or query-reference combined seurat object } \description{ Project query data to reference dimensional reduction } \concept{integration} Seurat/man/BridgeReferenceSet-class.Rd0000644000176200001440000000133615056057544017367 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{BridgeReferenceSet-class} \alias{BridgeReferenceSet-class} \alias{BridgeReferenceSet} \title{The BridgeReferenceSet Class The BridgeReferenceSet is an output from PrepareBridgeReference} \description{ The BridgeReferenceSet Class The BridgeReferenceSet is an output from PrepareBridgeReference } \section{Slots}{ \describe{ \item{\code{bridge}}{The multi-omic object} \item{\code{reference}}{The Reference object only containing bridge representation assay} \item{\code{params}}{A list of parameters used in the PrepareBridgeReference} \item{\code{command}}{Store log of parameters that were used} }} \concept{objects} Seurat/man/NNtoGraph.Rd0000644000176200001440000000111215056057544014425 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{NNtoGraph} \alias{NNtoGraph} \title{Convert Neighbor class to an asymmetrical Graph class} \usage{ NNtoGraph(nn.object, col.cells = NULL, weighted = FALSE) } \arguments{ \item{nn.object}{A neighbor class object} \item{col.cells}{Cells names of the neighbors, cell names in nn.object is used by default} \item{weighted}{Determine if use distance in the Graph} } \value{ Returns a Graph object } \description{ Convert Neighbor class to an asymmetrical Graph class } \concept{integration} Seurat/man/TransferAnchorSet-class.Rd0000644000176200001440000000061215056057544017267 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{TransferAnchorSet-class} \alias{TransferAnchorSet-class} \alias{TransferAnchorSet} \title{The TransferAnchorSet Class} \description{ Inherits from the Anchorset class. Implemented mainly for method dispatch purposes. See \code{\link{AnchorSet}} for slot details. } \concept{objects} Seurat/man/AddModuleScore.Rd0000644000176200001440000000716515070750476015435 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/utilities.R \name{AddModuleScore} \alias{AddModuleScore} \alias{AddModuleScore.Seurat} \alias{AddModuleScore.StdAssay} \alias{AddModuleScore.Assay} \title{Calculate module scores for feature expression programs in single cells} \usage{ AddModuleScore(object, ...) \method{AddModuleScore}{Seurat}( object, features, pool = NULL, nbin = 24, ctrl = 100, k = FALSE, assay = NULL, name = "Cluster", seed = 1, search = FALSE, slot = "data", ... ) \method{AddModuleScore}{StdAssay}( object, features, kmeans.obj, pool = NULL, nbin = 24, ctrl = 100, k = FALSE, name = "Cluster", seed = 1, search = FALSE, slot = "data", ... ) \method{AddModuleScore}{Assay}( object, features, kmeans.obj, pool = NULL, nbin = 24, ctrl = 100, k = FALSE, name = "Cluster", seed = 1, search = FALSE, slot = "data", ... ) } \arguments{ \item{object}{Seurat object} \item{...}{Extra parameters passed to \code{\link{UpdateSymbolList}}} \item{features}{A list of vectors of features for expression programs; each entry should be a vector of feature names} \item{pool}{List of features to check expression levels against, defaults to \code{rownames(x = object)}} \item{nbin}{Number of bins of aggregate expression levels for all analyzed features} \item{ctrl}{Number of control features selected from the same bin per analyzed feature} \item{k}{Use feature clusters returned from DoKMeans} \item{assay}{Name of assay to use} \item{name}{Name for the expression programs; will append a number to the end for each entry in \code{features} (eg. if \code{features} has three programs, the results will be stored as \code{name1}, \code{name2}, \code{name3}, respectively)} \item{seed}{Set a random seed. If NULL, seed is not set.} \item{search}{Search for symbol synonyms for features in \code{features} that don't match features in \code{object}? Searches the HGNC's gene names database; see \code{\link{UpdateSymbolList}} for more details} \item{slot}{Slot to calculate score values off of. Defaults to data slot (i.e log-normalized counts)} \item{kmeans.obj}{A \code{DoKMeans} output used to define feature clusters when \code{k = TRUE}; ignored if \code{k = FALSE}.} } \value{ Returns a Seurat object with module scores added to object meta data; each module is stored as \code{name#} for each module program present in \code{features} Returns a Seurat object with module scores added to object meta data; each module is stored as \code{name#} for each module program present in \code{features} } \description{ Calculate the average expression levels of each program (cluster) on single cell level, subtracted by the aggregated expression of control feature sets. All analyzed features are binned based on averaged expression, and the control features are randomly selected from each bin. Calculate the average expression levels of each program (cluster) on single cell level, subtracted by the aggregated expression of control feature sets. All analyzed features are binned based on averaged expression, and the control features are randomly selected from each bin. } \examples{ \dontrun{ data("pbmc_small") cd_features <- list(c( 'CD79B', 'CD79A', 'CD19', 'CD180', 'CD200', 'CD3D', 'CD2', 'CD3E', 'CD7', 'CD8A', 'CD14', 'CD1C', 'CD68', 'CD9', 'CD247' )) pbmc_small <- AddModuleScore( object = pbmc_small, features = cd_features, ctrl = 5, name = 'CD_Features' ) head(x = pbmc_small[]) } } \references{ Tirosh et al, Science (2016) Tirosh et al, Science (2016) Tirosh et al, Science (2016) } \concept{utilities} Seurat/man/SpatialPlot.Rd0000644000176200001440000001457315104403544015025 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R, R/convenience.R \name{SpatialPlot} \alias{SpatialPlot} \alias{SpatialDimPlot} \alias{SpatialFeaturePlot} \title{Visualize spatial clustering and expression data.} \usage{ SpatialPlot( object, group.by = NULL, features = NULL, images = NULL, cols = NULL, image.alpha = 1, image.scale = "lowres", crop = TRUE, slot = "data", keep.scale = "feature", min.cutoff = NA, max.cutoff = NA, cells.highlight = NULL, cols.highlight = c("#DE2D26", "grey50"), facet.highlight = FALSE, label = FALSE, label.size = 5, label.color = "white", label.box = TRUE, repel = FALSE, ncol = NULL, combine = TRUE, pt.size.factor = 1.6, alpha = c(1, 1), shape = 21, stroke = NA, interactive = FALSE, do.identify = FALSE, identify.ident = NULL, do.hover = FALSE, information = NULL, plot_segmentations = FALSE ) SpatialDimPlot( object, group.by = NULL, images = NULL, cols = NULL, crop = TRUE, cells.highlight = NULL, cols.highlight = c("#DE2D26", "grey50"), facet.highlight = FALSE, label = FALSE, label.size = 7, label.color = "white", repel = FALSE, ncol = NULL, combine = TRUE, pt.size.factor = 1.6, alpha = c(1, 1), image.alpha = 1, image.scale = "lowres", shape = 21, stroke = NA, label.box = TRUE, interactive = FALSE, information = NULL, plot_segmentations = FALSE ) SpatialFeaturePlot( object, features, images = NULL, crop = TRUE, slot = "data", keep.scale = "feature", min.cutoff = NA, max.cutoff = NA, ncol = NULL, combine = TRUE, pt.size.factor = 1.6, alpha = c(1, 1), image.alpha = 1, image.scale = "lowres", shape = 21, stroke = NA, interactive = FALSE, information = NULL, plot_segmentations = FALSE ) } \arguments{ \item{object}{A Seurat object} \item{group.by}{Name of meta.data column to group the data by} \item{features}{Name of the feature to visualize. Provide either group.by OR features, not both.} \item{images}{Name of the images to use in the plot(s)} \item{cols}{Vector of colors, each color corresponds to an identity class. This may also be a single character or numeric value corresponding to a palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}. By default, ggplot2 assigns colors} \item{image.alpha}{Adjust the opacity of the background images. Set to 0 to remove.} \item{image.scale}{Choose the scale factor ("lowres"/"hires") to apply in order to matchthe plot with the specified `image` - defaults to "lowres"} \item{crop}{Crop the plot in to focus on points plotted. Set to \code{FALSE} to show entire background image.} \item{slot}{If plotting a feature, which data slot to pull from (counts, data, or scale.data)} \item{keep.scale}{How to handle the color scale across multiple plots. Options are: \itemize{ \item \dQuote{feature} (default; by row/feature scaling): The plots for each individual feature are scaled to the maximum expression of the feature across the conditions provided to \code{split.by} \item \dQuote{all} (universal scaling): The plots for all features and conditions are scaled to the maximum expression value for the feature with the highest overall expression \item \code{NULL} (no scaling): Each individual plot is scaled to the maximum expression value of the feature in the condition provided to \code{split.by}; be aware setting \code{NULL} will result in color scales that are not comparable between plots }} \item{min.cutoff, max.cutoff}{Vector of minimum and maximum cutoff values for each feature, may specify quantile in the form of 'q##' where '##' is the quantile (eg, 'q1', 'q10')} \item{cells.highlight}{A list of character or numeric vectors of cells to highlight. If only one group of cells desired, can simply pass a vector instead of a list. If set, colors selected cells to the color(s) in cols.highlight} \item{cols.highlight}{A vector of colors to highlight the cells as; ordered the same as the groups in cells.highlight; last color corresponds to unselected cells.} \item{facet.highlight}{When highlighting certain groups of cells, split each group into its own plot} \item{label}{Whether to label the clusters} \item{label.size}{Sets the size of the labels} \item{label.color}{Sets the color of the label text} \item{label.box}{Whether to put a box around the label text (geom_text vs geom_label)} \item{repel}{Repels the labels to prevent overlap} \item{ncol}{Number of columns if plotting multiple plots} \item{combine}{Combine plots into a single gg object; note that if TRUE; themeing will not work when plotting multiple features/groupings} \item{pt.size.factor}{Scale the size of the spots.} \item{alpha}{Controls opacity of spots. Provide as a vector specifying the min and max for SpatialFeaturePlot. For SpatialDimPlot, provide a single alpha value for each plot.} \item{shape}{Control the shape of the spots - same as the ggplot2 parameter. The default is 21, which plots circles - use 22 to plot squares.} \item{stroke}{Control the width of the border around the spots} \item{interactive}{Launch an interactive SpatialDimPlot or SpatialFeaturePlot session, see \code{\link{ISpatialDimPlot}} or \code{\link{ISpatialFeaturePlot}} for more details} \item{do.identify, do.hover}{DEPRECATED in favor of \code{interactive}} \item{identify.ident}{DEPRECATED} \item{information}{An optional dataframe or matrix of extra information to be displayed on hover} \item{plot_segmentations}{Define whether plot should plot centroids or segmentations} } \value{ If \code{do.identify}, either a vector of cells selected or the object with selected cells set to the value of \code{identify.ident} (if set). Else, if \code{do.hover}, a plotly object with interactive graphics. Else, a ggplot object } \description{ SpatialPlot plots a feature or discrete grouping (e.g. cluster assignments) as spots over the image that was collected. We also provide SpatialFeaturePlot and SpatialDimPlot as wrapper functions around SpatialPlot for a consistent naming framework. } \examples{ \dontrun{ # For functionality analagous to FeaturePlot SpatialPlot(seurat.object, features = "MS4A1") SpatialFeaturePlot(seurat.object, features = "MS4A1") # For functionality analagous to DimPlot SpatialPlot(seurat.object, group.by = "clusters") SpatialDimPlot(seurat.object, group.by = "clusters") } } \concept{convenience} \concept{spatial} \concept{visualization} Seurat/man/SetQuantile.Rd0000644000176200001440000000135615056057544015035 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{SetQuantile} \alias{SetQuantile} \title{Find the Quantile of Data} \usage{ SetQuantile(cutoff, data) } \arguments{ \item{cutoff}{The cutoff to turn into a quantile} \item{data}{The data to turn find the quantile of} } \value{ The numerical representation of the quantile } \description{ Converts a quantile in character form to a number regarding some data. String form for a quantile is represented as a number prefixed with \dQuote{q}; for example, 10th quantile is \dQuote{q10} while 2nd quantile is \dQuote{q2}. Will only take a quantile of non-zero data values } \examples{ set.seed(42) SetQuantile('q10', sample(1:100, 10)) } \concept{utilities} Seurat/man/PolyDimPlot.Rd0000644000176200001440000000151615056057544015011 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{PolyDimPlot} \alias{PolyDimPlot} \title{Polygon DimPlot} \usage{ PolyDimPlot( object, group.by = NULL, cells = NULL, poly.data = "spatial", flip.coords = FALSE ) } \arguments{ \item{object}{Seurat object} \item{group.by}{A grouping variable present in the metadata. Default is to use the groupings present in the current cell identities (\code{Idents(object = object)})} \item{cells}{Vector of cells to plot (default is all cells)} \item{poly.data}{Name of the polygon dataframe in the misc slot} \item{flip.coords}{Flip x and y coordinates} } \value{ Returns a ggplot object } \description{ Plot cells as polygons, rather than single points. Color cells by identity, or a categorical variable in metadata } \concept{visualization} Seurat/man/FindTransferAnchors.Rd0000644000176200001440000002017615056057544016503 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{FindTransferAnchors} \alias{FindTransferAnchors} \title{Find transfer anchors} \usage{ FindTransferAnchors( reference, query, normalization.method = "LogNormalize", recompute.residuals = TRUE, reference.assay = NULL, reference.neighbors = NULL, query.assay = NULL, reduction = "pcaproject", reference.reduction = NULL, project.query = FALSE, features = NULL, scale = TRUE, npcs = 30, l2.norm = TRUE, dims = 1:30, k.anchor = 5, k.filter = NA, k.score = 30, max.features = 200, nn.method = "annoy", n.trees = 50, eps = 0, approx.pca = TRUE, mapping.score.k = NULL, verbose = TRUE ) } \arguments{ \item{reference}{\code{\link[SeuratObject]{Seurat}} object to use as the reference} \item{query}{\code{\link[SeuratObject]{Seurat}} object to use as the query} \item{normalization.method}{Name of normalization method used: LogNormalize or SCT.} \item{recompute.residuals}{If using SCT as a normalization method, compute query Pearson residuals using the reference SCT model parameters.} \item{reference.assay}{Name of the Assay to use from reference} \item{reference.neighbors}{Name of the Neighbor to use from the reference. Optionally enables reuse of precomputed neighbors.} \item{query.assay}{Name of the Assay to use from query} \item{reduction}{Dimensional reduction to perform when finding anchors. Options are: \itemize{ \item{pcaproject: Project the PCA from the reference onto the query. We recommend using PCA when reference and query datasets are from scRNA-seq} \item{lsiproject: Project the LSI from the reference onto the query. We recommend using LSI when reference and query datasets are from scATAC-seq. This requires that LSI has been computed for the reference dataset, and the same features (eg, peaks or genome bins) are present in both the reference and query. See \code{\link[Signac]{RunTFIDF}} and \code{\link[Signac]{RunSVD}}} \item{rpca: Project the PCA from the reference onto the query, and the PCA from the query onto the reference (reciprocal PCA projection).} \item{cca: Run a CCA on the reference and query } }} \item{reference.reduction}{Name of dimensional reduction to use from the reference if running the pcaproject workflow. Optionally enables reuse of precomputed reference dimensional reduction. If NULL (default), use a PCA computed on the reference object.} \item{project.query}{Project the PCA from the query dataset onto the reference. Use only in rare cases where the query dataset has a much larger cell number, but the reference dataset has a unique assay for transfer. In this case, the default features will be set to the variable features of the query object that are alos present in the reference.} \item{features}{Features to use for dimensional reduction. If not specified, set as variable features of the reference object which are also present in the query.} \item{scale}{Scale query data.} \item{npcs}{Number of PCs to compute on reference if reference.reduction is not provided.} \item{l2.norm}{Perform L2 normalization on the cell embeddings after dimensional reduction} \item{dims}{Which dimensions to use from the reduction to specify the neighbor search space} \item{k.anchor}{How many neighbors (k) to use when finding anchors} \item{k.filter}{How many neighbors (k) to use when filtering anchors. Set to NA to turn off filtering.} \item{k.score}{How many neighbors (k) to use when scoring anchors} \item{max.features}{The maximum number of features to use when specifying the neighborhood search space in the anchor filtering} \item{nn.method}{Method for nearest neighbor finding. Options include: rann, annoy} \item{n.trees}{More trees gives higher precision when using annoy approximate nearest neighbor search} \item{eps}{Error bound on the neighbor finding algorithm (from \code{\link[RANN]{RANN}} or \code{\link[RcppAnnoy]{RcppAnnoy}})} \item{approx.pca}{Use truncated singular value decomposition to approximate PCA} \item{mapping.score.k}{Compute and store nearest k query neighbors in the AnchorSet object that is returned. You can optionally set this if you plan on computing the mapping score and want to enable reuse of some downstream neighbor calculations to make the mapping score function more efficient.} \item{verbose}{Print progress bars and output} } \value{ Returns an \code{AnchorSet} object that can be used as input to \code{\link{TransferData}}, \code{\link{IntegrateEmbeddings}} and \code{\link{MapQuery}}. The dimension reduction used for finding anchors is stored in the \code{AnchorSet} object and can be used for computing anchor weights in downstream functions. Note that only the requested dimensions are stored in the dimension reduction object in the \code{AnchorSet}. This means that if \code{dims=2:20} is used, for example, the dimension of the stored reduction is \code{1:19}. } \description{ Find a set of anchors between a reference and query object. These anchors can later be used to transfer data from the reference to query object using the \code{\link{TransferData}} object. } \details{ The main steps of this procedure are outlined below. For a more detailed description of the methodology, please see Stuart, Butler, et al Cell 2019. \doi{10.1016/j.cell.2019.05.031}; \doi{10.1101/460147} \itemize{ \item{Perform dimensional reduction. Exactly what is done here depends on the values set for the \code{reduction} and \code{project.query} parameters. If \code{reduction = "pcaproject"}, a PCA is performed on either the reference (if \code{project.query = FALSE}) or the query (if \code{project.query = TRUE}), using the \code{features} specified. The data from the other dataset is then projected onto this learned PCA structure. If \code{reduction = "cca"}, then CCA is performed on the reference and query for this dimensional reduction step. If \code{reduction = "lsiproject"}, the stored LSI dimension reduction in the reference object is used to project the query dataset onto the reference. If \code{l2.norm} is set to \code{TRUE}, perform L2 normalization of the embedding vectors.} \item{Identify anchors between the reference and query - pairs of cells from each dataset that are contained within each other's neighborhoods (also known as mutual nearest neighbors).} \item{Filter low confidence anchors to ensure anchors in the low dimension space are in broad agreement with the high dimensional measurements. This is done by looking at the neighbors of each query cell in the reference dataset using \code{max.features} to define this space. If the reference cell isn't found within the first \code{k.filter} neighbors, remove the anchor.} \item{Assign each remaining anchor a score. For each anchor cell, determine the nearest \code{k.score} anchors within its own dataset and within its pair's dataset. Based on these neighborhoods, construct an overall neighbor graph and then compute the shared neighbor overlap between anchor and query cells (analogous to an SNN graph). We use the 0.01 and 0.90 quantiles on these scores to dampen outlier effects and rescale to range between 0-1.} } } \examples{ \dontrun{ # to install the SeuratData package see https://github.com/satijalab/seurat-data library(SeuratData) data("pbmc3k") # for demonstration, split the object into reference and query pbmc.reference <- pbmc3k[, 1:1350] pbmc.query <- pbmc3k[, 1351:2700] # perform standard preprocessing on each object pbmc.reference <- NormalizeData(pbmc.reference) pbmc.reference <- FindVariableFeatures(pbmc.reference) pbmc.reference <- ScaleData(pbmc.reference) pbmc.query <- NormalizeData(pbmc.query) pbmc.query <- FindVariableFeatures(pbmc.query) pbmc.query <- ScaleData(pbmc.query) # find anchors anchors <- FindTransferAnchors(reference = pbmc.reference, query = pbmc.query) # transfer labels predictions <- TransferData( anchorset = anchors, refdata = pbmc.reference$seurat_annotations ) pbmc.query <- AddMetaData(object = pbmc.query, metadata = predictions) } } \references{ Stuart T, Butler A, et al. Comprehensive Integration of Single-Cell Data. Cell. 2019;177:1888-1902 \doi{10.1016/j.cell.2019.05.031}; } \concept{integration} Seurat/man/PercentAbove.Rd0000644000176200001440000000107615056057544015153 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{PercentAbove} \alias{PercentAbove} \title{Calculate the percentage of a vector above some threshold} \usage{ PercentAbove(x, threshold) } \arguments{ \item{x}{Vector of values} \item{threshold}{Threshold to use when calculating percentage} } \value{ Returns the percentage of \code{x} values above the given threshold } \description{ Calculate the percentage of a vector above some threshold } \examples{ set.seed(42) PercentAbove(sample(1:100, 10), 75) } \concept{utilities} Seurat/man/PrepSCTIntegration.Rd0000644000176200001440000000631615056057544016264 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{PrepSCTIntegration} \alias{PrepSCTIntegration} \title{Prepare an object list normalized with sctransform for integration.} \usage{ PrepSCTIntegration( object.list, assay = NULL, anchor.features = 2000, sct.clip.range = NULL, verbose = TRUE ) } \arguments{ \item{object.list}{A list of \code{\link[SeuratObject]{Seurat}} objects to prepare for integration} \item{assay}{The name of the \code{\link[SeuratObject]{Assay}} to use for integration. This can be a single name if all the assays to be integrated have the same name, or a character vector containing the name of each \code{\link[SeuratObject]{Assay}} in each object to be integrated. The specified assays must have been normalized using \code{\link{SCTransform}}. If NULL (default), the current default assay for each object is used.} \item{anchor.features}{Can be either: \itemize{ \item{A numeric value. This will call \code{\link{SelectIntegrationFeatures}} to select the provided number of features to be used in anchor finding} \item{A vector of features to be used as input to the anchor finding process} }} \item{sct.clip.range}{Numeric of length two specifying the min and max values the Pearson residual will be clipped to} \item{verbose}{Display output/messages} } \value{ A list of \code{\link[SeuratObject]{Seurat}} objects with the appropriate \code{scale.data} slots containing only the required \code{anchor.features}. } \description{ This function takes in a list of objects that have been normalized with the \code{\link{SCTransform}} method and performs the following steps: \itemize{ \item{If anchor.features is a numeric value, calls \code{\link{SelectIntegrationFeatures}} to determine the features to use in the downstream integration procedure.} \item{Ensures that the sctransform residuals for the features specified to anchor.features are present in each object in the list. This is necessary because the default behavior of \code{\link{SCTransform}} is to only store the residuals for the features determined to be variable. Residuals are recomputed for missing features using the stored model parameters via the \code{\link{GetResidual}} function.} \item{Subsets the \code{scale.data} slot to only contain the residuals for anchor.features for efficiency in downstream processing. } } } \examples{ \dontrun{ # to install the SeuratData package see https://github.com/satijalab/seurat-data library(SeuratData) data("panc8") # panc8 is a merged Seurat object containing 8 separate pancreas datasets # split the object by dataset and take the first 2 to integrate pancreas.list <- SplitObject(panc8, split.by = "tech")[1:2] # perform SCTransform normalization pancreas.list <- lapply(X = pancreas.list, FUN = SCTransform) # select integration features and prep step features <- SelectIntegrationFeatures(pancreas.list) pancreas.list <- PrepSCTIntegration( pancreas.list, anchor.features = features ) # downstream integration steps anchors <- FindIntegrationAnchors( pancreas.list, normalization.method = "SCT", anchor.features = features ) pancreas.integrated <- IntegrateData(anchors, normalization.method = "SCT") } } \concept{integration} Seurat/man/LabelClusters.Rd0000644000176200001440000000305015056057544015334 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{LabelClusters} \alias{LabelClusters} \title{Label clusters on a ggplot2-based scatter plot} \usage{ LabelClusters( plot, id, clusters = NULL, labels = NULL, split.by = NULL, repel = TRUE, box = FALSE, geom = "GeomPoint", position = "median", ... ) } \arguments{ \item{plot}{A ggplot2-based scatter plot} \item{id}{Name of variable used for coloring scatter plot} \item{clusters}{Vector of cluster ids to label} \item{labels}{Custom labels for the clusters} \item{split.by}{Split labels by some grouping label, useful when using \code{\link[ggplot2]{facet_wrap}} or \code{\link[ggplot2]{facet_grid}}} \item{repel}{Use \code{geom_text_repel} to create nicely-repelled labels} \item{box}{Use geom_label/geom_label_repel (includes a box around the text labels)} \item{geom}{Name of geom to get X/Y aesthetic names for} \item{position}{How to place the label if repel = FALSE. If "median", place the label at the median position. If "nearest" place the label at the position of the nearest data point to the median.} \item{...}{Extra parameters to \code{\link[ggrepel]{geom_text_repel}}, such as \code{size}} } \value{ A ggplot2-based scatter plot with cluster labels } \description{ Label clusters on a ggplot2-based scatter plot } \examples{ data("pbmc_small") plot <- DimPlot(object = pbmc_small) LabelClusters(plot = plot, id = 'ident') } \seealso{ \code{\link[ggrepel]{geom_text_repel}} \code{\link[ggplot2]{geom_text}} } \concept{visualization} Seurat/man/SCTAssay-class.Rd0000644000176200001440000000566615056057544015344 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{SCTAssay-class} \alias{SCTAssay-class} \alias{SCTModel} \alias{SCTAssay} \alias{levels.SCTAssay} \alias{levels<-.SCTAssay} \title{The SCTModel Class} \usage{ \method{levels}{SCTAssay}(x) \method{levels}{SCTAssay}(x) <- value } \arguments{ \item{x}{An \code{SCTAssay} object} \item{value}{New levels, must be in the same order as the levels present} } \value{ \code{levels}: SCT model names \code{levels<-}: \code{x} with updated SCT model names } \description{ The SCTModel object is a model and parameters storage from SCTransform. It can be used to calculate Pearson residuals for new genes. The SCTAssay object contains all the information found in an \code{\link[SeuratObject]{Assay}} object, with extra information from the results of \code{\link{SCTransform}} } \section{Slots}{ \describe{ \item{\code{feature.attributes}}{A data.frame with feature attributes in SCTransform} \item{\code{cell.attributes}}{A data.frame with cell attributes in SCTransform} \item{\code{clips}}{A list of two numeric of length two specifying the min and max values the Pearson residual will be clipped to. One for vst and one for SCTransform} \item{\code{umi.assay}}{Name of the assay of the seurat object containing UMI matrix and the default is RNA} \item{\code{model}}{A formula used in SCTransform} \item{\code{arguments}}{other information used in SCTransform} \item{\code{median_umi}}{Median UMI (or scale factor) used to calculate corrected counts} \item{\code{SCTModel.list}}{A list containing SCT models} }} \section{Get and set SCT model names}{ SCT results are named by initial run of \code{\link{SCTransform}} in order to keep SCT parameters straight between runs. When working with merged \code{SCTAssay} objects, these model names are important. \code{levels} allows querying the models present. \code{levels<-} allows the changing of the names of the models present, useful when merging \code{SCTAssay} objects. Note: unlike normal \code{\link[base]{levels<-}}, \code{levels<-.SCTAssay} allows complete changing of model names, not reordering. } \section{Creating an \code{SCTAssay} from an \code{Assay}}{ Conversion from an \code{Assay} object to an \code{SCTAssay} object by is done by adding the additional slots to the object. If \code{from} has results generated by \code{\link{SCTransform}} from Seurat v3.0.0 to v3.1.1, the conversion will automagically fill the new slots with the data } \examples{ \dontrun{ # SCTAssay objects are generated from SCTransform pbmc_small <- SCTransform(pbmc_small) } \dontrun{ # SCTAssay objects are generated from SCTransform pbmc_small <- SCTransform(pbmc_small) pbmc_small[["SCT"]] } \dontrun{ # Query and change SCT model names levels(pbmc_small[['SCT']]) levels(pbmc_small[['SCT']]) <- '3' levels(pbmc_small[['SCT']]) } } \seealso{ \code{\link[SeuratObject]{Assay}} \code{\link[SeuratObject]{Assay}} } \concept{objects} Seurat/man/ReadNanostring.Rd0000644000176200001440000001132015117326655015505 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R, R/convenience.R \name{ReadNanostring} \alias{ReadNanostring} \alias{LoadNanostring} \title{Read and Load Nanostring SMI data} \usage{ ReadNanostring( data.dir, mtx.file = NULL, metadata.file = NULL, molecules.file = NULL, segmentations.file = NULL, type = "centroids", mol.type = "pixels", metadata = NULL, mols.filter = NA_character_, genes.filter = NA_character_, fov.filter = NULL, subset.counts.matrix = NULL, cell.mols.only = TRUE ) LoadNanostring(data.dir, fov, assay = "Nanostring") } \arguments{ \item{data.dir}{Path to folder containing Nanostring SMI outputs} \item{mtx.file}{Path to Nanostring cell x gene matrix CSV} \item{metadata.file}{Contains metadata including cell center, area, and stain intensities} \item{molecules.file}{Path to molecules file} \item{segmentations.file}{Path to segmentations CSV} \item{type}{Type of cell spatial coordinate matrices to read; choose one or more of: \itemize{ \item \dQuote{centroids}: cell centroids in pixel coordinate space \item \dQuote{segmentations}: cell segmentations in pixel coordinate space }} \item{mol.type}{Type of molecule spatial coordinate matrices to read; choose one or more of: \itemize{ \item \dQuote{pixels}: molecule coordinates in pixel space }} \item{metadata}{Type of available metadata to read; choose zero or more of: \itemize{ \item \dQuote{Area}: number of pixels in cell segmentation \item \dQuote{fov}: cell's fov \item \dQuote{Mean.MembraneStain}: mean membrane stain intensity \item \dQuote{Mean.DAPI}: mean DAPI stain intensity \item \dQuote{Mean.G}: mean green channel stain intensity \item \dQuote{Mean.Y}: mean yellow channel stain intensity \item \dQuote{Mean.R}: mean red channel stain intensity \item \dQuote{Max.MembraneStain}: max membrane stain intensity \item \dQuote{Max.DAPI}: max DAPI stain intensity \item \dQuote{Max.G}: max green channel stain intensity \item \dQuote{Max.Y}: max yellow stain intensity \item \dQuote{Max.R}: max red stain intensity }} \item{mols.filter}{Filter molecules that match provided string} \item{genes.filter}{Filter genes from cell x gene matrix that match provided string} \item{fov.filter}{Only load in select FOVs. Nanostring SMI data contains 30 total FOVs.} \item{subset.counts.matrix}{If the counts matrix should be built from molecule coordinates for a specific segmentation; One of: \itemize{ \item \dQuote{Nuclear}: nuclear segmentations \item \dQuote{Cytoplasm}: cell cytoplasm segmentations \item \dQuote{Membrane}: cell membrane segmentations }} \item{cell.mols.only}{If TRUE, only load molecules within a cell} \item{fov}{Name to store FOV as} \item{assay}{Name to store expression matrix as} } \value{ \code{ReadNanostring}: A list with some combination of the following values: \itemize{ \item \dQuote{\code{matrix}}: a \link[Matrix:dgCMatrix-class]{sparse matrix} with expression data; cells are columns and features are rows \item \dQuote{\code{centroids}}: a data frame with cell centroid coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} \item \dQuote{\code{pixels}}: a data frame with molecule pixel coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{gene} } \code{LoadNanostring}: A \code{\link[SeuratObject]{Seurat}} object } \description{ Read and Load Nanostring SMI data } \note{ This function requires the \href{https://cran.r-project.org/package=data.table}{\pkg{data.table}} package to be installed } \section{Progress Updates with \pkg{progressr}}{ This function uses \href{https://cran.r-project.org/package=progressr}{\pkg{progressr}} to render status updates and progress bars. To enable progress updates, wrap the function call in \code{\link[progressr]{with_progress}} or run \code{\link[progressr:handlers]{handlers(global = TRUE)}} before running this function. For more details about \pkg{progressr}, please read \href{https://progressr.futureverse.org/articles/progressr-01-intro.html}{\code{vignette("progressr-intro")}} } \section{Parallelization with \pkg{future}}{ This function uses \href{https://cran.r-project.org/package=future}{\pkg{future}} to enable parallelization. Parallelization strategies can be set using \code{\link[future]{plan}}. Common plans include \dQuote{\code{sequential}} for non-parallelized processing or \dQuote{\code{multisession}} for parallel evaluation using multiple \R sessions; for other plans, see the \dQuote{Implemented evaluation strategies} section of \code{\link[future:plan]{?future::plan}}. For a more thorough introduction to \pkg{future}, see \href{https://future.futureverse.org/articles/future-1-overview.html}{\code{vignette("future-1-overview")}} } \concept{future} \concept{preprocessing} Seurat/man/PrepLDA.Rd0000644000176200001440000000230315074241310014001 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mixscape.R \name{PrepLDA} \alias{PrepLDA} \title{Function to prepare data for Linear Discriminant Analysis.} \usage{ PrepLDA( object, de.assay = "RNA", pc.assay = "PRTB", labels = "gene", nt.label = "NT", npcs = 10, verbose = TRUE, logfc.threshold = 0.25 ) } \arguments{ \item{object}{An object of class Seurat.} \item{de.assay}{Assay to use for selection of DE genes.} \item{pc.assay}{Assay to use for running Principle components analysis.} \item{labels}{Meta data column with target gene class labels.} \item{nt.label}{Name of non-targeting cell class.} \item{npcs}{Number of principle components to use.} \item{verbose}{Print progress bar.} \item{logfc.threshold}{Limit testing to genes which show, on average, at least X-fold difference (log-scale) between the two groups of cells. Default is 0.25. Increasing logfc.threshold speeds up the function, but can miss weaker signals.} } \value{ Returns a list of the first 10 PCs from each projection. } \description{ This function performs unsupervised PCA on each mixscape class separately and projects each subspace onto all cells in the data. } \concept{mixscape} Seurat/man/CombinePlots.Rd0000644000176200001440000000212315056057544015166 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{CombinePlots} \alias{CombinePlots} \title{Combine ggplot2-based plots into a single plot} \usage{ CombinePlots(plots, ncol = NULL, legend = NULL, ...) } \arguments{ \item{plots}{A list of gg objects} \item{ncol}{Number of columns} \item{legend}{Combine legends into a single legend choose from 'right' or 'bottom'; pass 'none' to remove legends, or \code{NULL} to leave legends as they are} \item{...}{Extra parameters passed to plot_grid} } \value{ A combined plot } \description{ Combine ggplot2-based plots into a single plot } \examples{ data("pbmc_small") pbmc_small[['group']] <- sample( x = c('g1', 'g2'), size = ncol(x = pbmc_small), replace = TRUE ) plot1 <- FeaturePlot( object = pbmc_small, features = 'MS4A1', split.by = 'group' ) plot2 <- FeaturePlot( object = pbmc_small, features = 'FCN1', split.by = 'group' ) CombinePlots( plots = list(plot1, plot2), legend = 'none', nrow = length(x = unique(x = pbmc_small[['group', drop = TRUE]])) ) } \concept{visualization} Seurat/man/SingleExIPlot.Rd0000644000176200001440000000304515056057544015262 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{SingleExIPlot} \alias{SingleExIPlot} \title{Plot a single expression by identity on a plot} \usage{ SingleExIPlot( data, idents, split = NULL, type = "violin", sort = FALSE, y.max = NULL, adjust = 1, pt.size = 0, alpha = 1, cols = NULL, seed.use = 42, log = FALSE, add.noise = TRUE, raster = NULL, raster.dpi = NULL ) } \arguments{ \item{data}{Data to plot} \item{idents}{Idents to use} \item{split}{Use a split violin plot} \item{type}{Make either a \dQuote{ridge} or \dQuote{violin} plot} \item{sort}{Sort identity classes (on the x-axis) by the average expression of the attribute being potted} \item{y.max}{Maximum Y value to plot} \item{adjust}{Adjust parameter for geom_violin} \item{pt.size}{Size of points for violin plots} \item{alpha}{Alpha vlaue for violin plots} \item{cols}{Colors to use for plotting} \item{seed.use}{Random seed to use. If NULL, don't set a seed} \item{log}{plot Y axis on log10 scale} \item{add.noise}{determine if adding small noise for plotting} \item{raster}{Convert points to raster format. Requires 'ggrastr' to be installed. default is \code{NULL} which automatically rasterizes if ggrastr is installed and number of points exceed 100,000.} \item{raster.dpi}{the dpi for raster layer, default is 300. See \code{\link[ggrastr]{rasterize}} for more info.} } \value{ A ggplot-based Expression-by-Identity plot } \description{ Plot a single expression by identity on a plot } \keyword{internal} Seurat/man/TransferData.Rd0000644000176200001440000001512415056057544015153 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{TransferData} \alias{TransferData} \title{Transfer data} \usage{ TransferData( anchorset, refdata, reference = NULL, query = NULL, query.assay = NULL, weight.reduction = "pcaproject", l2.norm = FALSE, dims = NULL, k.weight = 50, sd.weight = 1, eps = 0, n.trees = 50, verbose = TRUE, slot = "data", prediction.assay = FALSE, only.weights = FALSE, store.weights = TRUE ) } \arguments{ \item{anchorset}{An \code{\link{AnchorSet}} object generated by \code{\link{FindTransferAnchors}}} \item{refdata}{Data to transfer. This can be specified in one of two ways: \itemize{ \item{The reference data itself as either a vector where the names correspond to the reference cells, or a matrix, where the column names correspond to the reference cells.} \item{The name of the metadata field or assay from the reference object provided. This requires the reference parameter to be specified. If pulling assay data in this manner, it will pull the data from the data slot. To transfer data from other slots, please pull the data explicitly with \code{\link{GetAssayData}} and provide that matrix here.} }} \item{reference}{Reference object from which to pull data to transfer} \item{query}{Query object into which the data will be transferred.} \item{query.assay}{Name of the Assay to use from query} \item{weight.reduction}{Dimensional reduction to use for the weighting anchors. Options are: \itemize{ \item{pcaproject: Use the projected PCA used for anchor building} \item{lsiproject: Use the projected LSI used for anchor building} \item{pca: Use an internal PCA on the query only} \item{cca: Use the CCA used for anchor building} \item{custom DimReduc: User provided \code{\[SeuratObject]{DimReduc}} object computed on the query cells} }} \item{l2.norm}{Perform L2 normalization on the cell embeddings after dimensional reduction} \item{dims}{Set of dimensions to use in the anchor weighting procedure. If NULL, the same dimensions that were used to find anchors will be used for weighting.} \item{k.weight}{Number of neighbors to consider when weighting anchors} \item{sd.weight}{Controls the bandwidth of the Gaussian kernel for weighting} \item{eps}{Error bound on the neighbor finding algorithm (from \code{\link[RANN]{RANN}})} \item{n.trees}{More trees gives higher precision when using annoy approximate nearest neighbor search} \item{verbose}{Print progress bars and output} \item{slot}{Slot to store the imputed data. Must be either "data" (default) or "counts"} \item{prediction.assay}{Return an \code{Assay} object with the prediction scores for each class stored in the \code{data} slot.} \item{only.weights}{Only return weights matrix} \item{store.weights}{Optionally store the weights matrix used for predictions in the returned query object.} } \value{ If \code{query} is not provided, for the categorical data in \code{refdata}, returns a data.frame with label predictions. If \code{refdata} is a matrix, returns an Assay object where the imputed data has been stored in the provided slot. If \code{query} is provided, a modified query object is returned. For the categorical data in refdata, prediction scores are stored as Assays (prediction.score.NAME) and two additional metadata fields: predicted.NAME and predicted.NAME.score which contain the class prediction and the score for that predicted class. For continuous data, an Assay called NAME is returned. NAME here corresponds to the name of the element in the refdata list. } \description{ Transfer categorical or continuous data across single-cell datasets. For transferring categorical information, pass a vector from the reference dataset (e.g. \code{refdata = reference$celltype}). For transferring continuous information, pass a matrix from the reference dataset (e.g. \code{refdata = GetAssayData(reference[['RNA']])}). } \details{ The main steps of this procedure are outlined below. For a more detailed description of the methodology, please see Stuart, Butler, et al Cell 2019. \doi{10.1016/j.cell.2019.05.031}; \doi{10.1101/460147} For both transferring discrete labels and also feature imputation, we first compute the weights matrix. \itemize{ \item{Construct a weights matrix that defines the association between each query cell and each anchor. These weights are computed as 1 - the distance between the query cell and the anchor divided by the distance of the query cell to the \code{k.weight}th anchor multiplied by the anchor score computed in \code{\link{FindIntegrationAnchors}}. We then apply a Gaussian kernel width a bandwidth defined by \code{sd.weight} and normalize across all \code{k.weight} anchors.} } The main difference between label transfer (classification) and feature imputation is what gets multiplied by the weights matrix. For label transfer, we perform the following steps: \itemize{ \item{Create a binary classification matrix, the rows corresponding to each possible class and the columns corresponding to the anchors. If the reference cell in the anchor pair is a member of a certain class, that matrix entry is filled with a 1, otherwise 0.} \item{Multiply this classification matrix by the transpose of weights matrix to compute a prediction score for each class for each cell in the query dataset.} } For feature imputation, we perform the following step: \itemize{ \item{Multiply the expression matrix for the reference anchor cells by the weights matrix. This returns a predicted expression matrix for the specified features for each cell in the query dataset.} } } \examples{ \dontrun{ # to install the SeuratData package see https://github.com/satijalab/seurat-data library(SeuratData) data("pbmc3k") # for demonstration, split the object into reference and query pbmc.reference <- pbmc3k[, 1:1350] pbmc.query <- pbmc3k[, 1351:2700] # perform standard preprocessing on each object pbmc.reference <- NormalizeData(pbmc.reference) pbmc.reference <- FindVariableFeatures(pbmc.reference) pbmc.reference <- ScaleData(pbmc.reference) pbmc.query <- NormalizeData(pbmc.query) pbmc.query <- FindVariableFeatures(pbmc.query) pbmc.query <- ScaleData(pbmc.query) # find anchors anchors <- FindTransferAnchors(reference = pbmc.reference, query = pbmc.query) # transfer labels predictions <- TransferData(anchorset = anchors, refdata = pbmc.reference$seurat_annotations) pbmc.query <- AddMetaData(object = pbmc.query, metadata = predictions) } } \references{ Stuart T, Butler A, et al. Comprehensive Integration of Single-Cell Data. Cell. 2019;177:1888-1902 \doi{10.1016/j.cell.2019.05.031} } \concept{integration} Seurat/man/CaseMatch.Rd0000644000176200001440000000113215056057544014417 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{CaseMatch} \alias{CaseMatch} \title{Match the case of character vectors} \usage{ CaseMatch(search, match) } \arguments{ \item{search}{A vector of search terms} \item{match}{A vector of characters whose case should be matched} } \value{ Values from search present in match with the case of match } \description{ Match the case of character vectors } \examples{ data("pbmc_small") cd_genes <- c('Cd79b', 'Cd19', 'Cd200') CaseMatch(search = cd_genes, match = rownames(x = pbmc_small)) } \concept{utilities} Seurat/man/RunMoransI.Rd0000644000176200001440000000073315056057544014632 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{RunMoransI} \alias{RunMoransI} \title{Compute Moran's I value.} \usage{ RunMoransI(data, pos, verbose = TRUE) } \arguments{ \item{data}{Expression matrix} \item{pos}{Position matrix} \item{verbose}{Display messages/progress} } \description{ Wraps the functionality of the Moran.I function from the ape package. Weights are computed as 1/distance. } \concept{preprocessing} Seurat/man/VisiumV1-class.Rd0000644000176200001440000000137715056057544015370 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{VisiumV1-class} \alias{VisiumV1-class} \alias{VisiumV1} \title{The VisiumV1 class} \description{ The VisiumV1 class represents spatial information from the 10X Genomics Visium platform } \section{Slots}{ \describe{ \item{\code{image}}{A three-dimensional array with PNG image data, see \code{\link[png]{readPNG}} for more details} \item{\code{scale.factors}}{An object of class \code{\link{scalefactors}}; see \code{\link{scalefactors}} for more information} \item{\code{coordinates}}{A data frame with tissue coordinate information} \item{\code{spot.radius}}{Single numeric value giving the radius of the spots} }} \concept{objects} \concept{spatial} Seurat/man/Assay-class.Rd0000644000176200001440000000062715056057544014762 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reexports.R \docType{class} \name{Assay-class} \alias{Assay-class} \title{The Assay Class} \description{ The \code{Assay} object is the basic unit of Seurat; for more details, please see the documentation in \code{\link[SeuratObject:Assay]{SeuratObject}} } \seealso{ \code{\link[SeuratObject:Assay]{SeuratObject::Assay-class}} } Seurat/man/CustomPalette.Rd0000644000176200001440000000223515056057544015365 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{BlackAndWhite} \alias{BlackAndWhite} \alias{BlueAndRed} \alias{CustomPalette} \alias{PurpleAndYellow} \title{Create a custom color palette} \usage{ BlackAndWhite(mid = NULL, k = 50) BlueAndRed(k = 50) CustomPalette(low = "white", high = "red", mid = NULL, k = 50) PurpleAndYellow(k = 50) } \arguments{ \item{mid}{middle color. Optional.} \item{k}{number of steps (colors levels) to include between low and high values} \item{low}{low color} \item{high}{high color} } \value{ A color palette for plotting } \description{ Creates a custom color palette based on low, middle, and high color values } \examples{ df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) plot(df, col = BlackAndWhite()) df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) plot(df, col = BlueAndRed()) myPalette <- CustomPalette() myPalette df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) plot(df, col = PurpleAndYellow()) } \concept{visualization} Seurat/man/CalculateBarcodeInflections.Rd0000644000176200001440000000455515056057544020156 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{CalculateBarcodeInflections} \alias{CalculateBarcodeInflections} \title{Calculate the Barcode Distribution Inflection} \usage{ CalculateBarcodeInflections( object, barcode.column = "nCount_RNA", group.column = "orig.ident", threshold.low = NULL, threshold.high = NULL ) } \arguments{ \item{object}{Seurat object} \item{barcode.column}{Column to use as proxy for barcodes ("nCount_RNA" by default)} \item{group.column}{Column to group by ("orig.ident" by default)} \item{threshold.low}{Ignore barcodes of rank below this threshold in inflection calculation} \item{threshold.high}{Ignore barcodes of rank above this threshold in inflection calculation} } \value{ Returns Seurat object with a new list in the `tools` slot, `CalculateBarcodeInflections` with values: * `barcode_distribution` - contains the full barcode distribution across the entire dataset * `inflection_points` - the calculated inflection points within the thresholds * `threshold_values` - the provided (or default) threshold values to search within for inflections * `cells_pass` - the cells that pass the inflection point calculation } \description{ This function calculates an adaptive inflection point ("knee") of the barcode distribution for each sample group. This is useful for determining a threshold for removing low-quality samples. } \details{ The function operates by calculating the slope of the barcode number vs. rank distribution, and then finding the point at which the distribution changes most steeply (the "knee"). Of note, this calculation often must be restricted as to the range at which it performs, so `threshold` parameters are provided to restrict the range of the calculation based on the rank of the barcodes. [BarcodeInflectionsPlot()] is provided as a convenience function to visualize and test different thresholds and thus provide more sensical end results. See [BarcodeInflectionsPlot()] to visualize the calculated inflection points and [SubsetByBarcodeInflections()] to subsequently subset the Seurat object. } \examples{ data("pbmc_small") CalculateBarcodeInflections(pbmc_small, group.column = 'groups') } \seealso{ \code{\link{BarcodeInflectionsPlot}} \code{\link{SubsetByBarcodeInflections}} } \author{ Robert A. Amezquita, \email{robert.amezquita@fredhutch.org} } \concept{preprocessing} Seurat/man/DietSeurat.Rd0000644000176200001440000000255715056057544014654 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{DietSeurat} \alias{DietSeurat} \title{Slim down a Seurat object} \usage{ DietSeurat( object, layers = NULL, features = NULL, assays = NULL, dimreducs = NULL, graphs = NULL, misc = TRUE, counts = deprecated(), data = deprecated(), scale.data = deprecated(), ... ) } \arguments{ \item{object}{A \code{\link[SeuratObject]{Seurat}} object} \item{layers}{A vector or named list of layers to keep} \item{features}{Only keep a subset of features, defaults to all features} \item{assays}{Only keep a subset of assays specified here} \item{dimreducs}{Only keep a subset of DimReducs specified here (if \code{NULL}, remove all DimReducs)} \item{graphs}{Only keep a subset of Graphs specified here (if \code{NULL}, remove all Graphs)} \item{misc}{Preserve the \code{misc} slot; default is \code{TRUE}} \item{counts}{Preserve the count matrices for the assays specified} \item{data}{Preserve the data matrices for the assays specified} \item{scale.data}{Preserve the scale data matrices for the assays specified} \item{...}{Ignored} } \value{ \code{object} with only the sub-object specified retained } \description{ Keep only certain aspects of the Seurat object. Can be useful in functions that utilize merge as it reduces the amount of data in the merge } \concept{objects} Seurat/man/FindAllMarkers.Rd0000644000176200001440000001614015056057544015432 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/differential_expression.R \name{FindAllMarkers} \alias{FindAllMarkers} \alias{FindAllMarkersNode} \title{Gene expression markers for all identity classes} \usage{ FindAllMarkers( object, assay = NULL, features = NULL, group.by = NULL, logfc.threshold = 0.1, test.use = "wilcox", slot = "data", min.pct = 0.01, min.diff.pct = -Inf, node = NULL, verbose = TRUE, only.pos = FALSE, max.cells.per.ident = Inf, random.seed = 1, latent.vars = NULL, min.cells.feature = 3, min.cells.group = 3, mean.fxn = NULL, fc.name = NULL, base = 2, return.thresh = 0.01, densify = FALSE, ... ) } \arguments{ \item{object}{An object} \item{assay}{Assay to use in differential expression testing} \item{features}{Genes to test. Default is to use all genes} \item{group.by}{Regroup cells into a different identity class prior to performing differential expression (see example); \code{"ident"} to use Idents} \item{logfc.threshold}{Limit testing to genes which show, on average, at least X-fold difference (log-scale) between the two groups of cells. Default is 0.1 Increasing logfc.threshold speeds up the function, but can miss weaker signals. If the \code{slot} parameter is "scale.data" no filtering is performed.} \item{test.use}{Denotes which test to use. Available options are: \itemize{ \item{"wilcox"} : Identifies differentially expressed genes between two groups of cells using a Wilcoxon Rank Sum test (default); will use a fast implementation by Presto if installed \item{"wilcox_limma"} : Identifies differentially expressed genes between two groups of cells using the limma implementation of the Wilcoxon Rank Sum test; set this option to reproduce results from Seurat v4 \item{"bimod"} : Likelihood-ratio test for single cell gene expression, (McDavid et al., Bioinformatics, 2013) \item{"roc"} : Identifies 'markers' of gene expression using ROC analysis. For each gene, evaluates (using AUC) a classifier built on that gene alone, to classify between two groups of cells. An AUC value of 1 means that expression values for this gene alone can perfectly classify the two groupings (i.e. Each of the cells in cells.1 exhibit a higher level than each of the cells in cells.2). An AUC value of 0 also means there is perfect classification, but in the other direction. A value of 0.5 implies that the gene has no predictive power to classify the two groups. Returns a 'predictive power' (abs(AUC-0.5) * 2) ranked matrix of putative differentially expressed genes. \item{"t"} : Identify differentially expressed genes between two groups of cells using the Student's t-test. \item{"negbinom"} : Identifies differentially expressed genes between two groups of cells using a negative binomial generalized linear model. Use only for UMI-based datasets \item{"poisson"} : Identifies differentially expressed genes between two groups of cells using a poisson generalized linear model. Use only for UMI-based datasets \item{"LR"} : Uses a logistic regression framework to determine differentially expressed genes. Constructs a logistic regression model predicting group membership based on each feature individually and compares this to a null model with a likelihood ratio test. \item{"MAST"} : Identifies differentially expressed genes between two groups of cells using a hurdle model tailored to scRNA-seq data. Utilizes the MAST package to run the DE testing. \item{"DESeq2"} : Identifies differentially expressed genes between two groups of cells based on a model using DESeq2 which uses a negative binomial distribution (Love et al, Genome Biology, 2014).This test does not support pre-filtering of genes based on average difference (or percent detection rate) between cell groups. However, genes may be pre-filtered based on their minimum detection rate (min.pct) across both cell groups. To use this method, please install DESeq2, using the instructions at https://bioconductor.org/packages/release/bioc/html/DESeq2.html }} \item{slot}{Slot to pull data from; note that if \code{test.use} is "negbinom", "poisson", or "DESeq2", \code{slot} will be set to "counts"} \item{min.pct}{only test genes that are detected in a minimum fraction of min.pct cells in either of the two populations. Meant to speed up the function by not testing genes that are very infrequently expressed. Default is 0.01} \item{min.diff.pct}{only test genes that show a minimum difference in the fraction of detection between the two groups. Set to -Inf by default} \item{node}{A node to find markers for and all its children; requires \code{\link{BuildClusterTree}} to have been run previously; replaces \code{FindAllMarkersNode}} \item{verbose}{Print a progress bar once expression testing begins} \item{only.pos}{Only return positive markers (FALSE by default)} \item{max.cells.per.ident}{Down sample each identity class to a max number. Default is no downsampling. Not activated by default (set to Inf)} \item{random.seed}{Random seed for downsampling} \item{latent.vars}{Variables to test, used only when \code{test.use} is one of 'LR', 'negbinom', 'poisson', or 'MAST'} \item{min.cells.feature}{Minimum number of cells expressing the feature in at least one of the two groups, currently only used for poisson and negative binomial tests} \item{min.cells.group}{Minimum number of cells in one of the groups} \item{mean.fxn}{Function to use for fold change or average difference calculation. The default depends on the the value of \code{fc.slot}: \itemize{ \item{"counts"} : difference in the log of the mean counts, with pseudocount. \item{"data"} : difference in the log of the average exponentiated data, with pseudocount. This adjusts for differences in sequencing depth between cells, and assumes that "data" has been log-normalized. \item{"scale.data"} : difference in the means of scale.data. }} \item{fc.name}{Name of the fold change, average difference, or custom function column in the output data.frame. If NULL, the fold change column will be named according to the logarithm base (eg, "avg_log2FC"), or if using the scale.data slot "avg_diff".} \item{base}{The base with respect to which logarithms are computed.} \item{return.thresh}{Only return markers that have a p-value < return.thresh, or a power > return.thresh (if the test is ROC)} \item{densify}{Convert the sparse matrix to a dense form before running the DE test. This can provide speedups but might require higher memory; default is FALSE} \item{...}{Arguments passed to other methods and to specific DE methods} } \value{ Matrix containing a ranked list of putative markers, and associated statistics (p-values, ROC score, etc.) } \description{ Finds markers (differentially expressed genes) for each of the identity classes in a dataset } \examples{ data("pbmc_small") # Find markers for all clusters all.markers <- FindAllMarkers(object = pbmc_small) head(x = all.markers) \dontrun{ # Pass a value to node as a replacement for FindAllMarkersNode pbmc_small <- BuildClusterTree(object = pbmc_small) all.markers <- FindAllMarkers(object = pbmc_small, node = 4) head(x = all.markers) } } \concept{differential_expression} Seurat/man/CellCycleScoring.Rd0000644000176200001440000000267615056057544015771 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{CellCycleScoring} \alias{CellCycleScoring} \title{Score cell cycle phases} \usage{ CellCycleScoring( object, s.features, g2m.features, ctrl = NULL, set.ident = FALSE, ... ) } \arguments{ \item{object}{A Seurat object} \item{s.features}{A vector of features associated with S phase} \item{g2m.features}{A vector of features associated with G2M phase} \item{ctrl}{Number of control features selected from the same bin per analyzed feature supplied to \code{\link{AddModuleScore}}. Defaults to value equivalent to minimum number of features present in 's.features' and 'g2m.features'.} \item{set.ident}{If true, sets identity to phase assignments Stashes old identities in 'old.ident'} \item{...}{Arguments to be passed to \code{\link{AddModuleScore}}} } \value{ A Seurat object with the following columns added to object meta data: S.Score, G2M.Score, and Phase } \description{ Score cell cycle phases } \examples{ \dontrun{ data("pbmc_small") # pbmc_small doesn't have any cell-cycle genes # To run CellCycleScoring, please use a dataset with cell-cycle genes # An example is available at http://satijalab.org/seurat/cell_cycle_vignette.html pbmc_small <- CellCycleScoring( object = pbmc_small, g2m.features = cc.genes$g2m.genes, s.features = cc.genes$s.genes ) head(x = pbmc_small@meta.data) } } \seealso{ \code{AddModuleScore} } \concept{utilities} Seurat/man/SplitObject.Rd0000644000176200001440000000215715056057544015021 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{SplitObject} \alias{SplitObject} \title{Splits object into a list of subsetted objects.} \usage{ SplitObject(object, split.by = "ident") } \arguments{ \item{object}{Seurat object} \item{split.by}{Attribute for splitting. Default is "ident". Currently only supported for class-level (i.e. non-quantitative) attributes.} } \value{ A named list of Seurat objects, each containing a subset of cells from the original object. } \description{ Splits object based on a single attribute into a list of subsetted objects, one for each level of the attribute. For example, useful for taking an object that contains cells from many patients, and subdividing it into patient-specific objects. } \examples{ data("pbmc_small") # Assign the test object a three level attribute groups <- sample(c("group1", "group2", "group3"), size = 80, replace = TRUE) names(groups) <- colnames(pbmc_small) pbmc_small <- AddMetaData(object = pbmc_small, metadata = groups, col.name = "group") obj.list <- SplitObject(pbmc_small, split.by = "group") } \concept{objects} Seurat/man/Neighbor-class.Rd0000644000176200001440000000056415056057544015437 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reexports.R \docType{class} \name{Neighbor-class} \alias{Neighbor-class} \title{The Neighbor Class} \description{ For more details, please see the documentation in \code{\link[SeuratObject:Neighbor]{SeuratObject}} } \seealso{ \code{\link[SeuratObject:Neighbor]{SeuratObject::Neighbor-class}} } Seurat/man/UnSketchEmbeddings.Rd0000644000176200001440000000114115056057544016275 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{UnSketchEmbeddings} \alias{UnSketchEmbeddings} \title{Transfer embeddings from sketched cells to the full data} \usage{ UnSketchEmbeddings( atom.data, atom.cells = NULL, orig.data, embeddings, sketch.matrix = NULL ) } \arguments{ \item{atom.data}{Atom data} \item{atom.cells}{Atom cells} \item{orig.data}{Original data} \item{embeddings}{Embeddings of atom cells} \item{sketch.matrix}{Sketch matrix} } \description{ Transfer embeddings from sketched cells to the full data } \concept{integration} Seurat/man/GetTissueCoordinates.Rd0000644000176200001440000000215315116120241016660 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{GetTissueCoordinates.SlideSeq} \alias{GetTissueCoordinates.SlideSeq} \alias{GetTissueCoordinates.STARmap} \alias{GetTissueCoordinates.VisiumV1} \alias{GetTissueCoordinates.VisiumV2} \title{Get Tissue Coordinates} \usage{ \method{GetTissueCoordinates}{SlideSeq}(object, ...) \method{GetTissueCoordinates}{STARmap}(object, qhulls = FALSE, ...) \method{GetTissueCoordinates}{VisiumV1}( object, scale = "lowres", cols = c("imagerow", "imagecol"), ... ) \method{GetTissueCoordinates}{VisiumV2}(object, scale = NULL, ...) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods} \item{qhulls}{return qhulls instead of centroids} \item{scale}{A factor to scale the coordinates by; choose from: 'tissue', 'fiducial', 'hires', 'lowres', or \code{NULL} for no scaling} \item{cols}{Columns of tissue coordinates data.frame to pull} } \description{ Get Tissue Coordinates } \seealso{ \code{\link[SeuratObject:GetTissueCoordinates]{SeuratObject::GetTissueCoordinates}} } \concept{objects} \concept{spatial} Seurat/man/BridgeCellsRepresentation.Rd0000644000176200001440000000306615056057544017701 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{BridgeCellsRepresentation} \alias{BridgeCellsRepresentation} \title{Construct a dictionary representation for each unimodal dataset} \usage{ BridgeCellsRepresentation( object.list, bridge.object, object.reduction, bridge.reduction, laplacian.reduction = "lap", laplacian.dims = 1:50, bridge.assay.name = "Bridge", return.all.assays = FALSE, l2.norm = TRUE, verbose = TRUE ) } \arguments{ \item{object.list}{A list of Seurat objects} \item{bridge.object}{A multi-omic bridge Seurat which is used as the basis to represent unimodal datasets} \item{object.reduction}{A list of dimensional reductions from object.list used to be reconstructed by bridge.object} \item{bridge.reduction}{A list of dimensional reductions from bridge.object used to reconstruct object.reduction} \item{laplacian.reduction}{Name of bridge graph laplacian dimensional reduction} \item{laplacian.dims}{Dimensions used for bridge graph laplacian dimensional reduction} \item{bridge.assay.name}{Assay name used for bridge object reconstruction value (default is 'Bridge')} \item{return.all.assays}{Whether to return all assays in the object.list. Only bridge assay is returned by default.} \item{l2.norm}{Whether to l2 normalize the dictionary representation} \item{verbose}{Print messages and progress} } \value{ Returns a object list in which each object has a bridge cell derived assay } \description{ Construct a dictionary representation for each unimodal dataset } \concept{integration} Seurat/man/ScoreJackStraw.Rd0000644000176200001440000000305015056057544015455 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/dimensional_reduction.R \name{ScoreJackStraw} \alias{ScoreJackStraw} \alias{ScoreJackStraw.JackStrawData} \alias{ScoreJackStraw.DimReduc} \alias{ScoreJackStraw.Seurat} \title{Compute Jackstraw scores significance.} \usage{ ScoreJackStraw(object, ...) \method{ScoreJackStraw}{JackStrawData}(object, dims = 1:5, score.thresh = 1e-05, ...) \method{ScoreJackStraw}{DimReduc}(object, dims = 1:5, score.thresh = 1e-05, ...) \method{ScoreJackStraw}{Seurat}( object, reduction = "pca", dims = 1:5, score.thresh = 1e-05, do.plot = FALSE, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods} \item{dims}{Which dimensions to examine} \item{score.thresh}{Threshold to use for the proportion test of PC significance (see Details)} \item{reduction}{Reduction associated with JackStraw to score} \item{do.plot}{Show plot. To return ggplot object, use \code{JackStrawPlot} after running ScoreJackStraw.} } \value{ Returns a Seurat object } \description{ Significant PCs should show a p-value distribution that is strongly skewed to the left compared to the null distribution. The p-value for each PC is based on a proportion test comparing the number of features with a p-value below a particular threshold (score.thresh), compared with the proportion of features expected under a uniform distribution of p-values. } \seealso{ \code{\link{JackStrawPlot}} \code{\link{JackStrawPlot}} } \author{ Omri Wurtzel } \concept{dimensional_reduction} Seurat/man/LoadAnnoyIndex.Rd0000644000176200001440000000064315056057544015451 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{LoadAnnoyIndex} \alias{LoadAnnoyIndex} \title{Load the Annoy index file} \usage{ LoadAnnoyIndex(object, file) } \arguments{ \item{object}{Neighbor object} \item{file}{Path to file with annoy index} } \value{ Returns the Neighbor object with the index stored } \description{ Load the Annoy index file } \concept{utilities} Seurat/man/reexports.Rd0000644000176200001440000001002415116120241014600 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reexports.R \docType{import} \name{components} \alias{components} \alias{\%||\%} \alias{\%iff\%} \alias{reexports} \alias{AddMetaData} \alias{as.Graph} \alias{as.Neighbor} \alias{as.Seurat} \alias{as.sparse} \alias{Assays} \alias{Cells} \alias{CellsByIdentities} \alias{Command} \alias{CreateAssayObject} \alias{CreateDimReducObject} \alias{CreateSeuratObject} \alias{DefaultAssay} \alias{DefaultAssay<-} \alias{Distances} \alias{Embeddings} \alias{FetchData} \alias{GetAssayData} \alias{GetImage} \alias{GetTissueCoordinates} \alias{HVFInfo} \alias{Idents} \alias{Idents<-} \alias{Images} \alias{Index} \alias{Index<-} \alias{Indices} \alias{IsGlobal} \alias{JS} \alias{JS<-} \alias{Key} \alias{Key<-} \alias{Loadings} \alias{Loadings<-} \alias{LogSeuratCommand} \alias{Misc} \alias{Misc<-} \alias{Neighbors} \alias{Project} \alias{Project<-} \alias{Radius} \alias{Reductions} \alias{RenameCells} \alias{RenameIdents} \alias{ReorderIdent} \alias{RowMergeSparseMatrices} \alias{SetAssayData} \alias{SetIdent} \alias{SpatiallyVariableFeatures} \alias{StashIdent} \alias{Stdev} \alias{SVFInfo} \alias{Tool} \alias{Tool<-} \alias{UpdateSeuratObject} \alias{VariableFeatures} \alias{VariableFeatures<-} \alias{WhichCells} \title{Objects exported from other packages} \usage{ components(object, ...) x \%||\% y x \%iff\% y } \keyword{internal} \description{ These objects are imported from other packages. Follow the links below to see their documentation. \describe{ \item{SeuratObject}{\code{\link[SeuratObject]{AddMetaData}}, \code{\link[SeuratObject]{as.Graph}}, \code{\link[SeuratObject]{as.Neighbor}}, \code{\link[SeuratObject]{as.Seurat}}, \code{\link[SeuratObject]{as.sparse}}, \code{\link[SeuratObject:ObjectAccess]{Assays}}, \code{\link[SeuratObject]{Cells}}, \code{\link[SeuratObject]{CellsByIdentities}}, \code{\link[SeuratObject]{Command}}, \code{\link[SeuratObject]{CreateAssayObject}}, \code{\link[SeuratObject]{CreateDimReducObject}}, \code{\link[SeuratObject]{CreateSeuratObject}}, \code{\link[SeuratObject]{DefaultAssay}}, \code{\link[SeuratObject:DefaultAssay]{DefaultAssay<-}}, \code{\link[SeuratObject]{Distances}}, \code{\link[SeuratObject]{Embeddings}}, \code{\link[SeuratObject]{FetchData}}, \code{\link[SeuratObject:AssayData]{GetAssayData}}, \code{\link[SeuratObject]{GetImage}}, \code{\link[SeuratObject]{GetTissueCoordinates}}, \code{\link[SeuratObject:VariableFeatures]{HVFInfo}}, \code{\link[SeuratObject]{Idents}}, \code{\link[SeuratObject:Idents]{Idents<-}}, \code{\link[SeuratObject]{Images}}, \code{\link[SeuratObject:NNIndex]{Index}}, \code{\link[SeuratObject:NNIndex]{Index<-}}, \code{\link[SeuratObject]{Indices}}, \code{\link[SeuratObject]{IsGlobal}}, \code{\link[SeuratObject]{JS}}, \code{\link[SeuratObject:JS]{JS<-}}, \code{\link[SeuratObject]{Key}}, \code{\link[SeuratObject:Key]{Key<-}}, \code{\link[SeuratObject]{Loadings}}, \code{\link[SeuratObject:Loadings]{Loadings<-}}, \code{\link[SeuratObject]{LogSeuratCommand}}, \code{\link[SeuratObject]{Misc}}, \code{\link[SeuratObject:Misc]{Misc<-}}, \code{\link[SeuratObject:ObjectAccess]{Neighbors}}, \code{\link[SeuratObject]{Project}}, \code{\link[SeuratObject:Project]{Project<-}}, \code{\link[SeuratObject]{Radius}}, \code{\link[SeuratObject:ObjectAccess]{Reductions}}, \code{\link[SeuratObject]{RenameCells}}, \code{\link[SeuratObject:Idents]{RenameIdents}}, \code{\link[SeuratObject:Idents]{ReorderIdent}}, \code{\link[SeuratObject]{RowMergeSparseMatrices}}, \code{\link[SeuratObject:AssayData]{SetAssayData}}, \code{\link[SeuratObject:Idents]{SetIdent}}, \code{\link[SeuratObject:VariableFeatures]{SpatiallyVariableFeatures}}, \code{\link[SeuratObject:Idents]{StashIdent}}, \code{\link[SeuratObject]{Stdev}}, \code{\link[SeuratObject:VariableFeatures]{SVFInfo}}, \code{\link[SeuratObject]{Tool}}, \code{\link[SeuratObject:Tool]{Tool<-}}, \code{\link[SeuratObject]{UpdateSeuratObject}}, \code{\link[SeuratObject]{VariableFeatures}}, \code{\link[SeuratObject:VariableFeatures]{VariableFeatures<-}}, \code{\link[SeuratObject]{WhichCells}}} }} Seurat/man/PrepareBridgeReference.Rd0000644000176200001440000000613015056057544017124 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{PrepareBridgeReference} \alias{PrepareBridgeReference} \title{Prepare the bridge and reference datasets} \usage{ PrepareBridgeReference( reference, bridge, reference.reduction = "pca", reference.dims = 1:50, normalization.method = c("SCT", "LogNormalize"), reference.assay = NULL, bridge.ref.assay = "RNA", bridge.query.assay = "ATAC", supervised.reduction = c("slsi", "spca", NULL), bridge.query.reduction = NULL, bridge.query.features = NULL, laplacian.reduction.name = "lap", laplacian.reduction.key = "lap_", laplacian.reduction.dims = 1:50, verbose = TRUE ) } \arguments{ \item{reference}{A reference Seurat object} \item{bridge}{A multi-omic bridge Seurat object} \item{reference.reduction}{Name of dimensional reduction of the reference object (default is 'pca')} \item{reference.dims}{Number of dimensions used for the reference.reduction (default is 50)} \item{normalization.method}{Name of normalization method used: LogNormalize or SCT} \item{reference.assay}{Assay name for reference (default is \code{\link{DefaultAssay}})} \item{bridge.ref.assay}{Assay name for bridge used for reference mapping. RNA by default} \item{bridge.query.assay}{Assay name for bridge used for query mapping. ATAC by default} \item{supervised.reduction}{Type of supervised dimensional reduction to be performed for integrating the bridge and query. Options are: \itemize{ \item{slsi: Perform supervised LSI as the dimensional reduction for the bridge-query integration} \item{spca: Perform supervised PCA as the dimensional reduction for the bridge-query integration} \item{NULL: no supervised dimensional reduction will be calculated. bridge.query.reduction is used for the bridge-query integration} }} \item{bridge.query.reduction}{Name of dimensions used for the bridge-query harmonization. 'bridge.query.reduction' and 'supervised.reduction' cannot be NULL together.} \item{bridge.query.features}{Features used for bridge query dimensional reduction (default is NULL which uses VariableFeatures from the bridge object)} \item{laplacian.reduction.name}{Name of dimensional reduction name of graph laplacian eigenspace (default is 'lap')} \item{laplacian.reduction.key}{Dimensional reduction key (default is 'lap_')} \item{laplacian.reduction.dims}{Number of dimensions used for graph laplacian eigenspace (default is 50)} \item{verbose}{Print progress and message (default is TRUE)} } \value{ Returns a \code{BridgeReferenceSet} that can be used as input to \code{\link{FindBridgeTransferAnchors}}. The parameters used are stored in the \code{BridgeReferenceSet} as well } \description{ Preprocess the multi-omic bridge and unimodal reference datasets into an extended reference. This function performs the following three steps: 1. Performs within-modality harmonization between bridge and reference 2. Performs dimensional reduction on the SNN graph of bridge datasets via Laplacian Eigendecomposition 3. Constructs a bridge dictionary representation for unimodal reference cells } \concept{integration} Seurat/man/NNPlot.Rd0000644000176200001440000000366115056057544013752 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{NNPlot} \alias{NNPlot} \title{Highlight Neighbors in DimPlot} \usage{ NNPlot( object, reduction, nn.idx, query.cells, dims = 1:2, label = FALSE, label.size = 4, repel = FALSE, sizes.highlight = 2, pt.size = 1, cols.highlight = c("#377eb8", "#e41a1c"), na.value = "#bdbdbd", order = c("self", "neighbors", "other"), show.all.cells = TRUE, ... ) } \arguments{ \item{object}{Seurat object} \item{reduction}{Which dimensionality reduction to use. If not specified, first searches for umap, then tsne, then pca} \item{nn.idx}{the neighbor index of all cells} \item{query.cells}{cells used to find their neighbors} \item{dims}{Dimensions to plot, must be a two-length numeric vector specifying x- and y-dimensions} \item{label}{Whether to label the clusters} \item{label.size}{Sets size of labels} \item{repel}{Repel labels} \item{sizes.highlight}{Size of highlighted cells; will repeat to the length groups in cells.highlight. If \code{sizes.highlight = TRUE} size of all points will be this value.} \item{pt.size}{Adjust point size for plotting} \item{cols.highlight}{A vector of colors to highlight the cells as; will repeat to the length groups in cells.highlight} \item{na.value}{Color value for NA points when using custom scale} \item{order}{Specify the order of plotting for the idents. This can be useful for crowded plots if points of interest are being buried. Provide either a full list of valid idents or a subset to be plotted last (on top)} \item{show.all.cells}{Show all cells or only query and neighbor cells} \item{...}{Extra parameters passed to \code{DimPlot}} } \value{ A \code{\link[patchwork]{patchwork}ed} ggplot object if \code{combine = TRUE}; otherwise, a list of ggplot objects } \description{ It will color the query cells and the neighbors of the query cells in the DimPlot } \concept{visualization} Seurat/man/RelativeCounts.Rd0000644000176200001440000000143215056057544015541 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{RelativeCounts} \alias{RelativeCounts} \title{Normalize raw data to fractions} \usage{ RelativeCounts(data, scale.factor = 1, verbose = TRUE) } \arguments{ \item{data}{Matrix with the raw count data} \item{scale.factor}{Scale the result. Default is 1} \item{verbose}{Print progress} } \value{ Returns a matrix with the relative counts } \description{ Normalize count data to relative counts per cell by dividing by the total per cell. Optionally use a scale factor, e.g. for counts per million (CPM) use \code{scale.factor = 1e6}. } \examples{ mat <- matrix(data = rbinom(n = 25, size = 5, prob = 0.2), nrow = 5) mat mat_norm <- RelativeCounts(data = mat) mat_norm } \concept{preprocessing} Seurat/man/LogVMR.Rd0000644000176200001440000000075115056057544013703 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{LogVMR} \alias{LogVMR} \title{Calculate the variance to mean ratio of logged values} \usage{ LogVMR(x, ...) } \arguments{ \item{x}{A vector of values} \item{...}{Other arguments (not used)} } \value{ Returns the VMR in log-space } \description{ Calculate the variance to mean ratio (VMR) in non-logspace (return answer in log-space) } \examples{ LogVMR(x = c(1, 2, 3)) } \concept{utilities} Seurat/man/Read10X_HD_GeoJson.Rd0000644000176200001440000000123015117056271015723 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{Read10X_HD_GeoJson} \alias{Read10X_HD_GeoJson} \title{Load 10X Genomics GeoJson} \usage{ Read10X_HD_GeoJson(data.dir, segmentation.type = "cell") } \arguments{ \item{data.dir}{Path to the directory containing matrix data} \item{segmentation.type}{Which segmentations to load, cell or nucleus. If using nucleus the full matrix from cells is still used} } \value{ An \code{sf} object containing polygon segmentations from the GeoJSON provided by 10x, formatted for downstream coordinate retrieval } \description{ Load 10X Genomics GeoJson } \concept{preprocessing} Seurat/man/VlnPlot.Rd0000644000176200001440000000556015056057544014176 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{VlnPlot} \alias{VlnPlot} \title{Single cell violin plot} \usage{ VlnPlot( object, features, cols = NULL, pt.size = NULL, alpha = 1, idents = NULL, sort = FALSE, assay = NULL, group.by = NULL, split.by = NULL, adjust = 1, y.max = NULL, same.y.lims = FALSE, log = FALSE, ncol = NULL, slot = deprecated(), layer = NULL, split.plot = FALSE, stack = FALSE, combine = TRUE, fill.by = "feature", flip = FALSE, add.noise = TRUE, raster = NULL, raster.dpi = 300 ) } \arguments{ \item{object}{Seurat object} \item{features}{Features to plot (gene expression, metrics, PC scores, anything that can be retreived by FetchData)} \item{cols}{Colors to use for plotting} \item{pt.size}{Point size for points} \item{alpha}{Alpha value for points} \item{idents}{Which classes to include in the plot (default is all)} \item{sort}{Sort identity classes (on the x-axis) by the average expression of the attribute being potted, can also pass 'increasing' or 'decreasing' to change sort direction} \item{assay}{Name of assay to use, defaults to the active assay} \item{group.by}{Group (color) cells in different ways (for example, orig.ident)} \item{split.by}{A factor in object metadata to split the plot by, pass 'ident' to split by cell identity} \item{adjust}{Adjust parameter for geom_violin} \item{y.max}{Maximum y axis value} \item{same.y.lims}{Set all the y-axis limits to the same values} \item{log}{plot the feature axis on log scale} \item{ncol}{Number of columns if multiple plots are displayed} \item{slot}{Slot to pull expression data from (e.g. "counts" or "data")} \item{layer}{Layer to pull expression data from (e.g. "counts" or "data")} \item{split.plot}{plot each group of the split violin plots by multiple or single violin shapes.} \item{stack}{Horizontally stack plots for each feature} \item{combine}{Combine plots into a single \code{\link[patchwork]{patchwork}ed} ggplot object. If \code{FALSE}, return a list of ggplot} \item{fill.by}{Color violins/ridges based on either 'feature' or 'ident'} \item{flip}{flip plot orientation (identities on x-axis)} \item{add.noise}{determine if adding a small noise for plotting} \item{raster}{Convert points to raster format. Requires 'ggrastr' to be installed.} \item{raster.dpi}{the dpi for raster layer, default is 300. See \code{\link[ggrastr]{rasterize}} for more info.} } \value{ A \code{\link[patchwork]{patchwork}ed} ggplot object if \code{combine = TRUE}; otherwise, a list of ggplot objects } \description{ Draws a violin plot of single cell data (gene expression, metrics, PC scores, etc.) } \examples{ data("pbmc_small") VlnPlot(object = pbmc_small, features = 'PC_1') VlnPlot(object = pbmc_small, features = 'LYZ', split.by = 'groups') } \seealso{ \code{\link{FetchData}} } \concept{visualization} Seurat/man/RenameCells.Rd0000644000176200001440000000143115116120241014741 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{RenameCells.SCTAssay} \alias{RenameCells.SCTAssay} \alias{RenameCells.SlideSeq} \alias{RenameCells.STARmap} \alias{RenameCells.VisiumV1} \title{Rename Cells in an Object} \usage{ \method{RenameCells}{SCTAssay}(object, new.names = NULL, ...) \method{RenameCells}{SlideSeq}(object, new.names = NULL, ...) \method{RenameCells}{STARmap}(object, new.names = NULL, ...) \method{RenameCells}{VisiumV1}(object, new.names = NULL, ...) } \arguments{ \item{object}{An object} \item{new.names}{vector of new cell names} \item{...}{Arguments passed to other methods} } \description{ Rename Cells in an Object } \seealso{ \code{\link[SeuratObject:RenameCells]{SeuratObject::RenameCells}} } \concept{objects} Seurat/man/IntegrateData.Rd0000644000176200001440000001365415056057544015317 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{IntegrateData} \alias{IntegrateData} \title{Integrate data} \usage{ IntegrateData( anchorset, new.assay.name = "integrated", normalization.method = c("LogNormalize", "SCT"), features = NULL, features.to.integrate = NULL, dims = 1:30, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, eps = 0, verbose = TRUE ) } \arguments{ \item{anchorset}{An \code{\link{AnchorSet}} object generated by \code{\link{FindIntegrationAnchors}}} \item{new.assay.name}{Name for the new assay containing the integrated data} \item{normalization.method}{Name of normalization method used: LogNormalize or SCT} \item{features}{Vector of features to use when computing the PCA to determine the weights. Only set if you want a different set from those used in the anchor finding process} \item{features.to.integrate}{Vector of features to integrate. By default, will use the features used in anchor finding.} \item{dims}{Number of dimensions to use in the anchor weighting procedure} \item{k.weight}{Number of neighbors to consider when weighting anchors} \item{weight.reduction}{Dimension reduction to use when calculating anchor weights. This can be one of: \itemize{ \item{A string, specifying the name of a dimension reduction present in all objects to be integrated} \item{A vector of strings, specifying the name of a dimension reduction to use for each object to be integrated} \item{A vector of \code{\link[SeuratObject]{DimReduc}} objects, specifying the object to use for each object in the integration} \item{NULL, in which case a new PCA will be calculated and used to calculate anchor weights} } Note that, if specified, the requested dimension reduction will only be used for calculating anchor weights in the first merge between reference and query, as the merged object will subsequently contain more cells than was in query, and weights will need to be calculated for all cells in the object.} \item{sd.weight}{Controls the bandwidth of the Gaussian kernel for weighting} \item{sample.tree}{Specify the order of integration. Order of integration should be encoded in a matrix, where each row represents one of the pairwise integration steps. Negative numbers specify a dataset, positive numbers specify the integration results from a given row (the format of the merge matrix included in the \code{\link{hclust}} function output). For example: \code{matrix(c(-2, 1, -3, -1), ncol = 2)} gives: \if{html}{\out{
}}\preformatted{ [,1] [,2] [1,] -2 -3 [2,] 1 -1 }\if{html}{\out{
}} Which would cause dataset 2 and 3 to be integrated first, then the resulting object integrated with dataset 1. If NULL, the sample tree will be computed automatically.} \item{preserve.order}{Do not reorder objects based on size for each pairwise integration.} \item{eps}{Error bound on the neighbor finding algorithm (from \code{\link[RANN]{RANN}})} \item{verbose}{Print progress bars and output} } \value{ Returns a \code{\link[SeuratObject]{Seurat}} object with a new integrated \code{\link[SeuratObject]{Assay}}. If \code{normalization.method = "LogNormalize"}, the integrated data is returned to the \code{data} slot and can be treated as log-normalized, corrected data. If \code{normalization.method = "SCT"}, the integrated data is returned to the \code{scale.data} slot and can be treated as centered, corrected Pearson residuals. } \description{ Perform dataset integration using a pre-computed \code{\link{AnchorSet}}. } \details{ The main steps of this procedure are outlined below. For a more detailed description of the methodology, please see Stuart, Butler, et al Cell 2019. \doi{10.1016/j.cell.2019.05.031}; \doi{10.1101/460147} For pairwise integration: \itemize{ \item{Construct a weights matrix that defines the association between each query cell and each anchor. These weights are computed as 1 - the distance between the query cell and the anchor divided by the distance of the query cell to the \code{k.weight}th anchor multiplied by the anchor score computed in \code{\link{FindIntegrationAnchors}}. We then apply a Gaussian kernel width a bandwidth defined by \code{sd.weight} and normalize across all \code{k.weight} anchors.} \item{Compute the anchor integration matrix as the difference between the two expression matrices for every pair of anchor cells} \item{Compute the transformation matrix as the product of the integration matrix and the weights matrix.} \item{Subtract the transformation matrix from the original expression matrix.} } For multiple dataset integration, we perform iterative pairwise integration. To determine the order of integration (if not specified via \code{sample.tree}), we \itemize{ \item{Define a distance between datasets as the total number of cells in the smaller dataset divided by the total number of anchors between the two datasets.} \item{Compute all pairwise distances between datasets} \item{Cluster this distance matrix to determine a guide tree} } } \examples{ \dontrun{ # to install the SeuratData package see https://github.com/satijalab/seurat-data library(SeuratData) data("panc8") # panc8 is a merged Seurat object containing 8 separate pancreas datasets # split the object by dataset pancreas.list <- SplitObject(panc8, split.by = "tech") # perform standard preprocessing on each object for (i in 1:length(pancreas.list)) { pancreas.list[[i]] <- NormalizeData(pancreas.list[[i]], verbose = FALSE) pancreas.list[[i]] <- FindVariableFeatures( pancreas.list[[i]], selection.method = "vst", nfeatures = 2000, verbose = FALSE ) } # find anchors anchors <- FindIntegrationAnchors(object.list = pancreas.list) # integrate data integrated <- IntegrateData(anchorset = anchors) } } \references{ Stuart T, Butler A, et al. Comprehensive Integration of Single-Cell Data. Cell. 2019;177:1888-1902 \doi{10.1016/j.cell.2019.05.031} } \concept{integration} Seurat/man/CountSketch.Rd0000644000176200001440000000136615056057544015032 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sketching.R \name{CountSketch} \alias{CountSketch} \title{Generate CountSketch random matrix} \usage{ CountSketch(nsketch, ncells, seed = NA_integer_, ...) } \arguments{ \item{nsketch}{Number of sketching random cells} \item{ncells}{Number of cells in the original data} \item{seed}{a single value, interpreted as an integer, or \code{NULL} (see \sQuote{Details}).} \item{...}{Ignored} } \value{ ... } \description{ Generate CountSketch random matrix } \references{ Clarkson, KL. & Woodruff, DP. Low-rank approximation and regression in input sparsity time. Journal of the ACM (JACM). 2017 Jan 30;63(6):1-45. \doi{10.1145/3019134}; } \concept{sketching} \keyword{internal} Seurat/man/LoadSTARmap.Rd0000644000176200001440000000201115056057544014633 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{LoadSTARmap} \alias{LoadSTARmap} \title{Load STARmap data} \usage{ LoadSTARmap( data.dir, counts.file = "cell_barcode_count.csv", gene.file = "genes.csv", qhull.file = "qhulls.tsv", centroid.file = "centroids.tsv", assay = "Spatial", image = "image" ) } \arguments{ \item{data.dir}{location of data directory that contains the counts matrix, gene name, qhull, and centroid files.} \item{counts.file}{name of file containing the counts matrix (csv)} \item{gene.file}{name of file containing the gene names (csv)} \item{qhull.file}{name of file containing the hull coordinates (tsv)} \item{centroid.file}{name of file containing the centroid positions (tsv)} \item{assay}{Name of assay to associate spatial data to} \item{image}{Name of "image" object storing spatial coordinates} } \value{ A \code{\link{Seurat}} object } \description{ Load STARmap data } \seealso{ \code{\link{STARmap}} } \concept{preprocessing} Seurat/man/ReadSlideSeq.Rd0000644000176200001440000000077415056057544015107 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{ReadSlideSeq} \alias{ReadSlideSeq} \title{Load Slide-seq spatial data} \usage{ ReadSlideSeq(coord.file, assay = "Spatial") } \arguments{ \item{coord.file}{Path to csv file containing bead coordinate positions} \item{assay}{Name of assay to associate image to} } \value{ A \code{\link{SlideSeq}} object } \description{ Load Slide-seq spatial data } \seealso{ \code{\link{SlideSeq}} } \concept{preprocessing} Seurat/man/MinMax.Rd0000644000176200001440000000126215056057544013764 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{MinMax} \alias{MinMax} \title{Apply a ceiling and floor to all values in a matrix} \usage{ MinMax(data, min, max) } \arguments{ \item{data}{Matrix or data frame} \item{min}{all values below this min value will be replaced with min} \item{max}{all values above this max value will be replaced with max} } \value{ Returns matrix after performing these floor and ceil operations } \description{ Apply a ceiling and floor to all values in a matrix } \examples{ mat <- matrix(data = rbinom(n = 25, size = 20, prob = 0.2 ), nrow = 5) mat MinMax(data = mat, min = 4, max = 5) } \concept{utilities} Seurat/man/ISpatialDimPlot.Rd0000644000176200001440000000167415056057544015601 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{ISpatialDimPlot} \alias{ISpatialDimPlot} \title{Visualize clusters spatially and interactively} \usage{ ISpatialDimPlot( object, image = NULL, image.scale = "lowres", group.by = NULL, alpha = c(0.3, 1) ) } \arguments{ \item{object}{A Seurat object} \item{image}{Name of the image to use in the plot} \item{image.scale}{Choose the scale factor ("lowres"/"hires") to apply in order to matchthe plot with the specified `image` - defaults to "lowres"} \item{group.by}{Name of meta.data column to group the data by} \item{alpha}{Controls opacity of spots. Provide as a vector specifying the min and max for SpatialFeaturePlot. For SpatialDimPlot, provide a single alpha value for each plot.} } \value{ Returns final plot as a ggplot object } \description{ Visualize clusters spatially and interactively } \concept{spatial} \concept{visualization} Seurat/man/JackStraw.Rd0000644000176200001440000000330415056057544014463 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dimensional_reduction.R \name{JackStraw} \alias{JackStraw} \title{Determine statistical significance of PCA scores.} \usage{ JackStraw( object, reduction = "pca", assay = NULL, dims = 20, num.replicate = 100, prop.freq = 0.01, verbose = TRUE, maxit = 1000 ) } \arguments{ \item{object}{Seurat object} \item{reduction}{DimReduc to use. ONLY PCA CURRENTLY SUPPORTED.} \item{assay}{Assay used to calculate reduction.} \item{dims}{Number of PCs to compute significance for} \item{num.replicate}{Number of replicate samplings to perform} \item{prop.freq}{Proportion of the data to randomly permute for each replicate} \item{verbose}{Print progress bar showing the number of replicates that have been processed.} \item{maxit}{maximum number of iterations to be performed by the irlba function of RunPCA} } \value{ Returns a Seurat object where JS(object = object[['pca']], slot = 'empirical') represents p-values for each gene in the PCA analysis. If ProjectPCA is subsequently run, JS(object = object[['pca']], slot = 'full') then represents p-values for all genes. } \description{ Randomly permutes a subset of data, and calculates projected PCA scores for these 'random' genes. Then compares the PCA scores for the 'random' genes with the observed PCA scores to determine statistical significance. End result is a p-value for each gene's association with each principal component. } \examples{ \dontrun{ data("pbmc_small") pbmc_small = suppressWarnings(JackStraw(pbmc_small)) head(JS(object = pbmc_small[['pca']], slot = 'empirical')) } } \references{ Inspired by Chung et al, Bioinformatics (2014) } \concept{dimensional_reduction} Seurat/man/HTOHeatmap.Rd0000644000176200001440000000316615056057544014532 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{HTOHeatmap} \alias{HTOHeatmap} \title{Hashtag oligo heatmap} \usage{ HTOHeatmap( object, assay = "HTO", classification = paste0(assay, "_classification"), global.classification = paste0(assay, "_classification.global"), ncells = 5000, singlet.names = NULL, raster = TRUE ) } \arguments{ \item{object}{Seurat object. Assumes that the hash tag oligo (HTO) data has been added and normalized, and demultiplexing has been run with HTODemux().} \item{assay}{Hashtag assay name.} \item{classification}{The naming for metadata column with classification result from HTODemux().} \item{global.classification}{The slot for metadata column specifying a cell as singlet/doublet/negative.} \item{ncells}{Number of cells to plot. Default is to choose 5000 cells by random subsampling, to avoid having to draw exceptionally large heatmaps.} \item{singlet.names}{Namings for the singlets. Default is to use the same names as HTOs.} \item{raster}{If true, plot with geom_raster, else use geom_tile. geom_raster may look blurry on some viewing applications such as Preview due to how the raster is interpolated. Set this to FALSE if you are encountering that issue (note that plots may take longer to produce/render).} } \value{ Returns a ggplot2 plot object. } \description{ Draws a heatmap of hashtag oligo signals across singlets/doublets/negative cells. Allows for the visualization of HTO demultiplexing results. } \examples{ \dontrun{ object <- HTODemux(object) HTOHeatmap(object) } } \seealso{ \code{\link{HTODemux}} } \concept{visualization} Seurat/man/SingleCorPlot.Rd0000644000176200001440000000244015056057544015316 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{SingleCorPlot} \alias{SingleCorPlot} \title{A single correlation plot} \usage{ SingleCorPlot( data, col.by = NULL, cols = NULL, pt.size = NULL, smooth = FALSE, rows.highlight = NULL, legend.title = NULL, na.value = "grey50", span = NULL, raster = NULL, raster.dpi = NULL, plot.cor = TRUE, jitter = TRUE ) } \arguments{ \item{data}{A data frame with two columns to be plotted} \item{col.by}{A vector or factor of values to color the plot by} \item{cols}{An optional vector of colors to use} \item{pt.size}{Point size for the plot} \item{smooth}{Make a smoothed scatter plot} \item{rows.highlight}{A vector of rows to highlight (like cells.highlight in \code{\link{SingleDimPlot}})} \item{legend.title}{Optional legend title} \item{raster}{Convert points to raster format, default is \code{NULL} which will automatically use raster if the number of points plotted is greater than 100,000} \item{raster.dpi}{the pixel resolution for rastered plots, passed to geom_scattermore(). Default is c(512, 512)} \item{plot.cor}{...} \item{jitter}{Jitter for easier visualization of crowded points} } \value{ A ggplot2 object } \description{ A single correlation plot } \keyword{internal} Seurat/man/Read10X_Coordinates.Rd0000644000176200001440000000105215056057544016266 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{Read10X_Coordinates} \alias{Read10X_Coordinates} \title{Load 10X Genomics Visium Tissue Positions} \usage{ Read10X_Coordinates(filename, filter.matrix) } \arguments{ \item{filename}{Path to a \code{tissue_positions_list.csv} file} \item{filter.matrix}{Filter spot/feature matrix to only include spots that have been determined to be over tissue} } \value{ A data.frame } \description{ Load 10X Genomics Visium Tissue Positions } \concept{preprocessing} Seurat/man/RunMixscape.Rd0000644000176200001440000000603715056057544015036 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mixscape.R \name{RunMixscape} \alias{RunMixscape} \title{Run Mixscape} \usage{ RunMixscape( object, assay = "PRTB", slot = "scale.data", labels = "gene", nt.class.name = "NT", new.class.name = "mixscape_class", min.de.genes = 5, min.cells = 5, de.assay = "RNA", logfc.threshold = 0.25, iter.num = 10, verbose = FALSE, split.by = NULL, fine.mode = FALSE, fine.mode.labels = "guide_ID", prtb.type = "KO" ) } \arguments{ \item{object}{An object of class Seurat.} \item{assay}{Assay to use for mixscape classification.} \item{slot}{Assay data slot to use.} \item{labels}{metadata column with target gene labels.} \item{nt.class.name}{Classification name of non-targeting gRNA cells.} \item{new.class.name}{Name of mixscape classification to be stored in metadata.} \item{min.de.genes}{Required number of genes that are differentially expressed for method to separate perturbed and non-perturbed cells.} \item{min.cells}{Minimum number of cells in target gene class. If fewer than this many cells are assigned to a target gene class during classification, all are assigned NP.} \item{de.assay}{Assay to use when performing differential expression analysis. Usually RNA.} \item{logfc.threshold}{Limit testing to genes which show, on average, at least X-fold difference (log-scale) between the two groups of cells. Default is 0.25 Increasing logfc.threshold speeds up the function, but can miss weaker signals.} \item{iter.num}{Number of normalmixEM iterations to run if convergence does not occur.} \item{verbose}{Display messages} \item{split.by}{metadata column with experimental condition/cell type classification information. This is meant to be used to account for cases a perturbation is condition/cell type -specific.} \item{fine.mode}{When this is equal to TRUE, DE genes for each target gene class will be calculated for each gRNA separately and pooled into one DE list for calculating the perturbation score of every cell and their subsequent classification.} \item{fine.mode.labels}{metadata column with gRNA ID labels.} \item{prtb.type}{specify type of CRISPR perturbation expected for labeling mixscape classifications. Default is KO.} } \value{ Returns Seurat object with with the following information in the meta data and tools slots: \describe{ \item{mixscape_class}{Classification result with cells being either classified as perturbed (KO, by default) or non-perturbed (NP) based on their target gene class.} \item{mixscape_class.global}{Global classification result (perturbed, NP or NT)} \item{p_ko}{Posterior probabilities used to determine if a cell is KO (default). Name of this item will change to match prtb.type parameter setting. (>0.5) or NP} \item{perturbation score}{Perturbation scores for every cell calculated in the first iteration of the function.} } } \description{ Function to identify perturbed and non-perturbed gRNA expressing cells that accounts for multiple treatments/conditions/chemical perturbations. } \concept{mixscape} Seurat/man/Read10X_h5.Rd0000644000176200001440000000132615056057544014334 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{Read10X_h5} \alias{Read10X_h5} \title{Read 10X hdf5 file} \usage{ Read10X_h5(filename, use.names = TRUE, unique.features = TRUE) } \arguments{ \item{filename}{Path to h5 file} \item{use.names}{Label row names with feature names rather than ID numbers.} \item{unique.features}{Make feature names unique (default TRUE)} } \value{ Returns a sparse matrix with rows and columns labeled. If multiple genomes are present, returns a list of sparse matrices (one per genome). } \description{ Read count matrix from 10X CellRanger hdf5 file. This can be used to read both scATAC-seq and scRNA-seq matrices. } \concept{preprocessing} Seurat/man/RunSLSI.Rd0000644000176200001440000000376315056057544014042 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/dimensional_reduction.R \name{RunSLSI} \alias{RunSLSI} \alias{RunSLSI.default} \alias{RunSLSI.Assay} \alias{RunSLSI.StdAssay} \alias{RunSLSI.Seurat} \title{Run Supervised Latent Semantic Indexing} \usage{ RunSLSI(object, ...) \method{RunSLSI}{default}( object, assay = NULL, n = 50, reduction.key = "SLSI_", graph = NULL, verbose = TRUE, seed.use = 42, ... ) \method{RunSLSI}{Assay}( object, assay = NULL, features = NULL, n = 50, reduction.key = "SLSI_", graph = NULL, verbose = TRUE, seed.use = 42, ... ) \method{RunSLSI}{StdAssay}( object, assay = NULL, features = NULL, n = 50, reduction.key = "SLSI_", graph = NULL, layer = "data", verbose = TRUE, seed.use = 42, ... ) \method{RunSLSI}{Seurat}( object, assay = NULL, features = NULL, n = 50, reduction.name = "slsi", reduction.key = "SLSI_", graph = NULL, verbose = TRUE, seed.use = 42, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to IRLBA irlba} \item{assay}{Name of Assay SLSI is being run on} \item{n}{Total Number of SLSI components to compute and store} \item{reduction.key}{dimensional reduction key, specifies the string before the number for the dimension names} \item{graph}{Graph used supervised by SLSI} \item{verbose}{Display messages} \item{seed.use}{Set a random seed. Setting NULL will not set a seed.} \item{features}{Features to compute SLSI on. If features=NULL, SLSI will be run using the variable features for the Assay5.} \item{layer}{Layer to run SLSI on} \item{reduction.name}{dimensional reduction name} } \value{ Returns Seurat object with the SLSI calculation stored in the reductions slot } \description{ Run a supervised LSI (SLSI) dimensionality reduction supervised by a cell-cell kernel. SLSI is used to capture a linear transformation of peaks that maximizes its dependency to the given cell-cell kernel. } \concept{dimensional_reduction} Seurat/man/CollapseEmbeddingOutliers.Rd0000644000176200001440000000230415056057544017661 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{CollapseEmbeddingOutliers} \alias{CollapseEmbeddingOutliers} \title{Move outliers towards center on dimension reduction plot} \usage{ CollapseEmbeddingOutliers( object, reduction = "umap", dims = 1:2, group.by = "ident", outlier.sd = 2, reduction.key = "UMAP_" ) } \arguments{ \item{object}{Seurat object} \item{reduction}{Name of DimReduc to adjust} \item{dims}{Dimensions to visualize} \item{group.by}{Group (color) cells in different ways (for example, orig.ident)} \item{outlier.sd}{Controls the outlier distance} \item{reduction.key}{Key for DimReduc that is returned} } \value{ Returns a DimReduc object with the modified embeddings } \description{ Move outliers towards center on dimension reduction plot } \examples{ \dontrun{ data("pbmc_small") pbmc_small <- FindClusters(pbmc_small, resolution = 1.1) pbmc_small <- RunUMAP(pbmc_small, dims = 1:5) DimPlot(pbmc_small, reduction = "umap") pbmc_small[["umap_new"]] <- CollapseEmbeddingOutliers(pbmc_small, reduction = "umap", reduction.key = 'umap_', outlier.sd = 0.5) DimPlot(pbmc_small, reduction = "umap_new") } } \concept{visualization} Seurat/man/Read10X.Rd0000644000176200001440000000357415056057544013747 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{Read10X} \alias{Read10X} \title{Load in data from 10X} \usage{ Read10X( data.dir, gene.column = 2, cell.column = 1, unique.features = TRUE, strip.suffix = FALSE ) } \arguments{ \item{data.dir}{Directory containing the matrix.mtx, genes.tsv (or features.tsv), and barcodes.tsv files provided by 10X. A vector or named vector can be given in order to load several data directories. If a named vector is given, the cell barcode names will be prefixed with the name.} \item{gene.column}{Specify which column of genes.tsv or features.tsv to use for gene names; default is 2} \item{cell.column}{Specify which column of barcodes.tsv to use for cell names; default is 1} \item{unique.features}{Make feature names unique (default TRUE)} \item{strip.suffix}{Remove trailing "-1" if present in all cell barcodes.} } \value{ If features.csv indicates the data has multiple data types, a list containing a sparse matrix of the data from each type will be returned. Otherwise a sparse matrix containing the expression data will be returned. } \description{ Enables easy loading of sparse data matrices provided by 10X genomics. } \examples{ \dontrun{ # For output from CellRanger < 3.0 data_dir <- 'path/to/data/directory' list.files(data_dir) # Should show barcodes.tsv, genes.tsv, and matrix.mtx expression_matrix <- Read10X(data.dir = data_dir) seurat_object = CreateSeuratObject(counts = expression_matrix) # For output from CellRanger >= 3.0 with multiple data types data_dir <- 'path/to/data/directory' list.files(data_dir) # Should show barcodes.tsv.gz, features.tsv.gz, and matrix.mtx.gz data <- Read10X(data.dir = data_dir) seurat_object = CreateSeuratObject(counts = data$`Gene Expression`) seurat_object[['Protein']] = CreateAssayObject(counts = data$`Antibody Capture`) } } \concept{preprocessing} Seurat/man/FilterSlideSeq.Rd0000644000176200001440000000313515056057544015453 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{FilterSlideSeq} \alias{FilterSlideSeq} \title{Filter stray beads from Slide-seq puck} \usage{ FilterSlideSeq( object, image = "image", center = NULL, radius = NULL, do.plot = TRUE ) } \arguments{ \item{object}{Seurat object with slide-seq data} \item{image}{Name of the image where the coordinates are stored} \item{center}{Vector specifying the x and y coordinates for the center of the inclusion circle} \item{radius}{Radius of the circle of inclusion} \item{do.plot}{Display a \code{\link{SpatialDimPlot}} with the cells being removed labeled.} } \value{ Returns a Seurat object with only the subset of cells that pass the circular filter } \description{ This function is useful for removing stray beads that fall outside the main Slide-seq puck area. Essentially, it's a circular filter where you set a center and radius defining a circle of beads to keep. If the center is not set, it will be estimated from the bead coordinates (removing the 1st and 99th quantile to avoid skewing the center by the stray beads). By default, this function will display a \code{\link{SpatialDimPlot}} showing which cells were removed for easy adjustment of the center and/or radius. } \examples{ \dontrun{ # This example uses the ssHippo dataset which you can download # using the SeuratData package. library(SeuratData) data('ssHippo') # perform filtering of beads ssHippo.filtered <- FilterSlideSeq(ssHippo, radius = 2300) # This radius looks to small so increase and repeat until satisfied } } \concept{objects} \concept{spatial} Seurat/man/SampleUMI.Rd0000644000176200001440000000145615117056271014366 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{SampleUMI} \alias{SampleUMI} \title{Sample UMI} \usage{ SampleUMI(data, max.umi = 1000, upsample = FALSE, verbose = FALSE) } \arguments{ \item{data}{Matrix with the raw count data} \item{max.umi}{Number of UMIs to sample to} \item{upsample}{Upsamples all cells with fewer than max.umi} \item{verbose}{Display the progress bar} } \value{ Matrix with downsampled data } \description{ Downsample each cell to a specified number of UMIs. Includes an option to upsample cells below specified UMI as well. } \examples{ data("pbmc_small") counts = as.matrix(x = GetAssayData(object = pbmc_small, assay = "RNA", layer = "counts")) downsampled = SampleUMI(data = counts) head(x = downsampled) } \concept{preprocessing} Seurat/man/VariableFeaturePlot.Rd0000644000176200001440000000247415116120241016457 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{VariableFeaturePlot} \alias{VariableFeaturePlot} \alias{VariableGenePlot} \alias{MeanVarPlot} \title{View variable features} \usage{ VariableFeaturePlot( object, cols = c("black", "red"), pt.size = 1, log = NULL, selection.method = NULL, assay = NULL, raster = NULL, raster.dpi = c(512, 512) ) } \arguments{ \item{object}{Seurat object} \item{cols}{Colors to specify non-variable/variable status} \item{pt.size}{Size of the points on the plot} \item{log}{Plot the x-axis in log scale} \item{selection.method}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}}} \item{assay}{Assay to pull variable features from} \item{raster}{Convert points to raster format, default is \code{NULL} which will automatically use raster if the number of points plotted is greater than 100,000} \item{raster.dpi}{Pixel resolution for rasterized plots, passed to geom_scattermore(). Default is c(512, 512).} } \value{ A ggplot object } \description{ View variable features } \examples{ data("pbmc_small") VariableFeaturePlot(object = pbmc_small) } \seealso{ \code{\link{FindVariableFeatures}} } \concept{visualization} Seurat/man/ProjectDim.Rd0000644000176200001440000000262715056057544014641 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dimensional_reduction.R \name{ProjectDim} \alias{ProjectDim} \title{Project Dimensional reduction onto full dataset} \usage{ ProjectDim( object, reduction = "pca", assay = NULL, dims.print = 1:5, nfeatures.print = 20, overwrite = FALSE, do.center = FALSE, verbose = TRUE ) } \arguments{ \item{object}{Seurat object} \item{reduction}{Reduction to use} \item{assay}{Assay to use} \item{dims.print}{Number of dims to print features for} \item{nfeatures.print}{Number of features with highest/lowest loadings to print for each dimension} \item{overwrite}{Replace the existing data in feature.loadings} \item{do.center}{Center the dataset prior to projection (should be set to TRUE)} \item{verbose}{Print top genes associated with the projected dimensions} } \value{ Returns Seurat object with the projected values } \description{ Takes a pre-computed dimensional reduction (typically calculated on a subset of genes) and projects this onto the entire dataset (all genes). Note that the cell loadings will remain unchanged, but now there are gene loadings for all genes. } \examples{ data("pbmc_small") pbmc_small pbmc_small <- ProjectDim(object = pbmc_small, reduction = "pca") # Visualize top projected genes in heatmap DimHeatmap(object = pbmc_small, reduction = "pca", dims = 1, balanced = TRUE) } \concept{dimensional_reduction} Seurat/man/MapQuery.Rd0000644000176200001440000000602115056057544014334 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{MapQuery} \alias{MapQuery} \title{Map query cells to a reference} \usage{ MapQuery( anchorset, query, reference, refdata = NULL, new.reduction.name = NULL, reference.reduction = NULL, reference.dims = NULL, query.dims = NULL, store.weights = FALSE, reduction.model = NULL, transferdata.args = list(), integrateembeddings.args = list(), projectumap.args = list(), verbose = TRUE ) } \arguments{ \item{anchorset}{An AnchorSet object} \item{query}{Query object used in anchorset construction} \item{reference}{Reference object used in anchorset construction} \item{refdata}{Data to transfer. This can be specified in one of two ways: \itemize{ \item{The reference data itself as either a vector where the names correspond to the reference cells, or a matrix, where the column names correspond to the reference cells.} \item{The name of the metadata field or assay from the reference object provided. This requires the reference parameter to be specified. If pulling assay data in this manner, it will pull the data from the data slot. To transfer data from other slots, please pull the data explicitly with \code{\link{GetAssayData}} and provide that matrix here.} }} \item{new.reduction.name}{Name for new integrated dimensional reduction.} \item{reference.reduction}{Name of reduction to use from the reference for neighbor finding} \item{reference.dims}{Dimensions (columns) to use from reference} \item{query.dims}{Dimensions (columns) to use from query} \item{store.weights}{Determine if the weight and anchor matrices are stored.} \item{reduction.model}{\code{DimReduc} object that contains the umap model} \item{transferdata.args}{A named list of additional arguments to \code{\link{TransferData}}} \item{integrateembeddings.args}{A named list of additional arguments to \code{\link{IntegrateEmbeddings}}} \item{projectumap.args}{A named list of additional arguments to \code{\link{ProjectUMAP}}} \item{verbose}{Print progress bars and output} } \value{ Returns a modified query Seurat object containing:#' \itemize{ \item{New Assays corresponding to the features transferred and/or their corresponding prediction scores from \code{\link{TransferData}}} \item{An integrated reduction from \code{\link{IntegrateEmbeddings}}} \item{A projected UMAP reduction of the query cells projected into the reference UMAP using \code{\link{ProjectUMAP}}} } } \description{ This is a convenience wrapper function around the following three functions that are often run together when mapping query data to a reference: \code{\link{TransferData}}, \code{\link{IntegrateEmbeddings}}, \code{\link{ProjectUMAP}}. Note that by default, the \code{weight.reduction} parameter for all functions will be set to the dimension reduction method used in the \code{\link{FindTransferAnchors}} function call used to construct the anchor object, and the \code{dims} parameter will be the same dimensions used to find anchors. } \concept{integration} Seurat/man/SaveAnnoyIndex.Rd0000644000176200001440000000057415056057544015473 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{SaveAnnoyIndex} \alias{SaveAnnoyIndex} \title{Save the Annoy index} \usage{ SaveAnnoyIndex(object, file) } \arguments{ \item{object}{A Neighbor object with the annoy index stored} \item{file}{Path to file to write index to} } \description{ Save the Annoy index } \concept{utilities} Seurat/man/Cells.Rd0000644000176200001440000000110615116120241013610 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{Cells.SCTModel} \alias{Cells.SCTModel} \alias{Cells.SlideSeq} \alias{Cells.STARmap} \alias{Cells.VisiumV1} \title{Get Cell Names} \usage{ \method{Cells}{SCTModel}(x, ...) \method{Cells}{SlideSeq}(x, ...) \method{Cells}{STARmap}(x, ...) \method{Cells}{VisiumV1}(x, ...) } \arguments{ \item{x}{An object} \item{...}{Arguments passed to other methods} } \description{ Get Cell Names } \seealso{ \code{\link[SeuratObject:Cells]{SeuratObject::Cells}} } \concept{objects} \concept{spatial} Seurat/man/FetchResiduals_reference.Rd0000644000176200001440000000141115056057544017512 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing5.R \name{FetchResiduals_reference} \alias{FetchResiduals_reference} \title{temporal function to get residuals from reference} \usage{ FetchResiduals_reference( object, reference.SCT.model = NULL, features = NULL, nCount_UMI = NULL, verbose = FALSE ) } \arguments{ \item{object}{A seurat object} \item{reference.SCT.model}{a reference SCT model that should be used for calculating the residuals} \item{features}{Names of features to compute} \item{nCount_UMI}{UMI counts. If not specified, defaults to column sums of object} \item{verbose}{Whether to print messages and progress bars} } \description{ temporal function to get residuals from reference } \keyword{internal} Seurat/man/contrast-theory.Rd0000644000176200001440000000131615056057544015740 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{contrast-theory} \alias{contrast-theory} \alias{Intensity} \alias{Luminance} \title{Get the intensity and/or luminance of a color} \source{ \url{https://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color} } \usage{ Intensity(color) Luminance(color) } \arguments{ \item{color}{A vector of colors} } \value{ A vector of intensities/luminances for each color } \description{ Get the intensity and/or luminance of a color } \examples{ Intensity(color = c('black', 'white', '#E76BF3')) Luminance(color = c('black', 'white', '#E76BF3')) } \concept{visualization} Seurat/man/CellsByImage.Rd0000644000176200001440000000123015056057544015066 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{CellsByImage} \alias{CellsByImage} \title{Get a vector of cell names associated with an image (or set of images)} \usage{ CellsByImage(object, images = NULL, unlist = FALSE) } \arguments{ \item{object}{Seurat object} \item{images}{Vector of image names} \item{unlist}{Return as a single vector of cell names as opposed to a list, named by image name.} } \value{ A vector of cell names } \description{ Get a vector of cell names associated with an image (or set of images) } \examples{ \dontrun{ CellsByImage(object = object, images = "slice1") } } \keyword{internal} Seurat/man/RunUMAP.Rd0000644000176200001440000002320615074241310014006 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/dimensional_reduction.R \name{RunUMAP} \alias{RunUMAP} \alias{RunUMAP.default} \alias{RunUMAP.Graph} \alias{RunUMAP.Neighbor} \alias{RunUMAP.Seurat} \title{Run UMAP} \usage{ RunUMAP(object, ...) \method{RunUMAP}{default}( object, reduction.key = "UMAP_", assay = NULL, reduction.model = NULL, return.model = FALSE, umap.method = "uwot", n.neighbors = 30L, n.components = 2L, metric = "cosine", n.epochs = NULL, learning.rate = 1, min.dist = 0.3, spread = 1, set.op.mix.ratio = 1, local.connectivity = 1L, repulsion.strength = 1, negative.sample.rate = 5, a = NULL, b = NULL, uwot.sgd = FALSE, uwot.approx_pow = FALSE, seed.use = 42, metric.kwds = NULL, angular.rp.forest = FALSE, densmap = FALSE, dens.lambda = 2, dens.frac = 0.3, dens.var.shift = 0.1, verbose = TRUE, ... ) \method{RunUMAP}{Graph}( object, assay = NULL, umap.method = "umap-learn", n.components = 2L, metric = "correlation", n.epochs = 0L, learning.rate = 1, min.dist = 0.3, spread = 1, repulsion.strength = 1, negative.sample.rate = 5L, a = NULL, b = NULL, uwot.sgd = FALSE, seed.use = 42L, metric.kwds = NULL, densmap = FALSE, densmap.kwds = NULL, verbose = TRUE, reduction.key = "UMAP_", ... ) \method{RunUMAP}{Neighbor}(object, reduction.model, ...) \method{RunUMAP}{Seurat}( object, dims = NULL, reduction = "pca", features = NULL, graph = NULL, assay = DefaultAssay(object = object), nn.name = NULL, slot = "data", umap.method = "uwot", reduction.model = NULL, return.model = FALSE, n.neighbors = 30L, n.components = 2L, metric = "cosine", n.epochs = NULL, learning.rate = 1, min.dist = 0.3, spread = 1, set.op.mix.ratio = 1, local.connectivity = 1L, repulsion.strength = 1, negative.sample.rate = 5L, a = NULL, b = NULL, uwot.sgd = FALSE, uwot.approx_pow = FALSE, seed.use = 42L, metric.kwds = NULL, angular.rp.forest = FALSE, densmap = FALSE, dens.lambda = 2, dens.frac = 0.3, dens.var.shift = 0.1, verbose = TRUE, reduction.name = "umap", reduction.key = NULL, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods and UMAP} \item{reduction.key}{dimensional reduction key, specifies the string before the number for the dimension names. UMAP by default} \item{assay}{Assay to pull data for when using \code{features}, or assay used to construct Graph if running UMAP on a Graph} \item{reduction.model}{\code{DimReduc} object that contains the umap model} \item{return.model}{whether UMAP will return the uwot model} \item{umap.method}{UMAP implementation to run. Can be \describe{ \item{\code{uwot}:}{Runs umap via the uwot R package \code{\link[uwot]{umap}}} \item{\code{uwot2}:}{Runs umap2 via the uwot R package \code{\link[uwot]{umap2}}} \item{\code{umap-learn}:}{Run the Seurat wrapper of the python umap-learn package} }} \item{n.neighbors}{This determines the number of neighboring points used in local approximations of manifold structure. Larger values will result in more global structure being preserved at the loss of detailed local structure. In general this parameter should often be in the range 5 to 50.} \item{n.components}{The dimension of the space to embed into.} \item{metric}{metric: This determines the choice of metric used to measure distance in the input space. A wide variety of metrics are already coded, and a user defined function can be passed as long as it has been JITd by numba.} \item{n.epochs}{he number of training epochs to be used in optimizing the low dimensional embedding. Larger values result in more accurate embeddings. If NULL is specified, a value will be selected based on the size of the input dataset (200 for large datasets, 500 for small).} \item{learning.rate}{The initial learning rate for the embedding optimization.} \item{min.dist}{This controls how tightly the embedding is allowed compress points together. Larger values ensure embedded points are more evenly distributed, while smaller values allow the algorithm to optimize more accurately with regard to local structure. Sensible values are in the range 0.001 to 0.5.} \item{spread}{The effective scale of embedded points. In combination with min.dist this determines how clustered/clumped the embedded points are.} \item{set.op.mix.ratio}{Interpolate between (fuzzy) union and intersection as the set operation used to combine local fuzzy simplicial sets to obtain a global fuzzy simplicial sets. Both fuzzy set operations use the product t-norm. The value of this parameter should be between 0.0 and 1.0; a value of 1.0 will use a pure fuzzy union, while 0.0 will use a pure fuzzy intersection.} \item{local.connectivity}{The local connectivity required - i.e. the number of nearest neighbors that should be assumed to be connected at a local level. The higher this value the more connected the manifold becomes locally. In practice this should be not more than the local intrinsic dimension of the manifold.} \item{repulsion.strength}{Weighting applied to negative samples in low dimensional embedding optimization. Values higher than one will result in greater weight being given to negative samples.} \item{negative.sample.rate}{The number of negative samples to select per positive sample in the optimization process. Increasing this value will result in greater repulsive force being applied, greater optimization cost, but slightly more accuracy.} \item{a}{More specific parameters controlling the embedding. If NULL, these values are set automatically as determined by min. dist and spread. Parameter of differentiable approximation of right adjoint functor.} \item{b}{More specific parameters controlling the embedding. If NULL, these values are set automatically as determined by min. dist and spread. Parameter of differentiable approximation of right adjoint functor.} \item{uwot.sgd}{Set \code{uwot::umap(fast_sgd = TRUE)}; see \code{\link[uwot]{umap}} for more details} \item{uwot.approx_pow}{Set \code{uwot::umap(approx_pow = TRUE)}. Default is \code{FALSE}. See \code{\link[uwot]{umap}} for more details.} \item{seed.use}{Set a random seed. By default, sets the seed to 42. Setting NULL will not set a seed} \item{metric.kwds}{A dictionary of arguments to pass on to the metric, such as the p value for Minkowski distance. If NULL then no arguments are passed on.} \item{angular.rp.forest}{Whether to use an angular random projection forest to initialize the approximate nearest neighbor search. This can be faster, but is mostly on useful for metric that use an angular style distance such as cosine, correlation etc. In the case of those metrics angular forests will be chosen automatically.} \item{densmap}{Whether to use the density-augmented objective of densMAP. Turning on this option generates an embedding where the local densities are encouraged to be correlated with those in the original space. Parameters below with the prefix ‘dens’ further control the behavior of this extension. Default is FALSE. Only compatible with 'umap-learn' method and version of umap-learn >= 0.5.0} \item{dens.lambda}{Specific parameter which controls the regularization weight of the density correlation term in densMAP. Higher values prioritize density preservation over the UMAP objective, and vice versa for values closer to zero. Setting this parameter to zero is equivalent to running the original UMAP algorithm. Default value is 2.} \item{dens.frac}{Specific parameter which controls the fraction of epochs (between 0 and 1) where the density-augmented objective is used in densMAP. The first (1 - dens_frac) fraction of epochs optimize the original UMAP objective before introducing the density correlation term. Default is 0.3.} \item{dens.var.shift}{Specific parameter which specifies a small constant added to the variance of local radii in the embedding when calculating the density correlation objective to prevent numerical instability from dividing by a small number. Default is 0.1.} \item{verbose}{Controls verbosity} \item{densmap.kwds}{A dictionary of arguments to pass on to the densMAP optimization.} \item{dims}{Which dimensions to use as input features, used only if \code{features} is NULL} \item{reduction}{Which dimensional reduction (PCA or ICA) to use for the UMAP input. Default is PCA} \item{features}{If set, run UMAP on this subset of features (instead of running on a set of reduced dimensions). Not set (NULL) by default; \code{dims} must be NULL to run on features} \item{graph}{Name of graph on which to run UMAP} \item{nn.name}{Name of knn output on which to run UMAP} \item{slot}{The slot used to pull data for when using \code{features}. data slot is by default.} \item{reduction.name}{Name to store dimensional reduction under in the Seurat object} } \value{ Returns a Seurat object containing a UMAP representation } \description{ Runs the Uniform Manifold Approximation and Projection (UMAP) dimensional reduction technique. To run using \code{umap.method="umap-learn"}, you must first install the umap-learn python package (e.g. via \code{pip install umap-learn}). Details on this package can be found here: \url{https://github.com/lmcinnes/umap}. For a more in depth discussion of the mathematics underlying UMAP, see the ArXiv paper here: \url{https://arxiv.org/abs/1802.03426}. } \examples{ \dontrun{ data("pbmc_small") pbmc_small # Run UMAP map on first 5 PCs pbmc_small <- RunUMAP(object = pbmc_small, dims = 1:5) # Plot results DimPlot(object = pbmc_small, reduction = 'umap') } } \references{ McInnes, L, Healy, J, UMAP: Uniform Manifold Approximation and Projection for Dimension Reduction, ArXiv e-prints 1802.03426, 2018 } \concept{dimensional_reduction} Seurat/man/LocalStruct.Rd0000644000176200001440000000242215056057544015031 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{LocalStruct} \alias{LocalStruct} \title{Calculate the local structure preservation metric} \usage{ LocalStruct( object, grouping.var, idents = NULL, neighbors = 100, reduction = "pca", reduced.dims = 1:10, orig.dims = 1:10, verbose = TRUE ) } \arguments{ \item{object}{Seurat object} \item{grouping.var}{Grouping variable} \item{idents}{Optionally specify a set of idents to compute metric for} \item{neighbors}{Number of neighbors to compute in pca/corrected pca space} \item{reduction}{Dimensional reduction to use for corrected space} \item{reduced.dims}{Number of reduced dimensions to use} \item{orig.dims}{Number of PCs to use in original space} \item{verbose}{Display progress bar} } \value{ Returns the average preservation metric } \description{ Calculates a metric that describes how well the local structure of each group prior to integration is preserved after integration. This procedure works as follows: For each group, compute a PCA, compute the top num.neighbors in pca space, compute the top num.neighbors in corrected pca space, compute the size of the intersection of those two sets of neighbors. Return the average over all groups. } \concept{integration} Seurat/man/PlotClusterTree.Rd0000644000176200001440000000161415056057544015674 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{PlotClusterTree} \alias{PlotClusterTree} \title{Plot clusters as a tree} \usage{ PlotClusterTree(object, direction = "downwards", ...) } \arguments{ \item{object}{Seurat object} \item{direction}{A character string specifying the direction of the tree (default is downwards) Possible options: "rightwards", "leftwards", "upwards", and "downwards".} \item{\dots}{Additional arguments to \code{\link[ape:plot.phylo]{ape::plot.phylo}}} } \value{ Plots dendogram (must be precomputed using BuildClusterTree), returns no value } \description{ Plots previously computed tree (from BuildClusterTree) } \examples{ \dontrun{ if (requireNamespace("ape", quietly = TRUE)) { data("pbmc_small") pbmc_small <- BuildClusterTree(object = pbmc_small) PlotClusterTree(object = pbmc_small) } } } \concept{visualization} Seurat/man/CollapseSpeciesExpressionMatrix.Rd0000644000176200001440000000275215056057544021123 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{CollapseSpeciesExpressionMatrix} \alias{CollapseSpeciesExpressionMatrix} \title{Slim down a multi-species expression matrix, when only one species is primarily of interenst.} \usage{ CollapseSpeciesExpressionMatrix( object, prefix = "HUMAN_", controls = "MOUSE_", ncontrols = 100 ) } \arguments{ \item{object}{A UMI count matrix. Should contain rownames that start with the ensuing arguments prefix.1 or prefix.2} \item{prefix}{The prefix denoting rownames for the species of interest. Default is "HUMAN_". These rownames will have this prefix removed in the returned matrix.} \item{controls}{The prefix denoting rownames for the species of 'negative control' cells. Default is "MOUSE_".} \item{ncontrols}{How many of the most highly expressed (average) negative control features (by default, 100 mouse genes), should be kept? All other rownames starting with prefix.2 are discarded.} } \value{ A UMI count matrix. Rownames that started with \code{prefix} have this prefix discarded. For rownames starting with \code{controls}, only the \code{ncontrols} most highly expressed features are kept, and the prefix is kept. All other rows are retained. } \description{ Valuable for CITE-seq analyses, where we typically spike in rare populations of 'negative control' cells from a different species. } \examples{ \dontrun{ cbmc.rna.collapsed <- CollapseSpeciesExpressionMatrix(cbmc.rna) } } \concept{utilities} Seurat/man/Read10X_probe_metadata.Rd0000644000176200001440000000125615056057544016771 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{Read10X_probe_metadata} \alias{Read10X_probe_metadata} \title{Read10x Probe Metadata} \usage{ Read10X_probe_metadata(data.dir, filename = "raw_probe_bc_matrix.h5") } \arguments{ \item{data.dir}{The directory where the file is located.} \item{filename}{The name of the file containing the raw probe barcode matrix in HDF5 format. The default filename is 'raw_probe_bc_matrix.h5'.} } \value{ Returns a data.frame containing the probe metadata. } \description{ This function reads the probe metadata from a 10x Genomics probe barcode matrix file in HDF5 format. } \concept{preprocessing} Seurat/man/BarcodeInflectionsPlot.Rd0000644000176200001440000000203315056057544017164 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{BarcodeInflectionsPlot} \alias{BarcodeInflectionsPlot} \title{Plot the Barcode Distribution and Calculated Inflection Points} \usage{ BarcodeInflectionsPlot(object) } \arguments{ \item{object}{Seurat object} } \value{ Returns a `ggplot2` object showing the by-group inflection points and provided (or default) rank threshold values in grey. } \description{ This function plots the calculated inflection points derived from the barcode-rank distribution. } \details{ See [CalculateBarcodeInflections()] to calculate inflection points and [SubsetByBarcodeInflections()] to subsequently subset the Seurat object. } \examples{ data("pbmc_small") pbmc_small <- CalculateBarcodeInflections(pbmc_small, group.column = 'groups') BarcodeInflectionsPlot(pbmc_small) } \seealso{ \code{\link{CalculateBarcodeInflections}} \code{\link{SubsetByBarcodeInflections}} } \author{ Robert A. Amezquita, \email{robert.amezquita@fredhutch.org} } \concept{visualization} Seurat/man/FindNeighbors.Rd0000644000176200001440000001263315056057544015320 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/clustering.R \name{FindNeighbors} \alias{FindNeighbors} \alias{FindNeighbors.default} \alias{FindNeighbors.Assay} \alias{FindNeighbors.dist} \alias{FindNeighbors.Seurat} \title{(Shared) Nearest-neighbor graph construction} \usage{ FindNeighbors(object, ...) \method{FindNeighbors}{default}( object, query = NULL, distance.matrix = FALSE, k.param = 20, return.neighbor = FALSE, compute.SNN = !return.neighbor, prune.SNN = 1/15, nn.method = "annoy", n.trees = 50, annoy.metric = "euclidean", nn.eps = 0, verbose = TRUE, l2.norm = FALSE, cache.index = FALSE, index = NULL, ... ) \method{FindNeighbors}{Assay}( object, features = NULL, k.param = 20, return.neighbor = FALSE, compute.SNN = !return.neighbor, prune.SNN = 1/15, nn.method = "annoy", n.trees = 50, annoy.metric = "euclidean", nn.eps = 0, verbose = TRUE, l2.norm = FALSE, cache.index = FALSE, ... ) \method{FindNeighbors}{dist}( object, k.param = 20, return.neighbor = FALSE, compute.SNN = !return.neighbor, prune.SNN = 1/15, nn.method = "annoy", n.trees = 50, annoy.metric = "euclidean", nn.eps = 0, verbose = TRUE, l2.norm = FALSE, cache.index = FALSE, ... ) \method{FindNeighbors}{Seurat}( object, reduction = "pca", dims = 1:10, assay = NULL, features = NULL, k.param = 20, return.neighbor = FALSE, compute.SNN = !return.neighbor, prune.SNN = 1/15, nn.method = "annoy", n.trees = 50, annoy.metric = "euclidean", nn.eps = 0, verbose = TRUE, do.plot = FALSE, graph.name = NULL, l2.norm = FALSE, cache.index = FALSE, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods} \item{query}{Matrix of data to query against object. If missing, defaults to object.} \item{distance.matrix}{Boolean value of whether the provided matrix is a distance matrix; note, for objects of class \code{dist}, this parameter will be set automatically} \item{k.param}{Defines k for the k-nearest neighbor algorithm} \item{return.neighbor}{Return result as \code{\link[SeuratObject]{Neighbor}} object. Not used with distance matrix input.} \item{compute.SNN}{also compute the shared nearest neighbor graph} \item{prune.SNN}{Sets the cutoff for acceptable Jaccard index when computing the neighborhood overlap for the SNN construction. Any edges with values less than or equal to this will be set to 0 and removed from the SNN graph. Essentially sets the stringency of pruning (0 --- no pruning, 1 --- prune everything).} \item{nn.method}{Method for nearest neighbor finding. Options include: rann, annoy} \item{n.trees}{More trees gives higher precision when using annoy approximate nearest neighbor search} \item{annoy.metric}{Distance metric for annoy. Options include: euclidean, cosine, manhattan, and hamming} \item{nn.eps}{Error bound when performing nearest neighbor search using RANN; default of 0.0 implies exact nearest neighbor search} \item{verbose}{Whether or not to print output to the console} \item{l2.norm}{Take L2Norm of the data} \item{cache.index}{Include cached index in returned Neighbor object (only relevant if return.neighbor = TRUE)} \item{index}{Precomputed index. Useful if querying new data against existing index to avoid recomputing.} \item{features}{Features to use as input for building the (S)NN; used only when \code{dims} is \code{NULL}} \item{reduction}{Reduction to use as input for building the (S)NN} \item{dims}{Dimensions of reduction to use as input} \item{assay}{Assay to use in construction of (S)NN; used only when \code{dims} is \code{NULL}} \item{do.plot}{Plot SNN graph on tSNE coordinates} \item{graph.name}{Optional naming parameter for stored (S)NN graph (or Neighbor object, if return.neighbor = TRUE). Default is assay.name_(s)nn. To store both the neighbor graph and the shared nearest neighbor (SNN) graph, you must supply a vector containing two names to the \code{graph.name} parameter. The first element in the vector will be used to store the nearest neighbor (NN) graph, and the second element used to store the SNN graph. If only one name is supplied, only the NN graph is stored.} } \value{ This function can either return a \code{\link[SeuratObject]{Neighbor}} object with the KNN information or a list of \code{\link[SeuratObject]{Graph}} objects with the KNN and SNN depending on the settings of \code{return.neighbor} and \code{compute.SNN}. When running on a \code{\link[SeuratObject]{Seurat}} object, this returns the \code{\link[SeuratObject]{Seurat}} object with the Graphs or Neighbor objects stored in their respective slots. Names of the Graph or Neighbor object can be found with \code{\link[SeuratObject]{Graphs}} or \code{\link[SeuratObject]{Neighbors}}. } \description{ Computes the \code{k.param} nearest neighbors for a given dataset. Can also optionally (via \code{compute.SNN}), construct a shared nearest neighbor graph by calculating the neighborhood overlap (Jaccard index) between every cell and its \code{k.param} nearest neighbors. } \examples{ data("pbmc_small") pbmc_small # Compute an SNN on the gene expression level pbmc_small <- FindNeighbors(pbmc_small, features = VariableFeatures(object = pbmc_small)) # More commonly, we build the SNN on a dimensionally reduced form of the data # such as the first 10 principle components. pbmc_small <- FindNeighbors(pbmc_small, reduction = "pca", dims = 1:10) } \concept{clustering} Seurat/man/CreateCategoryMatrix.Rd0000644000176200001440000000105715056057544016663 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{CreateCategoryMatrix} \alias{CreateCategoryMatrix} \title{Create one hot matrix for a given label} \usage{ CreateCategoryMatrix( labels, method = c("aggregate", "average"), cells.name = NULL ) } \arguments{ \item{labels}{A vector of labels} \item{method}{Method to aggregate cells with the same label. Either 'aggregate' or 'average'} \item{cells.name}{A vector of cell names} } \description{ Create one hot matrix for a given label } \concept{utilities} Seurat/man/PrepSCTFindMarkers.Rd0000644000176200001440000000546515117326655016212 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/differential_expression.R \name{PrepSCTFindMarkers} \alias{PrepSCTFindMarkers} \title{Prepare object to run differential expression on SCT assay with multiple models} \usage{ PrepSCTFindMarkers(object, assay = "SCT", verbose = TRUE) } \arguments{ \item{object}{Seurat object with SCT assays} \item{assay}{Assay name where for SCT objects are stored; Default is 'SCT'} \item{verbose}{Print messages and progress} } \value{ Returns a Seurat object with recorrected counts and data in the SCT assay. } \description{ Given a merged object with multiple SCT models, this function uses minimum of the median UMI (calculated using the raw UMI counts) of individual objects to reverse the individual SCT regression model using minimum of median UMI as the sequencing depth covariate. The counts slot of the SCT assay is replaced with recorrected counts and the data slot is replaced with log1p of recorrected counts. } \section{Progress Updates with \pkg{progressr}}{ This function uses \href{https://cran.r-project.org/package=progressr}{\pkg{progressr}} to render status updates and progress bars. To enable progress updates, wrap the function call in \code{\link[progressr]{with_progress}} or run \code{\link[progressr:handlers]{handlers(global = TRUE)}} before running this function. For more details about \pkg{progressr}, please read \href{https://progressr.futureverse.org/articles/progressr-01-intro.html}{\code{vignette("progressr-intro")}} } \section{Parallelization with \pkg{future}}{ This function uses \href{https://cran.r-project.org/package=future}{\pkg{future}} to enable parallelization. Parallelization strategies can be set using \code{\link[future]{plan}}. Common plans include \dQuote{\code{sequential}} for non-parallelized processing or \dQuote{\code{multisession}} for parallel evaluation using multiple \R sessions; for other plans, see the \dQuote{Implemented evaluation strategies} section of \code{\link[future:plan]{?future::plan}}. For a more thorough introduction to \pkg{future}, see \href{https://future.futureverse.org/articles/future-1-overview.html}{\code{vignette("future-1-overview")}} } \examples{ data("pbmc_small") pbmc_small1 <- SCTransform(object = pbmc_small, variable.features.n = 20, vst.flavor="v1") pbmc_small2 <- SCTransform(object = pbmc_small, variable.features.n = 20, vst.flavor="v1") pbmc_merged <- merge(x = pbmc_small1, y = pbmc_small2) pbmc_merged <- PrepSCTFindMarkers(object = pbmc_merged) markers <- FindMarkers( object = pbmc_merged, ident.1 = "0", ident.2 = "1", assay = "SCT" ) pbmc_subset <- subset(pbmc_merged, idents = c("0", "1")) markers_subset <- FindMarkers( object = pbmc_subset, ident.1 = "0", ident.2 = "1", assay = "SCT", recorrect_umi = FALSE ) } \concept{differential_expression} \concept{future} Seurat/man/Format10X_GeoJson_CellID.Rd0000644000176200001440000000137015104403544017101 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{Format10X_GeoJson_CellID} \alias{Format10X_GeoJson_CellID} \title{Format 10X Genomics GeoJson cell IDs} \usage{ Format10X_GeoJson_CellID(ids, prefix = "cellid_", suffix = "-1", digits = 9) } \arguments{ \item{ids}{Vector of cell IDs to format} \item{prefix}{Optional prefix string} \item{suffix}{Optional suffix string} \item{digits}{Number of digits to zero-pad A helper function to format cell IDs from the segmentation GeoJson to the same type as in the matrix.h5 The GeoJson has cell IDs as integers (eg 1). They need to be in the format cellid_000000001-1} } \value{ Vector of formatted cell IDs } \description{ Format 10X Genomics GeoJson cell IDs } Seurat/man/PseudobulkExpression.Rd0000644000176200001440000000515715056057544016777 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/utilities.R \name{PseudobulkExpression} \alias{PseudobulkExpression} \alias{PseudobulkExpression.Assay} \alias{PseudobulkExpression.StdAssay} \alias{PseudobulkExpression.Seurat} \title{Pseudobulk Expression} \usage{ PseudobulkExpression(object, ...) \method{PseudobulkExpression}{Assay}( object, assay, category.matrix, features = NULL, layer = "data", slot = deprecated(), verbose = TRUE, ... ) \method{PseudobulkExpression}{StdAssay}( object, assay, category.matrix, features = NULL, layer = "data", slot = deprecated(), verbose = TRUE, ... ) \method{PseudobulkExpression}{Seurat}( object, assays = NULL, features = NULL, return.seurat = FALSE, group.by = "ident", add.ident = NULL, layer = "data", slot = deprecated(), method = "average", normalization.method = "LogNormalize", scale.factor = 10000, margin = 1, verbose = TRUE, ... ) } \arguments{ \item{object}{Seurat object} \item{...}{Arguments to be passed to methods such as \code{\link{CreateSeuratObject}}} \item{assay}{The name of the passed assay - used primarily for warning/error messages} \item{category.matrix}{A matrix defining groupings for pseudobulk expression calculations; each column represents an identity class, and each row a sample} \item{features}{Features to analyze. Default is all features in the assay} \item{layer}{Layer(s) to user; if multiple are given, assumed to follow the order of 'assays' (if specified) or object's assays} \item{slot}{(Deprecated) See \code{layer}} \item{verbose}{Print messages and show progress bar} \item{assays}{Which assays to use. Default is all assays} \item{return.seurat}{Whether to return the data as a Seurat object. Default is FALSE} \item{group.by}{Categories for grouping (e.g, "ident", "replicate", "celltype"); "ident" by default} \item{add.ident}{(Deprecated) See group.by} \item{method}{The method used for calculating pseudobulk expression; one of: "average" or "aggregate"} \item{normalization.method}{Method for normalization, see \code{\link{NormalizeData}}} \item{scale.factor}{Scale factor for normalization, see \code{\link{NormalizeData}}} \item{margin}{Margin to perform CLR normalization, see \code{\link{NormalizeData}}} } \value{ Returns object after normalization Returns a matrix with genes as rows, identity classes as columns. If return.seurat is TRUE, returns an object of class \code{\link{Seurat}}. } \description{ Normalize the count data present in a given assay. Returns a representative expression value for each identity class } \concept{utilities} Seurat/man/IntegrationAnchorSet-class.Rd0000644000176200001440000000062615056057544017773 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{IntegrationAnchorSet-class} \alias{IntegrationAnchorSet-class} \alias{IntegrationAnchorSet} \title{The IntegrationAnchorSet Class} \description{ Inherits from the Anchorset class. Implemented mainly for method dispatch purposes. See \code{\link{AnchorSet}} for slot details. } \concept{objects} Seurat/man/SketchData.Rd0000644000176200001440000000345215056057544014611 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sketching.R \name{SketchData} \alias{SketchData} \title{Sketch Data} \usage{ SketchData( object, assay = NULL, ncells = 5000L, sketched.assay = "sketch", method = c("LeverageScore", "Uniform"), var.name = "leverage.score", over.write = FALSE, seed = 123L, cast = "dgCMatrix", verbose = TRUE, features = NULL, ... ) } \arguments{ \item{object}{A Seurat object.} \item{assay}{Assay name. Default is NULL, in which case the default assay of the object is used.} \item{ncells}{A positive integer or a named vector/list specifying the number of cells to sample per layer. If a single integer is provided, the same number of cells will be sampled from each layer. Default is 5000.} \item{sketched.assay}{Sketched assay name. A sketch assay is created or overwrite with the sketch data. Default is 'sketch'.} \item{method}{Sketching method to use. Can be 'LeverageScore' or 'Uniform'. Default is 'LeverageScore'.} \item{var.name}{A metadata column name to store the leverage scores. Default is 'leverage.score'.} \item{over.write}{whether to overwrite existing column in the metadata. Default is FALSE.} \item{seed}{A positive integer for the seed of the random number generator. Default is 123.} \item{cast}{The type to cast the resulting assay to. Default is 'dgCMatrix'.} \item{verbose}{Print progress and diagnostic messages} \item{features}{A character vector of feature names to include in the sketched assay.} \item{...}{Arguments passed to other methods} } \value{ A Seurat object with the sketched data added as a new assay. } \description{ This function uses sketching methods to downsample high-dimensional single-cell RNA expression data, which can help with scalability for large datasets. } \concept{sketching} Seurat/man/ProjectData.Rd0000644000176200001440000000365715056057544015005 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sketching.R \name{ProjectData} \alias{ProjectData} \title{Project full data to the sketch assay} \usage{ ProjectData( object, assay = "RNA", sketched.assay = "sketch", sketched.reduction, full.reduction, dims, normalization.method = c("LogNormalize", "SCT"), refdata = NULL, k.weight = 50, umap.model = NULL, recompute.neighbors = FALSE, recompute.weights = FALSE, verbose = TRUE ) } \arguments{ \item{object}{A Seurat object.} \item{assay}{Assay name for the full data. Default is 'RNA'.} \item{sketched.assay}{Sketched assay name to project onto. Default is 'sketch'.} \item{sketched.reduction}{Dimensional reduction results of the sketched assay to project onto.} \item{full.reduction}{Dimensional reduction name for the projected full dataset.} \item{dims}{Dimensions to include in the projection.} \item{normalization.method}{Normalization method to use. Can be 'LogNormalize' or 'SCT'. Default is 'LogNormalize'.} \item{refdata}{An optional list for label transfer from sketch to full data. Default is NULL. Similar to refdata in `MapQuery`} \item{k.weight}{Number of neighbors to consider when weighting labels for transfer. Default is 50.} \item{umap.model}{An optional pre-computed UMAP model. Default is NULL.} \item{recompute.neighbors}{Whether to recompute the neighbors for label transfer. Default is FALSE.} \item{recompute.weights}{Whether to recompute the weights for label transfer. Default is FALSE.} \item{verbose}{Print progress and diagnostic messages.} } \value{ A Seurat object with the full data projected onto the sketched dimensional reduction results. The projected data are stored in the specified full reduction. } \description{ This function allows projection of high-dimensional single-cell RNA expression data from a full dataset onto the lower-dimensional embedding of the sketch of the dataset. } \concept{sketching} Seurat/man/MixingMetric.Rd0000644000176200001440000000227515056057544015177 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{MixingMetric} \alias{MixingMetric} \title{Calculates a mixing metric} \usage{ MixingMetric( object, grouping.var, reduction = "pca", dims = 1:2, k = 5, max.k = 300, eps = 0, verbose = TRUE ) } \arguments{ \item{object}{Seurat object} \item{grouping.var}{Grouping variable for dataset} \item{reduction}{Which dimensionally reduced space to use} \item{dims}{Dimensions to use} \item{k}{Neighbor number to examine per group} \item{max.k}{Maximum size of local neighborhood to compute} \item{eps}{Error bound on the neighbor finding algorithm (from RANN)} \item{verbose}{Displays progress bar} } \value{ Returns a vector of values of the mixing metric for each cell } \description{ Here we compute a measure of how well mixed a composite dataset is. To compute, we first examine the local neighborhood for each cell (looking at max.k neighbors) and determine for each group (could be the dataset after integration) the k nearest neighbor and what rank that neighbor was in the overall neighborhood. We then take the median across all groups as the mixing metric per cell. } \concept{integration} Seurat/man/as.Seurat.Rd0000644000176200001440000000241015116120241014412 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{as.Seurat.CellDataSet} \alias{as.Seurat.CellDataSet} \alias{as.Seurat.SingleCellExperiment} \title{Convert objects to \code{Seurat} objects} \usage{ \method{as.Seurat}{CellDataSet}(x, slot = "counts", assay = "RNA", verbose = TRUE, ...) \method{as.Seurat}{SingleCellExperiment}( x, counts = "counts", data = "logcounts", assay = NULL, project = "SingleCellExperiment", ... ) } \arguments{ \item{x}{An object to convert to class \code{Seurat}} \item{slot}{Slot to store expression data as} \item{assay}{Name of assays to convert; set to \code{NULL} for all assays to be converted} \item{verbose}{Show progress updates} \item{...}{Arguments passed to other methods} \item{counts}{name of the SingleCellExperiment assay to store as \code{counts}; set to \code{NULL} if only normalized data are present} \item{data}{name of the SingleCellExperiment assay to slot as \code{data}. Set to NULL if only counts are present} \item{project}{Project name for new Seurat object} } \value{ A \code{Seurat} object generated from \code{x} } \description{ Convert objects to \code{Seurat} objects } \seealso{ \code{\link[SeuratObject:as.Seurat]{SeuratObject::as.Seurat}} } \concept{objects} Seurat/man/Radius.Rd0000644000176200001440000000141015116120241013773 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{Radius.SlideSeq} \alias{Radius.SlideSeq} \alias{Radius.STARmap} \alias{Radius.VisiumV1} \alias{Radius.VisiumV2} \title{Get Spot Radius} \usage{ \method{Radius}{SlideSeq}(object, ...) \method{Radius}{STARmap}(object, ...) \method{Radius}{VisiumV1}(object, scale = "lowres", ...) \method{Radius}{VisiumV1}(object, scale = "lowres", ...) } \arguments{ \item{object}{An image object} \item{...}{Arguments passed to other methods} \item{scale}{A factor to scale the radius by; one of: "hires", "lowres", or \code{NULL} for the unscaled value.} } \description{ Get Spot Radius } \seealso{ \code{\link[SeuratObject:Radius]{SeuratObject::Radius}} } \concept{objects} \concept{spatial} Seurat/man/Seurat-package.Rd0000644000176200001440000001163215104403544015416 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/zzz.R \docType{package} \name{Seurat-package} \alias{Seurat} \alias{Seurat-package} \title{Seurat: Tools for Single Cell Genomics} \description{ A toolkit for quality control, analysis, and exploration of single cell RNA sequencing data. 'Seurat' aims to enable users to identify and interpret sources of heterogeneity from single cell transcriptomic measurements, and to integrate diverse types of single cell data. See Satija R, Farrell J, Gennert D, et al (2015) \doi{10.1038/nbt.3192}, Macosko E, Basu A, Satija R, et al (2015) \doi{10.1016/j.cell.2015.05.002}, Stuart T, Butler A, et al (2019) \doi{10.1016/j.cell.2019.05.031}, and Hao, Hao, et al (2020) \doi{10.1101/2020.10.12.335331} for more details. } \section{Package options}{ Seurat uses the following [options()] to configure behaviour: \describe{ \item{\code{Seurat.memsafe}}{global option to call gc() after many operations. This can be helpful in cleaning up the memory status of the R session and prevent use of swap space. However, it does add to the computational overhead and setting to FALSE can speed things up if you're working in an environment where RAM availability is not a concern.} \item{\code{Seurat.warn.umap.uwot}}{Show warning about the default backend for \code{\link{RunUMAP}} changing from Python UMAP via reticulate to UWOT} \item{\code{Seurat.checkdots}}{For functions that have ... as a parameter, this controls the behavior when an item isn't used. Can be one of warn, stop, or silent.} \item{\code{Seurat.limma.wilcox.msg}}{{Show message about more efficient Wilcoxon Rank Sum test available via the limma package}} \item{\code{Seurat.Rfast2.msg}}{{Show message about more efficient Moran's I function available via the Rfast2 package}} \item{\code{Seurat.warn.vlnplot.split}}{Show message about changes to default behavior of split/multi violin plots} } } \seealso{ Useful links: \itemize{ \item \url{https://satijalab.org/seurat} \item \url{https://github.com/satijalab/seurat} \item Report bugs at \url{https://github.com/satijalab/seurat/issues} } } \author{ \strong{Maintainer}: Rahul Satija \email{seurat@nygenome.org} (\href{https://orcid.org/0000-0001-9448-8833}{ORCID}) Other contributors: \itemize{ \item Andrew Butler \email{abutler@nygenome.org} (\href{https://orcid.org/0000-0003-3608-0463}{ORCID}) [contributor] \item Saket Choudhary \email{schoudhary@nygenome.org} (\href{https://orcid.org/0000-0001-5202-7633}{ORCID}) [contributor] \item David Collins \email{dcollins@nygenome.org} (\href{https://orcid.org/0000-0001-9243-7821}{ORCID}) [contributor] \item Charlotte Darby \email{cdarby@nygenome.org} (\href{https://orcid.org/0000-0003-2195-5300}{ORCID}) [contributor] \item Jeff Farrell \email{jfarrell@g.harvard.edu} [contributor] \item Isabella Grabski \email{igrabski@nygenome.org} (\href{https://orcid.org/0000-0002-0616-5469}{ORCID}) [contributor] \item Christoph Hafemeister \email{chafemeister@nygenome.org} (\href{https://orcid.org/0000-0001-6365-8254}{ORCID}) [contributor] \item Yuhan Hao \email{yhao@nygenome.org} (\href{https://orcid.org/0000-0002-1810-0822}{ORCID}) [contributor] \item Austin Hartman \email{ahartman@nygenome.org} (\href{https://orcid.org/0000-0001-7278-1852}{ORCID}) [contributor] \item Paul Hoffman \email{hoff0792@umn.edu} (\href{https://orcid.org/0000-0002-7693-8957}{ORCID}) [contributor] \item Jaison Jain \email{jjain@nygenome.org} (\href{https://orcid.org/0000-0002-9478-5018}{ORCID}) [contributor] \item Longda Jiang \email{ljiang@nygenome.org} (\href{https://orcid.org/0000-0003-4964-6497}{ORCID}) [contributor] \item Madeline Kowalski \email{mkowalski@nygenome.org} (\href{https://orcid.org/0000-0002-5655-7620}{ORCID}) [contributor] \item Skylar Li \email{sli@nygenome.org} [contributor] \item Brian Zhang \email{brianzhang@nygenome.org} [contributor] \item Gesmira Molla \email{gmolla@nygenome.org} (\href{https://orcid.org/0000-0002-8628-5056}{ORCID}) [contributor] \item Efthymia Papalexi \email{epapalexi@nygenome.org} (\href{https://orcid.org/0000-0001-5898-694X}{ORCID}) [contributor] \item Patrick Roelli \email{proelli@nygenome.org} [contributor] \item Karthik Shekhar \email{kshekhar@berkeley.edu} [contributor] \item Anagha Shenoy \email{ashenoy@nygenome.org} (\href{https://orcid.org/0000-0002-0537-6862}{ORCID}) [contributor] \item Avi Srivastava \email{asrivastava@nygenome.org} (\href{https://orcid.org/0000-0001-9798-2079}{ORCID}) [contributor] \item Tim Stuart \email{tstuart@nygenome.org} (\href{https://orcid.org/0000-0002-3044-0897}{ORCID}) [contributor] \item Kristof Torkenczy (\href{https://orcid.org/0000-0002-4869-7957}{ORCID}) [contributor] \item Brian Zhang \email{brianzhang@nygenome.org} [contributor] \item Shiwei Zheng \email{szheng@nygenome.org} (\href{https://orcid.org/0000-0001-6682-6743}{ORCID}) [contributor] \item Satija Lab and Collaborators [funder] } } Seurat/man/ISpatialFeaturePlot.Rd0000644000176200001440000000202715056057544016454 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{ISpatialFeaturePlot} \alias{ISpatialFeaturePlot} \title{Visualize features spatially and interactively} \usage{ ISpatialFeaturePlot( object, feature, image = NULL, image.scale = "lowres", slot = "data", alpha = c(0.1, 1) ) } \arguments{ \item{object}{A Seurat object} \item{feature}{Feature to visualize} \item{image}{Name of the image to use in the plot} \item{image.scale}{Choose the scale factor ("lowres"/"hires") to apply in order to matchthe plot with the specified `image` - defaults to "lowres"} \item{slot}{If plotting a feature, which data slot to pull from (counts, data, or scale.data)} \item{alpha}{Controls opacity of spots. Provide as a vector specifying the min and max for SpatialFeaturePlot. For SpatialDimPlot, provide a single alpha value for each plot.} } \value{ Returns final plot as a ggplot object } \description{ Visualize features spatially and interactively } \concept{spatial} \concept{visualization} Seurat/man/RunLeiden.Rd0000644000176200001440000000426015070750476014461 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/clustering.R \name{RunLeiden} \alias{RunLeiden} \title{Run Leiden clustering algorithm} \usage{ RunLeiden( object, method = deprecated(), leiden_method = c("leidenbase", "igraph"), partition.type = c("RBConfigurationVertexPartition", "ModularityVertexPartition", "RBERVertexPartition", "CPMVertexPartition", "MutableVertexPartition", "SignificanceVertexPartition", "SurpriseVertexPartition"), leiden_objective_function = c("modularity", "CPM"), initial.membership = NULL, node.sizes = NULL, resolution.parameter = 1, random.seed = 1, n.iter = 10 ) } \arguments{ \item{object}{An adjacency matrix or adjacency list.} \item{method}{DEPRECATED.} \item{leiden_method}{Choose from the leidenbase ("leidenbase") or igraph ("igraph") packages for running leiden. Default is "leidenbase"} \item{partition.type}{Type of partition to use for Leiden algorithm. Defaults to "RBConfigurationVertexPartition", see https://cran.rstudio.com/web/packages/leidenbase/leidenbase.pdf for more options.} \item{leiden_objective_function}{objective function to use if `leiden_method = "igraph"`. See \code{\link[igraph]{cluster_leiden}} for more information. Default is "modularity".} \item{initial.membership}{Passed to the `initial_membership` parameter of `leidenbase::leiden_find_partition`.} \item{node.sizes}{Passed to the `node_sizes` parameter of `leidenbase::leiden_find_partition`.} \item{resolution.parameter}{A parameter controlling the coarseness of the clusters for Leiden algorithm. Higher values lead to more clusters. (defaults to 1.0 for partition types that accept a resolution parameter)} \item{random.seed}{Seed of the random number generator, must be greater than 0.} \item{n.iter}{Maximal number of iterations per random start} } \description{ Returns a vector of partition indices. } \references{ igraph-based leiden clustering is adapted from \code{\link[BPCells]{cluster_graph_leiden}} (MIT License), author: Benjamin Parks. Reordering of igraph leiden cluster numbers by cluster size adapted from rliger v2.0 `.labelClustBySize` (GPL-3.0 License) authors: Josh Welch & Yichen Wang } \concept{clustering} Seurat/man/RPCAIntegration.Rd0000644000176200001440000001041715056057544015526 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration5.R \name{RPCAIntegration} \alias{RPCAIntegration} \title{Seurat-RPCA Integration} \usage{ RPCAIntegration( object = NULL, assay = NULL, layers = NULL, orig = NULL, new.reduction = "integrated.dr", reference = NULL, features = NULL, normalization.method = c("LogNormalize", "SCT"), dims = 1:30, k.filter = NA, scale.layer = "scale.data", dims.to.integrate = NULL, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, verbose = TRUE, ... ) } \arguments{ \item{object}{A \code{Seurat} object} \item{assay}{Name of \code{Assay} in the \code{Seurat} object} \item{layers}{Names of layers in \code{assay}} \item{orig}{A \link[SeuratObject]{DimReduc} to correct} \item{new.reduction}{Name of new integrated dimensional reduction} \item{reference}{A reference \code{Seurat} object} \item{features}{A vector of features to use for integration} \item{normalization.method}{Name of normalization method used: LogNormalize or SCT} \item{dims}{Dimensions of dimensional reduction to use for integration} \item{k.filter}{Number of anchors to filter} \item{scale.layer}{Name of scaled layer in \code{Assay}} \item{dims.to.integrate}{Number of dimensions to return integrated values for} \item{k.weight}{Number of neighbors to consider when weighting anchors} \item{weight.reduction}{Dimension reduction to use when calculating anchor weights. This can be one of: \itemize{ \item{A string, specifying the name of a dimension reduction present in all objects to be integrated} \item{A vector of strings, specifying the name of a dimension reduction to use for each object to be integrated} \item{A vector of \code{\link[SeuratObject]{DimReduc}} objects, specifying the object to use for each object in the integration} \item{NULL, in which case the full corrected space is used for computing anchor weights.} }} \item{sd.weight}{Controls the bandwidth of the Gaussian kernel for weighting} \item{sample.tree}{Specify the order of integration. Order of integration should be encoded in a matrix, where each row represents one of the pairwise integration steps. Negative numbers specify a dataset, positive numbers specify the integration results from a given row (the format of the merge matrix included in the \code{\link{hclust}} function output). For example: \code{matrix(c(-2, 1, -3, -1), ncol = 2)} gives: \if{html}{\out{
}}\preformatted{ [,1] [,2] [1,] -2 -3 [2,] 1 -1 }\if{html}{\out{
}} Which would cause dataset 2 and 3 to be integrated first, then the resulting object integrated with dataset 1. If NULL, the sample tree will be computed automatically.} \item{preserve.order}{Do not reorder objects based on size for each pairwise integration.} \item{verbose}{Print progress} \item{...}{Arguments passed on to \code{FindIntegrationAnchors}} } \description{ Seurat-RPCA Integration } \examples{ \dontrun{ # Preprocessing obj <- SeuratData::LoadData("pbmcsca") obj[["RNA"]] <- split(obj[["RNA"]], f = obj$Method) obj <- NormalizeData(obj) obj <- FindVariableFeatures(obj) obj <- ScaleData(obj) obj <- RunPCA(obj) # After preprocessing, we run integration obj <- IntegrateLayers(object = obj, method = RPCAIntegration, orig.reduction = "pca", new.reduction = 'integrated.rpca', verbose = FALSE) # Reference-based Integration # Here, we use the first layer as a reference for integraion # Thus, we only identify anchors between the reference and the rest of the datasets, # saving computational resources obj <- IntegrateLayers(object = obj, method = RPCAIntegration, orig.reduction = "pca", new.reduction = 'integrated.rpca', reference = 1, verbose = FALSE) # Modifying parameters # We can also specify parameters such as `k.anchor` to increase the strength of # integration obj <- IntegrateLayers(object = obj, method = RPCAIntegration, orig.reduction = "pca", new.reduction = 'integrated.rpca', k.anchor = 20, verbose = FALSE) # Integrating SCTransformed data obj <- SCTransform(object = obj) obj <- IntegrateLayers(object = obj, method = RPCAIntegration, orig.reduction = "pca", new.reduction = 'integrated.rpca', assay = "SCT", verbose = FALSE) } } \concept{utilities} Seurat/man/CellScatter.Rd0000644000176200001440000000245715056057544015007 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{CellScatter} \alias{CellScatter} \alias{CellPlot} \title{Cell-cell scatter plot} \usage{ CellScatter( object, cell1, cell2, features = NULL, highlight = NULL, cols = NULL, pt.size = 1, smooth = FALSE, raster = NULL, raster.dpi = c(512, 512) ) } \arguments{ \item{object}{Seurat object} \item{cell1}{Cell 1 name} \item{cell2}{Cell 2 name} \item{features}{Features to plot (default, all features)} \item{highlight}{Features to highlight} \item{cols}{Colors to use for identity class plotting.} \item{pt.size}{Size of the points on the plot} \item{smooth}{Smooth the graph (similar to smoothScatter)} \item{raster}{Convert points to raster format, default is \code{NULL} which will automatically use raster if the number of points plotted is greater than 100,000} \item{raster.dpi}{Pixel resolution for rasterized plots, passed to geom_scattermore(). Default is c(512, 512).} } \value{ A ggplot object } \description{ Creates a plot of scatter plot of features across two single cells. Pearson correlation between the two cells is displayed above the plot. } \examples{ data("pbmc_small") CellScatter(object = pbmc_small, cell1 = 'ATAGGAGAAACAGA', cell2 = 'CATCAGGATGCACA') } \concept{visualization} Seurat/man/VST.Rd0000644000176200001440000000336415056057544013254 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/preprocessing5.R \name{VST} \alias{VST} \alias{VST.default} \alias{VST.IterableMatrix} \alias{VST.dgCMatrix} \alias{VST.matrix} \title{Variance Stabilizing Transformation} \usage{ VST(data, margin = 1L, nselect = 2000L, span = 0.3, clip = NULL, ...) \method{VST}{default}(data, margin = 1L, nselect = 2000L, span = 0.3, clip = NULL, ...) \method{VST}{IterableMatrix}( data, margin = 1L, nselect = 2000L, span = 0.3, clip = NULL, verbose = TRUE, ... ) \method{VST}{dgCMatrix}( data, margin = 1L, nselect = 2000L, span = 0.3, clip = NULL, verbose = TRUE, ... ) \method{VST}{matrix}(data, margin = 1L, nselect = 2000L, span = 0.3, clip = NULL, ...) } \arguments{ \item{data}{A matrix-like object} \item{margin}{Unused} \item{nselect}{Number of of features to select} \item{span}{the parameter \eqn{\alpha} which controls the degree of smoothing.} \item{clip}{Upper bound for values post-standardization; defaults to the square root of the number of cells} \item{...}{Arguments passed to other methods} \item{verbose}{...} } \value{ A data frame with the following columns: \itemize{ \item \dQuote{\code{mean}}: ... \item \dQuote{\code{variance}}: ... \item \dQuote{\code{variance.expected}}: ... \item \dQuote{\code{variance.standardized}}: ... \item \dQuote{\code{variable}}: \code{TRUE} if the feature selected as variable, otherwise \code{FALSE} \item \dQuote{\code{rank}}: If the feature is selected as variable, then how it compares to other variable features with lower ranks as more variable; otherwise, \code{NA} } } \description{ Apply variance stabilizing transformation for selection of variable features } \keyword{internal} Seurat/man/ScaleFactors.Rd0000644000176200001440000000211715056057544015144 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/objects.R \name{ScaleFactors} \alias{ScaleFactors} \alias{scalefactors} \alias{ScaleFactors.SlideSeq} \alias{ScaleFactors.STARmap} \alias{ScaleFactors.VisiumV1} \alias{ScaleFactors.VisiumV2} \title{Get image scale factors} \usage{ ScaleFactors(object, ...) scalefactors(spot = 1, fiducial = 1, hires = 1, lowres = 1) \method{ScaleFactors}{SlideSeq}(object, ...) \method{ScaleFactors}{STARmap}(object, ...) \method{ScaleFactors}{VisiumV1}(object, ...) \method{ScaleFactors}{VisiumV2}(object, ...) } \arguments{ \item{object}{An object to get scale factors from} \item{...}{Arguments passed to other methods} \item{spot}{Spot full resolution scale factor} \item{fiducial}{Fiducial full resolution scale factor} \item{hires}{High resolutoin scale factor} \item{lowres}{Low resolution scale factor} } \value{ An object of class \code{scalefactors} } \description{ Get image scale factors } \note{ \code{scalefactors} objects can be created with \code{scalefactors()} } \concept{objects} \concept{spatial} Seurat/man/IntegrateEmbeddings.Rd0000644000176200001440000001032315056057544016475 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/integration.R \name{IntegrateEmbeddings} \alias{IntegrateEmbeddings} \alias{IntegrateEmbeddings.IntegrationAnchorSet} \alias{IntegrateEmbeddings.TransferAnchorSet} \title{Integrate low dimensional embeddings} \usage{ IntegrateEmbeddings(anchorset, ...) \method{IntegrateEmbeddings}{IntegrationAnchorSet}( anchorset, new.reduction.name = "integrated_dr", reductions = NULL, dims.to.integrate = NULL, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, verbose = TRUE, ... ) \method{IntegrateEmbeddings}{TransferAnchorSet}( anchorset, reference, query, query.assay = NULL, new.reduction.name = "integrated_dr", reductions = "pcaproject", dims.to.integrate = NULL, k.weight = 100, weight.reduction = NULL, reuse.weights.matrix = TRUE, sd.weight = 1, preserve.order = FALSE, verbose = TRUE, ... ) } \arguments{ \item{anchorset}{An AnchorSet object} \item{...}{Reserved for internal use} \item{new.reduction.name}{Name for new integrated dimensional reduction.} \item{reductions}{Name of reductions to be integrated. For a TransferAnchorSet, this should be the name of a reduction present in the anchorset object (for example, "pcaproject"). For an IntegrationAnchorSet, this should be a \code{\link[SeuratObject]{DimReduc}} object containing all cells present in the anchorset object.} \item{dims.to.integrate}{Number of dimensions to return integrated values for} \item{k.weight}{Number of neighbors to consider when weighting anchors} \item{weight.reduction}{Dimension reduction to use when calculating anchor weights. This can be one of: \itemize{ \item{A string, specifying the name of a dimension reduction present in all objects to be integrated} \item{A vector of strings, specifying the name of a dimension reduction to use for each object to be integrated} \item{A vector of \code{\link[SeuratObject]{DimReduc}} objects, specifying the object to use for each object in the integration} \item{NULL, in which case the full corrected space is used for computing anchor weights.} }} \item{sd.weight}{Controls the bandwidth of the Gaussian kernel for weighting} \item{sample.tree}{Specify the order of integration. Order of integration should be encoded in a matrix, where each row represents one of the pairwise integration steps. Negative numbers specify a dataset, positive numbers specify the integration results from a given row (the format of the merge matrix included in the \code{\link{hclust}} function output). For example: \code{matrix(c(-2, 1, -3, -1), ncol = 2)} gives: \if{html}{\out{
}}\preformatted{ [,1] [,2] [1,] -2 -3 [2,] 1 -1 }\if{html}{\out{
}} Which would cause dataset 2 and 3 to be integrated first, then the resulting object integrated with dataset 1. If NULL, the sample tree will be computed automatically.} \item{preserve.order}{Do not reorder objects based on size for each pairwise integration.} \item{verbose}{Print progress bars and output} \item{reference}{Reference object used in anchorset construction} \item{query}{Query object used in anchorset construction} \item{query.assay}{Name of the Assay to use from query} \item{reuse.weights.matrix}{Can be used in conjunction with the store.weights parameter in TransferData to reuse a precomputed weights matrix.} } \value{ When called on a TransferAnchorSet (from FindTransferAnchors), this will return the query object with the integrated embeddings stored in a new reduction. When called on an IntegrationAnchorSet (from IntegrateData), this will return a merged object with the integrated reduction stored. } \description{ Perform dataset integration using a pre-computed Anchorset of specified low dimensional representations. } \details{ The main steps of this procedure are identical to \code{\link{IntegrateData}} with one key distinction. When computing the weights matrix, the distance calculations are performed in the full space of integrated embeddings when integrating more than two datasets, as opposed to a reduced PCA space which is the default behavior in \code{\link{IntegrateData}}. } \concept{integration} Seurat/man/DoHeatmap.Rd0000644000176200001440000000474015056057544014441 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{DoHeatmap} \alias{DoHeatmap} \title{Feature expression heatmap} \usage{ DoHeatmap( object, features = NULL, cells = NULL, group.by = "ident", group.bar = TRUE, group.colors = NULL, disp.min = -2.5, disp.max = NULL, slot = "scale.data", assay = NULL, label = TRUE, size = 5.5, hjust = 0, vjust = 0, angle = 45, raster = TRUE, draw.lines = TRUE, lines.width = NULL, group.bar.height = 0.02, combine = TRUE ) } \arguments{ \item{object}{Seurat object} \item{features}{A vector of features to plot, defaults to \code{VariableFeatures(object = object)}} \item{cells}{A vector of cells to plot} \item{group.by}{A vector of variables to group cells by; pass 'ident' to group by cell identity classes} \item{group.bar}{Add a color bar showing group status for cells} \item{group.colors}{Colors to use for the color bar} \item{disp.min}{Minimum display value (all values below are clipped)} \item{disp.max}{Maximum display value (all values above are clipped); defaults to 2.5 if \code{slot} is 'scale.data', 6 otherwise} \item{slot}{Data slot to use, choose from 'raw.data', 'data', or 'scale.data'} \item{assay}{Assay to pull from} \item{label}{Label the cell identies above the color bar} \item{size}{Size of text above color bar} \item{hjust}{Horizontal justification of text above color bar} \item{vjust}{Vertical justification of text above color bar} \item{angle}{Angle of text above color bar} \item{raster}{If true, plot with geom_raster, else use geom_tile. geom_raster may look blurry on some viewing applications such as Preview due to how the raster is interpolated. Set this to FALSE if you are encountering that issue (note that plots may take longer to produce/render).} \item{draw.lines}{Include white lines to separate the groups} \item{lines.width}{Integer number to adjust the width of the separating white lines. Corresponds to the number of "cells" between each group.} \item{group.bar.height}{Scale the height of the color bar} \item{combine}{Combine plots into a single \code{\link[patchwork]{patchwork}ed} ggplot object. If \code{FALSE}, return a list of ggplot objects} } \value{ A \code{\link[patchwork]{patchwork}ed} ggplot object if \code{combine = TRUE}; otherwise, a list of ggplot objects } \description{ Draws a heatmap of single cell feature expression. } \examples{ data("pbmc_small") DoHeatmap(object = pbmc_small) } \concept{visualization} Seurat/man/as.CellDataSet.Rd0000644000176200001440000000116015056057544015317 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/objects.R \name{as.CellDataSet} \alias{as.CellDataSet} \alias{as.CellDataSet.Seurat} \title{Convert objects to CellDataSet objects} \usage{ as.CellDataSet(x, ...) \method{as.CellDataSet}{Seurat}(x, assay = NULL, reduction = NULL, ...) } \arguments{ \item{x}{An object to convert to class \code{CellDataSet}} \item{...}{Arguments passed to other methods} \item{assay}{Assay to convert} \item{reduction}{Name of DimReduc to set to main reducedDim in cds} } \description{ Convert objects to CellDataSet objects } \concept{objects} Seurat/man/GetIntegrationData.Rd0000644000176200001440000000100015056057544016276 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{GetIntegrationData} \alias{GetIntegrationData} \title{Get integration data} \usage{ GetIntegrationData(object, integration.name, slot) } \arguments{ \item{object}{Seurat object} \item{integration.name}{Name of integration object} \item{slot}{Which slot in integration object to get} } \value{ Returns data from the requested slot within the integrated object } \description{ Get integration data } \concept{objects} Seurat/man/MetaFeature.Rd0000644000176200001440000000176015056057544015000 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{MetaFeature} \alias{MetaFeature} \title{Aggregate expression of multiple features into a single feature} \usage{ MetaFeature( object, features, meta.name = "metafeature", cells = NULL, assay = NULL, slot = "data" ) } \arguments{ \item{object}{A Seurat object} \item{features}{List of features to aggregate} \item{meta.name}{Name of column in metadata to store metafeature} \item{cells}{List of cells to use (default all cells)} \item{assay}{Which assay to use} \item{slot}{Which slot to take data from (default data)} } \value{ Returns a \code{Seurat} object with metafeature stored in objct metadata } \description{ Calculates relative contribution of each feature to each cell for given set of features. } \examples{ data("pbmc_small") pbmc_small <- MetaFeature( object = pbmc_small, features = c("LTB", "EAF2"), meta.name = 'var.aggregate' ) head(pbmc_small[[]]) } \concept{utilities} Seurat/man/subset.AnchorSet.Rd0000644000176200001440000000265715056057544015776 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{subset.AnchorSet} \alias{subset.AnchorSet} \title{Subset an AnchorSet object} \usage{ \method{subset}{AnchorSet}( x, score.threshold = NULL, disallowed.dataset.pairs = NULL, dataset.matrix = NULL, group.by = NULL, disallowed.ident.pairs = NULL, ident.matrix = NULL, ... ) } \arguments{ \item{x}{object to be subsetted.} \item{score.threshold}{Only anchor pairs with scores greater than this value are retained.} \item{disallowed.dataset.pairs}{Remove any anchors formed between the provided pairs. E.g. \code{list(c(1, 5), c(1, 2))} filters out any anchors between datasets 1 and 5 and datasets 1 and 2.} \item{dataset.matrix}{Provide a binary matrix specifying whether a dataset pair is allowable (1) or not (0). Should be a dataset x dataset matrix.} \item{group.by}{Grouping variable to determine allowable ident pairs} \item{disallowed.ident.pairs}{Remove any anchors formed between provided ident pairs. E.g. \code{list(c("CD4", "CD8"), c("B-cell", "T-cell"))}} \item{ident.matrix}{Provide a binary matrix specifying whether an ident pair is allowable (1) or not (0). Should be an ident x ident symmetric matrix} \item{...}{further arguments to be passed to or from other methods.} } \value{ Returns an \code{\link{AnchorSet}} object with specified anchors filtered out } \description{ Subset an AnchorSet object } \concept{objects} Seurat/man/CustomDistance.Rd0000644000176200001440000000147215117056271015515 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{CustomDistance} \alias{CustomDistance} \title{Run a custom distance function on an input data matrix} \usage{ CustomDistance(my.mat, my.function, ...) } \arguments{ \item{my.mat}{A matrix to calculate distance on} \item{my.function}{A function to calculate distance} \item{...}{Extra parameters to my.function} } \value{ A distance matrix } \description{ Run a custom distance function on an input data matrix } \examples{ data("pbmc_small") # Define custom distance matrix manhattan.distance <- function(x, y) return(sum(abs(x-y))) input.data <- GetAssayData(pbmc_small, assay.type = "RNA", layer = "scale.data") cell.manhattan.dist <- CustomDistance(input.data, manhattan.distance) } \author{ Jean Fan } \concept{utilities} Seurat/man/PlotPerturbScore.Rd0000644000176200001440000000272715056057544016060 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mixscape.R \name{PlotPerturbScore} \alias{PlotPerturbScore} \title{Function to plot perturbation score distributions.} \usage{ PlotPerturbScore( object, target.gene.class = "gene", target.gene.ident = NULL, mixscape.class = "mixscape_class", col = "orange2", split.by = NULL, before.mixscape = FALSE, prtb.type = "KO" ) } \arguments{ \item{object}{An object of class Seurat.} \item{target.gene.class}{meta data column specifying all target gene names in the experiment.} \item{target.gene.ident}{Target gene name to visualize perturbation scores for.} \item{mixscape.class}{meta data column specifying mixscape classifications.} \item{col}{Specify color of target gene class or knockout cell class. For control non-targeting and non-perturbed cells, colors are set to different shades of grey.} \item{split.by}{For datasets with more than one cell type. Set equal TRUE to visualize perturbation scores for each cell type separately.} \item{before.mixscape}{Option to split densities based on mixscape classification (default) or original target gene classification. Default is set to NULL and plots cells by original class ID.} \item{prtb.type}{specify type of CRISPR perturbation expected for labeling mixscape classifications. Default is KO.} } \value{ A ggplot object. } \description{ Density plots to visualize perturbation scores calculated from RunMixscape function. } \concept{mixscape} Seurat/man/LinkedPlots.Rd0000644000176200001440000000400015056057544015014 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{LinkedPlots} \alias{LinkedPlots} \alias{LinkedDimPlot} \alias{LinkedPlot} \alias{LinkedFeaturePlot} \title{Visualize spatial and clustering (dimensional reduction) data in a linked, interactive framework} \usage{ LinkedDimPlot( object, dims = 1:2, reduction = NULL, image = NULL, image.scale = "lowres", group.by = NULL, alpha = c(0.1, 1), combine = TRUE ) LinkedFeaturePlot( object, feature, dims = 1:2, reduction = NULL, image = NULL, image.scale = "lowres", slot = "data", alpha = c(0.1, 1), combine = TRUE ) } \arguments{ \item{object}{A Seurat object} \item{dims}{Dimensions to plot, must be a two-length numeric vector specifying x- and y-dimensions} \item{reduction}{Which dimensionality reduction to use. If not specified, first searches for umap, then tsne, then pca} \item{image}{Name of the image to use in the plot} \item{image.scale}{Choose the scale factor ("lowres"/"hires") to apply in order to matchthe plot with the specified `image` - defaults to "lowres"} \item{group.by}{Name of meta.data column to group the data by} \item{alpha}{Controls opacity of spots. Provide as a vector specifying the min and max for SpatialFeaturePlot. For SpatialDimPlot, provide a single alpha value for each plot.} \item{combine}{Combine plots into a single gg object; note that if TRUE; themeing will not work when plotting multiple features/groupings} \item{feature}{Feature to visualize} \item{slot}{If plotting a feature, which data slot to pull from (counts, data, or scale.data)} } \value{ Returns final plots. If \code{combine}, plots are stiched together using \code{\link{CombinePlots}}; otherwise, returns a list of ggplot objects } \description{ Visualize spatial and clustering (dimensional reduction) data in a linked, interactive framework } \examples{ \dontrun{ LinkedDimPlot(seurat.object) LinkedFeaturePlot(seurat.object, feature = 'Hpca') } } \concept{spatial} \concept{visualization} Seurat/man/PercentageFeatureSet.Rd0000644000176200001440000000322515056057544016641 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{PercentageFeatureSet} \alias{PercentageFeatureSet} \title{Calculate the percentage of all counts that belong to a given set of features} \usage{ PercentageFeatureSet( object, pattern = NULL, features = NULL, col.name = NULL, assay = NULL ) } \arguments{ \item{object}{A Seurat object} \item{pattern}{A regex pattern to match features against} \item{features}{A defined feature set. If features provided, will ignore the pattern matching} \item{col.name}{Name in meta.data column to assign. If this is not null, returns a Seurat object with the proportion of the feature set stored in metadata.} \item{assay}{Assay to use} } \value{ Returns a vector with the proportion of the feature set or if md.name is set, returns a Seurat object with the proportion of the feature set stored in metadata. } \description{ This function enables you to easily calculate the percentage of all the counts belonging to a subset of the possible features for each cell. This is useful when trying to compute the percentage of transcripts that map to mitochondrial genes for example. The calculation here is simply the column sum of the matrix present in the counts slot for features belonging to the set divided by the column sum for all features times 100. } \examples{ data("pbmc_small") # Calculate the proportion of transcripts mapping to mitochondrial genes # NOTE: The pattern provided works for human gene names. You may need to adjust depending on your # system of interest pbmc_small[["percent.mt"]] <- PercentageFeatureSet(object = pbmc_small, pattern = "^MT-") } \concept{utilities} Seurat/man/CalcPerturbSig.Rd0000644000176200001440000000361115056057544015444 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mixscape.R \name{CalcPerturbSig} \alias{CalcPerturbSig} \title{Calculate a perturbation Signature} \usage{ CalcPerturbSig( object, assay = NULL, features = NULL, slot = "data", gd.class = "guide_ID", nt.cell.class = "NT", split.by = NULL, num.neighbors = NULL, reduction = "pca", ndims = 15, new.assay.name = "PRTB", verbose = TRUE ) } \arguments{ \item{object}{An object of class Seurat.} \item{assay}{Name of Assay PRTB signature is being calculated on.} \item{features}{Features to compute PRTB signature for. Defaults to the variable features set in the assay specified.} \item{slot}{Data slot to use for PRTB signature calculation.} \item{gd.class}{Metadata column containing target gene classification.} \item{nt.cell.class}{Non-targeting gRNA cell classification identity.} \item{split.by}{Provide metadata column if multiple biological replicates exist to calculate PRTB signature for every replicate separately.} \item{num.neighbors}{Number of nearest neighbors to consider.} \item{reduction}{Reduction method used to calculate nearest neighbors.} \item{ndims}{Number of dimensions to use from dimensionality reduction method.} \item{new.assay.name}{Name for the new assay.} \item{verbose}{Display progress + messages} } \value{ Returns a Seurat object with a new assay added containing the perturbation signature for all cells in the data slot. } \description{ Function to calculate perturbation signature for pooled CRISPR screen datasets. For each target cell (expressing one target gRNA), we identified 20 cells from the control pool (non-targeting cells) with the most similar mRNA expression profiles. The perturbation signature is calculated by subtracting the averaged mRNA expression profile of the non-targeting neighbors from the mRNA expression profile of the target cell. } \concept{mixscape} Seurat/man/AddAzimuthResults.Rd0000644000176200001440000000126615056057544016213 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{AddAzimuthResults} \alias{AddAzimuthResults} \title{Add Azimuth Results} \usage{ AddAzimuthResults(object = NULL, filename) } \arguments{ \item{object}{A \code{\link[SeuratObject]{Seurat}} object} \item{filename}{Path to Azimuth mapping scores file} } \value{ \code{object} with Azimuth results added } \description{ Add mapping and prediction scores, UMAP embeddings, and imputed assay (if available) from Azimuth to an existing or new \code{\link[SeuratObject]{Seurat}} object } \examples{ \dontrun{ object <- AddAzimuthResults(object, filename = "azimuth_results.Rds") } } \concept{utilities} Seurat/man/Seurat-class.Rd0000644000176200001440000000066415056057544015146 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reexports.R \docType{class} \name{Seurat-class} \alias{Seurat-class} \title{The Seurat Class} \description{ The Seurat object is a representation of single-cell expression data for R; for more details, please see the documentation in \code{\link[SeuratObject:Seurat]{SeuratObject}} } \seealso{ \code{\link[SeuratObject:Seurat]{SeuratObject::Seurat-class}} } Seurat/man/RunPCA.Rd0000644000176200001440000000510215056057544013660 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/dimensional_reduction.R \name{RunPCA} \alias{RunPCA} \alias{RunPCA.default} \alias{RunPCA.Assay} \alias{RunPCA.Seurat} \title{Run Principal Component Analysis} \usage{ RunPCA(object, ...) \method{RunPCA}{default}( object, assay = NULL, npcs = 50, rev.pca = FALSE, weight.by.var = TRUE, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "PC_", seed.use = 42, approx = TRUE, ... ) \method{RunPCA}{Assay}( object, assay = NULL, features = NULL, npcs = 50, rev.pca = FALSE, weight.by.var = TRUE, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "PC_", seed.use = 42, ... ) \method{RunPCA}{Seurat}( object, assay = NULL, features = NULL, npcs = 50, rev.pca = FALSE, weight.by.var = TRUE, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.name = "pca", reduction.key = "PC_", seed.use = 42, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods and IRLBA} \item{assay}{Name of Assay PCA is being run on} \item{npcs}{Total Number of PCs to compute and store (50 by default)} \item{rev.pca}{By default computes the PCA on the cell x gene matrix. Setting to true will compute it on gene x cell matrix.} \item{weight.by.var}{Weight the cell embeddings by the variance of each PC (weights the gene loadings if rev.pca is TRUE)} \item{verbose}{Print the top genes associated with high/low loadings for the PCs} \item{ndims.print}{PCs to print genes for} \item{nfeatures.print}{Number of genes to print for each PC} \item{reduction.key}{dimensional reduction key, specifies the string before the number for the dimension names. PC by default} \item{seed.use}{Set a random seed. By default, sets the seed to 42. Setting NULL will not set a seed.} \item{approx}{Use truncated singular value decomposition to approximate PCA} \item{features}{Features to compute PCA on. If features=NULL, PCA will be run using the variable features for the Assay. Note that the features must be present in the scaled data. Any requested features that are not scaled or have 0 variance will be dropped, and the PCA will be run using the remaining features.} \item{reduction.name}{dimensional reduction name, pca by default} } \value{ Returns Seurat object with the PCA calculation stored in the reductions slot } \description{ Run a PCA dimensionality reduction. For details about stored PCA calculation parameters, see \code{PrintPCAParams}. } \concept{dimensional_reduction} Seurat/man/AnchorSet-class.Rd0000644000176200001440000000276315056057544015573 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{AnchorSet-class} \alias{AnchorSet-class} \alias{AnchorSet} \title{The AnchorSet Class} \description{ The AnchorSet class is an intermediate data storage class that stores the anchors and other related information needed for performing downstream analyses - namely data integration (\code{\link{IntegrateData}}) and data transfer (\code{\link{TransferData}}). } \section{Slots}{ \describe{ \item{\code{object.list}}{List of objects used to create anchors} \item{\code{reference.cells}}{List of cell names in the reference dataset - needed when performing data transfer.} \item{\code{reference.objects}}{Position of reference object/s in object.list} \item{\code{query.cells}}{List of cell names in the query dataset - needed when performing data transfer} \item{\code{anchors}}{The anchor matrix. This contains the cell indices of both anchor pair cells, the anchor score, and the index of the original dataset in the object.list for cell1 and cell2 of the anchor.} \item{\code{offsets}}{The offsets used to enable cell look up in downstream functions} \item{\code{weight.reduction}}{The weight dimensional reduction used to calculate weight matrix} \item{\code{anchor.features}}{The features used when performing anchor finding.} \item{\code{neighbors}}{List containing Neighbor objects for reuse later (e.g. mapping)} \item{\code{command}}{Store log of parameters that were used} }} \concept{objects} Seurat/man/PolyFeaturePlot.Rd0000644000176200001440000000263715056057544015700 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{PolyFeaturePlot} \alias{PolyFeaturePlot} \title{Polygon FeaturePlot} \usage{ PolyFeaturePlot( object, features, cells = NULL, poly.data = "spatial", ncol = ceiling(x = length(x = features)/2), min.cutoff = 0, max.cutoff = NA, common.scale = TRUE, flip.coords = FALSE ) } \arguments{ \item{object}{Seurat object} \item{features}{Vector of features to plot. Features can come from: \itemize{ \item An \code{Assay} feature (e.g. a gene name - "MS4A1") \item A column name from meta.data (e.g. mitochondrial percentage - "percent.mito") \item A column name from a \code{DimReduc} object corresponding to the cell embedding values (e.g. the PC 1 scores - "PC_1") }} \item{cells}{Vector of cells to plot (default is all cells)} \item{poly.data}{Name of the polygon dataframe in the misc slot} \item{ncol}{Number of columns to split the plot into} \item{min.cutoff, max.cutoff}{Vector of minimum and maximum cutoff values for each feature, may specify quantile in the form of 'q##' where '##' is the quantile (eg, 'q1', 'q10')} \item{common.scale}{...} \item{flip.coords}{Flip x and y coordinates} } \value{ Returns a ggplot object } \description{ Plot cells as polygons, rather than single points. Color cells by any value accessible by \code{\link{FetchData}}. } \concept{spatial} \concept{visualization} Seurat/man/DimReduc-class.Rd0000644000176200001440000000070615056057544015374 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reexports.R \docType{class} \name{DimReduc-class} \alias{DimReduc-class} \title{The DimReduc Class} \description{ The \code{DimReduc} object stores a dimensionality reduction taken out in Seurat; for more details, please see the documentation in \code{\link[SeuratObject:DimReduc]{SeuratObject}} } \seealso{ \code{\link[SeuratObject:DimReduc]{SeuratObject::DimReduc-class}} } Seurat/man/ExpSD.Rd0000644000176200001440000000066715056057544013566 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{ExpSD} \alias{ExpSD} \title{Calculate the standard deviation of logged values} \usage{ ExpSD(x) } \arguments{ \item{x}{A vector of values} } \value{ Returns the standard deviation in log-space } \description{ Calculate SD of logged values in non-log space (return answer in log-space) } \examples{ ExpSD(x = c(1, 2, 3)) } \concept{utilities} Seurat/man/cc.genes.updated.2019.Rd0000644000176200001440000000235215117326655016300 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/data.R \docType{data} \name{cc.genes.updated.2019} \alias{cc.genes.updated.2019} \title{Cell cycle genes: 2019 update} \format{ A list of two vectors \describe{ \item{s.genes}{Genes associated with S-phase} \item{g2m.genes}{Genes associated with G2M-phase} } } \source{ `https://doi.org/10.1126/science.aad0501` } \usage{ cc.genes.updated.2019 } \description{ A list of genes used in cell-cycle regression, updated with 2019 symbols } \section{Updated symbols}{ The following symbols were updated from \code{\link{cc.genes}} \describe{ \item{s.genes}{ \itemize{ \item \emph{MCM2}: \emph{MCM7} \item \emph{MLF1IP}: \emph{CENPU} \item \emph{RPA2}: \emph{POLR1B} \item \emph{BRIP1}: \emph{MRPL36} } } \item{g2m.genes}{ \itemize{ \item \emph{FAM64A}: \emph{PIMREG} \item \emph{HN1}: \emph{JPT1} } } } } \examples{ \dontrun{ cc.genes.updated.2019 <- cc.genes cc.genes.updated.2019$s.genes <- UpdateSymbolList(symbols = cc.genes.updated.2019$s.genes) cc.genes.updated.2019$g2m.genes <- UpdateSymbolList(symbols = cc.genes.updated.2019$g2m.genes) } } \seealso{ \code{\link{cc.genes}} } \concept{data} \keyword{datasets} Seurat/man/DimPlot.Rd0000644000176200001440000001202015070750476014135 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R, R/convenience.R \name{DimPlot} \alias{DimPlot} \alias{TSNEPlot} \alias{PCAPlot} \alias{ICAPlot} \alias{UMAPPlot} \title{Dimensional reduction plot} \usage{ DimPlot( object, dims = c(1, 2), cells = NULL, cols = NULL, pt.size = NULL, reduction = NULL, group.by = NULL, split.by = NULL, shape.by = NULL, order = NULL, shuffle = FALSE, seed = 1, label = FALSE, label.size = 4, label.color = "black", label.box = FALSE, repel = FALSE, alpha = 1, stroke.size = NULL, cells.highlight = NULL, cols.highlight = "#DE2D26", sizes.highlight = 1, na.value = "grey50", ncol = NULL, combine = TRUE, raster = NULL, raster.dpi = c(512, 512), label.size.cutoff = 0 ) PCAPlot(object, ...) TSNEPlot(object, ...) UMAPPlot(object, ...) } \arguments{ \item{object}{Seurat object} \item{dims}{Dimensions to plot, must be a two-length numeric vector specifying x- and y-dimensions} \item{cells}{Vector of cells to plot (default is all cells)} \item{cols}{Vector of colors, each color corresponds to an identity class. This may also be a single character or numeric value corresponding to a palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}. By default, ggplot2 assigns colors. We also include a number of palettes from the pals package. See \code{\link{DiscretePalette}} for details.} \item{pt.size}{Adjust point size for plotting} \item{reduction}{Which dimensionality reduction to use. If not specified, first searches for umap, then tsne, then pca} \item{group.by}{Name of one or more metadata columns to group (color) cells by (for example, orig.ident); pass 'ident' to group by identity class} \item{split.by}{A factor in object metadata to split the plot by, pass 'ident' to split by cell identity} \item{shape.by}{If NULL, all points are circles (default). You can specify any cell attribute (that can be pulled with FetchData) allowing for both different colors and different shapes on cells. Only applicable if \code{raster = FALSE}.} \item{order}{Specify the order of plotting for the idents. This can be useful for crowded plots if points of interest are being buried. Provide either a full list of valid idents or a subset to be plotted last (on top)} \item{shuffle}{Whether to randomly shuffle the order of points. This can be useful for crowded plots if points of interest are being buried. (default is FALSE)} \item{seed}{Sets the seed if randomly shuffling the order of points.} \item{label}{Whether to label the clusters} \item{label.size}{Sets size of labels} \item{label.color}{Sets the color of the label text} \item{label.box}{Whether to put a box around the label text (geom_text vs geom_label)} \item{repel}{Repel labels} \item{alpha}{Alpha value for plotting (default is 1)} \item{stroke.size}{Adjust stroke (outline) size of points} \item{cells.highlight}{A list of character or numeric vectors of cells to highlight. If only one group of cells desired, can simply pass a vector instead of a list. If set, colors selected cells to the color(s) in \code{cols.highlight} and other cells black (white if dark.theme = TRUE); will also resize to the size(s) passed to \code{sizes.highlight}} \item{cols.highlight}{A vector of colors to highlight the cells as; will repeat to the length groups in cells.highlight} \item{sizes.highlight}{Size of highlighted cells; will repeat to the length groups in cells.highlight. If \code{sizes.highlight = TRUE} size of all points will be this value.} \item{na.value}{Color value for NA points when using custom scale} \item{ncol}{Number of columns for display when combining plots} \item{combine}{Combine plots into a single \code{\link[patchwork]{patchwork}ed} ggplot object. If \code{FALSE}, return a list of ggplot objects} \item{raster}{Convert points to raster format, default is \code{NULL} which automatically rasterizes if plotting more than 100,000 cells} \item{raster.dpi}{Pixel resolution for rasterized plots, passed to geom_scattermore(). Default is c(512, 512).} \item{label.size.cutoff}{Clusters with fewer cells than the cutoff are not labeled (replaced with ' ' label)} \item{...}{Extra parameters passed to \code{DimPlot}} } \value{ A \code{\link[patchwork]{patchwork}ed} ggplot object if \code{combine = TRUE}; otherwise, a list of ggplot objects } \description{ Graphs the output of a dimensional reduction technique on a 2D scatter plot where each point is a cell and it's positioned based on the cell embeddings determined by the reduction technique. By default, cells are colored by their identity class (can be changed with the group.by parameter). } \note{ For the old \code{do.hover} and \code{do.identify} functionality, please see \code{HoverLocator} and \code{CellSelector}, respectively. } \examples{ data("pbmc_small") DimPlot(object = pbmc_small) DimPlot(object = pbmc_small, split.by = 'letter.idents') } \seealso{ \code{\link{FeaturePlot}} \code{\link{HoverLocator}} \code{\link{CellSelector}} \code{\link{FetchData}} } \concept{convenience} \concept{visualization} Seurat/man/ReadVizgen.Rd0000644000176200001440000001206015117326655014627 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R, R/convenience.R \name{ReadVizgen} \alias{ReadVizgen} \alias{LoadVizgen} \title{Read and Load MERFISH Input from Vizgen} \usage{ ReadVizgen( data.dir, transcripts = NULL, spatial = NULL, molecules = NULL, type = "segmentations", mol.type = "microns", metadata = NULL, filter = NA_character_, z = 3L ) LoadVizgen(data.dir, fov, assay = "Vizgen", z = 3L) } \arguments{ \item{data.dir}{Path to the directory with Vizgen MERFISH files; requires at least one of the following files present: \itemize{ \item \dQuote{\code{cell_by_gene.csv}}: used for reading count matrix \item \dQuote{\code{cell_metadata.csv}}: used for reading cell spatial coordinate matrices \item \dQuote{\code{detected_transcripts.csv}}: used for reading molecule spatial coordinate matrices }} \item{transcripts}{Optional file path for counts matrix; pass \code{NA} to suppress reading counts matrix} \item{spatial}{Optional file path for spatial metadata; pass \code{NA} to suppress reading spatial coordinates. If \code{spatial} is provided and \code{type} is \dQuote{segmentations}, uses \code{dirname(spatial)} instead of \code{data.dir} to find HDF5 files} \item{molecules}{Optional file path for molecule coordinates file; pass \code{NA} to suppress reading spatial molecule information} \item{type}{Type of cell spatial coordinate matrices to read; choose one or more of: \itemize{ \item \dQuote{segmentations}: cell segmentation vertices; requires \href{https://cran.r-project.org/package=hdf5r}{\pkg{hdf5r}} to be installed and requires a directory \dQuote{\code{cell_boundaries}} within \code{data.dir}. Within \dQuote{\code{cell_boundaries}}, there must be one or more HDF5 file named \dQuote{\code{feature_data_##.hdf5}} \item \dQuote{centroids}: cell centroids in micron coordinate space \item \dQuote{boxes}: cell box outlines in micron coordinate space }} \item{mol.type}{Type of molecule spatial coordinate matrices to read; choose one or more of: \itemize{ \item \dQuote{pixels}: molecule coordinates in pixel space \item \dQuote{microns}: molecule coordinates in micron space }} \item{metadata}{Type of available metadata to read; choose zero or more of: \itemize{ \item \dQuote{volume}: estimated cell volume \item \dQuote{fov}: cell's fov }} \item{filter}{A character to filter molecules by, pass \code{NA} to skip molecule filtering} \item{z}{Z-index to load; must be between 0 and 6, inclusive} \item{fov}{Name to store FOV as} \item{assay}{Name to store expression matrix as} } \value{ \code{ReadVizgen}: A list with some combination of the following values: \itemize{ \item \dQuote{\code{transcripts}}: a \link[Matrix:dgCMatrix-class]{sparse matrix} with expression data; cells are columns and features are rows \item \dQuote{\code{segmentations}}: a data frame with cell polygon outlines in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} \item \dQuote{\code{centroids}}: a data frame with cell centroid coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} \item \dQuote{\code{boxes}}: a data frame with cell box outlines in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} \item \dQuote{\code{microns}}: a data frame with molecule micron coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{gene} \item \dQuote{\code{pixels}}: a data frame with molecule pixel coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{gene} \item \dQuote{\code{metadata}}: a data frame with the cell-level metadata requested by \code{metadata} } \code{LoadVizgen}: A \code{\link[SeuratObject]{Seurat}} object } \description{ Read and load in MERFISH data from Vizgen-formatted files } \note{ This function requires the \href{https://cran.r-project.org/package=data.table}{\pkg{data.table}} package to be installed } \section{Progress Updates with \pkg{progressr}}{ This function uses \href{https://cran.r-project.org/package=progressr}{\pkg{progressr}} to render status updates and progress bars. To enable progress updates, wrap the function call in \code{\link[progressr]{with_progress}} or run \code{\link[progressr:handlers]{handlers(global = TRUE)}} before running this function. For more details about \pkg{progressr}, please read \href{https://progressr.futureverse.org/articles/progressr-01-intro.html}{\code{vignette("progressr-intro")}} } \section{Parallelization with \pkg{future}}{ This function uses \href{https://cran.r-project.org/package=future}{\pkg{future}} to enable parallelization. Parallelization strategies can be set using \code{\link[future]{plan}}. Common plans include \dQuote{\code{sequential}} for non-parallelized processing or \dQuote{\code{multisession}} for parallel evaluation using multiple \R sessions; for other plans, see the \dQuote{Implemented evaluation strategies} section of \code{\link[future:plan]{?future::plan}}. For a more thorough introduction to \pkg{future}, see \href{https://future.futureverse.org/articles/future-1-overview.html}{\code{vignette("future-1-overview")}} } \concept{future} \concept{preprocessing} Seurat/man/GroupCorrelationPlot.Rd0000644000176200001440000000152215056057544016727 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{GroupCorrelationPlot} \alias{GroupCorrelationPlot} \title{Boxplot of correlation of a variable (e.g. number of UMIs) with expression data} \usage{ GroupCorrelationPlot( object, assay = NULL, feature.group = "feature.grp", cor = "nCount_RNA_cor" ) } \arguments{ \item{object}{Seurat object} \item{assay}{Assay where the feature grouping info and correlations are stored} \item{feature.group}{Name of the column in meta.features where the feature grouping info is stored} \item{cor}{Name of the column in meta.features where correlation info is stored} } \value{ Returns a ggplot boxplot of correlations split by group } \description{ Boxplot of correlation of a variable (e.g. number of UMIs) with expression data } \concept{visualization} Seurat/man/Read10X_Segmentations.Rd0000644000176200001440000000223615117056271016633 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{Read10X_Segmentations} \alias{Read10X_Segmentations} \title{Load 10X Genomics Visium Cell Segmentations} \usage{ Read10X_Segmentations( image.dir, data.dir, image.name = "tissue_lowres_image.png", assay = "Spatial.Polygons", slice = "slice1.polygons", segmentation.type = "cell", compact = TRUE ) } \arguments{ \item{image.dir}{Path to directory with 10X Genomics visium image data;} \item{data.dir}{Directory of the base spaceranger outs} \item{image.name}{Name of the tissue image to be plotted. tissue_lowres_image.png or tissue_hires_image.png} \item{assay}{Name of assay to associate segmentations to} \item{slice}{Name of the slice to associate the segmentations to} \item{segmentation.type}{Which segmentations to load, cell or nucleus. If using nucleus the full matrix from cells is still used} \item{compact}{Whether to store segmentations in only the \code{sf.data} slot; see \code{\link{Load10X_Spatial}} for details} } \value{ A VisiumV2 object with segmentations } \description{ Load 10X Genomics Visium Cell Segmentations } \concept{preprocessing} Seurat/man/FindConservedMarkers.Rd0000644000176200001440000000376015056057544016656 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/differential_expression.R \name{FindConservedMarkers} \alias{FindConservedMarkers} \title{Finds markers that are conserved between the groups} \usage{ FindConservedMarkers( object, ident.1, ident.2 = NULL, grouping.var, assay = "RNA", slot = "data", min.cells.group = 3, meta.method = metap::minimump, verbose = TRUE, ... ) } \arguments{ \item{object}{An object} \item{ident.1}{Identity class to define markers for} \item{ident.2}{A second identity class for comparison. If NULL (default) - use all other cells for comparison.} \item{grouping.var}{grouping variable} \item{assay}{of assay to fetch data for (default is RNA)} \item{slot}{Slot to pull data from; note that if \code{test.use} is "negbinom", "poisson", or "DESeq2", \code{slot} will be set to "counts"} \item{min.cells.group}{Minimum number of cells in one of the groups} \item{meta.method}{method for combining p-values. Should be a function from the metap package (NOTE: pass the function, not a string)} \item{verbose}{Print a progress bar once expression testing begins} \item{\dots}{parameters to pass to FindMarkers} } \value{ data.frame containing a ranked list of putative conserved markers, and associated statistics (p-values within each group and a combined p-value (such as Fishers combined p-value or others from the metap package), percentage of cells expressing the marker, average differences). Name of group is appended to each associated output column (e.g. CTRL_p_val). If only one group is tested in the grouping.var, max and combined p-values are not returned. } \description{ Finds markers that are conserved between the groups } \examples{ \dontrun{ data("pbmc_small") pbmc_small # Create a simulated grouping variable pbmc_small[['groups']] <- sample(x = c('g1', 'g2'), size = ncol(x = pbmc_small), replace = TRUE) FindConservedMarkers(pbmc_small, ident.1 = 0, ident.2 = 1, grouping.var = "groups") } } \concept{differential_expression} Seurat/man/HTODemux.Rd0000644000176200001440000000405415056057544014232 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{HTODemux} \alias{HTODemux} \title{Demultiplex samples based on data from cell 'hashing'} \usage{ HTODemux( object, assay = "HTO", positive.quantile = 0.99, init = NULL, nstarts = 100, kfunc = "clara", nsamples = 100, seed = 42, verbose = TRUE ) } \arguments{ \item{object}{Seurat object. Assumes that the hash tag oligo (HTO) data has been added and normalized.} \item{assay}{Name of the Hashtag assay (HTO by default)} \item{positive.quantile}{The quantile of inferred 'negative' distribution for each hashtag - over which the cell is considered 'positive'. Default is 0.99} \item{init}{Initial number of clusters for hashtags. Default is the # of hashtag oligo names + 1 (to account for negatives)} \item{nstarts}{nstarts value for k-means clustering (for kfunc = "kmeans"). 100 by default} \item{kfunc}{Clustering function for initial hashtag grouping. Default is "clara" for fast k-medoids clustering on large applications, also support "kmeans" for kmeans clustering} \item{nsamples}{Number of samples to be drawn from the dataset used for clustering, for kfunc = "clara"} \item{seed}{Sets the random seed. If NULL, seed is not set} \item{verbose}{Prints the output} } \value{ The Seurat object with the following demultiplexed information stored in the meta data: \describe{ \item{hash.maxID}{Name of hashtag with the highest signal} \item{hash.secondID}{Name of hashtag with the second highest signal} \item{hash.margin}{The difference between signals for hash.maxID and hash.secondID} \item{classification}{Classification result, with doublets/multiplets named by the top two highest hashtags} \item{classification.global}{Global classification result (singlet, doublet or negative)} \item{hash.ID}{Classification result where doublet IDs are collapsed} } } \description{ Assign sample-of-origin for each cell, annotate doublets. } \examples{ \dontrun{ object <- HTODemux(object) } } \seealso{ \code{\link{HTOHeatmap}} } \concept{preprocessing} Seurat/man/ExpMean.Rd0000644000176200001440000000072215056057544014130 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{ExpMean} \alias{ExpMean} \title{Calculate the mean of logged values} \usage{ ExpMean(x, ...) } \arguments{ \item{x}{A vector of values} \item{...}{Other arguments (not used)} } \value{ Returns the mean in log-space } \description{ Calculate mean of logged values in non-log space (return answer in log-space) } \examples{ ExpMean(x = c(1, 2, 3)) } \concept{utilities} Seurat/man/SelectSCTIntegrationFeatures.Rd0000644000176200001440000000120615056057544020265 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{SelectSCTIntegrationFeatures} \alias{SelectSCTIntegrationFeatures} \title{Select SCT integration features} \usage{ SelectSCTIntegrationFeatures( object, nfeatures = 3000, assay = NULL, verbose = TRUE, ... ) } \arguments{ \item{object}{Seurat object} \item{nfeatures}{Number of features to return for integration} \item{assay}{Name of assay to use for integration feature selection} \item{verbose}{Print messages} \item{...}{Arguments passed on to \code{method}} } \description{ Select SCT integration features } \concept{integration} Seurat/man/CreateSCTAssayObject.Rd0000644000176200001440000000223315116120241016455 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{CreateSCTAssayObject} \alias{CreateSCTAssayObject} \title{Create a SCT Assay object} \usage{ CreateSCTAssayObject( counts, data, scale.data = NULL, umi.assay = "RNA", min.cells = 0, min.features = 0, SCTModel.list = NULL ) } \arguments{ \item{counts}{Unnormalized data such as raw counts or TPMs} \item{data}{Prenormalized data; if provided, do not pass \code{counts}} \item{scale.data}{a residual matrix} \item{umi.assay}{The UMI assay name. Default is RNA} \item{min.cells}{Include features detected in at least this many cells. Will subset the counts matrix as well. To reintroduce excluded features, create a new object with a lower cutoff} \item{min.features}{Include cells where at least this many features are detected} \item{SCTModel.list}{list of SCTModels} } \description{ Create a SCT object from a feature (e.g. gene) expression matrix and a list of SCTModels. The expected format of the input matrix is features x cells. } \details{ Non-unique cell or feature names are not allowed. Please make unique before calling this function. } \concept{objects} Seurat/man/FindVariableFeatures.Rd0000644000176200001440000001127715056057544016627 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/preprocessing.R \name{FindVariableFeatures} \alias{FindVariableFeatures} \alias{FindVariableGenes} \alias{FindVariableFeatures.V3Matrix} \alias{FindVariableFeatures.Assay} \alias{FindVariableFeatures.SCTAssay} \alias{FindVariableFeatures.Seurat} \title{Find variable features} \usage{ FindVariableFeatures(object, ...) \method{FindVariableFeatures}{V3Matrix}( object, selection.method = "vst", loess.span = 0.3, clip.max = "auto", mean.function = FastExpMean, dispersion.function = FastLogVMR, num.bin = 20, binning.method = "equal_width", verbose = TRUE, ... ) \method{FindVariableFeatures}{Assay}( object, selection.method = "vst", loess.span = 0.3, clip.max = "auto", mean.function = FastExpMean, dispersion.function = FastLogVMR, num.bin = 20, binning.method = "equal_width", nfeatures = 2000, mean.cutoff = c(0.1, 8), dispersion.cutoff = c(1, Inf), verbose = TRUE, ... ) \method{FindVariableFeatures}{SCTAssay}(object, nfeatures = 2000, ...) \method{FindVariableFeatures}{Seurat}( object, assay = NULL, selection.method = "vst", loess.span = 0.3, clip.max = "auto", mean.function = FastExpMean, dispersion.function = FastLogVMR, num.bin = 20, binning.method = "equal_width", nfeatures = 2000, mean.cutoff = c(0.1, 8), dispersion.cutoff = c(1, Inf), verbose = TRUE, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods} \item{selection.method}{How to choose top variable features. Choose one of : \itemize{ \item \dQuote{\code{vst}}: First, fits a line to the relationship of log(variance) and log(mean) using local polynomial regression (loess). Then standardizes the feature values using the observed mean and expected variance (given by the fitted line). Feature variance is then calculated on the standardized values after clipping to a maximum (see clip.max parameter). \item \dQuote{\code{mean.var.plot}} (mvp): First, uses a function to calculate average expression (mean.function) and dispersion (dispersion.function) for each feature. Next, divides features into \code{num.bin} (default 20) bins based on their average expression, and calculates z-scores for dispersion within each bin. The purpose of this is to identify variable features while controlling for the strong relationship between variability and average expression \item \dQuote{\code{dispersion}} (disp): selects the genes with the highest dispersion values }} \item{loess.span}{(vst method) Loess span parameter used when fitting the variance-mean relationship} \item{clip.max}{(vst method) After standardization values larger than clip.max will be set to clip.max; default is 'auto' which sets this value to the square root of the number of cells} \item{mean.function}{Function to compute x-axis value (average expression). Default is to take the mean of the detected (i.e. non-zero) values} \item{dispersion.function}{Function to compute y-axis value (dispersion). Default is to take the standard deviation of all values} \item{num.bin}{Total number of bins to use in the scaled analysis (default is 20)} \item{binning.method}{Specifies how the bins should be computed. Available methods are: \itemize{ \item \dQuote{\code{equal_width}}: each bin is of equal width along the x-axis (default) \item \dQuote{\code{equal_frequency}}: each bin contains an equal number of features (can increase statistical power to detect overdispersed features at high expression values, at the cost of reduced resolution along the x-axis) }} \item{verbose}{show progress bar for calculations} \item{nfeatures}{Number of features to select as top variable features; only used when \code{selection.method} is set to \code{'dispersion'} or \code{'vst'}} \item{mean.cutoff}{A two-length numeric vector with low- and high-cutoffs for feature means} \item{dispersion.cutoff}{A two-length numeric vector with low- and high-cutoffs for feature dispersions} \item{assay}{Assay to use} } \description{ Identifies features that are outliers on a 'mean variability plot'. } \details{ For the mean.var.plot method: Exact parameter settings may vary empirically from dataset to dataset, and based on visual inspection of the plot. Setting the y.cutoff parameter to 2 identifies features that are more than two standard deviations away from the average dispersion within a bin. The default X-axis function is the mean expression level, and for Y-axis it is the log(Variance/mean). All mean/variance calculations are not performed in log-space, but the results are reported in log-space - see relevant functions for exact details. } \concept{preprocessing} Seurat/man/ProjectUMAP.Rd0000644000176200001440000000611315056057544014664 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/dimensional_reduction.R \name{ProjectUMAP} \alias{ProjectUMAP} \alias{ProjectUMAP.default} \alias{ProjectUMAP.DimReduc} \alias{ProjectUMAP.Seurat} \title{Project query into UMAP coordinates of a reference} \usage{ ProjectUMAP(query, ...) \method{ProjectUMAP}{default}( query, query.dims = NULL, reference, reference.dims = NULL, k.param = 30, nn.method = "annoy", n.trees = 50, annoy.metric = "cosine", l2.norm = FALSE, cache.index = TRUE, index = NULL, neighbor.name = "query_ref.nn", reduction.model, ... ) \method{ProjectUMAP}{DimReduc}( query, query.dims = NULL, reference, reference.dims = NULL, k.param = 30, nn.method = "annoy", n.trees = 50, annoy.metric = "cosine", l2.norm = FALSE, cache.index = TRUE, index = NULL, neighbor.name = "query_ref.nn", reduction.model, ... ) \method{ProjectUMAP}{Seurat}( query, query.reduction, query.dims = NULL, reference, reference.reduction, reference.dims = NULL, k.param = 30, nn.method = "annoy", n.trees = 50, annoy.metric = "cosine", l2.norm = FALSE, cache.index = TRUE, index = NULL, neighbor.name = "query_ref.nn", reduction.model, reduction.name = "ref.umap", reduction.key = "refUMAP_", ... ) } \arguments{ \item{query}{Query dataset} \item{...}{Additional parameters to \code{\link{RunUMAP}}} \item{query.dims}{Dimensions (columns) to use from query} \item{reference}{Reference dataset} \item{reference.dims}{Dimensions (columns) to use from reference} \item{k.param}{Defines k for the k-nearest neighbor algorithm} \item{nn.method}{Method for nearest neighbor finding. Options include: rann, annoy} \item{n.trees}{More trees gives higher precision when using annoy approximate nearest neighbor search} \item{annoy.metric}{Distance metric for annoy. Options include: euclidean, cosine, manhattan, and hamming} \item{l2.norm}{Take L2Norm of the data} \item{cache.index}{Include cached index in returned Neighbor object (only relevant if return.neighbor = TRUE)} \item{index}{Precomputed index. Useful if querying new data against existing index to avoid recomputing.} \item{neighbor.name}{Name to store neighbor information in the query} \item{reduction.model}{\code{DimReduc} object that contains the umap model} \item{query.reduction}{Name of reduction to use from the query for neighbor finding} \item{reference.reduction}{Name of reduction to use from the reference for neighbor finding} \item{reduction.name}{Name of projected UMAP to store in the query} \item{reduction.key}{Value for the projected UMAP key} } \description{ This function will take a query dataset and project it into the coordinates of a provided reference UMAP. This is essentially a wrapper around two steps: \itemize{ \item{FindNeighbors - Find the nearest reference cell neighbors and their distances for each query cell.} \item{RunUMAP - Perform umap projection by providing the neighbor set calculated above and the umap model previously computed in the reference.} } } \concept{dimensional_reduction} Seurat/man/FindBridgeIntegrationAnchors.Rd0000644000176200001440000000421015056057544020306 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{FindBridgeIntegrationAnchors} \alias{FindBridgeIntegrationAnchors} \title{Find integration bridge anchors between query and extended bridge-reference} \usage{ FindBridgeIntegrationAnchors( extended.reference, query, query.assay = NULL, dims = 1:30, scale = FALSE, reduction = c("lsiproject", "pcaproject"), integration.reduction = c("direct", "cca"), verbose = TRUE ) } \arguments{ \item{extended.reference}{BridgeReferenceSet object generated from \code{\link{PrepareBridgeReference}}} \item{query}{A query Seurat object} \item{query.assay}{Assay name for query-bridge integration} \item{dims}{Number of dimensions for query-bridge integration} \item{scale}{Determine if scale the query data for projection} \item{reduction}{Dimensional reduction to perform when finding anchors. Options are: \itemize{ \item{pcaproject: Project the PCA from the bridge onto the query. We recommend using PCA when bridge and query datasets are from scRNA-seq} \item{lsiproject: Project the LSI from the bridge onto the query. We recommend using LSI when bridge and query datasets are from scATAC-seq or scCUT&TAG data. This requires that LSI or supervised LSI has been computed for the bridge dataset, and the same features (eg, peaks or genome bins) are present in both the bridge and query. } }} \item{integration.reduction}{Dimensional reduction to perform when finding anchors between query and reference. Options are: \itemize{ \item{direct: find anchors directly on the bridge representation space} \item{cca: perform cca on the on the bridge representation space and then find anchors } }} \item{verbose}{Print messages and progress} } \value{ Returns an \code{AnchorSet} object that can be used as input to \code{\link{IntegrateEmbeddings}}. } \description{ Find a set of anchors between unimodal query and the other unimodal reference using a pre-computed \code{\link{BridgeReferenceSet}}. These integration anchors can later be used to integrate query and reference using the \code{\link{IntegrateEmbeddings}} object. } \concept{integration} Seurat/man/FindSubCluster.Rd0000644000176200001440000000200515056057544015463 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/clustering.R \name{FindSubCluster} \alias{FindSubCluster} \title{Find subclusters under one cluster} \usage{ FindSubCluster( object, cluster, graph.name, subcluster.name = "sub.cluster", resolution = 0.5, algorithm = 1 ) } \arguments{ \item{object}{An object} \item{cluster}{the cluster to be sub-clustered} \item{graph.name}{Name of graph to use for the clustering algorithm} \item{subcluster.name}{the name of sub cluster added in the meta.data} \item{resolution}{Value of the resolution parameter, use a value above (below) 1.0 if you want to obtain a larger (smaller) number of communities.} \item{algorithm}{Algorithm for modularity optimization (1 = original Louvain algorithm; 2 = Louvain algorithm with multilevel refinement; 3 = SLM algorithm; 4 = Leiden algorithm).} } \value{ return a object with sub cluster labels in the sub-cluster.name variable } \description{ Find subclusters under one cluster } \concept{clustering} Seurat/man/FindBridgeTransferAnchors.Rd0000644000176200001440000000455415056057544017622 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{FindBridgeTransferAnchors} \alias{FindBridgeTransferAnchors} \title{Find bridge anchors between query and extended bridge-reference} \usage{ FindBridgeTransferAnchors( extended.reference, query, query.assay = NULL, dims = 1:30, scale = FALSE, reduction = c("lsiproject", "pcaproject"), bridge.reduction = c("direct", "cca"), verbose = TRUE ) } \arguments{ \item{extended.reference}{BridgeReferenceSet object generated from \code{\link{PrepareBridgeReference}}} \item{query}{A query Seurat object} \item{query.assay}{Assay name for query-bridge integration} \item{dims}{Number of dimensions for query-bridge integration} \item{scale}{Determine if scale the query data for projection} \item{reduction}{Dimensional reduction to perform when finding anchors. Options are: \itemize{ \item{pcaproject: Project the PCA from the bridge onto the query. We recommend using PCA when bridge and query datasets are from scRNA-seq} \item{lsiproject: Project the LSI from the bridge onto the query. We recommend using LSI when bridge and query datasets are from scATAC-seq or scCUT&TAG data. This requires that LSI or supervised LSI has been computed for the bridge dataset, and the same features (eg, peaks or genome bins) are present in both the bridge and query. } }} \item{bridge.reduction}{Dimensional reduction to perform when finding anchors. Can be one of: \itemize{ \item{cca: Canonical correlation analysis} \item{direct: Use assay data as a dimensional reduction} }} \item{verbose}{Print messages and progress} } \value{ Returns an \code{AnchorSet} object that can be used as input to \code{\link{TransferData}}, \code{\link{IntegrateEmbeddings}} and \code{\link{MapQuery}}. } \description{ Find a set of anchors between unimodal query and the other unimodal reference using a pre-computed \code{\link{BridgeReferenceSet}}. This function performs three steps: 1. Harmonize the bridge and query cells in the bridge query reduction space 2. Construct the bridge dictionary representations for query cells 3. Find a set of anchors between query and reference in the bridge graph laplacian eigenspace These anchors can later be used to integrate embeddings or transfer data from the reference to query object using the \code{\link{MapQuery}} object. } \concept{integration} Seurat/man/ReadAkoya.Rd0000644000176200001440000000526615117326655014443 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R, R/convenience.R \name{ReadAkoya} \alias{ReadAkoya} \alias{LoadAkoya} \title{Read and Load Akoya CODEX data} \usage{ ReadAkoya( filename, type = c("inform", "processor", "qupath"), filter = "DAPI|Blank|Empty", inform.quant = c("mean", "total", "min", "max", "std") ) LoadAkoya( filename, type = c("inform", "processor", "qupath"), fov, assay = "Akoya", ... ) } \arguments{ \item{filename}{Path to matrix generated by upstream processing.} \item{type}{Specify which type matrix is being provided. \itemize{ \item \dQuote{\code{processor}}: matrix generated by CODEX Processor \item \dQuote{\code{inform}}: matrix generated by inForm \item \dQuote{\code{qupath}}: matrix generated by QuPath }} \item{filter}{A pattern to filter features by; pass \code{NA} to skip feature filtering} \item{inform.quant}{When \code{type} is \dQuote{\code{inform}}, the quantification level to read in} \item{fov}{Name to store FOV as} \item{assay}{Name to store expression matrix as} \item{...}{Ignored} } \value{ \code{ReadAkoya}: A list with some combination of the following values \itemize{ \item \dQuote{\code{matrix}}: a \link[Matrix:dgCMatrix-class]{sparse matrix} with expression data; cells are columns and features are rows \item \dQuote{\code{centroids}}: a data frame with cell centroid coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} \item \dQuote{\code{metadata}}: a data frame with cell-level meta data; includes all columns in \code{filename} that aren't in \dQuote{\code{matrix}} or \dQuote{\code{centroids}} } When \code{type} is \dQuote{\code{inform}}, additional expression matrices are returned and named using their segmentation type (eg. \dQuote{nucleus}, \dQuote{membrane}). The \dQuote{Entire Cell} segmentation type is returned in the \dQuote{\code{matrix}} entry of the list \code{LoadAkoya}: A \code{\link[SeuratObject]{Seurat}} object } \description{ Read and Load Akoya CODEX data } \note{ This function requires the \href{https://cran.r-project.org/package=data.table}{\pkg{data.table}} package to be installed } \section{Progress Updates with \pkg{progressr}}{ This function uses \href{https://cran.r-project.org/package=progressr}{\pkg{progressr}} to render status updates and progress bars. To enable progress updates, wrap the function call in \code{\link[progressr]{with_progress}} or run \code{\link[progressr:handlers]{handlers(global = TRUE)}} before running this function. For more details about \pkg{progressr}, please read \href{https://progressr.futureverse.org/articles/progressr-01-intro.html}{\code{vignette("progressr-intro")}} } \concept{preprocessing} Seurat/man/FetchResidualSCTModel.Rd0000644000176200001440000000353615056057544016656 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing5.R \name{FetchResidualSCTModel} \alias{FetchResidualSCTModel} \title{Calculate pearson residuals of features not in the scale.data This function is the secondary function under FetchResiduals} \usage{ FetchResidualSCTModel( object, umi.object, layer = "counts", chunk_size = 2000, layer.cells = NULL, SCTModel = NULL, reference.SCT.model = NULL, new_features = NULL, clip.range = NULL, replace.value = FALSE, verbose = FALSE ) } \arguments{ \item{object}{An SCTAssay object} \item{umi.object}{The assay to use when recalculating any missing residuals.} \item{layer}{The name of the layer(s) in `umi.object` to use when recalculating any missing residuals.} \item{chunk_size}{Number of cells to load in memory for calculating residuals} \item{layer.cells}{Vector of cells to calculate the residual for. Default is NULL which uses all cells in the layer} \item{SCTModel}{Which SCTmodel to use from the object for calculating the residual. Will be ignored if reference.SCT.model is set} \item{reference.SCT.model}{If a reference SCT model should be used for calculating the residuals. When set to not NULL, ignores the `SCTModel` paramater.} \item{new_features}{A vector of features to calculate the residuals for} \item{clip.range}{Numeric of length two specifying the min and max values the Pearson residual will be clipped to. Useful if you want to change the clip.range.} \item{replace.value}{Whether to replace the value of residuals if it already exists} \item{verbose}{Whether to print messages and progress bars} } \value{ Returns a matrix containing centered pearson residuals of added features } \description{ Calculate pearson residuals of features not in the scale.data This function is the secondary function under FetchResiduals } \keyword{internal} Seurat/man/SeuratTheme.Rd0000644000176200001440000000602115056057544015017 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{SeuratTheme} \alias{SeuratTheme} \alias{CenterTitle} \alias{DarkTheme} \alias{FontSize} \alias{NoAxes} \alias{NoLegend} \alias{NoGrid} \alias{SeuratAxes} \alias{SpatialTheme} \alias{RestoreLegend} \alias{RotatedAxis} \alias{BoldTitle} \alias{WhiteBackground} \title{Seurat Themes} \usage{ SeuratTheme() CenterTitle(...) DarkTheme(...) FontSize( x.text = NULL, y.text = NULL, x.title = NULL, y.title = NULL, main = NULL, ... ) NoAxes(..., keep.text = FALSE, keep.ticks = FALSE) NoLegend(...) NoGrid(...) SeuratAxes(...) SpatialTheme(...) RestoreLegend(..., position = "right") RotatedAxis(...) BoldTitle(...) WhiteBackground(...) } \arguments{ \item{...}{Extra parameters to be passed to \code{theme}} \item{x.text, y.text}{X and Y axis text sizes} \item{x.title, y.title}{X and Y axis title sizes} \item{main}{Plot title size} \item{keep.text}{Keep axis text} \item{keep.ticks}{Keep axis ticks} \item{position}{A position to restore the legend to} } \value{ A ggplot2 theme object } \description{ Various themes to be applied to ggplot2-based plots \describe{ \item{\code{SeuratTheme}}{The curated Seurat theme, consists of ...} \item{\code{DarkTheme}}{A dark theme, axes and text turn to white, the background becomes black} \item{\code{NoAxes}}{Removes axis lines, text, and ticks} \item{\code{NoLegend}}{Removes the legend} \item{\code{FontSize}}{Sets axis and title font sizes} \item{\code{NoGrid}}{Removes grid lines} \item{\code{SeuratAxes}}{Set Seurat-style axes} \item{\code{SpatialTheme}}{A theme designed for spatial visualizations (eg \code{\link{PolyFeaturePlot}}, \code{\link{PolyDimPlot}})} \item{\code{RestoreLegend}}{Restore a legend after removal} \item{\code{RotatedAxis}}{Rotate X axis text 45 degrees} \item{\code{BoldTitle}}{Enlarges and emphasizes the title} } } \examples{ # Generate a plot with a dark theme library(ggplot2) df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) p <- ggplot(data = df, mapping = aes(x = x, y = y)) + geom_point(mapping = aes(color = 'red')) p + DarkTheme(legend.position = 'none') # Generate a plot with no axes library(ggplot2) df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) p <- ggplot(data = df, mapping = aes(x = x, y = y)) + geom_point(mapping = aes(color = 'red')) p + NoAxes() # Generate a plot with no legend library(ggplot2) df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) p <- ggplot(data = df, mapping = aes(x = x, y = y)) + geom_point(mapping = aes(color = 'red')) p + NoLegend() # Generate a plot with no grid lines library(ggplot2) df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) p <- ggplot(data = df, mapping = aes(x = x, y = y)) + geom_point(mapping = aes(color = 'red')) p + NoGrid() } \seealso{ \code{\link[ggplot2]{theme}} } \concept{visualization} Seurat/man/FeaturePlot.Rd0000644000176200001440000001332415070750476015027 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{FeaturePlot} \alias{FeaturePlot} \alias{FeatureHeatmap} \title{Visualize 'features' on a dimensional reduction plot} \usage{ FeaturePlot( object, features, dims = c(1, 2), cells = NULL, cols = if (blend) { c("lightgrey", "#ff0000", "#00ff00") } else { c("lightgrey", "blue") }, pt.size = NULL, alpha = 1, stroke.size = NULL, order = FALSE, min.cutoff = NA, max.cutoff = NA, reduction = NULL, split.by = NULL, keep.scale = "feature", shape.by = NULL, slot = "data", blend = FALSE, blend.threshold = 0.5, label = FALSE, label.size = 4, label.color = "black", repel = FALSE, ncol = NULL, coord.fixed = FALSE, by.col = TRUE, sort.cell = deprecated(), interactive = FALSE, combine = TRUE, raster = NULL, raster.dpi = c(512, 512) ) } \arguments{ \item{object}{Seurat object} \item{features}{Vector of features to plot. Features can come from: \itemize{ \item An \code{Assay} feature (e.g. a gene name - "MS4A1") \item A column name from meta.data (e.g. mitochondrial percentage - "percent.mito") \item A column name from a \code{DimReduc} object corresponding to the cell embedding values (e.g. the PC 1 scores - "PC_1") }} \item{dims}{Dimensions to plot, must be a two-length numeric vector specifying x- and y-dimensions} \item{cells}{Vector of cells to plot (default is all cells)} \item{cols}{The two colors to form the gradient over. Provide as string vector with the first color corresponding to low values, the second to high. Also accepts a Brewer color scale or vector of colors. Note: this will bin the data into number of colors provided. When blend is \code{TRUE}, takes anywhere from 1-3 colors: \describe{ \item{1 color:}{Treated as color for double-negatives, will use default colors 2 and 3 for per-feature expression} \item{2 colors:}{Treated as colors for per-feature expression, will use default color 1 for double-negatives} \item{3+ colors:}{First color used for double-negatives, colors 2 and 3 used for per-feature expression, all others ignored} }} \item{pt.size}{Adjust point size for plotting} \item{alpha}{Alpha value for plotting (default is 1)} \item{stroke.size}{Adjust stroke (outline) size of points} \item{order}{Boolean determining whether to plot cells in order of expression. Can be useful if cells expressing given feature are getting buried.} \item{min.cutoff, max.cutoff}{Vector of minimum and maximum cutoff values for each feature, may specify quantile in the form of 'q##' where '##' is the quantile (eg, 'q1', 'q10')} \item{reduction}{Which dimensionality reduction to use. If not specified, first searches for umap, then tsne, then pca} \item{split.by}{A factor in object metadata to split the plot by, pass 'ident' to split by cell identity} \item{keep.scale}{How to handle the color scale across multiple plots. Options are: \itemize{ \item \dQuote{feature} (default; by row/feature scaling): The plots for each individual feature are scaled to the maximum expression of the feature across the conditions provided to \code{split.by} \item \dQuote{all} (universal scaling): The plots for all features and conditions are scaled to the maximum expression value for the feature with the highest overall expression \item \code{NULL} (no scaling): Each individual plot is scaled to the maximum expression value of the feature in the condition provided to \code{split.by}. Be aware setting \code{NULL} will result in color scales that are not comparable between plots }} \item{shape.by}{If NULL, all points are circles (default). You can specify any cell attribute (that can be pulled with FetchData) allowing for both different colors and different shapes on cells. Only applicable if \code{raster = FALSE}.} \item{slot}{Which slot to pull expression data from?} \item{blend}{Scale and blend expression values to visualize coexpression of two features} \item{blend.threshold}{The color cutoff from weak signal to strong signal; ranges from 0 to 1.} \item{label}{Whether to label the clusters} \item{label.size}{Sets size of labels} \item{label.color}{Sets the color of the label text} \item{repel}{Repel labels} \item{ncol}{Number of columns to combine multiple feature plots to, ignored if \code{split.by} is not \code{NULL}} \item{coord.fixed}{Plot cartesian coordinates with fixed aspect ratio} \item{by.col}{If splitting by a factor, plot the splits per column with the features as rows; ignored if \code{blend = TRUE}} \item{sort.cell}{Redundant with \code{order}. This argument is being deprecated. Please use \code{order} instead.} \item{interactive}{Launch an interactive \code{\link[Seurat:IFeaturePlot]{FeaturePlot}}} \item{combine}{Combine plots into a single \code{\link[patchwork]{patchwork}ed} ggplot object. If \code{FALSE}, return a list of ggplot objects} \item{raster}{Convert points to raster format, default is \code{NULL} which automatically rasterizes if plotting more than 100,000 cells} \item{raster.dpi}{Pixel resolution for rasterized plots, passed to geom_scattermore(). Default is c(512, 512).} } \value{ A \code{\link[patchwork]{patchwork}ed} ggplot object if \code{combine = TRUE}; otherwise, a list of ggplot objects } \description{ Colors single cells on a dimensional reduction plot according to a 'feature' (i.e. gene expression, PC scores, number of genes detected, etc.) } \note{ For the old \code{do.hover} and \code{do.identify} functionality, please see \code{HoverLocator} and \code{CellSelector}, respectively. } \examples{ data("pbmc_small") FeaturePlot(object = pbmc_small, features = 'PC_1') } \seealso{ \code{\link{DimPlot}} \code{\link{HoverLocator}} \code{\link{CellSelector}} } \concept{visualization} Seurat/man/FindMultiModalNeighbors.Rd0000644000176200001440000000451015056057544017303 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/clustering.R \name{FindMultiModalNeighbors} \alias{FindMultiModalNeighbors} \title{Construct weighted nearest neighbor graph} \usage{ FindMultiModalNeighbors( object, reduction.list, dims.list, k.nn = 20, l2.norm = TRUE, knn.graph.name = "wknn", snn.graph.name = "wsnn", weighted.nn.name = "weighted.nn", modality.weight.name = NULL, knn.range = 200, prune.SNN = 1/15, sd.scale = 1, cross.contant.list = NULL, smooth = FALSE, return.intermediate = FALSE, modality.weight = NULL, verbose = TRUE ) } \arguments{ \item{object}{A Seurat object} \item{reduction.list}{A list of two dimensional reductions, one for each of the modalities to be integrated} \item{dims.list}{A list containing the dimensions for each reduction to use} \item{k.nn}{the number of multimodal neighbors to compute. 20 by default} \item{l2.norm}{Perform L2 normalization on the cell embeddings after dimensional reduction. TRUE by default.} \item{knn.graph.name}{Multimodal knn graph name} \item{snn.graph.name}{Multimodal snn graph name} \item{weighted.nn.name}{Multimodal neighbor object name} \item{modality.weight.name}{Variable name to store modality weight in object meta data} \item{knn.range}{The number of approximate neighbors to compute} \item{prune.SNN}{Cutoff not to discard edge in SNN graph} \item{sd.scale}{The scaling factor for kernel width. 1 by default} \item{cross.contant.list}{Constant used to avoid divide-by-zero errors. 1e-4 by default} \item{smooth}{Smoothing modality score across each individual modality neighbors. FALSE by default} \item{return.intermediate}{Store intermediate results in misc} \item{modality.weight}{A \code{\link{ModalityWeights}} object generated by \code{FindModalityWeights}} \item{verbose}{Print progress bars and output} } \value{ Seurat object containing a nearest-neighbor object, KNN graph, and SNN graph - each based on a weighted combination of modalities. } \description{ This function will construct a weighted nearest neighbor (WNN) graph. For each cell, we identify the nearest neighbors based on a weighted combination of two modalities. Takes as input two dimensional reductions, one computed for each modality.Other parameters are listed for debugging, but can be left as default values. } \concept{clustering} Seurat/man/as.SingleCellExperiment.Rd0000644000176200001440000000114215056057544017254 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/objects.R \name{as.SingleCellExperiment} \alias{as.SingleCellExperiment} \alias{as.SingleCellExperiment.Seurat} \title{Convert objects to SingleCellExperiment objects} \usage{ as.SingleCellExperiment(x, ...) \method{as.SingleCellExperiment}{Seurat}(x, assay = NULL, ...) } \arguments{ \item{x}{An object to convert to class \code{SingleCellExperiment}} \item{...}{Arguments passed to other methods} \item{assay}{Assays to convert} } \description{ Convert objects to SingleCellExperiment objects } \concept{objects} Seurat/man/writing-integration.Rd0000644000176200001440000000340015056057544016573 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration5.R \name{writing-integration} \alias{writing-integration} \title{Writing Integration Method Functions} \description{ Integration method functions can be written by anyone to implement any integration method in Seurat. These methods should expect to take a \link[SeuratObject:Assay5]{v5 assay} as input and return a named list of objects that can be added back to a \code{Seurat} object (eg. a \link[SeuratObject:DimReduc]{dimensional reduction} or cell-level meta data) } \section{Provided Parameters}{ Every integration method function should expect the following arguments: \itemize{ \item \dQuote{\code{object}}: an \code{\link[SeuratObject]{Assay5}} object \item \dQuote{\code{orig}}: \link[SeuratObject:DimReduc]{dimensional reduction} to correct \item \dQuote{\code{layers}}: names of normalized layers in \code{object} \item \dQuote{\code{scale.layer}}: name(s) of scaled layer(s) in \code{object} \item \dQuote{\code{features}}: a vector of features for integration \item \dQuote{\code{groups}}: a one-column data frame with the groups for each cell in \code{object}; the column name will be \dQuote{group} } } \section{Method Discovery}{ The documentation for \code{\link{IntegrateLayers}()} will automatically link to integration method functions provided by packages in the \code{\link[base]{search}()} space. To make an integration method function discoverable by the documentation, simply add an attribute named \dQuote{\code{Seurat.method}} to the function with a value of \dQuote{\code{integration}} \preformatted{ attr(MyIntegrationFunction, which = "Seurat.method") <- "integration" } } \seealso{ \code{\link{IntegrateLayers}()} } \concept{integration} \keyword{internal} Seurat/man/AverageExpression.Rd0000644000176200001440000000467115056057544016234 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{AverageExpression} \alias{AverageExpression} \title{Averaged feature expression by identity class} \usage{ AverageExpression( object, assays = NULL, features = NULL, return.seurat = FALSE, group.by = "ident", add.ident = NULL, layer = "data", slot = deprecated(), verbose = TRUE, ... ) } \arguments{ \item{object}{Seurat object} \item{assays}{Which assays to use. Default is all assays} \item{features}{Features to analyze. Default is all features in the assay} \item{return.seurat}{Whether to return the data as a Seurat object. Default is FALSE} \item{group.by}{Category (or vector of categories) for grouping (e.g, ident, replicate, celltype); 'ident' by default To use multiple categories, specify a vector, such as c('ident', 'replicate', 'celltype')} \item{add.ident}{(Deprecated). Place an additional label on each cell prior to pseudobulking} \item{layer}{Layer(s) to use; if multiple layers are given, assumed to follow the order of 'assays' (if specified) or object's assays} \item{slot}{(Deprecated). Slots(s) to use} \item{verbose}{Print messages and show progress bar} \item{...}{Arguments to be passed to methods such as \code{\link{CreateSeuratObject}}} } \value{ Returns a matrix with genes as rows, identity classes as columns. If return.seurat is TRUE, returns an object of class \code{\link{Seurat}}. } \description{ Returns averaged expression values for each identity class. } \details{ If layer is set to 'data', this function assumes that the data has been log normalized and therefore feature values are exponentiated prior to averaging so that averaging is done in non-log space. Otherwise, if layer is set to either 'counts' or 'scale.data', no exponentiation is performed prior to averaging. If \code{return.seurat = TRUE} and layer is not 'scale.data', averaged values are placed in the 'counts' layer of the returned object and 'log1p' is run on the averaged counts and placed in the 'data' layer \code{\link{ScaleData}} is then run on the default assay before returning the object. If \code{return.seurat = TRUE} and layer is 'scale.data', the 'counts' layer contains average counts and 'scale.data' is set to the averaged values of 'scale.data'. } \examples{ data("pbmc_small") head(AverageExpression(object = pbmc_small)$RNA) head(AverageExpression(object = pbmc_small, group.by = c('ident', 'groups'))$RNA) } \concept{utilities} Seurat/man/AggregateExpression.Rd0000644000176200001440000000414415056057544016543 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{AggregateExpression} \alias{AggregateExpression} \title{Aggregated feature expression by identity class} \usage{ AggregateExpression( object, assays = NULL, features = NULL, return.seurat = FALSE, group.by = "ident", add.ident = NULL, normalization.method = "LogNormalize", scale.factor = 10000, margin = 1, verbose = TRUE, ... ) } \arguments{ \item{object}{Seurat object} \item{assays}{Which assays to use. Default is all assays} \item{features}{Features to analyze. Default is all features in the assay} \item{return.seurat}{Whether to return the data as a Seurat object. Default is FALSE} \item{group.by}{Category (or vector of categories) for grouping (e.g, ident, replicate, celltype); 'ident' by default To use multiple categories, specify a vector, such as c('ident', 'replicate', 'celltype')} \item{add.ident}{(Deprecated). Place an additional label on each cell prior to pseudobulking} \item{normalization.method}{Method for normalization, see \code{\link{NormalizeData}}} \item{scale.factor}{Scale factor for normalization, see \code{\link{NormalizeData}}} \item{margin}{Margin to perform CLR normalization, see \code{\link{NormalizeData}}} \item{verbose}{Print messages and show progress bar} \item{...}{Arguments to be passed to methods such as \code{\link{CreateSeuratObject}}} } \value{ Returns a matrix with genes as rows, identity classes as columns. If return.seurat is TRUE, returns an object of class \code{\link{Seurat}}. } \description{ Returns summed counts ("pseudobulk") for each identity class. } \details{ If \code{return.seurat = TRUE}, aggregated values are placed in the 'counts' layer of the returned object. The data is then normalized by running \code{\link{NormalizeData}} on the aggregated counts. \code{\link{ScaleData}} is then run on the default assay before returning the object. } \examples{ \dontrun{ data("pbmc_small") head(AggregateExpression(object = pbmc_small)$RNA) head(AggregateExpression(object = pbmc_small, group.by = c('ident', 'groups'))$RNA) } } \concept{utilities} Seurat/man/SingleImagePlot.Rd0000644000176200001440000000565115056057544015624 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{SingleImagePlot} \alias{SingleImagePlot} \title{Single Spatial Plot} \usage{ SingleImagePlot( data, col.by = NA, col.factor = TRUE, cols = NULL, shuffle.cols = FALSE, size = 0.1, molecules = NULL, mols.size = 0.1, mols.cols = NULL, mols.alpha = 1, alpha = molecules \%iff\% 0.3 \%||\% 0.6, border.color = "white", border.size = NULL, na.value = "grey50", dark.background = TRUE, ... ) } \arguments{ \item{data}{A data frame with at least the following columns: \itemize{ \item \dQuote{\code{x}}: Spatial-resolved \emph{x} coordinates, will be plotted on the \emph{y}-axis \item \dQuote{\code{y}}: Spatially-resolved \emph{y} coordinates, will be plotted on the \emph{x}-axis \item \dQuote{\code{cell}}: Cell name \item \dQuote{\code{boundary}}: Segmentation boundary label; when plotting multiple segmentation layers, the order of boundary transparency is set by factor levels for this column } Can pass \code{NA} to \code{data} suppress segmentation visualization} \item{col.by}{Name of column in \code{data} to color cell segmentations by; pass \code{NA} to suppress coloring} \item{col.factor}{Are the colors a factor or discrete?} \item{cols}{Colors for cell segmentations; can be one of the following: \itemize{ \item \code{NULL} for default ggplot2 colors \item A numeric value or name of a \link[RColorBrewer:RColorBrewer]{color brewer palette} \item Name of a palette for \code{\link{DiscretePalette}} \item A vector of colors equal to the length of unique levels of \code{data$col.by} }} \item{shuffle.cols}{Randomly shuffle colors when a palette or vector of colors is provided to \code{cols}} \item{size}{Point size for cells when plotting centroids} \item{molecules}{A data frame with spatially-resolved molecule coordinates; should have the following columns: \itemize{ \item \dQuote{\code{x}}: Spatial-resolved \emph{x} coordinates, will be plotted on the \emph{y}-axis \item \dQuote{\code{y}}: Spatially-resolved \emph{y} coordinates, will be plotted on the \emph{x}-axis \item \dQuote{\code{molecule}}: Molecule name }} \item{mols.size}{Point size for molecules} \item{mols.cols}{A vector of color for molecules. The "Set1" palette from RColorBrewer is used by default.} \item{mols.alpha}{Alpha value for molecules, should be between 0 and 1} \item{alpha}{Alpha value, should be between 0 and 1; when plotting multiple boundaries, \code{alpha} is equivalent to max alpha} \item{border.color}{Color of cell segmentation border; pass \code{NA} to suppress borders for segmentation-based plots} \item{border.size}{Thickness of cell segmentation borders; pass \code{NA} to suppress borders for centroid-based plots} \item{na.value}{Color value for \code{NA} segmentations when using custom scale} \item{...}{Ignored} } \value{ A ggplot object } \description{ Single Spatial Plot } \keyword{internal} Seurat/man/fortify-Spatial.Rd0000644000176200001440000000177715056057544015663 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{fortify-Spatial} \alias{fortify-Spatial} \alias{fortify.Centroids} \alias{fortify} \alias{fortify.Molecules} \alias{fortify.Segmentation} \title{Prepare Coordinates for Spatial Plots} \usage{ \method{fortify}{Centroids}(model, data, ...) \method{fortify}{Molecules}(model, data, nmols = NULL, seed = NA_integer_, ...) \method{fortify}{Segmentation}(model, data, ...) } \arguments{ \item{model}{A \code{\link[SeuratObject:Segmentation-class]{Segmentation}}, \code{\link[SeuratObject:Centroids-class]{Centroids}}, or \code{\link[SeuratObject:Molecules-class]{Molecules}} object} \item{data}{Extra data to be used for annotating the cell segmentations; the easiest way to pass data is a one-column \code{\link[base:data.frame]{data frame}} with the values to color by and the cell names are rownames} \item{...}{Arguments passed to other methods} } \description{ Prepare Coordinates for Spatial Plots } \keyword{internal} Seurat/man/RunTSNE.Rd0000644000176200001440000000552515056057544014037 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/dimensional_reduction.R \name{RunTSNE} \alias{RunTSNE} \alias{RunTSNE.matrix} \alias{RunTSNE.DimReduc} \alias{RunTSNE.dist} \alias{RunTSNE.Seurat} \title{Run t-distributed Stochastic Neighbor Embedding} \usage{ RunTSNE(object, ...) \method{RunTSNE}{matrix}( object, assay = NULL, seed.use = 1, tsne.method = "Rtsne", dim.embed = 2, reduction.key = "tSNE_", ... ) \method{RunTSNE}{DimReduc}( object, cells = NULL, dims = 1:5, seed.use = 1, tsne.method = "Rtsne", dim.embed = 2, reduction.key = "tSNE_", ... ) \method{RunTSNE}{dist}( object, assay = NULL, seed.use = 1, tsne.method = "Rtsne", dim.embed = 2, reduction.key = "tSNE_", ... ) \method{RunTSNE}{Seurat}( object, reduction = "pca", cells = NULL, dims = 1:5, features = NULL, seed.use = 1, tsne.method = "Rtsne", dim.embed = 2, distance.matrix = NULL, reduction.name = "tsne", reduction.key = "tSNE_", ... ) } \arguments{ \item{object}{Seurat object} \item{...}{Arguments passed to other methods and to t-SNE call (most commonly used is perplexity)} \item{assay}{Name of assay that that t-SNE is being run on} \item{seed.use}{Random seed for the t-SNE. If NULL, does not set the seed} \item{tsne.method}{Select the method to use to compute the tSNE. Available methods are: \itemize{ \item \dQuote{\code{Rtsne}}: Use the Rtsne package Barnes-Hut implementation of tSNE (default) \item \dQuote{\code{FIt-SNE}}: Use the FFT-accelerated Interpolation-based t-SNE. Based on Kluger Lab code found here: \url{https://github.com/KlugerLab/FIt-SNE} }} \item{dim.embed}{The dimensional space of the resulting tSNE embedding (default is 2). For example, set to 3 for a 3d tSNE} \item{reduction.key}{dimensional reduction key, specifies the string before the number for the dimension names. \dQuote{\code{tSNE_}} by default} \item{cells}{Which cells to analyze (default, all cells)} \item{dims}{Which dimensions to use as input features} \item{reduction}{Which dimensional reduction (e.g. PCA, ICA) to use for the tSNE. Default is PCA} \item{features}{If set, run the tSNE on this subset of features (instead of running on a set of reduced dimensions). Not set (NULL) by default; \code{dims} must be NULL to run on features} \item{distance.matrix}{If set, runs tSNE on the given distance matrix instead of data matrix (experimental)} \item{reduction.name}{dimensional reduction name, specifies the position in the object$dr list. tsne by default} } \description{ Run t-SNE dimensionality reduction on selected features. Has the option of running in a reduced dimensional space (i.e. spectral tSNE, recommended), or running based on a set of genes. For details about stored TSNE calculation parameters, see \code{PrintTSNEParams}. } \concept{dimensional_reduction} Seurat/man/DISP.Rd0000644000176200001440000000071215056057544013331 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing5.R \name{DISP} \alias{DISP} \title{Find variable features based on dispersion} \usage{ DISP(data, nselect = 2000L, verbose = TRUE, ...) } \arguments{ \item{data}{Data matrix} \item{nselect}{Number of top features to select based on dispersion values} \item{verbose}{Display progress} } \description{ Find variable features based on dispersion } \keyword{internal} Seurat/man/ImageFeaturePlot.Rd0000644000176200001440000001070615056057544015773 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{ImageFeaturePlot} \alias{ImageFeaturePlot} \title{Spatial Feature Plots} \usage{ ImageFeaturePlot( object, features, fov = NULL, boundaries = NULL, cols = if (isTRUE(x = blend)) { c("lightgrey", "#ff0000", "#00ff00") } else { c("lightgrey", "firebrick1") }, size = 0.5, min.cutoff = NA, max.cutoff = NA, split.by = NULL, molecules = NULL, mols.size = 0.1, mols.cols = NULL, nmols = 1000, alpha = 1, border.color = "white", border.size = NULL, dark.background = TRUE, blend = FALSE, blend.threshold = 0.5, crop = FALSE, cells = NULL, scale = c("feature", "all", "none"), overlap = FALSE, axes = FALSE, combine = TRUE, coord.fixed = TRUE ) } \arguments{ \item{object}{Seurat object} \item{features}{Vector of features to plot. Features can come from: \itemize{ \item An \code{Assay} feature (e.g. a gene name - "MS4A1") \item A column name from meta.data (e.g. mitochondrial percentage - "percent.mito") \item A column name from a \code{DimReduc} object corresponding to the cell embedding values (e.g. the PC 1 scores - "PC_1") }} \item{fov}{Name of FOV to plot} \item{boundaries}{A vector of segmentation boundaries per image to plot; can be a character vector, a named character vector, or a named list. Names should be the names of FOVs and values should be the names of segmentation boundaries} \item{cols}{The two colors to form the gradient over. Provide as string vector with the first color corresponding to low values, the second to high. Also accepts a Brewer color scale or vector of colors. Note: this will bin the data into number of colors provided. When blend is \code{TRUE}, takes anywhere from 1-3 colors: \describe{ \item{1 color:}{Treated as color for double-negatives, will use default colors 2 and 3 for per-feature expression} \item{2 colors:}{Treated as colors for per-feature expression, will use default color 1 for double-negatives} \item{3+ colors:}{First color used for double-negatives, colors 2 and 3 used for per-feature expression, all others ignored} }} \item{size}{Point size for cells when plotting centroids} \item{min.cutoff, max.cutoff}{Vector of minimum and maximum cutoff values for each feature, may specify quantile in the form of 'q##' where '##' is the quantile (eg, 'q1', 'q10')} \item{split.by}{A factor in object metadata to split the plot by, pass 'ident' to split by cell identity} \item{molecules}{A vector of molecules to plot} \item{mols.size}{Point size for molecules} \item{mols.cols}{A vector of color for molecules. The "Set1" palette from RColorBrewer is used by default.} \item{nmols}{Max number of each molecule specified in `molecules` to plot} \item{alpha}{Alpha value for plotting (default is 1)} \item{border.color}{Color of cell segmentation border; pass \code{NA} to suppress borders for segmentation-based plots} \item{border.size}{Thickness of cell segmentation borders; pass \code{NA} to suppress borders for centroid-based plots} \item{dark.background}{Set plot background to black} \item{blend}{Scale and blend expression values to visualize coexpression of two features} \item{blend.threshold}{The color cutoff from weak signal to strong signal; ranges from 0 to 1.} \item{crop}{Crop the plots to area with cells only} \item{cells}{Vector of cells to plot (default is all cells)} \item{scale}{Set color scaling across multiple plots; choose from: \itemize{ \item \dQuote{\code{feature}}: Plots per-feature are scaled across splits \item \dQuote{\code{all}}: Plots per-feature are scaled across all features \item \dQuote{\code{none}}: Plots are not scaled; \strong{note}: setting \code{scale} to \dQuote{\code{none}} will result in color scales that are \emph{not} comparable between plots } Ignored if \code{blend = TRUE}} \item{overlap}{Overlay boundaries from a single image to create a single plot; if \code{TRUE}, then boundaries are stacked in the order they're given (first is lowest)} \item{axes}{Keep axes and panel background} \item{combine}{Combine plots into a single \code{\link[patchwork]{patchwork}ed} ggplot object. If \code{FALSE}, return a list of ggplot objects} \item{coord.fixed}{Plot cartesian coordinates with fixed aspect ratio} } \value{ If \code{combine = TRUE}, a \code{patchwork} ggplot object; otherwise, a list of ggplot objects } \description{ Visualize expression in a spatial context } \concept{spatial} \concept{visualization} Seurat/man/CellSelector.Rd0000644000176200001440000000234015056057544015151 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{CellSelector} \alias{CellSelector} \alias{FeatureLocator} \title{Cell Selector} \usage{ CellSelector(plot, object = NULL, ident = "SelectedCells", ...) FeatureLocator(plot, ...) } \arguments{ \item{plot}{A ggplot2 plot} \item{object}{An optional Seurat object; if passes, will return an object with the identities of selected cells set to \code{ident}} \item{ident}{An optional new identity class to assign the selected cells} \item{...}{Ignored} } \value{ If \code{object} is \code{NULL}, the names of the points selected; otherwise, a Seurat object with the selected cells identity classes set to \code{ident} } \description{ Select points on a scatterplot and get information about them } \examples{ \dontrun{ data("pbmc_small") plot <- DimPlot(object = pbmc_small) # Follow instructions in the terminal to select points cells.located <- CellSelector(plot = plot) cells.located # Automatically set the identity class of selected cells and return a new Seurat object pbmc_small <- CellSelector(plot = plot, object = pbmc_small, ident = 'SelectedCells') } } \seealso{ \code{\link{DimPlot}} \code{\link{FeaturePlot}} } \concept{visualization} Seurat/man/roxygen/0000755000176200001440000000000015056057544013776 5ustar liggesusersSeurat/man/roxygen/templates/0000755000176200001440000000000015117326655015774 5ustar liggesusersSeurat/man/roxygen/templates/note-reqdpkg.R0000644000176200001440000000021115056057544020511 0ustar liggesusers#' @note This function requires the #' \href{https://cran.r-project.org/package=<%= pkg %>}{\pkg{<%= pkg %>}} package #' to be installed Seurat/man/roxygen/templates/section-future.R0000644000176200001440000000132715056057544021076 0ustar liggesusers#' @section Parallelization with \pkg{future}: #' This function uses #' \href{https://cran.r-project.org/package=future}{\pkg{future}} to enable #' parallelization. Parallelization strategies can be set using #' \code{\link[future]{plan}}. Common plans include \dQuote{\code{sequential}} #' for non-parallelized processing or \dQuote{\code{multisession}} for parallel #' evaluation using multiple \R sessions; for other plans, see the #' \dQuote{Implemented evaluation strategies} section of #' \code{\link[future:plan]{?future::plan}}. For a more thorough introduction #' to \pkg{future}, see #' \href{https://future.futureverse.org/articles/future-1-overview.html}{\code{vignette("future-1-overview")}} #' #' @concept future Seurat/man/roxygen/templates/param-dotsm.R0000644000176200001440000000006115056057544020340 0ustar liggesusers#' @param ... Arguments passed to other methods Seurat/man/roxygen/templates/section-progressr.R0000644000176200001440000000105215117326655021605 0ustar liggesusers#' @section Progress Updates with \pkg{progressr}: #' This function uses #' \href{https://cran.r-project.org/package=progressr}{\pkg{progressr}} to #' render status updates and progress bars. To enable progress updates, wrap #' the function call in \code{\link[progressr]{with_progress}} or run #' \code{\link[progressr:handlers]{handlers(global = TRUE)}} before running #' this function. For more details about \pkg{progressr}, please read #' \href{https://progressr.futureverse.org/articles/progressr-01-intro.html}{\code{vignette("progressr-intro")}} Seurat/man/roxygen/templates/param-dotsi.R0000644000176200001440000000002615056057544020335 0ustar liggesusers#' @param ... Ignored Seurat/man/roxygen/templates/seealso-methods.R0000644000176200001440000000011015056057544021203 0ustar liggesusers#' @seealso \code{<%= cls %>} methods: \code{\link{<%= cls %>-methods}} Seurat/man/RunSPCA.Rd0000644000176200001440000000472615056057544014016 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/dimensional_reduction.R \name{RunSPCA} \alias{RunSPCA} \alias{RunSPCA.default} \alias{RunSPCA.Assay} \alias{RunSPCA.Assay5} \alias{RunSPCA.Seurat} \title{Run Supervised Principal Component Analysis} \usage{ RunSPCA(object, ...) \method{RunSPCA}{default}( object, assay = NULL, npcs = 50, reduction.key = "SPC_", graph = NULL, verbose = FALSE, seed.use = 42, ... ) \method{RunSPCA}{Assay}( object, assay = NULL, features = NULL, npcs = 50, reduction.key = "SPC_", graph = NULL, verbose = TRUE, seed.use = 42, ... ) \method{RunSPCA}{Assay5}( object, assay = NULL, features = NULL, npcs = 50, reduction.key = "SPC_", graph = NULL, verbose = TRUE, seed.use = 42, layer = "scale.data", ... ) \method{RunSPCA}{Seurat}( object, assay = NULL, features = NULL, npcs = 50, reduction.name = "spca", reduction.key = "SPC_", graph = NULL, verbose = TRUE, seed.use = 42, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods and IRLBA} \item{assay}{Name of Assay SPCA is being run on} \item{npcs}{Total Number of SPCs to compute and store (50 by default)} \item{reduction.key}{dimensional reduction key, specifies the string before the number for the dimension names. SPC by default} \item{graph}{Graph used supervised by SPCA} \item{verbose}{Print the top genes associated with high/low loadings for the SPCs} \item{seed.use}{Set a random seed. By default, sets the seed to 42. Setting NULL will not set a seed.} \item{features}{Features to compute SPCA on. If features=NULL, SPCA will be run using the variable features for the Assay.} \item{layer}{Layer to run SPCA on} \item{reduction.name}{dimensional reduction name, spca by default} } \value{ Returns Seurat object with the SPCA calculation stored in the reductions slot } \description{ Run a supervised PCA (SPCA) dimensionality reduction supervised by a cell-cell kernel. SPCA is used to capture a linear transformation which maximizes its dependency to the given cell-cell kernel. We use SNN graph as the kernel to supervise the linear matrix factorization. } \references{ Barshan E, Ghodsi A, Azimifar Z, Jahromi MZ. Supervised principal component analysis: Visualization, classification and regression on subspaces and submanifolds. Pattern Recognition. 2011 Jul 1;44(7):1357-71. \url{doi:10.1016/j.patcog.2010.12.015}; } \concept{dimensional_reduction} Seurat/man/L2CCA.Rd0000644000176200001440000000054115056057544013356 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dimensional_reduction.R \name{L2CCA} \alias{L2CCA} \title{L2-Normalize CCA} \usage{ L2CCA(object, ...) } \arguments{ \item{object}{Seurat object} \item{\dots}{Additional parameters to L2Dim.} } \description{ Perform l2 normalization on CCs } \concept{dimensional_reduction} Seurat/man/SeuratCommand-class.Rd0000644000176200001440000000062215056057544016437 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reexports.R \docType{class} \name{SeuratCommand-class} \alias{SeuratCommand-class} \title{The SeuratCommand Class} \description{ For more details, please see the documentation in \code{\link[SeuratObject:SeuratCommand]{SeuratObject}} } \seealso{ \code{\link[SeuratObject:SeuratCommand]{SeuratObject::SeuratCommand-class}} } Seurat/man/Read10X_ScaleFactors.Rd0000644000176200001440000000065215056057544016372 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{Read10X_ScaleFactors} \alias{Read10X_ScaleFactors} \title{Load 10X Genomics Visium Scale Factors} \usage{ Read10X_ScaleFactors(filename) } \arguments{ \item{filename}{Path to a \code{scalefactors_json.json} file} } \value{ A scalefactors object } \description{ Load 10X Genomics Visium Scale Factors } \concept{preprocessing} Seurat/man/IntegrateLayers.Rd0000644000176200001440000000221215056057544015671 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration5.R \name{IntegrateLayers} \alias{IntegrateLayers} \title{Integrate Layers} \usage{ IntegrateLayers( object, method, orig.reduction = "pca", assay = NULL, features = NULL, layers = NULL, scale.layer = "scale.data", ... ) } \arguments{ \item{object}{A \code{\link[SeuratObject]{Seurat}} object} \item{method}{Integration method function} \item{orig.reduction}{Name of dimensional reduction for correction} \item{assay}{Name of assay for integration} \item{features}{A vector of features to use for integration} \item{layers}{Names of normalized layers in \code{assay}} \item{scale.layer}{Name(s) of scaled layer(s) in \code{assay}} \item{...}{Arguments passed on to \code{method}} } \value{ \code{object} with integration data added to it } \description{ Integrate Layers } \section{Integration Method Functions}{ The following integration method functions are available: \Sexpr[stage=render,results=rd]{Seurat:::.rd_methods("integration")} } \seealso{ \link[Seurat:writing-integration]{Writing integration method functions} } \concept{integration} Seurat/man/FindBridgeAnchor.Rd0000644000176200001440000000543515056057544015731 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{FindBridgeAnchor} \alias{FindBridgeAnchor} \title{Find bridge anchors between two unimodal datasets} \usage{ FindBridgeAnchor( object.list, bridge.object, object.reduction, bridge.reduction, anchor.type = c("Transfer", "Integration"), reference = NULL, laplacian.reduction = "lap", laplacian.dims = 1:50, reduction = c("direct", "cca"), bridge.assay.name = "Bridge", reference.bridge.stored = FALSE, k.anchor = 20, k.score = 50, verbose = TRUE, ... ) } \arguments{ \item{object.list}{A list of Seurat objects} \item{bridge.object}{A multi-omic bridge Seurat which is used as the basis to represent unimodal datasets} \item{object.reduction}{A list of dimensional reductions from object.list used to be reconstructed by bridge.object} \item{bridge.reduction}{A list of dimensional reductions from bridge.object used to reconstruct object.reduction} \item{anchor.type}{The type of anchors. Can be one of: \itemize{ \item{Integration: Generate IntegrationAnchors for integration} \item{Transfer: Generate TransferAnchors for transfering data} }} \item{reference}{A vector specifying the object/s to be used as a reference during integration or transfer data.} \item{laplacian.reduction}{Name of bridge graph laplacian dimensional reduction} \item{laplacian.dims}{Dimensions used for bridge graph laplacian dimensional reduction} \item{reduction}{Dimensional reduction to perform when finding anchors. Can be one of: \itemize{ \item{cca: Canonical correlation analysis} \item{direct: Use assay data as a dimensional reduction} }} \item{bridge.assay.name}{Assay name used for bridge object reconstruction value (default is 'Bridge')} \item{reference.bridge.stored}{If refernece has stored the bridge dictionary representation} \item{k.anchor}{How many neighbors (k) to use when picking anchors} \item{k.score}{How many neighbors (k) to use when scoring anchors} \item{verbose}{Print messages and progress} \item{...}{Additional parameters passed to \code{FindIntegrationAnchors} or \code{FindTransferAnchors}} } \value{ Returns an \code{\link{AnchorSet}} object that can be used as input to \code{\link{IntegrateEmbeddings}}.or \code{\link{MapQuery}} } \description{ First, bridge object is used to reconstruct two single-modality profiles and then project those cells into bridage graph laplacian space. Next, find a set of anchors between two single-modality objects. These anchors can later be used to integrate embeddings or transfer data from the reference to query object using the \code{\link{MapQuery}} object. } \details{ \itemize{ \item{ Bridge cells reconstruction } \item{ Find anchors between objects. It can be either IntegrationAnchors or TransferAnchor. } } } \keyword{internal} Seurat/man/RidgePlot.Rd0000644000176200001440000000374115056057544014470 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{RidgePlot} \alias{RidgePlot} \title{Single cell ridge plot} \usage{ RidgePlot( object, features, cols = NULL, idents = NULL, sort = FALSE, assay = NULL, group.by = NULL, y.max = NULL, same.y.lims = FALSE, log = FALSE, ncol = NULL, slot = deprecated(), layer = "data", stack = FALSE, combine = TRUE, fill.by = "feature" ) } \arguments{ \item{object}{Seurat object} \item{features}{Features to plot (gene expression, metrics, PC scores, anything that can be retreived by FetchData)} \item{cols}{Colors to use for plotting} \item{idents}{Which classes to include in the plot (default is all)} \item{sort}{Sort identity classes (on the x-axis) by the average expression of the attribute being potted, can also pass 'increasing' or 'decreasing' to change sort direction} \item{assay}{Name of assay to use, defaults to the active assay} \item{group.by}{Group (color) cells in different ways (for example, orig.ident)} \item{y.max}{Maximum y axis value} \item{same.y.lims}{Set all the y-axis limits to the same values} \item{log}{plot the feature axis on log scale} \item{ncol}{Number of columns if multiple plots are displayed} \item{slot}{Slot to pull expression data from (e.g. "counts" or "data")} \item{layer}{Layer to pull expression data from (e.g. "counts" or "data")} \item{stack}{Horizontally stack plots for each feature} \item{combine}{Combine plots into a single \code{\link[patchwork]{patchwork}ed} ggplot object. If \code{FALSE}, return a list of ggplot} \item{fill.by}{Color violins/ridges based on either 'feature' or 'ident'} } \value{ A \code{\link[patchwork]{patchwork}ed} ggplot object if \code{combine = TRUE}; otherwise, a list of ggplot objects } \description{ Draws a ridge plot of single cell data (gene expression, metrics, PC scores, etc.) } \examples{ data("pbmc_small") RidgePlot(object = pbmc_small, features = 'PC_1') } \concept{visualization} Seurat/man/ElbowPlot.Rd0000644000176200001440000000144015056057544014500 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{ElbowPlot} \alias{ElbowPlot} \title{Quickly Pick Relevant Dimensions} \usage{ ElbowPlot(object, ndims = 20, reduction = "pca") } \arguments{ \item{object}{Seurat object} \item{ndims}{Number of dimensions to plot standard deviation for} \item{reduction}{Reduction technique to plot standard deviation for} } \value{ A ggplot object } \description{ Plots the standard deviations (or approximate singular values if running PCAFast) of the principle components for easy identification of an elbow in the graph. This elbow often corresponds well with the significant dims and is much faster to run than Jackstraw } \examples{ data("pbmc_small") ElbowPlot(object = pbmc_small) } \concept{visualization} Seurat/man/PCASigGenes.Rd0000644000176200001440000000206415056057544014624 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dimensional_reduction.R \name{PCASigGenes} \alias{PCASigGenes} \title{Significant genes from a PCA} \usage{ PCASigGenes( object, pcs.use, pval.cut = 0.1, use.full = FALSE, max.per.pc = NULL ) } \arguments{ \item{object}{Seurat object} \item{pcs.use}{PCS to use.} \item{pval.cut}{P-value cutoff} \item{use.full}{Use the full list of genes (from the projected PCA). Assumes that \code{ProjectDim} has been run. Currently, must be set to FALSE.} \item{max.per.pc}{Maximum number of genes to return per PC. Used to avoid genes from one PC dominating the entire analysis.} } \value{ A vector of genes whose p-values are statistically significant for at least one of the given PCs. } \description{ Returns a set of genes, based on the JackStraw analysis, that have statistically significant associations with a set of PCs. } \examples{ data("pbmc_small") PCASigGenes(pbmc_small, pcs.use = 1:2) } \seealso{ \code{\link{ProjectDim}} \code{\link{JackStraw}} } \concept{dimensional_reduction} Seurat/man/CalcDispersion.Rd0000644000176200001440000000136015056057544015474 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing5.R \name{CalcDispersion} \alias{CalcDispersion} \title{Calculate dispersion of features} \usage{ CalcDispersion( object, mean.function = FastExpMean, dispersion.function = FastLogVMR, num.bin = 20, binning.method = "equal_width", verbose = TRUE, ... ) } \arguments{ \item{object}{Data matrix} \item{mean.function}{Function to calculate mean} \item{dispersion.function}{Function to calculate dispersion} \item{num.bin}{Number of bins to use} \item{binning.method}{Method to use for binning. Options are 'equal_width' or 'equal_frequency'} \item{verbose}{Display progress} } \description{ Calculate dispersion of features } \keyword{internal} Seurat/man/SingleImageMap.Rd0000644000176200001440000000113515056057544015414 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{SingleImageMap} \alias{SingleImageMap} \title{A single heatmap from base R using \code{\link[graphics]{image}}} \usage{ SingleImageMap(data, order = NULL, title = NULL) } \arguments{ \item{data}{matrix of data to plot} \item{order}{optional vector of cell names to specify order in plot} \item{title}{Title for plot} } \value{ No return, generates a base-R heatmap using \code{\link[graphics]{image}} } \description{ A single heatmap from base R using \code{\link[graphics]{image}} } \keyword{internal} Seurat/man/LabelPoints.Rd0000644000176200001440000000245015056057544015007 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{LabelPoints} \alias{LabelPoints} \alias{Labeler} \title{Add text labels to a ggplot2 plot} \usage{ LabelPoints( plot, points, labels = NULL, repel = FALSE, xnudge = 0.3, ynudge = 0.05, ... ) } \arguments{ \item{plot}{A ggplot2 plot with a GeomPoint layer} \item{points}{A vector of points to label; if \code{NULL}, will use all points in the plot} \item{labels}{A vector of labels for the points; if \code{NULL}, will use rownames of the data provided to the plot at the points selected} \item{repel}{Use \code{geom_text_repel} to create a nicely-repelled labels; this is slow when a lot of points are being plotted. If using \code{repel}, set \code{xnudge} and \code{ynudge} to 0} \item{xnudge, ynudge}{Amount to nudge X and Y coordinates of labels by} \item{...}{Extra parameters passed to \code{geom_text}} } \value{ A ggplot object } \description{ Add text labels to a ggplot2 plot } \examples{ data("pbmc_small") ff <- TopFeatures(object = pbmc_small[['pca']]) cc <- TopCells(object = pbmc_small[['pca']]) plot <- FeatureScatter(object = pbmc_small, feature1 = ff[1], feature2 = ff[2]) LabelPoints(plot = plot, points = cc) } \seealso{ \code{\link[ggplot2]{geom_text}} } \concept{visualization} Seurat/man/BGTextColor.Rd0000644000176200001440000000223515056057544014730 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{BGTextColor} \alias{BGTextColor} \title{Determine text color based on background color} \source{ \url{https://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color} } \usage{ BGTextColor( background, threshold = 186, w3c = FALSE, dark = "black", light = "white" ) } \arguments{ \item{background}{A vector of background colors; supports R color names and hexadecimal codes} \item{threshold}{Intensity threshold for light/dark cutoff; intensities greater than \code{theshold} yield \code{dark}, others yield \code{light}} \item{w3c}{Use \href{https://www.w3.org/TR/WCAG20/}{W3C} formula for calculating background text color; ignores \code{threshold}} \item{dark}{Color for dark text} \item{light}{Color for light text} } \value{ A named vector of either \code{dark} or \code{light}, depending on \code{background}; names of vector are \code{background} } \description{ Determine text color based on background color } \examples{ BGTextColor(background = c('black', 'white', '#E76BF3')) } \concept{visualization} Seurat/man/Read10X_Image.Rd0000644000176200001440000000207015056057544015037 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{Read10X_Image} \alias{Read10X_Image} \title{Load a 10X Genomics Visium Image} \usage{ Read10X_Image( image.dir, image.name = "tissue_lowres_image.png", assay = "Spatial", slice = "slice1", filter.matrix = TRUE, image.type = "VisiumV2" ) } \arguments{ \item{image.dir}{Path to directory with 10X Genomics visium image data; should include files \code{tissue_lowres_image.png}, \code{scalefactors_json.json} and \code{tissue_positions_list.csv}} \item{image.name}{PNG file to read in} \item{assay}{Name of associated assay} \item{slice}{Name for the image, used to populate the instance's key} \item{filter.matrix}{Filter spot/feature matrix to only include spots that have been determined to be over tissue} \item{image.type}{Image type to return, one of: "VisiumV1" or "VisiumV2"} } \value{ A \code{\link{VisiumV2}} object } \description{ Load a 10X Genomics Visium Image } \seealso{ \code{\link{VisiumV2}} \code{\link{Load10X_Spatial}} } \concept{preprocessing} Seurat/man/as.sparse.Rd0000644000176200001440000000256715116120241014461 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R, R/utilities.R \name{as.sparse.H5Group} \alias{as.sparse.H5Group} \alias{as.data.frame.Matrix} \title{Cast to Sparse} \usage{ \method{as.sparse}{H5Group}(x, ...) \method{as.data.frame}{Matrix}( x, row.names = NULL, optional = FALSE, ..., stringsAsFactors = getOption(x = "stringsAsFactors", default = FALSE) ) } \arguments{ \item{x}{An object} \item{...}{Arguments passed to other methods} \item{row.names}{\code{NULL} or a character vector giving the row names for the data; missing values are not allowed} \item{optional}{logical. If \code{TRUE}, setting row names and converting column names (to syntactic names: see \code{\link[base]{make.names}}) is optional. Note that all of \R's \pkg{base} package \code{as.data.frame()} methods use \code{optional} only for column names treatment, basically with the meaning of \code{\link[base]{data.frame}(*, check.names = !optional)}. See also the \code{make.names} argument of the \code{matrix} method.} \item{stringsAsFactors}{logical: should the character vector be converted to a factor?} } \value{ \code{as.data.frame.Matrix}: A data frame representation of the S4 Matrix } \description{ Cast to Sparse } \seealso{ \code{\link[SeuratObject:as.sparse]{SeuratObject::as.sparse}} } \concept{objects} \concept{utilities} Seurat/man/PredictAssay.Rd0000644000176200001440000000255515056057544015174 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/clustering.R \name{PredictAssay} \alias{PredictAssay} \title{Predict value from nearest neighbors} \usage{ PredictAssay( object, nn.idx, assay, reduction = NULL, dims = NULL, return.assay = TRUE, slot = "scale.data", features = NULL, mean.function = rowMeans, seed = 4273, verbose = TRUE ) } \arguments{ \item{object}{The object used to calculate knn} \item{nn.idx}{k near neighbor indices. A cells x k matrix.} \item{assay}{Assay used for prediction} \item{reduction}{Cell embedding of the reduction used for prediction} \item{dims}{Number of dimensions of cell embedding} \item{return.assay}{Return an assay or a predicted matrix} \item{slot}{slot used for prediction} \item{features}{features used for prediction} \item{mean.function}{the function used to calculate row mean} \item{seed}{Sets the random seed to check if the nearest neighbor is query cell} \item{verbose}{Print progress} } \value{ return an assay containing predicted expression value in the data slot } \description{ This function will predict expression or cell embeddings from its k nearest neighbors index. For each cell, it will average its k neighbors value to get its new imputed value. It can average expression value in assays and cell embeddings from dimensional reductions. } \concept{integration} Seurat/man/BuildClusterTree.Rd0000644000176200001440000000400315056057544016010 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tree.R \name{BuildClusterTree} \alias{BuildClusterTree} \title{Phylogenetic Analysis of Identity Classes} \usage{ BuildClusterTree( object, assay = NULL, features = NULL, dims = NULL, reduction = "pca", graph = NULL, slot = "data", reorder = FALSE, reorder.numeric = FALSE, verbose = TRUE ) } \arguments{ \item{object}{Seurat object} \item{assay}{Assay to use for the analysis.} \item{features}{Genes to use for the analysis. Default is the set of variable genes (\code{VariableFeatures(object = object)})} \item{dims}{If set, tree is calculated in dimension reduction space; overrides \code{features}} \item{reduction}{Name of dimension reduction to use. Only used if \code{dims} is not NULL.} \item{graph}{If graph is passed, build tree based on graph connectivity between clusters; overrides \code{dims} and \code{features}} \item{slot}{slot/layer to use.} \item{reorder}{Re-order identity classes (factor ordering), according to position on the tree. This groups similar classes together which can be helpful, for example, when drawing violin plots.} \item{reorder.numeric}{Re-order identity classes according to position on the tree, assigning a numeric value ('1' is the leftmost node)} \item{verbose}{Show progress updates} } \value{ A Seurat object where the cluster tree can be accessed with \code{\link{Tool}} } \description{ Constructs a phylogenetic tree relating the 'aggregate' cell from each identity class. Tree is estimated based on a distance matrix constructed in either gene expression space or PCA space. } \details{ Note that the tree is calculated for an 'aggregate' cell, so gene expression or PC scores are summed across all cells in an identity class before the tree is constructed. } \examples{ \dontrun{ if (requireNamespace("ape", quietly = TRUE)) { data("pbmc_small") pbmc_small pbmc_small <- BuildClusterTree(object = pbmc_small) Tool(object = pbmc_small, slot = 'BuildClusterTree') } } } \concept{tree} Seurat/man/TopNeighbors.Rd0000644000176200001440000000075415056057544015203 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{TopNeighbors} \alias{TopNeighbors} \title{Get nearest neighbors for given cell} \usage{ TopNeighbors(object, cell, n = 5) } \arguments{ \item{object}{\code{\link[SeuratObject]{Neighbor}} object} \item{cell}{Cell of interest} \item{n}{Number of neighbors to return} } \value{ Returns a vector of cell names } \description{ Return a vector of cell names of the nearest n cells. } \concept{objects} Seurat/man/GroupCorrelation.Rd0000644000176200001440000000212515056057544016070 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{GroupCorrelation} \alias{GroupCorrelation} \title{Compute the correlation of features broken down by groups with another covariate} \usage{ GroupCorrelation( object, assay = NULL, slot = "scale.data", var = NULL, group.assay = NULL, min.cells = 5, ngroups = 6, do.plot = TRUE ) } \arguments{ \item{object}{Seurat object} \item{assay}{Assay to pull the data from} \item{slot}{Slot in the assay to pull feature expression data from (counts, data, or scale.data)} \item{var}{Variable with which to correlate the features} \item{group.assay}{Compute the gene groups based off the data in this assay.} \item{min.cells}{Only compute for genes in at least this many cells} \item{ngroups}{Number of groups to split into} \item{do.plot}{Display the group correlation boxplot (via \code{GroupCorrelationPlot})} } \value{ A Seurat object with the correlation stored in metafeatures } \description{ Compute the correlation of features broken down by groups with another covariate } \concept{utilities} Seurat/man/HoverLocator.Rd0000644000176200001440000000167415056057544015211 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{HoverLocator} \alias{HoverLocator} \title{Hover Locator} \usage{ HoverLocator(plot, information = NULL, axes = TRUE, dark.theme = FALSE, ...) } \arguments{ \item{plot}{A ggplot2 plot} \item{information}{An optional dataframe or matrix of extra information to be displayed on hover} \item{axes}{Display or hide x- and y-axes} \item{dark.theme}{Plot using a dark theme?} \item{...}{Extra parameters to be passed to \code{\link[plotly]{layout}}} } \description{ Get quick information from a scatterplot by hovering over points } \examples{ \dontrun{ data("pbmc_small") plot <- DimPlot(object = pbmc_small) HoverLocator(plot = plot, information = FetchData(object = pbmc_small, vars = 'percent.mito')) } } \seealso{ \code{\link[plotly]{layout}} \code{\link[ggplot2]{ggplot_build}} \code{\link{DimPlot}} \code{\link{FeaturePlot}} } \concept{visualization} Seurat/DESCRIPTION0000644000176200001440000001704315117462442013236 0ustar liggesusersPackage: Seurat Version: 5.4.0 Title: Tools for Single Cell Genomics Description: A toolkit for quality control, analysis, and exploration of single cell RNA sequencing data. 'Seurat' aims to enable users to identify and interpret sources of heterogeneity from single cell transcriptomic measurements, and to integrate diverse types of single cell data. See Satija R, Farrell J, Gennert D, et al (2015) , Macosko E, Basu A, Satija R, et al (2015) , Stuart T, Butler A, et al (2019) , and Hao, Hao, et al (2020) for more details. Authors@R: c( person(given = "Andrew", family = "Butler", email = "abutler@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0003-3608-0463")), person(given = "Saket", family = "Choudhary", email = "schoudhary@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0001-5202-7633")), person(given = 'David', family = 'Collins', email = 'dcollins@nygenome.org', role = 'ctb', comment = c(ORCID = '0000-0001-9243-7821')), person(given = "Charlotte", family = "Darby", email = "cdarby@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0003-2195-5300")), person(given = "Jeff", family = "Farrell", email = "jfarrell@g.harvard.edu", role = "ctb"), person(given = "Isabella", family = "Grabski", email = "igrabski@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0002-0616-5469")), person(given = "Christoph", family = "Hafemeister", email = "chafemeister@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0001-6365-8254")), person(given = "Yuhan", family = "Hao", email = "yhao@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0002-1810-0822")), person(given = "Austin", family = "Hartman", email = "ahartman@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0001-7278-1852")), person(given = "Paul", family = "Hoffman", email = "hoff0792@umn.edu", role = "ctb", comment = c(ORCID = "0000-0002-7693-8957")), person(given = "Jaison", family = "Jain", email = "jjain@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0002-9478-5018")), person(given = "Longda", family = "Jiang", email = "ljiang@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0003-4964-6497")), person(given = "Madeline", family = "Kowalski", email = "mkowalski@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0002-5655-7620")), person(given = "Skylar", family = "Li", email = "sli@nygenome.org", role = "ctb"), person(given = "Brian", family = "Zhang", email = "brianzhang@nygenome.org", role = "ctb"), person(given = "Gesmira", family = "Molla", email = 'gmolla@nygenome.org', role = 'ctb', comment = c(ORCID = '0000-0002-8628-5056')), person(given = "Efthymia", family = "Papalexi", email = "epapalexi@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0001-5898-694X")), person(given = "Patrick", family = "Roelli", email = "proelli@nygenome.org", role = "ctb"), person(given = "Rahul", family = "Satija", email = "seurat@nygenome.org", role = c("aut", "cre"), comment = c(ORCID = "0000-0001-9448-8833")), person(given = "Karthik", family = "Shekhar", email = "kshekhar@berkeley.edu", role = "ctb"), person(given = "Anagha", family = "Shenoy", email = "ashenoy@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0002-0537-6862")), person(given = "Avi", family = "Srivastava", email = "asrivastava@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0001-9798-2079")), person(given = "Tim", family = "Stuart", email = "tstuart@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0002-3044-0897")), person(given = "Kristof", family = "Torkenczy", email = "", role = "ctb", comment = c(ORCID = "0000-0002-4869-7957")), person(given = "Brian", family = "Zhang", email = "brianzhang@nygenome.org", role = "ctb"), person(given = "Shiwei", family = "Zheng", email = "szheng@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0001-6682-6743")), person("Satija Lab and Collaborators", role = "fnd") ) License: MIT + file LICENSE URL: https://satijalab.org/seurat, https://github.com/satijalab/seurat BugReports: https://github.com/satijalab/seurat/issues Additional_repositories: https://satijalab.r-universe.dev, https://bnprks.r-universe.dev Depends: R (>= 4.0.0), methods, SeuratObject (>= 5.0.2) Imports: cluster, cowplot, fastDummies, fitdistrplus, future, future.apply, generics (>= 0.1.3), ggplot2 (>= 3.3.0), ggrepel, ggridges, graphics, grDevices, grid, httr, ica, igraph, irlba, jsonlite, KernSmooth, lifecycle, lmtest, MASS, Matrix (>= 1.5-0), matrixStats, miniUI, patchwork, pbapply, plotly (>= 4.9.0), png, progressr, RANN, RColorBrewer, Rcpp (>= 1.0.7), RcppAnnoy (>= 0.0.18), RcppHNSW, reticulate, rlang, ROCR, RSpectra, Rtsne, scales, scattermore (>= 1.2), sctransform (>= 0.4.1), shiny, spatstat.explore, spatstat.geom, stats, tibble, tools, utils, uwot (>= 0.1.10) Suggests: ape, arrow, base64enc, Biobase, BiocGenerics, BPCells, data.table, DESeq2, DelayedArray, enrichR, GenomicRanges, GenomeInfoDb, glmGamPoi, ggrastr, harmony, hdf5r, IRanges, leidenbase, limma, magrittr, MAST, metap, mixtools, monocle, presto, rsvd, R.utils, Rfast2, rtracklayer, S4Vectors, sf (>= 1.0.0), sp, SingleCellExperiment, SummarizedExperiment, testthat, VGAM LinkingTo: Rcpp (>= 0.11.0), RcppEigen, RcppProgress BuildManual: true Encoding: UTF-8 LazyData: true RoxygenNote: 7.3.3 Collate: 'RcppExports.R' 'reexports.R' 'generics.R' 'clustering.R' 'visualization.R' 'convenience.R' 'data.R' 'differential_expression.R' 'dimensional_reduction.R' 'integration.R' 'zzz.R' 'integration5.R' 'mixscape.R' 'objects.R' 'preprocessing.R' 'preprocessing5.R' 'roxygen.R' 'sketching.R' 'tree.R' 'utilities.R' NeedsCompilation: yes Packaged: 2025-12-13 18:33:13 UTC; root Author: Andrew Butler [ctb] (ORCID: ), Saket Choudhary [ctb] (ORCID: ), David Collins [ctb] (ORCID: ), Charlotte Darby [ctb] (ORCID: ), Jeff Farrell [ctb], Isabella Grabski [ctb] (ORCID: ), Christoph Hafemeister [ctb] (ORCID: ), Yuhan Hao [ctb] (ORCID: ), Austin Hartman [ctb] (ORCID: ), Paul Hoffman [ctb] (ORCID: ), Jaison Jain [ctb] (ORCID: ), Longda Jiang [ctb] (ORCID: ), Madeline Kowalski [ctb] (ORCID: ), Skylar Li [ctb], Brian Zhang [ctb], Gesmira Molla [ctb] (ORCID: ), Efthymia Papalexi [ctb] (ORCID: ), Patrick Roelli [ctb], Rahul Satija [aut, cre] (ORCID: ), Karthik Shekhar [ctb], Anagha Shenoy [ctb] (ORCID: ), Avi Srivastava [ctb] (ORCID: ), Tim Stuart [ctb] (ORCID: ), Kristof Torkenczy [ctb] (ORCID: ), Brian Zhang [ctb], Shiwei Zheng [ctb] (ORCID: ), Satija Lab and Collaborators [fnd] Maintainer: Rahul Satija Repository: CRAN Date/Publication: 2025-12-14 07:20:02 UTC