TSP/0000755000176200001440000000000015111765531010725 5ustar liggesusersTSP/tests/0000755000176200001440000000000015001730346012061 5ustar liggesusersTSP/tests/testthat/0000755000176200001440000000000015111765531013727 5ustar liggesusersTSP/tests/testthat/test-insert_cut_etc.R0000644000176200001440000000413315001730346020034 0ustar liggesuserslibrary("testthat") library("TSP") data("USCA50") context("insert_dummy") tsp <- insert_dummy(USCA50, label = "cut") #labels(tsp) expect_equal(n_of_cities(tsp), n_of_cities(USCA50) + 1L) expect_equal(labels(tsp), c(labels(USCA50), "cut")) tsp5 <- insert_dummy(USCA50, n = 5, label = "cut") #labels(tsp5) expect_equal(n_of_cities(tsp5), n_of_cities(USCA50) + 5L) expect_equal(labels(tsp5), c(labels(USCA50), rep("cut", 5))) context("cut_tour") tour <- solve_TSP(tsp5) path <- cut_tour(tour, "cut") expect_equal(sum(sapply(path, length)), n_of_cities(USCA50)) #labels(tour) #path ## border cases tour <- TOUR(1:10) expect_equal(cut_tour(tour, "1"), 2:10) expect_equal(cut_tour(tour, 1), 2:10) expect_equal(cut_tour(tour, "10"), 1:9) expect_equal(cut_tour(tour, 10), 1:9) path <- cut_tour(tour, 1:3) expect_equal(length(path), 3L) expect_equal(sum(sapply(path, length)), length(tour) - 3L) #path path <- cut_tour(tour, 1:3, exclude_cut = FALSE) expect_equal(length(path), 3L) expect_equal(sum(sapply(path, length)), length(tour)) #path path <- cut_tour(tour, 8:10) expect_equal(length(path), 3L) expect_equal(sum(sapply(path, length)), length(tour) - 3L) #path path <- cut_tour(tour, 8:10, exclude_cut = FALSE) expect_equal(length(path), 3L) expect_equal(sum(sapply(path, length)), length(tour)) #path tour <- TOUR(1) path <- cut_tour(tour, 1) expect_equal(length(path), 0L) #path path <- cut_tour(tour, 1, exclude_cut = FALSE) expect_equal(length(path), 1L) #path context("reformulate") ## reformulate atsp <- as.ATSP(USCA50) expect_equal(tour_length(USCA50), tour_length(atsp)) tsp <- reformulate_ATSP_as_TSP(atsp, cheap = 0) expect_equal(n_of_cities(atsp)*2, n_of_cities(tsp)) ## only Concorde guarantees to find the optimal solution skip_if_not( Sys.which("concorde") != "" && Sys.which("linkern") != "", message = "skipped test for concorde/linkern. Not installed.") v <- FALSE tour_tsp <- solve_TSP(tsp, method = "concorde", verbose = v) tour_atsp <- filter_ATSP_as_TSP_dummies(tour_tsp, atsp) expect_equal(length(tour_atsp), n_of_cities(USCA50)) expect_equal(tour_length(tour_tsp), tour_length(tour_atsp)) TSP/tests/testthat/test-ETSP.R0000644000176200001440000000070515001730346015576 0ustar liggesuserslibrary(TSP) library(testthat) context("ETSP") x <- data.frame(x = runif(20), y = runif(20), row.names = LETTERS[1:20]) ## create a TSP etsp <- ETSP(x) etsp ## use some methods expect_equal(n_of_cities(etsp), 20L) expect_equal(labels(etsp), LETTERS[1:20]) ## solve tour <- solve_TSP(etsp) tour ## compare tour_length expect_equal(tour_length(etsp), tour_length(as.TSP(etsp))) expect_equal(tour_length(tour, etsp), tour_length(tour, as.TSP(etsp))) TSP/tests/testthat/test-solve_TSP.R0000644000176200001440000000451715001730346016706 0ustar liggesuserslibrary(TSP) library(testthat) context("solve_TSP") m <- rbind( c(0, 1, 0, 1), c(1, 0, 1, Inf), c(0, 1, 0, 1), c(1, Inf, 1, 0) ) d <- as.dist(m) tsp <- TSP(d) tsp ## from matrix should give the same result expect_equal(as.numeric(tsp), as.numeric(TSP(as.matrix(d)))) ## test error on NA tsp_na <- tsp tsp_na[4] <- NA expect_error(o <- solve_TSP(tsp_na)) ## test Inf methods <- c("nearest_insertion", "cheapest_insertion", "farthest_insertion", "arbitrary_insertion", "nn", "repetitive_nn", "two_opt", "random", "identity") tours <- lapply(methods, FUN = function(m) solve_TSP(tsp, method = m)) names(tours) <- methods #tours tl <- sapply(tours, attr, "tour_length") expect_true(all(tl == 4 | tl == Inf)) ## test rep res <- solve_TSP(tsp, rep=10) tl <- attr("res", "tour_length") expect_true(all(tl == 4 | tl == Inf)) ## no two_opt res <- solve_TSP(tsp, two_opt=FALSE) tl <- attr("res", "tour_length") expect_true(all(tl == 4 | tl == Inf)) ## test special case: two cities d <- dist(rbind(c(0,0), c(1,1))) tsp2 <- TSP(d) tours2 <- lapply(methods, FUN = function(m) solve_TSP(tsp2, method = m)) expect_true(all(sapply(tours2, attr, "tour_length") == as.numeric(d)*2)) ## test special case: one city tsp1 <- TSP(dist(1)) tours1 <- lapply(methods, FUN = function(m) solve_TSP(tsp1, method = m)) expect_true(all(sapply(tours1, attr, "tour_length") == 0)) ## test ATSP (just for errors) #data <- matrix(runif(5^2), ncol = 5, dimnames = list(1:5, 1:5)) data <- structure(c(0.13930352916941, 0.897691324818879, 0.509101516567171, 0.430898967897519, 0.141799068776891, 0.0334562903735787, 0.902805947931483, 0.203576791565865, 0.435874363640323, 0.0641707226168364, 0.101683554705232, 0.631239329231903, 0.555331876967102, 0.0829615572001785, 0.272443652851507, 0.215095571940765, 0.532841097796336, 0.795302660670131, 0.43256876245141, 0.582661165855825, 0.250269076088443, 0.164849652675912, 0.638499777996913, 0.857200765516609, 0.0134391817264259), .Dim = c(5L, 5L), .Dimnames = list( c("1", "2", "3", "4", "5"), c("1", "2", "3", "4", "5"))) # best solution is 0.8082826 atsp <- ATSP(data) methods <- c("nearest_insertion", "cheapest_insertion", "farthest_insertion", "arbitrary_insertion", "nn", "repetitive_nn", "two_opt", "random", "identity") tours <- lapply(methods, FUN = function(m) solve_TSP(atsp, method = m)) names(tours) <- methods TSP/tests/testthat/test-TSPLIB.R0000644000176200001440000000173415001730346016023 0ustar liggesuserslibrary(TSP) library(testthat) context("TSPLIB") set.seed(1234) x <- data.frame(x=runif(5), y=runif(5)) ## create TSP, ATSP and ETSP (2D) d <- round(dist(x), 3) ## TSP tsp <- TSP(d) tsp write_TSPLIB(tsp, file="example.tsp", precision = 6) #file.show("example.tsp") r <- read_TSPLIB("example.tsp", precision = 6) expect_equivalent(tsp, r) ## ATSP atsp <- ATSP(d) atsp write_TSPLIB(atsp, file="example.tsp", precision = 6) #file.show("example.tsp") r <- read_TSPLIB("example.tsp", precision = 6) expect_equivalent(atsp, r) ## ETSP (2D) etsp <- ETSP(round(x[,1:2], 3)) etsp write_TSPLIB(etsp, file="example.tsp", precision = 6) #file.show("example.tsp") r <- read_TSPLIB("example.tsp", precision = 6) expect_equivalent(etsp, r) ## Infinity d[2] <- Inf tsp <- TSP(d) write_TSPLIB(tsp, file="example.tsp", precision = 6) r <- read_TSPLIB("example.tsp", precision = 6) expect_equivalent(tsp[-2], r[-2]) expect_gt(r[2], range(tsp, finite = TRUE)[2]) ## clean up unlink("example.tsp") TSP/tests/testthat/test-concorde.R0000644000176200001440000000563615001730346016627 0ustar liggesuserslibrary(TSP) library(testthat) context("solve_TSP (Concorde and Linkern)") m <- rbind( c(0, 1, 0, 1), c(1, 0, 1, Inf), c(0, 1, 0, 1), c(1, Inf, 1, 0) ) d <- as.dist(m) tsp <- TSP(d) tsp skip_if_not( Sys.which("concorde") != "" && Sys.which("linkern") != "", message = "skipped test for concorde/linkern. Not installed.") v <- FALSE o <- solve_TSP(tsp, method="concorde", verbose = v) expect_equivalent(tour_length(tsp, o), 4) # large numbers should be scaled right. expect_warning(o_large <- solve_TSP(tsp*2^15, method="concorde", verbose = v), regex = "Converting the provided distances to integers") expect_equivalent(o, o_large) expect_warning(o_large <- solve_TSP(tsp*10^10, method="concorde", verbose = v), regex = "Converting the provided distances to integers") expect_equivalent(o, o_large) # expect warning for rounding expect_warning(o_large <- solve_TSP(tsp*2^15+0.1, method="concorde", verbose = v), regex = "Converting the provided distances to integers") expect_equivalent(o, o_large) # expect a warning for rounding expect_warning(o_round <- solve_TSP(tsp/0.3, method="concorde", verbose = v), regex = "Converting the provided distances to integers") expect_equivalent(o, o_round) o <- solve_TSP(tsp, method="linkern", verbose = v) expect_equivalent(tour_length(tsp, o), 4) # test ATSP #data <- matrix(runif(5^2), ncol = 5, dimnames = list(1:5, 1:5)) data <- structure(c(0.13930352916941, 0.897691324818879, 0.509101516567171, 0.430898967897519, 0.141799068776891, 0.0334562903735787, 0.902805947931483, 0.203576791565865, 0.435874363640323, 0.0641707226168364, 0.101683554705232, 0.631239329231903, 0.555331876967102, 0.0829615572001785, 0.272443652851507, 0.215095571940765, 0.532841097796336, 0.795302660670131, 0.43256876245141, 0.582661165855825, 0.250269076088443, 0.164849652675912, 0.638499777996913, 0.857200765516609, 0.0134391817264259), .Dim = c(5L, 5L), .Dimnames = list( c("1", "2", "3", "4", "5"), c("1", "2", "3", "4", "5"))) atsp <- ATSP(data) ## Concorde (gives conversation warning for reformulation of ATSP to TSP) expect_warning(o1 <- solve_TSP(atsp, method = "concorde", verbose = v), regex = "Solver cannot solve the ATSP directly") o2 <- solve_TSP(atsp, method = "concorde", as_TSP = TRUE, verbose = v) expect_equal(length(o1), 5L) expect_equal(length(o2), 5L) # Concorde should find the optimal solution of 0.8082826 expect_equal(round(tour_length(o1), 7), 0.8082826) expect_equal(round(tour_length(o2), 7), 0.8082826) ## Linkern ## warning for reformulate as TSP automatically expect_warning(o1 <- solve_TSP(atsp, method = "linkern", verbose = v), regex = "Solver cannot solve the ATSP directly") o2 <- solve_TSP(atsp, method = "linkern", as_TSP = TRUE, verbose = v) expect_equal(length(o1), 5L) expect_equal(length(o2), 5L) # Linkern should find the optimal solution of 0.8082826 expect_equal(round(tour_length(o1), 7), 0.8082826) expect_equal(round(tour_length(o2), 7), 0.8082826) TSP/tests/testthat.R0000644000176200001440000000007015001730346014041 0ustar liggesuserslibrary("testthat") library("TSP") test_check("TSP") TSP/MD50000644000176200001440000000616515111765531011245 0ustar liggesusersf5168f1e96b305476e7befe363d58dac *DESCRIPTION a22e52650bbc8c2e5714bdea84406e3c *NAMESPACE 6df1fa4c2e7cd7f06f86347f1d2e680d *NEWS.md b3a0ca8ef33fcb7b854d7b3b58f67532 *R/AAA_TSP-package.R c0e1ac01ade2dca1f4203cd9a7655b38 *R/AAA_parameter.R 9db80d2422f37bb05ced61d75be3ebe7 *R/ATSP.R 47ea35ab7b5eee9515b29f42899845b6 *R/ETSP.R 88a5897e489cc8e3ca88c191ee94f651 *R/TOUR.R 92e6d885be089801bc15faead45452df *R/TSP.R 85206f84784045dd3db7dcaf1cdab068 *R/TSPLIB.R e2f164c656627a98f2643c77ca8f6a9c *R/USCA312.R b2fd8bac405b43750bb1610718506bfa *R/cut_tour.R 983685c5b48493021e2cb6c7e6aeeef4 *R/insert_dummy.R 759852269e8d5d3fd5de71e105142ecc *R/reformulare_ATSP_as_TSP.R 8d7b681ab4ccf68208dd1031ab06a9a2 *R/solve_TSP.R 24553b3b5d5d19cb7dbcd900411fb70e *R/tour_length.R 4158db3e9eedb07b697e67c93c5786f0 *R/tsp_SA.R 13eccd9af4473c263a0b267355859f3f *R/tsp_concorde.R 3c03da9d9c9a7ae776556b6a9e59d658 *R/tsp_insertion.R 8f36b9583513e1e9526beaaa4285b857 *R/tsp_nn.R 9ec8f13ea9c0935151f0c6b9096a55b8 *R/tsp_two_opt.R ffa13d3a987cd57b31d51d8edf6ef57a *README.md 76e123f5dcc8dee07678412adc0a2a84 *build/partial.rdb 11d682a843d8f75c748b4785c331a675 *build/vignette.rds cbc08fbda69c99bfd002bd94e83f18e9 *data/USCA312.rda 4e7f660688a4bc16dee5b14a5a9a41c3 *data/USCA312_GPS.rda 654e60750bbc434a2c4ef01f6ac38885 *data/USCA50.rda f06eaa5d43b10fb3fff425ea6e60bfc7 *inst/CITATION c2db6dce7ac2f2e8e9aef6c69a7d9377 *inst/README_files/unnamed-chunk-6-1.png 8d113c7f0845f9379b7e1a4befea4870 *inst/doc/TSP.R 7d0e7e741518b21e836f7c0d60744de6 *inst/doc/TSP.Rnw fd180417492776ca99ebd0c65269781a *inst/doc/TSP.pdf 9d75b7ee2a0295809647546e2caec298 *inst/examples/d493.tsp bbcb69ecae3f79ade0f4312e5d603e8d *man/ATSP.Rd 76db971f1262ee0ded0994544d479dee *man/Concorde.Rd fd19cb0cfac14982cd5528863841b0cf *man/ETSP.Rd dc7d95e3024d23317f2fa4f4a30f2ea7 *man/TOUR.Rd 8e22ed56d6886c7da7bd950247ea4143 *man/TSP-package.Rd 2cb1ebdacc6f0f79e484e6aa6e990690 *man/TSP.Rd bc2d54a0bbcab65ca92a28f96e3761eb *man/TSPLIB.Rd 2ded294f8969cbcf772ea3a86054d77d *man/USCA.Rd fe61a8d6f99ca35fd9e73d2aec010688 *man/cut_tour.Rd 85b2a1befff39b63d07b787268e0b995 *man/figures/logo.svg 6376bd297817b97611602264bd3b01c4 *man/insert_dummy.Rd 180b6ad59df3ffa450fe93121adf4132 *man/reformulate_ATSP_as_TSP.Rd 3ca66e89f2662576afa12b6976b01341 *man/solve_TSP.Rd 1b7562cd9fd001811d8370c558eb6d70 *man/tour_length.Rd f0276d6a12d50703983732ab3dc0240a *src/dll.c fc6380482b910ae85f24f5f2dafd99b9 *src/insertion_cost.c a6aaa1c2435490a41f41a4b5c0c3ba7c *src/matrix_pos.h 3086f08677dfbd91cf438867a26d5114 *src/tour_length.c c52e2ddbd6678b80c7388f8574708a2c *src/two_opt.c 3703922de28f16a1f0bd1ca82302cb51 *tests/testthat.R 6cc29a47b81c493ef81b21b3b871138e *tests/testthat/test-ETSP.R efc5545170e5a3a8cf6792c5abc140f8 *tests/testthat/test-TSPLIB.R 85fee4ffde4907f1da64c1fa6a7f3375 *tests/testthat/test-concorde.R 00853d4a02dc8fa428c3199c34e18443 *tests/testthat/test-insert_cut_etc.R 998eecca7ceecf1bffb9b82d7305e430 *tests/testthat/test-solve_TSP.R 7d0e7e741518b21e836f7c0d60744de6 *vignettes/TSP.Rnw 608e3c186d39f36048d83f6ad0e6906b *vignettes/TSP.bib c760b2e30089afe4035f4c86a0faca1a *vignettes/overview.odg 76b5cfce452ac70b4c4b51bf5164887d *vignettes/overview.pdf TSP/R/0000755000176200001440000000000015100704002011106 5ustar liggesusersTSP/R/ATSP.R0000644000176200001440000001034415001730346012014 0ustar liggesusers####################################################################### # TSP - Traveling Salesperson Problem # Copyrigth (C) 2011 Michael Hahsler and Kurt Hornik # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ## create a (asymmetric) ATSP problem #' Class ATSP -- Asymmetric traveling salesperson problem #' #' Constructor to create an instance of the asymmetric traveling salesperson #' problem (ATSP) and some auxiliary methods. #' #' Objects of class `ATSP` are internally represented by a matrix (use #' `as.matrix()` to get just the matrix). #' #' ATSPs can be transformed into (larger) symmetric TSPs using #' [reformulate_ATSP_as_TSP()]. #' #' @family TSP #' #' @param x,object an object (a square matrix) to be converted into an #' `ATSP` or, for the methods, an object of class `ATSP`. #' @param labels optional city labels. If not given, labels are taken from #' `x`. #' @param method optional name of the distance metric. #' @param col color scheme for image. #' @param order order of cities as an integer vector or an object of class #' `TOUR`. #' @param ... further arguments are passed on. #' @returns #' - `ATSP()` returns `x` as an object of class `ATSP`. #' - `n_of_cities()` returns the number of cities in `x`. #' - `labels()` returns a vector with the names of the cities in `x`. #' @author Michael Hahsler #' @keywords classes #' @examples #' data <- matrix(runif(10^2), ncol = 10, dimnames = list(1:10, 1:10)) #' #' atsp <- ATSP(data) #' atsp #' #' ## use some methods #' n_of_cities(atsp) #' labels(atsp) #' #' ## calculate a tour #' tour <- solve_TSP(atsp, method = "nn") #' tour #' #' tour_length(tour) #' #' image(atsp, tour) #' @export ATSP <- function(x, labels = NULL, method = NULL) { if(inherits(x, "ATSP")) return(x) atsp <- as.ATSP(x) if(!is.null(labels)) dimnames(atsp) <- list(labels, labels) if(!is.null(method)) attr(atsp, "method") <- method atsp } #' @rdname ATSP #' @export as.ATSP <- function(x) UseMethod("as.ATSP") #' @rdname ATSP #' @export as.ATSP.matrix <- function(x){ .isSquare <- function(x) (dim(x)[1] == dim(x)[2]) if(!.isSquare(x)) stop("ATSP requires a square matrix") ## check for NAs if(any(is.nan(x))) stop(paste(sQuote("NAs"), "not supported")) ## make sure we have labels if(is.null(dimnames(x))) dimnames(x) <- list(1:dim(x)[1], 1: dim(x)[1]) if(is.null(colnames(x))) colnames(x) <- rownames(x) if(is.null(rownames(x))) rownames(x) <- colnames(x) ## make sure data is numeric mode(x) <- "numeric" class(x) <- c("ATSP", class(x)) x } #' @rdname ATSP #' @export as.ATSP.dist <- function(x){ method <- attr(x, "method") x <- as.ATSP(as.matrix(x)) ## make sure data is numeric mode(x) <- "numeric" class(x) <- c("ATSP", class(x)) attr(x, "method") <- method x } ## print #' @rdname ATSP #' @export print.ATSP <- function(x, ...) { method <- attr(x, "method") if(is.null(method)) method <- "unknown" cat("object of class", sQuote(class(x)[1]), " (asymmetric TSP) \n") cat(n_of_cities(x), "cities", paste("(distance ", sQuote(method),")", sep=""), "\n") } ## number of cities #' @rdname ATSP #' @export n_of_cities.ATSP <- function(x) nrow(x) ## labels #' @rdname ATSP #' @export labels.ATSP <- function(object, ...) dimnames(object)[[1]] ## image #' @rdname ATSP #' @export image.ATSP <- function(x, order, col = gray.colors(64), ...) { p <- n_of_cities(x) if(missing(order)) order <- 1:p graphics::image.default(1:p, 1:p, x[order, order], col = col, ...) } ## coerce to matrix #' @rdname ATSP #' @export as.matrix.ATSP <- function(x, ...){ unclass(x) } TSP/R/TSPLIB.R0000644000176200001440000002413615111646662012257 0ustar liggesusers####################################################################### # TSP - Traveling Salesperson Problem # Copyrigth (C) 2011 Michael Hahsler and Kurt Hornik # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. #' Read and write TSPLIB files #' #' Reads and writes TSPLIB format files. TSPLIB files can be used by most TSP #' solvers. Many problems in TSPLIB format can be found in the local #' copy of the [TSPLIB95 problem library](https://github.com/mhahsler/TSP/tree/master/TSPLIB95). #' #' #' In the TSPLIB format distances are represented by integer values. Therefore, #' if `x` contains `double` values (which is normal in R) the values #' given in `x` are multiplied by \eqn{10^{precision}} before coercion to #' `integer`. Note that therefore all results produced by programs using #' the TSPLIB file as input need to be divided by \eqn{10^{precision}} (i.e., #' the decimal point has to be shifted `precision` placed to the left). #' #' Currently only the following `EDGE_WEIGHT_TYPE`s are implemented: #' `EXPLICIT`, `EUC_2D` and `EUC_3D`. #' #' @name TSPLIB #' @aliases TSPLIB #' @family TSP #' #' @param x an object with a TSP problem. #' `NA`s are not allowed. #' @param file file name or a [connection]. #' @param precision controls the number of decimal places used to represent #' distances (see details). If `x` already is `integer`, this #' argument is ignored and `x` is used as is. #' @param inf replacement value for `Inf` (TSPLIB format cannot handle #' `Inf`). If `inf` is `NULL`, a large value of \eqn{max(x) + 2 #' range(x)} (ignoring infinite entries) is used. #' @param neg_inf replacement value for `-Inf`. If no value is specified, #' a small value of \eqn{min(x) - 2 range(x)} (ignoring infinite entries) is #' used. #' @returns returns an object of class `TSP` or #' `ATSP`. #' @author Michael Hahsler #' @references #' Reinelt, Gerhard. 1991. “TSPLIB—a Traveling Salesman Problem Library.” ORSA Journal on Computing 3 (4): 376–84. \doi{10.1287/ijoc.3.4.376} #' #' @keywords file #' @examples #' #' ## Drilling problem from TSP #' drill <- read_TSPLIB(system.file("examples/d493.tsp", package = "TSP")) #' drill #' tour <- solve_TSP(drill, method = "nn", two_opt = TRUE) #' tour #' plot(drill, tour, cex=.6, col = "red", pch= 3, main = "TSPLIB: d493") #' #' #' ## Write and read data in TSPLIB format #' x <- data.frame(x=runif(5), y=runif(5)) #' #' ## create TSP, ATSP and ETSP (2D) #' tsp <- TSP(dist(x)) #' atsp <- ATSP(dist(x)) #' etsp <- ETSP(x[,1:2]) #' #' write_TSPLIB(tsp, file="example.tsp") #' #file.show("example.tsp") #' r <- read_TSPLIB("example.tsp") #' r #' #' write_TSPLIB(atsp, file="example.tsp") #' #file.show("example.tsp") #' r <- read_TSPLIB("example.tsp") #' r #' #' write_TSPLIB(etsp, file="example.tsp") #' #file.show("example.tsp") #' r <- read_TSPLIB("example.tsp") #' r #' #' ## clean up #' unlink("example.tsp") #' @export read_TSPLIB <- function(file, precision = 0) { ## TSP or ATSP type <- NULL lines <- readLines(file) ## get info metadata <- grep(":", lines) info <- list() lapply(strsplit(lines[metadata], "[[:space:]]*:[[:space:]]*"), FUN = function(x) { x[2] <- sub("[[:space:]]*$","",x[2]) ## kill trailing spaces info[[toupper(x[1])]] <<- toupper(x[2]) }) ## check if(substr(info$TYPE, 1, 3) == "TSP") type <- "TSP" else if(substr(info$TYPE, 1, 3) == "ATS") type <- "ATSP" else stop ("Currently the only implemented TYPEs are TSP and ATS(P)!") dim <- as.integer(info$DIMENSION) if(info$EDGE_WEIGHT_TYPE == "EXPLICIT") { ## get data data_start <- grep("EDGE_WEIGHT_SECTION", lines, ignore.case = TRUE) if(length(data_start) == 0) stop("EDGE_WEIGHT_SECTION missing") data <- lines[(data_start+1):length(lines)] data <- sub("EOF", "", data, ignore.case = TRUE) ## kill optional EOF data <- sub("^[[:space:]]*", "", data)## kill leading spaces data <- strsplit(paste(data, collapse = " "), "[[:space:]]+")[[1]] ## remove everything after the data if(info$EDGE_WEIGHT_FORMAT == "FULL_MATRIX") data <- data[1:(dim^2)] else if(info$EDGE_WEIGHT_FORMAT == "UPPER_ROW" || info$EDGE_WEIGHT_FORMAT == "LOWER_COL" || info$EDGE_WEIGHT_FORMAT == "UPPER_COL" || info$EDGE_WEIGHT_FORMAT == "LOWER_ROW") data <- data[1:(dim*(dim-1)/2)] else if(info$EDGE_WEIGHT_FORMAT == "UPPER_DIAG_ROW" || info$EDGE_WEIGHT_FORMAT == "LOWER_DIAG_COL" || info$EDGE_WEIGHT_FORMAT == "UPPER_DIAG_COL" || info$EDGE_WEIGHT_FORMAT == "LOWER_DIAG_ROW") data <- data[1:(dim*(dim-1)/2 + dim)] data <- as.numeric(data) if(precision != 0) data <- data / 10^precision ## ATSP if(type == "ATSP") { if(info$EDGE_WEIGHT_FORMAT == "FULL_MATRIX"){ ## todo: find out if FULL_MATRIX is row or column oriented? data <- matrix(data, ncol = dim) }else stop("ATSP needs EDGE_WEIGHT_FORMAT FULL_MATRIX!") return(ATSP(data)) } ## TSP ## we have only symmetric data here! if(info$EDGE_WEIGHT_FORMAT == "FULL_MATRIX") { data <- as.dist(matrix(data, ncol = dim)) }else if(info$EDGE_WEIGHT_FORMAT == "UPPER_ROW" || info$EDGE_WEIGHT_FORMAT == "LOWER_COL") { class(data) <- "dist" attr(data, "Size") <- dim attr(data, "Diag") <- FALSE attr(data, "Upper") <- FALSE }else if(info$EDGE_WEIGHT_FORMAT == "UPPER_COL" || info$EDGE_WEIGHT_FORMAT == "LOWER_ROW") { m <- matrix(NA, nrow = dim, ncol = dim) m[upper.tri(m, diag = FALSE)] <- data data <- as.dist(t(m)) }else if(info$EDGE_WEIGHT_FORMAT == "UPPER_DIAG_ROW" || info$EDGE_WEIGHT_FORMAT == "LOWER_DIAG_COL") { class(data) <- "dist" attr(data, "Size") <- dim attr(data, "Diag") <- TRUE attr(data, "Upper") <- FALSE data <- as.dist(data, diag = FALSE) }else if(info$EDGE_WEIGHT_FORMAT == "UPPER_DIAG_COL" || info$EDGE_WEIGHT_FORMAT == "LOWER_DIAG_ROW") { m <- matrix(NA, nrow = dim, ncol = dim) m[upper.tri(m, diag = TRUE)] <- data data <- as.dist(t(m)) }else stop("The specified EDGE_WEIGHT_FORMAT is not implemented!") return(TSP(data)) } else if (info$EDGE_WEIGHT_TYPE == "EUC_2D" || info$EDGE_WEIGHT_TYPE == "EUC_2D") { data_start <- grep("NODE_COORD_SECTION", lines, ignore.case = TRUE) if(length(data_start) == 0) stop("NODE_COORD_SECTION missing") data <- lines[(data_start+1):(data_start+dim)] data <- matrix(as.numeric(unlist(strsplit(data, split="\\s+"))), nrow = dim, byrow = TRUE) data <- data[,-1] return(ETSP(data)) } stop("EDGE_WEIGHT_TYPE not implemented! Implemented types are EXPLICIT, EUC_2D and EUC_3D") } #' @rdname TSPLIB #' @export write_TSPLIB <- function(x, file, precision = 6, inf = NULL, neg_inf = NULL) UseMethod("write_TSPLIB") ## write a simple TSPLIB format file from an object of class TSP ## (contains a dist object or a symmetric matrix) ## TSP has data as integer #' @rdname TSPLIB #' @export write_TSPLIB.TSP <- function(x, file, precision = 6, inf = NULL, neg_inf = NULL) { ## prepare data (NA, Inf) if(any(is.na(x))) stop("NAs not allowed!") x <- .replaceInf(x, inf, neg_inf) ## Concorde can handle UPPER_ROW and dist (lower triangle matrix) ## is symmetric. format <- "EDGE_WEIGHT_FORMAT: UPPER_ROW" zz <- file(file, "w") cat("NAME: TSP", "COMMENT: Generated by write_TSPLIB (R-package TSP)", "TYPE: TSP", paste("DIMENSION:", n_of_cities(x)), "EDGE_WEIGHT_TYPE: EXPLICIT", format, file = zz, sep = "\n") ## only integers can be used as weights if(storage.mode(x) != "integer" && precision != 0) x <- x * 10^precision x <- suppressWarnings(as.integer(x)) if(any(is.na(x))) stop("Integer overflow, please reduce precision.") cat("EDGE_WEIGHT_SECTION", x, file = zz, sep = "\n") cat("EOF", file = zz, sep = "\n") close(zz) } #' @rdname TSPLIB #' @export write_TSPLIB.ATSP <- function(x, file, precision = 6, inf = NULL, neg_inf = NULL) { ## prepare data (NA, Inf) if(any(is.na(x))) stop("NAs not allowed!") x <- .replaceInf(x, inf, neg_inf) format <- "EDGE_WEIGHT_FORMAT: FULL_MATRIX" zz <- file(file, "w") cat("NAME: ATSP", "COMMENT: Generated by write_TSPLIB (R package TSP)", "TYPE: ATSP", paste("DIMENSION:", n_of_cities(x)), "EDGE_WEIGHT_TYPE: EXPLICIT", format, file = zz, sep = "\n") ## only integers can be used as weights if(storage.mode(x) != "integer") x <- x * 10^precision x <- suppressWarnings(as.integer(x)) if(any(is.na(x))) stop("integer overflow, please reduce precision.") cat("EDGE_WEIGHT_SECTION", x, file = zz, sep = "\n") cat("EOF", file = zz, sep = "\n") close(zz) } ## ETSP use data as real #' @rdname TSPLIB #' @export write_TSPLIB.ETSP <- function(x, file, precision = 6, inf = NULL, neg_inf = NULL) { if(any(is.na(x))) stop("NAs are not allowed!") if(any(!is.finite(x))) stop("Only finite values allowed!") if(ncol(x) == 2) type <- "EUC_2D" else if(ncol(x) == 3) type <- "EUC_3D" else stop("Only EUC_2D and EUC_3D supported.") zz <- file(file, "w") cat("NAME: ETSP", "COMMENT: Generated by write_TSPLIB (R package TSP)", "TYPE: TSP", paste("DIMENSION:", n_of_cities(x)), paste("EDGE_WEIGHT_TYPE:", type), file = zz, sep = "\n") ## fix row names rownames(x) <- NULL x <- do.call(data.frame, lapply(1:ncol(x), FUN = function(i) sprintf(paste("%0.", precision, "e", sep=""), x[,i]))) cat("NODE_COORD_SECTION", file = zz, sep = "\n") write.table(x, quote=FALSE, col.names = FALSE, file = zz) cat("EOF", file = zz, sep = "\n") close(zz) } TSP/R/tsp_concorde.R0000644000176200001440000002770615111643622013743 0ustar liggesusers####################################################################### # TSP - Traveling Salesperson Problem # Copyright (C) 2011 Michael Hahsler and Kurt Hornik # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. #' Using the Concorde TSP Solver #' #' The Concorde TSP Solver package contains several solvers. Currently, #' interfaces to the Concorde solver (Applegate et al. 2001), one of the most #' advanced and fastest TSP solvers using branch-and-cut, and the Chained #' Lin-Kernighan (Applegate et al. 2003) implementation are provided in #' \pkg{TSP}. Concorde can solve [TSP]s and [ETSP]s directly. [ATSP]s are #' reformulated as larger TSP's and then solved. #' #' #' # Installation of Concorde #' #' The Concorde TSP Solver is freely available for academic research. #' It is not included in the \pkg{TSP} R package and has #' to be obtained separately from the #' [Concorde download page](https://www.math.uwaterloo.ca/tsp/concorde/downloads/downloads.htm). #' Either download the precompiled executables and place them in a suitable #' directory (make sure they are executable), or you can get the source code and #' compile the program on your own. \pkg{TSP} needs to know where the executables are. #' There are two options: #' 1. use `concorde_path()` to set the path to the #' directory containing the executables for concorde and linkern, or #' 2. make #' sure that the executables are in the search path stored in the `PATH` #' environment variable (see [Sys.setenv()]). #' #' # Using Concorde for `solve_TSP()` #' #' [solve_TSP()] uses [write_TSPLIB()] to write the TSP for #' Concorde and tries to find the appropriate `precision` value (digits #' after the decimal point) to convert the provided distances into the needed #' integer value range. The `precision` value can also be specified in #' `control` in [solve_TSP()] with method Concorde. Warning #' messages will alert the user if the conversion to integer values results #' into rounding errors that are worse then what is specified in the #' `precision` control parameter. #' #' To get a list of all available command line options which can be used via #' the `clo` option for `solve_TSP` use `concorde_help()` and #' `linkern_help()`. Several options (\option{-x}, \option{-o}, #' \option{-N}, \option{-Q}) are not available via [solve_TSP()] since they #' are used by the interface. #' #' If Concorde takes too long, then you can interrupt [solve_TSP()] #' using `Esc/CTRL-C`. On most operating systems, this will also #' terminate the Concorde executable. If Concorde keeps running, then you can #' kill the 'concorde' process via your operating system. #' #' @family TSP #' #' @name Concorde #' @aliases Concorde concorde concorde_path concorde_help linkern_help #' #' @param path a character string with the path to the directory where the #' executables are installed. #' @returns `concorde_path()` returns the path to the executable. Others functions: Nothing. #' @author Michael Hahsler #' @references Concorde home page, #' \url{https://www.math.uwaterloo.ca/tsp/concorde/} #' #' David Applegate, Robert Bixby, Vasek Chvatal, William Cook (2001): TSP cuts #' which do not conform to the template paradigm, Computational Combinatorial #' Optimization, M. Junger and D. Naddef (editors), Springer-Verlag. #' #' David Applegate and William Cook and Andre Rohe (2003): Chained #' Lin-Kernighan for Large Traveling Salesman Problems, \emph{INFORMS Journal #' on Computing}, \bold{15}, 82--92. #' @keywords documentation #' @examples #' #' \dontrun{ #' ## see if Concorde is correctly installed #' concorde_path() #' #' #' ## set path to the Concorde executible if it is not in the search PATH #' ## Example: #' ## concorde_path("~/concorde/") #' #' concorde_help() #' #' data("USCA312") #' #' ## run Concorde in verbose mode (-v) with fast cuts only (-V) #' ## Note: use the contol parameter verbose = FALSE to supress Concorde's output #' solve_TSP(USCA312, method = "concorde", control = list(clo = "-v -V")) #' } #' NULL ## prepare distances as integers in the appropriate range [0..MAX] .prepare_dist_concorde <- function(x, MAX, precision, verbose = FALSE) { ## handle inf x <- .replaceInf(x) ## fix neg. values min_x <- min(x) if (min_x < 0) { if (verbose) warning( "pTSP contains negative distances (maybe the result of a reformulation from ATSP). Shifting distances by subtracting the minimum.", immediate. = FALSE) x <- x - min_x } ## get max (excluding) to check for possible integer overflows max_x <- max(x) prec <- floor(log10(MAX / max_x)) if (any((x %% 1) != 0) || prec < 0) { if (prec >= precision) { x <- x * 10 ^ precision } else { warning( paste0( "Concorde/Linken can only handle distances represented as integers. Converting the provided distances to integers with precison ", prec, ". This may lead to rounding errors." ), immediate. = TRUE ) x <- x * 10 ^ prec } } storage.mode(x) <- "integer" ## so write.TSBLIB does not do precision changes x } ## interface to the Concorde algorithm ## (can only handle TSP and no neg. distances!) tsp_concorde <- function(x, control = NULL) { if (!is.null(control$exe)) warning("exe is deprecated. Use concorde_path() instead!") ## get parameters control <- .get_parameters( control, list( clo = "", exe = .find_exe(control$exe, "concorde"), precision = 6, verbose = TRUE, keep_files = FALSE ) ) ## get temp files and change working directory wd <- tempdir() dir <- getwd() setwd(wd) on.exit(setwd(dir)) ### fix for Windows by Stephen Eick ##temp_file <- tempfile(tmpdir = wd) temp_file <- basename(tempfile(tmpdir = wd)) ## file name needs to be unique tmp_file_in <- paste(temp_file, ".dat", sep = "") tmp_file_out <- paste(temp_file, ".sol", sep = "") ## check x if (inherits(x, "TSP")) { #if(n_of_cities(x) < 10) MAX <- 2^15 - 1 else MAX <- 2^31 - 1 ### MFH: Concorde may overflow with 2^31-1 if (n_of_cities(x) < 10) MAX <- 2 ^ 15 - 1 else MAX <- 2 ^ 28 - 1 x <- .prepare_dist_concorde(x, MAX, precision = control$precision, verbose = control$verbose) ## precision is already handled! write_TSPLIB(x, file = tmp_file_in, precision = 0) } else if (inherits(x, "ETSP")) { ## nothing to do! write_TSPLIB(x, file = tmp_file_in, precision = control$precision) } else stop("Concorde only handles TSP and ETSP.") ## change working directory ## do the call and read back result ## we do not check return values of Concorde since they are not ## very consistent system2( control$exe, args = paste("-x", control$clo, "-o", tmp_file_out, tmp_file_in), stdout = if (control$verbose) "" else FALSE, stderr = if (control$verbose) "" else FALSE, ) if (!file.access(tmp_file_out) == 0) stop( "Concorde has not produced a result file.\nIs concorde properly installed? (see ? Concorde)\nDid Concorde finish without an error or being interupted?" ) ##else cat("Concorde done.\n") order <- scan(tmp_file_out, what = integer(0), quiet = TRUE) ## remove number of nodes and add one (result starts with 0) order <- order[-1] + 1L ## tidy up if (!control$keep_files) unlink(c(tmp_file_in, tmp_file_out)) else cat("File are in:", wd, "\n\n") order } ## interface to the Concorde's Chained Lin-Kernighan algorithm ## (can only handle TSP, handles neg. distances) tsp_linkern <- function(x, control = NULL) { if (!is.null(control$exe)) warning("exe is deprecated. Use concorde_path() instead!") ## get parameters control <- .get_parameters( control, list( exe = .find_exe(control$exe, "linkern"), clo = "", precision = 6, verbose = TRUE, keep_files = FALSE ) ) ## have to set -r for small instances <8 if (n_of_cities(x) <= 8) control$clo <- paste(control$clo, "-k", n_of_cities(x)) ## check x if (inherits(x, "TSP")) { #MAX <- 2^31 - 1 MAX <- 2 ^ 28 - 1 x <- .prepare_dist_concorde(x, MAX, precision = control$precision, verbose = control$verbose) } else if (inherits(x, "ETSP")) { ## nothing to do } else stop("Linkern only works for TSP and ETSP.") ## get temp files and change working directory wd <- tempdir() dir <- getwd() setwd(wd) on.exit(setwd(dir)) ### fix for Windows by Stephen Eick ##temp_file <- tempfile(tmpdir = wd) temp_file <- basename(tempfile(tmpdir = wd)) ## file name needs to be unique tmp_file_in <- paste(temp_file, ".dat", sep = "") tmp_file_out <- paste(temp_file, ".sol", sep = "") write_TSPLIB(x, file = tmp_file_in, precision = 0) ## do the call and read back result ## we do not check return values of Concorde since they are not ## very consistent system2( control$exe, args = paste("-o", tmp_file_out, control$clo, tmp_file_in), stdout = if (control$verbose) "" else FALSE, stderr = if (control$verbose) "" else FALSE ) if (!file.access(tmp_file_out) == 0) stop( "Linkern has not produced a result file.\nIs linkern properly installed?\nDid linkern finish without an error or being interrupted?" ) ##else cat("Concorde done.\n") order <- read.table(tmp_file_out)[, 1] ## remove number of nodes and add one (result starts with 0) order <- order + as.integer(1) ## tidy up if (!control$keep_files) unlink(c(tmp_file_in, tmp_file_out)) else cat("File are in:", wd, "\n\n") order } ## path ## path #' @rdname Concorde #' @export concorde_path <- local({ .path <- NULL function(path) { if (missing(path)) { if (!is.null(.path)) return(.path) else { ## find concorde and/or linkern p <- dirname(Sys.which("concorde")) if (p == "") p <- dirname(Sys.which("linkern")) if (p == "") stop( "Can not find executables for concorde or linkern. Please install the executables or set path manually." ) return(p) } } else { if (!is.null(path)) { path <- normalizePath(path) ### translate all special characters ex <- c( list.files(path, pattern = "concorde", ignore.case = TRUE), list.files(path, pattern = "linkern", ignore.case = TRUE) ) if (length(ex) < 1) stop(paste("no executable (concorde and/or linkern) found in", path)) cat("found:", ex, "\n") } .path <<- path invisible(.path) } } }) ## get help page #' @rdname Concorde #' @export concorde_help <- function() { cat( "The following options can be specified in solve_TSP with method \"concorde\" using clo in control:\n\n" ) system2(.find_exe(NULL, "concorde"), args = "") } #' @rdname Concorde #' @export linkern_help <- function() { cat( "The following options can be specified in solve_TSP with method \"linkern\" using clo in control:\n\n" ) system2(.find_exe(NULL, "linkern"), args = "") } ## helper to find the 'concorde' executable .find_exe <- function(exe = NULL, prog) { ## if not specified if (is.null(exe)) { ## was the path set ? if (!is.null(concorde_path())) exe <- paste(concorde_path(), .Platform$file.sep, prog, sep = "") ## no, so it must be in the systems execution path else exe <- prog } exe } TSP/R/USCA312.R0000644000176200001440000000216715001730346012232 0ustar liggesusers#' USCA312/USCA50 -- 312/50 cities in the US and Canada #' #' The `USCA312` dataset contains the distances between 312 cities in the #' US and Canada as an object of class `TSP`. `USCA50` is a subset #' of `USCA312` containing only the first 50 cities. #' #' The `USCA312_GPS` dataset contains the location (long/lat) of the 312 #' cities. #' #' #' @name USCA #' @aliases USCA312 USCA312_GPS USCA50 #' @docType data #' @format `USCA312` and `USCA50` are objects of class `TSP`. #' `USCA312_GPS` is a data.frame with city name, long and lat. #' @author Michael Hahsler #' @source John Burkardt, CITIES -- City Distance Datasets, Florida State #' University, Department of Scientific Computing #' @keywords datasets #' @examples #' data("USCA312") #' #' ## calculate a tour #' tour <- solve_TSP(USCA312) #' tour #' #' # Visualize the tour if package maps is installed #' if(require("maps")) { #' #' library(maps) #' data("USCA312_GPS") #' head(USCA312_GPS) #' #' plot((USCA312_GPS[, c("long", "lat")]), cex = .3) #' map("world", col = "gray", add = TRUE) #' polygon(USCA312_GPS[, c("long", "lat")][tour,], border = "red") #' } NULL TSP/R/insert_dummy.R0000644000176200001440000001155115001730346013765 0ustar liggesusers####################################################################### # TSP - Traveling Salesperson Problem # Copyrigth (C) 2011 Michael Hahsler and Kurt Hornik # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ## insert a dummy city ##generic #' Insert dummy cities into a distance matrix #' #' Inserts dummy cities into a TSP problem. A #' dummy city has the same, constant distance (0) to all other cities and is #' infinitely far from other dummy cities. A dummy city can be used to #' transform a shortest Hamiltonian path problem (i.e., finding an optimal #' linear order) into a shortest Hamiltonian cycle problem which can be solved #' by a TSP solvers (Garfinkel 1985). #' #' Several dummy cities can be used together with a TSP solvers to perform #' rearrangement clustering (Climer and Zhang 2006). #' #' The dummy cities are inserted after the other cities in `x`. #' #' A `const` of 0 is guaranteed to work if the TSP finds the optimal #' solution. For heuristics returning suboptimal solutions, a higher #' `const` (e.g., `2 * max(x)`) might provide better results. #' #' @family TSP #' #' @param x an object with a TSP problem. #' @param n number of dummy cities. #' @param const distance of the dummy cities to all other cities. #' @param inf distance between dummy cities. #' @param label labels for the dummy cities. If only one label is given, it is #' reused for all dummy cities. #' @returns returns an object of the same class as `x`. #' #' @author Michael Hahsler #' @references Sharlee Climer, Weixiong Zhang (2006): Rearrangement Clustering: #' Pitfalls, Remedies, and Applications, \emph{Journal of Machine Learning #' Research} \bold{7}(Jun), pp. 919--943. #' #' R.S. Garfinkel (1985): Motivation and modelling (chapter 2). In: E. L. #' Lawler, J. K. Lenstra, A.H.G. Rinnooy Kan, D. B. Shmoys (eds.) The #' traveling salesman problem - A guided tour of combinatorial optimization, #' Wiley & Sons. #' @keywords manip #' @examples #' ## Example 1: Find a short Hamiltonian path #' set.seed(1000) #' x <- data.frame(x = runif(20), y = runif(20), row.names = LETTERS[1:20]) #' #' tsp <- TSP(dist(x)) #' #' ## add a dummy city to cut the tour into a path #' tsp <- insert_dummy(tsp, label = "cut") #' tour <- solve_TSP(tsp) #' tour #' #' plot(x) #' lines(x[cut_tour(tour, cut = "cut"),]) #' #' #' ## Example 2: Rearrangement clustering of the iris dataset #' set.seed(1000) #' data("iris") #' tsp <- TSP(dist(iris[-5])) #' #' ## insert 2 dummy cities to creates 2 clusters #' tsp_dummy <- insert_dummy(tsp, n = 3, label = "boundary") #' #' ## get a solution for the TSP #' tour <- solve_TSP(tsp_dummy) #' #' ## plot the reordered distance matrix with the dummy cities as lines separating #' ## the clusters #' image(tsp_dummy, tour) #' abline(h = which(labels(tour)=="boundary"), col = "red") #' abline(v = which(labels(tour)=="boundary"), col = "red") #' #' ## plot the original data with paths connecting the points in each cluster #' plot(iris[,c(2,3)], col = iris[,5]) #' paths <- cut_tour(tour, cut = "boundary") #' for(p in paths) lines(iris[p, c(2,3)]) #' #' ## Note: The clustering is not perfect! #' @export insert_dummy <- function(x, n = 1, const = 0, inf = Inf, label = "dummy") UseMethod("insert_dummy") ## use insert dummy from ATSP #' @rdname insert_dummy #' @export insert_dummy.TSP <- function(x, n = 1, const = 0, inf = Inf, label = "dummy") { x <- insert_dummy(ATSP(x), n, const, inf, label) TSP(x) } #' @rdname insert_dummy #' @export insert_dummy.ATSP <- function(x, n = 1, const = 0, inf = Inf, label = "dummy") { method <- attr(x, "method") n <- as.integer(n) p <- n_of_cities(x) if(length(label) == 1 && n > 1) label = rep(label, n) ## add dummy rows/columns x <- cbind(x, matrix(const, ncol = n, nrow = p, dimnames = list(NULL, label))) x <- rbind(x, matrix(const, ncol = p+n, nrow = n, dimnames = list(label, NULL))) ## place inf between dummies if(n>1) { x[(p+1):(p+n), (p+1):(p+n)] <- inf diag(x[(p+1):(p+n), (p+1):(p+n)]) <- 0 } attr(x, "method") <- method ATSP(x) } #' @rdname insert_dummy #' @export insert_dummy.ETSP <- function(x, n = 1, const = 0, inf = Inf, label = "dummy") stop("Dummy cities cannot be used with ETSP! Convert the problem into a TSP.") TSP/R/solve_TSP.R0000644000176200001440000004316615111632576013143 0ustar liggesusers####################################################################### # TSP - Traveling Salesperson Problem # Copyright (C) 2011 Michael Hahsler and Kurt Hornik # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. #' TSP solver interface #' #' Common interface to all TSP solvers in this package. #' #' # TSP Methods #' #' Currently the following methods are available: #' - __"identity", "random"__ return a tour representing the order in the data #' (identity order) or a random order. \[TSP, ATSP\] #' #' - __"nearest_insertion", "farthest_insertion", "cheapest_insertion", "arbitrary_insertion"__ #' Nearest, farthest, cheapest and #' arbitrary insertion algorithms for a symmetric and asymmetric TSP #' (Rosenkrantz et al. 1977). \[TSP, ATSP\] #' #' The distances between cities are stored in a distance matrix \eqn{D} with #' elements \eqn{d(i,j)}. All insertion algorithms start with a tour #' consisting of an arbitrary city and choose in each step a city \eqn{k} not #' yet on the tour. This city is inserted into the existing tour between two #' consecutive cities \eqn{i} and \eqn{j}, such that \deqn{d(i,k) + d(k,j) - #' d(i,j)} is minimized. The algorithms stops when all cities are on the tour. #' #' The nearest insertion algorithm chooses city \eqn{k} in each step as the #' city which is \emph{nearest} to a city on the tour. #' #' For farthest insertion, the city \eqn{k} is chosen in each step as the city #' which is \emph{farthest} to any city on the tour. #' #' Cheapest insertion chooses the city \eqn{k} such that the cost of inserting #' the new city (i.e., the increase in the tour's length) is minimal. #' #' Arbitrary insertion chooses the city \eqn{k} randomly from all cities not #' yet on the tour. #' #' Nearest and cheapest insertion tries to build the tour using cities which #' fit well into the partial tour constructed so far. The idea behind behind #' farthest insertion is to link cities far away into the tour fist to #' establish an outline of the whole tour early. #' #' Additional control options: #' - "start" index of the first city (default: a random city). #' #' - __"nn", "repetitive_nn"__ Nearest neighbor and repetitive #' nearest neighbor algorithms for symmetric and asymmetric TSPs (Rosenkrantz #' et al. 1977). \[TSP, ATSP\] #' #' The algorithm starts with a tour containing a random city. Then the #' algorithm always adds to the last city on the tour the nearest not yet #' visited city. The algorithm stops when all cities are on the tour. #' #' Repetitive nearest neighbor constructs a nearest neighbor tour for each city #' as the starting point and returns the shortest tour found. #' #' Additional control options: #' - "start" index of the first city (default: a random city). #' #' - __"sa"__ Simulated Annealing for TSPs (Kirkpatrick et al, 1983) \[TSP, ATSP\] #' #' A tour refinement method that uses simulated annealing with subtour #' reversal as local move. The used optimizer is #' [stats::optim()] with method `"SANN"`. This method is #' typically a lot slower than `"two_opt"` and requires parameter tuning for the #' cooling schedule. #' #' Additional control options: #' - "tour" an existing tour which should be improved. #' If no tour is given, a random tour is used. #' - "local_move" a function that creates a local move with the current #' tour as the first and the TSP as the second parameter. Defaults to #' randomized subtour reversal. #' - "temp" initial temperature. Defaults to the length of the current tour divided #' by the number of cities. #' - "tmax" number of evaluations per temperature step. Default is 10. #' - "maxit" number of evaluations. Default is 10000 for speed, but larger values #' will result in more competitive results. #' - "trace" set to 1 to print progress. #' #' See [stats::optim()] for more details on the parameters. #' #' - __"two_opt"__ Two edge exchange improvement procedure (Croes 1958). \[TSP, ATSP\] #' #' This is a tour refinement procedure which systematically exchanges two edges #' in the graph represented by the distance matrix till no improvements are #' possible. Exchanging two edges is equal to reversing part of the tour. The #' resulting tour is called _2-optimal._ #' #' This method can be applied to tours created by other methods or used as its #' own method. In this case improvement starts with a random tour. #' #' Additional control options: #' - "tour" an existing tour which should be improved. #' If no tour is given, a random tour is used. #' - "two_opt_repetitions" number of times to try two_opt with a #' different initial random tour (default: 1). #' #' - __"concorde"__ Concorde algorithm (Applegate et al. 2001). \[TSP, ETSP\] #' #' Concorde is an advanced exact TSP solver for _symmetric_ TSPs #' based on branch-and-cut. #' ATSPs can be solved using [reformulate_ATSP_as_TSP()] done automatically #' with `as_TSP = TRUE`. #' The program is not included in this package and #' has to be obtained and installed separately. #' #' Additional control options: #' - "exe" a character string containing the path to the executable (see [Concorde]). #' - "clo" a character string containing command line options for #' Concorde, e.g., `control = list(clo = "-B -v")`. See #' [concorde_help()] on how to obtain a complete list of available command #' line options. #' - "precision" an integer which controls the number of decimal #' places used for the internal representation of distances in Concorde. The #' values given in `x` are multiplied by \eqn{10^{precision}} before being #' passed on to Concorde. Note that therefore the results produced by Concorde #' (especially lower and upper bounds) need to be divided by #' \eqn{10^{precision}} (i.e., the decimal point has to be shifted #' `precision` placed to the left). The interface to Concorde uses #' [write_TSPLIB()]. #' - "verbose" logical; `FALSE` suppresses the output printed to the terminal. #' #' - __"linkern"__ Concorde's Chained Lin-Kernighan heuristic (Applegate et al. 2003). \[TSP, ETSP\] #' #' The Lin-Kernighan (Lin and Kernighan 1973) heuristic uses variable \eqn{k} #' edge exchanges to improve an initial tour. The program is not included in #' this package and has to be obtained and installed separately (see [Concorde]). #' #' Additional control options: see Concorde above. #' #' # Verbose Operation #' #' Most implementations provide verbose output to monitor progress using the #' logical control parameter "verbose". #' #' # Additional refinement and random restarts #' #' Most constructive methods also accept the following extra control parameters: #' #' * "two_opt": a logical indicating if two-opt refinement should be performed on the #' constructed tour. #' * "rep": an integer indicating how many replications (random restarts) should be performed. #' #' # Treatment of `NA`s and infinite values in `x` #' #' [TSP] and [ATSP] need to contain valid distances. `NA`s are not allowed. `Inf` is #' allowed and can be used to model the missing edges in incomplete graphs #' (i.e., the distance between the two objects is infinite) or infeasible connections. #' Internally, `Inf` is replaced by a large value given by \eqn{max(x) + 2 range(x)}. #' Note that the solution might still place the two objects next to each other #' (e.g., if `x` contains several unconnected subgraphs) which results in #' a path length of `Inf`. `-Inf` is replaced by \eqn{min(x) - 2 range(x)} and #' can be used to encourage the solver to place two objects next to each other. #' #' # Parallel execution support #' #' All heuristics can be used with the control arguments `repetitions` #' (uses the best from that many repetitions with random starts) and #' `two_opt` (a logical indicating if two_opt refinement should be #' performed). If several repetitions are done (this includes method #' `"repetitive_nn"`) then \pkg{foreach} is used so they can be performed #' in parallel on multiple cores/machines. To enable parallel execution an #' appropriate parallel backend needs to be registered (e.g., load #' \pkg{doParallel} and register it with [doParallel::registerDoParallel()]). #' #' # Solving ATSP and ETSP #' #' Some solvers (including Concorde) cannot directly solve [ATSP] #' directly. `ATSP` can be reformulated as larger `TSP` and solved #' this way. For convenience, `solve_TSP()` has an extra argument #' `as_TSP` which can be set to `TRUE` to automatically solve the #' `ATSP` reformulated as a `TSP` (see [reformulate_ATSP_as_TSP()]). #' #' Only methods "concorde" and "linkern" currently solve [ETSP]s directly. #' For all other methods, ETSPs are converted into TSPs by creating a #' distance matrix and then solved. Note: distance matrices can become #' very large leading to long memory issues and long computation times. #' #' @family TSP #' @family TOUR #' #' @param x a TSP problem. #' @param method method to solve the TSP (default: "arbitrary insertion" #' algorithm with two_opt refinement. #' @param control a list of arguments passed on to the TSP solver selected by #' `method`. #' @param as_TSP should the ATSP reformulated as a TSP for the solver? #' @param ... additional arguments are added to `control`. #' @return An object of class [TOUR]. #' @author Michael Hahsler #' @references #' David Applegate, Robert Bixby, Vasek Chvatal, William Cook #' (2001): TSP cuts which do not conform to the template paradigm, #' Computational Combinatorial Optimization, M. Junger and D. Naddef (editors), #' Springer.\doi{10.1007/3-540-45586-8_7} #' #' D. Applegate, W. Cook and A. Rohe (2003): Chained Lin-Kernighan for Large #' Traveling Salesman Problems. \emph{INFORMS Journal on Computing}, #' 15(1):82--92. \doi{10.1287/ijoc.15.1.82.15157} #' #' G.A. Croes (1958): A method for solving traveling-salesman problems. #' \emph{Operations Research}, 6(6):791--812. \doi{10.1287/opre.6.6.791} #' #' Kirkpatrick, S., C. D. Gelatt, and M. P. Vecchi (1983): #' Optimization by Simulated Annealing. \emph{Science} 220 (4598): 671–80 #' \doi{10.1126/science.220.4598.671} #' #' S. Lin and B. Kernighan (1973): An effective heuristic algorithm for the #' traveling-salesman problem. \emph{Operations Research}, 21(2): 498--516. #' \doi{10.1287/opre.21.2.498} #' #' D.J. Rosenkrantz, R. E. Stearns, and Philip M. Lewis II (1977): An analysis #' of several heuristics for the traveling salesman problem. \emph{SIAM #' Journal on Computing}, 6(3):563--581. \doi{10.1007/978-1-4020-9688-4_3} #' @keywords optimize #' @examples #' #' ## solve a simple Euclidean TSP (using the default method) #' etsp <- ETSP(data.frame(x = runif(20), y = runif(20))) #' tour <- solve_TSP(etsp) #' tour #' tour_length(tour) #' plot(etsp, tour) #' #' #' ## compare methods #' data("USCA50") #' USCA50 #' methods <- c("identity", "random", "nearest_insertion", #' "cheapest_insertion", "farthest_insertion", "arbitrary_insertion", #' "nn", "repetitive_nn", "two_opt", "sa") #' #' ## calculate tours #' tours <- lapply(methods, FUN = function(m) solve_TSP(USCA50, method = m)) #' names(tours) <- methods #' #' ## use the external solver which has to be installed separately #' \dontrun{ #' tours$concorde <- solve_TSP(USCA50, method = "concorde") #' tours$linkern <- solve_TSP(USCA50, method = "linkern") #' } #' #' ## register a parallel backend to perform repetitions in parallel #' \dontrun{ #' library(doParallel) #' registerDoParallel() #' } #' #' ## add some tours using repetition and two_opt refinements #' tours$'nn+two_opt' <- solve_TSP(USCA50, method = "nn", two_opt = TRUE) #' tours$'nn+rep_10' <- solve_TSP(USCA50, method = "nn", rep = 10) #' tours$'nn+two_opt+rep_10' <- solve_TSP(USCA50, method = "nn", two_opt = TRUE, rep = 10) #' tours$'arbitrary_insertion+two_opt' <- solve_TSP(USCA50) #' #' ## show first tour #' tours[[1]] #' #' ## compare tour lengths #' opt <- 14497 # obtained by Concorde #' tour_lengths <- c(sort(sapply(tours, tour_length), decreasing = TRUE), #' optimal = opt) #' dotchart(tour_lengths / opt * 100 - 100, xlab = "percent excess over optimum") #' @export solve_TSP <- function(x, method = NULL, control = NULL, ...) UseMethod("solve_TSP") ## TSP #' @rdname solve_TSP #' @export solve_TSP.TSP <- function(x, method = NULL, control = NULL, ...) { .solve_TSP(x, method, control, ...) } ## ATSP #' @rdname solve_TSP #' @export solve_TSP.ATSP <- function(x, method = NULL, control = NULL, as_TSP = FALSE, ...) { # force as_TSP for solvers that cannot deal with ATSPs m <- pmatch(tolower(method), c("concorde", "linkern")) if (!is.na(m) && length(m) > 0L && !as_TSP) { warning( "NOTE: Solver cannot solve the ATSP directly. Reformulating ATSP as TSP. Use 'as_TSP = TRUE' to supress this warning.\n" ) as_TSP <- TRUE } # reformulate ATSP as TSP if (as_TSP) { x_atsp <- x x <- reformulate_ATSP_as_TSP(x_atsp) } tour <- .solve_TSP(x, method, control, ...) if (as_TSP) tour <- filter_ATSP_as_TSP_dummies(tour, atsp = x_atsp) tour } ## ETSP #' @rdname solve_TSP #' @export solve_TSP.ETSP <- function(x, method = NULL, control = NULL, ...) { ## all but concorde and linkern can currently only do TSP ## TODO: Implement insertion, NN, etc directly for ETSP to avoid creating ## a large distance matrix m <- pmatch(tolower(method), c("concorde", "linkern")) if (length(m) == 0L || is.na(m)) { if (nrow(x) > 10000L) warning("Convertion of ETSP to TSP creates a distance matrix of size O(n^2). ", "This operation may be slow or you may run out of memory. ", "Currently, only \"concorde\" and \"linkern\" can directly work with ETSP.", immediate. = TRUE) x <- as.TSP(x) } .solve_TSP(x, method, control, ...) } ## Deal with Inf: punish (-)Inf with max (min) +(-) 2*range .replaceInf <- function(x, pInf = NULL, nInf = NULL) { if (any(is.infinite(x))) { range_x <- range(x, na.rm = TRUE, finite = TRUE) # data with only a single non-inf value. diff_range <- diff(range_x) if (diff_range == 0) { if (range_x[1] == 0) diff_range <- 1 else diff_range <- range_x[1] * 2 } if (is.null(pInf)) pInf <- range_x[2] + 2 * diff_range if (is.null(nInf)) nInf <- range_x[1] - 2 * diff_range x[x == Inf] <- pInf x[x == -Inf] <- nInf } x } ## workhorse .solve_TSP <- function(x, method = NULL, control = NULL, ...) { ## add ... to control control <- c(control, list(...)) ## methods methods <- c( "identity", "random", "nearest_insertion", "farthest_insertion", "cheapest_insertion", "arbitrary_insertion", "nn", "repetitive_nn", ### deprecate use two_opt "2-opt", "two_opt", "concorde", "linkern", "sa" ) ## default is arbitrary_insertion + two_opt if (is.null(method)) { method <- "arbitrary_insertion" control$two_opt <- TRUE } else method <- match.arg(tolower(method), methods) ## no rep or two_opt for these! if (method == "concorde" || method == "linkern") { if (control$rep %||% 1L > 1L || control$two_opt %||% FALSE) warning("control parameters rep and two_opt not available for methods concorde and linkern and are ignored!") control$rep <- NULL control$two_opt <- NULL } ## check for NAs if (any(is.na(x))) stop("NAs not allowed!") ## Inf x_ <- .replaceInf(x) ## work horses .solve_TSP_worker <- function(x_, method, control) { order <- switch( method, identity = seq(n_of_cities(x_)), random = sample(n_of_cities(x_)), nearest_insertion = tsp_insertion(x_, type = "nearest", control = control), farthest_insertion = tsp_insertion(x_, type = "farthest", control = control), cheapest_insertion = tsp_insertion(x_, type = "cheapest", control = control), # arbitrary_insertion = tsp_insertion(x_, type = "arbitrary", control = control), arbitrary_insertion = tsp_insertion_arbitrary(x_, control = control), nn = tsp_nn(x_, control = control), repetitive_nn = tsp_repetitive_nn(x_, control = control), two_opt = tsp_two_opt(x_, control = control), '2-opt' = tsp_two_opt(x_, control = control), concorde = tsp_concorde(x_, control = control), linkern = tsp_linkern(x_, control = control), sa = tsp_SA(x_, control = control) ) ### do refinement two_opt if (!is.null(control[["two_opt"]]) && control[["two_opt"]]) { order <- tsp_two_opt(x_, control = c(control, list(tour = order))) method <- paste(method , "+two_opt", sep = "") } TOUR(order, method = method, tsp = x) } ## do rep? n <- control$rep %||% 1L ## reps are handled internally! if (method == "repetitive_nn") n <- 1L if (n == 1L) return(.solve_TSP_worker(x_, method, control)) #l <- replicate(n, .solve_TSP_worker(x_, method, control), simplify = FALSE) l <- foreach(i = 1:n) %dopar% .solve_TSP_worker(x_, method, control) l <- l[[which.min(sapply(l, attr, "tour_length"))]] attr(l, "method") <- paste(attr(l, "method"), "_rep_", n, sep = "") return(l) } TSP/R/reformulare_ATSP_as_TSP.R0000644000176200001440000001372715001730346015640 0ustar liggesusers####################################################################### # TSP - Traveling Salesperson Problem # Copyright (C) 2011 Michael Hahsler and Kurt Hornik # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. #' Reformulate a ATSP as a symmetric TSP #' #' A ATSP can be formulated as a symmetric TSP by doubling the number of cities #' (Jonker and Volgenant 1983). The solution of the TSP also represents the #' solution of the original ATSP. #' #' To reformulate a [ATSP] as a [TSP], for each city a dummy city (e.g, for 'New #' York' a dummy city 'New York*') is added. Between each city and its #' corresponding dummy city a very small (or negative) distance with value #' `cheap` is used. #' To ensure that the solver places each cities always occurs in the #' solution together with its dummy city, this cost has to be much smaller than #' the distances in the TSP. #' The original distances are used #' between the cities and the dummy cities, where each city is responsible for #' the distance going to the city and the dummy city is responsible for the #' distance coming from the city. The distances between all cities and the #' distances between all dummy cities are set to `infeasible`, a very #' large value which prevents the solver from using these links. #' We use infinite values here and [solve_TSP()] treats them appropriately. #' #' `filter_ATSP_as_TSP_dummies()` can be used to extract the solution for the original #' ATSP from the tour found for an ATSP reformulated as a TSP. Note that the symmetric TSP #' tour does not reveal the direction for the ATSP. The filter function computed the #' tour length for both directions and returns the shorter tour. #' #' [solve_TSP()] has a parameter `as_TSP` which preforms the reformulation and #' filtering the dummy cities automatically. #' #' **Note on performance:** Doubling the problem size is a performance issue especially #' has a negative impact on solution quality for heuristics. It should only be used #' together with Concorde when the optimal solution is required. Most heuristics can solve #' ATSPs directly with good solution quality. #' @family TSP #' #' @param x an [ATSP]. #' @param infeasible value for infeasible connections. #' @param cheap value for distance between a city and its corresponding dummy #' city. #' @param tour a [TOUR] created for a ATSP reformulated as a TSP. #' @param atsp the original [ATSP]. #' @return #' `reformulate_ATSP_as_TSP()` returns a [TSP] object. #' `filter_ATSP_as_TSP_dummies()` returns a [TOUR] object. #' @author Michael Hahsler #' @references Jonker, R. and Volgenant, T. (1983): Transforming asymmetric #' into symmetric traveling salesman problems, _Operations Research #' Letters,_ 2, 161--163. #' @keywords optimize #' @examples #' data("USCA50") #' #' ## set the distances from anywhere to Austin to zero which makes it an ATSP #' austin <- which(labels(USCA50) == "Austin, TX") #' atsp <- as.ATSP(USCA50) #' atsp[, austin] <- 0 #' atsp #' #' ## reformulate as a TSP (by doubling the number of cities with dummy cities marked with *) #' tsp <- reformulate_ATSP_as_TSP(atsp) #' tsp #' #' ## create tour for the TSP. You should use Concorde to find the optimal solution. #' # tour_tsp <- solve_TSP(tsp, method = "concorde") #' # The standard heuristic is bad for this problem. We use it here because #' # Concord may not be installed. #' tour_tsp <- solve_TSP(tsp) #' head(labels(tour_tsp), n = 10) #' tour_tsp #' # The tour length is -Inf since it includes cheap links #' # from a city to its dummy city. #' #' ## get the solution for the original ATSP by filtering out the dummy cities. #' tour_atsp <- filter_ATSP_as_TSP_dummies(tour_tsp, atsp = atsp) #' tour_atsp #' head(labels(tour_atsp), n = 10) #' #' ## This process can also be done automatically by using as_TSP = TRUE: #' # solve_TSP(atsp, method = "concorde", as_TSP = TRUE) #' #' ## The default heuristic can directly solve ATSPs with results close to the #' # optimal solution of 12715. #' solve_TSP(atsp, control = list(rep = 10)) #' @export reformulate_ATSP_as_TSP <- function(x, infeasible = Inf, cheap = -Inf) { if (!inherits(x, "ATSP")) stop("x is not an ATSP object!") method <- attr(x, "method") m <- as.matrix(x) ### check all but the diagonal for cheap! if (cheap >= min(m[-seq(1, nrow(m)^2, nrow(m)+1)])) stop("cheap needs to be strictly smaller than the smallest distance in the ATSP!") if (infeasible < max(m)) stop("infeasible needs to be larger than the largest distance in the ATSP!") ## scale matrix and add cheap links diag(m) <- cheap tsp <- rbind(cbind(matrix( infeasible, ncol = ncol(m), nrow = nrow(m) ), t(m)), cbind(m, matrix( infeasible, ncol = nrow(m), nrow = ncol(m) ))) ## create labels (* for virtual cities) lab <- c(labels(x), paste(labels(x), "*", sep = "")) dimnames(tsp) <- list(lab, lab) attr(tsp, "method") <- method ## return as TSP TSP(tsp) } #' @rdname reformulate_ATSP_as_TSP #' @export filter_ATSP_as_TSP_dummies <- function(tour, atsp) { ### Note: the tour can be in reverse order. t1 <- TOUR(tour[as.integer(tour) <= n_of_cities(atsp)], method = attr(tour, "method"), tsp = atsp) t2 <- TOUR(rev(tour[as.integer(tour) <= n_of_cities(atsp)]), method = attr(tour, "method"), tsp = atsp) if (attr(t1, "tour_length") > attr(t2, "tour_length")) t2 else t1 } TSP/R/ETSP.R0000644000176200001440000001001415102225601012005 0ustar liggesusers####################################################################### # TSP - Traveling Salesperson Problem # Copyright (C) 2011 Michael Hahsler and Kurt Hornik # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. #' Class ETSP -- Euclidean traveling salesperson problem #' #' Constructor to create an instance of a Euclidean traveling salesperson #' problem (TSP) represented by city coordinates and some auxiliary methods. #' #' Objects of class `ETSP` are internally represented as a `matrix` #' objects (use `as.matrix()` to get the `matrix` object). #' #' @family TSP #' #' @param x,object an object (data.frame or matrix) to be converted into a #' `ETSP` or, for the methods, an object of class `ETSP`. #' @param labels optional city labels. If not given, labels are taken from #' `x`. #' @param col color scheme for image. #' @param order order of cities for the image as an integer vector or an object #' of class [TOUR]. #' @param tour,y a tour to be visualized. #' @param tour_lty,tour_col line type and color for tour. #' @param labels logical; plot city labels. #' @param ... further arguments are passed on. #' @returns #' - `ETSP()` returns `x` as an object of class `ETSP`. #' - `n_of_cities()` returns the number of cities in `x`. #' - `labels()` returns a vector with the names of the cities in `x`. #' @author Michael Hahsler #' @keywords classes #' @examples #' ## create a random ETSP #' n <- 20 #' x <- data.frame(x = runif(n), y = runif(n), row.names = LETTERS[1:n]) #' etsp <- ETSP(x) #' etsp #' #' ## use some methods #' n_of_cities(etsp) #' labels(etsp) #' #' ## plot ETSP and solution #' tour <- solve_TSP(etsp) #' tour #' #' plot(etsp, tour, tour_col = "red") #' #' # plot with custom labels #' plot(etsp, tour, tour_col = "red", labels = FALSE) #' text(etsp, paste("City", rownames(etsp)), pos = 1) #' @export ETSP <- function(x, labels = NULL) { if(inherits(x, "ETSP")) return(x) x <- as.ETSP(x) if(!is.null(labels)) rownames(x) <- labels x } ## coercion #' @rdname ETSP #' @export as.ETSP <- function(x) UseMethod("as.ETSP") #' @rdname ETSP #' @export as.ETSP.matrix <- function(x){ mode(x) <- "numeric" if(is.null(rownames(x))) rownames(x) <- 1:nrow(x) class(x) <- c("ETSP", class(x)) x } #' @rdname ETSP #' @export as.ETSP.data.frame <- function(x){ as.ETSP(as.matrix(x)) } #' @rdname ETSP #' @export as.TSP.ETSP <- function(x) TSP(dist(x)) #' @rdname ETSP #' @export as.matrix.ETSP <- function(x, ...) { unclass(x) } ## print #' @rdname ETSP #' @export print.ETSP <- function(x, ...) { cat("object of class", sQuote(class(x)[1]), "\n") cat(n_of_cities(x), "cities", "(Euclidean TSP)\n") } ## number of cities #' @rdname ETSP #' @export n_of_cities.ETSP <- function(x) nrow(x) ## labels #' @rdname ETSP #' @export labels.ETSP <- function(object, ...) rownames(object) ## image #' @rdname ETSP #' @export image.ETSP <- function(x, order, col = gray.colors(64), ...) { p <- n_of_cities(x) if(missing(order)) order <- 1:p x <- as.TSP(x) graphics::image.default(1:p, 1:p, as.matrix(x)[order, order], col = col, ...) } #' @rdname ETSP #' @importFrom graphics text #' @export plot.ETSP <- function(x, y = NULL, tour = NULL, tour_lty = 2, tour_col = 2, labels = TRUE, ...) { x <- as.matrix(x) plot(x, y = NULL, ...) if(!is.null(y)) tour <- TOUR(y) if(!is.null(tour)) polygon(x[tour,], lty = tour_lty, border = tour_col) if(labels) text(x, y = NULL, labels = rownames(x), pos = 3) } TSP/R/AAA_TSP-package.R0000644000176200001440000000052715001730346013750 0ustar liggesusers#' @keywords internal #' #' @section Key functions: #' - [solve_TSP()] #' #' @importFrom stats as.dist dist #' @importFrom utils read.table write.table head tail #' @importFrom grDevices gray.colors #' @importFrom graphics image.default plot polygon #' @importFrom foreach foreach "%dopar%" #' #' @useDynLib TSP, .registration=TRUE "_PACKAGE" TSP/R/tsp_nn.R0000644000176200001440000000532715102413205012545 0ustar liggesusers####################################################################### # TSP - Traveling Salesperson Problem # Copyrigth (C) 2011 Michael Hahsler and Kurt Hornik # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ## nearest neighbor algorithm tsp_nn <- function(x, control = NULL) { ## parameter x comes checked from solve_TSP/solve_ATSP n <- n_of_cities(x) ## we use a matrix for now (covers TSP and ATSP) x <- as.matrix(x) control <- .get_parameters(control, list( start = sample(n, 1), verbose = FALSE ), method = "nn") start <- control$start if(start < 0 || start > n) stop(paste("illegal value for", sQuote("start"))) placed <- logical(n) order <- integer(n) ## place first city current <- start order[1L] <- current placed[current] <- TRUE while(length(rest <- which(!placed)) > 0L) { ## nearest <- rest[which.min(x[current,rest])] ## which.min has problems with Inf ## so we can break ties randomly now too x_sub <- x[current, rest] current <- rest[which(x_sub == min(x_sub, na.rm = TRUE))] if(length(current) > 1L) current <- sample(current, 1) ## place city order[n + 1L - length(rest)] <- current placed[current] <- TRUE if (control$verbose && (length(order) - length(rest)) %% 1000 == 0) cat("\r", "Placed: ", (length(order) - length(rest)), "/", length(order), sep = "") } if (control$verbose) cat("\nAll cities placed.\n\n") order } ## repetitive NN tsp_repetitive_nn <- function(x, control){ n <- n_of_cities(x) control <- .get_parameters(control, list(), method = "repetitive_nn") #tours <- lapply(1:n, function(i) tsp_nn(x, control = list(start = i))) ## no backend would warn! i <- 0L ## for R CMD check (no global binding for i) suppressWarnings( tours <- foreach(i = 1:n) %dopar% tsp_nn(x, control = list(start = i)) ) if (control$verbose) cat("All replications are complete.\n\n") lengths <- sapply(tours, FUN = function(i) tour_length(x, i)) tours[[which.min(lengths)]] } TSP/R/TOUR.R0000644000176200001440000000715415001730346012043 0ustar liggesusers####################################################################### # TSP - Traveling Salesperson Problem # Copyrigth (C) 2011 Michael Hahsler and Kurt Hornik # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. #' Class TOUR -- Solution to a traveling salesperson problem #' #' Class to store the solution of a TSP. Objects of this class are returned by #' TSP solvers in this package. Essentially, an object of class `TOUR` is #' a permutation vector containing the order of cities to visit. #' #' Since an object of class `TOUR` is an integer vector, it can be #' subsetted as an ordinary vector or coerced to an integer vector using #' `as.integer()`. It also contains the names of the objects as labels. #' Additionally, `TOUR` has the following attributes: `"method"`, #' `"tour_length"`. #' #' For most functions, e.g., [tour_length()] or [image.TSP()], the #' `TSP/ATSP` object used to find the tour is still needed, since the tour #' does not contain the distance information. #' #' @family TOUR #' #' @param x an integer permutation vector or, for the methods an object of #' class [TOUR]. #' @param object data (an integer vector) which can be coerced to `TOUR`. #' @param method character string; method used to create the tour. #' @param tsp `TSP` object the tour applies to. If available then the tour #' will include the tour length. Also the labels of the cities will be #' available in the tour (otherwise the labels of `x` are used). #' @param ... further arguments are passed on. #' @author Michael Hahsler #' @keywords classes #' @examples #' TOUR(1:10) #' #' ## calculate a tour #' data("USCA50") #' tour <- solve_TSP(USCA50) #' tour #' #' ## get tour length directly from tour #' tour_length(tour) #' #' ## get permutation vector #' as.integer(tour) #' #' ## show labels #' labels(tour) #' @export TOUR <- function(x, method = NA, tsp = NULL) { if (inherits(x, "TOUR")) return(x) x <- as.TOUR(x) attr(x, "method") <- as.character(method) if (!is.null(tsp)) { attr(x, "tour_length") <- tour_length(x, tsp) names(x) <- labels(tsp)[x] } x } ## coercion #' @rdname TOUR #' @export as.TOUR <- function(object) UseMethod("as.TOUR") #' @rdname TOUR #' @export as.TOUR.numeric <- function(object) { l <- labels(object) ### preserve labels object <- as.integer(object) names(object) <- l as.TOUR(object) } #' @rdname TOUR #' @export as.TOUR.integer <- function(object) { ## check tour if (any(object < 1) || any(object > length(object)) || any(is.na(object))) stop("tour contains illegal elements.") if (any(duplicated(object))) stop("tour indices are not unique.") class(object) <- c("TOUR", class(object)) object } #' @rdname TOUR #' @export print.TOUR <- function(x, ...) { cat("object of class", sQuote(class(x)[1]), "\n") cat("result of method", sQuote(attr(x, "method")), "for", length(x), "cities\n") if (!is.null(attr(x, "tour_length"))) cat("tour length:", attr(x, "tour_length"), "\n") else cat("tour length: unknown\n") } TSP/R/cut_tour.R0000644000176200001440000000632715001730346013117 0ustar liggesusers####################################################################### # TSP - Traveling Salesperson Problem # Copyrigth (C) 2011 Michael Hahsler and Kurt Hornik # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. #' Cut a tour to form a path #' #' Cuts a tour at a specified city to form a path. #' #' @family TOUR #' #' @param x an object of class [TOUR]. #' @param cut the index or label of the city/cities to cut the tour. #' @param exclude_cut exclude the city where we cut? If `FALSE`, the city #' at the cut is included in the path as the first city. #' @return Returns a named vector with city ids forming the path. If multiple #' cuts are used then a list with paths is returned. #' @author Michael Hahsler #' @keywords optimize #' @examples #' data("USCA50") #' #' ## find a path starting at Austin, TX #' tour <- solve_TSP(USCA50) #' path <- cut_tour(tour, cut = "Austin, TX", exclude_cut = FALSE) #' path #' #' ## cut the tours at two cities #' tour <- solve_TSP(USCA50) #' path <- cut_tour(tour, cut = c("Austin, TX", "Cambridge, MA"), exclude_cut = FALSE) #' path #' #' ## cut a tour at the largest gap using a dummy city #' tsp <- insert_dummy(USCA50, label = "cut") #' tour <- solve_TSP(tsp) #' #' ## cut tour into path at the dummy city #' path <- cut_tour(tour, "cut") #' path #' @export cut_tour <- function(x, cut, exclude_cut = TRUE) UseMethod("cut_tour") #' @rdname cut_tour #' @export cut_tour.TOUR <- function(x, cut, exclude_cut = TRUE) { exclude_cut <- as.integer(exclude_cut) ## city label if (is.character(cut)) { cut <- which(as.logical(apply( sapply(cut, "==", labels(x)), MARGIN = 1, sum ))) if (length(cut) < 1) stop("cut has to exist") ## city id } else { if (any(is.na(cut <- match(cut, x)))) stop("cut has to exist") } if (length(cut) == 1L) { ## single path if (exclude_cut && length(x) <= 1) path <- integer(0) else path <- c(x, x)[(cut + exclude_cut):(length(x) + cut - 1L)] } else { ## multiple paths, return as a list path <- replicate(length(cut), integer(0)) path[[1L]] <- c(if ((tail(cut, 1) + exclude_cut) <= length(x)) (tail(cut, 1) + exclude_cut):length(x) else NULL, if (cut[1] > 1) 1:(cut[1] - 1L) else NULL) for (i in seq_len(length(cut) - 1L)) { if ((cut[i] + exclude_cut) <= (cut[i + 1L] - 1L)) path[[i + 1L]] <- (cut[i] + exclude_cut):(cut[i + 1L] - 1L) } path <- lapply( path, FUN = function(i) x[i] ) if (exclude_cut) names(path) <- labels(x)[cut] } path } TSP/R/TSP.R0000644000176200001440000001106715001730346011716 0ustar liggesusers####################################################################### # TSP - Traveling Salesperson Problem # Copyrigth (C) 2011 Michael Hahsler and Kurt Hornik # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. #' Class TSP -- Symmetric traveling salesperson problem #' #' Constructor to create an instance of a symmetric traveling salesperson #' problem (TSP) and some auxiliary methods. #' #' Objects of class `TSP` are internally represented as `dist` #' objects (use [as.dist()] to get the `dist` object). #' #' Not permissible paths can be set to a distance of `+Inf`. `NA`s are not allowed and `-Inf` will lead #' to the algorithm only being able to find an admissible tour, but not the best one. #' #' @family TSP #' #' @param x,object an object (currently `dist` or a symmetric matrix) to #' be converted into a `TSP` or, for the methods, an object of class #' `TSP`. #' @param labels optional city labels. If not given, labels are taken from #' `x`. #' @param method optional name of the distance metric. If `x` is a #' `dist` object, then the method is taken from that object. #' @param col color scheme for image. #' @param order order of cities for the image as an integer vector or an object #' of class [TOUR]. #' @param ... further arguments are passed on. #' @returns #' - `TSP()` returns `x` as an object of class `TSP`. #' - `n_of_cities()` returns the number of cities in `x`. #' - `labels()` returns a vector with the names of the cities in `x`. #' @author Michael Hahsler #' @keywords classes #' @examples #' data("iris") #' d <- dist(iris[-5]) #' #' ## create a TSP #' tsp <- TSP(d) #' tsp #' #' ## use some methods #' n_of_cities(tsp) #' labels(tsp) #' image(tsp) #' @export TSP <- function(x, labels = NULL, method = NULL) { if (inherits(x, "TSP")) return(x) x <- as.TSP(x) if (!is.null(labels)) attr(x, "Labels") <- labels if (!is.null(method)) attr(x, "method") <- method x } ## coercion #' @rdname TSP #' @export as.TSP <- function(x) UseMethod("as.TSP") #' @rdname TSP #' @export as.TSP.dist <- function(x) { ## make sure we have a upper triangle matrix w/o diagonal x <- as.dist(x, diag = FALSE, upper = FALSE) ## make sure we have labels if (is.null(attr(x, "Labels"))) attr(x, "Labels") <- c(1:n_of_cities(x)) if (any(is.nan(x))) stop(paste(sQuote("NAs"), "not supported")) ## make sure data is numeric mode(x) <- "numeric" class(x) <- c("TSP", class(x)) x } #' @rdname TSP #' @export as.TSP.matrix <- function(x) { if (!isSymmetric(x)) stop("TSP requires a symmetric matrix") method <- attr(x, "method") x <- as.dist(x, diag = FALSE, upper = FALSE) attr(x, "method") <- method ## make sure we have labels if (is.null(attr(x, "Labels"))) attr(x, "Labels") <- c(1:n_of_cities(x)) if (any(is.nan(x))) stop(paste(sQuote("NAs"), "not supported")) ## make sure data is numeric mode(x) <- "numeric" class(x) <- c("TSP", class(x)) x } #' @rdname TSP #' @param m a TSP object to be converted to a [dist] object. #' @export as.dist.TSP <- function(m, ...) { class(m) <- "dist" as.dist(m, ...) } ## print #' @rdname TSP #' @export print.TSP <- function(x, ...) { method <- attr(x, "method") if (is.null(method)) method <- "unknown" cat("object of class", sQuote(class(x)[1]), "\n") cat(n_of_cities(x), "cities", paste("(distance ", sQuote(method), ")", sep = ""), "\n") } ## generic for n_of_cities #' @rdname TSP #' @export n_of_cities <- function(x) UseMethod("n_of_cities") ## number of cities #' @rdname TSP #' @export n_of_cities.TSP <- function(x) attr(x, "Size") #' @export n_of_cities.default <- n_of_cities.TSP ## labels #' @rdname TSP #' @export labels.TSP <- function(object, ...) attr(object, "Labels") ## image #' @rdname TSP #' @export image.TSP <- function(x, order, col = gray.colors(64), ...) { p <- n_of_cities(x) if (missing(order)) order <- 1:p graphics::image.default(1:p, 1:p, as.matrix(x)[order, order], col = col, ...) } TSP/R/tsp_SA.R0000644000176200001440000000511515100721551012434 0ustar liggesusers####################################################################### # TSP - Traveling Salesperson Problem # Copyrigth (C) 2011 Michael Hahsler and Kurt Hornik # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ## simulated annealing # Subtour reversal # FIXME: when i>j then we should revert the beginning # and the end of the tour instead! tsp_SA_reversal <- function(tour, x) { n <- length(tour) # Pick two random distinct positions pos <- sample(1:n, 2, replace = FALSE) i <- pos[1] j <- pos[2] # Swap the cities at these positions new_tour <- tour new_tour[i:j] <- rev(tour[i:j]) return(new_tour) } # A simple swap operator is commonly used for TSP tsp_SA_swap <- function(tour, x) { n <- length(tour) # Pick two random distinct positions pos <- sample(1:n, 2, replace = FALSE) i <- pos[1] j <- pos[2] # Swap the cities at these positions new_tour <- tour new_tour[i] <- tour[j] new_tour[j] <- tour[i] return(new_tour) } tsp_SA_mixed <- function(tour, x) { if (stats::runif(1) > .5) tsp_SA_reversal(tour, x) else tsp_SA_swap(tour, x) } tsp_SA <- function(x, control = NULL){ control <- .get_parameters(control, list( tour = NULL, local_move = tsp_SA_reversal, temp = NULL, # Initial temperature tmax = 10, # number of evaluations per temperature step maxit = 10000, # Number of iterations trace = 0 ), method = "SA") initial_tour <- as.TOUR(control$tour %||% sample(n_of_cities(x))) control$temp <- control$temp %||% tour_length(x, initial_tour) / n_of_cities(x) cost_function <- function(tour, x) tour_length(x, as.integer(tour)) ret <- stats::optim( par = initial_tour, fn = cost_function, gr = control$local_move, method = "SANN", x = x, # Pass additional argument to fn and gr control = list( temp = control$temp, tmax = control$tmax, maxit = control$maxit, trace = control$trace ) ) TOUR(as.integer(ret$par), "sa", x) } TSP/R/AAA_parameter.R0000644000176200001440000000417215102701520013663 0ustar liggesusers####################################################################### # Code to check parameter/control objects # Copyrigth (C) 2011-2016 Michael Hahsler # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ## helper to parse parameter lists with defaults .nodots <- function(...) { l <- list(...) if(length(l) > 0L) warning("Unknown arguments: ", paste(names(l), "=",l, collapse=", ")) } .get_parameters <- function(parameter, defaults, method = NA) { defaults <- c(as.list(defaults), "two_opt" = FALSE, rep = FALSE) parameter <- as.list(parameter) ## add verbose if(is.null(defaults$verbose)) defaults$verbose <- FALSE if(length(parameter) != 0) { o <- pmatch(names(parameter), names(defaults)) ## unknown parameter if(any(is.na(o))){ warning(sprintf(ngettext(length(is.na(o)), "Unknown parameter: %s", "Unknown parameters: %s"), paste(names(parameter)[is.na(o)], collapse = ", ")), call. = FALSE, immediate. = FALSE) #cat("Available parameter (with default values):\n") #print(defaults) # cat(rbind(names(defaults)," = ", gsub("\n"," ",as.character(defaults))), # sep=c("\t"," ","\n")) } defaults[o[!is.na(o)]] <- parameter[!is.na(o)] } if(defaults$verbose) { cat("Used control parameters by", sQuote(method), "\n") #print(defaults) cat(rbind(names(defaults)," = ", strtrim(gsub("\n"," ",as.character(defaults)), 50)), sep=c("\t"," ","\n")) cat("\n") } defaults } TSP/R/tour_length.R0000644000176200001440000000614115001730346013577 0ustar liggesusers####################################################################### # TSP - Traveling Salesperson Problem # Copyrigth (C) 2011 Michael Hahsler and Kurt Hornik # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. #' Calculate the length of a tour #' #' Calculate the length of a [TOUR] for a [TSP]. #' #' If no `tsp` is specified, then the tour length stored in `x` as #' attribute `"tour_length"` is returned. If `tsp` is given then the #' tour length is recalculated using the specified TSP problem. #' #' If a distance in the tour is infinite, the result is also infinite. If the #' tour contains positive and negative infinite distances then the method #' returns `NA`. #' #' @family TOUR #' #' @param x a TSP problem or a [TOUR]. #' @param order an object of class `TOUR` #' @param tsp as TSP object. #' @param ... further arguments are currently unused. #' @author Michael Hahsler #' @keywords optimize #' @examples #' #' data("USCA50") #' #' ## original order #' tour_length(solve_TSP(USCA50, method="identity")) #' #' ## length of a manually created (random) tour #' tour <- TOUR(sample(seq(n_of_cities(USCA50)))) #' tour #' tour_length(tour) #' tour_length(tour, USCA50) #' @export tour_length <- function(x, ...) UseMethod("tour_length") #' @rdname tour_length #' @export tour_length.TSP <- function(x, order, ...) { n <- n_of_cities(x) if (missing(order)) order <- 1:n .Call(R_tour_length_dist, x, order) } #' @rdname tour_length #' @export tour_length.ATSP <- function(x, order, ...) { n <- n_of_cities(x) if (missing(order)) order <- 1:n .Call(R_tour_length_matrix, x, order) } ### faster for small n but takes O(n^2) memory #tour_length.ETSP <- function(x, order) tour_length(as.TSP(x), order) #' @rdname tour_length #' @export tour_length.ETSP <- function(x, order, ...) { n <- n_of_cities(x) if (n != nrow(x)) stop("x and order do not have the same number of cities!") if (missing(order)) order <- 1:n as.numeric(sum(sapply( 1:(n - 1), FUN = function(i) dist(x[order[c(i, i + 1)], , drop = FALSE]) )) + dist(x[order[c(n, 1)], , drop = FALSE])) } #' @rdname tour_length #' @export tour_length.TOUR <- function(x, tsp = NULL, ...) { if (is.null(tsp)) { len <- attr(x, "tour_length") if (is.null(len)) len <- NA return(len) } tour_length(x = tsp, order = x) } #' @rdname tour_length #' @export tour_length.integer <- function(x, tsp = NULL, ...) { if (is.null(tsp)) return(NA) tour_length(x = tsp, order = x) } TSP/R/tsp_insertion.R0000644000176200001440000001102415102514660014142 0ustar liggesusers####################################################################### # TSP - Traveling Salesperson Problem # Copyrigth (C) 2011 Michael Hahsler and Kurt Hornik # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ## Insertion algorithms ## (Rosenkrantz et al. 1977) tsp_insertion <- function(x, type = "nearest", control = NULL){ ## since sample has an annoying convenience feature for ## length(x) == 1 choose1 <- function(x) if(length(x) > 1L) sample(x, 1L) else x ## this is slower than which.min and which.max but works also ## correctly for only values Inf in x and breaks ties randomly choose1_min <- function(x) choose1(which(x == min(x))) choose1_max <- function(x) choose1(which(x == max(x))) types <- c("nearest", "farthest", "cheapest", "arbitrary") type_num <- pmatch(type, types) if(is.na(type_num)) stop(paste("Unknown insertion type: ", sQuote(type))) ## x comes checked form solve_TSP/solve_ATSP n <- n_of_cities(x) ## we use a matrix for now (covers TSP and ATSP) asym <- inherits(x, "ATSP") x <- as.matrix(x) ## place first city control <- .get_parameters(control, list( start = sample(n, 1), verbose = FALSE ), method = paste0(types[type_num], "_insertion")) start <- as.integer(control$start) if(start < 0 || start > n) stop(paste("illegal value for", sQuote("start"))) placed <- logical(n) placed[start] <- TRUE order <- c(start) ## place other cities while(any(placed == FALSE)) { ## find city to be inserted ks <- which(!placed) js <- which(placed) if (control$verbose && length(js) %% 100 == 0) cat("\r", "Placed: ", length(js), "/", length(placed), sep = "") ## nearest / farthest if(type_num < 3) { m <- x[ks,js, drop = FALSE] ## for the asymmetric case we have to take distances ## from and to the city into account if(asym){ m <- cbind(m, t(x)[ks,js, drop = FALSE]) } ds <- apply(m, MARGIN = 1, min) ## nearest/farthest insertion winner_index <- if(type_num == 1) choose1_min(ds) else choose1_max(ds) k <- ks[winner_index] } ## cheapest else if(type_num == 3) { winner_index <- choose1_min(sapply(ks, FUN = function(k) min(.Call(R_insertion_cost, x, order, k)) )) k <- ks[winner_index] ## we look for the optimal insertion place for k again later ## this is not necessary, but it is more convenient ## to reuse the code for the other insertion algorithms for now. } ## random else if(type_num == 4) k <- choose1(ks) ## just in case else stop("unknown insertion type") ## do insertion placed[k] <- TRUE if(length(order) == 1) order <- append(order, k) else { pos <- choose1_min(.Call(R_insertion_cost, x, order, k)) order <- append(order, k, after = pos) } } if (control$verbose) cat("\nAll cities placed.\n\n") order } ### faster arbitrary insertion (random sampling takes care of breaking ties) tsp_insertion_arbitrary <- function(x, control = NULL){ ## x comes checked form solve_TSP/solve_ATSP n <- n_of_cities(x) control <- .get_parameters(control, list(), method = "arbitrary_insertion") ## we use a matrix for now (covers TSP and ATSP) x <- as.matrix(x) ## deal with special cases if(nrow(x) == 1) return(1L) if(nrow(x) == 2) return(sample(1:2)) x[is.na(x)] <- Inf ## random order rorder <- sample(n) x <- x[rorder, rorder] ## FIXME: specify start city ## place first two cities order <- integer(n) order[1:2] <- 1:2 ## place other cities for(i in 3:n) { pos <- which.min(.Call(R_insertion_cost, x, order[1:(i-1L)], i)) + 1L order[((pos):i)+1L] <- order[(pos):i] order[pos] <- i if (control$verbose && i %% 100 == 0) { cat("\r", "Placed: ", i, "/", length(order), sep = "") } } if (control$verbose) cat("\nAll cities placed.\n\n") rorder[order] } TSP/R/tsp_two_opt.R0000644000176200001440000000363715001730346013635 0ustar liggesusers####################################################################### # TSP - Traveling Salesperson Problem # Copyrigth (C) 2011 Michael Hahsler and Kurt Hornik # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ## heuristic to improve a tour using exchanges of 2 edges. tsp_two_opt <- function(x, control = NULL){ control <- .get_parameters(control, list( tour = NULL, two_opt_repetitions = 1 ), method = "two_opt") if (!is.null(control$tour) && control$two_opt_repetitions > 1) { control$two_opt_repetitions <- 1 warning("Doing multiple repetitions of two-opt given a fixed tour does not make sense. Doing only 1 repetition.") } ## improve a given tour or create a random tour ## we use a function since for rep >1 we want several random ## initial tours initial <- function() { if(!is.null(control$tour)) as.integer(control$tour) else sample(n_of_cities(x)) } xx <- as.matrix(x) if(control$two_opt_repetitions > 1) { tour <- replicate(control$two_opt_repetitions, .Call(R_two_opt, xx, initial()), simplify = FALSE) lengths <- sapply(tour, FUN = function(t) tour_length(x, t)) cat(lengths) tour <- tour[[which.min(lengths)]] }else tour <- .Call(R_two_opt, xx, initial()) if (control$verbose) cat("Two-opt done.\n\n") tour } TSP/vignettes/0000755000176200001440000000000015111650532012727 5ustar liggesusersTSP/vignettes/TSP.Rnw0000644000176200001440000013064015001730346014071 0ustar liggesusers%\documentclass[10pt,a4paper,fleqn]{article} \documentclass[nojss]{jss} \usepackage[english]{babel} %% my packages %\usepackage{a4wide} %\usepackage[round,longnamesfirst]{natbib} %\usepackage{hyperref} % \usepackage{amsmath} \usepackage{amsfonts} % %\newcommand{\strong}[1]{{\normalfont\fontseries{b}\selectfont #1}} \newcommand{\class}[1]{\mbox{\textsf{#1}}} \newcommand{\func}[1]{\mbox{\texttt{#1()}}} %\newcommand{\code}[1]{\mbox{\texttt{#1}}} %\newcommand{\pkg}[1]{\strong{#1}} \newcommand{\samp}[1]{`\mbox{\texttt{#1}}'} %\newcommand{\proglang}[1]{\textsf{#1}} \newcommand{\set}[1]{\mathcal{#1}} %\usepackage{Sweave} %% \VignetteIndexEntry{Introduction to TSP} \author{Michael Hahsler\\Southern Methodist University \And Kurt Hornik\\Wirtschaftsuniversit\"at Wien} \title{\pkg{TSP} -- Infrastructure for the Traveling Salesperson Problem} %% for pretty printing and a nice hypersummary also set: \Plainauthor{Michael Hahsler, Kurt Hornik} %% comma-separated \Plaintitle{TSP -- Infrastructure for the Traveling Salesperson Problem} %% without formatting \Shorttitle{Infrastructure for the TSP} %% a short title (if necessary) %% an abstract and keywords \Abstract{ The traveling salesperson problem (also known as traveling salesman problem or TSP) is a well known and important combinatorial optimization problem. The goal is to find the shortest tour that visits each city in a given list exactly once and then returns to the starting city. Despite this simple problem statement, solving the TSP is difficult since it belongs to the class of NP-complete problems. The importance of the TSP arises besides from its theoretical appeal from the variety of its applications. Typical applications in operations research include vehicle routing, computer wiring, cutting wallpaper and job sequencing. The main application in statistics is combinatorial data analysis, e.g., reordering rows and columns of data matrices or identifying clusters. In this paper we introduce the \proglang{R}~package \pkg{TSP} which provides a basic infrastructure for handling and solving the traveling salesperson problem. The package features S3 classes for specifying a TSP and its (possibly optimal) solution as well as several heuristics to find good solutions. In addition, it provides an interface to \emph{Concorde}, one of the best exact TSP solvers currently available. } \Keywords{combinatorial optimization, traveling salesman problem, \proglang{R}} \Plainkeywords{combinatorial optimization, traveling salesman problem, R} %% without formatting %% The address of (at least) one author should be given %% in the following format: \Address{ Michael Hahsler\\ Engineering Management, Information, and Systems\\ Lyle School of Engineering\\ Southern Methodist University\\ P.O. Box 750123 \\ Dallas, TX 75275-0123\\ E-mail: \email{mhahsler@lyle.smu.edu}\\ Kurt Hornik\\ Department of Finance, Accounting and Statistics\\ Wirtschaftsuniversit\"at Wien\\ 1090 Wien, Austria\\i E-mail: \email{kurt.hornik@wu-wien.ac.at}\\ URL: \url{http://statmath.wu.ac.at/~hornik/} } \begin{document} <>= options(width = 75, useFancyQuotes=FALSE, prompt="R> ") ### for sampling set.seed(1234) @ %\title{Introduction to \pkg{TSP} -- Infrastructure for the Traveling % Salesperson Problem} %\author{Michael Hahsler and Kurt Hornik} \maketitle \sloppy %\abstract{ % The traveling salesperson (or, salesman) problem (TSP) is a % well known and important combinatorial optimization problem. The goal % is to find the shortest tour that visits each city in a given list % exactly once and then returns to the starting city. Despite this % simple problem statement, solving the TSP is difficult since it % belongs to the class of NP-complete problems. The importance of the % TSP arises besides from its theoretical appeal from the variety of its % applications. Typical applications in operations research include % vehicle routing, computer wiring, cutting wallpaper and job % sequencing. The main application in statistics is combinatorial data % analysis, e.g., reordering rows and columns of data matrices or % identifying clusters. In this paper we introduce the % \proglang{R}~package \pkg{TSP} which provides a basic infrastructure % for handling and solving the traveling salesperson problem. The % package features S3 classes for specifying a TSP and its (possibly % optimal) solution as well as several heuristics to find good % solutions. In addition, it provides an interface to \emph{Concorde}, % one of the best exact TSP solvers currently available. } \section{Introduction} The traveling salesperson problem~\citep[TSP;][]{Lawler1985, Gutin2002} is a well known and important combinatorial optimization problem. The goal is to find the shortest tour that visits each city in a given list exactly once and then returns to the starting city. Formally, the TSP can be stated as follows. The distances between $n$ cities are stored in a distance matrix $\mathbf{D}$ with elements $d_{ij}$ where $i,j = 1\dots n$ and the diagonal elements $d_{ii}$ are zero. A \emph{tour} can be represented by a cyclic permutation $\pi$ of $\{1, 2,\dots, n\}$ where $\pi(i)$ represents the city that follows city $i$ on the tour. The traveling salesperson problem is then the optimization problem to find a permutation $\pi$ that minimizes the \emph{length of the tour} denoted by \begin{equation} \sum_{i=1}^n d_{i\pi(i)}. \end{equation} % see Lenstra & Kan 1975: Some simple Applications to the TSP For this minimization task, the tour length of $(n-1)!$ permutation vectors have to be compared. This results in a problem which is very hard to solve and in fact known to be NP-complete~\citep{Johnson1985a}. However, solving TSPs is an important part of applications in many areas including vehicle routing, computer wiring, machine sequencing and scheduling, frequency assignment in communication networks~\citep{Lenstra1975, Punnen2002}. %and structuring of %matrices~\citep{Lenstra1975, Punnen2002}. Applications in statistical data analysis include ordering and clustering objects. For example, data analysis applications in psychology ranging from profile smoothing to finding an order in developmental data are presented by~\cite{Hubert1978}. Clustering and ordering using TSP solvers is currently becoming popular in biostatistics. For example, \cite{Ray2007} describe an application for ordering genes and \cite{Johnson2006} use a TSP solver for clustering proteins. In this paper we give a very brief overview of the TSP and introduce the \proglang{R}~package \pkg{TSP} which provides an infrastructure for handling and solving TSPs. The paper is organized as follows. In Section~\ref{sec:TSP} we briefly present important aspects of the TSP including different problem formulations and approaches to solve TSPs. In Section~\ref{sec:infrastructure} we give an overview of the infrastructure implemented in \pkg{TSP} and the basic usage. In Section~\ref{sec:examples}, several examples are used to illustrate the package's capabilities. Section~\ref{sec:conclusion} concludes the paper. A previous version of this manuscript was published in the \emph{Journal of Statistical Software} \citep{TSP:Hahsler+Hornik2007}. \section{Theory} \label{sec:TSP} In this section, we briefly summarize some aspects of the TSP which are important for the implementation of the \pkg{TSP} package described in this paper. For a complete treatment of all aspects of the TSP, we refer the interested reader to the classic book edited by \cite{Lawler1985} and the more modern book edited by \cite{Gutin2002}. It has to be noted that in this paper, following the origin of the TSP, the term \emph{distance} is used. Distance is used here interchangeably with dissimilarity or cost and, unless explicitly stated, no restrictions to measures which obey the triangle inequality are made. An important distinction can be made between the symmetric TSP and the more general asymmetric TSP. For the symmetric case (normally referred to as just \emph{TSP}), for all distances in $\mathbf{D}$ the equality $d_{ij} = d_{ji}$ holds, i.e., it does not matter if we travel from $i$ to $j$ or the other way round, the distance is the same. In the asymmetric case (called \emph{ATSP}), the distances are not equal for all pairs of cities. Problems of this kind arise when we do not deal with spatial distances between cities but, e.g., with the cost or necessary time associated with traveling between locations, where the price for the plane ticket between two cities may be different depending on which way we go. \subsection{Different formulations of the TSP} \label{sec:formulations} Other than the permutation problem in the introduction, the TSP can also be formulated as a graph theoretic problem. Here the TSP is formulated by means of a complete graph $G = (V, E)$, where the cities correspond to the node set $V = \{1,2,\ldots,n\}$ and each edge $e_i \in E$ has an associated weight $w_i$ representing the distance between the nodes it connects. If the graph is not complete, the missing edges can be replaced by edges with very large distances. The goal is to find a \emph{Hamiltonian cycle}, i.e., a cycle which visits each node in the graph exactly once, with the least weight in the graph~\citep{Hoffman1985}. This formulation naturally leads to procedures involving minimum spanning trees for tour construction or edge exchanges to improve existing tours. TSPs can also be represented as integer and linear programming problems~\citep[see, e.g.,][]{Punnen2002}. The \emph{integer programming (IP) formulation} is based on the assignment problem with additional constraint of no sub-tours: \[ \begin{array}{rl} \text{Minimize } & \sum_{i=1}^n\sum_{j=1}^n{d_{ij}x_{ij}} % = \mathrm{trace}(\mathbf{D}^T\mathbf{X}) \\[3mm] \text{Subject to } & \sum_{i=1}^n{x_{ij}=1}, \quad j=1,\ldots,n, \\ & \sum_{j=1}^n{x_{ij}=1}, \quad i=1,\ldots,n, \\ & x_{ij} = 0 \text{ or } 1 \\ & \text{no sub-tours allowed} \\ \end{array} \] The solution matrix $\mathbf{X} = (x_{ij})$ of the assignment problem represents a tour or a collection of sub-tour (several unconnected cycles) where only edges which corresponding to elements $x_{ij} = 1$ are on the tour or a sub-tour. The additional restriction that no sub-tours are allowed (called \emph{sub-tour elimination constraints}) restrict the solution to only proper tours. Unfortunately, the number of sub-tour elimination constraints grows exponentially with the number of cities which leads to an extremely hard problem. The \emph{linear programming (LP) formulation} of the TSP is given by: \[ \begin{array}{rl} \text{Minimize } & \sum_{i=1}^m{w_ix_i} = \mathbf{w}^T\mathbf{x}\\[3mm] \text{Subject to } & \mathbf{x} \in \mathcal{S} \\ \end{array} \] where $m$ is the number of edges $e_i$ in $G$, $w_i \in \mathbf{w}$ is the weight of edge $e_i$ and $\mathbf{x}$ is the incidence vector indicating the presence or absence of each edge in the tour. Again, the constraints given by $\mathbf{x} \in \mathcal{S}$ are problematic since they have to contain the set of incidence vectors of all possible Hamiltonian cycles in $G$ which amounts to a direct search of all $(n-1)!$ possibilities and thus in general is infeasible. However, relaxed versions of the linear programming problem with removed integrality and sub-tour elimination constraints are extensively used by modern TSP solvers where such a partial description of constraints is used and improved iteratively in a branch-and-bound approach. \subsection{Useful manipulations of the distance matrix} \label{sec:manipulations} Sometimes it is useful to transform the distance matrix $\mathbf{D} = (d_{ij})$ of a TSP into a different matrix $\mathbf{D'} = (d'_{ij})$ which has the same optimal solution. Such a transformation requires that for any Hamiltonian cycle $H$ in a graph represented by its distance matrix $\mathbf{D}$ the equality \begin{equation*} \sum_{i,j \in H}{d_{ij}} = \alpha \sum_{i,j \in H}{d'_{ij}} + \beta \end{equation*} holds for suitable $\alpha > 0$ and $\beta \in \mathbb{R}$. From the equality we see that additive and multiplicative constants leave the optimal solution invariant. This property is useful to rescale distances, e.g., for many solvers, distances in the interval $[0, 1]$ have to be converted into integers from~1 to a maximal value. A different manipulation is to reformulate an asymmetric TSP as a symmetric TSP. This is possible by doubling the number of cities~\citep{Jonker1983}. For each city a dummy city is added. Between each city and its corresponding dummy city a very small value (e.g., $-\infty$) is used. This makes sure that each city always occurs in the solution together with its dummy city. The original distances are used between the cities and the dummy cities, where each city is responsible for the distance going to the city and the dummy city is responsible for the distance coming from the city. The distances between all cities and the distances between all dummy cities are set to a very large value (e.g., $\infty$) which makes these edges infeasible. An example for equivalent formulations as an asymmetric TSP (to the left) and a symmetric TSP (to the right) for three cities is: \begin{equation*} \begin{pmatrix} 0 &d_{12} &d_{13} \\ d_{21} &0 &d_{23} \\ d_{31} &d_{32} &0 \\ \end{pmatrix} \Longleftrightarrow \begin{pmatrix} 0 &\infty &\infty & -\infty &d_{21} &d_{31} \\ \infty &0 &\infty & d_{12} &-\infty &d_{31} \\ \infty &\infty &0 & d_{13} &d_{23} &-\infty \\ -\infty &d_{12} &d_{13} & 0 &\infty &\infty \\ d_{21} &-\infty &d_{23} & \infty &0 &\infty \\ d_{31} &d_{32} &-\infty & \infty &\infty &0 \\ \end{pmatrix} \end{equation*} Instead of the infinity values suitably large negative and positive values can be used. The new symmetric TSP can be solved using techniques for symmetric TSPs which are currently far more advanced than techniques for ATSPs. Removing the dummy cities from the resulting tour gives the solution for the original ATSP. \subsection{Finding exact solutions for the TSP} \label{sec:exact} Finding the exact solution to a TSP with $n$ cities requires to check $(n-1)!$ possible tours. To evaluate all possible tours is infeasible for even small TSP instances. To find the optimal tour \cite{Held1962} presented the following \emph{dynamic programming} formulation: Given a subset of city indices (excluding the first city) $S \subset \{2, 3, \dots, n\}$ and $l \in S$, let $d^*(S, l)$ denote the length of the shortest path from city $1$ to city $l$, visiting all cities in $S$ in-between. For $S = \{l\}$, $d^*(S,l)$ is defined as $d_{1l}$. The shortest path for larger sets with $|S| > 1$ is \begin{equation} d^*(S,l) = \mathrm{min}_{m \in S\setminus\{l\}}\Bigl( d^*(S\setminus\{l\},m) + d_{ml}\Bigl). %\text{ for } |S| > 1. \end{equation} Finally, the minimal tour length for a complete tour which includes returning to city $1$ is \begin{equation} d^{**} = \mathrm{min}_{l \in \{2,3,\dots,n\}}\Bigl( d^*(\{2,3,\dots,n\}, l) + d_{l1}\Bigl). \end{equation} Using the last two equations, the quantities $d^*(S,l)$ can be computed recursively and the minimal tour length $d^{**}$ can be found. In a second step, the optimal permutation $\pi = \{1, i_2, i_3,\dots,i_n\}$ of city indices $1$ through $n$ can be computed in reverse order, starting with $i_n$ and working successively back to $i_2$. The procedure exploits the fact that a permutation $\pi$ can only be optimal, if \begin{equation} d^{**} = d^*(\{2,3,\dots,n\}, i_n) + d_{i_n1} \end{equation} and, for $2 \le p \le n-1$, \begin{equation} d^*(\{i_2, i_3,\dots, i_p, i_{p+1}\}, i_{p+1}) = d^*(\{i_2,i_3,\dots,i_p\}, i_p) + d_{i_pi_{p+1}}. \end{equation} The space complexity of storing the values for all $d^*(S,l)$ is $(n-1)2^{n-2}$ which severely restricts the dynamic programming algorithm to TSP problems of small sizes. However, for very small TSP instances this approach is fast and efficient. %\marginpar{time complexity if order $n^22^n$. Check!} A different method, which can deal with larger instances, uses a relaxation of the linear programming problem presented in Section~\ref{sec:formulations} and iteratively tightens the relaxation till a solution is found. This general method for solving linear programming problems with complex and large inequality systems is called \emph{cutting plane method} and was introduced by \cite{Dantzig1954}. Each iteration begins with using instead of the original linear inequality description $\mathcal{S}$ the relaxation $A\mathbf{x} \le b$, where the polyhedron $P$ defined by the relaxation contains $\mathcal{S}$ and is bounded. The optimal solution $\mathbf{x}^*$ of the relaxed problem can be obtained using standard linear programming solvers. If the $\mathbf{x}^*$ found belongs to $\mathcal{S}$, the optimal solution of the original problem is obtained, otherwise, a linear inequality can be found which is satisfied by all points in $\mathcal{S}$ but violated by $\mathbf{x}^*$. Such an inequality is called a cutting plane or cut. A family of such cutting planes can be added to the inequality system $A\mathbf{x} \le b$ to obtain a tighter relaxation for the next iteration. If no further cutting planes can be found or the improvement in the objective function due to adding cuts gets very small, the problem is branched into two sub-problems which can be minimized separately. Branching is done iteratively which leads to a binary tree of sub-problems. Each sub-problem is either solved without further branching or is found to be irrelevant because its relaxed version already produces a longer path than a solution of another sub-problem. This method is called \emph{branch-and-cut}~\citep{Padberg1990} which is a variation of the well known \emph{branch-and-bound}~\citep{Land1960} procedure. The initial polyhedron $P$ used by \cite{Dantzig1954} contains all vectors $\mathbf{x}$ for which all $x_e \in \mathbf{x}$ satisfy $0 \le x_e \le 1$ and in the resulting tour each city is linked to exactly two other cities. Various separation algorithms for finding subsequent cuts to prevent sub-tours (\emph{sub-tour elimination inequalities}) and to ensure an integer solution \citep[\emph{Gomory cuts;}][]{Gomory1963} were developed over time. The currently most efficient implementation of this method is \emph{Concorde} described in~\cite{Applegate2000}. \subsection{Heuristics for the TSP} \label{sec:heuristics} The NP-completeness of the TSP already makes it more time efficient for small-to-medium size TSP instances to rely on heuristics in case a good but not necessarily optimal solution is sufficient. TSP heuristics typically fall into two groups, tour construction heuristics which create tours from scratch and tour improvement heuristics which use simple local search heuristics to improve existing tours. In the following we will only discuss heuristics available in \pkg{TSP}, for a comprehensive overview of the multitude of TSP heuristics including an experimental comparison, we refer the reader to the book chapter by \cite{Johnson2002}. \subsubsection{Tour construction heuristics} The implemented tour construction heuristics are the nearest neighbor algorithm and the insertion algorithms. \paragraph{Nearest neighbor algorithm.} The nearest neighbor algorithm~\citep{Rosenkrantz1977} follows a very simple greedy procedure: The algorithm starts with a tour containing a randomly chosen city and then always adds to the last city in the tour the nearest not yet visited city. The algorithm stops when all cities are on the tour. An extension to this algorithm is to repeat it with each city as the starting point and then return the best tour found. This heuristic is called repetitive nearest neighbor. \paragraph{Insertion algorithms.} All insertion algorithms~\citep{Rosenkrantz1977} start with a tour consisting of an arbitrary city and then choose in each step a city $k$ not yet on the tour. This city is inserted into the existing tour between two consecutive cities $i$ and $j$, such that the insertion cost (i.e., the increase in the tour's length) $$d(i,k) + d(k,j) - d(i,j)$$ is minimized. The algorithms stop when all cities are on the tour. The insertion algorithms differ in the way the city to be inserted next is chosen. The following variations are implemented: \begin{description} \item[Nearest insertion] The city $k$ is chosen in each step as the city which is nearest to a city on the tour. \item[Farthest insertion] The city $k$ is chosen in each step as the city which is farthest from any of the cities on the tour. \item[Cheapest insertion] The city $k$ is chosen in each step such that the cost of inserting the new city is minimal. \item[Arbitrary insertion] The city $k$ is chosen randomly from all cities not yet on the tour. \end{description} The nearest and cheapest insertion algorithms correspond to the minimum spanning tree algorithm by \cite{Prim1957}. Adding a city to a partial tour corresponds to adding an edge to a partial spanning tree. For TSPs with distances obeying the triangular inequality, the equality to minimum spanning trees provides a theoretical upper bound for the two algorithms of twice the optimal tour length. The idea behind the farthest insertion algorithm is to link cities far outside into the tour first to establish an outline of the whole tour early. With this change, the algorithm cannot be directly related to generating a minimum spanning tree and thus the upper bound stated above cannot be guaranteed. However, it can was shown that the algorithm generates tours which approach $2/3$ times the optimal tour length~\citep{Johnson1985}. \subsubsection{Tour improvement heuristics} Tour improvement heuristics are simple local search heuristics which try to improve an initial tour. A comprehensive treatment of the topic can be found in the book chapter by \cite{Rego2002}. \paragraph{$k$-Opt heuristics.} The idea is to define a neighborhood structure on the set of all admissible tours. Typically, a tour $t'$ is a neighbor of another tour $t$ if $t'$ can be obtained from $t$ by deleting $k$ edges and replacing them by a set of different feasible edges (a $k$-Opt move). In such a structure, the tour can iteratively be improved by always moving from one tour to its best neighbor till no further improvement is possible. The resulting tour represents a local optimum which is called $k$-optimal. Typically, $2$-Opt~\citep{Croes1958} and $3$-Opt~\citep{Lin1965} heuristics are used in practice. \paragraph{Lin-Kernighan heuristic.} This heuristic~\citep{Lin1973} does not use a fixed value for $k$ for its $k$-Opt moves, but tries to find the best choice of $k$ for each move. The heuristic uses the fact that each $k$-Opt move can be represented as a sequence of $2$-Opt moves. It builds up a sequence of $2$-Opt moves, checking after each additional move whether a stopping rule is met. Then the part of the sequence which gives the best improvement is used. This is equivalent to a choice of one $k$-Opt move with variable $k$. Such moves are used till a local optimum is reached. By using full backtracking, the optimal solution can always be found, but the running time would be immense. Therefore, only limited backtracking is allowed in the procedure, which helps to find better local optima or even the optimal solution. Further improvements to the procedure are described by \cite{Lin1973}. \section{Computational infrastructure: the TSP package} \label{sec:infrastructure} In package~\pkg{TSP}, a traveling salesperson problem is defined by an object of class \class{TSP} (symmetric) or \class{ATSP} (asymmetric). \func{solve\_TSP} is used to find a solution, which is represented by an object of class \class{TOUR}. Figure~\ref{fig:overview} gives an overview of this infrastructure. \begin{figure} \centering \includegraphics[width=14cm]{overview} \caption{An overview of the classes in \pkg{TSP}.} \label{fig:overview} \end{figure} \class{TSP} objects can be created from a distance matrix (a \class{dist} object) or a symmetric matrix using the creator function \func{TSP} or coercion with \func{as.TSP}. Similarly, \class{ATSP} objects are created by \func{ATSP} or \func{as.ATSP} from square matrices representing the distances. In the creation process, labels are taken and stored as city names in the object or can be explicitly given as arguments to the creator functions. Several methods are defined for the classes: \begin{itemize} \item \func{print} displays basic information about the problem (number of cities and the distance measure employed). \item \func{n\_of\_cities} returns the number of cities. \item \func{labels} returns the city names. \item \func{image} produces a shaded matrix plot of the distances between cities. The order of the cities can be specified as the argument \code{order}. \end{itemize} Internally, an object of class \class{TSP} is a \class{dist} object with an additional class attribute and, therefore, if needed, can be coerced to \class{dist} or to a matrix. An \class{ATSP} object is represented as a square matrix. Obviously, asymmetric TSPs are more general than symmetric TSPs, hence, symmetric TSPs can also be represented as asymmetric TSPs. To formulate an asymmetric TSP as a symmetric TSP with double the number of cities (see Section \ref{sec:manipulations}), \func{reformulate\_ATSP\_as\_TSP} is provided. This function creates the necessary dummy cities and adapts the distance matrix accordingly. A popular format to save TSP descriptions to disk which is supported by most TSP solvers is the format used by \emph{TSPLIB}, a library of sample instances of the TSP maintained by \cite{Reinelt2004}. The \pkg{TSP} package provides \func{read\_TSPLIB} and \func{write\_TSPLIB} to read and save symmetric and asymmetric TSPs in TSPLIB format. Class \class{TOUR} represents a solution to a TSP by an integer permutation vector containing the ordered indices and labels of the cities to visit. In addition, it stores an attribute indicating the length of the tour. Again, suitable \func{print} and \func{labels} methods are provided. The raw permutation vector (i.e., the order in which cities are visited) can be obtained from a tour using \func{as.integer}. With \func{cut\_tour}, a circular tour can be split at a specified city resulting in a path represented by a vector of city indices. The length of a tour can always be calculated using \func{tour\_length} and specifying a TSP and a tour. Instead of the tour, an integer permutation vector calculated outside the \pkg{TSP} package can be used as long as it has the correct length. All TSP solvers in \pkg{TSP} can be used with the simple common interface: \begin{quote} \code{solve\_TSP(x, method, control)} \end{quote} where \code{x} is the TSP to be solved, \code{method} is a character string indicating the method used to solve the TSP and \code{control} can contain a list with additional information used by the solver. The available algorithms are shown in Table~\ref{tab:methods}. \begin{table} \caption{Available algorithms in \pkg{TSP}.} \label{tab:methods} \centering \begin{tabular}{llc} \hline \textbf{Algorithm} & \textbf{Method argument} & \textbf{Applicable to} \\ \hline Nearest neighbor algorithm & \code{"nn"} & TSP/ATSP \\ Repetitive nearest neighbor algorithm & \code{"repetitive\_nn"} & TSP/ATSP \\ Nearest insertion & \code{"nearest\_insertion"} & TSP/ATSP \\ Farthest insertion & \code{"farthest\_insertion"} & TSP/ATSP \\ Cheapest insertion & \code{"cheapest\_insertion"} & TSP/ATSP \\ Arbitrary insertion & \code{"arbitrary\_insertion"} & TSP/ATSP \\ Concorde TSP solver & \code{"concorde"} & TSP \\ 2-Opt improvement heuristic & \code{"two\_opt"} & TSP/ATSP \\ Chained Lin-Kernighan & \code{"linkern"} & TSP \\ \hline \end{tabular} \end{table} All algorithms except the Concorde TSP solver and the Chained Lin-Kernighan heuristic (a Lin-Kernighan variation described in \cite{Applegate2003}) are included in the package and distributed under the GNU Public License (GPL). For the Concorde TSP solver and the Chained Lin-Kernighan heuristic only a simple interface (using \func{write\_TSPLIB}, calling the executable and reading back the resulting tour) is included in \pkg{TSP}. The executable itself is part of the Concorde distribution, has to be installed separately and is governed by a different license which allows only for academic use. The interfaces are included since Concorde~\citep{Applegate2000,Applegate2006} is currently one of the best implementations for solving symmetric TSPs based on the branch-and-cut method discussed in section~\ref{sec:exact}. In May 2004, Concorde was used to find the optimal solution for the TSP of visiting all 24,978 cities in Sweden. The computation was carried out on a cluster with 96 Xeon 2.8 GHz nodes and took in total almost 100 CPU years. \section{Examples} \label{sec:examples} In this section we provide some examples for the use of package~\pkg{TSP}. We start with a simple example of how to use the interface of the TSP solver to compare different heuristics. Then we show how to solve related tasks, using the Hamiltonian shortest path problem as an example. Finally, we give an example of clustering using the \pkg{TSP} package. An additional application can be found in package \pkg{seriation}~\citep{TSP:Hahsler+Buchta+Hornik:2006} which uses the TSP solvers from \pkg{TSP} to order (seriate) objects given a proximity matrix. \subsection{Comparing some heuristics} In the following example, we use several heuristics to find a short path in the \code{USCA50} data set which contains the distances between the first 50 cities in the \code{USCA312} data set. The \code{USCA312} data set contains the distances between 312 cities in the USA and Canada coded as a symmetric TSP. The smaller data set is used here, since some of the heuristic solvers employed are rather slow. <<>>= library("TSP") data("USCA50") USCA50 @ We calculate tours using different heuristics and store the results in the list \code{tours}. As an example, we show the first tour which displays the method employed, the number of cities involved and the tour length. All tour lengths are compared using the dot chart in Figure~\ref{fig:dotchart}. For the chart, we add a point for the optimal solution which has a tour length of 14497. The optimal solution can be found using Concorde (\code{method = "concorde"}). It is omitted here, since Concorde has to be installed separately. <>= set.seed(1234) @ <>= methods <- c("nearest_insertion", "farthest_insertion", "cheapest_insertion", "arbitrary_insertion", "nn", "repetitive_nn", "two_opt") tours <- sapply(methods, FUN = function(m) solve_TSP(USCA50, method = m), simplify = FALSE) ## tours$concorde <- solve_TSP(tsp, method = "concorde") tours[[1]] dotchart(sort(c(sapply(tours, tour_length), optimal = 14497)), xlab = "tour length", xlim = c(0, 20000)) @ \begin{figure} \centering \includegraphics[width=11cm, trim=0 10 0 0]{TSP-dotchart_USCA50} \caption{Comparison of the tour lengths for the USCA50 data set.} \label{fig:dotchart} \end{figure} \subsection{Finding the shortest Hamiltonian path} The problem of finding the shortest Hamiltonian path through a graph (i.e., a path which visits each node in the graph exactly once) can be transformed into the TSP with cities and distances representing the graphs vertices and edge weights, respectively~\citep{Garfinkel1985}. Finding the shortest Hamiltonian path through all cities disregarding the endpoints can be achieved by inserting a `dummy city' which has a distance of zero to all other cities. The position of this city in the final tour represents the cutting point for the path. In the following we use a heuristic to find a short path in the \code{USCA312} data set. Inserting dummy cities is performed in \pkg{TSP} by \func{insert\_dummy}. <>= set.seed(1234) @ <<>>= library("TSP") data("USCA312") tsp <- insert_dummy(USCA312, label = "cut") tsp @ The TSP now contains an additional dummy city and we can try to solve this TSP. <<>>= tour <- solve_TSP(tsp, method="farthest_insertion") tour @ Since the dummy city has distance zero to all other cities, the path length is equal to the tour length reported above. The path starts with the first city in the list after the `dummy' city and ends with the city right before it. We use \func{cut\_tour} to create a path and show the first and last 6 cities on it. <<>>= path <- cut_tour(tour, "cut") head(labels(path)) tail(labels(path)) @ The tour found in the example results in a path from Lihue on Hawaii to Prince Rupert in British Columbia. Such a tour can also be visualized using a scatter plot with a map from package \pkg{maps}. Note that the \code{if} statement and the \code{plot} in the \code{else} part in the following is not needed and only checks if the map package is installed when building this document. <>= if(require(maps)) { library("maps") data("USCA312_GPS") plot_path <- function(path) { plot((USCA312_GPS[, c("long", "lat")]), cex = .3, col = "red") map("world", col = "gray", add = TRUE) lines(USCA312_GPS[, c("long", "lat")][path,], col = "black") points(USCA312_GPS[c(head(path, 1), tail(path, 1)), c("long", "lat")], pch = 19, col = "black") } plot_path(path) } else { plot(NA, xlim= c(0,1), ylim = c(0,1)) text(.5, .5, "Suggested packages not available") } @ \begin{figure} \centering \includegraphics[width=10cm, trim=0 30 0 0]{TSP-map1} \caption{A ``short'' Hamiltonian path for the USCA312 dataset.} \label{fig:map1} \end{figure} The map containing the path is presented in Figure~\ref{fig:map1}. It has to be mentioned that the path found by the used heuristic is considerable longer than the optimal path found by Concorde with a length of $34928$, illustrating the power of modern TSP algorithms. For the following two examples, we indicate how the distance matrix between cities can be modified to solve related shortest Hamiltonian path problems. These examples serve as illustrations of how modifications can be made to transform different problems into a TSP. The first problem is to find the shortest Hamiltonian path starting with a given city. In this case, all distances to the selected city are set to zero, forcing the evaluation of all possible paths starting with this city and disregarding the way back from the final city in the tour. By modifying the distances the symmetric TSP is changed into an asymmetric TSP (ATSP) since the distances between the starting city and all other cities are no longer symmetric. As an example, we choose New York as the starting city. We transform the data set into an ATSP and set the column corresponding to New York to zero before solving it. Thus, the distance to return from the last city in the path to New York does not contribute to the path length. We use the nearest neighbor heuristic to calculate an initial tour which is then improved using $2$-Opt moves and cut at New York to create a path. <>= set.seed(1234) @ <<>>= atsp <- as.ATSP(USCA312) ny <- which(labels(USCA312) == "New York, NY") atsp[, ny] <- 0 initial_tour <- solve_TSP(atsp, method="nn") initial_tour tour <- solve_TSP(atsp, method ="two_opt", control = list(tour = initial_tour)) tour path <- cut_tour(tour, ny, exclude_cut = FALSE) head(labels(path)) tail(labels(path)) @ <>= plot_path(path) @ \begin{figure} \centering \includegraphics[width=10cm, trim=0 30 0 0]{TSP-map2} \caption{A Hamiltonian path for the USCA312 dataset starting in New York.} \label{fig:map2} \end{figure} The found path is presented in Figure~\ref{fig:map2}. It begins with New York and cities in New Jersey and ends in a city in Manitoba, Canada. %The path shows the typical behavior %of the nearest neighbor heuristic with first connecting the cities close by and %then making rather big ``jumps'' for the final cities. Concorde and many advanced TSP solvers can only solve symmetric TSPs. To use these solvers, we can formulate the ATSP as a TSP using \func{reformulate\_ATSP\_as\_TSP} which introduces a dummy city for each city (see Section~\ref{sec:manipulations}). <<>>= tsp <- reformulate_ATSP_as_TSP(atsp) tsp @ After finding a tour for the TSP, the dummy cities are removed again giving the tour for the original ATSP. Note that the tour needs to be reversed if the dummy cities appear before and not after the original cities in the solution of the TSP. The following code is not executed here, since it takes several minutes to execute and Concorde has to be installed separately. Concorde finds the optimal solution with a length of $36091$. <>= tour <- solve_TSP(tsp, method = "concorde") tour <- as.TOUR(tour[tour <= n_of_cities(atsp)]) @ Finding the shortest Hamiltonian path which ends in a given city can be achieved likewise by setting the row in the distance matrix which corresponds to this city to zero. For finding the shortest Hamiltonian path we can also restrict both end points. This problem can be transformed to a TSP by replacing the two cities by a single city which contains the distances from the start point in the columns and the distances to the end point in the rows. Obviously this is again an asymmetric TSP. For the following example, we are only interested in paths starting in New York and ending in Los Angeles. Therefore, we remove the two cities from the distance matrix, create an asymmetric TSP and insert a dummy city called \code{"LA/NY"}. The distances from this dummy city are replaced by the distances from New York and the distances towards are replaced by the distances towards Los Angeles. <>= set.seed(1234) @ <<>>= m <- as.matrix(USCA312) ny <- which(labels(USCA312) == "New York, NY") la <- which(labels(USCA312) == "Los Angeles, CA") atsp <- ATSP(m[-c(ny,la), -c(ny,la)]) atsp <- insert_dummy(atsp, label = "LA/NY") la_ny <- which(labels(atsp) == "LA/NY") atsp[la_ny, ] <- c(m[-c(ny,la), ny], 0) atsp[, la_ny] <- c(m[la, -c(ny,la)], 0) @ We use the nearest insertion heuristic. <<>>= tour <- solve_TSP(atsp, method ="nearest_insertion") tour path_labels <- c("New York, NY", labels(cut_tour(tour, la_ny)), "Los Angeles, CA") path_ids <- match(path_labels, labels(USCA312)) head(path_labels) tail(path_labels) @ <>= plot_path(path_ids) @ The path jumps from New York to cities in Ontario and it passes through cities in California and Nevada before ending in Los Angeles. The path displayed in Figure~\ref{fig:map3} contains multiple crossings which indicate that the solution is suboptimal. The optimal solution generated by reformulating the problem as a TSP and using Concorde has only a tour length of $38489$. \begin{figure} \centering \includegraphics[width=10cm, trim=0 30 0 0]{TSP-map3} \caption{A Hamiltonian path for the USCA312 dataset starting in New York and ending in Los Angles.} \label{fig:map3} \end{figure} \subsection{Rearrangement clustering} Solving a TSP to obtain a clustering was suggested several times in the literature \citep[see, e.g.,][]{Lenstra1974, Alpert1997, Johnson2004}. The idea is that objects in clusters are visited in consecutive order and from one cluster to the next larger ``jumps'' are necessary. \cite{Climer2006} call this type of clustering \emph{rearrangement clustering} and suggest to automatically find the cluster boundaries of $k$ clusters by adding $k$ \emph{dummy cities} which have constant distance $c$ to all other cities and are infinitely far from each other. In the optimal solution of the TSP, the dummy cities must separate the most distant cities and thus represent optimal boundaries for $k$ clusters. For the following example, we use the well known iris data set. Since we know that the dataset contains three classes denoted by the variable \code{Species}, we insert three dummy cities into the TSP for the iris data set and perform rearrangement clustering using the default method (nearest insertion algorithm). Note that this algorithm does not find the optimal solution and it is not guaranteed that the dummy cities will present the best cluster boundaries. %\marginpar{FIXME: Was sagt Concorde dazu?} <>= set.seed(4444) @ <<>>= data("iris") tsp <- TSP(dist(iris[-5]), labels = iris[, "Species"]) tsp_dummy <- insert_dummy(tsp, n = 3, label = "boundary") tour <- solve_TSP(tsp_dummy) @ Next, we plot the TSP's permuted distance matrix using shading to represent distances. The result is displayed as Figure~\ref{fig:clustering}. Lighter areas represent larger distances. The additional red lines represent the positions of the dummy cities in the tour, which mark the cluster boundaries obtained. <>= ## plot the distance matrix image(tsp_dummy, tour, xlab = "objects", ylab ="objects") ## draw lines where the dummy cities are located abline(h = which(labels(tour)=="boundary"), col = "red") abline(v = which(labels(tour)=="boundary"), col = "red") @ \begin{figure} \centering \includegraphics[width=9cm, height=9cm, trim=0 20 0 0]{TSP-clustering} \caption{Result of rearrangement clustering using three dummy cities and the nearest insertion algorithm on the iris data set.} \label{fig:clustering} \end{figure} One pair of red horizontal and vertical lines exactly separates the darker from lighter areas. The second pair occurs inside the larger dark block. We can look at how well the partitioning obtained fits the structure in the data given by the species field in the data set. Since we used the species as the city labels in the TSP, the labels in the tour represent the partitioning with the dummy cities named `boundary' separating groups. The result can be summarized based on the run length encoding of the obtained tour labels: <<>>= out <- rle(labels(tour)) data.frame(Species = out$values, Lenghts = out$lengths, Pos = cumsum(out$lengths)) @ One boundary perfectly splits the iris data set into a group containing only examples of species `Setosa' and a second group containing examples for `Virginica' and `Versicolor'. However, the second boundary only separates several examples of species `Virginica' from other examples of the same species. Even in the optimal tour found by Concorde, this problem occurs. The reason why the rearrangement clustering fails to split the data into three groups is the closeness between the groups `Virginica' and `Versicolor'. To inspect this problem further, we can project the data points on the first two principal components of the data set and add the path segments which resulted from solving the TSP. <>= prc <- prcomp(iris[1:4]) plot(prc$x, pch = as.numeric(iris[,5]), col = as.numeric(iris[,5])) paths <- cut_tour(tour, cut = "boundary") for(p in paths) lines(prc$x[p, ]) @ \begin{figure} \centering \includegraphics[width=10cm, trim=0 20 0 0]{TSP-clustering2} \caption{The 3 path segments representing a rearrangement clustering of the iris data set. The data points are projected on the set's first two principal components. The three species are represented by different markers and colors.} \label{fig:clustering2} \end{figure} The result in shown in Figure~\ref{fig:clustering2}. The three species are identified by different markers and all points connected by a single path represent a cluster found. Clearly, the two groups to the right side of the plot are too close to be separated correctly by using just the distances between individual points. This problem is similar to the \emph{chaining effect} known from hierarchical clustering using the single-linkage method. \section{Conclusion} \label{sec:conclusion} In this paper we presented the R extension package \pkg{TSP} which implements an infrastructure to handle and solve TSPs. The package introduces classes for problem descriptions (\class{TSP} and \class{ATSP}) and for the solution (\class{TOUR}). Together with a simple interface for solving TSPs, it allows for an easy and transparent usage of the package. With the interface to Concorde, \pkg{TSP} also can use a state of the art implementation which efficiently computes exact solutions using branch-and-cut. \section*{Acknowledgments} The authors of this paper want to thank Roger Bivand for providing the code to correctly draw tours and paths on a projected map. % %\bibliographystyle{abbrvnat} \bibliography{TSP} % \end{document} TSP/vignettes/overview.odg0000644000176200001440000003027715001730346015301 0ustar liggesusersPKAOx5.++mimetypeapplication/vnd.oasis.opendocument.graphicsPKAOx5Configurations2/statusbar/PKAOx5'Configurations2/accelerator/current.xmlPKPKAOx5Configurations2/floater/PKAOx5Configurations2/popupmenu/PKAOx5Configurations2/progressbar/PKAOx5Configurations2/menubar/PKAOx5Configurations2/toolbar/PKAOx5Configurations2/images/Bitmaps/PKAOx5 content.xml\nߧm1BbK$] H& 3`$VGX,K퉓Ɖs\IyaGaYHk,ģ~̮_~R =rSo$Wf\[()XLLesoӽX\}3a0p5jl3`?d蟬.~`)XSG ߋ,6_!CߏHIŵ@ eN(ހ^aRUmM )>/ \Td[4ϹHnwrޢT5t08(-{ f4< DjGph,(zY߯W~h".] 2A [VlѵRR'6:s'ߔʕnhS_tMM eh߾5Ig*Y.*c X>˫[4X^*[,Y{s^H&>bNӞ.8Jʟ!8j7ʌ$mfm4= Y4?iWx:4_N6fdcsc' ]L}’]9Yz@ڲ.WîaW=~P:uqy;c N~vH=Z/__"44a$5mt1ރ(>w˅Qm8oG=fsJ}xE,4: ?tO!CGjۇξ%/S_J(A[8"I''("TtvQ..Sw-=u rV,2~AYjm,bq=`1b4$x{0( (# '3"<uI'Cgo!9o!d& !M3=>o4N;'Czq=!Bo3N3Ad@. f|W潸o}E͟\ݣ{I}y6^j_x囗w$͐LY㎙w)l@|Dۏ% 8"RҕI__RQ?V=^ȋ[zP&@uNjTݭWY'siiiON%'+'ɜÇIB, .钁&zYNaF'&*_8mFԥI? k(bnskrkzr?޴b#Omt4]C~FW/62U ltѝ7W3faKvC':1tbs[:* F90uI|YJѥά[2}gtWLIRj/׾AUpTN,LHW{0:S_T޻w5fI/H1ĤSOldV9hA MA™ R٭nach@#y(9be*xD,f;k L#0]zy%9]qz+gt[>xE!1bVUKhߎ ڕ*J VY~kw畦u_#}xxow9=l[|d EjrPRmmxC\ҘCyr92(rF؎#gőWN궢稜Yܴ> M-ٶ8T8Gu1m sxV`ƠM:UN[Q-NF'鳱lguChG|@:n~0mc()P- h) CB@PMCR}Lu8cC d hm3~LO8Mr#k`.ѳNwqZ'Y(tw%YX!4wjN8QVJ&a_ǫi-R>_ n;]n;BVk#q=kOViVZ8%ז#垡_ ڦ g۲f,u5Y,쇗:>7vu-ԛPK-<( LUPKAOx5 styles.xml\͎6)֏ev-hsAKDZ=$%xw݅ YsfęΘoȸ#<,Y6 ,vm0߾5 CU<&@8D$3@8V6shJpLW,%I)jrTzD=lbnJ r/ Kޖ, Y17C%/`P,B!C>S,M>͝ʲd?0ri)j_9W[$"rr&UDIަJIo dUSN2`s_{PS_wua>sUpWM].w@T+K9MJU)7R׵mҟ{N v,#B]c"w+c x{'t0EXl7ekEg `m9ۛ8ꎒO~mچm18x_rε2di1uL8Spfp%; cD+$YOCLh3wJg̦7WQ =bXro)XÒpA!iL e)ɌiV;lli"W@^ӈtm83/Je(f<>HlJR $ KdzUO4(# VfoV.:6|=R,biJ)~xOM'{4~-#ڒkKGJs*i=[F\\/j,6[ 4DpPǏ]S~ɑpu(EjURAToVI#u~%]Zʰ5X:uV$зv֞*=t NmW|n(Ag@ =ȤgqkpomK:~s+T}^hTqIiUT#˥rX`w&h6Lh 8* KDQ2"}6I,MZ/,:MG4 Fzm("D95 ;u>b~8D4cwϩ{1C40Iɨd6aD>+JL T>)r&DȻ"BjE"4BϫBjy/4N/ˌӎ}5f@ a9ۏJ8偿=XUOê#Zޱ lI"JQRՕE| A N5U; $,y1[DuOY= =Vjc5ִaNqe_G'lh˚DC%sh^uaQkEt7QsQU@m>_쩀0շk͔3RtZ^hpfT4Qre~.8ޕ_y8sn[)5Ho;;/Y"!r3iٌ|Ծ煭[:ұ_:Ko_:K~/}^~/~iY2є.Is{e֭ 06 3pՍ^,GWGЮ/ }|5ڽ09c]=7XWuXWuXW6Bc]}Zx|6RE(.rFgzї5y+/>8]g8FU%Fx> Zeˡ{Zf:QZDc?~mv. Uw9NrKPqupQ*:QI(ak追4\i>?"D-YLePk]Lܙ榕bֿL w|6 5l = ůu@R9xdr0&w B3 OpenOffice.org/2.0$Linux OpenOffice.org_project/680m5$Build-90732006-10-06T11:33:592006-11-24T10:58:02de-AT20PT1H18M25SPKAOx5Thumbnails/thumbnail.pngL PNG  IHDRFKҟ IDATx]?lDN,P;hw8,Ud]YQj-Pw1*CEJ @y#!BuA$`^hɂC[Wcx&ཻZe;;%9$:)Ł;c7|a۷3[ޢ˶y֤n6 ZtUqH %)?Ym2H 's&8;Q7 2MV;"Bp}c},GgRMwE${a].ѳ0!GKdY!i$l5za &d`ڍםkJ.-޳=ZYQo9j'z.|`*+  F7^\?;eZm.cU*7:DU: -'gܥRf%Vϯ;'$=1p䱬/fy3O[Z^^sMӳw دeFEB74 | 1cL 9++LdUk̀I@`Ҁn$DDVF IJ(%G+ݰCtչ('kf?\N3`RـN7gzM(N6ɓKLq FD%9J!Y,ʿgZW XㅙDV~{w_ݱqhO޴]E{R6gPUhh7H[LUgS;&¦-&as^74$x/w$9Ym49$w qN=PV,akn90W4 S=Z.t0$j3 [z SgjuM*| "si G$A&ʸO—~*Kiedsvi-?Ne/kzu;_/94M@X;&(Doؕ4i>6~X dQZ4qK~P,k%x$ =.y!OL"|eQ/ܤҧ_rڕ|ǮLڊo~A%FoTZȿAoT{R@5X񇿓q&/}QuE;eÃZ6UqUP~ps.e+5>GK7gz p$::3fO޼#2f; (''I+~ϊu}Xp"=P$0 Yʈa(Av@ZhjuHKmZ(\I~mLS}31x}XJ4_lXu&Fa>FE!*[緈`5,\-~=e8Rq~]mu-,v$sb 4zS8B2ӔEgu2_;;WJxȡrT6^4Ƶ_tsٗdа\Y W+Z(R.2?6U "G  H7Om[Ƭ3]P^Tis@B%1 <>H셯@SG8\:q{6{errHP vCՏAJڣ'dts?2@?F8M yl12˞!'bH8P;QAꨔ#G˸'*TGEH5'cEO+t( ^e?V K|1ZG^s8VWYr4m@/x؆ &! a1lǝE  5^3~N/P87 /B 'bڼ(k= O@Co L~qy^@ Ѽnd_bY=pZN\G TQyTeX/^*%Ҽ[ݭכ_(L*\8$G|,K[ ]3sL&!:y!<H" 6~%ހ)+/VT'C5<߇B傤w^3RE@ xhX*L!\(t KA RFjJh/ j' o$9G 1ԈysmIENDB`PKQ L PKAOx5 settings.xmlZr8}߯HQ[[@@%L[`0ooR@,$9|H성恀.紺ۭ/+\<#.0e&u Ԡ_KߦcOOB,FTR-j;}@DAZ V_]6#+>)y%s# vH(( }O#߳Ok1秢lVg 7l djacr*^(g䍮0zީcζ;KclmO1^=!!0&GϜnR5LW7;Idb0 lu@7S6pҘBB y(S$F^)$W*jFǰ!81F qFu|Qf ܍sS~mbB)ΠȒ5gi3%s6qEPH0 v]5nP%HfdR&bnc$LGwt]RBuhw{M .4DcQZ̔*ϒ0`a"wK‰c7uޔ գ!" # !Jx s [>Z*ġw|Sse"H2/']E')?L?Gtt#W;s؉"M"J9;\X5.;pcAd8S2qؾk#$ɩf\A i0Kcc9/4M6ȍs)j)cw1 J¦mƯtL!@$82TR]amtU%06lU^;WgM#ɬh 9aDN\"mO@瓕w1>"j]ȦJ݀"h+ѭ!f?bJ8Gm- v 1-U 7}|GXdG|H+szY~CBټRKIU J- JOP2z|lu&ӛkXe'QTs$94z+%>ND~AU N2@FtS=" \gMr!YmF9p=׶ 'u\@aܖLsSoP<>2*n2q#?z7{^P-]uz^2 c2Zv=RuՕSy͊mˋt\ʀJf2ʭBۛ: 0;j2i9ɸ(/kՇAn +Nu:.h1[;~gnv6*Rg2d#}RbHC۝T yb`yʝ뛣V4cՊą0$c.mʛwS<&Bϒ8b<(sT)i]EX|H!_Tʝz18{oIjN7IQׂpqr՛5\AkagMv@|6s-,2O\څ'.?PKANPKAOx5.++mimetypePKAOx5QConfigurations2/statusbar/PKAOx5'Configurations2/accelerator/current.xmlPKAOx5Configurations2/floater/PKAOx5Configurations2/popupmenu/PKAOx5NConfigurations2/progressbar/PKAOx5Configurations2/menubar/PKAOx5Configurations2/toolbar/PKAOx5Configurations2/images/Bitmaps/PKAOx5-<( LU 1content.xmlPKAOx5Kq?E styles.xmlPKAOx5Koometa.xmlPKAOx5Q L HThumbnails/thumbnail.pngPKAOx5h.% $settings.xmlPKAOx5AN7+META-INF/manifest.xmlPK,TSP/vignettes/TSP.bib0000644000176200001440000003007615111646353014067 0ustar liggesusers@INCOLLECTION{Garfinkel1985, author = {R.S. Garfinkel}, title = {Motivation and Modeling}, year = {1985}, chapter = {2}, pages = {17--36}, crossref = {Lawler1985}, owner = {hahsler}, timestamp = {2006.11.06} } @INCOLLECTION{Hoffman1985, author = {A.J. Hoffman and P. Wolfe}, title = {History}, year = {1985}, chapter = {1}, pages = {1--16}, crossref = {Lawler1985}, owner = {hahsler} } @INCOLLECTION{Johnson2002, author = {D.S. Johnson and L.A. McGeoch}, title = {Experimental Analysis of Heuristics for the {STSP}}, year = {2002}, chapter = {9}, pages = {369--444}, crossref = {Gutin2002}, owner = {hahsler}, timestamp = {2006.12.07} } @INCOLLECTION{Johnson1985, author = {D.S. Johnson and C.H. Papadimitriou}, title = {Performance guarantees for heuristics}, year = {1985}, chapter = {5}, pages = {145--180}, crossref = {Lawler1985}, owner = {hahsler}, timestamp = {2006.10.06} } @INCOLLECTION{Johnson1985a, author = {D.S. Johnson and C.H. Papadimitriou}, title = {Computational complexity}, year = {1985}, chapter = {3}, pages = {37--86}, crossref = {Lawler1985}, owner = {hahsler}, timestamp = {2006.10.06} } @INCOLLECTION{Punnen2002, author = {A.P. Punnen}, title = {The Traveling Salesman Problem: Applications, Formulations and Variations}, year = {2002}, chapter = {1}, pages = {1--28}, crossref = {Gutin2002}, owner = {hahsler}, timestamp = {2006.12.06} } @INCOLLECTION{Rego2002, author = {C. Rego and F. Glover}, title = {Local Search and Metaheuristics}, year = {2002}, chapter = {8}, pages = {309--368}, crossref = {Gutin2002}, owner = {hahsler}, timestamp = {2006.12.06} } @ARTICLE{Alpert1997, author = {C. J. Alpert and A. B. Kahng}, title = {Splitting an Ordering into a Partititon to Minimize Diameter}, journal = {Journal of Classification}, year = {1997}, volume = {14}, pages = {51--74}, number = {1}, owner = {hahsler}, timestamp = {2006.12.19} } @MANUAL{Applegate2006, title = {Concorde {TSP} Solver}, author = {David Applegate and Robert Bixby and Vasek Chv{\'a}tal and William Cook}, year = {2006}, owner = {hahsler}, timestamp = {2006.10.06}, url = {https://www.math.uwaterloo.ca/tsp/concorde.html} } @ARTICLE{Applegate1998, author = {David Applegate and Robert Bixby and Vasek Chv{\'a}tal and William Cook}, title = {On the Solution of Traveling Salesman Problems}, journal = {Documenta Mathematica}, year = {1998}, volume = {Extra Volume ICM}, pages = {645--656}, owner = {hahsler}, timestamp = {2006.10.06} } @INPROCEEDINGS{Applegate2000, author = {David Applegate and Robert E. Bixby and Vasek Chv{\'a}tal and William Cook}, title = {{TSP} Cuts Which Do Not Conform to the Template Paradigm}, booktitle = {Computational Combinatorial Optimization, Optimal or Provably Near-Optimal Solutions}, year = {2000}, editor = {M. Junger and D. Naddef}, volume = {2241}, series = {Lecture Notes In Computer Science}, pages = {261--304}, address = {London, UK}, publisher = {Springer-Verlag}, owner = {hahsler}, timestamp = {2006.10.06}, doi = {10.1007/3-540-45586-8_7} } @ARTICLE{Applegate2003, author = {David Applegate and William Cook and Andre Rohe}, title = {Chained {L}in-{K}ernighan for Large Traveling Salesman Problems}, journal = {{INFORMS} Journal on Computing}, year = {2003}, volume = {15}, pages = {82--92}, number = {1}, owner = {hahsler}, doi = {10.1287/ijoc.15.1.82.15157} } @ARTICLE{Climer2006, author = {Sharlee Climer and Weixiong Zhang}, title = {Rearrangement Clustering: Pitfalls, Remedies, and Applications}, journal = {Journal of Machine Learning Research}, year = {2006}, volume = {7}, pages = {919--943}, month = jun, owner = {hahsler}, timestamp = {2006.10.06} } @ARTICLE{Croes1958, author = {G. A. Croes}, title = {A Method for Solving Traveling-Salesman Problems}, journal = {Operations Research}, year = {1958}, volume = {6}, pages = {791--812}, number = {6}, owner = {hahsler}, timestamp = {2006.11.29}, doi = {10.1287/opre.6.6.791} } @ARTICLE{Dantzig1954, author = {G.B. Dantzig and D.R. Fulkerson and S.M. Johnson}, title = {Solution of a Large-scale Traveling Salesman Problem}, journal = {Operations Research}, year = {1954}, volume = {2}, pages = {393--410}, owner = {hahsler}, timestamp = {2006.12.10} } @INPROCEEDINGS{Gomory1963, author = {R.E. Gomory}, title = {An algorithm for integer solutions to linear programs}, booktitle = {Recent Advances in Mathematical Programming}, year = {1963}, editor = {R.L. Graves and P. Wolfe}, pages = {269--302}, address = {New York}, publisher = {McGraw-Hill}, owner = {hahsler}, timestamp = {2006.12.10} } @TECHREPORT{Hahsler2007a, author = {Michael Hahsler and Kurt Hornik and Christian Buchta}, title = {Getting Things in Order: An Introduction to the {R} package seriation}, institution = {Research Report Series, Department of Statistics and Mathematics, Wirtschaftsuniversit{\"a}t Wien}, year = {2007}, type = {Report}, number = {58}, address = {Augasse 2--6, 1090 Wien, Austria}, month = {August}, owner = {hahsler}, timestamp = {2007.12.04} } @ARTICLE{Held1962, author = {M. Held and R.M. Karp}, title = {A Dynamic Programming Approach to Sequencing Problems}, journal = {Journal of {SIAM}}, year = {1962}, volume = {10}, pages = {196--210}, owner = {hahsler}, timestamp = {2006.11.27} } @ARTICLE{Hubert1978, author = {Lawrence J. Hubert and Frank B. Baker}, title = {Applications of Combinatorial Programming to Data Analysis: The Traveling Salesman and Related Problems}, journal = {Psychometrika}, year = {1978}, volume = {43}, pages = {81--91}, number = {1}, month = {March}, owner = {hahsler}, timestamp = {2007.12.04} } @INPROCEEDINGS{Johnson2004, author = {David Johnson and Shankar Krishnan and Jatin Chhugani and Subodh Kumar and Suresh Venkatasubramanian}, title = {Compressing Large Boolean Matrices Using Reordering Techniques}, booktitle = {Proceedings of the 30th VLDB Conference}, year = {2004}, pages = {13--23}, owner = {hahsler}, timestamp = {2006.12.19} } @ARTICLE{Johnson2006, author = {Olin Johnson and Jing Liu}, title = {A traveling salesman approach for predicting protein functions}, journal = {Source Code for Biology and Medicine}, year = {2006}, volume = {1}, pages = {1--7}, number = {3}, owner = {hahsler}, timestamp = {2007.11.28} } @ARTICLE{Jonker1983, author = {Jonker, R. and Volgenant, T.}, title = {Transforming asymmetric into symmetric traveling salesman problems}, journal = {Operations Research Letters}, year = {1983}, volume = {2}, pages = {161--163}, owner = {hahsler}, timestamp = {2006.12.05} } @INPROCEEDINGS{Kruskal1956, author = {J.B. Kruskal}, title = {On the shortest spanning subtree and the traveling salesman problem}, booktitle = {Proceedings of the American Mathematical Society}, year = {1956}, pages = {48--50}, owner = {hahsler}, timestamp = {2006.10.06} } @ARTICLE{Land1960, author = {A.H. Land and A.G. Doig}, title = {An Automatic Method for Solving Discrete Programming Problems}, journal = {Econometrica}, year = {1960}, volume = {28}, pages = {497--520}, owner = {hahsler}, timestamp = {2006.12.12} } @ARTICLE{Lenstra1975, author = {J.K. Lenstra and A.H.G. Rinooy Kan}, title = {Some simple applications of the travelling salesman problem}, journal = {Operational Research Quarterly}, year = {1975}, volume = {26}, pages = {717--733}, number = {4}, month = {November}, owner = {hahsler}, timestamp = {2006.11.07} } @ARTICLE{Lenstra1974, author = {J. K. Lenstra}, title = {Clustering a Data Array and the Traveling-Salesman Problem}, journal = {Operations Research}, year = {1974}, volume = {22}, pages = {413--414}, number = {2}, owner = {hahsler}, timestamp = {2006.12.19} } @ARTICLE{Lin1965, author = {S. Lin}, title = {Computer solutions of the traveling-salesman problem}, journal = {Bell System Technology Journal}, year = {1965}, volume = {44}, pages = {2245--2269}, owner = {hahsler}, timestamp = {2006.11.29} } @ARTICLE{Lin1973, author = {S. Lin and B.W. Kernighan}, title = {An effective heuristic algorithm for the traveling-salesman problem}, journal = {Operations Research}, year = {1973}, volume = {21}, pages = {498--516}, number = {2}, doi = {10.1287/opre.21.2.498} } @ARTICLE{Padberg1990, author = {M. Padberg and G. Rinaldi}, title = {Facet identification for the symmetric traveling salesman polytope}, journal = {Mathematical Programming}, year = {1990}, volume = {47}, pages = {219--257}, number = {2}, address = {Secaucus, NJ, USA}, issn = {0025-5610}, publisher = {Springer-Verlag New York, Inc.} } @ARTICLE{Prim1957, author = {R.C. Prim}, title = {Shortest connection networks and some generalisations}, journal = {Bell System Technical Journal}, year = {1957}, volume = {36}, pages = {1389--1401}, owner = {hahsler}, timestamp = {2006.10.06} } @ARTICLE{Ray2007, author = {S. S. Ray and S. Bandyopadhyay and S. K. Pal}, title = {Gene Ordering in Partitive Clustering using Microarray Expressions}, journal = {Journal of Biosciences}, year = {2007}, volume = {32}, pages = {1019--1025}, number = {5}, month = {August}, owner = {hahsler}, timestamp = {2007.11.28} } @MANUAL{Reinelt2004, title = {{TSPLIB}}, author = {Gerhard Reinelt}, organization = {Universit{\"a}t Heidelberg, Institut f{\"u}r Informatik}, address = {Im Neuenheimer Feld 368,D-69120 Heidelberg, Germany}, year = {2004}, owner = {hahsler}, timestamp = {2006.10.06}, url = {https://github.com/mhahsler/TSP/tree/master/TSPLIB95} } @article{Reinelt1991, author = {Gerhard Reinelt}, title = {{TSPLIB}---A Traveling Salesman Problem Library}, journal = {ORSA Journal on Computing}, volume = {3}, number = {4}, pages = {376--384}, year = {1991}, doi = {10.1287/ijoc.3.4.376} } @ARTICLE{Rosenkrantz1977, author = {Daniel J. Rosenkrantz and Richard E. Stearns and Philip M. Lewis, II}, title = {An Analysis of Several Heuristics for the Traveling Salesman Problem}, journal = {{SIAM} Journal on Computing}, year = {1977}, volume = {6}, pages = {563--581}, number = {3}, owner = {hahsler}, timestamp = {2006.11.13}, doi = {10.1007/978-1-4020-9688-4_3} } @BOOK{Gutin2002, title = {The Traveling Salesman Problem and Its Variations}, publisher = {Kluwer}, year = {2002}, editor = {G. Gutin and A.P. Punnen}, volume = {12}, series = {Combinatorial Optimization}, address = {Dordrecht}, owner = {hahsler}, timestamp = {2006.11.29} } @BOOK{Lawler1985, title = {The Traveling Salesman Problem}, publisher = {Wiley}, year = {1985}, editor = {Lawler, E. L. and Lenstra, J. K. and Rinnooy Kan, A. H. G. and Shmoys, D. B.}, address = {New York}, owner = {hahsler}, timestamp = {2006.10.05} } @Manual{TSP:Hahsler+Buchta+Hornik:2006, title = {seriation: Infrastructure for seriation}, author = {Michael Hahsler and Christian Buchta and Kurt Hornik}, year = 2006, note = {R package version 0.1-1}, } @Article{TSP:Pebesma+Bivand:2005, author = {Edzer J. Pebesma and Roger S. Bivand}, title = {Classes and methods for spatial data in {R}}, journal = {R News}, year = 2005, volume = 5, number = 2, pages = {9--13}, month = {November}, url = {http://CRAN.R-project.org/doc/Rnews/}, } @ARTICLE{TSP:Hahsler+Hornik2007, AUTHOR = {Michael Hahsler and Kurt Hornik}, TITLE = {{TSP} -- {I}nfrastructure for the Traveling Salesperson Problem}, JOURNAL = {Journal of Statistical Software}, YEAR = {2007}, VOLUME = {23}, PAGES = {1-21}, NUMBER = {2}, MONTH = {December}, ISSN = {1548-7660}, doi = {10.18637/jss.v023.i02} } @article{Kirkpatrick1983, author = {S. Kirkpatrick and C. D. Gelatt and M. P. Vecchi }, title = {Optimization by Simulated Annealing}, journal = {Science}, volume = {220}, number = {4598}, pages = {671-680}, year = {1983}, doi = {10.1126/science.220.4598.671} } TSP/vignettes/overview.pdf0000644000176200001440000003513515001730346015277 0ustar liggesusers%PDF-1.4 %äüöß 2 0 obj <> stream xXn7 Wh"~έ@uv/y$ܑ<8Dԃ:#rcΞOѰw;bOȏlB99CB6TmMk m&{v=/.-?_p׏ qy\ 4)8|6$]̝0sR;'&Elތ0.,I yes9R˜^7꽭WI ݍ;UTz=:ŵvc+ܮlH_ 8"x4èԳLJ!̅m{=+ۋWg>MD7@6($4)',jB4P-Ym Ɉ0HyWxO 쭱(RFoQ GV%l1uA#-6نٝD`P @ CH$J EDE$P..)m]7m;V$a 3B>P492Q M9ثet Hцb.ZJ cJ ׽47d]nc0fŌ0ᤶבX5esPC/:8[(]W|(=Pr >U)v=U u{'WA1$Wݦs/5{c:49˚:|@qnZ\YLP!pprwkb4U MPZicNs2imh)(X $>Tɔ`򠧥II1h[48^x$f4fҟfV`~5aoGȫe)hf b].&&wF0I.VGTDB~],&ލ޿==DXB&)HR?D,5\_&jة4+1YWG;rӧmS ЮG6WMJ@̓*jf%L#߿P}x9'?s.l` endstream endobj 3 0 obj 1405 endobj 5 0 obj <> stream xW{P\gǾ𺰰OBKxIh$rv&MӇMjӇmcDZ>:uik?:mtԚ86ZM8ڎS9<~|;nt.&TrD ;gB$G%V >K8ǵo !*&%g6 IIWnI-_:.>3oK4=/F$ȴ\İ?$}_}<B2LHHLJ^6O1["ɠrssEE4MxcR ar\Ӝcv5ndݶ{7tjVDj)71F-.a7Vj.I2E*; BFe=w.;MȾ;ܕU4Ѽ*lݸyi\Sv*00\[?RZahH,r;x~ T JnLtNK%e١Kôz&kj9DŽY<[j]lUMC0_Ö?ѩspKG*-N6S51{坞MXdR, &ڭ<eAFR^e.d $en~= Wws}}Ǖ=}%{0 u䨾\9 *:~̰gp-+$|:c`G$`4R^x rrgM׆i7;褱]gv4lS~ʖ'w?jPݸr8Y$OW&0yWr%jΒ>ԑg\_jvV>th^dw߯ :Rg0L@}7_~Kרϳ<)P6j@r}WG\mKepGtPw4XX|#6OuYAIԱ,7tm\B?/@r YުU.lbR*z|&KTލ兎#U<6\)k&IjfSRf?f5~pC elvV<٬&>?ysر__|Qsb@QO[Q@)76כRy џP-з ;E-7C=23yf_'C qjm5b 7#KA Z?ݱ]80AOMoӶ:0X BL…ɖxw:@3nql'`ǁpY_uGw遣u+];<{9 qwTQnxx`NUwxQrU.t;OGFN7ҕ}[_fc=ZOFovgkOo۴.22}橡=*O;4}Ɵ_*.T궙J֦hћÑdomW;s- \-ȕs5aY(hX*ϔNd,)gie⅔ۏNIiaM/xkĕ:zɧ>E=&5 QXsTba/= *n 5Lx!L{Hd9!]\BV+@AV ނFWKΒ?O N6nbٗvU +NPj6EO;K೅kSȡ URF5:qNDF'9FgFHhB qZєdӻ4tF H.F''K$Ͷht9:4:dh T3Fg[ }5"uėE,HQ^ScWzu9INr,<尕{`,Q<7!^3mеj8s Js!9%gX*zMJbl^q1:_:1G1q>6:%bT{RXψљ`@dF#6‚u"-ej~hG蜼FEq*̋ai%qdI'xUI,"1[ckv Uk:K-5Z ~U$$Jĺf1i̓c#!" ]Α K-ljGu\^KܤG ͽqhݐ*עy_X}O}@g,E/j(B#d \@ՊB_$QW j3_՞nuTPN:'6|ԯðj{j4.n,xiУ/崈uJݡqܹ 0AyʈaZ~aHZUzSj~cQZi+jU}!5bPQ Yj=I MiϜ_ǦxD_a[ endstream endobj 6 0 obj 2838 endobj 7 0 obj <> endobj 8 0 obj <> stream x]Mn0Fta$BJIXG=1CTeȂ3Ro/Eul?ǯ~45̢maoހJDۛo34.CmL3 ,ⷰ7~c;^!_| W(갮o}v2sB<5 uՆ~^֡/8 5|ceR"+<H.t!BTmN7f'%8UȚ~q~gNĚȏ;:`̉3'33Ur{*ɼGf@f+O)Z#> endobj 10 0 obj <> stream xX{l[y?^DJLR},J,JSÒ%YOK-˖H銤Wڎޒp֤1c6n;Y j"@2 qץ: 4@lj9ȥG *H(D"f#N""7.Sxa_+BHbP@({@aUoFRqplѮ.G|0 ,hE9B%SB]=sAT5<>`SafTl޲u))-CNQٯcTrCBy(DEJΡ5rSRTi)X`.sGx޼E8BBmo v5cX v Ys!瘁! } X&єZ[2c0*j *,mݴ;&Z渶ZF_#$!3Mت[f2xdok/Ճ] ]!6b@EvzMnrIIyyJѤ0z;DLΚm v Nmx=dVK \G{-ӥyj~`zlpf7Fo2.f@mk Z| Q)B29;!23:YZ{K33 ^eo˶hm|h9:r0#(dq sp8zABЯNVF{Y[V\П.kfI$&}o uWhG^粫fjR \m2jU!̔?q t'Z PXisR md]G*2!dKmKGCU}yKho)!ql[BQm5= Ivj׿\R!!!=Y?}vK|_QdrQ]h EEOqɘi!X y ;dFs#B <ꛄ?On+)leb)ޭr]qaD: b]`.'|]2}}'x6wz~{\$Zb՜yd4hUx&Y b;hڤKUҜ-l={N=J|lqx>fR ?_s` )(SSSSb`d*R゚TXmmcqI3l݇ Ӈ'GvZg܇jqy;shٽVg2ꪕ<@| +y <}~ JꚙEU=L+ud{teuAcWC]UR5RYhm=2J5skcRHb઼RHU6l̨b="-XXi6ğP{8q( @0 Lt(t/LZ?00k/Mb)^=|+znV{ ݬרM c.8yb]ҢJlޚ Y*BW3x z_2!?JB^$dO|Stwn֧!;Ss*ҥJqjrT%tIIIB{rK޽~b)CgiVzBsvu+Ŋ#nNCq$A:{:B++ n߇F%>>1άBfeCa nzłꝬ85wExm4 Zo{bf70R ˽y}/]WUC1K 1mni1یscsM2pNJ:ڨ쮙3gN?P$24 kt _=?qJ٥M x|kn69%o__k0厠No[Yͬ[ Қ&)|0-P[pcn5؆.%.!(\~(ŝQ U*jJeիOssr15%v"߾/tr, 5j]r~8mC9VKntO96]XܰJz6 (~XS1]sa_B+@³S !ZF q k_yM1*TUq ghBɱ 8TX {|tApVSΣUcZVgXGeVhD(fcJ4y3aV! S ]u fg5|H^~a9c.8qRy.sL0L(]^J8tErFcJWlu9GgcXc+~IWp ke)2?10ӷcQg 8 3ǔϝJXOIz.t[NȲ4O-KG|P,j/cؠ<JGcTw,{Ԥlq߬<Omc-YnG`Q}k xn'0΃U:`2?M(2pQlL71FEw +blɐk`|. ^BK{]xu|h vfa7n.Ht@)ƓA6(ÊnFK1,(ScN>ЍP4 \O`Nr,PhM\ \{06Ӱ1)]$>1"wv!jd) @}g#[f l+ uh@#tiE>4${k̫phj^??9 kC03L.jUx~ '1R}TaT$1 CpRb4h&Q< =҈[e^]>CܷJM,Zʛmyd**VF}*1VyC,3,#`)UdVBcSȬcj$XHyK\ ZU_$\#ʺlQX[2Uj@գj }fG [h]]Ua; XQbqA+&Jf{iYeb?wǨY¿|}L#*tE*""6 {aeݴhmmeS^D9o endstream endobj 11 0 obj 3916 endobj 12 0 obj <> endobj 13 0 obj <> stream x]n0 3SLJ2b/_?E $ǔ{xOSQJu?=!O1P.'q|3?o3=,/vv0d1o/ endstream endobj 14 0 obj <> endobj 15 0 obj <> stream xYmlS~Ͻ0|$8!_7`F c8N}+]@*M]UNn:NӴiu?6i۟iժ c*sI t{ss}sX֠΀ 4jx NtN `/J*377;|`R'LĎ'es#'yn񝦣&l'Y;?Q8Ym-O/xy`3G>vf֖ddXkjm Hs .I/*Z |@{F.M"K̺ML>BXp7܁YxnJ/ޚHck#Eކ(6xVj`=?Р?lBO-xУ}6`=j&S.ܶ?|}>>~xb>gKHa5uuw4 1Ct0p太.ɽCҠ{F2WgΌJ ?DɢE);]hP]+NU}{%ɣI/+q5c\>Xq+IeQS LfY_[ >{Y0MrkH;j _{3-X<+%bmI[_qlB㊮/%E  !wI}StRR﬚8}DU]؎,|Ѱ77(+FQ2/#^6aip ywC]k5[9c}Rvy6ѾL-P|;0n7Sn%^,@/L{`tVU].L'N.\"_^M&4ezNb]L5b8%ǓFFZCG~kS_v?kv%|Ό`O!/m [|nߨ[{k^~SeVs>`$${ Γb<~gϊ"ٞx#B/I֓m+0k*X0f2]fE@>e耭+K6zV`3*^]X HZ#d ɈNISK^XfrM`yc3rR 4H1#}c r+^zY`1VeY`9a#g&Jh_P`7VeT`t)O l5ei_cKײ\n 2#ı 9Y1W3w83? y0979^eyL`-iYW1-oF-#ฎuT`\a̱e}S`KӋOML`g.SscSh3u2;#:VoWV`C[3~I`*0rl͍̎Yюyǰrh%.c p9:Ƶsl#ϛxE`V^KN+:%9o79.qmכ,0zJ`P0&t舴k_cti@~B5:/q=υH>Wp>)v;h1 񄖤ݝݛ{6Jㇴb L!#ީtpRFTL*S񜎖J)-S=Ow;Vgx&{ -W“^mo r0zޞhO280tb9T:ABg"k4?9GT)(U8n iB?s.$^u(@/w8$"vH *dp۱0EC8p{j6Z8iTKgK4V%-^/W[1^bPށ׶exKl,VT cOHbi{xyR,*2|X[w1ЉPZYBo[cl`wB7lvac_Rc zg[A-S,\vgJ5VFT3=O%9SJpkm>K!Ws2~g Z,t1i8;r"x,-gFlv}>:̣]+wtUw-I7Lf\QYׯTQuiz;uN?08NS8KbbķY?-V4F?3쩬Q-}9*=ا*WUˇ;뻒Q%]e2)CJң< (-+/~ ߳ZWYNWIh Za??X?t1Zf3̜KG)1TlfWL7qI{ |)FRNFYcaڍ7?!Bc;/KgŞiܧi4Jf, endstream endobj 16 0 obj 2613 endobj 17 0 obj <> endobj 18 0 obj <> stream x]n E|tI$Rʒ}n>EaߗGJ]0ftOY{pxJXXj9&Pc!G33xo-Ny Bȫ`>Wc`0Eu33/l]Nt[8Kp-`1ejTQZmkJew0Of4RJOsl7IS.{\D)19qyIL_#/{7ݰϟ5`ZWgSKb xK endstream endobj 19 0 obj <> endobj 20 0 obj << /F1 9 0 R /F2 14 0 R /F3 19 0 R >> endobj 21 0 obj <> endobj 1 0 obj <>/Contents 2 0 R>> endobj 4 0 obj <> endobj 22 0 obj <> endobj 23 0 obj < /Producer /CreationDate(D:20061124105806+01'00')>> endobj xref 0 24 0000000000 65535 f 0000013835 00000 n 0000000019 00000 n 0000001495 00000 n 0000013978 00000 n 0000001516 00000 n 0000004438 00000 n 0000004459 00000 n 0000004648 00000 n 0000005074 00000 n 0000005347 00000 n 0000009349 00000 n 0000009371 00000 n 0000009561 00000 n 0000009987 00000 n 0000010263 00000 n 0000012962 00000 n 0000012984 00000 n 0000013178 00000 n 0000013522 00000 n 0000013726 00000 n 0000013781 00000 n 0000014077 00000 n 0000014125 00000 n trailer < <49C1E7F026D6A67060FABDE68E754300> ] >> startxref 14304 %%EOF TSP/data/0000755000176200001440000000000015001730346011630 5ustar liggesusersTSP/data/USCA312.rda0000644000176200001440000022604415001730346013311 0ustar liggesusers7zXZi"6!XS])TW"nRʟXS#&'ƯNP7ϡBDxo"ZZk_^Cl'תᙧ38_efTaWFon됤1>C}CqR=/x AcGy)4myNc5G_fS B-/'>(f(=Q4uR5ɪ6B.#HAr!CZxCTQ`IsdESaX7¡wuf%Ί4uĕqd QDId!w+n/߰-heBc̕3օ:-U@r "l6{(Ey_mTizu B%ew24,ڗJ {"*'c5E(vzD:1V$:D*knnxz7ҟ(3Dd%+ILѯOd"ݝW xh}dcXc*$"CI2,Ujث- ih"-rDP)8)X7$o:6-Ge }?q_ni|A P’j ;ۃM̙&tX Y5$lD/H6#4xpXæWi6NFMk|c  חlr}Nh7ȘZ;W0?|h1;(%o+q6`B&uyO*bmN^O53o_D[ h'+t%*Nc`ypyӯUS"77K'o2Q`(d<5J+_Q7do]EIXW#-q1BrbR.dk-y v]ptp$@P9Xd7@cLnh̡IUܺ=l|"jW ^on@jJһ_Bg46'*ɵ ]BeK;[ƽRBcV*#G%#1hc]O4GV9Y$/elqƪɾKQl28WUUV;uNا] rK%43]&7x(B{'Ib%BnէX7{YeY2u#یV}ZdKN5a"ݕ+h)逗"5|MwUs0\^B(CYߧ531^ym|Y őWJ#!ScLM b]c~u\[sLy&w8V~#b Ym[OY`#!DN=>☃݃U!! |; @ǰ޹e 3mO߱%›uDSG'OӨ&(<epDX=1`N:\ ga]!]1ro*RYSJJj:l)0H[S@ hǦ^l)$gb s9ێ@v &ƟRub|T\dώUcR A42Z@=@5';ܘ;Y-Ο^_'I&*l/ g Zf"Ie9[}Ro ÇmV/Z(e1r P~gSqT(f+7d}azc,=^J/͝z-Q&cѲzOhť;=D֙&f'M?IKPWl5z܉R!/9A QG'6 Џg+ꢰĔDQ PO6WM398!<'@S}+0%'w8CC#:*H oHsy2";2!kG?+N-]pl1&7"Tbl-J&X5i32Б :[%^,M >|tU[6 JŢHs@6O^qLCYEL#*=?ʪ 2༐'8nMѸǬǬO`+E @(ikz$tir˱yX)}> aֱɋO7W2VA JZ&(*=i~Q+RPkM] @]qS^~4`~M̆ϳ H|諝n-oJbL1Dl>^gtl]O5qT2D~odiQ'W-<&YY~w3X-P*^mgnfdB/8$-΀ץW`HBIeCb>'xB>ps4Y9H }CP[CV*Ro[v2ze둎 һPHu}Ân%Hxq|2yk. a{)6 ȣU. ;y z#TQzLভ fs I@ICSߚY,Ǒb|?P1R 6jp,Դ*l;upd' Ԅ5 AM ݪQY86Z9L^t(j:ڛ[Qdl Ma4R=vϿTai|)b;-O@C?> 8kwݐW:2jG\ ,yH 2GR;qYdV tM*-fAsiu0·?f';lS`oCk.x<AP.L%X,O ngߴTEy0,1>;l*\|$ D un"gDk$NzA< '\Pvs0ɁEpIk ϸ+$EtE=p:hrٜH/n\I_#ã @3 s?h{\wf:휷b~bhndo,ࣆ5kK3ΠT5H 5ɕS@YǦ~ۃ؛Bc~ԑ0TOb3AtF:B2#WUyG-Nj78xDfMؐfs$Chuc ,Ϫُcê e4y3a>_Hv0xBS!h P 1tKU'`)]͓mȵж!Oi˵~җH&C_O+"VhXp-ڰِF dMHJ  itZ.J9p;_^^}һĪָy0xYޠjB_g>ٛ}#ڝ-(cxk)uF^w_78VuSecp*Zm G[96PL"6 ]+MusH0C2==njVPfH^+CNufCedy`lV {󂪘@6r_ŵaoUxI C!@'%7,}W`}#Q!t\[n-gS#+xf`bJz3nwyP ӟkX6ٺƪD/ȜynHGeE쌶}WxvUW6l 6>"k IX,.r ߙK@kbO0c%vD 9?uчy-c-pM&1DBٸwH⼾0qiNR͞5֛C5.(#DNʛrqgS&T>/D4 A~]fT_? R(tlHA&Y B^p[O9HE*膿M|g"; !<[5[$Cdr*A#C_z>>Ìx嘾"WoZHXpG=I\gaIiP~[7XIߺx২'0c^vx}, :FO[!YSGT~%TՒ~cXl "KH_j& hzՕeĜ# }KzGy=R^8T!M8h! \MQ3e5@5$,=绪ǺVFNZVoJ@Mu{bh4aWRXqmݮZGE/C*-vkv7 n |L"96]w?H9U}NH獙a*bWxϭ:Zbár"K |QcUjcC:%!onxjWH1G7;v%*R\ G6k؞S8!>!m5e"~i9|);{cĭ],1=F;hdB.fn!v |W⍦J@/ TI}~;زT-ܮ9Gsdhcd+CQ ?mdؑ|)OY&\.Q!ZF>\YD7-wÃb\./<C7d%H3F9~@Տc#x45sX0[`fЀA΃: kTVD$0+ Μ1eLpw/\")zmKb*yMO|okt)j]X"hIUftIJFWxjUEJ)}4XUk;qs\Tgz G{hw͔СT|-D'U:ks{k|5Iށ/܀F/ewœIjlƎ3Dj4Jn-Sƌ98 9>T k D歐Z m>|\˜zd4Cr~wc "Gؔ{O0ix_-8n˞ IcO$]]%& *gU1ySVPG!Oƒ%d2d)J!ݴuRM;wx4pXU^$V9RzH:Q2ޯ8W+ojS;]ڑy'A4{S[^7:٬3S=͐+B8waZ唝h}A_)trcW#6xΆq'vVr"G!-Ahܻc4)CS.stTr`*<pwˮ6\.L'H 3b6;ۇGM"0ZviDdzngGl!>I,Ǥyv'6M]0o.Y{i_Ky as(K u]lHTO9yq(CYFӎ kA#Yg>Z/3Ѹh]=W >O (>K3wݙTCpàg4]mm"  +OJoumƗL+ gX0fABߓگʓEIP۸)8ViT6B*qiAeC'K_Gq%O줯{ǞG?eۋKPB ƅLdUiE@ŶL}0/cDB2rhR38,]LUȔ$ͼ^ n\qY dƛ$їJ_"1 ""Fygߩ, Z|'U`<}(=H%~ 9]֌=KJR?$ir$u)/cR& Ȣ{JF!{.bvd}/qzpLҪltiݑ61S; + zJscϣɖmPq@[]URKҪ(a\PhA3P5_x&Elݯ~E)5˅Xo"d8 D44"ORZX#pltdwe("e(H*KZ/9 pԜ-)Y[qjWFΗt |vX9" \/c\rOn3w`yg/bb Kς  :fW*Ls?#䷄Be=H2峅-cR_p善~]/宏ORߘՄ'/ o1+X"HAkffH!r}ܹ%eV6OF>o"锋r0JyO7r0m‰?3w1 FYD{z ;``V_qjJ($Dw{yp>AZI)M!6ʆ髇ThoO!Hϓ*[ux=dvܰv|;H~XZBE=gi'SC ~1s$^XfMuN GhӄqmŚ{yA8>ZLšHTs3;"nQg{OtOAG>XPBh' fуwk4y[fK\o L A{4! ʁ([ܚ>-M5]Dm.K^E/7EvˢRV_iw8 #Zd;6?fc "Q8MrcT^ CJ3r21Ab>jNΚ+Ü /_sk60$s^44:IsIHQm\;QByGQ9_ 'nHbVuʗ (4 ! ^3-QR~}6k yt9#Ȼ8R.ta{hc;}J43wvGfjhnt@(ZsD:X&y;-rĿk媠TQ} CVSY .,Zc#pxf^Q}$(Nh.&\=,_r3ŗּO7~ІRjbjtB(!7fXіX biB?J%7 ;zNT[) ktq" eu5#J7f=("klcߣr$XgZBоwC\NlVBTYt1%gorutNERYaGɫo ]*㺱y5y^sQ@.1:25j6Ȫ:1H~Xf3=b2q L/m5=}~74?$3vJ?bQq҉%Ms zOBMҦ|v@Kdg⒒xb)(g_1kkDkK;'Ha€OZ?";}x !:0"EvRL찀Ļ?hH1:"S wrR'j!ߣyӝA{X߹e$#:~m$ST9U$;<ZCs ^.ψ{8+pi.a\:3\<#ހR/]Ep ;ȹj澨FF(gՙW,|ϭq.SU-?PU n_Ԟ %q*gpo>E`O %<6|j\1wz2WLZc$vϞ sUy\ é"sh&S- Ux?Irs9/vi` ]~zu\PP,SgSi:Mܮ'P,lobOD鱊`yt]b; /F#V CGx<0?XC+T[tIs :)G7kfԺͧk 6eA`8D&|%)?c)>J1N֥۾'YR2',TvS7ra}҂1AQl߲%׵H%W25K-u π/t%k$D+aXJz Ŗ l[-O)2OZ,OhNmVvp8RYQKre^~$ԫ;)r*O ˛)^o-%]ΰw^~#h :(Xp%SzAlE&%DjcMQu{Zx7=te:o6A9rAE"0Bl'G4!>t@/_Er =E269+>d)DB5]"1N6Jk<az&ë2D SLz2Ym{irʕ^Vh*ZqX0ruU+F\{tfQ7 -1k:db\ޫ~va_=UZ'? ^o.﮶ƃ4AۜʞpTy4Qj_m7d}LDO2y;z-g2B:?kR=׮A}T K}Sv|S~Y8 ̸$q:JdqQiu4&@ z"Z9$lրb"-+Hw}]񵌜if-eyAG9QTg/!L;J#};N# 2&t \!k[ь;Mn;goU >mlHÌyj`Ub*71xZ3c&+~*-ݗFz'S]Gf"Y{6!O3<sS:A/\hyVb.~@sEC]Uf"_ Q5K4N"R:aO ]=E{Hb:,Ss8Oi>6g;NɥR;[ꃞXs^[\z:OX*lqx7Ds# oOo :U/AMgV5'QHce( dG]~Zo4 hUBnmS(DXL#0h Qjq6"2p@ل၀_ULueЊAڿ$=6aF6#> \P>^'W_ڶ9AR7 uyNCkRj- _#?L`yL%◎mN /hbֶ5LwQ<'g\%@r'żtՖKg&1fHeu{J!:q*yEg;[<}uك8-{3Zz C8㏽-ou-ȷUUٽ6d>$NXLsҎ m)O_"\n+;=;{3#\9}0 -7 @i z0HڏK9/~ y5Y᱇n跄](Qz9;nL0F,@BxEYCՉ/ NAl ("gE>;ڞv$mwd RLmG-r+j@J9<Û&Y,WIr=2Ty kU_+|O$޵h/0]aaL5@1OLߞ*,Si{Ȥ7'vZԃyqZ-ux#~'d$`$#&9nlOݵqKRfR DtG|ꩀq=^"ҷk{Hr2'`DR v"3#^j?+*li^͑Y-x_g4x;ʛ⤈![FMÁ2BO!Ezt/D<ᓇːu)nG"5Qb #dcKMQb{\r̈́q@.lxj={GP'C ~tΐ BNdl~)s.$W2h&'DAd]p)ZdEё8W|Mw +5+Kh]ikj[`1h %?f{%8$V^4-.^9Dݟv6ˌ# Bc/$:70/#㏵8[DiYN߮{{_)6B'(PȳcWiЯ Ϭ.+9T3KTr!{5⧏w[yk6序ȈIo]d&WUoUFIL *>g'DΪxe3mŖHvS =VʰlN̽ %e 6 }]iW^ԑ,!5;Ðߴ95 S0K rKl5QZoxv LQG!E3\} 3X5PZz~?Kp@ dռbs7.J\j\Ŧ;lʉ~zyOc5"P:6vZ2N)5LnЯH0{Oe~* 2?MJ_Z`LuLyc<d'fat׈łp k}^}U0&ac6 N3`PV>Kng90Eo`e=nL̢JNSOC}şXi}B[NoELNџΡ(~' ݓ]o:2:-K.9W-.F5GT rm .έ;"S5!;{d~r"9>ħݑ7Sc\=z1" O0Ď R;A272.P"*X%ན>Gt3Jv_}@ex89[Dk[ >Vۚlf>cs#wbRNռOsAcq9;=!kp|Q W&SGGbo-pt+ b\pXj 9}r'k=GwΕOc:" /l {]ӣ2W%ł)~yFnG`i,e䖈LrG؋O$qQwn{{ G[F KcI ּ[A,;-NMX}8GPӨmVdsY lV(8^-O8V#A w t< @[NrBPTwHzgi[V 5۠XO8}5W u%CLC;w1mmrJfqf 3-_rTë:^|o /PW[?G{vm5n?(mHpuo:Dz2X2qx̅yUpYFie3Wz3`.wbMU1oKBd SnSBʋQri0=x]E;%1OPafpF}[>+R?cqAO8>,f^%kU&w,ng51Cv<y0?@t%1+xo/)#kh $@YŠG;|2_gG=>( ~&5GQZ eLlg%| `ҌZ)^gJ.vC\'^=dڦt(@g-0#2Nqqx&٧t䔪l4ףt= lA 6O\l 7~4P\ ΊȲUʜʑfcZ$i @[:U-Y}2KY!ogPJz%f$Cxv() VYL>-s*Q2Ͻybzo_ۯQHg]K>TnbĞhqq? (9M!Y|e7PK6DR ;/f݌22DT@*xmkʩ Ӓ'Dz5ӿ6MfP' O=di8k!>Hj]AP~E1ÂrfT\rLuà!\ri~Kޣ|m/M^v3ɢx` VSd rb ePzu3\{b+C8݊RBIv"a(arcBceq ê# ĪГ6a_Q‡HS0pi?$}C"%g暾rDrw_at^^CLaQv$EDn A0c+!Ŋxt-Oi'B$7Ai$[ڒ+w-"]dƔ~3^q\,Hc8>xx?{ vKwR$xPQce4mdMMm.pՇ[; R{~W~g@js0y #bka>6*Hv{:S7t8ha c= a{L_ 'OGmj+T+?h?_1'=m=;.RnwpGN u0WT])HqP_` ~ȑhmbwr]JK;JB#K4%-tD"gV J.MqE}*r h x@Lm2.Nr r9L~'w)5.WpU;ÌL;{ VX47MI-nAA)ށc+PٔYH YIZRbw?_SUUBpGhzTCb K;bCxIy&m+[_飺NIJA>ҖV7okB.|,AfDr|r#sf)v_;N2n߻Yɷחcڪw-rҮ*_`r&ؼ2 iÃV3tOY N 5wI9-= K=v4_uN!cobWFWf^F$S$lnߞ^I hi/P݋SX!!v=C9Q+X''%<"Ùqi!`k.|Kq񆂱\MN<Չ aET0aiɻLgӉ`X28檰 8L>mGNgo1b9?ğ2`(y\G-ORIM ㋾vZ Y@[Vg$HP:wI.4`) B^]wMomxt<ċC νm/R0l%WUo{ҌP|YF&Ɓ%4U6n%k*0ç*[ z:}VBu3_?j"n;$0Laz{1.:L]dfXB%xxQt)…y<%úQZ0Hy@W ^0$\dVu}܊%Fbޏq:XsItq/3yCh.7Q ])30"~Gl ͘YUNOl Z]B!ӥFX9SAX˕: :Y(n ٚHpQS}HsT{y/Ze:@vm[ӧEd?k0+NFm:j1~#E"Fu 1 !tZ֒0plBVeW:e#{v4Rm2%=_?0%$mL!Ѓ3&a:9E "r[[(7eED??ve{q.prd;ہlv9q*.99\f+\/+<-OMEdeb,SϭR hFfDI@);F p L,*Q-qJ8۲n@Ox=BhY161Z`ssV;zpFq_Htuةa$nBkGqkGmdeegg'5eJ#uZg;2q_ )(t//$|eaģ.ƉM i0h͘H,瞍l2{+gxijV$Lnn* ) QDƭ<GX^4p6I=꛾# q 6 tn cNlkRx";8 m/JY$ABg$v` r8ntE˿t-QʃEbZZV)@ӋoKm&f-B=)F,Q$ ZXCTFzI) a qLG9CeѮZ#w}{% oxۍuo~C2\RoY:]qt3ظyfI,ȇ?*Ǧm u8 Gʍ1s,^%\AB6\g:iS5ٺI^ӣ-@//t @ʝDc@3AUU%̸dI\ MpI {a#x6$~"esGoeTBi- 6[J"Z\1mIǭnn7ݓ!j \%y N/HVN]2/2.1C KĵOܘVzʼnkNDJ?8t:ϥn4oᏇ/0b=_JVJm*I?AoRS@28bzlufѓuL4,2|zʱGulnYr"T. !Õqux)#Ph_{6CH9p?x%L/,Ͱ{L@SȜ{>a&ƟoH8썳y(J58>9My]Ǚ ԳZ19wIxt>_] C $םX:l׶\p/:ܼJ%WE^ @~rNpeh72~N Wb& q mgHQylk2%BR}yχHkR !tc?wwgDG”b>KH#1j?lpDt<7 f<ήyL & fghLci1VS҂xuD)DnHs۫Ҋ/]Ңxm-Nzvp2By֝0,i>)rnր}hC;=8lGcũf]ӋLG;WyVU.0UZ4#Νx__tEMk5i3 yR דz?iϳΩ;ߍȇR R/Z.?O/ιݛ|Y_w,q/M]߀]c>@qb B~4 ayIE#H:A [%Y@=a`|G1 ,@X,JWLG,"rKlnSzE,0}݄%~ |4&@)}i ˳%U<+@G8S^%pW| 4PՠR@8sT|o2rNxINm6Anzk+>2P3[ŭOݳ>oPVY\DܑerN8r6n*܅8~cH1lb1;wFxx+}GބlCAj$;V yj8 WhiXS \͸O93EM!9 +<>.f%oo<UX <~69UPmvGzze.fxQ~x;\]px鼳/J$)S>o -o|aF^;eߒ3ܰCϺO+MRd󆸙P%|սZju8ȪБu_UX^5<Bl,ebë]7ТO>>;kpOHD"Ii æT!FPjȝG0r+FMqN)j5:|%6юq pMpl'[`}ƔG%SM6Rq&,(7E_jRctQ,)^l!e]V?uvFCL)eY>E9 7b f9閕@:ʮ5^]2q܊0WE_u!R}@-<HBr}B ۡi?A:'L.k?ZpkPLV_f'' iòxD݋̡=aU-ԻILu)ANZJ jn16tY?"tHŐL_G_MIm(B{MryOTm1Gי[ZK;&>}%';A/`+' ? AEj-{=wW>aG!@Dڈ %Lp F&ZӐ-oq!| MUCl;IASrwXڎx!';8ϦG3=(JR_]sRLR1/zb[}h$ 1$o'<1,>8@a3F(&C(3t/X0QX;Ϯ0я~Pn'RߪKK?S LrEFa9bC&8ӏ,x_-t$F^Hu$tP?lܖD$`Ƥ+K*9R[rAՄTm}l+_"ivbg_v((KD;jhowniⷒ\pHεe';똛3`X>H.q@U΃1n/BU3%1diQb,?쩚2#zP j;ou:e|w_ZkZ)ynD/-HGDjBWWH(0E}U7A(j` _DŴmJʾwu4͊L/s9li*~l"'\=6EU g"?+Sk"|%805C+MF1+#V82O0LC iy]RadY~9HcWS ZDLxX뜭l5zJ*݅uYFyihBjњ0}5)ˢix&x|tw!f8 MtOw2Enva$c#?Mg hxGyNSj+07`pPlɵe|೎vdoH[`& =o}ӊ3YC? fu fs  tڼ)݇ФlzF =+X8-71/SO{Fڂ9E_݋,!跚d_MW[nQQg;uf=2+Up3 @#`r3 $?մ]NSWIHt{Oa_ª@!B? Vv Z&=)m#"+drqj GB[oaM|"lrXCK(ԋ4V4.*M:"+Rba}/\.p9X8fiL1퀡V<]ӳ;s9|$X9gW\7"ׁ'q+B\!u^';VZoPxm5&]$e&]BB,S?>U@r$xN9asdYPjvC*[@}Q?(z+"$luopQ)0690V7-yr1#>UmIze9\J0nK-'hiEAjEv0U~B"~L{kxXΒMwt9U@y(\5{ZՏa?R9m4{fcPվܡPUQk5X4ipƛpl XL!c0RƱ>UlT 2e*)*OFɵzMkô\x4˃6h`9# l.+4T/rر +7 uSk_.Aܛ#Jk@Dg{PA܃ y"އ =ĨJvz4NYOOXO)$jkfʃݺL6MHa %mKa<̋4Px09WjD9^U5;B-Tw9[}i) B:XF궈ZJe7G <}J9@uW:XթY^Cw{5Oi,^H~u|zÍ@O* ?:]S9hoD*Bu!EךUUPdcZLj*,쐂?  x$涞u>Դ4傏d*- ,RrbIE4RW'p7L^Q}↮]׻c=vׁk]"@Rs}\@ "l~mtڋbR/T_X0-%] 'IV^jkjPX])b3Ԥ픵,ChbNi GI i~;Lp{v{gnVVNB,[FXGH|S߯n%t;Hqh_r#]6Bx.ww1X0'\j{=LpZПzECfcHc%[/ "(1z㏓|N 9ud-!s|jQ34C`E|R#yS&(Li`Ͳ6¯/řtGrBO^&+zw |/̯V[ ~ʟh̩'t/j=nx uإ݇[5ޓ@'s.pn(U "t<`0 _55 ⼯%")/=cdJunsW k>]Z_mI HDD L•E0$9*нtdlkTف[]-  N] JiI8)oh㭅f58~@K,zG VyiF e]kD )k gГ?& wK{P3 mV=23ܜ~D[S&zi*f.JbprFʷmN9P/\ [ݝKZ/tml:܇0ܵ83K2Ɣ hmkGL!\/@ȑ󄅢z*v\24ufr`ܭCk &K \Byٸ K >++*h Y*QewWhpTDH5t>RY,oĖYFJqu8ħ$a~F̷Z0_C$&Aԋ_O֚݋x$= o7$Y݁B7%ɯd1|Lu˾d1r^%#zː [Q)߂̇ㅳr蘘S͚s7H hG1` l;1 GOKK?n"."v>!_PWѭ8i2in/~>7d2I]VY {mo]0ZPDg3p%&kGc[WLeUbtl| NK-Je@uHLCteG 8#GuZ??^_ C?@,l2/%!\mPPD'cy(j4.c,0ٟts\|,1Ndž?W!` To#O:* jd]pEdbZ6jKAnnd@]m9}[†)z!Gf| ` ,ϭ.)1:o!~zSՀBs!t p|q&lF‰y;R![Qfr%h1#kpfJZ M{I>Se~&l(p-ncj;]Mqxq d714ؼ!cA(&OHSKPgQz$2Dx lD~J-Jʄ!8$OA`ھxz[mj7@>qm[_z+01$́8Eg|@E4ti'GȴߙeH͐p&EޘSyF8"VKZK^Ui)j` ?XHQWJnabq 'Pgл $|-p J3:BTn'ʂ3Y]2#+"Yl6+[PD|IBk0;-N-S5uUF4J+L( S])څ_S7ାZ䨤vDMJ hHQaDxӡTfl [i[̱ QcyyUw|6#f'ZZ'amӏM>kp= De [^6BN-)ܟݑ{6>Y ɜCx$^kJc_\:SYؚW*k) Bi"Fo2B*Q͊`#Rj1ႋ:hb. Y5qzwQ9 4ӳneѽ{Tzz$B489a4ɑ{ZK}VjyKeSrH7;}&_Lx9_ݫH[bJ7VI`鞕LOF9jb݂ܭ~lЯ& X I|Ob8=@|P٨'6=ڕ3 6S ݋٠b9R/'ךF4)ȅNuăѩ+jJ ^b|J3v ꍆyX={]H?P k&r5쯕ڲ)7J.薌vVU*|3Ts4&KBerВ"^oddMkQrYG)HߵqMX@|N0lKGt(2L*->@_ zkIQTVS}4xW2oYI !i= |j<[k55ߪiuLc.~ /ՍWάn?(Xi#IQ!}z?tzaBY{AY rseKU-(Θ (~xauWOr$hzcj>}x9iЬTlу6YN$r> 6ok O@qs}6p8C\.ւ=JWd̠:;'n.?5*MPW*1𹖉ϺS+Q|`7u.&<|L\ʧ笘pN)]ܥOgiw[vV ^K)lpG7 2P1j}W ! n2Rpmk&23֬$IN2dNJuDr}c|B(Ԥf!l޵GqPx;hK ]U,a.6(7Oޢ`C{=%E?6ZC+;# jt(!;yMcF /)GDX%R`oBYVe3Ym90\ؤ ѓ1o{QKV!g2cQO9;/sK@+u{@ FDInt#?6} ܺīQ& uk{rSP?[@?QXqkl*pR+pǬ2&=VWŽB#h=%4,LT0TSܶJ iręu.Yz$<~$ a,+j=NPs5BsjB~lws+Ӻ^k.OGc*F3ܥSgK +4xGP#P7_YK4y))k4| n Dw){};Ik+8Ġq5>4 gv1][J~j?mW.$dI# ]_D޳F{Iy8_For~"bz,Gw)#I9ZsX3 Y}zuuC:"٤fKU)+*9GECO0'qryAgeޠˬ+Hl˯z˝mJ2p'_($|XQ$LLKQ!+W"tO y/xB< U#e( ]Cث{QlgEJ3uIHz7p |8 由0xoޓ^j}[gL!VTB@Îm݉I(ac&d$LJ#{FiP|׹dd)kA!g;Rw,ceSاVlS`ꚰfjK1B.bqAO<,p'30S#d|F!Z&.XM9@9PHƂX.0UzIGaVhX~ZU N64\띺*4 KCukbs 6U3y~L+K cjޔ:@b#o֥z3T/`iĄds-Gw/6iynR24#T^)UCK']U#p,-SG.Ʉ}V(_USh[Z k*4;NĺXY4~Ad*(7PK/;, V2Ou.Ue>] v`VRlL,\Q#jacޓF# A6>ʆw1{A핶#NEH-:{]Qx$?;(;yiIFA$k,/H|RUSڑ&gSa~\o9;U fѼOQSRMT׎¾MhO1 1Il ѼCCr$iX[\ɍND.[v|#~ FU{D" ]pVp=$B.͛9\3^H;KЁN|#nv 5v DUų&U 7\>CI=k0&xe! t|jethD۵8E3CFօԛ(`P:9{L٤*'\MiY 3wEsW$9bз({F #O0E"mvR&w4ͨqE6dJZ\m"̒y& K.~;V 9vi7O /o"XJM_C set7kkeTO(rqU_Q?j= lXWݖ []dhhɯ S<Ȅa ؾMC3Ds"p- Xf7_L1MVC&{%ZAAխ{!:] 춯"Iަ4hě+k-VCFT(I$˷=UaoAk6Ge RpfhzLėruX D-%N, !Av ^c<[%F9P>u袆9=E? fa "ϛC٦g'?c;#P[ Lx+`ۀ,0L=<6h\]A_t8PD -d1yM6|gF{J^)0z$"PfBZԒ%)Ɵk栱Ȱ]:Wk˞O۔3pBJ"6RZbQ} p=ۣ-D`g%up6y^0% ބ4hW\pF |Uf}jPVlцì84[Vƍr ߨL0.D5 ] |qQx|1AN/haB<ĥgT }@:{k)66~+ܐO٨TjʖG>.&'q.4̖Uﭺ|$;y F'a*fl3,˻,pfB HЛ_xyw3;Dfo7o:&/,Y:+2`s/8qn.T3Y/#E!hAN~9q!W~gp I 'fGGFaF\3Ĉ0"Wu5n5 #gS  ߻C 2 T=iE = Tg/jR&Ҏ7&[,q.Anm 3pĆ[2|&#YQ/1@4S${暗L`R&0=.i3)A,z{r&+S"}P>PSHt.|.'qP fPX2+4E|Le'FBw8z$S;Yt17`5DM<C7d/FBo/?U&'W)]&`E)ȹq8]4HÎ~κ9$IxA~eWU/ȬI-Eri7>퍲<8AD.;*aE Kզ{sj)1K&9k$ -;}5xH)6L SVBP4'}!/ nj65 h[hG؄n[m>0YSWcf'D,J$+h%t"CyA0Z$"=KRzeͤDrF&#cn6P"Yjau*r, 6O㟘G)D8{ݥ.m UG] a /K?р?G34kQ{KAaOs`?*\T]pKo{C=$WդPOu\LԪLw8)S&&r\5~!A`m(w/;'3*pcQ#1!ٹ{}g4?#8Zz?Ht_,+d~7Gh ]k b/:8+8,ģJz }1/@Yo I..Dᐬ 06daYrG,#YtҷK!{7c)"_@#[W6A<4Z >Y4iLE-fP8+H\[o*tSu`-!Yp;xD.WfkP $[8 ^T1oDvʅ9Q[G|f&KK@R?5vz*esDHn`];D'W]M^f("dTp.DX.A+D,[;2toIOGkY 嗼/y`" ZуӵVfn/- z4]U'ZvDEf!QjW$*y2Y]+ӏHYMQS8Iu*ކreZu2wQ8$prs@ؠ 0س kUco-kGbu<2T;(&|_ȇTvD75ڵϝfuE-pH Ka{B-xSX_8-)kH+iY|$ߗ&-RIbsoKsaU,oX\nD[( |= [ťtj9a;yZT^WLgRo>E sY[2/ YiQ1{ `1Go=/%M7!/wh4~jB ЁA:3>ok&4k2 7ѧߋYg9;j x"CB㥖Co 9Ё]V uUJߔ|)) rɮ~Rlv*Eh)%rfx? jVC ew*OdH1X= ׯ"RbB ~!]{{5p1$}T̴/{0n5ѣ؟H( XS}@%(#&P@X8@WQ;4w ۋR u̝9Qfe{*^2V;bOukrȁO6fdq2k̚ѭ:"IɄd_`(߱\,El裏$.>A22k+ j S(TM]Ҙ@Kv™6-Fzt~XgА)b DCtwjW'?qgqR+'bbYs+!S[QcDH~7w5 ܎۝Qd=jtZ^e?fc35ѻ!;)jdߟ %juYCW]U6S I#)\ۧ+1[ &xGW "yH3 k֊l$tlgqF%EE-@W<"*.DE P$LNUdsiEx4ebu9Z {6MAZMGhkKC ](xBBC B'GnA6XΝu8=rqsj|Bs0޼ }ԾT;B:HGf鍒ŴމV^otGzSۥ$.x'1\Umfl, qem[܁>F! hb^P T2EQkc.dIL bA%:H߾nFlNe +)CˌS?R7PU/` /VcsJ@\BL*tNDũ#Iy !.~Q_C+uL]vJrc1) H w󼪩2[E4^a%d[z|~ ,["+Qe DJL0| LIe8G8q>huJ0)%]Jأ}gfLiVMP|6ĵTx;f^@ e0=.Mq*JHGg/=G:N<,C' ۞2_l=./^ !ƛ+kW4|k'z$ܤ^uJ3fyso3q}JיFjɊy6㸲p{\iO*v`u;?gp#e66+?,]߭>.F>t˿{/' &JڭBRlzeG=pV~3kO2:_>h9OF/q9w_nkl_Ʈ55wNair.zp |VFP=?!9OQ2IdT62FI {7uSuȆC'\t (q1+=X(4-p2%$߬Ջ */&# P\"3'7Z|L%7pt @{Alzҿᤦ 7L@%)5򻓼ю>zIw =agTd&9 kjkd-Ϩlk j5o{h_2W9'D7v} $^4+D:\}p3dC[`Zj6a `@n4]^:#BMm{X zimxv9`ק+ffyKFP >qD-bФ:hZ8y5 B8OrZ͎/; ٟ:'wcNH? 8` 56*DFK^km+ukXq; s#ahy:?fJ5<lAӭmg]Ԙ[,s>X)4!,7rAYMp+6E$Z)97ӥv|`+ }H Ъ> ^&,S`ωVbEo?lwa0I3UEt0Q t;̗{a坕/Ȉ-x}v 1JwvMA5hwǃ kH& !"#=)X[`^Sk@N1` a q aR>UBiKE۬NCd}JFl[( ؄fvF?ܣn\jEW#rB@s(5q[G jGU #jWЪo ӭÆ*IQgρDkmٻ ¢(8S1IW/ǬEiDwùz3$ ѣч؋!gY gRqJ2v#m$:kF0 jg警<kUw 3|60g$ol.[tUNz)×i0O.~ęjC8ZkE/ 3 ɨԌ>Gm,KY 2"[3b7y]؁ B~S9Eo *bBa)*3!]mރDO]q#B'5dzrק`*͖Z[S҈, 5}Og"^4Eԫfk6CFcr| .WOZ!X;%b Q.^L]jc'h;Y1  -W 冉`><4K{ƱE\L״߃ s@ZI\GY{T@Y"P0/+x9ukOa~OWUD/Xm:)Sut( VJn\z6Z̑[OM`dd&WQUpKVLbzA<\It^ X3ˡlhJeGkAs%tۤH,&ƁuRY:Q}7W]:lxe.+u#138"B TҜ#¬kFj*$Z6 nT ΌP"+۹m@C/}ǗRзj[ b(D[k$" V%vũ۟d3\ BFB9~.kI`S,e~庑wD8yaj m:2SZ$CŠ.[[L} @-?u†¦&,ԺyUv%Ex:d~;sZnIt\y,)TnT 6g.Ba}硊oB%!Gb|ח.5\E@DiBfa\|y``2%U^^sy# Mcbz ̆Dd9s+[GU)A K%"k4LgOE`2I qhioٛ"="R$&00KWf4e:8@"lڅKHgdp!F;)UiGz ^Umwr!N~Mu7Ae (Ma%}ӡ%{}3rǭ R;9@k?qN|cL4J h%dZzIQo6X{:] QU9"k۪RHix@"^ DF>#m{1Bg<^˚r$\}W&bkr"J[-*Bqc̨+̙ ]lwK.1Ӵ ^{mNqrak4NzkOvFR곖n qtHUZ&AI\}dB8Bgscuյ:;A4@5Y2>/SRHH#;`mڒQ*m'#v6w RZ{7û9iF|3?ŻmhΒpMU/ 0'vM'蔜rdaO/j`#EChwS U&h'y'0;НJmBAbT5)_ ^.,V TF xxrdؾz`o2Y@w'qʩV:~qrzy)˛w |C]5ǣa$&.9N(H1T C fV4"INT8Ҩ_3 dm^4+blmuI@BJzUGR&$Bk08VgjɝP?tKR5ֱB!+ "W8\ 1Հw-;GC]S*7warLb"g0g|* 0#8Y'OYyyp3 k+Evkg~q;jJ_!I$yߺ#Aa> aNRo.G05oc1K$אC-/Wܕ3\.z>}ʫإ.ղ)‡*.YEFq<|^j_)K8ϤO?ϽЂWFRP82p{*0]ە5٦_MCAE2u*ɦP% HΤ:K&RDe- Yc(NJzog̵/;ג4<2V:&nV'Fpy>8U ]M͖mTԵFys1&}w5mJ_rZ_5aMWŔ?>*>!Ps@% 6 1zd@ѹjO̮ܸ0ǹӧ0GKEX-h>Pr[.ՊŎT܏}+Hqm} ?zLY~zRw6jԖTFr=ú910=4Ҽ-_0e&V&19 //"ʤ^#3Wwڔ6)5ɐ_<[0;[],'3A6JY*IJ=s"ـ5 0#ҀIhaԶLO±Ss' 8aBmr -\83|FY?ip1tR=ƀ-cBerG|uF޴Je<@7xy)/M+A_u4 RF2mz z5ĤOU|ɕ"JŦViDT.C?cSNUɩcMW=wT%@RE x i#v7/x{kv8ͨL% ]&cض_c60n-h?yr^Kx&?uـg3҃zM 38d1 os %`g5D) >.ƈ5s!e Pjv{ /~icRMQ ^+ͤvo(F؃gWܦL RqBJ ɻG^1 {tk@\T<UE> P}_>?3!.;0~)OhR{YnWnl:Vl& :BB{0JUxeH<R`@BS#A1ERD2JEMHյo!s̤8tP;p7e5 D6AQM#MC"CM-doN~fUS'!C jYrhc$i/uh~ͺ4Hj]߮fn.;rqKZx*$Jcy E:dndb e84 g&$#Rx]}tkԖWĿMڋ${W>KO7 B:C_>A Faߗ GΌTE`0-ˡt9,S֙׮Y#@_}])nmGg'xSLNƵBͺ̭D b>q%*:F=BϣKA~>Da}Zj)Y:I;q 8 qZ@)|!U<&h ٭jw:r1<(a 8&$;-:aoX-pҟ0ơ]5י/d,8% xo=n-6S@-e@.Xuȳ L" b!gYCbX>B" CAtSz&Q g"׌$Z&qFx?lfDs* Ck{^7;\q95tT ͿZKy؍0@ղzD@Uw҄MtDeyxEˌ*.33p~It"EAjKVulZU|%>Ƞt#t^U} a /X1!بP7-'=x ʸϯr$>(\|ʏ9T 5wY k6-1"FNEHf,e(93`:=JH ښ-yM<(Ua/c7`S3wlQyNcD7'o > g.4LQ#\ ٭P d#ejSy-AL#z69NVU7D> 5g`[]P7Պ%nɭ [Z7%8ݪTU..$5ITl*w޵uz2҆s3O Kc*ZI6.uzad{rcP]C䠐T]VX(Y-'c|%ԗK/ pʮgz?a60L:jŤoX{/޻Ekl{ӈz|KBJDfu&t]T훃lw^Ah©PSynWSl`t!-TP(E8x\'wl#xgM᫧=F&/5ڑW{Z!1rS 3t8orXqIp̦\ڈ!e(JY DX\74|.Z6 MٺtpS]O2g3"] nbvHJy QT0֥ ^taNCC3Fa9]xywP .GiuQ573Єh, @N(愻s*B٭rYFJdkL|Wy_Eb*9R2@jfO`߀CZE9/ m?Aixm>|k-{e=):Q7I(@9`.cJE <<+v/ⱸ?K)J;AV?,=,$IXd;O e%3@Q"3rJq` NprVZy:n4p&2B$.Bٶoi{V# z5bCCjUG1k:fw)Y :Jul:N]mª88+BxnA+ e6M>#{|n9Yr]}co]<;bu-NeXoɈeT]&lPw}H5tVp? 5uLg^ #{ -{e P-m:hDVP:Pvo/"!\ %֧W:c5\s-&}<^JvE6HH6GzxcQ Ȫ7''BlIXfo4)! Ո딫V,gޜ# wiy6!G0IkVmg@ ވ֏0i\ hti-L2h!/z!\Z6DxVW;5CF-RxVLlQA91]X'~ltub0g xH"kn@w졺(5]Wݵ-gwMbץVTIEpF>^@>m  0 w֡8#lW׈Y Vwlц,L D൪i;a<H(e\<:Ӭ.40taI=K+> LZ( xoy4䙂'eEmЏC0!C[ 3kۗ(t&+Qh%1 QDtVW `7a jdL _]&!~KN(Y}rAmȩsǔ>OZh$lT$\DZ0iEZɡeHمQnJ| 0"R ~Omf@KcPPAC@ὣ9LH9naNaz!n(wRU4ݒWًcr۫8Q5<$Кk?5$L8- %چ:I}fc_l.9R* X^>]U y=^xuc0jqj;k'#;DumA/n,(":Ĺ.+vmc Bz4FQ;nmH3?~1SR/ȿFN ,j6'9U}gTpT0UeI!J/^ : ~X3ǼCXbcflHun8wiûh1x(Ӟ\ŧ9\@"mQߩ#d۱|^%e+ᎂ1VfuT$5/ [ c]nL63SXC!!BSsf{pMcb6틫䑨pcN?"&bv!{vBh~&>n|r a'INrk'j?1cgB#o1܉4[7M3B`RڮRDŽ+w,orWŦInb^lJ i6W<Ȣp)#~ⲇ"7IsS(kA"YΉ*"H lv3X{y?!l?O#؂ HȊ Bi @"bi [vN@џ/4`lKduojN@, kZf@. gC b]G=,^JZ!D%m MF0i"AνqQXv'VU=گ;>4q\d!5e#Z]-d9bωVLV%&O&}%Wkd brS#$K7"~cTHYIh9zn٪oFC0]kh _ #eR8nWTE ;WNՕy;\1pQTxt@$IjO6IjA+8dnbdЎ"xb' "8Q?WuE;zu2=.vտ#wZ#,x,A7\/_&kymPԈjuXP&hZ=T. AMl {ڔA\3jJ 4N,t28 L}|J3Kj?# 6!Al 'vCE-̈́ʣep;ڭD`\#ёBmH ^z:) VL-Qp,<8 T,Iqkq-^)?iy"/׆@@PEn:$8myH"߰HN28CګB L| qݿK2RFuNa,DAɍrX52JCr*3b.dHm2 ay()|ulڡYFK%iyvJ\coLg&az.T2Z㫪vB!$j,XJ1\Z!Yڜ+|̖uyd+(uFYFXQ#XaaH94V-y$k v줹];e5S_N^G; ep'Fe[\T17+΃="O"^S ,b[ fOlV9,\Ř> QĦ4z7Rl L6E3NQӘ2f(JbY|ί\/je4N$Ugk$!]}4o 3~B v0!5 27w}X~0.ѵl})@(y׀V^$vcM1(b/;Nu^va2XfP dbjDBVވp#v XY;'2Jm5Ƹ.B0 9^̊EO)`hAES\yiL|1o&DÍ8B*8xpX!2B%B&BmZhQ9;PJL9:&#J^eNRƴ@)W[Mk 6f"$ꛔb;4ڴ ć7GbH,x;eɰd]0q)CԵM+q$sU! :1ݼH%_i ӛ8p; Ɗ 4f] lURp&b&t89~M$t? md[VB)"GHf{$5a x[ 6Wru*h˄ӘyũzfCmK VB00gzə;P98m]٧\> l$LKyHO\#AƷtu|`)Qd%h+dN&U18/NXX”驍e|ɛvVzLEI{#+xpݶZ&=|SN,aO.OX۱f"H-X<3?po%4LEls|\i@{(z!Ӻ$-wyx_!V1kIETtǨ| W2qiC+~@B \)9LcpdAm3ԧ3kP5*a֋07:>(GpL!z.WأuiHDR +"Uz ɷge'ja:8ʔT##.(@IɂFRZd+َglf|Z@vp+7;ah4x*Y#2\[Ec)5VhdL,Woq[y !/݇‘Rh)0 s:"!0MD*4%_J>X3.b qay*W9+! 8ɹdS QDC#aK<%_elD%F!LPA}48]脁ڕ'%"UގWѕ~3 O#\guH{(㇕&ۀDXk|4T ֹ%\ÂO#zJ^rg$#*fؕ ͥB<ory>i~ $km8"F 0vtl>f M`Èu%b{ޖr<_;ƈ{I͆2;آtLm{95iH(B$q4q\:IB wM lHDQfAXSEFJu~23.Te_5GI+f%dV"Lc֣hϾL|:QzhܬB'%)9++ԉ)&>v& FHD`ľ{rtV΋COoˊ9 zccg\F;QB)AWd KDS#3ՃMlA6_X3_DfKT.;kMНuL*$HkϥS{1kѽp_p$Nxq3xSoyھr,}yGʇl3C |p@jc zWuqXzuڽ] dÅ5['_;3m]j%{u.ڴAĬ59//6JC${Kg#/c_`}))w0ċ's,$5 L_r7 &87 ,xٍ {떶W>P`"@݄d23<\{RkV,/wa~d&Y)Eɜ}F6S!8R##ԻGV>^;GTrj8`^8LJgherD5z,zZ2 ?)c;Vdx'8  h/QP!B^^ɉc =dsGpxMvhA[x0ihHhys˵oCɪvL [=MߣE 7h 5( z6KxP ɒ% F5q⿰7&u@7xT\TOzw3 #uɅ/E [P;"]Y!v-4 _l*v{|* 3; $]ŇTIJjD_mQs<2݁L',JJ"PNltw (w*BRuvyݹ&A%x3[||~Yh^y*3QzAW?즮b^v35+rЅk\ٟkZD)1 6W zW-ccɫQ Pz@U"oswn8nc! H-^ }+yfUsP A[7}t0-ANO"2uzjH=Qf~d/Tp9vdψ~]&(HMKIUi2+ ]2hݷp-]ZqJ-s|5na+vSɭé20?d&GNNX)ʋ0)q_AC o{f@^Zۅ!Zwo{'fi ÷I ZLw88M]zE){}NwJWknYIfĘpxϫ_of 3U{w/,䙻N!Xښ&G\\p'8w*fK8!9EQ=[j&j#{ ?w"@Sj*[b&ϒ0Ts n"MI7<apOy\3H_)ӞtKZFpBZ3ؙ#Mrw9i(n%^>c\%gM՟Ơ 8qcAuа|9ݑ rʱ!u;k@ٹdClA@\ ;iJJax`fiK7NvXmKLlI41?@>#teZӘ^Cq.-mV$ 4%J]uҤs*Bn:Qj_C GBάPYIJ $Nl-V:_>noVMJ{/'%<%!`pa6EpE"GW{TJ64 !]|5#s.pxO aNKf 6%SU>J t[/Árþ6"%Ut+;[#3?^=HkTޝcH?)Am ak63jEz.}L CΔEC=Dq$t{Ax9d? <ü>_2&gw=SPG득"c|:)J*ı`?;>n NݓY8ICm|cB mw9(ѰsPSdqБxہI\.:/@TLae' G !~Ǹ@5U=q.pi>|n:Əbn:5/r,rÃ7K|kVDWɏpWX:r- 0g[IzE֜Wإ*kE)O(ᡆ~z1OY7KeKCsLG,k݋4jv^{ݞdF;%r))ႣK1V0 O.Հ_. SuNepQK'ʒG3=W5*5r iS 4n.&%tiRM;!BW# .I$f Xt0B 4^ d?4W#5HOˤ$qL )noy y"e/ d&sw4>8 q&1"ztCӡ@OkpX\袛_BM5!c ,t0ۂ.; ٝGG @xUǿwMfc+$%AM=v JiYo!/8CQ@n<b6EC<~3J e#BY/'{cb$S;=, ;"8 #]1N4RW֥Vk0B&~/;wF3l[aZpX,KRd:oHW?ԈuU2/C9.y<d 4̹EA@@UoR4LsmȢNjxL9,ZxMZ zR;#Ez@r;z I͙iT 3k]ͅZ(Rk )f/ow6f/ˇ1eQ,m0"剶̩C״lGIG#܍lg67hߋ2hd@Z,C{R%"3ӗ2?@'So^'~ӼrτOKUS jur;IWsD$)'bjN+ESm@!w~AaR!Ȯp[%1p3jȱcd)@.O.O!RLp٩0#Z @\2&U_ːbheqan0 TNjjYi;f dѩԳy#/dT 91S;iv|,l8mb pmp8*!bF gxeZ>yb( 8.L6[ 34usz9||˾M"KI: ' xpJxwM^E[NuH`K1;]nTxQ9]OVbZm^6<%D^&EpO'Ⰸjʹc$][5!v& etVa!E#'<^ ~I>> զLʱ~Oe[]}{[6$/^c ?s'.s8ґ}7æW>1MsyQD(7.Cj y;L`n:1 5$:I5@x޲@.'Ak`kDl0*8ulfOҴ=74a'!p';@U9cͧU7pac"Ǹ7FwQ+6{?4 x=S?L(ɄYgH@Uu,"^s:N/b^TnyW^׆l;&Ie>"[gBL=7wqafzLj-DIRI%R6~Z|LM`NJ3-H]-vKO[{6VM*qt;S剚|(f&|EeykމlK?yl&KI{f=ͅ62sG=} s@)`קث~>|;xצ $![}6U1v4L;:y8<*zɿ)!ɠi1`g iE51# kt/ 3qZ!X|? H֘y& _M"tWt/Ñb7щi.ǫV^ br&ج P\<'GbOǰ: -Igxw؍iqܾ3 -@ӂh(,2PU (Ә.5|2r0P! T'@zԷQt͌rHiPKHyeY1 =t)FK󜙢-~܎~6^10xp8sg_QkOTzKHRiǵtHb fj`հUDM{ĻM[g?і$l!u(GȻ ωB:=Z6nl >DL_"²I|PjwVu0O viXq%J?Gd璡17xN3c效X%^=95 M%oE{祀CL@*9 ]G $NCa Y[s MwIeoMt>]m4pHgJwk!"+yȆ 2>,27ÂIR]>0n`gG,4ծ$u6z i z> p9%P%Y^QH;{WIz\8UKvHdQ:˱b u/Pyd_)#oAyYBυym3 =|!?:gͷfd/^J?/[- ?8# ՗r&?oFL;F~4!tdqhM$MmeU f[(J7U`]=\bCY9C02ό逎{VS' {@ɋ6.t9 ~?y5# Tn064<$mI .-r6_sS~/TNUt _-Yq[IDzZ#\ %@&П2-LBF7pt#S~| `u 3QjҶgs6}c}!ci!EoT@7n#6-̼]iV2I-GsN3R .ӐصѽIzגQ!%V\^q Hc'MJY[S88U-+[b^"t 'I:;EwEta@[)p3ReFq l7 &d q:{6<{8D8++}&=:^E8kgU3fFTXSdŃ {/&<^BRMr8C,egΘ]2`ܘiq5J&|s&6MQ^ }6 E9E3>E l~^+ƒ:}1Z+VaȬhq{Ӆ!4ȰamֽH"pԼnynEj'n<'ԟdK(8p5k9)󍱅qw[{iAL0v$#L3Ewk;(l(z#ޟ7m NU!iIR)$H@%%_Fi@4OKodgFDD ÇM[LWbNgޥ }rj>CU9k e=:e)×Щ>l{̹u )"zB1e ,//`)ǜSVrJU1*In>;I7ڌl=[ԲP*S \jyیҺV_B0 rk:Ay;aRVp Nd=B]Do  )e./@X%&>>(),zh2΁T|ʊQu͋tIU{pkay?0.8&Py1'L,/6ޠjvSu2֥s#-5sΡx(jHI]{kpJHxy}ߕ]ڽQ->)ȬV1f.rFbwew1v+nͱ5U>.VISFWS``Pn#_'7%ɢ]p>yl8'HӨp&UHu5-%GYh˳|\+vBveo7 Cci-u<榣7!6[۵r4{wV8~is ߜaGщε-9 v#E:0esO(>6ta(r{c!xԵa[6z㠆 V.N+z*lə~tr:N| +'K09v{r鮴6([ޱm/3^Ԃz@IU}O. ɍY߹vm1{'յn!cku7S 1Tv@洍q_a*6i!G;3 3զ;3IWq|@H=,?pR iJZ"70saLc1wct( ?us5VψR!яlffF%pV"pTV/o`Q+h^yG1rze_3o3AYnlcsvN mZ7Ц " !Y1pF3|uphkQr{RcҤ(̓>cOqdIF3 tT+>" dkCP@rbm ;`7Tc4@DI{zUUCӂH(5p%w1Q;L=-h=E$eamV[w.Mdv&õǜ2T4tI9$ԑ:²@Z^Ot=Fơa2EKD_pA &)ډEQH]v}?>loOb7e[5>D&%{5,sXSh $'sFN_XIgk#6;~GȲ%qiw!Y'cL23HApmptDK–-eV&Cmyv;' 0(WQWm9Rv0H!fY-% E1֩ Q^F@Zxudyv`֒kQPDzyX4>ISip&'M#-X Ck0hpd<,c>CvX2xxA}: Rֈr?*[/Y AkT z!ã@cioV[\K; }mxGuo /Ķ8e^ˑ\"1G9<^Zvp2O9|&Hh4| a'>xY; d擕'k](6\jۭRٵXsBo;-$E!H{EhW 1)mL7T;8QbX7)zh2u=.;PSi:?2)4 4g6K55RV*|UЅt2λsv߮}!z,偔岈9NFuNc#qI.a.&NҬ-g+w(i S$]$$(+2AN:@Fx-Cy3ŘT:0vxuvBA9'fA :pybfRߦmKXpK wS v[$>G]8YV@,V¥6}XȋHc^qGj \$|u޼-|\Xb@G/V07K`Oʙ9V2lKg6x( K8h_Hd̲8[> BiE'^(yݙ= I!s#3pdhϽ:o UjE#s)ү$h@o!~; ,. )ׁawܕ> p+o6ke _&C!R^AG :>[(O"HC0}}2ɟk ay=Q3)%Zl1ZG}cE$/4{MGEEmt $`Eg(QNR"WKkHf4xW)NE戓o;vq7#/r`nWYph^ŕNrڡ~ɽP/ja8kb=*_)Z!sѣv? E">]0A'j{xS[M-LY !͗^Zwa5JuP?N]`Cp8t׬DžY4 I?ʋuӕ`N1.%0V (5*MV `y[En5"%=ϬY7\0|!عJ>^+ؑPaD͵V6hZp3،kPT.> ?9CzH+|`R ڙq'2Ah(M EV).ndޠ)N }0~YTiXRvvϋ//&[Ճ#WF|\9Rg``sGҹH&4gukڀhNKB1Eck|K[i:0Fɩ}<'_L|~|FsԯHdX5S\&%g+)“:Mx8|SWk40x@s@) Y<9TSu0 JD vuT&N_7ѵl>c3rW(WpqF34"nPQbf%Ŋ_3E|ot[nك_x!NR]nkD82.VM~qOso*܄ʤ5^ /H}a%(:MKr c*Ę\6=ˎGݳ1I8=q Tx v*"w n 2-)hNS_P{ωCpJ"&YXB2nX |AYf Rtwl<w'E 7gH^zC3gIWO'@kcA1׮a"Ғ5-%:S*[p kv46%՚;;қubͰ(UՃW-T#7kb1 7MKgcvlA'5Qjw ~5^p6Z ):?MM_.&ﻊj'Ě~G[GU< z;WK-_'))qgʄ8NnG/*d8C\j"*H)uy(M*޲(XɈFp2TQ&V.Cy @/mdzPr@^@|[ՁQ (r A*ye;E~Yg,x.4W[f`\5z)7 t,Nrx&^w}GٟZT}{!tgw2QQ|@H"恷2]'&y35f_Qi3%~&*,^߇ɱ&:Qy ܂ukO~orn#CfR:r1U@p~#+ϑ` pW/I9}TF7w&|"r{dJx8 2~[Vlr_ÅCA L}SFS>P0pG.k +k0@;e~YS4MWVh,@v6،~ɵqꢹ-{ H޸9a ~Gȁ@R݇z_@:*ͅSa=|]\}u ) 63ygpBrɵ9=cTq~UQy&1km\ Dv w wYAǰhkz==@M+'%%Rf彺ڊ>\="rAq%=f&i{-Lſ4KP~{U31p)Z֝S4fe iXOp{ c >O$Pz1N4AT G o2>2-&ԟ5u"EMxj1y,4k/NG2.J/]WފB@^{ gz.ܱ'ڦl 6\~s~WH'xa!gEgMӻSay vN=WF14*nZ4pEV$7b8ƪwltsrF $?b-yt*Z2F]bἀ!ڪ$684O!^mI?!ՄCyhB=AF{tip!s)K?@>mcAڕ@xc|E{lXc.ND 2*UØd2$Zh7w$-Z=~?))5p2#VIMO|N\8"p 8_dJ̞q.^#pkfRͥsヌP$2u naf<7YX6IiiEZe CIrV F}tQ/( |=OArFXUY"Qls}[ذNa<3u/ns)0[ayZUMqޞJ:F֭SJ`Ըm5`!XO4ľi?qFV<%E:O ;͡W!vnٚARI<JISQ|fTx֟ %ZgC.X#JO&tX/`$U/ܼٻbW㝄%kKxr_chvj2X"9NSw(p|Z-5V+R|m!d'Ixi]4h /5ퟤ./H ؃Cm9%)<2H<g} Z enձ.]["\${Į\HN{=-(88 E%]4+`JbPf]H;W&`c̔(rBrpKk:}Bk-j#n7&׈ x})(4S8peOa[rĪ0UPDwsD{u4omXӨ0{C#IƁragNS?grT; \ &x*\\wW)^&& 6V@@OrZ_ 4# ξIR}&\19`n=f/?4ffFd9CA_omMlrX_Rýy[9Kv&w"3_'ZÌ !AVVZlC WMwr_%a=_X2h1a _JqPKEihu疟\#\K)[]`Uf:?:H?{cQ|J_pѽgIjŎ* "~\V],.`57XݴpviǢWJ)jp^TBf#8ǢUL[q~II2C*Z(/; q.Wj{#mSy|=9r?_T~b]+vq\3ij♸Qx챁*b s:/RTO{0=*~؏`:mYQd_lShC|lv5fme﵋<$d2G zp1v ~|+sNy-e:V&;J?WWq>wa[#$I)|󄃏+MIaޑ){^mxa$h!/Z5RA ]xb# n%RS{) 1\KOξLL)^R:Z)13EĽ7s[.UbY&>;OE4H WJX/mNC`x9`X *X.ai=1" M8:'LRabsH@T+~XWB| K\ 71m~$ЛJ įk"~ol+&-$d.ʥXe&^A.ih:̢}H׿`C ĢT=("xa{tP3P _ǩQ|M:gE_h.ԔXq[#Mx,AuI?dTyoDͮx  ԐF`8=N'cbor% N׆H}#m|Q\ E7tH^hGd_$\Ao22ZE[ ?4D|]3*02bf2[y'^?׳SH,>`O?'T!FdA 2#I~q?77 1$yI^90v=ɁQX28.ߑa`a[U v5AQȃ9<.;¥~+Qr׼3_,m5ٖ;-DuI@.a!&|`bMi aCc9VSH}@cD׷l)ҵn'ĤKXI2 -GP㘿 \8FY~h[$[E9x&H-' $*˓U/~ٸ' yZmU  tª2(}L;xJ~Y&3~'.UŤؚbM]'6'jX3 ߷`Vsk뙛ϵ*E?ك,guf}178p4W0p01R2B,r$l? jZVuy7cOՇjY+yT`~妳_o (0F0',vbgLI]ޗ@ &+Y}VX/aIو#9"t/3y ʑڴ%Tͬd@[%ԀNylDуڛY{4kwֹv3eŹ=*RܻF =0.$B}xXw" *|I)#wl'f u_p7RA%jJq2(h\g7uk(͈bpڕɴoCFEh-z'XyWMe4lĐ)ݦ5m pvIwK:#Hz;(g+ n%0Smo _zI6SxY)zӹ s2⳸/fdQ -P G]QD:ܠ BQ :pf-`; KwP> ^RժQ s m/!x2Hi&9Q|(ymhqbkdaPHYlq;*fTuRзH/Tւyuhʚ/ew-y,$W@:Mn3wܑR.;n\z e:Z#kUDN+>t75/i'_}7D W~ycOd&DnjA:R^,Υ/I .Ygbfd$aa@U~.Wiί` C*dnֳ-UIz 6ٝwZ<Æeq+ &ӚGײs^5 Ep1'Ɲ'6x= KpyЂTte;۲Fɒ:HB_8,#+]7J@Uq+-gzrͧ[M(nׅ HfDF6ߧvL1@mM hsY:+ txJ禮.+yDD, ~=E87waUذn#)zS6C5G&̓pǛ҅O kd}9LHiAhC6rXTL`R*g>q)v+]k5~MXh ?riOdNq"u8E@E!eD7j2BVo~dVJ3~o`FKw3ce?fuyuy`JGΕX_jYl+3It%E1 YiUi6N~b!*'=q{VZjĝUfv^D6Eatis"4 ,~V#|HlΚ7n-fv[pNj̋^c"){  F\;BmNZT7ZaUOFdJ,S 66Dm,h62xT|mщO5cقybS8\x93=!{c؊%GV1ۯAAf6s׃L1Ba$j N'wԘc"P>0 YZTSP/data/USCA50.rda0000644000176200001440000000627315001730346013230 0ustar liggesusersBZh91AY&SYnI UUU_uUUTtEUDUUU` Uh๾{vnzsT|DIS4cM&52mS@'zh&@jiF# @hhh 404i2z6L~  MhhF A?E1L&SO@MM1?Pɦh d 4&ОITP=OP2!P52ixMM46QQ=LPPh M4i3JzL?I<Ч4ا4=OQyM  4F@2V{L521;No*TΕL#dju_2ڕ6؞l

o'sX@gDְA@ qD/þuAq%.meC%TlY# E v[3Pؽo &3wF8mLΉ ⅉ"DFR1>aw(Şl~ ln1 'es3S`WL;e}[gOI1ޘh@1 9b# C[y C*; ,5s_3GխM.[ԒPR d2 о6"*QJqfdz։Ɔ 1gz B+3VMM'D(@#bV0@vBg(4 ,H(`CѸ啪u0Ĕ(\0=A  @u{ -|յv#E[ Y|^U*'9kP HS $OBy#V&`d[n e*aIC&:ݧUuDV6 N EMS ޒ$Ml3xo7J$87mLKQu* `KʮJ&Be-k#3J2tf C!vDRd̋ A&*8XE;&F2BOIO-hZ䨤J Jp&B<Β}m xPhTh*r$o)[{Y-h@ܘej+tzN#4$LR:֮ [ 2 G>L oFڵk`n2"+D⸞Fz`k˿cP]}Mss,I%/R;հRhDX0I h!f  6Aǿog{F=vuM W<ʶ;)zxK_@!\Kzt2kLbTŖ{ D++M1G 9a>Lwvvt8kq!IbϬK  P.lG!YIsT=y56ȬQ,q#rjWj&Ee[UZ?_,XOo"f^,jQwj(\*dݒnҘ ",3Zw`"1Z>\{zs.]h+Lx*тh[kInMX\rZdYv{e D8Dҹ͂ʇzA۝]`8ų ͨ:6E3< .feDFFhvYhlrE8PnITSP/data/USCA312_GPS.rda0000644000176200001440000001562115001730346014017 0ustar liggesusers[U QADQ^nzK'wNWwNJB8*#.:}}ܝQ\Fe~羗T_}SU{9W!oܒE#8FƯE#Q#hTQ1~Fܣ, ø|WM<и0kx~-\o7LbE_,4s9;sO;yebo}7qpeo/ޏG?CWݧpn|zx[o2ҿ&ǧzÇΥoI?2GjV_pOqe'r]Wa}Lwl~w\󥳟NCuЎ~"?qos}xte2X獛%\. ɔd9дy|7~~`M|>W򶃎8mkjqXk]}+MNi~ɣ_sM񍭒h|N֫oe9|7rԇ'M=yvyF9N{H%2:cPցZY'ڿXC:Lp:ߖ۟ S Bew\"t!ƯHGo-bC_~Mʺ4S[\uU-gha<& PTHr_+s%bcg1O;y\WSr]5Dޑ~.6 G&re.ߖ~!J<^[ң\y4O75py] Uu:WkYcj1Ncx^̻´έ̵^[\'ty^0BWXUwWz՚?3B2E/0_=" ޳E( 8sI?ynzlQ$|>^}[4YěEݘƪTѯ0;H#?EL'; Ǽ s|/|cYr}S>mDg|m̗^" +, {]~?Q^( %ݢ3}j'[ٖ\X\ēyfnW35BX ϙuy/ϼ_ J}|+39gA'3WU tyv g+Oln1%uy>p*3]ٛ7CCScr@yݢd?%ϡڮyOzsd| ]c^gm T4e+o+[{>6QW[I{~Znfugag1*),c~뙻X'{Z-[!<43ϽBRiNxżQ P_=zW 7:\n1Bow{+> [$d\M׋z eC$<d\=H?Px$AO=$˵/d;*};a?k(̽E5zv0.y;i.:x]K~3Jѧ1W.&9yv:ʣW;Dcެע^ǘI ?U{P?^;^'lD/Pso[G>}[3T'cU sQzdeK(,71 o1fgi0r2}},#Yw23Tf_ԗ~,_]_Ai<|N=TXC5̻cw6ɤwPA@I2|kemDzK=<,'U5[oYU_$/=kE|6R!dD_D #S$_:+#uBB2#Q+1ϣ [L_N?Kc׷vq!~K'ލR=ȟ)8M?Ϡq~f(yՙ-Xü9+vJᾁ{veڿTOeQjZʅ]%m#ʩ'GF 00gb){ɢJ`0Й$`27/k`?` 08i!tP0p`p0 :B`R x/@%@ P @@  Ā&hZ6TKe@@1z'@R'4r`X +U)oS5iZwY:`=p6pp.88  = p3  #pp'pgn^O}C#_<<l^^^^^^ l    O K`+@_~~l~v;:oԀݒw΀;࿃tc;w;w';w;}4;Gw;qR߆ԖkIb8m凫SOj)mSiʙ]lJ\N558YߜT’=9u֝I $1+/ܮ>ԓI6f+Oڃǹj ƔevLg]eL'帝XH'jk2e`ɨ3I;=zĺ6ۓM`YnAOf]V{53ݭkI [V01:on+)gҪkw9ԜSzm /sl3Rۤ*PCݪzjLgUՒڠmen]\85y=ia [ϓ}ˏ-<1DZzaХJnCOciqIE1@sࠔ=n) u[)m]6WTHF^!5wS `b4CgPvwBf23mfkbw6l-D\=j_mV3L#r GRMgH׻jwTtRͿ܃z=0IM?%k,j{4ĺ,Z9 R_d2j0z0%2OBRF1+W{ ۼ0V֌'PWxT\OԌnOG8c$5]3oL4XS0پN 6 9[6m c" ϦiuKj2Zf`EuB ≙NO^-fu%^-\3m jig4{֌iTx dc.jօYQ lxl/XL! VfTԬӓTuȘ%g.3ZER_TC/T;5𱾔NA6uVuJ|YʬPbjM*|T:'ٗ1M޴6U*gHδZWMJUKIeXWA쮭ZfqK`N 63pN wl:OY d JjWʀJq-ʛ֖rX(o=pl@H5sI6tc7y9*fJ{)DF0hHXs YjMdvVI[]MeUjJ/ͪU vf{ckX 5V7JQe%}n$6[iUT&*+S]Rl1Z 5+Ċ͔iϬ\VGܳw*_b$R=Z%FZ%KCKU]TԕaψPM2CCKkNv cHUjHFFs1eȭ*Jj:Vm3j:C[.1l)UA!UuDy^ժۋ}E-.ZmE:Z=AlZOWZG#IbZ]!2KMJj CڥZ#tziVY=Lp&r)N1FaQiB]v" tU:$Tzڸ:KGלUj^8괾 %L'I:%KyP0U֡,nNܗW14ڭZR[bY!Xpǚa5uWc ՇhN̥*J{'_ 8fP fZ~)'k|*؀yn۱0{m e lb|Uro%z& m$qoQS1A핝 ="7їB=(nSI8,>b]}}Ƞڕ [Ɨ9QtPEފ.d yT#5äj5JU.c/`w1]_М`R [{QDQ_ΧeE\*aUZsWAM&.2c+IP7iQ2֮f: ZdbB=><]UꃦK*3-%IFXߢQIH%հ4&5|T/DϒgiH`쵿$#dž4  ]Ŗ lz5{Cg hQ[-[Xj4liRt8=j&MAs%lmLަf C5Ĭ{6sA5 D۲SF< "V0 -V`)5n/̔j"v7^]Ǔя6Ct?J}R 6n*搝cfWX37Ll2vYdӽj|>N ÷>d4'n?3IY52,ڣxF5qxb;D*'NcGRa4;MC$Ź2]•&9-8@7+`+5WA &A\Յ4G?d FR"Ps/_mKl}gԾ=6lo_?lq7ۅ  iNKƒ.:+eƒR Daa 9$tZ7 ٻj :>XV̫D±b2Z]iJ#)YbMyAA1zf{cNPLCO†ŏʹfpqQ q%L$B}{Y.dj?0FVlU-(mlL%2Fwmq[7^1j$E80v7d:K|0 j=a VC3v^-= "eT*`p_8S]iþ*)k=3>mVNڭcE6dne7wkFVlYʂp@o?M(7*v C~2e;w(EPߡ C~2Eߡ C~R4EaJ>Pߡ C~2e;w(ޡ (IpH9뿥t"e)#sQI#Փ}dRt=F(R3ݦuMi zӳ{gtvIGLTSP/src/0000755000176200001440000000000015111650533011507 5ustar liggesusersTSP/src/dll.c0000644000176200001440000000237115001730346012430 0ustar liggesusers #include #include #include extern SEXP two_opt(SEXP R_matrix, SEXP R_t); extern SEXP two_opt_sym(SEXP R_matrix, SEXP R_t); extern SEXP insertion_cost(SEXP R_matrix, SEXP R_order, SEXP R_k); extern SEXP tour_length_dist(SEXP R_dist, SEXP R_order); extern SEXP tour_length_matrix(SEXP R_matrix, SEXP R_order); void R_init_TSP(DllInfo *dll) { const R_CallMethodDef CallEntries[] = { {"R_two_opt", (DL_FUNC) two_opt, 2}, {"R_two_opt_sym", (DL_FUNC) two_opt_sym, 2}, {"R_insertion_cost", (DL_FUNC) insertion_cost, 3}, {"R_tour_length_dist", (DL_FUNC) tour_length_dist, 2}, {"R_tour_length_matrix", (DL_FUNC) tour_length_matrix, 2}, {NULL, NULL, 0} }; R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); R_RegisterCCallable("arules", "R_two_opt", (DL_FUNC) two_opt); R_RegisterCCallable("arules", "R_two_opt_sym", (DL_FUNC) two_opt_sym); R_RegisterCCallable("arules", "R_insertion_cost", (DL_FUNC) insertion_cost); R_RegisterCCallable("arules", "R_tour_length_dist", (DL_FUNC) tour_length_dist); R_RegisterCCallable("arules", "R_tour_length_matrix", (DL_FUNC) tour_length_matrix); } TSP/src/two_opt.c0000644000176200001440000001271415001730346013352 0ustar liggesusers #include #include #include "matrix_pos.h" //#define TWOOPT_DEBUG 1 // only improvements >EPSILON are used #define EPSILON 1.0e-7 /* 2-opt * * R_matrix ... matrix with distances * R_t .. initial tour * * inf and NA is not allowed! * */ // this implementation also works for asymetric TSPs SEXP two_opt(SEXP R_matrix, SEXP R_t) { int i, j, n; int swaps; int swap1, swap2; double imp, imp_tmp, imp_best; int tmp; double *matrix = REAL(R_matrix); // make a copy of the initial tour (Note: t is 1-based) int *t = INTEGER(R_t = PROTECT(duplicate(R_t))); // check n = INTEGER(GET_DIM(R_matrix))[0]; if (LENGTH(R_t) != n) error("tour has invalid length"); for (i = 0; i < n; i++) if (t[i] < 1 || t[i] > n) error("tour contains invalid values"); // main loop do{ swaps = 0; swap1 = swap2 = 0; imp_best = 0.0; // find the swap with largest improvement // i is first city to swap (0-based index) for (i = 1; i < n-1; i++){ imp = 0.0; // add gains for getting to the first city (i-1 -> i) imp += matrix[M_POS(n, t[i-1]-1, t[i]-1)]; // gains by adding one more city to the swap imp += matrix[M_POS(n, t[i]-1, t[i+1]-1)]; // j is the last city to swap (0-based index) for (j = i+1; j < n-1; j++){ // gains by adding one more city to the swap imp += matrix[M_POS(n, t[j]-1, t[j+1]-1)]; // increased cost for one more city imp -= matrix[M_POS(n, t[j]-1, t[j-1]-1)]; // include gains from closing the tour (i-1 -> j and i -> j+1) imp_tmp = imp - matrix[M_POS(n, t[i-1]-1, t[j]-1)] - matrix[M_POS(n, t[i]-1, t[j+1]-1)]; if(imp_tmp > EPSILON) { swaps++; if(imp_tmp > imp_best) { imp_best = imp_tmp; swap1 = i; swap2 = j; } } } // check the last city (needs distance to first city) j = n-1; // increased cost for one more city imp -= matrix[M_POS(n, t[j]-1, t[j-1]-1)]; // include gains from closing the tour (this time with first city) imp_tmp = imp - matrix[M_POS(n, t[i-1]-1, t[j]-1)] - matrix[M_POS(n, t[i]-1, t[0]-1)]; // check improvement if(imp_tmp > EPSILON) { swaps++; if(imp_tmp > imp_best) { imp_best = imp_tmp; swap1 = i; swap2 = j; } } } #ifdef TWOOPT_DEBUG printf("two_opt: %d possible swaps\n", swaps); #endif // reverse sub-tour if(swaps > 0){ #ifdef TWOOPT_DEBUG printf("two_opt: best improvement is %f\n", imp_best); printf("two_opt: reversing cities %d to %d\n", swap1+1, swap2+1); #endif for(i = 0; i < (swap2-swap1+1)/2; i++) { // +1 for even length tmp = t[swap1+i]; t[swap1+i] = t[swap2-i]; t[swap2-i] = tmp; } } R_CheckUserInterrupt(); }while (swaps > 0); UNPROTECT(1); return R_t; } // this implementation only works for symmetric TSPs // Note: code is slightly faster than the code above but is not used SEXP two_opt_sym(SEXP R_matrix, SEXP R_t) { int i, j, n; int swaps; int swap1, swap2; double e1, e2, e1_swap, e2_swap; double imp, cur_imp; int tmp; double *matrix = REAL(R_matrix); // make a copy of the initial tour int *t = INTEGER(R_t = PROTECT(duplicate(R_t))); // check n = INTEGER(GET_DIM(R_matrix))[0]; if (LENGTH(R_t) != n) error("tour has invalid length"); for (i = 0; i < n; i++) { if (t[i] < 1 || t[i] > n) error("tour contains invalid values"); } // main loop do{ swaps = 0; swap1 = swap2 = 0; imp = 0.0; // find the swap with largest improvement (works only for symetric TSPs) for (i = 0; i < (n-2); i++){ e1 = matrix[M_POS(n, t[i]-1, t[i+1]-1)]; for (j = (i+1); j < (n-1); j++){ e2 = matrix[M_POS(n, t[j]-1, t[j+1]-1)]; e1_swap = matrix[M_POS(n, t[i]-1, t[j]-1)]; e2_swap = matrix[M_POS(n, t[i+1]-1, t[j+1]-1)]; /* // handle pos inf (now handled in R code) if (e1_swap == R_PosInf || e2_swap == R_PosInf) cur_imp = 0; else if (e1 == R_PosInf || e2 == R_PosInf) cur_imp = R_PosInf; else */ cur_imp = (e1+e2) - (e1_swap+e2_swap); if(cur_imp > 0) { swaps++; if(cur_imp > imp) { imp = cur_imp; swap1 = i+1; swap2 = j; } } } // check the last city (needs distance to first city) e2 = matrix[M_POS(n, t[n-1]-1, t[0]-1)]; e1_swap = matrix[M_POS(n, t[i]-1, t[n-1]-1)]; e2_swap = matrix[M_POS(n, t[i+1]-1, t[0]-1)]; cur_imp = (e1+e2) - (e1_swap+e2_swap); // check improvement if(cur_imp > 0) { swaps++; if(cur_imp > imp) { imp = cur_imp; swap1 = i+1; swap2 = n-1; } } } #ifdef TWOOPT_DEBUG printf("two_opt: %d possible swaps\n", swaps); #endif // reverse sub-tour if(swaps > 0){ #ifdef TWOOPT_DEBUG printf("two_opt: best improvement is %f\n", imp); printf("two_opt: swapping %d to %d\n", swap1, swap2); #endif for(i = 0; i < (swap2-swap1+1)/2; i++) { // +1 for even length tmp = t[swap1+i]; t[swap1+i] = t[swap2-i]; t[swap2-i] = tmp; } } R_CheckUserInterrupt(); }while (swaps >0); UNPROTECT(1); return R_t; } TSP/src/matrix_pos.h0000644000176200001440000000110615001730346014042 0ustar liggesusers /* LT_POS to access a lower triangle matrix by C. Buchta * modified by M. Hahsler * n ... number of rows/columns * i,j ... column and row index [0, (n-1)] * * Note: does not cover the case i==j! * * long vectors: we make now sure that the index id R_xlen_t */ #ifndef LT_POS #define LT_POS(n, i, j) \ (i)<(j) ? ((R_xlen_t)(n)*(i) - ((R_xlen_t)(i)+1)*(i)/2 + (j)-(i)) -1 \ : ((R_xlen_t)(n)*(j) - (((R_xlen_t)(j)+1))*(j)/2 + (i)-(j)) -1 #endif /* * access for matrix */ #ifndef M_POS #define M_POS(rows, i, j) \ (i) + (R_xlen_t)(j)*(rows) #endif TSP/src/tour_length.c0000644000176200001440000000511315001730346014204 0ustar liggesusers#include #include #include #include "matrix_pos.h" /* * Calculate the tour length given a distance matrix and a permutation vector */ SEXP tour_length_dist(SEXP R_dist, SEXP R_order) { double tour_length = 0.0; SEXP R_tour_length; double segment; bool posinf = false; bool neginf = false; int *order = INTEGER(R_order); int n = INTEGER(getAttrib(R_dist, install("Size")))[0]; double *dist = REAL(R_dist); if (n != LENGTH(R_order)) error("length of distance matrix and tour do not match"); for (int i = 0; i < (n-1); i++) { segment = dist[LT_POS(n, order[i]-1, order[i+1]-1)]; // check Inf if (segment == R_PosInf) posinf = true; else if (segment == R_NegInf) neginf = true; else tour_length += segment; } // close tour if (n > 1) { segment = dist[LT_POS(n, order[n-1]-1, order[0]-1)]; // check Inf if (segment == R_PosInf) posinf = true; else if (segment == R_NegInf) neginf = true; else tour_length += segment; // inf if (posinf && neginf) tour_length = NA_REAL; else if (posinf) tour_length = R_PosInf; else if (neginf) tour_length = R_NegInf; } // create R object PROTECT(R_tour_length = NEW_NUMERIC(1)); REAL(R_tour_length)[0] = tour_length; UNPROTECT(1); return R_tour_length; } /* * Calculate tour length form a matrix */ SEXP tour_length_matrix(SEXP R_matrix, SEXP R_order) { double tour_length = 0.0; SEXP R_tour_length; double segment; bool posinf = false; bool neginf = false; int n = INTEGER(GET_DIM(R_matrix))[0]; double *matrix = REAL(R_matrix); int *order = INTEGER(R_order); if (n != LENGTH(R_order)) error("length of distance matrix and tour do not match"); for (int i = 0; i < (n-1); i++) { segment = matrix[M_POS(n, order[i]-1, order[i+1]-1)]; // check inf first if (segment == R_PosInf) posinf = true; else if (segment == R_NegInf) neginf = true; else tour_length += segment; } // close tour segment = matrix[M_POS(n, order[n-1]-1, order[0]-1)]; // check inf first if (segment == R_PosInf) posinf = true; else if (segment == R_NegInf) neginf = true; else tour_length += segment; // inf if (posinf && neginf) tour_length = NA_REAL; else if (posinf) tour_length = R_PosInf; else if (neginf) tour_length = R_NegInf; PROTECT(R_tour_length = NEW_NUMERIC(1)); REAL(R_tour_length)[0] = tour_length; UNPROTECT(1); return R_tour_length; } TSP/src/insertion_cost.c0000644000176200001440000000372215001730346014720 0ustar liggesusers#include #include #include "matrix_pos.h" /* * Calculate insertion cost for the insertion algorithms */ SEXP insertion_cost(SEXP R_matrix, SEXP R_order, SEXP R_k) { int n = INTEGER(GET_DIM(R_matrix))[0]; int length = LENGTH(R_order); int *order = INTEGER(R_order); int k = INTEGER(R_k)[0]-1; SEXP R_cost; PROTECT(R_cost = NEW_NUMERIC(length)); double link_add1, link_add2, link_remove; double *matrix = REAL(R_matrix); double *cost = REAL(R_cost); if (length == 1) { cost[0] = matrix[M_POS(n, order[0]-1, k)]; }else{ for (int i = 0; i < (length-1); i++) { link_add1 = matrix[M_POS(n, order[i]-1, k)]; link_add2 = matrix[M_POS(n, k, order[i+1]-1)]; link_remove = matrix[M_POS(n, order[i]-1, order[i+1]-1)]; //Rprintf("Links: %f %f %f\n", link_add1, link_add2, link_remove); // check for infinity if(link_add1 == R_NegInf || link_add2 == R_NegInf || link_remove == R_PosInf) cost[i] = R_NegInf; else if(link_add1 == R_PosInf || link_add2 == R_PosInf || link_remove == R_NegInf) cost[i] = R_PosInf; else cost[i] = link_add1 + link_add2 - link_remove; } link_add1 = matrix[M_POS(n, order[length-1]-1, k)]; link_add2 = matrix[M_POS(n, k, order[0]-1)]; link_remove = matrix[M_POS(n, order[length-1]-1, order[0]-1)]; // check for infinity if(link_add1 == R_PosInf || link_add2 == R_PosInf) cost[length-1] = R_PosInf; else if(link_remove == R_PosInf) cost[length-1] = R_NegInf; // removing a inf is very good else cost[length-1] = link_add1 + link_add2 - link_remove; } UNPROTECT(1); return R_cost; } TSP/NAMESPACE0000644000176200001440000000350515001730346012141 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method(as.ATSP,dist) S3method(as.ATSP,matrix) S3method(as.ETSP,data.frame) S3method(as.ETSP,matrix) S3method(as.TOUR,integer) S3method(as.TOUR,numeric) S3method(as.TSP,ETSP) S3method(as.TSP,dist) S3method(as.TSP,matrix) S3method(as.dist,TSP) S3method(as.matrix,ATSP) S3method(as.matrix,ETSP) S3method(cut_tour,TOUR) S3method(image,ATSP) S3method(image,ETSP) S3method(image,TSP) S3method(insert_dummy,ATSP) S3method(insert_dummy,ETSP) S3method(insert_dummy,TSP) S3method(labels,ATSP) S3method(labels,ETSP) S3method(labels,TSP) S3method(n_of_cities,ATSP) S3method(n_of_cities,ETSP) S3method(n_of_cities,TSP) S3method(n_of_cities,default) S3method(plot,ETSP) S3method(print,ATSP) S3method(print,ETSP) S3method(print,TOUR) S3method(print,TSP) S3method(solve_TSP,ATSP) S3method(solve_TSP,ETSP) S3method(solve_TSP,TSP) S3method(tour_length,ATSP) S3method(tour_length,ETSP) S3method(tour_length,TOUR) S3method(tour_length,TSP) S3method(tour_length,integer) S3method(write_TSPLIB,ATSP) S3method(write_TSPLIB,ETSP) S3method(write_TSPLIB,TSP) export(ATSP) export(ETSP) export(TOUR) export(TSP) export(as.ATSP) export(as.ETSP) export(as.TOUR) export(as.TSP) export(concorde_help) export(concorde_path) export(cut_tour) export(filter_ATSP_as_TSP_dummies) export(insert_dummy) export(linkern_help) export(n_of_cities) export(read_TSPLIB) export(reformulate_ATSP_as_TSP) export(solve_TSP) export(tour_length) export(write_TSPLIB) importFrom(foreach,"%dopar%") importFrom(foreach,foreach) importFrom(grDevices,gray.colors) importFrom(graphics,image.default) importFrom(graphics,plot) importFrom(graphics,polygon) importFrom(graphics,text) importFrom(stats,as.dist) importFrom(stats,dist) importFrom(utils,head) importFrom(utils,read.table) importFrom(utils,tail) importFrom(utils,write.table) useDynLib(TSP, .registration=TRUE) TSP/NEWS.md0000644000176200001440000001070015111632722012014 0ustar liggesusers# TSP 1.2.6 (11/26/2025) * Added method sa for simulated annealing. * Unknown parameters now create warnings. * Added verbose output to insertion algorithms. * Improved some man pages. * Updated README. * Bugfix: Fixed precision issue for concorde/linkern with small distance values. # TSP 1.2-5 (05/27/2025) * Changed Package description title. * Bugfix: ETSP write issue for method Concorde. parameter precision is now used correctly (reported by: malipivo) # TSP 1.2-4 (04/03/2023) * removed dependency on maptools. # TSP 1.2-3 (03/08/2023) ## New Features * plot for ETSP gained parameter labels to plot city labels. ## Bug Fixes * register S3 method n_of_cities.default # TSP 1.2-2 (01/24/2023) ## Bug Fixes * Fixed bool definition for C23. # TSP 1.2-1 (07/14/2022) ## New Features * added filter_ATSP_as_TSP_dummies(). * tour_length() now also accepts integer vectors instead of TOUR. ## Bug Fixes * Small integer values are now left unscaled for Concorde. # TSP 1.2-0 (02/21/2022) ## Internal Changes * The package uses now roxygen. * C code has now long vector support for dist. # TSP 1.1-11 (10/06/2021) ## Bug Fixes * cut_tour: fixed dropped city for multiple cut points (reported by RegularnaMatrica) # TSP 1.1-10 (04/17/2020) ## Bug Fixes * Fixed Linkern file management on Windows. * Converting distances that only contain 0 and Inf (e.g., from an adjacency matrix) is now fixed for Concorde and Linkern. * Reduced the maximum integer for Concorde to avoid overflows (reported by sarwanpasha). # TSP 1.1-9 (02/02/2020) * Maintenance release. # TSP 1.1-8 (01/23/2020) ## New Feature * solve_TSP for ATSP gained parameter as_TSP to solve the ATSP reformulated as a TSP. * Concorde and linkern can now solve ATSP using a reformulation as a TSP. * cut_tour can now cut a tour into multiple paths. # TSP 1.1-7 (05/22/2019) ## Bug Fixes * concorde_path now normalizes the path (translates . and ~). * reformulate_ATSP_as_TSP now keeps the method attribute (i.e., used distance measure) * TSP and ATSP gained parameter method to store the name of the used distance metric. * Fixed read_TSPLIB for EDGE_WEIGHT_FORMAT of LOWER_ROW, LOWER_DIAG_ROW, UPPER_COL and UPPER_DIAG_COL (reported by klukac). # TSP 1.1-6 (04/29/2018) ## Bug Fixes * Start for insertion algorithms is now coerced to integer. * Fixed problem with TSP with 1 city on Win 32 on R 3.5.0. # TSP 1.1-5 (02/21/2017) * fixed TSP labels. * fixed tour_length for ETSP and added tests. # TSP 1.1-4 (2/21/2016) * fixed bug in arbitrary insertion for TSPs with two or less cities (bug report by Shrinidhee Shevade). * concorde and linkern help: exe argument was removed. The exe control argument for both methods in solve_TSP is now deprecated. Use concorde_path(path) instead. * concorde and linkern gained a control argument verbose to suppress the output. # TSP 1.1-3 (9/2/2015) * two-opt now works correctly with asymmetric TSPs (bug report by Luis Martinez). # TSP 1.1-2 (7/30/2015) * Fixed imports for non-base packages. # TSP 1.1-1 (5/15/2015) * improved speed of C code. * compatibility with new release of testthat # TSP 1.1-0 (3/14/2015) * default method is now arbitrary_insertion with two_opt refinement. * we use foreach (use doParallel) to compute repetitions in parallel * ETSP (Euclidean TSP) added. * generic and arguments for tour_length have # Changed (fist argument is now a tour). * method "2-opt" was renamed to "two_opt" so it can also be used as a proper variable name. * solve_TSP gained methods "identity" and "random". * solve_TSP gained options "repetition" and "two_opt". # TSP 1.0-10 (2/3/2015) * added check for argument cut in cut_tour * Finding concord and linkern is now case insensitive (Reported by Mark Otto) # TSP 1.0-9 (7/16/2014) * Check for NAs in distances. * +INF and -INF are now handled in solve_TSP. * fixed single quotes in vignette. # TSP 1.0-8 (9/6/2013) * service release. # TSP 1.0-7 (8/22/2012) * Added PACKAGE argument to C calls. # TSP 1.0-6 (11/29/2011) * Fixed bug in read_TSPLIB. # TSP 1.0-5 (11/10/2011) * Changed constructor for TOUR to allow for method and tour_length. * Bug fixes # TSP 1.0-4 (8/31/2011) * Fixed bug with missing row/column labels in as.ATSP() (reported by Ian Deters) # TSP 1.0-3 (5/26/2011) * Service release # TSP 1.0-2 (1/14/2011) * Fixed Windows/R bug with temp files. * Fixed the code for SpatialLines thanks to Roger Bivand. # TSP 0.1-2 (9/18/2006) * Initial release. TSP/inst/0000755000176200001440000000000015111650532011674 5ustar liggesusersTSP/inst/CITATION0000644000176200001440000000116215001730346013031 0ustar liggesusers citation(auto = meta) bibentry(bibtype = "article", title = paste("TSP -- {I}nfrastructure for the traveling", "salesperson problem"), author = { c(person("Michael", "Hahsler", email = "michael@hahsler.net", comment = c(ORCID = "0000-0003-2716-1405")), person("Kurt", "Hornik", email = "Kurt.Hornik@R-project.org", comment = c(ORCID = "0000-0003-4198-9911"))) }, year = 2007, journal = "Journal of Statistical Software", volume = 23, number = 2, pages = "1--21", doi = "10.18637/jss.v023.i02", month = "December", issn = "1548-7660" ) TSP/inst/examples/0000755000176200001440000000000015001730346013512 5ustar liggesusersTSP/inst/examples/d493.tsp0000644000176200001440000003277515001730346014743 0ustar liggesusersNAME : d493 COMMENT : Drilling problem (Reinelt) TYPE : TSP DIMENSION : 493 EDGE_WEIGHT_TYPE : EUC_2D NODE_COORD_SECTION 1 0.00000e+00 0.00000e+00 2 1.11630e+03 1.55520e+03 3 1.35760e+03 1.47900e+03 4 1.14810e+03 1.77110e+03 5 1.18620e+03 1.79650e+03 6 1.20520e+03 1.88540e+03 7 1.23700e+03 1.99340e+03 8 1.30050e+03 2.00610e+03 9 1.16080e+03 2.02510e+03 10 1.17350e+03 2.03780e+03 11 1.22430e+03 2.05050e+03 12 1.35130e+03 2.24100e+03 13 1.73230e+03 2.13310e+03 14 1.74500e+03 2.19020e+03 15 1.76400e+03 2.29180e+03 16 1.76400e+03 2.34260e+03 17 1.73230e+03 2.39340e+03 18 1.74500e+03 2.41880e+03 19 1.64970e+03 2.43150e+03 20 1.75770e+03 2.52040e+03 21 2.29740e+03 1.77110e+03 22 2.21490e+03 1.42820e+03 23 2.22760e+03 1.33930e+03 24 2.18310e+03 1.32030e+03 25 2.61490e+03 1.11070e+03 26 2.50700e+03 1.16150e+03 27 2.34820e+03 9.52000e+02 28 2.22120e+03 1.00910e+03 29 2.20850e+03 1.08530e+03 30 2.20220e+03 1.13610e+03 31 2.21490e+03 1.17420e+03 32 2.02440e+03 1.12340e+03 33 2.04340e+03 1.30120e+03 34 1.94820e+03 1.30760e+03 35 1.94180e+03 1.39010e+03 36 1.84660e+03 1.41550e+03 37 1.75770e+03 1.36470e+03 38 1.80210e+03 1.35200e+03 39 1.83390e+03 1.26310e+03 40 1.73230e+03 1.25040e+03 41 2.04340e+03 1.58060e+03 42 2.04980e+03 1.74570e+03 43 1.99900e+03 1.80290e+03 44 1.96090e+03 1.81560e+03 45 2.05610e+03 1.82190e+03 46 2.01170e+03 1.82830e+03 47 2.04340e+03 1.85370e+03 48 1.84660e+03 1.78380e+03 49 1.82120e+03 1.82830e+03 50 1.84660e+03 1.86640e+03 51 1.81480e+03 1.65050e+03 52 1.66880e+03 1.80920e+03 53 1.85930e+03 2.16480e+03 54 1.98630e+03 2.13310e+03 55 2.01170e+03 2.17750e+03 56 1.94820e+03 2.19660e+03 57 1.89100e+03 2.24740e+03 58 2.01170e+03 2.27280e+03 59 2.03710e+03 2.30450e+03 60 2.05610e+03 2.35530e+03 61 1.89740e+03 2.41250e+03 62 1.89740e+03 2.45690e+03 63 1.91640e+03 2.46960e+03 64 2.05610e+03 2.46960e+03 65 2.15770e+03 2.13940e+03 66 1.63700e+03 2.69820e+03 67 1.70690e+03 2.70460e+03 68 1.76400e+03 2.74900e+03 69 1.70690e+03 2.77440e+03 70 1.76400e+03 2.79980e+03 71 1.87200e+03 3.06650e+03 72 1.85290e+03 3.00300e+03 73 1.87200e+03 2.99670e+03 74 1.89740e+03 2.99670e+03 75 2.21490e+03 2.97130e+03 76 2.19580e+03 2.93950e+03 77 2.24660e+03 2.88870e+03 78 1.89100e+03 2.86970e+03 79 2.20220e+03 2.84430e+03 80 1.90370e+03 2.81890e+03 81 1.87200e+03 2.81890e+03 82 2.01170e+03 2.76170e+03 83 1.90370e+03 2.69820e+03 84 1.95450e+03 2.58390e+03 85 2.05610e+03 2.57760e+03 86 2.09420e+03 2.56490e+03 87 2.19580e+03 2.47600e+03 88 2.58950e+03 2.99030e+03 89 2.60860e+03 2.99030e+03 90 2.50700e+03 3.00300e+03 91 2.89430e+03 3.04750e+03 92 2.89430e+03 3.00300e+03 93 2.90700e+03 2.97130e+03 94 3.02770e+03 3.04750e+03 95 2.79270e+03 2.81250e+03 96 2.22760e+03 2.81250e+03 97 2.58320e+03 2.79980e+03 98 2.59590e+03 2.77440e+03 99 2.50700e+03 2.77440e+03 100 2.72290e+03 2.75540e+03 101 2.61490e+03 2.74900e+03 102 2.88800e+03 2.73000e+03 103 3.21180e+03 2.73000e+03 104 3.14200e+03 2.71730e+03 105 2.75460e+03 2.69820e+03 106 2.45620e+03 2.69820e+03 107 2.57050e+03 2.62200e+03 108 2.72290e+03 2.62200e+03 109 3.36420e+03 2.62200e+03 110 2.90070e+03 2.61570e+03 111 3.13560e+03 2.60300e+03 112 2.71020e+03 2.59660e+03 113 2.71650e+03 2.54580e+03 114 2.88800e+03 2.53310e+03 115 2.84990e+03 2.51410e+03 116 2.29740e+03 2.51410e+03 117 2.60860e+03 2.49500e+03 118 3.22450e+03 2.48870e+03 119 2.69110e+03 2.47600e+03 120 2.87530e+03 2.43790e+03 121 2.50060e+03 2.41880e+03 122 2.43080e+03 2.39980e+03 123 2.87530e+03 2.39980e+03 124 3.12930e+03 2.36800e+03 125 2.58320e+03 2.36800e+03 126 2.49430e+03 2.36800e+03 127 2.78000e+03 2.36170e+03 128 2.33550e+03 2.35530e+03 129 2.61490e+03 2.31720e+03 130 2.92610e+03 2.30450e+03 131 2.80540e+03 2.29180e+03 132 2.58320e+03 2.29180e+03 133 2.82450e+03 2.28550e+03 134 2.86260e+03 2.27910e+03 135 2.79910e+03 2.26010e+03 136 2.69110e+03 2.26010e+03 137 2.75460e+03 2.25370e+03 138 2.91340e+03 2.25370e+03 139 2.34820e+03 2.24100e+03 140 2.90700e+03 2.23470e+03 141 3.13560e+03 2.23470e+03 142 2.92610e+03 2.22830e+03 143 3.43410e+03 2.20290e+03 144 2.88160e+03 2.19020e+03 145 2.60220e+03 2.19020e+03 146 2.71020e+03 2.16480e+03 147 2.79270e+03 2.14580e+03 148 2.82450e+03 2.13310e+03 149 2.42440e+03 2.10770e+03 150 2.86890e+03 2.10130e+03 151 3.43410e+03 2.10130e+03 152 2.61490e+03 2.08860e+03 153 3.07850e+03 2.08230e+03 154 2.58950e+03 2.07590e+03 155 2.48790e+03 2.06320e+03 156 2.73560e+03 2.06320e+03 157 3.44680e+03 2.04420e+03 158 3.35150e+03 2.03150e+03 159 2.62760e+03 2.01880e+03 160 2.69750e+03 2.00610e+03 161 2.48790e+03 1.99340e+03 162 2.68480e+03 1.97430e+03 163 2.46250e+03 1.96800e+03 164 3.13560e+03 1.96800e+03 165 3.39600e+03 1.96800e+03 166 2.74830e+03 1.96160e+03 167 2.72290e+03 1.96160e+03 168 3.23090e+03 1.95530e+03 169 2.97050e+03 1.94260e+03 170 2.47520e+03 1.93620e+03 171 2.51330e+03 1.92350e+03 172 2.92610e+03 1.91720e+03 173 2.49430e+03 1.91080e+03 174 2.61490e+03 1.90450e+03 175 2.51970e+03 1.89180e+03 176 2.58950e+03 1.89180e+03 177 3.40870e+03 1.89180e+03 178 3.64360e+03 1.89180e+03 179 2.78640e+03 1.88540e+03 180 2.65940e+03 1.88540e+03 181 2.49430e+03 1.87910e+03 182 2.95780e+03 1.87910e+03 183 3.45950e+03 1.87910e+03 184 3.05310e+03 1.86640e+03 185 2.77370e+03 1.86640e+03 186 2.71020e+03 1.86640e+03 187 3.23720e+03 1.85370e+03 188 3.32610e+03 1.85370e+03 189 2.73560e+03 1.84730e+03 190 2.49430e+03 1.83460e+03 191 3.26900e+03 1.83460e+03 192 3.30710e+03 1.83460e+03 193 3.36420e+03 1.83460e+03 194 2.67210e+03 1.82830e+03 195 3.35150e+03 1.82190e+03 196 3.47220e+03 1.82190e+03 197 2.86890e+03 1.81560e+03 198 2.81180e+03 1.80920e+03 199 3.35150e+03 1.80290e+03 200 3.29440e+03 1.79650e+03 201 2.54510e+03 1.79650e+03 202 3.11020e+03 1.77750e+03 203 3.16100e+03 1.77750e+03 204 3.28170e+03 1.77750e+03 205 3.33880e+03 1.75840e+03 206 2.99590e+03 1.75840e+03 207 3.19910e+03 1.72030e+03 208 3.00230e+03 1.72030e+03 209 2.63400e+03 1.72030e+03 210 2.50700e+03 1.70760e+03 211 2.96420e+03 1.70760e+03 212 3.05940e+03 1.70760e+03 213 3.09750e+03 1.70760e+03 214 3.64360e+03 1.70760e+03 215 2.80540e+03 1.70130e+03 216 2.58320e+03 1.69490e+03 217 3.07850e+03 1.69490e+03 218 2.89430e+03 1.68860e+03 219 3.14830e+03 1.68220e+03 220 3.21820e+03 1.66320e+03 221 3.19910e+03 1.66320e+03 222 2.72920e+03 1.66320e+03 223 2.95150e+03 1.65050e+03 224 2.43080e+03 1.64410e+03 225 2.50700e+03 1.63140e+03 226 3.59920e+03 1.63140e+03 227 3.13560e+03 1.62510e+03 228 3.07850e+03 1.62510e+03 229 3.05940e+03 1.62510e+03 230 2.77370e+03 1.62510e+03 231 2.91340e+03 1.61870e+03 232 3.30710e+03 1.61870e+03 233 3.13560e+03 1.60600e+03 234 3.01500e+03 1.60600e+03 235 2.42440e+03 1.59970e+03 236 2.83080e+03 1.59330e+03 237 3.29440e+03 1.59330e+03 238 3.12930e+03 1.58060e+03 239 3.37690e+03 1.56790e+03 240 2.61490e+03 1.56790e+03 241 2.93240e+03 1.54890e+03 242 3.04620e+03 1.54730e+03 243 3.07220e+03 1.54730e+03 244 3.09820e+03 1.54730e+03 245 3.12420e+03 1.54730e+03 246 3.15020e+03 1.54730e+03 247 3.17620e+03 1.54730e+03 248 3.20220e+03 1.54730e+03 249 3.22820e+03 1.54730e+03 250 3.25420e+03 1.54730e+03 251 3.28020e+03 1.54730e+03 252 3.30620e+03 1.54730e+03 253 3.33220e+03 1.54730e+03 254 3.35820e+03 1.54730e+03 255 2.72290e+03 1.53620e+03 256 3.06570e+03 1.52460e+03 257 3.11120e+03 1.52460e+03 258 3.13720e+03 1.52460e+03 259 3.16320e+03 1.52460e+03 260 3.18920e+03 1.52460e+03 261 3.21520e+03 1.52460e+03 262 3.24120e+03 1.52460e+03 263 3.26720e+03 1.52460e+03 264 3.29320e+03 1.52460e+03 265 3.34520e+03 1.52460e+03 266 2.43710e+03 1.52350e+03 267 2.96420e+03 1.51080e+03 268 2.74190e+03 1.50440e+03 269 2.43080e+03 1.50440e+03 270 3.41350e+03 1.49860e+03 271 2.99750e+03 1.49210e+03 272 2.82450e+03 1.48540e+03 273 3.02020e+03 1.47910e+03 274 3.39070e+03 1.47910e+03 275 3.41350e+03 1.47260e+03 276 2.83720e+03 1.46630e+03 277 2.60860e+03 1.46630e+03 278 2.99750e+03 1.46610e+03 279 3.10470e+03 1.46610e+03 280 3.13070e+03 1.46610e+03 281 3.15670e+03 1.46610e+03 282 3.18270e+03 1.46610e+03 283 3.20870e+03 1.46610e+03 284 3.23470e+03 1.46610e+03 285 3.26070e+03 1.46610e+03 286 3.28670e+03 1.46610e+03 287 3.31270e+03 1.46610e+03 288 3.41350e+03 1.44660e+03 289 3.07870e+03 1.44660e+03 290 3.11770e+03 1.44330e+03 291 3.14370e+03 1.44330e+03 292 3.16970e+03 1.44330e+03 293 3.19570e+03 1.44330e+03 294 3.22170e+03 1.44330e+03 295 3.24770e+03 1.44330e+03 296 3.27370e+03 1.44330e+03 297 2.90070e+03 1.44090e+03 298 2.69110e+03 1.44090e+03 299 2.99750e+03 1.44010e+03 300 3.33220e+03 1.44010e+03 301 2.43710e+03 1.43460e+03 302 3.39070e+03 1.43360e+03 303 3.30950e+03 1.42710e+03 304 3.02020e+03 1.42710e+03 305 2.58320e+03 1.42190e+03 306 3.07870e+03 1.42060e+03 307 3.41350e+03 1.42060e+03 308 3.28350e+03 1.41730e+03 309 3.12750e+03 1.41730e+03 310 2.99750e+03 1.41410e+03 311 3.33220e+03 1.41410e+03 312 3.23720e+03 1.40920e+03 313 3.19910e+03 1.40920e+03 314 3.10150e+03 1.40760e+03 315 3.39070e+03 1.40760e+03 316 3.44040e+03 1.40280e+03 317 2.95150e+03 1.40280e+03 318 3.02020e+03 1.40110e+03 319 3.30950e+03 1.40110e+03 320 3.41350e+03 1.39460e+03 321 3.07870e+03 1.39460e+03 322 3.16100e+03 1.39010e+03 323 2.99750e+03 1.38810e+03 324 3.33220e+03 1.38810e+03 325 2.93880e+03 1.38380e+03 326 2.87530e+03 1.38380e+03 327 3.10150e+03 1.38160e+03 328 3.39070e+03 1.38160e+03 329 3.13990e+03 1.37540e+03 330 3.02020e+03 1.37510e+03 331 3.30950e+03 1.37510e+03 332 3.41350e+03 1.36860e+03 333 3.07870e+03 1.36860e+03 334 2.79910e+03 1.36470e+03 335 3.59920e+03 1.36470e+03 336 3.33220e+03 1.36210e+03 337 2.99750e+03 1.36210e+03 338 3.10150e+03 1.35560e+03 339 3.39070e+03 1.35560e+03 340 3.26900e+03 1.35200e+03 341 2.91970e+03 1.35200e+03 342 2.83720e+03 1.35200e+03 343 3.02020e+03 1.34910e+03 344 3.30950e+03 1.34910e+03 345 2.87530e+03 1.34570e+03 346 3.07870e+03 1.34260e+03 347 3.41350e+03 1.34260e+03 348 3.48490e+03 1.33930e+03 349 2.97050e+03 1.33930e+03 350 2.99750e+03 1.33610e+03 351 3.33220e+03 1.33610e+03 352 2.91340e+03 1.33300e+03 353 3.10150e+03 1.32960e+03 354 3.39070e+03 1.32960e+03 355 3.30950e+03 1.32310e+03 356 3.24360e+03 1.32310e+03 357 3.02020e+03 1.32310e+03 358 2.95780e+03 1.32030e+03 359 3.15470e+03 1.32030e+03 360 3.07870e+03 1.31660e+03 361 3.41350e+03 1.31660e+03 362 3.61190e+03 1.31390e+03 363 3.33220e+03 1.31010e+03 364 2.99750e+03 1.31010e+03 365 3.10150e+03 1.30360e+03 366 3.39070e+03 1.30360e+03 367 3.30950e+03 1.29710e+03 368 3.02020e+03 1.29710e+03 369 2.84990e+03 1.29490e+03 370 2.87530e+03 1.29490e+03 371 2.90070e+03 1.29490e+03 372 3.54200e+03 1.29490e+03 373 3.41350e+03 1.29060e+03 374 3.07870e+03 1.29060e+03 375 3.17370e+03 1.28850e+03 376 3.33220e+03 1.28410e+03 377 2.99750e+03 1.28410e+03 378 3.10150e+03 1.27760e+03 379 3.39070e+03 1.27760e+03 380 3.30950e+03 1.27110e+03 381 3.02020e+03 1.27110e+03 382 2.76730e+03 1.26950e+03 383 3.07870e+03 1.26460e+03 384 3.41350e+03 1.26460e+03 385 2.60220e+03 1.26310e+03 386 3.12750e+03 1.26130e+03 387 3.28350e+03 1.26130e+03 388 3.33220e+03 1.25810e+03 389 2.99750e+03 1.25810e+03 390 2.88160e+03 1.25680e+03 391 2.79270e+03 1.25680e+03 392 2.55780e+03 1.25680e+03 393 3.10150e+03 1.25160e+03 394 3.39070e+03 1.25160e+03 395 3.47850e+03 1.25040e+03 396 3.02020e+03 1.24510e+03 397 2.91970e+03 1.24410e+03 398 2.81810e+03 1.24410e+03 399 2.51970e+03 1.24410e+03 400 3.07870e+03 1.23860e+03 401 3.41350e+03 1.23860e+03 402 3.29320e+03 1.23530e+03 403 3.26720e+03 1.23530e+03 404 3.24120e+03 1.23530e+03 405 3.21520e+03 1.23530e+03 406 3.18920e+03 1.23530e+03 407 3.16320e+03 1.23530e+03 408 3.13720e+03 1.23530e+03 409 2.99750e+03 1.23210e+03 410 3.33220e+03 1.23210e+03 411 2.88160e+03 1.22500e+03 412 3.09820e+03 1.21260e+03 413 3.12420e+03 1.21260e+03 414 3.15020e+03 1.21260e+03 415 3.17620e+03 1.21260e+03 416 3.20220e+03 1.21260e+03 417 3.22820e+03 1.21260e+03 418 3.25420e+03 1.21260e+03 419 3.28020e+03 1.21260e+03 420 3.30620e+03 1.21260e+03 421 3.41350e+03 1.21260e+03 422 2.58950e+03 1.21230e+03 423 2.57050e+03 1.21230e+03 424 2.99750e+03 1.20610e+03 425 3.02020e+03 1.19960e+03 426 3.39070e+03 1.19960e+03 427 3.45950e+03 1.19960e+03 428 3.48490e+03 1.19960e+03 429 2.65940e+03 1.19330e+03 430 3.41350e+03 1.18660e+03 431 2.93880e+03 1.18040e+03 432 2.99750e+03 1.18010e+03 433 3.06570e+03 1.15410e+03 434 3.11770e+03 1.15410e+03 435 3.14370e+03 1.15410e+03 436 3.16970e+03 1.15410e+03 437 3.19570e+03 1.15410e+03 438 3.22170e+03 1.15410e+03 439 3.24770e+03 1.15410e+03 440 3.27370e+03 1.15410e+03 441 3.29970e+03 1.15410e+03 442 3.34520e+03 1.15410e+03 443 2.92610e+03 1.14250e+03 444 3.05270e+03 1.13130e+03 445 3.07870e+03 1.13130e+03 446 3.10470e+03 1.13130e+03 447 3.13070e+03 1.13130e+03 448 3.15670e+03 1.13130e+03 449 3.18270e+03 1.13130e+03 450 3.20870e+03 1.13130e+03 451 3.23470e+03 1.13130e+03 452 3.26070e+03 1.13130e+03 453 3.28670e+03 1.13130e+03 454 3.31270e+03 1.13130e+03 455 3.33870e+03 1.13130e+03 456 3.36470e+03 1.13130e+03 457 2.74190e+03 1.12980e+03 458 2.86260e+03 1.12340e+03 459 3.06580e+03 1.09800e+03 460 3.03400e+03 1.09170e+03 461 2.87530e+03 1.07900e+03 462 2.79270e+03 1.04090e+03 463 2.90070e+03 1.02820e+03 464 2.83720e+03 1.02180e+03 465 2.94510e+03 1.01550e+03 466 2.86260e+03 1.00910e+03 467 2.93880e+03 8.31300e+02 468 3.07210e+03 9.32900e+02 469 3.05940e+03 9.52000e+02 470 3.03400e+03 9.64700e+02 471 3.06580e+03 9.71000e+02 472 3.09120e+03 9.90100e+02 473 3.20550e+03 9.83700e+02 474 3.40870e+03 8.75800e+02 475 3.45950e+03 9.20200e+02 476 3.51030e+03 1.01550e+03 477 3.36420e+03 1.01550e+03 478 3.38330e+03 1.02820e+03 479 3.49760e+03 1.02820e+03 480 3.39600e+03 1.05360e+03 481 3.29440e+03 1.05360e+03 482 3.51660e+03 1.07260e+03 483 3.21820e+03 1.09800e+03 484 3.56740e+03 1.10440e+03 485 3.55470e+03 1.12340e+03 486 3.39600e+03 1.12340e+03 487 3.54840e+03 1.14250e+03 488 3.52930e+03 1.15520e+03 489 3.40870e+03 1.16150e+03 490 3.47220e+03 1.17420e+03 491 3.69440e+03 1.30120e+03 492 3.74520e+03 1.27580e+03 493 3.74520e+03 1.02180e+03 EOF TSP/inst/doc/0000755000176200001440000000000015111650532012441 5ustar liggesusersTSP/inst/doc/TSP.pdf0000644000176200001440000151106215111650533013611 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4885 /Filter /FlateDecode /N 89 /First 751 >> stream x\YSI~TKut8Lˀ^n8&dQ@DK%c;YCT[ɳ9',3L63l&/2 \3 A&IoRfJr4U\gBg81h${eVfƠEf|33 :e2Tg9edGs "pD~dyuxw IIPJe&S:+PFe(-ǽϊ7܃3Dc8Ɋ5Fk  58.hk@` KW !@V)  4@VDdzt0 g izY@cY@ $+@64r$\Crt)@d 6@8ՠh kAd<^-NpBapYhdD@Đ3  ^y0. Fx{ )I ^q!0"h؋Wp_Wa0lOx5հ@c׽Iپ '0 !0>OʓX1px +}%Nl|}ztI|f4f\^]fv\詅)ŷ{j<ޔ˪>@x\h|)lgo-72Ҭ`$1QF(@bYǍ%<M5y{&5&g/=U:t\&=mzp ϩNx:4m~2*[>5pTR$E<4HEJОu9DgzQW79jZpah1:4尜>p!D~VդnK ?*kfw@L|]Ɋ2'Ҩ"*b*bw'Ģ",Ysl9R"`CPpNϚ[M}^#X*vΆl.ؘMXɂH&[ޠw:! D4/=,/Ap-읗=<&#0O78aeoG0}"RCߗa6 3w iX"y׎F7VuDlMqJ)6͟7O=o1\p^lԢWD &_Ά̆ޚ5dԊ/1ŒG}DƐ> [ih7AhIg:5~Wm e==c aϬhȎ79c'UZ%v`_ YhXVh>%/GlʾK} &H;.&`$M=:c |m;*Ϙ⛎M[ `f61]0esj擛Zp%gt@q(=nx7BB^eDu lePRcd|r*b j*SaZэl9+>H@itC_:*QOpgycw=>zi]qUI5cb0?Q]VMlfCr둂IOol2 eFr??x4U-"Hh6yW׻]ڵmg'lZ͢%寯?vYF IYv[% nV`.Xܸѯ萈lAEK çF@ t\ o -; ՠgб/{!h } +f9FV6żA$#X4Y`DF,[ Xt>6˪q}zNn}MV|58s9_1)ղ.hb»3̈́ێu'c(BZ&eB uCffEX+Mus3tه'u#Дmw24KoRaj-'oAH*dR&ds+kjŻZ4bFH@ C#̄JmhA2jM1k¥xѝ:,  yQ >JnC%m.U>1,K:c!imLnm@>M!WEV7.ǩynDA2{#;U<NjXQzxx^Ay 2AfuP 4XR2S)(%tNT4HE>Ӕ&nE'_X@]Fl$)mZsHHLMbMKy6UB\2/W,$ٔMtAQ0伯K+e_wl6@w0^5Os;D|N\! ԅ kD.r AΈY i5aޠm8ur"#N<%'HrZ6%SȈ )ȢVVR:ۇEM+u9y;G-yϡ"BR7k)un.v.UJDA,)V[D.zZ,EqݥL}YkRߥXngk2x_:hэi%_Z]bBbVn/’>y GN\v*RKvlk ~x9Pm$i% = otG}DT^bBg.= Okf>Y;^,_)qI{IBgLBF]%! RrQBKŲg)e+$4MZ.Vb4nM~؋X/ R[./9ŕj]YzV/Iz?WU] K֫otO֭b}Y_^|r}h˫eص]Xs/ ,ZݺPzm\_+66}xtZdgnY-l2KJjShQ)V)?#, |Z5FXXznl(dw"TH7Y XsK_s9@ >C'O7ǭ9 7)yN_n+r;Q]HrpS\ [k8sڟP"? 7؆Դ@t^*rcZsyP"vI!RQЦ^EUE$tA?0rjJ>aԮ((H-si9m@)Gߕ^qHRgw(*|stM6p3&?$ϡʛG{{&~=:O]^^,^ Fcp#?e#VT mn5E[.4'7iCyZI[ڌ,vzT|4>e#f-#[o-DPxUbld-k!9Zh \2)TAޱQ?r1 (ЛG ΍O+ ᫄鸅K7nP-qÇr191}KE%}2DN;TyAAZSӸ¬ν WͺEN ᛛ!w+{}2ɿr0&W1ֺdrFݧӸ䓵>3C&m]T'(ѡ $d Sdu5H n~P[J n庰vpM;uȻmzPhib_5L6pN<<9^nf|ZgytzgA9fo^yI. PF>[7ZEJrPV򼠼 tOo-%*[!Cco>, MNxNĥ.Bnb|Z {ՠ?e>9lG%M8 _2Fa埗ӭ˪~ޫo62)(fs4v%6 !7ʤ!FtE"-qa9Ridh6ڬ1Wب65Z1bnurRҶ2+ IX?9k6ז+g "  n0\nvh#>M\KY endstream endobj 91 0 obj << /Subtype /XML /Type /Metadata /Length 1533 >> stream GPL Ghostscript 10.02.1 combinatorial optimization, traveling salesman problem, R 2025-11-26T13:13:30-06:00 2025-11-26T13:13:30-06:00 LaTeX with hyperref TSP – Infrastructure for the Traveling Salesperson ProblemMichael Hahsler, Kurt Hornik endstream endobj 92 0 obj << /Type /ObjStm /Length 2735 /Filter /FlateDecode /N 88 /First 798 >> stream x[MoWBb f3dI|`^12vOZRdw{shjQԫV* g XL2E E6%)d]qƓ] ' >Eu &D]%r`]`,!O 'p!XCJP XG vYIC]'N1Fp70B0G`^ R4Y/h"~Ϭ0B*7y#,`0 #)!5z Tv8o`e{?N#41T1' P=G5.UTӢ IEH`0/^jxhW:d$tgլVM^buŧ N!^=*%>?BNSc+sOkٛg8Q7gʜ~]on9ƽu?/ ]lb{sk|uۋW{2WqNVA>Ntq{)E'oyG&x\ WAɗmG,/MS 8 Px)Gm<(q}g#shRa#Z&l츃,ňpFSN5={ +4H"DCnAiAJ 1nܩcCӳHSRҎ-=N{# 2Eƺɼj) FLMOya,?qۛFf&}[\|$&//+p+ngJ8% >jjh&?s#Mۑ}mMs$/UZZH[2$(i~Tas߭/֫Ndfz{:PCUdA-QZ:vS-ḭzj!9 r>9FDBb)shS&rPIJ')בؑ{8C=Aȉ)DCZEiTyayvž#U q8h"5t壟Ă Uhfzı;':҆LDźt~شxuԝrpsL EnYh!Z}փ p X#ONo ˘U]kZki֗_~;xWJVښQlV9&xl3G`J)ZlXIc>x:q´Hl> ܣvEbRFrlI\+/ @'H[ 2\$C9Y9nfL6{L:dɍU|=ջlx O 2jS Oz5y4`CFqpD=4sY}0w=mӰRmt4yfPo{肍nϨy*lc+p,(aྩ9 뛻_g𻳳{wStv~erɿAyYP?SRMVb2t|㒗3\NL'vrTrk eMÇAI&h>endstream endobj 181 0 obj << /Type /ObjStm /Length 3792 /Filter /FlateDecode /N 89 /First 837 >> stream x[Ys8~_ݚ q_USSL95ȒF2$u2[&H\ЍFw!bɠ i鈧cQgRX2vH H|m,)iHTLY)LyO 4+=ڈ21,}(c`hB0?РY!Yмj0o: (g},l4"s *)3-+"+ ]IüH˼1-(V`A8j0aJ  W3gb!M)͢0,:,Q9%<$Q ,!ShTc6@qҠp Д6HEO 4+D2@N1PDhi#}CTJ=* ΠFg4QF&EHߠ @Z>>LЇ RRC*Ge"AP})}@& Em3ELkV9a5Cq"J:a-)>RTסZv }HtI Pu=pƆ3Gq1c$~إ|GQP sb?E=b@`dST`,g<1)ZK,^O'yO?Ϳh_6ɩ`AR@*{;˧SVOU=hS=+JWϪ=]gL՞3U{jT0Y&[M)'+IY/]=eTS7 Ndg;8[QVMlknI/${R8y66wۉUN S xkxO. /{Lgţ+dboI`RII^BX=d~V$ DրJMpΥiYߖnD5 :JH_}x$2W. ;<.ҋ%bf1" Hz%:\@.moV-iW%f*ѯd9!~4'_>?gy||}<|45 O|6Ϯx_8Q~@:_xG%/?rtgt05/U:/G5`6&>a*;[CjVpɟ}t㮖` ~jAՎ<.a_[~|F>N)P/i[d33#O+mQFVîr#xnZdݔi+=~U'߮Y ƣ.WRkp l6<. ni$oOmR榲RMntM׹tB!rrV,eġ魮^:fs&]c^};Lg[+&LWջiS药&M4z$K6Mr:l00nbk&iAY5'J4K6Y!> !iqrb=7*%w[VII։*E>쫄^d d 6!{#j͢>T9vNYetr#}Fc>dAs0ل k7!_Z#0eFCVgViGgg3ioL$hK`#Bo>yť5-cbI"׍J^X*y70RgUOtUO}O'GTͳΖխնJuAԯ%u1vs7aT/1E4nIO?|i'1ЫqtEGAEV{X#>Yą:>XXE+CڦQݯ=M}ۦΦFWpNnoέ e&wd8Q Kb򃵩 Bm{UW\\-s<Ĉa6*@8 Ѯt8MW 6(cJ$ELqi! G/zjA;]Ӱ4l7Jís^tcWr+( cʦz[ 83:V)?9t8>3^9"}j>N[yA}n'kSYZ}&*iPKdg!ݼ* 1Z/J":Bi5Ȍ lJb1Izhg<'18^ю_sаMQTYP$q⑂ɡNEe!^ .&W3$Om`GEc<.V7ضĕptѶjUTZ'6ꈭJ-{m[&հG ʟ.)0b2"݇"b<񼊀? x>嗋P+~mr1ř(Y> .ɩ-QTU03Sl CV|#x/sϿ,pBFmlTˢt/]ڪṈxthsaygBw/elt+@͡3Zih,1Ćh(ɵ&)ZI Likѽah6Gbע zT}+n5&޸#Ry>ZTBw7K`s(1]HccPN6UKm3U*lV,l?jtxܙ?bR*p q.'b̠PJW3ׯT]gͯa:n7m=+aFxS-n.0M ZZ;rgQZ!p`5 ^`-s'G73@iv/#taAd}ãh8>a+l=޿mϜawz]`] H46o aU9fDt#}aPbHendstream endobj 271 0 obj << /Filter /FlateDecode /Length 4923 >> stream x[Kqy>(Bh6zJ dJZ9qp]q>*CrccY2MUMoW+A_7៛_~QRpSe-Բ*Wo*+Q~x7?:]TVN{X;UOh QeM{*fxnidYUzl1AB^W#`0њV}Ϳo}+[v-$+mvR^8dxӝn19މʖ^xWU͌gk+U7L}s{~"@njJ_yA[HPڃEբIAP-WpE+2*9mwY=~9)~1^;W8^HsYخoy;)$> 'fd-9uG^WUU:z?le]z]v?&o)E3޶h.Y;]Cy6#Y9뫿!ns_.XXpa7+#zq/6mY8i]s3]ɬ0@Ԯ,k&uhƀ6$XgHaĤ`;/0THB׃Y4,B/-$gchiz:SE'fRd3ux5AFX~dC#A^x<ےJ \ MlS≏Y#?h)2!hR9 ۧnq1@M8:T2ԵM)ۿoiEh<6l슻S#$a Uu27L"XݷW6iKiPrE~憄bHP2ߧ%S b {Q#$xQ^ g'}VCV,@-H pZ/q=5 nEIqCe^Rfd? huD>}~ 3]'G,h&iqfǝ$Q2, .҆<cumTNJcɞ=ݟstNx?d7|rEyr&XtIO"Qڹ>ЦkdD*ħAĕnZ#rgB<$7HxKPmHZ 8_/Zihy1Fi NAHu4 ʼnl@=NA?5}8fb"{7qyrH>1۰D%_J,Hp˻B: .> 5ws,6[ G;_<ݙgf-"K&p Hh~PS (0_ʑz~lϲiIO4w&|5jnmn4QBU >Zsh+LIOCBK#iZձ@oR1c"AyxB7,P 2^BWNcf蟭R/!dqaYjܝMqe ]Mi ԜG\bu BfJT"x3r% ssBP:ʗaٌui2t#N~ł&Y1T}XV# 4=*0Ӻ 4Ѝ)ىmXΛ׊ Iqѳ|_jxPp:2QL$[LZC*FߕZ*B *ڿZ`w"UnYiPqD3劲K]> ,ҝ h!vK(1[ v^>7p8BU) S/ x`-KApQ5Ev׹] Z+9z?6: HBv* eNb,F;=l zQ`JYoBJe#rޘHJH!Mч0~9g96/wKJ<1'; @X ?s+Y kB{6>{TT\ khC`[NRjtCl|0V{7=B(_o+ߜ0LT18e )|lC)'{5=.';tw?PojE,%8-:_i̾Ä)Ši{8>!8o"R,։D|88K a1 хR_{TNΏaz$F9!؜x^ a{aЄmhN_É?sD@F4А(p/ tݤƨ~9j\ae]L组2AP|7Ĺu!X .ѭ|T%B J _/4cT*->qHS7! )E(㌱D !q@D䰿]S.. I@r'G[{,Y(Hb'Hݤ0\]geBUՆ #]L<<ԭN/1FA ,o -6wqU{DBHȔ1cw]NkMs)l@1 L:4tɉZ&0c&hA$m6 ]d 4[肴HpgԾ*Eʤ*#Op?Qǧ[sZP5.ic,.-k#3i0u N$h8s*&#R2ƭ 7 }m-!7!BrenG~]GR5^p \Ը9otDܝRI=GeBCjRV꨻Y]l P[oX qF]hWuABh8aWSw Q;hޭyY!k2UI!}I *qD]< >4 Oxn0284)H|KZרoI'^wic*a@,Wf%yRjM oOGw․e] :wtVò֖5i!"h9?*U,Wy[& ݻ4 IU:ޭQvb jW"6)KgeqVc]& !TඊU#Veɘ>R%\ThV/W ?m*'ep=LU7K55 9tOĀ]b7nW?G1G Jf7BAHҩx2rHbRMp^ LJ?R7%Xyd0b|^AK]P^ZZ:6X,b/X٪t/e-@-l1ӇR@>([UgNl!`ȊRm~#K7!$t! /Xǀ\hVYUo)8p_Fzq^G^rJC7jEՂ\>2?fNؗ?{U4^?bU.wE3n-xy 뼌IqǏV+n^ݤ䮁!6jm5V2 1܎)uGYkE%6)rf#еxH;5"AXXyEviZ> stream x\KFr/h7bn880 X]k @r!i hz ]/49 ˬkE/O'=rYYx ._?OE/.qI#/%el/o~>5^%o)~ʶeB;94w970'"I{((ÔWj5RI|I ,ۅ; g͟ o"Ց4ѭ a\`/͖ }ommsZJijvwWM#ny`E]ۈ@4U3L:R]ltF$ l Ώ7hJZ}a{тg} ^``gHM>\B5ߎoI{jh 7.;ZG;q`WhI&;"QTNR4gM5-R͖|oR4 a緗v̠ ВHmN3i{ iER7a:ܖC=ξ%zgT7UX@®\IdG,w:@8ktby$稓MBc ;۱Tܷ{P0q\d˼ae١"<`A`)L5%9? 1hGh B< _D[H%Z^BXTlz=s2mLJ0j{T,0 |HpJ[uM7~ұN.2SHOOCd<˺TՊY?сlul 3BI  6H Om*_L{lwPJcٳ9؟G8>6: )6=" s~>[R]Y7CXN+5zf SEC`C@WbwK+}nO><61|:9ݰY@}*I:' ⅞犜  E&anK#\WIܱcvPx(Xug>M"Z8PRlIɸ-[am깎{TŤYB3ydR¶P9& A*֊5c @& +_!2 y|+r|n]UHx[eeZOz\PVh)f7BoEe79Y2ߠ->̷Iwd~K͙} D9h[ |㭸Ȁ~5k%N!F!M\߳LHӅN 4`dۤg~1(Ȋ̀!=r]p!V}1߆`}Y_,2X_Zqsyk-9}J2F)$O]O R2'.O{Dn"~uoSoqc.x+ 3|}|sؑ8BoKv2?Z֥ߺЗ޸td!uW :,ESCȱ>VUB;<ip 2sHבe F-"q0 sTΒ陲qb}l(DV Kkf5M5<.Ɇ7 _ ޡza]i#8G(c6̫L;[ z+/Z[B?DCgD%ѭOufN1/! gi/8b\ʿ2ԱTWADtߔ}iox\&us3Tv""/KT31QccHj,L@=k,PABegh3q}2✩(mjbvEsfKQK7N)|h:$R>\g/>A?N |E~􄷓xGߓD6n\+u"rWvr&w\PŮ Vb4L Չքxv 뗕XhG0D|rx}l9{UwlCӱ"cq\8Y4zѽ-V [om<738fh>召Σ%M= ^ϾO|`<t1DjMJU>Q詹OCgqr+LP 'ӣ3'6u#y㇬|̏/iWDkA=~ GQ1d@fL`s9X![|9UK9TfP`Z"!=] :K*Àv(IWr5)<=`\|a@O}\-/,~'a{ 'A=G*e+[Lmc|8%7/.j@4$R>c ʥ]eXKN"c @qKXRGfyb'CƇN3/N}Hr1҆b6d@g&15Jf Lku@Eo͚1Ux_\㪖Wtkh*hp;~mixYF6L<="b)tdz}@WZlsEC*=\=sBd^5TϠ v0s3y"$:rz t:RX Ha?Y:2d2|*ǞYr9"X*:S 15 Muf84a~aʼn,lySڴQ 1ʼnq΄?9]\?BVw'KNG(FnkHE@/)Sf{F}R$rw|ܡxLvuJtJ7wJ1pjqYUDi p4uz|d͌R)-h Q*rk ݎ;],LjRbZ4>>n)`uH|6f xuS38͞MM 8nO9ɏ{)<0/[!ü޿.6S}V7=7 Hׂjc6J=F'^'T_%lew2/,rhvάq,B]U-8TNׂj wa–ܧh$2y&$duK &?l9DLŞ,}*,žjtb,bd୿@ sLmOچ&o.؈9N{Buչ2ŷ IPVJJ JrڮYw>勦"> rSPDK30P[/?i*يV+ R-@3(Xd))ř--ːC-&+ Uh)UpQk_&W(sŠmZ A<\}~$iYu-'ܧ+AgOb*v*-)/HƇ[͕b\ݡ:Al3=TqEFIc&.6O{HUY$-]RBL ZeV3Bvq:dOPAAT0ε(&Sw`0ϴxXNG4\0OkK8omݰSAC6 77|}y%,e7R<:aJv%7^,DznP|oV:RYi W ԪQ#Nʟf#7yaEHֱjLvbf LՐ0k׵: f!Z`ш3Vn{ʝY,74Qٻ0W0A%;p|d>Xh ":CiWS`,}zj!3~&q?akmnȡR2=nZ$G+h*e i#UTms%fd}ù[BH:s\/s `\(+k!NQQ!$!w(5u?;u Z^ =>@Vkܲ<*Rό9Ω.Dn[febӃ슻sqoQjɭ]`n$RkcaӔW\ X獯 \ߧec5Z:5\aH\q8CgT(h8J -k=Z1Ms7eK=JCa] )+ :ZfD>Ė'{i K+`Yj!|[M4%p:JpFpzAse!},2lu]JI8Ryxl=^sWM[٬> stream x[Ys~o,GUSU׻fuwUz/jwj8|u?a+.+LZ].tk\ W j[m!D4'N+eo@Yi?>*'-0^;W}w8/ \\Tf}./~vZ)ݘ# ru]kL_9i+Fi1'k+ 9^\vwO *z#}ئtՁkެ[SM攵F=yȪë@PjHtbTיھhDAGwwn'B #~QbCE ~!^]i9\gj-E*/Ѐw7⇁񿡫]kٷ"IUu}`>dF7\ $^z-!vH"3;d"0p*U }Uե %[23&jД]]xqו܀ ΋fjypNVoSɄ V_220 `TvF'7IsT*xzB,wlt!'lִ 㪖F6BHLڵcb]ymaV,*)[( zYrb}QrY|#75)CsDM]e!xr,p=(,g:KV#U0^rscwJm>eXm5EeQƻƀ#;˜`s9BO;,$DI,CXD\* $Blcm㼯ehqߥwwF_}:f!#p]' fLYBiZ4Yz(`yQ4;J HHyGx ׼!O<@LۈO1mL2K 1E`2@0ɲڰyh_woO#[.@7k^OIESLpf.H]CƏk6 kdA.[aCW6i;5wizIR3*E9O%AN2R~;a\Š%cKGdMdPD`͔a$@ڃ@,rs0ae*" ̎*mʢ |Z 3~vTJJRZFK&ڑ}",4'0bxmی)/1qD^eL̔fs1QF!̲jk@!MٷA##a S1˾Qid-L%P7xS8z1ݞx1ݍ\ΐ Puo+}4sizѢj #塥y/b|^鯱%e #Y CڞsDz06 WZ32|3R'n4`)Y1 LjN$a5%Ӏ%is/<=mV`|I7~[hӬ">R}K\+Ex}ڗ=Wmpp=iDkZIZGcx{Ҫz{`ˢweW0YL8j"*u#.{Wρ7n b-ebKۭR9XiJ_6C3s܈H8iekjX3RJ_# `6mPR$)ES¤Rܐ<N#n)𑡭ӈ30[GNT]HLh6*3sQ)P-Mh3hghQ%?3RJanjf?3S/ggpU!T+ 4<"1QFPKi>LL%s!5?vјZQlS g ПRz$ADʜu\1Yr?!m  :5oǧE$4,@I'Ftc 5XI݆o/~xt!4 LXV(aa=Z /,s@NPH\e /M ?Bh;ɚD|އA0¶Y;b)t8mMKs !t6=i1'ͻ,QWJQ8f`٘&3+BU/t >'Yϻ 032Dt?x_s?p|[3 U mقz xm"˟E5'|4sf- p!s)}ɡҐ\η btʷA/,ELFq:5 ҍ$Ì£zV(H̏1^g4iXpyUa=~N%{|GYj.:=C _i Ln]x(a~hKs|ZDp9w]] H Ib[d6Ǽ-/h{&>A =^@4PIMx>Km=e6!*2\$4p<# z4⹏ |k `?>&xp,N?Fa`+!ݮ۶GG*)<P x.fi??>W1> VB ]F`xXȟZqjcE0y4[Oo~ܾl3c4o{D٠|y0mx%μ.&x : q:fުi .9mEG]$F/Ħ0t1^JA̴Kaq3Zdpm vCqH=n\ƞ٤%PF<e#\qdKobqh0}xK2viKBP8%b!9WF˄,`3&>|Ĺ))3bIK= UQ͌"ytW_d|vrFg^_|yJ,dFpG瓆@ךU]ӸmGF-C' O4_;ǝ /' c]C0-G5 V)KZEiTy%`l-‰bG G5D.⼄}xNҴ)ߖ,G +@yh.Z٤Gn7/H:T!Oendstream endobj 274 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1471 >> stream x}}PeU[St|it|oP_PADN5D~ǁǡ'("xJV2FZ頦f[zlח}<~?y*JET9a-cV' NYo5xkRJy|̖5Rb",\MQT5Z@-"L* SN>P%UWWzڮ]vah"VGD[i& gbәz- 7 Oh>y/Gkb.!H.41>_+pT-]"Pyk\ĹU_-%ǡ!I nj##Ɉwo`ś6ǯHK7ӜFM BU|0@ّXQ},q[R-9b7p*Lq7&:vyp %ETÎ|ȁLw?`6mj>F@,^4&` ߰оNyf_ծ-nEH#$ &bԲӅ{4WO&a3\w@q<Βw@Zose׻A޿p-rcIGy{q2hc/\Vu(U[ %5r^G9[?֗YJnҺ;7]9'xr.l06"zC4xemW- TM3[*ER()(y,ǠBF|SA7L*LHĻ o?md"?^iUG$>Nml"5|NhB̸|v%J rjCZ-P(jA98YLaN9G|WCApLSV]y̕V f2"`;Ar煣MǝB,'wB"OM7ǥmF/s  J98٭-!<4pH؇̂yԹ2K4~h٭$b2!d4`N[ȓp[yjC{C d^HEң&2l:=GMӃ;A&˷5 ܅|VdkAXh}rIP2ˆm4ʟ_D4cLtH}X I,Hz/Iu6-7+gJM-YS~٢G#,za Y'=xi'f'e?[kvj24Dm()PB-iš5̃oFD8cV=Q#إ&O'8dPX %u }j[#8p.#0*[.Q8L3Rg`:Ar"@/l[o 4ѭg𙼞A J]> stream xX TW֮Y$VDgdW4()H}AvA6 K#tGqFg&jLIWcr<8z˽dW y!ۤK,S}+sq@d_H? {P×h#|EFm]m玝W X4&M}u0ØOfɌbV35Zf,x1yf>YLb2"f*YLc2ә?0˙?2+ĸ1!LƑA2{Yf = c3mdzu\.br ֏?ܛm>Q}>;~&Wgo xo<2ݱ;^ɏwwUӜ'J6b7G:lXXh8`HN"Χ.է@8pQQ*(5p66CHNji-KdbFYcnz+" tjqD9p3ʜ,׾^W/NPh3`|aK7]:, 2wZ./#oq׫:&NlUc_žrCT6;2̘>8q*x: oj&`{ꄒƓ6v9N-cbmaZ>Dwdwapi\B<@T^Sa)L+\}ig}9@˷dۀ|s|W 25.̝7$Id$#8Ez h!%l8"r:6t?0 7[,J95ly?C~Ԥ92t,?.z5MbM#_WHZ2Os]#RqbRkƝ '8Wo *)y$ZmX`s ,+uXQjXdb Z/*brnx po‰`YO*1N#cwMBNZD0rPqȪ FNf 4tphRci[8K(]^n9$У(R)ʺ2͊C)ZF==ޓҌJ8b#Xy&s˼CK2^X8\Ӡ|^G$;$YppJV ]cQ3{,k弝gB1SLbH-UA$Rd}H_8 Np@xu"ْý1IGhഠ߫&, f(8"-:}(s80])`d.>6\=|؏U/vIPppTZa##pk=fE~T+y[4b)'mX;"ds[mla(c(9M;)$w%PGStǓx|:[eM F0vE"4E;_sS ~/~ǎܵ ה> lĎr0:Fel%vt<.[hq6xE2/a+J{&Ds6^B i/1+Ҝ\ i:_.iGZ C 1]bޣFؔaOljԤ0HNuCVѻLY90#*-\s(N3cK;) u-B\2f\vk +!J_)7'Uq<J9 d&3|j** sKVwi,VJm!)E\{Gz?ShVgBxaoQ|-L%LMt'Idͮqy;]07|6v!fCUÖ@hgd;MP%n'5f}Z26@ak_B\)+(6>q-dl 92?1 QTLo0 Ns)d-c$&WJ w tH sF *PN>e**htHwYpm3]̑5d#2DzHϰ/ZE 4;kJh#iUe3 ́N*Z#;[hu@%H#eRS@^dKT9HaD0J.\fqEɱ !bAn6UB=g + o<{:qD@'=/-2:zuzJ\I}Fcl{dZ'hBgtθhH`T1!./?taԴ䕯'hZ\aϡ8Fy#ğBf_^]}bz)4(iՕQcgb8}~Hg$ {.zӅFW?CyUM>ՇVJn##OVOFWWL uE5JlYHګzf!rr5_S|;ᄑojng+F])䘍ta\|4h5QGKOHtzlbx82>' ڡ|Y; _i T+q2ZdS v Fׄ:V[Վ9#Z6J+LﶬnDXl_::2j'0M_>Vb-o24W.[ @I[O8Ӕs̞/_?nVW6isi"+*qM1]3p)xlRb_sJ" te˗ _J'x۵DR׿dԆAVoL䋆2 [Gr@wg/URc"1F!@m,ī ZoƂnu>d}BThڕΞ֕{{P[ʟvrmgKܾ}&5$t@zcQY]c5_Gks˱ɶB78\|_MpYB/ɿzomM5ƛ6NslՈ##x7+Y9R2DfscQcE.˚7 45|T"[\1׻Im{Jb*C`=M#*  !5m춭&SVu¦{1R+4J{8IZ%ߨ/Hq*VF8Uqpw;$5J 2cAa#/Yطp %ص7Й肎fd]CX {%Ǖ[OHIJ,%/k.iq+z@J H= uq(u=QvEzB y`B&kw\psa6!H*e+ e¹΁,>j%'SpAf*K녛p}: JLi#Bu#2 @١fig+.ޠ=Tqe ot9מmgݨ >_ ƃ 7*xq ew^:^>7- nTvkdN*lPj'ɖB ?V o+4x(L"wT_/%Ptx.oٍ,D0K[#20]yGhM*t p,1 ˙26U=IAȍPI+-6mЭv[9'f=p&'(tGͦL!7=IyLˡ5 q3ZC6G9FiWm}}- &Z1"\9*K]sw=τjLqr16bCĻl7V,RS<-鍇ְq@{6ytEO$AP(Dq a?p}Pٵf .D1nلuuŧŁiB㩖bs^7W&A$".Z(hq&< (8ZH eTހ'ZWNE*x/k2ˊ>nϿDnk4;ZyTi\ t ҁ{AA)|{bC!N#%pNZo-+J_O3Z쏳>P[!1DkR6[kWB4 =Q@nʪgiHsJM}y:??u̶O0%0ut\vh֥yg7AD{8U 5s/z}yLZω@5Qq9Ɲjro;wtk񴙑E:ntk1DUgn9٣`o&oTSjlȹݷ/O^vendstream endobj 276 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8089 >> stream xzXTW2 j5]Q ea{D[LԘ[1Œ}ps}4&+>>׻z׻VDuD"Ų}}Ǐ] \ /UqM z`FЋY?w5ZM j$eOKFQzj.5@ͣR8j!O-Ebj"D-&S˨)rj*FɨT(eIɩNՏO XS;T>uIuՃzR(7eAI>.: eFS/Dufv* 75{nh~[Drgz0ΝEweT+~-{紞W{ue->Kd]dn}Z,|c~ewoǀx'f=س^s6nГ9d䐓CghІ% }'FkcTۣ58㷄Zr-D)kW<1')-"AJm?;2^Dk9zC@yA+"KsxNWX/p  3tӼtm9u\XJ@Av4<Ϋ>x̅˙_iAUD"_ sr< 'Fzod%$64)א/lETB!dӲ`*Gp^mP b#  hg h5rHq}<@-ӿEW.}ٶN^ezvKR~z$ d{ɖn,Z}!HoŽ%jfO-R5r~QTu+= wǽGaeFQ );-]n`-x6 JPplC%{a? ppU¼v@:P^IZ?4n U*Kbt8!bUR|h7(?te?r?WPH h2ȞF蓆%׀A4*kˉN?v[Ǣ(Y&E+Aeӱxnt GvGxxB\`P@t)jg7ظ֯?:-'b쌦`kM}Q^ˡ1Fފ*xqߵ IG=fic6ʌ0Kȡ^:\.ʿ"ZYJ`e|tsp_p\mWmTokn3780:o30sW uz͓ U b׍;ww50VM&XNG@BVNWT/,x@[B>g$.ĽRAQ?+SZĭ(D!Ap#E~hP* K|u&P{obųH+<;bG4 OD߮h"'xs0@s䔏E Pr~(вP_#|^3khoEm84CJ;)@=]5LKZ{~S%]^\?NtQŗl'qؐsxѦ(8gIsR(PG(yodF%wC8ZdI|vD-݇G& IΝ>tvCiiSݛY09B5kMTw xEqZA_Οސu,I3MUз i3Ya׷ȞVǮ eq">J̧CI%h`PYAqIjrNc3TʁdF($4~ArU9^h(F(}b'33%)(-wY'|R ldf̂|gф̖"l]L40\HO ]Ѷ~oZV:X ,#z<{WEoB:?xG6lٶ|Y. nʅl{%ŒY#Ytnn&jiԼszt2pMau+6fB9PӧT8VQP~BGIF$?orXQIIE.z7rHxpfuxXz*P!o,v|i#H[MJr,FFufR2ɼ( &庣Qm"y5 F" t#3aA[ݎ^l:sE.:/G &2cAC8Q[ ډd4N󉌋Z:F ьahUEqOg7~{) y:n-SH UR ByU(+K[%&c߶sr͟3j%Vxk)`PAvu6΂^ *|F)%:įUғ\vM* ZOA P!}YCqK6E8[Fr!׉TLzE Q( i$HJ#Aw%T:EZ(ڢ˖RUo4}*O~˰H$t`wMb1I*$3pHRF0M[ߤ9MР?W}S{y'5+*p@?HY; 6)fՅ?A6O[i!i+):mXӦ iE ] ̻5uq;",^Ob݇ZC,l]A އ23Fb4@S$: = qb1XI*z^n`g\:\۞[]#rI/c$D8<-@Kh4mep!~g{qoP.F?52g۷Iҍ"dvbSZ)ku $pg>ߐ yl:<2u],sdR[= ~/fѨzw3̜J=0J 6 TV=P_4M,VHYALm*'GV,`ѥ Z:Q 1LDNL~fQZ)cJ~Zϝ1ALgr2;joaDuj* 8aHd뉚UGna6F1Z ˱ڿO}ȡFt@\,eU`#.<5En̏Xr`'oDWh:h{ pnraܚNvYpJ3Hԝl Bѐb`"35FεW3 lx) ^LKFg_PuIVR'YePPR]vߐnCshFO.eļw>|y?zMOۚThPS$&jO8hډ7Yc1W#*v%Tgz3ü>SeW\k3AOlSt4\{qɭTηNv >>c-&\7x%f 5n gs/ _w.}J6{DDWrq ^&L$4QEjh( L*Q); j0%i2 sh"qLB=&-LWqA^œ_ N yqˍĺ|:q+ ,E Z}b*[e_<֬/&|^^g6S C CҺȀ:ΫS75AUX:5jV1CrE.wzfܥfFw `*~$2`/ӵpTd'bK`i. j4d׆N!i&q٭?` kK רTxi[zUC>a.XP.hgKyZX& @܆OUlc#i=M7NO C4!., _ZJ׿TNz-1miUxԨ6'9GkRI,TZ( Cx\: @C9VɼRk ևO|ɉٮhs[ǵ\Ч%|hKmh~NCv325q|p&Lq#Mt1Fi)>׶ Mʺ "qBp”Rkz>' ɺUӓw#ߪ!Ӑ)ORڧoP0!ݍEh)S*Mz^6'Uv]&4nc"R;Qΰ%msIA-{FB|!>7MoHMfN~ǡ|Kzx~;Qq` '">bsh mVڂ򲲈r(- i|Q 1?lދB9d8fud+R{&[\CDIHQduaھk&$w[n<}h)m ҃NʖѤ?V֬adw:V]DbN!=?| kҗn n޶[/sCp47k=?9Fa2Bb+I7*au N sRoB)Al'XXìbap =F)éɥ_@jy0)a:( u֯/܃mlۤ۩L0 F<^VXSX]]VVWkrQђHsTL)z氒̥{?k8r.3&?b͸plVLC@y*v0_wc磟ez&[w|.n(`|uؒ6fκ]{C,9*72ѽҋYW"{vl 15÷:N[a{.2;|q-"\`^pwE'#Gi;Fl-u18 J*ɩ#evGVFPٞ˶{/}!zB=#iwlM/9!_6[XO1MeH&!(6b:&\j/Wtu =A$* BC O/+b^kFd۾l wOv)$oN9ʿN㩿ݨ YaxaNRfq7< A=2ҳ J-}N\kx;YED[hTJjI5i]%&'*]l˶+y$*zzVQ_YxUE=QuUB,]ɮǝbYY)l~|$dCOH|32u_mQRUH* W<yOLlWҫV%S3~Pl${?Q@qyc_FBuЅ8[+XMVRPThA߿]{3$dOL1rkLkL&(]A?4K {_+B]Q:6z9^;vFX.ECE^ 휀kP$BC!VkW6uJRB$Q]TZ56pXbɟ-b#o h'.~VEh1m:٥&W|gضYjAm"[;i 6FzQn*5hujgiXd7D{ݗ?g3ԑ; T̟ە8v"q˝ǿ,-YQ*jd+; W$QQZe6u0Z j͉8[yVYV\2JaMDKeF\VnrfE߿Bq0͘R%{Un5Ewż.ۉ?|GN<$΂aNu}3 U˒?\I i2-T.9fV+TG\'P/2ʡ.̴ٰ1 xDXs1?/I[kY AS8)&`Hcz 㹯a/t IVZO_ ZJ_>W IN3!~1iH9s'X={쎂."=>  gvߌ k5C&Ӂ OKLJbR "4fβCJTJ3mg{êbcDpG.t*:&i6m60) ZeiPiX.gÜu0~>QPoYH}(J1\2=eVnsQ'> v)~:Ldr7sX#D-xT"5´B DC0;9NG€}FGF_q7hnfp|;YmjlPc`΄?A|l{R\ Bpvda" tC?񣲺DJGW|R˕l5:uzAͥݺQ#˹endstream endobj 277 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4413 >> stream xX T׶4@ bŨ(51>8ATeQ4 2*2R8EOŘËqx1?o&_YkuV]gAt(>fw؆ -g +^;(~_εyq >5rZԦbfΊ_5;hkm8}>cf 3c1_0+Y,f_ƛ,e02f*3aF1f93è{Ɓqdkc1ӗN#g3R-ѪUcT**Oa,J|!ǒz|^M/^Yzhnoτ> i]kd[nͳVֿ[g@!2VƑerU$SlOM':jR=ѰgI`43 N`o% [ozNǓ"q,X[=IV;GA4 /jpxo '$SRɥiLhSҥ9T|4S$)OK8q"Fu&'T %V X΂ML&^Õ@%Z8)\ӵ6pt歂L>0\$+IIJ^stCs&fg!nYK\<Ap1#+;Ä1VIڦGpY5] p m,s܀*7G>L=W>>"雯 !GdAqå0\\r4$KKIqeqUI3&$@AL#H9CSWK͹5!s믾n<ˈ`3ˁ2fT1 )z}Zټ'fL'A0@ J샜b ].mB^ ؗ()+`_g'B'_Ƞɋ7osB.C|^b+pwrpmMTI_{8RL.#1\aXTt* o!v4*g@}I_v@W@ UdA>a4uU@ICV.>f>a;q}|wLzŭ?ˆ֛A*ϑN/^jM"*9?_W(8VֿB\Bh`mluumiH1Qdپ\² Q/Yug6V%;4zZTL'ǹ^j jXT7q)?I;IKw1\kW;qغ}A!ٟ<$C]},ѸŘ^ |dv=٫HFqX'|O1^{sY]"'h$1(Mj $'v% 8PqFۈK 9 {JmT5/JT\ ˆk)?쀻׿?zM|ETi|֪x#XVfAZf82<-.<#/< ϪpEA6hdW{2 z @*0RZt8F,U^ p \?E%q Q0ru:AHr g%lt\J[M$ 1_)[Fh{gϜmT y9ż`x/H;wqp 2w\pj%v{Y_#P'B8PS?+2l>>Ư.noMmqź q_v<븩:d0/$G?HMDaX/*dr*Q NhNo^ .3i)q4ԔT,t!VÔWPHVk{1WɒK؆ĭi0XmI+iښ-U;H*7iSc!xK~QWv[i"|.)VTL8¢;@wn%'EP/HN7ܾ}0䔍4eu}|C28ׄ4ϦT/l'n^DOkr_3~Z"52{ihl-|"qv _83{ZA #BW$ٶLnoݱVHo34ּH4l2L~-geCކ\ƽhyrAJUQ""R A:=p@,WKANMˣL N[AoL5fA b]Xh\xK")2\'Zٿ#iǾEh!:H* t1b8_jj@ז+ ~oN/DL8?ޏ|EW-OdCO?-XL@1!#IZg#I+!sh!LGkI0Ȯ4І0h `5P˒ΧJ26 =yؙ2q4v²!4 ~@oQ(,FHa,|.?CW oъ,6,^o1ցc qyXEez'LFEwao|bBOgb 18Sՠ>,9h ) _:+ 鏃`CԠ,.JP w:J `q& oֻ;J,)hrwLG͠=*hߺG둕BT Z1f)>.t:V,hۖP1/.F;ؒ~G8EzST6x@UccA5` `3ɇ;ƮF ݭ:gn q $DM5d r,&1@$;U}t>ы`x ~WL}ۦ/@a̜-.Ya>za5m<[i 'ԭآBUxA|@3S=a[25$c`:*ϭ ^qP[0;GPM7$C e £ZN+qPkR-wfB" Z 3ƈ1ѣͽ{0cUk{kYKP$b0[f |X-!+tEBćdhb]FDGn_z u!?2G3dZŻ#rS$ ɛ( 32w -g򚀿c&x+5+\Z8oΨhwgԖ%)s>1O^FqchS`w) 1@ޢ0#@'dKsvVHg_/,Mka#eb⣇S3Y%e}-ppt,GB]yAm ~ c_v+z*:f9<}&+uOo>x72±a7q`Y:Pܰb8_{Ӊbi{q֭u{D|HXn1DQ:znBmm0˩fQjqT -HʰF o#m֑n,- Z|Tkypvwм${Uh0@n /"Yi)=.h5^w;bzA2AZA[<.-1EPLk"oؔ[Ӓa35#WVj8|/D+ң~}_{pޱ-e'Nڒ)VW盁oo>y>SicO@N&{]ٮEwtk7jwT;d*h m'kv%>9&heź}Gv4s}8|Ut6~lD#,j`K2/Wȭ&^8 \Tur> stream x}LSg^a@w dYD 3,Pd3li d"sDp:Ǣ6>7XvQgJ!l Yun.3 ۽wǓϡ\( ޗk:t$!7߲*b8R}FVX%dBZʢ\CBQȀnCIh+چTQP,UFe*Y4:*0 +#оP)0}MĨ63W!%~ai>j} dа rxGE_{&C ,nVW|o*U -~OoqԍهNlF>;z3P=V51|qs_o-ވ7aiVjy\pUiM)֘m}״$D}So}kjw[7/e GvO <8n qbFON.)s-ф#awb JʱC֊1A7n[W(<ʼeR|rr b@R/$"ɤ d3$C*@D C  d@ {?88]ԟK0H [}Dx4TrmJhھL4ɀWi%Jm?emS$Z(9 }?EcBJyR[iHd@OVcn^= &hM S]=VB0=*WJu/'$&*7"-)ʵ_/bdsx첥໒۫O3ɺ咲aaйk6).n1iGpָmު=w`#iȌ/LhI揥7ܵM` ?do6J6}d\}476([qk}+fQFRNIpȎ,._C<->'v*Ixrf&%y "`(|ǧ0UF:jhYB?6n;endstream endobj 279 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6569 >> stream xyy|Sa0( 2P)s) t%Ǵiv4SyH3-C22(pP&7mQs~Ozg=km5|ƭ])>64ٳVD>C|xhx뤩Q84zlÔgҸ%,O Hz=yEUiCׄ_w}D 6Eo"pfz~)j HM6POQM4j3 NmfPۨg 9j;5ZF͢vP˩穝TGuj6zZI͡VQsԋԟ:%j=85Ib?Pc8(j NU0,hu~pS~54"^DY=j˨G>!i7y&<27;聉b>&|W&y"'c3̟:δ@+ 5JYi8B̧֣.,3Li/)*S:Y:F0c#i{[~ ׎;%ٌxtCDBz4VYeaJw]q )'I%^c'RسKle6hqY+,.Q 0V>ЇMelv4ic C~s_bvn(^Z@cj >my (*H:P殅L:PEkT+H}t@1>)hqA^y /8̎V4[n ]4cÂ0۬<m1?~4Z4*ʿX[ W^c!=uaݧa$$O} 8 ԧāq[}k5xm=pu{6hRYnz{»Xh5Z!CԠa. 8D8 q* 1(c[ZT/gД腏0_w}Ͻ 4Kr679w: {!qgw~BRu<U1*nAC@hmul#4sV|%ȶ5j-f[4[fuIR,W I!ہި쳛f=6ڛ&m&qk1^<ŞB4u߰&h#ڌQ*;]pgvlZb<ݎ'1rzY h3YV=9DB9T&N/e-;|< u\lc!eEA@gcX9[c&$KQP~w6t҃luoWw'ءP'͋ p^Ch9gnw*߻ )SJ3Q\r1}\IԆ,U z'l*eD CA \,.zMC]Y֐-wBn1Ts@)TBF {@e_͓,(V7$H^KC_~TD<&#\zdpQ[n z#H,P('-Ԕ KQ7y.I 掃f`(whG>!NHY5),~ .92uRr`ڠ+wU'hWle2KD,\D3RwWɜKa R C2Z9ѽ>F_&  zA9⭑v8DWU\MɈuP kfUIMȰ^$0G',z*u儔9aä ei)D=ێtg 6"<:PЮDs fB`9hU6+PPb(0Tpv@G:GٻEo#QO 3]EA3'єjgɮH'd5;JSa Gh"7 J'"wj?T+Xufפ[t鹗g!U6KFy:MVȩ*JUǩk69"I|\wnm2kBݽ|Sa.cwhKLV&K!~'憆*t!MAEu=ܠ\)M`z˳* }؜´+$ySA!0 ~t$XOI9 Jˁ MoH' (_ }k(K{ Ϡ_=JC;.%)%%ۦD]8تniU{[01a=bYrfǕWͻ-;;WИU#9fv.3I7 :_P?zY>6d/Y)` ATd04nt;__Ţ[~DEN_? +Hz e_~#xO K tX<D/[]yD|S'lu!pO3[Wp= VfytI mIn?•@#4(בpΆ?7\>Su9/C!qpֹ-P+$Bx_sP0`>{`a"r܍'GkѬʲomٍyF(m::-& "уp,l!_K<#3K]kjo-)Ē7Z@O8#K4٭d?r ;C#B Arih*j91Ur" J35p0tpŻh8%~8iÎz$`mU`**hon~Oðs B8L>vtX>Q`Qn. Rj%qe֒؟`K3C]h/C Q8\NWc~)Gq@]&/X'蝲v M6#B1]!uf0,Ao$jDZTN`P2ޚtTw5K-GDk DVVڏ7N?sȧQs4 Pe| ŏREGC2!_qϗm֋T Covhh6 `-{(g75Pf#(֔ "fuzFzycd_PРm'jŋNw9/M{|4l3:AjKwsA *l:4ࠉi5MZ)d2OR#/ά$z4dVzMo7-U_Pr) T7oٹXQL+LaEvp]QT^$! 4z~ߖ"kz.? 7,wBm(ʴ9 XA%wΠI3b6T{RoO'-G֫58S)6h)iR8%ke[e %#qKQ_"2Q-eh׿s6K8BWIZyGlAc>VQ#\ݵ)x4±yY `?&8KfC2!ڧRkyh>޳A? Cq8V,ܝhڅTaH,6{5ٰٛo]hU4=uwo@Fs>+#qYVxI7y2nN V3ix*_ RG)4i"UtvP$(AbV5X veIңvJkۉHW~7%yC"XЈۜZAd }4V+Kt:TY\]]hA<qFkS/nh{x8']qġ|6%y&->Z+8lg=Č𶌛߽e/~1Vc hdQ#$sT,' vj4 1mZFרLJ@p>"Wh5hkji*U>d}=D[qxR `#F{ˀiԬ6iM)7\F]G#zo_]GXڿC,+**bF !i} _aEGP[AApdU8!thh5J]/&R.S.t=ޓx_NPZh[ Z9dnajkU\i9 p&R4-x+xK~~Uoߊ=[%8xRL6]:H K{n6|ogfz A{~ظ@Ol v$ YCb1P9s͉>@7^HT2cmMASA{Wo"ތ7+dM5,6%YMËVӄe&LD +\bq88 >Hu{ghb B31-7ϬXbZStQf#t7>N݊.1~ZD-P"ٽy;ˍˌ<7"ȵ'r.Md+pʜI^̜%KZVZjN9}) z#\cYmFSq4muh>|?]yhwoC+l@+`!g-WXN2 $N ,ʝJbR1qoB!K1OvT %@߭#ïrW #WX ˟ rųĝJ~fPKV9A_Y^i3ZXK.ԮuTVTԺO= t]lZ&yhf*4*o'lusi^L"P&&VlѤî2'j/31/fB 9>jI-Ǩ2$ _.<8$m:d;^^[]^x4Ҽ4"B; $1GRP&;[S=~ y/&ݖ۔db$Fm1BRo?wl3ۍN ^874{^y͍eTWvC x_Q} ]=+AaWsoO{O4o>tAVċO,ͬiv750xf†qLJqz]}u-IC[}!(:Óĕʊrhb2o rzt&Wk-%#xӇ>Z~㌴dn>j!PU@zF 5 ),4 l:FG,S^d0*oɰ4z塍-Zٟ߹ ٜ It: ΦdO/σ6j" \D#>ASn1hZF[8w6S?ϝ}oGoFTC&UVpQ媓@Od:I^?d[>uݏQ'fo@"d:,i0cΡwЮ>ζUT?֙(娰IV#\ J]r#2gVJXF qBgx!+tڝB\z k;;2h4 s>}GAϕ+;"tI@󅝷ТGp٢]Xx>/9t `=N%U]ۃx::rm~ tgk욥5d&{Aݷbp ٛh1l2$44vI SG!2AZ( dYϕe),kj+]G7IɘD~^4ɲ(Mu L/d[5dV~;CznVa KHIo_9b;udps)VQz3D5PH iU5e̘Tg%]ר3Q÷?4e&Ή(ɵ>E endstream endobj 280 0 obj << /Filter /FlateDecode /Length 4179 >> stream x[wܶtj:bӲ7eIl9ml}}q^* .@rU<% `f7,iWtyΎ_Iw#?:~j-*O/GLf/Ww(G֕ruf%7fs3mab6R´.LE,$}?+v>/_seK]8E*#z6Wƈ=k^\7u9<ц J>0^aVNL 8NW*<*]vz&aJӽk뫙CS݄Jm;>ߺ)OO0FX \>YmփL?%VْM1㲂O3JJf+ Lu:Ъ^wmGjڏx YJ;Z/g8aogS8p avQ.S#  QĈosa-+OBGĵ^׷ʰ~(ܰϜ]y]PNT l)iR(lmw?s8-- GހC8[N3(ZE=T䱃J\lrǾ S @&(!mx<O&SZUpQ{avpPW,ujRT3:3'WnE%Ih }`%C _Ing* y3A^oqz8"ox##K}B`z۴ ۄiKK&E,^0+1_ z֠M27载J+ ŭR`" `98eYNcV^|%̬DR`qM/^Kw~' jLU6fj60Φf!6r8ǡ4-EK@]/]*|UX%+J*AQ9sA$HSdu{F_\^N9 dٛ`#3ކ(I-I06mp*F"UR (u8ӕ>lRARpb }* G @ToB_t>V@1%1e-Czz1/6k@U4W.|S'\#v/*)F2jQْoh1 *6d$}IF ;m4-mwV"a0 &Ui>ots#v,i1I0ch&K:"2E/^w$#h/"ea+-q &9^{,'BCivÊIf&ß1쳌ģD=nH* ;:AoA9.fMA`mZr]_4 &n6wnAn&N8K%~ş$X4RpO-y^ *F[WzMfR@2^u(ݾWnӡzɵȍCz6!D΋LԞK ZS-;n$Dga.KS fr(~`9AN5)_NLnwa>v*=)wOqS9[z $a( XgO~!8d#{Cl_|M ɔ)Hm:_w`ѻ'Co"Ķ "A8b/,wiЇhh3% p Hgd c79$ a$hX<~ H&?'}O5FO_iOXVn/-UNg,@Lk;8BkJ>C׬ji*gEc;8eHG=J h;i~Œ$ye89(ʞpWwSO{f?nꮪ1ܞX}4u|d@Tx}͓k8*ÛA8::{[9M__t8co: u r>U Ϣtr$Ŭ1ń9zj(SKDnxORWhW'I9'Ih#TAx|lc%4dc1'a */&hpAT#9Ըh:-f2y̠`mXXQz!w;Axusۦ6\i =*PXl%c!{b:R*rB(}"bXEJ=$x1&SLsdu 9^V6/WQ069^?]h;?榜ls\nU.k[U -:S!T]:/IT;lVQj WY)%5ioSZo}Wr=%uWL J:/JR{&rQґF=;z0Rd:5خmOA= *,|ZH~j.L,80Ei2 ^@@Zb:I}vi6}ǾEwޗYc@um=>Q?ķip<ա9BK/P&y?82G&7CM#vx?IT%5RQk|Ar]j6P:6G}L92P\*702=NyY .ۘCÀ]7 Ldt Wel- whL}{8e}%\V*mSΛ˔! U$yI(XYR*<K[GlYHفSX/)]\MX;L\w!dk kF> stream xZKsxsMqG7-%-QIƪDJFr9$t7Y`lx,h|u j/f`rAw1|s~X(| t!6m>b(QzZZ^{֌#3M#)eUג}\c)ŖӢFNYvux}Gj4Xagvy6a{3vi +p#8 #+g V}`L:*R89cjY; _NU|yU٪ s˗_tYU1Qڥ(NHJʸۆ}"aR9fr7YvjsUUX8"yI C9V +$_2"m)_C2F/ԛvFŜPݠ"˶)hDHTE5Pu>n1o!K Id؋`:p}Nr~u1hڒۅM%!&>ob+p۔X>ah~hUЄW$[Di㷰 i 1 %AưG{?+kSjxӊPF@@!8, M({?2hG:?aTydtAu㗸-J ?jY7lxjUi(YD=?41 7-|]V˯K+ @C5\=-]W]4W z5a}K`!UђTD_`B}Cle0 !٠m+p,@KH5AFDn+_j7ˈ# `. ;~KW }As |ۭF ; .0J?D-fa%ɀ%oK†W !S/Cx79Si'3`QG[<.A8hw[-zҳ!3i+-fK'u{4 #&]"ޅĤ/`q8Qj_zOYuP`] /x('Dm r pZROl;޷yqohkdwN{'aJ$\Cn-@وǃ+5t-6! vGi23 ;8{~6: '4([F5臾!PH+G pG]CjڲX1wn00-դ+C Kh7lk۠\Ҍ~:\r-6xڴK| bԞ0~zreoj[Aȶa``T0Jkgb-fK;M8DJՕb; 8c,vqFRo ^`*< [tX`o$m$}gmfP\v"\W2~G.wOٯ$g=p'zJ6FoC֖pr̄SGXH3UOjhOZ&ʸ ф@B ,Wպ_8nrhC}@ze"*y1mgevH)3aMAY3h yvZYle6_/W_GC9Ilp5v'e(P<3`Isqǩ1M2B9t j, E]Rd ݥ$4s#fjS=1By (٫ 4W5!ye'e:ND?j4mmfM﷜ Fg!;)fg3B쯙kU.*9C{a*+nX,&/&J0R @\@zм4GFJ |>2Sd ?p*k@f8b\T0Sr%,AV*2^h""٢ 0yumsC> v#ϼD09 Uz`ˮۮy~8gޤXAԬ0 N4p؊M̰oFҖ"Pcvv&AC7:{h#{ZeZ_ėɤ(dFlMY|b#@iSBXpHϐ4D=:䖟tp睈}" ;I A3GsLz1U& |3R2 /pRބ ;з'&;c_hOYGc-&WkQ }8@z!xz:P"I}RHǒ>Кq{(M T^unk Cç鉒12dTc=hN3t`Huɋh@I&a&dE/5h#f}dє'nڅ 3Qr-^@9=.ayH\.x>Wfy}k~_z0O/gV|m6cfCSR $k4'>iVpj?Izf}T5e>iA^%-!9(Jm7R8߶i" 6p3|;qTB Ys` !LN-iL3ןC64`(G ]r8S5e 6sq( ́*bb1v6(![Prb`Pڐ 2'OC5)!JSB!Lqw+ …匋.( wI 榿 *j?Cv)+z- 'd^j,seriy6YùR<-jT|~R˒:h, or (9{;7i^Ǟ@ w}v9z8Fe`7ZYhn]bv6E+]w+oB96;r%$Y*i&9 v2nGexN*-)D»lał qI0GMi8Gt=WRJP{=030%tA#8E|Zz }YۏVO %IGR̙ ]_SI> stream xyTSw_y<QyFJSg[;.[ZVAR6lD呛 !@*ZujH;ncB3̱99'~~~~@ ٰ127;)'*+)`g"SeYI_E*A; I_MH)9o"15m󎌨od%D&f1lb 1xxxXO'"Eb#1Q#(g /CQ-9|7`e F<&qԱ"DA xE+M!6`:[O~'#ik :1ec/*Bu *UX&s+ M"HȚ=1 [y/ )iMyY;%P؉&/ˍnp$ķ1RXIȎy!ٹxѪKnYуvQ9e[ԩT}[Vww&mMŅOBs~ŗCq~n1{D$=7 nlBJp~P 0XLjsK\PՖ6>P 4m?q; M(kKn`[l6RԺuJ P"jJ :eQչe-f=.nWWkՙʠt*XI$.f; 8n+ (ο_!6pE܃6ݧݻ!t&mE$}JUL8P׋<4qOA|dkOԲ2vsG +.{P' tBEo|):i> T`Ra5d uz W*NݨOkTkydu?COkYVN \S#]p)<'<-O֑`:R@Ui;ɼf=Wbsׯf1z):xpSб% |nvʒyh.0dK\'p[<.)t>\}`|VR`&r>Nb0R_R|R0K k+jĶsʨ-R5c&(NRyҝӕ5X ]MsڷI8RRmcױ볙eT X+pW' INRS3Hq Oiܒ񡱰m;>G,pGi )rc"SQ[E(f|jP8}IHq ʊ2ϝA~Z~ZZ E~IiRVVMv Vi;o>Ga'B{8 XPeφ ՄCG΀ .Zq8/*+J5ڢhu}ݫBycBnb!7F*3Px5_6 d@WV߻(&zk\,dZrhfLQ !oHO3Ud/%zrν돀=dyYCVNϏ~(rǤfcḟ2xv%;aMH!;`4C CBJ@+5붻 UZ]_"/C譄7yxҕi; 0܍ёI*afFE#=q G1B-ԨJE|mޢfhS#@|xP Ilj.nʆ k{4s=mnGrm٪ .} h9h%ZLPgǽ *tJyB$50sa=K8J{R&UʕOjTg*^ظv1愓T>sF>^U Vwƅ!;w#?>KxT Q vSEcCmtp< W$Cd$'hN* uXX vt`ǁ9U295NǮbl0ԛjC38ʖY-#0Z4$)hz?V\4Af6Z3h-z#28lr!6 :wn9E\䦷oU *G;=-f؝ڝ>a Тk` {'Dcc}"5?*V޷p2쀂> stream xXKs|MI 贖߶ZTYX/NLr3* `("mJ Fя?qIٸĿ|9*ףG̏h6~F+ϮFa sQR2 5-Gȇ[K2/`^ JGb,ڒE1BвM5tL JCp ޯZ'8uiUa.tj;w:']g쟣 TD(jƩOc"&[zÅ}h * -.۠Mj$"U*3/6(M 3INP4\j1L=89#,YA1prȓיW/>ȷE>DN}gujdZg3De~*[% `v TIC1mv'`6UV>$v?l/S]WL|NIKYsт >PO1Uʌ *MLO]nW]$i80airu^(,av+ NB8:h<er5`QgAI++{J7b5)PhC`Ԃ\7x*9jR{`]LEAL(*,q>Ϲs鰒$yr }XayP>'ɲj#AF9M8.4->iҶuיiCX "dSQt5ncV" (h92`W4+{HȽ'>IC|@֓4Q@&`>C8J4VIjM-BO6|RD[Sڂɀ\DAD1X}Nӡr"JThvpUu\`@zXұI]g eJ2rzi˕߸G;N.ĐV}C^?}0]&U:,>@3[ 1L` m‰U2ߔ 5DiU_ ˸1׽`&47U>O![ vJtV! + !;x1ю2w9?*z'ރ &kHDcQf;h:~I.w-!Mb;N~Lϛt9@dڷS YʡRR` 著<~{# CDQ0A@pE"|nt /a":{l,U"JKB e΂AoSgoj0(Nd8UjCd #J0ʁKm B ϋb:y1T3/ӆ5O|Gh7 һeD>nJI3t-̐]tpG/xEcO3[RQ2xݺ/?o2cJ+ux!Y"`{

P?"gy!>p)K*d挵4n&B@wM˺k}9GWT\~a V/Lp_ qu0~pfF}endstream endobj 284 0 obj << /Filter /FlateDecode /Length 339 >> stream x]Mn0F0c R4tE"DȢ4]t>S/y}['8e./|C9LyMͷ~-k~}\=7>/ |_[?_8qyTW\V$bC9k59AcCQc$ԘȁV[r Fr 9oONhhm@A#Ɏ16B EA6Y6ͷZqEMI&W4ߤ(h5+oj5+oЛDqE v*qEFTW/7tyIneӣC37jU)?endstream endobj 285 0 obj << /Filter /FlateDecode /Length1 4528 /Length 2885 >> stream xXiL\>a0f``f`Vٱcb{000K8qZgi'q4VTQĕ&N4I4ĉ] m)뛞{A6?R{s=ipX_Yb3 z#qf%Y-DeZ[5XH̫W㥛=L27 H?wT0a71θͮw)S>bxwh[t1Z!G{y(ˀ1^ a"pU9)_x&bZ GDRZ)0I Fz#[ %Bk@mD R M!<t) r?: 4IՐE+F8K:?(|N !VBzn6#i"*Z!$IODsBި?2~oh[ǂp(MJbZSpgUm*s3y!EfvD\Ꙓؼ$'^@"sPTccӒ/*Fb[~M Isހ }b'%T4X͓Y|Hfi6͈csZZcȼ^к$G1" 01VƟ7{]C;rGi&^csaAƑ?B`^GnqAKp-`kAjZB:'TA- dίY998DL}YN|^u^8$D9Qܯ:oh1Rf%~~O-ȍ(!DjͧYcfC0 )>-a?w( c΄L: 3zq!p0>xD,#2 8"(0I>f0?Q{ѫ0 kϠ)Md#C^æx _wa1KW lHGFVi=ez۾}:~%<Pjmvͪ7Xi,tJj{J3o}o.;K聎؛Y8ٴ j*زmX]z78VS=ܜ\O*t ϝ!l7rV]PYI6n ?;tiTbr T/ҕ{-K-$u`t46xW]JgcsG*z[l$6bL>Z"0%Ez V%?e}1J-e,6eVn<.< wu;oF^{c{o 'QiĀX-rd#G|FtEɛdt CjB ZoM &)V]F:F7Y-*UNެqu;+}Lz4s{SNtEmwjzɄ\9 `0d <%lmQGqsȍwZ<}},x5Oo/ɔ? CCaԻ3R3: ^cQ1ڿHs$LY kXvDhu5*zFCόAaVoc-TSQgLhZ>2}D¥Kast&wsfY~4*wrE99r\9b.bykDu袝#pwwڽ{ٶ'˶ʒ6yk=ۗm;hɵkװqdW#a)5Vg&|kgw$%-OS>P[W:Yw嗷ҝ)ݞ6)sVfr*IeT^U-оm4=+*C+6Mi#9xO<OwIsyvLʫ4g_N^c,K6je#%O{O>;6_$i<Ӈa;&HW2%d[އ\rąQ8fue!@TgؤIc)TK~rCΤV`uU~:~ c|V6~(y2蓊-D>Fr+'u b"?ptrURU `-ɇhC3ָLuW頫IKO~1M A9aZ8eP6V20ɵnkΩ>>Jޟ1i4v54wC]rG41xțk$B3cx%1gFXyuAg325;5@Qb{Fi|?8pM!֞яM8X;d$oz6첷t<"3GOɰkGxldsO>8xv>Bxf(VWѬ٣C>w^{#u &(Yf+шUiʁA|8Kp=dC!v @o7^p s;#|W \d!} &*{V"?n1=~+7yH7"/>䏣\/9yxu\ێkS.D^ 68Y M.3> stream x]Mn0F0cIh6&VU 3D,Eo)]t"}d:_^.Ӹ:Oas\^6N7߻ίp)> stream xZ{lu()Y2IdQeQ,zZlYDHɐڊ5ipڴ1o.Y4]ij"a0$}$iνߥK{.6`2Vl=߹sy\F!C!G}[ŕy*Bxyn9% Jx~Uڼɾ3'DOEbjUHl7cѷ %*-x&< {x,rg7aEXC(mJh e>5!)u (uXu20 Uj±UhpJiհ]B?؀b H*뱓ԇ96scsa5]+q ta үpl@ 0%If2_a1Լsx00L/ux~;]w>j0*aiٜb,h&c>:xiĭJ/.ջ!Kl,3FY*ACO^;[o-y<jX)'c^fd잲]Ef@!4:J?^1JrTĭUb%$Vi"l-4Wd:~ól0~:VŘqv%X2#KwAYDu(-;`7-Z~L)|9н>#$4+FRUbUՂ&c&i6dˎǜBb&:6`1} FS5;(dA~~U¤ZU֘ )MQl2mkgeK dvIkmc?&ɈGLF{A.4TPݲ^SwAXշ]Qk0ȅCXJlޚ YJ/?UB~ՄU hQA.UPWx2u=!JK+ lHH|’w+oګt˺'طA@awh| gNXĵ(^u4Hgogxbmmb!?1Afds~7OaWc {VG!y䮰czł;?s6pEx},]+͵*ypv!o~iqt*U_(k̄UCqk? 1504 ^k9PZ߲A% YmLCv3?<38<f?{ _>00u#JAKI{M x|]x%kJ^ %|ŵcoFQZ_pkY=JP}O5 jsvgg&vff_Aȁ^&aBr]lNHߦ;^D߾LٳJ|[ =|{k2z5Oά=¯^[O] F;jAV;QY,RH.wuN0}D*9[] Vb!vMc9澴|.?V?hCG[!:'m$B?y+S3N)i=X^0sY~>¥8$ZY9}!-:*jC}=']!r_%@U9j67O/VX`4w,!e*四 s{ 1AjAZyz "V`>f 72_ݏut}B6}pfu؊.^Xzt,2oendstream endobj 288 0 obj << /Filter /FlateDecode /Length 222 >> stream x]An ExlHlMxX#,zx.`~s/).,EBY> stream xY_L[νc?I Nm ؘ$4$YBJ!dib mlMK)uIQ)4KjKimVMJP-&;dNv{;߿s:k~h*1[N|.J^3xrqw]7Eb gVG{z _TXt$hD)MENeN(k+4Iio<g͡v&#K4p49ː0ni=i,s^h? y|ȋc{Q!ߎ Gݺ|eJĊ4zJg+WTj_tw^L߆R7xB,[phsWmlfo–XT{1^lXBFF*ەOTeүTv^W}~g5TҼ:ȲtbJ_\W:<:ϳ?]s5%G0Y\yv*zbyÝ8i+BP؝;Py@ hj\NT/~71$N13U yc\aq 31iZAx Hk3@t:\fSODr{3ܬC}M_;>6WI>:1h)J}ϖWN4oVU67m /Ҽ5 ~7-ą) !wqRd2TUq뙥]}}]pX,F`XfLouhd B|,yƮ3.n2zǨokVc;=Ng1y3nȩpV!O] ;Ǽn }c/O#M6$| rĀ$+ersE.~)K綥P /6 ;Ym2oކۅ E&\pXF̸q$yƱkY|oT\".Ťo@endstream endobj 290 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6115 >> stream xYXWמ0͌Ѩ-QQ4VTttK_"FX,j%hbԘh;\?]KyG;ss}{sP(Dbl;}ڔջ\4GabovFhdxp@8h QBkߍ6-^" \dlmyv;WZUnx\q9 g4y˔.O>cfEVRcO(Kj5GP:=j=5r&Q(kj2ZDM6Q)'j >eCMRөe ʖIQlʞC9PP+GL)3ʜ2,O1Tj65L}D RV0ʘ2Xj8BّPT%JB%'MWl`aappFѴRj!)̉o1pAqop;C ) 7j|d%֊->ixnx3fǙ+[`x:}r䷣e=jǨQ'2zk[yW<"V տU!ZXV*H",*Ӽ@qr39 D)1(A%k 7 WF0kP.A^8lFu *հVms] y˜CCyV݈vt,W E7t!Y]Mlݫ;Μ+]㐝yyS ڝU2^ j̓aN-ˮU;ڙ+brU.޾4FW: ӡi;f}[!OM;?cYo뭝5'JrQ j80bébc0A^ oMuZ_un(WI |=]5#e T%1307ܼ5PQNû^.=tQ5"YIr&egcT^.-Ca>?">=ˀ툙6W=ʅ-BFxzD=bPBAZÒb=(%Jܢ؀-^/' L 0 ?γ/R w.bc;ݲh\#b@ 6#&-[)5|;g|E A-SipwC!"C1l_FP?==ki( :?yR+,6%Xs T/Foj(%yf͆؜{/*ALhM,WD ڰ9fz2UWo&a]Lm:u`t;h:*g="\hR}ܖ6$sӑTR%Y& 4O6a [Sv!GnXf? eu@[FPHiΟ hr_`>-$1ڞ<4jE5D`czC#x(/c1 D_RA@tcsYK|2OƆ.zR@ݝ{ )K %؟? _E6ɻ/J#Fs\Di5R3>$7P yc:[-@̕y>,-EV<<8Zj]@ݹUcgoYK.Ӎޤ`p2 IZ Lڨm`))6pH;C(4:2s>C3rI--<3MWM]M&01%ʁ҃!]:%ǔPb6U%%.]#^BUO?wWrd^*Q~sz}NVI::,kClk*=äx'Tgfefb*T! lY Ψ$ ,qWx,ȢLh73F-aWP,wLPr aRiG8cԪ(Tz91 ̈<RUŒ &rl3KQ>jFřWӬ\kY7":T&A.T,&h Un[lVF<^ҎuwCUE4MKS\|qk$$j=$ZyUJ=4RI 'Q, ư(~~ 2u8lu0@'P!5Oܓg!3 k\9*Ej4JF9A`N?0g钻}`^Z؄¦s=l2e =A0H7:L"tg^р >L.g_`%|C;P#ߠ߽KSQJB S6Ursve!(в 5$jД=3BIKmRst %߭4U2xCߥ";1,^Pɤɘ <_ێ)yv+{O8i܏|qkk Ą^~M?2/իsJ7Ui4w% C]-՝2aĝ='mX独8CfG&ی<80;_ c8\F޾|&",O\H;``?|)#M.u1kgHV}: z.vt#D.j+ZX4W@sW案ymů?z5JW;C; K!'z~O&EeG|ث 0R+l,q Qt{x=э~6!WQݙv^p>}ŤRz/Qdlь mX)} "ʶjPP1qAȭPMRwBg4b/+`8 []85Pb:b( ŧkڂBSZ,Pfza澌CyzVΰBqûlʄ})̯2lvqq\9uرl^1buJs|uq.N0B}HO"(-W{P12ϥJPYv ! @BҦc!+D,(5-11< &%g$ 'fyQ2|tGm޾S*OQ'Rn@KѺ-k}/+bbn&LܵUoS+A,{5fhiT>>ew/:q*WGϚT-}Mz'"52(hCe%ʈZ!πqWM-|z>j_Y+Iycz0zFKSZNc NT[TVTtg_7HL^STuݔC\Dl?엳Բl[&t9zM3I 7w&m`5β_ 3b_̲p|M;m{zt@ج.l{"%zS iq^-! ]8F R.( FtMQ8ˋH;NX:a%A><OAxvx/ 1I]rG z-(,3$;%8i[ӭ{؋z R&~d<~њc+U]MzM^uGk@wC<-/8=&ѶaPm^x_zRn\=&[{;Gn?A_2I)`%koFf&#|9j} [5*iOI\D܌Tc38}3 rWɾ]Ũע2 fb^˵W`הm ȕ$@=j/yy"oy@>O Aa#=}p5kϖ,"R)r0܎rih/}}c?L7$fe>it&8XvůHpL%I6fU8ۅXmƛHoR;|mӠDB}Kas˪B#sۧ9QI|jPPV-QaWǔJ|+DwډF'-,h.tJJ w(B܄0Ǽt9u_la 2xm qhPlR `5G?n. AyX zw(GBˤa(43k^bx^ SXs7K_>-Bv0l |: {t$vRu3;q?G|!ctd%O" cJCj%'b 3;X0~ɳO@70HٶlUUUir-/XS_VX=M'xĸPa[)y(BlȑGSII^0Udc*آ29^JkwyaW[Ex |'6~ϳV?l&?s0Śg[;o;vB)gcf.ϮkۦV]Ӌ+4ȁpR" 5.(|b2\ YZdFUҴυ)Ei7iw#7(_d&hYä/f,!}%*xNڽ=99iDqɋobPV"/U &/$h]ǡ̰|<-`:X|_IڿI \<9kHSZ} \ Vm%G%d% 0Kl&9-26> E2!u:W{g{Fɱ` 8/ OFw"L@xR]Q)$kؚg77-﴾8 #(< !`s䛋u,WoݼoN\8r*KsU%MF'&6&@ZBc+;}E i10^VsU'۟G:lD/(y觷6=zVOLc,7* 7&7 J:h7& :&-JFFӬqqoȒȨDB?$D"oV)*lrkÜVç$>f80NZB?0|`q];<`;x;o'!*BLYkE&|YiRQYKc|4dL#Lv!,zp5='vW0h]<ʘe~RA\_tdRSmd*۵+\sdzYfc5DxsegA' P &hceʋjDD)Z,,QURfHL(eѪõ*N|كQLendstream endobj 291 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 156 >> stream xcd`ab`dd M34 JM/I,JtwXew&ӂ' 0cC ##5|93<{-?V~u׭[gܒ+]yi-ùgRoo s5endstream endobj 292 0 obj << /Filter /FlateDecode /Length 3657 >> stream xZsܶS^kuW@m:$N$Ч6塚$8`؏.i s7tw fߟ Lb4Y%4Sʤr,֒]/`\O +%ysV-i$e_8bTK*ˌI %&t8 VưmXY<|]2%:a\-._nRRJ{eV8{R o(8˧߯Yѵ7,vT@[ۢٶ݋ng1ӕF^~{rי`\'dj%ꗯnܮ~5TE{pݏO ~90v[YK`"7SǕr>ؔ]mG|f+fT13Gۦޏ~Qvy<\eHL\|Q('.)mUޜ&B ?oʫn:oٻlzyQVC-_M[4iWot|<:h^M_*)C_? o/c#CUw/P}G#d눻 `{DQ6 y]Vd93UeogƢ%h Y 7}+^Z`a# 2=nlUD tYIeʾ)Ms0٧ 0:'#u48% {JAIMVFqa>$@%6@ ]^#B5n =#~o/Xa!0 mٖ3;ɮr@[Yۅ|ΰi3UlwydN~Hx/E &4 -Ej `%Jf.(['Z: (Sj>% $od §UORh* wI㋪WrEX*E,`.+W+2c<%,AC'Il'0xhxv4،Έmȝ ҙ76  I9"v ™V/Gb?1{W_,QIB9 *t{͵ tʊҰ6Yє†u O[wW8Na_{_^FgBYs072b)56ǏJj>yp~kC̻`_xg/puo!Bv4‡ *d@@21AMS]!Q{Ne\+;mNڀ%*>x%Q`^+"Judۊ1 03?mj45B&UHHnhӉCzqd!j필I!f SN]C[A s}1%&c_ m}eUd @ Αף-D 16ӂ]t@lS[QF- Iߕg #Ϭ\*իTt2ʶZp% 몪meI. e9`"a#mz*z n ^4˜ DQ%?4;8@X61i.cp0MÂۂ4-5L/[U:%ϻz}v`PMI0Xmpc_XfvJ2o,#˝ 4;ڸT2/CPE4!ALt!] N\mtn cqmFn;(2 ͘+,R&署Y=9J/jk;Y>/b6|_šmboi=4`|dM ʱ𻲪[-1zU#L^郢z?<|eF!wsP5;!ۛUҕ\_AMLlcW!8P򣟪r8zendstream endobj 293 0 obj << /Filter /FlateDecode /Length 5570 >> stream x\rHr}/xfC (I3aN#") n6ݺ gfUuC7 6P̓'ˮe_/˻/=]/',z{^a=4ʴV˫EomIjjo\\ּtmamʾox>D7[г^Ct !x=?L7]6WDcSs2i[n˭Pm5._Jd`[fsxoWF*Cӷ]oT 'c,9,K&-r e %M,cR4o6[[z2io$E%gyqsGKn7ݭ C?+4#Nh6]ZJR7_Px㤠E+lǽ/q?ݮ A2x}47,c%C) 7iHTzn˺i5t ')#D-*i1aSpnҩ=:CNϓ+g-NԮD饜c$RiY5kK[h jػBs:rˉ]v^u'B>%o)H*Ω *O0%졳o*p쒳;*]v#E -|aRJ6,Qþª"nemcFKZl^¨/-;lɿ "56 ǣ8)RR÷րsod"Qҝ oG7bTm Ѫ~6YzPјxg)Jd$\pCS^KztpCf9;EE C}g$-g LëG7ҩDFS" P1#jF'nb|;p3$ca- Bgx*Sl2XP9mlkj׵1݄SdЯHx]h%~~Dl*.g~N-/&X k4GR$'F R'TEA,$`c 9j r!$1pxj%u$^?zC0o>|1?z(LS=^[ Uq/"1eY9JYxVZ6TXTa,#LٍտߚUupI;G">p^Iy9#|tmN8YÚn= UU 8`^N tCUEUšץiQ=A|=MIxp 6VvAJd1?znKҡ6G}gJG*Q869| O9r!S)l{]6P]}j*ә0/P_urB{OWpD QWP$-G_A p| Lj.:ƃKaYN&2I]hqg: bMr#(B1!YN]#.%_e8Bxrqr>Wb$z/Wq6k7|kW͉q75NAT1"';FƓe^lq(3ba RjUfWs(q,xN9ޒ~@:R ێZ|W!h88m1}c f"k+Dc|{Tt6tM!{[H}c,oE%^-Mxv0Z8/ 5S&sY ha3 48>zx1ߋߋV/ xOg 1D?Tz.$,1m@K1vqevȽ; )ZX gȯz`+aы%Ps~1T]{@&a| 0s2x\4+{ Fz5?'cjwg򾹉|wW-D:w|`A:+7@C5kuBq NWTAV&UGs45gDZN`{'?Iـ5ާIցo>M#6Y؟lN$4 .1J#fb_Г)KZclTXplNkGHI Tc`҄ғװա0VkW 3={6Aʖ;KC,(!=\ XJh1,v%T nKLd:x`w4׶qjD[Qp1P X[Rmq?Dۿ I~& sYshú'{}+ojj(qn]3֢py>ܟEJ):9OÂK 2 .kU3H-FzWMcb+\W;+^&3wyko"p L꘩4 _`We C``$*IU,>l ~''jXEؗ}# N@ޗ8{j^hJ/BRXќJ^$P]w({l+u8C\#+wި؂U߰ʱMuNrς_yrU :CG u-  Uo2m:E +>ײ|xTn=d4)Rb:w|ьu%,rK̋ד" e,y_Ƣ63_bԭ,aCQ'99V ]nr[vs)k~lq`=RRl9t33L׵\rIǕ1 tGz6S%t'V|{PTm-L2]!״(UvPW"OB~hiq]84wJR`*CEQKLq5.q7pBRfmvgꮒiU`0*qn#nԧccĽ_XI=92CUoՔl{C˚'I,#X.2SS,sXb E].*^Zl!O Ÿ`$rsuA^"N/(?1s'-E mݞL(i{Bpq}qG;"W7)hQb5p Vl (r{Gwz\S. KЀT%?c)i[d#+kx.ƙ&Nnsddoo0&3󌷇ηib VS==1?K*nFڤ83_7ȍrG$8^;&<<.՟خC )dfb⌏QC-Rղ O6͹6Ep8N۷O{m/ 4k U7_ƣ(!)s`2JO wL]@ !5E8RuJBD#\OqqD[.yY4i/"tBzu(uv}W'Ky#uѢz;SL[`|fM_Sz3G6 >q5y[a!"{ᢚLΏ=ezgn!ZC Ci̡5_-m u`eWH < IMTlcuȄ1W2C %O?2BD.{}?WB4_uf;(t8Qvf?džkM `L@m~ ;X6Z W0 W#> stream xX[o~o胠Z3MlnwS[w,Q2הTgsBΐ&) $"̹_SߣSğ''T6woxj7QW4}Ϗ14arGo>G<ᜇ1S"D )0 =ɵxē c. 8 /0ygɖ,/MuY-{=l݃z)C V tedk:]KJϒgZaխ%zyx>|42Q!XG#4$ȏZߠDl-K[MSl>dRpQ01 *<$)QB)|vu9V4Uˍ4,>(1Ρ6Y@QHmq4t=td;r 2 J?yٝJ͚4ia9dc}1ۉy>?YQR> =+jLs<1Z$`o64[uTSLj|ƶ%jwPjC >(NMڥR5ZMddC ڶv ZϽ^)CpQ#YbĠ7 dk4Uh2SMv/ī9~@WPAsI#ԟ0vЭzfIMОn¬\H:MPÁ=d﬷Ue$ cYST) b76t*NbaXڛ]&N+虒(n$j$+ MJ/h۩1C(Nx#?JFA%\Dݬh2d "_No<ǜ˫Y^:K6 `8 /E}7%Ve,dt8=Y #WIT!4m R$:dH480sXE aN~)0hO9. $3RHWLl`CVk)g=׷P^I,:Ư^KcgYtӞ݊";,:  7Ђ qܚi, Z0Znkolm~YMi1yQzm[&qכrѽ'3.q2LSEوսΟ{#plݮ\t,.5*,RU ?3+xe7X:Y vyPz]_1zaUXq(T$vs*$>%GBldLNL6?CǚUՔs gϽi*=6,Z P_"ϵ dƛ,P F~94.z1>RUBk y)go`oC'0Dv5[LD.mi7tdEQɧ;]ȫysϣVs)d/yz׮~ ;9]6 2'VXh5I?DfYNr2A$Cv`ԣ1 @iwe0/汹( c)8lRKkh#@>$ߍ#QPw7ꄙC*avn`|@e;ʦ#JNuRmeoRH}Y6*RcdI>ۉXBI nn#(ȕ*(sl^B86E#KFxn?bn^uq7ڠ3R#˖ļn3Jl7Dq e{s| ]1 #yh {ъ//4HgT$on ks^ektt-a ~dw p>V4޾zoonjgKa$u~vApEbisg (ZlaABbn=^nOËDe1BʶrIŴ6!+<(qE~wŻV_V1[Oe~lzAZ${Å^2-TڣNt8&E~iybڄnS_1J?pjuF?VOE~P֠#3v _8 }֯&> stream x}ˎ-;rݼ]JSa,RBm j֊ =\ #e_O^_uu_w>$}9K[p>W]}0^3>}4Ꮵ;A?_ _y?~ˏ_`Ŝ+: ݾ_Q??(}+L5 x-ّR󿍲iBC9k|D'm-puT7UWW6Yb)-}f:XYB-ĩW{AZ!!-9mUgWϵ9+EYz_XYꌿr4s2 f~,oH-ocIڳ>9k%Ռ_iYF zJXo\!.e:m}C.H )#ºި60gXt*|MP3 *]s^h! i \p,^&̓fz{}}{fm_ŴXU>Fhjd,ُHtpQQ7[uZnffh"ֆE ^&>?\4;@ OK{x$ Ϯ7kֵ~{)ֈgW~׻_k2dmi!58d~z@!Z 9 ,c[>k]jw.B9~'hCςaFXR>H>!z;c|mPkl>9]~I{"j[;E۲MK[b=@}8iRsAZ.Z:sվOmvךm](`IcOpٳB-L@hwm-Ŗp-Y_(Z,z`kVӋ [@Qm>f$K5fu-(ONkDŽrآW=\1^l]Ap(VzAZ!Z 9ض^d[EbkŞSwrZփs}RW;} ΅?7OĽ~hTkrfd}r#v3o^4vz-sa6hTƚRܭWځO. :s8֛}}rZ46-"񥊴O:o(;=Y^;eͣh*Al)Ma_XkoX*{ C9֮|hiUR-&f;Xz`K&EO,$Wumqwy`wGSf<-kGEhRRApans1nඎ?^[Ew;79m:Y!~>FXfY_MeWi!-BBZcvn[pz5 b$vhx4@ qᤡC]&E:Qp_ȁ9p9݌)Xk֜ D<;Yx~ab jo 7o f%Bhxn̊i Eo4eغ^9kﭞ689ޢ PW?zi*s\.^]̵kXpV5/wk &;H[b־7SafA'wֹtIk*@h(8LdkmS'SXtFw,DCiX)A_ mz70PMCZ 8*^wBpTޜi6UZ?L e7N.lw73Zp!o>V?3Iǟ]YoPq;;6ǼR$ݹ*!9mk̚z=%4@ dS@pp}F BQ8;o}rMg:vc3 ؅c{H \d;^~AZ!Z 9d!)!}rvnP7ʖoڏ2-w:"۶[| 43)n,$sk(uwAӇtpQQp ʻ\u2'肓ƽ][$8شN_tci !!aFfw:I#*MkiRy 4AwpSpq5Sz@.: 9 ~]`; Vqٵ6F wWy jZiƉ^bsh!-BBJ:9=)4Zj ۜU}}7w vw,C̓Z6'am?å_x PQAh:L}r>  FAb1Qy8.9\&DwC44p WcHwl|7g5}Jf;nnmlπMKHTT:)v?c$GI@@N ?& ]tbFf4.H;}Bb؆@pmΛ{|>: R%\EG8F@ݰԽO C47'v%2p6A}s"Nµ Rq`kYؾC~bsD [Әo@4.KHG?ke\|1+8‹Eg,;bǠC|8}Iks:t#wqI+tpZQcm)]k]_;G|gh\[uKTzJ:BЗ_8gtүKVĝI<>9~.Oݧ:j6:=$ܒ !/x6~vNʥ#N~AڲnxmZ8 O ]|}lBut(88Au$dDhQ=%c}w76!Ql˰DNw Ơ|nw@Hp1ءm1"ݾMxnƄ 4A]qe 6<8V@cí[ pB^4"#欟ۚ}#10?12U }K6wԣh!-Bv8b3+j ;87^˺Z9U̶p!Q̵VM.mrP8"$\K!C+-\µq(@vrN0x>Cp+<~}ݨd _ v %Bo!;6qW!$\EGx BaĽcJ#53DbXWH$}B9 +#C4[µt8tWq}rpim.pUiRA⒑N!qt{u8=9r<@ SXRp}ٜ$x2$td3m$8zHEs QQ`d2D4~qjEw> y 5T Kk3MF(>H[ "$\K!<ǡ$zڕ[:8r44ꧧu74!al4@ 0@ Tf>H:IZk)8𻕌+ )vf:,;A6SKe 0CޡJb,՗ TB$P-@7c5⎷+H).zn*>Տ%$:ംD2$y7܈v .! `fcn'Dz[p W44jޅDAwj# /'rfhCeI܂vw؜{vh,p6Ir75i^o:>c`k#<}fxm&]9"I4]y3!E 8.ϛs)p. 9]A_r-OS2lgUvdq)X$bp,#nhGт:4 tT޲6fb3u- X$H㶇3rHtF9@Ys .{rQU%T>׍ZNAnB\$vB8 vk-@zugsvBXw4!Z:ct0uy=zsz~϶G3EPCK `v֠vр:D((9{%QKE4͒ |cqU7p~qlOG p_Wa0rNv WəqY)D,fhn`a胴.Z 9 %c:.-ls2m&:2u+mGxCӗ#ZA٢үK N$E'ruRV-w͝2nG`_wЯ~Tbg&$茉EWU颇9CbC&FX1rAit!%Bµvs:t[` :Q69M8tRo%=,AEu .J 1 xWk;U^8qWloT8%҅>ȡ+\V 0 \Ax A96jS.)߬mg΁T<ަ5٢? cd2KP(/Ƅ`__lM}[o9IwX!:N4e.|bR$r sBETY \>H>!Z 9VcgG<8'sE{NY‚)1,V%F}F i#i7>H>Z8R'G+#urN]$[gLWVHe;9gsθx9'p#ua|1 }s,A6ǫuX[dl~Z_xH`NH6!m^SHK+C2W{F mOu/=jin3̗̗Ӄ6|#ddэ.@B^:]Eo )!``͡%.à]aI;67|΀_њ6 w9Bf5`u_a3bB9dZ,]I>Yj^YmW#C@9Sy.Vٜ3!,_) EodJn'/?8z3I_4tY4a l;g0Q o w'_ob@E 9r. .J 9dH >8ڊ}#q$;]N @${x}lFm'\6:%BS}VjfQݛ98o qnw2|V$>M;$vh du_g=\ewWP͟CX>D ۜHt8 &#&_)p+K89tk*̜]|}lBut(TQ- ls,w:`a0nFl3)I^S,c1pWH>>9|g\GRHZv;W1x=>3gUi쎩 ~lؓKrE88HEM={A{g?%.Z 9 leCpnR rQߨ*ghQp څi΁bCZ> {PQ7=%j (8xQބ4Lҝ.`*Tt8g`#G\-!9&ތPW +lvk1+h D dsph} $p ZADseWov{?ꦡ:HAXh\V~Gp}>6s6蕹pͭEHH@xCV" +[G)TJۢv- ^!Pʲ3V upQQDQE-lMm߼hzr*hΣqpGX||Bilϡ?GQ%>99ROcȴ/I){KD{ 8?qp >GġK攷yp2r*usde%11yJ4\!.FfNH ?C[~jVy}|`[UphYuףqR,^c8G~3;-|;\A<Al?;&́*mGZ003 (B0.<1mt_FLVNfo B#(h7KkjRFBmC!GNrrFA$]F )#|H&{ Ww=n-\µs bW ;< y0̓N9Ji BB:c;L<61-ȿR,)YI, Μ_tkmPzUb.d$\C?/ W+2* +_<C\@IƎXk hT1ڟCPX|fcd'+ NNgc F]]:t (xl`mh/Z q7*TO :m8׍Q?qA-KBxC7Ψ<˪U>lUWeĵpGΠ-QqvbpqUF>vbh!Rqȷ N:`OT~47$NIX4)Vt|)a7B8o3pב?F!7K^MOyzF#ʙ9 . EDv ;@aIF_[p1 L93+d9B}F821D3^MW$G'%K?紸VO,'qrKeKIzA~ z֘>6GI}!cw@Up cKv<Ok8^On=/ gVS/{sU-;V?a%tJ}Βve< -ƒ4Ȝӱ QuihE>9 SU{:2*ğ +xö$}2?wvcv/?G9F{8s6Og 2PA;.ILvlgp} -BBZ;9e ot88e)"~% 2$ל Na @@U$%r$ c6t,[m?S#u1YZ~Y9]b"y#Xnl` Zvч iqcʡ'FfvoC:CWYd7[blI7ٽ 1wtH;$!l"td Eu\GxBӥ FEDH{}=l9!{ ~gt Xл c ZQpΟN>9$ .[AÛ+h`9O[zplyUCF>DW%\EGx_YϘ68L5laau-ھF-1d tvs3o#5kBN1N):':EOO\#_nޥR! !K>&[8g}~}l-BBZckΆ8a#[=1UζMiKf<]Xv@,Cn`%XKo#8À@PCKBx#E񻫎gә D@W!p\JB=lcNr7ޅJ+I(ނlRT92[8\MÝ Mb#8]pnsowl.u!Z.up Сc,ӿTV?B*薠a8Y<rppH{*]Ao?{pX'gt,>q3eK5RUeF(!lڽ7/F5oA>4B[K"LĕnݦswvhXwrtH[[blA֬y@p78nbLqyLh!Rq]L\[_>97o.O&nV]&OeD ;obh!-Bµt8 ͮ|?wU)ã؁`9"$\o!(CNS/$:BYu7粹d#t\[>HÝBZ+) 5Aysp;pR >$bd*sJ@yMp {omk!RqgMp7 N4Ic}8vA% ]ɬkύ`c胴|z)Z;clŷz t6DD2_pCbAgzUm`}%3]~}l%B•c n)dW ;)xq*H&e-&>ߐP@)ts`<Ǵ@K"cfbMxN94DhkGAL8'>A݃cq=݊$~jEfe4ۛ^)=LGmzap=vp';F{<ۡBHEoCnd]=onl&@*D6pEbҶĘ!Y+Vȭptp.!}(Ϋ_ f64yae Ip \jbF `yw@~"W@[A%l| NŢXQ[EXv}[G7#g.SdA-EHH@xk0%(Pt4I;b ;hqk-2t:(.-\"sr]d[}mNF !H: ]:з Ks/V%\GGxBLD NQ.-.q RZfW;Z;8[9'KP#zJ L>rVl-Bµt8t]+osy*Ѱ³)4n`xK6.48cosEHH@xCbVg+M]3nUd)U+ezHYu!`46R"$\I!9;$j%N=N No"=8suQ(,=mŸi NV bD=Hrs$նvsm CHGxB0| O3,UWV9r/d "I}^: _uBit!%B•tsfsrpBڔŤ>nY%andK1##tcЬJf) ΍Rd=k2 oi9ܤoV{|+Ϯ7/L%O,Q//QMFYCJ@QM&8# E P\E^,ʾJ/ [V3%֣H yJ~} 8EZ65V@%X(JDM(4z[qə^e%VrBJ=LTEL#-z f rnZSu1Kxz[8%q#|# Ơ %*n -BBZcSӥ<1 *7tE[er 0p+gs6%5i  %? &ʨ1  /rT 6% r?hbvz# K{{UM VJ /Y*99*:d?e0oHe 8}y(d tG_Gΐ * uX%\_:ZIi3Z{ ڶ9+KHS ۈHaH@ X^~A;ei1'1lX+ßl7CfYjv*-˷@p}sZ;:v􏿅jT_->9EYC :#k!VkK"5Eg[XҸ !!9H@NӔuNg~5~J Ɓr;a[>o-Bµt8tY)i M?L;yp힇)JTes#0r*6>H*.[ IBxCadJ.TsYҵ7eMF:%ӗSQ9f#T8j>H iqp֯7v9F:AEv] \{#fh5?7G@J-(xs瞖.qpmgW)3@DDWzHJ+A6ƍ`e .@ʩ :]Eo,{R3pΤgM 3 rK Y'$,tgsh ̌iYKBxCLy0iob>şqT!7g|qLN52lW8.HmQJ+!qHKNIR ?^P9jP@ nFXk up{msS%?¼8K̯|AaH0De̕4gMj nrŘ詫K;KW5nMI 7$莽_86@AkwQuJ(sZ ~\3f;1E,e߄%Xh#8tg98#iZkqXR TѰ=#sV5. [6L_7WM ئw+i̞m `}Jӓ~1H/DG>yyRf2,$1zv#!:-9]B*st[h9V5 *Hf00yhx49򎰞 xB~:kiYssL]lpQ@Ze ~\[z(3ɭR/YlC6Lye3ӝt^/e!!͡g\ ؓG_[ -U~1c>8~V 6-\H;bDwAÛ;36ǜv{D $\gH>B l0?FKK!VtT~НOJFp90^b݇בQ%BK!<ǡNtkb%NfγR/\=K‚Sp2ybP19iBHHEGxB+7d&.9yHEמH"6&H0h$ *d*Ų 건M'n$b9{n ?7@=i0p7>iKpA&3cp4x={- w%z^YI!#\%<ixKp-fI1ߊ>8gߋ4&5,ѯ<`B6ӗ:g~a"xA-$BK!Ŷ''c{VTs*QucƖ.=.Bezm%\KGxIz`:#E^ lHڂTёNDU%QpltpVA[g?i$em>Sg-1{P}iU#g1 Nc.H w^z2n7bCGiۊ+>$,<DiZ}~}[v8tL햴-[[M)ZF2Ń :yX,FH}~}l-Bv80anM͍Z-bz'6#oHNLz&Qdp@4 sT,gUEl(;N.$&inˈ[dGO3p[qhA+L~9tAc(M#`,OI|yJQj@w᲻,/[ p%'?F+ XP:D9Dk|JD+ݾB" ta@XsGq3!-Bµsg׭&19^.H%~tHhNcklx:R^wc`f2pZeg,A[\vn>?B[o"6Yl'vf!8$A_^9y>ӆ}~}l-BBZ:sZڎYs:cێAVm$qJ0Fp3lm}x$BK!0}ա$BK!(Jjf>Qujndd),EԣeC p>#v .ג,QRrHׄsMç+pηHmN&]+R9,ORRSC-9mkQ Ζ9s[=ޟlįjÃ̧%\QSjFUT~PQHwvi=0_p,V|v N'e`B\璐3BjCC|.#)3k脐3B!w &.52<<* ݿ6~<k.oC~{?޾\Vn%|+O ayK߾B2kkE@/L/cͰi嶝==}_䘋PՂ{&ъhBjrdVcD $˅D-lW߿.Fv4|q uQ#my5jIy>,F9&3W.pVp܈XXL߿3Vc 7jy^rb;8z7KsrBmg_`*܎d嫣./ҬWCeh] = 5fKX~_5(X[jr*ny17gEՏVDjta#oާHa9"Y1ȶ= !<OĞ>-;%piE$0Trg&dR߿4d,HmM lU5Z58pXnN cэP~/5B x̷5qv7m{ef_Z}4= M2MG0;{mMYC5rzl1qVarqҴ_jLN2֙jGy$ϝ= їZQ0&+{0P\ b1qGt;M?ܕütmGV$'zSNʉwq:Y3F=&7/@9*b'oKTA$<[~@-ɚ[J~n[cۨyѪ7l]>eykvɖkhTÜ~%z6T\rBdjT +ظkbRygpԛ $䀙nAD|3S$$sZ¤g'>bn6ťS8ѳ'wW1 XM-rEcYvAQ)==8S~?Mn:[oekE0%SŹ7j)n>% Dv×Iiixʰ]<ÝFRg+pLĎtkb$Fƭ'7}'ҙ ۾<|ok{7 c!&86_Ka3Zl6A*wDeKJ׉Z7bowkԤ5%q)Cm3VLfi1Ǻxy*5@pL{ 6"83I0iK2'Fzݞ'kp[`z>^3)nԙ1\ *YX.PwڽĥnFp[!;̢̳) G0W,F)c#'O$b<;/o>+2Ksc+yʰտ0Al-Jk379Jg{4⓮d/[(%uc>Jw%4|a\=2FeH .+`c)Wwن)jͨh2 hrOs`0/-Q)wfޛȟ}i'JcV|IX穁 1. j |Ӷtx4`z]zݭ]/6>ކRy7=q"?E ,K'7ܞÃ?0IA Pd(^9>[ c&[7L3I'>^U6>q,d +w qi??>:igLP8{_/qb ozuxA-&ck8Zy4+8 mzv=p͋0v[ 3EP1Θ><ɀ^t$~ho˖:3M~aϋaW>xoK623Ggw]\/GVn˛o6mx>e9p}ݶZffOڀu[/݇?@Hyzz%vjRoY`PXNwoC-,^~aY@0ZflvomJG7rC5n/QKEߝm5?˨XAA|J2^[يa¬jsd ^yd}gn"{v6vNhzuuyM#vxmϹJM臅0j3)X40bc:ZӃƠ6`%!pZB-)9&ɣbL{E:2+ưƭVG^sCsq:ŶG+ ZK_%~{>f#oYh _dZ':Rt sG(|0Rp kcU;~KeAOt\}Ů+:?0ZZw3AַJhon} 54:숿iE2$RVxc_|5*w閸gmcypoչR =t[ζҙ.1:ax;3}K:A~glNf]vc>9nGIJP7xޮL&8YFI|l }CߓY3:/;lѹk.ǡ86ٖ7 nlɵ}:+LGAJKq{fGP@W#rӷK_>;~İf3O]m~a~rs v [Bzl,RQ)ԡN娾wCÇF\4#gH\5`E1:vZ)ył@f[^nT&DInP; X,l {:xpjeYXjx&y~e<]ÑKvQ쌠g;@~;ROOh.RWN'l" ǥt9'%J7r\GVpnB"I-UD!𦃟E1AT^ș]7t|-bۙ>ܸteHqv%Lt_՝*\[@o*g0rWW.oisY]kdA 6ah -A%v A BٝVe]d}cǽf&MʨA/"N8؏FYb(-L;*g0M-KŹ25G7e%{Q.(eNĝ] t[eKEz`2C:Br4I&h" Jv@v@,uG?Dc0toeoOt!<HKj*rJ1V$RVK4[xatE; !, gIH,hWT-@D^ Gz! ==i:c_k)aIrh2| iKV-_2Q0=ЇJ,T [EՎRU.Ih,t!LB; f!te,v$ )@>9Il9Z K+BZ,y2PdgۚBB"3Ţ+W;eqSʅ$;I PiY0霤jh8e0b<Gy84][ͦu4AY`kEe90U&Q+} ,ӹBe#Yd|h$XXjEg D{rf_9a,;],| ٦~Bo 2\ɲ&hO8FOV[`*E8_'ef]1< eֿ-ӣv8&=[6gL1N^h<&zM6fYUr3?2 %?M)0#rǠ=#m]&Z&hHHt.x.bʎPF?T" \o5ipz}Wfi}Sl*C"1tӨ}lpp "f4_ҪBnŦ*S|f{3d=&ªgl+%"ԨFN.!ibٙN% Jp<=x.LWmzQ@l:TeJ&as\?=y5峗PuRm!{lZ0ϑk6MTT"[0m0JDJ>}ӦvBE61Zcv*qЀOS%U&[ LU~d ul~ p+7iQ~Ǽ9YKsSd8&\[ i!C:~mSro:K L34gmL e4 AGkk;v9\Ϙ]v!}x竼Ad,ޞ-';o3ŒqQt\#agh.40 b 0}D@K}%֦7 MUf{4lj3.? 5D/}ח Nlz G̓D`t~}3mTEL; hL$耙 |<U!kb40V 9~~7%p,Ok ġ{O:H= cv*-*tZq1.ƠM]"àO-QL0ֲWl חwbUS4`PآT | pQ+몓}q6[j`וld^)*Bwg}Ɂ,;n(Ru6>KN3>$Û "&VR/T=:kd؈Fo6A>۵]RLJ6R@CG%PeYl^FÔTd8qաzvS/2X-)Sd:[H>M 4hx粏E&Hϥ⚞Ӭt"(t!7АS^`X5UJ h9+SNfKCKOJMq Tcp$u:k".g&=Jh3^:rW9^( N-4p$ݿ)`j[ "M$̑WE#jY.ERIVr p n pp(e%%<Y+ %lP F+'odMOz:u=jzET v erVگM>¸0TѶU~Glj86ӓƉb_jK CW՝^Mֹ Z2u-%FQס eGo$>V978G3 :ۜzYg:O3C+kBA(}VWnKG^Օ0+>I7KF,J8+a!e o7oUI}<'Ԅ-䘚;T(B$(+;7gCH긗t*(\AOzP%9C /rP<%2@:=H | Yxxqfoi=ӀNϑFAg`0$U$ y"_}jP3YqAÐZe05m2NS,6d28/iȖXcBɢhLЩHIOw+O*eC7~V)$mwl"ؔ8UӞd^lώAgٔޅ;KxrB^l=/ P> Fh=[BI68E/.^k¤:1*RᡃB "bz)XIiM23>|%0a+4 vC;*E:YtievLu!XRAg79WZ "`{4u+jWT8O"ӣA㇋9ԭ0]$4 arCS`l{\eWCڵ鎴Un95اmd nĦwj k7_ojbҸ}kC;mC72a$B~Xu("9"RK٥OE?< !/g` :Ă}\;R(B&(Yg&vחGWwJ`̱%F1&N@Ȥi5:oJ)_@!Xḵ<GD!u28q7#bۄf0{G~Xg _Ջ Yۮ=1rM^0=3C`Q{{ӹB>tyʚyzӐ1C@ lPU皲 fOG Xys mD~c%4!Qצ:ss8b@Q}*~\gFCgnLtE[iH*xT\03H_,"tDHs%$eP$wd99YkI60 fRulƌqGl( c4}*WK%7Cv,B$<(xo=m|H_:[N?u An,ykuYrs qc;q %E)!/;QKaT+B o؏mż@n͵6u=[Id*aɷy]'}7ԑd f9A⊸ R: 1Sy0wqd".a).uo@fw uc4Ӭc"\QR~ơMئw>y ߝ)PД I4JM;EVJBQ m)12'G$75-MEd:أ 0mFqmERXU3rSuRƘ<gmh.Wj+;L5ݺ%J1&%ER;~X>- Ɉ-2a@_'w #Y a mvfܻCD2*Jy U&O9X sAWyhc+¼{Lw9O}ǭ@1[l0U5uۂck|6tC>qgKe`]6$݌"},8d>Kle!#Lui&6SY WIDhC.nGGx`XL+YKY7Bu~1Am[".u%n3'e07}+MLS()E[c^ChKv\3H{R_WUKD5)m|W.%`@nFԂiI+&oA9kt8dzAیc+dE O"փddh;g Ì5p<;[SB5˓E[@v>ivj("Gi=HDg~G>ϤqKt.<)4ͶР| %;6Kr@i(|x;>8(b; hHڱ{z S,IYsTV g58HXbicIDI%7hؚ!@d X_O9|0pcTM^?!,HS4p_ l%\=/ a\h@"qfOvwdeCJs(fWvv@ܘ;(kO7dMGi@uD0;J:X5L wb<.#'w0;>2pb&fVI y{Vݦ~"j;}6c 6eW%0˲qaf"1έgomL9O?mI  Ĭ\%楑 7 kzE̎8~ǔoF.&]ҀlYC|X1p@r*1|lfj Gh^ы0:DDzFDSp F7ʽShI'H6qўɰNn$:3K, (A擢}ISam d8lfi>b0hfoqjcA=qNpзdl?^"1fLa9tcU4?fbN~rHU";@N:D4}nEFnf@뀁~CA{c0H8R7(֘'l š!w% jH2b$v @ em9Qu\(P|D{ }[-"wl<4Qe[#7?k8z圏#w=OiadlB3uV E,s\7w Ac1)S昡t1Yoy:>fA| Hy2u`h[M(n 8L171VI(oM6WH,XChpJlDQp"@ p11+~}gF0 15Iaʉ*b;{z'ZFȕd 3<  /ύ'ڬF߲b}AvO%Wn>}M.ߎZl &STX1B_ <7 !W?"هС$i޳%_S50@ND M'6yx0yLC;x %$`_y6Adga%O[S,Ca?x ˈ¥4q1cYSrV8|Q@ly| -$ckMDK%^Ch<^:aLdsb@yz&妳VDo,/q"mt.`?sWoBmz=nY@D&`&; UVj%6h\>蕎ͭp[p&~/p@U&,.m/vt=xy+vʲ)zoϰ8uo?R2Zv#2 {\YGG~PAkHk5oEd| 4Zd|oa"1yHky| LrG]Z[s;klRJ;L4[/ d+"C^z )ʯE"Y lv$֑9dmB+J:፿?}X2$WICr+^%@YFkPlKU(;7BDvE0)BC# ,"HPY ηZheI/)1c/sÒة(WS&Nh%Vɚаuv7䄩toL"^!puO5ZgkKT:"NCĂf̡;X9u[" ; EAW렃ez,8@>@' -:g6VLȖ3 x8VҺzX1d[?ţ\2fn1>Aĩӟ'q0aCl;'ˆf7Mq%Ch+Q v>Z4q#iaK.I9G[M5` Bke|ZI a߆|*>]-C Zp5 v>w1XgH:W@%(PZ6Gۛ]^:`a:Aο[N"nx|[_Ej*_OUsL[8dny1& mdZO E9ΥbѺ@tSf`0M@f>/S:y;!pZ[!EsCWEr!o+M玥蟹&"  pkp9!8T?]Y1,?`^Loܯ{'`؜%ց 8ؑ۸V{)m3Ԅt}a(K n!ƕH`-sPR1dKq`r[ 61磗~B~i KdcSTDQЌ]zRu(a>9(.K:>|I,Vx{agO%U8P n4viF'Q{o1#g>(>+#v$njQt6ug%%A=ʻ'Qv N*W-t08^&_'\MEC4C5)H1%af'> )#|C6pplZ6y0A /d՛$Q#z2ԆӔvƽ<"Y' hNuh6H4_}.16PE7KdFX"_Q13&ڇm ;6;7mEm4B6AIΉ3(vxŘ߁|+R"zXp#xG E;]ـtnH hLKH\OL@=w#;侾JʘhcO 4q#"4X: JVϩI^̒QZ9s9NޢPeY:P\robVlA-fb)Qg;|`!sOJ؄nf`<$^黎Ps8hAO$kew0E99W$88!ä1&ij8%2. a \񋝌A1`#iL#`nbzY)̜ؠ#9)wW'&PmFSC5܈#\hys6Q[e٢ G=G 4n|dK!Ur;25ihZjMˀܢibs!s(K)\'1vܣf>`F*E rfoG"H+54<}NՎ[54кje֚Ks"aYVAy×bn굕B"URSB%I벏u} ];lmb`5UH*Su-{сl;Mm"K n?s41bIջ VŎ5;'&vD41AICu134<\ i e"O' sB'9sYm4- Cク灂ɃQ /|F GSo}D첨k̒=Daqr&PP庁=ikgHzkYgMQ!&듆5y[i;ຜ~tuW% _l |$/@ zy%ͩAsKiSꉵ鵍f]6(ɊUANnQ7<==JA :hu6!$j6ulиPD{>tRWD!3эgᚠbӂdc^A[=o jzJ ױ02N818D+ "GEt4ܬTػeԢ&6RFj[p4B WG<6XZUZ<BKo&\ó&@uMic-7v O81B B 4E(*l[YԠq8 L=)5t:n#O6DT/( 4zRLl2q#Ζ%B21!4Dq~ao:#C}p] eLkʋi08 ZzoچeѺ %9V[]m4IDjܣX[j2OdS;,:֋a8ΰֱĞbd5PE@ghz#*Tfx!Os cxׯ|3a:Qpr>":}۫YS|501T5 t~0H|gs-ʎEL8S̥ 1Ck2RtFғFڲ&0l \?&4I_&EYDGyr/̫\z&.~|eѦHا*.j1^B6dxŘO 6z(5/*(M 0\C5<5r "?uX,&? )8$a>(K$B L'^bJIN¦%\D; $A RT'QJwHD2 :Rm(E E1f>Z teߚE jXV(f!` \ s2Pgm&5x9"о5Q5S =K,Z}pa޼3aFNWIBE!0tՀv{9377pF)?͟|RU ?WPrC3[5R !"QhQFQʰS^H^D͹G7 x*&km) FC 3dT<[ߒ-*8p+S Tl(7Vh$4 IUQ</ѩ:YYQS"J%9CZX%rK^%I UI%v+,W޴ zqm7ߊ.pX[>l>mV+Iř dKCkRRI  ,ے#Z-3iI'K:0)2Y%K$ G3PNJS MҵW7D sg-cIr#r2i1-6dⳊЁkܩdo僶M$REM_o&_ !mѢ.1G{"=xnyܯ;"b^`J4mW,b k@p*1Iha$~Hmǡt.Fe4P| ۈ롘tT1me?_ %mn+ZVJ 8$߃=+PVJq}]e#+5[b㰽B% `d᤭ݝm&-e%/Ag?iH8x2BK@^x֚QsҲ FPuϴS=`wg%b:"{B$WII$&W*/8#1 I(u=Vr(w ﵕsJ"щjB0sjVe8"%vO|`RmeGLxV  ` DxO6wPmwuuȩDc~Dw[e^v+ֳ V:2̛7V"v2 A;5b!og&8ve̮CUgPQJt(Hhwy]>.qw0K{:DCWA\<#~KIs:M: [X&HB>_I0hy¡ҡM}?no%;ҕNyaD݌΋l%DX7ڟ UR]SOnR)/BN/Ė%ix*"0#a ڷ sP1 >s|{A5}Lb2cFTcR( RwZ{\ nbϮ^M=K(auƙGX:\+cwdPk4a^U DkC9%#4:C@+9ip7GcƋZ l3*)4vg4q/4p&_ L fRl#*9+YEtz{=vM$yP$5@Ky#فR$;ا5M2f{ Uz8}|`輣{>M<_xI _:ft/vlQ\(.E^N-ުѳΖ!%%~K'JV\:n7%K8d, 7KGRb[*n;("kPP@{Q {##omZʁ2$cvt ΕVN[&:ws|VZdgC:j#oolysQGϹ̲ӡ.=Q*b힆y4,;έ1l%QN^ϙV"]Y'%)_y]$}W"$V~qzѢ V`-Rq;HAtJzSsV)/Q'pA4eCYul!6n)b`)؞®"%l=l!9KӱAAy"밈H/7r?M:+cc%*j5yw$hLr߲$`<%Oxfw-j ./uBjM%R|1#^e!mBSG>~F'{ͳۇVo }R(UѢ[ ܷHK9Y+Vo~@e.%FhM{:LM(!e4}^,)0G٪ݨk6jM bӭDlu#CPئ)UUh̎ߺuW 3|vRP&f{ȃzf$mt{N _%]߫n;Ft]\#ȡapqޏS LiZ,L{{H9Ft1C.N?L&@${iڴ#3KAIֿq;]}W{=sܪXq"tC2vG%\^ Y<;n@KJ`iA Ҡ{\/A:Q~;<^Nzm, &F ;)R%:H:B1~VIS}KS4FA#9nw`FLHbwRDCZqJE:>;ס4E'yO)&:j>hʴu].ؗ^RU;@*0H:w@e4JjK7'_5J9W,$/yS+vE0?%ÒYv8ervgϭfZz-gr "Wq3&!xXVV3Q:a}i垘) cHHZ akȸ|}*6\mc[Gg%:"͛Z;y'AٝcS3.2.ψ" 6Hus\uZQ;LDށHb!.MB#S1AQ)X}Kq1 2d'Z VnSG>x}C Y)R;<rTwJ%٥ \ Tyw亝 X |HC 2MüԬi{?XАH_yZ!e~?ӵnn*P:\ƜbdɊSgX*}zu!.H(҉:AR3ϗ*4.\;tr=hcdXwٴ2"Ȳ2ב[%"JGe2XruD@<$'3xt1A"i!^IC܁Vahq4bJ'$3~8>g@^L$R9Vr#˧Ƚ2a.C0]9bA 0t&tv63ܑ,T Q;  ?S BB[)E(7[Al 䝤 &&ަH0Nv?3BIڔr^G֠`#3qDXMD7L;P:c@h1HN ?AֹCUI®&.|tjVlbtk!F%:_g&!&[zHÞ\a-J}V&Fmf KC@"эo *ĩ#`]sl|%'KyxXzɝ" iv! AGω*Jz"I[bQTcd:mna*`x5-Fatio+]D7g @2]O&oDUag %ãKI6˞إ어9vՅ\2{A0(ӈha44|۪0G te%d0%a,+S';ԝ|Xb i9y. r`}2Vus2XV >ՑXs+tړ:Ty8&V(Ti28$m45t6)@hNdp.睲$0Q6qZSGol/!# O-eDcgXSKxd;{2%V,9 2bs( XXS8)Pd2?CME&g_%8K 5A 5qD>ozy@Y/Hny7uq7 `hH]$F&]ajSVŶ x&ŽlBH5X< KOjt @SC9R}36hd BX9(ȗ} ),!)B#GmӑrO"MJĞޠ8z<[#v4f ǒItBØF!4FK7s~7^$/A.O6L$ǂ{.4x|{[OE&_ˤ dL`Ssk+}$D*LXՆN4Zi0 j Yj-plPm&d%v:Yߞ0krзYIؖX.Ԉu$S6ډDZP&Q*h)k6;clFC8AD!Kb߭ZO^ `w^jեl# 9yA+\m<4(ah:eCbh%WNKݩb84z5MC1(F/ i#QEquKTFeGTO?buJ4njܪ0eiNydβ`-U޳G'Њq깺hBمhE4C-xG٢m!A E XyopueJ|0ЋTՏxE%>@.x˄x"/{~}D*lhm IxWp:=)@Sp7u4%kKiQ;D:bKJǝ:?$.7)`ѓ`_=R]uMi3DA=yۻy8 ∄Wi rIu0;6؍Q<%Bx7bQBf~ez^ٜb40eo}eo; 0P긒TZQ5q4\cP*bJ t[3]A bڀcdAVĪE_K.A 4'xQJ'L8-,.ʞtdRlrrj 4 TB笌0Eml%+g7 `epqH9Eo2@tdPŔ%2)ن'Ght8KPpUauLoꋄ2i 7N@dNUN Rr8s0W/n4NUdXv(3Jg6A$<%80To+M܉ 3yw8{ط_kA(/`B`9:W#HyE>"opveM0>,\+Nr{<0jnGO z&DZ2?$sdҷAHl(;:g?B l4M;ler/sܩd`R|tFg*B펱₃!>\+r@U)G+:S듰#YF!/*p]J{Z@F|)ߠD=Nᡗ!P$=Z>2blRH h!-|&g-iUUY)VfjbISx*!="?-E-$D0k։Uw~6#%10W;$ c !,,1@}(\mX8(8G78X{dpA2CE~D@€4+W].Of~oU+cʸ:cSx6Fl3>i:`(y2l'' &}_d DMeq}+T$>aʞW+-5f8ц&lym)Pՙf[8jY6jVNAFh}nTm,Bhmtn]™ᦩV%%̼4r2Uԥt~OPA{ԩGBr;tH1As4S+P%t:D"}Hh=,V@<8GCIփuL)oѪ-T[:n7՗r>ZfdL>4yQ4ᬦ#-$Z1 `t$;^2 Yaedx +!=M%0٪53C}Ňt&H C}|$JW Rb[ aUz_s۪9}9%wk^&Qot x+^æ`CSF@,]"Φ %.ۡSvḸpED`jK#dىAif&VS;\CXh*rD9:!,8q?P\ ͮ4ty0R>^q} @r5+B9Ή^NVUY%aծ|Pw]6C^%C9f\ԍg'ҁXx&zI'%HL.iL Bz# /:lɽb `7dcYN.#]e!Jm3!˜{8nd5ٌFnE#!td;ub: ƜۍSp3 š"&g}lW150mU7ZЭ̷b)qF)BsxF\gi%@v#QI6,D@X\^f":b_v{?; 3lOcc s'|t+\aJid'Wg05 a*+q5#& # 5|Xh9YǼ1ẗ}j sU^ x ]kFڷb2l΢Uh:H5p4a B~6=%XGp,Q'|qY[Aj?ʢ9>=E.b9XĻ3N+DF 7ICō7YQV rB%Y0ci@Ǝ7% VU#bjM#| M$`d0CFҺ PK/!XJj,#R<܀ci"W`Q*k*^!29Ez)m4(j$Zb'#8hߛH]AZ"<4<Pa@.CnFMdg$Y;>`r(QTbےp"kx1EO&~G?Dl_+J;.YfW2AZ$J8DWp ll-_U:Vr8[qB=rǀaO9M/ =:0J7kE3dl)  MeGRUr MkbC3'N5z ᅚM'[*8DSRkҚW-JyB p%OHx/Y'R~sj)K6"ԥ)]W ϵw`|(Wp2~ن[tqU8|QJkEVs%,(&${]Z: S0Υa6<6d~U}[w%*Hs&R.*QzRd+LtilU:Jޑ}ViʭƼ/i>*{ V*B)y^#M1D? kS̺-g%Y&u.el 鱐 7mfBX̏%2tA)Hj ]ri"d IM_t;6G u2e(aS`:׀T]ʣo>㻯%գo<#F5b=Ͼ:xO%fB'&N 3[t cg-jwoqMp ZWYUXd&Oڰ ^L| Vo~^(&w??}xvowG~[wn>>? k_EzNMwۯox +>7/ 0][=]JۇwoP߾So^=]/`z~}/ ˗'x^~%uqK~eс0]ݷqG}f6kq]OgJXr{|E`s\۟hXoϋϞk>?f7yMC|>|f:/IW-C<{z}t~fYcOV5KҥA LjiAwΩ=@ nܚŒd˷?0q?,b=X[Zv=7nuk?.mZHJl(MmZ~O&[w?]2}o.~OZiWxi~\u>4f+o?>?mvSmjҮަﴸfǿ|v^ׂ~wzS}L~~1G^%Uq]z<׊om~֥\% {:7غ3VOi&{`mGy%HWOR_!qMn_뿾҇/3 u/}vȡk^b%~Z>l{?|5v y`˕x;Xk?z?{iPA%C_kcilt>V+(x4zG V}z^eZ臮e)V8~O?&v/`kӾݗ1z_n٦/5=x] _fگ:~|NѢqRkVK?ǩ=>Y>$w̩;e ?6w$۸*-A4.آ9 $f4{Jσ-$ΌK$:٣ oϟ'nX>~o~x|1y$ƐW go.{x8||S\ْ~{FH\{nt~9sy{9fhy 8Ò̎Rh{&^R\C'X>7Oğ/*XMw<`Fh׵\7;iQ??^st5>WAO9C?aU ^ S;I6_<7bX!n T~CZE)RͩCn֋}ཤ$#%0{eu߾I_mxq8uC;ӀwѮvp[?!^gz.yKU&tcJըl@eُxӨ~o>#_}?|bс g$O__KOl=.޵g#_~ōVAqBzvKϗZb?߾ǫ͗jGTPu+c>ihbOt/ܾ2M}vH\BQp yI:OO׊'&.  {@U/OkzѣgE_B;}&W^,ݿ;m;ε"=¾ϧv}{᚛`]3OÄ8OQ ;pvBQy}FǵjMU0jc!"rO3.ԴOŴ)b7'z1[2|A`$Ik RJŏ_4Q@A%|=>6+%?;VԦc !W׹讥'#~@U}m9c 9豝'D׾_M̡̭=t̃׻,TT?C_˒y8.c?݄O|hz6UNVp!4qɹ(^GgeX' v()Mۻh@rDg xڵ#x5ލ%Gj܇̃zI;>ǿK/F.i^MG׵Y:FUL| 'X>mc˧l9[h)?o.cGʟ83R $}dx%}foK~u[ޞu_6wֿ p5=y\T@_p*4*>k/xo?y/s_?~u7ܷ?Өǀ6@tZ_ѓfuj^)nI.;?_m:E̙CŇ|ݏ??sk zendstream endobj 296 0 obj << /Filter /FlateDecode /Length 2313 >> stream xYKoH7Aŭe?$_හ&2!|9l'i'Bj&"& /{%6JE- MEUoŧ%Υk;Ki `0!ϗ K.:](HD[R}=_Ep(Iɪ̚F>Q)"d[R;<"`?;nOiǪ _VE[҆*j_le}j4R)'"17q)w}\v^7̗â?is~#YN-ȗWv>ddUmۺ*{^ˢi\hwLI wC` NSn6A9}4*R98z4߮nvY>վQWmA/ruo'?y<{#e1/;eTCpK?Ͻ/|he^7KoyѾ8y@^mO{:3H\ȵuYmC4#2[-m^y?Şv:*Cyu{?} EbXsáj[rd\ƪ.(a0VE.>9Tk' &ο=jUM(7K=EL Nޙc[#ي# CccGT{1RO@K`UCUTBm(M l%¯aQ(/mM_x$ ҄B*%Gy6Z\E RMtqw/VA|u=a0 02cr aMdĬAusGg0~4h:<>E]T i48P6JpTLGŻw%Kl/N9&gQ^mEjLAj.x]udP|-\ {/}k(ffT nM8 zq S=Yc"s4%kD/ CͮGrV~xsupaLNyE83hZ(4qWegۓhӅgΈkoWG!N4n&gVW0[S^J~״ 7*[QKVbrf q϶Hd%d5 ڼ7hX<b0>{Aa=1WLqxKS(|Lp0#&&xts4/8Wg*+aP.Wl4Un"ӊ4RؖFbkx."pc4V2l5A=i!ȷv5gTkKiatů0, H\O!^Qwi`=sV[jQ\ߞV*cܑǸu)fn1r`s? /- Y]DY+CAD S͏ۣLi`+Z\;Hj}XQ 5swJ'6eܻ`gEc>v)֟}߯ZuKRO}=ȥdv4V3ǮC?>mIJc8hm `ZQJ8JHѐ@<,sat +~3WFmz=EE 3WzzQ=?iRTKY‚#t?Y|w!wQSQbj綤buKEn~{-A h#!~ 8 Rg.;~q~mrLu+z> x|Ts?tl{y-&`nendstream endobj 297 0 obj << /Filter /FlateDecode /Length 53448 >> stream x}ˎ-;rݼ]JSa,RBm j֊ =\ #e_O^_uu_w>$}9K[p>W]}0^3>}4Ꮵ;A?_ _y?~ˏ_`Ŝ+: ݾ_Q??(}+L5 x-ّR󿍲iBC9k|D'm-puT7UWW6Yb)-}f:XYB-ĩW{AZ!!-9mUgWϵ9+EYz_XYꌿr4s2 f~,oH-ocIڳ>9k%Ռ_iYF zJXo\!.e:m}C.H )#ºި60gXt*|MP3 *]s^h! i \p,^&̓fz{}}{fm_ŴXU>Fhjd,ُHtpQQ7[uZnffh"ֆE ^&>?\4;@ OK{x$ Ϯ7kֵ~{)ֈgW~׻_k2dmi!58d~z@!Z 9 ,c[>k]jw.B9~'hCςaFXR>H>!z;c|mPkl>9]~I{"j[;E۲MK[b=@}8iRsAZ.Z:sվOmvךm](`IcOpٳB-L@hwm-Ŗp-Y_(Z,z`kVӋ [@Qm>f$K5fu-(ONkDŽrآW=\1^l]Ap(VzAZ!Z 9ض^d[EbkŞSwrZփs}RW;} ΅?7OĽ~hTkrfd}r#v3o^4vz-sa6hTƚRܭWځO. :s8֛}}rZ46-"񥊴O:o(;=Y^;eͣh*Al)Ma_XkoX*{ C9֮|hiUR-&f;Xz`K&EO,$Wumqwy`wGSf<-kGEhRRApans1nඎ?^[Ew;79m:Y!~>FXfY_MeWi!-BBZcvn[pz5 b$vhx4@ qᤡC]&E:Qp_ȁ9p9݌)Xk֜ D<;Yx~ab jo 7o f%Bhxn̊i Eo4eغ^9kﭞ689ޢ PW?zi*s\.^]̵kXpV5/wk &;H[b־7SafA'wֹtIk*@h(8LdkmS'SXtFw,DCiX)A_ mz70PMCZ 8*^wBpTޜi6UZ?L e7N.lw73Zp!o>V?3Iǟ]YoPq;;6ǼR$ݹ*!9mk̚z=%4@ dS@pp}F BQ8;o}rMg:vc3 ؅c{H \d;^~AZ!Z 9d!)!}rvnP7ʖoڏ2-w:"۶[| 43)n,$sk(uwAӇtpQQp ʻ\u2'肓ƽ][$8شN_tci !!aFfw:I#*MkiRy 4AwpSpq5Sz@.: 9 ~]`; Vqٵ6F wWy jZiƉ^bsh!-BBJ:9=)4Zj ۜU}}7w vw,C̓Z6'am?å_x PQAh:L}r>  FAb1Qy8.9\&DwC44p WcHwl|7g5}Jf;nnmlπMKHTT:)v?c$GI@@N ?& ]tbFf4.H;}Bb؆@pmΛ{|>: R%\EG8F@ݰԽO C47'v%2p6A}s"Nµ Rq`kYؾC~bsD [Әo@4.KHG?ke\|1+8‹Eg,;bǠC|8}Iks:t#wqI+tpZQcm)]k]_;G|gh\[uKTzJ:BЗ_8gtүKVĝI<>9~.Oݧ:j6:=$ܒ !/x6~vNʥ#N~AڲnxmZ8 O ]|}lBut(88Au$dDhQ=%c}w76!Ql˰DNw Ơ|nw@Hp1ءm1"ݾMxnƄ 4A]qe 6<8V@cí[ pB^4"#欟ۚ}#10?12U }K6wԣh!-Bv8b3+j ;87^˺Z9U̶p!Q̵VM.mrP8"$\K!C+-\µq(@vrN0x>Cp+<~}ݨd _ v %Bo!;6qW!$\EGx BaĽcJ#53DbXWH$}B9 +#C4[µt8tWq}rpim.pUiRA⒑N!qt{u8=9r<@ SXRp}ٜ$x2$td3m$8zHEs QQ`d2D4~qjEw> y 5T Kk3MF(>H[ "$\K!<ǡ$zڕ[:8r44ꧧu74!al4@ 0@ Tf>H:IZk)8𻕌+ )vf:,;A6SKe 0CޡJb,՗ TB$P-@7c5⎷+H).zn*>Տ%$:ംD2$y7܈v .! `fcn'Dz[p W44jޅDAwj# /'rfhCeI܂vw؜{vh,p6Ir75i^o:>c`k#<}fxm&]9"I4]y3!E 8.ϛs)p. 9]A_r-OS2lgUvdq)X$bp,#nhGт:4 tT޲6fb3u- X$H㶇3rHtF9@Ys .{rQU%T>׍ZNAnB\$vB8 vk-@zugsvBXw4!Z:ct0uy=zsz~϶G3EPCK `v֠vр:D((9{%QKE4͒ |cqU7p~qlOG p_Wa0rNv WəqY)D,fhn`a胴.Z 9 %c:.-ls2m&:2u+mGxCӗ#ZA٢үK N$E'ruRV-w͝2nG`_wЯ~Tbg&$茉EWU颇9CbC&FX1rAit!%Bµvs:t[` :Q69M8tRo%=,AEu .J 1 xWk;U^8qWloT8%҅>ȡ+\V 0 \Ax A96jS.)߬mg΁T<ަ5٢? cd2KP(/Ƅ`__lM}[o9IwX!:N4e.|bR$r sBETY \>H>!Z 9VcgG<8'sE{NY‚)1,V%F}F i#i7>H>Z8R'G+#urN]$[gLWVHe;9gsθx9'p#ua|1 }s,A6ǫuX[dl~Z_xH`NH6!m^SHK+C2W{F mOu/=jin3̗̗Ӄ6|#ddэ.@B^:]Eo )!``͡%.à]aI;67|΀_њ6 w9Bf5`u_a3bB9dZ,]I>Yj^YmW#C@9Sy.Vٜ3!,_) EodJn'/?8z3I_4tY4a l;g0Q o w'_ob@E 9r. .J 9dH >8ڊ}#q$;]N @${x}lFm'\6:%BS}VjfQݛ98o qnw2|V$>M;$vh du_g=\ewWP͟CX>D ۜHt8 &#&_)p+K89tk*̜]|}lBut(TQ- ls,w:`a0nFl3)I^S,c1pWH>>9|g\GRHZv;W1x=>3gUi쎩 ~lؓKrE88HEM={A{g?%.Z 9 leCpnR rQߨ*ghQp څi΁bCZ> {PQ7=%j (8xQބ4Lҝ.`*Tt8g`#G\-!9&ތPW +lvk1+h D dsph} $p ZADseWov{?ꦡ:HAXh\V~Gp}>6s6蕹pͭEHH@xCV" +[G)TJۢv- ^!Pʲ3V upQQDQE-lMm߼hzr*hΣqpGX||Bilϡ?GQ%>99ROcȴ/I){KD{ 8?qp >GġK攷yp2r*usde%11yJ4\!.FfNH ?C[~jVy}|`[UphYuףqR,^c8G~3;-|;\A<Al?;&́*mGZ003 (B0.<1mt_FLVNfo B#(h7KkjRFBmC!GNrrFA$]F )#|H&{ Ww=n-\µs bW ;< y0̓N9Ji BB:c;L<61-ȿR,)YI, Μ_tkmPzUb.d$\C?/ W+2* +_<C\@IƎXk hT1ڟCPX|fcd'+ NNgc F]]:t (xl`mh/Z q7*TO :m8׍Q?qA-KBxC7Ψ<˪U>lUWeĵpGΠ-QqvbpqUF>vbh!Rqȷ N:`OT~47$NIX4)Vt|)a7B8o3pב?F!7K^MOyzF#ʙ9 . EDv ;@aIF_[p1 L93+d9B}F821D3^MW$G'%K?紸VO,'qrKeKIzA~ z֘>6GI}!cw@Up cKv<Ok8^On=/ gVS/{sU-;V?a%tJ}Βve< -ƒ4Ȝӱ QuihE>9 SU{:2*ğ +xö$}2?wvcv/?G9F{8s6Og 2PA;.ILvlgp} -BBZ;9e ot88e)"~% 2$ל Na @@U$%r$ c6t,[m?S#u1YZ~Y9]b"y#Xnl` Zvч iqcʡ'FfvoC:CWYd7[blI7ٽ 1wtH;$!l"td Eu\GxBӥ FEDH{}=l9!{ ~gt Xл c ZQpΟN>9$ .[AÛ+h`9O[zplyUCF>DW%\EGx_YϘ68L5laau-ھF-1d tvs3o#5kBN1N):':EOO\#_nޥR! !K>&[8g}~}l-BBZckΆ8a#[=1UζMiKf<]Xv@,Cn`%XKo#8À@PCKBx#E񻫎gә D@W!p\JB=lcNr7ޅJ+I(ނlRT92[8\MÝ Mb#8]pnsowl.u!Z.up Сc,ӿTV?B*薠a8Y<rppH{*]Ao?{pX'gt,>q3eK5RUeF(!lڽ7/F5oA>4B[K"LĕnݦswvhXwrtH[[blA֬y@p78nbLqyLh!Rq]L\[_>97o.O&nV]&OeD ;obh!-Bµt8 ͮ|?wU)ã؁`9"$\o!(CNS/$:BYu7粹d#t\[>HÝBZ+) 5Aysp;pR >$bd*sJ@yMp {omk!RqgMp7 N4Ic}8vA% ]ɬkύ`c胴|z)Z;clŷz t6DD2_pCbAgzUm`}%3]~}l%B•c n)dW ;)xq*H&e-&>ߐP@)ts`<Ǵ@K"cfbMxN94DhkGAL8'>A݃cq=݊$~jEfe4ۛ^)=LGmzap=vp';F{<ۡBHEoCnd]=onl&@*D6pEbҶĘ!Y+Vȭptp.!}(Ϋ_ f64yae Ip \jbF `yw@~"W@[A%l| NŢXQ[EXv}[G7#g.SdA-EHH@xk0%(Pt4I;b ;hqk-2t:(.-\"sr]d[}mNF !H: ]:з Ks/V%\GGxBLD NQ.-.q RZfW;Z;8[9'KP#zJ L>rVl-Bµt8t]+osy*Ѱ³)4n`xK6.48cosEHH@xCbVg+M]3nUd)U+ezHYu!`46R"$\I!9;$j%N=N No"=8suQ(,=mŸi NV bD=Hrs$նvsm CHGxB0| O3,UWV9r/d "I}^: _uBit!%B•tsfsrpBڔŤ>nY%andK1##tcЬJf) ΍Rd=k2 oi9ܤoV{|+Ϯ7/L%O,Q//QMFYCJ@QM&8# E P\E^,ʾJ/ [V3%֣H yJ~} 8EZ65V@%X(JDM(4z[qə^e%VrBJ=LTEL#-z f rnZSu1Kxz[8%q#|# Ơ %*n -BBZcSӥ<1 *7tE[er 0p+gs6%5i  %? &ʨ1  /rT 6% r?hbvz# K{{UM VJ /Y*99*:d?e0oHe 8}y(d tG_Gΐ * uX%\_:ZIi3Z{ ڶ9+KHS ۈHaH@ X^~A;ei1'1lX+ßl7CfYjv*-˷@p}sZ;:v􏿅jT_->9EYC :#k!VkK"5Eg[XҸ !!9H@NӔuNg~5~J Ɓr;a[>o-Bµt8tY)i M?L;yp힇)JTes#0r*6>H*.[ IBxCadJ.TsYҵ7eMF:%ӗSQ9f#T8j>H iqp֯7v9F:AEv] \{#fh5?7G@J-(xs瞖.qpmgW)3@DDWzHJ+A6ƍ`e .@ʩ :]Eo,{R3pΤgM 3 rK Y'$,tgsh ̌iYKBxCLy0iob>şqT!7g|qLN52lW8.HmQJ+!qHKNIR ?^P9jP@ nFXk up{msS%?¼8K̯|AaH0De̕4gMj nrŘ詫K;KW5nMI 7$莽_86@AkwQuJ(sZ ~\3f;1E,e߄%Xh#8tg98#iZkqXR TѰ=#sV5. [6L_7WM ئw+i̞m `}Jӓ~1H/DG>yyRf2,$1zv#!:-9]B*st[h9V5 *Hf00yhx49򎰞 xB~:kiYssL]lpQ@Ze ~\[z(3ɭR/YlC6Lye3ӝt^/e!!͡g\ ؓG_[ -U~1c>8~V 6-\H;bDwAÛ;36ǜv{D $\gH>B l0?FKK!VtT~НOJFp90^b݇בQ%BK!<ǡNtkb%NfγR/\=K‚Sp2ybP19iBHHEGxB+7d&.9yHEמH"6&H0h$ *d*Ų 건M'n$b9{n ?7@=i0p7>iKpA&3cp4x={- w%z^YI!#\%<ixKp-fI1ߊ>8gߋ4&5,ѯ<`B6ӗ:g~a"xA-$BK!Ŷ''c{VTs*QucƖ.=.Bezm%\KGxIz`:#E^ lHڂTёNDU%QpltpVA[g?i$em>Sg-1{P}iU#g1 Nc.H w^z2n7bCGiۊ+>$,<DiZ}~}[v8tL햴-[[M)ZF2Ń :yX,FH}~}l-Bv80anM͍Z-bz'6#oHNLz&Qdp@4 sT,gUEl(;N.$&inˈ[dGO3p[qhA+L~9tAc(M#`,OI|yJQj@w᲻,/[ p%'?F+ XP:D9Dk|JD+ݾB" ta@XsGq3!-Bµsg׭&19^.H%~tHhNcklx:R^wc`f2pZeg,A[\vn>?B[o"6Yl'vf!8$A_^9y>ӆ}~}l-BBZ:sZڎYs:cێAVm$qJ0Fp3lm}x$BK!0}ա$BK!(Jjf>Qujndd),EԣeC p>#v .ג,QRrHׄsMç+pηHmN&]+R9,ORRSC-9mkQ Ζ9s[=ޟlįjÃ̧%\QSjFUT~PQHwvi=0_p,V|v N'e`B\璐3BjCC|.#)3k脐3B!w &.52<<* ݿ6~<k.oC~{?޾\Vn%|+O ayK߾B2kkE@/L/cͰi嶝==}_䘋PՂ{&ъhBjrdVcD $˅D-lW߿.Fv4|q uQ#my5jIy>,F9&3W.pVp܈XXL߿3Vc 7jy^rb;8z7KsrBmg_`*܎d嫣./ҬWCeh] = 5fKX~_5(X[jr*ny17gEՏVDjta#oާHa9"Y1ȶ= !<OĞ>-;%piE$0Trg&dR߿4d,HmM lU5Z58pXnN cэP~/5B x̷5qv7m{ef_Z}4= M2MG0;{mMYC5rzl1qVarqҴ_jLN2֙jGy$ϝ= їZQ0&+{0P\ b1qGt;M?ܕütmGV$'zSNʉwq:Y3F=&7/@9*b'oKTA$<[~@-ɚ[J~n[cۨyѪ7l]>eykvɖkhTÜ~%z6T\rBdjT +ظkbRygpԛ $䀙nAD|3S$$sZ¤g'>bn6ťS8ѳ'wW1 XM-rEcYvAQ)==8S~?Mn:[oekE0%SŹ7j)n>% Dv×Iiixʰ]<ÝFRg+pLĎtkb$Fƭ'7}'ҙ ۾<|ok{7 c!&86_Ka3Zl6A*wDeKJ׉Z7bowkԤ5%q)Cm3VLfi1Ǻxy*5@pL{ 6"83I0iK2'Fzݞ'kp[`z>^3)nԙ1\ *YX.PwڽĥnFp[!;̢̳) G0W,F)c#'O$b<;/o>+2Ksc+yʰտ0Al-Jk379Jg{4⓮d/[(%uc>Jw%4|a\=2FeH .+`c)Wwن)jͨh2 hrOs`0/-Q)wfޛȟ}i'JcV|IX穁 1. j |Ӷtx4`z]zݭ]/6>ކRy7=q"?E ,K'7ܞÃ?0IA Pd(^9>[ c&[7L3I'>^U6>q,d +w qi??>:igLP8{_/qb ozuxA-&ck8Zy4+8 mzv=p͋0v[ 3EP1Θ><ɀ^t$~ho˖:3M~aϋaW>xoK623Ggw]\/GVn˛o6mx>e9p}ݶZffOڀu[/݇?@Hyzz%vjRoY`PXNwoC-,^~aY@0ZflvomJG7rC5n/QKEߝm5?˨XAA|J2^[يa¬jsd ^yd}gn"{v6vNhzuuyM#vxmϹJM臅0j3)X40bc:ZӃƠ6`%!pZB-)9&ɣbL{E:2+ưƭVG^sCsq:ŶG+ ZK_%~{>f#oYh _dZ':Rt sG(|0Rp kcU;~KeAOt\}Ů+:?0ZZw3AַJhon} 54:숿iE2$RVxc_|5*w閸gmcypoչR =t[ζҙ.1:ax;3}K:A~glNf]vc>9nGIJP7xޮL&8YFI|l }CߓY3:/;lѹk.ǡ86ٖ7 nlɵ}:+LGAJKq{fGP@W#rӷK_>;~İf3O]m~a~rs v [Bzl,RQ)ԡN娾wCÇF\4#gH\5`E1:vZ)ył@f[^nT&DInP; X,l {:xpjeYXjx&y~e<]ÑKvQ쌠g;@~;ROOh.RWN'l" ǥt9'%J7r\GVpnB"I-UD!𦃟E1AT^ș]7t|-bۙ>ܸteHqv%Lt_՝*\[@o*g0rWW.oksIr]oCAO_a <6 A{`0(5)*6RKduHdAJ*Kgѯko ==i:5#YDX?\Rl!i=so 爮QRy`*8ʂ 3Wѣd>45aACkI. i,b !rfEjj 8Bjv-jۂ_ Ka&X' ܗklXV-ɡ?W(hlO k_jQz`m }X`dB;UP]dnn-7Mp和OhXx;26;Jd dJKw [*BZ=-3d =I=9DfEWڮFwp IvG!@ġӎ%`9՚;@HQ&waysyߏlsZe,50 ׊>21U, Y+,9eX`|x$x N2>@q*rP#4Xvv ϳa8+2 fr m(*0*6`rS&+vܠ5VjdnVz?ٕneb4s71;eA'nWIqW#2- XO]Siq$17)8ؼwnc`I'cM2  WOm~rJ뒕܃W~ [w*e*yL)ҧ+@4Rs2@Y#|z.GԤguƝݛ% D;Ci@GZa$r(a$_NR:p QbmwD dIibóm#( 2HUVٌ;2aUJUGA^L$_lLRuE2O\lr@JؔGPs+lŅ1ӪO~%)0yD?0Eh•X 2 QA>*ke]dM9(x(uYet?7EŽ.|wgM&!2l|f|$H$#Û&VR/T=:k}d`{ n !%V)*|LO8Պ,6OaI*m^@5Ui%^ j 1ԆF)oB*>}"WI.55(RUqI9:kde3]-X/K%Q|^TyIr%\tRE\ D5Kn5.JCu,Q<6.i #uբʙD+F%kɷ%@c|e`^Sx 's۷+-+ChҤst!s@hIe|#kodyT>|ܔqRç4j2JmRKRyukQ˖w)唒w嶆:iavW(#[txoStgU4pprAAs$yΖ&k|bf578G0`:CۚzYgk O3Fiڦ-j-e9;vSz")HF^1$X qotP\OzHK-9C /j`S=%2 :=t7 k/ [ZOSj09y[0J%IbUlI+HW_- ,l0d֑rYp4b%"~Zx O,DkgZ}OELf[>,񳮑CLA*ɶx&Mc^ )_!KcA@ ",r9plͲZby ?UJ!L+Ŏ5h SðuveZ[+nzzSLp`ɋ)DGO6Ra(%حX  $+(lώ튤[lq"nN$ f|zlD/8E/NYk¤:1*6Rѡ !bfs(IGhM63i[jpf&5YLiܩvM7d b5cJݔ\i! ͡鎮;e]W"|H;`Y߆.<0A[4]h0F%2{t0S=Ȳ!LG:4zاmd iĦ>4ߙ s'r_o1b`8ci\̎*⾵ ˎٝ!`e0"V6?0Q]Jq%3,vT ҧY !/{x lERVn?_qdEthYg&vחG+; %0X#h C 0Z:xMC 0Y%6TFLB5`B!udnGi qۄ0{G}8Y"d j{6v\{<4a{)Pg$.0n7O3iqeCL;M{w5Ll'\\!m M)a%1s0%;yC_`Y;gS s.fJ,J$H?'MԽݚ+d%CHߦq5b8ݵ 'wOT,9=HulTH:R)JB\׬$U01(Cy~<r3уBZ9TQD Cd`M3p (hU-8f԰!g71<ij4UKԕ"bǙ_ʹn[BNE%N&j C6b˖L z!Bx97yHW@YeT[!*[el,9s oܻdE"olͻtgs:ZTb!M$@!կٸ -UVumrؓvjvjEɁYȱЅ|>On 4@MgG֛(`bhC)nGR[x`L#UKY7Bu~1AmGnPt%n+'e06}K3M,S$)x E;[c]#hKu; ({REƬ% "``I6>`Y0p 7BiI+&oA9I)'m L< p|3,lO vkV&o=ΪE[@v:iNjQh+˅EY{ؑ։f>ϔqKr.Ame#b԰kxȤ^[e4p(ڔ IݑLU~@( ·t a |d1aсp3K;N[UșoӋӡdw.IϭcrLlL,1Z`0;3쑵l c—I[yjg0!*ȶD.I}%t t9#gj[%;yZ=: '9٥'ܢ8udB`H'=3lV\^_7w*UGZV<²CXO!#ڀOC`Q,بHpr*8|68)ˡ= /fx#Ҝ"8蹷ttms#,RFUVS7*WE_/R@Jl[|¥0)iz> ZJCj"MPciE*{@d#j{jn#.JL!p3><)4ͱА| -;KJ@YiQhmSv>MkRcʵX#q@/SBV"UY-e98imKl8mLhIF[36Pc-4_EI=tȇ nfSrh Ya!2M2Ӵ}7us FsNl@"qFOqwTeJs#cMpx{lL4m%=WcuX-K+ʃ xG?E$ '3.Y8Dňe85:Q(E>GKq$9O cvJ+'1Ab[l*"6'"2 &s|jaعQX:aVs>* ]ӧ,n5`-̠_-<([͆E%\3 7Q# /Ð818[Lj$N[6g6VYc/hamLa1CjI+H P1On ;Ț?9ǎs,*]Ӎv M5Dc޷Q|00oݹ)hP}nC3Eɏs@ Ŋ~䘊kyhK@,rQ<@ IayT̀Į]EDPVnaf`QE_HN(Hз$-B?Os摉*"Yu^'/|+{y0BE(I*K&:36;&* &aWsL%O7/AgWޟdά~Y?Gi}#i~m5|4][M8n8ByR\Ԙ](oMW(,X)48|eX(U8@AP._%3F̠VV9GaoA$~!iW<[5Qp^A,TdFE/&{ҩkh3[[к/(Š ͧOUe k -y~jb15lM\gb#,K[BTjCMVz϶j|M;9Q24e"l K! *y6~}&٘͒]ɇs<-ML89~4Wx`d^jx̣XTU-/4˳dim,0dsKh414^y( R N8BZ3hf.Qp ۰.u{}5{ægNsl߾8;w$|y M n;0bUl Stˎ֡nPppz'hQ6 ]]' X%}X談 #yL.6~VN!o'K2lryIDu4l lwK9yr -,kMD5cnxI5w0yr̈́^&a,Tsb@yz&妫V|#sW/B-z=\nsY@D&P: UV%k6baBo*GPpZks&z/H@U!l.wm;2< eSQgDXe-wYdF<#)_X=A2ZSQ-'_(DV-Yn49%[ǪIhV|LYᣩGYb&ḿއDAaycCE/̦X ~:_k<5:xA.Uuv쥹]Q~ҎtG`̐n()EʹkҡŮH?i)h {}U?J 谰RX:AS2JIzC&Ҋ59Hw$U]8{yA}02mJ܏J`ZJ0I4vEu* On3 $DdOsÿ-zˇg 夭#biݟ%Qh8h%PP^4j1`8Rm Y,z*Ai~,@>@'AH-; lVgJ2Qȑ+<QZWbu4QlQAl_ϩ%,4g$䃲 sռECKL.SS<-cj1Jhh'5y)A0,T49M|hAG1ۧRhhKnI9Gկ.k*rGaQ> @)U}]mC Zh5 vP3$m+ ~8pZFXۛ ]Y:`Q<!["N!nd|_Gj*'_OUs [Z<I#!S/Cu*v4!T,#Yn gYn',N"Wp+8\h~$Yy|h4QN4r[kϜQ\r$\ x;t?SY1L?o&0#7="Iݔ{*n=6WA} v6Yc۬E<544m_+L!PFEC3vI9IG+o琸hdur8hX4Ж dϞZtch҈~ Qko03]?yGc2ltM0MmI@AE)úS64M1Hぐ{jQ}a5;T(b8Nc(C'<4A /AyxQhމ7fz2FӒvƽ<" )uKݙ͆ etHHj-sH>6>b+(pݱ!]yh$S%n!U*o6JY³POPDŽqgvӰs%J 钺Z+'Lʓ;,C##E9NmFPvI0@F{$QKaAtc}uteVkec/\g єmaduvסcQxv*vju*f0u*u':KĪj` [ ;r,wW!ӭ2>Ѣ&>!fa]U `?&"2BfJ^ e_xrMhRt &#{Z~ yqX-SZ/nNmHfAݒAukPCNPGr!89rG:[8$zHѡ{r56 $4fm_u 2hǵ0 kg189ECég4K9ert0ap-oQ(=N_X0GjV7O}4m\2{4af(vdXŘ߁zDFfARr!vQ H{K`鈵X)[nSy=H]oQmj__-nzQʘ1ǞH qc"4u jSOt:2E-oy˕˹w KFC U-[ m1JL%joG6cߣnܓ 6=9+6xG]G8Y9\b4'N@ާ;wwuY% IHh$MwNKCSF| 64&P&oφ(f$5^)N x #CpFۛz*=Ai>B (w&UjBlь qZܢibss(K %\'1v\>f: 2#J} qfo8]G6#5I+=2}vՉ% "@y_Fe75o@up]%PyծDsj&^h27^%i^RO]?keG8A@udzI z0ip.(ȆҖKQYZp gi踩FO^m*v`AX0u4cdx&rc1E4D N<]}l&9wsXU)[؊o@Ӣ!r~=4Lndg7:^% R{J_.ebj3Kq0A=4hM.r <庁=if8{Z:ASz;eXyiO|؄U?".Ᏺm"( -=ā^~TZt AAꃬkzF]1h⪠&~Q7܎=<*Pr2|YO뢕S6SOM:T[rdZa(e" _o:QLr#Hś&zojLc 1dpNԠA6c365KQC0l!6H zny3]6O1,(nWwH~nkӒxMpT#=dEH1/qd5~p%@ghz#3<#A.w#!,8Cx9 n)BZws;Co{*|WRAU2d\8'HēaiS'H6[ȎI#^W%҈eXTQQI)opd PZa S"Lz#b͊},#j A^UYN|k6uH-5g[`TX/ATh4ϩ09ς*Mk^$j(Ѿ5rP5K# =[B,Y}hf޼2QFM_VFQK(d@Vëø<5TCATU|XA3J9䓪fh_A} ljH% nY5%bѢA7-FYVW N9 0٥Az- 4mОbߠ7@*&kmF6*oMWZLw ÕJ,2 Rm`1Po1ZI9%4 EU0Ѣ:X/ѩkjXK-5CZD%jK^-IUIT%V+hݳ@ z/ڨQoo\HP-5|FwNPo ڦW+Ȗ^IA'M|(Ten[kYLS灵<MUP*9X"k@Ul+~LH-knZƐ7 uS>*F8eK#8-6TⳊIB @ֈscT*7![Hfs)F4Jl^3&oNc~m!1uGe~%QTzim8zmoTYSi-*ĸ&#EAG/<<h1P5*;٠@KxtFŢe+jhQ-ok4X)RR(U eǡ% h@fkX9"(DZVjxu4_?Q\zP촲EÿY"XOّ4+ч Dž(O+lN2fr"(ϻ8o\T -#5}4c؊jF? ??gQr0K !VȒM2 ZY1IFqմLv"h\]y`ohل&^3iHݧ\Df%?î>vPSV S|TbtI6Crj5WWWZ ٦X2*.W*J&8i 5\sBeaC&P(>Q*u(2" jUDqmM:8fX0ZpJnԒb|!Qc*K万Ƥ!VySkQLK | YA4KgSM(!5yS}$wBoB20VD!,- Ud*b"y3FbJ1&BĤtsZ'T Mp|j! ì1Sp~6AbTrdc)k9l1cׄ(@B2"7lxNyl|%Ɯi*mDۏ)[M +Nnj3;t:7Eoj1Dw[yN[ f!/JgSX.w#G]ݥo_Z0FAt;ǷP]M8j4K, cp 2i8XB!U"{PEDD£lԮb̪ 7& =#Z6ȤN d}*d>…>AD&*H x8@&p앃l!| B?  $u%l9&qwq0~TGBu]_~Qo)#LͽX-ԵpK8wஉނ>3ƪb 'F#kZG1]ّcalbR(GOe ]a(u8rGXA_&2U;J\{밁!By\l0bQ[G&ifH&!"IU-.ZwTnw(}aK(iA̸ߤ~z[JG(ptkb}ӈiR$EouBM-XĚdunqԨtڎxŶ&Ⱥ.+2D!bVSMsX>K@^o5=oAj!)ֵ-vCD`+} ɇc=+hSٽZb?L)jWyǵltɬIAkR#15`xw$#h&-T=f`U#;M@(CJjc(;ʄ=auY` tl,laxCl; )J]mĘ1 Ac le\Di&6`xL!<!'UT> -)w"kr3!k[AWd3j(-wNYrE`lJX1] hx;ý3c2-79݋J߁7oz=4/>dӗcpA5yj1ʵi.IXeNCq ;̪d4BZ V6ZK+vq- 0rr2ͣ1(1뜍8JLw(sr SmA4WgV:2̓'f"ItA;Jpve̾Q:{wIhwyY>.pW0[{:D\D-Fќ|v|V:&?MI$4VzG]I~c5!CK2& 8gyT:rS!kpʹ!b˲4 Dg-t:)[yFOBW)H2;r8vn}4~%=~I蠎ʩܥYmRL2P\h.1/nUYuV --MS-)+.7e8dl45fRБf[K|bF4!@E5T 7eR E!aNJLA\jwЄ]0Ӟj+QoNY])DIQ[ Tћ4<%k0e}".H6T~Ct5-;ESl-v.Qz\j=b۔כNJñ!Qy#눈/~| lVqKGSdR-!M 8Q,yɏguآ& rSRUSpgK=!b-]n|2ԁTaBvMzóۛVn }JܯQ$z'04@>8oQk8AGMش"x/[q.FBkS35Z( |_GK&m8b{7h҉rv_NrzRi>.-!Xrq: `Xv'Bw:,-w-Yv`"RS fPݖ^(=W1o+>܉TOԀVpEݨ q'N l$jAJf5 "yIvfŤo7[q,1:K"/yL`s#]L$hYhC|E[^ mQNq_nKMT )/N--p[ҍ ~GJӆ- Kqt{}EBOGFגX\ÖYN8ervgfFz-Gr "_X`Cab[YI ^aٗ 4v~ԗ$dW{Ү)gͽwTOqs> <6hh$Oοyf2Р-Һ)aبC? TS_k(<EU;8m-g/kE3qtX{NX"}kF4K siDm x(9XY } !D%7%*/b2d2ա'Z 7x}C YR:<rtw\JK :rтbQvJ6cNc| 1<7 ReRu:`A"~9xGN{LJkٮLT-UP:BcNeeȞTx] #yf}/U\:6uBz}w{VdTrZƎiD5M{?N) x l;*,}l^TzX*{du +YG\|Α`1&X= :t=+e;* M;F d?<\dSa `q5@L"ښc6.d ZƘQV>e .<bȼIBҙ؏N)N)Rl΄sGp%E'G |Ll L$ om,Xroy5Pw.XX ~2j#:u~TgC)> =,o3b3:x9DX-D7 ;2VbPUBm #~=3;mJ$U]|0&EРXn{ vd-fD~*D FA?FRT ZS+>x3(ݵsMW%M<8YSk]lX>IN0 s}_5cYu ^-Q<44BF O )ZL@5- bz!e-4Rf 5z<(EN#f3 >R(q)C ~;S;hZQ9M nM$>ըDnnұetFlUhђ7qZ̚aoxeXnTydPYW'.eZLue'XZҏ)PfagOh4zphQBsD'_%&EU1ޔBg̭fҫ6 pLk|Shݔ& JI[V>75~s ݬrS?q()\JMA^.UdOѵ1:`k)?zA!VtkVn;:8u=b«{rϱKMUӎʱBRwP֘!^ D}G(m.vz~׬Gh縚M|D2_ܗ ȠXO#hU!G teF%Yd%,+S'; ԝ|Xb UӶ5ӣVԹ,[ͩK2wu3tL5Ϟ"6ϰ@ >) `?3g[bRlMQ|ީHҎ=s[ "^?(RE?գ8#YfɈE@hxhp T,pŞ9xK n.T`-"O"S1  5C}D>pׇĕ/$ ~Ө~כԑ$DwSGe]q ^KXݤ+ OR<^ $b5k  'tAzlfM2̑"A6q(Z9$ȗ/yDNvx ճ#ELoz jU"ݬ "-t|=-ե_0=ʥI蕑_ROYd**i!˂^Of1r\QtJFT޾} )l!)MCY+ږ#}=I7P{Jd~b6yxDw׷p-Fv[ѥ cz#z`Sm/ (NN9͋ +I^/=D. xCAJ,B2[Z)Lx)\2b8rA@`9@|@9 yWeOaD3Ra#u㖧M5pz|׳q.] TS]lqa^d_;+Rx,@akmk[?Z6⹠ǒ\>lQQOM~GmE&ifE~`} ` lJ%L,.UKRlS- Bs}ty!O,̂nEfqO;N)PgXʯ =gU|@/Z-V(Y5yJ4{db0[&2 ZuRT)Od{0@REy,ADIR DT)a2oG@HR6PٟPl)tMN14a9I5U ImY}o),D+1RtוBKZ5[/ `fpqJ$!7? Y0T$x$oJv`<2yΆzvJX^\*,CzxY}pLPAj=V_Ӵɜ"2C?͇3]-#EІ=Of56,jHSW L>95B I}@(! EACIU@d G7;Ks&*^~r98ئq7#Bq/j$:mp9=[.*̳ZKD~lX4[MoتR^Ǹӗ,D'zUͱC >&ܲ+dr@pU%F+:K띰#F!Oɪp]*{Z 酛`yS~<*:E^?Prb=(z!e}*CeCդ*Š[",β[Ӫ 3S2K8ĖpWB/gE}0GZI ^YaE 2&6HlWq9Ҏ*^i\aaˌCK_hjǐFXv&Q:||'[?6I'1[hK9^\jaչ-j~eX2XTE5ˌO&ҜӀl+OYFRD@9iSeY|IS.FI۰ mOV+q'-5V8тlym)pYfۉ8\jY6jVMAF}g, [osSX Ԍ4MUMGBJ=lnaE!Tҕ.3m *<:Ty M5[y. eaBqds|T Yk|_TJVB%uM%R]-hNSzzꄡ_$5ru ѴZ,v5t ؆)YkwY 8i4]0~zJ7)0%IT OiA {KhN.v=!)8&)幛VC!C^r!QE=F&UEXZ®͜.vݐ% šP8LEx-hˤiv@i'hB׳ PYjo~}FHM0gv[OE%"ˌ_]7rAE;j[# .XRw V|U   88$D_<\]H3.η(LUD |̙8wn0~ ?U^Dlsu@Qج&a2Na3WPx!T5 ~(NblVwN+U@Ⳝ6߇R}Cw݊<%)T"Y\h&,H ڜ.ъ֟`2^ g"~2 oOr_b׾Hy5Bc4bIP,{y- =^Kc;7#`.f&X2 {UQ@FĶfn5ǯzF#sףZŬ/H[g|,g7"ku/ ͌,GtaKZtu$kr^_5UpC_*Ł\oݺs5[;ƅk GbMsɅ|(HdFTDR,6a[9:g%1]] q&&2+$I6D3Og%9':u S .Wr-=ƖVe-ۢb> H-I,mCf%-LFghGS [`r&\RK9B>lQ\ke^WpՆ ZGj|".TȹVS #k%S=,yO'>p`:葮}#d5͊@>׭Ub^cQ$uthsL:):n~eCΟխ0֔)CǑk6]49J$e&7^Q*dȪХ8"nl&L{_x71p0Du`kj1b9,WYEM_1b,er,J:E, >Sm"IE  Gϛ%pzLR(ϜҤ]g_j4㳜AP=VwƆ$sn@粨"#BFlsy԰Q꺌)nae~PHxGT{ܸC I Ul"H$`D5IkaR%$6)keЃԕՖ ;Ps!C;gG+FXXDi$Lrw&/WB۲T*mkƁLF#@S-@/VOwVA!t*|X tNkPw*}*1uCcf⠤r1\,{*mN_gy#ZȣPHez~KXrL~s /^hF&?~ot7OT{Էxo k]<<_z~s{ﯻpc.?owo?v@^_W?r~S:O}s//Kwߢ sp{pk| Co?>7_2/{KOxeF3w {.u5Ͼ~n/Y1~_jg{^n?xU[]mޯZ࢖~WW^)X4wjo'ujZSީ{2xь{?|Q${|ᄏ?\ĉ߾3HKZߞ}?*\I{Yv/}0qRs=">bڝ Zxz E2?3wk_o/t/pԊ Z^?ԁA[kΣ3K =̷ֿz˧f/[,\Z1ߞ~~xZb 5X~<?o_N?쏟.)]+G-X]Kn]W^׬ym'+[~{sË^|?:q*:!np}\j/[Mm_ ] EO<}ڟ5?$Ax}0>٧)j bz^_O>/buWO}#~ -gƩju?i N5\Wߗ)?WFv:0Ͽw_DC6%SqR鿱 mwϙ]vm ǻVvܼ=^ y4;$m~̌3ӭ$qms?3xӏTy5m7OvJw;:J W`IS|%]';od_<.P*s7j0~N}`~w-c" ۭշj=]oOp8|!ӽ%x @p_[ܗY/:_0ׯ;_;x]7ߔM6o5W[h~!mU{lP;w/KtՇJݏ^{tmCA~x\?5zᾭ17y(GJnw ۟/Ͼ$uݯ`vdocI=_ӧ~G6ET7~G W7 ;}. Hu}5i7VkRtَg-7u|& OvkC?2׼i6Ks >7O"L>FX_1q~iX>|*_`o֋av}^Htſ_^|v΍__2/~o__t~˿۟oo{ҟ dz9_w/iDo~W?H_˞Z_~7_~?׼+>iDύ>w?{JS;q}x@=\x|Kgg~6ܩP[p?W.lovqoyk_}V6endstream endobj 298 0 obj << /Filter /FlateDecode /Length 53510 >> stream x}ˎ-;rݼ]JSa,RBm j֊ =\ #e_O^_uu_w>$}9K[p>W]}0^3>}4Ꮵ;A?_ _y?~ˏ_`Ŝ+: ݾ_Q??(}+L5 x-ّR󿍲iBC9k|D'm-puT7UWW6Yb)-}f:XYB-ĩW{AZ!!-9mUgWϵ9+EYz_XYꌿr4s2 f~,oH-ocIڳ>9k%Ռ_iYF zJXo\!.e:m}C.H )#ºި60gXt*|MP3 *]s^h! i \p,^&̓fz{}}{fm_ŴXU>Fhjd,ُHtpQQ7[uZnffh"ֆE ^&>?\4;@ OK{x$ Ϯ7kֵ~{)ֈgW~׻_k2dmi!58d~z@!Z 9 ,c[>k]jw.B9~'hCςaFXR>H>!z;c|mPkl>9]~I{"j[;E۲MK[b=@}8iRsAZ.Z:sվOmvךm](`IcOpٳB-L@hwm-Ŗp-Y_(Z,z`kVӋ [@Qm>f$K5fu-(ONkDŽrآW=\1^l]Ap(VzAZ!Z 9ض^d[EbkŞSwrZփs}RW;} ΅?7OĽ~hTkrfd}r#v3o^4vz-sa6hTƚRܭWځO. :s8֛}}rZ46-"񥊴O:o(;=Y^;eͣh*Al)Ma_XkoX*{ C9֮|hiUR-&f;Xz`K&EO,$Wumqwy`wGSf<-kGEhRRApans1nඎ?^[Ew;79m:Y!~>FXfY_MeWi!-BBZcvn[pz5 b$vhx4@ qᤡC]&E:Qp_ȁ9p9݌)Xk֜ D<;Yx~ab jo 7o f%Bhxn̊i Eo4eغ^9kﭞ689ޢ PW?zi*s\.^]̵kXpV5/wk &;H[b־7SafA'wֹtIk*@h(8LdkmS'SXtFw,DCiX)A_ mz70PMCZ 8*^wBpTޜi6UZ?L e7N.lw73Zp!o>V?3Iǟ]YoPq;;6ǼR$ݹ*!9mk̚z=%4@ dS@pp}F BQ8;o}rMg:vc3 ؅c{H \d;^~AZ!Z 9d!)!}rvnP7ʖoڏ2-w:"۶[| 43)n,$sk(uwAӇtpQQp ʻ\u2'肓ƽ][$8شN_tci !!aFfw:I#*MkiRy 4AwpSpq5Sz@.: 9 ~]`; Vqٵ6F wWy jZiƉ^bsh!-BBJ:9=)4Zj ۜU}}7w vw,C̓Z6'am?å_x PQAh:L}r>  FAb1Qy8.9\&DwC44p WcHwl|7g5}Jf;nnmlπMKHTT:)v?c$GI@@N ?& ]tbFf4.H;}Bb؆@pmΛ{|>: R%\EG8F@ݰԽO C47'v%2p6A}s"Nµ Rq`kYؾC~bsD [Әo@4.KHG?ke\|1+8‹Eg,;bǠC|8}Iks:t#wqI+tpZQcm)]k]_;G|gh\[uKTzJ:BЗ_8gtүKVĝI<>9~.Oݧ:j6:=$ܒ !/x6~vNʥ#N~AڲnxmZ8 O ]|}lBut(88Au$dDhQ=%c}w76!Ql˰DNw Ơ|nw@Hp1ءm1"ݾMxnƄ 4A]qe 6<8V@cí[ pB^4"#欟ۚ}#10?12U }K6wԣh!-Bv8b3+j ;87^˺Z9U̶p!Q̵VM.mrP8"$\K!C+-\µq(@vrN0x>Cp+<~}ݨd _ v %Bo!;6qW!$\EGx BaĽcJ#53DbXWH$}B9 +#C4[µt8tWq}rpim.pUiRA⒑N!qt{u8=9r<@ SXRp}ٜ$x2$td3m$8zHEs QQ`d2D4~qjEw> y 5T Kk3MF(>H[ "$\K!<ǡ$zڕ[:8r44ꧧu74!al4@ 0@ Tf>H:IZk)8𻕌+ )vf:,;A6SKe 0CޡJb,՗ TB$P-@7c5⎷+H).zn*>Տ%$:ംD2$y7܈v .! `fcn'Dz[p W44jޅDAwj# /'rfhCeI܂vw؜{vh,p6Ir75i^o:>c`k#<}fxm&]9"I4]y3!E 8.ϛs)p. 9]A_r-OS2lgUvdq)X$bp,#nhGт:4 tT޲6fb3u- X$H㶇3rHtF9@Ys .{rQU%T>׍ZNAnB\$vB8 vk-@zugsvBXw4!Z:ct0uy=zsz~϶G3EPCK `v֠vр:D((9{%QKE4͒ |cqU7p~qlOG p_Wa0rNv WəqY)D,fhn`a胴.Z 9 %c:.-ls2m&:2u+mGxCӗ#ZA٢үK N$E'ruRV-w͝2nG`_wЯ~Tbg&$茉EWU颇9CbC&FX1rAit!%Bµvs:t[` :Q69M8tRo%=,AEu .J 1 xWk;U^8qWloT8%҅>ȡ+\V 0 \Ax A96jS.)߬mg΁T<ަ5٢? cd2KP(/Ƅ`__lM}[o9IwX!:N4e.|bR$r sBETY \>H>!Z 9VcgG<8'sE{NY‚)1,V%F}F i#i7>H>Z8R'G+#urN]$[gLWVHe;9gsθx9'p#ua|1 }s,A6ǫuX[dl~Z_xH`NH6!m^SHK+C2W{F mOu/=jin3̗̗Ӄ6|#ddэ.@B^:]Eo )!``͡%.à]aI;67|΀_њ6 w9Bf5`u_a3bB9dZ,]I>Yj^YmW#C@9Sy.Vٜ3!,_) EodJn'/?8z3I_4tY4a l;g0Q o w'_ob@E 9r. .J 9dH >8ڊ}#q$;]N @${x}lFm'\6:%BS}VjfQݛ98o qnw2|V$>M;$vh du_g=\ewWP͟CX>D ۜHt8 &#&_)p+K89tk*̜]|}lBut(TQ- ls,w:`a0nFl3)I^S,c1pWH>>9|g\GRHZv;W1x=>3gUi쎩 ~lؓKrE88HEM={A{g?%.Z 9 leCpnR rQߨ*ghQp څi΁bCZ> {PQ7=%j (8xQބ4Lҝ.`*Tt8g`#G\-!9&ތPW +lvk1+h D dsph} $p ZADseWov{?ꦡ:HAXh\V~Gp}>6s6蕹pͭEHH@xCV" +[G)TJۢv- ^!Pʲ3V upQQDQE-lMm߼hzr*hΣqpGX||Bilϡ?GQ%>99ROcȴ/I){KD{ 8?qp >GġK攷yp2r*usde%11yJ4\!.FfNH ?C[~jVy}|`[UphYuףqR,^c8G~3;-|;\A<Al?;&́*mGZ003 (B0.<1mt_FLVNfo B#(h7KkjRFBmC!GNrrFA$]F )#|H&{ Ww=n-\µs bW ;< y0̓N9Ji BB:c;L<61-ȿR,)YI, Μ_tkmPzUb.d$\C?/ W+2* +_<C\@IƎXk hT1ڟCPX|fcd'+ NNgc F]]:t (xl`mh/Z q7*TO :m8׍Q?qA-KBxC7Ψ<˪U>lUWeĵpGΠ-QqvbpqUF>vbh!Rqȷ N:`OT~47$NIX4)Vt|)a7B8o3pב?F!7K^MOyzF#ʙ9 . EDv ;@aIF_[p1 L93+d9B}F821D3^MW$G'%K?紸VO,'qrKeKIzA~ z֘>6GI}!cw@Up cKv<Ok8^On=/ gVS/{sU-;V?a%tJ}Βve< -ƒ4Ȝӱ QuihE>9 SU{:2*ğ +xö$}2?wvcv/?G9F{8s6Og 2PA;.ILvlgp} -BBZ;9e ot88e)"~% 2$ל Na @@U$%r$ c6t,[m?S#u1YZ~Y9]b"y#Xnl` Zvч iqcʡ'FfvoC:CWYd7[blI7ٽ 1wtH;$!l"td Eu\GxBӥ FEDH{}=l9!{ ~gt Xл c ZQpΟN>9$ .[AÛ+h`9O[zplyUCF>DW%\EGx_YϘ68L5laau-ھF-1d tvs3o#5kBN1N):':EOO\#_nޥR! !K>&[8g}~}l-BBZckΆ8a#[=1UζMiKf<]Xv@,Cn`%XKo#8À@PCKBx#E񻫎gә D@W!p\JB=lcNr7ޅJ+I(ނlRT92[8\MÝ Mb#8]pnsowl.u!Z.up Сc,ӿTV?B*薠a8Y<rppH{*]Ao?{pX'gt,>q3eK5RUeF(!lڽ7/F5oA>4B[K"LĕnݦswvhXwrtH[[blA֬y@p78nbLqyLh!Rq]L\[_>97o.O&nV]&OeD ;obh!-Bµt8 ͮ|?wU)ã؁`9"$\o!(CNS/$:BYu7粹d#t\[>HÝBZ+) 5Aysp;pR >$bd*sJ@yMp {omk!RqgMp7 N4Ic}8vA% ]ɬkύ`c胴|z)Z;clŷz t6DD2_pCbAgzUm`}%3]~}l%B•c n)dW ;)xq*H&e-&>ߐP@)ts`<Ǵ@K"cfbMxN94DhkGAL8'>A݃cq=݊$~jEfe4ۛ^)=LGmzap=vp';F{<ۡBHEoCnd]=onl&@*D6pEbҶĘ!Y+Vȭptp.!}(Ϋ_ f64yae Ip \jbF `yw@~"W@[A%l| NŢXQ[EXv}[G7#g.SdA-EHH@xk0%(Pt4I;b ;hqk-2t:(.-\"sr]d[}mNF !H: ]:з Ks/V%\GGxBLD NQ.-.q RZfW;Z;8[9'KP#zJ L>rVl-Bµt8t]+osy*Ѱ³)4n`xK6.48cosEHH@xCbVg+M]3nUd)U+ezHYu!`46R"$\I!9;$j%N=N No"=8suQ(,=mŸi NV bD=Hrs$նvsm CHGxB0| O3,UWV9r/d "I}^: _uBit!%B•tsfsrpBڔŤ>nY%andK1##tcЬJf) ΍Rd=k2 oi9ܤoV{|+Ϯ7/L%O,Q//QMFYCJ@QM&8# E P\E^,ʾJ/ [V3%֣H yJ~} 8EZ65V@%X(JDM(4z[qə^e%VrBJ=LTEL#-z f rnZSu1Kxz[8%q#|# Ơ %*n -BBZcSӥ<1 *7tE[er 0p+gs6%5i  %? &ʨ1  /rT 6% r?hbvz# K{{UM VJ /Y*99*:d?e0oHe 8}y(d tG_Gΐ * uX%\_:ZIi3Z{ ڶ9+KHS ۈHaH@ X^~A;ei1'1lX+ßl7CfYjv*-˷@p}sZ;:v􏿅jT_->9EYC :#k!VkK"5Eg[XҸ !!9H@NӔuNg~5~J Ɓr;a[>o-Bµt8tY)i M?L;yp힇)JTes#0r*6>H*.[ IBxCadJ.TsYҵ7eMF:%ӗSQ9f#T8j>H iqp֯7v9F:AEv] \{#fh5?7G@J-(xs瞖.qpmgW)3@DDWzHJ+A6ƍ`e .@ʩ :]Eo,{R3pΤgM 3 rK Y'$,tgsh ̌iYKBxCLy0iob>şqT!7g|qLN52lW8.HmQJ+!qHKNIR ?^P9jP@ nFXk up{msS%?¼8K̯|AaH0De̕4gMj nrŘ詫K;KW5nMI 7$莽_86@AkwQuJ(sZ ~\3f;1E,e߄%Xh#8tg98#iZkqXR TѰ=#sV5. [6L_7WM ئw+i̞m `}Jӓ~1H/DG>yyRf2,$1zv#!:-9]B*st[h9V5 *Hf00yhx49򎰞 xB~:kiYssL]lpQ@Ze ~\[z(3ɭR/YlC6Lye3ӝt^/e!!͡g\ ؓG_[ -U~1c>8~V 6-\H;bDwAÛ;36ǜv{D $\gH>B l0?FKK!VtT~НOJFp90^b݇בQ%BK!<ǡNtkb%NfγR/\=K‚Sp2ybP19iBHHEGxB+7d&.9yHEמH"6&H0h$ *d*Ų 건M'n$b9{n ?7@=i0p7>iKpA&3cp4x={- w%z^YI!#\%<ixKp-fI1ߊ>8gߋ4&5,ѯ<`B6ӗ:g~a"xA-$BK!Ŷ''c{VTs*QucƖ.=.Bezm%\KGxIz`:#E^ lHڂTёNDU%QpltpVA[g?i$em>Sg-1{P}iU#g1 Nc.H w^z2n7bCGiۊ+>$,<DiZ}~}[v8tL햴-[[M)ZF2Ń :yX,FH}~}l-Bv80anM͍Z-bz'6#oHNLz&Qdp@4 sT,gUEl(;N.$&inˈ[dGO3p[qhA+L~9tAc(M#`,OI|yJQj@w᲻,/[ p%'?F+ XP:D9Dk|JD+ݾB" ta@XsGq3!-Bµsg׭&19^.H%~tHhNcklx:R^wc`f2pZeg,A[\vn>?B[o"6Yl'vf!8$A_^9y>ӆ}~}l-BBZ:sZڎYs:cێAVm$qJ0Fp3lm}x$BK!0}ա$BK!(Jjf>Qujndd),EԣeC p>#v .ג,QRrHׄsMç+pηHmN&]+R9,ORRSC-9mkQ Ζ9s[=ޟlįjÃ̧%\QSjFUT~PQHwvi=0_p,V|v N'e`B\璐3BjCC|.#)3k脐3B!w &.52<<* ݿ6~<k.oC~{?޾\Vn%|+O ayK߾B2kkE@/L/cͰi嶝==}_䘋PՂ{&ъhBjrdVcD $˅D-lW߿.Fv4|q uQ#my5jIy>,F9&3W.pVp܈XXL߿3Vc 7jy^rb;8z7KsrBmg_`*܎d嫣./ҬWCeh] = 5fKX~_5(X[jr*ny17gEՏVDjta#oާHa9"Y1ȶ= !<OĞ>-;%piE$0Trg&dR߿4d,HmM lU5Z58pXnN cэP~/5B x̷5qv7m{ef_Z}4= M2MG0;{mMYC5rzl1qVarqҴ_jLN2֙jGy$ϝ= їZQ0&+{0P\ b1qGt;M?ܕütmGV$'zSNʉwq:Y3F=&7/@9*b'oKTA$<[~@-ɚ[J~n[cۨyѪ7l]>eykvɖkhTÜ~%z6T\rBdjT +ظkbRygpԛ $䀙nAD|3S$$sZ¤g'>bn6ťS8ѳ'wW1 XM-rEcYvAQ)==8S~?Mn:[oekE0%SŹ7j)n>% Dv×Iiixʰ]<ÝFRg+pLĎtkb$Fƭ'7}'ҙ ۾<|ok{7 c!&86_Ka3Zl6A*wDeKJ׉Z7bowkԤ5%q)Cm3VLfi1Ǻxy*5@pL{ 6"83I0iK2'Fzݞ'kp[`z>^3)nԙ1\ *YX.PwڽĥnFp[!;̢̳) G0W,F)c#'O$b<;/o>+2Ksc+yʰտ0Al-Jk379Jg{4⓮d/[(%uc>Jw%4|a\=2FeH .+`c)Wwن)jͨh2 hrOs`0/-Q)wfޛȟ}i'JcV|IX穁 1. j |Ӷtx4`z]zݭ]/6>ކRy7=q"?E ,K'7ܞÃ?0IA Pd(^9>[ c&[7L3I'>^U6>q,d +w qi??>:igLP8{_/qb ozuxA-&ck8Zy4+8 mzv=p͋0v[ 3EP1Θ><ɀ^t$~ho˖:3M~aϋaW>xoK623Ggw]\/GVn˛o6mx>e9p}ݶZffOڀu[/݇?@Hyzz%vjRoY`PXNwoC-,^~aY@0ZflvomJG7rC5n/QKEߝm5?˨XAA|J2^[يa¬jsd ^yd}gn"{v6vNhzuuyM#vxmϹJM臅0j3)X40bc:ZӃƠ6`%!pZB-)9&ɣbL{E:2+ưƭVG^sCsq:ŶG+ ZK_%~{>f#oYh _dZ':Rt sG(|0Rp kcU;~KeAOt\}Ů+:?0ZZw3AַJhon} 54:숿iE2$RVxc_|5*w閸gmcypoչR =t[ζҙ.1:ax;3}K:A~glNf]vc>9nGIJP7xޮL&8YFI|l }CߓY3:/;lѹk.ǡ86ٖ7 nlɵ}:+LGAJKq{fGP@W#rӷK_>;~İf3O]m~a~rs v [Bzl,RQ)ԡN娾wCÇF\4#gH\5`E1:vZ)ył@f[^nT&DInP; X,l {:xpjeYXjx&y~e<]ÑKvQ쌠g;@~;ROOh.RWN'l" ǥt9'%J7r\GVpnB"I-UD!𦃟E1AT^ș]7t|-bۙ>ܸteHqv%Lt_՝*\[@o*g0rWW.oosIr]oCCc`>ڤ&e``ψ4 C4bwQ*Js]vҌa|`Qy"/k fW4h1d:Q9Cij\", A91l/nꂂsWnj1lu qg_CFSvIG*Ez`2)[gRĂ]p{0+4l|)%i~Ss8]dү~r+2)]K4!H#Hٙ6 !,ΒՑ"YѮJ+,YF~8MP B*AǾxfu9Rlb}PpI!H@̽##^FJzZV8r hdG( D\]GԄ Mܮ%=P8G6x`1+T'7NʙB ' ڵ@&cJo B|/,]J`k*p_}czZ$^\Y/Q=5}êE9E* =@4Ga3{ VAuac4uÕK2 SS?`~fW<(I2S|rVs<+-U7/hn@ mk@u7$%^i)år. 'I5:DN;R>fI$WkE#QG-܅eiX?|?γimL?|lG ʂ0_+,W4xd>f8O\ bÃ!4rARړ5W;-c` N?<7ũA`%<wp0N%ti:؀UNarT[cDYdWRXjj(zXmfZ|}WDz;h*8w]%](cq`]1< eѿ-ӣv8&=6g,1^x<&zMdUJ3?2' %1?C)#1r`=lS&!xHHL.x.&pb*魨P"F?" ~~d}ڧξ{7Ϧ0rC[M?75{?5C,R[FZRtIP%Lyx㱰Ê#wu5Qu8[(2FXvSbK|o8$-# ;PT5(xDڻQ/f $œkvKv9\n?=y5ճWP4R!slF0ϖh6֕ܦ_*jQ`1 %8liG:p E11FcNp@OSW-U&G MY~ 57P\83hQ~Ǹ9YKsS8&)\Ki!~Svo:K"3A1&KJڣ9ؙ;Og HbwP>U G1qhw/wrbKD8h WbyDt.1N°34L RaXxrS b08D@S}%֦7 M]e?-8hgf]b}4k_ 1/Af9 @0"iU(dڴ؋5u7v7=lkHЁ0T (e27B_#XF0&,;T h <h#70=e&dѩ^)iA%pEVEY;,aܭm /Eu hEA5\o 1[&hn㣲VuMٔLn骍]WIUFpS*w'qƹd"ˎ"^gYiG4H=2* (arokh%UbKգS w@- 6x R٩얰Rb5:"Sb4TS^͠O 2CmH-m^&!kmчI)rs)>4Z2Sxrj 8J C gEs*Bx:^ӶTR`\RX/Uu 癔.ѭڼO/ XqYIVv9=y?EҁTB%ʿ@ih N$WEHG -U%=`KdB^9i;*q8 18=eN-FkYM|)>a:ӫ:'SK7Q-mudCIFKI&cVP#{[aqSsQ 3Oѡ~4C*jyFm $^ y7̮ܖ:*ՕB0Ox$4\z#s|)=מ)oϢSZJt3*?F+N:A [C`)15w(*B"dcM@IN|ȥAL4dQC9Đ6ESRap,C7ɁOa\+(?~D1#k7T$VŖ$䁈|"Y @ 8 b͆ Cj9*a5m1NS,6P2,(2 y%kdɂHvwTdO*òa?9lWl"ؔ8UҞb^Xp$ۯ:XN?:XE7q\,ekuETWd։vv "|Y8^r +h`mLQfi \q6RxBo(r?N=JoOgOnF)4:+xu5B56%u7 q uY{wCnrC{?90 9}')-}فgHPrgzs,Vm(Hʶ{sIq~1F/FŃuO5r՘DA ,)^SƇ|!YZ`Z(-I%d? R<(g8 4E^2㻍["P~'!\2_di;gÌ9p2;Sc8隕[jQݽNZԟ. r!EǴCvu>O=3Gc;t:wP[{5,^'02זe1: )6%CRw$<:(SUǨ{|0-B+Y$+Cxt LΪVrt(لss똜+A<0-|t/S8[1<5 3u桢Vb'/0?N {d-r8C%t~ҖADL -QKh`F =]]7V@Np~`O1I@Fv&(!>e<X,&IL!1;)׻WMG<`lՑ(&@%Ǔzs06P2XrKhy26*J5+fr!E]5q\AB*QhU?k#k5=.Kg*"F-[xpg<L vZ|V8`@HS3-zZ^&P`$wZ|ar ~p.1ʣxjÀ bciZ&0K`HlXWj:ˑy[)S`7=`?Ms,4$cˎEҳPx;|ZnGԇ)r-CȀd2K8Ŕ8HhyVKY GZے&[5NS"Z#') k  y az`$!Yǔ|BVXLS#4p_ +le\=/m"!HSc"0lfn"ƺ$\A!^{hf#,6h[IPi`໎JX=L5Đ:.FI`u }d`LQͬ?{Y-N产Lٺ/;:}6ܥm* Z5rae/2D8kn={i2<|y,jbV00 E p֝nDPrർ"fG/WlS?\,*˃{I-%^cFδ"aXh]VlFd^aQu6I‰K#:j1bNN{/JѧђvlΓc<ᘝҊILfV+ۼ I1ȶ@*4eZy>'1" ͙UK?dئp1Sdn̐6Z RT̓[Î7Oα˾JWDktExM.у aTf<& ̇wwn T `QH<9ZcCܭs:PCRXm3 gmWg(U*[fطXG0 p@A#* 1m5Iܢyd H-"n~ֶvI1NJ{̥&.GcwtR LN멉 I,s՜7g Abp+SMŋcoЙ5'Y3cvzDQ~ ;}HA;c[q Mhy;Pt6sF5ftWk26J[3 d _-r18 uP q 3U"?GgfnHVM\"'W-`P$,&ykI<6ƞtkv53 ʴï|j1h|zvSm=ut<ǚeK^hZ3bt5xlL aW<"VՇЦ$k޳-_S=0@NE Mz(by>BC+xJ -$`u6AdWa-OKS*C4NUpx2X4惗(5gU"ͣ,YZEn*3 Z2l"5 h d5~lJfTCS ֌2KE²6Khm_͞iS1oG?F9 _kuB[u;"9X}-%,沣u[9#'7G{8剭)Z͆B9uq 1VIg0?z>tHS:SHIRs ,cjQM=Â0ݭ'RNvC Z:w͘[-^C /|4Lt\u3I xhF`+ܸP^s ~j-eGOڤBM,K.XUPf }koUe-K}E)(%G[K_oꄌ)FN^3"N ,ϲT{2#W/Tx>A2ZSQ-'_(DV-Yn49%[ǪIhV|LYᣩGYb&ḿއDAaycCE/̦X ~:_k<5:xA.Uuv쥹]Q~ҎtG`̐n()EʹkҡŮH?i)h {}U?J 谰RX:AS2JIzC&Ҋ59Hw$U]8{yA}02mJ܏J`ZJ0I4vEu* On3 $DdOsÿ-zˇg 夭#biݟ%Qh8h$PP^4j1`8Rm Y,z*Ai~,@>@'AH-; lVgJ2Qȑ+<QZWbu4QlQAl_ϩ%,4g$䃲 sռECKL.SS<-cj1Jhh'5y)A0,T49M|hAG1ۧRhhKnI9Gկ.k*rGaQ> @)U}]mC Zh5 vP3$m+ ~8pZFXۛ ]Y:`Q<!["N!nd|_Gj*'_OUs [Z<I#!S/Cu*v4!T,#Yn gYn',N"Wp+8\h~$Yy|h4QN4r[kϜQ\r$\ x;t?SY1L?o&0#7="Iݔ{*n=6WA} v6Yc۬E<544m_+L!PFEC3vI9IG+o琸hdur8hX4Ж dϞZtch҈'Qko03]?yGc2ltM0MmI@AE)úS64M1Hぐ{jQ}a5;T(b8Nc(C'<4A /AyxQhމ7fz2FӒvƽ<" S23 1-FB~;u鑐 [9.=|l}VP*c{C|(6I41j @KCTlcgTSy[zF>AN;џ6Q"LCI<'H*1ĮKiᮜl3w(O \' ,:-B]cOpoۥ#$k1AD-Qөcx#ס_tөYp%DS]6woG٩ߪQcJx3À3օ> ,!V%[k+lmP}\eLl r&FHF^ՇuMV5HL@)M{}V5aH-5Uk1#(9 bAgLvGj)":f#uK%v֙Ai9uBu!+0߯!Xrnd! cG:ʡب.fhd}7r3ȤKyjR#Ă~J}B P,Muh}п)ZVF!8}a0Yݔx<'ҌʷqALJN쇙a>ӣۑbc~ٿV=lBI}ʅ.D5 */yz 4% #b-[ǧ|oiM =w}Gw}}DG)c{"93ĵbS~)HVM=ѱȜZQbL.W.ީ[4.)T=o1D+k! +1!90ڌ~sO*؄n uHQl [trDczq'] %,ܙT MG3YkYs>eCwϙG̡,-dpq (Ȍ(U^'ę tی$HuԆ|Akb*y$5 )qùh#NK[..F-BSdi5MdwπbQ(dCӚ&51ѻp}ScZ]eK$s k)X X`ADf aDj{=w3HY'yaAqߗ@s[h§匘5L%+@y#,:CU"Vw^qK)6mE7K}ˑBXa -WOh{NzA*,, P cI>Ml̀ђk UP`8XkxhE~&Y=lc]1Y,3L?%4dajTVToPa5`XS"*-t"heu@*c]Z$ײPAs)V zbi٦`4a,t~=qt7p1\R 3 E $SJPT-:&v+JTزY3E` Q_ՒT9P D\bf= KːW [N b0]gԜ5m*|% l՚~ćB5[刻4%cqXCTU%V@T}T1RJ$ԀdXK=7NR~c-d67(MA_odHS评0chqn1G{F<[wTƺNWu1qJOֶFJ)5 8U֢B`??Rts:Uc Z T GǮmP,:ͿX6LCB -U+e^PvzYpl#r{,xl%flYGjI3a;UͥN+?h\R<7P);f%]0e9iߔILqBBnQc9EyB RAvDwf4[QCm8#hyg!G,JNr)!tJCY <=QfA4+1&h#2ѣÁN"SZ+C6 -2k= QS쯾dGPtjҪaJ.:bh@Q@ = WKU!0]ƁY%ץJE)Ӥ8M@B2#5`@7pnS,wȤ %'JnE^C[YJ(.I+\FRKZɍZ2R9ق9;pL`ɀИ0*}jM<1ii!VCb5+f bI%&}NMH&ʖ($Ӑĺ L@Y$oHLi3Dn{Ndp RcOx;da"fv#r &HGh"Cϻ뎢 fDm#[Z2Ҷ8NL[B&r `C:3Ux:|zTb݊ea؀OCj1Sq;4EqTO0yzI)fFzMp͌)R 5ˡ;wTD|MZD!3eG%tN`]?+p`'*ߘQ2jiLxU]y ˜4dv-؋~3 *Jl,pM7'-twvpqa\S&Ym)ϚdB˜_#-]E`1rq5ck]!=`S`f}N-[-h"-#F֪A>n}V4ȳY ٔ-렋trw)iVef?*\'1 4bL1d[G/Q-v `|[®&A mo %`O 1oP8h4p,I E!ł* =kDAD"SQXjWl1fUՆY煞X-dRw2 >jN}2f BZks rP"qOf s$ބtf @ 8A6faRnv hںHoop _Qλ8ft?#:./h `ⷔ&^hx|%@Xct;pDoAicU#_ms1K\0F x)#'2v.0sOg~[L#~n^Z /qCBW q eu % foR?N=L-_%#FG5ZP`1`ʾi4Vq)vy:MOMbF:8j\fmGb[T ed]~ 1)9hP%kxԚϷe5`;!k>YBeޱe`4祈 a ^-&v\Zt6:dVԵtDˑB0׻\SN4V*S3& ء?Ecwe˞,P0 :f660na+It릤m f)tdy^v- ׾eGI.$y͡%y\K{yFZ*kpMʐ58\ÃeYh.iQcL"9oy<p!fgNo;PĜ]$&+3XI$|$l(q:sV=E=zc68.*;`G6?*ґZ; -Z&uUmPq"CfȗHv% '"hérZeZ CYlMhM4쁽o$!(ZΪq֡onY^Ooty%s^e͇0Вdy^;(vA4fyZ&s]#v=PPjhw=i >f1=5ueKnU?qWtY\6ŷHڍ5~DwPh TyAlo䘞-]Hk:唭_ !ȫ#晅̖MCL-/uQ }<:wݵH2;r8vn}4~%=~I蠎ʩܥYmRL2P\h.1/nUYuV --MS-)+.7e8dl45fRБf[K|bF4!@E5T 7eR E!aNJLA\jwЄ]0Ӟh+QoNY])DIA[ Tћ4<%k0e}".H6T~Ct5-;ESl-v.Qz\j=b۔כNJñ!Ay#눈/~| lVqKGSdR-!M 8Q,yɏguآ& rSRUSpgK=!b-]n|2ԁTaBvMzóۛVn }JܯQ$z'04@>8oQk8AGMش"x/[q.FBkS35Z( |_GK&m8b{7h҉rv_NrzRi>.-!Xrq: `Xv'Bw:,-w-Yv`"RS fPݖ^(=W1o+>܉TOԀVpEݨ q'N l$jAJf5 "yIvfŤo7[q,1:K"/yL`s#]L$hYhC|E[^ mQNq_nKMT )/N--p[ҍ ~GJӆ- Kqt{}EBOGFגX\ÖYN8ervgfFz-Gr "_X`Cab[YI ^aٗ 4v~З$dW{Ү)gͽwTOqs><6hh$Oοyf2Р-Һ)aبC? TS_k(<EU;8m-g/kE3qtX{NX"}kF4K siDm x(9XY } !D%7%*/b2d2ա'Z 7x}C YR:<rtw\JK :rтbQvJ6cNc| 1<7 ReRu:`A"~9xGN{LJkٮLT-UP:BcNeeȞTx] #yf}/U\:6uBz}w{VdTrZƎiD5M{?N) x l;*,}l^TzX*{du +YG\|Α`1&X= :t=+e;* M;F d?<\dSa `q5@L"ښc6.d ZƘQV>e .<bȼIBҙ؏N)N)Rl΄sGp%E'G |Ll L$ om,Xroy5Pw.XX ~2j#:u~TgC)> =,o3b3:x9DX-D7 ;2VbPUBm #~=3;mJ$U]|0&EРXn{ vd-fD~*D FA?FRT ZS+>x3(ݵsMW%M<8YSk]lX>IN0 s}_5cYu ^-Q<44BF O )ZL@5- bz!e-4Rf 5z<(EN#f3 >R(q)C ~;S;hZQ9M nM$>ըDnnұetFlUhђ7qZ̚aoxeXnTydPYW'.eZLue'XZҏ)PfagOh4zphQBsD'_%&EU1ޔBg̭fҫ6 pLk|Shݔ& JI[V>75~s ݬrSq()\JMA^.UdOѵ1:`k)?zA!VtkVn;:8u=b«@cc@y;1CvG7 b4r=.Qpa]EYMq5Dӛ8ЇeZ/ AFE+0%mBBA4ʌJ\a8K"XVOv;-'mkGsYP#󓅷ʭSݗdc%fX#k=Y١E'mbGa@(3}SR*1f϶"&åR.8S_A3z#&LE;|~Q $1"~b=GqFX(vXєlYnJy=Ys2+\ e<[5EEb>.j(2=j|} B/) /+_HQ 7#I 0年#˺( RI}W.V x&ͽlAH(k \: KOzez#E7mQ.rH/_ԉ$jgSeGʧf.A.jH EY)J@D["r{ZK9`{dCK+#m ޥȾUz!)%U-T%2B<U'[?c(锌X}??@R )BRۅV<-Gz{0nR$Jlo72[<,K_F" 1ڠ_; >Prÿ%v&W]c^z]x :G U %ҚfU>-˄?3唜l}yLHFVQ1|-"pTǾߥX FGstM}EGe/tqL`ԃW"" C@ mw?_-V52Dyd؛PP=UKVC˘1١7]*E,^5dUV$CTnDla+Kv uj u`K7 \9Պ3~+es!/:d{Nmď &A%}^*up0v2H!LIU& jK /)(~> c4tFh.2T0AoQKw2 al.ڍaJsYE@* #{~ͻx q||(/A4P+]$N`#7=&OoH=]6xZN7A7}%e$q ,ELTl@7Wazl/Z XboU:sLޜ19[3-oOѰoMʡ'屧Ŋnח SЋ?ˢ dWY M׻-Pf S=%czWZVepx#GXPSVkArds| Y e8Rdy>_;)@9l,=(~dɻܪ00eyN;seø۪ c?:6-9zN`սѩ?2DVj&#L,RU?>@$^6O)qzKcWg;Ul . pV/t&{xSvoFiJ֖f#Ӣ#HI5cKIǙ:?$79Pѓ`_@Y@Onqp0u״JUh u#BT{/I7(aU~eymR_9.xi1zw (yfj^𣆕71O"JT%py`ek5R,.tPp]"LS,Po荵; r?jeY. Ol 2cv`#9j9iU}[@/*CXB݊REӟvL nS&!WšF!ΰ@_/zΪ_8[Qjh;Īa jM.8 e@A4) R;2)`O *Y@nى=:(BS<d(ߎ #vI#l,㡲?IBMP)"R障cir0sjPA2y$+ 5SY3 Wb+mj">_KݕHB8Eo 4\abIÙIߔvyd ᓍ#$ +5),, 3HUX:~M " D$pɭSzi)99MEdX+ׇ\7~+2fLZTG2 {2jlY.ҷ呦A2;}=r?kA(/PBP9:G#ȁyE="owaM0U>,\3Nr=q5Mn G=8_DHu2r$z ]t/Ug?B/lhi߰UɥFq/ IYNz- c @|}L&"e9W威&J&y@3SW t$L-;a;G3CU9T@ 7hNj1yTt |CzPCjT(Ie#1T棅DYeUV)gdZqb?[-Lᮄ_;`y=Ld8xMm,`=s(s-I1U9 q0–ԇѦՎ!rLu7& >gO~=lR1)*:O$ 8Mc@іr>^Q\3tժ êsٿ[!h)V' flǷ۱d\j<#4M91V$)* IF/*r"Ҧʲ}+\$9aڞWO)Z:kpMYRળͶqԲrm'ԬJ0|RQYcA5-iΏlzʋ,C+k_ ]:.Hg5Ux!t>@ @k43 g]<4J $ڇ#bi:*b/.: ZUJ`~KB9tZP3Bf. Ca9+Hj.w@iMX~kRm~cy S֨%r4] 5dOq`Vh`.$R5uJ,x'cc>v2)l"㪁<.⁎M!j2(>tùzLE(yguc,rvUDr~V+*qchꛊ|)RXAzfZOrj R5 `A](3Mpjڲd&jgGWO%M$ řF:3|QuT9`Y8_:ѢS$WXÑ~a5da`=eJyHl 96E/Ȕ )թ~To0uV,QP9!uZw:$L0LpW\]qCs1v%P$R!SGdH!/>Ị=Jf2*;^v4 UJ;g[lJr,F}$FPv SGl-e!UhX=BJA*%}z*> @&i2gzH9ER^P2R1=ʊ7'IH0 6e|ȉ88(]m-b3g6y%Ͻl[#==-77%ƓKѾu5ȗ &JÂfQ, ﶯ9d}wU|tU5p0ВtʐQݴC?|9PQiQмv"/ׯҞBozR*zvj9#'&ڑ~:$>) '"70o+qpUҺEqLs@7@󚄆mS ࡸiGэilw:KhyԖ];"~{88PQ4"&wIe`9cޑ<I$ZYtTEQ$0B&|VA=̜4Gr|Ao.E+b vf!1R@miY ;c%;QnjA2!+խtX`gy!-nXS:.=2$ 7 xC+CuCտ9D?2 a6ZiOUr%%^OU +`@t=.Q̧ i-,F%g 3-K Hi{ RY'ٛKu$EX:O\,UKX(1REV~(%!K>:a`D ei҅-2֤K*gx_EP䮐x`Ez!US:Dy Z\0i$a &Ń,Ǝp1˷D^GPk(PV?иfn˭H@UOQekcu%UEP>9-n^~hV)!eE[e IRÌf+vdHf @Z&$҃^(vLg`PRYL#Dԥrj`1ʽ)9K Xr*I h*@B`Dʂ1)'$sUhQ,-^S]GIoɋށXi[,:Ī\0AWs[js ](东ԪI( d\!]'O#hcK 'v(}VX1bqM_=fIE;jJ+ SiAC4@Xpо)A#+z5:Twh@cBOF;*Z )Un2&yN 5fz?lyXlsN"@b2#u($:)3]g&r#jU]%,5^%ܢg{{EVwJv8}[D*ϢGH Ӟqw{pw߰쩴9}"CGh!C! ;-xkwp}oE@V\!]z.'tp#xC:d}]oz>Ry?>:wn= k|ooO~usi/׸s-_7//_/2ͭ~۱_A~~lG@u Tr L Ow1tCP}3s=ϷG7U܇ϣ=?xr{ȧ3WR|}Mb =~>>J?louO< 8._ۓW/m>ǟ]RighHxϷf_o< _?=;~]lT+˵޹tW _]; Y˽R&aG|?nC,6?o~}Gx?oOdl8}޼;k3jφ5~=G?1~>ٯ^s<·s{oɻ`k4qŎm*nM)zOn#񄱟6>x4~ǫjFy|6Kȯ}}ۻ!>|ϣvDo eO?|ӟ_|.Bԏxz->Y|߾<mq{"~2/-Og}b .컟?<^>"3/?wvaPG ߻ںOO7lkS8ƾ^5DmP;f62$/O_sٗM8"} .w}CeC`,ȧmwVÓx˒?ncG%iwx 6aOܠq|>Ow>eǗ~~i÷Z勯q7ޯ~ٛηĩ?xuXe벧z:k֏&ǵ.m׬y>O D//31.!w8k=lUO5>|>oΦ>+6} ׯ倌a>/7gqэ+ۊV_ػ F_~K,d Ş_~9a řhle}1Ў%{}m_pZO."0߾̰??y^Eɻ}g㲮u>=6~m>?k׀}auR~I˞0<^k+D~=/&Exo?|p}/psW?i.W>^䧻_'IOcͳ2@=ӃaO,/&s9{2 eU7-'bq.YퟌR|eFUNZnA-Tc1^=s o<-?~xW\ZI~ɧώ߽~W_^X%\/oǍ/}>u4?u~Z~ o[endstream endobj 299 0 obj << /Filter /FlateDecode /Length 107329 >> stream xMv9? I2k@ 7<} lZZ!F<kf6S9bk?X~}o_om㯿?ϯן߾?7t{|~Oܞß~|~W׺?W _ |?>~W~~Z>eӟϿ7ۺ~~uZ~{|m__OڷGT._Z+_/.e|ոUȶ?e"/Bhq-xn^/=VF]H_]v?}{OMqݶm ko߷Oun #vv}|綾 P r~l_1/?[\/Q)uGKJپe/*뵶-񗿤m߫١/*}zF_B^cq]oOrݶ^`{? {7~su.?y=o zn[ϏzYnU{Bn*J|>{f!8\Ⱦ~(qeOU}|<.u}z^Ot=_}fpu e{/W%ŨNYz_^oGUAuuYx݀X/%v.>~9[_7K~/;a}Gx{U^}xݏ쩯;^_[u}p EO^75˹ȯF~}=/r{ݽVO^+{}{/C^}/ok}v;j/&^}/ͫV[*_Nݗ_OTZ\{ I^Za=ߋu'lvK>ߋu'ZCb sW{1^{#Zۗ ~-WodnZ^;Kz/z/HW_, {u_mⲣ޿U&}~0y}iOJ_E{v7Z_OާO>;<r}ξW~m|ﵺxٖ SK|/ד}};=._&Z6Fw/{w]nOΗO }ce˻؞B_[m {n}ݼO{;z-ݶ{a.^Ƕp^m9^M0_A^_V+Z/t^M __9 _/ȏ|c\Ms[܄^koa[kuc!޲nE}{}GPޣ_|[ߋ5^e,Mv^|+^/PmKfdwj_^>.Ӷ`~^M^] jk|*\ݨkzMVwZv'n~-V?'C/^v(|_`|ߪukzk~ yŗ_ׂ{zoZ.~l_uqo{׊wK k \0i1PG A9|L@Ě 4PAɤˣ&< .4/d}L<mfBɤ&dM-4=Rh360k3 L0m&`fh3IȀ;M }Zd:M;M FlK $`:M$ԑhnH4v$;DlG !ۑhnH4Ds.#ܑjTpG #ܑjH5wt$DWG&D0I4u$M,,6k[̀{ML{;L|:ڌo%(n/¬̄L ]&XepG n3/ }&>lG gf}k̈́:Œ`f!a&0pC fε4w-&@, 4u;M&`hF 4@PG X#fB a&؎0#%4ka&Ў0pC m*`Q31f쥘X0.OL@ ̜/Mjfj΅PJfB МzH jP 5B!'fB-fy֑>s K@*뗞6Sys;1;fbeO1ةjMi~*ijrTSJOŎ@PSΪNSV Ӕ=4PĚܩMg'v=N) Av+o4DX4OhOثv:5]5uʳ=4ԙʻG ~f/={Gڕ0e5zOSg1M5暙"535kfJ/eWX{hKOݯQu࠻T3 Uˏ]vDr9ctPZ~bǞ:-? :,m:+?wlA\9)>Ma]AVAU)}Uʑőm.wJ#uS!lA)GkOnTI.yIkOlA*)A)J~*oXTN AX0\ `tbKj;XF' fK*ż`v'˜;)cEP'e,Ep"h0;ZR'RFG tˣEP'e,NXh1(-^p"hrfGH1hY]hĎrŠr|Lcaj3pԅū/p/->= w})-wؖE0[SC"n0[MtL-BW vscjY,YwbF7  ],"b.%ر`[n;/OjߡJ;k?d2V"dV^э̒JF7vAgC0Z4eB-+`i/,㛿ؖelgIPYdhP",bA"],=X Fp"hܲxZIJe"ek0Z-[֖/q1e/ds&ËtBˋ *L/VEp2Ep"c|rX_ĢEP"~p"x_FP#-0b<0[&Ӳ FA-'F0{a\aaĶ0pq 1j9a0[^-3Fl3؎F(b#FP#1ňmbl1b/d{5fB-O)Fp#l1ja1ԱĈEO)Fp#e gqƈmYc1[-w`c3n9dEFbd\2&#}2e/UF(zeu2b-)=`af=nj`L2,-vAI]2 px] ˌyf&fs]5. 203cFp2#6d%rόQ3HJŒ f>Ė0#%3%af11(bf<w-f@=V4>,z@.YczB`j[B`9oL h@3~f h&f03_ @sB*fx!x%P}"T@c%@#A(BFP+L0+4J)Ѕ@a&MBZu+4XyW(4Q(4KG B*$X!ѤDJ&F K4~;_%A,xIPSfҌ2cB'F%ͬ(bi&]fVY;By\H3ǁO+A*#3,Ϥ-@#e䨄{&B͗,Ԥ9bc@F 6P Tl{F%xkPɕ` fƗBu_@I5z*1kոmzYzj+5bPPO^ӤkK(6b[f[V™`VlSYÓAbzfA9n)7)7[ʍ`Tn-F0*7Zʍ`PnN'gBr3!Pl&Jmyu۫7B0圉ᜳXs&r&fca7fAo&&5 fs9f㧧`7K|{o6"lܑ9%Oz(cs6VN`)lBK'Lp+L0皍_[fsʹKF$t3AnvWYfN7fM"kfEfpWfV2fl a 4gr&Gef=Sd`QfOreO52TswEM0 3*2VN`0" ͦZafd0f޻EW2&.e2(/s.2{nTeVXf}eEvj0g.CxY"8~Ur3CAٔ<O)F9Z$9Qfff/Yf f02WfٽVd 3^1Z@ٔ4B٩\474Fb 2pUQf"f.Ekf\DYgfd4DfHS)T"̟zq&#|Tg^눳@Y@Ef/L0'-hfzfb9lEi&i&3Yifﶘivg l3Am6!4ęfkZf.24 fj` 6;_~3A3q6 8fy;zffL"댘uF0ZgufB`[e>n`9LXd&.A-k୓]&c۲ ]&]&1.eZ-K%f2K'Lp#eܲ2p #LƘ(e2dv 2b[3` g|m9] 2(#2QFp(#e6QFl(#e1ʈmeQFP(#ep(#xeQFP(#e&e&e&(s.ep0# 3ZL3q"sFp+n tf^rA#7 -f=`tt-FhG#s&pE#x! tؓr[HE#\ĝYV.c;&F hL41LP=#3jŝ L@=`V1gvl3[[6#ca̙WgܲFی Leܲ& gt2[vhԱˈm ne 8 vā.3! 6ږ=f={=F0c̄Zc11l@loG/L0cqGi|m9ܲF bL#eR.3V]fJS6sEa}fBh="xCLڸ}FBgUgƉ3>#G,h/ 4N0iHӧ0mH34FCj0@Lz(2`bL 68{/ 3dafBl{U(paI%QFeCF AfBlG*c1G1"C4 0.1> G=?X;Lᇱ Ɵ^z+?}0^ ÜK_̹d̹'3?f?43!b_LjbuDE̩dB@O4/s{͏21K^fB<ŒwF :&6x?F<⤙Oc/4|҈A+͘bIF#]',h *]442ќE/ 4bIF8[GGXyGcЈXhĖlq-Y܎f-؎FlC#B;gqm9gv3b`xVcb K1dS8gdߌ= ی5]3v.{fXv؜3G2b.n۱IYqC[^dS8eűOƫ68 &/=2v +2b Lje{=戲9f9S7pS֘Ȳ3H+1VclayYvts@ G̑$;tO+Q4'leq03` /q-b+t8K I6` ˱8|Z5{/-0b s|`x5#]02 _ v-*q[ --XrbRy^.,/V=tsbl$ ߋ ee{6E^]b3pIi]+^UY]_zN%E,[ĐE c}SX]v.-.VgE>F sM.qtmr  .bM(-6,nSπyA{FdTT,'Q>I<(˷RJ02^pKE2"IpGIےR\h)^2)J9eBj )YIH)i)"n)[zkAe20),2`Q&T'6rզVOJZi,vVbʑ-/ԔɴdB!EPGIRz %m)YNTw ni+ qJ.7)_WE,$%ni-[bke2-eWgEPKi R˄Z"f:r .`VZR5Xj-E0-bFPZv{/AL#,b[B"ZAElKn\-r=z‹ؖ"% rǂܱXm[OSw‹"`wDL%n/ ;A$ 4 2!P]N=yct L1( \|zD E(.:ؖ"nI/[ˀY|ו a-%F0H1ji00[*`at-!F0*1ZR`bb#%n19ul̓JLcjXNKԱ u|yNK aR؄ mlB26~2vc'm,`LK}icע6&H9mLk`N?SX@66!Nv,}0L h T+e,`NTc26~;1C1cLb`;06!N[DH&}R$m6VEnk)S#Cw)泀"łHSM1Z,  r9[zżd1/{-3即RaX@-z|b=fh--6?# 1_d10c7"b, cpĘwo1USU18 |(jl~~c%c()#njı qm9i֦*iۅIcc4'ـUQc8j,rԘM*j,56稱0jl8i/Ic+IV$1j̟Uj0ECQcqԘEM33⌱31kZ1k5gݭ(c\ _3U֘4f+8i, HIcQX@4IcqҘ!&IcPҘ"i'y4f(LP#a,NX0wc0oE˜?)alB,Z$y])YlB(vn$MD$1om$IbQX@$6!H'*9oL :9l2߭0=N {Mc*m/b2!BzH0 bKj& bdw\& e2~Ln F{O2޲Y {˸}eiahs66Le(0ecQ\Pl.Zl."es̙a> vAlwY+Mq 6 df@s1m.>2!aՐ-"-ׁUoYfw+[ҌbG b_K1,L-|-Kf_GkI%E Z{ __}-/"|t no- .vDio1--nW@wn?+,1CbWy\]qĉbDfpevI%U.vUf[! 4l$˄ybO/ eB4bw}ar.T2\% pσr9AnpݒJFw r H*c^E!c>^ rAˀ*pxſ% {X^!F ž~A-E.+K+]72]&>9e L--:ew< |.˳~4wI3ȶ {Č)]],*1b%f` S FE&w+2P Vd}ȌGV`RdrnZ(2uFȤ1pL*1PYSY9LJT3POR`i)0[ `P`*k-F0)0bXl ( Ƨ K0 `1/1%F,*1PQbĶ-%f=%FpKRbL%A(T ̑ 0#n^ L\xlK: /=E0/* L%n /Qx^JzYnڋ`e0K/‹xWʋ uSyʋ LR\pn).[ˀ{A E(R^aeV{2!V\1b_KƩP\RɠKn)/9_̻V`&çZ(0R`WWQt]M%FpKJ#[ȈAEf@1KGRdEFlKRdsY*/)n#ʌ Vf"efBbEf2B])31PfqY+(41A͊̀ Eƻotϸ^v:2@ TaY<$Mu$ AD&ULp+L0'j`?),J"pD6D6!N [8L$ͅC0' L"[SWa -DvQ% $$60Lnb9l ,2 ,2/qjӆ=Tp7vEK02}00MRp WSa L!wgB1d9,fCk1lcRq !=9dw{9d S!K0Y1d 2ŐMR'\Ǐ1d~[1d^ !Ǐy])~4^E MǞ61{ Ǧ"SR58lwSn1L`H!K\Ǹ"sa N"bM*2G9PbP 1dQĐ㮈!'YC ŐM|cc֙>_J2/CqY! _Ew>fzU0CK%c  ŏH1d*qd>^G&|8Lő8qd֋Ew9W#˟zdb1?bd%GYK%s. %K\ ='"gKv.A>Y~X䔥9ed)9e ,bżs9>Ve^2 -;}/L0Mrf>kFu|횙 e[\EpL2c[&]2-#2-sjf4kp5#]3%\32-3d断 vbbpܭ-se^p/K[|ֲkF*`r͈5y'ke=(3uB3E F f|Af72tm9]a KFfc gM:kI@QfbQCs vxQf fGSaA-)4Zi ӷ2Ԭf:~ *,̖R(jfR`4r^G]EwMnk֫5LA讱pe'Pa k&b[5\5pBwzo:krg&M5Of6K43aQ b/4_4dB/wT񫓗fB9_4>PKc4bJ3 ~eg+`Lc&[h`e* ̄0̿Al ʡfb },4~T2Zha 7KuD Фf@dZg|^d[fƚ`2?& \1f0 #/K0w l.%0se ,,bȹ V~`Ц2p`̵E;P\PI0 8~ l";D B``d ` #yaw`1vc0`|}C 6F0%#tb B .Y"V`J1pRC|b. $&` X"A+`  8 Ƈ`!p7` >.!B0U ZN` 1!0$N1d@f!`m 0ނ`R Z N1h `6 A`$ zs``0?? }mo\ovz_~ >X 󃁽` mv{GuO lx탡SڃWz[n,lie$`:" <bH>ӑu{qK{@m7"`>Lݩ΁ipk{.= ڞ mm?[s[܃i"!C0om77/_ol:Xڜ  m}nu-6?m$xcW[h_{@űukS= key_/1žvo}0kQ}>_}ݻSvb_ok{6"nٽx@ݟ=n[⸥= ҞV?YejT{Uej^Oy/=ʫu}BGn/6n0n`u #)X[l`O ~WVmQ v{ TTm/2FT2bGTAVx+@V < _vd< ߹MV n?VxK{@bK{αrwU{w ADj Vm7j#UTƱbYĪͧȪ͘wYw`Vm@pK/ ҸM*LxDDj3!Tk @Cx|w@ 5>MzjݻM*ki^wcHx-X[mx̺j.6MXoDGd,67/#W7^2 6BF5XYlrƽkg"c;)DZwB b͹NQ,Sm|yl# F07M9or;DqߩN8BY ' Él(l"Y1&b=nJY =gBӬ$z:Zd= .BvY9 S0OkVaD΂3N QBdWo#5=L"Jf '=+ ~L#5AؒN QCP#(X>޿zqD7∂#S-:D+q^gp]k8ڍWn8""g@GSE1G$ě -J_őވm7[z#o_ 靪' B?*G|@ PmK̈́PZ՚EBF5\U`Q># ܿkvuxw*"C!\G- j5X 0 #K`<[`<[xtw.:#st`>; .%!͕N0ᝫHa<;WҒ#s/:;Mޫ-F0-F,D2ͷ/|6P))&/}p3#l'A47Ny:]8;LOA|Dő~UGz[5#g#`>;LQQc Pq7~[9QS2uR !`nbqpW#⃻71* <˃uZ0n[իs9VyyO|^m7®ƒ}ĪoBhSV@xdw*m53#Sn+8 Gpuf=+3)T}jݩdHʏn\r,T0m#Y޹u ܮU(YkTq?'ZG{9;`J b`W@|7m) 4  ĂPq_::;7'g{?R8?Nr(Y@JŒDdYA8;]sY!cSL|yJ6 l3AnCfAi8L}[t6t&2Zg*#p&p6X̥L0[eƏc33l `H۲ VuFay58,rx/BsV Zi|4[V-+`8;FpB#epB#e  u3b;lPygȳ<33#=33#=3Z-όgf-όXxˌؖeFp2#2[V2UFp*#eܲnYe2;V-̀{VhV]<ԲnXd,2[oiA-EFp"#eܲnXdڳF :԰XcĢ5FP#claۿXcĂ5fB-K%Fp#eܲ -1b#cA-K`Xb܂zV+ؖFp #e V fJ2 3Fp #O*,1cܲ&K -1%Fp#eܱĈeKb*%fh h&0 #éf>hڊ@Tc_ڊ@3GvoXaIk̹axw.2`ty6NYgcY.yE ͘7j#Ĵ Pm&j Pk&*XNˁfPRg-uF03:# ՙ4){`RRLcgV`Hۂ1l*s EE KN!PB2:MA؄1%1:.R|Աׂ"v,cV.1A;c|1UcvKq խHKum% 1A<&E& *ǼDLc>>EbwR=f7I=vlX=fO"{LP=Z=cו^ [eȕd!lB>fb9,Uu 2A6!Nc6i{cJcM"}UKT21E Rd vlB7f76!墊6sΘ1czU٘rΘ(njJp̘7[3f?u1A361ch1cVŌ ˳Hr)mlB 勔1D)c92&S679elM%sʘq282?>ic m|yLcHcUS*}H۬(m\2cdH_1}\2 S]id lB+^Y6X }4P4*T.r24 -Clo [9X6 A|q2XH,:\\Nh-ewXۏ%K0`m h,Z:~o26إjl2X<\ /e[7}-olkYwjَ0A#O|,Z[1cgnF2v;vYalYs}-LakَWK4[ޖe0lyXv4*VZŖ(\-^.Zæ+ --Gh/ -ʼn,n9Xt ,v^%:Y 1{(cli9lh1,A3yYF0ӫpǥ0r26_xY>e+Y9YVcw [rrS l,4Xvx=baa=,vO%JZ qկ\,βRyX\x`9>K ~CaW G_\Эrj.VRY:7[XWU@-{l[I`׊io²2r|#lX Ysɶ UfUe!8U| J.m+Yеr[V+ئieY%-+%p^6PU_ Ѯr*\+Ye0U/hU *˅Ožu6$Y )MIFk`v 76|3J ]ù_>5 wW_?JwW%W% ^ GeBMĢ7% ޔơ|/7e))䝼)ߏ`;M7ZM0xSB"<*=L^ث]^«(*>-JJUmbW%4`ٳnyVxVʄ^`٫\Ue*Z^^`ɫyU"J@WźU UL^:^ɫPǫ0{U|浼*/ JU U U U *W%WEpǫ,yUxU&J@JJJʀ{^ɫPǫpǫpǫpǫpǫpǫ"U *5*v*7*W%W%Xؔm9U^Pélǩ0;Uw*w*w*w*ɩ 9U8U&J@ JJ JS%کhǩpǩpǩpǩ09UtqLNȩPǩpǩpT TNvXo*w*7*Sŗ©x٩*SeG@TCNsX9UbS% v|A©b?*|SeBJJJP/PDS];N`r1tĎ1e!ѳ2X0LN` m*=S *熠c;,+saL'ĦݪZVSB0Vd nW8W wejF+,w cXRrn-,,>a&cb ],Xd"Gl}BKdYf+rNhZBfwNc!.,,6ܼYdTXYd/_,% ~ C I-[ OO/\-%5 |-lQX\6H[*KLc•)*+%-&̾T2cY9cn#gL0d 1昀c@=T0cwS񅜏v8+_]dvɬ<>1h 2hD^,Ӯ:ź2ivc&4c?+̧-LLLLl/wz zI'L@7,4g*3>3^3.T.s줱l^TW<%i|~q+FY8`qR< F1G9 /Oco,H b sL f1g(YyX!ddsƫؖ3Be1G(hb st P|yur$hIl!<^P#QgB,9Ŝɠ#3#% 'n8Q2jC2@ldQPOܑqĂs.A /ߒuz]YWulN*UA-UGpKRuSu/ UG,:˥#n;Aݙе33#Ԝ<0:b56ߕslXc9j8[:#fFqXs&:N*8^STrfV Bqv8QűeRqTqJfun8 Ǻe1 w#AA̙8t3{n7;؎|#羽|#%FFе|3E#eo<8@9ױ%f9g96L咚s=UG0::;XVu^ Vu UnVufW"-}Du'TGjO*՞j}۬ŒALT Q|T0?}J\sUqCߝŖ|_=|_=r =\.ȟp?i~~s!? %|)*v |%.v|C_e՞TeޢR[OEoD Kpk,+ „%A%?5oO{S$hO|{m;^aށK) i](vR;Ӕdq?!<F 7?Ytݞ-hŽ`bͥ+ %XthC}Cm!C<qCjJ-P|u<\s_ :ܗ\s_bsͽ\<<57OǛ)盧ɜr1>O\rsx FNj <<=7|sR8`6\9i"_LZc?ty><%g3J~l] 6]b1:IF' fB hA2 i,صI9bm-F05XYaFlKp!ܬ]Xb kN7QOmh3Q Gͩ}=FpKKF&ՂT otl`o| Ƨ<7S08:2Xq|(Hƙ-9g=9GpGYSP2735-f=FpKܒo|Jf&d-fl GOܒmd-FpK JӒkܓk-F05Zr\#FkcMF05wAڎl#mnl06m7n7b[`oε-AF,7Z|3|#x!FPGےo|#s5PhI9\/1,bSH8%{Ff~= p|*$_ZXpXѷy,v73U &$_5 KnI:[##mI:I:#%nI:;XtCN~ɮ_{΀IEę vv/ZޓxēJFGPKpOh@9=#9MK;&$ؓsۋ5A q?*8uQ<<=ۊ5g9k^ N^k.k^. ܵ(omB&<笥$YeydbN@ 檍L60Om,SZ@`9ב ;c</sbV\WV"U؎UGpa~V4d9-ѲƂ-;l~FN*-;}PǪ0ZuhyxU,ZurlICp f{ShUd :ت3^nĵآ݊Ǿ *9lYlIk`ty5!`6x ׵0&T 6jI'kd6뤒٬B0uY'2fC٪+#[urѪ3~LV Zug;lIZXu ew*ub? ߱Qg|:v3TFi0u>dU :hGh\`ؙcoI3^њ3!؄aKN@hɱʖ͖ؒ|a1t69_X+c=d cN.bCN<rl5{,WƜT0s&DАղ0/!\2s0 KƜɠ!'U0Ɔ/`T 3Grʘ"c΄([- 4F 4 "`2GF )6N ΄x?[ƛ` =0K- 6Ú 7IYj& Ehh{hql6/6 P$yy/)jQ BM@dIolI@M@l1bеfG,Xm&Db3`[lRC-6^lYm̈́jMM`Mpj0Zm"c\XmO\l i\2[o|L Mo|oo&Ա̶m7TW<|ƓfBh"6N`M*m7RpfBdѫX藜`vD v bӄm6>N&L6f.6 a7Ta+kҨT פj&T2kR` m5iV_Vql1M5hH`iA;>>4SN: f Ɵnl&DQhcCcsm[YhRB#aJ0[hVC3!d坱>L<3yTޙTWĒ3ʞ<{f.GL^?; Sd%w& Τ˳w]L=3ށ;KFN F×ΜKF)\0zhRC ࡙&|?*O=5& Ԥ r֤iA䭙BxԤƳ&ͩ&Xyj&^TL<4or;uxI7̈́E/\4&>TW>8hEE>G#}4_ }4ަP7`F FpszKYicUBN*r!xEfZ*!m :)3-#lKp!ֹ#iQfZ@,Vuk!x\7S,j 7YY,܌Q`F 7C1:nz`np*np{( n;Qq,ܤQM< 7Xh7TBQe&M.\2 7dnrɜ\8>ZO΄PG,ݤtҍ nİtQ-B"fB(b.ʒi%%Ũ$[(6֧bc`!"%OY$wƞY%UҍTg+cb&#1L=ZN*p|cY@(زT 76Y 7[ F 7~p\='n%ं), n&Ă/˂ᰳXB߰,R5.j\0 5ۇbfBؙfR{XL}V 4ޞBI%@Ӆ.$М&ms'fBP##Ԉm 5QjP#KQ!sl|"d(B.ޓk\3!iLm.TGj&iڱP3 jPcwF!xYBͼ3>Dgb8l4Z0hd@`BK%cWB)\2́hcn @4Aˁh6"mZh>E DK%s rhh>D D|@Uݽaׁh qUb6!>೩ 4z@hډ'/s~ \0MAڄ CEb@K=h8-ՙr50-hK\2h~hՙ&t3 9,Օe}&p(9"̻W0nsOς9P@ׇ"͞NEH@?L@`NBKU$n0'&*yhØ&>V"R*_LE˷Q*hdNGu&hJUhVhBP墥j`. EsʹhL-rr&sq./˹hEK%s.}r\s+R-8m!-2rv0'-ՂsRa^ڹdMܴ@Mu4lMPMvQnک]6NnXMMi4G妝K4UNPK?T2f t"C{2&i0=-HOKu40v0v*a&1OM+ZrF &[Q9j؆3O0 ̈́vRn&̶q f͘;x#7!7wBx3xt7>li>`Ǡ0x_6x'Tkp 8h_P 8 8|0ܭ]don֭d9A+9Mlˀ# 8؀3 8W{FhIGGqш#8>]zF83!NNKop 8[-`LNPa+75Erfk|π# 8lyXGе lĹ0xɅǻ3R!Gr5\p˒#eܱ|UMO'Gp˓#nyr<9yr<9ѓ#\{rD<9[-O΀{ قRxsljzs9[k{I`=h٣/͐5jR^ՖL=:Z_?أ n 0TVV`"Lk SABggB[ǫ#:>m8Lm@&hxscZjyt&eoY7G{sU {s7ǾOUɛ3!AIGW v _G/GrN "΄ؗꈾA)Gٟ#9>= W9>TtOG tFOgB`L|9B?8΄3.A0o -7^cLl7bOn=UmSh mNnfj̶ݫA1`f M@do~'̈́vĶ|u\-`ԳL6;`Bۍ L6'n/%fMjua>gM.6d7rRmR5nPf#xlf~J v l6[6hD61-̀{6-`L5jjƗܞFpX WƚÅf15BGM<;j*GͲ̎{m/5>MO`9ޚ 5<5B;۵fBIMG/fwxv䥠ˎ{2UT2:j&_08j&N{_,4I3-GF08j&N<9i&qЈeMzA#4OAcA3!rΤs&u9g&4uEL.y#Ln:f.$i (3s&`I#̩[vB vN報\I%>RV M:hZ8hA#4NTWvҤ '74>q*'NA褱ƫJNsUQ3}1] ]Fе.3}fBb]ˮ e,meYF2XSG02c ̹dgQяx-uf7Ys8ZrX㓆,٤ ld#%"!B̈́@'QH4>2E"Z*%$L4:f|8 iƗ3f4HfZ0H3]K4QIU.E!xT#A,#iOY񥗥{,}XH5XIgPjEFPc\5,(A(HRMjJ5PIZĞyU Z5XW!#kaPI&qfB-QF02(Q_e8tO LD 3!aRYED{CfB,v,S`c_* {`RɬGJwJ`&K38, .epj",AZ(R˼Ej٧ÔZ"Ej?2_1Բ\gL-uԲ l2R捧rXie \GN+:ieUV 22MSrU1,_Sr)ed>1, L'KUtxL' &dѐJvZr(,)ei} Q:Y@t`1>p8Y@N6!%#fd,2"91lBE.OYdAY@E5FdE#N.REvj&7* @('RG׆8 a .v!dB0llKV1tE ]N#]rz9eL%6o^[^czb&4ȲGX_^o?Z]tś2e0XL"[D&M.'`z<6p'`1L%kK n/e?v'{[|֖/[ŋ%[pC`n,[\\%rL2хftaw%6ؘr Z]S8]-lt>"K0dobs-->&-vi6\YluB;pͦ85 O=2IJ~W4>cidbC ]Tzd ;W#YW#YVobl[`ЬMJeś͎CaX9_v㣭V f`أʩT9.lT Tr5[bbH;>]`+ce~,Y= gYW{E W]/+^.9W\W~^aW[%Na)la6:`0Vay%gE(ZVIeY[WcT.W+VA})*oWž!Vqaֳak@v1VZY;*b0&̚†TMj]E U|~p0_=+bȲ[VXID{eʄ*b2!0L*{CeB`MYR Kw [RRlIyZْ;M0[ReG;Rn^pˑ2‘2 fGW,):֔T2ZS()wo {SRo7A SzlN79g1Sİ9{)kjS֮œ2^?9ES9e攧œ2 lNl$sinI%&1lRN` 0>٬riRUVoKɶ2! xɮr"V&v MdW9ݒl[Im϶XmeBhWvӴe[[VF"JSW>MA_9},| 6ZEYrU#AjYR͒f ' Xb TE2X.4AьfEFj4 . hFcW43H%Jcm4APKQgĶԙ̶\3VBBY+ԙ7ՙxΜ:T l63&mF k3_Zf:7`fV/f7 ќKF&ZV3!hO0k4 ;4&BZV# 4KÀ h"F4 6snk4>8PLh3˓F3(L46F a ̀ 0~ qX. ْLZ nӲ`hsR``V`콸P`r5XWJ'J,^ V`l P`+FF*0P{ KByʋbOBygESyK+/}j%?PPKyR^"A-Ep+8lS{V`wc}^(0#Z9UPbJ1"@,bZ"# Pdʊ PdOJ2#TB7Vfʌ-,biTH36X/E˜ dBE&UdYj2J*bXB cdhFcx*&]hH׭"eLuجX j% ƨ1A1R؄ flB/Y|Ok%M;bb[b nŋ |1A06!NE ne p1/N=E1cj 怱D0'}cb8c{[2z'1c`1hLu9vcs+:6`c>n&gOK3 EY.*"ͼ l2f&I3܊33fN6fd 7fjŚ \3l7TlE ^:f[f!Њ9[9Ag%&Ԋ80g j mŜ 䜉堳T0Djg^^`< =N=P+L0 j ij8LP'Ll+Lp+L0ǝ_ssY*/k/dC3/4*<5S#=5:<5S3!h=WF0j%w5k5[w&]5Z׮ɀ& vѤ!i0 7?{n7Mcns v*\5vF,j&AgA-Ẁ{AWXv3A-7fqӈmifByߗ+\4]4j࢙rM#4hK.S{M#4f14 7u9iU-7̀ 7f%4M3L9rnk5;5kw͹Fpe#]6C|]ĂfBA.\6]6Xe#\6U0mr-mٌ(6w2m3S0m*\6O+]6{]6e7l&]k5]3F0j&nAnEs꿞F0i`vӤ4MDn19U̮_qU#]5䪙qnif9\iƞ/nyivK3!A塱7CJnyhFzh^izh<4[{6fBXΤw&3>;ex ׂ3bό{f(gƟNg& SɅw3b;sC[xh~/<4dМKF/x- /M*4qcO L4>K3Txgg;ޙwFl᝱W;s̹d[{h[v:w4ǒ,ɽM5,E|L\fvCc94b)x:34Ӷ>f5#@;?;ؚ;;Ț96 g:3)uygMJbə ,94ec,#cAXfXF02FI,#cAXF$;e4p1zBL#c!]) +4?sLc/fR\S\c/)w;PkQ\ck޾_9C\c7Tyf1mḦm㚶_؍$5~&MAkAq_:)rm>26~ Mcy/74mbF$Y, MA״C\s\mql'Mmt7GQ|#x߈7G`>4m̱Ql#xۈFФL,6~FgbG͂g`Loaz#hވu 8();ĩIj#vFPHm L碳}PBff%gJm>;Ib.$mj`'\r{JgbIbCb̦f>.tm+lB?.Qfnk63i/evvߏ b?Wm \\~&{ll$ֲuCio22ol,{^o~]^+o2[~s(-{\;@ef_T2W&j63i'Kdb&db;l(e;zK=e2_Rf 2CEo@Af>;J'e d6n('0vjP#,$C9mdbu\Rue]d6*]W{p 5[6cu<Ccv¥ⱷ6qv c9WREc~1;ڡ^̗q.X.] b6b>M.{ضWb-6>M ׁ L w">,|Xh볅N~dC N6DɆX:Y<&dC$lyA:%&哛재sM0'bė哧D>K0'> s`mdQ2J(m5PF񁃌:)e(K`R^~VRe{ Җ_CJ`OEҦjqPS>27=`PI))C,+)~I!PR  f)(((&eC|}6I!j*'m#d÷IAlhlU?ЂA9)jr rjPN|P9('j{Y5;llhI#؆'`4mU{OH=jb f O6 IrR̤l fgzRM:OAj'7YL raĪA5&&~LT͂jR5mՒ6EPK bď&)%JKPI|X%*I;@nE>2*%}dRJRR$bď6m B +$~Fc[gĠ3($F0QH6 }J jB!VH|lcPHC!٣$Xisd{7Ȇ#6'~mK_yG6x}m MJޏ׿?g@" uVED8$=NYHGlY GlYQ*A@N\#dA!y!$)c?Kh+E.9H*V"2 W"Ē(;%O_ γUGFMy%Gf`VK~n(l3D0%/C0&m4i#jr\K?plb'xr+(zr,>9($ OڕyPνGE(~ҶdMT0(bBRrn }̊.@IEPtUadHJ1*O{OƊ-\PVbwbV<+mdW Xr@ TW]<+~"賾oIc[mY|Yd*K[಴eewm%}A, +-T  ͬbg'8lr ]dE.J"ŗ6G0_͏F,H0:L{AȈJ{ I1~ d| [0vdlђi'MƎ2)?I),s

231c[LzpflؚYw?):bx#A˶ٍ n ׎#A5~'`lqf3u&e6 &'8~˽_>Te, _ܴ5t-6$7!i#>0DLl:J$4~BBgiHh2AdAXD&cgdGɌ`Nf4d]!gɌd Ld*$2,ˉL9-e0,!l@aT%SSCS9y8I Ue8i[Ƕ2AeC¼>j8gY;{d>&[aK l)e#[aK j)kG-eA;YAJ56dc- %kkqՒ-8Ԓ G0֒ip-VZ 6un#kmdw6nj!VB&KqB~L ԏĵcm?vL/s ڱovLrڱ>ϵc`XnL0ԍ5c‚nv+kAرT7v֎vL,kǔڱvS92֏`s Y[ !?s#+츰sq-,Mkv@d}'+kj|TKVԑ+ŵdLC-YA\G?.#E0Ԓudm\Hfo¡gudo/  {74bJq]}_sXA1P;VPE)fAXA\3׌k9~Ѿ c/ٷc혿_+cڱnM1r<׍`4Ս5c//s͘ +oT3v,ck;Duc4 X19_7P;vU1X; Cث֎ ڱycm\;w ڱE ߮v͑kRq ?Zߎ9׏9b #B" c}7c}P>vYΤJ}cf6Kf,7n1wdn(bk"RrYp\#Er<\Ģ"hdY.'bgr<\>j&EY.br4%<%[r KA>2bjyiz^vRjYpS>0o!hbW햾y[h/mϠ"?kҦv [2AlcE ?l2mg̬EjYL0[-lXޙ"xdfGnQo`[ bY-G=dG=dj;#[L0Z.F"-;rgz]"]h;ɬL,X/%.v)-&'a˥[.rKA#Enc1vLK[{] bů"-AhBůu\q4 b˥͑-_YϖK1lγ1#Er<\Ģ_FFEDsY,i.TS ?w)\]p{Y{cpL.F`]MD\0[gEDx;^cC^4ϟO^x3D K` 犒 s;1؉YW`vb~|B' 3%fAY/Qi % ta T<0mQI9*(1m#؉ى)F,1؍Y/jэy#7F01mnLeG#S1ǀ`tdɑ)S֊EGF:2БL#;2_>2:2#S1>Wrc b'Ưc`tb%'8b/ݘvnL1~S91b؉e N91Dz7oƜ##92M>2 :rre젠+Si`vf}dtf%Y3Oњ֌~$kh͜#=#=6hA gTٞ{nh[4@ْMӦ6 iM*Y5ml*U?d69Uj b^06`iɪ95ŰUk?K%-2Y6]#cYg`l 5'vؑ]`+5UO`tdՈE`jSjTӶR j|LARZF26>06Ha# Al`ӧ ld0lbF 6mlش`։߁~k]bQم_aYE,5>.5kbzi~llòRc ſc?k?ŲVcs f3`l,DI~JsL> 4x3b'ڌXf|fΈ3b'bGɯÈ8oH4b١ytbdhҬwX0뮱Fӆ%F K4_K 10QbI {36яˆekƮDf (30vA3v>#uYŦNK?Am(-6.-bPlM7ZY-߽s:J?"{B!)FYQ"x!!bh62,~F d4mx˜4 YRE(g< Zc"h=&x-GiQ"xAY \qXۯIuB6KctmsE.clhX".:·R'Yf1 um1tmxAaNdy92f3>e gYpJ#h $ksO$̤L,|F4M:6< hNF0f4&!b?[ƸXn c,5?> l $5b!)3(1 ic$5b~lC~N\YiMR!1bvl߭q؆vl3\;Y0)rXh\4"̴ռ ef=IR۷Rl,<}Tcs& iČd#F0v/Q,ռ.6k%LRj BFHUdm9I)e<4ǡR,;,մ9T#?T7 Fj\^2A,A2 j2 Ӝ#j΁Gr͂gr\# acQeQgL#x$£2ԼJGF_Rck JM},1޴!)SYY06 ׀Bڬ<cl~Wx2$QF6~o !yW96(ñv>6^d~KfF06b mAC2!y95D !n p pacWQpHN[)p|gC#FN38`p#h4F06>26~F ́! M626mdl 9 80y;Pp/഻8l nT9i[এ nap#?=0?CpG<7Fh8Q`#6UlA'w(6w[)h8iǤF'5>RqT#pBdi89D5yjaT9i[ǒ4AѬͿ~A$M璴+ m R WЎ)R)92jh>s;ZA\v k;E[0ע|}̵h> E۹XhG;7h}hިMШM0`,GGT& rm}Z0O0`(G+J`)j(ER4'K邩Lhb ,ERPVb  r q)Z|(ECϥhs)Z[2*E;V R4} h QZRZAXĬM0=JU2412sZ[P@ehPv R4?]M]c)2 C}ۈ\vuh y?o]o]XV-=9y Eh/P淎T֦ EhnT|L,g g~3\|֦g>h™ |Tv"62Eh "v"v,M3_<= *@kScTvhDžh}d(D;Gbv*@1Z1XPKhTfb4G'hb,PVסهP&|ͯrCOMCZA\s Eh\& c/M>܄&ڈЄv܈&,C!ZAPv@Pg}Vge/ԙf% &905Yl0j|`2j b7&ͺ?FM14jH̄PB056 j  ?u "͏Ehq-hmP#AYю`A=hP2u;hAy^/uiΑIZ^V h5//ja`j` iN?4mG:`i64k3Ű.e ̗Ou?A.cL,h3 b}ϴͳ>#>/L:k3v+LL62k3md9[2&=gbPĚ߀&c$MCsGF]&] d|X d&N dKu6pe|̓.k#4Pq'ҌXf4#33mdg ,bymA l(H3D,biƏI3,戲 eڈ l%A(ػVpd|ά, /2ЕP Ve~|BUF2xAS ̦̺WfSf]єĦ2~f̂(,{2> deM L_5ef[Wd6.26_ve\ʼzNqteİ+ʨ M02+L`φL%3bٔĦӏ̦̔4`e6k̚Y#Ff_bdF̨ FMA#F04~IoKM>04 &MLР;ͱd;24r&9 6j!&5e%5>5 &O14>`J&MM?9N`,QcPQi bƟI#F,4>.4?H#EnDA,GӶ}  hѣ1x4yhG#=ّG#<~NrieF4>4΂Ks,95;85f3>#6L?K!vj^4be_Ei "fC,>7~ 93'f'l13"{fCl4 ~f; gh64f6< 5e@fؚ&?Bɏ͆'?Ba -V*2~HɖP,ϴ)---ae|gY3+kdl_:f Ē0茠`ivL<1B;lǴ;zcvL1;8?gm-2~NsmviisisVf~g$[3bk6{'k2tM]ll;qҏM8c3kUg`ϜSX4X4fƏ- ES /g6 MAlϴo`3~ Ц47{~tfÓ0̆>[4A{fC03"{fC`G/،ChѴx3Eq3f_F?>GYh,أyGs>͆أp;ɧi fC<1 Wɏl M~flh#4&Fz5fY)W(5k62>2_b!)A c ##*r #A!c@sV6(< fĎZ3C9Ip.#sA:rjf$Y,2(4cs[#acWILj89y;́.-%2vfq #1S S1O;̏,LQ #A@F(́LR!C vjȅ624md h4/ O9l#&5`5fm)AMjj膠/Դ̏EjԴ9sCPc~9y< 栦͕۷z CPo)#ug~亳 Q`z=96m8՞mgÁM(́Xl M6~S7G`n F6ςF,58[~jOAMAš3"58 50D5g14p_!#`NȌQ0#v3lC9ā12s @Ǝ, 9gf|`F3A sPf!9΅Qن!9FF5ԴsP+u,^5P&ֶJgbL lL thzԀh> rٺ)-Ύq̖[J˝gy˝g67L,f\w^, `Ǚ™bř~qfUU2Xj:l#ofG IX.7{\wvpٗlf'^dZp/q7W! Mf>.mXR}ٱmn1q fv W MfǸXhF}fs?P̗+2 fvhevB}^1.el3XR²DX->TCm=RkƅҲzRuV|\.._[+S6%eQw|LMs]>Jˮ/"瀕e>.6EEe24Ԕm6d}i|m^l#GPGfFfq*# tULX"[5m lwl3P;h c~tCŘ=!CØ!p?aIOQϘP]15j%cmc6P10Ʈ`L ^L B9uc\h _l3+ACmbM1ՉRfEuwgY`V>HZҊQ`VRФ=l$+C9MLML0 I+?K+ŌdG`U"h*ЉXUHW4U]͠Dg]"4Utt#]E㳮rY[9+Q_˧:W砱G"xi,QcYLc|?f`W}aBW 4_^Xbc46gXYcs=h,o>bX꣙`YnbQYڜQgGbYvti&Ŏ ,R+v}E+vARH[ڊ Mt3vXWӂtXSS8h*mȬbTk#r<Ai##MA´ s,/I1\َi#~O#2~CC*S;2~ ad*!kpj*$ iGФմ̓WsBll` Ŧ pk ء`״9^s2H9FfF*7ܴts75߫#I'X|^>0G>mQM`|_߂9i#OKϱ#?CTD?zOĎ"Ϫsge>ASg_888mQUQW` p)5 pg5 U 2 pFШL(Y07&`*3*A222b0MAN`Ư̴`o'lA28[zdµe )ps ^ X ^9b ^v "3߯s90p`qc5-cQ`^Rq#ŗAwhVk&?OCbzGEФL,/mq9 kOjb =4= gyRY Q Q Q `A;G:ЎUբ-xV&xT&ka-Q-`E V4CX%*G;u u ^ъN4A؉q#z[phD{ȡeCh}nB+.]04 h/p hm`n@{ hǎ<5gmlCxV7҄3?@tV7=|pV4f F3}|F3Ah/Ѭ-vh4ڢsY_j4Ǎf f:Ѭ=B˖949CYAdK1k2Mf:SY55}ɬ n0(5AY԰ɬ h0|@05MfTNh#s6EKf@ٱOj4;w6fq(h4+AYA` f6B fqsFBsssYۯ\fe~Ke~1D fdj2;fh&Ѭ l2k ̎S,4·F3 &3Ad}Mzsc?( }fF}fG}fG}fLШL0 > zc 141<1 =f)̎LФLLL07߷o^ ,Ò;_0K.m,Ar)6"->U[  Y} 2KA 2K[Y|'2ˆYf6x f?ƂR;-miͳ8x->k-`[^pAoyi zK1zw ra[ RrbYnGrKAZ#-/M䖂Qniܢ ɥ \~ȓRK.mÆ#w,.m `On1` ˆXzKh/0/ fDz)x YzbA~Ф`^ bos0䗂Y~s;/6g_c$H0~IL%``춐$[$Y%P'H0~% NM` @)x l[311c 1䘂r̆P)[A)h ̒L!d l(H2~;GI_Q)%1IIeO;$̷V[memdg i n+ksdiOfaYƏ|e$MdPYXeYƟ$IJ}Kme> ʹY󟤙seim ,A%#i8H9G gA)h Ҍ$Ҍ]iggƗsЕYS LAĮL,2#S1kbpcƬ[`vc}dvcƴD77f(n̏jLA'5nWn>LülȇFg/bd~̗/'2+:c 1sٓ92|A7>,8x3;y؛i7[(y377sğ)cȣ9F>94mdi9){5yWS__Sz5}WGFy5N, OS{4>^<qGs=4} >`i1|g$˧>M34 z5Oc/!> >MAd /#3ݲ?Sg?S)xL؟g g b^5?nH`gΑPgߕٟi7< A8g Bo>$oƷ62x37S2 |?2 < O 4kR޲[~aزZqce1\Jfabe3l3uX,D,de3\W┍R_6(:KPg$(ǨlSBv" ƮbmQXS޷+YzaHR6u$'_:jHO~ Of>g&q]琔ܯǚXI~Kb6)vd,fP-YHH6z\%"F! f8 $Dq1eBݘfb1Y wݯ'D"v|BӘ"Ğ2Uu=0dNBN@I\/aL?63 =˙o{y,z|\= SvRqV0hk@7a1Y m0S>, Y,B$gAHDr bgbC스8"݋B~s6FMsBb |9@<lmpNF8{kHDR .=!d1 d3}rn a?Lc!~|_YeFb=n6$X( @f8MSqw\ҎSر8u!8v>,X,mY)8 d3}ئ1X  ®(QX=~wM`>ׂRzV0GLwN ?xor5 [``|-g` `/G f^0} `}\+kdZT Z G ^ V>es/a`T޿ ~s=ap?z `-{vo0 c+=a@?XA &{~p/Q/`k.2r/X;@ `qX1k>62-(=lD 껠`{-^ M+|8̽`~zv^0ф^ f#{zzs/̽`vG^ {%>0;˰=`>0  k0xS{.zڙ=`r =`0 =`}dk{ڵ=`0AVS0 =`}d{=` =`Bz}> &(آR X|Vt__;K\`Vw)`)|`&0& L7_&0#nM`6`("0j(k#C s!}2M`md.k09 lB/ssqX:ց :0|TJ0:Y M$+6.:+ L*t-t`VdubuE+X^Y`,sڸhqGEgYpZ/Qii?8-^ߤkbfat[| "<\; KAݖgE[.o_)\ve);QuQW`, #SQXECA)iL KA(BEv bO*(b-UP`|9s1X0}Q0A(,M}|#oJbNEaa}>1ŀsl} nLA(|s ¾oe?,ȴ'82>P櫁LA(,?&vlb0Alة8Td#Bd~$g02i2}$ a>2+3dcg@fdkA;uf6"1A#=83bAX(&u>Ee6 3mP:`w_X6h^~k`eFz4HѧŲI#U&mAӴ|vrVeI[#`kd(qM60w BƷΒM[S e7M_'l,zhjFF6}hB?ߦmAٺ['.={7zLx#}B o bfzs##bٹiKN927:K|S`pΑQ;)fd,8X8?󶩒Sg 0o58+.,AY/"o(഑G`p#賀SB,8I0 8ʏ߼}UipqQyi"޴?6g < :9rӖA962k9/ְӧZ9 sȠZNA,u}|#GSh8~o0Qч."F 7Yi[' o nV0j7O/NnIYi#vm/:Ii#vs M}v49h8>gp4PDA(h8PQ`pNAbPg|a馏ҍt@פM@:7rolAs Pm*X0+7ʍrs՛eݛ}$@fضM} MAh۴eF6ۦlځf MC86wL`m[[mn_ѷ)=6GlޓgS5WЧi;>lF i 82l9I#Mإoo-d:?~}ɋK1y.AsH0&/8yise ɋ/yH^!y1[qr9piEQm!pyڱ g 92V !xY`N^l`J^ qb`#CR5L &.8qҧʆ3;(p)_yLZ^~O I2)i)hˎ',\ xe,1c4Xc"h劆*$,> NX K',bY|\L[3},u03ȓ BIyنQBSФlAyL̆&eem;sȡ<*-0;4~m6294 Fd;46pj/E Cavhvw ̀Cӛ K \ *Z4 g{ohlݙ7μLCɜ3o̙٠1#fÓ sGfݣ 9 ;#(3~7 nlݙ)tm:3{T;S:3mٙe ΌO64qe6 ¼Isنɝ3̷ ;S:3{g*3< 3c7tf BWf8fWe\`veW#+#gfĮG2̜ ̆fə;33sf6̝eCw vf #kf3`m-!en>"2m9GX3Ğf'̆'̆'̆s&{fCPV& M 5`Β5sn*f&`gdffCY-ꨬl<}Ii`f64)-lmhR^af64)/lP3 u*/9qGfqIQ3QنA9V,i=أ 3vPg6fؕYł*0d6bZblIŲ9NX6b8B̯7"|̀_Y$t`~cÒge3E,.Nn3Yz.OŲr]Be5-M-.bsr@\@p\֟EEqYKK ͐"M[NZھ"&,6Ϡ<%,m\YĠ*4Y'%i,D 6ge*/Muf>+rl 4a 2XbIdCX~0X,חXڸe>ѓ]Y6YJY*X,,e3hp׊sW"'Oa▯6W 3|ftcŗo88hLɅQtn+9Xov1 / zv-^cs!F!Q!c lv}d(C/mg@S AgSN4q=#iz.?KP4nv9Чciz.'6̩F1}89h#Sq\.umRc! PJ2,ȡX[qٗo=$/~8zً_q _=,C/_Ƭ_%_%_m`.r;,T|պ /|% lzc× lz\v {-8{Z`j#c Z.V|^F^v \UJXZv/G vbak-_K|r/A?sj3{զM_K_cW;]_;͙qB0v}i`WFƶ/Au}-۾Rھ1T0} //ĸ۾Q׷? -+}-_U{vcCW=O#}٫nhRp!۾`/%3֯~iPWAU|m[ vU0|m({M={CW1%[V>Enj;^%[a?C 7w{z+ZhsV/Co;#c Z wz N/,q ^m,PNv(C!4{=|f/:4{ f/~V%k\,7{,K7{TC9C \&na ^m,W{=T{%|7^\}W"S Ɔ/GKп  d!T02QYp0e|d4e|B ̜8ە`n2>nh+ fga͔u'ujixN#uAߤ:tB j}Xyf;BMc,beGĚXyڍcZ#ZΗ \#嚶c(bn kr> \gF5~o,軽` RMyjڲTS I41۟3F04Xise6dy(1{_4BGf᫁2 4S2si:TS 4~L2"H51jjTӦRM*K5woL4cbrL3vJ4k,cAwJ>ҋEYρu]a݊uA,uAlXLAbMfFdIM*cfrXcn;XRoAY0H1b Va9׉991Ƣ#@9')1Ƣ#ʚ~B#Ʒz0bE!fI*0 ôqQ|Qc(0}\a|l8 Y?E!AlŬGŴ'+LYpbֵ#CYqY1A|Xi+J_RbΑGj`Tc 7eb؍YdYC |9Fr^"sK˪ndbUGUF)̪># &U̪OUAU.2 _A*;T6 Ve`*324P;)34:[UPg6 RgΑY[ +4 M3(4XgVh|X Vh|9Y /cPh^BG3(4vn'ƮBcs _AuN '^Bs&s)5QJ]Ic?XY+5\J:5"bgM>2*6XS1BŦTVlbc(jMA;WPj H5m`j51H5 VVS41 &f1SdmAZMA:M1(Ҵ "4D"6DB B} > BM 5POӷF}" F 4j)]6"4R,BF4}(Ӵ)Kλ *M]AphmJLПp4al73œ )eެ˂ͬ<8mBg]\!9as-g~Ns8 )A08~6r3c9ic#!iA͌a81b15[gW78S09md r3ۿ`tvw g7ۿrYF@.z t Ǘ59 G09c!i M;y&;>Ɲg ˮ<~ÝgFg9K+6m㏻ڔG͂9Qp#A^Ɨ37mdntM-~ nl)Lgo9#7 nspՀfC!Q l|H bL g~g~3A\p.8;gmǠܱEgpo Ύsљ ,:{gRYA\pf b3_PlF0bk*6ÊfAنfEfn~Ȭ Ef}.0;Vڇ"3lC\`HB 8[Ȭ ,0O(0f}d,0ffbL[D(0ffNsY6fO*T}07Pa̞QP,0RRY6יqL֙ :3AXgN,4fhB7,4W.4ąfL,׽Thf( >q3}f6֙63aY:֙e:38efL efb 2﬩̾.3Ae[]fmefh2$E /b&‹X]6ÚuP(nf&JX*&"f"!{e}e] +7+cvWhgkBgv>9+Wtb_e3=]e3R]cI~=Q}gˊ ~z=zr Y; &]cBL )bG]QĠe_ؒRL,(%D̤>L,' :^POʰue „sb&o̓c\P? E e}M(N~YTP63 EN6Cbjr=>3D,&F䙴 u!hilv\a0MfgQ(?ubWK'm\rNLŒq"e7 I{Ϛ'bA>9@I7bG`b? (x'bY;y_:d3UO,1/䛈Aݤ͏|10`a7BYlpM E\en"v`&Bk"T1d(ɞȁf"tb%D 8& nuŦ븤Z_r f]"ͰSr2J4I D\e,yف2IA%b@ !$}`I E.ɺ.$D[5aH y F~5rdNȷl H; 6Gnl@s/#dì& pG6ܑm5#;^ܑ/;+P0Hq$1=o;V4G6Gd$Grl>$|].=e#) AӞ )ce9HɆ!yڝ .\CohI`csblMIbP%ۢRre(9ffIՒ60%S?&m\0%bǘ4c`M Bˤo< gbe6Ɇ22[G>h&Ty{EJ_ R׆kC!B*S1MrRS08Y>}ū́L{Nd 2 a dt5  Q׆w>d1 8d1b(1m$\s1AzA̗-kb F Pa,81O;8y͓A028A@F0x ߱A`F3m 97 h]<]`m_"f\1y;3bm G` hA@S38C_!@B07af\NL]@Φa #`*1~BcWIb"pAL91md beBcĴ9񋈃{ AF oAثkbث=2> |dvʁ dE d޶b@F2+Y,2w˼6āL#28ӂ?-B cB HP dq s'Q #S׆8kC9y R~ q6LAl(d.D!wzr`H[ڧ\YN]Q6Rc9tqV/ATf(a " n/APUz^,{ f/A\n:D0| –/?uYׂS㗱f* ҏo;Vf!8~_>n2_mK07E0TˮCo? -`=L0׀}r^/cM`}U`pA(ۙ-`;T0ր[C1(+a %`,ԀmCN8n#o닎`U2sdnk#c-؂.gQwM q%ߩB'==Z :01֖~C&0*02<My(M`vU`/24 qgX: amXGްs\  b"bbC﹡D>m1*aGj12u%cmdl5cUi c|`k ïokn>gL,k\(mcu}c>8ֶΝcm3 _ox|\=>&ֱL6u"]d6VMCYAOn!ߗPC&(&Qsoo=A6Ų"mA߬77coot[I. Vu̧zn> k#?yLPz0.W4.Awqvdfۥ̶O0.bv4 rseڱ/$Flæ䟮يaP=v%/?6g0^1Ah.pĆnp )D5.~4G?Qa0\i .1Ӆ$AŴs6QĴa))F6>`sS6d0S#3A61 C] _!i#S?TĎs'ͬl2 >n ,Fg1/;ŜÙNHdтC6#lw0d3Fhڜ9i#JcV\gY`,54h2ѴbFoÂ?g4Sfs7fw Sنجb6kIsJg6fm\m. CYAPivn۬uܬ7*7lnl VPنl.VG0 cӯFj5+sٹun5"V3?j^7f/~aW#mZ6DfVAj!n5mǸ cY;0f ipͬ j1-fsb!n1S/acbv6s`l5[]0mfmfmf}dh3+Z 2?̞;^S{a0m O6e}`A&e2s2?C{㩽 e}ʓ2aǂ=,e e+30,lC^!l/Svs>2e2?kl3^!n/V򩽬 --)boن +=eX =e~`OY;COzHsOY{SOYAO6dm?qCن7 e†6QOPRf/lCTR!.)ks2ch)󥢖 %;99RCن̿rC l(5wPv;6e뼸YV`6YR,0Ӧ :!.'k;*OU !VanU0a "fCl€S̟"8/拟|y~r LAl|D4_*2_'̆YY9+ o$͐!`N'5_֠4 Y)W FE  ]6b]7 u.6DˆXwyڝ640j.࠹rŧKUm&Yo雧 r,-md})HzKAbŏUmuKaE8Ҧ:ˆlCd>ttβ!Y 6Y6 YˆXxo]ֹ-{/>r^Xr,//M!_)fGeC{i[g>x/{45Abw) FE{/k"s*"A|f 90k0P3_D0/~e"y_V8/Ai#E0/X6L`v5_֠݅4Pze KAĺi]~r K,A\bE/RLKAҰ/_Y{#K@w9N&^7_cE/~H)GŏL{Y0i/,H)@w)4rܗY{iwo}I{gP{K`^l5ڋ`^ b3.y;'P{)u>W]t>0.~ XwiK.~?c6eZR{;.d ɭ@>%VXM8"u`u]t7eNu12.ʬu^'i/~eh/בYqG:0h0)$@00~}#uAÌ0)sA\7LCnjӄ?nj1o@<=fl~Lje=ac5\c'=ɌY`%#,~-[2?A"Ir,s_ ͌i4#>!iygsYi.)yخs\sq㚱{Zk86v|bPl58q͹K05w[)k}iZ391}e7 g`gpfspF3(Xg|M?s7nSX4_!ye! i^R\w= mAhw?BGQ6!iPh ?9aMCQ'5 aH3'4s!)Ù?N?I67a#8}kyÚ{Oj^sTcOq)G$8~2m_86sMCO6v,6c)106q`3/6>f)y f6cdl^̻F*906c0JWl~A` OPhЌ1 hUIAAM1Ќ)Ƨ h1 ho7/|4 ihЈ{7g櫧,L3 q, Ź?q,#cueA,SPc ri aw:0cOJ.;/9r c/S 33A=0LvUe!,;';AgYCUvaLv SW e4VYU8TA0WGiP]T5Ues2T=|2XYʲo[PY6F^U ʲʲL TX#+se/k,ʲL窲~$+˞TYTù`,*ce{Osee\]&~2AX]𫎫SuYCPYVDUe.[0V*ª2A\Us䪲1G*PY)U5Uel=Vͽ21XU6N&*V 2?zoE\QPQfXQ6SU&.sUϷ222\UfWͲL0T5e/Te>WÕe[Be ***ce/,e,**ܩ\Veb&/quo>TM&4CsP\6mbYCⲆTTfAEe ?5d LQ,(+a1?τb2i*&k ~OKނYw1q eF~ n)S]H02AXR&he!]Ώ࠻KdbVˁw"-AhZY.W"-8mYC)ye^ FEy/WĢ"hUJ&xUJvཛྷ'BM9/O[ͅ.a".+ߒуcfL=Acee[R_rYP^lff >LCBLCRqiء}=A²2A\VgS`^`qw``#3F2A`<P(-yU-K k00l؍ef.ݓ.́w.`ta\+Fƅ.̜ʅrasaЅ\0bم80/[]y`vaʱ 3F^0fy3\b0cta>W./_b'7?{WebWeى߮L0 BF0!UI`t`qI*#1L3?}g]IUI# Xv`fr`|,2*0T sxF%F6wf`4cPh&hZ1ш9 l42`sb!;wAYiDXa=Ї9#}A\Z!k1PZy> ^LC4"- z0bV́m0y0 >/ ֋K KClg2l_'^ҏ~3X_v͑ f is`e(_`|lb olB f`ޓ9 FF0z"m?Ȇi,yB6ulR m?Ȇi,˩G6ulm X1~ s]֕s`,؎v c.+,?`@d-q#r_ّ##3!92M="$G. td %92vbGf;2c`vd|y#+sd6## LC}i@rc|؍7f nݘ121~tٍgb77 nݘ_@7fȍiAA]AČa'f75vb~3iN'ǃ3F81bщa#F1>S6b|DE0*1ȨƌC5F1EWy")sؔ(#E{D(3Ⱦ_qA,0!X1؊񋟭Ae_b.`nj#1`1v̸;[+;F,11 cM1 %-flAŌ9/^@%1pB#fnA 3UABfkvaх._ŒWA3?#]^KAXJ_ ER,/cMxƈ0N\Gބ3o™7Lp`/+f^2oR!Q2Q,3ׁ!ihIg ^3b7LE:S&)әߗ!S:S=buNk~_t iM= ͏MSll~Im ޤ6sj3ImSj5>ՐT1)[xOf6FO7Of,5?v mfc\AMAfV5~v5bYAm.4~*RJ3c!)_U:S03q+ͬ NgtƟB:㿝ttPJg ڤ3oҙ95إ3oҙ7U:S03Q:S3v"r:3ә103~ Bw̘󪻬`Lgb:`Ji β]<β99CBZSec]R87(5>UZS05cO55AZ3L 5)ƷMAڌsjڌ~Nmgn3kwMMzS&)gMS&)xL!NA`qKf>*)B()h u PMS"NAPXu|Xw6i|}{ᾳ>BYCTxVK}gAYCTt6 ᛅe ³X|645i>Ͼ125Dga󙟔D G3*{6gc  JD,4]MhcRMh~S& mnОb 폝Z iB+xӄ&7EZ& nBFMhӆvShdԈv9panFha3ڜ+45čhTԈv9OjF Ԑ7s3ͯ1hFk/6F4:6hfM!c#ßB#24]G憴]y!n7 m,/55hchcO2lF74f1 nF{4 hF\Ԑ&.S MiulJ+)͞RSژ+6YpS"4UhJ797)XnJ4u]iyJkJr4{h A)ZC\fɸ hC+[al6?+ ?;Lן)r_6uBwq#Ahhrs390*7?)7c`6n|ȸiMș 7yD-ha |9̢ym|$|l42l h6bMZ`A+AѨyک?vz漷F.Q6j٨?+_16jqd42iIk3iL+F04cd6ieF4ؤ9u{V`0jbƯ6imz &F̦LΤ& 9+hsVI#xe^4ʤ &M}_`6j efwf~7}|-4'ϮEYֳW^Wszsy57^MY}ԂVʫj^L^MC9|ynAeeF4 q뙟';FؕG#x޴ j=+MYֳٟsEfb83kgܭؓ310ތ} ތ fl6c'Bf]^fm7XAckFZ3ؚ ֌OA+iF0H3-#m;X3 2~ iiL3n8vC,27c+4Dc4h Z/s 3Ff,0>*9.IaĆֳ^2WU(#xvQ(#h/>JS024pVsƺ3=xpF3 a(3C'C?s(s6̡PƧB'eq(ǀCA` e0U#B3Ar9y8|ዟ=!|L!|c _E/ }].W_|9C 15f0|?L^/BWE"tVb^/Wˁw` _aU"xХ'f ŧL'f ^|bX[(-ϛ؏k[m>9S0-A3C+~_PZ6Fc.d Yo>-S*d !|.X ^|jFl_|]"AE0/ m>5S0.c8tf]-.~ BE&t ]ĮBŶN˟zM/x]e/Wً`^E*{9*{ً ^E,d/s5d0vLl QE#tD1b-JL,ՌBuMX35 f'fL=Yn7;'`n7#s-]33Xr&KmJĆ3cCǙw̗:.߱9 Ug2D0V$ʳi62W ⪳0:[Ǫ3UgLf*j?e#q=U5f, f~Ҭ!2k*qdLT5e%2?!BuP]懑j>B.s2PuYCTY&* Ue2TU ʲ12V ZU 2y e?>2Wߏf, U٥JnOWe̥e|e qYTVf9 ̞9CI()khUN&xUNv`.'R2R2XB)߮C)ٜ3ip)ds)8̞C) .%,%I05ĥdO;`\J6jUJ&K|Ywd̯ .%ĥdcTJvPJS du*%PN6FrlU,%SR2_1.%e.%GTJfR1L,5;^c`$ db(Me* X&hX&ˮecU`l0j0 f6 fb@`ЦL,7 >\`lIʌEP,0fVfѕ؏Mqaٕ ve-827ihT&vT&v882_6Ȍ$c,;2c`d|݂#sȌ@GN7RdȜ7A?*#{"CȼlAyڳ"#AfV}eAiV*́YYiYV`s V`v̽dc͹lJ{:@0͑Y#"syxmT+UF02YPf>2(3Y-#So:s]o`Pg.eP-Rgz:cԙ`geu.$oJl`3FffL`3=#`5XۙHC%G/Jl`3N`#Ð`5cIih%FFJYiEN|C$4ho,8?<f 4 9ߩ3W`Tg4Rf_|Vf22̘#(3cRgĂ:sAF,+4cCS)]߭K2MA$2YI)dТ#2d\Gf`j~oh>gk^oD Ff̘25 U3ZXj"VVk@Zu^S05w; 4}j}Czs`2@ӧ`eSxf LlqOK ҳ89݂9cYA q,Ke̹̹r,㳠X!cq yynj8fKqLC77+hf'4/0[uav*nkr'`9+O@r*0c`a#ss{c3Fy8cnj1yLCÌ9r7ȜÌ6Ԣȵhsdes4v(88489]!CiaNc@!9ज!9G.r=9925sdkA^4P=r?W9Xi|BN3FƜf,4 *5 ANלA 94S{UwV0֝Z66ouj|1B~7U~# ?P~ss8͇jb~yo.O!CsATVgsAB9NAQ~Rp|W(9gPxK|n;;T>1-.;;ϗ#a엠z_=Plvj6jE^#j5*zۡmTfvh0; K˞}@BcۈV6 W)ySvM;/d_o$PJ P#/ud^V"%BE cʱ{766czɍcH{[>{|m(TM~ .;#i}\3v^;䎱}悱ev1?1b+~TlƘX/fcr۱ boǛ[o7A;'v ebo6T#K@/bo&Nav( C,jþΰ=溰Gy-EZ䊰yb?س/Tz6`?o{ĵ`},S' ~ h;W ~_cHnGT6&w]^_}GI_#ޮP>&4}~R׫|S r׳/j^_K޷ ^C@w/A]2Tt]g0sNl%8ߧ#1>.*qj%6#W\ ۸15}\qzk^o1_q/[o[ [*-n=Fa/}[[Կ=ƭ1CJc/AE[lAz}R34Tj+اKܠL}I}\(ǿW$iɉ,A؝%匳zY8=1FF9aST#JXIqTemә% A(gb9hW%xU%xSuUYIV`4mX.#.r g_}(gb9cl~#gE9CY8ɂYrF3|+9C,,g,?0~ Kr8`~qi8$i43163 ?ᇙKN0H qY#W0X+KİJ|Hhe ?@,cbGd_wYWY4K4K4K4K4K4K4K0KvYAh˲a\A!% j0vINߤ }`2mI_0KE2Ҭ-k: s% A a4EAo҅_A~']^c FBc ,[| [\K7Y [̹l1gߖ [n-y1c,Bl(Y˲da/d!(da;JKd16ϒXUYցSY-KP􍒅P*9d!% ?Y8KPw%v[\q'3K/>(_; 0-BW<ʰr!Gsrz~{1Ffמ s]IfC`v1|cB#CKRxn{3|hJ+cC0KFoCgu_u:B ߗ?fC( ˏY91壡 f< fn\>|d|1,}|}!>BCfw$h 1=_~M@bd̕-yA2nF훤22B`D#+"ul ͏ߛ/΂8E{&H=m$ĞI2FF#Ob|Q -_!eF7/;8qc2;RdRjc>)#sjSshc)qlc#slL5~fC msh])6~{ ah\06sB{\\f MCX%&ÚB926n!!Bxcx3gٓ?!)i7H088ńAF7hRx&%;pmfWmqh3Uh#C{ mqhǀCA! /4axt 8|d-C㇀#A\C3Θ+F88%D8ypaW]p1μ 5g[b[glugO-\w6Fƺ3r;C΅%Ch g}} 3_fFI4ŮjQY42 Q>#T#c+>pA"4A"4XEEh's!Z3X&&(x`.B_ MSدzR/-.BY"10 ¯ 4A\vh#͗( _#sR?F"12י Eh>2~^a;R? EhBM )rr .B"4A\gP{_gP3HEh^7m̙l5W:TzB#/}z1 B1S,D{֡PXr-jM/PQWס͑M~lG7|~s7Pnŵh ja- &?z4 ԣX6gGߤ_ץ}·}.mΕMץ}^Ɣ.m,ե5I5iB&դR&EeKui<TuiMgdM#`mژ3צ4Bm Mi4_P6i>OOlka_5FmlkA_"7GLps~Z09ggjcvr|:ss ^ժ ^ժ ^ժ Ԫ]Y:N"X:>et#(X:v*KǗ*Y:ChbKG̖[:9yb[gKǮFSC၃Bul㷦#gS&m\uh:#xe^լxg^:W`uX: +;ιysmdt ,VjWv`U,+[;[G NChZY:П#-U]j:Yӱ fMg̙=[ut=y:vc(Z:TMsĢ#oexgmhtif;ǯ`猑ihe^Y9+q3U#{Xy5o^ؕWSWsyk ^M-ѳ1x6?iz6gد]&x6w[ޕgSƳ<=10{6c`l "Ϧ lsdƯƏnm `m4ط#o3F6o|#|]kÂ7M`n|ɻ)bػe ލ/+z7wkMA: 7NS08c`4ueLMA`4ƍʸ)6M`MA Ӧ`ɴ7=28@MMMX ua6/JN1o͹a8%t ]E7M,76]m:<M,Y7]e7D7.9mvvS@j~/՜bRmij~q͘5aGYM1Q Ʈ.zЄnjb:s gffJf~]0sXe2]2]2LUsXNb쮲*>{[31<vaWa1z9 %/vb3fvvv].].].;\J\ \9;&n9$-@r*k9&j9($-Ŭî_vIW W J1,brUrUn̄nrrn:brQQS4X)]Ԛ ,v?D)$ŧ˕f>.)8~4.* S:'9,d*lnbryJ!٥'axb@I1ؙJLʁ=6JK|MOaL *"9*!9* 9즡L,#6#*' II1䰘fvGvX I渫䠫䰫j=LOP,T5d m* JEUY*7Udo *6d/*ȊT d?o* ˜:򦒬`${)*j`%*|1:򦚬`&;A j>W5d aٷ_`\En"q3s y b!{鱪+xS=&8T\=610UcB0Wr_}Gd~ބ 2?!C* QYA\E@"*ݶ! גl̕nv*>W5c>P=Ic AX'2z cz..9"=|d.#o c7|o|4xS>&ǔ?~y!k~lN zLd_vPYCX<1csd*+0}/`( k  c aEc&xi cׁ7do 1e( EdcEPD7PD7*" d9o bAAY3XL6n*&+xSLV0]cb7eCA ʮ#²XXXvy\ e>UqY\\VX\VЦ`*.+|Ⲃ (.k |Sa(XXV lXXV% |TXVwAÂYjpkL08.Av֋MAb\WeQ}/窸L~9LL0 0\`& ف% X`|"fa c:0eb'^Y1WŹcf7J91 L^LCfiA\vv'FfANF'A`'fR bƒ +(|C1a.(}%(2>gvdƜYّcKFi2bVe/k0e|YwEeѕIJ!yle Id<|dVf̌9kf0k3vKތ=/B(b{fl;ۂ?cqhA3 ]ɡJ4 =A$<4X}fWI&-G!gBqƟ9#+*UU7#x% 2ABgƯuf1A\=7e*1s\EG~'mN#h^5b٨RjU؁٢?HkLU :U؁S >ϕA9R#?ar@\9&5ނGSL"4ϯw`BLQ,4Ф&YFh#l}gQ'Gf\٨9`4jQǀ/ʨ9ΨFOV&`0iZ4WAs؝A#٠ihe^3?3`2hĠA# = FFϚ4x,M9 4iIϧiM/4 F,4 9#ؘ̙-q!cWhgc!6e|ɔn~ec:ʜ2g3g6`4gsFʜ挠L 2h3hAoI4ؠy#Π?2ƞDAcB2hQ$44hlأ94 ̙9(x3!f3EN^g-)y4cأGc7hiӈoh?x4s̛xir>V~}O3FF4V>`iO{4Ihь٣ G#=#iF/,ȣi؛:x3c4ٗTf Sˌ|uݑL>Ne+_4d'cɓS<˳Η u+oɛތ f.s%7#A+oFʛ90y3WXg\ Mz}cts9iAܱct#Kad BMC4v6D4~)sG0G5/GUTs`j^OjATy[ I_(Nj<I1Jj@R γ&Cb&$6O;`F0&6YE,v ¤F'5w;hƤƷF*Jl:LMC.JjcUB#xxaB0$4Q0'5>gLjٵKjcR#:@BS.JfsJh#F*Jj~eR#xu&xu&1UR#xu&xu&xx]%61JloFL*9.|3A؍142̉͘6 fle I_!cR#XLlcb#A،9Bb '5uNj~CR&4VJh|↳UÙ`NjțF,&6%6o‰?WXNl F'6n)%6F ݧqRI'5BRc;I Nj1Izf0#$3>Ő dߍ 3A g AYCpvS045f a5]Vͮ#sG憳7 3_{n8k\p|¡gfבl̙{45V{|szȫ3s?9a;kz~}p fD*{sG=g!7+{}5, ]v{qϙu93Cϙz|ɨ!7~y7#Cud9#s~lss7s#cϙލ ƞ3=gL e =gRWz~3AovoBf<5o75Ɯ4~3C̎_j7{nщ`n9ӀNn&7즀fZք-gVmg q<͛wj;߽eفWmgbWmgL]ʭg/;ǸL ֳ-Qh=9BY33v05-gvImg:2!n;)`ۙ|h;%Jmgב=3zaj=`:2˫Ђ&[|C ?Q ZC~66g q1) ֳסlZ.gSh?.#s lAK*C ZC~Eg:S 3BS;[pPi|dRi "J#61F)xLgmQkƨ[$؄I `@#`3̂-5cklؠJ^sxc̖͗hٜ ˦C+߿ F< f<`vs`khh>dMC`\,ЮȪ)ت#?zI]05]v<5cȮ)?]W5bYAlY$X5ch՜zUsz؃6/om'6Æ}he.X6߾ lʎ=&Nccɱ51gvlnOٱ1 b~3f͉h fƞЭN;ӂcc:6 [3n]5[5 S3ة;NϊݴLNMAOpj1W['!jA'] Z`pk!ri BƗ\l;+1Gphڸ3;cJTyCSC3~w5w؍;SƝ)x>bw;^Mpg|pg|Н)ܙș)?AЙ)?ABo>%1 phڸ3ۿ'BVg,$Έ!oFFK֌f,cFFeĒ.#fcˈͲȍ+sؠ8QeĂ)S 2l-FƊ#vcĈ1b7>Xa s4K1I<ς1,Yt[aĐ #\ĈA#Vf%Ĉ%FF6 aY0]0bɄ"ʃ`IJs` N1 yu0v"^?h/>O^ҋp^b r CE .bvò]IJr5b%.ItyM˚enփK1,ގAr[~YV[|\6[QlW[O[[e\IJ~i'叱ϊK1h߁Pl)|PkZaŮ಼0ņ &o(,qgqQgg Y3 K-biyb>,sWbG}{B2ZĀR ,+E,,ŀR y+bH[b=((+vRFT˞6Ѝ"v#8*b7aPTIJb`AO;S:8FRKrؕ"1䧈)b7v؍"v㦈ݨ)E3EBLRĂ26}O ENTD" iz=/~`B"8d$cdIsJrN(\y2%ۏvbWMXvW)U"x)%)oVU"S*b1| Ur`PVhW㓇TO#Cr9iPr98[YpQ.AxE0+ mZ d T,r9T(*C!VӀ\! TƙGJAf)߶4eKq8R!O9oKCr1JV`2]!\tE+ _i*?w`G*vL7ϡ_c9Ty T#c"se[`iO!Y#c(UʏO3?\!T#s#X?!WDBe:Uy ;ZHY\1f7Yʰ0b߶؃E YVG)ud[ 4-0ps2V,D.cd\~a"1x!bs? C&#CSues{ȜcLcшŐf+6Nk"PXC=b}D+\7}bbO̟%O!LG* 1* =b;z1CEl-bE}!+bC;%&KrFQXC%Vu5a~e0a^AYi>&3'%bc\fn>2[3cdfIrfW!td`td`n/&}WŕYѥ$27 J1All_*aޣ W*WV`b.Ȇ6G0֊U0X1q36?يb/UL0KYʆ9pa&f̂lЂLC.6w-bcC؏)W[1sdbBf,Yhg+f,301vi;es&;Hˎrpd!K#_wn`pc.GAAgS+Gpenol(!{%Ƣ13FcF`Vf2x \:smA9Tg:9Wgu!Tfޠ2cŒ,BanJIIf?8I#c+ f1٣d(&L6j123 0c>(4udXy؅O 2L02'Me_(3 ̜,Bafl+ag d:[eeAPX11&3Gވ1b+C}_6Ff3e/F{1~oa1C?rAfj 3GA:geA15AɌ$OdĒ dO1Ԙ\A]m[$3 )2gu!# AdȌ#Cf {2ГѝE02)#M_q6e|V́)sEOMAhbS6ʞad؂ѓɓ2V`el!_!dĬ<02>0{2c8̞n0{2c+Oɓk0x2 x1 ~Ći4dِqُwm =l/'xeZ2їeAOF`dih?:Wd3{dO'#=1 d2y2/Ӳ'#==1UdZd?!bыg@b/r?pc..{2c1v`dc=f؏&c{1e+FX1 l FfN}AÌ3؈F!2bsE3f̘'y1#-?PcEKFw#1L F00LCE.%a [! WAPS \!Ca" i>'p3% hC AZТ!+@R!'PB  aI !@>49th†0d! p! 0!,ACР!,!ACD@Ca@C!xo}~ /^7 |A!xqo^  |C*!xzo^7 W uAj]VN J|.^7 W ݨTJ` x9o_ Kxn_v a x.^f7%v3!xin_R }~9] n_F —тetC!x1q KerCY Dn_ —ǂqAX6 kpCZX.^7kIm_ $AXt ~+ fnCXx$_*$G+:FL_c.ˏ!,=s#O+mGhn돔" #AP)=:0= G AQKX{$kMc[`=R(jh˵Gc`=R$xU{$k Ə?ʂ`bIkN0 y ƏqpAX45H~? 5GOw&6 |`,ARŁ& 5S$AX$KNc nW7 _\4N?.As21 2 @ǂ;H/st ႰeG/sH ˀˏ֩!,=+DGO<#G?G?`Gs`?c?hL|BG#?~Ȯ~q?>9c*A,~A|X4w H~H!,B߼Ѓ?gq1!90!55H aϐۏAQCz$?Dh~p~D Gsdh=jsQ1rt")q#Az4Nj=jڎ`сhXh,#? 6-Gb!l7/ۍ_h7בHoYÇaѷkC/ɜ:05F$65F_9b Fnh 8.ۍU/;`j9:t d_'?Dɾo4`OaXcn8:G †kP0gb6F3 _ _m? n{6:7܎r)Qo: Ǝ#[\"ӯV06cd ƣ]06? lfG5Rd2uGsh.\wt^|P Ϋɂ|(S:ˁ\t4UG〡)QVxq8ttRr MG?_/~lCќvƮ{]GtY:% 1 ž1A9K݌˸v(v9pב_,nD-GZ'^h9 ;.a2Z0m,i>{hn4b7L|,c#S } _ _f f4k0~Ů4A,[0 "H0v@ `Ƃ9X0o `` -J)C00c:u`bZZLA Z̀Y?3=H1`{V_يy8V| VLClq 6 4D/1ÅR,/>./sݔX})՗:0 b}K*/~%9.0.LA%1UPb[ߨ1SJ)xSF)xLjLAƈY1oԘ7jLQc &5 Pc!5FJ)jJ)ԘjLpSd fEfL12)2}`Re]MRe OϑY̠̌i22&oLA̗Aρ<)3s*(2~s4eeF῿_19ύ?8@|60AeeaYϱM141 iP042!#sL3FƲ#v84 1M_9#c\#s aq<̦47[]L#c`i4yT LC9ű eBXaR('ɱJMdlHe|`LeĄr2[NgQ9YA̶&+C_ e j2xLV𢙬Xdm d6Րa .[d`f̷Oপ`*+fSU&xUUV0f28FLCCc,g17;kSC^o* T(+xQQV즢MEY2`ea,#(2M*#vIV𦓬U0sU'Y7 fq')eMV즛M7Y4)%LdP)YA\JW5%1$2c`*)+@($1Ub9YA 12&0>'0󏭘C3F$!L`qGILbI̸BGHb F&9(0r{-r3V|&l0GlW0Ep1;>誊 MdoBY_ч/26u:rX,#SqX"rX"S7ܰ0cPcP~LOO2;OB2 cs*ԏcO;{g%B·1k­cvsas0\9f{˅clen̎cj{.rטFR; McapWD ucvB㲱pט=;o64u^rX.qBfl -ciNJnSIn_/Tyr%a^5B0{5u`ޏa/JZ.0; a'>e}+D0x% m|+/X%hyIviW'I_cW"x^y%PJİUC(WvɁ.?,`_N?&ͬ,Dl(ebTe#f"&h&_BDPL|W_W_^] ^ ޔ] 2LpM ]o"8tLU؁n[gDJ7`W`COcU&8X'vr2gC;iʉ TNmDLL79pMFdAv`bWމw"v`r-B0{IkL' v"hU&NoĢ~"('7ATvNZ FD&B-_M|A@A7czlwmno+u"a{LV___n#cל3~'E,12X(F6 QlhmAEF 6JC.kEgQ[G#EJI NJ`Sȟ~MfOE*_TGUE*HV&vex^*QXJC4ĎN |Rye̚y*RdDl|~U< &WgGcYW1lXSc(y*faOh2V8ҊI[1?b,+b\iAbie+k+_o ʏ ̕uOvW/+c`WF/FXvgEJa?*ob#"&x,v[gE,edY~e>(|F࠴4iy5ۗV_r^ [عt[ؕr`ح!-o(˂DrULˏO".6 ]Ā2Bb!A|V_#K /w;A00L;+0cdta sa#(0v|XFRb\7b?݃cI/FAovXd/dmVd'c/2(#hefUƗ\,͌kf"MA@uA3FFF84ͣL#mAIM>eIiA󄜚@a1(ՌAidy,՜egiLsiYY|gDAMCQ]I&v%8H4;GY|$4cLC^I37a#,n(2YY>r,L262z̲;T*sYsU1=cY߮$| f1ƞǧb˞Γc({1vXH5F1XE7a+1cs,c4swz>s3!1kO1 ~'?0ُg^<1Fe2ͳ(3FfQ(si( 2fQIɔD122ב{->03@iW]g8ę> 3řqƯ`AdsFy`4gΝ?wbXCs`b pgZ93ٙu _n;_n3cdrgbg+E2sBWFʕ́ȕ, 83ͬ\ڸ2o$ cwRS0cf7fo˜!CaeġOCsrf( P7UYʌcLADLAP󎡌2(9PP`en!i@(S 2瑬`e8d7C c(1~58#CS&)xqcn؉c ITfKLA\XgnvpvE Yl\Cfۮy^Ց ud mz ^=ds`."% bMX?VЦMX7cWc/NJ+x?V0N?v֩u%k >2?Gv9K }d~F>2?=B5!+{N!7;C6/>2٤>,K6dcKޡ̏`%#c/A%k*`YAGD=dq C6z.#oȊ }d3HddJ*EY\JLC4 ̘#(0 }V_.:)0} OJ'+U/J9pPa|AeF0P*Va/`Ta #QaT~Yye*L5bYæS懘Ę6 eo mbYy9;yBSjOTTV (1 # Bf릢`( ̏ ]#c6+0cBC&XPPfd, D6a ?`|ۍ 4ɈlYS%#2`æ؈j*+];ɉy_ļ 2{In̘Fpcf7XTcf5#c01@cSMiY<Gf ̎ϘŪ)2POJpdG0I27cё$c[pd|Lte3<;3ؙsEgFWbwƞbe0vg_`wIy123Ȟ9 3)ƧO`T6hӈA@siU]V04R 4/;+Fʧ>?)ϭO.4ЧKF0WW?;F0{5~W;H^e\e6GFFWos3s谟SB0#Зd`ps,E1b0rMٹ#KQ/e~]CaWa!'1g3hUBsXh0_6aWa92vRvX*);ȪXQvUC/)(;䪟찫zbcǮ찫 氛/ƈ]|0栻.';,F2D0Rî:bawd]5vň]|,F[1b9%[|*栻F6dîjj%;c1b7ߊKAA6_9lalKvgbr+bĮr`I?vB*s9쪎2neSbrZ|ӫ尛 ;05Fawtvt=vUaW/cޱÄڱӍìJ͗_Į~w_rQOavaz9hOlzba019̪~찫R\rLK~]aoy쐛o|E&&9($?6I?BαbDbo0!Ŕs1I~~)$)u;vaWa19*9,K@d '|Sliӏsx@j#;W6Xh% d a+ n%;ϭdcJ;Od a h#sW0)[S0Z̭dc1B+ j%ka8Bl#+Emd}|V-뮕L0}yZ#ϭd,ȄBY?_ V̭dσJv;ٚV2;Zd.J 55d!c_~&ԏ}ϑ>w(|׍qX/.1P>/ Js ٘3MPFvs)u`.'GPN#s9 .'Xrs9šNPMxS5a&dd/C5`&}dr9a db5 &;nf2;o!n$3F2|h$65Md[Md$5Uj$#s%+:udbLw!J2A\I6v* Ud d+Ȟv 2 2dO 4!;L)1"U]V+qO d d~. 2c;T9 d?#orُςfWD&גu5dcP@/:5* cQD cy.c%桀lL EdsPDV5x.~Kf`D.;;|f`RSp:J*R TQnò*F,D , W #hynʂcU~ ]L=e)5)n -r.` KDKv0RF)vQA(/3Q]!IGH"b,IaIayBOmk0R?YL>t:ܓ2+tOIpOb_ eE(U.J6NJYk',eM `騔KXQ)X8* 7% T}NJ5r㥝@tRx='vR:I0rR[NJ-7tS9n XZn XM,ܔץ`PI #$RDB^$ OA,M/,*J5nR`OE8* `laGIfJJ@JEc(TREd(%ZI9l*)RR'J@VR:%PR5Ք{j `$@ؐRJ)R}{Z 準tZGkRpZGZNt:B: : nH% n % ?l'N^BD½OK{jMuG,|(^ʶeO#y~ Sk?MCcՆ /Bo2C^f \bQbT-KC_0ICe۲6U&E*Y `al6*ܲgJ@P P2UkS5T*`0T6GU*~8OoVz :XY$6df ^Xk9z^Ȫ2zMY[NU)pR5z `+S )ت2 77Yco[b `UcoZV^U,7 X~ة߀7e@^߀@~Ho%** 8`*v 8``S`q 8`* 8e* 8 8eUlp;èUlo.Y,7 `+Q ()߀7M `Y$7 `|ToYV^p7 X|Jlo[NXzSXY#7=Y,8*XYdUq[U{UNUlUq[UVr8ibD& jX5j ՚͑WUM^pTo[VSk7 `zS`U HTm5e JX՛5jMj `]אYq jX՚Df x:#3tuYX'(1@2K a,RŶ#|1eUcqIctXYc鐱b2Vl2f@+4؊,ƶ-1@:u1;VM.; MIO/ +7uى&H! FǏ* `@ƧEAш%d BB6S${sx2nX4Ò$2>ۓ(2EEV5,4t Y:l>ZAdΒh&adܰ# !,Jx'd:2)BHq{:ꨕBXĐXd2@:FSg!dܞ ӵʋ!l]`3 L"dENN'adW+ G#+HX&d,2[^XGVﺎ%v%+LL$E($P2I*Yݰb\@D20", FFK # HƐջ! d1:I>VE!e:!AdY&RQdYdtN#$<2>I EHFFHe8&ِ|NF<22 :ޘee&0 )?YJ)[9eDPvVb`Y*˼ +K-,byed` X7*~/e 6}Աe|ܲm:w^%Ej<mjƔnVIf`H1H1I2apV0I6` X016`Z X0U7S޾ k +`m2`kMbT; >Ҁ6`5Ҁ9Јy `m ܲ6`ʷV mT#%,r_ %nTKfs`; XJ90 X0` H0 ra[. `˅)pi0-#Àd ֒a[2L=p0-#Àd X0ۖK1ۆ-9X1,9%vV`Ka=3=cX14&d; XKli24R$4DZ `C*e@Z,U*K̀28Qfh&Lղ̀ >™7Mu G+@:Rg [ `G+ԙ,eR(3 Rd)3-e 8# )2Gl)2"s dJAN 2|O2PHA_g%f:+7[L@REz2u(DQ[D2 diAd8jG(SD> Q&!lD)%Dt&gL/ׅ`(],@0X3IQe*e )`,xUX2eEe) `J dKA%ւLVL5R 3!d O[ւLy|]BX-T#w.62|,A)@RhTAg6dp%LC 1dhAL0ZዛcI1cxWċJ>/'cx(/f i=cz ϖD0cʤ@ҏ[ԆLWm 4!!$ 0ڐ 1dڐ Rd6cȖfkUa}fLǰTeiU8SUa8SeD!V2t2UP)L[Kaeh&Lծfպ !ehQH|@җi7GQz3`7C?=hxZ$ RA`Gj>1| z53K3ImfҺL#RuzNHtjh][VfǴ6Hj3,mfv6SDL0ZD]2ӋqMso{~wn;x:ϿĶo?<o-OmhNwMofo?V8͋U+76ήêj;[Mfҟye=4}#wOOw_O t}u| n4nx&қ&B~?͎>aj . Z7pێW؃bG}v 81puw>zq[{>/fG;ޏ8}y7ϻǯ㧧ߝww_>?>ݗ\~˅._]7MsDxrWnkl.#syqӸa7~ex|{|~s{iFk߻pSAdyjam?Ͽ?0uj77՞^;C~zzir٥66N;=L[8~|6z^ooliAO'NVz_!>?Ġ44aﶛV#i[|Sݕ MoǦ58+Ct.Sz5i^s|h5an>k M?^:eo~Z}ھ~㴉Vsw:X~ x} 5;=+]/_Z1V/ԎwrkMY8Lf?^//մX~=]qJG??=/dJ}WqGa?~I}1-]z\z}Ǘ{h[KQH5؇j5ﷇ4>Mc|iҌcoq/?w<W.}Hẇo/}0>7o?Dqßc{2NFßnO\{<1ݎg8xN7_i< __o34vt~?mߏ}8Mn؜`V=2t~u\Mu4<J9cp8as 0LZwOw/;Oye, ?Ѿrtȥ xs6uo^V x9Mo/z{,G~§~naUJҊk|Ӑӄ?y|8ϧ:_ѷy<ޫqa gƋ ].ԻaOVvT'ĥ#0_lti2ӛ؞,aПGpޥqǫGtft O጖!ws렦~}"64<}ψnމtYq3ӝz_> stream x<ɒ$u>OʲYpB2!-"ft(ғd-ê~  <0; x Ћo~:77WgM o^q-eovW/?V{ߍrbjyﶫR=߼_q^-Bu_M5A{XpdBpg_92>hV9XezӾap# ʈ~$Bw/n7orﺗB;? - ͥ<M z0az(&"6pGfUt=;W$RvxȮJz8 9{-?rTJI]4aR^BFɇܼeZAwK`HdNMRnWՠ]\ŻNfܣ Fj:ov!)N)Çӗ>!-&}|?I4V#yVZ"1\ "H ,)^U/x׹iկby%tpG((tͿNզ~3"Z]f1-Hw-W~nTtREAxMd:G(d,/# Di[$ˬI^ӝX G 㥢=?(9{^t_! ىH P:']2Vk!A]ف«/ѐzˏ. Z[>cz=} ;(s=lO_!]hrYhIqR?D?r!8D}93n2aZ2;@kAd<-?8)h1 ea"/O?nns>$nMҪ 3a_ '-IOaB: *]A|SBǴ id1g')aˊ / y>EMmPR*kf9o|a NZAaӦֱ&5׃$,z@:̧rP%NΚ_) *py ڊNUE~Fb/42->V6`T3,.=5J?.Z \FQS!FWumV8K~s. 1Ru&'+)FQ"9RSq|JEw{$]7{]~oir2]AeL   <ܢՕ׏5"0;y`=RʾJ)`euRO8&:P5 gJb&?wڪuLAa S'MPg%z^EXIEYvB%VL ɫAՆ빸y;~dOR}Z5h!޸,gA/]pt^<d[S▒)kAT /|0m R`{-ڗ/*.,TROD}mVE-?(J{M T_g+_J7URA>߿VY-!S<1WCi2D Sk aA2ɗÐmX Da-D"jRً=:E#1zX3|o<ܛfe}_[ \_:r3D@R &?&S %5%n- zZ MޅEI.ȋș`qK%Yμ㟋tGJG3!/=RB*6 Y|^Ke{Q~/`QSז"_/-QYGXJFeD.CQ%,y*r-6"5O-2Mp!bٚA'gLc <6-C2' q׃VQéJ %.Sj.4VzDmQ5K[q Ɓ[$rtc,<}ܬ$Yoؚ^41#i'M(VZ5ˢh&m8KO!R7U, FE4*T眰~ڬvCp<[,)VdXIGqZ 6BU4UXցf7nE>R~E]w_*hAb B`KN}i`YKbB3l.`u3BLFe*.e( :`cO& MJZ?I2D&K$E3z>J 37ߑ$SxR/_Oc P= |}Nʖ>0ΞX)aB(q*!/0@ vn-)UYOXlQ5b$Z`MD46G* eK|;[EYS9caڸv{\a5ɂho@WbkfN٩`q́:aSFްz>ȡ(VPߨŚݸ+Ui `p^_X3uOֲ7T4NRWhq3 ҞbMΘur-5%.})3JQ#XDzu}-P9&&{s@i_NπE6 bvÖl)1g*J|xbS_qf=}S$6#k1]WPCqzʛsgF@7ӆc!ϧn֒Uyso Vgb _>. ,I{)x|ƽXR6e` X2R5&3Qp$|rް\J|sŒe; p!eVcxAg?$fJpCYxRhO4E;HdzOupߛE>AJFMfT o^s5ID{;|Jsh٥pxtg;7Zz\k3Чz4 3a &,Jc1 %r5E9NX_ι!Ωq*bR.Ъ/^li0Y/%pld1"o&-G ΢.4:OdæYC\hg!5`>4N5b9-.nLuSDKtwM#("۾DcېW_\G鹲Tby*,:%L[jiЛҢtHK1U%f}mC䅤&/ڊƣ oaz>Qʰ\QK{rZ' ۀ{Ċ7u~&Ibȩ8;OT 幍N͓"?8;Y9̘x}C]L5S]8?Ã<Qu+ Uؘ ߧ*`0!.R`.D rҏ+y7NlwIMbw0cs̃%bhuzxĞMDIbpWR}Ds[;gfB=jN8U*dw,h(5yÚ2(3(2 b&KL6 S״g-waTM. Gt{4\Lߗy+gG."V4,rxJ[tsvAPSxŭbRm>LKRM8FcH ]6q%Jʫ׿,0.$+ nE3wlD39"+u5m捱#y041qRAEvUfba|B xګbP  U[ۆ! &^0c x"2MlL%"M vaЌ<}2q5˔ˬSc8SB^͢^E{AS+ uVz,M0M'`_~ eLAR @v.^E}{%T ?nEHSn]"dz^mMхɯ"51S,oajy[ѢI8DKoS6x[M,^k THyosyQM!h.93il ֋FDW2M?f )/BuAfGt~ rn;jNE}?IaX Xݸ'8}xyj ?dCt7]j ?fwߣ-sK74 #^naҮwΩR"=t4ehk=TPn Cr&4xb8I&2ӺSJt0 KhiXV;1CXisэ O qty2endstream endobj 301 0 obj << /Filter /FlateDecode /Length 5420 >> stream x=|,VtPU5||_.^\\ w]zz\~,<E|E\zq2WN/ccc7n.}X `Cn}[K[/^}X,R?Ϸ;|.]wX@5܆ouom.3KezomAias T-AN\j%qH64NC{f/y\,im}N~St`:^*)3m%$wvcL谀":`U9MBjpA-\DdB#" A7:˫u L( G;TĹs"0}!ΥwFо`AHsgkh͟o7RQ^v`Bvb&HB J%t?G Q '( dƻ}«aP7VZ YVib5{i1܉(US_FB^)?CΨ$8  i@$ؾG*Z> @l T" HY >f3Qot|vo8~+:aaU{+-QUOotP47u"ʈe,͍=)9 P}LC@7o#ݔ!g)JA|5+Bk}=5 n#iI}f֊OjX05:p/ w_5tuTK| Йa-SՈ+ ^qZ?o6w@.(m{Nݎ3=U2l%ݢ4(# 7":gmdph\[}$* H2{">10Q&62(Π {`Z(~ +p=O^Ju"-1@ t 7qQ n^2[eF&4T1rfJ煬T) 3c NN꜊QhlD0FjyY %^JNØURGT*^x1BDkϻn!#tG::: E/ S!٠Q,Ҭ!@(jd.ZZT6ba_@O.Χ3"{Ki6ta+V 2L8`zC#cgyn({p :j QgD0||\U*yF[=gQTlJXk|@;98 8'od<,䁣x1ufOQ:ypBG>}JԢ.kQBR0eћz&3 dޚD"6p#wzӧjk$Z L1WH_v N̖.'ޏl j*Uæ.q=Bn`9ݔ:0zui?loZ^>S,\3HC9M07~1 ߙOK ۳ b!)ͫij1/p!=Xa]% aL ifצ{33:"{ZͺS9Fx) d'>,WpSDKD$h]g >GsaNHxf.-!Oq$i=at94|4;|2FIG$$YE~VSk \Pfii& #LR{̱Nra%]E3()4,BSm,z(e")ʬSΌ7GW LjM'G_H&I&dł-1!rLc\LhpS]r1ʅPQFDž:m|]`IC%G,a}fɜJ5 WWMGLJ\l0栶>'<ձaAK"- vT~WC,~~Y? ?ƽcABvطlwJ$ԨVu"*<9*49G^b J9zXVߖm Hcb*=vb#hعO뒴-]=;!mHłwӗ4n-#x5!t/;-`£K|1S1zmp%^v?'GB £gU].x"A!>QU4ң2L%% <[rF%E ӼTץ@u,yc9w3NbpjbZpQ)?9TTߌDD*hr{(\)9~~K"3lQ?:Vh$~]؅⟯.~{;W+4vAɧM@bʹڠEnap'ڐS|msb9qK -CG&5E|K\g',mJg6:bTNڥ)ܥAS!w&_d/1~و= FlXɨrHR.oZv.'{vPN))Okmb˖)ֽ7RekLYa-^Z"G}|y|nn'яY>ei"ɻݷn{ٜ"ӎF r^/?FH"RQSy&Sca12zUK-0 L#,z78nܖl[Iw" itFa6ZTUvM ɻ,*1G0m`8_hTKL!uLMyUnn#wh"~XcpDI:ue|Sēb@S$Gd-yתqFJPz]QA "~7"n.NN>˛BT}*R|OT>ysz&ʇzzdlŬh.dU &CSSȓ .JU`@i6Nu4ѕzMo9$l7BWCa~NCʜJE/gd^ov&KּFf}BI_,g(TXYb)M5RsD 09bs '( 44{'0P!Mc1HUy\z4ZF &l"$l^ ,Tl[ '"P?o+k*Ջ^az[#y(c\QYh+gX 6j`R 덯j.r+}͢o-ۚiD~۶3W$l^4.>Yqp>/7ZrT? ƪy[% JT6 \=Жϗ9d̨ʼn9޾}C^a{?)|`_OcOOTa^ߞwC?x3"Sl[& "| o_ .̐*͐ _B5fsݯ0x,F߾8Mx̓JT'vCтVPy6I4;X@KrBvdMu.h&'1KcJUVTMߗx v=sNz"rҸ)A~"pݡUaIth3ZgV֧DΧI%\71YєJUQIiv<2 =qxKSA9D#\ݠYrHIE'=q[ZM'6cL7i~쯚dVy%-Axy{pxހi"Z hU}[DT |nP|?7s@)dPZdfIʁL(k3Vh6`59.p̨j\ZS< 8L,t"~ 9Tc{ϣP( yo+BiNt +q,ִ!ѵf>\ɹxv*IHZ6 ܒal,EPj7Vঀ7i-%xM6_7:C# .`>PIBWtvN[m[+MUlyNǎZK\ٗ?ߦ⚜] cnn[j;,5Lj/`[4؈xS6/>iCk6L1+o `IbLr7)3P`|yE?`߮| $3wc+-ԻLc.9Cm7{|1i[^! I0nh@aޞQs b Oˆ-OȆ䡿h5Vؒ'`_7]V̌P#0bӂ'x,<ԣ0Ds̽h&dt2Y3ǰ1]0_.aJc8 雜5v&Yu5L89Cv08IFɜi:lq!Z2~ȍSS>g<ŏG$G_2 PHt`&;}l`vl y-cH_K /qb'&X)%=%"x͓?qIi I8#$ƣx L uaPf1>Rx߮7}Sf@TU3@;!N9Zp[2/* \ 0(JYS7ުnF:SǙ%xnY,iu KI<~T'JagήszvY߶͟E,&*6oM8Zdjw4mi|tsendstream endobj 302 0 obj << /Filter /FlateDecode /Length 5828 >> stream x\Ks8>MĄԆKSwϣw{ӭ؋g$KWld[oLf`!Ad[\" 0ǗySvg3AWW/J//ߜ!\n3ʜ_^U?WF9_hm[m/6JiTcwwqոe 0o^M5^op{ڕi^^ .*sqfeZbNkV{$+ ?8?wl!gb42,4pqd-6P*7dS22mn|\vm miϼBW.ȹ3"{i|JH~Yz}>-Wj&kù|W"„VZ+] $/BF{y~e[?oncS܂]vyؿn!WvҰz~Ulo{Ӄ?\,Xs>[Q5V܁Ơ@~|JڨlWxS+2B^*΀c/ 뿽 |muB?*^@HcݦM#9۠mH6q}'L# ,UcM>עFnjPulJ}ff nq j[U^L<>1 \>-ޓIJ%MlB5h5nc@$z^iSoawd48Mr d^@k֣@[_*aeAbV}.-ݶ?@tixh 7}ZXn-Lʹ3jŔ# X r|p8dm6<):/h[%-]v}fkVB֍{B!+ûCIvT8EW]9A7uk]F?r:覡qdDL`/p+|ZS@o=40s"2a&Ɍ{+?PSe>풙-DL[_* O-iܔ!LW,sPq||KecJ4Q% ܓ6@~%:͍ Mk KkŠ<Ҧ CMTj9ESn<*/vm靦^<q9h1zĀIi~JhfI>P.,*$ݡ0knig lO-];.(-,~hx / Z)qZ!#2Z"0ˆ@Tgi0. aPeHp餶]A=k-h8ww9,rGZU,bSM6/>ι`m`31<̒}⪙7JOѫ:CnɮX"Ms: 7"m 믗-'T]eKM^w=5w%؃xUTB ڪ ̚S˸b9'ZWWm!,o>a;I`u+?MG9W @#PI b$;I Sh0L2B䂼/>ubzB 1w L e7꾞/3ZG_p3, 1b>Qlig :/4&#Z##z5RL5i4njaYT)V2thgbn {zt)殌#Ð23GZ۸A1q#LVNYzJgs paHl]kl9O*Oŏ{.Jhfp4&zt.4 Gs-A1+p`C6! t۴Qez̺Z翤W%]b"U5,QoC$ؒ%WXNMCi٥$ɿ,{du{0hj`#MzTc]`elfj\.8uu7W>4e} \C$m^spON{][l(9_Ju&_mut˗,OaɎ\wlR;pZ͌Ч-T1SK#܄mV]I$y% Nkji;fڶ6bʲIk\!h"O3Abkv]R`}{A%/`"4Ya'ke3u+j;.KY>ػ3bfIѴy'zv[JJI[ְޏ{ Oj!̹ v0ONާdmn/tF)tXMgsMI6%$ϹJCk+`dfa}(eѲqW“a\ƀq:QL2|VZ`v*)׀+vNt5p!`mMWOXr)Q+@8ѕ3k=#81FY,wޝꑈnXcA_dž߬"ըi]bZ̓eb.4]S[Bi(YD]D SXжR mvͬ.>f<\6O*씔JT!55J=p})+o, ج]Mpa0/Ŋ)S,ݟ8*Q|6Ό'2D* -^)jgI^o©xn."؛-O9O8\Qo. > w;4޸-MozKڹ1f#SsBb*j&>)fM+8VY.^&ޟ=e U8ߢ/ҝcycu@˨ WAU* t)ǭ"KD]ʺܨ+A>f",Z0L)hA,gL|ϴX 6ED+x-~<Ŀ|;~lZU6Ҋp?Zb/D}X.|jU$!h/~q>i! z,jIS{soMdU+}ta+ǞH,X|ܬ[t~)x & >^k#썡ԛue8uTYY6 N%m=S/x#̬wLޱtPall1͂å@ƘY`~Ƕ/4N 96mT2E{Z]=z X~e..-^I2Қ1p!$̣sM4YA.ef$-:1vwscomg݊;^˝N]zA'|G|,6.Nc z^S>v?/ǣJЗ ԉn=tjD'Muwd(cz. $K%XܔmW$.q @F #2)+X7"h]S_kgkyڦQ(Նy׊>C?.2dAfbW4lv]g&d9NuT!F_NʏKb6L6;E|/,jNLu$Y-rΖ& /~_0[*!Y`+S({W;;[~jV=RnjafD|OR ٘XmBB@Eb~˫ ~mh|)& %<ټLsA'5e!, Qؿd)'z)Ao`i4#U{jT'"ݠ5 D7 ¶JK(+ #/aWԫҲnY.Ⴎ(d4h:I>Ń z1Bvyg(Gӟ(Wʆ,QEWa:/7䇡$6w@ꐁgH+ ;lC^,5Y,}'\ߤbWm '(V6Mդg!!1_/;n_~?#!a ?ձ:GJ"#LO< Yߚ΋"tXoQsnwA,ke̱5-ˏ ~1eKt4\m~ncf]uEp5 9V۟kuC).͚ 3x?hi CxR dCt1#Pa!STېFӔb`ѕ]FomrK'ٿl*Kuendstream endobj 303 0 obj << /Filter /FlateDecode /Length 4736 >> stream x<˒8r>/x}3˞7`c aƇ͙*X#@BH H;Ћ뇫_=^?YYxӇ!wW."g֫+.$:Y}:ْ~QG^5 {Z+\&Q?g2e[8 6e`qo 2EY2H_.QD. g0 6,(~ZѩD& ; w{I|f;_PJ xE\izauxWHT PB4G-bJ ̇;d:#Q h~{+6Zeõ5׃D+CT){XlSD|0`T"= $A\<9t/~_Ql/]wE;dF`@&}|lmYh'/\fC$tN[Z+% |qupm?毃OqZ{ZJ6؈ Pmj|e2H@yxZ61 ZCXk{M u0~fGdàQ]fD638R.SkcѤJ3;I!S ~8@:?2M|)~E`ǣ}Ӝ,6AܦW#paka;p(fV]Z{DT +)]9!G%3lMzz&i5i%Up hL MRK(؁lz<"4 3\m\]o|+$ZV#t-ٷ(T .B/F[uB7Fp,}sAd~,Di<R@B 2EsJ siuiT@7+݈Lch;0G r]E2e/{)_҆nmoKFUtFQs,&KA>9I>ԡ$A r0)N& FbN[q? -M,la4É fS4wtr;QՃ(r<~XY\f &,'3%yZE64BRM+A{AG']pxN- M!zkȨLwyǫr`!稤r L.ޣۻ-S­md˜ !5ښ&1 bѥz33VeiT `Fj gqWvN@f¦iՋd܊ށ~55fOa#b*$GuG&yM<@yͷjϘI*JB̶8(4Pim@A>ɷ1X*EOKϧc@Y`ԉ@S-BʏP0K#AK4.^"~rSa@ xvѾLCJ- IZ7zFGktKy[J.O: -^~ؔ#棞y*ʴKd8qjZPX(;] 7mٮdo/A_ËXYMG/cgx6W,3{﫨ynwp;Sb#Kr1xǁSd^]]Dp0_^3txN_׬1k8 ¾,{si}*-*&|0V(zOqsU$u:WuT,ӢL.ED4jkЫCN͢-xb"yq2|Z3YJ0ɭ 6oPʄ^?'&[4 :6_+ .Rj%)~Q A1~?w f>@uaΡ 4\3 *LY Pږ A0 (=~,D8˻bK~!NTmO~\ )xc#[JYsA)v#h.I60U,|:NT.|yml)jsU_֊:cF<?u؟V|lD-QaslB.U5`:Ɠ"(q~qu= b7`ivm젥2v%>yqhk֝Yf9%al 2|(Ԛ*sN0yȺg{]Y! ΅FT,["xW Ө. `dU]mo6O9S\зO~R:P_/ɖkBlt>qz\3>n\jNBh0גOHx*v} ֊M"wLܡX83Wn>#X$6lJ~L5љ&6 ,W^'2[MI0b.(3PDS7m;pb}vùs/XŵlR#:Ƙ*u:/7 'R92d_,us()mXck¯c46r_%4T,ڙ4=%}֊b}Qؔf_J HŃ*mQ1VcO@WF%Rpc\B`vvdŬ&xWI !ңҁ xS3"**%I\5yyM5m|d#\:8r0fxBF"yvˆT&*hKb77RϕNBXiV ;`?S_cJfRz) ܰ%.GŐ {3|oнIj ?p0j 9tS">`Q#N=}?޿e XWyj p}9Jo&'ҁ<ǐx8@k> ݗg`K +6nr]SBY>Y0L]4&gxz=UR0U/#q߮KRHZ5 n9Ȏ[M[bZ\:ΚӆB\:i\JVFXHA]%4xe-\Vlj{-b`VbCI|L"XUrLf? cyH}եoafdTaJԕ"l;R[ ]2\b? yU0,hd߱|ޅ 2DDCH5D,j5u'a <#M8^ŻPm-endstream endobj 304 0 obj << /Filter /FlateDecode /Length 3646 >> stream xZYܶ~U j~5m'mK*g~ sQeJ'|;{Q|׬ֲ^U׋%eն,BDU}#N+eny4\ i7DV9iaBtj%6o:.t;wt%8nql)p\Ηi#/%UQJ"ĺfb)%pTq`HŪBf3L*6WCӥٶQ Y4Ai_ yBiYY984/y>U; 3377 q1T]if$d Tg&mRQ1vd\ V|%%Tԇz!gE*Vd3ʫU6ct{%@;J/w@ҁƼwq2hh+HMjܖ4xX>Y> M'Jy@ȣd$d%{DagdG l䂬[j;_2Q*lOL37A2Ί{t[F&iU|tB  z5`MbcjytX߬ϠbtBF<@ŀ\b=/KE:tޏJ˝V5lv/]Q}8Vق,|pElK7 ^.S|YYNQCivoևpdy20 ;B9gY9uIsCY.6_'H.fk SM$HpF_0Cu?ː=Zw abEjGh269|a$Vrx_oSjyfd%hȞ30t3[kwb:־M}АiJ;U|?K\%{q58LG (Ӛ&5Tf|4#: $9j;2I LP[cQeoP[qS$30k9xt Ur\=YճF8)a,Mˤ{\"-h)(Qj rT(!4CmaG͵5/,%i3B#"ڻҥogxQQtNx899D8) JMImT]ݾiTqS3e**Ɛ]5ͦgޅu:J]Q&^@Y" sGm uh!~+- )S|Ezk%M] ? +txߎ q-hJ }hsiJ^ 6hL8&e72r?MstrQ4(VpK VXAm\vwOl_"=s* 횠+騫Kf=C3!$FvaCVyQ[} WTRľxA_ϡ+nIO;LCmMae8DkʂWwLK'`r.a`]*h>ב;7J֒'M.̸MUjYg3Mc*짻áZ1$i1M1nqa TT'U]ۯ&NI".0}:,}m:k@C*AC* XQ ~Cl/ΫJ,VN`#O!!,7ҧ[ȑrg9yLUi1hR}y0U`+'HQ\捸7`J's712CpN=_AfK.7XtE Je~aF*9Ωh>xJ!޻6.ϟj ,x/Մ]H] da x1WNA?C FvHr(CpXK2R)ȃm)j,ȯr0*1U0p糰)s~ d~< 0/O9d{;$zWwyB*̔+2Fci aM:i e氡;NR>VhiIOt\˯F!Ja4jN>m,P]w{;8^}TW|uLJ,aIbw8>n j53Cys"Kl)3ϟ V@y .Gxi\K L;N }ҩ"/bկUKa 3Ym궥1px7 TJڞEqIos\x}4z80?@seB]T@.&3Eo*D*Pgpg]l;~O;3s`Bߧ>׻DYvC *\1ZZ-VwI؅e:042> '5I -:;-2s GsW9{CMNRrT aҨq: Ca+ēy1V 2LE ${27>GzKr\3lԛ(cu4vNȃM l9SRеfWr[)"܆%.Rny{ܑ=NJ!!gEDZECIbߍ*pϚL!â?kp*cs[OO:GOY24{/fFc0ZPC4mغą&=K:`0yB K&;7ŦIo+͖40-d(32{ |(NQ: yLj;!\~I Z zwћ]4HnЮ /U`|8U )S\V*nj PW7w#GFӋD* [|/} ?$都rIV}6R>ʊmu 5,-*'ЛwUnYj-}5^߷ݽ96c$8B)`E= )/Dqlo_1ф**< ^&Uԓ'a8Wq8zd1?ic.ȌU"'TJɠ#%vB~a ^D^"T 'm!'ڏ, endstream endobj 305 0 obj << /Filter /FlateDecode /Length 3125 >> stream xZ[o~)b8 @jiu,} ]KL;s!gvWI\EjssQnQܝծ⋗Rl /,/LmFnx dږָp^b/U޹FYvjyIV[6O奔dm =w6*917׋Full!9%W77?KT0^\RKQʖh۵[)5Y o_R\^A7~ؐ8hdcw/I@ҞFߌ}Xd ۼg>]m0F^ T?RCHD%ɌIuB"h<~\p r~GIw#D! L^ҪBT Ȣ+љ?uyPV/>y?44BI;Ռ".%l'f( UfB `.rD `*E30C15/ń H>aP^U4&`b8 F XRՀ!:^%%ʄB= 1Te-Bs8u`0ԁ@ :HZ$nO_2U 'LQ9!kA$"Y8IBb iHGbB2FN3 B%8"OjT## vl'N Dسp WTDҥ Ӆ(CĈ2F^3SI(9iPYpX1$"HlVMv t sY3 яD(`$R/I'J5 ʊl`]9NNx ʙ{F8H|]MxxtRD(epӭjwgXI "KXJ9ڐB0I*9΢,(Dp7‰D4LA Ӎ(EĈRF ^7 Q>ʍ 1N  A{B2aG"D2T^2H'UYJH nh6R"P' 3 Akn7Z;!d!rTHˍfMm;mFkT%?aJg_U :jl+J l,˿xnȦRinW|yiQݻ C*H dϿꛛ#r^c~qW_"d}6LA0quدJ|q87W/n8?6aW:I$$F4CD*'ɫWh]fAW2hA۟6qfM)0O?8`z}^ٞFŬ; 2h6xC/|lj˙ *"<0~W>xs>:\oOgqa'rs$3<" ˶};I:j$ _-IjTO/<<9:Av (*RZUN~ozWbR%*_vnG`Gjvmþk}jZFy}PV4|6A_l皈BKhCr{MKO@9-hN"͆YƀDk0~2F^fas}Vo}eYn n6iɚݰSnZ"\gD-;ҮA(źRгzEnF24˜z JrayI rb}O4/]әRSxA+L ˼Ku9v>$H*U&@yȿ ˥)]v0F)/$6ӷ)!o:p!/엂F^ fF6;çǯn̒KN8Cb#x}S]'~醱=cLyDahƺO_ Sx8#ӐI ~>8Svg="ClԱܦ9s asx5#3 })9IG*;8PI2Gi7NTjn")^܏)ܷK7wH[L#<>'h_I1wPg84;m 09_>\q+>m]N"{GjCv@1W3˸lB(gzZh],S՟8rZq\=С42Kg8gJuʆcwR靼"1uFhdܻYyl &6ʧ"l nr#)pM-;JX0 kK8N GB~3Z۸樣Y[L=`љy"1g&mS>x6?Kׂp)id4ɍ-1H/~,>d7֚>SpQsR!g\2~c-SFGƘp[Xh9Ò,Q;BgWnT[]gܹvSJP* ṇ]2~`$Rչ@-̡4&n3AGdO [΍ճ% T@1R1בF;3dcدZXzkl?\bƈ݇JjKT(B_Q_kra56JNfN\=m/4Rx;pgK/npC7c0V 8~ J`(t@A¤@m`E|n;y)B#ܙG~~֚_bZöv~vʞߏG~W/>I.gD솭]?_m"N.6WniAL_ endstream endobj 306 0 obj << /Filter /FlateDecode /Length 9926 >> stream x}meq @wF #FX&@hI-GágSSU}RbVWW[Wn7vnͯHU0p7$ᶕv~x9݇?qm⺟Zo:m筤~=]z wSJv7|>N/.?> O\0o?o?=c*^dzrooc̻ 6Zι>}snCQ& w71v[4aEvpi?ǺPz s޼sIK .s8͗f =:&a~s94puW(S^(q_88}p* #~;9H-/}(.S8-na.>Pd ,s‥ǀ] <9/ 1-D80-LAA"sU!9&s),lOa\*9 }M[ƆBōT >oQd-Cבfg;´ OKWXV% r2$, . S995P3`h F$oK9Gl`z=9Iu-e ;V amMBLdvi\8dQmv U!肵X4y۹`&;7-ˌӲ?&1-̶V6dQv2AaWg:]8o~_5alPe#ׅ;[6\zdRęfhV]4Ŷ. U! p5xn2I暐,S!y 션[Tt;8$o UAr;8tBVD9(cQ32!jHi23p6  $,>0AF.R7 ͏Ёag.%bh,C)Dщ~u &EW`ppX` 9Ȯ҇hR8Kб 9'PtV̴uIQ?by,uC_;y $paz ? *D]A8_P`;p;da|h*{:{sysي-4SW69qהiSPU9фeQhpQKf'f-l` @\z r~2oGZ6@GvUE]7Q9aa&æz^(`baq2 >0P.s8C&^]d*iC?a; pegօÈ28هhRŐ8\Mp3ц&1Ҩ 1R @R׌9 #8f@.=(E3EtAS#ⅇA#wqCQ(0wNoP֓ڃ1⫶x;84p - CPWzQp% դ~%O u' 60t(p +¥vQyJg1cJ҈73.eK07VE;)Z>hi #aKFr0wI.s8CM'Y,r샊,84 \cJ3I!ڃ8@ngs {\:P Dp 9&HtaP ݴQVL)4&gxR' >1/C}`n bP8 {U LB4ڄ)h96Vv4jkx ˹P; v1ƻ0-LAaBQnLÐ*DFw[+pa- !iT'0a:*.>~`ćٳK<4`vZ~ReSiѥ"K K.s8c-;#n7-nɚVk 1ÖP+Sօ-ȞL@ٓ)> %/.38BG&r{2`ɂ#Əp >`oHac<yn1{7O8r}LR 9\C&nL7 {g98Q*TfAЛ;Ĉog{c]:PI.18L*CȬmmr45ZsYfѢf& 6 ?wP0 XeA,E䈰0FJE΄[L9A! Wa킖0rܹC`j0GB8 U&qżP0gMrejە[fڊ^ZasسSX(c[E<,xl+!vy;zCCЛ;52̖Ug%PiT"A%61ACHExp8[ Hj2<^a W(S8|(6 N GrLAʁ)ii7+DL99H椩N`yC6&3Â#I*;ҫsĂ8Q q¾ppX0'`췓CUa0UI.s89Eq:RK >152 Mc9ˌ楽ǛH͓^2F \@gpHs Qy gM&֋xbи&@z`|RTa6/1nD> LGL K27=D`bGd<,i #p2g0-6|ZvY+u@vEB96&L{P`CDm5z4t.5&8욀 DDw8KMkLb =Am;Nփ)i!pa jz;chYz]X4NvQ20@P{(/MylCiPah5֨n>mf\4p %,Y}vr0ǥiUL p)qldW=L'RF_a~!M 9<9 Xx31⵷vr-LCaYNaB: F^ Ȟ׮t(q'Dќs* lp&žɞ >0PP-$(mpqvXzIiT_]Vފ=߱Aaa1_gh[zP.s8=+ӊy;-\URBƚodЋaMJ_[a=&-ʍQUZF"Ö%__kMD2'V ^-{P#Xd_V[APA3D-mJr!FA6%,kb/1܇Sz'ze`cy@_tZ\0hp` IFftQuvXEh=-]0l E_"72jޙh{W`TFX5I_e$E La_"aR7"AF2К; ؾ`S%06 CĬ(7fhIB͝9+V% hbZTوuAnx=Ф KV1{Z+E4nj"{GF^P 'B l%;'.gQnK)=Rګyc񵧱r3scqPï"}\.D40dzY"1KTRw<(Fj #c btXkwbDQ7Q3tD!z_eTbei]Ae[0jZ]ڢzdY$6#U:21ce!3)S(D@m+ hKaxhQS2ORVRt\dZl%CZ[sE"~Z.2 v`%W[cMgKGV+Fk iJmd↨H@{Wo8'9p)qn(!}Dp\jpV)}69h.zELo3qV0JRݩ F7 Wu v>9TtY)G^Ŗ!u+&&pkʀO^;FF&}8cA$4=Y00J9.j00 ɄW420JXV׳a=A׮u%ڤG_9E,yw lӥ!o9;kWӅ1f~`6P(YϺa!.O*KU`PJTtl<:nR$>0*Ǵp6ٱ&QKV+3!5'9!ZkV$wNn(T V򺊜-cG6WH7P FDn6Ve$S}e;hāAbPԔH0vrukb;a# 2qf*ZMzOzZw9H\-?R}*t pfwCƳQ æjJf &6QK֦(Q$r bcZElX2']YUF3֢cBYBhV TZT^a81/w.GE47+cFW/gNc/jAŋǘROp?*jԜ #arLV]3-XBt0C /NCbtGS&<a4N !e¢:cj忺"շa =Nex-Q6'۴L00k0$K LMìv6+A߶ۛmw)09MQ3>3Mo8Z1 9\%Al@(UIʣCag|?ㅚܮ2T/ J, GDN)!&Aw}7嘒yHE öi+v c y>*Ǣ$3;U 600#}*V'A=/5#"a1FeDMQ+*dӇ2vZ1iR!}lNKd6}@ I`a9Y5;tv]T؅9/G4=櫫+.*4Q] ھc1'Oۻ S&2w5W<ИM x1+r0+UJDlNbD\hlǴ@"4Vm6Adzuz/6]"NlI(h'4~ /Q=x$ u7`p(MDP>S4׿^B5Y*lEe^_n;xs^nfօ0XJ_?cEEHF"鳢|DS}9p5G?Xk/7K ^ny}:G+yٯV^nf^?qZxo^~\nGNPW_ՊZxeZ!m5m'&IqfhU VJXb|={f{W:}?hZ0 ~ />~if~L Ye_8rHe,!q>dDIv׆ҌWv݋LySfjh]ݸOj?"zo[))[-f,o 7_Qv-<7S/9M˽qZլ븚.qԄlGq xVa$#8uGP|ʅdQ)QpkX̊CJ8?nӫ~{l>I'ែ~{V~̨ye?}zfw1,lB+/ojr~ӝqD (-N/ƸT/>Z?-Z;=]/Br.|Ȅf)">ג|o7WyH 42߱ {뢡t{ߌeXKMEpuh3 Qﴇ.-^}==gk_R=X ӏږѺW9A ~T6c@Ae9Ρ߽d_C:a6ޣNnCO$s,sd"d$Wgmln|%_`9>c(D <_ 0]vk5UpR_[ˁK#ي>Tdy~)Q/g9J>l;l׼VPb^OokW4^To ."kLy2~!QzyS-^I-< 0ru~7`Yk{#,C t5>PU^=?^>BKv%zE@wx/A/V߿? t; 僚㛼./E/VOv /<N~Y_ˡ]Τ{%lgy^O==7M}}LGfkOGMG=]f}]ϺV$yyǾ$nwXnXܽ톍Mȏ[|"Dxڸc)OaL~_ݱ^6CGө4]C_yZs0a>J^׶bk>% |˧tKVoxj>%l(>e(FΑS~pWG km=bj[r<ջ|ÐDĥ?}mDDv,1|cTпNMrtI \6ѓkgJr('xt:Óq7uNqx~s4/~r.l?oq^+ӷM^$ʐXmJwC-]f1p8z sqKB`dܿ3M(W^zkG>^de!w{W'*Xkj)ukZJ)= P :/1zuꛯ 7<@7s6cw qψD46ir4vSޯp/yԏٟ`wɢ7bQJroW4E<.#%+JN:j'ua{1.|3$oF1څI$=B連z#eh.%utV_)7?O}ހx9jZikrzV qgԮK׷FA쉈鉫a$}y _k"Y+[qJYg4O4!oOsX;*WZmӒ{gN^:->4{<7F9|zc-s08׻xqnP] ap=LLg&:} G6.0sKRxY@qUG`e0%5/gCX)ڡdZ:hffs,RGD w$J|l1?>^a۔T(I{ }ȆoAq^0\ P > stream xWixeBhR6߇28nx8,BT(]hҽ mҦٗ/yiӦFPv ,AT<.sEgqMy{fM32ss+W$<:xnHK˖fs=ps}Eb1m$!yj9wYgS|O0#9 {O4LLQU%e/K*),(^HQCFj0zJmVS/P/R/Q*9 R3YlPj*eNy/_BbTi OKgLMvϜr$e0Y3g>}k'eL UռЯe;9敱$s5 ޠ=Ԝu8E N#fLq@ZV6;`+C` Ṡ_4P:bCL\x 2 \I)uFyhE~ /i02k$nFkizla4F˻W/ھ^Z˂,jt0њj{@GJIVnµ H=7cNڢMuE]QgKTj}lw_}̛/Iێj̾7&/<41DgǕOxs;+؛+a4gv7OTʍse.OʩM5,:I'6wHittM Bn66X4ЈFwOY< /_!z aChcc/=Z.y,ioQC1B f̼_Wԁ V`s6^A_ ~UzPY‘+w0#H2:0TK腂QdYGA%`6`Hzj1a  Fyi`?M`6Y:ޮ5떁"_A X({蔿笤P], FtnC'M@y$(tm(Aީ/S=h-В?{3W~+~k9s8 hXA5: ȓd7ŢV3/.׆>|Jc^xz1o}?{*VHm`m6gsG3Ym#V6fsj u݅g ~rpui_ >G{?FI)KMBQ(|gZIof$T[K,E[n\ZYYjJ/v7o*ȐwJ +z6^jylmZA.0mh3;yYeg@a l}l(0(R]Lw.SRT\Cg])΢#?ikZY?Qm3BkhE?a&R6k/_,M  Wl^hұv;)ygH9(5~? ]h6 ̲G0T@o(=}ll쑳 ZZteup(s|?E}ZkǏSԼ,Ot9I Oh5C7b|c'1x6)~xuGN9e=}-- xZ)܆`VԈvmugFZ }) Řjs(Z{~紿XcaA'\j| BѼC/a>~1z[s.=A=9Q"fS!t] dw ?Zw Q 6Z,8&F;6'bAS'[[ܽvn"H=(ڼ}6pK ,=>=2GcIH]LimjbU?H: W~t\?:y"4 -̻nvyPX2iX]NL֔+%PEg$ae7AEd=\E)»^EHڢpk2_|/ߍ``4v0gPl3Z,u*fLXuNgN+?h*`hђ(l% |zh& aLW$rZ34rdӕs$%J 8.S8;M>*?H m WJաږ&_;=ݷmZMg5'#;6 "(@rEuSYEIޜ}'~1Uۄ(m`Bs_$Yt+aL;Z #  c-'Xf I2,`wp\PMk{g`gginjF&lQ8^0i"7X Jsr^ @&NcV)6}0獮(v?2xe `7;ju:n7?(FF}V(f8ǩzm>Zp-fF'hʚ-j[b d S{-nܤ!$V(qŚx{R%x<䇈Wg3/AfMShjB oZvW; xjLJژ֔I?6+{}~(|v7#>=.^r뮌|zK[+ Gv~ [o? }-Ŵ&bJDjd1W[!FɈ#~XPj+M$Pݶ𧟧eb9(tZժNCHƣ:Nuz"Wd~ !p+Жoyh]vYT̕TWE{Am6+nUFUD ;MNA-k֒ʒN&%ay-E5/>VBWs4%0 _ZN''PO5]K_ AqzoRX|LL7D3DA>+2鷧EO~rto9oL0ñ ,^sPxr5Qc}=&|sV?k*> g˜m55AQ{"0u5~<]]nك@>;ѲL~@'qa"^ p] I85xMo8?p:4Ls UY2s $2ba}@(2v9#!ٺEܫ׀ j5m(!q3KxųW}>ď_?.l?<ؕY[E蟘Pb>:GGx<3)LOt.:7Qy*JH#ݰG7! l[>\0>FAzٔ}j?;S_+Mv!d&'S_ǯendstream endobj 308 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1867 >> stream xUkp]Y`hZV%4 i2Ё „&1q#;~[lB$K^+}ӶlKe2$x8PNIIɣmfҴM'32N.C~3ܟ~#DY@ xxOQLJ\W6Yw?X,ˆvsr$99xJ222)|{Aɠ$3k18,&PDJ=Zs ^%'P\oٹmE};a9_3UХҶ)L~]c^"tf1<]=6Tok6u.KU1sx( y vFl4&t'|fD]U&Ě Ї}_G`ܾ4z^ŷAe%vB}y0݇:`,xṡիRJDKVzh6w¯P wF ê7Gkзz|_yeM?Y4*uΞ<lKaӻ4L ,gDQ:bId-۵чa =ZI%HCO%?*G ]YS8`yE'[^^R8X_|tSo5o@dGuJ _7Ues[=rB5B F+Q-Bxxf-6HAp='&C0(=[w|[wO\K$?=5<uzTRsRf^bgֱmN/nL P !F8Q$_Uhh0\oݹ?\0] vwxCkE̡jx-Za0ƾV=r9VpfL7Mz30a\Be aO!#msU6]gQ%5{l^/Mc؀rѷQ2G0`2(}Tl9bJygG&Iƒc*aC5GK-Obf^"umn,#!}J]qEa1Hs9ɨkx'nWtʚEyeV[de`6.G/fG C,}(X܎|27{ hD4SCN;/S@j ~Dk!*۷ FP(tap.6| >P]փN0:U)O剱<.IvA/Czll O 0CYq?[Eg:z40}xQXg  6eXd~R}Jw9}G/ > stream x]T{LSWb{-Ȝ[Έ92IS7FTsUZZ hK R,)ΪAGt=sKǦ9NŜ?99}IDG$Io.n-+VXY\"g;&3'3 у9(Y3H8y E e "T\,IJJbL\.K%ZZ\(V**ŲjEQXNDÒ%ɢD*GFyD>i"ͤ@ڈY,^"8H@>G'Gʢ03=1#{ gϒ7Q8AJ\Q[{ҎO0wp_`p7 YB^ b4kl52oײp̟Yu@dLe8'/ﺓ|^0t{n f$Ic86h4_3kCЩ0|VR?I1f\[3Y$1/pwn>|{rmkZFujZ?$xnuQ+I$aFx e^ `?xлӋ2Sh@{9DyA$ڞi a$ `H(x`Q= _ӼPLV2d:TjtT 940-8Mq(pw)Vm;R.t:Nj<.qhfIvUG/7,LPTjkY&dWBĒ~_y'lq$ WBH$'3ѲH0ROv}2C;PLv5m:|;v#pT` /]5feQj+*حN r{Tߤ6y ZvUfr 6" -FY/tJO;5<%bwTck^禯T&Dw:<vZ.;Pl;B#Y9q_]QXmE%R4.Nŋph!h1m0@ N\ r&Hx8/%1M 6Lb>`An%A}1f *,ʖFbnRVFZ^Qp@C?7?Bs[kbvcֿnz1y//GZ84M 3]q8ջf Mgԛ!4Ĝm^@=L2~?z^!Z'֎cfq&?1q͎켔FQ*yB9G?#s-t4va%endstream endobj 310 0 obj << /Filter /FlateDecode /Length 196 >> stream x] w7@Xb6M@8 HP}~~n=¢^Qc.{P@G#eEUAU7dؓ"< t(Dg ;L @,EiMXSgWGDnI誈\${I%<=p[ B,_E/Neendstream endobj 311 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1054 >> stream xRmH[goos%%4eŲ/0]?Zs%ѱ(KhML=7ѤCAe:U7Fac ;7׺*{qpGVyW{ok/}%ϒYM=Æn.\o\r4v45_b1շ8FYvԹ6koߍqgڷS:[wq\vŻ O9z#a! DI C'uOt"~?0qIځy_3yy全 &zMWӃh P.Ay}[䋰+k}oeM {0f,Yβyd19a}sx5^iCmpWoCp )&gV?q?ҙn=j_5 FMǙ, } ˑVQkڈ8 !-ÇLgXƫ~Ы_Y2 .EfB9(AP+pƘ"!. z?HRz} O8ҎiǬ ՝\樜 >6$jix}}8__*lk&$! p<ę۶o9j4Z)͡c$)!p{躅&Hl04*Qݨ׫,C9#H Wϡ걋ꎱTdBG06WeeЙ ? Pmo-yyV82?G/LAƷXa еw Oꑶx?CVQF!%2MP@{`Rd;F"O3)ӊ2%>r[G&/$YKL5qPˎQz0?ͼzR;g>kr`CyX+4ͧk~0[ hQk<{`/?YG`)6; )|]l!繉蠒PlN[endstream endobj 312 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 821 >> stream xUYL{Ct(#ڎŀ5ACBFq ɍA#"UiZJ"^l@˦ [+I\/ nc̙T}y:|uaF:{iOޥs7i)?;FW9ĤY>k"%<L$bHd-d5nfm %}U03ݬ֡l@%-+RT!(Buc:̪K` KʜZLOeV]~)?AA.\8q\muQ[ HSif做,2oK1^ ېFmOwUYU 5 hJ]tK4Nwy U\zS1yGKKy[95kZ.+a}0l-Il, |"F^CI $w(yC*ycrPct5뚎>q#pE7; (2/4{ޅc[0yx!ǿ Ŭu<pO'cRrɗr^q8Չ:/[(b$]x,[2mEqxqj#C rP#zFZF' |3 lP}x #OKK_Qfk?8}~/=N:7nkTt;PُIY?Un gSfsox-.sp>Ƒld1bRiM -lH;(j՛L|B'Z?> stream x] @|0Ƣpp#8mxxMmC۪?).:]a!&_>?9-o&Em=3H,NP]zmr{M#N)Ӆ`$j׆!TZڠ6AmQZ5hvۭaj0 $?i(ZﳍtR -|ޑV gs.f~endstream endobj 314 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 793 >> stream xERmHSQ>wݛ9rw_}!EFe5il35zyݝLk~-2DT?QAEq:RYpy<*2 V8xhlsoۦ#NWKc@"`6nr\ےKNoNq"hT2n-G(vTKIT !F2hjذ ;_樼֑W&4 صW4- +|w+I=)B~TT0(EcBbDBcZma(ƨ"]VU۔~Bh 1:r`(sk'0Kx]Ua?@#CO\^Ki`Ԅ雘3G⾗ uI>ua+_H. VCtn8!sɜq`?+ϛ㒠~m-{ىPo?: B\L .I8ܰC7/ı~o^4NcDz{? mj !qRZ%J|l._:IZ ҡX[Qpjhg'PU Ci? a"XrhGR ;+^ Md@֐JR nA8EͣsE!Ȓ `'{XRaq=(IH,bbJ/6sbcf19EⱈIGUendstream endobj 315 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 342 >> stream xKMSBM10SA  R3fQ*|{d|fZsYH᱋ ' y{yzĐYYRxzyzRUkl&JmX$xU}h lx2~{w|pysF8* 7 _endstream endobj 316 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 535 >> stream xcd`ab`ddM,,IL6 JM/I,Hv×e˂O 0S^?C 3̸qՌ?d]EkfemW[E\uXR`D7GE'͙@~֦Ys]k]m-vu^jwjwaIevQR}Xw;GÔ){&͞ 7ի9w'5V7&˗۷GvJi;wYfXtι)kذArm+vsHPojؙ~ 35U2]iXYc+6ccJQ l'%[af5+v={~ǜݓ'O]Q\=}¤W[xOw+˛m,͜P~sމ=;N;wWؽ*OlӦ}/XkKH>ޞޞYsLa`&endstream endobj 317 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 285 >> stream xLMRoman6-Regular-  +1 V- vwMr}qqr}}rqq}rcw`$mIK%gd͋ǧj~$`dًËËً‡vCo  To /'vendstream endobj 318 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1709 >> stream xUkL[>di-:'[FLjSZ-ں#4$@4q 1{6fc K 0IFhZd[d]cC*Uʤi;\6UӤt=>%'a<oW_n,]= +K+GR ɣpm/>~ZYQ<[Q%ͯXv S!0ös0X2%n$4ɥ?Mf]AᖧhX)I,𙟣=":Ju'o1y}K0ebn7g{F96U=ZPoP+[spRTCt.ǠV*ZMvʪX:'vw^39lji(A_\B]EIK}Ϙѐi7X!~bw Qڃ9"(m`SwP^xttJ^ ǖ9Arײqt }gӒ=f!tS)-$Tfji'a=A34)OygQ2 X58-eA[lQߓUk~NIt-* NJ2Rw^ېo>`Esoye%Sq&">B)w vD-Vu qe('7JtocWQ,yu<LȽGqy/!kp'1}va[]u#wNWIG)t8 ڠ`eR4:rs|9rPd]#A;iQKI٭Ϯ}nnȆ_Zh&TVWWXzC@c%[e&FdW@oUeU%k~ItE O4~Eʾh6N9;\o06AKP#ϿZxb앑,_w/2d_^G=3j9ќBZn4n:g%hZ6q;C6M,˷J@g<\AOň5d롭xgJ*|fa4Yo /ZHfU (;jh?0晟);Ϩgy7ǟwBHFCdIgl'C׼`6U9~|Kfg~6yE$-sG@775ekL h8rOkh@ծp8W8objE(pjg`ctm` p(*#> 6>Hƍ&AN {J i4V 4@ɝG{8p~:i>\c*iH>E7n<+K $|Ltyۻa/1rO;"B[BfmzpZn$^&+^A|mԭ!]S/:endstream endobj 319 0 obj << /BBox [ 1030.75 5607.35 4999.41 7330.29 ] /Filter /FlateDecode /FormType 1 /Group 40 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R38 14 0 R >> /Font << /R153 41 0 R /R155 43 0 R /R157 45 0 R >> >> /Subtype /Form /Type /XObject /Length 1842 >> stream xX[E%7LsQ7< "/'E}o&IDB3Uu9U ΪCih6|x:|x|6XJdkSv6X5115)3K4t$M| ǐ~EïϿ<`ǿ?dV32jg] >cFgӕ;ڜk;At}w |xo >t` Nܑ4Xϼ(So8聿+ܼ;}K#u 8dz_;'O?>lNz('9Bӻĥ{={AgŻ`v#&|%pYl*]yzJ>%'xϑP)}xeu-؍]*.ͺxoW0hY髓.APc@F\tLw{}u`e"^_]+&U9:?#M;V_^8k@,klM#|yܣCͽߏ6uY].-/Ҕ,ٶ ] n&gwN.L';'$uR8b>ON>?^Г˞H@q"= \)ѓ#C ʞE8HZ.e"|+DCE#BV@n\>&X }ӄ#LQLHP +R˓PN)=+lY]=^2<CG+e$-n&գn%jѠDLlzDN8J^r0B6U^GOT^d >9p@LQk~w1)RgR Tp$C3=c)߂ASiES6DgdcoMe#xLR-QitU#_CT(2V8.B/l:3:b7h[4:#/!([Jθ#qM2 Ԫ4`cpiFm{FCd4_&PH B&v*ɥJ$%02҉,V-x ,aL߶B X"H}; (`ԍ)841[kx0 `α1a\#;^D*Hy 3rgIX FM""¦R&Iulo:$CF+uAX_46CZweWNH, )݉NP i4ixJX=AJΨ[tt],.tYoJHiu4T90n]uqc*Ьu5WG M2BK+<ڰF{|]@FYR_4UW_@ t-vQ`*bl >7y8X[ l/1q{y0~WvׇoǗ.ײ6ZCcX' (Ց>ytP  p$W@[MzP 87y8fp\o<ƒV{6Yz$PEjO8IJٜ9 b0PYQp"%R'U(} @+g]Dܜք83c=M2f| =[uN? D> stream xYxTUھ!R$$!7+(ҋiABK!RfR&d2K${ .Lh.*e\==3CHfBs=~QCPnnnc׬])zwl3gl O/̌) _aC&BU?eom{+V%&IeIٻo]7EFmymμL\8iS_ 6/23Y)yj=@-&Qdj5 R-TZFmޤfP۩ j%5ZEJٔ?5ZCͥR(15(wj(%DԳxj5A-FQOQKєK<R;7%:n C!=8G~1lϰ̾ᣆW6⋑~^䧺GO S<ǼkW}txg씱?{k8O.Y3%OKvIsv\鸻n}ٯ?5;DŽ υ>Phl??zw"-(jca?_DC,<>!Luv>C:0[e~\<1dAC[ŘtQڼeGvo/i[ɁL}yw1f6, l/HPt>/ 8f%3kA+Dl󃲛OJN5.k}(qkt<6CSЗ67Py.q*ŞRi:jŬ_}ހK~ d6/EDA\!F]C,_ Nsr30[?-2`s":%8FҥPq@<vtNTDR|7vݝbK{(@IMxqn ~G/գO^8!'Ր`6Uբ T)RtZЧ6 X X1^  zK xzņ. UiP|˾CpʾhD5$g ԬGM}UQf"D{:vSr${5bceԴ+$K@v'xUT+x35`~^y}aG"{]GU8DljT_TuhRsXFGԌNBFx%8U_˰qh -zXr HHm)[-a\ ?gT$ 2؎cPx1qi>d+9\EFI"M:L5ʲ{HF>Mt !=v+蒵I jcU[GÉ"7@)0-G题~> Vs/<;Jʛw#*;a+N[cX{/CZ#2S 13 i"vʮe$j̍. "jd;%{|]ujs4/AȁDB"459Lsvs3,ӴOyِ'"Oqس:WŚZk>Ր .ع\G&:]SɀAux+S{ӏgPnQ튜 ;`sa F_/<H{ӥi[ e9]7%(lzkG)=l<ߎTbs#:ݸc , GSь ҞK4`ʐjl ~HAi + x`/,~x-F'RG2fhV'따 -Z>N#^".9|$+L .U6 +awEJ?НlOL-gj+"^Ҧ >λNo !֡kat`v[ "W3$nn{>μ߬ޅi>O gw 51(m5THeJ0R~z_'=,<|h<_DEM-BS>YWA5T뗷#_7_u~N+ DR&;ʰ %MjźDtw Yo'dKBDķ]S\zx,n&{Wy@9 h()uppx?:3's?48Nq Bǜ(}O^m0_ȃ= I@8p5 7n,}dɴNcYWiLC_.8Gj4<.5:'>Q LR(IRo34܁QkaQNC^!6>umÁ;|Zw+m?YG IPaʔh!+5Zn@.P)zQ1"5no_Yyaz Ϛ[L‘7+%Yjw."R`,5I*Jqh2rbAM+dvsa}O7ǻ0$!u JMDyzIrs3Stu" 8l {cy_^BG<bCvv#\K Z$鵗~ƶf]֧}El&e|컛8INn wQO/~Gk2SϪw `'>NCHQfh(6Zz+/>EO:KJ]VrM8_3$]MUX#qHvѲNFb ]RwŸnz8g'=2tV|ք< @kF2ɬf.mm΂ ~;YrqKԞk/ס]i 4U:Iv=վR;qۛ7 >]D澝r 7eP]͚n8y Eud]} у2i̧^g[yg7إgej[7m!h?^WUdMUYQGe.ةXW:4aKt)?(ռ :2@+'U,1c2X 9>#[ ;s9TsFUP_D2cwfm=ͰINI>DU! vM)ݼmUMeVJC0phVQͅAكOw]aCھnv4 &YJ![ q`L|nN,l;V[x % } tc\TM*ĔD11EiϠy)8{{x ~M} }z23xv~W yJBmO J㮄`ة)&`6NWMP?xٞ`ա (#XR-ﶞe@#0#'ڐTr5F5su TD;^,X~kTIF%hKb"H)aCVVD$̹$5׀3lV''|Tj{zb0k f 14^h>UMb$2ss1 mIV.DOf=A /:4ٕpBJHPf#~4|4 cp#,+у HW 3ב?ȗ=͞ b+ ڂGD}!h5Y ~y` ]4ϡ\C4L8h uįT9A-RQ钛^J~EfQ;>X&g"ّүXyI*HInc~AĻG6|v> B^*\" g"b}ʎH$bA$Oj8p蝾(lقVq$P߇ӹ{7,wiCge^gBϼ}H Qc{-IX\q4.C NW  Hh ^=0ҬLq<:?EkVC*Q\ú GNΤ6CA}xJMTt)6Z^YGp`m~5RͲ2)0rRϿ  [HDkOH. +Kl$]j7LN0VHA4ޅ,R}:Bs)ԅѲj+rs%&v3 ҼG+!R m"WI]yf Σ.ݪH=>]@vu(!"'lX:yAR)!1fe8@g;)Vq>,ܾy uE}(R4MAsen|%.tF@&0~;h8]Dlet hXaWR|AˌOqѥt& u:HƓ r ~ڵ[٪L].XHĆ"KW񗻮`ѠץC9,x7 BC ֨OZLEZS\FU>VU7Ysȫzā;? y[v)XBF쭂R z_Q^iTZFҔ^.K-%3, ġ\2`%UT0EPϭ7"A&4>a C&hqO'" &N$4]0Oe;sbu2D\U$*& Tqe|e`SN^RBq(43ŹjSZS? o* M9$ۅ2 \H_4Ѧb0~ x{67k;t$de"aGH,}&) x H5վdJ!CҘ;s8@D\yL$7^\`:{!`*>8rsݖU5:^^Zm?@C莎#旷mAk:J>hܯߵQ/սrݱ?Rc6چFԦ>6͗;'3UAs7+dzzM6\S r3&R>$g1} 8+K'uãW|rUhx4E妦"}qv^[?ߖVxVktzG~/ ?!Rǚ[r !iB8SS;C֚" VjK=Wk"9joAԑuQY; XĪdr W5̵hn*YK)=Sr:^@m^{szbHނ.[rP'֏ gD֤W9`n-] 2읚iDLRx}~VXW6~@ptuֆu$P[m1[U ( o{hE!f!ZRh*m##Ǐ7j2Kc2YFƃ}endstream endobj 321 0 obj << /Type /XRef /Length 244 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 322 /ID [<4ce3a6b3a9ad0b2ed29859ec1c98c840><0be2982386b8c92340bc2949b3118a22>] >> stream xcb&F~0 $8JP?p B7Q6T;GFS(6LJAp+(mH>A$"H 5DJU^@;X"H,<`:.v`o o2\ .W Eab dZ bl#v)JD H-`W-F^6,"".\/` vd+G endstream endobj startxref 430123 %%EOF TSP/inst/doc/TSP.Rnw0000644000176200001440000013064015001730346013603 0ustar liggesusers%\documentclass[10pt,a4paper,fleqn]{article} \documentclass[nojss]{jss} \usepackage[english]{babel} %% my packages %\usepackage{a4wide} %\usepackage[round,longnamesfirst]{natbib} %\usepackage{hyperref} % \usepackage{amsmath} \usepackage{amsfonts} % %\newcommand{\strong}[1]{{\normalfont\fontseries{b}\selectfont #1}} \newcommand{\class}[1]{\mbox{\textsf{#1}}} \newcommand{\func}[1]{\mbox{\texttt{#1()}}} %\newcommand{\code}[1]{\mbox{\texttt{#1}}} %\newcommand{\pkg}[1]{\strong{#1}} \newcommand{\samp}[1]{`\mbox{\texttt{#1}}'} %\newcommand{\proglang}[1]{\textsf{#1}} \newcommand{\set}[1]{\mathcal{#1}} %\usepackage{Sweave} %% \VignetteIndexEntry{Introduction to TSP} \author{Michael Hahsler\\Southern Methodist University \And Kurt Hornik\\Wirtschaftsuniversit\"at Wien} \title{\pkg{TSP} -- Infrastructure for the Traveling Salesperson Problem} %% for pretty printing and a nice hypersummary also set: \Plainauthor{Michael Hahsler, Kurt Hornik} %% comma-separated \Plaintitle{TSP -- Infrastructure for the Traveling Salesperson Problem} %% without formatting \Shorttitle{Infrastructure for the TSP} %% a short title (if necessary) %% an abstract and keywords \Abstract{ The traveling salesperson problem (also known as traveling salesman problem or TSP) is a well known and important combinatorial optimization problem. The goal is to find the shortest tour that visits each city in a given list exactly once and then returns to the starting city. Despite this simple problem statement, solving the TSP is difficult since it belongs to the class of NP-complete problems. The importance of the TSP arises besides from its theoretical appeal from the variety of its applications. Typical applications in operations research include vehicle routing, computer wiring, cutting wallpaper and job sequencing. The main application in statistics is combinatorial data analysis, e.g., reordering rows and columns of data matrices or identifying clusters. In this paper we introduce the \proglang{R}~package \pkg{TSP} which provides a basic infrastructure for handling and solving the traveling salesperson problem. The package features S3 classes for specifying a TSP and its (possibly optimal) solution as well as several heuristics to find good solutions. In addition, it provides an interface to \emph{Concorde}, one of the best exact TSP solvers currently available. } \Keywords{combinatorial optimization, traveling salesman problem, \proglang{R}} \Plainkeywords{combinatorial optimization, traveling salesman problem, R} %% without formatting %% The address of (at least) one author should be given %% in the following format: \Address{ Michael Hahsler\\ Engineering Management, Information, and Systems\\ Lyle School of Engineering\\ Southern Methodist University\\ P.O. Box 750123 \\ Dallas, TX 75275-0123\\ E-mail: \email{mhahsler@lyle.smu.edu}\\ Kurt Hornik\\ Department of Finance, Accounting and Statistics\\ Wirtschaftsuniversit\"at Wien\\ 1090 Wien, Austria\\i E-mail: \email{kurt.hornik@wu-wien.ac.at}\\ URL: \url{http://statmath.wu.ac.at/~hornik/} } \begin{document} <>= options(width = 75, useFancyQuotes=FALSE, prompt="R> ") ### for sampling set.seed(1234) @ %\title{Introduction to \pkg{TSP} -- Infrastructure for the Traveling % Salesperson Problem} %\author{Michael Hahsler and Kurt Hornik} \maketitle \sloppy %\abstract{ % The traveling salesperson (or, salesman) problem (TSP) is a % well known and important combinatorial optimization problem. The goal % is to find the shortest tour that visits each city in a given list % exactly once and then returns to the starting city. Despite this % simple problem statement, solving the TSP is difficult since it % belongs to the class of NP-complete problems. The importance of the % TSP arises besides from its theoretical appeal from the variety of its % applications. Typical applications in operations research include % vehicle routing, computer wiring, cutting wallpaper and job % sequencing. The main application in statistics is combinatorial data % analysis, e.g., reordering rows and columns of data matrices or % identifying clusters. In this paper we introduce the % \proglang{R}~package \pkg{TSP} which provides a basic infrastructure % for handling and solving the traveling salesperson problem. The % package features S3 classes for specifying a TSP and its (possibly % optimal) solution as well as several heuristics to find good % solutions. In addition, it provides an interface to \emph{Concorde}, % one of the best exact TSP solvers currently available. } \section{Introduction} The traveling salesperson problem~\citep[TSP;][]{Lawler1985, Gutin2002} is a well known and important combinatorial optimization problem. The goal is to find the shortest tour that visits each city in a given list exactly once and then returns to the starting city. Formally, the TSP can be stated as follows. The distances between $n$ cities are stored in a distance matrix $\mathbf{D}$ with elements $d_{ij}$ where $i,j = 1\dots n$ and the diagonal elements $d_{ii}$ are zero. A \emph{tour} can be represented by a cyclic permutation $\pi$ of $\{1, 2,\dots, n\}$ where $\pi(i)$ represents the city that follows city $i$ on the tour. The traveling salesperson problem is then the optimization problem to find a permutation $\pi$ that minimizes the \emph{length of the tour} denoted by \begin{equation} \sum_{i=1}^n d_{i\pi(i)}. \end{equation} % see Lenstra & Kan 1975: Some simple Applications to the TSP For this minimization task, the tour length of $(n-1)!$ permutation vectors have to be compared. This results in a problem which is very hard to solve and in fact known to be NP-complete~\citep{Johnson1985a}. However, solving TSPs is an important part of applications in many areas including vehicle routing, computer wiring, machine sequencing and scheduling, frequency assignment in communication networks~\citep{Lenstra1975, Punnen2002}. %and structuring of %matrices~\citep{Lenstra1975, Punnen2002}. Applications in statistical data analysis include ordering and clustering objects. For example, data analysis applications in psychology ranging from profile smoothing to finding an order in developmental data are presented by~\cite{Hubert1978}. Clustering and ordering using TSP solvers is currently becoming popular in biostatistics. For example, \cite{Ray2007} describe an application for ordering genes and \cite{Johnson2006} use a TSP solver for clustering proteins. In this paper we give a very brief overview of the TSP and introduce the \proglang{R}~package \pkg{TSP} which provides an infrastructure for handling and solving TSPs. The paper is organized as follows. In Section~\ref{sec:TSP} we briefly present important aspects of the TSP including different problem formulations and approaches to solve TSPs. In Section~\ref{sec:infrastructure} we give an overview of the infrastructure implemented in \pkg{TSP} and the basic usage. In Section~\ref{sec:examples}, several examples are used to illustrate the package's capabilities. Section~\ref{sec:conclusion} concludes the paper. A previous version of this manuscript was published in the \emph{Journal of Statistical Software} \citep{TSP:Hahsler+Hornik2007}. \section{Theory} \label{sec:TSP} In this section, we briefly summarize some aspects of the TSP which are important for the implementation of the \pkg{TSP} package described in this paper. For a complete treatment of all aspects of the TSP, we refer the interested reader to the classic book edited by \cite{Lawler1985} and the more modern book edited by \cite{Gutin2002}. It has to be noted that in this paper, following the origin of the TSP, the term \emph{distance} is used. Distance is used here interchangeably with dissimilarity or cost and, unless explicitly stated, no restrictions to measures which obey the triangle inequality are made. An important distinction can be made between the symmetric TSP and the more general asymmetric TSP. For the symmetric case (normally referred to as just \emph{TSP}), for all distances in $\mathbf{D}$ the equality $d_{ij} = d_{ji}$ holds, i.e., it does not matter if we travel from $i$ to $j$ or the other way round, the distance is the same. In the asymmetric case (called \emph{ATSP}), the distances are not equal for all pairs of cities. Problems of this kind arise when we do not deal with spatial distances between cities but, e.g., with the cost or necessary time associated with traveling between locations, where the price for the plane ticket between two cities may be different depending on which way we go. \subsection{Different formulations of the TSP} \label{sec:formulations} Other than the permutation problem in the introduction, the TSP can also be formulated as a graph theoretic problem. Here the TSP is formulated by means of a complete graph $G = (V, E)$, where the cities correspond to the node set $V = \{1,2,\ldots,n\}$ and each edge $e_i \in E$ has an associated weight $w_i$ representing the distance between the nodes it connects. If the graph is not complete, the missing edges can be replaced by edges with very large distances. The goal is to find a \emph{Hamiltonian cycle}, i.e., a cycle which visits each node in the graph exactly once, with the least weight in the graph~\citep{Hoffman1985}. This formulation naturally leads to procedures involving minimum spanning trees for tour construction or edge exchanges to improve existing tours. TSPs can also be represented as integer and linear programming problems~\citep[see, e.g.,][]{Punnen2002}. The \emph{integer programming (IP) formulation} is based on the assignment problem with additional constraint of no sub-tours: \[ \begin{array}{rl} \text{Minimize } & \sum_{i=1}^n\sum_{j=1}^n{d_{ij}x_{ij}} % = \mathrm{trace}(\mathbf{D}^T\mathbf{X}) \\[3mm] \text{Subject to } & \sum_{i=1}^n{x_{ij}=1}, \quad j=1,\ldots,n, \\ & \sum_{j=1}^n{x_{ij}=1}, \quad i=1,\ldots,n, \\ & x_{ij} = 0 \text{ or } 1 \\ & \text{no sub-tours allowed} \\ \end{array} \] The solution matrix $\mathbf{X} = (x_{ij})$ of the assignment problem represents a tour or a collection of sub-tour (several unconnected cycles) where only edges which corresponding to elements $x_{ij} = 1$ are on the tour or a sub-tour. The additional restriction that no sub-tours are allowed (called \emph{sub-tour elimination constraints}) restrict the solution to only proper tours. Unfortunately, the number of sub-tour elimination constraints grows exponentially with the number of cities which leads to an extremely hard problem. The \emph{linear programming (LP) formulation} of the TSP is given by: \[ \begin{array}{rl} \text{Minimize } & \sum_{i=1}^m{w_ix_i} = \mathbf{w}^T\mathbf{x}\\[3mm] \text{Subject to } & \mathbf{x} \in \mathcal{S} \\ \end{array} \] where $m$ is the number of edges $e_i$ in $G$, $w_i \in \mathbf{w}$ is the weight of edge $e_i$ and $\mathbf{x}$ is the incidence vector indicating the presence or absence of each edge in the tour. Again, the constraints given by $\mathbf{x} \in \mathcal{S}$ are problematic since they have to contain the set of incidence vectors of all possible Hamiltonian cycles in $G$ which amounts to a direct search of all $(n-1)!$ possibilities and thus in general is infeasible. However, relaxed versions of the linear programming problem with removed integrality and sub-tour elimination constraints are extensively used by modern TSP solvers where such a partial description of constraints is used and improved iteratively in a branch-and-bound approach. \subsection{Useful manipulations of the distance matrix} \label{sec:manipulations} Sometimes it is useful to transform the distance matrix $\mathbf{D} = (d_{ij})$ of a TSP into a different matrix $\mathbf{D'} = (d'_{ij})$ which has the same optimal solution. Such a transformation requires that for any Hamiltonian cycle $H$ in a graph represented by its distance matrix $\mathbf{D}$ the equality \begin{equation*} \sum_{i,j \in H}{d_{ij}} = \alpha \sum_{i,j \in H}{d'_{ij}} + \beta \end{equation*} holds for suitable $\alpha > 0$ and $\beta \in \mathbb{R}$. From the equality we see that additive and multiplicative constants leave the optimal solution invariant. This property is useful to rescale distances, e.g., for many solvers, distances in the interval $[0, 1]$ have to be converted into integers from~1 to a maximal value. A different manipulation is to reformulate an asymmetric TSP as a symmetric TSP. This is possible by doubling the number of cities~\citep{Jonker1983}. For each city a dummy city is added. Between each city and its corresponding dummy city a very small value (e.g., $-\infty$) is used. This makes sure that each city always occurs in the solution together with its dummy city. The original distances are used between the cities and the dummy cities, where each city is responsible for the distance going to the city and the dummy city is responsible for the distance coming from the city. The distances between all cities and the distances between all dummy cities are set to a very large value (e.g., $\infty$) which makes these edges infeasible. An example for equivalent formulations as an asymmetric TSP (to the left) and a symmetric TSP (to the right) for three cities is: \begin{equation*} \begin{pmatrix} 0 &d_{12} &d_{13} \\ d_{21} &0 &d_{23} \\ d_{31} &d_{32} &0 \\ \end{pmatrix} \Longleftrightarrow \begin{pmatrix} 0 &\infty &\infty & -\infty &d_{21} &d_{31} \\ \infty &0 &\infty & d_{12} &-\infty &d_{31} \\ \infty &\infty &0 & d_{13} &d_{23} &-\infty \\ -\infty &d_{12} &d_{13} & 0 &\infty &\infty \\ d_{21} &-\infty &d_{23} & \infty &0 &\infty \\ d_{31} &d_{32} &-\infty & \infty &\infty &0 \\ \end{pmatrix} \end{equation*} Instead of the infinity values suitably large negative and positive values can be used. The new symmetric TSP can be solved using techniques for symmetric TSPs which are currently far more advanced than techniques for ATSPs. Removing the dummy cities from the resulting tour gives the solution for the original ATSP. \subsection{Finding exact solutions for the TSP} \label{sec:exact} Finding the exact solution to a TSP with $n$ cities requires to check $(n-1)!$ possible tours. To evaluate all possible tours is infeasible for even small TSP instances. To find the optimal tour \cite{Held1962} presented the following \emph{dynamic programming} formulation: Given a subset of city indices (excluding the first city) $S \subset \{2, 3, \dots, n\}$ and $l \in S$, let $d^*(S, l)$ denote the length of the shortest path from city $1$ to city $l$, visiting all cities in $S$ in-between. For $S = \{l\}$, $d^*(S,l)$ is defined as $d_{1l}$. The shortest path for larger sets with $|S| > 1$ is \begin{equation} d^*(S,l) = \mathrm{min}_{m \in S\setminus\{l\}}\Bigl( d^*(S\setminus\{l\},m) + d_{ml}\Bigl). %\text{ for } |S| > 1. \end{equation} Finally, the minimal tour length for a complete tour which includes returning to city $1$ is \begin{equation} d^{**} = \mathrm{min}_{l \in \{2,3,\dots,n\}}\Bigl( d^*(\{2,3,\dots,n\}, l) + d_{l1}\Bigl). \end{equation} Using the last two equations, the quantities $d^*(S,l)$ can be computed recursively and the minimal tour length $d^{**}$ can be found. In a second step, the optimal permutation $\pi = \{1, i_2, i_3,\dots,i_n\}$ of city indices $1$ through $n$ can be computed in reverse order, starting with $i_n$ and working successively back to $i_2$. The procedure exploits the fact that a permutation $\pi$ can only be optimal, if \begin{equation} d^{**} = d^*(\{2,3,\dots,n\}, i_n) + d_{i_n1} \end{equation} and, for $2 \le p \le n-1$, \begin{equation} d^*(\{i_2, i_3,\dots, i_p, i_{p+1}\}, i_{p+1}) = d^*(\{i_2,i_3,\dots,i_p\}, i_p) + d_{i_pi_{p+1}}. \end{equation} The space complexity of storing the values for all $d^*(S,l)$ is $(n-1)2^{n-2}$ which severely restricts the dynamic programming algorithm to TSP problems of small sizes. However, for very small TSP instances this approach is fast and efficient. %\marginpar{time complexity if order $n^22^n$. Check!} A different method, which can deal with larger instances, uses a relaxation of the linear programming problem presented in Section~\ref{sec:formulations} and iteratively tightens the relaxation till a solution is found. This general method for solving linear programming problems with complex and large inequality systems is called \emph{cutting plane method} and was introduced by \cite{Dantzig1954}. Each iteration begins with using instead of the original linear inequality description $\mathcal{S}$ the relaxation $A\mathbf{x} \le b$, where the polyhedron $P$ defined by the relaxation contains $\mathcal{S}$ and is bounded. The optimal solution $\mathbf{x}^*$ of the relaxed problem can be obtained using standard linear programming solvers. If the $\mathbf{x}^*$ found belongs to $\mathcal{S}$, the optimal solution of the original problem is obtained, otherwise, a linear inequality can be found which is satisfied by all points in $\mathcal{S}$ but violated by $\mathbf{x}^*$. Such an inequality is called a cutting plane or cut. A family of such cutting planes can be added to the inequality system $A\mathbf{x} \le b$ to obtain a tighter relaxation for the next iteration. If no further cutting planes can be found or the improvement in the objective function due to adding cuts gets very small, the problem is branched into two sub-problems which can be minimized separately. Branching is done iteratively which leads to a binary tree of sub-problems. Each sub-problem is either solved without further branching or is found to be irrelevant because its relaxed version already produces a longer path than a solution of another sub-problem. This method is called \emph{branch-and-cut}~\citep{Padberg1990} which is a variation of the well known \emph{branch-and-bound}~\citep{Land1960} procedure. The initial polyhedron $P$ used by \cite{Dantzig1954} contains all vectors $\mathbf{x}$ for which all $x_e \in \mathbf{x}$ satisfy $0 \le x_e \le 1$ and in the resulting tour each city is linked to exactly two other cities. Various separation algorithms for finding subsequent cuts to prevent sub-tours (\emph{sub-tour elimination inequalities}) and to ensure an integer solution \citep[\emph{Gomory cuts;}][]{Gomory1963} were developed over time. The currently most efficient implementation of this method is \emph{Concorde} described in~\cite{Applegate2000}. \subsection{Heuristics for the TSP} \label{sec:heuristics} The NP-completeness of the TSP already makes it more time efficient for small-to-medium size TSP instances to rely on heuristics in case a good but not necessarily optimal solution is sufficient. TSP heuristics typically fall into two groups, tour construction heuristics which create tours from scratch and tour improvement heuristics which use simple local search heuristics to improve existing tours. In the following we will only discuss heuristics available in \pkg{TSP}, for a comprehensive overview of the multitude of TSP heuristics including an experimental comparison, we refer the reader to the book chapter by \cite{Johnson2002}. \subsubsection{Tour construction heuristics} The implemented tour construction heuristics are the nearest neighbor algorithm and the insertion algorithms. \paragraph{Nearest neighbor algorithm.} The nearest neighbor algorithm~\citep{Rosenkrantz1977} follows a very simple greedy procedure: The algorithm starts with a tour containing a randomly chosen city and then always adds to the last city in the tour the nearest not yet visited city. The algorithm stops when all cities are on the tour. An extension to this algorithm is to repeat it with each city as the starting point and then return the best tour found. This heuristic is called repetitive nearest neighbor. \paragraph{Insertion algorithms.} All insertion algorithms~\citep{Rosenkrantz1977} start with a tour consisting of an arbitrary city and then choose in each step a city $k$ not yet on the tour. This city is inserted into the existing tour between two consecutive cities $i$ and $j$, such that the insertion cost (i.e., the increase in the tour's length) $$d(i,k) + d(k,j) - d(i,j)$$ is minimized. The algorithms stop when all cities are on the tour. The insertion algorithms differ in the way the city to be inserted next is chosen. The following variations are implemented: \begin{description} \item[Nearest insertion] The city $k$ is chosen in each step as the city which is nearest to a city on the tour. \item[Farthest insertion] The city $k$ is chosen in each step as the city which is farthest from any of the cities on the tour. \item[Cheapest insertion] The city $k$ is chosen in each step such that the cost of inserting the new city is minimal. \item[Arbitrary insertion] The city $k$ is chosen randomly from all cities not yet on the tour. \end{description} The nearest and cheapest insertion algorithms correspond to the minimum spanning tree algorithm by \cite{Prim1957}. Adding a city to a partial tour corresponds to adding an edge to a partial spanning tree. For TSPs with distances obeying the triangular inequality, the equality to minimum spanning trees provides a theoretical upper bound for the two algorithms of twice the optimal tour length. The idea behind the farthest insertion algorithm is to link cities far outside into the tour first to establish an outline of the whole tour early. With this change, the algorithm cannot be directly related to generating a minimum spanning tree and thus the upper bound stated above cannot be guaranteed. However, it can was shown that the algorithm generates tours which approach $2/3$ times the optimal tour length~\citep{Johnson1985}. \subsubsection{Tour improvement heuristics} Tour improvement heuristics are simple local search heuristics which try to improve an initial tour. A comprehensive treatment of the topic can be found in the book chapter by \cite{Rego2002}. \paragraph{$k$-Opt heuristics.} The idea is to define a neighborhood structure on the set of all admissible tours. Typically, a tour $t'$ is a neighbor of another tour $t$ if $t'$ can be obtained from $t$ by deleting $k$ edges and replacing them by a set of different feasible edges (a $k$-Opt move). In such a structure, the tour can iteratively be improved by always moving from one tour to its best neighbor till no further improvement is possible. The resulting tour represents a local optimum which is called $k$-optimal. Typically, $2$-Opt~\citep{Croes1958} and $3$-Opt~\citep{Lin1965} heuristics are used in practice. \paragraph{Lin-Kernighan heuristic.} This heuristic~\citep{Lin1973} does not use a fixed value for $k$ for its $k$-Opt moves, but tries to find the best choice of $k$ for each move. The heuristic uses the fact that each $k$-Opt move can be represented as a sequence of $2$-Opt moves. It builds up a sequence of $2$-Opt moves, checking after each additional move whether a stopping rule is met. Then the part of the sequence which gives the best improvement is used. This is equivalent to a choice of one $k$-Opt move with variable $k$. Such moves are used till a local optimum is reached. By using full backtracking, the optimal solution can always be found, but the running time would be immense. Therefore, only limited backtracking is allowed in the procedure, which helps to find better local optima or even the optimal solution. Further improvements to the procedure are described by \cite{Lin1973}. \section{Computational infrastructure: the TSP package} \label{sec:infrastructure} In package~\pkg{TSP}, a traveling salesperson problem is defined by an object of class \class{TSP} (symmetric) or \class{ATSP} (asymmetric). \func{solve\_TSP} is used to find a solution, which is represented by an object of class \class{TOUR}. Figure~\ref{fig:overview} gives an overview of this infrastructure. \begin{figure} \centering \includegraphics[width=14cm]{overview} \caption{An overview of the classes in \pkg{TSP}.} \label{fig:overview} \end{figure} \class{TSP} objects can be created from a distance matrix (a \class{dist} object) or a symmetric matrix using the creator function \func{TSP} or coercion with \func{as.TSP}. Similarly, \class{ATSP} objects are created by \func{ATSP} or \func{as.ATSP} from square matrices representing the distances. In the creation process, labels are taken and stored as city names in the object or can be explicitly given as arguments to the creator functions. Several methods are defined for the classes: \begin{itemize} \item \func{print} displays basic information about the problem (number of cities and the distance measure employed). \item \func{n\_of\_cities} returns the number of cities. \item \func{labels} returns the city names. \item \func{image} produces a shaded matrix plot of the distances between cities. The order of the cities can be specified as the argument \code{order}. \end{itemize} Internally, an object of class \class{TSP} is a \class{dist} object with an additional class attribute and, therefore, if needed, can be coerced to \class{dist} or to a matrix. An \class{ATSP} object is represented as a square matrix. Obviously, asymmetric TSPs are more general than symmetric TSPs, hence, symmetric TSPs can also be represented as asymmetric TSPs. To formulate an asymmetric TSP as a symmetric TSP with double the number of cities (see Section \ref{sec:manipulations}), \func{reformulate\_ATSP\_as\_TSP} is provided. This function creates the necessary dummy cities and adapts the distance matrix accordingly. A popular format to save TSP descriptions to disk which is supported by most TSP solvers is the format used by \emph{TSPLIB}, a library of sample instances of the TSP maintained by \cite{Reinelt2004}. The \pkg{TSP} package provides \func{read\_TSPLIB} and \func{write\_TSPLIB} to read and save symmetric and asymmetric TSPs in TSPLIB format. Class \class{TOUR} represents a solution to a TSP by an integer permutation vector containing the ordered indices and labels of the cities to visit. In addition, it stores an attribute indicating the length of the tour. Again, suitable \func{print} and \func{labels} methods are provided. The raw permutation vector (i.e., the order in which cities are visited) can be obtained from a tour using \func{as.integer}. With \func{cut\_tour}, a circular tour can be split at a specified city resulting in a path represented by a vector of city indices. The length of a tour can always be calculated using \func{tour\_length} and specifying a TSP and a tour. Instead of the tour, an integer permutation vector calculated outside the \pkg{TSP} package can be used as long as it has the correct length. All TSP solvers in \pkg{TSP} can be used with the simple common interface: \begin{quote} \code{solve\_TSP(x, method, control)} \end{quote} where \code{x} is the TSP to be solved, \code{method} is a character string indicating the method used to solve the TSP and \code{control} can contain a list with additional information used by the solver. The available algorithms are shown in Table~\ref{tab:methods}. \begin{table} \caption{Available algorithms in \pkg{TSP}.} \label{tab:methods} \centering \begin{tabular}{llc} \hline \textbf{Algorithm} & \textbf{Method argument} & \textbf{Applicable to} \\ \hline Nearest neighbor algorithm & \code{"nn"} & TSP/ATSP \\ Repetitive nearest neighbor algorithm & \code{"repetitive\_nn"} & TSP/ATSP \\ Nearest insertion & \code{"nearest\_insertion"} & TSP/ATSP \\ Farthest insertion & \code{"farthest\_insertion"} & TSP/ATSP \\ Cheapest insertion & \code{"cheapest\_insertion"} & TSP/ATSP \\ Arbitrary insertion & \code{"arbitrary\_insertion"} & TSP/ATSP \\ Concorde TSP solver & \code{"concorde"} & TSP \\ 2-Opt improvement heuristic & \code{"two\_opt"} & TSP/ATSP \\ Chained Lin-Kernighan & \code{"linkern"} & TSP \\ \hline \end{tabular} \end{table} All algorithms except the Concorde TSP solver and the Chained Lin-Kernighan heuristic (a Lin-Kernighan variation described in \cite{Applegate2003}) are included in the package and distributed under the GNU Public License (GPL). For the Concorde TSP solver and the Chained Lin-Kernighan heuristic only a simple interface (using \func{write\_TSPLIB}, calling the executable and reading back the resulting tour) is included in \pkg{TSP}. The executable itself is part of the Concorde distribution, has to be installed separately and is governed by a different license which allows only for academic use. The interfaces are included since Concorde~\citep{Applegate2000,Applegate2006} is currently one of the best implementations for solving symmetric TSPs based on the branch-and-cut method discussed in section~\ref{sec:exact}. In May 2004, Concorde was used to find the optimal solution for the TSP of visiting all 24,978 cities in Sweden. The computation was carried out on a cluster with 96 Xeon 2.8 GHz nodes and took in total almost 100 CPU years. \section{Examples} \label{sec:examples} In this section we provide some examples for the use of package~\pkg{TSP}. We start with a simple example of how to use the interface of the TSP solver to compare different heuristics. Then we show how to solve related tasks, using the Hamiltonian shortest path problem as an example. Finally, we give an example of clustering using the \pkg{TSP} package. An additional application can be found in package \pkg{seriation}~\citep{TSP:Hahsler+Buchta+Hornik:2006} which uses the TSP solvers from \pkg{TSP} to order (seriate) objects given a proximity matrix. \subsection{Comparing some heuristics} In the following example, we use several heuristics to find a short path in the \code{USCA50} data set which contains the distances between the first 50 cities in the \code{USCA312} data set. The \code{USCA312} data set contains the distances between 312 cities in the USA and Canada coded as a symmetric TSP. The smaller data set is used here, since some of the heuristic solvers employed are rather slow. <<>>= library("TSP") data("USCA50") USCA50 @ We calculate tours using different heuristics and store the results in the list \code{tours}. As an example, we show the first tour which displays the method employed, the number of cities involved and the tour length. All tour lengths are compared using the dot chart in Figure~\ref{fig:dotchart}. For the chart, we add a point for the optimal solution which has a tour length of 14497. The optimal solution can be found using Concorde (\code{method = "concorde"}). It is omitted here, since Concorde has to be installed separately. <>= set.seed(1234) @ <>= methods <- c("nearest_insertion", "farthest_insertion", "cheapest_insertion", "arbitrary_insertion", "nn", "repetitive_nn", "two_opt") tours <- sapply(methods, FUN = function(m) solve_TSP(USCA50, method = m), simplify = FALSE) ## tours$concorde <- solve_TSP(tsp, method = "concorde") tours[[1]] dotchart(sort(c(sapply(tours, tour_length), optimal = 14497)), xlab = "tour length", xlim = c(0, 20000)) @ \begin{figure} \centering \includegraphics[width=11cm, trim=0 10 0 0]{TSP-dotchart_USCA50} \caption{Comparison of the tour lengths for the USCA50 data set.} \label{fig:dotchart} \end{figure} \subsection{Finding the shortest Hamiltonian path} The problem of finding the shortest Hamiltonian path through a graph (i.e., a path which visits each node in the graph exactly once) can be transformed into the TSP with cities and distances representing the graphs vertices and edge weights, respectively~\citep{Garfinkel1985}. Finding the shortest Hamiltonian path through all cities disregarding the endpoints can be achieved by inserting a `dummy city' which has a distance of zero to all other cities. The position of this city in the final tour represents the cutting point for the path. In the following we use a heuristic to find a short path in the \code{USCA312} data set. Inserting dummy cities is performed in \pkg{TSP} by \func{insert\_dummy}. <>= set.seed(1234) @ <<>>= library("TSP") data("USCA312") tsp <- insert_dummy(USCA312, label = "cut") tsp @ The TSP now contains an additional dummy city and we can try to solve this TSP. <<>>= tour <- solve_TSP(tsp, method="farthest_insertion") tour @ Since the dummy city has distance zero to all other cities, the path length is equal to the tour length reported above. The path starts with the first city in the list after the `dummy' city and ends with the city right before it. We use \func{cut\_tour} to create a path and show the first and last 6 cities on it. <<>>= path <- cut_tour(tour, "cut") head(labels(path)) tail(labels(path)) @ The tour found in the example results in a path from Lihue on Hawaii to Prince Rupert in British Columbia. Such a tour can also be visualized using a scatter plot with a map from package \pkg{maps}. Note that the \code{if} statement and the \code{plot} in the \code{else} part in the following is not needed and only checks if the map package is installed when building this document. <>= if(require(maps)) { library("maps") data("USCA312_GPS") plot_path <- function(path) { plot((USCA312_GPS[, c("long", "lat")]), cex = .3, col = "red") map("world", col = "gray", add = TRUE) lines(USCA312_GPS[, c("long", "lat")][path,], col = "black") points(USCA312_GPS[c(head(path, 1), tail(path, 1)), c("long", "lat")], pch = 19, col = "black") } plot_path(path) } else { plot(NA, xlim= c(0,1), ylim = c(0,1)) text(.5, .5, "Suggested packages not available") } @ \begin{figure} \centering \includegraphics[width=10cm, trim=0 30 0 0]{TSP-map1} \caption{A ``short'' Hamiltonian path for the USCA312 dataset.} \label{fig:map1} \end{figure} The map containing the path is presented in Figure~\ref{fig:map1}. It has to be mentioned that the path found by the used heuristic is considerable longer than the optimal path found by Concorde with a length of $34928$, illustrating the power of modern TSP algorithms. For the following two examples, we indicate how the distance matrix between cities can be modified to solve related shortest Hamiltonian path problems. These examples serve as illustrations of how modifications can be made to transform different problems into a TSP. The first problem is to find the shortest Hamiltonian path starting with a given city. In this case, all distances to the selected city are set to zero, forcing the evaluation of all possible paths starting with this city and disregarding the way back from the final city in the tour. By modifying the distances the symmetric TSP is changed into an asymmetric TSP (ATSP) since the distances between the starting city and all other cities are no longer symmetric. As an example, we choose New York as the starting city. We transform the data set into an ATSP and set the column corresponding to New York to zero before solving it. Thus, the distance to return from the last city in the path to New York does not contribute to the path length. We use the nearest neighbor heuristic to calculate an initial tour which is then improved using $2$-Opt moves and cut at New York to create a path. <>= set.seed(1234) @ <<>>= atsp <- as.ATSP(USCA312) ny <- which(labels(USCA312) == "New York, NY") atsp[, ny] <- 0 initial_tour <- solve_TSP(atsp, method="nn") initial_tour tour <- solve_TSP(atsp, method ="two_opt", control = list(tour = initial_tour)) tour path <- cut_tour(tour, ny, exclude_cut = FALSE) head(labels(path)) tail(labels(path)) @ <>= plot_path(path) @ \begin{figure} \centering \includegraphics[width=10cm, trim=0 30 0 0]{TSP-map2} \caption{A Hamiltonian path for the USCA312 dataset starting in New York.} \label{fig:map2} \end{figure} The found path is presented in Figure~\ref{fig:map2}. It begins with New York and cities in New Jersey and ends in a city in Manitoba, Canada. %The path shows the typical behavior %of the nearest neighbor heuristic with first connecting the cities close by and %then making rather big ``jumps'' for the final cities. Concorde and many advanced TSP solvers can only solve symmetric TSPs. To use these solvers, we can formulate the ATSP as a TSP using \func{reformulate\_ATSP\_as\_TSP} which introduces a dummy city for each city (see Section~\ref{sec:manipulations}). <<>>= tsp <- reformulate_ATSP_as_TSP(atsp) tsp @ After finding a tour for the TSP, the dummy cities are removed again giving the tour for the original ATSP. Note that the tour needs to be reversed if the dummy cities appear before and not after the original cities in the solution of the TSP. The following code is not executed here, since it takes several minutes to execute and Concorde has to be installed separately. Concorde finds the optimal solution with a length of $36091$. <>= tour <- solve_TSP(tsp, method = "concorde") tour <- as.TOUR(tour[tour <= n_of_cities(atsp)]) @ Finding the shortest Hamiltonian path which ends in a given city can be achieved likewise by setting the row in the distance matrix which corresponds to this city to zero. For finding the shortest Hamiltonian path we can also restrict both end points. This problem can be transformed to a TSP by replacing the two cities by a single city which contains the distances from the start point in the columns and the distances to the end point in the rows. Obviously this is again an asymmetric TSP. For the following example, we are only interested in paths starting in New York and ending in Los Angeles. Therefore, we remove the two cities from the distance matrix, create an asymmetric TSP and insert a dummy city called \code{"LA/NY"}. The distances from this dummy city are replaced by the distances from New York and the distances towards are replaced by the distances towards Los Angeles. <>= set.seed(1234) @ <<>>= m <- as.matrix(USCA312) ny <- which(labels(USCA312) == "New York, NY") la <- which(labels(USCA312) == "Los Angeles, CA") atsp <- ATSP(m[-c(ny,la), -c(ny,la)]) atsp <- insert_dummy(atsp, label = "LA/NY") la_ny <- which(labels(atsp) == "LA/NY") atsp[la_ny, ] <- c(m[-c(ny,la), ny], 0) atsp[, la_ny] <- c(m[la, -c(ny,la)], 0) @ We use the nearest insertion heuristic. <<>>= tour <- solve_TSP(atsp, method ="nearest_insertion") tour path_labels <- c("New York, NY", labels(cut_tour(tour, la_ny)), "Los Angeles, CA") path_ids <- match(path_labels, labels(USCA312)) head(path_labels) tail(path_labels) @ <>= plot_path(path_ids) @ The path jumps from New York to cities in Ontario and it passes through cities in California and Nevada before ending in Los Angeles. The path displayed in Figure~\ref{fig:map3} contains multiple crossings which indicate that the solution is suboptimal. The optimal solution generated by reformulating the problem as a TSP and using Concorde has only a tour length of $38489$. \begin{figure} \centering \includegraphics[width=10cm, trim=0 30 0 0]{TSP-map3} \caption{A Hamiltonian path for the USCA312 dataset starting in New York and ending in Los Angles.} \label{fig:map3} \end{figure} \subsection{Rearrangement clustering} Solving a TSP to obtain a clustering was suggested several times in the literature \citep[see, e.g.,][]{Lenstra1974, Alpert1997, Johnson2004}. The idea is that objects in clusters are visited in consecutive order and from one cluster to the next larger ``jumps'' are necessary. \cite{Climer2006} call this type of clustering \emph{rearrangement clustering} and suggest to automatically find the cluster boundaries of $k$ clusters by adding $k$ \emph{dummy cities} which have constant distance $c$ to all other cities and are infinitely far from each other. In the optimal solution of the TSP, the dummy cities must separate the most distant cities and thus represent optimal boundaries for $k$ clusters. For the following example, we use the well known iris data set. Since we know that the dataset contains three classes denoted by the variable \code{Species}, we insert three dummy cities into the TSP for the iris data set and perform rearrangement clustering using the default method (nearest insertion algorithm). Note that this algorithm does not find the optimal solution and it is not guaranteed that the dummy cities will present the best cluster boundaries. %\marginpar{FIXME: Was sagt Concorde dazu?} <>= set.seed(4444) @ <<>>= data("iris") tsp <- TSP(dist(iris[-5]), labels = iris[, "Species"]) tsp_dummy <- insert_dummy(tsp, n = 3, label = "boundary") tour <- solve_TSP(tsp_dummy) @ Next, we plot the TSP's permuted distance matrix using shading to represent distances. The result is displayed as Figure~\ref{fig:clustering}. Lighter areas represent larger distances. The additional red lines represent the positions of the dummy cities in the tour, which mark the cluster boundaries obtained. <>= ## plot the distance matrix image(tsp_dummy, tour, xlab = "objects", ylab ="objects") ## draw lines where the dummy cities are located abline(h = which(labels(tour)=="boundary"), col = "red") abline(v = which(labels(tour)=="boundary"), col = "red") @ \begin{figure} \centering \includegraphics[width=9cm, height=9cm, trim=0 20 0 0]{TSP-clustering} \caption{Result of rearrangement clustering using three dummy cities and the nearest insertion algorithm on the iris data set.} \label{fig:clustering} \end{figure} One pair of red horizontal and vertical lines exactly separates the darker from lighter areas. The second pair occurs inside the larger dark block. We can look at how well the partitioning obtained fits the structure in the data given by the species field in the data set. Since we used the species as the city labels in the TSP, the labels in the tour represent the partitioning with the dummy cities named `boundary' separating groups. The result can be summarized based on the run length encoding of the obtained tour labels: <<>>= out <- rle(labels(tour)) data.frame(Species = out$values, Lenghts = out$lengths, Pos = cumsum(out$lengths)) @ One boundary perfectly splits the iris data set into a group containing only examples of species `Setosa' and a second group containing examples for `Virginica' and `Versicolor'. However, the second boundary only separates several examples of species `Virginica' from other examples of the same species. Even in the optimal tour found by Concorde, this problem occurs. The reason why the rearrangement clustering fails to split the data into three groups is the closeness between the groups `Virginica' and `Versicolor'. To inspect this problem further, we can project the data points on the first two principal components of the data set and add the path segments which resulted from solving the TSP. <>= prc <- prcomp(iris[1:4]) plot(prc$x, pch = as.numeric(iris[,5]), col = as.numeric(iris[,5])) paths <- cut_tour(tour, cut = "boundary") for(p in paths) lines(prc$x[p, ]) @ \begin{figure} \centering \includegraphics[width=10cm, trim=0 20 0 0]{TSP-clustering2} \caption{The 3 path segments representing a rearrangement clustering of the iris data set. The data points are projected on the set's first two principal components. The three species are represented by different markers and colors.} \label{fig:clustering2} \end{figure} The result in shown in Figure~\ref{fig:clustering2}. The three species are identified by different markers and all points connected by a single path represent a cluster found. Clearly, the two groups to the right side of the plot are too close to be separated correctly by using just the distances between individual points. This problem is similar to the \emph{chaining effect} known from hierarchical clustering using the single-linkage method. \section{Conclusion} \label{sec:conclusion} In this paper we presented the R extension package \pkg{TSP} which implements an infrastructure to handle and solve TSPs. The package introduces classes for problem descriptions (\class{TSP} and \class{ATSP}) and for the solution (\class{TOUR}). Together with a simple interface for solving TSPs, it allows for an easy and transparent usage of the package. With the interface to Concorde, \pkg{TSP} also can use a state of the art implementation which efficiently computes exact solutions using branch-and-cut. \section*{Acknowledgments} The authors of this paper want to thank Roger Bivand for providing the code to correctly draw tours and paths on a projected map. % %\bibliographystyle{abbrvnat} \bibliography{TSP} % \end{document} TSP/inst/doc/TSP.R0000644000176200001440000001453515111650532013242 0ustar liggesusers### R code from vignette source 'TSP.Rnw' ################################################### ### code chunk number 1: TSP.Rnw:81-84 ################################################### options(width = 75, useFancyQuotes=FALSE, prompt="R> ") ### for sampling set.seed(1234) ################################################### ### code chunk number 2: TSP.Rnw:645-648 ################################################### library("TSP") data("USCA50") USCA50 ################################################### ### code chunk number 3: TSP.Rnw:661-662 ################################################### set.seed(1234) ################################################### ### code chunk number 4: dotchart_USCA50 ################################################### methods <- c("nearest_insertion", "farthest_insertion", "cheapest_insertion", "arbitrary_insertion", "nn", "repetitive_nn", "two_opt") tours <- sapply(methods, FUN = function(m) solve_TSP(USCA50, method = m), simplify = FALSE) ## tours$concorde <- solve_TSP(tsp, method = "concorde") tours[[1]] dotchart(sort(c(sapply(tours, tour_length), optimal = 14497)), xlab = "tour length", xlim = c(0, 20000)) ################################################### ### code chunk number 5: TSP.Rnw:703-704 ################################################### set.seed(1234) ################################################### ### code chunk number 6: TSP.Rnw:707-711 ################################################### library("TSP") data("USCA312") tsp <- insert_dummy(USCA312, label = "cut") tsp ################################################### ### code chunk number 7: TSP.Rnw:717-719 ################################################### tour <- solve_TSP(tsp, method="farthest_insertion") tour ################################################### ### code chunk number 8: TSP.Rnw:728-731 ################################################### path <- cut_tour(tour, "cut") head(labels(path)) tail(labels(path)) ################################################### ### code chunk number 9: map1 ################################################### if(require(maps)) { library("maps") data("USCA312_GPS") plot_path <- function(path) { plot((USCA312_GPS[, c("long", "lat")]), cex = .3, col = "red") map("world", col = "gray", add = TRUE) lines(USCA312_GPS[, c("long", "lat")][path,], col = "black") points(USCA312_GPS[c(head(path, 1), tail(path, 1)), c("long", "lat")], pch = 19, col = "black") } plot_path(path) } else { plot(NA, xlim= c(0,1), ylim = c(0,1)) text(.5, .5, "Suggested packages not available") } ################################################### ### code chunk number 10: TSP.Rnw:792-793 ################################################### set.seed(1234) ################################################### ### code chunk number 11: TSP.Rnw:796-807 ################################################### atsp <- as.ATSP(USCA312) ny <- which(labels(USCA312) == "New York, NY") atsp[, ny] <- 0 initial_tour <- solve_TSP(atsp, method="nn") initial_tour tour <- solve_TSP(atsp, method ="two_opt", control = list(tour = initial_tour)) tour path <- cut_tour(tour, ny, exclude_cut = FALSE) head(labels(path)) tail(labels(path)) ################################################### ### code chunk number 12: map2 ################################################### plot_path(path) ################################################### ### code chunk number 13: TSP.Rnw:831-833 ################################################### tsp <- reformulate_ATSP_as_TSP(atsp) tsp ################################################### ### code chunk number 14: TSP.Rnw:845-847 (eval = FALSE) ################################################### ## tour <- solve_TSP(tsp, method = "concorde") ## tour <- as.TOUR(tour[tour <= n_of_cities(atsp)]) ################################################### ### code chunk number 15: TSP.Rnw:869-870 ################################################### set.seed(1234) ################################################### ### code chunk number 16: TSP.Rnw:873-883 ################################################### m <- as.matrix(USCA312) ny <- which(labels(USCA312) == "New York, NY") la <- which(labels(USCA312) == "Los Angeles, CA") atsp <- ATSP(m[-c(ny,la), -c(ny,la)]) atsp <- insert_dummy(atsp, label = "LA/NY") la_ny <- which(labels(atsp) == "LA/NY") atsp[la_ny, ] <- c(m[-c(ny,la), ny], 0) atsp[, la_ny] <- c(m[la, -c(ny,la)], 0) ################################################### ### code chunk number 17: TSP.Rnw:888-897 ################################################### tour <- solve_TSP(atsp, method ="nearest_insertion") tour path_labels <- c("New York, NY", labels(cut_tour(tour, la_ny)), "Los Angeles, CA") path_ids <- match(path_labels, labels(USCA312)) head(path_labels) tail(path_labels) ################################################### ### code chunk number 18: map3 ################################################### plot_path(path_ids) ################################################### ### code chunk number 19: TSP.Rnw:941-942 ################################################### set.seed(4444) ################################################### ### code chunk number 20: TSP.Rnw:944-948 ################################################### data("iris") tsp <- TSP(dist(iris[-5]), labels = iris[, "Species"]) tsp_dummy <- insert_dummy(tsp, n = 3, label = "boundary") tour <- solve_TSP(tsp_dummy) ################################################### ### code chunk number 21: clustering ################################################### ## plot the distance matrix image(tsp_dummy, tour, xlab = "objects", ylab ="objects") ## draw lines where the dummy cities are located abline(h = which(labels(tour)=="boundary"), col = "red") abline(v = which(labels(tour)=="boundary"), col = "red") ################################################### ### code chunk number 22: TSP.Rnw:986-990 ################################################### out <- rle(labels(tour)) data.frame(Species = out$values, Lenghts = out$lengths, Pos = cumsum(out$lengths)) ################################################### ### code chunk number 23: clustering2 ################################################### prc <- prcomp(iris[1:4]) plot(prc$x, pch = as.numeric(iris[,5]), col = as.numeric(iris[,5])) paths <- cut_tour(tour, cut = "boundary") for(p in paths) lines(prc$x[p, ]) TSP/inst/README_files/0000755000176200001440000000000015100720405014006 5ustar liggesusersTSP/inst/README_files/unnamed-chunk-6-1.png0000644000176200001440000025606215111646674017606 0ustar liggesusersPNG  IHDR@@Na pHYsod IDATxwx\y3gzf 6Q6ɶرk'Yo˹kI>k׹uş-oN,7qQӒ#, EbA#@)齜3}!"`0 o`0 s%``0L] `0u 0 %X0 S``0L] `0u 0 %X0 S``0L] `0u 0 %X0 S``0L] `0u 0 %X0 S``0L] `0u 0 %X0 S``0L] `0u 0 %X0 S``0L] `0u 0 %X0 S``0L] `0u 0 %X0 S``0L] `0u 0 %X0 S``0L] `0u 0 %X0 S``0L] `0u 0 %X0 S``0L] `0u 0 %X0 S``0L] `0u 0 %X0 S``0L] `0u 0 %X0 S``0L] `0u 0 %X0 S``0L] `0u 0 %X0 S``0L] `0u 0 %X0 S``0L] `0u 0 %X0 S``0L] `0u 0 %X0 SP7ngv} s[T*ӟw8q3̞={n`0?h4캳k׮{`0Ry^a0 .`0 `,` Ka0 .`0 `,` Ka0DQه $ sG(F\.g0rf3LnEe:NUX*B( (&Iɴr\.xe%bUG!q?gg WzhllG*X4M$FVk4Bq`+a0[ 3L&IӥRIE\QHp.h4UqM_ jhh!Ze[hlL:6v.K 8[`PظJ2?? @jR V+Y8.& NwODo1t D"_ݗT(V& BSSN]q"=+s\( RVJeCCZx}:NW)RVBJX, aDQE,X0u̙3ЃPΛxT7GDqIJ!A=@t߾otzN6D4=pT*e\.4].M_ZZ B{I!Jq |c[[MDt[0̎~)QyHaqeYmoozoCfgze\b]w%rJW* ,ŲlWW%5N;NLR(5yP56-"+}oNybENDLsg?qsQ(0EQRT*nPscz=q+++Aٳjt,hsV(׫/ ZE$9)qpСPHRJ"I& jl6o4rǫa3KXDh4uy'~Z:ѹDh܉_|?+zjB4J0XhqvTf!x@< ]$Inb0JRbf,z}:qBpq \E #wmRHJ&lVՂar]4 ™3g4 IPmBߝ01o_=(տ=_;( |,&-A CggVA) DR6p5 (QjP(p QA j nyfl.]4kZbX.S*& [}zmk:|>} څ CP2id2544V?.p0oauKtkk|9|ϝ6Q/a<Y喰`0w"l\.C!v9$t:G"+++nnWˆ`0WW`$Iaڕ Iq\&I&G/hn 56"AH'ޒH$CV/+ |Fqb!+ $>}B \R76jza07|>uJzCPOOXAXV՚NWWW^oSSSCCL&kjjjjjBAjd2ST A($!-aF*5$It: MVU"@o$xD8L&3FX,n{L@ H$vHՋfܩ|#s{??{[&|"r ;`0$4 @]!h** @ԩSl6t:8YCh4dxx\.3 C]y%#*8NR +J5nj…ˮr:}ۇFGё#dB?}/=(zi"Ϝ)RdYh4ld2| wln![s_o|$̓#dO|/ P("B(H( (]AKF!JX,Ʋ,D`"J.",@ RT*o :ffIraB˨G܃ѱcO-.B?|d​Bhnonndz٬Be4%s BH/I}LJޠ4`0h[a\µ8\ v r9X%@ Gřr ,Jd!Bq+P $-b^`"lr`pee,K`۫t<NnԲ` ė7& ob[58N x^\.tDbxxxE P(p8GMjnntX*rɓnpT nEt: ~HTJe2p:(o_Xl￰҂x6WO #E X,Iez>큍uW  |>K 9OP(nv|XeYpۛ榦w9kmQ44Hhl 9^xF8>:TyE$M&dx<߿nf000ƿ-~_ٳd;!?OG f?`%A h4voRb>NVY@8 `0vwwo*jn \VfZ&Egyi3Qb_W%fy8>87<< 0嚼X,400W0!o<]xcR꿎Ʒ?}홯V"z!{{o|y(V0 fS)4MKRBt:7um A;s(*!BQTaEKRl%h>A`y(LڤΞ=ԴjO46^z 1 4:Mt^_<~3tzu0_I8 P!$Ju:Z(J&iZq#0N]b0޿E#!Dz^v#i>|؝Ddŭ`L σK?i4ʲl>wnwccMl@R/²,\`$$RX !0L*r;11zzz6+8BӁht= ڻsϡ#G\ϫT4M$9b2qW.s\$aY6Lj+MRr)h^ z] 7_H*83Ǡٹ|XCBb+,V5V/ 頺j{zzB,@J`0$ɪM2_$IGd2N CGGl 9өyݬT* U&C. V ӧaLJЭhN?N,SZP,֜Uhmm5 bxY|<[,%(H GVONNJ ړxKKKPT2 AtvvFi (ZВH$* J4 dF&---AP.>\T`Z\GGGC}̧>eZ9Fcc`r>ZF ÅBM^RMӘɭ*`L|X5^L&NW"DN]" poUۆjZZ\.ll6[IRഫT* x__vlzNZ` Aŵj:Z[[[ZZ2LD"BeYL-AׇaV {e猧NI e? f+Q,@ vQ<~auud^0 F!q ~bk!UJ&fs& Z мu/Gb8eW*J$ I2E~0ÁL&J^/qs8sillL&eE^|TR(PXs:P^fKKKR "nw^da\iEQf'''n {rl^W{=+$x<3Ib`zQ"\od<:_/:LF })JJz㍶w=VWII D[,--vywFq;2vr9"vڵ1s\{PݭVY+7(IByy$Ir<tuumU vP!|"@L&ª'r&o|uj4>|-3HCIDD".K&ȳ,95E{옓c&`%$R `dIn-bQzԦdj~4]YYJUɗQ_@?;,`̕ "Mb k:jSE:vu̙YجB:B%jqU:;;ggg!b||i`ؿռY zRɵ31Kկؘ1 wݵ\4uOӣO_./&x?wwbT*%.-!"EQ9f jW2؛\De2mBH$BZT*US>0,˖eւ×H0X0K{W7X,L&SrvRD"ش$JGFF c" !t:^wW ɆEIjf$ԴMpFEQ.#C'Ocjd?wV<J2~(X#ΣGv{桇 Mjhh`Y6R)l6m.^[[ 4MjU~mwhd2x<ͮ""˲ۜ[ IDATIGuA1lp8EaJX,`RFԔhkkۦwU*B5nlt:Zm!_V4M3 L&^(VWT}X, 8!d!p0 WWWu:ݦ1I$^_Tb`PRi4Kf,TSv~^z}{hhHIJ EoqQ/S{d_! i4g666Bj[[Mry+>}t`$SR8>d2L&aתx ڿ XeLv]wa `@W{jliiQ(' <NBño>B!b0!ЂsN 0܋{V%>oyyF[U鉉 JrFxP(ݻw+#J%0xW(fګ+>W,ht>IQHj BTsܹs(",-x"==<ܷg *㦦8fTDp8 "T(Av m׹\.t:N&888,˲&J0Mu &x^ؖ[y4 kJhŢD"1L0kmmMh4Z(N'drqqah6M&6E62ڳgOmIt#H`HZ[[hL&xfzTd,A%̲T*Ud9Ǜo*EF#zxl6[a M$ht:P|>q\"P($|>_6[[[CV^YY?l޵kV%:)z|$qA[ | +rc4D"18&FX,VJd$Bjn rNF,{9TRt:VeY6ƶJL&ҒJ@w8(jii) 􀌁En-Cq JtnјH$r.ǧA|e t:gMMd(6AC!I\_~Y#s펌\Ųl\"[uu쏍 ߝ7\p,k6("HY=xa҅KPX<B0L>?CP0ljjr_Ո$X666JR\Çkar bښD"'ǍgϚ''EC(!Z]-ͱ,{ɆZqO~^=/|#O~ru~uu5 m{>_6mkkr\$INLL V;Nlm|tY;APhX,677,zcZD PTw¨h,`eV::TugYAL&kjj2 ˕JemmP(q6/&yR4]QTCN':r)~!$>0;p>}rLfIIR7;k3gx=4AST*Fe3a%gZRmM!{$7 F322Μ9v].m,`B QZNRbQәL&Tۜ[u8U% wJhsbb*GyERiEAǎ67QWWmްN۵kW"8uVkn_YY(I+++i۽iP,gff8'wvm6b47 ,`̙3RUד$)B\0X,e!T PU_/j8zzBCCfgH"l#T ;C%ڽ=(z nO&dP %eCP6x<Ж 8n]ԈD"(JJ@Di@~VfA T*X(bvwwo EP(XlffjB>km0K"0׶׷fIaXr.BCFA>t_DG_G޻M~r ̕J%<Dj6QR`2*Ll#{^JZ&IVi+"DS° \gu[`L&ʩSlܭ 0qPJ\^(  wd ipyw[xIJF4MvF^d^z 1 4:|]^=<:rϣ=(Eۆ\455ZBHV]ؐVk(rT*d`!$ A@6R0ƃ sG`ZVWWʆhagèp1Qbuu. }L146~ڵq  tzYqG7 mvx,ˮAQ.$Iزbl%`!HMRtZTLP(  457 \nfggJndr} s(H&''w8%R.ol@p8N:ٹkk7:v )j6p!XOPFG#GxHx1QwH$L"<& vwj"j~m?w---[p D"1L NCD#me3/0@juOO(LfvvbNaX0wZ6Q({IR"ٹn! t *~4:Ev_+F"D"yz4>^:zTqL}CkKu_f;:: _DZ4Mrp8fR|>ZvdX˂bE^ BMMM RԦ9 驧v[ Jz,'O ^GsLbl[$8n&Dכx<;::jK,vwwjp8<88Րp8h,K^7 ׮r:N$LFRFhurvEݻwÂyeaI8JmyvZlL&x<~0(VҖT*BAӅoI;htTU"aN3WG ~?b!bb1"丐H$%I.. ~:ՑJ베AB0<88855hR˲]]]랟 gJ2995۸e!I)6SanAD"===~?ꫦ扉v{wrhַ}F\.LK%SR>onndv9"9vlÍ*/Ci8Nr\dyT*)EA::: H$ l&XuA[XwL&l6[\6 :.HTo(j'V.M&Ӻ $ j Dwvv$T*K  @/-H3>>P(Ξ=[R̒Mϡ/jmP;I$Iy\.kK/On::-|{cojrLέ,ˮ8d2I$$'f DQT(`pia!~{zZ_TM𹞞啕}J y>tvvnaiiWVᩩ)JM )vvT8.$YU)޾Qb1B͘p8 >hZB[MG=vHh4< EQjLt\9}h x<.Uans ={P<رNg~v[vf۪pz9r6kaaϧ;;cx.v}/~v B/HKH$Fp@WP([ZZc08Jv ~:KC:55ZUT*U(N'\ڰ{mwttlu+B(¦TT 0B=`gRijj2d ." ([,`ggg;;;//;D/ Ban?H?beev64\zSSSKKVIRbYT7$^tu9R~tfϷil>uWFQP"XYY 헵u/˻ ùs>,JFnvD"Az}>7*jxx8r ԐȾj2ed2Y.[[[I8>oaat:ƧW$C!+Ju7B~ˉX03;Mt845EǎU{<^-|:vvݻ%wл FgX^o2+-VWWٿX,f& }d2MMMՓZZZ~ymƚcuuaeii =z^izuuuzz%?D"ZFq~~jry2wykƵH$bZ+ٳg;;;1 emm lݩ˨đAs78 4NW Ћ/G! ^m]gClH$ 7 Ef@P̙3VmsyuF$~?<iZC} 544d2ꂞ  Yը`v*h"hl (zQSbBheaA*ڵ Na(.,,qxѣ?O\2 γgvټf7-AdDv|>h^cc A@#p^aDb0.V%< i!d6l'&iaaAEm67Vvrd||8`-x{hdmd"bee~bܶ߿?g2p881aZX;;uJ ]sf&bXmR$Y[[sbxI=vET:Nh]7ʹ;e2YWWWSS X$j7Ν;NA(/ h4򦦦\.L&VKDEj4t ͵%ݻEQ|PtJ<.X^^^7J DtO,`BtKK1:}*<8'h@*Jpl6 E* M7M?|*MXT*u:~ߠU*՞={2 Hԟ 4Mmr2<bikkB444m' \>444;;K^XXP*;<^e)Lp8ݝJ~brR)H@"PcfߨjF}}}SSS8(۷7J‹|tQJn?T*1 hvZ&za)€H b:X,z].dFJ5??xB$IRiff,W6IWD# IDAT"\.;|Y wI`V|GԪW>}kH~Dp8&&&,h4 c)CC(Kd2rT*Y,h/ ,Bnd#NQיL&_vLv4p8nqBԱSpBH~S}ٖT* J* DX۠3#H}%TFDN;Z,az}P(JA_6Mlt8C ~fxMؘtC C*dJr~莎D" }x< ŢDQTwww:>={7Yt:fggZ-N]ЈL&!n;3gܰ) td2h$rx5333NfJl6_H- `bȧ׿VQ##9:;s?z+ WFڽ{7,hR ?cuF K~)yv>R<.e.#!uSM" BA\tM$_Cmh4jHHd2&h4@ z)2 V! ~P*x<+zEh4}>Qϟ?L&F#+++rUn^[Vk2dYvppZb‚NkkkB ys'ow;=;w?~[z=*X* v]|>f0mz+ b;77g0xH+\.U"1&&.V ,eGq瞳?>a'?Q{E* z^x ApKG5w ? Q|?p9P'Et4bB1veM LMMQթn]ܲߒAƁ>4:u."c0&l5,F"Ϸ.W"lUG? YmNTP(499j].:H$ΝJpB!ŲfS(|eYHV d2BA&k{"1R TR}#`hllyRɍ֑DB&7؛i1l6I<{ݻoZ"q Q>FFL>Z9w^5´>hZ'|ǮAaX,hZ6-g2z{{bs%˲ @NL&S( j>u`yN ZAƣ 2N&6F^ :/X,Z*׎h4ǡJt FA XCWz(d2X%bBHEכNYeYjd2kU6?l|:N}G;wJ200x-hएDƤfe\g#J> ?؉Ws+B~_?[ 4- ?]kuz2bXXX,v`0TɤiÔL1[vS5 IH^ 0p±1vA՜ArDPԞ ,ܡb x=~d2GEi9pp x#\#, h'J|>2P(\.$'Z[[+Rd"Hſ djiiq:6[y,+e ѢLWWW-2LXD z78ڟ2N#ueP(n/Ju:jVznvh^PBrlvKRw(3r/ 8#BJ T*UT"#l 2Fs:^]-G6b* щKdWW3ۊEZ[[+L&fz=2 SSSh(uEg`{7?~66J1Q,'&&rF  F]]]]]bGQk6lvXHm?11h.j D*C[̈P(B $'G!|} սbVJx<>>>NP8L&< РD"IADz%@xxtD \._OeX,'I6"م ~lvrrd`tfb5jM&hL&Qt:IAF\.T*٠wbt:Vr|>VEB$Irp85R @v4\.Cz&3Dggjx*}k$>j$yUWN8rSUW]t:pwwֶyr*J$d2STP(HjG4nrrX,r`N1### h{ P>S{Ym/y*tZʾ_4C.'O3?StWWd` sU_ @rAL&innTbX: ߙLAKKP($IX,^|Z!?rH$d2Y f<efBЎQGfWC+] ٬b ȚH$fID9h4* TjPe2|>?77xGGWn6mqquŀ]*FGGU*UTB$(әLF"8ȼ DטBIs8V(+y<yT>xcc#fs0ܿbnG(DX$1Lzzz.$_=`j>pO^·L駟>&w;;L$UFvGQ@—^_Z'I$8ot񖖖" A_fdCb:TaV_o|!o{ "H񅅅t:E"Mwc*oB(q|Ϟ=aR 9g)RT*I QeFjbldwT*rqrH$h]aar{zz@ZcccGTe Bd2gggC ZWXITðn4==ݽڝX,SԵt: J)ݽ⊦! FC:~]*Q6C<$I8NӓeP5Z `0뺮?.-h2ՖJ,srd;;?Xmb8"_d> UMT*CF}>bdJ D"[ J,+a!p8.$H$BcccbqBX|H*^,#""zǛ#GtB-T*`0Ri`0u"Xul~?N/===ʢP(annnrrEihM$NOO,{*6w~98W]XXp:Rtnn.򍇇d( B E.d2a,,,r9 IEIV@{`$Ab̾}oRR=T&p^z |nvK@ZIdWvb8FaF8FK mF#LRmmmշKR"Z:N&P.'JEDS@Qkkk~6R{:y%O_(zLFRTbNtF<`l/wdP$+2L80?ihh@^R $ @Z/PpzzF5v9= 8p;_ ~kX}~zSŪ="k<~y<AF"R؈n{왙Y'B3m<'\.+R JfJ2l޽롞s8PEX,ZBP.p|hJNMM1<?NGi4Zss3RlZ㰶x<~Bk )P(X,mkklbe}/w솆=33FS`XF-F#I2j4Z]#+ld2T L&nii͔XT12~ 2y$ÇD"6Mӑ$IPb,C@PE =F<<| F"1a0V P(8d2J1 b%Rz^/D#H!b atiE"Dt@h,k4H$ly)| t:=11Vۇ T*k||OFB妝H謸H$X,NOOs)]r9FM&S[[ۖ3t:==6H m뉶là===@  l6&Y.Lv[pd#> 52vk ""-s^_-L&c2@Z$~n@ `0.le٩)Ӹѓ"ur<OwwQqnnF9.x1َ\.D"gΜAr\VoYlcqq+fCTjqqIm;,72~k 2lF1W=U*ٳd2 VFI$Dbddu&ҪojjVm fs6O/d7l0i4ZTJRfy#Ij|uvq ۷X,FtOOrP(VTj6Ţf+Jj%Vs:|Fzo<8#% ./em`0H]*YHd2 +˫ 0`00C`V^/}E":זh˱C:Zbhe~:>44T,#H(CDB|6PzN=Ws%Io7=?Xe@4%Y\.w=jkk3yHRPE$ JeXx<@ p8Z~gW0 흚B;L$WT*Ya6==W^H mzJrbx;lۇ+=e˅,e߿-`O\[뷿a].(mJӕJ"@ʍC65088pN>rV+nhhp8V5n=윙Y!tvvNOO^8$ h˂1A\BJN baa!L,D[[vɗ+=A) x| ]w. #`w0 )kZ̢h0x< * .rnwcc#"R)$Q̓JLF  @ fb3 LNN۷osrgffN-c!橩)HT#.lvutF1t:ðX,Vk9znST2,9wR()tpM9] IC3*LgYr\.ٳRI h IR\.4T(t:Z/o2 >D"Q*re#In\ZV:D_Fj &>ۻ\rUˀP" ~@Űh4`0LF$ 4= ǎ7CAc#FA,u:OD_=sw@Q*VEeh4L&.ٳhx6 FcTZv;0Y$Y,9JZB9FD HeW bNFEQoBD,r馦< Gp8lXԔ`nn}$6>Nك_w]'?)tu?J$@  "]Wqn[_K"Z.~SZ Z[ܿVhj9B.8>>>\#lv2 ZNjjjRfѨ^_1I$z~6EJPx& [rj3v;")%xZ(HpL:.X֪a"Fe2;{E&5Ll Յ Ş={*Bg~硿p8*tV+X,p(XvRBT~.(uuuKid2;;;cb===qx<$ :::x<dqS :N,Y p'k٪3P( Kr( ݞNQEJ  6#jGw7O|-?zzoǏáCp]VI<o)\-~s!j)J%pn?)h bh4b0 ::*^gttpJ|b"I2˭_#J,f쾾>?99IъŢ@ zU*G"ɌB@Ϝ9 7:`0j;GGG DtZ>+Rkwo~\y:W^瞃g;;?8~ZMMtރ(Y,`bFlj ~ p:AF?~/Wiݻ&s4;z^*\.7PTPhٖE/x0s\*N[,ֆR"$4׹BP(PpZ[JP?99Y*6B0::j09\ Z6L&I4}}}۪ bmmA =46ww<ðɍkR)ܞ={\FQ-qh*(v)%E/39N oVT.+eɴFCjťRiddjrju8'V|p8<==P( K\.w```rrqRUZ; zvKF,khhv;NXv^r ooÇ X\wDpy-z$CvXThlF?\h~||zh4`.@ E},޻Rx|ԅhR<L&1l6[RT'J޽{1 + |>Zl6"@&]wuf333.K$=rS,].\. |*W<2J `DB֬@n,T8p|Uo~S03;r~}πZ]ۃ~#N8yv;aW$lvccccc#r&`0 d2z~L"qɓhWV+T)rV5ϋbWS IEvRܐP/"thh\nll exH_X0l~~z\;j&f鯠688h<. Cjhٗn79_pmp$*w9h8l6 FFFRBF3 AvQ__p8*5-u y<0Blvm6`X %Nv+PLD2d077  Jlx9j|ګEFX,ޜFq81(p"vmY&)A T*,kvvgffBZԛ uuuXljjjk6 l[- j r}}}jzCKLfjj.6

{ɛ@\d2t:]V+Ւ\.7==-[ZZ^\.j>?99) k0BT0??%=쳽;+(CܤM ;NLja)~hh ~;xQC[n;n/|~لӕH$2??R__զDWW鋋>oG<O6kGS(.A,r\V_؄cكFqjjKVd2p80 ﯩ29΅ji, nl t:x8qkz'³T(_uT ;駟ZvrNS(w|>oNyѱsJ%ݎW;F.XH$1e߾}$IR)d$m4Ϝ9cbAi4ZOOr :::ꎎT,voܖ 6ɡj_P~;x)AN a>xj p;8߃8Gx0~_ Q8{<$}AvZ$i4)J.[XX(BWxbZݥR YYƆVZd===tp\NL&#nf"H"HRƺ*FDF1^>_UQ(Ħo[\.M\ |K>[C`&~筭_L?qxd24MWW׶J6(t:Ba}}j|>?;;K2Dvd{RP@b`E*Jd2YSSɴZ~m ͥM>kllq<E"A$D"Q*l6{fff޽hd^}KӵT*mootJWW?m6[4A7n8t> u8`d\W͠\o|~+8r=G(y&G>ryv{<P;{r;zV;>>h*Toƞ={֠ae>rY ---'H$FSP(Lݵ\UG aU$qVbQ5p[gQz6nO>I=G8 7 g :GO> j58> pn% p8Bl6W{-J&b,jzm> .e2޽{Y,֙3g\.&%FSQTp:O^WS`|ꬓJh4ϑ"*<7afTymķ L&|^6cl A8zUߦ&x8zAxa೟ XlGVe EVW{-硱f]^7RMMMCCC^d2䒵dmmm, BT2Lxj!n_s `+ NcV[= "> \{HUۭV.%<<7^ʶg?G p8p <p9MMg<8$M&SCCC v -1 Rr6JϧK_'J-JT2j贴 .{(8vbR-i[{pþFNO!*e- oÑ#p  i^Ukb1<x# ]l) W୷Kf45p;r?-@y"~ j~aM?``0h4چt/Dss3J|Uȭ,o||e`W"+S*<OxO|?e BX_!P(p@iſ+=$=]Ҁr]]]8#B, ?q95O׈&B6@ ʆ0<<&'' 2ECCC\wjjjZC \|?/zO_ rf%R?>xۗ']5͈wTSl6xT*_@)K@x|zzT*X֣_ XdyЍgXDC8B!H944tW_}ݕn-,Ϗ1 $CݿSSi@("@+ѢP(8f4>>~Y߿c񍓹*sspU 5O0|p$xp}0= 47}#LnәS2ڦ&Tz&YWWvǛ^F IDAT rB}8|ˈXA*֩kù[>٨X {m3E?{AD"|~oo/N7LxyW>$Td2>/ t:z{GpJmkkZdRTJiLB`(d2J2g2vrarTo׿JgTp}?_nnncg [AX,r8 oL&RXkeYi4U(kw "I  e5]\`I߾|rpY2-koۆU;nZXXX\\p8*bDa<::j0*|Y$(#`PP%:#f8̈́!#pN7==],R)JhjU*hr4bl6`XL&ðrpzzzJRE  V^_ 5Π"K0<\լF~6 o ǎ=@8 ] VoI[A|)Λ͛xIOp kF%}) ɤRz~lln7>>XWW^/pxk) C9N4 y_n9 z^ 0 CщDB8d2 u211~c\..\.tpg2" x<DRrXD"Jr]/~-|s0|SP.'Ѭ4Jۿsc_$bP([UʎD"333$I ¥]gЭ)DB!b3^4Z⑙׏:nPSh֧ׯQAkXiZF, eAJ% FfF$I`tv;d@Lr9r544PT$L&j~P( qx<alLxD $iX(JBNb1 Ta0: ww $6jTS}lC]=k?\D"lss3rZߒsd뮻.'Rrٳr+MNNR(wAV%_H(s$ˮ_EVthѩ~8قx92! o-333###K ?ruQI5cֹd8||>N88tIDO>M(ꨢߍ rnnnl`l vd2 ^BEqjf;PC3 3πX ? 2x#<88^t}V #Id21e-@ @uzrEIRB^tĝGX_KW)gt4pWo#?Ui?OF'&&ږ s͞|lGb]]P(hȩX,.,,E"Dccc5UYvõB: gϾ/'W~A8qv^0kc~?ijjZirBa]4^$^=mmm- 1좨~Hd, ㋄T|Yw$Ir;T BY:npp2Nb TD1tL3g8>88X.RVU~Yqؿ~+42ٹAi~{hj'zse j/t3 It7@uEdnd2Y*Bz G_yv)xYxjf>G >p?wqjrL&s_L&sqql61KH$ZieYPjM&SrF"<;_6 t9= 63|.G};1ȼ9JD"Jyfb}q8J)H$FL&ٳf-j0P8<n p8 ۷8 `ȿWTK'EtѵD 힘{_e`كn;NT* |TD"t:=Hhlld;mH_* /+@C"> O<v;D@U__Zٳz_bwwwowP(frmllD5׏uvvFհ " +"uttHRF< >O{ tktBԶhSSadqĉ`{{[[l޹{_8 $002r€g,M{ >KEX,X,^\\NZf2H,t;d5Tjoo/BtrX,8Ak+ p:T*c Fў@L&nw8F**j\-+& +H|>*|`z~\.P(6mg:y}vo +"^' >uH.tUk RwzzP(h'Jx6406b8v\FQRU^ؽz$|y:>{lTڳgG'BY&eӧOyV% nd|l6 ' 7?Bd^㖀z_2< oUXP,‹/“O,s9 x.d53V~ SCSj F#ke_݁(jH$KŪq CCC(zy_{ x5xIx5Nx5grnBr\.fQ;Lh,X\.w)NC:ۡxb7f\.D/׈D"a\"OMMt%OӅB V E& RH333/};O=wtt-+$$c_šfW~xix J{=N/B0ePT*l6X8\ckfnj9s&I c7"bP0 T*e4|eL6<<֚VmZB׷|h4dO>$ZZZ;10 J>@98? *uw1d2+:nØfCfk'mJ.RI,{Vcbx'xnK@bdhMMM566 IrJRԋZLKbTRLRAyC$d2| Ԥiшđ/b6þ} k]+'n^6 ch###+-l!Ba>wkfk?_;Ojw*@PTe ""(* Y*ʆ-6Mn&iqδ:*{is9y.]hOL`  q7+ tٜF&M&SffJJHHdoL*.1p0DBHa\nCC(_Bneee...EEE͎`~;V;mqgNO?|X : D"c2v;*cťj[Ji}i4˽`Ch l6T/[SSSVVl"(H|}};qd2Jvtd2A]] ZNGm60EEE˗׬[}}P(LLL,))~zTT} `~8q_ja>+abJMLƼ_.}}}{=ʮ+ͅ}\\\~8;QwP(!!!"2C!4k`uuuj T/xL&T 0"kq8\`` HnBXW3ͳ1ÑZ]]ݻ1Xv<l2Z,pARi4ZmmmMMM_0,`JR(XxCCn>-z ɣB˛'<ˋdzWXX`0ds"%%22s򎈈H$EEEuz:$&BB;dw{d 'dN$)888&&FP9!ZRlaaaByyy"6BNTR\\H,jX, d29Hyڢwòs c#''-((H*^o梀FCRzOllljjj@@@_ڵ70c]=";ص `29sța0 :00Bh D"bbbt:]yyիWcbbxL@}Bh4&$$444p8lm{xxP('A %x߀$2 PsrrSח_...to noL WBK۶An.̟WB6Cr,&33S(u^6p8[21!![dFDDTVVVVV^gXzCEGGWUUh4P`0pNH7wI3H,**r8 p7Λ/ Z-z<Y (RR`< ephe+p8OOOWWTg:ݏ^J111לd666(=bٲz;VnȑG*,,LMMm7`7Aҁ 2 GGGWVVP($3sl+d2:#`Ϟ^:O<PZ  ׯòeO!HAAARtfu5c2rss;_4662 Vk4moO}gyfeeaU[[ccc1/5l8666++L&tЖ懽Fe%x0?׮]/,,Ī4?܈:E>4 D"?aҤ 0 s'xl5VxJvmf@&I$L& ɚ^v3T*[D*<"YL&S~~n78!" ⚛Q($!R#6#8RZZZ.J]\\F#G(,X"fÆP(h4`p08! {/3sO_hJV3j2JKKR.;r~e3ʼn,9,;;[$߽}Ͱ9\.*{xx444H$777łдc[Ve3t:BbFM"=ˋ޽ B&t:f΄aAkVÁ`…PR!.H$;.K`e "" oC]BB|>$55q86M\J)**R(>>>L&(}VX}s;LmhhpuuuuuŦeBP"~*$$ - ֮? zwlu $'')%C:iPSSSQQzFu7iMHR*++ Chh@_)ahZkkk]]]V˗o)|7Hw}Zf:h4/.t>Jf&9QQ}7;N{ŽO~ u  @R B(22R0HVfa~~~&U D5jT_r,{`?=48]W]BL ۉ}GNÄ  Jt^hmƖe%6H$v08RLMMtؗ)@h7ݝJzzS )AP\vիN͚5g&񩨨QOS7n} W`0X6B&55+%jX222rrr.g1jfgg#H$ x=`hbHl\bqHHDDD^9fU͖ os~1{lYBw@ ZJH$ba4-::ܩ8~uWS IDAT݄D"v6jkkkz+%T*KP(8bxyyaLV Z,\Fc4?ڤ 9=gB{eCp8wwwL6`0j*j0(JDDDs*{UURnnn/"qH ZhEEEz`0yxxA T* ו+Wm) HT*8N. |FC&U*KMMnn7 enH.fd3FNN` ˫U^oZ2ރl66tLT䦦,-طH$0~_RT(VVV3PTdH$< D"=>~g. -,JD8bz=MXXRtwwowd;{ Z6'' &j:''jbEh4Zlllddd*Ō!BCCI$RSS4*paaaX}K,*Z,ѣG?6pΞ=⬬{<Oz}aX>>>lv\`XL&/Ctjl@|hBUՠ,linB z}}}hdd2rs*-%~)++l@R򢣣q8J iʳX,V;݅D"5`D"V; gP)DOOO٬ںՑdHrtzyyyEEۓYJK߿1Dd2[6lx7h4wx4f`CHr yYW s+Thn76۶ĪHpr!$JcOY٠6o *++DG jmXq ?`4`l0ByaP  jRm<&!<*,,ևg`w&) 0C;C h4aXH$/~~~ mϲH2B:kc:JK{khϟ?z茌^p0Ju!; z ɰ @  XY]]Y.;j($q8\uuw{4A-vɡCFef~ ~G`Q׷˅@1cnHՠ14zK-x& h HP(6M"p8~gQ^޽crhN;q"9//"&&&$$$;;[R<.JJ%W#[t:]]]]``\.W(}=ޡv׼mv,g^ M|;e.Q[  .Gp555F777j6m6[z,-흄x@R4n˃Xg|R|wĈR488x0%2; BHTd2h6l\yTco=s-%vKhX`L0:7Ltz}eeeQQnG;S`.+R)LS֭|<V5k``%"""77788B"ljEXmkTWWW__O&T^n"dZ L&q9]=`}.XRl|~*v1ǏÂG0o#SK/됐p|p8L:Dr8uuuZ522dcyD"q̘1c&o5rGߔ|ޘ_!)Wi6"- }9OuaXnE$Q7nzxx PN6]||1;`"عsX:BtdYjjjʘL{dd$&TEEEj:"" <<|pt]Ѝj.l63UW-'v!hsa^HME^pܠ\Je0*..DPIRVSUU7jt0bw?ryOܡ8|w=KPLݑ[W,Ґ'^]}ׂ_?G@@@fffccf#111AK3tnj̙ C {P,bD 2L D"Q_p8m6[\\\YfIIN&t:ʟL捉l :Qt*+-غ(7+=rOS[uqKoW?za_˚ׂqaASx{8 Bh4-rvѣmK/U*p>| #f΄ ;+ x5jTXXt:lQPVw^3g 3fZٳ#]jٶh4 |P䓟UU1ӿƍAAA jkk'[ E,):XBѹbcub@\p,XRXf[!j >>j-.&g7kj }fM O:}H$RPPJR,_d2Lf4M&BPL&] Wۓ .8&~5lT'r6۵@]VeȽUUkk-o1 (N!d2z^Zt:`0v2 k:NF :cd~<::ӏ/o+n<%z=+Oɔ7v# H0.ڍx+Wttr! iҦMn./¬Yo_f0]]%/O8aJJpC*Ǐck 2,66k^YYYSS-$l.KiZZ]PP0j(g0]`0L&YttݻzO'Xnš.z5*ڽwӊ ׎m zј}gZY4[ ,k֭K, lP*ۏ@.K$]k׮1L@Rz=ùkcTJNNLVCq1L <7~2k֬YuN?74曶 zYYh? ɔG=*ˋv@ ljq8OOOH$|>?###22j6KJJn'C <'H$=Ǘ\~6@6 xl]Sxs'S bzuP(4*F@ %Ht:`0)`YY65Ja q޼Ӹqp <8&u ۴I}Lߞ4I5y%K{H$//v B!ϯ-// !!!EEE >!k4H>兩Wyyy}}=Ͷl=9L{dN3pGߋA-@Q`_xgXveM׃x{{r ^z^$LpH ;4i?d2ï£v>HIU/ Hh66TD"yyyu{zzVVVD"tƍd-%%%^^^͚C666VWWS#FX,m6['53 ^-]w_5 ('1nsqӟ35 a)g.--5 999_nn\.DF_hOΨLovw0f <8С^w։X uu! ƘՕ#F[,\.fKQQQTjzzzPPkZmj $0LW\vuuusseee\.7$$dح/fa <gZnb`J1 $% ؼ ![\\bL&wDDD^^^vv6@ 4:}pN&Ο5K}i22/VVvB!(ompz[/wF&tftK|///"ycQx#0d"==Qfߟgffxf{7 ,[Lsƕ W\./**Le2YSSKKxKOOwss h%l6;66nwp8rssi4`]Y$QY"WQQVJT*2LJḺ ,tVR) Q] BBtwijhF~njeUW 7_֐A1F~b䓲GfϦP(U>>̪|y'8CtL& 7B77ۛd*ʂry w7h4r<$$t" b`32 |յmNÜ1 l a$flYYYF^p ~uL]'Ǐc=}u60zh6 @C,\KՊ BJ$tJoYTT >>rs'dYF#,[Oڲe4u_`Ao]0v,Y;;;}i 6oXX,eeeiii=/|9 G8S':¿BOOςPT*tg&ޡR,))j7yl!IV˫AQTRɗJ99r\ESc2Nذ  ! `aaRδiW6'zxxK6<0Cy9P }ob1֭?ނl @ߺ#tGatڻANNo'qVĠ HTXX(ɂ{%C$§s٢kٳAn PeeeHHU(#F  u檪=v{iiixxQs/lFј 1;۞ft)Rr΅3䮮y6[BBw[l 0x;l[G"lBDX NW E<Y,瞻)Zn c?'9KyŪ+x }w=;aX8x?gښy=5ز毘v;,,rcΜ{탇'ի5IIp4l4F IDATAl,=%7n@J[oF x%r9 tX*Z~嗫Vjjjf̘qh,سꅁ|||bcczŖ-'P[۳t nnV;̫WyzzbU0G77$j;d2JZU<rAp\~ͥpYSPF7yh hGq:*J 3J hr8:sư $SOW_3 9LJ]vwرdɒ.MWƍ[0z4:n+Ųu֢'н `19YYp!;-ft|WTd x.VhA4Zٳ΋O?-8}zFJʺѣ, % #<<A|¹܌d;@D:Ǵ4F}|R=_^1{L&a|k>Ǜ d vTJs>t%%%DYaaRj~>1;@,63'L=`Fh2;G¹sӧ[oOsUWv7x L&oQtR׃hH$H$Byy/655NyEF8/u:tE*"***++.cxA.f3<lmJh4V[[Dfȑp~Pzx?Z8pqc ޳K;u 2^|-/dSfn=} 'ÉpVJc fAJ |tRi/:b8ᒟXJOOh4RQFa?99/_^|1}gbǴD<2JJJ<==J5v?z@ @EWnRq bb+{cZ,n/oJ.|8p&L3 XgX˪U@aȭO!Kf͚[f4K7կ\ jQ'q83n]]P#t5k^u WsAR<AALHoW ;jHIL0t:]ibG J; n0FVC:H$Á ܹ*5..r9뻱"x^.L#x}{ 0n~$`@O?Ν0vӦI&kAmlHv at Z-x{5>{fpsl  v]455555@Pxy۶]c4;mpwYg' }@?=׃ TW#]yrE?? Խ kq0Lo2,*)ӷWL>{=<@;ϝCc6l|]]ŋ+**Ӧ0%TWvF|kɜ9gKjn駟HoMf^Hrrr_{mÆ .]dW\tVmunojj.}@{}糳oOcg^Xf#ԦWM:O=IIt+O`;VP(ׯ_W(Ça$8u:v}JhPS&ArL&͛_`2Oef>UTj:.+.] zD2LӦM[4qa=VUUQ(V%Ͷx |: χeˀHɓԩ~ĉ_~i3g yoo˃[Xq:oHRKJJn_jkkEDp8p$p8Jx|DDVx%\BBf3JtRn ~+]6e j**~67zSOFfTaVPUW7^ֿ~9IJ lׯwC,`۷o/XzruuyR~ޢE@$”)k86ѕ}Ettttt4̜Ys cMMׇV,Bp႓M=jlAhh#5~ܦM:.==V~Tv] %nl8x1P.PrssY,D7 X1o,&~ʑ#q&IV#v{AAAZZhl&%%ʕ+O;JF! X&(ue3E"*,t˗1Ss@99;V-4lط-454Og8wHQr2B.s)**즤dP'g|qlɋ999 __w{$>F34<^sJ'O7oޥKL&~k{a]iL^ߋDvrt5(0NMM.߶*׭kZԤ4)))}(`{xHQ\ o0yuyln4T*x^U9imu$pt)))o^XD{By9DEڵZ-޽ѿ7߼nTDPP*!'^zmג%K>U*uNGGDDyk'+ i(Zgxص 6ll޼9H(<~RS_v9}~4~3CRF?su79sFĴCGEEq8ӧOMN;6gRƎUl,J)JAAB NHLlh[= ܾuؓ'YD=χw߅]:ybFUQQRzpbbbZFK5SX8,``9r%$$t:,`JIf6Gi)$%Cnnܚl' 3JeP…A1;:n2]'X[3 Ĵ9߻r{IHH{gϮR3gܼ`t`YPPʇpkkkCBB滹)̟~ZiG-^:nnNJJ\0]' }s8u g"ԣݦEVd6'mڄFF<=݋JLfD CRXܺVRŽ[_Fo|-@:]cΝ vucG6n燇K 9>mŊW^yW}La6#X0zEEū{y8 9x|"8?G:]o]v'N,pnxxL2A?^!/o Aqq*wwi`exl6TWlv_?] uRbY-7'||kk+p”)?=>n8GKv"S{“OB֣aB۞Bff7zkfbHLgmyL4/q~˗B'2l#c`$FCP_=A"q7Z_q0&}Ĉ?&LxG&3^툈7OLnv:u)!i˗/pdGh|y2JZӦMs~XGpjjcl1r>}"}!gCMVq/^PWhѢ^ رD;yhlZa@'>jBd Ġ/t8hD5yLbx6*D믿ғ'O˫A h4{c>3FޱcPFFFmm-vɲe6ũ;wnyyyEVysIL̷,V}nojj:w\s K>vwۻV#"w@ aÆ""гn&rǎ 9Nd 0۶ H2 B}5vҺo.R-Xv쵁uM6P({r%ڴf׮ !ʐP[>|p5XlL&벏QF7]Y%!O +$ed|kTLfhhhޮ\rŒsA;ˀ(.aATBNl^5v^kU1NDw TJT&cQy~1qf{=P(,((xMi+W-Y,,Pa!B~Ç߰aCG}|С}XI'bP(]i7"m6 /&8;~w"w!ʩmaÆ^-jfHCH&ׇ;Ϝ9#rrڐvLsܼys@pJ=%A ؠrH^Sׯ 1~nnسxHE*'BCCwahh8kL79yyǏw:9q򤺺kc)ʴȉ1cDF%EE"FsNZX@|<7\Yfccs!+Fiğ>\\m۶SN}6ƌikd6eB @OZAe%27G9MZZZrr2*-E mW#7f@M &k\!$9{9]OKƎE52AG@$ # \n޽6l ZKKn@q8zz_7WV~|TVWVgl\.RQi]$BÇۛXQ+6Yuc0Ꞃھ}q f p&HL"qSN .bΞ9>ϰ7o|"#]jD7oތi]O ϓXexD)))˗Ri[`rF|>L Ҧh ' $D5d4`c#e&`)Hx1|֥WŪ{ drݤ|z ٳgTNRqq͹\AEEg׮]5̘1R'ŧP('Nl$!ayyi] `qNepPJgjKڛC9{wZ 6n XHo6 8z4..NM)0@PsB+k҂{ݽ6{ԕ+{0 Dur;qnVP _u…Lxcc+Wޤ.::y{H$rܤ㤤$77+V4Tӽ0$H#GDݻrܹ.]tKM9mLzpҟyT ;X*kt$q-Y !SV-WUUm0l񿨪uU55JEu !--B[ 9h6oFD"# `~ҐQ.hڴorJ}H$:zggUkr2ڇF3d._O+,,v Ĥ,5kQVͯDIIɺu,,,L)p,W^EuJJJ*--b~r"ޡ]9xC/]~ڕ'Z@|wtV 53NG'alxSܯI|>=&9:-J##j@B@^CCCQWEI)I8qӚՁx%%oz)))9884x^ aXϛGLI/7/צ::޾}I;d>{{iU055 {T" .] nc0;v* =T͖~Q9ߋLf]DyF)2폐x&*݁nu0|X`55BAⴳ?!":m{xx35 !֭L8Q q+WФI\/))9hcsKQǧD#7!ѷnTU7ig\CՆ AmMK'=|0%%eȑFJMMj!3'zaX㻩boKр$&_hDbS=pw NIIij$E gαIQ1o]^LlY w@RR@[H$Y!#*lYB T”K$fm3._ څ!!&h X>} Gj"~HI 89ݳxnmm5a_?8us͙Sr?]=r1Ç_,3p Ԗ8GԆ y?r Gə>}K֮]ϞjdJi^D_9:U^מk M `bϭn=Zkood``P|'W`8-]mT,YC>дOtB~fah(W@k4`0q]ה'OxyAee"%Ǐ]X8!jJXXغZV^='a55-Mdc3x^ήn ǎ=f?_{RtS8ҋAAƍsqquݹsȨkD$WZZ󣢢RbcR(UT.]4e:=ՕRVVK'''cfhFC="$2>)%%C\g6Y׮Vud-,(+CΝ4= "(MX,aA+6_P7onJKkϜ9֐K C= ݻw|GijI]YYiii!ɓ)+)2}^`Z'pUA_HI:9Ec0.]h4ZCDFFjݘn FO"1DO$cgu޼yW Sn߸q…OJh4'm*k3 CTVa;:sFB77h]KE1IIhRdYP~y<:,TTD:"R&Gw[QCߕLR$*=ս **\ݛ#>R]NHEFF/ RSS>wxܽ;4[7uֆ9v؟Xy2Z[;w\^9:V()5*<<<,?72T`ÇKǕJ+yBEIUHތS)))OCWkjj>%#o͹p"#͛NPðu+8ÇYCCuHgtdnڀp%kd$4)*,İX/D V]wމN`̼ZQ1%-c08w^r T/.,g"}&O\\\cŪD7" mߎȎfnQPPhhرXmvvL34lVD"9o߾E[ZZe![Ye99 ;I_`$ ={vZ77JKK=uX7|xͧN6d`.{8&LHϨfOϽ&*~}z= 6u{O>}t]ϊ{c(/P?˗f)HW#MYWFF ec~'N!&ND/ݻ uֽ6 F۪KtuwYCBaaø/M`bEE_xÇWKJJlllԹsJ8urum =}GFDDGG=:ĉ{{dd0mذlڟ{ C qy)ZkֺPy$ @`N[s}|}G`JJJԚjc! Y-ׇ7KXkLM k޽%$͘?H˖1Gyñsu/$MGz$xѣG^p\0e FjC`4  yy aaaE/W<=ii-YN s`[^E98ׯ_?2AׯƳ:U+Smp HT5`$ LՓ'O~T_pqoaATTRkjIddhΝ`\,6'7oNlH$uӧ£G@;͕=uKb-x>EJ̑ohYY-8úBWע"FѰXǏF92 0`@sf$Q;=hWcy3< L$3`ɒ~ ,喗7։ǃÇ[YQq˕q+…QW ܤp87owppp_SS`GGGFPxʕU<!LRT!)L** VV0xpKGٳ۷o0 G@I;;{_HT2RUI Ӄf#*lMfbbb BRRes5kN9mI;Q`8 >]M0u?O:< l. xY U+//sN~v6> )W'(h۹sK.mc!`g.[>>>UUݔ%Uխ[6pEddl=~l"Č q֮67WQaWUU1˻;f l/k`PvT4Ӌ(^xDZO Phj& d2D\KNE&;oSsL% E!VV" :l[l@oO4#dgg>^`-#..Ξ$yy!C8ܪUdK=V,󫬭)ճf5[Q \xqȐ!>['lt=Ξ=wm??dPyyy9Msqԃn9x@GN~47#Z$!`+^Ɣ:2Yǫegg}\D #]*Z8sݿѻy^J&ϙ׳۶}d2XYH]vm`d/Ag5Ͽho}r玷79/r ggg1d2!t:H$J9YpԚ=d-E[χcaH;==_k׮̛7kܸ\tɆ@(۵nNΤMZrV??}z$$$@ݴ҉"+F+,,3f3-ZWr2+,,.|(p$wLQ]>8?jo?H$*07g81fB_el^AݲB(((~1000))ٹƦѣϟVP]]caw  WBx8xM;;{S$$4O"x-/Oedd1buTWW<".=Ca0pv,^/(yآtu3={(99DB D"No޽ˑ9 d-ď$&<=߿=T;322 /))Q-.?z@?dTe+V8N"bDHI(`nHJmmKK ";1:zUi½{p$729{fqF'^p̊ e9pȑ#'OϘa wh_ ˂{U j|>Ќ]"hȱHN&ldd[QN#W`mq80u* K rZRѻ=4fh4ښ5k65MX{v쀔*xM 􌌄}t>?޽G[XYo/99hJɐ7[(zU@ ^/IO.,,dJ}$߻8;+>|HVS+--`0fffT*V+vCZt2x޾_1tPWͮ{/;p`ڴiM ,'MEU566ԩ;88pX[YYۥ3JV>\1B!L'DF̙cq߿С1gDGCd$DGL eMqQQ͛ IIIUB\{u AN?Ȁŋ2ܜgn_).../Xݽ;zhc322͛f͚JL#ѥ[=Á-[>zz'ع3++%5K.=K ,޴Ihm {@f&8;ѣII5w]Pe c! U kրEN {DĚÇe-N!?2299ηo.?;U\"헔o8\֞=Dgg//﹉](ɃҾ ico߶:wNn~u,X*ہNիe-Gܹr, `>x rsݧN;=hhhhH {.]$>ѣG҇,LڣbiYm~mCÿML<ݻwm/]K)4i܃IYY3f1r 9oB;jժfϞϟCBrfNIڿl[3bĤ3eeeJJJ܅>(,؁@́S[W樨m9aº`] w[[駊JOOomۈ+W~>>>\.KW Z dd@O@{Eff-|>BOF`0lHi3 }̯#G /v쐵RTƊ1\rӧOÇcX-)bdffS3|eSӧ[;KW *+[̎~}=޽QvANHR'QQQ:%4b  %~`QUUPQQ!O۱+A'S`cx{71bhh陽.Ӧkq#?}23."} IDATos()WʍTVJ"~Xh(̙ jt{{P@Wzɓa*8x;nj116.**jdڵB!(52gf;98eȠd2%w$GFX3)*2CCY (Css` i&QPPyn ZZ0d K$2OOOOOϲ֝lQ>""ܻǺq[Μ9Bc[l 6tC1.rr`7!-mHP\C:=99Y<ǏuB񲴼^U՛B/b2%A}ȈD"~fG&UdB.h9r$z@Bs9sd-DKx\.  wfLԥ ψ\ANNߏJJҥKcƌsΧee(!wѱc/ xddٯ߶mۚ!Ԕ]z5SE:"fOJJKV^-.y!= Mͤzr8HCC]]]b4صkD0HLKK=Ҳ噓&J5 a4W[04%K){_QQfɒ#EEz'.P(#Gڵp˖S !TUUERsr/2Q2Z`P/k9d޿-Ϗg1ul=zIΞО<=2䱇GG}I@ dN32B騺ψCVVѫWbCqD"ٳY,MPFz=|ΝCv+< ! YZɉX4s~Nߠ۬HMM=c2QU4"(Oi~)Uuu7oFݺ! ނp֭ү ٳ___W^UTTʘ+v@d$MM rrBZ%22277n?,bUT޾}+6;ΟV3J+ llBw쨬XRRbhhxF JBYYYjjB.Fݻ#ЬYE1 G٨F<$(( YQQaaa1ŊGh$/*^Oo·FYrJ O#w%{U/.JH@ʵ !!!\.7;;;...11Qz kگ~M k!u됫+d-.?ʦO/..vÇҥwqur*㭬$P^!3ofhhH.ikj*0 q1K?IBaNNBED 77bQnnUUU\\ܧNYYY4e b'vv)))\PP B/_C ŹsR}YݻZƆdzyy}uBp!rp@/^m LNNA4P3q:ӧp*ߞSFIJBBBMMͧ0 8yR]2x{wsV  < .fu#Gݹyu֌ҔRbl6-\ iipvMkc2ݏǃ<4 I"Q= -vڇ~SQxD==Bc3w/quuBe\HC_hCCx>x|>ٹ59mLԦLhԩ%Y #-oj;4111YYY3'6o?ݻ>'Oy$_JOG**\LjL11Y)))|>JGGGCRh95X8ihMLݰt)AW`غ239άYƌcǎ 54 /5zjpX-S`B!Ǐni9skf}[tL5o^{oTssstuu[&"W`&# e-G +W)`0 )9>{vWIRto`ѣA 3 ?~4pP^`a!prco x6kSnTJ+;v6R 3$%\Ϟ{}59?9Ê :+[[۞={OPeKɽz bb a Vn܋X] ?D8|Ŀs66N[Y`wVVRRJ}()z? Bc^^ B}xja1y~r~0YГxgb4$ [[ۂ CPh4)1ѣ^^၁޽+y؋PMD06Q^>4 pJ]^o?b6qD{駺u'`bWP(//wssvѣA^ 6***d2qJˑ\ɚxYQUUL&߿@MM)ypXNNU쫫 KK W" Ey###c…7I&5,ϝ;קOQFʄgϞB,ɳg$铍+vw7yϼ7h&'':5 7WE% eeNNu888kt.DY]v-\tj X݇80PvD ٕY8ܩS^I,2-x9DJ]Ӓ2eJؕKfi.|>ф-d2w;r$tt=a7Μ9J"Nlص .[@ YXXȵWgBdMS`<L ۶Ei 233?~Ji4nL "]-,tJJ215Kpf*0O<>mZ=rr8TǏ\sݽ ֣4uz1c`0ؼy~osiJJ|OMnn@$BDqqqL&{Ӯ32 E~iŊΐJj333|ΡpEݻ.^D3f44ׯ&ND˖}iB(9Y*llPdT=s F-5]f E! !Pq1RRj,AsΞ=yyyubQIP(yc}:?+b_{WFAAA*,,L\L&55nݒ8*"??%0Çуy$ܸjrz(N33˗0z4\x/^xzzN<ڵk(ƂFzz IOi`X9A РSml묫U]SoܹsG$62*")í[ عTQQϣ9oQ72cHɄ;ab ,ihQZF/`={$Cr_7e0m~ܺuʔ)􊈈?OWBdm3d(-]X NÆPt@ tf ǏYDb]Sol+/?g@xD(\4hPTTTkD* ͡`Ӧo@y^%޵ 5xx͘1Zhd4Oidќ{Ȩo)0kݻ!ذArvسQx G&Mjƪf[ D* --T[dg_QPh.;rd0a?)222<==]VRSr#ZZrm\)E^$9tu\FVJ&?SuuujjN:naap233CBBtuud2{$::z -g)(((޽'ebbm6BUBd$] k׷ê@$j,-He%GRVvϏ]GGg۶mu[MYNNvSG-@dG:IIM\|[Aaaaqq10001 bjjd2uuutm{"@ NwMO{ܭ_5k:BS/_ƍpyy@~K.]>|l^pxdVWW5~|ҤI~Zrr/;ڿ:Lp,6U2v  ŗDaϞ="###""JJJ_ `0>}tBGGGSS0mvNp Rժ HLR˖-/.޴rc޾H+ў,0aeNblBZ^IG(tL,T:Og|>>#G^2V[Z7YN(0ws4%EhiVnyavrTV |WndY $$_Cx޽ g``PH&\8RX,HLHHЩۊ`X,jJL&ԩW_V4b HMmes59thd&JzyۻL`iVSS59m 8rEkhdgɐ,7._uu-$mՒ  6l}_?jřA{`&&@BH1\.w.../08i)W`|E%NBSOJ$r%>_B!LWCà`ְX,L亘ΜY2~<ɭ;T4l@raPP$ZSSp޿*5k*++߿P_rB(ҥw "{"޴ ac+Sb‚W.kftMvmPz`06+Dtzee%^XZZp\\FR4I TB- crFFm"Ç \@""^cUs'PUVÃ`aqq2uYJJͺ[9+0 kr66p@GK6NyQAek/A.SzOûwQE]]ݻwⴇ$~|X7l dnn98ý{=.^X}TF/(//'!qZ(fTVYZލƖiiUTTxܴ4/&ӒH07twtV*DM8{pHL,w drm V ()fǧѣMP(=zOx O\׵CkZ; _G+t2 >(*3ܹFbذavvIIIB~\.7077Ȉf@ѣAGx;8_HW,1^ʊҋD`8[TZ+88ãw^fw :@@4ZͨMAƍ33سG֢tT---/xq~#*+A@L'O˜1-x𰰐399aޅwAM &LK45ܹӥK{{]̌#G-Zؤqq,PT|y!L&S$7ꇨd0 ==ݻ. ;@E` },)Q՝V\gbb2յSAD"@PSS`l26R\|q oFdzLUUUѣׯ>|Xk[+,,lrZ9v\ɡfn4..’Bݻ7tŶ `bxa6%"o ɹH@PRR"zzz>|?<7X!;`0ZZZе+СPVدDRPP ]x׮]cK  {Cp]xG**rsr(xYY甕0LUUUQQ'`0|>wUUUt:=99YQs***%%%bsmBpqZT֬YJ 99ī* ^S& Guՠ~9}v>A#mCUL jwcjjQZZ*~sss߿_VV L&յ *=jllf8NCۗx@uRrSa0ݼ r IDATyaP+K9;ZO9v^__YOObFc;::ꪩJs_zkkl^ǫ[n+55vS XBa&td\ Zz]lqn i˻GV=ש2ˡG:Urt ?L&---cccZ=`>iii{Y   فصk!<)))x<5Jih ^7N͚k M۷o߿'k}sqVTmܨwf|TBŋ^u(,]gf++>n:t, {&*/Yw?aX6]tHfF}%ߩ2v:xQVVԌ(%%%bKJJĶH\\HAF]yy7op8x,BߤvZ̔)655 ]\Y"//ȑWV!7zjjkk3EEEkoo/vfVWW>qjOc0ݻt^ڄ7 [>F,km^TMVTDed zC"Ds$)s^ cc|]]]@ nx?fmmmcc>L0x<022JMM~Lӗ]K]pxC奤899u1Md]dR700022VVVfff2i-g˗33+++6/1 սgV?o'"{54w`?SL߰;QMUp<ãKƭOi>'@))tW)S`Uƒt(lll嵰(.."WZZ*.REUUUi4BAAҒJP0bTV*++W_]WNAAk׮KfW ak CBhdiޜ+ONNS_Jk>hՃkXoRSASen<=łKe,FGJJSؤTTT6+,,cccgIHooӃá(--M/TM \]̙-^b{`:ţGkDbbb&Gx`ԆĴQ6oD"2rrrN2Μ{{ߟ^]`Z+,**L&k׮H{+*WyyyL&DVRR}ܴ & ֘ 28fφs54Ivvvm!xIʊ ##0`adϘD̔ggFFp%''ԨS~L疃WҾ|YjOdN%W`? XuVd[!;fφe&CFQQyBή銊MF2ցi`ꌌ }V@GGG]crs'?xZ͛/پlɦgCB "CAĊ]ly詧`Ó=Bbz#gӷ4l̼Lo{'dF#yγ_y=V_'HfKB{쒓%IqqqeeEwnx≨nR><`𶲲={,KFFsqwgg~:܌@|)n0Bع] \RRBlfَ{ry{{{ppGv5[︣L;xb--ǏKRK^UUers-[vz֭quϞ$|R g:jxM/JB`1!88N:iY:flYi]]ܺ5>87rs;n۷+RA|||c_n;. '1M Bt/6 χ=sdeeoAdIoOf8Nf#r!Mhbcc;bX|yǛ5%#Vd0>TnQ<0r l5k`0*rrKJJ\.onn1Qq.px< wsbம-]ҥ֚:4(sh {Ը;= pn(AӦM hhhog٣pŵ8qyG7ILd8ϡC_|2駟PZZ_YYRVVL4 `nCw7DG{VDDD__߈Frn J=== ln~g֨(ɓ#2ck즦 /X,}jN3<o齽o"'anTS^nV׿ MWD#"))D"ADx ikkp[ٸ\nfffmmm{{{BBH$CP?DZZX__Ţ-İR΂?0̌ 8tt-07rgk pn":PZWWg1((1+0XR[4 YYYrʞba}}}gfR+;3n< 3=Lu.&'&&FV=~MfAhh̙3IrXU+-  ە`h UW)ck|^Wa0E PhF̵lYrEHT(J`0^AYD"j/ ׷'J޵@ :Gܨ հ{7Z܉b>oC/JFhll` ge!Jlf[;: ee^ll-;`s @p /E\~!g$iH<(A$r8&«$'Cy\.O^޶m۷fu[pWv__[WE΃]!(B^w}ֵWAh4ڧD"4ɞ/1==]x0l6uX'- X,Vhhɓ'n 7ؼzɾpjkkݟ ? `$R#g2˩jNA^zd 555yzfyZ@LL éruegCA08T*KJJ`L(JJD zWΝ\-Mb(j8buwwGdzzzWWRt{1.5d*LD"O RSaLSqqWWWmmmee}LL}@ `$R _K g`2 c8`@@^1cƘ#lvrrɓ'G7\^̠P*+*ZmOOOMMX,v$ ==zIUUUoq8A;ť-s!u:=H$#f:D!!!ӟ݆^l:+)):nɗ_>L?:3qllې. `a|1D.9?r@`(M&EQc ȹ^+qcȁ Hy%',(pX $$Qb ܢL&pŔ ֭\\. b844o8c#&iԺj;?mw B~xGr{i` 8p8---jEFN-\7'łwɑxh111ERD"ō)l(fr/==}Ϟ=+}aXJ5`0U:]m̟ "> rE98ݻsVWjjjWWWLLxwwwq@֮*H 9^{ F5[l66p ㏰e <0eOOS>ܢY`ZؽF-hDPPfSSSSFcX555nH1Ef'k3gB^ވTc73 Xx  y `nW7 +W…N>-r/ RRRJewwH$``LFd{{KEf ý²ev-8HLLLKK;C` 8`MMf=tHxd0Ӈ &SO9CX,VZZZ]]Z c0gvdq `JH %e" <}|ӣ/_Nwʑz&ClNX^۷? cG Zј AΑh4\K/Df}̌\(w0c=:Q6ؑJLK\bb1)W !9'DA*$YVV&'^,**J0E" bill<~Pggg^^^AAA]]]__SM~aZ=aF;;^;ț`s=?^9Vv ׈laaa`0'Xq*<ј>wDzȑ3.Z iicQ@TNR\as='}_םs6eD"ٳ'}ppVN8X,&{芏xYk@H$̜;w=EoIIɱcXF ma!'~m% |]عze?n^0׫vV^3sِWaaaaH׃EQyyyz>;;כLGVUU9Ft{ؙ3gXRFS]]}zݯ8p|n֮nkq8b*| ۶ f9eVC(pR9ހ{۫T*jkksrr EnnnJJJww3\nnnnDD!UWWW\\|AhTT@l,$'ömpf&Vvv‚T8qžy `.jL=q3ʅ|8fa4 233l6@PVVWWW7:dN'VkMM}|>lyyO{f0ƛf>VS&677GFFj999555 c>ᅦo;x *..KΝ/㯜{׃^5[H((B>s1" pP5̼.M7ڵ<˘'`N8~iY~㛇;L (4D"d3,UoWD{r}`I.^?wQ=ѣG.8X믷s{Amz 8.h4448qfS*---ADFF: P(=5&C,'''R(H ydNNΝ"w+XaR8q^z ezYv^݁K[RTVV6kZ >ߒ{ 6dlPy?̐fskk}7̟+VNjdIĉ tww+3frW(κ|>?((h: #&&&33htFAP[Ͱh45$'Ca!03x0K*RlϦ+S94CO%}#g\pa35իCCC%%%#;/8q^~s%E`\uW&9khX,dÔJeppKttt(&O`0T*Ո]iiiE,\ض aBl&r500Uo|O>IFEb:::N7dBd0Mz^c9NdddAAA}}0X]]̞$ӃDlش RSOu\{-JF|#S/_ =7vJzvӮ.p["x}neeؾ}3f85lի'!#ED4^R BBBLtF."##srr(OjZ[[ r9 wÖ-h44Wpc qmU͍|<:5#)F dVR~ qN'7g+p2u+Æ .3WZVVsL sLsqxV;󓓓ZmccckkkLLL&,Cq1̞ 7=yy~=̛x vRs>wHquSfvcK[2C6ᵢaRС^_'EE. HR&5O d,=zgP*III111YKl6n!&Tz^" b 6m+ᡇ ) z >v\3= ʼ!0IWؕI~e˖Wz .^0-\|;N>LDM~~~*k`Ȗ `ZvFl.Q9`dFF$KQK$z}[[I#?0ػ~] =.[a&hjf>o~$ste_!X>{`{/:TK.dpӯdlIDATgrVȺf[宻^`=2%% #D[N*644L}{.i&+Jc6J%EQr|.FolL&l6jR5f95MII bX}}}L&S l6m6<==Wᢋ`GX**`.L"]\{}>{+2}pߩwSDQ6) :c_\y zN$Iwiڡ1RPPPFFFbbbTTTpp0Ϸ'/ @x<488`0BaHHHHHHmmmyM{aزK`yAf#WUkmYmK4^ { I~{t noot@iAn.Cp-p!9mvrzhS~aŚ)8NVV@ 'tqzDr&IR&SgEQg2 5&8Eiiiuu5͞8@JJJbbbQQQ[[@h( ǏÌg̙ѡyǟZyVi D<˳+I}3N  ..)jJeuuSN%H㋋ϵ4Iݓ 3K&`0sd500EQVghhhVVVgggyy3f@^99[TT4"`UU+KqIiKJ;??>7uoʑOO 1ӧOwP 6KҘ(jhhd2[հZ:fmjtA$9JeVU  T;|~vvvEEE]]ݩ~Bj f\~/QQ+*++e(b;95tHri󣣣œ;P&555?~<""B.3LrMgX4įœ'fJJJ, AF1 `ĢT*UQQL&jA0L&)u:pbMT*UJJ9Of8hjj2L999$IlT7HHP(Z[[LJx|>^Z \p⺪*c㈢dXlX$I  @ 殊ۯҾFs^&)55= aC {ߘs_xd^o0D+XFZg%ɌFr\.OJJjoo/**JJJ.K.lNg0t:RtzbfJjMJJ`0"""P*'===""B&x}zmmgRaeL&3>>^"Ņa{#;T*.k9RSS],kt:[u AFFFaaa@@YDP'QP__lfiZO,11͞B/000##LVĸsEQ~~~qqqEQh4fXRMf X,g})))obm6Pooorr} p[g!-PcZ]8ёluFb9k6q8gIt `$I3S0z bM6---uyN8: &KfJBy `M-~~~YYYrʥ* 1:"No$3 FQTooK]Bh* 5k-((hii/yMMM#>yBPDGGz8BSɌ,((`5P(F5d/1.]0!4xR'fX555sr-0hFOaX,jԹ)>oϦى`0! (((77W$655MFNV777O&UL&c0[-ΐѝa|>WvuV__x`02Ój7440.٬M60 }^w\(L7~s8ҝP(X,<oM_DIIIGGw>4bqS1*j̇oZ===c ={^oH$ 9>?͂FNjZZP.o;8H$c0jZR sXOQTGG,P`0/_^^^G^bg KS'Y{WPP`9_XvL5t5=?lxHQe*}*MNeݏO\"!78OXt$!Z U27̝Mֆ7 Y+^dl\~EQ_7+X~|[ܿiha{룥dĵ4ʒoMf>Wi(Zޖcv^t^uYj0wk«8 )9O)xxs,+ZK39l{wq+kǿVɅ>tUm^c b&,绵9lѵQlSc,UrM+Sű7@j NT :U 2,;UK[Wql"aT4JUk6p;I_bC %`hҍ[ vy瀝gٮkWur*k_X gz=Ϸ^ˉ_[ge.?@yʜx/ t?X3=Mu޽:n~S >ip:0HܾIP<'_ j<ӈ;w&bە$ܳɟbns3r|#*,Z>X\9`]}d$cbIsÀ#( iIWmG3EUKxk6!'h~{Eۏ~ܚ͟P?mʗjz=/cHO)R~;5 [?9 \M^Үmxs> 6M ~؅</. AC_|dΎ62HܞxW B-0\qCا6R}< DEW0(0>횫D 8;BS0:8"Rfhx(17`bHFmz P4,$P\0܏)(eWux 5?"ѩHb1~-SDS0܏9g/ͧ6뮠̉~+\vlG0jG./+B^ q ~tŖ;^1:˯Wۣ¦y\븿[W|t#ˢ~~cdP4E᭏'/|Wvٸb |O,y?_lJ:Jw澈/>u I|CSAQ!z0#K-aX^kƁ/fyhy Rk7YЭ7E#V\7*>[0PO{w^5CR!G MeB!% `!h B!ZB0!% `!h B!ZB0!% `!h B!ZB0!% `!h B!ZB0!% `!h B!ZBFuv[lIENDB`TSP/README.md0000644000176200001440000001702215111646674012214 0ustar liggesusers # R package TSP - Infrastructure for the Traveling Salesperson Problem [![Package on CRAN](https://www.r-pkg.org/badges/version/TSP)](https://CRAN.R-project.org/package=TSP) [![CRAN RStudio mirror downloads](https://cranlogs.r-pkg.org/badges/TSP)](https://CRAN.R-project.org/package=TSP) ![License](https://img.shields.io/cran/l/TSP) [![r-universe status](https://mhahsler.r-universe.dev/badges/TSP)](https://mhahsler.r-universe.dev/TSP) [![Anaconda.org](https://anaconda.org/conda-forge/r-tsp/badges/version.svg)](https://anaconda.org/conda-forge/r-tsp) ## Introduction The TSP package (Hahsler and Hornik 2007) provides the basic infrastructure and some algorithms for the traveling salesman problems (symmetric, asymmetric and Euclidean TSPs). The package provides some fast implementations of simple algorithms including: - Tour construction heuristics - **insertion algorithms**: nearest insertion, farthest insertion, cheapest insertion, arbitrary insertion (Rosenkrantz, Stearns, and Philip M. Lewis 1977) - **nearest neighbor methods**: Nearest neighbor and repetitive nearest neighbor (Rosenkrantz, Stearns, and Philip M. Lewis 1977) - Improvement methods - **two-opt heuristic** (Croes 1958) - **simulated annealing** (Kirkpatrick, Gelatt, and Vecchi 1983) - State-of-the-art solver - An interface to the **Concorde TSP solver** (Applegate et al. 2000, 2006) and its implementation of the **Chained-Lin-Kernighan heuristic** (Applegate, Cook, and Rohe 2003) is provided (needs to be installed separately). The package can read and write the TSPLIB format (Reinelt 1991) and it can solve many of the problems in the [TSPLIB95 problem library (local copy of the archive)](https://github.com/mhahsler/TSP/tree/master/TSPLIB95). The following R packages use `TSP`: [archetypes](https://CRAN.R-project.org/package=archetypes), [cholera](https://CRAN.R-project.org/package=cholera), [condvis](https://CRAN.R-project.org/package=condvis), [CRTspat](https://CRAN.R-project.org/package=CRTspat), [ForagingOrg](https://CRAN.R-project.org/package=ForagingOrg), [ggEDA](https://CRAN.R-project.org/package=ggEDA), [isocir](https://CRAN.R-project.org/package=isocir), [jocre](https://CRAN.R-project.org/package=jocre), [MLCOPULA](https://CRAN.R-project.org/package=MLCOPULA), [nilde](https://CRAN.R-project.org/package=nilde), [nlnet](https://CRAN.R-project.org/package=nlnet), [PairViz](https://CRAN.R-project.org/package=PairViz), [pencopulaCond](https://CRAN.R-project.org/package=pencopulaCond), [SCORPIUS](https://CRAN.R-project.org/package=SCORPIUS), [sensitivity](https://CRAN.R-project.org/package=sensitivity), [seriation](https://CRAN.R-project.org/package=seriation), [sfnetworks](https://CRAN.R-project.org/package=sfnetworks), [tspmeta](https://CRAN.R-project.org/package=tspmeta), [VineCopula](https://CRAN.R-project.org/package=VineCopula) To cite package ‘TSP’ in publications use: > Hahsler M, Hornik K (2007). “TSP - Infrastructure for the traveling > salesperson problem.” *Journal of Statistical Software*, *23*(2), > 1-21. ISSN 1548-7660, > . @Article{, title = {TSP -- {I}nfrastructure for the traveling salesperson problem}, author = {Michael Hahsler and Kurt Hornik}, year = {2007}, journal = {Journal of Statistical Software}, volume = {23}, number = {2}, pages = {1--21}, doi = {10.18637/jss.v023.i02}, month = {December}, issn = {1548-7660}, } ## Installation **Stable CRAN version:** Install from within R with ``` r install.packages("TSP") ``` **Current development version:** Install from [r-universe.](https://mhahsler.r-universe.dev/TSP) ``` r install.packages("TSP", repos = c("https://mhahsler.r-universe.dev", "https://cloud.r-project.org/")) ``` ## Usage Load a data set with 312 cities (USA and Canada) and create a TSP object. ``` r library("TSP") data("USCA312") tsp <- TSP(USCA312) tsp ``` ## object of class 'TSP' ## 312 cities (distance 'euclidean') Find a tour using the default heuristic. ``` r tour <- solve_TSP(tsp) tour ``` ## object of class 'TOUR' ## result of method 'arbitrary_insertion+two_opt' for 312 cities ## tour length: 41941 Show the first few cities in the tour. ``` r head(tour, n = 10) ``` ## Winston-Salem, NC Charlotte, NC Asheville, NC Greenville, SC ## 306 54 10 110 ## Spartanburg, NC Augusta, GA Columbia, SC Charleston, SC ## 260 14 64 52 ## Savannah, GA Jacksonville, FL ## 250 127 Visualize the complete tour. ``` r library(maps) data("USCA312_GPS") plot((USCA312_GPS[, c("long", "lat")]), cex = 0.3) map("world", col = "gray", add = TRUE) polygon(USCA312_GPS[, c("long", "lat")][tour, ], border = "red") ``` ![](inst/README_files/unnamed-chunk-6-1.png) An online example application of TSP can be found on [shinyapps](https://shrinidhee.shinyapps.io/SimpleTSP). ## Help and Bug Reports You can find Q&A’s and ask your own questions at Please submit bug reports to ## References

Applegate, David, Robert E. Bixby, Vasek Chvátal, and William Cook. 2000. “TSP Cuts Which Do Not Conform to the Template Paradigm.” In *Computational Combinatorial Optimization, Optimal or Provably Near-Optimal Solutions*, edited by M. Junger and D. Naddef, 2241:261–304. Lecture Notes in Computer Science. London, UK: Springer-Verlag. .
Applegate, David, Robert Bixby, Vasek Chvátal, and William Cook. 2006. *Concorde TSP Solver*. .
Applegate, David, William Cook, and Andre Rohe. 2003. “Chained Lin-Kernighan for Large Traveling Salesman Problems.” *INFORMS Journal on Computing* 15 (1): 82–92. .
Croes, G. A. 1958. “A Method for Solving Traveling-Salesman Problems.” *Operations Research* 6 (6): 791–812. .
Hahsler, Michael, and Kurt Hornik. 2007. “TSP – Infrastructure for the Traveling Salesperson Problem.” *Journal of Statistical Software* 23 (2): 1–21. .
Kirkpatrick, S., C. D. Gelatt, and M. P. Vecchi. 1983. “Optimization by Simulated Annealing.” *Science* 220 (4598): 671–80. .
Reinelt, Gerhard. 1991. “TSPLIB—a Traveling Salesman Problem Library.” *ORSA Journal on Computing* 3 (4): 376–84. .
Rosenkrantz, Daniel J., Richard E. Stearns, and II Philip M. Lewis. 1977. “An Analysis of Several Heuristics for the Traveling Salesman Problem.” *SIAM Journal on Computing* 6 (3): 563–81. .
TSP/build/0000755000176200001440000000000015111650532012016 5ustar liggesusersTSP/build/vignette.rds0000644000176200001440000000031115111650532014350 0ustar liggesusersb```b`aeb`b2 1# 'f  +G+)O)M.S(W*æ % Ml ba DX%Z]?4-ީE0=(jؠjX2sR,s\ܠL t7`~΢r=xA$Gs=ʕXVr7&YTSP/build/partial.rdb0000644000176200001440000000007515111650526014150 0ustar liggesusersb```b`aeb`b1 H020piּb C"F$7TSP/man/0000755000176200001440000000000015001730346011472 5ustar liggesusersTSP/man/ATSP.Rd0000644000176200001440000000433315001730346012533 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ATSP.R \name{ATSP} \alias{ATSP} \alias{as.ATSP} \alias{as.ATSP.matrix} \alias{as.ATSP.dist} \alias{print.ATSP} \alias{n_of_cities.ATSP} \alias{labels.ATSP} \alias{image.ATSP} \alias{as.matrix.ATSP} \title{Class ATSP -- Asymmetric traveling salesperson problem} \usage{ ATSP(x, labels = NULL, method = NULL) as.ATSP(x) \method{as.ATSP}{matrix}(x) \method{as.ATSP}{dist}(x) \method{print}{ATSP}(x, ...) \method{n_of_cities}{ATSP}(x) \method{labels}{ATSP}(object, ...) \method{image}{ATSP}(x, order, col = gray.colors(64), ...) \method{as.matrix}{ATSP}(x, ...) } \arguments{ \item{x, object}{an object (a square matrix) to be converted into an \code{ATSP} or, for the methods, an object of class \code{ATSP}.} \item{labels}{optional city labels. If not given, labels are taken from \code{x}.} \item{method}{optional name of the distance metric.} \item{...}{further arguments are passed on.} \item{order}{order of cities as an integer vector or an object of class \code{TOUR}.} \item{col}{color scheme for image.} } \value{ \itemize{ \item \code{ATSP()} returns \code{x} as an object of class \code{ATSP}. \item \code{n_of_cities()} returns the number of cities in \code{x}. \item \code{labels()} returns a vector with the names of the cities in \code{x}. } } \description{ Constructor to create an instance of the asymmetric traveling salesperson problem (ATSP) and some auxiliary methods. } \details{ Objects of class \code{ATSP} are internally represented by a matrix (use \code{as.matrix()} to get just the matrix). ATSPs can be transformed into (larger) symmetric TSPs using \code{\link[=reformulate_ATSP_as_TSP]{reformulate_ATSP_as_TSP()}}. } \examples{ data <- matrix(runif(10^2), ncol = 10, dimnames = list(1:10, 1:10)) atsp <- ATSP(data) atsp ## use some methods n_of_cities(atsp) labels(atsp) ## calculate a tour tour <- solve_TSP(atsp, method = "nn") tour tour_length(tour) image(atsp, tour) } \seealso{ Other TSP: \code{\link{Concorde}}, \code{\link{ETSP}()}, \code{\link{TSP}()}, \code{\link{TSPLIB}}, \code{\link{insert_dummy}()}, \code{\link{reformulate_ATSP_as_TSP}()}, \code{\link{solve_TSP}()} } \author{ Michael Hahsler } \concept{TSP} \keyword{classes} TSP/man/cut_tour.Rd0000644000176200001440000000256015001730346013630 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/cut_tour.R \name{cut_tour} \alias{cut_tour} \alias{cut_tour.TOUR} \title{Cut a tour to form a path} \usage{ cut_tour(x, cut, exclude_cut = TRUE) \method{cut_tour}{TOUR}(x, cut, exclude_cut = TRUE) } \arguments{ \item{x}{an object of class \link{TOUR}.} \item{cut}{the index or label of the city/cities to cut the tour.} \item{exclude_cut}{exclude the city where we cut? If \code{FALSE}, the city at the cut is included in the path as the first city.} } \value{ Returns a named vector with city ids forming the path. If multiple cuts are used then a list with paths is returned. } \description{ Cuts a tour at a specified city to form a path. } \examples{ data("USCA50") ## find a path starting at Austin, TX tour <- solve_TSP(USCA50) path <- cut_tour(tour, cut = "Austin, TX", exclude_cut = FALSE) path ## cut the tours at two cities tour <- solve_TSP(USCA50) path <- cut_tour(tour, cut = c("Austin, TX", "Cambridge, MA"), exclude_cut = FALSE) path ## cut a tour at the largest gap using a dummy city tsp <- insert_dummy(USCA50, label = "cut") tour <- solve_TSP(tsp) ## cut tour into path at the dummy city path <- cut_tour(tour, "cut") path } \seealso{ Other TOUR: \code{\link{TOUR}()}, \code{\link{solve_TSP}()}, \code{\link{tour_length}()} } \author{ Michael Hahsler } \concept{TOUR} \keyword{optimize} TSP/man/TSP.Rd0000644000176200001440000000461115001730346012431 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/TSP.R \name{TSP} \alias{TSP} \alias{as.TSP} \alias{as.TSP.dist} \alias{as.TSP.matrix} \alias{as.dist.TSP} \alias{print.TSP} \alias{n_of_cities} \alias{n_of_cities.TSP} \alias{labels.TSP} \alias{image.TSP} \title{Class TSP -- Symmetric traveling salesperson problem} \usage{ TSP(x, labels = NULL, method = NULL) as.TSP(x) \method{as.TSP}{dist}(x) \method{as.TSP}{matrix}(x) \method{as.dist}{TSP}(m, ...) \method{print}{TSP}(x, ...) n_of_cities(x) \method{n_of_cities}{TSP}(x) \method{labels}{TSP}(object, ...) \method{image}{TSP}(x, order, col = gray.colors(64), ...) } \arguments{ \item{x, object}{an object (currently \code{dist} or a symmetric matrix) to be converted into a \code{TSP} or, for the methods, an object of class \code{TSP}.} \item{labels}{optional city labels. If not given, labels are taken from \code{x}.} \item{method}{optional name of the distance metric. If \code{x} is a \code{dist} object, then the method is taken from that object.} \item{m}{a TSP object to be converted to a \link{dist} object.} \item{...}{further arguments are passed on.} \item{order}{order of cities for the image as an integer vector or an object of class \link{TOUR}.} \item{col}{color scheme for image.} } \value{ \itemize{ \item \code{TSP()} returns \code{x} as an object of class \code{TSP}. \item \code{n_of_cities()} returns the number of cities in \code{x}. \item \code{labels()} returns a vector with the names of the cities in \code{x}. } } \description{ Constructor to create an instance of a symmetric traveling salesperson problem (TSP) and some auxiliary methods. } \details{ Objects of class \code{TSP} are internally represented as \code{dist} objects (use \code{\link[=as.dist]{as.dist()}} to get the \code{dist} object). Not permissible paths can be set to a distance of \code{+Inf}. \code{NA}s are not allowed and \code{-Inf} will lead to the algorithm only being able to find an admissible tour, but not the best one. } \examples{ data("iris") d <- dist(iris[-5]) ## create a TSP tsp <- TSP(d) tsp ## use some methods n_of_cities(tsp) labels(tsp) image(tsp) } \seealso{ Other TSP: \code{\link{ATSP}()}, \code{\link{Concorde}}, \code{\link{ETSP}()}, \code{\link{TSPLIB}}, \code{\link{insert_dummy}()}, \code{\link{reformulate_ATSP_as_TSP}()}, \code{\link{solve_TSP}()} } \author{ Michael Hahsler } \concept{TSP} \keyword{classes} TSP/man/insert_dummy.Rd0000644000176200001440000000663315001730346014510 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/insert_dummy.R \name{insert_dummy} \alias{insert_dummy} \alias{insert_dummy.TSP} \alias{insert_dummy.ATSP} \alias{insert_dummy.ETSP} \title{Insert dummy cities into a distance matrix} \usage{ insert_dummy(x, n = 1, const = 0, inf = Inf, label = "dummy") \method{insert_dummy}{TSP}(x, n = 1, const = 0, inf = Inf, label = "dummy") \method{insert_dummy}{ATSP}(x, n = 1, const = 0, inf = Inf, label = "dummy") \method{insert_dummy}{ETSP}(x, n = 1, const = 0, inf = Inf, label = "dummy") } \arguments{ \item{x}{an object with a TSP problem.} \item{n}{number of dummy cities.} \item{const}{distance of the dummy cities to all other cities.} \item{inf}{distance between dummy cities.} \item{label}{labels for the dummy cities. If only one label is given, it is reused for all dummy cities.} } \value{ returns an object of the same class as \code{x}. } \description{ Inserts dummy cities into a TSP problem. A dummy city has the same, constant distance (0) to all other cities and is infinitely far from other dummy cities. A dummy city can be used to transform a shortest Hamiltonian path problem (i.e., finding an optimal linear order) into a shortest Hamiltonian cycle problem which can be solved by a TSP solvers (Garfinkel 1985). } \details{ Several dummy cities can be used together with a TSP solvers to perform rearrangement clustering (Climer and Zhang 2006). The dummy cities are inserted after the other cities in \code{x}. A \code{const} of 0 is guaranteed to work if the TSP finds the optimal solution. For heuristics returning suboptimal solutions, a higher \code{const} (e.g., \code{2 * max(x)}) might provide better results. } \examples{ ## Example 1: Find a short Hamiltonian path set.seed(1000) x <- data.frame(x = runif(20), y = runif(20), row.names = LETTERS[1:20]) tsp <- TSP(dist(x)) ## add a dummy city to cut the tour into a path tsp <- insert_dummy(tsp, label = "cut") tour <- solve_TSP(tsp) tour plot(x) lines(x[cut_tour(tour, cut = "cut"),]) ## Example 2: Rearrangement clustering of the iris dataset set.seed(1000) data("iris") tsp <- TSP(dist(iris[-5])) ## insert 2 dummy cities to creates 2 clusters tsp_dummy <- insert_dummy(tsp, n = 3, label = "boundary") ## get a solution for the TSP tour <- solve_TSP(tsp_dummy) ## plot the reordered distance matrix with the dummy cities as lines separating ## the clusters image(tsp_dummy, tour) abline(h = which(labels(tour)=="boundary"), col = "red") abline(v = which(labels(tour)=="boundary"), col = "red") ## plot the original data with paths connecting the points in each cluster plot(iris[,c(2,3)], col = iris[,5]) paths <- cut_tour(tour, cut = "boundary") for(p in paths) lines(iris[p, c(2,3)]) ## Note: The clustering is not perfect! } \references{ Sharlee Climer, Weixiong Zhang (2006): Rearrangement Clustering: Pitfalls, Remedies, and Applications, \emph{Journal of Machine Learning Research} \bold{7}(Jun), pp. 919--943. R.S. Garfinkel (1985): Motivation and modelling (chapter 2). In: E. L. Lawler, J. K. Lenstra, A.H.G. Rinnooy Kan, D. B. Shmoys (eds.) The traveling salesman problem - A guided tour of combinatorial optimization, Wiley & Sons. } \seealso{ Other TSP: \code{\link{ATSP}()}, \code{\link{Concorde}}, \code{\link{ETSP}()}, \code{\link{TSP}()}, \code{\link{TSPLIB}}, \code{\link{reformulate_ATSP_as_TSP}()}, \code{\link{solve_TSP}()} } \author{ Michael Hahsler } \concept{TSP} \keyword{manip} TSP/man/reformulate_ATSP_as_TSP.Rd0000644000176200001440000001026515001730346016352 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reformulare_ATSP_as_TSP.R \name{reformulate_ATSP_as_TSP} \alias{reformulate_ATSP_as_TSP} \alias{filter_ATSP_as_TSP_dummies} \title{Reformulate a ATSP as a symmetric TSP} \usage{ reformulate_ATSP_as_TSP(x, infeasible = Inf, cheap = -Inf) filter_ATSP_as_TSP_dummies(tour, atsp) } \arguments{ \item{x}{an \link{ATSP}.} \item{infeasible}{value for infeasible connections.} \item{cheap}{value for distance between a city and its corresponding dummy city.} \item{tour}{a \link{TOUR} created for a ATSP reformulated as a TSP.} \item{atsp}{the original \link{ATSP}.} } \value{ \code{reformulate_ATSP_as_TSP()} returns a \link{TSP} object. \code{filter_ATSP_as_TSP_dummies()} returns a \link{TOUR} object. } \description{ A ATSP can be formulated as a symmetric TSP by doubling the number of cities (Jonker and Volgenant 1983). The solution of the TSP also represents the solution of the original ATSP. } \details{ To reformulate a \link{ATSP} as a \link{TSP}, for each city a dummy city (e.g, for 'New York' a dummy city 'New York*') is added. Between each city and its corresponding dummy city a very small (or negative) distance with value \code{cheap} is used. To ensure that the solver places each cities always occurs in the solution together with its dummy city, this cost has to be much smaller than the distances in the TSP. The original distances are used between the cities and the dummy cities, where each city is responsible for the distance going to the city and the dummy city is responsible for the distance coming from the city. The distances between all cities and the distances between all dummy cities are set to \code{infeasible}, a very large value which prevents the solver from using these links. We use infinite values here and \code{\link[=solve_TSP]{solve_TSP()}} treats them appropriately. \code{filter_ATSP_as_TSP_dummies()} can be used to extract the solution for the original ATSP from the tour found for an ATSP reformulated as a TSP. Note that the symmetric TSP tour does not reveal the direction for the ATSP. The filter function computed the tour length for both directions and returns the shorter tour. \code{\link[=solve_TSP]{solve_TSP()}} has a parameter \code{as_TSP} which preforms the reformulation and filtering the dummy cities automatically. \strong{Note on performance:} Doubling the problem size is a performance issue especially has a negative impact on solution quality for heuristics. It should only be used together with Concorde when the optimal solution is required. Most heuristics can solve ATSPs directly with good solution quality. } \examples{ data("USCA50") ## set the distances from anywhere to Austin to zero which makes it an ATSP austin <- which(labels(USCA50) == "Austin, TX") atsp <- as.ATSP(USCA50) atsp[, austin] <- 0 atsp ## reformulate as a TSP (by doubling the number of cities with dummy cities marked with *) tsp <- reformulate_ATSP_as_TSP(atsp) tsp ## create tour for the TSP. You should use Concorde to find the optimal solution. # tour_tsp <- solve_TSP(tsp, method = "concorde") # The standard heuristic is bad for this problem. We use it here because # Concord may not be installed. tour_tsp <- solve_TSP(tsp) head(labels(tour_tsp), n = 10) tour_tsp # The tour length is -Inf since it includes cheap links # from a city to its dummy city. ## get the solution for the original ATSP by filtering out the dummy cities. tour_atsp <- filter_ATSP_as_TSP_dummies(tour_tsp, atsp = atsp) tour_atsp head(labels(tour_atsp), n = 10) ## This process can also be done automatically by using as_TSP = TRUE: # solve_TSP(atsp, method = "concorde", as_TSP = TRUE) ## The default heuristic can directly solve ATSPs with results close to the # optimal solution of 12715. solve_TSP(atsp, control = list(rep = 10)) } \references{ Jonker, R. and Volgenant, T. (1983): Transforming asymmetric into symmetric traveling salesman problems, \emph{Operations Research Letters,} 2, 161--163. } \seealso{ Other TSP: \code{\link{ATSP}()}, \code{\link{Concorde}}, \code{\link{ETSP}()}, \code{\link{TSP}()}, \code{\link{TSPLIB}}, \code{\link{insert_dummy}()}, \code{\link{solve_TSP}()} } \author{ Michael Hahsler } \concept{TSP} \keyword{optimize} TSP/man/Concorde.Rd0000644000176200001440000001024715111643625013526 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tsp_concorde.R \name{Concorde} \alias{Concorde} \alias{concorde} \alias{concorde_path} \alias{concorde_help} \alias{linkern_help} \title{Using the Concorde TSP Solver} \usage{ concorde_path(path) concorde_help() linkern_help() } \arguments{ \item{path}{a character string with the path to the directory where the executables are installed.} } \value{ \code{concorde_path()} returns the path to the executable. Others functions: Nothing. } \description{ The Concorde TSP Solver package contains several solvers. Currently, interfaces to the Concorde solver (Applegate et al. 2001), one of the most advanced and fastest TSP solvers using branch-and-cut, and the Chained Lin-Kernighan (Applegate et al. 2003) implementation are provided in \pkg{TSP}. Concorde can solve \link{TSP}s and \link{ETSP}s directly. \link{ATSP}s are reformulated as larger TSP's and then solved. } \section{Installation of Concorde}{ The Concorde TSP Solver is freely available for academic research. It is not included in the \pkg{TSP} R package and has to be obtained separately from the \href{https://www.math.uwaterloo.ca/tsp/concorde/downloads/downloads.htm}{Concorde download page}. Either download the precompiled executables and place them in a suitable directory (make sure they are executable), or you can get the source code and compile the program on your own. \pkg{TSP} needs to know where the executables are. There are two options: \enumerate{ \item use \code{concorde_path()} to set the path to the directory containing the executables for concorde and linkern, or \item make sure that the executables are in the search path stored in the \code{PATH} environment variable (see \code{\link[=Sys.setenv]{Sys.setenv()}}). } } \section{Using Concorde for \code{solve_TSP()}}{ \code{\link[=solve_TSP]{solve_TSP()}} uses \code{\link[=write_TSPLIB]{write_TSPLIB()}} to write the TSP for Concorde and tries to find the appropriate \code{precision} value (digits after the decimal point) to convert the provided distances into the needed integer value range. The \code{precision} value can also be specified in \code{control} in \code{\link[=solve_TSP]{solve_TSP()}} with method Concorde. Warning messages will alert the user if the conversion to integer values results into rounding errors that are worse then what is specified in the \code{precision} control parameter. To get a list of all available command line options which can be used via the \code{clo} option for \code{solve_TSP} use \code{concorde_help()} and \code{linkern_help()}. Several options (\option{-x}, \option{-o}, \option{-N}, \option{-Q}) are not available via \code{\link[=solve_TSP]{solve_TSP()}} since they are used by the interface. If Concorde takes too long, then you can interrupt \code{\link[=solve_TSP]{solve_TSP()}} using \code{Esc/CTRL-C}. On most operating systems, this will also terminate the Concorde executable. If Concorde keeps running, then you can kill the 'concorde' process via your operating system. } \examples{ \dontrun{ ## see if Concorde is correctly installed concorde_path() ## set path to the Concorde executible if it is not in the search PATH ## Example: ## concorde_path("~/concorde/") concorde_help() data("USCA312") ## run Concorde in verbose mode (-v) with fast cuts only (-V) ## Note: use the contol parameter verbose = FALSE to supress Concorde's output solve_TSP(USCA312, method = "concorde", control = list(clo = "-v -V")) } } \references{ Concorde home page, \url{https://www.math.uwaterloo.ca/tsp/concorde/} David Applegate, Robert Bixby, Vasek Chvatal, William Cook (2001): TSP cuts which do not conform to the template paradigm, Computational Combinatorial Optimization, M. Junger and D. Naddef (editors), Springer-Verlag. David Applegate and William Cook and Andre Rohe (2003): Chained Lin-Kernighan for Large Traveling Salesman Problems, \emph{INFORMS Journal on Computing}, \bold{15}, 82--92. } \seealso{ Other TSP: \code{\link{ATSP}()}, \code{\link{ETSP}()}, \code{\link{TSP}()}, \code{\link{TSPLIB}}, \code{\link{insert_dummy}()}, \code{\link{reformulate_ATSP_as_TSP}()}, \code{\link{solve_TSP}()} } \author{ Michael Hahsler } \concept{TSP} \keyword{documentation} TSP/man/TSP-package.Rd0000644000176200001440000000223315045517642014032 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/AAA_TSP-package.R \docType{package} \name{TSP-package} \alias{TSP-package} \title{TSP: Infrastructure for the Traveling Salesperson Problem} \description{ Basic infrastructure and some algorithms for the traveling salesperson problem (also traveling salesman problem; TSP). The package provides some simple algorithms and an interface to the Concorde TSP solver and its implementation of the Chained-Lin-Kernighan heuristic. The code for Concorde itself is not included in the package and has to be obtained separately. Hahsler and Hornik (2007) \doi{10.18637/jss.v023.i02}. } \section{Key functions}{ \itemize{ \item \code{\link[=solve_TSP]{solve_TSP()}} } } \seealso{ Useful links: \itemize{ \item \url{https://github.com/mhahsler/TSP} \item Report bugs at \url{https://github.com/mhahsler/TSP/issues} } } \author{ \strong{Maintainer}: Michael Hahsler \email{mhahsler@lyle.smu.edu} (\href{https://orcid.org/0000-0003-2716-1405}{ORCID}) [copyright holder] Authors: \itemize{ \item Kurt Hornik (\href{https://orcid.org/0000-0003-4198-9911}{ORCID}) [copyright holder] } } \keyword{internal} TSP/man/ETSP.Rd0000644000176200001440000000472515001730346012544 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ETSP.R \name{ETSP} \alias{ETSP} \alias{as.ETSP} \alias{as.ETSP.matrix} \alias{as.ETSP.data.frame} \alias{as.TSP.ETSP} \alias{as.matrix.ETSP} \alias{print.ETSP} \alias{n_of_cities.ETSP} \alias{labels.ETSP} \alias{image.ETSP} \alias{plot.ETSP} \title{Class ETSP -- Euclidean traveling salesperson problem} \usage{ ETSP(x, labels = NULL) as.ETSP(x) \method{as.ETSP}{matrix}(x) \method{as.ETSP}{data.frame}(x) \method{as.TSP}{ETSP}(x) \method{as.matrix}{ETSP}(x, ...) \method{print}{ETSP}(x, ...) \method{n_of_cities}{ETSP}(x) \method{labels}{ETSP}(object, ...) \method{image}{ETSP}(x, order, col = gray.colors(64), ...) \method{plot}{ETSP}(x, y = NULL, tour = NULL, tour_lty = 2, tour_col = 2, labels = TRUE, ...) } \arguments{ \item{x, object}{an object (data.frame or matrix) to be converted into a \code{ETSP} or, for the methods, an object of class \code{ETSP}.} \item{labels}{logical; plot city labels.} \item{...}{further arguments are passed on.} \item{order}{order of cities for the image as an integer vector or an object of class \link{TOUR}.} \item{col}{color scheme for image.} \item{tour, y}{a tour to be visualized.} \item{tour_lty, tour_col}{line type and color for tour.} } \value{ \itemize{ \item \code{ETSP()} returns \code{x} as an object of class \code{ETSP}. \item \code{n_of_cities()} returns the number of cities in \code{x}. \item \code{labels()} returns a vector with the names of the cities in \code{x}. } } \description{ Constructor to create an instance of a Euclidean traveling salesperson problem (TSP) represented by city coordinates and some auxiliary methods. } \details{ Objects of class \code{ETSP} are internally represented as a \code{matrix} objects (use \code{as.matrix()} to get the \code{matrix} object). } \examples{ ## create a random ETSP n <- 20 x <- data.frame(x = runif(n), y = runif(n), row.names = LETTERS[1:n]) etsp <- ETSP(x) etsp ## use some methods n_of_cities(etsp) labels(etsp) ## plot ETSP and solution tour <- solve_TSP(etsp) tour plot(etsp, tour, tour_col = "red") # plot with custom labels plot(etsp, tour, tour_col = "red", labels = FALSE) text(etsp, paste("City", rownames(etsp)), pos = 1) } \seealso{ Other TSP: \code{\link{ATSP}()}, \code{\link{Concorde}}, \code{\link{TSP}()}, \code{\link{TSPLIB}}, \code{\link{insert_dummy}()}, \code{\link{reformulate_ATSP_as_TSP}()}, \code{\link{solve_TSP}()} } \author{ Michael Hahsler } \concept{TSP} \keyword{classes} TSP/man/TSPLIB.Rd0000644000176200001440000000651315111646665012777 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/TSPLIB.R \name{TSPLIB} \alias{TSPLIB} \alias{read_TSPLIB} \alias{write_TSPLIB} \alias{write_TSPLIB.TSP} \alias{write_TSPLIB.ATSP} \alias{write_TSPLIB.ETSP} \title{Read and write TSPLIB files} \usage{ read_TSPLIB(file, precision = 0) write_TSPLIB(x, file, precision = 6, inf = NULL, neg_inf = NULL) \method{write_TSPLIB}{TSP}(x, file, precision = 6, inf = NULL, neg_inf = NULL) \method{write_TSPLIB}{ATSP}(x, file, precision = 6, inf = NULL, neg_inf = NULL) \method{write_TSPLIB}{ETSP}(x, file, precision = 6, inf = NULL, neg_inf = NULL) } \arguments{ \item{file}{file name or a \link{connection}.} \item{precision}{controls the number of decimal places used to represent distances (see details). If \code{x} already is \code{integer}, this argument is ignored and \code{x} is used as is.} \item{x}{an object with a TSP problem. \code{NA}s are not allowed.} \item{inf}{replacement value for \code{Inf} (TSPLIB format cannot handle \code{Inf}). If \code{inf} is \code{NULL}, a large value of \eqn{max(x) + 2 range(x)} (ignoring infinite entries) is used.} \item{neg_inf}{replacement value for \code{-Inf}. If no value is specified, a small value of \eqn{min(x) - 2 range(x)} (ignoring infinite entries) is used.} } \value{ returns an object of class \code{TSP} or \code{ATSP}. } \description{ Reads and writes TSPLIB format files. TSPLIB files can be used by most TSP solvers. Many problems in TSPLIB format can be found in the local copy of the \href{https://github.com/mhahsler/TSP/tree/master/TSPLIB95}{TSPLIB95 problem library}. } \details{ In the TSPLIB format distances are represented by integer values. Therefore, if \code{x} contains \code{double} values (which is normal in R) the values given in \code{x} are multiplied by \eqn{10^{precision}} before coercion to \code{integer}. Note that therefore all results produced by programs using the TSPLIB file as input need to be divided by \eqn{10^{precision}} (i.e., the decimal point has to be shifted \code{precision} placed to the left). Currently only the following \code{EDGE_WEIGHT_TYPE}s are implemented: \code{EXPLICIT}, \code{EUC_2D} and \code{EUC_3D}. } \examples{ ## Drilling problem from TSP drill <- read_TSPLIB(system.file("examples/d493.tsp", package = "TSP")) drill tour <- solve_TSP(drill, method = "nn", two_opt = TRUE) tour plot(drill, tour, cex=.6, col = "red", pch= 3, main = "TSPLIB: d493") ## Write and read data in TSPLIB format x <- data.frame(x=runif(5), y=runif(5)) ## create TSP, ATSP and ETSP (2D) tsp <- TSP(dist(x)) atsp <- ATSP(dist(x)) etsp <- ETSP(x[,1:2]) write_TSPLIB(tsp, file="example.tsp") #file.show("example.tsp") r <- read_TSPLIB("example.tsp") r write_TSPLIB(atsp, file="example.tsp") #file.show("example.tsp") r <- read_TSPLIB("example.tsp") r write_TSPLIB(etsp, file="example.tsp") #file.show("example.tsp") r <- read_TSPLIB("example.tsp") r ## clean up unlink("example.tsp") } \references{ Reinelt, Gerhard. 1991. “TSPLIB—a Traveling Salesman Problem Library.” ORSA Journal on Computing 3 (4): 376–84. \doi{10.1287/ijoc.3.4.376} } \seealso{ Other TSP: \code{\link{ATSP}()}, \code{\link{Concorde}}, \code{\link{ETSP}()}, \code{\link{TSP}()}, \code{\link{insert_dummy}()}, \code{\link{reformulate_ATSP_as_TSP}()}, \code{\link{solve_TSP}()} } \author{ Michael Hahsler } \concept{TSP} \keyword{file} TSP/man/figures/0000755000176200001440000000000015001730346013136 5ustar liggesusersTSP/man/figures/logo.svg0000644000176200001440000002054515001730346014625 0ustar liggesusersTSPwith RDiscrete OptimizationTSP/man/TOUR.Rd0000644000176200001440000000406615001730346012560 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/TOUR.R \name{TOUR} \alias{TOUR} \alias{as.TOUR} \alias{as.TOUR.numeric} \alias{as.TOUR.integer} \alias{print.TOUR} \title{Class TOUR -- Solution to a traveling salesperson problem} \usage{ TOUR(x, method = NA, tsp = NULL) as.TOUR(object) \method{as.TOUR}{numeric}(object) \method{as.TOUR}{integer}(object) \method{print}{TOUR}(x, ...) } \arguments{ \item{x}{an integer permutation vector or, for the methods an object of class \link{TOUR}.} \item{method}{character string; method used to create the tour.} \item{tsp}{\code{TSP} object the tour applies to. If available then the tour will include the tour length. Also the labels of the cities will be available in the tour (otherwise the labels of \code{x} are used).} \item{object}{data (an integer vector) which can be coerced to \code{TOUR}.} \item{...}{further arguments are passed on.} } \description{ Class to store the solution of a TSP. Objects of this class are returned by TSP solvers in this package. Essentially, an object of class \code{TOUR} is a permutation vector containing the order of cities to visit. } \details{ Since an object of class \code{TOUR} is an integer vector, it can be subsetted as an ordinary vector or coerced to an integer vector using \code{as.integer()}. It also contains the names of the objects as labels. Additionally, \code{TOUR} has the following attributes: \code{"method"}, \code{"tour_length"}. For most functions, e.g., \code{\link[=tour_length]{tour_length()}} or \code{\link[=image.TSP]{image.TSP()}}, the \code{TSP/ATSP} object used to find the tour is still needed, since the tour does not contain the distance information. } \examples{ TOUR(1:10) ## calculate a tour data("USCA50") tour <- solve_TSP(USCA50) tour ## get tour length directly from tour tour_length(tour) ## get permutation vector as.integer(tour) ## show labels labels(tour) } \seealso{ Other TOUR: \code{\link{cut_tour}()}, \code{\link{solve_TSP}()}, \code{\link{tour_length}()} } \author{ Michael Hahsler } \concept{TOUR} \keyword{classes} TSP/man/USCA.Rd0000644000176200001440000000233215001730346012514 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/USCA312.R \docType{data} \name{USCA} \alias{USCA} \alias{USCA312} \alias{USCA312_GPS} \alias{USCA50} \title{USCA312/USCA50 -- 312/50 cities in the US and Canada} \format{ \code{USCA312} and \code{USCA50} are objects of class \code{TSP}. \code{USCA312_GPS} is a data.frame with city name, long and lat. } \source{ John Burkardt, CITIES -- City Distance Datasets, Florida State University, Department of Scientific Computing } \description{ The \code{USCA312} dataset contains the distances between 312 cities in the US and Canada as an object of class \code{TSP}. \code{USCA50} is a subset of \code{USCA312} containing only the first 50 cities. } \details{ The \code{USCA312_GPS} dataset contains the location (long/lat) of the 312 cities. } \examples{ data("USCA312") ## calculate a tour tour <- solve_TSP(USCA312) tour # Visualize the tour if package maps is installed if(require("maps")) { library(maps) data("USCA312_GPS") head(USCA312_GPS) plot((USCA312_GPS[, c("long", "lat")]), cex = .3) map("world", col = "gray", add = TRUE) polygon(USCA312_GPS[, c("long", "lat")][tour,], border = "red") } } \author{ Michael Hahsler } \keyword{datasets} TSP/man/solve_TSP.Rd0000644000176200001440000003036615111632604013647 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/solve_TSP.R \name{solve_TSP} \alias{solve_TSP} \alias{solve_TSP.TSP} \alias{solve_TSP.ATSP} \alias{solve_TSP.ETSP} \title{TSP solver interface} \usage{ solve_TSP(x, method = NULL, control = NULL, ...) \method{solve_TSP}{TSP}(x, method = NULL, control = NULL, ...) \method{solve_TSP}{ATSP}(x, method = NULL, control = NULL, as_TSP = FALSE, ...) \method{solve_TSP}{ETSP}(x, method = NULL, control = NULL, ...) } \arguments{ \item{x}{a TSP problem.} \item{method}{method to solve the TSP (default: "arbitrary insertion" algorithm with two_opt refinement.} \item{control}{a list of arguments passed on to the TSP solver selected by \code{method}.} \item{...}{additional arguments are added to \code{control}.} \item{as_TSP}{should the ATSP reformulated as a TSP for the solver?} } \value{ An object of class \link{TOUR}. } \description{ Common interface to all TSP solvers in this package. } \section{TSP Methods}{ Currently the following methods are available: \itemize{ \item \strong{"identity", "random"} return a tour representing the order in the data (identity order) or a random order. [TSP, ATSP] \item \strong{"nearest_insertion", "farthest_insertion", "cheapest_insertion", "arbitrary_insertion"} Nearest, farthest, cheapest and arbitrary insertion algorithms for a symmetric and asymmetric TSP (Rosenkrantz et al. 1977). [TSP, ATSP] The distances between cities are stored in a distance matrix \eqn{D} with elements \eqn{d(i,j)}. All insertion algorithms start with a tour consisting of an arbitrary city and choose in each step a city \eqn{k} not yet on the tour. This city is inserted into the existing tour between two consecutive cities \eqn{i} and \eqn{j}, such that \deqn{d(i,k) + d(k,j) - d(i,j)} is minimized. The algorithms stops when all cities are on the tour. The nearest insertion algorithm chooses city \eqn{k} in each step as the city which is \emph{nearest} to a city on the tour. For farthest insertion, the city \eqn{k} is chosen in each step as the city which is \emph{farthest} to any city on the tour. Cheapest insertion chooses the city \eqn{k} such that the cost of inserting the new city (i.e., the increase in the tour's length) is minimal. Arbitrary insertion chooses the city \eqn{k} randomly from all cities not yet on the tour. Nearest and cheapest insertion tries to build the tour using cities which fit well into the partial tour constructed so far. The idea behind behind farthest insertion is to link cities far away into the tour fist to establish an outline of the whole tour early. Additional control options: \itemize{ \item "start" index of the first city (default: a random city). } \item \strong{"nn", "repetitive_nn"} Nearest neighbor and repetitive nearest neighbor algorithms for symmetric and asymmetric TSPs (Rosenkrantz et al. 1977). [TSP, ATSP] The algorithm starts with a tour containing a random city. Then the algorithm always adds to the last city on the tour the nearest not yet visited city. The algorithm stops when all cities are on the tour. Repetitive nearest neighbor constructs a nearest neighbor tour for each city as the starting point and returns the shortest tour found. Additional control options: \itemize{ \item "start" index of the first city (default: a random city). } \item \strong{"sa"} Simulated Annealing for TSPs (Kirkpatrick et al, 1983) [TSP, ATSP] A tour refinement method that uses simulated annealing with subtour reversal as local move. The used optimizer is \code{\link[stats:optim]{stats::optim()}} with method \code{"SANN"}. This method is typically a lot slower than \code{"two_opt"} and requires parameter tuning for the cooling schedule. Additional control options: \itemize{ \item "tour" an existing tour which should be improved. If no tour is given, a random tour is used. \item "local_move" a function that creates a local move with the current tour as the first and the TSP as the second parameter. Defaults to randomized subtour reversal. \item "temp" initial temperature. Defaults to the length of the current tour divided by the number of cities. \item "tmax" number of evaluations per temperature step. Default is 10. \item "maxit" number of evaluations. Default is 10000 for speed, but larger values will result in more competitive results. \item "trace" set to 1 to print progress. } See \code{\link[stats:optim]{stats::optim()}} for more details on the parameters. \item \strong{"two_opt"} Two edge exchange improvement procedure (Croes 1958). [TSP, ATSP] This is a tour refinement procedure which systematically exchanges two edges in the graph represented by the distance matrix till no improvements are possible. Exchanging two edges is equal to reversing part of the tour. The resulting tour is called \emph{2-optimal.} This method can be applied to tours created by other methods or used as its own method. In this case improvement starts with a random tour. Additional control options: \itemize{ \item "tour" an existing tour which should be improved. If no tour is given, a random tour is used. \item "two_opt_repetitions" number of times to try two_opt with a different initial random tour (default: 1). } \item \strong{"concorde"} Concorde algorithm (Applegate et al. 2001). [TSP, ETSP] Concorde is an advanced exact TSP solver for \emph{symmetric} TSPs based on branch-and-cut. ATSPs can be solved using \code{\link[=reformulate_ATSP_as_TSP]{reformulate_ATSP_as_TSP()}} done automatically with \code{as_TSP = TRUE}. The program is not included in this package and has to be obtained and installed separately. Additional control options: \itemize{ \item "exe" a character string containing the path to the executable (see \link{Concorde}). \item "clo" a character string containing command line options for Concorde, e.g., \code{control = list(clo = "-B -v")}. See \code{\link[=concorde_help]{concorde_help()}} on how to obtain a complete list of available command line options. \item "precision" an integer which controls the number of decimal places used for the internal representation of distances in Concorde. The values given in \code{x} are multiplied by \eqn{10^{precision}} before being passed on to Concorde. Note that therefore the results produced by Concorde (especially lower and upper bounds) need to be divided by \eqn{10^{precision}} (i.e., the decimal point has to be shifted \code{precision} placed to the left). The interface to Concorde uses \code{\link[=write_TSPLIB]{write_TSPLIB()}}. \item "verbose" logical; \code{FALSE} suppresses the output printed to the terminal. } \item \strong{"linkern"} Concorde's Chained Lin-Kernighan heuristic (Applegate et al. 2003). [TSP, ETSP] The Lin-Kernighan (Lin and Kernighan 1973) heuristic uses variable \eqn{k} edge exchanges to improve an initial tour. The program is not included in this package and has to be obtained and installed separately (see \link{Concorde}). Additional control options: see Concorde above. } } \section{Verbose Operation}{ Most implementations provide verbose output to monitor progress using the logical control parameter "verbose". } \section{Additional refinement and random restarts}{ Most constructive methods also accept the following extra control parameters: \itemize{ \item "two_opt": a logical indicating if two-opt refinement should be performed on the constructed tour. \item "rep": an integer indicating how many replications (random restarts) should be performed. } } \section{Treatment of \code{NA}s and infinite values in \code{x}}{ \link{TSP} and \link{ATSP} need to contain valid distances. \code{NA}s are not allowed. \code{Inf} is allowed and can be used to model the missing edges in incomplete graphs (i.e., the distance between the two objects is infinite) or infeasible connections. Internally, \code{Inf} is replaced by a large value given by \eqn{max(x) + 2 range(x)}. Note that the solution might still place the two objects next to each other (e.g., if \code{x} contains several unconnected subgraphs) which results in a path length of \code{Inf}. \code{-Inf} is replaced by \eqn{min(x) - 2 range(x)} and can be used to encourage the solver to place two objects next to each other. } \section{Parallel execution support}{ All heuristics can be used with the control arguments \code{repetitions} (uses the best from that many repetitions with random starts) and \code{two_opt} (a logical indicating if two_opt refinement should be performed). If several repetitions are done (this includes method \code{"repetitive_nn"}) then \pkg{foreach} is used so they can be performed in parallel on multiple cores/machines. To enable parallel execution an appropriate parallel backend needs to be registered (e.g., load \pkg{doParallel} and register it with \code{\link[doParallel:registerDoParallel]{doParallel::registerDoParallel()}}). } \section{Solving ATSP and ETSP}{ Some solvers (including Concorde) cannot directly solve \link{ATSP} directly. \code{ATSP} can be reformulated as larger \code{TSP} and solved this way. For convenience, \code{solve_TSP()} has an extra argument \code{as_TSP} which can be set to \code{TRUE} to automatically solve the \code{ATSP} reformulated as a \code{TSP} (see \code{\link[=reformulate_ATSP_as_TSP]{reformulate_ATSP_as_TSP()}}). Only methods "concorde" and "linkern" currently solve \link{ETSP}s directly. For all other methods, ETSPs are converted into TSPs by creating a distance matrix and then solved. Note: distance matrices can become very large leading to long memory issues and long computation times. } \examples{ ## solve a simple Euclidean TSP (using the default method) etsp <- ETSP(data.frame(x = runif(20), y = runif(20))) tour <- solve_TSP(etsp) tour tour_length(tour) plot(etsp, tour) ## compare methods data("USCA50") USCA50 methods <- c("identity", "random", "nearest_insertion", "cheapest_insertion", "farthest_insertion", "arbitrary_insertion", "nn", "repetitive_nn", "two_opt", "sa") ## calculate tours tours <- lapply(methods, FUN = function(m) solve_TSP(USCA50, method = m)) names(tours) <- methods ## use the external solver which has to be installed separately \dontrun{ tours$concorde <- solve_TSP(USCA50, method = "concorde") tours$linkern <- solve_TSP(USCA50, method = "linkern") } ## register a parallel backend to perform repetitions in parallel \dontrun{ library(doParallel) registerDoParallel() } ## add some tours using repetition and two_opt refinements tours$'nn+two_opt' <- solve_TSP(USCA50, method = "nn", two_opt = TRUE) tours$'nn+rep_10' <- solve_TSP(USCA50, method = "nn", rep = 10) tours$'nn+two_opt+rep_10' <- solve_TSP(USCA50, method = "nn", two_opt = TRUE, rep = 10) tours$'arbitrary_insertion+two_opt' <- solve_TSP(USCA50) ## show first tour tours[[1]] ## compare tour lengths opt <- 14497 # obtained by Concorde tour_lengths <- c(sort(sapply(tours, tour_length), decreasing = TRUE), optimal = opt) dotchart(tour_lengths / opt * 100 - 100, xlab = "percent excess over optimum") } \references{ David Applegate, Robert Bixby, Vasek Chvatal, William Cook (2001): TSP cuts which do not conform to the template paradigm, Computational Combinatorial Optimization, M. Junger and D. Naddef (editors), Springer.\doi{10.1007/3-540-45586-8_7} D. Applegate, W. Cook and A. Rohe (2003): Chained Lin-Kernighan for Large Traveling Salesman Problems. \emph{INFORMS Journal on Computing}, 15(1):82--92. \doi{10.1287/ijoc.15.1.82.15157} G.A. Croes (1958): A method for solving traveling-salesman problems. \emph{Operations Research}, 6(6):791--812. \doi{10.1287/opre.6.6.791} Kirkpatrick, S., C. D. Gelatt, and M. P. Vecchi (1983): Optimization by Simulated Annealing. \emph{Science} 220 (4598): 671–80 \doi{10.1126/science.220.4598.671} S. Lin and B. Kernighan (1973): An effective heuristic algorithm for the traveling-salesman problem. \emph{Operations Research}, 21(2): 498--516. \doi{10.1287/opre.21.2.498} D.J. Rosenkrantz, R. E. Stearns, and Philip M. Lewis II (1977): An analysis of several heuristics for the traveling salesman problem. \emph{SIAM Journal on Computing}, 6(3):563--581. \doi{10.1007/978-1-4020-9688-4_3} } \seealso{ Other TSP: \code{\link{ATSP}()}, \code{\link{Concorde}}, \code{\link{ETSP}()}, \code{\link{TSP}()}, \code{\link{TSPLIB}}, \code{\link{insert_dummy}()}, \code{\link{reformulate_ATSP_as_TSP}()} Other TOUR: \code{\link{TOUR}()}, \code{\link{cut_tour}()}, \code{\link{tour_length}()} } \author{ Michael Hahsler } \concept{TOUR} \concept{TSP} \keyword{optimize} TSP/man/tour_length.Rd0000644000176200001440000000310015001730346014305 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tour_length.R \name{tour_length} \alias{tour_length} \alias{tour_length.TSP} \alias{tour_length.ATSP} \alias{tour_length.ETSP} \alias{tour_length.TOUR} \alias{tour_length.integer} \title{Calculate the length of a tour} \usage{ tour_length(x, ...) \method{tour_length}{TSP}(x, order, ...) \method{tour_length}{ATSP}(x, order, ...) \method{tour_length}{ETSP}(x, order, ...) \method{tour_length}{TOUR}(x, tsp = NULL, ...) \method{tour_length}{integer}(x, tsp = NULL, ...) } \arguments{ \item{x}{a TSP problem or a \link{TOUR}.} \item{...}{further arguments are currently unused.} \item{order}{an object of class \code{TOUR}} \item{tsp}{as TSP object.} } \description{ Calculate the length of a \link{TOUR} for a \link{TSP}. } \details{ If no \code{tsp} is specified, then the tour length stored in \code{x} as attribute \code{"tour_length"} is returned. If \code{tsp} is given then the tour length is recalculated using the specified TSP problem. If a distance in the tour is infinite, the result is also infinite. If the tour contains positive and negative infinite distances then the method returns \code{NA}. } \examples{ data("USCA50") ## original order tour_length(solve_TSP(USCA50, method="identity")) ## length of a manually created (random) tour tour <- TOUR(sample(seq(n_of_cities(USCA50)))) tour tour_length(tour) tour_length(tour, USCA50) } \seealso{ Other TOUR: \code{\link{TOUR}()}, \code{\link{cut_tour}()}, \code{\link{solve_TSP}()} } \author{ Michael Hahsler } \concept{TOUR} \keyword{optimize} TSP/DESCRIPTION0000644000176200001440000000301115111765531012426 0ustar liggesusersPackage: TSP Type: Package Title: Infrastructure for the Traveling Salesperson Problem Version: 1.2.6 Date: 2025-11-26 Authors@R: c(person("Michael", "Hahsler", role = c("aut", "cre", "cph"), email = "mhahsler@lyle.smu.edu", comment = c(ORCID = "0000-0003-2716-1405")), person("Kurt", "Hornik", role = c("aut", "cph"), comment = c(ORCID = "0000-0003-4198-9911")) ) Description: Basic infrastructure and some algorithms for the traveling salesperson problem (also traveling salesman problem; TSP). The package provides some simple algorithms and an interface to the Concorde TSP solver and its implementation of the Chained-Lin-Kernighan heuristic. The code for Concorde itself is not included in the package and has to be obtained separately. Hahsler and Hornik (2007) . Classification/ACM: G.1.6, G.2.1, G.4 URL: https://github.com/mhahsler/TSP BugReports: https://github.com/mhahsler/TSP/issues Depends: R (>= 3.5.0) Imports: graphics, foreach, utils, stats, grDevices Suggests: maps, doParallel, testthat Encoding: UTF-8 RoxygenNote: 7.3.3 License: GPL-3 Copyright: All code is Copyright (C) Michael Hahsler and Kurt Hornik. NeedsCompilation: yes Packaged: 2025-11-26 19:13:31 UTC; mhahsler Author: Michael Hahsler [aut, cre, cph] (ORCID: ), Kurt Hornik [aut, cph] (ORCID: ) Maintainer: Michael Hahsler Repository: CRAN Date/Publication: 2025-11-27 06:10:33 UTC