pammtools/0000755000176200001440000000000015144617062012273 5ustar liggesuserspammtools/tests/0000755000176200001440000000000015030760333013427 5ustar liggesuserspammtools/tests/testthat/0000755000176200001440000000000015144617062015275 5ustar liggesuserspammtools/tests/testthat/test-tidyverse-S3methods.R0000644000176200001440000000352614222504522022260 0ustar liggesuserscontext("Tidyverse methods for specific classes") test_that("ped class is preserved after dplyr operations", { data("tumor") tumor <- dplyr::slice(tumor, 2:3) ped <- as_ped( data = tumor, formula = Surv(days, status) ~ complications + age, cut = c(0, 100, 400), id = "id") expect_is(filter(ped, id == 1), "ped") expect_is(slice(ped, 1), "ped") expect_is(arrange(ped, desc(id)), "ped") expect_is(select(ped, id), "ped") expect_is(rename(ped, ID = id), "ped") expect_is(mutate(ped, id = id + 1), "ped") expect_is(transmute(ped, id = id + 1), "ped") expect_is(sample_n(ped, 1), "ped") expect_is(sample_frac(ped, 0.5), "ped") expect_is(right_join(distinct(ped, id, interval), ped), "ped") }) test_that("attributes are preserved", { # recurrent events data test_df <- data.frame( id = c(1,1, 2,2,2), tstart = c(0, .5, 0, .8, 1.2), tstop = c(.5, 3, .8, 1.2, 3), status = c(1, 0, 1, 1, 0), enum = c(1, 2, 1, 2, 3), age = c(50, 50, 24, 24, 24)) # GAP timescale gap_df <- as_ped( data = test_df, formula = Surv(tstart, tstop, status)~ enum + age, transition = "enum", id = "id", timescale = "gap") expect_subset(names(attributes(gap_df)), c("names", "row.names", "class", "breaks", "id_var", "intvars", "trafo_args", "time_var")) expect_subset( names(attributes(mutate(gap_df, age = 10))), c("names", "row.names", "class", "breaks", "id_var", "intvars", "trafo_args", "time_var")) expect_subset( names(attributes(group_by(gap_df, id))), c("names", "row.names", "class", "breaks", "id_var", "intvars", "trafo_args", "time_var", "groups")) expect_subset( names(attributes(ungroup(group_by(gap_df, id)))), c("names", "row.names", "class", "breaks", "id_var", "intvars", "trafo_args", "time_var")) }) pammtools/tests/testthat/test-tdc-transform.R0000644000176200001440000001001314761333717021161 0ustar liggesuserscontext("Transformation with TDC") test_that("Concurrent TDC are transformed correctly", { data("pbc", package = "survival") # default case with lag = 0 event_df <- filter(pbc, id %in% 1:3) %>% mutate(status = 1L*(status == 1)) tdc_df <- filter(pbcseq, id %in% 1:3) %>% select(id, day, bili, protime) time <- sort(unique(event_df$time))[1:2] tz <- sort(unique(tdc_df$day)) tz <- tz[tz <= max(time)][-1] expect_error(as_ped( data = list(event_df, tdc_df), formula = Surv(time, status) ~. + concurrent(bili, protime, tz_var = "day"), id = "id"), "No events in data") event_df <- filter(pbc, id %in% 1:3) %>% mutate(status = status == 2) %>% select(id, time, status, trt, age, bili, spiders) ped <- as_ped( data = list(event_df, tdc_df), formula = Surv(time, status) ~. + concurrent(bili, protime, tz_var = "day"), id = "id") expect_equal(unique(ped$tend), c(176, 182, 192, 364, 365, 400, 743, 768, 1012)) expect_equal(ped$bili, c(rep(14.5, 3), rep(21.3, 3), rep(1.1, 2), rep(0.8, 3), rep(1, 3), 1.9, 1.4, rep(1.1, 3), rep(1.5, 3), rep(1.8, 2))) # lag != 0 ped <- as_ped( data = list(event_df, tdc_df), formula = Surv(time, status) ~. + concurrent(bili, protime, tz_var = "day", lag = 10), id = "id") expect_equal( unique(ped$tend), sort(c(time, tz + 10))) expect_equal(ped$bili, c(rep(14.5, 3), rep(21.3, 3), rep(1.1, 2), rep(0.8, 3), rep(1, 3), 1.9, 1.4, rep(1.1, 3), rep(1.5, 3), rep(1.8, 2))) # unequal lags ped <- as_ped( data = list(event_df, tdc_df), formula = Surv(time, status) ~. + concurrent(bili, tz_var = "day", lag = 10) + concurrent(protime, tz_var = "day", lag = 0), id = "id") expect_data_frame(ped, nrows = 40, ncols = 11) expect_equal(sum(ped$ped_status), 2) expect_equal(sort(unique(ped$tend)), sort(unique(c(time, tz, tz+10)))) expect_equal(ped$bili, c(rep(14.5, 5), rep(21.3, 5), rep(1.1, 4), rep(0.8, 5), rep(1, 5), 1.9, rep(1.4, 3), rep(1.1, 5), rep(1.5, 4), rep(1.8, 3))) expect_equal(ped$protime, c(rep(12.2, 4), rep(11.2, 6), rep(10.6, 2), rep(11, 5), rep(11.6, 6), rep(10.6, 2), rep(12, 11), rep(13.3, 4))) # when maxtime is set ped <- as_ped( data = list(event_df, tdc_df), formula = Surv(time, status)~. + concurrent(bili, protime, tz_var = "day"), id = "id", max_time = 1400) expect_equal(unique(ped$tend), sort(c(time, tz, 1400))) expect_equal(ped$bili, c(rep(14.5, 3), rep(21.3, 3), rep(1.1, 2), rep(0.8, 3), rep(1.0, 3), rep(1.9, 2), 1.4, rep(1.1, 3), rep(1.5, 3), rep(1.8, 2))) }) test_that("Covariate matrices are created correctly", { data <- simdf_elra %>% filter(id %in% c(1:2)) time <- 0:2 tz <- data %>% dplyr::pull("tz2") %>% unlist() %>% unique() %>% sort() nz <- length(tz) attr(data, "id_tseq") <- rep(1:3, 2) attr(data, "id_tz_seq") <- rep(1:2, times = c(3, 3)) my_ll_fun <- function(t, tz) ( (t - tz) >= 0 & (t - tz) <= 5) expect_class(my_ll_fun, "function") Tmat <- make_time_mat(data, nz) TEmat <- make_z_mat(data, "tz2", nz) Ltmat <- make_latency_mat(data, tz) LLmat <- make_lag_lead_mat(data, tz, ll_fun = my_ll_fun) expect_equal(dim(Tmat), c(6, 11)) expect_equal(dim(TEmat), c(6, 11)) expect_equal(dim(Ltmat), c(6, 11)) expect_equal(dim(LLmat), c(6, 11)) expect_equal(all(Tmat[1, ] == 0), TRUE) expect_equal(all(Tmat[2, ] == 1), TRUE) expect_equal(all(Tmat[3, ] == 2), TRUE) expect_equal(all(TEmat[, 1] == -5), TRUE) expect_equal(all(TEmat[, 11] == 5), TRUE) expect_equal(Ltmat[1, ], c(5:0, rep(0, 5))) expect_equal(Ltmat[3, ], c(7:0, rep(0, 3))) expect_equal(LLmat[1, ], c(rep(1, 6), rep(0, 5))) expect_equal(LLmat[3, ], c(rep(0, 2), rep(1, 6), rep(0, 3))) expect_equal(max(Ltmat * LLmat), 5) ped <- as_ped(data, Surv(time, status) ~ . + cumulative(z.tz2, latency(tz2), tz_var = "tz2", ll_fun = function(t, tz) (t - tz) >= 0 & (t - tz) <= 5), cut = 0:2) expect_equal(max(ped$tz2_latency * ped$LL), 5) }) pammtools/tests/testthat/test-mgcv-convenience.R0000644000176200001440000000034513662013606021622 0ustar liggesuserscontext("mgcv convenience functions") test_that("mgcv convenience works", { library(mgcv) g <- gam(Sepal.Length ~ s(Sepal.Width) + s(Petal.Length), data=iris) expect_data_frame(s1d <- tidy_smooth(g), nrows=200, ncols=7) })pammtools/tests/testthat/test-newdata.R0000644000176200001440000001056714767026617020043 0ustar liggesuserscontext("create newdata") test_that("creating newdata works on ungrouped data", { iris2 <- iris %>% group_by(Species) %>% slice(1:2) %>% ungroup() expect_data_frame( make_newdata(iris2), any.missing = FALSE, nrows = 1L, ncols = 5L) expect_equal(colnames(make_newdata(iris2)), colnames(iris2)) expect_data_frame( make_newdata(iris2, Sepal.Length = c(5)), any.missing = FALSE, nrows = 1L, ncols = 5L) expect_equal(make_newdata(iris2, Sepal.Length = c(5))$Sepal.Length, 5) expect_data_frame( make_newdata(iris2, Sepal.Length = c(5, 6)), any.missing = FALSE, nrows = 2L, ncols = 5L) expect_data_frame( make_newdata(iris2, Sepal.Length = seq_range(Sepal.Length, 2)), any.missing = FALSE, nrows = 2L, ncols = 5L) expect_equal( make_newdata(iris2, Sepal.Length = seq_range(Sepal.Length, 2))$Sepal.Length, c(4.9, 7.0)) }) test_that("creating newdata fails on ungrouped data", { iris2 <- iris %>% group_by(Species) %>% slice(2) %>% ungroup() expect_warning(make_newdata(iris2, Sepal.length = c(5))) expect_error(make_newdata(iris2, Sepal.Length = 5)) expect_error(make_newdata(iris2, Sepal.Length = seq_range(Sepal.length, 2))) expect_warning(make_newdata(iris2, Sepal.length = seq_range(Sepal.Length, 2))) }) test_that("make_newdata works for PED data", { ped <- simdf_elra %>% slice(1:6) %>% as_ped(Surv(time, status)~x1 + x2, cut = seq(0, 10, by = 5)) mdf <- ped %>% make_newdata(x1 = seq_range(x1, 2)) expect_data_frame(mdf, nrows = 2L, ncols = 9L) expect_equal(mdf$tend, c(5, 5)) expect_equal(mdf$x1, c(-2.43, 2.54), tolerance = 1e-2) expect_message(make_newdata(ped, tend = c(2.5))) mdf <- ped %>% make_newdata(tend = c(10), x1 = seq_range(x1, 2)) expect_data_frame(mdf, nrows = 2L, ncols = 9L) mdf <- ped %>% make_newdata(x1 = seq_range(x1, 2), x2 = seq_range(x2, 2)) expect_data_frame(mdf, nrows = 4L, ncols = 9L) mdf <- ped %>% make_newdata(tend = unique(tend), x2 = seq_range(x2, 2)) expect_data_frame(mdf, nrows = 4L, ncols = 9L) }) test_that("make_newdata works for PED with matrix columns", { ped_simdf <- simdf_elra %>% as_ped( Surv(time, status) ~ x1 + x2 + cumulative(time, latency(tz1), z.tz1, tz_var = "tz1", ll_fun = function(t, tz) t >= tz + 2) + cumulative(latency(tz2), z.tz2, tz_var = "tz2"), cut = 0:10) ## sample info expect_data_frame(sdf <- sample_info(ped_simdf), nrows = 1, ncols = 2) expect_equal(sdf$x1, 0.0718, tolerance = 1e-3) expect_equal(sdf$x2, 3.043, tolerance = 1e-3) ## ped info pinf <- ped_info(ped_simdf) expect_data_frame(pinf, nrows = 10L, ncols = 7L) expect_equal(pinf$x1[1], 0.0718, tolerance = 1e-3) expect_equal(pinf$x2[2], 3.043, tolerance = 1e-3) # make newdata nd1 <- ped_simdf %>% make_newdata(x1 = c(0.05)) expect_data_frame(nd1, nrows = 1L, ncols = 16L) expect_equal(nd1$tstart, 0) expect_equal(nd1$tend, 1) expect_equal(nd1$x1, 0.05) expect_equal(nd1$x2, 2.65, tolerance = 1e-3) expect_equal(nd1$z.tz1_tz1, -0.370, 1e-3) nd2 <- ped_simdf %>% make_newdata(x1 = seq_range(x1, 2)) expect_data_frame(nd2, nrows = 2L, ncols = 16L) expect_equal(nd2$x1[1], min(unlist(simdf_elra$x1))) expect_equal(nd2$x1[2], max(unlist(simdf_elra$x1))) nd3 <- ped_simdf %>% make_newdata(tend = unique(tend)) expect_data_frame(nd3, nrows = 10L, ncols = 16L) expect_equal(nd3$tend, 1:10) nd4 <- ped_simdf %>% make_newdata(tz1_latency = c(0:5)) expect_data_frame(nd4, nrows = 6L, ncols = 16L) expect_equal(nd4$tz1_latency, 0:5) nd5 <- ped_simdf %>% make_newdata( tend = c(1:10), tz1_latency = seq(1:5)) expect_data_frame(nd5, nrows = 50L, ncols = 16L) expect_equal(nd5$tend, rep(1:10, 5L)) expect_equal(nd5$tz1_latency, rep(1:5, each = 10L)) expect_equal(nd5$LL_tz1, c(rep(0, 10), rep(1, nrow(nd5) - 10))) }) test_that("Errors are thrown", { expect_error(combine_df(data.frame(x = 1), x = 2)) expect_error(tumor[1:4,1:2] |> as_ped(Surv(days, status)~1) |> make_newdata(tend = c(0))) }) test_that("Newdata correct for new time points", { ped <- tumor[1:5, 1:3] |> as_ped(Surv(days, status)~.) nd6 <- ped |> make_newdata(tend = c(2, 33, 100)) expect_data_frame(nd6, nrows = 3L, ncols = 8L) expect_equal(nd6$tend, c(2, 33, 100)) expect_equal(nd6$tstart, c(0, 2, 33)) expect_equal(nd6$intlen, c(2, 31, 67)) ## TODO: add test for same but more complex ped data (cumulative effects) }) pammtools/tests/testthat/test-model-evaluation.R0000644000176200001440000000107614761333717021654 0ustar liggesuserscontext("Model evaluation helpers") test_that("pec helpers work", { library(pec) data(tumor) ped <- tumor %>% as_ped(Surv(days, status) ~ complications, cut = seq(0, 500, by = 50)) pam <- pamm(ped_status ~ complications, data = ped) suppressMessages({ pec <- pec::pec(list(pam = pam), Surv(days, status) ~ 1, data = tumor, times = seq(.01, 500, by = 100), start = .01, exact = FALSE) }) df_ibs <- as.data.frame(pec::crps(pec)) expect_data_frame(df_ibs, nrow = 2, ncol = 3) expect_identical(colnames(df_ibs), c("method", "time", "IBS")) }) pammtools/tests/testthat/test-predict-functions.R0000644000176200001440000000156114222504522022030 0ustar liggesuserscontext("Predict functions") test_that("predict functions work correctly", { data("tumor") ped <- as_ped(Surv(days, status)~ complications, data = tumor[1:20, ]) pam <- pamm(ped_status ~ s(tend, k = 3) + complications, data = ped) pam2 <- pamm(ped_status ~ s(tend, k = 3) + complications, data = ped, engine = "bam", method = "fREML", discrete = TRUE) ## predictSurvProb (pec) generic spmat <- predictSurvProb.pamm(pam, tumor[21:23,], times = c(90, 500, 1217)) expect_identical( round(spmat, 2), matrix( c( rep(.81, 3), rep(.46, 3), rep(.38, 3) ), nrow = 3, ncol = 3 ) ) expect_error(predictSurvProb.pamm(pam, tumor[21:23,], times = c(90, 500, 2000))) spmat2 <- predictSurvProb.pamm(pam2, tumor[21:23,], times = c(90, 500, 1217)) expect_identical(round(spmat, 2), round(spmat2, 2)) } ) pammtools/tests/testthat/test-as-ped.R0000644000176200001440000001276214767026617017570 0ustar liggesuserscontext("Test as_ped functions") test_that("Trafo works and attributes are appended", { # preparations data("tumor") tumor <- tumor[c(1:3, 135:137), ] ped <- as_ped( data = tumor, formula = Surv(days, status)~ complications + age, cut = c(0, 100, 400)) # retransform to ped expect_data_frame(ped, nrow = 12L, ncols = 8L) expect_is(ped, "ped") expect_subset(c("ped_status", "tstart", "tend", "interval", "offset"), names(ped)) expect_is(attr(ped, "breaks"), "numeric") expect_is(attr(ped, "intvars"), "character") expect_is(attr(ped, "id_var"), "character") expect_equal(attr(ped, "id_var"), "id") expect_equal(is.ped(ped), TRUE) ped <- as_ped( data = tumor, formula = Surv(days, status)~ complications + age) expect_data_frame(ped, nrows = 11L, ncols = 8L) }) test_that("Trafo works for list objects (with TDCs)", { data("patient") event_df <- filter(patient, CombinedID %in% c(1110, 1116)) ped <- as_ped(data = list(event_df), formula = Surv(survhosp, PatientDied)~ ., cut = 0:30, id = "CombinedID") expect_data_frame(ped, nrows = 40, ncols = 15) tdc_df <- filter(daily, CombinedID %in% c(1110, 1116)) ## check nesting expect_error(as_ped( data = list(event_df, tdc_df), formula = Surv(survhosp, PatientDied) ~ ., cut = 0:30, id = "CombinedID")) ped <- as_ped( data = list(event_df, tdc_df), formula = Surv(survhosp, PatientDied) ~ . + cumulative(survhosp, Study_Day, caloriesPercentage, tz_var = "Study_Day") + cumulative(proteinGproKG, tz_var = "Study_Day"), cut = 0:30, id = "CombinedID") expect_subset("survhosp_Study_Day_mat", colnames(ped)) expect_data_frame(ped, nrows = 40L, ncols = 20L) expect_identical(any(is.na(ped$caloriesPercentage_Study_Day)), FALSE) expect_identical(colnames(ped$Study_Day), paste0("Study_Day", 1:12)) ped <- as_ped( data = list(event_df, tdc_df), formula = Surv(survhosp, PatientDied) ~ . + cumulative(Study_Day, caloriesPercentage, tz_var = "Study_Day") + cumulative(proteinGproKG, tz_var = "Study_Day"), id = "CombinedID") expect_data_frame(ped, nrows = 2L, ncols = 19L) }) test_that("Trafo works for left truncated data", { mort2 <- mort %>% group_by(id) %>% slice(1) %>% filter(id %in% c(1:3)) mort_ped <- as_ped(Surv(tstart, exit, event) ~ ses, data = mort2) expect_data_frame(mort_ped, nrows = 8L, ncols = 7L) expect_identical(round(mort_ped$tstart, 2), c(0.00, 3.48, 13.46, 17.56, 3.48, 13.46, 0.00, 3.48)) expect_identical(round(mort_ped$tend, 2), c(3.48, 13.46, 17.56, 20.00, 13.46, 17.56, 3.48, 13.46)) expect_identical(round(mort_ped$offset, 2), c(1.25, 2.30, 1.41, 0.89, 2.30, 1.41, 1.25, 2.30)) expect_identical(mort_ped$ped_status, c(rep(0, 5), 1, 0, 0)) expect_identical(mort_ped$ses, factor(rep(c("upper", "lower", "upper"), times = c(4,2,2)))) }) test_that("Trafo works for recurrent events data", { test_df <- data.frame( id = c(1,1, 2,2,2), tstart = c(0, .5, 0, .8, 1.2), tstop = c(.5, 3, .8, 1.2, 3), status = c(1, 0, 1, 1, 0), enum = c(1, 2, 1, 2, 3), age = c(50, 50, 24, 24, 24)) # GAP timescale gap_df <- as_ped( data = test_df, formula = Surv(tstart, tstop, status)~ enum + age, transition = "enum", id = "id", timescale = "gap") expect_data_frame(gap_df, nrows = 9L, ncols = 8L) expect_identical( round(gap_df$tstart, 1), c(0.0, 0.4, 0.0, 0.4, 0.5, 0.0, 0.4, 0.5, 0.0)) expect_identical( round(gap_df$tend, 1), c(0.4, 0.5, 0.4, 0.5, 0.8, 0.4, 0.5, 0.8, 0.4)) expect_identical( gap_df$ped_status, c(0, 1, 0, 0, 1, 0, 0, 0, 1) ) expect_identical( gap_df$enum, rep(c(1, 2), times = c(5, 4)) ) ## CALENDAR timescale cal_df <- as_ped( data = test_df, formula = Surv(tstart, tstop, status)~ age, id = "id", transition = "enum", timescale = "calendar") expect_data_frame(cal_df, nrows = 6L, ncols = 8L) expect_identical( round(cal_df$tstart, 1), c(0.0, 0.0, 0.5, 0.5, 0.8, 0.8)) expect_identical( round(cal_df$tend, 1), c(0.5, 0.5, 0.8, 0.8, 1.2, 1.2)) expect_identical( cal_df$ped_status, c(1, 0, 1, 0, 0, 1) ) expect_identical( cal_df$enum, rep(c(1, 2), each = 3) ) }) test_that("Trafo works for multi-state data without recurrent events", { test_df <- data.frame( id = c(1, 2,2), tstart = c(0, 0,1.2), tstop = c(3, 1.2,3), status = c(1, 1,1), from = c(1, 1,2), to = c(3, 2,3), transition = c("1->3", "1->2","2->3"), age = c(24, 36,36)) test_df <- test_df %>% add_counterfactual_transitions() # CALENDAR timescale cal_df <- as_ped( data = test_df, formula = Surv(tstart, tstop, status)~ ., transition = "transition", id = "id", timescale = "calendar") # according to code: order by transition -> id -> tstart expect_data_frame(cal_df, nrows = 7L, ncols = 10L) expect_identical(cal_df$transition, as.factor(c("1->2", "1->2","1->2","1->3", "1->3","1->3","2->3"))) expect_identical( cal_df$id, c(1, 1, 2, 1, 1, 2, 2)) expect_identical( round(cal_df$tstart, 1), c(0.0, 1.2, 0.0, 0.0, 1.2, 0.0, 1.2)) expect_identical( round(cal_df$tend, 1), c(1.2, 3.0, 1.2, 1.2, 3.0, 1.2, 3.0)) expect_identical( cal_df$ped_status, c(0, 0, 1, 0, 1, 0, 1) ) expect_identical( cal_df$from, c(1,1,1, 1,1,1, 2) ) expect_identical( cal_df$to, c(2,2,2, 3,3,3, 3) ) } ) pammtools/tests/testthat/test-interval-functions.R0000644000176200001440000000320014761333717022230 0ustar liggesuserscontext("Interval info and median and modus information") data("tumor") ped <- tumor[1:200, ] %>% as_ped(Surv(days, status)~ complications + age, cut=seq(0,400, by=100)) ped <- filter(ped, id %in% c(1:3, 135:137)) test_that("Interval infos correct", { expect_data_frame(int_info(1:2), nrows=2L, ncols=5L) expect_data_frame(int_info(2:1), nrows=2L, ncols=5L) expect_data_frame(int_info(data.frame(x1 = c(1,0), x2=c(2, 1))), nrows = 2L, ncols = 5L) expect_equal(names(int_info(1:2)), c("tstart", "tend", "intlen", "intmid", "interval")) expect_equal(levels(int_info(1:2)$interval), c("(0,1]", "(1,2]")) }) test_that("Interval info returned for ped objects", { expect_data_frame(int_info(ped), nrows=4L, ncols=5L, types=c("numeric", "factor")) }) test_that("Sample info returned for data frame", { expect_data_frame(si <- sample_info(tumor), nrows=1L, ncols=9L) expect_equal(colnames(si), colnames(tumor)) expect_data_frame(si <- tumor %>% group_by(complications, status) %>% sample_info(), nrows=4L, ncols=9L) expect_equal(colnames(si), colnames(tumor)) }) test_that("Sample info returned for ped objects", { expect_data_frame(sample_info(ped), nrows=1, ncols=2) }) test_that("Sample info returned for grouped ped objects", { expect_data_frame(group_by(ped, complications) %>% sample_info(), nrows=2, ncols=2) }) test_that("ped info returned for (grouped) ped objects", { # normal expect_data_frame(ped_info(ped), nrows=4L, ncols=7L) #grouped expect_data_frame(group_by(ped, complications) %>% ped_info(), nrows=8L, ncols=7L) # without covariates expect_data_frame(ped_info(select(ped, -complications, -age)), nrows=4L, ncols=5L) }) pammtools/tests/testthat/test-simple-transform.R0000644000176200001440000000557614761333717021722 0ustar liggesuserscontext("Simple transformation to PED data") test_that("Transformation of regular survival data works", { ## preparations data("tumor") tumor <- tumor[c(1:3, 135:137), ] tumor$ID <- sample(1:100, nrow(tumor)) ped_vet <- split_data(data = tumor, Surv(days, status) ~ complications + age, cut = c(0, 100, 400), id = "ID") expect_identical(unique(ped_vet$ID), tumor$ID) tumor$ID <- NULL ## tests expect_data_frame(ped <- tumor %>% as_ped(Surv(days, status)~ complications + age, cut = c(0, 100, 400)), nrows = 12L, ncols = 8L) expect_is(ped, "ped") expect_subset(c("ped_status", "tstart", "tend", "interval", "offset"), names(ped)) expect_is(attr(ped, "breaks"), "numeric") expect_is(attr(ped, "intvars"), "character") expect_is(attr(ped, "id_var"), "character") expect_equal(attr(ped, "id_var"), "id") expect_data_frame(tumor %>% as_ped(Surv(days, status)~ complications + age, cut = c(0, 100, 400), id = "id"), nrows = 12L, ncols = 8L) ## no error, when id in data and additionally specified tumor$id <- seq_len(nrow(tumor)) expect_data_frame(ped <- tumor %>% as_ped(Surv(days, status)~complications, cut = c(0, 100, 400), id = "id"), nrows = 12L, ncols = 7L) ## no error when id already in data but not specified expect_data_frame(tumor %>% as_ped(Surv(days, status)~complications, cut = c(0, 100, 400)), nrows = 12L, ncols = 7L) ## no error when id has different name and is specified accordingly tumor$id2 <- tumor$id expect_data_frame(ped <- tumor %>% as_ped(Surv(days, status)~., cut = c(0, 100, 400)), nrows = 12L, ncols = 14L) expect_identical(attr(ped, "id_var"), "id") ## no additional id when different id specified tumor$id <- NULL expect_data_frame(ped <- tumor %>% as_ped(Surv(days, status)~., cut = c(0, 100, 400), id = "id2"), nrows = 12L, ncols = 13L) expect_identical(attr(ped, "id_var"), "id2") tumor$id2 <- NULL # max_time ped <- tumor %>% as_ped(Surv(days, status)~., max_time = 400) expect_data_frame(ped, nrows = 11L, ncols = 13L) expect_identical(max(ped$tend), 400) expect_identical(nlevels(ped$interval), 2L) # inlcude_last tumor[6, "days"] <- 358 ped <- tumor %>% as_ped(Surv(days, status)~.) expect_data_frame(ped, nrows = 11L, ncols = 13L) expect_identical(max(ped$tend), 358) }) test_that("Error on wrong input", { ## preparations data("tumor") tumor <- tumor[c(1:3, 135:137), ] ## tests expect_error(as_ped(tumor, x ~ y, cut = c(0:5, 10, 40))) expect_error(as_ped(tumor, Surv(days2, status) ~., cut = c(0:5, 10, 40))) expect_error(as_ped( data = rename(tumor, ped_time = time), formula = Surv(ped_time, status) ~.)) # already in data set ped_time ## error when specified id variable not unique tumor$id <- rep(1:2, 3) expect_error( as_ped(tumor, Surv(days, status) ~ complications, cut = c(0, 100, 400), id = "id"), regexp = "Specified ID variable.*") }) pammtools/tests/testthat/test-specials.R0000644000176200001440000000610414761333717020207 0ustar liggesuserscontext("Test formula special.") test_that("Formula special 'func' works as expected", { ## time + latency + covar (DLNM approach) cumu1 <- eval_special(~ cumulative(t, latency(te), x, tz_var = "te"))[[1]] expect_list(cumu1, any.missing = TRUE, len = 5) expect_identical(cumu1$latency_var, "te") expect_identical(cumu1$tz_var, "te") expect_identical(cumu1$col_vars, c("t", "te", "x")) expect_function(cumu1$ll_fun, args = c("t", "tz")) expect_identical(cumu1$suffix, NULL) }) test_that("Formula special 'concurrent' works as expected", { ## time + latency + covar (DLNM approach) ccr1 <- eval_special(~ concurrent(x1, x2, tz_var = "te"), special = "concurrent")[[1]] expect_list(ccr1, any.missing = TRUE, len = 5) expect_identical(ccr1$tz_var, "te") expect_identical(ccr1$col_vars, c("x1", "x2")) expect_function(ccr1$ll_fun, args = c("t")) expect_identical(ccr1$lag, 0) expect_identical(ccr1$suffix, NULL) data("pbc", package = "survival") event_df <- pbc %>% filter(id <= 5) %>% mutate(event = 1L*(status == 2)) %>% select(id, time, event, sex, bili, protime, albumin) tdc_df <- pbcseq %>% filter(id <= 5) %>% select(id, day, bili, protime, albumin) formula <- Surv(time, event)~ concurrent(bili, protime, tz_var = "day") + concurrent(albumin, tz_var = "day") nested_fdf <- nest_tdc(list(event_df, tdc_df), formula, id = "id") ped_ccr <- as_ped(list(event_df, tdc_df), formula, id = "id") }) context("Transformation of longitudinal covariates to functional covariates") test_that("Covariate to matrix Transformation works", { event_df <- filter(patient, CombinedID == 1116) tdc_df <- filter(daily, CombinedID == 1116) ## check nesting nested_df <- nest_tdc( data = list(event_df, tdc_df), formula = Surv(survhosp, status)~ . + cumulative(Study_Day, caloriesPercentage, tz_var="Study_Day") + cumulative(proteinGproKG, tz_var="Study_Day"), cut = 0:30, id = "CombinedID") expect_tibble(nested_df, any.missing=FALSE, nrows=1, ncols=15) expect_identical(colnames(nested_df), c("Year", "CombinedicuID", "CombinedID", "Survdays", "PatientDied", "survhosp", "Gender", "Age", "AdmCatID", "ApacheIIScore", "BMI", "DiagID2", "Study_Day", "caloriesPercentage", "proteinGproKG")) expect_identical(names(attributes(nested_df))[-c(1:3)], c("id_var", "time_var", "status_var", "tdc_vars", "breaks", "func_list", "id_n", "id_tseq", "id_tz_seq")) ## check data trafo expect_error(get_cumulative(nested_df, ~cumulative(t))) f1 <- get_cumulative(nested_df, ~ . + cumulative(survhosp, latency(Study_Day), caloriesPercentage, tz_var = "Study_Day")) expect_list(f1$func_mats, types=c("numeric", "numeric", "numeric", "integer"), any.missing=FALSE, len=4, names="named") f2 <- get_cumulative(nested_df, ~. + cumulative(survhosp, latency(Study_Day), caloriesPercentage, tz_var = "Study_Day") + cumulative(proteinGproKG, tz_var = "Study_Day")) expect_list(f2$func_mats, types=c(rep("numeric", 3), "integer", "numeric"), any.missing = FALSE, len=5, names="named") }) pammtools/tests/testthat/test-simulation.R0000644000176200001440000000252114761333717020567 0ustar liggesuserscontext("Test simulation functions") test_that("Test that rpexp works", { expect_identical(length(rpexp(n = 1, rate = 1, t = 0)), 1L) expect_error(rpexp(n = 1, rate = 1, t = c(0, 1))) expect_error(rpexp(n = 1, rate = 1, t = 1)) expect_error(rpexp(n = 1, rate = c(1, 1, 1), t = c(0, 2, 1))) expect_identical(rpexp(n=0, rate = 1, t = 0), numeric(0)) expect_identical(length(rpexp(n=c(1, 3), rate = 1, t = 0)), 2L) }) test_that("Simulation function works", { suppressWarnings(RNGversion("3.5.0")) set.seed(24032018) # standard data df <- cbind.data.frame(x1 = runif (3, -3, 3), x2 = runif (3, 0, 6)) sim_df <- sim_pexp(~ -3.5 - 0.5 * x1 + sqrt(x2), df, cut = 0:10) expect_data_frame(sim_df, nrows = 3, ncols = 5) expect_identical(round(sim_df$time, 2), c(1.38, 7.14, 3.02)) # time-dependent covariates rng_z <- function(nz) { as.numeric(arima.sim(n = nz, list(ar = c(.8, -.6)))) } tz1 <- 1:10 df <- df %>% add_tdc(tz1, rng_z) # simulate data with cumulative effect sim_df <- sim_pexp( formula = ~ -3.5 - 0.5 * x1 + sqrt(x2) | fcumu(t, tz1, z.tz1, f_xyz = function(t, tz, z) { -1 * cos(t / 10 * pi) * 0.8 * (dnorm(z, 1.5, 2) + 1.5 * dnorm(z, 7.5, 1)) * 15 * dnorm(t - tz, 8, 10) }, ll_fun = function(t, tz) t >= tz), data = df, cut = 0:10) }) pammtools/tests/testthat/test-cumulative-effect.R0000644000176200001440000001221314767026617022016 0ustar liggesuserscontext("Cumulative effects (of time-dependent covariates)") test_that("Lag-lead is calculated correctly", { LL <- get_laglead(0:2, c(-2, -0.5, 0, 0.5, 2), ll_fun = function(t, tz) t >= tz) expect_data_frame(LL, nrows = 15L, ncols = 3L) expect_class(LL, "LL_df") expect_identical(LL$t, rep(0:2, each = 5)) expect_identical(LL$tz, rep(c(-2, -0.5, 0, 0.5, 2), times = 3)) expect_equal(LL$LL, c(rep(0, 5), rep(1, 3), rep(0, 2), rep(1, 4), 0)) }) test_that("LL helpers and as_ped produce equivalent LL windows", { n <- 1 # create data set with variables which will affect the hazard rate. df <- cbind.data.frame(x1 = runif (n, -3, 3)) %>% dplyr::as_tibble() rng_z <- function(nz) rep(1, nz) # two different exposure times for two different exposures tz1 <- 1:10 tz2 <- -5:5 # generate exposures and add to data set df <- df %>% add_tdc(tz1, rng_z) %>% add_tdc(tz2, rng_z) # define lag-lead window function ll_fun <- function(t, tz) t >= tz ll_fun2 <- function(t, tz) t >= tz + 2 & t <= tz + 2 + 5 # simulate data with cumulative effect sim_df <- sim_pexp( formula = ~ -3.5 - 0.5 * x1 | fcumu(t, tz1, z.tz1, f_xyz = function(t, tz, z) 1, ll_fun = function(t, tz) t >= tz) + fcumu(t, tz2, z.tz2, f_xyz = function(t, tz, z) 1, ll_fun = function(t, tz) t >= tz + 2 & t <= tz + 2 + 5), data = df, cut = 0:10) sim_df$time <- 10 ped <- sim_df %>% as_ped( Surv(time, status) ~ . + cumulative(time, z.tz1, tz_var = "tz1") + cumulative(time, z.tz2, tz_var = "tz2", ll_fun = function(t, tz) (t >= tz + 2) & (t <= tz + 2 + 5)), id = "id") LL1 <- ped$LL_tz1[1:10, ] LL1.1 <- get_laglead(0:10, 1:10, ll_fun) %>% filter(t != 0) %>% tidyr::spread(tz, LL) expect_equal(as.matrix(LL1.1[, -1]), LL1, check.attributes = FALSE) LL2 <- ped$LL_tz2[1:10, ] LL2.2 <- get_laglead(0:10, -5:5, ll_fun2) %>% filter(t != 0 ) %>% tidyr::spread(tz, LL) expect_equal(as.matrix(LL2.2[, -1]), LL2, check.attributes = FALSE) LL1.2 <- get_laglead(ped) %>% filter(tz_var == "tz1") %>% filter(t != 0) %>% tidyr::spread(tz, LL) %>% select(-1:-2) %>% as.matrix() LL2.2 <- get_laglead(ped) %>% filter(tz_var == "tz2") %>% filter(t != 0) %>% tidyr::spread(tz, LL) %>% select(-1:-2) %>% as.matrix() expect_equal(LL1, LL1.2, check.attributes = FALSE) expect_equal(LL2, LL2.2, check.attributes = FALSE) }) test_that("Cumulative effects are calculated correctly", { suppressWarnings(RNGversion("3.5.0")) # tz grid with differences different than 1 # generate exposures and add to data set n <- 250 set.seed(123) # create data set with variables which will affect the hazard rate. df <- cbind.data.frame(x1 = runif (n, -3, 3), x2 = runif (n, 0, 6)) %>% tibble::as_tibble() # the formula which specifies how covariates affet the hazard rate f0 <- function(t) { dgamma(t, 8, 2) * 6 } tz3 <- c(-5, -3, 0, 3, 5) rng_z <- function(nz) { as.numeric(arima.sim(n = nz, list(ar = c(.8, -.6)))) } df <- df %>% add_tdc(tz3, rng_z) sim_df <- sim_pexp( formula = ~ -3.5 + f0(t) - 0.5 * x1 + sqrt(x2) | fcumu(t, tz3, z.tz3, f_xyz = function(t, tz, z) 5 * (dnorm(t - tz, 4, 6) + dnorm(t - tz, 25, 4)) * z, ll_fun = function(t, tz) t - 2 >= tz), data = df, cut = 0:10) ped <- as_ped(sim_df, Surv(time, status)~ x1 + x2 + cumulative(latency(tz3), z.tz3, tz_var = "tz3"), cut = 0:10) ped5 <- subset(ped, id == 5) expect_identical(ped5$LL[1, ], c(2.5, 2, 3, rep(0, 2))) expect_identical(ped5$LL[9, ], c(2.5, 2, 3, 3, 2)) expect_identical(ped5$LL[10, ], c(2.5, 2, 3, 3, 2)) pam <- mgcv::gam(ped_status ~ s(tend) + x1 + s(x2) + s(tz3_latency, by = z.tz3), data = ped, family = poisson(), offset = offset) ndf <- make_newdata(ped, tz3_latency = unique(tz3_latency), z.tz3 = c(1)) ndf <- ndf %>% add_term(pam, term = "z.tz3") %>% slice(1:7) expect_equal(ndf$fit, c(.72, .88, 0.73, 0.46, 0.38, 0.26, 0.14), tolerance = 10e-3) ## partial effects partial <- gg_partial(ped, pam, "z.tz3", tend = seq(1, 10, by = 1), tz3_latency = 0:12, z.tz3 = c(1), reference = list(z.tz3 = 1)) expect_is(partial, c("gg", "ggplot")) expect_data_frame(partial$data, nrows = 130L, ncols = 15L) partial_ll <- gg_partial_ll(ped, pam, "z.tz3", tend = seq(1, 10, by = 1), tz3_latency = 0:12, z.tz3 = c(1), reference = list(z.tz3 = 1)) expect_is(partial_ll, c("gg", "ggplot")) expect_data_frame(partial_ll$data, nrows = 50L, ncols = 8L) ## cumulative effect visualization helpers: cumu_eff <- get_cumu_eff(ped, pam, term = "z.tz3", z1 = seq(-1, 1, length.out = 5), z2 = 0) expect_identical(unique(ped$interval), unique(cumu_eff$interval)) expect_matrix(cumu_eff$z.tz3, nrows = 10L, ncols = 5L, any.missing = FALSE) expect_identical(cumu_eff$z.tz3[1, ], cumu_eff$z.tz3[2, ]) expect_subset( x = c("cumu_eff", "se_cumu_eff", "cumu_eff_lower", "cumu_eff_upper"), choices = colnames(cumu_eff)) expect_identical(all(cumu_eff$cumu_eff >= cumu_eff$cumu_eff_lower), TRUE) expect_identical(all(cumu_eff$cumu_eff <= cumu_eff$cumu_eff_upper), TRUE) expect_numeric(cumu_eff$se_cumu_eff, lower = 0, finite = TRUE, any.missing = FALSE) }) pammtools/tests/testthat/test-as-ped-cr.R0000644000176200001440000000657615031731165020162 0ustar liggesuserscontext("Test as_ped_cr functions") test_that("Trafo works and attributes are appended.", { # preparations ped <- as_ped( data = sir_adm, formula = Surv(time, status) ~ age + pneu, cut = c(0, 10, 100) ) expect_data_frame(ped, nrow = 12L * 2L, ncols = 9L) expect_is(ped, "ped_cr_union") expect_subset(c("ped_status", "tstart", "tend", "interval", "offset", "cause"), names(ped)) expect_is(attr(ped, "breaks"), "numeric") expect_is(attr(ped, "intvars"), "character") expect_is(attr(ped, "id_var"), "character") expect_equal(attr(ped, "id_var"), "id") expect_equal(sum(as.numeric(ped$cause)), 36) # check that trafo can be recovered ped2 <- as_ped(ped, newdata = sir_adm) expect_equal(ped, ped2, check.attributes = FALSE) # check that list output identical for given cut points ped_list <- as_ped( data = sir_adm, formula = Surv(time, status) ~ age + pneu, cut = c(0, 10, 100), combine = FALSE) ped2 <- do.call(rbind, ped_list) expect_true(all.equal(do.call(rbind, ped_list), ped, check.attributes = FALSE)) expect_identical(length(ped_list), 2L) expect_identical(class(ped_list), c("ped_cr_list", "ped_cr", "ped", "list")) expect_identical(names(attributes(ped_list)), c("class", "names", "trafo_args", "risks")) expect_identical(length(attr(ped_list, "trafo_args")$cut), 2L) # check that trafo can be recovered for ped list objects ped_list2 <- as_ped(ped_list, newdata = sir_adm) expect_equal(ped_list, ped_list2, check.attributes = FALSE) # test when split points not specified ped <- as_ped(data = sir_adm, formula = Surv(time, status) ~ .) expect_data_frame(ped, nrows = 56L, ncols = 10L) expect_equal(sum(as.numeric(ped$cause)), 84L) ped_list <- as_ped_cr(sir_adm, Surv(time, status) ~ ., combine = FALSE) expect_identical(attr(ped_list[[1]], "breaks"), c(4L, 10L, 24L, 37L, 101L)) expect_identical(attr(ped_list[[2]], "breaks"), c(22L, 25L)) ped_list2 <- as_ped(ped_list, newdata = sir_adm) expect_equal(ped_list, ped_list2, check.attributes = FALSE) }) test_that("Trafo works for more than two risks.", { # preparations sir_adm$status[2] <- 3 ped <- as_ped( data = sir_adm, formula = Surv(time, status) ~ age + pneu, cut = c(0, 10, 100) ) expect_data_frame(ped, nrow = 12L * 3L, ncols = 9L) expect_is(ped, "ped_cr_union") expect_subset(c("ped_status", "tstart", "tend", "interval", "offset", "cause"), names(ped)) expect_is(attr(ped, "breaks"), "numeric") expect_is(attr(ped, "intvars"), "character") expect_is(attr(ped, "id_var"), "character") expect_equal(attr(ped, "id_var"), "id") expect_equal(sum(as.numeric(ped$cause)), 72) expect_equal(sum(ped$ped_status[ped$cause == 3L]), 1) }) test_that("Trafo works for status as factor.", { # create data set with status as factor dat <- data.frame( status_fct = factor(c(0, 0, 0, 0, 1, 1, 1, 2, 2, 2)), time = seq(from = 10, to = 100, by = 10) ) # create as ped with status as factor ped <- as_ped( data = dat, formula = Surv(time, status_fct) ~ . ) expect_data_frame(ped, nrow = 50L, ncols = 7L) expect_is(ped, "ped_cr_union") expect_subset(c("ped_status", "tstart", "tend", "interval", "offset", "cause"), names(ped)) expect_is(attr(ped, "risks"), "factor") expect_equal(levels(ped$cause), c("1", "2")) }) pammtools/tests/testthat/test-pamm-fit.R0000644000176200001440000000237215031734770020114 0ustar liggesuserscontext("Test pamm wrapper function") test_that("pamm function works correctly", { data("tumor") ped <- as_ped(Surv(days, status)~ complications + age, data = tumor[1:20,]) # gam engine pam <- pamm(ped_status ~ s(tend, k=3) + age, data=ped) expect_is(pam, "pamm") expect_is(summary(pam), "summary.gam") expect_data_frame(int_info(pam), nrows = 9L, ncols = 5L) expect_identical(is.pamm(pam), TRUE) # check data trafo from pam object ped_new <- as_ped(pam, newdata = tumor[21:40, ]) expect_data_frame(ped_new, nrows = 144L, ncols = 8L) expect_subset(ped_new$tend, ped$tend) # bam engine pam2 <- pamm(ped_status ~ s(tend, k = 3) + age, data = ped, engine = "bam") expect_true(inherits(pam2, "bam")) expect_data_frame(int_info(pam2), nrows = 9L, ncols = 5L) expect_identical(is.pamm(pam2), TRUE) # pass arguments to bam pam3 <- pamm(ped_status ~ s(tend, k = 3) + age, data = ped, engine = "bam", discrete = TRUE, method = "fREML") expect_true(inherits(pam3, "bam")) expect_data_frame(int_info(pam3), nrows = 9L, ncols = 5L) expect_identical(is.pamm(pam), TRUE) # warning if no offset in ped data ped_nooffset <- ped |> select(-offset) expect_warning(pamm(ped_status ~ s(tend, k=3) + age, data = ped_nooffset)) }) pammtools/tests/testthat/test-cumulative-coefficients.R0000644000176200001440000000134514222504522023205 0ustar liggesuserscontext("Test cumulative coefficients functionality") test_that("Cumulative coefficients work", { df <- tumor[1:30, c("days", "status", "age")] df$x1 <- as.factor(rep(letters[1:3], each = nrow(df) / 3L)) ## pam ped <- as_ped(df, formula = Surv(days, status)~ x1 + age) pam <- mgcv::gam(ped_status ~ s(tend) + x1 + age, data = ped, family = poisson(), offset = offset) cumu_coef_pam <- get_cumu_coef(pam, ped, terms = c("age", "x1"), nsim = 20L) expect_data_frame(cumu_coef_pam, nrows = 36L, ncols = 6L) expect_equal(unique(cumu_coef_pam$variable), c("age", "x1 (b)", "x1 (c)")) cumu_coef_pam <- get_cumu_coef(pam, ped, terms = c("(Intercept)", "age")) expect_data_frame(cumu_coef_pam, nrows = 24L, ncols = 6L) }) pammtools/tests/testthat/test-add-functions.R0000644000176200001440000003454115031734770021143 0ustar liggesuserscontext("Convenience functions for calculation of hazard and similar") data("tumor") ped <- tumor[1:200,] %>% as_ped(Surv(days, status)~ age + complications, cut = c(0, 50, 100, 200, 300, 400)) pam <- mgcv::gam(ped_status ~ s(tend, k = 5) + complications, data = ped, family = poisson(), offset = offset) pam2 <- mgcv::gam(ped_status ~ s(tend, k = 5) + complications + s(age), data = ped, family = poisson(), offset = offset) bam <- mgcv::bam(ped_status ~ s(tend, k = 5) + complications, data = ped, family = poisson(), offset = offset, method = "fREML", discrete = TRUE) pem <- glm(ped_status ~ 0 + interval + complications, data = ped, family = poisson(), offset = offset) pam3 <- mgcv::gam(ped_status ~ s(tend, k = 5, by = as.factor(complications)) + as.factor(complications), data = ped, family = poisson(), offset = offset) data("prothr", package = "mstate") prothr <- prothr[1:200,] |> filter(Tstart != Tstop) |> mutate(transition = as.factor(paste0(from, "->", to))) |> select(-trans, -treat) ped_msm <- as_ped( data = prothr, formula = Surv(Tstart, Tstop, status)~ ., # cut = seq(2000, 4000, length.out = 100), transition = "transition", id = "id", timescale = "calendar" ) pam_msm <- gam(ped_status ~ s(tend, by=transition, bs="cr") + transition , data = ped_msm , family = poisson() , offset = offset) test_that("hazard functions work for PAM", { expect_data_frame(haz <- add_hazard(ped_info(ped), bam), nrows = 5L, ncols = 11L) expect_data_frame(haz <- add_hazard(ped_info(ped), pam), nrows = 5L, ncols = 11L) expect_equal(all(haz$ci_lower < haz$hazard), TRUE) expect_equal(all(haz$ci_upper > haz$hazard), TRUE) expect_equal(round(haz$hazard, 3), c(0.001, 0.001, 0.001, 0.001, 0.001)) expect_equal(round(haz$ci_lower, 3), c(0, 0, 0, 0, 0)) expect_error(add_hazard(haz, pam)) expect_data_frame(add_hazard(haz, pam, overwrite = TRUE), nrows = 5L, ncols = 11L) haz2 <- add_hazard(ped_info(ped), pam, type = "link") expect_equal(all(haz2$ci_lower < haz2$hazard), TRUE) expect_equal(all(haz2$ci_upper > haz2$hazard), TRUE) expect_equal(round(haz2$hazard, 2), c(-7.37, -7.39, -7.41, -7.43, -7.46)) expect_equal(round(haz2$ci_lower, 2), c(-7.93, -7.86, -7.78, -7.83, -7.99)) ## delta rule expect_data_frame(add_hazard(ped_info(ped), bam, ci_type = "delta"), nrows = 5L, ncols = 11L) haz3 <- add_hazard(ped_info(ped), pam, ci_type = "delta") expect_data_frame(haz3, nrows = 5L, ncols = 11L) expect_equal(round(haz3$hazard * 100, 2), c(.06, .06, .06, .06, .06)) expect_equal(round(haz3$se * 100, 2), c(.02, .01, .01, .01, .02)) expect_equal(round(haz3$ci_lower * 100, 2), c(.03, .03, .04, .04, .03)) expect_equal(round(haz3$ci_upper * 100, 2), c(.10, .09, .08, .08, .09)) ## simulation based ci (0.95) haz4 <- add_hazard(ped_info(ped), pam, ci_type = "sim") ## hazard with reference (i.e. hazard ratio) hr <- add_hazard(ped_info(ped), pam2, reference = list(age = c(30))) # hazard ratio is constant as age effect not time-varying expect_equal(round(hr$hazard, 3), rep(1.458, 5)) # hr = 1 if reference = data hr2 <- ped_info(ped) %>% add_hazard(pam2, reference = list(age = mean(.$age))) expect_equal(hr2$hazard, rep(1, 5)) ## factor group variable ndf <- ped %>% make_newdata(tend = unique(tend), complications = unique(complications)) %>% group_by(complications) ndf1 <- ndf %>% add_cumu_hazard(pam3, ci = TRUE, ci_type = "default") ndf2 <- ndf %>% add_cumu_hazard(pam3, ci = TRUE, ci_type = "delta") ndf3 <- ndf %>% add_cumu_hazard(pam3, ci = TRUE, ci_type = "sim", nsim = 100L) expect_true(all(ndf1$cumu_hazard > ndf1$cumu_lower & ndf1$cumu_hazard < ndf1$cumu_upper)) expect_true(all(ndf2$cumu_hazard > ndf2$cumu_lower & ndf2$cumu_hazard < ndf2$cumu_upper)) expect_true(all(ndf3$cumu_hazard > ndf3$cumu_lower & ndf3$cumu_hazard < ndf3$cumu_upper)) }) test_that("hazard functions work for PEM", { expect_data_frame(haz <- add_hazard(ped_info(ped), pem), nrows = 5L, ncols = 11L) expect_error(add_hazard(haz, pem)) expect_data_frame(add_hazard(haz, pem, overwrite = TRUE), nrows = 5L, ncols = 11L) }) test_that("cumulative hazard functions work for PAM", { expect_data_frame(add_cumu_hazard(ped_info(ped), bam, ci = FALSE), nrows = 5L, ncols = 8L) expect_data_frame(haz <- add_cumu_hazard(ped_info(ped), pam, ci = FALSE), nrows = 5L, ncols = 8L) expect_data_frame(haz <- add_cumu_hazard(ped_info(ped), pam), nrows = 5L, ncols = 10L) expect_equal(round(haz$cumu_hazard, 2), c(.03, .06, .12, .18, .24)) expect_equal(round(haz$cumu_lower, 2), c(.02, .04, .08, .12, .15)) expect_equal(all(diff(haz$cumu_hazard) >= 0), TRUE) # overwrite works expect_data_frame(add_cumu_hazard(haz, pam, overwrite = TRUE), nrows = 5L, ncols = 10L) # error on wrong input expect_error(add_cumu_hazard(haz, pam)) ## test that cumu_hazard works for grouped data grouped_haz <- ped %>% group_by(complications) %>% ped_info() %>% add_cumu_hazard(pam) expect_data_frame(grouped_haz, nrows = 10L, ncols = 10L) expect_equal(round(grouped_haz$cumu_hazard, 2), c(.03, .06, .12, .18, .24, .06, .13, .25, .37, .49)) ## delta method haz2 <- ped_info(ped) %>% add_cumu_hazard(pam, ci_type = "delta") expect_equal(round(haz2$cumu_upper, 2), c(.05, .09, .18, .25, .33)) expect_equal(round(haz2$cumu_lower, 2), c(.01, .03, .07, .11, .15)) suppressWarnings(RNGversion("3.5.0")) ## sim CI (0.95) set.seed(123) haz3 <- ped_info(ped) %>% add_cumu_hazard(pam, ci_type = "sim") expect_equal(round(haz3$cumu_upper, 2), c(.06, .11, .19, .25, .34)) expect_equal(round(haz3$cumu_lower, 2), c(.02, .04, .08, .13, .17)) ## check that hazard columns are not deleted newdata <- ped_info(ped) %>% add_hazard(pam) %>% add_cumu_hazard(pam) expect_data_frame(newdata, nrows = 5L, ncols = 14L) newdata <- ped_info(ped) %>% add_hazard(pam, ci = FALSE) %>% add_cumu_hazard(pam) expect_data_frame(newdata, nrows = 5L, ncols = 11L) }) test_that("cumulative hazard function work for arbitrary time points", { ndf1 = ped |> make_newdata(tend = unique(tend)[1:3], age = c(60, 70)) |> group_by(age) |> add_cumu_hazard(pam2) ndf2 = ped |> make_newdata(tend = unique(tend)[3], age = c(60, 70)) |> group_by(age) |> add_cumu_hazard(pam2) expect_equal(ndf1$cumu_hazard[3], ndf2$cumu_hazard[1]) expect_equal(ndf1$cumu_hazard[6], ndf2$cumu_hazard[2]) }) test_that("cumulative hazard functions work for PEM", { expect_data_frame(haz <- add_cumu_hazard(ped_info(ped), pem), nrows = 5L, ncols = 10L) expect_error(add_cumu_hazard(haz, pem)) expect_data_frame(add_cumu_hazard(haz, pem, overwrite = TRUE), nrows = 5L, ncols = 10L) }) test_that("adding terms works for PAM", { # standard ndf2 <- make_newdata(ped, age = seq_range(age, 3)) pred2 <- ndf2 %>% add_term(pam2, term = "age") expect_equal(round(pred2$fit, 3), c(-.604, -.236, .851)) expect_data_frame(pred2, nrows = 3L, ncols = 12L) # with custom reference pred2 <- ndf2 %>% add_term(pam2, term = "age", reference = list(age = mean(.$age))) expect_equal(round(pred2$fit, 3), c(-.368, 0, 1.087)) expect_data_frame(pred2, nrows = 3L, ncols = 12L) expect_equal(pred2$fit[2], 0) # with overall function application pred3 <- ndf2 %>% add_term(pam2, term = "age", reference = identity(.)) expect_equal(pred3$fit, rep(0, 3)) expect_data_frame(pred3, nrows = 3L, ncols = 12L) expect_equal(pred3$fit, rep(0, 3)) # with separately created data frame df_mean <- sample_info(ndf2) pred4 <- ndf2 %>% add_term(pam2, term = "age", reference = df_mean) expect_equal(pred4$fit, pred2$fit) }) test_that("adding terms works for PEM", { expect_data_frame(term <- add_term(ped_info(ped), pem, term = "complications"), nrows = 5L, ncols = 10L) expect_data_frame(ped_info(ped) %>% add_term(pem, term = "age", reference = list(age = mean(.$age))), nrows = 5L, ncols = 10L) }) # test_that("warns about / aborts for unknown intervals", { # # not needed anymore (sanity is checked when applied to ped data, anything else we can't check) # # weird <- make_newdata(ped_info(ped), tend = c(150), interval = c("(1.4, 4]")) # # expect_warning(add_hazard(weird, pam), "not equivalent") # # expect_error(add_hazard(weird, pem), "not equivalent") # }) test_that("works for nonstandard baseline arguments", { pseudonymous <- ped %>% dplyr::rename(stop = tend, int = interval) pseudonymous <- pseudonymous %>% dplyr::mutate(length = stop - tstart) ped <- ped %>% dplyr::mutate(intlen = tend - tstart) p_pam <- mgcv::gam(ped_status ~ s(stop, k = 5) + complications, data = pseudonymous, family = poisson(), offset = offset) p_pem <- glm(ped_status ~ 0 + int + complications, data = pseudonymous, family = poisson(), offset = offset) expect_equal( add_hazard(pseudonymous[1:5, ], p_pam, time_var = "stop")$hazard, add_hazard(ped[1:5, ], pam)$hazard) expect_equal( add_hazard(pseudonymous[1:5, ], p_pem, time_var = "int")$hazard, add_hazard(ped[1:5, ], pem)$hazard) expect_equal( add_cumu_hazard(pseudonymous[1:5, ], p_pam, time_var = "stop", interval_length = length)$cumu_hazard, add_cumu_hazard(ped[1:5, ], pam)$cumu_hazard) expect_equal( add_cumu_hazard(pseudonymous[1:5, ], p_pem, time_var = "int", interval_length = length)$cumu_hazard, add_cumu_hazard(ped[1:5, ], pem)$cumu_hazard) expect_equal( add_cumu_hazard(pseudonymous[1:5, ], p_pem, time_var = "int", interval_length = "length")$cumu_hazard, add_cumu_hazard(ped[1:5, ], pem)$cumu_hazard) }) ## test surv_prob test_that("survival probabilities functions work for PAM", { suppressWarnings(RNGversion("3.5.0")) expect_data_frame(add_surv_prob(ped_info(ped), bam, ci = FALSE), nrows = 5L, ncols = 8L) expect_data_frame(surv <- add_surv_prob(ped_info(ped), pam, ci = FALSE), nrows = 5L, ncols = 8L) expect_data_frame( surv <- add_surv_prob(ped_info(ped), pam), nrows = 5L, ncols = 10L) stest <- sapply(surv[, c("surv_prob", "surv_lower", "surv_upper")], function(z) { all(z >= 0 & z <= 1) }) expect_identical(all(stest), TRUE) expect_identical(round(surv$surv_prob, 2), c(0.97, 0.94, 0.88, 0.83, 0.79)) expect_identical(round(surv$surv_lower, 2), c(0.95, 0.90, 0.83, 0.76, 0.68)) expect_identical(round(surv$surv_upper, 2), c(0.98, 0.96, 0.92, 0.89, 0.86)) # check that overwrite works expect_data_frame(add_surv_prob(surv, pam, overwrite = TRUE), nrows = 5L, ncols = 10L) # error on wrong input expect_error(add_surv_prob(surv, pam)) ## test that cumu_hazard works for grouped data grouped_surv <- ped %>% group_by(complications) %>% ped_info() %>% add_surv_prob(pam) expect_data_frame(grouped_surv, nrows = 10L, ncols = 10L) expect_equal(round(grouped_surv$surv_prob, 2), c(0.97, 0.94, 0.88, .83, .79, .94, 0.88, .78, .69, .61)) ## delta CI surv2 <- add_surv_prob(ped_info(ped), pam, ci_type = "delta") expect_equal(round(surv2$surv_lower, 2), c(.95, .91, .84, .78, .72)) expect_equal(round(surv2$surv_upper, 2), c(.99, .97, .93, .89, .86)) # sim CI set.seed(123) surv3 <- add_surv_prob(ped_info(ped), pam, ci_type = "sim") expect_equal(round(surv3$surv_lower, 2), c(.94, .90, .83, .78, .71)) expect_equal(round(surv3$surv_upper, 2), c(.98, .96, .92, .88, .84)) }) test_that("CIF works with pamm", { set.seed(211758) df <- data.frame(time = rexp(20), status = sample(c(0,1, 2), 20, replace = TRUE)) ped_cr <- as_ped(df, Surv(time, status)~., id = "id") %>% mutate(cause = as.factor(cause)) pam <- pamm(ped_status ~ s(tend, by = cause), data = ped_cr) ndf <- ped_cr %>% make_newdata(tend = unique(tend), cause = unique(cause)) %>% group_by(cause) %>% add_cif(pam) expect_data_frame(ndf, nrows = 26L, ncols = 11L) expect_subset(c("cif", "cif_lower", "cif_upper"), colnames(ndf)) expect_true(all(ndf$cif < ndf$cif_upper)) expect_true(all(ndf$cif > ndf$cif_lower)) expect_true(all(ndf$cif <= 1 & ndf$cif >= 0)) expect_true(all(ndf$cif_lower <= 1 & ndf$cif_lower >= 0)) expect_true(all(ndf$cif_upper <= 1 & ndf$cif_upper >= 0)) }) test_that("CIF works with mgcv::gam", { set.seed(211758) df <- data.frame(time = rexp(20), status = sample(c(0,1, 2), 20, replace = TRUE)) ped_cr <- as_ped(df, Surv(time, status)~., id = "id") %>% mutate(cause = as.factor(cause)) pam <- gam(ped_status ~ s(tend, by = cause), data = ped_cr, family = poisson(), offset = offset) ndf <- ped_cr %>% make_newdata(tend = unique(tend), cause = unique(cause)) %>% group_by(cause) %>% add_cif(pam) expect_data_frame(ndf, nrows = 26L, ncols = 11L) expect_subset(c("cif", "cif_lower", "cif_upper"), colnames(ndf)) expect_true(all(ndf$cif < ndf$cif_upper)) expect_true(all(ndf$cif > ndf$cif_lower)) expect_true(all(ndf$cif <= 1 & ndf$cif >= 0)) expect_true(all(ndf$cif_lower <= 1 & ndf$cif_lower >= 0)) expect_true(all(ndf$cif_upper <= 1 & ndf$cif_upper >= 0)) }) test_that("CIF works with character causes", { set.seed(211758) df <- data.frame(time = rexp(20), status = sample(c(0,1, 2), 20, replace = TRUE)) ped_cr <- as_ped(df, Surv(time, status)~., id = "id") %>% mutate(cause = factor(cause, labels = c("Death", "Discharge"))) pam <- pamm(ped_status ~ s(tend, by = cause), data = ped_cr) ndf <- ped_cr %>% make_newdata(tend = unique(tend), cause = unique(cause)) %>% group_by(cause) %>% add_cif(pam) expect_data_frame(ndf, nrows = 26L, ncols = 11L) expect_subset(c("cif", "cif_lower", "cif_upper"), colnames(ndf)) expect_true(all(ndf$cif < ndf$cif_upper)) expect_true(all(ndf$cif > ndf$cif_lower)) expect_true(all(ndf$cif <= 1 & ndf$cif >= 0)) expect_true(all(ndf$cif_lower <= 1 & ndf$cif_lower >= 0)) expect_true(all(ndf$cif_upper <= 1 & ndf$cif_upper >= 0)) }) test_that("Transition Probability works", { ndf <- ped_msm %>% make_newdata(tend = unique(tend), transition = unique(transition)) %>% group_by(transition) %>% arrange(transition, tend) |> add_trans_prob(pam_msm, ci=T) expect_data_frame(ndf, nrows = 380L, ncols = 11L) expect_subset(c("trans_prob", "trans_lower", "trans_upper"), colnames(ndf)) expect_true(all(ndf$trans_prob < ndf$trans_upper)) expect_true(all(ndf$trans_prob > ndf$trans_lower)) expect_true(all(ndf$trans_prob <= 1 & ndf$trans_prob >= 0)) expect_true(all(ndf$trans_lower <= 1 & ndf$trans_lower >= 0)) expect_true(all(ndf$trans_upper <= 1 & ndf$trans_upper >= 0)) }) pammtools/tests/testthat/test-formula-utils.R0000644000176200001440000000110014222504522021160 0ustar liggesuserscontext("Formula utility functions") test_that("Formula utilities work", { expect_identical(get_rhs_vars(~ x1 + sqrt(x2)), c("x1", "x2")) expect_identical(get_rhs_vars("~ x1 + sqrt(x2)"), c("x1", "x2")) expect_identical(get_tdc_vars( ~ x1 + cumulative(z.tz, tz_var = "tz")), "z.tz") expect_identical(get_ped_form(Surv(time, status) ~ x1 + cumulative(z.tz, tz_var = "tz")), Surv(time, status) ~ x1 ) expect_true(has_lhs(Surv(time, status) ~ .)) expect_identical(get_lhs_vars("Surv(time, status) ~ ."), c("time", "status")) expect_false(has_lhs( ~ .)) }) pammtools/tests/testthat.R0000644000176200001440000000031613720452276015422 0ustar liggesusersSys.setenv("R_TESTS" = "") # see https://github.com/hadley/testthat/issues/86 library(testthat) library(checkmate) library(dplyr) library(purrr) library(tidyr) # library(pammtools) test_check("pammtools") pammtools/MD50000644000176200001440000001715615144617062012615 0ustar liggesusersd60062de5d6dda167ad24fc1e3366b8f *DESCRIPTION ca61e01cf34f5d70bd57b9a4a30d24ec *LICENSE 9ca66374a08fc4cf0becb02c0a7a9963 *NAMESPACE 1f8ac4a6ba3308f41b497dd7ce81d6ea *NEWS.md d7d093b6edbe54c6f4527ce6b6af07cb *R/add-functions.R c91d0a99f9bb2d199abd5bc27d8893f3 *R/as-ped.R 3f61ce9f39da484d22810b28220b40d3 *R/convenience-plots.R e62e60832866bef26221ccb2ddefc778 *R/cumulative-coefficient.R 67fe16331ac73ea62440316cf7c82253 *R/cumulative-effect.R 2764cd5eb865f3481e1b9ec80530702a *R/data.R 35e143b1895415a20832e1b2a3456f91 *R/formula-specials.R fd88f3ad167d200070cdaaf5e5c1df95 *R/formula-utils.R 078062e22a0c6cec0bc52e6f81b5be03 *R/geom-hazard.R 6bb67b243ebee7330ece4ac62a3171af *R/get-cut-points.R 17188fb86f8087f5186b840938b43941 *R/get-terms.R a86c8565698f5ea9dd62503b46826686 *R/ggplot-extensions.R 6db0c91c3a5a35fce4b7ed07b389649b *R/helpers.R 93205682208b100db98a247371ea5fe3 *R/interval-information.R 8a27c85e5781ef604e13c0bdd1731923 *R/lag-lead-utils.R 247d09677fbb7a0cd0454a71252c7745 *R/make-newdata.R 0b78d666eacdc1bc4714f128e6ad42af *R/model-evaluation.R d0bd9597f1e97e02663125b582a27d81 *R/multi-state-helpers.R 14e6452e0ff1451603e218420b3a36c7 *R/nest-utils.R f374a6eab2f5f8a8a0cb8cf19396e3ec *R/pammfit.R 1c06fca42dfd551e6376476c752d5551 *R/pammtools.R e8e0f7338e175f88c710ef13a37ad09a *R/penalized-lag-lead.R 0b6ba5a799164b7d9dce91e962c4987e *R/predict.R 1e7b06dc9f0c7509f1a8dee97ce946bc *R/rpexp.R f8a3f543f6bb56a8a508f6f74056053b *R/sim-pexp.R 18ccef22c399e58e95befaae8908b860 *R/split-data.R 413aeabe9159438f01f834c6ba2aacfa *R/sysdata.rda c7249e05cb8d639e277f5a8642d7d38b *R/tdc-utils.R b1db0f479df4a5202918deb41f3cc071 *R/tidiers.R c3686f8fb61239ca8545448687f590e4 *R/tidyverse-methods.R 8d2487dbf45064f33b08e5a80830b68e *R/utils-pipe.R d1e5a78d24b84f3ed026ff8710e51cd1 *R/viz-elra.R 8ad607642ea70bc4db3c00d2cd3dd427 *R/warnings.R 265fed722b80b9bd277252760ad8c5b7 *R/zzz.R addb10cd984000d323a509cf3561940e *README.md 6ae12af754ce37cd2f4b660aadcb8d29 *data/daily.rda 35c1e5c5a412c5b0852e7a2d96c52b82 *data/patient.rda d36f8046a5d763cff479528f534a4cd0 *data/simdf_elra.rda 3d81b95c03378a3f9b7d69777fba5d9b *data/staph.rda c9cdaeccbdb50c2aa6fd97c440a8e404 *data/tumor.rda 34feb58ccd1b09ac21107e8cd51f4eba *inst/CITATION 02f3bf1bc7e491655c06ec9da1e2ca45 *man/add_cif.Rd 95bc689df748460a0eac52cf4abe87a5 *man/add_counterfactual_transitions.Rd acfe0706866a94798c3fd66715bc7afe *man/add_hazard.Rd c1232b509c0fc5e933077136f56473e5 *man/add_surv_prob.Rd a35cc185f797ade470e55dcc852ec66d *man/add_tdc.Rd cd4c8fd5da08daf7a7f3d827612a49e4 *man/add_term.Rd c653ac915c98ae3e2b60f6ee0312ff6d *man/add_trans_ci.Rd 839e16ecd8fe5e1154c9439abfa991b9 *man/add_trans_prob.Rd f23b8c6d7b7981dd7127565ae085fd64 *man/as.data.frame.crps.Rd aed69158e6eb980b756f7de35a76d808 *man/as_ped.Rd 5e7315f0892e1d1c38232553d818b409 *man/as_ped_cr.Rd 5fd0840eb74f9c898aadbb8dc65c098a *man/calc_ci.Rd c634103495de152fbd207f5508ea0426 *man/combine_df.Rd 3f74de30d3830116dc24bd4acccd0441 *man/compute_cumu_diff.Rd f318647d52f86416c7faeb5dab14d1fe *man/cumulative_coefficient.Rd 39a96a6d355ed7f11b4b812904b459d7 *man/daily.Rd 7decc32ba7ceece7f5f71b704c39ebe7 *man/dplyr_verbs.Rd 34389f1b1fe0195b48917130e821ed1f *man/elra_matrix.Rd 902f3ad830b5e604402f5d57c52728f9 *man/fcumu.Rd f030bbfa43e833a62b529713607fa689 *man/figures/logo.png f8939a28334b642fe86bd05bcb446648 *man/formula_helpers.Rd 7cc6d16e99e7068d1de227603dfa6c57 *man/from_to_pairs.Rd 9dbc97cd8e3ff22f201c1f7b592602cf *man/geom_hazard.Rd 0c9bd66e487c5e12d6b6752b2952efb8 *man/geom_stepribbon.Rd 25569eb3e5aaca58499ed937084c0e11 *man/get_cif.Rd fadfa1885b2dbe4efaa22173e833d422 *man/get_cumu_eff.Rd 381247c6aa47ff3872dce3b0bd2d0395 *man/get_cumu_hazard.Rd 2207dbaa922f2929821f3cfeb93da402 *man/get_cumulative.Rd 073fff7e0f08af7294854ba0a3307316 *man/get_cut.Rd a80195a57e043adfe750fee99746fb00 *man/get_event_types.Rd 4181aed2f2000dc663a9cbd45e3e705e *man/get_hazard.Rd 5669a57f85c29b57deb6123bdfec966f *man/get_intervals.Rd 1c3b03537b5fa872ccac93dc93ddcd4d *man/get_laglead.Rd c8c1121509cc2f5f3d99ab5f4e1c74a9 *man/get_ped_form.Rd ccf4b710769a91e5733fa31fca7ddc7e *man/get_plotinfo.Rd 041aa8f5d15273a9e20420bbcd51e4be *man/get_sim_ci.Rd 67eaf4514b6c4c76e0b38d091755ede7 *man/get_sim_cumu.Rd 5e7bd6dc469599ecd631f26a4f33b33f *man/get_surv_prob.Rd 2d04296e0da7e76a97b00d675e13605f *man/get_tdc_form.Rd 8e5c6096e82e71c90f9398656b38fcd1 *man/get_tdc_vars.Rd 0b64ed3dee90bed14bfb51c76ed1d607 *man/get_term.Rd 5783cbf88c5eca45ce8db9057558da24 *man/get_terms.Rd a8ca2992dec741914357445add65cc35 *man/gg_fixed.Rd 370888d945fd6e4990217d42b4bd297a *man/gg_laglead.Rd 12929d59d913d16969b6ec105af48574 *man/gg_partial.Rd aeddbf6e6fab268a795a98ed29fd170f *man/gg_re.Rd 2ea58e9a00defefe754270cc9ec772e6 *man/gg_slice.Rd 761d9db7c3eedb77ec4aba4f08743f46 *man/gg_smooth.Rd 96125f30e6a0b6da2e578ac10a22e77c *man/gg_tensor.Rd 4a905c88f295bca227d350a9ad61d28b *man/has_tdc.Rd 354c8c7b17db153fe62e8e9a4ab18f09 *man/int_info.Rd f1be9377952f78dfbef1833a16bc902c *man/make_X.Rd 5123671de6c24b96af3165c4d4391c3c *man/make_X.scam.Rd 8feec77043e287827042b80ee3835421 *man/modus.Rd 295c9cedf816cbaa4dcc211fd5bc368a *man/nest_tdc.Rd 67e31ed2a1b73ff1a501690c2925a696 *man/newdata.Rd 7589766dec76a8e6be77c43e97c5fdea *man/pamm.Rd 30ee310a4b9a9e6d48ca8ab92c7b4142 *man/pammtools.Rd 3e78c2aca8fca53a5919d86beecc8aba *man/patient.Rd 422596eb4ae376289c6e599d4eb8534f *man/ped_info.Rd 1f7896a1b866ff9ae89ba35be7c7b6f1 *man/pipe.Rd 7245d5d20f2e6f1e0ce0545ae9205212 *man/predictSurvProb.pamm.Rd 5e2b14eba50f994b1f2a794a74ed3174 *man/prep_concurrent.Rd 02f56e86b9aeef5e5a554a0e2ffe55b7 *man/rpexp.Rd 5aaf7619714262912c7d7594e654ce46 *man/sample_info.Rd 45436d54473cce841a87f376ef0f8c89 *man/seq_range.Rd c4f365e8532c585205b5315f09576c5f *man/sim_pexp.Rd 24f743a2776c72babd18c6f160d53c8e *man/sim_pexp_cr.Rd 9e58649289fd3c71c7793263c37b6a4f *man/simdf_elra.Rd 0ca7e414cafba34f51e161d34420ca2a *man/smooth.construct.fdl.smooth.spec.Rd 2278f59cb602a18ceeb3d30ffefebc79 *man/specials.Rd 34c589f1a2631b2adab56a3544825ed1 *man/split_data.Rd 8410368c17d0e7d629708d787374d0a9 *man/split_data_multistate.Rd 046f06801f17bd643fc4e93980d08c93 *man/staph.Rd 6df42c3fd7140c481dec801fa28cd367 *man/tidiers.Rd 00e7fbe06eb573be2e9a0333ed41aac4 *man/tidy_fixed.Rd d7bd704f2980cd65464de3983b18ffb3 *man/tidy_smooth.Rd 97704482f1e9d5b1ed6f104400b263de *man/tidy_smooth2d.Rd 85a79072670eff59dc545271128110cf *man/tumor.Rd 3aab2351d93a7b720b7ae7ee33e47343 *man/warn_about_new_time_points.Rd f6d8b6178d9612ee164718b2d9eb8afe *man/warn_about_new_time_points.glm.Rd d2e4d5c85f2bb9eb08e44d7d223f6e92 *tests/testthat.R 01cf071b73f86cf21c449d986308f340 *tests/testthat/test-add-functions.R 26641a7b66772267a8022787cbc37c3d *tests/testthat/test-as-ped-cr.R 83b9448c1a0573fd93d4dda13983501b *tests/testthat/test-as-ped.R 846b652972194986e4164f52b9bae284 *tests/testthat/test-cumulative-coefficients.R 1f05eb2391bc18f7eb3bf5be43da51bb *tests/testthat/test-cumulative-effect.R 36e944a4330618b15f432636785d2a09 *tests/testthat/test-formula-utils.R e53614a6934375607abe9d93e2359e59 *tests/testthat/test-interval-functions.R 2be39683ae16103c3c4f133013d1c248 *tests/testthat/test-mgcv-convenience.R 8f2eb7710ad4cc642fb539e1a8f382c8 *tests/testthat/test-model-evaluation.R 98422ad4efe99c9289fbc8a60d45e91a *tests/testthat/test-newdata.R 65d8977408412b2ae9516b1daef1bca2 *tests/testthat/test-pamm-fit.R b3ea56865f02e1cf560fee6b75c848d7 *tests/testthat/test-predict-functions.R f48cb63b9e6bd2fdace8cc66485e6f87 *tests/testthat/test-simple-transform.R 55a7c2a950c832360f7da787c846f6d7 *tests/testthat/test-simulation.R 3a42ab4d5c8e156683b1f21e3cab6db7 *tests/testthat/test-specials.R ce23352ba57ee9b687ab589cac88a49c *tests/testthat/test-tdc-transform.R be64b75d909f4d6344b907537ce7f140 *tests/testthat/test-tidyverse-S3methods.R pammtools/R/0000755000176200001440000000000015144603076012474 5ustar liggesuserspammtools/R/pammtools.R0000644000176200001440000000613314767027042014640 0ustar liggesusers#' pammtools: Piece-wise exponential Additive Mixed Modeling tools. #' #' \code{pammtools} provides functions and utilities that facilitate fitting #' Piece-wise Exponential Additive Mixed Models (PAMMs), including data #' transformation and other convenience functions for pre- and post-processing #' as well as plotting. #' #' The best way to get an overview of the functionality provided and how to #' fit PAMMs is to view the vignettes #' available at \url{https://adibender.github.io/pammtools/articles/}. #' A summary of the vignettes' content is given below: #' #' \itemize{ #' \item \href{https://adibender.github.io/pammtools/articles/basics.html}{basics}: #' Introduction to PAMMs and basic modeling. #' \item \href{https://adibender.github.io/pammtools/articles/baseline.html}{baseline}: #' Shows how to estimate and visualize baseline model (without covariates) and #' comparison to respective Cox-PH model. #' \item \href{https://adibender.github.io/pammtools/articles/convenience.html}{convenience}: #' Convenience functions for post-processing and plotting PAMMs. #' \item \href{https://adibender.github.io/pammtools/articles/data-transformation.html}{data-transformation}: #' Transforming data into a format suitable to fit PAMMs. #' \item \href{https://adibender.github.io/pammtools/articles/frailty.html}{frailty}: #' Specifying "frailty" terms, i.e., random effects for PAMMs. #' \item \href{https://adibender.github.io/pammtools/articles/splines.html}{splines}: #' Specifying spline smooth terms for PAMMs. #' \item \href{https://adibender.github.io/pammtools/articles/strata.html}{strata}: #' Specifying stratified models in which each level of a grouping variable has a #' different baseline hazard. #' \item \href{https://adibender.github.io/pammtools/articles/tdcovar.html}{tdcovar}: #' Dealing with time-dependent covariates. #' \item \href{https://adibender.github.io/pammtools/articles/tveffects.html}{tveffects}: #' Specifying time-varying effects. #' \item \href{https://adibender.github.io/pammtools/articles/left-truncation.html}{left-truncation}: #' Estimation for left-truncated data. #'\item \href{https://adibender.github.io/pammtools/articles/competing-risks.html}{competing-risks}: #' Competing risks analysis. #' } #' #' @name pammtools #' @keywords internal #' @references #' Bender, Andreas, Andreas Groll, and Fabian Scheipl. 2018. #' “A Generalized Additive Model Approach to Time-to-Event Analysis†#' Statistical Modelling, February. https://doi.org/10.1177/1471082X17748083. #' #' Bender, Andreas, Fabian Scheipl, Wolfgang Hartl, Andrew G. Day, and Helmut Küchenhoff. 2019. #' “Penalized Estimation of Complex, Non-Linear Exposure-Lag-Response Associations.†#' Biostatistics 20 (2): 315–31. https://doi.org/10.1093/biostatistics/kxy003. #' #' Bender, Andreas, and Fabian Scheipl. 2018. #' “pammtools: Piece-Wise Exponential Additive Mixed Modeling Tools.†#' ArXiv:1806.01042 Stat, June. https://arxiv.org/abs/1806.01042. #' Ramjith J, Bender A, Roes KCB, Jonker MA. Recurrent events analysis #' with piece-wise exponential additive mixed models. 2022. Statistical #' Modelling., 2022 "_PACKAGE" NULL pammtools/R/interval-information.R0000644000176200001440000001271314767027042016775 0ustar liggesusers#' Create start/end times and interval information #' #' Given interval breaks points, returns data frame with information on #' interval start time, interval end time, interval length and a factor #' variable indicating the interval (left open intervals). If an object of class #' \code{ped} is provided, extracts unique interval information from object. #' #' @param x A numeric vector of cut points in which the follow-up should be #' partitioned in or object of class \code{ped}. #' @param ... Currently ignored. #' @rdname int_info #' @return A data frame containing the start and end times of the #' intervals specified by the \code{x} argument. Additionally, the interval #' length, interval mid-point and a factor variable indicating the intervals. #' @export int_info <- function(x, ...) { UseMethod("int_info", x) } #' @param min_time Only intervals that have lower borders larger than #' this value will be included in the resulting data frame. #' @import checkmate dplyr #' @examples #' ## create interval information from cut points #' int_info(c(1, 2.3, 5)) #' #' @rdname int_info #' @export int_info.default <- function( x, min_time = 0L, ...) { # check inputs assert_numeric(x, lower = 0, any.missing = FALSE) assert_numeric(min_time, lower = 0L) # sort x and add origin if necessary if (is.unsorted(x)) { x <- sort(x) } if (min(x) != 0) { x <- c(0, x) } tstart <- x[-length(x)] tend <- x[-1] tdf <- data.frame( tstart = tstart, tend = tend, intlen = tend - tstart) %>% mutate( intmid = .data$tstart + .data$intlen / 2, interval = paste0("(", .data$tstart, ",", .data$tend, "]"), interval = factor(.data$interval, levels = unique(.data$interval)) ) filter(tdf, tstart >= min_time) } #' @rdname int_info #' @export int_info.data.frame <- function( x, min_time = 0L, ...) { # check inputs assert_data_frame(x, types = "numeric", any.missing = FALSE, ncols = 2) # assert_numeric(min_time, lower = 0L) stopifnot(all(x[,1] < x[,2])) # sort x and add origin if necessary if (is.unsorted(x[,1])) { x <- x[order(x[,1], x[,2]), ] } colnames(x) <- c("tstart", "tend") x[["intlen"]] <- x[, 2] - x[, 1] x[["intmid"]] <- x[, 1] + x[, "intlen"] / 2 x[["interval"]] <- paste0("(", x[, 1], ",", x[, 2], "]") x[["interval"]] <- factor(x[["interval"]], levels = x[["interval"]]) x[x[["tstart"]] >= min_time, ] } #' @import dplyr #' @rdname int_info #' @examples #' ## extract interval information used to create ped object #' tdf <- data.frame(time=c(1, 2.3, 5), status=c(0, 1, 0)) #' ped <- tdf %>% as_ped(Surv(time, status)~., id="id") #' int_info(ped) #' #' @seealso as_ped ped_info #' @export int_info.ped <- function(x, ...) { int_info(attr(x, "breaks"), ...) } #' @rdname int_info #' @export #' @keywords internal int_info.pamm <- function(x, ...) { int_info(x[["attr_ped"]][["breaks"]],...) } #' Information on intervals in which times fall #' #' @inheritParams int_info #' @param x An object from which interval information can be obtained, #' see \code{\link{int_info}}. #' @param times A vector of times for which corresponding interval information #' should be returned. #' @param ... Further arguments passed to \code{\link[base]{findInterval}}. #' @import dplyr #' @return A \code{data.frame} containing information on intervals in which #' values of \code{times} fall. #' @seealso \code{\link[base]{findInterval}} \code{\link{int_info}} #' @rdname get_intervals #' @export #' @examples #' set.seed(111018) #' brks <- c(0, 4.5, 5, 10, 30) #' int_info(brks) #' x <- runif (3, 0, 30) #' x #' get_intervals(brks, x) get_intervals <- function(x, times, ...) { UseMethod("get_intervals", x) } #' @rdname get_intervals #' @inheritParams base::findInterval #' @export get_intervals.default <- function( x, times, left.open = TRUE, rightmost.closed = TRUE, ...) { # check inputs assert_numeric(times, lower = 0, finite = TRUE, all.missing = FALSE) int_df <- int_info(x) int <- findInterval( x = times, vec = c(int_df$tstart[1], int_df$tend), left.open = left.open, rightmost.closed = rightmost.closed) int_df %>% slice(int) %>% mutate(times = times) %>% select(times, everything()) } #' Extract interval information and median/modus values for covariates #' #' Given an object of class \code{ped}, returns data frame with one row for each #' interval containing interval information, mean values for numerical #' variables and modus for non-numeric variables in the data set. #' #' @param ped An object of class \code{ped} as returned by #' \code{\link[pammtools]{as_ped}}. #' @import checkmate dplyr #' @examples #' ped <- tumor[1:4,] %>% as_ped(Surv(days, status)~ sex + age) #' ped_info(ped) #' @export #' @return A data frame with one row for each unique interval in \code{ped}. #' @seealso \code{\link[pammtools]{int_info}}, \code{\link[pammtools]{sample_info}} ped_info <- function(ped) { UseMethod("ped_info", ped) } #' @rdname ped_info #' @export ped_info.ped <- function(ped) { int_df <- int_info(ped) sdf <- sample_info(ped) if (is.null(sdf)) { return(int_df) } else { int_df <- bind_cols( int_df %>% slice(rep(seq_len(nrow(int_df)), times = nrow(sdf))), sdf %>% slice(rep(seq_len(nrow(sdf)), each = nrow(int_df)))) %>% grouped_df(vars = group_vars(sdf)) } attr(int_df, "trafo_args") <- attr(ped, "trafo_args") attr(int_df, "intvars") <- attr(ped, "intvars") int_df } pammtools/R/penalized-lag-lead.R0000644000176200001440000000637414767232143016253 0ustar liggesusers#' New basis for penalized lag selection #' #' Originally proposed in Obermeier et al., 2015, Flexible Distributed Lags for Modelling Earthquake Data, #' Journal of the Royal Statistical Society: Series C (Applied Statistics), #' 10.1111/rssc.12077. #' Here extended in order to penalize lead times in addition to lag times. #' Ideally the lag-lead window would then be selected in a data-driven fashion. #' Treat as experimental. #' #' @param object An object handled by mgcv #' @param data The data set #' @param knots A vector of knots #' @keywords internal smooth.construct.fdl.smooth.spec <- function(object, data, knots) { # modify object so that it's fitted as a p-spline signal regression term: object$bs <- "ps" object <- mgcv::smooth.construct.ps.smooth.spec(object, data, knots) if (!is.null(object$xt$fullrankpen) && object$xt$fullrankpen) { # add ridge penalty to first +1 (=m+2) basis functions with # same variance as difference penalty : penalty = lambda * coef' (DiffPen + # RidgePen) coef object$S[[1]][cbind(1:(object$m[1] + 2), 1:(object$m[1] + 2))] <- object$S[[1]][cbind(1:(object$m[1] + 2), 1:(object$m[1] + 2))] + 1 object$rank <- min(object$bs.dim, object$rank + object$m[1] + 2) } if (!is.null(object$xt$ridge) && object$xt$ridge) { # add lag-lead penalty to first and last +1 (=m+2) basis functions penalty # = coef' (lambda_1*DiffPen + lambda_2*LagLeadPen) coef if (!is.null(object$xt$leadpen) && !is.null(object$xt$lagpen) && object$xt$leadpen && object$xt$lagpen) { object$S[[2]] <- matrix(0, object$bs.dim, object$bs.dim) # penalize lead object$S[[2]][cbind(1:(object$m[1] + 2), 1:(object$m[1] + 2))] <- 1 # penalize lag object$S[[2]][cbind((object$bs.dim - (object$m[1] + 2) + 1): object$bs.dim, (object$bs.dim - (object$m[1] + 2) + 1): object$bs.dim)] <- 1 object$rank <- c(object$rank, min(2*(object$m[1] + 2), object$bs.dim)) } else if (!is.null(object$xt$leadpen) && object$xt$leadpen) { # add ridge penalty (lead penalty) to first +1 (=m+2) basis functions penalty # = coef' (lambda_1*DiffPen + lambda_2*RidgePen) coef object$S[[2]] <- matrix(0, object$bs.dim, object$bs.dim) object$S[[2]][cbind(1:(object$m[1] + 2), 1:(object$m[1] + 2))] <- 1 object$rank <- c(object$rank, object$m[1] + 2) } else if (!is.null(object$xt$lagpen) && object$xt$lagpen) { # add lag penalty to last +1 (=m+2) basis functions penalty # = coef' (lambda_1*DiffPen + lambda_2*LagPen) coef object$S[[2]] <- matrix(0, object$bs.dim, object$bs.dim) object$S[[2]][cbind((object$bs.dim - (object$m[1] + 2) + 1): object$bs.dim, (object$bs.dim - (object$m[1] + 2) + 1): object$bs.dim)] <- 1 object$rank <- c(object$rank, object$m[1] + 2) } } if (!is.null(object$xt$constrain) && object$xt$constrain) { # constrain to end in zero (i.e (X%*%coefficients)[1] == 0) --> # Constraint matric C = X[1,] object$C <- matrix(object$X[1, ], nrow = 1) object$C <- structure(object$C, always.apply = TRUE) } return(object) }pammtools/R/tidyverse-methods.R0000644000176200001440000002021614767027042016302 0ustar liggesusersped_classes <- function(ped) { ind_ped <- class(ped) %in% c("ped", "ped_cr", "ped_cr_union", "fped", "nested_fdf") class(ped)[ind_ped] } re_attribute <- function(.data, attr2) { attr1 <- attributes(.data) attributes(.data) <- c(attr1, attr2[setdiff(names(attr1), names(attr2))]) .data } #' @importFrom purrr discard unped <- function(ped, classes_ped = "ped") { class(ped) <- setdiff(class(ped), classes_ped) ped } reped <- function(.data, ped_classes = "ped") { class(.data) <- c(ped_classes, class(.data)) .data } ped_attr <- function( ped, ped_attributes = c("breaks", "id_var", "intvars", "combine", "censor_code", "risks") ) { attr_ped <- attributes(ped) ped_attr_avail <- intersect(names(attr_ped), ped_attributes) attr_ped[ped_attr_avail] } unfped <- function(fped) { class(fped) <- class(fped) %>% discard(~.=="fped") fped } refped <- function(.data) { class(.data) <- c("fped", class(.data)) .data } fped_attr <- function(fped) { attributes(fped)[c("breaks", "id_var", "intvars")] } #' @name dplyr_verbs #' @title \code{dplyr} Verbs for \code{ped}-Objects #' @param .data an object of class \code{ped}, see \code{\link{as_ped}}. #' @param tbl an object of class \code{ped}, see \code{\link{as_ped}}. #' @param x an object of class \code{ped}, see \code{\link{as_ped}}. #' @param ... see \code{dplyr} documentation #' @description See \code{dplyr} documentation of the respective functions for #' description and examples. #' @return a modified \code{ped} object (except for \code{do}) #' @import dplyr #' @aliases arrange filter distinct full_join group_by inner_join left_join mutate rename right_join sample_frac sample_n select slice summarise transmute ungroup #' @keywords internal NULL #------------------------------------------------------------------------------- # single table: grouping/sorting #' @export #' @export arrange #' @rdname dplyr_verbs arrange.ped <- function(.data, ...) { classes_ped <- ped_classes(.data) attr_ped <- attributes(.data) .data <- arrange(unped(.data, classes_ped), ...) .data <- reped(.data, classes_ped) re_attribute(.data, attr_ped) } #' @export #' @export group_by #' @rdname dplyr_verbs group_by.ped <- function(.data, ..., .add = FALSE) { classes_ped <- ped_classes(.data) attr_ped <- attributes(.data) .data <- dplyr::group_by(unped(.data, classes_ped), ..., .add = .add) .data <- reped(.data, classes_ped) re_attribute(.data, attr_ped) } #' @export #' @export ungroup #' @rdname dplyr_verbs ungroup.ped <- function(x, ...) { classes_ped <- ped_classes(x) attr_ped <- attributes(x) x <- ungroup(unped(x, classes_ped), ...) x <- reped(x, classes_ped) re_attribute(x, attr_ped) } #' @export #' @export distinct #' @rdname dplyr_verbs distinct.ped <- function(.data, ..., .keep_all = FALSE) { classes_ped <- ped_classes(.data) attr_ped <- attributes(.data) .data <- distinct(unped(.data, classes_ped), ..., .keep_all = .keep_all) .data <- reped(.data, classes_ped) re_attribute(.data, attr_ped) } #------------------------------------------------------------------------------- # single table: row ops #' @export #' @export filter #' @rdname dplyr_verbs filter.ped <- function(.data, ...) { classes_ped <- ped_classes(.data) attr_ped <- attributes(.data) .data <- filter(unped(.data, classes_ped), ...) .data <- reped(.data, classes_ped) re_attribute(.data, attr_ped) } #' @export #' @export sample_n #' @inheritParams dplyr::sample_n #' @rdname dplyr_verbs sample_n.ped <- function(tbl, size, replace = FALSE, weight = NULL, .env = NULL, ...) { classes_ped <- ped_classes(tbl) attr_ped <- attributes(tbl) tbl <- sample_n(unped(tbl, classes_ped), size, replace, weight, .env, ...) tbl <- reped(tbl, classes_ped) re_attribute(tbl, attr_ped) } #' @export #' @export sample_frac #' @inheritParams dplyr::sample_frac #' @rdname dplyr_verbs sample_frac.ped <- function(tbl, size = 1, replace = FALSE, weight = NULL, .env = NULL, ...) { classes_ped <- ped_classes(tbl) attr_ped <- attributes(tbl) tbl <- sample_n(unped(tbl, classes_ped), size, replace, weight, .env, ...) tbl <- reped(tbl, classes_ped) re_attribute(tbl, attr_ped) } #' @export #' @export slice #' @rdname dplyr_verbs slice.ped <- function(.data, ...) { classes_ped <- ped_classes(.data) attr_ped <- attributes(.data) .data <- slice(unped(.data, classes_ped), ...) .data <- reped(.data, classes_ped) re_attribute(.data, attr_ped) } #------------------------------------------------------------------------------- # single table: column ops #' @export #' @export select #' @rdname dplyr_verbs select.ped <- function(.data, ...) { classes_ped <- ped_classes(.data) attr_ped <- attributes(.data) .data <- select(unped(.data, classes_ped), ...) .data <- reped(.data, classes_ped) re_attribute(.data, attr_ped) } #' @export #' @export mutate #' @rdname dplyr_verbs mutate.ped <- function(.data, ...) { classes_ped <- ped_classes(.data) attr_ped <- attributes(.data) .data <- mutate(unped(.data, classes_ped), ...) .data <- reped(.data, classes_ped) re_attribute(.data, attr_ped) } #' @export #' @export rename #' @rdname dplyr_verbs rename.ped <- function(.data, ...) { classes_ped <- ped_classes(.data) attr_ped <- attributes(.data) .data <- rename(unped(.data, classes_ped), ...) .data <- reped(.data, classes_ped) re_attribute(.data, attr_ped) } #' @export #' @export summarise #' @rdname dplyr_verbs summarise.ped <- function(.data, ...) { classes_ped <- ped_classes(.data) attr_ped <- attributes(.data) .data <- summarise(unped(.data, classes_ped), ...) .data <- reped(.data, classes_ped) re_attribute(.data, attr_ped) } #' @export #' @rdname dplyr_verbs summarize.ped <- summarise.ped #' @export #' @export transmute #' @rdname dplyr_verbs transmute.ped <- function(.data, ...) { classes_ped <- ped_classes(.data) attr_ped <- attributes(.data) .data <- transmute(unped(.data, classes_ped), ...) .data <- reped(.data, classes_ped) re_attribute(.data, attr_ped) } #------------------------------------------------------------------------------- # joins #' @inheritParams dplyr::inner_join #' @export #' @export inner_join #' @rdname dplyr_verbs inner_join.ped <- function(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) { classes_ped_x <- ped_classes(x) classes_ped_y <- ped_classes(y) attr_ped_x <- attributes(x) .data <- inner_join(unped(x, classes_ped_x), unped(y, classes_ped_y), by, copy, suffix, ...) .data <- reped(.data, classes_ped_x) re_attribute(.data, attr_ped_x) } #' @inheritParams dplyr::full_join #' @export #' @export full_join #' @rdname dplyr_verbs full_join.ped <- function(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) { classes_ped_x <- ped_classes(x) classes_ped_y <- ped_classes(y) attr_ped_x <- attributes(x) .data <- full_join(unped(x, classes_ped_x), unped(y, classes_ped_y), by, copy, suffix, ...) .data <- reped(.data, classes_ped_x) re_attribute(.data, attr_ped_x) } #' @inheritParams dplyr::left_join #' @export #' @export left_join #' @rdname dplyr_verbs left_join.ped <- function(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) { classes_ped_x <- ped_classes(x) classes_ped_y <- ped_classes(y) attr_ped_x <- attributes(x) .data <- left_join(unped(x, classes_ped_x), unped(y, classes_ped_y), by, copy, suffix, ...) .data <- reped(.data, classes_ped_x) re_attribute(.data, attr_ped_x) } #' @inheritParams dplyr::right_join #' @export #' @export right_join #' @rdname dplyr_verbs right_join.ped <- function(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) { classes_ped_x <- ped_classes(x) classes_ped_y <- ped_classes(y) attr_ped_x <- attributes(x) .data <- inner_join(unped(x, classes_ped_x), unped(y, classes_ped_y), by, copy, suffix, ...) .data <- reped(.data, classes_ped_x) re_attribute(.data, attr_ped_x) } pammtools/R/tdc-utils.R0000644000176200001440000000122314761333717014533 0ustar liggesusers#' Checks if data contains timd-dependent covariates #' #' @param data A data frame (potentially) containing time-dependent covariates. #' @param id_var A character indicating the grouping variable. For each covariate #' it will be checked if their values change within a group specified by #' \code{id_var}. #' @import dplyr #' @return Logical. \code{TRUE} if data contains time-dependent covariates, else \code{FALSE}. #' @keywords internal has_tdc <- function(data, id_var) { data %>% group_by(!!sym(id_var)) %>% summarize_all(.funs = ~any(length(unique(.)) > 1)) %>% select(-one_of(id_var)) %>% summarize_all(any) %>% unlist() %>% any() } pammtools/R/pammfit.R0000644000176200001440000000555515031734770014267 0ustar liggesusersunpam <- function(pamm) { class(pamm) <- class(pamm)[-1] pamm } repam <- function(x) { class(x) <- c("pamm", class(x)) x } append_ped_attr <- function(pamm, ped) { attr_ped <- ped_attr(ped) pamm[["attr_ped"]] <- attr_ped pamm } #' Fit a piece-wise exponential additive model #' #' A thin wrapper around \code{\link[mgcv]{gam}}, however, some arguments are #' prespecified: #' \code{family=poisson()} and \code{offset=data$offset}. #' These two can not be overwritten. In many cases it will also be advisable to #' set \code{method="REML"}. #' #' @inheritParams mgcv::gam #' @param ... Further arguments passed to \code{engine}. #' @param trafo_args A named list. If data is not in PED format, \code{as_ped} #' will be called internally with arguments provided in \code{trafo_args}. #' @param engine Character name of the function that will be called to fit the #' model. The intended entries are either \code{"gam"} or \code{"bam"} #' (both from package \code{mgcv}). #' @import mgcv #' @importFrom stats poisson #' @rdname pamm #' @seealso \code{\link[mgcv]{gam}} #' @examples #' ped <- tumor[1:100, ] %>% #' as_ped(Surv(days, status) ~ complications, cut = seq(0, 3000, by = 50)) #' pam <- pamm(ped_status ~ s(tend) + complications, data = ped) #' summary(pam) #' ## Alternatively #' pamm( #' ped_status ~ s(tend) + complications, #' data = tumor[1:100, ], #' trafo_args = list(formula = Surv(days, status)~complications)) #' @export pamm <- function( formula, data = list(), ..., trafo_args = NULL, engine = "gam") { dots <- list(...) dots$formula <- formula dots$family <- poisson() if (!is.null(trafo_args)) { trafo_args$data <- data data <- do.call(split_data, trafo_args) } dots$data <- data dots$offset <- data$offset if (is.null(data$offset)) { warning(paste0(deparse(substitute(data)), " does not contain an offset. PAMM assumes a risk time of 1 for all subjects")) } pamm_fit <- do.call(engine, dots) class(pamm_fit) <- c("pamm", class(pamm_fit)) # pamm_fit <- append_ped_attr(pamm_fit, data) pamm_fit[["trafo_args"]] <- attr(data, "trafo_args") ind_attr_keep <- !(names(attributes(data)) %in% c("names", "row.names", "trafo_args", "class")) pamm_fit[["attr_ped"]] <- attributes(data)[ind_attr_keep] pamm_fit } #' Check if object is of class pamm #' #' @param x Any R object. #' @rdname pamm #' @keywords internal #' @export is.pamm <- function(x) inherits(x, "pamm") #' @rdname pamm #' @keywords internal #' @export print.pamm <- function(x, ...) { print(unpam(x), ...) } #' @rdname pamm #' @param object An object of class \code{pamm} as returned by \code{\link{pamm}}. #' @keywords internal #' @export summary.pamm <- function(object, ...) { summary(unpam(object), ...) } #' @rdname pamm #' @keywords internal #' @export plot.pamm <- function(x, ...) { plot(unpam(x), ...) } pammtools/R/utils-pipe.R0000644000176200001440000000031214761333717014714 0ustar liggesusers#' Pipe operator #' #' See \code{magrittr::\link[magrittr]{\%>\%}} for details. #' #' @name %>% #' @rdname pipe #' @keywords internal #' @export #' @importFrom magrittr %>% #' @usage lhs \%>\% rhs NULL pammtools/R/geom-hazard.R0000644000176200001440000001001114761333717015014 0ustar liggesusers#' (Cumulative) (Step-) Hazard Plots. #' #' \code{geom_hazard} is an extension of the \code{geom_line}, and #' is optimized for (cumulative) hazard plots. Essentially, it adds a (0,0) #' row to the data, if not already the case. Stolen from the #' \code{RmcdrPlugin.KMggplot2} (slightly modified). #' #' @seealso #' \code{\link[ggplot2]{geom_line}}, #' \code{\link[ggplot2]{geom_step}}. #' @inheritParams ggplot2::geom_line #' @rdname geom_hazard #' @importFrom ggplot2 layer GeomLine #' @examples #' library(ggplot2) #' library(pammtools) #' ped <- tumor[10:50,] %>% as_ped(Surv(days, status)~1) #' pam <- mgcv::gam(ped_status ~ s(tend), data=ped, family = poisson(), offset = offset) #' ndf <- make_newdata(ped, tend = unique(tend)) %>% add_hazard(pam) #' # piece-wise constant hazards #' ggplot(ndf, aes(x = tend, y = hazard)) + #' geom_vline(xintercept = c(0, ndf$tend[c(1, (nrow(ndf)-2):nrow(ndf))]), lty = 3) + #' geom_hline(yintercept = c(ndf$hazard[1:3], ndf$hazard[nrow(ndf)]), lty = 3) + #' geom_stephazard() + #' geom_step(col=2) + #' geom_step(col=2, lty = 2, direction="vh") #' #' # comulative hazard #' ndf <- ndf %>% add_cumu_hazard(pam) #' ggplot(ndf, aes(x = tend, y = cumu_hazard)) + #' geom_hazard() + #' geom_line(col=2) # doesn't start at (0, 0) #' #' # survival probability #' ndf <- ndf %>% add_surv_prob(pam) #' ggplot(ndf, aes(x = tend, y = surv_prob)) + #' geom_surv() + #' geom_line(col=2) # doesn't start at c(0,1) #' @export geom_hazard <- function( mapping = NULL, data = NULL, stat = "identity", position = "identity", na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, ...) { layer( data = data, mapping = mapping, stat = stat, geom = GeomHazard, position = position, show.legend = show.legend, inherit.aes = inherit.aes, params = list(na.rm = na.rm, ... ) ) } #' @rdname geom_hazard #' #' @format NULL #' @usage NULL #' @import ggplot2 #' @export GeomHazard <- ggproto( "GeomHazard", GeomLine, setup_data = function(data, params) { row1 <- data %>% group_by(group) %>% slice(1) row1$x <- 0 row1$y <- 0 data <- bind_rows(row1, data) data[order(data$group, data$x), ] } ) #' @inheritParams ggplot2::geom_step #' @rdname geom_hazard #' @importFrom ggplot2 layer GeomStep #' @export geom_stephazard <- function( mapping = NULL, data = NULL, stat = "identity", position = "identity", direction = "vh", na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, ...) { layer( data = data, mapping = mapping, stat = stat, geom = GeomStepHazard, position = position, show.legend = show.legend, inherit.aes = inherit.aes, params = list( direction = direction, na.rm = na.rm, ... ) ) } #' @rdname geom_hazard #' @format NULL #' @usage NULL #' @export GeomStepHazard <- ggproto( "GeomStepHazard", GeomStep, setup_data = function(data, params) { row1 <- data %>% group_by(group) %>% slice(1) row1$x <- 0 row1$y <- row1$y data <- bind_rows(row1, data) data[order(data$PANEL, data$group, data$x), ] } ) #' @inheritParams ggplot2::geom_line #' @rdname geom_hazard #' @importFrom ggplot2 layer GeomLine #' @export geom_surv <- function( mapping = NULL, data = NULL, stat = "identity", position = "identity", na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, ...) { layer( data = data, mapping = mapping, stat = stat, geom = GeomSurv, position = position, show.legend = show.legend, inherit.aes = inherit.aes, params = list( na.rm = na.rm, ... ) ) } #' @rdname geom_hazard #' @format NULL #' @usage NULL #' @export GeomSurv <- ggproto( "GeomSurv", GeomLine, setup_data = function(data, params) { row1 <- data %>% group_by(group) %>% slice(1) row1$x <- 0 row1$y <- 1 data <- bind_rows(row1, data) data[order(data$group, data$x), ] } ) pammtools/R/cumulative-effect.R0000644000176200001440000000554714222504522016232 0ustar liggesusers#' Calculate (or plot) cumulative effect for all time-points of the follow-up #' #' @inheritParams gg_partial #' @param z1 The exposure profile for which to calculate the cumulative effect. #' Can be either a single number or a vector of same length as unique observation #' time points. #' @param z2 If provided, calculated cumulative effect is for the difference #' between the two exposure profiles (g(z1,t)-g(z2,t)). #' @param se_mult Multiplicative factor used to calculate confidence intervals #' (e.g., lower = fit - 2*se). #' @export get_cumu_eff <- function(data, model, term, z1, z2 = NULL, se_mult = 2) { assert_class(data, "fped") ped <- make_ped_dat(data, term, z1) coefs <- coef(model) col_ind <- grep(term, names(coefs)) coefs <- coefs[col_ind] Vp <- model$Vp[col_ind, col_ind] X <- predict(model, ped, type = "lpmatrix")[, col_ind] if (!is.null(z2)) { X2 <- predict(model, make_ped_dat(data, term, z2), type = "lpmatrix")[, col_ind] X <- X - X2 } ped$cumu_eff <- drop(X %*% coefs) ped$se_cumu_eff <- drop(sqrt(rowSums( (X %*% Vp) * X) )) ped$cumu_eff_lower <- ped$cumu_eff - se_mult * ped$se_cumu_eff ped$cumu_eff_upper <- ped$cumu_eff + se_mult * ped$se_cumu_eff ped } #' @keywords internal make_ped_dat <- function(x, term, z_vec) { nfunc <- length(attr(x, "ll_funs")) ind_term <- get_term_ind(x, term) nz <- length(attr(x, "tz")[[ind_term]]) tz_var <- attr(x, "tz_vars")[[ind_term]] tz <- attr(x, "tz")[[ind_term]] func <- attr(x, "func")[[ind_term]] ll_fun <- attr(x, "ll_funs")[[ind_term]] func_mat_names <- attr(x, "func_mat_names")[[ind_term]] LL_name <- grep("LL", func_mat_names, value = TRUE) tz_var_mat <- make_mat_names(tz_var, func$latency_var, func$tz_var, func$suffix, nfunc) q_weights <- attr(x, "ll_weights")[[ind_term]] stopifnot(length(z_vec) == nz | length(z_vec) == 1) z_vec <- if (length(z_vec) == 1) { rep(z_vec, nz) } else { z_vec } ped_df <- make_newdata(x, tend = unique(.data$tend)) ped_df[[LL_name]] <- outer(ped_df$tend, tz, FUN = ll_fun) * 1L * matrix(q_weights$ll_weight, nrow = nrow(ped_df), ncol = nz, byrow = TRUE) if (func$latency_var != "") { ped_df[[tz_var_mat]] <- outer(ped_df$tend, tz, FUN = "-") ped_df[[tz_var_mat]] * (ped_df[[LL_name]] != 0) } else { ped_df[[tz_var]] <- matrix(tz, nrow = nrow(ped_df), ncol = nz, byrow = TRUE) ped_df[[tz_var]] <- ped_df[[tz_var]] * (ped_df[[LL_name]] != 0) } ped_df[[term]] <- matrix(z_vec, nrow = nrow(ped_df), ncol = nz, byrow = TRUE) t_mat_var <- grep(attr(x, "time_var"), func_mat_names, value = TRUE) if (length(t_mat_var) != 0) { ped_df[[t_mat_var]] <- matrix(unique(x[[t_mat_var]][, 1]), nrow = nrow(ped_df), ncol = nz) } ped_df } get_term_ind <- function(x, term) { which(map_lgl(attr(x, "func_mat_names"), ~any(grepl(term, .x)))) } pammtools/R/add-functions.R0000644000176200001440000010375215143606362015365 0ustar liggesusers#' Embeds the data set with the specified (relative) term contribution #' #' Adds the contribution of a specific term to the #' linear predictor to the data specified by \code{newdata}. #' Essentially a wrapper to \code{\link[mgcv]{predict.gam}}, with \code{type="terms"}. #' Thus most arguments and their documentation below is from \code{\link[mgcv]{predict.gam}}. #' #' @inheritParams mgcv::predict.gam #' @param term A character (vector) or regular expression indicating for #' which term(s) information should be extracted and added to data set. #' @param ci \code{logical}. Indicates if confidence intervals should be #' calculated. Defaults to \code{TRUE}. #' @param se_mult The factor by which standard errors are multiplied to form #' confidence intervals. #' @param reference A data frame with number of rows equal to \code{nrow(newdata)} or #' one, or a named list with (partial) covariate specifications. See examples. #' @param ... Further arguments passed to \code{\link[mgcv]{predict.gam}} #' @import checkmate dplyr mgcv #' @importFrom stats predict #' @importFrom purrr map #' @importFrom stats model.matrix vcov #' @examples #' library(ggplot2) #' ped <- as_ped(tumor, Surv(days, status)~ age, cut = seq(0, 2000, by = 100)) #' pam <- mgcv::gam(ped_status ~ s(tend) + s(age), family = poisson(), #' offset = offset, data = ped) #' #term contribution for sequence of ages #' s_age <- ped %>% make_newdata(age = seq_range(age, 50)) %>% #' add_term(pam, term = "age") #' ggplot(s_age, aes(x = age, y = fit)) + geom_line() + #' geom_ribbon(aes(ymin = ci_lower, ymax = ci_upper), alpha = .3) #' # term contribution relative to mean age #' s_age2 <- ped %>% make_newdata(age = seq_range(age, 50)) %>% #' add_term(pam, term = "age", reference = list(age = mean(.$age))) #' ggplot(s_age2, aes(x = age, y = fit)) + geom_line() + #' geom_ribbon(aes(ymin = ci_lower, ymax = ci_upper), alpha = .3) #' @export add_term <- function( newdata, object, term, reference = NULL, ci = TRUE, se_mult = 2, ...) { assert_data_frame(newdata, all.missing = FALSE) assert_character(term, min.chars = 1, any.missing = FALSE, min.len = 1) col_ind <- map(term, grep, x = names(object$coefficients)) %>% unlist() %>% unique() %>% sort() is_gam <- (inherits(object, "gam") | inherits(object, "scam")) X <- prep_X(object, newdata, reference, ...)[, col_ind, drop = FALSE] newdata[["fit"]] <- unname(drop(X %*% object$coefficients[col_ind])) if (ci) { cov.coefs <- if (is_gam) { object$Vp[col_ind, col_ind] } else { vcov(object)[col_ind, col_ind] } se <- unname(sqrt(rowSums( (X %*% cov.coefs) * X ))) newdata <- newdata %>% mutate( ci_lower = .data[["fit"]] - se_mult * se, ci_upper = .data[["fit"]] + se_mult * se) } return(newdata) } #' Create design matrix from a suitable object #' #' @keywords internal #' @param object A suitable object from which a design matrix can be generated. #' Often a model object. make_X <- function(object, ...) { UseMethod("make_X", object) } #' @inherit make_X #' @keywords internal #' @rdname make_X #' @inherit make_X #' @param newdata A data frame from which design matrix will be constructed make_X.default <- function(object, newdata, ...) { model.matrix(object$formula[-2], data = newdata, ...) } #' @inherit make_X #' @inherit make_X.default #' @rdname make_X #' @keywords internal make_X.gam <- function(object, newdata, ...) { predict.gam(object, newdata = newdata, type = "lpmatrix", ...) } #' @inherit make_X #' @importFrom scam predict.scam #' @keywords internal make_X.scam <- function(object, newdata, ...) { X <- predict.scam(object, newdata = newdata, type = "lpmatrix", ...) } prep_X <- function(object, newdata, reference = NULL, ...) { X <- make_X(object, newdata, ...) if (!is.null(reference)) { reference <- preproc_reference(reference, colnames(newdata), nrow(newdata)) reference <- newdata %>% mutate(!!!reference) X_ref <- make_X(object, reference, ...) X <- X - X_ref } X } preproc_reference <- function(reference, cnames, n_rows) { # check that provided variables contained in newdata names_ref <- names(reference) if (!check_subset(names_ref, cnames)) { stop(paste0("Columns in 'reference' but not in 'newdata':", paste0(setdiff(names_ref, cnames), collapse = ","))) } # transform to list if inherits from data frame, so it can be processed # in mutate via !!! if (inherits(reference, "data.frame")) { if (!(nrow(reference) == n_rows || nrow(reference) == 1)) { stop("If reference is provided as data frame, number of rows must be either 1 or the number of rows in newdata.") } reference <- as.list(reference) } reference } #' Add predicted (cumulative) hazard to data set #' #' Add (cumulative) hazard based on the provided data set and model. #' If \code{ci=TRUE} confidence intervals (CI) are also added. Their width can #' be controlled via the \code{se_mult} argument. The method by which the #' CI are calculated can be specified by \code{ci_type}. #' This is a wrapper around #' \code{\link[mgcv]{predict.gam}}. When \code{reference} is specified, the #' (log-)hazard ratio is calculated. #' #' @rdname add_hazard #' @inheritParams mgcv::predict.gam #' @inheritParams add_term #' @param type Either \code{"response"} or \code{"link"}. The former calculates #' hazard, the latter the log-hazard. #' @param ... Further arguments passed to \code{\link[mgcv]{predict.gam}} and #' \code{\link{get_hazard}} #' @param ci_type The method by which standard errors/confidence intervals #' will be calculated. Default transforms the linear predictor at #' respective intervals. \code{"delta"} calculates CIs based on the standard #' error calculated by the Delta method. \code{"sim"} draws the #' property of interest from its posterior based on the normal distribution of #' the estimated coefficients. See \href{https://adibender.github.io/simpamm/confidence-intervals.html}{here} #' for details and empirical evaluation. #' @param se_mult Factor by which standard errors are multiplied for calculating #' the confidence intervals. #' @param overwrite Should hazard columns be overwritten if already present in #' the data set? Defaults to \code{FALSE}. If \code{TRUE}, columns with names #' \code{c("hazard", "se", "lower", "upper")} will be overwritten. #' @param time_var Name of the variable used for the baseline hazard. If #' not given, defaults to \code{"tend"} for \code{\link[mgcv]{gam}} fits, else #' \code{"interval"}. The latter is assumed to be a factor, the former #' numeric. #' @import checkmate dplyr mgcv #' @importFrom stats predict #' @examples #' ped <- tumor[1:50,] %>% as_ped(Surv(days, status)~ age) #' pam <- mgcv::gam(ped_status ~ s(tend)+age, data = ped, family=poisson(), offset=offset) #' ped_info(ped) %>% add_hazard(pam, type="link") #' ped_info(ped) %>% add_hazard(pam, type = "response") #' ped_info(ped) %>% add_cumu_hazard(pam) #' @export add_hazard <- function(newdata, object, ...) { UseMethod("add_hazard", object) } #' @rdname add_hazard #' @export add_hazard.default <- function( newdata, object, reference = NULL, type = c("response", "link"), ci = TRUE, se_mult = 2, ci_type = c("default", "delta", "sim"), overwrite = FALSE, time_var = NULL, ...) { if (!overwrite) { if ("hazard" %in% names(newdata)) { stop("Data set already contains 'hazard' column. Set `overwrite=TRUE` to overwrite") } } else { rm.vars <- intersect( c("hazard", "se", "ci_lower", "ci_upper"), names(newdata)) newdata <- newdata %>% select(-one_of(rm.vars)) } get_hazard(object, newdata, reference = reference, ci = ci, type = type, se_mult = se_mult, ci_type = ci_type, time_var = time_var, ...) } #' Calculate predicted hazard #' #' @inheritParams add_hazard #' @importFrom stats model.frame #' @importFrom mgcv predict.gam predict.bam #' @keywords internal get_hazard <- function(object, newdata, ...) { UseMethod("get_hazard", object) } #' @rdname get_hazard get_hazard.default <- function( object, newdata, reference = NULL, ci = TRUE, type = c("response", "link"), ci_type = c("default", "delta", "sim"), time_var = NULL, se_mult = 2, ...) { assert_data_frame(newdata, all.missing = FALSE) assert_class(object, classes = "glm") type <- match.arg(type) ci_type <- match.arg(ci_type) is_gam <- (inherits(object, "gam") | inherits(object, "scam")) if (is.null(time_var)) { time_var <- ifelse(is_gam, "tend", "interval") } else { assert_string(time_var) assert_choice(time_var, colnames(newdata)) } # throw warning or error if evaluation time points/intervals do not correspond # to evaluation time-points/intervals do not correspond to the ones used for # estimation #warn_about_new_time_points(object, newdata, time_var) X <- prep_X(object, newdata, reference, ...) coefs <- coef(object) newdata$hazard <- unname(drop(X %*% coefs)) if (ci) { newdata <- newdata %>% add_ci(object, X, type = type, ci_type = ci_type, se_mult = se_mult, ...) } if (type == "response") { newdata <- newdata %>% mutate(hazard = exp(.data[["hazard"]])) } newdata %>% arrange(.data[[time_var]], .by_group = TRUE) } #' @rdname add_hazard #' @inheritParams add_hazard #' @param interval_length The variable in newdata containing the interval lengths. #' Can be either bare unquoted variable name or character. Defaults to \code{"intlen"}. #' @importFrom dplyr bind_cols #' @seealso \code{\link[mgcv]{predict.gam}}, #' \code{\link[pammtools]{add_surv_prob}} #' @export add_cumu_hazard <- function( newdata, object, ci = TRUE, se_mult = 2, overwrite = FALSE, time_var = NULL, interval_length = "intlen", ...) { interval_length <- quo_name(enquo(interval_length)) if (!overwrite) { if ("cumu_hazard" %in% names(newdata)) { stop( "Data set already contains 'hazard' column. Set `overwrite=TRUE` to overwrite") } } else { rm.vars <- intersect(c("cumu_hazard", "cumu_lower", "cumu_upper"), names(newdata)) newdata <- newdata %>% select(-one_of(rm.vars)) } is_gam <- (inherits(object, "gam") | inherits(object, "scam")) if (is.null(time_var)) { time_var <- ifelse(is_gam, "tend", "interval") } else { assert_string(time_var) assert_choice(time_var, colnames(newdata)) } trafo_args <- attr(newdata, "trafo_args") intvars <- attr(newdata, "intvars") times <- setdiff(sort(unique(newdata[[time_var]])), c(0)) brks <- setdiff(trafo_args[["cut"]][trafo_args[["cut"]]<= max(times)], c(0)) # if selected time points contain all times already, do not extend newdata if (all(brks %in% times)) { joindata <- newdata } else { if (length(groups(newdata))!=0) { old_groups <- dplyr::groups(newdata) joindata <- group_split(newdata) |> map(newdata, .f = ~ expand_df(.x, object, trafo_args, intvars, time_var))|> #expand uses distinct, hence need to regroup map(newdata, .f = ~ group_by(.x, !!!old_groups)) |> bind_rows() } else { joindata <- newdata %>% expand_df(object, trafo_args, intvars) } } joindata <- get_cumu_hazard(joindata, object, ci = ci, se_mult = se_mult, time_var = time_var, interval_length = interval_length, ...) suppressMessages( newdata %>% left_join(joindata) ) } #' Calculate cumulative hazard #' #' @inheritParams add_cumu_hazard #' @import checkmate dplyr #' @importFrom rlang UQ sym quo_name .data #' @importFrom purrr map_lgl #' @keywords internal get_cumu_hazard <- function( newdata, object, ci = TRUE, ci_type = c("default", "delta", "sim"), time_var = NULL, se_mult = 2, interval_length = "intlen", nsim = 100L, ...) { assert_character(interval_length) assert_subset(interval_length, colnames(newdata)) assert_data_frame(newdata, all.missing = FALSE) assert_class(object, classes = "glm") ci_type <- match.arg(ci_type) interval_length <- sym(interval_length) mutate_args <- list(cumu_hazard = quo(cumsum(.data[["hazard"]] * (!!interval_length)))) haz_vars_in_data <- map(c("hazard", "se", "ci_lower", "ci_upper"), ~ grep(.x, colnames(newdata), value = TRUE, fixed = TRUE)) %>% flatten_chr() vars_exclude <- c("hazard") if (ci) { if (ci_type == "default" | ci_type == "delta") { vars_exclude <- c(vars_exclude, "se", "ci_lower", "ci_upper") newdata <- get_hazard(object, newdata, type = "response", ci = ci, ci_type = ci_type, time_var = time_var, se_mult = se_mult, ...) if (ci_type == "default") { mutate_args <- mutate_args %>% append(list( cumu_lower = quo(cumsum(.data[["ci_lower"]] * (!!interval_length))), cumu_upper = quo(cumsum(.data[["ci_upper"]] * (!!interval_length))))) } else { # ci delta rule newdata <- split(newdata, group_indices(newdata)) %>% map_dfr(add_delta_ci_cumu, object = object, se_mult = se_mult, ...) } } else { if (ci_type == "sim") { newdata <- get_hazard(object, newdata, type = "response", ci = FALSE, time_var = time_var, ...) newdata <- split(newdata, group_indices(newdata)) %>% map_dfr(get_sim_ci_cumu, object = object, nsim = nsim, ...) } } } else { newdata <- get_hazard(object, newdata, type = "response", ci = ci, ci_type = ci_type, time_var = time_var, se_mult = se_mult, ...) } newdata <- newdata %>% mutate(!!!mutate_args) vars_exclude <- setdiff(vars_exclude, haz_vars_in_data) if (length(vars_exclude) != 0 ) { newdata <- newdata %>% select(-one_of(vars_exclude)) } newdata } #' Add survival probability estimates #' #' Given suitable data (i.e. data with all columns used for estimation of the model), #' this functions adds a column \code{surv_prob} containing survival probabilities #' for the specified covariate and follow-up information (and CIs #' \code{surv_lower}, \code{surv_upper} if \code{ci=TRUE}). #' #' @inherit add_cumu_hazard #' @examples #' ped <- tumor[1:50,] %>% as_ped(Surv(days, status)~ age) #' pam <- mgcv::gam(ped_status ~ s(tend)+age, data=ped, family=poisson(), offset=offset) #' ped_info(ped) %>% add_surv_prob(pam, ci=TRUE) #' @export add_surv_prob <- function( newdata, object, ci = TRUE, se_mult = 2, overwrite = FALSE, time_var = NULL, interval_length = "intlen", ...) { interval_length <- quo_name(enquo(interval_length)) if (!overwrite) { if ("surv_prob" %in% names(newdata)) { stop("Data set already contains 'surv_prob' column. Set `overwrite=TRUE` to overwrite") } } else { rm.vars <- intersect( c("surv_prob", "surv_lower", "surv_upper"), names(newdata)) newdata <- newdata %>% select(-one_of(rm.vars)) } get_surv_prob(newdata, object, ci = ci, se_mult = se_mult, time_var = time_var, interval_length = interval_length, ...) } #' Calculate survival probabilities #' #' @inheritParams add_surv_prob #' @keywords internal get_surv_prob <- function( newdata, object, ci = TRUE, ci_type = c("default", "delta", "sim"), se_mult = 2L, time_var = NULL, interval_length = "intlen", nsim = 100L, ...) { assert_character(interval_length) assert_subset(interval_length, colnames(newdata)) assert_data_frame(newdata, all.missing = FALSE) assert_class(object, classes = "glm") ci_type <- match.arg(ci_type) interval_length <- sym(interval_length) mutate_args <- list(surv_prob = quo(exp(-cumsum(.data[["hazard"]] * (!!interval_length))))) haz_vars_in_data <- map(c("hazard", "se", "ci_lower", "ci_upper"), ~grep(.x, colnames(newdata), value = TRUE, fixed = TRUE)) %>% flatten_chr() vars_exclude <- c("hazard") if (ci) { if (ci_type == "default" | ci_type == "delta") { vars_exclude <- c(vars_exclude, "se", "ci_lower", "ci_upper") newdata <- get_hazard(object, newdata, type = "response", ci = ci, ci_type = ci_type, time_var = time_var, se_mult = se_mult, ...) if (ci_type == "default") { mutate_args <- mutate_args %>% append(list( surv_upper = quo(exp(-cumsum(.data[["ci_lower"]] * (!!interval_length)))), surv_lower = quo(exp(-cumsum(.data[["ci_upper"]] * (!!interval_length)))))) } else { # ci delta rule newdata <- split(newdata, group_indices(newdata)) %>% map_dfr(add_delta_ci_surv, object = object, se_mult = se_mult, ...) } } else { if (ci_type == "sim") { newdata <- get_hazard(object, newdata, type = "response", ci = FALSE, time_var = time_var, ...) newdata <- split(newdata, group_indices(newdata)) %>% map_dfr(get_sim_ci_surv, object = object, nsim = nsim, ...) } } } else { newdata <- get_hazard(object = object, newdata, type = "response", ci = FALSE, time_var = time_var, ...) } newdata <- newdata %>% mutate(!!!mutate_args) vars_exclude <- setdiff(vars_exclude, haz_vars_in_data) if (length(vars_exclude) != 0 ) { newdata <- newdata %>% select(-one_of(vars_exclude)) } newdata } add_ci <- function( newdata, object, X, type = c("response", "link"), se_mult = 2, ci_type = c("default", "delta", "sim"), nsim = 100, ...) { ci_type <- match.arg(ci_type) is_gam <- (inherits(object, "gam") | inherits(object, "scam")) if (is_gam) { V <- object$Vp } else { V <- vcov(object) } se <- unname(sqrt(rowSums( (X %*% V) * X) )) newdata$se <- se if (type == "link") { newdata <- newdata %>% mutate( ci_lower = .data[["hazard"]] - se_mult * .data[["se"]], ci_upper = .data[["hazard"]] + se_mult * .data[["se"]]) } if (type != "link") { if (ci_type == "default") { newdata <- newdata %>% mutate( ci_lower = exp(.data[["hazard"]] - se_mult * .data[["se"]]), ci_upper = exp(.data[["hazard"]] + se_mult * .data[["se"]])) } else { if (ci_type == "delta") { newdata <- split(newdata, group_indices(newdata)) %>% map_dfr(add_delta_ci, object = object, se_mult = se_mult, ...) } else { if (ci_type == "sim") { newdata <- split(newdata, group_indices(newdata)) %>% map_dfr(get_sim_ci, object = object, nsim = nsim, ...) } } } } newdata } add_delta_ci <- function(newdata, object, se_mult = 2, ...) { X <- predict.gam(object, newdata = newdata, type = "lpmatrix", ...) V <- object$Vp Jacobi <- diag(exp(newdata$hazard)) %*% X newdata %>% mutate( se = sqrt(rowSums( (Jacobi %*% V) * Jacobi )), ci_lower = exp(.data[["hazard"]]) - .data[["se"]] * se_mult, ci_upper = exp(.data[["hazard"]]) + .data[["se"]] * se_mult) } add_delta_ci_cumu <- function(newdata, object, se_mult = 2, ...) { X <- predict.gam(object, newdata = newdata, type = "lpmatrix", ...) V <- object$Vp Delta <- lower.tri(diag(nrow(X)), diag = TRUE) %*% diag(newdata$intlen) Jacobi <- diag(newdata$hazard) %*% X LHS <- Delta %*% Jacobi newdata %>% mutate( se = sqrt(rowSums( (LHS %*% V) * LHS )), cumu_lower = cumsum(.data[["intlen"]] * .data[["hazard"]]) - .data[["se"]] * se_mult, cumu_upper = cumsum(.data[["intlen"]] * .data[["hazard"]]) + .data[["se"]] * se_mult) } add_delta_ci_surv <- function(newdata, object, se_mult = 2, ...) { X <- predict.gam(object, newdata = newdata, type = "lpmatrix", ...) V <- object$Vp Delta <- lower.tri(diag(nrow(X)), diag = TRUE) %*% diag(newdata$intlen) Jacobi <- diag(newdata$hazard) %*% X LHS <- -diag(exp(-rowSums(Delta %*% diag(newdata$hazard)))) %*% (Delta %*% Jacobi) newdata %>% mutate( se = sqrt(rowSums( (LHS %*% V) * LHS)), surv_lower = exp(-cumsum(.data[["hazard"]] * .data[["intlen"]])) - .data[["se"]] * se_mult, surv_upper = exp(-cumsum(.data[["hazard"]] * .data[["intlen"]])) + .data[["se"]] * se_mult) } #' Calculate simulation based confidence intervals #' #' @keywords internal #' @importFrom mvtnorm rmvnorm #' @importFrom stats coef get_sim_ci <- function(newdata, object, alpha = 0.05, nsim = 100L, ...) { X <- predict.gam(object, newdata = newdata, type = "lpmatrix", ...) V <- object$Vp coefs <- coef(object) sim_coef_mat <- mvtnorm::rmvnorm(nsim, mean = coefs, sigma = V) sim_fit_mat <- apply(sim_coef_mat, 1, function(z) exp(X %*% z)) newdata$ci_lower <- apply(sim_fit_mat, 1, quantile, probs = alpha / 2) newdata$ci_upper <- apply(sim_fit_mat, 1, quantile, probs = 1 - alpha / 2) newdata } get_sim_ci_cumu <- function(newdata, object, alpha = 0.05, nsim = 100L, ...) { X <- predict.gam(object, newdata = newdata, type = "lpmatrix", ...) V <- object$Vp coefs <- coef(object) sim_coef_mat <- mvtnorm::rmvnorm(nsim, mean = coefs, sigma = V) sim_fit_mat <- apply(sim_coef_mat, 1, function(z) cumsum(newdata$intlen * exp(X %*% z))) newdata$cumu_lower <- apply(sim_fit_mat, 1, quantile, probs = alpha / 2) newdata$cumu_upper <- apply(sim_fit_mat, 1, quantile, probs = 1 - alpha / 2) newdata } get_sim_ci_surv <- function(newdata, object, alpha = 0.05, nsim = 100L, ...) { X <- predict.gam(object, newdata = newdata, type = "lpmatrix", ...) V <- object$Vp coefs <- coef(object) sim_coef_mat <- mvtnorm::rmvnorm(nsim, mean = coefs, sigma = V) sim_fit_mat <- apply(sim_coef_mat, 1, function(z) exp(-cumsum(newdata$intlen * exp(X %*% z)))) newdata$surv_lower <- apply(sim_fit_mat, 1, quantile, probs = alpha / 2) newdata$surv_upper <- apply(sim_fit_mat, 1, quantile, probs = 1 - alpha / 2) newdata } ## Cumulative Incidence Function (CIF) for competing risks data #' Add cumulative incidence function to data #' #' @inheritParams add_hazard #' @param alpha The alpha level for confidence/credible intervals. #' @param nsim Number of simulations (draws from posterior of estimated coefficients) #' on which estimation of CIFs and their confidence/credible intervals will be #' based on. #' @param cause_var Character. Column name of the 'cause' variable. #' #' @export add_cif <- function( newdata, object, ...) { UseMethod("add_cif", object) } #' @rdname add_cif #' @export add_cif.default <- function( newdata, object, ci = TRUE, overwrite = FALSE, alpha = 0.05, nsim = 500L, cause_var = "cause", time_var = NULL, ...) { coefs <- coef(object) V <- object$Vp sim_coef_mat <- mvtnorm::rmvnorm(nsim, mean = coefs, sigma = V) map_dfr( split(newdata, group_indices(newdata)), ~get_cif( newdata = .x, object = object, ci = ci, alpha = alpha, nsim = nsim, cause_var = cause_var, coefs = coefs, V = V, sim_coef_mat = sim_coef_mat, time_var = time_var, ...) ) } #' Calculate CIF for one cause #' #' @keywords internal get_cif <- function(newdata, object, ...) { UseMethod("get_cif", object) } #' @rdname get_cif #' @keywords internal get_cif.default <- function( newdata, object, ci, time_var, alpha, nsim, cause_var, coefs, V, sim_coef_mat, ...) { is_gam <- (inherits(object, "gam") | inherits(object, "scam")) if (is.null(time_var)) { time_var <- ifelse(is_gam, "tend", "interval") } else { assert_string(time_var) assert_choice(time_var, colnames(newdata)) } # causes_model <- as.factor(object$attr_ped$risks) causes_model <- as.factor(levels(newdata[[cause_var]])) cause_data <- unique(newdata[[cause_var]]) if(length(cause_data) > 1) { stop("Did you forget to group by cause?") } hazards <- map( causes_model, ~ { .df <- mutate(newdata, cause = .x) %>% arrange(.data[[time_var]], .by_group = TRUE) X <- predict(object, .df, type = "lpmatrix") apply(sim_coef_mat, 1, function(z) exp(X %*% z)) } ) overall_survivals <- apply( Reduce("+", hazards), 2, function(z) exp(-cumsum(z * newdata[["intlen"]]))) names(hazards) <- causes_model # calculate cif hazard <- hazards[[cause_data]] # Value of survival just prior to time-point survival <- overall_survivals - 1e-20 hps <- hazard * survival cifs <- apply(hps, 2, function(z) cumsum(z * newdata[["intlen"]])) newdata[["cif"]] <- rowMeans(cifs) if(ci) { newdata[["cif_lower"]] <- apply(cifs, 1, quantile, alpha/2) newdata[["cif_upper"]] <- apply(cifs, 1, quantile, 1-alpha/2) } newdata } ## Transition Probability Matrix for multi-state data #' @keywords internal get_trans_prob <- function( newdata, # object, time_var = NULL, interval_length = "intlen", transition = "transition", tend = "tend", cumu_hazard = "cumu_hazard", ...) { # interval_length assert_character(interval_length) assert_subset(interval_length, colnames(newdata)) # transition assert_character(transition) assert_subset(transition, colnames(newdata)) # time assert_character(tend) assert_subset(tend, colnames(newdata)) # cumu_hazard assert_character(cumu_hazard) assert_subset(cumu_hazard, colnames(newdata)) assert_data_frame(newdata, all.missing = FALSE) interval_length <- sym(interval_length) transition <- sym(transition) # FIXME: create time_var variable (="tend"), if time_var == NULL # use time_var rather then "tend" below # include from and to, to obtain transition probability in multidim array newdata <- newdata %>% mutate( from = as.numeric(gsub("->.*", "", !!transition)), to = as.numeric(gsub(".*->", "", !!transition)) ) # get unique transitions to build transition matrix unique_transition <- newdata %>% select(!!transition, "from", "to") %>% unique() %>% data.frame() # get unique time points unique_tend <- newdata %>% ungroup(!!transition) %>% select(!!tend) %>% unique() %>% data.frame() # FIXME could think about writing a separate function that performs the below # calculations (or use a function e.g. from etm that does that) # transition matrix m <- max(newdata$to) + 1 #transition starts at 0, integer of matrix at 1 M <- array(0, dim=c(max(m), max(m), nrow(unique_transition))) # create transition matrices to be used at every time point, # multiply matrices with "scalar" alpha_ij_k which is the delta cumu hazard at time t_k for transition i->j for (iter in seq_len(nrow(unique_transition))) { M[unique_transition$from[iter] + 1, unique_transition$to[iter] + 1,iter] <- 1 M[unique_transition$from[iter] + 1, unique_transition$from[iter] + 1,iter] <- -1 } # add cumu hazards to dataset newdata <- newdata %>% group_by(!!transition) %>% mutate(delta_cumu_hazard = cumu_hazard - ifelse(is.na(lag(cumu_hazard)), 0, lag(cumu_hazard))) # create dA array, to calculate transition probabilities alpha <- array( rep(0, nrow(unique_tend)*nrow(unique_transition)), dim=c(nrow(unique_tend), nrow(unique_transition))) I <- array( rep(diag(max(m)), nrow(unique_tend)), dim=c( max(m), max(m), nrow(unique_tend))) A <- array(0, dim=c(max(m), max(m), nrow(unique_tend))) cum_A <- array(0, dim=c(max(m), max(m), nrow(unique_tend))) # calculate differences in hazards alpha <- sapply(seq_len(nrow(unique_transition)), function(iter) { val <- newdata %>% ungroup() %>% filter(transition == unique_transition[iter,1]) %>% arrange(tend) val$delta_cumu_hazard }) for (t in seq_len(nrow(unique_tend))) { for (trans in seq_len(nrow(unique_transition))) { A[,,t] <- A[,,t] + M[,,trans] * alpha[t, trans] } } # # for debugging # print(A[,,nrow(unique_tend)]) # prepare transition probabilities A <- I + A for (iter in seq_len(nrow(unique_tend))) { if (iter == 1) { cum_A[,,iter] = A[,,iter] } else { cum_A[,,iter] = cum_A[,,iter-1] %*% A[,,iter] #use matrix multiplikation } } # transform array so that transition probability can be joined via tend and transition tmp <- cbind( unique_tend, sapply( seq_len(nrow(unique_transition)), function(row) { cum_A[unique_transition$from[row] + 1, unique_transition$to[row] + 1, ] } ) ) # FIXME: replace "tend" with time_var colnames(tmp) <- c("tend", as.character(unique_transition$transition)) trans_prob_df <- tmp %>% pivot_longer( cols = c(as.character(unique_transition$transition)), names_to = "transition", values_to = "trans_prob") %>% mutate(trans_prob = pmin(pmax(.data$trans_prob, 0), 1)) # join probabilities and return matrix newdata <- newdata %>% left_join(trans_prob_df, by=c("tend", "transition")) %>% select(-one_of(c("delta_cumu_hazard", "from", "to"))) return(newdata) } #' Add transition probabilities #' @description #' \code{add_trans_prob} adds transition probabilities on the provided data set and model. #' Optionally, confidence intervals (CI) are added if \code{ci=TRUE}. #' The function builds on cumulative hazards \code{cumu_hazard} and \code{mgcv::gam} models. #' #' @param newdata A data frame or list containing the values of the model #' covariates at which predictions are required. If this is not provided then #' predictions corresponding to the original data are returned. If newdata is #' provided then it should contain all the variables needed for prediction: #' a warning is generated if not. See details for use with #' \link[mgcv]{linear.functional.terms}. #' @param object A fitted \code{gam} object as produced by \code{mgcv::gam} #' @param overwrite Should transition probability columns be overwritten if #' already present in the data set? Defaults to \code{FALSE}. #' If \code{TRUE}, columns with names \code{c("trans_prob", "trans_upper", "trans_lower")} #' will be overwritten. #' @param ci \code{Logical}, defaults to \code{TRUE}. Decides if confidence #' intervals for transition probabilities are calculated. #' @param alpha Sets the confidence intervals' \eqn{\alpha} level, Defaults to \code{0.05} #' @param nsim Sets the number of iterations for simulated confidence intervals. #' Defaults to \code{100L} #' @param time_var Name of the variable used for the baseline hazard. If #' not given, defaults to \code{"tend"} for \code{\link[mgcv]{gam}} fits, else #' \code{"interval"}. The latter is assumed to be a factor, the former #' numeric. #' @param interval_length \code{Character}, defaults to \code{"intlen"}. #' contains the interval length in `newdata`. #' @param ... Further arguments passed to underlying methods. #' @examplesIf require("mstate") #' data("prothr", package = "mstate") #' prothr <- prothr |> #' mutate(transition = as.factor(paste0(from, "->", to)) #' , treat = as.factor(treat)) |> #' filter(Tstart != Tstop, id <= 100) |> select(-trans) #' ped <- as_ped(data= prothr, formula= Surv(Tstart, Tstop, status)~ ., #' transition = "transition", id= "id", timescale = "calendar") #' pam <- mgcv::bam(ped_status ~ s(tend, by=transition) + transition * treat, #' data = ped, family = poisson(), offset = offset, #' method = "fREML", discrete = TRUE) #' ndf <- make_newdata(ped, tend = unique(tend), #' treat = unique(treat), #' transition = unique(transition)) |> #' group_by(treat, transition) |> # important! #' arrange(treat, transition, tend) |> #' add_trans_prob(pam) #' @export add_trans_prob <- function( newdata , object , overwrite = FALSE , ci = FALSE , alpha = 0.05 , nsim = 100L , time_var = NULL , interval_length = "intlen", ... ) { if (!overwrite) { if ("trans_prob" %in% names(newdata)) { stop("Data set already contains 'trans_prob' column. Set `overwrite=TRUE` to overwrite") } } else { rm.vars <- intersect( c("trans_prob" , "trans_lower" , "trans_upper" ), names(newdata)) newdata <- newdata %>% select(-one_of(rm.vars)) } # add confidence intervals if wanted has_cumu = "cumu_hazard" %in% colnames(newdata) if (!has_cumu) { newdata <- newdata |> add_cumu_hazard(object, ci = FALSE) } if (ci) { newdata <- newdata |> add_trans_ci(object) } old_groups <- group_vars(newdata) out_df <- newdata |> ungroup("transition") |> group_split() |> map(.f = ~ group_by(.x, transition)) |> map(.f = ~ get_trans_prob(.x)) |> bind_rows() |> group_by(across(all_of(old_groups))) if (!has_cumu) { out_df[["cumu_hazard"]] <- NULL } out_df } #' helper function for add_trans_ci #' @keywords internal get_sim_cumu <- function(newdata, ...) { newdata$cumu_hazard <- cumsum(newdata$intlen * newdata$hazard) newdata } #' Add transition probabilities confidence intervals #' @keywords internal add_trans_ci <- function(newdata, object, nsim=100L, alpha=0.05, ...) { X <- predict.gam(object, newdata = newdata, type = "lpmatrix") coefs <- coef(object) V <- object$Vp # define groups: 1. all grouping variables -> cumu hazards, 2. all but transition -> trans_prob groups_array <- group_indices(newdata) groups_trans <- newdata %>% ungroup("transition") %>% group_indices() sim_coef_mat <- mvtnorm::rmvnorm(nsim, mean = coefs, sigma = V) sim_fit_mat <- apply(sim_coef_mat, 1, function(z) exp(X %*% z)) # create list with replicated newdata nlst <- as.list(replicate(nsim, newdata[,c("tend", "transition", "intlen")], simplify=F)) # add cumu-hazard in each element and calculate trans_prob with perturbed hazards nlst <- lapply(1:nsim, function(i) { nlst[[i]] <- cbind(nlst[[i]], hazard = sim_fit_mat[, i]) # add hazard # split by group and calculate cumu hazard nlst[[i]] <- split(nlst[[i]], groups_array) %>% map_dfr(get_sim_cumu) nlst[[i]] <- split(nlst[[i]], groups_trans) %>% map_dfr(get_trans_prob) nlst[[i]] }) sim_trans_probs <- do.call(cbind, lapply(nlst, function(df) df$trans_prob)) newdata$trans_lower <- apply(sim_trans_probs, 1, quantile, probs = alpha / 2) newdata$trans_upper <- apply(sim_trans_probs, 1, quantile, probs = 1 - alpha / 2) newdata } pammtools/R/lag-lead-utils.R0000644000176200001440000000712214767027042015430 0ustar liggesusers#' Construct or extract data that represents a lag-lead window #' #' Constructs lag-lead window data set from raw inputs or from data objects #' with suitable information stored in attributes, e.g., objects created #' by \code{\link{as_ped}}. #' #' @param x Either a numeric vector of follow-up cut points or a suitable object. #' @param ... Further arguments passed to methods. #' @examples #' get_laglead(0:10, tz=-5:5, ll_fun=function(t, tz) { t >= tz + 2 & t <= tz + 2 + 3}) #' gg_laglead(0:10, tz=-5:5, ll_fun=function(t, tz) { t >= tz + 2 & t <= tz + 2 + 3}) #' @export get_laglead <- function(x, ...) { UseMethod("get_laglead", x) } #' @rdname get_laglead #' @param tz A vector of exposure times #' @param ll_fun Function that specifies how the lag-lead matrix #' should be constructed. First argument is the follow up time #' second argument is the time of exposure. #' @importFrom dplyr mutate #' @importFrom tidyr crossing #' @export get_laglead.default <- function(x, tz, ll_fun, ...) { LL_df <- crossing(t = x, tz = tz) %>% mutate(LL = ll_fun(.data$t, .data$tz) * 1L) %>% group_by(tz) %>% mutate(LL = lag(.data$LL, default = 0)) %>% ungroup() class(LL_df) <- c("LL_df", class(LL_df)) LL_df } #' @rdname get_laglead #' @importFrom purrr map2_dfr #' @export get_laglead.data.frame <- function(x, ...) { time <- attr(x, "breaks") tz <- attr(x, "tz") ll_funs <- attr(x, "ll_funs") LL_df <- map2_dfr(tz, ll_funs, ~get_laglead.default(time, .x, ll_fun = .y), .id = "tz_var") if (!inherits(LL_df, "LL_df")) { class(LL_df) <- c("LL_df", class(LL_df)) } LL_df } #' Plot Lag-Lead windows #' #' Given data defining a Lag-lead window, returns respective plot as a #' \code{ggplot2} object. #' #' @inheritParams get_laglead #' @param high_col Color used to highlight exposure times within the lag-lead window. #' @param low_col Color of exposure times outside the lag-lead window. #' @param grid_col Color of grid lines. #' @import checkmate ggplot2 #' @examples #' ## Example 1: supply t, tz, ll_fun directly #' gg_laglead(1:10, tz=-5:5, #' ll_fun=function(t, tz) { t >= tz + 2 & t <= tz + 2 + 3}) #' #' ## Example 2: extract information on t, tz, ll_from data with respective attributes #' data("simdf_elra", package = "pammtools") #' gg_laglead(simdf_elra) #' @export #' @seealso get_laglead gg_laglead <- function(x, ...) { UseMethod("gg_laglead", x) } #' @rdname gg_laglead #' @export gg_laglead.default <- function(x, tz, ll_fun, ...) { LL_df <- get_laglead(x, tz, ll_fun = ll_fun) gg_laglead(LL_df, ...) } #' @rdname gg_laglead #' @export gg_laglead.LL_df <- function( x, high_col = "grey20", low_col = "whitesmoke", grid_col = "lightgrey", ...) { x <- left_join(x, int_info(unique(x$t)), by = c("t" = "tend")) x <- x %>% filter(!is.na(.data$interval)) %>% mutate( tz = factor(.data$tz, levels = sort(unique(.data$tz), decreasing = FALSE)), interval = factor(.data$interval, levels = levels(.data$interval)) ) gg_ll <- ggplot(x, aes(x = .data[["interval"]], y = .data[["tz"]])) + geom_tile(aes(fill = .data[["LL"]]), colour = grid_col) + scale_fill_gradient(low = low_col, high = high_col) + scale_x_discrete(expand = c(0, 0)) + scale_y_discrete(expand = c(0, 0)) + ylab(expression(t[z])) + xlab(expression(t)) if (!is.null(x[["tz_var"]])) { gg_ll <- gg_ll + facet_wrap(~tz_var, scales = "free_y") } gg_ll + theme(legend.position = "none") } #' @rdname gg_laglead #' @inherit gg_laglead #' @export gg_laglead.nested_fdf <- function(x, ...) { LL_df <- get_laglead(x) gg_laglead(LL_df, ...) } pammtools/R/helpers.R0000644000176200001440000000471213662013606014262 0ustar liggesusers#' Calculate the modus #' #' @param var A atomic vector #' @importFrom checkmate assert_atomic_vector #' @keywords internal modus <- function(var) { # input checks assert_atomic_vector(var, all.missing = FALSE, min.len = 1) # calculate modus freqs <- table(var) mod <- names(freqs)[which.max(freqs)] # factors should be returned as factors with all factor levels if (is.factor(var)) { mod <- factor(mod, levels = levels(var)) } return(mod) } #' Generate a sequence over the range of a vector #' #' Stolen from #' \href{https://github.com/tidyverse/modelr/blob/master/R/seq_range.R}{here} #' #' @param x A numeric vector #' @param n,by Specify the output sequence either by supplying the #' length of the sequence with \code{n}, or the spacing between value #' with \code{by}. Specifying both is an error. #' #' I recommend that you name these arguments in order to make it clear to #' the reader. #' @param pretty If \code{TRUE}, will generate a pretty sequence. If \code{n} #' is supplied, this will use \code{\link{pretty}()} instead of #' \code{\link{seq}()}. If \code{by} is supplied, it will round the first #' value to a multiple of \code{by}. #' @param trim Optionally, trim values off the tails. #' \code{trim / 2 * length(x)} values are removed from each tail. #' @param expand Optionally, expand the range by \code{expand * (1 + range(x)} #' (computed after trimming). #' @examples #' x <- rcauchy(100) #' seq_range(x, n = 10) #' seq_range(x, n = 10, trim = 0.1) #' seq_range(x, by = 1, trim = 0.1) #' #' # Make pretty sequences #' y <- runif (100) #' seq_range(y, n = 10) #' seq_range(y, n = 10, pretty = TRUE) #' seq_range(y, n = 10, expand = 0.5, pretty = TRUE) #' #' seq_range(y, by = 0.1) #' seq_range(y, by = 0.1, pretty = TRUE) #' @export seq_range <- function(x, n, by, trim = NULL, expand = NULL, pretty = FALSE) { if (!missing(n) && !missing(by)) { stop("May only specify one of `n` and `by`", call. = FALSE) } if (!is.null(trim)) { rng <- stats::quantile(x, c(trim / 2, 1 - trim / 2), na.rm = TRUE) } else { rng <- range(x, na.rm = TRUE) } if (!is.null(expand)) { rng <- rng + c(-expand / 2, expand / 2) * (rng[2] - rng[1]) } if (missing(by)) { if (pretty) { pretty(rng, n) } else { seq(rng[1], rng[2], length.out = n) } } else { if (pretty) { rng[1] <- floor(rng[1] / by) * by rng[2] <- ceiling(rng[2] / by) * by } seq(rng[1], rng[2], by = by) } } pammtools/R/split-data.R0000644000176200001440000002215014767026617014673 0ustar liggesusers#' Function to transform data without time-dependent covariates into piece-wise #' exponential data format #' #' @inheritParams as_ped #' @param multiple_id Are occurences of same id allowed (per transition). #' Defaults to \code{FALSE}, but is sometimes set to \code{TRUE}, e.g., in case of #' multi-state models with back transitions. #' @import survival checkmate dplyr #' @importFrom stats as.formula update #' @importFrom purrr set_names #' @seealso \code{\link[survival]{survSplit}} #' @export #' @keywords internal split_data <- function( formula, data, cut = NULL, max_time = NULL, multiple_id = FALSE, ...) { dots_in <- list(...) dots_in$formula <- formula ## assert that inputs have correct formats assert_class(formula, "formula") assert_data_frame(data, min.rows = 1, min.cols = 2) assert_numeric(cut, lower = 0, finite = TRUE, any.missing = FALSE, min.len = 1, null.ok = TRUE) assert_number(max_time, lower = 0, finite = TRUE, null.ok = TRUE) ## extract names for event time and status variables surv_vars <- all.vars(update(formula, .~0)) vars <- if ("." %in% all.vars(formula)) { names(data) } else { all.vars(formula) } uvars <- union(surv_vars, vars) if (!all(uvars %in% vars)) { stop(paste("Variables provided in formula not in data set:", paste0(setdiff(uvars, vars), collapse = ", "))) } ## standardize event time and status names proposed_names <- c("ped_start", "ped_time", "ped_status") ind <- ifelse(length(surv_vars) == 2, 2, 1):3 proposed_names <- proposed_names[ind] if (any(proposed_names %in% names(data))) { stop(paste0("Error in attempt to rename provided time/status variables: Variables ", intersect(proposed_names, names(data)), " allready in data set.")) } data <- rename( data, !!!set_names( surv_vars, as.list(proposed_names))) formula_cut <- update_formula(formula, proposed_names) # obtain interval breaks points cut <- get_cut(data, formula_cut, cut = cut, max_time = max_time) cut <- sort(unique(cut)) ## crate argument list to be passed to survSplit dots <- list(...) dots$data <- data dots$formula <- update_formula(formula, proposed_names) dots$cut <- dots_in$cut <- cut rm(data) # if id already in the data set, remove id variable from dots but keep # id variable for later rearrangement if (!is.null(dots$id)) { id_var <- dots$id } else { id_var <- "id" dots$id <- id_var } if (id_var %in% names(dots$data)) { if (length(unique(dots$data[[id_var]])) != nrow(dots$data) & !multiple_id) { stop(paste0("Specified ID variable (", id_var, ") must have same number of unique values as number of rows in 'data'.")) } if (id_var %in% vars) { dots$id <- NULL } else { dots$id <- NULL dots$formula <- update(dots$formula, paste0("~ . + ", id_var)) } } # create data in ped format split_df <- do.call(survSplit, args = dots) if("ped_start" %in% colnames(split_df)) { split_df <- rename(split_df, !!!set_names("ped_start", "tstart")) } # Add variables for piece-wise exponential (additive) model if(length(surv_vars) == 3) { split_df <- split_df %>% mutate( ped_status = ifelse(.data$ped_status == 1 & .data$ped_time > max(cut), 0L, .data$ped_status), tstart = pmin(.data$tstart, max(cut)), ped_time = pmin(.data$ped_time, max(cut)), offset = ifelse(.data$ped_time == .data$tstart, -Inf, log(.data$ped_time - .data$tstart))) %>% filter(!(.data$tstart == .data$ped_time)) } else { split_df <- split_df %>% mutate( ped_status = ifelse(.data$ped_status == 1 & .data$ped_time > max(cut), 0L, .data$ped_status), ped_time = pmin(.data$ped_time, max(cut)), offset = log(.data$ped_time - .data$tstart)) %>% filter(!(.data$tstart == .data$ped_time)) } ## combine data with general interval info if(length(surv_vars) == 3) { info_cut <- split_df %>% select(one_of(c("tstart", "ped_time"))) %>% unique() } else { info_cut <- cut } int_info <- int_info(info_cut) split_df <- left_join(split_df, int_info, by = c("tstart" = "tstart")) ## rearrange columns move <- c(id_var, "tstart", "tend", "interval", "intmid", "intlen", "offset", "ped_time", "ped_status") split_df <- split_df %>% select(one_of(move), everything(), -one_of(c("intmid", "intlen", "ped_time"))) ## set class and and attributes class(split_df) <- c("ped", class(split_df)) attr(split_df, "breaks") <- sort(unique(cut)) attr(split_df, "id_var") <- dots_in$id <- id_var attr(split_df, "intvars") <- c(id_var, "tstart", "tend", "interval", "offset", "ped_status") attr(split_df, "trafo_args") <- dots_in split_df } #' Split data to obtain recurrent event data in PED format #' #' Currently, the input data must be in start-stop notation for each spell and #' contain a colum that indicates the spell (event number). #' @inherit split_data #' @inheritParams get_cut #' @param transition A character indicating the column in data that indicates the #' event/episode number for recurrent events. #' @param event The value that encodes the occurrence of an event in the data set. #' @param timescale Defines the timescale for the recurrent event data transformation. #' Defaults to \code{"gaptime"}. #' @param min_events Minimum number of events for each event number. #' @keywords internal split_data_multistate <- function( formula, data, transition = character(), cut = NULL, max_time = NULL, event = 1L, min_events = 1L, timescale = c("gap", "calendar"), ...) { assert_character(transition, min.chars = 1L, min.len = 1L, any.missing = FALSE, len = 1L) assert_integer(min_events, lower = 1L, len = 1L) assert_character(timescale) timescale <- match.arg(timescale) dots_in <- list(...) dots_in$formula <- formula ## assert that inputs have correct formats assert_class(formula, "formula") assert_data_frame(data, min.rows = 1, min.cols = 2) assert_numeric(cut, lower = 0, finite = TRUE, any.missing = FALSE, min.len = 1, null.ok = TRUE) assert_number(max_time, lower = 0, finite = TRUE, null.ok = TRUE) ## extract names for event time and status variables surv_vars <- all.vars(update(formula, .~0)) vars <- if ("." %in% all.vars(formula)) { names(data) } else { all.vars(formula) } uvars <- union(surv_vars, vars) if (!all(uvars %in% vars)) { stop(paste("Variables provided in formula not in data set:", paste0(setdiff(uvars, vars), collapse = ", "))) } ## obtain interval breaks points for each spell if(timescale == "gap") { data <- mutate(data, !!!list(.time = quo(!!as.name(surv_vars[2]) - !!as.name(surv_vars[1])))) formula <- update(formula, Surv(.time, status)~.) formula <- update_formula(formula, proposed_names = c(".time", surv_vars[3])) } # split data for each spell data_list <- split(data, data[[transition]]) # rm(data) # only keep spells with minimum number of events data_list <- data_list[map_dbl(data_list, ~sum(.x[[surv_vars[3]]])) >= min_events] cuts <- get_cut(data_list, formula, cut = cut, max_time = max_time, event = event, timescale = timescale) ## create argument list to be passed to split_data dots <- list(...) dots$multiple_id <- TRUE # possible in case of multi-state models with back transitions # if id already in the data set, remove id variable from dots but keep # id variable for later rearrangement if (!is.null(dots$id)) { id_var <- dots$id } else { id_var <- "id" dots$id <- id_var } split_df_list <- map2( .x = data_list, .y = ifelse(is.list(cuts), cuts, list(cuts)), .f = ~ { dots$data <- .x dots$formula <- formula dots$cut <- .y split_df <- do.call(split_data, dots) } ) split_df <- bind_rows(split_df_list) split_df <- split_df %>% arrange(.data[[transition]], .data[[dots$id]], .data[["tstart"]]) # remove all obs beyond last observed event time if (is.null(max_time)) { max_time <- max(split_df[["tend"]][split_df[["ped_status"]] == 1]) split_df <- split_df %>% filter(.data[["tend"]] <= max_time) } ## set class and and attributes class(split_df) <- c("ped", class(split_df)) attr(split_df, "breaks") <- cuts attr(split_df, "id_var") <- dots_in$id <- id_var attr(split_df, "intvars") <- c(id_var, "tstart", "tend", "interval", "offset", "ped_status") dots_in$transition <- transition dots_in$timescale <- timescale dots_in$cut <- sort(unique(cuts)) dots_in$max_time <- max_time dots_in$event <- event dots_in$min_events <- min_events attr(split_df, "trafo_args") <- dots_in class(split_df) <- unique(class(split_df)) split_df } pammtools/R/as-ped.R0000644000176200001440000002646515031731165014001 0ustar liggesusers#' Transform data to Piece-wise Exponential Data (PED) #' #' This is the general data transformation function provided by the #' \code{pammtools} package. Two main applications must be distinguished: #' \enumerate{ #' \item Transformation of standard time-to-event data. #' \item Transformation of left-truncated time-to-event data. #' \item Transformation of time-to-event data with time-dependent covariates (TDC). #' } #' For the latter, the type of effect one wants to estimate is also #' important for the data transformation step. #' In any case, the data transformation is specified by a two sided formula. #' In case of TDCs, the right-hand-side of the formula can contain formula specials #' \code{concurrent} and \code{cumulative}. #' See the \href{https://adibender.github.io/pammtools//articles/data-transformation.html}{data-transformation} #' vignette for details. #' #' #' @rdname as_ped #' @param data Either an object inheriting from data frame or in case of #' time-dependent covariates a list of data frames (of length 2), where the first data frame #' contains the time-to-event information and static covariates while the second #' (and potentially further data frames) contain information on time-dependent #' covariates and the times at which they have been observed. #' @param formula A two sided formula with a \code{\link[survival]{Surv}} object #' on the left-hand-side and covariate specification on the right-hand-side (RHS). #' The RHS can be an extended formula, which specifies how TDCs should be transformed #' using specials \code{concurrent} and \code{cumulative}. The left hand-side can #' be in start-stop-notation. This, however, is only used to create left-truncated #' data and does not support the full functionality. #' @param cut Split points, used to partition the follow up into intervals. #' If unspecified, all unique event times will be used. #' @param max_time If \code{cut} is unspecified, this will be the last #' possible event time. All event times after \code{max_time} #' will be administratively censored at \code{max_time}. #' @param tdc_specials A character vector. Names of potential specials in #' \code{formula} for concurrent and or cumulative effects. #' @param censor_code Specifies the value of the status variable that indicates censoring. #' Often this will be \code{0}, which is the default. #' @param ... Further arguments passed to the \code{data.frame} method and #' eventually to \code{\link[survival]{survSplit}} #' @importFrom Formula Formula #' @examples #' tumor[1:3, ] #' tumor[1:3, ] %>% as_ped(Surv(days, status)~ age + sex, cut = c(0, 500, 1000)) #' tumor[1:3, ] %>% as_ped(Surv(days, status)~ age + sex) #' @return A data frame class \code{ped} in piece-wise exponential data format. #' @export as_ped <- function(data, ...) { UseMethod("as_ped", data) } #' @rdname as_ped #' @export as_ped.data.frame <- function( data, formula, cut = NULL, max_time = NULL, tdc_specials = c("concurrent", "cumulative"), censor_code = 0L, transition = character(), timescale = c("gap", "calendar"), min_events = 1L, ...) { status_error(data, formula, censor_code) assert_subset(tdc_specials, c("concurrent", "cumulative")) if (test_character(transition, min.chars = 1L, min.len = 1L)) { ped <- as_ped_multistate(data = data, formula = formula, cut = cut, max_time = max_time, tdc_specials = tdc_specials, censor_code = censor_code, transition = transition, timescale = timescale, min_events = min_events, ... ) return(ped) } event_types <- get_event_types(data, formula, censor_code) if (length(event_types) > 1) { ped <- as_ped_cr(data = data, formula = formula, cut = cut, max_time = max_time, tdc_specials = tdc_specials, censor_code = censor_code, ...) } else { dots <- list(...) dots$data <- data dots$formula <- get_ped_form(formula, data = data, tdc_specials = tdc_specials) dots$cut <- cut dots$max_time <- max_time ped <- do.call(split_data, dots) attr(ped, "time_var") <- get_lhs_vars(dots$formula)[1] attr(ped, "status_var") <- get_lhs_vars(dots$formula)[2] } ped } #' @rdname as_ped #' @export as_ped.nested_fdf <- function( data, formula, ...) { dots <- list(...) # update interval break points (if necessary) cut <- dots$cut if (is.null(cut)) { cut <- attr(data, "breaks") } ccr_breaks <- attr(data, "ccr_breaks") cut <- union(cut, ccr_breaks[ccr_breaks <= max(cut)]) %>% sort() # ped <- data %>% # select_if(is.atomic) %>% # as.data.frame() %>% # as_ped( # formula = formula, # id = dots$id, # cut = cut, # max_time = dots$max_time, # ...) dots$formula <- formula dots$data <- as.data.frame(select_if(data, is.atomic)) dots$cut <- cut ped <- do.call(as_ped, dots) # replace updated attributes attr(data, "breaks") <- attr(ped, "breaks") attr(data, "id_n") <- ped %>% group_by(!!sym(attr(data, "id_var"))) %>% summarize(id_n = n()) %>% pull("id_n") %>% as_vector() attr(data, "id_tseq") <- ped %>% group_by(!!sym(attr(data, "id_var"))) %>% transmute(id_tseq = row_number()) %>% pull("id_tseq") %>% as_vector() attr(data, "id_tz_seq") <- rep(seq_len(nrow(data)), times = attr(data, "id_n")) if (has_special(formula, "concurrent")) { ped <- ped %>% add_concurrent(data = data, id_var = dots$id) } if (has_special(formula, "cumulative")) { ped <- add_cumulative(ped, data = data, formula = formula) attr(ped, "ll_weights") <- imap(attr(ped, "tz"), ~bind_cols(!!.y := .x, ll_weight = c(mean(abs(diff(.x))), abs(diff(.x))))) class(ped) <- c("fped", class(ped)) } attr(ped, "time_var") <- get_lhs_vars(formula)[1] attr(ped, "func_mat_names") <- make_mat_names( attr(ped, "func"), attr(ped, "time_var")) ped } #' @rdname as_ped #' @export as_ped.list <- function( data, formula, tdc_specials = c("concurrent", "cumulative"), censor_code = 0L, ...) { assert_class(data, "list") assert_class(formula, "formula") status_error(data[[1]], formula, censor_code) nl <- length(data) # form <- Formula(formula) has_tdc <- has_tdc_form(formula, tdc_specials = tdc_specials) if (nl == 1 && !has_tdc) { ped <- data[[1]] %>% as_ped(formula = formula, tdc_specials = tdc_specials, ...) } else { if (nl == 2 && !has_tdc) { stop("Two data sets provided in 'data' but no specification of time-dependent covariate effects in 'formula'") } else { nested_fdf <- nest_tdc(data, formula, ...) ped <- as_ped(nested_fdf, formula, ...) } } lhs_vars <- get_lhs_vars(formula) attr(ped, "time_var") <- lhs_vars[1] attr(ped, "trafo_args")$formula <- formula ped } #' @rdname as_ped #' @param x any R object. #' @export is.ped <- function(x) inherits(x, "ped") #' @rdname as_ped #' @param newdata A new data set (\code{data.frame}) that contains the same #' variables that were used to create the PED object (\code{data}). #' @export as_ped.ped <- function(data, newdata, ...) { if (is.ped(newdata)) { stop("newdata already in ped format.") } trafo_args <- attr(data, "trafo_args") trafo_args[["data"]] <- newdata do.call(as_ped, trafo_args) } #' @rdname as_ped #' @export as_ped.pamm <- function(data, newdata, ...) { if (is.ped(newdata)) { stop("newdata already in ped format.") } trafo_args <- data[["trafo_args"]] trafo_args$data <- newdata do.call(split_data, trafo_args) } ## Competing risks #' Competing risks trafo #' #' @inherit as_ped #' @importFrom rlang .env #' #' @keywords internal as_ped_cr <- function( data, formula, cut = NULL, max_time = NULL, tdc_specials = c("concurrent", "cumulative"), censor_code = 0L, combine = TRUE, ...) { lhs_vars <- get_lhs_vars(formula) n_lhs <- length(lhs_vars) event_types <- get_event_types(data, formula, censor_code) cut <- map2( event_types, if(is.list(cut)) cut else list(cut), function(.event, .cut) { get_cut(data, formula = formula, cut = .cut, max_time = NULL, event = .event) } ) if (length(cut) > 1 && combine) { cut <- list(reduce(cut, union)) } ped <- map2( event_types, cut, function(.event, .cut) { ped_i <- data %>% mutate(!!lhs_vars[n_lhs] := 1L * (as.character(.data[[lhs_vars[n_lhs]]]) == as.character(.env[[".event"]]))) %>% as_ped( formula = formula, cut = .cut, max_time = max_time, tdc_specials = tdc_specials, ...) ped_i$cause <- as.factor(.event) ped_i }) if (combine) { ped <- do.call(rbind, ped) class(ped) <- c("ped_cr_union", "ped_cr", class(ped)) attr(ped, "intvars") <- c(attr(ped, "intvars"), "cause") attr(ped, "breaks") <- if (length(cut) ==1) unlist(cut) else cut } else { class(ped) <- c("ped_cr_list", "ped_cr", "ped", class(ped)) names(ped) <- paste0("cause = ", event_types) attributes(ped)$trafo_args$id <- attributes(ped[[1]])$trafo_args$id attributes(ped)$trafo_args$formula <- formula } attr(ped, "trafo_args")[["cut"]] <- if (length(cut) ==1) unlist(cut) else cut attr(ped, "trafo_args")[["combine"]] <- combine attr(ped, "trafo_args")[["censor_code"]] <- censor_code attr(ped, "risks") <- event_types ped } #' Exctract event types #' #' Given a formula that specifies the status variable of the outcome, this function #' extracts the different event types (except for censoring, specified by #' \code{censor_code}). #' #' @inheritParams as_ped #' #' @keywords internal get_event_types <- function(data, formula, censor_code) { lhs_vars <- get_lhs_vars(formula) status_values <- unique(data[[lhs_vars[length(lhs_vars)]]]) %>% sort() status_values <- status_values[status_values != censor_code] if (is.factor(status_values)) { droplevels(status_values[status_values != censor_code]) } else { status_values } } #' Recurrent events trafo #' #' @examples #' \dontrun{ #' data("cgd", package = "frailtyHL") #' cgd2 <- cgd %>% #' select(id, tstart, tstop, enum, status, age) %>% #' filter(enum %in% c(1:2)) #' ped_re <- as_ped_multistate( #' formula = Surv(tstart, tstop, status) ~ age + enum, #' data = cgd2, #' transition = "enum", #' timescale = "calendar") #' } #' @rdname as_ped #' @export #' @keywords internal as_ped_multistate <- function( data, formula, cut = NULL, max_time = NULL, tdc_specials = c("concurrent", "cumulative"), censor_code = 0L, transition = character(), timescale = c("gap", "calendar"), min_events = 1L, ... ) { assert_character(transition, min.chars = 1L, min.len = 1L, any.missing = FALSE, len = 1L) assert_integer(min_events, lower = 1L, len = 1L) status_error(data, formula, censor_code) assert_subset(tdc_specials, c("concurrent", "cumulative")) rhs_vars <- get_rhs_vars(formula) if (!(transition %in% rhs_vars)) { formula <- add_to_rhs(formula, transition) } dots <- list(...) dots$data <- data dots$formula <- get_ped_form(formula, data = data, tdc_specials = tdc_specials) dots$cut <- sort(unique(cut)) dots$max_time <- max_time dots$transition <- transition dots$min_events <- min_events dots$timescale <- timescale ped <- do.call(split_data_multistate, dots) attr(ped, "time_var") <- get_lhs_vars(dots$formula)[1] return(ped) } pammtools/R/nest-utils.R0000644000176200001440000001010514767027042014726 0ustar liggesusers#' Create nested data frame from data with time-dependent covariates #' #' Provides methods to nest data with time-dependent covariates (TDCs). #' A \code{formula} must be provided where the right hand side (RHS) contains #' the structure of the TDCs #' #' @param data A suitable data structure (e.g. unnested data frame with #' concurrent TDCs or a list where each element is a data frame, potentially #' containing TDCs as specified in the RHS of \code{formula}). #' Only TDCs present in \code{formula} will be returned. #' @param formula A two sided formula with a two part RHS, where the second #' part indicates the structure of the TDC structure. #' @param ... Further arguments passed to methods. #' @import checkmate dplyr #' @importFrom tidyr nest #' @importFrom purrr map map_int reduce #' @export #' @keywords internal nest_tdc <- function(data, formula, ...) { UseMethod("nest_tdc", data) } #' @rdname nest_tdc #' @export nest_tdc.default <- function(data, formula, ...) { dots <- list(...) id <- dots$id tdc_vars <- dots$tdc_vars outcome_vars <- dots$outcome_vars if (is.null(tdc_vars)) { tdc_vars <- get_tdc_vars(formula) } if (is.null(outcome_vars)) { outcome_vars <- get_lhs_vars(formula) } tdc_vars <- setdiff(tdc_vars, outcome_vars) if (!any(colnames(data) %in% tdc_vars) | !has_tdc(data, id)) { vars_to_exclude <- intersect(colnames(data), tdc_vars) return(data %>% select(-one_of(vars_to_exclude))) } else { df_list <- map( tdc_vars, ~ tidyr::nest(.data = data[, c(id, .x)], {{.x}} := one_of(.x))) suppressMessages(nested_df <- df_list %>% reduce(left_join)) # better: numeric vectors in each list element class(nested_df) <- c("nested_fdf", class(nested_df)) } nested_df %>% as_tibble() } #' @rdname nest_tdc #' @export nest_tdc.list <- function(data, formula, ...) { dots <- list(...) cut <- dots[["cut"]] data_dummy <- suppressMessages( map(data, ~.x[1,]) %>% do.call(what = left_join)) # preprocess information on time-dependent covariates lgl_concurrent <- has_special(formula, special = "concurrent") lgl_cumulative <- has_special(formula) tdc_vars <- character(0) form_tdc <- get_tdc_form(formula, data = data_dummy) if (lgl_concurrent) { # obtain information on concurrent effects ccr <- prep_concurrent(data, form_tdc) # update cut points ccr_time <- ccr[["ccr_time"]] # update vector of TDCs ccr_tz_vars <- map_chr(ccr[["ccr_list"]], ~.x[["tz_var"]]) %>% unique() ccr_vars <- map(ccr[["ccr_list"]], ~.x[["col_vars"]]) %>% unlist() tdc_vars <- c(tdc_vars, ccr_tz_vars, ccr_vars) } else { ccr <- NULL ccr_time <- NULL } if (lgl_cumulative) { func_list <- eval_special(form_tdc, data = data[[2]]) func_vars <- map(func_list, ~.x[["col_vars"]]) %>% unlist() func_tz_vars <- map_chr(func_list, ~.x[["tz_var"]]) %>% unique() tdc_vars <- c(tdc_vars, func_vars, func_tz_vars) %>% unique() } else { func_list <- NULL } # remove outcome vars from TDCs vector outcome_vars <- get_lhs_vars(formula) time_var <- outcome_vars[1] tdc_vars <- setdiff(tdc_vars, outcome_vars) suppressMessages( nested_df <- map(data, ~nest_tdc(.x, formula = formula, id = dots$id, tdc_vars = tdc_vars, outcome_vars = outcome_vars)) %>% reduce(left_join) %>% as_tibble() ) ## add atrributes cut <- get_cut(nested_df, formula, cut = dots$cut, max_time = dots$max_time) id_n <- nested_df %>% pull(time_var) %>% pmin(max(cut)) %>% map_int(findInterval, vec = cut, left.open = TRUE, rightmost.closed = TRUE) attr_old <- attributes(nested_df) attributes(nested_df) <- c(attr_old, list( id_var = dots$id, time_var = time_var, status_var = outcome_vars[2], tdc_vars = tdc_vars, breaks = cut, ccr = ccr, ccr_breaks = ccr_time, func_list = func_list, id_n = id_n, id_tseq = id_n %>% map(seq_len) %>% unlist(), id_tz_seq = rep(seq_along(nested_df[[dots$id]]), times = id_n))) class(nested_df) <- c("nested_fdf", class(nested_df)) nested_df } pammtools/R/viz-elra.R0000644000176200001440000002015414767062035014356 0ustar liggesusers#' Visualize effect estimates for specific covariate combinations #' #' Depending on the plot function and input, creates either a 1-dimensional slices, #' bivariate surface or (1D) cumulative effect. #' #' @import ggplot2 #' @importFrom rlang quos #' #' @inheritParams make_newdata #' @param data Data used to fit the \code{model}. #' @param model A suitable model object which will be used to estimate the #' partial effect of \code{term}. #' @param term A character string indicating the model term for which partial #' effects should be plotted. #' @param reference If specified, should be a list with covariate value pairs, #' e.g. \code{list(x1 = 1, x2=50)}. The calculated partial effect will be relative #' to an observation specified in \code{reference}. #' @param ci Logical. Indicates if confidence intervals for the \code{term} #' of interest should be calculated/plotted. Defaults to \code{TRUE}. #' @export gg_partial <- function(data, model, term, ..., reference = NULL, ci = TRUE) { expressions <- quos(...) vars <- names(expressions) n_vars <- length(expressions) ndf <- make_newdata(data, ...) %>% add_term(model, term, reference = reference, ci = ci) n_unique <- map_int(vars, ~length(unique(ndf[[.x]]))) vars <- vars[n_unique > 1] # vars <- vars[n_unique[rev(order(n_unique))] > 1] # ndf <- ndf %>% mutate_at(vars[-1], ~as.factor(.x)) n_vars <- length(vars) gg_base <- ggplot(ndf, aes(x = .data[[vars[1]]])) + xlab(vars[1]) if (n_vars == 1) { gg_out <- gg_base + geom_ribbon(aes(ymin = .data[["ci_lower"]], ymax = .data[["ci_upper"]]), alpha = 0.3) + geom_line(aes(y = .data[["fit"]])) } else { # if (n_vars == 2) { gg_out <- gg_base + aes(y = .data[[vars[2]]], z = .data[["fit"]]) + geom_tile(aes(fill = .data[["fit"]])) + geom_contour(col = "grey30") + scale_y_continuous(expand = c(0, 0)) + scale_x_continuous(expand = c(0, 0)) + scale_fill_gradient2(high = "firebrick2", low = "steelblue") # } } gg_out + theme(legend.position = "bottom") } #' @rdname gg_partial #' @inherit gg_partial #' @importFrom tidyr complete #' @param time_var The name of the variable that was used in \code{model} to #' represent follow-up time. #' @export gg_partial_ll <- function( data, model, term, ..., reference = NULL, ci = FALSE, time_var = "tend") { ind_term <- which(map_lgl(attr(data, "func_mat_names"), ~any(grepl(term, .x)))) tv_sym <- sym(time_var) tz_var <- attr(data, "tz_vars")[[ind_term]] tz_val <- attr(data, "tz")[[ind_term]] ll_var <- grep("LL", attr(data, "func_mat_names")[[ind_term]], value = TRUE) select_vars <- c(time_var, tz_var, ll_var, "fit") if (ci) { select_vars <- c(select_vars, "ci_lower", "ci_upper") } ll_df <- get_partial_ll(data, model, term, ..., reference = reference, ci = ci, time_var = time_var) %>% select(one_of(select_vars)) %>% mutate(fit = ifelse(.data[[ll_var]] == 0, NA_real_, .data$fit)) %>% complete(!!tv_sym := unique(!!tv_sym), !!sym(tz_var) := tz_val) %>% left_join(int_info(attr(data, "breaks")) %>% rename(!!tv_sym := "tend"), by = time_var) if (ci) { ll_df <- ll_df %>% mutate(ci_lower = ifelse(is.na(.data$fit), NA, .data$ci_lower)) %>% mutate(ci_upper = ifelse(is.na(.data$fit), NA, .data$ci_upper)) %>% gather("type", "fit", one_of(c("fit", "ci_lower", "ci_upper"))) %>% mutate(type = factor(.data$type, levels = c("ci_lower", "fit", "ci_upper"))) } gg_base <- ggplot(ll_df, aes(x = .data[["intmid"]], y = .data[[tz_var]])) + geom_tile(aes(fill = .data[["fit"]]), colour = "grey30") + scale_fill_gradient2(high = "firebrick2", low = "steelblue", na.value = "grey30") + scale_x_continuous(expand = c(0, 0)) + scale_y_continuous(expand = c(0, 0)) + xlab("time") + ylab(expression(t[z])) if (ci) { gg_base + facet_wrap(~.data$type) } else { gg_base } } #' Plot 1D (smooth) effects #' #' Flexible, high-level plotting function for (non-linear) effects conditional #' on further covariate specifications and potentially relative to #' a comparison specification. #' #' @inheritParams gg_partial #' @importFrom purrr map_int #' @importFrom rlang quos #' @examples #' ped <- tumor[1:200, ] %>% as_ped(Surv(days, status) ~ . ) #' model <- mgcv::gam(ped_status~s(tend) + s(age, by = complications), data=ped, #' family = poisson(), offset=offset) #' make_newdata(ped, age = seq_range(age, 20), complications = levels(complications)) #' gg_slice(ped, model, "age", age=seq_range(age, 20), complications=levels(complications)) #' gg_slice(ped, model, "age", age=seq_range(age, 20), complications=levels(complications), #' ci = FALSE) #' gg_slice(ped, model, "age", age=seq_range(age, 20), complications=levels(complications), #' reference=list(age = 50)) #' @export gg_slice <- function(data, model, term, ..., reference = NULL, ci = TRUE) { expressions <- quos(...) vars <- names(expressions) ndf <- make_newdata(data, ...) %>% add_term(model, term, reference = reference, ci = ci) n_unique <- map_int(vars, ~length(unique(ndf[[.x]]))) vars <- vars[rev(order(n_unique))] vars <- vars[n_unique[rev(order(n_unique))] > 1] ndf <- ndf %>% mutate_at(vars[-1], ~as.factor(.x)) n_vars <- length(vars) gg_out <- ggplot(ndf, aes(x = .data[[vars[1]]], y = .data[["fit"]])) if (ci) { gg_out <- gg_out + geom_ribbon(aes(ymin = .data[["ci_lower"]], ymax = .data[["ci_upper"]]), alpha = 0.3) } gg_out <- gg_out + geom_line() if (n_vars > 1) { if(ci) { gg_out <- gg_out + aes(group = .data[[vars[2]]], fill = .data[[vars[2]]]) + geom_line(aes(col = .data[[vars[2]]])) } else { gg_out <- gg_out + aes(group = .data[[vars[2]]]) + geom_line(aes(col = .data[[vars[2]]])) } if (n_vars > 2) { form <- as.formula(paste0("~", vars[-1:-2], collapse = "+")) gg_out <- gg_out + facet_wrap(form, labeller = label_both) } } gg_out + theme(legend.position = "bottom") } #' @rdname get_cumu_eff #' @inherit get_cumu_eff #' @inheritParams get_cumu_eff #' @inheritParams gg_partial #' @export gg_cumu_eff <- function(data, model, term, z1, z2=NULL, se_mult = 2, ci = TRUE) { cumu_eff_df <- get_cumu_eff(data, model, term, z1, z2, se_mult) gg_out <- ggplot(cumu_eff_df, aes(x = .data[["tend"]], y = .data[["cumu_eff"]])) if (ci) { gg_out <- gg_out + geom_ribbon(aes(ymin = .data[["cumu_eff_lower"]], ymax = .data[["cumu_eff_upper"]]), alpha = 0.3) } gg_out + geom_line() + xlab("time") + ylab("cumulative effect") } #' @inherit gg_partial_ll #' @rdname gg_partial #' @export get_partial_ll <- function( data, model, term, ..., reference = NULL, ci = FALSE, time_var = "tend") { ind_term <- which(map_lgl(attr(data, "func_mat_names"), ~any(grepl(term, .x)))) tz_var <- attr(data, "tz_vars")[[ind_term]] tz_val <- attr(data, "tz")[[ind_term]] ll_df <- get_ll(data, ind_term, ..., time_var = time_var) %>% add_term(object = model, term = term, reference = reference, ci = ci) } #' @keywords internal get_ll <- function(x, ind_term, ..., time_var = "tend") { n_func <- length(attr(x, "ll_funs")) ll_fun <- attr(x, "ll_funs")[[ind_term]] int_df <- int_info(x) tz_vars <- attr(x, "tz_vars") func <- attr(x, "func")[[ind_term]] tz_val <- attr(x, "tz")[[ind_term]] tz_var <- attr(x, "tz_vars")[[ind_term]] tz_var_mat <- make_mat_names(tz_var, func$latency_var, func$tz_var, func$suffix, n_func) ll_var_mat <- make_mat_names("LL", func$latency_var, func$tz_var, func$suffix, n_func) tz_mat_val <- x %>% pull(tz_var_mat) %>% as.numeric() %>% unique() %>% sort() nd <- make_newdata(x, ...) if (func$latency_var != "") { nd <- nd %>% mutate(!!sym(tz_var) := .data[[time_var]] - !!sym(tz_var_mat)) } nd %>% filter(!!sym(tz_var) %in% tz_val) %>% mutate( !!sym(ll_var_mat) := ll_fun(.data[[time_var]], .data[[tz_var]]) * 1L) %>% arrange(.data[[time_var]], .data[[tz_var]]) %>% group_by(.data[[tz_var]]) %>% mutate(!!sym(ll_var_mat) := lag(!!sym(ll_var_mat), default = 0)) %>% ungroup() } pammtools/R/zzz.R0000644000176200001440000000042315143606362013453 0ustar liggesusers.onLoad <- function(libname=find.package("pammtools"), pkgname="pammtools") { if (getRversion() >= "2.5.1") { utils::globalVariables(c(".", "id")) } invisible() } .onAttach <- function(libname=find.package("pammtools"), pkgname="pammtools") { invisible() } pammtools/R/get-cut-points.R0000644000176200001440000000503015031731165015473 0ustar liggesusers#' Obtain interval break points #' #' Default method words for data frames. #' The list method applies the default method to each data set within the list. #' #' #' @import Formula #' @keywords internal get_cut <- function(data, formula, cut = NULL, ...) { UseMethod("get_cut", data) } #' @rdname get_cut #' @inherit get_cut get_cut.default <- function( data, formula, cut = NULL, max_time = NULL, event = 1L, ...) { outcome_vars <- get_lhs_vars(formula) if (is.null(cut)) { if (length(outcome_vars) == 2) { if (is.logical(data[[outcome_vars[2]]])) { cut <- unique(data[[outcome_vars[1]]][1L * (data[[outcome_vars[2]]]) == event]) } else { cut <- unique(data[[outcome_vars[1]]][as.character(data[[outcome_vars[2]]]) == as.character(event)]) } } else { cut_start <- unique(data[[outcome_vars[1]]]) cut_end <- unique(data[[outcome_vars[2]]]) cut <- union(cut_start, cut_end) } if (!is.null(max_time)) { cut <- cut[cut < max_time] cut <- c(cut, max_time) } } else { if (length(outcome_vars) == 2) { # sort interval cut points in case they are not (so that interval factor # variables will be in correct ordering) cut <- sort(unique(cut)) } else { # sort interval cut points in case they are not (so that interval factor # variables will be in correct ordering) # add transitions within interval cut points to not lose information cut <- sort(unique(union(cut, data[[outcome_vars[2]]][1L * (data[[outcome_vars[3]]]) == event & 1L * (data[[outcome_vars[2]]]) < max(cut)]) ) ) } if (!is.null(max_time)) { cut <- cut[cut < max_time] cut <- c(cut, max_time) } } return(sort(unique(cut))) } #' @rdname get_cut #' @inherit get_cut get_cut.list <- function ( data, formula, cut = NULL, max_time = NULL, event = 1L, timescale = "gap", ...) { lhs_vars <- get_lhs_vars(formula) if (length(lhs_vars) == 3 & timescale == "gap") { rhs_vars <- get_rhs_vars(formula) formula_cuts <- as.formula( paste0("Surv(", lhs_vars[2], ",", lhs_vars[3], ") ~ ", paste(rhs_vars, collapse = "+"))) } else { formula_cuts <- formula } cuts <- map( .x = data, .f = ~get_cut.default( data = .x, formula = formula_cuts, cut = cut, max_time = max_time, event = event, ...) ) cuts <- Reduce(union, cuts) sort(unique(cuts)) } pammtools/R/tidiers.R0000644000176200001440000001272514767027042014274 0ustar liggesusers## Functions to extract effect information from fitted models #' Calculate confidence intervals #' #' Given 2 column matrix or data frame, returns 3 column data.frame #' with coefficient estimate plus lower and upper borders of the #' 95% confidence intervals. #' #' @param ftab A table with two columns, containing coefficients in the first #' column and standard-errors in the second column. #' @importFrom tibble as_tibble #' @keywords internal calc_ci <- function(ftab) { colnames(ftab) <- c("coef", "se") rnames <- rownames(ftab) ftab <- as_tibble(ftab) ftab$variable <- rnames ftab$ci_lower <- ftab$coef - 2 * ftab$se ftab$ci_upper <- ftab$coef + 2 * ftab$se ftab$se <- NULL ftab[, c("variable", "coef", "ci_lower", "ci_upper")] } #' Extract fixed coefficient table from model object #' #' Given a model object, returns a data frame with columns \code{variable}, #' \code{coef} (coefficient), \code{ci_lower} (lower 95\% CI) and #' \code{ci_upper} (upper 95\% CI). #' #' @param x A model object. #' @param ... Currently not used. #' @export tidy_fixed <- function(x, ...) { UseMethod("tidy_fixed", x) } #' @rdname tidy_fixed #' @param intercept Should intercept also be returned? Defaults to \code{FALSE}. #' @export tidy_fixed.gam <- function(x, intercept=FALSE, ...) { ftab <- summary(x)[["p.table"]][, 1:2] if (!intercept) { ftab <- ftab[!grepl("Intercept", rownames(ftab)), , drop = FALSE] } calc_ci(ftab) } #' @rdname tidy_fixed #' @importFrom tibble as_tibble #' @keywords internal #' @examples #' library(survival) #' gc <- coxph(Surv(days, status)~age + sex, data = tumor) #' tidy_fixed(gc) #' @export tidy_fixed.coxph <- function(x, ...) { ftab <- summary(x)[["coefficients"]][, c(1, 3)] calc_ci(ftab) } #' Extract 1d smooth objects in tidy data format. #' #' @rdname tidiers #' @inheritParams get_plotinfo #' @param keep A vector of variables to keep. #' @param ci A logical value indicating whether confidence intervals should be #' calculated and returned. Defaults to \code{TRUE}. #' @importFrom dplyr bind_rows #' @export tidy_smooth <- function( x, keep = c("x", "fit", "se", "xlab", "ylab"), ci = TRUE, ...) { po <- get_plotinfo(x, ...) # index of list elements that are 1d smooths and not random effects ind1d <- vapply( X = po, FUN = function(z) !is.null(z[["x"]]) & is.null(z[["main"]]), FUN.VALUE = logical(1)) # keep only variables of interest po <- lapply(po[ind1d], "[", i = keep, drop = TRUE) # transform to data.frame po <- lapply(po, function(z) { z[["fit"]] <- as.vector(z[["fit"]]) temp <- as_tibble(z) if (ci) { temp <- temp %>% mutate( ci_lower = .data$fit - .data$se, ci_upper = .data$fit + .data$se) } temp }) return(bind_rows(po)) } #' Extract 2d smooth objects in tidy format. #' #' @inheritParams tidy_smooth #' @importFrom purrr cross_df #' @importFrom tibble as_tibble #' @import dplyr #' @export tidy_smooth2d <- function( x, keep = c("x", "y", "fit", "se", "xlab", "ylab", "main"), ci = FALSE, ...) { po <- get_plotinfo(x, ...) ind2d <- vapply( X = po, FUN = function(z) !is.null(z[["x"]]) & !is.null(z[["y"]]), FUN.VALUE = logical(1)) # keep only variables of interest po <- lapply(po[ind2d], "[", i = keep, drop = TRUE) # transform to data.frame po <- lapply(po, function(z) { z[["fit"]] <- as.vector(z[["fit"]]) p1 <- as_tibble(z[setdiff(keep, c("x", "y"))]) xy <- cross_df(z[c("x", "y")]) xy <- bind_cols(xy, p1) if (ci) { xy <- xy %>% mutate( ci_lower = .data$fit - .data$se, ci_upper = .data$fit + .data$se) } xy }) return(bind_rows(po)) } #' Extract random effects in tidy data format. #' #' @inheritParams tidy_smooth #' @importFrom dplyr bind_rows #' @importFrom stats ppoints qnorm quantile #' @rdname tidy_smooth #' @seealso \code{\link[stats]{qqline}} #' @export tidy_re <- function(x, keep=c("fit", "main", "xlab", "ylab"), ...) { po <- get_plotinfo(x, ...) ind.re <- vapply( X = po, FUN = function(z) { (!is.null(z[["main"]])) & (z[["xlab"]] == "Gaussian quantiles") }, FUN.VALUE = logical(1)) po <- lapply(po[ind.re], "[", i = keep, drop = TRUE) po <- lapply(po, function(z) { re.df <- do.call(cbind.data.frame, c(z, stringsAsFactors = FALSE)) re.df$x <- qnorm(ppoints(length(re.df$fit))[order(order(re.df$fit))]) # code to calculate qqslope and qqintercept from ?stats::qqline yl <- quantile(re.df$fit, probs = c(0.25, 0.75), type = 7, names = FALSE) xl <- qnorm(c(0.25, 0.75)) re.df$qqslope <- diff(yl) / diff(xl) re.df$qqintercept <- yl[1L] - re.df$qqslope * xl[1L] re.df }) return(bind_rows(po)) } #' Extract plot information for all special model terms #' #' Given a \code{mgcv} \code{\link[mgcv]{gamObject}}, returns the information #' used for the default plots produced by \code{\link[mgcv]{plot.gam}}. #' #' @inheritParams mgcv::plot.gam #' @param ... Further arguments passed to \code{\link[mgcv]{plot.gam}} #' @import mgcv #' @importFrom checkmate assert_class #' @importFrom grDevices png dev.off #' @importFrom graphics plot #' @export get_plotinfo <- function(x, ...) { assert_class(x, c("gam", "glm", "lm")) tmp <- paste0(tempfile(), ".png") png(tmp) po <- plot(x, page = 1, ...) dev.off() if (file.exists(tmp)) file.remove(tmp) class(po) <- c("mgcv.plotlist", class(po)) return(po) } pammtools/R/multi-state-helpers.R0000644000176200001440000000622714767033074016543 0ustar liggesusers#' Extract transition information from different objects #' #' @rdname from_to_pairs #' @param t_mat an object that contains information about possible transitions. #' @keywords internal from_to_pairs <- function(t_mat, ...) { UseMethod("from_to_pairs", t_mat) } #' @rdname from_to_pairs #' @keywords internal from_to_pairs2 <- function(t_mat, ...) { res <- apply(t_mat, 1, function(x) which(x) - 1) names(res) <- seq_len(nrow(t_mat)) - 1 res <- res[vapply(res, length, 0) != 0] res } #' @rdname from_to_pairs #' @param from_col The name of the column in the data frame that contains "from" states. #' @param to_col The name of the column in the data frame that contains "to" states. #' @keywords internal #' @examples #' \dontrun{ #' df = data.frame(id = c(1,1, 2,2), from = c(1, 1, 2, 2), to = c(2, 3, 2, 2)) #' from_to_pairs(df) #' } from_to_pairs.data.frame <- function(t_mat, from_col = "from", to_col = "to", ...) { map( .x = sort(unique(t_mat[[from_col]])), .f = ~{ t_mat %>% filter(.data[[from_col]] == .x) %>% pull(to_col) %>% unique() }) } #' Add counterfactual observations for possible transitions #' #' If data only contains one row per transition that took place, this function #' adds additional rows for each transition that was possible at that time #' (for each subject in the data). #' @param data Data set that only contains rows for transitions that took place. #' @param from_to_pairs A list with one element for each possible initial state. #' The values of each list element indicate possible transitions from that state. #' Will be calculated from the data if unspecified. #' @param from_col Name of the column that stores initial state. #' @param to_col Name of the column that stores end state. #' @param transition_col Name of the column that contains the transition identifier (factor variable). #' @export add_counterfactual_transitions <- function( data, from_to_pairs = list(), from_col = "from", to_col = "to", transition_col = "transition") { if(length(from_to_pairs) == 0) { from_to_pairs <- from_to_pairs.data.frame(data, from_col, to_col) %>% discard(~length(.x) == 0) } l_from <- split(data, data[[from_col]]) orig_status <- data %>% select(one_of(c("id", "from", "to", "tstart", "status"))) %>% rename( "orig_to" = "to", "orig_status" = "status") res <- map2_dfr( from_to_pairs, l_from, ~{ n_to <- length(.x) .y %>% group_by(id) %>% mutate(initial_id = seq_len(n())) %>% ungroup() %>% slice(rep(row_number(), n_to)) %>% arrange(id, from, to) %>% group_by(id, initial_id) -> temp temp %>% mutate( to = .x, transition = paste0(from, "->", to) ) %>% ungroup() %>% mutate( initial_id = NULL, transition = as.factor(transition)) } ) res %>% ungroup() %>% left_join(orig_status) %>% mutate(status = .data$status * (.data$to == .data$orig_to)) %>% select(-one_of("orig_status", "orig_to")) %>% arrange(.data$id, .data$tstart, .data$tstop, .data$from, .data$to, .data$status) } pammtools/R/get-terms.R0000644000176200001440000000514014761333717014534 0ustar liggesusers#' Extract partial effects for specified model terms #' #' @param data A data frame containing variables used to fit the model. Only #' first row will be used. #' @param fit A fitted object of class \code{\link[mgcv]{gam}}. #' @param term The (non-linear) model term of interest. #' @param ... Further arguments passed to \code{\link{seq_range}}. #' @inheritParams seq_range #' @import dplyr #' @importFrom stats predict #' @importFrom rlang UQ #' @keywords internal get_term <- function(data, fit, term, n = 100, ...) { # values at which term contribution will be evaluated seq_term <- data %>% pull(term) %>% seq_range(n = n) # use first row as basis (values of other covariates irrelevant anyway) new_df <- data[1, ] # clean up as rest of the data not needed any longer rm(data) gc() term_name <- term # extract term contribution information (+ standard errors) new_df <- new_df[rep(1, length(seq_term)), ] new_df[[term_name]] <- seq_term term_info <- predict(fit, newdata = new_df, type = "terms", se.fit = TRUE) index_term <- grep(term, colnames(term_info$fit), value = TRUE) new_df %>% mutate( term = term_name, eff = as.numeric(term_info$fit[, index_term]), se = as.numeric(term_info$se.fit[, index_term])) %>% mutate( ci_lower = .data$eff - 2 * .data$se, ci_upper = .data$eff + 2 * .data$se) %>% select(one_of(c("term", term_name, "eff", "se", "ci_lower", "ci_upper"))) %>% rename(x = UQ(term_name)) %>% as_tibble() } #' Extract the partial effects of non-linear model terms #' #' This function basically creates a new \code{df} from \code{data} for #' each term in \code{terms}, creating a range from minimum and maximum of the # respective terms. For each \code{df} it then calls #' \code{predict(fit, newdata=df, type="terms")}. Terms are then #' stacked to a tidy data frame. #' #' @inheritParams get_term #' @param terms A character vector (can be length one). Specifies the terms #' for which partial effects will be returned #' @import checkmate #' @importFrom purrr map_dfr #' @return A tibble with 5 columns. #' @examples #' library(survival) #' fit <- coxph(Surv(time, status) ~ pspline(karno) + pspline(age), data=veteran) #' terms_df <- veteran %>% get_terms(fit, terms = c("karno", "age")) #' head(terms_df) #' tail(terms_df) #' @export get_terms <- function(data, fit, terms, ...) { # check inputs assert_class(data, "data.frame") assert_character(terms, min.len = 1, unique = TRUE) # apply get_term to each element of terms map_dfr(terms, function(x) get_term(data = data, fit = fit, term = x), ...) } pammtools/R/sysdata.rda0000644000176200001440000004616514222504522014640 0ustar liggesusersBZh91AY&SY0–Àyà¶…7Ç}±{°ð; nÞÒ¸÷uu0jŒ«j Ø)³ZÛc-2,»wmZÓi{­Žž` TÙX ¡­­U£XÖš­kj̪16Äh†€5×—@ aè 6I „ÄÁ0#F`˜˜ €À€FFÀL˜Œj`&e4Ú¦Œ§”õ6¦›ÿõUPi'ªhÐ i4i ÐÐ4È`€ 1O! €Äb2i¦&€ÒbcFƒ@50h0ÔÀ …<# ÐB  ŒƒSÂ'©¦…6Òjm4ž™¦ž‘dÔòi“M {A ÄÑ<“d¦ÃSÄž“56jdÑ6˜iÆÄÄ 4b 4§é1¦˜F††§”ÚК’HBm@šd ‘é4Ói2hÉéÑ¡¡¦=@~©é4ô€ò#@ÍAê€é?T ¡ê 4Ði ”ÓCÔ4ô1O§©ê~ßúªª•4’4h#ɶ‘ú¡ú…?Hi¦§¡”c@L‡ MÃhiúž¤iê~¤z™£@hjhÍA¡†¦4 '©M  £i †&ž£O)€Òzj„Ói0‚D& ÂT÷€§‘¤ÁSSOšx£ÓMFL"›Ú™Sɦ™OL Ÿ©ƒ&©âf”õ=<ŠxÐÕ3Ó)êj~”ýiO'’žOÔšjzl§©?Sh£ð†¨òŸ©´ÈIê{ªŠÏªN­NÛnl"q•V ÎÑ)Æ‚D Šë´gÝÈløriÜ­†s ›žy`r>#F àqؾЧ`…¡¡ªª1]"CÎsçd45\o„X!GªE¬÷¶£l ZzO¦k_\×׺âfÐâ³c—pǧÇÈ&æ™Ü…´¡·`.·hÂÁü` °‘ÿ¡I“yAÈ Yq”ÊŒ¹fsYÁ:£é”éÍ÷Àü]A×q™bМŒCƒ@K¨ P¼‹Œ‚]Åh¼¤TÅE®H–ÑAL¤U\´)š–¯sw¸ì®ûŒ7 ‹—ÍV[\^_ñœþßÑŸB¦Eÿ €ÿ+¦ÿ]ò‰ûS/Jÿ“¿‹ã_3–^çÅ¡Ùoï’pˆ}¹&úY´,€U È éæ±’ÐïZ§’&À®èã[YºH´W¼âþ4¹é¦" 'eBˆà·5µà™xÕw¯¥ØÖsò5—æCÙòy2fD‰z¨}ÛæN³NªàÙ WÁ¡°Œ¶RE4çÕÿ6œ¾Ž‘³Ÿ+nÝ’«®Óç¡®ZµoO¢¤›ˆ“P#)p¨-‚²¨Š¢X°Pˆ„Uˆˆ¤V2,‹X(±ED‚¬D1V*Ѝ‹ ŒTR1V"«*©âÄ UŠ¢ˆˆ$X¨ûîLQˆ# ÅEcEPEšL‰ D`ªÅdF*(ˆ¢FDV),ETb(‚¬",Eb±XÅŒQQ‹""‚¬DUEv°×Ùý§Šë ÝA½‹( TQH‰Š"ЬEPEb0PXÅUEcbŠ b£«ÄQdA‚¨ˆª 8DX¢‹EY¢ˆŠ‚Ág1UTEPEŠ‘;0EQ"ÅPAŒUE‚¨ˆÏHÌ.ˆH‘*4•âsœƒ$ ÕÐiÊ2ªHff‰P@Dr 4ª@™Â,$ ŒŠ*†ð0u¼ÈÅUb*ˆ1UTTQEUN;„F#AŠ(ˆ‚¨°Eb‘b¢ÅTDEb¨*1"±U"$T`ŠÅFLáÃHÅ"EbÅN`(ª¢ŠETH"*"¨Š¢¨¨ «Š1EV*ˆ‘M³xf˜¯c"±DX‘EˆŒUTY˜c‘E;ƒDbˆ"Š‘Œ* DDEbª*Ší† «ˆ(ÄŠ¤QTTb1PF"ˆŒTUR()²Š**1‹E½˜ªƒEFENDDc±UQPAMnÈí°¤ELH«9ÄÆ §´ÛPíÚÑãÍÌÀ¦2PÔïR‡uâŸ33»;½“´¤° D°èP’ã¿ p“’ɽÆÀÌÌçÜ™˜¤ty ´r$_ÖhK !4UTAP›0ZGßÞCáãæÇÈ`òQˆÎ“œúq¢C9†&Aw³âœh$Š™l)îŽé€$ÀBaS€QR†¨H•iÚÉ•n`±î_–ôwAPZÕÎP”@ ºsdäª5} ûéh!+TÀ`¦jIž™R9KT˲`¦':˜Äª¶xÒª- §û‹[T¶=U s4ÉPÊk€aˆÄFQJ8jDûk#“]OL ŒU™¥Kˆ€”qê`¦dez$VŒYl·ÃÄŒã3\Qžµ†Äó”4Ì1”ÕNZ¢''«!†UI€Šüw¿‘ÕÄú‰0Ïúj¡l¢ PÃZ‚Sš`çNe «Hî8šÑ-«mkü¥ÄÏ"ü1ªêfCU*MMe®…*›}Ë{¶p–+ì‚Ű׫ÔÚk-›O¨Ôê°Ú¹™›d->g9ŽÖLþ¹Ü¥ÃIš•Öë©4ý/í°¦›Ñkèp÷íÇeQ7³Æf5[LF–¢¦šs7úi¶¹_×õÛks{}Ä®š«s°—¡Øiw[¼îò{³¨œÙÒï§*7õz?ßEÀàð¸|.'íYÅãSqöœŽO+—Ìæó¹œú¾‡GwÒÝUôúZŸãwÄëÀÁ]î³Õåsû]¾wrøÿ;½îÿ‚ÃÔñxá  à¡ |È_/šýˆˆðÂÄù¡bbè¯ÿÏèôÅz½~ÈÈÈÏldlloº9¿Ãã~\’ Þp-Çpùƒ†Íwê\ûh‹ÀzöÒ•­”ÑÆй÷+ÜYJ—HáSSB„|n \‹Iœ‘Qɦ“OWÑÒ¡Òà"R0<ȌȀr!SÆä DSJ&¢ gJjê¥ÑãÆz! M4z‰ÏBd´ú:ak©§[ `&ºl (òD˜ÔÑà«r`rY[• A,ê-VϨü£€´c:ŒP.˜ëÿ( †ž0Eº`t”tþ5Usî2~‹Ó9ƒkeÑ„ †TÖ=RôaÏ=\û«iµR¬d·™J%¬ä˜€…”í'-"VµúzT=BL˜#Ï©žÉlJÉPõéFÓÒ)<ð©ióÕ<:¹±DŸ»róÒe¡ ìþiR%À0ƒž¨Ì©<Òîf²³œÖƒ|ñåµ¬í·¶Ú³05–³SZÖv´ ã(fZÌÊÎZ©¼kU6ÖƒžâÕÆfoêƒAµ3&nլ̃CvPÃ,lÌék3 Ðø¼ Ðã™ðô5¯Y™Y˜ ©­y̓†ìƒC‘”³<´lÖZÌÉÔå©Ìç6óž[zm·ÍÎ7šÛj‘Q” ‘g^f=mMÚÐ4œ¡ó:ð!ã9ëëƒYfešê5Bã; Ë<ÇQµ…ÆrrÍeŽë2Ör5 h]µ€ØØØØÙ¿–666nË=u«7̳ˆ6xízHØØØØØØÙÉË:¬ú{3ÀFÆÆœl§ôe7ež—,í2ÆÆÎ—Ã YœîÓk5–6yL±±±±±±±±±³ÕeŸ=–{ÆXÑ£MtZ±±±³Âç}g7_A?«r³7ãcò´ÿ×\“‡(ÓÑg&ŸU¯w>B™ÂuYGÄӞ׿ 4ÿœ£O/äõF4hÓè³¶ðôÖ†4hÑ£OíÊ4hùº}†ºa£äéž”iÙeÄÓZ¦tãF?º Äó 3·°«x°åÓ <_—’7–sͽ\ò…ëŽ÷ô|÷iM{°Ó¨Îðhѧ#(ÿXÓ‹MMý¶;â)Ñl<Ô$2¢â2V4xŽ)à²3=Æ™ç½ÌÎPñƒ:Z{=xJg™=®xÚgþÛ;q£FEÓS]Xñ Ŧ~ÓÊgALõ#F>¯©3ß<Úqm'¨ô'ŸºÀvËϹËåÇî# ,ñg‹<\>¤n›Œe;#9ß±:=}ýà÷ÔÏ=XÑâ<Óèò”ûƒ9#GÓoóôÛa£F4댣F4hùñ£F4hÑ£FÈhÑ£Ä4}xÑýáÿ£Fj4hþHÑ£F4hÑíÆ(ycÍ4{ñ£F\=ðÑ£F©4zñþ1£F®4hÑ£Ú >4hÑ£Fè 4hÑ£F÷4húÁ£Fô{ñ£ì?º=ˆÑý¹! '0aÄ£MGÿ‡Ù äÐhþPÑ£ß>Ø{1£F4hö#G–4hÑ£F4}P÷üÃF,hÑ£ìÆú0hÑ£Ý 4{£Gµähö§’Êa$ £í4hñ ðhÑ£GØû4hÑ£F4hÑöƒF4hÑ£Üx°2z4hÑ£F4h÷CF4hÑ£ß!L£F4hÑ£F4hÑ£F4é24hÑ£F4hÑ£F4hÑ£F4hÑ£F4hÑ£F4hÑ£O$e4hÑ£F4hÑ£F4hÑ£F4hÑ£F4hÑ£F4hÑ£F4hÑ£F6™ÖJ!cØÌ¦F6Æ™FO Éõ{¾ÿ‘¸ÝØS¸Û}¦Q£N>S‘Ò~±õ§ßÏΦþÔhÑ£F4|Ñ£F4hÑ£F4hÑ£FœhÑ£Fž7(ÑòF4ãek(Ñ£F4hÑøa§$Ê4i¶Q£F4hÑ£F4iφS2™”~4hÑ£F4~LhÑë9òg(ÀÎPÑ£F4hÑ£F4hÑ£èÆ>°hÑ£F4hÑ£F4hÑ£F4hÑ£F4hÓÈå4hÑ£F4hÑ£F4hÑ£F4hÑ£O”hÑ£F4hÑ£N(Ñ£Fpe4hÑ£F4hÑ£F4hÑ£F4hÓ»îÙí{Îêw·<)yZ”Ž]ç3Ć`,Äy±œ #þ\÷i @ŒÎãH€À¢Ô°‹A$ —ÕÝhlVˆ F¶ðÎàª?n™ÊV¨Éó¿­P|ÌýIŸß ¤¢¡Úl™º-æ«»ÐÖš¥ÂÑ2Z­Ôí´Hc'Oû¾¶þ¼„Dwc£ÊAñ¿wÏòpcyg­í4ÑŸãO)€ 7SyÓKòajlôÊQÈ?ì¶=.‚bE°Õ^ƒ"²Âpý-ïCÓô©õrzº …öõÔEDÜ ˆ€“Ô2Ê |ñþö Ì– ÑF Ñ(Ø`†ab 2{!BF@D”*‹ì‘ƒL)I„¡KÑI¥üb„x‡šgÙT¡&D’iî3*aK£b/…ô¡ñPPoტ*02 ’(  +!ä­ë·ó8zª;Ÿ{°Ï£3ªVùuÓN@ɨ|ÔÑè÷‹Á…ØÍüß>^•ù5¶¿Y»é¿ö4U{‰©ƒ{Gt‚&åæ î£Qö8»¨àÈŠk"š8lðzhTDÃ"¡ä@WSB¸‚y0GHƒ|X‰\ú92n‘6ºüÄ÷~ éH!’c“|'4.ýoŸÎ´1_EvŒU6B©qcXŒ50¯"ƒ1ý¢q;Œn7=Œ375\Ö±ˆó˜¯9ÀWœÐÏøä5@ò…ˆáTbDoÆkC3š¥"…¯9×cŒÉNr¾¨`Íã€Ø‡Ãb0|ÂV5yö£æF”ålhÇŒèLØÔRI 5Œó^5÷HXÆ®yjµ¦æq«™wíCk)ØÃƒ‰äsB4Þ…ÌSyÚÇDÖ›¦m¶ngsºàÖÚÞu˜p ¹ÆM„’‹ «"€¯óéDZ„¡9B*9j ÌD D:(#H¢H$‚>¼YÞ# ®Ó¶ˆaôUQÿdù‡Fa2.f ã†aˆãŒbæb€æA\ȰQIŒ‘Hˆ€±dpÀŽdïÂph„ìP."©H¥¨+ÚD)zè题('g?üTt°oqêÄNJ:X€i¢)ù"'Ÿ¾_pÕ@ŒF9(ýx(ØŠ)¨Š£vŒ18LM¡B´k+¿J Ä"@ø"!¶)ºüOZˆÖ ÄDßãf+ÃÀvB!öb%±dW­Š¢g¢†*_¡! Cž@1„ÄÄY$Y L‹$‹$Á `äÇ3 LLAÌU ÏNét™˜¤úŽßé´I”À$÷D‘[ˆ¨¼ìsÑäbÈòpû±lÄBÍš–ª¬Ñ(P¡Æ•§ò€£Mª $ü±@5ñG†‚H)±ÅuZ½ffµKB@W½"%¼B$W9[1 |{¸Š¶¢žˆ_<ª„ÓÀs&(6")‡œEK›š‰HB… ¡QÞâ9Ô»?~Fê°7ã÷l?Or&‘ŽŸèÚm}†”Á°Ü} «Œ‰ÖÓ¾\ºÅÁðÞ¨d@ŒÚÈÁƒ„HÃBH fý&ï*9›ÌƒarD*ã¶õ4õÖ®Vs—åò)y½V+sssDhJ*Rîëôï?»?o~šŸûD0=ƒ uæç9ü—Ñ©E-€9Ö>µ5r7™>ûuéIJjª§0`˜FB y ‰P*úQ^ÄÒdŠðfAC†c¢îפµ…™LÊû)u]@„A­Z³L„!—ÅÞK-Žòã{äBj"¥g¶ ˆÈvl–Ÿ×…\õŽ^öž#§âЈ‚P  ””(PDRJæu˜]ÞõݳvoÃPyôµ=‘öÛèLÀ &L˜¤AB…Í[@e*5™.¥Äà Ùô¿Óq$Îàv¶›AC±ùü›xïvÎð¢ÉÈD@² RxnƒZ„ÐözÈ+Ðlhö€«±õÆ&:¸éDt­¡wå¿hòÜ!ó ¨õú(§…bì©,K!4z?©Bª©ÜAÖíe¬ ãr%1¤Æ¥ßÛ~ãfõt·k±•Á_ŽÙF}UÛàé”1jçÔÝ+ØVÀ³fdÀ0`ÈB V×KâÌ‘œ2¦<ºò‡:¨œ­·Ygþ—fû!êܯ8LºèŤDB… D(P¢Áß±\¶¬Z‡Ce_ü4Â!v'Ëp×HÓXµåרûÙLžzÐ…Dê‡A¢ÉÜÈù—ªÙÖo Ï*éÖãÐv¿Ñí±VvçNï—M•ªzS“ؤ€jxk]”´ì–±ÏÀE ½ûŽý÷ln‹ÌxFÊ¡>Ã"#aYˆó6)r|£&,LŒ€0`ÈÀÉåI„WÛKSæÌÎpxŽ*† kõ !¥Ó›”qÖg .³¸$0`d€`Åžf¹Ãb–v‰.À9wcÊuÖígè[@¤Ãn!Ëý‚d‰=¯@=†ãhIåßd¡˜†@ÈÁ…Vè./£Ìñýy¹WÜ€Œ…ý*ÞÔ&Þ«öŠÙÖï¾}WºÊl÷ÇÊhÝc˜±=³Ô FÏöéöÊc7¶½üúöýsß9)ûì¼\9·nȵ–y¥C|wsA)9E4T )ÏûO!Ÿ\iaÁh|—¬CûqR0­Úc˜Ì]æK/®ûèíoú2oõ`æiÊU§J’‚RP£hÒh¯:^¦ûnùŸe-@ÅŸŽÍ·Öƒ - Ý™±Ú^¼_Nf8O&”øóÔ ¡G?ýœ]mÍ Ço“Ž4>î¾uâQ»X›õ—Lhù"ÖÅ ñ*2݉ïÄ—̨+{jÕa‘0b‚‹Â5ÚæÎLhn2ÈÇï;•Zy.3g†xK7¦KcèŽOÔ4„(‚­HŠS•…eecƒŽ9„‚$GåÖ¶=g/þMD¶pµ&=%É*üâRð qcðL(Ô¤ÝöS´dÅ6lÕ ¡Bg”E>zãbB÷ŒMãí)¹röËÝãïû„ÇŸÌÔ¬óu¬&~‘³(˜=³‰‚•*T”‚‘… 61;°>oÀ±ºØ‡D-×O‚öþtúCA–Pb0^X¶JLæÁ1–à+ìÌú­b•*JJ(æ›a}döI‚dìΘ;^!ÝÂÈP¢&³ìQ °M¹¢ÛLÁó£`³ŠtéÊAGÉA é>Ýà ÷°K‹Ûì¼¾¬ÜŒTaš*¬?Ò`?V ^_!xCú8Y’Ä8UÔWÖ¸8ãÜ *ª ÏPbþ\ÔpZ•@ ³ºf1á;•U0ff†>¥Ug:mV÷Mæý¹Ýß`62“Q¬½çìí9©¤Î 1Í_ÎW@ƒeuBc,õHLÑ!€S¸……‚‚RP¢×ë»ò„O÷™ ÿqÿp¸] 7…#Æêoîn?eɨF(pœ;0`äd 1r²C1TO}S»´‚€ESÙ(˜n´ÔÛù¬f¡ÙðƒŒAŠÄ̵‰²&ÑsCÁƒ À^©F±½GÒìq‰lNŒ ­Ñ%EÝë2z×¼¦@BšdÉŠAB… `¹¦áë;N%§û 'û¹ã©ûY„(¢´_§ôŒvKk‰·ÔñRшu] % 6O\Ohú Æ{RÆS~~¥ªô;o¬=]òÇ[è?оeUUR¨% }Wì0éº0cÉÔòX0FÐXŒ‡F.°8ÆÃêUª¬^Rƒ5£Ë6ÂÿI`hÑ£CÁ‰Â’º¨e‘äB—d‚¦7¬‹À½ñƒ ù†ÊΰòyfШ>\sßeEŒFÎÐrhþp6â ÚµdÔÀ20`ã?ÙÕÛý$•ÁÁæŽk|áx8BD¤T…fdÏÂë)S1§þ ÃFNBÞO2sFÚz ¡G1¯vÔÅìáMîØ¹,×êç5áÚ7‹`|cnëbà/ÞJÓh“þôð†­'Ïž¤(Pê«”Zïá{vÜå‹Þ_áötœPèx8H QWþ<ËxÝÒïæsß*äo¶Ô­Ž Üúü‡çã h8ç|Gä*o|»Œ§¯Œú<êLªø<&,-ØÑs×^ÊržžÁÇrGÖ±¦š`ÜÝø;ÿò9uºmÏdבç.@¨9ùã ¹È蔂… $ÇøØWÓ¶Vóß@÷àÓ~â¥Ël†óؓգkb`‹4%»†˜ñ3eÓ÷Ú\J J5·³¥Â×ó²¤!y‰mB¥õN*š©üGÊ)z¼ûÿZÚ8Yn~û¡²9f$Æâð+“æjºFR0.™ä|ñ†TikUpÊT³ˆx#ðÌ[i˜Äܰ`•<%ú6<œ5O¬þ7¾Æe*'Hù†1kã®yìF{Åí¨¸huã–eÿ&’»Tq#P³?)tU(:ã+¯+Ò‰½ Š7i‹ÎsÒMäaÑ|Œ·¼9茿?ÑÔ ¯Ö¹¨}B‹êE°»åYQeDz@Z^`ž¿¨ÇŽ©Ýeµõënè&ï ‹}ÌÎÚç´ÃJ9Œ-o^Ž–¥ƒO`Òñù—&®ur1±†QÔ½\уæ½`éT:uïÖo˜ÖvÌ›móŒüÃÉt8ñF Óqޤ÷}N¡s&-uI—Á'5o»(¯7ŽQÄ §WzMsJ=í «uÌ{϶Öe=ÕvøÆ‹‹Õñí(˜¤x·óÐ"ºôvP ‰¾?€pˆx¿$.÷µh%ÈÆ"Öýw<ô²Dä~±hÝmB%¸Y«x¦Ip*wRK… :¥ÿ™ñ:XN&ç>§d±+’$bå!VÝ” b/Ò ¦±—t…­6Ú'Y;uÅHô!^=©€Í"É|247Ä†Ç ˜Ì§±Á¥{1uA@ DÙ’镜u¡ÚÊ›$€Z% ¬Y•ÄÀî.Ù#ϰjýFÀª[ÆUкu]Tí;l¤ÜNk# Ì»†ã2úüßZ£7«ÄÔl¶ÑNfUyPacгVõ3¢ëô†A¿V—.¾r¸î&:³ä`s\ ©ôf0¦Bõ‡BÅuW¼aî¨SŒ«7—!™¢mÛåK‡ÖÔrXºâ8Vd£fnð/’k£RÍRÕLº¦BÝ*E“e”ëq Ø®mQ9Ý#g1´šèk 9I›Ö´ÚÒj]~Œ‡ž7Ní § kyÞᤌCîX¡A´Õ¿ã‹ÏlŸŽÅë¡Âßi 2™±SØšÜÚÝrkÞnæÁb†ÉˆÃ8àɭ镆l ÄZeä7ƒqþµ Ùì¯#]­¼;çY.ýÑP¿Ì¶d“as‹î9u˜4PµçuœT›eK÷ª¯Š‘u•]ÆÙ?˸*\è•M|çNc•'¿DþÌ;ç;eEó{aé˺vOF;äÅ_ëuY9„Öú||$Ù"äzÙô4w˜¤]Ìbëýe*ˆ®ŸÓ ½Ó½³¾ €ÌÈÆ_7ÑÅc-3¯¿¢Åþ“ÿ·j¡X£z® wb‚y±˜‹ †òîÍ+¬Å'•ò¹!²ìÃrMfH,5˜†óèÒN€Ioe9yJç!U–„Zü5·)Ï!È(ôÏZµÖ¹-Æ|°RG)…œ­~UñÛë€@¥›Ûq²ÛúÅ4˜+/“ÕAri¶þT¤®nÛ­FÆfàß$­Ê‹K1£æm›'?tÿd²Mª”h²Þˆ÷æÕ]Ó$…ç$7ú_·ž§“è–ÿuJw²Î]2Š•‰ÝÚŠÊe_^g8ýz½\ÏHqÔÔÖUoûõíì3ž­ñŒ÷Õ3n7×DÒÞäD·A1äò}V[³èε{N´ÄÂY<‰= –NYFÕGËEšÍˇ1 W›¤Ì£6:¿Ÿó3Ú¤mÕ¶·ð³ÙºÑéoö·Lg+çMèo2«ÿmszzÉ™Ÿ€S=ÜY¢žçO¸;Mn‘Æhj›iÊÎ2_ÌøT¥:_šNF•J…3O×ÐèMf†‹›E>Ÿº°hÕg¨è{©}'Ôó¨žðd=#,Ù9oE±ð£H-#“N™}¹ûÙGE–Ú5­ŒøÈüØßÞ‰îÑx>'ƒwB¸Q)XtÙóE2Ù×YGAÐl?~~‚·÷ƒ’¹#Í=ÖωîMþâD¹L@Q5ë°øn>Þëb¯^Q.Ä¿-ÇøU³rjÕ«SÈÁˆÅ( @KÚ­†#ñûŽ|oºýáñ¡Žž®ˆ¸ºÍ^ëÒãÌ„BFG}¡B…IB†‹ßªŽ¬õ‘Èt]w³»²}r%µ–}ØbÐÂä÷¼ȹ;(s§Nœ )(P¬ÞŒwƒ€ƒ>^áfz)TbÅžÇÚ”Ç囻¿l·îb´À†bA_ ½ ÜX±0 ¯&¶¸å¢Ú™Xs˜W}¬Õ‡å™žxÿjï1̳óŒi ÞBF²Öhû³ü*?›ÏˆL“ˆ¿wEå™N®®®RP¡B_B34Ê…Åqþ v5¿,© ¸¥¼|A+jžg»­jöïë"Éñjä{$!؇ÓáFQ>‰ÑŒŠ’… vÞ]¨_ÈFºµ$ÅÈÉÂ!òiùÄü\ôxÃ2‰¿‹ªfÈÚlµÿ5Áƒ¶¼;¦¡žß¢HsTC€¥J•©H)(QµÂ s±^ÅÕOƒ<•w­ÞSÿg”,Ôèqi‰ÆqÈ ¢ÐXdêE•!ŸB@T©q9R¥J’€¤¡EÑçÅo6ƒÁ #Àuü*†Œ…õ: ™ª¤ñå¼@šQ˜ R Ì^*瞉Zmýj“fÍP”(sL4!GKCPÀeˆþþ—Õó9çô'­ùüö?ŠyU”^ÃÝf¥Á ®âOÝ«/\õ߆e/ì PHƒÝQE¢®¶µŠACŽxœjÅÌü´Á—S×NL¬Ð  (P£Æ àb~É?Ïm€Ï°e@ÉEY~IU=Pà¨ÆP~Yå̯þN§Œ+ÿ¼«LEKà…hÒ’6Æåhõ;eEá-+€dɶVVVN8ääÞ줬‚Q—C&¾Z#3ABdY¦9àÓ ‘+ʱóï“[½› êì½zó `Á‹ã—oåKr‹Æ:ª*=²Ž™áã qg!ì}!w¨éÇ8ø)YýÉŠ¿$ {‘3ï 42 ØìJÅA«¨MfI$‚±tçS‚cbsˆËiba4“yvþÿóMž6—ÔÌÏè¢QJ•*JA@P£jÜNÝýÓ Õ³õ[ËÍ+Ųµ7VÒŽ¹Æ¦vvvv0 0®ŸÁqÕÉ‚¦AH¬ƒù M´5áòtNÞʬ>3&/ Ÿiý†£ûþµ¯2Ù˜­­­­RP¡F¤<£„ÅÄÓE;Ò½ÛÈ7K!E5Í‹Qû¡zÁoØ}XÓœ£k éN:rP¡EkŸoÇÒê´±À!²Ê}3w|/lôšR× 7ÕŽg9r1Êщ<Õ`é›j‘=A)˜P¢šn3Ó cÌ¥ñòXo-<­Õ–oâÊÇÈx ÙÓ„ôù;;ö «4ßЂ… … 5þ-¶ãÿ+nÃg):J= F8’THT¡(Ø>Þ1sü­$Vcàß—ÊÓ9·^’”Áó‰q!j0I]]]\ )(Pûmi½[ÕÑŠ ò9ßqžÂÉÈÀV=5Ë—fÿUž{:AA¢—ÕdàÚš—G‘ð)b_$‰µ¦þnˆZHÌ99Q;‹_é™°³~¦1›g>Ca2Tò{[[ëUUUTàãŽc£à)‚Æ7¥Ô·X§âÕÓòkâ #‚ÝlìýÓÞ"H)ìTÚ¯'•LÄd‘K‘_hÓ#qòñMåÄjOˆ2qÇ=mÝ.ÉM•%e÷1b…µ'z½^¬ OÑëº*m?᜾µå¦?dú³»É·ì£ #‚xlÎËSm}|*… 9‘y€ysãûÍ•N¡¸êÎGo÷jüR¹L×!„2$!J™DfÌŒ ]M¡xçÐ`Ê+RY@LRHxº7$2õ$Me Ë-·Nâž × Âæ“ûûû3 `ÁŽîb³ª¨ fßõ‡»ò+­ $g)PÓPKY«Oz¼ "s¬•)õ¬ÈEûY™E‰ ÍŠ¦lÌÀ0`ÄpY˜†VÛ‹FìÒÂw ħÕûÓ¨¤|¢¡%NàX&SD T²¨+J¨â2a”š1ÿ Ìôô)R¤ )™(Q›¢(ƒ˜K1°AüpŸP§’{‹ÔÐãË8õc^ƒ§ðÖ` z&¿\¥ñ4Ž<ÞEäŠÝµ€EfÒîiOhN>l¹€d`Ç-åNY"+´Ú¹œ¥(QwÏ­1&,¤v¡±ûÂaìbühMA@aKr¡ J9°8ªæcÛaÓÁ^Ÿõ>]Düë£Y˜< ÁÇË&»ªÿÅ/´ d6¦Ö2~€Ô—'pLE ÂŒ"vƈc§3³ ‚@°Ìýv‹$õH‰0SÔ¡" kâ%«V­L#“ HwËx¦“À?2µêX<§[€A‹«òÙPå­ÕÆÊåpÁ0c‡|½ðY »|)Û”· xùÙ^ÊêÎsí§xÕVã®ÍƒcžÎhüzé•ÕÌᆈ3FPQE)Üþ­ô­V—Öïï'Ž=€ LÑ“‚„µ÷Û„FH æQ<ÌQ@3h†)¹î¿+]ÍâR‘ƒo¥___jê0è×aÂÔðmèñߢ>ü®?ûæ·º/^d`Á‹?ÎÏ'Á‘m~ôîqRn¸Ûퟥü_g^ˆ¹E¦„粓«,L xâ^xQC`.½VŸßý§|Ì œeíbÔËLŒŒ±ò؆ÚåÔxíüká],]KV­20`Dz t–m½€¹‰ÆÙ V†!³{C}äÁÈükÇÿ*?G»¶4XÕ¸-_. Æ2&G š°±±naÑÅÄp*$i{Ÿ×ÊîÝ¿¯ºÞ*æEgõX«es@×\Üä­£³fÌÈÈÁ"|"pÖûc©)Tg®šmv—­‘²Ü"Eÿ‰çm€áC²2dÉ‘‘ƒ3ý­Î9ÁÈV]g¥ï=l|ýæ#ó/]T€ù¯^½y€`ÁŽÊr¯œí…©9‰¾k©SⱉáÇýÿlÓ:'ÈË—.2@Á÷Ûà‡£U¤Î=tïêzñ'­·BŽà­ÃŸ$:N9@P¡Fçp`pû$-—UO‰¾w:'¯?»e~,viM›6j0`Ç –.¿ïüã:Šÿ ¼Ž_›“ “ŒUî¶W9nñ¹.\¸ÈÁ„Œh,4}þ£¿‘ÄÿF‘F.Må|}ήô©ÝååäÈÁƒ­lÂî¶Ÿ o²~ÚGßòË¿¼l´XÒ)Åî=[F0bÍÞ§åTZzêÀ¬Âw,öÓxï"…øŠjÁX7¿þƒ_üäK²ööööd`ÁFkõ‡²ýÉd}¾.´k7]÷‹Lö§r\î¾É†L™220aÆpÕ®+jÚ ?åùLT·$‚ 2p;œ$Î f-Ô¶XüŽ‹”.\d`Áެß^¾(Õl%¹ïu5Ä:ËO{C 50›¬¬o‡ÕnxfÍ™‘ƒ-ÃöÐ/á ^-^‹‹`ç) ±ÞÄÊøÎ­Ž®¦F ÝÅAøùnG teV¶ #'éÛWòó£—Ý=  ׯ^d`Á‡;˜hºDû7ž/7oËÅIe¿ÅdO^+O7¬ÁktèHZ/.O/ooofF >’Ðí‰e¿°Éëu~öç# jýk´wxO–ð\ã¹ß|oAx´½!cŒ¼Wg­‹º÷Æ&ʼn0`ÃoÉú: ÏÙ×ru·( Š7 U“ët÷ÖA¾¯^½y‘ƒXÓ‡¯Ù§O©NeDÏq>tþGW°þ¬¬¬¬tqÇ,­/hd(w»¼ÅŠæ2Y/‚§ÙIø1<;s›ÃÃÁ€`ÁЇ§öø÷«n{>þoÛ½Áø…&ð~ÄÑÛvmˆJaƒ  IÉeŠaÓoé>-6š½ÇÛ7ÎÒm0ÿï.\¹q‘ƒwZ`¤ý¿\éÐÄj8vË—˜ ÿ}cæ± À)”ž[^LŒ1¤Õ¥wæ^aiöÕS9f®Í¥p¾w§òûhÅÎË—0c•ÀÕÐ1ž½9^òÏÃÃ}ÜΜͻ{ÕžNÒhC£xm`Áƒ B`üzvЩÇúü[¿IK jr>Êx\‡×sì|¶v{C»&LŒŒ1Ó…Æ ÎƒõÑê)nÃæ×+ÍOðÑú{ÐÞ …—‚òò©äÈÁƒ<…«õñ-ŠoÞ+KÔ®í÷žÛò»2¸PºúL‹/îɯhÑ£CÁƒZÌmO£û©ªc°ïÞ*[·^-}Š'ó•÷6mûRqDØ3fÍ™€`ÁŽH}䟭È6ð´z^¾k?;ð¼`#ZFÄåׯ^ðd`ÁŽ×?£1Úâ.ääi¤pdö§²õNI=WµD^ºITÄohS‚fÍ›3# a篹Úíq´…JÌÿ3e»•ò?Ón]ÝÝÝÌŒ1G þíp–ßÓ£aÃÀÞ\““‘€`Á‹µF;ÿ™òfÔ yP×S£Ž¦á^‡¾ñÐ*EnÎÎÆF ßR 7M­’OœÛÜ—-_’[¿uôÕa»;0c^œ‡:¿’0 û¿+³,F—¾õ“ÂX¡5â/á5BlGóf«Ù2dfƒ!ìx+V—[`Ê×)0Áõ6+ŠÄ;;;;0a~Ã[Põ­(ÙĈŠÚóµ¬Läò¡j{ÚÖÙ¦‹1¼ÿòSuydÉ“## u£'#…§Záe…ât3;¼—zó)ޣ؛Õ3fÍ™‘ƒ!~yA_¹‰*ÆzñøsóìF;d°Uý¹Ü9Ý,Ôk,X™0bõq|Ò5­º%oq¯BÃXsñ±;”ãþÁÏQuÆã®5“Qž 3V­Z™0a÷»¿ïH^§Hs!Žé½Ø× £ÝŒéO‡wwws# 1•²j\;5‹aÅÀW-Û»fG®.Ý¢݈xxxx20`Ç+ž¾6ƒ‘äMã¦_‚’éÛÎCPý0¾ {S9&N÷’½ñ¸Ñ ___LŒ1§‹à²“ÈZî³?||”Æšb$š?M9ùFShòòòòd`Á‹µ£5úQïê½]°•êí_ôð375b§â½ ÔˆÔ4'pƒ·PG¹Gäù ×××ÓÁƒ Ül? mçÛßq¹z¦?j.'2ùÝv«$úø¶ 020`Å᳿ÿ±M„_‰ ·±Ó¬¤X€ˆ”ˆŠ’±úª[G !|“`ÁƒÁƒ ºûäôžm?ËßɈýQÌÉ\fAR…z9€: zzzwr$ÌŠ$ÕL?2Çoç2'”¢†7ÆÅæ,ìNú!ÊÁÝâ6îÑô(y‘BÀh“½ê}¤[鸬™¡›3# _Ù®rŽ7OÇð|¿lŽ/Ç'EɰªZµjÓ êXuª@ Ž¸s)«з¾N> r‹Ô8¿zx†ú+íŒX±0`ÁŒ Ø ÷Xÿ·3jÌdo‘Pöl ¶È‰ŸU¦Š0sé÷Ua¦u-o-éGN&Fñ‰¨|æè-†®À0`ÆÇÝšÉÁoºjE}.üP+º+,ÀgçÄåÇ êºººµ% G¸öøÀ€^ùl¨Üw¾(ó%J•(ÈÁƒ›EŠ'WEn‚ªQ‚+– ‡õØÆÃàs½b´h!ËàÞw»Û4[F0aãç/´T¼Ôî@^;=u×¥ÙMCõ«Nõfìè°‘Ì\X±20`Ç—ét€ÇåÎc—À¬}Ä·Ó}ÏéænnT7ÏÐÆD1ê+]2?qL虋 `ÁŽ¿ª^åë¤è9¼×å7½Ü«¨wwwsÁƒoôPŸÐÚa£û“\-öׄ$hÑ`}H$ó0 |‹€ ì Œ1CŸ<°„%­úRËRÛOÙ?to•}Lqtxxx0 1´‰¶c/øh­nKy ax¹ ŽRpm ™“±' ×ãg(áÆâ*zzzz20`Æ ®çõ;ù¸ômâ® h:Bî¶Á8>Ëê{[«^á×±ðL™2dd`ÁŒ33¿ŽžØëäÓeg~:¬EÐ¥q:M½åAß·xRðð`0`üìv>î~ {·‘~YXŸnÎè<ãE¡Â:»»»˜0`ÆÜCÕƒyZ>†ÚLDý¼hsÜ©É&NšÂÏe =^Ÿ™ÏVN±1¬1äX6¦çÀ=3QËü>Ù .XK÷¸ÐÖ7b7»^tl(P£ ¿Ðk2t76ÈcÁƒ3œÉ „Y"Û,ázµUi1ø¡ëó¤Ù`ž²ø*€Ç†k]ÝLÈÁƒQBzŸÚ_…‹™ùºX~õZÞÆn :ÍßùnüDŃÃt@òO$DC]—¨©Q]tk]0 1ȵ&ó)lÂçqòÎjï{Á­ÖcÝOm”ðÖœ¤Èf½›3 Á0\1VÔrjðû¦²s%é@~Jñ¡]]]L0cE–Æb°ÆÒ©om°c>Xêìg¯ºÂð¢>¾Zgáq¯À}ÙD==<&20`Ã(M–SûÇÜ·Aï»’¹åù—)èY÷‹xü=T#~˜èÅŠÆ&F ÄÑã•æ1ã™e?n©}þ¯ÚoÕ`;-oY)Iþé£F 0cµ~s›¿n¬û¯~Û?5ÎÅj†RêEàêW™¦Äc’HË—.20`Ål‚…ráØòßÐÄ)Þ÷v¸Ö)sss0`Áˆ N›a)ŠÝŒl¯A1`Ê·{©]Œ0cY$é bØ€Yö‘L!·7/æà³}÷êkØû‹ðHÈ[8hÑ£C ¶j æÇ­­­¦F á9ðy<¤CÈÙÓéÔßo‰V!­ÖO€„[0Îxza®eò *šú+À=½½½˜0`ïõdÎeð~,W)m•VºÉãÚÖ¹…«V™€`Á(»j+‡÷ jpEÆéì”iìrbÝ.9‹&êÕéCi?iët]™2d`Áƒý”¬Óæâ,oòã?3ÀŠX½‡ˆ}oñÎ.\¹¸Áƒ+©²{Bª5_ma~360Ù¬=×\8%Ÿº¶.eòÓi09|ÆgAƒF 0`ÄÈëÚ<ÎOãE&λ?s‰ªòtÞÅü4¹C\j¦Èš¡B…~ã}p×ø‘=Ïë´˜ÖøXóC@ž‹X0¾ž ¾áÄí|"\¥ó–»F‡!/¡åæ!6/³ÌâkŠIÂt l]NÜÁƒ0Q^`ñóÞ½ºóË{Âi+ë5ôÓ(ZµjÓ æÕw;ʼ䟌Ú-0÷¸¥J€ SÁÅÈ/Öß©ÿ¹‚Æd`Á‰kcÄO$î婟ië¯û¹ÖÛâŸùjÕ®&ƒ!a6ÅV­ænnâ;w ïW‘‰nÿU„$]¼"»fÔ b–6J¦mГF 0cµ6ì9˜M+‰ƒ}» Wa!σÛå_ ™à…“¢È2dÉ‘ƒ Sç°z>(rÍÇ»Mÿáùõw ÿÇ´ º‹J_Ô4†_-æâo…‰«V­L0c$ÃUMß­Ô%¡{ ‹š¡ï÷eGvÙrï;»»º0`Ænµ³ ï+‚¨ÍsT §ø‘ÛßyE^õÝÝÝÜÁƒ.P]k®Õå†ag†FŸ5óÚ}Û¿¸Ñ†ï®/ãc”–Ú40`ÁÚÊ0Ê¢$ºÛ8^l&Ç×so /_GÈÛîÓLX±b`Áƒy*ÿÜzË‹ ©ÛÉÆýSdØÍAôù‹u~”±0`Áiƒ an{[~û QßF×)…ôpA1÷u pD=ðΛ¬g-ýþE jôôôôd`ÁvÂðþÑÔ Ý¿£ ‰<5TÖN—çhtíÕSÃ_­f2dÈÁƒõ^‹†kK@Ýköè¤21–‹È‚,ÓtaåååäÁƒ%êÕ—„-­öÙ*s–Ø<Ÿ¬o¬¿ûµjÕ¦ 1.9£ À¢’Yácpm-–J¾ã*µÜïÛ$˜ˆiì—j–)S°^D€zzzz0 1sÕH_꼱㠊»„lÞ :RÇmÜÉeÛe}uI@ vL™20`Á…¿Æ×Ç|i†¤ù¸Û]FaìoI«È-²DC \lû/^½yƒ >CßÞ}5õŒ§ã\­>û‰;\ØÏr†ÅáááàÈÁƒ­9PÎ~)ëËŠ6‚<@ìU0„›ä ¼úˆD þ­xéí¯ˆ zÞÆÈǧ§§£ ‹ã8Ç·Œ¸“~œØS=f9wß:µjÕ¦F sc¼Çðjún;Páªë÷\¹ Û‹äuŸ@)HgôÉO ž¿¼É5jÕ©‘ƒ8v­Œ«yOô2¢ÿj±c*Mö“!;ŒmäÓ©£ÿ—.\¸Áƒ,}Üm ~ÊÏlç³Ãp¶³¸Oc=uÑq_×Ę`Áƒ# :Šþ¬^mö6˜Hms¼ì’0XSnƒ/ÎÚ¦øvØ'{=¬ï!£ˆfÍ›a‘ƒ/¸¸Ðñt-Dkxk(£ø¹Ç?Ê'¯þ±;9Ì~måååäÈÁƒ×»ÍQŒN×ý¡éôø.BÖ›˜þ>oëô2Ø' °æÔË =›6lÐJ*p‘NÍáéa¨¬ÓM†VÎپ郇‚ítwú‚»ô‘6n˜‰€M@0` ¡GHÑcäý–ü¬î%¬âøõ}v[Ù .¶n˜c|[ïúè÷\y£†ÊB»’)„„±ãˆpammtools/R/ggplot-extensions.R0000644000176200001440000000643114767027042016317 0ustar liggesusers# Stolen from the \code{RmcdrPlugin.KMggplot2} (slightly modified) #' Step ribbon plots. #' #' \code{geom_stepribbon} is an extension of the \code{geom_ribbon}, and #' is optimized for Kaplan-Meier plots with pointwise confidence intervals #' or a confidence band. The default \code{direction}-argument \code{"hv"} is #' appropriate for right-continuous step functions like the hazard rates etc #' returned by \code{pammtools}. #' #' @rdname geom_stepribbon #' @importFrom ggplot2 layer GeomRibbon #' @inheritParams ggplot2::geom_ribbon #' @inheritParams ggplot2::geom_step #' @seealso #' \code{\link[ggplot2]{geom_ribbon}} \code{geom_stepribbon} #' @examples #' library(ggplot2) #' huron <- data.frame(year = 1875:1972, level = as.vector(LakeHuron)) #' h <- ggplot(huron, aes(year)) #' h + geom_stepribbon(aes(ymin = level - 1, ymax = level + 1), fill = "grey70") + #' geom_step(aes(y = level)) #' h + geom_ribbon(aes(ymin = level - 1, ymax = level + 1), fill = "grey70") + #' geom_line(aes(y = level)) #' @export geom_stepribbon <- function( mapping = NULL, data = NULL, stat = "identity", position = "identity", direction = "hv", na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, ...) { layer( data = data, mapping = mapping, stat = stat, geom = GeomStepribbon, position = position, show.legend = show.legend, inherit.aes = inherit.aes, params = list(na.rm = na.rm, direction = direction, ... ) ) } #' @rdname geom_stepribbon #' @importFrom ggplot2 ggproto #' @format NULL #' @usage NULL #' @export GeomStepribbon <- ggproto( "GeomStepribbon", GeomRibbon, extra_params = c("na.rm"), draw_group = function(data, panel_scales, coord, na.rm = FALSE, direction = "hv") { if (na.rm) data <- data[complete.cases(data[c("x", "ymin", "ymax")]), ] data <- rbind(data, data) data <- data[order(data$x), ] data <- ggplot2_stairstep(data[complete.cases(data["x"]), ], direction = direction) GeomRibbon$draw_group(data, panel_scales, coord, na.rm = na.rm) } ) # code adapted from # https://github.com/tidyverse/ggplot2/blob/9741da5050f81b7b5c012c56d02f45fc93d68f89/R/geom-path.r#L320 ggplot2_stairstep <- function(data, direction = c("hv", "vh", "mid")) { direction <- match.arg(direction) data <- as.data.frame(data)[order(data$x), ] n <- nrow(data) if (n <= 1) { return(data[0, , drop = FALSE]) } if (direction == "vh") { xs <- rep(1:n, each = 2)[-2 * n] ys <- c(1, rep(2:n, each = 2)) } if (direction == "hv") { xs <- c(1, rep(2:n, each = 2)) ys <- rep(1:n, each = 2)[-2 * n] } if (direction == "mid") { xs <- rep(1:(n - 1), each = 2) ys <- rep(1:n, each = 2) } ymin <- c(data$ymin[ys]) ymax <- c(data$ymax[ys]) if (direction == "mid") { gaps <- data$x[-1] - data$x[-n] mid_x <- data$x[-n] + gaps/2 x <- c(data$x[1], mid_x[xs], data$x[n]) data_attr <- data[c(1, xs, n), setdiff(names(data), c("x", "ymin", "ymax"))] } else { x <- data$x[xs] ymin <- data$ymin[ys] ymax <- data$ymax[ys] data_attr <- data[xs, setdiff(names(data), c("x", "ymin", "ymax"))] } cbind(data.frame(x = x, ymin = ymin, ymax = ymax), data_attr) } pammtools/R/cumulative-coefficient.R0000644000176200001440000001336714767027042017266 0ustar liggesusers#' Extract cumulative coefficients (cumulative hazard differences) #' #' These functions are designed to extract (or mimic) the cumulative coefficients #' usually used in additive hazards models (Aalen model) to depict (time-varying) #' covariate effects. For PAMMs, these are the differences #' between the cumulative hazard rates where all covariates except one have the #' identical values. For a numeric covariate of interest, this calculates #' \eqn{\Lambda(t|x+1) - \Lambda(t|x)}. For non-numeric covariates #' the cumulative hazard of the reference level is subtracted from #' the cumulative hazards evaluated at all non reference levels. Standard #' errors are calculated using the delta method. #' #' @rdname cumulative_coefficient #' @param model Object from which to extract cumulative coefficients. #' @param data Additional data if necessary. #' @param terms A character vector of variables for which the cumulative #' coefficient should be calculated. #' @param ... Further arguments passed to methods. #' @export get_cumu_coef <- function(model, data = NULL, terms, ...) { UseMethod("get_cumu_coef", model) } #' @rdname cumulative_coefficient #' @export get_cumu_coef.gam <- function(model, data, terms, ...) { data <- ped_info(data) map(terms, ~cumu_coef(data, model, quo_name(sym(.)), ...)) %>% bind_rows() } #' @rdname cumulative_coefficient #' @param ci Logical. Indicates if confidence intervals should be returned as #' well. #' @export get_cumu_coef.aalen <- function(model, data = NULL, terms, ci = TRUE, ...) { terms <- map(c("time", terms), ~grep(.x, colnames(model$cum), value = TRUE)) %>% reduce(union) cumu_coef <- model[["cum"]] %>% as_tibble() %>% select(one_of(terms)) %>% gather("variable", "cumu_hazard", -.data[["time"]]) cumu_var <- model[["var.cum"]] %>% as_tibble() %>% select(terms) %>% gather("variable", "cumu_var", -.data[["time"]]) suppressMessages( left_join(cumu_coef, cumu_var) %>% mutate( method = class(model)[1], cumu_lower = .data$cumu_hazard - 2 * .data$cumu_var ** 0.5, cumu_upper = .data$cumu_hazard + 2 * .data$cumu_var ** 0.5) %>% select(one_of(c("method", "variable", "time")), everything(), -one_of("cumu_var")) ) } #' @rdname cumulative_coefficient #' @export get_cumu_coef.cox.aalen <- function(model, data = NULL, terms, ci = TRUE, ...) { get_cumu_coef.aalen(model = model, data = data, terms = terms, ci = ci, ...) } get_cumu_diff <- function(d1, d2, model, nsim = 100L) { lp <- compute_cumu_diff(d1, d2, model, nsim = nsim) d2 %>% mutate( cumu_hazard = lp[["cumu_diff"]], cumu_lower = lp[["cumu_lower"]], cumu_upper = lp[["cumu_upper"]]) } #' @import dplyr purrr #' @importFrom rlang sym enquo quo_name #' @keywords internal cumu_coef <- function(data, model, term, ...) { if (quo_name(term) == "(Intercept)") { return(get_cumu_coef_baseline(data, model)) } if (is.character(term)) { term <- sym(term) } else { term <- enquo(term) } qname_term <- quo_name(term) if (!is.numeric(data[[qname_term]])) { x <- levels(as.factor(unique(data[[qname_term]]))) } else { x <- mean(data[[qname_term]], na.rm = TRUE) x <- c(x, x + 1) } dat_list <- map(.x = x, function(z) { mutate_at(.tbl = data, .vars = qname_term, .funs = ~identity(z)) %>% mutate(variable = paste0(qname_term, ifelse(is.numeric(z), "", paste0(" (", z, ")")))) }) map2( .x = dat_list[1], .y = dat_list[-1], .f = ~ get_cumu_diff(.x, .y, model)) %>% map( ~ select(., one_of(c("variable", "tend")), contains("cumu")) %>% rename("time" = "tend") %>% mutate(method = class(model)[1]) ) %>% bind_rows() %>% select(one_of(c("method", "variable", "time")), everything()) } #' @keywords internal get_cumu_coef_baseline <- function(data, model, ...) { vars_modify <- colnames(data)[map_lgl(data, is.numeric)] %>% setdiff(c("tstart", "tend", "intlen", "intmid")) data %>% mutate_at( .vars = vars(one_of(vars_modify)), .funs = ~c(0)) %>% add_cumu_hazard(model) %>% mutate( method = class(model)[1], variable = "(Intercept)") %>% rename("time" = "tend") %>% select(one_of(c("method", "variable", "time", "cumu_hazard", "cumu_lower", "cumu_upper"))) } #' Calculate difference in cumulative hazards and respective standard errors #' #' CIs are calculated by sampling coefficients from their posterior and #' calculating the cumulative hazard difference \code{nsim} times. The CI #' are obtained by the 2.5\% and 97.5\% quantiles. #' #' @param d1 A data set used as \code{newdata} in \code{predict.gam} #' @param d2 See \code{d1} #' @param model A model object for which a predict method is implemented which #' returns the design matrix (e.g., \code{mgcv::gam}). #' @importFrom mgcv predict.gam #' @importFrom stats coef #' @importFrom mvtnorm rmvnorm #' @keywords internal compute_cumu_diff <- function(d1, d2, model, alpha = 0.05, nsim = 100L) { X1 <- predict.gam(model, newdata = d1, type = "lpmatrix") X2 <- predict.gam(model, newdata = d2, type = "lpmatrix") V <- model$Vp coefs <- coef(model) sim_coef_mat <- rmvnorm(nsim, mean = coefs, sigma = V) sim_fit_mat <- apply(sim_coef_mat, 1, function(z) { cumsum(d2$intlen * exp(drop(X2 %*% z))) - cumsum(d1$intlen * exp(drop(X1 %*% z))) }) cumu_lower <- apply(sim_fit_mat, 1, quantile, probs = alpha / 2) cumu_upper <- apply(sim_fit_mat, 1, quantile, probs = 1 - alpha / 2) haz1 <- exp(drop(X1 %*% model$coefficients)) haz2 <- exp(drop(X2 %*% model$coefficients)) cumu_diff <- cumsum(haz2 * d2$intlen) - cumsum(haz1 * d1$intlen) list(cumu_diff = cumu_diff, cumu_lower = cumu_lower, cumu_upper = cumu_upper) } pammtools/R/convenience-plots.R0000644000176200001440000001011014767027042016246 0ustar liggesusers#' Plot smooth 1d terms of gam objects #' #' Given a gam model this convenience function returns a plot of all #' smooth terms contained in the model. If more than one smooth is present, the #' different smooth are faceted. #' #' @param x A data frame or object of class \code{ped}. #' @param ... Further arguments passed to \code{\link{get_terms}} #' @import ggplot2 #' @return A \code{\link[ggplot2]{ggplot}} object. #' @examples #' g1 <- mgcv::gam(Sepal.Length ~ s(Sepal.Width) + s(Petal.Length), data=iris) #' gg_smooth(iris, g1, terms=c("Sepal.Width", "Petal.Length")) #' @export #' @seealso get_terms gg_smooth <- function(x, ...) { UseMethod("gg_smooth", x) } #' @rdname gg_smooth #' @param fit A model object. #' @export gg_smooth.default <- function(x, fit, ...) { sobj <- get_terms(data = x, fit = fit, ...) ggsmooth <- ggplot(sobj, aes(x = .data[["x"]], y = .data[["eff"]], group = .data[["term"]])) + geom_hline(yintercept = 0, lty = 3) + geom_line() + geom_ribbon(aes(ymin = .data[["ci_lower"]], ymax = .data[["ci_upper"]]), alpha = 0.2) + facet_wrap(~term, scales = "free_x") + ylab(expression(f[p](x[p]))) + xlab(expression(x[p])) return(ggsmooth) } #' Plot tensor product effects #' #' Given a gam model this convenience function returns a \code{ggplot2} object #' depicting 2d smooth terms specified in the model as heat/contour plots. If #' more than one 2d smooth term is present individual terms are faceted. #' @inheritParams tidy_smooth2d #' @importFrom tidyr gather #' @importFrom dplyr mutate #' @examples #' g <- mgcv::gam(Sepal.Length ~ te(Sepal.Width, Petal.Length), data=iris) #' gg_tensor(g) #' gg_tensor(g, ci=TRUE) #' gg_tensor(update(g, .~. + te(Petal.Width, Petal.Length))) #' @seealso \code{\link{tidy_smooth2d}} #' @export gg_tensor <- function(x, ci = FALSE, ...) { df2d <- tidy_smooth2d(x, ci = ci, se = ci, ...) if (ci) { df2d <- df2d %>% gather("type", "fit", .data$fit, .data$ci_lower, .data$ci_upper) %>% mutate(type = factor(.data$type, levels = c("ci_lower", "fit", "ci_upper"))) } gg2d <- ggplot(df2d, aes(x = .data[["x"]], y = .data[["y"]], z = .data[["fit"]])) + geom_raster(aes(fill = .data[["fit"]])) + scale_fill_gradient2( name = expression(f(list(x, y))), low = "steelblue", high = "firebrick2") + scale_x_continuous(expand = c(0, 0)) + scale_y_continuous(expand = c(0, 0)) + geom_contour(col = "grey30") if (ci) { gg2d + facet_grid(main ~ type, scales = "free") } else { gg2d + facet_wrap(~main, scales = "free") } } #' Plot Normal QQ plots for random effects #' #' @inherit tidy_re #' @import ggplot2 #' @examples #' library(pammtools) #' data("patient") #' ped <- patient %>% #' dplyr::slice(1:100) %>% #' as_ped(Surv(Survdays, PatientDied)~ ApacheIIScore + CombinedicuID, id="CombinedID") #' pam <- mgcv::gam(ped_status ~ s(tend) + ApacheIIScore + s(CombinedicuID, bs="re"), #' data=ped, family=poisson(), offset=offset) #' gg_re(pam) #' plot(pam, select = 2) #' @seealso \code{\link{tidy_re}} #' @export gg_re <- function(x, ...) { re <- tidy_re(x, ...) ggplot(re, aes(sample = .data[["fit"]])) + geom_abline(aes(intercept = .data[["qqintercept"]], slope = .data[["qqslope"]])) + geom_qq(distribution = stats::qnorm) + facet_wrap(~main) + theme_set(theme_bw()) } #' Forrest plot of fixed coefficients #' #' @inherit tidy_fixed #' @param intercept Logical, indicating whether intercept term should be included. #' Defaults to \code{FALSE}. #' @import ggplot2 #' @seealso \code{\link{tidy_fixed}} #' @examples #' g <- mgcv::gam(Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width + Species, #' data=iris) #' gg_fixed(g, intercept=TRUE) #' gg_fixed(g) #' @export gg_fixed <- function(x, intercept=FALSE, ...) { fixed_df <- tidy_fixed(x, intercept = intercept, ...) ggplot(fixed_df, aes(x = .data[["variable"]], y = .data[["coef"]], ymin = .data[["ci_lower"]], ymax = .data[["ci_upper"]])) + geom_hline(yintercept = 0, lty = 3) + geom_pointrange() + coord_flip() + ylab(expression(hat(beta) %+-% 1.96 %.% SE)) + xlab("") } pammtools/R/formula-specials.R0000644000176200001440000002754614767027042016106 0ustar liggesusers#' Formula specials for defining time-dependent covariates #' #' So far, two specials are implemented. \code{concurrent} is used when #' the goal is to estimate a concurrent effect of the TDC. \code{cumulative} #' is used when the goal is to estimate a cumulative effect of the TDC. These #' should usually not be called directly but rather as part of the \code{formula} #' argument to \code{as_ped}. #' See the \href{https://adibender.github.io/pammtools//articles/data-transformation.html}{vignette on data transformation} #' for details. #' #' #' @rdname specials #' @importFrom purrr map #' #' @param ... For \code{concurrent} variables that will be transformed to #' covariate matrices. The number of columns of each covariate depends on \code{tz}. #' Usually, elements that will be specified here are \code{time} (which should be #' the name of the time-variable used on the LHS of the formula argument to #' \code{as_ped}), \code{tz} which is the variable containing information on #' the times at which the TDC was observed (can be wrapped in \code{latency}) and #' the TDCs that share the same \code{tz} and Lag-lead window (\code{ll_fun}). #' @param tz_var The name of the variable that stores information on the #' times at which the TDCs specified in this term where observed. #' @param lag a single positive number giving the time lag between for #' a concurrent effect to occur (i.e., the TDC at time of exposure \code{t-lag} #' affects the hazard in the interval containing follow-up time \code{t}). #' Defaults to 0. #' #' @inheritParams get_laglead #' #' @export #' @keywords internal cumulative <- function(..., tz_var, ll_fun = function(t, tz) t >= tz, suffix = NULL) { vars <- as.list(substitute(list(...)))[-1] vars_chr <- vars %>% map(~as.character(.)) lgl_latency <- map_lgl(vars_chr, ~any(. %in% "latency")) if (any(lgl_latency)) { latency_var <- unlist(vars_chr)[unlist(vars_chr) != "latency"][lgl_latency] col_vars <- unlist(vars_chr)[unlist(vars_chr) != "latency"] } else { latency_var <- "" col_vars <- unlist(vars_chr) } list( col_vars = col_vars, latency_var = latency_var, tz_var = tz_var, suffix = suffix, ll_fun = ll_fun) } #' @rdname specials #' @inherit cumulative #' @keywords internal concurrent <- function(..., tz_var, lag = 0, suffix = NULL) { assert_number(lag, lower = 0) ll_fun = function(t, tz) {t > tz + lag} vars <- as.list(substitute(list(...)))[-1] vars_chr <- vars %>% map(~as.character(.)) %>% unlist() list( col_vars = vars_chr, tz_var = tz_var, suffix = suffix, ll_fun = ll_fun, lag = lag) } #' Expand time-dependent covariates to functionals #' #' Given formula specification on how time-dependent covariates affect the #' outcome, creates respective functional covariate as well as auxiliary #' matrices for time/latency etc. #' #' @param data Data frame (or similar) in which variables specified in ... #' will be looked for #' @param formula A formula containing \code{cumulative} specials, #' that specify the type of cumulative effect one wants to estimate. For details #' see the vignettes on data transformation and time-dependent covariates. #' @importFrom purrr flatten map #' @importFrom stats terms #' @keywords internal get_cumulative <- function(data, formula) { stopifnot(has_tdc_form(formula)) func_list <- eval_special(get_tdc_form(formula, data = data), data = data) n_func <- length(func_list) ll_funs <- map(func_list, ~.x[["ll_fun"]]) tz_vars <- map(func_list, ~.x[["tz_var"]]) tz <- map(tz_vars, ~pull(data, .x) %>% unlist() %>% unique() %>% sort()) names(tz) <- names(tz_vars) <- names(ll_funs) <- tz_vars ## create matrices func_mats <- map(func_list, ~ expand_cumulative(data = data, ., n_func = n_func)) %>% flatten() list( func_list = func_list, func_mats = func_mats, ll_funs = ll_funs, tz_vars = tz_vars, tz = tz) } #' @keywords internal eval_special <- function(formula, special="cumulative", data = NULL) { tf <- terms(formula, specials = special, data = data) ind_special <- attr(tf, "specials")[[special]] # extract components if (!is.null(ind_special)) { terms_vec <- attr(tf, "term.labels") map(terms_vec, ~eval(expr = parse(text = .x))) } else { NULL } } #' @rdname specials #' @inheritParams as_ped #' @param special The name of the special whose existence in the #' \code{formula} should be checked #' @keywords internal has_special <- function(formula, special = "cumulative") { has_tdc_form(formula, tdc_specials = special) } #' @rdname get_cumulative #' @inheritParams get_cumulative #' @param func Single evaluated \code{\link{cumulative}} term. #' @importFrom purrr map invoke_map #' @keywords internal expand_cumulative <- function(data, func, n_func) { col_vars <- func$col_vars tz_var <- func$tz_var tz <- pull(data, tz_var) %>% unlist() %>% unique() %>% sort() time_var <- attr(data, "time_var") id_var <- attr(data, "id_var") lgl_var_in_data <- map_lgl(col_vars, ~ . %in% colnames(data)) if (!all(lgl_var_in_data)) { stop(paste0("The following variables provided to 'formula' are not contained in 'data': ", col_vars[!lgl_var_in_data])) } ncols_vars <- get_ncols(data, col_vars[!(col_vars == time_var)]) if (!all(diff(ncols_vars) == 0)) { stop(paste0( "The following variables have unequal maximum number of elements per ", id_var, ": ", paste0(col_vars[!(col_vars == time_var)], sep = "; "))) } else { nz <- ncols_vars[1] } # create list of matrices for covariates/time matrices provided in func hist_mats <- list() for (i in seq_along(col_vars)) { hist_mats[[i]] <- if (col_vars[i] == attr(data, "time_var")) { make_time_mat(data, nz) } else if (col_vars[i] == func$latency_var) { make_latency_mat(data, tz) } else { make_z_mat(data, col_vars[i], nz) } } if (any(c(time_var, tz_var) %in% col_vars)) { hist_mats <- c(hist_mats, list(make_lag_lead_mat(data, tz, func$ll_fun))) names(hist_mats) <- make_mat_names(c(col_vars, "LL"), func$latency_var, tz_var, func$suffix, n_func) time_mat_ind <- grepl(time_var, names(hist_mats)) names(hist_mats)[time_mat_ind] <- paste0(names(hist_mats)[time_mat_ind], "_mat") } else { names(hist_mats) <- make_mat_names(col_vars, func$latency_var, tz_var, func$suffix, n_func) } hist_mats } #' Extract information on concurrent effects #' #' @keywords internal #' @param x A suitable object from which variables contained in #' \code{formula} can be extracted. #' @param ... Further arguments passed to methods. prep_concurrent <- function(x, formula, ...) { UseMethod("prep_concurrent", x) } #' @rdname prep_concurrent #' @inherit prep_concurrent #' @keywords internal prep_concurrent.list <- function(x, formula, ...) { lgl_concurrent <- has_special(formula, "concurrent") if (lgl_concurrent) { ccr_list <- eval_special(formula, special = "concurrent", x[[2]]) ccr_tz_vars <- map_chr(ccr_list, ~.x[["tz_var"]]) %>% unique() ccr_time <- map2(ccr_tz_vars, x, ~get_tz(.y, .x)) %>% keep(~ !is.null(.x)) %>% map2(ccr_list, ~ if(is.null(.x)) { .x } else { ifelse(.x == min(.x), .x, .x + .y$lag) }) %>% # leave time origin unchanged by lag # should just start modeling the hazard at t = lag?!? reduce(union) %>% sort() } list( ccr_list = ccr_list, ccr_time = ccr_time) } #' @keywords internal get_tz <- function(data, tz_var) { if (tz_var %in% colnames(data)) { tz <- pull(data, tz_var) %>% unique() } else { tz <- NULL } tz } #' @keywords internal #' @importFrom purrr map2 add_concurrent <- function(ped, data, id_var) { ccr <- attr(data, "ccr") ped_split <- split(ped$tend, f = ped[[id_var]]) for (ccr_i in ccr[["ccr_list"]]) { tdc_vars_i <- ccr_i[["col_vars"]] tz_var_i <- ccr_i[["tz_var"]] ccr_vars_i <- c(tz_var_i, tdc_vars_i) ccr_i_df <- data %>% select(one_of(c(id_var, ccr_vars_i))) ccr_i_df <- ccr_i_df %>% unnest(cols = -one_of(id_var)) li <- map2(ped_split, split(ccr_i_df, f = ccr_i_df[[id_var]]), function(.x, .y) { ll_ind <- rowSums(outer(.x, .y[[tz_var_i]], ccr_i$ll_fun)) .y[ll_ind, tdc_vars_i] }) %>% bind_rows() %>% as.data.frame() ped <- ped %>% bind_cols(li) } attr(ped, "ccr") <- ccr ped } #' @keywords internal add_cumulative <- function(ped, data, formula) { func_components <- get_cumulative(data, formula) func_matrices <- func_components$func_mats for (i in seq_along(func_matrices)) { ped[[names(func_matrices)[i]]] <- func_matrices[[i]] } attr(ped, "func") <- func_components$func_list attr(ped, "ll_funs") <- func_components$ll_funs attr(ped, "tz") <- func_components$tz attr(ped, "tz_vars") <- func_components$tz_vars ped } make_mat_names <- function(x, ...) { UseMethod("make_mat_names", x) } #' @keywords internal make_mat_names.default <- function( x, latency_var = NULL, tz_var = NULL, suffix = NULL, nfunc = 1, ...) { if (!is.null(suffix)) { return(paste(x, suffix, sep = "_")) } else { if (!is.null(tz_var) & nfunc > 1) { tz_ind <- x == tz_var x[!tz_ind] <- paste(x[!tz_ind], tz_var, sep = "_") } if (!is.null(latency_var)) { latency_ind <- x == latency_var x[latency_ind] <- paste(x[latency_ind], "latency", sep = "_") } } return(x) } #' @keywords internal make_mat_names.list <- function( x, time_var, ...) { hist_names <- map(x, ~ make_mat_names(c(.x[["col_vars"]], "LL"), .x[["latency_var"]], .x[["tz_var"]], .x[["suffix"]], nfunc = length(x))) time_mat_ind <- map(hist_names, ~grepl(time_var, .)) for (i in seq_along(time_mat_ind)) { hist_names[[i]][time_mat_ind[[i]]] <- paste0(hist_names[[i]][time_mat_ind[[i]]], "_mat") } hist_names } #' Create matrix components for cumulative effects #' #' These functions are called internally by \code{\link{get_cumulative}} and #' should usually not be called directly. #' @rdname elra_matrix #' @param data A data set (or similar) from which meta information on cut-points, #' interval-specific time, covariates etc. can be obtained. #' #' @keywords internal make_time_mat <- function(data, nz) { brks <- attr(data, "breaks") id_tseq <- attr(data, "id_tseq") Tmat <- matrix(brks[id_tseq], nrow = length(id_tseq), ncol = nz) Tmat } #' @rdname elra_matrix #' @inherit make_time_mat #' @keywords internal make_latency_mat <- function(data, tz) { time <- attr(data, "breaks") id_tseq <- attr(data, "id_tseq") Latency_mat <- outer(time, tz, FUN = "-") Latency_mat[Latency_mat < 0] <- 0 Latency_mat[id_tseq, , drop = FALSE] } #' @rdname elra_matrix #' @inherit make_time_mat #' @keywords internal make_lag_lead_mat <- function( data, tz, ll_fun = function(t, tz) t >= tz) { LL <- outer(attr(data, "breaks"), tz, FUN = ll_fun) * 1L delta <- abs(diff(tz)) IW <- matrix(c(mean(delta), delta), ncol = length(tz), nrow = nrow(LL), byrow = TRUE) LL <- LL * IW LL[attr(data, "id_tseq"), , drop = FALSE] } #' @rdname elra_matrix #' @inherit make_time_mat #' @param z_var Which should be transformed into functional covariate format #' suitable to fit cumulative effects in \code{mgcv::gam}. #' @importFrom purrr map map_int #' @importFrom dplyr pull #' @keywords internal make_z_mat <- function(data, z_var, nz, ...) { tz_ind <- seq_len(nz) Z <- map(data[[z_var]], .f = ~ unlist(.x)[tz_ind]) Z <- do.call(rbind, Z) colnames(Z) <- paste0(z_var, tz_ind) Z[is.na(Z)] <- 0 Z[attr(data, "id_tz_seq"), , drop = FALSE] } get_ncols <- function(data, col_vars) { map(col_vars, ~pull(data, .x) %>% map_int(function(z) ifelse(is.atomic(z), length(z), nrow(z)))) %>% map_int(max) } pammtools/R/data.R0000644000176200001440000000653615144603076013542 0ustar liggesusers#' Survival data of critically ill ICU patients #' #' A data set containing the survival time (or hospital release time) among #' other covariates. #' The full data is available \href{https://github.com/adibender/elra-biostats}{here}. #' The following variables are provided: #' \describe{ #' \item{Year}{The year of ICU Admission} #' \item{CombinedicuID}{Intensive Care Unit (ICU) ID} #' \item{CombinedID}{Patient identificator} #' \item{Survdays}{Survival time of patients. Here it is assumed that patients #' survive until t=30 if released from hospital.} #' \item{PatientDied}{Status indicator; 1=death, 0=censoring} #' \item{survhosp}{Survival time in hospital. Here it is assumed that patients #' are censored at time of hospital release (potentially informative)} #' \item{Gender}{Male or female} #' \item{Age}{The patients age at Admission} #' \item{AdmCatID}{Admission category: medical, surgical elective or surgical emergency} #' \item{ApacheIIScore}{The patient's Apache II Score at Admission} #' \item{BMI}{Patient's Body Mass Index} #' \item{DiagID2}{Diagnosis at admission in 9 categories} } "patient" #' Time-dependent covariates of the \code{\link{patient}} data set. #' #' This data set contains the time-dependent covariates (TDCs) for the \code{\link{patient}} #' data set. Note that nutrition was protocoled for at most 12 days after #' ICU admission. The data set includes: #' \describe{ #' \item{CombinedID}{Unique patient identifier. Can be used to merge with #' \code{\link{patient}} data} #' \item{Study_Day}{The calendar (!) day at which calories (or proteins) were #' administered} #' \item{caloriesPercentage}{The percentage of target calories supplied to the #' patient by the ICU staff} #' \item{proteinGproKG}{The amount of protein supplied to the patient by the #' ICU staff}} "daily" #' Simulated data with cumulative effects #' #' This is data simulated using the \code{\link[pammtools]{sim_pexp}} function. #' It contains two time-constant and two time-dependent covariates (observed #' on different exposure time grids). The code used for simulation is #' contained in the examples of \code{?sim_pexp}. #' "simdf_elra" #' Stomach area tumor data #' #' Information on patients treated for a cancer disease #' located in the stomach area. #' The data set includes: #' \describe{ #' \item{days}{Time from operation until death in days.} #' \item{status}{Event indicator (0 = censored, 1 = death).} #' \item{age}{The subject's age.} #' \item{sex}{The subject's sex (male/female).} #' \item{charlson_score}{Charlson comorbidity score, 1-6.} #' \item{transfusion}{Has subject received transfusions (no/yes).} #' \item{complications}{Did major complications occur during operation (no/yes).} #' \item{metastases}{Did the tumor develop metastases? (no/yes).} #' \item{resection}{Was the operation accompanied by a major resection (no/yes).} #' } #' "tumor" #' Time until staphylococcus aureaus infection in children, with possible recurrence #' #' This dataset originates from the Drakenstein child health study. #' The data contains the following variables: #' \describe{ #' \item{id}{Randomly generated unique child ID} #' \item{t.start}{The time at which the child enters the risk set for the $k$-th event} #' \item{t.stop}{Time of $k$-th infection or censoring}. #' \item{enum}{Event number. Maximum of 6.} #' \item{hiv}{} #' } "staph" pammtools/R/predict.R0000644000176200001440000000321414767027042014254 0ustar liggesusers#' S3 method for pamm objects for compatibility with package pec #' #' @inheritParams pec::predictSurvProb #' @importFrom pec predictSurvProb #' @importFrom purrr map #' #' @export predictSurvProb.pamm <- function( object, newdata, times, ...) { if (!is.ped(newdata)) { trafo_args <- object[["trafo_args"]] id_var <- trafo_args[["id"]] brks <- trafo_args[["cut"]] if ( max(times) > max(brks) ) { stop("Can not predict beyond the last time point used during model estimation. Check the 'times' argument.") } ped_times <- sort(unique(union(c(0, brks), times))) # extract relevant intervals only, keeps data small ped_times <- ped_times[ped_times <= max(times)] # obtain interval information ped_info <- get_intervals(brks, ped_times[-1]) # add adjusted offset such that cumulative hazard and survival probability # can be calculated correctly ped_info[["intlen"]] <- c(ped_info[["times"]][1], diff(ped_info[["times"]])) # create data set with interval/time + covariate info newdata[[id_var]] <- seq_len(nrow(newdata)) newdata <- combine_df(ped_info, newdata) } env_times <- times newdata[["pred"]] <- unname(predict( unpam(object), newdata = newdata, type = "response")) newdata <- newdata %>% arrange(.data$id, .data$times) %>% group_by(.data$id) %>% mutate(pred = exp(-cumsum(.data$pred * .data$intlen))) %>% ungroup() %>% filter(.data[["times"]] %in% env_times) id <- unique(newdata[[id_var]]) pred_list <- map( id, ~ newdata[newdata[[id_var]] == .x, "pred"] %>% pull("pred")) do.call(rbind, pred_list) } pammtools/R/warnings.R0000644000176200001440000000472714767026617014473 0ustar liggesusers#' Warn if new t_j are used #' #' @keywords internal warn_about_new_time_points <- function(object, newdata, ...) { UseMethod("warn_about_new_time_points", object) } #' @inherit warn_about_new_time_points #' @keywords internal warn_about_new_time_points.glm <- function(object, newdata, time_var, ...) { is_pam <- (inherits(object, "gam" ) | inherits( object, "scam")) if (is_pam && is.null(object$model)) { return(invisible()) } original_intervals <- if (is_pam) { unique(model.frame(object)[[time_var]]) } else { levels(model.frame(object)[[time_var]]) } prediction_intervals <- if (is_pam) { unique(newdata[[time_var]]) } else { levels(factor(newdata[[time_var]])) } new_ints <- which(!(prediction_intervals %in% original_intervals)) if (length(new_ints)) { message <- paste0( "Time points/intervals in new data not equivalent to time points/intervals during model fit.", " Setting intervals to values not used for original fit", "can invalidate the PEM assumption and yield incorrect predictions.") if (is_pam) warning(message) else stop(message) } } #' @rdname warn_about_new_time_points warn_about_new_time_points.pamm <- function(object, newdata, ...) { if (inherits(object, "pamm")) { int_original <- int_info(object) if ("interval" %in% colnames(newdata)) { int_new <- unique(newdata[["interval"]]) if(!all(int_new %in% int_original[["interval"]])) { warning( paste0( "Time points/intervals in new data not equivalent to time points/intervals during model fit.", " Setting intervals to values not used for original fit", "can invalidate the PEM assumption and yield incorrect predictions." ) ) } } } } # #' @keywords internal # #' @importFrom dplyr intersect union setequal # warn_partial_overlap <- function(event_id, tdc_id) { # common_id <- intersect(event_id, tdc_id) # union_id <- union(event_id, tdc_id) # if (!setequal(common_id, union_id)) { # warning("Not all IDs are present in both data sets. # IDs that do not appear in both data sets will be removed.") # } # invisible(common_id) # } status_error <- function(data, formula, censor_code = 0L) { outcome_vars <- get_lhs_vars(formula) if (!any(unique(data[[outcome_vars[length(outcome_vars)]]]) != censor_code)) { stop(paste( "No events in data! Check your", outcome_vars[length(outcome_vars)], "variable.")) } } pammtools/R/model-evaluation.R0000644000176200001440000000117614767027042016074 0ustar liggesusers#' Transform crps object to data.frame #' #' A\code{as.data.frame} S3 method for objects of class \code{\link[pec]{crps}}. #' #' @inheritParams base::as.data.frame #' @param x An object of class \code{crps}. See \code{\link[pec]{crps}}. #' @importFrom tidyr pivot_longer #' #' @export as.data.frame.crps <- function(x, row.names = NULL, optional = FALSE, ...) { m <- matrix(x, nrow = dim(x)[1], ncol = dim(x)[2]) colnames(m) <- attr(x, "dimnames")[[2]] m <- as.data.frame(m) m$method <- attr(x, "dimnames")[[1]] m <- m %>% pivot_longer(cols = -one_of("method"), values_to = "IBS") %>% dplyr::rename(time = "name") } pammtools/R/formula-utils.R0000644000176200001440000000510314761333717015427 0ustar liggesusers#' Extract variables from the left-hand-side of a formula #' #' @rdname formula_helpers #' @param formula A \code{\link{formula}} object. #' @import Formula #' @keywords internal get_lhs_vars <- function(formula) { if (is.character(formula) ) formula <- as.formula(formula) formula(Formula(formula), lhs = TRUE, rhs = FALSE) %>% all.vars() } #' Extract variables from the right-hand side of a formula #' #' @rdname formula_helpers #' @keywords internal get_rhs_vars <- function(formula) { if (is.character(formula) ) formula <- as.formula(formula) formula(Formula(formula), lhs = FALSE, rhs = TRUE) %>% all.vars() } #' @inherit get_lhs_vars #' @keywords internal get_tdc_vars <- function( formula, specials = "cumulative", data = NULL) { f_specials <- get_tdc_form(formula, data = data, tdc_specials = specials) terms_f <- terms(f_specials, specials = specials) all.vars(terms_f) } #' @inherit get_lhs_vars #' @keywords internal get_tdc_form <- function( formula, data = NULL, tdc_specials = c("concurrent", "cumulative"), invert = FALSE) { terms <- terms(formula, data = data, specials = tdc_specials) labels <- attr(terms, "term.labels") ind_tdc <- map(tdc_specials, ~grep(.x, labels)) %>% unlist() if(invert) { if(length(ind_tdc) > 0) { formula(terms[ind_tdc * -1]) } else { formula } } else { formula(terms[ind_tdc]) } } #' @inherit get_lhs_vars #' @keywords internal get_ped_form <- function( formula, data = NULL, tdc_specials = c("concurrent", "cumulative")) { get_tdc_form(formula, data = data, tdc_specials = tdc_specials, invert = TRUE) } #' @keywords internal has_tdc_form <- function( formula, tdc_specials = c("concurrent", "cumulative")) { form_chr <- as.character(formula) %>% paste0(collapse = "") any(map_lgl(tdc_specials, ~grepl(.x, form_chr))) } has_lhs <- function(formula) { length(Formula(formula))[1] > 0 } update_formula <- function(formula, proposed_names) { lhs_vars <- get_lhs_vars(formula) stopifnot(length(lhs_vars) == length(proposed_names)) rhs_form <- formula(Formula(formula), rhs = 1, lhs = 0) lhs_vars <- proposed_names lhs_form <- paste0("Surv(", paste0(lhs_vars, collapse=", "), ")") as.formula(paste0(lhs_form, "~", as.character(rhs_form))[2]) } add_to_rhs <- function(formula, rhs_additions = NULL) { lhs_vars <- get_lhs_vars(formula) rhs_vars <- c(get_rhs_vars(formula), rhs_additions) as.formula( paste0( "Surv(", paste0(lhs_vars, collapse=","), ") ~ ", paste0(rhs_vars, collapse = "+") ) ) } pammtools/R/sim-pexp.R0000644000176200001440000002473714767027042014401 0ustar liggesusers#' Simulate survival times from the piece-wise exponential distribution #' #' @param formula An extended formula that specifies the linear predictor. #' If you want to include a smooth baseline #' or time-varying effects, use \code{t} within your formula as #' if it was a covariate in the data, although it is not and should not #' be included in the \code{data} provided to \code{sim_pexp}. See examples #' below. #' #' @param data A data set with variables specified in \code{formula}. #' @param cut A sequence of time-points starting with 0. #' @import dplyr #' @import Formula #' @importFrom lazyeval f_eval #' @importFrom tidyr replace_na #' @examples #' library(survival) #' library(dplyr) #' library(pammtools) #' #' # set number of observations/subjects #' n <- 250 #' # create data set with variables which will affect the hazard rate. #' df <- cbind.data.frame(x1 = runif (n, -3, 3), x2 = runif (n, 0, 6)) %>% #' as_tibble() #' # the formula which specifies how covariates affet the hazard rate #' f0 <- function(t) { #' dgamma(t, 8, 2) *6 #' } #' form <- ~ -3.5 + f0(t) -0.5*x1 + sqrt(x2) #' set.seed(24032018) #' sim_df <- sim_pexp(form, df, 1:10) #' head(sim_df) #' plot(survfit(Surv(time, status)~1, data = sim_df )) #' #' # for control, estimate with Cox PH #' mod <- coxph(Surv(time, status) ~ x1 + pspline(x2), data=sim_df) #' coef(mod)[1] #' layout(matrix(1:2, nrow=1)) #' termplot(mod, se = TRUE) #' #' # and using PAMs #' layout(1) #' ped <- sim_df %>% as_ped(Surv(time, status)~., max_time=10) #' library(mgcv) #' pam <- gam(ped_status ~ s(tend) + x1 + s(x2), data=ped, family=poisson, offset=offset) #' coef(pam)[2] #' plot(pam, page=1) #' #'\dontrun{ #' # Example 2: Functional covariates/cumulative coefficients #' # function to generate one exposure profile, tz is a vector of time points #' # at which TDC z was observed #' rng_z = function(nz) { #' as.numeric(arima.sim(n = nz, list(ar = c(.8, -.6)))) #' } #' # two different exposure times for two different exposures #' tz1 <- 1:10 #' tz2 <- -5:5 #' # generate exposures and add to data set #' df <- df %>% #' add_tdc(tz1, rng_z) %>% #' add_tdc(tz2, rng_z) #' df #' #' # define tri-variate function of time, exposure time and exposure z #' ft <- function(t, tmax) { #' -1*cos(t/tmax*pi) #' } #' fdnorm <- function(x) (dnorm(x,1.5,2)+1.5*dnorm(x,7.5,1)) #' wpeak2 <- function(lag) 15*dnorm(lag,8,10) #' wdnorm <- function(lag) 5*(dnorm(lag,4,6)+dnorm(lag,25,4)) #' f_xyz1 <- function(t, tz, z) { #' ft(t, tmax=10) * 0.8*fdnorm(z)* wpeak2(t - tz) #' } #' f_xyz2 <- function(t, tz, z) { #' wdnorm(t-tz) * z #' } #' #' # define lag-lead window function #' ll_fun <- function(t, tz) {t >= tz} #' ll_fun2 <- function(t, tz) {t - 2 >= tz} #' # simulate data with cumulative effect #' sim_df <- sim_pexp( #' formula = ~ -3.5 + f0(t) -0.5*x1 + sqrt(x2)| #' fcumu(t, tz1, z.tz1, f_xyz=f_xyz1, ll_fun=ll_fun) + #' fcumu(t, tz2, z.tz2, f_xyz=f_xyz2, ll_fun=ll_fun2), #' data = df, #' cut = 0:10) #'} #' @export sim_pexp <- function(formula, data, cut) { data <- data %>% mutate( id = row_number(), time = max(cut), status = 1) # extract formulas for different components Form <- Formula(formula) f1 <- formula(Form, rhs = 1) # later more sophisticated checks + could be used to map over all rhs # formulae, check what type of evaluation is needed and return ETAs for # each part of the formula separated by |, such that model estimation may # be checked for individuals terms/parts if (length(Form)[2] > 1) { f2 <- formula(Form, rhs = 2) } else { f2 <- NULL } # construct eta for time-constant part ped <- split_data( formula = Surv(time, status)~., data = select_if(data, is_atomic), cut = cut, id = "id") %>% rename("t" = "tstart") %>% mutate(rate = exp(f_eval(f1, .))) # construct eta for time-dependent part if (!is.null(f2)) { terms_f2 <- terms(f2, specials = "fcumu") f2_ev <- list() f2_tl <- attr(terms_f2, "term.labels") for (i in seq_along(f2_tl)) { f2_ev[[i]] <- eval(expr = parse(text = f2_tl[[i]]), envir = .GlobalEnv) } ll_funs <- map(f2_ev, ~.x[["ll_fun"]]) tz_vars <- map_chr(f2_ev, ~.x[["vars"]][1]) cumu_funs <- map(f2_ev, ~.x[["f_xyz"]]) names(tz_vars) <- names(ll_funs) <- names(cumu_funs) <- tz_vars z_form <- list("eta_", map_chr(f2_ev, ~.x[["vars"]][2])) %>% reduce(paste0, collapse = "+") %>% paste0("~", .) %>% as.formula() df2 <- map(f2_ev, function(fc) eta_cumu(data = data, fc, cut = cut)) suppressMessages( ped <- ped %>% left_join(reduce(df2, full_join)) ) ped <- ped %>% mutate_at(vars(contains("eta_")), replace_na, 0) %>% group_by(.data$id, .data$t) %>% mutate(eta_z = !!rlang::get_expr(z_form)) %>% mutate(rate = .data$rate * exp(.data$eta_z)) } else { tz_vars <- NULL } sim_df <- ped %>% group_by(id) %>% summarize(time = rpexp(rate = .data$rate, t = .data$t)) %>% mutate( status = 1L * (.data$time <= max(cut)), time = pmin(.data$time, max(cut))) suppressMessages( sim_df <- sim_df %>% left_join(select(data, -all_of(c("time", "status")))) ) attr(sim_df, "id_var") <- "id" attr(sim_df, "time_var") <- "time" attr(sim_df, "status_var") <- "status" attr(sim_df, "tz_var") <- tz_vars attr(sim_df, "cens_value") <- 0 attr(sim_df, "breaks") <- cut attr(sim_df, "tz") <- imap(tz_vars, ~select(sim_df, all_of(.x)) %>% pull(.x) %>% unique()) %>% flatten() if (exists("ll_funs")) attr(sim_df, "ll_funs") <- ll_funs if (exists("cumu_funs")) attr(sim_df, "cumu_funs") <- cumu_funs attr(sim_df, "id_n") <- sim_df %>% pull("time") %>% pmin(max(cut)) %>% map_int(findInterval, vec = cut, left.open = TRUE, rightmost.closed = TRUE) attr(sim_df, "id_tseq") <- attr(sim_df, "id_n") %>% map(seq_len) %>% unlist() attr(sim_df, "id_tz_seq") <- rep(seq_along(pull(sim_df, id)), times = attr(sim_df, "id_n")) attr(sim_df, "sim_formula") <- formula class(sim_df) <- c("sim_df", class(unped(sim_df))) if (any(!map_lgl(sim_df, is_atomic))) { class(sim_df) <- c("nested_fdf", class(sim_df)) } sim_df } #' Add time-dependent covariate to a data set #' #' Given a data set in standard format (with one row per subject/observation), #' this function adds a column with the specified exposure time points #' and a column with respective exposures, created from \code{rng_fun}. #' This function should usually only be used to create data sets passed #' to \code{\link[pammtools]{sim_pexp}}. #' #' @inheritParams sim_pexp #' @param tz A numeric vector of exposure times (relative to the #' beginning of the follow-up time \code{t}) #' @param rng_fun A random number generating function that creates #' the time-dependent covariates at time points \code{tz}. #' First argument of the function should be \code{n}, the number of #' random numbers to generate. Within \code{add_tdc}, \code{n} will be set #' to \code{length(tz)}. #' @param ... Currently not used. #' @import dplyr #' @importFrom rlang eval_tidy := #' @importFrom purrr map #' @export add_tdc <- function(data, tz, rng_fun, ...) { tz <- enquo(tz) nz <- length(eval_tidy(tz)) name_tz <- quo_name(tz) z_var <- paste0("z.", name_tz) data %>% mutate( !!name_tz := map(seq_len(n()), ~ !!tz), !!z_var := map(seq_len(n()), ~ rng_fun(nz = nz))) %>% as_tibble() } #' A formula special used to handle cumulative effect specifications #' #' Can be used in the second part of the formula specification provided #' to \code{\link[pammtools]{sim_pexp}} and should only be used in this #' context. #' #' @importFrom purrr map #' @export #' @keywords internal fcumu <- function(..., by = NULL, f_xyz, ll_fun) { vars <- as.list(substitute(list(...)))[-1] %>% map(~as.character(.x)) %>% unlist() vars <- vars[vars != "t"] list( vars = vars, f_xyz = f_xyz, ll_fun = ll_fun) } #' @import dplyr #' @importFrom tidyr unnest #' @importFrom rlang sym := #' @keywords internal eta_cumu <- function(data, fcumu, cut, ...) { vars <- fcumu$vars f_xyz <- fcumu$f_xyz ll_fun <- fcumu$ll_fun eta_name <- paste0("eta_", vars[2]) comb_df <- combine_df( data.frame(t = cut), select(data, one_of("id", vars))) comb_df <- comb_df %>% unnest(cols = -one_of("id")) comb_df %>% group_by(.data$id, .data$t) %>% mutate( LL = ll_fun(t, !!sym(vars[1])) * 1, delta = c(mean(abs(diff(!!sym(vars[1])))), abs(diff(!!sym(vars[1]))))) %>% ungroup() %>% filter(.data$LL != 0) %>% group_by(.data$id, .data$t) %>% summarize(!!eta_name := sum(.data$delta * f_xyz(.data$t, .data[[vars[1]]], .data[[vars[2]]]))) } #' Simulate data for competing risks scenario #' #' #' @keywords internal sim_pexp_cr <- function(formula, data, cut) { # Formula extends the base class formula by allowing for multiple responses and multiple parts of regressors Form <- Formula(formula) # Extract the right handside of the Formula F_rhs <- attr(Form, "rhs") l_rhs <- length(F_rhs) seq_rhs <- seq_len(l_rhs) if (!("id" %in% names(data))) { data$id <- 1:(nrow(data)) } if (!("t" %in% names(data))) { data$t <- 0 } data <- data %>% mutate( time = max(cut), status = 1 ) # construct eta for time-constant part # offset (the log of the duration during which the subject was under risk in that interval) ped <- split_data( formula = Surv(time, status)~., data = select_if(data, is_atomic), cut = cut, id = "id") %>% mutate( t = t + .data$tstart ) # calculate cause specific hazards for (i in seq_rhs) { ped[[paste0("hazard", i)]] <- exp(eval(F_rhs[[i]], ped)) } ped[["rate"]] <- reduce(ped[paste0("hazard", seq_rhs)], `+`) # simulate survival times sim_df <- ped %>% group_by(id) %>% mutate( time = rpexp(rate = .data$rate, t = .data$tstart), status = 1L * (.data$time <= max(cut)), time = pmin(.data$time, max(cut)), # t wieder ins "Original" zurückrechnen, muss später auf die Waitingtime drauf gerechnet werden t = .data$t - .data$tstart ) %>% filter(.data$tstart < .data$time & .data$time <= .data$tend) # Ziehe aus den möglichen hazards eins mit den entsprechenden Wahrscheinlichkeiten sim_df$type <- apply(sim_df[paste0("hazard", seq_rhs)], 1, function(probs) sample(seq_rhs, 1, prob = probs)) sim_df %>% select(-one_of(c("tstart", "tend", "interval", "offset", "ped_status", "rate"))) } pammtools/R/rpexp.R0000644000176200001440000000212214241673657013763 0ustar liggesusers#' Draw random numbers from piece-wise exponential distribution. #' #' This is a copy of the same function from \code{rpexp} from package #' \pkg{msm}. #' Copied here to reduce dependencies. #' #' @inheritParams msm::rpexp #' @importFrom stats rexp #' #' @keywords internal rpexp <- function (n = 1, rate = 1, t = 0) { if (length(t) != length(rate)) stop("length of t must be equal to length of rate") if (!isTRUE(all.equal(0, t[1]))) stop("first element of t should be 0") if (is.unsorted(t)) stop("t should be in increasing order") if (length(n) > 1) n <- length(n) if (n == 0) return(numeric(0)) if (length(rate) == 1) return(rexp(n, rate)) ret <- numeric(n) left <- 1:n for (i in seq_along(rate)) { re <- rexp(length(left), rate[i]) r <- t[i] + re success <- if (i == length(rate)) seq_along(left) else which(r < t[i + 1]) ret[left[success]] <- r[success] left <- setdiff(left, left[success]) if (length(left) == 0) break } ret } pammtools/R/make-newdata.R0000644000176200001440000003600414767056237015173 0ustar liggesusers#' Extract information of the sample contained in a data set #' #' Given a data set and grouping variables, this function returns mean values #' for numeric variables and modus for characters and factors. Usually #' this function should not be called directly but will rather be called #' as part of a call to \code{make_newdata}. #' #' @rdname sample_info #' @param x A data frame (or object that inherits from \code{data.frame}). #' @importFrom stats median #' @return A data frame containing sample information (for each group). #' If applied to an object of class \code{ped}, the sample means of the #' original data is returned. #' Note: When applied to a \code{ped} object, that doesn't contain covariates #' (only interval information), returns data frame with 0 columns. #' #' @export #' @keywords internal sample_info <- function(x) { UseMethod("sample_info", x) } #' @import checkmate dplyr #' @importFrom purrr compose #' @export #' @rdname sample_info sample_info.data.frame <- function(x) { cn <- colnames(x) num <- summarize_if (x, .predicate = is.numeric, ~mean(., na.rm = TRUE)) fac <- summarize_if (x, .predicate = compose("!", is.numeric), modus) nnames <- intersect(names(num), names(fac)) if (length(nnames) != 0) { suppressMessages( x <- left_join(num, fac) %>% group_by(!!!lapply(nnames, as.name)) ) } else { x <- bind_cols(num, fac) } return(select(x, one_of(cn))) } #' @rdname sample_info #' @import checkmate dplyr #' @importFrom rlang sym #' @export sample_info.ped <- function(x) { # is.grouped_df # remove "noise" information on interval variables grps <- group_vars(x) iv <- attr(x, "intvars") id_var <- attr(x, "id_var") x <- x %>% group_by(!!sym(id_var)) %>% slice(1) %>% ungroup() %>% grouped_df(grps) %>% select(-one_of(iv)) if (test_data_frame(x, min.rows = 1, min.cols = 1)) { sample_info.data.frame(x) } else { NULL } } #' @rdname sample_info #' @export sample_info.fped <- function(x) { x %>% select_if(~!is.matrix(.x)) %>% sample_info.ped() } #' Create a data frame from all combinations of data frames #' #' Works like \code{\link[base]{expand.grid}} but for data frames. #' #' @importFrom dplyr slice bind_cols #' @importFrom vctrs vec_c #' @importFrom purrr map map_lgl #' @importFrom checkmate test_data_frame #' @param ... Data frames that should be combined to one data frame. #' Elements of first df vary fastest, elements of last df vary slowest. #' @examples #' combine_df( #' data.frame(x=1:3, y=3:1), #' data.frame(x1=c("a", "b"), x2=c("c", "d")), #' data.frame(z=c(0, 1))) #' @export #' @keywords internal combine_df <- function(...) { dots <- list(...) if (!all(sapply(dots, test_data_frame))) { stop("All elements in ... must inherit from data.frame!") } ind_seq <- map(dots, ~ seq_len(nrow(.x))) not_empty <- map_lgl(ind_seq, ~ length(.x) > 0) ord <- lapply(dots[not_empty], function(z) colnames(z)) |> unlist() out <- do.call(expand_grid, rev(dots[not_empty])) out <- out[, ord] } #' Construct a data frame suitable for prediction #' #' This functions provides a flexible interface to create a data set that #' can be plugged in as \code{newdata} argument to a suitable \code{predict} #' function (or similar). #' The function is particularly useful in combination with one of the #' \code{add_*} functions, e.g., \code{\link[pammtools]{add_term}}, #' \code{\link[pammtools]{add_hazard}}, etc. #' #' @rdname newdata #' @aliases make_newdata #' @importFrom tidyr expand_grid #' @inheritParams sample_info #' @param ... Covariate specifications (expressions) that will be evaluated #' by looking for variables in \code{x}. Must be of the form \code{z = f(z)} #' where \code{z} is a variable in the data set and \code{f} a known #' function that can be usefully applied to \code{z}. Note that this is also #' necessary for single value specifications (e.g. \code{age = c(50)}). #' For data in PED (piece-wise exponential data) format, one can also specify #' the time argument, but see "Details" an "Examples" below. #' @import dplyr #' @importFrom checkmate assert_data_frame assert_character #' @importFrom purrr map #' @importFrom tidyr expand_grid #' @details Depending on the type of variables in \code{x}, mean or modus values #' will be used for variables not specified in ellipsis #' (see also \code{\link[pammtools]{sample_info}}). If \code{x} is an object #' that inherits from class \code{ped}, useful data set completion will be #' attempted depending on variables specified in ellipsis. This is especially #' useful, when creating a data set with different time points, e.g. to #' calculate survival probabilities over time (\code{\link[pammtools]{add_surv_prob}}) #' or to calculate a time-varying covariate effects (\code{\link[pammtools]{add_term}}). #' To do so, the time variable has to be specified in \code{...}, e.g., #' \code{tend = seq_range(tend, 20)}. The problem with this specification is that #' not all values produced by \code{seq_range(tend, 20)} will be actual values #' of \code{tend} used at the stage of estimation (and in general, it will #' often be tedious to specify exact \code{tend} values). \code{make_newdata} #' therefore finds the correct interval and sets \code{tend} to the respective #' interval endpoint. For example, if the intervals of the PED object are #' \eqn{(0,1], (1,2]} then \code{tend = 1.5} will be set to \code{2} and the #' remaining time-varying information (e.g. offset) completed accordingly. #' See examples below. #' @examples #' # General functionality #' tumor %>% make_newdata() #' tumor %>% make_newdata(age=c(50)) #' tumor %>% make_newdata(days=seq_range(days, 3), age=c(50, 55)) #' tumor %>% make_newdata(days=seq_range(days, 3), status=unique(status), age=c(50, 55)) #' # mean/modus values of unspecified variables are calculated over whole data #' tumor %>% make_newdata(sex=unique(sex)) #' tumor %>% group_by(sex) %>% make_newdata() #' #' # Examples for PED data #' ped <- tumor %>% slice(1:3) %>% as_ped(Surv(days, status)~., cut = c(0, 500, 1000)) #' ped %>% make_newdata(age=c(50, 55)) #' #' # if time information is specified, other time variables will be specified #' # accordingly and offset calculated correctly #' ped %>% make_newdata(tend = c(1000), age = c(50, 55)) #' ped %>% make_newdata(tend = unique(tend)) #' ped %>% group_by(sex) %>% make_newdata(tend = unique(tend)) #' #' # tend is set to the end point of respective interval: #' ped <- tumor %>% as_ped(Surv(days, status)~.) #' seq_range(ped$tend, 3) #' make_newdata(ped, tend = seq_range(tend, 3)) #' @export make_newdata <- function(x, ...) { UseMethod("make_newdata", x) } #' @inherit make_newdata #' @rdname newdata #' @export make_newdata.default <- function(x, ...) { assert_data_frame(x, all.missing = FALSE, min.rows = 2, min.cols = 1) orig_names <- names(x) expressions <- quos(...) expr_evaluated <- map(expressions, lazyeval::f_eval, data = x) |> map(c) if ("tend" %in% names(expressions)) { if (any(expr_evaluated[["tend"]] <= 0)) { stop("'tend' variable must take values > 0.") } } # construct data parts depending on input type lgl_atomic <- map_lgl(expr_evaluated, is_atomic) # part1 <- expr_evaluated[lgl_atomic] |> cross_df() part1 <- do.call(tidyr::expand_grid, rev(expr_evaluated[lgl_atomic])) part2 <- do.call(combine_df, expr_evaluated[!lgl_atomic]) ndf <- combine_df(part1, part2) rest <- x %>% select(-one_of(c(colnames(ndf)))) if (ncol(rest) > 0) { si <- sample_info(rest) %>% ungroup() ndf <- combine_df(si, ndf) } ndf %>% select(one_of(orig_names)) } #' @rdname newdata #' @inherit make_newdata.default #' @export make_newdata.ped <- function(x, ...) { assert_data_frame(x, all.missing = FALSE, min.rows = 2, min.cols = 1) # prediction time points have to be interval end points so that piece-wise # constancy of predicted hazards is respected. If user overrides this, warn. orig_vars <- names(x) int_df <- int_info(x) brks <- int_df$tend # get original estimation cut points expressions <- quos(...) dot_names <- names(expressions) int_names <- names(int_df) # x <- select(x, -one_of(setdiff(int_names, c(dot_names, "intlen", "intmid")))) ndf <- x %>% select(-one_of(setdiff(int_names, c(dot_names, "intlen", "intmid")))) %>% unped() %>% make_newdata(...) if (any(names(int_df) %in% names(ndf))) { times <- ndf$tend ped_times <- sort(unique(union(c(0, brks), times))) # extract relevant intervals only, keeps data small ped_times <- ped_times[ped_times <= max(times)] info <- get_intervals(x, times) int_tend <- info$tend if (!all(ndf$tend == int_tend)) { message("Not all requested timepoints correspond to original cut points.") } ndf$tend <- int_tend map_times <- data.frame( tend = sort(unique(info$times)), tstart_lag = lag(sort(unique(info$times)), default = 0) ) suppressMessages( ndf <- ndf %>% left_join(int_df) %>% mutate(tend = info$times) %>% left_join(map_times) %>% mutate(tstart = pmax(.data$tstart, .data$tstart_lag)) %>% select(-one_of("tstart_lag")) # correct tend and tstart ) } else { ndf <- combine_df(int_df[1, ], ndf) } int_names <- intersect(int_names, c("intlen", orig_vars)) ndf <- ndf %>% select(one_of(c(int_names, setdiff(orig_vars, int_names)))) %>% mutate( intlen = .data$tend - .data$tstart, offset = log(.data$tend - .data$tstart), ped_status = 0) # needed for expand df attr(ndf, "trafo_args") <- attr(x, "trafo_args") attr(ndf, "intvars") <- attr(x, "intvars") ndf } #' @rdname newdata #' @inherit make_newdata.ped #' @importFrom rlang quos #' @export make_newdata.fped <- function(x, ...) { assert_data_frame(x, all.missing = FALSE, min.rows = 2, min.cols = 1) # prediction time points have to be interval end points so that piece-wise # constancy of predicted hazards is respected. If user overrides this, warn. expressions <- quos(...) dot_names <- names(expressions) cumu_vars <- setdiff(unlist(attr(x, "func_mat_names")), dot_names) cumu_smry <- smry_cumu_vars(x, attr(x, "time_var")) %>% select(one_of(cumu_vars)) ndf <- x %>% select(one_of(setdiff(names(x), cumu_vars))) %>% unfped() %>% make_newdata(...) out_df <- do.call(combine_df, compact(list(cumu_smry, ndf))) int_df <- int_info(attr(x, "breaks")) suppressMessages( out_df <- out_df %>% left_join(int_df) %>% select(-one_of(c("intmid"))) %>% as_tibble() ) # adjust lag-lead indicator out_df <- adjust_ll(out_df, x) out_df } smry_cumu_vars <- function(data, time_var) { cumu_vars <- unlist(attr(data, "func_mat_names")) func_list <- attr(data, "func") z_vars <- map(func_list, ~get_zvars(.x, time_var, length(func_list))) %>% unlist() smry_z <- select(data, one_of(z_vars)) %>% map(~ .x[1, ]) %>% map(~mean(unlist(.x))) %>% bind_cols() smry_time <- select(data, setdiff(cumu_vars, z_vars)) %>% map(~.x[1, 1]) bind_cols(smry_z, smry_time) } get_zvars <- function(func, time_var, n_func) { col_vars <- func$col_vars all_vars <- make_mat_names(c(col_vars, "LL"), func$latency_var, func$tz_var, func$suffix, n_func) time_vars <- make_mat_names(c(time_var, func$tz_var, "LL"), func$latency_var, func$tz_var, func$suffix, n_func) setdiff(all_vars, time_vars) } ## apply ll_fun to newly created data adjust_ll <- function(out_df, data) { func_list <- attr(data, "func") n_func <- length(func_list) LL_names <- grep("LL", unlist(attr(data, "func_mat_names")), value = TRUE) for (i in LL_names) { ind_ll <- map_lgl(names(attr(data, "ll_funs")), ~grepl(.x, i)) if (any(ind_ll)) { ind_ll <- which(ind_ll) } else { ind_ll <- 1 } func <- func_list[[ind_ll]] ll_i <- attr(data, "ll_funs")[[ind_ll]] tz_var <- attr(data, "tz_vars")[[ind_ll]] tz_var <- make_mat_names(tz_var, func$latency_var, func$tz_var, func$suffix, n_func) if (func$latency_var == "") { out_df[[i]] <- ll_i(out_df[["tend"]], out_df[[tz_var]]) * 1L } else { out_df[[i]] <- ll_i(out_df[["tend"]], out_df[["tend"]] - out_df[[tz_var]]) * 1L } } out_df } ## apply expand df to complete make newdata for arbitrary time points expand_df <- function( x, object, trafo_args = NULL, intvars = NULL, time_var = NULL, interval_length = "intlen", ...) { orig_vars <- names(x) id_var <- trafo_args[["id"]] brks <- trafo_args[["cut"]] int_names <- setdiff(intvars, id_var) cov_names <- setdiff(names(object$var.summary), intersect(int_names, names(object$var.summary))) expressions <- quos(...) dot_names <- names(expressions) times <- unique(x$tend) ped_times <- sort(unique(union(c(0, brks), times))) # extract relevant intervals only, keeps data small ped_times <- ped_times[ped_times <= max(times)] # obtain interval information ped_info <- get_intervals(brks, ped_times[-1]) ped_info[["intlen"]] <- c(ped_info[["times"]][1], diff(ped_info[["times"]])) ped_info[["tend"]] <- ped_info[["times"]] if(length(cov_names) == 0) { newdata <- ped_info } else { newdata <- x %>% select(any_of(c(cov_names))) %>% distinct() # otherwise combine_df duplicates rows newdata <- combine_df(ped_info, newdata) %>% select(-c("times")) } map_times <- data.frame("tend" = sort(ped_times), "tstart_lag" = lag(ped_times, default = 0)) suppressMessages( newdata <- newdata %>% left_join(map_times) %>% mutate( tstart = pmax(.data$tstart, .data$tstart_lag), intlen = .data$tend - .data$tstart, offset = log(.data$tend - .data$tstart), ped_status = 0) %>% select(-one_of("tstart_lag")) # correct tstart ) # if(length(haz_vars_in_data) != 0) { # if(length(setdiff(haz_vars_in_data, vars_exclude)) != 0){ # newdata <- get_hazard(object, newdata, type = "response", ci = ci, # ci_type = ci_type, time_var = time_var, se_mult = se_mult, ...) # } else { # newdata <- get_hazard(object, newdata, type = "response", ci = FALSE, # time_var = time_var, ...) # } # } newdata %>% select(any_of(c(orig_vars))) } deduce_df <- function(x, object, ...) { } # All variables that represent follow-up time should have the same values # adjust_time_vars <- function(out_df, data, dot_names) { # time_vars <- c("tend", # grep(attr(data, "time_var"), unlist(attr(data, "func_mat_names")), value=TRUE)) # time_vars_dots <- c(grep("tend", dot_names, value=TRUE), # grep(attr(data, "time_var"), dot_names, value=TRUE)) # if (length(time_vars_dots) == 0) { # time_vars_dots <- "tend" # } else { # if (length(time_vars_dots) > 1) { # warning(paste0("Only one of ", paste0(time_vars_dots, collapse=", "), # "must be specified. Only the first one will be used!")) # time_vars_dots <- time_vars_dots[1] # } # } # for (i in setdiff(time_vars, time_vars_dots)) { # out_df[[i]] <- out_df[[time_vars_dots]] # } # out_df # } pammtools/data/0000755000176200001440000000000015144603102013172 5ustar liggesuserspammtools/data/tumor.rda0000644000176200001440000000740613662013606015046 0ustar liggesusersBZh91AY&SY"Î\8âÿÿÿßßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUDEETUTDUEàO¼< Þ8 Ä^; x†’hÄÉ 4!‘”ÚÉ “bž™”Gê›Qêm#M¦¦P¨£ÔFžQêz†‡©¦ž ƒ ÈBª©ÿ´ÄÐИM šÐ#&L4(ôžPÙ Èiµ2  hÐ4¦Hõ4õ4LÕf‘B“Hh€zªUF   Ðd1@h@ h€ Èhiˆ bh 1 ÐÈÑ“2i E$šjjm5Oj™¦“É©µ6ôÔhõ=514hhÉêS#&ƒ@Q¡ˆ0€ 2b †šƒM”i“OHÓÕø°^ù øÛÞ·þÿóÚûdÙ,½T"÷ÇoýRÆÞs²Ú.­Ýî>ò½>®Ù|¶ÌŽSûvêy±âµÅ$£â¤=ŸÜ …-ÌHKueë¿ëÚ9Ž*û©â^2½ÛyŠ8ˆ"Íý<3ì BoÏ=Ô ¤‹P/ŸäR†ÈP>dÃxáóÆå‰ÙözJ2ÍaˆA´ŠS€}W3ÈzÉ"¨“0½÷]d„Zέ$)Α¬Ã¤¿s¨N¯ðÕR_0ÄE›æL®¤†S`ó¿.'¯S›y[ż!Ÿ½Ðûdú˜p襬׉íKYK‹|Eë ž2ÎïóæÍAY/S]áöÖîËZ§Ña6¤Ãï.¥Í¶ÎQxýQ¹uGO–]´÷ÛIK¶¡~ .>>öûÀd½'E~³/îv¬¯´öØc¡˜/¿è›³éèÖHnï³îKZà›uãó3j ´”T-·Ò#&TiЧ#a,ÛÍIJŒÍÞ6@ ½)켶Ĩñhæx·’è”Ræì;#:êüh0rF:Gg7sš¾œÔH’öú/19…­—’Z“¶ÛfÙ:Núf˜Ðàöšœƒ‡µµöÜV·™ÔmÍež/òjô/«¦íž1ÞÌëï§{jb#¼ÿ] –éö“_SVç\<Æ/Å.wpÉ­«¥Õ5 ÕC–¯xõÜÅ¿2ß¾n=Â6êí>Œ'£OIa@³¼ÌÖš‘ÌÝÌãR}Iç-$°âzví(µÍO ¦oЖÿQ L3—3ÇâfÄ­œÿaEø¹9M^[4Šä¾Z÷ÙîáPræ÷ææH[—×ã£ËQõþ–]÷ÑÖ\s^~_~6œÖŸ4²ûzþH*_ëd\¢¾4mcc„ÆDb63"²iM&¡ 1F FˆÌ"ˆˆ£b2Rlh¡¦Eˆ“XŒ`ŒÍF ‰Al¡Pša¡#&ɳ „,bÆÀ›%&c,J#  6 XP(LFƒÄCf2c¨6Ì Ci)*¤ÄBÉ(’Š’L”Df#$áW’”FE%Q%KHPÊŠ &DdbfI%˜Ñ$dƒJ Db ÌPlF DFK"D(hIa4(‰4ȨɈ ( ‚Å‹d4H2 ¨ŠI 2†MbI4Y4 ¥šLZ1&f #EBI„‘4B@˜,‚£bJC0ÉY•¶")‰£‡ ØB¨( Ð ˆ-ŒÄRbÄB i"$Œ¤@2)M  % (&1l”X ¨’„Á„ˆRÂ’0“Ñ[Èé{ «kN”fXhTdÛ&ÆBLADc `„Ó R3FJ %&Qi²±¢’$†$†ÈF ²„h’di¨ÂÉ¥FÆl”&h¡ ™)c%M1!C2 IDDi™(ˆ$¨ÆM )!$L Ò× ac3$a‰3 £E¥$É$L % É# 3)H™ E*Q‚‘BQ±YLˆ2",F"‰‰!@ÃB”)$‘‚!’f– L ‘Ð"LS#FÌÒf†iDÒ‘2 DÄ&Òb$Ø0I²eˆh‹A’Œ’˜M¤ˆÙ˜(™£Ê ¢ ËE&*“já¸Yìxß!.Ÿ^*°jѤ€àÅQË‘ ÅE)PBР™Q(*BA'BPJ‘€ FŠX Æ;7€ ñ ˆtD HÂ%ìp.8Xœ²dQà% ±! JHHH¡Ln" +QÅe”+(cK¨„…Qºd»<Ö³[I®Í.×$ó¦`³Š@‘FvF !ÔE"¹ˆDÌè£ %\(–R*©PÅ„wTUê:C€(´±–¯ Rª•(!¸”,±T€‘ ÜÖ›k5ºÁ ”2§0tAåRÄíYf ,A–J±¹‘$8¨’B\VIœ‹'JÒ,i¥J€¥t³M\@+î3rKÚ5Ìg˜*@ñÉàb#™ÚR_ƒK›Í%ê`÷~/£Êíno÷׫Ü^æ§ËßgkyÙñgÀ65ÁÑ㥳e(Øp8u6k#³ïʼn/^L-±e‡AæÄA ÉãÈTì.†.renTƒØ´gùâ uôE7“ø0©ö&œn²Ý‡Öj° É”ª"™ò:wx¾DÙYÖo®Ñx”®È€'á4¨dP™¸É\.tÖ Ã:æŒà”ˆ©Yïð ’¾ åé'hDÄÁû¥lçcœlf%”Zæë{ë묌Р‚ÓÇ+Y"XKÙ+$RȺAw\Ü*Hl0rÞb„";·@[Ô]+éMz8\£-…˜H¥s¨h }¦²rryRÈzxX€èUÖ%bÝ•ÝA£ã'ŒJ®0± $=WG£.™¦Žxä æŒ/\TÄÑ7"·Áå0©“ÆY޽)óßb-‹ {Š“jw1É:Ù§*r>,lËtOq©õ^UæXÁÖ¾­ð²¾Ê’F]'Õ|LÂ&–²BUÇ¢á ž•©ãªÏÎøIÇÂÀQê‚4@gg- ¢p)¤ ÓJSM¤e‚lâŠ:8P¥Lú¾àÑR¨ñSIÖËÑ«+P*ªÄBŠ#¼°œdªª‰AÄ5ìU\¶]¾3?|k ÈTÕd¢‚PÊê° I"ȠȈà I…R(c…Ýa,k WT©$P¬eŠÇL'µMA`+BP` P£B •VDV(ÌŠ †22Èr!‰ €$b@@Š•GU$„ˆ1)ÌŠfG1æ]ÖR‘BqD4“m®°Eq‰‚!B¢xC‰#…çÎ(@©R Ž6‹‡´Þz? §¬µ€‚V’ApyçuB@ n6´ø°‡ë‡Íó‰¾ÙòS@‹ìç¹3ŸåùˆØT‡@ÄP¦ZM‚óuY:L  Á$»ûdÂEó˜s"~ì«Íô"zйޤ¤?;åò¼‰IÒˆ¢\ÐH‚$ @Äy®;S‡˜Œ®bë#c{X+) /ü Ãœ„2VÒ½ÈÞY×´¾âç¢irSbÖª®$¤ÈVÚöîúÖ‚˜®Zn,ªWäî#œÅµ-l諜²­˜ìtÄÀB¼¬‰"A s…θv>žß‘¨…ù~~e5è¡_ý¬”;ÈT½7£€«ÅAIEEF¨Ø¬lj(5d²±±%бУc]ƒŽ(Éb¤¾;n¨´TXØÔcb ¬k‹EŠæÕÂ6ÒXÛFÄmbÕmR¶ŠØ6‹ØÚ¹ ÕÈx^*®!@Ëe0.ù|Ý"ÝJH¢@¬OÊ^^XÓPz"‚BÄ#6óçð)ƒN*ÊBÄ,ù \ŸKƒ‚^g£¡¹Ò+-û~Ïg˜†!3ŽŠoy“¡ ˆ·Ý 'rÐ|îÃ5æ·ÊN_lbTäÅÂik ›®Ã”µ},½Ýꪦ®>CMà«"( Ñ ÃoFR9¶YAúí«³HÞh{º9šˆ)•cÒ{É m÷@âÑ·g\˜¦*3«Ã’ ¼Dâ ³ªfäbŒHwj‰†å²c”Ã*7¸;iváôdv!)2—µY0 i3ª€u©â)¢±E´Æ »õ¥Óœ{.ŠÙlãeå6AÓ Å€Ϥñ’+í!ri/Ó+¤V¢šj¨I ¨:†Müô‰G왕ì’1ÝÜÖ‘ù2.nû)Ÿ¿°  0«! ‚êe;8_[ä½jiXÛ‡4ñWQ©í0ÂÛóð.×ÕWPKƒN)òL€®ÌŽ‚[©!J_R$´“oˆ–b¨`nVž zy×ZXMã@Þ¿ @ –yçñÍ}EV£Á{ð" ¦ÈÉJP“¿7M•ŠÌ͉+-é8÷ÓpëÕËÆ{³²9zݤüÌú•c@ o% Ôˆ\ DMßXÉyl×·iñäIJޙ²Éí¢Ïp^'{të¹Ú‡kƒ…ÁÃ\ê`‰†5åõs‰ŸAù}(£+šÛ|þUJo´…7 /fÿÿÞßMHØØW›áQdDþ&)éC :‰bÝâÉ9X" æåWg9∦ähIÌÂ;ŸVâ™W1(w߯=r‡Ë.' ]u„åòM˜š—žr)^³t†Ñ9P+å,çYÍÎø—÷cŒ,Ë5>%™6Hõ]òpˆ³ÀêÀ1Ïÿ‹¹"œ(H g.pammtools/data/simdf_elra.rda0000644000176200001440000014263614222504522016005 0ustar liggesusersBZh91AY&SY2ÕËræÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàˆ_³³6à>@)RHHP¡E=Uµ)z^ÍìœíÛÏ·ŸWÓï½ßwt§¼ê{Ó«¶ÞêõÝÞï+»‰Í¶Ýº»ww8í­VÛi³9Ú;VÒ5v뢩®»¬õ×uåí‹ÕW6{<=î÷’óï—¦¾î˜ë»³wlÊTtä+¤lÙ'l®îîi¥»Tî»·[ÝÞ­¯[ŒÌ^÷»Û6/®û½ï}´ûxì­ì÷om¶ÝvÜ]ºµØì-®Ã9©×'St¢í»U:K5«gmœ…ÕÎécršv\·Zjº™»­ÚÇ3I³mË»QVìîp{žê×¹vê±^Ýײ»§§Êͽս.½»vÞ­O]›½éÑÓ£×lõUE;²Ø÷ní]¶Ð@€ ITA@TDDA”Á4h €&L ¦Lš1M4ÀL&&LL˜LÈdÍSÁ  §àPÊz ÐLÁ020‚a0FÃ@ò&3@Ѐ©úd¦ÑˆÐ0¡ dÓ&¨UdaИ ¡¡ ¤fƒ@`LšžšdѦ “ ‰£LšddÓL#M0Š~L†™™4É¥ „b4Оƒ@˜€Ä4Å04Ä ”ðdÈÈɦš`ši´& ‰©à „`ŒŠŸäÊžÓѵ6™2`L&#dÐdÐÒ¡ñ€†€Œ€2ŒMM@Ð2d4i¦€È €4Рh& €0¡ªx‰ˆh&@5 M4ddÔôŸ£I´LjŸ¡¤`M<ƒI¦F54Ù4Iú˜# èf€4 ™¤bfƒS 4&£SLÒl€ªkÒK¹ÜnóY7!éïyXA¯I-•$¢Ù!_mÒK ¶ÿ¸:ÀR|«åRBÏ2ú W±¦7ÕF -½¬wÓ÷q9 ÄÝ9îã¾LUÖò5*Ö kl+b¬_€®}n‹ÖÆc&$ø±˜º§|œÑ“•‡s›%Œ•‹!Ðç!Ó¢ªT¥;*Šh¬êbª³t’má¤à¢uQ ÚØmÐïÆÊŠj­\›¢X‰¶Û±QI+ŠŠÎ¢sŠa¶áÍÐç(¢„è¦tŽT’¢NTìÔĉB•3¢S”§:Õ«U:¢ÚÙS(+EUE2+Î)‰9I¹9U1Ð:ì”ÚuQ˜ŠÔDL•2)+QDä9\VHI*æS9CŠ¢T2„È•{9‘2™Y:°ä µvê%Dë !®8æ4#N‘õS_‘~õHDºefþSIGÍŠ’­òM¼Ø Ó¹‘¬3¸6àü¤ê–c®©žu¼Ü‹æÞ‘ÂA|ù´cýÒO=ò£ã”Ü yxÝ=Ô(§ö/©I¯*Ú `gàoüp(\¤:hãG¶±j?¦9#™Q–ØVÁÍ&[ ˆ.A½x…™Ú_ž3÷Ø'¼á²iÁ»r¶xä$yV¬-&,ã•tÐjŒ´F7²¿Œ£ÃºáLF LûÒÂm‡ï\hã•Úq¡³8ž0`.^¹èžêþg‚-Úy¿˜ë;«.~˜3¥\ú&r>퉸ָ4}6µŒör÷wü?}çy½ù9†ÑÅsùo%‰7¦Ón’9ª{5´ m ãÚG™™žëÁäröÞb :¡Î<’ᑼڒä†Óßþ»[íå+PÃYW-Ýýý{º§¸lw˜6›&E‹e”¨:@ð–€£rO âx åij¶ –µËÂálÓŸh1Œ”'}9â g` Õ­Vwè³)½]߯_ˆ½êìã< õ£®Xλũˆ·¬`rv‘Ôÿ$Þ!½;~Êo\ Ÿú>Þ­7«Múhóõmó`ðüæ»äúöÿkÀÿÎO{Ò~cCwmÝùyLn¯Z³ž¼ oÐõMüÍõ‰7ªMüàßÄ ý ³éùÆýlì>¤ õÃ}€7ñ lùŽÓ·C2oX7Þ!¿­ ë7¬@Ù­5ÚÄ7òƒ ö¿|lÖëPßμZoZ ýø¿©7®oìMŸoÚ?ƒß–Ú7õ /©âðò÷™ªkM*ÇÊ ùþ½zþÄßÖÚÔ²÷^yŠÕtO¦`ìÒEºj!Ú„—^|Õ3S](–¼"B þÿT &@Tva0™"<à—XÅk¿’JÌot+K"!:Whl)-%Eµ¶²}ÆÒ¼KÜ·ÂVuû™Jõµí/]º¦‚Šùt•«³W_mAtR¥ú0Q$JQXq½+•{UìZ—)„!€’I:ÍÀ’B®B ¡‚5C@"CLI !$¤À-“¡MNÚÙ& ´ dÄÀ H›@>Ú Òp˜¾}läoí}¢™Ejxêõëîµà¬ú&nTÐÝÛyJÂÕ†Uy¢`ǘlI …¯á£{EX4jÉfæã1fIolI*²oL5]‹™ LVp`ÅuIQA±àI,Ò©¡©2 øì°¤–5—C‹Vô©õ6C$ @I Å L•JA‘6ÈBIšIsÎ%. ]¸ ª›A34b`„7µC%Ö¬I5˜6ohÑ ±Z]Rd-*Ñ Sð­îf³,Á³’ª‹6 ÍŽ©,âѲhKknjmZ0]dŒÛœª\Z®ª’Y›ÍW'76×ËÌYÞ-/Îêñ)Zε•{ÍîÒŽ”®.,Næ§€•v’Ap“Û’mæB»4¡‰,Þ,X® îlÄX,L]£sF«,ºÄC2`—e™ˆ, ÌU6¨n]PT™"Áqd-Bëê,ʈs)¢µ´¨U;K*I° ¢–…&€†! HHI‹`’0è1›;Ú1ñdŒLLMcØ( ÇÄ ¹.ÿ ¸0´»ó±oÉÂ@Œ»‹ö@$†°Ú1¦$ mCK@’IaˆH†(bë D­¡ ›B C†Ø“œÀÄÀ“Ki¢ˆ`¦Ñ(ˆa „€þ,õ¼ÈJã) å§<&ªÑÿ_KH°4RÓeý¡` ˆGrÒ ²³U0Xçìrp©¤cØ6,}¬ lÑõÐ-Âæ6{ Lü/U˜6u,ðØŽu— Z¾Ò7¦¼¦• =æ!PÄÆ7¦ †u›l$kÕ4'|O'n Ê@Ä>$ÀÅA/w£åjFÈC•äø¹1Â3î?‰ºei’û:¨¿¾€]cVìä| •¯¹Õ‹äã¨ß¯üE–+T´<¥Õ£¸9§’¨h-È4‰w!*?_Á˜ˆ܈cëàGxã56¾ÛÙᆺ+VçžÍ÷[|’§É"ÞüjyëÅZÈ‚Oá’68PÙ¢p>4ߎ¢|Ät\ìd¬ö Žã^“¾c1Á콕[:Ip p… ƒ@öm°Lci!¶ÛHHHÐñÞ<ŠZm¶ÆÆÐ ”ƒBbÆ i°ÂÀʈ³¹„Îá% æ<›隆“Ÿ‘KýF‡¯‰³Ëu]øÌÏõ«æÏS²æ~™dÝêÚT×m×§ý𻆽m^ËU¸Èçä¬?ï‹–wÂËÓ3·‰5¡)¯6M.§#ãÒ¦,/êìȯ[ÈöR_‚ ÈM[ñÝ#ž{?*8•šêZ§o>HæyŒ (ÇRAºúƳ´&ÌŸW±Íl‹ör Äe.f2×ALç®ÍÇò0mù$¢0¯O…NÇ«€•¤§'K.Ô·ó ¢çöÝgØóñú°ø[¿Ðþ{gÇHnmoìH[«I$„6€5 ¦$„4F~˽)‰0Ä2(o[ðܛϸ*V-Û‘wÌÌf¢HÄaôr\Í jÓû—^>KLF9»,a{}£OæS¨Ýú,û+,ÃWû|¶À¯DJiî$UQ ]Gi×)åS†'¥ÕwG^û~7«e‹3ÍH<²ô›–ÝÙ&„€† $6)W gm(Rÿ[ŠàÒýꆚ^Ÿ?Ê[š•Sàþj8êËf6D(ŽŸý w_UálùfËHuTN¬wñé§Bêå 3,I$#sÊðÒY,·Ù$  É1!e€-Ê×ÿnQ”ÊhïúÊ*üWäè¨ý´rú2@¸Æ6×|å¸&œ°¨óõ0‰×ØPÑ;f»žl,ÿªsbèɆšd¶„v• †Ê0ÿO¼3,ýšÙÕ­ ߘà .#–ÂWÌŠ‰µÊ’ŸUŠü!\F"²®ñdÛ~r­d’Ï£Ñ0ŠcE}E=kñöå"{kdnÊóê6ŸIúŒôŽ5|·*o;jxQöÌãpG#–AµÙìó¹©Eü\ß)Ckºqh s]ö¢®F§p‰°gl%˰¥Ï~YKóµYÖ> XaT~ {^BY¡ð4Ä6!y “>¢…”°=ùXhžŸI`ÓMuàxQ·Èø'X'ŸÕ”E*"–åÔ+`Ah¢ŽŽ¾—ú¤ì­Á! ‡bìâœpàŒ˜e¶ÍßõÙlÞbRÀž{ÎlÛ©Z=þjÈ@9¹™xµ'Yçn'_vη|CKžYã_lJÖ}Y¼r'¬ët’S⥶…› F›º?ìÇ/rà—ÚC%¶ñ–|y GuÝBFÊÒÁ´¸îv{R;'vOæñý‡fTª,í…5È.E°‚ÑMÖÎtÀæjNôþF‘L¸UÜh3£Zºñøî‰ë]Oy¸[ëÞiùç ¨ !?aÙ"ÿˆ©¬*¨£~0Vä}±ri×+€î´4‡à” LU‡žv‡­ —Ÿ"ŸÚ=|Õ”âãR ÎÏšõ]ÇÈõ#ìöHofrðÚ¨AØ¿¢\ƒ\ç«ÇÞXXaÅC€…=íªõ”èÆR}uh „|÷x˜ ö=ÿ~J¦¶¸ÅôL°Ý7êàùJvqÀçdë«â+Võ;¼VÉ®s¼\§Xë%¤®ø%÷lºÔö´Dcæjj™cmÈ5ŸÌªõ «ÒÀjeâþÖÆ:°¾ÆŽ“¥Äb¨ iN-·šŠ’?K7Ýî—/ôÃE¨ª·##t¯éý;Ÿ;¸ÇN©W\s=®Òá×m°\‹ 7­™¥•À^ÝÍ ¬.TUBÊf¶«|œÞ€B.ùÿþÎÍ~Ïó[¿Àx|÷¦m›„b0;ß• ú­ê>¤4²ðÜPvÍä;Ïá9=Qf,|Ø,¾çÛ‹ŸÈs$Ùþ$´W­n¨½ð‹?ÎÅMaá¼Lç\4SÉ_FýE½Â6ÂW©LM2t—Hï{uZ¹øoÿc*ìÛŽc:l§¿çðâ1†„€¯½1t¯¿ÄŸH˜©LæC_ZŠ~ˆõŸ¬üac>O‘¹(û–ê°ýWK oª˜¯ñ¶û¾Ÿ#ùCª¥DENX5(C—ÂWó!}ój&â·ùÍP!Aò6çz‰Ô!D@ƒ=´aWE‹íO[î^ì,®šKw³¤þâ Ž‹ƒ¿Ð`1tõ¬[–1ª‹fÇoü¬ï[)±‡XïIב˜ö,ß_I?>zë…¤œ—xv¥Ëd,™ù’w›°êúDLSÃ,‰D$/l-ßswÅQûø(¢Ë;ñc¶Œ…{p›BB ³;^{f<.ë—¤+:Þ+§ŸTïý¤á§Ó×á÷°nFzêZØ&8hĽ+!ʰV‘zš(>ÑVÜ`P0­ã^ë^k:Füm!ct j˜¸¶¶Æ¤Ó}dGXßDî¡Bç—Ëóa[ß™¬—ž“ÌKx'©ÑÛ_± ªêA±ï8%–ï†ßè¤ß–¸¯IÛ_ܫц€Cý»›@ÒŽ9,àuø;N»§ÌhÂß9M¥( eÄ4lö± ºi/Y¤f–îijIkØrì?6ûÙbÚÁq¥X9ùôšï¼Î}†-‹ˆÊ›fG‹\í`‘ãI,ö (Áë:`ÓJ†²âT‘sùë{:ÌJªU&iLÌcŸ¾È˜Æ³unŠT§3¿ýcPª®½§µ)¢¢Š)—i%|huüa w¯§Ýã ¹¹É~ï#®ËQ[¡ý1‹y/¨ÁÎå—3ßÉ –÷K¾X™T©Òkš×°/ÂÂ_|ðléük”×M£$PrC~Èá"L‚#ú0óš8FŽõ‚5,g,ó›Çö’¸Ò|¸ÉîO —6øÃàðqÞßV7#Úå÷7ù+l(À¤Äe1ý¬’]׃Oo·`3Zšôk%8f}k±¾ó"Ì¢?H£aŸ$ ˆtµ§sîÙâ=v˜?8X¢‰€‡¢þ #㣰©9÷êHvG‰;<÷±Ñk‚³sf{^ä3cíJhz?_ÏÛkîºÎs¸nLp°:ó™t!„)ê˜0ºŒŸvÒÁÿE´¦m=]%nì‰Ú¯»{ìLðR:y#5|h>é÷Í…1•ÐðÆ^I0Ç)Û'ø$Op0@ƒÛBä.“‚K­ÊÅŒZÃÙ¬@´ueô¦HŸâ~/ý]5gÛº<Ó¸Þa]Q›ý>tz˜!HŸ,jÖ“2oJ+ÐF4>!í’Š*={–r åG ˆ÷Aõý×gz #Ä,G&§_òä“{ùËËÄâ}.ŠÍJÛ ŸÇeõw@зÓþÈ´ë4Õú²€ €€)ñì)ÇØíõºøÜ¿MìάTG×"!¡¾eš.|£ pøç?&3ƒ_´ÁM—ñq©oÞµo ­à7Õ®hþ¦Á‰ `{ž¬h]€:–ümV ÷ßêX°iþ0uÛ—°±ƒ„ïmgxë/[)'áÝ»{¤‘?2_r•=Vô»ôÉ¥\ƒ£À œ(aæÄ† ¼©Ç5ˆNXeÑŠ}S!ùyË­ØR=ã©Í0gøˆÎ#à]2mZ&X?Æ~vìN)å–'ì™5¯ítâþ"–™_øµq³¹ªYèüc÷¾•Ók,V¾™Õ¦W8²ž7¼)#'ünî?ÀV5l@„G# ªœR%^4Cf`¼Po@€jÆ¥n!E°¬¤[­ñéäj´'î2°O´ÁÊ\j-“*ºŠ·p¡îÙÙîotú‡ÉjŽt¥²òp9ûˆ6,ajµph ƒŸ ÀÁPW¾™@Á¹ã÷Žå8Z9å/gÆÍýI×5µ&YR¶}‹›ÓU?Àñ$‰uÊäoö¢¹ž¤oË­Ç™x¡(f­_@©ùïÝnȤ™Õx0 g×€¢D©``Ѱ§ÿ­Wm/ô2AçgKÕo ç6pË<‘¼ Ö¢v° ¼þ«¤´ïÉ£roäì™?²ç©m•÷¨ÊÀÕý’ÝVº\#Ò¯/éQ\YžíH¤’œ\'¿™bÕÝh¤ä±ð•0Ž'ýèéê¶sèËhàÕ£q»Ý(eìbñId±ÉV‹ÇjßÊØà›t^9\ÊÇë_Ãëü±~h¿{ïÝ îíùñ ©çâjð[q²ŸÁL¨W³VvX‹È­ïÕžÕ".¾1–»˜ºÄ%ü·“ß¹•Åà Ìcƒtî?ÚkFG c‡:'ª&®à‚°ã=â«ô^¸¯w³Ûx…La;˜}W„Tf§/ZÊ+ó¹Òåù¿»—ûnVÃS!á÷Ŧ¨m}—„Mvìr à=¹ö ŠúOmqj˜…1söD¦Ä@Ï·ê_*‚š'æ÷ j3§¡göÎ=÷D% Ån{¬|¬÷tjg§O¶¸Éû翵D —^aðg¤Ü  û®§¶¯a.4½ÔP'¤WÞ§í¥ªÚ[ QOû‘ ¬³¥Nõ@‰›ûc¥UH¿fžÖå`Œ“D7è3Â)ï]. ;Ç7‚㳸¡îNÍbÒDªoð&|L"yñ0M•{²q¸Ûä.´°ê‹T$92¨Loµ•¤³+·œ$™¢:‹}ø=Çüÿ.SCi‡¦K9~ñׂëÞ “xJ´éOòÇ£z{÷.˜Îi•@Êœž<ÆÆ8ef…±#¸†_+N ”LOê/kpwÕŒ4TˆÒÐÔÄN#=¦¥xl ¾óU§¤¥Ê—1NÍ´\IãœÑ÷”r®¢Tœ£€~Ëãn!;ÆÀ# |Ï%¨³’+›'KÁÎË‘<®ËgöY»ºYçÒÍpòã/sé"Lì(Û€šÈG¼ök"&¤:þõ/f Ä‹©(WY֬䞀jsÏûƒVAº×r:&…*Ý~l<ßAÊÔ`Ó²+³ˆ†jÙ8]v¢ºðM£Ð›Šö§áSáíñér6®’h¯­KZpq$ZO¿/&,j“¼ ièùþÔ§¡.’6~»¾?ô÷gy›  ‚ï§Óæ6³µ’»ëá&&a-]%ú|~‹ÕÌ#GúÞ§ú ­„¦6hÚ!¼Z—‹_£r×/Fû«#ðes)1äèç/²1‰Óç¯B"Èí̽NÿL€ ú™Oâ<ÇšB Xb´1x»ß‹ƒ³ZÉ¥ßU«¤<3¯¥Vº }⺄Y^•¿€0©Í½Ñˆ¤.*T{>¦sëÑ,»ùPSñ´’ïå“üÏrjŒÎgPë,FpXžË{0ïl ˜ñþòÍzzJN+Æç¦èçä§C.¤”&æ—ܪӧ1–˜h ˆ­×Œ¦½¯\?„ùþhÇ5ѾusYYG¯Ñ‹nr¥à­ë£u»Øöø+Lt×µwŒÖê¡fÓkÌMÕ®ƒ†ÖÛ”¦¿óÒ»-±c­ŽºVÖ'‡{€®Ós#k7ÃÎËaøíõf”b¬Ñœó±D á? ‘wÿ8®ŸÛ~Ñ,Sб]QG+ªûÍOð@€‚Ø € Ôús=ºÞ®£möB“oºmë”?~›ÒžÃ{ ©ó8áe^µåV1ʃòWC•ÓßôŠ«{7oÛ÷-¸ÅüœäG*[·C@4qžV=ZÇ¥¹É­ÞLLåu=Rt¡S§ÌdOüªÂQºäBìɨR…§ùéÂné(–u NéÚ¼š×uµŽ§X¢òc#‚¿¿×_ ¸bò¨,¹ÞH#lð¤b4ûâê:r‘…Më~&©ÛФ֘aéhåoÏ‘áu\ÌwÛUjÅO7&óœ~&|¬µ6°ºfi¶Ôe¥ÿu$ÖPÿ“þUå5$DS{æ„ËÝ:úòªõa^Œ.,`ˆH8਋ðÑe¾)ÄJ¾¡*‘xÉ ùFÀgõI²óYQ Äu€6,S±%†<Ìú½Çœ||ßå™±ˆ1ßáøÙ»5Æ*îÎ7²9ÍBSazk“䥅7~ a*×Á†VÏú  ªÑt‡JIºwˆm[öÐcÛ¥¶Úæwh}t8 L‘ÎãÑ…\öZ Ú£ u¬qmSÍ"Õ¡c¸×w¸Üƒ™D[r…ÞdÒ.D)÷,³o­¸‚´Ÿ×ýèhÎäNê>«†mdÓ2^DÍ•!j¿Îä„Ã`"¤a#ðô3“æ²?ãØÕwe8"rqŒém$®<”¦N©%»öþÙ˜¶/HÓ¸ú®„ÿ˜ÊcF"zÜû3ûØí3—ÄþoÏ0á‰ãùuip9T|V þ]÷Mˆ™”_)a1æåÁÏ):÷xšœž3Õ©‹jm¤ÕxHҽȃû±jÍ´Š»+©ã_<Ñ–TzöÑlHñ5{iÞ¾>5’}ÏeU³¤¨Á ù˜´µ¶šûÿ¿¹š"™ˆkp‘+BU0á*˜©ŒÁ Þûè•ß3¾½éV€·Ûw¶îSX§¾Új‘ˆ–£Lá)^±JsBÍÛy~ ‰!€(@‘½ˆ®ê´4ÑäÁËèÅ—\¤Õë«hà@ãt¸.ºúšyE½)£wå\ÖŸî’ýlŒ6ä)—§v'¯„ö\Á)š·qÉÁVf¦ÚœAm"ádäðåz¯ …·ThLR,ߎ4 $'»±ÿ~÷ð|^'é7÷)ŽçoŒªÓ6¹C{Ë"`0_ÇŒþiÞÊMàž›1ÌomhŸ[–àzyÂmúª ±€ÇL{÷‡RÎòüœj¤j,ß•½€3|¼„¯À=I¾Ô­¢ú×}}O'o©¡>Í6Ýþ.Dí}<¿  ã;0xÇz©úȨ‹Sy’¡5b\Íúœ qéÞaf"ä…×¢ •RÜÚ¦GNºó#¥ëí°ÿ•c¤S¢6aÔô’Í©¿×%ù74›îëda4k댻ýL5@í'O’¡…¢¯œ÷„–PŽRBÖíÂn²Ÿ;U¦¡¶çVõT!8/hîLYÓáø?ZÚYÓRzÅaË8cj.ˆšÂ‰IšŸõOUŽf¨ÖÞÑýÚÁ>_ä µDÚˆ’@Nþ5üÜ'v›Áwˆ‹(ó-$¼þ­.*ÍØÁëKÑoà±z˜Õ÷ £=½Ÿð4ƒ©ª‘qäh髉óµ‰.kOÀYwÜŸç¼N¡á( “'øEÝ,ˆÅRä À®M¨…øÅÑø4¶íên/æü ¼„áþy­Ÿ¤¯8Rµ¦= î ß ºT°ùJÕ”šŽË`& ÆVéß4wãàh¸Ôͧr%woœgÜ'Ã&c;îò(øuÅ7K‘Õ¸±±ô:á,GŸ?¥¡`{e­è[˶ûtóõ-lvFp·Sî·Ÿ~¯G•_¬Ÿ˜eò:|F`> Ä…c`¤¸Fsšw+.69rb}*7ísæJkñµÂ'(¼è“éVÛãX9úàõÔ.á‚'Î ê$zœùÎ%õn»ãã¤Õ!äJœÎŽw—J•!pdû%CsEÍ}óþ2V/ø2”ü›ÿ2cpÙÇœ5±ça¼ÞGtM+|–÷ÎÅPÑ(ãCµ•Õš> jbUƒ u\ÛrºõyvÖÊÒÙ›H3™Q:½òöŒbÛ•Õ;2„-ï:ÌZÁy³5h$ò^«H` Ç«·žpõÒ]¡,GQœb§1ÅV23ùÀ{ðܘ9QLÍ0wT)K¯¬tß«l§¡ù_›ŸÙ÷!AEÆô‘ú:ÎÝ.O¬ò&bR}… þ(9)à[Œ¤›$Q5¯7x§OÛ;|Åq¦ƒú·×÷„¥aHÕ)…}í¹GeEX¤¾š"‰ÖFá™ÝDûdSb$ Á»ÊÁzLzH©Hi´nJS™ã^¡S7VÕrÅþQ'1>Î#¦hÞéz´¯ë¿ˆÃ…¬P¦4:qãm”/3¨æøð)\Ú¾d’¾vß,+®P¶ˆ¿Öuí*ÿsý×K= ÕXÝ1¾k”—¶z ÀùúIìÆ°‹ì4'ù‰ÙïW·ß> n Y'YEiÊoÉl ¶2â„Úß„¡¶¬ˆ¶Û°zè±túK"ø2â ¥ °èÍïu§«„ãò=¨ܯµ»)ÂïCû±!†èÖáÜ1Ò¸UÚü²"–÷ÈýoÁE1àFÛŠyî¥Ãd³XÖw˜°  ÝÓy/·­ý,jø @»2É[ÚŠô:²í–š9ù Œ— ˜†눢ñ·JŠø¢‡¥ô¼ýéØY­ïÃ}°ýóww¿Û(^×Àfé‚ãGD‚ô[…Ž ¿o,™´yTþ¤\Ãß’„5³#Je,´ß[®Û©þ˛ǥÏ&Ïûty)ðßü¥®aJHñÞM¥"ö]±¼¨‰Rˆ p=øÞäEM ÜÍ¢êȯ»g¾mì {‹8jsÖ­¥ÙV9x×æßºã({Oõùï럒öW”^Ÿ÷?SPwªùýCUöõÂìÌÍé™U¼íNhÌ|­“5ÂSF%›Xú®‡1ç &£ ­†”‘Œ‡X†'Û7+dùÒ*+Ç×}¦-â^ñ×{™‡O>s¥2(³O#{³Õóú½T<aaæÆK'’¥YF}Ö’Nj=nòÔrSÅÜ-–k²L»Y&‰ê-mõõDŸIÆü }¡£Ußr†óSƒÿ.•µ³=¶Ê ¢ˆZ«îŸ=¸ÌÓâ 6w`âYNaùpÔš- Û/È¡‚{m+7†‰ p“Tg~GN€ESç›oÂÜd1å'´Œøš—EtÇh÷2ÝÒõe˜}ÈNðVe¥¸í—lÑžŽ°­ TŒŒž&"”]ŠÆ3ƒ´…‰„ðr{ª¨@PÂk½@9áM“¢„Ë?Uå89•&ÀY‹°ò£ç+ù`ú‚¥’ý 6¸ré’*Éh±Vú% šÀòèGƒK ɯNB¾ù‚ÖÂu4cAÖuí¼¦¢u¨MÖ…K9rbsl[nD2ÞÈ&4Ú§1uõ3Áöc®×ˆ _üß“˜vwô¦ý@ýSÅ<ÞÆ¼Ç§jL ðò˜¿¢úÐBFD|¬MÚ‘‘œ„I5ÝdŒÆ‘Ÿ¤7µò2"ÁnºÍ9v¨‚éc^š ‚u‘¢/²¥¬Êàd=Ãø\[«§œO%Áÿ™ëÙ"SB ™¦´£+)ÌSR7¨|IÑÆIJâ¹H¨—eg8Ÿ°›Bæð«UÊz$¼À û‡˜©2 ‡õ´ã–~l§.‡µ$Ä.¸2 ý˜˜0'~aTB‹ú‹g²ßT1‡ã¡vñbaZ9‚ZÆfX˜cB´¼ò!¯Ì ?}µ@·îOrk|2ÓTl[Ýt¬ruz]¶MI&º×úÖ<¹Å[Úb|®·v¥‡PèÆñPCz­gú¢˜¯">A‰p†ìz1`ÿ‡" €:¬øUøE¥zpåK¿Ä»ÙL×ìëmKÍŽóÈ5Å„Ôõé0˜¢ð5ÍwÀ¨WØ z Iö"i}¼E(gÖpà/‘¦]Ç ý’ðÑQÈ1nÀÈu@ÐLú¥8–¯)M!ÎöÒqfÅð­AÇnaò÷‹Þæ;4Ðï¾|U¼´^1^‡ó;ivï³Lïɇý?SÞm/W¼Xl¾ õSö|²Iø¡ö†_ÚàƒyµÖoƒã¢Im¶Œ™(£'\¶‰µO`›ÎvO¤µ*AŒre–².![$¢RZRìÔºÅæðŽ”öR4eG ' l7FR±ÉÉ›•1ábNÌ ×­øÉÀFy‹á{xkÊÕrpÞòt$H³–¾ Ä7vPŠƒ•†#G–rN+°_邏ïDä€úD¼z°TCÃç)`ãqŒ†À7<µÞNŠ®6E‚Nc6le}Ê>pâ:Ïõ¬—uÊš€ÉØ,΀vÓFÿVÙE5ð~§Ñ5Ü´÷ĨõÛ]ÌpŒS ÒSW~HöÀ©o“ë"á_oYçûin[8º”òFÅó¡KLe€TÅн¼”»&ÖáÂËíᬚ ¯ ­DgÈúÎàAǪ22‡Ûý,,°w+Àˆüo@ÎgZžBjÁa†ÈÑ—a½ZàyG]qy1»‹–žê§Ì"í–`v”Îv,tÎ?å….›‚j2z½>Ôã!Æ1“_ŒCQË”†„éþ•ÏwIöÖATÏçÇŠ0jÐæQ 8(F˜ˆuN/fyÆâYhOÚň5‹vÎYµÂûÛômÜþ€Ã'Ç…wD£&Í—X4 Ä ðüMѪ×1ÏU sK„×z'ò!öi,P­¿¤ÄkhÂZn|'æ(p0¾‰bV»GiÛÆçJ§¥"sjË»LÙÚ†€l&Xèèô?kué‘ YWTæ!6Õg W¸š&êõtŽ‘cIµ ~ÏÆ€¹êÖÉ¥ßÞþXüc¦¢Qîlcñ5]Ëfüñd[qS/IFWk‹ú¹$-Ù]í¤õü——.n²dŒÙ²`¨æl«»«éö}>ÏYw‚åü¿`µŸbMSKóCEñÕ ©ÇÑNµGÇùÜš2}ê9NÒŸ×WïN¯oì.¯e±µlÎêT®X`9DtÖ¥]/šM¼_\1ˆHðR.ÝÐÖŽj"R„HS ®EúlA(Å’Q$žÙüæ¦[>[¦qj†áç­úña†ž´±´ Úç½§]ñOÏKa‰…C{S¬Œ.>]÷™é©´pîn[·¸¥ònC–3¿ÞÛ™½ÐÀE4@˜æ°hW/!¥EtxZ{ûum3Ží cEóOb<>Ÿökìt>.͇¶évÔã—ºF¥­Ï±¿= xºŽE¢9RÄŽÁ£µ… Ž‚øø}6ýöéä”ù´ây·ÚŠÊ=»DT%0‹_6´Íþ®~=gAõy>ÆÃŘË|à1°á<ÃgzÔ½ãS“ëÂ2NìXqoYšÂx£\ PüÈ9´O‡Æ¤v ç½…ä]s‹e³UöKVÿ¥€¬al|ö³6‹µ±‚!8þ¼Cÿ|tްTÍ’ÊŒøþEJÒ‡íu Êjè5q°J´ÅqªGìa†êyÆ–¤YsõyÏW§3$+U«RŸØ$„M›ütѦG-OÜ|•W?RhØÞþѽ½éßùÕ@M‡SáìE áìì•™§ù‰œ…Ž—ÿ1lXH—¶Ç!óá;_äÏ}y ¹?Ðγ޿ù\—Sè0Äý*xGœø5áTØïòÝ<äœF&´=x¥k9ðçî«^` ½ÕëÚ^o "_u¸6¹Ì7Ý ¦Þ†½:ŽBÔACâtº žÐ;Ô+ø ÕR!¹¬[ÙHm´/í˜: p2Æûú:v]k7A÷×ÉýÕ??GZøggò ¾7°êC꺪uÍ#ÃrQŽ5K+1¦– g7#Áë'½}Ù|¶ó¨p·R†’­©yÐÙeowf YöE¿«Ú?x 21g§æ±ÎGÛ2fç®k:Fx“Ôg¼ÇŠ6ͶÒo<³§ÈDN‹Ï/Éc1à‚OBò›PìÒBYò±déc…š?Ñ~¡ûéc³÷ÃFäZëÓF…¤2²C1ö±1)±*¤¦aîe^ËC–oãÛf’o%HíÕ§æEn$ÞÕ3k¿ŠlHqçÜw^=w„w%®`WZ0ˆùÇ%ùÕ ý?*zîbn çú³®é$B¼O¢ñY'®xÌÛ[¸?f‹Âç³2_;4ìA¯zÝ¥.ïYC¡fwÝdN[£H‡$ZT¿—]ña‡fð0Ù̽'(vos¦!©l8Bï¯ÅE³f:¾›¾Ë=•××eøeþ+Ì‘aXÊrtô«ªñ˜áx_îKX}=×᯺ÕA‹¬å0òòÒ,ˆ.z3)°ÄÄeæñ;È­:ƒ_õùEã 5uˆ¦s¢ì¾r­2þÈîŠõð¥gGì‹s‘Z42´¸Êz~\ÿŒjç—f“ŽdÅ‚mzU-B·}¡ºª>öi’ h¼ ’ä (6;ëFÇPn¦•©w‹½Ö’8Ÿ«ùwΙ1—¿‹Õ $º©ííNŸ .^{?5ý‚d*ÜþRKºW£ Ð¢Ã{M-éöuSùRÖßõ„M—Q2Ž*SÌB_uÕS_ÆÓQôêÅœYÙ‚µ0ÕÞy. €±* öˆvçïA îÖ…ú°r³¸öI£ÁY?'’æöá‰ëBÏ aèËå‚<„ׇ8óõ±û×K´É:a»ª÷—î6Nr¾ÅòªfÔl{þ¬%Aœ¨óf„ÂÅoù»o5ïXjû¹òˤi-‹.g#Ù„ûãžœ.Fe‰ü™úe!Ã*p@Òu‡PÙŸ[ë >H†Hž#_Å7[§£”‘O}۽Ţn¸ZÖK¤ÁV4¢ØÖgêîcð„ÞtlþQ&³zëe¥Ò#þ+ë9ìi,HàbÀªÆâ} 0[OAɹ¥a½û¦Ô@ÙÈY•_£WÕþ¿±ZE¼8§ìå.oûÙ9;–:¡fzȈÉì„?3»˜¨YäE:1ÚÆ*Šÿõaj[ Ë€£5½Óën¶ù„a«[ÅÚþlÀ¥-NZ¬ìƒ/Z¥/ÔÚ†A’¨1Q€6CévÞÞÚ\ìÚ‰ gg¾ËÝ|-¦Â玊þ\\®&£þúî%„¸ZÝÜgýM¶›ÉÛ«{‡º­®ì±ç©-Øeo6϶Âç”<Ñ•¥U!Ù¶î²ÃÇhé„ïiãÊS2ŒiνG.T´•Ŷsðï&¨ôq2§›LÖ(ö›6ßoÇ‚GUÍCRJÇÀéK÷!¸ýQj™|ý†Ç5¸¬ª—K¥¿$×´;€ß±úÁÂ÷PMJòŒS¶+zîËa1 Ž)àÒ ®êÝ—•g·q `ó>÷=~Þ µÂй(ˆcZy 9ÒÅ&6ë\çýùçm5Kv—ßÀ“yÜ+¾º¤È|5”Ûªþ¯qþ ÄY¸²s°&ìy×‘Ì Ï¯ÐäËY»Ga5Œ½êžÌÁq{¢8-Q<ë0*3Ë´újôz©]XûF¾ƒ3'ƒ†ÆÒB@!Ž"é©—Ü´J{PFÝ;'ß¿ŸiÀÓ—¾/{à[¿Þzl¾öÇ •àuù²çEø¸R‹èêH%AèΠˆ˜l#Þf¹ݤK£³z„Æ Í‹Íÿ3àƒo¾cç£Ú¡­ÅjmŽwY©h¥ßVcÎýð¦ÎøY0 »aÓlÞ—ÆþFô·e2ÙJߗ΢÷¤Í¬ ÒÜV üýÓd›ˆãû×Ê;ê„6ê³X(2?õdF%©Ús±!Çý|²ƒDFp+ZnÜùŒ€ksæ=²eìÞ›"?ØÛ=AïÙ0ÎJ¥Øpñ[Q_¡àùgñŸŒ)ÉlSËskœ«dÚ»°³¢2•ØsþðËð¼5\œÍ¼Ô•©áÜ=ha®Œqg`yqká{q~7¢O×øîØO'e}ØGnŸæ4®lß"Ï»që-tJX9¬:og,}^SçjOìë´xá gl¯ó7м_Ó_”@M‡t¸HJ¬.M;Ç(~°K_Úó­;J}¾Bgèoi%ŒxÇW"•ÞÃdŸË—U—Îw8ëk׿LêÝJ´à”0ޱǕWÁCßÝÄ›_{׿xÚj£<ÒrÑ´Ög}-\ƒ¨Zþ~!Êœ×ù Ymø6öu}c 4÷X¦Ë¢°áX™f¾ IÒ´Áß÷¢ªªhb7‡%¦ø/ò°|¿ ̱Rîc+~\ò—×_L°øÎk,HÇèDÎ3òÙ~\'¿í½:įj3ð3eÚyå1å‹þs}T©êؼ͌¼IÊ„€b°)Yø¶P3X…h¿wS»|Ñbô1|¸7…r_ítìø_%tì-†kyàŒ«‹›;‚å´ÏݹË8ï^¼´£Ä—¶å i<²- ‡ü5Z;?¬›|ùô'gžà®R„ðÿÂÙ ÄÔH/­Ü™ý÷·¾_°`—Ó†oç5Ì8˜bæF¤Ç¿Ý³W¨°õˆ±Æ·ä —VûW¥­ è?4¶L-Íù< 1SýQñóNКðúáç)ž,ÿ²£e™†!}…ž»Ó=€¥½ïÕnàcæ’†ÄÅæΔp" >Y Ý]½¸t|6boH%ãÄÄ¥?u¶¼E©±¿îiF¥ÌšL0ñÐ=óUL°*£5íÀðäöL´lɽS´<ÄÊ%m‡Äœ[ÐÞxäxl\è›óÄú¾\ÌÂ…ÖæÏŽK§‘O&>;¹Wvðu2Û4'ï=Dg2Pem?ž5ø¨ ìÄÍbh'òkæ]Ø–ÇzìJöQ¥ÜPG&ÜÊ×{é} ‡ãc^çº[Ÿa*³¢9^+z¾ÄÝ_™€o€<ÌBœške¬ø^ŽU۹Ǚ ¨0¦ÿJ·¥ûV±'Ò÷ 2nìv_ÐÅÌoB)&r$Þä·’òÖˆ‘Wzÿ‡ÌЋŽÑ«¢Š%o€1¸h˜KíT£©{´™/öŽ—'ã™÷9ðê©v2й0†Àe2¸Šäl¤×–è9Ô7Êé„ ¡ t£ÏÝÁ£cÝ…X‚2]™Sö±p§:ÅlSÒÈXþÞP*j™Ž†›rµµzî±Ù:åî{¿±ëw¦v^mS8Ý8·¡ÌàYòvÇoý“‚M ¶¼`ÿ·|ašªh´J 5Jª~ë´Ýy‚’+¶ÃXöXD7à Þ\UÔˆ m}G_§Nm ЩY†‚’ vvùiíYvµ§„ÙÊŠ^ïü³ÿa½sGT¶ËY’ë­$ 3ŽÐ:š'ªÄ÷í¾ß®}§±Á+ÁÙZC¿í¦Ö¯”Ÿúr(éSêæT”G'eúpw¿¶RVŒ@ÛPŸ4¿ŠY¦€{ÖzÀþÙèˆ'ƒ¡½ —>ìþ%ºñ1Šx¢S•A¦† ší‹·¨AçÓýŸ%È¢œÙ…ñEEÿÒRD}5b®UOÎrŠÎ.H‹4fÊ$¥óþøœçi×|~ö?Ž—èèå},ûÐ6™óÒP¨Ð!9³}„C¸ÀT¶º¾º„ ÆK@ǯ]@MZ¾ :å+»‡ÿ¼ðC÷í µ’çy-̵$x?fþ+þTª3ZF»ÆÂžN/'Óé¿ù¾nÏÖÓ섊žAÞMIGø¼:ùš@¹¾‹å»\™ÓK-2Ã`ÿöêIgñ|-޳£%n7ÿ+²”N/Ô'1.„dŒê›:‰\ Ñ?`‚äEaA$cægÙ,¦hãÙП‘ôÊŒôó7{ñÙý77ä}b‰”/ïdG—ÆXœ=„É6þŠ÷¶;ŒÈ%–Ù‘ëžä³\õRÀR¸&RlkëfßqþNŒ˜J°X6ð^à •6³BùÕâ­•ì,÷wjRÜ'd§LêåĵKÓ9ñ¦dp¿öw)æ˜0ŠC7ýÖ44ßEpú%îD-ªF4üs}¹&Á‘âqðÄÂÍ–Ëð~ß\ü•’Ѷª=ŸWÌTbÅ»ŽÐl¸Eìˆ-HšÇÜ/¾»¹CÂþ©µbX÷óYå €µ£dª°õ‰úÞGwŽ“€y˜ÀÌð¨.Ôß3’GÚtfÆ9bÙ.ñ«¤Il"öS T…‹Ç{½8ê À -,%™  ÍE^@~ÆÁÕïÉgq¼m£L‰ªÊÑRm¢µØDN—ÇE›MèbkpŸø{.ØÁ=3%üèüËÓ%ÔowðKÂúÑñªX—¿í‡ÓVËXæHš.uL®Jûe=MüÆÿ{ÿKM‚°^ÿöÒ² 4r¤ŠmÖ€…WÓH%Ù´){N/‘ís­‹M)_5ˆÀsÅÁÂXLÉ”ØS¨¤ŽE ÄBáW›ªc£Ä¬7Ùu*×#õŒ7ÛhsXb%ÁQ’¯Lã­tsÇe~®å¿‰÷‘þyÇvQ4üDå¨:&¿4õ™j#E:?aS’ }ÆEúñ_•9û¹\'…ਛp­ZÌ–úyiÏ•B+Ø­Øïíä¶$¡Ï@œ;¦mßfG?“&¶úH5£p’‹’ÐëŠ NÀóH¬8$Rtï÷ÍÙ×îùg™…ZXm¯Æíív7aÙ]´Æ‹íÚ¯¾‡U§Tü ̹pNžÅp‡€Ê¾Ó»ÛfÊÉ€Cޱën™*ïjÜšyŠUCˆv×ÀJQÆŒs—d.DL;ßF<éõAc7‡Ä”Tão·ïmüqÉ•íó@ázÀú+P½ÿŽ^÷Ÿ:ôdJÿÔ[~ÊH9ecIJÒzçj²¬×ï/VBfóZZ,¼Çˆ?ó‰VM$@„œ¯s¿]¨¢2ÖCœÊOE„^g¢ÑÍ'lz´èš)ðŸù,íŽ “aÔ°…§Sb±¹¼þõK9ª¨.,Ä—{ÎíTí6zNSºÃæŽâžIØAñN'-šl"Œ³·\If±ÙÞ]fÛhõ—ßI\9)bŽœ1‡«íKñ#&Ra²ÿj+2œß Ѐ¶6³m)£-Äz*©Zxßá4su('¡ ’]g?Ðh–óùì+3Âåoñàx§•ÔæyúµNZ‹µ•‘Ñ[xZ­\h3|bp´9À€¼m°Ê0æ0ëÕèèc 0W8‰ý;M‘b>óVX ¸ís| ³Ê2~#Í3þg>=ä¯F#ž©½”|ïÿ&S Öÿ3G¯‹´Ññ/8Çg6á…E“Á]ðÃä;¬¾‡™7 dÙ4õiyý‹Ÿ¤}mÖϵ…Ó‰E}€cVý¨ÖÑ0á Ì]»76Ž#ð©—µý-WSÄè¬}I¶s¨%ѽ¼ mb點b*c¥Ù¥Ü¥XLn´²d5ô¼Äœ.qHN…äŸó)7b*·wš¾”?‰“ùÉm‘=vH<5|·1¹DçУ¿§mꞢ0D½ò.ì-–1íØ––·%ƒÒþy`aâõ_¯2”æUb_8´|QU˜nª ˆ~„”|ü»¦²…út))<˜ç-‘ù[7_ÌßòNâ‹g§çÙêR߯½Žä6ƒßû±]Q¦õ±p³¾~ÔÆ &Ñ×açø³øç1<Íy è¤.¿àöœk­ñ¡¾TY‹ÄÖ°ÓæQÕ7ËK\‡ã cFÙjTG`…2j5ÿ¸æ…4ÐxVü;¦ïeJ¯o$òÒÈéi¯Búë«=x$~ÊM ˆ.dzewm&²…ovþ&‡ @ée‡40NWfP*’üîÍ,| €Z¡¹^k…ÀN#wnµô0šLŽ‹ïRˆX„Ž´ˆ²¯Z'ûB3¸´yßâ„ÞŸ¼J@d’?jú"ÃNj‚¢g”N'Äd¬êUiÊ’’¥ü´Õ Þú–l¾c/¹1 .§ù‘ô–ÜæÄwäÄy'ºÜ¥®öv5ɱ;hSN ¯7Jëó¸@sùJ¢êÉsrØ.Å:炃~ËÙZ•¡ˆwDyE›´ïQú•‡BÁÑ+eÑ|ò3aÔ•íÈñv„êK…¾•ÊÍ´Klë¼' ¨0à\S#Wýõ•–½í¼;”½l@é*ÖBvV¸ŸŽ4Cƒv u•ì’Dï'šª®Ð®–{ѱ†û3ëêù~È Ÿ»§lKËmÊw0ycIÀĹ ] Gi ËJÿúöFrú…}/í†]K8¸–?ÛUß)ºú‹ãß—\’ÊûäQ³ÌÈw–× W%ìW[©Io“l–óÖ£^J€Î_Ê>¶À¨  J€D)i((<ÔØ´]4¦N±Vf˜½Ìôç¿}"3>yï=B'¹¸P½çèhÙ•’/ô(ÈmÿÃìz­!ºúÈûZûÓ"V ¬‚ïdOæÅg3ÆýÍ…Yì%š-Æ ûvÁrɯð­KÞÝY,yRÉ$Œb~LÌo;/ ¬oæxBc€4.ðp:?p½„˜ ÛØ=VÎfË•ÈÂÄMHÿÇ}^V€¯XëýÎ]}FÊÞ{I{ïs•ÁÓ|R´p Sí`‡|ð¼ XæÒ^͵f©ù1»¦2ø®Üà@%6’;?ÙšŸcØ|S¬Gô1DܼõÏÍ —ê0õ…æÁJÅջ撱 Eù]{‘+ûw¨ X(Ñ`5x‹m~±Ùû:X¬}çÞ¶^h£ÿdµŠzp"³j]{uýsž©÷Ï2nyOóÈÂiî·fï^ÆûZ b‰q~ë§f±Ëo V§Xù²—%z¦ßëï<¹÷0¸×@Çý×9_¾×ëý€˜ò #¸±é,ùûñvTÇ݇9ã¿ &]h¢ Ÿºà†lâ«—utÎâýÅׇÇP8û'I®ìvï3øã˜÷Šbó Ð–¦‘3ÏÐ?âá÷ˆyðO±T#ævÒª|ˆM—v”“”8ãfü.F›y:å--Ë3c£rÕíokÉ¢´3vM hf\NO鈜²>oŒ»Íüð¨žm쀊uE·‡ d³+õ¥Q¾É÷#m®ŽXý¶ç"O;TàmV-ÇžCyço*ónFÊÃF,ó> ß½¯y-'<=ÿ³ÛDV°z™¥[7»†Ð;øwª Q¸?(ŸžH¹–òøÔÏŸ]JF¢R<ôX$¼7Œ>øIø‚'ç¡‹ÂØ`j¤T1½»(à`•ÙžMâ¼üÖ¦U‘Öö#ö½.¬T²SË/¥ÃÖ¤?W•]2ûàÝ1øŒc¹DÄ;VÆaQŠJñ×±£^¡¬wë?ñí~`½½®6D²G@ ý5‡‘V¼ûˆ É(æä‹ãg9[Ù—·mAq^ƒ±æ¥0o%Ÿ€Á,>C6R°5¿‘ý½ŽýlGùúQ%é ÚtžùwȈüzlß+ß}îÓÚðr_V‹áðp‘Ø)ôíAFÝàÙKÕáx§%™rËSm7Î7p=ÌknÆÿÊÊ©ù ’.Ð1]5†úÞ3϶F‚Bôœñ5—“ºÏèV^@Txð ©ÂYßU­2Ϟξ”À}®¯ébìà-r·^U5Ko\8Óî>+”½®Øð@2à£ÚV÷ J-3 ¶AÍ ZAUûå^qϰ®Iª1¿µÐGÊh?ΓÎ<|W£åP¥¡7ŸpçÄã{§ï-¦4H ¡…^RAa݈`ô¥=zÃB÷K6𙋔}ú‘w Ö«™Pû§=¤É¶ÿIðóF€Hïø!+¼Î;#gB]µˆ‡š?C¶Š7Üpʯ(ީŖ<¦U¾hú„‹ÊTÁ:5ÚÍçßH­³G€œŽ…Ä7"ò…÷O\Ý•ÿei7Ýûlƒ¿E>þ>ú¿ÁÒf‡˜Em@1G6æ/áe™³R €§6RºzR˨J˪Uþ8ÖA•ʨ¾ŒlŽÛ\ïxÇЖ³Í“ê î[ä®sG«¼æáp¨Ã ¹`~ïÐsxÚ„ý"Uw%I¦Mç…gÏåM#$™Þ™W$ýE!º0_§ïèÏ€¡½,u a}x‹ÆQOÌåP¿üa¢\ß Ts"µ±¨. êžps—Œð8/æ‚p+þ4(R•Q0»ùÁª‹G#b$ãÀŠo‡ÆË­ÑÞ¿¹àuV©µlâ\ûh¢¯¶ˆ˜S;,*Ó'BDâòk¢·oØðãæ*ÃÞZ5@k€ dŠ…m R¡êkÝÊt7ë‚ð>T´x(.v¼ŸîB{œ§TZCzàì¤f¨k:Ú}*z^ h#þ—oЦ1B]¦‡7÷àoU½‰ê-áP˜Êc\q¶™mV<*æ¹îï,ùv7Oo,û{¦I.Oç¸ÑF³û hÿ„ºŠgG“‹÷+Ö¯I>ŠÌBu]ÁñR<õŽªr¸ €;þ¯œ@c†¥ý±ºÎ¬n’?ºNÂæ·sîh»×ÃK^_6ùeªòÀ›…R|¦ Aôdm ‰öc…ñPÉ–ƒüáŠíîcïáȕ۳H;!Zk‹ËÂÞZÍ÷ã-ÎH  ±vçåéÛÀÌìWm¥ÂŒ›²k~€gŽ(©“˜ÇÁjÖä >Xã!Ëõ‚ ~Á1˜´æz›ö[}U@Á YÈTÒGFI …B AgòÃNý ·-vŽ˜uxß«u±®Ñxú§¶ö€q킚Ý"Sëî2Ò6ÂSBûr?çOövGIjwbëû(i®Š÷ó¥×qe á¤Ò7êt~7Ð’Ű Ž–Úk QO<¡± 3!¹ÁÀKO X @N¢f¼Çâôão5e­dB£×K‰Žã±H°ªÅÛÙLˆåáÐzα¯n]5wÇqÎ;GÍ"'ýüC‚a^ID-­1ÑMÞvy"¡9—K{’¸ßÚ¿H[xx°"{œIRÅ;—~Q³8s}_D¹¾\þtý¦[ä xÏH¾']>·mÂ,Ü‘@m0È‘Õyì·Ÿ@@ª²ÓFY]g©ð5vÏjªW  ·iš`Ñ4 4äœ\"W4×xÒõ(V…ûô‹^&®ƒ—„bIP³žÔW‡HXuW­H=àÛ¿Mî¸ÜÙ=’/%”¹ûPÓŒ ™QÈBa#ÊX஘½¶ë¿4—„Ýw-ÜóÍ^ªioCðÙI<¿A똳K³!q@—¶¼ëËsTÄÏð \BÓ"ûK¤ó¯n¹­lR³? ÆÛ¿#{—:ëjïSâ u<«£™Ñ4EbÓÑÆãá—îì'Áç½ÌVd„Þ*‚fn¼k¬®gezùÑœú‘c ¶ü*Ãõjðd>¦ HTòŒÜÙ’¿Á“<<€i©#fS³W„ùy«¶DÃÔ¸ )Rb q¹ÌÌþx^ä ÔJ¯Ø%j ²ÄÑØYæ–¡h~º½ ò©«®¯9ÞeèÇÍ OÆû94²“ ÷DpzZÏ®é,Ìß)Ý…hBÕuL²#öDÜW4LÀÿ;kÉIÏ<ë‘ï55H1úÛ fà˃Á ºãw«×+@kA){>+“ ù—šû ˜’²f{·6Uó¨‰A?WÿÖªÅ-Ž¡Ÿ-XÙHÙE6;@S~ {ÜÉyn»$ÿöd7*úýûó€×}iô/ Jlc±îŽRzCl¤2lnÌ©7Þ¹)|èßb*Õ4ºY¸œ£³µcã¯an^¤ïô¼zÍ! ‚vR€X8A A°%øªßÒ&€„OMghZ–Û?Ê- ‹;%Ç)ù?ŠÈòï3–tØ’¥‡ö²ØöêÛuÐÛÞI¥’_Rþ„oÃÀüu}O!˱&¥eæÛž¿?Æ=L5É÷¿1 þ'-{G è£é+½løõKí‚k¤¦Œ”Z6fÿ,>SûJÿîoúq\*®vŸÛl2)m•ð‘´ÒŽÒBûÊß?zëÑÜ]:¨÷KG¯ZìBÚûÌÙºáx¹Q©V©yF˜ÙDdTù¦ê¢d&‡ªhÐúGû2Íwí4eL¤Û§–gý ¯Hͬr»·ê@Q­øòÜÕ½µ@×k ‚PGXâä£ÈuÊ.Úã®åU­%õÇŠû]R»g¿{‹×†îeð{{$äº/Èæ÷¨e»Ø÷¦ Ž{lÀ&¾^ú…OÖ†¡D²æ°%ƒËb)|òw›å©è¯ #4 ånþ}¸ï~ ÚùçÚ ¹û3ß&çà/‘’¦›È„ÂõÌÊ ŸöJæK†7J*0Ÿ]U׺,ëШ-¢h’ü ú]SÿžŸ6û\á$¿…Xºa^3‘¼v\ÔF^z¥šXËJͨ¬ÎÁmY_ –Ä)1 Ô~›K^ûžÅ[ú‚ÍWdb=Zý:Ïʈ;§gªÉ™sö«é±ÖPýŸÁÌÌ/³áG‚^td‡ÕÀÜ ¥“z¶RÛ L¥["M i./mðNòï£ ÍCŸü¤ô¿‘Tèzâ ^ï<Úk›ŠGS“û hÚ—8‹ré<† k6Ôˆ*µúEúÙï½ä A êÇsùÙÏn%± [×¼.M™ýúcR§?RQŒ ¶¾Ú`"‰Iýih_;Îkz6Æ;½²²óÕuJ;šdWÑ^:we'â×â÷üó_ co›=Ëà,¨!î­¢kèáõzIJY_5bñh/ölîhKáŒ"´u E»« $Ôù·ò+zù¢/éOg!±qŸéKop­‘_ à7ðþAî'¤Xñ –‡>Ü= ¼©ÖÖ©h´Óy[ŸyOˆ«ŠsGìjËk +&ÇDµËv‡³WúA.ÛÉ8Ç#ýsï° €DÙKÍr9Àz.Ç¢»—vËtZ=_Ðû/Ä´ÛóÃí`ì“ý¶.øÿ[¯!ìn¯CKÝ&™í²ÅTYHùD>×+ë‡ä*ÉèûHÉb65^¾Ëæ-ªêýÒ‹G¥“•E‹?[°*uħ•,ËÕ…¢ñ|"¸\NeÝÀUÞÿ¢\‹íE³cøRáûYì'ZŠØœTÛ²Ü:Š‹\¬—’ê7‹Ñ½m¤v=wÜyz×*³wÌüeÅëÜW¾á{Ì•„Ñr‚Îu2úó4"gw±µ£-Ø´Æúê½½·Ò{¦àf@›]õà†’'“µu±åÆv”Àüz™­ê(ruœ)Oü¸d$ê颬ĔáŒ~Xý¥t×Êy À8–½ßÿtÃù¸´…žkY1 •Õ—«êµœÔ|ˆAÚì–<Ù;ÏQ‹›¥²€^æ2}£œ›¶œmW‰^2­š%dX¢µœ_SÌ;X¿æ}¼ƒƒÜqÀêW^"ýtü®µŽ9–já™pJn«0ºÌÊÆ DÈ~S§GöËts¨³š?Y–ƒÆÐׯ—»òÈÒíÑê…÷6²ÏHæ+L b­·I §º³™e·v£s€’p ×ÜÖ$v®Í&Á¡d©¢œ1˜ã•³Xßù’‡]æ…þ­[¨â|I—|–ŒZŒÆ§ÊË ÂüYì5i¦òBÔNiE_ÑH-¸ cëFm/Z#ÇT¶­)ùìÞ§»LO!PדLIWHíÛÀ¯XmWÕûyN[Û¶™È&梓³?ˆ˜õ¼üŠE–\k§[ãÚ~¡ ¨žÌ7Fê¤^\éÚ‰3nW–Û–=È×oeÜÔ£áyBoœù*ºšÑíÓ¦³ëJÇWGö­‹2¼­´ØË—Ëe,_¶å¹úÁ„ÆhÛ;M­™:ÌáqÙNýÔÍ2?ëúéŽ"ø]ÌXbY’¯ÐŸ›×™¬‡*§7EY¢\ÍÌÈ•œîIËÚiM&®eõ•ÊÏ®vý÷Ú–zb¹ü´AwP̾î°@=B\Ö¶¨_«¾jv± |^k¼EÑŸ kSõ3oµiç†áÆ\“ÿ,‡·û¸Íœr²þH_hð¶wIò~óò‡r×ËÅMö©‰fl’7=ç9ÇôlH”ão×Ly‹$É€Å)å.¤þ%GÕîl€½·5yb™î[™Îb’¦{Ò™ôzÑ*;‡ží`n¤‰Û8°ïdz Ê\ØNÆš¥³œ×aÔ=VÐMEøóñBùÃ_Žô‰ ‘ñþ‘x×÷KåFö£×r¢Jeé©#(”ø°0ÔÏyàc?p³B~ß=xkdÅ 5ˆ~ø“Ömvž™Ìš÷PóDEµr؆;ÝuÀŸÚùè+]j®Q»W˜‡ç ‹;1Ó&Xß¾K¸<5„7¶áªÌîÊ„ý­”Šhâ%×/ÛóÙh›=¥Q«ík[8FÿŸÄxÕèO`=ÌG#8_4·Q”ävT¯5—ˆ RQ5•Î4ÝœT~õqÿ×áÌ©–»—Òž½ #ýÂÔ–Ù_šJ~®åñiroè/ÇÿWG"1äÒ¿Ï#Ì»€ÌáSú-´­ÇZˆÆæÿ>‹ï]Ö Wòœ|H@ºô/g~¥™»ŽnœƒñÓêqÔëd T+P‡õ“–†øiX õ P؈fK\…@bÂîìúŸ°bB¦ÆVí^•¹éðæoMûè¯{\7M^½FåíîÿÂ>ŒOI±G¬ª¡¢(InºÇíñÓâ$;ÑÙê¬|ž¢ë;4þ\±÷~*™´ó=]%!4õµ[A¯×q15È„`Øl¯èþ?}ÿTFîÎ?‘þæð£ÄAÁŽ»Ç ÖÐÚQ>„!Y çŽÉÁG‹(ÈÍ%”$x |è½DŽ*Ñí¼…¾Åû2º¹…Ö´úÈs1x*)õ+qâXdQícnÁزgg™d*LïT ñ­;ºÐ¾Ôﻼ’ q2º½på’«,=‡8W;,O%5ÉÓÊAÍ{±Å2"/VÎΜɫÝÞuÑÙ`nÝ8qUíÐ {„€Æ´qâVcšî¥<öùj|´˜ÕÅj¹uÙÑòˆyöÌ7¢y\Y;áûÖ„`pK&Iß>Š`æM*´~Î,|?TIécéºÝtÔ·U·®L×­ÙËeÐa½‡¯×£íÒ½T­Q&ç_Jñ:󃥨k®XTŠèÇšKǬ£5èwj~Èz¸yáÚPÂeÔy‹`9¨&úl¶;´ËA!Óo± ¥,bŽ˜Ê¾7~_‹Úu vÚµ|•¾3ÚÖ¿ÓL™&g²±»˜$j¦à/_sh_ùo4ª ,.í¸«¢å¿1›íVZ³¨¢“z‹‘,ÄÒYǺ¯ü…,E˶d-xž´¥öÿ~°¾:8JŸ ðÑ;¦2Sqޏ`ô:Ù[žþÏÇpsx¨±?–3ÙBäÞÍ+rrä ×A5K³³ìì/úw_,zGÚ“5·87—VÙ†ïÉPÚyŠÓ³‘×ós‰H7gè·Ä=J)¹óŽã·T4ù1:°¡‘]6>«Êüsã”Ñ.ácmÖ¨Ákž Šã_ãØ7å²¢ã0­Q@u÷œ¦§Æ,èâd›ðAÁ hv3èéÌb°ÉkÜ!ý·|ƒ™¶Ô[㣠KW¾3ºqžaâû4ÉÈÈ·»DÓjûROg6°Ñê!3mD Óm…Ô•D©³ŸÇƒé’‚˜hrÏ©êÝOzØÖ})×PM#Þi06‡h ZÅú(#Ã]×MœDˆ"þ{ð*–ümwG6\®¡,¬õ<ã{©§Ælmž¨eR Ò/o ˨3h""^2Å{åò+ÀÕ¨Jæ6Ö6* Â#é =À¨¬éÛ€9 ¼–õ€wÞzC˜în»±ˆtÏ?l¤Êú꤬—‹é\]O‡ƒÂ·ç,¡·¢Ãè)…y.ª"ÉëvbìßàoË¿5fûeCʬzrÐigž¶×@q=2KJtü\×$Î÷ÓÌÕ¯û‰™ØÛ+¦SH€Üâ«¿q+@¾GöþµnØ,Ÿû[©­sýW?÷–oðÆuEå0§\ñ«7·o-[0°K¿¥:H.»¿;ˆùåÒ¹Ä)ÕÀt¥¬Å•­Úˆò/Â4·†E%6ÓI¡Ž9Ë®½´˜Ecó½#l1*Gî®Sz,0= ÒÁf_η9[쨾U³6T ¾/Ü>s¶ŠMªl×]Ð௅3êv8¤ Nè7 ½Éc‹“X$Œ%0à«óuÇ«ÑÔ¥Û0ª”r5¿°Jtf *Q(‰}¸†ýFÆü8¤ÆqnuSH ò„¬ÇDèÜ´£I ¸D‚ÿª^ÂOÒÇé³òü§}÷½s:™÷™tËõ„ò”9’YïÇçj%òê¨Ñ„VÂO냡º[«|p+ñ<éé_m^yÂñ‚ÚéqǨÝÖq3ØXŽY|δ•=rãè’/¯··9~ ù ö/ÇÚAŒr¬4žmg¯õÏ<)œ&.·ÍáŠqj•ò-½•o¨SŠÁãØ|Ä‹ޤq×y†jS³·àOjB†/šÑ ŠÑÓÖjæ@F^˦(Ñò·s•ð¡:ûÐË+ÙªÈáV‹Ð¨ò©Crk*À4E¨\¥7³˜Ö95Ò(3Ð'G‘€÷Ö˜Séá+›;¶€HY©qR…w²ƒÈv¿ëyû/ɘŒŒh¬³=bý :uó×*[%·J—®(ýòI&©û5§Œ‘ J£cô'òµËjŸµd ½ˆ1?ûYmš)D^DvŠO¥[tN4ÈI~KØSê²W(S«Àøš²š‹ëöîyÑy Nˆ…†DÖ“(Ø^ž¹´A¡Êv 3à}ŽÍS“á€×X¤’¼üpa1 i?²YÌΧ̒Ðr.â Lyd/Žé«–Ф[—\D¸øÓ·L´G(ŽZ®¯g¯Ý¢ûzJLÃ;0_zŠ^öi†Qm-ƒ\‘¶ d$öpà q€ÉXÚ+sr€bý±|~d²¸eøU£QÍyt³NUÓçvý_û¾E=¼'¡4›ÌAܼ.ýL7>_ÞµˆW™Êb³ÞPÒ}ðÖÏý·ajC¨®ñ§á¤ŽµkêI#ˆÔÊis¶~íÅÃ9DG;£R_+†‡^Ÿ¨C=地ï<·ÉÕ¼ ÿÙÀ£&¤ûG‚³<ª½®]r[öÕâé:dÔªzÛèßNq_i uQ×êç&>3Ïš_1X™¹1š~òÖy.Âö•ÁÞP¡øVMûC MÂ`OF ÎÛ@ù¼âua× ^ÿRqOlºûV £U ðéêOE9]µM¸Ð‰ºC´J1Z“s„3öq²4L¢ä6:C£ƒo¬i‰5LaÚL»×jÝHgîpq"*‰A'±¼#ðùíir´û±3©‚LÄ/›'2ÈãÞ»úE–#iÙò} ã2Î4¿±ó‹ä£ …`ÉyšFKa]G¸žéRe³¦-‘|¸Qb|©OPkø‚ùcyD®HÌ%ÒrÕÁvtK¡†ÝES[Œ• ÅãjÎÿœj œNùÛ¦($±®ÿ¬×Ìñ«™2#K”8uÛëïkˆ­fŠÌþQ߈ŽCî=‹8Tý= 2‡’A«ÿÙæëòr¢Ï:N)W³õïA{3”ÜïÏ„Ïøa$Õøž·ÿÒèZÞNÒGª{V™(‡Qä~súæ—+ªõÓ•@=Ûr`DSîÏ]3 új6]Q®8VÝXò»’ˆ¹YþÄé®hì{‘Μ¨í±ã®Ôä´,ŠL“ž_ãÐö)tu ¿7Ë;qNÕ6Ü+z6^Ä?*†¡ó(ë[ªßÏêâ‘,Õ@Ñö¹e+:AéÌ_<Õ&ñY‰G¶Sß…ujÑ瞊v8k©4¢züÕ¿þ&èÞFÞPʰÈùƒÀïZúYNcWm5œ-.Q;ÑJ9⋺ȼ¹—ÞD¼ví& ÇûIé(d=¹Žù/XJÛ äJ#­ ¥E+þï) GâŠä™_lµ±«uÞF–mÈ;Z”“±ùà¢BÙs°§fqäàá£÷aÞsjF”XS*jùì‘Ê¥ÖK}· ë[6ttåü„´]áÈ÷'¹êóUHtùl M^äM*«¿”7Ì¥š”ÖurW;nÔ°oýbJ­6ÖÕWéµ?ê)êþO£{…$[¾AxcËyNõÇ2îZ‰zŸÔ¿!+ý ET¢bɽè¡â_õ*aùï ü¤t<ˆ¯5X(çÖåÚGŸ;¹ã1{6*cú«&µªçQa¤<ÕW_ÖTÖª äoqÍß ÉàU‘õ鈃¬8É›QÍìÉÆb6wný“ÕG2¾_0\ ?‹w~Ãçh´ê·ç¹ÌZ jMî3?ÛûŠ÷ŽifÇ®=Ý6îœ=¿ÍI£šÆrJÕÔG”z¹àW’ò­P‰Cñ[¡." ¦'Ia÷ÂMµ´|ùŽÆ9Eï«W›÷†¨ühìþXnŸVtÉNaògtÎϱdûDΑô[4ó†ªÊLM/É•øC§ŠM\Se¹“É 0Q–oÍ&Hõ mKµ_ýy¯…}“oª<”CÒ™ »/IÑ“9¢Ù¬ÏkÓ1 ö9C óðà_|*Þd†}ÔÓ•ëL’!û#Õ+CþåëIÁàl¸-è Ñg ︙ú¡éݱݰiö’Îj žîpýˆwì‡ÔŠ´*¸´r|õg ul·#úmˆilÄCÏXºžå~‡ý\mØú$Š1z%ŒKÙJã|êÎo7H3÷fO<{‹Ðþ¢¤>KÜs“M—ß›0!ôË=ÁZæâ*Ñ« A?ÒTœ(vŒ3ƒáØzöu <7®àuó"úâk]`ˆý~tÇÝߘ˜â.$y~jóÞèµ¾ì£½Ý é«+TÔ•o ólá\ø\}Uæ¯Î¸Ú¼È.Ÿ¡L«»Z<ó’m28µ Ùòòó6¢mjU¤î˜7{¼ÙþÏZÜëχ>Œæ`±ID„‹èþä( îá}Axɳ«Û9Ý– ˜`>lÝ1Ê«re6û OMÆà-½Ü\íòËXD:¯ùŸ÷á³":%9Pä±ËwN.Ðè¤Êìý<A&›iÃpwê hÏ*®Jò§Hwîa7·Îeì ÷Ùå7ITk¶0²€ñ! ›_YVM!ÁTÎoÇD½PŽÊ«^rQgßYºïszNþ:e‹’C‰:ˆÁU'õLŒðÁG¤·ü—¹É[B¤¼iV¨ØX1ïñEÈv6^Ï]Aî³mhDŠXâ;ç×nXÊ$ºâÖÿÄÂ# !üsÖ¸Ñ1Ù[úÅzÑP&a^Ÿ9¢÷”iýó9rSãD@¼Çˆ–?—¡å¾—Ëú2 Ðû«‹U¤“’b¨ÜPB»µDí¼ù…|g29tÕ>}ñ Ofqñæ¶æ1;ÂN3Ó}vÔŸ`%·x:–fó þêÑO‘ǨˆžÈ¦õphÊßhrxÀÚ{ÁU#½H»lxå\í–©(weO D]åüà¶HÍr¹ªåk$ÍýÙ&ˆw–ô¥z·;o2r÷»{8·Ñü¤‘²­¥&€j9û¹óCê`4„aoÝôˆTÒÙ`W_TÄÀ8MsÔ‹±Ïb´,:€ÿGk'z +ýP€ß­ìχÐåx”,L©Kh½ªßå1:·r¿…ãõpDÚ)N±Ä‡ 9S n=90L«âiQ½ë}ܘ›¥_NRLÑäùKf¤¶ÍÚ+G;­ŒÄki¢ aí0Ñø˜.“[›™vaüÁãÍ1¾61’.›ŽÒ\åÿ—YˆÑEΣbnÕuÅESÍ â”¼(ÞWY"Äâþz¢Ê¸Õ&Vº7¹/©€ª~ÊéÕÉç’˜Ìl‰ØU‚Ãpe[¦#t¾6)<ú$°Jâ!/ÈâmnÌŒID­xŒ¹ðm{üL÷Ìî!mýÁY`Iˆ*ûȦê‡ð˜G£Ö×>nÓ”»FÊ ¾'×Ñ{ ¢œA5³¨ƒOÒ±P±NÆ­Bfa…Cƒ?¿Ô%ŸÑ]z‘v5ùc“[›ÄÎDê€ö?&­½ò~¥»JqÝ<¿³Ä╼»x€ÅD{š¥Ή ꕳ ÅE"Ç…â'ÔH˜YYxàõýzc%Óô"”°Ç ŽQùë <®l $Æé¨š+¯ñÔš.©ìïÔ(Z!»t¨1§9¬Súùì9—,Ëwe0ù7ÎÍ ƒ4ì™A?ÙÏ2B—‚pD‘M3 —¦–o„þõÀ—{_Q\3V-÷ ß›ú“öø!^iÓZ1Âc¶SI´·i-æq²^ ÷Ÿäߟ €zc•ØD¢Ûê4–šª²4ú˜.Ý(ZÅO6¼‘k¥Ð¶…`‡Ô¼‰Å`|Ú¹r˜ ütoÓ§ƒoG •¦ÛWøâhËX§×ûä“üÛ€ÜJ»4˜*ÃÈdòx«‚4c2Rl‡mG¡ä* 4Àx Å™d¶È‘Ýoù¬u6?‚ÒASØŽY>œù_²9™Fåm# È?ÀK(¾4v*ȧDþMÔ1@òÜÎí¸¯¤{¯¤ïÛM°óu‘¦¡3('¼Vž¤6Ó›SŠ›¸;4—Tú­@ŽPÌ>J°Î"3”ßû Ú𵂹‰(Çø º÷<p‡†0ìÙ[-ŒOFã0‘IÔÈÕ¤Â'0s…sL‘p8Ž0;6»h’|õÈXìšB:˽豿AèÌIˆ”õÃñw§ ³S³l¶#D<„eð6ä\š}æßL©‚6!BNÆ bhEاäûò¾Xqsä³/Ü„,Œºò}§``5 -в¸Ò”î§ÊÁ¸…¾Ë?ŽA;€b²<ƒELBž€×T·ßFŸæé [w¿ßf“›1;ó2c˜ÓcBÜ«"¿Â6Ï+þo [¾ñƒý4‡º{íÈÛAF×¢#Y¿ýÿ”*Ñ*¸ב7ºgˆÀ—M'fïc(K€Ìh£V*bþŸ9Hw® _F¦7jÜáܱõ襘xT9[ÐGLk¨Œg:M©a KÌ-åÔ瘿ûò'W¹År„Cs•m GJ1€3Ù¡¤Næ&„uËö¼®™•Áäðv„ pD+•Ši…Ï‚'æmGd y[Fu?&âRso¨qº<;^äpo:ÎñE c5ŒV-CôlÒýߎÔºç 2‚gkðc)¾ÆÞ§¥Ešt¹ÑÒúΘ_§1& aíp«K$Eú{¢ßÃs}Z­¨´(?ÿfúÈÌC<¥ 1²Eøç±„)2a`Л³¡YFŠÆ¹×§#Ã[dUÍY«ú¨1¶Ëd^-9ìBo¨¥ò_ÞY­­¶UʰF2æ -×6äÇ¢!ÃÈ=È÷tH çyØõ œdG®)ñnÕÊ_å(#Gö~GlÍ‹'žz'Z&y­v”Z‰ íY䧸7/°ë!À%9*ª4óLüªÉ âyaᆂBxxf*)¯—òãø9?ã¬~¹ ДO 3¦â,óQ¼R³¹7¿0/n,b¥ã|N5Æ+ˆ¼ŒJÇk ùê=ˆÃ,ÊÒÿTþ¹Å~¶&G»öð$³Gz»ek$cúê–&É'öÖþ©ƒšAä‚ ùÙ±>ŠJü'pF£Ÿnº¯¡tùD ém;Œ30ýí]?Í«m¯' u 3´¶µ“ ’ïIª¨P…•x_§Ÿ–’6åQ‚þ‚Ûœ„1ü¾¯xðªNŠë}e‚Ô“c¢Æ¥ŽÔ«³ë†Ýõ\ÿ~Á~Ž÷Kò¼þv a>Ľ¸ò)ÆÌUµ´Š5Sö”ùœ{I‡+ SÞKPÛ†°R,pCåû®œ»;²ú˜htpqω>’­Ð½œãgÍ'•å^‘¦EL¶#ìð«¶é3æÂO¡¢mWõ’ÿƒì^ ª´@,,‡6©S¬ááöÄ[›ÕÈ…y䬸s’ƒN¹ ܺ®b]¥PÍÆÀªðrüÆô^0þ‡B@$³ Î3K:ûö9–̬fÊJ.¼|s9Žú}¦ÞÔHôëÕí»Þ*ÜG0¥3­än!Ê¡u2Hfh=Nñ&¦ÅH4þUhªB£oŒWøt Ê.uVÒéŸÛú6'H¼©V‡RTIVáQ_¼}¡ï?˜ÓØ xÀ¬M5é·ŠÅ$":?=14˜¼ù^ëm"ó¤Z= ü¤°ÀQ‡M¥ìG6œJÕ[Úx¶Æq¾Oü!÷EŽ17:6ÿ;¨~W,¶~I7aLNóõ²Ï)Ým†Ú Ds|~º”rºÈÌÜñFÌ#”õŸ¬‚ 1]6fÁ—äÉ* P¤_ÓŸ¡1eÒ¬M×5õ!{*ô3‰òzÏ+€‰ba¤¨8qõ)`ÑËÔO,Œmfõ*Nøè”ü·’×pbo´ÿ”xvÚÚ"÷Õû°é¹c$â0Cà–ÂN­øŸZʰE)þƶעé_ðÎ}\øÝ LûØ`ÏŒ±’Té‰WÇ„»7Ì«›Jé:Æ×œ+Ð[&Ÿ¼‹¶–1÷÷#QìL4T êucwçù̇Ô׆@ B@Q³àVÞE®eí0›|Ú~êšw‰³(ÚÊP;~fôCn7‘ñm[¥?(kÔRÏÅ2S}Ì×V‰k=ú8§ÒÑLezA*6‚ÆbÅ‘B݉š]¦[êåJ‰*ZÒpi`bø'ßí‰Ne>ˆ¾ñ„Ýë`Ÿ銌 Ø:“1rŒ¾[„Jù¢¾•çÎæúðÞt¸Éàþ”MGòãKf@È8 Ô þ üåûD¢¼¢ÊóëO¼ƒ;k¾é/=åj„æÁ>Ì„ÚÙ ýñC‹âåÈs+Œ<™qÉ@]Ïa„DSâ¹OG÷1Ѹ¬jÓ°Þó2Ïèz˜ªZaÝãb<“\¤D4VÏç"¼‹1טžÂ1² Ñ#¸j“ ~"ÿÕ>½‚[Ôœõi¥+,š}ÔØÕjAS³„ŸŸ¯PõDÜ$@û!šnM„J§!Lî)^:õ£âJcòü‚))‘3?öfË_¦z¹€hCö ñ™ÄQ[t9™À"«•³ç,È9ÆcóxMY\èC‡Z„5¦iª Ɇ†÷PIÊ™-ŠM OtZ«εQ椰¦.ý½,„‡ae‡,j^µ£Õ´CŒÝÕ…Åø³ü;o÷h‘¿gAY„Iu4¥E„;è‚…/¼9hOIrVgŠfGýÃv9ÁQL܇奻„؆+äÊ îO!bñ.rŒ}×4YÛxꤛHu¿ã¯ºW¸8UÖC,E®6þé‰_á8®zT—U•w.ÖÏpœú_žÑ¼]•¬½a›êšù(]–ÌÎØüɘ#ÑERN§|”að!Yئ¾D¤°+ëjq¤¸Ì§bJÓjgâŠ/½žU×bñÖ¾*n°Å–iò^éä3N- ŒßåºhqØžØ5"¡àþ‚œá{;HðØ_“ µƒÄP¯íÅóF›`y_Êåô—y‡ý¡¤‰Ð+T¬°š¥6UåjëÆÞg™,½™ybhH„GP§òà굃KÒãóÒ®Ðq;)B%ÙœèfX)é†Þf ¹8¸~u…Ä›‰>èʯøÆ]wËl&=‘® _”CH?•¼2"¦º'f¢)X‰'û¼aW«µ§{d…VY˜Oæ›Í|9¿–ôÇŒŽ¤Ü³øÈé B\Tݱ^–/2¿5}¼+pñk¢$&ìP±*—dÏ_¹gýUFx7›; q%†ü0œÃ…ÈÇ.ýå—2Ì=z|%o‘ô2ø7ó¥Îû¢?>êh§e´Ý½¾ßß¼Z\Ì‹žoǯT¼ ²6bA8iT¤7n']’§ÍñpÄ}#i0ÓZÕ™¡ý­C ]w â#øƒtŠß‚÷§3ØD¦§xÍfŸØWD\óÀ¾l>®³°ûuœ1Ì۰éÅŒ °æ€@ø[…Ýû†&ÀL©úÀ¦©t¶‰ˆðן«dj ‚W„罊 @}¸º=°5±XR •zK6#SJM†_D<)‘OnV(5àÊ:Ñá­.™’Öû;O«1TàØ›ÈûUj„_5­€ÿ¼,ë_hÌd&p}<|8eñÀ+, t,’Uvlï·DY ±pc¢õu„ WHÓœ ÌTÌÑ›ªB‰Dùƒ£ÈÕÊtgÑäS£Ž…ªû,œIØWüFü’-xu”·hŽ=´1hû¹O7MÔcÿÁ»åôXYhÅíâ}BÛgŸ¾óA‰˜iÕ§Z²]· ÀýBf¯$Jš„Ûq¶²ÁØÈBŠõ Ñ<œyž3“á+ç5_!ï´XÏ,ôÝð…½2ÚÍD{;޽xÂ4½æ’#⸓ÂZñŒ¾SÐòmRj…zað݈™¦öŸÄPc‰ãCÈ6±Îaftfÿ J³Å‹?vúЭ„Z}°r+€çDqyÝ(¤s'tzÊ7VJÙ}EдœdØâÌ!€G²Á>±¯¨ü©WøÆ^̧t N³„J*èd«Æ® €Ñ Ëür`ñ_êé¹Ú•+ý.NŠÔãåB”¶Í‘vÃ%`_”*CÁÄyúŸêê#§6„ìò‚#PaækžO‰P±Ôo*$Q0uy.†<­œWщ¥6‘3bÃ×Ç µ‚®s«à0LÚù·<™>)9…’Ó&*÷u¼MŸBå õÓ&*•Yƒæó+2óUw@ÇŠÓpݧwªó›Ôr_s+”—«}g·ä¾ðªihbw‘•íèC²Ð¡[iTˆQÍ,®Ú~úÈ;jêy«¾jÀš)^£LŒŒÿB{£ &Œ@“aÒk™(çD¬ ûÏfJ2;õGÆ3ÈHo=©jÁ$‹ ¯­J¨Yæuü㣠h¶_F6„VW\…hm’]k%¸w3|ÉTe@À~$ÑXxãõñØ´” ÜmËtº½>ç²¥Nˆ:€Sª[”‰©ˆ-戛ŠÌ$JŠ~uu ¥€jU1+H;æ™[ò]Ì„¯`œÛFZ¸9:A’A⣘ŽGëÎÃëOಲÊWi4=mÓWF›¯>èèªÁ%ˆ'ìß²I±ÔÍõÎ[g³môUwËÔ•-º¿Þ5JLyé+Çîe”&«Ul£ã©§HÅúf  Ù®xEDqLB¡ Ã<ÚhûϪ,<ø¿¶‹‡CMYq€Ä â ‡a®@E·×¾m]`—\k¥t€xŒ©tf¾3VÁêM¼¶{Iw툧W¢µ…“°%Ú¢`øþ,sv‹P•‚"ÍcGþšîdqDκ¹¢ÝÒ¯ò.|yb]¥ÍÝ…âç¦gâô3tB¿},-0[móe aöh•vΙÐl¯¢Ö¿(énk×/Á0ÓLÒGC**Ê)W7@ïÖÁlXÊùg9*«rX‡ôܸ5^v»=¤µ@ûUa ¾=+¤NŠÈB°ÉÎÖˆÜ9BÏÉä£'(Äó×G›f?i°ŒÊ~\¹m£%@ÂûL~Gþ²BˆÛ/ö}ÌåèÌR±(¿NÇž ס|þΆˆë{’1b¡-KL­–Og'ã 0»Nÿ÷S¹²'ÏÓðß¼sÄw %‹.CÑp`npÓZ¶:Йÿ•”$eýôYµEqXÀjÞvR32åó"ê=ÝáØC»Êö&t2ÕxJqš”c]ot ˜Î¡±`nÏJü·ÄôMXvÏW¢»wG>\y‹5VV¾²ÎòW ³m "QFÞdYû>8¹^r¢„ÅGtɨôý¾A%€VPÀ5¤ÄS -ÖŽ9Ÿ‘¨?Ú´1tözŽ•ÏfHê}ÃZõ…aíIóÒ³.€é£aEE@bE´6b2ðœÿŒÐØ•†þÑ΄9É'¥,ÊJs-¨—a´ã"³jMÅfÊÄɺˆ^>eÔhN]Z;³M9Í“˜L*ÿb¾í÷ìRx&F(ï»ù̉¹†ßæ‘âëÂi«<Ûaû½¢d¿ò ("¦¦÷ó¡/°?]ó™Y0ƒÐL|Øbµö<ͱ‘ü­‡ B±‹–øhWnCaZ@% JVˆ.€`Ej‚¼îºU‚Âxÿßü!“—\v"äI¯Ãr_øŽL%ûãä+ ~ó uG‡NæúÀœ›•gÜ%á𠪾Ňí\áÚŒt àjËõÓ¿F¬8wÀH›´wœÔb‰©!AwÈ\¬äü¡o–ú9EãL"ÍíÕ½ìyX|µþý‹”^èç¨ýIuÿÕìV#Ÿ¨ø¬¨«mbìÅòËÌ:…„f.çŽo·|!ÕŠj…ß±ˆIKˆj)„) <v-Û53›Ï܈þkßà¸@¶¸›{‹ä0áê8޳¢öyÊ]Ì!ÚöÅ ü†ËAú”ݺ©Ç G¯˜ÀøcñRg˜š v)qe«béo?š–¯é¨VâñM¨")@Å]4Ȥáþ¶_eÛUu1¤Y+Üi#U Ï_ñoB£ÿÕzÛ²b±¦Nç5 Æáûéˆvè *xrýõøKô¯&…¦XPv¸¨Uz­íÙ”T÷±»VÆÎ]æ'§Ýa¸wÛ"»ÞÕÅ~m®ËtjÀ7¤^«;¾¾ø±£vXrþŠRä}qôÆ›"qø¼y"VûCš8¡'{ÖxŸþTÆÓò0±'浄h¦7!Zœœ{"õJ×C¥óÝæï1 hÚyÿ'ZÄãsà\‘ý/H¾ôEœ||äûâ8Æ×|ç,£»÷hêæ¸ewD·Uv’|kì;å—àÆ;Ú7vÇ–ÛÏÛ/Þæ`­Ó‰†÷Òó/÷·§zF€¡¤ĵHP ˜Qò³n]†Äï¾C Áš‚fÉJ¶Õ¶e¾é[¿Oê˜ÐCBà0ïÛï!#“Â(ݨía×è°Fç²$o:JµÌt8lcíÉÝ1ÿåOHÁO’™ñ£ŒWŒC߈ jÐDÝ;‰ïtb,Ø2dyFû–»’Ü¡z6“bÛ36ä{ÒrU» ÔY^^\Æ”…žçêmB2 X7u ّƤïêõ¯eNÔ¡nn²9„ÞAlíEW ðœmƆóCZðÇøbש÷kzý#OŸåŠÊ©enI!ÑÁŽ£°rÚ1'¬ÄòÜÅS\Í…Ó…Æ‘`_qëxÈKe'd1M>2©ÅŒª”HÞØ'u¹Óg<™·ç˜þu‹´¨Æ,T]~Dsº‡¥ ‡Üß.ž—ÃÓFqOÏzÇÇô–(ï6–moiÿ†«ÎÜ ÍÑ™§ò æ,“;ÂLÃ%¥…Ð ‡º(TÞã4oXcêa ŽçE¬]ŠŸôçý¼q5˜¾eÙC“_Úúå¿é>Yú ¯ƒœ²‘GˈÍÝhe»û? cUÐê‚’oF[>¤`ÆÇ%2aùïjÍ/¾ŒÃ'ôB±á";–ÀfwÖö&—ü! Ö« „M¡úûY°¹Û+©?íÏ„Žœ!b½f̰߄‡Á!ֽǩ‘fñ.°è=tŽ™þPü5iîUK¯?j¾2þþEv!>!56ïålEü9¦@ULù«z}#0w+>­]CÚÝEBAîÀÓƒû,0ÛNw$›ÈÁ‰ÂªìYtX½j³UƵ›F mâø}B̃îYË SXDð1ç­I£ ÒL€Úe‰y0é÷.ÖE8ü?ãÖávBO²OÓ0‚9yiHÀ:h³KÌ=5Ã]×·Áí=Þпþl©RD2_öL–x~Ú±ŽFU£‘ §gŒàßéNÔ2œ%t bð#ó£‰óC@ï~¢r!ç¦eZ§Ñ¢í›8.ê‡8Àhp~b79§F—Ú}Ö5ªÌ/ƒ~æøp­1MöÀŽže@9ʾ¡Âg¯ý©OZ¿bõ-•×?«5‹v’N PŒÙ›1õPóPº8'§W„~uüÈ.L“Ë èë %ÅÝ]2.LÈïGùx!ˆK†I†Ãr‡HNq/‘5(È;ÍŠŠjÞ³ÁïJñ8‹oé‹ßúëdãóÖŽ_µ<_J%¾–6+'ëµµj®ä¶+„åGÑ_¹^vµöUºÓw^®8£XD7×£Úk)ýôBØ"²ý^ÑX×ä`©&ö@" n,ÔEl}Ôÿ-*ƒ¿\éDÑ8ð˜±n˜D |˜5:âK€Æí«M§g×Ðí`Õ…bòõLIì(\MÝé€uØk†½´GÞœWçÌ“kÐ`X´ióÆö[‰ö޲ÀQj„v=qGN—4ö®>»—nòVì¾½ÆÈ1Og¥¥Åùkž‘ %˜T9'hâÁõqºÚêöá¯ÆùåCß‹2Yn“¢¼ “ò‚VÅ9ŠÚ­D »X‰3O"-f…¤%Ù¤ˆ—wlxUn °å#,’‰†Óññãh µÑÇ?n^VýŠÿÙ Ðr µ™cxAÂ¥CµL½‡œŽ·³tL1­ji9NŒÏOh˜Mþg2ù5êç÷ÝÝ´úQ“A©‹r€šB’fQûR1!)[ŒCÃ¥”>0H‚ŽgÓŽ°MsÐìÖ„;êRDn†²íu.­VQ™¥PÓuËö¤r9L’¨?D–èQ1{Åý+ÛÅ^ñ,.²Sƒ!¾«¨ _\¸ò-0,~£)ž³*‡ñêc^Uue娕œd¯Çüpÿ1÷_ýøÇTÛô ÆRÝòyWÕk—aÑ;Ýw—GÉ$ùòœìãTâ¾\êTàémÇ›‹þªåjqÖí¦¥þîÀ6!Vd'×ZòTP/®¸ø¡vC‚3ÿuÃkOä¶>©ÍÖa<ÞX¤È1Yþ°@‘³‚MCª‘Ëä9­÷xÕ7Ûv]¬÷‹5”TùªÑ#%.ÞÄTs O›k˜=âB‰ü˜ï…ä ÷()CŒ ¾äþZqóíf:Ë5†sÏâ@rènVÏEÓ騪œâ9ËP%m8®âN(PŸ‡‡Àˆãáò•?—ö¿‰ÇØH‘ÚY ‹!¾okO0©¦ú¡-éPr(¼ªÕôÛ8};ç5–Öt³•6qòòû=·Ëـ諒hOt¯ßﺨ]U¡Þוګ%ž°+åØbóØìFÊ *¬ a0^Žbð¹ý´ÎiR‘æ“§VãUë¦Í«d¾Cüc†|!UŠƒFô4òCcºîÿΓ'HÏàÜU.˜‡Êyç<˜D°0;_àg€€Tgăê§ÛS/š»hkÍ–°Ô¦‰^¿ÊçE!Ô¥÷í>0ßš´ç[}¬Kf¨¥Š-÷¯[Ñ¢,ÌŸHÁaÜ’€*èÚi),Pò¬ÆâRP]Xê!hÃ2¹h”HCÜgˆºHýWß’8ú+ÕÞ)E:ªòÇ›FÏŠÎ;Z•|KÛ.íü,VReu›¿>LW.»17怀 *ÛÅ•C5ªF@–G ®>àav0³È&“s¸ñp` fÚr# ®­­8OÿTÔ¸Øäót•_oÅüzúëÆÛÜ¿•ijÞM¼Ïfÿ©ðµg*8[»<7ù¤Ä^bÖ⌧”š:qÈ9 =¹xŽá‚øã²„: +Qdà4r™§-ßh™¼rÍ…È?A•H”ÁÀ¨Ä[ãŸo—WnHº1h“G˜›¨‡Åd(7#à?Tþ"·hs¿bÎ, £ ØüÑ ô'¼aCƒàb@0ëf3¨°W“èOk.´›ïïH/¢£ürßßö¼á–’`ÉëÁ—Ôi·1èÂâh3.O˜:XKU0]Õ¼*ÔzS8d¥©íó‡úË?fº3ü®äq}†É¥Û)¥È* |pbBy³PìZ,!¤„šöˆ«}驼3ÙÒ¤ÜøK[z-m¼´œWU¼úEdž¶?6A赉¿¢ÆÇBJPÕ… Æ×F.åvåUär—õr¢£°«™­”•P0ºO×ëÜå…j:c›a¬Ã4EfË7ÃáË>r¹3|ÛêÎzÀW˜ž™éݸ-}Æ?»Z¤,ÎW¦Ÿº!oÌ þ¿'³´ð˜þßÇÁÂ眵@—¥x)ó9g$÷©ò'g¦ç²{\š¼eu¹òÆg©YGÖjÖÐø˜‚ \úMñoiå¹õ_ÅŠÀÅ¿è¾+ŒÏ „0’p1e?o„Ò"—×b¤1(„¥¡®p÷œZ- † äÏráÿ<Œuô+@÷Ý7(^áý²W(07Ûuù"oa—Dj†Lò¬Þxyl¶ËN)+”Õô;£P²¶ÜDâ»ËCÖùîh+:½CLA˜i#U¯i´ôé×øõQDÑ“¿"ïúG|Àîö‹&}¢%ÎNÀ »­kœª6T ½ÇËdrÐ7ÚEÈvŠ ¢´¥øpgÂ<Çõç]™kQb®@œ´íf+Ýj&€0н^3 6ÂxV+¨ÚLšFù·H¢m‚íÖÑ]ª\Ì8ç¡ÜÿÄ®eü«½ÚfRËûÈïÒöÙ¥nÏâ¹z"I˜†ÛæÝîÄo9hÝhA^èî¸UD;2‡¯Ä'€Â@aÔS™†µ4“$ŒŸÀ‚/ɈØ$ÍÓñH²$9þM3›õþì \“¹º£Y,îÅ ÁûÞ0ŸA†,oµoLI0íÕ29^ ÀÇQº°áA?¢7;Åd¨£Âp©>B‹¿jBR0ùÜs9|ÔI;:óÕJîŸÝ-ÿ¦2ó>n^>xzM}ëo¯½áU^ûtŒz?Š·Àk1ûÅX°ÆÓi ¤Ñá§pËþÓ¿çMäY $.‡å÷ºÛðÍ»ñå/z ŠÓ¬zûaãSàWäö^! ý¨0î R ÿ$Ѐ†ý]1½ ð#²zƒa™ÌØÜ‘i§—È&Ë;=cG÷{õÉëoÝ¿ù[Œkijú7*ÚtN¼òj‡—#€ñó´­zð—¸r«Û k§ŠÇ{]ÖÍ1eíæR•ø«/Ýì5'Ç{'ÿµ˜¸«ZîuAxmuå–VœÀÎÝV~AÊ®*q¹Eu+ÁZë žyá©3&Õ”j!‹kQ°Õ¢Võ>é8+CMÄëûº«Tm|H™Øcñ_g†Wð@®4î6ˆÿeŒ\þ¤Ä}^H¶øË%S¿Vèš´5RjE 2ØäKæ(y²í`·>¯•PÓÜ!ÎŒkÎâD8[§ ý$Í8\ 5<8kdº!RUR¶õš7¡Žïx›o«0ÓȱeJñÑÚ‰;ð7Õ$çddàülUM׋T+XµÎµ£.efÖj€»‰`H?ôrª ­£s Rîç¬i"ðÐó®:šÌð)ÞcôÅÀ|kiã/i,µ[íHº@7ág}.t)×ñn±6Ì6õßé `·>>¨c·i0©g ?»è…TóÓnwÓtôšhõqPaܽû³8 'J ¿8f¶Èˆ±gÅW'™óÏY‰Ìg_rshº2‚;áèœ>,]gU†>ñ5¥õ3 Ô¹¨!žuî ºD¬1èÔÁ™ÂhË”ô;ÙÊZB¶9!×[ÇÔ.ñmÆ0Aò+îöhÁ=È6f¢àMžg5²HCN|YgÆ£Oþê2)ãâÜ2ŠýäVL”¨ÈbéoG­öHŒ&OÏœñ±Øõ¿¯EÂò;ŠGÉìÙñ-slï-p®ió:<ÇŒ–fš§uG€y:•ÏÇ0ªB®!Z¥[bñ6§ÿ×Ò!‹1^ªÉ (>º;©š=`üe0¸ Èöë$ªê« E‡©˜@@ó<"T<œCø}§/*èÈË«6Œ‘iÌ}öü»,æYòf釜cónÈwÉá©\8EqÏÒ6(ZÈ@WÂò`­A ðã EÎ.É&žaÕAääªeí\LºùMS+¬jg°ã×ôà < }9ÝÄʩ͊™Cü;JàðÜ~½Å”°² Œ:/¹ ¿ªóê,¯gp­ËðLƒøSùy.z1x[å`ß µ–¸Ò6´®¼A›ùi2´0º|WÏ$’b,I)Ÿ0Åo‹’)õPøâ;$~SâøâÇ=Ê&§ßùv!çUùÒÈ#õìL.å \Õ×µX,¼b‰©ÿ9¼öak‚¢¥%—ÈBž*PÜêw  Úúµˆ;ŒÑ]·ž¥ Ä$=ò>fO*•4HWÑ—+ÚYônî+ý«÷Å÷ʬjüYyÆ¡»5€–è:zè(íµé–ÜýÄëy¾ÿd4”U–øFfý‚næ×tŒ˜õ½¤Ä<]Üigë5”ébãs߈}qœP»Å³»S6Ï÷UÂJ}™3á¼ÔÌoôÿ–œºËȲâ±ü,5­â?‚︛ƒà<··„Æäƒu ¯ñ%¨Ý¬‹nÊ&«ØJ‡fï×d÷kì1ÃËT;„£ZAµ–oDALÉ•(®ãªXƒz°#Zãl²«L«1¦Î(\´¼O%ìÛu²g½Ûæg`.RTÏ{˜`+3È‚dNt¬ƒ ™OiÉ胖i.N9*¹ ê±–ÓÇï|è^âSG*x­Ÿéàv¤¿|‚çy@UuŸMÁÀÔ¿º'fL£75†]ÏúÍåìwm05æŽ4ëqåwI êÉty4XŸDË “ZœþY·TiÅ%¤­^z\X5ƒÔ%¤ÔE|µ›Û'ãaQGyU؈åªðfÛ[/7lذ'6ÄÃÀ©³ª°R.<øö ŽÛÍ›X«rÊð·Ãíhp–êJ$cª^ ç¢Ñ2»OÔá„êýEë'·îTcÕXw#þYJó ¶Lb<ÔbºÔ!1L[Á¢àP,Ãî!ô´îØvñª¾¯„cö|ƒÖjÒÀs…ÿb‰Ù%—Ÿâ@§?)_G“ƒ‚ÂIg3²8vÁ»snÒ è‚|7(y:´dzù¶UH"7RÎ&;'SßlÒ£f­¨ Š‹·ª£|BFKË_Ö¢µKhßòHºn²SØÕC—I( L±·Í;• VOçµ@[(jÓ ³"ÚîF)c æ"˳ÞW}|ïjòò¬©ðôZ¿A·WìÄ Øi‘H<3>²xÕ yÝÚÎ5ÒzkUÓ¾ŒÊ9êÙùWcð½^z]¹-lþª°[—ÚŠÁT¬ýéLrœ©/ïIoÙ“ÁwøDNÿ¤Âs©Øã9<ô§Ê!Ö¯ÌåMH¾Ü¼§^ÝZK‹ ‘Þº,û€P$u;ÈŽ«@¹6åØ)8åB/ÈMEI~¶1 ÆûÈ=\ûɱ¡]áîÄ*ˆóïÞ5÷î·ƒÄÝÕ2>œú\ÆH¶b}²ªˆ^²„ (©)ü”4Ȱ€Ôà/ž’4Âöæô~º¿@´À¢‹@\´ÄO!qàE•oÙµÝËZ*/•7kÅZý‚ÉßúõŸ PÃ,‚SZ¿ß°äû$%¸‰–öÏ™ù'N¶ÑùNk̓ÌáÌ~ó*°Š»²qÍôMPÃB>>¢ãQZ1x¬^&aUûÿkÿ3ªE;ºíÕGUãÄlËíJŒ€»ºù›³¦VÄÃ÷›Bÿ’¾,K s=Ÿ;˜Ð°[«ÇIý^ühç'°Øï´±BB‘Ì.B ½| ûÇ%KÒG™S$ëyyª œMLÍY«—ìבjo²C6§ NaTŽ)‡ÐÖSZ:1ÙÒ}`ÊÒ‰6T—¦r(õIß3kµßE( mÓ¨T6Ø¢Ò DlåOés¨‘giÞì1ß¼ÃÀp¦¥!Þõ¬$Îõ£ýõ ´f=*+³;²Kp~fö„VA‚&Æ‹/¯5Waÿ'çsϲôÕ”sÔ±1wØÌrCbv×É ˆUÊñ¢3>ÜÑLÿŒÝ·¿“FqSUÇqpS^}}Ö¿\óthn˜»»—DB¨6hrÒ‹˜¬ObjzÈÏt¯ =ëÖ>†f¾‰] Û§WÄ•9ïÜhTFÉ…ý·Ë§›‡Û=®õZ¨ßF– êå®õq¬Ü„…~¼ˆ„D‰øÀý]@àéÞr[ÿ£)l ¹¢t6Þ__>¯`0„Ârv‘F¢û“BDB‘ŒwDˆ¶9r_€E5fסÁâ]gõ†aý=o½{X‹@ñ:|£É3 0²H>޽–(Û ë—ºKA¬>^Ëózðd;. iZ· €Å&Á®3ë1ûrïÀpKóñ–ó„ß¡˜€ÎÌ»rœÕ_ϱ@Qbh—´/j×.6¢ÙçPIJ?>^ìÖ°Ï3»}B!ô:ÍUÚöî¯Ï1³ææ9{¿×_ ýûQÓ‹Œlñ$!e0 ü”w ”<£ñz§À¤V!bî(fò®¾ÄûÔ¼û…G×ÈL,•&z)ÜéÛXDhýpÒ½˜& /‚»MÒ¨¢mÜEE/#hµéb´z¶”¾Mò-†Þ# ªn¾ýœüO|¯2Ъ•ªr‡£J²ÂØúZ¨^Õ oëZjÛ6æaHç˜ľƒÙ5ï÷¤'™^Þ—½{©¯Ã†ˆWü —ÏÅ«¤/_Ö©†;‰‘¨¤ ½ª¤á´ÊÔJ7H\÷Ä•’ì„@`¾67ºmuG}ÏÀ1R‰`nÄùŠ]ð»•T)Òô”N”½¹î úi ؽ_’t;’‰-ê¸!î4Á^VÕËs7rn]Ím}¥#Éñ0ó1ÿ ˜‘Àâï÷d­YZ~ŽŒœmM[Pp¹O@£;Tî­ÃH €EþûP²IÄ–¬VNØ¥Ã~*÷‚ 8¥Ñ“Ò$3‘DÂİ ®‡µØá3Ô ñ;]gÎiöíÛÀÍþ²- §Šçy{ÒÖã]^Ýk6öU®ò Ø{b‘ü ý⸓ÖmͲS®¤ö:M=a‚ðꇡº¡Ü›ß®ö2ì:’ÆŒà‡Àm9êÿ’ÅÕU âOk¢(Éýå w‹EõØP±ËÓ‰FÞ‡vÝʺ¶KѨv±m…ÃÂqe×¶u “X­U5¯|_|•yl±~–h¦€ï<…õñqÂacÖ?m¤óúôù¢Ì)ò;8-u7×÷­`õ¹W—Ö´*ÅAPZ@©N…K+s·@À®#}c‰ã¯Iü°1ý“µeTPØ^ì$—R/™?H^ vK*±*ˆÙtÕš]:°Áq[ƒø Ïʺ™l·®y¾ÎÜzè˜ l•!î.ÓöC³Æ[ÜêŸ^jð$ï·>]ŽLrÚdƒxÍ">ŽBÿ;£}]Á¦× Ai< /X»Ë|®¶öí…¯hÜþâNeæ9Ó¦ZèI2ø^6t*âé%É\:‚ý~î•kR¾Uâ Í°BbÇêyá0íÓQû²iÝmvß<<Ƕõ7×­ò¿Áts-†ÅÉáÆ 4bÁ#è ý¦¼ñ½†¢ÈgµâCJÚ§ò´ªb’È…j°s6•Ok@ÕAXâ]Ôm¢hRQ9»÷÷ÿì¯]ûã%¹örw.+ó¶RËÓUÕÅÖFUÈþ à%ð„>ˆ :UÓPÚ1ª×›àÑýfr)ñ •‚}ryªoÞ/>ŠŠ€Ÿ.;>° í+ÍD"œ©š›Ý)Vj þhòpÿÅÁ ‰’u1Î$”Øj« iì†WŒëé§Ná·8^F{t£î½Í­¶¢¾n²ù÷£ÜŽuýÜÆÇ5· ®¡"óÓ3{.æXu²ß„“Ÿ.é÷„ÿ™¢L TL"²Ââ)— ¶mÔÚMOÅS`£1y{¸º_Œ7iÓ7 ÞF‚°H‰´î¡tÛâÞ×ô=òîû{  Cõ³“Q@½"Uý×NÇ90¨#¿J9}M=W¡LH„ùÍŸY±]óªÛÇ”)S'Ðך~÷ó±Hçp^%è~‹žÇC£ÍÛpn™Ñ»ð>æ[|QÂåÈûdƒEá:q (”ÐÕá…èŒ}´«‰Š8wŸr¿ë8ÝéoŸd§úî íe¨tP±c„Ä; ¾@h>ª†“¯FªCÎ*_DÄsÃ1ØÇ{Œt”¨õÞ¥–bü*0”'ñ.˜¨V©BiØMR!6@ü9fõ´%3б£åhÑ÷‘}ì:éxŒÌþ çѵ=úúêß—a¥6Gkm¶†ÓpÍ¿|‚€ã·8<—†ÄAaÿ˜6® }¢z—w"í~©Ÿ×üùi/’ŸÞÎU©û® c™ÎJÉr6pWž†§wFÿøÉ7oÇs9‹Æ9¥Ï>X<ÿ€ŒÊåÿqü¼ mŠ-¶c2ÀN„CÿÆU2íZL/Ñ^“Bl¿bÓeU—Á øÅÝB–ŸïD†Í¢7¾.2}ùje²L°,—Æø§Êµ3Ù)¬šP/„\Öò†C‰µ§"P džGå"öŒ{÷¶Æ!c¦Ý*Û¯1öÔ¯u¡ö™¼ôÏ›”äeìöph]“ð~å&Ë ‡-ÎÏn}]3ÍÓû6K´CßÇ@P‰ ¸þã„Õ9Z½IÁ@Ù ”Þ K±=ÜÏ3‘áK¸Eûj÷ü× ßqZáäªVYÿ™N: ‚  œSBä„­¶¶¤%wDÊø@A]1âœ~c…K ˜†?‚aÄŠ*´Ó^n:Ù2‹¹cùçŽDQJ§‘²RÊ%ÊÓóŽ",& ÿR‘?n}kó0T[¸„JmB gÛËÐYù^|µ¢få‹£xîv*˜ŒSŨC=þú8 ,‚¢‹{„„:¸· GåH#M8ìWvkKæ¶kSÓHQ@=I†Íø¡4ë^< Që1¯k} ~5{Ãñ1 F8ïötŽ›˜J9ŠÝ5wÈvêl=9oæù‡2ˆŒ÷Êò(û'е/8ásÿ0ISþ­cn2«—x;¤õFWðAÙZv‘XMøCµ^ZBcȹúÎdTŒÂ,©Z³C\l—Ô˜ôñÆo—ºaÚòÙª¦øçñµÈOäýHÌ9w~%Æ'b :W,§šŸyy´“ö¨‚Cj=Ysú TL”±×þ‰ôh;ç¼ýÃÂOl£ª(âz©­þªŠ€Ãþm¤C!Ùf¶ˆó$vâCe)1nAjRJŒƒÆ`BÔƒ'D#;Åüq¯ßϳÇùYc¹fØ–g¼î¬oßùÕÑ æV‡^—_¦É±\DqÑ÷õP '49Á1|.y]ŠrÆA«vz«ÜG„ ° ›lñÅ2÷ŸGyÞˆÄß ëňŽÄv£Ã£Ú_íϫ͖®ÓÌ(Dù0¦²!ðü>*kàüë“æ²³àºiô—o™Ýò¤²lyHNÇêÌÌæÏhâæ½¤L·ç¯öÈ#æ*È… !ˆ0…0Èi¾îÀÖ¦œn^NLƒ1‘œi6-Ö¸Y™…çZ`úÅBç ¼ènSRê¨ÄëHÃ`òaš€Ü´Ó§Ç•·ÒÑ‚az¸ðóî+¬#RÓfú›e³šVþd¬õõÁQò!Ž!?æc„Á˜>Âxö+$!¿œcüÕˆ¶±þoµˆÚy¡²õ¶1Öº‹rˆÁ·qýÖ ´bÏ£¶ñp³ˆ£öë>iêY@—DÐÔ{W}$¶¨Tð0©xoa°îÒ[ãÇ É âØ«ªHhм8NAi•0éa´d§ç-aXÚ+üíóŠöa :µÇÉ[@µã#ù(Œý¾çŸÌÿíÛNGƒÒGÒž•À‰íЬ-=´Ú«7Tw½‚Š ²ÌÕ¦X¢N\2LBòAµø_Löy¯ticyŸÈ±T5#$;¨ô,¤¯DJ¾þŸ)Ö’î઼& ÉôJX³ÂK-2JNˆyq„¯Ë¸||ôLþ}ìQpùYjÿ¤-+ìÙ±º†òÛY¼\~šÑUíávˆØé†m°#ª 7+¯Â ¿°1µ}‘²ÉA–¸£‡N¬Ë4‹­o4}¢ GNªQ2t§eÐ#•f]1wTrBÀO`޲BxI¨÷ž6IÕáÜ”ç’aÑ¿q‰4èߎJ¶‡ µþ/cÙBÚ‚!†„Ô=ödŒjEqõ#›XIˆ…À±: gëbûéØóŒòQµ¦¹¤Ñ2QÆÏÃVƵüÊDT–ж,ÏEÏJølY„0Ƭ°?£$çžÔÔn ê„+Ò›)q¦ÃQ+â0â¡1‹JŽa›...ày=¿u °ˆXõå0€¹ ë"ô%>ÔT4•ÓÆ¤´„B6¼ûÒ¾G¨ñ Ä=ÓMÑÉ ×5&Ȃߢ`@-è’¹U #v‘(›DÅ‘}=L¦íÉ¥öÉKìÿ(à» 1»Íqª!ü3¶“3ñQ&óXë%jÌ™ÉJT•ÄÛºS”þJ»q§0gßï —)|F­ÅˆáÛÁ•J@4ã?øB¸å‚T: ˆDáe4HÕŠ6RçO˜HoåÒÁ§§;‡‹µ‚€† }­Ý”Á>ªùÇMr!•Ëc¸‹bÕsÀSÛ•õÛÊ“ía#¬ÂžÃÚ¥}XEi¼•r:©ÇÇ0 ‚όёPTsÆ’Ïÿ*ô¿É`BãEF¯odW±‚Æ/>Ø­ŠË ‘P¾‘ˆˆÿÃßëò 4=5²è <-ßÔ­eW/¹V+Ÿ¶•Zçš·sp§z-š›!#py‡1|IçH†{Äg3xûR_ï.ÖGZ¤s&zW„AëXlq3û\JŠŠ(¦Ê¹­à3z­¬Úè8œ§Uit“ïwºŠ²Cw,Hùgðq}ì…Mpw]îÀÆáç¥óX@a}ÚùÚ„4¯ó‡—Ù¹ë ~“Ö’[ ¡‘‡ðBÌ€ù ŒFÒŽûÆ«>¯øäòFB÷˜žMœ£5YjËàgaývIU¾ñr‘íÇòsöh©›~ÓÅ>¦pŸ¸ôRä§\*C µúSו'3òëBk"õý|Sk]Ú–Ý®žtÑÕÓ©ä¦Hc38½/àU–½Wßñ_­?;LWÌ=7ÇL¿Œkôó9W‡Íi4õ¸´„’èlKl™“-9iÓ4€ú²av+ív?ª‹èÌ­Â`+š¾ÁM”T97.u‡Nöíäèêµ,Ùã¬æaŒåg[ÃÉ„Bö’#Á] úÈ]gîbü1òбÃe𫛉û÷Z» F5²übb 2½ZùØ®n–¡R¸éo¹vUA,tËcxè²ß ÿ>¬ì]Î'Þ—|ë¯ñ¸ÙùÓ·Y½$$–HVçZÙ†a i˜ö6‡7$–7ÙäRÐÁ¡ÿ™Ømœ>[/6¨ª©K[W!ÿH=yFÿöïr ¯&•¹9ówìL×Ê"*kƒrdÈ~…Áë÷˜ú±Ë˜ˆÞr[S@«8@uj×,âR¡ X`¡—ü*ÚíìCfŸL Â-¬L—bÃ*„ÝÔª4„Ø…å·ÝìMèvãVísøôV<³¼EVé18õióâž›vwć—Ó Ø©i~c§Ãm1ó€‡ÙHÒuž–Ž}¶8×À]Æÿ´z5O ýG $$—¥ç…¦_ ¿wºÎ®$ Ïù5è®â_MSòÙ^ˆˆã¾…HW_kÿ‹Ì)p¡§-¬ëÿYIךw1„©fûG¼ÙHleÂïwÝV ˜…)ƒçAz˸öS{KÛþ†Û~¸cUâ|ÖN¦¯e:ç¾µ[Ú`Úk,8íDö++ ³ï»0øµXƒùÖòˆ¥ØßžÑK6ƒæå7G¡:usY•g r­r´7ÿY¼21 @÷ÇÅ©íã² žðGnšÄy+×|Îêa~[‰…ì÷nÕ‹‰ªÚz=ÞS7˜ôó“? èøÛIry.GÀý½ÿƒk[øpbBIaÚBIM€’\2BIwi %øRKHI-ñ!$¿ü]ÉáB@DËW,pammtools/data/staph.rda0000644000176200001440000000372214222504522015007 0ustar liggesusersBZh91AY&SYòå[7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø@P@@@@@ à óuJ \Zk±Ð€t’PšRb=&ji´CÊh ¡6DÈÓÒ=4'©¦È ¡§©êzž“A ÐMÿõJªT@?T=@ hú 2  dÁ 0¦Ð110„i‰„0!£щ‚0˜0ÓõI(Ój“Ú Pz h  dÁ 0¦Ð110„i‰„0!£щ‚0˜0‘Òj‡§¨ÈÓ%¦Æ”ýSÑ ©ê<“Òzž¦ƒ@ÈÔQ„4Ð1ø=3Õôúõêtï« mzvqËþ‹'Wµ^תuz³%šÆÞ¥å›’òÖʈ]¹ ˘nœþ.@c ˜è˜TÀÊyC0-‘c,ȶ\¢ÅˆPÈV#°ÈZ7c‹p³ e÷0Ž’dE³n2yÐð›t­A p§væR²¥òŒ#(\SDƨ:0ªeBkQŠã4Ð}*0ÔS ŠK×Ë=Œôf˜Ñz糡USmR‚¤¤f.®êI[»¼ Tä2»Êe‰–1ˆL0+ 1)º)B¤·PHBi%Qü;ýøâ±.N¡„\‰‹¢ô¾.‡‰F(á €«% C£åi€2‹›…ˆ}Óoã6æl>ÁË>ùcCÁ2Ñ´ÏÖÀWl쟬™ceFcñJ¨NæÚЋlÐÙÑ¥](”-ÀIqïøyõ9Í_aXòÛ팣=U 4g7XD,í6„W¡çý}Ü?ó›#òL€lG»†u]nÁv¤eâkׯ—e_©$¥Ó0*Ûp´°–ÛàqÌ@¹€néÏRËúX!„_ã¾2&†>1 lS͇5A’>7€œ¥øC(1ŠZËDÂz ³å@͆›9g‹$ÐZ!ž±×ŽÚK,ò/(i‡˜'£LóèCÑIziú–˜T hÔTýz³‹Fö«ír÷šÇÁ|~GÌÖ5Ï }O²ûþ?'é~Õ+4mw•+Þ@  FN#ùñÀÙ÷ž¾/ùHI/Iˆ#ÒhC9©¢Ë,²Ë*²ÎpR”¥)JR»¼Î}.ÞÍ6ö«±ËH`¦Û!$ÐÁ°@$D`FC$”Ô„ H`H H¬`þùt%Ž&f’L KR! v û“¤vÎèÌëƒs K0b`˜˜ ¡‰ Ç=¥›MC™ž÷Nêðu×]víÛ¶Ìæ´Ö™«„b’I +†ø‰ ‰ ‰ 6Ûm·°6+vlÙ³fÍštéÜÕªMSV4hÕ«V­ZµiÓ§g{Þ÷½ì÷&PŒRI$g2fQŒRI$g2rŒb’I 9“šeÁ$’@™Ì™”ó¤’Ig2SÎ’I$ œÕ3Tæ{3Ùìæ{™íQQ(ŠÇÇ•Wªò•—¡r{Æ“Y®“m•*¾¦‡ú“) ö­Bîâ)Š­)š«†Q+(š×pß1Œ7B@¤EahMVB¢ Ý¿ä’Õ[) B …R´*ê) TEDMÏÑøblDÍVA*+urÈ"!B„R˜»–’X•7IYª¼#⟦8B‚œuO‡½ÉÇ|>e\ïk%kZÓ*Ç«Š¶ª¥Iœ©SƒÚµí-Á/%àÆ1õ­’ÅFÓo,°"б‡ÊÇ Îâ±CYmuŒ,ZÖ¶+,¬ˆ ,cc!…¯-,² –-x^‹1*ñrðÛª HïD¨A€Ô‚€ÄÀcRda,íA*ccNZ*R Àh—."°’®î¬IK ""%"R%a.A ŠÂK¬.ITD%HDT(©‰$…T@¤…BB¡(›¹[4˜ÑÃF0c0`À`1ƒLbîx)¸¨cÑÜ1ŒCL`Á¬þíIƒ‰ `ÆærÏãqošuÞáãÍZ‚c†Xæï–SC1ƒ8Y|>9cb‹ €vt‚¯“»Ò°+DÂpѯV¯Ü~X³îxt"¸½ÕLI¦!‡zg?> ‡-`"‘¯f‹&s øÓ€)·~=X¦uÁÑ…Øjá{Ù+ €_saEŽÏó»te¡½i¶é¦‘›=r¥Ð¥Kb8’By‹IšpËqŒ£,Æ7ÔŒËr¼Î<XßÓë?­«s“wÚx•³.~•5L­s WÏ^—Ó|äi#ؾ¨r§Y>¤NX™´èœÂØá½¨UªÚ`†Ä7åç4¢‡À=aÊ4%Í6[›®Ødî3\úì–¾Åò™d u1‹F¥x±FÜhåtg¶™ìº÷*µi›ÕkÖU3Ç­Y‘þ$ |Zü&sþ.äŠp¡!äʶpammtools/data/patient.rda0000644000176200001440000007403414222504522015340 0ustar liggesusersBZh91AY&SY‘ûŽ{·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàn¬¶…À€>ÀR”@©Uóà’J• À ¡AB‚ð>‚{ –ÚmZÐ0 ¥kjlÔ“VÚ¯xš¥;çW#ìÅ$H€¬ø3GÃ@6½*[fÐ 5l4W‡Øôé  j[Í êØ—<{àðô@>€:.ÃG|§¾/@|™  i$‚` ¦FM ˜˜AˆÓLF†##@4hÐÈM¡ §‰ & OMÐh&Bz ‘ šPÄf§ŠmC £ÔhЧ  І @B=F‰<ÒdÀG©4ýF‘êš1OSÐÄj3G©š†£õM£(ôŒ©ˆ’x€€z™£M dôCÉ£†Œ¦#¨%?R”’TÚ“Ô ÐzF€4’E4dÑ10Ä#)æ“ šØÐž&©ùGbhz‰âjxh›Ié©?I驊x˜L§‚cSLSÓSOhŒ š˜šž›PÂba &ÔÉJ „ÐM&S 4e1©€R~'©OÓ1O)°¦ÄÑ´š§á0F‰µFL“ÉÉ6§¢m5=ŒdF#ÓTôôуIè˜Ñ©´S4ÀLÊm12LÔÔ÷P@*c€ÅìuÔ癘ã¢ZÏãi%£ðïyhûÙ}Õqª#S¬®ñ5õêKgË7êœø§ïß?\³½¸=·kÏÖóÞ¾£çOäðgØzÁôÛPÔw¶Ï>×ݽØÿËÝááÆl«W¡jÐ5ëçÃV©7O3v÷þßo†’-aâÙø›ù Slù°-©8ç#1.zLö²7,5û Ä$ñ8¼T¸CÆü¯°/%Pƒ˜ÄNWаzïD>¼Cö åç ®ðzõÓKÎi?EHUôóëhólÊ®9£O>Ý‹\Cš·t5¿Õô ¹ËŸÕ|ÎSë9Ç ´mןˆçÅaIŠ+غ`Áìh.0îIeQÑ‹xRl ÁX£¦º¡ 5ÎI%-(±‡™r¨É{Þ½™«Dð7m)•E¥¥‹R‘‰Á›”UL׸66…jS7ÙP}D½t¶‘Btš!Óa·Am×0¼µÂ×4åeq ˜Òæ]`u–’*DDy¬»r)Šm¦V$ýºý¸‚¹QäiÀ[òÌ·g-OÔ¸Z/o‚ºøìug+›Ä¸¿¤ÈØZÖü£kXöªîüà+.:ŽæÙlל•ln+&ÓnŽË-›mGÙµ…“hì»;Në¶KZ²Î죲ìªÈ³2Œ›qq\Q“5Ûk¬è+.))s€qQ:qvÛmGYÛk».2ŠŠü2÷³m:²îtf’N€"œ)ÐHYÅ6ŽË¶Õ¶3³¶Ý6¹µÁ'uŸwìo§Ç¾^ú²tvD™¤¶Å99Ê(Nì­ÉÜœY‰K&·`ÕŽBˆçftI 9ÔäÚÑ!Î ¤îI ‘||yùc¿õôÞùôµˆí·Q™µ‰;Œ¬¨ëÛY¶³¬è¦Ík@Ê.6Ò[n›_>¾{ð·Õö÷Ö¾ÞùÝï·¾ç_gQ_äˆÚ,JÛt$¬Ûí½îÖ‚I`$'vvƒéβ°ˆ ’NSŠ::)¶í¶\ùöß>‘"q¶’\œ8’pç 9ÇŽ'C¤”Å@]%.H¶ÉG8‰ Ž %ˆâá èœ8©o§ÏgÈïšÞšÃm•¾k{[ÞöÙ­ï¹öó篯_>ß5š³N£M±p™im·mlK«LLc}4¢â‹É»A¬Ž:'N’,Ó”¹8f¹,죂âmivÚ/£çϳ}¾túï¯oŸ_^ü?×ÇØ"RªâT;$cÞnüw§>¿îî®÷Ý{kq‘Ù”¶ìkZpœäîÛ›L³“œI I*'lÄ–èNç$’C¢ƒ 9)çßì(I ) }ï¾Þõn[ðwàûçWÍ»Ž''Ý®Ç"è¹*AÅ–á8€£‚ D’Ûu@páÎ Û³((K‡‚¡}Þ¯_on{ ã&Û}½i÷;>·¯}½öù>½¶ß_[¾ÏN_-Žs4sl¨rCŽ#k8‘ÎIÇ'8Sn´ãŽ Ú„\•)Ê#ˆ’'D”œDwÙÚr\—$AÊúÞ{¾o¯·ÏiçÇÂq%ÜBr!GQÐIÈîpNQHs’w%Ç_‰$— 9S(G|Ø$t9â‡N×·‡ 8“œî"NㄸäJã‘8î”§ éã¹Äºîë¾mg};ìûõ½ö÷ÛZ²í6Ý}½¯§¾íß>}kÅ™õ´skïõ«éöÞù÷}zLøû¾ï¯+}{yðÚ#M°pÛ³ëç¼GÎÓ/§Ï¯®÷Öç5»0{'P½;©[­2K•€\¢;¤º*²âòŽ]P9-.’êèÏ1BJTbº»;Še*è„´V….TªR"«]™± Ý®ÁÉ Ž^áÙËa"„PY–,Ý"&$&„’™ÙðCcLiŒnl9¶Zk`eshѬvÖ*ÐÆ›¨²Úk³;[yö÷ÏYi ®Î8Éóxu=©³œKk"K[N§!}=çËyÎ=J;vùïtkëï{çÖMgg-7š8ôÝõ³ÌÞúkíõ¾/zú‡¶“3¥maDccŽã fgq%‰6·Fc”s¶ÙÙ›µ6´¶âÚ]Ww×â^ßg×Ýö´úøm(àÌÈê®Ïe™XXWbf•Ùà£+¯ í »—†eOsbsH°ÂbÀ+böXX@*ˆØ«ª”PCº>$*†3.¨ˆ>m¼;ãvÂÖ˜C…‰k¡ÁKQÝP°1 B¢h.î4Kse$*` BrÆ•)ua¡™Õa@R#±DH/2¢f] L¡hh0޳"i(¸@ä*ЕT¢¡:J)gHE¦I !T²¢©E˜B3HE¤Ui6T@І„0RCÂAiD.Ÿ5ØÕÛUp&é82ã‰xL`¨EI† ð›4KyA4­Hð†„w,ÎÚ U•ʲÂ1u]B$•JKØÂ+*URA&eY‘c*$ÊР› 6…Ú 2<2µ”eÁ¦]UXC™XY€ˆ)Ñ)bþ·µ£75kðñ[› h ªšôΙ{$´ØåßÖ¿[£ÃÏáó”ÊÛÀàÓ«1uÒÌKd5@FÖ…0à+$!鮳¡„-.Ì­ ;ª…",á eD™–0à’’^b dBˆŒC2•i˜‡xD,Т2B*¤`!Ã=&"4 H i—Jê{ .aRADk(f”K-,‚Ä–(ˆŠÊ¬ ¬Xʪ(2ò×* 3…%ˆÑ yr²‰ )lÅ™Í#3Ê•2¯f¥w¥aဨeR¤•0ÁK©@ÅÙZCÇ ” AWª¨!iX“$B"D¨yu)K*Óe2#08 pT*íQ’©”C•h@Šnâ±>…ÔÙ»[›ËrÔÛB‡>K©4³Äd€jDGIÐ,,Š"!Â<*»"ÈæKЉC5 Ã\TÁj¢Â‘X­ó%Q\ª"!”H‡PêB¹ fbþF\±„É@‚öbŸ Æ}ã§“‹Ví}K–þŽ÷޶~¶Œüi5Ó«œŒ5Ç"üòkZ7èÔ˜ŠÅ¶qëŒáû'ÀÏÕak[8\Ä„$àCÊ F Ù2– x@ì8’Î¾Û ›G`8¼òM#eBYGJÛøªË3sm»^ÒÏš‚e³s¼nÕÕëxÓyÌúdhäÐkf83…¡—“åD41¦ƒž¢v—Š9#I9áU××uéž2A¯†[pÛ¥Û¥Ó,Âø'ð[Ÿ¯—‹¥9xG"ö·ç]ýìÖÑ«Fý<†â¾·ß×Ã;mŠçÚuÔæ¬Þ^z97sîøÎMºúñª´ÿ;áeÁ£G•G©‡„É”H­DËdƒ8å“TÓÑ5¥SxBêG¢”8’^d•Qm:9ukñÚ¸—ÇiM¹öðÖ¹N.gn­wî:²pá5¹{Y¼kwÆÒSâñÙ¡ôfm]lÚ¸£Fs¬6l¶Nm•ƈo:Ç’Û·ƒo tFŽ ê’+ ¹QaCR ävVÆ¢UØ BKà[ÓÉŠªØïêéçáíï¾uösï¤ñóñë³må…l¹8uR¯\š9±¢9q5ð팰⡎ZjË@g®ÏWGo-\[wqמ7Þ<5Ò9øë8äåËG=¸¢xÇ-Ó>¸)Zû²Ç’&™sïì*yΜ5ïJZßÁ¦åç¢.c¬Ú&;'„zg¥TéGDU+ åx^ŠU¯ÀöÎÎ Viø âb¢7º¸‹f莄´–-vß>s)0”‘#Q¦„–`Õ”äg%d^‹½±F+ˆäß (¥ÄÓ€ïˆóçöž>8(I8˜hÜ LÚQhOC)E<¤GV;vÍ¡Y‘5œÔ]£”Q$—&¥PæíHÒ†câ§3ª V œ° 3 `JR  ‡:€z ; ðÜïÆºå0ƒ§¦ÿvÿ»q@Û(¤Ã’Ìøœ š^­EIMÒZA¨“šé–ÅÇÙN®õº¹ð~SŽbÏzÁôèìnŽÎž:á¯CæûšÃ_7ÒI¥GeW)ÔNzUJ‚ÑÆå÷1Oªíý°|/–ÐÔ¢e[6 ®,ÛGßæçN\?_*^Ù{ô: ¸éàÇ ÚRýüwØm÷iovqx<_)šv=qUvé´pt`šw-qéËM#y®7ܺ|îUüÊþ«^§#/Ãé õpˆ%8T('©ÝŽÏr©$lºØî-«¥=¡ß¶ú÷êɆÙómß8ß>Ië«^ ÙoÛå“™Ò<©«ž`÷Ýò&#°åßOUÇ$@Ê ±9˜œEÀððàc2¬mÍTW@x:Õ/ÃDEüžŽÞÞY <§=}ýílÓ£ ¦5yÌ÷ë+l(‰îõ|•{Om”Üórgï" ®ë‘)ažñVVQ™Bé0‰Ó–…­OaŠ Y· R¢šQt,ÚÖIƒº{ÂÒ)°ù1”qn6H%ËQ0lF àõ¸ø8À ;(Ù#ž&ÚÆ°×Ø‚ÆAˆx[1PE8"bZ0Ñ\Ε2 "ÑP¦QÔU…stxÚ:þ+¿—ÞûEmÑâ \n@¼0ƒ4¯: årÖTˆÙ†Kb8 ¢^•(2¡ª#Ä:k¼›žø©K¡òÔOW_±òí´-±šÀ l3ä+.=,õóûWn{>js¸ë ~9 µ\¥—3hÀ§rË|”ˆè`Š0Ê,‹ÿ: æ9'10C0,™ àÑ{Îç¯M‹Ar°4L'÷–FMEä‚¡ tÂÏÃ|²P Ò˜N:¸U î—.² Ýçáb»Ç{WéëëÛQ÷®ßkµ+’FxçÇI‚¬÷Cªà¤[†B’w«ESKpâç9€ òMj´'Õ |35ÒÙPÜ GvÛGàr†PË2È«é$\ŠùçÏ|³cks9/œø™AÓlóùò ]õ•<äv Òy¬ˆ ŽãpK½Ôu'Î6ò¶I?䣫Byæzÿcr%Pä|Wƒ‚ uá”YR éTIC˜J¦§AÔš˜5„Ÿ¹Û콬ÿÿ'­G— m`/q°ØÖޏ“ê??BÆ'°8±æõ|;>3Õòëð€5–&{gg†”1v¾CAІXãiCqv÷ô=*šºíºmµÌ3U ìBÙÄÌÞMîšíZ²¾™‰rñÃÅ“F.PÚ‰^+'Dõ=¦©4°âë©®›ws¦Íwl9\Ö2¨rÝ/‡'#ºm 8ž~×=Õ]… Ñ{ªåÒN"ó§å¤ ¡_¯ßQŠää†|ýÜ¥³¤Ñ¿¿q N*69Ùô"ƒ4ÇàY÷OªÒ²ÖËWŸÀ=ϰ çËAôçØRsk¾6ûu–ÕS3I†o´=¬/TœöÏVGnÜ~ž-<<‘³&Ù³-Ç?9ãÂmd®šøîÓRÖŠË-‚Î2Œg;OB“»‹gÔcïÍ›~3|Ç©å«y×Ò/0´ðI‘ñòDvL¯Ô«è¦qªS’æø$)õ¢ÞÉÇ~®+ PV÷iī䓣0Ÿ¢.Áø“&²ÓV£`r/X6ˆå½áhÊÕĤ>SëA <ŽBñòáÖ¢—)Ñø¤~-•lï¦Óv|•uÚ´®qw×Õq&Uèo¡ªµQ×â"ýdá‰fŒçŽÉ¯Îô›M#u¡Á(Bxñ !•‹“«W)ü!íi)ÞËH:%Ùž2+™ 8867\*#vßs¬½s«³i{m«ÜÝÁ‡kk·ÈïD¶?ƒ7ê8–é/óß~>?Xè>²ñW¯nðw 5´ûd…íY·´è»På5Æ)G`Wƒ·[<{Eëˆïh…n»ä‰†^¯D®Öd•¸# ¢BAuØï£!¼]zçÁ¶Ø·Pe‰ÏZZ7·i¥“®*þz¹ÉŒÒãå‹À5 íâvÃ*ÐØ2$û†£m@ß½2¥Ï™<ï'JRË,7‡YÓ®UjóÁ`A“²Ð3åp´SMá/„íiJÃ3ëÆFø¤&0„"ÍÏé0¼,ú{Qânèvmèdêr@Íè, òãâJþ9…·²ðÅÔKñÏ@eB-–@Cj—$çߪ˥MÍ8m§i; 7´²0عN“¡­7}jŽó(î‹Uð[-zYŠ·¿ÙÕpîX[¨E̺áÑ8ªP”`~guˆL8‡ èûy?ƒ&—çF#£Ñ&.³üjëÕõõ•ô³z¡ÿ¥€ša"ž²0CZrÌ …“-zRûý­¬•±\˜k¶µÄ²bämʳ°´²TÁ¦v¦G¶‰˜Û‹JÌÌþ• mɪÕO»vó+K{°× §jpl;îÞœQ R?»‚ûôÿÚñ¾ ‚ÈXÜÁ?›€—ÔU näž«ZàÎØ¶ë„— E™ ìgKý™ö6¼tgu}zÎ  Ôý¨äòƒé ±ùJæóî>Z¶·!žW~d,}°¨«6Ú¶ ÜG°M±;›s‰.i¼¡LÇ|?‰‰`”DzÇK¸Å@Ƹ™Ér¹\ò¡ó2yƒ Ñ6¸Dº\’Éù¬&Î Ëfe§zŽWíéú#¬¶×Pñ>_ÝÇÍmì…–…¯pâZ\ï¼;¡Þ_#w΂ü¿Sqà©`èóã#ö6LFÑ«”® ä¾dn?'QøˆÐš˜pký>©ì¯kyûõR‰÷gOr z°üN«–e²¬„µñú¯‡òôvÛkTþÞS*ÛU5Uº@í‡ðev‹c<1Úù*© œÉ$%—aÎGl5Ë¦ìƒÆ†¹¨í¾ÆízÎw\͹˶rÛFô3NpbYooÅN®8>æí‡_ÛÞl^صŸ`²¯¼¾ØQGÎÒ£LÔ÷œôKœó—OŽ}uÑ5*í"RЍç-}ùžÊzà.žÌÚ>å:æ?³ÎE=¨Wp?êèç8]ÄuðŽèº„ÇßÕġʡvN-¾s—âº}VkgeÆW/ØrÍ/Ù‹ÛNÿóY¸—|éGîz¾°©$ ¥ÖêÀàôv¹yÁé6ßQ9ö¢âÑq–P:ÃyÁ Q*Îýαw8ìµ_çϯZ¢˜ßg¡_Xôk²o=îp]NÇ3ò ^Ìû\ X1®“†¸Gï2p‰¢þ½¨ClÈïž>¸³’æ· zÁ†„l¼mß8 \V*àþM}s wQˉå9yÁÚÚÛ»¨¶OD±÷<â-L»^ð/ý[{ý.ègÌj^:š^÷yjW{t~nr4jÞçå¢Õœwù–c¥Ä:Äbª`»¨àºò;„\3ûà¾DPâ.!þÑ«GDÅ€e„p 7½á·¯8 1YCl‹Sœk9w«Äsƒ£x-"¡ã<÷Q”fmx\ïö*ºçrI÷9v×qÙ0Í0_t‰S ÜŽ)s;ÂÊ5f( ]~E“0±ÀÉ-¼ ¾û€}†Ÿ ì½pVkåÈøžluqýc,óÎ< o³.r/-©èƒgYËöËÐÁ~KÛ½®Ö`q–»Ô¡Á„æâ€}ÃÔïÁ$’¾B—‰Þù;ü\Á¨bHrÛŒ”]~BaKø£Ûhé&¤ ‘ÚF <,-­³×€I~ m-Öëq} †ø $Ë_»+ÈcäH±û/n|wgùï;B¹ñ.² F; Ñëõà„•–€ò=¬/Ðò•ÅÙæ"+µß²Û €,˜½5שòÂ/ëóvŸ@²9ÙÍ›à—ÃwòK>‚ÆÈ}â±µÕZ­W(Dz¬‰IÓˆ¼yœÏ×>¿=<£NcM_ù÷i8›„d2Ô³½Ú™žëÕ §L@]ë²ò½¨Hï=¦‰žBC!Ý·Ï!ž³æÈvúªº[€08],÷Z€ùu¦ô¿΢y-V7¶ÒÊßîÊ¿8¼j´ç»8‹Vïá?–Ümâ<¼¦~R0}/FR'³]3 ÊŸ3©ðAcwŠR|b¥]³^ÉéZ„~¾Hê+Yàå(ÿKb€#­æôX¬íäâºÇȃ‹’bæ|9°?.r[¨ëÖ¿%¹àp’úZzYa [¼}j¤n=X£åáµå[RésxŸÑ)ê§ÿ¥ñÑÃ|÷×û+$[[KNnƒ–†sJpö¼[sèP«ÆÖ¼eü®\`ií‰8‡’ÿþô[l/Y^³euï†Úlu÷ÝÞâ_ÓèÌLnôLêIÏ©ÒSÏÎ{r¶)Küû7Útcã‘1‹+gÕàyøöÒ^fl×!?|îMÇ«›ø\"q¼^——óïzqËrøoi•jÛá½;MÅἇ­óUX„¦žFEW- ~E4Wç™ÌoݤÇsî({ä@Hß¹¿LÛÎ¥ cOéâOé É€“óç3ŽY­;KšNξ2ÅÍúND~–¤ñCa_oPýŠ·úÏïažÖŒ‡îÃêÚÍ­ŒDµúôýäú«/6³5´DO׿Þo7¼wÚÎ%9Ö÷ž ý7tï©Øsüèõð¹ÓÀC\¸šò·SÔ…×/©ÿS—õ²÷E i|–Þg1— ˜Åõ­­@Ò€¦ÿçd»Y#þ}o~¼§O3æíÀòõ+ë„_Ú“†Wרë½})ü—ýJ2¾%EÊ ½ÓqÁYý©§y»&—^Ž«ÿ—äÃoÓÜa›úhHYÿåÖ|”W"¾áòç†EÓŽx†_±õûŸÕèñ,&ì0ÚÝ”æA ?°á¶·=”0Ó~±Õ² 3Y”dè™Ãý“DŸs–>‡ k„tô:ÒQÓ7lÓ£º»ž 5::‚¾P‡‹WiêttÂô]"ýŠ”§íùØ ñǪ€-?Qõi9ëVÔ‰²ÎÎYÛ$]Ì—Ò;¤°°ˆemÜtÞ?C> "ÿ ÜÑò÷ºRv5ºÙR0E÷b‚b>¯±þ|6hFÃhxÒäët ãš»D€qйû<ŸOžBkX®Ü=BWÝÞÖêS˜Œ…µD×½Û7ŒµíJ;yé¤%4b˜ÿÿ°çËCÄìm<9­¯*F7úùzu¼vó†C•™x:…åwË]!&© $Kl¿ZëäÇã处@ CÁ^ÓeP€²sÑvm‘‡­<@&ï_Ó&¿´Ø#ÓãáQ·Ï}HÁež¦©‚Êó¼Þ« Î=BA›‡¯òåä¿YŧD¤:yuÅÊ>mR Nþçž/˜ ¿@øŸºÞÕùÜP‘ Vû{sä¿»\r –ÜàA'ùÍûõÒÀÎíÒHü-<÷tWeÙ­mPb††¯¬€ƒ^‡áëÇc°xì÷ùÐ¥!tØ ·‚Fiþ|ÖÇOøü0£øó÷~èl«7›Í¢Ï€HE²ÝSy>Ö~§Û—–Ò"!ºíÍ4l˜°íZæÿÙL²â@×™–þ߈¶æÑV_m þVWû†d_ÙÞ³w§‚hòQÁ%n\Þp"½iˆVµk7ÓÂ×:#!ÖœC4o/ãEý–i~Ë?¤ï <íϽƽŽWÙf„‹o™ÛÃJÚRðº) ã­°¢Z¬vD ‡èSì?àØFÖ9÷P‚‰1_L@¦-³"'êi˜§76¼#_…ƒ¶ b¢ÃR|šv]œ¤VË£JŒö?RB»Ïlô{4…³ÂtÖó ’1(Æ^ö³Á|_Ï[­“}39ÿg;úÀÕ~ºMT=XÀòy/!v¹¾îj^U­·ºì€×N‡'„€árd¾G˽¶uÓ}2Gqªõ­¦BViî»-èeLCWQ%%ê@ QAŸµµ@Zöå·m¹t}„`‡×,ÇÝuÆ!"*wúÿÃUã§Œ«ö¸;ö ª'ó–Ý& ¥ÅÇŽë„㣠T»kéàÞ1â[ˆªO»Ñé°ÓÌ}*‚åçc–Áí4Î+Iƒ\½)¨‚Ó„h«šœ5ßL‚Hœ'žXĔϋº›®™Þî S…ñ¨TíàP f«Wä…1 Ô—ÇåYä´SÄ"A²ÿºú´¿ÂPÐìl¯ôå$·&æœä]ä[p}¶-CÄíâ[àÁtÏÚs¢·ˆ·1ÇO˜³P/UJˆ`Ñöpgg ×Lvÿ¢ZƱ£m4]5†G%Òe¥Cfc$­« ù*ÿO1¼´¨ÀJ ÎΗ fƒÍ|—ô…û®ÏtÛ— kÌ@¬ÙÀµÎÚ‹øËb[¯‚ái HŒ¸@1¦“<+ÚhPÝñ˜¼ZÜ®y=”äÇèávþ…ôÒ È–>5ngr[êØ\/žÐ@€d†ê± éUýNOøwh â†V¬ãÞ¯Î_y¾ýÚŸoháÛw1¤¸ôz,.bﶪç|ëár1ô ÒýP©¤‰)‚08Ö•é‡cöæd¤iØ@/˜RKôÄ…™îðQ&†rãÉtÇí uäfN›6¨j_.ÒVÄ‚”(žjÀç·Vï6ž…ÎYžõâcŽagQ ³ÀÈÁW}¾ù”öD½vTÖ•—cÈÞTˆ>H³}ùå$‘B’ëÞtú‹Õ¶(¹ë»”ûTO¿K„¨?A²‹ ”Ò[…Ü%ä ˆF€@'-ÜÎæ5ã Šuú÷ÐÀ¾º ¨cÜ—ðÍ;rƒ0u‡¼c‹ U t5è\ŠbÄÑBD$ßF`¬ˆ‰8*(­î^»§fçƒJWÊ:m6ÒT—H?ÈmàZKGc*©H30$È=cWlåsm$¹Æ’WQ¤ÝiA¤ ±$x á0 +(•¤)5¤A€R²6˜¤s˜Ë„¦N‚Ob&´žÒƒQ°Q1~V’2íœÔæ  À˜ÀžÄ´’‘ˆ&´!§A)šÀ‘BSX&1J{M`’D­@S¥ÒÄ}ÚÚ¥‹òãMEÜGø½‡·—¿v7¾Ç3°¾ß ±Á0Ü’¬ª/[Pª^•´)–·’'Î9G‘}o ÍÂP~ü%U[ÿ÷P#Ù E\=,›+/`ªÎ‰W›“Y,:«€QóìþXÓO?ä’ÆzûO¹"R@=@pÞÃR‹2FbH½˜ˆˆ6ƒæ"ÄÉdççä"ÂaÚu8eC”¤ ÷‘wêsÁÏØd¸†Ú€\‘ñô]ë%›àDÿ£ KÒG¦¼x¸á%S1'@>«‹4:ØlräÍùЧF0ÎNÄÆD6»ëD¬±ägÀçÑóûÒoȇO/8S >¹/€0gp ì`Ùò~póïtˆWŠ/Ϙ×ø”o¾ZóÃ1`ˆ›í0/ç½eâ.t÷N¦E0¨~ÍvNã1t !Y:9Çа½,uôC$…u¤ÌO/'Wg“¹ÊbîÔ»ö³Ë‰O©º­æßÊ Ó{;~wæKh%Hذ^×Tb1û$„i«RŸÞ:;Ü«r#,|3n”)=í0ôèx‚@Æ0˜ýŠÉg‡»ãA èðú]Ùt‘R‰.Ÿ—¼T\r4|šb`éôÃW•æM‹4^nŒygžßÅ ——38xŽÊT(ÐYá:&FGÉ'Ìí#kkðN d›sîuòóVòéé ­ÀÌËÿx¤½ÚN6„Ø ¦€^4\¾†ÖŠçbÜ•xH+Ë/—¯ë+Ú‹wÔ¿pò—œ ŒñS8ôÐËëî÷8] Vj¢Bˆ©3[b4å >ø—ÓÅefï‰2+ðåBf}¤.L)ì4ž—ذü­Ö+íÀxi{u )}£Ÿ­‹w Qf!Rå²$m{÷ ¦É]³×³²Xn *@W…––âF ”¯ÆîþÏ—Àû}Yß,·3f3ߦ?æÒh9õÌÔøÃ›óæ žrÅÿJ°²$H&i?ã7øàp5¤ñM´= xÔ¼ÃQ3ýjÔ$8¨þiöF¤:ç(1Os‘ Äõ¤ImˆP $*°¦ç1÷èûeRfûçøb ¤˜•Äž˜ó&¯Åš‹GÛÏHÇTVix”{ÉC|Ïö|š Ô€âÚ½Œ¡ ×LA ‘t~Û€Áí<Îß‹Ÿ†¤…ðÑçœh]á³Õ"$u?–Ò5WÔ¿^IRF" …öSû¹c¾¾£¦˜µù¨!Ú³´ÜÂÿh&”æLIˆ @C¸ªÔzsŠ2Û¨Î& 3’» ”‰"Qk{¾ÖѼ«®Ú×=§—Æ)@@44Ÿ"·tÒxñ±G:× ½ÿèô †4{ÁA6´ËbøŠ³h¥ëxÈ 6å\†Ï4É ºb¦æ6×ýs}‡¬2+â¹û!‚ÆoêK1ÎlFxÁéºxÐM&-³ˆGT_ô†ëñôÄ  0fVɯÇõ™¨™ý„oM8¤íÑÀ¼¬ªûfõßï“íñ-2t‹ëŸ·Ô]j0Ö7C¯ÐOôÜŠ2ßgáÌ^ÿ †"APr>ÖÝŠºnvÑ;+Ó·€ª8Ïë5F!OÇhZú=!s"ö0dÎØž³@`1šË¤žJ”Ó :³`Ah¿àüž71i¥ì¬ÿ}þ8î~Dùγ4Êò¾¶«­ÚoS7˜ˆˆªSþzíä?¢ Tm8i¾|ú,ÄâÌ–¶ˆeàÒ‚ÅÚ ‚ª¨ïÍ¢Îèî–´”"ÃÍsüOÝaêͬ=)a ¶6']Ú¬“!š0AA.M‚¨Ò\±?q¿'&|°uUW~§w“ÎJÔË4?4ETÌÆVöÁBZ"º¡´lZA €›I±M£FdÉ€›¢£»mÕ”Ûª;¾ï¿üÏÁ}·ÚŽã³›uÍ®{çÍíò—ÞíïG|VB_yïn:K}ó^¾}÷½òÅž÷Ͻ÷¾}WØÚ¡6H¤’ ¶Û*i8Þo1²Ös”!Ó):´/É‹šGˆÊ}Wk ß`cªàªÚE\¼Æ/;æËÍÝ1—MÞÛÌûzË·ÐGzÍ¿¶ª…ûLª¯ÞwÕw½ï0îÕ{ÄRßnâ}GüVØ„M¡, ¸;°Ï"I"¦’ ¶Ûm”ÒI³ã„zØ.Ä\åy\ ¤D-`az¨‡¢}ïS36sc‰FÆÜ°–|²Í•2¦¡¾Xf¸ðU<*[Œyœ‰É(WÃ'¤ k êÊÀG!©¿\~‡óÇ‹õZQ‚o×ù_õ'__v» Ýëöû}åï(«L·–½Ù¥æ"/ó`!"Å!va“,K]@íW«Í-E¢Ñh¨‘™e¦›,²ÊP¡:lÙ³gM#ŠtÄHŒh‘§ƒ·½ñ ·¾týë²aÞØ_Pï…´™û8áZÚ¶mQå„Ëñ”N Ãë¿]ê(NBF•#Û}Ì ¾Ièž³+Ï-ç¬UÓ\n‚”,´Òd¦ÃœKá ï%+'[*fLn:´504 ¨[)j «Ð®dR<èt&&t¤ã{FÍ›3ã³·ÅÓüKÁ¹6F»«^<ïjë¦mœ:¹:㎆XS+R„(&šÏŽET!¸›T¬ƒ3¤ g–P‚vM]5ÁZpN›ºú0ÓÖÛ·_S¯¹×¿tÍÜÔ~çeuŰîÏ-UUÝÁ­¯±")Ó¦F£’(…C‹ìe#¦h8x($­ Cû`‘hVM@㉣Ѥ=ÓÄQ¡`˜Á¥D@a·—Ìpþ'§ö¿s§Óúþÿg´3x=‚¿×U~nñS¼™…“Ü…dˆkÔEL^""¶î·°øFÁüÚ{¯Ùà ¼pñìºØS¼a9U >Hì ˆ²Î©™‘dR¢"ìÐÌèŒÈ±wv{õ…I±*ÅyƒŠó]ŸeL“…»2Kf&óSnØ3O89§ÚC,Ã0\Óæ8†Ö$+…ùGÐõÅ„6„ôЪôÒ6l(Ц +ùèkïzߖ¶és±±ŠÆdWg,rÂ:i‘AÚ YhŠˆˆ¨ŠÜ×w{Π> ‹‰ð;¸ç”Íä,=æ »³!32SÍš""©‹ÌŃ»áSl*¦\ë•Â0™#ug6·Ÿ„Âþá°ö¤[ ïX‚‚JòUAxf†ÃzÑ•‡PGÆý//}þ¯ë{Ÿžívº1çë/iÕøßŠ ìT²']•ÒîðÐïW¨w{²ß‡ÖÚÖödXøfÜV¬Y”D°Ðªù=¨€ähi–ë§>ª˜G@0J¢^l$XBH¢àex?Ï#“×ÊÖˆi1ªX±‚ ÛëZ°ÒF1ôAÆÁ\˜ô6 èu¹øõ5g'Wn·EUpŽ9yí;zFˆ‡é–©Wk¼Þfjªf{¹ &ô·m~ð-¼SaaèÁÇN¬±ì‹DF­pÐ;i+Ow»»5ÙŒT»M37¾1°¾LgÂÞ˜`|µ°6·¦úDzÂ>ð4’óòÐTЭ:¤lEÒdU(Àl"„ERdÄ †-•麶ÖþN¶á Mü} «š^æºQf¡)î——»¼TUÚîïzeð´|á·ØØŽs⛟6m бÉÙVª}PîµOè»– ™™w€+[fV°Ì³úÃîˆ I ~‡kˆÊÚ 7$¨³b ÂÝ‚Z“1¤V05c ¡Y^œ>%U–mXé¾MòÀ:á$Y g¦üÝwýs“É΃¡U#„Ln ï/éÄ<ðç±—ÍñïžÝÞ¯7¶ÚÝ™ÌÉÇÇeën­´YgožóÛ‹(¦­O5•{Í{Û<­nÒË-²‹^Ýz÷½,ÜyÙ‘žÖ¯o|YòM5ðöùµ8õóÇ·½vÞôu–yÖ,±|o çm¾=ÛWÏ–/–ÇÅfWž61ËjÐfcgš#Û{Ø÷½¼3%™Õ¼í˼ï;¯VÚœwžµóÝä{ŒÞ]œœö²ÎÍlÎÜãžøß‡Dâö±HÍfè¥ížÛÞôöÛô7{æïgX­ÛEín—½éìžÓV½»;½»÷¯W¶‹Þµä§¶‹hµçž3wÖÅâoo{Íß×|÷¯›Æ½žöׇ¢öÍ{½žõ¸6óÇ›Ëo{;-{{Ùµa^ööÚ:Í=¯KÔO{ב!o{ÌìÚÖaÏl󧽃m3mß­ý{âù¹ë|vÛã.÷°ïmmZ¿hù¨¾m[—á~¯D¨  >ù]Jµ]„?QÁ'G:+"}J… ø„*âŠ>ÝOÛ|,îãñþÑ”øeÁ©OqþVR “¸îŠ$ä„eÎz¿ºdéT sЉÆÙ LPLf+ÙE0mÍÀ4·…ê^uþG®òu:!DL3~;«„rGgáÿÑlÐQÇqšÌ$æ*™øïÄ”B£Ó0VOÉœ}'´| ‘þÿcà;9õüyûiê“‹Æ‘·ëiqÅñ}_ºø¯`|\úŒ¾+þUV“t>wö¼®1>nçA +Ý®sßhßLËÞó,„ár{¯¡™Pˆ‘#kèß 1‡YÛt}¡±Ša,{gô猖Ãa5p¢>…,"êêÒÉàÀúæ€&²ÎÝ\Hn\¤’@ùߨ58­"]Àæ)]sn)žM\2`¬Ï«ë¹þ÷€ÿ묘uÑ,W²,™i>ŒÌ%qñDˆòãÚ¤›¬Ï¼óGþâÚá*ÌÈg-ˆ<[Sƒ{d¯5f! “sêåÑdt~¶—ÞÎ×ö•”iS †m˜§fñÅè½FC‘QÉÝñÿ’gi©‡Ý­òF5û™(ŠíTňT¤–N8Ãzøý=ØùŸ§lpÊßS¨`a‚È:ýе*M˜‡å5(Pc½}»rtdŒ,H)#ÏÆ,coK9‹²• L"òû F}& (ß~>½fïŠe…ƒ$8âʳÀ¾Ä!úÅý/xK/ìOðà´´cž×ÑíC©ò.ÕÂ_¿ŸNðÁ4º°P—oŒ»‘‹ÍNæ 8Kª…R`‡öÂý¢cîb«ù2¶ÉT*0Tb|×fPüYœf±¹U  !Ýäêb YsØ_ ¼*KÌÓT­Ê9ÍüÙÓ¾Œ$Àc œ¦_¸†QòO_Éæwï|;°ඥvõÁ¶†ÈöÙÉœ(jWÏF,*X01¿;~“ÊAŸ,£‚g%·“ÚŒô ëÏé•ðNÝŸl3Nò¹62Í0¸v½v²Æ2]°Y¾TŠ-ojµÑÑhƾrìaö¯ìÞkbTÀãÆ ¦w¿7Cñ|XTÃ`âÝ…>±‡òæ~iúw(ëžý‹b¾ÝºËq“=žUã˜ëo'ÛFIœëY¯À|`½—Ø[³‹ã‹ þ:÷Ÿ{•¬èà§Ö4 ÿ¶x-¦º©yŽ’’Q¶F>“¸Í"t ú³¥¥ænÞ~7Cg)ÈI™•N¶Ù#ÎËŸۣÓï±·t}dBU¡aüùã®8Ôˆ†|Üœ|/ÆSK1Ûù÷£<º¼a·§ÇÞäà×p1ß?J˜*Ép9¹( Üu“rúW ÚU#ýgïÌõÚÞ‘Àšaõ£éhtˆFº¼c?}YËÂË àË$e1Á8j¶Îx-; |4“œ3Ç”0 Œ­&ÊÂô•*þª3ö– "òÇ‹GŽçkô®ØX”‹ñœÎ¦m•'xÚ™:‡0Ë®«U¿øuió+ß ’TaK_3¾¨‘EóuhÄuôìVT5´P”HK£M²c0PÊŠê“r„‘&HvvA ¯¦³› ¹Ín“]4ÇæVrwŠ…ä¦2ñÇŠgÝšN½æfTÎyíR•=…¼~Ÿ íc‹}Õv0Jy\ßÚ`ZÑÇëþôiaÍ\Ä©…/k.ûøi iÌvÌqœ¿Ÿœ»ŠO/Gˆ®¦âò ¦f~…‚¾ÆæjQ#ñ;gíçÜÉ íþÑ]Úƒ”˜0An*²\ä^‡¶U[J¹D >S‘uu÷¤ºÎÃÄÇìvãM¢Í;§¨NAƒ"Låëù<¥³ßúòíìmÔ¢7­‘hÆ=£ÙÓé8± P‰“¤1›ãá!D¿+„…²ö"»(kTc¦·¯.Ž$Ý&”ɓډÛÖÇ8©DUÖFòûe±Š‚JÖ¸ºc.4¯mjЄ•ï×Ltýu ÒÞ¿»E]€øt3r-=+MêÂøp0³ó ±z/óì}ŸÏ¼íËßml¶mJÛÑó˜Ö‰ÿËvg®DÆ·ù|[Ñ"×êcfô)¯,=èÛˆ‡­Ë«Öcµã®ÝÙ[ªÕ?~×A ÄÙ²õ`ÖY{óq¨R¦F‰HqŽ£óAY0}eÿc›G)©ªÕjVšNH|5á»'…ú¥‘š¾4i7-«óÊ&m{Z%÷—»†ž2¿ŠBpcÖò”4‘‚œò*Ç-ùÕ"C%2Ës9¢Fï‰BÒ¥£m þ°ê—-TÂq¨Fq×íÊ=-2ï£.w2þÓÝXס‹ÆÍCäA‚¦i` °ÝŒw¡Ý•FqÚ¬]åïkÝ|HPO:¦+±›±ûz×=ØõÕ&²Û °Çý –Šîyú‰ÛÄÔ¦¹ØŒôßRï±b¸‘¿«ƼðWà8÷Ä]¨„ƒÄ¯eÁÕB¥¨7{]3"Ú¤B¢8ñ²t”çìL…—Ï-p'QI^ù‚M<‘IÝPÍæ_à$JK'tâÖQ#Fp‹yS&Êw#°}ÕªqRÖ2 Øû„©Ál@ùؾïû­_gv–çדp,WRY£Šý£¯ÿØ/âÊç"Í” Ý~ù½›ÅÇú‰Î·&ÎÑ€á|6Ñ´Ph›¿ƒüN3/;Ë/*ó¸ê8¹ëv^ÚöÆu¹iÇ•oóñßÅñ•ók;9;%;wg^yÝîööÝÞ/k4¡lq–^uy=ïZööÜW'^Û¼ÎO:ò¾¶¼êø-ëyç¶îˆ»¯N޼ëÊ,¼º‚*ÛuÍo.Îð¬¯"ð½°t”tö¬¢ŽŽ(¤ì£"ËÞ·XTWxu•æQÝÙvÛ©·iVwžö¼ò8ëʾ0󤣺;ã¬î(胋Œ»::ðÓ‹ƒ¦ÙG\YwYYÑíºñïzŠ;£ªöÝ—eYQ\gwçyÔ¶îÎâ„mÁÝ—tVÛ»6ÒwtwqTgu—EfWe•wÇÇÅ_ÙÎwpU˜hƒDlHmÚPiìÑßçüóÿŽðeü›tŸ‹2z·=ùñnö_)žkÄ\ô¶·–>üæ¨(ÃÚ:Æ 9™¿­IÖ÷œvn3¢ØæBábàüwÏÃ|Û¼²*‚Ÿ¥ÔÊÒ1¯ân»<ÇT*•IËÓíÞØpâ¬ñö ô˜¯=¿¡‹L­ÚÓqƒ‹u`¬‚¸öy®ü-þƒæ–:ÓÆ;KõÂ-Þ+ùÃR†Š^Ë®¥“¿a—$q³¶ˆ‰gV¿×ÍYÿ~ÓÔÑZå;¿¹û³ïv®Ø›5ú~×ÁÚ{Ñ.BÄÚ_ž>xüMk>Á¦g¼®«G³ÀÓ¹lõ§{½2O‹ˆ°;uG"¹þ£PÀ›I‹ò¾f\zý³ÑÜì>÷´’À/Ý™ ¹Z\¥F;½]æþÎûñƒI«´À9$½ž¾óíªQUGeOd< Ý;ND¯jQG}ñëñŸåjàßïlÙ¥hÇ>ñºñÿ©?‹Þ¬Gg±AªÛF~ ?ßûQbæ•΋ijã éê¤úˆ¤ÖXžº¨# }j÷GªÐRúÎø½>Æ|±^T~ù×ÎùäÞγý–î{ø¬öçsñšWx¯óÒý¨¹’ò¯õØ"œ˜íèvq8ûÛþU{£däÓ}x8Eëx®¿,{“[ýjµvÎ]® _Ä÷¹\öj@0ƒJðÍ“èÚ³ú<“Û¸ Å”ªêhlÛ?§9SïÒ­:(”V[ƒ¢q‰n o ê“d4Ž ˜e[³QÔÙ@îÉAyÿ#Ó#ëÙ(ÕÁ‹é¥Zø„m·sj´:Iñ×÷»²°æaç:) ½ w®)¡¨»ÎEŸÈâ¢þÊ”ƒE5·ØA l•jÜðx%LG¡Ñ‚¥µÏøíǾ ¨àö!²h¢™Ù¾ ¸† ÆÞu¨ "æƒýqÑñ3Ÿ§‘»‘!üL´ã ÆÛ®@õœîi¸/>¿Ëd£Ý k_žéjÜï*N´u Â’›ÊyØÑ–@zg"àÃoÝ;æX±Ì/R«!^‚•>ï-CŒÅ(\@Ë8¡Aκ§&³Ôóó?£8[îyEHãq­ë æºbB,¡’" ¥~W?*‘A¤ýáù€øs²àîAÈŒã»iÁ焲ŸâP€z£–r8Õ‚ãÍ|Î[á 7¯;›¬u»ðÕ¹MAˆgôüé™ýÿJ¥”‡ïªˆöYë°ŠC{wÑz§{§&¡ µín×|“4§Ã¥êâ0s§ØçŸÔr·ÒqþvÅ_Ÿß’}^–âÕiº¼T¥›Fò>þ¾æw|¸L"ˆ_ 6ŒHÎRÍõ·°{ê´iL5;…´¢tË JÇ9Í1Äå“ÜIò0ü$£Y’2Ü=ª÷~ßË١߇=kÖŠ®@)!ç]ë¼pü½RPqÂQè“ò ³*Ý)jó cz>ǧ/AÖdYÂÁòy ºŽÃf»Xøã´Ñ—+.¥IÖ.>\{O®¢Es{:\<'Òüöa©nçBR×þS[ÖÚ§ÏVÕ¢—ë¬Nˆœ€ãGGr©]f4T¯Òû•‡Ðûãu Œmµ)"4,+¬ØEÍÚ1…DRGvø7ðH@ @‰ÏIŸŒˆgÄ4Wªç_Ö@K<ÞþqÄÌ{ÏL½8|ž¿ ±ºè¯qÑZÅÓëÈXH„"y>Ü‹¬ˆ$8ýÝ)ÈŽBêxòj¡ D¡ TF>–)Mut€"r åê±™©DÌ¿©"9v°å˰8`è‚}w®•üýØkG?s{ýB,ÞÀD$7‘³ÿM4¨p®aDn¶'&ÕŠ¾<¬ÜMÂ|¡ƒ¸1™·?&l¤Êï?xÆànƒ&*:ï”u» ÛƺˆŸ ä ó­”Ù¹»n ¡ç]5$•ÿ°2Ö¼´{WŸ~{×vÙw4ÌBèÁ«—§ôÎ]0FgÒï|Üõ íöù‚æc@ü~xG§¿EÖÌ& äÔôAßA˜Ç‚½­™àSŸ57ÓÃgù8¬ÀÅÔ;õ£œ` ÂÂO˜ãq¬ßÛbÑEgl)ÃM›–)·Œ¾ªƒÈ •ÝL½_¾AU°AÎUéë3ó(³@qºñRÆ‹/ïå]:ɶž !¿x”‡7v§Êü)Fq:F+þ½ òRiÎff—ì#þïtI›È8¿½.7-ÂcsM®¬ÃHQ<þD¸Ä_ fw°Ø‡ÁÒàh#“i ¶ŽÃôÒc1—>_*Æáù$X4ö‹ÜWÖÊ&ÐßÏ€teqøt¾XpÕç<ÜܼF0Áòó‡ëèp¾‹ûú4×äÍÃcKðä]€ €'Ö]Ú_8ôï<Ÿ˜ubþûKÜxrbtœdw§_Œ@ !k3Wï¶œî2g3cf%Ù†8ÓL½§ÅòXî;á$h(|×ò )pj3À4€p¹µ¹Ô­8ûÛT§²ì> 0Ô‹‚,-¨OÕΔÁpßó§™3Ž×¯LE¾ÅñºLp^Å]÷ÎhÅÜ+ Ì`Tó4 ã+BV$¥ÉÿŽaÙÇü4 ÞÈÌøKÏÒ²õä[X¤e²¼H'øE´žÄØë,Oe«2éŠ×®x3½½Ç›Åñ’Yebç5š_¾áŒv‰¡m„øœ‘rº=t{~£Î¡øFc;¸®¼£œ“Ó2õúÛd"æð/"˜Ž‚x ,¶æó±jÊn‰QÓ@\>l²qÜe³ÔŒN¤¿y¨u¹ ùéìƒiùöH‡òoƒ‚ÁIÞÇ ,¤)û}„<‘2û!6_Pjá®Ñÿ\\h“º…Z7#âݰìJ$V£iºÖîöUU fû½»s?$£¢wü:2!&ÜV¹jFåpvFíS3ú8cÏÉŸ Õ /5èúe¼ùÌs 8öZ f× BЛ‘»>£¥1sµéhö‹ÐΨñÇkS†5›"úQ:/° mÄŽ‘V©k†LbÔŇok£ù­Q&(+qÓ´!­ÕÑÁÂs‹Õ•åzþ±E]$B.ƒÌàpÕ~cÒbáóbýˆÑh‘ é5Ø9,y†'ù«j^B×SÆÖ&@î€Ç@o¬x"Æ]É(RÈ‘>ŠÝ}pËSåïcéxtGìúÍ_,þ7¶Yä­ßáþ#r 8¹z9%Rùº:c Ið7ðq´qmKúMWœuÍ£˜ù¸ñ®Ž„Ù‡°YG/ tíèÖsó£fãl3îK®Ñ<ៅz¹vÒqW7ÉäúÙù<Æ›'^·¿Ç$6΂1hƹõ§mè+©aGÀ§›6îÃónÛØù˜“©âLûÒ\iÎ\Ê,#)#IãïIj|„)Ç\(DatD}Õ0EÃûF¾ÁGjÄ kÖXHÀ”:ùý --.çOs½ö¼:ªêYÜç'ß2´S–>W,áÉËô+‘ "!ÑóH6œF ÛÒj“üSµ+ÿÙiмfïÓŒù¬>cQ_¾»lxœjÂzu¡kö88f›#tVN&–^ÄZ+‘¶ƒÊI™+¡ wZJJ~¯%%`çs¥É_êñtw7¯bÖ¿„›—ø&fÙÃ?f"–;F^ WlP5nñ& U]zžVíØjv‰F½ôçQã‘•dÚ~/Ò?܃æ¿_¶bú Y~úé øèÕÇAªG’‘–¶ÛÐ,Eÿ‡ì\§4z  P2çé9(ç!Ötž’ÀóiÖ‚Ö÷3â¡”•ä42‰Db—YÌä0hGÏìÇë£Æ©\C™A/iv]·t¾Á´9ÄVqe2k=ãJðpŒwü(Õ"Œo¾T*LäìÝüì¢@˜‹¨CgQAUÙ?] ¶Ž…×5Ô2¦êŒÀc"ŽÓsuEÍ3#ïr©!eÝb K;ʰÌL Ò$+¾¦S€2­ P?ûñvÛÓ«pµõàšÕmé¿IÒ`-r‘Äß–èz `,nxJ“…L¥FÓÁ`â?aCœ,•öýIdȳJS6Ñ)ò QáHt>u0ÞSîÐ4>މ0Ó—Ië]W„`Ƀ´à_þØ axLâßÔØ°1¼U4mz¤OûÐÅ!6reLñÑ~ÞWѰHˆË—[¤Å‰AÀöÃŒIb¿ç~ó«ó$² BeL™üFùç=K:ˆ$ lÏ5©«?ë›òÉ&‹k©GÂÆñ:X³Š×aX¼Òö/‡6=˜>i™kN ä í’ý]ñ\÷¾{FæPÎ^éxŒ·Œy 4fÛiú†kE›Ñæn3OÝ@vztb£'ûÁë}›IðŒ(*„7!­¥âH`åpéµ):ì”Ì„C!0í‹ç¿)Ü€[ ˜iY9Í+ÅòP”Z›Wöàñ¿B#ÂÁ6`àù¡ ø^ÅcÃ~‡ÄòìŒú¹Ýü©ÃU,{RxÛòi//×jË¿7êÎÍM€”À6µ]ü4$&9ï^1 B’!]Ítk`Ä® ¼w˜C˜SpÑò8wr£:.([È ¤Žâ‹õóÈ&ÿ`ºPFZ3®gý¼ÉCX¦¢¹¹b^~Kàòs”¶s^ÂxÿÂï}/º`(œž8‘yÕ@œ4¯þy?;͉’zÝ|B+|e€+•<˜÷vºh¶ÃÌÕj;»@Ç›Ø$’…@ŒâÓɬ8ýþ·»¾ÖÒ{† S£ìZ ¦¨]‡ëk?׫¶ AíçrçVÆÅj ©^ä>+¨ï¤£œæ§‚1U[›–cÇä{"tnÁ â§4¸¦¨«´b˜(i·øÏ¹¯ÅgçoPé²îþ×¹ŸLež³gûZ$áDi•gÙV¥ª˜ˆÛ?ÔÛm¼z»Œ¹ûvËd3¹+AôÙA¾æÜõ¶ò±²…X³ûð©ØT }¶É#åãâñé‡ñ@Èx`6­Z=Söæß¨Ú|Üws8xì¨ÇoyÎ)¥órIÙ*Hã„ðHîKF:ôÝSM1]ðö>sãüWôýž«„öMå ±ò²’Ð)"è}+}UñÅ&èCR«F½C0œÑMðýÏ¿èO¬ûOÔûŽ”]>Ïêû¸ûß+轘Ña× ÛÊ30Íù\U…FŠê5¼FFÎàÔ2iµ !#Ø5K,°°ìÞ‹ãU;s£/³ð øoUcú¤TË*ïU±÷òYÈHÁŽ´c‹|·•¨Ymª‹°ž–a¿AK1K¯§‚ÙolÈሜÅ(b8ÃEºou'k̼ ȆÁbu×$+É–È8ö ò˜mÈD7apWhyAPAa?\Ë{ÓŽ0¶‡È­”Ѩ“ݪïЛ·˜JWî)vëpmŽnXéĪ@jt£¨¼owQ°{ƒéÕª]Cî…l‹B´˜§ÙäCjf\>À">„‰^ë°§ 3WcŠ¢`×…,b¨ÃAÄ4ñÝÄ>@Yðú¿Š0û!ŠcÜ;2$Oþ q -!ÉA„ÌóM¼ŒO®î«ó4q­NO`o©êxC¦È~ý*…d«†–oWú¾æšÞóU¯¨’dP*FÛþþ§ª}O:ïhš„À,þPpq~o¾:ƒÎ^A1*aPaÄ‚›N¯t³-ØcÐp^wrfåb23³Â|ú|¿#9*_aœotÜÿ¶'V74øúõ8*­-WA‚‚!„ÀTz¤¦6ÿêÕârúJi-S Ï,]Ü[îóßäU‰!‹¢‚xi©Nv݃èÙb7wYÔá„‹aÓ¤ÏàÞ›UL;×'-ŽÄÂ|íAìÐ0äôcí™y±«€(Í/ꊊý“aÀªj[ÊÇÄ!eÀï®ÜëzÔÀ+â8]·)WKõêJ4XÐìx‰ —’/käbòKÉ–bˆäJ\çPƒÜa½ø/ƒûΰ‡Ë'­LA¸@ÌþïÝ#=|»ËËFÞ•çBSw™ ¶á$3ȤE£0`½˸#«›Ÿ=éR"|ñªæ=ß²Ô¨ÚŒ¬Ê(ŒËá¥_¸µ:øióýÐþ)/#9tŒ]4è1€“¸€aa¬È ¿d“ÉŲhÛ„uÄ„-æŒ;9C¢^FóáÁgx3ø0ØD”,å$„4àÂáK=EeƒntéX™@í5¾Ó†Ü= =Òô‡]­‘Œ¤M߈= `So4‰½cä¯4§Òƒß“o¢§ºïÌ’»ÁBËqs(OœìfZ>\1s-p:Å ˜ã8þß?ñÈ!$DÑŽŽØ4þ7×øI”ã/²òOÅtÄXmŸÀ]|1D¥Ÿ†r ÈƒžGjHÈF ’r{’ßK`7ÀnN¶nó>÷™¼ÞyWbÿ#’,ï +z¶)t”A£e›À9'¶£ÜË7ו$@•^ZšnqÐl$"N9„(6˜œ2ù·IƒYöp/~ôáQàL…nªú‹Ipõ+b „GùwGüN€Àož±Óm"÷ÐZmáC—TxÎ;,uaáïšÒŒõåøêÓ9›ÿ[gk²Á3ȽñïWÊåܦSo©W0±|CÎã½õ†^ ñæï a"o?½ë?·%GTq%3„+Æ3N€‰h0´Vûï–Õ±åïªN7V Vn&'°E7ÖÝ®t (¾|ÜaT­{ã…„¤‘"J€$$ÈU™³‡/ðk¼ë.\šT‚OɤN˜öŽäLdýêVП[·lZ>­ákT¾¡h¤å²T)R ”wtËfYóú<8Ÿ{šx¯îôg†ç~’7óÇãjË›W?íYlä ½ôÇ5úyoÝœfî³fàЭ†ÌÝYƺËZ'eçys :7y3‹Îž·!ä‹ÅKo´ÂéÂR3•ÄÕö¬O D К•U€AVEÕ€M>‹*8Ó6À&Êó›:ÌÕ,ÅRšÍ”´s̓§:õáßÉð×j)~j-Ð;¸:ÔþpÈ€Fµ¼þãü=©fZ'nS:½wÉÀ6|ÞÌK—ða1mÒ1Zž –È¿< qÙÑ—î$-÷´á˜¬Ùþ—,r#Ä¢f‰ËBòÞýbú”aa·`ÆõÂ8¢E`þ<È×q‹®ª/A½Æ`í'l<‰‚Á¾F>¥_›ZþU5+ÙZk|6¸ã&®>éÝ ðWvV÷‚dVØŒdÞ¢¹RØÂÚ‰ 2@œ†_Ö©‰ö ÅäÛžrñ9 rÂ_ˆfQ‘=‰Ë×»À”9IH¹ÔúM¯óºÇ~óì 55bqÖC{³Ü)†…+wƒN­¯šaÍ…\«sÇÿ<`…·[_ ÖÀ[IÃïòKâ ©¡Úõýÿ*M­4G׫á¼þÖÔž5xÆ1§èã õ,x›÷î…l®³Jΰ®Ã'i&?S„9ðÈ>a0’лí6±(ؘ*&¼­¹ƒ—;•‹?¢EÄE®Oè5Ê:}ÐH{Ù¦†\’Ì¡hb8 ™äïM=¬nªÉ®Ò!Ó‚BùÏ´û®,^‰üÎfw9’#l 2Þ£öÆ&R+î—·}~^»b÷ŒþÆXügŽ£è§˜,‡b^{û¤0a û—PE»ÄõÏ#e*þî~æsÙÑ~8µîdP;º Rb'0ã’ÁÈù,§™Õ2øT"1%ø¥êï›[U"w9ôÃŒÂ:Y€ÖcÀ’x>þCÐ'æÄÖêt· Þ ×—í‹g‡ªå·NS¾èxùuA<„6g`£‰Ãëq=Í9¶‚Ó‘~¶¾!ÕïJ ï“ÿwo2uçň ”úN«!ÉI;ô;Ú™ÙÖ½ ñ]‰¸'&ÌÛåäY‘SŠ›¸6‹:­±²ãþèÿ{Lã‚lôËjTf`d Æ"pt47<”®Ã¢íÞ+\ÿ^c˜à½3é: ÁJ‰‹I¦^45Wr[°<üh™5+ NKuv}µ4ÏYw€¶œ—3Û<¨?‰QG…Ê4{«!ˆ‚¯û·ÜþÍJ¨þÅ ÉÁ/Ô¨»`´ê7üÔÄN áB¹9 Ú¾Xâ=ã~À4£0æ…wÀƒtff±¿o8=Ê¿ DbjmÉËÚÈÂ];¸ƒyªsø Ìm—˜™.%¯²×Ñå¼$ ~ÔÀRŸ8´‚¦8¤™ž§![4Ìniï?+"E~ý!"g¨¾ä|Áwü»‚üQi€Vn„ Ül: ÍÒàõÚËA[Ö†‡MÃâž)¨8ƒyï)ò¨Ø²¼BÄC·wÍ*ÏÖ,»z*¯²KrC¼VeºfƒY¡Ž1&1ôá1“¥>™ `•%1A''fuÁõÕ›²ÓTrbŸO;­„ëѼ$§ÌðS껎£À·b ¸Wèý?PºÒ¹·Ën7]§.h¾ÚMÆÖÔëû×M„!EÂu- ®Lb›M†|j"T Ç5ê{ÁÓY¢óƒÅCÑ­”7xùÈÎ6Xs‹tØ¢ì¬`1‡ºÄÜ;||æÕ]… ‚’âÜ¥êá- @k\ý€‚Ý VÕŠuQ Ì8ÉP¤¾»W®ã[O6,f רz™Vý™aJè¿|j>A! ·ŸHZ>?¿S€èŽÁxÀ StJ »¸kñÑ0=x+š!ÜÚ5 ˃ù3•86wF¾ÝÀÊ©ßbÄ¥SvÜÛÃßiÈ#ô™pKòàÞ²©ŸúèÔ:’*%¼ðÔŠö%DÖ™šù+51zlêO˜ÀÜóߪAIõÁ&ÊÐnþŒ#È‹°aÎÈxS3vV\× C¤;Îïš-Äc¼%öøFRv¹8H5þ)¹9Ç`<ž´ù k“XË™mŽ£ŽÒH0„ oä$îý-ŠG…Y¿Ýh|<%|ѺØ5»G\(œXúÛ #à_>%Õø âa ±{œê²â¡L€°ÿÛ×’–ôw ÃqôjŒQìc ‹Ó“í÷%8ÇÈŸèG×·‹RÊn¯Êw#Ûó%VހݑÈDÍè®è„ 0€t¨ÇÎŽ´ÌÒìêN<6do°;@ì¼)nž)¾ôŽÿ XŽÐ½¦­k*z<Œ­¢´—K »m¦‰Íöd^nÏ¥Œû±,$} î¡5¿Amïƒ\¨ÃD†K á]ãà‘ugä`ÔÉža¥Å¥[b”‡4ÀsŠüØ%b°bB˜X.©2S1Wx‹Þåls˜=/âœi…ï*Бz‘‘ÔÐø¡©&¡Þ™X®D„Kè¼Êz¸j¼NÛ¶Cߨ­¡ngB1ÔÖèÓRø¥qå&½¹5Ñ•£ þ Ÿ,Þ˜´¬'Èõ£©HÔꬸVëßh«—‚Ãù¢ñî,e9K aè;ä"ƒßÓ˜¥§׈PL„ÝÙ¼3iа‚,6»Å|t£ÞÿLA³Æg2 ¯±ÜÇKZ´8>ì2‚);§NPj“5©ˆ£ní¸D9OÒˆÞ7ZÛO&‡´UŒy»³Ý îÙ« g xr¯ãd¼ŠÓ¸øG‰÷êT†¸Ë•Џî®#öÍœñAÆ .×xqE*ľÅNÝ:oÑûóŽ® ¾øö¬©¸ÔÝ£ÁûãNO -ºÂ y+—‡¡èÉâ°’ܵÒå®ï²'ƒh\>F-§ìQ3r“{s/ïÓbÄ ˆà€ÀyzWþBG ͹8VÌ4TVóR@¥ òŸ6{_¢±Ý.ïÍ€?yÆ&ZvhÛ\IήŒ5Šƒ[ X’" ¶ÆÅT¿«î™Ôõ>A¿&sûFšÍ¥2IÉ—„ˆVRkÒ-§[\ûë”#“-¶¯ÜèÛ ™}…m²^±†îXåŸ~Jöá£jnMž™‹výþÛâü6ìÌ;üúX\õmeØý$W.7ŒŠQû=¯YuGíPi%ß¡Þ=¨„²ür„È‹nGÍ'ZcÛ–s§tÖ@ &¼Á<ÔA8Ç%àM·Óo^÷ÄÏO[aÑmÛ¹;=l•î^¾CDl­ÑÑÑËØÔ)õhùÞ=\U$ ×rIÐ 4¦[¬ºÄjÕº&j©KoÂHB»Š¸»ÏÏ ¦É`«l˜ÉQ=CJ˜ ˆ€ú(Ê#€”•(c-µU#MÖŠ¥âFNýð,ï”oª¨ý¹BŸ#6ã­ ã€X J$HÓØ6"® ®‹¤ê*ƒºŽŽè:ÿ©ÖwïŽìâ:þ-Õ¡~dWAÑW\%×pGÃc`ØÛpõfjwr~ÁŸŒ «¥eËUR¦½o^‰³Q¥bÏòÒ³€L8‘Ë TCýª~Iš±‹ÜmúP4÷!¬uÐp¢îëÙ ø×ŒŽu•8¦0ÿMn;¥hêt>—@a€KqÞ<ÄP—ÂÏ””§{Ñ„Q €ü¹þZü¤H‚&ÅYÍ; ÷‹‘ m\)©% ÆT1þxWá&«.ÇâAXŒ÷ì’÷sùt­ØR1€^À×e9ú(öTŒ8ŽŸs:¼ç͆_žfÂU;ƒ¸Õ§g•õHU*Ck¹«ð>.¹_ku`ð-åäãm…Rx€!ŽÀ²éN [!í%%m`R'èÄë¡YùøÂYÒ6oøvvoñl*aÂñ Ç<Ô ¼©‡0|- ÀÀ~¯Ø¥‰Ÿ€wwð]ºLW¼` ›ÝjÀë1ƒï÷8i¢ žvl %,¥±-uD7{ËBREñÚ§ B¿#BI¾ÿ©§´õ€Á¬Ò=¸V_[!Iæq(ÐÕÈ MP)…w®œÞþ4¬¨'5 % ³u·ñnr^+xPpÛ(;v LÄGG-å¢p5Jq݆•ƒr®—G»‹®×O…‰(#‚7šàò™iÖLÉH2«¹Ì:ëPÅ£_ÅuV³«÷ýÑØ( ý'⟓Ӹžw,´ö>#ÞÆÕ¸¢|"O[ +6³‚ ÇC7Ô9óÌü'eäÖâ ÍúêW% (À8žä¬½“‘²^ü$ Œšq—þuxÈç­—¦ÂѱNÿÙXg ;ì*C±@ˆá㿪ä,ïW¼ìµ´Á©[YÉñœíÍÊWM€§ÒñJ]ã«ÅeÉùu À58„à7˜Œ•â>’9Ö9®ÛÛk©å0–\Z3ßlü™ïÅ “Gþ°†/ùÉeJLù-¨dZ}hBÇ@·@Ö"á£&ï™ ´ä3«2i|Ú0/¶*b´ø=ò / ’_|ÄVG¾Œ;˜dAˆT-4´ýAò$,¤Ú[0÷ÀsÌ` »¤íœ_i£}zHH÷×°’Ã0Æ ?|è ‡¹¥[E> EJl„"aŠ hhØ©[ÜG<çìÎ*iIóã¾{s úä0Ðá ËNŽ7¢®xv󕤴{7n§¼´å-SŸ /Àuœ‡Pf_^…gy8Ye»f n“0%.eï¦Ù2„ ƒdK'ï§rÓéI€í­6û?,lüWãŒA xO3öd~ñÿÐiѤ0ÞÆOPÎëyFÆ`´a ŒÑeVÝ ŸˆM1±ßör—Ì‚1ÃL^”¯Þ½9´_+7ùºi‚\p:C}@š²û`‡9ßò§cˆtš”%3KÉ'•0k0CS¢@ýÿD˜c£,R±Õ×PÎ2Çaqâ )rA£Cüo;щNáºÄ¦q`Ûäxz2/Óâ¥Ô¾ƒæ!¡À»mŸ¨2ƒX±áÏŠÌè*QRnî[€ð5‚b¼W¦xàxŸm¨4»´8ÿWo‰«—Ç7 ÝvØÛ®±s?¹¥u¼±þº†-Ý[²Qê5‘°Îaø`’æŒMòhË¡q¹ˆŸüè½™Lwïg€g|oÈT¯ïW`€·«xÝäœ"¿ëåwxìå5Ä ë/p!WAöÖ\ìÈ ,¹U5­²x_p\]HB\kÕVR©ƒUÖ}W’$䦂o·€ChKß¥æ „ïÃÜ?;Ø«æ+¯GSq¹sa. ÕF£j’7ø uÇ÷Ï?îï¥ÌŸÜ+øª f*Ž•8-«ÚÙÅ0 w±·™ÃàbÜþ|8& ¡†Ùú×Íê0ß9i‘úç‹uWÂæ·¯‰sYéx—ÑÈ xËt>MÊkæÃ·Cühå¶[‹¡3êô›5{6åü8¹Ì©¸¬AÜØ ƒ8¦ñ?[˯4ȢѸìö[â»ÂñS±Å¨w¶FCá+¿<ò³ ®*šÕ€”¢¤AËvðU™/Qƒ‘‰îjü ‘e rM+Å*ž«’·ò!¬(fƒÞº¼E­xnN[ê¯÷eÒŠü¯÷êÙP…!x¹…å•HmJñ˲=ÿÅÜ‘N$$~ãžÀpammtools/data/daily.rda0000644000176200001440000040474214222504522015001 0ustar liggesusersBZh91AY&SYÒnÓšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿá´\u( ‚ ôÞòHÖ”V®ºº¡VMK»º*J®éHˆR‘ ©IR‘Bˆ•TRˆ•%’ª¡*ª ³Ü»¥PW|wnQ@ ƒï‹¯{ß'Ø¡}Ý·Öñ½ì×/{ÝÇ»Ýî¥ß^õzû¾õïvî›]{\×mï½÷Ï]÷ßo¯o¯½ã½}ïqs»£Êû½í½w¼ùö}¹×Ÿz½»Øï<ùïy¾7½µ·}÷É/Iõ÷×½ßk»3µàt>f3^÷Ü>¹÷ví®û“שò{Ÿk¹.õ÷ßwo¼ÝŒëÝîÖúõy»>ö“Óë¶÷׺W¼ï|õÙ|<û½x¹»¾»¾ûíì¾æÏ¥ó{½ÚîÛîêùjúø}ßnî÷§Ï<õ«¯½÷Ÿ|•ï}Þ­îÞúõ}ÜÛæµï¾ï}ëzû7}}7—MËìêûןgŸ}¾û¬`Ô¦V£dÕY[2 Í£me%JJ€ k)£&ضbšë%TRUEIQJ…) Bå­EÖ€RÌ 5vЈå¥6²‰ŒÚîâvÛj»²\Úš²Ö‘jHc1†Û8šnÖ2ª[1¤ªÉfjX1¹ï¢ç»žÛ=çW—º½»ËÜgnú÷Vûw'®\-¯¹çÏõ½{¸9<ªu_wv½Ûž±ßwSÛ_}õãÝg½Ã¤Ïs”©}ìèUöj]œ¨3;†—Ü<¤¯z£h#˜Q]ìä¢NÆ’­ôî©£dd£{3¬Ý¹Í¥Û”žãs^»ÐÔ÷½÷¯¾ëï<»ß|Ûm}ï{êûîóÙy¯½W½õï{§·¹¾®w7}î>M}ÇÜ{¯—n¶¾×—u÷˜ïw½ê»³ßtø¾«ï»—¯}ë³ï»µ»çÝy{êzæÍ¯›;ÛÏ=³ìïo^öûÝÛUÙ»mí7ßVÝî|U¬ï½ç›¾|òûÍóÚ>÷u#ç®ë½¼ôì÷o}Þ{3½÷Ÿ;}í¾ôûï|wß}º÷·¾[é÷Ýð÷¹¯¾wyÝîg½¾»Xû·ÞçϹÕxÚ}÷{¯{×¾ùï»k–ù軾Þú{º›Ý› ]ÞöÞ׽皻ßoyWoG½óïwÍ]™8Óíó·½móÞÛ=×w¦÷½xõ‹[Ý®öwÏH|}‚ϯ²wm·ke{ç|璘¥>nö;×ßW•¤÷½ï¾7žïxï»wí¼w»}óß/»Ý÷Ù÷Ús{ov÷½Þ×<îûﯾ_}óÞõóÙ÷Ϭ½ïlîßK½Þ÷ÞûæÕ]÷ÚÉß{ÕZ×7¦ûݾ¾ºÝ¾½ïº¼ûÃïuåïµãw=Ÿ]ß^'¾û®ví7»¾=»¶ûîÓÝo½÷´ÞÝ]¸K»uÙ»ï>Îù;î¾d/o}÷ß>úï¶µëîO{׺º%ìN»½nú}ÇÏ{Î÷WÝœ¨Ý»Ïg»kÓYŒÙµ3[Îãg;m;œ'*îå;mv»Þw»ZÌzË T¦†ß]÷´§*Ëé¸!‚ï·)£ã·ÛQÖ¡)s[%Tîݬ£îÜJÙ½ÜêšÝÜé¬[d©îã®·{ºÌú}íóï¾—¶{¾õã³Nmº9÷·=ðÒ"˜ 2b hÓ@É h@hÐi 2ž€` dÓ € š4iˆ#CM4ÐhФˆ 4ÄÓM2b0˜ ¦š`L2bdÂ`!ÐÐòƒSAL C “&€i &&LF ɦC!ˆi‚2i£L™2i¦4'“ b!@@bm˜M1bi=†4 4™©0@50O@É= ˜ØO@˜&("’D4ÓCSÂdÀšbM„À˜™14ªäÓCÑ¡ ÔÙ2jzbi”ô40š4Òy2a14bC&˜FS1ž†ª¡© {Ä'URHˆLš2i¦˜b` “F˜2hÈÐi¦L˜ši“ “ £#F SÍ  M¦€1˜F€hÑ M2h wš¡Õ„<q†Úƒ'ƒ%¾&‹Ù»æv1CÁÅ3ýtØ9À÷ªYÉŒ¾ä\U(ªàqy}ý–îf ð¬<â¢6 ,»9,芊 UïºÙ'„_þÍ‹п!|‡¨»êƒö·×\%EÈ3²ìõÏñåV31ÐÐû÷eOTTöWH ŸTÙd8m•Ý+ÑJʉ}@ˆ±W5:r‚ƒ~í÷."ÝRkÕkýUÊ=RJVÊÃÏD²“Wë”h§BõÝ»ÌËj†—ÑÈÄèAUÖ Å¶ñc\–;*˜Ba©Àß°¥),$ëÑÓTádÀ{ÌFˆv“ºldc¶-²iEä™(2¸›½õáZÔ™§ô*ÚήiÍJú¢.–ª%[;…ß*5©¶Ò@!Ú\¸Jïƒ0K‘È2BTÌ¥Ú1Nm†æÜþjxùÍÌÆ¬‡és7ê3ƒ²Ÿ;D—ìwug/Ú“(Öž¥ §GŠrho¢\°ÇعÙîã•vƒð¿ew„ÔC3‹K¥e$FÀJ c$€‚F1Áo‰9½ìèå™rDí•ÃØØK½)§gŠ;,¿RúdԒ帔5<§m²¥Š$œ9<Ëà]§‹Ô%…ŸÕ[e.›ÕÖ“6  g*êƒÕÈ:1!µÉâX¡]zApQu•¡'M’îÐå³%Q åÄ#h™c$»nsÂK¥)r9X$`(¡*2B|Óç}„™i׈Săɽx…(ÓOz…£JÁw“ h¦•µä…{]Çú…²wʌծK_,coI0Þ5i¡›r•aZÜ4€§Î5 JHAc|OÞ9£""%£lëÀr(†šK©9¥š|weaiš`ëõ†Ô·B+Nú´ÂʬR.•ûtɤia æ\/T¯Û*ÏC1ƒÐ´XÓ³ÉKv¨Ä›J^ÉS){ˆ”ý ˆ3^É"§55˜ýžÌŠ)%§œUK£™÷ï‚ÉýÞ³ùø½OôÁ‚^œ$«„³”ö“tpt¹e„œÇ‰ñ€º©%¤ˆg ˆ!Þ…º¤Òÿµò©JT¦¸µJûÕ¶¶šºTÓÆœ¦™õ{:¹!eJÂʨ@”&ºžNµëd¯ZõÊxý×#oýk?j#Q¦rßµ¥‹þÑLW鯶0h[*§ÿѶStbƒ©òƒ²l›x²ÿ^IEÍѯ×ÓçeB-#d‘»FU…˜ûRurudNÒÆõ«ÎÇJ‘0±Íê鎻Ӆ@ϱ¯Tœ-x=ð•¨;p<&õ+}Xû+!öf9±îà Ïâw áã/â;ÕpÓq§Î{›ˆ¤]˜oX“¨»¡¶#:r¼ds7 x'Páš8q¶ s¥1Î8ƒãK v`‰ßkO"íº£Ú8 Ç*{ˆ¥Ý¡ÈCå &cd®Nõ=¾ÄákÓÔ€tPI\®-p²j–uôª…UªÛWEœ]ë2gF¾iwªÝ:8K‘ìç3…zµU¥Œ[)ÝE¤*Oa ÞlíN,{Ü-³=–k:εí´ÄîRt²·gI-‘¾^ï]Qˆ¤@*Ú*Zï5R°f F­ $‰¶ i!\ŒÉ$¬‰ºf2A#j¹ÎƒÝg…T™]‘ÂtLÔì hʹ©{SBzޝЋ`@BãMÈ·ª´R9¡ …‹Ü *0»+}±…4-¨Ib,c wI@‚ ÑÀÔa˜„ZHUå!'@´¡ *"üˆ"(.7V™^–&×5ÚUÈÜH «gb-j6´ga§³`,ÔªjÍ4`è”ñÁè” Ž@ ’÷Œ¨H{ç,$2CzQ©¬GzÛö Æ ©ÃÛ¬÷õîPØ$BÆ;š„Íœ¾ž§^üûªòlý4Ò.ÖŽ“JtÎÍßU{öÎõ»oûßîhš`„bÛ/Õors0T¹®#6¥¿Ð»4Òú\ü7D•ôTi×?¬Ž×§µI:úÃÆD´¼,8ø¸4ŸyÅêýÕÝ“xß1üïö§ãÚÔ²«eö•¬ᄌé«NûŠÒxÜ"â­¢Ö.§-åZ‚ë-lðŽX–ƒ:«Þ1}ì·n±¼½S‘þù²a›6ìVTŒò†ÝšHßñ…ú˶À‹s´ô6yl²©Ú?C4‹ÜGÓöhq›9§öä©aŽ—ŒÃ£G–¬íÉ-ãƒÄ ´.Y'~bŽ»„|—]«T££ð­Iiµ»…ŽŽŸwQÅ)ôPænùØt\­œ<íZ„Î 麿÷ùŠª~Ubƒ3‘â{åòy‰çë×ÿ=Hoôy8§Ö?ª“ÜíÁÇ¿÷t»xÜCJ~íõ…ŒRZÁ-©S·1Õ¾íG¾®s³9 †;ˇÁZë/Uw³ú^7:Åw~c­jmµ¾1s¨–Ê¡. •Ž|ÄáëÌG_¥úžûÂ~¶ û²ž·m†‘_¨¾oþð°SÙ]B/0Û/üÔH·ÿ—VÐ¥lØOÚ#_ßú««sX–]ª»Îª  §l¼í_œ§u-RCÙ,Þj÷b£õplÄðšÚÁçUñ:\—C‚ŸuÝs5úQgþ ~ÖšfRå?ŽžÖoên_!fïéTI>…èÿh‚²ýµÓÂVÝ#_zl®çÂRÂcY#ã<Éb‘¾^ö?K£z÷k»è]º ãîS‡¶¢_ÔP2«,@™›7|íÉ*ý½³³n‘mxÅκZùÙýægg©ÓBÅǯþd Õ\'ùÿœólßõ9ú;ˆl"zùû­*MÚ__ ¬µMjŽ I@ßžØØóSßèk ÷ËÛäqOsŠü§\Æ5>Ïk¤NLi¡>o}É‹µëoR„[Üd1—L¸Êòä †ÕMÕY!˜&üxùæ{Ãûó4_C‡Ê:i}›äªƒ‚­w’ñO8›®Ó/©ÒÚlÞ.S²L2­]fFG¯¾Úî¾vÂO“©pìOoq'6ªh}*˜ïO_–pLÖàèLÌÆ¼ÅýI5ãØ¦uÕûl±ÊºÄ={DZøV²Ûúyxf9c#Ý7Êí´_‚pÒË9AH5²éŸ¡‰£ãFÛóvøS:¼s‚óÉÝìï‡~mµö[½y«~Ê2U™™Ö\Eڑź þqéÞ5 q+þåýû#ý-FðñŽƒöáÊ­‰ä8@·'è_ó2;¤] $Ä æQ—jS‘mKÆzkðæð>z³áÇt$ò‘úïÚ_J¯L>¾é/´ïy/¤Ý¾ZÊIêž­-lÝ%ahŒù«:ËÙãzµj³)ÿcny¹O|ÙÌûÍæ§ž¸žl.ÖÅNA½Wrîâ|Œ©”°{ücÇ}##ŠièÛZ˜²U棯ôûC”ÕÊ»–ɬ^í!_jØ× rÊBmM¡D\ƒ©3uoD™£Ê56ÚQ©ß!Ó7k±ó¬|·‡I©£øxÂê‰Ú&@p~õVУ¦£úåî6ªÒü ¡²;ZdùáÎo DUÌ_¶ÎÑ#â¥ØÝ»¶)4vXÇÿî ÛÁðB³ÊÈyÌÊ_+¿Öª‘^þlG¥-„ï®[Q¦º°Äÿ"çMø§­òµ¯ÄÐv;ˆw;ìZÿï+êŒ~©­&ÅÇ{'ÔFv"}¾}¾ÆÉûÄÿÏË*…hü¯s‘W޼õóËþ:k¬ä×Î1ÎjYŽ]þÒÓ¬àró{]•?m¿‡ß–¼óñ Xå7› Å3l™ò¾múlç;¡qUŽ ý®”ÿ£ÕÂêkB«—’³Ý'£ÄýSâÙa’óú½.|ûÝŽ©¾èĽÄhÂëóCcYÅ©¶³§|óÑÉÈÆ´¸p´É?ûÔ¹‰úgi”n۾əô? Qì”pSÛúá–}©øv.nvõƵũ¯W3ëé™~›^«CÈ`ÿs¤^¢ðÿ.â…c*Úüs󻎺›i¹©©†|Ì(òº°xV%¶6&/¾ÇëöOk„ÙûxT»|Ÿ¸§â5Ä^íŽ QE7 ãa‘Yɹ>ô',»:¼"JŽ+$ö ó¢ÈàÇgÎÏ×8ïj] ì6×GU¾u§ùæžÿ·ûüÅŸ}r­Ýú#“æ¯çÔâ³²=%[öé”K÷KÞÁ8\/ Óª‚ÞÖ%X|A× 0¥g}K$$*ÜÎ&ëè]ÔÄ÷²¶+ÚîÒæ7MÔL!:¬bï೘h§$H—dFƒ×Üy©,‘qL™Ú´Þ+»¯y×…5{ݳùgSº5÷²Ä÷cæ¦QqY®öâ+8׿E Õ‹7!ß7a„ï©õqb%£ÒZâ³øÌžñRáµGg¬¶LÊm‡þaÁfph˜jÎó<#Ð~™¾õGëæRõø+3)é²¹ƒõKñî«f}7Â6•ƒ¥ù†´‡KËoæT퉚Ý)…€B“éOßeö…ò'cÛÉ!ÙÑz>‚Jâjæà0™ÊFàµg~”GhA8Ë^'_vÏsW§qyœ©Qi¯ôXÎê:”ÈJî©cVzÖ~gì«1Å?q ÕH“§W}ײÏL`áö;¬ÞN²SºmƒE,¬Í«ænZw—Ù Zªž¦såÛrOÖ˜fß¡¦lÏÖ@+ävý'l£œ@±§ÒÓp(TŸ®ëV8>ImRu¤ÒÇ]7By+í«R]àÈìÜñú·jû·çæÆÿ‚ëâ7\žâ¤¢eùÉ&{CN6/çïÕΚfÆ/õÝŨTwÔþ­ÙÊIlGb›?K¸åë&ÑM Üÿiš]sëÜt6¬=¨Ÿ [ nMºRãt« *Ô¿œ[ä»Õ´Kà IÁ´Ùã»J£ÿ"ê×¥€f`»¿]m#ý|·yº%¯“ÞRBé¶ï0ÔÀc&¼¬7®ÇAÞOl΋=ùE®65IxKu>Ÿhå5KŸé€F ®µ|X¾L§¢ºëö¦tÕu—¡Kö͉šqëràn0œ.b{F× ÿQ•<Úð7nÁú(X¾+Õ}»fÝõ÷––²M¤~h ÙÖÄßõÓaEzîRºoº×¿\õ`™/±pLŽªÞÖømWǦæ©;¬QÖ*xã‡ù¿­Àµ§».ß.p¨"sÞOtïåŠ:Xì½ï %v õ©³-•œì&Ãïÿ3ôYæ°x7énF2ŽÇ VÉxòÈpXã—ê-¯Ž™¥~‚ß ËQoèѶYs4Ûÿcü§ÏÀ±Ø©^¢`ÍàO©×=Î-ε¥ÈR(´Îêð(#»ñ,øJ¬Ê~gÂÍÍêé<Ë(9˜.Rï×§Â|û¬OÙ&fe÷‹“ǽbØØž÷0-ß´žWd÷u‘αåû+—tWT¦ø™{§þƒäŠ˜¡B'°–¦;a2VêheD¢îÑ`Т†eœT–"ŠÛ@V’Hªƒ¹œŠ· †’ŒDEq3¥8@)¢ª ö– ‚1MUUJZ "SUEBz8P `¥Š€9EE˜ûüÚJ 9ÄðšÕ冦 ³@ÀÛïÕiTÖ„ o EmzÉ…ZÄM ¨“…T=•$‘郀JX9ÅЗR…AcêSþ £N?3¥¤ðE#FpÈ9rŠw PªŠ„X„®‡Ƥñ7£(øÄÌ»IÀ(¡ : uíž*¶&V´ÐxaB¢¢ÇP¸”$à4`â†Ì¦)ƒ“P4L{ƒäƒðî¯:¤…ö£‹?Pb¤Ïœ9jƒý´"hÁåÖ¡Â[P> 6m ø ÛT§‚\0:¡×.ÉhB=%pt¢oÁðPÛ׃•S”Ú&ˆ:…/JS#r´?`:”þÚ–Ð|U(ãj h’`Á«dò ä) åëSý&Õ¸<Å~·R¤¬n†¶;°v çà§Æ´J1Ìר¼R à J ]Ý௤¡JX±—ÊCrÄ–ñ½d’88@|@yT6ÖİuËRÍ7p©Ç¤µ x´+ ׄìè—•L€90AÅ©JB;E ÆõBy ÜÁÖƒž²¦; {|`k@wˆy`ÖÿAÎ nþCf–ͯ‚¥è䔬õ¯¨º`®»bXù½ ÑÒ´xØ× ¢4½ƒåÐ á 2”Áäoÿ WÒöûBžTÐ2Iõ©K‹Èr ÝTŸˆùÂaP®‰Ž ô½ìpNØK(ùÀæÔ§ W­ƒÍ©gy€l`õàïÜ)׉KR–¨ÅÐà6%/á΃÷¦Ôz|o âAöî×LKXÿ{<~s¯ÊßÓb¤¦X 8@mAYHЃ®p4†\àð”àiÀÓÖƒ±öB”Æœ¸;; s‚yÀÿÀÑ̃Å/ì E; {¥0Èa·‰ 06àmÊSHõµ!žR:•òAõ8 ÜÈ?p;uÔÜ´ÀŠÐ:khNc8x0@li’ýȆñ*è|kž<¥0 jÐHà íd ¨>ˆ8x ûàèÁæøÁÙƒy,÷àVGÊH§¨†¡NàÄ’´ƒé‰ÊǦÎ iOToÖ¥ƒK_ð4°6¯ÿ LkãµDà€?í;52㼨>¡ù—Dz˜`sàöÀï­ë¡îƒë¡ºäZ5ü½)̬vÊU†Äªx Œ[AÌå®ì<1=kH{+Gá6ààê‡È`Ä €= 9áƒcœª†J`8E+›Ný?êá—à}Ù¤Æ)Õ®Ä~àl ‡Ú&PtèPƒÚ²tj©¦róiMŽXMÀTÔÐ>?h;0mÈ P±´ÓS¥[¢hפ†´j¨šÀzÀpÀõ€Ó¸ž`9{D¥J\‡äB;Ðu ûHjÆ®mr^ýOžîœ˜6°pnàîÁ ÇÖ^Œt  _A±¤y«æ§¼'Š;Tí6¿¸<âjÛÓ¡« p= YÌõ`CÿÛ…|?X=îÐÜt 7E¬݆é âè@×§2”ÞôÁÕƒÖƒyáÀp=rzc™ Òò ûÀÝ@ÛIp3ÁÿX4éçî‚Ôøà>°rÃß!¸^ýXL0ýmeÎëƒéƒ}…ÈÀpd­Ž;¿¥€H6~Àx ó ØÉ´C^œh>X5ànAÀÏV ¤j âG„  ð>ëæò¿~j›@t`â¤ìðÔlòXBí`Ní:€Á§0ÈxAÙ ™Ô¸hàýÀìAǧn¸m7ëž ðrpèØ6}ð{ðo€éÁ°û ÒƒuÈ/n: Àz„µtæt4 ózègÁþøÒ´ ÐÀè2ÿ+],5|š¼A>ðáJ8¡ï߃݃œ0˜”/`ö@ö@ù€ØÁñéAéAÜ/è%°`?h6$Ô§€Ðwà÷â\dzõKjE@87 iáØ·âº*€ÓA݉±øLoHfÁúëÁ®ƒíƒí¥dL*qiÃÐÐÀñˆmÐôýüJ€9ô0`yáÃðà™TÛm>´øRÜ>К”¨¯ö‚™d³ø»p§*'¼¤À¨ÚÄνÚà˜±ù‡T†,0:°5 ÓÇöJbdþ ÙAÎ… ¸9àp£º%duB|«C%x€ÚÁöPû>ä´À3òàâÌÕ aXs îÁá¡ÄOxt6 éÅ%™54Àó£¬CÂ¥ OÄ{0|@}€qÂXAÎû ˆC.—À£ý;äæ’” |uà_ÿAæÇ›âr椌4 „úX×ûƒ‹ t8°~àlÀÓÁï|-réàh‚·Õ©à¯Þ"¼Š˜P9(÷A°ƒz† 9i èW×ò˜ lî@¦ƒQØX¼¹%Ú 8|@rA˜XìÁïøëAá~¨4°i`åƒÑNA䤴Ð8$4ª~¢cDÎ!ú-„°u€ëÀ²Jñª–àyQª‡ ~0u€ñÓƒ¤×Íj¾À:ÀtMa/«þ†¬<¿¤ b(à÷@èÖ)XЍ6@ôÁÔÁl@ü‹¼(-ÀáÁöÁÔ!ÞÙÅ›bf Ùt`óÒÔÞ S&,l- îAÄ£Cb?xž0?•ÁóD΃¿¾Ð+Àú ú ÙÁþAè‡ZP D(‹çƒ²ˆ; h¢r‚cAòÁƒú©àƒ¿Èš@3 ÖAÖƒ­v'NN™Ðw×ðÃÆâ·å1ßAìl?`=?˜=>*ýø©§<»Ñ2àæÁ΃–Bò;UúCPpØ—¶Ð¥œ R–Õ1¬\"¥ÈLX{ s âAíÔòøG•´ð’ª Q<`k`Ö“ÀÀSÖš¼,È=×·‰ª0 Ø?ªå‡ÞXr::5ØY¿CßO5 Ê*ôÀVßÖ-¼(5Ðiàù€ëÁåüöTÖMNȰ8T4€ò*^„ÖœCêùµSþµµ-`æØ…É 05•=à}x£wN`(=Ø<14BjïÕq¾j˜Ð5÷ÚOöº@{já%Œ zoÖ˜   = >>pn‰Ö…áN¸<Ði©W¾<<ÅK°%±[Kø5°~”åÞÞ§xž8çF´&˜~@qËvM0;tƃÞûÄl€áÓ¯Œœ 87ô>iÈf†ž¸5.é™[ÂSö¹àà̃Ø£¨¡û `ÄåÑQ^0ÀîÜù&ð 9•Î]S¸S0æ Œà;d.`ÔÁɧ('¤¾Â˜`x ü øàØ@îW„½Jü@ñ€Ý€¶ƒ¬®¾ŽØ¾¥x ²jÔ˃… Þº€È&„hÕÖ©ðƒˆO-N9s Ѓ»†¹„* |ˆXAŃ×l](?ÊÖ–Ð?7 s@ú_¼~´·E¿)Î!’ÒO<hh’l懧d&4MH7pj ù@Ò/˜Ðn!‹[‚VR²¥Á òœ=ðn€ý ØØÀ„0 ĈÔWâ H>úÔA£¯ P;0{`lÙ!Ç¡YÅ, Mj`ûŠkA»uñZúOS°Î Éw@Öʦ ±{U?dÚ (ÊëÓ/ð;¤×…[RkÁþÖüÇ[œ^pZï¼'ä&ðàx«÷!¤¥Å x>`>Z›Ð{Q0ƒKBĹ Xt,«ý¼CŒ ¸ÐnoA©†ÐÙO˜°>X>ž°r‰™´b u õ êAæA¹ƒ]äêbcÁá/Þ”pàdà7Àv€ÓçAöA¸£¢³À%uáÔ¡ÿùóR ˜ðv åGÒO à;qìFöä%œp‰ÞƒÐƒ®ÉCNÖ•jàÕÁ©'´¸4ØÔƒë§Nz ás€ñ@ôƒ­Cøüq3@cDñ‡lŒ> XIš† ô~à, °»RðŸf‚Þ0`}±ÚƒÆ<4OŒà5ÀîTö€‰ 0” } wÀãAòD؃Ž&ÌD>ð=2ÔPúÁÍ`úÂkAôPß醌xž(< Á/L&„t)ëƒå!ó-Ô0Cþ&yPv@Y΃ѣ,¨wÁ´,¦XiÉ›L°téSKØ:‘Ý "¯ZôÌš‘=T[ô(®·Æ{bT›¯g[D‚«9`AP QT40ˆ¨¤0B¢D) äÈP%ÜHmp 3B¡“€_+5$P'BÁ )Ò"]`E Äé+ (&f‘ U1$Y¡DjÐD1…j„I0€BÄ*Ð@6¡ AJ¬¥ ‰¨ŠÉ 0B‡‰â|e;×”R.>Z}k_û]~}‰ M§—Hn7bH‰]aTkÕ9= HÚ@!=O&B ²÷€A£Mᱦî Tr‚Â¥6žÊ0 ·…Í#¥³Œµ€caH'Û±’(S€D%Td ßA¼Â.Šð!÷§U<¬³*“,*@;˜ œ4[¼•g `…Dsð Mc[  æ…L½²B!ÍDHkw“l¨dr„<(eÓÖ¦DÉ%‚ ´%6B-ZDÈÀ, <Ñ$ø A´=ÆQ@0§Ÿ.v7‰ƒd„©–™òàHE²×!KX:@ª_á d<°°‹ÞD"M©9 O§9è³ç{—Y}œØ<;+Kxú*Q»¢€'þÒ%k#8FØ  Cû@0(`.A|"”» BT1įñ0 UàQK›Ð*îeí°¨¥šC|Àb€Sè ×ùÉ„ œ'å¢ TȨЌ*ýðÀ! \XÄÀ5E¼À G ó0Q4¬‘RP£ÿô-þ1Ðé@zêýÞ–w!‰½~8›–çŸùYŒ•WšA$YP¡aUêXFjS:¦Ã‹mH¡qhW¸½WV<·&»-î^b˜$¸Ð~ù°¯Ø&ÐÅ H4B"úð€ËB‹]…+ÄéB (9ýÇ«—œ ÔÀA­ÂÄ*BBV”„ 1rÔâ@öp¢Pˆ˜ZM÷%ÓÐTg¦ Ñò6w}Æ~}e{¾ïÝï ¯u3Ç}äe0ŠB)»–b"âŒ\˜À’¯T¼Ð`™ öØϦ%¨…w„ íðå( ²¶D°œ¦·Á¶ø6øwêÔÈ×ä¾!§Cˆdƒ30¾3AAI š! J Š‚FØ£& 7YPì„…ÁW£MÙf‹ ­)< NÀL¿-Jz©šnUjM$÷t ZïDƒ‡Ã½T "`‰Ä"+ÑFªRÌ·( ¸´E90¦ª+Ueµ† ©Bq²Ly¤t‰ê-M®éî4ÞE%d-•La-LU’d … Ä=Ñ ¡;`ú±ªSaM2 ­–ØRD b‹± £\Vþ†1 Ð3VX= T™M0A D‡&ÁÓ)î0€‚(2gffgbȈ!^¹:2˜€èy ü8ÑdNè…]…®P4ì÷ê\|,•”*=q¯c4ÑмÂáyh²y Ó*Š”ZI”ªà²-`‹¦™ˆ@W¡Ì!D«ªÆ3£8¹]lª£_N“‰`ŒUÉV!2donÎ,Ñj¸3ª¶w‹†E ˜bêëe)@IÃH5G’1D8t"®›'¹0±¾´¥Ugn€\MN˜_S¨(Ź?Kl…®ÖÔJ©8O ÅÅH5^ˆ©ÐÔ!½)û"¹Q[ 7ˆQJô"–K!äŒÀ-'†D†B®Z“‡ÌÑ¥ÆãÖpg ;ªb Åjn_V£‘æ%$Ìx{<ï©%£ã*¡I›€L¯h®¹U“ŽÁϾ?ÆÓtŽ=y·e®6„Œ3jJBó±N×S« êŽ.òÓ¬¦ªGaëqo#Õ”ëeN#(‹3µ"ÒR sÔ;#¶_É>U¹·¾„¢âa·Hhœ$áCŽS³…Öiv)Ñ<ð²=)· ¼€Þ……:÷ž"¯nü 3Æð&>@5y%/‚Q«1ÏWÒ—¦®óÔŽÑ“I!u{SÁþôsãÀ“uÙOØÀfìÚÎ^@7`__[YµÎÐMÖ¢Ñ0y:D§ò©-D®ËUå‡,6‚tB‰…!…‰-}<~Û8}ÊŠðvf¢ÊM WÕÍCG†°õåi4áÚq–µÇm¬ˆªƒ&ž5l ¶û*×™š½Ã ' “[”„S†Ü¤ÂhÔÂV¨ +TšS¼ø™AR ZØV<ôWB­TÁŸûBŠØˆ…ÎÙÂJJ›qnPB±21U¨½}«)®W)ìkšKåµåÅ]µô•µO4á¬Y˜X[ûÍTÕ5m52B/â<¡ÁBj¦/m•œ>™ yP-u³Ò‘ µÖ¤§ŽÐ¼bÜ¥ é 7ÒÂà W€ÑSÖgãYhäBÂS)ERcI ÍJ÷§_ÖѹJBnn2¹&" (‹¢ æeûÙe‚mÛ3ézáfV°L!,é³´PÓiÒOV »9Ñq¸4kå-åƒE¦¶o5T™ÐSV[ê½"véFf¸&UÔVA¼wNíyñª!Õ…“\ê«å :ÇN#I^â&I$Â)< P,+|V•UUâ áY54 Úüöy *¥M:3¤ˆÌ¤ñëÉ8KæL¾FS2®…ÕëM¥ëAÉ($Ž@Ƀ $%&¼oÏ t][ ø¤.±kyÎ4Ó0§QGÆF‡Š¬A‰®â#j‰ ‘Wùèµ³R»+ŒD¢{\þ”)ˆZ¤mz …Π’4ѬO=1(CΡ}­¥ õëæ¸Í_xÎ`é˜F¼ßð4*‘*,ª„d,cs­ÄaE;S<1ÈŒ 7öjçvU¦uDŠżaW'_EdD® ¢pÔÄÁÚ¶RbÒ„c{WˆÇ̪ÚTJ©Rš1Bl%ú"²ýŒÔWE„CT`Ao¿`ЏÎÊ–*ˆRQê§¢2¿^""§ Ö]gÏWGŠL ©ƒ@ƒ–N›H/»³:3Ø@$ z«{L€ÚëšJt銭çqjC µS«8JUÕ")£¥@QÝ;˜Ž¢,vIÐA‹ Â{k,EZ%ž¹Ë«C†Uª”ôŸ¢SÀ2¨ïÈ .Êãµñ &GžZZTã û‹A«·e$L‘· "Œ§wIX5½A2Â($‚I 6hP€´MnfC‡FH$½˜Ã°ctD½6 $Ò@[P†Ùk”×;ƒ’jÇë¢h8¿´*):ÏY‡]Õ© 4˜„Š@¬‘eMI5h\· $…R\Ñ)V¡KŒi‘d7:IÄó,åÒí¬dTQDRWD" ’¬DUu²”.¨JæÂ ή.@¼*ÉYY@Y¡’I ¦™ÙÀ É’I  …lEÝI5[‘[<^’–QUQB©ˆA£oèߨ€mj’¸xÌ)*áN…•p¶ÄDºdH¹*Äj©í²‚JÅ€§ÁM˜€­‹Qú‚$E±š†³…kŠìô¬Ðœ P@(±’f½5\XS½¸±WD Í 9ÜW¢é'ReNÂÈ;PGbiªH z4)Ó +b„ì(±a0k¢«¨ÂmÉÍÂþm½^Œ™l@V " ‰»"»er`êàŒO]Q€ ‰"Ë) B!4 2@"b "!”2„ BŒ¢!b*0(J!.0¬ !‘)j‘"· Y}M^ƒX×Ñß!o˜œ ËlÕP°¬3M+ `ИÜj®!Ää!V­ˆ^mÖç’¦Ö§"ø.m³B©kGï¡‚Q±äÞºÀ0’„-ÈÖŠ"¯ª»; âf€t’+ºv™ØÇtìDY€ †#íð:jYñ™îû<è~Öz¾ó}¾Ü×sÅå ˆab9èöÇ JçYÀÕG*ìÆؾ([Ö6Äᔇ°¥óÇ’‰¿é¤¶0”·ÏA‡ Egliˆ|TîK0þ×+S £3"b”̨±L¢D?Úò‘ÓÐ#ûÓ}ÒöHnÎǶij‚ò·Hn"/ZAµ¦¢z%Ͻ2šœØõaÀ=±þ{«Ò‹‚à ¶ 6 ýpÄF~Ü&î|,“ !v=´ÅÞÖ¾t^èÿF‰ Ä\RCäÃ*‚îr]ËÑ‹8¥Rµèm8v‰’ÒûJ‹²E^ˆM8>;Õõ“4§ŽhôÍV\—Á–ÀôdC©]1ʧÙBVa¸JÌ ¢îX%³*MgÃ6DO¶ÐQ-¥Àºäm›ÿB·ßGp­#©\~^ÌXƒãZGޤ¥=J—š L_R„9³‹<¾Y´PÜý^Jb …$¯^p‹rÕ¶'È~Ån¯U,`¾î»GyÜ"m=1;iáW­ÕGáû}z;m/“E×pN™ÕO…/ýG-âô›½˜»`GÌ6'‘1Y;%¯“(ÏÊÿ@€EFà€íjRR •¯|‡Ûú}e¥3X ÆbõøÒdWì|-8¦Ãù†Ñ’în‡A{Ræ Dr 1Ë,Ãt)Ë®zk.‹_5‹´†tuÌÕ U {Îq´@`ARŸhˆî²áW°'4Rüø«íÆ&J.)­Í0C¸„1à2„N5<ñüåôuê­R(Îq©Ÿ4ë'ÙnèÔDWDhtàÛgEã2Ó9»çii§…ŽÁ°£î×@U»šÇÚ_OOÚîµT»'ËIÞv·n²{iˆüÊê§m!ßBˆyª¦½œ¤ ÒB©ò@¨Àk Sìƒ[w€°nä¥:£1pà)Ž×N€0PŒ˜p¡‰††  DÐøDÄ@(â` 4^C…¶X*‘…€sдh/ e…˜ÙBCS’Ø‚(ð¾Xb{@L„¼Ü Äõ&°Žƒ’òà*X.ö…Ò~›g±µ Å¡¸Õ+ ˆG¯áËø£Žpy©­ÑÎÏ`B‡ï’"³Ð”ÍüID÷.L&ЯiÊøÿmá8cZØߌD¨ð21–5 ÅñM ¡Bèp΋:î! ]¹{ÄøZm‚o|_Yí{§ã¾Ì×, ÔùLÇSмTýO‘¿ ¨-`}yÄãÄÏpLS+@ÀÎÛY<€Ø›÷)KÓí*>v!{ŒÓɬ(ËÝ—×±ˆi~Ø59ù@Ò£8\$ç¬IPO§/péš­%À¹^_Õv•ûÕþFIõ9õ÷,iÔÍ—OEàÁ,?nÓ¿»ûs*Zš{ê¥æ7¥·c";.cZ«0f0/*i ©Œ¥£îQ‘˜4:ÛÊŠEù,ƒxÕøH'c«-–azÊ¢qÙY,H"BÏ×½^ÿxCK¬•Z~×òÔ[«±ÀŠ„Ä2n:óð±x¹µ³âR• &#Q9 èįÞ[ŽºµTü¸Å¸×ÕÒ;J™ûàºÝ'IÉ8]vHð9-qqm`É…ëi¿ø‘0"éiûÔÎrò«ñÖ+Y¥2™_ ”ç;šWll.5çåã€QÀз¿ëLXMr:¤…^ÂýŠë”O¯S® îD??Pƒ D‘åŠ Ë¥½„ÿ¼Íw1[ TóáÁØÀÓS$g<=ñì¨nê¸OUš5Q‰TªÞž){ßÊÀjÒÝ?³þj¸ÁëSšyäŒqµIrÀ©PžÉ×Ý×WíDË4ây íØdËåÜÈ÷oÈJþbõ㛯„øN5ÁÄÑôФ.]ïyn .{ÞutC‚¬ûÅ‘¢÷Q¯ÆÀhX´äØŸœ GÚ¥O¥ä|—¥ ì4Ãoã׫ƒ‰‡Qñ- bp:––®qÛ}ÎÍ;âõËéngÖYl\íÊ+¥WWZ)åaþ4°v[ Z U½EÃ’ŒæÏÆØQõ úTô¯ÿŒ+k nñŠuÿС×?ÎØ®Êmûò¿ §ÚUUS¿Mðú`õHq@Xb!h½ZMüø|²´ÖÖ&º¦­åqöÕ¼•G¥ÈLç×Õª¬Êï¶*T•sbCÊprÀ1ü®h› ÍÐs..xI]g$‰Íš‡J™cÛÐ;ú÷še¿f2„?°ÜKWöC„u÷²¨Ã±¡î×]å-+EVŽáÕä°à´Š0‚·JCŠ&ˆ[OB/ç²Me,$šÕ7Œ¯Ð[4àïƒ\(ò<à]§èYÀ¥nïWK#ÕNÿ+ÊVÙ¡ï7ºŠà[‡b¢NXì½#èfv7@ ß®Þ`ØtuiÁ§âKËóƒÄ ®ðH D8ÑóJáZñnCGC¾Lòí®mH“5è OØQ?;JO5ÞH²À˜¬rØÏô¾ë-R D‚cÒÏ5è88 ÂB–P{Po <´jƒà/Øi*¨¾óX¨¢Ó†ÅrÇáwD­ê§@@:"ý q»óᑌƒr83>™ô)m“2.Ù/®'?ùS í¾²z²à tÍ+ÅåïQ޲8üzé/„g7…DËS¿#¶(Ÿ äW~d BzJáv=ûzØÏàèä¥q .ãÀ‡ h =³ÚÆç“0ããùê=ø1J!2‘í7#p¡iùªG©`âðú†¹çy:ðªYA§À?2™î‰ñ+x˜;:"£P#_ä»aI^v§‘5"™Ã–aŽÛ¯‰µâB—1 Rÿ@zFfëu¶²úZŒVø+÷ëŒÖ©ÒD2õŒD`÷+áy¿ñê$¯Yypô5o‚ÁLBû™z·°¨Ï±PËǢЗ m°ET)àú ÿðê; ’þ!À·*Ÿ”W×:ü˜C‹p_Ò£Õý©VOÍÒ?ði‡jŽ»À£¸«o˜lOí˸ÏEÕ\4» 載ÿýyý·®(»kµV¾”Ƨ¸TÂh Äj$qHVE°H½árHÛ·MwrdXÁ´6()ô·¼ÕÉ,ù |2ïXÂrÙ‹t±ƒ0Ÿ3튋ÁàÁ¬fÌC£çájšM˜ 5×pžûâÖÇ•h îÆÀä^Er'ôÿvÉü%âå†ÁÐâ#9(­Á2ųnÈT™ül1 B3û˜žkï˜=k]!ìd;Nø×eí| •KOgÛÀø¼V¾‰°_€2ÿÍyåoêýd<'JóÕ¯‚ Wt5ÇZ?ºáü‡,ªðüô<–=íÿºõR³˜¯˜šßÏË›± z@¦¤Íäí¼Ñ6ºÏ» %š©ÒmOÚA×w6`iBÜð½/mvA8x¼JHýœß&ôý×ÎÚ*Cú Eã S\}; J åË1[›{]TB Î2íݸ I(XB&„ß'—‚R÷o¬è ($Fe°k$  ²NÁmƒ}¨5Õ ’ß3Ñ º~,å\Û‚& fQ%(ú«³œ eÜPíQã.u†3vj¥Ÿ]¢&·‚±è`ÊÃcåÞ‹bEÜGHÅ¥l~t'å•Ôž¤h Li'eÎõ!_ƒÄ/ØBƒåC¸Ì-ºÆ&ÛBkÏ/ÅS™‘{ Þ”ðm˜'L¢áÛ=ø6`#—qâ µæEì1lÛqgè6{ƒÀTU© Ó€|UËJ“HÞcÓ–ýøúo¸æ–¥Ší‚£jã¡ÕÉ)u@ÓYï%ÿmJ©çcð Aj{©€æq´»ÆÅÑ ûUãxÊléÕ¸îŽyfíóà" ¬”NÈ€ 2e@ÐÝ Hìó˜,S¬ºgªúÏäïùŒüh°–íÏU ®Ù‘Ý‘‹dˆ¹Îh …YøØ©›ª…W¨û³ÆâLÝ™Ëåƒm!{U‰ƒ>¦`ȤQw“Nã,XZ ?\¡GÖ(&Y}kæV²j©=Ñ:Šï©JÙàPÜäÚË­‘xÐ[;V"!½ïrhïl¦øôU̬!7xaιp3}ÂFÝ)§ ›*E‰06íϘ©?>«Áp±Þð %hï+‚~Žøð€V0dô-x뎅1ÇàtúÓ哈-×h½ÏåE[î½hÇZï{{$ß--3³_õ¹þ•s>÷¤Ó9†Ö©õ?÷LõzšAÆ@b; OZ+_¨³&ŒQG ”Ì4"¦&NL¨Wk§ ½v«ÎÔsƒŸýçe->¦;Ÿ›-ñSÐÑÞU@}/tå´Òœ§H¦šoç(§ßv¼Üáûô2êw1¡çñ´t8“¤ÏÌÐÌ(㢡¨ò°ù©Ýãùú9qE8p•5Ëô’ÚÀz„@ E˜D2dv(ÅS@B¯D ƒ°~y„£þ¢ßîÓ‰¡çà%P@ ´9X%¥6ª(¢ ß@†WÔBRéà?šö<‹ÍP0ÆàÅt¾òÐP®NtíEð¯#ÑN$uö«>ÁÃPÍý TX{ð2F%-”Ý⌥ÞUáʶ?oá€õTœwÉ´m_5h&xƶà w©o"tHæÜÅÑ')P‡‘€r¶®cé¶_¼ÜˆùÀY:pÁ~?÷$z÷ë²gËçZ1lÓ%oå*ÈŠñÊLts"Qé†ç¢9Ì–T¿Õçf},e³uål¨A(ÆZ~(íåêVŽ’ò§C†®Tg÷ N (q2aÍð½d´r8GaF ¯æ JU.šåȳ¸pb¶öíȶ : 4v·ôüGc¡Ÿ•E«ïU;e1ÅïÝ–¤}'•$ˆ½Q»Vg^jýÿ¼½0<ø8¶ÉÂýÁôA²™¨ _Š&Ëš?].˜Q÷¸±“ì‚ê@ø‚ rÐ ¦üQ0tîß÷ð­Ô‰àôü¼w¸ânJ‚Qö\f¡É üÀyò~/(:”‡žhFÜÇ6I×dD†o0 "]÷•”_¿&÷“~“ó íöÏo®fšÓ’(c{ù<É4…¨¯¾Zòâ¿àä"À,Ìò𮿳™”À\@!˜™,A rDîbó®Šu ˜˜´ ”½Ý|/Ë…¯r÷êÁðXÚÁÛgJn[]ÔøâvÞa¼pèE"j²“¿¥‚{&4J†·‰l¦Î­`ÿÃïÖ³¶€p<´€~ßí `ŠGÆj.ÔÚ~­ Ç]¶(™)>nަ"¼4¼'bKïâUÿÕ²¼ 9¬3ÝöbJì‹Øy<ð äfÜ´=G»?åùl™X‚wz“èà ¨D·M- bÁ¸€‚ת¨)Šæé«0=ÉàÁ0 ¯ì, "ƒØÙàåˆÔÓ1¯Ëôñd*K´4 É"ÁëŒP?¼àpD¯íŸíèzšL6Ç; =ɲ«K)wøÜr>}ÿsT„¶^Ý:€K&¸¯€3­Õ(ôÆx’jß{À=ƒ1ź¹$N6p¢rÒþ‘aI¹ˆŠ.ãªDÂ|t”±=}ÝJdП†¯5Îc B‰·õýÖøœ)DTì/³°ƒ\o=c´ 3ßÕR`!^f“Î:ð@$ÿÐöÇÒ§Ï0²r—äŽp~Ä­©8!Û•TòøÈ®@GæüŸ°ÀŒ¨½]Mêê9sÿÀB—‡¤Þ§|Ö`‘3ÅÕõú•MØšñ»¤cÿ›»^^c3>Én2‹»±ìà ?멼ÕL2NãM£î9úK{Sà1°Š–›WV ªq1Ù!á|ÃÑ]ª_ÀÀ WÞ:Ön»1ƒ†üE0ÉœIØ"ÌÙÄΤ™“’'h9á8*«~g‰ëv¬­ çÍ]ýn÷ü¾;_ìú=Ó–¤Ö¸¥ªë„˜M_ÆÁŠöÅÕiüþù} —±O~2]\Š ÄÃ¥äBz}ýRäQÖpчkù½äj T‚×4пAƒˆoÉ,ðF󔢟XHÆ&;Ä\;=îÖ^e¸ ˆÀØ=+Æ4åú j QHKåÖæ|ß<‡=2ÄО†c®€%à0P\§PÄšÙA¾ÖïÑKÑ€qÈû[˜… Ä"ÆOˆ0ÐR47¸Qt@„„ªuË€l:«g4$GsË <ýêƒÁnÛË£s┼È^LÑ©¨Þgï?PL:üëÄRÅY7ßõdû¾ÿFÏ;±Ì[²`ùÈYGñ Ø<Ò€8e3`àPëd0)]¦EË÷ŸÅ‡›Ý|ôˆ%Ò|m&Ú˜±è›[zèë .èóê :`|òJ%gÏÕA þùaª€-è©lòy‚­ ÐY$mc§ÀK €·q×n^]­ÿ+Jðï«,êEû]åA¬™ ÁO„bÜ{úœáù.W8‹+)-;ËÖ$‡oàdV¤†Òø€ ”ŽÖÊøW’W%áĬҲW§9_w• w¿fŠn¾Ë zÈ¥{®3|q` œtâ8Ä y]*X}·#r¸Li5F’n0çš´HAœD<ÆL”8X!&Ïliç-7›àž=d ô¡å.Jâ!£ÚMR§û—RG;1ª}œÜÈU© zW üŽxã‹ we‡ y•;­äcÜNá(wýèNMÞ…]6ªB+ŸÚeiTeŽ=hE% áu{ƒ Dt•"S= Á/TK÷­Né7>Ð èb\×´ùà è.·ê/ë%d ¼¡™x®Æ ‹™4ÄXN§\83ݼ‡“Ä 6ìÿIVym|3>L±˜ÿÙÿÂÊ›Ÿ/öÞâ@~5?¡  ‚ÅH &õ!kõ—êLe¾K¸haëǯ(€ìœòänaeLEBY¤øî%Ôµîû„L4Ñ5Æ:elåzܹÿŽjƒÝæðVÊ\Ø‹¨â!x¤)r±ÈŸGØý)Ädö–÷ùóÚ®ö§¯‘èW¿ðàžªš¹Gåóµp…'\Ö,…l"êÝ?`ÜÆØ‚ u‚—q_¼2êm¡0é8Híë¸Ð¼ uƲcœUdñ+RLŠjN*¶‚‚§Ñç”ûê\þfÓiÕàŠ‹ƒëOgÝÑæMŽ@õ4bªœ×“,–í¿YRúì ÿNgÕJä7~ÍpÒg91¤Á@[`ÛƒY´3ÁõÙ§°S`<ýѰë¾:i‘ŽïH¯{€š6p¡_šµè'gêV=<>ä¤L\‚:4ÜOµ(â¿Äu‘“¥Þàiž^€S³I ÑÆZBðáS² ̱tÐ^’A"H@Y³1y7.X{(:¢¯¨û j U/ÑÚs N>€†?Ìü!A®”P(‘tŒVpO€5™N€H€ €°@$ <8@2H­Ù ‚¡™‚/¶Ãv@AAnëºv‚õ+¨ô°JZß,tj2hˆ]•¯á_Wïlˆd»7c sú-¬x0ÛfŽaÜÉQ®0x­”XÏmÐ?@7ÔôõöÓÝì”ýšSC®éJf õ3ËÞ%*µK5ü|ì®çi"06±émèó90JNg·;í6O숶*~ô ølD(;çŸA­¦ZªŠn÷Fè¡B,„ƒ½À¤W.ÝÄz½Ê#´cÅûIQ4V„Å$ìZÎ|ÚQGTO×w]»Æ©ò\=îÛ9µµ=fz Ù/ 0,ö Ó-Hçd;çjˆ€Í"DVÑNí Ï€€1|nDÂ5_xR´É¡ƒÐ‹óúgŠÿDÅ1ÌV3Fž3$c4Hö­å\­î8 ;òËŽ™ÄAM¨hÕ?Ÿ„.€ 2+Ì-‡Ÿ#òqy¾s 8˧ ¾SDýP€‡Ù1Ãú4¥æïìÀ|Æð’M£ÍÐ|è©o"€H_qý7èKø€z1yÞG©'E ™"UùOk™ Æ@§ácÊÁÚcÚ £‹åÆ‹;­˜5t ç@Ñ)Jÿ?AûË& ò^2“£·aîõCŠ×—™®‘DK”¤‹ÙUô%’p8¯9ÜQ€ &V~Ë/@§A ’žŒ8hª‡=,ãËäêÀåŽ8þ.ÒÛņ ¿"i×7A{þy«¬T¤*ïÔˆˆ¤E§¡”‰ƒ;âHîói“äôkÿNaÛ7úÔ0¸ÜrH¤Ëµ§˜žÂpcìÀnØãÝäÇ<”¬þMˆg´Ú¯C¤|^±ü—\Ï÷?ò™PRÞwD˜lXø  m–C g£.©ãüéc!´Ý"•» ”뤂•eÍæ4 Q³ÑAb@ ÜÒìè,E¬l}_ ˜ÖÀ/Gž¹X.>k–t¿û¬É[ðÖ†“MÆÊ'GkÙÙ£'Þœÿî‡ó¾¥Y\Üɤöϯ}Rj—»%f8ßw5‹/B©C¢\¸ÙÄ·R® ”¸94Àå)£ª¦pþßòÁ¤î-à7‚wº~0×ÔTîÊÿŒâpþ…ÐÃ0Æ<ìðYñ ºQxñMí!x`X ¿ø½ïçƒÇ.vºuA³c“…¦ÀbðÐ6+)i:«eBkøÆ ¶íç9ˆ×+’ÕH fá‰$ƒÜ¢?trþ….E—„ÊÖì$0HtÃŧ±q†Ôl³Û¾¿“U䊴^+ íCOB 3õÉó¨!>.F ¸>·Géþ—Œ¾a(ˆQ[ç½-ŽÄ´ÍY†0ä_ÔP µ£À/·Û†eZÃW …ÕFÆ{ni€´3õÿsIP0º>¯kaûl&Ä©@¹\·¿ÌM§"w^÷‡?¨¤«!/ ž¨Pcî¶‘ëx2\ºdÁ¢šNBÇïN'cÉÍ[ª3¿hr4Ì/µ×y½:â¢&PŠ`@,ìíx,dJÏêË­ ™¾Š¾Ï…µç=°ÈœŒ˜‚Ö"žó‘éúŸç=<úeA ÷¾kÜ8òPx€ø ×„7zÛTª]¹'cª¸yü$ ,Bùê»îFôgSèÑ«B…s3RŽ À­Ãv'á@:ÚÍ;§l¤á8팜HÒìè`cÀ"Å5rû¬ú Oóçô'cšÛ¸¨†ú„ÃRšíÀOÇFi:#¤!Š—H½GÚpÅEc#­Î8âAþT²éîüŽYÜ–ÂKâ¿•7óøi½•ÃøºÒu÷6?êü?¡n±B®¸@õ7ß^5#bÎaÜ·¸Ü_Ñ€8ÓIR ¤À ~ÊZ¯&ª¢—}AÞÔýΦBa¯U>mN[r´Àü@Zà ¿ÁÛÁ#÷‡¹[9KîŸ>n*Ï¢KÔo¿¬õ½wXB Ã9“»b%‚ãÝPcó²Ù:Íÿtþ½’³ /†ç›1ìÕøn"™þ «R™?ÍÂl“y|¥WŸ¶)ë9› UzÎ|¶  ´Yó:æÇÌ+Û–ÊÛTxâ?…êÊ‹¦ÄÉ׃î4”ø”àœKX7ÞÒf`rãž§#<¶w ÿÝ>þ·ÄÛGC¢õ.Õ>¯Þ;¯ì<ÒÌ‘7àGî’hâD¼ ×Nù¬ßšnt}<†ó ž$àVe× Õˆ®'ã0£©>2"áew³G,‚VW“ŠéÅmÒ9ö&qÑ7i‘t 4 DÈ ,¯4 Ä`!ãñ3/B®Òûß^DA’ n qhýÑ.ÓmÑs\¦åÀ`Éêêù٠Éèý‡P&è4ò[T°üÿ…(é'—193½éV/ˆê¦q…™}Û­+?-Ñ4u«ð¨Fj]1ùV²JûyÇv]À%Q¦H3§ Ãsšþý†}<€Sjñ?—/ª‚Ø8ÝDÏú°ì À”• H=ºàðPË÷ƒ€\¨Öûh*:ÕŠ}#gÊùÅvzöW1Þx /+FKµcP@üåQßnîãF- Ž~àM¸Š‚Ê{K¹fYÊì¯XÝÿïªqm’˜>7Ÿ=Õ‰9/ýïñ\˜Brÿ ')Á¨K˜yb ýpâÀsEnÌ?Þ±¹•_ήS-Ò{|…fj‹&‹~pÌÔ = ®Ë/´ÔćD"H÷DÐæ·kóÜaVOchÉå€8xb³/«~ú¾Æ ÊÀœ(¹yÀöwU6ƒ™Éã*Êh f©|– ðÀh~F¢tÓòôâÍtÛìÂ;+÷tžàV# S2'ÃcæÖi×zź–·Ë¥½¨6Í}{Ö…Âîâ[©‰™jdõ /ö;ÏÔ(¢#ÇÎú½‚>P|* çÊ!Ž  7åðÁá‚W¼ŽÏÆÇå;I›Ñ¢€™Þ3Ñ(:xBjçõœLïi=ýŽ"8÷¢1QHUôkÜXàO¦m—3omäP¸¯Õ›–øá†ìKUk*ú0í+Âqêòä].¡5úœrt*WbkA)y÷Óx»äÞ]ûâû te¨©üõÖŒû÷êJoR¨íÇKÁÍß(טmåcE<6ž[ùp9(z¯ÀÝzT}û¦Âžìlèt\âDØPئbÉQ”ÃÁíÛ-Ó6ß¡.F""/3زïÓD0³ú“šÜgÞÄ©ˆ ãIï¥, õ";(1®À½}{¶¥Ût ]§@dÈc)8f ûS¦Jül;Ëvò~¶,DøØ/ç r”Lü}3Ñ¥óš_ÛÝÇÞÿ õšØ‡e/q7ÀÓÊ¥1ó† ê'”&ô¥/ýœŽn=mPq¤Tù)+ËùçSöRb"Âë|’œ°¶@2& WWÚôš·óUÝg/'¯Gb…ŠækÑΆb‘Âà 2"ïG6ôŒíÎ8ºìà:UãaF .ÅuˆaÑÂ=ç Àê”iIǺ„QŠ#sFì„Ê£wØ`X¹.ñ“.—V`I ->î]qríF"ÈŽ®L«yË>€”›ž¦ÇrÄB³ ›jÒ2^öÿ"^.~/À‰$Eĉ·SO~o«Ò†þw/I›wpμMø=DAAðËYA¯L\°Çí&Fø ’ ©Âbø8ûòGÊ·‡Ç>÷v@T£ÝD’€ó0Fúã±VÃ"A¾ÀWPM3^꘶I./ &þ&X*%ŒÚŸáÞO7áœÛz:~ã>H4ôóÁ÷WTÒ—Ð}Êì:¸C§$ŠvV Ö;‘›éBäÞw¼>_±ÄKø] –¸úÈH’^Ãηc‘·)Q ^ä^Q)WÃÜÖA޹Ç$“ã=YAHQÇCÛ­Û4N“MGžkJÂC’ôâà÷×ÑÓ‰ÁN××$šN ¿¼Á?úÎqˆ¨Òœ°ÝM‚Êp““¢U/BY$ qýÔkí~Fƶì5Ø\" © õ¤gæú á¤|XäjûÛÿÝ`º‘DÞúdHOîMâ‚x{“Ïè܆Fäg£!§„9ìu¸ý÷çyàéŽ,aî²-¿})8XÎu´ÐìAÓ׊ÇÊ7ù<Ük±û´hÛ²žÎ—²¢©e„6ÕE ìŽkå}x5+Ù‘<2$1W-[ >ÊU‘49¡ºà¶ §{²ü‡—³»Sä3´;wiÒ¬'Œ®F#—Ãæ¯)EÔWþº´—+tYpàþÃôƒËƒ\¾†9ì|ÀújlÁýAË®X¥Âût¬6/,O<„ð¡Q'÷üà˜ËrÞþ*S1ã:Éü°’¡³LXk½A!ÎoFôþ×ð1ž¥d\EãjÝBÁy¬hü5·ÙlÌ7'€T7åÑ}±(…Zމ   fgª¤ÇX=¯õýý|÷œƒUÄyfe² c×ëC 2l·XìZÇÒ.žkºuèWŒ)ä/Y°Ñu0|Ý&‰TáQÖÁ£Ž*éCÿm¤(êáø`𧘚Ñ?aâh¿±{ “ñúªuä·žæuÔëÀ9@”Áúiˆùà ¤ù¨-.Çó‰çBóéIU0D=È€XÏzæL9›ê9¡gœ¼x ›ùà•}ù‰³Ö…ë˜,Æ{&ÍX7•ãøAÊIk'@ÿ$_ýgÛ’Y÷&‘c~NØ*ö€ËƒÁͦñŠCe Þ3²mâ&€@E:Mlî^e&‘ލjîûåF–|oÞùú E°² ¤Rî¤ûܸÌP¾Ç°÷àfÐipßôÚ · LÃû)%ÿïÓ §Ô ÂY€¤|ùÎr0}DøÍ‘Ž7¹ª}É(ó®¯È†P±Þ×µ¿þ!ÝZ»M†§/®ÕŽø¡NÑWב1\¨ùýäÒÉ>}ï7Eâ#qâøùÁÙçh9lÏímÁïÁ®ÏÌ.806%¥TSü2ðŽÑ!P)íw»>£ˆNÌGU…¢‰ûŸL_ú>¯]åë;%îïÝè,«hõ%8)JÈ$Yû«™Ò#yŠH5 oÃŒµìw½zl€ÑÍã3ÍdâöóbOÇêÏ…§$,%°ÃÞª¦‰WCÇÅ¡‘o[bûm:Ž4©ót¢bvJ¯Ôa=6ãÆg2 ðî›pŽÕQ÷27LŸ•ÇV‘µ#½Smb2¥”é†5ç]Ïå9€ÌEu,©xœfk dL ÷ì’«} U²ÈZQzÄä/}Ï?R ·fè ïy‘ËË×éëiÓ1¨žŸðb;ŒŸú»Va§h£Ò]cøA¯ ÜŠ±ØùÓ¥@(@ 9 Ôt`n°Ÿ1í_ A¡å´»¾i¹P{žƒÑÕdkd—Ÿk+û7?żyUY»›§¢XXu”Ï3´„Z8èOnÜŠ€$‘—â*UQAPŽ®±–æOCþ^Ó¸¸Å"Ù;€Ré> "öƒ9¿¹kæb™ §CgçiâDi#b¼2çØ2VÀßÅINR9EÙäw4 âªÃ¤óêjNÏJy߬ö¼§…äö3t1ÁP×4|'±~}SëðsvUÞàouüZÍÓ˜ž§XyñÎïÆ@ÐïU™pú?$—¦l¡‚ ½p&C`˜ÊÄ»ç|ØøißT*$Aز&â7ý}OvÞEú½ð0š§k͘±Uù ßx÷ãTúË ªq „ª å÷ÜÚ:TÐ$Ò|3Ýt3ÉšßF޲ÀÌ>’xiÍЧ°Îí\vòÜ¢€=C…íFìã?¯ ½^_Ö]SÞ|Ð+ÇÕͦÁ:ùùê­ô¹ÔËUûó¤&¸–÷#}°+‰‡wU…ÃA4WqÈ b鸚`p•pÿ(r´Y"*¶`!,š,Š$$RAL½æeM‹R`jñ‡$ /äŸ!ñ95ÐlMç„0<©²þ¨ñ1ˆIJø×ÆGÅÂÛvêåˆò¡- ïƒK‡Æn7pÝ©_y*~«ïôªô_bŸTÕhk€}Ï1€d“ ›ÙóœA$Ȥ¡Þ§J!7ÿA¹ÙEØ “7–û…Os§ŸËÖZ°’~¦“E¼ ‚3Ra¶å¹Žsý»è¬\«°çt´Zjm˜Óq{h‹š7%ƒ€Yvã6 ~}„δ% Èá¡òøJì®éYÍ©ßG¼­SÊÔŽ?Û õBÛòT\²²/ׇI Ü-×ÿg}ª4âWÒóâ$™Kƒ½}NW•žÀ¨¥D¾>ýÍd ²"6@òàVA°¡”Ø ™?Pvàð†ŠÚ® y¾T/†ž½3å›'Âu€Ij7é;@aà ÃB”PޝÛVûᕪ1éðLl¤>.e‡O¹oa‰÷{¢d ˆH-ë,ð$Ú'`X¡‰vlRƒ“´ÿÌÉÎØ‰ÉÿN+…T!>»ŸrDÞt¼'²ù-m8±oo½`è\?ŽÚ×d}tG˜‰Â¬"¢"ŽéNÁ„>rààh4|‘í{öÎÙ ‡¨º=¼ìn$„–u;݆´†æñºX1¼ÈNÐП[ãxèäž”%Wäïè0¼+_#Ž¢–“úåVà£ÀäksŒ#Q¤`L×)O(€Gø‘áágcÅAW}]9Šý¦‰ƒÙtw=´#É%æ@A„± ày>}ÃÒŒ£+YÓ2Ë3wþPfòuo=ª®‹àöívk ¥Ö› zñSWñ˹áDº,7ß÷O+=•!zæÜíã%€~ò"„Ahº&BüÍ ë¢8d“Æ=¼¼ Ø;ŠzMKpd5¤«ƒÜí¡”å|¥Ëô*xZ+u­¶‰ØÀùÙ\È¡á¥pµC‡k A({Qñæx„…·éÿuÅY€ÀåúÊ}º¶&„øÂ"+rQ{Yoâžq*SQßs÷ÜäeÝ2_cÿÏm¼ì Ë]—”$ø9Ù­?­'r…mÓ%pL=|¯Œ "†¨ yº{ï†ÑJr\•U+–CÑhî¦HMã —nz½…w»->) çã¬'QcZ Œ4{ýI YŒ>Q K4ÖÍ[§õá0·Ýc¤ioOó’öì ŸG…ç¨gjµrÊ$l_&<›·“8qGÇÁëð¡¹D’Ü Òâ$ t¿ËúKXT° ŽÇEfçÐû™1±'"A®G”ÍÄßWd×StLNßá‹#ˆÛ¤7R½þB!8&89o#„Ògt“Ëç¸!¨ž[22fØãBŽ]*K—Ôa‡J@€W$PãhÒoW%ªƒ·ÍŒà03+ç–ÅDô0޽qL_ð@,“ÖÃ`Í,ß¡ç·eùª5ýÛ(2 ¼?åóó—¼¹—½çÑûDwçýèïç… ¹d*Ǜȃì¼õús_»LJÂØøU4\K>‰Ðte•…Fþ˜åŠƒØ©bwMÂh]¡·/‰I_ÙÌ®D oÖC/7r«Bæ:¸ð>²™b¤Uˆ“Ò¨M‡ûª C·h±×Û(ÑBr½ÿg°ô±¼Õ_­ï·ùÙ\241­ÓÎاuãÞÓ$ —10òäºÙ?ç²Þ Ì Jùö¶–³æäAÔÀgÅæ\ƒ]®¿“m”þª¥+Ÿú£§ñ/Q•ÌÏ¡Öt¾%BsüŒ?Þ–˜”¨ÜvYŸa×êú 3Ål¼ZpXjgC6üÏ‹ÖLð²hAöAöGˆ šeA[þë|…ûK´}&®×É%ìý«RZptF ~Mv¬¥®4¦öبÌ&TßM¨o^ñžv;ž½ÒE"ê(%ŸãšCü©‘A_ CÄ€ñ›adq£ }Ìò<6œ£v¬-ñi,BÈ%HåP*÷¿¸[•ð½ÐÎþÔñf™ÏáÅlW'DîT½Ör9‡šÜ埋TÓdXÝæëT´æ""k@mÏÜsê?ƒCÞMž—Á •¥ ºþ…ø=4°¦}‰1Äëúû}è‰'î¿>'ÑÆço% cºJôËĦ½^χœ2ÛQ³”Ãf.üÜâN| Û‘á•Ï)hÅ¿£ÌˆVÝ‚Q°Hb “?3×çüº‡6”%NLÈŠ¤âQº‚ÜŽAói[þü¤’… œ¶ -§Ð«Õ ýc=4¯Ñ4_1ò߃ôƒ¶~Ƨ˜Øºskihß—™@%Éc€G._‡^p¦ ªd´u[ÒÊBù.úe1…Öuç¼{{‚gÁgXd1íñàÆê·ë^tk8™È –Cks@!`¿Ù fØB\b€8¤qKBpÏg·©HßÁ9¡•s^:5ÅSÂOÖº éÅÆŠŽQ¬«ÄqÛÏÛ"Fƒõ9$wèGõÀÛ_ù× 2†øB|noöÓ<äºK †ÝA›¡ö?éc±ÖÃÅÎ>Ã¥‚FB~pÈkHæjàBšþ¦>£ò2ŒäYƒÄ'Ö5/Û‚„ò™Ç¹qÌ%½.Ö›"Ý>ÌwSÀ(¶Xo–´Þ$Ý­:W¨/‘üG”Fb*Úû¦û?Ðw°NéÌYÍ ]ê·ò'd®ûƒ;¼S½ää ¶äŦ˜€>K—‚$ðc|§Æ[ë Mˆóo§ËJQGG"ô£¡Þž•n(ƒË&\Ð=–ðƒ}å…T‡J²92ðµ¬d8F©:ßþµ¯±<)Zˆò7Úí/,¾þ°Q7'šlY:†,g¶êÖSè+3ÉßÌÏþÿð¡mäb²+6‡1D”„ÖVªÓ›y„ëb§–‰váÌ)üÕþ>U…Å¥”O"wˆó=0k4ÿkã±õ€ÆÓÔ#Ž2N6÷ó¸–_=•’|èa±äAD UÖ 3›žPšhç}:ï8îê­ g.c -û:ÉA¾Úêí,µn2ƒ²€A³}ëºUGBïRí"ˆ Ñæ>Á¿™b{ÌÍ”á 餡ó‚,í×nu™ôÚ¾5z’DÐ`?@žnY‰Z…f‹ƒ´s’ãb4|Åi" õÇ@>ÎyºÍFÕ,Äþ„¨o€ÒÅ©æ-PŠÓç¡Y¬’U­‹V“GEGZÄMЋ`q0ñ [Ô¥ç)Q±fM_ò.•ºú glzÙœÌCG›´˜æÊ?ËSÓk™¶ø¼ fµK<{ÿ™%éÉᆹkÓŽèçs´©½¾‰ƒ·òkûý)®PwP¢áÿô±ªæñ †œdqúÈî´Í$Ãë…HvöÊdË b*›œÏCÞ¶xËs¦„šniiP$ˆ…PõTã|)-,‘¯uЉÇ"Ѻ 0´ì½¢½›dáÊÑ»¨ˆè<¸Ðòq°œ¾‹Ê˜5òbÛ£0œiJ¶]Çß§œ|¾ŠoyB»ˆTóªy )JÍGä-„Çy\¿q°†xÊžÌJ Uo{}¯UÜXz>%÷6™ ëG–&ÂgìÖ[­ØZžM?“èè¾oã䡹G•åu{=p>Î)õt[°=´!yÖHÜÄj?êûtL®âœQ@znèÈå`ú°Ñ N#ÖéX<›®Ye tE1·K6ú¦ïQ ±¤ÏÀ8yÂŒZ;(hC2ù’¨ÒE~ dU@< “ýô†c£{401_Í,Ÿ@ni«SLNøÔ>À,8Ât(¬]llãö‚Z¢ÏZ¿×²¬AÖ.þ +ÏðÍl&u¤ºB3uíW?Ö‚æmÇqÒ5ŸZK+K¢q܈ø„§†Œãú»ÇHÉ•ü¸8²hZåõh›¯r8SÙP÷ Gå=–ÆÁÓÎÒ‹Ü^§Pýõ?[¾Ð4!©‘Â%6¥9>8EÒÓ9Ÿªóe×¾?¬ÙU+íV÷ùóé @G¯S'ÖŒbè.÷áÇ{°Aå}Muv÷åw¦Ã1ÀÚâ‚=#ÿ2 @jKCø‡ŽTY“À~oe˜ ©Êf)Y.· Ù“ôVd)‰dB[e€‰÷!‰±Ñ"0 \} ]Pà^ÈŠQ¡ÿÈ»Ía¼å/,J\=ºiúcê·Sø—ök´ÄíßýL˜øX¨r”`Mî`õrÛ~î„«¦?Ûl%K@tݱ#·—ì?¾¿=’åôþ}X+þïÇ .9÷”t0ÇMì5§ŒÂÓõ¨ÎUç8ÇjHIÁQ; š¤?AW -É‚]PT–š}‡¼,yeß®îî<-R:=ˆ†é|Ù‘TaÕ gK"S—Z¶àH/Ö.BÖ¹eó½Z_2Þ7² ɘm"K 9:“@›_O·—&«;V)ÆÒÖHñQ;&@¥FìÎTùÓ¨ k2tr´çøÉ‹¦ïþìµá1Ôê¨WV3´èPÌÒâZvÀ¾B±`UîqíÇlº zì1ã§ÂófßK“>€8,IdÝCõ.ÃQ–¡¸'é·u MƒìMùÔ °ŒèU«ÁB© üZ".ÈlDØ~ÀÔ‡}§ö€Fóõç©ÚûE/Ó=É@ 1‡ž>.!KóAf> å óNé4é÷+õ®Mͳ¸˜]BŠº^’¦4Í-„™C_Ë0—eé´{4’Îa›pBãfW¡wæ˜qOòš”Ol²xe6×7%é3d"’¬›·CÜ=6É•Yþ\z W'A£Œ:–ñß™+$Â}÷à¯~VÇÁâÚö™„A Q­Â?åÑ÷%xÕ8Ñû|Ú¡ÂðëòM¥ÑnÌ(JF5vb‚JƒjŒGvúp ‘ üûÔv÷P–&¼æÚÓ;äH‰&øg#¹h‰]ƤCdõ!€°QüWn¦1ž`Vô²ÙÃGA—qÔ#~b\ÂÀçzWÛrSÈÀA¥R…"#‡ÁE›ðÌoÝ2"†À¹hA™Ë½ƒ›ÒkqãUAŽ}œ<‚ XoƒQÉ4õqž@.¹Ž!Ü!LÐT¶Ð\ †P`×G-¦– ž•^ã¦ËNí-#è™Ç##‘k."'wx_r_\äȹÖjró˜ö·X$(Œ Xœ)ù%Îd6>‰.#ñCíkºo„$Â/0TµŠ;!ÜUf;éGM@|¹Ìe¥+AÓ“úR$ }êajhÃ|¥™Ù&Œ¢¹¢uÁP.drƒ1Pö°œÇRP}H,Ð#è%¨tÚôBmn5a^ÑšØ{úìl1å¸9¼°Á£ÿÚ¼¿’›¿‹•ò/û.~–‰•­NžWÈtÑsÇ×áì¢%*;¨pWý&òuz}, êøxã²ÇÜ6õø ­gåÛ–²¸ƒuí2#³Sé¶`Ð+œ %âÕô*â@úÕö<ݺØ.Η›úõˆx@îÁÙƒÕScÐÉÕ¿ùÄ{­ r¡öK³ì—ÓëüŠrb(~r*2ÝaŽ ›R‡mŸ4‹æTs€ôqAÆ„ÿÌ:ËÛ=ÊS$1¼I­ÜG c ?+'ÓüQêéz”"ªºoiÄ:‰fàËÍüÛ“S‘Og4¦«ûµn0bÅÁ˜mdí„–/Rº†. ¥²5÷ gJ’:è !û9ØÉ&›ø«4‡KD¢„Ô~•Ÿ»¢ö R3ç &ä²ù¨a´!…ýacêæ©˜[:¶ýøÍ0þÐÓý}]ÅG\òvN?ªÈˆÉSòA¡àNy£ åÓ¢þ!|«9ÿ5ó±½+“Ä@O¹”ÖGýâ¬(¸m©ðõS¼<ŸpV*Ÿ‹D|´p›¾à“cžéjÓ?JJt~Û0qcr÷ ¢fsðcÑã@Ö︤3ïwPlæêhÕF<Äù‰ß< :Àt€ïÁ±ƒÛƒÿ)jÿ“´=Œdœ°*Ñ^i Íl.(jØ€eÃnpHîö‡¡-¦PÔC„é4Q­<…"i> ¬E;²9¼ƒÉæå`×~eÀÞç5(ë’αÓ1"5ó¤ªéû˜ÎJ€Ü«'ºLŽyÏÃÄWéT_¦Û"N¥áBreHÝ¿æ4kê–3Çõòãa 4 ÀzœÆÍÅG"#AˆáÔ3ª iÇŸª!ü1XTmØÿhÔ€äéÁ27q›ãn´!JOÃinœ^à BI;Â*Ðà£5ÈáªMÉ&ÓèðAl)°a­,ycž-‡¹°5(`uôn9 €¤ÀËþç°¶$à-±Ž‚ò”åOm4j-¸¬AßRhŠA–“§jÙ æLŒQ UŽ‘»~[L·G|ùh±¸¯v£ÕÖ+Ý 0 ðÈq ûåÀE6%+¹œð¥èÆ›žäfí-ÒÆÂY¢ŸDH°$k¿M?ϰúØ$¸ñN¹Ï2.Û—ÃW[ÏîÞªƒëûõ?ŠæCȯ…lQdú`Í4 ¥×¹KÄÂê9ÚTG¡Ð³Á–ãTû´<ê'erÞæìa8~màÖ=…+%DÔBfZÆ|Å‚¡B”]WSNŠhL…Õ4â‡m#O]3'è1OEyQz·™àzŒÕìñˆi¬Ï 7€amv’dáý&;ú0:9þÒ÷/†ïúݰ¬Ü2Õi|í˜l¥ÎBÖôå±lîNà¨0p×Èb}Q'ÄdÞßÏòE7eØŠO]Ö#EY ú|êªqîZ~åuå_îø6÷"Ù€F©FŒ\r,}5Ñ/€ä÷æNçÿ9¹ƒ!¡‘{#ƒÌ+Ò,\üº:†’g’R7ú)2ê³éAadR”…­@°fš7¬´ háÌ5å*k„!€ô‘ùßSá»ù4/%ðØ€H ÷¬´ÓÌœg¸ 8åvÄyk:jULkaëÙ×ËL`t²uªI/eñ’DW×}‚Cò+É Ê‘`àE‡rw<[ÓCã³h„T8 >¨4D<à{| v ØÁ²%œ:熔–_ÑzV—¤ü爥7ô¤-!Á a´›Aÿ1]ÿF‚̲\}6aL|ò·õØh°ÉhÜ}¨mä÷Ì6günZÇÞI_nh;DËú hDi\ó­#ïú¤nÕÑyU¡p£ö²h)êÃXÀ9#YÈ 0 ‹ný;wÔ10štúe…æ?‡¸Ç‘ݲr.Y˜ß1læzüô`ÿÝRÃ}ã,¶îW»×q{?Ÿ8Û-Xà­@­rHÔ7J·‹®$$ÊNsSæÑùÑUÏýs$ ¬}=ÙØNZY°ÀöÑã„ó/ð&ÎŽŠÅÐ͵6”2ámü©Žv01¿²qÉœÿ›~õ^EHíÇî¤QSç’jµ$§°å?íiš¥£9J+ÜÁâË÷ôEsôÐQèøÝÅÌ&8^dÕ8ºW¾©N«×¦Ô×Û¡¡Ohà ‰¬³%ª&Øž~´¬å;Ó„B§¦P` %à5ûš¯I @±œ^O¹s<™JûF³5ÆJî û.[á×FpS}7ã"'`Ž¿Ž„Cíëm fË^zQ/ªFAêíUõkÆV á/¼ÿîxÙ½âþÓ&V³ÆùîÆTd«šMàKýºa?8CüÝ«Äï±åñ‘ñ”+ ùU¡Ò˜9 snmè¡E°ðæÎ±¸¦‰u •_¨e!<ò3Kå£e€&,oGÖ¦¤{3° ÂÃTë"NÁÃ}‚åªhðäÀ\’°aûÖí~i'¬„s¿L{KðË0¡ùs‹½÷ò™í;™¢r€ãÅx›ļA4‰Þ(ÉW¹X”C ¶­S(Êl•g÷O>ý ® S´ÁôÚ ¬'[ðÕÂiöT#/þÐu“¼Ú E7/c¼hl²)û‰¥Ÿ`õ㈨äx²¥»‹ýñ?äÁ`Vž,ø Ò ¡a~”ƒÑ ÄZsàÍ߯ x ÊÀÕÒÞá;{Ðuh¹ÔK·ôe0«I1ËÏn1+HYOXÚi>WÚöŽ{ÊC Ý›5jyJ›¢fÊaoí\nKKä/.Ç;Àr»ô9QŒVŠ÷s »«©¢ï%:³>.Óð‡×„Jd(Ò»€f =_[úpIàÏ„ä@„ªµ¿ÊcM?ŸÏwßWIÛØôž1%AE²k]<˜VJE;P쇷‡ˆûIŠø)Ä l.>µ#Ð ;L!Ø"©îcñÌðˆžÂ§Šs„|v{ 1¡Ðíõíín¾» Vv~„#AáIõÊhûyÕD#Ћ×!,¤’_¼^*‡’žž Ó)ð2†4Éƒí »þYî”ra(ÇC #Ú»¦ë››!ì(éù™§Î7ÓÁæ¤Î:eà & ZBM¨à1öK]­Ëk4^˜åÉ4ÝüåtN˜HÝðôæÚñ_‚®-"úšˆ˜øÌ¼¾Hó^YÞ’E.Ý*ØÙÄÕûªÌ.rê$¶äNPGï;åôˆì°÷6ªÄ¢ÑLz°U2(%€fÊun †i0ÉfÏ ò0´¬­A¨ýG‹ ©j¼žÃŠßÓ+|לFÔÃÊ¡ª,yÎô$Oï„ÓÒã–ª®ñ']18?NU»U‹¥OÞ÷⽞d8Ûz¦ë'Nžõ)ž.o­OÊx¿·†8m¾<$ã(Àå0ÃÀØÕ¼óÜØîot!0—É)¶P"‰".³?¢A€´‡Ÿ† ';(ÈÇC,lsÕ<Àñî#7:r.Â¥ÙÑä± Ý”ZY#æžp]“†¼#ÐC4ãQÍo^ƒ(á1›gñp Dü$à‚µ%“0 ç¾û"š±Õ'í,ÔZ_°*Ý_ýd xí0î¦Ï'uùM´±’0èZŠ•D:`>=³—Ãû70ò"ÄBB_SK蘩 ž+0ûŒ4¼“Ï[FÛŒ¿¦5ðìу”SÝÙû½Ê`º(ïéHçÇå¼gÝr·Í+fÏ%ÐÆž1£D£0NË7»4:oVT’ÿ d]¶VÞÄ|Õ¯i] ËnPÝôYŒº¥#‹µÜ­ã«ÙüwîV+ñ×ç^$$ñëzm!œBÒ0Ę —MéýÒDg5§M¿±>$F²É€éˆBö»ò³ÿ|þg°Õ„Œ½ Ñ!øDe6ý}åÙqaÐLuXÉ~®Í=œÄ£ÿEå3ñ¦Ró¢P@†Í67Á¢‡’„”’Ìñfëoa>¼G=]?¸Å¶û­ 1A¹´Ä€¿ÂÖ8%³Ë~ma¼)í¥ÎLY¼à*w¯£)÷¸-î¥=w¬þÏØ?nàüÀ˜xcŽnï x ŸÖC#+ I'‡ ~fûj€« ð÷‰_›+ <ù>)Yä LEsßñgAðŽM0 SÇ^À$µ5`köÉ£Bm`ØØÿ°“ºB]"Œ_ô­yHGÏ®­ÖløWÅRü3óܧà„Îÿòóÿ2¦¹ÓLŒ^·úƒ«Iï.„}!´è}Ò m±Ã~“.·cdgÍñÔ¥/î°zÇ\ªeª7Û0=7c aùоϥV?*/î’ô¹Uæ#XûY±mlólØè¶OEÅM6QA|”a•ó®×¦Žþ~•‚ú€BtRCógUº©ï¶9‹cÀ%Ò)|¾{ Ó̺‡íUï\~—óclPaÁ9†7ÛÂû@ôm's—@ˆ†Po…¥×Ü2èýMQ|= Òö,É'=Œ‡P¿),htÔø˜Q˜tÑà‘ïüÔ*M &Ë[}ëõ2Ë_4–¯§îêGmèßÛp5¯cJùþ¾Â„€}wªêmZ./)ÏÚ| >âM5JPâN¿Á˜Ðƒž隨ÚNlíŠÑnHV͈ ¥ðÿ¡xŒ Q1×ÙúÒü¢*K㪢ÃýÉ’àñµõg…¬ÿ)×ùÿ E€‡.HŸ3}qÌv’õ-’'DQdBÌØš€|5¡C6ÿ‡ºå*8¬¦ç•L€DW€FK¦úÜ‘dHúª¹ïå7¶†Þ³õÿ´,—@õ€,ÑPXûæ$5(Dt¹ÙºX*žT–7¢nâß*g#X— [ÿ>˜N•vªbß +J{Vr"›BQMMÂÍ8Xüìë¯u0fމBœ¿ôY+{Ž… ã®FŒ+\û9mP–£|" ‚v¢ûV 6JKÄê…°ÁÙK|$2°k0¾UÆÌöGkÊýBÿ›`f²¼˜Àþ³ëʹ›­¬Î¤é³…jr´fxÅK¼§/æ0 Ü%›“'Uîv-®— ´4!®ô~)´¯·ËMÌŒ\h>“Á¹Ü;²ÅŃâ§`3Rz~¼"!LQÁš[h6%~·[äì¥îû<ÎMÝ_ñ¸éÛ ]~×êѽÿ-Þ!MþHm`ˆMô¿Úôð LîΫ¹´/ûýQ ¨îâ›°2~$sÿ+9ä:ܱ ©¾¤UIë+¥õ ¨BQº+è;$]jÿnVþÏŸ¾‰› ø6µé”Ç¡ú¯èf#ð‡÷€â ¤ J:È ¬òß9V3ó¤´O°Y¿ëg†©ó{ˆ›êó9þäQ¸íD$UV…U~]R´"GC2ø5\Xd Ħùa ^¹Ýi¸?Y‚Ne9Øí×yÙבj7ÄF 5dP ~!ò#õ0|_,ý]vVE?TÑ„ †òe÷ïoWÊ8…ͺ«¾ÀK³Çg·[; kªN²™b5xÅT¡l¢Eüá S†à^[&.¬á j †ïà¾Ãýþ[Ë$õ‚-¨ˆð@eÑëÅD‘-Ž;Cöõ%¥±ŸGAw=4Qÿß ‘Àø|BQ§a7*@âjÄ9ÀDa"Ž<&Ê:W:\5…$±d-p±Óÿy‘UŠ?-ÅŸ¶DB™Õ°Íû¾,·uÐFrR8àzpp 5›Þ;oqC£—€·ü× ¶uúëÐíS„ìÒ{hytºçœMþê$gì¸å˜0Üçå¼û³úžÆˆ^{s®¨8ð¿QæF†¥ßò“!Ò<ÅÏî”癿îæŸÚÁc4é[ÝèàŸY¯ÛɬQÙ‘çÆ/ù™a¼·#†Àñ¿Ißâî‚4 ¥TbÙVuÈDUº’A’#d‡‡¾ÃŸ¡„xÝk8^к~vát Œ_Ã1LÏÊ?,<òxÉûë!W”îM©Œ¦W`oøz:òŽ;˜óPÈ÷9Á’fh­ñµî™ Aý¸O&¿6]MâNÚä+ÿK:ì ê\™~Ñš@Õø ˜Äü_ÄÙ8¾Å¨ Ý£ð7¤¾2Õ*xìÖwÈ”Üê‡_=YB;t›ã6¨ërÏÐVŒGY­.ír‚¡>­‚Ï¢e ÏËάìð9Æq#ÓÇÉ E|J s Ü[$W÷{o˜¹ç'÷m‘oÓØ¢GлóHàú&7»LÄJè!mv} B±8Ì›Ãm[÷õ߸M» rN7ŒzuþÎζÍe‡Š¾P²’mì·‚V†ú¥¤…Ú_Ï>Böz¯Á]h2¡©aÀ¡ˆ].ûÚoÉêÜ]ÈÞùf:y1÷ŒÜ¯ç²Hˆ.ýüâºæ­ª¼©ßSÜ‘~̼@ÔIIMѹs)Õ^ ›\ûOzî}'ÎÃǪ¿)òbð](ØæŠ!ˆÒøâpîUû»¥pͦò|ꢓxÏé/oZ-¿=t&·oO íô–°Æf¾àù‚ÆP'”R ë¾£¬áÐ`>þôˆêX:îgŒ9òL:Rb&:9¯$ì`S¼Ì­Ãc)ÀºàŸ ‡aÓÀóXj³ÐñùA_EzBZfïJw3ŒJ÷ôÛ¸ù’éî·“ðÚ6×׃‡¦{T¨?«F*ɽjõršq·?¶çV ¥ë…mWîc™ÛIz½¶Å6yŸ®1âé;ô?êìkÝj³û10?H˜Ütd›i/äR5Ôþ:µë{ÓJ[ä-DŽí˜¿—ôBÍ’ÿB_šB)–±oR' N,”º?¼×à‰¸ÖVÃÉ®z7ßÙ'x¦*q»$O论h³Ö4æªúžè›Z 8Kæ#ëUÏ>ÝÂõŸwpQÃÝr‡?Òi~w(/í+Ó^Ü2–ÕðRQ%êEÒñón¾7SsíÞa´[½ËT)Ç?È_VºûŠË" •sgDfÛêØÔš…NL†rÏ;æ>"ÃÒÕU×¶a–5ÍÁÎîëûÒò(A8f؇(-ßòˆ\Íep¾•@,V2{Ϩ{›0ß¾C€\äÑn¹}…öóôøôöïMâÐ&ø<Ïx¯ÑZ‚zЏ@Øo¹¬Ó½Ù“ë«ë‹åñK<ÃÑû ®¯;Ê„h\¸ž’ æK÷Ãb§2—އLˆþEÍ/Vd™/“¤å}©Aø>4Iö™Ó1•Ϭôô8¨q&´TCcJÍ.¤¨ã‹Ö€z/1Ïpr¾œõg"ÈS‘ŽcüÎ÷§gà#,YŸlÿw"_±igŸ~U0Ø€WäØ a›Ïgf”Pò<×#ÚôμLD®†~Æ«Ïe^sÅ«PœÚGëéÇà«Iò~x9yc%õ¼­kŸ ë@Xìæ‚·ZÇû:¹©îq ËÚœ…â¤YFgI˜cý%w'@‘üÊ™Æ'J÷Yfå ‰V—[™Gz•ajñ Ïyz¶r±,¸Uöuì³êMZìdé97AvÙž¡¿8¾âc®pz}.Ï™’ôû½cÝ‘Ãê äR2hc˜tâv7u”Z¹!5¶ehÿ‘ˆÈÍVáÌ¿—ÚöcáúîXžêÐ&³bÅH¼ lù胚ß}ºhë)ETéüeò½™Ã6¥$É‹‘©Ü)æÈ0C/§¡ ›ì?…‰¾¼Œ×ÅdäJŽ0‡Èt™B@ØjUý»Â[·Ç_ÒÏÊÕ£Ô©ÎakœØ¼ŠÃð±âOz/©>&ß‘è}ï©ÿ5 ”׺N¯ÝÑgÿ¬ã|]Ù{އ Ãe§cM€XÞÄ —-üZ\ zÎ ÕêsäOÐûorÏo_L^xü]ÿ÷T˾šÌîZ^o’t¤ž‚Ö+öæ›;¬hÊP%$R];l¯ò!m²¾û­˜B¶c•ö¡A„”°€ÁÀ(—ìPÙ®Ÿs‘K·œ¶Läd¨˜ßнá +•·xöœo’œ†ÀäfÊ/Qõh}WH~’2{u}NàLŸ½QovÿX×&¯e+Ó?¬Œ¨àîôIÜŸ²7ÌÖ $¸>JaŒ¶wRË´©`Vó¬”ä‰Ú :¢‹_" -;-³+W/6¸»:^Nº…•‘œ™ljã­]ßð=øNä}^ÿI©RT~$$÷ÇqcIáà¡ÐÖ·!îÆýÚfuàåÿÎÖ½Ó½wZÉâäê^N^ãíñ½ÿ-QˆUÈ”he£‚ÒŸé-rZÙ¼TN^¹#,³ÕúÌëž>ûfwoÿl?&»°G‰è…¹¦_ʉŠ+1{—}— ¶}¼{íÌö‹î…‹jôa ç·òÚ·³ÆËÝ>Õû,S¬ÊŠÃ TË®´ìF‘vQå0åtSüׯ)_¥ñQ FI<ȤBÄù&Ï#M‘…ú¯V%¯¬‡I‘-êî§9%¦-³–œÕJ&3˵ò=ËûwWNÚ‘‡fÉrÕÓmýÝ«~^7÷~¡~.©Hû\|B3ôH]É*m†ŸžÏ›±DW±dÀÕ(œ°ðú™ãætö‡ÑDM-‹6§\ºõ¹5¦ý3bPáêÁ§øc}µí}¨»_Ó¿×ìÊøØåa2f\¬†Ø<!üâÜ{q¨Ç0Ü]OÉa‘ºþH\ò4x)Üä¢ß¯Z|É!ì˜Ú˜WVñŠÂŽIù|ɱr«Wœ^6õáßæ-yŒ-}Õ_T~Üo7Û‹½Fc%’ö¢•$×ì:y«÷Wìjo±íó_ÏÑ =#¸êÖõÎ{NŒËž·â¢ÂÓ¾ž­âå@EîÄ{,¶ÙNV–l 7ŸÆ"†,åGœ?ßͱD)pñ.ÿu­ж%/).;©RhöÕÎnZøÇÓ/x$3MëP«º’4ߨ¼q_ŠâsÌÁuγÙå:̺ˆÆ" ‡ýÚû4ZouUY »ýß+o©~ï)sýl~ªšöœ8wçú+í6þw­›]{K]„W¦·W#òÕ˸ïŽFstèû¨(^[_s–TŒª»eEvè7U¡Ý#tTwð¹ä2MX`Æ%nB¯I/•efNµ‚³¾«¸»6‡Ð?±Îèé:žŽh\à;:5L½ö&[š˜&o]Ã+zŒ!”_:žNàs¬a^œÊž52Uš¥ÇÇ_³ ïqg[÷Ù£ÿá̳#íÙ?)Hù‡[ÝV2Ç×YºgX"ž¿‰‘»JŽÊÛMÝ(‘LñÃ×sðFO?ÂKŸ:ÃËBÃÆjEu¶v7èÍ…Ü“Q>™ºñíýƒ‰DÙ¸']·9žãÖÊ Ç™+Üó;L°Ré¹/Tò–šÏ“cy¤Ofßr¸˜œÔ3u×R¼­ôw‘5¯ËÚ)OGžˆ\îgØEŽê þèY>H1ØviíšpÌë-¼ÜgZyš GmÂæÚ­&̦ð.ê]šyvÞ~e²%®dµíXí5óYÚhèx9±ˆm¤ù• 6Ľz484}ÆãVuUÜýIö˜ûÿ©æËEÊV«ñ&n$‚ôO=“©ÁOºÄ8¥È…ÎV%kº÷ÅBëë¶xçîÕç3Ö6ÜùŸÂï#Ï>×/Yëß9,»ø÷¼øÙeã9P¥o³ûfdÚºE`¶Ý =¦†,OkX‹ß]Ê;;}¤=< ÊÆ^úáe¤ŸïÑ÷• wÓž{®¥ÇßÇù¬µß±x£†+´eŠ€­NnlÏewö—NŒïÖFÿ„~}EH± õƒUØEý"RÕ$Óf£ñÜÝdÅõ*]Gë#?Þêt÷Ûœ7ÓƒöbbÉ* $÷>Qy£Â­ŸÇÀÃß<Ð.:Od!Ï–[Ê¿%édYè¾¥šˆgÖ^šg5:z­Ÿm+b }Û£âÇÝ)¬Œ•)¹kô Ì7IqÂf•ùÝÑñú)或…á_Vá"âñÄ?ô¼Í‡¼j§ÒàâVWr.è9R¹ !ÈMþ­Ý¦(âž&WNlT£a6_3î†ûsÜgª°—¸×OÊ÷á_V‡™Êø¸šÎ{õX}]\Ú 7Íž¥.ʚ߯ ›Á3ÞÆéR²Ç3þÖÍd®³w -0Ý•:æ­Í[À‰6§qHÅÈPºH& Ñ옷‡‹Í9Îk7…Îñѽ¶lR.K”NÚÜWN”PßH*Š„¸÷Æ·¶KÞU0&UhÃÓ5‘IØå>J]üÔ©ðsì-±S"ƒê!3‘4úŽW±N vþõ×6 E®;µVÇÁŠç|Y5Šͬ½‚ów_Í1Få÷¥¿Fénl¡•ò>eª?;z6¶fŸ©Ü£‚üå²[|íOކrŸðvK\´÷gy´uÓ‡—AÏâ÷27²æ¬kW¼z« Žõc»O“@uñž¦\O'-Rb^}M4Uÿ…}^™ra8ÂZ­‘“²°|½(\×Kh§¸ÿÝåÜF`ů¾sKû3yVÒ|÷,qzÚíd PÚ>²»Ø[žkðÒ(Õ\œÔœm/œŸógV¸º¯j4u'R®¢E7Ü‚çœ2¤=‹àEKzá-‰Ë¥ýTt×6†Ì©åó4 +7úN£—[+ïdËn˜Ìè’®´®!×îªˤ]zÄ6JÐ/úæXÖELŒoeÁú.ÕXp|trWy öÞ]ŸËš|ùæ²ÕøËÚúå‹<ºÀÂüësØõÞzJŒõäCšxÚyîøÙKÄ»u¦Å•^Ì ¾Ë9”Væ²é›î5ÉfÖ|¬4WÓQr/ÊœCËXþ˜o*Û#᫞X!—Û#Ôâ ?]O’ælç3âiknÎÍ×nTwy³(j¤Æ}gP ×ôŸ@5â†Ó_¿âKÿÝ åáÁŒ,ä%þl~PSQàл’ÉP]ñ™dÚ Tçcö¥4C®\R– 7oŸd¾‰+ bú­Ó\íVñ~wâ¡¢‰È8T€Þh³™}ò ¾ÁôEçk×6&~x1éf0OÆŠƒ*ŠŽ<r–W;~Ã:p.úORö¶ÍÕC{Vã:ÿÃõÕâ¿Ï“NÖ;–pSÅÉ·ð°|ì"ìú'/“/c_ßz±é’:ï¤LåÜRã qéÂûï«Wÿ uÃŽ˜®;x‡¶{óf ¹@ghñê )’PjÓ‘ ®}·×•nb„DÝÆãÀ™õônš9Rœzä–ÿ½Qiù® ,kp ê_~ ¼Þ2™ÏLÞ ÔŸ[0åca ¹u¿5×dÛ@ÁêñkFŠí÷¾Í5_¼Ç0¹d8¿ˆ¼Ð¾q]ËŠãn壕eÊvýuYÛóÍ}Ù´nRÞÞâ|žJxÒÜzTWÛ*:玣2ßQ å:žÅ}}ß º¡Ä)~[‹¹Ãž™YÕ(£b>Îß„ÜôD8Á»ù«YÆ…y?¦ííÝhoºµ\Í­LöîyÃq;[¤çb®U|‹K“róâZ¼Ú·VÙTèMWO>‚Ëàpž¨^¹ 6#±bž|ìI¤`€èåX4Rõx+Þ"r²ì®tè£ÃØÃ”ó§µ!Ä9ö¼Mæ©¿)à93‘̳&Í8+c©{Õ|¬²õj¶0RSkÒL®5!ƒqŽ"¯‚¾AÜÅ ê„6½_Ÿ²VTwÙ#¥ŸüÛät™v†C(0K˜jë¿)"v‡§˜dÍœ˜!0%|f›K¸\U´±ïÀ'¾…’1Û¯kŠK…ḟÝa{j‡sQ$—AkÃK»ˆŒþm<¦Äq~šÖÆÚßÏ ßÁŠû{›å³ÑTø85^.ÜöstìÍ=¼2žQÕÍ.Ž_¯½zÒ¨ŒòQ 2R/ŒÙÓ·è3³ ¶´øå×ÇÅ/ù=Æý<)c¸.¿þ¾†uÆ÷»îñÊI»–Å{NCµ»˜ôNSøVòŽ]1²–?Ù_#Ôu648þ‹¼ø½ì¨çþÊUl¸¯l”™ÉðÉ©Ø\u{âÕ®g©¯—ãŸhüœ¡ý)ü©ëÌäÃÞõ#=æ¢A-ñÔâÄöê",ßVèz’µ[nWU×9?Î%¾JÓžaʾºr?t÷QMÿ]‡Ìñ²ã³/Ûd¦cóæanèÑhd37û–&c|þ5WäÍñ¢!æ«óÍLfbSØ^^ìÜ  uT½ úŸûöûf—ïù;wÇí/&‚ïÞcŠ_·¦RVflÙKõ¼»öyŸ6å¸d¡1Zéù (À ”Ë™ó„ž3ô¶—hÍ’ Ê9Q7aŽÅÕå$ŸÍ}wR[ä¶V»ÔëûLÏÞüSÈ1&®T»jȯˆø¼hõï¶éëx'ç¥Ï¡Àtb¯p}á¹rRQ´Îc]s_Ë:¦¿œ­äØülÝ™e\Y±è`8Õo/NÏ?yO^ª#€§çg¾‹í‡Sø ·½—¼e´'PY^1“À¬ƒ®€üÿó¹B¯?%y¾ëæÿó.35 ;¨¢qʲb†"D`Ì¿v~:O%H’õw·ÃªN”U„xrת¨i-x* »~ ørL/ AðÃ[›I‹PÇæ(Pu^/±T‘ZXÊwšfÀ€¬¸‡õÎ$Âãh[Ó`c®;šûû%7¯³€tSïô—|Ø¢g„âGâzNæJ¾uªÓ¦ñXÝ,ºvÚ˜1…vÛU˜=^èÊ]{|‡O™ƒM¤êw`=Û-R¬A²þ«÷ÿYò.ÌÉB» tô.™ÒŒšÜ£?Ä û¤ÔÞö,ÃeVÜàÏõ8Ýo±/$"l­®(ý… 4ã¦åÝM’àÐ4Ã;YcùHzxÈèï"… 3Ã7[ªÌÊš2ö¨Áûk‚ë.w» sDË*0[®s„^äØÒ<ȺX56r²¡ÇŽ_ˆÒLŒr¤ÔÆçŸu( ™›xf~xC?ßueõ­PèB'Nþ÷(õn#÷¦ÐøÖûü.6SrȘÅüöz¥.dÖÜb4J\ä_è‰6”éLÅç±þ¨î9€Ý˜ºŠ7÷t 3ŦÉÂ×0a¢„Ãû lŒ ö¤¬ú½nópÊGÀä=áÙ£ŽFG8àÃÀR$(ˆÁCöÛôlu¶ëóÉ]£ :ÙêÍÚnYâišè¡§»Áˆ|j0]„?NUQˆ^ÓJâó‰ûû=Â4W„V·Ø»ãTw+°ï㺨³GÏÄúØf´,9«o¬ôþnù2W!Af%eYHz,"\±Ãañ”“ÌŽxdcYvÛñ»­Nªo´Ö.ÒPöMáÈjø?FçW6±Ã×Èû˜|î÷ªÓsÛ?Í!–[U$¿òјS÷E܈k!§Xõu[[\݆†æeg€åú©åQîº 2«¹Ö³ªmq”ž5KÍ<‚‹,LŸ;c;ïÞ¨è4b<߃ÍoÝØÍÇöÊ™ýF¯Ù…¸{“õ·â§'ÛØN”ë+uë3¿*g“ÙrwÕ¿jçE=RŸ‚NyÂ…Ç*¯/Úq r­q5>“­MÄæ"¥²Ä²òNH^òÞ\î•n2ñs m6ÏŸ‘þ¯w¦v‘ò_FŽ7oì£9$aÿ‰®÷ðÈ{›ðŽJ›/^ækùê{¿ôÛÅÓÒ¶ŸlókæÐ£ˆÄÈ­³(©r[põ?f–ÜFüôÝ۶˧»bÞê'ܘ m®†…K2í‹G)s²ÖÒf5í™=".¶8óÛòÚŽ_7ñÆ\›¼Ø³PÏBàñ1šw×Ç—Mñ¿Èûz¼CÀlãwá0XÈ﮸êƒ×¿ñ®%)“–—"þ½Wºe̞λ4éZ¥øz±s×Ç©÷ü7P¿E¼B‚Ù‡²¯Vv5{íÜË»Që¤ULÕJh¾T˜(mS\·û—^É%a^ÈèXR~HA.Õí ÛÚp4šC a¼†À ŠE:ÝTš–õBJ£°Ý‰ßÏÃÇÁ÷X».kgùcŸ¦×3<Ñ]z\¼7ÕöGG”ÿ¾ÍUGÛp=Ýy—‘ºú„Œf8Ž[¹(B3‡@™-vEd(ºdrµ[ÿÚ·ëV¬•:<‚ú8è~^Zo–7ÔZÙ¦µšîlU¶ü ÿ&~CÅ?çûì½ Íd¨Ý?XÚh]£æ­4êù¾a‘ÚSÅ´ºŒíøA ïîõe€1¦ôqÝï3íÕîcCÁ²r¾ŒfñclÝkõ‚°úßáRå(¥œ{¤0Î7n2J ÛQÃ¥H .åïÇ\ÛÏX‚0Ò¦•ŠlI¬Çœ¼ùáxpøaú–qš†ZÖ¢„¨ýOôù*r1ü'. °DmŸšõÉê®â¥HÅô·ýÜï}" ê]bú—ƒò=ôó-#0E»ný,äM¸ŸÔ×AµQ¶ÌïO=ä|V‰£cò˜Œä!ˆ.éâ/L±äb{÷! y>‹/Þýîñ:(Åø\œ”M4÷0Z˜3y± y]Û.…‚øOáøïñõ-¾Å()*ŽÿâÖ@UŸæFGÉá¥çsh2mXÛVëÖÿɰ»´çÎá–³ùäyQ^:Ÿ(gñ Ýö-|¨S]¥³‰£¥³öìÿ*¥þ!*W§››»­Žú<|t•Þq$"’ Sª®NáÂ_R†ŽÑàï•víà vmG¾»Zûóå=²§!Ñ$õÑs¤Cm}ô>޼eSÎwØÜA1s¡›Ês )nN®¯g’­Õò¹} ésömá*…†•¿+cŽÅÇ«ÆËý™cºû ;ûëR¯ÑÝú q.èöŸŒ|/·g’>ÂcÖ–…/%àÂ5Ž’ç÷w'sëb¯kÆÆªÝ0GÏGìxïÃÀu×nb.bˆ‡¯ô÷¬Ýûªµõ¬ÝÍŒ y•ïÒX:³nèVöT¸®ßYÓ}ö®Ó´)õ0†ûdI–›nuÎj#¥Q‚Íyuº5—+-²þsùŒ«OFÎ f`Т “Ôñû~º¢zÌ×ê\»²WÊ\ŠÛ¾ÑMFÒýÜ—Ësí¤ˆp\Ÿ¥ –騟,©(V¯Ð*žL--¶Þ;ßãîà^'¼~Xð}ùQ;"½Œ†ÒT?gqÜ·ìdÏ'y£Zö_Úㆦæ½j† ÷ÁÊ×}Ø9X*Ýîì‹î÷C¦Õ²&šZkùÈi‰ÝZ€Ž0Ê»£ Y¿áãtR‹ŸÈé8þãéˆyéø0<Å9y .´´ÇÞ(Á1‰jür~f™[ÞJ©†Ž.O«@îû N¿[Ry2êÝùHÆj¾ÿ(.44»‰Å$IàÅçÍne6¥É,û†×®á°ž6þí'Ç“V&%ãˆI¨õý/Èd &©Ð `Æc¦²Þ%Ü9 ï¥\™Üî67뎫ËSÇ@ÂCn/™höÐ151;Z>_~ª+Ëf@[rSœ]Zù+4¸Ó¼{5;òå®i :øÖÒ³­|e } ÙuÀt¿„¯šm9‡£¯b—ù̹¡†Ã×§F†¼wŸŠéYÊIúŸ6T¹iQm²u¦ àÆ¦9!Š˜À\M¸…eÑí_pÜÛ—¢ Uy¼mΠƈoŸçzüßo_V¡ÞÚsnê¥øþíÀ,=3´3/"¿á@ôúl‹ìb5˜YzΣ¼È2èU[N'*:¿â†ÐS]5ñÞÙõ\2Ó[kY2Xèk-1Åg(a®3§•´ ΠîýEòžò˜.!ãᕺÓ\t¢T/wT„WQ[ñX…ƒhìIçà  ú0È{|N8ŽBœÈ†«ø0n(tÃÇÊój|—æ(ÈÙbæô-÷ÂÝß¹±LËh[_ôÏñµÐÄ›oTÿY¶Ï¦ogkÎÊŽëÒó8ësŒüÌ8••€Ç0°ŸSóˆõËÞGñÿ²C±¡´§Ð)åŒ;Š´tjt™€mGKá`w¿ ?Vž OΛÉGê/+[}~é·AìÓ˜»ã‰ÐÂÉ>£¨ä˜ØÖ-ÂÉNÕh˼†Bü°´ÑÔìÜl`tØÜTßêàíÇ©®¡ê¶NÞÄ<–ì4ÕU:ÛHXHáõEäàz"æûw¹–>ÖÒCįU¦÷JŸì6“%ö=xb“ä6šO¾ÂÒÓMÍ|ŒרV·x©À†€ûÇFª'2SÂß³Øx«·o{xk¯ÁYPp–ÓBŒ(®#Hc6r¡ŸBšË$Ì`NƒÊÅÕöóÎ\ø¬uî±IŒ³B®Ì !©Œ¼“=š¤#`5ìx½̪Mý;<’ÊU‘£é½™ãC)¥U’Ós=)àðõý3Ð0ZuY|„dýÀäñ9¸…ŠJ\M[]ëlÚ¾×òúñ2ìXj%ä ¿ºO¼m•9†#w¶Óçntùÿ¼‹Ï@ÎXÿ\~òð³Rf+söí„'›Qfè»a¦t_A[ŠËU«þ ’]FÒ;¾«-–çku°IßCN_·יQûÓï1“§É÷ë›"q kßo©žÈ´JÍè[¸Ò9±¡_i.R}€}iª¨áà'ÐTßèîÃë *·”~ô;†~2Òª÷íOQÿ1ÙìI0=ö6÷-5Çð#ÇúÒ©á•zrÑÓûè®2täÊ`Zý±Å™‚ž»¾}±´ÆÔ˜íŠAäAOŹurðIvJäôj‡!FSbÚÆW­ŒjMT³k1 ù:à)Vä…Á©ÌøÜœÿ'‰†¶bÈuf÷)ê^4î£}©0Šg uó¢{Áõ>žÊÝÃã^-„âò‡wÍUÉA­¡¨~ž6DàUœH »äí” Ãî ÉWfð÷Õ|§´¯‘ßەלVÿŠ02À.fi©ªýY­þ/Næð­z˦ž'Ãf{ÆfÓl&vu¬Kr· H ¬ëî}úÙ€ÁÁa±™P ˜_£8ŒkË’s;k±¢r[?.¥Ã þ”çdd§ &&6ʸåëÉ£,öpÖÛ`[Zôûœßã‡çÄŒ]Ñê[}¶¼Ís’÷äõ8²î§n3§¼äQQÐÜg}ãó–<ҔܩxUñY¯Ö9òC؈±!©÷·2>rñþH£KºHˆ©1pîš-¾‚7YÉ’î 3ý›·ðnQ¹Óû¾~˯Ú~‘’æy¨X³›ìÿ›^¸:=–7ìŸ! æ1zÐC>(¦Þœ°Ï¿œéýdú[wR ½¸ª>¯H)7jŠ^ß.á6'ßÕ‡xB¿N¤ò!²1Dà*>úh–E ÅKn¾ó_(»­#dHÔûÓÆ[G¸ÝÃpN™DÞß“L|ßH8¹·®¬ïÎzŸ Î WÅï®õ”á»p» gTÍ&-6šþÈñL@pòSÄ5Ñ]>wRà§á¶6„ÂÚ¦AwM0³€›ÇÙyÜn°×Þï*ê¼vŽÎaŠ0ù˜1™èÝv¯è{ñË;(Ýÿ7”×Ç~J/ùE“KÉáûw>;ÕÌo¢>&vz^}$ø–As6¤ ÷¬ìþû³Ûó°€'z ³¿2Ur\Î:£eÛ¼ÝÀÒnV'$Ž=Ù*ŽNò—$ŒpÔ‡éÂ_„®Øªò76yŒXIv9lPåZtˆ#³½íküÈôi¨ù첉 FZ'y iÊI „èÿàÏ}ñ¸‡x[閔̡¼®ºËX±²åcÝZäÖ6ÉîÎ0p¤i÷‹ømöIú¿ûìÖ_>ÿ˜„Á‰lÁWÉ&0ÒŠ•í‘;žUÖêæ² ÅEaGÚôl#n˺ђ¿Ú“v^|Š@ZìæíQ‹1Õ€å@zÚ÷Ú9_K—ñ5ÜK·ï «ik}®š>(ú¶=×^6ÁT®åŽß·)Ù;@=¼±%ήpxû¾e~‹¸µS _ž<éºg–ÙŽÀËV¨öý¿æ·!a…i"Í\\ï™=8ú6®‡j´ûÓ”ˆ 6n‰Ç æ›7–`Z'6âå;­À°ú|ÝUÊx ugÈD*SÜBSì8¨…qyÏÄpñ†ô|a׸sNÂq\4­¹mñ’Óie;KYEkED<žÅmÔù 5çãò îŽ?=ž¡GìÍõßö*Ý6—® &·ÓûkŠm*„ÉÎÒ.õ¼ðj¤Ø›ž¼þ¼Ñ6DW`:‹>’'5hg1²x]òoöºLÕÊ¥¿µ5'²WômÛŠ”Á_ášCàgshsofƘæ#EAÛV‹µ-Ôz.;TìûÎk«Ž:…ÇS ïžYEèacŒ"1ËZèpѻ㋠U¢pýÙ©TV{Þ¢ïŸ`ؽþ©†ãªšÃæp4›xíõ*`f!–0ÆÚ+¹x5H¾,ëÚ‰=*.Öàù÷ ×,'bs ã®öDt<Ç¿JËá 3‹O®—ÝqJšœüΞ^ßè¾ë:°v%4c¸8„•öJyd8>s‚®j´'bÿæ­'*Ë4÷EÞàn­ã.¨þvª i™;¼cÒ˦ëÖÒå+á¢×‹­gòŸº˜!w½BÞ¿³ÖnòûµkàÑUð1 ÖëêÈo¡i‰ƒSî=¨0²²äpi*ò½¦:b¿v“ :Ÿ¡˜Ê®‹÷ú1O±Œ»³ÙÚsÑmáÞ¡éÇ*Qº€ÔtíÊ«;ùdÕx½§›*˜M]®"uG ‚MëXQ´­-ctÿè={c§M©K‚ZØŸ¦ØŒ¬ŒJÖ£ÁºxTâJg}Càš”/×ÀƇU5ð'ç~Ð’G³ÐÿhoîÚÛÔäw1Â$¤ š±sévÿSW8/}¥×ýz>ýæþ®´²\ž%ó91ÔíÁ=C ë»gë1ä¾*æ•Ù~×úµ”N˜#<ÃC”b²Äy®ØÞl2î³ydlªÐŸ»a¥Ï¦ùp½\zÝxÊ*CMS60Gþª¥h÷xe—™µûŠû·ªo!!Œ4©€ì]wcétRêù®‹MÏN Îâ™g¹éyݪÔ)’‘ÿ•]õ¤„ßÍ1¶;õ â´5ª¡©áF\ŽË._MmN©š¯âì\€ÞTÂFf/vùÖ¶«¾¾Ji¢ Y O5 ÅÙ©å."äæT„Ì#L:g ¬ìUôé–ý£¼¯'àùãUà›iÍgRÉPíuÁu&ô°|í¶[÷ë”ÀBgÕã¾ÝlšL8ºtÄßWã¹[Årßi.ܤéõœeO; ³ÓŽœ"y]ÄíŸR¨úñp5W±ïÑml}§M&¯ß¿ê“.w©Jiæ‹EÏâyÀ릆C Æ}‹…‹ö(²ÀÏb%ÀNÏùzÿ:y¬§›­¶¡XÒZ_Õ߆„ÒõÑ]cå+ð-qx\Œ f¥“ì×ïiÍëò™ªgçäÙµ¼ÐâÉÿÓ¶g›¹–Eî…êü66ÕÃ#PÅ_›Š _²G‘—]È C`>½\{¿‡·£>v5‘qD,B {D`þ%°ý…‘Æ<0  oxŽ_ªìGƒ"´æöýKÏ#Ùxéé ôܲ¢ó¡ÌÏkÏžlI X‹ÞÉœ›öµÊìT¹zƆޔl#½æ][Q)ËñöEÿ¡ž}fåmª&n¯ùÝÓw†é¡øÁò$´m—îõ»râ5~ûvº#ÞïYz:/{IkðÜJôµ;¾³%òX&}`Ómíô˜‹ìÜÞ±…çê¶ÉÐßíŃ›o„_TßÚ1ŸËïÓ» D*µÓÊ{ˆùÝÙtñÙÖv=êMŽ­ã¸^Ÿ9öŠ{ýç³XÃÃÀ%¨ß爦ƒñÅIKÛ%â1‰‡*Wõ>´! h®Š{¤Îù¤=N§¤Êúy~–H§”ï›!ÚË%‰ÖEÚcîC$™e‹ÙX WÛæùÍÝwðh—'rtW=¿¯a_ ú2Wì™:Î}åÉxÅ1]E&òvšûú¶¼ýe§~3šr,­êz«ò´¼TÏ=òëc`¥S–ŸËŽ”ðurkO¬Éà3Ü?\{ƒ÷qÒWç:ÔœÉqXH¥Úr(jÁH‡=”®•õœ8Æã³,n1°¶}¬fœ×ñû˜2ÉÊ~N½?;‰r¹3õEGY™÷®v9(Cð!ÀÌC{Tç¿s]Qy´È;¯‚q”8‘ëUC³ªZ=m>vס]î— xüÕnyØØãÒnüŽÚˆ9ɤJË,±²g­b™©§¿¸aáLX' ÛW²Â'œû›MÍ`»÷&ožËû‘ÛEšŒÜºßi-¶¹§ÙÉÌ]+†ÿˆó§‹Ž¸º~‚otýTÅ_¤û½,Ûú¾‘çE³KKÓdó?»Ô™{\›/aÖÙæÃŸ˜—;áÃ&"u‘Ÿ©{òL«jÌ@¿ïöÞ«.×ÕÝÓáŠm Û ŒõÎ9/oL‰HŠ,ƳâK-QÊ¿G½¢Å~æ~ñ1tl$ƒËþ}—Ïv×½µ¬|qËùÝ|7§Q¢¾ÁýíïßÕ¢¹±K¦ârFa.UÆþXÆTÁúml¾¨ ¶ñj¼<y­&:JvŒeª¾¬KÉ>[Êý{¬m2~ô E 5  øž»m»ª]`›üùªziŸ¥N¨÷8½¶‘ïÖ*µðíM#ó¹ž÷:¯#þ®yÈ…üQùÿ¼‘º¦óQîc\Å¢êÇúS÷›;¹6CV9 Íû¡åÊ}LïåO›>yÍ›W2>ˆ¤ºkéÕ:WÞ@E,éÄ›h™Û´»9_·‘ÔïGkW—/¶³ÿåËÖ¢tìÑU×fŠ*ün«:I‚þN’p¤cä[ó/ÕÆzÙr·9ÔS¥mô‘î¦ókßyÎ;~‘g¥c¯^bsûHÇP4F—mÜ;ÒSk.fÑdv1HÄcìÈžºO<’p¾FyQyÚ:ª šíVE­'Ï;ÕÛ¿íÝFÊ¥}³ÙÝþþ8:¦UŽbÝg:£8Å.]”\þRÊSSG‡ý²¹¬pt°Èè@‹‘íùeécÓÕèUÑÊÿ}|„tÄEÚù7%ëÛ7Þ6¾ìd4DÞ~_Šídé¼Ô3gE=™ÍceBÊâDÊXîY¤fä¦2zªÝ# —በ'ð8ÌaÙêBÓ_S¿ˆ¥ðJž†ó–¨Vý·D÷8ß­(:1­a*#ݸúl :¦¯°ÿ¤y5Žó‘aÓB·ïõ´·^Kï·•óâÙŒn!ÓiªÕ]Ûsxó˜[S½F×܇aÌ1 ô-îu×bF»o±8˜ú©|ûÝQúó5˜ë&ÑY˜˜p%}”#‡hôðÍÖæì]ç-zœ×ÕËÜEèc èð‰¯Nî“ò0v×å-®ÊRqÔxŽ®V¯@ÎíxÖIJÖë57—…pì.š8»z×8Ü_Wsüv!ž'¥„£ÚЯ9âÇøëŽ-Ì,]¢e$0û]„’Ìݱ—ع¥ÇRêój ¸.Ã÷aÝzˆjyý“«TƒëzÞo™½{ Ï¢¯ÅÝsÅæÿÅ?©_Ûi°G/b$s›’ 1î?½Ë¥–YÖc’Cyåö¿îCMíXì9óÞíR÷Òê QG\^K—œÙ1ËZ›»•­;¸ù=Ä]f×p›5F›XêÉÝÂï5­ žæ*7ṅú×q?Y”‚Ú«øÐÞi,ÄSñ5d#iW]Í ÔÄß €7hØbìNšÄe(¸ÿònÕÍ‚6ãc¤sKÆ_'A#aHdI‚ôˆÇߨ¥¤¸¸GMÓæ½»”¥çe3j©ÿZ­‹F:-"+äÔâw‰„ò¯jæFx6¾|.­ÜÔVªJ_--ËÜôžé¸x‹›A_æ ÕG¥Æ$àúǧÿ¿üjs±6í;©-òâ¨íÕ†o Õm|Õ»7fÂMÎ2Á€U´¦H©Õ%µçgÐ課+ÑÇg³®©­ïšãÒD§•`g´Ç Ÿ ã2Ô^Ɖ ß hž«â‰©# ÒÌ¢n†Ónã¯dS˜‡j·žÁ‡¡›EUôÂ&ü\„waGOÀÈn¯djòZ>5ÃG!Їßi}1ãPöCÑFN¨á‚þ·zÿq¬»ø.èX3º²×dÅ™0$.hxœŸޤŠÕž¿‰bþµ‘¹{˜nŸ4x{DëÜS9ÂòöìçùÍ]¹ºéÑTD‰¨ôž=¾ÊÁã»qC¹qÀ½)>'ï2=¯Ul:døË¯mêõÎí{M¢ePè.'¿ª«Q!-d~_^®™%°¬W‚Oáï\ôŠIcØÔßÓ~ᯠÇÔ^ª†1’cW*Ë(Dz‚Ùý^u§ÑÇGÝ·mH~ÔV»r܇o6Íd².Ørz­RüüïYbWõ¼`7˜ßÃôeî’gôFÎnØoŸÞ«ýìe]Ž•ÔògK#NtQ‘dDÆ:)s”šž§ó§è'Ÿ£°YLÿRõ»ÖŸ¾9Šf6 ªšñÅøõ ¬ÊYö+¾/åšögj²ƒGY5GòùfðÏ (°(C½ ¤»"IÝýQ½Å]éûý 3ºÒÚæ’·É›~›Ì2 Ë6,J£ô|: >H¯ƒ½2¤ºIn”÷Q· Éùœ'yj®Èåu¬–AŒ õžÝ n²î>æHNM1—©&gXÖð&y’‹è\p®ktçðlòÛѼT®ý*üD9+Å…ÏW`ÕT½3¼*¹o #¿!¥ßÖ⪠LÍRtŒ,™˜aüIâ_ó-6½V2Cjø—²`44©;šÆ®ƒ‹ÁÞã ¼i«?Ц—E…ù/ÿ¼'¼(˜z]îs.èZÈÓØþ–]üF£±e2Q}’åþjÚ)‰Çé\‡çYj,ÜÎ׈œ|9z³V'|¸]Ž•Ö¿ð©˜éª Òãy®âý¼}¶µ5ya䉯rRùÑJÑ £ßÄì\׉ºÐbêU6Èõ™Çãe¤ö?=çÕÓ qt™ðJú=°ñ÷¥Ü’³T,[úC˜B¿¡,¶†ò“5dÅÅX{VBÖ¯v]ö¬3u<6œW·5O(Æ\a¶~{Dž£5 Ÿt% gnNƒa/ºãöªLf9ŒÕ'ïÂã3wÜ{X6†%[7YXz´„o%…ræ]l{ujGò-ÐÜÎöûƒ©,ÊÞ{_»(ÝÒýhu¦±¨>\;œGÌÚþ–Óƒ~±¨û9 $ŸÄw[ûõ2®ÔáÄÄg‡þW¶ÊüçO®…¤íã&ûÝÕŸž'¬›!ñaü@+ží[B™Æ†–™]±0%hyËuñê/¨s pz—wûͼYömZ,¼È¼{ßR”Xaà¸èFž2Y.6˜†øÙ%BêÙ£ñ6u™_Õήž3ÝvåÍí±þïÜ›—¯kuƒtåópÞj±"¨¤PÜøþø5%¤mF™6`ÊÀEÆÀí\Ç Â¢¾¡=F„˜/A_žØ·änwvÅ+ê4»úN±£¤áóSïGì VG-(=¿õ¨{Ÿm’ GºZ5¯ß"뢋yu«FïåøRÞ€z…ïÒú †¦ï ÒñÉÚº¡oÕ^kvgÅìÀ{*’©Ãc#×ú# DË­eEÆxÇ;=~FaÙ¡xêÇ"g¡š{Ϋ3Óÿ6zUI|RÊž#~Í©y-&†Ñ…jo•ÏS²¼x¥ÙïCÅ1LÏÜ‘QO«µ`¾"îV: T…‘Ê_ÜZ1˱NHƒu9¾åb¦[‰qĶùŽü#4ÕCÚ\«›2¬§z/±‹ ÑžvZe±Ì{¡¶1óu:“ ¥€y×z/‘+º”q9p¶.â7FîD·ºÎ‘Nìt8‘ìÐy²ï9ý ©ò@§mWV€+ qÅí\TçéTö›™ÔìÍsÛ ‹ÓZ UӬާ‹ÚãÃ5¯÷’mU™¡sS³/6Á¾&ŸhûñE.uè`cX÷'N%²°|C×3ª¥6Êþ©¬Q¡ØS`à¾i.«ÖXšu‡qWÁ`rû¥Ï®1‰—«%Jž¬¥li.M’!Pºù±@Üç¡JO¬gëûÖõ?æÅýu%ªÕ@–~éܗ˾˜y¯*ýu/™qÁÚ:ŒÊþ¨•ýøz«âk6Ù3­m½Zտеì=˜uˆÛcnpG§Àbeú/[®ÌÓ/•Ï2èµÝ©¹¡6Ö»¬ŠÍ6[î¸ù½öX"Ý”6\ÊÃÝrÑ´üc¥Ú =kÄŒ›9Œ«!ÙÊ哇<°ðèªHȹêºH­¨¤­}4„ïj›kßCcÇ}}pÛ’½ÂÒ…ó€ŸoåÛ⸴|¶´Á}QVüé~é8DÎk^”Ϊ÷M‰Æ1ù½5J…²³ˆfòYÝ#Í6Ô¹éÖ¶à~IÖ#!çb…ÍÝ"h®»n•é¡ü4ÓØ‚ï8µ‹þßrî^mêÞ¶C³pT©W ¸Êöj ¿Ðúúµ – ëUKj—k»›*º|EÇc>¥Ÿ§*v`O—øáŽk³òç‘”TqYjü¦Ã{d–êjô3}|T9¦F0ŽFI¾s®HBr3©v´ i?&ï\m…V¶ý*ãSüÞ—¯s*ìô[ŒÏ,áA?u‰ýrd~¯[‡ò±”ÛÔ‘W‘ñj渨‡s\á ­hÃ-³Júè>{ ×&OrQ«„ì÷Qz ꔪ};Îf_2µwU¹CȪ>EK+vÜàb &~Åó3éE<sÙMDu6?•ì%'¯a·¸Ê²ì‚¾ðÑOyV•¸ª¿Ó1CdTTFÇ5ARzcr–÷$ýWí¬”C°j„Î-¨•Q¡Ídn½Û­°ìñÕoG\jÖl_»¬Ú×(s~N¾É”‹zîÿ#f•ñ0™ÐœöfvZ‚fÔÞãH¸Ú^QN–ÂJ;ÿ™9öü¦ç¡ëNªòœ©íÈŸçóû‘3dªo+TÉIËÕ«gÜç\Ó 2;ýçæÏ¶ì&—™hÀµ9Db:Тa¾AQE”^`0 i÷èh+M^*zí\S™Ç©#½®öó:ïGNBËõ{™¥Ÿ•yR ¯kp•-Ýý©OfôƇ§¸FÃ^ÊÓœ\þˆ—–ùŽßá”j7öe}_$ž´¼û§üò|/Ö‹PŸïI· ­DÈ’\EQèð'å˜J3²t¬Ê¹E rÚ— RÌ9>k¬sÜ_öÕkvDßÁK¼ì»»ßßÈt³Pºš|Î&ãáf£é0’ŠZ‹yÉ—Þ_z¨¹ïü¸ÈØË•R=<¬´]¥Ì¹—†p’>ãTW¢\ŒjRRD æIÁ´‘çÍZ•¤ƒ‹…wª<ßËÒ%··û“\HÉMÎOÄõš—þ`Yòy»©'WZ•¬ “Ð#˜ÔõÚ_ˆ…Q…#ö/Ó­‹¹8­ätÝ3CRîGS £tò©xæÚ­“Z¬À‘t³ÕCAô2^ÎOIšJ]lUz%ÒýCbW~›Š¶T(t÷™L{ð݃ðybÔIaÓ'z†;ïðÏþ òáË!΂Ébê˜ =Þœüz¼Ì5Ók1Ê`TÆå~˜'C*¹H0¼ "Ã4_‘ÄÜ!ƒ”ÚŽåû|§MAÔÛÆâ«­q={ˆiИ˜ïöy7ÍS1,X"S÷§Q-Ý„¾‹bÆ&k7̹†D%W^–Û¦ƒ¾³ƒú2`[Ù+€M™2©ƒ6r6VÞ)Cz~W{3 ½îÖ0ü>Ÿ'·]‹­Î*4Qß|l“£¤4z¡ÏXS†s«²ÊùþùÌrkÏA§›+‹bùb ÿYøº°ù—K‰ÇMºƒõ¿õVçy¹Ô1þ´1 —î+žãCç‘WLfö1Äàáö §É(ýü‰²½4–W˜WŒ>ƒaëciz;•ÚoîÀáùp˜+úß ôà`nü9ô¼4¿gòx³ù³³Óç*1ÏéÉ_’Ðh¶e4’:õU¡@€[­ÙÌ-¡>pt‚-Q‹¤©–I›•ÝÛK¬ð¥Sw±Õ7u2WäE#Qü÷¦¾Ï¶¹©L%åÛ.g?ÔêëÚ. …óó«?µŸC¿MÿŸûÙRÂ+ß êvø6J&X%ÛVÐ_ñHÆ© ™:m»î1~ÎÄ%›ôœ‚*‰«mÒ¶âLòóo~=fåh7ñôl²ÓÕȺïfUFqöûþÜ 7ÖwçÛ(>¹ŸJš ]j§äJp—0s·]O§èõžß,½ EhlïK‡~Sü¥ð䢛ÿ´mß451Ô?HÞT=–íL>ÌÂ#€{T•Ò+UéPÕhžVjWbu–íë'ÅË˶óËÀ÷Ð{?63ÛÂGufÓtnž!ä•ç™ï÷ló¸ýsêbþÿ$®4ý¦8ä¼ +5©Ä=N¢`ˆ©?,»ûúæüõS½–ÓÁ6žì=DÍ»R/U/w Åøù$vÞ,t|§ú+¯ø§ù5w5º·Cq5·Íáº[ïÕÆ@ ¿U[fû²øFn\³Ž¥orQj®èp ÚÌÇU%R¾ûX¯ øÎòñM‘ykÖï¼z¦?M¦A˜?2{wô)Pëp£ëHs×Í%ý·òh.§F~QÅuCœîù.вOiåOa¬ðÑù|2uëå—Z~fýÅ2+˜RwÜp—0sxÅÔ1ùI¸¦@_¡"V[|‰~‰5®7„©‰,maÎöÑæÓš.8 Aÿäü áÿyž×»WâÈ8&«Äç±™£Ùohീ»zâ¬'ÙFaòŸ¶s]'¬óMU5O£odÓe’?gØo~ê´¨ªëöräùp[¼Þ¿Ø´Ë``ÃßþÁù¨5ê,©Ô)úqz߆Ÿb¿…PsC‘}JIgåžo·Á™o¢ö„?ýûÜü25tŒVÅ*žÒÏ?ZқǢí‹çðLf/Nö ²79ýÌ[âNï¿¿B*çYGþ9áoÍ+DF¦ˆ8$0‰nJC±!vYŽ=YM­xñsØ|Æ~ÛZ®-Swg±-gëðl1_æso]‰ÒfFƒ£Ý©eÈÚ?¤e„[9óØ_ÆCPU±ê h]²æò‘~ëj‘ Æ5‘쥑`$½È›v7þö*Óê¥ä'Pxj󸩩…jz•¾‚uBÖJ®EÇnùnÈ6ÀïƒlžW8Ù¼t°\øTÇZâxžvÞŽÉ_}RîñøÜùŒXʪ–ÏKÒœVhlTnú¡L=ãþ¸XÝ6­ììq¿©WÌ2p,“Ûy]¼òOd!Ñïxu ­ÏaŸž› Án”æ±ö4ðpH÷ë'ž"üýµ®"˜!H™Äpq‚I¾¯Çê:¼Ét\LÔâiɼ“¤e,vÔ…±yiZJ„‘›y÷V™qƒð"·ûeÖÑU?/— ä[Ö’p5dµ^²“EöͤŒÏ½cxáï!ˆh;¦æ¥kò–4ªm„§Á2\Õ¯Ü;Òo"´|[7û ©L´gǪ±Ü¦µb[€¯l†×Ó¿ÇEW¾n,Ÿ[—Œ75e,^cÂuÝ`‘T§þRÅ^ýRËi¸o-:L¶/ÙÎØ”-zý•}u^ðl“Ò)z¾º…[:X=èlSÙó»ô5‹úë®zò£§ÓQÿy²}H¸¿»;!bm>×õ”™£bÐ9 A÷©%Ö£ÆÜVµÈñölк°W–e$ãS}\þW£¬ZýLëÞ6[{ÞH<ÊÆÂ§z_‰=²w0_Õ×5ôg¼£ñß 5;—P‘ôÑѸ« •ú)Ý—}Sxf$;*\"x˜õ¥×ûô‡Ö—Ž|ÿ×A‹¶ùob‚¡ñ ¿SG”iïgS»…“÷Æ&läŠÆU;£&n0uzÉÞl¶13qsÊ› ÑÛœr«GjG$‘–ÂÂò±ËMÿ½è8Ùù5ë~º‰§g¿Îý—TZoC=˜q ¢v2ÍCŒûÓaãY¯…Íp–˜ZfñqÆ«¥nÝÖ>–ùùÏÊ}Ú›ûˆý=~zкš©w³Š¥.Åš®ëaauÙ=¨á°ãq3úsl6J¦ –[¬Ü÷—ˆYãÿÕ7§U´»ýŸR]lJ)ˆ Ó Æ>l§Æ1Š¿ ˆ±vÕ/Çâö}+âg>î6³—›]TÂÄ†Ž…Â„Á#z›d>{X†Â×U•ÿnZ¼M[HŽOþœaÑY' ¿_F¶ qÍåUj·‹ÌZ@ª¦êPÎó¸×í\„ÖR¢wþǨdÈ Y$›„Òßj½+<8qe XïU¥ªÕ…Ðö¦¿cÕ䟘TЙã¥îĤQE‹çñÔ˜‘éœ#Vt4Y”øZ4²ÆÂêzÖß!ç„í¤ró?ãrcö½[Û¯a[î{{ŽRƒ“ÛË£šÑÄãdœf´${åt÷U±Líð5טõ Êm§/G)Y·ŠË&1ÿtŠ?—ùÌùþ“ÎŽ²´§ÇÔ«ŒTS3!µl»î~M7Y'´dn"‡´©¨†q^Ól5›•¯+m×î­ò¾Ù¸,k·1°u`ƒlâîPÞXj×÷¦¶FÐHñgæzRk]¤³}ŒÇkkÝ…\jâàã>W$x‰_åÁgZþ› Ûl×2"Jb#ýí'‡…òf-vú[§B!ã^.óϽÐxå=nµ%@ñßÖ¦ðýáåïܵäË÷Ón¦óc:¹_EGÛh£)aǾvÁ*‰©ÄªÈc°†s‘`‘mÍÓ¦{¾<í¦¯]±ï©¦¢ñ=YSzí)ëj¡7çJŸ»ù£ §ÃîOÄnxöœiù€ºž©Y¡XÞvÑ DG z=ûhjÐhQŽj¹ˆ†+`ÄÖvb¿ø±¸UQŠôý(±ôÒß¦ÔÆ›°ÃÖê(×Rp4°&&S 郉~û¦Ô9­dk0 ºHÔ¢ú>Z.œ3k$ñ¦2ámÖeA7q6—%«sMÿCÅPa¿8Éú³Ðx¦¼ø,Ö-tºl£NNË)ýúdh“ï9‹§cW@ ,W-»´2øžÎ«îcXôs> ZQ7UÕfi¹ÏüôÀY!QÆÚ¨;5娡ÝÚˆ·Ðü¨à¸=­ÉÞmÞ·ßš×Xb°¯,î×MË´H/x”©LUxP6˜#»-éú4ú2Gzi&9GV¬‚A}Ö@¤$,w7(ÝãKÊZ‘ fÔÙñwد×Çäß:”‚¼ñÄÆa/‡8‚ÜÖY÷1A“±nø|©ðŸ6lFQoz«ñÎ-ýÖúÒ1Ӊʃß.¼ÃåZŠˆ{µRÐ&‹ñ²:f§4ù5)›å[ËØçæ Š™ ºØÌb~EîzfáyüSð·Iý…õåL+“ío­«Å.•=¾ò#¼¤›|BâjS$Ç%š†e²ˆkà½ä9u¿¨h¦\Ûn©ÇA^ ¯Âû6ï¿Ö³Yüg£'ì†b|ãÀi—»q*×^~›e0?²Ž<ÝÏ× º÷K0ÿØpòÍ&Ï`l«ø¬é°6Ù-œ ÷ñ]­D8ØÜÇÒeï—|Á8ºß—öŽÓ´ôÄ!ôì›tC.& S¡²btûv×"¾°ã®º¸µäá”Mæ?Òþ¢þåçÒ&Ób•ÿ/K; {Í”JóRyE9Ëð¾å¼¼Ë<`þ§ý>1šL;“|Ãû ~”r õªñéÔÐÀ߈àb¦A‹yìýñÔ™,|‘j 8/¨^áŒ%Ù@£5ûɧít™4¥•ÄŽì÷Ь¸BçÎÕÚGVq¼£yÃ䕎‚#A•«ÇoGÜØªÆÜ6ɨ<yrj:³š^Ä̈ rw×9˜ë-ŽÇƒØ½Æž}o…#.Bó7•çtZØnÇ!^^¼Óçj¤/PÅùd×é4~Ös ¼pædÕ†·nc «d_i|K{ôsñy,ýÔhþkÓ!º#îË¥-»§DËê„ýì[‘þ ô—\Ì –.¾íŸ·^çåº&ZöfÅ~ïDû£& :ÓC_PP<”U `„ÏQÉg$Áî¬ûñIMí8 æ ÑW«Û;¨‰ëxQ2æEÞ?YíJ5F^˜û4ðë¡÷ <™É’Þ®çm©¡·öÄàí@|hwwÜûH`¡Žò‰þœ»lfÚö8Ššµ *GyÃØùÜ4äþKãÅ{9š»œ *Å}ßvnb‡Ó7M0H¡sL‡$ÕÎÛË š´{ÜSdiOË(iQkâªv\5sZàØ&jHEgO³‰> ‚j;„È -VÜB—!ÑÊÇn­ÉGËÜ;;g]D˜ä?ÈG ÇY„aÎgXùŠð€¡PÁ ö÷½Ka…a¼®]NU§Ò´ ÉT¦ÀE$a&$2>Þ§Ÿxø\;çWúG€¾¢ß/D«º1º¡ÌðÍ$²X$,U¶,E÷ÏäŸyÜw†¢§}ähg…_ÒíÇèYÀç5èÓPÈx.2ên… âÛP»#”DÓ‚DŽ  ²øÐ>™ðãš¼Y·Ü$‘·×»ýˆuáߘþÜ“2 }:6!Õ½-h~pb2JèÓÿ:®ƒ–IRD/ü¶hÅ6‰8÷Ó!Z† v+ Fê‡1ïßÜŠ¤M«²aÆ¡nBµ°­ 2$2 ƒNÀ4ÌÈ m}íûTõI¨Eº¶q¹?>0!U.uÍ­f»Ä@ç•b,„ì$à‘¿ \"x´C(±Î¦!õ7 ÀkŒ\üRKdº_ÛB:'UÚÅ £už;Òî‹yìþGþäîšÀõוìnfÊÿîi³ýiÓqi=0s\ÄïÖÏú·­OàxÍœ^—Áf$öór9!qZ¡ŸK¶0áqÎ M?÷Ë ~ë\^Å(!õûñI„r‹å¾ÏÓËi1ZFÏ@ö×X—( @²€‹ò?2´ëµ<Í…B4b\U@ð+>K£M8„‘‚ÂqÂ@àk3ˆ` 4±Óos¸é8Þ‘ WHÓ<ljýS´o{rˆè/b°~™O•$ÑÄn¹}VŸÃãUùZÅteÞËL1·€î"J)?å©A/P¼y †ê™UÈÉÿædW°{ÔÍâ[7¦$H>\síWÐ+9iŸŽ¥³¤”Òm›Ê¾ÚÔõòjêÆR<ưȿÀ0ÙÄôçö]Ì/~ÃM¿ {Žëv\&@ðñâ’Æéd£˜1hßæÖIw1±VÈôÓúJÊÖ<ï×ãð6޶† qSùtü3îX*ÁxY——&eQÎK@ôqߪQà¬OÞè•!˜É‚ØÙáê¼0·[ë<þÀ`Ÿ+»K‰¸ëé[ÑMeïb£¬U?€Cl(3[³G™C”Ô;Œ¾£ô¶¶ëfj*gC‚&Å9gކ•è Ú`O"ø{Ž¿ÖJ5µ²±Ìü»H<÷Ià–œÇürûþ0¼Žk×)µS™B„ß6šsÂëu]å“'´ùµ{i'›óŠöVK ®°z»¦ÁVö­‘Žô«ò]8ϨjvR|Ÿ¦-Àùn¢žïêvE¸òÊzíy©¶–¦¾Qý é»ÔƒB±èË‹¬KAh¹”Oú›ähÈØ^N#oÍ=ì¡IâãÜ©Ö#êRë~~õ¹ßä3JjÂì„Ò-rÂBb–MMcxXGfm÷}%+V}wÒ!Þ‚ËfC§ÑK×ÊfßȦõ«B«èz6Sîù¨ø¢"éY½·-”“ÇꕦúV|6¸ìÉï‹Í±ª6z—Ð1ŒcÆêï5’Möß”õ 4S·¾`ŸrlÜh¯5O :ªËHÛï².hÇzð-³VŠÁÓyW^À³ŽÎy[TcýN½¡‰TÊf6óÚv„n)“äG(ËyQßcJ•SËÕÌ®êܹݞå”Ï; p=WN" jr=…ѹ0ša¡œGY ©ùâ=<‹ô·eW‚ÏÂ)ýZ‚Ž´ÙhÊÙu´P?…s¾¡· §~T§9¥!\íN§‹De<ýµï¢ƒŸ„Ýþ Wùj©øß±R+Œœ­*}åÛ–²a. ¬Ë¶c­²uªi¦)þ¼äÍá6ê“×E¡—ª6ô~ÌéV¼ø-Û½¼:†±Q~?µ¾ü`zj ïò?Îv–§¼TèÐ,žj}~ªj,>–Sƒ‚Lâ.Ûð·%êÜíÜ[˜’\¿ä6ÊeY v°/f¯ÿŸO»5µ*Kü£Ù&`ª_~cCž÷t¯Ì½xõMO•çõIâTêeÅ´¼ZG¡^Ís–ß3¤…ý‘ó¹ÍÓúçYas>)Y…~–"ßVq?ÑÉ­o·³cåÃç3l›¾ªd°ðËÈ•Ð÷}}eí"TRµÌ ÂÌþ÷¼^ÖþÞgo•±a°·¢\~gL:íÚÌ£¹ÄS¸~”QÌZT\Å-Š?î»”˜VvÛòu)|“m|ÃHèêw—Š´×g ©—yA<÷;À[uÌ¿.Êgwª`n™'u¶Èô–vmý½Y}~0R&É(hu½œ·Ïd{xæä§Þ¿°©ºE<9ä†lÕtõ:â/>SÅ‹b¶L‡äãýY$]2GúÛ£«]çéâ™ÎíO¢»ßòSN_®$ ]=H­us™ŒÉ|ÓœÅ-ƒßäa|•›¿‹7ê!=™î@ñ`e;Šß×¹M1.ñ bçQùŸÑ@_`;˜×UJÉ·¨ƒ™X|¶Pél®·Óö±$ܝ޷•µWnèÿì÷ø~Š ¤oó‰˜7äËÛµ<æê¹V" ]äÿv)iþ¬_;ñc}Ĥ‘²ˆþ ¨çÈ…‘€´¦p_hÝOúî)<:Ü…YÏþÿ0/eÔ9¶Ó U5IIö:¨ïE:­øæÉJîÀž^ËÎhBKÌk¹&pÚ#HZ­s„ƒMµ9’ìõ<ô9*«öeea™[g`ÂÔþSf{“pеIkWé!À´VpÞ[`ø[dšÉâ4üI‰Ä`v#t å(#±ª±ÀÃSRfáDó¢%¼}‡k 5€îž¡–›„RÒØ#K—’?de©­–~Y=.„6õà#Ñ)¹C;i”9ÜÚE9>§/1Aß4á>9Ì(ŽrAo,ÕTÊøj•¶YÿŠÌs.7„^fYçY4MKØ¥=]ŠUK~Ç?kû™èP­É^Vµ{é][OwŸŠÖíÙÒÜiþÞã¹HË:Åõ?÷5I~2é³dÔ¢a²==•>kˆ‘+éÆ+1“„OÍéÞ³ö¤LÙò`ÂpR+ÏÝzØ·$ÑxeCñ\Ws!ðWcºo¿\ÉR¨6àe0O›®§õÐmôñ˜5$t»¶ŠÚG @ˆÆ"‹#•ÈôÓõài%¸Þïæ¾ì»íþq›?&…UÆoõ‘_¦¹ÜñŠÑI‘›5pž1™b·MÞévk^m»KÌë ¬¾ÍÊ™$® ®ÿ¶3µP>Ç,LçÅM]ûoÅíž«´È»b•C{ûôÑZ¾&&arL´â~.¢«\†`MÉü$x½TÑÔûŸmYŸ6Sœóç &4G5$WµÙXÞ¹¤³H§YV¨Ë¤™Üæ«Âùôð„È ÙùËŽþåKÕŠîû¸?{åøm× cîÚñuYÛªó(8 \@!…¥Yœ´óíjþíü‹óãûÅÌ­hg39M’ÿágàUb’Î÷ëuêìåyœÝ#|ÙHÔ=lÿôuí b²Ul¯2:¯H²sˆ×YDêlß¶šReAŸÛmŠvð§Êu­ÈËÝ¢çý‰šÄ¯«pîO©‹O„¦]ž¥kØd< €3~Cà¾L}ýuº³þ¾éTT²Ÿblp Ì< ÜàÝ5¤t {™ÎTm­wìö¯sˆ<•lºyGæA‘½£¨_¶ëWÔ &‹?oA”lDZ›WƒFµµ\ÜÓ„™×TÃÞPõL²w]4æÛ>ŸÃ„YCE¥Å£Ï+ÝJ̈h6Ï:]5x^‹ô±¢Û!²O£ Â}ZJŸ™œÎûE:¨c!\›¼ÂÅÐøµ0 \°Gk:’§²mnäöˆ¹l¢juÛÑÝáÑR1aÑYʧ@è”l)r¬ìÐLêטª¾Ýk'¶G¸+Ù•i¢VŽg|£ºT®¤Ókô)B,ä.±Ô@¢°qkúÏ},nê¦XÝ•t†*gÞKÊ]‹jaÝ8ãÊëÌÖîÿOš²ñÎ(ê¥Êû|øn¢$UØ{#à͸š”> ¨LYSŵYд;cöNо·Ú>²ü¦¡•­½¶ñ^}\+S|ÏXá¨\wÐ9ɔŠ![;ɇöþ@ç¯í²½:Êíc¢Â»Æ½hôÍ£ÝûšD÷ô"õé3¶|2"ï›ô"Ã>w¸ˆãúÀ„\|fLìå…RGã(·M¤¬LïÖ@§ÚÞnŽùÕƒ©tnÆ®iÒ‡0 ÌwUÃ"KÀжՑ_´™Îi癸+þ&/>©D ÕÓûÞzëy0>dSI©ÞÙêW=¶Ó8ÊÓvþ+”¥Óå• »@‡Gp“:#?l<*­“׊Èv[óH1†°¢ MCÿ†\Â4W²›w=ïëŸË#ºõC ßµÐ7OðK$>QËnžöÂÈ®Ï7Ó[ä%¿ol9P{VÄ;àV÷äµùe¸&‡°=Í‚b…@R¿ëꔂs;ñå’L|îHõWEëƒclDhIx0÷ü^¯šæ‰óAg­QW:\òLRøßÎ?¤6_˜±qç"pù£›ŽÝò4³±0{ÁäÇ ’qóô: ο͚•¢8øíÜ€DŒ•VNþß²ïA=+<™“Ë\yYó½œÅXØ èç)æ {RÊv ð€öÔûÁóŽÎ `å÷ðD“°§šl¤²Y:"ª„£¯ìæ÷#˜%MκIÁ€ù”åÈgܾ߰ÎáÄ}¥ïeþyÚ˜ü5Îí¸ð+z(õeÕ0Ó®•â±××Ìî šüôЦX¸z|X‘f/ïJ; ·S$£UJü|sóPþ»›:G7°@Y§AÁwMƒöƒ†Ý±ÀŽ©ÈPcïýn P™h>¨Ã añ…|G›òmÉŠ -b.õK(³ÅÑræìᘙåÈBiieF™¯X¥Ò~Þ|ÇÏF‘WŠ,YËx0¦‰ÖëoòÁõt!t„iM(S ŸÍ°¡ÝŸA@÷×Ï&ˆ;Xåxv&:AìÆým;ÃÞÎÈÀfâÑŸD+õ÷­È.m‡)g£è! `z{’kn¡‰˜*†ÏábפÒÀúñ¯-}<š‡%fár5j~JèQ^ ðذý9oÚLäµ: ¿©þÚx Ôµ¡Mˆ=x<²*uÀ€ßÇ|v2Ü®LFMWaí½Á@ Š&ëêî°1yèqK‰@ˆnãä»eàçX‹úêžóìˆ ¶X­ðĬàY-FÑ`ÝúÉ„‚À1CŸ»1æuÇBþ[‡…>t”íùÁõ’ ‘Ë–N6.ТQ[Š4%6ËSòÌ#^bæÉs h¨ÓÈEU*Î4y©L 2ß„S¾Vÿ3äš¡= ÃLã ‹™‚Í9] Dÿôy‚ §¾N‘AÎPy^“8£°¸LdàˆÍdì ¯ƒ¸3ì}¿ûåâ ß™Jm;# à FL”ÚHpï}¥TGs-"†G,~!·]C€{?ÌÚËÑÅ(û‘ìú ìécb§zæR$_¼ ÿwÖÐ=´i­ô¿f„ÎPWÃs'}ÎzGÿÄ u`Áš›¶ð·ò—ÔV(ˆÐE;¼¸ÎmÖÐ2–É NÁIV ßE2M¦ŒÞÒ]¼&Œ«’æC¤$z1³Î6Ü”œ¾ü‡ü î°—MtÚ˜gÁÐRIï¾ Üʺj€ÚÏè-/Z Ó®þˆq^³íŸÃv"7Z±ú?>‡ææ:»OHŠÔ#®îÏYÆ}Ñ…ï´¡ÐëÆ\ÈúÅÌœ‚r${†uq 7Ðᡟ€â`Æùjà¸.^ i–ú±×ª‚»­`ý÷6Æ7©?Ê¿ŒË;BÆÖÿzˆb Zঀm£ÖâݺbaÂi“cŒ"²ó]îH¶"ÇP§·‘ŒV?u†©,×—&Òù¼"t»ñ/!Ýý”¨+ªg3ÂG"o[ïÙ»"ÖawößöMËßôK-èY†}`•ûÄ#N=•ã % — ŽD” ¦—×¶Ú×#§Ž0)B1PpcÑk4OŽ“ï.[«AîbåªágŸ–?€Óò—ÚáNþŒD7t÷,—*sÎOÉÄÃÕL|R—öÉî>"É,ÜS°RDÞô׋¨<°?¸\Sý¡ÁCØyp‡Ó €Òäp$•ùk‚],x‰×c†)Ëè|Ø6ÝáôzÅnqèðŸñ>v—‹ ­›Y øeûK Êí¸Oì|K;¼ƒÀ+Ò<¥ßkgav˜8ö2<+ßÿN>xL¥-­_ÞœÂj¸ôÖÏØâØûhšòáø¤ß°Ñ®¶ÖñÎ0·¡¸˜ šù ”ƒO<0Š$úN ³dé¼oDv²6œº2°~ðX/In›ºJH yµ9r‰ §kÒë‹‹Ž‘Å8¥%œH©G}0J.YÞ ‘ ƒ;´6ÿäîH ÚŒÿš¯´)“2‡ª‹Ž*RÊö³ØËVƒ¤û~üvÑ—°``òXõ=é súûÎú¡8IæiwÚ]wÿhu㢪>άA´t¤$¶TƒÞ÷xg(|Ðió’ÃlK);˜¿Ã¢‚ñàËdÕ &Òd$Œ1¦&žoA0é:Ÿèíòd2 cfRtóÏ    €e Ãÿß5n¦þ5oéÈ ÐÁü:T€-qe€ÑÎJZê×1W}ô¿”F¯™°øÐ"Ë¿ÊnPÂaÿ‘?_äÖ+6…þÍÜN«ÐfÇ.3ת۫ oN ä¥%i~äˆyˆÔdka ÕB‰p°®Ù4©Lä¬CiêíÞ§!ë»M"żepî¯;BwôºÈùŠŽâ3 ä9z@* ᜬòŸ³×š)Û”% /Hvp%_ ‘ž^HòrÒðq›tåªC{€î?y&‡o- sœlŽ'µÇ›÷ƒ£ULÜç`•‚N¾FC«öeÖI”É4 èe)6¼#"$Ä:I}M«lEËÄyœgð¡`U}ïZ"@Zˆoî°¹{A@ª9 Hc̱ḧÛùÃû¹ãÂä<Eúè‰û‰Únš†n 8ñ:ðª!æ)HDÛ@f&;ø8ýÌ‚íä›{—>òoõ¤ê ’Í^¤`ëÞËc ‡%ôÐÊ?oQÞaDƒäkæîËë½oI/ƒö³ÑIyå_$½õp[P¢›¯ÆÂQnÕæ†F°r7˜7†Épœ\‡~Ù:Ý÷üp˜¨þÓ3ƒ”‚™ÍÕ%ŸÝI~gÎçÿ0YH*Y0krž‹ð°= Í8£…ú D!’ú$xZ‹x]~zÈ1½ŒºF÷Y>éåÌ;--¨I†Ç£’ÞšÞ²‹)ÂÔ]ß«üýz²¨m>Ê?Ýo/F“WÌue'SÆÇÄ€iTCAmùó}1Ú[¥ÃµÅ˜ –ùQãêËбLX àü暌%úMgùðæÉ5"F î%éùuŠþN‘¸Üˆ˜‚DkΪÅ= ôtÿGy'dLÂJú_ÿñ€Ú`p¯òk,Tm7¡®ÜΉv–°[ÃTtAI6µøÃûvùáà÷ —ê¹âPáÕ5 Ã»ò›}µð‹¹ÅµÍøÔ9%Èmž.nʼ¤wvñØ÷nU«ÿ$‰ÓÞWϾÃï÷%zÆDŒ6:[Ï_ƒ ³>ÚÙÆìû‚V½îxØøÓn3Úò[ŒÄÛ5‹ù~-Jëë_ nщ¯Ì;¬Jµü àw;Ä1h[p ¹nÀÛï$è‘$ÇÞ.tw‹#­ Øð~Œ”຃P%iuºy•(‘»íÎKoE.Ú 9Æ%ÌGh@{‘r=x …¼4ö"—éyó®^,¾¨Ä·õÐæ÷©È=Êh…zˤp>õÔ+ºË¿tp8+±øÇSJapmxï:tåcíp2 /âIï,¬¶ÐiL„#ó˜B.¡7L. p#üTÁSh€°®Þý/X"!•8ˆ6ØìZÿ(a ·~Šö2¾V Ø4_öч­ú`©iÁ‡vGYö[XÁÑKmýHárÒ}ŠŸA 1Yƒõ‡À /‹` \±p™9r¸Ú&ï šOb¼í­$þ˪Ozjé'0äª+g†Ñ(áFVD¿Ý<$»ªËÏàíݯ€ò¼x‚0ÒÕÎ-å•ʃ¾0£6Ù IÆèyíËÔª—œj§S F@ƒün×xsLcÒ?ðÀPÝH9[˜+‘„a¹fÑ‘ÚÝFv"úŸÆ€‘Gþ5½øþ£Uf‡lÿ¬,!ÝsìEák2Z’½ØÅì``‰–ïî" rËz»\n,ÚCMmæùCìÿ)ÏŽE݆ceðhµ1ÿ<#|hø uÞ|‘Q¨Jû Xc!þ–ùŠÎR£Ôœ=îPˆ½Æ¿"fKÖH¬ÎdD·ð`µÀu`éìW§(>Zå¨å\Ã3W#¥æh9D>ZÅ2Æeæ ¤"Ž.:XGæ‡ä’Â9ßh0‡.ÝfÖÀÂ.¥äÒò*|ïñÄ?VÚF ˆò$Ñš:5k V”• ®Ý$›Må¯A·?0hËÀ!sÁíYÃÀŒÙ—<ß8õuÚˆ\,Y%Z€d™™˜3!qfLÌn¶· ï@ Õã @žÃ˜ÖC»C*~îä 3‰Mɰ ³H­Û´Ïä!Ò!Úö:g’ºý‰ã ¯6VX)0#•¶ËºßUø±c€½ oY; ¿‘hœXb‰=¹nTÚ…Ô³^0q¶Ä4 ­Ìÿ©:gÕ#€‹xŒa7Ïœñ`ŒjH) 1ÜmC ·þ%ŽÏ¼Þ¨Ó›´nñ•[¶š Yßn7Xœ]ø|'ø×üËt0c¸“pn_ä@콱젮ňËõ¤ÛOÌ6™ÈPºÄ!:÷] ‡…ÂNÌk%×Eî,Ï8Hká j:ظƒÒ}óÒ ¹r0kJER›ò€N3û9-j‡¢VÓ›#Ò«DÌÑ)ÃçÀ´G¢Š£d˯¿˜çy¢k·æ?<:0~Õ¿ƒìO@Ùª¨ýÒ´q'îì%U½ÇßKÁÓÈ펚†SAæ%Ûîdö†*E0‡“ôÛô3Z,œ%4Ñ;]·–؆˜µt•+a{]5ÇÌ=3ŠŸãDÉŠ/õf+_‰â×úT•˜¬$é­Ëùvðþ ¬Þµh¯Ö5Ëtv3Õ˪­^”8ÂYAùB g~+‰ó}m* V¬¬c ¯¥/ñ ô12.†€¬Ÿ®½L%M€¼•’_VG²¨3·ßÚEØØJUY6S«¨æIM£8Öƒ+¶×Mœ!Ï4·õëõ¶uˆ!ÂzRîÏþ–¸È>Ž”ÕÎÚsjJ>7–˜œò»zñ?}±Ôë|Œ¹WŽÆÕøuy5jÁ ¥<¦nëY Öaäg ØåÀëxæ…4¼Q3QB6P\´Òðc›î7Iþ³–ÙstAjãKo³žE3Á“ó=·….bœíd‹g âü™{q ¢—‰ xM0; ó‡PVé¢ONüQLñö¥(`i£_¯\¦[ÁÁ”è÷ sñû |ù{i§ˆPÝXð»­Í^ƒ¹\LR;ò1ƒòmähßLÄãηkâ (²ßV#i·åñì$3›t©¿*e²×2ò;©ß%ó „§à8öÜwóñêðÒ\Š<Rx`æä».Ìå.Ï8«C‚€âõu?ÏqRÂEvvg3”±çÁæÃ¿§äHµ06€è³Â¤jJŸ•€F‹ÈÇ]sÛÁboV’õ4臢ó)s Ã÷WÈ:à«OTäêÔKŠŽ)iÐûl¿†…z)‹5¨ífëøøÞ($Xîž8¼([˜Õb5HÕÔt]Y]I¥=páÇÂéü­¹%C×8O`ðu:„cÑôÜuöSHu7޲vMgЦàÝ”)òß´6ú qéÇƼÄKŸèö]¡9kmº 5Põ+ÇK Äj@õŸZoâ2õùW#¤¬A8l„?·™O›ÜáûåIU(99!;[%f½¡ ™l"  ¬úñ8CŸûï˜ÝYå˜%âgÀúsDÁBò”uH ›ÑÅ‘5~`èB܃bÌXçVæ ¾º¿¥XÖ9©Ut”³GRöç4ÛüŸb?˜5\‘ò„¦pµôâôÃÈÜ»I›fÖCµ|Pƒ²IL& ÏCLÉl.@ëµ)cÙC@†—{.7×nš¢ î¦GåÜ]}ƒ—ŸðiHø +RA¨X´°^Éæ&‚9xÜg$äÙË`‰ À•$ÃHñŸç‡éx{‰Ê£è";åÑv¡Œ§¥Ý,ãÊlèï£7+ƒoU1Öi:üv5¡xd3?à,ä]þ”P;©œ mîª!è9 PF¸[/0>2½Ïäú}!ÆÞA£çcKpG³«‘®‚«Z‘]3ˆOß(“Ä óLâ†Y(±i¥§©ÉãÚEZ?p ÷c› ¸¿ ƒ+Š^Úé!<‰K…þeã®þÈR ˆ*ôJZ?QüI2µ—{X–‚¨Ëìòógcóz™_8ÖY¿˜ Lâ žñSœ~[idá4ßOÍMqè5V‰Û>V ªþ èc]F²­ÀHÞÇv!T/~è_†=è @kzeT'5Ó0ÄQÏ»nÅjêу¹¢‡á’›Ò"ÞE[©$©LŒ¥sS1SÇJXæ̓¾‹éŸKø7~Þ—ÒãxŸom>êAØsöœÜíç‰*HrûÝd?œåÕG¡pDô=Ä[ pow?£·â¨¹(çé ÷“ÞÀ¶Mï]pS ^PU?–’ñð”Aì±L›âN—)¨pŸ>X²·\,¶F¼rK+lyÃHeÛ"ÙÍæß—RO7,¬}/· JhÐH á´&˜ˆºÛÉÛ¾é`¯¥ž;{ä€ajqN±âC¹FpM¢Tà/ØUœ¹èÒ5^Ûíæ¾€!ÊÞv(²ó ê0šÇ´m1(þɾ}Õr<"¿Ü^* ”P˜¬$úÐJ‚¤Bx2>ºUH Æ[³9$Ðïð³ OK˜‡ÍçDMÝ’*¼YLAÖc“½ÍÜ ü©Z¥ ÎC¾„»ÀZ¡( 4<ö²TÈ>x;b/¤×AÇX>>Pî(q°n¬<âeqòöK Kзp¢– ~ÐHF¢Ûù|yJUÍn*Öó Â!lbND\L£‰Öo$‡ ŽqÚYí€Ziƒ^Äri=SÜz¬Ñß+9¡ |s,%þ^'1Ÿ`¼s’-›iX¡ÉBsPZëËÔúýäÂø[_R±FÔaþXÒbÞ=¤Rx]ã‘Úåñ¹ùHý`·lo$Æñ¶ûP^´+daõÆä\Ú½ŽBX`©ŽÌ3›1ŸPq‹P¡%3> Ê’˜1°õ$ŽêõG(‰ó§cêó1Í@äûmF@æ%Óaý÷²»ñU¨c èH†šº²Mf@ùmÜ<ìÁZ43C÷9Í Ç A‡C-fÝÂΆ ${<ÇcŒÜÝè8p/ëZÿâp}ð^ígM»?/ú‰x#¥‹+ n=ÙÓYãiW–h=I_¬r¹Oèb`~óñ’…cs¡•â« ±Å‚ÿ^ÍõºÊ p68ió£dŸ~ž²ãæä8ÍŸo¼’N/7 ¢ËHýÿƒ¦L+9â,µxe™ Á^ä —üÀ Ï[_Ÿ•ƒ·ŽÇ7/8ŽÞ.}rä=íp¯ë´2ËP˪qò64p+yŠÖì̾Mÿ.À4 |e=å<1(ð2äFî*½œ’õjä¢5¬&ѪHñ!­Aãì—Û‰¿o ì& ‡<{ÊôÅå[dq½›: å´`u¡í ©CÍeºÿ_À˜a[]†Ã=EuÄ3LѼpÌGå }#xrgaM¶×\ª€ku#´WDË7Õ‰¬µ4ŽÅ7;ÂZÂ& '5ìÖ ÷?èµÀ˜L5Fn9Àæù³»O=+0{$a`ôzè–JðIÜüX¼ÒnX÷YúEÞW’a»ÔäûP㡯¢:ÏÂ0ž*±µ š¸ßÅs“.W3œx4„‰Y¸ÂA`Œ|™ø’íªR ‹_:[ ’’¬EfÅ ìaî!t±„qŸÓÿ¾oš€úÜçÃa´BÝcÿBpu ’ùmšO(@|0ÊAèΆ/§âÏ!»ÃÖEô‚Ï}{}ñ¨ƒÏ¼n<:ÏÁÕzqo#¢ÞÔm–ÚæÞ¦Ô¡òe+LÕI’P QÂ픇è/ÝÝÁÕ ’‰a r0 ÍÂ~•é8¥É‘…#7 }ìÈ\<Ûb94ƒ“¶ÍÀÿ6n¾ƒ"ìŽ Ä2ôW\ùKÍ¡]ìKó€×A²‡u F»7²×Ç©"ÿwQö„<û—c$ll”¹š’”œÿµ0׎Õ!YíÀ±M— åÉ'1•âÛç%+KRì¬ó»,Ýݦ1²Wl#ãš'ijáÌ®);ˆÂXôŒXR*V‰K¥óD‹?~†>Ó‡•sQ f[+ŸýîsU䯡QÀ7FéåŽzÜfh‹%0f@Hкߖ¡TºôÜ:#„×À˄ՒûëpD>\&"<J¸/2,¸RIÕÃM©HÌ‘ßê§#Ü1C’Þwá2g#Ê€þw$“)ñþщ˜ÂD AòyÁ‚œ}08NŽT€ÀZsr \šú#H|ࡘûAiƒaÈÙédóð(ÊÕ„öàÅ„NˆÊæc8M´mضE‚?çÀIÄR û!øcCËÊNÒ×)]à=ƒc@ ”£Ò5P:~‚Žd=  !ë^SžŠÉúg$ó(³På· „L=z Nƒ@ØáΤ&®4½ÌƒAõެù‰#Ui$µˆÖÅ<(†÷ ’‡ûC›Š8¶ÃîŽÌ$À!€ƒ'm`òVˆ60°¾a—mtÿïc3^œP•x=8¨CÇœƒŒ€)ñgÑX5¶:ÝÃòh@hˆHËBæ*ï!ã»F£ÙAÏÂe~«Ô%ºj…ßþû‚`÷l,„ì_:|Ý’qñA×FÙ‚á`û¯dËâ±u ÓG'@cñ²Zqlá³òn`À{]ÔŠ=èvðóY1‘c…ÊG /Ë·”Fe ·±W±½õŽuKcsÏU(Õ°sxÓ‡&…0³Àu´I=£·r(L‡H `C¾G|ümŽ/záõ¾!MÖÖ7yk N£{h \c9~¼¿º^©pS’…ˆ dl:Êé^ø¤åç…ƒI„˜lÐ@Ëáâ/zØ’3ÕlFØÞêoÍ}{çK){SJÅe/^$w‰„¿]Ãåt¾®µ“BéŒû6EI%b}q£àog}òHX\ï¤ÿ4Þ)vv% µú–ŸWŒT$ÁU«›Äœ‡÷ ±äÂOýW{¨BdˆRWúÈ Å·94F& Ll~ònLasPtÑýB;¸÷ZCÖDB›£´ŸÄn`>¦VìÀÉÆFœ`7/Í’úÂy‡O“lMÏK ¿N“0˜}2YZcœ„Ų æNIƒ«2M9 50ú„¸ Ì(T€uð¾SÒ…Ž%ÿfì•§íÐ@¹Ù£ßFèÀ?_Ò°º‡â÷èœyJVb˜Ã L÷3™£0§^ÒÞ̵õ5,aÚ¼Ûxpmšªßàp<<ÉO&ÈÂßlXßK„Zh:}y°ïàÊ¡ÿ³ZzYN3%óíÒˆ„Ànæì YˆûƒÃŒBÜŽµb&Åi¢){H 43‹f°Î9ß"wDä¿/U4‚‚ï ÔGmÑIrç%ô ÷βN³O+D?LgwÿYóÖM„ꮺI&ôƒë¶2 \LÍé™È—qüK6GÕ±‡´ÞC›Žz=ønqÊ ˆÃóA9<ƒû’„ÇðF|!Qóáêã Gîd‚s€¶È5 c€Ë»8ù£mb»È:㢑æ0tpfàÞ;¨Á†ªÂe÷AÐoø8ð<ðsÝ£B(Œ M€¾LÊ 'ÛÏÉëG',lhYðê!þŸEªI†!ë 51X!tÇ g€*VG"(ã ìÍ^7–¨jê¤éïà>ÿùÉ 3ƒ›ˆí&‡ kŒ[Ó@ ŽûÒë6ž³”‹a˜sã·õŸåR^¬eþµP £ù0uaÊ(5E`Ðt!TÝê=ʱµ»§ãþ÷¤PQ@šÙ'@$ÝÃ+½„°*;YO1HD$I Ö.œ3“Eý\Jâ±›ÁR¶Éý)Ø E—È"V¼æ ·Èm¢rL°P+K%ÉÕ§ëäL©ÒË© ½}Qµkê‰_k¶Ùþ08Ün “BžQ„VEL„Þ>"nwÉHU´“ÔižªtÕ“ ™¦¨hA‚i3„žÞ©ß™Hé…_ˆ“²Ü9þZ/Ú¬¢3aì~.Œ—*e1c’_åWù+*w€Ž¶éXiò[ΟÏz…4NM5{Ê•r”÷Q“@QuaÜͨéF€-jݱ`¦Bº{4ipºØOB0xÙ?¼ùÁàGÓœu±™¹û²¼Fz4p©¶|!^ƒ‡t$ëU4¡äMäÁúz$—£ÕJ½‰ñIƒ}ùÐÌ)¿ƒ/Ö GÂZºâpuÔV8¤9¨‡GÜ%Ĉ60&ê ,h÷õÉïàqP¾,\aõ² \]á^jr¶é*“U¡ã12Nä  êÃO€·ÂÿÚP-F@h;üž„ zS¦€çà>Þ<%TÈ56 i×l§Â =쑵"påŽÜˆ÷Z#Â#ßf¼6}V™†{kÎ@ZUäÜ/_<ƒ˜Éóëä¡R€Ð©hNÍôƒ¯8&T~ 8 B?é‹6žuÞåc‡5)Ìþnõ(zåVº¦£PçTÿen,â‚(*lÅb Kÿ™€E$B €H„W\ˆƒ°A[³ÌGµÀ!Û°ó°HTÁˆÚ.‚D’"áiPÙ@2$$Bƒèo(ø EБÈ+40ŠfB´Í¾ŽâR,)!|¨MíîIªƒÖˆ `7P”~ñ"à º Ï;'”L‹f™JóøDŽ /2EÓ,”€ó3yHTpx)-ŠŸü 1ãFZ¢€Â„Ð'OxX?“U'wí'ÍO0ÆâK8gÂÑþÀ[@AªjzùZ äóð•x,1ÊÂ=²GšÇ[=åcs 2󱲇·€/©*iŽŽ´!wœ É4E›/1j`L;²Æ*:¸êñ!þaI¹x|˜3<±8Vh¾A¬23ð=usÍ»Z¹=Ò„¡CñPdñ“¾6 $Òe÷´%9Ϩ’õ 2kæa \°E:5Æf¦ùÙ÷dÅž¼…MOMëÌY ¯þ»ð™GË€°î¤u9Ÿ˜r”ÝJ Q9 bŠ AßÕàt_0üÈ Bh¢§ÍÈÔþø6ʉJéwÞG*he0윹x —#ÿš~:¡ÁÁÎRê`Z^îþ]Ú}MÄÅ¿¶„Ëš«Öó=XÐñA»…¼l5÷™×à€×Å®l¤º ¸ü¼‹püdf=ÁˆäD¤eºÊ•Uàð =(éâ× bŒT&é-+°µR`÷ pPpà ÞÊ$ZaºÆZ½/íqãL@@ÿ˜ " Î “âÃþÏžIŒ¤×{¹©äúÚÿ ¦Cobµ–÷ÿ—Ñ€L<#…3_Ú>h!Rˆò¤¯9(R§iÅKgwå¦OëŒôâysAB‰DÁ¡d̳õ¸ˆ{ » ±Ayð .¢©óÌ!ïG]p†æ@Ì&x‡b°ÈH0‡§ ˜¶\>úŽaS9Ú!¼A:¿Q¦×ùO}¦ˆ²Ôó.Žt©òö-òfê'ì¿:Òó Üþ¡7¶9 ¾¹H ÖEŠî’k°pàO1Ëí¤ŒÅîŒ€ÊæÂc~y+ÝÅþ×9H’üp®ë ©ÝäÌ^ L]Û(¬)ýÂ$ú(ŒÀ¥Ë`ñ ÁVŽòðzŽÒ$o:×ç0Þw«Yh@¬RHïG%‘û8=Óô?æ¯YU×¢­º¡‹ùW_¦3ïÁ±Ëœ 2Ã3ÓÕƒüÄ”' êÁ¿„ËF£ËH¥Aö±Ê_äù°%O7R• ¬ˆ ÉA>¹ K‹4t‹öe xp˜Ž R@“DB@7m4žž÷ ˜…È<@GEtL¥JZ‰»;…”@f`ö|)ú€×`yù)PC¹ÿúBUÂ, ‘·_$³ÊÉ[ž¨’c~û4yç»8 óbæN :=zPh¶2ö.r‚ÅÓLÁ¡BéDø?j;­l˧"§`aCO“„úa™]$*sD_õÌ‚™^‹ÌÍ W æ,’wÀí¦³0¡üGŸ€ïHù!ÿP‰ž ä4†Sâ O"D·ÊÌ }_û2„N7ž´À7 ~€uãSM`85ÚŽ\”@릺³:´pò/ÖN_SÙŒðÚ.ã YàI uüµ¬à êy² }žAÈ€ž 8kÐ4oÌ’ª•Ò$0˜€:+LŽ=d½t1²sžB8$(‹†kþtØš‹´Vˆû'xaâ»7|uP¶e,ttïÜÝ*ÇÔ!S¢¤;ÎöAûÅþÆ@˜ŸÒñ$$Ñ ìî$hNúfåàïß—]ûFËK ÞBtì'¼dX#¤Bû¥§ð‚e>h¸ Uú$3¼ec¹$r5 ç¹$ÏHÈr°ìtŒÄÅ?úHYB›ÌEfºÃ»…hþ@<® CS¸ËÑ«k‘ÛÀOZJyQ©€âˆBÎ@yW2Bf᪷“ ½tvLX KL騸zQZÕ`Ð$Ç[ÚÄg§ƒ`ƒ{®dX<Ø«Ô$d¢æH$HH…ÄsZlþ^|A§‹œxùØBKe†±g–’º%î>» iF6ðªp3W!Y$BÀCù@ïm~>žå>}k 2…΋öá¤Ú$õTæ]î•üGï­Œív¹N½ÿ€ȩ̀öšU :p|P{iîæ.ƒ±$¼Ý‚A…ÛË ƒ¹—}èîûÿMØB;Ð+"˜¦ÍÖS<èÆÝ* 9èbÝíò¾u¢”›ÈJ]õè¾Ò@à6ŒGï¬o±”ÖoÍQ}MỨÄä!QØ!§Bycœì|ž‘Å@ˆ² Ùo€^ÒcÝÁŸÛwü•+`¸væd½„ž‰ƒÑ]+«B'y™ý¥ÂÏçüÏãŠÉ`é\J5®ÁÔk$m`L {á§HLc¹ÞՙĞ ž Ü{Ä㦳Œ†ÂûÀqÉ870ÿÐÖ÷¹þç|Ææ¡¼â¡îðÙËeKb<†ØÀs Ò±9528µ‚Cè[âà‘='.,@s¢@R'‹@OfÂúË«Õ6CàmZ'§ØgHy Î`=NbMJʃ‘¡oÜM󩉛~ ¾ðÍ’0p;s3ðˆCú†Ï@V >µÑ¡[†`<ÔNAdÑ›¦Ê—$… ¯.W¦=’:Ì H>8Nß7~›Ay¯V°Eÿã :pb‘·éæs˜ÅØúÕ¼âôê8±Æƒp–ˆ:åìRì/Šxž/%2Æ‚I#Ùò0uiÆn4R©R¡„ä s¾Ôˆƒò6Õ>d$É:zÜ4,¯fÂ×îH¢ ݲ´sÏýFƒÛ­C¶ßƒT#”„¤@O*p‡¾hɰN ºÁ„vvâÄmè_6Ì[ÏbcÌn^®ç]žM²Ï‰Zd:AyxÎ/yq-êøm )› ›Ž©õMSL§@öÓçåtÐÜ}°l2wRža gk éÂÒü„ï†_Õ$xÉ6H:쌯ÁsI˜µùoÂO!h¤wU‰ËÑNäJDÁáó ïš1|Y¾…Ó–‘9$èH{˜rcüW®tâËÛI7™jRÀp°ß×X‡SQ¯xÜÌm¹]#ë¶a·#Úe:œ\mµî:îÆGCƒ‘¨€þHú#j>mB ôÀc'ý0›"ör Ìf¢VU´ã&44ë[vcWb—g \ø*s[ÁÏqK1rY<ºeçnÏös´Dïø/Åó¨zKkÃÝû¨…^ÿ$Çíü«•Cë! Bº‹ì(Òçÿ“t°Ñ¬úß¼ ?9 ;po«—˜Õ X5á)œ† ‘º÷âP|ý8m'&Áñ+—ÄúF—Ø(J e#‡¸9`ä¡|>ÃÆþ¨­â‹tç½òäÝßÜ Q£†Q£ I¾i"u° ×ó–òsâÎH‹w].÷ëùöâ\¢W,t³lÿvùR¥^ŸépaÒ­šÙÒ ÀE2!ˆ·Z§«ÌÙø%Å<„Rd©N(œ,UÇЮËÈ÷¶¨A ÷Ùµ˜ß½½;’÷»ãLê„D1 $õ|é¨É*¿!±Ü,“a:ú4Çà fò33§— ;g+&“Q"ëÙÉÚÃ’Üâfù·t}$HçáNV¤J†åÙKÚ½(ƒ/2õû[xPzp…ò¿+Ÿ{×ÍHµœ Æžc·]œáa,‘ì;'€dþù´žìŸßÑ‘ò#gtÓ„w‘ÿÉïïט0"7Ÿ²‡ îq´|h²{¿êŠ–8ª×ë1nÞe¦Çí§÷|Yâ<Ô ÊrйFd>ùŒë}YÁ`ú%ëƒj?˜Úv•9ŽàÂÈÕad|4`dPc|j—½‹ÔuÛ;Q·™p@ÞÃûS=øÂng@ÎÕSÍ?#ªñ$•C4ÙD‰$¡=H5®CÉ9‰È;h}õJ}.ñ[ú€®çÂÔÃx8ž“¯³qH¶ÎKºTƒhÿGQp7 õVql0þB¼lF‘ L÷¸óq÷ÏþX¾Â¶£¶¸w]FFD X®Rc<X ˜·’ÉŠÙ]×é}Y_ë•Ôº(¯©ƒ" óîŽhBÄ'A Ò°BÛŸqÎ ¯Åá[>Ö®ÍmÙø'ü@bîÿá6 ZݨŠîÆ€é*%¡àsš>go¹ôiô^^Ý k,6=~A ›3’íæü\¥K³$¸¾®FþNÄEéJ^? 0úP€OÒ·ï£ü½®ÚƒÖÞþ³^š¸Â:¹‚î î¿ßªqõ-Ù ¿dgñ{¢ýG”Ý_Xô^-Ç0Þ³œðó–+’‰ì Zü/Joæ³U ¶hïÿ_×Q”i°šF²›Ÿw£ÉzVÏWi~ÙБ—Xä‚ (D®t¹îÞÆý‹_"èõn“ɳ8ž™ø×€|{àx€gî|™éBÝ!ÀAçlÊÔÎ6 ¹AÖ$É­¬¶y‰ïdkã {ì}œ¬Û®:N6šŠCó±¯Ç_¯%/™\ :ì;Ôú =Þw“„WÊ]lÝðï)ÎÖ¶ª[u#¡Öë¯% Év8€ô̦hßSgö‹m%Õò2|SÃ’Qã½½œÖòqä0ߊG[…‘³‚§¾!¼’˜ 4ûƒs—èqò60xlBÀå7÷žîr°/ð›™° ÅïÔK“Ž/G,n‘/ÉÚ™I–xÝofZl1f’žìh÷ã&50`b{ÞpòIÁîS%Ò‘]>ò™œdpòðü¢K•¥‡Ñ1ÇÏKYö݇ÛΫÂwÛàñ¯RœG“öLöž¿•7€BÔ+²94#ò‚8¼ÅŒë(Â@Yã:AtòðßûÑò=pkÀàA·V¾ìÚ&øàÂäÛƒ³©ÏH›;ÛvÜe—ÔÒæs½qÝMãÁÛAõ©ÐÆæ÷!gp—A‚ah¹¯uJ<&ù²9‡êÑȦ®yYÜ›™•xÅrÖ±žÛ›÷öÑO°§;Î3~ÇíeÞÔW†Ç¦<¸ÊŠ‹zÙÅ / '¬òÓr$›ïYÊãºÿÖ#ç½ï‡”X“ãVqèe²æ LùÄÄ[˜ô=`œÞË÷ÍÓnݘøóirÓbú$hBz~h°@¸µuÈ@“-Ò…üqЃ0dæ»Àâ®Þõ;Üqçs7"ùH4Éý±””H§6W§ºÑ¤/0f4ÛÈá€Ù`:¾¯ØÇ%Ïÿ®–XÄ{@}²ŠÚ¹0uã¶„`è#Í]Ü~ ÷»Pè§giqÞ}F½8üªWoþôcí×Ì=\?çâü­PJ=çuÜöµƒ{Hj‰ýÖͺYÂVŸ!*ß÷®ÜÔü§j†ä˜–0éëôÿ$æwŠî︽È[Nê³·‡­Ä ÀfO ÛZáÕÇ¡m‡Jÿ!Ó“á¢[ŒWð3|P–ÒÇP g' séßÎOgР:‰çr¡·p ­¤$šªÒ'-Ô ¥ªIâ,©Äy”Ì&™Ð¾¢›SÆH×ÖЩèÄ3@ú nñ èR¼JBãÅqå`ŒÖ¹kÖn÷pfhª²ÈoÚWè§ÕuÔ›ÕG[烣ÒÑ šÓ@öúiرôúJnÚù‰ŒÒ¾­ɯ¢¶.[ä7Ñú­"PÄ™ˆnè~Àá.ømb(œH„>×$ƒ‚0þa˜yÌΧt5C 9_gý÷LyVÞjÙL5nãþ»+œL€FÍÔºVóHFe<g€äÇ©ÒË«T]Zå‚{¿ž°¹1wiJ–q›8®ÀøSkÌ .ßý·©T8jÕÅvL&…æî¯ÔñÙÚ½) LzŪzvHá·t† (ë`œKµ/ã¾±õUʦþî°®!º„Š¥EM}IW†#?›Ÿo’ú‚8¯ÀÀ¦æº\ø7Í… AA¯­^EáéÜRwǸÒl€˜‘UnÁ«-zþ`Z›‡ð…·AŠãºnÒÿÁ¯‘¹ã9ýŠÁôKÃäûýÅæ€®s£×ÍJ¾ö|·±ÓÕ€<êèì¹ydä/¯üŠRBºn±›>K“Ũ[6&cûgt͇À" ƒ''ÑÙêÇ2.³a¾T‘¦Î ê-´ "_\mØ£åzéy†3úûÇJuÿ:bŸXÄE_C^ÇQUf2t[KE¨âÌiâ”G#÷ñ-¬§Ðþ±q:-‚]ˆmŒJ•FOJtZ ûŠqƒ§ $ÙÔß1[Žf…=o‚þ÷V÷{°’ê¼ )i|.L1\köZ*@ûT âcùÓR¹ï=ÚæšElž€â»noÔš5·—ÊšáJV1˜;¬¢šf©+¯5ð.ñ]bœ¸óÜ,¹wZ:ÏŽ!‘€ E¥.ˆ:N.ý…l¡¡´¨×£5]„Â.SÏZþ"Ü´5Ð.Kô׃¶Ëœ³ÂŸÐ¶´.óåß{€mdM¯ýÏû©C¸Z€ðÀ?º––qÛ»ÜF`Šå¤¿˜‚Æ_‰„1,´‡1%·ù3W(½Iõ;ú)Æ-øÿ¢”=‚ Q²uIÏ}Î)àÒté‡5L,ºn»ÿ¿›…ÿ¨ Ž›e¦ñä©“9Ÿ?õ˜¸BòÀפòÕv@-P|0‘Î2c7óÇŽä<éç±—,€`âÞ¯zêøèËä‡OrS€Ò/ÔU½/âæÅ×þgÖØu_®9Êd?ë³K8òä ÉÎI-Ƀ$*/±f,¢\$B`½m¯°?î¬KÃÞ\ â>ÿ qݲmpiü¥ÜËgX”6“J Î/òÔA;öþîMЬàªi=준^h’µþfªè ÄY¬]vHXn{£Æ•À.†“Õa%˜i¿ÍŒoô ¨r 1²!å©–Òw‚ÈÌuÕKó"B¼¯M&/ÎSÛðS9A¢0óáȸ¾j§Y“ éÉ„ÏFK J!ó¹œP9‚.Àä_Äzd=Ðz•î11qï}Çy¦‹§'Ôž¶"Ó¤âÀìoß9f¬Û.x¿`†¶PÈ @œùíjBŸûrám« EB®=[H>,âèm¤gnô Q5r8â¶9¤=~33$Þò¼ÿPŸÒÕ×XE’‹\û­ƒ9ÈÝžøE롺šèc¢i`Ç+Ïz-™Ôãfdñ†Q@"âÿcýðwxXl«ØuFk  x|o‹°$x><À¥S\|¸¯+ôþEøˆerÙ·D™– lÙˆâ EþÚ^Q¶eñ7¬Rª9 Å„q:Àbùu«¤Zì–*W­’›Æw¸wg Åc¼‡H>¼¯4ÿr°v¾ëÍ~Ÿù>4ÅyV0r=\l› à 0Ê_è~ÙÆ¾K.#ÈÖJë„ OhÃ_¢^Îd ¹ `>`_Ö‘xÀÿøoV©ÑB´4µÌù¯]¦"™34k€€4 ŒÐ…\ºåxŸe€5T[ÝñÇÀ¦ºš*Â2´àNÌÅô±ÅøÖÎ\|‘s½º#2ÎSµUoì]œƒôé+Ío<õüê7Áø3ñ‘y2œ²LržÛ“†žPÃÁ;ÔREØùÇÍÐÕ#êaî|™‡ì±K¬1üÿ_þGœ™ŠœJž;-}Ááq¦Ðœè’ Ç‘‚§„<нëÕDø³¯ðW!AJ’¤ˆ»àBPò *Þè¾ çl„èNG Ëòƒ¡ëNpðÒ!\F€©Å¡ÛåEÈõ¶Š`Òß2ðý6B Ý®'7 aÙ"!`QálfļµùŠ9©A#ÚzÏÛàRî[ÁÕmË!þ˜7¥:Šl…7äô<kR}V|ZS¿EÇäOPJˆ<ÞÓCaÒè!š¡m®æp"PªÉ½c±Öë|4d:NV¸26AëûhÅÙ§ ã) qnƒyÀ ðœÕštöÊÉó¶1†¾þÇf5RêM_8¼ÂxJgïAýÓH€sƒÚꩺ‚‡(Ú„'Õ©ÿµ[NgCt¾ƒØ*ñýÈÈYz^—W ×jpï·O~­+ü±kM¤ÆpE²iÛàQ¦(õ–£¥€'Q;ÙGûãÝuÎHÞÈPvˆ0gx.¡m/nïn‚?G.“×@µI×99¬p¹X”èIG—/´¬JÄ‚?*/³Ýy*±>ÜÀye-ÈoŠœâzÀëÆ)žrŸ+h'u÷üí‹åR»¾Ïw=ÕõO ¿ßq7«=ë¶ÚÝ3ä ‡¥1ò`°Ykp•?*@×€7½kþ“S#DÇܪõÓÚ¯¥¤9ÈꦱÉü Þ$ß=“q€¦ieÞ,øTÉ,ŒxÒvTrêdA°/ë”/=•ú±Õv«Ë<Šv–rÝAèükaœž¦p3yÌG¹™»(^d$\\èÖ”D£öxÉ ?ÁfÓ°ËF!èúm×cq|ˆµá"¼ÒTd~0­ç¼;nÂ×ÔÅ3¶ÉA$ˆ®Ìõ0>ßIOû-•üeÓG‰9‚£Àõ)žßJˆdSu¨îyv`¤1¾S±þô ¬‚ Ä7*˜W_Çc+hp"oÂeKT^xKè£Þa’ÁóÂÃ%uê>àþyšM§=b‘3»K(¯¤3ÅÑba îô”Ó»pÚsßýÍÜ·¦Âÿ½ç‡PBnÿÏ¡Êæ rŽè2UŽX£kc[ ±w@ajÀ$ÂÚ‘s¨Å®K]fD=;dú©lÿ\ÍH÷8m0?X;0­iÙ 87°ÒëÀúïßÔm8äøðÚßæ›ì)Ð †7y–Þ‹šÌÜM`ÍO0.è\2ÄSuÀæF<𻯥(¼¶ 5âb§§G¤6־謇•¬˜Þ¥í…Y}ogÉJš¥÷†ŒªOæ;ªƒr¤dU¤*€,Ês‰È©r†6Àˆ*³"‡ž™ÿË@ÉþˆàµyDF("8¶B· üÒ^Æ<9YÕu•lÖ¥æ‹1áô¼Xè9A¬å{‘ ùÀ ¿?ÏÍ1Yß¶a¾‚g= ë[ C4;õ$y‹ˆ@PQy›öÀ(­0]gf¬rT¥¿Êg·AüÞ}xœøŒ'TE´¡O¢ís~dK5ÐW©¢þe‹Øá/Z$ F†J@ï§þü÷a«¢—ÂÁÝ8®*Û\3kܯ® €xðvÉã• :ί-À¹húó°ãp|ž[7•Îé?]¥KvHÊyœbp0”ïJHeƒÙÿ¼àk¶ ªéÇË;ÊCßµ[“B!›J9· ò°–N³ó”Æ&K–þŸA3°ª½K¤ØZ8vYêȆÉÞ§ÏYyí‡ÚÒ¼\«÷´\$˜Ày4=}çôA­—ÙP.*€ÿáxEt„¿v´‹@Ç9êýˆ¶ÝBÍ?ÃÇrMé·Sþòus‡¨”LõÈŠÞw^gË…OÚiJQ¬@“àúãFAˆòw¾>‘¨Ao•½ä¿är‹ÑbÜáóš/E™Ä2˜ˆuÁ‡¥¦ýPÙºdß[Ã~bÔØÀ8;3˜»Qèòÿ )ûX´v¾ÚØok83›e/ˆ  |Âÿ £‰\É 0ª}¤ÔÁ[>óq]ÅÀ5¡Syz Aÿ û hB/Wû¹· Øh°ãb£qÖŽ6ÝI쫺Q>˜‰#À8mÆE(k¬ € ¯·—Sr¡CJ½ zÌrS/Ücï[öãdîê7“#À€ ² ì/ë—­àkZÒÆý¡8‹ôYºB¯•ÃךHºžq2-ðä=Yvvö# C袡b‚ ²°62׫Lå]ÕM¿BÏa…®¦½¹$øl?Í•pzhœê¿N„Ï´ç±äÒœË-ëæz>ã‰?ÿPʆ¸ãÐsÜ.¥M@ ·uè@PÁ,fs¶Jåx ”jbÖ»{·'?åâjˆ‡è±ÚÒý¼¿£ᣳ^þ»S EQVÃi„$§cÐ{¼Ÿþ-ò,1 Ñ¡° ïìŸ)DvKé )Tˆ…TׄôO4)oá M=ç/D‚Šˆ¦¹Ôêšô®½ý×vÜüž@ú¹qÐsž¿¹*k·6Ÿ„už)‘Š 2ûzž^öws²¬Ÿ|™%¦ K…4о2dA¸)ô¥Ì\u((Üîû'äzÕmÕÝ#i°ì3ú®…k°Ì»ówƒT¢ &ß pÐ ›Ê5TÊÖ „Ør?Ù]1–³Ü±)ÅLFð€>÷ƒ½ë¾ëÖ§KÆè- DPõ:ö½‰ek5fÔÌÃSfð@ ‚«Gì'ÑÕÃnšLˆ½ 2ˆDèK´ sñT€&…bÔCz„½BµâŸŸ°f0öc÷×’ü¢³Ç`ðNŽIŒõ:ë™Û‰=;¯ W»z»r»óŠÁß—îe¡h€q¨{ȼ7*êØ˜‹e,{¡cã-À*‡œ³ŸÐpÙùŪ.Â/nF‹ØI!ÅQ»«(;¬nBdë{ ¬„0,Æþ†ÂÙÌ_&Ú\iLÄ8>]\®Y™(•bñÆDºÆˆÒÞt?ÀÓRg¼@ÏJÕjº¸±_8‘c0”ð>µõV€ñù!’Ñøp†žíÌ™Œ¦ûã:ÒÔWi<®ü´`—2õù€í¤¹°‡×éN´PŒ›€Õ}·5(ÚC‹¸)}‚:>~«}Ç¿4,dÏOéú5¿–¢ªœ^0éÀ»s¾¥j·)’µÿYa‚Çc ÅýÒl­*šHhj¢ àSë¯ÞØÊ8@5_8ÓáCØu˜ÝÝØCûÖ/‚ V,ž}̖ΟÖó܇+D¡Æj29iûg$n•­¯PŸcØ:C—«êm'Õ³'T&èÍA„Ð.Rfäøv]Þ`Kœ÷ú ¸©Ø³ÉÚä‰/0]Óv"áýº]DJñî|·ÔüÙ÷/‚ÑfšÛ}ªv4ÐxI냫LÚîÿ€Æß/ÄÄg©TÁ‘"a ãá•gÍ¿#m¯ƒŒ1£=,Ç™ï¬h»®zx’ÛhmßõÂQXV1%Stau®Î±yNÌÕ¨>%q8h÷²“+Mçó©ÜÆtëï{GâV.£Cú4×*'ÙÕ}V€u“ê-Qï³]ÎÏï«Xpº=†dÊsœ­Q§¢'=4€ˆ£C:!€šÇÇè>ëG'#;êÌè@üˆRú3ÔÆÆòa+2[™~¬=ºv¤$Ì̘[~ù-·2] ˆfÊ[ß }¹ Ë[0ó;%Ö倸3£mCZǚђ¨Ò&·ï¬_PæáþW‹¼–j°ÿr8?ë—©0IÅVx¥ª^Ó«ûŒîrý™n¡¿×³ç]µ-W|P.õ8õþLïi¤=Žê›í¿p7-6<,¾•ìRÉþc~ XѺ«W×MËâß07‹ö{ù(­K ( –JJê÷6“6ntŸÒë¥!™ìm¶«’ÁZWQ:óòœA 1F»Ò¢c<ƒ­y#Íõ±ö=-î¡üáñ^ç[£pæó>ï{¨ ðtZ ¾m ú€÷HgóÁê¶ýÕ‹îòò·ÞF£ˆ:žã‘د0Òý6¬ œ=:\ŸvPpc_æÕžIë\•S´ÑˆxHÀ fjÙ¥ªlc¡óÿz€ ÞAduÉ+j´YL—ü|HG‡½ ¦kâÄc[6†™E ÓLÙ<‡·,¬mOÓÖÇØ@–äÛÏZ%·+ÒÛPšöδ_ zÔiÆÜ×ñûÞÆâs‹VoýÝœøÅþ ž´xYK©"?Žx˜míôP;(~#E­É\Kimºäþ` hé««Üð× ?ö+óÙﺚÔöCc«Î%Õuî€0 ìÓ‹0Ÿ~Õú Fþ?•!ˆÐæ³Ó ˜ŽƒÌثà 9~=_={ê!Kpq)œZ§IÓ• Ùîâá÷ «a4vM-+¥è~Ñzðvˆ~ƒ˜*t¨;ýCTÍ‚Óyÿ°ÿz¿«”©ÌödF€7HZžõú?D?›p ª²è»¨ê/ ûçâ&˜Ö†…ÍÁŽ`·D(P¶e¾7ÖMúþëG úC®¯á`e¦¤‡Ü8~>»rc¶Ö‚åñ+â¿uçÁ³4⟠ˆ(ükýü dçz0'G‡—ÿÌLÉ'ó©ýË÷¿ôË^HÍ;B’s&Êt$à’ wè>æ];¶êô¸ðahÕÛbó±ãofß[s•:jº¢–6/²bC¸±<âQC¡t«]ÛáÈ…©v¹{,ÄݽÿïûbÀ{²/öîʳýTR•³²<Í™Ž^Ãçöÿ¼°Æ{-þnॠE4þhÍѱÓ*ë_ÇÛo\PUAæÄú Œ˜°ñR©i¶jÿsB¬Z#/,5Š8°³ú02[Ç.¾ü¥-H:[_X:¡)ž÷y±3®¼Fß\C¯dͧdA­Ä­X¥áÒ#¹D ø<ˆp¨˜ †çç°· Œ¨Ö7S¼)ɬ߅:iê ûûg™Ò•½ˆFrLHÆ~í¼Š†J2‡%á)‡b):éÀýå¿¡xw ž}´ë®Tݼè0.¦Í²&>X“ÒÝõ_† tGýÍcV%…Ûê~<þ(£ j!¶Ä_O¯Ÿ‚ôb°§&Æ•0b^4(–ýèÂÞéˆ=OoË Uðä"î åh‰SË‚uùƱÉr:&?ª±NæëDöwIƒ¦CXµ¨Ø¼Ýà=ßÓ=°ë/²?H.M6ç|»µ£xé›)8‹«\ø>cÏ%Ál¿o8'ÿößyóâª}ÞÉÅWð]Ý ø™¶ÈɈ˓$Q”ÆÓËßlZœ _Ã*0¢mÅòu„Fžõq@ë›{«æ|{”pФ!£­%ÇXcMÅÛ´ôòPÈÛ‚™Ì&çœ÷¡ˆ±DIö¸}ùÙHÁ"j3LW·$>Ä»(%X:8õ=Êæ;¢‘W¿wQkÁmc/‰)+K†™)žù¾Šú¿{)Tš·ìÍlî z¯éÚŸvX†Òs$§7ðÿ‹X‹Mô€'ÁO­<‘€÷Ù-¢çwÏÐáÖ¼‚- 0a¨¨¢+LNeÒ»*~Gãzó>Ù’–æ¤qñEy)«ÒB|…»î@ö0üÎ:¿Tê®#G 4…É0Т ƒÖÍ“=§¥ñÊ×ü<øËÊ­P&Y+›Ö­E¤×=gÏ“ö^¬ÊJM±è%$ú›Ôºø‘ÝÌÚz!­÷7žßU ivé{ߟ š›€Š/`ÛÁÌ ^íj÷w¸.q;ûj6T{Ž?—ü §3~@6 \‚Qš×®A®$Kf@ví?2Ö/Œ‹Å^{ @ú42¦¤'˵8Âé­cØ_ ©Ç[’ýÖUœDÂÆÅ­«sÙÌÊá6ìòd}éUÓ#Šë>'G °ë€UËïj}<Øçpªÿa·§Æ@þ.xm+Òñ¢¥ç‡Dሢ‡dPöÞGËäþ´‚W0©Ì:äx!ÑsÓ9˜`Œ³‰ò<{z ÑoÕ#Ά7CI‹–Áäë½·«QD@ß9à蹨@àC)›ð“¨³3 {&½¼ “´îRy3A†ßˆf 6ÜÀ¿Í ®U)¿žNcqÿkç ð|¼üd¸_·¼Â¼<Ûå*)5fü¤©¾V=âæg [I ÜqÚNÍtûÂÄs Œ³ß.§¾ EHk±ë÷‹ªt™‡Ö`Îo!ˆ€0æ €IsŒÇ¢ë.˜-ãû1÷4E‰YQÀ¡µ öÆaRûû>,Úd-.ü-I’4+ÇPÛÂÇ„@üôßæ cí=©ÓæšaS!àue¨¼ç3ž«æúI–¹™8жÒç9ó‹Ì}ºº—åGiÆ7êK^ g¼‰û •ïŒQÿðbŒóJÀ:ï‡0ð Ô3P»­]Óæ¤pƒÿU‚ã°Ì–õ šlÓLï€6yJ_n`4ZHœ .Ћ ržŠò ËG:pì˜ùyŠxá¾gEá¿‘¯wÄ”þ¨4í‚ H6ÛW^€O;¥òòömÞG©ì|eâ[2»@3¥ T»¼c°" ˆç5§+8œ#þà|ê Æ"H_ò:2µùñ´ÏÅù¿ï&ÐzûC"Å£7>“y\œ…γ$ 1Rö­v¨‰CåM?º•Å'Á=ß/…òáÃã[3 :yZ<¥*ïøu«ö˜è§Ë`üºs†ØàayŒöÈT¹BÄ õsŸ±ê¬@&Ù#Ž8õÚY€Âp“kn,à¾Y)` o¹À!ÿCßGn®­Jæ:DÅå )Y4­û}üv ø°~2Çqlç«Åƒ%“8ÃâAÛ77Ã’g?MÏs’Åh“žæ¸×ú+zŸÅY‘÷̈Il1q4Pù¨ˆlÜYœúê?£U{®´UÛ 7=&U°Àä<ˆ]f¥óØÏ  2ÇXa“2meöÈ<éø^sw—¯ž‚’‘Á!ª9…0 ÝùÄøî³Ú7B»BœýpàÝèûÆK~Æil¼Ã¸ÆÂDËf0£A " ïØœ=ç[þ7Jþ¿nƒ‘4j\Qø×ŠAu, ô0 ‰ãFS[ÙËåÚV­è ¶U­Ö:ô-CØ‚'\™5²€×s»ìUSƬ­Lc¹ž¿Ó3ÛÝøÄî2™²¯¼Òí Žî@Ø„›òÓo<êçà˜u½Y9 á€,Tu÷Mªƒ ÃK%Ö1f<°ƒ*f¿ÇÑëú?Á”™È¾Ûµ=íK½°y6zRœ–´åæ7jp»‰€ÔXMO1‹™ ii›´¥ŸV` ÀçJ¾‹œ³jº ûŸ~[±áE¢cþ4¸PAÝLMÿ£Õá0v‹ÙÕ{5j—$” {àï°ß SK"r£¦zzY׺¤i©Â’+ò@ýn4 5¸½7á …ž–[yÅ÷š„|wª¨Ùg?&Ùnÿ­F§šYî”hçIö#Û’ã§ß¤™ë.²cŽQ ŠJ_q KM.„xÊ`§«N/guÜ…Làz›š^tùYÿÝ>ÁCÕ¸yJÝ=ÐBtê-„Dà§GÀÞÕ1¥’à[»Zýï=Å«ì‹ÕIÿÜÆŽe¾^Ò]¤ª!âa4´IàÞaKðöO¿³a¢õ÷ zõ÷×û¾…ú¬M¡ÒF™ë/–D1Þe\†šßªo*›ØÐgx»ˆ@)4¦Ã@,L&¸ú!ê0Z1ŸÓΨ\‰¡-‚Q?“óèï=}Ûbêï#r5V n,t¥“ '^Yã¼›>§ôÿì…f¢7°üÐðœ»ïˆÈ–n@á¯æäÆzY:õº¬ÈÇJ¿|!œp]æcÛ;ÍsRíükrCßc8åÁ‘øéav”ñN0JW„|‚0,+Ï51¿'?ä˨'#0(Ÿ¤Y~M §®¸)Ê"Y…g’µy½’óný³r—œÿ{®>3_{ì3³ìx’O Ý¢`z?°/£pÔ0x¤ñ½ÙoQMŠš¯>Å{‹ZÝwÊsaâ‰5X{/XVÎÅöͼö®5Ý + £ã~¿É.„Uf7ÉH¡N;v#ÓfÌ1Þ²ÆÞÜxå}¥¸Í»!³“¹TßÏyêîàÜ}Ìã€`sñCbb¹Vá:t³ã÷©³;¦s¤nžG÷ç-\¯Í7 ÿ'ºôQšö(ù¬Ø°²€Ð!í7àH€ÙNþš¾ôÉ=.´ð|¦·¦ÐU³¹?Ì~ãžÿ~èöê÷ÎŒS]ÐÁåë¤5Y™jß ‰w“êVGýï0Ò± –U‹Èüþ»NÓ¨!¬0nÀ+éÅVˆN2§BQtGá;Õ7£°-c‡õ ÎÞ4P`É•×çPëͬ`³ÆªŸk“¤õàþkç'äX½7ˆgAºƒ¦Ãºˆ‘‘³ÚU:¾ÌJGÄ ÏóI°ç“{2ÕÒþuD¹¸c}©Î\w\ß¹+ o=’­ÝÁónì”þ ‹-ÏüóÝ´ßP®?jåßÍl—‹…Þ´Â9ð}+þY_¥|PÀ‘9þó**DªƒÌSœ‹àÏ·²ºëqõèŸ(B·ŸVKYo5_ªµä–®¥rÛ]WqW±'ñàU¹‡ž1SàD7uÃÚ®ñ³8KÝ”¤¬0hoàØ0òN_%/®G—ö+žu¡4îéFÄ] ·[zœ"u~­Eߚɛô´Ã=„‡œô,_r’ç…"Ëߤë8>v0ûÕ¬Uð sd@w0Åj¹Ý‰Î÷öFƒÈÈ~Õç¡I¡SéèòX_ö|®7ÌUgOoçAºŸJÈ?xt+¡á†4OÌÑ|±}kz5J{ÈS,,L† }‡ÇšKN#aÊõ&$Ìi¿« VX¢Aþ'R5î¯ÿ´ú&ù¢È`Vko†¹Eô¥ôA¼’NÑFåŠW‰j¬‡H82ë|R4r&öùYâôeô9ÉU ùï=.çæÄF}k¦„Fn¯¯´õüÖ6ÿM-ú­!ç§(¥7!lü¹k–;­ÈÊ>êI§øþ“¬È½ìînmrK÷Ùˆ •Þ‰ ¯?¤_7‰úƒ´[S!û‡ýðr¢—´4Å=”y¬Zkÿ6ËŠ:ºN%ì€l-м¶vWÒní0ûþ´ß÷u÷d~`ßõõp¤Î: émõøÐ@X/vYÀòTÑŒöç]OÝxçŒxXZ§g9¥C]ÿ*´v;s@ü@Ú€ôÁ¼ƒ¹9üjožœm?AöZô*6P†$˜Ã‚6´ö€imžrS  k náW·µ^}NfY{DÓÌÊ‚? ™\†åûägÑ}zùÍ D ŒrEÑ´¡pyÒzzv|nvyëçü¢«ù×SËX¹`GöÓ°Á;v(2PqùÁÉ‘7LWCíÕDjè ÈÂ;ù‘ С†ÉQ[Ík@·'‹Job$€.¿HL¡É€ü«ßõ $)%£œD@f»¹Ç¬]l¦ùTKbtWFßCûDC_þø‘¾1ŒŠssÅì·ò94ç]Þ#¾˜+tÌŠò7ë§õ„< §îo£)†¾”é¯ý¨zžxŠÑÔ ¼ÏOfN{Ÿóvè_Y<¯J¨xJ‡˜Í.xõÝf½|ó°žé  È”!b_VENÌŽª©àÔß‚}´P€!ÏÊ d×ÙßH/鄞ÅÃðH5‘4zbô• H€ÍW»´‚©ïÇJ‹òh÷CkÛŒ}fŠC¥gƋӓ§e=}%ȯnëŽ\”»!³!¼"©à³õ_-ÄM8̸¨Å‹2ä3 Gl…’9ÓNÐ[‚Áù/fµF]‘MËBÎÞY€XÞ··XK÷¡^ÀâQÀ¸ŽO¬zÕLÚ9^)ŠPXÕñò~@̳# ÷Z±ŠX48¬ïw‹ë‡ø·k]“ßšÇd½`ó;2íÇó ¦M;¦óDozP9àz(x@%ÌÞÈc™ÓV;,ø¯”^~DFJ£ M¼‰* `8ü»47gc›evÒ½„X^‘”HC‡ó8]ªB!ö1 sú¿Ù’É“àÁ¨øŸÒí äÍIp5ÿoã푞ž \LX; µ)•N=Ø8߇‘÷mÁÒërø 7\bn§½RUN$'ÙÙK)OÂßg}qf›#MÒÏäÀ¨poe‹«75?n|=m,©ƒAK°]¥iñq¦,[wº¢þW×™ZTcïJ›Op'²ÌKÞ›òZ,Ù~·Ä&A6ÈdŒ”¶Ÿ‘#"ñscw`­^ù`]7æ·{·ÊдwôfûZ?†GJÕÀ' §Ñrauéâ\C^žYRïž'0ë¢0d]ÏqÏà+ÒÇz3Ê*¿‡‰âÂÙ©Æ\¾ «ñp‰wõÆŸ±88L¼G£<Åj[:oº¤¿Y-ÈíDÄT–XŒóo(6#!yÏKKc O ¯¤)ïhä‰cæ ÌÈ ÅýÑzZO{jÜëíòÊEÿó×%TLÐqàù`àVιÐwêW.¦TOb¥©åS/‰á^9 d€H`ü–T.ÌNK¼7Ç«ÔþvÚíã’ee3»Ýuž˜ù°‘*íÿ;¸=ÌЯ’°¹Žb"Ùøa$/Sòq+¶¯'#'Óßâ–€Á¡tÙˆ*Kj”Ù©dᆊ¡#ÔÅ4%·g‚Œ` +gP ø&œß?m‘pTÞbí㹈|ªæfý7`Cèåš >2=Ò Å]¥€0À6!kü·ê‘žûÄL¾Ÿ³¯Å©™œ8ߊ";ƒÞJC.“Éo\.ÞHÇ_‚I˜öÌÿF hu_•Ò:<ä¥H"I ¦lÆàá¼s]aiqCnÛŽD I3‚ºægÝËl×ÝvÛ¹~Ô¯_¤ª_àz™„?}5¯Š\Šö‡“íxºÅ…oàõàÖ¬/xÜ,F°à !eãó7ÿ¾_Úße^Z’>ÿ´ò8IÄ«"c9ö#ÖCƒ´ÄäËV¿‡cßM"„ ˆæ@u2ÄiiÒÖ PDò¿ äMž*m?Œ·+üºf]özöÊQ§ŒÎÜ£¸°É 1–‡?ÔIm³Øi)Ó¸œ·õ’Ò¢dæIb¡Iô`\í®o<+u†ÇôBYýæÙ÷K‹·±üÛ5~}šÞs,ígt™‹qÙaSökÐñ¿nÆËmébæÒ ëÈ›²®°baEcè¼bÈ MÓ•W!0q„Ø7ôï³që$Nßâ=*ó^Äsø—E˜ÌŠËó\Aà ‹@m0¼Mhö–µ ›â•Ýœ¦“u”ÖûEOœÉŽÙÚòµô5Ñx·Ü÷ ë% ÉlÖ•›À‡‰³·ôô‚ll~ˆŠ ÀˆÆ Þ¹ÝSï#¶¾µà­}HP1Ëœé ÀŽ*`î¾[ÃsHpDÁ ¼f”§®æó9óÛÿL ”³Ã”Á5C]B¬“‡ŒöÏáÀ¸O\ï)0ºÇv»áÂrˆ_`æ°·Ã;•@žˆ#5 F.yb¿³Brj> ÑCRñâ÷})êÃÆ´qDŽœøù0Û j˜Á¹];GAùt<=¦ qkãa~Ÿñp×þ?w/×aâ~Ę @ô}@˜(c÷'ßië_ÈÝš¼YX·¨çâh³}š¤Ž#®«ÍIØG?æó+”o×,äÀÄD<„Oÿ>ØRÉo³ª—î KìnYö7Á—êÌ~ð´Õ·6Ä:>ªŽ‘ˆ<Í–²ÍfA×¥Ž+ªýÒYOVçXÞïSýøL¥ÚИ?nÍúN"3„'*§¦¹0ràãÁ«{ô ­L˜?šëÖ'{¦Õî¼ò¼T±u2!qwQ¥á5 Q“þ‡Š¢¾ ÖÒ[oêŠJ󇳅l}o–çë´›ˆ ¿7­¸x`Ö~+îvüêõÐ{XveG-AE0$g3 øè¥ª;¥ÃÈ Ö໫mø¬(úTË#Jäôö¶„«Ñ¿Wë°1ÓUäU Õ/¸u¾ytOdèb¾•c8Ù øØ÷õÄkTt ”rrè4 ÙoVCR} cä9Ó‚ù³^ °Í,¹äü©ˆü1~8òy¨å6¾ìͬÌâ—²—äÍÕÛ õc¶|³B‚ø§xÒM¿©ÕT'$ÅF "¢„WË[í)¡V…b’mÕ­/ï÷y1Ô~ô¾oszªžjÏØ¸úE2çAùÒ¬…Xòß|‘Ø9([w …O…h3é\4Ò>ꥊÎa±?sÍþ?ìh;oþ÷ss,_µ W3¼ûÖ!_WíH(F둺¡rCò-gãRXm‹(¢ÉO96wý~$Qþ ¡«°Š£þT-ß—Z€›c-e7øKA)KNú…8+çs<ýÕ+@µCñÆ­F]úF"þBE”žá¼…ÅXz…Œ (zïoþ €¬üØ–sÀŽnö{(©hqÊÞ—ðÞºŽ Î-Íþªa•fPÄÈ‘†Ù»€/äK}K𓽨;Ð!0fÞÊ ¸¯hDꪙHŒUKtªÇÄ×ñ’#›ù¥+FBBSýië¡C“í¯ÏÂck᪃çƒðƒœ¯Yªöà¿Añßi|Œ†/½ØÌD<>°õÛŸr%Nlô—'ÅÏÈÙ1æþuýhåtL7ôA¹‹,&ÓwÄøpÿˆn9¶š£3‚Þ ¤¶J+ÀùîIò ·}.ƒ?©œUø_Öõ#€DpÅ|`t¸Œ¯×‹‚/¬üßëâ½›þû@ŸE¬é“Æ(£êá©ÂwMKï<Ó~À\ڂújH÷š,‹E?= ÿÜêï87Ãâˆ>ºI!ëÿ  ð¡Í{úIfqwM_3•!sòX­_ªòÞxX¹n€VŽÏ{ÛÿÖȤçíÿ, AvÁ(…üp’½ÑíG× ¾ÈQÕ•·NõŠ€M\6ä©Wf$<ýmÁ—!<_C¢N%#O™<Ö¶5«VÌ{úTë IápÑÓÄR¨!Ü`C;/»ä0Ó6€d¿/}üà7RîBò²Ðâ:’òˆÀ鬯ccy3D`_Km²‘½ŒØ„©\¯ø«éS§,˜,Ä>UÒWQÎ,i†h}*´z@^ç΀,^ÁØ£ñlN'mœG'p³áá‡FòŸ° ‹Jq«—±*8m#¤{mRO¹L+wý=åžZÿåˆÄØ/~@i¶Û\àI…yYߨàQ¸€?7ýc›¬dr…~Ì7€ÂêI˜ó<ã¿“ {쮺|ûÕWênñœÊìà6^{Iöéòý¾GKðW30Ämc7”á yð!˜ôvQ““ý?ñ&R%å,³ºí7}Þ—-jÞÞâ+-㺠̈^ ‚ ç3 s5ƒ¿³° «ÁÆ›y¿FÒ©A5Bˆ´#òÃËJzñòòg{.sÁ„ÈÀuK+…£Ô£p¿+U:ºÆ[s]ÓØ¦‚‚H>”ˆû¤¦ €'@Ó`vp¡­€;-4Æ]O…½… Š€ ~㸣M£‹„D#~óíûŽ×`~EDÖ·hÎC!¥Ž<Ÿ¾µ)0; e ‹\vÞ/Q*Eï}™Âº‘3àòY©'ìÀš¨Zÿ¿-ÔŒÜyÝ>Wý&üóÏ"3s5\)Öi5Éôetÿjtæâæµ,<|_çʸû U@ô7±Þ¡Üa³{¯¾(#\œIðôP£€@À€œ•ƒo._íÈ&.8Zkgµ ¯·XšÍmÅÒï³îkH¦Ì𕵠X&S¬ÿ‹yŸÒÂ'>±[J. PÉX¼‡7lOuÁgõÍ;í8âP;¶(2zêX’8œýbyTÃbƒáºwd£>ßyD‚9 F“w——C³@$Bt?4+¶6»”˺ð¶0:œK“‡‰û°Ù(í¹hæwðÓ?!–ÖöGœ¶â«ÁÆ@èx; µ«D—Y&fçøG’)`ƒL"Ú§ù8ÎùêiT§\ ‘œÿä4|Y¶œ:ÚQ 9¬«¢Ý˜bÉJ¼{¼Vƒz“¶H *ø§úqÐw9Ì|ÌSÃ!Ü->ôåMí¼ˆ¦¼;î<â7r–`::^x yáΗ²!f–‡4üÔ¾ãêÀ‰—Öž§"ï®%4MΪ¤Â¾³ì\‹Ü÷Dâl'sžŽÐHÃù2É$yè\/á÷ šÞ€³ žóAÃ~ºÏV™çöçž3Ž)xëïa¤y5Äó<_“[œµp€Kž*ØÐœ sñŠ×ù°Jqšt׃†ò½ÇÐæ•cçf#0úµn¿gÜÓ…€‚” LãŽy®°^Äv¤½EºÕÃþ¯ñ ÿ0†Åp‡Çf^&ñÖÂÄ8 /ˆøw»ìsöl]vLsÕǘtS…€óCº˜ˆ{=”×ЦqÙ[Éïq\îgþw~ÏçoÉ0_/:îÓ4l¯†‚êHÒË]žpnŒAðêqñk" Ó²j“ñô 8 kc€-˜Ö®¼N¥áHmFZ–ÇAE•Ùî{èA™G“/ËtD÷Ï-¿ß$f›ÐÒ 6dþbžÞ/¥³:šÖˆwŸÔ3}ºˆ^‰½Š÷?ˆ,Ň|øçX8˜±í/ˆ(h>c¿*¶…š›Ðõ±‹_BèX€Z`ô#ýä^Rž2ù­rXog]\áà W÷óh±S¢ÉHܾîËLë~‚ƒyŽã³ž}ÿëðÿŽ–æ:߆€v¿°lþožx$PÛ“‰ˆ é¯$ïéö€z}>‡ŒþC2b$_±:Ï›9”Õ§3o;»k®•äscÕòüô‚R™ˆT0™:ï²&^ÒŸeñy£#`:Müa½Á®Ûƒ2=öâJ¿o‡þj«À<Ãë&åCµe1 #²cÌ7§_œ¨8‘9$­ƒ†zD: |oŠy•B€ÀnmŸÎåÙö+xQ>£œÇ6Âz|mÙ ¯U r£áfB«8>Ó%÷ÂE•³¥êHþ‚ýéÙ–2þPxA‚85¼»z:x;ô!Š_#ÿc4uGxÍÔ™ƒ0¡Ã-B ¡ª`é ”@„ˆD $+¦k4$‘(h d CÝ? ó‘_¸o컿“ÒÔ+tg„;·rÐ40âi–z3‘téîC<­\k+%á·¯Á“¤Ò%±x‹“5ïïUÜBž×r"¼ðPº’7y`o ò,œ-Š#0‹o3[#ÒÐJ ÓLJÁ>i•A×Þ?}pÝìè~×?®©Y:ù…30¦;¨ÿ;*íj·¡¬ªnK£ž &'Ÿü³–À=ߪHÕ’Æ*5"öF¦+|Œ¤Äœ{†Û6« <ã½.Õ¿B!¼e‡­Áavõ4¶—üsJ{>'·™©˜¸'DÑ4Ò QÒÜÄ…Èê²ýèôíÓžç?‹Íö§ã$P$sÂÁÀQRý)/nÉÞùK ÔO²TôäÜCBY@|²dí'O+ kF'Ž*h’œ SîWóÌíOŸ÷@ô¡L)aß•Í]¬½L±ÕSž«v¿ÔÔOCÐÛrÑêüUWÊÀÿÓd)°Ÿ®ªF§®³M7Uت¥3¼yåxÑÚ×(ylü¸ñIÛh¿3¹è×u©ÃÝv§ý\ÀâY§ÀÛ<ì¬xÐFú µ‚Zhº,]ôbKßÿ»/+S@£\ä;¸@¸Â®—Cúv¶Ÿi÷ó]o&?rѹÐhy(?¼§ñæ”òËI¥Þbªx\rx™,ÿë…zÑ]vÁì"Ä:v«ôj<ʺQ²,Ҷ䳚‹âøE[4:ë7Ä/‡Ù]ŽÕoÈÙ0‘ 0›ô¸Ý—Å™z,Ä$ÍC¦h㮂ŒÚ#,è0+Ü€î<;ÞŠxA†tÌO7[ùi¸£¬ñljÌþš-û0ÆLo€ðTð×RÐx'ÕRªyŸaÏÿZú.àÒ­†>`>‡² Þ𤇉Æîôë |b6cUôê:ÙøÈ/²+Yñ»‹½ÕwוxMšB`‘–äZcóh³A…Þ Ú*¡ÈÕV"I<•ɲY[½óã Â;†‹±úÝåN¿áNfþÇ›æôM®Ë’0þ_´ó´ý6fbÅÅO¥ü¦q ÕÏó·×¬'ƒ›O<Êš/öZßwðá€(X¶2ö^§7omm@˜Ê"³Êwõ‚ND°CE¬ÁoTÃÇÇfU`¼À©é[FFAª!” ÒÅc‘nFàèîÌÔ+"ž5y¨ù®ºQb¨¯íDêTjåÓ”£Me‰9TWÚû "ˆµù¤sŒ&¨íG£rY©O Í¸eV…Ä΢ƒ”4›Ÿ„Ž=q¥¸œ8¾_¦áì ó‚‡u<Š…Æ¤g M<óê0­ÏÍãgc†óãñ(Ò¤X^»¡–0€ŠŒ”r“w󹾊p4w[¹)vÁÿwTŒ(v'(½l²©ÅA ¨{Ùn<ëóªý±k\ÀY¥x#Á$€ ¾YFM®Ÿ¤š¼Ò̤ùîä[N‡ìÿG“¿ûÏËv”ŸÖ˜ ãTö‡>œŸÈ7€|t8K‰H< <ä!K¸•ËŸs¶]A⓼æõ}w{=×ÀZý¯ãLº|‡yšÏìí;[M…zN4IG„Ÿäó·Ü.úïÄzûwØç.Õv+|t¿êÅZ-\€öCôVÚhÕdóè–LxÒ‚=4É©lÁäÒ”übSW‘5F¥@q?ú®£„#ö›ÎŒ”Œ‡ÅÕ @3"Èÿ4cüጘa|öÌ).€(7h5Ìuf¤¹K᧘éP÷ýï œÄb¾ ( Ï™I”ƒ‰t‰ä²´î4é–‚à‘¥÷8(A€3ÈpϘ^±Ë¥þ/+ÔúŒ<ˆh圛‰îÔÊÆVJú€~B¯©²ËDL×Ë·n€÷°†:ùOï1ÙN—÷Å“-ªé<#±ãË´ÄxióѺ:·~vßÒÿ¸º4_’án f…L^»MK€´d+43‚ÿø¨6@.@÷ÐÝÈî}Šdâׄ²ý”´zØÔÝå’B'Q™¼{©DÚeµîÌc¯ yø™ºö3|s ×`¦ùpð«²5EÉÌ]>Ê`6]!¶ŽQw$Ý^€½ Öl‰9˜‹ÖÁJò‰ž'ÑÅ.󙵿)'OI‡¤hǦ{_$×k!Þ×þR3‰x‰,£H ¾œÚ_êb¸o¾–ÞÐ+ÃIaMœðJ=»âæÐñokïñÞ}KLÝV{l^#М!üÁMcˆýV,/ R ÿ±ùªV€y}vM˜³¸ÊήûÆÛÛg ¬]²ôòi/©õ«œ²öóœ²EQÈBÌ$æ9Èòþ\lLÏòîêCÅd}Ÿp5U[Ÿe¨•‰J ê^èf‘þ£EQù3Ýæ‰Kþo¾½Û;^8QpÌá§r–+Ïëp–{Ã̡ݱ ?í>$:=¾FñŽHOäD©9U‰òÏŽÇiúÿ‘]hŒvx†,Amšl„¬©z¾“*8€A ž0"—î¡*N¾ŽÂqu,´vu¿¯ŽµTT§´êéR¦HMô÷íÔú{Ñœ!Ví„Nº¢¾Õ*PSk‘› ùÉ×¾X¤EHd?°%#ÚÃ+‚sкÄö”LMn¥< ~úŒ Ķå}·+k¨î‡%¸Ìê!y|‰rñ(üГ‹àñuÐøÅ»5NÓÄ &‹’È!"S“ èÏÛ‰„Û'&ˆÁîtunb9*GësÃ~ï¤gùèAëù”þ£]¦þü=6ÊwÙkÊá¶Àâ}wɘä(êD/@Àøý˜y š«þ†§ârôϤ§mþü§8ŸÍÓ¸˜a‡¦ùÒÑcÎ(6Xœ‡1Øy µ)¹í1h7óÝXÌæ¿xÁ_óÚjgðÚÞ$ÈžS»=æ°ÐÙCä-ù÷â.™ˆ.{¬³cÛÒekÚæ+˜ú’^MvïäÆlHëþMŽkg´Kë8Æ‚Qh2K7áàËáBySÚvŽÁšUËNÓjÔG/Ò6Óš{S5¦¾µõÕôMéÖˆKÑ…ÌH¸Ý_DeZY¦ã-O |At,t ¾Éâ<ޱE®›A&7ÔÙ‚§­ÏB¦¶Ô·úŸøvÃ-–†o϶3€ZR>òÖ`+…ÄPsðüj~Xi /9ças“ÀV› 1²HsŸê“²Ùq–íÍæ¶¡G ñ% gæxùò©ƒ×&™ùÇB@IK`v@M ¼ªòåÄ÷ì„Ââ²­ 3a…ºÎºñBÛæI{ïú =¼‘勉¾o0 ÉC%NßîQ6Ô‰’¥@¤)@$ ]wñc€-D—%Œø,Ð%)$ÌN!Æ(‰ÑÁ@Ë@Øk@,Š,Œ4ŒéBBd€Hl—™ ŠHâÙ‚ ˜t|CÏú'Щ*Ú^Vm qˆ ÃSxi¼Õ“¾>?ÎûŸ¬5‘>^üPñm}{–W±ßâÚY¢?ÀÁ`f˜éžÌ{Ø®ühºÝ±m¹™¥Ns¬¿ÛA£ÕÝz§(žV0~T¢ QýWÏ+‚•kÈM¨Û_§äTоÒD_]p-âôÇVî*Æ~ÕzbFZ—Aj±Å9É)áŠî+_®ßbÒ؃—Â^ÐL’p=ßœ>c µ6ûÁ§òÀ=Ø ÎÚéë7ÎU\'ã %º‰} Ó19Ÿ ¥zï‰ïæt’SQoÇÂX©ãm~YžEjØ@ÁaMcÏ9ÕbLchôŠ$ø'ËW“œUñö»µ!ù×ëÿR“| 8ò?| “²?º*÷ïø“a„b\{[´fçŠÉ´ê?å{°ƒ> œg²šÉi•L  å|B;QãÆæhêð@8M˜ˆd/TPÀW‚zôó¼lõ¼Ùeʼ8¡MÌg0ã DÖF*͇4ÀÊå•P±IEÝúÔò¸‚eœ€×±°úæ #™só¯û±=Õ'¬òð¹ÞÿÒ4qÃr.°P=–cÀb…øh$ ª©.ZÇôUѧkJ|§¿ƒçÅ& 'áÐâHàèÔ/•2X“fœl¹þdé‡VŠÆvÞýÍrÜ'«&õ Cço¾C2±QމÏ-z÷µ¸C¶6ïøÈ?öžHmL¡WˆMÛ±LÝÖ4@J,WŒÊ«ã$¾Y®@¢iø=ò{þ]¿‡Ôz(raÚ‡GÀoDÕsUöu&*̇Wl1|²%Ýhåp¶jzîÚDy~DõZ3nó\tå<}•BëèuBœf³]sN†; ÷ è/wPïíZI§¦22Tx«†=²Bš{å»ÈÝfu?FÇ `Càmðòø¾¢üëì„ò ‰@ tzÞg #¯)/GjkÉyFvJ†‡e[¨{tûîWÀì ð ‚žP<pǃk˜j†ô’þ´ázåy? )êgá^T¶ërSuëS*|?M=Û4Îs¯Pÿ¡n;eÌøþc”qÌU†1~‘*·hPèùöjF`ÐCü^18³ŽüËwÐlPá€^"o›HùÌ\O¯v÷Ô†Uo!´çbôˆAƒuÀ¡Ô°…_h$•óÓùì†ÆŒ%ÅeÓ…[Úe—¬D"E>5´f»¼¨ìÍ8²‘ƨ³¨äÓjM(Ü€)ãH rà$è0ÕxpÉ9< à®ÿ.õÜ?Òê0ïòš/(õÑÀj‹n²F—ʔѴßÈúãZAÒÚ`Œ¶à.–«¦º®¶ü>XûBs¿§M¤!’Êq´!œ€sµ0ïøÅR”`pÒºŸ’–©Þéžë  žFÓ†Áb;fµE‡/'r·´ mœD“oL- ß'pL•_å(@Ö;N³1cM„p-̧Œ.ÈñÇCçC“átOR¯QúWUs¼-ªe c¥4z)ÐÊåí;†ç`æ1÷läGĸií»Rêá♉^&•=1 ŦËp^¯öóï×¼¼çLrØ6Þ72’“Øò@»YXjGÖÖѳü\$Çt‘ SÅ ³+Ù>—±_SªB3œL*Üu]¯¸ºFtl€,+§¼‡NûÖ«!7Ç`„qŸ}áEQÖ_—±¼Î»r=XÏbÒ˜ Îb)v¯`! 3v$[×d õе…ÀaFWœgéYz»ØÔ„UW܆8Šh À%P¸Ø6Ài\UÔŽbx>%?£>^…3Ÿø´ÁË_Hü¢øK»;h V¸ž£y_·Ø«U-]–@>ïS ²Æà}ØÒlPQJ\¥*—24Z¯Ž»Úä®CMp«iÔ`u7jÝ÷ßñÙphf—mS³¹u‚c¼òÏ1AÕH1Ùi´|¿À*Q€z%»)Lþ;y ßЃÏö' ^g î'ÏݵÔ(ô‰KK}HXúP̉–.ÚÒ)¼›FQM Šëoγà‚÷V?ÙÌŒîéxKK¾´þ³8;¿›üÐ7¸éŒ$Ì¡÷}Hç!/=€xA ‡/¼€p>à* ÇlVrŸ3ª[ã%p¬ÜcºËºÊ0ª‚<™æ MJ~ÓAUê‘\„šäWº•‡îê½\¬ ‚ÃRq Bý”’@5¼€5È] ÅÜö¾dõ? 4ÈY aW¸@B8‰ƒ¿üRw…ä`uùÓò/£Bð¸Ô¾¶†³Ñ6t cdö$AtÄ…}ûo­]õ”RZ\9¾£tµ„—Í èΗ;Çñõf‹–<}v/¬è­x™m3EF³ÙKÙõæt{^êÚÄ+²uábøÿÎü°­ŸõèøÉÛ¾U±IQéIÔYñ·‰‰vÓíûýõ­5 ÜlÄ!À,å§MÔÉZ´­¥fAr^¸ƒ¦>\†9L°; w¶Û|ÍÑ{ÑßrÉ×r²8È-,Ðóê‡^ñèþFAX÷çöî¾ñ–!Ûø×Õ}W†¤<^홈£u¶¯&ßÁc¤¬_ÅËHLܫ差¥‚Ñd*œ½B \’æ ÃÖ¼OÓ’@óþèížÊta‹òj§Àóù'ùÎWêˆÖàzÞUJ…oç]=šxOãfO›SQí<:Ùóë»no{`v0Ní zƒ'm˜@ ùü€2 —U)´ãÅ(‰¬¨µ„.¯†KÓʼnU’ã•w KŽŠYÐcÏðdÔ§Ç ‹Uþ‹“û4¥1Æñ×D¡Cú[³Ú´ÓÒ•T"Ž^†—~bPš9A) ”xJl¨Q£a1X®‚§kÝ€5‘4Ñ—b\·LÍè­}ÇöáfËé[ ãÜ1ge¾Ùiž]’É7 ýv»þy ¨FÒ¸¸ä:í ¶Æ-‡»!ÝJØ*³0)Mútéúf"á™TÛ£ ÿ&K:Ž Ê†7“$È€sÊø3í)(‡©'ìqðõ_oëg.Í¢–ê.€ï…÷ Øu-Ëî@*/…’à^àeuKž×RˆœÌÇŽn¢ÊÇòÛ9Q².ošƒ‰¬x" ±þ›žßö¸–½/Õ{ÑyÛŸìxæ*ªM6Ù![p˜yåi- —X¼íÀéljäî†dæ›å0@½IŒr@q[ÃŽ¿è‡¦u‹E4¹;×#î"M›=І Ž.ˆgÑ ˜çlìh;pÑwlÀ:{°qõCÙ¯ *Né‡r®/¹Ç1Pl®£í|’ûÍxƒäoTµQÉH…±‡S¶çâÌJ¸Kïþ,…ÒÃìÎ2Ƕɰ ä{Šá¿Sæ¡ô3cöæÂ’âÑ“’çêé8Ÿÿ›¯v·£ ¹¨°®{›SòN\v¿ï|ë>¼Þ¼f¨ó£1ŒZÀ¥ûÁ ÈkÍ7£¾YíÔ»å ±Ù*à=’™ØxÉ(p"™ í"×/åðlX[2P w•ïlþ™ÖE¥§Ï¡Xj¬O*Ïg <ä0þÖ“¶³â}ä´ƒ½ÔHnzKß`æ©6ŽYàGã¤RáÑ\ÎKÅòuzØ-y_§µÃåá|þš›Â…08=‹Ó{zÈ|}ºQa;ý å Wa}ýÌüS~ŽÑK D¬¯Dz€(ð>`;`DQ¾ìT׫UZ\îóê_éËK6;•µÕŽš“¾9ÚíøÞÌEÚÀ·OÙís?tN”áí+”4L{ò^߯!Ún¡ÀŒý©/úTú•ž#¡]iA€T¯é—P ,ÙÝÚØiÆô®‹ikrRÏR³ b ¿’8Ó{~Œÿå\õø=,…3³•h HÓÏåk™µÀ•®gËǦý!¤|så²ÃPуhfaì܈“@½’^?3=Ü}ª.à‚@š«ÎLÌÛ. e«ÂUkÚßY1ÃÝÒé@0„vyǽ^zŠ“ÓYCéÀ^ÉcŠ`½IÒuü¬~Õ20õñ„-¹çee6¾ÁJ­,»á‚(p'ÇÄ ÿPS× PÚ).âH'knƶ|—gÀãyÊö®Û˜?­sSvòüî’¾qUÉ^{ÍÔ›0,`ïAÞîƒ×ƒnÕnÏCIìL‡ÇŒ«ïÿбhÙ<Ô€ÆØ›©"'I@Nôµ¯öÆsÏn1÷Û´V n[TŒž$$ŒÉøÎ'ªËŤMÕO¬8Z…ezUc™Ì^ܪõ5­xœ²f˜W¨©¿{–Nª‰žnhy‚W§N)(ÈzKXðß·-Ïû½&£tï©t@` çûèÀ‹ÈûÞo6ù÷»ÌN/ý% «\âwÏ+ÑL¶÷Ol2Ú AæÐžnKIñàýs»~Ô<¨WÉlWM+ÖTuŸ½ÌÈ3Tjœ 醴‡é["Á2f*»^z1Án±ÞÌæK%ŹÛ9<"aa”…·ò´ÞšG[ª©Šê7^•*ƒ 7ð{PqÀÛ·ƒvÅpÆRL3úMß««ç¾Ûci ù$€9¨ZÙa¼ùg³î®óž×ë€1Ë/#é×cß"F£Ü‘Ÿ}àÇò9¹ ±ê—»²Ã"!â½ie*d£QDå$冸´§q_dÞµ?Åz<š€0ùp“™‹a®fÙ×wFNëœ9þå·¸O²‰‹h{~¥;&cZºù¶eßgb52 iÇ¢ ãNÊ!-¡¶«ë  ¼âïͶ‚¨ø‘«ƒ¾ÒW Þ’q¥?Éû v“¡»€LM ÃÅJD:LRóRg“«F4^épø§¬{³*‘J?çöù¤à[§ìm™ª×ÌjºÙåkuçaxsÖfÈ‘MĽ´ìm æ`½þÝrØY¿mEªq?C_σö¡Ëƒ—±Sö«@X9tÿ“8ƒÒèp7>¬Ñêu9þ)ák@íޱݣXaÏ-@E„aGóÚrYß‚oyµÐ»Zzÿ¯ã .ï©ZÀh`rŒLŒø9d!KÁYR‹á¤£#!u\5Ù°{D.è‘Ô z$ NÊào$<ƒä”NšÙ½Ðtn™Ã§ÌAÂç*ndm8ý²±Æù>°xóÃ= ‘Û!™(ôþ¾G¡§P® Ç!ùn?nÀ"oJŸ«ùHG³‘4}WÇ•¸}L ŽKI§·à? ¹MZïÑ{£0žÑrõ8W=7¶øëX¹LŠgAëAíï€Ý¡J·˜iH‘-ÝtËFœ%†³²â¹ÃÕ"j\F6ô,š $kÈ„È2¶‰Ðð9ôßw—Ô‡ðý’x¶ð__:ûÌùúÈ7vÐù4wËuvH»Yhµd) !ã¤ó{«Ü¬,ÿÔ7ñ\Ëü…ti\ú¹ÕQÊåYþ P@‡+'"±/¿õ—Ñv Sªû+hцÛ|!„}t&öSPd<4œßm¾Âе„ÕEÒ$ؘœ; E2%’¥ˆ6d·–“@™MJÞŸk¦kõlb÷ÃÞ —猳õ.Wóv»Ñr%L§]½]mg¨ IœÄÍ8NH•‡“œÕ?6ËÑRµtOöÍšCx¨´À}e(Û©òë"‚ú  péçZ¯Ž“þ©ÙU¥\p<+0ÑYÞqþbÆûOZ#öO=á|]D”Áœ‹É^TèkÕa´ÙÞñ°/",ç!î34›–­k› ƒ1÷Õ_H6ë`ún}Eí+öµð·äïØ¡p2Äuòú8! –ö‘•¤ Rø°@/îzÿÆ[žø»¸€’ ø¶Ùd&¥ÓÆqöoo´YKŸmÞ­³ó° ÿƒÐãZ©gpñ«S™{vÝÕŸ£˜QUBŸÃ#O¸GcýeÈ ùÛ­)Øz•ã“ •²Ò%$KñËæÿ}eAˆG'„2hsM€KQÇ÷_õ—Jð¢.XðVBóµƒ×Yý£g6» §…e|d¨CŽ8ÖÔáØcêiJŒ~PæÊ /”¥I(‰"¶õÚR_#NRa.è{ƒ¥.GùÑ:ÜÓØ2ì®æ)c·qûÐÛ×R®ñçm’xŠ1Ó‰w§2Êvé=…&±¥É05±óêaÑáéEÔÅJ(qJÑŠq ¦‘x4ÑDkÖ¶¢¬Ë¡ÿyŒÒ.޵Т*ö6n†}Q’dÒU|£óù•œEÐÆa$QSÓÕÍ–5p„Ó4䄪C$ƒÕÆ %µܹ¸â£+ê'ªÄÍn”¼ËK9m§i™jvt59×T”“À©èv/r-¨¹z_¸‚sA>Ò‹œ¨" ‚¢¥& ák冈Fº¶ ´ÿïþïwá ôº2»3L–Ng™!é*Ph'éäv„ íi"êfŠþâäÊ5Lüƒ€è2¤‹54¦v I í.w‹„5šÚ!4ÔÔzR„‹ #ÕBÖªêožµ||ж¯Ú™€3 Evá h=úü;s/ôí<ÿí(áƒöºàxv@åù'ÊÞgÔ5]ÔÙŠ³"!ˆ(’”E*^|º¨ ¡¨æe0B]e%ò¹ zxÛÁª§l(p30ë(•ŠfÖ«qÅÝõŸsíì•$*„¬mO;`Jtíj˜›ÅØ4žõK§özßÛeøÙ–X2µâÌÀë㞃Öåø²fç%ÚÁ¡€Ö¼¶ jG@Eñ­F¨”)¡hƒ è1H~>ÛX"ù ÄEýI"€I$I‘H€’! ‚Q@ PH$ŠH¤ °A‰I"’)"Š!$E"‘ ‚ boV»$$€H$‘zŒRñh`† €b€ˆX‹yBÚZåïÜ¿×þ3³³ÖîÔ“‹’¹˜_¢:E2Œ?G‹´lžÑó}XØn±oœ»€qo²§“À¯–$7ÞßÄp±yúÆcZ•¬%ç§êütq Xú I‘€»Ê_†œQ²"t²÷à ½õ8‚^¨b^‹p–bŸi¨¡ýo3Üo/Ôl6‡Œ¶‰Nºò`ëŒQ¶â=ûçW´¸­H ¶Ž d~qEª‹3¹ÍoöÓ˜iÀÿȺp=+.Hˆ]LRL@D0WËï†Z.«@@Lžë¦»"DI—þÀç”ã%ß ÏÇFêaèiºå›Û€'¶p kó‹>-ÍjrF|??+` V`E>QéV¢Én^ÚÃe ›·‘9 ¾Jæ‰C‚ŠÑç:ª44󌻸¬H{t: Åøú'ù6„ˆs8|¢Bá×¶kTˆ¬'ƒ„I‚ Îí‘»='@²©ûC™~ÏdÑЇ«·ãi{Þþ,€qn¿?ÍôD^ mž’°Ú—:£O+\ÍáwOTa®æÖ§õ>+-ze 1}í$HNBÈíz2tÎ¥ž&"UW¡X X·-æ*bàs K\襪ÞþÌÎzHÂRg‹pŒ—›ñDÀÈ âhþÖÀŸwÐl½¦¦¨ ˆtÀø+ì…dRøÀúÀåòe*¡ÃÌiýì¯x—Ë€8·. @"“õŒNÂN}^½ÑÚ0dõ¸6Ç?Ó©XXúAd"¤¿åÞ]¾<Ð7–ÇÚˆ*ŸäsŠŠ\fù®7"3¹e°ÄŒ²±Õ¡Ho’ç-&Þg³ ޼£‚w)WO±ª¡iä5?t§LJBp µ~“·d ýëhÖpZÅvnH("r«Û¸æŸS£HÜñF`‚óV\†’òú="TÞ¼`xÞî3hí|›ï³Yˆ³w—F^"î±®н«[çùÁ¼©@âô»;Œ:´§½ËuuºÿiÂ.3¯÷lÆ×I½§äˆléžâ]J4ä¬@…åì"!5[ùÀâÿ¼æS=Ñ—®‚—¥ü¬ÔÏ=fj\ZA4¡?„òA§•ˆgÀ%™„ݸ«L50)€@…wo7·Fö²MƸËßgrD‹Ì`w° {â·}Íú-¦ì²ã\æMÿÀГ´ÛgØæn¿1¤n‹æÙŸXmúŽÜÚEÑ…Ñ#®CžÈ6Û6-Ÿ܆Ò‘ ‡`:ëÈ›p‚öÕ-Þ¹Å| î̈ëÕÓñ@7_x”Ëÿ©mÓ–ëªñÔuOKFmÉúµ§™ñg šCî²èöËs¡70Jõ9X6™ qW&²`¶Š&íŽNLk\) k{nÿp³/ÇÖл¶+-H À%j’Šáþ¥/oq ¥{w·Ö8œÅxênBOEI*NÝ‘Œ¬«d«Hp6»«QÍöt¯oSj†¨³çá½Sõu 攪!Ä_|rlSb@œ@ËÄMÑU¿q¤×p;@õ+Ë8ïÚ»æžå@Ú¿ódw=óXX´<Ö °hÒ $²¹Ü{ ¼qš,êµÀ~kÅf ßœ½ÏÊcI¦NÑÁw»xC)rvù] ÍZBÄÜ–1¤¦óÞ1Ã'B ùÒ“ÊKkjÌS×üJý:çe`芄Ÿ9¿Ïèü§…†úmóÍÙ0ÌHÁìþËqwµé`\ŽªŽÙÌ{]̾)(' ;C 86Ã¥~eªÊç~µ‹˜{~]®bØÒx;ˆ9ˆÔai×êO-×&†žÁ/S¤¢_ΊQìĸ¬Pù!ñžøSã}º²¶ÍÇ[bÍ›bD¬í!ÏÀ± ‚!&,;Qa\Ìn¿4ÇÛº, ÈWÃmk䯸f¯óð(wr’êuÆÕ\%þéÓp@œvÜŸñPX¯Ç?.ïZÜÐ< pj|€ìòÍ)Îóܽ!ŽŸâ÷]uh¬¶¡‹iy¥õRþS ‘À+x«0ËÑ!~ëse·â‹_˜cßus#ëòdãWùÞò5Í)ejÄÓF1,œ«i¤ap0SK¤K½XKÄ…>ñlý5$êÞUIk£(óªqè©/væÏÙ^¶–L\\‘ÁhÆr6þ1³½epä] T°I•»ã&’_VHºÍ­åÀ®I£¦­q¦3¨Õ@E'¶  ”êÏ®¦tHùò"­7’À¤vð«VGŒ ©‚~(ìø³ÃACsq° Sï‡GoCñ‹®8¡[ääu2öíN3˜b¯…#€-3]êôÿû x=ÍÆˆQJœ òŽsëDkòÛš}Ž@­—€“´Dþ_@+„'‹Ã|—NEý¿VN6–OËäb–c®…ö*¸ð”nísæ!×olEä Ö¹úÀj:÷>ͽOr,¼]&fA$R“&èØl3.ánþq5 ²¯$X A¡š«€p ZÉÀB8¢qôTW}U…w=ÔC67´ö¶¶íXk¡ ¹ì,¼Q€¢$ø޲Ëç\€Ód+£!Á ñ9¯«’äÖ÷À ÖðàŽ  \˜ue8ÒR4-kf ‘-WðÐ+pù¾Y5 ì³@¼,{°=Ñ )Sp”8‘$…á9øÑg3ño:¼êmk0à–šÛ¡Ðëì’ˆÏÀ×ÄÀÎy~O³ ÎÊͲи›¡§Žâ^-4€º‡¸~2fÔ©A‘ ̧²7~pàœ6|ñ²m¶¼{Jé”BŒx0 qÚÜbVƒEiɯ}›«ç×)y²ò3EbX‚2/ÆÑÏÞä T¶µ“"_(‚•P÷žÁuzú$¤A1Šx‹ûÑÆ~,\±^Õ:¾%¨‹`ñ²a åf1ÆòïV\¤s‘Yø4 ߌw…†*¨ªÑÄVº)æ3uÉÓ}„G«Yi}îÉ W{¼õkk¸ª…W1ÔƒÅÞ ÒŸTãgª=gs¸žú±Z\êEµþ7G0žˆŽ2€Š_OÀž×Y.ëÚÈ+ @xX EºÂà¼NH·œuV:ÝM«Ÿ«ñÉÐ{zVkd@p!^ƒ¡Nñ§ý_ð©µë"©A8ñ.@Æ“M³d!HŠ u‡èåà̳™K(>¾€÷ZQœÏë9ƒûúšœ%”>0èèÏ+˜pÝtÜ$\¹™—•e:šT¸]+,q hWøïóðtÜ×ííÁ vÞ "y¼À6‘U¢‡sœâ³ì‡'ûÜÞ@+oÒËšõH&‘ƒ6kñ¡ö1rð$NÍV«{¾Ë9D]úy+¬a‡vøŽ*ø­Z¬rõG…ËÙ¯žÎœ¦5¤8N¶š%ëÔ{Ë×>Ë×›XˆÀdóT°Y Ë ,ÍGNÏØÇ¤äþH‡*›>"Dû‚£ãúèñŠÝFÍ$Ô/¾‰à¹þ¥.D¯X^LJ)"8äJ º@ô‘@s¦\8~Öÿ’ÂÜö]Ç%èד ¥uWž”Û—åÇ@'f„t.©5’È‚%/` À‚J?Ô¦—¢0³S-Wx·¢ D=iôLa<Žwàž ¿û.ëKö@Én)ˆÃ€r!C±Í7ÔÙ5ÂŒ9.O=•ƒOÇ›ý-6—¶·q–œ?>: ôæƒF  ý;c€`·‰ÜZ÷„ÉÆjÐý?®7m¯üçýÕãíUÅ VHm`ñâ[Gƒui2ÈÙññ‚ꢚD+47¦Á=œÓW3”óÞÂIv鞌({Óó¿øœ,lööè¿ oµsÎáÝ¥ œõ"3å¨Bý0±'Òoé)–$À˜zuh-,vSzk´aW•Ù¡¦OÈŠóH`DeÔIJ+&ò±uœøžæiá' ‚ù$žÒ ÿq"ÝŒôØa¶bH“ mz„Úþäl}O1ÍoïÜn´E>·Èâv:1sƘ«Õ`ÚGÓ }Œ†×S&¨\#ñ¤…ÛAÑO,ÙýöwwSa°<Œ:¶’òq(ÀAožR#DZ1xô X?öÃWñü üRâûZšÙN‰á|’)o«ÅƒÝ’ãI?uGeç2ð±füíµœÄÀÐ&*œ‡™æ5Ùü m¹.'sâNù°Æ:Š-ŠÁ‹ç«ÁMuJ·Ïî-åüà2å•ÛÜss‰‘ãU+¶ŽâþKûX¶Û@!+*F oÈJ®ð/³ïÙ1Sƒ3íð*ê®"!Xõ¶?Ÿî:aF/|"´–áÕ',Jw†±}p`yãi÷í“Îáùzìâ‚O;\pÃXnyŽ0!rcÌ%¢ÚiU‰Yë¬y°qM sÑ~4;P­æŠD`"æŽ+]õ–*Ð?ŠXÁ’†ºÍ\Çã«®¸5XLžûÀ˱Uø)m@Ìû~f†q:¡;êæâÃg:òªÆ\‹[¿‘1¤óp|¸ †Í 0×ÂlQ½p¸çÇ•˜Ó¡ ¬yÁöóyÆQ8­œ}Pî^4ô½vÀBüé‘À8^ ]r æhÔ’˜®ˆˆ@ 㭖ضwßôÿÖû F Ko/Ä”þ.Õ\îòœÚî¯/¿˜Àø‹ `B:J Í¢ª§<³·Ç7R¿¤!pq¼MÉ™‘àãÛ“Br4Úó'9QÃ,|Ã…„Ó`ãÁ´r5}»CÓ>ᬰCñ¹j¥:ÿÎù{m÷Uäs0^ý²”AlbÍzÆ,ŒìÊà€P\I¶\8‹múÿȵ—¢í½˜9‰á¹?iðáúY'm€V€(/+¯·ªÿ^!)ƒªÔ?I¸Aj Ž÷nß|˜‡À P"­ó¯qJÏâ`OÌ]ḴwaË! æPýhâûp€f \\2_òÕ¯s¯øì¯ýx#®Ð0¤Mkm¹Í~z»Ïâ·+;•Ù]Ðz¤ÀZÃEÝ!¸ éí÷krèŠe–¥é¼›„=>¢­óÙpüƪ¤›ÛzµÙà½`~ñäë=Üúûb·KǃDÌt“¶Á·ÖÄß{nYÒ…ÞøÓqÜ8ùˆ"0혉±soÄJ%[”é»#‰RezþõÒ6øØù©ŒåËç:ø“H9;Ð7qÝÏ3ÌâoÉD×ö^mäô1 æÀ¨je Ø“@¡ ø4Ÿ”C ÜXÏcCöõ*VØ^ –ò¯C0§ÉŽPëåãâþ»åW¡ÃÇg¨óL`ïÚø¡å£} gó}ëŒýðD î1Áòí&pó˜rØÌu!õRQÌMš5Á£ Fv0Ʋg:R%²/±ˆÓ)^Ð¥gÁÆ i+ÜŒ®¯<æJ“‰„O:u_¤Õb8ö»EÓÖñF´Q÷åhviÀAöD¦ºÈê£Î¸lŒ"aæÆ:¨ûøWí™Ã6™îø\P_ý«ùÇã0-ÕŠ_RM ì/ý=±Äá\ÇéÓ<5&ÿ9Á¦p Ìó2^Û7ÐÓÉÉIå ã3Ö¡¸ØÀ:-C1"Š ø‹!â¡Ý®É(E|À€!9ìÁ+[Î=IÐ-iœpd(ÉŸ„×·\Ä+é­þª_Ô·Jì[snÑ #tåƒrŸ^Ö[! Ún‚õTþ „Å~‰õŽ’­‘Š[¿@×®\ dvåäà³SšÇK¦I“Þ|d̺Äfänœ3 !Ûƒ9ž1„ÛTˆwUÙ]AZ0º±…[ OžWä©{Ê~ôiJX¨fþ©öX@SÈßBú€û`äÁ†èYñ—Y»yÝLj÷©®ÿOjà\<3\a9`è;Θˆ‚·â¦ð‡ ·[޳žó§n§Ý-´?[OþuÙx_òÇžš,¡QÙOnýãT“¨àÈf-ùVQ¥Eü˜¸ß:ýG´ú_¤I¾ùG §óݵGziNðe°¬uêE,ý`‹^#]zúI¡|ö‘o¿Þ:’–¯¸?m zì;¿³ôðrÕ4’Ó «a^ó‚¬@‡[t,„Å´æ”Ù3õ °OW›•B&J>PŽCÕ§ÝëˆèäeD¯¦]¥ž:Lú}Kdû± P6­3ÅYŸ.ŠüžÎÇ%Ĥ7¾!»_¿·æ$îCªCNAêñ¬­Oðdo¼Ú뱺·¿696‡”[_‘ðÁü„£­Ä\6'î{ÕKìcoÒàâi¾=èöþ¢ œ ¯CIË6Ùév<àÕÀÇeØü}\oÉ)e•¤ `ýÒE4™ÖDwŽ>hÈq® }•™ü÷ÝÛ³²”Û³lR*”Ãj˜:t¨}ÄMnÆNq‹Ëžlt8TG´·5c³ìcKvb|œÎÜäëÐCX`(Lñþ8§V¿5UoNÕ’Ëîê(¿6'U ó£ }~Tº‰.½”Õ]ïC[ &ócE–ú‡æ+ZCR&h1¸ m^×F˜Þ½XÜÛ .ÉÔ<&Ÿ×áÖŒ_ëÇÑ"Ìï;D´fã5޵Oƒm©à€*Œ¬ˆ/ùoå|ª-«8oæáÇWÿùù\oÏÉ Y߯ў›ÆeÐø,KU©_se—Qs¨j¾ kOàZ…X`vhw ÓýÆEIH_âmœœ¾—Ó^¦péËgK²¢Ây]$;)ÖH9vù]µÌnÀ‹¼†™`t±ñÿ½]ÖLÎy—OÒEj.Îà(º]&T&2ý`dÀ8§ûÃŪ‡WžÙ0ÿK»ö<òèɘˆ BÌ4^8i`˜(Ú^ý®]JØ6ØZ+¥ÊY#Õ‹–#K·õ•Ñí`ÒÎï©]âÎOÜ öéÒË®*×ðÙ†"O9÷kµfÄ¥ÏìtãH3 € "†üÞÃù­©Â^N!,ø™Ãñ­ê*1,˜4 ’%…Éf;}«¿pE”ÃØo«kYÚ‡ KÂ9!7S€&}ÉÍøÔ¾9¬U ‘qBó1ò[º0nLDYÞ¶GQÚ .³êÚö1Õù83%Ô¥ìd'P¶R>üŸ/TJ8 'Ö_yC‹Û¥9Çwâ@¥L®†CøÔyWo©É`ä—ŽúžbnµÞ'T”ú^r¤/P´g]¯ÁØp·Ö+\õâÑËå„Ýp$ŒÖ?΀¾)ЇPÄÔCMqcÇÿ¬Šù«ËìÆ!ý‰ã/ÄÆ°0£¦·¡,`g #!®d~ Ë«“g$)*$9ÿ1o¹£“¸rl¯j“Çk‰¿ávïñ%*/*¶L(5?ãÚ|> Ñ´è-õø˜ã•Õ`û@¶økâ?ƒvéVY’LÌ@»Ù''¾¥¹4ö!ÁgmòÚ÷vMÞrÝ#Ó] !^‹ÌuóÕ5—ߎµîe.ýOƒk/³¦%éaÁäG6†ôš€s@þk£Z¿Ãie{Ž?׋Í£´ô[²¯ÌOW75Øß=>HžáPßîëæ¿G[0îO4€ÔfyJƒÅŒaŒ<ûzûé\÷ƒ¼,edÒ?õ©+GÅMÃõ•´*ÈRýŒzœ@ D½F“³ä›•Y w¶úŽO-ÆÕoJ–ƒœ›šÎé£î¾œ0¯ôs]¿.{´ýœ¬ ñç¾pEÁy"b$ÁÚ²0eiâ4"c1åÞÁØEö¿*ŸA D\?0+=áyÛ>9=¦S$Ÿ•µžÙ=f˜l³âCNØ‚µ2ƒ’@k=&Ø ŒZ¨µ@f×Ba¿%÷·:v¾‡Oh£â"Åp!2;6ua‹’°9J6™‚(N¶–ˆ+Ô¿ò=F½¥ ·6¯8i·UCóÞË¥ÞG_úÉ~?§-޽\kݱÎN·°:äÎ/Æò¹/Ž;ÇÓ¤MÜô?=Vðvu)Ý•³k]®n«Hò·½6Ök!›MZÄ I)ÖÎS®‹3æ"ØV·ÒŽóÜS¼ 7‰/šg:Ó¥â|»Iá/’ùð] ogoLO×»Ü@âj*j&&ÒuHŠÇ(R„b*ÿzðÕz3¥'#ѳµ.«iù8.8+=u°}lá½Ø7…¾ÃCÅßÝ–—]¥ÐY\:¬m€¥Û•'©þòÐ|©®¾bó:®.ⶈñBÃ)¿ûC2µÌ€ìZ·6¤õ8l$"ÒM£0vJ÷„/JQ>F\lŽÜ†k…o‘s O8üõ«:9¯û*‡é\yí¾¸Û.°PŒ½§1Ôæ£×û¦A«j7÷Dý£ÌA©«¶öЂÚÕ’"dF)N+Ä«%FÆhâýH‡0–Ãçè~çX„A „=N•Q,ñǼ˜ÃçÚ ¡Üâ.ô‚"µ æÂ€\µªQÃÀ?Fˆ~ÂÛE|Û9ã .œJ‘x›ø¹"tà¹)µšß†EªÁƒKÇCC¥r c3 s¿íM¸ít²tÊãÓ›¬ÆÝ‹þVVº_1N1ðKöK³0–ó B`5z»–"Îj?cmŸ$aí@Ï>¯³e†‚i”zs·XÒbZÃé"1¢H(æOYäÿaŠþ±΀‚bÉuD?º £~ØšC´qi^f&<ãúÔòuɃ¯Í=݈‹•Yc铵*õÙý´Y¤Ø¥Ç+&£ º|«UÄ/­K’¨ToéIe"a8—É2Æ]ƒÇþÞ¥{Y:F„{SÀiàUˆ§M·>„×+ï©ÇÞ®};…7 -@ø ñϰ·0Ú&$uy‘§÷^ܺˆ¼ÅöÞP““ì¾N¨ÈH ñÉÔÑÏbäÞ >ã6•šœÛtöÃi¶#Ÿƒ">éá~ 6ù×㉇…Ä'¸.Cº£ÜË’, 945ÅFä"kÆJ¬»°C~=%–½ bÖ*iŒMK|UFÃ`o|è©ÐôºÜL¼Ã ÖŽ ÐBxw=À‡|5šÝ‡”›†@¨¦>+ß%€”í„I{JâT¤ H>8`;›ÇÝR!Bv™Yjâ“ÍëzL]€ÿY‰nO€i #rÑ ¿»1ønH^žtÅ\3acÈHBib!ü-üIPe^iÊ0´C;¡ç‹˜änɇ̚Ž@ˆÕ ´ïÅåòõTyl_Ðø/™a‡7 ïeK:kÙòVÙox¾êÀ ÜóÓˆs¥¼ ‡ÌÔæW©šW=4€xݲ¬–ª¸“ZÐ5À6€U ¬+ÀUÀïÖ•Þsƒtù;nÌ$¼˜äL4ð$„×-ðJ¶Ú6™ãö0i‡ÌÎÚ£ŠóBi L¹rˆ‰ G8 R-ÍÆbÅç‚Ò“³ð½9½u -MÙÍázŽ_DÍb±o}ãºLL%ï¸Éš²v<Òš#U°;ìd@¢A*ê–PBòC¬À±Ä[+lŒT"|¯,±òG¿áÝ0 PE<‰W®uâÉŠ:^ìr¸Q·‘H ªCŒ†7QýpD’1½y¿'1åëC†£‰ùºR*R—“`*:o0=SÄ ‰è1Œ"·Ë²³Ç‡ yÄâ²Éè:àY,-Ø©EÅí¤"èù©ús ‚KZ“díÙ½¿6S§gaù\HPòyç‘JéþÍ<*~©°ÒÃ;Lõç£ô žÏÖbè -ÈPìqÉ,J‚, Œ·xäû`­’ÕíR5%Å™1µÃè —î@Ñ?•o¡ ¨zxòou"¢n÷Xì«70¿.ëzê}‡‹S>¿Ê Üø¨O§ßvÛ Á%wñ½Ô.=•ì8Ó ™š*ÅÔ|þŸÌÛ½+‹ÍÇZ“Ú]_Š˜ÿKóɤ° ËÈ-ïN |»ªØ” % ÌÁVIôÁ¤(©E˜æ9˜²)w‘Ñ©¹æŠz-Ï©àü‰1èÄ€-DIÁ{wââÏà\\ÐSØ©B9ŸÔ·Jô4ÚcšÀà‰0ÒÃ*îóbn¹7%¨Íí”`’9Ì_È ó¨}«&@ àáøÎ¤^¡,𪞺‘áŸ=AžÔ­jÙø¨Ù”¾Þü(áY™:뻼½uá žÂI‰±é“¤ 5¨9!}ÙÀ£.wÏ6]Ñ3÷‘Å4uqÀ"ꀨaxÜèB…–§ðB’i£ž,™k|ÞØûM’•)!ÓI‘ã‡Ëj8À†¤„À‰#X×ââdÛ±‘€7;C‰vp¿Ë ¯'~6êGùPý”¾K—P¸ÌëcÉc61¤^«© øHíŠôÅLæžO–uH£¼ÄiT’u¢¦p¢#[-5ŒÃ€r†¶î7@èí™ ä´n?öm?ÄÕÌæ ÊÖ,¸ûþÂ=‰·Þž[X-P¶›÷s^;ë˜úE«i‘,àzyè52äìú=J'QŸ ¤¢tå_’é‹$ üôç  ?â™ëÎb†(æÔÐi–u?–Þ°+sv˜æÎÖþhD>oÛ¦ßôQÌ/+ôÚ´Šˆ?ÓÏΓ ïò³UÿÙ¢gv?7þ˜Õži¯Äןy|ÎÀ;Ùî$öQ'àAlÙÝ€e¥â$ù›ÏïÊ_W¥¸üÒŠ\JÀ~!©Ó#dÑÚJíZ¡ä§PÂT  çÑ1ó³°ôӃȡOz³èü[?7§Š‡°´.`òKyLu@ã©ôßåþuSÚ_§Ùlg~/¥…VõÑ*K³ßìühnyµkøµ&‚˜ù†g ƼÂ@Àl;’eìa|iA€(ÓàGU‡„uk± 4±‹å³vƒNH€ø”­ðùïW]t9WgA¯®0õp‚ÁP0Íhï!8irÀ@é»hyĦ‘,©R¡TÁhfë1Ú¹µÎAî³3®åí-˯ó6¥3÷ªÓ9ƲšÒ!iu1ýxõý–«ÑÜyßÈÂk¤™Þ››´”ñÙ÷»0&Ò=‹]sŽö=¿;I^>YüñÇa“NÙ´ÒnýŒö= %ö5YÏwË”Ñ-!Zweã E\êzº­w€Þ;÷Aß ž”Ž·è)Õ½fÖÉ07tfÿõæ—f½Vfž€vÓÎ;0=ÛK2q/3%Z~Y‚¶¿ï¥¤Áb»ÚʺŒ–YN¬‘´Ñè8$Ìl¹¶hH‡’ RÿŽ#Ð!–ä"Õ¯„D•¬ÁÓ¥™M5Í¡ËÎóý¯Ÿ° ç¯ÊiX~_´—–…éãÀôÓ –Ë}ùf€Üï`e†Õ¬ór‰@&KÔ_85#ÃŒgO.wÛë¬\®ABr;´%¯ÚÔÙ½® &„ÃWk6Ú½2‡¥„Ácò'':ÁýyI²¨ú©²°@z"3¹–|-$súê#vˆÔô! é•/Žf¡SÀµÈ(Ìã±Ób«}*¶sà…¢‰Ä bÉó¡²õŒÁ:F^â:©¯Òx†øùã¨MWÏMÔà$%ú؉”›ðÓ4AdÌÌão<8Öá'ê-wüÝ=®‡¸Žúƒ AÝhàÐMë·ðá­è4X™Šw´þM ƒ:û!/&œ2ä‹­øB>\9Ú̈́à cÇöÖó×ÔÏt¶ì¯$ßXõîV­úAÔÆ[Ç̬B0,ˆt ·—¬ºä~Úí¾ÃAìPâoα³IÅèw‹K ©ãXj¢â=F™˜ r4a ‘è9,sQf1FÃîôEÆ gñ8 EëÂ\ÎÿŽî|Q·tØï/c³_(t=KO4Þô†É .( ÏsìÞU°ÛØ4º÷9ªŸéÁz$ ˆá!åá¬ÁŠ…LE"_ì gŸV2ÜprðtAÙõS`êÞÖÙ'Õ(¿tL)Gìl¦{“A˜'Õ¶”XkéîŒÎ°Û‡Ë´øÒkòÜóL|ƒz_hìfø~&“Ì'³UÕÆlÑ–¤òù8óïNi┞eG¬¶Äèèè~Z€N†dˆç~á÷”O+¤•Œrt»Æî@g6ÿ9!5ØÌi$GB”NˆoÎjÔ]LA)c6Çæ þÑz O(—Z½µ×Р©u¦ÇmLÿ|Äú쨼ËÈ70´…®£€¡ìÚUpÓ …´ù„G`þž;¤Ã2ÂbÑ»_¦¤IÜo¨k|Y<ÿX\v\MÇCϼoe-±4jूý· ̵MvZÒ¹:ê\×»þyk_êA½TIÜ•Üh;[)•$ýøãÓ|AŒ ^3;ˆ3@™‰»…‡ªòJ‚¹NK$EÝ_÷z#Ì€85« ˜ ¼ÿgoê?Eaª|xTînž/7Ûò.µÞœ2º$=ŽÇWÁ–f†…ÃþácÝTEè=ø m @Ccå¤zvæ€Áà¾ß«íÏ+È=m*8«ž¾[U¯ \È ^qHp3v¥ ÎöÏîé¨;.öT@Ü¿r·2“áco@‡×â_&CcëÍ/Äh]… ØŒù]dhHU*ú&uæJYŽU-A€Fîö“@ZÖý–xLØ/Ý“½Ðοƒ¿^Ü {É',?"xª~(uéý¦`.*ÈÁ[MDšøŸùƒ 9¹W%ƒWXñüˆQ¹ýú†ã(…‰÷y{½1Ê€©µì×$ÄèW!vý·³a‘& kó‰B¯~ÅnƒäþuDRßWe0³V²äl5k3Ô߫LC]Ï?ÓNâúN£è)«}n*—[XëZ:±šæÅM¾ƒÔHO¿ Éæ7þò2óU>e@'>›!O®à"îºúE{Î+0+y›¾Á¸«IHˆ ç3¨îChêT±ÑÈŸaôôskBô«îÌVô‹×þ÷ûÿÁ—)½H dÚõ/pãˆhùÇp† ý ÁÀVíG\&/°85z9&ÃT_Ä0.²íŠœGi9(ˆEJ@FùŽ\wOo_üg„ˆÕëo±g‡½¦=í *¨ñSÛÔQ§'í4€;o*šý‡0–.n‰›{#–ÀØÀ~„’õÌY)}ú.üÖ«}DÓc¬Ü..’š ˆZz÷kHÀ Ì7Àý óhf,½þ>Yó)ŽÒ=Øx° F9¸>kH^¥­=¹`a¼„stNpt]6˜äî뢋œóË\9ÑÎèŒ æÚ#:ë;‰N¸õó Á0 œ!Í@,ЮÍ=ñÓ{´j#aø›&-hQ»WHµÊ×4Ò˜8£ý'ízµS‚d¯ä$|FQ¡Â¥œ©…f7Ô÷On'Åå¤Phõ5ÜôÌDmfU˜žõîF šÌLá*»™Ðþ¢:ùÛÀW›uu2:M [¼‚ GÂ(ç4T'Ô|gj͈¨fÅ»ZÕ Ýzíƒz bö@0ßÔ‰" ¿XäV¾íÐìb2.“O•â D%ªœ×Q-'ç Óð¯ìÖ4½ @ÓßÕüšwEà¾æ “±.V¿»$Ù[@=F@GÆß¡ô¿¥µ@ãå°¹¾^ƒ»4õ_§ Pëú¿_’ÏŽI >¨áVÆ.4¨âFì HáÅö·8I½ã_=ÞiI×JeÚg¬Ü>‡£ÕБÞ a! L'φ¡KÝêªó7Ñ)q$A¡›¶öma€²L\ÿŠϯ½ÝM½õŽôTx+,GUWäô2¹o‚œÙh„ð1IÒ¹±ß,põ’#%v‡7—ëàwû™¸6!µ¶’Æài”_Ì0ž'-” ÊÕW²ô³%DÔp $Ûæb·©”•YýϵÅQh@Uï£õ´;QŠ8MƽpX… ”õÛÊêòýÇP§A~ó8^b%œâA#ŒT'PÐq€,tÙ·Þkêh¡€xöÅ´ÚÀäuŸU+EK-ç7:Ñe¶g”,5k×h4Z:¾¤¼òŸã-Pî/õ3ízšû·G)V«Õ+ékLH:ÕðÓ­ÀD¥y €ìU+ŒCü3>WèuFÛzq¢“ìoã{î!ºaKÿh“ðPù*&LA,××cN¸*qžÄJ@jiœ7ä|BòECg”œßØ"RÎì†& øŒN§RñÁ^ʨN²íS¡æ3ÙÒ&Ã#¶l!qÐ¥±çƒ€%ˆò×:ŠzaXô”±ü‚)ÑÚ^<bS´°=åôq\㡾<1Æ$k4`ÀìæB@qÎt1à¦ó >vÍ„¡;ê´ŠiC+'Õ#DzB Û›4S¶%Õ)'Oì«ßÖÊÁ<–Ë#´à#­á;m±Ç'M(Ž3üãÊó¤Yn–JÅYÃÙ×ìÌgæì åœáÕv*ìöØRäÀëh™ «d¢ ¥YY`L`+ëÕ6¨˜š^MW'Ô›"¢¦"“xOMÔóݪ$BÖ½r¶‘¸¨†Ä?¬¥È ßj¶ñ×ÄŸ/‹úò9O=V;mäR>¬Šó[æ,äóÑ%Tı²»8‡gçc‘ƒƒé\èÍÏÖrò†òž!³™y¾ Kûz³ŠJN”AÛïu`øjbAÛµØsÑLï³Ångçèaûªæ ãÝT Àáž(<äÀÊã{\~5SÕUÇålÑç{\²C\„ÄqÒiй˜ÏÀÐÅN„HA/ØÖ#ï@´XD!Ä& fdR¤ÌIH” ™MIþd‘D"9†’ýÐk†A$¶´Y¢ËºA¶þZÛÀílG{¶߀! Ý%ÈäGêè1ý^p¹\?é¦j)FÆ{’(Ýù±±š U7ÉZ˜ÕĶn°³.j¥%g=oóëÀïHPúàk–â—У­ŸµÉy¿¨ìNíFž|  yŠß|O†Š”ÀÈ©1ßäRv¶]D9Õi_‡÷5i &&Œ €ä€›¬óç€Ê-mˆ›éçT•ë—Ûp݋҅ÚGÌX?Îà–ªE7W+ì·kñG+z°$à ͛‡äƒuÂ0'ÐBÏEéœJœYݹƒ÷]$'Þ»ê’G¡·CãJÍJÔT·ÅGSLsÛæ@Ä‘hIÅN-‚]²¼ºº´/˜ÍÈt‹,†Ÿñ·»¶/®ß%š €adÆe¿W4} sÓPzâï6•Tç3;æ­àÁùÛ/·õ—XWÌe‹=p©©ñ7[–úÀŸAÕ;]ÌŒ`ð|เªTpoŽJÙš™±`ðK̽HB#ÇãpšNße(ݳÿ Dz’ 2MÉZÀÁ¾òüvïi€8à£GöBásÕøMö½9¦EäÑM#°jœ¢yü/ð^ÓE` •^¸ 2õd9L‡¡œ…B¥öz4d}L(yÓ±]¯!’èËIáô£¡‚:PN‹¢õ`JÅ­óËò‘XY8Ääµ.ÈÍ›',`þRkÓŸÓBwÕxàoèy`éPúÁªƒìƒúƒ°–ZÙiÍÆš–T{|=ŠN¹G µ†ÖÈ Ùµí Àdh’ÒÅ^pÿH2g-þ ¶ Œv¶ Ð öŽ+‡bYn >fÇ,Fм#1Ðh{Ù=ÀŠ öi—È  &7Ûg%t½ñ}þ«È·qüû}Eøs¼âîSJÀG%P¤soàëÑÃÔ¥'ã†#G¬žöÀp/_e€â؉n'q{•–ÏQ…Ô”€fÅn&C;†ò¶rsŸ­ û‡ ¤/ƒ©šëÆÊ‰4U³ ÑÏž™¯ê¾ â×ê¸vcþw¶TÃT;#øO \ Ñš¿ýÿå¶þ‡Gño6Ÿ=Ô|ººÆ»ó <˜€wÆmüæãÕy»ïhrEÑ6¾ÏkQÂYÁã°þ +ߣ†’ìSî-^¥©‘ˆw(=q0g¡d*øñ6¤Áð9lƒ²"zT !è¡2óÉ&[Ë ütàçA«'è<€81Ö%˜p6é kM»lΣMSÈëM¾åoÖ+°<[E<¥,æ`ßÜ`¨+¾Ý ÉºÝæMµïù¼Ž?ÒG;Ýåf¯*]Vx/a¤æz[ŸûÆmð•‘áSËÊÔüÙô=ÄW¢—‡X};,›StgÿuMSæ3¿Ë"žBE¢|ï vzË (á×ó=rV½Ê ¼ô‰ÓÁËꮄãcçûך· ¹ýd·Ôpú˜+!µ°H Œ»uÎLÒª¤™³=üºý&O—sÛ Gî±iJE²„fÚ|Àñ% k;¼‹ÂŸÙUû;ÏÅ÷ô#Là™Ù»;Xø0u0W4u žž„3à‚R6¼J¶ƒÛÈ üÂÈ5û9ÿö{GDë’é‘îÕ… ßÜ:ï¦Ã†œ“¸+šsª˜Òc¬“Ê wŽ H!¿Ç._§{õ/·òÊ@ÀÖûÿ> È‘€Q«ÕM×t×H1”ƒ)Å\óàÜ2àý(VÙ@¦h{@j8ˆÙHè`°G«ÌH÷k=ÊyqÅoQ/g;,¬¤|ÈÖ則ºôdyÐk˜Êéð?ŽÐAƒùû"T“žTõ1â<8uÔ £'@*ˆhð«9Ç’?êÑ¡ÀQñm0p/zÎh²AL1,«"ä`Wȶf–˪Ô2²Éß¿Pp0|Š(uL`Jæ @@Üx"s‘Lg÷=BG#x"ž^1 ‰F½Þ†òãÑ÷þèo§ß„‹Ç¦zß­[§•¡¡ ¢]•'s  ¼ ~£·G«ÑÍÇXvÞwK§”ÊWU µ‚j®ƒ¨° Ÿò’ë“39rÿ´Ó}€i«ƒðª]'ðÍYéû6}Õ¿/¿œžâŽÛ—Ÿ¦­ƒõc™/[Ò–é‘¡n½i2îÖÓÿ‘íÌ?’k¨ƒ.[ÞåV í–N&.(}Ð%¦¯8lK¿{MŸ¢ƒYüþ©€®² ‚MHm´¦y,‡ÃÔ4 ~ö'òµ2 ¬¢0nÀ áwºT1üÄÒ'wób®Cµ“Mp7Á-+ø#¿…ÔÈßz³“ñvÒ©/û[ò‹IAeƒà‚DÔ©ºB}›ÏÉ}Õ% ÄPDòa©-Ý˯`“ÐáÀ1䉔Í~ý7}˜/Œ¯_´…„Ýs`.4žp˜h½/"X,lqé²PÇXÀïÞî¨ã°mh-›™Éy‰²xwà]Ü: TmiÒæ&ð¨5{Íèÿéu£Äƒ €-Àêú~ª ¬š2p=³'•ÚJÿŸ—á‰îʾÇI‘dHæA€â¡ñæ‘Ǯ骑Çÿˆþ Ní§ÃéMW™jXwóùFð@E¼€‡QYôæLLËWñ¨>à¾Ä§v”&ê¥êà'§¤²t@vp ã7ÎÑ-æ”…—7'ŒH™]TËïE™ð¾{V*?Qõûò%ˆŽZs[윽¡ ‡gßk(Ò¦ô‘bÅx8áoà®üüê¯ÎfÌ;Þú®plC#û<šg1¡» TcmßÑq#§€:ðÓú¨zs¿Šíþ†á;;5:wp Ñ{Ðk"xàЧr u4°°õò°~{²cè² 7%£ ‚¶kíx=CŽÒiV"Cx rÍe×6‘ú#£ÎtÚ°/Ÿ+è\¯­‹à¯ÓìÃãssSjƒ›„å3]þ/&Ò„åFªÈÍ~ßïG\Ú^(óiÃ¾Ömvmé ­ŒòÈF©Çu&¬×ƒ øWXp(e›ú ñûó6x¼w¸Ä•¼¼lkUÿ3WѺcf¯D¹o-9OÔL”ùTeôÀnìFl~ý Ï<¸Ë[º¹Lûº<½:¿<¹ÁÈþªÝ‹ßÙê³[úK} ¢Õ€|j]V4æ“Ù›¶:Y&Ù×}öMv†ÝB÷1/Ò<›,¶‘wË?óäœÈ„óí…'X!{4é5)é_¤&ÈëÍÃуM€/a?-ûÌ­$ò€H-pvZ϶d7ô+†*›WœƒQ¡ïª›I¯GiùK€×9Kž7R”9;ÇVãÎ=2¥eº[fJ›U‘Éa/sqžV˜ø[Öàµ}d¶F9v këX(TÜì& 9ö¡ý£ªƒT¨zpb¢ff±2…´'{Ÿ‘a¨ô¿ó#éÝõ´¡ÛoËå7N1ÃâE^kk|×AÛ8ß–ñ]Çnèí?Ó³uˆÆ)_›ªPò+cá6ÑgþÓÌÀ6'„TöÉŠêw1CV3‡Â+êyl' ožÀ£ýäýœ®±Xkáþoi—gg›þÇ Ý\ßÌýßžÖh̵‡‰#GÞáÔ_€ö~ü^û8ãGO.OvÍ^}}ÃxU2'GX¹•^¶µÔÈæå>È^5,ÂC›/²x¥Ó‚Ôë¡ÎØÃ#EâÇBî‰N˜CÙ¾à~6fÀwBÿ—%†£Hä²­#hvÎéúÀËÝß+ãZÇR½þØZÐà]ä| º›.B\fìÌè@I&j.iÐÆÜœŠ?F²‚Mwö1ö&ÜC·ØQ>È ”X=>’cú*¼EîˆgVlWH£óüëÕÆC2šD¨Æ.)ÙÈ(eZ¦ž“7iîܯÞçF†„¢úÈ ž`ó€­WLá‚ j6(¶ÀM¶WÛAùÈú•¢veYÁE¸á7ª€¶é"o‘ˆæ@£Ö§:\¹œwCö¾ Bó¨\óqMÔžÎ>øá;ú Cþ_üþu¹p˪L†Ü¶§¯÷ƒ¡ÄOvà dÌ)°dH¦Ž™„Š"¥~ô ‚h(êÐ4Øó]o[ÍžêÊÏæ=|€  `Ëò î’™ÔûìçæO$q†0 €Çì¼z‰ÊnÚ†xà jͲN¹`:hÂò?àÁÙ\]P÷‰àxù ½Þ&ù8 ã}8œâ˜?'-pC!çM³á…ô*‡ü}ð ùºN.ºš"©ÏÕ8 hxrõÇ¢UReÝ©¯Í&ÀÆO<4ÍU>x×áÍ{ÒÒH¾ÌzïûúËŒ—w¬èAÒ&T8ÒÕüŠãWÖ¦:Oê Ç‘€¡ËØÉˆŒ„ªÂh-v)’õIqAíœÆß{§Ø“=ô…‹ŸW×~ˆ Ô×iãºê­ßúhþÊáVz›dåJ·HV”í"³aV²¸û2V¶z•ê€H¯$FÀÝ_75pw=UL-LÅT~ïå­üàYŒÊ<>Ò{ÌÀ÷šK6äD8úeå0<ÓA1eø©ó_Äû­Ë€Ò/(O8D( µi.3™€¸f«´DðèO*d%߯IŽã—®ù¤†ùƒÒÝgZßHµþͦ=\ÿpëMi¤ö; ç÷'Lô)CÈ3²PéAZÆWü}.gM‰ªÜá}¸ô‡Ñ#€#°É‡Ôˆ~Ç, é2ÔzìCÓ_Å»(ü5~Óâ!‡½º0ßÂáj¾CpºÕ2 ðÀåéF´†~à{ ûâ™™u÷éb;§nORÕ-Öª"R¼Wæœ:J(|ð1 ¹¨TJ:x‚úˆmWªÃŸ¦õ™ßöFõy€àó‡Ü?“ "Ü÷´d†ñ–MDü<¦@ý&Ì܆ ~è_8ëæÐ]Ö=èÄ5Á Ùu‘aWáõÀ¡qGC3AX·õŠß&Œ5®³›û\@7 DñW @0&pGÊ?¤±¢²××ú1Ϭ¼y–Þ—E¿2ÝHþÓ“»3,W&×ûó/$ BjäØ3ÄdÈãc‘Là¹àˆÈ9§•u.H1fì6.÷ýƒÝÕ'8¿5Ùպv±DhÀä9°ãYœÁl;OH|ôs„Ž–QN›?‹€æÒº@ýJª ²ÈþI0¦/… ¿4S‹aÜ<¤÷GT t\ˆtŽPGþ¬œa7ÍH_´À°œ–Å$I‘øÆÂ¶£Âx3ùûÅÖq¨èêÒí2y¼/×S@¸Õ¢\·W¿ÂÚW*€y°oÈ|éÖÑá/¼Ž~Üm_¿6®Ó‰×CÄ$b#;÷!9ß^_ê¢0À·¨ò ×ð9§0!øVPjÄÎà Ò9LÖÊØø”躣ÕKÝëÎÿÞ²ƒ2gGˆlû£½Q<²jZ#޳Ii1'I˜ ÐÿænY2 7<—ãOŸË8Õ!¾Ü[hý¹ž‡¢Äy«8¾v"êg幚“ÅXpŠå‡ƒÔ ê¯àí5¦çxØ`˜ÁïÆ¿ÓAöA°¥rÑmû^óçÎsxæ~Á½”}þNîçI#F»”?wŸ¿;;+D{šL/GÖ­Ï¥ÇÓ\A¼’ŠÕi8-|°1‡ºJõÀÌRsè èàc^OÃ䀪†ßŒzŒxè—ecµ$÷„nM ¦>‹_^Êâ=HH~SÔ‚³²D¿È® œY!ø¸&>‘³›7ùõ–\̸ ¤f¼ƒ¤!=5ÀÚä ,¾yúÐ?5rÓ¸ê÷GìµX_Å1é>^]öÄ>",Ó 9äÝ+À…bú2ujL¨~…h$€_þNò7Œ^°TäߎGÀ€~áîÙFÇÄÄLWz&áGÎŒ‚îw‹ºbÿšÉF2—5ÅIS´ÈOÌp¬BÃXp*{ÿKæìNÓçv5M3y!¢Fñ ÿy-Ñp’ý4>»íˆôÖþ‹gÜíX™´K3=§>DÿE×RÅx¾=d4ArZµìæJ÷šÊšt2&Èü\i<θüWRùôe$̬½oéûR–{Ô߀òu±y} ^$‚¤zJݱ¼xºÜ‚ѳ*DDIM³ù8½6Ué¦v a©“¬µl–ú´g¡AüŠG¶²µo¼°ºVTº¨ÂçܬÙ±l¯%­'@1éçË” vÿÒi0¾½Ÿ•'$em¦ý»’OyÔŸmk¥Kôôr?^–_­>øi„œ,pÉ`Ýl ùàèFü C£Žú(=’NzšçŽåcdOY;Ó@ÊÁ0#Üöù;5åÊí ¾üþ±&Ȳ(¼¨ÆÛÁÈöu®/[?Ñ«úQ–RÃ"4ž€nm Á ­ÝÿøŽ¼Zù>sºÂŽ>çüëä«ÿrÁv¤mD ׄKd,Omv¨ÓÚ¶ç6ß*|Á ¡¢lY‰9G”õd›ØÁ*€”u–¶‚´#üĹǿ٭^yHAßÊ6¼0œ^àz›ø†u&‰ ‰éž.Uô9NY– ‡ƒÕÄÎ%x0œn_¤ýnQ“àÞ § & ¯DzÖº¡À¿ÈÛAhޏÃI×ã'®ÿy<FÅþxŠŠÕÓþ9+â?´¾ ×f“«Ñ‘ÍY=´¨õ~ÌBë`<Õ­´m»ád0> mf:(îaJ×E'‰¶ËÛ=ÀÙñ¿ñÆÃnödφ‘:[ðqÂs q«˜6Ñ 9÷‰I‘ŸàLx:Îêl=¼^˜s¼ÄŽ!:¬íY);ÄÒÊ÷\–ž;€….\„Òý²o<»+Ýc7¢‹âþ§‡íÝ-\T®(:;zbrÄxß ñܧ¯Cÿ‚sœZa¢nuõ¸$OEͱä×€¨‰÷¥¶ýì éÆF;úsÚýƒAO‘¤Žø¶Œ²±‰ø`uûÇ¡¾x“ã¿‘òF‚9]OëÌO¹òȪuð,C™ gôû÷Ú&]%†û’§pÀš67¶b@aÌö{6…{¯õôUoeUínmïù1€€a=•¹Pµ*cÒˆšqó2 d-êd@(5k Æô¼ëlóLÆqR"Yñ„Ñ€Œ8 vùïo~¾¶êPY†÷~…àoÕýZÞ'ÿ€oß ¬L/¯à²…­±œƒ!ßßí¤yŸN³8ä&€—mîi¦_â³îçIß~±Ûkëú›Z ð$y´?0b`>p‰à7ô‰&n»ÏÉÇU)ñBÛ†yn&“ÄŠy..~¨»aÈ=€ŠlÊKÈú¥8bÑf+>ßsz¡ ]Ç­ÃßqôHqÕ¼_õĦ¸¤þVü¼Š|Aü—ƒúXo2Í‘¿»pr¬@þ›Aô#Áá.ùxŸ$"m.Ëÿ¥‡øþýž]e1m¾¼Ú«(¨Š³—‹ñ+Jß»ZOöÀéŠÄ•,ÁÞ,õ¥’šKúÏ#lŠÐlþíî”ô®/Ì×øoZ½é˜SïÑW¸KðUËÃYT( )~Œ;€‚¤u"·›¯ž)V Îäô³µeûP¦™fË!O$‡OÝ[}žÈÛó% °…×Ñç¶¼ÌOs†½÷#î½(Â¥·¼cÕü˜B£º†<<ÞfÝÐ=· @Ž3˜V®7N¯%f b³ñKœÎÒ7$ZÖ¹}­m$‰îκ™»ä]*éWgmíç]£k(î2¤W­É³ê/Þå>dŸSž˜ö>[ —÷qÇSf¦C@ƒßÚٳߛ~ÿñ`H™÷Ç׎Ë}¼¡Y!DÀÝÐbÌâ¿£šh\-_° 6JxÚÞS0à œAº\â2ò„ÝûÝ­ä¤Éã ù@8ƒ¥—òà7}R‡ü>_Ïðꦯ‘~!» }ª4s ®Yõ5fT¦Ú‚e+Ýü× 9ôÛ  “ãN%+IY@é:‹ÚëÜ604ƒÓ•¥±UB¶  ¤$N¹:`aÃö2ò¹ƒl6¤û·/'·)Q|— Ž…Ql#ò&H?ù=à}a?…(ø8ß¾öÔõø Àrq#¢óIœ¤7~v×\ÖV(ò¢ß[ÔÖN{£…ø²ýªrœÉO55-õ88?c º &m€fA.!wáWVŸkþ_ñá3 ‡d„îÀo˜)£¦Œ>Ê5O?gâ ZìS›ãåq­IQ—%õ½gw›Šh›f Ç!^e”O¤¸ÙB?ïs0(˜êt²·e'ƒpùä ëÏ>CˆöN¦pž—Gé…PiíX{ø0Åw_=8<ÓÉÍŸ1ðöj½¢Aß÷< ›ŸMwÚ$ƒÛx?ÕAŽ:ñSüüÊxµÙºV¡ ÄAc5~N~TJ;ìWUk£dã¾îi“ª”ºãð›Úž27 fm¿b»Ý6 €Ÿ{b¯6‘‘”ûÿúó8ÍGoÆ—e£‘Ód(|ØÖxa`3ÑïsU ñSJ-¿°q³Ltë19 ç!>Û?-£¿üž¿ãIÛ|©Ú,Ñ;”á&,€jåËNªÿn¸ïk?uƒèf¶ÕdX24K5ÌpÒL uRY(5±YvP}QŒËâf7§2ú]ž×ÏÍÛ(ÕBsH×·:póÐý(&f œ3³Oãô¸Nèð±õüWf{«=Z°òª&+À¬?`þdÿ•ôó—rÏ*ÆËŽb¶Ò¸>„ ½Ê¼õ·þÛ5Ù*êÅ÷YeN„i¯ k×Ôµ«a—Úêó¡ùëXçøW/eäØõÔ \¨fvqÈ/iÉÍi‰€l%lNrsÌ&æýLañ"•ýI®§ )ô‰Œ•×ÏÍü}¼÷¹×¬©¯eŠóÞ‚j~ŒòJÇ%}˜Oµî¥±èŠò8¬R™ÇGü)ËŒ¡©70ôÝÚû ¿M…;ÈŠ>MÔãî@ÝzSÕœâPý𘄘.mpRãC ¿úºTT…"¿^J©¦´~Xì H‹ÆðŒÚÏ£m l zÙõD]'"Z¯>õ–«ˆP¢W©“Íù‘˜)PY Ô%)Ôd$…Ô2`óˆeŠîàä´èjº ŽõçéG<,RÈb>ð#Cª"ÚÃ:€ã´¡¿¶w„6<0­ÕMµCˆn÷ØFbrÀÜÓû;1¹®™´ÐøLͲ…BCæÔ{ ‚7,ZIo× Ú1wµœóšŒD4FXìÚH€ºäà3x…H®é¦mŸñy¿Àa¬±å§/ªú1 Ë#À#ö} ó80vèXk—Ì´sH *@ÖwmöÎ>™ŽÒ-Ù&4‹22Èe‰ËžÃ|r¿ø”J#¨¼Éà÷òBç”–iƒk. ÓÁZgƒ@ºøOS¸“ï[¬³cÏ>O×f/dzbA§! wÄÎEÁá=ʦu÷^ÝÝ@$€áÐ ûŒ¼½ìŸ,BâÃC:—‘9%ŠF®B“3"º®"rßg µ å%éð¤ßNB/§“8è`µE_#3 °ÿºœä,õ1‡†ñœÔMÓÂ7~]?_̽¾DGc è°$ö)¡x0€DfЄIóÕà ØVÍñw½þ2ö·[egnß÷Q8°²¸Zå RH€tÙݦq|7æeò¡wÌÄh ÷ˆ„‰=_L  r _áÙMhþÎÀ€Oæ€tP† ìµiAòG_„:y«ô™;è]ÞíÀÜágoñÚ‰¿Þ’I{"ÔZÜLHdŽE7P‡«4ð/$–ItÚÌ!a}K!@E ²K]œá0ôÿþž¾ ?ßfÇÙ·ðîAù3»â2 júG0ÕûgTãTnmºÿH.q§´Ù•\,àú2}wE]å/ƒVøˆf¸”;Ÿn•bK4Œ”Vãöôd|P»õSäΈ»GÝ|8 ~' >ØìùO ï:° Þ º«Ü`nÄ5×…A \™<ßV îú\€i n„B-¡y]ß2à=÷¾½Š¨Ï©xozŽ6#ܸâ{©"2©ÃR§±qaqÆâãóŵ}îås“DÚý¸|ð7$"ˆr¶ t^Žr-V3°Êâù^{™äq³„磫˜×éSÀ¦.:Bv àZ&?‚a ç‘RüodÄ»Â]c+AÎïgÒv.ì:Ú¤I-°–[™/½>iäW-2Vÿö„_¹™&™øà’ó¡™ã |âïN¸<Æ8ø F ÒwVð'„æ ­¬çcóm˜ µC¬ùgZ¹ñc8Nýˆ0‡zI&JÌî2[7â$ýP—üd®ß„‹6XØÌÿwné˜ÁÀ× ¿ì%Š $G3 bÃIî{?Áö°2ªÆÎ‘cšG•2d¼x@×õÈ¥L=AãüQ~èUºdà‚”Aðä` x߃¡å¦<>ý¢î§æ4D†:Þp8`aHßê¦x¿aÒܰ ©6 Ú¼ž|Ü÷‘åTð±X+¿º>Egª¿_ÕÆŒM' êI³ž›ÎZ»?ÿ]‰í­æÍ¯ –°î''Hr~ŠÅ:ªL¢ˆòPÇUóïÆ»w¬2hinlG›3Ã`¡×`f,Go æó:9‹t}\«ùͲ矬ŠP‡JDH äàK…š=´‘| %PµO¢9ÈþsÍÅÒu©ÌOñc?¦9Y¶Ämï…Œ§^(Ä‚œxwÞ¦Š´‘˜Õ{ØØ6aãÕÕ}Ȉ/WÌu!=”+n#ÏC‘ÍŸü,´Õ­‡¾Ø¤V¿éä® £Ë¯Zý¶Š”ÈÉÁ˜€fIÓ[æôÚ©ÓÉ¡ Õ5Q .¹ï v£žï±å$)q—úur()QýIôÉó‚vE€_ê DÁáHÔ@c õ£7 y¸Œ­Úwf]§FŠr–. î³ó“ì|¸‘Œäù`Aõe4=¨N ª%°€éâ wÉK˜7ôcÉÎtØ’_*†?¼9]` >Tp]¨Ù>n7&Jü Ûi7ß>b,С8MÖ§S»:k'`vs–ªä{ñÿDÓÉ1>D³Ö@uë…¨?€;ðy r ÙÀùƧféidz…¿”î¾`=Ó£–7çRY©!/F¿'ÅЬƒ{.Ÿ$3ŸLó òêÓ¾¢PGÙ¾Y%í@{mõ’\”Ô\´o»…6“Ãi jU€§è…£æõå­KNd_b]r@—”=d€LdáѰU´™Çm}Úsú H> ÃA1µûr¾$c‘ÞQ‚"Å¢» )©o,šð.„8=Â0Ú= ƒ>Ñä1hÒwL=ÿ;íê‡õ"–õ–}ñjÌ(a<¹|q™¾o&ó¬HC胪>Ù&M°ÉÂ|Ã6º:‹ÏÅ7)6<öy(ûHÓyG‚é"wA_‘~0,/w0>•Ðê1T8¸Âr„Çw€ÀѼéÜÈË4,’Šú«%8æÔÌaô3ù¬t›{ÛbEéË®G‹èsH_ÙŒrR`54‰ØâZßú~?5ŒHàÑÛ¾¤8”*uMÚ M§c¢ð`2¾'ïïޣ𮥠@»Tz…å 7ж"¨ Ÿ5•_èÒ)\ 26ü ÇCd&B „6CçE¨´ãls¿‰k®3¨g5_n ÒÀúÁàƒ»BŽa äà/ ¯À€IñÂ’8t83¦†£ôGk`'?¢¤¢Å‘J~Å ÌÅtŒgy#0Aÿ¸ùA³ýHVæmƒõ€F)j‚ºY`±´Áw—6Ì,(C=‡ôa„!wÃuôka-Éó›ò–ÿ®D‰¦ J^2bu·ÃHs,„?é2‚çêëN=!ü  /`Ðn¨»‰ýÚB ÿi~2p÷s’@æ„€eèÏÆ ªH'“⹂„˜©C¼×ÈÉAÇ”Œ$Hþ# °¸òVnô‚y`å<_ªÄÓž'µx\5¤ ¸#ÓÑZÑ’Þ3Á‰'Cn-¤g£¨+rê7taÇÇ·S#†ˆÀ×a³®†§{Ü©<Ú(ˆYƒ9 ÝÇgÕÉ?¨¸ž‰+o(Kö‚´f|Ú„â×zÉ+o‡Â¸LË j³@¬Ãp!‘¤ÁpÛ“èÕ’;Š7…Ÿ€`dhÖCœÃ¤¬1ì‘:ˆ, ­ü»ùµú^ÿ¢­ÇöïîS †p; tì‘J«}2¿TA‘×°}Ð3Üù¯g@›SœmúüパʑØ0ºÑYÑßÀ%Á°úà0¶_HAqp¦ÄJfv T ãÝ‘ßÂ_ḇGÑÔ5½ÕìMЉYù2OKñ‡Zd¾¾ådƪK:®œ}x;¢¨œe ñ˜¥Q2´93C6R{¿]í)ÙQsÌ8öãAìÛÞú ÈÐqÿÌGƒúH„íàUµÙ®‡›|ŠýEÆý<Ø7£/‘Ÿ2ÂôÑñŒ éóe˜** Á..àÃáRäY„:»wQŸ@¤kãcjÜ\×›Ø)‹ ƒnÈë “kGc‘åÈŽD_ïAýÔ¨ CD œ€‘¬Hã!-¹Ü)1· Ùó!“€œQÿ¹&§‹‘ðCŠM,Ñg®|?ôý'§ƒ « %F „àò,’ô<âB<\ww¸Hµg@X¸ó«„F7¥‘ŒÄÂŬè±v‡*æ$‘‹dZ‚þž&fçïÌŸ§´v‹Ü-,{ŸBpЂ?ÈÝÂ:›Ô·jcæaÓÒäì¡.ø<ÏãbˆºúŸÐ$_ÌüžA Ž_¿'Q„‘ÜLM‘þDÂÝyz;ÿ‘¶œdà0a @9€U#ȃYJ˜¡UE`˜¼Ï^ó³Oc:{KRÚ¥©·ÞÒ• å®kõ£ñY)ã}¥"±íÈ-‰göDƒÌ!ŽÖñ£pîs˜i’©wи‚ÝÓZóS‘÷ˆÙÂùœÅöc+ÒÉÝrq÷ãâ ×HšB¥÷Kž¸„‘Ö‘ÐßíŒÞÖxþ ’öFf úVˆROW8˜ D“ã™ $/øí¢ãëà~È@ê·ŸÕ³ëeç¬ïJÈÒ¡¹òÌñžœi8Q¥upµ’fþÙè†0°ê ¶l‰óÀVˆúás8’bwÏ:[´aª&ÓBp¡2ZöIS‹ô÷çî)0•Hp Q?ýªìÊÑò쇪†Úø°æºÑR ³3WÅ䯳…n¶yrX d´Rô­ Òß!Ø)óƒÙfu oø‘ÔÀŸ,vµ™÷Ù¢Ukì–¢ŽÈİ;‰” ÞÀ—jüµ0r·‡ºŠÎj°¬Á㜉x“ƒÍýÓ¨ùišI0H>ÖÀ`Ð×Yiƒ·Ïèå³v·L0©mdèò^]ÁŒÈVú\Îï“íE\À,jÜØpŽØôÜÞ²HÀ!ް`é/šæO¦"Dzè­ÛáW¿È¬E0>ù]o$dgƒ'qñǹ2$g`8dŠ5^½JœœÉ¬xR$\6þá7AÿI¿ÁSóû䓇Wš¿þ©“ •>IU†-”­ôÜ«Ä磙¤’ ®Èä]þÈ<"¿|½ ºÆ$Úx=³aÕf:jõç})½Ø‰9ÙD€ñaTJaƒËóÓ.äî8A¯ðæ+Õ¾­¬Ýw¥'sΛ9‚éX6ð®z'.óŒ$”\àæb0ò:ú·¸Jfp“9!šË²L‘R€“Ð˹˜Ò)ãÜ¿Þka`ìÁ¿…Cb Ì.ÚÒêeg->jO…É—¼ †¬ƒ>›ëL¦ÙüÒ ÜFËû}vyô'áa>i—ă’Y´Yqz uì>>_©ã£" ®Û/þVžŒîáh{øS´`Ü™ñC4Ú&´ÿuœÄm)7Ô€—,ÃàÒ+ü!ƒß<÷œXç`itä¥@úñâ@…$"ÆôwA#ðÕ`ÉÁƒ/g´xÜàÁyò:x1Q×…ÊìÌä¹ä¹[ò3/þ'–@ ›Ñ U&AÊ0ò$¬k冚ɋ—DCF‚¡.ï& 8˜Hõ5S!1R,Ë#9 pan°,§Ö|1çÇ+À¸›†À<>šC¼…IÄB=ZNãåôGM¯Á*vʆ]t”3ÕÝ“ íôÞ©2Û?k83à{8é`{~î‰(‡'øIëd%Wy&ë=dkw²4º¸ž†kX¾Â]~[ý¯Ìç§dc¶’³ÃMàûå 7y9À`0²Gò@Wy¸±HIB „ðV|P -¤š´|KÜBÒ gtx1ÔJËAdÜHKž:Ej+€ÄñeÒÂús‘uªÌ›[wu²o•n=ǰþµ+?ñºþ¶?•âl¤Ur4 ¡¹O›ÆÎé'‚ço©ÌRÿÅXƆHoæ  vR)§ÌsI€ÿD€4i0ÓÃV®²Ýž ¶Vð~l\OÿNHoHd0»ºù³9”#Âä¹ÂFÊ ÆÎ3™5ÿ=™8Hñ#Ä€ZÜ:x QÁ» ކµX7T…‡ûc€«ß“*ýïýÕØixu]HõC0Ì&ˆ”k`‰)è…@H­Eäï¤j  Á§‘Õ@ÿˆR¦²/óõÈÕ•#âÒX¢xóä¤8s¹C) ÞöHð9åȃFÍ-Õ³ÌS|VD0ì@•ŠÂ}QŠÂd|µ÷Öƒ8J”u¸6– |ÀðJIÏý2NÎ_L)š‚ðžGÁé̳„ œT3Q'Œ3§ìî`~P®7¨¯_ l!@$O{½¹-õið¿¡ö^füÚe«a×0Fdx²lITÒt1äGåþE0ô<¬+\, ÙÖñëǘĢˆvlÄ =÷`?T6Ô{õÎjÀÎu‹Nû‚N¯\Ü_îÈC³‚|8°„ÃC¬ŒEbENÌȉèç/[EïÓHHL"Ûâm²N@pÕVÐá rGÞ¤”±Ô¢8ä êrnle“Ö’Uör>§à™Óë%ùgd{p¨˜8%‘„ÖKï6–ÉàÒÏ #𪕉Æwè¶ƉƒŠ$pÒÖщ¬-P!‰“m@àÚYh^D˜öè5ÖM:‘¨“ØÀåö5r;ÿ]™m[lÜÅ—©Áͪ€+U½/ªNð€3ð^¸›Í® ìü©³Ïšø=@5Ä3€ÞéÁÌxTRTûp ½BµŸ:M@EðLƒ¹ÌZ¦ˆ††øº5¸#Ó­7ÇéYäèg‘£Â yÓ ph¯[$³çgîxFÒŽ\«ÆSŒƒÓ0äID^´·®“{€7d0³€[æªÝ܇@ùhØZ~ \B`G)‘êëüïþƒçÛsúƒÍAEå,þû´Ò™AÜsìÁ>¢q¸-^"ôPRþ_›Œ yôñ„¬Æi[‰é5[X£¦}¢Êжÿy. Èâ—LJYç«â¿·¹K1õЪQ†®–¶®AÓöÔú©¡1H±ÖÆAi"dN?¬aào@òú]Ü>,"¯oq>Ìä?Ä^¬Hø-2œ†ÞOBón›“å¹®þ„'ÁÆ{!{IÆ # Y$”p&vÇÓ2ÃÞÉ68¸Aö@ôQS4w©¾9åÛªÄö=tõû +‘€»ÁH‚µøCYŒiA1­ÀË#ê„”ºÔdŸ©ýôfØ ƒ–ó¾$¿Ól‘»ïA뱂·ƒ >a‹îì2‡9¤Fϸ•~û2‰w¸P7mufÝSî4f·>Y?6 v@öêvj%f›âÁl€ª,&?º¬¹8L·µ öðåË@N+q„ü ßÀ›`²x|ï5&«aëP nú:GwA‹W»™†êY$½'úȘ Š\? ‹Y¼rn$ >­$¶pâ(” qþݲâÁàëR¥ˆL˜Ü÷þÁ˜œ`3q°Ç k‰Ä•ÍäÞ‚ºÙ=$>=®%u+ÚâEÖÚ“ëA1¬˜BÞ:ÂÞ /ÕÕJŒ ùŒfÇÎV “»Ž,m,Õ™• om• peíµyŸë÷‘ÄHÐÅ*3œÒù3] OQ†öÔ`ºÍ‡”ŒBBrï «^d9¯Ä¹~ÓŽÒ?¨Ï0'uð”x ¦^Jö¦ë=áœyýÿ8y­ ùÒî€+‘‚æ´+;û€CšÎ’ ¿Í{'yþ„‚½ BBù¬!3˜¸²³sPŸ´T#u‘“¶ÀÉt°±ÞV&6(›·¶ú (ý cÀ;؃ž³šd+kër½Eçl*Áûœp›š<†ŸSçã©Eºu€ó ÷ ÒƒyfÀ @8ÔÐJzœwQ'ß„l[†³--H üŸ 9èû©434±*ù‡‹œ¼\!‹è¤ä⪘‰|pnØopb´’?¨áÃfaÐ${¤-µ_.Ò>¨‰äÞû+á#%~#‚+ÇqœI/Rñ'íe˜!ñÜ¢Õ"ª¼„¢<⥼û©ed5˜ÎBâ䓼 /m€s1¦î£ç@jŠív@¿üb@#:@Áǘß%–ò€©ã-Ú´‹å‚ÎW„·ê}3xìw!Ôô2¸V›Jhõæ× ça°0›)IbPÓ¦·U;³ÑÈäá¶poó=y–Ã^öˆ;؇d~/™‡Ä½ƒ¹cXéôâ?]“]z¤kgÑåO¸×P³ì)ÒSûzÅÅ>Ywz TMÖ†ú³Ï9©â Ø~éØ2'¶dô\œ¸ªÏ+¶[€ÒEg¸¯lpž.çUÙÑÄ]¯‹!Èݤ `^9ð{1¹ƒË¢”$ ~?´q²²kp—Èk¤vq§÷Ùk Þ5ÿg)ב]‡«…Ȥ#)Ï^f‰~#ùZ¹Æê$ŸT4qÄC¥†ûĬ‡e†Ê™×ˆ"Ât$DþGÕz,¼n?Ùù;Äò­‰œ'jŠoþfæH2NaÑ[û·.ápå/Å‚FÆršrcTK~L=ªHbgÿtIÄÁƒÖÅðz˜Àܤ&[c%ó¢ y! à1ðÁެHz¥¬XØ ñ Šƒ¢ÂIýØ ÿÇèi:éíøû¼-]¼IëôA‡€sð¯Ü:x[WQgw3Ò ˆó dõáèrdŒÜW‹†Ÿº˜ÓÞ¯dMVÈœˆtq‡31dˆS!$õHl+‹‡;ßçæ{è “ àÁr…+Øùd ±yr,lÕ ¨è¥Õ@w°¯R,sXúU~q‚è䟉«àÆþv·ühgc¯óûªôþ/ AÀ…KoH9¨»°®oˆR½ [!åÈ|S€ÂÀW‹ì´ä ¢õ¢넇¹ûËÕäêsmr[Y4{÷.ÏÄ¢!I+U½ Š‚…±ÇOs¿ró"[ìçúùtè|U[µ '¶ Èà—PhåÁÂ\)'ñ¦¼pçN„ñr¨nO>’@O3°„ð!óÈ#l˜ÈAÄ€ÏB? ;ÒI¸ìFB~Ä)U…8!p$WcÔ‡¦ ô|)™Füo—ÄίW܇ペ²`Ì’±f}þž¢åjmñæXTÀ¢U5Cƒ1»¤fì—óûc†öÑH‹Ö¥œ®1VÓÕ´û²u}ÎvMã+¶›K SB30§_ÏÃÐ@ÞéÐ8ÅbIÑ캖I…›2oÉá΃1@$•J€,UºL¸îú_|Xýâ|NÈA’‡×„7ÛT%P®HÎGè4ÞWñÖê'Ð@”ß÷Ãäç$ügù2tù¯Ì›C‡¡pÒ“ÁÔq$­ù¥©‡þ¬$›Œ o½âO²AV &8ƒ[„×}`úøUS íŒEUܦ½t½  úã¢Òãú]SQë=Ñt)œ³ƒlH*æM¤°z¶Ÿ“oÊW—$2n5€˜*Ò}åp㓽dˆâЄ)0”‘­ót©{ý,P¡Æë83: ¾BƒG¡‘U†Áv6¢dé`àû´s(Â_•—¼N¸À$^H킲ö?ë2~ágOí½#Ooª¦l¼»V•üÁ^EZ#’QÃþó*Ò¡RJ8oáá5½ü·0½œ;>rEv•%Ù;ðæ¸s[&O²>º îË)"· mÆÚIµøY9 ‚µ VƒŸ÷$»ŸZ¸>Èå„—m“„ ã ¨ÛÈ 7ðô ©½Í¦~ƒÄ „<HëàÂÀc]!ŒÜ“Þ‡§Lo~Ÿ½,ðDòA½ŽÜ‹GuÉÕ¥ÆÇëtîþOë ‹Æ™ýqµzp~;ýÈÙH<ä/;ÿ&Qy{Ê(5.õ²AY„ø¡ëHW¨€+Û¾þÙ6»•è®êøœŠ‘øßblzÒ«;£”ýã¦cA>âd%Y]ÃjwÎ@£”Vã²m Çá¿ä7ƒ%ÎöíÀæLvÕ …Dk«›‡çÚy“EÇUí‡üð6¨ÎŽnèÀÀËw²ÄZg ®…úˆKGÉ#°ó$Zc^Br~K5)¼Œø00S‚ÁÄÍ̳ÁƒiCá\gLÂÐ`4›˜»PH ÒRŠnÿ,ÎP½žñ`ˆ}äSySa,<ä³wºù䆦øÉ{ÀÞÔŠÜ|ÚÝdMÓA€6p}±Í$óˆËð³gg9+¬yÐ`’û&í3+4 ßU8Ù—Œ·Ù¦_F 4ãœ$á%.45Œº™foˆ¤«È;ø{ɼЯ²ÅHûÒ¶q-ìyÓNùç"»þꚬ!¥ùlynç:ÏFz¨ÔÇS„@÷‘çBäZ´Ãs‘Ù¨„ àü‹g š¿¼Œírì :à7Ðv ÔAêÁ˦ˆ- o54‡À–öÉv1X‰”¥Æ¯î‚Hs0¶x}P­|ëoÄTæIãŽsvy3Z¸ƒùÉ ·ƒ¦Îžë+ÜQV , mI¾ÊçŸ=g æO3ºÐ*F0ýÈÌc%#"h*¥G£¨Yk–pm»/‰â+6¾'¾7M§hVCð¼eiå¾Nçü)ŽK÷ø+Æ®«Èï]3cÕí Ñ×.°iF­É#Ÿ\oÃiš”Ê´$Œq Õ@ö˜ÀÇ_â¹ÙN»Woý¼ðõaüõrwy-¦r@X[ ´? vÀ<ýé“6vá@æD"ëªùæë±½´ÔóGØÈ(1g=øI-$Ýçã] í ?ì^4qU„”‚}bÿ‰>Ùó < tÙ¸Kü)úyò³B[Ãð"dâ¾Y-4éÚiž[­^qédÉ×Eá wêZ'[b•a¡]ìé³- &R!a3ÕÿŠÞ %“3î6Îîk½*hz±UpaÏ”¿^Þ0èVÝbªämÏȺÃr97KA¬þügén[aî— Ähp{»ˆ£°ÙIÝzLÙÏXš’6 NÃ'/8÷†çN.KýúX‹´Ìç7ÿ®RJÌtÚØ·2 W€‡Ê P0—î3"¤o¡ßÌÇP- Þí‰Q¸èô¸÷ ¯üs|:ý'q é.ƒhqÝMªÞF@ Ï_ R€¡oSå@=ØÀgó•‹ä EZÄE*•ÑQ*sPêÁ"– Oƒ0}ÓÁÍ̽7‡ãÌl Ë‘ ˆk‘øïdš ,‹UÒ@æ` ,h¡KîÙÌJó%¿\œÕÛ™'—c'Žìf>¶3Œ1ïXøó«~<Ó†˜ˆœuÒ”Bœ;¸8}¬p"hü#eà0° wÐÉB¢N‡¸ŠfÙ“ ½9LÇD…Ê3B÷¬M Gê‰"š#žE JÒùˆ0qCöCÄ„ëˆCƆÇÚ¯9òGIÒÌl#CÂ\ª‘S€2 ×̬~·aqß%gkC._è³òÀÑÁރ͡í)¹L•š¹IL]ŠAÌAòÆæ+•¡*Ìq ¬ è <)Ä ¥L¡×ãy;×>¥ü|ç1[ 1±†6[Äã5“•dƒ…‚À)7ØÉjäÐ&¼˜?å×/,'³±·=×Ã#ÛŠIÂÈy³ŸÿWÇ–ó%½ðSäéNúNÿ öÈÜÎÛ¾¤wˆéÁ.æØ¬« ë%ÌÖYWêPŸGŽ³Ì”Dz=¬³Ð%VéóŒÄvW6«#°¶ÒM}ƒ%l /ÎÂV@=840½Oó™•¥âôÝíö’©øRëX)êIÎÆ9f>3RòI;8rÐÈyÂ\fnýüå}¦:ÆCWœÆÏJ¼[4÷b¯9 `GôãgîÃ7bÙXn|f¬p”º‡žÇKÅœ-8CàƒÖ‡[ Îáü‹”¿Ä¼n¼è4ƬÒÌ´×Z¹ôÄZ~Ù‰¡ ½ {ti!ö<€ü>oZ~ ©¹I#G^`PÇP…¶TãÍ"Ý÷`ò»ìl=ÉÜ·:ûí…€²Õâ’¤ZX¨_öÊÔápË«è 2ð)·›¯t²£<½€²(kølþe…Õ¸¦ÖZ©Áë1ëÅU9óu‰‰Ñš8€ã7t àa§uViŽ þTefD&s1·:Ló4GE Å# ›ÓÝôzWtnäÙê]·ÑÖfôMÚ¡ÁÒ¼V`ý<cÙú$Oé"hèYòm˜îƒ±Ê[Élúyø@eÖ ]‘3m–.¾…qÿi3 Ñç‰M2Az­‡YX÷mÓƒPUdѬ’*ìfà–5Iexhö#H°§üàüijEä©ÿ^Vs e`£†½…ôMAcÜSµtGÙ„È„/ë4$D‰"“áy†Zuw'Ï_ÀÈùt}Øí7C«žópÈÍA]ƒêõ­é¸ê³÷ûtºCI80ÔAb¦|Y©zzi]#¸ût‡0N¹ pHHÚ†.°æ®Á(€ÃUeg|~Y äéð&ãKÎòå ÚÛ'p9ÛŽžvB£ÿ¤Ú³ë ÇC–9ˆˆqpL™ˆ:Û×?äÇðÜ8€ÿ ðÁôÂS쥗öø1ÔÛ$ô]̳zCøóq÷Üg% jçèç? 2?m”‚ëÝï¦ßñùü|ªñ<Ÿ¾°Ê߆Á Ïí%¯ÇwŠýq Åcr|µ5'¥ð÷—…u¡U7Š .4Ö©Fý•L/XFS$Ú—Q1Ý-}®c;Û‰€ô¥ûU¤D«Ð÷œT˜x®”[b' HÏ~VÑmš0D) U¡ó£-N$Xã¨j{ WpPé&\þ*Çlû§¿Ö/çSÚrã–Œ>¼Þm¾zÞ£A –ý‡×Õyµ½m­øl»Yë·³É<*æšãD1”ÀÇ´6î˺®€¤ù§9´úã®¼îªøêÀ/B2"ÖK’›s-t `Lm’XÀÕÒ¸ td‚õ"ž­*LNÚCž0%j㮿YdÏB†ô®:ˆ+e“‹¬zùÉrÅ-¿[ÙœÐ5)½¥Ö0"¸¿6[óŒCL[4ØDEàFupÛã׬ ¢ÝÊ<ªÛÕÕæy 5ú¯yÄZÿž‹`§Ø É3@âÁ½x$·Œ}tr.œžæfŸè;ÛÊÐj¡Ê©¬ÞLD8Z„™ÎÝŽÄ…[ «?F.çw~E¬ù>°WH•›FŽ" ç; Çp_ç os–Dä¿/üÙ:6T+ÒñðÌcÚ«ŒÂ¤M®P–*cëñ¾µÚÞõ¼Ub×Ñù2K…Ÿ[¢{1ɕۖ»šëâN`›05¼`Ëãà@$Æ@0šs‚®é[Fˆ)]¹äB8d¨Æý DRxí«‘Â6<ð%kБàÑÎ_­íŒyF€&ÛÁžÈÀ ôñ…/íá¯î솳–»ú¡O¦DRÆ-@6ïà<t±B$½äô(,ºa·ò¯»ôT š±]½^÷CçóüŒÃZȄ٩æ“âÈ"…´w@…üÌ´Ç /X\A0 ÇÀïJ1:ĉ$€8B_c¾Ø%zÜšKškk{9ÄϨ†!ÌN‚Æ d3èŒÏðšÑΑÖk ”ûÿ¨•4Ùb´áÕ~‹$‡T”zç[h§É Ù5A¯øù4t8LÜl½—Ù5Ìã›H«O¦ëiëTÎö~}ñÓ¶X¤ÚmŸŽA¢Uœt(A¸‘̘0Œ(Ʋy>Ó×.*®+TcvtÃzH€ 0!Ž0õ5S]·<¬”dþU‹ã E’ „s‹{Á\æø•x.G˜ 4a™ DÒ»½[8Or>aC„Rº’ÉѺæRƒb}Ò*)AwñÁ”Au+¾¾¿ÇßQšhC‘Wò)ý—ü ?X¸è?ÉŠ¬.K¶ÇX9šr…òF ?ß ú¥­;Q¥Á¶zÈ"S5›ÞŒÍçy8‹Y÷Fñ·;}½üHQdbLÑíúNúßã™î<Ô:!òÒN˜…?²?æ¹äux*,T¹2"ÙKÎôŽ,£NÑîÆ¡ôºôÐMÚ<•‹ýàáwÀö…«tRÍÍrRE–†ÕÖË \ÈcŒçËf‚l)q«*ÒݰÓ&k´oDs'áÕÛ²haؾ³1"¦È)a{ù=È‚­»æNEÁAHÄ;æ­¦SQ]H*hæ!Z-Ì@òb l`løKÄàÎV´—bwœ^[ ·%C7%©‘fz_sÏ÷æ¿çíá´ÄÑQ *süyI/•îß÷, Qº{ÿZëte#5!Ò©S€ÑÿôOvš3÷êAçàãé)>£ãwÝa!¢rÀYj3ާä¼àç0ùàÖ:DUK¿¶;kdò©Äê‹ÀDÁ€ëÆ­ô·]m+ΘÍ€w¢b@ɃÊ}Beˆå|¨Zoí¹ ·¢N‚Ÿ÷íäh|ê%æüïÿ8ÙæV·ˆ:ÖuŸÙÊW­³ö}N{#; ¸HO—q8}Úz˜nïƒD¡Ík8äüVõŒ€pÇ”gýz“ãØA4“-”8?¸œìB.}qî}ý ¬¯½Au÷“L{5Ë–w~ ‰ý”©ŒýÍìƒ÷%âSüQ… Ö £ÕŒþæ0Ö§½ç-42è ™®—¡7â«8¿J$ .í 1Õ+3-(/Ð7ðŒ<ü??Õ„œ~Q¼Š*‡gûåÓäÖ¸QC ¹l·Üö*xoØ4q¤†±7–PêÊŽR‡¾i($düçv¼¬± ý/ðk¨WºÆ#Rúûýs¹Î¦~ 5C¤íýtçA¶v’w+w³Ï¾Uq¾¥øà½ @‡Ôð Jñø%¯×¤ x< ÷Á俎³ê wPW§B(õ„bºœëåÉÄFAÀØËrõ2o,,¿¦$dãøoî«e½wÃ8$ù™þå4'èb_Ôï,øë¼áž´“øvÕ|€¢V QÒóŠ9s/&óî§=^¤vS¿\ º6.y{^­,´×‡@Ÿ™¼{b©4†Cat¨c“úû©Î—¦ŒD—$x´Bh¥fϲP‚¤¬cË#âi:à·Ó(Æå®t1M…~^®¤¿?èk iqN  &ä§ó…‰±•™ó¾_C‰CHð€QV§ÿèÇÁhÉ猌2—ÎÜÈ×»ð‹ÿÅÜ‘N$4…Ûƒ€pammtools/NAMESPACE0000644000176200001440000001136314767027042013521 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method(add_cif,default) S3method(add_hazard,default) S3method(arrange,ped) S3method(as.data.frame,crps) S3method(as_ped,data.frame) S3method(as_ped,list) S3method(as_ped,nested_fdf) S3method(as_ped,pamm) S3method(as_ped,ped) S3method(distinct,ped) S3method(filter,ped) S3method(full_join,ped) S3method(get_cumu_coef,aalen) S3method(get_cumu_coef,cox.aalen) S3method(get_cumu_coef,gam) S3method(get_intervals,default) S3method(get_laglead,data.frame) S3method(get_laglead,default) S3method(gg_laglead,LL_df) S3method(gg_laglead,default) S3method(gg_laglead,nested_fdf) S3method(gg_smooth,default) S3method(group_by,ped) S3method(inner_join,ped) S3method(int_info,data.frame) S3method(int_info,default) S3method(int_info,pamm) S3method(int_info,ped) S3method(left_join,ped) S3method(make_newdata,default) S3method(make_newdata,fped) S3method(make_newdata,ped) S3method(mutate,ped) S3method(nest_tdc,default) S3method(nest_tdc,list) S3method(ped_info,ped) S3method(plot,pamm) S3method(predictSurvProb,pamm) S3method(print,pamm) S3method(rename,ped) S3method(right_join,ped) S3method(sample_frac,ped) S3method(sample_info,data.frame) S3method(sample_info,fped) S3method(sample_info,ped) S3method(sample_n,ped) S3method(select,ped) S3method(slice,ped) S3method(summarise,ped) S3method(summarize,ped) S3method(summary,pamm) S3method(tidy_fixed,coxph) S3method(tidy_fixed,gam) S3method(transmute,ped) S3method(ungroup,ped) export("%>%") export(GeomHazard) export(GeomStepHazard) export(GeomStepribbon) export(GeomSurv) export(add_cif) export(add_counterfactual_transitions) export(add_cumu_hazard) export(add_hazard) export(add_surv_prob) export(add_tdc) export(add_term) export(add_trans_prob) export(arrange) export(as_ped) export(as_ped_multistate) export(combine_df) export(cumulative) export(distinct) export(fcumu) export(filter) export(full_join) export(geom_hazard) export(geom_stephazard) export(geom_stepribbon) export(geom_surv) export(get_cumu_coef) export(get_cumu_eff) export(get_intervals) export(get_laglead) export(get_partial_ll) export(get_plotinfo) export(get_terms) export(gg_cumu_eff) export(gg_fixed) export(gg_laglead) export(gg_partial) export(gg_partial_ll) export(gg_re) export(gg_slice) export(gg_smooth) export(gg_tensor) export(group_by) export(inner_join) export(int_info) export(is.pamm) export(is.ped) export(left_join) export(make_newdata) export(mutate) export(nest_tdc) export(pamm) export(ped_info) export(rename) export(right_join) export(sample_frac) export(sample_info) export(sample_n) export(select) export(seq_range) export(sim_pexp) export(slice) export(split_data) export(summarise) export(tidy_fixed) export(tidy_re) export(tidy_smooth) export(tidy_smooth2d) export(transmute) export(ungroup) import(Formula) import(checkmate) import(dplyr) import(ggplot2) import(mgcv) import(purrr) import(survival) importFrom(Formula,Formula) importFrom(checkmate,assert_atomic_vector) importFrom(checkmate,assert_character) importFrom(checkmate,assert_class) importFrom(checkmate,assert_data_frame) importFrom(checkmate,test_data_frame) importFrom(dplyr,bind_cols) importFrom(dplyr,bind_rows) importFrom(dplyr,mutate) importFrom(dplyr,pull) importFrom(dplyr,slice) importFrom(ggplot2,GeomLine) importFrom(ggplot2,GeomRibbon) importFrom(ggplot2,GeomStep) importFrom(ggplot2,ggproto) importFrom(ggplot2,layer) importFrom(grDevices,dev.off) importFrom(grDevices,png) importFrom(graphics,plot) importFrom(lazyeval,f_eval) importFrom(magrittr,"%>%") importFrom(mgcv,predict.bam) importFrom(mgcv,predict.gam) importFrom(mvtnorm,rmvnorm) importFrom(pec,predictSurvProb) importFrom(purrr,compose) importFrom(purrr,cross_df) importFrom(purrr,discard) importFrom(purrr,flatten) importFrom(purrr,invoke_map) importFrom(purrr,map) importFrom(purrr,map2) importFrom(purrr,map2_dfr) importFrom(purrr,map_dfr) importFrom(purrr,map_int) importFrom(purrr,map_lgl) importFrom(purrr,reduce) importFrom(purrr,set_names) importFrom(rlang,":=") importFrom(rlang,.data) importFrom(rlang,.env) importFrom(rlang,UQ) importFrom(rlang,enquo) importFrom(rlang,eval_tidy) importFrom(rlang,quo_name) importFrom(rlang,quos) importFrom(rlang,sym) importFrom(scam,predict.scam) importFrom(stats,as.formula) importFrom(stats,coef) importFrom(stats,median) importFrom(stats,model.frame) importFrom(stats,model.matrix) importFrom(stats,poisson) importFrom(stats,ppoints) importFrom(stats,predict) importFrom(stats,qnorm) importFrom(stats,quantile) importFrom(stats,rexp) importFrom(stats,terms) importFrom(stats,update) importFrom(stats,vcov) importFrom(tibble,as_tibble) importFrom(tidyr,complete) importFrom(tidyr,crossing) importFrom(tidyr,expand_grid) importFrom(tidyr,gather) importFrom(tidyr,nest) importFrom(tidyr,pivot_longer) importFrom(tidyr,replace_na) importFrom(tidyr,unnest) importFrom(vctrs,vec_c) pammtools/LICENSE0000644000176200001440000000007713662013606013301 0ustar liggesusersYEAR: 2017 COPYRIGHT HOLDER: Andreas Bender and Fabian Scheipl pammtools/NEWS.md0000644000176200001440000001762515144603150013375 0ustar liggesusers# pammtools 0.7.4 ## Bug fixes * Fixed competing risks data transformation when status variable is a factor (#220, #216, #233) * Fixed CIF calculation to use factor levels from newdata instead of model attribute (#245) * Fixed cut point extraction for factor/character status variables * Fixed transition probability matrix initialization for states starting at 0 or 1 * Fixed CRAN NOTE: added `id` to global variables for dplyr compatibility (#260) ## Enhancements * Improved `add_trans_prob`: better documentation, proper examples, attribute attachment, and base R speedup * Added warning in `pamm()` when data does not contain an offset column * Added `broom` to Suggests ## Documentation * Updated `add_trans_prob` help page with proper parameter descriptions and working example * Added simulations vignette # pamtools 0.5.93 + Maintnance (some tidyverse deprecations, link fixes, etc., smaller bugs) # pammtools 0.5.92 + Fixed competing risks data trafo in case of more than 2 causes # pammtools 0.5.9 + Fixes issue 154: direction argument to `geom_stepribbon` # pammtools 0.5.8 + removed argument `methods` from `pamm`. Can be specified via `...`. Fixes #200 + adapted `warn_about_new_time_points` when original data not stored in model object. Fixes #203 + Fixed issue where not all ped attributes were retained when applying dplyr functions #202 # pammtools 0.5.7 + added staph data with recurrent events # pammtools 0.5.6 + maintenance fix + fixes to URLs and DOIs # pammtools 0.5.4 + updates to the `split_data` function that now accepts `Surv(start, stop, event)` type inputs, e.g., to construct left-truncated data. + Support and [vignette for left truncated data](https://adibender.github.io/pammtools/articles/left-truncation.html) + Support and [vignette for competing risks data](https://adibender.github.io/pammtools/articles/competing-risks.html) + Support and [vignette for recurrent events data](https://adibender.github.io/pammtools/articles/recurrent-events.html) # pammtools 0.2.4 * CRAN fix. Discrepancy between man page and code. # pammtools 0.2.3 * CRAN fix. Compliance with new dplyr version (1.0.0) # pammtools 0.2.2 * CRAN fix, removed plyr dependency (see issue #141) * `as_ped.ped` now also works for transformations with time-dependent covariates # pammtools 0.2.1 * Adds a new interface for model estimation called `pamm`, which is a thin wrapper around `mgcv::gam` with some arguments pre-set. * Adds S3 method `predictSurvProb.pamm` * Adds support and vignette for model evaluation using package **`pec`** * Fixed bug when CIs were calculated simulation based and model contained factor variables * Removed unnecessary dependencies in Imports/Suggests # pammtools 0.1.15 * Interface for specification of data transformation in `as_ped` changed. The vertical bar `|` is no longer necessary to indicate concurrent or cumulative effects # pammtools 0.1.14 * Support for new interface to tidyr # pammtools 0.1.13 * Functions `get_hazard` and `add_hazard` also gain `reference` argument. Allows to calculate (log-)hazard ratios. * Introduces breaking changes to `add_term` function. Argument `relative` is replaced by `reference`, makes calculation of relative (log-)hazards, i.e. hazard ratios, more flexible. Argument `se.fit` is replaced by `ci`. # pammtools 0.1.11 ## bugs * fixes bug in **`dplyr`** reverse dependency (see #101) * fixes bug in tidiers for Aalen models (see #99) ## documentation * Better documentation and functionality for `make_newdata` * Added new vignette linking to tutorial paper (online only) # pammtools 0.1.9 * maintenance update: fixes CRAN issues due to new RNG # pammtools 0.1.8 ## documentation * Updates to cumulative effect vignette * Updates to time-dependent covariate vignette (+ data transformation) * Update citation information ## Features * `concurrent` now has a `lag = 0` argument, can be set to positive integer values * `as_ped` accepts multiple `concurrent` specials with different `lag` specifications ## Bug/Issue fixes * Fixed bug caused by changes in **`checkmate`** [#73](https://github.com/adibender/pammtools/issues/73) * Bug Fixes [#42](https://github.com/adibender/pammtools/issues/42), [#76](https://github.com/adibender/pammtools/issues/76), [#63](https://github.com/adibender/pammtools/issues/63), [#77](https://github.com/adibender/pammtools/issues/77) # pammtools 0.1.7 * Further improved support for cumulative effects * Added vignette on estimation and visualization of cumulative effect * Updated vignette on convenience functions (now "Workflow and convenience functions") * Other (minor) upgrades/updates to documentation/vignettes * Updates homepage (via pkgdown) # pammtools 0.1.3 ## Minor changes * Update documentation * More tests/improved coverage * Lag-lead column is adjusted in `make-newdata.fped` ## Bug fixes - visualization functions `gg_laglead` and `gg_partial_ll` did not calculate the lag-lead-window correctly when applied to `ped` data # pammtools 0.1.0 ## Features * Better support for cumulative effects * Lag-Lead matrix now contains quadrature weights * Better support for visualization of cumulative effects # pammtools 0.0.9 ## Breaking changes * `make_newdata` loses arguments `expand` and `n` and gains `...` where arbitrary covariate specifications can be placed, i.e. e.g. `age=seq_range(age, n=20)`. Multiple such expression can be provided and a data frame with one row for each combination of the evaluated expressions will be returned. All variables not specified in \code{...} will be set to respective mean or modus values. For data of class `ped` or `fped` `make_newdata` will try to specify time-dependent variables intelligently. * `te_var` argument in `concurrent` and `cumulative` was renamed to `tz_var` * `te` arguments have been replaced by `tz` (time points at which `z` was observed) in all functions to avoid confusion with `mgcv::te` (e.g., `gg_laglead`) ## Updates and new features * Overall better support for cumulative effects * Added convenience functions for work with cumulative effects, namely - `gg_partial` and - `gg_slice` * Added helper functions to calculate and visualize Lag-lead windows - `get_laglead` - `gg_laglead` * Added convenience `geom`s for piece-wise constant hazards (see examples in `?geom_hazard`, cumulative hazards and survival probabilities (usually `aes(x=time, y = surv_prob)`, but data set doesn't contain extra row for `time = 0`), thus - `geom_stephazard` adds row (x=0, y = y[1]) to the data before plotting - `geom_hazard` adds row (x = 0, y = 0) before plotting (can also be used for cumulative hazard) - `geom_surv` add row (x = 0, y = 1) before plotting # pammtools 0.0.8 * All data transformation is now handled using `as_ped` (see [data transformation vignette](https://adibender.github.io/pammtools/articles/data-transformation.html)) * Data transformation now handles - standard time-to-event data - time-to-event data with concurrent effects of time-dependent covariates - time-to-event data with cumulative effects of time-dependent covariates * Added functionality to flexibly simulate data from PEXP including cumulative effects, see `?sim_pexp` * Added functionality to calculate Aalen-model style cumulative coefficients, see `?cumulative_coefficient` * Breaking change in `split_data` (`as_ped` now main data trafo function): - removed `max.end` argument - added `max_time` argument to introduce administrative censoring at `max_time` when no custom interval split points are provided # pammtools 0.0.3 ## pammtools 0.0.3.2 * More `tidyeval` adaptations * consistent handling of "no visible global binding" NOTEs * Release used in
A. Bender, Groll A., Scheipl F., "A generalized additive model approach to time-to-event analysis" (2017). Statistical Modelling (*to appear*) ## pammtools 0.0.3.1 * some adaptations to `tidyeval` * Minor bug fixes # pammtools 0.0.2 * Ported `pamm` package to `pammtools` due to naming conflicts with `PAMM` package on CRAN pammtools/inst/0000755000176200001440000000000015030776132013246 5ustar liggesuserspammtools/inst/CITATION0000644000176200001440000000365514767027042014421 0ustar liggesuserscitHeader("Citation information for 1) the Software 2) the tutorial on PAMMs 3) paper on cumulative effects/exposure-lag-response associations, 4) Recurrent events:") bibentry( bibtype = "Article", author = "Andreas Bender and Fabian Scheipl", title = "pammtools: Piece-wise exponential Additive Mixed Modeling tools", year = "2018", journal = "arXiv:1806.01042 [stat]", textVersion = "Bender, A. and Scheipl, F. (2018b). pammtools: Piece-wise exponential additive mixed modeling tools. arXiv:1806.01042 [stat]", url = "https://arxiv.org/abs/1806.01042") bibentry( bibtype = "Article", author = "Andreas Bender and Andreas Groll and Fabian Scheipl", title = "A generalized additive model approach to time-to-event analysis", textVersion = "Andreas Bender, Andreas Groll and Fabian Scheipl. 2018. A Generalized Additive Model Approach to Time-to-Event Analysis. Statistical Modelling.", journal = "Statistical Modelling", year = "2018", url = "https://doi.org/10.1177/1471082X17748083" ) bibentry( bibtype = "Article", author = "Bender, Andreas and Scheipl, Fabian and Hartl, Wolfgang and Day, Andrew G and K\u00fcchenhoff, Helmut", title = "Penalized estimation of complex, non-linear exposure-lag-response associations", textVersion = "Andreas Bender, Fabian Scheipl, Wolfgang Hartl, Andrew G Day, Helmut K\u00fcchenhoff; Penalized estimation of complex, non-linear exposure-lag-response associations, Biostatistics, , kxy003", journal = "Biostatistics", year = "2019" ) bibentry( bibtype = "Article", author = "Ramjith Jordache, and Bender, Andreas and Roes, Kit C. B. and Jonker, Marianne A.", title = "Recurrent events analysis with piece-wise exponential additive mixed models", textVersion = "Ramjith J, Bender A, Roes KCB, Jonker MA. Recurrent events analysis with piece-wise exponential additive mixed models. 2022. Statistical Modelling., 2022", journal = "Statistical Modelling", year = "2022" ) pammtools/README.md0000644000176200001440000000373414767027042013564 0ustar liggesusers [![R-CMD-check](https://github.com/adibender/pammtools/workflows/R-CMD-check/badge.svg)](https://github.com/adibender/pammtools/actions) [![cran checks](https://badges.cranchecks.info/worst/pammtools.svg)](https://cran.r-project.org/web/checks/check_results_pammtools.html) [![lifecycle](https://lifecycle.r-lib.org/articles/figures/lifecycle-stable.svg)](https://lifecycle.r-lib.org/articles/stages.html) [![codecov.io](https://codecov.io/github/adibender/pammtools/coverage.svg?branch=master)](https://app.codecov.io/github/adibender/pammtools/branch/master) [![CRAN_Status_Badge](https://www.r-pkg.org/badges/version-ago/pammtools)](https://cran.r-project.org/package=pammtools) [![CRAN_Download_Badge](https://cranlogs.r-pkg.org/badges/pammtools)](https://cran.r-project.org/package=pammtools) [![MIT license](https://img.shields.io/badge/license-MIT-brightgreen.svg)](https://opensource.org/license/mit) # **`pammtools`**: Piece-Wise Exponential Additive Mixed Modeling Tools ### Installation Install from CRAN or GitHub using: ``` r # CRAN install.packages("pammtools") # Development version remotes::install_github("adibender/pammtools") ``` ### Overview **`pammtools`** facilitates the estimation of Piece-wise exponential Additive Mixed Models (PAMMs) for time-to-event data. PAMMs can be represented as generalized additive models and can therefore be estimated using GAM software (e.g. **`mgcv`**), which, compared to other packages for survival analysis, often offers more flexibility w.r.t. to the specification of covariate effects (e.g. non-linear, time-varying effects, cumulative effects, etc.). The package supports single-event analysis, left-truncation, recurrent events, competing risks and multi-state models. To get started, see the [Articles](https://adibender.github.io/pammtools/articles/) section. pammtools/man/0000755000176200001440000000000015144603102013034 5ustar liggesuserspammtools/man/pipe.Rd0000644000176200001440000000040013662013606014261 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utils-pipe.R \name{\%>\%} \alias{\%>\%} \title{Pipe operator} \usage{ lhs \%>\% rhs } \description{ See \code{magrittr::\link[magrittr]{\%>\%}} for details. } \keyword{internal} pammtools/man/sim_pexp_cr.Rd0000644000176200001440000000045314455720102015641 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sim-pexp.R \name{sim_pexp_cr} \alias{sim_pexp_cr} \title{Simulate data for competing risks scenario} \usage{ sim_pexp_cr(formula, data, cut) } \description{ Simulate data for competing risks scenario } \keyword{internal} pammtools/man/geom_stepribbon.Rd0000644000176200001440000001434715143606362016524 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ggplot-extensions.R \docType{data} \name{geom_stepribbon} \alias{geom_stepribbon} \alias{GeomStepribbon} \title{Step ribbon plots.} \usage{ geom_stepribbon( mapping = NULL, data = NULL, stat = "identity", position = "identity", direction = "hv", na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, ... ) } \arguments{ \item{mapping}{Set of aesthetic mappings created by \code{\link[ggplot2:aes]{aes()}}. If specified and \code{inherit.aes = TRUE} (the default), it is combined with the default mapping at the top level of the plot. You must supply \code{mapping} if there is no plot mapping.} \item{data}{The data to be displayed in this layer. There are three options: If \code{NULL}, the default, the data is inherited from the plot data as specified in the call to \code{\link[ggplot2:ggplot]{ggplot()}}. A \code{data.frame}, or other object, will override the plot data. All objects will be fortified to produce a data frame. See \code{\link[ggplot2:fortify]{fortify()}} for which variables will be created. A \code{function} will be called with a single argument, the plot data. The return value must be a \code{data.frame}, and will be used as the layer data. A \code{function} can be created from a \code{formula} (e.g. \code{~ head(.x, 10)}).} \item{stat}{The statistical transformation to use on the data for this layer. When using a \verb{geom_*()} function to construct a layer, the \code{stat} argument can be used to override the default coupling between geoms and stats. The \code{stat} argument accepts the following: \itemize{ \item A \code{Stat} ggproto subclass, for example \code{StatCount}. \item A string naming the stat. To give the stat as a string, strip the function name of the \code{stat_} prefix. For example, to use \code{stat_count()}, give the stat as \code{"count"}. \item For more information and other ways to specify the stat, see the \link[ggplot2:layer_stats]{layer stat} documentation. }} \item{position}{A position adjustment to use on the data for this layer. This can be used in various ways, including to prevent overplotting and improving the display. The \code{position} argument accepts the following: \itemize{ \item The result of calling a position function, such as \code{position_jitter()}. This method allows for passing extra arguments to the position. \item A string naming the position adjustment. To give the position as a string, strip the function name of the \code{position_} prefix. For example, to use \code{position_jitter()}, give the position as \code{"jitter"}. \item For more information and other ways to specify the position, see the \link[ggplot2:layer_positions]{layer position} documentation. }} \item{direction}{direction of stairs: 'vh' for vertical then horizontal, 'hv' for horizontal then vertical, or 'mid' for step half-way between adjacent x-values.} \item{na.rm}{If \code{FALSE}, the default, missing values are removed with a warning. If \code{TRUE}, missing values are silently removed.} \item{show.legend}{logical. Should this layer be included in the legends? \code{NA}, the default, includes if any aesthetics are mapped. \code{FALSE} never includes, and \code{TRUE} always includes. It can also be a named logical vector to finely select the aesthetics to display. To include legend keys for all levels, even when no data exists, use \code{TRUE}. If \code{NA}, all levels are shown in legend, but unobserved levels are omitted.} \item{inherit.aes}{If \code{FALSE}, overrides the default aesthetics, rather than combining with them. This is most useful for helper functions that define both data and aesthetics and shouldn't inherit behaviour from the default plot specification, e.g. \code{\link[ggplot2:annotation_borders]{annotation_borders()}}.} \item{...}{Other arguments passed on to \code{\link[ggplot2:layer]{layer()}}'s \code{params} argument. These arguments broadly fall into one of 4 categories below. Notably, further arguments to the \code{position} argument, or aesthetics that are required can \emph{not} be passed through \code{...}. Unknown arguments that are not part of the 4 categories below are ignored. \itemize{ \item Static aesthetics that are not mapped to a scale, but are at a fixed value and apply to the layer as a whole. For example, \code{colour = "red"} or \code{linewidth = 3}. The geom's documentation has an \strong{Aesthetics} section that lists the available options. The 'required' aesthetics cannot be passed on to the \code{params}. Please note that while passing unmapped aesthetics as vectors is technically possible, the order and required length is not guaranteed to be parallel to the input data. \item When constructing a layer using a \verb{stat_*()} function, the \code{...} argument can be used to pass on parameters to the \code{geom} part of the layer. An example of this is \code{stat_density(geom = "area", outline.type = "both")}. The geom's documentation lists which parameters it can accept. \item Inversely, when constructing a layer using a \verb{geom_*()} function, the \code{...} argument can be used to pass on parameters to the \code{stat} part of the layer. An example of this is \code{geom_area(stat = "density", adjust = 0.5)}. The stat's documentation lists which parameters it can accept. \item The \code{key_glyph} argument of \code{\link[ggplot2:layer]{layer()}} may also be passed on through \code{...}. This can be one of the functions described as \link[ggplot2:draw_key]{key glyphs}, to change the display of the layer in the legend. }} } \description{ \code{geom_stepribbon} is an extension of the \code{geom_ribbon}, and is optimized for Kaplan-Meier plots with pointwise confidence intervals or a confidence band. The default \code{direction}-argument \code{"hv"} is appropriate for right-continuous step functions like the hazard rates etc returned by \code{pammtools}. } \examples{ library(ggplot2) huron <- data.frame(year = 1875:1972, level = as.vector(LakeHuron)) h <- ggplot(huron, aes(year)) h + geom_stepribbon(aes(ymin = level - 1, ymax = level + 1), fill = "grey70") + geom_step(aes(y = level)) h + geom_ribbon(aes(ymin = level - 1, ymax = level + 1), fill = "grey70") + geom_line(aes(y = level)) } \seealso{ \code{\link[ggplot2]{geom_ribbon}} \code{geom_stepribbon} } \keyword{datasets} pammtools/man/modus.Rd0000644000176200001440000000040513662013606014460 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/helpers.R \name{modus} \alias{modus} \title{Calculate the modus} \usage{ modus(var) } \arguments{ \item{var}{A atomic vector} } \description{ Calculate the modus } \keyword{internal} pammtools/man/get_cut.Rd0000644000176200001440000000115014767027042014767 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/get-cut-points.R \name{get_cut} \alias{get_cut} \alias{get_cut.default} \alias{get_cut.list} \title{Obtain interval break points} \usage{ get_cut(data, formula, cut = NULL, ...) \method{get_cut}{default}(data, formula, cut = NULL, max_time = NULL, event = 1L, ...) \method{get_cut}{list}( data, formula, cut = NULL, max_time = NULL, event = 1L, timescale = "gap", ... ) } \description{ Default method words for data frames. The list method applies the default method to each data set within the list. } \keyword{internal} pammtools/man/split_data.Rd0000644000176200001440000000371014455720102015454 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/split-data.R \name{split_data} \alias{split_data} \title{Function to transform data without time-dependent covariates into piece-wise exponential data format} \usage{ split_data( formula, data, cut = NULL, max_time = NULL, multiple_id = FALSE, ... ) } \arguments{ \item{formula}{A two sided formula with a \code{\link[survival]{Surv}} object on the left-hand-side and covariate specification on the right-hand-side (RHS). The RHS can be an extended formula, which specifies how TDCs should be transformed using specials \code{concurrent} and \code{cumulative}. The left hand-side can be in start-stop-notation. This, however, is only used to create left-truncated data and does not support the full functionality.} \item{data}{Either an object inheriting from data frame or in case of time-dependent covariates a list of data frames (of length 2), where the first data frame contains the time-to-event information and static covariates while the second (and potentially further data frames) contain information on time-dependent covariates and the times at which they have been observed.} \item{cut}{Split points, used to partition the follow up into intervals. If unspecified, all unique event times will be used.} \item{max_time}{If \code{cut} is unspecified, this will be the last possible event time. All event times after \code{max_time} will be administratively censored at \code{max_time}.} \item{multiple_id}{Are occurences of same id allowed (per transition). Defaults to \code{FALSE}, but is sometimes set to \code{TRUE}, e.g., in case of multi-state models with back transitions.} \item{...}{Further arguments passed to the \code{data.frame} method and eventually to \code{\link[survival]{survSplit}}} } \description{ Function to transform data without time-dependent covariates into piece-wise exponential data format } \seealso{ \code{\link[survival]{survSplit}} } \keyword{internal} pammtools/man/gg_laglead.Rd0000644000176200001440000000264714222504522015404 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/lag-lead-utils.R \name{gg_laglead} \alias{gg_laglead} \alias{gg_laglead.default} \alias{gg_laglead.LL_df} \alias{gg_laglead.nested_fdf} \title{Plot Lag-Lead windows} \usage{ gg_laglead(x, ...) \method{gg_laglead}{default}(x, tz, ll_fun, ...) \method{gg_laglead}{LL_df}( x, high_col = "grey20", low_col = "whitesmoke", grid_col = "lightgrey", ... ) \method{gg_laglead}{nested_fdf}(x, ...) } \arguments{ \item{x}{Either a numeric vector of follow-up cut points or a suitable object.} \item{...}{Further arguments passed to methods.} \item{tz}{A vector of exposure times} \item{ll_fun}{Function that specifies how the lag-lead matrix should be constructed. First argument is the follow up time second argument is the time of exposure.} \item{high_col}{Color used to highlight exposure times within the lag-lead window.} \item{low_col}{Color of exposure times outside the lag-lead window.} \item{grid_col}{Color of grid lines.} } \description{ Given data defining a Lag-lead window, returns respective plot as a \code{ggplot2} object. } \examples{ ## Example 1: supply t, tz, ll_fun directly gg_laglead(1:10, tz=-5:5, ll_fun=function(t, tz) { t >= tz + 2 & t <= tz + 2 + 3}) ## Example 2: extract information on t, tz, ll_from data with respective attributes data("simdf_elra", package = "pammtools") gg_laglead(simdf_elra) } \seealso{ get_laglead } pammtools/man/gg_slice.Rd0000644000176200001440000000406514222504522015106 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/viz-elra.R \name{gg_slice} \alias{gg_slice} \title{Plot 1D (smooth) effects} \usage{ gg_slice(data, model, term, ..., reference = NULL, ci = TRUE) } \arguments{ \item{data}{Data used to fit the \code{model}.} \item{model}{A suitable model object which will be used to estimate the partial effect of \code{term}.} \item{term}{A character string indicating the model term for which partial effects should be plotted.} \item{...}{Covariate specifications (expressions) that will be evaluated by looking for variables in \code{x}. Must be of the form \code{z = f(z)} where \code{z} is a variable in the data set and \code{f} a known function that can be usefully applied to \code{z}. Note that this is also necessary for single value specifications (e.g. \code{age = c(50)}). For data in PED (piece-wise exponential data) format, one can also specify the time argument, but see "Details" an "Examples" below.} \item{reference}{If specified, should be a list with covariate value pairs, e.g. \code{list(x1 = 1, x2=50)}. The calculated partial effect will be relative to an observation specified in \code{reference}.} \item{ci}{Logical. Indicates if confidence intervals for the \code{term} of interest should be calculated/plotted. Defaults to \code{TRUE}.} } \description{ Flexible, high-level plotting function for (non-linear) effects conditional on further covariate specifications and potentially relative to a comparison specification. } \examples{ ped <- tumor[1:200, ] \%>\% as_ped(Surv(days, status) ~ . ) model <- mgcv::gam(ped_status~s(tend) + s(age, by = complications), data=ped, family = poisson(), offset=offset) make_newdata(ped, age = seq_range(age, 20), complications = levels(complications)) gg_slice(ped, model, "age", age=seq_range(age, 20), complications=levels(complications)) gg_slice(ped, model, "age", age=seq_range(age, 20), complications=levels(complications), ci = FALSE) gg_slice(ped, model, "age", age=seq_range(age, 20), complications=levels(complications), reference=list(age = 50)) } pammtools/man/fcumu.Rd0000644000176200001440000000064313662013606014454 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sim-pexp.R \name{fcumu} \alias{fcumu} \title{A formula special used to handle cumulative effect specifications} \usage{ fcumu(..., by = NULL, f_xyz, ll_fun) } \description{ Can be used in the second part of the formula specification provided to \code{\link[pammtools]{sim_pexp}} and should only be used in this context. } \keyword{internal} pammtools/man/geom_hazard.Rd0000644000176200001440000001614415143606362015623 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/geom-hazard.R \docType{data} \name{geom_hazard} \alias{geom_hazard} \alias{GeomHazard} \alias{geom_stephazard} \alias{GeomStepHazard} \alias{geom_surv} \alias{GeomSurv} \title{(Cumulative) (Step-) Hazard Plots.} \usage{ geom_hazard( mapping = NULL, data = NULL, stat = "identity", position = "identity", na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, ... ) geom_stephazard( mapping = NULL, data = NULL, stat = "identity", position = "identity", direction = "vh", na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, ... ) geom_surv( mapping = NULL, data = NULL, stat = "identity", position = "identity", na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, ... ) } \arguments{ \item{mapping}{Set of aesthetic mappings created by \code{\link[ggplot2:aes]{aes()}}. If specified and \code{inherit.aes = TRUE} (the default), it is combined with the default mapping at the top level of the plot. You must supply \code{mapping} if there is no plot mapping.} \item{data}{The data to be displayed in this layer. There are three options: If \code{NULL}, the default, the data is inherited from the plot data as specified in the call to \code{\link[ggplot2:ggplot]{ggplot()}}. A \code{data.frame}, or other object, will override the plot data. All objects will be fortified to produce a data frame. See \code{\link[ggplot2:fortify]{fortify()}} for which variables will be created. A \code{function} will be called with a single argument, the plot data. The return value must be a \code{data.frame}, and will be used as the layer data. A \code{function} can be created from a \code{formula} (e.g. \code{~ head(.x, 10)}).} \item{stat}{The statistical transformation to use on the data for this layer. When using a \verb{geom_*()} function to construct a layer, the \code{stat} argument can be used to override the default coupling between geoms and stats. The \code{stat} argument accepts the following: \itemize{ \item A \code{Stat} ggproto subclass, for example \code{StatCount}. \item A string naming the stat. To give the stat as a string, strip the function name of the \code{stat_} prefix. For example, to use \code{stat_count()}, give the stat as \code{"count"}. \item For more information and other ways to specify the stat, see the \link[ggplot2:layer_stats]{layer stat} documentation. }} \item{position}{A position adjustment to use on the data for this layer. This can be used in various ways, including to prevent overplotting and improving the display. The \code{position} argument accepts the following: \itemize{ \item The result of calling a position function, such as \code{position_jitter()}. This method allows for passing extra arguments to the position. \item A string naming the position adjustment. To give the position as a string, strip the function name of the \code{position_} prefix. For example, to use \code{position_jitter()}, give the position as \code{"jitter"}. \item For more information and other ways to specify the position, see the \link[ggplot2:layer_positions]{layer position} documentation. }} \item{na.rm}{If \code{FALSE}, the default, missing values are removed with a warning. If \code{TRUE}, missing values are silently removed.} \item{show.legend}{logical. Should this layer be included in the legends? \code{NA}, the default, includes if any aesthetics are mapped. \code{FALSE} never includes, and \code{TRUE} always includes. It can also be a named logical vector to finely select the aesthetics to display. To include legend keys for all levels, even when no data exists, use \code{TRUE}. If \code{NA}, all levels are shown in legend, but unobserved levels are omitted.} \item{inherit.aes}{If \code{FALSE}, overrides the default aesthetics, rather than combining with them. This is most useful for helper functions that define both data and aesthetics and shouldn't inherit behaviour from the default plot specification, e.g. \code{\link[ggplot2:annotation_borders]{annotation_borders()}}.} \item{...}{Other arguments passed on to \code{\link[ggplot2:layer]{layer()}}'s \code{params} argument. These arguments broadly fall into one of 4 categories below. Notably, further arguments to the \code{position} argument, or aesthetics that are required can \emph{not} be passed through \code{...}. Unknown arguments that are not part of the 4 categories below are ignored. \itemize{ \item Static aesthetics that are not mapped to a scale, but are at a fixed value and apply to the layer as a whole. For example, \code{colour = "red"} or \code{linewidth = 3}. The geom's documentation has an \strong{Aesthetics} section that lists the available options. The 'required' aesthetics cannot be passed on to the \code{params}. Please note that while passing unmapped aesthetics as vectors is technically possible, the order and required length is not guaranteed to be parallel to the input data. \item When constructing a layer using a \verb{stat_*()} function, the \code{...} argument can be used to pass on parameters to the \code{geom} part of the layer. An example of this is \code{stat_density(geom = "area", outline.type = "both")}. The geom's documentation lists which parameters it can accept. \item Inversely, when constructing a layer using a \verb{geom_*()} function, the \code{...} argument can be used to pass on parameters to the \code{stat} part of the layer. An example of this is \code{geom_area(stat = "density", adjust = 0.5)}. The stat's documentation lists which parameters it can accept. \item The \code{key_glyph} argument of \code{\link[ggplot2:layer]{layer()}} may also be passed on through \code{...}. This can be one of the functions described as \link[ggplot2:draw_key]{key glyphs}, to change the display of the layer in the legend. }} \item{direction}{direction of stairs: 'vh' for vertical then horizontal, 'hv' for horizontal then vertical, or 'mid' for step half-way between adjacent x-values.} } \description{ \code{geom_hazard} is an extension of the \code{geom_line}, and is optimized for (cumulative) hazard plots. Essentially, it adds a (0,0) row to the data, if not already the case. Stolen from the \code{RmcdrPlugin.KMggplot2} (slightly modified). } \examples{ library(ggplot2) library(pammtools) ped <- tumor[10:50,] \%>\% as_ped(Surv(days, status)~1) pam <- mgcv::gam(ped_status ~ s(tend), data=ped, family = poisson(), offset = offset) ndf <- make_newdata(ped, tend = unique(tend)) \%>\% add_hazard(pam) # piece-wise constant hazards ggplot(ndf, aes(x = tend, y = hazard)) + geom_vline(xintercept = c(0, ndf$tend[c(1, (nrow(ndf)-2):nrow(ndf))]), lty = 3) + geom_hline(yintercept = c(ndf$hazard[1:3], ndf$hazard[nrow(ndf)]), lty = 3) + geom_stephazard() + geom_step(col=2) + geom_step(col=2, lty = 2, direction="vh") # comulative hazard ndf <- ndf \%>\% add_cumu_hazard(pam) ggplot(ndf, aes(x = tend, y = cumu_hazard)) + geom_hazard() + geom_line(col=2) # doesn't start at (0, 0) # survival probability ndf <- ndf \%>\% add_surv_prob(pam) ggplot(ndf, aes(x = tend, y = surv_prob)) + geom_surv() + geom_line(col=2) # doesn't start at c(0,1) } \seealso{ \code{\link[ggplot2]{geom_line}}, \code{\link[ggplot2]{geom_step}}. } \keyword{datasets} pammtools/man/add_term.Rd0000644000176200001440000000465014222504522015111 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/add-functions.R \name{add_term} \alias{add_term} \title{Embeds the data set with the specified (relative) term contribution} \usage{ add_term(newdata, object, term, reference = NULL, ci = TRUE, se_mult = 2, ...) } \arguments{ \item{newdata}{ A data frame or list containing the values of the model covariates at which predictions are required. If this is not provided then predictions corresponding to the original data are returned. If \code{newdata} is provided then it should contain all the variables needed for prediction: a warning is generated if not. See details for use with \code{link{linear.functional.terms}}. } \item{object}{ a fitted \code{gam} object as produced by \code{gam()}. } \item{term}{A character (vector) or regular expression indicating for which term(s) information should be extracted and added to data set.} \item{reference}{A data frame with number of rows equal to \code{nrow(newdata)} or one, or a named list with (partial) covariate specifications. See examples.} \item{ci}{\code{logical}. Indicates if confidence intervals should be calculated. Defaults to \code{TRUE}.} \item{se_mult}{The factor by which standard errors are multiplied to form confidence intervals.} \item{...}{Further arguments passed to \code{\link[mgcv]{predict.gam}}} } \description{ Adds the contribution of a specific term to the linear predictor to the data specified by \code{newdata}. Essentially a wrapper to \code{\link[mgcv]{predict.gam}}, with \code{type="terms"}. Thus most arguments and their documentation below is from \code{\link[mgcv]{predict.gam}}. } \examples{ library(ggplot2) ped <- as_ped(tumor, Surv(days, status)~ age, cut = seq(0, 2000, by = 100)) pam <- mgcv::gam(ped_status ~ s(tend) + s(age), family = poisson(), offset = offset, data = ped) #term contribution for sequence of ages s_age <- ped \%>\% make_newdata(age = seq_range(age, 50)) \%>\% add_term(pam, term = "age") ggplot(s_age, aes(x = age, y = fit)) + geom_line() + geom_ribbon(aes(ymin = ci_lower, ymax = ci_upper), alpha = .3) # term contribution relative to mean age s_age2 <- ped \%>\% make_newdata(age = seq_range(age, 50)) \%>\% add_term(pam, term = "age", reference = list(age = mean(.$age))) ggplot(s_age2, aes(x = age, y = fit)) + geom_line() + geom_ribbon(aes(ymin = ci_lower, ymax = ci_upper), alpha = .3) } pammtools/man/daily.Rd0000644000176200001440000000167614222504522014441 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/data.R \docType{data} \name{daily} \alias{daily} \title{Time-dependent covariates of the \code{\link{patient}} data set.} \format{ An object of class \code{tbl_df} (inherits from \code{tbl}, \code{data.frame}) with 18797 rows and 4 columns. } \usage{ daily } \description{ This data set contains the time-dependent covariates (TDCs) for the \code{\link{patient}} data set. Note that nutrition was protocoled for at most 12 days after ICU admission. The data set includes: \describe{ \item{CombinedID}{Unique patient identifier. Can be used to merge with \code{\link{patient}} data} \item{Study_Day}{The calendar (!) day at which calories (or proteins) were administered} \item{caloriesPercentage}{The percentage of target calories supplied to the patient by the ICU staff} \item{proteinGproKG}{The amount of protein supplied to the patient by the ICU staff}} } \keyword{datasets} pammtools/man/get_hazard.Rd0000644000176200001440000000447114222504522015443 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/add-functions.R \name{get_hazard} \alias{get_hazard} \alias{get_hazard.default} \title{Calculate predicted hazard} \usage{ get_hazard(object, newdata, ...) \method{get_hazard}{default}( object, newdata, reference = NULL, ci = TRUE, type = c("response", "link"), ci_type = c("default", "delta", "sim"), time_var = NULL, se_mult = 2, ... ) } \arguments{ \item{object}{ a fitted \code{gam} object as produced by \code{gam()}. } \item{newdata}{ A data frame or list containing the values of the model covariates at which predictions are required. If this is not provided then predictions corresponding to the original data are returned. If \code{newdata} is provided then it should contain all the variables needed for prediction: a warning is generated if not. See details for use with \code{link{linear.functional.terms}}. } \item{...}{Further arguments passed to \code{\link[mgcv]{predict.gam}} and \code{\link{get_hazard}}} \item{reference}{A data frame with number of rows equal to \code{nrow(newdata)} or one, or a named list with (partial) covariate specifications. See examples.} \item{ci}{\code{logical}. Indicates if confidence intervals should be calculated. Defaults to \code{TRUE}.} \item{type}{Either \code{"response"} or \code{"link"}. The former calculates hazard, the latter the log-hazard.} \item{ci_type}{The method by which standard errors/confidence intervals will be calculated. Default transforms the linear predictor at respective intervals. \code{"delta"} calculates CIs based on the standard error calculated by the Delta method. \code{"sim"} draws the property of interest from its posterior based on the normal distribution of the estimated coefficients. See \href{https://adibender.github.io/simpamm/confidence-intervals.html}{here} for details and empirical evaluation.} \item{time_var}{Name of the variable used for the baseline hazard. If not given, defaults to \code{"tend"} for \code{\link[mgcv]{gam}} fits, else \code{"interval"}. The latter is assumed to be a factor, the former numeric.} \item{se_mult}{Factor by which standard errors are multiplied for calculating the confidence intervals.} } \description{ Calculate predicted hazard } \keyword{internal} pammtools/man/formula_helpers.Rd0000644000176200001440000000074313662013606016525 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-utils.R \name{get_lhs_vars} \alias{get_lhs_vars} \alias{get_rhs_vars} \title{Extract variables from the left-hand-side of a formula} \usage{ get_lhs_vars(formula) get_rhs_vars(formula) } \arguments{ \item{formula}{A \code{\link{formula}} object.} } \description{ Extract variables from the left-hand-side of a formula Extract variables from the right-hand side of a formula } \keyword{internal} pammtools/man/get_surv_prob.Rd0000644000176200001440000000324014222504522016204 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/add-functions.R \name{get_surv_prob} \alias{get_surv_prob} \title{Calculate survival probabilities} \usage{ get_surv_prob( newdata, object, ci = TRUE, ci_type = c("default", "delta", "sim"), se_mult = 2L, time_var = NULL, interval_length = "intlen", nsim = 100L, ... ) } \arguments{ \item{newdata}{ A data frame or list containing the values of the model covariates at which predictions are required. If this is not provided then predictions corresponding to the original data are returned. If \code{newdata} is provided then it should contain all the variables needed for prediction: a warning is generated if not. See details for use with \code{link{linear.functional.terms}}. } \item{object}{ a fitted \code{gam} object as produced by \code{gam()}. } \item{ci}{\code{logical}. Indicates if confidence intervals should be calculated. Defaults to \code{TRUE}.} \item{se_mult}{Factor by which standard errors are multiplied for calculating the confidence intervals.} \item{time_var}{Name of the variable used for the baseline hazard. If not given, defaults to \code{"tend"} for \code{\link[mgcv]{gam}} fits, else \code{"interval"}. The latter is assumed to be a factor, the former numeric.} \item{interval_length}{The variable in newdata containing the interval lengths. Can be either bare unquoted variable name or character. Defaults to \code{"intlen"}.} \item{...}{Further arguments passed to \code{\link[mgcv]{predict.gam}} and \code{\link{get_hazard}}} } \description{ Calculate survival probabilities } \keyword{internal} pammtools/man/gg_smooth.Rd0000644000176200001440000000151514222504522015315 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/convenience-plots.R \name{gg_smooth} \alias{gg_smooth} \alias{gg_smooth.default} \title{Plot smooth 1d terms of gam objects} \usage{ gg_smooth(x, ...) \method{gg_smooth}{default}(x, fit, ...) } \arguments{ \item{x}{A data frame or object of class \code{ped}.} \item{...}{Further arguments passed to \code{\link{get_terms}}} \item{fit}{A model object.} } \value{ A \code{\link[ggplot2]{ggplot}} object. } \description{ Given a gam model this convenience function returns a plot of all smooth terms contained in the model. If more than one smooth is present, the different smooth are faceted. } \examples{ g1 <- mgcv::gam(Sepal.Length ~ s(Sepal.Width) + s(Petal.Length), data=iris) gg_smooth(iris, g1, terms=c("Sepal.Width", "Petal.Length")) } \seealso{ get_terms } pammtools/man/get_terms.Rd0000644000176200001440000000207614222504522015323 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/get-terms.R \name{get_terms} \alias{get_terms} \title{Extract the partial effects of non-linear model terms} \usage{ get_terms(data, fit, terms, ...) } \arguments{ \item{data}{A data frame containing variables used to fit the model. Only first row will be used.} \item{fit}{A fitted object of class \code{\link[mgcv]{gam}}.} \item{terms}{A character vector (can be length one). Specifies the terms for which partial effects will be returned} \item{...}{Further arguments passed to \code{\link{seq_range}}.} } \value{ A tibble with 5 columns. } \description{ This function basically creates a new \code{df} from \code{data} for each term in \code{terms}, creating a range from minimum and maximum of the \code{predict(fit, newdata=df, type="terms")}. Terms are then stacked to a tidy data frame. } \examples{ library(survival) fit <- coxph(Surv(time, status) ~ pspline(karno) + pspline(age), data=veteran) terms_df <- veteran \%>\% get_terms(fit, terms = c("karno", "age")) head(terms_df) tail(terms_df) } pammtools/man/from_to_pairs.Rd0000644000176200001440000000155714767033103016206 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/multi-state-helpers.R \name{from_to_pairs} \alias{from_to_pairs} \alias{from_to_pairs2} \alias{from_to_pairs.data.frame} \title{Extract transition information from different objects} \usage{ from_to_pairs(t_mat, ...) from_to_pairs2(t_mat, ...) \method{from_to_pairs}{data.frame}(t_mat, from_col = "from", to_col = "to", ...) } \arguments{ \item{t_mat}{an object that contains information about possible transitions.} \item{from_col}{The name of the column in the data frame that contains "from" states.} \item{to_col}{The name of the column in the data frame that contains "to" states.} } \description{ Extract transition information from different objects } \examples{ \dontrun{ df = data.frame(id = c(1,1, 2,2), from = c(1, 1, 2, 2), to = c(2, 3, 2, 2)) from_to_pairs(df) } } \keyword{internal} pammtools/man/predictSurvProb.pamm.Rd0000644000176200001440000000150414767027042017426 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/predict.R \name{predictSurvProb.pamm} \alias{predictSurvProb.pamm} \title{S3 method for pamm objects for compatibility with package pec} \usage{ \method{predictSurvProb}{pamm}(object, newdata, times, ...) } \arguments{ \item{object}{A fitted model from which to extract predicted survival probabilities} \item{newdata}{A data frame containing predictor variable combinations for which to compute predicted survival probabilities.} \item{times}{A vector of times in the range of the response variable, e.g. times when the response is a survival object, at which to return the survival probabilities.} \item{...}{Additional arguments that are passed on to the current method.} } \description{ S3 method for pamm objects for compatibility with package pec } pammtools/man/add_counterfactual_transitions.Rd0000644000176200001440000000212714767027042021626 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/multi-state-helpers.R \name{add_counterfactual_transitions} \alias{add_counterfactual_transitions} \title{Add counterfactual observations for possible transitions} \usage{ add_counterfactual_transitions( data, from_to_pairs = list(), from_col = "from", to_col = "to", transition_col = "transition" ) } \arguments{ \item{data}{Data set that only contains rows for transitions that took place.} \item{from_to_pairs}{A list with one element for each possible initial state. The values of each list element indicate possible transitions from that state. Will be calculated from the data if unspecified.} \item{from_col}{Name of the column that stores initial state.} \item{to_col}{Name of the column that stores end state.} \item{transition_col}{Name of the column that contains the transition identifier (factor variable).} } \description{ If data only contains one row per transition that took place, this function adds additional rows for each transition that was possible at that time (for each subject in the data). } pammtools/man/get_sim_cumu.Rd0000644000176200001440000000043114767027042016016 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/add-functions.R \name{get_sim_cumu} \alias{get_sim_cumu} \title{helper function for add_trans_ci} \usage{ get_sim_cumu(newdata, ...) } \description{ helper function for add_trans_ci } \keyword{internal} pammtools/man/dplyr_verbs.Rd0000644000176200001440000001151114767027042015672 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tidyverse-methods.R \name{dplyr_verbs} \alias{dplyr_verbs} \alias{arrange} \alias{filter} \alias{distinct} \alias{full_join} \alias{group_by} \alias{inner_join} \alias{left_join} \alias{mutate} \alias{rename} \alias{right_join} \alias{sample_frac} \alias{sample_n} \alias{select} \alias{slice} \alias{summarise} \alias{transmute} \alias{ungroup} \alias{arrange.ped} \alias{group_by.ped} \alias{ungroup.ped} \alias{distinct.ped} \alias{filter.ped} \alias{sample_n.ped} \alias{sample_frac.ped} \alias{slice.ped} \alias{select.ped} \alias{mutate.ped} \alias{rename.ped} \alias{summarise.ped} \alias{summarize.ped} \alias{transmute.ped} \alias{inner_join.ped} \alias{full_join.ped} \alias{left_join.ped} \alias{right_join.ped} \title{\code{dplyr} Verbs for \code{ped}-Objects} \usage{ \method{arrange}{ped}(.data, ...) \method{group_by}{ped}(.data, ..., .add = FALSE) \method{ungroup}{ped}(x, ...) \method{distinct}{ped}(.data, ..., .keep_all = FALSE) \method{filter}{ped}(.data, ...) \method{sample_n}{ped}(tbl, size, replace = FALSE, weight = NULL, .env = NULL, ...) \method{sample_frac}{ped}(tbl, size = 1, replace = FALSE, weight = NULL, .env = NULL, ...) \method{slice}{ped}(.data, ...) \method{select}{ped}(.data, ...) \method{mutate}{ped}(.data, ...) \method{rename}{ped}(.data, ...) \method{summarise}{ped}(.data, ...) \method{summarize}{ped}(.data, ...) \method{transmute}{ped}(.data, ...) \method{inner_join}{ped}(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) \method{full_join}{ped}(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) \method{left_join}{ped}(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) \method{right_join}{ped}(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) } \arguments{ \item{.data}{an object of class \code{ped}, see \code{\link{as_ped}}.} \item{...}{see \code{dplyr} documentation} \item{x}{an object of class \code{ped}, see \code{\link{as_ped}}.} \item{tbl}{an object of class \code{ped}, see \code{\link{as_ped}}.} \item{size}{<\code{\link[dplyr:dplyr_tidy_select]{tidy-select}}> For \code{sample_n()}, the number of rows to select. For \code{sample_frac()}, the fraction of rows to select. If \code{tbl} is grouped, \code{size} applies to each group.} \item{replace}{Sample with or without replacement?} \item{weight}{<\code{\link[dplyr:dplyr_tidy_select]{tidy-select}}> Sampling weights. This must evaluate to a vector of non-negative numbers the same length as the input. Weights are automatically standardised to sum to 1.} \item{.env}{DEPRECATED.} \item{by}{A join specification created with \code{\link[dplyr:join_by]{join_by()}}, or a character vector of variables to join by. If \code{NULL}, the default, \verb{*_join()} will perform a natural join, using all variables in common across \code{x} and \code{y}. A message lists the variables so that you can check they're correct; suppress the message by supplying \code{by} explicitly. To join on different variables between \code{x} and \code{y}, use a \code{\link[dplyr:join_by]{join_by()}} specification. For example, \code{join_by(a == b)} will match \code{x$a} to \code{y$b}. To join by multiple variables, use a \code{\link[dplyr:join_by]{join_by()}} specification with multiple expressions. For example, \code{join_by(a == b, c == d)} will match \code{x$a} to \code{y$b} and \code{x$c} to \code{y$d}. If the column names are the same between \code{x} and \code{y}, you can shorten this by listing only the variable names, like \code{join_by(a, c)}. \code{\link[dplyr:join_by]{join_by()}} can also be used to perform inequality, rolling, and overlap joins. See the documentation at \link[dplyr:join_by]{?join_by} for details on these types of joins. For simple equality joins, you can alternatively specify a character vector of variable names to join by. For example, \code{by = c("a", "b")} joins \code{x$a} to \code{y$a} and \code{x$b} to \code{y$b}. If variable names differ between \code{x} and \code{y}, use a named character vector like \code{by = c("x_a" = "y_a", "x_b" = "y_b")}. To perform a cross-join, generating all combinations of \code{x} and \code{y}, see \code{\link[dplyr:cross_join]{cross_join()}}.} \item{copy}{If \code{x} and \code{y} are not from the same data source, and \code{copy} is \code{TRUE}, then \code{y} will be copied into the same src as \code{x}. This allows you to join tables across srcs, but it is a potentially expensive operation so you must opt into it.} \item{suffix}{If there are non-joined duplicate variables in \code{x} and \code{y}, these suffixes will be added to the output to disambiguate them. Should be a character vector of length 2.} } \value{ a modified \code{ped} object (except for \code{do}) } \description{ See \code{dplyr} documentation of the respective functions for description and examples. } \keyword{internal} pammtools/man/cumulative_coefficient.Rd0000644000176200001440000000302314222504522020037 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/cumulative-coefficient.R \name{get_cumu_coef} \alias{get_cumu_coef} \alias{get_cumu_coef.gam} \alias{get_cumu_coef.aalen} \alias{get_cumu_coef.cox.aalen} \title{Extract cumulative coefficients (cumulative hazard differences)} \usage{ get_cumu_coef(model, data = NULL, terms, ...) \method{get_cumu_coef}{gam}(model, data, terms, ...) \method{get_cumu_coef}{aalen}(model, data = NULL, terms, ci = TRUE, ...) \method{get_cumu_coef}{cox.aalen}(model, data = NULL, terms, ci = TRUE, ...) } \arguments{ \item{model}{Object from which to extract cumulative coefficients.} \item{data}{Additional data if necessary.} \item{terms}{A character vector of variables for which the cumulative coefficient should be calculated.} \item{...}{Further arguments passed to methods.} \item{ci}{Logical. Indicates if confidence intervals should be returned as well.} } \description{ These functions are designed to extract (or mimic) the cumulative coefficients usually used in additive hazards models (Aalen model) to depict (time-varying) covariate effects. For PAMMs, these are the differences between the cumulative hazard rates where all covariates except one have the identical values. For a numeric covariate of interest, this calculates \eqn{\Lambda(t|x+1) - \Lambda(t|x)}. For non-numeric covariates the cumulative hazard of the reference level is subtracted from the cumulative hazards evaluated at all non reference levels. Standard errors are calculated using the delta method. } pammtools/man/add_surv_prob.Rd0000644000176200001440000000453614222504522016166 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/add-functions.R \name{add_surv_prob} \alias{add_surv_prob} \title{Add survival probability estimates} \usage{ add_surv_prob( newdata, object, ci = TRUE, se_mult = 2, overwrite = FALSE, time_var = NULL, interval_length = "intlen", ... ) } \arguments{ \item{newdata}{ A data frame or list containing the values of the model covariates at which predictions are required. If this is not provided then predictions corresponding to the original data are returned. If \code{newdata} is provided then it should contain all the variables needed for prediction: a warning is generated if not. See details for use with \code{link{linear.functional.terms}}. } \item{object}{ a fitted \code{gam} object as produced by \code{gam()}. } \item{ci}{\code{logical}. Indicates if confidence intervals should be calculated. Defaults to \code{TRUE}.} \item{se_mult}{Factor by which standard errors are multiplied for calculating the confidence intervals.} \item{overwrite}{Should hazard columns be overwritten if already present in the data set? Defaults to \code{FALSE}. If \code{TRUE}, columns with names \code{c("hazard", "se", "lower", "upper")} will be overwritten.} \item{time_var}{Name of the variable used for the baseline hazard. If not given, defaults to \code{"tend"} for \code{\link[mgcv]{gam}} fits, else \code{"interval"}. The latter is assumed to be a factor, the former numeric.} \item{interval_length}{The variable in newdata containing the interval lengths. Can be either bare unquoted variable name or character. Defaults to \code{"intlen"}.} \item{...}{Further arguments passed to \code{\link[mgcv]{predict.gam}} and \code{\link{get_hazard}}} } \description{ Given suitable data (i.e. data with all columns used for estimation of the model), this functions adds a column \code{surv_prob} containing survival probabilities for the specified covariate and follow-up information (and CIs \code{surv_lower}, \code{surv_upper} if \code{ci=TRUE}). } \examples{ ped <- tumor[1:50,] \%>\% as_ped(Surv(days, status)~ age) pam <- mgcv::gam(ped_status ~ s(tend)+age, data=ped, family=poisson(), offset=offset) ped_info(ped) \%>\% add_surv_prob(pam, ci=TRUE) } \seealso{ \code{\link[mgcv]{predict.gam}}, \code{\link[pammtools]{add_surv_prob}} } pammtools/man/gg_partial.Rd0000644000176200001440000000353114222504522015440 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/viz-elra.R \name{gg_partial} \alias{gg_partial} \alias{gg_partial_ll} \alias{get_partial_ll} \title{Visualize effect estimates for specific covariate combinations} \usage{ gg_partial(data, model, term, ..., reference = NULL, ci = TRUE) gg_partial_ll( data, model, term, ..., reference = NULL, ci = FALSE, time_var = "tend" ) get_partial_ll( data, model, term, ..., reference = NULL, ci = FALSE, time_var = "tend" ) } \arguments{ \item{data}{Data used to fit the \code{model}.} \item{model}{A suitable model object which will be used to estimate the partial effect of \code{term}.} \item{term}{A character string indicating the model term for which partial effects should be plotted.} \item{...}{Covariate specifications (expressions) that will be evaluated by looking for variables in \code{x}. Must be of the form \code{z = f(z)} where \code{z} is a variable in the data set and \code{f} a known function that can be usefully applied to \code{z}. Note that this is also necessary for single value specifications (e.g. \code{age = c(50)}). For data in PED (piece-wise exponential data) format, one can also specify the time argument, but see "Details" an "Examples" below.} \item{reference}{If specified, should be a list with covariate value pairs, e.g. \code{list(x1 = 1, x2=50)}. The calculated partial effect will be relative to an observation specified in \code{reference}.} \item{ci}{Logical. Indicates if confidence intervals for the \code{term} of interest should be calculated/plotted. Defaults to \code{TRUE}.} \item{time_var}{The name of the variable that was used in \code{model} to represent follow-up time.} } \description{ Depending on the plot function and input, creates either a 1-dimensional slices, bivariate surface or (1D) cumulative effect. } pammtools/man/sim_pexp.Rd0000644000176200001440000000556614767026617015207 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sim-pexp.R \name{sim_pexp} \alias{sim_pexp} \title{Simulate survival times from the piece-wise exponential distribution} \usage{ sim_pexp(formula, data, cut) } \arguments{ \item{formula}{An extended formula that specifies the linear predictor. If you want to include a smooth baseline or time-varying effects, use \code{t} within your formula as if it was a covariate in the data, although it is not and should not be included in the \code{data} provided to \code{sim_pexp}. See examples below.} \item{data}{A data set with variables specified in \code{formula}.} \item{cut}{A sequence of time-points starting with 0.} } \description{ Simulate survival times from the piece-wise exponential distribution } \examples{ library(survival) library(dplyr) library(pammtools) # set number of observations/subjects n <- 250 # create data set with variables which will affect the hazard rate. df <- cbind.data.frame(x1 = runif (n, -3, 3), x2 = runif (n, 0, 6)) \%>\% as_tibble() # the formula which specifies how covariates affet the hazard rate f0 <- function(t) { dgamma(t, 8, 2) *6 } form <- ~ -3.5 + f0(t) -0.5*x1 + sqrt(x2) set.seed(24032018) sim_df <- sim_pexp(form, df, 1:10) head(sim_df) plot(survfit(Surv(time, status)~1, data = sim_df )) # for control, estimate with Cox PH mod <- coxph(Surv(time, status) ~ x1 + pspline(x2), data=sim_df) coef(mod)[1] layout(matrix(1:2, nrow=1)) termplot(mod, se = TRUE) # and using PAMs layout(1) ped <- sim_df \%>\% as_ped(Surv(time, status)~., max_time=10) library(mgcv) pam <- gam(ped_status ~ s(tend) + x1 + s(x2), data=ped, family=poisson, offset=offset) coef(pam)[2] plot(pam, page=1) \dontrun{ # Example 2: Functional covariates/cumulative coefficients # function to generate one exposure profile, tz is a vector of time points # at which TDC z was observed rng_z = function(nz) { as.numeric(arima.sim(n = nz, list(ar = c(.8, -.6)))) } # two different exposure times for two different exposures tz1 <- 1:10 tz2 <- -5:5 # generate exposures and add to data set df <- df \%>\% add_tdc(tz1, rng_z) \%>\% add_tdc(tz2, rng_z) df # define tri-variate function of time, exposure time and exposure z ft <- function(t, tmax) { -1*cos(t/tmax*pi) } fdnorm <- function(x) (dnorm(x,1.5,2)+1.5*dnorm(x,7.5,1)) wpeak2 <- function(lag) 15*dnorm(lag,8,10) wdnorm <- function(lag) 5*(dnorm(lag,4,6)+dnorm(lag,25,4)) f_xyz1 <- function(t, tz, z) { ft(t, tmax=10) * 0.8*fdnorm(z)* wpeak2(t - tz) } f_xyz2 <- function(t, tz, z) { wdnorm(t-tz) * z } # define lag-lead window function ll_fun <- function(t, tz) {t >= tz} ll_fun2 <- function(t, tz) {t - 2 >= tz} # simulate data with cumulative effect sim_df <- sim_pexp( formula = ~ -3.5 + f0(t) -0.5*x1 + sqrt(x2)| fcumu(t, tz1, z.tz1, f_xyz=f_xyz1, ll_fun=ll_fun) + fcumu(t, tz2, z.tz2, f_xyz=f_xyz2, ll_fun=ll_fun2), data = df, cut = 0:10) } } pammtools/man/add_tdc.Rd0000644000176200001440000000203314222504522014705 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sim-pexp.R \name{add_tdc} \alias{add_tdc} \title{Add time-dependent covariate to a data set} \usage{ add_tdc(data, tz, rng_fun, ...) } \arguments{ \item{data}{A data set with variables specified in \code{formula}.} \item{tz}{A numeric vector of exposure times (relative to the beginning of the follow-up time \code{t})} \item{rng_fun}{A random number generating function that creates the time-dependent covariates at time points \code{tz}. First argument of the function should be \code{n}, the number of random numbers to generate. Within \code{add_tdc}, \code{n} will be set to \code{length(tz)}.} \item{...}{Currently not used.} } \description{ Given a data set in standard format (with one row per subject/observation), this function adds a column with the specified exposure time points and a column with respective exposures, created from \code{rng_fun}. This function should usually only be used to create data sets passed to \code{\link[pammtools]{sim_pexp}}. } pammtools/man/gg_fixed.Rd0000644000176200001440000000140414222504522015100 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/convenience-plots.R \name{gg_fixed} \alias{gg_fixed} \title{Forrest plot of fixed coefficients} \usage{ gg_fixed(x, intercept = FALSE, ...) } \arguments{ \item{x}{A model object.} \item{intercept}{Logical, indicating whether intercept term should be included. Defaults to \code{FALSE}.} \item{...}{Currently not used.} } \description{ Given a model object, returns a data frame with columns \code{variable}, \code{coef} (coefficient), \code{ci_lower} (lower 95\\% CI) and \code{ci_upper} (upper 95\\% CI). } \examples{ g <- mgcv::gam(Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width + Species, data=iris) gg_fixed(g, intercept=TRUE) gg_fixed(g) } \seealso{ \code{\link{tidy_fixed}} } pammtools/man/get_sim_ci.Rd0000644000176200001440000000052414222504522015430 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/add-functions.R \name{get_sim_ci} \alias{get_sim_ci} \title{Calculate simulation based confidence intervals} \usage{ get_sim_ci(newdata, object, alpha = 0.05, nsim = 100L, ...) } \description{ Calculate simulation based confidence intervals } \keyword{internal} pammtools/man/add_trans_ci.Rd0000644000176200001440000000053614767027042015756 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/add-functions.R \name{add_trans_ci} \alias{add_trans_ci} \title{Add transition probabilities confidence intervals} \usage{ add_trans_ci(newdata, object, nsim = 100L, alpha = 0.05, ...) } \description{ Add transition probabilities confidence intervals } \keyword{internal} pammtools/man/has_tdc.Rd0000644000176200001440000000121014222504522014724 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tdc-utils.R \name{has_tdc} \alias{has_tdc} \title{Checks if data contains timd-dependent covariates} \usage{ has_tdc(data, id_var) } \arguments{ \item{data}{A data frame (potentially) containing time-dependent covariates.} \item{id_var}{A character indicating the grouping variable. For each covariate it will be checked if their values change within a group specified by \code{id_var}.} } \value{ Logical. \code{TRUE} if data contains time-dependent covariates, else \code{FALSE}. } \description{ Checks if data contains timd-dependent covariates } \keyword{internal} pammtools/man/pamm.Rd0000644000176200001440000000436014222504522014262 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pammfit.R \name{pamm} \alias{pamm} \alias{is.pamm} \alias{print.pamm} \alias{summary.pamm} \alias{plot.pamm} \title{Fit a piece-wise exponential additive model} \usage{ pamm(formula, data = list(), ..., trafo_args = NULL, engine = "gam") is.pamm(x) \method{print}{pamm}(x, ...) \method{summary}{pamm}(object, ...) \method{plot}{pamm}(x, ...) } \arguments{ \item{formula}{ A GAM formula, or a list of formulae (see \code{\link[mgcv]{formula.gam}} and also \code{\link[mgcv]{gam.models}}). These are exactly like the formula for a GLM except that smooth terms, \code{\link[mgcv]{s}}, \code{\link[mgcv]{te}}, \code{\link[mgcv]{ti}} and \code{\link[mgcv]{t2}}, can be added to the right hand side to specify that the linear predictor depends on smooth functions of predictors (or linear functionals of these). } \item{data}{ A data frame or list containing the model response variable and covariates required by the formula. By default the variables are taken from \code{environment(formula)}: typically the environment from which \code{gam} is called.} \item{...}{Further arguments passed to \code{engine}.} \item{trafo_args}{A named list. If data is not in PED format, \code{as_ped} will be called internally with arguments provided in \code{trafo_args}.} \item{engine}{Character name of the function that will be called to fit the model. The intended entries are either \code{"gam"} or \code{"bam"} (both from package \code{mgcv}).} \item{x}{Any R object.} \item{object}{An object of class \code{pamm} as returned by \code{\link{pamm}}.} } \description{ A thin wrapper around \code{\link[mgcv]{gam}}, however, some arguments are prespecified: \code{family=poisson()} and \code{offset=data$offset}. These two can not be overwritten. In many cases it will also be advisable to set \code{method="REML"}. } \examples{ ped <- tumor[1:100, ] \%>\% as_ped(Surv(days, status) ~ complications, cut = seq(0, 3000, by = 50)) pam <- pamm(ped_status ~ s(tend) + complications, data = ped) summary(pam) ## Alternatively pamm( ped_status ~ s(tend) + complications, data = tumor[1:100, ], trafo_args = list(formula = Surv(days, status)~complications)) } \seealso{ \code{\link[mgcv]{gam}} } \keyword{internal} pammtools/man/get_cif.Rd0000644000176200001440000000064714767027042014747 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/add-functions.R \name{get_cif} \alias{get_cif} \alias{get_cif.default} \title{Calculate CIF for one cause} \usage{ get_cif(newdata, object, ...) \method{get_cif}{default}( newdata, object, ci, time_var, alpha, nsim, cause_var, coefs, V, sim_coef_mat, ... ) } \description{ Calculate CIF for one cause } \keyword{internal} pammtools/man/get_intervals.Rd0000644000176200001440000000266414222504522016203 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/interval-information.R \name{get_intervals} \alias{get_intervals} \alias{get_intervals.default} \title{Information on intervals in which times fall} \usage{ get_intervals(x, times, ...) \method{get_intervals}{default}(x, times, left.open = TRUE, rightmost.closed = TRUE, ...) } \arguments{ \item{x}{An object from which interval information can be obtained, see \code{\link{int_info}}.} \item{times}{A vector of times for which corresponding interval information should be returned.} \item{...}{Further arguments passed to \code{\link[base]{findInterval}}.} \item{left.open}{logical; if true all the intervals are open at left and closed at right; in the formulas below, \eqn{\le} should be swapped with \eqn{<} (and \eqn{>} with \eqn{\ge}), and \code{rightmost.closed} means \sQuote{leftmost is closed}. This may be useful, e.g., in survival analysis computations.} \item{rightmost.closed}{logical; if true, the rightmost interval, \code{vec[N-1] .. vec[N]} is treated as \emph{closed}, see below.} } \value{ A \code{data.frame} containing information on intervals in which values of \code{times} fall. } \description{ Information on intervals in which times fall } \examples{ set.seed(111018) brks <- c(0, 4.5, 5, 10, 30) int_info(brks) x <- runif (3, 0, 30) x get_intervals(brks, x) } \seealso{ \code{\link[base]{findInterval}} \code{\link{int_info}} } pammtools/man/tidy_smooth.Rd0000644000176200001440000000102613662013606015673 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tidiers.R \name{tidy_re} \alias{tidy_re} \title{Extract random effects in tidy data format.} \usage{ tidy_re(x, keep = c("fit", "main", "xlab", "ylab"), ...) } \arguments{ \item{x}{ a fitted \code{gam} object as produced by \code{gam()}.} \item{keep}{A vector of variables to keep.} \item{...}{Further arguments passed to \code{\link[mgcv]{plot.gam}}} } \description{ Extract random effects in tidy data format. } \seealso{ \code{\link[stats]{qqline}} } pammtools/man/elra_matrix.Rd0000644000176200001440000000153013662013606015640 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-specials.R \name{make_time_mat} \alias{make_time_mat} \alias{make_latency_mat} \alias{make_lag_lead_mat} \alias{make_z_mat} \title{Create matrix components for cumulative effects} \usage{ make_time_mat(data, nz) make_latency_mat(data, tz) make_lag_lead_mat(data, tz, ll_fun = function(t, tz) t >= tz) make_z_mat(data, z_var, nz, ...) } \arguments{ \item{data}{A data set (or similar) from which meta information on cut-points, interval-specific time, covariates etc. can be obtained.} \item{z_var}{Which should be transformed into functional covariate format suitable to fit cumulative effects in \code{mgcv::gam}.} } \description{ These functions are called internally by \code{\link{get_cumulative}} and should usually not be called directly. } \keyword{internal} pammtools/man/nest_tdc.Rd0000644000176200001440000000200614767027042015141 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/nest-utils.R \name{nest_tdc} \alias{nest_tdc} \alias{nest_tdc.default} \alias{nest_tdc.list} \title{Create nested data frame from data with time-dependent covariates} \usage{ nest_tdc(data, formula, ...) \method{nest_tdc}{default}(data, formula, ...) \method{nest_tdc}{list}(data, formula, ...) } \arguments{ \item{data}{A suitable data structure (e.g. unnested data frame with concurrent TDCs or a list where each element is a data frame, potentially containing TDCs as specified in the RHS of \code{formula}). Only TDCs present in \code{formula} will be returned.} \item{formula}{A two sided formula with a two part RHS, where the second part indicates the structure of the TDC structure.} \item{...}{Further arguments passed to methods.} } \description{ Provides methods to nest data with time-dependent covariates (TDCs). A \code{formula} must be provided where the right hand side (RHS) contains the structure of the TDCs } \keyword{internal} pammtools/man/as_ped.Rd0000644000176200001440000001006314767026617014602 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/as-ped.R \name{as_ped} \alias{as_ped} \alias{as_ped.data.frame} \alias{as_ped.nested_fdf} \alias{as_ped.list} \alias{is.ped} \alias{as_ped.ped} \alias{as_ped.pamm} \alias{as_ped_multistate} \title{Transform data to Piece-wise Exponential Data (PED)} \usage{ as_ped(data, ...) \method{as_ped}{data.frame}( data, formula, cut = NULL, max_time = NULL, tdc_specials = c("concurrent", "cumulative"), censor_code = 0L, transition = character(), timescale = c("gap", "calendar"), min_events = 1L, ... ) \method{as_ped}{nested_fdf}(data, formula, ...) \method{as_ped}{list}( data, formula, tdc_specials = c("concurrent", "cumulative"), censor_code = 0L, ... ) is.ped(x) \method{as_ped}{ped}(data, newdata, ...) \method{as_ped}{pamm}(data, newdata, ...) as_ped_multistate( data, formula, cut = NULL, max_time = NULL, tdc_specials = c("concurrent", "cumulative"), censor_code = 0L, transition = character(), timescale = c("gap", "calendar"), min_events = 1L, ... ) } \arguments{ \item{data}{Either an object inheriting from data frame or in case of time-dependent covariates a list of data frames (of length 2), where the first data frame contains the time-to-event information and static covariates while the second (and potentially further data frames) contain information on time-dependent covariates and the times at which they have been observed.} \item{...}{Further arguments passed to the \code{data.frame} method and eventually to \code{\link[survival]{survSplit}}} \item{formula}{A two sided formula with a \code{\link[survival]{Surv}} object on the left-hand-side and covariate specification on the right-hand-side (RHS). The RHS can be an extended formula, which specifies how TDCs should be transformed using specials \code{concurrent} and \code{cumulative}. The left hand-side can be in start-stop-notation. This, however, is only used to create left-truncated data and does not support the full functionality.} \item{cut}{Split points, used to partition the follow up into intervals. If unspecified, all unique event times will be used.} \item{max_time}{If \code{cut} is unspecified, this will be the last possible event time. All event times after \code{max_time} will be administratively censored at \code{max_time}.} \item{tdc_specials}{A character vector. Names of potential specials in \code{formula} for concurrent and or cumulative effects.} \item{censor_code}{Specifies the value of the status variable that indicates censoring. Often this will be \code{0}, which is the default.} \item{x}{any R object.} \item{newdata}{A new data set (\code{data.frame}) that contains the same variables that were used to create the PED object (\code{data}).} } \value{ A data frame class \code{ped} in piece-wise exponential data format. } \description{ This is the general data transformation function provided by the \code{pammtools} package. Two main applications must be distinguished: \enumerate{ \item Transformation of standard time-to-event data. \item Transformation of left-truncated time-to-event data. \item Transformation of time-to-event data with time-dependent covariates (TDC). } For the latter, the type of effect one wants to estimate is also important for the data transformation step. In any case, the data transformation is specified by a two sided formula. In case of TDCs, the right-hand-side of the formula can contain formula specials \code{concurrent} and \code{cumulative}. See the \href{https://adibender.github.io/pammtools//articles/data-transformation.html}{data-transformation} vignette for details. } \examples{ tumor[1:3, ] tumor[1:3, ] \%>\% as_ped(Surv(days, status)~ age + sex, cut = c(0, 500, 1000)) tumor[1:3, ] \%>\% as_ped(Surv(days, status)~ age + sex) \dontrun{ data("cgd", package = "frailtyHL") cgd2 <- cgd \%>\% select(id, tstart, tstop, enum, status, age) \%>\% filter(enum \%in\% c(1:2)) ped_re <- as_ped_multistate( formula = Surv(tstart, tstop, status) ~ age + enum, data = cgd2, transition = "enum", timescale = "calendar") } } \keyword{internal} pammtools/man/pammtools.Rd0000644000176200001440000000765114767232143015364 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pammtools.R \docType{package} \name{pammtools} \alias{pammtools-package} \alias{pammtools} \title{pammtools: Piece-wise exponential Additive Mixed Modeling tools.} \description{ \code{pammtools} provides functions and utilities that facilitate fitting Piece-wise Exponential Additive Mixed Models (PAMMs), including data transformation and other convenience functions for pre- and post-processing as well as plotting. } \details{ The best way to get an overview of the functionality provided and how to fit PAMMs is to view the vignettes available at \url{https://adibender.github.io/pammtools/articles/}. A summary of the vignettes' content is given below: \itemize{ \item \href{https://adibender.github.io/pammtools/articles/basics.html}{basics}: Introduction to PAMMs and basic modeling. \item \href{https://adibender.github.io/pammtools/articles/baseline.html}{baseline}: Shows how to estimate and visualize baseline model (without covariates) and comparison to respective Cox-PH model. \item \href{https://adibender.github.io/pammtools/articles/convenience.html}{convenience}: Convenience functions for post-processing and plotting PAMMs. \item \href{https://adibender.github.io/pammtools/articles/data-transformation.html}{data-transformation}: Transforming data into a format suitable to fit PAMMs. \item \href{https://adibender.github.io/pammtools/articles/frailty.html}{frailty}: Specifying "frailty" terms, i.e., random effects for PAMMs. \item \href{https://adibender.github.io/pammtools/articles/splines.html}{splines}: Specifying spline smooth terms for PAMMs. \item \href{https://adibender.github.io/pammtools/articles/strata.html}{strata}: Specifying stratified models in which each level of a grouping variable has a different baseline hazard. \item \href{https://adibender.github.io/pammtools/articles/tdcovar.html}{tdcovar}: Dealing with time-dependent covariates. \item \href{https://adibender.github.io/pammtools/articles/tveffects.html}{tveffects}: Specifying time-varying effects. \item \href{https://adibender.github.io/pammtools/articles/left-truncation.html}{left-truncation}: Estimation for left-truncated data. \item \href{https://adibender.github.io/pammtools/articles/competing-risks.html}{competing-risks}: Competing risks analysis. } } \references{ Bender, Andreas, Andreas Groll, and Fabian Scheipl. 2018. “A Generalized Additive Model Approach to Time-to-Event Analysis†Statistical Modelling, February. https://doi.org/10.1177/1471082X17748083. Bender, Andreas, Fabian Scheipl, Wolfgang Hartl, Andrew G. Day, and Helmut Küchenhoff. 2019. “Penalized Estimation of Complex, Non-Linear Exposure-Lag-Response Associations.†Biostatistics 20 (2): 315–31. https://doi.org/10.1093/biostatistics/kxy003. Bender, Andreas, and Fabian Scheipl. 2018. “pammtools: Piece-Wise Exponential Additive Mixed Modeling Tools.†ArXiv:1806.01042 Stat, June. https://arxiv.org/abs/1806.01042. Ramjith J, Bender A, Roes KCB, Jonker MA. Recurrent events analysis with piece-wise exponential additive mixed models. 2022. Statistical Modelling., 2022 } \seealso{ Useful links: \itemize{ \item \url{https://adibender.github.io/pammtools/} \item Report bugs at \url{https://github.com/adibender/pammtools/issues} } } \author{ \strong{Maintainer}: Andreas Bender \email{andreas.bender@stat.uni-muenchen.de} (\href{https://orcid.org/0000-0001-5628-8611}{ORCID}) Authors: \itemize{ \item Fabian Scheipl \email{fabian.scheipl@stat.uni-muenchen.de} (\href{https://orcid.org/0000-0001-8172-3603}{ORCID}) \item Johannes Piller \email{johannes.piller@lmu.de} (\href{https://orcid.org/0009-0008-3010-9556}{ORCID}) \item Philipp Kopper \email{philipp.kopper@stat.uni-muenchen.de} (\href{https://orcid.org/0000-0002-5037-7135}{ORCID}) } Other contributors: \itemize{ \item Lukas Burk \email{burk@leibniz-bips.de} (\href{https://orcid.org/0000-0001-7528-3795}{ORCID}) [contributor] } } \keyword{internal} pammtools/man/tumor.Rd0000644000176200001440000000172014222504522014473 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/data.R \docType{data} \name{tumor} \alias{tumor} \title{Stomach area tumor data} \format{ An object of class \code{tbl_df} (inherits from \code{tbl}, \code{data.frame}) with 776 rows and 9 columns. } \usage{ tumor } \description{ Information on patients treated for a cancer disease located in the stomach area. The data set includes: \describe{ \item{days}{Time from operation until death in days.} \item{status}{Event indicator (0 = censored, 1 = death).} \item{age}{The subject's age.} \item{sex}{The subject's sex (male/female).} \item{charlson_score}{Charlson comorbidity score, 1-6.} \item{transfusion}{Has subject received transfusions (no/yes).} \item{complications}{Did major complications occur during operation (no/yes).} \item{metastases}{Did the tumor develop metastases? (no/yes).} \item{resection}{Was the operation accompanied by a major resection (no/yes).} } } \keyword{datasets} pammtools/man/get_laglead.Rd0000644000176200001440000000211014222504522015547 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/lag-lead-utils.R \name{get_laglead} \alias{get_laglead} \alias{get_laglead.default} \alias{get_laglead.data.frame} \title{Construct or extract data that represents a lag-lead window} \usage{ get_laglead(x, ...) \method{get_laglead}{default}(x, tz, ll_fun, ...) \method{get_laglead}{data.frame}(x, ...) } \arguments{ \item{x}{Either a numeric vector of follow-up cut points or a suitable object.} \item{...}{Further arguments passed to methods.} \item{tz}{A vector of exposure times} \item{ll_fun}{Function that specifies how the lag-lead matrix should be constructed. First argument is the follow up time second argument is the time of exposure.} } \description{ Constructs lag-lead window data set from raw inputs or from data objects with suitable information stored in attributes, e.g., objects created by \code{\link{as_ped}}. } \examples{ get_laglead(0:10, tz=-5:5, ll_fun=function(t, tz) { t >= tz + 2 & t <= tz + 2 + 3}) gg_laglead(0:10, tz=-5:5, ll_fun=function(t, tz) { t >= tz + 2 & t <= tz + 2 + 3}) } pammtools/man/get_tdc_vars.Rd0000644000176200001440000000073514222504522015776 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-utils.R \name{get_tdc_vars} \alias{get_tdc_vars} \title{Extract variables from the left-hand-side of a formula} \usage{ get_tdc_vars(formula, specials = "cumulative", data = NULL) } \arguments{ \item{formula}{A \code{\link{formula}} object.} } \description{ Extract variables from the left-hand-side of a formula Extract variables from the right-hand side of a formula } \keyword{internal} pammtools/man/make_X.scam.Rd0000644000176200001440000000077314767027042015475 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/add-functions.R \name{make_X.scam} \alias{make_X.scam} \title{Create design matrix from a suitable object} \usage{ \method{make_X}{scam}(object, newdata, ...) } \arguments{ \item{object}{A suitable object from which a design matrix can be generated. Often a model object.} \item{newdata}{A data frame from which design matrix will be constructed} } \description{ Create design matrix from a suitable object } \keyword{internal} pammtools/man/split_data_multistate.Rd0000644000176200001440000000435114455720102017731 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/split-data.R \name{split_data_multistate} \alias{split_data_multistate} \title{Split data to obtain recurrent event data in PED format} \usage{ split_data_multistate( formula, data, transition = character(), cut = NULL, max_time = NULL, event = 1L, min_events = 1L, timescale = c("gap", "calendar"), ... ) } \arguments{ \item{formula}{A two sided formula with a \code{\link[survival]{Surv}} object on the left-hand-side and covariate specification on the right-hand-side (RHS). The RHS can be an extended formula, which specifies how TDCs should be transformed using specials \code{concurrent} and \code{cumulative}. The left hand-side can be in start-stop-notation. This, however, is only used to create left-truncated data and does not support the full functionality.} \item{data}{Either an object inheriting from data frame or in case of time-dependent covariates a list of data frames (of length 2), where the first data frame contains the time-to-event information and static covariates while the second (and potentially further data frames) contain information on time-dependent covariates and the times at which they have been observed.} \item{transition}{A character indicating the column in data that indicates the event/episode number for recurrent events.} \item{cut}{Split points, used to partition the follow up into intervals. If unspecified, all unique event times will be used.} \item{max_time}{If \code{cut} is unspecified, this will be the last possible event time. All event times after \code{max_time} will be administratively censored at \code{max_time}.} \item{event}{The value that encodes the occurrence of an event in the data set.} \item{min_events}{Minimum number of events for each event number.} \item{timescale}{Defines the timescale for the recurrent event data transformation. Defaults to \code{"gaptime"}.} \item{...}{Further arguments passed to the \code{data.frame} method and eventually to \code{\link[survival]{survSplit}}} } \description{ Currently, the input data must be in start-stop notation for each spell and contain a colum that indicates the spell (event number). } \seealso{ \code{\link[survival]{survSplit}} } \keyword{internal} pammtools/man/get_tdc_form.Rd0000644000176200001440000000101414222504522015755 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-utils.R \name{get_tdc_form} \alias{get_tdc_form} \title{Extract variables from the left-hand-side of a formula} \usage{ get_tdc_form( formula, data = NULL, tdc_specials = c("concurrent", "cumulative"), invert = FALSE ) } \arguments{ \item{formula}{A \code{\link{formula}} object.} } \description{ Extract variables from the left-hand-side of a formula Extract variables from the right-hand side of a formula } \keyword{internal} pammtools/man/newdata.Rd0000644000176200001440000000710714767027042014770 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/make-newdata.R \name{make_newdata} \alias{make_newdata} \alias{make_newdata.default} \alias{make_newdata.ped} \alias{make_newdata.fped} \title{Construct a data frame suitable for prediction} \usage{ make_newdata(x, ...) \method{make_newdata}{default}(x, ...) \method{make_newdata}{ped}(x, ...) \method{make_newdata}{fped}(x, ...) } \arguments{ \item{x}{A data frame (or object that inherits from \code{data.frame}).} \item{...}{Covariate specifications (expressions) that will be evaluated by looking for variables in \code{x}. Must be of the form \code{z = f(z)} where \code{z} is a variable in the data set and \code{f} a known function that can be usefully applied to \code{z}. Note that this is also necessary for single value specifications (e.g. \code{age = c(50)}). For data in PED (piece-wise exponential data) format, one can also specify the time argument, but see "Details" an "Examples" below.} } \description{ This functions provides a flexible interface to create a data set that can be plugged in as \code{newdata} argument to a suitable \code{predict} function (or similar). The function is particularly useful in combination with one of the \code{add_*} functions, e.g., \code{\link[pammtools]{add_term}}, \code{\link[pammtools]{add_hazard}}, etc. } \details{ Depending on the type of variables in \code{x}, mean or modus values will be used for variables not specified in ellipsis (see also \code{\link[pammtools]{sample_info}}). If \code{x} is an object that inherits from class \code{ped}, useful data set completion will be attempted depending on variables specified in ellipsis. This is especially useful, when creating a data set with different time points, e.g. to calculate survival probabilities over time (\code{\link[pammtools]{add_surv_prob}}) or to calculate a time-varying covariate effects (\code{\link[pammtools]{add_term}}). To do so, the time variable has to be specified in \code{...}, e.g., \code{tend = seq_range(tend, 20)}. The problem with this specification is that not all values produced by \code{seq_range(tend, 20)} will be actual values of \code{tend} used at the stage of estimation (and in general, it will often be tedious to specify exact \code{tend} values). \code{make_newdata} therefore finds the correct interval and sets \code{tend} to the respective interval endpoint. For example, if the intervals of the PED object are \eqn{(0,1], (1,2]} then \code{tend = 1.5} will be set to \code{2} and the remaining time-varying information (e.g. offset) completed accordingly. See examples below. } \examples{ # General functionality tumor \%>\% make_newdata() tumor \%>\% make_newdata(age=c(50)) tumor \%>\% make_newdata(days=seq_range(days, 3), age=c(50, 55)) tumor \%>\% make_newdata(days=seq_range(days, 3), status=unique(status), age=c(50, 55)) # mean/modus values of unspecified variables are calculated over whole data tumor \%>\% make_newdata(sex=unique(sex)) tumor \%>\% group_by(sex) \%>\% make_newdata() # Examples for PED data ped <- tumor \%>\% slice(1:3) \%>\% as_ped(Surv(days, status)~., cut = c(0, 500, 1000)) ped \%>\% make_newdata(age=c(50, 55)) # if time information is specified, other time variables will be specified # accordingly and offset calculated correctly ped \%>\% make_newdata(tend = c(1000), age = c(50, 55)) ped \%>\% make_newdata(tend = unique(tend)) ped \%>\% group_by(sex) \%>\% make_newdata(tend = unique(tend)) # tend is set to the end point of respective interval: ped <- tumor \%>\% as_ped(Surv(days, status)~.) seq_range(ped$tend, 3) make_newdata(ped, tend = seq_range(tend, 3)) } pammtools/man/smooth.construct.fdl.smooth.spec.Rd0000644000176200001440000000146414767232143021706 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/penalized-lag-lead.R \name{smooth.construct.fdl.smooth.spec} \alias{smooth.construct.fdl.smooth.spec} \title{New basis for penalized lag selection} \usage{ \method{smooth.construct}{fdl.smooth.spec}(object, data, knots) } \arguments{ \item{object}{An object handled by mgcv} \item{data}{The data set} \item{knots}{A vector of knots} } \description{ Originally proposed in Obermeier et al., 2015, Flexible Distributed Lags for Modelling Earthquake Data, Journal of the Royal Statistical Society: Series C (Applied Statistics), 10.1111/rssc.12077. Here extended in order to penalize lead times in addition to lag times. Ideally the lag-lead window would then be selected in a data-driven fashion. Treat as experimental. } \keyword{internal} pammtools/man/as_ped_cr.Rd0000644000176200001440000000621114455720102015246 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/as-ped.R \name{as_ped_cr} \alias{as_ped_cr} \title{Competing risks trafo} \usage{ as_ped_cr( data, formula, cut = NULL, max_time = NULL, tdc_specials = c("concurrent", "cumulative"), censor_code = 0L, combine = TRUE, ... ) } \arguments{ \item{data}{Either an object inheriting from data frame or in case of time-dependent covariates a list of data frames (of length 2), where the first data frame contains the time-to-event information and static covariates while the second (and potentially further data frames) contain information on time-dependent covariates and the times at which they have been observed.} \item{formula}{A two sided formula with a \code{\link[survival]{Surv}} object on the left-hand-side and covariate specification on the right-hand-side (RHS). The RHS can be an extended formula, which specifies how TDCs should be transformed using specials \code{concurrent} and \code{cumulative}. The left hand-side can be in start-stop-notation. This, however, is only used to create left-truncated data and does not support the full functionality.} \item{cut}{Split points, used to partition the follow up into intervals. If unspecified, all unique event times will be used.} \item{max_time}{If \code{cut} is unspecified, this will be the last possible event time. All event times after \code{max_time} will be administratively censored at \code{max_time}.} \item{tdc_specials}{A character vector. Names of potential specials in \code{formula} for concurrent and or cumulative effects.} \item{censor_code}{Specifies the value of the status variable that indicates censoring. Often this will be \code{0}, which is the default.} \item{...}{Further arguments passed to the \code{data.frame} method and eventually to \code{\link[survival]{survSplit}}} } \value{ A data frame class \code{ped} in piece-wise exponential data format. } \description{ This is the general data transformation function provided by the \code{pammtools} package. Two main applications must be distinguished: \enumerate{ \item Transformation of standard time-to-event data. \item Transformation of left-truncated time-to-event data. \item Transformation of time-to-event data with time-dependent covariates (TDC). } For the latter, the type of effect one wants to estimate is also important for the data transformation step. In any case, the data transformation is specified by a two sided formula. In case of TDCs, the right-hand-side of the formula can contain formula specials \code{concurrent} and \code{cumulative}. See the \href{https://adibender.github.io/pammtools//articles/data-transformation.html}{data-transformation} vignette for details. } \examples{ tumor[1:3, ] tumor[1:3, ] \%>\% as_ped(Surv(days, status)~ age + sex, cut = c(0, 500, 1000)) tumor[1:3, ] \%>\% as_ped(Surv(days, status)~ age + sex) \dontrun{ data("cgd", package = "frailtyHL") cgd2 <- cgd \%>\% select(id, tstart, tstop, enum, status, age) \%>\% filter(enum \%in\% c(1:2)) ped_re <- as_ped_multistate( formula = Surv(tstart, tstop, status) ~ age + enum, data = cgd2, transition = "enum", timescale = "calendar") } } \keyword{internal} pammtools/man/tidiers.Rd0000644000176200001440000000121614222504522014770 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tidiers.R \name{tidy_smooth} \alias{tidy_smooth} \title{Extract 1d smooth objects in tidy data format.} \usage{ tidy_smooth(x, keep = c("x", "fit", "se", "xlab", "ylab"), ci = TRUE, ...) } \arguments{ \item{x}{ a fitted \code{gam} object as produced by \code{gam()}.} \item{keep}{A vector of variables to keep.} \item{ci}{A logical value indicating whether confidence intervals should be calculated and returned. Defaults to \code{TRUE}.} \item{...}{Further arguments passed to \code{\link[mgcv]{plot.gam}}} } \description{ Extract 1d smooth objects in tidy data format. } pammtools/man/figures/0000755000176200001440000000000015031037566014512 5ustar liggesuserspammtools/man/figures/logo.png0000644000176200001440000013655214222504522016164 0ustar liggesusers‰PNG  IHDRX».' pHYs.#.#x¥?v IDATxœìÝyxSUÂ?ðoÒ4mÚ¦¥¥¥+JKÙ©€ì "*0"Š¿WÜaÆ×WeÄqƒAgÄ÷Õ‘:‹èè ( ¨€€€JÙJ)KËZJ tßi›äþþÀdºd¿'û÷ó<<íMNÎM“s¿÷Üsψˆˆˆ~¦$Iòt%ˆÈ³ Å$IzÙÓu!"Ïb0 ` …¢€ºíïØ$6¥§+@Dî§P(.+  C(øy ÓQ€bQ€ù9Ø«Q’¤0WÕ…ˆ¼{ ˆ„B¡ ösB±+êDDÞ‡=D~N¡P4Ј(‹Í‘ÿc‘ŸR(çî! ~. … ª<"ò>ì1 òCN\2pFµ$I]ÜñBDä> D~D¡Pè¹ó5Ù„ù^J ò …¢öç^·†‚Ÿ_Û]=Däì1 òq^vPn•$)ØÓ• "ç±Ç€ÈG‰DäÁvøðáX¶lFŽiú]CCþô§?áÍ7ßÄÕ«W…½›"ßÁ`@äD‚¤¤$¼ôÒK˜9s¦År‹‹‹ñâ‹/â“O>öºZ$Iê´6y"/&2h4<þøãX°`"""ìzή]»0oÞ<=zTX=Øäy7"/¤P(š„ˆ*oÊ”)X±bRSS~®Á`À§Ÿ~ŠE‹¡¬¬LT•ˆ¼ƒ‘—ÙK0dÈ,_¾cÇŽ•]Vuu5V¬XwÞy---j$Iâ(E"/Â`@ä%D‚˜˜,\¸=ö˜È[………X°`6oÞ,¬L6CDÞƒÁ€Èà …@H*ÆÃ?Œ%K– 22RD‘}÷Ýwxæ™gpâÄ ae²9"ò<"ÙKpÓM7áü#úöí+¬L[Z[[ñþûïãøjkk…•Ëf‰Ès ˆ<@d HOOÇË/¿ŒÛo¿]øe{UVVâµ×^Ã_þòèõz!e²i"ò "7ºté‚§Ÿ~>ø ‚ƒƒâ±``tøðaÌŸ??þø£°2ÙD¹ƒ‘›ˆ J¥÷Þ{/^{í5ÄÅÅ¡©© ’$yE00úúë¯ñÌ3ÏàüùóÂÊdSEä D.&²—`„ X¾|9hú7àZ½Þ}÷]¼ñƨ¯¯V.›,"×b0 r‘ %%/¼ðfÍšÕi›·£’’<ÿüóøôÓO…ÔÙl¹ƒ‘ ˆ áááøïÿþo<ýôÓ 5ûoFÀ¼yó°oß>ae²ù"Á€H ‘Ë!ßu×]xõÕWѽ{w«õ•`\;òÉ'xî¹çpùòe¡å‘ Dˆ¼l0lØ0,[¶ £F²ëñ¾ ŒŒË;¯X±ÍÍÍBÊdSF$ƒ‘ "Abb"-Z„ßüæ7P*•v?σÑéÓ§ñâ‹/âóÏ?V&›4"y ˆœ$*¨Õj<ôÐCxá…ì^¹-_F;wîļyóŸŸ/¬L6mDÎa0 rÈ^‚)S¦àü#zöìétþ @§ÓáÃ?ÄK/½„òòr!e²y#rƒ‘D‚ÌÌL,[¶ “&M’]–¿£êêj¼òÊ+xÿý÷¡Óé„”ÉfŽÈ~ Dv ¢££ñì³Ï ]Ùß‚QAA,X€-[¶+“Í‘m DVˆ ÆåŸ{î9DEE )ÓÈ_ƒÑ×_ àÌ™3BÊc“Gdƒ‘¢—C^¾|9úõë'¬Ì¶ü=ÿYÞyéÒ¥¨««R&›>"ó ˆ: 222ðÚk¯aÊ”)Bʳ$‚Ñ¥K—ðÊ+¯àÿø—w&r¢Ÿ‰ QQQxæ™g0wî\„„„)Óš@ F‡Âüùó±{÷nae²)$º†Á€žèå_}õUtëÖMH™öÄ`\;¯[·‹/FQQ‘°2‰ƒ,‘ãÆåË—cРAÂÊ´W £ÆÆF¼÷Þ{B—wf³HŒÁ€’¨PœœŒ_|3gÎ4èÁÀèâÅ‹xá…¸¼3‘L PD¼ÃÂÂðä“OZ]Ù] ÚÛ¿?æÍ›‡ýû÷ )M$ ¢—C~å•WУG!eÊÅ`ЙÁ`À§Ÿ~ŠÅ‹ãÊ•+BÊdSI‚Á€üž¨PpÝu×aùòå=z´òDa0°¬¾¾þ󟹼3‘ Èo‰  X¼x±ÃË!» ƒmÇŽÃÒ¥KñÅ_)Í&ù3ò;¢—C~þùç¡Õj…”é ¶577C¯×cçÎX²d Ž?.¤\6Ÿä ȯˆ S¦LÁòåËÑ«W/!幃mÆ`\[Þù“O>Á+¯¼‚ŠŠ !å³%â}ý¢DNP(BBAŸ>}°~ýz¬]»Ö'B9N¥Rá׿þ5rss1gÎ!aJÔçȰǀ|šèå}ôQ¨T*!eº { lkÛc\›¥Òx›éÉ“'1þ|lݺUÈk±I%_ÇòI¢ÎÐT*fÏžÜÜ\Ì;×çBÉ—™™‰ 6`Íš5Bz‰Ø{@¾ŽÁ€|ލF÷ÆoDNNV®\‰®]» )“|×Ô©SqðàA,[¶LÈ`SòU ä3D5´éééX½z5¾úê+ôïß_@ÍÈ_¨ÕjÌ;‡ÂìÙ³…ÜžÊp@¾†c Èë‰jX#""ðÄOà™gžqËrÈîÂ1¶Yc`ÍÁƒ1þ|äää©›[ò äÕD„O-‡ì. ¶9 €ÿ,ï¼hÑ"\¸pAH}Øì’7ã¥òJ¢. >Û¶mCvv¶_†r=…B3fààÁƒX´h‘E³xy¼ƒyQ 99«V­ÂŽ;0bÄ5£@†Å‹#773gΔ]'’·â¥ò"ɰ°0<öØcX°`"""ÔÊûñR‚mr.%Xòý÷ßcÞ¼yÈËË“[=¼¼@ÞƒÁ€ÃÆѯ_?Ùåq€"yƒ¹…¨nÂÞ½{±|ùr!ÓÖ¹ÂM7Ý„œœ,[¶ ‘‘‘²Ëc8 wb0 —222ðùçŸcãÆÈÌÌP3"× ÆÜ¹s‘ŸŸ/dygö»pŒ¹ŒˆF¬K—.˜7oæÎ‹àà`µò?c`›»ÆX“››‹ùóçã‡~R›nröp"ÎlT*xàìÙ³<ò—C&Ÿ7dÈlÞ¼kÖ¬AÏž=e—ÇÞrö0¢ª &`éÒ¥íV>Ôh4l-`mÞÐcÐVSSÞ}÷]¼ñƨ¯¯—]›q‰=$„ˆƒvïÞ½±zõj|ùå—\™üšF£ÁSO=…ÇcæÌ™²¿?@"1,"¤ððp,Z´ûöíÃŒ3ÕŒÈû%&&";;;wîÄÈ‘#e—Ç€@"0SD4@ …3gÎD^^/^ìÑ®]"O6l¶mÛ†U«V!>>^vy $ƒ9DÔ‰±!ÌÎÎÒù:…BY³f!//OÈòÎì= g1ÝD42IIIXµj•°®S"ŽÅ‹›ÆÈÅ€@Žâ] d“ˆF%44>ú(žzê)›Ë!K’Ôi”µRÉ k‰Á`À÷È_þLýðÃX´hòóóe—ÅæžìÁ`@‰:˸õÖ[ñÚk¯¡GBÊ# 4ƒkÖ¬Á /¼€ŠŠ Ùå±Ù'k È,¡`ðàÁxýõ×1vìX‡žg0 ÓéÚýNÄr¶þªµµ’$A¥RùÌY°»ét:SÏ píóí‹3iVWWã­·ÞÂÿýßÿ¡¥¥EvylþÉjGD ˆ‰‰ÁÂ… ^Y§Óujô8Á‘eœàÈ6o›àH®ÂÂB,X°›7o–]ÔO/€˜J\™È=Ú.*Ö·o_Yeqp"uÄ`@–CÞ³g–/_.d™Y"²Íø½±¼310 AFF>ûì3!g.Dä8.ïL¢1 _ü¨¨(,]ºûöíÃäɓՌˆœƒåË—c×®]ø5‡á p1@©TbæÌ™ÈÍÍÅSO=Å»ˆ¼LVV¶lÙ‚5kÖ 55UVYì=L BÄ—{„ ÈÉÉAvv6âââÔŠˆ\eêÔ©øé§Ÿ°téR›“ŠÙ€X üœˆ/tJJ V­Z…o¾ùT3"r5ãò·¶¼3ù??%r9äÜÜ\Ìš5KP͈ÈÝ’’’;v`Ĉ²Êbïÿc0ðC"Î f̘Ÿ~ú‰Ë!ù‘áÇcûöíB–wf@ð_ ~DÄuèСغu+V¯^îÝ» ªy‹ŽË;‡„„È.ü ƒ±råJìܹ£FT3"òVÆå÷ïß3fÈ*‹½þ…ÁÀÇÉý2ªÕjÌ™3‡ÆìÙ³¹Q€éÝ»7V¯^¯¾ú  U‚àQÀG‰øN™2ÄòåËeßÎDD¾íÆoÄîÝ»ñç?ÿ]»v•U‚oc0ð1"¾p™™™Ø°aÖ®]‹^½z ªù:•J…ßþö·ÈÉÉÁÃ? •J%«<†ßÄ`à#D‚èèh,[¶ û÷ïǤI“ÕŒˆüMtt4^}õUìß¿·Þz«¬²Ø{à{ |€ˆågÏžÜÜ\.‡LDvëÓ§Ö­[‡5kÖ --MVY ¾ƒÁÀ‹‰ø"ÝtÓMÈÉÉÁÊ•+e_7$¢À4uêTøà¬[· X3""ß§V«¹¼³‡1ØIî,<<‹-ÂîÝ»qÇw¬‘ÿILLÄÊ•+±sçNŒ5JVY Ža0°ƒˆåóòò°xñb.‡LD䀡C‡bëÖ­X½z5ºwïît9ì=°ƒr?HÇǶmÛøøx5#" Æub<ˆE‹!44TVY Ö1˜!÷ƒ“””„U«VaÇŽ1b„Àš®ŽË;ËÁp`ƒA"–C~ê©§pèÐ!.‡LDä")))ÈÎÎÆ¦M›0hÐ §Ëaïy ?1ñ°téRY·Ù‘}ÆÝ»wcÕªUˆ‹‹sº„ö>Èý@deeaË–-X»v-RSSÖŒˆˆl1.›‹§žz jµÚé²® Ø` 7ÄÄÄ`Ù²eصkÆŽ+°fDD䨨¨(,]ºûöíÃäÉ“.‡½ D,‡œŸŸ¹sçÊZüƒˆˆÄÊÈÈÀgŸ}&{yç@ äþ¡oºé&ìݻ˗/Gdd¤Àš‘HÆå—-[&«½ÄpÁ@n ÈÈÈÀ矎7"33S`͈ˆÈU‚ƒƒ1wî\äççËZÞ9Ðzü>ÈùcvéÒÅtÍê¶ÛnX+""r—˜˜,_¾ßÿ=Æçt9ü6Èù§11Ê•ˆˆ¼Ã!C°yóf¬Y³={ötº~ äþÁn¸áäää ;;±±±kFDDÞ`êÔ©Bæñ×pà7Á@ÄrÈ«W¯Æ×_ ¬yFcš©væÌ™N?ü±÷À/‚ˆå÷ïß3f¬y»¤¤$dggãÝ7`À¡N—ãOÁ§ƒœ?„B¡h·²œÕºˆˆÈ·õ8ï|ø9ž}åMÄÄÊ›^Ù×ùd0›Ì† Æå‰ˆ¨…BÛ¦Ý÷>ý 3g?µ:Äér|9 ø\0±òÎ;1räHµ"""ªÁÌÙs°òÃÏ1ö¦[.ÇW‚B’$ÉÓ•°‡œ7W£ÑàñÇÇ‚ <¾òaKK t:‚‚‚â\õw:---í~§Ñh|ò æMMM$ !!!œ¢Û‚ææfèõzÓÏJ¥’—-Ðëõhnnpm)ù@°ÿt¹éÿµµµ¶ùi/²ß^†s§ œ~ 9Ô𹉋Ë!‘ƒ‡Ä[ý7æÎQ]¢*×z¼:ÈyY¬]»VÖDDDÌõá¶;þÞýd#î¾o6Tª`§^ÂW9oœq9d¹S_u¡Ä=‰·þú/ éŸÓ+{Õ¹Ë!?üðÃX²d‰W¯|È1¶qŒc8ÆÀ6Ž1°_ 10Ž/°Ö[Б$IÐét®?ø`å2Ÿ?ët¼è0 ÀKz D,‡œ““Ã剈ȭ‰7³ÿ…Ÿ˜°pçÆ±y[ïǃÜå?ûì3lܸýúõX+"" Žô˜¤RaÚÿ»ïÿûkLû¯û|~yg9o@TT”i9äÉ“' ®‘ã"£¢ñð/Ä®]»0vìX§Ëñt8p{0àrÈDDä-äö˜“••…-[¶`Íš5HMMuª Oö¨Üùbrvrüøñxã70hÐ €Á`U-·22‘$Ég÷ÁÕÌ Ä1 OÑÞŽŸ)Çð½2¯í÷Ïßߣg*„ ü“$ÉT–ñ}›û,î½÷^5""¢@·ëè—”;a`÷N¿+--Åþð¬Y³Æéƒ¼»ÂK/%Èé Ñh4˜7oöîÝËP@DD>-11ÿû¿ÿ‹M›6aøðáN•á®Ë . r–C¾ãŽ;°{÷nÌŸ?Ÿ÷ú‘pUUUyÝ¡C‡â«¯¾Â;#¸8ç–wvu@ äT8++ _}õ>øà¤¤¤®‘ç)•JÜ{ï½8pàæÍ›çô@zWac äT.11 .Ä<¥ÒãS+¸”N§ƒÁ`€R©„JåÖ±Ÿ>Ã`0˜f3â(–g‰T©T~ÿýq–ñ{g¤P(ìÜ\÷þ®í÷Ï_¿w8R\çôóÍ ôU*•¦ãàMCz:TÞéÓ§ñòË/cýúõ²ê$Šì#“œ@ V«ñÐCá…^˜• ƒi„=ƒyCpmÞ•`^kk+$IBPP§D¶ ítÈøý³B¯×›¾ƒþúÉ Ñæ‚B¡0•éèû–™™‰?þ;vìÀ¼yópìØ1‡ë$òîY§r—C>xð –/_0¡€ˆˆ<«¼¼ÜÓU°èÆoDNNV®\‰®]»:U†ˆË N9/œ™™‰ 6`íÚµèÕ«—Seù#•J…Ù³g#77sæÌqº×FN8p(È ÑÑÑX¶löïßI“&9U‘³Œ½¹ÄÏv(Ztt4–/_Žýû÷ã–[nqª gÙvgApp°)ýÌ;—×@‰ˆüXyy¹Ww×ûš>}ú`ýúõX³fӽ쎛Á@N/Á-·Ü‚}ûöɺ^BDD¾ÇÛ‚7ÕÅS§NÅðÒK/9=.ÏÞc¹Å` '—C^¿~=úôéãTDDäû¼- ø²ÐÐP<óÌ38|ø0fÍšåÔ1Úžc»Ù`àl ˆŒŒÄË/¿ŒÝ»ws9d""2ñd@ð·`’˜˜ˆU«VaÇŽ1b„SeX J{hMPPxàìÝ»?þ8'!""³<݃à í5|øplß¾ÙÙÙHJJrª sÇ}¥¥ ö7n¶nÝŠ+V 66Ö©2ˆˆ(°¸+ ø[oAG …3gÎÄáÇ1þ|„††:]Ž‘ÒÙ@УG¬^½›7oÆÀ*ƒˆˆ›§{üExx8^xáˆGdd$RRR0hÐ Lž<uuÎ/·KžÁqòDEEaüøñv?Þ?×Ô$¢€¶wïÞv?766¢±±—.]Bkk«‡jErí®q†yd-»LDDänìAp-""òIæ‚¥ÀHåâ¥""òiì=‹=DDDdÂ`@DDD& D.–““ãé*4Ž/p ƒ‘ ­]» .ôt5ˆˆìÆ`@ä"[¶lÁC=½^ïéªÙÁ€È~üñGÌš5‹“é‘Ïa0 ìðáøûî»ÑÔÔäéª9ŒÁ€H ‚‚LŸ>óñy C}}½Å2³²²0gÎÌš5 …ÂâãÎ;‡·Þz Ÿ|ò Ì>F¥RaĈxüñÇ1cÆ çvÀøñãQ\\ŒÚÚZ¿Ýφ†Üu×]8zô¨ÅÇ:táááVËýôSüûßÿƱcÇìº%5** #FŒÀèÑ£që­·âºë®sCMÝ‹—Ñüƒ€å#óÏúö틟~úÉâöÆÆFÄÅÅuú}||<Μ9cúyÿþýxä‘GPPPàP%ƒƒƒ1gÎ<÷Üs sè¹mEGGÛ¬5jÞ}÷]ôéÓÇáç¶´´ ::Úì¶Í›7cܸq¦Ç-Y²ï¾û®C÷ÁO˜0Ÿ|òI§/¼óÎ;xñÅ-?|øpüóŸÿDrr²ÝÏ1²t0ô—ýliiÁÝwßíÛ·ÛýK´Z-.]ºäÐs¶nÝŠE‹!??ß©×ÌÈÈÀÒ¥K1mÚ4§žïÍõ²ÄNž<‰ØØX„††:\ncc#^}õU¬\¹:ÎéúÀÈ‘#…|vDÓëõhnn‡Û[o ®x(IR§¿PP”ÊkWço¾.Í%¯+Ç{g§Ÿ~ڮǺtŒÁåË—ÑØØøè£0iÒ$‡Cp­{ùÏþ3&Nœˆââb§ëãôsÛÚ³gFüãBÊ3:}ú4€k]Ó·ÝvÞyç‡'ÇÙµk¦NÚî¬[’$<ñÄX°¾þAÕ IDAT`÷Ð8p·Ür Î;çÐó¬ñ‡ýÔëõøÍo~#¬a7~OìqõêUÌ;Ó§Owúà ………øå/‰_ÿú×V{i|½^¢\¼xcÆŒÁ[o½%;@BB‚€Z‰çòÁ‡EEEX³f {ì1Ù_¦¼¼üío“]àûûù—¿ü}ô‘ì×jËžÁ­¸ë®»„¼oåååaÚ´i¨­u¼ëÕ[ë%Òüùó…}Ïn»í6¡å‰âÒ1Àµ^{ BBBpß}÷aÚ´iÈÊÊB×®]Q[[‹’’|ûí·øè£püøq«uzýõ×ñûßÿÞVÕÛ©¨¨@ÿþý!I®¿þzŒ;Æ CÏž=‘€°°0£¾¾¥¥¥8|ø06lØ€/¾øÂj¹ÿþûñÞ{ïÙUkc ú÷ï“'Ovz-¥R‰1cÆ oß¾ˆŒŒDii)¶nÝŠ²²2«¯5fÌvz\PPÆŒƒ~ýúA«Õ¢¤¤Ä®òúôéƒC‡Ù±—×XºÎkk?ûô郈ˆ\ºt Û·o·yÝÒÝû™——‡¯¿þºÓï_~ùe‹Ïyæ™g¬^¯íÞ½;fÍšeµ^>ú¨Õ@¢V«q×]waÆŒ8p ©«úÒ¥K8zô(Ö­[‡uëÖ™®›3}útüóŸÿ´Z_¨—È1Äøñã-nW©T˜4iî¸ãŒ9ݺuCtt4QWW‡S§N!??999رcÊÊÊœlêþ2ÆÀ•ùû—ƒŽÆ‡ììltïÞÝâct:^ýu¼þúë{"##QPP­Vk×ë?ÉÉÉÝuôèQüò—¿ÄÙ³gÍnW©T8qâm–e-˜3kÖ,¼ôÒKîÊÐétxíµ×ðúë¯Û]ÜyçX¶lY§Av:¯¾ú*Þxã «Ïß¹s'†n×kÙ‰ßVÛýÔét¦A¢:üã±bÅ »ËÜ»ŸFÖö·¨¨]»vu¨¼¶6oÞlõΉAƒ!;;´ZΉ'ððÃãàÁƒó·¿ý ÷Üsz 2|ðúõëçÖz‰ Ï>û,Þ~ûm³ÛâââðÅ_`ðàÁv•%IöíÛN‡±cÇÚõwc0°Í߃['8š6m¾üòK«¡¸v }î¹ç0þ|‹©­­Å_ÿúW‡ëššêðýÒÄ—_~‰³Ûu:vìØáp]¬Q(xÿý÷±jÕ*³·jªT*,Y²¿ûÝïì.óÉ'ŸÄÇlvä½J¥ÂóÏ?Ç{Ìjß~û­Ý¯g{ösáÂ…˜;w®Ýezã~Êa0°`Á‹Û333±~ýz›_àZÈÿæ›o¬ˆÅ‹Ûu÷Ž­zõíÛ›6mr{½D³öÝ~õÕWíÀµÏûÈ‘#½6n ÈÎΆZ­¶û9K–,±z¯ï‡~(¢jvéÕ«~õ«_Yܾk×.¡¯÷òË/ã¾ûî³ù¸çž{‘‘‘6wã7â•W^±ù¸%K–X=Û:räˆÍ2(û)Ç_|aqÐ[pp0V¯^m×{c5kÖXƒ@ÙO¹~úé'‹g¥™™™Vê-ÉÉÉXJ’„½{÷ú\½\ÁÚ‰—_~YèÜDÞÀ-«–L˜0AÖóGŽiñv([·5ÚëâÅ‹ÈËËCEEª««ÑØØˆ   „„„ ** ±±±V¯I×ÕÕ ©Ç-·ÜâÐ8 àZ÷«5C† q¨¼ž={ZÜ&IêëëºvlN ì§\°¸ÍVŠ=&Mš„ýû÷›Ý¶ÿ~Üyç>U/W¸í¶ÛðÃ?˜ÝVQQo¼ ,ÀÃ? Fã¶z¹Š[‚ܬ):;E²Á`ÀöíÛññÇcÇŽ^1» :ÔáçØº¥ÈÖµ#[·€¶¶¶:Tž9²ŸrY;Û3ÚßkeX{mo­—+<øàƒX±bª««Ín¯®®Æ³Ï>‹·Þz ¿üå/ñ_ÿõ_N}¾‰¼…[.%È]£ÀÚ™]yy¹Ã]¾6lÀ€0}útüûßÿöšP8~Ö ÀæYŠ£s=¸ã¬'PöS® .XÜæÈx KúöíëÔk{k½\!** ÙÙÙ6W|¼rå Þ~ûmŒ?Ä’%KšŒÄàøùÜ œYŬ-kw3 \½zÕ®rêêê0cÆ Ìš5 EEE²êä*΄([Ó8;:I‰;–¼ ”ý”ËÒY*Y&ÙSFUU•ÅmÞZ/W™2e >ýôS»ï¬:{ö,Þ|óMŒ7×_=Þÿ}¯ZŠÈ·Npä,[_F{&=©¨¨ÀäÉ“±yófQÕr O_Óv—@ÙO¹¬™YÒkß­ºº:‹S{k½\iêÔ©8pà¦NêÐóŽ;†ÿùŸÿAïÞ½ñòË/;¼ò'‘»ùD0°Õ#lu»Á`À=÷܃Ç‹¬–KˆhT}A ì§\ÖÎ2E\ ±V†$Ihhhð©z¹Z÷îݱfÍlÛ¶ ·Ýv›i \{Ô××ã7ÞÀرc….cN$šOkŒ¶¢•+WbÏž=V3tèP¼öÚkغu+Î;‡ŠŠ ÔÖÖ¢´´GŽÁæÍ›±råJ‡ëN$‡µÕØØ(»|[g¯–^ß[ëå.£FÂ矎£GbÁ‚ |=yò$n»í6¯ZW€¨-ŸÖ®gFGG[MíÕÕÕøÃþ`q»V«ÅÇŒï¿ÿO<ñF¸¸8„††"((‘‘‘èÝ»7ƇéÓ§ËÚ"GY[pKÄY³µÛlµZ­ÅqÞZ/{XkO•ššŠçŸÇŽæM›0{öl»ÆÏËšŠÌãÀC1|"X›@$%%Åêsÿõ¯Y<ƒ ÂúõëÝzO4‘#¬MªUQQ!»|kg­ÖþÞZ/OQ(?~[š–ðÞzÙKäÚ&–ãÍ7ßÄÍ7ßlñ1–fw$ò$¯'Nœ°:ÓÙ7ÞhõùÖ&/rfõ7"g8{Ýýú믷¸mÛ¶mÎVÇÄÚ«µ×öÖzy…Bßÿþ÷·{Ëb]¾Ž½by}0x÷Ýw-nKIIÁàÁƒ­>ßÚýÎr'^"²—³Þ†nq ÝéÓ§eY½…wäÈ‘>W/{Ø3ï‰HÖfq¬­å¼Wƒ£GâÃ?´¸ý׿þµÍ2¬-ÙìMS!“ï³vÛìùóç*3** ãÆ³¸]Î-´o¿ý¶ÅmC‡µ:°×[ëedí®Q žÙËÚëyjZnºU’½âym0¸zõ*fÏžm1Ýk4Ìž=Ûf9ݺu³¸-''Çéúudm´¼œåÁ­à?þØ©eÏœ9ƒ>øÀâöûï¿_v½ «V«Ñ»woÓm†Ö¦\÷6¢Úî¬è-¡ øÌ] DDDäz DDäÕØ[à^ DDNâ½ÿä ˆˆüœ/ö¸ƒù-_> y ƒQ€sdÅ@êŒïë°·À3 ˆÈ%xÀ$òM Dä2ìð<_}ÿÙ[à9 ä|µñó&®|ýýïãïûG…Á€|eqD½—ü›ì-ð,òim@ì¶Ã_ÞCÙ9ø3 Èg±Ñ“ÏÒ{èŠ÷–/ûCn ¾gì-ð<òIØ`ú kþ»¹jß5 ç[]ñ¥—^BMM š››a0 V«Ѝ¨(„‡‡‹z @UUUÐh4¦Ÿm5’ååå>µêQ[öôâøë盽ÞAX0˜3gŽéÿÁÁÁn_óü[yy¹×.ÛMŽñçà&wßìí°'$°—œÅK ä—Ø(z†#6½=Òݯí/ãØ[à= Èe<ÝPùCcéJÞðÞxC\Á™ýñ^øKH Ïb0 —Ù@9Û౑tŽ»0<ñ3ÊÞïÂ`@.Ñq~gUUU‰¨>2´= µö>Ê}ýíïãÌx"oÀ`@ÂX;pxK#io@ð÷ÆZäA\dèò·çOûâ*ì-ð> ä6ÞÔHÚs¯½7ÕW$Ý/_Ä¿y#r+WvE;S—¶ÿ7W7o©+ù.~†,cow6‘#Œ¢¹{°+** ÓéÜ]%‹,ÕÕŸïÇ·‡«o7 ä÷–È“Øc@^ÁSgOŽ\Ó–3vÂ[øR}}©®Žòç}³{ ¼ƒy”? 6óõú{3yoEÝ¥Cä $D 4vþd|£ï7ÿ>Þ½ÞÁ€H_ Þ^?k|¹îF¾ð! ˆ„êØøó@ ßKÿÀÞïÇ`@äb55‰‰‰î¯@~ |y ‡¯Û¿?ŠŠŠ P(…êêêvÛ°sçNŒ3ÆêJ–mÕ×·¿æ)IrssÍ>6$$ááá¦0\»dSVV†„„÷†H>k`Qg{ƒ€kèõúNã &&ÆçCàGÁ€<£ªª EEE®¼;†£ÖÖVüðÃ1b’’’l–{õêU»^_«ÕbìØ±ÆÆÛMdsáÂr O€yÐ÷œ³gÏ¢©©©ÝïBCC‘žžî¶‚®Ä‘J¤¥¥EøŒ\öÀk){ß¾}zœ-7..7Þx#ÂÃáV«×n{qq±]¯Eä¨Ü µíþQà¸|ùr§qJ¥}úôñ›Ïþ±dÓÉ“'qìØ1H’„ŒŒ 4HH¹ÖføêÒ¥ šššÚMö¡×ë±mÛ6ôêÕ }úô1 ÐimmÅÁƒqåÊtëÖÍâ¬tWtáè¦j@hh(Æ×n~¯^½påÊÓσ¹¹¹9r¤ß|aÉýxà'£††œ={¶Óï{ôèððpÔÈ5|¾µäØót:Nœ8ššDEE¡  ÀÔÍ^PP€îÝ»£K—.²_ÇÒ<88£F‚Á`ÀÎ;Û…N‡ÂÂBœ9sééé0`>Œââb×.\Ñ…C’þóEkwK¢.!­!î½–$-ê‚cÑÔÔ„nªk]ºt Û·oÇèÑ£¡Õjeï¯hÎt<9€ÍßðÀOöÐét8yòd§»¡ºvíŠøøxÕÊ5|>y¹¹¹¦³—.]ê´½¸¸ØeÁ@¡P`èС¦Ý»wo³éõz|Ÿ_Œc—šPQQàÚã%Irj.…B=zàäÉ“¸¢ûO¨¸ReÀÙM9HOOÇÍ×¥9\®-ž¾¾¬Óé00ÉÎV\áHq]»Ï”B¡`/9äôéÓ.q†††šn£ö'>ýÍ`oyƒÁtöÝöÙÖÕ µ8PþkÕÖ¶?(ªÕjÜpà ˆŒüÏmß¾}q¾N‰ââb´¶¶v*ãZ(°N©T¶KêÆìãbbb×é Á`@AAŠ‹‹‘€¸¸8¿º•1ïb=T*U§OÔ³À3r•ÒÒÒNí”R©DFF†_µ#F> %8ÓØUWW£äj€‹©­­Å¶Cg,Þ>hï¥ã]QQQ8[ ¦}½Ë—/ãâÅ‹‚LOOGyy9*++¡Ñhššjöq …éééÇùóç;õ<466âÌ™3(**BŸ>}„ôšx3{>?¾xð'w«¯¯Çùóç;ý>55Õê*ž~ IDATŒÀ¾Ìgƒ/ʽP ½^ƒÁàÒ®LK· vTPP€ææf$''wÚfl€+**PSSFƒ¸¸¸vu–$ å­0þÓ+¡Rt¥iŒ”J%‡ƒ:´4iDD„Ýs ( $%%A«ÕâäÉ“fCˆN§CAAú÷簾&„„„˜–K-))Ass3âããÛõ|ø+k[O„üÉ[XW‡nݺy¨V®Ç` ˆˆÆ¬¬¬ /^„J¥BÏž=áT9–‚B¡ètm¼×ß\wXEENž>Þ©YÊšššÚ…8Ng÷8 oÔ±ÇÇxY‰(PI’„ÂÂÂNã –&~oå3=`ïeƒ†††v?766B’$‡ÆXš9°£ÂÂB\¸pqqq¸pá‚Ýå›;XwëÖÍ%4G¯Q‡„„ ++ ­­­vëâ#±±±þ~FAAAHNNî4Âco‹/.žRWW×éw—/_˜³"¢ŽJJJ:õàÇ´}ÕßΞÚÁÑQ:>Ñét¸|ù²C¯éÈ–«W¯: ó½ÉÉÉˆŽŽ¶øœ¸¸8hµÚN—%lq¦K]¡P@­V»ý š˜˜h1Ȥ¥¥!%%C‡EBB‚ͺ•••9Õ[äI’$™í­ª­­uha,"Q[[kö„©wïÞ_"öu>Óc Š$I8zô(NŸ> µZáÇ£[·nASSNŸ>ææf„……!22111Ðh4fêçÎCTT4 êêêÐÚÚŠÈÈH³gî’$uêúï8ß\æR®B¡@¿~ýPYY‰“'O¶»–ŒŒ SýJJJPQQÈÈH466Ú=G‚·S*•Ðjµíf3 Arr²éŒY­V#-- ]»vE~~¾Õò®\¹­Vë3ƒ÷ÌÝjjTVV†îÝ»»¹F®WRR‚ºº:hµZ³sw ®»š$IÈËË3õB£wïÞ>1ˆ$I(((è4ZDDzöìé™Jy˜OD:‘ã Ú¯èÂÑÚÚŠ#GŽ˜=È·´´Xl@ËÊÊ,ŽÜoiiiwO¼qT{Çkºæžß¥Kôë×qqqHJJBVVzôèaqÂÃÃ1xð`$&&"22}ûöEDD ºv튄„‹Ï€ž={"11èÞ½»ÕÇ›»uÐxVésgaÆ ðaÕ•euŒD=lž 9r%%%B{}\ÁZ0hiiA~~¾_]Rèxoii©ÙÛmÉ9uuuí.M555áèÑ£8sæŒÝã¨<¥¸¸¸SOhPPúôéãS½"dÐ~q!N‡Ó§OcàÏ« g¼ê¸Ü×­¨¨@tt4zõê•Je¶a ƒZ­n7oA||<***Ì6æiiiízBBB0xð`»ë¥T*Z,66¶Ý™szzºÝS{#…BaרˆððpôèÑôb¥QÇK?:çÎCii)"##¡V«­Žgð[Åææf=zô‹žsA­°°×]w]À6þ"Y+uéÒ%TUU!--Íê¸&O©©©1;n+==Ý/>÷Îò›`ÐÐÐ`šã¾ººqqqèÓ§O»cÆ©¹kkkqâÄ ddd ²²Rh(h«²²õõõHNNî´ZWHHˆÙˆJ¥Â AƒP__Ë—/ãÊ•+€èèh!“ÿ8¸*a]]¢¢¢ü~¢¶Q[[kº¥/<<©©©f'Ljnn6}†JKKÑ£G$&&zÅ ---z«"##QW×~iâ––=zƒöº`ã(s—âš››QYYéÓÁÖ[Xë!knnÆñãÇg:)ò---¦ËÊm%&&¢k×®¨‘÷ðŽ¿Luuuؾ}{»Ôzùòe!==Àµòº‡XNÆÁx–ΦBBBÐÚÚ*»›¸¹¹gÏžítÐjµŸ£P( Õj¡Õj‘˜˜ƒÁ`ºdàn111.™|ÈÛ) dff¢ªª z½111 BFFΞ=kñ¬É`0àܹs(//GïÞ½šCA$sc%RSSÑÚÚÚi0jKK ÊÊÊ|î2QG–ÆèÔ××3`ÏL€eee¦ÞO¿çÆqÇKò¸‚¶ü¢­¸¸Øl£l\«¡¡;óì»o¿ººÚâ?88Øâ`>ËoÚ{»_xx8´Z­Wœ}…B˜˜SÏ p­eèСHII±Ú-]__üü|^s½zõj§[jƒ‚‚˜˜dffvú\ùÜð–¾Óg †¹÷×ÜwÁ8úÿøñã/½.Ò… :ýíU*•ÙÏ òùI’ÌÎi \køáä—Úž]ÐÆ{Y;^ëW«Õ2djjj T*¡×ëQWW‡úúzH’„äädS/µƒB _Óòu*• =zô@}}½Õ[:u:jjj<Òã"IŽ?Þé2BTT”©1Œ‰‰Z­n7ó›·¤´‡¥3Zg&%£Î̽¿C† ÁÙ³gÍ~ªªªpèÐ!ôìÙݺusëû_]]âââN¿OOO÷ÙéÍEóù`ÐÐÐ`q»+ºp\± ŒƒÎìy­V«‘’’‚úúúN㌠kÛëíæÚ„……µ[æ·#_¸µ‡¬ ³9×Cmm­G‚Ayy¹Ù;a¢¢¢¬>ÏÒAµ¤¤EEEP(èÙ³g»9ŒÝÆ¡¡¡HNNöøú –±GÑÝcuü¹÷744ýû÷GYY™ÙKmz½§OŸFYY™ÛûYWœœ—G-ñùK –º£Ì 0l+66‰‰‰6Ë ÁÀ1lØ0h4ÄÅÅ!--ÍÔÐÛ=Ç¿V«EÏž=;u±!333àf×òGö ÆôT÷uÇe¥:Ö¹ãçÓ\£ßÜÜŒsçÎÁ`0@¯×ãÌ™3¦†¿ªª ………(//Gqq1òóó=Úm Xïõ075´9Æ;NŽ?îñ¥ß½MÇð¨P(L½qqq¸îºë,è«­­ÅáÇQRRâÒU ˨w (Z­Öê-áÈç{ Ì58¶Bp퀺º:TTT ,, Z­Ö4ÏADDúöíkvÿ„„ÄÆÆâêÕ«Ðh4 %$$ 22çÏŸGmm-”J%z÷îð£`ýEddd§[ E»¯¡¡ƒÁ­·ÉUWW›íY éH;Ö«µµ:®ÝhòŽ=’$¡©© Z­¶Óí_õõõ8räˆiŽ O°vÀ©­­µë$áìÙ³¦Þªª*¨Õjöòý¬cðêØf#33³ÝJ°ŸïêºEEEB ǘçõÁÀV2ïØØ]Ñ…wjˆÍ R©DŸ>}Úý>)) ---6÷©T*§¹ÐÐPôíÛ’$9¼T1y7¥R‰ØØXÓ-¥ÀµÛŸÚž­K’„ . 55Õmõ²Ô[`î2BÇÏ}UUöíÛ‡°°0DDD@«Õš¨×ëQ[[kv¾ ã­tk8hmmE]]Õƒªª*ÔÖÖZ=ÈK’ÔéöâššƒŸulo-…Þ˜˜DFFâܹsí¾#FÆ™’’‚äädaá¹²²/^ìôû>}úøü­¸®àõÁÀ–¶×û¯è¡R©Ûn†ÃŽÂÃÃ-Îê¶A€Ž.RD¾!--Í4~%66¦ÓùâÅ‹Ðjµn¹®ÙÐÐ`q܃¹K–ãÆÆF466šmÐkÁ ´´Ôb= .\¸€~ýúÙQkùpôèQèõz«' ÆiÌ{õêeqæÏúúúNá•ÝÞ¾ÆVA[*•Ê41šqš¶ŒÁ¹¼¼éééVoã¶Gss3N:Õé÷)))5‹#|zŒ^¯75¸ÆËjµÚbÒ Ç!C0xð`¯™dƒüR©D÷îÝ‘‘‘èèh„††š ¢®šD«#K½!!!fÉ:{\WWgs=‰êêj‹kmˆVRRb÷­¡’$áÌ™38sæŒÙ¾µ)¤Éþƒ¶ºt邬¬,$%%™ÝÞÔÔ„¼¼<›wsÙª—¹q‘‘‘~¹P˜(> .^¼I’Ú)FHHˆÙI*ÂÂÂÎëIäv½{÷îÔ…nï 79š››;]ŽÓh4HMMÅàÁƒÍ^Æ2vã::Ö\/]Ç3pI’Ü6pÏÚ ÏØØX³'—.]B~~~§‰;þV¾Ì™`\xݳgO 4Èâ\0¥¥¥8|ø°S+»ž;w®S¨ î4+.µçÕÁÀZrìØ1ìß¿¿Ó@Cã‡+!!½zõ2}@•J¥]Œˆ\A©Tvê5hiiùÿìw”[å™ÿ¿·¨Ž¤‘¦xf<Å ÷2ƒÙ˜b dC {çíB $ö²&0Ä…B] au² e1X ŒmÜ ã6ãÛS5£.ÝöûC#Y½kFÒ<Ÿs|@š«÷]Ý÷û>5¦ß3—„vê ÐÔÔ„úúú¸®¬@·Î––œ}öÙ˜>}:a6›ÆÃDš“õz}̸§NÊ{mA¢LÔ¡”——cΜ91'#›Í†;w†XÆ¥Pß!WD®èÓtF#š››ÑÐÐó³^¯ûöíáC‡R.¸Õ××ÓµEqÉ)8{z²Õ„(Š8yòdLŸ€0³T æu ;Ý ÄHËDßÖÖžçÃjä Q£Vñ&­¸žça±X‚.‡þþ~8p ¥ÏÖ×׃a˜¨˜·ÛŽŽŽ¼¦ˆ%[á3 ­V‹Y³f¡µµ5Êâõz±{÷nL›6 Z­6föS&+ØÑB&Aƒ à©© •••8|øpL÷Mwww°¬r¢L.ÇsŽhllLZ·ƒ!‹A¼É?™($ }ô¶lÙAb¦%FNþjµ•••$ ˆ§¬¬,¦OÿðáÃèïï‡ 8tèöíÛ—“øƒ®®®¨UíØ±c³2¡–——§ôÐW«ÕÁzøcÇŽúLgggÜÂd¹ ™0Ïó˜6mZÌ^¢(bß¾}ho]NÝår‘‹aˆ\ZOÊÊÊ0{öì˜5_{zû,èFE«Õb„ $ ˆ¢B«Õ&}XÙl6lݺmmma–Ш~Y–qôèQ:t(LÄòßçJ¨Õê¸«ê€ 8F£Ó§O¹rëîîÆž={rÒS!–Áh4¢ªª cÆŒIj5Ñét Óç"!wBî] ±P«Õ˜6m¦Nóþ“e9ê8,KÜû‘ˆOÁ ¯×‹íÛ·ÃëõFY L&f̘A~#¢(I%;@Etvvbûöí8pàcFk÷õõa×®]AŸ½ËÞU”a˜”'ºTˆ×ž¶ªª*¡H7›ÍqÓvîÜ™ulE¬zøéV3U«Õ˜5kV”Ëa˜(WŠÝnñ&Q…F>û€TVV¢¥¥%nõÚ“'O¦ù!†Ý•nq“Ï?ÿ½½½1]ãǶòÅ…†¬(%’ ÈP ˆ2¢¬@ú² Yn%EA*ÁÃÇ#Ë2à†~X*Þÿ.ÇøßWq x–ËúÿK¤Gee%Ž;–òöýýý ãÜn7öìÙƒêêê(3¸V«Íéú©© ˆ™õ ­V‹Ù³gãСCQýq&LÈØ<)œ2-©ËóŸ¯ C”ø$¢ø$ ¢¤@ý“½()$’ ˆ²Iö¿.Ä*íjŽ7$Ô< žõÿWͱPó T 5ÏB«òÿSs̨Vó&“)ç‘ù±Rsý[1›Í˜7ovïÞ|(WWW§ì®à8S¦LAGGGT7FY–ƒûtkˆ¢Õù1›sgYS§N…ÛíÖ>©¶Ù…Ìp¸b(«ÜÖÖt8~üø¬{,Œf ZDöA ÓépÆgŒÄ!ÅEàd¸}|’¯ Á#Êð‰2¼¢ Ÿ¤À'øÿß+J€0%¶ÊöI2 îKá3Ài¡À³Ð¨8èT,4*ЪèTJY;466bïÞ½QïÏ›7ýýý8uêTÜ̃©tÍ¥!€Z­Fss3z{{Áó|ڭÆAcc#ÊÊÊÐÚÚ,ÙÙÙ‰±cǦµê‹åfÉÅ‘nyèÑFäý7œ‚Ÿã8Lœ8555€Ñh¤`Ã,)haËl0!ÄJS8½"œ> ·O†KàZù§²ŽW¹Ü`H(É +¼FZ‹2 ½Z½Æÿÿej-_ô.ŒòòrX,–0Ó´^¯‡V«ÅرcQWW‡;v,j% øWf3gÎÄÑ£GúæóÑßðÿãu$L•ŠŠ Ì™3;GEQ000,”” ±VóÅlYÌŠ¢@„œº>FÊbJYYYÞîóT‘l ¬d ZtuuEY jkkóþCW¯„—›[€Ý+Áîá©6úHàdx%ý®èé:ç  ƒ†‡AÃA§Î>_¸˜0aAÃ0aÅ€ÁnÇaÏž=QŸÕëõÐét˜6m¬V+ÚÛÛcv/̇Š—2¶nÝ6Éôõõ%L/Œ$2C§Óçù”ëëgJ±´`¶ÛíØ¿?DQ„Á`ÀŒ3râ‡I‹A¡0è±ã¸SkGVœä‚‚Š¢ ý˜O¢Á`ÈK«LYQÐïÐç`u p å‘ù¡³`À‡øèyPq,T ŽxžÏø·a™¡à?à8vhõ¬@5ä»çXŸg`ûTeòÐ5e2i(ÆAVYDI¾'Ê „¡xŒ„ ŸèÏ'Ê~7Cp Ü‚„Þ 2ϲ0hX˜t*µŒZ&­ j¾ðXZ­---°ÙlAkA$&“ QV´À„Ï0 ÆŒƒÊÊJ´··‡ù[M&SQÆñ<“ÉV詯¯ÀäÉ“SšÀ"³1ò±ˆˆ•îØßß_>í£GE’ÃáÀáÇ1uêÔ¬ÇîàÃBãx¿ºÜìêp ÏáE¥!væN10¬Â Œǃ“Þð¤ÅbÉÙ çeœô¢ÛîE¯]€”ÅÏ2 4<;ôÏ|Çs€Š4*Z• *A âÙ‚1ó,äðXÀ/DÙor!þßã“àdx ¹¨#'Ê2Ü2Üá+E ϤåaÒ ýÓú- #ý ãy>iúb}}}”0ˆ4ò<‰'¢ºº:èû/¦®¢f³9ª¤ÕjÅÎ;1sæÌ„YHŠ¢D¥ æ#6 `¥ u{tww£±±qDLè©âv»£b0úúúpêÔ©¬ÝAùª|XèH²‚½']81à¿ eþ²7-œž+ÎëP°ƒXyÁÙ¦&Š’‚“ƒ^txÐçðeåêgè5œð ±²°]xñ(Ø™iWGt U¦ÂÀæÑÖçF§Õ“¶‹€gY5,Œ:ŒC«Ë2_ÚÄQ 0 ­Š…ŠåayŸçù`ô½Ó'Áé‘üA ^ ¯‡GÊØ]!) ¬nV·À¿ äY&‹^³ŽƒY¯*ˆ¸…©S§¢££‚  ¶¶Z­6ïþóá„ã¸`0edÍ{—Ë…£GÆÍHŠUÂ8_uNÆŒƒööö0zWWWQ ƒ@7Â9sædÔK#VgÅR6vX½ØÝ1ˆXƒ†Ç÷NDMyñf²¬0ˆEº7[¿Ó‡Ö.WØê0áøð©•,zÊõ<Ê4ô;Oß;ž…YÏâWìçaÖ«†ÝõÃó<Æ?¬ûn†Áĉa4qèС°Õhww7ÊËËcNÀ±Ò:óa1LÏ ­a³Ùàv» 2µÑápÄÌj àv»Š®DÄ ¼,Ua + vw8pÜê†CÔ•kÑÜ`,jQ¨0ØyÜ–Õ*Èæ±ÿ„#%A bYÔ˜4cR¡Ê )Èà4"5ÔCî‹>ü¶ö‰ lv›[„Ý#Âæ!§WâetÙ|è²ùï+–a`Ôr°èýB²¢¬0¬ ¥Buu5Aˆªyøða †¨ 8ÒbÀ²lZÓ¥¶¶6ª˜ÔÀÀ@A ƒXÖ‚ÈúÝÝÝ0›Íi×£ˆ% JÑ•àðŠØÖfƒÝ=7±,0£Î€ ÕÅŸ‘¨0U*ˆ ŠO”q°Ë‰ö>”~hžeQW®A½E‹Ê2¾dÕ-áGÍ3¨2¨Q HIt‹CÿØÜbZ®&YQ‚Ÿ?Öç_éT*ÊüB¡Ò ‚AK§l¨««ƒÍf º”eÄœ9sÂ& Ha ÑhòúÛ6Q©©tdnE‰eee¨®®Ž)ºÊÊÊÒŠ ÂàÄ€»:c¸Mt*s›Œ¨7D IDAT(+üÌŸTvapòäI´¶¶B«ÕbÖ¬YÁt+EQÐßßCýT*UT-r Õÿ©AvwÚÖ0ëTW©ÃX‹&XÿŸ0 £–‡QË£a(~Oàðø'ú¡´U›GJ˲à$tHèð›µU,‹ Š25*ËÔ(×^Pc!Ã0 Î8ã ìܹ3lÒu¹\hoos«DšÊ‡£ŠV« ‹ôOV¥r$ˆÕ䩪ª uuu {ÖJ’„ÖÖVL›6-åû´”c dEÁ¾Ž ðdŒI…Ùc Pq¥q¾†UØív|þùçÁÉn·ãâ‹/†(ŠøøãaµZÑ-–A£ÑD¹T*UL+) ö ù|âQePcò=* ¥£èˆÜÃ!bÁ?©(CV·«Ó/œ¾Ôc9ÜýÀ³þ8…Ê2* þX…R¨”–OxžÇ”)S°gÏž°Õé‰'`6›a6ûÃTcY òF£)xaËPUU†a0yòdìØ±#L8Øív²_Çàà qôèQ”——£¢¢1 e•¢+á”͇í6wÚt*-M&Kx9¬ƒ“'OF½÷ù矄±Z+þ‚"UA€^‡ÛÛl1SÔÔ‹iµeh¬Ô%õïæ£»]¡0’DJYˆ¨y5åÔ”û®Š¢`À%ÂêÐ?$R-Ÿ-) zzv9Á³ *†¬ •e*”ëU£0ÄØ±caµZÃî§@›æX힇ËbŠ$Iðx<Ó~pp0J0Eft”——£±±1ªË%pº_ÅÀÀŽ9ƒÁ€ÊÊJTVVϱ”\ Š¢àÀ)Žô¸bÆ©UÔhi*‡ŠCI¥ G2lÂÀçóÅ ’Õ,ârbÀƒí6Äzô6U›pÖÄJøÜÎÍœD].¬‘“x>'ÓáC¥,¾€¡~e*XÊT˜8ôÌuxEX"úúœ^¸…Ô„‚(+è¶ûÐm÷›vÕ‹Š2UF ª ª˜iš£…PÓwh'FY–ÑÑѵýHX ÙáéÓ§ç}ß©«w¬¦T °ÛíQU'#q8p8hkkƒ^¯GEEEÌØ¯bŸ„mmƒCõLÂaÀ`JgÔ”AñôÆÈ”a{ÊX­Ö„3žµ ²²2¬©Ìñ~vuØ£´ gNªÆµÆ¡"9ñ'£lWÒñ&ºbšóq¬‰®k>¯M!º…µ+´Œðø$ô¹üý8úqÜ_‘ø$§l>œŠQЩ8T–©PmR£Ê †&FuÍRF£Ñ`êÔ©8xð`T›æXÛæ£Ñ•J¶*·Z­èééñbG²,G•Ð.//;‘OŸ>½½½èíí…Õji ÅårEõ¦¯˜è¶û°£=¶Zóhi2¡jŨ ›0ˆìz–*cÇŽ ¦)úE-J¨yg+Çøºä~±ôé.eS|. ½N…,Ì´jõjõfÿ Ó+úc ú†šw9S nABÇ€„Ž¡¬£†‡EÏ¡²ŒÇÕ(¨Ãa6›1gÎìß¿?n°ÏóÃRrœã8Lš4 {?à›Ï´y•$I`Ù쪫Z­Ö(ñ”¨…5Ã0Á€CŸÏ‡Øl6X­Ö´ÍæÅc ( ¾îráP·3f‚{•A–&Ó¨àÃ" z{{£LTjµ ,À¡C‡088^_‡ºº:ìܹ3xò<Lg<9èi)(Óðø§ åÐgQX&›Ix8„F*^䪹P¦+{ƒÁµZ »ýt™ìxçWÈâ  Ï¢Þ¬  ¡Ï) ×. ×‘ºëÁîõ·oëXÖ K™Õªš’NÔét˜3g¾þúë˜æïáôñWTT ºº:Ìl/Š"Ž9‚iÓ¦¥5–¢(ÁrÐ,Ë¢²²µµµõ½ˆÌFŒ— ,Ë¢¢¢555P6› }}}°Z­)Xƒ0ðŠ2¾j·ù#`œQS†)cô%ûJİY "¼‹UUU¨ªªÂÎã§ä3gÎDgg'79Žã`u‰øªÝ bÔðøÆ$s\5:I¤:Q>“lûáv'$Ú_¢×ÃE:ûÍÖô_ˆ¢'[´*õæ€EÁ—OB¯Ý‡^§€^‡¾‚ýíÃýeœv9¡bYTxTµ¨6ª²Ï…Ïó˜>}:ÚÛۃόÃ]}p„ s)ô÷÷£¿¿?i×ÌPÚÚÚ‚="dYFOOzzz ÓéPSSƒ1cƤd E1ªŒÙlÎÈŠÂ0 ÊËËQ^^îïUâtÏ-–+!ß'sA¯Ã‡¯Úc×½Qs~×Au)§$!¥»$V;ÓDH’O ÃÞ3AË@¨¹K«ÕbÒ¤IÁ×_µAŠðwµ<ÎoÏ($)l¼ÈcÒ‹ Õëõ)m/IRÌíVŽHìv{Ø5=ïTö§×ëÃVÍñÎ9U"ÇKD`ÅoûLŽ#ÞþcÅ¢H’”òw™Ì÷\ h8 Þ¬F½Y EÑÃî•ÐïÑëô¡ß)ĮШ L<û$ '%œô¯ðôjUe~kBE_2EY ÕjqôèQH’ŽãPSS“ô>Èå}Â0 Ư¿þ:ìý£GÂh4¦´‚>uêT”À h ÕÖÖ´P˜L¦¸«ÙÞÞÞ¨ó³X,)s¼gTN‡úúzÔ××Ããñ ¿¿V«v»ÇaüøñP¥ ‡ €Ã=n|ÝÛµmÑñhi2A«bÓ>~Y–ƒ×.ù2†Ñ•²|LçÁ/Ër0pÅjµÂårE}¾¬¬,xáã¹ÈŠ‚mm6x#šàèÔ,Îj2€gO6Þ—˜¤óq“êõú´Æ ‹ÃákUj0R'Ttäâœôz}°@‹Á`ˆ¹ÃáHú]ez,ÉœÇ$IRðX“í+ôœJƒš…¡B¦ õPzäé`F«[DP$–vy%´{%´÷{(×r¨J‹4ë‹ÛíPQQƒÁÇN•J•ðÞŠÕ*8[Ìf3,KXÀŸÛíFgg'êëë~ÖjµâرcII’¤0+BUUUL+BoooØXÇÁl6'ý½E’l{µZÚÚZÔÖÖÛÉ3 “ö~†Ÿ(c× 'zíBô`|…Skô`˜äç‹Ð{*_©Œ™t¿Ì„”…A"TäE`Y6¨9ŽƒÇã‰zè˜L&p‡]ö¸jzÿ 'l ¡‰ÜjŽÅÙÊ£šÕ ×ËY–a0àt:ƒ×d¤½¼¼<¨öãý=rÛH2=‡ÐñV ›Íõ€ ŒÏ²lJû*g6T9TÕ@ HÒPZ¤ˆ>§¿£d* z$ zÜ8ÔëÏ2¨*S¡ÒèQ(F·ƒV«[)X®7nÃ&–“'O¢ºº:î±9N9r$x\"³"ñx<èèè@gg', jjj`2™ Š"l6[ØX)»B¯U:¿£BþÍY]vwø;­F|í*ŽÅœzjLé¹"ÅCè=•¯À×áï)=Ã0 £k#…ÇqAsÏó°Z­a'Ä0LÐßï!ße÷á¸Õþ908s¼&ìbô5‹¢t}¸Ýî‚9‡ÈZ‰ˆõeóCà8.ì:”——GŤpœE›êqZ,–¢BÌŠ¢`ŒQ± ”Ç'¡Ç! g¨Âb*ñ ’t9t9ü‘^͡ʠÆ£•UÑ»b­àò!ÈËÊÊÐÐÐV,HQttt`êÔ©QÛ{½^_EQ‚×k¤-Ù¢( Žôºq𔲢DM¬fyãÒ^W%J„.ˆ3ÍF)†-+!“ɔ𠒂]Ç£ƒ §ÔêQe(ì –t(Q.‘šù˜€ã¹5Ò¡X2rVÍ¡±‚Cc… ›[D¯Ý‡‡?>!•¦P.Ÿ„ö~7ÚûÝ`À \ǡڨAµÑß9²˜Ýù¦¾¾ÝÝÝaÑû}}}«à*Š"öíÛ5á«ÕjLŸ>ÇA§Óaüøñ7núúúÐÕÕ…ÁÁÁ¸ûöz½QY<ϧ%üKŸ(cg‡-ا$’ñ•:Ìk ^%1aÙõ,p“†f#„²·Ó-ZePáŒ1þ"HÅ:¡–*…ü}ŒVq€P®ãQ®ã1iŒ’¢ ÈšÐcóÅí3ŠC¤Z»ý üÙT1,Ëb„ 1kÌ; ÃøKï8õlä8Ó§OZ81 Ìâòx<èêêBwwwB+B€ŠŠŠQ'ä\¶µ ÆLûåYÍ Ô™ £lu!’×_t &2¥%^Ô>ôØ}Áâ-Ô‹¹&0(ìIˆÈŒ|§£]„Â1 ªj*Và†š:Ùt;¼)¹ÄˆŽ‘: U Ô£ ÈR2***`6›Ã\bn·}}}¨¬¬Ä¡C‡¢îI†a0uêT”•Å®@«ÕbܸqhjjB?º»»c¶©0Ò‡›c½nì;aY2ߤå1oœ‰Älò~u\.W”/&Þ/) vuD?ÀgŽ5@«âHÅö]P%ÉØhU,,Z4X´P`ÌÈíàä0·ƒIçO¨2¨QaPe«Õ&LÀŽ;‚e„cõ0˜8qbT³¸D0 lhäñxÐÓÓƒ®®®°T9½^_t¿ÕL%;;lÁôÜHš*t˜UO®ƒTÈ»0ˆU%K¯×Çt#îvE™~ÆÕ¨·É‡ÈdAˆM<·C¯C@·Í›²ÛaÐ-bÐ-âp ,è©BµAr?jÌÚ:&¬lsOOOÌgbCCjjj2Þ—V«Ecc#`µZÑßß–eÑÐÐPò×Û#È8ÞïF{¿ÇŸuϲ˜Uo@Í#)“wa+/7Öê$îw9ð,‹Ùõþ¶Ñ¢z‰áÄArBÝÓëÊàeôØ}è±û³Ri--+ŠßUáðá NWc¬2ø³ šâ®Ÿ µZ& b‰‚êêj466æd ࢢ"­j‹Åˆ ×îC[Ÿ Ýöø–-£Æï:0jÉuy¿Z'NœˆÞiŒÔ¶ƒ§\"¾ÜIctЩɅ@äé¡áCÜŠ»W:ívpQ¿ßXrx·H5Ç¢r(6¡²Œ‡¡ÄàÉ:<šL&œqÆ%-Žr‰O”ÑaõàXŸ._âzõf-f7Á³tmÓ%¯¿BEQÐÖÖöžÁ`ðOô¶ÓErìÖðè\ŠÅ¤êøAŠ…ÄüI±;–}y¸7æûQì0 “–‡IËcbµ~¨Oƒàïïà0è£Òcá“dœôýžEµAƒ JƒeEXh)”DÂ@§ÓaÚ´i$ R ß) ­Ï“ƒÞ¤q/<ËbF]š*‡·_F)‘WaÐ××e:›8q"vu„WÎ;xÊõ™V;rA"ñ&ú\Œãóù Š"8ŽK¹_< Œá%ŸõJ–a‚‡àô9ý.„>‡GŠm¥½¢ŒŽ7:†‚ùu*.£PQV|©‘ñ굨T*̘1cXZC+‚¤ ÃêF{Ÿ'¥øŠCS…M•ºQ×&9×äõ®Œ¬^Ç0 q°çtÔ¬Í#¢Ëž‹kÖñkNmÒÌ„\MüÃE¢ã%Ñ‘î„P·¹2GÍ3¨+× ®Üÿ;vû$ô:ü½zÞ”âÀ-HèÐ9”¬áYTÔ¨ÐûÅ‚AËGV¸-(b‰–e1}úô”£ «S@{¿'ØÜäê(e%øù,£Ž‡QÃäã`Ò©`Òª¨IT ¸|ÚûÜ8nõ¤”bÖ©ÐX¡E½EK‰ €¼ƒööö¨÷ª««ƒñGºí"LI“kM)™òH¥&"…+‰ƒ‘Góa鑲¢`À%`ÀåUèw)§H`ß„d^kxF-£Æ/NŒZ¿uA=ŠsçEG1è–ÐÞïBÝ—T–q ƒ±f-ÆUjaÖ«†å8‰ÔÈ‹0èêê {­Õja4ÿÃópW¸µ@ű˜P<}‡DAéú]³H ó&5*ÊÔ˜X­‡(Špyýî¿A„Ý#§TÆ9¯(ÃëÑëœÓð¬ß’¡áP¦æ Ws(ÓpЩ¹’Y ’‡G„Ã+Áå•àð‰pz%8¼RJ8ÿ‚q•:Ô[´Pq¥q]J¼ƒÈÂF¡­Dû^XáÕ›ªÊÀ'¸AH”6¥ ÈjPøèÔþIºv¨Çqpx%¿UÀ%`Ð#Á擦ÍÅÃ/|èsDÿMóЩXhT,4*Zž…šg¡ú§æhU…! $YÝ#Áé“à}pze8¼\>9­ ÏPX†ÁØr-š*5¨(Ë.È?yrÄ+4ÀðX¯3jû‰cŒqÇ"Q0º˜?© ¢(Âçóaû1ëHNZP@bqš&hÉ«ÀŸ1es‹°¹%ؽln)f;ßtðвߕáN¼Ë0Ð ‰Žõçî‡.šx–3ä±`€0!Á³L0z?3XÄËŠQ>½¢—d¢¤@eH2 J |’ QVàe(CÛ2Y •25çO5´è(6£ˆaˆì5h?x<ìoeXâ(H£›yãO¬î9-( ²/ ƒ†‡AÃcìiC'IÁ [€}ÈŒns‹°{¤Œ­ ñnA[Èí¸é dà^ …ƒ“ãªt¨,SQfG’aÀó|XV‚J¥ÂÎã68D>Ê5~LìØD(ó'U…=`ŠÕå@'*.¼ITO‚Ý+Ááõ çпl- ÅË0(Ssþ˜ 2 çÆÔp ]ÃDá“aÙQQ£Ñ@ÐÞ^Û€e4UF×'ˆdz\Y FZ5­šCµ1\0ÈŠ .Ÿ—O†Gàdx%^!³ÀÇᆚõ -?ô_ejZ5KE¡J”œ A ŠbØêN«Õ£(89. jËu1S|ÈZ@¤CäýRHB!4µ‘„Âè ‰_bwQeÅ{ ÈðI <‚ßP,‚G cˆRx|@@T(Š‚P#¬(ɈtB° ‹À±~÷.Ï2à9*à9Ë@Å1P± ´*|@yUä\ˆbtg,žçÑ=苪]ÐXm- Q@dK¡XÒéóAŒ>x–¯ö§6Š¢Ÿã$ F'9’Û·fõ†ß`ËbìP¥Ã$ ˆ\Cý‚ Ò#çÂàÔ©SQïdb¸´Pq£·R1òäBˆ¦#.(î€ ˆb çÂàðáÃa¯9ŽƒR¸0¨¯Ô‡½&kQŒ¤{ßöö;“8 ¢pɹ0èëë {=fÌœÃ}h,Ã`¬ù´0 Q@Œ&šOÇH ¢Ðȹ-?2øP­Vã„5ÜZPeÔŒê†#Ä襪*\77šÂ„ÂH`2™(P’ ˆ 9ŸÎð uh¢Š}ÔWœÎF kA†@ ‚rìJP%*+aÿ@ô.ÆšuQïÄh¡ªª ½½±ƒÉÍ@ÄH“S‹Á¾}û¢„Á€'|“V…2­_,µ€ â3V„P¹‚rl1ˆÌHÀÁ>l'uÐ!‰b4“Èj Y‚Nrj1°Ûía¯¹òZð*UØ{uäF ˆŒÉ·¬AäT‚öÚ‰ðZ*ŽE¥QCÖ‚@t†B:äB Ä$bt“Sa_p4ÂêYeÔ‚c©ö6AÈF~0»>vëòl q@£—œ EQÂR=2Q ¾¶\›«ÝÂìzæ4Gú0‚(rž®À®hÁ2áÂ`L¹–ÜA:ˆÉ¸â)’%€ ˆdäÌbàõzf³`—Õ`BZvjUL:UÌÏ‘[bÅ ( "r& BÝ »¤Ëž~ŒI‡³Ï¨ÎÕî‚Hª¦HDºäL¸\§û!x$°`CÚ*)×äjWQr‚«ªª²HŒ¤¹Ñ„‹[&ætL‚ J—œ ŸÏü‡¬SPÂb ¾5kl®vE%O.B`œù“ª(Ƈ ˆ¤ä¼í2à/E«âPaPÇÙš  vêbè{¹ P ˆƒ/çf<‚ J‹œY BÛ-;e¿Û |XmÒ†"‘>‘Â![«Y‚ˆE΃½ 0ÁàÃSÆäj71ª‰%,KVcÆ&“)ø ˆÑCÎ\ ‹SÖ •FVCF‚z õG ˆ|b±X Ñh`µZÃÞOÇ¢ÈÅ)l6jæD¥JÎ,ÿ§Sñ»8ŽÔ”ëQ[N€ rE¢É>‹©¸ÈŠ@¥K΄Ûí8eµ¿Õ2ï7FÔ™µ`©?Aä”dâ`¸A¥GNÓe°p+CÕ ‡‚ *Ërµ ‚ Ò WéŽ$bt‘ÓGæt“$Žca)Ó ¾BŸàSA $btÓîŠæt, àÞB€ J…PëÅDi’Ó&JÞ‹Ã0(׫ Ss¹ÚA¹¢tɉ0ðz½E1Ìb`Òñh¨ ø‚(ebuq @5¢8ɉ0°ÛíÁCÀië€J¥BY›àSA” ‘!T8 ˆâ"'Â@–å Á+ûÅÃ0¨3S|AŒ&âYHDñ³Ê‡^6Ü:À0 µZ&ˆ§ªª*ª¹“¿Ž‚ÿÿ©QA¹+p¿%jˆ°èy¨y <$ˆR'´^Bdí R$ˆâ#wY L¸Å ªL•«¡ ‚(ræOªÂÅ-Gú0‚Hœ›Ë 1Â+Qm$a@£‰T*-&Êb ¢0ȉ0h=Þ ÀŸ‰ †¿Ë℺Ê\ MDjùåÀv$¢pɉ08iu†½æyãk³ëODi*"H Dá‘RV‚¢(p¹\qÿÞc÷…½.S3/\BvWÊH’”ðšáºwññz½#})£×ëaµZƒ¯§ñ/ïîtäu¿ƒàp8 ô€J]£Ô‘$ ’$@ÞžíÇA£É¶_n yÂož =e#‘‹%Úª8»Þ€Ùõ†8‚ 䤎Á}ÿz)ºúpðØIôØ}¨«$Ó AɱX,a–ƒqo AÑäD0 ƒÚ* j«(®€ ˆôˆ'€ü ƒÁ‡ƒDAÄ"%aÀ0 ÔjuÜ¿û|á1ÇãÈ Q!Ë2X–Ïç¬ðdI!Ë2DQ {/Ñý7ÚŠ¢€çy°lÎJ“ +555èëë‹û÷–qfìê°g<¾,ËP%øšazFÅAQȲ tâz°, †aÿó*å™)Ñ$) hÒ‹,Ëe ÃÐ5ŠC¤(ü¨ÀŽ' V삼¦¦&ª¼r(-ãÌ€ÇmiùP´"*ß„NztbK0 ¼^Åþl§o ˆ‚!Õ"IAäA¹® h2™`4³=,‚50 ¢hɦ@LÕË‹ IDATµ‚&ˆØ0 ¢è‰'B'ÿ@q#‚ C€ ˆ‚#ÕÞ ¡db= «ADC€ ˆ‚$q¤/HD8$ ‚(X2pqËÄ”·%q@§!a@DA“8˜?© ó'¥öyᇄAO6âΜPyã“—l'q@$ ‚(Òñ¶7Þ’T 8 F;$ ‚uœ9¡"áßI£A ÙºBIK˜L& DÉC€ ˆ¢"—âH,BE b´@€ ñ b´A€ ˆ¢#‘Õ [‹B*â€ÄQÊ0 ¢(ɵK!”têD©A€ ˆ¢%Ÿâ @ŒNHQÔä[±¹ˆR…„AEÏpˆ€,Ä耄A%Áp‰€QÚ0 ¢dNq¤ßâ™ ŠAYB(%HAäD)@€ "Ç@ ŠAy‚QŒ0 ‚ÈTƒI Å?;yóÍ7!Š"®¸â ¨TªáØ%ADÁ*v·à‘D|†Åbð׿þ×_=fÏž7Ç. ‚ ²"…ʰƒgžy_}õfÏžn¸Ï>ûìpì– "ïd[;! H$…B^…Áàà Z[[áv»1yòd¼þúëhiiÁo~ó›|î– ¢(!@yO<ñƹsçbüøñ¸ãŽ;000­V ŸÏ—Ò­­­¸õÖ[ÑÛÛ›¯Ã$‚(8H #I^„Akk+î¼óNŒ?o¼ñî½÷^¼ýöÛhnnÆ?þñ|÷»ß ÛÞáp`ïÞ½èëë {åÊ•xá…pøðá|&ADAC ò" þñ@–e¬^½—_~9~ô£á‹/¾€ Ðjµ¸ë®».— ·ß~;qöÙg£©© W_}5>Œ÷Þ{›6mÂ’%KðOÿôO€S§NaÏž=ù8d‚ ˆ‚…1œ¤$ <ˆn¸ííí) :wî\°,‹O?ý4øÞÆa³ÙpÛm·aܸqeK–,Á³Ï>‹9sæà‰'žÀc=†cÇŽáüóÏÇm·Ý½^ûî»/8ÆŠ+°`Á¼óÎ;iž&ADþ®æM$ˆt‘e¯¼ò Ö®]›òg8÷¤²áþýûñ /@ÌŸ??¬ aÛŽ;‹ëÖ­ÃæÍ›Q^^Žû·ƒÙlÆÿøG¨Õj<÷Üsxê©§pÑEáwÞÁ¼yó0oÞ<ÜxãøÛßþ†ƒâÎ;ïÄå—_—atuuaÅŠP«ÕÁ}s—ò 4’$A–e°, ž–2E‡,Ë$)ì=•J†aFèˆ Q<σe©fY,$I‚¢(Á× Ãäü÷çr¹r:^"jË5¨-× ËæÍËø²,@Q=[‡›À5 À²lð5±Î2‡ÅæÍ›qÝu×á¹çžƒÓéLùsi=E\.xà477ã•W^ û¡ErË-·`Ó¦Mÿò/ÿ‚žž¬Y³eee€ÇÏ<óLØÔívãèÑ£hjjÂí·ßxúé§qâÄ \sÍ5x÷Ýwa0;vìÀ¤I“ðöÛo§sA%YˆXtvvbéÒ¥¸ì²Ë°k×®´?ŸÑò¢³³Ë–-Ãe—]†Ý»wÇÝîßøÞ{ï=üßÿýî»ï>,Y²`³ÙpèÐ!œþù;vlØg~ó›ß`pp÷ß?´Z-~ÿûßcîܹøýï¶íŠ+`µZ£Æ ‚M@ Àétâ7¿ù š››ñꫯ&\¼ÇCQ°Š¢dôaÀo¦8÷ÜsñË_þ2*£ ”³Î: wÜqGðµV«…Z­š@ìÝ»/¼ðÎ;ï<,Z´`0pÝu×ÁétÝðÆoà³Ï>Ãõ×_¹sçftüA¹b¸â Aat¢( ^{í5Ì;k×®…ÛíÎx`”U©·¼¼¿üå/ñƒüz½>iO„Ÿüä'øÃþ€—_~W_}5à²Ë.Ã'Ÿ|‚O>ùÍÍÍüÖ‰¹sçbâĉøì³ÏÀqÜn7ZZZ`µZ±k×.ÔÔÔdtÌ#Ïçƒ(Šà8f¤§ E1ªÖ…N§£ƒ8¸Ýn(ŠFC>á8x½Þ°¸–e¡Õjs¾ŸB«¹’I?EQ‚‹6êm›Ðk€ã¸`ŒÏÅ-‡íX¶mÛ†+Và‹/¾ÈxŒHã@”+!SëÁàà V¯^… â½÷ÞKºýºuëðío×_=n¹å<öØcøøãqã7EüêW¿‚Ëå† ‚½GyÇÇ%—\‚÷ßûöíËè˜ ‚ rI!X B ëÉd‚ÉDV‹|sêÔ),_¾^xaÆ¢ žÇ ÊböÇ,Vh—\r Ö®]‹É“''<¨§žz 6lÀ©S§`4±{÷nTWW>ÿüs\|ñŸúê«ñòË/:::ÐÒÒ—Ë…ªª*ˆ¢ˆÜzë­X³fMÁ¯˜Èb²¤Y ’3\ ð¬Rµdk16[ivI‹×ëÅã?ŽuëÖÁápd4F2@ÂàÃlâÞ}÷]ÌŸ?·ÞzkÜø†aðãÿûöíÃý×áé§ŸŠEQ°bÅ hµZ<ðÀÁÏ,÷ß?Ž=ж¶6ÜvÛmøÿøüîw¿ËèX ‚ rE¡Y ¬ýp¬êÉr[Þ~ûmœuÖYøõ¯7Q¤˜•©8Ï?ÿ<š››ñÄODå¦Ðh4¸æškÂJ%¿ôÒKؾ};n½õVŒ7€¿¢âo¼o}ë[øùϬp÷ÝwƒçyüíoËè8 ‚ rI!‹ƒù“†÷ØÈµ=_ý5®¹æ,^¼GŽÉhŒtú)§+fc=°Z­X¹r%æÏŸ÷ß?¥Ï|ôÑG¨««ÃŠ+‚û_±bxžÇºuë¶µÙlE‘LóA –ù“ª0RÕ°NØ£Eäò<­V+V¬XùóçcÓ¦M‘ÉÜvƒlÂÁƒñÝï~×^{-Ž=špÛ矟~úi° ÒK/½„¯¾ú Ë—/ÇÔ©S£¶€‹.º€ßRñè£â /Ĺ瞋U«V¡««+£c&‚È„Bµ„2RÕ°FЗº8ÈÕù‰¢ˆçŸ>X¿'2ž!U2«3®ŸšéK ¯X±"¡Ÿ$4 ñþçS¦L ÛfçÎØ°aÊË˱lÙ2H’„Å‹ã®»î‚ ˜3g^{í5ÌŸ?Èø˜ ‚ Š™DB%WÙ ©LŒ¥( ŒFcNÆúè£pÎ9çàÖ[oÍ85›<$+!åA²ˆ¯««ÃªU«pÓM7%¬ón³ÙpÓM7áÝwßÅùçŸK.¹}}}xöÙgár¹ðâ‹/bÑ¢E¸÷Þ{±nÝ:,Z´øÃÀ0 úûûqþù磩©iÄ0QVBr(+!=(+!9Ù•I¡d)$³`ŽsGû`ÆY éLúÅœ±ÈJ”çü½J¿¿Lâ8>Œ{î¹7nÌê¸rAN„Ap°,ÜóæÍÃúõëño|#áv¯½öyä‘`)æI“&áÁÄW\®®.L›6 ¢(B«Õâç?ÿ9n¿ývèõzüâ¿ÀsÏ=‡ÁÁAþÂI:s&0H ƒô aœb‘“x¶â"U·Foo/dY6Æ;Ð^“¦L¬Å(E‰º2N§>ú(zè!x½™7ÅÊáTž[a4Ã8Ã0¸æškðÀ ±±1á¶ðz½a_~Ë—/Çš5k`±XpÏ=÷@­Vã¾ûîÃóÏ?½{÷âøñã€+¯¼øê«¯2:ÖL!aéA 9#) €Ô'öTWõé’©0ˆ|F%«…©› ˜ÄÉd‚¢(QϨt…¢(xõÕWñ«_ý*«¸ù$Ö®]›qÅÂÀ~‡ƒ¼Y "Éæ„>þøc,X°K—.EOOOÂmŸyæüìg?úuë0uêÔ°vÏ]]]X»v-±~ýúàDòlP@$ÊŒÐÝÝåË—£££#ãs"bôo‚Îe­ƒH+B>ÆNeÌ@ñ¤À¿L(ëA®Žáí·ßÆ™gž‰Õ«WgUÆx¸D0ŒÂÈîädYÆ«¯¾Šææf<üðÃQj-€J¥Âš5k°{÷nÜ|óÍÁI‚õ¥ï¿ÿþ €}ûöáÓO?Ź瞋ÚÚÚàûn·ûöí‹òýú׿ÆË/¿<ì‹A”ù*€”IB&㧺L…ÂH‰ƒ\¹ vìØoûÛX¼x1ÚÚÚ2c¸A€as%ÄÜy¦áÉ“'ã·¿ý-.½ôÒ”¶ß¾};.\ˆsÎ9'ª´äUW]…>øï¿ÿ>,XApß}÷áÉ'Ÿ„ËåœsÎ9xøá‡!Š".\ˆ… â­·ÞJû¸É•r%¤¹’3Ò® Ü_ÈUc¹R¡··7£óJæzN·Bª‚ ‘+Á6`Åÿþ¿gðôÓOÇí”ê>F ~Äö ÿ‰gú°ommÅ¢E‹pÑEaÆ ˜6mZÂíAÀ”)S°~ýú°÷ßzë-|ðÁX¼x1,XX¾|9^ýuL›6 ?þñ¡ÑhðÔSOᢋ.BCC†‰‡ "…,²%Ós‹´"D “É”wq (Šøóÿû^xâa8öŒÇIA`D-¡d³T©TX¶lV¯^ÖìóùpÖYgáĉرcð׿þ×]wš››ñÁcAÀ÷¾÷=üýïÇòåËñÈ#dt¬d1HY Òƒ,É)‹A±©Å _„ …\ „LA¤Åà«-Ÿáɇ֠íHkÆÇR S1€aŽ1HD6¾Aðûßÿ3gÎLØÞ9’'Ÿ|‡Æw܆†f*<ûì³a ¢(¢µµf³«W¯Îè8 ‚ ˆôOÈeç\X :ÚŽbõíËpç-7•Œ(FØ•‹ÀÊduØßß•+Wâå—_ƺuëpÞyç%Üþ[ßúvìØÛo¿=øÞ¶mÛ0kÖ,Ìœ93lÛGyÇÇúõëƒe”}>>ûì3ØívœuÖY¨««Kû˜ ‚ ˆÔ¹¸ebX¼F²jŒ‘äBØmƒø¯çžÀÆW^€8T%2 M(WB,²5_vÙex衇0nܸ”?3qâDTTT`ëÖ­Á÷:::ÐÒÒ‚ÆÆFlÙ²<ÏcÛ¶m¸þúëÑÞÞÀxróÍ7cݺuP«ÕqÇ'WBrÈ•äJH¹R§Ð\ ñˆW[!‘PÈVȲŒ÷Þú3žÜp?¬ýSÀÓ.€r%Ä"ÛTwÞy'íüÑïÿûØ¿?žyæ™à{¿úÕ¯àr¹°~ýzð<ÎÎN|ï{ßCoo/ž{î9´¶¶bÆ øãÿˆ+Vd|¼ADjÄK™ŒU‰1)ˆ_mù–-¹ÞuGÆ¢`¤ÒÓ¥ -‘d³b;v,î½÷^\wÝu Ç!˜•píµ×⢋.Â-·Ü‚Ë.» úÓŸßýîwñþûïãßø^zé¥`¥Ä;ï¼O?ý4Nœ8Uq1Y ’Cƒô ‹ArÈb:Åb1%žõàè`öcwŸ:çþc=6ý-óvÈ@á[ B)*adï^hiiÁš5k0þü„Û½öÚkX·nÚÛÛ¡V«±yófLœ8GÅÙgŸ3f€eY9r·Ývn¹å<úè£Ø°aöîÝ‹1cÆà­·ÞÂ矎»ï¾<_páA%C ‰^€Ð~ÛY#7OŠÇíÆ/=‡×ÿð |¾Âh‡<\0@`‹/ÆÝwß1cÆÄÝNE|øá‡°Z­X²d àoûþõ_ÿëׯÇ7Þˆ—^z >ø t:E سg|>,XFƒ_|.— sçÎ¥U/ADž°Z­ @¥"EÁæþÏ<ú[ôtÌøXŠtjPÄ @6­^¯Çm·Ý†;î¸#e³âÇŒ+®¸=ô–/_ÀŸ[ûàƒâé§ŸÆ]wÝ…_üâX»v-î¿ÿ~ð<QK–,ÁSO=I’À²l ÅÑŒ$IÁ~ð4 ‰ª8x½^(еZR¯Ñˆ Q®úýÅF–å +¯TÝ-[ôÅ|ÿÀÞx|í½Ø»s{Vãù´ZüÂÈÞ½0iÒ$ÜsÏ=øÞ÷¾—t[Q1oÞù$Î>ûl¼÷Þ{˜:u*Î:ë,Š1HŤÅ$‡b R§c 2%P<©·§ Ï<ú[¼÷柳šÔK`:P" @¶Ç\€õë×GÕ0ˆdß¾}¸êª«àp8ðÓŸþK–,Á”)S‚¿ùæ›ñúë¯ãÅ_ÄâÅ‹Ã>KÁ‡É!a$ ’C uF“0´C~ð·¿…ËéÌxœšF”˜0ÍÂ󈶶6|ôÑG`YŠ¢`ÅŠ`Y6lHº¯×_“'OFmm-æÎL‡ŒÅ|Y–3:'‚ ÂÏÎ;qÉ%—`ñâÅY‰‚b©I %) dó¥ `åÊ•8묳¢Ú4‡¢Óé0uêTþÉ{Û¶mXºt)f̘‘pü-[¶`éÒ¥`Y?þ8–,Y‚þð‡1»6¾õÖ[¸êª«ðƒü ãó!‚Íô÷÷cÅŠ8ÿüóñÉ'Ÿdÿüs|øá‡˜0aþû¿ÿ—]vYÆÇO1Úøðñ`Á¬\¹’DAŒa ›/8“öΟ|òIX<÷ÜsxóÍ7«V­‚ÃáÀÉ“'±aèT*üùÏÆÞ½{ñî»ïâÊ+¯Ä’%KRîõ@1Úimmŵ×^‹+¯¼û÷ïÏxœÑà6ˆEIf%¤J¶QîsçÎÅúõëqÎ9ç$ÜnÇŽÁX„ÿýßÿÅ¢E‹°fÍ´´´à–[nAGGdY†$IxôÑG±lÙ2þ›{þüù˜?>Þ{ï½àxÛ·oÇ_þò,Z´ÍÍÍÁ÷A€J¥Êêœ ÊJHÊJHe%¤N1g% bÆ xüñÇ£ž!é0ЧE£ÐbJ¶jpÇŽøçþg\{íµÁö˱˜;wn0@±££#øþ\€]»vaãÆxâ‰'ðÕW_E¬\¹’${ì1̘1çŸ>¶lÙ& à'?ù .¿ür².1ªe¯¼ò š››ñðÓ(È’Q- d{#¤ÒÞùĉA_×øñãq×]wá;ßù>Œo~ó›¸á†Š$mÚ´ ›6m 7Ü€¹sçn¸á† ’·Z­øì³Ï‚Ûoݺ¯¾ú*dY†Á`Èê|‚ Š…Í›7ãœsÎÁ²eËÐÓÓ“ñ8£Õm Cd{S¸\.<üðØ7o^y啨±î¿ÿ~ìÚµ ›6m—_~‰7Þxmmm8ûì³ñä“O†m+V®\ £Ñˆ{î¹'øþ§Ÿ~ŠS§Nášk®Auu5¾ýíoãÈ‘#Áú ÃÄLw$‚(5:::°téR\z饨½{wÆã ˆ†„AÙÞ$X¶l.ºè"lÙ²%ø¾ÛíÏó¨­­\|ñÅØ²e ®ºê*üò—¿ÄæÍ›ƒÛ>ùä“hmmÅ¿ÿû¿»?ú|>¬Zµ åååøÝï~‡7ß|Ÿ~ú)&Nœˆ×^{ [¶lÁM7݄ٳgg|ìA…ŽËåš5kÐÜÜŒW_}5«±HĆ„A²_~ù%.¾øb,]ºÝÝÝøõ¯ ³ÙŒ+¯¼_|ñç²o~󛀃z{{ñàƒâŒ3ÎÀüãàxO<ñ>Œ»îº •••€ææf8N¬^½&“ ‹/ƧŸ~ Ç“ñqA"Š¢`ãÆ˜7oxଞsd%H̨ÎJH•l£á ~ö³Ÿáºë®Ãí·ßŽ>ø3fÌ@cc#>þøc°,‹mÛ¶¡±±o½õ®¿þz¼üò˸üòËøÅÂÌ™3QWW‡­[·‚çO×¥º÷Þ{±nݺ`*¤,˨¨¨À³Ï>‹K/½4«ã)(+!=(+!9”•:…˜•°}ûv¬\¹ÿøÇ?²‡¦»Ô ‹A d«.xà\sÍ5¸þúëñÁà¼ó΃,ËX´hÞ}÷]466®¸â ìß¿?( àÅ_„ÃáÀªU«ÂDA[[{ì1˜Íf¼ñưÙlØ´i8ŽÃ 7Ü€ÞÞÞÌOš b„9yò$n½õV\pÁ$ †‘’/‰œK²-¯|èÐ!Ü|óÍX¸p!|ðÁ`¶A$8„'Nœ€¨íW­Zǃ?þñAëÀ¹çž‹ï|ç;xþùçqàÀœwÞy+AÄHáóùðì³Ïâ¾ûîKXi6H¤Y 2 Ûíã?Æ\€[o½}}}I·_¾|9, ®ºê*üõ¯àOÑùË_þ‚K/½W\qEØö[¶lÏó˜>}zðxo¸á¼þúëY7AD¾yûí·1oÞ<¬\¹2+Q@q™C C²½éRmï Ó¦MÃgŸ}†… ÂçóA–e¬\¹ªÿßÞ‡×t­ÿjE«¦jn ‰')j*’j©”* ®Æ¥¿%NDH…J‘"Ä5tPÑš.÷65%J !T„"ƒ’Æ¥ •y:¿?Òìë ‘äìÈô~žÇvÖYY'O²ö{ÞµözkÔ`éÒ¥zmwíÚÅ… ?~¼²IqëÖ­ìܹSï)‰Âdee•ø} !DIDEE1|øpFÅÕ«WK܆“͇*1tcÜ+¯¼‚§§'o¾ùæSÛæ«<}út–,Y¢\OOO§{÷î$&&I“&MHIIÁÜÜœôôtΟ?Ï /¼ ´ÏÌ̤fÍšz}ïÙ³­VËæÍ›±°°0è=•”l>,Ù|øt²ù°èžõæÃ¤¤$<<<(Rý™ÂÈíL’1P‰¡¿ÑÑÑŒ1‚÷Þ{ï©ÑòСCÙ±csçÎÕ»þå—_‡³³³rþ——7oÞÄÕÕU/(¸rå íÚµÓ[^ÈÈÈÀÅÅ…ÄÄDZ´haÐûBˆÂ<œ5õ÷÷7((,º$0P‘¿œE-ï'ÜÝݽHç„;::R«V-Þ~ûmŽ;FRRîîî¼üòËzËZ­€M›6qåÊâââ9r$...lß¾½ÄcBT]ááá 0€É“'óÇÔ—Ï–Ϙå=<<055}by燙˜˜päÈêÕ«ÇàÁƒ111Q‚ƒü4ê÷ßOXX“&MbôèÑ@^q§ ðßÿþ·Ðñܺu‹\â÷$„¨¡C‡rþüy,--©W¯^‰Ç/„¨˜"""xóÍ75j”•ˆ<®XΨñH^ÇŽY²dÉc‚GݸqƒqãÆqúôilllèÓ§×®]cãÆT¯^ÿüç?X[[?ñµ§NbРAÔ¯_ŸèèhUN•Ç‹GW|:y\±èŠò¸bBBîîî|ýõ×rŒq%$ƒrFµµ˜˜Þ{ï=† Æ¥K— l×¢E ‚ƒƒñöö&**йsçÀk¯½Æ?þX`PpâÄ rrrprrz&ç© !Ê^VV«W¯V_“cŒ+'É”s†~J®Q£“'Ofþüù4hРжwïÞ Q£FʵœœœÇ>…Þ¹sš5kFxx85jÔàêÕ«œ>}šFÑ»woåzqIÆ x$cðt’1(º‚2AAAÌ™3‡ß~ûÍàï!·òM2圡@YYYøûûÓ¥KV¯^]h„ߨQ#½ àÌ™3¼òÊ+êµ[°`<`Ù²eÔ¨QNÇœ9s055eâĉ 6Œ®]»bÐØ…e/::šwß}—Q£FH– bÀ Pã))) '''z÷îÍÑ£G‹ôš={ö@DD„ríܹs|ûí· <˜!C†àééɪU«033#44”°°0:t耧OŸ.öX5 ÕªUÓû' –ÿó’ŒJÁý’ŸUÁòVýõZ­ öïßoPŸT,²”P©1©ÙØØàíí­W]ñI‚‚‚èÓ§òÔÁàÁƒ9uêááátìØ‘Ë—/caaA‹-8yò¤²\‘žžN›6m0`[¶l)°ÿ={öôiÓžzf‚¢ôeggóÍ7ß°páBeyÑr‹©xä£X¤Vyçž={âêêJrrrílmm• `ÇŽ;vŒ)S¦Ð±cG ïåÜÜ\-Z¤·‡¡víÚ4nܘ˜˜˜û^³f ãÆ#00РҫBu>|kkk¦M›fpP Y‚ŠKƒ ÌÐ?º´´4|}}‹\Þ¹wïÞL:åZDDFFFwpõêU®]»F‹-ž8nfÏžMïÞ½ ÁØØØ ÷"„(¹+W®`oo­­-¿þú«A}I@PñI`PÁ©ñGxëÖ-¦M›F¿~ý +°]Ó¦MñññÑË Ô©S‡ºuë>¶ÞÝÝÜÜÜdžŒŒ &L˜ÀŠ+=z4»wï¦~ýú_Q2)))¸»»caaÁÎ; êK‚ÊCƒJB?Ê3gÎ0hÐ ìííõJ5f̘1ܽ{—µk×*×V®\I`` =zôàƒ>P®ß»w·ß~›;v0kÖ,6nÜ(û „(:NµrÈùý‰ÊC6VBjlN¬[·.3fÌÀÑÑñ©Ï{;;;³råJLLLÐh4DFFÒ¼ysBBBhÕªqqqŒ1‚+W®àë닃ƒƒòú¬¬,&L˜À¬Y³èÙ³§ÁcBìôéÓ899qòäIƒû’ÛGå$A%¦F€Ð²eK,XÀرc mwôèQ¾ûî;nß¾™™Ÿ|ò‰r&ÂÙ³g±³³ãÁƒ|ýõרÚÚê½vÅŠ¸¸¸0þ|Ú·oO×®]éܹ³ÁcBüÏÍ›7ùüóÏÙºu«Á7t¹mTnTj}ûöÅËË‹®]»ëuû÷ïçÃ?¤N:ìØ±ƒ=zè}=ÿÅ(O?qãÓõë×ñóó£C‡>|˜Í›7sçÎ>ùäæÏŸÏsÏ=Çúõë?~<·nÝ¢W¯^˜™™Ñ¾}{úôéÃO?ý„‘‘€Þim E~ZBˆŠìÞ½{¸ººbiiÉÞ½{ îOñ(YJO¤V½z|||hݺ5'NdÛ¶mlÛ¶Mï £›7o’’’BÛ¶myî¹ç˜0aÛ·oÇÅÅ…=zðý÷ßóÃ?ðÒK/qÿþ}"##•~ßÿ}"""ˆŠŠReÜB”7¹¹¹lݺU‚`™úEA$0…R#@022âã?fΜ9øúúrñâÅ"-´mÛ–&MšèÝêææ†——S§NÅÇÇÈ+kkkKÇŽiРÙÙÙ|øá‡L:UµGˆ²täÈ´Z-.\0¸/™òÅÓÈR‚(”Ë ùå»uëF‡ ,ÒëzöìI||}øñÇ•±9::²víZ8€µµµÁãB-·nÝÂÃï¾úŠÜÜ\ƒû“)]J2Â`jLDW®\ÁÞÞ[[[~ýõ×§¶OOOç•W^ÁËËK ´Z-ooo%(ÈÎÎfïÞ½Ô«WSSS¥í·ß~Ë¢E‹ »%‘™™ÉêÕ«177gãÆrH‘PËse=Q9äOH†f>Œµµ5ãÇgÁ‚4jÔè‰íÌÍÍ«¼¸cÇŽ=Ê”)Sèܹ³r}Æ \»vY³f)G(߿ڴiC¯^½ÈÉÉaÀ€Ô®]Û ñ QAAAhµZ®]»fp_ µÉR‚(j•wvqqaÊ”)Ê¡GÑét˜››s÷î]Ο?¯”y~xƒbdd$õêÕò2 þþþT«V† r÷î]Z¶lÉ®]»ô‚ !Ô…““T¥?™¾Ei¥Q*Ô˜°îÝ»‡““ìß¿¿Ð¶†ÀÀ@6lØ ‹/V6(æQQQ¬[·ŽÆL\\ÁÁÁ\¿~yóæƒb×®] Uö" >œƒ²gÏäjÒ¤ Mš4ÁÔÔ”ØØXÞxã \]]y饗T¿¨z²²²X·nîîîÜ¿ßàþdºÏ‚d D©SëÓÍO?ýD÷îÝÑjµcÖ¬Yé5}ô[·ne÷îÝ 4H¹þÎ;ïÌþýûyýõ×ÿ-9ܹs‡ŒŒ å`š:¶A1É¡M›6œ8qBoÃcrr2‡&;;+++š4i¢ÊøEù“ššŠŸŸ~~~¤¥¥ÜŸL¿¢<’Œ(wÔúô΀ppp(tí÷á›ü† ˆå³Ï>ÓÛ 8þ|RRRðòòÒk¿oß>^{í5FÍØ±céÔ© .T¥Ž(?t:;wî¤GxxxHP *5ɈrM­ìÁóÏ?ÏôéÓ™={6µjÕ*°ÝƒX½z5Ó§OW6(^ºt † ÂŽ;”¶.\ ÿþT¯^åË—ceeÅwß}‡‡‡3gÎä‹/¾Peì¢l={­Vˉ'TéO¦\QÞI` *µ„:°`Á‚"—wðööfÁ‚mP´²²"22’;w2dÈåúäɓپ};ñññJÑ&Qñ$$$àîî.åE•#K ¢BPky!66{{{† ÆÅ‹‹ôšŽ;y›óSÈáááDFFòÖ[oé-[¶$33“øøxƒÇ+ž=µË!ƒ¢b‘À@T(jM°‡ÂÚÚšiÓ¦ñçŸÚvøðá,Z´ˆM›6ññÇÀ¸qãkÿóÏ?S­Z5š5k¦\»zõ*Û¶mãСCdee©ò„ú‚‚‚èÞ½;NNNE:vûiäiQI` *µ&Û¬¬,6n܈™™«W¯&''§À¶ŽŽŽ\¼x777à'*6hÐ@¯Ý¾}û8uêýúõãÅ_D§Ó1gÎLMM™8q"Æ £k×®„„„<ñû¤¥¥±råJ©ÏðŒEGG3bÄFÅÕ«W îOQ‘I` *,µ&ߤ¤$¥¼sa%q•#“‡JýúõñööVŽF>þ©©©• ÔõóÏ?ceeU¤ý%E!Ë¢²‘Œ¨”ÔÊãââÂĉ©V­xqô!C8sæ Jq&ÈÛˆhjjÊÀù÷¿ÿ @XXdøðázY¡žØØX.\ÈÎ;UéO¦NQYIÆ@TJj}Š»uë–RÞ9,,¬X¯­S§uëÖ}ìÓ¿»»;¹¹¹ÊY :­VK­Zµððð0xÌB_JJ îîîXZZJP DH` *5µ&ð_~ù…Aƒaoo_äó ÆŒÃÝ»wY»v­rmåʕңG>øà6oÞÌ/¿ü´iÓ”ÍwïÞ%**ŠììlUÞCU“››Ë–-[èÚµ+dddܧ,ˆª@–D•¡ÖòB~ygGGGj×®]h[gggV®\‰‰‰ †ÈÈHš7oNHH­Zµ"99SSS4 çÎSNJÜ´i3gÎ$++‹-Zàìì̤I“TUpúôi´Z-§NR¥?™&EU"Qe¨õiïÑòÎ…Yºt)ûöí£[·nãääĉ'”MË–-ãöíÛ,Z´H ÒÓÓqrrÂØØ˜mÛ¶1bÄf̘ƒƒC¡g-ˆ¼*˜ôë×O‚!JH2¢JR+{ЧO¼¼¼011)Öëèܹ3]ºtáÈ‘#ʘÒÓÓiÙ²%ÖÖÖìÙ³È;8iÛ¶mÈ OššÊÚµkY¶lY¡O’‡L¢ª’Œ¨’Ô\+ ÅÚÚîܹSä×8q‚ŒŒ þñè*µk׿³Ï>#88˜ÀÀ@ ï ‡õë×KPðAAAôìÙWWWU‚ÙG ª:Éz„ 0{öl>ýôSjÖ¬YhÛßÿ Z·nͦM›èÒ¥‹òµœœFŽÉ‘#G¦{÷¯2‰ˆˆÀÉɉcÇŽ©Ö§L‡BHÆ@@½O‰÷ïßÇÕÕKKKöîÝ[hÛ—_~™ƒÒ°aC233Ù²e áááT¯^]©ìçíímð¸*“?ÿü­VKß¾}U $K ÄÿH` ÄCÔº9ÄÄÄ`ggǰaøtéRíLLLØ»w/ffflܸ‘·Þz‹µk×’‘‘Áo¿ýFNNŽÞáHUYVV«W¯¦K—.øûû«²S!'K B@­å…5j0yòd\]]©_¿~íRRR˜7o6lòžÃþùçÙ¿?fffªŒ¥¢:t莎ŽDEE©ÒŸL{BL!žB­¡aÆ8;;3uêÔB7ÆÇÇóã?’™™É;ï¼£wèQUÜ9sØ·oŸj}Ê”'Dá$0¢Ô|¼ÑÌÌ OOOz÷î­ZŸ•ͽ{÷ðññaÕªUdffªÒ§LuBBƒš‚ ÞÞÞU:#ð¨ürÈ .äîÝ»ªô)SœÅ#% V€`ddÄÇÌœ9s”“«ªÃ‡ãääÄ… TëS¦7!ŠO!JHÍìAóæÍY¸p!|ðªýVW®\ÁÍÍMµÊ‡ †À@©y#ïÑ£^^^ôêÕKµ>Ë«””–/_ޝ¯/éééªô)Ó™†“À@•¨ h4ÆŒƒ»»;M›6U¥ÏòD§ÓÈüùó¹}û¶ªý ! '*R3{P·n]f̘Q¤òÎÅ™3gÐjµœe B]Q Ô ÚµkÇÂ… 9r¤j}>k7oÞäóÏ?gëÖ­ªÝÈeê¢tH` D)R3@xã7ðôô¤k×®ªõYÚÒÒÒX³fªåA‚!J“B<jÕªUãý÷ßgéÒ¥4jÔH•>KKPPZ­–k×®©Ö§LWB”> „xFÔ̼ð 8::©¼ó³vîÜ9œœœ8zô¨j}Ê4%ij#ϘšBÇŽY¶lC† Q­Ï’JLLdÉ’%¨Rù$ ¢,H` DQ3@èß¿?>>>¼úꫪõYTYYY¬[·ŽÅ‹ó×_©Ö¯LMB” „(CF¨!µ¼³š:„V«åÒ¥Kªõ)S’eK!Ê5³E-ïlˆ˜˜œÙ»w¯j}ÊT$Dù 刚‚¹¹9žžž¼þúëªõyÿþ}¼½½U-‡ èt:]Õ*!D9&åŒF£Éj©ÕŸ >>>´nݺÄ}äææ²uëV\\\¸sçŽZC“,åB”SjfêÔ©ÃÔ©SKTÞ944­VËùóçUL;B”_QΕUyçë×¯ãææF`` jßÈÔétåëà!„ „¨ Ô zö쉗—–––}-55???UË!ƒd „¨($0¢Ñh4ÙÀsjô•¼²‡‡Mš4A§Ó±k×.\\\ˆWã[QÑH` D¤fö ~ýú|úé§ìß¿ŸÓ§O«Ö¯L-BTLQ© ¨([§Ó©’ÕB<{ÕÊzBˆ’û;®W¯ž±t:Q±IÆ@ˆJB£ÑäRFÁ¾L#BT’1¢’ÐétÕÊà,A•‹BT2ߨãJùÛäþ½lP¼Ó’„åž,%Q‰i4št ¶š}Ê”!Då&!*1NWûï¹wóëQùIÆ@ˆ*¤„7¦êtº:jEQ>IÆ@ˆ*äïϽ¹ „¨Z$c DUXyg™„¨º$c D¥Óéjýd>tùW „¨Ú$c „@£Ñ´×étWÊzBˆ²÷ÿyy4›¿2 IEND®B`‚pammtools/man/add_hazard.Rd0000644000176200001440000000715714222504522015420 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/add-functions.R \name{add_hazard} \alias{add_hazard} \alias{add_hazard.default} \alias{add_cumu_hazard} \title{Add predicted (cumulative) hazard to data set} \usage{ add_hazard(newdata, object, ...) \method{add_hazard}{default}( newdata, object, reference = NULL, type = c("response", "link"), ci = TRUE, se_mult = 2, ci_type = c("default", "delta", "sim"), overwrite = FALSE, time_var = NULL, ... ) add_cumu_hazard( newdata, object, ci = TRUE, se_mult = 2, overwrite = FALSE, time_var = NULL, interval_length = "intlen", ... ) } \arguments{ \item{newdata}{ A data frame or list containing the values of the model covariates at which predictions are required. If this is not provided then predictions corresponding to the original data are returned. If \code{newdata} is provided then it should contain all the variables needed for prediction: a warning is generated if not. See details for use with \code{link{linear.functional.terms}}. } \item{object}{ a fitted \code{gam} object as produced by \code{gam()}. } \item{...}{Further arguments passed to \code{\link[mgcv]{predict.gam}} and \code{\link{get_hazard}}} \item{reference}{A data frame with number of rows equal to \code{nrow(newdata)} or one, or a named list with (partial) covariate specifications. See examples.} \item{type}{Either \code{"response"} or \code{"link"}. The former calculates hazard, the latter the log-hazard.} \item{ci}{\code{logical}. Indicates if confidence intervals should be calculated. Defaults to \code{TRUE}.} \item{se_mult}{Factor by which standard errors are multiplied for calculating the confidence intervals.} \item{ci_type}{The method by which standard errors/confidence intervals will be calculated. Default transforms the linear predictor at respective intervals. \code{"delta"} calculates CIs based on the standard error calculated by the Delta method. \code{"sim"} draws the property of interest from its posterior based on the normal distribution of the estimated coefficients. See \href{https://adibender.github.io/simpamm/confidence-intervals.html}{here} for details and empirical evaluation.} \item{overwrite}{Should hazard columns be overwritten if already present in the data set? Defaults to \code{FALSE}. If \code{TRUE}, columns with names \code{c("hazard", "se", "lower", "upper")} will be overwritten.} \item{time_var}{Name of the variable used for the baseline hazard. If not given, defaults to \code{"tend"} for \code{\link[mgcv]{gam}} fits, else \code{"interval"}. The latter is assumed to be a factor, the former numeric.} \item{interval_length}{The variable in newdata containing the interval lengths. Can be either bare unquoted variable name or character. Defaults to \code{"intlen"}.} } \description{ Add (cumulative) hazard based on the provided data set and model. If \code{ci=TRUE} confidence intervals (CI) are also added. Their width can be controlled via the \code{se_mult} argument. The method by which the CI are calculated can be specified by \code{ci_type}. This is a wrapper around \code{\link[mgcv]{predict.gam}}. When \code{reference} is specified, the (log-)hazard ratio is calculated. } \examples{ ped <- tumor[1:50,] \%>\% as_ped(Surv(days, status)~ age) pam <- mgcv::gam(ped_status ~ s(tend)+age, data = ped, family=poisson(), offset=offset) ped_info(ped) \%>\% add_hazard(pam, type="link") ped_info(ped) \%>\% add_hazard(pam, type = "response") ped_info(ped) \%>\% add_cumu_hazard(pam) } \seealso{ \code{\link[mgcv]{predict.gam}}, \code{\link[pammtools]{add_surv_prob}} } pammtools/man/make_X.Rd0000644000176200001440000000113714767027042014546 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/add-functions.R \name{make_X} \alias{make_X} \alias{make_X.default} \alias{make_X.gam} \title{Create design matrix from a suitable object} \usage{ make_X(object, ...) \method{make_X}{default}(object, newdata, ...) \method{make_X}{gam}(object, newdata, ...) } \arguments{ \item{object}{A suitable object from which a design matrix can be generated. Often a model object.} \item{newdata}{A data frame from which design matrix will be constructed} } \description{ Create design matrix from a suitable object } \keyword{internal} pammtools/man/get_cumu_eff.Rd0000644000176200001440000000243314222504522015757 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/cumulative-effect.R, R/viz-elra.R \name{get_cumu_eff} \alias{get_cumu_eff} \alias{gg_cumu_eff} \title{Calculate (or plot) cumulative effect for all time-points of the follow-up} \usage{ get_cumu_eff(data, model, term, z1, z2 = NULL, se_mult = 2) gg_cumu_eff(data, model, term, z1, z2 = NULL, se_mult = 2, ci = TRUE) } \arguments{ \item{data}{Data used to fit the \code{model}.} \item{model}{A suitable model object which will be used to estimate the partial effect of \code{term}.} \item{term}{A character string indicating the model term for which partial effects should be plotted.} \item{z1}{The exposure profile for which to calculate the cumulative effect. Can be either a single number or a vector of same length as unique observation time points.} \item{z2}{If provided, calculated cumulative effect is for the difference between the two exposure profiles (g(z1,t)-g(z2,t)).} \item{se_mult}{Multiplicative factor used to calculate confidence intervals (e.g., lower = fit - 2*se).} \item{ci}{Logical. Indicates if confidence intervals for the \code{term} of interest should be calculated/plotted. Defaults to \code{TRUE}.} } \description{ Calculate (or plot) cumulative effect for all time-points of the follow-up } pammtools/man/get_term.Rd0000644000176200001440000000114514767027042015147 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/get-terms.R \name{get_term} \alias{get_term} \title{Extract partial effects for specified model terms} \usage{ get_term(data, fit, term, n = 100, ...) } \arguments{ \item{data}{A data frame containing variables used to fit the model. Only first row will be used.} \item{fit}{A fitted object of class \code{\link[mgcv]{gam}}.} \item{term}{The (non-linear) model term of interest.} \item{...}{Further arguments passed to \code{\link{seq_range}}.} } \description{ Extract partial effects for specified model terms } \keyword{internal} pammtools/man/simdf_elra.Rd0000644000176200001440000000122214222504522015427 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/data.R \docType{data} \name{simdf_elra} \alias{simdf_elra} \title{Simulated data with cumulative effects} \format{ An object of class \code{nested_fdf} (inherits from \code{sim_df}, \code{tbl_df}, \code{tbl}, \code{data.frame}) with 250 rows and 9 columns. } \usage{ simdf_elra } \description{ This is data simulated using the \code{\link[pammtools]{sim_pexp}} function. It contains two time-constant and two time-dependent covariates (observed on different exposure time grids). The code used for simulation is contained in the examples of \code{?sim_pexp}. } \keyword{datasets} pammtools/man/prep_concurrent.Rd0000644000176200001440000000104713662013606016544 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-specials.R \name{prep_concurrent} \alias{prep_concurrent} \alias{prep_concurrent.list} \title{Extract information on concurrent effects} \usage{ prep_concurrent(x, formula, ...) \method{prep_concurrent}{list}(x, formula, ...) } \arguments{ \item{x}{A suitable object from which variables contained in \code{formula} can be extracted.} \item{...}{Further arguments passed to methods.} } \description{ Extract information on concurrent effects } \keyword{internal} pammtools/man/combine_df.Rd0000644000176200001440000000112214222504522015406 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/make-newdata.R \name{combine_df} \alias{combine_df} \title{Create a data frame from all combinations of data frames} \usage{ combine_df(...) } \arguments{ \item{...}{Data frames that should be combined to one data frame. Elements of first df vary fastest, elements of last df vary slowest.} } \description{ Works like \code{\link[base]{expand.grid}} but for data frames. } \examples{ combine_df( data.frame(x=1:3, y=3:1), data.frame(x1=c("a", "b"), x2=c("c", "d")), data.frame(z=c(0, 1))) } \keyword{internal} pammtools/man/compute_cumu_diff.Rd0000644000176200001440000000140014222504522017015 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/cumulative-coefficient.R \name{compute_cumu_diff} \alias{compute_cumu_diff} \title{Calculate difference in cumulative hazards and respective standard errors} \usage{ compute_cumu_diff(d1, d2, model, alpha = 0.05, nsim = 100L) } \arguments{ \item{d1}{A data set used as \code{newdata} in \code{predict.gam}} \item{d2}{See \code{d1}} \item{model}{A model object for which a predict method is implemented which returns the design matrix (e.g., \code{mgcv::gam}).} } \description{ CIs are calculated by sampling coefficients from their posterior and calculating the cumulative hazard difference \code{nsim} times. The CI are obtained by the 2.5\\% and 97.5\\% quantiles. } \keyword{internal} pammtools/man/gg_re.Rd0000644000176200001440000000141314222504522014407 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/convenience-plots.R \name{gg_re} \alias{gg_re} \title{Plot Normal QQ plots for random effects} \usage{ gg_re(x, ...) } \arguments{ \item{x}{ a fitted \code{gam} object as produced by \code{gam()}.} \item{...}{Further arguments passed to \code{\link[mgcv]{plot.gam}}} } \description{ Plot Normal QQ plots for random effects } \examples{ library(pammtools) data("patient") ped <- patient \%>\% dplyr::slice(1:100) \%>\% as_ped(Surv(Survdays, PatientDied)~ ApacheIIScore + CombinedicuID, id="CombinedID") pam <- mgcv::gam(ped_status ~ s(tend) + ApacheIIScore + s(CombinedicuID, bs="re"), data=ped, family=poisson(), offset=offset) gg_re(pam) plot(pam, select = 2) } \seealso{ \code{\link{tidy_re}} } pammtools/man/patient.Rd0000644000176200001440000000244414222504522014775 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/data.R \docType{data} \name{patient} \alias{patient} \title{Survival data of critically ill ICU patients} \format{ An object of class \code{data.frame} with 2000 rows and 12 columns. } \usage{ patient } \description{ A data set containing the survival time (or hospital release time) among other covariates. The full data is available \href{https://github.com/adibender/elra-biostats}{here}. The following variables are provided: \describe{ \item{Year}{The year of ICU Admission} \item{CombinedicuID}{Intensive Care Unit (ICU) ID} \item{CombinedID}{Patient identificator} \item{Survdays}{Survival time of patients. Here it is assumed that patients survive until t=30 if released from hospital.} \item{PatientDied}{Status indicator; 1=death, 0=censoring} \item{survhosp}{Survival time in hospital. Here it is assumed that patients are censored at time of hospital release (potentially informative)} \item{Gender}{Male or female} \item{Age}{The patients age at Admission} \item{AdmCatID}{Admission category: medical, surgical elective or surgical emergency} \item{ApacheIIScore}{The patient's Apache II Score at Admission} \item{BMI}{Patient's Body Mass Index} \item{DiagID2}{Diagnosis at admission in 9 categories} } } \keyword{datasets} pammtools/man/warn_about_new_time_points.Rd0000644000176200001440000000063714222504522020757 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/warnings.R \name{warn_about_new_time_points} \alias{warn_about_new_time_points} \alias{warn_about_new_time_points.pamm} \title{Warn if new t_j are used} \usage{ warn_about_new_time_points(object, newdata, ...) \method{warn_about_new_time_points}{pamm}(object, newdata, ...) } \description{ Warn if new t_j are used } \keyword{internal} pammtools/man/int_info.Rd0000644000176200001440000000311114222504522015126 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/interval-information.R \name{int_info} \alias{int_info} \alias{int_info.default} \alias{int_info.data.frame} \alias{int_info.ped} \alias{int_info.pamm} \title{Create start/end times and interval information} \usage{ int_info(x, ...) \method{int_info}{default}(x, min_time = 0L, ...) \method{int_info}{data.frame}(x, min_time = 0L, ...) \method{int_info}{ped}(x, ...) \method{int_info}{pamm}(x, ...) } \arguments{ \item{x}{A numeric vector of cut points in which the follow-up should be partitioned in or object of class \code{ped}.} \item{...}{Currently ignored.} \item{min_time}{Only intervals that have lower borders larger than this value will be included in the resulting data frame.} } \value{ A data frame containing the start and end times of the intervals specified by the \code{x} argument. Additionally, the interval length, interval mid-point and a factor variable indicating the intervals. } \description{ Given interval breaks points, returns data frame with information on interval start time, interval end time, interval length and a factor variable indicating the interval (left open intervals). If an object of class \code{ped} is provided, extracts unique interval information from object. } \examples{ ## create interval information from cut points int_info(c(1, 2.3, 5)) ## extract interval information used to create ped object tdf <- data.frame(time=c(1, 2.3, 5), status=c(0, 1, 0)) ped <- tdf \%>\% as_ped(Surv(time, status)~., id="id") int_info(ped) } \seealso{ as_ped ped_info } \keyword{internal} pammtools/man/gg_tensor.Rd0000644000176200001440000000165713662013606015332 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/convenience-plots.R \name{gg_tensor} \alias{gg_tensor} \title{Plot tensor product effects} \usage{ gg_tensor(x, ci = FALSE, ...) } \arguments{ \item{x}{ a fitted \code{gam} object as produced by \code{gam()}.} \item{ci}{A logical value indicating whether confidence intervals should be calculated and returned. Defaults to \code{TRUE}.} \item{...}{Further arguments passed to \code{\link[mgcv]{plot.gam}}} } \description{ Given a gam model this convenience function returns a \code{ggplot2} object depicting 2d smooth terms specified in the model as heat/contour plots. If more than one 2d smooth term is present individual terms are faceted. } \examples{ g <- mgcv::gam(Sepal.Length ~ te(Sepal.Width, Petal.Length), data=iris) gg_tensor(g) gg_tensor(g, ci=TRUE) gg_tensor(update(g, .~. + te(Petal.Width, Petal.Length))) } \seealso{ \code{\link{tidy_smooth2d}} } pammtools/man/add_cif.Rd0000644000176200001440000000366214767027042014720 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/add-functions.R \name{add_cif} \alias{add_cif} \alias{add_cif.default} \title{Add cumulative incidence function to data} \usage{ add_cif(newdata, object, ...) \method{add_cif}{default}( newdata, object, ci = TRUE, overwrite = FALSE, alpha = 0.05, nsim = 500L, cause_var = "cause", time_var = NULL, ... ) } \arguments{ \item{newdata}{ A data frame or list containing the values of the model covariates at which predictions are required. If this is not provided then predictions corresponding to the original data are returned. If \code{newdata} is provided then it should contain all the variables needed for prediction: a warning is generated if not. See details for use with \code{link{linear.functional.terms}}. } \item{object}{ a fitted \code{gam} object as produced by \code{gam()}. } \item{...}{Further arguments passed to \code{\link[mgcv]{predict.gam}} and \code{\link{get_hazard}}} \item{ci}{\code{logical}. Indicates if confidence intervals should be calculated. Defaults to \code{TRUE}.} \item{overwrite}{Should hazard columns be overwritten if already present in the data set? Defaults to \code{FALSE}. If \code{TRUE}, columns with names \code{c("hazard", "se", "lower", "upper")} will be overwritten.} \item{alpha}{The alpha level for confidence/credible intervals.} \item{nsim}{Number of simulations (draws from posterior of estimated coefficients) on which estimation of CIFs and their confidence/credible intervals will be based on.} \item{cause_var}{Character. Column name of the 'cause' variable.} \item{time_var}{Name of the variable used for the baseline hazard. If not given, defaults to \code{"tend"} for \code{\link[mgcv]{gam}} fits, else \code{"interval"}. The latter is assumed to be a factor, the former numeric.} } \description{ Add cumulative incidence function to data } pammtools/man/tidy_fixed.Rd0000644000176200001440000000145214222504522015457 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tidiers.R \name{tidy_fixed} \alias{tidy_fixed} \alias{tidy_fixed.gam} \alias{tidy_fixed.coxph} \title{Extract fixed coefficient table from model object} \usage{ tidy_fixed(x, ...) \method{tidy_fixed}{gam}(x, intercept = FALSE, ...) \method{tidy_fixed}{coxph}(x, ...) } \arguments{ \item{x}{A model object.} \item{...}{Currently not used.} \item{intercept}{Should intercept also be returned? Defaults to \code{FALSE}.} } \description{ Given a model object, returns a data frame with columns \code{variable}, \code{coef} (coefficient), \code{ci_lower} (lower 95\\% CI) and \code{ci_upper} (upper 95\\% CI). } \examples{ library(survival) gc <- coxph(Surv(days, status)~age + sex, data = tumor) tidy_fixed(gc) } \keyword{internal} pammtools/man/warn_about_new_time_points.glm.Rd0000644000176200001440000000052614767026617021554 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/warnings.R \name{warn_about_new_time_points.glm} \alias{warn_about_new_time_points.glm} \title{Warn if new t_j are used} \usage{ \method{warn_about_new_time_points}{glm}(object, newdata, time_var, ...) } \description{ Warn if new t_j are used } \keyword{internal} pammtools/man/ped_info.Rd0000644000176200001440000000153714222504522015116 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/interval-information.R \name{ped_info} \alias{ped_info} \alias{ped_info.ped} \title{Extract interval information and median/modus values for covariates} \usage{ ped_info(ped) \method{ped_info}{ped}(ped) } \arguments{ \item{ped}{An object of class \code{ped} as returned by \code{\link[pammtools]{as_ped}}.} } \value{ A data frame with one row for each unique interval in \code{ped}. } \description{ Given an object of class \code{ped}, returns data frame with one row for each interval containing interval information, mean values for numerical variables and modus for non-numeric variables in the data set. } \examples{ ped <- tumor[1:4,] \%>\% as_ped(Surv(days, status)~ sex + age) ped_info(ped) } \seealso{ \code{\link[pammtools]{int_info}}, \code{\link[pammtools]{sample_info}} } pammtools/man/sample_info.Rd0000644000176200001440000000207413662013606015631 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/make-newdata.R \name{sample_info} \alias{sample_info} \alias{sample_info.data.frame} \alias{sample_info.ped} \alias{sample_info.fped} \title{Extract information of the sample contained in a data set} \usage{ sample_info(x) \method{sample_info}{data.frame}(x) \method{sample_info}{ped}(x) \method{sample_info}{fped}(x) } \arguments{ \item{x}{A data frame (or object that inherits from \code{data.frame}).} } \value{ A data frame containing sample information (for each group). If applied to an object of class \code{ped}, the sample means of the original data is returned. Note: When applied to a \code{ped} object, that doesn't contain covariates (only interval information), returns data frame with 0 columns. } \description{ Given a data set and grouping variables, this function returns mean values for numeric variables and modus for characters and factors. Usually this function should not be called directly but will rather be called as part of a call to \code{make_newdata}. } \keyword{internal} pammtools/man/get_cumu_hazard.Rd0000644000176200001440000000421014222504522016463 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/add-functions.R \name{get_cumu_hazard} \alias{get_cumu_hazard} \title{Calculate cumulative hazard} \usage{ get_cumu_hazard( newdata, object, ci = TRUE, ci_type = c("default", "delta", "sim"), time_var = NULL, se_mult = 2, interval_length = "intlen", nsim = 100L, ... ) } \arguments{ \item{newdata}{ A data frame or list containing the values of the model covariates at which predictions are required. If this is not provided then predictions corresponding to the original data are returned. If \code{newdata} is provided then it should contain all the variables needed for prediction: a warning is generated if not. See details for use with \code{link{linear.functional.terms}}. } \item{object}{ a fitted \code{gam} object as produced by \code{gam()}. } \item{ci}{\code{logical}. Indicates if confidence intervals should be calculated. Defaults to \code{TRUE}.} \item{ci_type}{The method by which standard errors/confidence intervals will be calculated. Default transforms the linear predictor at respective intervals. \code{"delta"} calculates CIs based on the standard error calculated by the Delta method. \code{"sim"} draws the property of interest from its posterior based on the normal distribution of the estimated coefficients. See \href{https://adibender.github.io/simpamm/confidence-intervals.html}{here} for details and empirical evaluation.} \item{time_var}{Name of the variable used for the baseline hazard. If not given, defaults to \code{"tend"} for \code{\link[mgcv]{gam}} fits, else \code{"interval"}. The latter is assumed to be a factor, the former numeric.} \item{se_mult}{Factor by which standard errors are multiplied for calculating the confidence intervals.} \item{interval_length}{The variable in newdata containing the interval lengths. Can be either bare unquoted variable name or character. Defaults to \code{"intlen"}.} \item{...}{Further arguments passed to \code{\link[mgcv]{predict.gam}} and \code{\link{get_hazard}}} } \description{ Calculate cumulative hazard } \keyword{internal} pammtools/man/tidy_smooth2d.Rd0000644000176200001440000000124214222504522016114 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tidiers.R \name{tidy_smooth2d} \alias{tidy_smooth2d} \title{Extract 2d smooth objects in tidy format.} \usage{ tidy_smooth2d( x, keep = c("x", "y", "fit", "se", "xlab", "ylab", "main"), ci = FALSE, ... ) } \arguments{ \item{x}{ a fitted \code{gam} object as produced by \code{gam()}.} \item{keep}{A vector of variables to keep.} \item{ci}{A logical value indicating whether confidence intervals should be calculated and returned. Defaults to \code{TRUE}.} \item{...}{Further arguments passed to \code{\link[mgcv]{plot.gam}}} } \description{ Extract 2d smooth objects in tidy format. } pammtools/man/get_plotinfo.Rd0000644000176200001440000000102413662013606016020 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tidiers.R \name{get_plotinfo} \alias{get_plotinfo} \title{Extract plot information for all special model terms} \usage{ get_plotinfo(x, ...) } \arguments{ \item{x}{ a fitted \code{gam} object as produced by \code{gam()}.} \item{...}{Further arguments passed to \code{\link[mgcv]{plot.gam}}} } \description{ Given a \code{mgcv} \code{\link[mgcv]{gamObject}}, returns the information used for the default plots produced by \code{\link[mgcv]{plot.gam}}. } pammtools/man/add_trans_prob.Rd0000644000176200001440000000561215143606362016322 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/add-functions.R \name{add_trans_prob} \alias{add_trans_prob} \title{Add transition probabilities} \usage{ add_trans_prob( newdata, object, overwrite = FALSE, ci = FALSE, alpha = 0.05, nsim = 100L, time_var = NULL, interval_length = "intlen", ... ) } \arguments{ \item{newdata}{A data frame or list containing the values of the model covariates at which predictions are required. If this is not provided then predictions corresponding to the original data are returned. If newdata is provided then it should contain all the variables needed for prediction: a warning is generated if not. See details for use with \link[mgcv]{linear.functional.terms}.} \item{object}{A fitted \code{gam} object as produced by \code{mgcv::gam}} \item{overwrite}{Should transition probability columns be overwritten if already present in the data set? Defaults to \code{FALSE}. If \code{TRUE}, columns with names \code{c("trans_prob", "trans_upper", "trans_lower")} will be overwritten.} \item{ci}{\code{Logical}, defaults to \code{TRUE}. Decides if confidence intervals for transition probabilities are calculated.} \item{alpha}{Sets the confidence intervals' \eqn{\alpha} level, Defaults to \code{0.05}} \item{nsim}{Sets the number of iterations for simulated confidence intervals. Defaults to \code{100L}} \item{time_var}{Name of the variable used for the baseline hazard. If not given, defaults to \code{"tend"} for \code{\link[mgcv]{gam}} fits, else \code{"interval"}. The latter is assumed to be a factor, the former numeric.} \item{interval_length}{\code{Character}, defaults to \code{"intlen"}. contains the interval length in \code{newdata}.} \item{...}{Further arguments passed to underlying methods.} } \description{ \code{add_trans_prob} adds transition probabilities on the provided data set and model. Optionally, confidence intervals (CI) are added if \code{ci=TRUE}. The function builds on cumulative hazards \code{cumu_hazard} and \code{mgcv::gam} models. } \examples{ \dontshow{if (require("mstate")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} data("prothr", package = "mstate") prothr <- prothr |> mutate(transition = as.factor(paste0(from, "->", to)) , treat = as.factor(treat)) |> filter(Tstart != Tstop, id <= 100) |> select(-trans) ped <- as_ped(data= prothr, formula= Surv(Tstart, Tstop, status)~ ., transition = "transition", id= "id", timescale = "calendar") pam <- mgcv::bam(ped_status ~ s(tend, by=transition) + transition * treat, data = ped, family = poisson(), offset = offset, method = "fREML", discrete = TRUE) ndf <- make_newdata(ped, tend = unique(tend), treat = unique(treat), transition = unique(transition)) |> group_by(treat, transition) |> # important! arrange(treat, transition, tend) |> add_trans_prob(pam) \dontshow{\}) # examplesIf} } pammtools/man/get_event_types.Rd0000644000176200001440000000257614222504522016543 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/as-ped.R \name{get_event_types} \alias{get_event_types} \title{Exctract event types} \usage{ get_event_types(data, formula, censor_code) } \arguments{ \item{data}{Either an object inheriting from data frame or in case of time-dependent covariates a list of data frames (of length 2), where the first data frame contains the time-to-event information and static covariates while the second (and potentially further data frames) contain information on time-dependent covariates and the times at which they have been observed.} \item{formula}{A two sided formula with a \code{\link[survival]{Surv}} object on the left-hand-side and covariate specification on the right-hand-side (RHS). The RHS can be an extended formula, which specifies how TDCs should be transformed using specials \code{concurrent} and \code{cumulative}. The left hand-side can be in start-stop-notation. This, however, is only used to create left-truncated data and does not support the full functionality.} \item{censor_code}{Specifies the value of the status variable that indicates censoring. Often this will be \code{0}, which is the default.} } \description{ Given a formula that specifies the status variable of the outcome, this function extracts the different event types (except for censoring, specified by \code{censor_code}). } \keyword{internal} pammtools/man/get_ped_form.Rd0000644000176200001440000000077214222504522015765 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-utils.R \name{get_ped_form} \alias{get_ped_form} \title{Extract variables from the left-hand-side of a formula} \usage{ get_ped_form( formula, data = NULL, tdc_specials = c("concurrent", "cumulative") ) } \arguments{ \item{formula}{A \code{\link{formula}} object.} } \description{ Extract variables from the left-hand-side of a formula Extract variables from the right-hand side of a formula } \keyword{internal} pammtools/man/staph.Rd0000644000176200001440000000135314222504522014446 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/data.R \docType{data} \name{staph} \alias{staph} \title{Time until staphylococcus aureaus infection in children, with possible recurrence} \format{ An object of class \code{tbl_df} (inherits from \code{tbl}, \code{data.frame}) with 374 rows and 6 columns. } \usage{ staph } \description{ This dataset originates from the Drakenstein child health study. The data contains the following variables: \describe{ \item{id}{Randomly generated unique child ID} \item{t.start}{The time at which the child enters the risk set for the $k$-th event} \item{t.stop}{Time of $k$-th infection or censoring}. \item{enum}{Event number. Maximum of 6.} \item{hiv}{} } } \keyword{datasets} pammtools/man/calc_ci.Rd0000644000176200001440000000077614222504522014714 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tidiers.R \name{calc_ci} \alias{calc_ci} \title{Calculate confidence intervals} \usage{ calc_ci(ftab) } \arguments{ \item{ftab}{A table with two columns, containing coefficients in the first column and standard-errors in the second column.} } \description{ Given 2 column matrix or data frame, returns 3 column data.frame with coefficient estimate plus lower and upper borders of the 95\% confidence intervals. } \keyword{internal} pammtools/man/as.data.frame.crps.Rd0000644000176200001440000000214214222504522016676 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/model-evaluation.R \name{as.data.frame.crps} \alias{as.data.frame.crps} \title{Transform crps object to data.frame} \usage{ \method{as.data.frame}{crps}(x, row.names = NULL, optional = FALSE, ...) } \arguments{ \item{x}{An object of class \code{crps}. See \code{\link[pec]{crps}}.} \item{row.names}{\code{NULL} or a character vector giving the row names for the data frame. Missing values are not allowed.} \item{optional}{logical. If \code{TRUE}, setting row names and converting column names (to syntactic names: see \code{\link[base]{make.names}}) is optional. Note that all of \R's \pkg{base} package \code{as.data.frame()} methods use \code{optional} only for column names treatment, basically with the meaning of \code{\link[base]{data.frame}(*, check.names = !optional)}. See also the \code{make.names} argument of the \code{matrix} method.} \item{...}{additional arguments to be passed to or from methods.} } \description{ A\code{as.data.frame} S3 method for objects of class \code{\link[pec]{crps}}. } pammtools/man/specials.Rd0000644000176200001440000000475514222504522015143 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-specials.R \name{cumulative} \alias{cumulative} \alias{concurrent} \alias{has_special} \title{Formula specials for defining time-dependent covariates} \usage{ cumulative(..., tz_var, ll_fun = function(t, tz) t >= tz, suffix = NULL) concurrent(..., tz_var, lag = 0, suffix = NULL) has_special(formula, special = "cumulative") } \arguments{ \item{...}{For \code{concurrent} variables that will be transformed to covariate matrices. The number of columns of each covariate depends on \code{tz}. Usually, elements that will be specified here are \code{time} (which should be the name of the time-variable used on the LHS of the formula argument to \code{as_ped}), \code{tz} which is the variable containing information on the times at which the TDC was observed (can be wrapped in \code{latency}) and the TDCs that share the same \code{tz} and Lag-lead window (\code{ll_fun}).} \item{tz_var}{The name of the variable that stores information on the times at which the TDCs specified in this term where observed.} \item{ll_fun}{Function that specifies how the lag-lead matrix should be constructed. First argument is the follow up time second argument is the time of exposure.} \item{lag}{a single positive number giving the time lag between for a concurrent effect to occur (i.e., the TDC at time of exposure \code{t-lag} affects the hazard in the interval containing follow-up time \code{t}). Defaults to 0.} \item{formula}{A two sided formula with a \code{\link[survival]{Surv}} object on the left-hand-side and covariate specification on the right-hand-side (RHS). The RHS can be an extended formula, which specifies how TDCs should be transformed using specials \code{concurrent} and \code{cumulative}. The left hand-side can be in start-stop-notation. This, however, is only used to create left-truncated data and does not support the full functionality.} \item{special}{The name of the special whose existence in the \code{formula} should be checked} } \description{ So far, two specials are implemented. \code{concurrent} is used when the goal is to estimate a concurrent effect of the TDC. \code{cumulative} is used when the goal is to estimate a cumulative effect of the TDC. These should usually not be called directly but rather as part of the \code{formula} argument to \code{as_ped}. See the \href{https://adibender.github.io/pammtools//articles/data-transformation.html}{vignette on data transformation} for details. } \keyword{internal} pammtools/man/get_cumulative.Rd0000644000176200001440000000157713662013606016361 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-specials.R \name{get_cumulative} \alias{get_cumulative} \alias{expand_cumulative} \title{Expand time-dependent covariates to functionals} \usage{ get_cumulative(data, formula) expand_cumulative(data, func, n_func) } \arguments{ \item{data}{Data frame (or similar) in which variables specified in ... will be looked for} \item{formula}{A formula containing \code{cumulative} specials, that specify the type of cumulative effect one wants to estimate. For details see the vignettes on data transformation and time-dependent covariates.} \item{func}{Single evaluated \code{\link{cumulative}} term.} } \description{ Given formula specification on how time-dependent covariates affect the outcome, creates respective functional covariate as well as auxiliary matrices for time/latency etc. } \keyword{internal} pammtools/man/rpexp.Rd0000644000176200001440000000056415144603250014472 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rpexp.R \name{rpexp} \alias{rpexp} \title{Draw random numbers from piece-wise exponential distribution.} \usage{ rpexp(n = 1, rate = 1, t = 0) } \description{ This is a copy of the same function from \code{rpexp} from package \pkg{msm}. Copied here to reduce dependencies. } \keyword{internal} pammtools/man/seq_range.Rd0000644000176200001440000000265414222504522015300 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/helpers.R \name{seq_range} \alias{seq_range} \title{Generate a sequence over the range of a vector} \usage{ seq_range(x, n, by, trim = NULL, expand = NULL, pretty = FALSE) } \arguments{ \item{x}{A numeric vector} \item{n, by}{Specify the output sequence either by supplying the length of the sequence with \code{n}, or the spacing between value with \code{by}. Specifying both is an error. I recommend that you name these arguments in order to make it clear to the reader.} \item{trim}{Optionally, trim values off the tails. \code{trim / 2 * length(x)} values are removed from each tail.} \item{expand}{Optionally, expand the range by \code{expand * (1 + range(x)} (computed after trimming).} \item{pretty}{If \code{TRUE}, will generate a pretty sequence. If \code{n} is supplied, this will use \code{\link{pretty}()} instead of \code{\link{seq}()}. If \code{by} is supplied, it will round the first value to a multiple of \code{by}.} } \description{ Stolen from \href{https://github.com/tidyverse/modelr/blob/master/R/seq_range.R}{here} } \examples{ x <- rcauchy(100) seq_range(x, n = 10) seq_range(x, n = 10, trim = 0.1) seq_range(x, by = 1, trim = 0.1) # Make pretty sequences y <- runif (100) seq_range(y, n = 10) seq_range(y, n = 10, pretty = TRUE) seq_range(y, n = 10, expand = 0.5, pretty = TRUE) seq_range(y, by = 0.1) seq_range(y, by = 0.1, pretty = TRUE) } pammtools/DESCRIPTION0000644000176200001440000000530415144617062014003 0ustar liggesusersPackage: pammtools Title: Piece-Wise Exponential Additive Mixed Modeling Tools for Survival Analysis Version: 0.7.4 Date: 2026-02-16 Authors@R: c( person("Andreas", "Bender", , "andreas.bender@stat.uni-muenchen.de", role = c("aut", "cre"), comment=c(ORCID = "0000-0001-5628-8611")), person("Fabian", "Scheipl", , "fabian.scheipl@stat.uni-muenchen.de", role = c("aut"), comment = c(ORCID = "0000-0001-8172-3603")), person("Johannes", "Piller", , "johannes.piller@lmu.de", role = c("aut"), comment = c(ORCID = "0009-0008-3010-9556")), person("Philipp", "Kopper", , "philipp.kopper@stat.uni-muenchen.de", role = c("aut"), comment = c(ORCID="0000-0002-5037-7135")), person("Lukas", "Burk", , "burk@leibniz-bips.de", role = c("ctb"), comment = c(ORCID="0000-0001-7528-3795"))) Description: The Piece-wise exponential (Additive Mixed) Model (PAMM; Bender and others (2018) ) is a powerful model class for the analysis of survival (or time-to-event) data, based on Generalized Additive (Mixed) Models (GA(M)Ms). It offers intuitive specification and robust estimation of complex survival models with stratified baseline hazards, random effects, time-varying effects, time-dependent covariates and cumulative effects (Bender and others (2019)), as well as support for left-truncated data as well as competing risks, recurrent events and multi-state settings. pammtools provides tidy workflow for survival analysis with PAMMs, including data simulation, transformation and other functions for data preprocessing and model post-processing as well as visualization. Depends: R (>= 4.1.0) Imports: mgcv, survival (>= 2.39-5), checkmate, magrittr, rlang, tidyr (>= 1.0.0), ggplot2 (>= 3.2.2), dplyr (>= 1.0.0), purrr (>= 0.2.3), tibble, lazyeval, Formula, mvtnorm, pec, vctrs (>= 0.3.0), scam Suggests: testthat, mstate, broom Config/Needs/website: coxme, eha, etm, scam, msm, mvna, TBFmultinomial License: MIT + file LICENSE LazyData: true URL: https://adibender.github.io/pammtools/ BugReports: https://github.com/adibender/pammtools/issues RoxygenNote: 7.3.2 Encoding: UTF-8 NeedsCompilation: no Packaged: 2026-02-16 13:12:03 UTC; abender Author: Andreas Bender [aut, cre] (ORCID: ), Fabian Scheipl [aut] (ORCID: ), Johannes Piller [aut] (ORCID: ), Philipp Kopper [aut] (ORCID: ), Lukas Burk [ctb] (ORCID: ) Maintainer: Andreas Bender Repository: CRAN Date/Publication: 2026-02-16 13:40:02 UTC